summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--INSTALL32
-rw-r--r--Makefile.in236
-rw-r--r--README103
-rw-r--r--README.VMS57
-rw-r--r--README.hacking35
-rw-r--r--aclocal.m46
-rw-r--r--ax_pthread.m4448
-rwxr-xr-xconfig.guess578
-rw-r--r--config.h-vms284
-rw-r--r--config.h.in225
-rwxr-xr-x[-rw-r--r--]config.sub2570
-rwxr-xr-xconfigure9355
-rw-r--r--configure.ac (renamed from configure.in)3723
-rw-r--r--driver/Makefile.in1119
-rw-r--r--driver/XScreenSaver-Xm.ad2
-rw-r--r--driver/XScreenSaver.ad.in556
-rw-r--r--driver/XScreenSaver_Xm_ad.h108
-rw-r--r--driver/XScreenSaver_ad.h534
-rw-r--r--driver/atoms.c70
-rw-r--r--driver/atoms.h38
-rw-r--r--driver/atomswm.c101
-rw-r--r--driver/auth.h79
-rw-r--r--driver/blurb.c50
-rw-r--r--driver/blurb.h11
-rw-r--r--driver/clientmsg.c123
-rw-r--r--driver/clientmsg.h19
-rw-r--r--driver/demo-Gtk-conf.c24
-rw-r--r--driver/demo-Gtk.c535
-rw-r--r--driver/demo-Xm-widgets.c49
-rw-r--r--driver/demo-Xm.c166
-rw-r--r--driver/dialog.c2507
-rw-r--r--driver/dpms.c211
-rw-r--r--driver/exec.c32
-rw-r--r--driver/exts.c238
-rw-r--r--driver/fade.c1749
-rw-r--r--driver/fade.h20
-rw-r--r--driver/passwd-helper.c64
-rw-r--r--driver/passwd-kerberos.c45
-rw-r--r--driver/passwd-pam.c312
-rw-r--r--driver/passwd-pwent.c110
-rw-r--r--driver/passwd.c319
-rw-r--r--driver/prefs.c1702
-rw-r--r--driver/prefs.h30
-rw-r--r--driver/prefsw.c1561
-rw-r--r--driver/remote.c288
-rw-r--r--driver/remote.h3
-rw-r--r--driver/screens.c592
-rw-r--r--driver/screens.h37
-rw-r--r--driver/screensaver-properties.desktop.in2
-rw-r--r--driver/setuid.c229
-rw-r--r--driver/splash.c917
-rw-r--r--driver/subprocs.c1315
-rw-r--r--driver/test-apm.c101
-rw-r--r--driver/test-fade.c172
-rw-r--r--driver/test-grab.c146
-rw-r--r--driver/test-mlstring.c312
-rw-r--r--driver/test-passwd.c333
-rw-r--r--driver/test-randr.c25
-rw-r--r--driver/test-screens.c31
-rw-r--r--driver/test-uid.c14
-rw-r--r--driver/test-vp.c24
-rw-r--r--driver/test-xdpms.c47
-rw-r--r--driver/test-xinerama.c26
-rw-r--r--driver/test-xinput.c306
-rw-r--r--driver/test-xkb.c89
-rw-r--r--driver/test-yarandom.c3
-rw-r--r--driver/timers.c1807
-rw-r--r--driver/types.h315
-rw-r--r--driver/vms-getpwnam.c129
-rw-r--r--driver/vms-hpwd.c75
-rw-r--r--driver/vms-pwd.h48
-rw-r--r--driver/vms-validate.c75
-rw-r--r--driver/windows.c2132
-rw-r--r--driver/xdpyinfo.c112
-rw-r--r--driver/xinput.c381
-rw-r--r--driver/xinput.h19
-rw-r--r--driver/xscreensaver-auth.c340
-rw-r--r--driver/xscreensaver-auth.man27
-rw-r--r--driver/xscreensaver-command.c152
-rw-r--r--driver/xscreensaver-command.man268
-rw-r--r--driver/xscreensaver-gfx.c595
-rw-r--r--driver/xscreensaver-gfx.man28
-rw-r--r--driver/xscreensaver-settings.man420
-rw-r--r--driver/xscreensaver-systemd.c1090
-rw-r--r--driver/xscreensaver-systemd.man80
-rw-r--r--driver/xscreensaver.c4278
-rw-r--r--driver/xscreensaver.h136
-rw-r--r--driver/xscreensaver.man1180
-rw-r--r--driver/xscreensaver.ui2994
-rw-r--r--driver/xset.c389
-rw-r--r--hacks/Makefile.in359
-rw-r--r--hacks/README3
-rw-r--r--hacks/abstractile.man2
-rw-r--r--hacks/analogtv-cli.c257
-rw-r--r--hacks/analogtv.c62
-rw-r--r--hacks/analogtv.h2
-rw-r--r--hacks/anemone.man2
-rw-r--r--hacks/anemotaxis.man2
-rw-r--r--hacks/ant.man2
-rw-r--r--hacks/apollonian.c141
-rw-r--r--hacks/apollonian.man2
-rw-r--r--hacks/apple2-main.c17
-rw-r--r--hacks/apple2.man53
-rw-r--r--hacks/asm6502.c25
-rw-r--r--hacks/attraction.man24
-rw-r--r--hacks/barcode.c6
-rw-r--r--hacks/barcode.man2
-rw-r--r--hacks/binaryring.man2
-rw-r--r--hacks/blaster.man2
-rw-r--r--hacks/blitspin.man8
-rw-r--r--hacks/bouboule.man2
-rw-r--r--hacks/boxfit.man8
-rw-r--r--hacks/braid.man2
-rw-r--r--hacks/bsod.c857
-rw-r--r--hacks/bsod.man15
-rw-r--r--hacks/bubbles.c16
-rw-r--r--hacks/bubbles.h9
-rw-r--r--hacks/bubbles.man15
-rw-r--r--hacks/bumps.man8
-rw-r--r--hacks/ccurve.man2
-rw-r--r--hacks/celtic.man2
-rwxr-xr-xhacks/check-configs.pl63
-rw-r--r--hacks/cloudlife.man2
-rw-r--r--hacks/compass.c1
-rw-r--r--hacks/compass.man2
-rw-r--r--hacks/config/README11
-rw-r--r--hacks/config/antinspect.xml2
-rw-r--r--hacks/config/antmaze.xml2
-rw-r--r--hacks/config/antspotlight.xml2
-rw-r--r--hacks/config/apple2.xml2
-rw-r--r--hacks/config/beats.xml42
-rw-r--r--hacks/config/binaryring.xml2
-rw-r--r--hacks/config/blinkbox.xml2
-rw-r--r--hacks/config/blitspin.xml2
-rw-r--r--hacks/config/blocktube.xml2
-rw-r--r--hacks/config/bouncingcow.xml2
-rw-r--r--hacks/config/boxfit.xml2
-rw-r--r--hacks/config/bsod.xml33
-rw-r--r--hacks/config/bubble3d.xml2
-rw-r--r--hacks/config/cage.xml4
-rw-r--r--hacks/config/ccurve.xml2
-rw-r--r--hacks/config/cityflow.xml2
-rw-r--r--hacks/config/cloudlife.xml2
-rw-r--r--hacks/config/co____9.xml38
-rw-r--r--hacks/config/companioncube.xml2
-rw-r--r--hacks/config/covid19.xml38
-rw-r--r--hacks/config/cube21.xml2
-rw-r--r--hacks/config/cubestack.xml2
-rw-r--r--hacks/config/cubestorm.xml2
-rw-r--r--hacks/config/cubetwist.xml2
-rw-r--r--hacks/config/cubicgrid.xml8
-rw-r--r--hacks/config/cwaves.xml2
-rw-r--r--hacks/config/dangerball.xml2
-rw-r--r--hacks/config/decayscreen.xml2
-rw-r--r--hacks/config/deepstars.xml2
-rw-r--r--hacks/config/dymaxionmap.xml2
-rw-r--r--hacks/config/energystream.xml2
-rw-r--r--hacks/config/epicycle.xml11
-rw-r--r--hacks/config/etruscanvenus.xml4
-rw-r--r--hacks/config/euler2d.xml2
-rw-r--r--hacks/config/fadeplot.xml2
-rw-r--r--hacks/config/fiberlamp.xml2
-rw-r--r--hacks/config/filmleader.xml2
-rw-r--r--hacks/config/flipflop.xml2
-rw-r--r--hacks/config/flipscreen3d.xml2
-rw-r--r--hacks/config/fliptext.xml2
-rw-r--r--hacks/config/fluidballs.xml2
-rw-r--r--hacks/config/flyingtoasters.xml2
-rw-r--r--hacks/config/fontglide.xml2
-rw-r--r--hacks/config/fuzzyflakes.xml2
-rw-r--r--hacks/config/gears.xml4
-rw-r--r--hacks/config/geodesicgears.xml2
-rw-r--r--hacks/config/glblur.xml2
-rw-r--r--hacks/config/glcells.xml2
-rw-r--r--hacks/config/glforestfire.xml2
-rw-r--r--hacks/config/glhanoi.xml2
-rw-r--r--hacks/config/glknots.xml2
-rw-r--r--hacks/config/glmatrix.xml2
-rw-r--r--hacks/config/glplanet.xml2
-rw-r--r--hacks/config/glschool.xml2
-rw-r--r--hacks/config/glslideshow.xml2
-rw-r--r--hacks/config/glsnake.xml2
-rw-r--r--hacks/config/gltext.xml2
-rw-r--r--hacks/config/gravitywell.xml2
-rw-r--r--hacks/config/headroom.xml48
-rw-r--r--hacks/config/hexstrut.xml2
-rw-r--r--hacks/config/hyperball.xml2
-rw-r--r--hacks/config/hypercube.xml2
-rw-r--r--hacks/config/hypnowheel.xml2
-rw-r--r--hacks/config/imsmap.xml2
-rw-r--r--hacks/config/jigglypuff.xml2
-rw-r--r--hacks/config/juggler3d.xml2
-rw-r--r--hacks/config/klein.xml6
-rw-r--r--hacks/config/lcdscrub.xml2
-rwxr-xr-xhacks/config/maze3d.xml2
-rw-r--r--hacks/config/memscroller.xml2
-rw-r--r--hacks/config/menger.xml2
-rw-r--r--hacks/config/metaballs.xml8
-rw-r--r--hacks/config/mirrorblob.xml2
-rw-r--r--hacks/config/moebius.xml8
-rw-r--r--hacks/config/moebiusgears.xml6
-rw-r--r--hacks/config/moire.xml6
-rw-r--r--hacks/config/moire2.xml4
-rw-r--r--hacks/config/morph3d.xml2
-rw-r--r--hacks/config/nerverot.xml2
-rw-r--r--hacks/config/noseguy.xml2
-rw-r--r--hacks/config/pacman.xml2
-rw-r--r--hacks/config/photopile.xml2
-rw-r--r--hacks/config/pinion.xml4
-rw-r--r--hacks/config/popsquares.xml2
-rw-r--r--hacks/config/projectiveplane.xml4
-rw-r--r--hacks/config/quasicrystal.xml2
-rw-r--r--hacks/config/raverhoop.xml2
-rw-r--r--hacks/config/razzledazzle.xml2
-rw-r--r--hacks/config/rd-bomb.xml2
-rw-r--r--hacks/config/romanboy.xml4
-rw-r--r--hacks/config/rotzoomer.xml2
-rw-r--r--hacks/config/rubikblocks.xml2
-rw-r--r--hacks/config/shadebobs.xml2
-rw-r--r--hacks/config/sierpinski3d.xml2
-rw-r--r--hacks/config/skytentacles.xml2
-rw-r--r--hacks/config/slidescreen.xml2
-rw-r--r--hacks/config/speedmine.xml2
-rw-r--r--hacks/config/sphereeversion.xml98
-rw-r--r--hacks/config/spheremonics.xml2
-rw-r--r--hacks/config/spiral.xml4
-rw-r--r--hacks/config/splitflap.xml2
-rw-r--r--hacks/config/starwars.xml2
-rw-r--r--hacks/config/stonerview.xml2
-rw-r--r--hacks/config/surfaces.xml4
-rw-r--r--hacks/config/testx11.xml2
-rw-r--r--hacks/config/timetunnel.xml2
-rw-r--r--hacks/config/topblock.xml2
-rw-r--r--hacks/config/tronbit.xml2
-rw-r--r--hacks/config/unknownpleasures.xml2
-rw-r--r--hacks/config/vidwhacker.xml2
-rw-r--r--hacks/config/webcollage.xml2
-rw-r--r--hacks/config/whirlwindwarp.xml2
-rw-r--r--hacks/config/winduprobot.xml2
-rw-r--r--hacks/coral.man2
-rw-r--r--hacks/critical.man6
-rw-r--r--hacks/crystal.c3
-rw-r--r--hacks/crystal.man2
-rw-r--r--hacks/cwaves.c7
-rw-r--r--hacks/cwaves.man2
-rw-r--r--hacks/cynosure.man2
-rw-r--r--hacks/decayscreen.man8
-rw-r--r--hacks/deco.man2
-rw-r--r--hacks/delaunay.c2
-rw-r--r--hacks/delaunay.h4
-rw-r--r--hacks/deluxe.c1
-rw-r--r--hacks/deluxe.man2
-rw-r--r--hacks/demon.man2
-rw-r--r--hacks/discrete.man2
-rw-r--r--hacks/distort.man6
-rw-r--r--hacks/drift.man2
-rw-r--r--hacks/epicycle.man39
-rw-r--r--hacks/euler2d.man2
-rw-r--r--hacks/fadeplot.man2
-rw-r--r--hacks/fiberlamp.man2
-rw-r--r--hacks/filmleader.c40
-rw-r--r--hacks/filmleader.man2
-rw-r--r--hacks/fireworkx.man2
-rw-r--r--hacks/flag.c4
-rw-r--r--hacks/flag.man2
-rw-r--r--hacks/flame.man2
-rw-r--r--hacks/flow.man2
-rw-r--r--hacks/fluidballs.c46
-rw-r--r--hacks/fluidballs.man2
-rw-r--r--hacks/fontglide.c112
-rw-r--r--hacks/fontglide.man6
-rw-r--r--hacks/fonts/Makefile.in96
-rw-r--r--hacks/fonts/OCRAStd.otfbin0 -> 30636 bytes
-rw-r--r--hacks/fonts/SpecialElite.ttfbin0 -> 166224 bytes
-rw-r--r--hacks/fonts/clacon.ttfbin0 -> 103892 bytes
-rw-r--r--hacks/fonts/gallant12x22.ttfbin0 -> 25644 bytes
-rw-r--r--hacks/fonts/luximr.ttfbin0 -> 71784 bytes
-rw-r--r--hacks/forest.c4
-rw-r--r--hacks/forest.man2
-rw-r--r--hacks/fps.c125
-rw-r--r--hacks/fps.h4
-rw-r--r--hacks/fpsI.h12
-rw-r--r--hacks/fuzzyflakes.c3
-rw-r--r--hacks/fuzzyflakes.man2
-rw-r--r--hacks/galaxy.man2
-rw-r--r--hacks/glitchpeg.c46
-rw-r--r--hacks/glitchpeg.man2
-rw-r--r--hacks/glx/Makefile.in1416
-rw-r--r--hacks/glx/README5
-rw-r--r--hacks/glx/antinspect.c23
-rw-r--r--hacks/glx/antinspect.man4
-rw-r--r--hacks/glx/antmaze.c14
-rw-r--r--hacks/glx/antmaze.man4
-rw-r--r--hacks/glx/antspotlight.c12
-rw-r--r--hacks/glx/antspotlight.man4
-rw-r--r--hacks/glx/atlantis.h19
-rw-r--r--hacks/glx/atlantis.man2
-rw-r--r--hacks/glx/atunnel.c3
-rw-r--r--hacks/glx/atunnel.man15
-rw-r--r--hacks/glx/b_lockglue.c17
-rw-r--r--hacks/glx/beats.c439
-rw-r--r--hacks/glx/beats.man75
-rw-r--r--hacks/glx/blinkbox.c19
-rw-r--r--hacks/glx/blocktube.c11
-rw-r--r--hacks/glx/blocktube.man2
-rw-r--r--hacks/glx/boing.c2
-rw-r--r--hacks/glx/boing.man2
-rw-r--r--hacks/glx/bouncingcow.c15
-rw-r--r--hacks/glx/bouncingcow.man2
-rw-r--r--hacks/glx/boxed.c14
-rw-r--r--hacks/glx/boxed.man2
-rw-r--r--hacks/glx/bubble3d.h16
-rw-r--r--hacks/glx/bubble3d.man2
-rw-r--r--hacks/glx/buildlwo.c4
-rw-r--r--hacks/glx/buildlwo.h19
-rw-r--r--hacks/glx/cage.c12
-rw-r--r--hacks/glx/cage.man2
-rw-r--r--hacks/glx/carousel.c38
-rw-r--r--hacks/glx/carousel.man8
-rw-r--r--hacks/glx/chessmodels.c22
-rw-r--r--hacks/glx/circuit.c21
-rw-r--r--hacks/glx/circuit.man2
-rw-r--r--hacks/glx/cityflow.c2
-rw-r--r--hacks/glx/cityflow.man2
-rw-r--r--hacks/glx/companion.c12
-rw-r--r--hacks/glx/companioncube.man8
-rw-r--r--hacks/glx/covid19.c656
-rw-r--r--hacks/glx/covid19.man72
-rw-r--r--hacks/glx/crackberg.c2
-rw-r--r--hacks/glx/crackberg.man2
-rw-r--r--hacks/glx/crumbler.c109
-rw-r--r--hacks/glx/crumbler.man2
-rw-r--r--hacks/glx/cube21.c13
-rw-r--r--hacks/glx/cube21.man2
-rw-r--r--hacks/glx/cubenetic.c11
-rw-r--r--hacks/glx/cubenetic.man2
-rw-r--r--hacks/glx/cubestack.c11
-rw-r--r--hacks/glx/cubestack.man2
-rw-r--r--hacks/glx/cubestorm.c11
-rw-r--r--hacks/glx/cubestorm.man2
-rw-r--r--hacks/glx/cubetwist.c11
-rw-r--r--hacks/glx/cubetwist.man2
-rw-r--r--hacks/glx/cubicgrid.c81
-rw-r--r--hacks/glx/cubicgrid.man7
-rw-r--r--hacks/glx/dangerball.c11
-rw-r--r--hacks/glx/dangerball.man2
-rw-r--r--hacks/glx/deepstars.c3
-rw-r--r--hacks/glx/deepstars.man2
-rw-r--r--hacks/glx/discoball.c11
-rw-r--r--hacks/glx/discoball.man2
-rw-r--r--hacks/glx/dnalogo.c32
-rw-r--r--hacks/glx/dropshadow.c7
-rw-r--r--hacks/glx/dropshadow.h6
-rw-r--r--hacks/glx/dymaxionmap-coords.c2
-rw-r--r--hacks/glx/dymaxionmap.c16
-rw-r--r--hacks/glx/dymaxionmap.man4
-rw-r--r--hacks/glx/endgame.c3
-rw-r--r--hacks/glx/endgame.man4
-rw-r--r--hacks/glx/energystream.c2
-rw-r--r--hacks/glx/energystream.man2
-rw-r--r--hacks/glx/engine.c15
-rw-r--r--hacks/glx/engine.man2
-rw-r--r--hacks/glx/esper.c100
-rw-r--r--hacks/glx/esper.man2
-rw-r--r--hacks/glx/etruscanvenus.c1813
-rw-r--r--hacks/glx/etruscanvenus.man2
-rw-r--r--hacks/glx/extrusion.c15
-rw-r--r--hacks/glx/extrusion.h10
-rw-r--r--hacks/glx/extrusion.man2
-rw-r--r--hacks/glx/flipflop.c1168
-rw-r--r--hacks/glx/flipflop.man2
-rw-r--r--hacks/glx/flipscreen3d.c4
-rw-r--r--hacks/glx/flipscreen3d.man2
-rw-r--r--hacks/glx/fliptext.c8
-rw-r--r--hacks/glx/fliptext.man6
-rw-r--r--hacks/glx/flurry.h24
-rw-r--r--hacks/glx/flurry.man2
-rw-r--r--hacks/glx/flyingtoasters.c11
-rw-r--r--hacks/glx/flyingtoasters.man2
-rw-r--r--hacks/glx/fps-gl.c17
-rw-r--r--hacks/glx/gears.c11
-rw-r--r--hacks/glx/gears.man2
-rw-r--r--hacks/glx/geodesic.c11
-rw-r--r--hacks/glx/geodesic.man2
-rw-r--r--hacks/glx/geodesicgears.c32
-rw-r--r--hacks/glx/geodesicgears.man6
-rw-r--r--hacks/glx/gflux.c25
-rw-r--r--hacks/glx/gflux.man6
-rw-r--r--hacks/glx/gibson.c38
-rw-r--r--hacks/glx/gibson.man2
-rw-r--r--hacks/glx/glblur.c11
-rw-r--r--hacks/glx/glblur.man2
-rw-r--r--hacks/glx/glcells.c7
-rw-r--r--hacks/glx/glcells.man4
-rw-r--r--hacks/glx/gleidescope.c10
-rw-r--r--hacks/glx/gleidescope.man2
-rw-r--r--hacks/glx/glforestfire.c14
-rw-r--r--hacks/glx/glforestfire.man15
-rw-r--r--hacks/glx/glhanoi.c13
-rw-r--r--hacks/glx/glhanoi.man2
-rw-r--r--hacks/glx/glknots.c11
-rw-r--r--hacks/glx/glknots.man2
-rw-r--r--hacks/glx/gllist.h19
-rw-r--r--hacks/glx/glmatrix.c2
-rw-r--r--hacks/glx/glmatrix.man2
-rw-r--r--hacks/glx/glplanet.c11
-rw-r--r--hacks/glx/glplanet.man4
-rw-r--r--hacks/glx/glschool.c3
-rw-r--r--hacks/glx/glschool.man2
-rw-r--r--hacks/glx/glschool_alg.c2
-rw-r--r--hacks/glx/glschool_gl.h27
-rw-r--r--hacks/glx/glsl-utils.c391
-rw-r--r--hacks/glx/glsl-utils.h73
-rw-r--r--hacks/glx/glslideshow.c136
-rw-r--r--hacks/glx/glslideshow.man8
-rw-r--r--hacks/glx/glsnake.c38
-rw-r--r--hacks/glx/glsnake.man18
-rw-r--r--hacks/glx/gltext.c142
-rw-r--r--hacks/glx/gltext.man33
-rw-r--r--hacks/glx/gltrackball.c25
-rw-r--r--hacks/glx/gltrackball.h2
-rw-r--r--hacks/glx/glut_stroke.c19
-rw-r--r--hacks/glx/glut_swidth.c14
-rw-r--r--hacks/glx/grab-ximage.c468
-rw-r--r--hacks/glx/grab-ximage.h51
-rw-r--r--hacks/glx/gravitywell.c4
-rw-r--r--hacks/glx/gravitywell.man2
-rw-r--r--hacks/glx/handsy.c2
-rw-r--r--hacks/glx/handsy.man2
-rw-r--r--hacks/glx/headroom.c559
-rw-r--r--hacks/glx/headroom.dxf259600
-rw-r--r--hacks/glx/headroom.man72
-rw-r--r--hacks/glx/headroom_model.c26005
-rw-r--r--hacks/glx/hexstrut.c11
-rw-r--r--hacks/glx/hexstrut.man2
-rw-r--r--hacks/glx/hilbert.c11
-rw-r--r--hacks/glx/hilbert.man2
-rw-r--r--hacks/glx/hydrostat.c11
-rw-r--r--hacks/glx/hydrostat.man2
-rw-r--r--hacks/glx/hypertorus.c990
-rw-r--r--hacks/glx/hypertorus.man2
-rw-r--r--hacks/glx/hypnowheel.c11
-rw-r--r--hacks/glx/hypnowheel.man2
-rw-r--r--hacks/glx/involute.c22
-rw-r--r--hacks/glx/jigglypuff.c18
-rw-r--r--hacks/glx/jigglypuff.man2
-rw-r--r--hacks/glx/jigsaw.c25
-rw-r--r--hacks/glx/jigsaw.man8
-rw-r--r--hacks/glx/juggler3d.c6
-rw-r--r--hacks/glx/juggler3d.man2
-rw-r--r--hacks/glx/kaleidocycle.c11
-rw-r--r--hacks/glx/kaleidocycle.man15
-rw-r--r--hacks/glx/klein.c2470
-rw-r--r--hacks/glx/klein.man2
-rw-r--r--hacks/glx/lament.c2
-rw-r--r--hacks/glx/lament.man2
-rw-r--r--hacks/glx/lavalite.c7
-rw-r--r--hacks/glx/lavalite.man15
-rw-r--r--hacks/glx/lockward.c3
-rw-r--r--hacks/glx/lockward.man2
-rw-r--r--hacks/glx/marching.c23
-rwxr-xr-xhacks/glx/maze3d.c3
-rw-r--r--hacks/glx/maze3d.man2
-rw-r--r--hacks/glx/menger.c11
-rw-r--r--hacks/glx/menger.man4
-rw-r--r--hacks/glx/mirrorblob.c15
-rw-r--r--hacks/glx/mirrorblob.man2
-rw-r--r--hacks/glx/moebius.c21
-rw-r--r--hacks/glx/moebius.man2
-rw-r--r--hacks/glx/moebiusgears.c11
-rw-r--r--hacks/glx/moebiusgears.man2
-rw-r--r--hacks/glx/molecule.c30
-rw-r--r--hacks/glx/molecule.man2
-rw-r--r--hacks/glx/morph3d.c10
-rw-r--r--hacks/glx/morph3d.man2
-rw-r--r--hacks/glx/noof.man2
-rw-r--r--hacks/glx/normals.c5
-rw-r--r--hacks/glx/normals.h18
-rw-r--r--hacks/glx/peepers.c7
-rw-r--r--hacks/glx/peepers.man2
-rw-r--r--hacks/glx/photopile.c30
-rw-r--r--hacks/glx/photopile.man8
-rw-r--r--hacks/glx/pinion.c10
-rw-r--r--hacks/glx/pinion.man2
-rw-r--r--hacks/glx/pipeobjs.c4
-rw-r--r--hacks/glx/pipes.c12
-rw-r--r--hacks/glx/pipes.man2
-rw-r--r--hacks/glx/polyhedra-gl.c47
-rw-r--r--hacks/glx/polyhedra.man2
-rw-r--r--hacks/glx/polytopes.c2
-rw-r--r--hacks/glx/polytopes.man6
-rw-r--r--hacks/glx/projectiveplane.c1381
-rw-r--r--hacks/glx/projectiveplane.man2
-rw-r--r--hacks/glx/providence.c12
-rw-r--r--hacks/glx/providence.man6
-rw-r--r--hacks/glx/pulsar.c11
-rw-r--r--hacks/glx/pulsar.man2
-rw-r--r--hacks/glx/quasicrystal.c2
-rw-r--r--hacks/glx/quasicrystal.man2
-rw-r--r--hacks/glx/queens.c16
-rw-r--r--hacks/glx/queens.man4
-rw-r--r--hacks/glx/quickhull.c104
-rw-r--r--hacks/glx/quickhull.h1
-rw-r--r--hacks/glx/raverhoop.c11
-rw-r--r--hacks/glx/raverhoop.man2
-rw-r--r--hacks/glx/razzledazzle.c12
-rw-r--r--hacks/glx/razzledazzle.man2
-rw-r--r--hacks/glx/romanboy.c1611
-rw-r--r--hacks/glx/romanboy.man6
-rw-r--r--hacks/glx/rubik.c10
-rw-r--r--hacks/glx/rubik.man2
-rw-r--r--hacks/glx/rubikblocks.c13
-rw-r--r--hacks/glx/rubikblocks.man2
-rw-r--r--hacks/glx/sballs.c30
-rw-r--r--hacks/glx/sballs.man15
-rw-r--r--hacks/glx/sierpinski3d.c12
-rw-r--r--hacks/glx/sierpinski3d.man2
-rw-r--r--hacks/glx/skytentacles.c2
-rw-r--r--hacks/glx/skytentacles.man2
-rw-r--r--hacks/glx/sonar-icmp.c61
-rw-r--r--hacks/glx/sonar.c18
-rw-r--r--hacks/glx/sonar.man57
-rw-r--r--hacks/glx/sphere.c20
-rw-r--r--hacks/glx/sphereeversion.c3339
-rw-r--r--hacks/glx/sphereeversion.man256
-rw-r--r--hacks/glx/spheremonics.c145
-rw-r--r--hacks/glx/spheremonics.man2
-rw-r--r--hacks/glx/splitflap.c66
-rw-r--r--hacks/glx/splitflap.man2
-rw-r--r--hacks/glx/splodesic.c11
-rw-r--r--hacks/glx/splodesic.man2
-rw-r--r--hacks/glx/sproingies.c6
-rw-r--r--hacks/glx/sproingies.man4
-rw-r--r--hacks/glx/sproingiewrap.c5
-rw-r--r--hacks/glx/stairs.c10
-rw-r--r--hacks/glx/stairs.man2
-rw-r--r--hacks/glx/starwars.c25
-rw-r--r--hacks/glx/starwars.man35
-rw-r--r--hacks/glx/starwars.txt51
-rw-r--r--hacks/glx/stonerview-view.c19
-rw-r--r--hacks/glx/stonerview.c2
-rw-r--r--hacks/glx/stonerview.h6
-rw-r--r--hacks/glx/stonerview.man2
-rw-r--r--hacks/glx/superquadrics.c14
-rw-r--r--hacks/glx/superquadrics.man2
-rw-r--r--hacks/glx/surfaces.c13
-rw-r--r--hacks/glx/surfaces.man2
-rw-r--r--hacks/glx/swim.c2
-rw-r--r--hacks/glx/tangram.c12
-rw-r--r--hacks/glx/tangram.man2
-rw-r--r--hacks/glx/tangram_shapes.c17
-rw-r--r--hacks/glx/teapot.c16
-rw-r--r--hacks/glx/texfont.c949
-rw-r--r--hacks/glx/texfont.h16
-rw-r--r--hacks/glx/timetunnel.c4
-rw-r--r--hacks/glx/timetunnel.man2
-rw-r--r--hacks/glx/topblock.c17
-rw-r--r--hacks/glx/topblock.man2
-rw-r--r--hacks/glx/trackball.h2
-rw-r--r--hacks/glx/tronbit.c13
-rw-r--r--hacks/glx/tronbit.man2
-rw-r--r--hacks/glx/tube.c22
-rw-r--r--hacks/glx/tunnel_draw.c23
-rw-r--r--hacks/glx/unicrud.c33
-rw-r--r--hacks/glx/unicrud.man2
-rw-r--r--hacks/glx/unknownpleasures.c2
-rw-r--r--hacks/glx/unknownpleasures.man2
-rw-r--r--hacks/glx/vigilance.c14
-rw-r--r--hacks/glx/vigilance.man2
-rw-r--r--hacks/glx/voronoi.c4
-rw-r--r--hacks/glx/voronoi.man2
-rw-r--r--hacks/glx/winduprobot.c71
-rw-r--r--hacks/glx/winduprobot.man4
-rw-r--r--hacks/glx/xlock-gl-utils.c158
-rw-r--r--hacks/glx/xscreensaver-gl-visual.c87
-rw-r--r--hacks/glx/xscreensaver-gl-visual.man33
-rw-r--r--hacks/goop.man2
-rw-r--r--hacks/grav.man2
-rw-r--r--hacks/greynetic.man2
-rw-r--r--hacks/halftone.man2
-rw-r--r--hacks/halo.man2
-rw-r--r--hacks/helix.man2
-rw-r--r--hacks/hexadrop.c1
-rw-r--r--hacks/hexadrop.man2
-rw-r--r--hacks/hopalong.man2
-rw-r--r--hacks/hyperball.man2
-rw-r--r--hacks/hypercube.man2
-rw-r--r--hacks/ifs.c10
-rw-r--r--hacks/ifs.man2
-rw-r--r--hacks/images/Makefile43
-rw-r--r--hacks/images/Makefile.in43
-rw-r--r--hacks/images/gnome1.pngbin0 -> 17901 bytes
-rw-r--r--hacks/images/gnome2.pngbin0 -> 1867 bytes
-rw-r--r--hacks/images/logo-360.pngbin0 -> 27394 bytes
-rw-r--r--hacks/imsmap.man2
-rw-r--r--hacks/interaggregate.man2
-rw-r--r--hacks/interference.c12
-rw-r--r--hacks/interference.man2
-rw-r--r--hacks/intermomentary.man2
-rw-r--r--hacks/juggle.man2
-rw-r--r--hacks/julia.man2
-rw-r--r--hacks/kaleidescope.man15
-rw-r--r--hacks/kumppa.c3
-rw-r--r--hacks/kumppa.man2
-rw-r--r--hacks/laser.man2
-rw-r--r--hacks/lcdscrub.c3
-rw-r--r--hacks/lcdscrub.man2
-rw-r--r--hacks/lightning.man2
-rw-r--r--hacks/lisa.man2
-rw-r--r--hacks/lissie.man2
-rw-r--r--hacks/lmorph.c2
-rw-r--r--hacks/loop.man2
-rw-r--r--hacks/m6502.c21
-rw-r--r--hacks/maze.c11
-rw-r--r--hacks/memscroller.c61
-rw-r--r--hacks/memscroller.man2
-rw-r--r--hacks/metaballs.man2
-rw-r--r--hacks/moire.man2
-rw-r--r--hacks/moire2.man2
-rw-r--r--hacks/mountain.man2
-rw-r--r--hacks/munch.c19
-rw-r--r--hacks/munch.man56
-rwxr-xr-xhacks/munge-ad.pl33
-rw-r--r--hacks/nerverot.man2
-rw-r--r--hacks/noseguy.c17
-rw-r--r--hacks/noseguy.man6
-rw-r--r--hacks/pacman.c7
-rw-r--r--hacks/pacman.h8
-rw-r--r--hacks/pacman.man2
-rw-r--r--hacks/pacman_ai.c6
-rw-r--r--hacks/pacman_level.c3
-rw-r--r--hacks/pedal.man2
-rw-r--r--hacks/penetrate.c96
-rw-r--r--hacks/penetrate.man15
-rw-r--r--hacks/penrose.c11
-rw-r--r--hacks/penrose.man4
-rw-r--r--hacks/petri.man2
-rw-r--r--hacks/phosphor.c149
-rw-r--r--hacks/phosphor.man64
-rw-r--r--hacks/piecewise.man2
-rw-r--r--hacks/polyominoes.c7
-rw-r--r--hacks/polyominoes.man2
-rw-r--r--hacks/pong.c2
-rw-r--r--hacks/pong.man2
-rw-r--r--hacks/pyro.man2
-rw-r--r--hacks/qix.man2
-rw-r--r--hacks/rd-bomb.man2
-rw-r--r--hacks/recanim.c51
-rw-r--r--hacks/recanim.h6
-rw-r--r--hacks/ripples.man2
-rw-r--r--hacks/rocks.man2
-rw-r--r--hacks/rorschach.man2
-rw-r--r--hacks/rotor.man2
-rw-r--r--hacks/rotzoomer.man8
-rw-r--r--hacks/scooter.man6
-rw-r--r--hacks/screenhack.c47
-rw-r--r--hacks/screenhackI.h65
-rw-r--r--hacks/shadebobs.man2
-rw-r--r--hacks/sierpinski.man2
-rw-r--r--hacks/slidescreen.man8
-rw-r--r--hacks/slip.man8
-rw-r--r--hacks/speedmine.man40
-rw-r--r--hacks/sphere.man2
-rw-r--r--hacks/spiral.man2
-rw-r--r--hacks/spotlight.c15
-rw-r--r--hacks/spotlight.man8
-rw-r--r--hacks/squiral.man2
-rw-r--r--hacks/starfish.man2
-rw-r--r--hacks/strange.man2
-rw-r--r--hacks/substrate.man2
-rw-r--r--hacks/swirl.man2
-rw-r--r--hacks/tessellimage.c5
-rw-r--r--hacks/tessellimage.man2
-rw-r--r--hacks/testx11.c5
-rw-r--r--hacks/thornbird.man2
-rw-r--r--hacks/triangle.man2
-rw-r--r--hacks/truchet.man2
-rw-r--r--hacks/twang.man2
-rw-r--r--hacks/vermiculate.c5
-rw-r--r--hacks/vermiculate.man2
-rw-r--r--hacks/vfeedback.c9
-rw-r--r--hacks/vfeedback.man2
-rwxr-xr-xhacks/vidwhacker77
-rw-r--r--hacks/vidwhacker.man10
-rw-r--r--hacks/vines.man2
-rw-r--r--hacks/wander.man2
-rw-r--r--hacks/webcollage-cocoa.m4
-rw-r--r--hacks/webcollage-helper.c14
-rw-r--r--hacks/webcollage.man47
-rw-r--r--hacks/whirlwindwarp.man2
-rw-r--r--hacks/worm.man2
-rw-r--r--hacks/wormhole.man2
-rw-r--r--hacks/xanalogtv.c14
-rw-r--r--hacks/xanalogtv.man8
-rw-r--r--hacks/xflame.c3
-rw-r--r--hacks/xflame.man2
-rw-r--r--hacks/ximage-loader.c36
-rw-r--r--hacks/xjack.c83
-rw-r--r--hacks/xjack.man2
-rw-r--r--hacks/xlockmore.c42
-rw-r--r--hacks/xlockmore.h9
-rw-r--r--hacks/xlockmoreI.h79
-rw-r--r--hacks/xlyap.c3
-rw-r--r--hacks/xmatrix.c72
-rw-r--r--hacks/xmatrix.man30
-rwxr-xr-xhacks/xml2man.pl4
-rw-r--r--hacks/xrayswarm.c8
-rw-r--r--hacks/xrayswarm.man2
-rwxr-xr-xhacks/xscreensaver-getimage-file1342
-rw-r--r--hacks/xscreensaver-getimage-file.man63
-rwxr-xr-xhacks/xscreensaver-getimage-video141
-rw-r--r--hacks/xscreensaver-getimage-video.man51
-rw-r--r--hacks/xscreensaver-getimage.c (renamed from driver/xscreensaver-getimage.c)208
-rw-r--r--hacks/xscreensaver-getimage.man76
-rwxr-xr-xhacks/xscreensaver-text1000
-rw-r--r--hacks/xscreensaver-text.man88
-rw-r--r--hacks/xspirograph.man2
-rw-r--r--hacks/xsublim.c5
-rw-r--r--hacks/xsublim.man2
-rw-r--r--hacks/zoom.man8
-rwxr-xr-x[-rw-r--r--]install-sh693
-rwxr-xr-x[-rw-r--r--]intltool-update.in6
-rw-r--r--jwxyz/Makefile.in30
-rw-r--r--jwxyz/jwxyz-android.c300
-rw-r--r--jwxyz/jwxyz-cocoa.h16
-rw-r--r--jwxyz/jwxyz-cocoa.m69
-rw-r--r--jwxyz/jwxyz-common.c48
-rw-r--r--jwxyz/jwxyz-gl.c21
-rw-r--r--jwxyz/jwxyz-image.c10
-rw-r--r--jwxyz/jwxyz.h18
-rw-r--r--jwxyz/jwxyz.m42
-rw-r--r--jwxyz/jwxyzI.h5
-rw-r--r--jwxyz/jwzgles.c108
-rw-r--r--jwxyz/jwzgles.h2
-rw-r--r--jwxyz/jwzglesI.h4
-rw-r--r--makevms.com57
-rw-r--r--po/Makefile.in.in13
-rw-r--r--po/POTFILES.in11
-rw-r--r--po/da.po2
-rw-r--r--po/de.po2
-rw-r--r--po/es.po2
-rw-r--r--po/et.po2
-rw-r--r--po/fi.po2
-rw-r--r--po/fr.po2
-rw-r--r--po/hu.po2
-rw-r--r--po/it.po2
-rw-r--r--po/ja.po4262
-rw-r--r--po/ko.po2
-rw-r--r--po/nb.po2
-rw-r--r--po/nl.po2
-rw-r--r--po/pl.po2
-rw-r--r--po/pt.po2
-rw-r--r--po/pt_BR.po2
-rw-r--r--po/ru.po2
-rw-r--r--po/sk.po2
-rw-r--r--po/sv.po2
-rw-r--r--po/vi.po2
-rw-r--r--po/wa.po2
-rw-r--r--po/zh_CN.po2
-rw-r--r--po/zh_TW.po2
-rw-r--r--setup.com131
-rw-r--r--utils/Makefile.in73
-rw-r--r--utils/aligned_malloc.c259
-rw-r--r--utils/aligned_malloc.h8
-rw-r--r--utils/async_netdb.c4
-rw-r--r--utils/fade.c962
-rw-r--r--utils/font-retry.c630
-rw-r--r--utils/font-retry.h14
-rw-r--r--utils/grabclient.c21
-rw-r--r--utils/grabscreen.c19
-rw-r--r--utils/grabscreen.h4
-rw-r--r--utils/images/logo-180.xpm4
-rw-r--r--utils/images/logo-360.gifbin0 -> 7868 bytes
-rw-r--r--utils/images/logo-360.xpm390
-rw-r--r--utils/images/logo-50.xpm2
-rw-r--r--utils/images/logo.pdf1156
-rw-r--r--utils/logo.c52
-rw-r--r--utils/minixpm.c2
-rw-r--r--utils/minixpm.h3
-rw-r--r--utils/queue.h638
-rw-r--r--utils/textclient-mobile.c2
-rw-r--r--utils/textclient.c129
-rw-r--r--utils/textclient.h4
-rw-r--r--utils/thread_util.c239
-rw-r--r--utils/thread_util.h2
-rw-r--r--utils/usleep.h4
-rw-r--r--utils/utf8wc.c6
-rw-r--r--utils/version.h4
-rw-r--r--utils/visual-gl.c350
-rw-r--r--utils/visual.h6
-rw-r--r--utils/vms-gtod.c31
-rw-r--r--utils/vms-gtod.h85
-rw-r--r--utils/vms-strdup.c25
-rw-r--r--utils/xdbe.c5
-rw-r--r--utils/xft.c110
-rw-r--r--utils/xft.h7
-rw-r--r--utils/xftwrap.c206
-rw-r--r--utils/xftwrap.h35
-rw-r--r--utils/xmu.c197
-rw-r--r--utils/xmu.h8
-rw-r--r--utils/xshm.c29
-rw-r--r--utils/yarandom.c4
-rw-r--r--xscreensaver.spec23
803 files changed, 345102 insertions, 34100 deletions
diff --git a/INSTALL b/INSTALL
index 50dbe43..67d57d3 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,5 +1,30 @@
-Basic Installation
-==================
+XScreenSaver Installation
+=========================
+
+ ./configure --help
+
+ ./configure --prefix=/usr
+ make
+ sudo make install
+ make clean
+
+ xscreensaver &
+ xscreensaver-settings
+
+ There are many compilation dependencies. The configure script will
+ tell you what is missing. At the least, you will need development
+ versions of these libraries:
+
+ perl pkg-config gettext intltool libx11 libxext libxi libxt
+ libxft libxinerama libxrandr libxxf86vm libgl libglu libgle
+ libgtk2 gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0 libxml2 libpam
+ dbus libsystemd elogind
+
+ BSD systems might need gmake instead of make.
+
+
+Boilerplate 'Configure' Instructions
+====================================
These are generic installation instructions.
@@ -36,8 +61,7 @@ The simplest way to compile this package is:
2. Type `make' to compile the package.
- 3. Optionally, type `make check' to run any self-tests that come with
- the package.
+ 3. [There is no number three]
4. Type `make install' to install the programs and any data files and
documentation.
diff --git a/Makefile.in b/Makefile.in
index 52f1b4f..42742d3 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in --- xscreensaver, Copyright (c) 1999-2014 Jamie Zawinski.
+# Makefile.in --- xscreensaver, Copyright © 1999-2021 Jamie Zawinski.
# the `../configure' script generates `Makefile' from this file.
@SET_MAKE@
@@ -6,23 +6,23 @@ srcdir = @srcdir@
VPATH = @srcdir@
SHELL = /bin/sh
-SUBDIRS = utils jwxyz hacks/images hacks hacks/glx driver po
+SUBDIRS = utils jwxyz hacks/images hacks hacks/glx hacks/fonts \
+ driver po
SUBDIRS2 = $(SUBDIRS) OSX android
-TARFILES = README README.hacking README.VMS INSTALL \
- configure configure.in Makefile.in config.h.in \
- config.h-vms install-sh setup.com config.guess aclocal.m4 \
- ax_pthread.m4 config.sub makevms.com \
+TARFILES = README README.hacking INSTALL \
+ configure configure.ac Makefile.in config.h.in \
+ install-sh config.guess aclocal.m4 \
+ ax_pthread.m4 config.sub \
intltool-merge.in intltool-extract.in intltool-update.in \
- xscreensaver.spec \
- OSX/xscreensaver.xcodeproj/project.pbxproj
+ xscreensaver.spec
TAR = tar
# Using $(MAKE) directly means the shell executes things even with "make -n"
MAKE2 = $(MAKE)
-MAKE_SUBDIR = for dir in $(SUBDIRS); do (cd $$dir; $(MAKE2) $@) || exit 5; done
-MAKE_SUBDIR2 = for dir in $(SUBDIRS2); do (cd $$dir; $(MAKE2) $@) || exit 5; done
+MAKE_SUBDIR = for dir in $(SUBDIRS); do (cd $$dir && $(MAKE2) $@) || exit 5; done
+MAKE_SUBDIR2 = for dir in $(SUBDIRS2); do (cd $$dir && $(MAKE2) $@) || exit 5; done
default::
@+$(MAKE_SUBDIR)
@@ -57,8 +57,8 @@ clean::
@$(MAKE_SUBDIR2)
distclean:: clean
- -rm -f config.h Makefile config.status config.cache config.log TAGS *~ "#"* intltool-extract intltool-merge intltool-update
@$(MAKE_SUBDIR2)
+ -rm -f config.h Makefile config.status config.cache config.log TAGS *~ "#"* intltool-extract intltool-merge intltool-update
dist:: tar
@@ -71,26 +71,31 @@ tar::
$(MAKE2) version-date distdepend ; \
$(MAKE2) _tar
+list_tarfiles:
+ @find $(TARFILES) -type f -print | sort
+
_tar:
@ \
- VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' utils/version.h` ; \
+ VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' utils/version.h | \
+ head -1` ; \
NAME="xscreensaver-$$VERS" ; \
rm -rf $$NAME ; ln -s . $$NAME ; \
- FILES= ; \
+ LIST="tar$$$$.txt" ; \
ADIR=archive/ ; \
- for subdir in $(SUBDIRS2) ; do \
- d=`pwd` ; \
- cd $$subdir ; \
- FILES="$$FILES `$(MAKE2) echo_tarfiles \
- | grep -v '^.*make\[' \
- | sed \"s|^|$$subdir/|g;s| | $$subdir/|g\" \
- ` "; \
- cd $$d ; done ; \
+ rm -f "$$LIST" ; \
+ for subdir in . $(SUBDIRS2) ; do \
+ ( cd $$subdir ; \
+ $(MAKE2) list_tarfiles \
+ | grep -v '^.*make\[' \
+ | sed -e "s@^@$$NAME/$$subdir/@g" \
+ | sed -e "s@/\./@/@g" \
+ ) >> "$$LIST" ; \
+ done ; \
echo creating tar file $$ADIR$$NAME.tar.gz... ; \
export COPYFILE_DISABLE=true ; \
- GZIP="-9v" $(TAR) -vczf $$ADIR$$NAME.tar.gz \
- `echo $(TARFILES) $$FILES | sed "s|^|$$NAME/|g; s| | $$NAME/|g" ` ; \
- rm $$NAME
+ export GZIP="-9v" ; \
+ $(TAR) -vczf $$ADIR$$NAME.tar.gz -T "$$LIST" ; \
+ rm "$$LIST" "$$NAME"
# This also makes me sick...
@@ -101,9 +106,12 @@ _tar:
# of autoconf other than the ones I've tried (2.12 and 2.13.)
#
configure::
+ rm -f configure
aclocal
autoconf
autoheader
+
+configure::
@TMP=configure.$$$$ ; \
echo "munging configure's --help message..." ; \
( perl -e ' \
@@ -111,26 +119,24 @@ configure::
while (<>) { $$file .= $$_; } \
$$_ = $$file; \
\
- s/^(Configuration:)$$/\n$$1\n/m; \
- s/^(Directory and file names:)$$/\n$$1\n/m; \
- s/^ --sbindir=.*\n//m; \
- s/^ --sysconfdir.*\n//m; \
- s/^ --sharedstatedir.*\n.*\n//m; \
- s/^ --localstatedir.*\n//m; \
- s/^ --infodir.*\n//m; \
- s/^(Host type:)$$/\n$$1\n/m; \
- s/\nFeatures and packages:\n.*library files are in DIR\n/\n/s;\
- s/--enable and --with options recognized://m; \
- s/\n --with-x .*?(["\n])/$$1/s; \
- s/\n(Installation options:\n)/$$1/s; \
+ s/\nInstallation directories:.*?\n\n/\n/s; \
+ s/\nOptional Features:.*?\n\n/\n/s; \
+ s/\nOptional Packages:.*?\n\n/\n/s; \
\
- s/^ --oldincludedir=.*$$/ \
- --x-includes=DIR X include files are in DIR\n \
- --x-libraries=DIR X library files are in DIR/m; \
+ s/^ +--sbindir=.*\n//m; \
+ s/^ +--sysconfdir.*\n//m; \
+ s/^ +--sharedstatedir.*\n.*\n//m; \
+ s/^ +--oldincludedir.*\n//m; \
+ s/^ +--infodir.*\n//m; \
+ s/^ +--htmldir.*\n//m; \
+ s/^ +--dvidir.*\n//m; \
+ s/^ +--pdfdir.*\n//m; \
+ s/^ +--psdir.*\n//m; \
+ s/^ +--with-x .*\n//m; \
\
- s@mandir=.\$$\{prefix}/man.@mandir=\\\$${datadir}/man@; \
+ s/(\n\n)\n+/$$1/gs; \
\
- s@rm -f conftest@rm -rf conftest@g; \
+ s/rm -f conftest/rm -rf conftest/g; \
\
print;' \
< configure \
@@ -138,37 +144,68 @@ configure::
cat $$TMP > configure ) ; \
rm -f $$TMP
+# WARNING: This stands a good chance of breaking the world.
+# Be prepared to roll back all of /opt/local/ from Time Machine.
+automake-upgrade:
+ sudo port upgrade autoconf automake libtool autoconf-archive
+ cp -p /opt/local/share/automake*/{config.guess,config.sub,install-sh} .
+ cp -p /opt/local/share/libtool/aclocal.m4 .
+ cp -p /opt/local/share/aclocal/ax_pthread.m4 .
+ echo also consider autoupdate
+ $(MAKE2) configure
+
+
bump-version::
@ \
SRC=utils/version.h ; \
- VERS=`sed -n 's/[^0-9]*\([0-9]\)\.\([0-9][^. ]*\).*/\1 \2/p' $$SRC` ; \
+ VERS=`sed -n \
+ 's/[^0-9]*\([0-9]\)\.\([0-9][0-9]*\)\([^. \"]*\).*/\1 \2 \3/p' $$SRC | \
+ head -1` ; \
set - $$VERS ; \
- MAJOR="$$1"; MINOR="$$2"; \
- NEW=`echo $$MINOR + 1 | bc` ; \
- NEW=`echo $$NEW | sed 's/^\([0-9]\)$$/0\1/'` ; \
- D=`date '+%d-%b-%Y'`; \
+ MAJOR="$$1"; MINOR="$$2"; SUF="$$3"; \
+ VERS="$$MAJOR.$$MINOR$$SUF" ; \
+ if [ -z "$$SUF" ]; then \
+ MINOR=`echo $$MINOR + 1 | bc | sed 's/^\(.\)/0\1/'` ; \
+ else \
+ set - `echo $$SUF | sed 's/^\([^0-9]*\)/\1 /'` ; \
+ AA="$$1"; BB="$$2"; \
+ BB=`echo $$BB + 1 | bc` ; \
+ SUF="$$AA$$BB" ; \
+ fi ; \
+ VERS2="$$MAJOR.$$MINOR$$SUF" ; \
ADIR=archive/ ; \
- if [ ! -f $${ADIR}xscreensaver-$$MAJOR.$$MINOR.tar.gz ]; then \
- echo "WARNING: $${ADIR}xscreensaver-$$MAJOR.$$MINOR.tar.gz does not exist.";\
+ if [ ! -f "$${ADIR}xscreensaver-$$VERS.tar.gz" ]; then \
+ echo "WARNING: $${ADIR}xscreensaver-$$VERS.tar.gz does not exist."; \
fi ; \
- if [ -f $${ADIR}xscreensaver-$$MAJOR.$$NEW.tar.gz ]; then \
- echo "WARNING: $${ADIR}xscreensaver-$$MAJOR.$$NEW.tar.gz already exists.";\
+ if [ -f "$${ADIR}xscreensaver-$$VERS2.tar.gz" ]; then \
+ echo "WARNING: $${ADIR}xscreensaver-$$VERS2.tar.gz already exists."; \
fi ; \
- /bin/echo -n "Bumping $$MAJOR.$$MINOR to $$MAJOR.$$NEW ($$D), ok? "; \
+ /bin/echo -n "Bumping $$VERS to $$VERS2, ok? "; \
read line; \
if [ "x$$line" != "xyes" -a "x$$line" != "xy" ]; then \
exit 1 ; \
fi ; \
+ \
TMP=/tmp/bv.$$ ; \
- sed -e "s/\([0-9]\.[0-9][0-9]*\)/$$MAJOR.$$NEW/" \
- -e "s/\(([0-9][0-9]*-[A-Za-z][a-z][a-z]-[0-9][0-9][0-9]*\))/($$D)/" \
- $$SRC > $$TMP ; \
- /bin/echo -n "New version and date are "; \
- sed -n "s/[^0-9]*\([0-9]\.[0-9][0-9]*\) (\([-A-Za-z0-9]*\)).*/\1, \2./p" \
- $$TMP; \
+ sed -e "s/\([0-9]\.[0-9][^. \"]*\)/$$VERS2/" $$SRC > $$TMP ; \
+ if cmp -s $$SRC $$TMP ; then \
+ echo "ERROR! UNCHANGED!" ; \
+ exit 1 ; \
+ fi ; \
+ \
cat $$TMP > $$SRC ; \
rm -f $$TMP; \
- echo "overwrote $$SRC"; \
+ \
+ VERS3=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. \"]*\).*/\1/p' < $$SRC | \
+ tail -1`; \
+ if [ x"$$VERS2" != x"$$VERS3" ]; then \
+ echo "ERROR! \"$$VERS2\" vs \"$$VERS3\"!" ; \
+ exit 1 ; \
+ fi ; \
+ \
+ echo "Updated $$SRC version to \"$$VERS3\"" ; \
+ \
+ $(MAKE) version-date ; \
ls -lFd $$SRC
bump_version:: bump-version
@@ -178,15 +215,18 @@ tick_version:: bump-version
version-date::
@ \
SRC=utils/version.h ; \
+ VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. \"]*\).*/\1/p' < $$SRC | \
+ head -1`; \
D=`date '+%d-%b-%Y'`; \
+ TIME_T=`perl -e "use Date::Parse; print str2time('$$D 12:00')"` ; \
TMP=/tmp/bv.$$ ; \
- sed -e "s/([0-9][^()]*)/($$D)/" < $$SRC > $$TMP ; \
- /bin/echo -n "Updating date in $$SRC to \"$$D\"... " ; \
- if cmp -s $$SRC $$TMP ; then \
- echo "unchanged." ; \
- else \
+ sed -e "s/\([0-9]\.[0-9][^. \"]*\)/$$VERS/" \
+ -e "s/([0-9][^()]*)/($$D)/" \
+ -e "s/\(_RELEASED *\)[0-9][0-9]*/\1$$TIME_T/" \
+ < $$SRC > $$TMP ; \
+ if ! cmp -s $$SRC $$TMP ; then \
cat $$TMP > $$SRC ; \
- echo "done." ; \
+ echo "Updated $$SRC date to \"$$D\"" ; \
fi ; \
rm -f $$TMP
@@ -194,7 +234,8 @@ version-date::
update_spec_version::
@S=$(srcdir)/xscreensaver.spec ; \
U=$(srcdir)/utils/version.h ; \
- VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' < $$U` ; \
+ VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' < $$U | \
+ head -1` ; \
/bin/echo -n "Updating $$S to \"$$VERS\"... " ; \
T=/tmp/xs.$$$$ ; \
sed "s/^\(%define.version[^0-9]*\)\(.*\)/\1$$VERS/" \
@@ -209,7 +250,8 @@ update_spec_version::
rpm::
@ \
- VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' utils/version.h` ; \
+ VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' utils/version.h | \
+ head -1` ; \
DIR=`pwd`/rpm_build ; \
ARCH=`rpm --showrc | sed -n 's/^build arch *: //p'` ; \
ADIR=archive/ ; \
@@ -245,7 +287,8 @@ apk::
www::
@ \
DEST=$$HOME/www/xscreensaver ; \
- VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' utils/version.h` ; \
+ VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' utils/version.h | \
+ head -1` ; \
HEAD="xscreensaver-$$VERS" ; \
ADIR=archive/ ; \
BNAME="$$HEAD.tar.gz" ; \
@@ -355,10 +398,55 @@ www::
count::
@ \
- /bin/echo -n "Current hack count: " ; \
- ( ( cd hacks; make -s INSTALL=true install-program install-scripts ) ; \
- ( cd hacks/glx; make -s INSTALL=true install-program ) ) | \
- grep true | \
- grep -v helper | \
- grep -v ljlatest | \
- wc -l
+ echo "Current hack count: " ; \
+ A=`cd hacks ; ( make -s INSTALL=true install-man | \
+ grep true | grep -v helper | grep -v ljlatest | wc -l )` ; \
+ echo " X11:" $$A ; \
+ B=`cd hacks/glx ; ( make -s INSTALL=true install-man | \
+ grep true | grep -v helper | grep -v ljlatest | wc -l )` ; \
+ echo " GLX:" $$B ; \
+ C=`echo $$A + $$B | bc` ; \
+ echo " Total:" $$C ; \
+
+
+#cerebrum::
+# rsync -vax . cerebrum:src/xscreensaver/ \
+
+cerebrum::
+ rsync -vax . pi@10.0.1.19:xscreensaver/ \
+ --omit-dir-times \
+ --delete-during \
+ --exclude .git \
+ --exclude OSX \
+ --exclude android \
+ --exclude archive \
+ --exclude build \
+ --exclude gen \
+ --exclude videos \
+ --exclude config.h \
+ --exclude XScreenSaver_ad.h \
+ --include xscreensaver-getimage-file \
+ --include xscreensaver-getimage-video \
+ --include xscreensaver-text \
+ --exclude '*~' \
+ --include '*.asm' \
+ --include '*.c' \
+ --include '*.gif' \
+ --include '*.h' \
+ --include '*.in' \
+ --include '*.jpg' \
+ --include '*.m' \
+ --include '*.m4' \
+ --include '*.pdb' \
+ --include '*.png' \
+ --include '*.po' \
+ --include '*.xml' \
+ --include '*.xpm' \
+ --include '*.man' \
+ --include '*.ttf' \
+ --include '*.otf' \
+ --include '*.ui' \
+ --include 'configure*' \
+ --include '*/' \
+ --exclude '*'
+
diff --git a/README b/README
index 0b55bd1..ddb9786 100644
--- a/README
+++ b/README
@@ -18,33 +18,93 @@ that you install a binary release rather than trying to compile it yourself.
Executables are available for almost all platforms, including macOS, iOS, and
Android. See the XScreenSaver web site for details.
+
+===============================================================================
To compile for a Unix system with X11:
+===============================================================================
+
+ ./configure --help
+
+ ./configure --prefix=/usr
+ make
+ sudo make install
+ make clean
- ./configure
- make
- make install
+ xscreensaver &
+ xscreensaver-settings
- If you are on an "apt"-based system, "apt-get build-dep xscreensaver"
- might install most of the compilation dependencies.
+ There are many compilation dependencies. The configure script will
+ tell you what is missing. At the least, you will need development
+ versions of these libraries:
+
+ perl pkg-config gettext intltool libx11 libxext libxi libxt
+ libxft libxinerama libxrandr libxxf86vm libgl libglu libgle
+ libgtk2 gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0 libxml2 libpam
+ dbus libsystemd elogind
+
+ BSD systems might need gmake instead of make.
+
+
+===============================================================================
+To compile for macOS or iOS:
+===============================================================================
-To compile for macOS X or iOS:
+ See OSX/README. Use the included Xcode project.
- Use the included XCode project. Requires XCode 6 and macOS 10.8
- or newer.
+===============================================================================
To compile for Android:
+===============================================================================
See android/README.
+
+===============================================================================
Interested in writing a new screen saver?
+===============================================================================
See the README.hacking file.
+
+===============================================================================
+Version History
===============================================================================
-XScreenSaver has an extensive manual -- please read it!
+6.00 * X11: Major refactor of the `xscreensaver' daemon for improved
+ security, dividing it into three programs: `xscreensaver',
+ `xscreensaver-gfx' and `xscreensaver-auth'.
+ * X11: Dropped support for systems older than X11R7 (2009).
+ * X11: Renamed `xscreensaver-demo' to `xscreensaver-settings'.
+ * X11: Unlock dialog has user-selectable color schemes.
+ * X11: Everything uses XFreeType for fonts now.
+ * X11: Install a few custom fonts needed by some savers.
+ * X11: Fading works on systems without gamma (e.g. Raspberry Pi).
+ * X11: Use EGL instead of GLX when available.
+ * X11: `xscreensaver-systemd' now detects when a video player has
+ inhibited screen blanking and then exits without uninhibiting.
+ * Improved GLSL and GLES3 support: Phong shading in `etruscanvenus',
+ `hypertorus', `klein', `projectiveplane',`romanboy' and
+ `sphereeversion'.
+ * Updates to `cubicgrid'.
+ * macOS: Added a `Random XScreenSaver' screen saver, which implements
+ cycle mode, among other things.
+ * iOS: Also added cycle mode.
+
+5.45 * New hacks, `covid19', `headroom', `sphereeversion' and `beats'.
+ * Shader updates to `hypertorus'.
+ * No more image-loading pause in `glslideshow'.
+ * BSOD supports GNOME.
+ * Image loaders support SVG.
+ * macOS: Fixed text loading on 10.15.
+ * X11: `xscreensaver-systemd' now allows video players to request that
+ the screen not blank.
+ * X11: -log implies -verbose -no-capture-stderr.
+ * X11: Glade -> GtkBuilder.
+ * Android: These hacks work now: `carousel', `juggler3d', `molecule',
+ `photopile', `polyominoes'.
+ * Various bug fixes.
-===============================================================================
+5.44.1 * macOS: fixed some signing problems in the DMG.
5.44 * New hacks, `gibson', `etruscanvenus' and `scooter'.
* BSOD supports Tivo and Nintendo.
@@ -538,7 +598,7 @@ XScreenSaver has an extensive manual -- please read it!
run `gdmflexiserver'. Experimental!
* Fixed non-ASCII display bug in `starwars'.
* Configure finds a default for imageDirectory.
- * "xscreensaver-command -lock" now works even if in "screensaver
+ * `xscreensaver-command -lock' now works even if in "screensaver
disabled" mode.
* If a bad password is typed while CapsLock is on, the unlock dialog
says "CapsLock?" instead of "Sorry".
@@ -634,7 +694,7 @@ XScreenSaver has an extensive manual -- please read it!
4.12 * New GL hacks, `flipflop', `antspotlight', and `polytopes'.
* Added VMS to `bsod'.
- * Compile without warnings in "gcc -pedantic".
+ * Compile without warnings in `gcc -pedantic'.
* Updates to `webcollage' and `queens'.
* Fixed a bug that could cause PAM to hang.
@@ -722,8 +782,8 @@ XScreenSaver has an extensive manual -- please read it!
* Fixed a bug in `webcollage' (due to recent Alta Vista url changes)
that was causing it to try and load incorrect image URLs.
* Made `xscreensaver-getimage' use gdk_pixbuf if it is available: this
- means that those hacks that load images will no longer rely on "xv",
- "xloadimage", etc. This will close a race condition that could
+ means that those hacks that load images will no longer rely on `xv',
+ `xloadimage', etc. This will close a race condition that could
sometimes cause your desktop background to be changed; and also
makes it possible for those programs to operate on image files when
running in windowed mode.
@@ -1126,7 +1186,7 @@ XScreenSaver has an extensive manual -- please read it!
* Made xscreensaver notice when there has been a sudden large jump in
wall-clock time, and if so, lock right away, instead of waiting for
"lockTimeout" to expire first. (Laptops need this for safer
- recovery from ``hibernation.'')
+ recovery from hibernation.)
* Added `-throttle' option to `xscreensaver-command'.
3.10 * Added `phosphor', `xmatrix', and `pulsar' hacks.
@@ -1198,7 +1258,7 @@ XScreenSaver has an extensive manual -- please read it!
3.04 * Added an `xscreensaver.spec' file, to make it easier for other folks
to generate RPMs.
* Made the password code work on HPUX in the situation where:
- ``enhanced security'' is available; but not used; but the user typed
+ "enhanced security" is available; but not used; but the user typed
a password more than 8 characters long anyway. FTSOHPUX.
3.03 * Made locking work when passwd aging is enabled.
@@ -1344,7 +1404,7 @@ XScreenSaver has an extensive manual -- please read it!
* Added a `timestamp' resource that makes the `-verbose' messages
include the time at which they were printed.
-2.23 * The fix for SGI's ``scheme'' nonsense broke things, and let the
+2.23 * The fix for SGI's "scheme" nonsense broke things, and let the
user's "*background" resource show through. Fixed it in a different
way.
@@ -1377,7 +1437,7 @@ XScreenSaver has an extensive manual -- please read it!
xscreensaver-command, which does a totally different thing.
* Removed xscreensaver's `-demo' command-line option for a similar
reason; use `xscreensaver-command -demo' instead.
- * Disabled SGI's ``scheme'' nonsense in a better way than
+ * Disabled SGI's "scheme" nonsense in a better way than
fully-qualifying the background colors in every single hack.
* Fixed some other minor cosmetic problems when *sgiMode is turned on.
* Fixed an X error in `bsod -root' (how ironic...)
@@ -1498,7 +1558,7 @@ XScreenSaver has an extensive manual -- please read it!
2.06 * Merged in VMS support from Patrick Moreau.
2.05 * Fixed a MIT-SCREEN-SAVER-related crash, and tweaked
- configure to detect the extra-random -Xss library.
+ configure to detect the extra-random -lXss library.
2.04 * HP configure tweaks. Detect and warn about LessTif.
* Fixed low-color behavior of `goop', `pyro', `starfish',
@@ -1650,5 +1710,6 @@ XScreenSaver has an extensive manual -- please read it!
* Fixed a BadDrawable error in non-XIdle mode.
* Added `blitspin' and `imsmap'.
-1.01 * Current list of included hacks is now: qix, helix, rorschach,
- attraction, greynetic, rocks, pyro, hopalong, and noseguy.
+1.01 * Current list of included hacks is now: `qix', `helix', `rorschach',
+ `attraction', `greynetic', `rocks', `pyro', `hopalong', and
+ `noseguy'.
diff --git a/README.VMS b/README.VMS
deleted file mode 100644
index d190344..0000000
--- a/README.VMS
+++ /dev/null
@@ -1,57 +0,0 @@
-OpenVMS port of Xscreensavser version 2.10 October 1997
-==========================================
-
-Xscreensaver distribution can be found in 3 subdirectories:
-
-[.DRIVER] The Xscreensaver and Xscreensaver-command programs.
-[.HACKS] Graphic demos ,can be run either through the xscreensaver program
- or standalone.
-[.UTILS] A small libraries of various utilities.
-
-This port has been tested with VAX VMS 6.1 (compiled with DEC 5 5.0 and
-Motif 1.2) and AXP VMS 6.2 (compiled with DEC C 5.0 and Motif 1.2-4).
-
-To rebuild, you need to rebuild [.UTILS] directory first and create the
-object library (look at the end of COMPILE*.COM procedure).
-
-You can now build the [.HACKS] directory and the [.DRIVER] directory.
-
-A one-step build is now available via the MAKEVMS.COM script.
-
-WARNING : before building [.HACKS], you may need to correct some of the
-DECwindows bitmap files. Some files are bogus !! (they have a long line of
-null chars at the end). These files are under
-SYS$COMMON:[DECW$INCLUDE.BITMAPS] directory:
-
-STIPPLE.XBM
-HLINES2.XBM
-LIGHT_GRAY.XBM
-ROOT_WEAVES.XBM
-VLINES2.XBM
-
-These files are all used by Greynetic demo.
-
-Nota: link procedure automagically select appropriate X and Motif Libraries
-(X11R4/Motif 1.1 - X11R5/Motif 1.2).
-
-The SETUP.COM procedure gives you a definition of all DCL foreign command
-symbols needed to run Xscreensaver and all the graphic hacks. You need to
-modify this procedure if you install these programs in another directory tree.
-
-You can easily add new graphic demos without recompiling Xscreensaver. You just
-need to add them in resource file XSCREENSAVER.DAT. This file (originally
-present in [.DRIVER] directory ) can be installed under your SYS$LOGIN
-directory for a per-user customization basis. You can also install it under
-the system-wide user resource directory SYS$COMMON:[DECW$DEFAULT.USER]
-(with (W:RE) protections). The new graphics hack must be run in root-window
-mode to be accepted by Xscreensaver.
-
-The graphic demos are spawn into subprocess created by the system() call (in
-the Unix version the execvp() call is used).
-
-The VMS passord checking programs were picked up in the Xlock distribution.
-
-Enjoy,
-
-Patrick MOREAU - CENA/Athis-Mons - FRANCE (pmoreau@cena.dgac.fr)
- (moreau_p@decus.decus.fr)
diff --git a/README.hacking b/README.hacking
index f2958b4..39f9e14 100644
--- a/README.hacking
+++ b/README.hacking
@@ -50,6 +50,11 @@ Requirements for inclusion with the XScreenSaver collection
your name and the current year). The GNU GPL is not compatible with
the rest of XScreenSaver.
+ - No clocks! Just as time travellers always try to kill Hitler on their
+ first trip, everyone seems to think that their first screen saver
+ should be a clock of some kind. Nobody needs to know what time it is
+ with such frequency. Fight The Tyranny Of The Clock.
+
==========================================================================
The XScreenSaver API
@@ -184,6 +189,10 @@ Programming Tips
in long-lived processes where no such cleanup takes place.
Consider Valgrind or gcc -fsanitize=leak to find memory leaks.
+ - Again, don't use global variables. If you are doing your developent
+ under X11, test your saver from the command line with the "-pair"
+ argument. If that crashes, you're using global variables!
+
==========================================================================
macOS, iOS and Android
@@ -201,4 +210,30 @@ macOS, iOS and Android
To check that an X11 saver will fit well on a mobile device, test it
with -geometry 640x1136 and 640x960. That's a good first step, anyway.
+
+==========================================================================
+Theory behind the ifdefs
+==========================================================================
+
+ HAVE_ macros indicate that an API is available.
+ USE_ macros indicate that a feature is requested.
+
+ Some notable ones:
+
+ HAVE_GL The OpenGL 1.3 API is available, natively or through emulation.
+ HAVE_GLES The OpenGLES 1.x API is available.
+ HAVE_COCOA The Cocoa API is available, meaning compiling for macOS or iOS.
+ HAVE_IPHONE Compiling for iOS, including iPad.
+ HAVE_ANDROID Compiling for Android.
+ HAVE_MOBILE iOS or Android, typically used for things related to rotation
+ or screen size that apply to all phones and tablets.
+ HAVE_JWXYZ Compiling on a system where the X11 API is emulated
+ (macOS, iOS or Android).
+ HAVE_JWZGLES Compiling on a system where the OpenGL 1.3 API is emulated
+ (iOS, Android, possibly Linux).
+ HAVE_GLSL Compiling against a library that supports the GL Shading
+ Language. Note that using GLSL also requires a runtime check
+ to see which version of GLSL the *running* system supports.
+ HAVE_EGL OpenGL interfaces with native windows via EGL instead of GLX.
+
==========================================================================
diff --git a/aclocal.m4 b/aclocal.m4
index d25f855..45eab98 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.16.1 -*- Autoconf -*-
+# generated automatically by aclocal 1.16.3 -*- Autoconf -*-
-# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -701,7 +701,7 @@ AC_DEFUN([AM_NLS],
AC_SUBST([USE_NLS])
])
-# Copyright (C) 2006-2018 Free Software Foundation, Inc.
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
diff --git a/ax_pthread.m4 b/ax_pthread.m4
index d383ad5..e5858e5 100644
--- a/ax_pthread.m4
+++ b/ax_pthread.m4
@@ -1,5 +1,5 @@
# ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_pthread.html
+# https://www.gnu.org/software/autoconf-archive/ax_pthread.html
# ===========================================================================
#
# SYNOPSIS
@@ -14,24 +14,28 @@
# flags that are needed. (The user can also force certain compiler
# flags/libs to be tested by setting these environment variables.)
#
-# Also sets PTHREAD_CC to any special C compiler that is needed for
-# multi-threaded programs (defaults to the value of CC otherwise). (This
-# is necessary on AIX to use the special cc_r compiler alias.)
+# Also sets PTHREAD_CC and PTHREAD_CXX to any special C compiler that is
+# needed for multi-threaded programs (defaults to the value of CC
+# respectively CXX otherwise). (This is necessary on e.g. AIX to use the
+# special cc_r/CC_r compiler alias.)
#
# NOTE: You are assumed to not only compile your program with these flags,
-# but also link it with them as well. e.g. you should link with
+# but also to link with them as well. For example, you might link with
# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
+# $PTHREAD_CXX $CXXFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
#
-# If you are only building threads programs, you may wish to use these
+# If you are only building threaded programs, you may wish to use these
# variables in your default LIBS, CFLAGS, and CC:
#
# LIBS="$PTHREAD_LIBS $LIBS"
# CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+# CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS"
# CC="$PTHREAD_CC"
+# CXX="$PTHREAD_CXX"
#
# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
-# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name
-# (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
+# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to
+# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
#
# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the
# PTHREAD_PRIO_INHERIT symbol is defined when compiling with
@@ -55,6 +59,7 @@
#
# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
# Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG>
+# Copyright (c) 2019 Marc Stevens <marc.stevens@cwi.nl>
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
@@ -67,7 +72,7 @@
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
-# with this program. If not, see <http://www.gnu.org/licenses/>.
+# with this program. If not, see <https://www.gnu.org/licenses/>.
#
# As a special exception, the respective Autoconf Macro's copyright owner
# gives unlimited permission to copy, distribute and modify the configure
@@ -82,35 +87,41 @@
# modified version of the Autoconf Macro, you may extend this special
# exception to the GPL to apply to your modified version as well.
-#serial 21
+#serial 30
AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
AC_DEFUN([AX_PTHREAD], [
-AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([AC_CANONICAL_TARGET])
+AC_REQUIRE([AC_PROG_CC])
+AC_REQUIRE([AC_PROG_SED])
AC_LANG_PUSH([C])
ax_pthread_ok=no
# We used to check for pthread.h first, but this fails if pthread.h
-# requires special compiler flags (e.g. on True64 or Sequent).
+# requires special compiler flags (e.g. on Tru64 or Sequent).
# It gets checked for in the link test anyway.
# First of all, check if the user has set any of the PTHREAD_LIBS,
# etcetera environment variables, and if threads linking works using
# them:
-if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
- save_CFLAGS="$CFLAGS"
+if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then
+ ax_pthread_save_CC="$CC"
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ ax_pthread_save_LIBS="$LIBS"
+ AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"])
+ AS_IF([test "x$PTHREAD_CXX" != "x"], [CXX="$PTHREAD_CXX"])
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
- save_LIBS="$LIBS"
LIBS="$PTHREAD_LIBS $LIBS"
- AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
- AC_TRY_LINK_FUNC([pthread_join], [ax_pthread_ok=yes])
+ AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS])
+ AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes])
AC_MSG_RESULT([$ax_pthread_ok])
- if test x"$ax_pthread_ok" = xno; then
+ if test "x$ax_pthread_ok" = "xno"; then
PTHREAD_LIBS=""
PTHREAD_CFLAGS=""
fi
- LIBS="$save_LIBS"
- CFLAGS="$save_CFLAGS"
+ CC="$ax_pthread_save_CC"
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ LIBS="$ax_pthread_save_LIBS"
fi
# We must check for the threads library under a number of different
@@ -118,12 +129,14 @@ fi
# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
# libraries is broken (non-POSIX).
-# Create a list of thread flags to try. Items starting with a "-" are
-# C compiler flags, and other items are library names, except for "none"
-# which indicates that we try without any flags at all, and "pthread-config"
-# which is a program returning the flags for the Pth emulation library.
+# Create a list of thread flags to try. Items with a "," contain both
+# C compiler flags (before ",") and linker flags (after ","). Other items
+# starting with a "-" are C compiler flags, and remaining items are
+# library names, except for "none" which indicates that we try without
+# any flags at all, and "pthread-config" which is a program returning
+# the flags for the Pth emulation library.
-ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
# The ordering *is* (sometimes) important. Some notes on the
# individual items follow:
@@ -132,82 +145,163 @@ ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mt
# none: in case threads are in libc; should be tried before -Kthread and
# other compiler flags to prevent continual compiler warnings
# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
-# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
-# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
-# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
-# -pthreads: Solaris/gcc
-# -mthreads: Mingw32/gcc, Lynx/gcc
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64
+# (Note: HP C rejects this with "bad form for `-t' option")
+# -pthreads: Solaris/gcc (Note: HP C also rejects)
# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
-# doesn't hurt to check since this sometimes defines pthreads too;
-# also defines -D_REENTRANT)
-# ... -mt is also the pthreads flag for HP/aCC
+# doesn't hurt to check since this sometimes defines pthreads and
+# -D_REENTRANT too), HP C (must be checked before -lpthread, which
+# is present but should not be used directly; and before -mthreads,
+# because the compiler interprets this as "-mt" + "-hreads")
+# -mthreads: Mingw32/gcc, Lynx/gcc
# pthread: Linux, etcetera
# --thread-safe: KAI C++
# pthread-config: use pthread-config program (for GNU Pth library)
-case ${host_os} in
+case $target_os in
+
+ freebsd*)
+
+ # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+ # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+
+ ax_pthread_flags="-kthread lthread $ax_pthread_flags"
+ ;;
+
+ hpux*)
+
+ # From the cc(1) man page: "[-mt] Sets various -D flags to enable
+ # multi-threading and also sets -lpthread."
+
+ ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags"
+ ;;
+
+ openedition*)
+
+ # IBM z/OS requires a feature-test macro to be defined in order to
+ # enable POSIX threads at all, so give the user a hint if this is
+ # not set. (We don't define these ourselves, as they can affect
+ # other portions of the system API in unpredictable ways.)
+
+ AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING],
+ [
+# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS)
+ AX_PTHREAD_ZOS_MISSING
+# endif
+ ],
+ [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])])
+ ;;
+
solaris*)
# On Solaris (at least, for some versions), libc contains stubbed
# (non-functional) versions of the pthreads routines, so link-based
- # tests will erroneously succeed. (We need to link with -pthreads/-mt/
- # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
- # a function called by this macro, so we could check for that, but
- # who knows whether they'll stub that too in a future libc.) So,
- # we'll just look for -pthreads and -lpthread first:
+ # tests will erroneously succeed. (N.B.: The stubs are missing
+ # pthread_cleanup_push, or rather a function called by this macro,
+ # so we could check for that, but who knows whether they'll stub
+ # that too in a future libc.) So we'll check first for the
+ # standard Solaris way of linking pthreads (-mt -lpthread).
+
+ ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags"
+ ;;
+esac
+
+# Are we compiling with Clang?
+
+AC_CACHE_CHECK([whether $CC is Clang],
+ [ax_cv_PTHREAD_CLANG],
+ [ax_cv_PTHREAD_CLANG=no
+ # Note that Autoconf sets GCC=yes for Clang as well as GCC
+ if test "x$GCC" = "xyes"; then
+ AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG],
+ [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */
+# if defined(__clang__) && defined(__llvm__)
+ AX_PTHREAD_CC_IS_CLANG
+# endif
+ ],
+ [ax_cv_PTHREAD_CLANG=yes])
+ fi
+ ])
+ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
+
+
+# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC)
+
+# Note that for GCC and Clang -pthread generally implies -lpthread,
+# except when -nostdlib is passed.
+# This is problematic using libtool to build C++ shared libraries with pthread:
+# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460
+# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333
+# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555
+# To solve this, first try -pthread together with -lpthread for GCC
+
+AS_IF([test "x$GCC" = "xyes"],
+ [ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"])
+
+# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first
+
+AS_IF([test "x$ax_pthread_clang" = "xyes"],
+ [ax_pthread_flags="-pthread,-lpthread -pthread"])
- ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags"
+
+# The presence of a feature test macro requesting re-entrant function
+# definitions is, on some systems, a strong hint that pthreads support is
+# correctly enabled
+
+case $target_os in
+ darwin* | hpux* | linux* | osf* | solaris*)
+ ax_pthread_check_macro="_REENTRANT"
;;
- darwin*)
- ax_pthread_flags="-pthread $ax_pthread_flags"
+ aix*)
+ ax_pthread_check_macro="_THREAD_SAFE"
;;
-esac
-# Clang doesn't consider unrecognized options an error unless we specify
-# -Werror. We throw in some extra Clang-specific options to ensure that
-# this doesn't happen for GCC, which also accepts -Werror.
+ *)
+ ax_pthread_check_macro="--"
+ ;;
+esac
+AS_IF([test "x$ax_pthread_check_macro" = "x--"],
+ [ax_pthread_check_cond=0],
+ [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"])
-AC_MSG_CHECKING([if compiler needs -Werror to reject unknown flags])
-save_CFLAGS="$CFLAGS"
-ax_pthread_extra_flags="-Werror"
-CFLAGS="$CFLAGS $ax_pthread_extra_flags -Wunknown-warning-option -Wsizeof-array-argument"
-AC_COMPILE_IFELSE([AC_LANG_PROGRAM([int foo(void);],[foo()])],
- [AC_MSG_RESULT([yes])],
- [ax_pthread_extra_flags=
- AC_MSG_RESULT([no])])
-CFLAGS="$save_CFLAGS"
-if test x"$ax_pthread_ok" = xno; then
-for flag in $ax_pthread_flags; do
+if test "x$ax_pthread_ok" = "xno"; then
+for ax_pthread_try_flag in $ax_pthread_flags; do
- case $flag in
+ case $ax_pthread_try_flag in
none)
AC_MSG_CHECKING([whether pthreads work without any flags])
;;
+ *,*)
+ PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"`
+ PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"`
+ AC_MSG_CHECKING([whether pthreads work with "$PTHREAD_CFLAGS" and "$PTHREAD_LIBS"])
+ ;;
+
-*)
- AC_MSG_CHECKING([whether pthreads work with $flag])
- PTHREAD_CFLAGS="$flag"
+ AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag])
+ PTHREAD_CFLAGS="$ax_pthread_try_flag"
;;
pthread-config)
AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no])
- if test x"$ax_pthread_config" = xno; then continue; fi
+ AS_IF([test "x$ax_pthread_config" = "xno"], [continue])
PTHREAD_CFLAGS="`pthread-config --cflags`"
PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
;;
*)
- AC_MSG_CHECKING([for the pthreads library -l$flag])
- PTHREAD_LIBS="-l$flag"
+ AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag])
+ PTHREAD_LIBS="-l$ax_pthread_try_flag"
;;
esac
- save_LIBS="$LIBS"
- save_CFLAGS="$CFLAGS"
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ ax_pthread_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
LIBS="$PTHREAD_LIBS $LIBS"
- CFLAGS="$CFLAGS $PTHREAD_CFLAGS $ax_pthread_extra_flags"
# Check for various functions. We must include pthread.h,
# since some functions may be macros. (On the Sequent, we
@@ -218,8 +312,18 @@ for flag in $ax_pthread_flags; do
# pthread_cleanup_push because it is one of the few pthread
# functions on Solaris that doesn't have a non-functional libc stub.
# We try pthread_create on general principles.
+
AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>
- static void routine(void *a) { a = 0; }
+# if $ax_pthread_check_cond
+# error "$ax_pthread_check_macro must be defined"
+# endif
+ static void *some_global = NULL;
+ static void routine(void *a)
+ {
+ /* To avoid any unused-parameter or
+ unused-but-set-parameter warning. */
+ some_global = a;
+ }
static void *start_routine(void *a) { return a; }],
[pthread_t th; pthread_attr_t attr;
pthread_create(&th, 0, start_routine, 0);
@@ -227,101 +331,187 @@ for flag in $ax_pthread_flags; do
pthread_attr_init(&attr);
pthread_cleanup_push(routine, 0);
pthread_cleanup_pop(0) /* ; */])],
- [ax_pthread_ok=yes],
- [])
+ [ax_pthread_ok=yes],
+ [])
- LIBS="$save_LIBS"
- CFLAGS="$save_CFLAGS"
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ LIBS="$ax_pthread_save_LIBS"
AC_MSG_RESULT([$ax_pthread_ok])
- if test "x$ax_pthread_ok" = xyes; then
- break;
- fi
+ AS_IF([test "x$ax_pthread_ok" = "xyes"], [break])
PTHREAD_LIBS=""
PTHREAD_CFLAGS=""
done
fi
+
+# Clang needs special handling, because older versions handle the -pthread
+# option in a rather... idiosyncratic way
+
+if test "x$ax_pthread_clang" = "xyes"; then
+
+ # Clang takes -pthread; it has never supported any other flag
+
+ # (Note 1: This will need to be revisited if a system that Clang
+ # supports has POSIX threads in a separate library. This tends not
+ # to be the way of modern systems, but it's conceivable.)
+
+ # (Note 2: On some systems, notably Darwin, -pthread is not needed
+ # to get POSIX threads support; the API is always present and
+ # active. We could reasonably leave PTHREAD_CFLAGS empty. But
+ # -pthread does define _REENTRANT, and while the Darwin headers
+ # ignore this macro, third-party headers might not.)
+
+ # However, older versions of Clang make a point of warning the user
+ # that, in an invocation where only linking and no compilation is
+ # taking place, the -pthread option has no effect ("argument unused
+ # during compilation"). They expect -pthread to be passed in only
+ # when source code is being compiled.
+ #
+ # Problem is, this is at odds with the way Automake and most other
+ # C build frameworks function, which is that the same flags used in
+ # compilation (CFLAGS) are also used in linking. Many systems
+ # supported by AX_PTHREAD require exactly this for POSIX threads
+ # support, and in fact it is often not straightforward to specify a
+ # flag that is used only in the compilation phase and not in
+ # linking. Such a scenario is extremely rare in practice.
+ #
+ # Even though use of the -pthread flag in linking would only print
+ # a warning, this can be a nuisance for well-run software projects
+ # that build with -Werror. So if the active version of Clang has
+ # this misfeature, we search for an option to squash it.
+
+ AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread],
+ [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG],
+ [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown
+ # Create an alternate version of $ac_link that compiles and
+ # links in two steps (.c -> .o, .o -> exe) instead of one
+ # (.c -> exe), because the warning occurs only in the second
+ # step
+ ax_pthread_save_ac_link="$ac_link"
+ ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g'
+ ax_pthread_link_step=`AS_ECHO(["$ac_link"]) | sed "$ax_pthread_sed"`
+ ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)"
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do
+ AS_IF([test "x$ax_pthread_try" = "xunknown"], [break])
+ CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS"
+ ac_link="$ax_pthread_save_ac_link"
+ AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
+ [ac_link="$ax_pthread_2step_ac_link"
+ AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
+ [break])
+ ])
+ done
+ ac_link="$ax_pthread_save_ac_link"
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no])
+ ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try"
+ ])
+
+ case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in
+ no | unknown) ;;
+ *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;;
+ esac
+
+fi # $ax_pthread_clang = yes
+
+
+
# Various other checks:
-if test "x$ax_pthread_ok" = xyes; then
- save_LIBS="$LIBS"
- LIBS="$PTHREAD_LIBS $LIBS"
- save_CFLAGS="$CFLAGS"
+if test "x$ax_pthread_ok" = "xyes"; then
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ ax_pthread_save_LIBS="$LIBS"
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+ LIBS="$PTHREAD_LIBS $LIBS"
# Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
- AC_MSG_CHECKING([for joinable pthread attribute])
- attr_name=unknown
- for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
- AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
- [int attr = $attr; return attr /* ; */])],
- [attr_name=$attr; break],
- [])
- done
- AC_MSG_RESULT([$attr_name])
- if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
- AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], [$attr_name],
- [Define to necessary symbol if this constant
- uses a non-standard name on your system.])
- fi
-
- AC_MSG_CHECKING([if more special flags are required for pthreads])
- flag=no
- case ${host_os} in
- aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";;
- osf* | hpux*) flag="-D_REENTRANT";;
- solaris*)
- if test "$GCC" = "yes"; then
- flag="-D_REENTRANT"
- else
- # TODO: What about Clang on Solaris?
- flag="-mt -D_REENTRANT"
- fi
- ;;
- esac
- AC_MSG_RESULT([$flag])
- if test "x$flag" != xno; then
- PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
- fi
+ AC_CACHE_CHECK([for joinable pthread attribute],
+ [ax_cv_PTHREAD_JOINABLE_ATTR],
+ [ax_cv_PTHREAD_JOINABLE_ATTR=unknown
+ for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
+ [int attr = $ax_pthread_attr; return attr /* ; */])],
+ [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break],
+ [])
+ done
+ ])
+ AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \
+ test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \
+ test "x$ax_pthread_joinable_attr_defined" != "xyes"],
+ [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE],
+ [$ax_cv_PTHREAD_JOINABLE_ATTR],
+ [Define to necessary symbol if this constant
+ uses a non-standard name on your system.])
+ ax_pthread_joinable_attr_defined=yes
+ ])
+
+ AC_CACHE_CHECK([whether more special flags are required for pthreads],
+ [ax_cv_PTHREAD_SPECIAL_FLAGS],
+ [ax_cv_PTHREAD_SPECIAL_FLAGS=no
+ case $target_os in
+ solaris*)
+ ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS"
+ ;;
+ esac
+ ])
+ AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \
+ test "x$ax_pthread_special_flags_added" != "xyes"],
+ [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS"
+ ax_pthread_special_flags_added=yes])
AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT],
- [ax_cv_PTHREAD_PRIO_INHERIT], [
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <pthread.h>]],
- [[int i = PTHREAD_PRIO_INHERIT;]])],
- [ax_cv_PTHREAD_PRIO_INHERIT=yes],
- [ax_cv_PTHREAD_PRIO_INHERIT=no])
+ [ax_cv_PTHREAD_PRIO_INHERIT],
+ [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <pthread.h>]],
+ [[int i = PTHREAD_PRIO_INHERIT;
+ return i;]])],
+ [ax_cv_PTHREAD_PRIO_INHERIT=yes],
+ [ax_cv_PTHREAD_PRIO_INHERIT=no])
])
- AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"],
- [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])])
+ AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \
+ test "x$ax_pthread_prio_inherit_defined" != "xyes"],
+ [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])
+ ax_pthread_prio_inherit_defined=yes
+ ])
- LIBS="$save_LIBS"
- CFLAGS="$save_CFLAGS"
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ LIBS="$ax_pthread_save_LIBS"
# More AIX lossage: compile with *_r variant
- if test "x$GCC" != xyes; then
- case $host_os in
+ if test "x$GCC" != "xyes"; then
+ case $target_os in
aix*)
AS_CASE(["x/$CC"],
- [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6],
- [#handle absolute path differently from PATH based program lookup
- AS_CASE(["x$CC"],
- [x/*],
- [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])],
- [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])])
+ [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6],
+ [#handle absolute path differently from PATH based program lookup
+ AS_CASE(["x$CC"],
+ [x/*],
+ [
+ AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])
+ AS_IF([test "x${CXX}" != "x"], [AS_IF([AS_EXECUTABLE_P([${CXX}_r])],[PTHREAD_CXX="${CXX}_r"])])
+ ],
+ [
+ AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])
+ AS_IF([test "x${CXX}" != "x"], [AC_CHECK_PROGS([PTHREAD_CXX],[${CXX}_r],[$CXX])])
+ ]
+ )
+ ])
;;
esac
fi
fi
test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
+test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX"
AC_SUBST([PTHREAD_LIBS])
AC_SUBST([PTHREAD_CFLAGS])
AC_SUBST([PTHREAD_CC])
+AC_SUBST([PTHREAD_CXX])
# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
-if test x"$ax_pthread_ok" = xyes; then
+if test "x$ax_pthread_ok" = "xyes"; then
ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1])
:
else
diff --git a/config.guess b/config.guess
index 256083a..0fc11ed 100755
--- a/config.guess
+++ b/config.guess
@@ -1,8 +1,8 @@
#! /bin/sh
# Attempt to guess a canonical system name.
-# Copyright 1992-2018 Free Software Foundation, Inc.
+# Copyright 1992-2020 Free Software Foundation, Inc.
-timestamp='2018-03-08'
+timestamp='2020-11-07'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -32,7 +32,7 @@ timestamp='2018-03-08'
# Please send patches to <config-patches@gnu.org>.
-me=`echo "$0" | sed -e 's,.*/,,'`
+me=$(echo "$0" | sed -e 's,.*/,,')
usage="\
Usage: $0 [OPTION]
@@ -50,7 +50,7 @@ version="\
GNU config.guess ($timestamp)
Originally written by Per Bothner.
-Copyright 1992-2018 Free Software Foundation, Inc.
+Copyright 1992-2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -84,8 +84,6 @@ if test $# != 0; then
exit 1
fi
-trap 'exit 1' 1 2 15
-
# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
# compiler to aid in system detection is discouraged as it requires
# temporary files to be created and, as you can see below, it is a
@@ -96,41 +94,47 @@ trap 'exit 1' 1 2 15
# Portable tmp directory creation inspired by the Autoconf team.
-set_cc_for_build='
-trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
-: ${TMPDIR=/tmp} ;
- { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
-dummy=$tmp/dummy ;
-tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
-case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,) echo "int x;" > "$dummy.c" ;
- for c in cc gcc c89 c99 ; do
- if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
- CC_FOR_BUILD="$c"; break ;
- fi ;
- done ;
- if test x"$CC_FOR_BUILD" = x ; then
- CC_FOR_BUILD=no_compiler_found ;
- fi
- ;;
- ,,*) CC_FOR_BUILD=$CC ;;
- ,*,*) CC_FOR_BUILD=$HOST_CC ;;
-esac ; set_cc_for_build= ;'
+tmp=
+# shellcheck disable=SC2172
+trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15
+
+set_cc_for_build() {
+ # prevent multiple calls if $tmp is already set
+ test "$tmp" && return 0
+ : "${TMPDIR=/tmp}"
+ # shellcheck disable=SC2039
+ { tmp=$( (umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null) && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; }
+ dummy=$tmp/dummy
+ case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in
+ ,,) echo "int x;" > "$dummy.c"
+ for driver in cc gcc c89 c99 ; do
+ if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
+ CC_FOR_BUILD="$driver"
+ break
+ fi
+ done
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+ esac
+}
# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
# (ghazi@noc.rutgers.edu 1994-08-24)
-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+if test -f /.attbin/uname ; then
PATH=$PATH:/.attbin ; export PATH
fi
-UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
-UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+UNAME_MACHINE=$( (uname -m) 2>/dev/null) || UNAME_MACHINE=unknown
+UNAME_RELEASE=$( (uname -r) 2>/dev/null) || UNAME_RELEASE=unknown
+UNAME_SYSTEM=$( (uname -s) 2>/dev/null) || UNAME_SYSTEM=unknown
+UNAME_VERSION=$( (uname -v) 2>/dev/null) || UNAME_VERSION=unknown
case "$UNAME_SYSTEM" in
Linux|GNU|GNU/*)
@@ -138,7 +142,7 @@ Linux|GNU|GNU/*)
# We could probably try harder.
LIBC=gnu
- eval "$set_cc_for_build"
+ set_cc_for_build
cat <<-EOF > "$dummy.c"
#include <features.h>
#if defined(__UCLIBC__)
@@ -146,17 +150,15 @@ Linux|GNU|GNU/*)
#elif defined(__dietlibc__)
LIBC=dietlibc
#else
+ #include <stdarg.h>
+ #ifdef __DEFINED_va_list
+ LIBC=musl
+ #else
LIBC=gnu
#endif
+ #endif
EOF
- eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`"
-
- # If ldd exists, use it to detect musl libc.
- if command -v ldd >/dev/null && \
- ldd --version 2>&1 | grep -q ^musl
- then
- LIBC=musl
- fi
+ eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g')"
;;
esac
@@ -175,19 +177,20 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
# Note: NetBSD doesn't particularly care about the vendor
# portion of the name. We always set it to "unknown".
sysctl="sysctl -n hw.machine_arch"
- UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+ UNAME_MACHINE_ARCH=$( (uname -p 2>/dev/null || \
"/sbin/$sysctl" 2>/dev/null || \
"/usr/sbin/$sysctl" 2>/dev/null || \
- echo unknown)`
+ echo unknown))
case "$UNAME_MACHINE_ARCH" in
+ aarch64eb) machine=aarch64_be-unknown ;;
armeb) machine=armeb-unknown ;;
arm*) machine=arm-unknown ;;
sh3el) machine=shl-unknown ;;
sh3eb) machine=sh-unknown ;;
sh5el) machine=sh5le-unknown ;;
earmv*)
- arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
- endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'`
+ arch=$(echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,')
+ endian=$(echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p')
machine="${arch}${endian}"-unknown
;;
*) machine="$UNAME_MACHINE_ARCH"-unknown ;;
@@ -199,7 +202,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
os=netbsdelf
;;
arm*|i386|m68k|ns32k|sh3*|sparc|vax)
- eval "$set_cc_for_build"
+ set_cc_for_build
if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
| grep -q __ELF__
then
@@ -218,7 +221,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
case "$UNAME_MACHINE_ARCH" in
earm*)
expr='s/^earmv[0-9]/-eabi/;s/eb$//'
- abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"`
+ abi=$(echo "$UNAME_MACHINE_ARCH" | sed -e "$expr")
;;
esac
# The OS release
@@ -231,24 +234,24 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
release='-gnu'
;;
*)
- release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2`
+ release=$(echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2)
;;
esac
# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
# contains redundant information, the shorter form:
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
- echo "$machine-${os}${release}${abi}"
+ echo "$machine-${os}${release}${abi-}"
exit ;;
*:Bitrig:*:*)
- UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+ UNAME_MACHINE_ARCH=$(arch | sed 's/Bitrig.//')
echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE"
exit ;;
*:OpenBSD:*:*)
- UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ UNAME_MACHINE_ARCH=$(arch | sed 's/OpenBSD.//')
echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE"
exit ;;
*:LibertyBSD:*:*)
- UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
+ UNAME_MACHINE_ARCH=$(arch | sed 's/^.*BSD\.//')
echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE"
exit ;;
*:MidnightBSD:*:*)
@@ -260,6 +263,9 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
*:SolidBSD:*:*)
echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE"
exit ;;
+ *:OS108:*:*)
+ echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE"
+ exit ;;
macppc:MirBSD:*:*)
echo powerpc-unknown-mirbsd"$UNAME_RELEASE"
exit ;;
@@ -269,26 +275,29 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
*:Sortix:*:*)
echo "$UNAME_MACHINE"-unknown-sortix
exit ;;
+ *:Twizzler:*:*)
+ echo "$UNAME_MACHINE"-unknown-twizzler
+ exit ;;
*:Redox:*:*)
echo "$UNAME_MACHINE"-unknown-redox
exit ;;
mips:OSF1:*.*)
- echo mips-dec-osf1
- exit ;;
+ echo mips-dec-osf1
+ exit ;;
alpha:OSF1:*:*)
case $UNAME_RELEASE in
*4.0)
- UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $3}')
;;
*5.*)
- UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $4}')
;;
esac
# According to Compaq, /usr/sbin/psrinfo has been available on
# OSF/1 and Tru64 systems produced since 1995. I hope that
# covers most systems running today. This code pipes the CPU
# types through head -n 1, so we only detect the type of CPU 0.
- ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ ALPHA_CPU_TYPE=$(/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1)
case "$ALPHA_CPU_TYPE" in
"EV4 (21064)")
UNAME_MACHINE=alpha ;;
@@ -326,7 +335,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
# A Tn.n version is a released field test version.
# A Xn.n version is an unreleased experimental baselevel.
# 1.2 uses "1.2" for uname -r.
- echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`"
+ echo "$UNAME_MACHINE"-dec-osf"$(echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz)"
# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
exitcode=$?
trap '' 0
@@ -360,7 +369,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
exit ;;
Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
- if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ if test "$( (/bin/universe) 2>/dev/null)" = att ; then
echo pyramid-pyramid-sysv3
else
echo pyramid-pyramid-bsd
@@ -373,28 +382,28 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
echo sparc-icl-nx6
exit ;;
DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
- case `/usr/bin/uname -p` in
+ case $(/usr/bin/uname -p) in
sparc) echo sparc-icl-nx7; exit ;;
esac ;;
s390x:SunOS:*:*)
- echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`"
+ echo "$UNAME_MACHINE"-ibm-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')"
exit ;;
sun4H:SunOS:5.*:*)
- echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
+ echo sparc-hal-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
exit ;;
sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
- echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`"
+ echo sparc-sun-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')"
exit ;;
i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
echo i386-pc-auroraux"$UNAME_RELEASE"
exit ;;
i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
- eval "$set_cc_for_build"
+ set_cc_for_build
SUN_ARCH=i386
# If there is a compiler, see if it is configured for 64-bit objects.
# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
# This test works for both compilers.
- if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
+ if test "$CC_FOR_BUILD" != no_compiler_found; then
if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
grep IS_64BIT_ARCH >/dev/null
@@ -402,30 +411,30 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
SUN_ARCH=x86_64
fi
fi
- echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
+ echo "$SUN_ARCH"-pc-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
exit ;;
sun4*:SunOS:6*:*)
# According to config.sub, this is the proper way to canonicalize
# SunOS6. Hard to guess exactly what SunOS6 will be like, but
# it's likely to be more like Solaris than SunOS4.
- echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
+ echo sparc-sun-solaris3"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
exit ;;
sun4*:SunOS:*:*)
- case "`/usr/bin/arch -k`" in
+ case "$(/usr/bin/arch -k)" in
Series*|S4*)
- UNAME_RELEASE=`uname -v`
+ UNAME_RELEASE=$(uname -v)
;;
esac
# Japanese Language versions have a version number like `4.1.3-JL'.
- echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`"
+ echo sparc-sun-sunos"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/')"
exit ;;
sun3*:SunOS:*:*)
echo m68k-sun-sunos"$UNAME_RELEASE"
exit ;;
sun*:*:4.2BSD:*)
- UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ UNAME_RELEASE=$( (sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null)
test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3
- case "`/bin/arch`" in
+ case "$(/bin/arch)" in
sun3)
echo m68k-sun-sunos"$UNAME_RELEASE"
;;
@@ -482,7 +491,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
echo clipper-intergraph-clix"$UNAME_RELEASE"
exit ;;
mips:*:*:UMIPS | mips:*:*:RISCos)
- eval "$set_cc_for_build"
+ set_cc_for_build
sed 's/^ //' << EOF > "$dummy.c"
#ifdef __cplusplus
#include <stdio.h> /* for printf() prototype */
@@ -505,8 +514,8 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
}
EOF
$CC_FOR_BUILD -o "$dummy" "$dummy.c" &&
- dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` &&
- SYSTEM_NAME=`"$dummy" "$dummyarg"` &&
+ dummyarg=$(echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p') &&
+ SYSTEM_NAME=$("$dummy" "$dummyarg") &&
{ echo "$SYSTEM_NAME"; exit; }
echo mips-mips-riscos"$UNAME_RELEASE"
exit ;;
@@ -533,11 +542,11 @@ EOF
exit ;;
AViiON:dgux:*:*)
# DG/UX returns AViiON for all architectures
- UNAME_PROCESSOR=`/usr/bin/uname -p`
- if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ]
+ UNAME_PROCESSOR=$(/usr/bin/uname -p)
+ if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110
then
- if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \
- [ "$TARGET_BINARY_INTERFACE"x = x ]
+ if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \
+ test "$TARGET_BINARY_INTERFACE"x = x
then
echo m88k-dg-dgux"$UNAME_RELEASE"
else
@@ -561,17 +570,17 @@ EOF
echo m68k-tektronix-bsd
exit ;;
*:IRIX*:*:*)
- echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`"
+ echo mips-sgi-irix"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/g')"
exit ;;
????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
- exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ exit ;; # Note that: echo "'$(uname -s)'" gives 'AIX '
i*86:AIX:*:*)
echo i386-ibm-aix
exit ;;
ia64:AIX:*:*)
- if [ -x /usr/bin/oslevel ] ; then
- IBM_REV=`/usr/bin/oslevel`
+ if test -x /usr/bin/oslevel ; then
+ IBM_REV=$(/usr/bin/oslevel)
else
IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
fi
@@ -579,7 +588,7 @@ EOF
exit ;;
*:AIX:2:3)
if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
- eval "$set_cc_for_build"
+ set_cc_for_build
sed 's/^ //' << EOF > "$dummy.c"
#include <sys/systemcfg.h>
@@ -591,7 +600,7 @@ EOF
exit(0);
}
EOF
- if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"`
+ if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy")
then
echo "$SYSTEM_NAME"
else
@@ -604,15 +613,15 @@ EOF
fi
exit ;;
*:AIX:*:[4567])
- IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ IBM_CPU_ID=$(/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }')
if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then
IBM_ARCH=rs6000
else
IBM_ARCH=powerpc
fi
- if [ -x /usr/bin/lslpp ] ; then
- IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
- awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
+ if test -x /usr/bin/lslpp ; then
+ IBM_REV=$(/usr/bin/lslpp -Lqc bos.rte.libc |
+ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/)
else
IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
fi
@@ -640,14 +649,14 @@ EOF
echo m68k-hp-bsd4.4
exit ;;
9000/[34678]??:HP-UX:*:*)
- HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'`
+ HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//')
case "$UNAME_MACHINE" in
9000/31?) HP_ARCH=m68000 ;;
9000/[34]??) HP_ARCH=m68k ;;
9000/[678][0-9][0-9])
- if [ -x /usr/bin/getconf ]; then
- sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
- sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ if test -x /usr/bin/getconf; then
+ sc_cpu_version=$(/usr/bin/getconf SC_CPU_VERSION 2>/dev/null)
+ sc_kernel_bits=$(/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null)
case "$sc_cpu_version" in
523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
@@ -659,8 +668,8 @@ EOF
esac ;;
esac
fi
- if [ "$HP_ARCH" = "" ]; then
- eval "$set_cc_for_build"
+ if test "$HP_ARCH" = ""; then
+ set_cc_for_build
sed 's/^ //' << EOF > "$dummy.c"
#define _HPUX_SOURCE
@@ -694,13 +703,13 @@ EOF
exit (0);
}
EOF
- (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"`
+ (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=$("$dummy")
test -z "$HP_ARCH" && HP_ARCH=hppa
fi ;;
esac
- if [ "$HP_ARCH" = hppa2.0w ]
+ if test "$HP_ARCH" = hppa2.0w
then
- eval "$set_cc_for_build"
+ set_cc_for_build
# hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
# 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
@@ -722,11 +731,11 @@ EOF
echo "$HP_ARCH"-hp-hpux"$HPUX_REV"
exit ;;
ia64:HP-UX:*:*)
- HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'`
+ HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//')
echo ia64-hp-hpux"$HPUX_REV"
exit ;;
3050*:HI-UX:*:*)
- eval "$set_cc_for_build"
+ set_cc_for_build
sed 's/^ //' << EOF > "$dummy.c"
#include <unistd.h>
int
@@ -752,7 +761,7 @@ EOF
exit (0);
}
EOF
- $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` &&
+ $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy") &&
{ echo "$SYSTEM_NAME"; exit; }
echo unknown-hitachi-hiuxwe2
exit ;;
@@ -772,7 +781,7 @@ EOF
echo hppa1.0-hp-osf
exit ;;
i*86:OSF1:*:*)
- if [ -x /usr/sbin/sysversion ] ; then
+ if test -x /usr/sbin/sysversion ; then
echo "$UNAME_MACHINE"-unknown-osf1mk
else
echo "$UNAME_MACHINE"-unknown-osf1
@@ -821,14 +830,14 @@ EOF
echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
exit ;;
F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
- FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
- FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
- FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'`
+ FUJITSU_PROC=$(uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz)
+ FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///')
+ FUJITSU_REL=$(echo "$UNAME_RELEASE" | sed -e 's/ /_/')
echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
exit ;;
5000:UNIX_System_V:4.*:*)
- FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
- FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
+ FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///')
+ FUJITSU_REL=$(echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/')
echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
exit ;;
i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
@@ -840,15 +849,26 @@ EOF
*:BSD/OS:*:*)
echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE"
exit ;;
+ arm:FreeBSD:*:*)
+ UNAME_PROCESSOR=$(uname -p)
+ set_cc_for_build
+ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_PCS_VFP
+ then
+ echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabi
+ else
+ echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabihf
+ fi
+ exit ;;
*:FreeBSD:*:*)
- UNAME_PROCESSOR=`/usr/bin/uname -p`
+ UNAME_PROCESSOR=$(/usr/bin/uname -p)
case "$UNAME_PROCESSOR" in
amd64)
UNAME_PROCESSOR=x86_64 ;;
i386)
UNAME_PROCESSOR=i586 ;;
esac
- echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`"
+ echo "$UNAME_PROCESSOR"-unknown-freebsd"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')"
exit ;;
i*:CYGWIN*:*)
echo "$UNAME_MACHINE"-pc-cygwin
@@ -881,21 +901,21 @@ EOF
echo "$UNAME_MACHINE"-pc-uwin
exit ;;
amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
- echo x86_64-unknown-cygwin
+ echo x86_64-pc-cygwin
exit ;;
prep*:SunOS:5.*:*)
- echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
+ echo powerpcle-unknown-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
exit ;;
*:GNU:*:*)
# the GNU system
- echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`"
+ echo "$(echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,')-unknown-$LIBC$(echo "$UNAME_RELEASE"|sed -e 's,/.*$,,')"
exit ;;
*:GNU/*:*:*)
# other systems with GNU libc and userland
- echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC"
+ echo "$UNAME_MACHINE-unknown-$(echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]")$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')-$LIBC"
exit ;;
- i*86:Minix:*:*)
- echo "$UNAME_MACHINE"-pc-minix
+ *:Minix:*:*)
+ echo "$UNAME_MACHINE"-unknown-minix
exit ;;
aarch64:Linux:*:*)
echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
@@ -905,7 +925,7 @@ EOF
echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
exit ;;
alpha:Linux:*:*)
- case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+ case $(sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null) in
EV5) UNAME_MACHINE=alphaev5 ;;
EV56) UNAME_MACHINE=alphaev56 ;;
PCA56) UNAME_MACHINE=alphapca56 ;;
@@ -922,7 +942,7 @@ EOF
echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
exit ;;
arm*:Linux:*:*)
- eval "$set_cc_for_build"
+ set_cc_for_build
if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
| grep -q __ARM_EABI__
then
@@ -971,23 +991,51 @@ EOF
echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
exit ;;
mips:Linux:*:* | mips64:Linux:*:*)
- eval "$set_cc_for_build"
+ set_cc_for_build
+ IS_GLIBC=0
+ test x"${LIBC}" = xgnu && IS_GLIBC=1
sed 's/^ //' << EOF > "$dummy.c"
#undef CPU
- #undef ${UNAME_MACHINE}
- #undef ${UNAME_MACHINE}el
+ #undef mips
+ #undef mipsel
+ #undef mips64
+ #undef mips64el
+ #if ${IS_GLIBC} && defined(_ABI64)
+ LIBCABI=gnuabi64
+ #else
+ #if ${IS_GLIBC} && defined(_ABIN32)
+ LIBCABI=gnuabin32
+ #else
+ LIBCABI=${LIBC}
+ #endif
+ #endif
+
+ #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+ CPU=mipsisa64r6
+ #else
+ #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+ CPU=mipsisa32r6
+ #else
+ #if defined(__mips64)
+ CPU=mips64
+ #else
+ CPU=mips
+ #endif
+ #endif
+ #endif
+
#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
- CPU=${UNAME_MACHINE}el
+ MIPS_ENDIAN=el
#else
#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
- CPU=${UNAME_MACHINE}
+ MIPS_ENDIAN=
#else
- CPU=
+ MIPS_ENDIAN=
#endif
#endif
EOF
- eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`"
- test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; }
+ eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI')"
+ test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; }
;;
mips64el:Linux:*:*)
echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
@@ -1006,7 +1054,7 @@ EOF
exit ;;
parisc:Linux:*:* | hppa:Linux:*:*)
# Look for CPU level
- case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ case $(grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2) in
PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;;
PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;;
*) echo hppa-unknown-linux-"$LIBC" ;;
@@ -1046,7 +1094,17 @@ EOF
echo "$UNAME_MACHINE"-dec-linux-"$LIBC"
exit ;;
x86_64:Linux:*:*)
- echo "$UNAME_MACHINE"-pc-linux-"$LIBC"
+ set_cc_for_build
+ LIBCABI=$LIBC
+ if test "$CC_FOR_BUILD" != no_compiler_found; then
+ if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_X32 >/dev/null
+ then
+ LIBCABI="$LIBC"x32
+ fi
+ fi
+ echo "$UNAME_MACHINE"-pc-linux-"$LIBCABI"
exit ;;
xtensa*:Linux:*:*)
echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
@@ -1086,7 +1144,7 @@ EOF
echo "$UNAME_MACHINE"-pc-msdosdjgpp
exit ;;
i*86:*:4.*:*)
- UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'`
+ UNAME_REL=$(echo "$UNAME_RELEASE" | sed 's/\/MP$//')
if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL"
else
@@ -1095,19 +1153,19 @@ EOF
exit ;;
i*86:*:5:[678]*)
# UnixWare 7.x, OpenUNIX and OpenServer 6.
- case `/bin/uname -X | grep "^Machine"` in
+ case $(/bin/uname -X | grep "^Machine") in
*486*) UNAME_MACHINE=i486 ;;
*Pentium) UNAME_MACHINE=i586 ;;
*Pent*|*Celeron) UNAME_MACHINE=i686 ;;
esac
- echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}"
+ echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}"
exit ;;
i*86:*:3.2:*)
if test -f /usr/options/cb.name; then
- UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ UNAME_REL=$(sed -n 's/.*Version //p' </usr/options/cb.name)
echo "$UNAME_MACHINE"-pc-isc"$UNAME_REL"
elif /bin/uname -X 2>/dev/null >/dev/null ; then
- UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ UNAME_REL=$( (/bin/uname -X|grep Release|sed -e 's/.*= //'))
(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
&& UNAME_MACHINE=i586
@@ -1157,7 +1215,7 @@ EOF
3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
OS_REL=''
test -r /etc/.relid \
- && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ && OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid)
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
&& { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
@@ -1168,7 +1226,7 @@ EOF
NCR*:*:4.2:* | MPRAS*:*:4.2:*)
OS_REL='.3'
test -r /etc/.relid \
- && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ && OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid)
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
&& { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
@@ -1201,7 +1259,7 @@ EOF
exit ;;
*:SINIX-*:*:*)
if uname -p 2>/dev/null >/dev/null ; then
- UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ UNAME_MACHINE=$( (uname -p) 2>/dev/null)
echo "$UNAME_MACHINE"-sni-sysv4
else
echo ns32k-sni-sysv
@@ -1235,7 +1293,7 @@ EOF
echo mips-sony-newsos6
exit ;;
R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
- if [ -d /usr/nec ]; then
+ if test -d /usr/nec; then
echo mips-nec-sysv"$UNAME_RELEASE"
else
echo mips-unknown-sysv"$UNAME_RELEASE"
@@ -1283,44 +1341,48 @@ EOF
*:Rhapsody:*:*)
echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE"
exit ;;
+ arm64:Darwin:*:*)
+ echo aarch64-apple-darwin"$UNAME_RELEASE"
+ exit ;;
*:Darwin:*:*)
- UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
- eval "$set_cc_for_build"
- if test "$UNAME_PROCESSOR" = unknown ; then
- UNAME_PROCESSOR=powerpc
+ UNAME_PROCESSOR=$(uname -p)
+ case $UNAME_PROCESSOR in
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ if command -v xcode-select > /dev/null 2> /dev/null && \
+ ! xcode-select --print-path > /dev/null 2> /dev/null ; then
+ # Avoid executing cc if there is no toolchain installed as
+ # cc will be a stub that puts up a graphical alert
+ # prompting the user to install developer tools.
+ CC_FOR_BUILD=no_compiler_found
+ else
+ set_cc_for_build
fi
- if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then
- if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
- if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
- (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_64BIT_ARCH >/dev/null
- then
- case $UNAME_PROCESSOR in
- i386) UNAME_PROCESSOR=x86_64 ;;
- powerpc) UNAME_PROCESSOR=powerpc64 ;;
- esac
- fi
- # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
- if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
- (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_PPC >/dev/null
- then
- UNAME_PROCESSOR=powerpc
- fi
+ if test "$CC_FOR_BUILD" != no_compiler_found; then
+ if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ case $UNAME_PROCESSOR in
+ i386) UNAME_PROCESSOR=x86_64 ;;
+ powerpc) UNAME_PROCESSOR=powerpc64 ;;
+ esac
+ fi
+ # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
+ if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_PPC >/dev/null
+ then
+ UNAME_PROCESSOR=powerpc
fi
elif test "$UNAME_PROCESSOR" = i386 ; then
- # Avoid executing cc on OS X 10.9, as it ships with a stub
- # that puts up a graphical alert prompting to install
- # developer tools. Any system running Mac OS X 10.7 or
- # later (Darwin 11 and later) is required to have a 64-bit
- # processor. This is not true of the ARM version of Darwin
- # that Apple uses in portable devices.
- UNAME_PROCESSOR=x86_64
+ # uname -m returns i386 or x86_64
+ UNAME_PROCESSOR=$UNAME_MACHINE
fi
echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE"
exit ;;
*:procnto*:*:* | *:QNX:[0123456789]*:*)
- UNAME_PROCESSOR=`uname -p`
+ UNAME_PROCESSOR=$(uname -p)
if test "$UNAME_PROCESSOR" = x86; then
UNAME_PROCESSOR=i386
UNAME_MACHINE=pc
@@ -1358,6 +1420,7 @@ EOF
# "uname -m" is not consistent, so use $cputype instead. 386
# is converted to i386 for consistency with other x86
# operating systems.
+ # shellcheck disable=SC2154
if test "$cputype" = 386; then
UNAME_MACHINE=i386
else
@@ -1387,10 +1450,10 @@ EOF
echo mips-sei-seiux"$UNAME_RELEASE"
exit ;;
*:DragonFly:*:*)
- echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`"
+ echo "$UNAME_MACHINE"-unknown-dragonfly"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')"
exit ;;
*:*VMS:*:*)
- UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ UNAME_MACHINE=$( (uname -p) 2>/dev/null)
case "$UNAME_MACHINE" in
A*) echo alpha-dec-vms ; exit ;;
I*) echo ia64-dec-vms ; exit ;;
@@ -1400,7 +1463,7 @@ EOF
echo i386-pc-xenix
exit ;;
i*86:skyos:*:*)
- echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`"
+ echo "$UNAME_MACHINE"-pc-skyos"$(echo "$UNAME_RELEASE" | sed -e 's/ .*$//')"
exit ;;
i*86:rdos:*:*)
echo "$UNAME_MACHINE"-pc-rdos
@@ -1414,8 +1477,148 @@ EOF
amd64:Isilon\ OneFS:*:*)
echo x86_64-unknown-onefs
exit ;;
+ *:Unleashed:*:*)
+ echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE"
+ exit ;;
esac
+# No uname command or uname output not recognized.
+set_cc_for_build
+cat > "$dummy.c" <<EOF
+#ifdef _SEQUENT_
+#include <sys/types.h>
+#include <sys/utsname.h>
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#include <signal.h>
+#if defined(_SIZE_T_) || defined(SIGLOST)
+#include <sys/utsname.h>
+#endif
+#endif
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=$( (hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null);
+ if (version < 4)
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ else
+ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+#include <sys/param.h>
+#if defined (BSD)
+#if BSD == 43
+ printf ("vax-dec-bsd4.3\n"); exit (0);
+#else
+#if BSD == 199006
+ printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#else
+ printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#endif
+#else
+ printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#else
+#if defined(_SIZE_T_) || defined(SIGLOST)
+ struct utsname un;
+ uname (&un);
+ printf ("vax-dec-ultrix%s\n", un.release); exit (0);
+#else
+ printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#if defined(_SIZE_T_) || defined(SIGLOST)
+ struct utsname *un;
+ uname (&un);
+ printf ("mips-dec-ultrix%s\n", un.release); exit (0);
+#else
+ printf ("mips-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=$($dummy) &&
+ { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; }
+
echo "$0: unable to guess system type" >&2
case "$UNAME_MACHINE:$UNAME_SYSTEM" in
@@ -1438,6 +1641,12 @@ copies of config.guess and config.sub with the latest versions from:
https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
and
https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
+EOF
+
+year=$(echo $timestamp | sed 's,-.*,,')
+# shellcheck disable=SC2003
+if test "$(expr "$(date +%Y)" - "$year")" -lt 3 ; then
+ cat >&2 <<EOF
If $0 has already been updated, send the following data and any
information you think might be pertinent to config-patches@gnu.org to
@@ -1445,26 +1654,27 @@ provide the necessary information to handle your system.
config.guess timestamp = $timestamp
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
+uname -m = $( (uname -m) 2>/dev/null || echo unknown)
+uname -r = $( (uname -r) 2>/dev/null || echo unknown)
+uname -s = $( (uname -s) 2>/dev/null || echo unknown)
+uname -v = $( (uname -v) 2>/dev/null || echo unknown)
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
-/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+/usr/bin/uname -p = $( (/usr/bin/uname -p) 2>/dev/null)
+/bin/uname -X = $( (/bin/uname -X) 2>/dev/null)
-hostinfo = `(hostinfo) 2>/dev/null`
-/bin/universe = `(/bin/universe) 2>/dev/null`
-/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
-/bin/arch = `(/bin/arch) 2>/dev/null`
-/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+hostinfo = $( (hostinfo) 2>/dev/null)
+/bin/universe = $( (/bin/universe) 2>/dev/null)
+/usr/bin/arch -k = $( (/usr/bin/arch -k) 2>/dev/null)
+/bin/arch = $( (/bin/arch) 2>/dev/null)
+/usr/bin/oslevel = $( (/usr/bin/oslevel) 2>/dev/null)
+/usr/convex/getsysinfo = $( (/usr/convex/getsysinfo) 2>/dev/null)
UNAME_MACHINE = "$UNAME_MACHINE"
UNAME_RELEASE = "$UNAME_RELEASE"
UNAME_SYSTEM = "$UNAME_SYSTEM"
UNAME_VERSION = "$UNAME_VERSION"
EOF
+fi
exit 1
diff --git a/config.h-vms b/config.h-vms
deleted file mode 100644
index 7a30b19..0000000
--- a/config.h-vms
+++ /dev/null
@@ -1,284 +0,0 @@
-/* This is a config.h file that has been pregenerated (from config.h.in)
- * with settings that are correct for VMS.
- */
-
-
-
-/* config.h.in --- xscreensaver, Copyright (c) 1998 Jamie Zawinski.
- *
- * The best way to set these parameters is by running the included `configure'
- * script. That examines your system, and generates `config.h' from
- * `config.h.in'.
- *
- * If something goes very wrong, you can edit `config.h' directly, but beware
- * that your changes will be lost if you ever run `configure' again.
- */
-
-
-/* *************************************************************************
- CONFIGURING SERVER EXTENSIONS
- ************************************************************************* */
-
-/* Define this if you have the XReadDisplay extension (I think this is an
- SGI-only thing; it's in <X11/extensions/readdisplay.h>.) A few of the
- screenhacks will take advantage of this if it's available.
- */
-#undef HAVE_READ_DISPLAY_EXTENSION
-
-/* Define this if you have the Iris Video Library (dmedia/vl.h on SGI.)
- A few of the screenhacks will take advantage of this if it's available.
- */
-#undef HAVE_SGI_VIDEO
-
-/* Define this if you have the XHPDisableReset function (an HP only thing.)
- */
-#undef HAVE_XHPDISABLERESET
-
-/* First, some background: there are three distinct server extensions which
- * are useful to a screen saver program: they are XIDLE, MIT-SCREEN-SAVER,
- * and SCREEN_SAVER.
- *
- * The XIDLE extension resides in .../contrib/extensions/xidle/ on the X11R5
- * contrib tape. This extension lets the client get accurate idle-time
- * information from the X server in a potentially more reliable way than by
- * simply watching for keyboard and mouse activity. However, the XIDLE
- * extension has apparently not been ported to X11R6.
- *
- * The SCREEN_SAVER extension is found (as far as I know) only in the SGI
- * X server, and it exists in all releases since (at least) Irix 5. The
- * relevant header file is /usr/include/X11/extensions/XScreenSaver.h.
- *
- * The similarly-named MIT-SCREEN-SAVER extension came into existence long
- * after the SGI SCREEN_SAVER extension was already in use, and resides in
- * .../contrib/extensions/screensaver/ on the X11R6 contrib tape. It is
- * also found in certain recent X servers built in to NCD X terminals.
- *
- * The MIT extension does basically the same thing that the XIDLE extension
- * does, but there are two things wrong with it: first, because of the way
- * the extension was designed, the `fade' option to XScreenSaver will be
- * uglier: just before the screen fades out, there will be an unattractive
- * flicker to black, because this extension blanks the screen *before*
- * telling us that it is time to do so. Second, this extension is known to
- * be buggy; on the systems I use, it works, but some people have reported
- * X server crashes as a result of using it. XScreenSaver uses this
- * extension rather conservatively, because when I tried to use any of its
- * more complicated features, I could get it to crash the server at the
- * drop of a hat.
- *
- * In short, the MIT-SCREEN-SAVER extension is a piece of junk. The older
- * SGI SCREEN_SAVER extension works great, as does XIDLE. It would be nice
- * If those two existed on more systems, that is, would be adopted by the
- * X Consortium in favor of their inferior "not-invented-here" entry.
- */
-
-/* Define this if you have the XIDLE extension installed. If you have the
- * XIDLE extension, this is recommended. (You have this extension if the
- * file /usr/include/X11/extensions/xidle.h exists.) Turning on this flag
- * lets XScreenSaver work better with servers which support this extension;
- * but it will still work with servers which do not suport it, so it's a good
- * idea to compile in support for it if you can.
- */
-#undef HAVE_XIDLE_EXTENSION
-
-/* Define this if you have the MIT-SCREEN-SAVER extension installed. See the
- * caveats about this extension, above. (It's available if the file
- * /usr/include/X11/extensions/scrnsaver.h exists.)
- */
-#undef HAVE_MIT_SAVER_EXTENSION
-
-/* Define this if you have the SGI SCREEN_SAVER extension. This is standard
- * on Irix systems, and not available elsewhere.
- */
-#undef HAVE_SGI_SAVER_EXTENSION
-
-/* Define this if you have the SGI-VIDEO-CONTROL extension. This is standard
- * on Irix systems, and not available elsewhere.
- */
-#undef HAVE_SGI_VC_EXTENSION
-
-/* Define this if you have the XDPMS extension. This is standard on
- * sufficiently-recent XFree86 systems, and possibly elsewhere. (It's
- * available if the file /usr/include/X11/extensions/dpms.h exists.)
- */
-#define HAVE_DPMS_EXTENSION 1
-
-
-/* *************************************************************************
- CONFIGURING GRAPHICS TOOLKITS
- ************************************************************************* */
-
-/* Define this if you have Motif.
- */
-#define HAVE_MOTIF 1
-
-/* Define this if you have the XmComboBox Motif widget (Motif 2.0.)
- */
-#undef HAVE_XMCOMBOBOX
-
-/* Define this if you have the XPM library installed. Some of the demos can
- * make use of this if it is available.
- */
-#define HAVE_XPM 1
-
-/* Define this if you have the Xmu library. This is standard part of X, and
- * if your vendor doesn't ship it, you should report that as a bug.
- */
-#define HAVE_XMU 1
-
-/* Define this if you have OpenGL. Some of the demos require it, so if you
- * don't have it, then those particular demos won't be built. (This won't
- * affect the screen saver as a whole.)
- */
-#undef HAVE_GL
-
-/* Define this if you have OpenGL, but it's the MesaGL variant. (The
- libraries have different names.) (HAVE_GL should be defined too.)
- */
-#undef HAVE_MESA_GL
-
-/* Define this if your version of OpenGL has the glBindTexture() routine.
- This is the case for OpenGL 1.1, but not for OpenGL 1.0.
- */
-#undef HAVE_GLBINDTEXTURE
-
-/* Define this if you have the X Shared Memory Extension.
- */
-#undef HAVE_XSHM_EXTENSION
-
-
-/* *************************************************************************
- CONFIGURING PASSWORD AUTHENTICATION
- ************************************************************************* */
-
-/* Define this to remove the option of locking the screen at all.
- */
-#undef NO_LOCKING
-
-/* Define this if you want to use Kerberos authentication to lock/unlock the
- * screen instead of your local password. This currently uses Kerberos V4,
- * but a V5 server with V4 compatibility will work. WARNING: DO NOT USE AFS
- * string-to-key passwords with this option. This option currently *only*
- * works with standard Kerberos des_string_to_key. If your password is an
- * AFS password and not a kerberos password, it will not authenticate
- * properly. See the comments in driver/kpasswd.c for more information if you
- * need it.
- */
-#undef HAVE_KERBEROS
-
-
-/* Define this if your system uses `shadow' passwords, that is, the passwords
- * live in /etc/shadow instead of /etc/passwd, and one reads them with
- * getspnam() instead of getpwnam(). (Note that SCO systems do some random
- * other thing; others might as well. See the ifdefs in driver/passwd.c if
- * you're having trouble related to reading passwords.)
- */
-#undef HAVE_SHADOW_PASSWD
-
-/* Define this if your system is Digital or SCO Unix with so-called ``Enhanced
- Security'', that is, the passwords live in /tcb/files/auth/<x>/<xyz>
- instead of in /etc/passwd, and one reads them with getprpwnam() instead
- of getpwnam().
- */
-#undef HAVE_ENHANCED_PASSWD
-
-/* Define this if your system is Solaris with ``adjunct'' passwords (this is
- the version where one gets at the passwords with getpwanam() instead of
- getpwnam().) I haven't tested this one, let me know if it works.
- */
-#undef HAVE_ADJUNCT_PASSWD
-
-/* Define this if you are running HPUX with so-called ``Secure Passwords''
- (if you have /usr/include/hpsecurity.h, you probably have this.) I
- haven't tested this one, let me know if it works.
- */
-#undef HAVE_HPUX_PASSWD
-
-/* Define this if you are on a system that supports the VT_LOCKSWITCH and
- VT_UNLOCKSWITCH ioctls. If this is defined, then when the screen is
- locked, switching to another virtual terminal will also be prevented.
- That is, the whole console will be locked, rather than just the VT on
- which X is running.
- */
-#define HAVE_VT_LOCKSWITCH 1
-
-
-/* *************************************************************************
- OTHER C ENVIRONMENT JUNK
- ************************************************************************* */
-
-/* Define this to void* if you're using X11R4 or earlier. */
-#undef XPointer
-
-/* Define if you have the nice function. */
-#undef HAVE_NICE
-
-/* Define if you have the setpriority function. */
-#undef HAVE_SETPRIORITY
-
-/* Define to empty if the keyword does not work. */
-#undef const
-
-/* Define if you have <sys/wait.h> that is POSIX.1 compatible. */
-#undef HAVE_SYS_WAIT_H
-
-/* Define as __inline if that's what the C compiler calls it. */
-#undef inline
-
-/* Define to `int' if <sys/types.h> doesn't define. */
-#undef mode_t
-
-/* Define to `int' if <sys/types.h> doesn't define. */
-#undef pid_t
-
-/* Define as the return type of signal handlers (int or void). */
-#define RETSIGTYPE void
-
-/* Define to `unsigned' if <sys/types.h> doesn't define. */
-#undef size_t
-
-/* Define if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Define if you can safely include both <sys/time.h> and <time.h>. */
-#undef TIME_WITH_SYS_TIME
-
-/* Define if you have the gettimeofday function. */
-#undef HAVE_GETTIMEOFDAY
-
-/* Define if gettimeofday requires two arguments. */
-#undef GETTIMEOFDAY_TWO_ARGS
-
-/* Define if you have the putenv function. */
-#undef HAVE_PUTENV
-
-/* Define if you have the select function. */
-#undef HAVE_SELECT
-
-/* Define if you have the getcwd function. */
-#undef HAVE_GETCWD
-
-/* Define if you have the getcwd function. */
-#undef HAVE_GETWD
-
-/* Define if you have the uname function. */
-#undef HAVE_UNAME
-#if (__VMS_VER >= 70000000)
-# define HAVE_UNAME 1
-#endif
-
-/* Define if you have the fcntl function. */
-#undef HAVE_FCNTL
-
-/* Define if you have the sigaction function. */
-#undef HAVE_SIGACTION
-
-/* Define if you have the <unistd.h> header file. */
-#undef HAVE_UNISTD_H
-
-/* Define if you have the <crypt.h> header file. */
-#undef HAVE_CRYPT_H
-
-/* Define to use sigaction() instead of signal() for SIGCHLD-related activity.
- This is necessary at least on SCO OpenServer 5, due to a Unix kernel bug.
- */
-#undef USE_SIGACTION
diff --git a/config.h.in b/config.h.in
index 9f66b48..11a0ab9 100644
--- a/config.h.in
+++ b/config.h.in
@@ -1,37 +1,24 @@
-/* config.h.in. Generated from configure.in by autoheader. */
+/* config.h.in. Generated from configure.ac by autoheader. */
-/* config.h.in --- xscreensaver, Copyright (c) 1991-2014 Jamie Zawinski.
- *
- * The best way to set these parameters is by running the included `configure'
- * script. That examines your system, and generates `config.h' from
- * `config.h.in'.
- *
- * If something goes very wrong, you can edit `config.h' directly, but beware
- * that your changes will be lost if you ever run `configure' again.
+/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski.
+ * Generate this file by running 'configure' rather than editing it by hand.
*/
-/* Define this to allow the root password to unlock the screen. */
+/* Define this to allow root to unlock, when not using PAM. */
#undef ALLOW_ROOT_PASSWD
/* always defined to indicate that i18n is enabled */
#undef ENABLE_NLS
-/* Some screenhacks like to run an external program to generate random pieces
- of text; set this to the one you like. Note that this is just the default;
- X resources can be used to override it. */
-#undef FORTUNE_PROGRAM
-
/* This is the name of the gettext package to use. */
#undef GETTEXT_PACKAGE
-/* Define this if gettimeofday() takes two arguments. */
+/* Define this if gettimeofday takes two arguments. */
#undef GETTIMEOFDAY_TWO_ARGS
-/* Define this if your system is Solaris with ``adjunct'' passwords (this is
- the version where one gets at the passwords with getpwanam() instead of
- getpwnam().) I haven't tested this one, let me know if it works. */
+/* Define this for Solaris getpwanam. */
#undef HAVE_ADJUNCT_PASSWD
/* Define to 1 if you have the `bind_textdomain_codeset' function. */
@@ -46,12 +33,11 @@
#undef HAVE_CFPREFERENCESCOPYAPPVALUE
/* Define this if you have Gnome and want to build support for the
- xscreensaver control panel in the Gnome Control Center (gnomecc). (This is
- needed only with Gtk 1.x.) */
+ xscreensaver control panel in the Gtk 1.x Gnome Control Center. */
#undef HAVE_CRAPPLET
/* Define this if HAVE_CRAPPLET is defined, and the function
- capplet_widget_changes_are_immediate() is available. */
+ capplet_widget_changes_are_immediate is available. */
#undef HAVE_CRAPPLET_IMMEDIATE
/* Define to 1 if you have the <crypt.h> header file. */
@@ -67,26 +53,22 @@
/* Define this if you have the X Double Buffer Extension. */
#undef HAVE_DOUBLE_BUFFER_EXTENSION
-/* Define this if you have the XDPMS extension. This is standard on
- sufficiently-recent XFree86 systems, and possibly elsewhere. (It's
- available if the file /usr/include/X11/extensions/dpms.h exists.) */
+/* Define this if you have the XDPMS extension. */
#undef HAVE_DPMS_EXTENSION
-/* Define this if your system is Digital or SCO Unix with so-called ``Enhanced
- Security'', that is, the passwords live in /tcb/files/auth/<x>/<xyz>
- instead of in /etc/passwd, and one reads them with getprpwnam() instead of
- getpwnam(). */
+/* Define this if OpenGL bindings are via EGL instead of GLX. */
+#undef HAVE_EGL
+
+/* Define this for DEC/SCO "Enhanced Security" with getprpwnam. */
#undef HAVE_ENHANCED_PASSWD
/* Define to 1 if you have the `fcntl' function. */
#undef HAVE_FCNTL
-/* Define this if you have the 'forkpty' function: This allows 'phosphor' and
- 'apple2' to run curses-based programs, or be used as terminal windows. */
+/* Define this if you have forkpty. */
#undef HAVE_FORKPTY
-/* Define this if you have the GDK_Pixbuf library installed. Some of the demos
- can make use of this if it is available. */
+/* Define this if you have GDK_Pixbuf. */
#undef HAVE_GDK_PIXBUF
/* Define this if you have the gdk_pixbuf_apply_embedded_orientation function
@@ -99,73 +81,71 @@
/* Define to 1 if you have the `getcwd' function. */
#undef HAVE_GETCWD
-/* Define this if you have the getifaddrs() function. */
+/* Define this if you have getifaddrs. */
#undef HAVE_GETIFADDRS
/* Define if the GNU gettext() function is already present or preinstalled. */
#undef HAVE_GETTEXT
-/* Define this if you have the gettimeofday function. */
+/* Define this if you have gettimeofday. */
#undef HAVE_GETTIMEOFDAY
/* Define to 1 if you have the `getwd' function. */
#undef HAVE_GETWD
-/* Define this if you have OpenGL. Some of the demos require it, so if you
- don't have it, then those particular demos won't be built. (This won't
- affect the screen saver as a whole.) */
+/* Define this if you have OpenGL. */
#undef HAVE_GL
-/* Define this if your version of OpenGL has the glBindTexture() routine. This
- is the case for OpenGL 1.1, but not for OpenGL 1.0. */
+/* Define this if the OpenGL version is 1.1 or newer. */
#undef HAVE_GLBINDTEXTURE
-/* Define this if you have the -lgle and -lmatrix libraries (GL extrusion.) */
+/* Define this if you have the GL Extrusion library. */
#undef HAVE_GLE
-/* Define this if you have the -lgle from GLE version 3 */
+/* Define this if GL Extrusion is version 3. */
#undef HAVE_GLE3
-/* Define this if you have Gtk (any version.) */
+/* Define this if the native OpenGL library is OpenGLES 1.x. */
+#undef HAVE_GLES
+
+/* Define this if the native OpenGL library is OpenGLES 2.x. */
+#undef HAVE_GLES2
+
+/* Define this if the native OpenGL library is OpenGLES 3.x. */
+#undef HAVE_GLES3
+
+/* Define this if OpenGL supports the OpenGL Shading Language. */
+#undef HAVE_GLSL
+
+/* Define this if you have Gtk */
#undef HAVE_GTK
/* Define this if you have Gtk 2.x. */
#undef HAVE_GTK2
-/* Define this if you are running HPUX with so-called ``Secure Passwords'' (if
- you have /usr/include/hpsecurity.h, you probably have this.) I haven't
- tested this one, let me know if it works. */
+/* Define this for HPUX so-called "Secure Passwords". */
#undef HAVE_HPUX_PASSWD
-/* Define this if you do pings with a `struct icmp' and an `icmp_id' slot. */
+/* Define this if ping uses struct icmp.icmp_id. */
#undef HAVE_ICMP
-/* Define this if you do pings with a `struct icmphdr' and an `un.echo.id'
- slot. */
+/* Define this if ping uses struct icmphdr.un.echo.id. */
#undef HAVE_ICMPHDR
/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H
-/* Define this if you have the Independent JPEG Group's JPEG library
- installed. Some of the demos can make use of this if it is available. */
+/* Define this if you have the JPEG Group's JPEG library. */
#undef HAVE_JPEGLIB
-/* Define this to target the OpenGL ES 1.x API instead of OpenGL 1.3. */
+/* Define this to emulate OpenGL 1.3 in terms of OpenGLES 1.x. */
#undef HAVE_JWZGLES
/* Define this if you want to use Kerberos authentication to lock/unlock the
- screen instead of your local password. This currently uses Kerberos V4, but
- a V5 server with V4 compatibility will work. WARNING: DO NOT USE AFS
- string-to-key passwords with this option. This option currently *only*
- works with standard Kerberos des_string_to_key. If your password is an AFS
- password and not a kerberos password, it will not authenticate properly.
- See the comments in driver/kpasswd.c for more information if you need it.
- */
+ screen instead of PAM. */
#undef HAVE_KERBEROS
-/* Define this if you have Kerberos 5, meaning we need to use the Kerberos 4
- compatibility layer. */
+/* Define this if you have Kerberos 5. */
#undef HAVE_KERBEROS5
/* Define if your <locale.h> file defines LC_MESSAGES. */
@@ -174,9 +154,7 @@
/* Define this if your system has libcap. */
#undef HAVE_LIBCAP
-/* Define this if the Portable Network Graphics library is installed. It is
- basically required, but many things will more-or-less limp along without
- it. */
+/* Define this if you have the Portable Network Graphics library. */
#undef HAVE_LIBPNG
/* Define this if you have libsystemd. */
@@ -188,9 +166,10 @@
/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
-/* Define this if you have OpenGL, but it's the MesaGL variant. (The libraries
- have different names.) (HAVE_GL should be defined too.) */
-#undef HAVE_MESA_GL
+/* Using the MIT-SCREEN-SAVER extension means that the X server will crash at
+ random times, and fading and hysteresis won't work. Don't use this. You'll
+ be sorry. See comment in xscreensaver.c. */
+#undef HAVE_MIT_SAVER_EXTENSION
/* Define this if you have Motif. */
#undef HAVE_MOTIF
@@ -201,27 +180,26 @@
/* Define to 1 if you have the `nice' function. */
#undef HAVE_NICE
-/* Define this if you have the XML library headers in their old,
- non-namespaced location (you lack the gnome-xml/libxml symlink) */
+/* Define this if you the XML library headers lack the gnome-xml/libxml
+ symlink. */
#undef HAVE_OLD_XML_HEADERS
-/* Define this if you want to use PAM (Pluggable Authentication Modules) to
- lock/unlock the screen, instead of standard /etc/passwd authentication. */
+/* Define this if you have Pluggable Authentication Modules. */
#undef HAVE_PAM
-/* Define this if you have pam_fail_delay function. see driver/passwd-pam.c.
- */
+/* Define this if you have pam_fail_delay. */
#undef HAVE_PAM_FAIL_DELAY
/* Define this if you have a Linux-like /proc/interrupts file which can be
- examined to determine when keyboard activity has occurred. */
+ examined to determine when keyboard activity has occurred, and you use PS/2
+ input devices instead of USB. */
#undef HAVE_PROC_INTERRUPTS
/* Define this if you have a Linux-like /proc/.../oom_score_adj file which can
- be adjusted by root to exempt us from the out-of-memory . */
+ be adjusted by root to exempt us from the out-of-memory killer. */
#undef HAVE_PROC_OOM
-/* Define this if your system supports POSIX threads. */
+/* Define this if you have POSIX threads. */
#undef HAVE_PTHREAD
/* Have PTHREAD_PRIO_INHERIT. */
@@ -233,17 +211,16 @@
/* Define to 1 if you have the `putenv' function. */
#undef HAVE_PUTENV
-/* Define this if you have the Resize and Rotate extension. This is standard
- on sufficiently-recent XFree86 systems, and possibly elsewhere. (It's
- available if the file /usr/include/X11/extensions/Xrandr.h exists.) */
+/* Define this if your system uses getpwnam_shadow. */
+#undef HAVE_PWNAM_SHADOW_PASSWD
+
+/* Define this if you have the Resize and Rotate extension. */
#undef HAVE_RANDR
/* Define this if the RANDR library is version 1.2 or newer. */
#undef HAVE_RANDR_12
-/* Define this if you have the XReadDisplay extension (I think this is an
- SGI-only thing; it's in <X11/extensions/readdisplay.h>.) A few of the
- screenhacks will take advantage of this if it's available. */
+/* Define this if you have the SGI XReadDisplay extension. */
#undef HAVE_READ_DISPLAY_EXTENSION
/* Define to 1 if you have the `realpath' function. */
@@ -267,11 +244,13 @@
/* Define to 1 if you have the `setrlimit' function. */
#undef HAVE_SETRLIMIT
-/* Define this if your system uses 'shadow' passwords, that is, the passwords
- live in /etc/shadow instead of /etc/passwd, and one reads them with
- getspnam() instead of getpwnam(). (Note that SCO systems do some random
- other thing; others might as well. See the ifdefs in driver/passwd-pwent.c
- if you're having trouble related to reading passwords.) */
+/* Define this if you have the SGI SCREEN_SAVER extension. */
+#undef HAVE_SGI_SAVER_EXTENSION
+
+/* Define this if you have the SGI-VIDEO-CONTROL extension. */
+#undef HAVE_SGI_VC_EXTENSION
+
+/* Define this if your system uses /etc/shadow. */
#undef HAVE_SHADOW_PASSWD
/* Define to 1 if you have the `sigaction' function. */
@@ -333,70 +312,49 @@
/* Define to 1 if you have the <util.h> header file. */
#undef HAVE_UTIL_H
-/* Define this if you have the XF86MiscSetGrabKeysState function (which allows
- the Ctrl-Alt-KP_star and Ctrl-Alt-KP_slash key sequences to be temporarily
- disabled. Sadly, it doesn't affect Ctrl-Alt-BS or Ctrl-Alt-F1.) */
-#undef HAVE_XF86MISCSETGRABKEYSSTATE
-
-/* Define this if you have the functions XF86VidModeGetModeLine() and
- XF86VidModeGetViewPort(), in support of virtual desktops where the X
- server's root window is bigger than the actual screen. This is an XFree86
- thing, and probably doesn't exist elsewhere. (It's available if the file
- /usr/include/X11/extensions/xf86vmode.h exists.) */
+/* Define this if you have XF86VidModeGetViewPort, for virtual desktops. */
#undef HAVE_XF86VMODE
-/* Define this if you have the functions XF86VidModeGetGamma() and
- XF86VidModeSetGamma(), which allow clients to change the gamma response of
- the monitor. This is an XFree86 4.0.x thing, and probably doesn't exist
- elsewhere. (It's available if the file
- /usr/include/X11/extensions/xf86vmode.h exists and has stuff about gamma in
- it.) */
+/* Define this if you have XF86VidModeSetGamma, for fading. */
#undef HAVE_XF86VMODE_GAMMA
-/* Define this if you have the functions XF86VidModeGetGammaRamp() and
- XF86VidModeSetGammaRamp(), which provide finer-grained control than
- XF86VidMode[GS]etGamma(). These appeared in XFree86 4.1.0. */
+/* Define this if you have XF86VidModeSetGammaRamp, for fading. */
#undef HAVE_XF86VMODE_GAMMA_RAMP
/* Define this if you have libXft2. */
#undef HAVE_XFT
-/* Define this if you have the XHPDisableReset function (an HP only thing
- which allows the Ctrl-Sh-Reset key sequence to be temporarily disabled.) */
+/* Define this if you have XHPDisableReset, which allows Ctrl-Sh-Reset to be
+ temporarily disabled. */
#undef HAVE_XHPDISABLERESET
-/* Define this if you have the Xinerama extension. This is standard on
- sufficiently-recent XFree86 systems, and possibly elsewhere. (It's
- available if the file /usr/include/X11/extensions/Xinerama.h exists.) */
+/* Define this if you have the X11R5 XIDLE extension. */
+#undef HAVE_XIDLE_EXTENSION
+
+/* Define this if you have the Xinerama extension. */
#undef HAVE_XINERAMA
-/* Define this if you have the Xinput extension. This is standard since X11R5,
- and is thus almost everywhere. (It's available if the file
- /usr/include/X11/extensions/XInput.h exists.) */
+/* Define this if you have the XInput2 extension. */
#undef HAVE_XINPUT
-/* Define this if you have the XmComboBox Motif widget (Motif 2.0.) */
+/* Define this if you have the X Keyboard Extension. */
+#undef HAVE_XKB
+
+/* Define this if you have the XmComboBox Motif 2.0 widget. */
#undef HAVE_XMCOMBOBOX
/* Define this if you have the XML library. */
#undef HAVE_XML
-/* Define this if you have the Xmu library. This is standard part of X, and if
- your vendor doesn't ship it, you should report that as a bug. */
-#undef HAVE_XMU
-
/* Define this if you have the X Shared Memory Extension. */
#undef HAVE_XSHM_EXTENSION
-/* Define this if you have the function Xutf8DrawString(). */
+/* Define this if you have the function Xutf8DrawString. */
#undef HAVE_XUTF8DRAWSTRING
/* Define this to remove the option of locking the screen at all. */
#undef NO_LOCKING
-/* This is the same as GETTEXT_PACKAGE, but for the glade generated code. */
-#undef PACKAGE
-
/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT
@@ -416,37 +374,26 @@
#undef PACKAGE_VERSION
/* Whether PAM should check the result of account modules when authenticating.
- Only do this if you have account configured properly on your system. */
+ */
#undef PAM_CHECK_ACCOUNT_TYPE
-/* If PAM is being used, this is the name of the PAM service that xscreensaver
- will authenticate as. The default is "xscreensaver", which means that the
- PAM library will look for an "xscreensaver" line in /etc/pam.conf, or (on
- recent Linux systems) will look for a file called /etc/pam.d/xscreensaver.
- Some systems might already have a PAM installation that is configured for
- xlock, so setting this to "xlock" would also work in that case. */
+/* The name of the "xscreensaver" PAM service. */
#undef PAM_SERVICE_NAME
-/* Define if you have PAM and pam_strerror() requires two arguments. */
+/* Define if pam_strerror requires two arguments. */
#undef PAM_STRERROR_TWO_ARGS
-/* Set the name of the password helper program, if any */
-#undef PASSWD_HELPER_PROGRAM
-
/* Define to necessary symbol if this constant uses a non-standard name on
your system. */
#undef PTHREAD_CREATE_JOINABLE
-/* Define as the return type of signal handlers (`int' or `void'). */
+/* Return type of signal handlers */
#undef RETSIGTYPE
/* Define to 1 if you have the ANSI C header files. */
#undef STDC_HEADERS
-/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
-#undef TIME_WITH_SYS_TIME
-
-/* Define this to void* if you're using X11R4 or earlier. */
+/* Stare into the void. */
#undef XPointer
/* Define to 1 if the X Window System is missing or not being used. */
diff --git a/config.sub b/config.sub
index 9ccf09a..c874b7a 100644..100755
--- a/config.sub
+++ b/config.sub
@@ -1,8 +1,8 @@
#! /bin/sh
# Configuration validation subroutine script.
-# Copyright 1992-2018 Free Software Foundation, Inc.
+# Copyright 1992-2020 Free Software Foundation, Inc.
-timestamp='2018-03-08'
+timestamp='2020-11-07'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -50,7 +50,7 @@ timestamp='2018-03-08'
# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
# It is wrong to echo any other type of specification.
-me=`echo "$0" | sed -e 's,.*/,,'`
+me=$(echo "$0" | sed -e 's,.*/,,')
usage="\
Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
@@ -67,7 +67,7 @@ Report bugs and patches to <config-patches@gnu.org>."
version="\
GNU config.sub ($timestamp)
-Copyright 1992-2018 Free Software Foundation, Inc.
+Copyright 1992-2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -89,7 +89,7 @@ while test $# -gt 0 ; do
- ) # Use stdin as input.
break ;;
-* )
- echo "$me: invalid option $1$help"
+ echo "$me: invalid option $1$help" >&2
exit 1 ;;
*local*)
@@ -110,1223 +110,1167 @@ case $# in
exit 1;;
esac
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
- nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
- linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
- knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
- kopensolaris*-gnu* | cloudabi*-eabi* | \
- storm-chaos* | os2-emx* | rtmk-nova*)
- os=-$maybe_os
- basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
- ;;
- android-linux)
- os=-linux-android
- basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
- ;;
- *)
- basic_machine=`echo "$1" | sed 's/-[^-]*$//'`
- if [ "$basic_machine" != "$1" ]
- then os=`echo "$1" | sed 's/.*-/-/'`
- else os=; fi
- ;;
-esac
+# Split fields of configuration type
+# shellcheck disable=SC2162
+IFS="-" read field1 field2 field3 field4 <<EOF
+$1
+EOF
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work. We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
- -sun*os*)
- # Prevent following clause from handling this invalid input.
- ;;
- -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
- -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
- -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
- -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
- -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
- -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
- -apple | -axis | -knuth | -cray | -microblaze*)
- os=
- basic_machine=$1
- ;;
- -bluegene*)
- os=-cnk
- ;;
- -sim | -cisco | -oki | -wec | -winbond)
- os=
- basic_machine=$1
- ;;
- -scout)
- ;;
- -wrs)
- os=-vxworks
- basic_machine=$1
- ;;
- -chorusos*)
- os=-chorusos
- basic_machine=$1
- ;;
- -chorusrdb)
- os=-chorusrdb
- basic_machine=$1
- ;;
- -hiux*)
- os=-hiuxwe2
- ;;
- -sco6)
- os=-sco5v6
- basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco5)
- os=-sco3.2v5
- basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco4)
- os=-sco3.2v4
- basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco3.2.[4-9]*)
- os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
- basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco3.2v[4-9]*)
- # Don't forget version if it is 3.2v4 or newer.
- basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco5v6*)
- # Don't forget version if it is 3.2v4 or newer.
- basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco*)
- os=-sco3.2v2
- basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
- ;;
- -udk*)
- basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
- ;;
- -isc)
- os=-isc2.2
- basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
- ;;
- -clix*)
- basic_machine=clipper-intergraph
- ;;
- -isc*)
- basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
- ;;
- -lynx*178)
- os=-lynxos178
- ;;
- -lynx*5)
- os=-lynxos5
+# Separate into logical components for further validation
+case $1 in
+ *-*-*-*-*)
+ echo Invalid configuration \`"$1"\': more than four components >&2
+ exit 1
;;
- -lynx*)
- os=-lynxos
+ *-*-*-*)
+ basic_machine=$field1-$field2
+ basic_os=$field3-$field4
;;
- -ptx*)
- basic_machine=`echo "$1" | sed -e 's/86-.*/86-sequent/'`
+ *-*-*)
+ # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
+ # parts
+ maybe_os=$field2-$field3
+ case $maybe_os in
+ nto-qnx* | linux-* | uclinux-uclibc* \
+ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
+ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
+ | storm-chaos* | os2-emx* | rtmk-nova*)
+ basic_machine=$field1
+ basic_os=$maybe_os
+ ;;
+ android-linux)
+ basic_machine=$field1-unknown
+ basic_os=linux-android
+ ;;
+ *)
+ basic_machine=$field1-$field2
+ basic_os=$field3
+ ;;
+ esac
;;
- -psos*)
- os=-psos
+ *-*)
+ # A lone config we happen to match not fitting any pattern
+ case $field1-$field2 in
+ decstation-3100)
+ basic_machine=mips-dec
+ basic_os=
+ ;;
+ *-*)
+ # Second component is usually, but not always the OS
+ case $field2 in
+ # Prevent following clause from handling this valid os
+ sun*os*)
+ basic_machine=$field1
+ basic_os=$field2
+ ;;
+ # Manufacturers
+ dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \
+ | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \
+ | unicom* | ibm* | next | hp | isi* | apollo | altos* \
+ | convergent* | ncr* | news | 32* | 3600* | 3100* \
+ | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \
+ | ultra | tti* | harris | dolphin | highlevel | gould \
+ | cbm | ns | masscomp | apple | axis | knuth | cray \
+ | microblaze* | sim | cisco \
+ | oki | wec | wrs | winbond)
+ basic_machine=$field1-$field2
+ basic_os=
+ ;;
+ *)
+ basic_machine=$field1
+ basic_os=$field2
+ ;;
+ esac
+ ;;
+ esac
;;
- -mint | -mint[0-9]*)
- basic_machine=m68k-atari
- os=-mint
+ *)
+ # Convert single-component short-hands not valid as part of
+ # multi-component configurations.
+ case $field1 in
+ 386bsd)
+ basic_machine=i386-pc
+ basic_os=bsd
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ basic_os=udi
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ basic_os=scout
+ ;;
+ alliant)
+ basic_machine=fx80-alliant
+ basic_os=
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ basic_os=
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ basic_os=bsd
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ basic_os=sysv
+ ;;
+ amiga)
+ basic_machine=m68k-unknown
+ basic_os=
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ basic_os=amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ basic_os=sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ basic_os=sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ basic_os=bsd
+ ;;
+ aros)
+ basic_machine=i386-pc
+ basic_os=aros
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ basic_os=aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ basic_os=dynix
+ ;;
+ blackfin)
+ basic_machine=bfin-unknown
+ basic_os=linux
+ ;;
+ cegcc)
+ basic_machine=arm-unknown
+ basic_os=cegcc
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ basic_os=bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ basic_os=bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ basic_os=bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ basic_os=bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ basic_os=bsd
+ ;;
+ cray)
+ basic_machine=j90-cray
+ basic_os=unicos
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ basic_os=
+ ;;
+ da30)
+ basic_machine=m68k-da30
+ basic_os=
+ ;;
+ decstation | pmax | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ basic_os=
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ basic_os=sysv3
+ ;;
+ dicos)
+ basic_machine=i686-pc
+ basic_os=dicos
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ basic_os=msdosdjgpp
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ basic_os=ebmon
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ basic_os=ose
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ basic_os=sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ basic_os=go32
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ basic_os=hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ basic_os=xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ basic_os=hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ basic_os=sysv3
+ ;;
+ hp300 | hp300hpux)
+ basic_machine=m68k-hp
+ basic_os=hpux
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ basic_os=bsd
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ basic_os=osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ basic_os=proelf
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ basic_os=mach
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ basic_os=sysv
+ ;;
+ m68knommu)
+ basic_machine=m68k-unknown
+ basic_os=linux
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ basic_os=sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ basic_os=sysv
+ ;;
+ mingw64)
+ basic_machine=x86_64-pc
+ basic_os=mingw64
+ ;;
+ mingw32)
+ basic_machine=i686-pc
+ basic_os=mingw32
+ ;;
+ mingw32ce)
+ basic_machine=arm-unknown
+ basic_os=mingw32ce
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ basic_os=coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ basic_os=morphos
+ ;;
+ moxiebox)
+ basic_machine=moxie-unknown
+ basic_os=moxiebox
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ basic_os=msdos
+ ;;
+ msys)
+ basic_machine=i686-pc
+ basic_os=msys
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ basic_os=mvs
+ ;;
+ nacl)
+ basic_machine=le32-unknown
+ basic_os=nacl
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ basic_os=sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-pc
+ basic_os=netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ basic_os=linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ basic_os=newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ basic_os=newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ basic_os=sysv
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ basic_os=cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ basic_os=cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ basic_os=nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ basic_os=mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ basic_os=nonstopux
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ basic_os=os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ basic_os=ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ basic_os=os68k
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ basic_os=osf
+ ;;
+ parisc)
+ basic_machine=hppa-unknown
+ basic_os=linux
+ ;;
+ psp)
+ basic_machine=mipsallegrexel-sony
+ basic_os=psp
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ basic_os=pw32
+ ;;
+ rdos | rdos64)
+ basic_machine=x86_64-pc
+ basic_os=rdos
+ ;;
+ rdos32)
+ basic_machine=i386-pc
+ basic_os=rdos
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ basic_os=coff
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ basic_os=udi
+ ;;
+ sei)
+ basic_machine=mips-sei
+ basic_os=seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ basic_os=
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ basic_os=sysv2
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ basic_os=
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ basic_os=sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ basic_os=
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ basic_os=sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ basic_os=sunos4
+ ;;
+ sun3)
+ basic_machine=m68k-sun
+ basic_os=
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ basic_os=sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ basic_os=sunos4
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ basic_os=
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ basic_os=sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ basic_os=sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ basic_os=solaris2
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ basic_os=
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ basic_os=unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ basic_os=dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ basic_os=unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ basic_os=unicos
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ basic_os=tops20
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ basic_os=tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ basic_os=udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ basic_os=sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ basic_os=none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ basic_os=sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ basic_os=vms
+ ;;
+ vsta)
+ basic_machine=i386-pc
+ basic_os=vsta
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ basic_os=vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ basic_os=vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ basic_os=vxworks
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ basic_os=mingw32
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ basic_os=unicos
+ ;;
+ *)
+ basic_machine=$1
+ basic_os=
+ ;;
+ esac
;;
esac
-# Decode aliases for certain CPU-COMPANY combinations.
+# Decode 1-component or ad-hoc basic machines
case $basic_machine in
- # Recognize the basic CPU types without company name.
- # Some are omitted here because they have special meanings below.
- 1750a | 580 \
- | a29k \
- | aarch64 | aarch64_be \
- | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
- | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
- | am33_2.0 \
- | arc | arceb \
- | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
- | avr | avr32 \
- | ba \
- | be32 | be64 \
- | bfin \
- | c4x | c8051 | clipper \
- | d10v | d30v | dlx | dsp16xx \
- | e2k | epiphany \
- | fido | fr30 | frv | ft32 \
- | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
- | hexagon \
- | i370 | i860 | i960 | ia16 | ia64 \
- | ip2k | iq2000 \
- | k1om \
- | le32 | le64 \
- | lm32 \
- | m32c | m32r | m32rle | m68000 | m68k | m88k \
- | maxq | mb | microblaze | microblazeel | mcore | mep | metag \
- | mips | mipsbe | mipseb | mipsel | mipsle \
- | mips16 \
- | mips64 | mips64el \
- | mips64octeon | mips64octeonel \
- | mips64orion | mips64orionel \
- | mips64r5900 | mips64r5900el \
- | mips64vr | mips64vrel \
- | mips64vr4100 | mips64vr4100el \
- | mips64vr4300 | mips64vr4300el \
- | mips64vr5000 | mips64vr5000el \
- | mips64vr5900 | mips64vr5900el \
- | mipsisa32 | mipsisa32el \
- | mipsisa32r2 | mipsisa32r2el \
- | mipsisa32r6 | mipsisa32r6el \
- | mipsisa64 | mipsisa64el \
- | mipsisa64r2 | mipsisa64r2el \
- | mipsisa64r6 | mipsisa64r6el \
- | mipsisa64sb1 | mipsisa64sb1el \
- | mipsisa64sr71k | mipsisa64sr71kel \
- | mipsr5900 | mipsr5900el \
- | mipstx39 | mipstx39el \
- | mn10200 | mn10300 \
- | moxie \
- | mt \
- | msp430 \
- | nds32 | nds32le | nds32be \
- | nios | nios2 | nios2eb | nios2el \
- | ns16k | ns32k \
- | open8 | or1k | or1knd | or32 \
- | pdp10 | pj | pjl \
- | powerpc | powerpc64 | powerpc64le | powerpcle \
- | pru \
- | pyramid \
- | riscv32 | riscv64 \
- | rl78 | rx \
- | score \
- | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
- | sh64 | sh64le \
- | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
- | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
- | spu \
- | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
- | ubicom32 \
- | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
- | visium \
- | wasm32 \
- | x86 | xc16x | xstormy16 | xtensa \
- | z8k | z80)
- basic_machine=$basic_machine-unknown
- ;;
- c54x)
- basic_machine=tic54x-unknown
- ;;
- c55x)
- basic_machine=tic55x-unknown
- ;;
- c6x)
- basic_machine=tic6x-unknown
- ;;
- leon|leon[3-9])
- basic_machine=sparc-$basic_machine
- ;;
- m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
- basic_machine=$basic_machine-unknown
- os=-none
+ # Here we handle the default manufacturer of certain CPU types. It is in
+ # some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ cpu=hppa1.1
+ vendor=winbond
;;
- m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65)
+ op50n)
+ cpu=hppa1.1
+ vendor=oki
;;
- ms1)
- basic_machine=mt-unknown
+ op60c)
+ cpu=hppa1.1
+ vendor=oki
;;
-
- strongarm | thumb | xscale)
- basic_machine=arm-unknown
+ ibm*)
+ cpu=i370
+ vendor=ibm
;;
- xgate)
- basic_machine=$basic_machine-unknown
- os=-none
+ orion105)
+ cpu=clipper
+ vendor=highlevel
;;
- xscaleeb)
- basic_machine=armeb-unknown
+ mac | mpw | mac-mpw)
+ cpu=m68k
+ vendor=apple
;;
-
- xscaleel)
- basic_machine=armel-unknown
+ pmac | pmac-mpw)
+ cpu=powerpc
+ vendor=apple
;;
- # We use `pc' rather than `unknown'
- # because (1) that's what they normally are, and
- # (2) the word "unknown" tends to confuse beginning users.
- i*86 | x86_64)
- basic_machine=$basic_machine-pc
- ;;
- # Object if more than one company name word.
- *-*-*)
- echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2
- exit 1
- ;;
- # Recognize the basic CPU types with company name.
- 580-* \
- | a29k-* \
- | aarch64-* | aarch64_be-* \
- | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
- | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
- | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
- | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
- | avr-* | avr32-* \
- | ba-* \
- | be32-* | be64-* \
- | bfin-* | bs2000-* \
- | c[123]* | c30-* | [cjt]90-* | c4x-* \
- | c8051-* | clipper-* | craynv-* | cydra-* \
- | d10v-* | d30v-* | dlx-* \
- | e2k-* | elxsi-* \
- | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
- | h8300-* | h8500-* \
- | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
- | hexagon-* \
- | i*86-* | i860-* | i960-* | ia16-* | ia64-* \
- | ip2k-* | iq2000-* \
- | k1om-* \
- | le32-* | le64-* \
- | lm32-* \
- | m32c-* | m32r-* | m32rle-* \
- | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
- | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
- | microblaze-* | microblazeel-* \
- | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
- | mips16-* \
- | mips64-* | mips64el-* \
- | mips64octeon-* | mips64octeonel-* \
- | mips64orion-* | mips64orionel-* \
- | mips64r5900-* | mips64r5900el-* \
- | mips64vr-* | mips64vrel-* \
- | mips64vr4100-* | mips64vr4100el-* \
- | mips64vr4300-* | mips64vr4300el-* \
- | mips64vr5000-* | mips64vr5000el-* \
- | mips64vr5900-* | mips64vr5900el-* \
- | mipsisa32-* | mipsisa32el-* \
- | mipsisa32r2-* | mipsisa32r2el-* \
- | mipsisa32r6-* | mipsisa32r6el-* \
- | mipsisa64-* | mipsisa64el-* \
- | mipsisa64r2-* | mipsisa64r2el-* \
- | mipsisa64r6-* | mipsisa64r6el-* \
- | mipsisa64sb1-* | mipsisa64sb1el-* \
- | mipsisa64sr71k-* | mipsisa64sr71kel-* \
- | mipsr5900-* | mipsr5900el-* \
- | mipstx39-* | mipstx39el-* \
- | mmix-* \
- | mt-* \
- | msp430-* \
- | nds32-* | nds32le-* | nds32be-* \
- | nios-* | nios2-* | nios2eb-* | nios2el-* \
- | none-* | np1-* | ns16k-* | ns32k-* \
- | open8-* \
- | or1k*-* \
- | orion-* \
- | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
- | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
- | pru-* \
- | pyramid-* \
- | riscv32-* | riscv64-* \
- | rl78-* | romp-* | rs6000-* | rx-* \
- | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
- | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
- | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
- | sparclite-* \
- | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
- | tahoe-* \
- | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
- | tile*-* \
- | tron-* \
- | ubicom32-* \
- | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
- | vax-* \
- | visium-* \
- | wasm32-* \
- | we32k-* \
- | x86-* | x86_64-* | xc16x-* | xps100-* \
- | xstormy16-* | xtensa*-* \
- | ymp-* \
- | z8k-* | z80-*)
- ;;
- # Recognize the basic CPU types without company name, with glob match.
- xtensa*)
- basic_machine=$basic_machine-unknown
- ;;
# Recognize the various machine names and aliases which stand
# for a CPU type and a company and sometimes even an OS.
- 386bsd)
- basic_machine=i386-pc
- os=-bsd
- ;;
3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
- basic_machine=m68000-att
+ cpu=m68000
+ vendor=att
;;
3b*)
- basic_machine=we32k-att
- ;;
- a29khif)
- basic_machine=a29k-amd
- os=-udi
- ;;
- abacus)
- basic_machine=abacus-unknown
- ;;
- adobe68k)
- basic_machine=m68010-adobe
- os=-scout
- ;;
- alliant | fx80)
- basic_machine=fx80-alliant
- ;;
- altos | altos3068)
- basic_machine=m68k-altos
- ;;
- am29k)
- basic_machine=a29k-none
- os=-bsd
- ;;
- amd64)
- basic_machine=x86_64-pc
- ;;
- amd64-*)
- basic_machine=x86_64-`echo "$basic_machine" | sed 's/^[^-]*-//'`
- ;;
- amdahl)
- basic_machine=580-amdahl
- os=-sysv
- ;;
- amiga | amiga-*)
- basic_machine=m68k-unknown
- ;;
- amigaos | amigados)
- basic_machine=m68k-unknown
- os=-amigaos
- ;;
- amigaunix | amix)
- basic_machine=m68k-unknown
- os=-sysv4
- ;;
- apollo68)
- basic_machine=m68k-apollo
- os=-sysv
- ;;
- apollo68bsd)
- basic_machine=m68k-apollo
- os=-bsd
- ;;
- aros)
- basic_machine=i386-pc
- os=-aros
- ;;
- asmjs)
- basic_machine=asmjs-unknown
- ;;
- aux)
- basic_machine=m68k-apple
- os=-aux
- ;;
- balance)
- basic_machine=ns32k-sequent
- os=-dynix
- ;;
- blackfin)
- basic_machine=bfin-unknown
- os=-linux
- ;;
- blackfin-*)
- basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'`
- os=-linux
+ cpu=we32k
+ vendor=att
;;
bluegene*)
- basic_machine=powerpc-ibm
- os=-cnk
- ;;
- c54x-*)
- basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'`
- ;;
- c55x-*)
- basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'`
- ;;
- c6x-*)
- basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'`
- ;;
- c90)
- basic_machine=c90-cray
- os=-unicos
- ;;
- cegcc)
- basic_machine=arm-unknown
- os=-cegcc
- ;;
- convex-c1)
- basic_machine=c1-convex
- os=-bsd
- ;;
- convex-c2)
- basic_machine=c2-convex
- os=-bsd
- ;;
- convex-c32)
- basic_machine=c32-convex
- os=-bsd
- ;;
- convex-c34)
- basic_machine=c34-convex
- os=-bsd
- ;;
- convex-c38)
- basic_machine=c38-convex
- os=-bsd
- ;;
- cray | j90)
- basic_machine=j90-cray
- os=-unicos
- ;;
- craynv)
- basic_machine=craynv-cray
- os=-unicosmp
- ;;
- cr16 | cr16-*)
- basic_machine=cr16-unknown
- os=-elf
- ;;
- crds | unos)
- basic_machine=m68k-crds
- ;;
- crisv32 | crisv32-* | etraxfs*)
- basic_machine=crisv32-axis
- ;;
- cris | cris-* | etrax*)
- basic_machine=cris-axis
- ;;
- crx)
- basic_machine=crx-unknown
- os=-elf
- ;;
- da30 | da30-*)
- basic_machine=m68k-da30
- ;;
- decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
- basic_machine=mips-dec
+ cpu=powerpc
+ vendor=ibm
+ basic_os=cnk
;;
decsystem10* | dec10*)
- basic_machine=pdp10-dec
- os=-tops10
+ cpu=pdp10
+ vendor=dec
+ basic_os=tops10
;;
decsystem20* | dec20*)
- basic_machine=pdp10-dec
- os=-tops20
+ cpu=pdp10
+ vendor=dec
+ basic_os=tops20
;;
delta | 3300 | motorola-3300 | motorola-delta \
| 3300-motorola | delta-motorola)
- basic_machine=m68k-motorola
- ;;
- delta88)
- basic_machine=m88k-motorola
- os=-sysv3
- ;;
- dicos)
- basic_machine=i686-pc
- os=-dicos
- ;;
- djgpp)
- basic_machine=i586-pc
- os=-msdosdjgpp
- ;;
- dpx20 | dpx20-*)
- basic_machine=rs6000-bull
- os=-bosx
+ cpu=m68k
+ vendor=motorola
;;
dpx2*)
- basic_machine=m68k-bull
- os=-sysv3
- ;;
- e500v[12])
- basic_machine=powerpc-unknown
- os=$os"spe"
- ;;
- e500v[12]-*)
- basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'`
- os=$os"spe"
- ;;
- ebmon29k)
- basic_machine=a29k-amd
- os=-ebmon
- ;;
- elxsi)
- basic_machine=elxsi-elxsi
- os=-bsd
+ cpu=m68k
+ vendor=bull
+ basic_os=sysv3
;;
encore | umax | mmax)
- basic_machine=ns32k-encore
+ cpu=ns32k
+ vendor=encore
;;
- es1800 | OSE68k | ose68k | ose | OSE)
- basic_machine=m68k-ericsson
- os=-ose
+ elxsi)
+ cpu=elxsi
+ vendor=elxsi
+ basic_os=${basic_os:-bsd}
;;
fx2800)
- basic_machine=i860-alliant
+ cpu=i860
+ vendor=alliant
;;
genix)
- basic_machine=ns32k-ns
- ;;
- gmicro)
- basic_machine=tron-gmicro
- os=-sysv
- ;;
- go32)
- basic_machine=i386-pc
- os=-go32
+ cpu=ns32k
+ vendor=ns
;;
h3050r* | hiux*)
- basic_machine=hppa1.1-hitachi
- os=-hiuxwe2
- ;;
- h8300hms)
- basic_machine=h8300-hitachi
- os=-hms
- ;;
- h8300xray)
- basic_machine=h8300-hitachi
- os=-xray
- ;;
- h8500hms)
- basic_machine=h8500-hitachi
- os=-hms
- ;;
- harris)
- basic_machine=m88k-harris
- os=-sysv3
- ;;
- hp300-*)
- basic_machine=m68k-hp
- ;;
- hp300bsd)
- basic_machine=m68k-hp
- os=-bsd
- ;;
- hp300hpux)
- basic_machine=m68k-hp
- os=-hpux
+ cpu=hppa1.1
+ vendor=hitachi
+ basic_os=hiuxwe2
;;
hp3k9[0-9][0-9] | hp9[0-9][0-9])
- basic_machine=hppa1.0-hp
+ cpu=hppa1.0
+ vendor=hp
;;
hp9k2[0-9][0-9] | hp9k31[0-9])
- basic_machine=m68000-hp
+ cpu=m68000
+ vendor=hp
;;
hp9k3[2-9][0-9])
- basic_machine=m68k-hp
+ cpu=m68k
+ vendor=hp
;;
hp9k6[0-9][0-9] | hp6[0-9][0-9])
- basic_machine=hppa1.0-hp
+ cpu=hppa1.0
+ vendor=hp
;;
hp9k7[0-79][0-9] | hp7[0-79][0-9])
- basic_machine=hppa1.1-hp
+ cpu=hppa1.1
+ vendor=hp
;;
hp9k78[0-9] | hp78[0-9])
# FIXME: really hppa2.0-hp
- basic_machine=hppa1.1-hp
+ cpu=hppa1.1
+ vendor=hp
;;
hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
# FIXME: really hppa2.0-hp
- basic_machine=hppa1.1-hp
+ cpu=hppa1.1
+ vendor=hp
;;
hp9k8[0-9][13679] | hp8[0-9][13679])
- basic_machine=hppa1.1-hp
+ cpu=hppa1.1
+ vendor=hp
;;
hp9k8[0-9][0-9] | hp8[0-9][0-9])
- basic_machine=hppa1.0-hp
- ;;
- hppaosf)
- basic_machine=hppa1.1-hp
- os=-osf
- ;;
- hppro)
- basic_machine=hppa1.1-hp
- os=-proelf
- ;;
- i370-ibm* | ibm*)
- basic_machine=i370-ibm
+ cpu=hppa1.0
+ vendor=hp
;;
i*86v32)
- basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
- os=-sysv32
+ cpu=$(echo "$1" | sed -e 's/86.*/86/')
+ vendor=pc
+ basic_os=sysv32
;;
i*86v4*)
- basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
- os=-sysv4
+ cpu=$(echo "$1" | sed -e 's/86.*/86/')
+ vendor=pc
+ basic_os=sysv4
;;
i*86v)
- basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
- os=-sysv
+ cpu=$(echo "$1" | sed -e 's/86.*/86/')
+ vendor=pc
+ basic_os=sysv
;;
i*86sol2)
- basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
- os=-solaris2
+ cpu=$(echo "$1" | sed -e 's/86.*/86/')
+ vendor=pc
+ basic_os=solaris2
;;
- i386mach)
- basic_machine=i386-mach
- os=-mach
- ;;
- vsta)
- basic_machine=i386-unknown
- os=-vsta
+ j90 | j90-cray)
+ cpu=j90
+ vendor=cray
+ basic_os=${basic_os:-unicos}
;;
iris | iris4d)
- basic_machine=mips-sgi
- case $os in
- -irix*)
+ cpu=mips
+ vendor=sgi
+ case $basic_os in
+ irix*)
;;
*)
- os=-irix4
+ basic_os=irix4
;;
esac
;;
- isi68 | isi)
- basic_machine=m68k-isi
- os=-sysv
- ;;
- leon-*|leon[3-9]-*)
- basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'`
- ;;
- m68knommu)
- basic_machine=m68k-unknown
- os=-linux
- ;;
- m68knommu-*)
- basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'`
- os=-linux
- ;;
- magnum | m3230)
- basic_machine=mips-mips
- os=-sysv
- ;;
- merlin)
- basic_machine=ns32k-utek
- os=-sysv
- ;;
- microblaze*)
- basic_machine=microblaze-xilinx
- ;;
- mingw64)
- basic_machine=x86_64-pc
- os=-mingw64
- ;;
- mingw32)
- basic_machine=i686-pc
- os=-mingw32
- ;;
- mingw32ce)
- basic_machine=arm-unknown
- os=-mingw32ce
- ;;
miniframe)
- basic_machine=m68000-convergent
- ;;
- *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
- basic_machine=m68k-atari
- os=-mint
- ;;
- mips3*-*)
- basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`
- ;;
- mips3*)
- basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown
- ;;
- monitor)
- basic_machine=m68k-rom68k
- os=-coff
- ;;
- morphos)
- basic_machine=powerpc-unknown
- os=-morphos
+ cpu=m68000
+ vendor=convergent
;;
- moxiebox)
- basic_machine=moxie-unknown
- os=-moxiebox
- ;;
- msdos)
- basic_machine=i386-pc
- os=-msdos
- ;;
- ms1-*)
- basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'`
- ;;
- msys)
- basic_machine=i686-pc
- os=-msys
- ;;
- mvs)
- basic_machine=i370-ibm
- os=-mvs
- ;;
- nacl)
- basic_machine=le32-unknown
- os=-nacl
- ;;
- ncr3000)
- basic_machine=i486-ncr
- os=-sysv4
- ;;
- netbsd386)
- basic_machine=i386-unknown
- os=-netbsd
- ;;
- netwinder)
- basic_machine=armv4l-rebel
- os=-linux
- ;;
- news | news700 | news800 | news900)
- basic_machine=m68k-sony
- os=-newsos
- ;;
- news1000)
- basic_machine=m68030-sony
- os=-newsos
+ *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ cpu=m68k
+ vendor=atari
+ basic_os=mint
;;
news-3600 | risc-news)
- basic_machine=mips-sony
- os=-newsos
- ;;
- necv70)
- basic_machine=v70-nec
- os=-sysv
+ cpu=mips
+ vendor=sony
+ basic_os=newsos
;;
next | m*-next)
- basic_machine=m68k-next
- case $os in
- -nextstep* )
+ cpu=m68k
+ vendor=next
+ case $basic_os in
+ openstep*)
+ ;;
+ nextstep*)
;;
- -ns2*)
- os=-nextstep2
+ ns2*)
+ basic_os=nextstep2
;;
*)
- os=-nextstep3
+ basic_os=nextstep3
;;
esac
;;
- nh3000)
- basic_machine=m68k-harris
- os=-cxux
- ;;
- nh[45]000)
- basic_machine=m88k-harris
- os=-cxux
- ;;
- nindy960)
- basic_machine=i960-intel
- os=-nindy
- ;;
- mon960)
- basic_machine=i960-intel
- os=-mon960
- ;;
- nonstopux)
- basic_machine=mips-compaq
- os=-nonstopux
- ;;
np1)
- basic_machine=np1-gould
- ;;
- neo-tandem)
- basic_machine=neo-tandem
- ;;
- nse-tandem)
- basic_machine=nse-tandem
- ;;
- nsr-tandem)
- basic_machine=nsr-tandem
- ;;
- nsv-tandem)
- basic_machine=nsv-tandem
- ;;
- nsx-tandem)
- basic_machine=nsx-tandem
+ cpu=np1
+ vendor=gould
;;
op50n-* | op60c-*)
- basic_machine=hppa1.1-oki
- os=-proelf
- ;;
- openrisc | openrisc-*)
- basic_machine=or32-unknown
- ;;
- os400)
- basic_machine=powerpc-ibm
- os=-os400
- ;;
- OSE68000 | ose68000)
- basic_machine=m68000-ericsson
- os=-ose
- ;;
- os68k)
- basic_machine=m68k-none
- os=-os68k
+ cpu=hppa1.1
+ vendor=oki
+ basic_os=proelf
;;
pa-hitachi)
- basic_machine=hppa1.1-hitachi
- os=-hiuxwe2
- ;;
- paragon)
- basic_machine=i860-intel
- os=-osf
- ;;
- parisc)
- basic_machine=hppa-unknown
- os=-linux
- ;;
- parisc-*)
- basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'`
- os=-linux
+ cpu=hppa1.1
+ vendor=hitachi
+ basic_os=hiuxwe2
;;
pbd)
- basic_machine=sparc-tti
+ cpu=sparc
+ vendor=tti
;;
pbb)
- basic_machine=m68k-tti
- ;;
- pc532 | pc532-*)
- basic_machine=ns32k-pc532
- ;;
- pc98)
- basic_machine=i386-pc
- ;;
- pc98-*)
- basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'`
- ;;
- pentium | p5 | k5 | k6 | nexgen | viac3)
- basic_machine=i586-pc
- ;;
- pentiumpro | p6 | 6x86 | athlon | athlon_*)
- basic_machine=i686-pc
+ cpu=m68k
+ vendor=tti
;;
- pentiumii | pentium2 | pentiumiii | pentium3)
- basic_machine=i686-pc
- ;;
- pentium4)
- basic_machine=i786-pc
- ;;
- pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
- basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'`
- ;;
- pentiumpro-* | p6-* | 6x86-* | athlon-*)
- basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'`
- ;;
- pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
- basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'`
- ;;
- pentium4-*)
- basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ pc532)
+ cpu=ns32k
+ vendor=pc532
;;
pn)
- basic_machine=pn-gould
- ;;
- power) basic_machine=power-ibm
+ cpu=pn
+ vendor=gould
;;
- ppc | ppcbe) basic_machine=powerpc-unknown
- ;;
- ppc-* | ppcbe-*)
- basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'`
- ;;
- ppcle | powerpclittle)
- basic_machine=powerpcle-unknown
- ;;
- ppcle-* | powerpclittle-*)
- basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ power)
+ cpu=power
+ vendor=ibm
;;
- ppc64) basic_machine=powerpc64-unknown
+ ps2)
+ cpu=i386
+ vendor=ibm
;;
- ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ rm[46]00)
+ cpu=mips
+ vendor=siemens
;;
- ppc64le | powerpc64little)
- basic_machine=powerpc64le-unknown
+ rtpc | rtpc-*)
+ cpu=romp
+ vendor=ibm
;;
- ppc64le-* | powerpc64little-*)
- basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ sde)
+ cpu=mipsisa32
+ vendor=sde
+ basic_os=${basic_os:-elf}
;;
- ps2)
- basic_machine=i386-ibm
+ simso-wrs)
+ cpu=sparclite
+ vendor=wrs
+ basic_os=vxworks
;;
- pw32)
- basic_machine=i586-unknown
- os=-pw32
+ tower | tower-32)
+ cpu=m68k
+ vendor=ncr
;;
- rdos | rdos64)
- basic_machine=x86_64-pc
- os=-rdos
+ vpp*|vx|vx-*)
+ cpu=f301
+ vendor=fujitsu
;;
- rdos32)
- basic_machine=i386-pc
- os=-rdos
+ w65)
+ cpu=w65
+ vendor=wdc
;;
- rom68k)
- basic_machine=m68k-rom68k
- os=-coff
+ w89k-*)
+ cpu=hppa1.1
+ vendor=winbond
+ basic_os=proelf
;;
- rm[46]00)
- basic_machine=mips-siemens
+ none)
+ cpu=none
+ vendor=none
;;
- rtpc | rtpc-*)
- basic_machine=romp-ibm
+ leon|leon[3-9])
+ cpu=sparc
+ vendor=$basic_machine
;;
- s390 | s390-*)
- basic_machine=s390-ibm
+ leon-*|leon[3-9]-*)
+ cpu=sparc
+ vendor=$(echo "$basic_machine" | sed 's/-.*//')
;;
- s390x | s390x-*)
- basic_machine=s390x-ibm
+
+ *-*)
+ # shellcheck disable=SC2162
+ IFS="-" read cpu vendor <<EOF
+$basic_machine
+EOF
;;
- sa29200)
- basic_machine=a29k-amd
- os=-udi
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ cpu=$basic_machine
+ vendor=pc
;;
- sb1)
- basic_machine=mipsisa64sb1-unknown
+ # These rules are duplicated from below for sake of the special case above;
+ # i.e. things that normalized to x86 arches should also default to "pc"
+ pc98)
+ cpu=i386
+ vendor=pc
;;
- sb1el)
- basic_machine=mipsisa64sb1el-unknown
+ x64 | amd64)
+ cpu=x86_64
+ vendor=pc
;;
- sde)
- basic_machine=mipsisa32-sde
- os=-elf
+ # Recognize the basic CPU types without company name.
+ *)
+ cpu=$basic_machine
+ vendor=unknown
;;
- sei)
- basic_machine=mips-sei
- os=-seiux
+esac
+
+unset -v basic_machine
+
+# Decode basic machines in the full and proper CPU-Company form.
+case $cpu-$vendor in
+ # Here we handle the default manufacturer of certain CPU types in canonical form. It is in
+ # some cases the only manufacturer, in others, it is the most popular.
+ craynv-unknown)
+ vendor=cray
+ basic_os=${basic_os:-unicosmp}
;;
- sequent)
- basic_machine=i386-sequent
+ c90-unknown | c90-cray)
+ vendor=cray
+ basic_os=${Basic_os:-unicos}
;;
- sh5el)
- basic_machine=sh5le-unknown
+ fx80-unknown)
+ vendor=alliant
;;
- simso-wrs)
- basic_machine=sparclite-wrs
- os=-vxworks
+ romp-unknown)
+ vendor=ibm
;;
- sps7)
- basic_machine=m68k-bull
- os=-sysv2
+ mmix-unknown)
+ vendor=knuth
;;
- spur)
- basic_machine=spur-unknown
+ microblaze-unknown | microblazeel-unknown)
+ vendor=xilinx
;;
- st2000)
- basic_machine=m68k-tandem
+ rs6000-unknown)
+ vendor=ibm
;;
- stratus)
- basic_machine=i860-stratus
- os=-sysv4
+ vax-unknown)
+ vendor=dec
;;
- strongarm-* | thumb-*)
- basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ pdp11-unknown)
+ vendor=dec
;;
- sun2)
- basic_machine=m68000-sun
+ we32k-unknown)
+ vendor=att
;;
- sun2os3)
- basic_machine=m68000-sun
- os=-sunos3
+ cydra-unknown)
+ vendor=cydrome
;;
- sun2os4)
- basic_machine=m68000-sun
- os=-sunos4
+ i370-ibm*)
+ vendor=ibm
;;
- sun3os3)
- basic_machine=m68k-sun
- os=-sunos3
+ orion-unknown)
+ vendor=highlevel
;;
- sun3os4)
- basic_machine=m68k-sun
- os=-sunos4
+ xps-unknown | xps100-unknown)
+ cpu=xps100
+ vendor=honeywell
;;
- sun4os3)
- basic_machine=sparc-sun
- os=-sunos3
+
+ # Here we normalize CPU types with a missing or matching vendor
+ dpx20-unknown | dpx20-bull)
+ cpu=rs6000
+ vendor=bull
+ basic_os=${basic_os:-bosx}
;;
- sun4os4)
- basic_machine=sparc-sun
- os=-sunos4
+
+ # Here we normalize CPU types irrespective of the vendor
+ amd64-*)
+ cpu=x86_64
;;
- sun4sol2)
- basic_machine=sparc-sun
- os=-solaris2
+ blackfin-*)
+ cpu=bfin
+ basic_os=linux
;;
- sun3 | sun3-*)
- basic_machine=m68k-sun
+ c54x-*)
+ cpu=tic54x
;;
- sun4)
- basic_machine=sparc-sun
+ c55x-*)
+ cpu=tic55x
;;
- sun386 | sun386i | roadrunner)
- basic_machine=i386-sun
+ c6x-*)
+ cpu=tic6x
;;
- sv1)
- basic_machine=sv1-cray
- os=-unicos
+ e500v[12]-*)
+ cpu=powerpc
+ basic_os=${basic_os}"spe"
;;
- symmetry)
- basic_machine=i386-sequent
- os=-dynix
+ mips3*-*)
+ cpu=mips64
;;
- t3e)
- basic_machine=alphaev5-cray
- os=-unicos
+ ms1-*)
+ cpu=mt
;;
- t90)
- basic_machine=t90-cray
- os=-unicos
+ m68knommu-*)
+ cpu=m68k
+ basic_os=linux
;;
- tile*)
- basic_machine=$basic_machine-unknown
- os=-linux-gnu
+ m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
+ cpu=s12z
;;
- tx39)
- basic_machine=mipstx39-unknown
+ openrisc-*)
+ cpu=or32
;;
- tx39el)
- basic_machine=mipstx39el-unknown
+ parisc-*)
+ cpu=hppa
+ basic_os=linux
;;
- toad1)
- basic_machine=pdp10-xkl
- os=-tops20
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ cpu=i586
;;
- tower | tower-32)
- basic_machine=m68k-ncr
+ pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)
+ cpu=i686
;;
- tpf)
- basic_machine=s390x-ibm
- os=-tpf
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ cpu=i686
;;
- udi29k)
- basic_machine=a29k-amd
- os=-udi
+ pentium4-*)
+ cpu=i786
;;
- ultra3)
- basic_machine=a29k-nyu
- os=-sym1
+ pc98-*)
+ cpu=i386
;;
- v810 | necv810)
- basic_machine=v810-nec
- os=-none
+ ppc-* | ppcbe-*)
+ cpu=powerpc
;;
- vaxv)
- basic_machine=vax-dec
- os=-sysv
+ ppcle-* | powerpclittle-*)
+ cpu=powerpcle
;;
- vms)
- basic_machine=vax-dec
- os=-vms
+ ppc64-*)
+ cpu=powerpc64
;;
- vpp*|vx|vx-*)
- basic_machine=f301-fujitsu
+ ppc64le-* | powerpc64little-*)
+ cpu=powerpc64le
;;
- vxworks960)
- basic_machine=i960-wrs
- os=-vxworks
+ sb1-*)
+ cpu=mipsisa64sb1
;;
- vxworks68)
- basic_machine=m68k-wrs
- os=-vxworks
+ sb1el-*)
+ cpu=mipsisa64sb1el
;;
- vxworks29k)
- basic_machine=a29k-wrs
- os=-vxworks
+ sh5e[lb]-*)
+ cpu=$(echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/')
;;
- w65*)
- basic_machine=w65-wdc
- os=-none
+ spur-*)
+ cpu=spur
;;
- w89k-*)
- basic_machine=hppa1.1-winbond
- os=-proelf
+ strongarm-* | thumb-*)
+ cpu=arm
;;
- x64)
- basic_machine=x86_64-pc
+ tx39-*)
+ cpu=mipstx39
;;
- xbox)
- basic_machine=i686-pc
- os=-mingw32
+ tx39el-*)
+ cpu=mipstx39el
;;
- xps | xps100)
- basic_machine=xps100-honeywell
+ x64-*)
+ cpu=x86_64
;;
xscale-* | xscalee[bl]-*)
- basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'`
+ cpu=$(echo "$cpu" | sed 's/^xscale/arm/')
;;
- ymp)
- basic_machine=ymp-cray
- os=-unicos
- ;;
- none)
- basic_machine=none-none
- os=-none
+ arm64-*)
+ cpu=aarch64
;;
-# Here we handle the default manufacturer of certain CPU types. It is in
-# some cases the only manufacturer, in others, it is the most popular.
- w89k)
- basic_machine=hppa1.1-winbond
+ # Recognize the canonical CPU Types that limit and/or modify the
+ # company names they are paired with.
+ cr16-*)
+ basic_os=${basic_os:-elf}
;;
- op50n)
- basic_machine=hppa1.1-oki
+ crisv32-* | etraxfs*-*)
+ cpu=crisv32
+ vendor=axis
;;
- op60c)
- basic_machine=hppa1.1-oki
+ cris-* | etrax*-*)
+ cpu=cris
+ vendor=axis
;;
- romp)
- basic_machine=romp-ibm
+ crx-*)
+ basic_os=${basic_os:-elf}
;;
- mmix)
- basic_machine=mmix-knuth
- ;;
- rs6000)
- basic_machine=rs6000-ibm
- ;;
- vax)
- basic_machine=vax-dec
- ;;
- pdp11)
- basic_machine=pdp11-dec
- ;;
- we32k)
- basic_machine=we32k-att
- ;;
- sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
- basic_machine=sh-unknown
+ neo-tandem)
+ cpu=neo
+ vendor=tandem
;;
- cydra)
- basic_machine=cydra-cydrome
+ nse-tandem)
+ cpu=nse
+ vendor=tandem
;;
- orion)
- basic_machine=orion-highlevel
+ nsr-tandem)
+ cpu=nsr
+ vendor=tandem
;;
- orion105)
- basic_machine=clipper-highlevel
+ nsv-tandem)
+ cpu=nsv
+ vendor=tandem
;;
- mac | mpw | mac-mpw)
- basic_machine=m68k-apple
+ nsx-tandem)
+ cpu=nsx
+ vendor=tandem
;;
- pmac | pmac-mpw)
- basic_machine=powerpc-apple
+ mipsallegrexel-sony)
+ cpu=mipsallegrexel
+ vendor=sony
;;
- *-unknown)
- # Make sure to match an already-canonicalized machine name.
+ tile*-*)
+ basic_os=${basic_os:-linux-gnu}
;;
+
*)
- echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2
- exit 1
+ # Recognize the canonical CPU types that are allowed with any
+ # company name.
+ case $cpu in
+ 1750a | 580 \
+ | a29k \
+ | aarch64 | aarch64_be \
+ | abacus \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \
+ | alphapca5[67] | alpha64pca5[67] \
+ | am33_2.0 \
+ | amdgcn \
+ | arc | arceb \
+ | arm | arm[lb]e | arme[lb] | armv* \
+ | avr | avr32 \
+ | asmjs \
+ | ba \
+ | be32 | be64 \
+ | bfin | bpf | bs2000 \
+ | c[123]* | c30 | [cjt]90 | c4x \
+ | c8051 | clipper | craynv | csky | cydra \
+ | d10v | d30v | dlx | dsp16xx \
+ | e2k | elxsi | epiphany \
+ | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \
+ | h8300 | h8500 \
+ | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | hexagon \
+ | i370 | i*86 | i860 | i960 | ia16 | ia64 \
+ | ip2k | iq2000 \
+ | k1om \
+ | le32 | le64 \
+ | lm32 \
+ | m32c | m32r | m32rle \
+ | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
+ | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
+ | m88110 | m88k | maxq | mb | mcore | mep | metag \
+ | microblaze | microblazeel \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64eb | mips64el \
+ | mips64octeon | mips64octeonel \
+ | mips64orion | mips64orionel \
+ | mips64r5900 | mips64r5900el \
+ | mips64vr | mips64vrel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa32r6 | mipsisa32r6el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64r6 | mipsisa64r6el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipsr5900 | mipsr5900el \
+ | mipstx39 | mipstx39el \
+ | mmix \
+ | mn10200 | mn10300 \
+ | moxie \
+ | mt \
+ | msp430 \
+ | nds32 | nds32le | nds32be \
+ | nfp \
+ | nios | nios2 | nios2eb | nios2el \
+ | none | np1 | ns16k | ns32k | nvptx \
+ | open8 \
+ | or1k* \
+ | or32 \
+ | orion \
+ | picochip \
+ | pdp10 | pdp11 | pj | pjl | pn | power \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \
+ | pru \
+ | pyramid \
+ | riscv | riscv32 | riscv64 \
+ | rl78 | romp | rs6000 | rx \
+ | s390 | s390x \
+ | score \
+ | sh | shl \
+ | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \
+ | sh[1234]e[lb] | sh[12345][lb]e | sh[23]ele | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \
+ | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \
+ | spu \
+ | tahoe \
+ | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \
+ | tron \
+ | ubicom32 \
+ | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \
+ | vax \
+ | visium \
+ | w65 \
+ | wasm32 | wasm64 \
+ | we32k \
+ | x86 | x86_64 | xc16x | xgate | xps100 \
+ | xstormy16 | xtensa* \
+ | ymp \
+ | z8k | z80)
+ ;;
+
+ *)
+ echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2
+ exit 1
+ ;;
+ esac
;;
esac
# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
- *-digital*)
- basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'`
+case $vendor in
+ digital*)
+ vendor=dec
;;
- *-commodore*)
- basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'`
+ commodore*)
+ vendor=cbm
;;
*)
;;
@@ -1334,203 +1278,213 @@ esac
# Decode manufacturer-specific aliases for certain operating systems.
-if [ x"$os" != x"" ]
+if test x$basic_os != x
then
+
+# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just
+# set os.
+case $basic_os in
+ gnu/linux*)
+ kernel=linux
+ os=$(echo $basic_os | sed -e 's|gnu/linux|gnu|')
+ ;;
+ os2-emx)
+ kernel=os2
+ os=$(echo $basic_os | sed -e 's|os2-emx|emx|')
+ ;;
+ nto-qnx*)
+ kernel=nto
+ os=$(echo $basic_os | sed -e 's|nto-qnx|qnx|')
+ ;;
+ *-*)
+ # shellcheck disable=SC2162
+ IFS="-" read kernel os <<EOF
+$basic_os
+EOF
+ ;;
+ # Default OS when just kernel was specified
+ nto*)
+ kernel=nto
+ os=$(echo $basic_os | sed -e 's|nto|qnx|')
+ ;;
+ linux*)
+ kernel=linux
+ os=$(echo $basic_os | sed -e 's|linux|gnu|')
+ ;;
+ *)
+ kernel=
+ os=$basic_os
+ ;;
+esac
+
+# Now, normalize the OS (knowing we just have one component, it's not a kernel,
+# etc.)
case $os in
# First match some system type aliases that might get confused
# with valid system types.
- # -solaris* is a basic system type, with this one exception.
- -auroraux)
- os=-auroraux
+ # solaris* is a basic system type, with this one exception.
+ auroraux)
+ os=auroraux
;;
- -solaris1 | -solaris1.*)
- os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ bluegene*)
+ os=cnk
;;
- -solaris)
- os=-solaris2
+ solaris1 | solaris1.*)
+ os=$(echo $os | sed -e 's|solaris1|sunos4|')
;;
- -unixware*)
- os=-sysv4.2uw
+ solaris)
+ os=solaris2
;;
- -gnu/linux*)
- os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ unixware*)
+ os=sysv4.2uw
;;
# es1800 is here to avoid being matched by es* (a different OS)
- -es1800*)
- os=-ose
+ es1800*)
+ os=ose
;;
- # Now accept the basic system types.
- # The portable systems comes first.
- # Each alternative MUST end in a * to match a version number.
- # -sysv* is not here because it comes later, after sysvr4.
- -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
- | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
- | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
- | -sym* | -kopensolaris* | -plan9* \
- | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
- | -aos* | -aros* | -cloudabi* | -sortix* \
- | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
- | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
- | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \
- | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \
- | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
- | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
- | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
- | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* | -hcos* \
- | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \
- | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
- | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
- | -linux-newlib* | -linux-musl* | -linux-uclibc* \
- | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
- | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \
- | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
- | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
- | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
- | -morphos* | -superux* | -rtmk* | -windiss* \
- | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
- | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \
- | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \
- | -midnightbsd*)
- # Remember, each alternative MUST END IN *, to match a version number.
- ;;
- -qnx*)
- case $basic_machine in
- x86-* | i*86-*)
- ;;
- *)
- os=-nto$os
- ;;
- esac
+ # Some version numbers need modification
+ chorusos*)
+ os=chorusos
;;
- -nto-qnx*)
+ isc)
+ os=isc2.2
;;
- -nto*)
- os=`echo $os | sed -e 's|nto|nto-qnx|'`
+ sco6)
+ os=sco5v6
;;
- -sim | -xray | -os68k* | -v88r* \
- | -windows* | -osx | -abug | -netware* | -os9* \
- | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ sco5)
+ os=sco3.2v5
;;
- -mac*)
- os=`echo "$os" | sed -e 's|mac|macos|'`
+ sco4)
+ os=sco3.2v4
;;
- -linux-dietlibc)
- os=-linux-dietlibc
+ sco3.2.[4-9]*)
+ os=$(echo $os | sed -e 's/sco3.2./sco3.2v/')
;;
- -linux*)
- os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ sco*v* | scout)
+ # Don't match below
;;
- -sunos5*)
- os=`echo "$os" | sed -e 's|sunos5|solaris2|'`
+ sco*)
+ os=sco3.2v2
;;
- -sunos6*)
- os=`echo "$os" | sed -e 's|sunos6|solaris3|'`
+ psos*)
+ os=psos
;;
- -opened*)
- os=-openedition
+ qnx*)
+ os=qnx
;;
- -os400*)
- os=-os400
+ hiux*)
+ os=hiuxwe2
;;
- -wince*)
- os=-wince
+ lynx*178)
+ os=lynxos178
;;
- -utek*)
- os=-bsd
+ lynx*5)
+ os=lynxos5
;;
- -dynix*)
- os=-bsd
+ lynxos*)
+ # don't get caught up in next wildcard
;;
- -acis*)
- os=-aos
+ lynx*)
+ os=lynxos
;;
- -atheos*)
- os=-atheos
+ mac[0-9]*)
+ os=$(echo "$os" | sed -e 's|mac|macos|')
;;
- -syllable*)
- os=-syllable
+ opened*)
+ os=openedition
;;
- -386bsd)
- os=-bsd
+ os400*)
+ os=os400
;;
- -ctix* | -uts*)
- os=-sysv
+ sunos5*)
+ os=$(echo "$os" | sed -e 's|sunos5|solaris2|')
;;
- -nova*)
- os=-rtmk-nova
+ sunos6*)
+ os=$(echo "$os" | sed -e 's|sunos6|solaris3|')
;;
- -ns2)
- os=-nextstep2
+ wince*)
+ os=wince
;;
- -nsk*)
- os=-nsk
+ utek*)
+ os=bsd
;;
- # Preserve the version number of sinix5.
- -sinix5.*)
- os=`echo $os | sed -e 's|sinix|sysv|'`
+ dynix*)
+ os=bsd
+ ;;
+ acis*)
+ os=aos
+ ;;
+ atheos*)
+ os=atheos
+ ;;
+ syllable*)
+ os=syllable
+ ;;
+ 386bsd)
+ os=bsd
+ ;;
+ ctix* | uts*)
+ os=sysv
+ ;;
+ nova*)
+ os=rtmk-nova
;;
- -sinix*)
- os=-sysv4
+ ns2)
+ os=nextstep2
;;
- -tpf*)
- os=-tpf
+ # Preserve the version number of sinix5.
+ sinix5.*)
+ os=$(echo $os | sed -e 's|sinix|sysv|')
;;
- -triton*)
- os=-sysv3
+ sinix*)
+ os=sysv4
;;
- -oss*)
- os=-sysv3
+ tpf*)
+ os=tpf
;;
- -svr4*)
- os=-sysv4
+ triton*)
+ os=sysv3
;;
- -svr3)
- os=-sysv3
+ oss*)
+ os=sysv3
;;
- -sysvr4)
- os=-sysv4
+ svr4*)
+ os=sysv4
;;
- # This must come after -sysvr4.
- -sysv*)
+ svr3)
+ os=sysv3
;;
- -ose*)
- os=-ose
+ sysvr4)
+ os=sysv4
;;
- -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
- os=-mint
+ ose*)
+ os=ose
;;
- -zvmoe)
- os=-zvmoe
+ *mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
+ os=mint
;;
- -dicos*)
- os=-dicos
+ dicos*)
+ os=dicos
;;
- -pikeos*)
+ pikeos*)
# Until real need of OS specific support for
# particular features comes up, bare metal
# configurations are quite functional.
- case $basic_machine in
+ case $cpu in
arm*)
- os=-eabi
+ os=eabi
;;
*)
- os=-elf
+ os=elf
;;
esac
;;
- -nacl*)
- ;;
- -ios)
- ;;
- -none)
- ;;
*)
- # Get rid of the `-' at the beginning of $os.
- os=`echo $os | sed 's/[^-]*-//'`
- echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2
- exit 1
+ # No normalization, but not necessarily accepted, that comes below.
;;
esac
+
else
# Here we handle the default operating systems that come with various machines.
@@ -1543,254 +1497,352 @@ else
# will signal an error saying that MANUFACTURER isn't an operating
# system, and we'll never get to this point.
-case $basic_machine in
+kernel=
+case $cpu-$vendor in
score-*)
- os=-elf
+ os=elf
;;
spu-*)
- os=-elf
+ os=elf
;;
*-acorn)
- os=-riscix1.2
+ os=riscix1.2
;;
arm*-rebel)
- os=-linux
+ kernel=linux
+ os=gnu
;;
arm*-semi)
- os=-aout
+ os=aout
;;
c4x-* | tic4x-*)
- os=-coff
+ os=coff
;;
c8051-*)
- os=-elf
+ os=elf
+ ;;
+ clipper-intergraph)
+ os=clix
;;
hexagon-*)
- os=-elf
+ os=elf
;;
tic54x-*)
- os=-coff
+ os=coff
;;
tic55x-*)
- os=-coff
+ os=coff
;;
tic6x-*)
- os=-coff
+ os=coff
;;
# This must come before the *-dec entry.
pdp10-*)
- os=-tops20
+ os=tops20
;;
pdp11-*)
- os=-none
+ os=none
;;
*-dec | vax-*)
- os=-ultrix4.2
+ os=ultrix4.2
;;
m68*-apollo)
- os=-domain
+ os=domain
;;
i386-sun)
- os=-sunos4.0.2
+ os=sunos4.0.2
;;
m68000-sun)
- os=-sunos3
+ os=sunos3
;;
m68*-cisco)
- os=-aout
+ os=aout
;;
mep-*)
- os=-elf
+ os=elf
;;
mips*-cisco)
- os=-elf
+ os=elf
;;
mips*-*)
- os=-elf
+ os=elf
;;
or32-*)
- os=-coff
+ os=coff
;;
*-tti) # must be before sparc entry or we get the wrong os.
- os=-sysv3
+ os=sysv3
;;
sparc-* | *-sun)
- os=-sunos4.1.1
+ os=sunos4.1.1
;;
pru-*)
- os=-elf
+ os=elf
;;
*-be)
- os=-beos
+ os=beos
;;
*-ibm)
- os=-aix
+ os=aix
;;
*-knuth)
- os=-mmixware
+ os=mmixware
;;
*-wec)
- os=-proelf
+ os=proelf
;;
*-winbond)
- os=-proelf
+ os=proelf
;;
*-oki)
- os=-proelf
+ os=proelf
;;
*-hp)
- os=-hpux
+ os=hpux
;;
*-hitachi)
- os=-hiux
+ os=hiux
;;
i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
- os=-sysv
+ os=sysv
;;
*-cbm)
- os=-amigaos
+ os=amigaos
;;
*-dg)
- os=-dgux
+ os=dgux
;;
*-dolphin)
- os=-sysv3
+ os=sysv3
;;
m68k-ccur)
- os=-rtu
+ os=rtu
;;
m88k-omron*)
- os=-luna
+ os=luna
;;
*-next)
- os=-nextstep
+ os=nextstep
;;
*-sequent)
- os=-ptx
+ os=ptx
;;
*-crds)
- os=-unos
+ os=unos
;;
*-ns)
- os=-genix
+ os=genix
;;
i370-*)
- os=-mvs
+ os=mvs
;;
*-gould)
- os=-sysv
+ os=sysv
;;
*-highlevel)
- os=-bsd
+ os=bsd
;;
*-encore)
- os=-bsd
+ os=bsd
;;
*-sgi)
- os=-irix
+ os=irix
;;
*-siemens)
- os=-sysv4
+ os=sysv4
;;
*-masscomp)
- os=-rtu
+ os=rtu
;;
f30[01]-fujitsu | f700-fujitsu)
- os=-uxpv
+ os=uxpv
;;
*-rom68k)
- os=-coff
+ os=coff
;;
*-*bug)
- os=-coff
+ os=coff
;;
*-apple)
- os=-macos
+ os=macos
;;
*-atari*)
- os=-mint
+ os=mint
+ ;;
+ *-wrs)
+ os=vxworks
;;
*)
- os=-none
+ os=none
;;
esac
+
fi
+# Now, validate our (potentially fixed-up) OS.
+case $os in
+ # Sometimes we do "kernel-abi", so those need to count as OSes.
+ musl* | newlib* | uclibc*)
+ ;;
+ # Likewise for "kernel-libc"
+ eabi | eabihf | gnueabi | gnueabihf)
+ ;;
+ # Now accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST end in a * to match a version number.
+ gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
+ | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \
+ | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
+ | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \
+ | hiux* | abug | nacl* | netware* | windows* \
+ | os9* | macos* | osx* | ios* \
+ | mpw* | magic* | mmixware* | mon960* | lnews* \
+ | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
+ | aos* | aros* | cloudabi* | sortix* | twizzler* \
+ | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
+ | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
+ | mirbsd* | netbsd* | dicos* | openedition* | ose* \
+ | bitrig* | openbsd* | solidbsd* | libertybsd* | os108* \
+ | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \
+ | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
+ | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
+ | udi* | lites* | ieee* | go32* | aux* | hcos* \
+ | chorusrdb* | cegcc* | glidix* \
+ | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
+ | midipix* | mingw32* | mingw64* | mint* \
+ | uxpv* | beos* | mpeix* | udk* | moxiebox* \
+ | interix* | uwin* | mks* | rhapsody* | darwin* \
+ | openstep* | oskit* | conix* | pw32* | nonstopux* \
+ | storm-chaos* | tops10* | tenex* | tops20* | its* \
+ | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \
+ | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \
+ | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
+ | skyos* | haiku* | rdos* | toppers* | drops* | es* \
+ | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
+ | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
+ | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx*)
+ ;;
+ # This one is extra strict with allowed versions
+ sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ ;;
+ none)
+ ;;
+ *)
+ echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# As a final step for OS-related things, validate the OS-kernel combination
+# (given a valid OS), if there is a kernel.
+case $kernel-$os in
+ linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* | linux-musl* | linux-uclibc* )
+ ;;
+ uclinux-uclibc* )
+ ;;
+ -dietlibc* | -newlib* | -musl* | -uclibc* )
+ # These are just libc implementations, not actual OSes, and thus
+ # require a kernel.
+ echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2
+ exit 1
+ ;;
+ kfreebsd*-gnu* | kopensolaris*-gnu*)
+ ;;
+ nto-qnx*)
+ ;;
+ os2-emx)
+ ;;
+ *-eabi* | *-gnueabi*)
+ ;;
+ -*)
+ # Blank kernel with real OS is always fine.
+ ;;
+ *-*)
+ echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2
+ exit 1
+ ;;
+esac
+
# Here we handle the case where we know the os, and the CPU type, but not the
# manufacturer. We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
- *-unknown)
- case $os in
- -riscix*)
+case $vendor in
+ unknown)
+ case $cpu-$os in
+ *-riscix*)
vendor=acorn
;;
- -sunos*)
+ *-sunos*)
vendor=sun
;;
- -cnk*|-aix*)
+ *-cnk* | *-aix*)
vendor=ibm
;;
- -beos*)
+ *-beos*)
vendor=be
;;
- -hpux*)
+ *-hpux*)
vendor=hp
;;
- -mpeix*)
+ *-mpeix*)
vendor=hp
;;
- -hiux*)
+ *-hiux*)
vendor=hitachi
;;
- -unos*)
+ *-unos*)
vendor=crds
;;
- -dgux*)
+ *-dgux*)
vendor=dg
;;
- -luna*)
+ *-luna*)
vendor=omron
;;
- -genix*)
+ *-genix*)
vendor=ns
;;
- -mvs* | -opened*)
+ *-clix*)
+ vendor=intergraph
+ ;;
+ *-mvs* | *-opened*)
+ vendor=ibm
+ ;;
+ *-os400*)
vendor=ibm
;;
- -os400*)
+ s390-* | s390x-*)
vendor=ibm
;;
- -ptx*)
+ *-ptx*)
vendor=sequent
;;
- -tpf*)
+ *-tpf*)
vendor=ibm
;;
- -vxsim* | -vxworks* | -windiss*)
+ *-vxsim* | *-vxworks* | *-windiss*)
vendor=wrs
;;
- -aux*)
+ *-aux*)
vendor=apple
;;
- -hms*)
+ *-hms*)
vendor=hitachi
;;
- -mpw* | -macos*)
+ *-mpw* | *-macos*)
vendor=apple
;;
- -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*)
vendor=atari
;;
- -vos*)
+ *-vos*)
vendor=stratus
;;
esac
- basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"`
;;
esac
-echo "$basic_machine$os"
+echo "$cpu-$vendor-${kernel:+$kernel-}$os"
exit
# Local variables:
diff --git a/configure b/configure
index 68e04e2..4a03e1e 100755
--- a/configure
+++ b/configure
@@ -30,7 +30,6 @@ else
esac
fi
-
as_nl='
'
export as_nl
@@ -78,7 +77,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
}
fi
-
# IFS
# We need space, tab and new line, in precisely that order. Quoting is
# there to prevent editors from complaining about space-tab.
@@ -234,7 +232,6 @@ $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
fi; }
IFS=$as_save_IFS
-
if test "x$CONFIG_SHELL" != x; then :
export CONFIG_SHELL
# We cannot yet assume a decent shell, so we have to provide a
@@ -354,7 +351,6 @@ $as_echo X"$as_dir" |
test -z "$as_dirs" || eval "mkdir $as_dirs"
} || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
-
} # as_fn_mkdir_p
# as_fn_executable_p FILE
@@ -399,7 +395,6 @@ else
}
fi # as_fn_arith
-
# as_fn_error STATUS ERROR [LINENO LOG_FD]
# ----------------------------------------
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
@@ -461,7 +456,6 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits
-
as_lineno_1=$LINENO as_lineno_1a=$LINENO
as_lineno_2=$LINENO as_lineno_2a=$LINENO
eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
@@ -553,7 +547,6 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
# Sed expression to map a string onto a valid variable name.
as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
test -n "$DJDIR" || exec 7<&0 </dev/null
exec 6>&1
@@ -627,7 +620,7 @@ DEPEND
APPDEFAULTS
ANIM_LIBS
ANIM_OBJS
-GTK_EXTRA_OBJS
+FONT_DIR
HACK_CONF_DIR
PO_DATADIR
GTK_DATADIR
@@ -648,24 +641,16 @@ GL_EXES
JPEG_EXES
LOCK_OBJS
LOCK_SRCS
-SAVER_GL_LIBS
-SAVER_GL_OBJS
-SAVER_GL_SRCS
XFT_LIBS
XFT_OBJS
XFT_SRCS
-XMU_LIBS
-XMU_OBJS
-XMU_SRCS
PASSWD_OBJS
PASSWD_SRCS
MEN_OSX
SCRIPTS_OSX
+SYSTEMD_LIBS
EXES_SYSTEMD
EXES_OSX
-OBJCC
-COMMENT_DEMO_GLADE2_GTK_2_22_TAIL
-COMMENT_DEMO_GLADE2_GTK_2_22_HEAD
WITH_BROWSER
DEFAULT_TEXT_FILE
DEFAULT_IMAGE_DIRECTORY
@@ -675,11 +660,10 @@ NEW_LOGIN_COMMAND
COMMENT_PAM_CHECK_ACCOUNT
HAVE_PAM_FAIL_DELAY
INSTALL_PAM
-NEED_SETUID
INSTALL_DIRS
SETCAP_HACKS
SETUID_HACKS
-INSTALL_SETUID
+SETUID_AUTH
PROG_SETCAP
LIBCAP_LIBS
LIBCAP_CFLAGS
@@ -699,11 +683,19 @@ SAVER_LIBS
ALL_DEMO_PROGRAMS
PREFERRED_DEMO_PROGRAM
INCLUDES
-setcap_program
+PTHREAD_CFLAGS
+PTHREAD_LIBS
+PTHREAD_CXX
+PTHREAD_CC
+ax_pthread_config
+SED
+target_os
+target_vendor
+target_cpu
+target
+login_manager_tmp
gnome_url_show_program
gnome_open_program
-pkg_config
-login_manager_tmp
MKINSTALLDIRS
POSUB
POFILES
@@ -753,6 +745,7 @@ INTLTOOL_EXTRACT
INTLTOOL_MERGE
INTLTOOL_UPDATE
USE_NLS
+pkg_config
X_EXTRA_LIBS
X_LIBS
X_PRE_LIBS
@@ -766,10 +759,6 @@ INSTALL_DATA
INSTALL_SCRIPT
INSTALL_PROGRAM
CPP
-PTHREAD_CFLAGS
-PTHREAD_LIBS
-PTHREAD_CC
-ax_pthread_config
OBJEXT
EXEEXT
ac_ct_CC
@@ -804,7 +793,6 @@ infodir
docdir
oldincludedir
includedir
-runstatedir
localstatedir
sharedstatedir
sysconfdir
@@ -827,22 +815,30 @@ SHELL'
ac_subst_files=''
ac_user_opts='
enable_option_checking
-with_x_app_defaults
-with_pthread
enable_largefile
with_x
enable_nls
+with_app_defaults
with_hackdir
enable_subdir
with_configdir
+with_fontdir
with_dpms_ext
+with_xf86vmode_ext
with_xinerama_ext
+with_randr_ext
with_xinput_ext
-with_xf86vmode_ext
with_xf86gamma_ext
-with_randr_ext
+with_xidle_ext
+with_sgi_ext
+with_sgivc_ext
+with_readdisplay
+with_xshm_ext
+with_xdbe_ext
+with_xkb_ext
with_proc_interrupts
with_proc_oom
+with_systemd
enable_locking
enable_root_passwd
with_pam
@@ -850,26 +846,22 @@ with_pam_service_name
enable_pam_check_account_type
with_kerberos
with_shadow
-with_passwd_helper
-with_login_manager
with_gtk
with_motif
+with_login_manager
+with_image_directory
+with_text_file
+with_browser
+with_pthread
+with_gles
with_gl
+with_glx
with_gle
-with_gles
+with_jpeg
with_png
with_pixbuf
-with_jpeg
with_xft
-with_systemd
-with_xshm_ext
-with_xdbe_ext
-with_readdisplay
-with_image_directory
-with_text_file
-with_browser
with_setuid_hacks
-with_setcap_hacks
with_record_animation
'
ac_precious_vars='build_alias
@@ -883,7 +875,6 @@ CPPFLAGS
CPP
XMKMF'
-
# Initialize some variables set by options.
ac_init_help=
ac_init_version=false
@@ -920,7 +911,6 @@ datadir='${datarootdir}'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
-runstatedir='${localstatedir}/run'
includedir='${prefix}/include'
oldincludedir='/usr/include'
docdir='${datarootdir}/doc/${PACKAGE}'
@@ -1173,15 +1163,6 @@ do
| -silent | --silent | --silen | --sile | --sil)
silent=yes ;;
- -runstatedir | --runstatedir | --runstatedi | --runstated \
- | --runstate | --runstat | --runsta | --runst | --runs \
- | --run | --ru | --r)
- ac_prev=runstatedir ;;
- -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
- | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
- | --run=* | --ru=* | --r=*)
- runstatedir=$ac_optarg ;;
-
-sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
ac_prev=sbindir ;;
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@@ -1319,7 +1300,7 @@ fi
for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
datadir sysconfdir sharedstatedir localstatedir includedir \
oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
- libdir localedir mandir runstatedir
+ libdir localedir mandir
do
eval ac_val=\$$ac_var
# Remove trailing slashes.
@@ -1357,7 +1338,6 @@ test -n "$host_alias" && ac_tool_prefix=$host_alias-
test "$silent" = yes && exec 6>/dev/null
-
ac_pwd=`pwd` && test -n "$ac_pwd" &&
ac_ls_di=`ls -di .` &&
ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
@@ -1365,7 +1345,6 @@ ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
as_fn_error $? "pwd does not report name of working directory"
-
# Find the source files, if location was not specified.
if test -z "$srcdir"; then
ac_srcdir_defaulted=yes
@@ -1452,12 +1431,6 @@ Configuration:
-n, --no-create do not create output files
--srcdir=DIR find the sources in DIR [configure dir or \`..']
-Installation directories:
- --prefix=PREFIX install architecture-independent files in PREFIX
- [$ac_default_prefix]
- --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
- [PREFIX]
-
By default, \`make install' will install all the files in
\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
an installation prefix other than \`$ac_default_prefix' using \`--prefix',
@@ -1467,25 +1440,14 @@ For better control, use the options below.
Fine tuning of the installation directories:
--bindir=DIR user executables [EPREFIX/bin]
- --sbindir=DIR system admin executables [EPREFIX/sbin]
--libexecdir=DIR program executables [EPREFIX/libexec]
- --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
- --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
- --localstatedir=DIR modifiable single-machine data [PREFIX/var]
- --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
--libdir=DIR object code libraries [EPREFIX/lib]
--includedir=DIR C header files [PREFIX/include]
- --oldincludedir=DIR C header files for non-gcc [/usr/include]
--datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
--datadir=DIR read-only architecture-independent data [DATAROOTDIR]
- --infodir=DIR info documentation [DATAROOTDIR/info]
--localedir=DIR locale-dependent data [DATAROOTDIR/locale]
--mandir=DIR man documentation [DATAROOTDIR/man]
--docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE]
- --htmldir=DIR html documentation [DOCDIR]
- --dvidir=DIR dvi documentation [DOCDIR]
- --pdfdir=DIR pdf documentation [DOCDIR]
- --psdir=DIR ps documentation [DOCDIR]
_ACEOF
cat <<\_ACEOF
@@ -1497,6 +1459,7 @@ X features:
System types:
--build=BUILD configure for building on BUILD [guessed]
--host=HOST cross-compile to build programs to run on HOST [BUILD]
+ --target=TARGET configure for building compilers for TARGET [HOST]
_ACEOF
fi
@@ -1504,90 +1467,72 @@ if test -n "$ac_init_help"; then
cat <<\_ACEOF
-Optional Features:
- --disable-option-checking ignore unrecognized --enable/--with options
- --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
- --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
- --disable-largefile omit support for large files
- --disable-nls do not use Native Language Support
-
-Screen locking options:
- --enable-locking Compile in support for locking the display.
- --disable-locking Do not allow locking at all.
+Installation Options:
- --enable-root-passwd Allow root passwd to unlock screen.
- --disable-root-passwd Do not allow that.
- --enable-pam-check-account-type
- Whether PAM should check the result of account
- modules when authenticating. Only do this if you
- have account configured properly on your system.
-
-Optional Packages:
- --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
- --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
-
- --with-pthread Enables POSIX threads, for SMP support.
- --with-x use the X Window System
+ --prefix=PREFIX Install root of architecture-independent files.
+ --exec-prefix=EPREFIX Install root of architecture-dependent files.
+ --with-app-defaults=DIR Where to install the default settings file.
+ --with-hackdir=DIR Where to install the hundreds of demo executables.
+ --with-configdir=DIR Where to install the GUI configuration files.
+ --with-fontdir=DIR Where to install the extra font files.
+Server Extension Options:
-Installation options:
- --with-hackdir=DIR Where to install the hundreds of demo executables.
- Default: `PREFIX/libexec/xscreensaver/'
- --with-configdir=DIR Where to install the data files that describe each
- of the display modes to the GUI.
- Default: `PREFIX/share/xscreensaver/config/'
- --with-x-app-defaults=DIR
- Where to install xscreensaver configuration file.
-
- --with-dpms-ext Include support for the DPMS extension.
- --with-xinerama-ext Include support for the XINERAMA extension.
- --with-xinput-ext Include support for the XInput extension.
- --with-xf86vmode-ext Include support for XFree86 virtual screens.
+ --with-dpms-ext Include support for power management.
+ --with-xf86vmode-ext Include support for virtual screens.
+ --with-xinerama-ext Include support for multiple monitors.
+ --with-randr-ext Include support for multiple monitors.
+ --with-xinput-ext Include support for the XInput2 extension.
--with-xf86gamma-ext Include support for XFree86 gamma fading.
- --with-randr-ext Include support for the X Resize+Rotate extension.
- --with-proc-interrupts Include support for consulting the /proc/interrupts
- file to notice keyboard activity.
- --with-proc-oom Include support for disabling the OOM-killer.
- --with-pam Include support for PAM (Pluggable Auth Modules.)
- --with-pam-service-name NAME arg is the name of the PAM service that
- xscreensaver will authenticate as.
+ --with-xidle-ext Include support for the X11R5 XIDLE extension.
+ --with-sgi-ext Include support for the SGI SCREEN_SAVER extension.
+ --with-sgivc-ext Include support for the SGI-VIDEO-CONTROL extension.
+ --with-readdisplay Include support for the SGI XReadDisplay extension.
+ --with-xshm-ext Include support for the Shared Memory extension.
+ --with-xdbe-ext Include support for the DOUBLE-BUFFER extension.
+ --with-xkb-ext Include support for the X Keyboard extension.
+ --with-proc-interrupts Include support for consulting /proc/interrupts to
+ notice activity on PS/2 keyboards and mice.
+ --with-proc-oom Include support to duck the out-of-memory killer.
+ --with-systemd Support systemd requests to lock on suspend, and to
+ allow video players to inhibit the screen saver.
+
+Screen Locking Options:
+
+ --disable-locking Do not allow locking of the display at all.
+ --with-pam Include support for PAM (Pluggable Auth Modules).
+ --with-pam-service-name Set the name of the xscreensaver PAM service.
+ --enable-pam-account Whether PAM should check the result of account
+ modules when authenticating. Only do this if you
+ have "account" modules configured on your system.
+ --enable-root-passwd Allow the root passwd to unlock, if not using PAM.
--with-kerberos Include support for Kerberos authentication.
--with-shadow Include support for shadow password authentication.
- --with-passwd-helper Include support for an external password
- verification helper program.
- --with-login-manager Put a "New Login" button on the unlock dialog that
- runs a login manager like gdmflexiserver or kdmctl.
-User interface options:
+User Interface Options:
--with-gtk Use the Gtk toolkit for the user interface.
- --with-motif Use the Motif toolkit for the user interface
- (no longer supported.)
+ --with-motif Use the Motif toolkit for the user interface.
+ --with-login-manager Put a "New Login" button on the unlock dialog that
+ runs a login manager like gdmflexiserver or kdmctl.
+ --with-image-directory Some demos will display random images from here.
+ --with-text-file=FILE Some demos will use this as a source of text.
+ --with-browser=BROWSER The web browser used to open the "Help" URL.
-Graphics options:
+Graphics Options:
--with-gl Build those demos which depend on OpenGL.
- --with-gle Build those demos which depend on GLE
- (the OpenGL "extrusion" library.)
- --with-gles Target OpenGL ES 1.x API instead of OpenGL 1.3.
- --with-png Include support for the PNG library.
- --with-pixbuf Include support for the GDK-Pixbuf library in some
- demos, which will make it possible for them to read
- GIF, JPEG, and PNG files as well.
+ --with-gles Emulate OpenGL 1.3 in terms of OpenGL ES 1.x.
+ --with-glx Use GLX to interface OpenGL and X11 instead of EGL.
+ --with-gle Include support for the GL Extrusion library.
--with-jpeg Include support for the JPEG library.
+ --with-png Include support for the PNG library.
+ --with-pixbuf Include support for the GDK-Pixbuf library, which
+ allows the display of JPEG, PNG, GIF and SVG images.
--with-xft Include support for the X Freetype library.
- --with-systemd Build xscreensaver-systemd to lock on suspend.
- --with-xshm-ext Include support for the Shared Memory extension.
- --with-xdbe-ext Include support for the DOUBLE-BUFFER extension.
- --with-readdisplay Include support for the XReadDisplay extension.
- --with-image-directory Arg is the default directory from which some demos
- will choose random images to display.
- --with-text-file=FILE By default, some demos may display this file.
- --with-browser=BROWSER Specify the web browser used to show the help URL.
- --with-setuid-hacks Allow some demos to be installed `setuid root'
- (which is needed in order to ping other hosts.)
- --with-setcap-hacks Allow some demos to be installed with setcap
- (which is needed in order to ping other hosts.)
+ --with-pthread Enables POSIX threads, for SMP support.
+ --with-setuid-hacks Install the "sonar" demo as setuid root, which is
+ needed in order to ping other hosts.
--with-record-animation Include code for generating MP4 videos.
Some influential environment variables:
@@ -1687,7 +1632,7 @@ fi
ac_fn_c_try_compile ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext
+ rm -rf conftest.$ac_objext
if { { ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
@@ -1719,52 +1664,6 @@ fi
} # ac_fn_c_try_compile
-# ac_fn_c_try_link LINENO
-# -----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_link ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext conftest$ac_exeext
- if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest$ac_exeext && {
- test "$cross_compiling" = yes ||
- test -x conftest$ac_exeext
- }; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
- # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
- # interfere with the next link command; also delete a directory that is
- # left behind by Apple's compiler. We do this before executing the actions.
- rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_link
-
# ac_fn_c_try_cpp LINENO
# ----------------------
# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
@@ -1802,48 +1701,6 @@ fi
} # ac_fn_c_try_cpp
-# ac_fn_c_try_run LINENO
-# ----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_c_try_run ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
- { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; }; then :
- ac_retval=0
-else
- $as_echo "$as_me: program exited with status $ac_status" >&5
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=$ac_status
-fi
- rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_run
-
# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
# Tests whether HEADER exists, giving a warning if it cannot be compiled using
@@ -1891,7 +1748,7 @@ if ac_fn_c_try_cpp "$LINENO"; then :
else
ac_header_preproc=no
fi
-rm -f conftest.err conftest.i conftest.$ac_ext
+rm -rf conftest.err conftest.i conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
$as_echo "$ac_header_preproc" >&6; }
@@ -1931,6 +1788,48 @@ fi
} # ac_fn_c_check_header_mongrel
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: program exited with status $ac_status" >&5
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
# Tests whether HEADER exists and can be compiled using the include files in
@@ -2016,6 +1915,52 @@ $as_echo "$ac_res" >&6; }
} # ac_fn_c_check_type
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -rf conftest.$ac_objext conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
# ac_fn_c_check_func LINENO FUNC VAR
# ----------------------------------
# Tests whether FUNC exists, setting the cache variable VAR accordingly
@@ -2188,14 +2133,12 @@ IFS=$as_save_IFS
cat >&5 <<_ACEOF
-
## ----------- ##
## Core tests. ##
## ----------- ##
_ACEOF
-
# Keep a trace of the command line.
# Strip out --no-create and --no-recursion so they do not pile up.
# Strip out --silent because we don't want to record it for future runs.
@@ -2372,7 +2315,6 @@ cat >>confdefs.h <<_ACEOF
#define PACKAGE_URL "$PACKAGE_URL"
_ACEOF
-
# Let the site file select an alternate cache file if it wants to.
# Prefer an explicitly selected file to automatically selected ones.
ac_site_file1=NONE
@@ -2490,10 +2432,8 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
ac_config_headers="$ac_config_headers config.h"
-
echo "current directory: `pwd`"
echo "command line was: $0 $@"
@@ -2503,161 +2443,44 @@ echo "command line was: $0 $@"
#
###############################################################################
+# Defines in config.h are dumped out alphabetically rather than in any kind
+# of sane order, sigh.
+#
+# OS stuff.
+#
-
-
-
+#
+# X11 server stuff.
+#
# This only ever existed in X11R4 and X11R5.
-#AH_TEMPLATE([HAVE_XIDLE_EXTENSION],
-# [Define this if you have the XIDLE extension installed. If you
-# have the XIDLE extension, this is recommended. (You have this
-# extension if the file /usr/include/X11/extensions/xidle.h
-# exists.) Turning on this flag lets XScreenSaver work better with
-# servers which support this extension; but it will still work
-# with servers which do not suport it, so it's a good idea to
-# compile in support for it if you can.])
-
-# Using this extension will crash your X server and make fading not work.
-#AH_TEMPLATE([HAVE_MIT_SAVER_EXTENSION],
-# [Define this if you have the MIT-SCREEN-SAVER extension
-# installed. See the caveats about this extension, above.
-# (It's available if /usr/include/X11/extensions/scrnsaver.h
-# exists.)])
# This only ever existed on SGI hardware.
-#AH_TEMPLATE([HAVE_SGI_SAVER_EXTENSION],
-# [Define this if you have the SGI SCREEN_SAVER extension. This is
-# standard on Irix systems, and not available elsewhere.])
# This only ever existed on SGI hardware.
-#AH_TEMPLATE([HAVE_SGI_VC_EXTENSION],
-# [Define this if you have the SGI-VIDEO-CONTROL extension. This
-# is standard on Irix systems, and not available elsewhere.])
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+#AH_TEMPLATE([HAVE_XCOMPOSITE_EXTENSION],
+# [Define this if you have the X Composite Extension.])
+#
+# GUI stuff.
+#
+#
+# Image loading.
+#
+#
+# Graphics libraries.
+#
+#
+# Locking.
+#
+#AH_TEMPLATE([PASSWD_HELPER_PROGRAM],
+# [Define this to use a third-party password helper program.])
# After checking to see that --srcdir is correct (which AC_INIT does)
# check for some random other files that come later in the tar file,
@@ -2676,73 +2499,22 @@ done
###############################################################################
#
-# Query AX_PTHREAD, and figure out which compiler gets used.
-#
-###############################################################################
-
-
-
-
-###############################################################################
-#
-# Function to figure out how to run the compiler.
-#
-###############################################################################
-
-
-
-
-###############################################################################
-#
# Check for availability of various gcc command-line options.
#
###############################################################################
-
-
-
-
-
-
-# Need to disable Objective C extensions in ANSI C on MacOS X to work
-# around an Apple-specific gcc bug.
-#
-
-
###############################################################################
#
-# Function to figure out how to disable // comments in ANSI C code.
-#
-# (With recent gcc, this is done with "-std=c89". With older gcc, this
-# is done by passing "-lang-c89" to cpp, by passing "-Wp,-lang-c89" to
-# gcc. Old gcc doesn't support -std, and new gcc doesn't support -lang.
-# so much for compatibility!)
-#
-# UPDATE: apparently there is NO WAY to tell gcc 3.2.2 to require that
-# declarations preceed statements, without resorting to "-pedantic".
-# This means that there is no way to get gcc3 to issue warnings that
-# ensure that your code complies with the ANSI/ISO C89 standard, without
-# also drowning in totally useless warnings. Thank you master may I
-# have another.
-#
-# So, I give up, let's just use -pedantic.
+# Function to figure out how to run the compiler.
#
###############################################################################
-
-
-
-
-
###############################################################################
#
# Function to figure out how to create directory trees.
#
###############################################################################
-
-
-
###############################################################################
#
# Function to check whether gettimeofday() exists, and how to call it.
@@ -2750,9 +2522,6 @@ done
#
###############################################################################
-
-
-
###############################################################################
#
# Function to find perl5 (defines PERL and PERL_VERSION.)
@@ -2763,29 +2532,12 @@ done
perl_version_cmd='print $]'
-
-
-
-
-###############################################################################
-#
-# Function to demand "bc". Losers.
-#
-###############################################################################
-
-
-
###############################################################################
#
# Functions to check how to do ICMP PING requests.
#
###############################################################################
-
-
-
-
-
###############################################################################
#
# Functions to check for various X11 crap.
@@ -2794,42 +2546,13 @@ perl_version_cmd='print $]'
# Try and find the app-defaults directory.
# It sucks that autoconf doesn't do this already...
+# (AC_PATH_X_APP_DEFAULTS_XMKMF is no longer used.)
#
-
-###############################################################################
-#
-# Handle the --with-x-app-defaults option HERE
-#
-###############################################################################
-
-
-# Check whether --with-x-app-defaults was given.
-if test "${with_x_app_defaults+set}" = set; then :
- withval=$with_x_app_defaults; ac_cv_x_app_defaults="$withval"
-else
- eval ac_x_app_defaults="$withval"
-fi
-
-
-
-
-
-
-
-
-
-
-
# Random special-cases for X on certain pathological OSes.
# You know who you are.
#
-
-
-
-
-
###############################################################################
#
# Some utility functions to make checking for X things easier.
@@ -2839,28 +2562,20 @@ fi
# Like AC_CHECK_HEADER, but it uses the already-computed -I directories.
#
-
# Like AC_EGREP_HEADER, but it uses the already-computed -I directories.
#
-
-# Like AC_TRY_COMPILE, but it uses the already-computed -I directories.
+# Like AC_COMPILE_IFELSE but it uses the already-computed -I directories.
#
-
-
# Like AC_CHECK_LIB, but it uses the already-computed -I and -L directories.
# Use this sparingly; it probably doesn't work very well on X programs.
#
-
-# Like AC_TRY_RUN, but it uses the already-computed -I directories.
+# Like AC_RUN_IFELSE but it uses the already-computed -I directories.
# (But not the -L directories!)
#
-
-
-
# Usage: HANDLE_X_PATH_ARG([variable_name],
# [--command-line-option],
# [descriptive string])
@@ -2877,9 +2592,6 @@ fi
# as appropriate.
#
-
-
-
###############################################################################
###############################################################################
#
@@ -2888,11 +2600,14 @@ fi
###############################################################################
###############################################################################
+# Default $PATH might not contain /sbin and thus miss /sbin/setcap.
+#
+export PATH="$PATH:/usr/bin:/bin:/usr/sbin:/sbin"
+
# WTF! autoconf emits this *way* too late. Do it earlier.
test "x$prefix" = xNONE && prefix=$ac_default_prefix
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
# random compiler setup
ac_aux_dir=
for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
@@ -2922,7 +2637,6 @@ ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
-
# Make sure we can run config.sub.
$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
@@ -2960,7 +2674,6 @@ build_os=$*
IFS=$ac_save_IFS
case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
$as_echo_n "checking host system type... " >&6; }
if ${ac_cv_host+:} false; then :
@@ -2993,8 +2706,6 @@ host_os=$*
IFS=$ac_save_IFS
case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
-
-
ac_original_cc=$CC
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
@@ -3038,7 +2749,6 @@ else
$as_echo "no" >&6; }
fi
-
fi
if test -z "$ac_cv_prog_CC"; then
ac_ct_CC=$CC
@@ -3131,7 +2841,6 @@ else
$as_echo "no" >&6; }
fi
-
fi
fi
if test -z "$CC"; then
@@ -3188,7 +2897,6 @@ else
$as_echo "no" >&6; }
fi
-
fi
if test -z "$CC"; then
if test -n "$ac_tool_prefix"; then
@@ -3230,7 +2938,6 @@ else
$as_echo "no" >&6; }
fi
-
test -n "$CC" && break
done
fi
@@ -3274,7 +2981,6 @@ else
$as_echo "no" >&6; }
fi
-
test -n "$ac_ct_CC" && break
done
@@ -3293,7 +2999,6 @@ fi
fi
-
test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "no acceptable C compiler found in \$PATH
@@ -3319,7 +3024,7 @@ $as_echo "$ac_try_echo"; } >&5
10q' conftest.err >conftest.er1
cat conftest.er1 >&5
fi
- rm -f conftest.er1 conftest.err
+ rm -rf conftest.er1 conftest.err
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
done
@@ -3457,11 +3162,11 @@ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of executables: cannot compile and link
See \`config.log' for more details" "$LINENO" 5; }
fi
-rm -f conftest conftest$ac_cv_exeext
+rm -rf conftest conftest$ac_cv_exeext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
$as_echo "$ac_cv_exeext" >&6; }
-rm -f conftest.$ac_ext
+rm -rf conftest.$ac_ext
EXEEXT=$ac_cv_exeext
ac_exeext=$EXEEXT
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -3521,7 +3226,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
$as_echo "$cross_compiling" >&6; }
-rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+rm -rf conftest.$ac_ext conftest$ac_cv_exeext conftest.out
ac_clean_files=$ac_clean_files_save
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
$as_echo_n "checking for suffix of object files... " >&6; }
@@ -3539,7 +3244,7 @@ main ()
return 0;
}
_ACEOF
-rm -f conftest.o conftest.obj
+rm -rf conftest.o conftest.obj
if { { ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
@@ -3568,7 +3273,7 @@ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of object files: cannot compile
See \`config.log' for more details" "$LINENO" 5; }
fi
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
+rm -rf conftest.$ac_cv_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
$as_echo "$ac_cv_objext" >&6; }
@@ -3758,7 +3463,7 @@ fi
rm -f core conftest.err conftest.$ac_objext
test "x$ac_cv_prog_cc_c89" != "xno" && break
done
-rm -f conftest.$ac_ext
+rm -rf conftest.$ac_ext
CC=$ac_save_CC
fi
@@ -3785,588 +3490,6 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-have_pthread=no
- with_pthread_req=unspecified
-
- # AX_PTHREAD is from the GNU Autoconf Archive.
- # https://savannah.gnu.org/projects/autoconf-archive/
- # ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_pthread.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
-#
-# DESCRIPTION
-#
-# This macro figures out how to build C programs using POSIX threads. It
-# sets the PTHREAD_LIBS output variable to the threads library and linker
-# flags, and the PTHREAD_CFLAGS output variable to any special C compiler
-# flags that are needed. (The user can also force certain compiler
-# flags/libs to be tested by setting these environment variables.)
-#
-# Also sets PTHREAD_CC to any special C compiler that is needed for
-# multi-threaded programs (defaults to the value of CC otherwise). (This
-# is necessary on AIX to use the special cc_r compiler alias.)
-#
-# NOTE: You are assumed to not only compile your program with these flags,
-# but also link it with them as well. e.g. you should link with
-# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
-#
-# If you are only building threads programs, you may wish to use these
-# variables in your default LIBS, CFLAGS, and CC:
-#
-# LIBS="$PTHREAD_LIBS $LIBS"
-# CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
-# CC="$PTHREAD_CC"
-#
-# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
-# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name
-# (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
-#
-# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the
-# PTHREAD_PRIO_INHERIT symbol is defined when compiling with
-# PTHREAD_CFLAGS.
-#
-# ACTION-IF-FOUND is a list of shell commands to run if a threads library
-# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it
-# is not found. If ACTION-IF-FOUND is not specified, the default action
-# will define HAVE_PTHREAD.
-#
-# Please let the authors know if this macro fails on any platform, or if
-# you have any other suggestions or comments. This macro was based on work
-# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help
-# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by
-# Alejandro Forero Cuervo to the autoconf macro repository. We are also
-# grateful for the helpful feedback of numerous users.
-#
-# Updated for Autoconf 2.68 by Daniel Richard G.
-#
-# LICENSE
-#
-# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
-# Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG>
-#
-# This program is free software: you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation, either version 3 of the License, or (at your
-# option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-# Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-# As a special exception, the respective Autoconf Macro's copyright owner
-# gives unlimited permission to copy, distribute and modify the configure
-# scripts that are the output of Autoconf when processing the Macro. You
-# need not follow the terms of the GNU General Public License when using
-# or distributing such scripts, even though portions of the text of the
-# Macro appear in them. The GNU General Public License (GPL) does govern
-# all other use of the material that constitutes the Autoconf Macro.
-#
-# This special exception to the GPL applies to versions of the Autoconf
-# Macro released by the Autoconf Archive. When you make and distribute a
-# modified version of the Autoconf Macro, you may extend this special
-# exception to the GPL to apply to your modified version as well.
-
-#serial 21
-
-# This is what autoupdate's m4 run will expand. It fires
-# the warning (with _au_warn_XXX), outputs it into the
-# updated configure.ac (with AC_DIAGNOSE), and then outputs
-# the replacement expansion.
-
-
-# This is an auxiliary macro that is also run when
-# autoupdate runs m4. It simply calls m4_warning, but
-# we need a wrapper so that each warning is emitted only
-# once. We break the quoting in m4_warning's argument in
-# order to expand this macro's arguments, not AU_DEFUN's.
-
-
-# Finally, this is the expansion that is picked up by
-# autoconf. It tells the user to run autoupdate, and
-# then outputs the replacement expansion. We do not care
-# about autoupdate's warning because that contains
-# information on what to do *after* running autoupdate.
-
-
-
- # This affects CC, LIBS, and CFLAGS, instead of defining new variables.
-
-
-# Check whether --with-pthread was given.
-if test "${with_pthread+set}" = set; then :
- withval=$with_pthread; with_pthread="$withval"; with_pthread_req="$withval"
-else
- with_pthread=yes
-fi
-
-
- if test "$with_pthread" = yes; then
- # AX_PTHREAD might want a different compiler.
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-ax_pthread_ok=no
-
-# We used to check for pthread.h first, but this fails if pthread.h
-# requires special compiler flags (e.g. on True64 or Sequent).
-# It gets checked for in the link test anyway.
-
-# First of all, check if the user has set any of the PTHREAD_LIBS,
-# etcetera environment variables, and if threads linking works using
-# them:
-if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
- save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
- save_LIBS="$LIBS"
- LIBS="$PTHREAD_LIBS $LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5
-$as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; }
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char pthread_join ();
-int
-main ()
-{
-return pthread_join ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ax_pthread_ok=yes
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5
-$as_echo "$ax_pthread_ok" >&6; }
- if test x"$ax_pthread_ok" = xno; then
- PTHREAD_LIBS=""
- PTHREAD_CFLAGS=""
- fi
- LIBS="$save_LIBS"
- CFLAGS="$save_CFLAGS"
-fi
-
-# We must check for the threads library under a number of different
-# names; the ordering is very important because some systems
-# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
-# libraries is broken (non-POSIX).
-
-# Create a list of thread flags to try. Items starting with a "-" are
-# C compiler flags, and other items are library names, except for "none"
-# which indicates that we try without any flags at all, and "pthread-config"
-# which is a program returning the flags for the Pth emulation library.
-
-ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
-
-# The ordering *is* (sometimes) important. Some notes on the
-# individual items follow:
-
-# pthreads: AIX (must check this before -lpthread)
-# none: in case threads are in libc; should be tried before -Kthread and
-# other compiler flags to prevent continual compiler warnings
-# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
-# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
-# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
-# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
-# -pthreads: Solaris/gcc
-# -mthreads: Mingw32/gcc, Lynx/gcc
-# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
-# doesn't hurt to check since this sometimes defines pthreads too;
-# also defines -D_REENTRANT)
-# ... -mt is also the pthreads flag for HP/aCC
-# pthread: Linux, etcetera
-# --thread-safe: KAI C++
-# pthread-config: use pthread-config program (for GNU Pth library)
-
-case ${host_os} in
- solaris*)
-
- # On Solaris (at least, for some versions), libc contains stubbed
- # (non-functional) versions of the pthreads routines, so link-based
- # tests will erroneously succeed. (We need to link with -pthreads/-mt/
- # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
- # a function called by this macro, so we could check for that, but
- # who knows whether they'll stub that too in a future libc.) So,
- # we'll just look for -pthreads and -lpthread first:
-
- ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags"
- ;;
-
- darwin*)
- ax_pthread_flags="-pthread $ax_pthread_flags"
- ;;
-esac
-
-# Clang doesn't consider unrecognized options an error unless we specify
-# -Werror. We throw in some extra Clang-specific options to ensure that
-# this doesn't happen for GCC, which also accepts -Werror.
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler needs -Werror to reject unknown flags" >&5
-$as_echo_n "checking if compiler needs -Werror to reject unknown flags... " >&6; }
-save_CFLAGS="$CFLAGS"
-ax_pthread_extra_flags="-Werror"
-CFLAGS="$CFLAGS $ax_pthread_extra_flags -Wunknown-warning-option -Wsizeof-array-argument"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-int foo(void);
-int
-main ()
-{
-foo()
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
- ax_pthread_extra_flags=
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-CFLAGS="$save_CFLAGS"
-
-if test x"$ax_pthread_ok" = xno; then
-for flag in $ax_pthread_flags; do
-
- case $flag in
- none)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5
-$as_echo_n "checking whether pthreads work without any flags... " >&6; }
- ;;
-
- -*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5
-$as_echo_n "checking whether pthreads work with $flag... " >&6; }
- PTHREAD_CFLAGS="$flag"
- ;;
-
- pthread-config)
- # Extract the first word of "pthread-config", so it can be a program name with args.
-set dummy pthread-config; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ax_pthread_config+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ax_pthread_config"; then
- ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ax_pthread_config="yes"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
- test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no"
-fi
-fi
-ax_pthread_config=$ac_cv_prog_ax_pthread_config
-if test -n "$ax_pthread_config"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5
-$as_echo "$ax_pthread_config" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- if test x"$ax_pthread_config" = xno; then continue; fi
- PTHREAD_CFLAGS="`pthread-config --cflags`"
- PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
- ;;
-
- *)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5
-$as_echo_n "checking for the pthreads library -l$flag... " >&6; }
- PTHREAD_LIBS="-l$flag"
- ;;
- esac
-
- save_LIBS="$LIBS"
- save_CFLAGS="$CFLAGS"
- LIBS="$PTHREAD_LIBS $LIBS"
- CFLAGS="$CFLAGS $PTHREAD_CFLAGS $ax_pthread_extra_flags"
-
- # Check for various functions. We must include pthread.h,
- # since some functions may be macros. (On the Sequent, we
- # need a special flag -Kthread to make this header compile.)
- # We check for pthread_join because it is in -lpthread on IRIX
- # while pthread_create is in libc. We check for pthread_attr_init
- # due to DEC craziness with -lpthreads. We check for
- # pthread_cleanup_push because it is one of the few pthread
- # functions on Solaris that doesn't have a non-functional libc stub.
- # We try pthread_create on general principles.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <pthread.h>
- static void routine(void *a) { a = 0; }
- static void *start_routine(void *a) { return a; }
-int
-main ()
-{
-pthread_t th; pthread_attr_t attr;
- pthread_create(&th, 0, start_routine, 0);
- pthread_join(th, 0);
- pthread_attr_init(&attr);
- pthread_cleanup_push(routine, 0);
- pthread_cleanup_pop(0) /* ; */
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ax_pthread_ok=yes
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-
- LIBS="$save_LIBS"
- CFLAGS="$save_CFLAGS"
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5
-$as_echo "$ax_pthread_ok" >&6; }
- if test "x$ax_pthread_ok" = xyes; then
- break;
- fi
-
- PTHREAD_LIBS=""
- PTHREAD_CFLAGS=""
-done
-fi
-
-# Various other checks:
-if test "x$ax_pthread_ok" = xyes; then
- save_LIBS="$LIBS"
- LIBS="$PTHREAD_LIBS $LIBS"
- save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
-
- # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5
-$as_echo_n "checking for joinable pthread attribute... " >&6; }
- attr_name=unknown
- for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <pthread.h>
-int
-main ()
-{
-int attr = $attr; return attr /* ; */
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- attr_name=$attr; break
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- done
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5
-$as_echo "$attr_name" >&6; }
- if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
-
-cat >>confdefs.h <<_ACEOF
-#define PTHREAD_CREATE_JOINABLE $attr_name
-_ACEOF
-
- fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5
-$as_echo_n "checking if more special flags are required for pthreads... " >&6; }
- flag=no
- case ${host_os} in
- aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";;
- osf* | hpux*) flag="-D_REENTRANT";;
- solaris*)
- if test "$GCC" = "yes"; then
- flag="-D_REENTRANT"
- else
- # TODO: What about Clang on Solaris?
- flag="-mt -D_REENTRANT"
- fi
- ;;
- esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag" >&5
-$as_echo "$flag" >&6; }
- if test "x$flag" != xno; then
- PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
- fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5
-$as_echo_n "checking for PTHREAD_PRIO_INHERIT... " >&6; }
-if ${ax_cv_PTHREAD_PRIO_INHERIT+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <pthread.h>
-int
-main ()
-{
-int i = PTHREAD_PRIO_INHERIT;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ax_cv_PTHREAD_PRIO_INHERIT=yes
-else
- ax_cv_PTHREAD_PRIO_INHERIT=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5
-$as_echo "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; }
- if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"; then :
-
-$as_echo "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h
-
-fi
-
- LIBS="$save_LIBS"
- CFLAGS="$save_CFLAGS"
-
- # More AIX lossage: compile with *_r variant
- if test "x$GCC" != xyes; then
- case $host_os in
- aix*)
- case "x/$CC" in #(
- x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6) :
- #handle absolute path differently from PATH based program lookup
- case "x$CC" in #(
- x/*) :
- if as_fn_executable_p ${CC}_r; then :
- PTHREAD_CC="${CC}_r"
-fi ;; #(
- *) :
- for ac_prog in ${CC}_r
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_PTHREAD_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$PTHREAD_CC"; then
- ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_PTHREAD_CC="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-PTHREAD_CC=$ac_cv_prog_PTHREAD_CC
-if test -n "$PTHREAD_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5
-$as_echo "$PTHREAD_CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$PTHREAD_CC" && break
-done
-test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
- ;;
-esac ;; #(
- *) :
- ;;
-esac
- ;;
- esac
- fi
-fi
-
-test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
-
-
-
-
-
-# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
-if test x"$ax_pthread_ok" = xyes; then
- if test "$CC" = "$PTHREAD_CC" -o -z "$ac_original_cc"; then
- have_pthread=yes
- else
- ac_prog_cc_no_pthread=yes
- fi
-
- :
-else
- ax_pthread_ok=no
-
-fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
- if test "$have_pthread" = yes; then
- $as_echo "#define HAVE_PTHREAD 1" >>confdefs.h
-
- CC=$PTHREAD_CC
- fi
- fi
- # Needs ac_original_cc.
-
-
-
if test -z "$GCC"; then
# not using GCC
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to request ANSI compilation" >&5
@@ -4401,165 +3524,233 @@ $as_echo "Solaris: adding -D__EXTENSIONS__" >&6; }
CC="$CC -D__EXTENSIONS__"
;;
esac
+
+ # Prior to 1996, XScreenSaver was written in K&R C, because ANSI C
+ # compilers (function prototypes!) were not yet universally deployed.
+ # And even after the conversion to ANSI C, GNU C's various non-standard
+ # extensions (such as allowing C++ style "//" comments in C code, and
+ # declarations after statements) were not supported by non-gcc compilers
+ # for many years, so we continued to use "-std=c89" to prevent those
+ # GNU-isms from sneaking in to the code. Well, these days various
+ # vendors have sloppily allowed non-ANSI syntax to slip into their
+ # library header files. GTK and OpenGL have been major offenders in this
+ # way. So... as of 2021, I guess we are forced to use "-std=gnu89", to
+ # allow those extensions, and hope that the warnings generated by
+ # "-pedantic" are heeded.
+ #
+ if test -n "$GCC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -std=gnu89" >&5
+$as_echo_n "checking whether gcc accepts -std=gnu89... " >&6; }
+if ${ac_cv_gcc_accepts_gnu89+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ rm -rf conftest.$ac_ext
+ touch conftest.$ac_ext
+ if ( ( gcc -c -std=gnu89 conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
+ grep unrecognized >/dev/null ); then
+ ac_cv_gcc_accepts_gnu89=no
+ else
+ ac_cv_gcc_accepts_gnu89=yes
+ CC="$CC -std=gnu89"
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_gnu89" >&5
+$as_echo "$ac_cv_gcc_accepts_gnu89" >&6; }
+ ac_gcc_accepts_gnu89="$ac_cv_gcc_accepts_gnu89"
fi
- OBJCC="$CC"
+ if test -n "$GCC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -pedantic" >&5
+$as_echo_n "checking whether gcc accepts -pedantic... " >&6; }
+if ${ac_cv_gcc_accepts_pedantic+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ rm -rf conftest.$ac_ext
+ touch conftest.$ac_ext
+ if ( ( gcc -c -pedantic conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
+ grep unrecognized >/dev/null ); then
+ ac_cv_gcc_accepts_pedantic=no
+ else
+ ac_cv_gcc_accepts_pedantic=yes
+ CC="$CC -pedantic"
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_pedantic" >&5
+$as_echo "$ac_cv_gcc_accepts_pedantic" >&6; }
+ ac_gcc_accepts_pedantic="$ac_cv_gcc_accepts_pedantic"
+ fi
- # This test makes cross-compiling fail, so let's just assume that nobody
- # is using a K&R compiler any more...
- #
-# AC_MSG_CHECKING([whether the compiler works on ANSI C])
-# AC_TRY_RUN([ main(int ac, char **av) { return 0; } ],
-# AC_MSG_RESULT(yes),
-# AC_MSG_RESULT(no)
-# AC_MSG_ERROR(Couldn't build even a trivial ANSI C program: check CC.),
-# AC_MSG_ERROR(Couldn't build even a trivial ANSI C program: check CC.))
-
- if test -n "$GCC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: Turning on gcc compiler warnings." >&5
-$as_echo "Turning on gcc compiler warnings." >&6; }
- CC="$CC -pedantic -Wall -Wstrict-prototypes -Wnested-externs -Wmissing-prototypes"
- OBJCC="$OBJCC -Wall"
- # As of gcc 3.4, we have "-Wdeclaration-after-statement"
- # and so perhaps now we can do without -pedantic?
- else
- case "$host" in
- *-irix5* |*-irix6.0-3* )
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: Turning on SGI compiler warnings." >&5
-$as_echo "Turning on SGI compiler warnings." >&6; }
- CC="$CC -fullwarn -use_readonly_const -rdata_shared -g3"
- ;;
-# *-dec-osf* )
-# if test -z "$GCC"; then
-# AC_MSG_RESULT(Turning on DEC C compiler warnings.)
-# CC="$CC -migrate -w0 -verbose -warnprotos"
-# fi
-# ;;
- esac
+ if test -n "$GCC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wall" >&5
+$as_echo_n "checking whether gcc accepts -Wall... " >&6; }
+if ${ac_cv_gcc_accepts_Wall+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ rm -rf conftest.$ac_ext
+ touch conftest.$ac_ext
+ if ( ( gcc -c -Wall conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
+ grep unrecognized >/dev/null ); then
+ ac_cv_gcc_accepts_Wall=no
+ else
+ ac_cv_gcc_accepts_Wall=yes
+ CC="$CC -Wall"
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_Wall" >&5
+$as_echo "$ac_cv_gcc_accepts_Wall" >&6; }
+ ac_gcc_accepts_Wall="$ac_cv_gcc_accepts_Wall"
fi
-if test -n "$GCC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wno-overlength-strings" >&5
-$as_echo_n "checking whether gcc accepts -Wno-overlength-strings... " >&6; }
-if ${ac_cv_gcc_accepts_no_overlength+:} false; then :
+ if test -n "$GCC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wnested-externs" >&5
+$as_echo_n "checking whether gcc accepts -Wnested-externs... " >&6; }
+if ${ac_cv_gcc_accepts_wnested_externs+:} false; then :
$as_echo_n "(cached) " >&6
else
rm -rf conftest.$ac_ext
touch conftest.$ac_ext
- if ( ( gcc -c -Wno-overlength-strings conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
+ if ( ( gcc -c -Wnested-externs conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
grep unrecognized >/dev/null ); then
- ac_cv_gcc_accepts_no_overlength=no
+ ac_cv_gcc_accepts_wnested_externs=no
else
- ac_cv_gcc_accepts_no_overlength=yes
- CC="$CC -Wno-overlength-strings"
+ ac_cv_gcc_accepts_wnested_externs=yes
+ CC="$CC -Wnested-externs"
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_no_overlength" >&5
-$as_echo "$ac_cv_gcc_accepts_no_overlength" >&6; }
- ac_gcc_accepts_no_overlength="$ac_cv_gcc_accepts_no_overlength"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_wnested_externs" >&5
+$as_echo "$ac_cv_gcc_accepts_wnested_externs" >&6; }
+ ac_gcc_accepts_wnested_externs="$ac_cv_gcc_accepts_wnested_externs"
fi
-if test -n "$GCC"; then
+ if test -n "$GCC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wstrict-prototypes" >&5
+$as_echo_n "checking whether gcc accepts -Wstrict-prototypes... " >&6; }
+if ${ac_cv_gcc_accepts_wstrict_prototypes+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ rm -rf conftest.$ac_ext
+ touch conftest.$ac_ext
+ if ( ( gcc -c -Wstrict-prototypes conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
+ grep unrecognized >/dev/null ); then
+ ac_cv_gcc_accepts_wstrict_prototypes=no
+ else
+ ac_cv_gcc_accepts_wstrict_prototypes=yes
+ CC="$CC -Wstrict-prototypes"
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_wstrict_prototypes" >&5
+$as_echo "$ac_cv_gcc_accepts_wstrict_prototypes" >&6; }
+ ac_gcc_accepts_wstrict_prototypes="$ac_cv_gcc_accepts_wstrict_prototypes"
+ fi
+
+ if test -n "$GCC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wmissing-prototypes" >&5
+$as_echo_n "checking whether gcc accepts -Wmissing-prototypes... " >&6; }
+if ${ac_cv_gcc_accepts_wmissing_prototypes+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ rm -rf conftest.$ac_ext
+ touch conftest.$ac_ext
+ if ( ( gcc -c -Wmissing-prototypes conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
+ grep unrecognized >/dev/null ); then
+ ac_cv_gcc_accepts_wmissing_prototypes=no
+ else
+ ac_cv_gcc_accepts_wmissing_prototypes=yes
+ CC="$CC -Wmissing-prototypes"
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_wmissing_prototypes" >&5
+$as_echo "$ac_cv_gcc_accepts_wmissing_prototypes" >&6; }
+ ac_gcc_accepts_wmissing_prototypes="$ac_cv_gcc_accepts_wmissing_prototypes"
+ fi
+
+ if test -n "$GCC"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wdeclaration-after-statement" >&5
$as_echo_n "checking whether gcc accepts -Wdeclaration-after-statement... " >&6; }
-if ${ac_cv_gcc_accepts_no_decl_after+:} false; then :
+if ${ac_cv_gcc_accepts_declaration_after+:} false; then :
$as_echo_n "(cached) " >&6
else
rm -rf conftest.$ac_ext
touch conftest.$ac_ext
if ( ( gcc -c -Wdeclaration-after-statement conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
grep unrecognized >/dev/null ); then
- ac_cv_gcc_accepts_no_decl_after=no
+ ac_cv_gcc_accepts_declaration_after=no
else
- ac_cv_gcc_accepts_no_decl_after=yes
+ ac_cv_gcc_accepts_declaration_after=yes
CC="$CC -Wdeclaration-after-statement"
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_no_decl_after" >&5
-$as_echo "$ac_cv_gcc_accepts_no_decl_after" >&6; }
- ac_gcc_accepts_no_decl_after="$ac_cv_gcc_accepts_no_decl_after"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_declaration_after" >&5
+$as_echo "$ac_cv_gcc_accepts_declaration_after" >&6; }
+ ac_gcc_accepts_declaration_after="$ac_cv_gcc_accepts_declaration_after"
fi
-if test -n "$GCC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -no-cpp-precomp" >&5
-$as_echo_n "checking whether gcc accepts -no-cpp-precomp... " >&6; }
-if ${ac_cv_gcc_accepts_no_cpp_precomp+:} false; then :
+ # "string length is greater than ISO C89 compilers required to support"
+ if test -n "$GCC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wno-overlength-strings" >&5
+$as_echo_n "checking whether gcc accepts -Wno-overlength-strings... " >&6; }
+if ${ac_cv_gcc_accepts_no_overlength_strings+:} false; then :
$as_echo_n "(cached) " >&6
else
rm -rf conftest.$ac_ext
touch conftest.$ac_ext
- if ( ( gcc -c -no-cpp-precomp conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
+ if ( ( gcc -c -Wno-overlength-strings conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
grep unrecognized >/dev/null ); then
- ac_cv_gcc_accepts_no_cpp_precomp=no
+ ac_cv_gcc_accepts_no_overlength_strings=no
else
- ac_cv_gcc_accepts_no_cpp_precomp=yes
- CC="$CC -no-cpp-precomp"
+ ac_cv_gcc_accepts_no_overlength_strings=yes
+ CC="$CC -Wno-overlength-strings"
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_no_cpp_precomp" >&5
-$as_echo "$ac_cv_gcc_accepts_no_cpp_precomp" >&6; }
- ac_gcc_accepts_no_cpp_precomp="$ac_cv_gcc_accepts_no_cpp_precomp"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_no_overlength_strings" >&5
+$as_echo "$ac_cv_gcc_accepts_no_overlength_strings" >&6; }
+ ac_gcc_accepts_no_overlength_strings="$ac_cv_gcc_accepts_no_overlength_strings"
fi
-if test -n "$GCC"; then
-
- case "$host" in
- *-darwin* )
- # Fucking Apple let // comments sneak into OpenGL headers, so
- # we *must* allow // comments when compiling on Mac OS 10.6! FUCK!
- ;;
- *)
- if test -n "$GCC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -std=c89" >&5
-$as_echo_n "checking whether gcc accepts -std=c89... " >&6; }
-if ${ac_cv_gcc_accepts_std+:} false; then :
+ # Ignore warnings about using "inline"
+ if test -n "$GCC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wno-language-extension-token" >&5
+$as_echo_n "checking whether gcc accepts -Wno-language-extension-token... " >&6; }
+if ${ac_cv_gcc_accepts_no_language_ext_token+:} false; then :
$as_echo_n "(cached) " >&6
else
rm -rf conftest.$ac_ext
touch conftest.$ac_ext
- if ( ( gcc -c -std=c89 conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
+ if ( ( gcc -c -Wno-language-extension-token conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
grep unrecognized >/dev/null ); then
- ac_cv_gcc_accepts_std=no
+ ac_cv_gcc_accepts_no_language_ext_token=no
else
- ac_cv_gcc_accepts_std=yes
- CC="$CC -std=c89"
+ ac_cv_gcc_accepts_no_language_ext_token=yes
+ CC="$CC -Wno-language-extension-token"
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_std" >&5
-$as_echo "$ac_cv_gcc_accepts_std" >&6; }
- ac_gcc_accepts_std="$ac_cv_gcc_accepts_std"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_no_language_ext_token" >&5
+$as_echo "$ac_cv_gcc_accepts_no_language_ext_token" >&6; }
+ ac_gcc_accepts_no_language_ext_token="$ac_cv_gcc_accepts_no_language_ext_token"
fi
- ;;
- esac
+ # Xlib headers use named variadic macros.
+ if test -n "$GCC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wno-variadic-macros" >&5
+$as_echo_n "checking whether gcc accepts -Wno-variadic-macros... " >&6; }
+if ${ac_cv_gcc_accepts_no_variadic_macros+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ rm -rf conftest.$ac_ext
+ touch conftest.$ac_ext
+ if ( ( gcc -c -Wno-variadic-macros conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
+ grep unrecognized >/dev/null ); then
+ ac_cv_gcc_accepts_no_variadic_macros=no
+ else
+ ac_cv_gcc_accepts_no_variadic_macros=yes
+ CC="$CC -Wno-variadic-macros"
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_no_variadic_macros" >&5
+$as_echo "$ac_cv_gcc_accepts_no_variadic_macros" >&6; }
+ ac_gcc_accepts_no_variadic_macros="$ac_cv_gcc_accepts_no_variadic_macros"
+ fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: Disabling C++ comments in ANSI C code." >&5
-$as_echo "Disabling C++ comments in ANSI C code." >&6; }
- #
- # The reason that // comments are banned from xscreensaver is that gcc is
- # basically the only compiler in the world that supports them in C code.
- # All other vendors support them only in their C++ compilers, not in their
- # ANSI C compilers. This means that it's a portability problem: every time
- # these comments have snuck into the xscreensaver source code, I've gotten
- # complaints about it the next day. So we turn off support for them in gcc
- # as well to prevent them from accidentially slipping in.
- #
- if test "$ac_gcc_accepts_std" = yes ; then
- #
- # -std=c89 defines __STRICT_ANSI__, which we don't want.
- # (That appears to be the only additional preprocessor symbol
- # it defines, in addition to the syntax changes it makes.)
- #
- # -std=gnu89 is no good, because // comments were a GNU extension
- # before they were in the ANSI C 99 spec... (gcc 2.96 permits //
- # with -std=gnu89 but not with -std=c89.)
- #
- # $CC already contains "-std=c89" via AC_GCC_ACCEPTS_STD
- CC="$CC -U__STRICT_ANSI__"
-# else
-# # The old way:
-# CC="$CC -Wp,-lang-c89"
- fi
fi
ac_ext=c
@@ -4604,7 +3795,7 @@ else
# Broken: fails on valid input.
continue
fi
-rm -f conftest.err conftest.i conftest.$ac_ext
+rm -rf conftest.err conftest.i conftest.$ac_ext
# OK, works on sane cases. Now check whether nonexistent headers
# can be detected and how.
@@ -4620,11 +3811,11 @@ else
ac_preproc_ok=:
break
fi
-rm -f conftest.err conftest.i conftest.$ac_ext
+rm -rf conftest.err conftest.i conftest.$ac_ext
done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
+rm -rf conftest.i conftest.err conftest.$ac_ext
if $ac_preproc_ok; then :
break
fi
@@ -4663,7 +3854,7 @@ else
# Broken: fails on valid input.
continue
fi
-rm -f conftest.err conftest.i conftest.$ac_ext
+rm -rf conftest.err conftest.i conftest.$ac_ext
# OK, works on sane cases. Now check whether nonexistent headers
# can be detected and how.
@@ -4679,11 +3870,11 @@ else
ac_preproc_ok=:
break
fi
-rm -f conftest.err conftest.i conftest.$ac_ext
+rm -rf conftest.err conftest.i conftest.$ac_ext
done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
+rm -rf conftest.i conftest.err conftest.$ac_ext
if $ac_preproc_ok; then :
else
@@ -4822,23 +4013,6 @@ _ACEOF
;;
esac
-
-ac_bc_result=`echo 6+9 | bc 2>/dev/null`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bc" >&5
-$as_echo_n "checking for bc... " >&6; }
- if test "$ac_bc_result" = "15" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- echo ''
- as_fn_error $? "Your system doesn't have \"bc\", which has been a standard
- part of Unix since the 1970s. Come back when your vendor
- has grown a clue." "$LINENO" 5
- fi
-
-
# stuff for Makefiles
# Find a good install program. We prefer a C program (faster),
# so one script is as good as another. But avoid the broken or
@@ -5005,7 +4179,7 @@ case `${MAKE-make} -f conftest.make 2>/dev/null` in
*)
eval ac_cv_prog_make_${ac_make}_set=no;;
esac
-rm -f conftest.make
+rm -rf conftest.make
fi
if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
@@ -5017,7 +4191,6 @@ $as_echo "no" >&6; }
SET_MAKE="MAKE=${MAKE-make}"
fi
-
# By default, autoconf sets INSTALL_SCRIPT to '${INSTALL_PROGRAM}'.
# That's wrong: it should be set to '${INSTALL}', so that one can
# implement the "install-strip" target properly (strip executables,
@@ -5069,7 +4242,7 @@ case `"$ac_path_GREP" --version 2>&1` in
# 10*(2^10) chars as input seems more than enough
test $ac_count -gt 10 && break
done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+ rm -rf conftest.in conftest.tmp conftest.nl conftest.out;;
esac
$ac_path_GREP_found && break 3
@@ -5089,7 +4262,6 @@ fi
$as_echo "$ac_cv_path_GREP" >&6; }
GREP="$ac_cv_path_GREP"
-
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
$as_echo_n "checking for egrep... " >&6; }
if ${ac_cv_path_EGREP+:} false; then :
@@ -5135,7 +4307,7 @@ case `"$ac_path_EGREP" --version 2>&1` in
# 10*(2^10) chars as input seems more than enough
test $ac_count -gt 10 && break
done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+ rm -rf conftest.in conftest.tmp conftest.nl conftest.out;;
esac
$ac_path_EGREP_found && break 3
@@ -5156,7 +4328,6 @@ fi
$as_echo "$ac_cv_path_EGREP" >&6; }
EGREP="$ac_cv_path_EGREP"
-
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
$as_echo_n "checking for ANSI C header files... " >&6; }
if ${ac_cv_header_stdc+:} false; then :
@@ -5197,7 +4368,7 @@ if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
else
ac_cv_header_stdc=no
fi
-rm -f conftest*
+rm -rf conftest*
fi
@@ -5214,7 +4385,7 @@ if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
else
ac_cv_header_stdc=no
fi
-rm -f conftest*
+rm -rf conftest*
fi
@@ -5285,7 +4456,6 @@ fi
done
-
for ac_header in unistd.h inttypes.h
do :
as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
@@ -5332,74 +4502,10 @@ _ACEOF
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5
-$as_echo_n "checking return type of signal handlers... " >&6; }
-if ${ac_cv_type_signal+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <sys/types.h>
-#include <signal.h>
-
-int
-main ()
-{
-return *(signal (0, 0)) (0) == 1;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_type_signal=int
-else
- ac_cv_type_signal=void
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5
-$as_echo "$ac_cv_type_signal" >&6; }
-
cat >>confdefs.h <<_ACEOF
-#define RETSIGTYPE $ac_cv_type_signal
+#define RETSIGTYPE void
_ACEOF
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5
-$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; }
-if ${ac_cv_header_time+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <sys/types.h>
-#include <sys/time.h>
-#include <time.h>
-
-int
-main ()
-{
-if ((struct tm *) 0)
-return 0;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_header_time=yes
-else
- ac_cv_header_time=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5
-$as_echo "$ac_cv_header_time" >&6; }
-if test $ac_cv_header_time = yes; then
-
-$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h
-
-fi
-
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5
$as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; }
if ${ac_cv_header_sys_wait_h+:} false; then :
@@ -5620,24 +4726,7 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
ac_gettimeofday_args=2
else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
- #include <sys/time.h>
-int
-main ()
-{
-struct timeval tv; gettimeofday(&tv);
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
ac_gettimeofday_args=1
-else
- ac_gettimeofday_args=0
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
ac_cv_gettimeofday_args=$ac_gettimeofday_args
@@ -5686,7 +4775,7 @@ else
We can't simply define LARGE_OFF_T to be 9223372036854775807,
since some C++ compilers masquerading as C compilers
incorrectly reject 9223372036854775807. */
-#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
&& LARGE_OFF_T % 2147483647 == 1)
? 1 : -1];
@@ -5710,7 +4799,7 @@ rm -f core conftest.err conftest.$ac_objext
break
done
CC=$ac_save_CC
- rm -f conftest.$ac_ext
+ rm -rf conftest.$ac_ext
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
@@ -5732,7 +4821,7 @@ else
We can't simply define LARGE_OFF_T to be 9223372036854775807,
since some C++ compilers masquerading as C compilers
incorrectly reject 9223372036854775807. */
-#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
&& LARGE_OFF_T % 2147483647 == 1)
? 1 : -1];
@@ -5756,7 +4845,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
We can't simply define LARGE_OFF_T to be 9223372036854775807,
since some C++ compilers masquerading as C compilers
incorrectly reject 9223372036854775807. */
-#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
&& LARGE_OFF_T % 2147483647 == 1)
? 1 : -1];
@@ -5801,7 +4890,7 @@ else
We can't simply define LARGE_OFF_T to be 9223372036854775807,
since some C++ compilers masquerading as C compilers
incorrectly reject 9223372036854775807. */
-#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
&& LARGE_OFF_T % 2147483647 == 1)
? 1 : -1];
@@ -5825,7 +4914,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
We can't simply define LARGE_OFF_T to be 9223372036854775807,
since some C++ compilers masquerading as C compilers
incorrectly reject 9223372036854775807. */
-#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
&& LARGE_OFF_T % 2147483647 == 1)
? 1 : -1];
@@ -5858,7 +4947,6 @@ esac
rm -rf conftest*
fi
-
fi
for ac_func in select fcntl uname nice setpriority getcwd getwd putenv sbrk
@@ -5916,7 +5004,6 @@ cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_SOCKADDR_SA_LEN 1
_ACEOF
-
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct icmp" >&5
@@ -6081,14 +5168,12 @@ else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
- #include <sys/types.h>
- #include <sys/socket.h>
+ #include <sys/types.h>
+ #include <sys/socket.h>
int
main ()
{
-
- socklen_t socklen;
-
+socklen_t socklen;
;
return 0;
}
@@ -6161,7 +5246,6 @@ else
$as_echo "no" >&6; }
fi
-
test -n "$PERL" && break
done
@@ -6180,7 +5264,6 @@ $as_echo "$ac_cv_perl_version" >&6; }
PERL_VERSION=$ac_cv_perl_version
fi
-
if test -z "$PERL" ; then
# don't let it be blank...
PERL=/usr/bin/perl
@@ -6189,7 +5272,6 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5
$as_echo_n "checking for X... " >&6; }
-
# Check whether --with-x was given.
if test "${with_x+set}" = set; then :
withval=$with_x;
@@ -6305,7 +5387,7 @@ else
fi
done
fi
-rm -f conftest.err conftest.i conftest.$ac_ext
+rm -rf conftest.err conftest.i conftest.$ac_ext
fi # $ac_x_includes = no
if test "$ac_x_libraries" = no; then
@@ -6869,95 +5951,10 @@ fi
fi
-
if test "$have_x" != yes; then
as_fn_error $? "Couldn't find X11 headers/libs. Try \`$0 --help'." "$LINENO" 5
fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X app-defaults directory" >&5
-$as_echo_n "checking for X app-defaults directory... " >&6; }
-if ${ac_cv_x_app_defaults+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- # skip this, it's always wrong these days.
- # AC_PATH_X_APP_DEFAULTS_XMKMF
- if test x"$ac_x_app_defaults" = x; then
- true
- # Look for the directory under a standard set of common directories.
- # Check X11 before X11Rn because it's often a symlink to the current release.
- for ac_dir in \
- \
- /usr/share/X11/app-defaults \
- \
- /usr/X11/lib/app-defaults \
- /usr/X11R6/lib/app-defaults \
- /usr/X11R6/lib/X11/app-defaults \
- /usr/X11R5/lib/app-defaults \
- /usr/X11R5/lib/X11/app-defaults \
- /usr/X11R4/lib/app-defaults \
- /usr/X11R4/lib/X11/app-defaults \
- \
- /usr/lib/X11/app-defaults \
- /usr/lib/X11R6/app-defaults \
- /usr/lib/X11R5/app-defaults \
- /usr/lib/X11R4/app-defaults \
- \
- /etc/X11/app-defaults \
- \
- /usr/local/X11/lib/app-defaults \
- /usr/local/X11R6/lib/app-defaults \
- /usr/local/X11R5/lib/app-defaults \
- /usr/local/X11R4/lib/app-defaults \
- \
- /usr/local/lib/X11/app-defaults \
- /usr/local/lib/X11R6/app-defaults \
- /usr/local/lib/X11R6/X11/app-defaults \
- /usr/local/lib/X11R5/app-defaults \
- /usr/local/lib/X11R5/X11/app-defaults \
- /usr/local/lib/X11R4/app-defaults \
- /usr/local/lib/X11R4/X11/app-defaults \
- \
- /usr/X386/lib/X11/app-defaults \
- /usr/x386/lib/X11/app-defaults \
- /usr/XFree86/lib/X11/app-defaults \
- \
- /usr/lib/X11/app-defaults \
- /usr/local/lib/X11/app-defaults \
- /usr/unsupported/lib/X11/app-defaults \
- /usr/athena/lib/X11/app-defaults \
- /usr/local/x11r5/lib/X11/app-defaults \
- /usr/lpp/Xamples/lib/X11/app-defaults \
- /lib/usr/lib/X11/app-defaults \
- \
- /usr/openwin/lib/app-defaults \
- /usr/openwin/lib/X11/app-defaults \
- /usr/openwin/share/lib/app-defaults \
- /usr/openwin/share/lib/X11/app-defaults \
- \
- /X11R6/lib/app-defaults \
- /X11R5/lib/app-defaults \
- /X11R4/lib/app-defaults \
- ; \
- do
- if test -d "$ac_dir"; then
- ac_x_app_defaults=$ac_dir
- break
- fi
- done
-
- fi
- if test x"$ac_x_app_defaults" = x; then
- /bin/echo -n 'fallback: '
- ac_cv_x_app_defaults="/usr/lib/X11/app-defaults"
- else
- # Record where we found app-defaults for the cache.
- ac_cv_x_app_defaults="$ac_x_app_defaults"
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_x_app_defaults" >&5
-$as_echo "$ac_cv_x_app_defaults" >&6; }
- eval ac_x_app_defaults="$ac_cv_x_app_defaults"
case "$host" in
*-hpux*)
@@ -7044,7 +6041,6 @@ case "$host" in
X_LIBS="-L/opt/Mesa/lib $X_LIBS"
fi
-
# On HPUX, default to installing in /opt/xscreensaver/ instead of
# in /usr/local/, unless there is already an xscreensaver in
# /usr/local/bin/. This can be overridden with the --prefix arg
@@ -7114,11 +6110,28 @@ fi
;;
*-darwin*)
- # On MacOS X (10.x with "fink"), many things are under /sw/.
- #
+ # MacPorts on macOS
+ if test -d /opt/local/include ; then
+ X_CFLAGS="-I/opt/local/include $X_CFLAGS"
+ X_LIBS="-L/opt/local/lib $X_LIBS"
+ fi
+
+ # Fink on macOS
if test -d /sw/include ; then
X_CFLAGS="-I/sw/include $X_CFLAGS"
- X_LIBS="-L/sw/lib $X_LIBS"
+ X_LIBS="-L/sw/lib $X_LIBS"
+ fi
+
+ # Homebrew on macOS Intel
+ if test -d /usr/local/include ; then
+ X_CFLAGS="-I/usr/local/include $X_CFLAGS"
+ X_LIBS="-L/usr/local/lib $X_LIBS"
+ fi
+
+ # Homebrew on macOS ARM
+ if test -d /opt/homebrew/include ; then
+ X_CFLAGS="-I/opt/homebrew/include $X_CFLAGS"
+ X_LIBS="-L/opt/homebrew/lib $X_LIBS"
fi
;;
esac
@@ -7159,18 +6172,195 @@ $as_echo "$ac_cv_xpointer" >&6; }
$as_echo "#define XPointer char*" >>confdefs.h
fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xt" >&5
+$as_echo_n "checking for Xt... " >&6; }
+if ${ac_cv_libxt+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether this is MacOS X" >&5
-$as_echo_n "checking whether this is MacOS X... " >&6; }
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <X11/Xlib.h>
+ #include <X11/Intrinsic.h>
+int
+main ()
+{
+Widget foo = (Widget) 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_libxt=yes
+else
+ ac_cv_libxt=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libxt" >&5
+$as_echo "$ac_cv_libxt" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether this is macOS" >&5
+$as_echo_n "checking whether this is macOS... " >&6; }
ac_macosx=no
+ ac_irix=no
case "$host" in
*-apple-darwin* )
ac_macosx=yes
;;
+ *-irix* )
+ ac_irix=yes
+ ;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_macosx" >&5
$as_echo "$ac_macosx" >&6; }
+###############################################################################
+#
+# pkg-config
+#
+###############################################################################
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_pkg_config+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $pkg_config in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_pkg_config="$pkg_config" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_pkg_config="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+pkg_config=$ac_cv_path_pkg_config
+if test -n "$pkg_config"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pkg_config" >&5
+$as_echo "$pkg_config" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+fi
+if test -z "$ac_cv_path_pkg_config"; then
+ ac_pt_pkg_config=$pkg_config
+ # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_pkg_config+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $ac_pt_pkg_config in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ac_pt_pkg_config="$ac_pt_pkg_config" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_ac_pt_pkg_config="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+ac_pt_pkg_config=$ac_cv_path_ac_pt_pkg_config
+if test -n "$ac_pt_pkg_config"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_pkg_config" >&5
+$as_echo "$ac_pt_pkg_config" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_pt_pkg_config" = x; then
+ pkg_config=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ pkg_config=$ac_pt_pkg_config
+ fi
+else
+ pkg_config="$ac_cv_path_pkg_config"
+fi
+
+if test -z "$pkg_config" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: pkg-config not found!" >&5
+$as_echo "$as_me: WARNING: pkg-config not found!" >&2;}
+ pkg_config="false"
+fi
+
+# Utility function for running pkg-config-based tests...
+#
+pkgs=''
+pkg_check_version() {
+ if test "$ok" = yes ; then
+ req="$1"
+ min="$2"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $req" >&5
+$as_echo_n "checking for $req... " >&6; }
+ if $pkg_config --exists "$req" ; then
+ vers=`$pkg_config --modversion "$req"`
+ if $pkg_config --exists "$req >= $min" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $vers" >&5
+$as_echo "$vers" >&6; }
+ pkgs="$pkgs $req"
+ return 1
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $vers (wanted >= $min)" >&5
+$as_echo "$vers (wanted >= $min)" >&6; }
+ ok=no
+ return 0
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ok=no
+ return 0
+ fi
+ fi
+}
###############################################################################
#
@@ -7178,6 +6368,13 @@ $as_echo "$ac_macosx" >&6; }
#
###############################################################################
+# Wow, this is complete madness. Why does po/Makefile.in.in exist?? Why does
+# aclocal.m4 exist?? Why can't I upgrade it without everything breaking??
+# This IT_PROG_INTLTOOL nonsense has so many self-modifying levels of insanity
+# that it *must* have been written by RMS. Or an equally demented protégé.
+# Won't someone please have mercy on us all and write a normal po/Makefile.in
+# that uses wildcards, and write a sane set of rules to detect gettext(3) and
+# msgfmt(1) and just do the obviously straightforward thing?
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5
$as_echo_n "checking whether NLS is requested... " >&6; }
@@ -7191,9 +6388,6 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5
$as_echo "$USE_NLS" >&6; }
-
-
-
case "$am__api_version" in
1.01234)
as_fn_error $? "Automake 1.5 or newer is required to use intltool" "$LINENO" 5
@@ -7253,7 +6447,6 @@ else
$as_echo "no" >&6; }
fi
-
# Extract the first word of "intltool-merge", so it can be a program name with args.
set dummy intltool-merge; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
@@ -7293,7 +6486,6 @@ else
$as_echo "no" >&6; }
fi
-
# Extract the first word of "intltool-extract", so it can be a program name with args.
set dummy intltool-extract; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
@@ -7333,7 +6525,6 @@ else
$as_echo "no" >&6; }
fi
-
if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then
as_fn_error $? "The intltool scripts were not found. Please install intltool." "$LINENO" 5
fi
@@ -7342,21 +6533,14 @@ if test -z "$AM_DEFAULT_VERBOSITY"; then
AM_DEFAULT_VERBOSITY=1
fi
-
INTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))'
INTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))'
INTLTOOL__v_MERGE_0='@echo " ITMRG " $@;'
-
-
-
INTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))'
intltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))'
intltool__v_merge_options_0='-q'
-
-
-
INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
@@ -7381,102 +6565,6 @@ fi
INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# Check the gettext tools to make sure they are GNU
# Extract the first word of "xgettext", so it can be a program name with args.
set dummy xgettext; ac_word=$2
@@ -7517,7 +6605,6 @@ else
$as_echo "no" >&6; }
fi
-
# Extract the first word of "msgmerge", so it can be a program name with args.
set dummy msgmerge; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
@@ -7557,7 +6644,6 @@ else
$as_echo "no" >&6; }
fi
-
# Extract the first word of "msgfmt", so it can be a program name with args.
set dummy msgfmt; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
@@ -7597,7 +6683,6 @@ else
$as_echo "no" >&6; }
fi
-
# Extract the first word of "gmsgfmt", so it can be a program name with args.
set dummy gmsgfmt; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
@@ -7638,7 +6723,6 @@ else
$as_echo "no" >&6; }
fi
-
if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then
as_fn_error $? "GNU gettext tools not found; required for intltool" "$LINENO" 5
fi
@@ -7651,23 +6735,12 @@ fi
# Substitute ALL_LINGUAS so we can use it in po/Makefile
-
-
-
-
GETTEXT_PACKAGE=xscreensaver
cat >>confdefs.h <<_ACEOF
#define GETTEXT_PACKAGE "$GETTEXT_PACKAGE"
_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE "$GETTEXT_PACKAGE"
-_ACEOF
-
-
-
ALL_LINGUAS="da de es et fi fr hu it ja ko nb nl pl pt pt_BR ru sk sv vi wa zh_CN zh_TW"
for ac_header in locale.h
@@ -7717,14 +6790,12 @@ $as_echo "#define HAVE_LC_MESSAGES 1" >>confdefs.h
fi
USE_NLS=yes
-
gt_cv_have_gettext=no
CATOBJEXT=NONE
XGETTEXT=:
INTLLIBS=
-
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5
$as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; }
if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then :
@@ -7798,8 +6869,6 @@ $as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h
INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
fi
-
-
ac_fn_c_check_header_mongrel "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default"
if test "x$ac_cv_header_libintl_h" = xyes; then :
gt_cv_func_dgettext_libintl="no"
@@ -8009,7 +7078,6 @@ fi
fi
-
if test "$gt_cv_func_dgettext_libintl" != "yes" ; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if -liconv is needed to use gettext" >&5
$as_echo_n "checking if -liconv is needed to use gettext... " >&6; }
@@ -8265,7 +7333,6 @@ else
$as_echo "no" >&6; }
fi
-
# Extract the first word of "xgettext", so it can be a program name with args.
set dummy xgettext; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
@@ -8351,8 +7418,6 @@ rm -f core conftest.err conftest.$ac_objext \
fi
-
-
if test "$gt_cv_have_gettext" = "yes" ; then
$as_echo "#define ENABLE_NLS 1" >>confdefs.h
@@ -8374,24 +7439,11 @@ $as_echo "found xgettext program is not GNU xgettext; ignore it" >&6; }
ac_config_commands="$ac_config_commands default-1"
-
for lang in $ALL_LINGUAS; do
GMOFILES="$GMOFILES $lang.gmo"
POFILES="$POFILES $lang.po"
done
-
-
-
-
-
-
-
-
-
-
-
-
if test "$gt_cv_have_gettext" = "yes"; then
if test "x$ALL_LINGUAS" = "x"; then
LINGUAS=
@@ -8438,7 +7490,6 @@ $as_echo "$LINGUAS" >&6; }
MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
fi
-
test -d po || mkdir po
if test "x$srcdir" != "x."; then
if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then
@@ -8455,130 +7506,104 @@ $as_echo "$LINGUAS" >&6; }
MKINSTALLDIRS="$INSTALL_DIRS"
-
###############################################################################
#
-# Check for -lXmu (some fucked up vendors don't ship it...)
+# The --with-x-app-defaults option
#
###############################################################################
-have_xmu=no
+#### H1
- ac_save_CPPFLAGS="$CPPFLAGS"
- if test \! -z "$includedir" ; then
- CPPFLAGS="$CPPFLAGS -I$includedir"
- fi
- CPPFLAGS="$CPPFLAGS $X_CFLAGS"
- CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_compile "$LINENO" "X11/Xmu/Error.h" "ac_cv_header_X11_Xmu_Error_h" "#include <stdlib.h>
- #include <stdio.h>
- #include <X11/Intrinsic.h>
-"
-if test "x$ac_cv_header_X11_Xmu_Error_h" = xyes; then :
- have_xmu=yes
-fi
-
-
- CPPFLAGS="$ac_save_CPPFLAGS"
-if test "$have_xmu" = no ; then
- XMU_SRCS='$(UTILS_SRC)/xmu.c'
- XMU_OBJS='$(UTILS_BIN)/xmu.o'
- XMU_LIBS=''
+# Check whether --with-app-defaults was given.
+if test "${with_app_defaults+set}" = set; then :
+ withval=$with_app_defaults; ac_cv_x_app_defaults="$withval"
else
- XMU_SRCS=''
- XMU_OBJS=''
- XMU_LIBS='-lXmu'
- $as_echo "#define HAVE_XMU 1" >>confdefs.h
-
+ eval ac_x_app_defaults="$withval"
fi
-
-###############################################################################
-#
-# Check for the SunOS 4.1.x _get_wmShellWidgetClass bug.
-# See comp.windows.x FAQ question 124. The right fix is to
-# get OpenWindows 3.0 patches 100512-02 and 100573-03.
-#
-###############################################################################
-
-if test "$have_xmu" = yes ; then
- case "$host" in
- *-sunos4*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the SunOS 4.1.x _get_wmShellWidgetClass bug" >&5
-$as_echo_n "checking for the SunOS 4.1.x _get_wmShellWidgetClass bug... " >&6; }
-if ${ac_cv_sunos_xmu_bug+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_save_LDFLAGS="$LDFLAGS"
- if test \! -z "$x_libraries" ; then
- LDFLAGS="$LDFLAGS -L$x_libraries"
- fi
- # Note: this trick never works! (Generally.)
- # We're only getting away with using AC_TRY_LINK
- # with X libraries because we know it's SunOS.
- LDFLAGS="$LDFLAGS -lXmu -lXt -lX11 -lXext -lm"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_sunos_xmu_bug=no
-else
- ac_cv_sunos_xmu_bug=yes
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- LDFLAGS="$ac_save_LDFLAGS"
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sunos_xmu_bug" >&5
-$as_echo "$ac_cv_sunos_xmu_bug" >&6; }
- if test "$ac_cv_sunos_xmu_bug" = yes ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler understands -static" >&5
-$as_echo_n "checking whether the compiler understands -static... " >&6; }
-if ${ac_cv_ld_static+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X app-defaults directory" >&5
+$as_echo_n "checking for X app-defaults directory... " >&6; }
+if ${ac_cv_x_app_defaults+:} false; then :
$as_echo_n "(cached) " >&6
else
- ac_save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LDFLAGS -static"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
+ # skip this, it's always wrong these days.
+ # AC_PATH_X_APP_DEFAULTS_XMKMF
+ if test x"$ac_x_app_defaults" = x; then
+ true
+ # Look for the directory under a standard set of common directories.
+ # Check X11 before X11Rn because it's often a symlink to the current release.
+ for ac_dir in \
+ \
+ /usr/share/X11/app-defaults \
+ \
+ /usr/X11/lib/app-defaults \
+ /usr/X11R6/lib/app-defaults \
+ /usr/X11R6/lib/X11/app-defaults \
+ /usr/X11R5/lib/app-defaults \
+ /usr/X11R5/lib/X11/app-defaults \
+ /usr/X11R4/lib/app-defaults \
+ /usr/X11R4/lib/X11/app-defaults \
+ \
+ /usr/lib/X11/app-defaults \
+ /usr/lib/X11R6/app-defaults \
+ /usr/lib/X11R5/app-defaults \
+ /usr/lib/X11R4/app-defaults \
+ \
+ /etc/X11/app-defaults \
+ \
+ /usr/local/X11/lib/app-defaults \
+ /usr/local/X11R6/lib/app-defaults \
+ /usr/local/X11R5/lib/app-defaults \
+ /usr/local/X11R4/lib/app-defaults \
+ \
+ /usr/local/lib/X11/app-defaults \
+ /usr/local/lib/X11R6/app-defaults \
+ /usr/local/lib/X11R6/X11/app-defaults \
+ /usr/local/lib/X11R5/app-defaults \
+ /usr/local/lib/X11R5/X11/app-defaults \
+ /usr/local/lib/X11R4/app-defaults \
+ /usr/local/lib/X11R4/X11/app-defaults \
+ \
+ /usr/X386/lib/X11/app-defaults \
+ /usr/x386/lib/X11/app-defaults \
+ /usr/XFree86/lib/X11/app-defaults \
+ \
+ /usr/lib/X11/app-defaults \
+ /usr/local/lib/X11/app-defaults \
+ /usr/unsupported/lib/X11/app-defaults \
+ /usr/athena/lib/X11/app-defaults \
+ /usr/local/x11r5/lib/X11/app-defaults \
+ /usr/lpp/Xamples/lib/X11/app-defaults \
+ /lib/usr/lib/X11/app-defaults \
+ \
+ /usr/openwin/lib/app-defaults \
+ /usr/openwin/lib/X11/app-defaults \
+ /usr/openwin/share/lib/app-defaults \
+ /usr/openwin/share/lib/X11/app-defaults \
+ \
+ /X11R6/lib/app-defaults \
+ /X11R5/lib/app-defaults \
+ /X11R4/lib/app-defaults \
+ ; \
+ do
+ if test -d "$ac_dir"; then
+ ac_x_app_defaults=$ac_dir
+ break
+ fi
+ done
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_ld_static=yes
-else
- ac_cv_ld_static=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- LDFLAGS="$ac_save_LDFLAGS"
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_ld_static" >&5
-$as_echo "$ac_cv_ld_static" >&6; }
- if test "$ac_cv_ld_static" = yes ; then
- LDFLAGS="$LDFLAGS -static"
+ fi
+ if test x"$ac_x_app_defaults" = x; then
+ /bin/echo -n 'fallback: '
+ ac_cv_x_app_defaults="/usr/lib/X11/app-defaults"
else
- LDFLAGS="$LDFLAGS -Bstatic"
+ # Record where we found app-defaults for the cache.
+ ac_cv_x_app_defaults="$ac_x_app_defaults"
fi
- fi
- ;;
- esac
fi
-
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_x_app_defaults" >&5
+$as_echo "$ac_cv_x_app_defaults" >&6; }
+ eval ac_x_app_defaults="$ac_cv_x_app_defaults"
###############################################################################
#
@@ -8596,7 +7621,6 @@ else
with_hackdir=yes
fi
-
if test x"$with_hackdir" = xyes; then
HACKDIR='${libexecdir}/xscreensaver'
elif test x"$with_hackdir" = xno; then
@@ -8627,11 +7651,9 @@ if test -n "$obsolete_enable"; then
exit 1
fi
-
###############################################################################
#
# Handle the --with-configdir option
-# Help for --with-x-app-defaults option added.
#
###############################################################################
@@ -8645,7 +7667,6 @@ else
with_configdir=yes
fi
-
if test x"$with_configdir" = xyes; then
HACK_CONF_DIR='${datadir}/xscreensaver/config'
elif test x"$with_configdir" = xno; then
@@ -8662,111 +7683,39 @@ else
fi
fi
-
-
-
###############################################################################
#
-# Check for the SGI SCREEN_SAVER server extension.
+# Handle the --with-fontdir option
#
###############################################################################
-#have_sgi=no
-#with_sgi_req=unspecified
-#AC_ARG_WITH(sgi-ext,
-#[Except where noted, all of the --with options below can also take a
-#directory argument: for example, `--with-motif=/opt/Motif'. That would
-#cause /opt/Motif/include/ to be added to the -I list, and /opt/Motif/lib/
-#to be added to the -L list, assuming those directories exist.
-#
-#By default, support for each of these options will be built in, if the
-#relevant library routines exist. At run time, they will then be used
-#only if the X server being used supports them. Each --with option has
-#a corresponding --without option, to override building support for them
-#at all.
-#
-#Screen blanking and idle-detection options:
-#
-# --with-sgi-ext Include support for the SGI SCREEN_SAVER extension.],
-# [with_sgi="$withval"; with_sgi_req="$withval"],[with_sgi=yes])
-#
-#HANDLE_X_PATH_ARG(with_sgi, --with-sgi-ext, SGI SCREEN_SAVER)
-#
-#if test "$with_sgi" = yes; then
-# AC_CHECK_X_HEADER(X11/extensions/XScreenSaver.h,
-# [have_sgi=yes
-# AC_DEFINE(HAVE_SGI_SAVER_EXTENSION)],,
-# [#include <X11/Xlib.h>])
-#
-#elif test "$with_sgi" != no; then
-# echo "error: must be yes or no: --with-sgi-ext=$with_sgi"
-# exit 1
-#fi
-
-
-###############################################################################
-#
-# Check for the XIDLE server extension.
-#
-###############################################################################
-
-#have_xidle=no
-#with_xidle_req=unspecified
-#AC_ARG_WITH(xidle-ext,
-#[ --with-xidle-ext Include support for the XIDLE extension.],
-# [with_xidle="$withval"; with_xidle_req="$withval"],[with_xidle=yes])
-#
-#HANDLE_X_PATH_ARG(with_xidle, --with-xidle-ext, XIDLE)
-#
-#if test "$with_xidle" = yes; then
-# AC_CHECK_X_HEADER(X11/extensions/xidle.h,
-# [have_xidle=yes
-# AC_DEFINE(HAVE_XIDLE_EXTENSION)],,
-# [#include <X11/Xlib.h>])
-#elif test "$with_xidle" != no; then
-# echo "error: must be yes or no: --with-xidle-ext=$with_xidle"
-# exit 1
-#fi
-
-
-###############################################################################
-#
-# Check for the SGI-VIDEO-CONTROL server extension.
-#
-###############################################################################
+have_fontdir=yes
+with_fontdir_req=unspecified
-#have_sgivc=no
-#with_sgivc_req=unspecified
-#AC_ARG_WITH(sgivc-ext,
-#[ --with-sgivc-ext Include support for the SGI-VIDEO-CONTROL extension.],
-# [with_sgivc="$withval"; with_sgivc_req="$withval"],[with_sgivc=yes])
-#
-#HANDLE_X_PATH_ARG(with_sgivc, --with-sgivc-ext, SGI-VIDEO-CONTROL)
-#
-#if test "$with_sgivc" = yes; then
-#
-# # first check for XSGIvc.h
-# AC_CHECK_X_HEADER(X11/extensions/XSGIvc.h, [have_sgivc=yes],,
-# [#include <X11/Xlib.h>])
-#
-# # if that succeeded, then check for the -lXsgivc
-# if test "$have_sgivc" = yes; then
-# have_sgivc=no
-# AC_CHECK_X_LIB(Xsgivc, XSGIvcQueryGammaMap,
-# [have_sgivc=yes; SAVER_LIBS="$SAVER_LIBS -lXsgivc"], [true],
-# -lXext -lX11)
-# fi
-#
-# # if that succeeded, then we've really got it.
-# if test "$have_sgivc" = yes; then
-# AC_DEFINE(HAVE_SGI_VC_EXTENSION)
-# fi
-#
-#elif test "$with_sgivc" != no; then
-# echo "error: must be yes or no: --with-sgivc-ext=$with_sgivc"
-# exit 1
-#fi
+# Check whether --with-fontdir was given.
+if test "${with_fontdir+set}" = set; then :
+ withval=$with_fontdir; with_fontdir="$withval"; with_fontdir_req="$withval"
+else
+ with_fontdir=yes
+fi
+if test x"$with_fontdir" = xyes; then
+ FONT_DIR='${datarootdir}/fonts/xscreensaver'
+ if test "$ac_macosx" = yes; then
+ FONT_DIR='/Library/Fonts'
+ fi
+elif test x"$with_fontdir" = xno; then
+ FONT_DIR=''
+else
+ # there must be a better way than this...
+ if test -z "`echo $with_fontdir | sed 's@^/.*@@'`" ; then
+ # absolute path
+ FONT_DIR="$with_fontdir"
+ else
+ # relative path
+ FONT_DIR='${datarootdir}/fonts/'"$with_fontdir"
+ fi
+fi
###############################################################################
#
@@ -8774,6 +7723,8 @@ fi
#
###############################################################################
+#### H1
+
have_dpms=no
with_dpms_req=unspecified
@@ -8784,8 +7735,6 @@ else
with_dpms=yes
fi
-
-
case "$with_dpms" in
yes) ;;
no) ;;
@@ -8829,7 +7778,6 @@ $as_echo "not found ($d: no such directory)" >&6; }
;;
esac
-
if test "$with_dpms" = yes; then
# first check for dpms.h
@@ -8847,7 +7795,6 @@ if test "x$ac_cv_header_X11_extensions_dpms_h" = xyes; then :
have_dpms=yes
fi
-
CPPFLAGS="$ac_save_CPPFLAGS"
# if that succeeded, then check for the DPMS code in the libraries
@@ -8920,7 +7867,6 @@ fi
LDFLAGS="$ac_save_LDFLAGS"
# LIBS="$ac_save_LIBS"
-
# if that failed, look in -lXdpms (this is where it was in XFree86 3.x)
if test "$have_dpms" = no; then
@@ -8991,7 +7937,6 @@ fi
fi
fi
-
# if that succeeded, then we've really got it.
if test "$have_dpms" = yes; then
$as_echo "#define HAVE_DPMS_EXTENSION 1" >>confdefs.h
@@ -9003,33 +7948,30 @@ elif test "$with_dpms" != no; then
exit 1
fi
-
###############################################################################
#
-# Check for the XINERAMA server extension.
+# Check for the XF86VMODE server extension (for virtual screens.)
#
###############################################################################
-have_xinerama=no
-with_xinerama_req=unspecified
+have_xf86vmode=no
+with_xf86vmode_req=unspecified
-# Check whether --with-xinerama-ext was given.
-if test "${with_xinerama_ext+set}" = set; then :
- withval=$with_xinerama_ext; with_xinerama="$withval"; with_xinerama_req="$withval"
+# Check whether --with-xf86vmode-ext was given.
+if test "${with_xf86vmode_ext+set}" = set; then :
+ withval=$with_xf86vmode_ext; with_xf86vmode="$withval"; with_xf86vmode_req="$withval"
else
- with_xinerama=yes
+ with_xf86vmode=yes
fi
-
-
- case "$with_xinerama" in
+ case "$with_xf86vmode" in
yes) ;;
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XINERAMA headers" >&5
-$as_echo_n "checking for XINERAMA headers... " >&6; }
- d=$with_xinerama/include
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xf86vmode headers" >&5
+$as_echo_n "checking for xf86vmode headers... " >&6; }
+ d=$with_xf86vmode/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
@@ -9039,9 +7981,9 @@ $as_echo "$d" >&6; }
$as_echo "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XINERAMA libs" >&5
-$as_echo_n "checking for XINERAMA libs... " >&6; }
- d=$with_xinerama/lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xf86vmode libs" >&5
+$as_echo_n "checking for xf86vmode libs... " >&6; }
+ d=$with_xf86vmode/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
@@ -9052,20 +7994,42 @@ $as_echo "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
- with_xinerama_req="yes"
- with_xinerama=$with_xinerama_req
+ with_xf86vmode_req="yes"
+ with_xf86vmode=$with_xf86vmode_req
;;
*)
echo ""
- echo "error: argument to --with-xinerama-ext must be \"yes\", \"no\", or a directory."
+ echo "error: argument to --with-xf86vmode-ext must be \"yes\", \"no\", or a directory."
echo " If it is a directory, then \`DIR/include' will be added to"
echo " the -I list, and \`DIR/lib' will be added to the -L list."
exit 1
;;
esac
+VIDMODE_LIBS=""
+
+if test "$with_xf86vmode" = yes; then
+
+ # first check for xf86vmode.h
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "X11/extensions/xf86vmode.h" "ac_cv_header_X11_extensions_xf86vmode_h" "#include <X11/Xlib.h>
+"
+if test "x$ac_cv_header_X11_extensions_xf86vmode_h" = xyes; then :
+ have_xf86vmode=yes
+fi
+ CPPFLAGS="$ac_save_CPPFLAGS"
+
+ # if that succeeded, then check for the -lXxf86vm
+ if test "$have_xf86vmode" = yes; then
+ have_xf86vmode=no
ac_save_CPPFLAGS="$CPPFLAGS"
ac_save_LDFLAGS="$LDFLAGS"
@@ -9085,13 +8049,13 @@ $as_echo "not found ($d: no such directory)" >&6; }
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XScreenSaverQueryInfo in -lXss" >&5
-$as_echo_n "checking for XScreenSaverQueryInfo in -lXss... " >&6; }
-if ${ac_cv_lib_Xss_XScreenSaverQueryInfo+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XF86VidModeGetViewPort in -lXxf86vm" >&5
+$as_echo_n "checking for XF86VidModeGetViewPort in -lXxf86vm... " >&6; }
+if ${ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lXss -lXss -lX11 $LIBS"
+LIBS="-lXxf86vm -lXext -lX11 $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -9101,28 +8065,30 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
#ifdef __cplusplus
extern "C"
#endif
-char XScreenSaverQueryInfo ();
+char XF86VidModeGetViewPort ();
int
main ()
{
-return XScreenSaverQueryInfo ();
+return XF86VidModeGetViewPort ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_Xss_XScreenSaverQueryInfo=yes
+ ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort=yes
else
- ac_cv_lib_Xss_XScreenSaverQueryInfo=no
+ ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xss_XScreenSaverQueryInfo" >&5
-$as_echo "$ac_cv_lib_Xss_XScreenSaverQueryInfo" >&6; }
-if test "x$ac_cv_lib_Xss_XScreenSaverQueryInfo" = xyes; then :
- X_EXTRA_LIBS="$X_EXTRA_LIBS -lXss"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort" >&5
+$as_echo "$ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort" >&6; }
+if test "x$ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort" = xyes; then :
+ have_xf86vmode=yes;
+ VIDMODE_LIBS="-lXxf86vm";
+ SAVER_LIBS="$SAVER_LIBS $VIDMODE_LIBS"
else
true
fi
@@ -9131,7 +8097,77 @@ fi
LDFLAGS="$ac_save_LDFLAGS"
# LIBS="$ac_save_LIBS"
+ fi
+
+ # if that succeeded, then we've really got it.
+ if test "$have_xf86vmode" = yes; then
+ $as_echo "#define HAVE_XF86VMODE 1" >>confdefs.h
+
+ fi
+
+elif test "$with_xf86vmode" != no; then
+ echo "error: must be yes or no: --with-xf86vmode-ext=$with_xf86vmode"
+ exit 1
+fi
+
+###############################################################################
+#
+# Check for the XINERAMA server extension.
+#
+###############################################################################
+
+have_xinerama=no
+with_xinerama_req=unspecified
+
+# Check whether --with-xinerama-ext was given.
+if test "${with_xinerama_ext+set}" = set; then :
+ withval=$with_xinerama_ext; with_xinerama="$withval"; with_xinerama_req="$withval"
+else
+ with_xinerama=yes
+fi
+
+ case "$with_xinerama" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XINERAMA headers" >&5
+$as_echo_n "checking for XINERAMA headers... " >&6; }
+ d=$with_xinerama/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XINERAMA libs" >&5
+$as_echo_n "checking for XINERAMA libs... " >&6; }
+ d=$with_xinerama/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_xinerama_req="yes"
+ with_xinerama=$with_xinerama_req
+ ;;
+ *)
+ echo ""
+ echo "error: argument to --with-xinerama-ext must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
if test "$with_xinerama" = yes; then
@@ -9149,7 +8185,6 @@ if test "x$ac_cv_header_X11_extensions_Xinerama_h" = xyes; then :
have_xinerama=yes
fi
-
CPPFLAGS="$ac_save_CPPFLAGS"
# if that succeeded, then check for the XINERAMA code in the libraries
@@ -9222,7 +8257,6 @@ fi
LDFLAGS="$ac_save_LDFLAGS"
# LIBS="$ac_save_LIBS"
-
# if that failed, look in -lXinerama (this is where it is in XFree86 4.1.)
if test "$have_xinerama" = no; then
@@ -9304,33 +8338,34 @@ elif test "$with_xinerama" != no; then
exit 1
fi
-
###############################################################################
#
-# Check for the XINPUT server extension.
+# Check for the RANDR (Resize and Rotate) server extension.
+#
+# We need this to detect when the resolution of the desktop
+# has changed out from under us (this is a newer, different
+# mechanism than the XF86VMODE virtual viewports.)
#
###############################################################################
-have_xinput=no
-with_xinput_req=unspecified
+have_randr=no
+with_randr_req=unspecified
-# Check whether --with-xinput-ext was given.
-if test "${with_xinput_ext+set}" = set; then :
- withval=$with_xinput_ext; with_xinput="$withval"; with_xinput_req="$withval"
+# Check whether --with-randr-ext was given.
+if test "${with_randr_ext+set}" = set; then :
+ withval=$with_randr_ext; with_randr="$withval"; with_randr_req="$withval"
else
- with_xinput=yes
+ with_randr=yes
fi
-
-
- case "$with_xinput" in
+ case "$with_randr" in
yes) ;;
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XINPUT headers" >&5
-$as_echo_n "checking for XINPUT headers... " >&6; }
- d=$with_xinput/include
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for RANDR headers" >&5
+$as_echo_n "checking for RANDR headers... " >&6; }
+ d=$with_randr/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
@@ -9340,9 +8375,9 @@ $as_echo "$d" >&6; }
$as_echo "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XINPUT libs" >&5
-$as_echo_n "checking for XINPUT libs... " >&6; }
- d=$with_xinput/lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for RANDR libs" >&5
+$as_echo_n "checking for RANDR libs... " >&6; }
+ d=$with_randr/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
@@ -9353,23 +8388,22 @@ $as_echo "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
- with_xinput_req="yes"
- with_xinput=$with_xinput_req
+ with_randr_req="yes"
+ with_randr=$with_randr_req
;;
*)
echo ""
- echo "error: argument to --with-xinput-ext must be \"yes\", \"no\", or a directory."
+ echo "error: argument to --with-randr-ext must be \"yes\", \"no\", or a directory."
echo " If it is a directory, then \`DIR/include' will be added to"
echo " the -I list, and \`DIR/lib' will be added to the -L list."
exit 1
;;
esac
+if test "$with_randr" = yes; then
-if test "$with_xinput" = yes; then
-
- # first check for Xinput.h
+ # first check for Xrandr.h
ac_save_CPPFLAGS="$CPPFLAGS"
if test \! -z "$includedir" ; then
@@ -9377,18 +8411,86 @@ if test "$with_xinput" = yes; then
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_compile "$LINENO" "X11/extensions/XInput.h" "ac_cv_header_X11_extensions_XInput_h" "#include <X11/Xlib.h>
+ ac_fn_c_check_header_compile "$LINENO" "X11/extensions/Xrandr.h" "ac_cv_header_X11_extensions_Xrandr_h" "#include <X11/Xlib.h>
"
-if test "x$ac_cv_header_X11_extensions_XInput_h" = xyes; then :
- have_xinput=yes
+if test "x$ac_cv_header_X11_extensions_Xrandr_h" = xyes; then :
+ have_randr=yes
fi
+ CPPFLAGS="$ac_save_CPPFLAGS"
+
+ # if that succeeded, then check for the XRR code in the libraries
+ if test "$have_randr" = yes; then
+
+ # RANDR probably needs -lXrender
+ xrender_libs=
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XRenderSetSubpixelOrder in -lXrender" >&5
+$as_echo_n "checking for XRenderSetSubpixelOrder in -lXrender... " >&6; }
+if ${ac_cv_lib_Xrender_XRenderSetSubpixelOrder+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXrender -lXext -lX11 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char XRenderSetSubpixelOrder ();
+int
+main ()
+{
+return XRenderSetSubpixelOrder ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_Xrender_XRenderSetSubpixelOrder=yes
+else
+ ac_cv_lib_Xrender_XRenderSetSubpixelOrder=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xrender_XRenderSetSubpixelOrder" >&5
+$as_echo "$ac_cv_lib_Xrender_XRenderSetSubpixelOrder" >&6; }
+if test "x$ac_cv_lib_Xrender_XRenderSetSubpixelOrder" = xyes; then :
+ xrender_libs="-lXrender"
+else
+ true
+fi
CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
- # if that succeeded, then check for libXi
- if test "$have_xinput" = yes; then
- have_xinput=no
+ # first look for RANDR in -lXext
+ have_randr=no
ac_save_CPPFLAGS="$CPPFLAGS"
ac_save_LDFLAGS="$LDFLAGS"
@@ -9408,13 +8510,80 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XListInputDevices in -lXi" >&5
-$as_echo_n "checking for XListInputDevices in -lXi... " >&6; }
-if ${ac_cv_lib_Xi_XListInputDevices+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XRRGetScreenInfo in -lXext" >&5
+$as_echo_n "checking for XRRGetScreenInfo in -lXext... " >&6; }
+if ${ac_cv_lib_Xext_XRRGetScreenInfo+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lXi -lXext -lX11 $LIBS"
+LIBS="-lXext $xrender_libs -lXext -lX11 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char XRRGetScreenInfo ();
+int
+main ()
+{
+return XRRGetScreenInfo ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_Xext_XRRGetScreenInfo=yes
+else
+ ac_cv_lib_Xext_XRRGetScreenInfo=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xext_XRRGetScreenInfo" >&5
+$as_echo "$ac_cv_lib_Xext_XRRGetScreenInfo" >&6; }
+if test "x$ac_cv_lib_Xext_XRRGetScreenInfo" = xyes; then :
+ have_randr=yes; SAVER_LIBS="$SAVER_LIBS $xrender_libs"
+else
+ true
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ # if that failed, look in -lXrandr
+ if test "$have_randr" = no; then
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XRRGetScreenInfo in -lXrandr" >&5
+$as_echo_n "checking for XRRGetScreenInfo in -lXrandr... " >&6; }
+if ${ac_cv_lib_Xrandr_XRRGetScreenInfo+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXrandr $xrender_libs -lXext -lX11 $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -9424,28 +8593,28 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
#ifdef __cplusplus
extern "C"
#endif
-char XListInputDevices ();
+char XRRGetScreenInfo ();
int
main ()
{
-return XListInputDevices ();
+return XRRGetScreenInfo ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_Xi_XListInputDevices=yes
+ ac_cv_lib_Xrandr_XRRGetScreenInfo=yes
else
- ac_cv_lib_Xi_XListInputDevices=no
+ ac_cv_lib_Xrandr_XRRGetScreenInfo=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xi_XListInputDevices" >&5
-$as_echo "$ac_cv_lib_Xi_XListInputDevices" >&6; }
-if test "x$ac_cv_lib_Xi_XListInputDevices" = xyes; then :
- have_xinput=yes; SAVER_LIBS="$SAVER_LIBS -lXi"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xrandr_XRRGetScreenInfo" >&5
+$as_echo "$ac_cv_lib_Xrandr_XRRGetScreenInfo" >&6; }
+if test "x$ac_cv_lib_Xrandr_XRRGetScreenInfo" = xyes; then :
+ have_randr=yes; SAVER_LIBS="$SAVER_LIBS -lXrandr $xrender_libs"
else
true
fi
@@ -9454,46 +8623,90 @@ fi
LDFLAGS="$ac_save_LDFLAGS"
# LIBS="$ac_save_LIBS"
+ fi
fi
# if that succeeded, then we've really got it.
- if test "$have_xinput" = yes; then
- $as_echo "#define HAVE_XINPUT 1" >>confdefs.h
+ if test "$have_randr" = yes; then
+ $as_echo "#define HAVE_RANDR 1" >>confdefs.h
+ # Now check for version 1.2 in the same libs.
+ # Try to compile, since on macOS 10.5.7, headers are older than libs!
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XRRGetScreenResources" >&5
+$as_echo_n "checking for XRRGetScreenResources... " >&6; }
+if ${ac_cv_randr_12+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_randr_12=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+ #include <X11/Xlib.h>
+ #include <X11/extensions/Xrandr.h>
+int
+main ()
+{
+XRRScreenResources *res =
+ XRRGetScreenResources (0, 0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_randr_12=yes
+else
+ ac_cv_randr_12=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_randr_12" >&5
+$as_echo "$ac_cv_randr_12" >&6; }
+ if test "$ac_cv_randr_12" = yes ; then
+ $as_echo "#define HAVE_RANDR_12 1" >>confdefs.h
-elif test "$with_xinput" != no; then
- echo "error: must be yes or no: --with-xinput-ext=$with_xinput"
+ fi
+# AC_CHECK_X_LIB(c, XRRGetOutputInfo, [AC_DEFINE(HAVE_RANDR_12)],
+# [true], $SAVER_LIBS)
+ fi
+
+elif test "$with_randr" != no; then
+ echo "error: must be yes or no: --with-randr-ext=$with_randr"
exit 1
fi
-
###############################################################################
#
-# Check for the XF86VMODE server extension (for virtual screens.)
+# Check for the XINPUT server extension.
#
###############################################################################
-have_xf86vmode=no
-with_xf86vmode_req=unspecified
+have_xinput=no
+with_xinput_req=unspecified
+xinput_halfassed=no
-# Check whether --with-xf86vmode-ext was given.
-if test "${with_xf86vmode_ext+set}" = set; then :
- withval=$with_xf86vmode_ext; with_xf86vmode="$withval"; with_xf86vmode_req="$withval"
+# Check whether --with-xinput-ext was given.
+if test "${with_xinput_ext+set}" = set; then :
+ withval=$with_xinput_ext; with_xinput="$withval"; with_xinput_req="$withval"
else
- with_xf86vmode=yes
+ with_xinput=yes
fi
-
-
- case "$with_xf86vmode" in
+ case "$with_xinput" in
yes) ;;
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xf86vmode headers" >&5
-$as_echo_n "checking for xf86vmode headers... " >&6; }
- d=$with_xf86vmode/include
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XINPUT headers" >&5
+$as_echo_n "checking for XINPUT headers... " >&6; }
+ d=$with_xinput/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
@@ -9503,9 +8716,9 @@ $as_echo "$d" >&6; }
$as_echo "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xf86vmode libs" >&5
-$as_echo_n "checking for xf86vmode libs... " >&6; }
- d=$with_xf86vmode/lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XINPUT libs" >&5
+$as_echo_n "checking for XINPUT libs... " >&6; }
+ d=$with_xinput/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
@@ -9516,25 +8729,22 @@ $as_echo "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
- with_xf86vmode_req="yes"
- with_xf86vmode=$with_xf86vmode_req
+ with_xinput_req="yes"
+ with_xinput=$with_xinput_req
;;
*)
echo ""
- echo "error: argument to --with-xf86vmode-ext must be \"yes\", \"no\", or a directory."
+ echo "error: argument to --with-xinput-ext must be \"yes\", \"no\", or a directory."
echo " If it is a directory, then \`DIR/include' will be added to"
echo " the -I list, and \`DIR/lib' will be added to the -L list."
exit 1
;;
esac
+if test "$with_xinput" = yes; then
-VIDMODE_LIBS=""
-
-if test "$with_xf86vmode" = yes; then
-
- # first check for xf86vmode.h
+ # first check for Xinput2.h
ac_save_CPPFLAGS="$CPPFLAGS"
if test \! -z "$includedir" ; then
@@ -9542,18 +8752,18 @@ if test "$with_xf86vmode" = yes; then
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_compile "$LINENO" "X11/extensions/xf86vmode.h" "ac_cv_header_X11_extensions_xf86vmode_h" "#include <X11/Xlib.h>
+ ac_fn_c_check_header_compile "$LINENO" "X11/extensions/XInput2.h" "ac_cv_header_X11_extensions_XInput2_h" "#include <X11/Xlib.h>
"
-if test "x$ac_cv_header_X11_extensions_xf86vmode_h" = xyes; then :
- have_xf86vmode=yes
+if test "x$ac_cv_header_X11_extensions_XInput2_h" = xyes; then :
+ have_xinput=yes
fi
-
CPPFLAGS="$ac_save_CPPFLAGS"
- # if that succeeded, then check for the -lXxf86vm
- if test "$have_xf86vmode" = yes; then
- have_xf86vmode=no
+ # if that succeeded, then check for libXi
+ if test "$have_xinput" = yes; then
+ have_xinput=no
+ xinput_halfassed=yes
ac_save_CPPFLAGS="$CPPFLAGS"
ac_save_LDFLAGS="$LDFLAGS"
@@ -9573,13 +8783,13 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XF86VidModeGetViewPort in -lXxf86vm" >&5
-$as_echo_n "checking for XF86VidModeGetViewPort in -lXxf86vm... " >&6; }
-if ${ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XISelectEvents in -lXi" >&5
+$as_echo_n "checking for XISelectEvents in -lXi... " >&6; }
+if ${ac_cv_lib_Xi_XISelectEvents+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lXxf86vm -lXext -lX11 $LIBS"
+LIBS="-lXi -lXext -lX11 $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -9589,30 +8799,29 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
#ifdef __cplusplus
extern "C"
#endif
-char XF86VidModeGetViewPort ();
+char XISelectEvents ();
int
main ()
{
-return XF86VidModeGetViewPort ();
+return XISelectEvents ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort=yes
+ ac_cv_lib_Xi_XISelectEvents=yes
else
- ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort=no
+ ac_cv_lib_Xi_XISelectEvents=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort" >&5
-$as_echo "$ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort" >&6; }
-if test "x$ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort" = xyes; then :
- have_xf86vmode=yes;
- VIDMODE_LIBS="-lXxf86vm";
- SAVER_LIBS="$SAVER_LIBS $VIDMODE_LIBS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xi_XISelectEvents" >&5
+$as_echo "$ac_cv_lib_Xi_XISelectEvents" >&6; }
+if test "x$ac_cv_lib_Xi_XISelectEvents" = xyes; then :
+ have_xinput=yes; xinput_halfassed=no;
+ SAVER_LIBS="$SAVER_LIBS -lXi"
else
true
fi
@@ -9624,17 +8833,16 @@ fi
fi
# if that succeeded, then we've really got it.
- if test "$have_xf86vmode" = yes; then
- $as_echo "#define HAVE_XF86VMODE 1" >>confdefs.h
+ if test "$have_xinput" = yes; then
+ $as_echo "#define HAVE_XINPUT 1" >>confdefs.h
fi
-elif test "$with_xf86vmode" != no; then
- echo "error: must be yes or no: --with-xf86vmode-ext=$with_xf86vmode"
+elif test "$with_xinput" != no; then
+ echo "error: must be yes or no: --with-xinput-ext=$with_xinput"
exit 1
fi
-
###############################################################################
#
# Check for the XF86VMODE server extension (for gamma fading.)
@@ -9652,8 +8860,6 @@ else
with_xf86gamma=yes
fi
-
-
case "$with_xf86gamma" in
yes) ;;
no) ;;
@@ -9697,7 +8903,6 @@ $as_echo "not found ($d: no such directory)" >&6; }
;;
esac
-
if test "$with_xf86gamma" = yes; then
# first check for xf86vmode.h, if we haven't already
@@ -9717,7 +8922,6 @@ if test "x$ac_cv_header_X11_extensions_xf86vmode_h" = xyes; then :
have_xf86gamma=yes
fi
-
CPPFLAGS="$ac_save_CPPFLAGS"
fi
@@ -9882,37 +9086,30 @@ elif test "$with_xf86gamma" != no; then
exit 1
fi
-
###############################################################################
#
-# Check for the RANDR (Resize and Rotate) server extension.
-#
-# We need this to detect when the resolution of the desktop
-# has changed out from under us (this is a newer, different
-# mechanism than the XF86VMODE virtual viewports.)
+# Check for the XIDLE server extension.
#
###############################################################################
-have_randr=no
-with_randr_req=unspecified
+have_xidle=no
+with_xidle_req=unspecified
-# Check whether --with-randr-ext was given.
-if test "${with_randr_ext+set}" = set; then :
- withval=$with_randr_ext; with_randr="$withval"; with_randr_req="$withval"
+# Check whether --with-xidle-ext was given.
+if test "${with_xidle_ext+set}" = set; then :
+ withval=$with_xidle_ext; with_xidle="$withval"; with_xidle_req="$withval"
else
- with_randr=yes
+ with_xidle=yes
fi
-
-
- case "$with_randr" in
+ case "$with_xidle" in
yes) ;;
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for RANDR headers" >&5
-$as_echo_n "checking for RANDR headers... " >&6; }
- d=$with_randr/include
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XIDLE headers" >&5
+$as_echo_n "checking for XIDLE headers... " >&6; }
+ d=$with_xidle/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
@@ -9922,9 +9119,9 @@ $as_echo "$d" >&6; }
$as_echo "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for RANDR libs" >&5
-$as_echo_n "checking for RANDR libs... " >&6; }
- d=$with_randr/lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XIDLE libs" >&5
+$as_echo_n "checking for XIDLE libs... " >&6; }
+ d=$with_xidle/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
@@ -9935,23 +9132,56 @@ $as_echo "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
- with_randr_req="yes"
- with_randr=$with_randr_req
+ with_xidle_req="yes"
+ with_xidle=$with_xidle_req
;;
*)
echo ""
- echo "error: argument to --with-randr-ext must be \"yes\", \"no\", or a directory."
+ echo "error: argument to --with-xidle-ext must be \"yes\", \"no\", or a directory."
echo " If it is a directory, then \`DIR/include' will be added to"
echo " the -I list, and \`DIR/lib' will be added to the -L list."
exit 1
;;
esac
+if test "$with_xidle" = yes; then
-if test "$with_randr" = yes; then
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "X11/extensions/xidle.h" "ac_cv_header_X11_extensions_xidle_h" "#include <X11/Xlib.h>
+"
+if test "x$ac_cv_header_X11_extensions_xidle_h" = xyes; then :
+ have_xidle=yes
+ $as_echo "#define HAVE_XIDLE_EXTENSION 1" >>confdefs.h
- # first check for Xrandr.h
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+elif test "$with_xidle" != no; then
+ echo "error: must be yes or no: --with-xidle-ext=$with_xidle"
+ exit 1
+fi
+
+###############################################################################
+#
+# Check for the MIT-SCREEN-SAVER server extension.
+#
+###############################################################################
+
+have_mit=no
+with_mit=no
+with_mit_req=unspecified
+#AC_ARG_WITH(mit-ext,
+#[ --with-mit-ext Include support for the MIT-SCREEN-SAVER extension.],
+# [with_mit="$withval"; with_mit_req="$withval"],[with_mit=no])
+#HANDLE_X_PATH_ARG(with_mit, --with-mit-ext, MIT-SCREEN-SAVER)
+
+if test "$with_mit" = yes; then
ac_save_CPPFLAGS="$CPPFLAGS"
if test \! -z "$includedir" ; then
@@ -9959,20 +9189,18 @@ if test "$with_randr" = yes; then
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_compile "$LINENO" "X11/extensions/Xrandr.h" "ac_cv_header_X11_extensions_Xrandr_h" "#include <X11/Xlib.h>
+ ac_fn_c_check_header_compile "$LINENO" "X11/extensions/scrnsaver.h" "ac_cv_header_X11_extensions_scrnsaver_h" "#include <X11/Xlib.h>
"
-if test "x$ac_cv_header_X11_extensions_Xrandr_h" = xyes; then :
- have_randr=yes
+if test "x$ac_cv_header_X11_extensions_scrnsaver_h" = xyes; then :
+ have_mit=yes
fi
-
CPPFLAGS="$ac_save_CPPFLAGS"
- # if that succeeded, then check for the XRR code in the libraries
- if test "$have_randr" = yes; then
-
- # RANDR probably needs -lXrender
- xrender_libs=
+ # Now check to see if it's really in the library; XF86Free-3.3 ships
+ # scrnsaver.h, but doesn't include the code in libXext.a, the idiots!
+ #
+ if test "$have_mit" = yes; then
ac_save_CPPFLAGS="$CPPFLAGS"
ac_save_LDFLAGS="$LDFLAGS"
@@ -9992,13 +9220,13 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XRenderSetSubpixelOrder in -lXrender" >&5
-$as_echo_n "checking for XRenderSetSubpixelOrder in -lXrender... " >&6; }
-if ${ac_cv_lib_Xrender_XRenderSetSubpixelOrder+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XScreenSaverRegister in -lXext" >&5
+$as_echo_n "checking for XScreenSaverRegister in -lXext... " >&6; }
+if ${ac_cv_lib_Xext_XScreenSaverRegister+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lXrender -lXext -lX11 $LIBS"
+LIBS="-lXext -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -10008,39 +9236,39 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
#ifdef __cplusplus
extern "C"
#endif
-char XRenderSetSubpixelOrder ();
+char XScreenSaverRegister ();
int
main ()
{
-return XRenderSetSubpixelOrder ();
+return XScreenSaverRegister ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_Xrender_XRenderSetSubpixelOrder=yes
+ ac_cv_lib_Xext_XScreenSaverRegister=yes
else
- ac_cv_lib_Xrender_XRenderSetSubpixelOrder=no
+ ac_cv_lib_Xext_XScreenSaverRegister=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xrender_XRenderSetSubpixelOrder" >&5
-$as_echo "$ac_cv_lib_Xrender_XRenderSetSubpixelOrder" >&6; }
-if test "x$ac_cv_lib_Xrender_XRenderSetSubpixelOrder" = xyes; then :
- xrender_libs="-lXrender"
-else
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xext_XScreenSaverRegister" >&5
+$as_echo "$ac_cv_lib_Xext_XScreenSaverRegister" >&6; }
+if test "x$ac_cv_lib_Xext_XScreenSaverRegister" = xyes; then :
true
+else
+ have_mit=no
fi
CPPFLAGS="$ac_save_CPPFLAGS"
LDFLAGS="$ac_save_LDFLAGS"
# LIBS="$ac_save_LIBS"
-
- # first look for RANDR in -lXext
- have_randr=no
+ if test "$have_mit" = no; then
+ # Fuck! Looks like XF86Free-3.3 actually puts it in XExExt instead
+ # of in Xext. Thank you master, may I have another.
ac_save_CPPFLAGS="$CPPFLAGS"
ac_save_LDFLAGS="$LDFLAGS"
@@ -10060,13 +9288,13 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XRRGetScreenInfo in -lXext" >&5
-$as_echo_n "checking for XRRGetScreenInfo in -lXext... " >&6; }
-if ${ac_cv_lib_Xext_XRRGetScreenInfo+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XScreenSaverRegister in -lXExExt" >&5
+$as_echo_n "checking for XScreenSaverRegister in -lXExExt... " >&6; }
+if ${ac_cv_lib_XExExt_XScreenSaverRegister+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lXext $xrender_libs -lXext -lX11 $LIBS"
+LIBS="-lXExExt -lX11 -lXext -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -10076,28 +9304,28 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
#ifdef __cplusplus
extern "C"
#endif
-char XRRGetScreenInfo ();
+char XScreenSaverRegister ();
int
main ()
{
-return XRRGetScreenInfo ();
+return XScreenSaverRegister ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_Xext_XRRGetScreenInfo=yes
+ ac_cv_lib_XExExt_XScreenSaverRegister=yes
else
- ac_cv_lib_Xext_XRRGetScreenInfo=no
+ ac_cv_lib_XExExt_XScreenSaverRegister=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xext_XRRGetScreenInfo" >&5
-$as_echo "$ac_cv_lib_Xext_XRRGetScreenInfo" >&6; }
-if test "x$ac_cv_lib_Xext_XRRGetScreenInfo" = xyes; then :
- have_randr=yes; SAVER_LIBS="$SAVER_LIBS $xrender_libs"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_XExExt_XScreenSaverRegister" >&5
+$as_echo "$ac_cv_lib_XExExt_XScreenSaverRegister" >&6; }
+if test "x$ac_cv_lib_XExExt_XScreenSaverRegister" = xyes; then :
+ have_mit=yes; SAVER_LIBS="$SAVER_LIBS -lXExExt"
else
true
fi
@@ -10106,9 +9334,13 @@ fi
LDFLAGS="$ac_save_LDFLAGS"
# LIBS="$ac_save_LIBS"
+ fi
- # if that failed, look in -lXrandr
- if test "$have_randr" = no; then
+ if test "$have_mit" = no; then
+ # Double fuck! Looks like some versions of XFree86 (whichever version
+ # it is that comes with RedHat Linux 2.0 -- I can't find a version
+ # number) put this garbage in Xss instead of Xext. Thank you master,
+ # may I have another.
ac_save_CPPFLAGS="$CPPFLAGS"
ac_save_LDFLAGS="$LDFLAGS"
@@ -10128,13 +9360,13 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XRRGetScreenInfo in -lXrandr" >&5
-$as_echo_n "checking for XRRGetScreenInfo in -lXrandr... " >&6; }
-if ${ac_cv_lib_Xrandr_XRRGetScreenInfo+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XScreenSaverRegister in -lXss" >&5
+$as_echo_n "checking for XScreenSaverRegister in -lXss... " >&6; }
+if ${ac_cv_lib_Xss_XScreenSaverRegister+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lXrandr $xrender_libs -lXext -lX11 $LIBS"
+LIBS="-lXss -lX11 -lXext -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -10144,28 +9376,28 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
#ifdef __cplusplus
extern "C"
#endif
-char XRRGetScreenInfo ();
+char XScreenSaverRegister ();
int
main ()
{
-return XRRGetScreenInfo ();
+return XScreenSaverRegister ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_Xrandr_XRRGetScreenInfo=yes
+ ac_cv_lib_Xss_XScreenSaverRegister=yes
else
- ac_cv_lib_Xrandr_XRRGetScreenInfo=no
+ ac_cv_lib_Xss_XScreenSaverRegister=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xrandr_XRRGetScreenInfo" >&5
-$as_echo "$ac_cv_lib_Xrandr_XRRGetScreenInfo" >&6; }
-if test "x$ac_cv_lib_Xrandr_XRRGetScreenInfo" = xyes; then :
- have_randr=yes; SAVER_LIBS="$SAVER_LIBS -lXrandr $xrender_libs"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xss_XScreenSaverRegister" >&5
+$as_echo "$ac_cv_lib_Xss_XScreenSaverRegister" >&6; }
+if test "x$ac_cv_lib_Xss_XScreenSaverRegister" = xyes; then :
+ have_mit=yes; SAVER_LIBS="$SAVER_LIBS -lXss"
else
true
fi
@@ -10175,21 +9407,80 @@ fi
# LIBS="$ac_save_LIBS"
fi
+
+ if test "$have_mit" = yes; then
+# AC_DEFINE(HAVE_MIT_SAVER_EXTENSION)
+ echo "Using the MIT-SCREEN-SAVER extension will crash your server. Don't."
+ exit 1
+ fi
+
fi
- # if that succeeded, then we've really got it.
- if test "$have_randr" = yes; then
- $as_echo "#define HAVE_RANDR 1" >>confdefs.h
+elif test "$with_mit" != no; then
+ echo "error: must be yes or no: --with-mit-ext=$with_mit"
+ exit 1
+fi
+###############################################################################
+#
+# Check for the SGI SCREEN_SAVER server extension.
+#
+###############################################################################
- # Now check for version 1.2 in the same libs.
- # Try to compile, since on MacOS 10.5.7, headers are older than libs!
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XRRGetScreenResources" >&5
-$as_echo_n "checking for XRRGetScreenResources... " >&6; }
-if ${ac_cv_randr_12+:} false; then :
- $as_echo_n "(cached) " >&6
+have_sgi=no
+with_sgi_req=unspecified
+
+# Check whether --with-sgi-ext was given.
+if test "${with_sgi_ext+set}" = set; then :
+ withval=$with_sgi_ext; with_sgi="$withval"; with_sgi_req="$withval"
else
- ac_cv_randr_12=no
+ with_sgi=$ac_irix
+fi
+
+ case "$with_sgi" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SGI SCREEN_SAVER headers" >&5
+$as_echo_n "checking for SGI SCREEN_SAVER headers... " >&6; }
+ d=$with_sgi/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SGI SCREEN_SAVER libs" >&5
+$as_echo_n "checking for SGI SCREEN_SAVER libs... " >&6; }
+ d=$with_sgi/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_sgi_req="yes"
+ with_sgi=$with_sgi_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-sgi-ext must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+if test "$with_sgi" = yes; then
ac_save_CPPFLAGS="$CPPFLAGS"
if test \! -z "$includedir" ; then
@@ -10197,54 +9488,382 @@ else
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ ac_fn_c_check_header_compile "$LINENO" "X11/extensions/XScreenSaver.h" "ac_cv_header_X11_extensions_XScreenSaver_h" "#include <X11/Xlib.h>
+"
+if test "x$ac_cv_header_X11_extensions_XScreenSaver_h" = xyes; then :
+ have_sgi=yes
+ $as_echo "#define HAVE_SGI_SAVER_EXTENSION 1" >>confdefs.h
+
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+
+elif test "$with_sgi" != no; then
+ echo "error: must be yes or no: --with-sgi-ext=$with_sgi"
+ exit 1
+fi
+
+###############################################################################
+#
+# Check for the SGI-VIDEO-CONTROL server extension.
+#
+###############################################################################
+
+have_sgivc=no
+with_sgivc_req=unspecified
+
+# Check whether --with-sgivc-ext was given.
+if test "${with_sgivc_ext+set}" = set; then :
+ withval=$with_sgivc_ext; with_sgivc="$withval"; with_sgivc_req="$withval"
+else
+ with_sgivc=$ac_irix
+fi
+
+ case "$with_sgivc" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SGI-VIDEO-CONTROL headers" >&5
+$as_echo_n "checking for SGI-VIDEO-CONTROL headers... " >&6; }
+ d=$with_sgivc/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SGI-VIDEO-CONTROL libs" >&5
+$as_echo_n "checking for SGI-VIDEO-CONTROL libs... " >&6; }
+ d=$with_sgivc/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_sgivc_req="yes"
+ with_sgivc=$with_sgivc_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-sgivc-ext must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+if test "$with_sgivc" = yes; then
+
+ # first check for XSGIvc.h
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "X11/extensions/XSGIvc.h" "ac_cv_header_X11_extensions_XSGIvc_h" "#include <X11/Xlib.h>
+"
+if test "x$ac_cv_header_X11_extensions_XSGIvc_h" = xyes; then :
+ have_sgivc=yes
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+
+ # if that succeeded, then check for the -lXsgivc
+ if test "$have_sgivc" = yes; then
+ have_sgivc=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XSGIvcQueryGammaMap in -lXsgivc" >&5
+$as_echo_n "checking for XSGIvcQueryGammaMap in -lXsgivc... " >&6; }
+if ${ac_cv_lib_Xsgivc_XSGIvcQueryGammaMap+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXsgivc -lXext -lX11 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#include <stdlib.h>
- #include <X11/Xlib.h>
- #include <X11/extensions/Xrandr.h>
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char XSGIvcQueryGammaMap ();
int
main ()
{
-XRRScreenResources *res =
- XRRGetScreenResources (0, 0);
+return XSGIvcQueryGammaMap ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_randr_12=yes
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_Xsgivc_XSGIvcQueryGammaMap=yes
else
- ac_cv_randr_12=no
+ ac_cv_lib_Xsgivc_XSGIvcQueryGammaMap=no
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- CPPFLAGS="$ac_save_CPPFLAGS"
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xsgivc_XSGIvcQueryGammaMap" >&5
+$as_echo "$ac_cv_lib_Xsgivc_XSGIvcQueryGammaMap" >&6; }
+if test "x$ac_cv_lib_Xsgivc_XSGIvcQueryGammaMap" = xyes; then :
+ have_sgivc=yes; SAVER_LIBS="$SAVER_LIBS -lXsgivc"
+else
+ true
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_randr_12" >&5
-$as_echo "$ac_cv_randr_12" >&6; }
- if test "$ac_cv_randr_12" = yes ; then
- $as_echo "#define HAVE_RANDR_12 1" >>confdefs.h
- fi
-# AC_CHECK_X_LIB(c, XRRGetOutputInfo, [AC_DEFINE(HAVE_RANDR_12)],
-# [true], $SAVER_LIBS)
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
fi
+ # if that succeeded, then we've really got it.
+ if test "$have_sgivc" = yes; then
+ $as_echo "#define HAVE_SGI_VC_EXTENSION 1" >>confdefs.h
-elif test "$with_randr" != no; then
- echo "error: must be yes or no: --with-randr-ext=$with_randr"
+ fi
+
+elif test "$with_sgivc" != no; then
+ echo "error: must be yes or no: --with-sgivc-ext=$with_sgivc"
exit 1
fi
+###############################################################################
+#
+# Check for the SGI XReadDisplay server extension.
+#
+###############################################################################
+
+have_readdisplay=no
+with_readdisplay_req=unspecified
+
+# Check whether --with-readdisplay was given.
+if test "${with_readdisplay+set}" = set; then :
+ withval=$with_readdisplay; with_readdisplay="$withval"; with_readdisplay_req="$withval"
+else
+ with_readdisplay=$ac_irix
+fi
+
+ case "$with_readdisplay" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XReadDisplay headers" >&5
+$as_echo_n "checking for XReadDisplay headers... " >&6; }
+ d=$with_readdisplay/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XReadDisplay libs" >&5
+$as_echo_n "checking for XReadDisplay libs... " >&6; }
+ d=$with_readdisplay/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_readdisplay_req="yes"
+ with_readdisplay=$with_readdisplay_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-readdisplay must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+if test "$with_readdisplay" = yes; then
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "X11/extensions/readdisplay.h" "ac_cv_header_X11_extensions_readdisplay_h" "#include <X11/Xlib.h>
+"
+if test "x$ac_cv_header_X11_extensions_readdisplay_h" = xyes; then :
+ $as_echo "#define HAVE_READ_DISPLAY_EXTENSION 1" >>confdefs.h
+
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+elif test "$with_readdisplay" != no; then
+ echo "error: must be yes or no: --with-readdisplay=$with_readdisplay"
+ exit 1
+fi
###############################################################################
#
-# Check for XF86MiscSetGrabKeysState (but only bother if we are already
-# using other XF86 stuff.)
+# Check for the XSHM server extension.
#
###############################################################################
-have_xf86miscsetgrabkeysstate=no
-if test "$have_xf86gamma" = yes -o "$have_xf86vmode" = yes; then
+have_xshm=no
+with_xshm_req=unspecified
+
+# Check whether --with-xshm-ext was given.
+if test "${with_xshm_ext+set}" = set; then :
+ withval=$with_xshm_ext; with_xshm="$withval"; with_xshm_req="$withval"
+else
+ with_xshm=yes
+fi
+
+ case "$with_xshm" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XSHM headers" >&5
+$as_echo_n "checking for XSHM headers... " >&6; }
+ d=$with_xshm/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XSHM libs" >&5
+$as_echo_n "checking for XSHM libs... " >&6; }
+ d=$with_xshm/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_xshm_req="yes"
+ with_xshm=$with_xshm_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-xshm-ext must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+if test "$with_xshm" = yes; then
+
+ # first check for Xshm.h.
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "X11/extensions/XShm.h" "ac_cv_header_X11_extensions_XShm_h" "#include <X11/Xlib.h>
+"
+if test "x$ac_cv_header_X11_extensions_XShm_h" = xyes; then :
+ have_xshm=yes
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+
+ # if that succeeded, then check for sys/ipc.h.
+ if test "$have_xshm" = yes; then
+ have_xshm=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_mongrel "$LINENO" "sys/ipc.h" "ac_cv_header_sys_ipc_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_ipc_h" = xyes; then :
+ have_xshm=yes
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ fi
+
+ # if that succeeded, then check for sys/shm.h.
+ if test "$have_xshm" = yes; then
+ have_xshm=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_mongrel "$LINENO" "sys/shm.h" "ac_cv_header_sys_shm_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_shm_h" = xyes; then :
+ have_xshm=yes
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ fi
+
+ # AIX is pathological, as usual: apparently it's normal for the Xshm headers
+ # to exist, but the library code to not exist. And even better, the library
+ # code is in its own library: libXextSam.a. So, if we're on AIX, and that
+ # lib doesn't exist, give up. (This lib gets added to X_EXTRA_LIBS, and
+ # that's not quite right, but close enough.)
+ #
+ case "$host" in
+ *-aix*)
+ if `uname -v` -eq 3 ; then
+ have_xshm=no
ac_save_CPPFLAGS="$CPPFLAGS"
ac_save_LDFLAGS="$LDFLAGS"
@@ -10264,13 +9883,13 @@ if test "$have_xf86gamma" = yes -o "$have_xf86vmode" = yes; then
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XF86MiscSetGrabKeysState in -lXxf86misc" >&5
-$as_echo_n "checking for XF86MiscSetGrabKeysState in -lXxf86misc... " >&6; }
-if ${ac_cv_lib_Xxf86misc_XF86MiscSetGrabKeysState+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XShmQueryExtension in -lXextSam" >&5
+$as_echo_n "checking for XShmQueryExtension in -lXextSam... " >&6; }
+if ${ac_cv_lib_XextSam_XShmQueryExtension+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lXxf86misc -lXext -lX11 $LIBS"
+LIBS="-lXextSam -lX11 -lXext -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -10280,28 +9899,28 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
#ifdef __cplusplus
extern "C"
#endif
-char XF86MiscSetGrabKeysState ();
+char XShmQueryExtension ();
int
main ()
{
-return XF86MiscSetGrabKeysState ();
+return XShmQueryExtension ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_Xxf86misc_XF86MiscSetGrabKeysState=yes
+ ac_cv_lib_XextSam_XShmQueryExtension=yes
else
- ac_cv_lib_Xxf86misc_XF86MiscSetGrabKeysState=no
+ ac_cv_lib_XextSam_XShmQueryExtension=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xxf86misc_XF86MiscSetGrabKeysState" >&5
-$as_echo "$ac_cv_lib_Xxf86misc_XF86MiscSetGrabKeysState" >&6; }
-if test "x$ac_cv_lib_Xxf86misc_XF86MiscSetGrabKeysState" = xyes; then :
- have_xf86miscsetgrabkeysstate=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_XextSam_XShmQueryExtension" >&5
+$as_echo "$ac_cv_lib_XextSam_XShmQueryExtension" >&6; }
+if test "x$ac_cv_lib_XextSam_XShmQueryExtension" = xyes; then :
+ have_xshm=yes; X_EXTRA_LIBS="$X_EXTRA_LIBS -lXextSam"
else
true
fi
@@ -10310,13 +9929,217 @@ fi
LDFLAGS="$ac_save_LDFLAGS"
# LIBS="$ac_save_LIBS"
- if test "$have_xf86miscsetgrabkeysstate" = yes ; then
- SAVER_LIBS="$SAVER_LIBS -lXxf86misc"
- $as_echo "#define HAVE_XF86MISCSETGRABKEYSSTATE 1" >>confdefs.h
+ fi
+ ;;
+ esac
+
+ # if that succeeded, then we've really got it.
+ if test "$have_xshm" = yes; then
+ $as_echo "#define HAVE_XSHM_EXTENSION 1" >>confdefs.h
+
+ fi
+
+elif test "$with_xshm" != no; then
+ echo "error: must be yes or no: --with-xshm-ext=$with_xshm"
+ exit 1
+fi
+
+###############################################################################
+#
+# Check for the DOUBLE-BUFFER server extension.
+#
+###############################################################################
+
+have_xdbe=no
+with_xdbe_req=unspecified
+
+# Check whether --with-xdbe-ext was given.
+if test "${with_xdbe_ext+set}" = set; then :
+ withval=$with_xdbe_ext; with_xdbe="$withval"; with_xdbe_req="$withval"
+else
+ with_xdbe=yes
+fi
+
+ case "$with_xdbe" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DOUBLE-BUFFER headers" >&5
+$as_echo_n "checking for DOUBLE-BUFFER headers... " >&6; }
+ d=$with_xdbe/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DOUBLE-BUFFER libs" >&5
+$as_echo_n "checking for DOUBLE-BUFFER libs... " >&6; }
+ d=$with_xdbe/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_xdbe_req="yes"
+ with_xdbe=$with_xdbe_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-xdbe-ext must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+if test "$with_xdbe" = yes; then
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "X11/extensions/Xdbe.h" "ac_cv_header_X11_extensions_Xdbe_h" "#include <X11/Xlib.h>
+"
+if test "x$ac_cv_header_X11_extensions_Xdbe_h" = xyes; then :
+ have_xdbe=yes
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ if test "$have_xdbe" = yes; then
+ $as_echo "#define HAVE_DOUBLE_BUFFER_EXTENSION 1" >>confdefs.h
+
+ fi
+
+elif test "$with_xdbe" != no; then
+ echo "error: must be yes or no: --with-xdbe-ext=$with_xshm"
+ exit 1
+fi
+
+###############################################################################
+#
+# Check for the COMPOSITE server extension.
+#
+###############################################################################
+
+#have_xcomposite=no
+#with_xcomposite_req=unspecified
+#AC_ARG_WITH(xcomposite-ext,
+#[ --with-xcomposite-ext Include support for the XCOMPOSITE extension.],
+# [with_xcomposite="$withval"; with_xcomposite_req="$withval"],
+# [with_xcomposite=yes])
+#
+#HANDLE_X_PATH_ARG(with_xcomposite, --with-xcomposite-ext, XCOMPOSITE)
+#
+#if test "$with_xcomposite" = yes; then
+#
+# AC_CHECK_X_HEADER(X11/extensions/Xcomposite.h, [have_xcomposite=yes],,
+# [#include <X11/Xlib.h>])
+# if test "$have_xcomposite" = yes; then
+# AC_DEFINE(HAVE_XCOMPOSITE_EXTENSION)
+# SAVER_LIBS="-lXcomposite $SAVER_LIBS"
+# fi
+#
+#elif test "$with_xcomposite" != no; then
+# echo "error: must be yes or no: --with-xcomposite-ext=$with_xshm"
+# exit 1
+#fi
+
+###############################################################################
+#
+# Check for the XKB server extension.
+#
+###############################################################################
+
+have_xkb=no
+with_xkb_req=unspecified
+
+# Check whether --with-xkb-ext was given.
+if test "${with_xkb_ext+set}" = set; then :
+ withval=$with_xkb_ext; with_xkb="$withval"; with_xkb_req="$withval"
+else
+ with_xkb=yes
+fi
+
+ case "$with_xkb" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XKB headers" >&5
+$as_echo_n "checking for XKB headers... " >&6; }
+ d=$with_xkb/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XKB libs" >&5
+$as_echo_n "checking for XKB libs... " >&6; }
+ d=$with_xkb/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_xkb_req="yes"
+ with_xkb=$with_xkb_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-xkb-ext must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+if test "$with_xkb" = yes; then
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "X11/XKBlib.h" "ac_cv_header_X11_XKBlib_h" "#include <X11/Xlib.h>
+"
+if test "x$ac_cv_header_X11_XKBlib_h" = xyes; then :
+ have_xkb=yes
fi
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ if test "$have_xkb" = yes; then
+ $as_echo "#define HAVE_XKB 1" >>confdefs.h
+
+ fi
+
+elif test "$with_xkb" != no; then
+ echo "error: must be yes or no: --with-xkb-ext=$with_xshm"
+ exit 1
+fi
###############################################################################
#
@@ -10349,11 +10172,10 @@ else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
-rm -f conftest*
+rm -rf conftest*
CPPFLAGS="$ac_save_CPPFLAGS"
-
###############################################################################
#
# Check for /proc/interrupts.
@@ -10367,10 +10189,9 @@ with_proc_interrupts_req=unspecified
if test "${with_proc_interrupts+set}" = set; then :
withval=$with_proc_interrupts; with_proc_interrupts="$withval"; with_proc_interrupts_req="$withval"
else
- with_proc_interrupts=yes
+ with_proc_interrupts=no
fi
-
if test "$with_proc_interrupts" = yes; then
# Note that we may be building in an environment (e.g. Debian buildd chroot)
@@ -10406,13 +10227,13 @@ elif test "$with_proc_interrupts" != no; then
exit 1
fi
-
###############################################################################
#
# Check for /proc/*/oom_score_adj.
#
###############################################################################
+setuid_auth=no
have_proc_oom=no
with_proc_oom_req=unspecified
@@ -10423,7 +10244,6 @@ else
with_proc_oom=yes
fi
-
if test "$with_proc_oom_req" = yes; then
# Note that we may be building in an environment (e.g. Debian buildd chroot)
@@ -10432,7 +10252,6 @@ if test "$with_proc_oom_req" = yes; then
have_proc_oom=yes
$as_echo "#define HAVE_PROC_OOM 1" >>confdefs.h
-
elif test "$with_proc_oom_req" = unspecified; then
have_proc_oom=no
@@ -10454,6 +10273,10 @@ $as_echo "$ac_cv_have_proc_oom" >&6; }
if test "$have_proc_oom" = yes; then
$as_echo "#define HAVE_PROC_OOM 1" >>confdefs.h
+ # Only root can write to /proc/$$/oom_score_adj, even though it's us.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabling setuid to opt out of OOM-killer." >&5
+$as_echo "enabling setuid to opt out of OOM-killer." >&6; }
+ setuid_auth=yes
fi
elif test "$with_proc_oom" != no; then
@@ -10461,21 +10284,242 @@ elif test "$with_proc_oom" != no; then
exit 1
fi
+###############################################################################
+#
+# Check for -lsystemd
+#
+###############################################################################
+
+have_systemd=no
+with_systemd_req=unspecified
+systemd_halfassed=no
+systemd_too_old=no
+
+# Check whether --with-systemd was given.
+if test "${with_systemd+set}" = set; then :
+ withval=$with_systemd; with_systemd="$withval"; with_systemd_req="$withval"
+else
+ with_systemd=yes
+fi
+
+ case "$with_systemd" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for systemd headers" >&5
+$as_echo_n "checking for systemd headers... " >&6; }
+ d=$with_systemd/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for systemd libs" >&5
+$as_echo_n "checking for systemd libs... " >&6; }
+ d=$with_systemd/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_systemd_req="yes"
+ with_systemd=$with_systemd_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-systemd must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+if test "$with_systemd" != yes -a "$with_systemd" != no ; then
+ echo "error: must be yes or no: --with-systemd=$with_systemd"
+ exit 1
+fi
+
+if test "$with_systemd" = yes; then
+
+ pkgs=''
+ ok="yes"
+ pkg_check_version libsystemd 221
+ have_systemd="$ok"
+
+ if test "$have_systemd" = no; then
+ if $pkg_config --exists libsystemd ; then
+ systemd_too_old=yes
+ fi
+ fi
+
+ if test "$have_systemd" = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libsystemd includes" >&5
+$as_echo_n "checking for libsystemd includes... " >&6; }
+if ${ac_cv_systemd_config_cflags+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_systemd_config_cflags=`$pkg_config --cflags $pkgs`
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_systemd_config_cflags" >&5
+$as_echo "$ac_cv_systemd_config_cflags" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libsystemd libs" >&5
+$as_echo_n "checking for libsystemd libs... " >&6; }
+if ${ac_cv_systemd_config_libs+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_systemd_config_libs=`$pkg_config --libs $pkgs`
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_systemd_config_libs" >&5
+$as_echo "$ac_cv_systemd_config_libs" >&6; }
+ fi
+
+ ac_systemd_config_cflags=$ac_cv_systemd_config_cflags
+ ac_systemd_config_libs=$ac_cv_systemd_config_libs
+
+ if test "$have_systemd" = yes; then
+ #
+ # we appear to have libsystemd; check for headers/libs to be sure.
+ #
+ ac_save_systemd_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $ac_systemd_config_cflags"
+
+ have_systemd=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_mongrel "$LINENO" "systemd/sd-bus.h" "ac_cv_header_systemd_sd_bus_h" "$ac_includes_default"
+if test "x$ac_cv_header_systemd_sd_bus_h" = xyes; then :
+ have_systemd=yes
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+
+ CPPFLAGS="$ac_save_systemd_CPPFLAGS"
+ fi
+
+ if test "$have_systemd" = yes; then
+ # we have the headers, now check for the libraries
+ have_systemd=no
+ systemd_halfassed=yes
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for libsystemd usability..." >&5
+$as_echo "checking for libsystemd usability..." >&6; }
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sd_bus_open_system in -lc" >&5
+$as_echo_n "checking for sd_bus_open_system in -lc... " >&6; }
+if ${ac_cv_lib_c_sd_bus_open_system+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc $ac_systemd_config_libs -lX11 -lXext -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char sd_bus_open_system ();
+int
+main ()
+{
+return sd_bus_open_system ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_c_sd_bus_open_system=yes
+else
+ ac_cv_lib_c_sd_bus_open_system=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_sd_bus_open_system" >&5
+$as_echo "$ac_cv_lib_c_sd_bus_open_system" >&6; }
+if test "x$ac_cv_lib_c_sd_bus_open_system" = xyes; then :
+ have_systemd=yes; systemd_halfassed=no
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ fi
+
+ if test "$have_systemd" = no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for libsystemd usability... no" >&5
+$as_echo "checking for libsystemd usability... no" >&6; }
+ fi
+fi
+
+if test "$have_systemd" = yes; then
+ INCLUDES="$INCLUDES $ac_systemd_config_cflags"
+ EXES_SYSTEMD='$(EXES_SYSTEMD)'
+ SYSTEMD_LIBS="$ac_systemd_config_libs"
+ $as_echo "#define HAVE_LIBSYSTEMD 1" >>confdefs.h
+
+else
+ EXES_SYSTEMD=''
+ SYSTEMD_LIBS=''
+fi
###############################################################################
#
# The --enable-locking option
#
+# Note: "configure --help" list all "--enable" options before any
+# "--with" options, so we document the --enable options inline with
+# the --with options where it looks better, instead of in AC_ARG_ENABLE
+# where it would make sense, sigh...
+#
###############################################################################
# Check whether --enable-locking was given.
if test "${enable_locking+set}" = set; then :
- enableval=$enable_locking; enable_locking="$enableval"
+ enableval=$enable_locking; # This is documented elsewhere because of --enable/--with option sorting.
+ enable_locking="$enableval"
else
if test "$ac_macosx" = yes; then
- # We can't lock on MacOS X, so default to not compiling in support for it.
+ # We can't lock on macOS, so default to not compiling in support for it.
# But allow --enable-locking to override that, so I can debug Linux locking
- # under MacOS X11.
+ # under macOS X11.
enable_locking=no
else
enable_locking=yes
@@ -10492,17 +10536,18 @@ else
exit 1
fi
-
-###############################################################################
+##############################################################################
#
# Whether to allow root password to unblank.
#
###############################################################################
+
# Check whether --enable-root-passwd was given.
if test "${enable_root_passwd+set}" = set; then :
- enableval=$enable_root_passwd; enable_root_passwd="$enableval"
+ enableval=$enable_root_passwd; # This is documented elsewhere because of --enable/--with option sorting.
+ enable_root_passwd="$enableval"
else
- enable_root_passwd=yes
+ enable_root_passwd=no
fi
if test "$enable_root_passwd" = yes; then
@@ -10522,8 +10567,12 @@ fi
case "$host" in
*-solaris*)
- # Solaris systems tend to come with PAM misconfigured.
- # Don't build it by default, even if the headers exist.
+ # Solaris systems tend to have the PAM runtime misconfigured and unusable.
+ with_pam_default=no
+ ;;
+ *-freebsd* )
+ # FreeBSD's PAM implementation requires the calling process to be setuid
+ # the whole time, which is unacceptable.
with_pam_default=no
;;
*)
@@ -10532,10 +10581,11 @@ case "$host" in
;;
esac
+#### H1
+
have_pam=no
with_pam_req=unspecified
-
# Check whether --with-pam was given.
if test "${with_pam+set}" = set; then :
withval=$with_pam; with_pam="$withval"; with_pam_req="$withval"
@@ -10543,8 +10593,6 @@ else
with_pam=$with_pam_default
fi
-
-
# Check whether --with-pam_service_name was given.
if test "${with_pam_service_name+set}" = set; then :
withval=$with_pam_service_name; pam_service_name="$withval"
@@ -10552,10 +10600,10 @@ else
pam_service_name="xscreensaver"
fi
-
# Check whether --enable-pam-check-account-type was given.
if test "${enable_pam_check_account_type+set}" = set; then :
- enableval=$enable_pam_check_account_type; enable_pam_check_account_type="$enableval"
+ enableval=$enable_pam_check_account_type; # This is documented elsewhere because of --enable/--with option sorting.
+ enable_pam_check_account_type="$enableval"
else
enable_pam_check_account_type=no
fi
@@ -10569,7 +10617,6 @@ elif test "$enable_pam_check_account_type" != no ; then
exit 1
fi
-
case "$with_pam" in
yes) ;;
no) ;;
@@ -10613,7 +10660,6 @@ $as_echo "not found ($d: no such directory)" >&6; }
;;
esac
-
if test "$enable_locking" = yes -a "$with_pam" = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for PAM" >&5
$as_echo_n "checking for PAM... " >&6; }
@@ -10656,7 +10702,6 @@ $as_echo "$ac_cv_pam" >&6; }
#define PAM_SERVICE_NAME "$pam_service_name"
_ACEOF
-
PASSWD_LIBS="${PASSWD_LIBS} -lpam"
# libpam typically requires dlopen and dlsym. On FreeBSD,
@@ -10701,7 +10746,6 @@ if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
PASSWD_LIBS="${PASSWD_LIBS} -ldl"
fi
-
# On Linux, sigtimedwait() is in libc; on Solaris, it's in librt.
have_timedwait=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigtimedwait in -lc" >&5
@@ -10901,7 +10945,6 @@ rm -f core conftest.err conftest.$ac_objext \
LDFLAGS=$ac_save_LDFLAGS
fi
-
if test "$ac_pam_fail_delay" = yes ; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
@@ -10915,7 +10958,6 @@ $as_echo "no" >&6; }
fi
fi
-
###############################################################################
#
# Check for Kerberos.
@@ -10926,7 +10968,6 @@ have_kerberos=no
have_kerberos5=no
with_kerberos_req=unspecified
-
# Check whether --with-kerberos was given.
if test "${with_kerberos+set}" = set; then :
withval=$with_kerberos; with_kerberos="$withval"; with_kerberos_req="$withval"
@@ -10934,8 +10975,6 @@ else
with_kerberos=yes
fi
-
-
case "$with_kerberos" in
yes) ;;
no) ;;
@@ -10979,7 +11018,6 @@ $as_echo "not found ($d: no such directory)" >&6; }
;;
esac
-
if test "$enable_locking" = yes -a "$with_kerberos" = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Kerberos 4" >&5
$as_echo_n "checking for Kerberos 4... " >&6; }
@@ -11151,7 +11189,7 @@ $as_echo "$as_me: WARNING: Cannot find compat lib (libkrb4) needed to use Kerber
PASSWD_LIBS="$PASSWD_LIBS -lkrb4 -ldes425 -lkrb5 -lk5crypto -lcom_err"
- # jwz: MacOS X uses -lkrb5, but not -lcrypt
+ # jwz: macOS uses -lkrb5, but not -lcrypt
ac_save_CPPFLAGS="$CPPFLAGS"
ac_save_LDFLAGS="$LDFLAGS"
@@ -11215,7 +11253,6 @@ fi
LDFLAGS="$ac_save_LDFLAGS"
# LIBS="$ac_save_LIBS"
-
elif test "$have_kerberos" = yes ; then
# from Tim Showalter <tjs@psaux.com> for FreeBSD 4.2
PASSWD_LIBS="$PASSWD_LIBS -lkrb -ldes -lcom_err"
@@ -11275,19 +11312,15 @@ fi
fi
fi
-
###############################################################################
#
# Check for the nine billion variants of shadow passwords...
#
###############################################################################
-need_setuid=no
-
have_shadow=no
with_shadow_req=unspecified
-
# Check whether --with-shadow was given.
if test "${with_shadow+set}" = set; then :
withval=$with_shadow; with_shadow="$withval"; with_shadow_req="$withval"
@@ -11295,8 +11328,6 @@ else
with_shadow=yes
fi
-
-
case "$with_shadow" in
yes) ;;
no) ;;
@@ -11340,13 +11371,11 @@ $as_echo "not found ($d: no such directory)" >&6; }
;;
esac
-
if test "$enable_locking" = no ; then
with_shadow_req=no
with_shadow=no
fi
-
###############################################################################
#
# Check for Sun "adjunct" passwords.
@@ -11396,11 +11425,10 @@ $as_echo "$ac_cv_sun_adjunct" >&6; }
if test "$ac_cv_sun_adjunct" = yes; then
have_shadow_adjunct=yes
have_shadow=yes
- need_setuid=yes
+ setuid_auth=yes
fi
fi
-
###############################################################################
#
# Check for DEC and SCO so-called "enhanced" security.
@@ -11454,7 +11482,7 @@ $as_echo "$ac_cv_enhanced_passwd" >&6; }
if test $ac_cv_enhanced_passwd = yes; then
have_shadow_enhanced=yes
have_shadow=yes
- need_setuid=yes
+ setuid_auth=yes
# On SCO, getprpwnam() is in -lprot (which uses nap() from -lx)
# (I'm told it needs -lcurses too, but I don't understand why.)
@@ -11593,7 +11621,7 @@ $as_echo "$ac_cv_hpux_passwd" >&6; }
if test "$ac_cv_hpux_passwd" = yes; then
have_shadow_hpux=yes
have_shadow=yes
- need_setuid=yes
+ setuid_auth=yes
# on HPUX, bigcrypt is in -lsec
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for bigcrypt in -lsec" >&5
@@ -11639,7 +11667,6 @@ fi
fi
fi
-
###############################################################################
#
# Check for FreeBSD-style shadow passwords.
@@ -11667,10 +11694,64 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_master_passwd" >&5
$as_echo "$ac_cv_master_passwd" >&6; }
if test "$ac_cv_master_passwd" = yes; then
- need_setuid=yes
+ setuid_auth=yes
fi
fi
+###############################################################################
+#
+# Check for OpenBSD-style shadow passwords.
+# It's getpwnam_shadow instead of getpwnam, and it only works as root.
+#
+###############################################################################
+
+if test "$with_shadow" = yes ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenBSD-style shadow passwords" >&5
+$as_echo_n "checking for OpenBSD-style shadow passwords... " >&6; }
+if ${ac_cv_pwnam_shadow+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+ #include <unistd.h>
+ #include <sys/types.h>
+ #include <pwd.h>
+int
+main ()
+{
+struct spwd *p = getspnam_shadow("nobody");
+ const char *pw = p->pw_passwd;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_pwnam_shadow=yes
+else
+ ac_cv_pwnam_shadow=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_pwnam_shadow" >&5
+$as_echo "$ac_cv_pwnam_shadow" >&6; }
+ if test "$ac_cv_pwnam_shadow" = yes; then
+ have_pwnam_shadow=yes
+
+ # If we also have PAM, assume that we don't need to be setuid.
+ if test $have_pam != yes; then
+ setuid_auth=yes
+ fi
+ fi
+fi
###############################################################################
#
@@ -11719,7 +11800,11 @@ fi
$as_echo "$ac_cv_shadow" >&6; }
if test "$ac_cv_shadow" = yes; then
have_shadow=yes
- need_setuid=yes
+
+ # If we also have PAM, assume that we don't need to be setuid.
+ if test $have_pam != yes; then
+ setuid_auth=yes
+ fi
# On some systems (UnixWare 2.1), getspnam() is in -lgen instead of -lc.
have_getspnam=no
@@ -11808,7 +11893,6 @@ fi
fi
fi
-
###############################################################################
#
# Check for other libraries needed for non-shadow passwords.
@@ -11903,20 +11987,57 @@ fi
fi
fi
+###############################################################################
+#
+# Strongly suspect that this hasn't been used in years. Also, the same
+# goal is achieved by xscreensaver-auth in XScreenSaver 6. -- jwz, 2021
+#
+# Check for external password helper
+# On SuSE in 1993, instead of having xscreensaver be a setuid program,
+# they fork an external program that takes the password on stdin, and
+# returns true if that password is a valid one. Then only that smaller
+# program needs to be setuid.
+#
+# (Note that this external program is not a GUI: the GUI is still
+# all in xscreensaver itself; the external program just does auth.)
+#
+###############################################################################
-# Most of the above shadow mechanisms will have set need_setuid to yes,
+#have_passwd_helper=no
+#with_passwd_helper_req=unspecified
+#
+#AC_ARG_WITH(passwd-helper,
+#[ --with-passwd-helper Include support for external password verification.],
+# [with_passwd_helper="$withval"; with_passwd_helper_req="$withval"],[with_passwd_helper=no])
+## no HANDLE_X_PATH_ARG for this one
+#
+#if test "$enable_locking" = no ; then
+# with_passwd_helper_req=no
+# with_passwd_helper=no
+#fi
+#
+#case "$with_passwd_helper" in
+# ""|no) : ;;
+# /*)
+# AC_DEFINE_UNQUOTED(PASSWD_HELPER_PROGRAM, "$with_passwd_helper")
+# have_passwd_helper=yes;;
+# *)
+# echo "error: --with-passwd-helper needs full pathname of helper (not '$with_passwd_helper')." >&2
+# exit 1
+#esac
+
+# Most of the above shadow mechanisms will have set setuid_auth to yes,
# if they were found. But, on some systems, we need setuid even when
# using plain old vanilla passwords.
#
-if test "$enable_locking" = yes ; then
+if test "$enable_locking" = yes -a "$have_pam" = no ; then
case "$host" in
- *-hpux* | *-aix* | *-netbsd* | *-freebsd* | *-openbsd* )
- need_setuid=yes
+ *-hpux* | *-aix* | *-netbsd* | *-freebsd* )
+ setuid_auth=yes
;;
esac
fi
-
if test "$have_shadow_adjunct" = yes ; then
$as_echo "#define HAVE_ADJUNCT_PASSWD 1" >>confdefs.h
@@ -11929,376 +12050,19 @@ elif test "$have_shadow_hpux" = yes ; then
elif test "$have_shadow" = yes ; then
$as_echo "#define HAVE_SHADOW_PASSWD 1" >>confdefs.h
-fi
-
-
-###############################################################################
-#
-# Check for external password helper
-# On SuSE, instead of having xscreensaver be a setuid program, they
-# fork an external program that takes the password on stdin, and
-# returns true if that password is a valid one. Then only that
-# smaller program needs to be setuid.
-#
-# (Note that this external program is not a GUI: the GUI is still
-# all in xscreensaver itself; the external program just does auth.)
-#
-###############################################################################
-
-have_passwd_helper=no
-with_passwd_helper_req=unspecified
-
-
-# Check whether --with-passwd-helper was given.
-if test "${with_passwd_helper+set}" = set; then :
- withval=$with_passwd_helper; with_passwd_helper="$withval"; with_passwd_helper_req="$withval"
-else
- with_passwd_helper=no
-fi
-
-# no HANDLE_X_PATH_ARG for this one
-
-if test "$enable_locking" = no ; then
- with_passwd_helper_req=no
- with_passwd_helper=no
-fi
-
-case "$with_passwd_helper" in
- ""|no) : ;;
- /*)
- cat >>confdefs.h <<_ACEOF
-#define PASSWD_HELPER_PROGRAM "$with_passwd_helper"
-_ACEOF
-
- have_passwd_helper=yes;;
- *)
- echo "error: --with-passwd-helper needs full pathname of helper (not '$with_passwd_helper')." >&2
- exit 1
-esac
-
-
-###############################################################################
-#
-# Check for a login manager for a "New Login" button on the lock dialog.
-# Usually this will be "/usr/bin/gdmflexiserver".
-#
-###############################################################################
-
-with_login_manager_req=unspecified
-default_login_manager_1='gdmflexiserver -ls'
-default_login_manager_2='kdmctl reserve'
-default_login_manager_3='lxdm -c USER_SWITCH'
-default_login_manager_4='dm-tool switch-to-greeter'
-
-
-# Check whether --with-login-manager was given.
-if test "${with_login_manager+set}" = set; then :
- withval=$with_login_manager; with_login_manager="$withval"; with_login_manager_req="$withval"
-else
- with_login_manager=yes
-fi
-
-# no HANDLE_X_PATH_ARG for this one
-
-if test "$enable_locking" = no ; then
- with_login_manager_req=no
- with_login_manager=no
-fi
-
-case "$with_login_manager_req" in
- no)
- with_login_manager=""
- ;;
-
- yes|unspecified)
- # Try various defaults, use the first one that exists.
-
- with_login_manager=""
-
- if test -z "$with_login_manager" ; then
- set dummy $default_login_manager_1 ; login_manager_tmp=$2
- unset ac_cv_path_login_manager_tmp # don't cache
- # Extract the first word of "$login_manager_tmp", so it can be a program name with args.
-set dummy $login_manager_tmp; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_login_manager_tmp+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $login_manager_tmp in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_login_manager_tmp="$login_manager_tmp" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_login_manager_tmp="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-fi
-login_manager_tmp=$ac_cv_path_login_manager_tmp
-if test -n "$login_manager_tmp"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $login_manager_tmp" >&5
-$as_echo "$login_manager_tmp" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- if test ! -z "$login_manager_tmp" ; then
- with_login_manager="$default_login_manager_1"
- fi
- fi
-
- if test -z "$with_login_manager" ; then
- set dummy $default_login_manager_2 ; login_manager_tmp=$2
- unset ac_cv_path_login_manager_tmp # don't cache
- # Extract the first word of "$login_manager_tmp", so it can be a program name with args.
-set dummy $login_manager_tmp; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_login_manager_tmp+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $login_manager_tmp in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_login_manager_tmp="$login_manager_tmp" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_login_manager_tmp="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-fi
-login_manager_tmp=$ac_cv_path_login_manager_tmp
-if test -n "$login_manager_tmp"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $login_manager_tmp" >&5
-$as_echo "$login_manager_tmp" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- if test ! -z "$login_manager_tmp" ; then
- with_login_manager="$default_login_manager_2"
- fi
- fi
-
- if test -z "$with_login_manager" ; then
- set dummy $default_login_manager_3 ; login_manager_tmp=$2
- unset ac_cv_path_login_manager_tmp # don't cache
- # Extract the first word of "$login_manager_tmp", so it can be a program name with args.
-set dummy $login_manager_tmp; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_login_manager_tmp+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $login_manager_tmp in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_login_manager_tmp="$login_manager_tmp" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_login_manager_tmp="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-fi
-login_manager_tmp=$ac_cv_path_login_manager_tmp
-if test -n "$login_manager_tmp"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $login_manager_tmp" >&5
-$as_echo "$login_manager_tmp" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- if test ! -z "$login_manager_tmp" ; then
- with_login_manager="$default_login_manager_3"
- fi
- fi
-
- if test -z "$with_login_manager" ; then
- set dummy $default_login_manager_4 ; login_manager_tmp=$2
- unset ac_cv_path_login_manager_tmp # don't cache
- # Extract the first word of "$login_manager_tmp", so it can be a program name with args.
-set dummy $login_manager_tmp; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_login_manager_tmp+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $login_manager_tmp in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_login_manager_tmp="$login_manager_tmp" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_login_manager_tmp="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-fi
-login_manager_tmp=$ac_cv_path_login_manager_tmp
-if test -n "$login_manager_tmp"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $login_manager_tmp" >&5
-$as_echo "$login_manager_tmp" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- if test ! -z "$login_manager_tmp" ; then
- with_login_manager="$default_login_manager_4"
- fi
- fi
-
- ;;
-
- /*)
- # absolute path specified on cmd line
- set dummy $with_login_manager_req ; login_manager_tmp=$2
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $login_manager_tmp" >&5
-$as_echo_n "checking for $login_manager_tmp... " >&6; }
- if test -x "$login_manager_tmp" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- with_login_manager=""
- fi
- ;;
-
- *)
- # relative path specified on cmd line
- set dummy $with_login_manager_req ; login_manager_tmp=$2
- unset ac_cv_path_login_manager_tmp # don't cache
- # Extract the first word of "$login_manager_tmp", so it can be a program name with args.
-set dummy $login_manager_tmp; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_login_manager_tmp+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $login_manager_tmp in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_login_manager_tmp="$login_manager_tmp" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_login_manager_tmp="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-fi
-login_manager_tmp=$ac_cv_path_login_manager_tmp
-if test -n "$login_manager_tmp"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $login_manager_tmp" >&5
-$as_echo "$login_manager_tmp" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- if test -z "$login_manager_tmp" ; then
- with_login_manager=""
- else
- with_login_manager="$login_manager_tmp"
- fi
- ;;
-esac
-ac_cv_login_manager_program="$with_login_manager"
-
-NEW_LOGIN_COMMAND_P=''
-NEW_LOGIN_COMMAND="$ac_cv_login_manager_program"
+elif test "$have_pwnam_shadow" = yes ; then
+ $as_echo "#define HAVE_PWNAM_SHADOW_PASSWD 1" >>confdefs.h
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for login manager" >&5
-$as_echo_n "checking for login manager... " >&6; }
-if test -z "$NEW_LOGIN_COMMAND" ; then
- NEW_LOGIN_COMMAND="$default_login_manager_1"
- NEW_LOGIN_COMMAND_P='! '
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NEW_LOGIN_COMMAND (disabled)" >&5
-$as_echo "$NEW_LOGIN_COMMAND (disabled)" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NEW_LOGIN_COMMAND" >&5
-$as_echo "$NEW_LOGIN_COMMAND" >&6; }
fi
-
###############################################################################
#
# Check for -lgtk (and Gnome stuff)
#
###############################################################################
+#### H1
+
have_gtk=no
with_gtk_req=unspecified
@@ -12309,7 +12073,6 @@ else
with_gtk=yes
fi
-
# if --with-gtk=/directory/ was specified, remember that directory so that
# we can also look for the `gtk-config' program in that directory.
case "$with_gtk" in
@@ -12321,7 +12084,6 @@ case "$with_gtk" in
;;
esac
-
case "$with_gtk" in
yes) ;;
no) ;;
@@ -12365,152 +12127,32 @@ $as_echo "not found ($d: no such directory)" >&6; }
;;
esac
-
if test "$with_gtk" != yes -a "$with_gtk" != no ; then
echo "error: must be yes or no: --with-gtk=$with_gtk"
exit 1
fi
-
-parse_gtk_version_string() {
- # M4 sucks!!
-
- maj=`echo $ac_gtk_version_string | sed -n 's/\..*//p'`
- min=`echo $ac_gtk_version_string | sed -n 's/[^.]*\.\([^.]*\).*/\1/p'`
-
- ac_gtk_version=`echo "$maj * 1000 + $min" | bc`
- if test -z "$ac_gtk_version"; then
- ac_gtk_version=unknown
- ac_gtk_version_string=unknown
- fi
-}
-
-# Find pkg-config... (need this for both gtk and gdk_pixbuf.)
-# if the user specified --with-gtk=/foo/ then look there.
-#
-gtk_path="$PATH"
-if test ! -z "$gtk_dir"; then
- # canonicalize slashes.
- foo=`echo "${gtk_dir}/bin" | sed 's@//*@/@g'`
- gtk_path="$foo:$gtk_path"
-fi
-
-for ac_prog in pkg-config
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_pkg_config+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $pkg_config in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_pkg_config="$pkg_config" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $gtk_path
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_pkg_config="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-fi
-pkg_config=$ac_cv_path_pkg_config
-if test -n "$pkg_config"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pkg_config" >&5
-$as_echo "$pkg_config" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$pkg_config" && break
-done
-
-
-if test -z "$pkg_config" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: pkg-config not found!" >&5
-$as_echo "$as_me: WARNING: pkg-config not found!" >&2;}
- pkg_config="false"
-fi
-
-
-# Utility function for running pkg-config-based tests...
-#
-pkgs=''
-pkg_check_version() {
- if test "$ok" = yes ; then
- req="$1"
- min="$2"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $req" >&5
-$as_echo_n "checking for $req... " >&6; }
- if $pkg_config --exists "$req" ; then
- vers=`$pkg_config --modversion "$req"`
- if $pkg_config --exists "$req >= $min" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $vers" >&5
-$as_echo "$vers" >&6; }
- pkgs="$pkgs $req"
- return 1
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $vers (wanted >= $min)" >&5
-$as_echo "$vers (wanted >= $min)" >&6; }
- ok=no
- return 0
- fi
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- ok=no
- return 0
- fi
- fi
-}
-
-
-jurassic_gtk=no
gtk_halfassed=no
-have_gtk_2_22_or_higher=no
-COMMENT_DEMO_GLADE2_GTK_2_22_HEAD=""
-COMMENT_DEMO_GLADE2_GTK_2_22_TAIL=""
if test "$with_gtk" = yes; then
have_gtk=no
ok="yes"
- pkg_check_version gtk+-2.0 2.0.1 ; ac_gtk_version_string="$vers"
+ pkg_check_version gtk+-2.0 2.22.0 ; ac_gtk_version_string="$vers"
pkg_check_version gmodule-2.0 2.0.0
pkg_check_version libxml-2.0 2.4.6
- pkg_check_version libglade-2.0 1.99.0
pkg_check_version gdk-pixbuf-2.0 2.0.0
pkg_check_version gdk-pixbuf-xlib-2.0 2.0.0
have_gtk="$ok"
if test "$have_gtk" = no; then
if test -n "$ac_gtk_version_string" ; then
- gtk_halfassed="$ac_gtk_version_string"
+ gtk_halfassed=yes
gtk_halfassed_lib="$req"
fi
fi
if test "$have_gtk" = yes; then
- parse_gtk_version_string
- jurassic_gtk=no
- fi
-
- if test "$have_gtk" = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Gtk includes" >&5
$as_echo_n "checking for Gtk includes... " >&6; }
if ${ac_cv_gtk_config_cflags+:} false; then :
@@ -12534,7 +12176,6 @@ $as_echo "$ac_cv_gtk_config_libs" >&6; }
ac_gtk_config_cflags=$ac_cv_gtk_config_cflags
ac_gtk_config_libs=$ac_cv_gtk_config_libs
- GTK_EXTRA_OBJS=""
GTK_DATADIR=""
if test "$have_gtk" = yes; then
GTK_DATADIR=`$pkg_config --variable=prefix gtk+-2.0`
@@ -12551,19 +12192,8 @@ $as_echo "$ac_cv_gtk_config_libs" >&6; }
$as_echo "#define HAVE_XML 1" >>confdefs.h
fi
-
- if test "$have_gtk" = yes; then
- ok="yes"
- pkg_check_version gtk+-2.0 2.22
- have_gtk_2_22_or_higher="$ok"
- if test "$have_gtk_2_22_or_higher" = yes; then
- COMMENT_DEMO_GLADE2_GTK_2_22_HEAD="<!-- comment>"
- COMMENT_DEMO_GLADE2_GTK_2_22_TAIL="</comment -->"
- fi
- fi
fi
-
# Check for the various Gnome help and URL loading programs.
#
WITH_BROWSER=gnome-open
@@ -12606,7 +12236,6 @@ else
$as_echo "no" >&6; }
fi
-
test -n "$gnome_open_program" && break
done
@@ -12648,13 +12277,11 @@ else
$as_echo "no" >&6; }
fi
-
test -n "$gnome_url_show_program" && break
done
fi
-
###############################################################################
#
# Check for -lXm.
@@ -12671,8 +12298,6 @@ else
with_motif=no
fi
-
-
case "$with_motif" in
yes) ;;
no) ;;
@@ -12716,7 +12341,6 @@ $as_echo "not found ($d: no such directory)" >&6; }
;;
esac
-
if test "$with_motif" != yes -a "$with_motif" != no ; then
echo "error: must be yes or no: --with-motif=$with_motif"
exit 1
@@ -12742,11 +12366,9 @@ if test "x$ac_cv_header_Xm_Xm_h" = xyes; then :
MOTIF_LIBS="$MOTIF_LIBS -lXm"
fi
-
CPPFLAGS="$ac_save_CPPFLAGS"
fi
-
if test "$have_motif" = yes; then
ac_save_CPPFLAGS="$CPPFLAGS"
@@ -12764,11 +12386,9 @@ if test "x$ac_cv_header_Xm_ComboBox_h" = xyes; then :
fi
-
CPPFLAGS="$ac_save_CPPFLAGS"
fi
-
###############################################################################
#
# Checking whether Motif is really Lesstif.
@@ -12813,7 +12433,6 @@ $as_echo "$ac_cv_have_lesstif" >&6; }
have_lesstif=$ac_cv_have_lesstif
fi
-
lesstif_version=unknown
lesstif_version_string=unknown
@@ -12865,13 +12484,12 @@ fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lesstif_version_string" >&5
$as_echo "$ac_cv_lesstif_version_string" >&6; }
- rm -f conftest-lt
+ rm -rf conftest-lt
lesstif_version=$ac_cv_lesstif_version
lesstif_version_string=$ac_cv_lesstif_version_string
fi
-
if test "$have_motif" = yes ; then
mtv=unknown
echo unknown > conftest-mt
@@ -12920,13 +12538,12 @@ fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_motif_version_string" >&5
$as_echo "$ac_cv_motif_version_string" >&6; }
- rm -f conftest-mt
+ rm -rf conftest-mt
motif_version=$ac_cv_motif_version
motif_version_string=$ac_cv_motif_version_string
fi
-
###############################################################################
#
# Checking whether Motif requires -lXp.
@@ -13007,7 +12624,6 @@ fi
fi
-
###############################################################################
#
# Checking whether Motif requires -lXintl (for _Xsetlocale.)
@@ -13086,6 +12702,1487 @@ fi
fi
fi
+###############################################################################
+#
+# Check for a login manager for a "New Login" button on the lock dialog.
+# Usually this will be "/usr/bin/gdmflexiserver".
+#
+###############################################################################
+
+with_login_manager_req=unspecified
+default_login_manager_1='gdmflexiserver -ls'
+default_login_manager_2='kdmctl reserve'
+default_login_manager_3='lxdm -c USER_SWITCH'
+default_login_manager_4='dm-tool switch-to-greeter'
+
+# Check whether --with-login-manager was given.
+if test "${with_login_manager+set}" = set; then :
+ withval=$with_login_manager; with_login_manager="$withval"; with_login_manager_req="$withval"
+else
+ with_login_manager=yes
+fi
+
+# no HANDLE_X_PATH_ARG for this one
+
+if test "$enable_locking" = no ; then
+ with_login_manager_req=no
+ with_login_manager=no
+fi
+
+case "$with_login_manager_req" in
+ no)
+ with_login_manager=""
+ ;;
+
+ yes|unspecified)
+ # Try various defaults, use the first one that exists.
+
+ with_login_manager=""
+
+ if test -z "$with_login_manager" ; then
+ set dummy $default_login_manager_1 ; login_manager_tmp=$2
+ unset ac_cv_path_login_manager_tmp # don't cache
+ # Extract the first word of "$login_manager_tmp", so it can be a program name with args.
+set dummy $login_manager_tmp; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_login_manager_tmp+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $login_manager_tmp in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_login_manager_tmp="$login_manager_tmp" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_login_manager_tmp="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+login_manager_tmp=$ac_cv_path_login_manager_tmp
+if test -n "$login_manager_tmp"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $login_manager_tmp" >&5
+$as_echo "$login_manager_tmp" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test ! -z "$login_manager_tmp" ; then
+ with_login_manager="$default_login_manager_1"
+ fi
+ fi
+
+ if test -z "$with_login_manager" ; then
+ set dummy $default_login_manager_2 ; login_manager_tmp=$2
+ unset ac_cv_path_login_manager_tmp # don't cache
+ # Extract the first word of "$login_manager_tmp", so it can be a program name with args.
+set dummy $login_manager_tmp; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_login_manager_tmp+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $login_manager_tmp in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_login_manager_tmp="$login_manager_tmp" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_login_manager_tmp="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+login_manager_tmp=$ac_cv_path_login_manager_tmp
+if test -n "$login_manager_tmp"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $login_manager_tmp" >&5
+$as_echo "$login_manager_tmp" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test ! -z "$login_manager_tmp" ; then
+ with_login_manager="$default_login_manager_2"
+ fi
+ fi
+
+ if test -z "$with_login_manager" ; then
+ set dummy $default_login_manager_3 ; login_manager_tmp=$2
+ unset ac_cv_path_login_manager_tmp # don't cache
+ # Extract the first word of "$login_manager_tmp", so it can be a program name with args.
+set dummy $login_manager_tmp; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_login_manager_tmp+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $login_manager_tmp in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_login_manager_tmp="$login_manager_tmp" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_login_manager_tmp="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+login_manager_tmp=$ac_cv_path_login_manager_tmp
+if test -n "$login_manager_tmp"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $login_manager_tmp" >&5
+$as_echo "$login_manager_tmp" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test ! -z "$login_manager_tmp" ; then
+ with_login_manager="$default_login_manager_3"
+ fi
+ fi
+
+ if test -z "$with_login_manager" ; then
+ set dummy $default_login_manager_4 ; login_manager_tmp=$2
+ unset ac_cv_path_login_manager_tmp # don't cache
+ # Extract the first word of "$login_manager_tmp", so it can be a program name with args.
+set dummy $login_manager_tmp; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_login_manager_tmp+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $login_manager_tmp in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_login_manager_tmp="$login_manager_tmp" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_login_manager_tmp="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+login_manager_tmp=$ac_cv_path_login_manager_tmp
+if test -n "$login_manager_tmp"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $login_manager_tmp" >&5
+$as_echo "$login_manager_tmp" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test ! -z "$login_manager_tmp" ; then
+ with_login_manager="$default_login_manager_4"
+ fi
+ fi
+
+ ;;
+
+ *)
+ # Just believe whatever command was specified.
+ with_login_manager="$with_login_manager_req"
+ ;;
+esac
+ac_cv_login_manager_program="$with_login_manager"
+
+NEW_LOGIN_COMMAND_P=''
+NEW_LOGIN_COMMAND="$ac_cv_login_manager_program"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for login manager" >&5
+$as_echo_n "checking for login manager... " >&6; }
+if test -z "$NEW_LOGIN_COMMAND" ; then
+ NEW_LOGIN_COMMAND="$default_login_manager_1"
+ NEW_LOGIN_COMMAND_P='! '
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NEW_LOGIN_COMMAND (disabled)" >&5
+$as_echo "$NEW_LOGIN_COMMAND (disabled)" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NEW_LOGIN_COMMAND" >&5
+$as_echo "$NEW_LOGIN_COMMAND" >&6; }
+fi
+
+###############################################################################
+#
+# Check for a directory full of images to use as the default value
+# of the "imageDirectory" preference.
+#
+###############################################################################
+
+have_imagedir=no
+with_imagedir_req=unspecified
+
+# Check whether --with-image-directory was given.
+if test "${with_image_directory+set}" = set; then :
+ withval=$with_image_directory; with_imagedir="$withval"; with_imagedir_req="$withval"
+else
+ with_imagedir=yes
+fi
+
+# no HANDLE_X_PATH_ARG for this one
+
+case "$with_imagedir" in
+ /*)
+ # absolute path
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for image directory $with_imagedir" >&5
+$as_echo_n "checking for image directory $with_imagedir... " >&6; }
+ if test -d "$with_imagedir" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ with_imagedir=""
+ fi
+ ;;
+ yes)
+ with_imagedir=""
+
+ fallback_imgdir=""
+ for dd in \
+ "/usr/share/rpd-wallpaper/" \
+ "/usr/share/backgrounds/images/" \
+ "/usr/share/wallpapers/" \
+ "/usr/share/backgrounds/" \
+ "/usr/share/pixmaps/backgrounds/" \
+ "/usr/share/lxde/wallpapers/" \
+ "/Library/Desktop Pictures/" \
+ ; do
+ if test -z "$with_imagedir"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for image directory $dd" >&5
+$as_echo_n "checking for image directory $dd... " >&6; }
+ if test -d "$dd"; then
+ if ( ls "$dd" | grep -q ... ) >&- 2>&- ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ with_imagedir="$dd"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: empty" >&5
+$as_echo "empty" >&6; }
+ if test -z "$fallback_imgdir"; then
+ fallback_imgdir="$dd"
+ fi
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ fi
+ fi
+ done
+ if test -z "$with_imagedir"; then
+ with_imagedir="$fallback_imgdir"
+ fi
+;;
+ no)
+ with_imagedir=""
+ ;;
+
+ *)
+ echo "error: must be an absolute path: --with-image-directory=$with_imagedir_req"
+ exit 1
+ ;;
+esac
+ac_cv_imagedir="$with_imagedir"
+
+DEFAULT_IMAGES_P='True'
+DEFAULT_IMAGE_DIRECTORY="$ac_cv_imagedir"
+
+if test -z "$DEFAULT_IMAGE_DIRECTORY" ; then
+ DEFAULT_IMAGES_P='False'
+fi
+
+###############################################################################
+#
+# Pick a text file to use as the default of the "textFile" preference.
+# Any old file will do, but preferably one that will make interesting
+# shapes when displayed by "starwars" and "fontglide".
+#
+###############################################################################
+
+have_textfile=no
+with_textfile_req=unspecified
+
+# Check whether --with-text-file was given.
+if test "${with_text_file+set}" = set; then :
+ withval=$with_text_file; with_textfile="$withval"; with_textfile_req="$withval"
+else
+ with_textfile=yes
+fi
+
+# no HANDLE_X_PATH_ARG for this one
+
+case "$with_textfile" in
+ /*)
+ # absolute path
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for text file $with_textfile" >&5
+$as_echo_n "checking for text file $with_textfile... " >&6; }
+ if test -f "$with_textfile" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ with_textfile=""
+ fi
+ ;;
+ yes)
+ with_textfile=""
+
+ #### Could use some more defaults here...
+ for f in \
+ "/usr/X11R6/lib/X11/doc/README" \
+ "/usr/share/doc/xserver-common/copyright" \
+ "/usr/share/doc/xserver-xorg-core/copyright" \
+ "/usr/X11R6/README" \
+ "/usr/share/doc/libX11*/COPYING" \
+ "/usr/X11/share/X11/doc/README*" \
+ "/usr/share/doc/debian/debian-manifesto" \
+ ; do
+ if test -z "$with_textfile"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for text file $f" >&5
+$as_echo_n "checking for text file $f... " >&6; }
+ f=`/bin/ls $f 2>&- | head -1`
+ if test -f "$f" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ with_textfile="$f"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ fi
+ fi
+ done
+
+ ;;
+ no)
+ with_textfile=""
+ ;;
+
+ *)
+ echo "error: must be an absolute path: --with-text-file=$with_textfile_req"
+ exit 1
+ ;;
+esac
+ac_cv_textfile="$with_textfile"
+
+DEFAULT_TEXT_FILE="$ac_cv_textfile"
+
+###############################################################################
+#
+# Check the browser to see help URL
+#
+###############################################################################
+
+have_browser=no
+with_browser_req=unspecified
+
+# Check whether --with-browser was given.
+if test "${with_browser+set}" = set; then :
+ withval=$with_browser; with_browser="$withval"; with_browser_req="$withval"
+else
+ with_browser=no
+fi
+
+# no HANDLE_X_PATH_ARG for this one
+
+case "$with_browser" in
+ no )
+ ;;
+ * )
+ WITH_BROWSER=$with_browser
+ gnome_open_program=$with_browser
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for browser $with_browser" >&5
+$as_echo_n "checking for browser $with_browser... " >&6; }
+ with_browser_fullpath=`which $with_browser 2>/dev/null`
+ case $with_browser_fullpath in
+ /* )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ have_browser=yes
+ ;;
+ * )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+# Only warning: we don't want to install all packages for the
+# dependency of the browser in building stage...
+ echo "WARNING: browser not found: --with-browser=$with_browser"
+ ;;
+ esac
+ ;;
+esac
+ac_cv_browser="$with_browser"
+
+###############################################################################
+#
+# Check for pthreads. Must come before checking for OpenGL,
+# since some versions of OpenGL require it.
+#
+###############################################################################
+
+have_pthread=no
+with_pthread_req=unspecified
+
+# AX_PTHREAD is from the GNU Autoconf Archive.
+# https://savannah.gnu.org/projects/autoconf-archive/
+# ===========================================================================
+# https://www.gnu.org/software/autoconf-archive/ax_pthread.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+#
+# DESCRIPTION
+#
+# This macro figures out how to build C programs using POSIX threads. It
+# sets the PTHREAD_LIBS output variable to the threads library and linker
+# flags, and the PTHREAD_CFLAGS output variable to any special C compiler
+# flags that are needed. (The user can also force certain compiler
+# flags/libs to be tested by setting these environment variables.)
+#
+# Also sets PTHREAD_CC and PTHREAD_CXX to any special C compiler that is
+# needed for multi-threaded programs (defaults to the value of CC
+# respectively CXX otherwise). (This is necessary on e.g. AIX to use the
+# special cc_r/CC_r compiler alias.)
+#
+# NOTE: You are assumed to not only compile your program with these flags,
+# but also to link with them as well. For example, you might link with
+# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
+# $PTHREAD_CXX $CXXFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
+#
+# If you are only building threaded programs, you may wish to use these
+# variables in your default LIBS, CFLAGS, and CC:
+#
+# LIBS="$PTHREAD_LIBS $LIBS"
+# CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+# CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS"
+# CC="$PTHREAD_CC"
+# CXX="$PTHREAD_CXX"
+#
+# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
+# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to
+# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
+#
+# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the
+# PTHREAD_PRIO_INHERIT symbol is defined when compiling with
+# PTHREAD_CFLAGS.
+#
+# ACTION-IF-FOUND is a list of shell commands to run if a threads library
+# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it
+# is not found. If ACTION-IF-FOUND is not specified, the default action
+# will define HAVE_PTHREAD.
+#
+# Please let the authors know if this macro fails on any platform, or if
+# you have any other suggestions or comments. This macro was based on work
+# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help
+# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by
+# Alejandro Forero Cuervo to the autoconf macro repository. We are also
+# grateful for the helpful feedback of numerous users.
+#
+# Updated for Autoconf 2.68 by Daniel Richard G.
+#
+# LICENSE
+#
+# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
+# Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG>
+# Copyright (c) 2019 Marc Stevens <marc.stevens@cwi.nl>
+#
+# This program is free software: you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation, either version 3 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception, the respective Autoconf Macro's copyright owner
+# gives unlimited permission to copy, distribute and modify the configure
+# scripts that are the output of Autoconf when processing the Macro. You
+# need not follow the terms of the GNU General Public License when using
+# or distributing such scripts, even though portions of the text of the
+# Macro appear in them. The GNU General Public License (GPL) does govern
+# all other use of the material that constitutes the Autoconf Macro.
+#
+# This special exception to the GPL applies to versions of the Autoconf
+# Macro released by the Autoconf Archive. When you make and distribute a
+# modified version of the Autoconf Macro, you may extend this special
+# exception to the GPL to apply to your modified version as well.
+
+#serial 30
+
+# This is what autoupdate's m4 run will expand. It fires
+# the warning (with _au_warn_XXX), outputs it into the
+# updated configure.ac (with AC_DIAGNOSE), and then outputs
+# the replacement expansion.
+
+# This is an auxiliary macro that is also run when
+# autoupdate runs m4. It simply calls m4_warning, but
+# we need a wrapper so that each warning is emitted only
+# once. We break the quoting in m4_warning's argument in
+# order to expand this macro's arguments, not AU_DEFUN's.
+
+# Finally, this is the expansion that is picked up by
+# autoconf. It tells the user to run autoupdate, and
+# then outputs the replacement expansion. We do not care
+# about autoupdate's warning because that contains
+# information on what to do *after* running autoupdate.
+
+# Check whether --with-pthread was given.
+if test "${with_pthread+set}" = set; then :
+ withval=$with_pthread; # This is documented after --with-gl in --with-xft.
+ with_pthread="$withval"; with_pthread_req="$withval"
+else
+ with_pthread=yes
+fi
+
+if test "$with_pthread" = yes; then
+ # AX_PTHREAD might want a different compiler.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+$as_echo_n "checking target system type... " >&6; }
+if ${ac_cv_target+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "x$target_alias" = x; then
+ ac_cv_target=$ac_cv_host
+else
+ ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+$as_echo "$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
+esac
+target=$ac_cv_target
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+ for ac_i in 1 2 3 4 5 6 7; do
+ ac_script="$ac_script$as_nl$ac_script"
+ done
+ echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+ { ac_script=; unset ac_script;}
+ if test -z "$SED"; then
+ ac_path_SED_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in sed gsed; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+ # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+ ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo '' >> "conftest.nl"
+ "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_SED_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_SED="$ac_path_SED"
+ ac_path_SED_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -rf conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_SED_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_SED"; then
+ as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+ fi
+else
+ ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+ rm -rf conftest.sed
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ax_pthread_ok=no
+
+# We used to check for pthread.h first, but this fails if pthread.h
+# requires special compiler flags (e.g. on Tru64 or Sequent).
+# It gets checked for in the link test anyway.
+
+# First of all, check if the user has set any of the PTHREAD_LIBS,
+# etcetera environment variables, and if threads linking works using
+# them:
+if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then
+ ax_pthread_save_CC="$CC"
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ ax_pthread_save_LIBS="$LIBS"
+ if test "x$PTHREAD_CC" != "x"; then :
+ CC="$PTHREAD_CC"
+fi
+ if test "x$PTHREAD_CXX" != "x"; then :
+ CXX="$PTHREAD_CXX"
+fi
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+ LIBS="$PTHREAD_LIBS $LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS" >&5
+$as_echo_n "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char pthread_join ();
+int
+main ()
+{
+return pthread_join ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ax_pthread_ok=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5
+$as_echo "$ax_pthread_ok" >&6; }
+ if test "x$ax_pthread_ok" = "xno"; then
+ PTHREAD_LIBS=""
+ PTHREAD_CFLAGS=""
+ fi
+ CC="$ax_pthread_save_CC"
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ LIBS="$ax_pthread_save_LIBS"
+fi
+
+# We must check for the threads library under a number of different
+# names; the ordering is very important because some systems
+# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
+# libraries is broken (non-POSIX).
+
+# Create a list of thread flags to try. Items with a "," contain both
+# C compiler flags (before ",") and linker flags (after ","). Other items
+# starting with a "-" are C compiler flags, and remaining items are
+# library names, except for "none" which indicates that we try without
+# any flags at all, and "pthread-config" which is a program returning
+# the flags for the Pth emulation library.
+
+ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+
+# The ordering *is* (sometimes) important. Some notes on the
+# individual items follow:
+
+# pthreads: AIX (must check this before -lpthread)
+# none: in case threads are in libc; should be tried before -Kthread and
+# other compiler flags to prevent continual compiler warnings
+# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64
+# (Note: HP C rejects this with "bad form for `-t' option")
+# -pthreads: Solaris/gcc (Note: HP C also rejects)
+# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
+# doesn't hurt to check since this sometimes defines pthreads and
+# -D_REENTRANT too), HP C (must be checked before -lpthread, which
+# is present but should not be used directly; and before -mthreads,
+# because the compiler interprets this as "-mt" + "-hreads")
+# -mthreads: Mingw32/gcc, Lynx/gcc
+# pthread: Linux, etcetera
+# --thread-safe: KAI C++
+# pthread-config: use pthread-config program (for GNU Pth library)
+
+case $target_os in
+
+ freebsd*)
+
+ # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+ # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+
+ ax_pthread_flags="-kthread lthread $ax_pthread_flags"
+ ;;
+
+ hpux*)
+
+ # From the cc(1) man page: "[-mt] Sets various -D flags to enable
+ # multi-threading and also sets -lpthread."
+
+ ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags"
+ ;;
+
+ openedition*)
+
+ # IBM z/OS requires a feature-test macro to be defined in order to
+ # enable POSIX threads at all, so give the user a hint if this is
+ # not set. (We don't define these ourselves, as they can affect
+ # other portions of the system API in unpredictable ways.)
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS)
+ AX_PTHREAD_ZOS_MISSING
+# endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5
+$as_echo "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;}
+fi
+rm -rf conftest*
+
+ ;;
+
+ solaris*)
+
+ # On Solaris (at least, for some versions), libc contains stubbed
+ # (non-functional) versions of the pthreads routines, so link-based
+ # tests will erroneously succeed. (N.B.: The stubs are missing
+ # pthread_cleanup_push, or rather a function called by this macro,
+ # so we could check for that, but who knows whether they'll stub
+ # that too in a future libc.) So we'll check first for the
+ # standard Solaris way of linking pthreads (-mt -lpthread).
+
+ ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags"
+ ;;
+esac
+
+# Are we compiling with Clang?
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC is Clang" >&5
+$as_echo_n "checking whether $CC is Clang... " >&6; }
+if ${ax_cv_PTHREAD_CLANG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ax_cv_PTHREAD_CLANG=no
+ # Note that Autoconf sets GCC=yes for Clang as well as GCC
+ if test "x$GCC" = "xyes"; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Note: Clang 2.7 lacks __clang_[a-z]+__ */
+# if defined(__clang__) && defined(__llvm__)
+ AX_PTHREAD_CC_IS_CLANG
+# endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1; then :
+ ax_cv_PTHREAD_CLANG=yes
+fi
+rm -rf conftest*
+
+ fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5
+$as_echo "$ax_cv_PTHREAD_CLANG" >&6; }
+ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
+
+# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC)
+
+# Note that for GCC and Clang -pthread generally implies -lpthread,
+# except when -nostdlib is passed.
+# This is problematic using libtool to build C++ shared libraries with pthread:
+# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460
+# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333
+# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555
+# To solve this, first try -pthread together with -lpthread for GCC
+
+if test "x$GCC" = "xyes"; then :
+ ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"
+fi
+
+# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first
+
+if test "x$ax_pthread_clang" = "xyes"; then :
+ ax_pthread_flags="-pthread,-lpthread -pthread"
+fi
+
+# The presence of a feature test macro requesting re-entrant function
+# definitions is, on some systems, a strong hint that pthreads support is
+# correctly enabled
+
+case $target_os in
+ darwin* | hpux* | linux* | osf* | solaris*)
+ ax_pthread_check_macro="_REENTRANT"
+ ;;
+
+ aix*)
+ ax_pthread_check_macro="_THREAD_SAFE"
+ ;;
+
+ *)
+ ax_pthread_check_macro="--"
+ ;;
+esac
+if test "x$ax_pthread_check_macro" = "x--"; then :
+ ax_pthread_check_cond=0
+else
+ ax_pthread_check_cond="!defined($ax_pthread_check_macro)"
+fi
+
+if test "x$ax_pthread_ok" = "xno"; then
+for ax_pthread_try_flag in $ax_pthread_flags; do
+
+ case $ax_pthread_try_flag in
+ none)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5
+$as_echo_n "checking whether pthreads work without any flags... " >&6; }
+ ;;
+
+ *,*)
+ PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"`
+ PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"" >&5
+$as_echo_n "checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"... " >&6; }
+ ;;
+
+ -*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $ax_pthread_try_flag" >&5
+$as_echo_n "checking whether pthreads work with $ax_pthread_try_flag... " >&6; }
+ PTHREAD_CFLAGS="$ax_pthread_try_flag"
+ ;;
+
+ pthread-config)
+ # Extract the first word of "pthread-config", so it can be a program name with args.
+set dummy pthread-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ax_pthread_config+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ax_pthread_config"; then
+ ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ax_pthread_config="yes"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no"
+fi
+fi
+ax_pthread_config=$ac_cv_prog_ax_pthread_config
+if test -n "$ax_pthread_config"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5
+$as_echo "$ax_pthread_config" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ax_pthread_config" = "xno"; then :
+ continue
+fi
+ PTHREAD_CFLAGS="`pthread-config --cflags`"
+ PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
+ ;;
+
+ *)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$ax_pthread_try_flag" >&5
+$as_echo_n "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; }
+ PTHREAD_LIBS="-l$ax_pthread_try_flag"
+ ;;
+ esac
+
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ ax_pthread_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+ LIBS="$PTHREAD_LIBS $LIBS"
+
+ # Check for various functions. We must include pthread.h,
+ # since some functions may be macros. (On the Sequent, we
+ # need a special flag -Kthread to make this header compile.)
+ # We check for pthread_join because it is in -lpthread on IRIX
+ # while pthread_create is in libc. We check for pthread_attr_init
+ # due to DEC craziness with -lpthreads. We check for
+ # pthread_cleanup_push because it is one of the few pthread
+ # functions on Solaris that doesn't have a non-functional libc stub.
+ # We try pthread_create on general principles.
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <pthread.h>
+# if $ax_pthread_check_cond
+# error "$ax_pthread_check_macro must be defined"
+# endif
+ static void *some_global = NULL;
+ static void routine(void *a)
+ {
+ /* To avoid any unused-parameter or
+ unused-but-set-parameter warning. */
+ some_global = a;
+ }
+ static void *start_routine(void *a) { return a; }
+int
+main ()
+{
+pthread_t th; pthread_attr_t attr;
+ pthread_create(&th, 0, start_routine, 0);
+ pthread_join(th, 0);
+ pthread_attr_init(&attr);
+ pthread_cleanup_push(routine, 0);
+ pthread_cleanup_pop(0) /* ; */
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ax_pthread_ok=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ LIBS="$ax_pthread_save_LIBS"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5
+$as_echo "$ax_pthread_ok" >&6; }
+ if test "x$ax_pthread_ok" = "xyes"; then :
+ break
+fi
+
+ PTHREAD_LIBS=""
+ PTHREAD_CFLAGS=""
+done
+fi
+
+# Clang needs special handling, because older versions handle the -pthread
+# option in a rather... idiosyncratic way
+
+if test "x$ax_pthread_clang" = "xyes"; then
+
+ # Clang takes -pthread; it has never supported any other flag
+
+ # (Note 1: This will need to be revisited if a system that Clang
+ # supports has POSIX threads in a separate library. This tends not
+ # to be the way of modern systems, but it's conceivable.)
+
+ # (Note 2: On some systems, notably Darwin, -pthread is not needed
+ # to get POSIX threads support; the API is always present and
+ # active. We could reasonably leave PTHREAD_CFLAGS empty. But
+ # -pthread does define _REENTRANT, and while the Darwin headers
+ # ignore this macro, third-party headers might not.)
+
+ # However, older versions of Clang make a point of warning the user
+ # that, in an invocation where only linking and no compilation is
+ # taking place, the -pthread option has no effect ("argument unused
+ # during compilation"). They expect -pthread to be passed in only
+ # when source code is being compiled.
+ #
+ # Problem is, this is at odds with the way Automake and most other
+ # C build frameworks function, which is that the same flags used in
+ # compilation (CFLAGS) are also used in linking. Many systems
+ # supported by AX_PTHREAD require exactly this for POSIX threads
+ # support, and in fact it is often not straightforward to specify a
+ # flag that is used only in the compilation phase and not in
+ # linking. Such a scenario is extremely rare in practice.
+ #
+ # Even though use of the -pthread flag in linking would only print
+ # a warning, this can be a nuisance for well-run software projects
+ # that build with -Werror. So if the active version of Clang has
+ # this misfeature, we search for an option to squash it.
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5
+$as_echo_n "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; }
+if ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown
+ # Create an alternate version of $ac_link that compiles and
+ # links in two steps (.c -> .o, .o -> exe) instead of one
+ # (.c -> exe), because the warning occurs only in the second
+ # step
+ ax_pthread_save_ac_link="$ac_link"
+ ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g'
+ ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"`
+ ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)"
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do
+ if test "x$ax_pthread_try" = "xunknown"; then :
+ break
+fi
+ CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS"
+ ac_link="$ax_pthread_save_ac_link"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int main(void){return 0;}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_link="$ax_pthread_2step_ac_link"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int main(void){return 0;}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ done
+ ac_link="$ax_pthread_save_ac_link"
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ if test "x$ax_pthread_try" = "x"; then :
+ ax_pthread_try=no
+fi
+ ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5
+$as_echo "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; }
+
+ case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in
+ no | unknown) ;;
+ *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;;
+ esac
+
+fi # $ax_pthread_clang = yes
+
+# Various other checks:
+if test "x$ax_pthread_ok" = "xyes"; then
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ ax_pthread_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+ LIBS="$PTHREAD_LIBS $LIBS"
+
+ # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5
+$as_echo_n "checking for joinable pthread attribute... " >&6; }
+if ${ax_cv_PTHREAD_JOINABLE_ATTR+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ax_cv_PTHREAD_JOINABLE_ATTR=unknown
+ for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <pthread.h>
+int
+main ()
+{
+int attr = $ax_pthread_attr; return attr /* ; */
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ done
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5
+$as_echo "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; }
+ if test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \
+ test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \
+ test "x$ax_pthread_joinable_attr_defined" != "xyes"; then :
+
+cat >>confdefs.h <<_ACEOF
+#define PTHREAD_CREATE_JOINABLE $ax_cv_PTHREAD_JOINABLE_ATTR
+_ACEOF
+
+ ax_pthread_joinable_attr_defined=yes
+
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether more special flags are required for pthreads" >&5
+$as_echo_n "checking whether more special flags are required for pthreads... " >&6; }
+if ${ax_cv_PTHREAD_SPECIAL_FLAGS+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ax_cv_PTHREAD_SPECIAL_FLAGS=no
+ case $target_os in
+ solaris*)
+ ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS"
+ ;;
+ esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5
+$as_echo "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; }
+ if test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \
+ test "x$ax_pthread_special_flags_added" != "xyes"; then :
+ PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS"
+ ax_pthread_special_flags_added=yes
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5
+$as_echo_n "checking for PTHREAD_PRIO_INHERIT... " >&6; }
+if ${ax_cv_PTHREAD_PRIO_INHERIT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <pthread.h>
+int
+main ()
+{
+int i = PTHREAD_PRIO_INHERIT;
+ return i;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ax_cv_PTHREAD_PRIO_INHERIT=yes
+else
+ ax_cv_PTHREAD_PRIO_INHERIT=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5
+$as_echo "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; }
+ if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \
+ test "x$ax_pthread_prio_inherit_defined" != "xyes"; then :
+
+$as_echo "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h
+
+ ax_pthread_prio_inherit_defined=yes
+
+fi
+
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ LIBS="$ax_pthread_save_LIBS"
+
+ # More AIX lossage: compile with *_r variant
+ if test "x$GCC" != "xyes"; then
+ case $target_os in
+ aix*)
+ case "x/$CC" in #(
+ x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6) :
+ #handle absolute path differently from PATH based program lookup
+ case "x$CC" in #(
+ x/*) :
+
+ if as_fn_executable_p ${CC}_r; then :
+ PTHREAD_CC="${CC}_r"
+fi
+ if test "x${CXX}" != "x"; then :
+ if as_fn_executable_p ${CXX}_r; then :
+ PTHREAD_CXX="${CXX}_r"
+fi
+fi
+ ;; #(
+ *) :
+
+ for ac_prog in ${CC}_r
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_PTHREAD_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$PTHREAD_CC"; then
+ ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_PTHREAD_CC="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+PTHREAD_CC=$ac_cv_prog_PTHREAD_CC
+if test -n "$PTHREAD_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5
+$as_echo "$PTHREAD_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ test -n "$PTHREAD_CC" && break
+done
+test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
+
+ if test "x${CXX}" != "x"; then :
+ for ac_prog in ${CXX}_r
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_PTHREAD_CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$PTHREAD_CXX"; then
+ ac_cv_prog_PTHREAD_CXX="$PTHREAD_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_PTHREAD_CXX="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+PTHREAD_CXX=$ac_cv_prog_PTHREAD_CXX
+if test -n "$PTHREAD_CXX"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CXX" >&5
+$as_echo "$PTHREAD_CXX" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ test -n "$PTHREAD_CXX" && break
+done
+test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX"
+
+fi
+
+ ;;
+esac
+ ;; #(
+ *) :
+ ;;
+esac
+ ;;
+ esac
+ fi
+fi
+
+test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
+test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX"
+
+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
+if test "x$ax_pthread_ok" = "xyes"; then
+ if test "$CC" = "$PTHREAD_CC" -o -z "$ac_original_cc"; then
+ have_pthread=yes
+ else
+ ac_prog_cc_no_pthread=yes
+ fi
+
+ :
+else
+ ax_pthread_ok=no
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ if test "$have_pthread" = yes; then
+ $as_echo "#define HAVE_PTHREAD 1" >>confdefs.h
+
+ CC="$PTHREAD_CC"
+ fi
+fi
+
+###############################################################################
+#
+# Handle --with-gles
+# Must come before --with-gl
+#
+###############################################################################
+
+with_jwzgles_req=unspecified
+have_jwzgles=no
+
+# Check whether --with-gles was given.
+if test "${with_gles+set}" = set; then :
+ withval=$with_gles; # This is documented after --with-gl
+ with_jwzgles="$withval"; with_jwzgles_req="$withval"
+else
+ with_jwzgles=no
+fi
+
+ case "$with_jwzgles" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JWZGLES headers" >&5
+$as_echo_n "checking for JWZGLES headers... " >&6; }
+ d=$with_jwzgles/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JWZGLES libs" >&5
+$as_echo_n "checking for JWZGLES libs... " >&6; }
+ d=$with_jwzgles/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_jwzgles_req="yes"
+ with_jwzgles=$with_jwzgles_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-gles must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+if test "$with_jwzgles" = yes; then
+ have_jwzgles=yes
+ JWZGLES_OBJS='$(JWXYZ_BIN)/jwzgles.o'
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: emulating OpenGL 1.3 in terms of OpenGLES 1.x." >&5
+$as_echo "emulating OpenGL 1.3 in terms of OpenGLES 1.x." >&6; }
+elif test "$with_jwzgles" != no; then
+ echo "error: must be yes or no: --with-gles=$with_jwzgles"
+ exit 1
+fi
###############################################################################
#
@@ -13093,10 +14190,13 @@ fi
#
###############################################################################
+#### H1
+
have_gl=no
ac_have_mesa_gl=no
with_gl_req=unspecified
gl_halfassed=no
+have_glext=no
# Check whether --with-gl was given.
if test "${with_gl+set}" = set; then :
@@ -13105,8 +14205,6 @@ else
with_gl=yes
fi
-
-
case "$with_gl" in
yes) ;;
no) ;;
@@ -13150,9 +14248,13 @@ $as_echo "not found ($d: no such directory)" >&6; }
;;
esac
-
-ac_mesagl_version=unknown
-ac_mesagl_version_string=unknown
+# Some GL libraries require pthreads, so use the pthreads flags when
+# testing them, then set them back after.
+#
+ac_save_pthreads_CFLAGS="$CFLAGS"
+ac_save_pthreads_LIBS="$LIBS"
+CFLAGS="$PTHREAD_CFLAGS $CFLAGS"
+LIBS="$PTHREAD_LIBS $LIBS"
if test "$with_gl" = yes; then
@@ -13169,9 +14271,8 @@ else
have_gl=no
fi
-
- CPPFLAGS="$ac_save_CPPFLAGS"
- if test "$have_gl" = yes ; then
+ CPPFLAGS="$ac_save_CPPFLAGS";
+ if test "$have_gl" = yes; then
ac_save_CPPFLAGS="$CPPFLAGS"
if test \! -z "$includedir" ; then
@@ -13179,114 +14280,149 @@ fi
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_compile "$LINENO" "GL/glx.h" "ac_cv_header_GL_glx_h" "#include <GL/gl.h>
-"
-if test "x$ac_cv_header_GL_glx_h" = xyes; then :
+ ac_fn_c_check_header_mongrel "$LINENO" "GL/glu.h" "ac_cv_header_GL_glu_h" "$ac_includes_default"
+if test "x$ac_cv_header_GL_glu_h" = xyes; then :
have_gl=yes
else
have_gl=no
fi
-
- CPPFLAGS="$ac_save_CPPFLAGS"
+ CPPFLAGS="$ac_save_CPPFLAGS";
fi
+fi
- # If we have the headers, try and figure out which vendor it's from.
+if test "$with_gl" = yes; then
+ #
+ # Since the OpenGL and GLES specifications are a complete dumpster fire,
+ # it's not easy to figure out how what libraries to use.
+ #
+ # OpenGLES library names:
+ #
+ # 1.x: libGLESv1_CM
+ # 2.x: libGLESv2
+ # 3.x: libGLESv2 on Windows, libGLESv3 on Android
#
- if test "$have_gl" = yes ; then
+ # On modern Linux systems, these libraries exist:
+ #
+ # libGL - a superset of everything up to and including OpenGL 4.6
+ # libGLESv1_CM - OpenGLES 1.1, meaning it omits much of OpenGL 1.3
+ # libGLESv2 - OpenGLES 2 and 3, meaning it omits even more of OpenGL 1.3
+ #
+ # Since Linux systems support OpenGL 1.3, those link against only libGL.
+ #
+ # Unless we are using --with-gles on Linux, in which case we are attempting
+ # to simulate a system that does not natively support OpenGL 1.3. In that
+ # case, we use the v1 and/or v2 libraries instead.
+ #
+ # Common practice on Android seems to be to link against the v1, v2 and v3
+ # libraries in order, and then do runtime checks to see which set of
+ # functions is actually supported by the runtime. Just because you linked
+ # against a GLES3 library doesn't mean that the hardware supports it: most
+ # of these functions are just syscall-like stubs.
+ #
+ # See the commentary atop jwxyz/jwzgles.c for discussion of OpenGL versions.
+ #
+ if test "$have_gl" = yes; then
+ have_gl=no
- # We need to know whether it's MesaGL so that we know which libraries
- # to link against.
- #
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GL is really MesaGL" >&5
-$as_echo_n "checking whether GL is really MesaGL... " >&6; }
-if ${ac_cv_have_mesa_gl+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_have_mesa_gl=no
- if test "$ac_macosx" = no; then
- # WTF! MacOS 10.5.0 ships the Mesa GL headers!
- # It's not really Mesa, is it?
+ if test "$have_jwzgles" = yes; then
+
+ # Only check for the v1/2/3 libraries on Linux when using --with-gles
+ # to emulate a system that does not natively support OpenGL 1.3.
+
+ # Check for GLES 3.x
ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
if test \! -z "$includedir" ; then
CPPFLAGS="$CPPFLAGS -I$includedir"
fi
+ # note: $X_CFLAGS includes $x_includes
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glDrawElements in -lGLESv3" >&5
+$as_echo_n "checking for glDrawElements in -lGLESv3... " >&6; }
+if ${ac_cv_lib_GLESv3_glDrawElements+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lGLESv3 $GL_LIBS -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#include <GL/glx.h>
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char glDrawElements ();
+int
+main ()
+{
+return glDrawElements ();
+ ;
+ return 0;
+}
_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "Mesa|MESA" >/dev/null 2>&1; then :
- ac_cv_have_mesa_gl=yes
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_GLESv3_glDrawElements=yes
+else
+ ac_cv_lib_GLESv3_glDrawElements=no
fi
-rm -f conftest*
-
- CPPFLAGS="$ac_save_CPPFLAGS"
- fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLESv3_glDrawElements" >&5
+$as_echo "$ac_cv_lib_GLESv3_glDrawElements" >&6; }
+if test "x$ac_cv_lib_GLESv3_glDrawElements" = xyes; then :
+ have_gl=yes
+ gl_lib_1="GLESv3"
+ GL_LIBS="-lGLESv3 $GL_LIBS"
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_mesa_gl" >&5
-$as_echo "$ac_cv_have_mesa_gl" >&6; }
- ac_have_mesa_gl=$ac_cv_have_mesa_gl
-
- gl_lib_1=""
- GL_LIBS=""
- if test "$ac_macosx" = yes; then
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
- # Without these, every link against libGL gets a bunch of useless
- # warnings.
- #
- osx_crud="-bind_at_load -multiply_defined suppress"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: adding \"$osx_crud\" to GL_LIBS" >&5
-$as_echo "adding \"$osx_crud\" to GL_LIBS" >&6; }
- GL_LIBS="$GL_LIBS $osx_crud"
- unset osx_crud
-
- # New lossage in 10.5.0: without this, we get:
- # ld: cycle in dylib re-exports with /usr/X11/lib/libGL.dylib
- #
- osx_crud="/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib"
- osx_crud="-Wl,-dylib_file,${osx_crud}:${osx_crud}"
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: adding \"$osx_crud\" to GL_LIBS" >&5
-$as_echo "adding \"$osx_crud\" to GL_LIBS" >&6; }
- GL_LIBS="$GL_LIBS $osx_crud"
- unset osx_crud
-
- # New lossage in 10.6.8: we can't allow -L/opt/local/lib to be in the
- # link line, or at runtime XQueryExtension gets a segv due to some kind
- # of library version skew. Libs must come from /usr/X11/lib even if
- # $prefix and/or $exec_prefix are set to /opt/local/.
- #
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: omitting \"$libdir\" from LDFLAGS" >&5
-$as_echo "omitting \"$libdir\" from LDFLAGS" >&6; }
- libdir=''
+ # Check for GLES 2.x
- # Looks like as of OSX 10.12, gcc can't do ObjC.
- OBJCC="clang -Wall"
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
- fi
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
- # Some versions of MesaGL are compiled to require -lpthread.
- # So if the Mesa headers exist, and -lpthread exists, then always
- # link -lpthread after the Mesa libs (be they named -lGL or -lMesaGL.)
- #
- # Oftentimes, AX_PTHREAD will bring in -lpthread as well; but that ends
- # up before -l(Mesa)GL, instead of after where it would belong.
- #
- if test "$ac_have_mesa_gl" = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5
-$as_echo_n "checking for pthread_create in -lpthread... " >&6; }
-if ${ac_cv_lib_pthread_pthread_create+:} false; then :
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glDrawElements in -lGLESv2" >&5
+$as_echo_n "checking for glDrawElements in -lGLESv2... " >&6; }
+if ${ac_cv_lib_GLESv2_glDrawElements+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lpthread $LIBS"
+LIBS="-lGLESv2 $GL_LIBS -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -13296,39 +14432,37 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
#ifdef __cplusplus
extern "C"
#endif
-char pthread_create ();
+char glDrawElements ();
int
main ()
{
-return pthread_create ();
+return glDrawElements ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_pthread_pthread_create=yes
+ ac_cv_lib_GLESv2_glDrawElements=yes
else
- ac_cv_lib_pthread_pthread_create=no
+ ac_cv_lib_GLESv2_glDrawElements=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5
-$as_echo "$ac_cv_lib_pthread_pthread_create" >&6; }
-if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then :
- GL_LIBS="-lpthread"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLESv2_glDrawElements" >&5
+$as_echo "$ac_cv_lib_GLESv2_glDrawElements" >&6; }
+if test "x$ac_cv_lib_GLESv2_glDrawElements" = xyes; then :
+ have_gl=yes
+ gl_lib_1="GLESv2"
+ GL_LIBS="-lGLESv2 $GL_LIBS"
fi
- fi
-
-
- # If we have Mesa headers, check to see if we can link against -lMesaGL.
- # If we don't have Mesa headers, or we don't have -lMesaGL, try -lGL.
- # Else, warn that GL is busted. (We have the headers, but no libs.)
- #
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
- if test "$ac_have_mesa_gl" = yes ; then
+ # Check for GLES 1.x
ac_save_CPPFLAGS="$CPPFLAGS"
ac_save_LDFLAGS="$LDFLAGS"
@@ -13348,13 +14482,13 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glXCreateContext in -lMesaGL" >&5
-$as_echo_n "checking for glXCreateContext in -lMesaGL... " >&6; }
-if ${ac_cv_lib_MesaGL_glXCreateContext+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glDrawElements in -lGLESv1_CM" >&5
+$as_echo_n "checking for glDrawElements in -lGLESv1_CM... " >&6; }
+if ${ac_cv_lib_GLESv1_CM_glDrawElements+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lMesaGL -lMesaGLU $GL_LIBS -lX11 -lXext $VIDMODE_LIBS -lm $LIBS"
+LIBS="-lGLESv1_CM $GL_LIBS -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -13364,38 +14498,39 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
#ifdef __cplusplus
extern "C"
#endif
-char glXCreateContext ();
+char glDrawElements ();
int
main ()
{
-return glXCreateContext ();
+return glDrawElements ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_MesaGL_glXCreateContext=yes
+ ac_cv_lib_GLESv1_CM_glDrawElements=yes
else
- ac_cv_lib_MesaGL_glXCreateContext=no
+ ac_cv_lib_GLESv1_CM_glDrawElements=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_MesaGL_glXCreateContext" >&5
-$as_echo "$ac_cv_lib_MesaGL_glXCreateContext" >&6; }
-if test "x$ac_cv_lib_MesaGL_glXCreateContext" = xyes; then :
- gl_lib_1="MesaGL"
- GL_LIBS="-lMesaGL -lMesaGLU $VIDMODE_LIBS $GL_LIBS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLESv1_CM_glDrawElements" >&5
+$as_echo "$ac_cv_lib_GLESv1_CM_glDrawElements" >&6; }
+if test "x$ac_cv_lib_GLESv1_CM_glDrawElements" = xyes; then :
+ have_gl=yes
+ gl_lib_1="GLESv1_CM"
+ GL_LIBS="-lGLESv1_CM $GL_LIBS"
fi
CPPFLAGS="$ac_save_CPPFLAGS"
LDFLAGS="$ac_save_LDFLAGS"
# LIBS="$ac_save_LIBS"
- fi
+ else # $have_jwzgles = no
- if test "$gl_lib_1" = "" ; then
+ # Check for OpenGL 1.x and/or OpenGL 4.x
ac_save_CPPFLAGS="$CPPFLAGS"
ac_save_LDFLAGS="$LDFLAGS"
@@ -13415,13 +14550,13 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glXCreateContext in -lGL" >&5
-$as_echo_n "checking for glXCreateContext in -lGL... " >&6; }
-if ${ac_cv_lib_GL_glXCreateContext+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glEnable in -lGL" >&5
+$as_echo_n "checking for glEnable in -lGL... " >&6; }
+if ${ac_cv_lib_GL_glEnable+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-LIBS="-lGL -lGLU $GL_LIBS -lX11 -lXext $VIDMODE_LIBS -lm $LIBS"
+LIBS="-lGL $GL_LIBS -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -13431,148 +14566,260 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
#ifdef __cplusplus
extern "C"
#endif
-char glXCreateContext ();
+char glEnable ();
int
main ()
{
-return glXCreateContext ();
+return glEnable ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_GL_glXCreateContext=yes
+ ac_cv_lib_GL_glEnable=yes
else
- ac_cv_lib_GL_glXCreateContext=no
+ ac_cv_lib_GL_glEnable=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GL_glXCreateContext" >&5
-$as_echo "$ac_cv_lib_GL_glXCreateContext" >&6; }
-if test "x$ac_cv_lib_GL_glXCreateContext" = xyes; then :
- gl_lib_1="GL"
- GL_LIBS="-lGL -lGLU $VIDMODE_LIBS $GL_LIBS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GL_glEnable" >&5
+$as_echo "$ac_cv_lib_GL_glEnable" >&6; }
+if test "x$ac_cv_lib_GL_glEnable" = xyes; then :
+ have_gl=yes
+ gl_lib_1="GL"
+ GL_LIBS="-lGL $GL_LIBS"
fi
CPPFLAGS="$ac_save_CPPFLAGS"
LDFLAGS="$ac_save_LDFLAGS"
# LIBS="$ac_save_LIBS"
- fi
+ # Check for MesaGL 1.x, but only if libGL doesn't exist.
+ if test "$have_gl" = no; then
- if test "$gl_lib_1" = "" ; then
- # we have headers, but no libs -- bail.
- have_gl=no
- ac_have_mesa_gl=no
- gl_halfassed=yes
- else
- # linking works -- we can build the GL hacks.
- $as_echo "#define HAVE_GL 1" >>confdefs.h
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glEnable in -lMesaGL" >&5
+$as_echo_n "checking for glEnable in -lMesaGL... " >&6; }
+if ${ac_cv_lib_MesaGL_glEnable+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lMesaGL $GL_LIBS -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char glEnable ();
+int
+main ()
+{
+return glEnable ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_MesaGL_glEnable=yes
+else
+ ac_cv_lib_MesaGL_glEnable=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_MesaGL_glEnable" >&5
+$as_echo "$ac_cv_lib_MesaGL_glEnable" >&6; }
+if test "x$ac_cv_lib_MesaGL_glEnable" = xyes; then :
+ have_gl=yes
+ gl_lib_1="MesaGL"
+ GL_LIBS="-lMesaGL $GL_LIBS"
+fi
- if test "$ac_have_mesa_gl" = yes ; then
- $as_echo "#define HAVE_MESA_GL 1" >>confdefs.h
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
fi
fi
fi
-
- # Now that we know we have GL headers and libs, do some more GL testing.
+ # Figure out whether the GLU functions are in the main GL libraries or
+ # in -lGLU. Since Android does not have GLU, we don't link against libGLU
+ # when using --with-gles on Linux.
#
+ if test "$have_gl" = yes -a "$have_jwzgles" = no; then
- if test "$have_gl" = yes ; then
- # If it's MesaGL, we'd like to issue a warning if the version number
- # is less than or equal to 2.6, because that version had a security bug.
- #
- if test "$ac_have_mesa_gl" = yes; then
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking MesaGL version number" >&5
-$as_echo_n "checking MesaGL version number... " >&6; }
-if ${ac_cv_mesagl_version_string+:} false; then :
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ as_ac_Lib=`$as_echo "ac_cv_lib_$gl_lib_1''_gluBuild2DMipmaps" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gluBuild2DMipmaps in -l$gl_lib_1" >&5
+$as_echo_n "checking for gluBuild2DMipmaps in -l$gl_lib_1... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
$as_echo_n "(cached) " >&6
else
- cat > conftest.$ac_ext <<EOF
-#line 13497 "configure"
-#include "confdefs.h"
-#include <GL/gl.h>
-#ifndef MESA_MAJOR_VERSION
-# include <GL/xmesa.h>
-# ifdef XMESA_MAJOR_VERSION
- /* Around Mesa 3.2, they took out the Mesa version number, so instead,
- we have to check the XMesa version number (the number of the X protocol
- support, which seems to be the same as the Mesa version number.)
- */
-# define MESA_MAJOR_VERSION XMESA_MAJOR_VERSION
-# define MESA_MINOR_VERSION XMESA_MINOR_VERSION
-# else
- /* Oh great. Some time after 3.4, they took out the xmesa.h header file,
- so we have no way of telling what version of Mesa this is at all.
- So, we'll guess that the osmesa version (the "offscreen protocol")
- is less than or equal to the real mesa version number. Except that
- if OSmesa is 3.3, assume at least Mesa 3.4, since OSmesa was 3.3 in
- Mesa 3.4. And Mesa 3.3 had xmesa.h. What a complete load of shit!
- */
-# include <GL/osmesa.h>
-# define MESA_MAJOR_VERSION OSMESA_MAJOR_VERSION
-# define MESA_MINOR_VERSION OSMESA_MINOR_VERSION or newer, probably?
-# if OSMESA_MAJOR_VERSION == 3 && OSMESA_MINOR_VERSION == 3
-# undef MESA_MINOR_VERSION
-# define MESA_MINOR_VERSION 4 or newer, probably?
-# endif
-# endif
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$gl_lib_1 $GL_LIBS -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
#endif
-configure: MESA_MAJOR_VERSION MESA_MINOR_VERSION
-EOF
+char gluBuild2DMipmaps ();
+int
+main ()
+{
+return gluBuild2DMipmaps ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_LIB$gl_lib_1" | $as_tr_cpp` 1
+_ACEOF
- ac_save_CPPFLAGS="$CPPFLAGS"
- if test \! -z "$includedir" ; then
- CPPFLAGS="$CPPFLAGS -I$includedir"
- fi
- CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ LIBS="-l$gl_lib_1 $LIBS"
- mglv=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | grep configure:`
+else
+ have_gl=no
+fi
- # M4 sucks!!
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
- mglv=`echo "$mglv" | sed -n \
- 's/^configure: *\([0-9][0-9]*\) *\([0-9].*\)$/\1.\2/p'`
+ if test "$have_gl" = no; then
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
- rm -f conftest.$ac_ext
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
- CPPFLAGS="$ac_save_CPPFLAGS"
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
- if test "$mglv" = ""; then
- ac_mesagl_version=unknown
- ac_mesagl_version_string=unknown
- else
- ac_mesagl_version_string="$mglv"
- # M4 sucks!!
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gluBuild2DMipmaps in -lGLU" >&5
+$as_echo_n "checking for gluBuild2DMipmaps in -lGLU... " >&6; }
+if ${ac_cv_lib_GLU_gluBuild2DMipmaps+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lGLU $GL_LIBS -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
- maj=`echo "$mglv" | sed -n 's/^\([0-9][0-9]*\)\..*$/\1/p'`
- min=`echo "$mglv" | sed -n 's/^.*\.\([0-9][0-9]*\).*$/\1/p'`
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gluBuild2DMipmaps ();
+int
+main ()
+{
+return gluBuild2DMipmaps ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_GLU_gluBuild2DMipmaps=yes
+else
+ ac_cv_lib_GLU_gluBuild2DMipmaps=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLU_gluBuild2DMipmaps" >&5
+$as_echo "$ac_cv_lib_GLU_gluBuild2DMipmaps" >&6; }
+if test "x$ac_cv_lib_GLU_gluBuild2DMipmaps" = xyes; then :
+ have_gl=yes
+ GL_LIBS="-lGLU $GL_LIBS"
+else
+ have_gl=no
+ gl_halfassed=yes
+fi
- ac_mesagl_version=`echo "$maj * 1000 + $min" | bc`
- if test -z "$ac_mesagl_version"; then
- ac_mesagl_version=unknown
- ac_mesagl_version_string=unknown
- fi
- fi
- ac_cv_mesagl_version=$ac_mesagl_version
- ac_cv_mesagl_version_string=$ac_mesagl_version_string
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_mesagl_version_string" >&5
-$as_echo "$ac_cv_mesagl_version_string" >&6; }
- ac_mesagl_version=$ac_cv_mesagl_version
- ac_mesagl_version_string=$ac_cv_mesagl_version_string
fi
+ fi
+ if test "$have_gl" = yes; then
- # Check for OpenGL 1.1 features.
- #
+ $as_echo "#define HAVE_GL 1" >>confdefs.h
+
+ # OpenGL 1.0 didn't have multiple textures.
ac_save_CPPFLAGS="$CPPFLAGS"
ac_save_LDFLAGS="$LDFLAGS"
@@ -13641,6 +14888,237 @@ fi
LDFLAGS="$ac_save_LDFLAGS"
# LIBS="$ac_save_LIBS"
+ # Check for native GLES1
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ as_ac_Lib=`$as_echo "ac_cv_lib_$gl_lib_1''_glBindBuffer" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for glBindBuffer in -l$gl_lib_1" >&5
+$as_echo_n "checking for glBindBuffer in -l$gl_lib_1... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$gl_lib_1 $GL_LIBS -lX11 -lXext -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char glBindBuffer ();
+int
+main ()
+{
+return glBindBuffer ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ $as_echo "#define HAVE_GLES 1" >>confdefs.h
+
+else
+ true
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ # Check for GLSL and GLES2
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "GL/glext.h" "ac_cv_header_GL_glext_h" "#include <GL/gl.h>
+"
+if test "x$ac_cv_header_GL_glext_h" = xyes; then :
+ have_glext=yes
+else
+ have_glext=no
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ if test "$have_glext" = yes ; then
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ as_ac_Lib=`$as_echo "ac_cv_lib_$gl_lib_1''_glUseProgram" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for glUseProgram in -l$gl_lib_1" >&5
+$as_echo_n "checking for glUseProgram in -l$gl_lib_1... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$gl_lib_1 $GL_LIBS -lX11 -lXext -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char glUseProgram ();
+int
+main ()
+{
+return glUseProgram ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ $as_echo "#define HAVE_GLSL 1" >>confdefs.h
+
+ $as_echo "#define HAVE_GLES2 1" >>confdefs.h
+
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ fi
+
+ # Check for GLES3
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ as_ac_Lib=`$as_echo "ac_cv_lib_$gl_lib_1''_glBlitFramebuffer" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for glBlitFramebuffer in -l$gl_lib_1" >&5
+$as_echo_n "checking for glBlitFramebuffer in -l$gl_lib_1... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$gl_lib_1 $GL_LIBS -lX11 -lXext -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char glBlitFramebuffer ();
+int
+main ()
+{
+return glBlitFramebuffer ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ $as_echo "#define HAVE_GLES3 1" >>confdefs.h
+
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ if test "$have_jwzgles" = yes; then
+ $as_echo "#define HAVE_JWZGLES 1" >>confdefs.h
+
+ $as_echo "#define HAVE_GLES 1" >>confdefs.h
+
+ fi
+
fi
elif test "$with_gl" != no; then
@@ -13648,6 +15126,331 @@ elif test "$with_gl" != no; then
exit 1
fi
+###############################################################################
+#
+# Handle --with-glx
+#
+###############################################################################
+
+have_glx=no
+have_egl=no
+with_egl_req=unspecified
+
+# Check whether --with-glx was given.
+if test "${with_glx+set}" = set; then :
+ withval=$with_glx; with_egl="$withval"; with_egl_req="$withval"
+else
+ with_glx=no
+fi
+
+ case "$with_glx" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLX headers" >&5
+$as_echo_n "checking for GLX headers... " >&6; }
+ d=$with_glx/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLX libs" >&5
+$as_echo_n "checking for GLX libs... " >&6; }
+ d=$with_glx/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_glx_req="yes"
+ with_glx=$with_glx_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-glx must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+if test "$with_glx" = yes; then
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_mongrel "$LINENO" "GLX/glx.h" "ac_cv_header_GLX_glx_h" "$ac_includes_default"
+if test "x$ac_cv_header_GLX_glx_h" = xyes; then :
+ have_glx=yes
+else
+ have_glx=no
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+elif test "$with_glx" != no; then
+ echo "error: must be yes or no: --with-glx=$with_glx"
+ exit 1
+fi
+
+if test "$have_gl" = yes; then
+
+ # See if GLX functions are in -LGL.
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ as_ac_Lib=`$as_echo "ac_cv_lib_$gl_lib_1''_glXCreateContext" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for glXCreateContext in -l$gl_lib_1" >&5
+$as_echo_n "checking for glXCreateContext in -l$gl_lib_1... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$gl_lib_1 $GL_LIBS -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char glXCreateContext ();
+int
+main ()
+{
+return glXCreateContext ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ have_glx=yes
+else
+ have_glx=no
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ # See if EGL functions are in -LGL.
+ egl_lib=""
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ as_ac_Lib=`$as_echo "ac_cv_lib_$gl_lib_1''_eglCreatePlatformWindowSurface" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for eglCreatePlatformWindowSurface in -l$gl_lib_1" >&5
+$as_echo_n "checking for eglCreatePlatformWindowSurface in -l$gl_lib_1... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$gl_lib_1 $GL_LIBS -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char eglCreatePlatformWindowSurface ();
+int
+main ()
+{
+return eglCreatePlatformWindowSurface ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ have_egl=yes
+else
+ have_egl=no
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ if test "$have_egl" = no; then
+ # See if EGL functions are in -lEGL.
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for eglCreatePlatformWindowSurface in -lEGL" >&5
+$as_echo_n "checking for eglCreatePlatformWindowSurface in -lEGL... " >&6; }
+if ${ac_cv_lib_EGL_eglCreatePlatformWindowSurface+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lEGL $GL_LIBS -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char eglCreatePlatformWindowSurface ();
+int
+main ()
+{
+return eglCreatePlatformWindowSurface ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_EGL_eglCreatePlatformWindowSurface=yes
+else
+ ac_cv_lib_EGL_eglCreatePlatformWindowSurface=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_EGL_eglCreatePlatformWindowSurface" >&5
+$as_echo "$ac_cv_lib_EGL_eglCreatePlatformWindowSurface" >&6; }
+if test "x$ac_cv_lib_EGL_eglCreatePlatformWindowSurface" = xyes; then :
+ have_egl=yes
+ egl_lib="EGL"
+else
+ have_egl=no
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ fi
+
+ # If both GLX and EGL exist, use GLX only if requested.
+ if test "$with_glx" = yes -a "$have_glx" = yes; then
+ have_egl=no
+ fi
+
+ if test "$have_egl" = yes; then
+ $as_echo "#define HAVE_EGL 1" >>confdefs.h
+
+ if test \! -z "$egl_lib"; then
+ GL_LIBS="-l$egl_lib $GL_LIBS"
+ fi
+ fi
+
+ # One of them is required
+ if test "$have_egl" = no -a "$have_glx" = no; then
+ have_gl=no
+ gl_halfassed=yes
+ fi
+
+ # --with-gles means that we are emulating a system that supports GLES but
+ # does not support OpenGL 1.3 (e.g., using Linux to simulate an Android-like
+ # environment). On such a system, GLE is required and GLX wouldn't exist.
+ # There is no way to request a GLES 3.0 runtime context using GLX.
+ #
+ if test "$have_jwzgles" = yes -a "$have_egl" = no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Using --with-glx and --with-gles together is a bad idea." >&5
+$as_echo "$as_me: WARNING: Using --with-glx and --with-gles together is a bad idea." >&2;}
+ fi
+
+fi
+
+# Restore flags after testing OpenGL libraries.
+#
+CFLAGS="$ac_save_pthreads_CFLAGS"
+LIBS="$ac_save_pthreads_LIBS"
###############################################################################
#
@@ -13666,8 +15469,6 @@ else
with_gle=yes
fi
-
-
case "$with_gle" in
yes) ;;
no) ;;
@@ -13711,14 +15512,12 @@ $as_echo "not found ($d: no such directory)" >&6; }
;;
esac
-
GLE_LIBS=""
if test "$have_gl" = no ; then
true
elif test "$with_gle" = yes; then
-
ac_save_CPPFLAGS="$CPPFLAGS"
if test \! -z "$includedir" ; then
CPPFLAGS="$CPPFLAGS -I$includedir"
@@ -13733,7 +15532,6 @@ else
have_gle3=no
fi
-
CPPFLAGS="$ac_save_CPPFLAGS"
if test "$have_gle3" = yes ; then
have_gle=yes;
@@ -13753,7 +15551,6 @@ else
have_gle=no
fi
-
CPPFLAGS="$ac_save_CPPFLAGS"
if test "$have_gle" = yes ; then
@@ -13771,7 +15568,6 @@ else
have_gle=no
fi
-
CPPFLAGS="$ac_save_CPPFLAGS"
fi
fi
@@ -14008,32 +15804,31 @@ elif test "$with_gle" != no; then
fi
-
###############################################################################
#
-# Handle --with-gles
+# Check for -ljpeg
#
###############################################################################
-with_gles_req=unspecified
+have_jpeg=no
+with_jpeg_req=unspecified
+jpeg_halfassed=no
-# Check whether --with-gles was given.
-if test "${with_gles+set}" = set; then :
- withval=$with_gles; with_gles="$withval"; with_gles_req="$withval"
+# Check whether --with-jpeg was given.
+if test "${with_jpeg+set}" = set; then :
+ withval=$with_jpeg; with_jpeg="$withval"; with_jpeg_req="$withval"
else
- with_gles=no
+ with_jpeg=yes
fi
-
-
- case "$with_gles" in
+ case "$with_jpeg" in
yes) ;;
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JWZGLES headers" >&5
-$as_echo_n "checking for JWZGLES headers... " >&6; }
- d=$with_gles/include
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JPEG headers" >&5
+$as_echo_n "checking for JPEG headers... " >&6; }
+ d=$with_jpeg/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
@@ -14043,9 +15838,9 @@ $as_echo "$d" >&6; }
$as_echo "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JWZGLES libs" >&5
-$as_echo_n "checking for JWZGLES libs... " >&6; }
- d=$with_gles/lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JPEG libs" >&5
+$as_echo_n "checking for JPEG libs... " >&6; }
+ d=$with_jpeg/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
@@ -14056,30 +15851,113 @@ $as_echo "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
- with_gles_req="yes"
- with_gles=$with_gles_req
+ with_jpeg_req="yes"
+ with_jpeg=$with_jpeg_req
;;
*)
echo ""
- echo "error: argument to --with-gles must be \"yes\", \"no\", or a directory."
+ echo "error: argument to --with-jpeg must be \"yes\", \"no\", or a directory."
echo " If it is a directory, then \`DIR/include' will be added to"
echo " the -I list, and \`DIR/lib' will be added to the -L list."
exit 1
;;
esac
+if test "$with_jpeg" != yes -a "$with_jpeg" != no ; then
+ echo "error: must be yes or no: --with-jpeg=$with_jpeg"
+ exit 1
+fi
+
+if test "$with_jpeg" = yes; then
-if test "$with_gles" = yes; then
- have_gles=yes
- $as_echo "#define HAVE_JWZGLES 1" >>confdefs.h
+ have_jpeg=no
- JWZGLES_OBJS='$(JWXYZ_BIN)/jwzgles.o'
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: using OpenGL ES compatiblity shim" >&5
-$as_echo "using OpenGL ES compatiblity shim" >&6; }
-elif test "$with_gles" != no; then
- echo "error: must be yes or no: --with-gles=$with_gles"
- exit 1
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_mongrel "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default"
+if test "x$ac_cv_header_jpeglib_h" = xyes; then :
+ have_jpeg=yes
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+
+ if test "$have_jpeg" = yes; then
+ # we have the header, now check for the library
+ have_jpeg=no
+ jpeg_halfassed=yes
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_start_compress in -ljpeg" >&5
+$as_echo_n "checking for jpeg_start_compress in -ljpeg... " >&6; }
+if ${ac_cv_lib_jpeg_jpeg_start_compress+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ljpeg $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char jpeg_start_compress ();
+int
+main ()
+{
+return jpeg_start_compress ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_jpeg_jpeg_start_compress=yes
+else
+ ac_cv_lib_jpeg_jpeg_start_compress=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_start_compress" >&5
+$as_echo "$ac_cv_lib_jpeg_jpeg_start_compress" >&6; }
+if test "x$ac_cv_lib_jpeg_jpeg_start_compress" = xyes; then :
+ have_jpeg=yes
+ jpeg_halfassed=no
+ JPEG_LIBS="-ljpeg"
+ $as_echo "#define HAVE_JPEGLIB 1" >>confdefs.h
+
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ fi
fi
###############################################################################
@@ -14099,8 +15977,6 @@ else
with_png=yes
fi
-
-
case "$with_png" in
yes) ;;
no) ;;
@@ -14144,7 +16020,6 @@ $as_echo "not found ($d: no such directory)" >&6; }
;;
esac
-
if test "$with_png" != yes -a "$with_png" != no ; then
echo "error: must be yes or no: --with-png=$with_png"
exit 1
@@ -14165,7 +16040,6 @@ if test "x$ac_cv_header_png_h" = xyes; then :
have_png=yes
fi
-
CPPFLAGS="$ac_save_CPPFLAGS"
if test "$have_png" = yes; then
@@ -14242,12 +16116,11 @@ fi
fi
fi
-
###############################################################################
#
# Check for -lgdk_pixbuf.
# These tests are for gdk_pixbuf usage of the hacks,
-# not xscreensaver-demo (thus we have to test again to get
+# not xscreensaver-settings (thus we have to test again to get
# the libraries right: don't want to pull in all of GTK
# for the hacks.)
#
@@ -14263,7 +16136,6 @@ else
with_gdk_pixbuf=yes
fi
-
# if --with-pixbuf=/directory/ was specified, remember that directory so that
# we can also look for the `gdk-pixbuf-config' program in that directory.
case "$with_gdk_pixbuf" in
@@ -14275,7 +16147,6 @@ case "$with_gdk_pixbuf" in
;;
esac
-
case "$with_gdk_pixbuf" in
yes) ;;
no) ;;
@@ -14319,7 +16190,6 @@ $as_echo "not found ($d: no such directory)" >&6; }
;;
esac
-
if test "$with_gdk_pixbuf" != yes -a "$with_gdk_pixbuf" != no ; then
echo "error: must be yes or no: --with-pixbuf=$with_gdk_pixbuf"
exit 1
@@ -14360,7 +16230,6 @@ $as_echo "$ac_cv_gdk_pixbuf_config_libs" >&6; }
ac_gdk_pixbuf_config_cflags=$ac_cv_gdk_pixbuf_config_cflags
ac_gdk_pixbuf_config_libs=$ac_cv_gdk_pixbuf_config_libs
-
if test "$have_gdk_pixbuf" = yes; then
#
# we appear to have pixbuf; check for headers/libs to be sure.
@@ -14383,7 +16252,6 @@ if test "x$ac_cv_header_gdk_pixbuf_gdk_pixbuf_h" = xyes; then :
have_gdk_pixbuf=yes
fi
-
CPPFLAGS="$ac_save_CPPFLAGS"
# if that worked, check for header B...
@@ -14403,7 +16271,6 @@ if test "x$ac_cv_header_gdk_pixbuf_gdk_pixbuf_xlib_h" = xyes; then :
gdk_pixbuf_halfassed=no
fi
-
CPPFLAGS="$ac_save_CPPFLAGS"
# yay, it has a new name in Gtk 2.x...
@@ -14423,7 +16290,6 @@ if test "x$ac_cv_header_gdk_pixbuf_xlib_gdk_pixbuf_xlib_h" = xyes; then :
gdk_pixbuf_halfassed=no
fi
-
CPPFLAGS="$ac_save_CPPFLAGS"
fi
fi
@@ -14650,168 +16516,6 @@ fi
fi
fi
-
-###############################################################################
-#
-# Check for -ljpeg
-#
-###############################################################################
-
-have_jpeg=no
-with_jpeg_req=unspecified
-jpeg_halfassed=no
-
-# Check whether --with-jpeg was given.
-if test "${with_jpeg+set}" = set; then :
- withval=$with_jpeg; with_jpeg="$withval"; with_jpeg_req="$withval"
-else
- with_jpeg=yes
-fi
-
-
-
- case "$with_jpeg" in
- yes) ;;
- no) ;;
-
- /*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JPEG headers" >&5
-$as_echo_n "checking for JPEG headers... " >&6; }
- d=$with_jpeg/include
- if test -d $d; then
- X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
- fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JPEG libs" >&5
-$as_echo_n "checking for JPEG libs... " >&6; }
- d=$with_jpeg/lib
- if test -d $d; then
- X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
- fi
-
- # replace the directory string with "yes".
- with_jpeg_req="yes"
- with_jpeg=$with_jpeg_req
- ;;
-
- *)
- echo ""
- echo "error: argument to --with-jpeg must be \"yes\", \"no\", or a directory."
- echo " If it is a directory, then \`DIR/include' will be added to"
- echo " the -I list, and \`DIR/lib' will be added to the -L list."
- exit 1
- ;;
- esac
-
-
-if test "$with_jpeg" != yes -a "$with_jpeg" != no ; then
- echo "error: must be yes or no: --with-jpeg=$with_jpeg"
- exit 1
-fi
-
-if test "$with_jpeg" = yes; then
-
- have_jpeg=no
-
- ac_save_CPPFLAGS="$CPPFLAGS"
- if test \! -z "$includedir" ; then
- CPPFLAGS="$CPPFLAGS -I$includedir"
- fi
- CPPFLAGS="$CPPFLAGS $X_CFLAGS"
- CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_mongrel "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default"
-if test "x$ac_cv_header_jpeglib_h" = xyes; then :
- have_jpeg=yes
-fi
-
-
- CPPFLAGS="$ac_save_CPPFLAGS"
-
- if test "$have_jpeg" = yes; then
- # we have the header, now check for the library
- have_jpeg=no
- jpeg_halfassed=yes
-
- ac_save_CPPFLAGS="$CPPFLAGS"
- ac_save_LDFLAGS="$LDFLAGS"
-# ac_save_LIBS="$LIBS"
-
- if test \! -z "$includedir" ; then
- CPPFLAGS="$CPPFLAGS -I$includedir"
- fi
- # note: $X_CFLAGS includes $x_includes
- CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-
- if test \! -z "$libdir" ; then
- LDFLAGS="$LDFLAGS -L$libdir"
- fi
- # note: $X_LIBS includes $x_libraries
- LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
-
- CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_start_compress in -ljpeg" >&5
-$as_echo_n "checking for jpeg_start_compress in -ljpeg... " >&6; }
-if ${ac_cv_lib_jpeg_jpeg_start_compress+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-ljpeg $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char jpeg_start_compress ();
-int
-main ()
-{
-return jpeg_start_compress ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_jpeg_jpeg_start_compress=yes
-else
- ac_cv_lib_jpeg_jpeg_start_compress=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_start_compress" >&5
-$as_echo "$ac_cv_lib_jpeg_jpeg_start_compress" >&6; }
-if test "x$ac_cv_lib_jpeg_jpeg_start_compress" = xyes; then :
- have_jpeg=yes
- jpeg_halfassed=no
- JPEG_LIBS="-ljpeg"
- $as_echo "#define HAVE_JPEGLIB 1" >>confdefs.h
-
-fi
-
- CPPFLAGS="$ac_save_CPPFLAGS"
- LDFLAGS="$ac_save_LDFLAGS"
-# LIBS="$ac_save_LIBS"
-
- fi
-fi
-
-
###############################################################################
#
# Check for -lXft
@@ -14889,7 +16593,6 @@ if test "$have_xutf8drawstring" = yes ; then
fi
-
have_xft=no
with_xft_req=unspecified
xft_halfassed=no
@@ -14901,8 +16604,6 @@ else
with_xft=yes
fi
-
-
case "$with_xft" in
yes) ;;
no) ;;
@@ -14946,7 +16647,6 @@ $as_echo "not found ($d: no such directory)" >&6; }
;;
esac
-
if test "$with_xft" != yes -a "$with_xft" != no ; then
echo "error: must be yes or no: --with-xft=$with_xft"
exit 1
@@ -15003,7 +16703,6 @@ if test "x$ac_cv_header_X11_Xft_Xft_h" = xyes; then :
have_xft=yes
fi
-
CPPFLAGS="$ac_save_CPPFLAGS"
CPPFLAGS="$ac_save_xft_CPPFLAGS"
@@ -15100,220 +16799,6 @@ else
XFT_OBJS='$(UTILS_BIN)/xft.o'
fi
-
-###############################################################################
-#
-# Check for -lsystemd
-#
-###############################################################################
-
-have_systemd=no
-with_systemd_req=unspecified
-systemd_halfassed=no
-
-# Check whether --with-systemd was given.
-if test "${with_systemd+set}" = set; then :
- withval=$with_systemd; with_systemd="$withval"; with_systemd_req="$withval"
-else
- with_systemd=yes
-fi
-
-
-
- case "$with_systemd" in
- yes) ;;
- no) ;;
-
- /*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for systemd headers" >&5
-$as_echo_n "checking for systemd headers... " >&6; }
- d=$with_systemd/include
- if test -d $d; then
- X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
- fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for systemd libs" >&5
-$as_echo_n "checking for systemd libs... " >&6; }
- d=$with_systemd/lib
- if test -d $d; then
- X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
- fi
-
- # replace the directory string with "yes".
- with_systemd_req="yes"
- with_systemd=$with_systemd_req
- ;;
-
- *)
- echo ""
- echo "error: argument to --with-systemd must be \"yes\", \"no\", or a directory."
- echo " If it is a directory, then \`DIR/include' will be added to"
- echo " the -I list, and \`DIR/lib' will be added to the -L list."
- exit 1
- ;;
- esac
-
-
-if test "$with_systemd" != yes -a "$with_systemd" != no ; then
- echo "error: must be yes or no: --with-systemd=$with_systemd"
- exit 1
-fi
-
-if test "$with_systemd" = yes; then
-
- pkgs=''
- ok="yes"
- pkg_check_version libsystemd 221
- have_systemd="$ok"
-
- if test "$have_systemd" = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libsystemd includes" >&5
-$as_echo_n "checking for libsystemd includes... " >&6; }
-if ${ac_cv_systemd_config_cflags+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_systemd_config_cflags=`$pkg_config --cflags $pkgs`
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_systemd_config_cflags" >&5
-$as_echo "$ac_cv_systemd_config_cflags" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libsystemd libs" >&5
-$as_echo_n "checking for libsystemd libs... " >&6; }
-if ${ac_cv_systemd_config_libs+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_systemd_config_libs=`$pkg_config --libs $pkgs`
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_systemd_config_libs" >&5
-$as_echo "$ac_cv_systemd_config_libs" >&6; }
- fi
-
- ac_systemd_config_cflags=$ac_cv_systemd_config_cflags
- ac_systemd_config_libs=$ac_cv_systemd_config_libs
-
- if test "$have_systemd" = yes; then
- #
- # we appear to have libsystemd; check for headers/libs to be sure.
- #
- ac_save_systemd_CPPFLAGS="$CPPFLAGS"
- CPPFLAGS="$CPPFLAGS $ac_systemd_config_cflags"
-
- have_systemd=no
-
- ac_save_CPPFLAGS="$CPPFLAGS"
- if test \! -z "$includedir" ; then
- CPPFLAGS="$CPPFLAGS -I$includedir"
- fi
- CPPFLAGS="$CPPFLAGS $X_CFLAGS"
- CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_mongrel "$LINENO" "systemd/sd-bus.h" "ac_cv_header_systemd_sd_bus_h" "$ac_includes_default"
-if test "x$ac_cv_header_systemd_sd_bus_h" = xyes; then :
- have_systemd=yes
-fi
-
-
- CPPFLAGS="$ac_save_CPPFLAGS"
-
- CPPFLAGS="$ac_save_systemd_CPPFLAGS"
- fi
-
- if test "$have_systemd" = yes; then
- # we have the headers, now check for the libraries
- have_systemd=no
- systemd_halfassed=yes
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for libsystemd usability..." >&5
-$as_echo "checking for libsystemd usability..." >&6; }
-
- ac_save_CPPFLAGS="$CPPFLAGS"
- ac_save_LDFLAGS="$LDFLAGS"
-# ac_save_LIBS="$LIBS"
-
- if test \! -z "$includedir" ; then
- CPPFLAGS="$CPPFLAGS -I$includedir"
- fi
- # note: $X_CFLAGS includes $x_includes
- CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-
- if test \! -z "$libdir" ; then
- LDFLAGS="$LDFLAGS -L$libdir"
- fi
- # note: $X_LIBS includes $x_libraries
- LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
-
- CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sd_bus_open_system in -lc" >&5
-$as_echo_n "checking for sd_bus_open_system in -lc... " >&6; }
-if ${ac_cv_lib_c_sd_bus_open_system+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lc $ac_systemd_config_libs -lX11 -lXext -lm $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char sd_bus_open_system ();
-int
-main ()
-{
-return sd_bus_open_system ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_c_sd_bus_open_system=yes
-else
- ac_cv_lib_c_sd_bus_open_system=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_sd_bus_open_system" >&5
-$as_echo "$ac_cv_lib_c_sd_bus_open_system" >&6; }
-if test "x$ac_cv_lib_c_sd_bus_open_system" = xyes; then :
- have_systemd=yes
-fi
-
- CPPFLAGS="$ac_save_CPPFLAGS"
- LDFLAGS="$ac_save_LDFLAGS"
-# LIBS="$ac_save_LIBS"
-
- fi
-
- if test "$have_systemd" = no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for libsystemd usability... no" >&5
-$as_echo "checking for libsystemd usability... no" >&6; }
- fi
-fi
-
-if test "$have_systemd" = yes; then
- INCLUDES="$INCLUDES $ac_systemd_config_cflags"
- EXES_SYSTEMD='$(EXES_SYSTEMD)'
- $as_echo "#define HAVE_LIBSYSTEMD 1" >>confdefs.h
-
-else
- EXES_SYSTEMD=''
-fi
-
-
###############################################################################
#
# Check for pty support: this allows 'phosphor' and 'apple2'
@@ -15335,7 +16820,6 @@ fi
done
-
ac_save_CPPFLAGS="$CPPFLAGS"
ac_save_LDFLAGS="$LDFLAGS"
# ac_save_LIBS="$LIBS"
@@ -15401,9 +16885,8 @@ fi
LDFLAGS="$ac_save_LDFLAGS"
# LIBS="$ac_save_LIBS"
-
if test "$ac_have_forkpty" != yes ; then
- # we don't need (or have) -lutil on MacOS 10.4.2...
+ # we don't need (or have) -lutil on macOS 10.4.2...
ac_save_CPPFLAGS="$CPPFLAGS"
ac_save_LDFLAGS="$LDFLAGS"
@@ -15473,602 +16956,56 @@ fi
###############################################################################
#
-# Check for the XSHM server extension.
+# Check for libcap, which allows "sonar" to work without setuid.
+# Except, nevermind, that's bad. See comments in sonar-icmp.c.
#
###############################################################################
-have_xshm=no
-with_xshm_req=unspecified
-
-# Check whether --with-xshm-ext was given.
-if test "${with_xshm_ext+set}" = set; then :
- withval=$with_xshm_ext; with_xshm="$withval"; with_xshm_req="$withval"
-else
- with_xshm=yes
-fi
-
-
-
- case "$with_xshm" in
- yes) ;;
- no) ;;
-
- /*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XSHM headers" >&5
-$as_echo_n "checking for XSHM headers... " >&6; }
- d=$with_xshm/include
- if test -d $d; then
- X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
- fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XSHM libs" >&5
-$as_echo_n "checking for XSHM libs... " >&6; }
- d=$with_xshm/lib
- if test -d $d; then
- X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
- fi
-
- # replace the directory string with "yes".
- with_xshm_req="yes"
- with_xshm=$with_xshm_req
- ;;
-
- *)
- echo ""
- echo "error: argument to --with-xshm-ext must be \"yes\", \"no\", or a directory."
- echo " If it is a directory, then \`DIR/include' will be added to"
- echo " the -I list, and \`DIR/lib' will be added to the -L list."
- exit 1
- ;;
- esac
-
-
-if test "$with_xshm" = yes; then
-
- # first check for Xshm.h.
-
- ac_save_CPPFLAGS="$CPPFLAGS"
- if test \! -z "$includedir" ; then
- CPPFLAGS="$CPPFLAGS -I$includedir"
- fi
- CPPFLAGS="$CPPFLAGS $X_CFLAGS"
- CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_compile "$LINENO" "X11/extensions/XShm.h" "ac_cv_header_X11_extensions_XShm_h" "#include <X11/Xlib.h>
-"
-if test "x$ac_cv_header_X11_extensions_XShm_h" = xyes; then :
- have_xshm=yes
-fi
-
-
- CPPFLAGS="$ac_save_CPPFLAGS"
-
- # if that succeeded, then check for sys/ipc.h.
- if test "$have_xshm" = yes; then
- have_xshm=no
-
- ac_save_CPPFLAGS="$CPPFLAGS"
- if test \! -z "$includedir" ; then
- CPPFLAGS="$CPPFLAGS -I$includedir"
- fi
- CPPFLAGS="$CPPFLAGS $X_CFLAGS"
- CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_mongrel "$LINENO" "sys/ipc.h" "ac_cv_header_sys_ipc_h" "$ac_includes_default"
-if test "x$ac_cv_header_sys_ipc_h" = xyes; then :
- have_xshm=yes
-fi
-
-
- CPPFLAGS="$ac_save_CPPFLAGS"
- fi
-
- # if that succeeded, then check for sys/shm.h.
- if test "$have_xshm" = yes; then
- have_xshm=no
-
- ac_save_CPPFLAGS="$CPPFLAGS"
- if test \! -z "$includedir" ; then
- CPPFLAGS="$CPPFLAGS -I$includedir"
- fi
- CPPFLAGS="$CPPFLAGS $X_CFLAGS"
- CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_mongrel "$LINENO" "sys/shm.h" "ac_cv_header_sys_shm_h" "$ac_includes_default"
-if test "x$ac_cv_header_sys_shm_h" = xyes; then :
- have_xshm=yes
-fi
-
-
- CPPFLAGS="$ac_save_CPPFLAGS"
- fi
-
- # AIX is pathological, as usual: apparently it's normal for the Xshm headers
- # to exist, but the library code to not exist. And even better, the library
- # code is in its own library: libXextSam.a. So, if we're on AIX, and that
- # lib doesn't exist, give up. (This lib gets added to X_EXTRA_LIBS, and
- # that's not quite right, but close enough.)
- #
- case "$host" in
- *-aix*)
- if `uname -v` -eq 3 ; then
- have_xshm=no
-
- ac_save_CPPFLAGS="$CPPFLAGS"
- ac_save_LDFLAGS="$LDFLAGS"
-# ac_save_LIBS="$LIBS"
-
- if test \! -z "$includedir" ; then
- CPPFLAGS="$CPPFLAGS -I$includedir"
- fi
- # note: $X_CFLAGS includes $x_includes
- CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-
- if test \! -z "$libdir" ; then
- LDFLAGS="$LDFLAGS -L$libdir"
- fi
- # note: $X_LIBS includes $x_libraries
- LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
-
- CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XShmQueryExtension in -lXextSam" >&5
-$as_echo_n "checking for XShmQueryExtension in -lXextSam... " >&6; }
-if ${ac_cv_lib_XextSam_XShmQueryExtension+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lXextSam -lX11 -lXext -lm $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char XShmQueryExtension ();
-int
-main ()
-{
-return XShmQueryExtension ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_XextSam_XShmQueryExtension=yes
-else
- ac_cv_lib_XextSam_XShmQueryExtension=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_XextSam_XShmQueryExtension" >&5
-$as_echo "$ac_cv_lib_XextSam_XShmQueryExtension" >&6; }
-if test "x$ac_cv_lib_XextSam_XShmQueryExtension" = xyes; then :
- have_xshm=yes; X_EXTRA_LIBS="$X_EXTRA_LIBS -lXextSam"
-else
- true
-fi
-
- CPPFLAGS="$ac_save_CPPFLAGS"
- LDFLAGS="$ac_save_LDFLAGS"
-# LIBS="$ac_save_LIBS"
-
- fi
- ;;
- esac
-
- # if that succeeded, then we've really got it.
- if test "$have_xshm" = yes; then
- $as_echo "#define HAVE_XSHM_EXTENSION 1" >>confdefs.h
-
- fi
-
-elif test "$with_xshm" != no; then
- echo "error: must be yes or no: --with-xshm-ext=$with_xshm"
- exit 1
-fi
-
-
-###############################################################################
-#
-# Check for the DOUBLE-BUFFER server extension.
-#
-###############################################################################
-
-have_xdbe=no
-with_xdbe_req=unspecified
-
-# Check whether --with-xdbe-ext was given.
-if test "${with_xdbe_ext+set}" = set; then :
- withval=$with_xdbe_ext; with_xdbe="$withval"; with_xdbe_req="$withval"
-else
- with_xdbe=yes
-fi
-
-
-
- case "$with_xdbe" in
- yes) ;;
- no) ;;
-
- /*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DOUBLE-BUFFER headers" >&5
-$as_echo_n "checking for DOUBLE-BUFFER headers... " >&6; }
- d=$with_xdbe/include
- if test -d $d; then
- X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
- fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DOUBLE-BUFFER libs" >&5
-$as_echo_n "checking for DOUBLE-BUFFER libs... " >&6; }
- d=$with_xdbe/lib
- if test -d $d; then
- X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
- fi
-
- # replace the directory string with "yes".
- with_xdbe_req="yes"
- with_xdbe=$with_xdbe_req
- ;;
-
- *)
- echo ""
- echo "error: argument to --with-xdbe-ext must be \"yes\", \"no\", or a directory."
- echo " If it is a directory, then \`DIR/include' will be added to"
- echo " the -I list, and \`DIR/lib' will be added to the -L list."
- exit 1
- ;;
- esac
-
-
-if test "$with_xdbe" = yes; then
-
-
- ac_save_CPPFLAGS="$CPPFLAGS"
- if test \! -z "$includedir" ; then
- CPPFLAGS="$CPPFLAGS -I$includedir"
- fi
- CPPFLAGS="$CPPFLAGS $X_CFLAGS"
- CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_compile "$LINENO" "X11/extensions/Xdbe.h" "ac_cv_header_X11_extensions_Xdbe_h" "#include <X11/Xlib.h>
-"
-if test "x$ac_cv_header_X11_extensions_Xdbe_h" = xyes; then :
- have_xdbe=yes
-fi
-
-
- CPPFLAGS="$ac_save_CPPFLAGS"
- if test "$have_xdbe" = yes; then
- $as_echo "#define HAVE_DOUBLE_BUFFER_EXTENSION 1" >>confdefs.h
-
- fi
-
-elif test "$with_xdbe" != no; then
- echo "error: must be yes or no: --with-xdbe-ext=$with_xshm"
- exit 1
-fi
-
-
-###############################################################################
-#
-# Check for the SGI XReadDisplay server extension.
-#
-# Note: this has to be down here, rather than up with the other server
-# extension tests, so that the output of `configure --help' is in the
-# right order. Arrgh!
-#
-###############################################################################
-
-have_readdisplay=no
-with_readdisplay_req=unspecified
-
-# Check whether --with-readdisplay was given.
-if test "${with_readdisplay+set}" = set; then :
- withval=$with_readdisplay; with_readdisplay="$withval"; with_readdisplay_req="$withval"
-else
- with_readdisplay=yes
-fi
-
-
-
- case "$with_readdisplay" in
- yes) ;;
- no) ;;
-
- /*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XReadDisplay headers" >&5
-$as_echo_n "checking for XReadDisplay headers... " >&6; }
- d=$with_readdisplay/include
- if test -d $d; then
- X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
- fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XReadDisplay libs" >&5
-$as_echo_n "checking for XReadDisplay libs... " >&6; }
- d=$with_readdisplay/lib
- if test -d $d; then
- X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
- fi
-
- # replace the directory string with "yes".
- with_readdisplay_req="yes"
- with_readdisplay=$with_readdisplay_req
- ;;
-
- *)
- echo ""
- echo "error: argument to --with-readdisplay must be \"yes\", \"no\", or a directory."
- echo " If it is a directory, then \`DIR/include' will be added to"
- echo " the -I list, and \`DIR/lib' will be added to the -L list."
- exit 1
- ;;
- esac
-
-
-if test "$with_readdisplay" = yes; then
-
- ac_save_CPPFLAGS="$CPPFLAGS"
- if test \! -z "$includedir" ; then
- CPPFLAGS="$CPPFLAGS -I$includedir"
- fi
- CPPFLAGS="$CPPFLAGS $X_CFLAGS"
- CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_compile "$LINENO" "X11/extensions/readdisplay.h" "ac_cv_header_X11_extensions_readdisplay_h" "#include <X11/Xlib.h>
-"
-if test "x$ac_cv_header_X11_extensions_readdisplay_h" = xyes; then :
- $as_echo "#define HAVE_READ_DISPLAY_EXTENSION 1" >>confdefs.h
-
-fi
-
-
- CPPFLAGS="$ac_save_CPPFLAGS"
-elif test "$with_readdisplay" != no; then
- echo "error: must be yes or no: --with-readdisplay=$with_readdisplay"
- exit 1
-fi
-
+have_libcap=no
+setcap_hacks_default=no
+setcap_hacks="$setcap_hacks_default"
+setcap_hacks_req=unspecified
-###############################################################################
+#AC_ARG_WITH(setcap-hacks,
+#[ --with-setcap-hacks Build the "sonar" demo with libcap, which allows
+# it to ping other hosts without being setuid.],
+# [setcap_hacks="$withval"; setcap_hacks_req="$withval"],
+# [setcap_hacks=yes])
#
-# Check for a directory full of images to use as the default value
-# of the "imageDirectory" preference.
+#HANDLE_X_PATH_ARG(setcap_hacks, --with-setcap-hacks, setcap hacks)
#
-###############################################################################
-
-have_imagedir=no
-with_imagedir_req=unspecified
-
-
-# Check whether --with-image-directory was given.
-if test "${with_image_directory+set}" = set; then :
- withval=$with_image_directory; with_imagedir="$withval"; with_imagedir_req="$withval"
-else
- with_imagedir=yes
-fi
-
-# no HANDLE_X_PATH_ARG for this one
-
-case "$with_imagedir" in
- /*)
- # absolute path
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for image directory $with_imagedir" >&5
-$as_echo_n "checking for image directory $with_imagedir... " >&6; }
- if test -d "$with_imagedir" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- with_imagedir=""
- fi
- ;;
- yes)
- with_imagedir=""
-
- #### Could use some more defaults here...
- for dd in \
- "/usr/share/backgrounds/images/" \
- "/usr/share/wallpapers/" \
- "/Library/Desktop Pictures/" \
- ; do
- if test -z "$with_imagedir"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for image directory $dd" >&5
-$as_echo_n "checking for image directory $dd... " >&6; }
- if test -d "$dd" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- with_imagedir="$dd"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
- fi
- done
-
- ;;
- no)
- with_imagedir=""
- ;;
-
- *)
- echo "error: must be an absolute path: --with-image-directory=$with_imagedir_req"
- exit 1
- ;;
-esac
-ac_cv_imagedir="$with_imagedir"
-
-DEFAULT_IMAGES_P='True'
-DEFAULT_IMAGE_DIRECTORY="$ac_cv_imagedir"
-
-if test -z "$DEFAULT_IMAGE_DIRECTORY" ; then
- DEFAULT_IMAGES_P='False'
-fi
-
-
-###############################################################################
+#if test "$setcap_hacks" != yes -a "$setcap_hacks" != no ; then
+# echo "error: must be yes or no: --with-setcap-hacks=$setcap_hacks"
+# exit 1
+#fi
#
-# Pick a text file to use as the default of the "textFile" preference.
-# Any old file will do, but preferably one that will make interesting
-# shapes when displayed by "starwars" and "fontglide".
+#if test "$setcap_hacks" = yes; then
#
-###############################################################################
-
-have_textfile=no
-with_textfile_req=unspecified
-
-
-# Check whether --with-text-file was given.
-if test "${with_text_file+set}" = set; then :
- withval=$with_text_file; with_textfile="$withval"; with_textfile_req="$withval"
-else
- with_textfile=yes
-fi
-
-# no HANDLE_X_PATH_ARG for this one
-
-case "$with_textfile" in
- /*)
- # absolute path
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for text file $with_textfile" >&5
-$as_echo_n "checking for text file $with_textfile... " >&6; }
- if test -f "$with_textfile" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- with_textfile=""
- fi
- ;;
- yes)
- with_textfile=""
-
- #### Could use some more defaults here...
- for f in \
- "/usr/X11R6/lib/X11/doc/README" \
- "/usr/share/doc/xserver-common/copyright" \
- "/usr/share/doc/xserver-xorg-core/copyright" \
- "/usr/X11R6/README" \
- "/usr/share/doc/libX11*/COPYING" \
- "/usr/X11/share/X11/doc/README*" \
- "/usr/share/doc/debian/debian-manifesto" \
- ; do
- if test -z "$with_textfile"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for text file $f" >&5
-$as_echo_n "checking for text file $f... " >&6; }
- f=`/bin/ls $f 2>&- | head -1`
- if test -f "$f" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- with_textfile="$f"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
- fi
- done
-
- ;;
- no)
- with_textfile=""
- ;;
-
- *)
- echo "error: must be an absolute path: --with-text-file=$with_textfile_req"
- exit 1
- ;;
-esac
-ac_cv_textfile="$with_textfile"
-
-DEFAULT_TEXT_FILE="$ac_cv_textfile"
-
+# AC_CHECK_PROGS(setcap_program, setcap)
+# if test "$setcap_program" != ''; then
+# AC_CHECK_X_HEADER(sys/capability.h, [have_setcap=yes])
+# fi
+# if test "$have_setcap" = yes; then
+# AC_CHECK_X_LIB(cap, cap_set_flag,
+# [have_libcap=yes
+# PROG_SETCAP="$setcap_program"
+# LIBCAP_LIBS="-lcap"
+# AC_DEFINE(HAVE_LIBCAP)])
+# fi
+#fi
###############################################################################
#
-# Check the browser to see help URL
+# Sonar must be setuid to be able to ping other hosts.
#
###############################################################################
-have_browser=no
-with_browser_req=unspecified
-
-
-# Check whether --with-browser was given.
-if test "${with_browser+set}" = set; then :
- withval=$with_browser; with_browser="$withval"; with_browser_req="$withval"
+if test "$have_libcap" = yes; then
+ setuid_hacks_default=no
else
- with_browser=no
+ setuid_hacks_default=yes
fi
-# no HANDLE_X_PATH_ARG for this one
-
-case "$with_browser" in
- no )
- ;;
- * )
- WITH_BROWSER=$with_browser
- gnome_open_program=$with_browser
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for browser $with_browser" >&5
-$as_echo_n "checking for browser $with_browser... " >&6; }
- with_browser_fullpath=`which $with_browser 2>/dev/null`
- case $with_browser_fullpath in
- /* )
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- have_browser=yes
- ;;
- * )
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-# Only warning: we don't want to install all packages for the
-# dependency of the browser in building stage...
- echo "WARNING: browser not found: --with-browser=$with_browser"
- ;;
- esac
- ;;
-esac
-ac_cv_browser="$with_browser"
-
-###############################################################################
-#
-# Check whether it's ok to install some hacks as setuid (e.g., "sonar")
-# This should be safe, but let's give people the option.
-#
-###############################################################################
-
-setuid_hacks_default=no
setuid_hacks="$setuid_hacks_default"
# Check whether --with-setuid-hacks was given.
@@ -16078,8 +17015,6 @@ else
setuid_hacks="$setuid_hacks_default"
fi
-
-
case "$setuid_hacks" in
yes) ;;
no) ;;
@@ -16123,7 +17058,6 @@ $as_echo "not found ($d: no such directory)" >&6; }
;;
esac
-
if test "$setuid_hacks" = yes; then
true
elif test "$setuid_hacks" != no; then
@@ -16131,208 +17065,6 @@ elif test "$setuid_hacks" != no; then
exit 1
fi
-
-###############################################################################
-#
-# Check for setcap, which is less worrying than setuid.
-#
-###############################################################################
-
-have_libcap=no
-setcap_hacks_default=yes
-setcap_hacks="$setcap_hacks_default"
-setcap_hacks_req=unspecified
-
-# Check whether --with-setcap-hacks was given.
-if test "${with_setcap_hacks+set}" = set; then :
- withval=$with_setcap_hacks; setcap_hacks="$withval"; setcap_hacks_req="$withval"
-else
- setcap_hacks=yes
-fi
-
-
-
- case "$setcap_hacks" in
- yes) ;;
- no) ;;
-
- /*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setcap hacks headers" >&5
-$as_echo_n "checking for setcap hacks headers... " >&6; }
- d=$setcap_hacks/include
- if test -d $d; then
- X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
- fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setcap hacks libs" >&5
-$as_echo_n "checking for setcap hacks libs... " >&6; }
- d=$setcap_hacks/lib
- if test -d $d; then
- X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
- fi
-
- # replace the directory string with "yes".
- setcap_hacks_req="yes"
- setcap_hacks=$setcap_hacks_req
- ;;
-
- *)
- echo ""
- echo "error: argument to --with-setcap-hacks must be \"yes\", \"no\", or a directory."
- echo " If it is a directory, then \`DIR/include' will be added to"
- echo " the -I list, and \`DIR/lib' will be added to the -L list."
- exit 1
- ;;
- esac
-
-
-if test "$setcap_hacks" != yes -a "$setcap_hacks" != no ; then
- echo "error: must be yes or no: --with-setcap-hacks=$setcap_hacks"
- exit 1
-fi
-
-if test "$setcap_hacks" = yes; then
-
- for ac_prog in setcap
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_setcap_program+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$setcap_program"; then
- ac_cv_prog_setcap_program="$setcap_program" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_setcap_program="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-setcap_program=$ac_cv_prog_setcap_program
-if test -n "$setcap_program"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $setcap_program" >&5
-$as_echo "$setcap_program" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$setcap_program" && break
-done
-
- if test "$setcap_program" != ''; then
-
- ac_save_CPPFLAGS="$CPPFLAGS"
- if test \! -z "$includedir" ; then
- CPPFLAGS="$CPPFLAGS -I$includedir"
- fi
- CPPFLAGS="$CPPFLAGS $X_CFLAGS"
- CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_mongrel "$LINENO" "sys/capability.h" "ac_cv_header_sys_capability_h" "$ac_includes_default"
-if test "x$ac_cv_header_sys_capability_h" = xyes; then :
- have_setcap=yes
-fi
-
-
- CPPFLAGS="$ac_save_CPPFLAGS"
- fi
- if test "$have_setcap" = yes; then
-
- ac_save_CPPFLAGS="$CPPFLAGS"
- ac_save_LDFLAGS="$LDFLAGS"
-# ac_save_LIBS="$LIBS"
-
- if test \! -z "$includedir" ; then
- CPPFLAGS="$CPPFLAGS -I$includedir"
- fi
- # note: $X_CFLAGS includes $x_includes
- CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-
- if test \! -z "$libdir" ; then
- LDFLAGS="$LDFLAGS -L$libdir"
- fi
- # note: $X_LIBS includes $x_libraries
- LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
-
- CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cap_set_flag in -lcap" >&5
-$as_echo_n "checking for cap_set_flag in -lcap... " >&6; }
-if ${ac_cv_lib_cap_cap_set_flag+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lcap $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char cap_set_flag ();
-int
-main ()
-{
-return cap_set_flag ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_cap_cap_set_flag=yes
-else
- ac_cv_lib_cap_cap_set_flag=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cap_cap_set_flag" >&5
-$as_echo "$ac_cv_lib_cap_cap_set_flag" >&6; }
-if test "x$ac_cv_lib_cap_cap_set_flag" = xyes; then :
- have_libcap=yes
- PROG_SETCAP="$setcap_program"
- LIBCAP_LIBS="-lcap"
- $as_echo "#define HAVE_LIBCAP 1" >>confdefs.h
-
-fi
-
- CPPFLAGS="$ac_save_CPPFLAGS"
- LDFLAGS="$ac_save_LDFLAGS"
-# LIBS="$ac_save_LIBS"
-
- fi
-fi
-
-
###############################################################################
#
# Check for --with-record-animation
@@ -16349,8 +17081,6 @@ else
record_anim="$record_anim_default"
fi
-
-
case "$record_anim" in
yes) ;;
no) ;;
@@ -16394,7 +17124,6 @@ $as_echo "not found ($d: no such directory)" >&6; }
;;
esac
-
if test "$record_anim" = yes; then
true
elif test "$record_anim" != no; then
@@ -16426,7 +17155,6 @@ DEPEND=makedepend
DEPEND_FLAGS=
DEPEND_DEFINES=
-
if test \! -z "$includedir" ; then
INCLUDES="$INCLUDES -I$includedir"
fi
@@ -16435,19 +17163,17 @@ if test \! -z "$libdir" ; then
LDFLAGS="$LDFLAGS -L$libdir"
fi
-
PREFERRED_DEMO_PROGRAM=''
ALL_DEMO_PROGRAMS=
if test "$have_motif" = yes; then
- PREFERRED_DEMO_PROGRAM=xscreensaver-demo-Xm
+ PREFERRED_DEMO_PROGRAM=xscreensaver-settings-Xm
ALL_DEMO_PROGRAMS="$PREFERRED_DEMO_PROGRAM $ALL_DEMO_PROGRAMS"
fi
if test "$have_gtk" = yes; then
- PREFERRED_DEMO_PROGRAM=xscreensaver-demo-Gtk
+ PREFERRED_DEMO_PROGRAM=xscreensaver-settings-Gtk
ALL_DEMO_PROGRAMS="$PREFERRED_DEMO_PROGRAM $ALL_DEMO_PROGRAMS"
fi
-
if test "$have_kerberos" = yes; then
PASSWD_SRCS="$PASSWD_SRCS \$(KERBEROS_SRCS)"
PASSWD_OBJS="$PASSWD_OBJS \$(KERBEROS_OBJS)"
@@ -16462,14 +17188,13 @@ if test "$enable_pam_check_account_type" = yes; then
else
COMMENT_PAM_CHECK_ACCOUNT="#"
fi
-if test "$have_passwd_helper" = yes; then
- PASSWD_SRCS="$PASSWD_SRCS \$(PWHELPER_SRCS)"
- PASSWD_OBJS="$PASSWD_OBJS \$(PWHELPER_OBJS)"
-fi
+#if test "$have_passwd_helper" = yes; then
+# PASSWD_SRCS="$PASSWD_SRCS \$(PWHELPER_SRCS)"
+# PASSWD_OBJS="$PASSWD_OBJS \$(PWHELPER_OBJS)"
+#fi
PASSWD_SRCS="$PASSWD_SRCS \$(PWENT_SRCS)"
PASSWD_OBJS="$PASSWD_OBJS \$(PWENT_OBJS)"
-
if test "$enable_locking" = yes; then
LOCK_SRCS='$(LOCK_SRCS_1) $(PASSWD_SRCS)'
LOCK_OBJS='$(LOCK_OBJS_1) $(PASSWD_OBJS)'
@@ -16488,13 +17213,10 @@ else
MEN_OSX=
fi
-
-INSTALL_SETUID='$(INSTALL_PROGRAM) $(SUID_FLAGS)'
-
-if test "$need_setuid" = yes; then
- NEED_SETUID=yes
+if test "$setuid_auth" = yes; then
+ SETUID_AUTH=yes
else
- NEED_SETUID=no
+ SETUID_AUTH=no
fi
if test "$setuid_hacks" = yes; then
@@ -16532,7 +17254,6 @@ if test "$have_jpeg" = yes -a "$have_gdk_pixbuf" = yes; then
JPEG_EXES='$(JPEG_EXES)'
fi
-
# Another substitution in the XScreenSaver.ad.in file:
#
if test "$gnome_open_program" != ''; then
@@ -16549,7 +17270,6 @@ else
NOGNOME=''
fi
-
# Set PO_DATADIR to something sensible.
#
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for locale directory" >&5
@@ -16574,9 +17294,9 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PO_DATADIR/locale" >&5
$as_echo "$PO_DATADIR/locale" >&6; }
-
# canonicalize slashes.
HACK_CONF_DIR=`echo "${HACK_CONF_DIR}" | sed 's@/$@@;s@//*@/@g'`
+FONT_DIR=`echo "${FONT_DIR}" | sed 's@/$@@;s@//*@/@g'`
# gcc 3.0 likes to issue this warning for every file:
#
@@ -16588,101 +17308,15 @@ HACK_CONF_DIR=`echo "${HACK_CONF_DIR}" | sed 's@/$@@;s@//*@/@g'`
#
INCLUDES=`echo "$INCLUDES" | sed 's@ -I${prefix}/include@@g;'`
-
###############################################################################
#
# Perform substitutions and write Makefiles.
#
###############################################################################
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
APPDEFAULTS=$ac_x_app_defaults
-
-
-
-
-
-
-ac_config_files="$ac_config_files Makefile utils/Makefile jwxyz/Makefile hacks/Makefile hacks/images/Makefile hacks/glx/Makefile po/Makefile.in driver/Makefile driver/xscreensaver.pam driver/xscreensaver-demo.glade2 driver/XScreenSaver.ad"
+ac_config_files="$ac_config_files Makefile utils/Makefile jwxyz/Makefile hacks/Makefile hacks/fonts/Makefile hacks/images/Makefile hacks/glx/Makefile po/Makefile.in driver/Makefile driver/xscreensaver.pam driver/XScreenSaver.ad"
cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure
@@ -16792,12 +17426,8 @@ LIBOBJS=$ac_libobjs
LTLIBOBJS=$ac_ltlibobjs
-
-
ac_config_commands="$ac_config_commands po/stamp-it"
-
-
: "${CONFIG_STATUS=./config.status}"
ac_write_fail=0
ac_clean_files_save=$ac_clean_files
@@ -16842,7 +17472,6 @@ else
esac
fi
-
as_nl='
'
export as_nl
@@ -16890,7 +17519,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
}
fi
-
# IFS
# We need space, tab and new line, in precisely that order. Quoting is
# there to prevent editors from complaining about space-tab.
@@ -16944,7 +17572,6 @@ export LANGUAGE
# CDPATH.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
# as_fn_error STATUS ERROR [LINENO LOG_FD]
# ----------------------------------------
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
@@ -16961,7 +17588,6 @@ as_fn_error ()
as_fn_exit $as_status
} # as_fn_error
-
# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
@@ -17023,7 +17649,6 @@ else
}
fi # as_fn_arith
-
if expr a : '\(a\)' >/dev/null 2>&1 &&
test "X`expr 00001 : '.*\(...\)'`" = X001; then
as_expr=expr
@@ -17109,7 +17734,6 @@ fi
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
rmdir conf$$.dir 2>/dev/null
-
# as_fn_mkdir_p
# -------------
# Create "$as_dir" as a directory, including parents if necessary.
@@ -17155,7 +17779,6 @@ $as_echo X"$as_dir" |
test -z "$as_dirs" || eval "mkdir $as_dirs"
} || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
-
} # as_fn_mkdir_p
if mkdir -p . 2>/dev/null; then
as_mkdir_p='mkdir -p "$as_dir"'
@@ -17164,7 +17787,6 @@ else
as_mkdir_p=false
fi
-
# as_fn_executable_p FILE
# -----------------------
# Test if FILE is an executable regular file.
@@ -17181,7 +17803,6 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
# Sed expression to map a string onto a valid variable name.
as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
exec 6>&1
## ----------------------------------- ##
## Main body of $CONFIG_STATUS script. ##
@@ -17216,7 +17837,6 @@ case $ac_config_headers in *"
"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
esac
-
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
# Files that config.status was made for.
config_files="$ac_config_files"
@@ -17378,7 +17998,6 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
# INIT-COMMANDS
#
-
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
@@ -17393,12 +18012,12 @@ do
"utils/Makefile") CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;;
"jwxyz/Makefile") CONFIG_FILES="$CONFIG_FILES jwxyz/Makefile" ;;
"hacks/Makefile") CONFIG_FILES="$CONFIG_FILES hacks/Makefile" ;;
+ "hacks/fonts/Makefile") CONFIG_FILES="$CONFIG_FILES hacks/fonts/Makefile" ;;
"hacks/images/Makefile") CONFIG_FILES="$CONFIG_FILES hacks/images/Makefile" ;;
"hacks/glx/Makefile") CONFIG_FILES="$CONFIG_FILES hacks/glx/Makefile" ;;
"po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
"driver/Makefile") CONFIG_FILES="$CONFIG_FILES driver/Makefile" ;;
"driver/xscreensaver.pam") CONFIG_FILES="$CONFIG_FILES driver/xscreensaver.pam" ;;
- "driver/xscreensaver-demo.glade2") CONFIG_FILES="$CONFIG_FILES driver/xscreensaver-demo.glade2" ;;
"driver/XScreenSaver.ad") CONFIG_FILES="$CONFIG_FILES driver/XScreenSaver.ad" ;;
"po/stamp-it") CONFIG_COMMANDS="$CONFIG_COMMANDS po/stamp-it" ;;
@@ -17406,7 +18025,6 @@ do
esac
done
-
# If the user did not use the arguments to specify the items to instantiate,
# then the envvar interface is used. Set only those that are not.
# We use the long form for the default assignment because of an extremely
@@ -17449,7 +18067,6 @@ ac_tmp=$tmp
# This happens for instance with `./config.status config.h'.
if test -n "$CONFIG_FILES"; then
-
ac_cr=`echo X | tr X '\015'`
# On cygwin, bash can eat \r inside `` if the user requested igncr.
# But we know of no other shell where ac_cr would be empty at this
@@ -17467,7 +18084,6 @@ fi
echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
_ACEOF
-
{
echo "cat >conf$$subs.awk <<_ACEOF" &&
echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
@@ -17710,7 +18326,6 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
fi # test -n "$CONFIG_HEADERS"
-
eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS"
shift
for ac_tag
@@ -17838,7 +18453,6 @@ case $srcdir in
esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
case $ac_mode in
:F)
#
@@ -17954,7 +18568,6 @@ $as_echo "$as_me: executing $ac_file commands" >&6;}
;;
esac
-
case $ac_file$ac_mode in
"default-1":C) case "$CONFIG_FILES" in *po/Makefile.in*)
sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile
@@ -17983,7 +18596,6 @@ $as_echo "$as_me: executing $ac_file commands" >&6;}
esac
done # for ac_tag
-
as_fn_exit 0
_ACEOF
ac_clean_files=$ac_clean_files_save
@@ -17991,7 +18603,6 @@ ac_clean_files=$ac_clean_files_save
test $ac_write_fail = 0 ||
as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
-
# configure is writing to config.log, and then calls config.status.
# config.status does its own redirection, appending to config.log.
# Unfortunately, on DOS this fails, as config.log is still kept open
@@ -18017,7 +18628,6 @@ if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi
-
###############################################################################
#
# Print some warnings at the end.
@@ -18073,7 +18683,6 @@ noteL() {
warn_prefix="$warn_prefix_1"
}
-
# ac_prog_cc_no_pthread normally only happens on AIX, because according
# to AX_PTHREAD, AIX needs CC=xlc_r or CC=cc_r to do threads.
# If CC is specified, it takes precedence over --with-pthread.
@@ -18094,6 +18703,10 @@ if test "$with_xidle_req" = yes -a "$have_xidle" = no ; then
warn 'The XIdle extension was requested, but was not found.'
fi
+if test "$with_mit_req" = yes -a "$have_mit" = no ; then
+ warn 'The MIT-SCREEN-SAVER extension was requested, but was not found.'
+fi
+
if test "$with_xshm_req" = yes -a "$have_xshm" = no ; then
warn 'The XSHM extension was requested, but was not found.'
fi
@@ -18102,6 +18715,14 @@ if test "$with_xdbe_req" = yes -a "$have_xdbe" = no ; then
warn 'The DOUBLE-BUFFER extension was requested, but was not found.'
fi
+#if test "$with_xcomposite_req" = yes -a "$have_xcomposite" = no ; then
+# warn 'The XCOMPOSITE extension was requested, but was not found.'
+#fi
+
+if test "$with_xkb_req" = yes -a "$have_xkb" = no ; then
+ warn 'The X Keyboard extension was requested, but was not found.'
+fi
+
if test "$with_sgivc_req" = yes -a "$have_sgivc" = no ; then
warn 'The SGI-VIDEO-CONTROL extension was requested, but was not found.'
fi
@@ -18141,21 +18762,13 @@ else
fi
if test "$gtk_halfassed" != no ; then
- warnL "GTK version $gtk_halfassed was found, but at least one supporting"
- warn2 "library ($gtk_halfassed_lib) was not, so GTK can't be used."
- warn2 "Perhaps some of the development packages are not installed?"
- if test "$have_gtk" = yes ; then
- v="$ac_gtk_version_string"
- warn2 "GTK $v is also installed, so it will be used instead."
- warn2 "Please read the above output and the \`config.log' file"
- warn2 "for more details."
- fi
+ warnL "GTK was found, but $gtk_halfassed_lib was not, so GTK can't be used."
fi
motif_warn2() {
warn2 'Though the Motif front-end to xscreensaver is still'
warn2 'maintained, it is no longer being updated with new'
- warn2 'features: all new development on the xscreensaver-demo'
+ warn2 'features: all new development on the xscreensaver-settings'
warn2 'program is happening in the GTK version, and not in the'
warn2 'Motif version. It is recommended that you build against'
warn2 'GTK instead of Motif. See <http://www.gtk.org/>.'
@@ -18165,12 +18778,12 @@ if test "$have_motif" = no -a "$have_gtk" = no; then
if test "$with_motif" = yes; then
warnL "Neither the GTK nor Motif libraries were found; the"
- warn2 "\`xscreensaver-demo' program requires one of these."
+ warn2 "\`xscreensaver-settings' program requires one of these."
echo ''
motif_warn2
else
warnL "The GTK libraries do not seem to be available; the"
- warn2 "\`xscreensaver-demo' program requires them."
+ warn2 "\`xscreensaver-settings' program requires them."
# echo ''
# warn2 'You can use Motif or Lesstif instead of GTK (use the'
# warn2 "\`--with-motif' option) but that is NOT recommended."
@@ -18181,25 +18794,13 @@ elif test "$with_motif_req" = yes -a "$have_motif" = no ; then
warnL "Use of Motif was requested, but it wasn't found;"
warn2 "Gtk will be used instead."
-elif test "$jurassic_gtk" = yes ; then
-
- pref_gtk=2.0
-
- v="$ac_gtk_version_string"
- if test "$with_gtk_req" = yes -a "$ac_gtk_version" = "unknown" ; then
- warnL "Use of Gtk was requested, but its version number is unknown;"
- elif test "$with_gtk_req" = yes ; then
- warnL "Use of Gtk was requested, but it is version $v;"
- else
- warnL "Gtk was found on this system, but it is version $v;"
- fi
-
- warn2 "Gtk $pref_gtk or newer is required."
-
elif test "$with_gtk_req" = yes -a "$have_gtk" = no ; then
warnL "Use of Gtk was requested, but it wasn't found."
fi
+if test "$ac_cv_libxt" != yes ; then
+ warnL 'The Xt library was not found. It is required.'
+fi
if test "$have_gtk" = yes -a "$have_gdk_pixbuf" = no ; then
warn "GTK is being used, but the GDK-Pixbuf library and/or"
@@ -18225,13 +18826,17 @@ if test "$have_motif" = yes -a "$have_lesstif" = yes ; then
fi
fi
-
if test "$have_motif" = yes -a "$have_gtk" = no ; then
warn 'Motif is being used, and GTK is not.'
echo ''
motif_warn2
fi
+halfassery() {
+ echo ''
+ warn2 "More specifically, we found the headers but not the"
+ warn2 "libraries. Possibly a 'devel' package is needed."
+}
if test "$with_gdk_pixbuf_req" = yes -a "$have_gdk_pixbuf" = no; then
warnL 'Use of GDK-Pixbuf was requested, but it was not found.'
@@ -18248,14 +18853,7 @@ if test "$have_gdk_pixbuf" = no -o "$gdk_pixbuf_halfassed" = yes || \
warnL 'The GDK-Pixbuf library was not found.'
fi
- if test "$gdk_pixbuf_halfassed" = yes ; then
- echo ''
- warn2 'More specifically, we found the headers, but not the'
- warn2 'libraries; so either GDK-Pixbuf is half-installed on this'
- warn2 "system, or something else went wrong. The \`config.log'"
- warn2 'file might contain some clues.'
- fi
-
+ if test "$gdk_pixbuf_halfassed" = yes ; then halfassery ; fi
if test "$have_png" = yes ; then
echo ''
warn2 'The PNG library is being used instead.'
@@ -18267,26 +18865,18 @@ if test "$have_gdk_pixbuf" = no -o "$gdk_pixbuf_halfassed" = yes || \
warn2 'configure.'
fi
-
if test "$have_jpeg" = no ; then
if test "$with_jpeg_req" = yes ; then
warnL 'Use of libjpeg was requested, but it was not found.'
elif test "$with_jpeg_req" = no ; then
- noteL 'The JPEG library is not being used.'
+ warnL 'The JPEG library is not being used.'
else
- noteL 'The JPEG library was not found.'
- fi
-
- if test "$jpeg_halfassed" = yes ; then
- echo ''
- warn2 'More specifically, we found the headers, but not the'
- warn2 'library; so either JPEG is half-installed on this'
- warn2 "system, or something else went wrong. The \`config.log'"
- warn2 'file might contain some clues.'
- echo ''
+ warnL 'The JPEG library was not found.'
fi
+ if test "$jpeg_halfassed" = yes ; then halfassery ; fi
if test "$have_gdk_pixbuf" = no ; then
+ echo ''
warn2 "This means that it won't be possible for the image-manipulating"
warn2 "display modes to load files from disk; and it also means that"
warn2 "the \`webcollage' program will be much slower."
@@ -18295,101 +18885,58 @@ if test "$have_jpeg" = no ; then
fi
fi
-
if test "$have_png" = no ; then
if test "$with_png_req" = yes ; then
warnL 'Use of libpng was requested, but it was not found.'
elif test "$with_png_req" = no ; then
- noteL 'The PNG library is not being used.'
+ warnL 'The PNG library is not being used.'
else
- noteL 'The PNG library was not found.'
- fi
-
- if test "$png_halfassed" = yes ; then
- echo ''
- warn2 'More specifically, we found the headers, but not the'
- warn2 'library; so either PNG is half-installed on this'
- warn2 "system, or something else went wrong. The \`config.log'"
- warn2 'file might contain some clues.'
- echo ''
+ warnL 'The PNG library was not found.'
fi
+ if test "$png_halfassed" = yes ; then halfassery ; fi
warn2 "Many things aren't going to work right."
fi
+if test "$have_xinput" = no ; then
+ warnL 'The XInput2 library was not found. It is required.'
+ if test "$xinput_halfassed" = yes ; then halfassery ; else echo '' ; fi
+fi
if test "$have_xft" = no ; then
- if test "$with_xft_req" = yes ; then
- warnL "Use of libXft was requested, but it was not found."
- elif test "$with_xft_req" = no ; then
- noteL 'The Xft library is not being used.'
- else
- noteL "The Xft library was not found."
- fi
-
- if test "$xft_halfassed" = yes ; then
- echo ''
- warn2 'More specifically, we found the headers, but not the'
- warn2 'libraries; so either Xft is half-installed on this'
- warn2 "system, or something else went wrong. The \`config.log'"
- warn2 'file might contain some clues.'
- echo ''
- fi
-
- warn2 "This means that fonts won't be anti-aliased."
+ warnL 'The XFreeType library was not found. It is required.'
+ if test "$xft_halfassed" = yes ; then halfassery ; else echo '' ; fi
fi
-
if test "$have_systemd" = no ; then
systemd_warned=no
- if test "$with_systemd_req" = yes ; then
+ if test "$systemd_too_old" = yes ; then
+ warnL "The systemd library is too old."
+ systemd_warned=yes
+ elif test "$with_systemd_req" = yes ; then
warnL "Use of systemd was requested, but it was not found."
systemd_warned=yes
- elif test "$with_systemd_req" = no ; then
+ elif test "$ac_macosx" = yes; then
true
- # noteL 'The systemd library is not being used.'
- # systemd_warned=yes
+ elif test "$with_systemd_req" = no ; then
+ noteL 'The systemd library is not being used.'
+ systemd_warned=yes
else
- true
- # noteL "The systemd library was not found."
- # systemd_warned=yes
+ warnL "The systemd library was not found."
+ systemd_warned=yes
fi
if test "$systemd_halfassed" = yes ; then
- echo ''
- warn2 'More specifically, we found the headers, but not the'
- warn2 'libraries; so either systemd is half-installed on this'
- warn2 "system, or something else went wrong. The \`config.log'"
- warn2 'file might contain some clues.'
- echo ''
+ halfassery
systemd_warned=yes
fi
if test "$systemd_warned" = yes; then
+ echo ''
warn2 "This means that xscreensaver-systemd won't be built."
- fi
-fi
-
-
-if test "$have_gl" = yes -a "$ac_have_mesa_gl" = yes ; then
- preferred_mesagl=3.4
- mgv="$ac_mesagl_version_string"
- pgl="$preferred_mesagl"
-
- if test "$ac_mesagl_version" = unknown; then
- true
- # warnL "Unable to determine the MesaGL version number!"
- # warn2 "Make sure you are using version $preferred_mesagl or newer."
-
- elif test \! "$ac_mesagl_version" -gt 2006; then
- warnL "MesaGL version number is $mgv --"
- warn2 "MesaGL 2.6 and earlier have a security bug. It is strongly"
- warn2 "recommended that you upgrade to at least version $preferred_mesagl."
-
- elif test \! "$ac_mesagl_version" -gt 3003; then
- warnL "MesaGL version number is $mgv --"
- warn2 "MesaGL 3.3 and earlier have some bugs; it is recommended"
- warn2 "that you upgrade to $pgl or newer."
+ warn2 "Without that, xscreensaver will not be able to auto-lock"
+ warn2 "before the system is suspended (e.g., closing laptop lid)"
+ warn2 "and might activate while video playback is in progress."
fi
fi
@@ -18403,11 +18950,11 @@ if test "$have_gl" = no ; then
fi
if test "$gl_halfassed" = yes ; then
- echo ''
- warn2 'More specifically, we found the headers, but not the'
- warn2 'libraries; so either GL is half-installed on this'
- warn2 "system, or something else went wrong. The \`config.log'"
- warn2 'file might contain some clues.'
+ halfassery
+ if test "$have_glx" = no -a "$have_egl" = no; then
+ echo ''
+ warn2 'Neither EGL nor GLX were found.'
+ fi
fi
echo ''
@@ -18417,7 +18964,6 @@ if test "$have_gl" = no ; then
fi
-
if test "$have_gl" = yes -a "$have_gle" = no ; then
# nobody cares about this; don't print the warning unless it was
@@ -18436,13 +18982,7 @@ if test "$have_gl" = yes -a "$have_gle" = no ; then
warn2 'library was not.'
fi
- if test "$gle_halfassed" = yes ; then
- echo ''
- warn2 'More specifically, we found the headers, but not the'
- warn2 'libraries; so either GLE is half-installed on this'
- warn2 "system, or something else went wrong. The \`config.log'"
- warn2 'file might contain some clues.'
- fi
+ if test "$gle_halfassed" = yes ; then halfassery ; fi
echo ''
warn2 'Some of the OpenGL (3D) demos (those that depend on GLE)'
@@ -18453,7 +18993,6 @@ if test "$have_gl" = yes -a "$have_gle" = no ; then
fi
fi
-
if test "$with_readdisplay_req" = yes -a "$have_readdisplay" = no ; then
warn 'Use of XReadDisplay was requested, but it was not found.'
fi
@@ -18464,6 +19003,12 @@ fi
if test "$with_pam_req" = yes -a "$have_pam" = no ; then
warn 'Use of PAM was requested, but it was not found.'
+elif test "$have_pam" = no ; then
+ if test -d /etc/pam.d -o -f /etc/pam.conf ; then
+ warn "Your system seems to have PAM, but PAM is not being used."
+ warn2 "That is probably not going to work out well."
+
+ fi
fi
if test "$with_shadow_req" = yes -a "$have_shadow" = no ; then
@@ -18474,29 +19019,34 @@ if test "$setcap_hacks_req" = yes -a "$have_libcap" = no ; then
warn 'Use of libcap was requested, but it was not found.'
fi
-if test "$ac_macosx" = yes ; then
- if test "$enable_locking" = yes ; then
- warn "You have specified --enable-locking on MacOS X."
- warn2 "THIS DOES NOT WORK! Don't do this!"
- fi
+if test "$ac_macosx" = yes -a "$enable_locking" = yes ; then
+ warn "You have specified --enable-locking on macOS."
+ warn2 "THIS DOES NOT WORK! Don't do this!"
fi
-
# You are in a twisty maze of namespaces and syntaxes, all alike.
+# Expand all of these as the Makefile will probably expand them.
# Fuck the skull of Unix.
#
bindir=`eval eval eval eval eval eval eval echo $bindir`
HACKDIR=`eval eval eval eval eval eval eval echo $HACKDIR`
HACK_CONF_DIR=`eval eval eval eval eval eval eval echo $HACK_CONF_DIR`
+FONT_DIR=`eval eval eval eval eval eval eval echo $FONT_DIR`
# canonicalize slashes.
bindir=`echo "${bindir}" | sed 's@/$@@;s@//*@/@g'`
HACKDIR=`echo "${HACKDIR}" | sed 's@/$@@;s@//*@/@g'`
HACK_CONF_DIR=`echo "${HACK_CONF_DIR}" | sed 's@/$@@;s@//*@/@g'`
+FONT_DIR=`echo "${FONT_DIR}" | sed 's@/$@@;s@//*@/@g'`
+if test -z "$FONT_DIR" ; then
+ FONT_DIR='not installed';
+else
+ FONT_DIR="${FONT_DIR}/"
+fi
# Sanity check the hackdir
-for bad_choice in xscreensaver xscreensaver-demo xscreensaver-command ; do
+for bad_choice in xscreensaver xscreensaver-settings xscreensaver-command ; do
if test "${HACKDIR}" = "${bindir}/${bad_choice}" ; then
echo ""
as_fn_error $? "\"--with-hackdir=${bindir}/${bad_choice}\" won't work.
@@ -18506,107 +19056,108 @@ for bad_choice in xscreensaver xscreensaver-demo xscreensaver-command ; do
fi
done
+# Warn if there's a previous RPM package installed.
-do_dir_warning=no
+rpm_vers=
+if test -z "$RPM_PACKAGE_VERSION" ; then
+ # Don't bother with this test if we are currently *building* an RPM.
+ rpmnames="xscreensaver xscreensaver-base xscreensaver-extras
+ xscreensaver-data xscreensaver-data-extra"
-# Now let's warn if there's a previous RPM version already installed.
-# But don't bother with this test if we are currently *building* an RPM.
+ # M4 sucks!!
-if test -z "$RPM_PACKAGE_VERSION" ; then
+ pkg_vers=`(rpm -qv $rpmnames) 2>&- | \
+ sed -n 's/^[-a-z]*-\([0-9][0-9]*[.].*\)/\1/p' | head -1`
+ rpm_vers="$pkg_vers"
- rpmnames="xscreensaver xscreensaver-base xscreensaver-extras"
+fi
- # M4 sucks!!
+if test \! -z "$rpm_vers" ; then
- rpmv=`(rpm -qv $rpmnames) 2>/dev/null | \
- sed -n 's/^[-a-z]*-\([0-9][0-9]*[.][0-9][0-9a-z]*\)-.*$/\1/p' | \
- head -1`
+ # M4 sucks!!
+ pkg_bindir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)xscreensaver-settings$@\1@p'`
+ pkg_bindir2=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)xscreensaver-demo$@\1@p'`
+ pkg_hackdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)popsquares$@\1@p'`
+ pkg_confdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)popsquares\.xml$@\1@p'`
+ pkg_fontdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)\.ttf$@\1@p'`
+ pkg_addir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)XScreenSaver$@\1@p'`
- if test \! -z "$rpmv" ; then
- rpmbdir=`rpm -ql $rpmnames | sed -n 's@^\(.*\)/xscreensaver-demo$@\1@p'`
- rpmhdir=`rpm -ql $rpmnames | sed -n 's@^\(.*\)/popsquares$@\1@p'`
+ if test -z "$pkg_bindir" ; then pkg_bindir="$pkg_bindir2" ; fi
- warning=no
- warnL "There is already an installed RPM of xscreensaver $rpmv"
- warn2 'on this system. You might want to remove it ("rpm -ve")'
- warn2 'before running "make install" in this directory.'
- echo ""
- warn2 "Alternately, you could build this version of xscreensaver"
- warn2 'as an RPM, and then install that. An "xscreensaver.spec"'
- warn2 'file is included. Try "rpmbuild -v -ba xscreensaver.spec".'
- warn2 "See the RPM documentation for more info."
- echo ""
+fi
- if test "$rpmbdir" = "$rpmhdir" ; then
- warn2 "The RPM version was installed in $rpmbdir/."
- do_dir_warning=yes
- else
- warn2 "The RPM version was installed in $rpmbdir/,"
- warn2 "with demos in $rpmhdir/."
+# Warn if there's a previous Debian package installed.
+#
+deb_vers=
+if test -z "$pkg_vers" ; then
+ debnames="xscreensaver xscreensaver-data xscreensaver-data-extra"
+ pkg_vers=''
+ for dpkg in $debnames ; do
+ if test -z "$pkg_vers"; then
+ pkg_vers=`dpkg -s $dpkg 2>/dev/null | sed -n 's/^Version: \(.*\)$/\1/p'`
+ deb_vers="$pkg_vers"
fi
- fi
+ done
fi
-# Also warn if there's a Debian package installed.
-#
-debnames="xscreensaver xscreensaver-data xscreensaver-data-extra"
-debv=''
-for dpkg in $debnames ; do
- if test -z "$debv"; then
- debv=`dpkg -s $dpkg 2>/dev/null | sed -n 's/^Version: \(.*\)$/\1/p'`
- fi
-done
+if test \! -z "$deb_vers" ; then
-if test \! -z "$debv" ; then
- debbdir=`dpkg -L $debnames 2>/dev/null | \
- sed -n 's@^\(.*/bin/\)xscreensaver$@\1@p'`
- debhdir=`dpkg -L $debnames 2>/dev/null | \
- sed -n 's@^\(.*/\)popsquares$@\1@p'`
- if test -z "$debbdir" ; then debbdir='???'; fi
- if test -z "$debhdir" ; then debhdir='???'; fi
+ # M4 sucks!!
- warning=no
- warnL "There is already an installed dpkg of xscreensaver"
- warn2 "version \"$debv\" on this system."
- echo ""
- warn2 "The dpkg was installed in $debbdir,"
- warn2 "with demos in $debhdir."
+ pkg_bindir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)xscreensaver-settings$@\1@p'`
+ pkg_bindir2=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)xscreensaver-demo$@\1@p'`
+ pkg_hackdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)popsquares$@\1@p'`
+ pkg_confdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)popsquares\.xml$@\1@p'`
+ pkg_fontdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)\.ttf$@\1@p'`
+ pkg_addir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)XScreenSaver[^/]*$@\1@p'`
+
+ if test -z "$pkg_bindir" ; then pkg_bindir="$pkg_bindir2" ; fi
fi
+bindir_err=
+hackdir_err=
+confdir_err=
+fontdir_err=
+addir_err=
+if ! test -z "$pkg_vers" ; then
-if test "${bindir}" = "${HACKDIR}" ; then
- do_dir_warning=yes
-fi
+ err=" (DIFFERS)"
-if test "$do_dir_warning" = yes; then
- echo ""
- echo "$warnsep"
- echo ""
- echo ' When you run "make install", the "xscreensaver",'
- echo ' "xscreensaver-demo", and "xscreensaver-command" executables'
- echo " will be installed in ${bindir}/."
- echo ""
- echo " The various graphics demos (200+ different executables) will"
- echo " be installed in ${HACKDIR}/."
- echo ""
- echo " If you would prefer the demos to be installed elsewhere,"
- echo " you should re-run configure with the --with-hackdir=DIR"
- echo " option. For more information, run \`./configure --help'."
- warning=yes
-fi
+ if test -z "$pkg_bindir" ; then pkg_bindir='???'
+ elif test "$pkg_bindir" != "${bindir}/" ; then bindir_err="$err" ; fi
-if test "$warning" != no; then
- echo '' ; echo "$warnsep" ; echo ''
-fi
+ if test -z "$pkg_hackdir" ; then pkg_hackdir='???'
+ elif test "$pkg_hackdir" != "${HACKDIR}/" ; then hackdir_err="$err"; fi
-if test "$do_dir_warning" = no; then
- if test "$warning" = no; then
- echo ''
- fi
- echo "User programs will be installed in ${bindir}/"
- echo "Screen savers will be installed in ${HACKDIR}/"
- echo "Configuration dialogs will be installed in ${HACK_CONF_DIR}/"
- echo "System-wide default settings will be installed in ${APPDEFAULTS}/"
- echo ''
-fi
+ if test -z "$pkg_confdir" ; then pkg_confdir='???'
+ elif test "$pkg_confdir" != "${HACK_CONF_DIR}/" ; then confdir_err="$err"; fi
+
+ if test -z "$pkg_fontdir" ; then pkg_fontdir='none'
+ elif test "$pkg_fontdir/" != "${FONT_DIR}" ; then fontdir_err="$err"; fi
+
+ if test -z "$pkg_addir" ; then pkg_addir='???'
+ elif test "$pkg_addir" != "${APPDEFAULTS}/" ; then addir_err="$err" ; fi
+
+ warning=no
+ warnL "There is already an installed package of xscreensaver"
+ warn2 "version \"$pkg_vers\", in these directories:"
+ echo ""
+ warn2 "User programs: $pkg_bindir$bindir_err"
+ warn2 "Screen savers: $pkg_hackdir$hackdir_err"
+ warn2 "Configuration: $pkg_confdir$confdir_err"
+ warn2 "Extra fonts: $pkg_fontdir$fontdir_err"
+ warn2 "App Defaults: $pkg_addir$addir_err"
+fi
+
+echo ""
+echo "$warnsep"
+echo ""
+echo " XScreenSaver will be installed in these directories:"
+echo ""
+echo " User programs: ${bindir}/$bindir_err"
+echo " Screen savers: ${HACKDIR}/$hackdir_err"
+echo " Configuration: ${HACK_CONF_DIR}/$confdir_err"
+echo " Extra Fonts: ${FONT_DIR}$fontdir_err"
+echo " App Defaults: ${APPDEFAULTS}/$addir_err"
+echo ""
diff --git a/configure.in b/configure.ac
index a2e943e..c3f0b5b 100644
--- a/configure.in
+++ b/configure.ac
@@ -1,8 +1,11 @@
-# configure.in --- xscreensaver, Copyright (c) 1997-2014 Jamie Zawinski.
+# configure.in --- xscreensaver, Copyright © 1997-2021 Jamie Zawinski.
#
-AC_PREREQ(2.52)
-AC_INIT(driver/subprocs.c)
+# Note: upgrading past 2.69_5 breaks the world.
+AC_PREREQ([2.69])
+
+AC_INIT
+AC_CONFIG_SRCDIR([driver/subprocs.c])
AC_CONFIG_HEADERS([config.h])
echo "current directory: `pwd`"
@@ -15,328 +18,265 @@ echo "command line was: $0 $@"
###############################################################################
AH_TOP([
-/* config.h.in --- xscreensaver, Copyright (c) 1991-2014 Jamie Zawinski.
- *
- * The best way to set these parameters is by running the included `configure'
- * script. That examines your system, and generates `config.h' from
- * `config.h.in'.
- *
- * If something goes very wrong, you can edit `config.h' directly, but beware
- * that your changes will be lost if you ever run `configure' again.
+/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski.
+ * Generate this file by running 'configure' rather than editing it by hand.
*/
])
+# Defines in config.h are dumped out alphabetically rather than in any kind
+# of sane order, sigh.
+
+#
+# OS stuff.
+#
+AH_TEMPLATE([HAVE_PTHREAD],
+ [Define this if you have POSIX threads.])
+
+AH_TEMPLATE([HAVE_SIGTIMEDWAIT],
+ [Define to 1 if you have the `sigtimedwait' function.])
+
+AH_TEMPLATE([HAVE_FORKPTY],
+ [Define this if you have forkpty.])
+
+AH_TEMPLATE([HAVE_GETTIMEOFDAY],
+ [Define this if you have gettimeofday.])
+
+AH_TEMPLATE([GETTIMEOFDAY_TWO_ARGS],
+ [Define this if gettimeofday takes two arguments.])
+
+AH_TEMPLATE([HAVE_ICMP],
+ [Define this if ping uses struct icmp.icmp_id.])
+
+AH_TEMPLATE([HAVE_ICMPHDR],
+ [Define this if ping uses struct icmphdr.un.echo.id.])
+
+AH_TEMPLATE([HAVE_GETIFADDRS],
+ [Define this if you have getifaddrs.])
+
+AH_TEMPLATE([HAVE_LIBCAP],
+ [Define this if your system has libcap.])
+
+#
+# X11 server stuff.
+#
+AH_TEMPLATE([XPointer],
+ [Stare into the void.])
+
AH_TEMPLATE([HAVE_READ_DISPLAY_EXTENSION],
- [Define this if you have the XReadDisplay extension (I think
- this is an SGI-only thing; it's in
- <X11/extensions/readdisplay.h>.) A few of the screenhacks will
- take advantage of this if it's available.])
+ [Define this if you have the SGI XReadDisplay extension.])
-AH_TEMPLATE([HAVE_XHPDISABLERESET],
- [Define this if you have the XHPDisableReset function (an HP only
- thing which allows the Ctrl-Sh-Reset key sequence to be
- temporarily disabled.)])
+AH_TEMPLATE([HAVE_XINPUT],
+ [Define this if you have the XInput2 extension.])
# This only ever existed in X11R4 and X11R5.
-#AH_TEMPLATE([HAVE_XIDLE_EXTENSION],
-# [Define this if you have the XIDLE extension installed. If you
-# have the XIDLE extension, this is recommended. (You have this
-# extension if the file /usr/include/X11/extensions/xidle.h
-# exists.) Turning on this flag lets XScreenSaver work better with
-# servers which support this extension; but it will still work
-# with servers which do not suport it, so it's a good idea to
-# compile in support for it if you can.])
-
-# Using this extension will crash your X server and make fading not work.
-#AH_TEMPLATE([HAVE_MIT_SAVER_EXTENSION],
-# [Define this if you have the MIT-SCREEN-SAVER extension
-# installed. See the caveats about this extension, above.
-# (It's available if /usr/include/X11/extensions/scrnsaver.h
-# exists.)])
+AH_TEMPLATE([HAVE_XIDLE_EXTENSION],
+ [Define this if you have the X11R5 XIDLE extension.])
# This only ever existed on SGI hardware.
-#AH_TEMPLATE([HAVE_SGI_SAVER_EXTENSION],
-# [Define this if you have the SGI SCREEN_SAVER extension. This is
-# standard on Irix systems, and not available elsewhere.])
+AH_TEMPLATE([HAVE_SGI_SAVER_EXTENSION],
+ [Define this if you have the SGI SCREEN_SAVER extension.])
# This only ever existed on SGI hardware.
-#AH_TEMPLATE([HAVE_SGI_VC_EXTENSION],
-# [Define this if you have the SGI-VIDEO-CONTROL extension. This
-# is standard on Irix systems, and not available elsewhere.])
+AH_TEMPLATE([HAVE_SGI_VC_EXTENSION],
+ [Define this if you have the SGI-VIDEO-CONTROL extension.])
+
+AH_TEMPLATE([HAVE_MIT_SAVER_EXTENSION],
+ [Using the MIT-SCREEN-SAVER extension means that the X server
+ will crash at random times, and fading and hysteresis won't work.
+ Don't use this. You'll be sorry. See comment in xscreensaver.c.])
AH_TEMPLATE([HAVE_DPMS_EXTENSION],
- [Define this if you have the XDPMS extension. This is standard
- on sufficiently-recent XFree86 systems, and possibly elsewhere.
- (It's available if the file /usr/include/X11/extensions/dpms.h
- exists.)])
+ [Define this if you have the XDPMS extension.])
AH_TEMPLATE([HAVE_XF86VMODE],
- [Define this if you have the functions XF86VidModeGetModeLine()
- and XF86VidModeGetViewPort(), in support of virtual desktops
- where the X server's root window is bigger than the actual
- screen. This is an XFree86 thing, and probably doesn't exist
- elsewhere. (It's available if the file
- /usr/include/X11/extensions/xf86vmode.h exists.)])
+ [Define this if you have XF86VidModeGetViewPort, for
+ virtual desktops.])
AH_TEMPLATE([HAVE_XF86VMODE_GAMMA],
- [Define this if you have the functions XF86VidModeGetGamma() and
- XF86VidModeSetGamma(), which allow clients to change the gamma
- response of the monitor. This is an XFree86 4.0.x thing, and
- probably doesn't exist elsewhere. (It's available if the file
- /usr/include/X11/extensions/xf86vmode.h exists and has stuff about
- gamma in it.)])
+ [Define this if you have XF86VidModeSetGamma, for fading.])
AH_TEMPLATE([HAVE_XF86VMODE_GAMMA_RAMP],
- [Define this if you have the functions XF86VidModeGetGammaRamp()
- and XF86VidModeSetGammaRamp(), which provide finer-grained
- control than XF86VidMode[GS]etGamma(). These appeared in
- XFree86 4.1.0.])
+ [Define this if you have XF86VidModeSetGammaRamp, for fading.])
AH_TEMPLATE([HAVE_XINERAMA],
- [Define this if you have the Xinerama extension. This is
- standard on sufficiently-recent XFree86 systems, and possibly
- elsewhere. (It's available if the file
- /usr/include/X11/extensions/Xinerama.h exists.)])
-
-AH_TEMPLATE([HAVE_XINPUT],
- [Define this if you have the Xinput extension. This is
- standard since X11R5, and is thus almost everywhere.
- (It's available if the file /usr/include/X11/extensions/XInput.h
- exists.)])
+ [Define this if you have the Xinerama extension.])
-AH_TEMPLATE([HAVE_XF86MISCSETGRABKEYSSTATE],
- [Define this if you have the XF86MiscSetGrabKeysState function
- (which allows the Ctrl-Alt-KP_star and Ctrl-Alt-KP_slash key
- sequences to be temporarily disabled. Sadly, it doesn't affect
- Ctrl-Alt-BS or Ctrl-Alt-F1.)])
+AH_TEMPLATE([HAVE_XHPDISABLERESET],
+ [Define this if you have XHPDisableReset, which allows
+ Ctrl-Sh-Reset to be temporarily disabled.])
AH_TEMPLATE([HAVE_RANDR],
- [Define this if you have the Resize and Rotate extension.
- This is standard on sufficiently-recent XFree86 systems, and
- possibly elsewhere. (It's available if the file
- /usr/include/X11/extensions/Xrandr.h exists.)])
+ [Define this if you have the Resize and Rotate extension.])
AH_TEMPLATE([HAVE_RANDR_12],
[Define this if the RANDR library is version 1.2 or newer.])
+AH_TEMPLATE([HAVE_XSHM_EXTENSION],
+ [Define this if you have the X Shared Memory Extension.])
+
+AH_TEMPLATE([HAVE_DOUBLE_BUFFER_EXTENSION],
+ [Define this if you have the X Double Buffer Extension.])
+
+#AH_TEMPLATE([HAVE_XCOMPOSITE_EXTENSION],
+# [Define this if you have the X Composite Extension.])
+
+AH_TEMPLATE([HAVE_XKB],
+ [Define this if you have the X Keyboard Extension.])
+
+AH_TEMPLATE([HAVE_LIBSYSTEMD],
+ [Define this if you have libsystemd.])
+
AH_TEMPLATE([HAVE_PROC_INTERRUPTS],
[Define this if you have a Linux-like /proc/interrupts file which
can be examined to determine when keyboard activity has
- occurred.])
+ occurred, and you use PS/2 input devices instead of USB.])
AH_TEMPLATE([HAVE_PROC_OOM],
[Define this if you have a Linux-like /proc/.../oom_score_adj file
which can be adjusted by root to exempt us from the out-of-memory
- .])
+ killer.])
-AH_TEMPLATE([HAVE_MOTIF],[Define this if you have Motif.])
+#
+# GUI stuff.
+#
+AH_TEMPLATE([HAVE_MOTIF],
+ [Define this if you have Motif.])
AH_TEMPLATE([HAVE_XMCOMBOBOX],
- [Define this if you have the XmComboBox Motif widget (Motif 2.0.)])
+ [Define this if you have the XmComboBox Motif 2.0 widget.])
-AH_TEMPLATE([HAVE_GTK],[Define this if you have Gtk (any version.)])
-AH_TEMPLATE([HAVE_GTK2],[Define this if you have Gtk 2.x.])
+AH_TEMPLATE([HAVE_GTK],
+ [Define this if you have Gtk])
+AH_TEMPLATE([HAVE_GTK2],
+ [Define this if you have Gtk 2.x.])
AH_TEMPLATE([HAVE_CRAPPLET],
[Define this if you have Gnome and want to build support for the
- xscreensaver control panel in the Gnome Control Center
- (gnomecc). (This is needed only with Gtk 1.x.)])
+ xscreensaver control panel in the Gtk 1.x Gnome Control Center.])
AH_TEMPLATE([HAVE_CRAPPLET_IMMEDIATE],
[Define this if HAVE_CRAPPLET is defined, and the function
- capplet_widget_changes_are_immediate() is available.])
+ capplet_widget_changes_are_immediate is available.])
-AH_TEMPLATE([HAVE_XML],[Define this if you have the XML library.])
+AH_TEMPLATE([HAVE_XML],
+ [Define this if you have the XML library.])
AH_TEMPLATE([HAVE_OLD_XML_HEADERS],
- [Define this if you have the XML library headers in their old,
- non-namespaced location (you lack the gnome-xml/libxml symlink)])
+ [Define this if you the XML library headers lack the
+ gnome-xml/libxml symlink.])
AH_TEMPLATE([HAVE_GDK_PIXBUF],
- [Define this if you have the GDK_Pixbuf library installed. Some
- of the demos can make use of this if it is available.])
+ [Define this if you have GDK_Pixbuf.])
AH_TEMPLATE([HAVE_GDK_PIXBUF_APPLY_EMBEDDED_ORIENTATION],
[Define this if you have the gdk_pixbuf_apply_embedded_orientation
function (gdk-pixbuf 2.12).])
+#
+# Image loading.
+#
AH_TEMPLATE([HAVE_JPEGLIB],
- [Define this if you have the Independent JPEG Group's JPEG
- library installed. Some of the demos can make use of this if it
- is available.])
+ [Define this if you have the JPEG Group's JPEG library.])
AH_TEMPLATE([HAVE_LIBPNG],
- [Define this if the Portable Network Graphics library is installed.
- It is basically required, but many things will more-or-less limp
- along without it.])
-
-AH_TEMPLATE([HAVE_XMU],
- [Define this if you have the Xmu library. This is standard part
- of X, and if your vendor doesn't ship it, you should report that
- as a bug.])
+ [Define this if you have the Portable Network Graphics library.])
AH_TEMPLATE([HAVE_XUTF8DRAWSTRING],
- [Define this if you have the function Xutf8DrawString().])
+ [Define this if you have the function Xutf8DrawString.])
AH_TEMPLATE([HAVE_XFT],
[Define this if you have libXft2.])
-AH_TEMPLATE([HAVE_LIBSYSTEMD],
- [Define this if you have libsystemd.])
-
+#
+# Graphics libraries.
+#
AH_TEMPLATE([HAVE_GL],
- [Define this if you have OpenGL. Some of the demos require it,
- so if you don't have it, then those particular demos won't be
- built. (This won't affect the screen saver as a whole.)])
+ [Define this if you have OpenGL.])
-AH_TEMPLATE([HAVE_MESA_GL],
- [Define this if you have OpenGL, but it's the MesaGL variant.
- (The libraries have different names.) (HAVE_GL should be defined
- too.)])
+AH_TEMPLATE([HAVE_GLES],
+ [Define this if the native OpenGL library is OpenGLES 1.x.])
-AH_TEMPLATE([HAVE_GLBINDTEXTURE],
- [Define this if your version of OpenGL has the glBindTexture()
- routine. This is the case for OpenGL 1.1, but not for OpenGL
- 1.0.])
+AH_TEMPLATE([HAVE_GLES2],
+ [Define this if the native OpenGL library is OpenGLES 2.x.])
-AH_TEMPLATE([HAVE_GLE],
- [Define this if you have the -lgle and -lmatrix libraries (GL
- extrusion.)])
+AH_TEMPLATE([HAVE_GLES3],
+ [Define this if the native OpenGL library is OpenGLES 3.x.])
-AH_TEMPLATE([HAVE_GLE3],[Define this if you have the -lgle from GLE version 3])
+AH_TEMPLATE([HAVE_JWZGLES],
+ [Define this to emulate OpenGL 1.3 in terms of OpenGLES 1.x.])
-AH_TEMPLATE([HAVE_JWZGLES],[Define this to target the OpenGL ES 1.x API
- instead of OpenGL 1.3.])
+AH_TEMPLATE([HAVE_EGL],
+ [Define this if OpenGL bindings are via EGL instead of GLX.])
-AH_TEMPLATE([HAVE_XSHM_EXTENSION],
- [Define this if you have the X Shared Memory Extension.])
+AH_TEMPLATE([HAVE_GLSL],
+ [Define this if OpenGL supports the OpenGL Shading Language.])
-AH_TEMPLATE([HAVE_DOUBLE_BUFFER_EXTENSION],
- [Define this if you have the X Double Buffer Extension.])
-
-AH_TEMPLATE([FORTUNE_PROGRAM],
- [Some screenhacks like to run an external program to generate
- random pieces of text; set this to the one you like. Note that
- this is just the default; X resources can be used to override
- it.])
+AH_TEMPLATE([HAVE_GLBINDTEXTURE],
+ [Define this if the OpenGL version is 1.1 or newer.])
-AH_TEMPLATE([PASSWD_HELPER_PROGRAM],
- [Set the name of the password helper program, if any])
+AH_TEMPLATE([HAVE_GLE],
+ [Define this if you have the GL Extrusion library.])
-AH_TEMPLATE([NO_LOCKING],
- [Define this to remove the option of locking the screen at all.])
+AH_TEMPLATE([HAVE_GLE3],
+ [Define this if GL Extrusion is version 3.])
-AH_TEMPLATE([ALLOW_ROOT_PASSWD],
- [Define this to allow the root password to unlock the screen.])
-AH_TEMPLATE([HAVE_KERBEROS],
- [Define this if you want to use Kerberos authentication to
- lock/unlock the screen instead of your local password. This
- currently uses Kerberos V4, but a V5 server with V4
- compatibility will work. WARNING: DO NOT USE AFS string-to-key
- passwords with this option. This option currently *only* works
- with standard Kerberos des_string_to_key. If your password is
- an AFS password and not a kerberos password, it will not
- authenticate properly. See the comments in driver/kpasswd.c for
- more information if you need it.])
+AH_TEMPLATE([HAVE_RECORD_ANIM],
+ [Define this to enable recording of videos.])
-AH_TEMPLATE([HAVE_KERBEROS5],
- [Define this if you have Kerberos 5, meaning we need to use the
- Kerberos 4 compatibility layer.])
+#
+# Locking.
+#
+AH_TEMPLATE([NO_LOCKING],
+ [Define this to remove the option of locking the screen at all.])
AH_TEMPLATE([HAVE_PAM],
- [Define this if you want to use PAM (Pluggable Authentication
- Modules) to lock/unlock the screen, instead of standard
- /etc/passwd authentication.])
+ [Define this if you have Pluggable Authentication Modules.])
AH_TEMPLATE([PAM_SERVICE_NAME],
- [If PAM is being used, this is the name of the PAM service that
- xscreensaver will authenticate as. The default is
- "xscreensaver", which means that the PAM library will look for
- an "xscreensaver" line in /etc/pam.conf, or (on recent Linux
- systems) will look for a file called /etc/pam.d/xscreensaver.
- Some systems might already have a PAM installation that is
- configured for xlock, so setting this to "xlock" would also work
- in that case.])
+ [The name of the "xscreensaver" PAM service.])
AH_TEMPLATE([HAVE_PAM_FAIL_DELAY],
- [Define this if you have pam_fail_delay function.
- see driver/passwd-pam.c.])
+ [Define this if you have pam_fail_delay.])
AH_TEMPLATE([PAM_CHECK_ACCOUNT_TYPE],
[Whether PAM should check the result of account modules
- when authenticating. Only do this if you have account
- configured properly on your system.])
+ when authenticating.])
AH_TEMPLATE([PAM_STRERROR_TWO_ARGS],
- [Define if you have PAM and pam_strerror() requires two
- arguments.])
+ [Define if pam_strerror requires two arguments.])
-AH_TEMPLATE([HAVE_SIGTIMEDWAIT],
- [Define to 1 if you have the `sigtimedwait' function.])
+AH_TEMPLATE([HAVE_KERBEROS],
+ [Define this if you want to use Kerberos authentication to
+ lock/unlock the screen instead of PAM.])
+
+AH_TEMPLATE([HAVE_KERBEROS5],
+ [Define this if you have Kerberos 5.])
+
+AH_TEMPLATE([ALLOW_ROOT_PASSWD],
+ [Define this to allow root to unlock, when not using PAM.])
AH_TEMPLATE([HAVE_SHADOW_PASSWD],
- [Define this if your system uses 'shadow' passwords, that is, the
- passwords live in /etc/shadow instead of /etc/passwd, and one
- reads them with getspnam() instead of getpwnam(). (Note that
- SCO systems do some random other thing; others might as well.
- See the ifdefs in driver/passwd-pwent.c if you're having trouble
- related to reading passwords.)])
+ [Define this if your system uses /etc/shadow.])
+
+AH_TEMPLATE([HAVE_PWNAM_SHADOW_PASSWD],
+ [Define this if your system uses getpwnam_shadow.])
AH_TEMPLATE([HAVE_ENHANCED_PASSWD],
- [Define this if your system is Digital or SCO Unix with so-called
- ``Enhanced Security'', that is, the passwords live in
- /tcb/files/auth/<x>/<xyz> instead of in /etc/passwd, and one
- reads them with getprpwnam() instead of getpwnam().])
+ [Define this for DEC/SCO "Enhanced Security" with getprpwnam.])
AH_TEMPLATE([HAVE_ADJUNCT_PASSWD],
- [Define this if your system is Solaris with ``adjunct'' passwords
- (this is the version where one gets at the passwords with
- getpwanam() instead of getpwnam().) I haven't tested this one,
- let me know if it works.])
+ [Define this for Solaris getpwanam.])
AH_TEMPLATE([HAVE_HPUX_PASSWD],
- [Define this if you are running HPUX with so-called ``Secure
- Passwords'' (if you have /usr/include/hpsecurity.h, you probably
- have this.) I haven't tested this one, let me know if it works.])
-
-AH_TEMPLATE([HAVE_SYSLOG],
- [Define this if you the openlog(), syslog(), and closelog()
- functions. This is used for logging failed login attempts.])
+ [Define this for HPUX so-called "Secure Passwords".])
-AH_TEMPLATE([HAVE_ICMP],
- [Define this if you do pings with a `struct icmp' and an
- `icmp_id' slot.])
-
-AH_TEMPLATE([HAVE_ICMPHDR],
- [Define this if you do pings with a `struct icmphdr' and an
- `un.echo.id' slot.])
+#AH_TEMPLATE([PASSWD_HELPER_PROGRAM],
+# [Define this to use a third-party password helper program.])
-AH_TEMPLATE([HAVE_GETIFADDRS],
- [Define this if you have the getifaddrs() function.])
-
-AH_TEMPLATE([HAVE_FORKPTY],
- [Define this if you have the 'forkpty' function:
- This allows 'phosphor' and 'apple2' to run curses-based
- programs, or be used as terminal windows.])
-
-AH_TEMPLATE([HAVE_GETTIMEOFDAY],
- [Define this if you have the gettimeofday function.])
-
-AH_TEMPLATE([GETTIMEOFDAY_TWO_ARGS],
- [Define this if gettimeofday() takes two arguments.])
-
-AH_TEMPLATE([XPointer],
- [Define this to void* if you're using X11R4 or earlier.])
+AH_TEMPLATE([HAVE_SYSLOG],
+ [Define this if you have openlog/syslog/closelog.])
-AH_TEMPLATE([HAVE_PTHREAD],
- [Define this if your system supports POSIX threads.])
-
-AH_TEMPLATE([HAVE_LIBCAP],
- [Define this if your system has libcap.])
-
-AH_TEMPLATE([HAVE_RECORD_ANIM],
- [Define this to enable recording of videos.])
# After checking to see that --srcdir is correct (which AC_INIT does)
# check for some random other files that come later in the tar file,
@@ -355,39 +295,24 @@ done
###############################################################################
#
-# Query AX_PTHREAD, and figure out which compiler gets used.
+# Check for availability of various gcc command-line options.
#
###############################################################################
-AC_DEFUN([AC_PROG_CC_PTHREAD],
- [have_pthread=no
- with_pthread_req=unspecified
-
- # AX_PTHREAD is from the GNU Autoconf Archive.
- # https://savannah.gnu.org/projects/autoconf-archive/
- m4_include(ax_pthread.m4)
-
- # This affects CC, LIBS, and CFLAGS, instead of defining new variables.
-
- AC_ARG_WITH([pthread],
- [ --with-pthread Enables POSIX threads, for SMP support.],
- [with_pthread="$withval"; with_pthread_req="$withval"],
- [with_pthread=yes])
-
- if test "$with_pthread" = yes; then
- # AX_PTHREAD might want a different compiler.
- AX_PTHREAD(
- [if test "$CC" = "$PTHREAD_CC" -o -z "$ac_original_cc"; then
- have_pthread=yes
- else
- ac_prog_cc_no_pthread=yes
- fi
- ])
-
- if test "$have_pthread" = yes; then
- AC_DEFINE([HAVE_PTHREAD])
- CC=$PTHREAD_CC
- fi
+AC_DEFUN([AC_CHECK_GCC_ARG],
+ [if test -n "$GCC"; then
+ AC_CACHE_CHECK([whether gcc accepts [$2]],
+ ac_cv_gcc_accepts_[$1],
+ [rm -rf conftest.$ac_ext
+ touch conftest.$ac_ext
+ if ( ( gcc -c [$2] conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
+ grep unrecognized >/dev/null ); then
+ ac_cv_gcc_accepts_[$1]=no
+ else
+ ac_cv_gcc_accepts_[$1]=yes
+ CC="$CC [$2]"
+ fi])
+ ac_gcc_accepts_[$1]="$ac_cv_gcc_accepts_[$1]"
fi
])
@@ -429,139 +354,33 @@ AC_DEFUN([AC_PROG_CC_ANSI],
CC="$CC -D__EXTENSIONS__"
;;
esac
- fi
-
- OBJCC="$CC"
-
- # This test makes cross-compiling fail, so let's just assume that nobody
- # is using a K&R compiler any more...
- #
-# AC_MSG_CHECKING([whether the compiler works on ANSI C])
-# AC_TRY_RUN([ main(int ac, char **av) { return 0; } ],
-# AC_MSG_RESULT(yes),
-# AC_MSG_RESULT(no)
-# AC_MSG_ERROR(Couldn't build even a trivial ANSI C program: check CC.),
-# AC_MSG_ERROR(Couldn't build even a trivial ANSI C program: check CC.))
-
- if test -n "$GCC"; then
- AC_MSG_RESULT(Turning on gcc compiler warnings.)
- CC="$CC -pedantic -Wall -Wstrict-prototypes -Wnested-externs -Wmissing-prototypes"
- OBJCC="$OBJCC -Wall"
- # As of gcc 3.4, we have "-Wdeclaration-after-statement"
- # and so perhaps now we can do without -pedantic?
- else
- case "$host" in
- *-irix5* |*-irix6.[0-3]* )
- AC_MSG_RESULT(Turning on SGI compiler warnings.)
- CC="$CC -fullwarn -use_readonly_const -rdata_shared -g3"
- ;;
-# *-dec-osf* )
-# if test -z "$GCC"; then
-# AC_MSG_RESULT(Turning on DEC C compiler warnings.)
-# CC="$CC -migrate -w0 -verbose -warnprotos"
-# fi
-# ;;
- esac
- fi
-])
-
-
-###############################################################################
-#
-# Check for availability of various gcc command-line options.
-#
-###############################################################################
-
-AC_DEFUN([AC_CHECK_GCC_ARG],
- [if test -n "$GCC"; then
- AC_CACHE_CHECK([whether gcc accepts [$2]],
- ac_cv_gcc_accepts_[$1],
- [rm -rf conftest.$ac_ext
- touch conftest.$ac_ext
- if ( ( gcc -c [$2] conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
- grep unrecognized >/dev/null ); then
- ac_cv_gcc_accepts_[$1]=no
- else
- ac_cv_gcc_accepts_[$1]=yes
- CC="$CC [$2]"
- fi])
- ac_gcc_accepts_[$1]="$ac_cv_gcc_accepts_[$1]"
- fi
-])
-
-AC_DEFUN([AC_NO_LONG_STRING_WARNINGS],
- [AC_CHECK_GCC_ARG(no_overlength, -Wno-overlength-strings)])
-
-AC_DEFUN([AC_NO_MISPLACED_DECLARATIONS],
- [AC_CHECK_GCC_ARG(no_decl_after, -Wdeclaration-after-statement)])
-
-# Need to disable Objective C extensions in ANSI C on MacOS X to work
-# around an Apple-specific gcc bug.
-#
-AC_DEFUN([AC_NO_OBJECTIVE_C],
- [AC_CHECK_GCC_ARG(no_cpp_precomp, -no-cpp-precomp)])
-###############################################################################
-#
-# Function to figure out how to disable // comments in ANSI C code.
-#
-# (With recent gcc, this is done with "-std=c89". With older gcc, this
-# is done by passing "-lang-c89" to cpp, by passing "-Wp,-lang-c89" to
-# gcc. Old gcc doesn't support -std, and new gcc doesn't support -lang.
-# so much for compatibility!)
-#
-# UPDATE: apparently there is NO WAY to tell gcc 3.2.2 to require that
-# declarations preceed statements, without resorting to "-pedantic".
-# This means that there is no way to get gcc3 to issue warnings that
-# ensure that your code complies with the ANSI/ISO C89 standard, without
-# also drowning in totally useless warnings. Thank you master may I
-# have another.
-#
-# So, I give up, let's just use -pedantic.
-#
-###############################################################################
-
-AC_DEFUN([AC_GCC_ACCEPTS_STD], [
- case "$host" in
- *-darwin* )
- # Fucking Apple let // comments sneak into OpenGL headers, so
- # we *must* allow // comments when compiling on Mac OS 10.6! FUCK!
- ;;
- *)
- AC_CHECK_GCC_ARG(std, -std=c89)
- ;;
- esac
-])
-
-AC_DEFUN([AC_NO_CPLUSPLUS_COMMENTS_IN_C_CODE],
- [if test -n "$GCC"; then
- AC_GCC_ACCEPTS_STD
- AC_MSG_RESULT(Disabling C++ comments in ANSI C code.)
- #
- # The reason that // comments are banned from xscreensaver is that gcc is
- # basically the only compiler in the world that supports them in C code.
- # All other vendors support them only in their C++ compilers, not in their
- # ANSI C compilers. This means that it's a portability problem: every time
- # these comments have snuck into the xscreensaver source code, I've gotten
- # complaints about it the next day. So we turn off support for them in gcc
- # as well to prevent them from accidentially slipping in.
- #
- if test "$ac_gcc_accepts_std" = yes ; then
- #
- # -std=c89 defines __STRICT_ANSI__, which we don't want.
- # (That appears to be the only additional preprocessor symbol
- # it defines, in addition to the syntax changes it makes.)
- #
- # -std=gnu89 is no good, because // comments were a GNU extension
- # before they were in the ANSI C 99 spec... (gcc 2.96 permits //
- # with -std=gnu89 but not with -std=c89.)
- #
- # $CC already contains "-std=c89" via AC_GCC_ACCEPTS_STD
- CC="$CC -U__STRICT_ANSI__"
-# else
-# # The old way:
-# CC="$CC -Wp,-lang-c89"
- fi
+ # Prior to 1996, XScreenSaver was written in K&R C, because ANSI C
+ # compilers (function prototypes!) were not yet universally deployed.
+ # And even after the conversion to ANSI C, GNU C's various non-standard
+ # extensions (such as allowing C++ style "//" comments in C code, and
+ # declarations after statements) were not supported by non-gcc compilers
+ # for many years, so we continued to use "-std=c89" to prevent those
+ # GNU-isms from sneaking in to the code. Well, these days various
+ # vendors have sloppily allowed non-ANSI syntax to slip into their
+ # library header files. GTK and OpenGL have been major offenders in this
+ # way. So... as of 2021, I guess we are forced to use "-std=gnu89", to
+ # allow those extensions, and hope that the warnings generated by
+ # "-pedantic" are heeded.
+ #
+ AC_CHECK_GCC_ARG(gnu89, -std=gnu89)
+ AC_CHECK_GCC_ARG(pedantic, -pedantic)
+ AC_CHECK_GCC_ARG(Wall, -Wall)
+ AC_CHECK_GCC_ARG(wnested_externs, -Wnested-externs)
+ AC_CHECK_GCC_ARG(wstrict_prototypes, -Wstrict-prototypes)
+ AC_CHECK_GCC_ARG(wmissing_prototypes, -Wmissing-prototypes)
+ AC_CHECK_GCC_ARG(declaration_after, -Wdeclaration-after-statement)
+ # "string length is greater than ISO C89 compilers required to support"
+ AC_CHECK_GCC_ARG(no_overlength_strings, -Wno-overlength-strings)
+ # Ignore warnings about using "inline"
+ AC_CHECK_GCC_ARG(no_language_ext_token, -Wno-language-extension-token)
+ # Xlib headers use named variadic macros.
+ AC_CHECK_GCC_ARG(no_variadic_macros, -Wno-variadic-macros)
fi
])
@@ -626,16 +445,13 @@ AC_DEFUN([AC_PROG_INSTALL_DIRS],
AC_DEFUN([AC_GETTIMEOFDAY_ARGS],
[AC_MSG_CHECKING(how to call gettimeofday)
AC_CACHE_VAL(ac_cv_gettimeofday_args,
- [AC_TRY_COMPILE([#include <stdlib.h>
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([#include <stdlib.h>
#include <sys/time.h>],
- [struct timeval tv; struct timezone tzp;
- gettimeofday(&tv, &tzp);],
- [ac_gettimeofday_args=2],
- [AC_TRY_COMPILE([#include <stdlib.h>
- #include <sys/time.h>],
- [struct timeval tv; gettimeofday(&tv);],
- [ac_gettimeofday_args=1],
- [ac_gettimeofday_args=0])])
+ [struct timeval tv; struct timezone tzp;
+ gettimeofday(&tv, &tzp);])],
+ [ac_gettimeofday_args=2],
+ [ac_gettimeofday_args=1])
ac_cv_gettimeofday_args=$ac_gettimeofday_args])
ac_gettimeofday_args=$ac_cv_gettimeofday_args
if test "$ac_gettimeofday_args" = 1 ; then
@@ -676,33 +492,14 @@ AC_DEFUN([AC_PROG_PERL],
###############################################################################
#
-# Function to demand "bc". Losers.
-#
-###############################################################################
-
-AC_DEFUN([AC_DEMAND_BC],
- [ac_bc_result=`echo 6+9 | bc 2>/dev/null`
- AC_MSG_CHECKING([for bc])
- if test "$ac_bc_result" = "15" ; then
- AC_MSG_RESULT(yes)
- else
- AC_MSG_RESULT(no)
- echo ''
- AC_MSG_ERROR([Your system doesn't have \"bc\", which has been a standard
- part of Unix since the 1970s. Come back when your vendor
- has grown a clue.])
- fi
- ])
-
-###############################################################################
-#
# Functions to check how to do ICMP PING requests.
#
###############################################################################
AC_DEFUN([AC_CHECK_ICMP],
[AC_CACHE_CHECK([for struct icmp], ac_cv_have_icmp,
- [AC_TRY_COMPILE([#include <stdlib.h>
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <unistd.h>
@@ -736,16 +533,17 @@ AC_DEFUN([AC_CHECK_ICMP],
#else
ip.ip_hl = 0;
#endif
- ],
- [ac_cv_have_icmp=yes],
- [ac_cv_have_icmp=no])])
+ ])],
+ [ac_cv_have_icmp=yes],
+ [ac_cv_have_icmp=no])])
if test "$ac_cv_have_icmp" = yes ; then
AC_DEFINE(HAVE_ICMP)
fi])
AC_DEFUN([AC_CHECK_ICMPHDR],
[AC_CACHE_CHECK([for struct icmphdr], ac_cv_have_icmphdr,
- [AC_TRY_COMPILE([#include <stdlib.h>
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <unistd.h>
@@ -774,9 +572,9 @@ AC_DEFUN([AC_CHECK_ICMPHDR],
i.un.echo.id = 0;
i.un.echo.sequence = 0;
si.sin_family = AF_INET;
- ip.ip_hl = 0;],
- [ac_cv_have_icmphdr=yes],
- [ac_cv_have_icmphdr=no])])
+ ip.ip_hl = 0;])],
+ [ac_cv_have_icmphdr=yes],
+ [ac_cv_have_icmphdr=no])])
if test "$ac_cv_have_icmphdr" = yes ; then
AC_DEFINE(HAVE_ICMPHDR)
fi])
@@ -790,6 +588,7 @@ AC_DEFUN([AC_CHECK_ICMPHDR],
# Try and find the app-defaults directory.
# It sucks that autoconf doesn't do this already...
+# (AC_PATH_X_APP_DEFAULTS_XMKMF is no longer used.)
#
AC_DEFUN([AC_PATH_X_APP_DEFAULTS_XMKMF],[
rm -fr conftestdir
@@ -808,17 +607,6 @@ EOF
rm -fr conftestdir
fi])
-###############################################################################
-#
-# Handle the --with-x-app-defaults option HERE
-#
-###############################################################################
-
-AC_ARG_WITH(x-app-defaults,[],
- [ac_cv_x_app_defaults="$withval"],
- [eval ac_x_app_defaults="$withval"])
-
-
AC_DEFUN([AC_PATH_X_APP_DEFAULTS_DIRECT],[
# Look for the directory under a standard set of common directories.
# Check X11 before X11Rn because it's often a symlink to the current release.
@@ -911,6 +699,14 @@ AC_DEFUN([AC_XPOINTER],
AC_DEFINE(XPointer,[char*])
fi])
+AC_DEFUN([AC_XT],
+ [AC_CACHE_CHECK([for Xt], ac_cv_libxt,
+ [AC_TRY_X_COMPILE([#include <X11/Xlib.h>
+ #include <X11/Intrinsic.h>],
+ [Widget foo = (Widget) 0;],
+ [ac_cv_libxt=yes],
+ [ac_cv_libxt=no])])])
+
# Random special-cases for X on certain pathological OSes.
# You know who you are.
@@ -1033,38 +829,58 @@ AC_DEFUN([AC_X_RANDOM_PATHS],
;;
*-darwin*)
- # On MacOS X (10.x with "fink"), many things are under /sw/.
- #
+ # MacPorts on macOS
+ if test -d /opt/local/include ; then
+ X_CFLAGS="-I/opt/local/include $X_CFLAGS"
+ X_LIBS="-L/opt/local/lib $X_LIBS"
+ fi
+
+ # Fink on macOS
if test -d /sw/include ; then
X_CFLAGS="-I/sw/include $X_CFLAGS"
- X_LIBS="-L/sw/lib $X_LIBS"
+ X_LIBS="-L/sw/lib $X_LIBS"
+ fi
+
+ # Homebrew on macOS Intel
+ if test -d /usr/local/include ; then
+ X_CFLAGS="-I/usr/local/include $X_CFLAGS"
+ X_LIBS="-L/usr/local/lib $X_LIBS"
+ fi
+
+ # Homebrew on macOS ARM
+ if test -d /opt/homebrew/include ; then
+ X_CFLAGS="-I/opt/homebrew/include $X_CFLAGS"
+ X_LIBS="-L/opt/homebrew/lib $X_LIBS"
fi
;;
esac])
AC_DEFUN([AC_CHECK_GETIFADDRS],
[AC_CACHE_CHECK([for getifaddrs], ac_cv_have_getifaddrs,
- [AC_TRY_COMPILE([#include <stdlib.h>
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <ifaddrs.h>],
[struct ifaddrs *ifa;
getifaddrs (&ifa);
ifa->ifa_next = 0;
- ifa->ifa_addr->sa_family = 0;],
- [ac_cv_have_getifaddrs=yes],
- [ac_cv_have_getifaddrs=no])])
+ ifa->ifa_addr->sa_family = 0;])],
+ [ac_cv_have_getifaddrs=yes],
+ [ac_cv_have_getifaddrs=no])])
if test "$ac_cv_have_getifaddrs" = yes ; then
AC_DEFINE(HAVE_GETIFADDRS)
fi])
AC_DEFUN([AC_TYPE_SOCKLEN_T],
[AC_CACHE_CHECK([for socklen_t], ac_cv_type_socklen_t,
- [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
- #include <sys/types.h>
- #include <sys/socket.h>]], [[
- socklen_t socklen;
- ]])],[ac_cv_type_socklen_t=yes],[ac_cv_type_socklen_t=no])])
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([
+ #include <sys/types.h>
+ #include <sys/socket.h>],
+ [socklen_t socklen;])],
+ [ac_cv_type_socklen_t=yes],
+ [ac_cv_type_socklen_t=no])])
if test "$ac_cv_type_socklen_t" != yes; then
AC_DEFINE(socklen_t, int,
[Define to `int' if <sys/types.h> or <sys/socket.h> does not define.])
@@ -1100,7 +916,7 @@ AC_DEFUN([AC_EGREP_X_HEADER], [
AC_EGREP_HEADER([$1], [$2], [$3], [$4])
CPPFLAGS="$ac_save_CPPFLAGS"])
-# Like AC_TRY_COMPILE, but it uses the already-computed -I directories.
+# Like AC_COMPILE_IFELSE but it uses the already-computed -I directories.
#
AC_DEFUN([AC_TRY_X_COMPILE], [
ac_save_CPPFLAGS="$CPPFLAGS"
@@ -1109,7 +925,7 @@ AC_DEFUN([AC_TRY_X_COMPILE], [
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- AC_TRY_COMPILE([$1], [$2], [$3], [$4])
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([$1], [$2])],[$3],[$4])
CPPFLAGS="$ac_save_CPPFLAGS"])
@@ -1141,7 +957,7 @@ AC_DEFUN([AC_CHECK_X_LIB], [
# LIBS="$ac_save_LIBS"
])
-# Like AC_TRY_RUN, but it uses the already-computed -I directories.
+# Like AC_RUN_IFELSE but it uses the already-computed -I directories.
# (But not the -L directories!)
#
AC_DEFUN([AC_TRY_X_RUN], [
@@ -1151,7 +967,7 @@ AC_DEFUN([AC_TRY_X_RUN], [
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- AC_TRY_RUN([$1], [$2], [$3], [$4])
+ AC_RUN_IFELSE([AC_LANG_SOURCE([$1])],[$2],[$3],[$4])
CPPFLAGS="$ac_save_CPPFLAGS"])
@@ -1211,7 +1027,6 @@ AC_DEFUN([HANDLE_X_PATH_ARG], [
])
-
###############################################################################
###############################################################################
#
@@ -1220,28 +1035,25 @@ AC_DEFUN([HANDLE_X_PATH_ARG], [
###############################################################################
###############################################################################
+# Default $PATH might not contain /sbin and thus miss /sbin/setcap.
+#
+export PATH="$PATH:/usr/bin:/bin:/usr/sbin:/sbin"
+
+
# WTF! autoconf emits this *way* too late. Do it earlier.
test "x$prefix" = xNONE && prefix=$ac_default_prefix
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
# random compiler setup
AC_CANONICAL_HOST
ac_original_cc=$CC
AC_PROG_CC
-AC_PROG_CC_PTHREAD # Needs ac_original_cc.
-
AC_PROG_CC_ANSI
-AC_NO_LONG_STRING_WARNINGS
-AC_NO_MISPLACED_DECLARATIONS
-AC_NO_OBJECTIVE_C
-AC_NO_CPLUSPLUS_COMMENTS_IN_C_CODE
AC_PROG_CPP
AC_C_CONST
AC_C_INLINE
AC_EXEEXT
-AC_DEMAND_BC
# stuff for Makefiles
AC_PROG_INSTALL
@@ -1256,13 +1068,11 @@ AC_PROG_MAKE_SET
INSTALL_SCRIPT='${INSTALL}'
# random libc stuff
-AC_HEADER_STDC
AC_CHECK_HEADERS(unistd.h inttypes.h)
AC_TYPE_MODE_T
AC_TYPE_PID_T
AC_TYPE_SIZE_T
-AC_TYPE_SIGNAL
-AC_HEADER_TIME
+AC_DEFINE_UNQUOTED([RETSIGTYPE],[void],[Return type of signal handlers])
AC_HEADER_SYS_WAIT
AC_HEADER_DIRENT
AC_GETTIMEOFDAY_ARGS
@@ -1271,7 +1081,7 @@ AC_CHECK_FUNCS(select fcntl uname nice setpriority getcwd getwd putenv sbrk)
AC_CHECK_FUNCS(sigaction syslog realpath setrlimit)
AC_CHECK_FUNCS(setlocale sqrtf)
AC_CHECK_FUNCS(getaddrinfo)
-AC_CHECK_MEMBERS([struct sockaddr.sa_len],,, [[#include <sys/socket.h>]])
+AC_CHECK_MEMBERS([struct sockaddr.sa_len],,, [#include <sys/socket.h>])
AC_CHECK_ICMP
AC_CHECK_ICMPHDR
AC_CHECK_GETIFADDRS
@@ -1290,33 +1100,85 @@ if test "$have_x" != yes; then
AC_MSG_ERROR(Couldn't find X11 headers/libs. Try `$0 --help'.)
fi
-AC_PATH_X_APP_DEFAULTS
AC_X_RANDOM_PATHS
AC_XPOINTER
+AC_XT
-AC_MSG_CHECKING(whether this is MacOS X)
+
+AC_MSG_CHECKING(whether this is macOS)
ac_macosx=no
+ ac_irix=no
case "$host" in
*-apple-darwin* )
ac_macosx=yes
;;
+ *-irix* )
+ ac_irix=yes
+ ;;
esac
AC_MSG_RESULT($ac_macosx)
###############################################################################
#
+# pkg-config
+#
+###############################################################################
+
+AC_PATH_TOOL(pkg_config, pkg-config)
+
+if test -z "$pkg_config" ; then
+ AC_MSG_WARN([pkg-config not found!])
+ pkg_config="false"
+fi
+
+
+# Utility function for running pkg-config-based tests...
+#
+pkgs=''
+pkg_check_version() {
+ if test "$ok" = yes ; then
+ req="$1"
+ min="$2"
+ AC_MSG_CHECKING(for $req)
+ if $pkg_config --exists "$req" ; then
+ vers=`$pkg_config --modversion "$req"`
+ if $pkg_config --exists "$req >= $min" ; then
+ AC_MSG_RESULT($vers)
+ pkgs="$pkgs $req"
+ return 1
+ else
+ AC_MSG_RESULT($vers (wanted >= $min))
+ ok=no
+ return 0
+ fi
+ else
+ AC_MSG_RESULT(no)
+ ok=no
+ return 0
+ fi
+ fi
+}
+
+
+###############################################################################
+#
# Gettext support
#
###############################################################################
+# Wow, this is complete madness. Why does po/Makefile.in.in exist?? Why does
+# aclocal.m4 exist?? Why can't I upgrade it without everything breaking??
+# This IT_PROG_INTLTOOL nonsense has so many self-modifying levels of insanity
+# that it *must* have been written by RMS. Or an equally demented protégé.
+# Won't someone please have mercy on us all and write a normal po/Makefile.in
+# that uses wildcards, and write a sane set of rules to detect gettext(3) and
+# msgfmt(1) and just do the obviously straightforward thing?
+
IT_PROG_INTLTOOL
GETTEXT_PACKAGE=xscreensaver
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE",
[This is the name of the gettext package to use.])
-AC_DEFINE_UNQUOTED(PACKAGE, "$GETTEXT_PACKAGE",
- [This is the same as GETTEXT_PACKAGE, but for the glade
- generated code.])
AC_SUBST(GETTEXT_PACKAGE)
ALL_LINGUAS="da de es et fi fr hu it ja ko nb nl pl pt pt_BR ru sk sv vi wa zh_CN zh_TW"
@@ -1326,68 +1188,21 @@ MKINSTALLDIRS="$INSTALL_DIRS"
###############################################################################
#
-# Check for -lXmu (some fucked up vendors don't ship it...)
+# The --with-x-app-defaults option
#
###############################################################################
-have_xmu=no
-AC_CHECK_X_HEADER(X11/Xmu/Error.h, [have_xmu=yes],,
- [#include <stdlib.h>
- #include <stdio.h>
- #include <X11/Intrinsic.h>])
-if test "$have_xmu" = no ; then
- XMU_SRCS='$(UTILS_SRC)/xmu.c'
- XMU_OBJS='$(UTILS_BIN)/xmu.o'
- XMU_LIBS=''
-else
- XMU_SRCS=''
- XMU_OBJS=''
- XMU_LIBS='-lXmu'
- AC_DEFINE(HAVE_XMU)
-fi
+#### H1
+AC_ARG_WITH(app-defaults,[
+Installation Options:
-###############################################################################
-#
-# Check for the SunOS 4.1.x _get_wmShellWidgetClass bug.
-# See comp.windows.x FAQ question 124. The right fix is to
-# get OpenWindows 3.0 patches 100512-02 and 100573-03.
-#
-###############################################################################
-
-if test "$have_xmu" = yes ; then
- case "$host" in
- *-sunos4*)
- AC_CACHE_CHECK([for the SunOS 4.1.x _get_wmShellWidgetClass bug],
- ac_cv_sunos_xmu_bug,
- [ac_save_LDFLAGS="$LDFLAGS"
- if test \! -z "$x_libraries" ; then
- LDFLAGS="$LDFLAGS -L$x_libraries"
- fi
- # Note: this trick never works! (Generally.)
- # We're only getting away with using AC_TRY_LINK
- # with X libraries because we know it's SunOS.
- LDFLAGS="$LDFLAGS -lXmu -lXt -lX11 -lXext -lm"
- AC_TRY_LINK(,,
- [ac_cv_sunos_xmu_bug=no],
- [ac_cv_sunos_xmu_bug=yes])
- LDFLAGS="$ac_save_LDFLAGS"])
- if test "$ac_cv_sunos_xmu_bug" = yes ; then
- AC_CACHE_CHECK([whether the compiler understands -static],
- ac_cv_ld_static,
- [ac_save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LDFLAGS -static"
- AC_TRY_LINK(,,[ac_cv_ld_static=yes],[ac_cv_ld_static=no])
- LDFLAGS="$ac_save_LDFLAGS"])
- if test "$ac_cv_ld_static" = yes ; then
- LDFLAGS="$LDFLAGS -static"
- else
- LDFLAGS="$LDFLAGS -Bstatic"
- fi
- fi
- ;;
- esac
-fi
+ --prefix=PREFIX Install root of architecture-independent files.
+ --exec-prefix=EPREFIX Install root of architecture-dependent files.
+ --with-app-defaults=DIR Where to install the default settings file.],
+ [ac_cv_x_app_defaults="$withval"],
+ [eval ac_x_app_defaults="$withval"])
+AC_PATH_X_APP_DEFAULTS
###############################################################################
@@ -1398,11 +1213,8 @@ fi
have_hackdir=yes
with_hackdir_req=unspecified
-AC_ARG_WITH(hackdir,[
-
-Installation options:
- --with-hackdir=DIR Where to install the hundreds of demo executables.
- Default: `PREFIX/libexec/xscreensaver/'],
+AC_ARG_WITH(hackdir,
+[ --with-hackdir=DIR Where to install the hundreds of demo executables.],
[with_hackdir="$withval"; with_hackdir_req="$withval"],[with_hackdir=yes])
if test x"$with_hackdir" = xyes; then
@@ -1435,19 +1247,13 @@ fi
###############################################################################
#
# Handle the --with-configdir option
-# Help for --with-x-app-defaults option added.
#
###############################################################################
have_configdir=yes
with_configdir_req=unspecified
AC_ARG_WITH(configdir,
-[ --with-configdir=DIR Where to install the data files that describe each
- of the display modes to the GUI.
- Default: `PREFIX/share/xscreensaver/config/'
- --with-x-app-defaults=DIR
- Where to install xscreensaver configuration file.
-],
+[ --with-configdir=DIR Where to install the GUI configuration files.],
[with_configdir="$withval"; with_configdir_req="$withval"],
[with_configdir=yes])
@@ -1469,108 +1275,37 @@ fi
-
###############################################################################
#
-# Check for the SGI SCREEN_SAVER server extension.
+# Handle the --with-fontdir option
#
###############################################################################
-#have_sgi=no
-#with_sgi_req=unspecified
-#AC_ARG_WITH(sgi-ext,
-#[Except where noted, all of the --with options below can also take a
-#directory argument: for example, `--with-motif=/opt/Motif'. That would
-#cause /opt/Motif/include/ to be added to the -I list, and /opt/Motif/lib/
-#to be added to the -L list, assuming those directories exist.
-#
-#By default, support for each of these options will be built in, if the
-#relevant library routines exist. At run time, they will then be used
-#only if the X server being used supports them. Each --with option has
-#a corresponding --without option, to override building support for them
-#at all.
-#
-#Screen blanking and idle-detection options:
-#
-# --with-sgi-ext Include support for the SGI SCREEN_SAVER extension.],
-# [with_sgi="$withval"; with_sgi_req="$withval"],[with_sgi=yes])
-#
-#HANDLE_X_PATH_ARG(with_sgi, --with-sgi-ext, SGI SCREEN_SAVER)
-#
-#if test "$with_sgi" = yes; then
-# AC_CHECK_X_HEADER(X11/extensions/XScreenSaver.h,
-# [have_sgi=yes
-# AC_DEFINE(HAVE_SGI_SAVER_EXTENSION)],,
-# [#include <X11/Xlib.h>])
-#
-#elif test "$with_sgi" != no; then
-# echo "error: must be yes or no: --with-sgi-ext=$with_sgi"
-# exit 1
-#fi
-
+have_fontdir=yes
+with_fontdir_req=unspecified
+AC_ARG_WITH(fontdir,
+[ --with-fontdir=DIR Where to install the extra font files.],
+ [with_fontdir="$withval"; with_fontdir_req="$withval"],
+ [with_fontdir=yes])
-###############################################################################
-#
-# Check for the XIDLE server extension.
-#
-###############################################################################
+if test x"$with_fontdir" = xyes; then
+ FONT_DIR='${datarootdir}/fonts/xscreensaver'
+ if test "$ac_macosx" = yes; then
+ FONT_DIR='/Library/Fonts'
+ fi
+elif test x"$with_fontdir" = xno; then
+ FONT_DIR=''
+else
+ # there must be a better way than this...
+ if test -z "`echo $with_fontdir | sed 's@^/.*@@'`" ; then
+ # absolute path
+ FONT_DIR="$with_fontdir"
+ else
+ # relative path
+ FONT_DIR='${datarootdir}/fonts/'"$with_fontdir"
+ fi
+fi
-#have_xidle=no
-#with_xidle_req=unspecified
-#AC_ARG_WITH(xidle-ext,
-#[ --with-xidle-ext Include support for the XIDLE extension.],
-# [with_xidle="$withval"; with_xidle_req="$withval"],[with_xidle=yes])
-#
-#HANDLE_X_PATH_ARG(with_xidle, --with-xidle-ext, XIDLE)
-#
-#if test "$with_xidle" = yes; then
-# AC_CHECK_X_HEADER(X11/extensions/xidle.h,
-# [have_xidle=yes
-# AC_DEFINE(HAVE_XIDLE_EXTENSION)],,
-# [#include <X11/Xlib.h>])
-#elif test "$with_xidle" != no; then
-# echo "error: must be yes or no: --with-xidle-ext=$with_xidle"
-# exit 1
-#fi
-
-
-###############################################################################
-#
-# Check for the SGI-VIDEO-CONTROL server extension.
-#
-###############################################################################
-
-#have_sgivc=no
-#with_sgivc_req=unspecified
-#AC_ARG_WITH(sgivc-ext,
-#[ --with-sgivc-ext Include support for the SGI-VIDEO-CONTROL extension.],
-# [with_sgivc="$withval"; with_sgivc_req="$withval"],[with_sgivc=yes])
-#
-#HANDLE_X_PATH_ARG(with_sgivc, --with-sgivc-ext, SGI-VIDEO-CONTROL)
-#
-#if test "$with_sgivc" = yes; then
-#
-# # first check for XSGIvc.h
-# AC_CHECK_X_HEADER(X11/extensions/XSGIvc.h, [have_sgivc=yes],,
-# [#include <X11/Xlib.h>])
-#
-# # if that succeeded, then check for the -lXsgivc
-# if test "$have_sgivc" = yes; then
-# have_sgivc=no
-# AC_CHECK_X_LIB(Xsgivc, XSGIvcQueryGammaMap,
-# [have_sgivc=yes; SAVER_LIBS="$SAVER_LIBS -lXsgivc"], [true],
-# -lXext -lX11)
-# fi
-#
-# # if that succeeded, then we've really got it.
-# if test "$have_sgivc" = yes; then
-# AC_DEFINE(HAVE_SGI_VC_EXTENSION)
-# fi
-#
-#elif test "$with_sgivc" != no; then
-# echo "error: must be yes or no: --with-sgivc-ext=$with_sgivc"
-# exit 1
-#fi
###############################################################################
@@ -1579,10 +1314,15 @@ fi
#
###############################################################################
+#### H1
+
have_dpms=no
with_dpms_req=unspecified
AC_ARG_WITH(dpms-ext,
-[ --with-dpms-ext Include support for the DPMS extension.],
+[
+Server Extension Options:
+
+ --with-dpms-ext Include support for power management.],
[with_dpms="$withval"; with_dpms_req="$withval"],[with_dpms=yes])
HANDLE_X_PATH_ARG(with_dpms, --with-dpms-ext, DPMS)
@@ -1623,6 +1363,50 @@ fi
###############################################################################
#
+# Check for the XF86VMODE server extension (for virtual screens.)
+#
+###############################################################################
+
+have_xf86vmode=no
+with_xf86vmode_req=unspecified
+AC_ARG_WITH(xf86vmode-ext,
+[ --with-xf86vmode-ext Include support for virtual screens.],
+ [with_xf86vmode="$withval"; with_xf86vmode_req="$withval"],
+ [with_xf86vmode=yes])
+
+HANDLE_X_PATH_ARG(with_xf86vmode, --with-xf86vmode-ext, xf86vmode)
+
+VIDMODE_LIBS=""
+
+if test "$with_xf86vmode" = yes; then
+
+ # first check for xf86vmode.h
+ AC_CHECK_X_HEADER(X11/extensions/xf86vmode.h, [have_xf86vmode=yes],,
+ [#include <X11/Xlib.h>])
+
+ # if that succeeded, then check for the -lXxf86vm
+ if test "$have_xf86vmode" = yes; then
+ have_xf86vmode=no
+ AC_CHECK_X_LIB(Xxf86vm, XF86VidModeGetViewPort,
+ [have_xf86vmode=yes;
+ VIDMODE_LIBS="-lXxf86vm";
+ SAVER_LIBS="$SAVER_LIBS $VIDMODE_LIBS"],
+ [true], -lXext -lX11)
+ fi
+
+ # if that succeeded, then we've really got it.
+ if test "$have_xf86vmode" = yes; then
+ AC_DEFINE(HAVE_XF86VMODE)
+ fi
+
+elif test "$with_xf86vmode" != no; then
+ echo "error: must be yes or no: --with-xf86vmode-ext=$with_xf86vmode"
+ exit 1
+fi
+
+
+###############################################################################
+#
# Check for the XINERAMA server extension.
#
###############################################################################
@@ -1630,15 +1414,11 @@ fi
have_xinerama=no
with_xinerama_req=unspecified
AC_ARG_WITH(xinerama-ext,
-[ --with-xinerama-ext Include support for the XINERAMA extension.],
+[ --with-xinerama-ext Include support for multiple monitors.],
[with_xinerama="$withval"; with_xinerama_req="$withval"],[with_xinerama=yes])
HANDLE_X_PATH_ARG(with_xinerama, --with-xinerama-ext, XINERAMA)
-AC_CHECK_X_LIB(Xss, XScreenSaverQueryInfo, [X_EXTRA_LIBS="$X_EXTRA_LIBS -lXss"], [true],
- -lXss -lX11)
-
-
if test "$with_xinerama" = yes; then
# first check for Xinerama.h
@@ -1674,83 +1454,117 @@ fi
###############################################################################
#
-# Check for the XINPUT server extension.
+# Check for the RANDR (Resize and Rotate) server extension.
+#
+# We need this to detect when the resolution of the desktop
+# has changed out from under us (this is a newer, different
+# mechanism than the XF86VMODE virtual viewports.)
#
###############################################################################
-have_xinput=no
-with_xinput_req=unspecified
-AC_ARG_WITH(xinput-ext,
-[ --with-xinput-ext Include support for the XInput extension.],
- [with_xinput="$withval"; with_xinput_req="$withval"], [with_xinput=yes])
+have_randr=no
+with_randr_req=unspecified
+AC_ARG_WITH(randr-ext,
+[ --with-randr-ext Include support for multiple monitors.],
+ [with_randr="$withval"; with_randr_req="$withval"],[with_randr=yes])
-HANDLE_X_PATH_ARG(with_xinput, --with-xinput-ext, XINPUT)
+HANDLE_X_PATH_ARG(with_randr, --with-randr-ext, RANDR)
-if test "$with_xinput" = yes; then
+if test "$with_randr" = yes; then
- # first check for Xinput.h
- AC_CHECK_X_HEADER(X11/extensions/XInput.h, [have_xinput=yes],,
+ # first check for Xrandr.h
+ AC_CHECK_X_HEADER(X11/extensions/Xrandr.h, [have_randr=yes],,
[#include <X11/Xlib.h>])
- # if that succeeded, then check for libXi
- if test "$have_xinput" = yes; then
- have_xinput=no
- AC_CHECK_X_LIB(Xi, XListInputDevices,
- [have_xinput=yes; SAVER_LIBS="$SAVER_LIBS -lXi"],
- [true], -lXext -lX11)
+ # if that succeeded, then check for the XRR code in the libraries
+ if test "$have_randr" = yes; then
+
+ # RANDR probably needs -lXrender
+ xrender_libs=
+ AC_CHECK_X_LIB(Xrender, XRenderSetSubpixelOrder,
+ [xrender_libs="-lXrender"], [true], -lXext -lX11)
+
+ # first look for RANDR in -lXext
+ have_randr=no
+ AC_CHECK_X_LIB(Xext, XRRGetScreenInfo,
+ [have_randr=yes; SAVER_LIBS="$SAVER_LIBS $xrender_libs"],
+ [true], $xrender_libs -lXext -lX11)
+
+ # if that failed, look in -lXrandr
+ if test "$have_randr" = no; then
+ AC_CHECK_X_LIB(Xrandr, XRRGetScreenInfo,
+ [have_randr=yes; SAVER_LIBS="$SAVER_LIBS -lXrandr $xrender_libs"],
+ [true], $xrender_libs -lXext -lX11)
+ fi
fi
# if that succeeded, then we've really got it.
- if test "$have_xinput" = yes; then
- AC_DEFINE(HAVE_XINPUT)
+ if test "$have_randr" = yes; then
+ AC_DEFINE(HAVE_RANDR)
+
+ # Now check for version 1.2 in the same libs.
+ # Try to compile, since on macOS 10.5.7, headers are older than libs!
+ AC_CACHE_CHECK([for XRRGetScreenResources], ac_cv_randr_12,
+ [ac_cv_randr_12=no
+ AC_TRY_X_COMPILE([#include <stdlib.h>
+ #include <X11/Xlib.h>
+ #include <X11/extensions/Xrandr.h>],
+ [XRRScreenResources *res =
+ XRRGetScreenResources (0, 0);],
+ [ac_cv_randr_12=yes],
+ [ac_cv_randr_12=no])])
+ if test "$ac_cv_randr_12" = yes ; then
+ AC_DEFINE(HAVE_RANDR_12)
+ fi
+# AC_CHECK_X_LIB(c, XRRGetOutputInfo, [AC_DEFINE(HAVE_RANDR_12)],
+# [true], $SAVER_LIBS)
fi
-elif test "$with_xinput" != no; then
- echo "error: must be yes or no: --with-xinput-ext=$with_xinput"
+
+elif test "$with_randr" != no; then
+ echo "error: must be yes or no: --with-randr-ext=$with_randr"
exit 1
fi
###############################################################################
#
-# Check for the XF86VMODE server extension (for virtual screens.)
+# Check for the XINPUT server extension.
#
###############################################################################
-have_xf86vmode=no
-with_xf86vmode_req=unspecified
-AC_ARG_WITH(xf86vmode-ext,
-[ --with-xf86vmode-ext Include support for XFree86 virtual screens.],
- [with_xf86vmode="$withval"; with_xf86vmode_req="$withval"],
- [with_xf86vmode=yes])
-
-HANDLE_X_PATH_ARG(with_xf86vmode, --with-xf86vmode-ext, xf86vmode)
+have_xinput=no
+with_xinput_req=unspecified
+xinput_halfassed=no
+AC_ARG_WITH(xinput-ext,
+[ --with-xinput-ext Include support for the XInput2 extension.],
+ [with_xinput="$withval"; with_xinput_req="$withval"], [with_xinput=yes])
-VIDMODE_LIBS=""
+HANDLE_X_PATH_ARG(with_xinput, --with-xinput-ext, XINPUT)
-if test "$with_xf86vmode" = yes; then
+if test "$with_xinput" = yes; then
- # first check for xf86vmode.h
- AC_CHECK_X_HEADER(X11/extensions/xf86vmode.h, [have_xf86vmode=yes],,
+ # first check for Xinput2.h
+ AC_CHECK_X_HEADER(X11/extensions/XInput2.h, [have_xinput=yes],,
[#include <X11/Xlib.h>])
- # if that succeeded, then check for the -lXxf86vm
- if test "$have_xf86vmode" = yes; then
- have_xf86vmode=no
- AC_CHECK_X_LIB(Xxf86vm, XF86VidModeGetViewPort,
- [have_xf86vmode=yes;
- VIDMODE_LIBS="-lXxf86vm";
- SAVER_LIBS="$SAVER_LIBS $VIDMODE_LIBS"],
+ # if that succeeded, then check for libXi
+ if test "$have_xinput" = yes; then
+ have_xinput=no
+ xinput_halfassed=yes
+ AC_CHECK_X_LIB(Xi, XISelectEvents,
+ [have_xinput=yes; xinput_halfassed=no;
+ SAVER_LIBS="$SAVER_LIBS -lXi"],
[true], -lXext -lX11)
fi
# if that succeeded, then we've really got it.
- if test "$have_xf86vmode" = yes; then
- AC_DEFINE(HAVE_XF86VMODE)
+ if test "$have_xinput" = yes; then
+ AC_DEFINE(HAVE_XINPUT)
fi
-elif test "$with_xf86vmode" != no; then
- echo "error: must be yes or no: --with-xf86vmode-ext=$with_xf86vmode"
+elif test "$with_xinput" != no; then
+ echo "error: must be yes or no: --with-xinput-ext=$with_xinput"
exit 1
fi
@@ -1819,95 +1633,319 @@ fi
###############################################################################
#
-# Check for the RANDR (Resize and Rotate) server extension.
+# Check for the XIDLE server extension.
#
-# We need this to detect when the resolution of the desktop
-# has changed out from under us (this is a newer, different
-# mechanism than the XF86VMODE virtual viewports.)
+###############################################################################
+
+have_xidle=no
+with_xidle_req=unspecified
+AC_ARG_WITH(xidle-ext,
+[ --with-xidle-ext Include support for the X11R5 XIDLE extension.],
+ [with_xidle="$withval"; with_xidle_req="$withval"],[with_xidle=yes])
+
+HANDLE_X_PATH_ARG(with_xidle, --with-xidle-ext, XIDLE)
+
+if test "$with_xidle" = yes; then
+ AC_CHECK_X_HEADER(X11/extensions/xidle.h,
+ [have_xidle=yes
+ AC_DEFINE(HAVE_XIDLE_EXTENSION)],,
+ [#include <X11/Xlib.h>])
+elif test "$with_xidle" != no; then
+ echo "error: must be yes or no: --with-xidle-ext=$with_xidle"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for the MIT-SCREEN-SAVER server extension.
#
###############################################################################
-have_randr=no
-with_randr_req=unspecified
-AC_ARG_WITH(randr-ext,
-[ --with-randr-ext Include support for the X Resize+Rotate extension.],
- [with_randr="$withval"; with_randr_req="$withval"],[with_randr=yes])
+have_mit=no
+with_mit=no
+with_mit_req=unspecified
+#AC_ARG_WITH(mit-ext,
+#[ --with-mit-ext Include support for the MIT-SCREEN-SAVER extension.],
+# [with_mit="$withval"; with_mit_req="$withval"],[with_mit=no])
+#HANDLE_X_PATH_ARG(with_mit, --with-mit-ext, MIT-SCREEN-SAVER)
-HANDLE_X_PATH_ARG(with_randr, --with-randr-ext, RANDR)
+if test "$with_mit" = yes; then
+ AC_CHECK_X_HEADER(X11/extensions/scrnsaver.h, [have_mit=yes],,
+ [#include <X11/Xlib.h>])
-if test "$with_randr" = yes; then
+ # Now check to see if it's really in the library; XF86Free-3.3 ships
+ # scrnsaver.h, but doesn't include the code in libXext.a, the idiots!
+ #
+ if test "$have_mit" = yes; then
+ AC_CHECK_X_LIB(Xext, XScreenSaverRegister, [true], [have_mit=no], -lm)
+
+ if test "$have_mit" = no; then
+ # Fuck! Looks like XF86Free-3.3 actually puts it in XExExt instead
+ # of in Xext. Thank you master, may I have another.
+ AC_CHECK_X_LIB(XExExt, XScreenSaverRegister,
+ [have_mit=yes; SAVER_LIBS="$SAVER_LIBS -lXExExt"],
+ [true], -lX11 -lXext -lm)
+ fi
- # first check for Xrandr.h
- AC_CHECK_X_HEADER(X11/extensions/Xrandr.h, [have_randr=yes],,
+ if test "$have_mit" = no; then
+ # Double fuck! Looks like some versions of XFree86 (whichever version
+ # it is that comes with RedHat Linux 2.0 -- I can't find a version
+ # number) put this garbage in Xss instead of Xext. Thank you master,
+ # may I have another.
+ AC_CHECK_X_LIB(Xss, XScreenSaverRegister,
+ [have_mit=yes; SAVER_LIBS="$SAVER_LIBS -lXss"],
+ [true], -lX11 -lXext -lm)
+ fi
+
+ if test "$have_mit" = yes; then
+# AC_DEFINE(HAVE_MIT_SAVER_EXTENSION)
+ echo "Using the MIT-SCREEN-SAVER extension will crash your server. Don't."
+ exit 1
+ fi
+
+ fi
+
+elif test "$with_mit" != no; then
+ echo "error: must be yes or no: --with-mit-ext=$with_mit"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for the SGI SCREEN_SAVER server extension.
+#
+###############################################################################
+
+have_sgi=no
+with_sgi_req=unspecified
+AC_ARG_WITH(sgi-ext,
+[ --with-sgi-ext Include support for the SGI SCREEN_SAVER extension.],
+ [with_sgi="$withval"; with_sgi_req="$withval"],[with_sgi=$ac_irix])
+
+HANDLE_X_PATH_ARG(with_sgi, --with-sgi-ext, SGI SCREEN_SAVER)
+
+if test "$with_sgi" = yes; then
+ AC_CHECK_X_HEADER(X11/extensions/XScreenSaver.h,
+ [have_sgi=yes
+ AC_DEFINE(HAVE_SGI_SAVER_EXTENSION)],,
[#include <X11/Xlib.h>])
- # if that succeeded, then check for the XRR code in the libraries
- if test "$have_randr" = yes; then
+elif test "$with_sgi" != no; then
+ echo "error: must be yes or no: --with-sgi-ext=$with_sgi"
+ exit 1
+fi
- # RANDR probably needs -lXrender
- xrender_libs=
- AC_CHECK_X_LIB(Xrender, XRenderSetSubpixelOrder,
- [xrender_libs="-lXrender"], [true], -lXext -lX11)
- # first look for RANDR in -lXext
- have_randr=no
- AC_CHECK_X_LIB(Xext, XRRGetScreenInfo,
- [have_randr=yes; SAVER_LIBS="$SAVER_LIBS $xrender_libs"],
- [true], $xrender_libs -lXext -lX11)
+###############################################################################
+#
+# Check for the SGI-VIDEO-CONTROL server extension.
+#
+###############################################################################
- # if that failed, look in -lXrandr
- if test "$have_randr" = no; then
- AC_CHECK_X_LIB(Xrandr, XRRGetScreenInfo,
- [have_randr=yes; SAVER_LIBS="$SAVER_LIBS -lXrandr $xrender_libs"],
- [true], $xrender_libs -lXext -lX11)
- fi
+have_sgivc=no
+with_sgivc_req=unspecified
+AC_ARG_WITH(sgivc-ext,
+[ --with-sgivc-ext Include support for the SGI-VIDEO-CONTROL extension.],
+ [with_sgivc="$withval"; with_sgivc_req="$withval"],[with_sgivc=$ac_irix])
+
+HANDLE_X_PATH_ARG(with_sgivc, --with-sgivc-ext, SGI-VIDEO-CONTROL)
+
+if test "$with_sgivc" = yes; then
+
+ # first check for XSGIvc.h
+ AC_CHECK_X_HEADER(X11/extensions/XSGIvc.h, [have_sgivc=yes],,
+ [#include <X11/Xlib.h>])
+
+ # if that succeeded, then check for the -lXsgivc
+ if test "$have_sgivc" = yes; then
+ have_sgivc=no
+ AC_CHECK_X_LIB(Xsgivc, XSGIvcQueryGammaMap,
+ [have_sgivc=yes; SAVER_LIBS="$SAVER_LIBS -lXsgivc"], [true],
+ -lXext -lX11)
fi
# if that succeeded, then we've really got it.
- if test "$have_randr" = yes; then
- AC_DEFINE(HAVE_RANDR)
+ if test "$have_sgivc" = yes; then
+ AC_DEFINE(HAVE_SGI_VC_EXTENSION)
+ fi
- # Now check for version 1.2 in the same libs.
- # Try to compile, since on MacOS 10.5.7, headers are older than libs!
- AC_CACHE_CHECK([for XRRGetScreenResources], ac_cv_randr_12,
- [ac_cv_randr_12=no
- AC_TRY_X_COMPILE([#include <stdlib.h>
- #include <X11/Xlib.h>
- #include <X11/extensions/Xrandr.h>],
- [XRRScreenResources *res =
- XRRGetScreenResources (0, 0);],
- [ac_cv_randr_12=yes],
- [ac_cv_randr_12=no])])
- if test "$ac_cv_randr_12" = yes ; then
- AC_DEFINE(HAVE_RANDR_12)
- fi
-# AC_CHECK_X_LIB(c, XRRGetOutputInfo, [AC_DEFINE(HAVE_RANDR_12)],
-# [true], $SAVER_LIBS)
+elif test "$with_sgivc" != no; then
+ echo "error: must be yes or no: --with-sgivc-ext=$with_sgivc"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for the SGI XReadDisplay server extension.
+#
+###############################################################################
+
+have_readdisplay=no
+with_readdisplay_req=unspecified
+AC_ARG_WITH(readdisplay,
+[ --with-readdisplay Include support for the SGI XReadDisplay extension.],
+ [with_readdisplay="$withval"; with_readdisplay_req="$withval"],
+ [with_readdisplay=$ac_irix])
+
+HANDLE_X_PATH_ARG(with_readdisplay, --with-readdisplay, XReadDisplay)
+
+if test "$with_readdisplay" = yes; then
+ AC_CHECK_X_HEADER(X11/extensions/readdisplay.h,
+ AC_DEFINE(HAVE_READ_DISPLAY_EXTENSION),,
+ [#include <X11/Xlib.h>])
+elif test "$with_readdisplay" != no; then
+ echo "error: must be yes or no: --with-readdisplay=$with_readdisplay"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for the XSHM server extension.
+#
+###############################################################################
+
+have_xshm=no
+with_xshm_req=unspecified
+AC_ARG_WITH(xshm-ext,
+[ --with-xshm-ext Include support for the Shared Memory extension.],
+ [with_xshm="$withval"; with_xshm_req="$withval"],[with_xshm=yes])
+
+HANDLE_X_PATH_ARG(with_xshm, --with-xshm-ext, XSHM)
+
+if test "$with_xshm" = yes; then
+
+ # first check for Xshm.h.
+ AC_CHECK_X_HEADER(X11/extensions/XShm.h, [have_xshm=yes],,
+ [#include <X11/Xlib.h>])
+
+ # if that succeeded, then check for sys/ipc.h.
+ if test "$have_xshm" = yes; then
+ have_xshm=no
+ AC_CHECK_X_HEADER(sys/ipc.h, [have_xshm=yes])
fi
+ # if that succeeded, then check for sys/shm.h.
+ if test "$have_xshm" = yes; then
+ have_xshm=no
+ AC_CHECK_X_HEADER(sys/shm.h, [have_xshm=yes])
+ fi
-elif test "$with_randr" != no; then
- echo "error: must be yes or no: --with-randr-ext=$with_randr"
+ # AIX is pathological, as usual: apparently it's normal for the Xshm headers
+ # to exist, but the library code to not exist. And even better, the library
+ # code is in its own library: libXextSam.a. So, if we're on AIX, and that
+ # lib doesn't exist, give up. (This lib gets added to X_EXTRA_LIBS, and
+ # that's not quite right, but close enough.)
+ #
+ case "$host" in
+ *-aix*)
+ if [ `uname -v` -eq 3 ]; then
+ have_xshm=no
+ AC_CHECK_X_LIB(XextSam, XShmQueryExtension,
+ [have_xshm=yes; X_EXTRA_LIBS="$X_EXTRA_LIBS -lXextSam"],
+ [true], -lX11 -lXext -lm)
+ fi
+ ;;
+ esac
+
+ # if that succeeded, then we've really got it.
+ if test "$have_xshm" = yes; then
+ AC_DEFINE(HAVE_XSHM_EXTENSION)
+ fi
+
+elif test "$with_xshm" != no; then
+ echo "error: must be yes or no: --with-xshm-ext=$with_xshm"
exit 1
fi
###############################################################################
#
-# Check for XF86MiscSetGrabKeysState (but only bother if we are already
-# using other XF86 stuff.)
+# Check for the DOUBLE-BUFFER server extension.
#
###############################################################################
-have_xf86miscsetgrabkeysstate=no
-if test "$have_xf86gamma" = yes -o "$have_xf86vmode" = yes; then
- AC_CHECK_X_LIB(Xxf86misc, XF86MiscSetGrabKeysState,
- [have_xf86miscsetgrabkeysstate=yes],
- [true], -lXext -lX11)
- if test "$have_xf86miscsetgrabkeysstate" = yes ; then
- SAVER_LIBS="$SAVER_LIBS -lXxf86misc"
- AC_DEFINE(HAVE_XF86MISCSETGRABKEYSSTATE)
+have_xdbe=no
+with_xdbe_req=unspecified
+AC_ARG_WITH(xdbe-ext,
+[ --with-xdbe-ext Include support for the DOUBLE-BUFFER extension.],
+ [with_xdbe="$withval"; with_xdbe_req="$withval"],[with_xdbe=yes])
+
+HANDLE_X_PATH_ARG(with_xdbe, --with-xdbe-ext, DOUBLE-BUFFER)
+
+if test "$with_xdbe" = yes; then
+
+ AC_CHECK_X_HEADER(X11/extensions/Xdbe.h, [have_xdbe=yes],,
+ [#include <X11/Xlib.h>])
+ if test "$have_xdbe" = yes; then
+ AC_DEFINE(HAVE_DOUBLE_BUFFER_EXTENSION)
fi
+
+elif test "$with_xdbe" != no; then
+ echo "error: must be yes or no: --with-xdbe-ext=$with_xshm"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for the COMPOSITE server extension.
+#
+###############################################################################
+
+#have_xcomposite=no
+#with_xcomposite_req=unspecified
+#AC_ARG_WITH(xcomposite-ext,
+#[ --with-xcomposite-ext Include support for the XCOMPOSITE extension.],
+# [with_xcomposite="$withval"; with_xcomposite_req="$withval"],
+# [with_xcomposite=yes])
+#
+#HANDLE_X_PATH_ARG(with_xcomposite, --with-xcomposite-ext, XCOMPOSITE)
+#
+#if test "$with_xcomposite" = yes; then
+#
+# AC_CHECK_X_HEADER(X11/extensions/Xcomposite.h, [have_xcomposite=yes],,
+# [#include <X11/Xlib.h>])
+# if test "$have_xcomposite" = yes; then
+# AC_DEFINE(HAVE_XCOMPOSITE_EXTENSION)
+# SAVER_LIBS="-lXcomposite $SAVER_LIBS"
+# fi
+#
+#elif test "$with_xcomposite" != no; then
+# echo "error: must be yes or no: --with-xcomposite-ext=$with_xshm"
+# exit 1
+#fi
+
+
+###############################################################################
+#
+# Check for the XKB server extension.
+#
+###############################################################################
+
+have_xkb=no
+with_xkb_req=unspecified
+AC_ARG_WITH(xkb-ext,
+[ --with-xkb-ext Include support for the X Keyboard extension.],
+ [with_xkb="$withval"; with_xkb_req="$withval"],
+ [with_xkb=yes])
+
+HANDLE_X_PATH_ARG(with_xkb, --with-xkb-ext, XKB)
+
+if test "$with_xkb" = yes; then
+
+ AC_CHECK_X_HEADER(X11/XKBlib.h, [have_xkb=yes],,
+ [#include <X11/Xlib.h>])
+ if test "$have_xkb" = yes; then
+ AC_DEFINE(HAVE_XKB)
+ fi
+
+elif test "$with_xkb" != no; then
+ echo "error: must be yes or no: --with-xkb-ext=$with_xshm"
+ exit 1
fi
@@ -1934,10 +1972,10 @@ AC_EGREP_X_HEADER(XHPDisableReset, X11/XHPlib.h,
have_proc_interrupts=no
with_proc_interrupts_req=unspecified
AC_ARG_WITH(proc-interrupts,
-[ --with-proc-interrupts Include support for consulting the /proc/interrupts
- file to notice keyboard activity.],
+[ --with-proc-interrupts Include support for consulting /proc/interrupts to
+ notice activity on PS/2 keyboards and mice.],
[with_proc_interrupts="$withval"; with_proc_interrupts_req="$withval"],
- [with_proc_interrupts=yes])
+ [with_proc_interrupts=no])
if test "$with_proc_interrupts" = yes; then
@@ -1974,10 +2012,11 @@ fi
#
###############################################################################
+setuid_auth=no
have_proc_oom=no
with_proc_oom_req=unspecified
AC_ARG_WITH(proc-oom,
-[ --with-proc-oom Include support for disabling the OOM-killer.],
+[ --with-proc-oom Include support to duck the out-of-memory killer.],
[with_proc_oom="$withval"; with_proc_oom_req="$withval"],
[with_proc_oom=yes])
@@ -2003,6 +2042,9 @@ elif test "$with_proc_oom_req" = unspecified; then
if test "$have_proc_oom" = yes; then
AC_DEFINE(HAVE_PROC_OOM)
+ # Only root can write to /proc/$$/oom_score_adj, even though it's us.
+ AC_MSG_RESULT(enabling setuid to opt out of OOM-killer.)
+ setuid_auth=yes
fi
elif test "$with_proc_oom" != no; then
@@ -2013,18 +2055,107 @@ fi
###############################################################################
#
+# Check for -lsystemd
+#
+###############################################################################
+
+have_systemd=no
+with_systemd_req=unspecified
+systemd_halfassed=no
+systemd_too_old=no
+AC_ARG_WITH(systemd,
+[ --with-systemd Support systemd requests to lock on suspend, and to
+ allow video players to inhibit the screen saver.],
+ [with_systemd="$withval"; with_systemd_req="$withval"],
+ [with_systemd=yes])
+
+HANDLE_X_PATH_ARG(with_systemd, --with-systemd, systemd)
+
+if test "$with_systemd" != yes -a "$with_systemd" != no ; then
+ echo "error: must be yes or no: --with-systemd=$with_systemd"
+ exit 1
+fi
+
+if test "$with_systemd" = yes; then
+
+ pkgs=''
+ ok="yes"
+ pkg_check_version libsystemd 221
+ have_systemd="$ok"
+
+ if test "$have_systemd" = no; then
+ if $pkg_config --exists libsystemd ; then
+ systemd_too_old=yes
+ fi
+ fi
+
+ if test "$have_systemd" = yes; then
+ AC_CACHE_CHECK([for libsystemd includes], ac_cv_systemd_config_cflags,
+ [ac_cv_systemd_config_cflags=`$pkg_config --cflags $pkgs`])
+ AC_CACHE_CHECK([for libsystemd libs], ac_cv_systemd_config_libs,
+ [ac_cv_systemd_config_libs=`$pkg_config --libs $pkgs`])
+ fi
+
+ ac_systemd_config_cflags=$ac_cv_systemd_config_cflags
+ ac_systemd_config_libs=$ac_cv_systemd_config_libs
+
+ if test "$have_systemd" = yes; then
+ #
+ # we appear to have libsystemd; check for headers/libs to be sure.
+ #
+ ac_save_systemd_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $ac_systemd_config_cflags"
+
+ have_systemd=no
+ AC_CHECK_X_HEADER(systemd/sd-bus.h, [have_systemd=yes])
+
+ CPPFLAGS="$ac_save_systemd_CPPFLAGS"
+ fi
+
+ if test "$have_systemd" = yes; then
+ # we have the headers, now check for the libraries
+ have_systemd=no
+ systemd_halfassed=yes
+ AC_MSG_RESULT(checking for libsystemd usability...)
+ AC_CHECK_X_LIB(c, sd_bus_open_system,
+ [have_systemd=yes; systemd_halfassed=no],,
+ $ac_systemd_config_libs -lX11 -lXext -lm)
+ fi
+
+ if test "$have_systemd" = no; then
+ AC_MSG_RESULT(checking for libsystemd usability... no)
+ fi
+fi
+
+if test "$have_systemd" = yes; then
+ INCLUDES="$INCLUDES $ac_systemd_config_cflags"
+ EXES_SYSTEMD='$(EXES_SYSTEMD)'
+ SYSTEMD_LIBS="$ac_systemd_config_libs"
+ AC_DEFINE(HAVE_LIBSYSTEMD)
+else
+ EXES_SYSTEMD=''
+ SYSTEMD_LIBS=''
+fi
+
+
+###############################################################################
+#
# The --enable-locking option
#
+# Note: "configure --help" list all "--enable" options before any
+# "--with" options, so we document the --enable options inline with
+# the --with options where it looks better, instead of in AC_ARG_ENABLE
+# where it would make sense, sigh...
+#
###############################################################################
-AC_ARG_ENABLE(locking,[Screen locking options:
- --enable-locking Compile in support for locking the display.
- --disable-locking Do not allow locking at all.],
+AC_ARG_ENABLE(locking,
+[], # This is documented elsewhere because of --enable/--with option sorting.
[enable_locking="$enableval"],
[if test "$ac_macosx" = yes; then
- # We can't lock on MacOS X, so default to not compiling in support for it.
+ # We can't lock on macOS, so default to not compiling in support for it.
# But allow --enable-locking to override that, so I can debug Linux locking
- # under MacOS X11.
+ # under macOS X11.
enable_locking=no
else
enable_locking=yes
@@ -2039,15 +2170,15 @@ else
fi
-###############################################################################
+##############################################################################
#
# Whether to allow root password to unblank.
#
###############################################################################
-AC_ARG_ENABLE(root-passwd, [
- --enable-root-passwd Allow root passwd to unlock screen.
- --disable-root-passwd Do not allow that.],
- [enable_root_passwd="$enableval"],[enable_root_passwd=yes])
+
+AC_ARG_ENABLE(root-passwd,
+[], # This is documented elsewhere because of --enable/--with option sorting.
+ [enable_root_passwd="$enableval"],[enable_root_passwd=no])
if test "$enable_root_passwd" = yes; then
AC_DEFINE(ALLOW_ROOT_PASSWD)
true
@@ -2056,6 +2187,7 @@ elif test "$enable_root_passwd" != no; then
exit 1
fi
+
###############################################################################
#
# Check for PAM.
@@ -2064,8 +2196,12 @@ fi
case "$host" in
*-solaris*)
- # Solaris systems tend to come with PAM misconfigured.
- # Don't build it by default, even if the headers exist.
+ # Solaris systems tend to have the PAM runtime misconfigured and unusable.
+ with_pam_default=no
+ ;;
+ *-freebsd* )
+ # FreeBSD's PAM implementation requires the calling process to be setuid
+ # the whole time, which is unacceptable.
with_pam_default=no
;;
*)
@@ -2074,24 +2210,28 @@ case "$host" in
;;
esac
+#### H1
+
have_pam=no
with_pam_req=unspecified
-AC_ARG_WITH(pam,
-[ --with-pam Include support for PAM (Pluggable Auth Modules.)],
+AC_ARG_WITH(pam,[
+Screen Locking Options:
+
+ --disable-locking Do not allow locking of the display at all.
+ --with-pam Include support for PAM (Pluggable Auth Modules).],
[with_pam="$withval"; with_pam_req="$withval"],[with_pam=$with_pam_default])
AC_ARG_WITH([pam_service_name],
- AC_HELP_STRING([--with-pam-service-name],
- [NAME arg is the name of the PAM service that
- xscreensaver will authenticate as.]),
- [pam_service_name="$withval"],[pam_service_name="xscreensaver"])
+[ --with-pam-service-name Set the name of the xscreensaver PAM service.
+ --enable-pam-account Whether PAM should check the result of account
+ modules when authenticating. Only do this if you
+ have "account" modules configured on your system.
+ --enable-root-passwd Allow the root passwd to unlock, if not using PAM.],
+ [pam_service_name="$withval"],[pam_service_name="xscreensaver"])
AC_ARG_ENABLE(pam-check-account-type,
- [AC_HELP_STRING([--enable-pam-check-account-type],
- [Whether PAM should check the result of account
- modules when authenticating. Only do this if you
- have account configured properly on your system.])],
+[], # This is documented elsewhere because of --enable/--with option sorting.
[enable_pam_check_account_type="$enableval"],[enable_pam_check_account_type=no])
if test "$enable_pam_check_account_type" = yes ; then
AC_DEFINE(PAM_CHECK_ACCOUNT_TYPE)
@@ -2161,12 +2301,13 @@ if test "$enable_locking" = yes -a "$with_pam" = yes; then
AC_CACHE_VAL(ac_cv_pam_fail_delay,
[ac_save_LDFLAGS="$LDFLAGS"
LDFLAGS="-lpam"
- AC_TRY_LINK([#include <security/pam_appl.h>],
- [pam_handle_t *pamh = 0;
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([#include <security/pam_appl.h>],
+ [pam_handle_t *pamh = 0;
unsigned int usec = 1;
- int status = pam_fail_delay (pamh, usec);],
- [ac_pam_fail_delay=yes],
- [ac_pam_fail_delay=no])
+ int status = pam_fail_delay (pamh, usec);])],
+ [ac_pam_fail_delay=yes],
+ [ac_pam_fail_delay=no])
ac_cv_pam_fail_delay=$ac_pam_fail_delay,
LDFLAGS=$ac_save_LDFLAGS])
@@ -2244,7 +2385,7 @@ if test "$enable_locking" = yes -a "$with_kerberos" = yes; then
PASSWD_LIBS="$PASSWD_LIBS -lkrb4 -ldes425 -lkrb5 -lk5crypto -lcom_err"
- # jwz: MacOS X uses -lkrb5, but not -lcrypt
+ # jwz: macOS uses -lkrb5, but not -lcrypt
AC_CHECK_X_LIB(crypt, crypt, [PASSWD_LIBS="$PASSWD_LIBS -lcrypt"])
elif test "$have_kerberos" = yes ; then
@@ -2267,8 +2408,6 @@ fi
#
###############################################################################
-need_setuid=no
-
have_shadow=no
with_shadow_req=unspecified
@@ -2305,7 +2444,7 @@ if test "$with_shadow" = yes ; then
if test "$ac_cv_sun_adjunct" = yes; then
have_shadow_adjunct=yes
have_shadow=yes
- need_setuid=yes
+ setuid_auth=yes
fi
fi
@@ -2335,7 +2474,7 @@ if test "$with_shadow" = yes ; then
if test $ac_cv_enhanced_passwd = yes; then
have_shadow_enhanced=yes
have_shadow=yes
- need_setuid=yes
+ setuid_auth=yes
# On SCO, getprpwnam() is in -lprot (which uses nap() from -lx)
# (I'm told it needs -lcurses too, but I don't understand why.)
@@ -2370,7 +2509,7 @@ if test "$with_shadow" = yes ; then
if test "$ac_cv_hpux_passwd" = yes; then
have_shadow_hpux=yes
have_shadow=yes
- need_setuid=yes
+ setuid_auth=yes
# on HPUX, bigcrypt is in -lsec
AC_CHECK_LIB(sec, bigcrypt, [PASSWD_LIBS="$PASSWD_LIBS -lsec"])
@@ -2398,7 +2537,35 @@ if test "$with_shadow" = yes ; then
ac_cv_master_passwd=no
fi])
if test "$ac_cv_master_passwd" = yes; then
- need_setuid=yes
+ setuid_auth=yes
+ fi
+fi
+
+
+###############################################################################
+#
+# Check for OpenBSD-style shadow passwords.
+# It's getpwnam_shadow instead of getpwnam, and it only works as root.
+#
+###############################################################################
+
+if test "$with_shadow" = yes ; then
+ AC_CACHE_CHECK([for OpenBSD-style shadow passwords], ac_cv_pwnam_shadow,
+ [AC_TRY_X_COMPILE([#include <stdlib.h>
+ #include <unistd.h>
+ #include <sys/types.h>
+ #include <pwd.h>],
+ [struct spwd *p = getspnam_shadow("nobody");
+ const char *pw = p->pw_passwd;],
+ [ac_cv_pwnam_shadow=yes],
+ [ac_cv_pwnam_shadow=no])])
+ if test "$ac_cv_pwnam_shadow" = yes; then
+ have_pwnam_shadow=yes
+
+ # If we also have PAM, assume that we don't need to be setuid.
+ if test $have_pam != yes; then
+ setuid_auth=yes
+ fi
fi
fi
@@ -2422,7 +2589,11 @@ if test "$with_shadow" = yes ; then
[ac_cv_shadow=no])])
if test "$ac_cv_shadow" = yes; then
have_shadow=yes
- need_setuid=yes
+
+ # If we also have PAM, assume that we don't need to be setuid.
+ if test $have_pam != yes; then
+ setuid_auth=yes
+ fi
# On some systems (UnixWare 2.1), getspnam() is in -lgen instead of -lc.
have_getspnam=no
@@ -2453,177 +2624,70 @@ if test "$enable_locking" = yes ; then
fi
-# Most of the above shadow mechanisms will have set need_setuid to yes,
-# if they were found. But, on some systems, we need setuid even when
-# using plain old vanilla passwords.
-#
-if test "$enable_locking" = yes ; then
- case "$host" in
- *-hpux* | *-aix* | *-netbsd* | *-freebsd* | *-openbsd* )
- need_setuid=yes
- ;;
- esac
-fi
-
-
-if test "$have_shadow_adjunct" = yes ; then
- AC_DEFINE(HAVE_ADJUNCT_PASSWD)
-elif test "$have_shadow_enhanced" = yes ; then
- AC_DEFINE(HAVE_ENHANCED_PASSWD)
-elif test "$have_shadow_hpux" = yes ; then
- AC_DEFINE(HAVE_HPUX_PASSWD)
-elif test "$have_shadow" = yes ; then
- AC_DEFINE(HAVE_SHADOW_PASSWD)
-fi
-
-
###############################################################################
#
+# Strongly suspect that this hasn't been used in years. Also, the same
+# goal is achieved by xscreensaver-auth in XScreenSaver 6. -- jwz, 2021
+#
# Check for external password helper
-# On SuSE, instead of having xscreensaver be a setuid program, they
-# fork an external program that takes the password on stdin, and
-# returns true if that password is a valid one. Then only that
-# smaller program needs to be setuid.
+# On SuSE in 1993, instead of having xscreensaver be a setuid program,
+# they fork an external program that takes the password on stdin, and
+# returns true if that password is a valid one. Then only that smaller
+# program needs to be setuid.
#
# (Note that this external program is not a GUI: the GUI is still
# all in xscreensaver itself; the external program just does auth.)
#
###############################################################################
-have_passwd_helper=no
-with_passwd_helper_req=unspecified
-
-AC_ARG_WITH(passwd-helper,
-[ --with-passwd-helper Include support for an external password
- verification helper program.],
- [with_passwd_helper="$withval"; with_passwd_helper_req="$withval"],[with_passwd_helper=no])
-# no HANDLE_X_PATH_ARG for this one
-
-if test "$enable_locking" = no ; then
- with_passwd_helper_req=no
- with_passwd_helper=no
-fi
-
-case "$with_passwd_helper" in
- ""|no) : ;;
- /*)
- AC_DEFINE_UNQUOTED(PASSWD_HELPER_PROGRAM, "$with_passwd_helper")
- have_passwd_helper=yes;;
- *)
- echo "error: --with-passwd-helper needs full pathname of helper (not '$with_passwd_helper')." >&2
- exit 1
-esac
-
-
-###############################################################################
+#have_passwd_helper=no
+#with_passwd_helper_req=unspecified
#
-# Check for a login manager for a "New Login" button on the lock dialog.
-# Usually this will be "/usr/bin/gdmflexiserver".
+#AC_ARG_WITH(passwd-helper,
+#[ --with-passwd-helper Include support for external password verification.],
+# [with_passwd_helper="$withval"; with_passwd_helper_req="$withval"],[with_passwd_helper=no])
+## no HANDLE_X_PATH_ARG for this one
#
-###############################################################################
+#if test "$enable_locking" = no ; then
+# with_passwd_helper_req=no
+# with_passwd_helper=no
+#fi
+#
+#case "$with_passwd_helper" in
+# ""|no) : ;;
+# /*)
+# AC_DEFINE_UNQUOTED(PASSWD_HELPER_PROGRAM, "$with_passwd_helper")
+# have_passwd_helper=yes;;
+# *)
+# echo "error: --with-passwd-helper needs full pathname of helper (not '$with_passwd_helper')." >&2
+# exit 1
+#esac
-with_login_manager_req=unspecified
-default_login_manager_1='gdmflexiserver -ls'
-default_login_manager_2='kdmctl reserve'
-default_login_manager_3='lxdm -c USER_SWITCH'
-default_login_manager_4='dm-tool switch-to-greeter'
-AC_ARG_WITH(login-manager,
-[ --with-login-manager Put a "New Login" button on the unlock dialog that
- runs a login manager like gdmflexiserver or kdmctl.],
- [with_login_manager="$withval"; with_login_manager_req="$withval"],
- [with_login_manager=yes])
-# no HANDLE_X_PATH_ARG for this one
-if test "$enable_locking" = no ; then
- with_login_manager_req=no
- with_login_manager=no
+# Most of the above shadow mechanisms will have set setuid_auth to yes,
+# if they were found. But, on some systems, we need setuid even when
+# using plain old vanilla passwords.
+#
+if test "$enable_locking" = yes -a "$have_pam" = no ; then
+ case "$host" in
+ *-hpux* | *-aix* | *-netbsd* | *-freebsd* )
+ setuid_auth=yes
+ ;;
+ esac
fi
-case "$with_login_manager_req" in
- no)
- with_login_manager=""
- ;;
-
- yes|unspecified)
- # Try various defaults, use the first one that exists.
-
- with_login_manager=""
-
- if test -z "$with_login_manager" ; then
- set dummy $default_login_manager_1 ; login_manager_tmp=$2
- unset ac_cv_path_login_manager_tmp # don't cache
- AC_PATH_PROG(login_manager_tmp, $login_manager_tmp, [])
- if test ! -z "$login_manager_tmp" ; then
- with_login_manager="$default_login_manager_1"
- fi
- fi
-
- if test -z "$with_login_manager" ; then
- set dummy $default_login_manager_2 ; login_manager_tmp=$2
- unset ac_cv_path_login_manager_tmp # don't cache
- AC_PATH_PROG(login_manager_tmp, $login_manager_tmp, [])
- if test ! -z "$login_manager_tmp" ; then
- with_login_manager="$default_login_manager_2"
- fi
- fi
-
- if test -z "$with_login_manager" ; then
- set dummy $default_login_manager_3 ; login_manager_tmp=$2
- unset ac_cv_path_login_manager_tmp # don't cache
- AC_PATH_PROG(login_manager_tmp, $login_manager_tmp, [])
- if test ! -z "$login_manager_tmp" ; then
- with_login_manager="$default_login_manager_3"
- fi
- fi
-
- if test -z "$with_login_manager" ; then
- set dummy $default_login_manager_4 ; login_manager_tmp=$2
- unset ac_cv_path_login_manager_tmp # don't cache
- AC_PATH_PROG(login_manager_tmp, $login_manager_tmp, [])
- if test ! -z "$login_manager_tmp" ; then
- with_login_manager="$default_login_manager_4"
- fi
- fi
- ;;
-
- /*)
- # absolute path specified on cmd line
- set dummy $with_login_manager_req ; login_manager_tmp=$2
- AC_MSG_CHECKING([for $login_manager_tmp])
- if test -x "$login_manager_tmp" ; then
- AC_MSG_RESULT(yes)
- else
- AC_MSG_RESULT(no)
- with_login_manager=""
- fi
- ;;
-
- *)
- # relative path specified on cmd line
- set dummy $with_login_manager_req ; login_manager_tmp=$2
- unset ac_cv_path_login_manager_tmp # don't cache
- AC_PATH_PROG(login_manager_tmp, $login_manager_tmp, [])
- if test -z "$login_manager_tmp" ; then
- with_login_manager=""
- else
- with_login_manager="$login_manager_tmp"
- fi
- ;;
-esac
-ac_cv_login_manager_program="$with_login_manager"
-
-NEW_LOGIN_COMMAND_P=''
-NEW_LOGIN_COMMAND="$ac_cv_login_manager_program"
-
-AC_MSG_CHECKING(for login manager)
-if test -z "$NEW_LOGIN_COMMAND" ; then
- NEW_LOGIN_COMMAND="$default_login_manager_1"
- NEW_LOGIN_COMMAND_P='! '
- AC_MSG_RESULT($NEW_LOGIN_COMMAND (disabled))
-else
- AC_MSG_RESULT($NEW_LOGIN_COMMAND)
+if test "$have_shadow_adjunct" = yes ; then
+ AC_DEFINE(HAVE_ADJUNCT_PASSWD)
+elif test "$have_shadow_enhanced" = yes ; then
+ AC_DEFINE(HAVE_ENHANCED_PASSWD)
+elif test "$have_shadow_hpux" = yes ; then
+ AC_DEFINE(HAVE_HPUX_PASSWD)
+elif test "$have_shadow" = yes ; then
+ AC_DEFINE(HAVE_SHADOW_PASSWD)
+elif test "$have_pwnam_shadow" = yes ; then
+ AC_DEFINE(HAVE_PWNAM_SHADOW_PASSWD)
fi
@@ -2633,10 +2697,13 @@ fi
#
###############################################################################
+#### H1
+
have_gtk=no
with_gtk_req=unspecified
-AC_ARG_WITH(gtk,[
-User interface options:
+AC_ARG_WITH(gtk,
+[
+User Interface Options:
--with-gtk Use the Gtk toolkit for the user interface.],
[with_gtk="$withval"; with_gtk_req="$withval"],[with_gtk=yes])
@@ -2660,96 +2727,27 @@ if test "$with_gtk" != yes -a "$with_gtk" != no ; then
fi
-parse_gtk_version_string() {
- # M4 sucks!!
- changequote(X,Y)
- maj=`echo $ac_gtk_version_string | sed -n 's/\..*//p'`
- min=`echo $ac_gtk_version_string | sed -n 's/[^.]*\.\([^.]*\).*/\1/p'`
- changequote([,])
- ac_gtk_version=`echo "$maj * 1000 + $min" | bc`
- if test -z "$ac_gtk_version"; then
- ac_gtk_version=unknown
- ac_gtk_version_string=unknown
- fi
-}
-
-# Find pkg-config... (need this for both gtk and gdk_pixbuf.)
-# if the user specified --with-gtk=/foo/ then look there.
-#
-gtk_path="$PATH"
-if test ! -z "$gtk_dir"; then
- # canonicalize slashes.
- foo=`echo "${gtk_dir}/bin" | sed 's@//*@/@g'`
- gtk_path="$foo:$gtk_path"
-fi
-
-AC_PATH_PROGS(pkg_config, pkg-config,, $gtk_path)
-
-if test -z "$pkg_config" ; then
- AC_MSG_WARN([pkg-config not found!])
- pkg_config="false"
-fi
-
-
-# Utility function for running pkg-config-based tests...
-#
-pkgs=''
-pkg_check_version() {
- if test "$ok" = yes ; then
- req="$1"
- min="$2"
- AC_MSG_CHECKING(for $req)
- if $pkg_config --exists "$req" ; then
- vers=`$pkg_config --modversion "$req"`
- if $pkg_config --exists "$req >= $min" ; then
- AC_MSG_RESULT($vers)
- pkgs="$pkgs $req"
- return 1
- else
- AC_MSG_RESULT($vers (wanted >= $min))
- ok=no
- return 0
- fi
- else
- AC_MSG_RESULT(no)
- ok=no
- return 0
- fi
- fi
-}
-
-
-jurassic_gtk=no
gtk_halfassed=no
-have_gtk_2_22_or_higher=no
-COMMENT_DEMO_GLADE2_GTK_2_22_HEAD=""
-COMMENT_DEMO_GLADE2_GTK_2_22_TAIL=""
if test "$with_gtk" = yes; then
have_gtk=no
ok="yes"
- pkg_check_version gtk+-2.0 2.0.1 ; ac_gtk_version_string="$vers"
+ pkg_check_version gtk+-2.0 2.22.0 ; ac_gtk_version_string="$vers"
pkg_check_version gmodule-2.0 2.0.0
pkg_check_version libxml-2.0 2.4.6
- pkg_check_version libglade-2.0 1.99.0
pkg_check_version gdk-pixbuf-2.0 2.0.0
pkg_check_version gdk-pixbuf-xlib-2.0 2.0.0
have_gtk="$ok"
if test "$have_gtk" = no; then
if test -n "$ac_gtk_version_string" ; then
- gtk_halfassed="$ac_gtk_version_string"
+ gtk_halfassed=yes
gtk_halfassed_lib="$req"
fi
fi
if test "$have_gtk" = yes; then
- parse_gtk_version_string
- jurassic_gtk=no
- fi
-
- if test "$have_gtk" = yes; then
AC_CACHE_CHECK([for Gtk includes], ac_cv_gtk_config_cflags,
[ac_cv_gtk_config_cflags=`$pkg_config --cflags $pkgs`])
AC_CACHE_CHECK([for Gtk libs], ac_cv_gtk_config_libs,
@@ -2759,7 +2757,6 @@ if test "$with_gtk" = yes; then
ac_gtk_config_cflags=$ac_cv_gtk_config_cflags
ac_gtk_config_libs=$ac_cv_gtk_config_libs
- GTK_EXTRA_OBJS=""
GTK_DATADIR=""
if test "$have_gtk" = yes; then
GTK_DATADIR=`$pkg_config --variable=prefix gtk+-2.0`
@@ -2773,16 +2770,6 @@ if test "$with_gtk" = yes; then
AC_DEFINE(HAVE_GTK2)
AC_DEFINE(HAVE_XML)
fi
-
- if test "$have_gtk" = yes; then
- ok="yes"
- pkg_check_version gtk+-2.0 2.22
- have_gtk_2_22_or_higher="$ok"
- if test "$have_gtk_2_22_or_higher" = yes; then
- COMMENT_DEMO_GLADE2_GTK_2_22_HEAD="<!-- comment>"
- COMMENT_DEMO_GLADE2_GTK_2_22_TAIL="</comment -->"
- fi
- fi
fi
@@ -2803,8 +2790,8 @@ fi
have_motif=no
with_motif_req=unspecified
-AC_ARG_WITH(motif,[ --with-motif Use the Motif toolkit for the user interface
- (no longer supported.)],
+AC_ARG_WITH(motif,
+[ --with-motif Use the Motif toolkit for the user interface.],
[with_motif="$withval"; with_motif_req="$withval"],[with_motif=no])
HANDLE_X_PATH_ARG(with_motif, --with-motif, Motif)
@@ -2950,228 +2937,609 @@ fi
###############################################################################
#
+# Check for a login manager for a "New Login" button on the lock dialog.
+# Usually this will be "/usr/bin/gdmflexiserver".
+#
+###############################################################################
+
+with_login_manager_req=unspecified
+default_login_manager_1='gdmflexiserver -ls'
+default_login_manager_2='kdmctl reserve'
+default_login_manager_3='lxdm -c USER_SWITCH'
+default_login_manager_4='dm-tool switch-to-greeter'
+
+AC_ARG_WITH(login-manager,
+[ --with-login-manager Put a "New Login" button on the unlock dialog that
+ runs a login manager like gdmflexiserver or kdmctl.],
+ [with_login_manager="$withval"; with_login_manager_req="$withval"],
+ [with_login_manager=yes])
+# no HANDLE_X_PATH_ARG for this one
+
+if test "$enable_locking" = no ; then
+ with_login_manager_req=no
+ with_login_manager=no
+fi
+
+case "$with_login_manager_req" in
+ no)
+ with_login_manager=""
+ ;;
+
+ yes|unspecified)
+ # Try various defaults, use the first one that exists.
+
+ with_login_manager=""
+
+ if test -z "$with_login_manager" ; then
+ set dummy $default_login_manager_1 ; login_manager_tmp=$2
+ unset ac_cv_path_login_manager_tmp # don't cache
+ AC_PATH_PROG(login_manager_tmp, $login_manager_tmp, [])
+ if test ! -z "$login_manager_tmp" ; then
+ with_login_manager="$default_login_manager_1"
+ fi
+ fi
+
+ if test -z "$with_login_manager" ; then
+ set dummy $default_login_manager_2 ; login_manager_tmp=$2
+ unset ac_cv_path_login_manager_tmp # don't cache
+ AC_PATH_PROG(login_manager_tmp, $login_manager_tmp, [])
+ if test ! -z "$login_manager_tmp" ; then
+ with_login_manager="$default_login_manager_2"
+ fi
+ fi
+
+ if test -z "$with_login_manager" ; then
+ set dummy $default_login_manager_3 ; login_manager_tmp=$2
+ unset ac_cv_path_login_manager_tmp # don't cache
+ AC_PATH_PROG(login_manager_tmp, $login_manager_tmp, [])
+ if test ! -z "$login_manager_tmp" ; then
+ with_login_manager="$default_login_manager_3"
+ fi
+ fi
+
+ if test -z "$with_login_manager" ; then
+ set dummy $default_login_manager_4 ; login_manager_tmp=$2
+ unset ac_cv_path_login_manager_tmp # don't cache
+ AC_PATH_PROG(login_manager_tmp, $login_manager_tmp, [])
+ if test ! -z "$login_manager_tmp" ; then
+ with_login_manager="$default_login_manager_4"
+ fi
+ fi
+
+ ;;
+
+ *)
+ # Just believe whatever command was specified.
+ with_login_manager="$with_login_manager_req"
+ ;;
+esac
+ac_cv_login_manager_program="$with_login_manager"
+
+NEW_LOGIN_COMMAND_P=''
+NEW_LOGIN_COMMAND="$ac_cv_login_manager_program"
+
+AC_MSG_CHECKING(for login manager)
+if test -z "$NEW_LOGIN_COMMAND" ; then
+ NEW_LOGIN_COMMAND="$default_login_manager_1"
+ NEW_LOGIN_COMMAND_P='! '
+ AC_MSG_RESULT($NEW_LOGIN_COMMAND (disabled))
+else
+ AC_MSG_RESULT($NEW_LOGIN_COMMAND)
+fi
+
+
+
+###############################################################################
+#
+# Check for a directory full of images to use as the default value
+# of the "imageDirectory" preference.
+#
+###############################################################################
+
+have_imagedir=no
+with_imagedir_req=unspecified
+
+AC_ARG_WITH(image-directory,
+[ --with-image-directory Some demos will display random images from here.],
+ [with_imagedir="$withval"; with_imagedir_req="$withval"],
+ [with_imagedir=yes])
+# no HANDLE_X_PATH_ARG for this one
+
+case "$with_imagedir" in
+ /*)
+ # absolute path
+ AC_MSG_CHECKING([for image directory $with_imagedir])
+ if test -d "$with_imagedir" ; then
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ with_imagedir=""
+ fi
+ ;;
+ yes)
+ with_imagedir=""
+
+ fallback_imgdir=""
+ for dd in \
+ "/usr/share/rpd-wallpaper/" \
+ "/usr/share/backgrounds/images/" \
+ "/usr/share/wallpapers/" \
+ "/usr/share/backgrounds/" \
+ "/usr/share/pixmaps/backgrounds/" \
+ "/usr/share/lxde/wallpapers/" \
+ "/Library/Desktop Pictures/" \
+ ; do
+ if test -z "$with_imagedir"; then
+ AC_MSG_CHECKING([for image directory $dd])
+ if test -d "$dd"; then
+ if ( ls "$dd" | grep -q ... ) >&- 2>&- ; then
+ AC_MSG_RESULT(yes)
+ with_imagedir="$dd"
+ else
+ AC_MSG_RESULT(empty)
+ if test -z "$fallback_imgdir"; then
+ fallback_imgdir="$dd"
+ fi
+ fi
+ else
+ AC_MSG_RESULT(no)
+ fi
+ fi
+ done
+ if test -z "$with_imagedir"; then
+ with_imagedir="$fallback_imgdir"
+ fi
+;;
+ no)
+ with_imagedir=""
+ ;;
+
+ *)
+ echo "error: must be an absolute path: --with-image-directory=$with_imagedir_req"
+ exit 1
+ ;;
+esac
+ac_cv_imagedir="$with_imagedir"
+
+DEFAULT_IMAGES_P='True'
+DEFAULT_IMAGE_DIRECTORY="$ac_cv_imagedir"
+
+if test -z "$DEFAULT_IMAGE_DIRECTORY" ; then
+ DEFAULT_IMAGES_P='False'
+fi
+
+
+###############################################################################
+#
+# Pick a text file to use as the default of the "textFile" preference.
+# Any old file will do, but preferably one that will make interesting
+# shapes when displayed by "starwars" and "fontglide".
+#
+###############################################################################
+
+have_textfile=no
+with_textfile_req=unspecified
+
+AC_ARG_WITH(text-file,
+[ --with-text-file=FILE Some demos will use this as a source of text.],
+ [with_textfile="$withval"; with_textfile_req="$withval"],
+ [with_textfile=yes])
+# no HANDLE_X_PATH_ARG for this one
+
+case "$with_textfile" in
+ /*)
+ # absolute path
+ AC_MSG_CHECKING([for text file $with_textfile])
+ if test -f "$with_textfile" ; then
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ with_textfile=""
+ fi
+ ;;
+ yes)
+ with_textfile=""
+
+ #### Could use some more defaults here...
+ for f in \
+ "/usr/X11R6/lib/X11/doc/README" \
+ "/usr/share/doc/xserver-common/copyright" \
+ "/usr/share/doc/xserver-xorg-core/copyright" \
+ "/usr/X11R6/README" \
+ "/usr/share/doc/libX11*/COPYING" \
+ "/usr/X11/share/X11/doc/README*" \
+ "/usr/share/doc/debian/debian-manifesto" \
+ ; do
+ if test -z "$with_textfile"; then
+ AC_MSG_CHECKING([for text file $f])
+ f=`/bin/ls $f 2>&- | head -1`
+ if test -f "$f" ; then
+ AC_MSG_RESULT(yes)
+ with_textfile="$f"
+ else
+ AC_MSG_RESULT(no)
+ fi
+ fi
+ done
+
+ ;;
+ no)
+ with_textfile=""
+ ;;
+
+ *)
+ echo "error: must be an absolute path: --with-text-file=$with_textfile_req"
+ exit 1
+ ;;
+esac
+ac_cv_textfile="$with_textfile"
+
+DEFAULT_TEXT_FILE="$ac_cv_textfile"
+
+
+###############################################################################
+#
+# Check the browser to see help URL
+#
+###############################################################################
+
+have_browser=no
+with_browser_req=unspecified
+
+AC_ARG_WITH(browser,
+[ --with-browser=BROWSER The web browser used to open the "Help" URL.],
+ [with_browser="$withval"; with_browser_req="$withval"],
+ [with_browser=no ])
+# no HANDLE_X_PATH_ARG for this one
+
+case "$with_browser" in
+ no )
+ ;;
+ * )
+ WITH_BROWSER=$with_browser
+ gnome_open_program=$with_browser
+ AC_MSG_CHECKING([for browser $with_browser])
+ with_browser_fullpath=`which $with_browser 2>/dev/null`
+ case $with_browser_fullpath in
+ /* )
+ AC_MSG_RESULT(yes)
+ have_browser=yes
+ ;;
+ * )
+ AC_MSG_RESULT(no)
+# Only warning: we don't want to install all packages for the
+# dependency of the browser in building stage...
+ echo "WARNING: browser not found: --with-browser=$with_browser"
+ ;;
+ esac
+ ;;
+esac
+ac_cv_browser="$with_browser"
+
+
+###############################################################################
+#
+# Check for pthreads. Must come before checking for OpenGL,
+# since some versions of OpenGL require it.
+#
+###############################################################################
+
+have_pthread=no
+with_pthread_req=unspecified
+
+# AX_PTHREAD is from the GNU Autoconf Archive.
+# https://savannah.gnu.org/projects/autoconf-archive/
+m4_include(ax_pthread.m4)
+
+AC_ARG_WITH([pthread],
+[], # This is documented after --with-gl in --with-xft.
+ [with_pthread="$withval"; with_pthread_req="$withval"],
+ [with_pthread=yes])
+
+if test "$with_pthread" = yes; then
+ # AX_PTHREAD might want a different compiler.
+ AX_PTHREAD(
+ [if test "$CC" = "$PTHREAD_CC" -o -z "$ac_original_cc"; then
+ have_pthread=yes
+ else
+ ac_prog_cc_no_pthread=yes
+ fi
+ ])
+
+ if test "$have_pthread" = yes; then
+ AC_DEFINE([HAVE_PTHREAD])
+ CC="$PTHREAD_CC"
+ fi
+fi
+
+
+###############################################################################
+#
+# Handle --with-gles
+# Must come before --with-gl
+#
+###############################################################################
+
+with_jwzgles_req=unspecified
+have_jwzgles=no
+AC_ARG_WITH(gles,
+[], # This is documented after --with-gl
+ [with_jwzgles="$withval"; with_jwzgles_req="$withval"],[with_jwzgles=no])
+
+HANDLE_X_PATH_ARG(with_jwzgles, --with-gles, JWZGLES)
+
+if test "$with_jwzgles" = yes; then
+ have_jwzgles=yes
+ JWZGLES_OBJS='$(JWXYZ_BIN)/jwzgles.o'
+ AC_MSG_RESULT(emulating OpenGL 1.3 in terms of OpenGLES 1.x.)
+elif test "$with_jwzgles" != no; then
+ echo "error: must be yes or no: --with-gles=$with_jwzgles"
+ exit 1
+fi
+
+
+###############################################################################
+#
# Check for -lGL or -lMesaGL.
#
###############################################################################
+#### H1
+
have_gl=no
ac_have_mesa_gl=no
with_gl_req=unspecified
gl_halfassed=no
-AC_ARG_WITH(gl,[
-Graphics options:
+have_glext=no
+AC_ARG_WITH(gl,
+[
+Graphics Options:
- --with-gl Build those demos which depend on OpenGL.],
+ --with-gl Build those demos which depend on OpenGL.
+ --with-gles Emulate OpenGL 1.3 in terms of OpenGL ES 1.x.],
[with_gl="$withval"; with_gl_req="$withval"],[with_gl=yes])
HANDLE_X_PATH_ARG(with_gl, --with-gl, GL)
-ac_mesagl_version=unknown
-ac_mesagl_version_string=unknown
+# Some GL libraries require pthreads, so use the pthreads flags when
+# testing them, then set them back after.
+#
+ac_save_pthreads_CFLAGS="$CFLAGS"
+ac_save_pthreads_LIBS="$LIBS"
+CFLAGS="$PTHREAD_CFLAGS $CFLAGS"
+LIBS="$PTHREAD_LIBS $LIBS"
if test "$with_gl" = yes; then
- AC_CHECK_X_HEADER(GL/gl.h, have_gl=yes, have_gl=no)
- if test "$have_gl" = yes ; then
- AC_CHECK_X_HEADER(GL/glx.h, have_gl=yes, have_gl=no,
- [#include <GL/gl.h>])
+ AC_CHECK_X_HEADER(GL/gl.h, have_gl=yes, have_gl=no);
+ if test "$have_gl" = yes; then
+ AC_CHECK_X_HEADER(GL/glu.h, have_gl=yes, have_gl=no);
fi
+fi
- # If we have the headers, try and figure out which vendor it's from.
+if test "$with_gl" = yes; then
+ #
+ # Since the OpenGL and GLES specifications are a complete dumpster fire,
+ # it's not easy to figure out how what libraries to use.
+ #
+ # OpenGLES library names:
#
- if test "$have_gl" = yes ; then
+ # 1.x: libGLESv1_CM
+ # 2.x: libGLESv2
+ # 3.x: libGLESv2 on Windows, libGLESv3 on Android
+ #
+ # On modern Linux systems, these libraries exist:
+ #
+ # libGL - a superset of everything up to and including OpenGL 4.6
+ # libGLESv1_CM - OpenGLES 1.1, meaning it omits much of OpenGL 1.3
+ # libGLESv2 - OpenGLES 2 and 3, meaning it omits even more of OpenGL 1.3
+ #
+ # Since Linux systems support OpenGL 1.3, those link against only libGL.
+ #
+ # Unless we are using --with-gles on Linux, in which case we are attempting
+ # to simulate a system that does not natively support OpenGL 1.3. In that
+ # case, we use the v1 and/or v2 libraries instead.
+ #
+ # Common practice on Android seems to be to link against the v1, v2 and v3
+ # libraries in order, and then do runtime checks to see which set of
+ # functions is actually supported by the runtime. Just because you linked
+ # against a GLES3 library doesn't mean that the hardware supports it: most
+ # of these functions are just syscall-like stubs.
+ #
+ # See the commentary atop jwxyz/jwzgles.c for discussion of OpenGL versions.
+ #
+ if test "$have_gl" = yes; then
+ have_gl=no
+
+ if test "$have_jwzgles" = yes; then
+
+ # Only check for the v1/2/3 libraries on Linux when using --with-gles
+ # to emulate a system that does not natively support OpenGL 1.3.
+
+ # Check for GLES 3.x
+ AC_CHECK_X_LIB(GLESv3, glDrawElements,
+ [have_gl=yes
+ gl_lib_1="GLESv3"
+ GL_LIBS="-lGLESv3 $GL_LIBS"],
+ [], $GL_LIBS -lm)
+
+ # Check for GLES 2.x
+ AC_CHECK_X_LIB(GLESv2, glDrawElements,
+ [have_gl=yes
+ gl_lib_1="GLESv2"
+ GL_LIBS="-lGLESv2 $GL_LIBS"],
+ [], $GL_LIBS -lm)
+
+ # Check for GLES 1.x
+ AC_CHECK_X_LIB(GLESv1_CM, glDrawElements,
+ [have_gl=yes
+ gl_lib_1="GLESv1_CM"
+ GL_LIBS="-lGLESv1_CM $GL_LIBS"],
+ [], $GL_LIBS -lm)
+
+ else # $have_jwzgles = no
+
+ # Check for OpenGL 1.x and/or OpenGL 4.x
+ AC_CHECK_X_LIB(GL, glEnable,
+ [have_gl=yes
+ gl_lib_1="GL"
+ GL_LIBS="-lGL $GL_LIBS"],
+ [], $GL_LIBS -lm)
+
+ # Check for MesaGL 1.x, but only if libGL doesn't exist.
+ if test "$have_gl" = no; then
+ AC_CHECK_X_LIB(MesaGL, glEnable,
+ [have_gl=yes
+ gl_lib_1="MesaGL"
+ GL_LIBS="-lMesaGL $GL_LIBS"],
+ [], $GL_LIBS -lm)
+ fi
+ fi
+ fi
- # We need to know whether it's MesaGL so that we know which libraries
- # to link against.
- #
- AC_CACHE_CHECK([whether GL is really MesaGL], ac_cv_have_mesa_gl,
- [ac_cv_have_mesa_gl=no
- if test "$ac_macosx" = no; then
- # WTF! MacOS 10.5.0 ships the Mesa GL headers!
- # It's not really Mesa, is it?
- AC_EGREP_X_HEADER(Mesa|MESA, GL/glx.h, [ac_cv_have_mesa_gl=yes])
- fi])
- ac_have_mesa_gl=$ac_cv_have_mesa_gl
-
- gl_lib_1=""
- GL_LIBS=""
-
- if test "$ac_macosx" = yes; then
-
- # Without these, every link against libGL gets a bunch of useless
- # warnings.
- #
- osx_crud="-bind_at_load -multiply_defined suppress"
- AC_MSG_RESULT(adding "$osx_crud" to GL_LIBS)
- GL_LIBS="$GL_LIBS $osx_crud"
- unset osx_crud
+ # Figure out whether the GLU functions are in the main GL libraries or
+ # in -lGLU. Since Android does not have GLU, we don't link against libGLU
+ # when using --with-gles on Linux.
+ #
+ if test "$have_gl" = yes -a "$have_jwzgles" = no; then
+ AC_CHECK_X_LIB($gl_lib_1, gluBuild2DMipmaps,
+ [],
+ [have_gl=no], $GL_LIBS -lm)
+ if test "$have_gl" = no; then
+ AC_CHECK_X_LIB(GLU, gluBuild2DMipmaps,
+ [have_gl=yes
+ GL_LIBS="-lGLU $GL_LIBS"],
+ [have_gl=no
+ gl_halfassed=yes],
+ $GL_LIBS -lm)
+ fi
+ fi
- # New lossage in 10.5.0: without this, we get:
- # ld: cycle in dylib re-exports with /usr/X11/lib/libGL.dylib
- #
- osx_crud="/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib"
- osx_crud="-Wl,-dylib_file,${osx_crud}:${osx_crud}"
+ if test "$have_gl" = yes; then
- AC_MSG_RESULT(adding "$osx_crud" to GL_LIBS)
- GL_LIBS="$GL_LIBS $osx_crud"
- unset osx_crud
+ AC_DEFINE(HAVE_GL)
- # New lossage in 10.6.8: we can't allow -L/opt/local/lib to be in the
- # link line, or at runtime XQueryExtension gets a segv due to some kind
- # of library version skew. Libs must come from /usr/X11/lib even if
- # $prefix and/or $exec_prefix are set to /opt/local/.
- #
- AC_MSG_RESULT(omitting "$libdir" from LDFLAGS)
- libdir=''
+ # OpenGL 1.0 didn't have multiple textures.
+ AC_CHECK_X_LIB($gl_lib_1, glBindTexture, [AC_DEFINE(HAVE_GLBINDTEXTURE)],
+ [true], $GL_LIBS -lX11 -lXext -lm)
- # Looks like as of OSX 10.12, gcc can't do ObjC.
- OBJCC="clang -Wall"
+ # Check for native GLES1
+ AC_CHECK_X_LIB($gl_lib_1, glBindBuffer,
+ [AC_DEFINE(HAVE_GLES)],
+ [true], $GL_LIBS -lX11 -lXext -lm)
+ # Check for GLSL and GLES2
+ AC_CHECK_X_HEADER(GL/glext.h, have_glext=yes, have_glext=no,
+ [#include <GL/gl.h>])
+ if test "$have_glext" = yes ; then
+ AC_CHECK_X_LIB($gl_lib_1, glUseProgram,
+ [AC_DEFINE(HAVE_GLSL)
+ AC_DEFINE(HAVE_GLES2)],
+ [],
+ $GL_LIBS -lX11 -lXext -lm)
fi
+ # Check for GLES3
+ AC_CHECK_X_LIB($gl_lib_1, glBlitFramebuffer,
+ [AC_DEFINE(HAVE_GLES3)],
+ [],
+ $GL_LIBS -lX11 -lXext -lm)
- # Some versions of MesaGL are compiled to require -lpthread.
- # So if the Mesa headers exist, and -lpthread exists, then always
- # link -lpthread after the Mesa libs (be they named -lGL or -lMesaGL.)
- #
- # Oftentimes, AX_PTHREAD will bring in -lpthread as well; but that ends
- # up before -l(Mesa)GL, instead of after where it would belong.
- #
- if test "$ac_have_mesa_gl" = yes; then
- AC_CHECK_LIB(pthread, pthread_create, [GL_LIBS="-lpthread"], [],)
+ if test "$have_jwzgles" = yes; then
+ AC_DEFINE(HAVE_JWZGLES)
+ AC_DEFINE(HAVE_GLES)
fi
+ fi
- # If we have Mesa headers, check to see if we can link against -lMesaGL.
- # If we don't have Mesa headers, or we don't have -lMesaGL, try -lGL.
- # Else, warn that GL is busted. (We have the headers, but no libs.)
- #
- if test "$ac_have_mesa_gl" = yes ; then
- AC_CHECK_X_LIB(MesaGL, glXCreateContext,
- [gl_lib_1="MesaGL"
- GL_LIBS="-lMesaGL -lMesaGLU $VIDMODE_LIBS $GL_LIBS"],
- [], -lMesaGLU $GL_LIBS -lX11 -lXext $VIDMODE_LIBS -lm)
- fi
+elif test "$with_gl" != no; then
+ echo "error: must be yes or no: --with-gl=$with_gl"
+ exit 1
+fi
- if test "$gl_lib_1" = "" ; then
- AC_CHECK_X_LIB(GL, glXCreateContext,
- [gl_lib_1="GL"
- GL_LIBS="-lGL -lGLU $VIDMODE_LIBS $GL_LIBS"],
- [], -lGLU $GL_LIBS -lX11 -lXext $VIDMODE_LIBS -lm)
- fi
- if test "$gl_lib_1" = "" ; then
- # we have headers, but no libs -- bail.
- have_gl=no
- ac_have_mesa_gl=no
- gl_halfassed=yes
- else
- # linking works -- we can build the GL hacks.
- AC_DEFINE(HAVE_GL)
- if test "$ac_have_mesa_gl" = yes ; then
- AC_DEFINE(HAVE_MESA_GL)
- fi
- fi
- fi
+###############################################################################
+#
+# Handle --with-glx
+#
+###############################################################################
+have_glx=no
+have_egl=no
+with_egl_req=unspecified
+AC_ARG_WITH(glx,
+[ --with-glx Use GLX to interface OpenGL and X11 instead of EGL.],
+ [with_egl="$withval"; with_egl_req="$withval"],
+ [with_glx=no])
- # Now that we know we have GL headers and libs, do some more GL testing.
- #
+HANDLE_X_PATH_ARG(with_glx, --with-glx, GLX)
- if test "$have_gl" = yes ; then
- # If it's MesaGL, we'd like to issue a warning if the version number
- # is less than or equal to 2.6, because that version had a security bug.
- #
- if test "$ac_have_mesa_gl" = yes; then
-
- AC_CACHE_CHECK([MesaGL version number], ac_cv_mesagl_version_string,
- [cat > conftest.$ac_ext <<EOF
-#line __oline__ "configure"
-#include "confdefs.h"
-#include <GL/gl.h>
-#ifndef MESA_MAJOR_VERSION
-# include <GL/xmesa.h>
-# ifdef XMESA_MAJOR_VERSION
- /* Around Mesa 3.2, they took out the Mesa version number, so instead,
- we have to check the XMesa version number (the number of the X protocol
- support, which seems to be the same as the Mesa version number.)
- */
-# define MESA_MAJOR_VERSION XMESA_MAJOR_VERSION
-# define MESA_MINOR_VERSION XMESA_MINOR_VERSION
-# else
- /* Oh great. Some time after 3.4, they took out the xmesa.h header file,
- so we have no way of telling what version of Mesa this is at all.
- So, we'll guess that the osmesa version (the "offscreen protocol")
- is less than or equal to the real mesa version number. Except that
- if OSmesa is 3.3, assume at least Mesa 3.4, since OSmesa was 3.3 in
- Mesa 3.4. And Mesa 3.3 had xmesa.h. What a complete load of shit!
- */
-# include <GL/osmesa.h>
-# define MESA_MAJOR_VERSION OSMESA_MAJOR_VERSION
-# define MESA_MINOR_VERSION OSMESA_MINOR_VERSION or newer, probably?
-# if OSMESA_MAJOR_VERSION == 3 && OSMESA_MINOR_VERSION == 3
-# undef MESA_MINOR_VERSION
-# define MESA_MINOR_VERSION 4 or newer, probably?
-# endif
-# endif
-#endif
-configure: MESA_MAJOR_VERSION MESA_MINOR_VERSION
-EOF
+if test "$with_glx" = yes; then
+ AC_CHECK_X_HEADER(GLX/glx.h, have_glx=yes, have_glx=no)
+elif test "$with_glx" != no; then
+ echo "error: must be yes or no: --with-glx=$with_glx"
+ exit 1
+fi
- ac_save_CPPFLAGS="$CPPFLAGS"
- if test \! -z "$includedir" ; then
- CPPFLAGS="$CPPFLAGS -I$includedir"
- fi
- CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-
- mglv=`(eval "$ac_cpp conftest.$ac_ext") 2>&AC_FD_CC | grep configure:`
-
- # M4 sucks!!
- changequote(X,Y)
- mglv=`echo "$mglv" | sed -n \
- 's/^configure: *\([0-9][0-9]*\) *\([0-9].*\)$/\1.\2/p'`
- changequote([,])
-
- rm -f conftest.$ac_ext
-
- CPPFLAGS="$ac_save_CPPFLAGS"
-
- if test "$mglv" = ""; then
- ac_mesagl_version=unknown
- ac_mesagl_version_string=unknown
- else
- ac_mesagl_version_string="$mglv"
- # M4 sucks!!
- changequote(X,Y)
- maj=`echo "$mglv" | sed -n 's/^\([0-9][0-9]*\)\..*$/\1/p'`
- min=`echo "$mglv" | sed -n 's/^.*\.\([0-9][0-9]*\).*$/\1/p'`
- changequote([,])
- ac_mesagl_version=`echo "$maj * 1000 + $min" | bc`
- if test -z "$ac_mesagl_version"; then
- ac_mesagl_version=unknown
- ac_mesagl_version_string=unknown
- fi
- fi
- ac_cv_mesagl_version=$ac_mesagl_version
- ac_cv_mesagl_version_string=$ac_mesagl_version_string
- ])
- ac_mesagl_version=$ac_cv_mesagl_version
- ac_mesagl_version_string=$ac_cv_mesagl_version_string
+if test "$have_gl" = yes; then
+
+ # See if GLX functions are in -LGL.
+ AC_CHECK_X_LIB($gl_lib_1, glXCreateContext,
+ [have_glx=yes],
+ [have_glx=no],
+ $GL_LIBS -lm)
+
+ # See if EGL functions are in -LGL.
+ egl_lib=""
+ AC_CHECK_X_LIB($gl_lib_1, eglCreatePlatformWindowSurface,
+ [have_egl=yes],
+ [have_egl=no],
+ $GL_LIBS -lm)
+ if test "$have_egl" = no; then
+ # See if EGL functions are in -lEGL.
+ AC_CHECK_X_LIB(EGL, eglCreatePlatformWindowSurface,
+ [have_egl=yes
+ egl_lib="EGL"],
+ [have_egl=no],
+ $GL_LIBS -lm)
+ fi
+
+ # If both GLX and EGL exist, use GLX only if requested.
+ if test "$with_glx" = yes -a "$have_glx" = yes; then
+ have_egl=no
+ fi
+
+ if test "$have_egl" = yes; then
+ AC_DEFINE(HAVE_EGL)
+ if test \! -z "$egl_lib"; then
+ GL_LIBS="-l$egl_lib $GL_LIBS"
fi
+ fi
+ # One of them is required
+ if test "$have_egl" = no -a "$have_glx" = no; then
+ have_gl=no
+ gl_halfassed=yes
+ fi
- # Check for OpenGL 1.1 features.
- #
- AC_CHECK_X_LIB($gl_lib_1, glBindTexture, [AC_DEFINE(HAVE_GLBINDTEXTURE)],
- [true], $GL_LIBS -lX11 -lXext -lm)
+ # --with-gles means that we are emulating a system that supports GLES but
+ # does not support OpenGL 1.3 (e.g., using Linux to simulate an Android-like
+ # environment). On such a system, GLE is required and GLX wouldn't exist.
+ # There is no way to request a GLES 3.0 runtime context using GLX.
+ #
+ if test "$have_jwzgles" = yes -a "$have_egl" = no; then
+ AC_MSG_WARN([Using --with-glx and --with-gles together is a bad idea.])
fi
-elif test "$with_gl" != no; then
- echo "error: must be yes or no: --with-gl=$with_gl"
- exit 1
fi
+# Restore flags after testing OpenGL libraries.
+#
+CFLAGS="$ac_save_pthreads_CFLAGS"
+LIBS="$ac_save_pthreads_LIBS"
+
+
###############################################################################
#
# Check for -lgle.
@@ -3182,8 +3550,7 @@ have_gle=no
with_gle_req=unspecified
gle_halfassed=no
AC_ARG_WITH(gle,
-[ --with-gle Build those demos which depend on GLE
- (the OpenGL "extrusion" library.)],
+[ --with-gle Include support for the GL Extrusion library.],
[with_gle="$withval"; with_gle_req="$withval"],[with_gle=yes])
HANDLE_X_PATH_ARG(with_gle, --with-gle, GLE)
@@ -3260,27 +3627,43 @@ fi
###############################################################################
#
-# Handle --with-gles
+# Check for -ljpeg
#
###############################################################################
-with_gles_req=unspecified
-AC_ARG_WITH(gles,
-[ --with-gles Target OpenGL ES 1.x API instead of OpenGL 1.3.],
- [with_gles="$withval"; with_gles_req="$withval"],[with_gles=no])
+have_jpeg=no
+with_jpeg_req=unspecified
+jpeg_halfassed=no
+AC_ARG_WITH(jpeg,
+[ --with-jpeg Include support for the JPEG library.],
+ [with_jpeg="$withval"; with_jpeg_req="$withval"],
+ [with_jpeg=yes])
-HANDLE_X_PATH_ARG(with_gles, --with-gles, JWZGLES)
+HANDLE_X_PATH_ARG(with_jpeg, --with-jpeg, JPEG)
-if test "$with_gles" = yes; then
- have_gles=yes
- AC_DEFINE(HAVE_JWZGLES)
- JWZGLES_OBJS='$(JWXYZ_BIN)/jwzgles.o'
- AC_MSG_RESULT(using OpenGL ES compatiblity shim)
-elif test "$with_gles" != no; then
- echo "error: must be yes or no: --with-gles=$with_gles"
+if test "$with_jpeg" != yes -a "$with_jpeg" != no ; then
+ echo "error: must be yes or no: --with-jpeg=$with_jpeg"
exit 1
fi
+if test "$with_jpeg" = yes; then
+
+ have_jpeg=no
+ AC_CHECK_X_HEADER(jpeglib.h, [have_jpeg=yes])
+
+ if test "$have_jpeg" = yes; then
+ # we have the header, now check for the library
+ have_jpeg=no
+ jpeg_halfassed=yes
+ AC_CHECK_X_LIB(jpeg, jpeg_start_compress,
+ [have_jpeg=yes
+ jpeg_halfassed=no
+ JPEG_LIBS="-ljpeg"
+ AC_DEFINE(HAVE_JPEGLIB)])
+ fi
+fi
+
+
###############################################################################
#
# Check for -lpng
@@ -3291,7 +3674,7 @@ have_png=no
with_png_req=unspecified
png_halfassed=no
AC_ARG_WITH(png,
-[ --with-png Include support for the PNG library.],
+[ --with-png Include support for the PNG library.],
[with_png="$withval"; with_png_req="$withval"],
[with_png=yes])
@@ -3324,7 +3707,7 @@ fi
#
# Check for -lgdk_pixbuf.
# These tests are for gdk_pixbuf usage of the hacks,
-# not xscreensaver-demo (thus we have to test again to get
+# not xscreensaver-settings (thus we have to test again to get
# the libraries right: don't want to pull in all of GTK
# for the hacks.)
#
@@ -3333,9 +3716,8 @@ fi
have_gdk_pixbuf=no
with_gdk_pixbuf_req=unspecified
AC_ARG_WITH(pixbuf,
-[ --with-pixbuf Include support for the GDK-Pixbuf library in some
- demos, which will make it possible for them to read
- GIF, JPEG, and PNG files as well.],
+[ --with-pixbuf Include support for the GDK-Pixbuf library, which
+ allows the display of JPEG, PNG, GIF and SVG images.],
[with_gdk_pixbuf="$withval"; with_gdk_pixbuf_req="$withval"],
[with_gdk_pixbuf=yes])
@@ -3449,45 +3831,6 @@ fi
###############################################################################
#
-# Check for -ljpeg
-#
-###############################################################################
-
-have_jpeg=no
-with_jpeg_req=unspecified
-jpeg_halfassed=no
-AC_ARG_WITH(jpeg,
-[ --with-jpeg Include support for the JPEG library.],
- [with_jpeg="$withval"; with_jpeg_req="$withval"],
- [with_jpeg=yes])
-
-HANDLE_X_PATH_ARG(with_jpeg, --with-jpeg, JPEG)
-
-if test "$with_jpeg" != yes -a "$with_jpeg" != no ; then
- echo "error: must be yes or no: --with-jpeg=$with_jpeg"
- exit 1
-fi
-
-if test "$with_jpeg" = yes; then
-
- have_jpeg=no
- AC_CHECK_X_HEADER(jpeglib.h, [have_jpeg=yes])
-
- if test "$have_jpeg" = yes; then
- # we have the header, now check for the library
- have_jpeg=no
- jpeg_halfassed=yes
- AC_CHECK_X_LIB(jpeg, jpeg_start_compress,
- [have_jpeg=yes
- jpeg_halfassed=no
- JPEG_LIBS="-ljpeg"
- AC_DEFINE(HAVE_JPEGLIB)])
- fi
-fi
-
-
-###############################################################################
-#
# Check for -lXft
#
###############################################################################
@@ -3505,7 +3848,8 @@ have_xft=no
with_xft_req=unspecified
xft_halfassed=no
AC_ARG_WITH(xft,
-[ --with-xft Include support for the X Freetype library.],
+[ --with-xft Include support for the X Freetype library.
+ --with-pthread Enables POSIX threads, for SMP support.],
[with_xft="$withval"; with_xft_req="$withval"],
[with_xft=yes])
@@ -3576,81 +3920,6 @@ fi
###############################################################################
#
-# Check for -lsystemd
-#
-###############################################################################
-
-have_systemd=no
-with_systemd_req=unspecified
-systemd_halfassed=no
-AC_ARG_WITH(systemd,
-[ --with-systemd Build xscreensaver-systemd to lock on suspend.],
- [with_systemd="$withval"; with_systemd_req="$withval"],
- [with_systemd=yes])
-
-HANDLE_X_PATH_ARG(with_systemd, --with-systemd, systemd)
-
-if test "$with_systemd" != yes -a "$with_systemd" != no ; then
- echo "error: must be yes or no: --with-systemd=$with_systemd"
- exit 1
-fi
-
-if test "$with_systemd" = yes; then
-
- pkgs=''
- ok="yes"
- pkg_check_version libsystemd 221
- have_systemd="$ok"
-
- if test "$have_systemd" = yes; then
- AC_CACHE_CHECK([for libsystemd includes], ac_cv_systemd_config_cflags,
- [ac_cv_systemd_config_cflags=`$pkg_config --cflags $pkgs`])
- AC_CACHE_CHECK([for libsystemd libs], ac_cv_systemd_config_libs,
- [ac_cv_systemd_config_libs=`$pkg_config --libs $pkgs`])
- fi
-
- ac_systemd_config_cflags=$ac_cv_systemd_config_cflags
- ac_systemd_config_libs=$ac_cv_systemd_config_libs
-
- if test "$have_systemd" = yes; then
- #
- # we appear to have libsystemd; check for headers/libs to be sure.
- #
- ac_save_systemd_CPPFLAGS="$CPPFLAGS"
- CPPFLAGS="$CPPFLAGS $ac_systemd_config_cflags"
-
- have_systemd=no
- AC_CHECK_X_HEADER(systemd/sd-bus.h, [have_systemd=yes])
-
- CPPFLAGS="$ac_save_systemd_CPPFLAGS"
- fi
-
- if test "$have_systemd" = yes; then
- # we have the headers, now check for the libraries
- have_systemd=no
- systemd_halfassed=yes
-
- AC_MSG_RESULT(checking for libsystemd usability...)
- AC_CHECK_X_LIB(c, sd_bus_open_system, [have_systemd=yes],,
- $ac_systemd_config_libs -lX11 -lXext -lm)
- fi
-
- if test "$have_systemd" = no; then
- AC_MSG_RESULT(checking for libsystemd usability... no)
- fi
-fi
-
-if test "$have_systemd" = yes; then
- INCLUDES="$INCLUDES $ac_systemd_config_cflags"
- EXES_SYSTEMD='$(EXES_SYSTEMD)'
- AC_DEFINE(HAVE_LIBSYSTEMD)
-else
- EXES_SYSTEMD=''
-fi
-
-
-###############################################################################
-#
# Check for pty support: this allows 'phosphor' and 'apple2'
# to run curses-based programs, or be used as terminal windows.
#
@@ -3664,316 +3933,70 @@ AC_CHECK_X_LIB(util, forkpty,
AC_DEFINE(HAVE_FORKPTY)])
if test "$ac_have_forkpty" != yes ; then
- # we don't need (or have) -lutil on MacOS 10.4.2...
+ # we don't need (or have) -lutil on macOS 10.4.2...
AC_CHECK_X_LIB(c, forkpty,
[PTY_LIBS=""
AC_DEFINE(HAVE_FORKPTY)])
fi
-###############################################################################
-#
-# Check for the XSHM server extension.
-#
-###############################################################################
-
-have_xshm=no
-with_xshm_req=unspecified
-AC_ARG_WITH(xshm-ext,
-[ --with-xshm-ext Include support for the Shared Memory extension.],
- [with_xshm="$withval"; with_xshm_req="$withval"],[with_xshm=yes])
-
-HANDLE_X_PATH_ARG(with_xshm, --with-xshm-ext, XSHM)
-
-if test "$with_xshm" = yes; then
-
- # first check for Xshm.h.
- AC_CHECK_X_HEADER(X11/extensions/XShm.h, [have_xshm=yes],,
- [#include <X11/Xlib.h>])
-
- # if that succeeded, then check for sys/ipc.h.
- if test "$have_xshm" = yes; then
- have_xshm=no
- AC_CHECK_X_HEADER(sys/ipc.h, [have_xshm=yes])
- fi
-
- # if that succeeded, then check for sys/shm.h.
- if test "$have_xshm" = yes; then
- have_xshm=no
- AC_CHECK_X_HEADER(sys/shm.h, [have_xshm=yes])
- fi
-
- # AIX is pathological, as usual: apparently it's normal for the Xshm headers
- # to exist, but the library code to not exist. And even better, the library
- # code is in its own library: libXextSam.a. So, if we're on AIX, and that
- # lib doesn't exist, give up. (This lib gets added to X_EXTRA_LIBS, and
- # that's not quite right, but close enough.)
- #
- case "$host" in
- *-aix*)
- if [ `uname -v` -eq 3 ]; then
- have_xshm=no
- AC_CHECK_X_LIB(XextSam, XShmQueryExtension,
- [have_xshm=yes; X_EXTRA_LIBS="$X_EXTRA_LIBS -lXextSam"],
- [true], -lX11 -lXext -lm)
- fi
- ;;
- esac
-
- # if that succeeded, then we've really got it.
- if test "$have_xshm" = yes; then
- AC_DEFINE(HAVE_XSHM_EXTENSION)
- fi
-
-elif test "$with_xshm" != no; then
- echo "error: must be yes or no: --with-xshm-ext=$with_xshm"
- exit 1
-fi
-
###############################################################################
#
-# Check for the DOUBLE-BUFFER server extension.
+# Check for libcap, which allows "sonar" to work without setuid.
+# Except, nevermind, that's bad. See comments in sonar-icmp.c.
#
###############################################################################
-have_xdbe=no
-with_xdbe_req=unspecified
-AC_ARG_WITH(xdbe-ext,
-[ --with-xdbe-ext Include support for the DOUBLE-BUFFER extension.],
- [with_xdbe="$withval"; with_xdbe_req="$withval"],[with_xdbe=yes])
-
-HANDLE_X_PATH_ARG(with_xdbe, --with-xdbe-ext, DOUBLE-BUFFER)
-
-if test "$with_xdbe" = yes; then
-
- AC_CHECK_X_HEADER(X11/extensions/Xdbe.h, [have_xdbe=yes],,
- [#include <X11/Xlib.h>])
- if test "$have_xdbe" = yes; then
- AC_DEFINE(HAVE_DOUBLE_BUFFER_EXTENSION)
- fi
-
-elif test "$with_xdbe" != no; then
- echo "error: must be yes or no: --with-xdbe-ext=$with_xshm"
- exit 1
-fi
-
-
-###############################################################################
-#
-# Check for the SGI XReadDisplay server extension.
-#
-# Note: this has to be down here, rather than up with the other server
-# extension tests, so that the output of `configure --help' is in the
-# right order. Arrgh!
-#
-###############################################################################
-
-have_readdisplay=no
-with_readdisplay_req=unspecified
-AC_ARG_WITH(readdisplay,
-[ --with-readdisplay Include support for the XReadDisplay extension.],
- [with_readdisplay="$withval"; with_readdisplay_req="$withval"],
- [with_readdisplay=yes])
-
-HANDLE_X_PATH_ARG(with_readdisplay, --with-readdisplay, XReadDisplay)
-
-if test "$with_readdisplay" = yes; then
- AC_CHECK_X_HEADER(X11/extensions/readdisplay.h,
- AC_DEFINE(HAVE_READ_DISPLAY_EXTENSION),,
- [#include <X11/Xlib.h>])
-elif test "$with_readdisplay" != no; then
- echo "error: must be yes or no: --with-readdisplay=$with_readdisplay"
- exit 1
-fi
-
+have_libcap=no
+setcap_hacks_default=no
+setcap_hacks="$setcap_hacks_default"
+setcap_hacks_req=unspecified
-###############################################################################
+#AC_ARG_WITH(setcap-hacks,
+#[ --with-setcap-hacks Build the "sonar" demo with libcap, which allows
+# it to ping other hosts without being setuid.],
+# [setcap_hacks="$withval"; setcap_hacks_req="$withval"],
+# [setcap_hacks=yes])
#
-# Check for a directory full of images to use as the default value
-# of the "imageDirectory" preference.
+#HANDLE_X_PATH_ARG(setcap_hacks, --with-setcap-hacks, setcap hacks)
#
-###############################################################################
-
-have_imagedir=no
-with_imagedir_req=unspecified
-
-AC_ARG_WITH(image-directory,
-[ --with-image-directory Arg is the default directory from which some demos
- will choose random images to display.],
- [with_imagedir="$withval"; with_imagedir_req="$withval"],
- [with_imagedir=yes])
-# no HANDLE_X_PATH_ARG for this one
-
-case "$with_imagedir" in
- /*)
- # absolute path
- AC_MSG_CHECKING([for image directory $with_imagedir])
- if test -d "$with_imagedir" ; then
- AC_MSG_RESULT(yes)
- else
- AC_MSG_RESULT(no)
- with_imagedir=""
- fi
- ;;
- yes)
- with_imagedir=""
-
- #### Could use some more defaults here...
- for dd in \
- "/usr/share/backgrounds/images/" \
- "/usr/share/wallpapers/" \
- "/Library/Desktop Pictures/" \
- ; do
- if test -z "$with_imagedir"; then
- AC_MSG_CHECKING([for image directory $dd])
- if test -d "$dd" ; then
- AC_MSG_RESULT(yes)
- with_imagedir="$dd"
- else
- AC_MSG_RESULT(no)
- fi
- fi
- done
-
- ;;
- no)
- with_imagedir=""
- ;;
-
- *)
- echo "error: must be an absolute path: --with-image-directory=$with_imagedir_req"
- exit 1
- ;;
-esac
-ac_cv_imagedir="$with_imagedir"
-
-DEFAULT_IMAGES_P='True'
-DEFAULT_IMAGE_DIRECTORY="$ac_cv_imagedir"
-
-if test -z "$DEFAULT_IMAGE_DIRECTORY" ; then
- DEFAULT_IMAGES_P='False'
-fi
-
-
-###############################################################################
+#if test "$setcap_hacks" != yes -a "$setcap_hacks" != no ; then
+# echo "error: must be yes or no: --with-setcap-hacks=$setcap_hacks"
+# exit 1
+#fi
#
-# Pick a text file to use as the default of the "textFile" preference.
-# Any old file will do, but preferably one that will make interesting
-# shapes when displayed by "starwars" and "fontglide".
+#if test "$setcap_hacks" = yes; then
#
-###############################################################################
-
-have_textfile=no
-with_textfile_req=unspecified
-
-AC_ARG_WITH(text-file,
-[ --with-text-file=FILE By default, some demos may display this file.],
- [with_textfile="$withval"; with_textfile_req="$withval"],
- [with_textfile=yes])
-# no HANDLE_X_PATH_ARG for this one
-
-case "$with_textfile" in
- /*)
- # absolute path
- AC_MSG_CHECKING([for text file $with_textfile])
- if test -f "$with_textfile" ; then
- AC_MSG_RESULT(yes)
- else
- AC_MSG_RESULT(no)
- with_textfile=""
- fi
- ;;
- yes)
- with_textfile=""
-
- #### Could use some more defaults here...
- for f in \
- "/usr/X11R6/lib/X11/doc/README" \
- "/usr/share/doc/xserver-common/copyright" \
- "/usr/share/doc/xserver-xorg-core/copyright" \
- "/usr/X11R6/README" \
- "/usr/share/doc/libX11*/COPYING" \
- "/usr/X11/share/X11/doc/README*" \
- "/usr/share/doc/debian/debian-manifesto" \
- ; do
- if test -z "$with_textfile"; then
- AC_MSG_CHECKING([for text file $f])
- f=`/bin/ls $f 2>&- | head -1`
- if test -f "$f" ; then
- AC_MSG_RESULT(yes)
- with_textfile="$f"
- else
- AC_MSG_RESULT(no)
- fi
- fi
- done
-
- ;;
- no)
- with_textfile=""
- ;;
-
- *)
- echo "error: must be an absolute path: --with-text-file=$with_textfile_req"
- exit 1
- ;;
-esac
-ac_cv_textfile="$with_textfile"
-
-DEFAULT_TEXT_FILE="$ac_cv_textfile"
+# AC_CHECK_PROGS(setcap_program, setcap)
+# if test "$setcap_program" != ''; then
+# AC_CHECK_X_HEADER(sys/capability.h, [have_setcap=yes])
+# fi
+# if test "$have_setcap" = yes; then
+# AC_CHECK_X_LIB(cap, cap_set_flag,
+# [have_libcap=yes
+# PROG_SETCAP="$setcap_program"
+# LIBCAP_LIBS="-lcap"
+# AC_DEFINE(HAVE_LIBCAP)])
+# fi
+#fi
###############################################################################
#
-# Check the browser to see help URL
+# Sonar must be setuid to be able to ping other hosts.
#
###############################################################################
-have_browser=no
-with_browser_req=unspecified
-
-AC_ARG_WITH(browser,
-[ --with-browser=BROWSER Specify the web browser used to show the help URL.],
- [with_browser="$withval"; with_browser_req="$withval"],
- [with_browser=no ])
-# no HANDLE_X_PATH_ARG for this one
-
-case "$with_browser" in
- no )
- ;;
- * )
- WITH_BROWSER=$with_browser
- gnome_open_program=$with_browser
- AC_MSG_CHECKING([for browser $with_browser])
- with_browser_fullpath=`which $with_browser 2>/dev/null`
- case $with_browser_fullpath in
- /* )
- AC_MSG_RESULT(yes)
- have_browser=yes
- ;;
- * )
- AC_MSG_RESULT(no)
-# Only warning: we don't want to install all packages for the
-# dependency of the browser in building stage...
- echo "WARNING: browser not found: --with-browser=$with_browser"
- ;;
- esac
- ;;
-esac
-ac_cv_browser="$with_browser"
-
-###############################################################################
-#
-# Check whether it's ok to install some hacks as setuid (e.g., "sonar")
-# This should be safe, but let's give people the option.
-#
-###############################################################################
+if test "$have_libcap" = yes; then
+ setuid_hacks_default=no
+else
+ setuid_hacks_default=yes
+fi
-setuid_hacks_default=no
setuid_hacks="$setuid_hacks_default"
AC_ARG_WITH(setuid-hacks,
-[ --with-setuid-hacks Allow some demos to be installed `setuid root'
- (which is needed in order to ping other hosts.)],
+[ --with-setuid-hacks Install the "sonar" demo as setuid root, which is
+ needed in order to ping other hosts.],
[setuid_hacks="$withval"], [setuid_hacks="$setuid_hacks_default"])
HANDLE_X_PATH_ARG(setuid_hacks, --with-setuid-hacks, setuid hacks)
@@ -3988,45 +4011,6 @@ fi
###############################################################################
#
-# Check for setcap, which is less worrying than setuid.
-#
-###############################################################################
-
-have_libcap=no
-setcap_hacks_default=yes
-setcap_hacks="$setcap_hacks_default"
-setcap_hacks_req=unspecified
-AC_ARG_WITH(setcap-hacks,
-[ --with-setcap-hacks Allow some demos to be installed with setcap
- (which is needed in order to ping other hosts.)],
- [setcap_hacks="$withval"; setcap_hacks_req="$withval"],
- [setcap_hacks=yes])
-
-HANDLE_X_PATH_ARG(setcap_hacks, --with-setcap-hacks, setcap hacks)
-
-if test "$setcap_hacks" != yes -a "$setcap_hacks" != no ; then
- echo "error: must be yes or no: --with-setcap-hacks=$setcap_hacks"
- exit 1
-fi
-
-if test "$setcap_hacks" = yes; then
-
- AC_CHECK_PROGS(setcap_program, setcap)
- if test "$setcap_program" != ''; then
- AC_CHECK_X_HEADER(sys/capability.h, [have_setcap=yes])
- fi
- if test "$have_setcap" = yes; then
- AC_CHECK_X_LIB(cap, cap_set_flag,
- [have_libcap=yes
- PROG_SETCAP="$setcap_program"
- LIBCAP_LIBS="-lcap"
- AC_DEFINE(HAVE_LIBCAP)])
- fi
-fi
-
-
-###############################################################################
-#
# Check for --with-record-animation
#
###############################################################################
@@ -4057,6 +4041,7 @@ if test "$record_anim" = yes; then
fi
fi
+
###############################################################################
#
# Done testing. Now, set up the various -I and -L variables,
@@ -4081,11 +4066,11 @@ fi
PREFERRED_DEMO_PROGRAM=''
ALL_DEMO_PROGRAMS=
if test "$have_motif" = yes; then
- PREFERRED_DEMO_PROGRAM=xscreensaver-demo-Xm
+ PREFERRED_DEMO_PROGRAM=xscreensaver-settings-Xm
ALL_DEMO_PROGRAMS="$PREFERRED_DEMO_PROGRAM $ALL_DEMO_PROGRAMS"
fi
if test "$have_gtk" = yes; then
- PREFERRED_DEMO_PROGRAM=xscreensaver-demo-Gtk
+ PREFERRED_DEMO_PROGRAM=xscreensaver-settings-Gtk
ALL_DEMO_PROGRAMS="$PREFERRED_DEMO_PROGRAM $ALL_DEMO_PROGRAMS"
fi
@@ -4104,10 +4089,10 @@ if test "$enable_pam_check_account_type" = yes; then
else
COMMENT_PAM_CHECK_ACCOUNT="#"
fi
-if test "$have_passwd_helper" = yes; then
- PASSWD_SRCS="$PASSWD_SRCS \$(PWHELPER_SRCS)"
- PASSWD_OBJS="$PASSWD_OBJS \$(PWHELPER_OBJS)"
-fi
+#if test "$have_passwd_helper" = yes; then
+# PASSWD_SRCS="$PASSWD_SRCS \$(PWHELPER_SRCS)"
+# PASSWD_OBJS="$PASSWD_OBJS \$(PWHELPER_OBJS)"
+#fi
PASSWD_SRCS="$PASSWD_SRCS \$(PWENT_SRCS)"
PASSWD_OBJS="$PASSWD_OBJS \$(PWENT_OBJS)"
@@ -4131,12 +4116,10 @@ else
fi
-INSTALL_SETUID='$(INSTALL_PROGRAM) $(SUID_FLAGS)'
-
-if test "$need_setuid" = yes; then
- NEED_SETUID=yes
+if test "$setuid_auth" = yes; then
+ SETUID_AUTH=yes
else
- NEED_SETUID=no
+ SETUID_AUTH=no
fi
if test "$setuid_hacks" = yes; then
@@ -4217,6 +4200,7 @@ AC_MSG_RESULT($PO_DATADIR/locale)
# canonicalize slashes.
HACK_CONF_DIR=`echo "${HACK_CONF_DIR}" | sed 's@/$@@;s@//*@/@g'`
+FONT_DIR=`echo "${FONT_DIR}" | sed 's@/$@@;s@//*@/@g'`
# gcc 3.0 likes to issue this warning for every file:
#
@@ -4250,16 +4234,16 @@ AC_SUBST(PTY_LIBS)
AC_SUBST(GL_LIBS)
AC_SUBST(GLE_LIBS)
AC_SUBST(XDPMS_LIBS)
+AC_SUBST(PTHREAD_LIBS)
AC_SUBST(XINERAMA_LIBS)
AC_SUBST(PASSWD_LIBS)
AC_SUBST(LIBCAP_CFLAGS)
AC_SUBST(LIBCAP_LIBS)
AC_SUBST(PROG_SETCAP)
-AC_SUBST(INSTALL_SETUID)
+AC_SUBST(SETUID_AUTH)
AC_SUBST(SETUID_HACKS)
AC_SUBST(SETCAP_HACKS)
AC_SUBST(INSTALL_DIRS)
-AC_SUBST(NEED_SETUID)
AC_SUBST(INSTALL_PAM)
AC_SUBST(HAVE_PAM_FAIL_DELAY)
AC_SUBST(COMMENT_PAM_CHECK_ACCOUNT)
@@ -4269,27 +4253,18 @@ AC_SUBST(DEFAULT_IMAGES_P)
AC_SUBST(DEFAULT_IMAGE_DIRECTORY)
AC_SUBST(DEFAULT_TEXT_FILE)
AC_SUBST(WITH_BROWSER)
-AC_SUBST(COMMENT_DEMO_GLADE2_GTK_2_22_HEAD)
-AC_SUBST(COMMENT_DEMO_GLADE2_GTK_2_22_TAIL)
-
-AC_SUBST(OBJCC)
AC_SUBST(EXES_OSX)
AC_SUBST(EXES_SYSTEMD)
+AC_SUBST(SYSTEMD_LIBS)
AC_SUBST(SCRIPTS_OSX)
AC_SUBST(MEN_OSX)
AC_SUBST(PASSWD_SRCS)
AC_SUBST(PASSWD_OBJS)
-AC_SUBST(XMU_SRCS)
-AC_SUBST(XMU_OBJS)
-AC_SUBST(XMU_LIBS)
AC_SUBST(XFT_SRCS)
AC_SUBST(XFT_OBJS)
AC_SUBST(XFT_LIBS)
-AC_SUBST(SAVER_GL_SRCS)
-AC_SUBST(SAVER_GL_OBJS)
-AC_SUBST(SAVER_GL_LIBS)
AC_SUBST(LOCK_SRCS)
AC_SUBST(LOCK_OBJS)
AC_SUBST(JPEG_EXES)
@@ -4310,7 +4285,7 @@ AC_SUBST(HACKDIR_FULL)
AC_SUBST(GTK_DATADIR)
AC_SUBST(PO_DATADIR)
AC_SUBST(HACK_CONF_DIR)
-AC_SUBST(GTK_EXTRA_OBJS)
+AC_SUBST(FONT_DIR)
AC_SUBST(ANIM_OBJS)
AC_SUBST(ANIM_LIBS)
@@ -4322,17 +4297,18 @@ AC_SUBST(DEPEND_FLAGS)
AC_SUBST(DEPEND_DEFINES)
AC_SUBST(PERL)
-AC_OUTPUT(Makefile
+AC_CONFIG_FILES([Makefile
utils/Makefile
jwxyz/Makefile
hacks/Makefile
+ hacks/fonts/Makefile
hacks/images/Makefile
hacks/glx/Makefile
po/Makefile.in
driver/Makefile
driver/xscreensaver.pam
- driver/xscreensaver-demo.glade2
- driver/XScreenSaver.ad)
+ driver/XScreenSaver.ad])
+AC_OUTPUT
###############################################################################
#
@@ -4410,6 +4386,10 @@ if test "$with_xidle_req" = yes -a "$have_xidle" = no ; then
warn 'The XIdle extension was requested, but was not found.'
fi
+if test "$with_mit_req" = yes -a "$have_mit" = no ; then
+ warn 'The MIT-SCREEN-SAVER extension was requested, but was not found.'
+fi
+
if test "$with_xshm_req" = yes -a "$have_xshm" = no ; then
warn 'The XSHM extension was requested, but was not found.'
fi
@@ -4418,6 +4398,14 @@ if test "$with_xdbe_req" = yes -a "$have_xdbe" = no ; then
warn 'The DOUBLE-BUFFER extension was requested, but was not found.'
fi
+#if test "$with_xcomposite_req" = yes -a "$have_xcomposite" = no ; then
+# warn 'The XCOMPOSITE extension was requested, but was not found.'
+#fi
+
+if test "$with_xkb_req" = yes -a "$have_xkb" = no ; then
+ warn 'The X Keyboard extension was requested, but was not found.'
+fi
+
if test "$with_sgivc_req" = yes -a "$have_sgivc" = no ; then
warn 'The SGI-VIDEO-CONTROL extension was requested, but was not found.'
fi
@@ -4457,21 +4445,13 @@ else
fi
if test "$gtk_halfassed" != no ; then
- warnL "GTK version $gtk_halfassed was found, but at least one supporting"
- warn2 "library ($gtk_halfassed_lib) was not, so GTK can't be used."
- warn2 "Perhaps some of the development packages are not installed?"
- if test "$have_gtk" = yes ; then
- v="$ac_gtk_version_string"
- warn2 "GTK $v is also installed, so it will be used instead."
- warn2 "Please read the above output and the \`config.log' file"
- warn2 "for more details."
- fi
+ warnL "GTK was found, but $gtk_halfassed_lib was not, so GTK can't be used."
fi
motif_warn2() {
warn2 'Though the Motif front-end to xscreensaver is still'
warn2 'maintained, it is no longer being updated with new'
- warn2 'features: all new development on the xscreensaver-demo'
+ warn2 'features: all new development on the xscreensaver-settings'
warn2 'program is happening in the GTK version, and not in the'
warn2 'Motif version. It is recommended that you build against'
warn2 'GTK instead of Motif. See <http://www.gtk.org/>.'
@@ -4481,12 +4461,12 @@ if test "$have_motif" = no -a "$have_gtk" = no; then
if test "$with_motif" = yes; then
warnL "Neither the GTK nor Motif libraries were found; the"
- warn2 "\`xscreensaver-demo' program requires one of these."
+ warn2 "\`xscreensaver-settings' program requires one of these."
echo ''
motif_warn2
else
warnL "The GTK libraries do not seem to be available; the"
- warn2 "\`xscreensaver-demo' program requires them."
+ warn2 "\`xscreensaver-settings' program requires them."
# echo ''
# warn2 'You can use Motif or Lesstif instead of GTK (use the'
# warn2 "\`--with-motif' option) but that is NOT recommended."
@@ -4497,26 +4477,15 @@ elif test "$with_motif_req" = yes -a "$have_motif" = no ; then
warnL "Use of Motif was requested, but it wasn't found;"
warn2 "Gtk will be used instead."
-elif test "$jurassic_gtk" = yes ; then
-
- pref_gtk=2.0
-
- v="$ac_gtk_version_string"
- if test "$with_gtk_req" = yes -a "$ac_gtk_version" = "unknown" ; then
- warnL "Use of Gtk was requested, but its version number is unknown;"
- elif test "$with_gtk_req" = yes ; then
- warnL "Use of Gtk was requested, but it is version $v;"
- else
- warnL "Gtk was found on this system, but it is version $v;"
- fi
-
- warn2 "Gtk $pref_gtk or newer is required."
-
elif test "$with_gtk_req" = yes -a "$have_gtk" = no ; then
warnL "Use of Gtk was requested, but it wasn't found."
fi
+if test "$ac_cv_libxt" != yes ; then
+ warnL 'The Xt library was not found. It is required.'
+fi
+
if test "$have_gtk" = yes -a "$have_gdk_pixbuf" = no ; then
warn "GTK is being used, but the GDK-Pixbuf library and/or"
warn2 "headers were not found. That can't be good. Please"
@@ -4548,6 +4517,11 @@ if test "$have_motif" = yes -a "$have_gtk" = no ; then
motif_warn2
fi
+halfassery() {
+ echo ''
+ warn2 "More specifically, we found the headers but not the"
+ warn2 "libraries. Possibly a 'devel' package is needed."
+}
if test "$with_gdk_pixbuf_req" = yes -a "$have_gdk_pixbuf" = no; then
warnL 'Use of GDK-Pixbuf was requested, but it was not found.'
@@ -4564,14 +4538,7 @@ if test "$have_gdk_pixbuf" = no -o "$gdk_pixbuf_halfassed" = yes || \
warnL 'The GDK-Pixbuf library was not found.'
fi
- if test "$gdk_pixbuf_halfassed" = yes ; then
- echo ''
- warn2 'More specifically, we found the headers, but not the'
- warn2 'libraries; so either GDK-Pixbuf is half-installed on this'
- warn2 "system, or something else went wrong. The \`config.log'"
- warn2 'file might contain some clues.'
- fi
-
+ if test "$gdk_pixbuf_halfassed" = yes ; then halfassery ; fi
if test "$have_png" = yes ; then
echo ''
warn2 'The PNG library is being used instead.'
@@ -4588,21 +4555,14 @@ if test "$have_jpeg" = no ; then
if test "$with_jpeg_req" = yes ; then
warnL 'Use of libjpeg was requested, but it was not found.'
elif test "$with_jpeg_req" = no ; then
- noteL 'The JPEG library is not being used.'
+ warnL 'The JPEG library is not being used.'
else
- noteL 'The JPEG library was not found.'
- fi
-
- if test "$jpeg_halfassed" = yes ; then
- echo ''
- warn2 'More specifically, we found the headers, but not the'
- warn2 'library; so either JPEG is half-installed on this'
- warn2 "system, or something else went wrong. The \`config.log'"
- warn2 'file might contain some clues.'
- echo ''
+ warnL 'The JPEG library was not found.'
fi
+ if test "$jpeg_halfassed" = yes ; then halfassery ; fi
if test "$have_gdk_pixbuf" = no ; then
+ echo ''
warn2 "This means that it won't be possible for the image-manipulating"
warn2 "display modes to load files from disk; and it also means that"
warn2 "the \`webcollage' program will be much slower."
@@ -4616,99 +4576,61 @@ if test "$have_png" = no ; then
if test "$with_png_req" = yes ; then
warnL 'Use of libpng was requested, but it was not found.'
elif test "$with_png_req" = no ; then
- noteL 'The PNG library is not being used.'
+ warnL 'The PNG library is not being used.'
else
- noteL 'The PNG library was not found.'
- fi
-
- if test "$png_halfassed" = yes ; then
- echo ''
- warn2 'More specifically, we found the headers, but not the'
- warn2 'library; so either PNG is half-installed on this'
- warn2 "system, or something else went wrong. The \`config.log'"
- warn2 'file might contain some clues.'
- echo ''
+ warnL 'The PNG library was not found.'
fi
+ if test "$png_halfassed" = yes ; then halfassery ; fi
warn2 "Many things aren't going to work right."
fi
-if test "$have_xft" = no ; then
- if test "$with_xft_req" = yes ; then
- warnL "Use of libXft was requested, but it was not found."
- elif test "$with_xft_req" = no ; then
- noteL 'The Xft library is not being used.'
- else
- noteL "The Xft library was not found."
- fi
+if test "$have_xinput" = no ; then
+ warnL 'The XInput2 library was not found. It is required.'
+ if test "$xinput_halfassed" = yes ; then halfassery ; else echo '' ; fi
+fi
- if test "$xft_halfassed" = yes ; then
- echo ''
- warn2 'More specifically, we found the headers, but not the'
- warn2 'libraries; so either Xft is half-installed on this'
- warn2 "system, or something else went wrong. The \`config.log'"
- warn2 'file might contain some clues.'
- echo ''
- fi
- warn2 "This means that fonts won't be anti-aliased."
+if test "$have_xft" = no ; then
+ warnL 'The XFreeType library was not found. It is required.'
+ if test "$xft_halfassed" = yes ; then halfassery ; else echo '' ; fi
fi
if test "$have_systemd" = no ; then
systemd_warned=no
- if test "$with_systemd_req" = yes ; then
+ if test "$systemd_too_old" = yes ; then
+ warnL "The systemd library is too old."
+ systemd_warned=yes
+ elif test "$with_systemd_req" = yes ; then
warnL "Use of systemd was requested, but it was not found."
systemd_warned=yes
- elif test "$with_systemd_req" = no ; then
+ elif test "$ac_macosx" = yes; then
true
- # noteL 'The systemd library is not being used.'
- # systemd_warned=yes
+ elif test "$with_systemd_req" = no ; then
+ noteL 'The systemd library is not being used.'
+ systemd_warned=yes
else
- true
- # noteL "The systemd library was not found."
- # systemd_warned=yes
+ warnL "The systemd library was not found."
+ systemd_warned=yes
fi
if test "$systemd_halfassed" = yes ; then
- echo ''
- warn2 'More specifically, we found the headers, but not the'
- warn2 'libraries; so either systemd is half-installed on this'
- warn2 "system, or something else went wrong. The \`config.log'"
- warn2 'file might contain some clues.'
- echo ''
+ halfassery
systemd_warned=yes
fi
if test "$systemd_warned" = yes; then
+ echo ''
warn2 "This means that xscreensaver-systemd won't be built."
+ warn2 "Without that, xscreensaver will not be able to auto-lock"
+ warn2 "before the system is suspended (e.g., closing laptop lid)"
+ warn2 "and might activate while video playback is in progress."
fi
fi
-if test "$have_gl" = yes -a "$ac_have_mesa_gl" = yes ; then
- preferred_mesagl=3.4
- mgv="$ac_mesagl_version_string"
- pgl="$preferred_mesagl"
-
- if test "$ac_mesagl_version" = unknown; then
- true
- # warnL "Unable to determine the MesaGL version number!"
- # warn2 "Make sure you are using version $preferred_mesagl or newer."
-
- elif test \! "$ac_mesagl_version" -gt 2006; then
- warnL "MesaGL version number is $mgv --"
- warn2 "MesaGL 2.6 and earlier have a security bug. It is strongly"
- warn2 "recommended that you upgrade to at least version $preferred_mesagl."
-
- elif test \! "$ac_mesagl_version" -gt 3003; then
- warnL "MesaGL version number is $mgv --"
- warn2 "MesaGL 3.3 and earlier have some bugs; it is recommended"
- warn2 "that you upgrade to $pgl or newer."
- fi
-fi
-
if test "$have_gl" = no ; then
if test "$with_gl_req" = yes ; then
warnL 'Use of GL was requested, but it was not found.'
@@ -4719,11 +4641,11 @@ if test "$have_gl" = no ; then
fi
if test "$gl_halfassed" = yes ; then
- echo ''
- warn2 'More specifically, we found the headers, but not the'
- warn2 'libraries; so either GL is half-installed on this'
- warn2 "system, or something else went wrong. The \`config.log'"
- warn2 'file might contain some clues.'
+ halfassery
+ if test "$have_glx" = no -a "$have_egl" = no; then
+ echo ''
+ warn2 'Neither EGL nor GLX were found.'
+ fi
fi
echo ''
@@ -4733,7 +4655,6 @@ if test "$have_gl" = no ; then
fi
-
if test "$have_gl" = yes -a "$have_gle" = no ; then
# nobody cares about this; don't print the warning unless it was
@@ -4752,13 +4673,7 @@ if test "$have_gl" = yes -a "$have_gle" = no ; then
warn2 'library was not.'
fi
- if test "$gle_halfassed" = yes ; then
- echo ''
- warn2 'More specifically, we found the headers, but not the'
- warn2 'libraries; so either GLE is half-installed on this'
- warn2 "system, or something else went wrong. The \`config.log'"
- warn2 'file might contain some clues.'
- fi
+ if test "$gle_halfassed" = yes ; then halfassery ; fi
echo ''
warn2 'Some of the OpenGL (3D) demos (those that depend on GLE)'
@@ -4780,6 +4695,12 @@ fi
if test "$with_pam_req" = yes -a "$have_pam" = no ; then
warn 'Use of PAM was requested, but it was not found.'
+elif test "$have_pam" = no ; then
+ if test -d /etc/pam.d -o -f /etc/pam.conf ; then
+ warn "Your system seems to have PAM, but PAM is not being used."
+ warn2 "That is probably not going to work out well."
+
+ fi
fi
if test "$with_shadow_req" = yes -a "$have_shadow" = no ; then
@@ -4790,32 +4711,38 @@ if test "$setcap_hacks_req" = yes -a "$have_libcap" = no ; then
warn 'Use of libcap was requested, but it was not found.'
fi
-if test "$ac_macosx" = yes ; then
- if test "$enable_locking" = yes ; then
- warn "You have specified --enable-locking on MacOS X."
- warn2 "THIS DOES NOT WORK! Don't do this!"
- fi
+if test "$ac_macosx" = yes -a "$enable_locking" = yes ; then
+ warn "You have specified --enable-locking on macOS."
+ warn2 "THIS DOES NOT WORK! Don't do this!"
fi
# You are in a twisty maze of namespaces and syntaxes, all alike.
+# Expand all of these as the Makefile will probably expand them.
# Fuck the skull of Unix.
#
bindir=`eval eval eval eval eval eval eval echo $bindir`
HACKDIR=`eval eval eval eval eval eval eval echo $HACKDIR`
HACK_CONF_DIR=`eval eval eval eval eval eval eval echo $HACK_CONF_DIR`
+FONT_DIR=`eval eval eval eval eval eval eval echo $FONT_DIR`
# canonicalize slashes.
bindir=`echo "${bindir}" | sed 's@/$@@;s@//*@/@g'`
HACKDIR=`echo "${HACKDIR}" | sed 's@/$@@;s@//*@/@g'`
HACK_CONF_DIR=`echo "${HACK_CONF_DIR}" | sed 's@/$@@;s@//*@/@g'`
+FONT_DIR=`echo "${FONT_DIR}" | sed 's@/$@@;s@//*@/@g'`
+if test -z "$FONT_DIR" ; then
+ FONT_DIR='not installed';
+else
+ FONT_DIR="${FONT_DIR}/"
+fi
# Sanity check the hackdir
-for bad_choice in xscreensaver xscreensaver-demo xscreensaver-command ; do
+for bad_choice in xscreensaver xscreensaver-settings xscreensaver-command ; do
if test "${HACKDIR}" = "${bindir}/${bad_choice}" ; then
echo ""
- AC_MSG_ERROR([\"--with-hackdir=${bindir}/${bad_choice}\" won't work.
+ AC_MSG_ERROR(["--with-hackdir=${bindir}/${bad_choice}" won't work.
There will be an executable installed with that name, so
that can't be the name of a directory as well. Please
re-configure with a different directory name.])
@@ -4823,106 +4750,110 @@ for bad_choice in xscreensaver xscreensaver-demo xscreensaver-command ; do
done
-do_dir_warning=no
-
-# Now let's warn if there's a previous RPM version already installed.
-# But don't bother with this test if we are currently *building* an RPM.
+# Warn if there's a previous RPM package installed.
+rpm_vers=
if test -z "$RPM_PACKAGE_VERSION" ; then
-
- rpmnames="xscreensaver xscreensaver-base xscreensaver-extras"
+ # Don't bother with this test if we are currently *building* an RPM.
+ rpmnames="xscreensaver xscreensaver-base xscreensaver-extras
+ xscreensaver-data xscreensaver-data-extra"
# M4 sucks!!
changequote(X,Y)
- rpmv=`(rpm -qv $rpmnames) 2>/dev/null | \
- sed -n 's/^[-a-z]*-\([0-9][0-9]*[.][0-9][0-9a-z]*\)-.*$/\1/p' | \
- head -1`
+ pkg_vers=`(rpm -qv $rpmnames) 2>&- | \
+ sed -n 's/^[-a-z]*-\([0-9][0-9]*[.].*\)/\1/p' | head -1`
+ rpm_vers="$pkg_vers"
changequote([,])
+fi
- if test \! -z "$rpmv" ; then
- rpmbdir=`rpm -ql $rpmnames | sed -n 's@^\(.*\)/xscreensaver-demo$@\1@p'`
- rpmhdir=`rpm -ql $rpmnames | sed -n 's@^\(.*\)/popsquares$@\1@p'`
+if test \! -z "$rpm_vers" ; then
- warning=no
- warnL "There is already an installed RPM of xscreensaver $rpmv"
- warn2 'on this system. You might want to remove it ("rpm -ve")'
- warn2 'before running "make install" in this directory.'
- echo ""
- warn2 "Alternately, you could build this version of xscreensaver"
- warn2 'as an RPM, and then install that. An "xscreensaver.spec"'
- warn2 'file is included. Try "rpmbuild -v -ba xscreensaver.spec".'
- warn2 "See the RPM documentation for more info."
- echo ""
+ # M4 sucks!!
+ changequote(A,B)
+ pkg_bindir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)xscreensaver-settings$@\1@p'`
+ pkg_bindir2=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)xscreensaver-demo$@\1@p'`
+ pkg_hackdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)popsquares$@\1@p'`
+ pkg_confdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)popsquares\.xml$@\1@p'`
+ pkg_fontdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)\.ttf$@\1@p'`
+ pkg_addir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)XScreenSaver$@\1@p'`
+
+ if test -z "$pkg_bindir" ; then pkg_bindir="$pkg_bindir2" ; fi
+ changequote([,])
+fi
- if test "$rpmbdir" = "$rpmhdir" ; then
- warn2 "The RPM version was installed in $rpmbdir/."
- do_dir_warning=yes
- else
- warn2 "The RPM version was installed in $rpmbdir/,"
- warn2 "with demos in $rpmhdir/."
+
+# Warn if there's a previous Debian package installed.
+#
+deb_vers=
+if test -z "$pkg_vers" ; then
+ debnames="xscreensaver xscreensaver-data xscreensaver-data-extra"
+ pkg_vers=''
+ for dpkg in $debnames ; do
+ if test -z "$pkg_vers"; then
+ pkg_vers=`dpkg -s $dpkg 2>/dev/null | sed -n 's/^Version: \(.*\)$/\1/p'`
+ deb_vers="$pkg_vers"
fi
- fi
+ done
fi
-# Also warn if there's a Debian package installed.
-#
-debnames="xscreensaver xscreensaver-data xscreensaver-data-extra"
-debv=''
-for dpkg in $debnames ; do
- if test -z "$debv"; then
- debv=`dpkg -s $dpkg 2>/dev/null | sed -n 's/^Version: \(.*\)$/\1/p'`
- fi
-done
+if test \! -z "$deb_vers" ; then
-if test \! -z "$debv" ; then
- debbdir=`dpkg -L $debnames 2>/dev/null | \
- sed -n 's@^\(.*/bin/\)xscreensaver$@\1@p'`
- debhdir=`dpkg -L $debnames 2>/dev/null | \
- sed -n 's@^\(.*/\)popsquares$@\1@p'`
- if test -z "$debbdir" ; then debbdir='???'; fi
- if test -z "$debhdir" ; then debhdir='???'; fi
+ # M4 sucks!!
+ changequote(A,B)
+ pkg_bindir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)xscreensaver-settings$@\1@p'`
+ pkg_bindir2=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)xscreensaver-demo$@\1@p'`
+ pkg_hackdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)popsquares$@\1@p'`
+ pkg_confdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)popsquares\.xml$@\1@p'`
+ pkg_fontdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)\.ttf$@\1@p'`
+ pkg_addir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)XScreenSaver[^/]*$@\1@p'`
+ changequote([,])
- warning=no
- warnL "There is already an installed dpkg of xscreensaver"
- warn2 "version \"$debv\" on this system."
- echo ""
- warn2 "The dpkg was installed in $debbdir,"
- warn2 "with demos in $debhdir."
+ if test -z "$pkg_bindir" ; then pkg_bindir="$pkg_bindir2" ; fi
fi
+bindir_err=
+hackdir_err=
+confdir_err=
+fontdir_err=
+addir_err=
+if ! test -z "$pkg_vers" ; then
-if test "${bindir}" = "${HACKDIR}" ; then
- do_dir_warning=yes
-fi
+ err=" (DIFFERS)"
-if test "$do_dir_warning" = yes; then
- echo ""
- echo "$warnsep"
- echo ""
- echo ' When you run "make install", the "xscreensaver",'
- echo ' "xscreensaver-demo", and "xscreensaver-command" executables'
- echo " will be installed in ${bindir}/."
- echo ""
- echo " The various graphics demos (200+ different executables) will"
- echo " be installed in ${HACKDIR}/."
- echo ""
- echo " If you would prefer the demos to be installed elsewhere,"
- echo " you should re-run configure with the --with-hackdir=DIR"
- echo " option. For more information, run \`./configure --help'."
- warning=yes
-fi
+ if test -z "$pkg_bindir" ; then pkg_bindir='???'
+ elif test "$pkg_bindir" != "${bindir}/" ; then bindir_err="$err" ; fi
-if test "$warning" != no; then
- echo '' ; echo "$warnsep" ; echo ''
-fi
+ if test -z "$pkg_hackdir" ; then pkg_hackdir='???'
+ elif test "$pkg_hackdir" != "${HACKDIR}/" ; then hackdir_err="$err"; fi
-if test "$do_dir_warning" = no; then
- if test "$warning" = no; then
- echo ''
- fi
- echo "User programs will be installed in ${bindir}/"
- echo "Screen savers will be installed in ${HACKDIR}/"
- echo "Configuration dialogs will be installed in ${HACK_CONF_DIR}/"
- echo "System-wide default settings will be installed in ${APPDEFAULTS}/"
- echo ''
-fi
+ if test -z "$pkg_confdir" ; then pkg_confdir='???'
+ elif test "$pkg_confdir" != "${HACK_CONF_DIR}/" ; then confdir_err="$err"; fi
+
+ if test -z "$pkg_fontdir" ; then pkg_fontdir='none'
+ elif test "$pkg_fontdir/" != "${FONT_DIR}" ; then fontdir_err="$err"; fi
+
+ if test -z "$pkg_addir" ; then pkg_addir='???'
+ elif test "$pkg_addir" != "${APPDEFAULTS}/" ; then addir_err="$err" ; fi
+
+ warning=no
+ warnL "There is already an installed package of xscreensaver"
+ warn2 "version \"$pkg_vers\", in these directories:"
+ echo ""
+ warn2 "User programs: $pkg_bindir$bindir_err"
+ warn2 "Screen savers: $pkg_hackdir$hackdir_err"
+ warn2 "Configuration: $pkg_confdir$confdir_err"
+ warn2 "Extra fonts: $pkg_fontdir$fontdir_err"
+ warn2 "App Defaults: $pkg_addir$addir_err"
+fi
+
+echo ""
+echo "$warnsep"
+echo ""
+echo " XScreenSaver will be installed in these directories:"
+echo ""
+echo " User programs: ${bindir}/$bindir_err"
+echo " Screen savers: ${HACKDIR}/$hackdir_err"
+echo " Configuration: ${HACK_CONF_DIR}/$confdir_err"
+echo " Extra Fonts: ${FONT_DIR}$fontdir_err"
+echo " App Defaults: ${APPDEFAULTS}/$addir_err"
+echo ""
diff --git a/driver/Makefile.in b/driver/Makefile.in
index 7baf504..0e986a9 100644
--- a/driver/Makefile.in
+++ b/driver/Makefile.in
@@ -1,9 +1,9 @@
-# driver/Makefile.in --- xscreensaver, Copyright (c) 1997-2010 Jamie Zawinski.
+# driver/Makefile.in --- xscreensaver, Copyright © 1997-2021 Jamie Zawinski.
# the `../configure' script generates `driver/Makefile' from this file.
@SET_MAKE@
.SUFFIXES:
-.SUFFIXES: .c .m .o
+.SUFFIXES: .c .m .o .desktop .desktop.in
srcdir = @srcdir@
VPATH = @srcdir@
@@ -19,42 +19,36 @@ datadir = @datadir@
localedir = @PO_DATADIR@/locale
mandir = @mandir@
libexecdir = @libexecdir@
-mansuffix = 1
-manNdir = $(mandir)/man$(mansuffix)
+sysconfdir = @sysconfdir@
-INTLTOOL_MERGE = @INTLTOOL_MERGE@
+# A = suffix for user commands in /usr/bin/
+# B = suffix for helper programs in /usr/libexec/xscreensaver/
+mansuffixA = 1
+mansuffixB = 6
GTK_DATADIR = @GTK_DATADIR@
GTK_APPDIR = $(GTK_DATADIR)/applications
GTK_ICONDIR = $(GTK_DATADIR)/pixmaps
-GTK_GLADEDIR = $(GTK_DATADIR)/xscreensaver/glade
+GTK_UIDIR = $(GTK_DATADIR)/xscreensaver/ui
+
+HACKDIR = @HACKDIR@
HACK_CONF_DIR = @HACK_CONF_DIR@
CC = @CC@
-OBJCC = @OBJCC@
CFLAGS = @CFLAGS@
LDFLAGS = @LDFLAGS@
DEFS = @DEFS@
-INTL_DEFS = -DLOCALEDIR=\"$(localedir)\"
-SUBP_DEFS = $(DEFS) -DDEFAULT_PATH_PREFIX='"@HACKDIR@"'
-GTK_DEFS = $(DEFS) -DDEFAULT_ICONDIR='"$(GTK_GLADEDIR)"'
-CONF_DEFS = -DHACK_CONFIGURATION_PATH='"$(HACK_CONF_DIR)"'
LIBS = @LIBS@
-INTL_LIBS = @INTLLIBS@
-JPEG_LIBS = @JPEG_LIBS@
-PERL = @PERL@
DEPEND = @DEPEND@
DEPEND_FLAGS = @DEPEND_FLAGS@
DEPEND_DEFINES = @DEPEND_DEFINES@
-SHELL = /bin/sh
INSTALL = @INSTALL@
SUID_FLAGS = -o root -m 4755
INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_SETUID = @INSTALL_SETUID@
+INSTALL_SETUID = $(INSTALL_PROGRAM) $(SUID_FLAGS)
INSTALL_DATA = @INSTALL_DATA@
INSTALL_DIRS = @INSTALL_DIRS@
@@ -62,8 +56,11 @@ X_CFLAGS = @X_CFLAGS@
X_LIBS = @X_LIBS@
X_PRE_LIBS = @X_PRE_LIBS@
X_EXTRA_LIBS = @X_EXTRA_LIBS@
-XMU_LIBS = @XMU_LIBS@
PNG_LIBS = @PNG_LIBS@
+XFT_LIBS = @XFT_LIBS@
+
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTL_LIBS = @INTLLIBS@
# Note:
#
@@ -74,15 +71,18 @@ PNG_LIBS = @PNG_LIBS@
# (e.g., -lsocket, -lnsl, etc.)
#
# I think (but am not totally sure) that LIBS is also really "LDFLAGS".
-#
-# SAVER_LIBS is the link line for "xscreensaver", and
-# CMD_LIBS is the link line for "xscreensaver-command".
-# GETIMG_LIBS is the link line for "xscreensaver-getimage".
AD_DIR = @APPDEFAULTS@
-PAM_DIR = /etc/pam.d
-PAM_CONF = /etc/pam.conf
+
+# $(sysconfdir) is either /usr/local/etc or /usr/etc but this must be /etc.
+PAM_ROOT = /etc
+PAM_DIR = $(PAM_ROOT)/pam.d
+PAM_CONF = $(PAM_ROOT)/pam.conf
+
+ICON_SRC = $(UTILS_SRC)/images
+LOGO = $(ICON_SRC)/logo-50.xpm
+GTK_ICONS = $(ICON_SRC)/screensaver-*.png
UTILS_SRC = $(srcdir)/../utils
UTILS_BIN = ../utils
@@ -90,11 +90,40 @@ UTILS_BIN = ../utils
INCLUDES_1 = -I. -I$(srcdir) -I$(UTILS_SRC) -I..
INCLUDES = $(INCLUDES_1) @INCLUDES@
-MOTIF_SRCS = demo-Xm.c demo-Xm-widgets.c
-MOTIF_OBJS = demo-Xm.o demo-Xm-widgets.o
+LIBS_PRE = $(LIBS) $(X_LIBS) $(X_PRE_LIBS)
+LIBS_POST = $(X_EXTRA_LIBS)
-GTK_SRCS = demo-Gtk.c demo-Gtk-conf.c
-GTK_OBJS = demo-Gtk.o demo-Gtk-conf.o @GTK_EXTRA_OBJS@
+XDPMS_LIBS = @XDPMS_LIBS@
+XINERAMA_LIBS = @XINERAMA_LIBS@ $(FIXME)
+XINPUT_LIBS = -lXi
+XML_LIBS = @XML_LIBS@
+
+DAEMON_DEFS = -DDEFAULT_PATH_PREFIX='"@HACKDIR@"' -DAD_DIR='"$(AD_DIR)"'
+DAEMON_SRCS = xscreensaver.c blurb.c atoms.c clientmsg.c xinput.c prefs.c
+DAEMON_OBJS = xscreensaver.o blurb.o atoms.o clientmsg.o xinput.o prefs.o \
+ $(UTILS_BIN)/xmu.o
+DAEMON_LIBS = $(LIBS_PRE) $(XINPUT_LIBS) -lX11 $(LIBS_POST)
+
+GFX_DEFS = -DLOCALEDIR=\"$(localedir)\"
+GFX_SRCS = xscreensaver-gfx.c screens.c windows.c subprocs.c \
+ exec.c prefsw.c dpms.c fade.c exts.c atomswm.c
+GFX_OBJS = xscreensaver-gfx.o screens.o windows.o subprocs.o \
+ exec.o prefsw.o dpms.o fade.o exts.o atomswm.o \
+ prefs.o blurb.o atoms.o clientmsg.o xinput.o \
+ $(UTILS_BIN)/xmu.o \
+ $(UTILS_BIN)/yarandom.o \
+ $(UTILS_BIN)/resources.o \
+ $(UTILS_BIN)/visual.o \
+ $(UTILS_BIN)/usleep.o \
+ $(UTILS_BIN)/font-retry.o \
+ $(UTILS_BIN)/logo.o \
+ $(UTILS_BIN)/minixpm.o \
+ $(UTILS_BIN)/xft.o \
+ $(UTILS_BIN)/utf8wc.o \
+ $(UTILS_BIN)/xshm.o \
+ $(UTILS_BIN)/aligned_malloc.o
+GFX_LIBS = $(LIBS_PRE) $(XFT_LIBS) $(XDPMS_LIBS) $(XINERAMA_LIBS) \
+ @SAVER_LIBS@ -lXt -lX11 -lXext -lXi $(LIBS_POST) $(INTL_LIBS)
PWENT_SRCS = passwd-pwent.c
PWENT_OBJS = passwd-pwent.o
@@ -108,209 +137,186 @@ PAM_OBJS = passwd-pam.o
PWHELPER_SRCS = passwd-helper.c
PWHELPER_OBJS = passwd-helper.o
-LOCK_SRCS_1 = lock.c passwd.c
-LOCK_OBJS_1 = lock.o passwd.o
-NOLOCK_SRCS_1 = lock.c
-NOLOCK_OBJS_1 = lock.o
-
-SYSTEMD_SRCS = xscreensaver-systemd.c
-SYSTEMD_OBJS = xscreensaver-systemd.o
-SYSTEMD_LIBS = -lsystemd
-
-TEST_SRCS = test-passwd.c test-uid.c test-xdpms.c test-grab.c \
- test-apm.c test-fade.c test-xinerama.c test-vp.c \
- test-randr.c xdpyinfo.c test-mlstring.c test-screens.c \
- test-yarandom.c
-TEST_EXES = test-passwd test-uid test-xdpms test-grab \
- test-apm test-fade test-xinerama test-vp \
- test-randr xdpyinfo test-mlstring test-screens \
- test-yarandom
-
-MOTIF_LIBS = @MOTIF_LIBS@ @PNG_LIBS@ $(XMU_LIBS)
-GTK_LIBS = @GTK_LIBS@ $(XMU_LIBS)
-XML_LIBS = @XML_LIBS@
-
-XDPMS_LIBS = @XDPMS_LIBS@
-XINERAMA_LIBS = @XINERAMA_LIBS@
-XINPUT_LIBS = @XINPUT_LIBS@
-
PASSWD_SRCS = @PASSWD_SRCS@
PASSWD_OBJS = @PASSWD_OBJS@
-PASSWD_LIBS = @PASSWD_LIBS@
LOCK_SRCS = @LOCK_SRCS@
LOCK_OBJS = @LOCK_OBJS@
-XMU_SRCS = @XMU_SRCS@
-XMU_OBJS = @XMU_OBJS@
-
-GL_SRCS = @SAVER_GL_SRCS@
-GL_OBJS = @SAVER_GL_OBJS@
-GL_LIBS = @SAVER_GL_LIBS@
-
-ICON_SRC = $(UTILS_SRC)/images
-LOGO = $(ICON_SRC)/logo-50.xpm
-GTK_ICONS = $(ICON_SRC)/screensaver-*.png
-DEMO_UTIL_SRCS = $(UTILS_SRC)/resources.c $(UTILS_SRC)/usleep.c \
- $(UTILS_SRC)/visual.c $(XMU_SRCS)
-DEMO_UTIL_OBJS = $(UTILS_BIN)/resources.o $(UTILS_BIN)/usleep.o \
- $(UTILS_BIN)/visual.o $(XMU_OBJS)
-
-SAVER_UTIL_SRCS = $(UTILS_SRC)/fade.c $(UTILS_SRC)/overlay.c \
- $(UTILS_SRC)/logo.c $(UTILS_SRC)/yarandom.c \
- $(UTILS_SRC)/minixpm.c $(UTILS_SRC)/font-retry.c \
- $(DEMO_UTIL_SRCS)
-SAVER_UTIL_OBJS = $(UTILS_BIN)/fade.o $(UTILS_BIN)/overlay.o \
- $(UTILS_BIN)/logo.o $(UTILS_BIN)/yarandom.o \
- $(UTILS_BIN)/minixpm.o $(UTILS_BIN)/font-retry.o \
- $(DEMO_UTIL_OBJS)
-
-GETIMG_SRCS_1 = xscreensaver-getimage.c
-GETIMG_OBJS_1 = xscreensaver-getimage.o
-
-GETIMG_SRCS = $(GETIMG_SRCS_1) \
- $(UTILS_BIN)/colorbars.o $(UTILS_BIN)/resources.o \
- $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/visual.o \
- $(UTILS_BIN)/usleep.o $(UTILS_BIN)/hsv.o \
- $(UTILS_BIN)/colors.o $(UTILS_BIN)/grabscreen.o \
- $(UTILS_BIN)/logo.o $(UTILS_BIN)/minixpm.o prefs.o \
- $(XMU_SRCS)
-
-GETIMG_OBJS = $(GETIMG_OBJS_1) \
- $(UTILS_BIN)/colorbars.o $(UTILS_BIN)/resources.o \
- $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/visual.o \
- $(UTILS_BIN)/usleep.o $(UTILS_BIN)/hsv.o \
- $(UTILS_BIN)/colors.o $(UTILS_BIN)/grabscreen.o \
- $(UTILS_BIN)/logo.o $(UTILS_BIN)/minixpm.o prefs.o \
- $(XMU_OBJS)
-
-SAVER_SRCS_1 = xscreensaver.c windows.c screens.c timers.c subprocs.c \
- exec.c xset.c splash.c setuid.c stderr.c mlstring.c
-SAVER_OBJS_1 = xscreensaver.o windows.o screens.o timers.o subprocs.o \
- exec.o xset.o splash.o setuid.o stderr.o mlstring.o
-
-SAVER_SRCS = $(SAVER_SRCS_1) prefs.c dpms.c $(LOCK_SRCS) \
- $(SAVER_UTIL_SRCS) $(GL_SRCS)
-SAVER_OBJS = $(SAVER_OBJS_1) prefs.o dpms.o $(LOCK_OBJS) \
- $(SAVER_UTIL_OBJS) $(GL_OBJS)
+AUTH_DEFS = -DLOCALEDIR=\"$(localedir)\" -DAD_DIR='"$(AD_DIR)"'
+AUTH_SRCS = xscreensaver-auth.c dialog.c passwd.c setuid.c
+AUTH_OBJS = xscreensaver-auth.o $(AUTH_OBJS_1)
+AUTH_OBJS_1 = dialog.o passwd.o setuid.o \
+ @PASSWD_OBJS@ \
+ blurb.o screens.o xinput.o prefs.o atoms.o atomswm.o \
+ $(UTILS_BIN)/xft.o \
+ $(UTILS_BIN)/xftwrap.o \
+ $(UTILS_BIN)/utf8wc.o \
+ $(UTILS_BIN)/font-retry.o \
+ $(UTILS_BIN)/yarandom.o \
+ $(UTILS_BIN)/usleep.o \
+ $(UTILS_BIN)/resources.o \
+ $(UTILS_BIN)/logo.o \
+ $(UTILS_BIN)/minixpm.o
+AUTH_LIBS = $(LIBS_PRE) $(XFT_LIBS) $(XINPUT_LIBS) $(XINERAMA_LIBS) \
+ @SAVER_LIBS@ -lXt -lX11 -lXext -lXi \
+ @PASSWD_LIBS@ $(LIBS_POST) $(INTL_LIBS)
+
+SYSTEMD_DEFS =
+SYSTEMD_SRCS = xscreensaver-systemd.c
+SYSTEMD_OBJS = xscreensaver-systemd.o blurb.o $(UTILS_BIN)/yarandom.o
+SYSTEMD_LIBS = $(LIBS_PRE) @SYSTEMD_LIBS@ -lX11 $(LIBS_POST)
+CMD_DEFS =
CMD_SRCS = remote.c xscreensaver-command.c
-CMD_OBJS = remote.o xscreensaver-command.o
-
-DEMO_SRCS_1 = prefs.c dpms.c
-DEMO_OBJS_1 = prefs.o dpms.o
-
-DEMO_SRCS = $(DEMO_SRCS_1) remote.c exec.c $(DEMO_UTIL_SRCS)
-DEMO_OBJS = $(DEMO_OBJS_1) remote.o exec.o $(DEMO_UTIL_OBJS)
-
-PDF2JPEG_SRCS = pdf2jpeg.m
-PDF2JPEG_OBJS = pdf2jpeg.o
-PDF2JPEG_LIBS = -framework Cocoa
-
-SAVER_LIBS = $(LIBS) $(X_LIBS) $(XMU_LIBS) @SAVER_LIBS@ \
- $(XDPMS_LIBS) $(XINERAMA_LIBS) $(GL_LIBS) $(X_PRE_LIBS) \
- -lXt -lX11 -lXext $(X_EXTRA_LIBS) \
- $(PASSWD_LIBS) $(INTL_LIBS)
-
-CMD_LIBS = $(LIBS) $(X_LIBS) \
- $(X_PRE_LIBS) -lX11 -lXext $(X_EXTRA_LIBS)
-
-GETIMG_LIBS = $(LIBS) $(X_LIBS) $(PNG_LIBS) $(JPEG_LIBS) \
- $(X_PRE_LIBS) -lXt -lX11 $(XMU_LIBS) -lXext $(X_EXTRA_LIBS)
-
-EXES = xscreensaver xscreensaver-command xscreensaver-demo \
- xscreensaver-getimage @EXES_OSX@ @EXES_SYSTEMD@
-EXES2 = @ALL_DEMO_PROGRAMS@
-EXES_OSX = pdf2jpeg
+CMD_OBJS = remote.o xscreensaver-command.o blurb.o atoms.o clientmsg.o
+CMD_LIBS = $(LIBS_PRE) $(XINPUT_LIBS) -lX11 -lXext $(LIBS_POST)
+
+GTK_DEFS = -DHACK_CONFIGURATION_PATH='"$(HACK_CONF_DIR)"' \
+ -DDEFAULT_PATH_PREFIX='"@HACKDIR@"' \
+ -DDEFAULT_ICONDIR='"$(GTK_UIDIR)"' \
+ -DLOCALEDIR=\"$(localedir)\" \
+ -I$(ICON_SRC)
+GTK_SRCS = demo-Gtk.c demo-Gtk-conf.c
+GTK_OBJS = demo-Gtk.o demo-Gtk-conf.o \
+ blurb.o exec.o prefs.o prefsw.o dpms.o remote.o \
+ clientmsg.o atoms.o \
+ $(UTILS_BIN)/xmu.o \
+ $(UTILS_BIN)/resources.o \
+ $(UTILS_BIN)/visual.o \
+ $(UTILS_BIN)/usleep.o
+GTK_LIBS = $(LIBS_PRE) $(INTL_LIBS) $(XDPMS_LIBS) \
+ $(XINERAMA_LIBS) $(XML_LIBS) @GTK_LIBS@ \
+ -lXt -lX11 -lXext -lXi $(LIBS_POST)
+
+MOTIF_DEFS = -DHACK_CONFIGURATION_PATH='"$(HACK_CONF_DIR)"' \
+ -DDEFAULT_PATH_PREFIX='"@HACKDIR@"'
+MOTIF_SRCS = demo-Xm.c demo-Xm-widgets.c
+MOTIF_OBJS = demo-Xm.o demo-Xm-widgets.o \
+ blurb.o exec.o prefs.o prefsw.o dpms.o remote.o \
+ clientmsg.o atoms.o \
+ $(UTILS_BIN)/xmu.o \
+ $(UTILS_BIN)/resources.o \
+ $(UTILS_BIN)/visual.o \
+ $(UTILS_BIN)/usleep.o
+MOTIF_LIBS = $(LIBS_PRE) $(XDPMS_LIBS) $(XDPMS_LIBS) @MOTIF_LIBS@ \
+ @PNG_LIBS@ -lXt -lX11 -lXext -lXi $(LIBS_POST)
+
+TEST_SRCS = test-passwd.c test-uid.c test-xdpms.c test-grab.c \
+ test-fade.c test-xinerama.c test-vp.c test-randr.c \
+ xdpyinfo.c test-screens.c test-yarandom.c test-xinput.c \
+ test-xkb.c
+TEST_EXES = test-passwd test-uid test-xdpms test-grab \
+ test-fade test-xinerama test-vp test-randr \
+ xdpyinfo test-screens test-yarandom test-xinput \
+ test-xkb
+
+EXES = xscreensaver xscreensaver-command xscreensaver-settings
+UTIL_EXES = xscreensaver-gfx @EXES_SYSTEMD@
+SETUID_EXES = xscreensaver-auth
+DEMO_EXES = @ALL_DEMO_PROGRAMS@
EXES_SYSTEMD = xscreensaver-systemd
-SCRIPTS_1 = xscreensaver-getimage-file xscreensaver-getimage-video \
- xscreensaver-text
-SCRIPTS_OSX = xscreensaver-getimage-desktop
-SCRIPTS = $(SCRIPTS_1) @SCRIPTS_OSX@
-
HDRS = XScreenSaver_ad.h XScreenSaver_Xm_ad.h \
xscreensaver.h prefs.h remote.h exec.h \
- demo-Gtk-conf.h auth.h mlstring.h types.h
-MEN_1 = xscreensaver.man xscreensaver-demo.man \
- xscreensaver-command.man \
- xscreensaver-text.man \
- xscreensaver-getimage.man \
- xscreensaver-getimage-file.man \
- xscreensaver-getimage-video.man \
- xscreensaver-systemd.man
-MEN_OSX = xscreensaver-getimage-desktop.man pdf2jpeg.man
-MEN = $(MEN_1) @MEN_OSX@
+ demo-Gtk-conf.h auth.h types.h blurb.h atoms.h clientmsg.h \
+ screens.h xinput.h fade.h
+MENA = xscreensaver.man xscreensaver-settings.man \
+ xscreensaver-command.man
+MENB = xscreensaver-gfx.man xscreensaver-auth.man \
+ xscreensaver-command.man xscreensaver-systemd.man
EXTRAS = README Makefile.in \
XScreenSaver.ad.in XScreenSaver-Xm.ad xscreensaver.pam.in \
- xscreensaver-demo.glade2.in xscreensaver-demo.glade2p \
- screensaver-properties.desktop.in \
+ xscreensaver.ui screensaver-properties.desktop.in \
.gdbinit
-VMSFILES = compile_axp.com compile_decc.com link_axp.com link_decc.com \
- vms-getpwnam.c vms-pwd.h vms-hpwd.c vms-validate.c \
- vms_axp.opt vms_axp_12.opt vms_decc.opt vms_decc_12.opt
-TARFILES = $(EXTRAS) $(VMSFILES) $(SAVER_SRCS_1) $(SYSTEMD_SRCS) \
- $(MOTIF_SRCS) $(GTK_SRCS) $(PWENT_SRCS) $(PWHELPER_SRCS) \
- $(KERBEROS_SRCS) $(PAM_SRCS) $(LOCK_SRCS_1) $(DEMO_SRCS_1) \
- $(CMD_SRCS) $(GETIMG_SRCS_1) $(PDF2JPEG_SRCS) $(HDRS) \
- $(SCRIPTS_1) $(SCRIPTS_OSX) $(MEN_1) $(MEN_OSX) \
- $(TEST_SRCS)
+TARFILES = $(DAEMON_SRCS) $(GFX_SRCS) $(AUTH_SRCS) $(SYSTEMD_SRCS) \
+ $(CMD_SRCS) $(GTK_SRCS) $(MOTIF_SRCS) $(PWENT_SRCS) \
+ $(PWHELPER_SRCS) $(KERBEROS_SRCS) $(PAM_SRCS) \
+ $(HDRS) $(MENA) $(MENB) $(TEST_SRCS) $(EXTRAS)
+default: $(EXES) $(UTIL_EXES) $(SETUID_EXES)
+all: $(EXES) $(UTIL_EXES) $(SETUID_EXES) $(DEMO_EXES)
+tests: $(TEST_EXES)
-default: $(EXES)
-all: $(EXES) $(EXES2)
-tests: $(TEST_EXES)
-install: install-program install-ad install-scripts \
- install-gnome install-man install-xml install-pam
-uninstall: uninstall-program uninstall-ad \
- uninstall-gnome uninstall-man uninstall-xml
+##############################################################################
+#
+# Installation
+#
+##############################################################################
-install-strip:
- $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \
- install
+install: install-program install-ad install-man install-xml \
+ install-pam install-gnome
+uninstall: uninstall-program uninstall-ad uninstall-man uninstall-xml \
+ uninstall-gnome
-install-program: $(EXES)
- @if [ ! -d $(install_prefix)$(bindir) ]; then \
- $(INSTALL_DIRS) $(install_prefix)$(bindir) ; \
+install-strip:
+ $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install
+
+install-program:: $(EXES)
+ @if [ ! -d $(install_prefix)$(bindir) ]; then \
+ $(INSTALL_DIRS) $(install_prefix)$(bindir) ; \
+ fi ; \
+ if [ ! -d $(install_prefix)$(HACKDIR) ]; then \
+ $(INSTALL_DIRS) $(install_prefix)$(HACKDIR) ; \
fi
- @inst="$(INSTALL_PROGRAM)" ; \
- if [ @NEED_SETUID@ = yes ]; then \
- me=`PATH="$$PATH:/usr/ucb" whoami` ; \
- if [ "$$me" = root ]; then \
- inst="$(INSTALL_SETUID)" ; \
- else \
- e=echo ; \
- $$e "" ;\
- $$e " ####################################################################";\
- $$e " Warning: xscreensaver has been compiled with support for shadow" ;\
- $$e " passwords. If your system actually uses shadow passwords," ;\
- $$e " then xscreensaver must be installed as a setuid root" ;\
- $$e " program in order for locking to work. To do this, you" ;\
- $$e " must run 'make install' as 'root', not as '$$me'." ;\
- $$e "" ;\
- $$e " For now, xscreensaver will be installed non-setuid, which" ;\
- $$e " means that locking might not work. (Try it and see.)" ;\
- $$e " ####################################################################";\
- $$e "" ;\
- fi ; \
- fi ; \
- echo $$inst xscreensaver $(install_prefix)$(bindir)/xscreensaver ; \
- $$inst xscreensaver $(install_prefix)$(bindir)/xscreensaver
- @for exe in xscreensaver-command xscreensaver-demo \
- xscreensaver-getimage @EXES_OSX@ @EXES_SYSTEMD@ ; do \
- echo $(INSTALL_PROGRAM) $$exe $(install_prefix)$(bindir)/$$exe ; \
- $(INSTALL_PROGRAM) $$exe $(install_prefix)$(bindir)/$$exe ; \
+
+install-program:: $(EXES)
+ @inst="$(INSTALL_PROGRAM)" ; \
+ for exe in $(EXES); do \
+ echo $$inst $$exe $(install_prefix)$(bindir)/$$exe ; \
+ $$inst $$exe $(install_prefix)$(bindir)/$$exe ; \
+ done
+
+install-program:: $(UTIL_EXES)
+ @inst="$(INSTALL_PROGRAM)" ; \
+ for exe in $(UTIL_EXES); do \
+ echo $$inst $$exe $(install_prefix)$(HACKDIR)/$$exe ; \
+ $$inst $$exe $(install_prefix)$(HACKDIR)/$$exe ; \
done
+install-program:: $(SETUID_EXES)
+ @inst="$(INSTALL_PROGRAM)" ; \
+ idir="$(install_prefix)$(HACKDIR)" ; \
+ if [ @SETUID_AUTH@ = yes ]; then \
+ inst="$(INSTALL_SETUID)" ; \
+ else \
+ inst="$(INSTALL_PROGRAM)" ; \
+ fi ; \
+ for exe in $(SETUID_EXES); do \
+ echo $$inst $$exe $$idir/$$exe ; \
+ if $$inst $$exe $$idir/$$exe ; then \
+ true ; \
+ elif [ @SETUID_AUTH@ = yes ]; then \
+ echo $(INSTALL_PROGRAM) $$exe $$idir/$$exe ; \
+ if $(INSTALL_PROGRAM) $$exe $$idir/$$exe ; then \
+ echo "" ; \
+ echo "WARNING: unable to install $$exe setuid." ; \
+ echo "WARNING: authentication may not work!" ; \
+ echo "" ; \
+ else \
+ exit 1 ; \
+ fi ; \
+ else \
+ exit 1 ; \
+ fi ; \
+ done
+
+
+# Symlink from xscreensaver-demo -> xscreensaver-settings in /usr/bin/
+install-program::
+ @D=$(install_prefix)$(bindir) ; \
+ echo ln -sf xscreensaver-settings $$D/xscreensaver-demo ; \
+ ln -sf xscreensaver-settings $$D/xscreensaver-demo
+
install-ad: XScreenSaver.ad
@if [ ! -d $(install_prefix)$(AD_DIR) ]; then \
$(INSTALL_DIRS) $(install_prefix)$(AD_DIR) ; \
- fi
- @-echo $(INSTALL_DATA) XScreenSaver.ad \
+ fi ; \
+ echo $(INSTALL_DATA) XScreenSaver.ad \
$(install_prefix)$(AD_DIR)/XScreenSaver ; \
if $(INSTALL_DATA) XScreenSaver.ad \
$(install_prefix)$(AD_DIR)/XScreenSaver ; then \
@@ -331,101 +337,106 @@ install-ad: XScreenSaver.ad
$$e "" ;\
$$e " ####################################################################";\
$$e " Warning: unable to install $(install_prefix)$(AD_DIR)/XScreenSaver" ;\
- $$e " The directory is unwritable. This is probably ok;" ;\
- $$e " xscreensaver should work without that file." ;\
+ $$e " This is probably ok; it should work without that file." ;\
$$e " ####################################################################";\
$$e "" ;\
exit 0 ; \
fi \
fi
-install-scripts: $(SCRIPTS) munge-scripts
- @for program in $(SCRIPTS); do \
- if [ -r $$program ] ; then \
- p=$$program ; \
- else \
- p=$(srcdir)/$$program ; \
- fi ; \
- echo $(INSTALL_SCRIPT) $$p \
- $(install_prefix)$(bindir)/$$program ; \
- $(INSTALL_SCRIPT) $$p \
- $(install_prefix)$(bindir)/$$program ; \
- done
-
-munge-scripts: $(SCRIPTS)
- @tmp=/tmp/mf.$$$$ ; \
- perl="${PERL}" ; \
- rm -f $$tmp ; \
- for program in $(SCRIPTS); do \
- sed "s@^\(#!\)\(/[^ ]*/perl[^ ]*\)\(.*\)\$$@\1$$perl\3@" \
- < $(srcdir)/$$program > $$tmp ; \
- if cmp -s $(srcdir)/$$program $$tmp ; then \
- true ; \
- else \
- echo "$$program: setting interpreter to $$perl" >&2 ; \
- cat $$tmp > ./$$program ; \
- fi ; \
- done ; \
- rm -f $$tmp
-
# When installing man pages, we install "foo.man" as "foo.N" and update
# the .TH line in the installed file with one like
#
# .TH XScreenSaver N "V.VV (DD-MMM-YYYY)" "X Version 11"
#
-# where N is the manual section suffix.
+# where N is the manual section suffix (usually 1 or 6, depending).
#
-install-man: $(MEN)
- @men="$(MEN)" ; \
+install-man:: $(MENA) $(MENB)
+ @ \
U=$(UTILS_SRC)/version.h ; \
- V=`sed -n 's/.*xscreensaver \([0-9]\.[^)]*)\).*/\1/p' < $$U` ; \
- T=/tmp/xs$$$$.$(mansuffix) ; \
- TH=".TH XScreenSaver $(mansuffix) \"$$V\" \"X Version 11\"" ; \
- echo "installing man pages: $$TH" ; \
+ V=`sed -n 's/.*xscreensaver \([0-9]\.[^)]*)\).*/\1/p' < $$U | \
+ head -1` ; \
+ T=/tmp/xs$$$$.man ; \
+ SUFA=$(mansuffixA) ; \
+ SUFB=$(mansuffixB) ; \
\
- if [ ! -d $(install_prefix)$(manNdir) ]; then \
- $(INSTALL_DIRS) $(install_prefix)$(manNdir) ; \
- fi ; \
+ INST() { \
+ TH=".TH XScreenSaver $$SUF \"$$V\" \"X Version 11\"" ; \
+ DIR="$(install_prefix)$(mandir)/man$$SUF" ; \
+ if [ ! -d $$DIR ]; then \
+ echo $(INSTALL_DIRS) $$DIR ; \
+ $(INSTALL_DIRS) $$DIR ; \
+ fi ; \
\
- for man in $$men; do \
- instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ; \
- manbase=`echo $$man | sed 's/\.man$$//'` ; \
- TH=".TH $$manbase $(mansuffix) \"$$V\" \"X Version 11\" \"XScreenSaver manual\"" ; \
sed -e "s/^\.TH.*/$$TH/" \
- -e 's/^\(\.BR xscr.*(\)[^()]\(.*\)/\1$(mansuffix)\2/' \
- -e 's@(MANSUFFIX)@($(mansuffix))@g' \
+ -e "s/^\(\.BR xscreens[^ ]* (\)[0-9]\(.*\)/\1$$SUFA\2/" \
+ -e "s@(MANSUFFIX)@($$SUFB)@g" \
< $(srcdir)/$$man > $$T ; \
- echo $(INSTALL_DATA) $(srcdir)/$$man \
- $(install_prefix)$(manNdir)/$$instname ; \
- $(INSTALL_DATA) $$T \
- $(install_prefix)$(manNdir)/$$instname ; \
- done ; \
+ manbase=`echo $$man | sed 's/\.man$$//'` ; \
+ echo $(INSTALL_DATA) $$man $$DIR/$$manbase.$$SUF ; \
+ $(INSTALL_DATA) $$T $$DIR/$$manbase.$$SUF ; \
+ } ; \
+ \
+ SUF=$$SUFA ; for man in $(MENA); do INST ; done ; \
+ SUF=$$SUFB ; for man in $(MENB); do INST ; done ; \
rm -f $$T
-uninstall-program:
- @for program in $(EXES) $(SCRIPTS); do \
+# Symlink from xscreensaver-demo.1 -> xscreensaver-settings.1 in /usr/man/man1/
+install-man::
+ @D=$(install_prefix)$(mandir)/man$(mansuffixA) ; \
+ F1=xscreensaver-settings.$(mansuffixA) ; \
+ F2=xscreensaver-demo.$(mansuffixA) ; \
+ echo ln -sf $$F1 $$D/$$F2 ; \
+ ln -sf $$F1 $$D/$$F2
+
+# These used to be in driver/ and installed into $(bindir)
+# Now they are in hacks/ and are installed into ${libexecdir}/xscreensaver/
+OLD_EXES = xscreensaver-getimage xscreensaver-getimage-file \
+ xscreensaver-getimage-video xscreensaver-text \
+ xscreensaver-systemd
+OLD_MEN = xscreensaver-getimage.man xscreensaver-getimage-file.man \
+ xscreensaver-getimage-video.man xscreensaver-text.man \
+ xscreensaver-demo.man
+uninstall-program::
+ @for program in $(EXES) $(OLD_EXES); do \
echo rm -f $(install_prefix)$(bindir)/$$program ; \
rm -f $(install_prefix)$(bindir)/$$program ; \
done
+uninstall-program::
+ @for program in $(UTIL_EXES) $(SETUID_EXES); do \
+ echo rm -f $(install_prefix)$(HACKDIR)/$$program ; \
+ rm -f $(install_prefix)$(HACKDIR)/$$program ; \
+ done
+
uninstall-ad:
rm -f $(install_prefix)$(AD_DIR)/XScreenSaver
uninstall-man:
- @men="$(MEN)" ; \
+ @men="$(MEN) $(OLD_MEN)" ; \
for man in $$men; do \
instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ; \
- echo rm -f $(install_prefix)$(manNdir)/$$instname* ; \
- rm -f $(install_prefix)$(manNdir)/$$instname* ; \
+ echo rm -f $(install_prefix)$(manAdir)/$$instname* ; \
+ rm -f $(install_prefix)$(manAdir)/$$instname* ; \
done
install-pam: xscreensaver.pam
- @src="xscreensaver.pam" ; \
- dest=`sed -n 's/.*PAM_SERVICE_NAME[ ]*"\([^"]*\)".*$$/\1/p' \
+ @src="xscreensaver.pam" ; \
+ name=`sed -n 's/.*PAM_SERVICE_NAME[ ]*"\([^"]*\)".*$$/\1/p' \
< ../config.h` ; \
dir="$(install_prefix)$(PAM_DIR)" ; \
conf="$(PAM_CONF)" ; \
\
+ if [ -z "$$name" ]; then \
+ echo "PAM not configured, not installing" >&2 ; \
+ exit 0 ; \
+ fi ; \
+ \
+ if [ ! -d $(install_prefix)$(PAM_ROOT) ]; then \
+ echo $(INSTALL_DIRS) $(install_prefix)$(PAM_ROOT) ; \
+ $(INSTALL_DIRS) $(install_prefix)$(PAM_ROOT) ; \
+ fi ; \
+ \
if [ -d $$dir ] ; then \
\
if [ -f $$dir/xdm ]; then \
@@ -435,52 +446,50 @@ install-pam: xscreensaver.pam
fi ; \
\
if [ -z "$$src2" ]; then \
- echo $(INSTALL_DATA) $$src $$dir/$$dest ; \
- $(INSTALL_DATA) $$src $$dir/$$dest ; \
+ echo $(INSTALL_DATA) $$src $$dir/$$name ; \
+ $(INSTALL_DATA) $$src $$dir/$$name ; \
else \
- src="xscreensaver.pam.$$$$" ; \
- echo "grep '^#%\|^auth\|^@include' $$src2 > $$src" ; \
- grep '^#%\|^auth\|^@include' $$src2 > $$src ; \
- echo $(INSTALL_DATA) $$src $$dir/$$dest ; \
- $(INSTALL_DATA) $$src $$dir/$$dest ; \
- echo rm -f $$src ; \
- rm -f $$src ; \
+ tmp="xscreensaver.pam.$$$$" ; \
+ grep '^#%\|^auth\|^@include' $$src2 > $$tmp ; \
+ if cmp -s $$tmp $$dir/$$name ; then \
+ echo "$$dir/$$name unchanged" ; \
+ else \
+ echo "Updating contents of $$dir/$$name from $$src2" ; \
+ $(INSTALL_DATA) $$tmp $$dir/$$name ; \
+ fi ; \
+ rm -f $$tmp ; \
fi ; \
\
- if [ ! -f $$dir/$$dest ]; then \
+ if [ ! -f $$dir/$$name ]; then \
e=echo ; \
$$e "" ;\
$$e " ####################################################################";\
$$e " Warning: xscreensaver has been compiled with support for Pluggable" ;\
$$e " Authentication Modules (PAM). However, we were unable to" ;\
- $$e " install the file $$dir/$$dest. PAM is unlikely" ;\
- $$e " to work without this file (and old-style password" ;\
- $$e " authentication will be used instead, which may or may not" ;\
- $$e " work.)" ;\
+ $$e " install the file \"$$dir/$$name\". XScreenSaver is" ;\
+ $$e " unlikely to work without this file." ;\
$$e " ####################################################################";\
$$e "" ;\
fi ; \
- elif [ -f $$conf -a "x$$dest" != "x" ]; then \
- if ( grep $$dest $$conf >/dev/null ); then \
- echo "$$conf unchanged: already has an entry for $$dest" ; \
+ elif [ -f $$conf -a "x$$name" != "x" ]; then \
+ if ( grep $$name $$conf >/dev/null ); then \
+ echo "$$conf unchanged: already has an entry for $$name" ; \
else \
- src="pam.conf.$$$$" ; \
- echo "grep -v $$dest $$conf > $$src" ; \
- grep -v $$dest $$conf > $$src ; \
- extras=`sed -n "s/^login\(.*auth.*\)$$/$$dest\1/p" $$conf`; \
- echo "$$extras" >> $$src ; \
+ tmp="pam.conf.$$$$" ; \
+ grep -v $$name $$conf > $$tmp ; \
+ extras=`sed -n "s/^login\(.*auth.*\)$$/$$name\1/p" $$conf`; \
+ echo "$$extras" >> $$tmp ; \
if [ "x$$extras" = "x" ]; then \
echo "Error: no login rules in $$conf?" >&2 ; \
else \
- echo "adding $$dest rules to $$src:" ; \
+ echo "adding $$name rules to $$conf:" ; \
+ echo "" ; \
echo "$$extras" | sed 's/^/ /' ; \
fi ; \
- echo $(INSTALL_DATA) $$src $$conf ; \
- $(INSTALL_DATA) $$src $$conf ; \
- echo rm -f $$src ; \
- rm -f $$src ; \
+ $(INSTALL_DATA) $$tmp $$conf ; \
+ rm -f $$tmp ; \
fi ; \
- if ( grep $$dest $$conf >/dev/null ); then \
+ if ( grep $$name $$conf >/dev/null ); then \
echo ; \
else \
e=echo ; \
@@ -489,12 +498,17 @@ install-pam: xscreensaver.pam
$$e " Warning: xscreensaver has been compiled with support for Pluggable" ;\
$$e " Authentication Modules (PAM). However, we were unable to" ;\
$$e " install xscreensaver rules in the file $$conf." ;\
- $$e " PAM is unlikely to work without this (and old-style" ;\
- $$e " password authentication will be used instead, which may" ;\
- $$e " or may not work.)" ;\
+ $$e " XScreenSaver is unlikely to work without this." ;\
$$e " ####################################################################";\
$$e "" ;\
fi ; \
+ else \
+ e=echo ; \
+ $$e "" ;\
+ $$e " ####################################################################";\
+ $$e " Warning: $$dir/ does not exist, not installing PAM config." ;\
+ $$e " ####################################################################";\
+ $$e "" ;\
fi
# screensaver-properties.desktop
@@ -529,43 +543,43 @@ install-gnome:: $(LOGO)
fi
# ../utils/images/screensaver-*.png
-# into /usr/share/xscreensaver/glade/
+# into /usr/share/xscreensaver/ui/
install-gnome::
- @if [ "$(GTK_DATADIR)" != "" ]; then \
- if [ ! -d "$(install_prefix)$(GTK_GLADEDIR)" ]; then \
- echo $(INSTALL_DIRS) "$(install_prefix)$(GTK_GLADEDIR)" ;\
- $(INSTALL_DIRS) "$(install_prefix)$(GTK_GLADEDIR)" ;\
+ @if [ "$(GTK_DATADIR)" != "" ]; then \
+ if [ ! -d "$(install_prefix)$(GTK_UIDIR)" ]; then \
+ echo $(INSTALL_DIRS) "$(install_prefix)$(GTK_UIDIR)" ;\
+ $(INSTALL_DIRS) "$(install_prefix)$(GTK_UIDIR)" ;\
fi ;\
for target in $(GTK_ICONS) ; do \
dest=`echo $$target | sed 's@^.*/@@'` ;\
echo $(INSTALL_DATA) $$target \
- $(install_prefix)$(GTK_GLADEDIR)/$$dest ;\
+ $(install_prefix)$(GTK_UIDIR)/$$dest ;\
$(INSTALL_DATA) $$target \
- $(install_prefix)$(GTK_GLADEDIR)/$$dest ;\
+ $(install_prefix)$(GTK_UIDIR)/$$dest ;\
done ;\
fi
-# xscreensaver-demo.glade2
-# into /usr/share/xscreensaver/glade/
-install-gnome:: xscreensaver-demo.glade2
+# xscreensaver.ui
+# into /usr/share/xscreensaver/ui/
+install-gnome:: xscreensaver.ui
@if [ "$(GTK_DATADIR)" != "" ]; then \
- if [ ! -d "$(install_prefix)$(GTK_GLADEDIR)" ]; then \
- echo $(INSTALL_DIRS) "$(install_prefix)$(GTK_GLADEDIR)" ;\
- $(INSTALL_DIRS) "$(install_prefix)$(GTK_GLADEDIR)" ;\
+ if [ ! -d "$(install_prefix)$(GTK_UIDIR)" ]; then \
+ echo $(INSTALL_DIRS) "$(install_prefix)$(GTK_UIDIR)" ;\
+ $(INSTALL_DIRS) "$(install_prefix)$(GTK_UIDIR)" ;\
fi ;\
- target=xscreensaver-demo.glade2 ;\
- echo $(INSTALL_DATA) $$target \
- $(install_prefix)$(GTK_GLADEDIR)/$$target ;\
- if $(INSTALL_DATA) $$target \
- $(install_prefix)$(GTK_GLADEDIR)/$$target ;\
+ target=xscreensaver.ui ;\
+ echo $(INSTALL_DATA) $(srcdir)/$$target \
+ $(install_prefix)$(GTK_UIDIR)/$$target ;\
+ if $(INSTALL_DATA) $(srcdir)/$$target \
+ $(install_prefix)$(GTK_UIDIR)/$$target ;\
then true ;\
else \
e=echo ; \
$$e "" ;\
$$e " ####################################################################";\
$$e " Warning: unable to install $$target into" ;\
- $$e " $(install_prefix)$(GTK_GLADEDIR)/." ;\
- $$e " Without this file, xscreensaver-demo will not" ;\
+ $$e " $(install_prefix)$(GTK_UIDIR)/." ;\
+ $$e " Without this file, xscreensaver-settings will not" ;\
$$e " be able to run properly." ;\
$$e " ####################################################################";\
$$e "" ;\
@@ -593,25 +607,34 @@ uninstall-gnome::
fi
# ../utils/images/screensaver-*.png
-# into /usr/share/xscreensaver/glade/
+# into /usr/share/xscreensaver/ui/
uninstall-gnome::
@if [ "$(GTK_DATADIR)" != "" ]; then \
for target in $(GTK_ICONS) ; do \
dest=`echo $$target | sed 's@^.*/@@'` ;\
- echo rm -f $(install_prefix)$(GTK_GLADEDIR)/$$dest ;\
- rm -f $(install_prefix)$(GTK_GLADEDIR)/$$dest ;\
+ echo rm -f $(install_prefix)$(GTK_UIDIR)/$$dest ;\
+ rm -f $(install_prefix)$(GTK_UIDIR)/$$dest ;\
done ;\
fi
-# xscreensaver-demo.glade2
-# into /usr/share/xscreensaver/glade/
-uninstall-gnome:: xscreensaver-demo.glade2
+# xscreensaver.ui
+# into /usr/share/xscreensaver/ui/
+uninstall-gnome::
@if [ "$(GTK_DATADIR)" != "" ]; then \
- target=xscreensaver-demo.glade2 ;\
- echo rm -f $(install_prefix)$(GTK_GLADEDIR)/$$target ;\
- rm -f $(install_prefix)$(GTK_GLADEDIR)/$$target ;\
+ for target in xscreensaver.ui xscreensaver-demo.ui ; do \
+ echo rm -f $(install_prefix)$(GTK_UIDIR)/$$target ;\
+ rm -f $(install_prefix)$(GTK_UIDIR)/$$target ;\
+ done ;\
+ rmdir "$(GTK_UIDIR)" ;\
+ rmdir "$(GTK_DATADIR)/xscreensaver" ;\
+ exit 0 ;\
fi
+# /usr/share/xscreensaver/glade/ no longer used
+uninstall-gnome::
+ -rm -rf $(GTK_DATADIR)/xscreensaver/glade
+
+
# /usr/share/xscreensaver/config/README
install-xml:
@dest=$(install_prefix)$(HACK_CONF_DIR) ; \
@@ -627,14 +650,24 @@ install-xml:
uninstall-xml:
rm -f $(install_prefix)$(HACK_CONF_DIR)/README
+
+##############################################################################
+#
+# Clean and dependencies
+#
+##############################################################################
+
clean:
- -rm -f *.o a.out core $(EXES) $(EXES2) $(TEST_EXES) \
+ -rm -f *.o a.out core $(EXES) $(UTIL_EXES) $(SETUID_EXES) \
+ $(DEMO_EXES) $(TEST_EXES) \
XScreenSaver_ad.h XScreenSaver_Xm_ad.h
distclean: clean
- -rm -f Makefile XScreenSaver.ad \
- TAGS *~ "#"* screensaver-properties.desktop \
- xscreensaver-demo.glade2 \
+ -rm -f \
+ TAGS *~ "#"* *.rej *.orig \
+ Makefile \
+ XScreenSaver.ad \
+ screensaver-properties.desktop \
xscreensaver.pam
# Adds all current dependencies to Makefile
@@ -642,7 +675,7 @@ depend: XScreenSaver_ad.h XScreenSaver_Xm_ad.h
$(DEPEND) -s '# DO NOT DELETE: updated by make depend' \
$(DEPEND_FLAGS) -- \
$(INCLUDES_1) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \
- $(SAVER_SRCS) $(CMD_SRCS) $(GETIMG_SRCS_1)
+ $(SAVER_SRCS) $(CMD_SRCS)
# Adds some dependencies to Makefile.in -- not totally accurate, but pretty
# close. This excludes dependencies on files in /usr/include, etc. It tries
@@ -655,8 +688,8 @@ distdepend: check_men update_ad_version XScreenSaver_ad.h XScreenSaver_Xm_ad.h
$(INCLUDES_1) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \
$(SAVER_SRCS_1) $(SYSTEMD_SRCS) $(MOTIF_SRCS) $(GTK_SRCS) \
$(PWENT_SRCS) $(PWHELPER_SRCS) $(KERBEROS_SRCS) $(PAM_SRCS) \
- $(LOCK_SRCS_1) $(DEMO_SRCS_1) $(CMD_SRCS) $(GETIMG_SRCS_1) \
- $(PDF2JPEG_SRCS) $(TEST_SRCS) 2>/dev/null | \
+ $(LOCK_SRCS_1) $(DEMO_SRCS_1) $(CMD_SRCS) \
+ $(TEST_SRCS) 2>/dev/null | \
sort -d | \
( \
awk '/^# .*Makefile.in ---/,/^# DO .*distdepend/' < Makefile.in ; \
@@ -679,12 +712,12 @@ update_ad_version::
@ \
files="XScreenSaver.ad.in ../hacks/config/README ../OSX/bindist.rtf" ; \
U=$(UTILS_SRC)/version.h ; \
- V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' < $$U` ; \
+ V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^ ]*\).*/\1/p' < $$U | head -1` ; \
Y=`date '+%Y'` ; \
D=`date '+%d-%b-%Y'` ; \
for S in $$files ; do \
T=/tmp/xs.$$$$ ; \
- sed -e "s/\(.*version \)[0-9][0-9]*\.[0-9]*[ab]*[0-9]*\(.*\)/\1$$V\2/" \
+ sed -e "s/\(.*version \)[0-9][0-9]*\.[0-9.]*[ab]*[0-9]*\(.*\)/\1$$V\2/" \
-e "s/\([0-9][0-9]-[A-Z][a-z][a-z]-[0-9][0-9][0-9]*\)/$$D/" \
-e "s/\( [0-9][0-9][0-9][0-9]-\)[0-9][0-9][0-9][0-9] /\1$$Y /" \
< $$S > $$T ; \
@@ -701,9 +734,9 @@ TAGS: tags
tags:
find $(srcdir) -name '*.[chly]' -print | xargs etags -a
-echo_tarfiles:
+list_tarfiles:
@$(MAKE) XScreenSaver_ad.h XScreenSaver_Xm_ad.h 2>&1 >/dev/null
- @echo $(TARFILES)
+ @find $(TARFILES) -type f -print | sort
check_men:
@badmen="" ; \
@@ -723,11 +756,12 @@ check_men:
fi
-# Rules for noticing when the objects from the utils directory are out of
-# date with respect to their sources, and going and building them according
-# to the rules in their own Makefile...
+##############################################################################
+#
+# Dependencies on utils/
#
-$(UTILS_BIN)/fade.o: $(UTILS_SRC)/fade.c
+##############################################################################
+
$(UTILS_BIN)/overlay.o: $(UTILS_SRC)/overlay.c
$(UTILS_BIN)/resources.o: $(UTILS_SRC)/resources.c
$(UTILS_BIN)/usleep.o: $(UTILS_SRC)/usleep.c
@@ -740,157 +774,219 @@ $(UTILS_BIN)/colorbars.o: $(UTILS_SRC)/colorbars.c
$(UTILS_BIN)/hsv.o: $(UTILS_SRC)/hsv.c
$(UTILS_BIN)/colors.o: $(UTILS_SRC)/colors.c
$(UTILS_BIN)/grabscreen.o: $(UTILS_SRC)/grabscreen.c
+$(UTILS_BIN)/utf8wc.o: $(UTILS_SRC)/utf8wc.c
+$(UTILS_BIN)/xftwrap.o: $(UTILS_SRC)/xftwrap.c
$(UTILS_BIN)/font-retry.o: $(UTILS_SRC)/font-retry.c
-
-UTIL_OBJS = $(SAVER_UTIL_OBJS) $(UTILS_BIN)/colorbars.o \
- $(UTILS_BIN)/hsv.o $(UTILS_BIN)/colors.o \
- $(UTILS_BIN)/grabscreen.o
+$(UTILS_BIN)/xshm.o: $(UTILS_SRC)/xshm.c
+$(UTILS_BIN)/aligned_malloc.o: $(UTILS_SRC)/aligned_malloc.c
+
+
+UTIL_OBJS = $(UTILS_BIN)/overlay.o \
+ $(UTILS_BIN)/resources.o \
+ $(UTILS_BIN)/usleep.o \
+ $(UTILS_BIN)/visual.o \
+ $(UTILS_BIN)/xmu.o \
+ $(UTILS_BIN)/logo.o \
+ $(UTILS_BIN)/minixpm.o \
+ $(UTILS_BIN)/yarandom.o \
+ $(UTILS_BIN)/colorbars.o \
+ $(UTILS_BIN)/hsv.o \
+ $(UTILS_BIN)/colors.o \
+ $(UTILS_BIN)/grabscreen.o \
+ $(UTILS_BIN)/xft.o \
+ $(UTILS_BIN)/xftwrap.o \
+ $(UTILS_BIN)/utf8wc.o \
+ $(UTILS_BIN)/font-retry.o \
+ $(UTILS_BIN)/xshm.o \
+ $(UTILS_BIN)/aligned_malloc.o
$(UTIL_OBJS):
cd $(UTILS_BIN) ; \
$(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)"
+
+##############################################################################
+#
+# Compiling the daemon: xscreensaver, xscreensaver-gfx, xscreensaver-auth,
+# xscreensaver-systemd and xscreensaver-comand.
+#
+##############################################################################
+
# How we build object files in this directory.
+CC_ALL=$(INCLUDES) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS)
.c.o:
- $(CC) -c $(INCLUDES) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) $<
-
-.m.o:
- $(OBJCC) -c $(INCLUDES) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) $<
+ $(CC) -c $(CC_ALL) $<
-# subprocs takes an extra -D option.
-subprocs.o: subprocs.c
- $(CC) -c $(INCLUDES) $(SUBP_DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) \
- $(srcdir)/subprocs.c
+# # subprocs takes an extra -D option.
+# subprocs.o: subprocs.c
+# $(CC) -c $(CC_ALL) $(SUBP_DEFS) $<
# xscreensaver takes an extra -D option.
xscreensaver.o: xscreensaver.c
- $(CC) -c $(INCLUDES) $(DEFS) $(INTL_DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) \
- $(srcdir)/xscreensaver.c
+ $(CC) -c $(CC_ALL) $(DAEMON_DEFS) $<
-# demo-Gtk takes extra -D options, and an extra -I option.
-demo-Gtk.o: demo-Gtk.c
- $(CC) -c $(INCLUDES) $(SUBP_DEFS) -I$(ICON_SRC) \
- $(GTK_DEFS) $(INTL_DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) \
- $(srcdir)/demo-Gtk.c
+xscreensaver-auth.o: XScreenSaver_ad.h
+xscreensaver-auth.o: xscreensaver-auth.c
+ $(CC) -c $(CC_ALL) $(AUTH_DEFS) $<
-# demo-Gtk-conf takes an extra -D option.
-demo-Gtk-conf.o: demo-Gtk-conf.c
- $(CC) -c $(INCLUDES) $(CONF_DEFS) $(GTK_DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) \
- $(srcdir)/demo-Gtk-conf.c
+xscreensaver: $(DAEMON_OBJS)
+ $(CC) $(LDFLAGS) -o $@ $(DAEMON_OBJS) $(DAEMON_LIBS)
+xscreensaver-gfx.o: XScreenSaver_ad.h
+xscreensaver-gfx.o: xscreensaver-gfx.c
+ $(CC) -c $(CC_ALL) $(GFX_DEFS) $<
+xscreensaver-gfx: $(GFX_OBJS)
+ $(CC) $(LDFLAGS) -o $@ $(GFX_OBJS) $(GFX_LIBS)
-# How we build the default app-defaults file into the program.
-#
-XScreenSaver_ad.h: XScreenSaver.ad
- $(SHELL) $(UTILS_SRC)/ad2c XScreenSaver.ad > XScreenSaver_ad.h
+dialog.o: dialog.c
+ $(CC) -c $(CC_ALL) $(AUTH_DEFS) $<
+xscreensaver-auth: $(AUTH_OBJS)
+ $(CC) $(LDFLAGS) -o $@ $(AUTH_OBJS) $(AUTH_LIBS)
-XScreenSaver_Xm_ad.h: XScreenSaver-Xm.ad
- $(SHELL) $(UTILS_SRC)/ad2c XScreenSaver-Xm.ad > XScreenSaver_Xm_ad.h
+xscreensaver-systemd: $(SYSTEMD_OBJS)
+ $(CC) $(LDFLAGS) -o $@ $(SYSTEMD_OBJS) $(SYSTEMD_LIBS) -lm
+
+xscreensaver-command: $(CMD_OBJS)
+ $(CC) $(LDFLAGS) -o $@ $(CMD_OBJS) $(CMD_LIBS)
-@INTLTOOL_DESKTOP_RULE@
-# The executables linked in this directory.
+##############################################################################
+#
+# Compiling the GUI, xscreensaver-settings
#
-xscreensaver: $(SAVER_OBJS)
- $(CC) $(LDFLAGS) -o $@ $(SAVER_OBJS) $(SAVER_LIBS) $(INTL_LIBS)
+##############################################################################
-xscreensaver-command: $(CMD_OBJS)
- $(CC) $(LDFLAGS) -o $@ $(CMD_OBJS) $(CMD_LIBS)
+demo-Gtk.o: XScreenSaver_ad.h
+demo-Gtk.o: demo-Gtk.c
+ $(CC) -c $(CC_ALL) $(GTK_DEFS) $<
+demo-Gtk-conf.o: demo-Gtk-conf.c
+ $(CC) -c $(CC_ALL) $(GTK_DEFS) $<
+
+xscreensaver-settings-Gtk: $(GTK_OBJS)
+ $(CC) $(LDFLAGS) -o $@ $(GTK_OBJS) $(GTK_LIBS)
-xscreensaver-demo: @PREFERRED_DEMO_PROGRAM@
+demo-Xm.o: XScreenSaver_ad.h
+demo-Xm.o: demo-Xm.c
+ $(CC) -c $(CC_ALL) $(GTK_DEFS) $<
+demo-Xm-widgets.o: demo-Xm-widgets.c
+ $(CC) -c $(CC_ALL) $(GTK_DEFS) $<
+
+xscreensaver-settings-Xm: $(MOTIF_OBJS)
+ $(CC) $(LDFLAGS) -o $@ $(MOTIF_OBJS) $(MOTIF_LIBS)
+
+xscreensaver-settings: @PREFERRED_DEMO_PROGRAM@
@if [ "@PREFERRED_DEMO_PROGRAM@" = "" ]; then \
echo "WARNING: neither GTK nor Motif are available," \
- "therefore no xscreensaver-demo!" ; \
+ "therefore no xscreensaver-settings!" ; \
rm -f $@@EXEEXT@ ; \
else \
echo cp -p @PREFERRED_DEMO_PROGRAM@@EXEEXT@ $@@EXEEXT@ ; \
cp -p @PREFERRED_DEMO_PROGRAM@@EXEEXT@ $@@EXEEXT@ ; \
fi
-xscreensaver-demo-Xm: $(DEMO_OBJS) $(MOTIF_OBJS)
- $(CC) $(LDFLAGS) -o $@ $(DEMO_OBJS) $(MOTIF_OBJS) $(LIBS) $(X_LIBS) \
- $(MOTIF_LIBS) $(INTL_LIBS) $(X_PRE_LIBS) -lXt -lX11 \
- $(XDPMS_LIBS) $(XINERAMA_LIBS) -lXext $(X_EXTRA_LIBS)
-xscreensaver-demo-Gtk: $(DEMO_OBJS) $(GTK_OBJS)
- $(CC) $(LDFLAGS) -o $@ $(DEMO_OBJS) $(GTK_OBJS) $(LIBS) $(X_LIBS) \
- $(GTK_LIBS) $(XML_LIBS) $(INTL_LIBS) $(X_PRE_LIBS) \
- -lXt -lX11 $(XDPMS_LIBS) $(XINERAMA_LIBS) -lXext $(X_EXTRA_LIBS)
+# How we build the default app-defaults file into the program.
+#
+XScreenSaver_ad.h::
+ @TMP=/tmp/xs$$$$.h ; \
+ IN="XScreenSaver.ad" ; \
+ OUT=XScreenSaver_ad.h ; \
+ $(UTILS_SRC)/ad2c $$IN > $$TMP ; \
+ if cmp -s $$TMP $$OUT ; then \
+ rm -f "$$TMP" ; \
+ else \
+ echo $(UTILS_SRC)/ad2c $$IN \> $$OUT ; \
+ mv $$TMP $$OUT ; \
+ fi
-demo-Gtk.o: XScreenSaver_ad.h
-demo-Xm.o: XScreenSaver_Xm_ad.h
-xscreensaver.o: XScreenSaver_ad.h
-xscreensaver-getimage.o: XScreenSaver_ad.h
+XScreenSaver_Xm_ad.h::
+ @TMP=/tmp/xs$$$$.h ; \
+ IN="XScreenSaver-Xm.ad" ; \
+ OUT=XScreenSaver_Xm_ad.h ; \
+ $(UTILS_SRC)/ad2c $$IN > $$TMP ; \
+ if cmp -s $$TMP $$OUT ; then \
+ rm -f "$$TMP" ; \
+ else \
+ echo $(UTILS_SRC)/ad2c $$IN \> $$OUT ; \
+ mv $$TMP $$OUT ; \
+ fi
-xscreensaver-getimage: $(GETIMG_OBJS)
- $(CC) $(LDFLAGS) -o $@ $(GETIMG_OBJS) $(GETIMG_LIBS) -lm
-pdf2jpeg: $(PDF2JPEG_OBJS)
- $(OBJCC) $(LDFLAGS) -o $@ $(PDF2JPEG_OBJS) $(PDF2JPEG_LIBS) -lm
+# Replace this with @INTLTOOL_DESKTOP_RULE@ once
+# https://bugs.launchpad.net/intltool/+bug/1749904 is fixed.
+.desktop.in.desktop: $(INTLTOOL_MERGE) $(top_srcdir)/po/*.po
+ $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) \
+ $(INTLTOOL_V_MERGE_OPTIONS) -d -u \
+ -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
-xscreensaver-systemd: $(SYSTEMD_OBJS)
- $(CC) $(LDFLAGS) -o $@ $(SYSTEMD_OBJS) $(SYSTEMD_LIBS) -lm
-TEST_PASSWD_OBJS = test-passwd.o $(LOCK_OBJS_1) $(PASSWD_OBJS) \
- subprocs.o setuid.o splash.o prefs.o mlstring.o exec.o \
- $(SAVER_UTIL_OBJS)
-test-passwd.o: XScreenSaver_ad.h
+##############################################################################
+#
+# Debugging utilities, not built by default
+#
+##############################################################################
-test-passwd: $(TEST_PASSWD_OBJS) XScreenSaver_ad.h
- $(CC) $(LDFLAGS) -o $@ $(TEST_PASSWD_OBJS) $(SAVER_LIBS)
+TESTPASS_OBJS = test-passwd.o test-passwd-b.o $(AUTH_OBJS_1)
+TESTPATH_DEFS = -Dxscreensaver_auth_conv=test_auth_conv $(AUTH_DEFS)
+test-passwd-b.o: XScreenSaver_ad.h
+test-passwd-b.o: $(srcdir)/xscreensaver-auth.c
+ $(CC) -c $(CC_ALL) $(TESTPATH_DEFS) $< -o $@
+test-passwd: $(TESTPASS_OBJS)
+ $(CC) $(LDFLAGS) -o $@ $(TESTPASS_OBJS) $(AUTH_LIBS)
test-uid: test-uid.o
$(CC) $(LDFLAGS) -o $@ test-uid.o
-test-xdpms: test-xdpms.o
- $(CC) $(LDFLAGS) -o $@ test-xdpms.o $(LIBS) $(X_LIBS) $(XDPMS_LIBS) \
- $(X_PRE_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS)
+TESTDPMS_LIBS = $(LIBS_PRE) $(XDPMS_LIBS) -lXt -lX11 -lXext $(LIBS_POST)
+test-xdpms: test-xdpms.o blurb.o
+ $(CC) $(LDFLAGS) -o $@ test-xdpms.o blurb.o $(TESTDPMS_LIBS)
-test-xinerama: test-xinerama.o
- $(CC) $(LDFLAGS) -o $@ test-xinerama.o $(LIBS) $(X_LIBS) $(SAVER_LIBS) \
- $(X_PRE_LIBS) $(XINERAMA_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS)
+TESTXINPUT_OBJS = test-xinput.o blurb.o xinput.o
+TESTXINPUT_LIBS = $(LIBS_PRE) $(XDPMS_LIBS) -lXi -lXt -lX11 -lXext $(LIBS_POST)
+test-xinput: $(TESTXINPUT_OBJS)
+ $(CC) $(LDFLAGS) -o $@ $(TESTXINPUT_OBJS) $(TESTXINPUT_LIBS)
-test-vp: test-vp.o
- $(CC) $(LDFLAGS) -o $@ test-vp.o $(LIBS) $(X_LIBS) $(SAVER_LIBS) \
- $(X_PRE_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS)
+TESTXIN_LIBS = $(LIBS_PRE) $(XINERAMA_LIBS) -lXi -lXt -lX11 -lXext $(LIBS_POST)
+test-xinerama: test-xinerama.o blurb.o
+ $(CC) $(LDFLAGS) -o $@ test-xinerama.o blurb.o $(TESTXIN_LIBS)
-test-randr: test-randr.o
- $(CC) $(LDFLAGS) -o $@ test-randr.o $(LIBS) $(X_LIBS) $(SAVER_LIBS) \
- $(X_PRE_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS)
+TESTXKB_OBJS = test-xkb.o blurb.o
+TESTXKB_LIBS = $(LIBS_PRE) $(XDPMS_LIBS) -lXi -lXt -lX11 -lXext $(LIBS_POST)
+test-xkb: $(TESTXKB_OBJS)
+ $(CC) $(LDFLAGS) -o $@ $(TESTXKB_OBJS) $(TESTXKB_LIBS)
-test-grab: test-grab.o
- $(CC) $(LDFLAGS) -o $@ test-grab.o $(SAVER_LIBS)
+test-vp: test-vp.o blurb.o
+ $(CC) $(LDFLAGS) -o $@ test-vp.o blurb.o $(GFX_LIBS)
-test-apm: test-apm.o
- $(CC) $(LDFLAGS) -o $@ test-apm.o $(SAVER_LIBS) -lapm
+test-randr: test-randr.o blurb.o
+ $(CC) $(LDFLAGS) -o $@ test-randr.o blurb.o $(GFX_LIBS)
-test-mlstring.o: mlstring.c
-test-mlstring: test-mlstring.o
- $(CC) -DTEST $(LDFLAGS) -o $@ test-mlstring.o $(SAVER_LIBS)
+TESTGRAB_LIBS = $(LIBS_PRE) -lXt -lX11 -lXext $(LIBS_POST)
+test-grab: test-grab.o blurb.o
+ $(CC) $(LDFLAGS) -o $@ test-grab.o blurb.o $(TESTGRAB_LIBS)
-TEST_FADE_OBJS = test-fade.o $(UTILS_BIN)/fade.o $(DEMO_UTIL_OBJS)
-test-fade: test-fade.o $(UTILS_BIN)/fade.o
- $(CC) $(LDFLAGS) -o $@ $(TEST_FADE_OBJS) $(SAVER_LIBS)
+TEST_FADE_OBJS = test-fade.o fade.o blurb.o atoms.o clientmsg.o xinput.o \
+ $(UTILS_BIN)/visual.o $(UTILS_BIN)/resources.o $(UTILS_BIN)/usleep.o \
+ $(UTILS_BIN)/logo.o $(UTILS_BIN)/minixpm.o $(UTILS_BIN)/xshm.o \
+ $(UTILS_BIN)/xmu.o $(UTILS_BIN)/aligned_malloc.o
+test-fade: $(TEST_FADE_OBJS)
+ $(CC) $(LDFLAGS) -o $@ $(TEST_FADE_OBJS) $(GFX_LIBS)
-TEST_SCREENS_OBJS = test-screens.o $(DEMO_UTIL_OBJS)
-test-screens.o: screens.c
-test-screens: test-screens.o
- $(CC) $(LDFLAGS) -o $@ $(TEST_SCREENS_OBJS) $(SAVER_LIBS)
+TEST_SCREENS_OBJS = test-screens.o screens.o blurb.o
+test-screens: $(TEST_SCREENS_OBJS)
+ $(CC) $(LDFLAGS) -o $@ $(TEST_SCREENS_OBJS) $(GFX_LIBS)
-test-yarandom: test-yarandom.o
- $(CC) -DTEST $(LDFLAGS) -o $@ test-yarandom.o $(UTILS_BIN)/yarandom.o
+test-yarandom: test-yarandom.o blurb.o
+ $(CC) -DTEST $(LDFLAGS) -o $@ test-yarandom.o blurb.o $(UTILS_BIN)/yarandom.o
+XDPY_DEFS = -DHAVE_GLX $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS)
+XDPY_LIBS = $(LIBS_PRE) -lGL -lX11 -lXext $(LIBS_POST)
xdpyinfo.o: xdpyinfo.c
- $(CC) -c $(INCLUDES) -DHAVE_GLX $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) \
- $(srcdir)/xdpyinfo.c
-
+ $(CC) -c $(INCLUDES) $(XDPY_DEFS) $(srcdir)/xdpyinfo.c
xdpyinfo: xdpyinfo.o
- $(CC) $(LDFLAGS) -o $@ xdpyinfo.o \
- $(LIBS) $(X_LIBS) @GL_LIBS@ \
- $(X_PRE_LIBS) -lX11 -lXext $(X_EXTRA_LIBS) -lm
-
+ $(CC) $(LDFLAGS) -o $@ xdpyinfo.o $(XDPY_LIBS)
##############################################################################
#
@@ -900,150 +996,89 @@ demo-Gtk-conf.o: ../config.h
demo-Gtk-conf.o: $(srcdir)/demo-Gtk-conf.h
demo-Gtk-conf.o: $(UTILS_SRC)/xscreensaver-intl.h
demo-Gtk.o: XScreenSaver_ad.h
+demo-Gtk.o: $(srcdir)/atoms.h
+demo-Gtk.o: $(srcdir)/blurb.h
demo-Gtk.o: ../config.h
demo-Gtk.o: $(srcdir)/demo-Gtk-conf.h
-demo-Gtk.o: $(srcdir)/prefs.h
demo-Gtk.o: $(srcdir)/remote.h
demo-Gtk.o: $(srcdir)/types.h
demo-Gtk.o: $(UTILS_SRC)/resources.h
demo-Gtk.o: $(UTILS_SRC)/usleep.h
demo-Gtk.o: $(UTILS_SRC)/version.h
demo-Gtk.o: $(UTILS_SRC)/visual.h
+demo-Gtk.o: $(UTILS_SRC)/xmu.h
demo-Gtk.o: $(UTILS_SRC)/xscreensaver-intl.h
+demo-Xm.o: XScreenSaver_Xm_ad.h
+demo-Xm.o: XScreenSaver_ad.h
+demo-Xm.o: $(srcdir)/atoms.h
+demo-Xm.o: $(srcdir)/blurb.h
demo-Xm.o: ../config.h
+demo-Xm.o: $(srcdir)/remote.h
+demo-Xm.o: $(srcdir)/types.h
+demo-Xm.o: $(UTILS_SRC)/resources.h
+demo-Xm.o: $(UTILS_SRC)/version.h
+demo-Xm.o: $(UTILS_SRC)/visual.h
+demo-Xm.o: $(UTILS_SRC)/xmu.h
demo-Xm-widgets.o: ../config.h
-dpms.o: ../config.h
-dpms.o: $(srcdir)/prefs.h
-dpms.o: $(srcdir)/types.h
-dpms.o: $(srcdir)/xscreensaver.h
-exec.o: ../config.h
-exec.o: $(srcdir)/exec.h
-lock.o: $(srcdir)/auth.h
-lock.o: ../config.h
-lock.o: $(srcdir)/mlstring.h
-lock.o: $(srcdir)/prefs.h
-lock.o: $(srcdir)/types.h
-lock.o: $(UTILS_SRC)/resources.h
-lock.o: $(srcdir)/xscreensaver.h
-mlstring.o: $(srcdir)/mlstring.h
+passwd-helper.o: $(srcdir)/auth.h
+passwd-helper.o: $(srcdir)/blurb.h
passwd-helper.o: ../config.h
-passwd-helper.o: $(srcdir)/prefs.h
-passwd-helper.o: $(srcdir)/types.h
-passwd-helper.o: $(srcdir)/xscreensaver.h
+passwd-kerberos.o: $(srcdir)/auth.h
+passwd-kerberos.o: $(srcdir)/blurb.h
passwd-kerberos.o: ../config.h
-passwd.o: $(srcdir)/auth.h
-passwd.o: ../config.h
-passwd.o: $(srcdir)/prefs.h
-passwd.o: $(srcdir)/types.h
-passwd.o: $(srcdir)/xscreensaver.h
passwd-pam.o: $(srcdir)/auth.h
+passwd-pam.o: $(srcdir)/blurb.h
passwd-pam.o: ../config.h
-passwd-pam.o: $(srcdir)/types.h
+passwd-pwent.o: $(srcdir)/auth.h
+passwd-pwent.o: $(srcdir)/blurb.h
passwd-pwent.o: ../config.h
-prefs.o: ../config.h
-prefs.o: $(srcdir)/prefs.h
-prefs.o: $(srcdir)/types.h
-prefs.o: $(UTILS_SRC)/resources.h
-prefs.o: $(UTILS_SRC)/version.h
+remote.o: $(srcdir)/atoms.h
+remote.o: $(srcdir)/blurb.h
+remote.o: $(srcdir)/clientmsg.h
remote.o: ../config.h
remote.o: $(srcdir)/remote.h
-screens.o: ../config.h
-screens.o: $(srcdir)/prefs.h
-screens.o: $(srcdir)/types.h
-screens.o: $(UTILS_SRC)/visual.h
-screens.o: $(srcdir)/xscreensaver.h
-setuid.o: ../config.h
-setuid.o: $(srcdir)/prefs.h
-setuid.o: $(srcdir)/types.h
-setuid.o: $(srcdir)/xscreensaver.h
-splash.o: ../config.h
-splash.o: $(srcdir)/prefs.h
-splash.o: $(srcdir)/types.h
-splash.o: $(UTILS_SRC)/font-retry.h
-splash.o: $(UTILS_SRC)/resources.h
-splash.o: $(srcdir)/xscreensaver.h
-stderr.o: ../config.h
-stderr.o: $(srcdir)/prefs.h
-stderr.o: $(srcdir)/types.h
-stderr.o: $(UTILS_SRC)/resources.h
-stderr.o: $(UTILS_SRC)/visual.h
-stderr.o: $(srcdir)/xscreensaver.h
-subprocs.o: ../config.h
-subprocs.o: $(srcdir)/exec.h
-subprocs.o: $(srcdir)/prefs.h
-subprocs.o: $(srcdir)/types.h
-subprocs.o: $(UTILS_SRC)/visual.h
-subprocs.o: $(UTILS_SRC)/yarandom.h
-subprocs.o: $(srcdir)/xscreensaver.h
-test-apm.o: ../config.h
+test-fade.o: $(srcdir)/atoms.h
+test-fade.o: $(srcdir)/blurb.h
test-fade.o: ../config.h
-test-fade.o: $(srcdir)/prefs.h
+test-fade.o: $(srcdir)/fade.h
+test-fade.o: $(srcdir)/screens.h
test-fade.o: $(srcdir)/types.h
-test-fade.o: $(UTILS_SRC)/fade.h
+test-fade.o: $(UTILS_SRC)/resources.h
test-fade.o: $(srcdir)/xscreensaver.h
+test-grab.o: $(srcdir)/blurb.h
test-grab.o: ../config.h
-test-mlstring.o: $(srcdir)/mlstring.c
-test-mlstring.o: $(srcdir)/mlstring.h
-test-passwd.o: XScreenSaver_ad.h
test-passwd.o: $(srcdir)/auth.h
+test-passwd.o: $(srcdir)/blurb.h
test-passwd.o: ../config.h
-test-passwd.o: $(srcdir)/prefs.h
-test-passwd.o: $(srcdir)/types.h
-test-passwd.o: $(UTILS_SRC)/resources.h
-test-passwd.o: $(UTILS_SRC)/version.h
-test-passwd.o: $(UTILS_SRC)/visual.h
-test-passwd.o: $(srcdir)/xscreensaver.h
+test-randr.o: $(srcdir)/blurb.h
test-randr.o: ../config.h
+test-screens.o: $(srcdir)/blurb.h
test-screens.o: ../config.h
-test-screens.o: $(srcdir)/prefs.h
-test-screens.o: $(srcdir)/screens.c
-test-screens.o: $(srcdir)/types.h
+test-screens.o: $(srcdir)/screens.h
test-screens.o: $(UTILS_SRC)/visual.h
-test-screens.o: $(srcdir)/xscreensaver.h
test-uid.o: ../config.h
+test-vp.o: $(srcdir)/blurb.h
test-vp.o: ../config.h
+test-xdpms.o: $(srcdir)/blurb.h
test-xdpms.o: ../config.h
+test-xinerama.o: $(srcdir)/blurb.h
test-xinerama.o: ../config.h
+test-xinput.o: $(srcdir)/blurb.h
+test-xinput.o: ../config.h
+test-xinput.o: $(srcdir)/xinput.h
+test-xkb.o: $(srcdir)/blurb.h
+test-xkb.o: ../config.h
+test-yarandom.o: $(srcdir)/blurb.h
test-yarandom.o: ../config.h
test-yarandom.o: $(UTILS_SRC)/yarandom.h
-timers.o: ../config.h
-timers.o: $(srcdir)/prefs.h
-timers.o: $(srcdir)/types.h
-timers.o: $(srcdir)/xscreensaver.h
-windows.o: ../config.h
-windows.o: $(srcdir)/prefs.h
-windows.o: $(srcdir)/types.h
-windows.o: $(UTILS_SRC)/fade.h
-windows.o: $(UTILS_SRC)/visual.h
-windows.o: $(srcdir)/xscreensaver.h
+xscreensaver-command.o: $(srcdir)/atoms.h
+xscreensaver-command.o: $(srcdir)/blurb.h
xscreensaver-command.o: ../config.h
xscreensaver-command.o: $(srcdir)/remote.h
xscreensaver-command.o: $(UTILS_SRC)/version.h
-xscreensaver-getimage.o: ../config.h
-xscreensaver-getimage.o: XScreenSaver_ad.h
-xscreensaver-getimage.o: $(srcdir)/prefs.h
-xscreensaver-getimage.o: $(srcdir)/types.h
-xscreensaver-getimage.o: $(UTILS_SRC)/colorbars.h
-xscreensaver-getimage.o: $(UTILS_SRC)/grabscreen.h
-xscreensaver-getimage.o: $(UTILS_SRC)/resources.h
-xscreensaver-getimage.o: $(UTILS_SRC)/utils.h
-xscreensaver-getimage.o: $(UTILS_SRC)/version.h
-xscreensaver-getimage.o: $(UTILS_SRC)/visual.h
-xscreensaver-getimage.o: $(UTILS_SRC)/vroot.h
-xscreensaver-getimage.o: $(UTILS_SRC)/yarandom.h
-xscreensaver.o: XScreenSaver_ad.h
-xscreensaver.o: $(srcdir)/auth.h
-xscreensaver.o: ../config.h
-xscreensaver.o: $(srcdir)/prefs.h
-xscreensaver.o: $(srcdir)/types.h
-xscreensaver.o: $(UTILS_SRC)/resources.h
-xscreensaver.o: $(UTILS_SRC)/usleep.h
-xscreensaver.o: $(UTILS_SRC)/version.h
-xscreensaver.o: $(UTILS_SRC)/visual.h
-xscreensaver.o: $(UTILS_SRC)/yarandom.h
-xscreensaver.o: $(srcdir)/xscreensaver.h
-xset.o: ../config.h
-xset.o: $(srcdir)/prefs.h
-xset.o: $(srcdir)/types.h
-xset.o: $(srcdir)/xscreensaver.h
+xscreensaver-systemd.o: $(srcdir)/blurb.h
+xscreensaver-systemd.o: ../config.h
+xscreensaver-systemd.o: $(UTILS_SRC)/queue.h
+xscreensaver-systemd.o: $(UTILS_SRC)/version.h
+xscreensaver-systemd.o: $(UTILS_SRC)/yarandom.h
diff --git a/driver/XScreenSaver-Xm.ad b/driver/XScreenSaver-Xm.ad
index 6b04ae9..560c48e 100644
--- a/driver/XScreenSaver-Xm.ad
+++ b/driver/XScreenSaver-Xm.ad
@@ -1,4 +1,4 @@
-! Resources for the Motif dialog boxes of the "xscreensaver-demo" program.
+! Resources for the Motif dialog boxes of the "xscreensaver-settings" program.
!
*fontList: *-helvetica-medium-r-*-*-*-120-*-*-*-iso8859-1
*demoDialog*label1.fontList: *-helvetica-medium-r-*-*-*-140-*-*-*-iso8859-1
diff --git a/driver/XScreenSaver.ad.in b/driver/XScreenSaver.ad.in
index 0b51f0c..bfc6414 100644
--- a/driver/XScreenSaver.ad.in
+++ b/driver/XScreenSaver.ad.in
@@ -4,8 +4,8 @@
! a screen saver and locker for the X window system
! by Jamie Zawinski
!
-! version 5.44
-! 20-Mar-2020
+! version 6.00
+! 01-Apr-2021
!
! See "man xscreensaver" for more info. The latest version is always
! available at https://www.jwz.org/xscreensaver/
@@ -38,7 +38,6 @@
*dpmsStandby: 2:00:00
*dpmsSuspend: 2:00:00
*dpmsOff: 4:00:00
-*dpmsFullThrottle: False
*grabDesktopImages: True
*grabVideoFrames: False
*chooseRandomImages: @DEFAULT_IMAGES_P@
@@ -48,9 +47,8 @@
*memoryLimit: 0
*lock: False
*verbose: False
-*timestamp: True
*fade: True
-*unfade: False
+*unfade: True
*fadeSeconds: 0:00:03
*fadeTicks: 20
*splash: True
@@ -66,32 +64,11 @@
*textProgram: fortune
*textURL: https://en.wikipedia.org/w/index.php?title=Special:NewPages&feed=rss
-! When a saver writes an error message to stdout/stderr, it can be printed
-! on the screen.
-!
-*captureStderr: True
-*overlayStderr: True
-*overlayTextForeground: #FFFF00
-*overlayTextBackground: #000000
-*font: *-medium-r-*-140-*-m-*
-
-! The default is to use these server extensions if available (as noted.)
-*sgiSaverExtension: True
-*xidleExtension: True
-*procInterrupts: True
-
-! Turning this on makes pointerHysteresis not work.
-*xinputExtensionDev: False
-
-! Set this to True if you are experiencing longstanding XFree86 bug #421
-! (xscreensaver not covering the whole screen)
-*GetViewPortIsFullOfLies: False
-
! This is what the "Settings" button on the splash screen runs.
-*demoCommand: xscreensaver-demo
+*demoCommand: xscreensaver-settings
! This is the URL loaded by the "Help" button on the splash screen,
-! and by the "Documentation" menu item in xscreensaver-demo.
+! and by the "Documentation" menu item in xscreensaver-settings.
*helpURL: https://www.jwz.org/xscreensaver/man.html
! loadURL -- how the "Help" buttons load the helpURL (/bin/sh syntax.)
@@ -99,11 +76,13 @@
!
! And there are so very many options to choose from!
!
-! Gnome 2.4, 2.6: (yelp can't display man pages, as of 2.6.3)
+! Gnome 2.4, 2.6:
!
@GNOME24@*loadURL: @WITH_BROWSER@ '%s'
-@GNOME24@*manualCommand: gnome-terminal --title '%s manual' \
-@GNOME24@ --command '/bin/sh -c "man %s; read foo"'
+@GNOME24@*manualCommand: yelp man:%s || \
+@GNOME24@ x-terminal-emulator -t '%s manual' \
+@GNOME24@ -e /bin/sh -c "man %s; read foo"
+
!
! Gnome 2.2:
!
@@ -118,21 +97,21 @@
!
! non-Gnome systems:
!
-@NOGNOME@*loadURL: firefox '%s' || mozilla '%s' || netscape '%s'
+@NOGNOME@*loadURL: x-www-browser '%s' || firefox '%s' || chromium-browser '%s'
@NOGNOME@*manualCommand: xterm -sb -fg black -bg gray75 -T '%s manual' \
@NOGNOME@ -e /bin/sh -c 'man "%s" ; read foo'
-! The format used for printing the date and time in the password dialog box
-! (see the strftime(3) manual page for details.)
-*dateFormat: %d-%b-%y (%a); %I:%M %p
-! For day month date:
-! *dateFormat: %a %b %d, %I:%M %p
-! To show the time only:
+! The strftime(3) format string for printing the time on the password dialog.
+*dateFormat: %I:%M %p, %a %b %e
+! DD MMM:
+! *dateFormat: %I:%M %p, %e %b (%a)
+! 12 hour time only:
! *dateFormat: %I:%M %p
-! For 24 hour time:
+! 24 hour time only:
! *dateFormat: %H:%M
-
+! ISO 8601:
+! *dateFormat: %Y-%m-%d %H:%M:%S
! This command is executed by the "New Login" button on the lock dialog.
! (That button does not appear on the dialog if this program does not exist.)
@@ -142,22 +121,11 @@
!
@NEW_LOGIN_COMMAND_P@*newLoginCommand: @NEW_LOGIN_COMMAND@
-
-! External command used to help xscreensaver aquire the mouse/keyboard
-! grab. (I.e. some script that makes VMware release it).
-! This is called before xscreensaver tries to aquire the grab with
-! "pre" as parameter, and again with "post" after xscreensaver is done
-! (trying to) aquire the grab.
-!
-*externalUngrabCommand:
-
-
-! Change these at your peril:
-!
-XScreenSaver.pointerPollTime: 0:00:05
+! Mouse motions less than this many pixels per second are ignored.
+! This helps with cats, trucks and earthquakes.
XScreenSaver.pointerHysteresis: 10
-XScreenSaver.initialDelay: 0:00:00
-XScreenSaver.windowCreationTimeout: 0:00:30
+
+! Change this at your peril:
XScreenSaver.bourneShell: /bin/sh
@@ -167,176 +135,179 @@ XScreenSaver.bourneShell: /bin/sh
!
!=============================================================================
-! Note, the daemon uses Xlib XLoadFont, not Xft. If these fonts don't
-! exist, arcane heuristics are applied until we find something similar.
-!
-*Dialog.headingFont: -*-helvetica-bold-r-*-*-*-180-*-*-*-*-iso8859-1
-*Dialog.bodyFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1
-*Dialog.labelFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1
-*Dialog.unameFont: -*-helvetica-bold-r-*-*-*-120-*-*-*-*-iso8859-1
-*Dialog.buttonFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1
-*Dialog.dateFont: -*-helvetica-medium-r-*-*-*-80-*-*-*-*-iso8859-1
-
-! Helvetica asterisks look terrible.
-*passwd.passwdFont: -*-courier-bold-r-*-*-*-140-*-*-*-iso8859-1
+! Which of the following color schemes is in use for the unlock dialog.
+*dialogTheme: default
-! Whether to display the local host name in the unlock dialog.
-*passwd.uname: True
+! Resources for theme names are downcased with spaces stripped.
+*themeNames: Default, Borderless, Dark Gray, Borderless Black, \
+ Green Black, White, Blue, Aqua Black, Wine
-! Whether typed passwords should echo as asterisks (true) or nothing (false)
-*passwd.asterisks: True
-
-
-! The default color scheme for the unlock and splash dialogs.
-! This looks pretty close to the default Gtk theme.
-!
-*Dialog.foreground: #000000
-*Dialog.background: #E6E6E6
-*Dialog.Button.foreground: #000000
-*Dialog.Button.background: #F5F5F5
-*Dialog.text.foreground: #000000
-*Dialog.text.background: #FFFFFF
-*Dialog.topShadowColor: #FFFFFF
-*Dialog.bottomShadowColor: #CECECE
-*Dialog.logo.width: 210
-*Dialog.logo.height: 210
-*Dialog.internalBorderWidth: 24
-*Dialog.borderWidth: 1
-*Dialog.shadowThickness: 2
-*passwd.thermometer.foreground: #4464AC
-*passwd.thermometer.background: #FFFFFF
-*passwd.thermometer.width: 8
-
-
-! A few other example color schemes.
-!
-! A convenient way to debug these is to build and run "driver/test-passwd".
-! Remember that configure overwrites XScreenSaver.ad from XScreenSaver.ad.in.
+*Dialog.headingFont: sans-serif bold 16
+*Dialog.bodyFont: sans-serif 14
+*Dialog.errorFont: sans-serif bold 14
+*Dialog.labelFont: sans-serif bold 14
+*Dialog.unameFont: sans-serif 12
+*Dialog.buttonFont: sans-serif bold 14
+*Dialog.dateFont: sans-serif 9
+! Whether to display the local host name in the unlock dialog.
+*passwd.uname: True
+
+! Whether typed passwords should echo as asterisks, or as nothing.
+*passwd.asterisks: True
+
+! The default theme is similar to the Gtk defaults.
+!
+*default.Dialog.foreground: #000000
+*default.Dialog.background: #E6E6E6
+*default.Dialog.button.foreground: #000000
+*default.Dialog.button.background: #F5F5F5
+*default.Dialog.logo.background: #BBBBBB
+*default.Dialog.text.foreground: #000000
+*default.Dialog.error.foreground: #FF0000
+*default.Dialog.text.background: #FFFFFF
+*default.Dialog.topShadowColor: #FFFFFF
+*default.Dialog.bottomShadowColor: #CECECE
+*default.Dialog.shadowWidth: 2
+*default.Dialog.logo.width: 210
+*default.Dialog.logo.height: 210
+*default.Dialog.thermometer.foreground: #4464AC
+*default.Dialog.thermometer.background: #FFFFFF
+*default.Dialog.thermometer.width: 8
+*default.Dialog.borderColor: #CECECE
+*default.Dialog.borderWidth: 0
+*default.Dialog.internalPadding: 24
! Borderless theme:
!
-! *Dialog.topShadowColor: #E6E6E6
-! *Dialog.bottomShadowColor: #E6E6E6
-! *passwd.thermometer.width: 6
-
+*borderless.Dialog.topShadowColor: #E6E6E6
+*borderless.Dialog.button.background: #FFFFFF
+*borderless.Dialog.bottomShadowColor: #E6E6E6
+*borderless.Dialog.logo.background: #E6E6E6
+*borderless.Dialog.borderColor: #888888
+*borderless.Dialog.thermometer.width: 6
+*borderless.Dialog.borderWidth: 1
! Dark gray theme:
!
-! *Dialog.foreground: #CCCCCC
-! *Dialog.background: #333333
-! *Dialog.topShadowColor: #444444
-! *Dialog.bottomShadowColor: #111111
-! *Dialog.text.foreground: #DDDDDD
-! *Dialog.text.background: #666666
-! *Dialog.Button.foreground: #CCCCCC
-! *Dialog.Button.background: #666666
-! *passwd.thermometer.foreground: #4464AC
-! *passwd.thermometer.background: #666666
-
-
-! Black borderless theme:
-!
-! *Dialog.foreground: #CCCCCC
-! *Dialog.background: #000000
-! *Dialog.topShadowColor: #000000
-! *Dialog.bottomShadowColor: #000000
-! *Dialog.text.foreground: #CCCCCC
-! *Dialog.text.background: #000000
-! *Dialog.Button.foreground: #CCCCCC
-! *Dialog.Button.background: #333333
-! *passwd.thermometer.foreground: #CCCCCC
-! *passwd.thermometer.background: #333333
-! *passwd.thermometer.width: 3
-
+*darkgray.Dialog.foreground: #CCCCCC
+*darkgray.Dialog.background: #333333
+*darkgray.Dialog.topShadowColor: #444444
+*darkgray.Dialog.bottomShadowColor: #111111
+*darkgray.Dialog.borderColor: #111111
+*darkgray.Dialog.text.foreground: #DDDDDD
+*darkgray.Dialog.text.background: #666666
+*darkgray.Dialog.button.foreground: #CCCCCC
+*darkgray.Dialog.button.background: #666666
+*darkgray.Dialog.logo.background: #444444
+*darkgray.Dialog.thermometer.foreground: #4464AC
+*darkgray.Dialog.thermometer.background: #666666
+*darkgray.Dialog.borderWidth: 0
+
+! Borderless black theme:
+!
+*borderlessblack.Dialog.foreground: #CCCCCC
+*borderlessblack.Dialog.background: #000000
+*borderlessblack.Dialog.topShadowColor: #000000
+*borderlessblack.Dialog.bottomShadowColor: #000000
+*borderlessblack.Dialog.text.foreground: #CCCCCC
+*borderlessblack.Dialog.text.background: #000000
+*borderlessblack.Dialog.button.foreground: #CCCCCC
+*borderlessblack.Dialog.button.background: #333333
+*borderlessblack.Dialog.logo.background: #000000
+*borderlessblack.Dialog.thermometer.foreground: #CCCCCC
+*borderlessblack.Dialog.thermometer.background: #333333
+*borderlessblack.Dialog.thermometer.width: 3
+*borderlessblack.Dialog.borderColor: #333333
+*borderlessblack.Dialog.borderWidth: 1
! Green on black theme:
!
-! *Dialog.foreground: #00FF00
-! *Dialog.background: #000000
-! *Dialog.topShadowColor: #000000
-! *Dialog.bottomShadowColor: #000000
-! *Dialog.shadowThickness: 1
-! *Dialog.text.foreground: #00FF00
-! *Dialog.text.background: #006600
-! *Dialog.Button.foreground: #00FF00
-! *Dialog.Button.background: #006600
-! *passwd.thermometer.foreground: #00CC00
-! *passwd.thermometer.background: #006600
-
+*greenblack.Dialog.foreground: #00FF00
+*greenblack.Dialog.background: #000000
+*greenblack.Dialog.topShadowColor: #000000
+*greenblack.Dialog.bottomShadowColor: #000000
+*greenblack.Dialog.shadowWidth: 1
+*greenblack.Dialog.text.foreground: #00FF00
+*greenblack.Dialog.text.background: #006600
+*greenblack.Dialog.button.foreground: #00FF00
+*greenblack.Dialog.button.background: #006600
+*greenblack.Dialog.logo.background: #000000
+*greenblack.Dialog.thermometer.foreground: #00CC00
+*greenblack.Dialog.thermometer.background: #006600
+*greenblack.Dialog.borderColor: #006600
+*greenblack.Dialog.borderWidth: 1
! White theme:
!
-! *Dialog.foreground: #000000
-! *Dialog.background: #FFFFFF
-! *Dialog.topShadowColor: #CCCCCC
-! *Dialog.bottomShadowColor: #CCCCCC
-! *Dialog.shadowThickness: 1
-! *Dialog.text.foreground: #000000
-! *Dialog.text.background: #FFFFFF
-! *Dialog.Button.foreground: #000000
-! *Dialog.Button.background: #FFFFFF
-
+*white.Dialog.foreground: #000000
+*white.Dialog.background: #FFFFFF
+*white.Dialog.topShadowColor: #CCCCCC
+*white.Dialog.bottomShadowColor: #CCCCCC
+*white.Dialog.shadowWidth: 1
+*white.Dialog.borderColor: #CCCCCC
+*white.Dialog.text.foreground: #000000
+*white.Dialog.text.background: #FFFFFF
+*white.Dialog.button.foreground: #000000
+*white.Dialog.button.background: #FFFFFF
+*white.Dialog.logo.background: #FFFFFF
+*white.Dialog.borderWidth: 0
! Blue theme:
!
-! *Dialog.foreground: #000000
-! *Dialog.background: #BBCCDD
-! *Dialog.topShadowColor: #CCDDEE
-! *Dialog.bottomShadowColor: #AABBCC
-! *Dialog.text.foreground: #000000
-! *Dialog.text.background: #DDEEFF
-! *Dialog.Button.foreground: #000000
-! *Dialog.Button.background: #DDEEFF
-! *passwd.thermometer.foreground: #5566AA
-! *passwd.thermometer.background: #BBCCDD
-
+*blue.Dialog.foreground: #000000
+*blue.Dialog.background: #BBCCDD
+*blue.Dialog.topShadowColor: #CCDDEE
+*blue.Dialog.bottomShadowColor: #AABBCC
+*blue.Dialog.borderColor: #AABBCC
+*blue.Dialog.text.foreground: #000000
+*blue.Dialog.text.background: #DDEEFF
+*blue.Dialog.button.foreground: #000000
+*blue.Dialog.button.background: #DDEEFF
+*blue.Dialog.logo.background: #BBCCDD
+*blue.Dialog.thermometer.foreground: #5566AA
+*blue.Dialog.thermometer.background: #BBCCDD
+*blue.Dialog.borderWidth: 0
! Aqua on black borderless theme:
!
-! *Dialog.foreground: #00EFEF
-! *Dialog.background: #000000
-! *Dialog.topShadowColor: #000000
-! *Dialog.bottomShadowColor: #000000
-! *Dialog.Button.foreground: #000000
-! *Dialog.Button.background: #2244EE
-! *Dialog.text.foreground: #2244EE
-! *Dialog.text.background: #EEEEEE
-! *Dialog.internalBorderWidth: 36
-! *Dialog.borderWidth: 4
-! *Dialog.shadowThickness: 2
-! *passwd.thermometer.foreground: #2244EE
-! *passwd.thermometer.background: #000088
-
+*aquablack.Dialog.foreground: #00EFEF
+*aquablack.Dialog.background: #000000
+*aquablack.Dialog.topShadowColor: #000000
+*aquablack.Dialog.bottomShadowColor: #000000
+*aquablack.Dialog.shadowWidth: 2
+*aquablack.Dialog.button.foreground: #000000
+*aquablack.Dialog.button.background: #2244EE
+*aquablack.Dialog.logo.background: #000000
+*aquablack.Dialog.text.foreground: #2244EE
+*aquablack.Dialog.text.background: #EEEEEE
+*aquablack.Dialog.thermometer.foreground: #2244EE
+*aquablack.Dialog.thermometer.background: #000088
+*aquablack.Dialog.borderColor: #000066
+*aquablack.Dialog.borderWidth: 1
+*aquablack.Dialog.internalPadding: 36
! Wine theme, similar to the login screen of "Ubuntu 18.04 Community".
!
-! *Dialog.foreground: #AD8FA6
-! *Dialog.background: #2C041E
-! *Dialog.topShadowColor: #2C041E
-! *Dialog.bottomShadowColor: #2C041E
-! *Dialog.text.foreground: #706B70
-! *Dialog.text.background: #F9F9F8
-! *Dialog.Button.foreground: #CFC8CB
-! *Dialog.Button.background: #4D2946
-! *passwd.thermometer.foreground: #AD8FA6
-! *passwd.thermometer.background: #4D2946
-! *passwd.thermometer.width: 6
+*wine.Dialog.foreground: #AD8FA6
+*wine.Dialog.background: #2C041E
+*wine.Dialog.topShadowColor: #2C041E
+*wine.Dialog.bottomShadowColor: #2C041E
+*wine.Dialog.text.foreground: #706B70
+*wine.Dialog.text.background: #F9F9F8
+*wine.Dialog.button.foreground: #5F585B
+*wine.Dialog.logo.background: #2C041E
+*wine.Dialog.thermometer.foreground: #AD8FA6
+*wine.Dialog.thermometer.background: #4D2946
+*wine.Dialog.borderColor: #4D2946
+*wine.Dialog.thermometer.width: 6
+*wine.Dialog.borderWidth: 1
-! Static text in the dialog boxes:
+! For displaying error messages about crashed screen savers.
!
-*passwd.heading.label: XScreenSaver %s
-*passwd.body.label: This screen is locked.
-*passwd.unlock.label: OK
-*passwd.login.label: New Login
-*passwd.user.label: Username:
-
-*splash.heading.label: XScreenSaver %s
-*splash.body.label: Copyright \251 1991-2020 by
-*splash.body2.label: Jamie Zawinski <jwz@jwz.org>
-*splash.demo.label: Settings
-*splash.help.label: Help
+*errorFont: sans-serif bold 18
+*errorColor: #FF0000
!=============================================================================
@@ -347,7 +318,7 @@ XScreenSaver.bourneShell: /bin/sh
! If you want to disable a screensaver, DO NOT remove it from this list:
! instead, mark it as inactive by placing a "-" at the beginning of the line.
!
-! You can use the `xscreensaver-demo' program to edit the current list of
+! You can use the `xscreensaver-settings' program to edit the current list of
! screen savers interactively.
!
!=============================================================================
@@ -589,111 +560,132 @@ XScreenSaver.bourneShell: /bin/sh
vfeedback -root \n\
@GL_KLUDGE@ GL: deepstars -root \n\
@GL_KLUDGE@ GL: gravitywell -root \n\
+@GL_KLUDGE@ GL: beats -root \n\
+@GL_KLUDGE@ GL: covid19 -root \n\
@GL_KLUDGE@ GL: etruscanvenus -root \n\
-@GL_KLUDGE@ GL: gibson -root \n
+@GL_KLUDGE@ GL: gibson -root \n\
+@GL_KLUDGE@ GL: headroom -root \n\
+@GL_KLUDGE@ GL: sphereeversion -root \n
!=============================================================================
!
! Pretty names for the hacks that have unusual capitalization.
-! Used by xscreensaver-demo.
+! Used by xscreensaver-settings.
!
!=============================================================================
-*hacks.antinspect.name: AntInspect
-*hacks.antmaze.name: AntMaze
-*hacks.antspotlight.name: AntSpotlight
-*hacks.binaryring.name: BinaryRing
-*hacks.blinkbox.name: BlinkBox
-*hacks.blitspin.name: BlitSpin
-*hacks.blocktube.name: BlockTube
-*hacks.bouncingcow.name: BouncingCow
-*hacks.boxfit.name: BoxFit
+*hacks.antinspect.name: Ant Inspect
+*hacks.antmaze.name: Ant Maze
+*hacks.antspotlight.name: Ant Spotlight
+*hacks.apple2.name: Apple ][
+*hacks.binaryring.name: Binary Ring
+*hacks.blinkbox.name: Blink Box
+*hacks.blitspin.name: Blit Spin
+*hacks.blocktube.name: Block Tube
+*hacks.bouncingcow.name: Bouncing Cow
+*hacks.boxfit.name: Box Fit
*hacks.bsod.name: BSOD
-*hacks.bubble3d.name: Bubble3D
-*hacks.ccurve.name: CCurve
-*hacks.cloudlife.name: CloudLife
-*hacks.companioncube.name: CompanionCube
-*hacks.cubestack.name: CubeStack
-*hacks.cubestorm.name: CubeStorm
-*hacks.cubetwist.name: CubeTwist
-*hacks.cubicgrid.name: CubicGrid
-*hacks.cwaves.name: CWaves
-*hacks.dangerball.name: DangerBall
-*hacks.decayscreen.name: DecayScreen
-*hacks.deepstars.name: DeepStars
+*hacks.bubble3d.name: Bubble 3D
+*hacks.ccurve.name: C Curve
+*hacks.cityflow.name: City Flow
+*hacks.cloudlife.name: Cloud Life
+*hacks.companioncube.name: Companion Cube
+*hacks.covid19.name: COVID19
+*hacks.cube21.name: Cube 21
+*hacks.cubestack.name: Cube Stack
+*hacks.cubestorm.name: Cube Storm
+*hacks.cubetwist.name: Cube Twist
+*hacks.cubicgrid.name: Cubic Grid
+*hacks.cwaves.name: C Waves
+*hacks.dangerball.name: Danger Ball
+*hacks.decayscreen.name: Decay Screen
+*hacks.deepstars.name: Deep Stars
*hacks.dnalogo.name: DNA Logo
-*hacks.dymaxionmap.name: DymaxionMap
-*hacks.energystream.name: EnergyStream
-*hacks.etruscanvenus.name: EtruscanVenus
-*hacks.euler2d.name: Euler2D
-*hacks.fadeplot.name: FadePlot
-*hacks.filmleader.name: FilmLeader
-*hacks.flipflop.name: FlipFlop
-*hacks.flipscreen3d.name: FlipScreen3D
-*hacks.fliptext.name: FlipText
-*hacks.fluidballs.name: FluidBalls
-*hacks.flyingtoasters.name: FlyingToasters
-*hacks.fontglide.name: FontGlide
-*hacks.fuzzyflakes.name: FuzzyFlakes
-*hacks.geodesicgears.name: GeodesicGears
+*hacks.dymaxionmap.name: Dymaxion Map
+*hacks.energystream.name: Energy Stream
+*hacks.etruscanvenus.name: Etruscan Venus
+*hacks.euler2d.name: Euler 2D
+*hacks.fadeplot.name: Fade Plot
+*hacks.fiberlamp.name: Fiber Lamp
+*hacks.filmleader.name: Film Leader
+*hacks.flipflop.name: Flip Flop
+*hacks.flipscreen3d.name: Flip Screen 3D
+*hacks.fliptext.name: Flip Text
+*hacks.fluidballs.name: Fluid Balls
+*hacks.flyingtoasters.name: Flying Toasters
+*hacks.fontglide.name: Font Glide
+*hacks.fuzzyflakes.name: Fuzzy Flakes
+*hacks.geodesicgears.name: Geodesic Gears
*hacks.gflux.name: GFlux
+*hacks.glblur.name: GL Blur
+*hacks.glcells.name: GL Cells
*hacks.gleidescope.name: Gleidescope
-*hacks.glforestfire.name: GLForestFire
+*hacks.glforestfire.name: GL Forest Fire
+*hacks.glhanoi.name: GL Hanoi
*hacks.glitchpeg.name: GlitchPEG
-*hacks.gravitywell.name: GravityWell
-*hacks.hyperball.name: HyperBall
-*hacks.hypercube.name: HyperCube
+*hacks.glknots.name: GL Knots
+*hacks.glmatrix.name: GL Matrix
+*hacks.glplanet.name: GL Planet
+*hacks.glschool.name: GL School
+*hacks.glslideshow.name: GL Slideshow
+*hacks.glsnake.name: GL Snake
+*hacks.gltext.name: GL Text
+*hacks.gravitywell.name: Gravity Well
+*hacks.hexstrut.name: Hex Strut
*hacks.ifs.name: IFS
-*hacks.imsmap.name: IMSMap
-*hacks.jigglypuff.name: JigglyPuff
-*hacks.juggler3d.name: Juggler3D
-*hacks.lcdscrub.name: LCDscrub
+*hacks.imsmap.name: IMS Map
+*hacks.jigglypuff.name: Jiggly Puff
+*hacks.juggler3d.name: Juggler 3D
+*hacks.lcdscrub.name: LCD Scrub
*hacks.lmorph.name: LMorph
*hacks.m6502.name: m6502
-*hacks.maze3d.name: Maze3D
-*hacks.memscroller.name: MemScroller
-*hacks.metaballs.name: MetaBalls
-*hacks.mirrorblob.name: MirrorBlob
-*hacks.moebiusgears.name: MoebiusGears
-*hacks.morph3d.name: Morph3D
-*hacks.nerverot.name: NerveRot
-*hacks.noseguy.name: NoseGuy
-*hacks.popsquares.name: PopSquares
-*hacks.projectiveplane.name:ProjectivePlane
-*hacks.quasicrystal.name: QuasiCrystal
-*hacks.raverhoop.name: RaverHoop
-*hacks.razzledazzle.name: RazzleDazzle
-*hacks.rd-bomb.name: RDbomb
-*hacks.rdbomb.name: RDbomb
-*hacks.romanboy.name: RomanBoy
-*hacks.rotzoomer.name: RotZoomer
-*hacks.rubikblocks.name: RubikBlocks
+*hacks.maze3d.name: Maze 3D
+*hacks.memscroller.name: Mem Scroller
+*hacks.metaballs.name: Meta Balls
+*hacks.mirrorblob.name: Mirror Blob
+*hacks.moebius.name: Möbius
+*hacks.moebiusgears.name: Möbius Gears
+*hacks.moire.name: Moiré
+*hacks.moire2.name: Moiré 2
+*hacks.morph3d.name: Morph 3D
+*hacks.nerverot.name: Nerve Rot
+*hacks.noseguy.name: Nose Guy
+*hacks.pacman.name: Pac-Man
+*hacks.photopile.name: Photo Pile
+*hacks.popsquares.name: Pop Squares
+*hacks.projectiveplane.name:Projective Plane
+*hacks.quasicrystal.name: Quasi-Crystal
+*hacks.raverhoop.name: Raver Hoop
+*hacks.razzledazzle.name: Razzle Dazzle
+*hacks.rd-bomb.name: RD-Bomb
+*hacks.rd-bomb.name: RD-Bomb
+*hacks.romanboy.name: Roman Boy
+*hacks.rotzoomer.name: Rot Zoomer
+*hacks.rubikblocks.name: Rubik Blocks
*hacks.sballs.name: SBalls
-*hacks.shadebobs.name: ShadeBobs
-*hacks.sierpinski3d.name: Sierpinski3D
-*hacks.skytentacles.name: SkyTentacles
-*hacks.slidescreen.name: SlideScreen
-*hacks.speedmine.name: SpeedMine
-*hacks.splitflap.name: SplitFlap
-*hacks.starwars.name: StarWars
-*hacks.stonerview.name: StonerView
+*hacks.shadebobs.name: Shade Bobs
+*hacks.sierpinski3d.name: Sierpinski 3D
+*hacks.skytentacles.name: Sky Tentacles
+*hacks.slidescreen.name: Slide Screen
+*hacks.speedmine.name: Speed Mine
+*hacks.sphereeversion.name: Sphere Eversion
+*hacks.splitflap.name: Split-Flap
+*hacks.starwars.name: Star Wars
+*hacks.stonerview.name: Stoner View
*hacks.t3d.name: T3D
-*hacks.testx11.name: TestX11
-*hacks.timetunnel.name: TimeTunnel
-*hacks.topblock.name: TopBlock
-*hacks.tronbit.name: TronBit
-*hacks.unknownpleasures.name:UnknownPleasures
+*hacks.testx11.name: Test X11
+*hacks.timetunnel.name: Time Tunnel
+*hacks.topblock.name: Top Block
+*hacks.tronbit.name: Tron Bit
+*hacks.unknownpleasures.name:Unknown Pleasures
*hacks.vfeedback.name: VFeedback
-*hacks.vidwhacker.name: VidWhacker
-*hacks.webcollage.name: WebCollage
-*hacks.whirlwindwarp.name: WhirlWindWarp
-*hacks.winduprobot.name: WindupRobot
+*hacks.vidwhacker.name: Vid Whacker
+*hacks.webcollage.name: Web Collage
+*hacks.whirlwindwarp.name: Whirlwind Warp
+*hacks.winduprobot.name: Windup Robot
*hacks.xanalogtv.name: XAnalogTV
*hacks.xrayswarm.name: XRaySwarm
-! obsolete, but still used by xscreensaver-demo-Xm.
-*hacks.documentation.isInstalled: True
-
! (xrdb prevention kludge: whole file) */
diff --git a/driver/XScreenSaver_Xm_ad.h b/driver/XScreenSaver_Xm_ad.h
new file mode 100644
index 0000000..371e0a2
--- /dev/null
+++ b/driver/XScreenSaver_Xm_ad.h
@@ -0,0 +1,108 @@
+"*fontList: *-helvetica-medium-r-*-*-*-120-*-*-*-iso8859-1",
+"*demoDialog*label1.fontList: *-helvetica-medium-r-*-*-*-140-*-*-*-iso8859-1",
+"*cmdText.fontList: *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1",
+"*label0.fontList: *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1",
+"XScreenSaver*doc.fontList: *-helvetica-medium-r-*-*-*-100-*-*-*-iso8859-1",
+"*foreground: #000000",
+"*background: #C0C0C0",
+"*XmTextField.foreground: #000000",
+"*XmTextField.background: #FFFFFF",
+"*list.foreground: #000000",
+"*list.background: #FFFFFF",
+"*ApplicationShell.title: XScreenSaver",
+"*warning.title: XScreenSaver",
+"*warning_popup.title: XScreenSaver",
+"*allowShellResize: True",
+"*autoUnmanage: False",
+"*menubar*file.labelString: File",
+"*menubar*file.mnemonic: F",
+"*file.blank.labelString: Blank Screen Now",
+"*file.blank.mnemonic: B",
+"*file.lock.labelString: Lock Screen Now",
+"*file.lock.mnemonic: L",
+"*file.kill.labelString: Kill Daemon",
+"*file.kill.mnemonic: K",
+"*file.restart.labelString: Restart Daemon",
+"*file.restart.mnemonic: R",
+"*file.exit.labelString: Exit",
+"*file.exit.mnemonic: E",
+"*menubar*edit.labelString: Edit",
+"*menubar*edit.mnemonic: E",
+"*edit.cut.labelString: Cut",
+"*edit.cut.mnemonic: u",
+"*edit.copy.labelString: Copy",
+"*edit.copy.mnemonic: C",
+"*edit.paste.labelString: Paste",
+"*edit.paste.mnemonic: P",
+"*menubar*help.labelString: Help",
+"*menubar*help.mnemonic: H",
+"*help.about.labelString: About...",
+"*help.about.mnemonic: A",
+"*help.docMenu.labelString: Documentation...",
+"*help.docMenu.mnemonic: D",
+"*demoTab.marginWidth: 10",
+"*optionsTab.marginWidth: 10",
+"*XmScrolledWindow.topOffset: 10",
+"*XmScrolledWindow.leftOffset: 10",
+"*demoTab.topOffset: 4",
+"*form1.bottomOffset: 10",
+"*form3.leftOffset: 10",
+"*form3.rightOffset: 10",
+"*frame.topOffset: 10",
+"*frame.bottomOffset: 10",
+"*enabled.topOffset: 10",
+"*visLabel.topOffset: 10",
+"*combo.topOffset: 10",
+"*form4.bottomOffset: 4",
+"*hr.bottomOffset: 4",
+"*XmComboBox.marginWidth: 0",
+"*XmComboBox.marginHeight: 0",
+"*demo.marginWidth: 30",
+"*demo.marginHeight: 4",
+"*man.marginWidth: 10",
+"*man.marginHeight: 4",
+"*down.leftOffset: 40",
+"*down.marginWidth: 4",
+"*down.marginHeight: 4",
+"*up.marginWidth: 4",
+"*up.marginHeight: 4",
+"*frame.traversalOn: False",
+"*list.automaticSelection: True",
+"*list.visibleItemCount: 20",
+"*doc.columns: 60",
+"*combo.columns: 11",
+"*demoTab.labelString: Graphics Demos",
+"*optionsTab.labelString: Screensaver Options",
+"*down.labelString: \\\\/ ",
+"*up.labelString: /\\\\ ",
+"*frameLabel.labelString: ",
+"*cmdLabel.labelString: Command Line:",
+"*cmdLabel.alignment: ALIGNMENT_BEGINNING",
+"*enabled.labelString: Enabled",
+"*visLabel.labelString: Visual:",
+"*visLabel.alignment: ALIGNMENT_END",
+"*visLabel.leftOffset: 20",
+"*demo.labelString: Demo",
+"*man.labelString: Documentation...",
+"*done.labelString: Quit",
+"*preferencesLabel.labelString: XScreenSaver Parameters",
+"*timeoutLabel.labelString: Saver Timeout",
+"*cycleLabel.labelString: Cycle Timeout",
+"*fadeSecondsLabel.labelString: Fade Duration",
+"*fadeTicksLabel.labelString: Fade Ticks",
+"*lockLabel.labelString: Lock Timeout",
+"*passwdLabel.labelString: Password Timeout",
+"*preferencesForm*XmTextField.columns: 8",
+"*verboseToggle.labelString: Verbose",
+"*cmapToggle.labelString: Install Colormap",
+"*fadeToggle.labelString: Fade Colormap",
+"*unfadeToggle.labelString: Unfade Colormap",
+"*lockToggle.labelString: Require Password",
+"*OK.marginWidth: 30",
+"*OK.marginHeight: 4",
+"*OK.leftOffset: 10",
+"*OK.bottomOffset: 10",
+"*Cancel.marginWidth: 30",
+"*Cancel.marginHeight: 4",
+"*Cancel.rightOffset: 10",
+"*Cancel.bottomOffset: 10",
diff --git a/driver/XScreenSaver_ad.h b/driver/XScreenSaver_ad.h
new file mode 100644
index 0000000..e5c4790
--- /dev/null
+++ b/driver/XScreenSaver_ad.h
@@ -0,0 +1,534 @@
+"#error Do not run app-defaults files through xrdb!",
+"#error That does not do what you might expect.",
+"#error Put this file in /usr/lib/X11/app-defaults/XScreenSaver instead.",
+"*mode: random",
+"*timeout: 0:10:00",
+"*cycle: 0:10:00",
+"*lockTimeout: 0:00:00",
+"*passwdTimeout: 0:00:30",
+"*dpmsEnabled: False",
+"*dpmsQuickoffEnabled: False",
+"*dpmsStandby: 2:00:00",
+"*dpmsSuspend: 2:00:00",
+"*dpmsOff: 4:00:00",
+"*grabDesktopImages: True",
+"*grabVideoFrames: False",
+"*chooseRandomImages: True",
+"*imageDirectory: /usr/share/wallpapers/",
+"*nice: 10",
+"*memoryLimit: 0",
+"*lock: False",
+"*verbose: False",
+"*fade: True",
+"*unfade: True",
+"*fadeSeconds: 0:00:03",
+"*fadeTicks: 20",
+"*splash: True",
+"*splashDuration: 0:00:05",
+"*visualID: default",
+"*installColormap: True",
+"*ignoreUninstalledPrograms: False",
+"*authWarningSlack: 20",
+"*textMode: file",
+"*textLiteral: XScreenSaver",
+"*textFile: /usr/share/doc/xserver-common/copyright",
+"*textProgram: fortune",
+"*textURL: https://en.wikipedia.org/w/index.php?title=Special:NewPages&feed=rss",
+"*demoCommand: xscreensaver-settings",
+"*helpURL: https://www.jwz.org/xscreensaver/man.html",
+"*loadURL: gnome-open '%s'",
+"*manualCommand: yelp man:%s || \
+ x-terminal-emulator -t '%s manual' \
+ -e /bin/sh -c \"man %s; read foo\"",
+"*dateFormat: %I:%M %p, %a %b %e",
+"*newLoginCommand: dm-tool switch-to-greeter",
+"XScreenSaver.pointerHysteresis: 10",
+"XScreenSaver.bourneShell: /bin/sh",
+"*dialogTheme: default",
+"*themeNames: Default, Borderless, Dark Gray, Borderless Black, \
+ Green Black, White, Blue, Aqua Black, Wine",
+"*Dialog.headingFont: sans-serif bold 16",
+"*Dialog.bodyFont: sans-serif 14",
+"*Dialog.errorFont: sans-serif bold 14",
+"*Dialog.labelFont: sans-serif bold 14",
+"*Dialog.unameFont: sans-serif 12",
+"*Dialog.buttonFont: sans-serif bold 14",
+"*Dialog.dateFont: sans-serif 9",
+"*passwd.uname: True",
+"*passwd.asterisks: True",
+"*default.Dialog.foreground: #000000",
+"*default.Dialog.background: #E6E6E6",
+"*default.Dialog.button.foreground: #000000",
+"*default.Dialog.button.background: #F5F5F5",
+"*default.Dialog.logo.background: #BBBBBB",
+"*default.Dialog.text.foreground: #000000",
+"*default.Dialog.error.foreground: #FF0000",
+"*default.Dialog.text.background: #FFFFFF",
+"*default.Dialog.topShadowColor: #FFFFFF",
+"*default.Dialog.bottomShadowColor: #CECECE",
+"*default.Dialog.shadowWidth: 2",
+"*default.Dialog.logo.width: 210",
+"*default.Dialog.logo.height: 210",
+"*default.Dialog.thermometer.foreground: #4464AC",
+"*default.Dialog.thermometer.background: #FFFFFF",
+"*default.Dialog.thermometer.width: 8",
+"*default.Dialog.borderColor: #CECECE",
+"*default.Dialog.borderWidth: 0",
+"*default.Dialog.internalPadding: 24",
+"*borderless.Dialog.topShadowColor: #E6E6E6",
+"*borderless.Dialog.button.background: #FFFFFF",
+"*borderless.Dialog.bottomShadowColor: #E6E6E6",
+"*borderless.Dialog.logo.background: #E6E6E6",
+"*borderless.Dialog.borderColor: #888888",
+"*borderless.Dialog.thermometer.width: 6",
+"*borderless.Dialog.borderWidth: 1",
+"*darkgray.Dialog.foreground: #CCCCCC",
+"*darkgray.Dialog.background: #333333",
+"*darkgray.Dialog.topShadowColor: #444444",
+"*darkgray.Dialog.bottomShadowColor: #111111",
+"*darkgray.Dialog.borderColor: #111111",
+"*darkgray.Dialog.text.foreground: #DDDDDD",
+"*darkgray.Dialog.text.background: #666666",
+"*darkgray.Dialog.button.foreground: #CCCCCC",
+"*darkgray.Dialog.button.background: #666666",
+"*darkgray.Dialog.logo.background: #444444",
+"*darkgray.Dialog.thermometer.foreground: #4464AC",
+"*darkgray.Dialog.thermometer.background: #666666",
+"*darkgray.Dialog.borderWidth: 0",
+"*borderlessblack.Dialog.foreground: #CCCCCC",
+"*borderlessblack.Dialog.background: #000000",
+"*borderlessblack.Dialog.topShadowColor: #000000",
+"*borderlessblack.Dialog.bottomShadowColor: #000000",
+"*borderlessblack.Dialog.text.foreground: #CCCCCC",
+"*borderlessblack.Dialog.text.background: #000000",
+"*borderlessblack.Dialog.button.foreground: #CCCCCC",
+"*borderlessblack.Dialog.button.background: #333333",
+"*borderlessblack.Dialog.logo.background: #000000",
+"*borderlessblack.Dialog.thermometer.foreground: #CCCCCC",
+"*borderlessblack.Dialog.thermometer.background: #333333",
+"*borderlessblack.Dialog.thermometer.width: 3",
+"*borderlessblack.Dialog.borderColor: #333333",
+"*borderlessblack.Dialog.borderWidth: 1",
+"*greenblack.Dialog.foreground: #00FF00",
+"*greenblack.Dialog.background: #000000",
+"*greenblack.Dialog.topShadowColor: #000000",
+"*greenblack.Dialog.bottomShadowColor: #000000",
+"*greenblack.Dialog.shadowWidth: 1",
+"*greenblack.Dialog.text.foreground: #00FF00",
+"*greenblack.Dialog.text.background: #006600",
+"*greenblack.Dialog.button.foreground: #00FF00",
+"*greenblack.Dialog.button.background: #006600",
+"*greenblack.Dialog.logo.background: #000000",
+"*greenblack.Dialog.thermometer.foreground: #00CC00",
+"*greenblack.Dialog.thermometer.background: #006600",
+"*greenblack.Dialog.borderColor: #006600",
+"*greenblack.Dialog.borderWidth: 1",
+"*white.Dialog.foreground: #000000",
+"*white.Dialog.background: #FFFFFF",
+"*white.Dialog.topShadowColor: #CCCCCC",
+"*white.Dialog.bottomShadowColor: #CCCCCC",
+"*white.Dialog.shadowWidth: 1",
+"*white.Dialog.borderColor: #CCCCCC",
+"*white.Dialog.text.foreground: #000000",
+"*white.Dialog.text.background: #FFFFFF",
+"*white.Dialog.button.foreground: #000000",
+"*white.Dialog.button.background: #FFFFFF",
+"*white.Dialog.logo.background: #FFFFFF",
+"*white.Dialog.borderWidth: 0",
+"*blue.Dialog.foreground: #000000",
+"*blue.Dialog.background: #BBCCDD",
+"*blue.Dialog.topShadowColor: #CCDDEE",
+"*blue.Dialog.bottomShadowColor: #AABBCC",
+"*blue.Dialog.borderColor: #AABBCC",
+"*blue.Dialog.text.foreground: #000000",
+"*blue.Dialog.text.background: #DDEEFF",
+"*blue.Dialog.button.foreground: #000000",
+"*blue.Dialog.button.background: #DDEEFF",
+"*blue.Dialog.logo.background: #BBCCDD",
+"*blue.Dialog.thermometer.foreground: #5566AA",
+"*blue.Dialog.thermometer.background: #BBCCDD",
+"*blue.Dialog.borderWidth: 0",
+"*aquablack.Dialog.foreground: #00EFEF",
+"*aquablack.Dialog.background: #000000",
+"*aquablack.Dialog.topShadowColor: #000000",
+"*aquablack.Dialog.bottomShadowColor: #000000",
+"*aquablack.Dialog.shadowWidth: 2",
+"*aquablack.Dialog.button.foreground: #000000",
+"*aquablack.Dialog.button.background: #2244EE",
+"*aquablack.Dialog.logo.background: #000000",
+"*aquablack.Dialog.text.foreground: #2244EE",
+"*aquablack.Dialog.text.background: #EEEEEE",
+"*aquablack.Dialog.thermometer.foreground: #2244EE",
+"*aquablack.Dialog.thermometer.background: #000088",
+"*aquablack.Dialog.borderColor: #000066",
+"*aquablack.Dialog.borderWidth: 1",
+"*aquablack.Dialog.internalPadding: 36",
+"*wine.Dialog.foreground: #AD8FA6",
+"*wine.Dialog.background: #2C041E",
+"*wine.Dialog.topShadowColor: #2C041E",
+"*wine.Dialog.bottomShadowColor: #2C041E",
+"*wine.Dialog.text.foreground: #706B70",
+"*wine.Dialog.text.background: #F9F9F8",
+"*wine.Dialog.button.foreground: #5F585B",
+"*wine.Dialog.logo.background: #2C041E",
+"*wine.Dialog.thermometer.foreground: #AD8FA6",
+"*wine.Dialog.thermometer.background: #4D2946",
+"*wine.Dialog.borderColor: #4D2946",
+"*wine.Dialog.thermometer.width: 6",
+"*wine.Dialog.borderWidth: 1",
+"*errorFont: sans-serif bold 18",
+"*errorColor: #FF0000",
+"*programs: \
+ maze -root \\n\
+ GL: superquadrics -root \\n\
+ attraction -root \\n\
+ blitspin -root \\n\
+ greynetic -root \\n\
+ helix -root \\n\
+ hopalong -root \\n\
+ imsmap -root \\n\
+- noseguy -root \\n\
+- pyro -root \\n\
+ qix -root \\n\
+- rocks -root \\n\
+ rorschach -root \\n\
+ decayscreen -root \\n\
+ flame -root \\n\
+ halo -root \\n\
+ slidescreen -root \\n\
+ pedal -root \\n\
+ bouboule -root \\n\
+- braid -root \\n\
+ coral -root \\n\
+ deco -root \\n\
+ drift -root \\n\
+- fadeplot -root \\n\
+ galaxy -root \\n\
+ goop -root \\n\
+ grav -root \\n\
+ ifs -root \\n\
+ GL: jigsaw -root \\n\
+ julia -root \\n\
+- kaleidescope -root \\n\
+ GL: moebius -root \\n\
+ moire -root \\n\
+ GL: morph3d -root \\n\
+ mountain -root \\n\
+ munch -root \\n\
+ penrose -root \\n\
+ GL: pipes -root \\n\
+ rd-bomb -root \\n\
+ GL: rubik -root \\n\
+- sierpinski -root \\n\
+ slip -root \\n\
+ GL: sproingies -root \\n\
+ starfish -root \\n\
+ strange -root \\n\
+ swirl -root \\n\
+ triangle -root \\n\
+ xjack -root \\n\
+ xlyap -root \\n\
+ GL: atlantis -root \\n\
+ bsod -root \\n\
+ GL: bubble3d -root \\n\
+ GL: cage -root \\n\
+- crystal -root \\n\
+ cynosure -root \\n\
+ discrete -root \\n\
+ distort -root \\n\
+ epicycle -root \\n\
+ flow -root \\n\
+ GL: glplanet -root \\n\
+ interference -root \\n\
+ kumppa -root \\n\
+ GL: lament -root \\n\
+ moire2 -root \\n\
+ GL: sonar -root \\n\
+ GL: stairs -root \\n\
+ truchet -root \\n\
+- vidwhacker -root \\n\
+ blaster -root \\n\
+ bumps -root \\n\
+ ccurve -root \\n\
+ compass -root \\n\
+ deluxe -root \\n\
+- demon -root \\n\
+- GL: extrusion -root \\n\
+- loop -root \\n\
+ penetrate -root \\n\
+ petri -root \\n\
+ phosphor -root \\n\
+ GL: pulsar -root \\n\
+ ripples -root \\n\
+ shadebobs -root \\n\
+ GL: sierpinski3d -root \\n\
+ spotlight -root \\n\
+ squiral -root \\n\
+ wander -root \\n\
+- webcollage -root \\n\
+ xflame -root \\n\
+ xmatrix -root \\n\
+ GL: gflux -root \\n\
+- nerverot -root \\n\
+ xrayswarm -root \\n\
+ xspirograph -root \\n\
+ GL: circuit -root \\n\
+ GL: dangerball -root \\n\
+- GL: dnalogo -root \\n\
+ GL: engine -root \\n\
+ GL: flipscreen3d -root \\n\
+ GL: gltext -root \\n\
+ GL: menger -root \\n\
+ GL: molecule -root \\n\
+ rotzoomer -root \\n\
+ scooter -root \\n\
+ speedmine -root \\n\
+ GL: starwars -root \\n\
+ GL: stonerview -root \\n\
+ vermiculate -root \\n\
+ whirlwindwarp -root \\n\
+ zoom -root \\n\
+ anemone -root \\n\
+ apollonian -root \\n\
+ GL: boxed -root \\n\
+ GL: cubenetic -root \\n\
+ GL: endgame -root \\n\
+ euler2d -root \\n\
+ fluidballs -root \\n\
+ GL: flurry -root \\n\
+- GL: glblur -root \\n\
+ GL: glsnake -root \\n\
+ halftone -root \\n\
+ GL: juggler3d -root \\n\
+ GL: lavalite -root \\n\
+- polyominoes -root \\n\
+ GL: queens -root \\n\
+- GL: sballs -root \\n\
+ GL: spheremonics -root \\n\
+- thornbird -root \\n\
+ twang -root \\n\
+- GL: antspotlight -root \\n\
+ apple2 -root \\n\
+ GL: atunnel -root \\n\
+ barcode -root \\n\
+ GL: blinkbox -root \\n\
+ GL: blocktube -root \\n\
+ GL: bouncingcow -root \\n\
+ cloudlife -root \\n\
+ GL: cubestorm -root \\n\
+ eruption -root \\n\
+ GL: flipflop -root \\n\
+ GL: flyingtoasters -root \\n\
+ fontglide -root \\n\
+ GL: gleidescope -root \\n\
+ GL: glknots -root \\n\
+ GL: glmatrix -root \\n\
+- GL: glslideshow -root \\n\
+ GL: hypertorus -root \\n\
+- GL: jigglypuff -root \\n\
+ metaballs -root \\n\
+ GL: mirrorblob -root \\n\
+ piecewise -root \\n\
+ GL: polytopes -root \\n\
+ pong -root \\n\
+ popsquares -root \\n\
+ GL: surfaces -root \\n\
+ xanalogtv -root \\n\
+ abstractile -root \\n\
+ anemotaxis -root \\n\
+- GL: antinspect -root \\n\
+ fireworkx -root \\n\
+ fuzzyflakes -root \\n\
+ interaggregate -root \\n\
+ intermomentary -root \\n\
+ memscroller -root \\n\
+ GL: noof -root \\n\
+ pacman -root \\n\
+ GL: pinion -root \\n\
+ GL: polyhedra -root \\n\
+- GL: providence -root \\n\
+ substrate -root \\n\
+ wormhole -root \\n\
+- GL: antmaze -root \\n\
+ GL: boing -root \\n\
+ boxfit -root \\n\
+ GL: carousel -root \\n\
+ celtic -root \\n\
+ GL: crackberg -root \\n\
+ GL: cube21 -root \\n\
+ fiberlamp -root \\n\
+ GL: fliptext -root \\n\
+ GL: glhanoi -root \\n\
+ GL: tangram -root \\n\
+ GL: timetunnel -root \\n\
+ GL: glschool -root \\n\
+ GL: topblock -root \\n\
+ GL: cubicgrid -root \\n\
+ cwaves -root \\n\
+ GL: gears -root \\n\
+ GL: glcells -root \\n\
+ GL: lockward -root \\n\
+ m6502 -root \\n\
+ GL: moebiusgears -root \\n\
+ GL: voronoi -root \\n\
+ GL: hypnowheel -root \\n\
+ GL: klein -root \\n\
+- lcdscrub -root \\n\
+ GL: photopile -root \\n\
+ GL: skytentacles -root \\n\
+ GL: rubikblocks -root \\n\
+ GL: companioncube -root \\n\
+ GL: hilbert -root \\n\
+ GL: tronbit -root \\n\
+ GL: geodesic -root \\n\
+ hexadrop -root \\n\
+ GL: kaleidocycle -root \\n\
+ GL: quasicrystal -root \\n\
+ GL: unknownpleasures -root \\n\
+ binaryring -root \\n\
+ GL: cityflow -root \\n\
+ GL: geodesicgears -root \\n\
+ GL: projectiveplane -root \\n\
+ GL: romanboy -root \\n\
+ tessellimage -root \\n\
+ GL: winduprobot -root \\n\
+ GL: splitflap -root \\n\
+ GL: cubestack -root \\n\
+ GL: cubetwist -root \\n\
+ GL: discoball -root \\n\
+ GL: dymaxionmap -root \\n\
+ GL: energystream -root \\n\
+ GL: hexstrut -root \\n\
+ GL: hydrostat -root \\n\
+ GL: raverhoop -root \\n\
+ GL: splodesic -root \\n\
+ GL: unicrud -root \\n\
+ GL: esper -root \\n\
+ GL: vigilance -root \\n\
+ GL: crumbler -root \\n\
+ filmleader -root \\n\
+ glitchpeg -root \\n\
+ GL: handsy -root \\n\
+ GL: maze3d -root \\n\
+ GL: peepers -root \\n\
+ GL: razzledazzle -root \\n\
+ vfeedback -root \\n\
+ GL: deepstars -root \\n\
+ GL: gravitywell -root \\n\
+ GL: beats -root \\n\
+ GL: covid19 -root \\n\
+ GL: etruscanvenus -root \\n\
+ GL: gibson -root \\n\
+ GL: headroom -root \\n\
+ GL: sphereeversion -root \\n",
+"*hacks.antinspect.name: Ant Inspect",
+"*hacks.antmaze.name: Ant Maze",
+"*hacks.antspotlight.name: Ant Spotlight",
+"*hacks.apple2.name: Apple ][",
+"*hacks.binaryring.name: Binary Ring",
+"*hacks.blinkbox.name: Blink Box",
+"*hacks.blitspin.name: Blit Spin",
+"*hacks.blocktube.name: Block Tube",
+"*hacks.bouncingcow.name: Bouncing Cow",
+"*hacks.boxfit.name: Box Fit",
+"*hacks.bsod.name: BSOD",
+"*hacks.bubble3d.name: Bubble 3D",
+"*hacks.ccurve.name: C Curve",
+"*hacks.cityflow.name: City Flow",
+"*hacks.cloudlife.name: Cloud Life",
+"*hacks.companioncube.name: Companion Cube",
+"*hacks.covid19.name: COVID19",
+"*hacks.cube21.name: Cube 21",
+"*hacks.cubestack.name: Cube Stack",
+"*hacks.cubestorm.name: Cube Storm",
+"*hacks.cubetwist.name: Cube Twist",
+"*hacks.cubicgrid.name: Cubic Grid",
+"*hacks.cwaves.name: C Waves",
+"*hacks.dangerball.name: Danger Ball",
+"*hacks.decayscreen.name: Decay Screen",
+"*hacks.deepstars.name: Deep Stars",
+"*hacks.dnalogo.name: DNA Logo",
+"*hacks.dymaxionmap.name: Dymaxion Map",
+"*hacks.energystream.name: Energy Stream",
+"*hacks.etruscanvenus.name: Etruscan Venus",
+"*hacks.euler2d.name: Euler 2D",
+"*hacks.fadeplot.name: Fade Plot",
+"*hacks.fiberlamp.name: Fiber Lamp",
+"*hacks.filmleader.name: Film Leader",
+"*hacks.flipflop.name: Flip Flop",
+"*hacks.flipscreen3d.name: Flip Screen 3D",
+"*hacks.fliptext.name: Flip Text",
+"*hacks.fluidballs.name: Fluid Balls",
+"*hacks.flyingtoasters.name: Flying Toasters",
+"*hacks.fontglide.name: Font Glide",
+"*hacks.fuzzyflakes.name: Fuzzy Flakes",
+"*hacks.geodesicgears.name: Geodesic Gears",
+"*hacks.gflux.name: GFlux",
+"*hacks.glblur.name: GL Blur",
+"*hacks.glcells.name: GL Cells",
+"*hacks.gleidescope.name: Gleidescope",
+"*hacks.glforestfire.name: GL Forest Fire",
+"*hacks.glhanoi.name: GL Hanoi",
+"*hacks.glitchpeg.name: GlitchPEG",
+"*hacks.glknots.name: GL Knots",
+"*hacks.glmatrix.name: GL Matrix",
+"*hacks.glplanet.name: GL Planet",
+"*hacks.glschool.name: GL School",
+"*hacks.glslideshow.name: GL Slideshow",
+"*hacks.glsnake.name: GL Snake",
+"*hacks.gltext.name: GL Text",
+"*hacks.gravitywell.name: Gravity Well",
+"*hacks.hexstrut.name: Hex Strut",
+"*hacks.ifs.name: IFS",
+"*hacks.imsmap.name: IMS Map",
+"*hacks.jigglypuff.name: Jiggly Puff",
+"*hacks.juggler3d.name: Juggler 3D",
+"*hacks.lcdscrub.name: LCD Scrub",
+"*hacks.lmorph.name: LMorph",
+"*hacks.m6502.name: m6502",
+"*hacks.maze3d.name: Maze 3D",
+"*hacks.memscroller.name: Mem Scroller",
+"*hacks.metaballs.name: Meta Balls",
+"*hacks.mirrorblob.name: Mirror Blob",
+"*hacks.moebius.name: Möbius",
+"*hacks.moebiusgears.name: Möbius Gears",
+"*hacks.moire.name: Moiré",
+"*hacks.moire2.name: Moiré 2",
+"*hacks.morph3d.name: Morph 3D",
+"*hacks.nerverot.name: Nerve Rot",
+"*hacks.noseguy.name: Nose Guy",
+"*hacks.pacman.name: Pac-Man",
+"*hacks.photopile.name: Photo Pile",
+"*hacks.popsquares.name: Pop Squares",
+"*hacks.projectiveplane.name:Projective Plane",
+"*hacks.quasicrystal.name: Quasi-Crystal",
+"*hacks.raverhoop.name: Raver Hoop",
+"*hacks.razzledazzle.name: Razzle Dazzle",
+"*hacks.rd-bomb.name: RD-Bomb",
+"*hacks.rd-bomb.name: RD-Bomb",
+"*hacks.romanboy.name: Roman Boy",
+"*hacks.rotzoomer.name: Rot Zoomer",
+"*hacks.rubikblocks.name: Rubik Blocks",
+"*hacks.sballs.name: SBalls",
+"*hacks.shadebobs.name: Shade Bobs",
+"*hacks.sierpinski3d.name: Sierpinski 3D",
+"*hacks.skytentacles.name: Sky Tentacles",
+"*hacks.slidescreen.name: Slide Screen",
+"*hacks.speedmine.name: Speed Mine",
+"*hacks.sphereeversion.name: Sphere Eversion",
+"*hacks.splitflap.name: Split-Flap",
+"*hacks.starwars.name: Star Wars",
+"*hacks.stonerview.name: Stoner View",
+"*hacks.t3d.name: T3D",
+"*hacks.testx11.name: Test X11",
+"*hacks.timetunnel.name: Time Tunnel",
+"*hacks.topblock.name: Top Block",
+"*hacks.tronbit.name: Tron Bit",
+"*hacks.unknownpleasures.name:Unknown Pleasures",
+"*hacks.vfeedback.name: VFeedback",
+"*hacks.vidwhacker.name: Vid Whacker",
+"*hacks.webcollage.name: Web Collage",
+"*hacks.whirlwindwarp.name: Whirlwind Warp",
+"*hacks.winduprobot.name: Windup Robot",
+"*hacks.xanalogtv.name: XAnalogTV",
+"*hacks.xrayswarm.name: XRaySwarm",
diff --git a/driver/atoms.c b/driver/atoms.c
new file mode 100644
index 0000000..e8b6add
--- /dev/null
+++ b/driver/atoms.c
@@ -0,0 +1,70 @@
+/* xscreensaver-command, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <X11/Xproto.h> /* for CARD32 */
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+
+#include "atoms.h"
+
+Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_RESPONSE,
+ XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_SELECT, XA_DEMO, XA_EXIT,
+ XA_BLANK, XA_LOCK, XA_ACTIVATE, XA_SUSPEND, XA_NEXT, XA_PREV,
+ XA_DEACTIVATE, XA_CYCLE, XA_RESTART, XA_PREFS,
+ XA_NET_WM_PID, XA_NET_WM_STATE, XA_NET_WM_STATE_ABOVE,
+ XA_NET_WM_STATE_FULLSCREEN, XA_NET_WM_BYPASS_COMPOSITOR,
+ XA_NET_WM_WINDOW_TYPE, XA_NET_WM_WINDOW_TYPE_SPLASH,
+ XA_NET_WM_WINDOW_TYPE_DIALOG, XA_NET_WM_WINDOW_TYPE_NOTIFICATION,
+ XA_NET_WM_WINDOW_TYPE_NORMAL;
+
+void
+init_xscreensaver_atoms (Display *dpy)
+{
+# define A(N) XInternAtom (dpy, (N), False)
+ XA_SCREENSAVER = A("SCREENSAVER");
+ XA_SCREENSAVER_ID = A("_SCREENSAVER_ID");
+ XA_SCREENSAVER_VERSION = A("_SCREENSAVER_VERSION");
+ XA_SCREENSAVER_STATUS = A("_SCREENSAVER_STATUS");
+ XA_SCREENSAVER_RESPONSE = A("_SCREENSAVER_RESPONSE");
+
+ XA_ACTIVATE = A("ACTIVATE");
+ XA_DEACTIVATE = A("DEACTIVATE");
+ XA_SUSPEND = A("SUSPEND");
+ XA_RESTART = A("RESTART");
+ XA_CYCLE = A("CYCLE");
+ XA_NEXT = A("NEXT");
+ XA_PREV = A("PREV");
+ XA_SELECT = A("SELECT");
+ XA_EXIT = A("EXIT");
+ XA_DEMO = A("DEMO");
+ XA_PREFS = A("PREFS");
+ XA_LOCK = A("LOCK");
+ XA_BLANK = A("BLANK");
+
+ XA_NET_WM_PID = A("_NET_WM_PID");
+ XA_NET_WM_STATE = A("_NET_WM_STATE");
+ XA_NET_WM_STATE_ABOVE = A("_NET_WM_STATE_ABOVE");
+ XA_NET_WM_STATE_FULLSCREEN = A("_NET_WM_STATE_FULLSCREEN");
+ XA_NET_WM_BYPASS_COMPOSITOR = A("_NET_WM_BYPASS_COMPOSITOR");
+ XA_NET_WM_WINDOW_TYPE = A("_NET_WM_WINDOW_TYPE");
+ XA_NET_WM_WINDOW_TYPE_SPLASH = A("_NET_WM_WINDOW_TYPE_SPLASH");
+ XA_NET_WM_WINDOW_TYPE_DIALOG = A("_NET_WM_WINDOW_TYPE_DIALOG");
+ XA_NET_WM_WINDOW_TYPE_NOTIFICATION = A("_NET_WM_WINDOW_TYPE_NOTIFICATION");
+ XA_NET_WM_WINDOW_TYPE_NORMAL = A("_NET_WM_WINDOW_TYPE_NORMAL");
+# undef A
+}
diff --git a/driver/atoms.h b/driver/atoms.h
new file mode 100644
index 0000000..b5a7b7c
--- /dev/null
+++ b/driver/atoms.h
@@ -0,0 +1,38 @@
+/* xscreensaver-command, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef _XSCREENSAVER_ATOMS_H_
+#define _XSCREENSAVER_ATOMS_H_
+
+extern Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_RESPONSE,
+ XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_SELECT, XA_DEMO, XA_EXIT,
+ XA_BLANK, XA_LOCK, XA_ACTIVATE, XA_SUSPEND, XA_NEXT, XA_PREV,
+ XA_DEACTIVATE, XA_CYCLE, XA_RESTART, XA_PREFS,
+ XA_NET_WM_PID, XA_NET_WM_STATE, XA_NET_WM_STATE_ABOVE,
+ XA_NET_WM_STATE_FULLSCREEN, XA_NET_WM_BYPASS_COMPOSITOR,
+ XA_NET_WM_WINDOW_TYPE, XA_NET_WM_WINDOW_TYPE_SPLASH,
+ XA_NET_WM_WINDOW_TYPE_DIALOG, XA_NET_WM_WINDOW_TYPE_NOTIFICATION,
+ XA_NET_WM_WINDOW_TYPE_NORMAL;
+
+extern void init_xscreensaver_atoms (Display *dpy);
+extern void xscreensaver_set_wm_atoms (Display *, Window,
+ int width, int height,
+ Window for_window);
+
+/* You might think that to store an array of 32-bit quantities onto a
+ server-side property, you would pass an array of 32-bit data quantities
+ into XChangeProperty(). You would be wrong. You have to use an array
+ of longs, even if long is 64 bits (using 32 of each 64.)
+ */
+typedef long PROP32;
+
+
+#endif /* _XSCREENSAVER_ATOMS_H_ */
diff --git a/driver/atomswm.c b/driver/atomswm.c
new file mode 100644
index 0000000..887dc2c
--- /dev/null
+++ b/driver/atomswm.c
@@ -0,0 +1,101 @@
+/* xscreensaver-command, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <X11/Xproto.h> /* for CARD32 */
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+
+#include "atoms.h"
+
+#ifdef HAVE_UNAME
+# include <sys/utsname.h> /* for uname() */
+#endif /* HAVE_UNAME */
+
+
+/* Set some properties to hopefully tell the window manager to leave us alone.
+ This is used by xscreensaver-gfx and xscreensaver-auth but not xscreensaver.
+ */
+void
+xscreensaver_set_wm_atoms (Display *dpy, Window window, int width, int height,
+ Window for_window)
+{
+ XClassHint class_hints;
+ XSizeHints size_hints;
+# ifdef HAVE_UNAME
+ struct utsname uts;
+# endif
+ Atom va[10];
+ long vl[10];
+ class_hints.res_name = "xscreensaver"; /* not progname */
+ class_hints.res_class = "XScreenSaver";
+ size_hints.flags = PMinSize | PMaxSize;
+ size_hints.min_width = size_hints.max_width = width; /* non-resizable */
+ size_hints.min_height = size_hints.max_height = height;
+ XStoreName (dpy, window, "XScreenSaver");
+ XSetClassHint (dpy, window, &class_hints);
+ XSetWMNormalHints (dpy, window, &size_hints);
+
+ /* XA_WM_COMMAND and _NET_WM_PID are later updated by spawn_screenhack. */
+ XChangeProperty (dpy, window, XA_WM_COMMAND,
+ XA_STRING, 8, PropModeReplace,
+ (unsigned char *) class_hints.res_name,
+ strlen (class_hints.res_name));
+
+# ifdef HAVE_UNAME
+ if (! uname (&uts))
+ XChangeProperty (dpy, window,
+ XA_WM_CLIENT_MACHINE, XA_STRING, 8,
+ PropModeReplace, (unsigned char *) uts.nodename,
+ strlen (uts.nodename));
+# endif
+
+ /* In the olden days, OverrideRedirect meant that the window manager did
+ not see or touch our window, but these days, compositing WMs like to
+ get up to all sorts of shenanigans. I don't know whether setting these
+ properties has any effect, but they *might* tell the WM to keep its
+ grubby paws off of our windows.
+ */
+
+ vl[0] = 1; /* _NET_WM_BYPASS_COMPOSITOR = 1 */
+ XChangeProperty (dpy, window, XA_NET_WM_BYPASS_COMPOSITOR, XA_CARDINAL, 32,
+ PropModeReplace, (unsigned char *) vl, 1);
+
+ /* _NET_WM_STATE = [ _NET_WM_STATE_ABOVE, _NET_WM_STATE_FULLSCREEN ] */
+ va[0] = XA_NET_WM_STATE_ABOVE;
+ va[1] = XA_NET_WM_STATE_FULLSCREEN;
+ XChangeProperty (dpy, window, XA_NET_WM_STATE, XA_ATOM, 32,
+ PropModeReplace, (unsigned char *) va, 2);
+
+ /* As there is no _NET_WM_WINDOW_TYPE_SCREENSAVER, which property is
+ most likely to effectively communicate "on top always" to the WM?
+ _NET_WM_WINDOW_TYPE = NORMAL, SPLASH, DIALOG or NOTIFICATION? */
+ va[0] = XA_NET_WM_WINDOW_TYPE_NOTIFICATION;
+ XChangeProperty (dpy, window, XA_NET_WM_WINDOW_TYPE, XA_ATOM, 32,
+ PropModeReplace, (unsigned char *) va, 1);
+
+ if (for_window) /* This is the error dialog for a saver window */
+ {
+ va[0] = for_window;
+ /* _WM_TRANSIENT_FOR = screensaver_window */
+ XChangeProperty (dpy, window,
+ XA_WM_TRANSIENT_FOR, XA_WINDOW, 32,
+ PropModeReplace, (unsigned char *) va, 1);
+ }
+}
diff --git a/driver/auth.h b/driver/auth.h
index 65e00f3..40594ea 100644
--- a/driver/auth.h
+++ b/driver/auth.h
@@ -1,9 +1,7 @@
/* auth.h --- Providing authentication mechanisms.
- *
+ * Copyright © 1993-2021 Jamie Zawinski <jwz@jwz.org>
* (c) 2007, Quest Software, Inc. All rights reserved.
- *
- * This file is part of XScreenSaver,
- * Copyright (c) 1993-2004 Jamie Zawinski <jwz@jwz.org>
+ * This file is part of XScreenSaver.
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -13,10 +11,8 @@
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
-#ifndef XSS_AUTH_H
-#define XSS_AUTH_H
-
-#include "types.h"
+#ifndef __XSCREENSAVER_AUTH_H__
+#define __XSCREENSAVER_AUTH_H__
#undef Bool
#undef True
@@ -25,7 +21,9 @@
#define True 1
#define False 0
-struct auth_message {
+extern Bool verbose_p;
+
+typedef struct {
enum {
AUTH_MSGTYPE_INFO,
AUTH_MSGTYPE_ERROR,
@@ -33,22 +31,61 @@ struct auth_message {
AUTH_MSGTYPE_PROMPT_ECHO
} type;
const char *msg;
-};
+} auth_message;
-struct auth_response {
+typedef struct {
char *response;
-};
+} auth_response;
-int
-gui_auth_conv(int num_msg,
- const struct auth_message auth_msgs[],
- struct auth_response **resp,
- saver_info *si);
-void
-xss_authenticate(saver_info *si, Bool verbose_p);
+/* To run all authentication methods.
+ */
+extern void disavow_privileges (void);
+extern Bool lock_priv_init (void);
+extern Bool lock_init (void);
+
+/* Returns true if authenticated. */
+extern Bool xscreensaver_auth (void *closure,
+ Bool (*conv_fn) (void *closure,
+ int nmsgs,
+ const auth_message *msg,
+ auth_response **resp),
+ void (*finished_fn) (void *closure,
+ Bool authenticated_p));
-void
-auth_finished_cb (saver_info *si);
+/* The implementations, called by xscreensaver_auth.
+ */
+#ifdef HAVE_KERBEROS
+extern Bool kerberos_lock_init (void);
+extern Bool kerberos_passwd_valid_p (void *closure, const char *plaintext);
#endif
+
+#ifdef HAVE_PAM
+extern Bool pam_priv_init (void);
+extern Bool pam_try_unlock (void *closure,
+ Bool (*conv_fn) (void *closure,
+ int nmsgs,
+ const auth_message *msg,
+ auth_response **resp));
+#endif
+
+#ifdef PASSWD_HELPER_PROGRAM
+extern Bool ext_priv_init (void);
+extern Bool ext_passwd_valid_p (void *closure, const char *plaintext);
+#endif
+
+extern Bool pwent_lock_init (void);
+extern Bool pwent_priv_init (void);
+extern Bool pwent_passwd_valid_p (void *closure, const char *plaintext);
+
+/* GUI conversation function to pass to xscreensaver_auth. */
+extern Bool xscreensaver_auth_conv (void *closure,
+ int num_msg,
+ const auth_message *msg,
+ auth_response **resp);
+extern void xscreensaver_auth_finished (void *closure, Bool authenticated_p);
+extern void xscreensaver_splash (void *root_widget);
+
+#endif /* __XSCREENSAVER_AUTH_H__ */
+
diff --git a/driver/blurb.c b/driver/blurb.c
new file mode 100644
index 0000000..d732a9b
--- /dev/null
+++ b/driver/blurb.c
@@ -0,0 +1,50 @@
+/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "blurb.h"
+
+#include <string.h>
+#include <time.h>
+
+const char *progname = "";
+int verbose_p = 0;
+
+const char *
+blurb (void)
+{
+ static char buf[255] = { 0 };
+ struct tm tm;
+ time_t now;
+ int i;
+
+ now = time ((time_t *) 0);
+ localtime_r (&now, &tm);
+ i = strlen (progname);
+ if (i > 40) i = 40;
+ memcpy (buf, progname, i);
+ buf[i++] = ':';
+ buf[i++] = ' ';
+ buf[i++] = '0' + (tm.tm_hour >= 10 ? tm.tm_hour/10 : 0);
+ buf[i++] = '0' + (tm.tm_hour % 10);
+ buf[i++] = ':';
+ buf[i++] = '0' + (tm.tm_min >= 10 ? tm.tm_min/10 : 0);
+ buf[i++] = '0' + (tm.tm_min % 10);
+ buf[i++] = ':';
+ buf[i++] = '0' + (tm.tm_sec >= 10 ? tm.tm_sec/10 : 0);
+ buf[i++] = '0' + (tm.tm_sec % 10);
+ buf[i] = 0;
+ return buf;
+}
+
diff --git a/driver/blurb.h b/driver/blurb.h
new file mode 100644
index 0000000..6e33c76
--- /dev/null
+++ b/driver/blurb.h
@@ -0,0 +1,11 @@
+/* progname plus timestamp */
+
+#ifndef __BLURB_H__
+#define __BLURB_H__
+
+extern const char *progname;
+extern int verbose_p;
+extern const char *blurb (void);
+
+#endif /* __BLURB_H__ */
+
diff --git a/driver/clientmsg.c b/driver/clientmsg.c
new file mode 100644
index 0000000..f3d9d71
--- /dev/null
+++ b/driver/clientmsg.c
@@ -0,0 +1,123 @@
+/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+
+#include "blurb.h"
+#include "atoms.h"
+#include "clientmsg.h"
+
+extern Bool verbose_p;
+
+static int
+error_handler (Display *dpy, XErrorEvent *error)
+{
+ return 0;
+}
+
+
+Window
+find_screensaver_window (Display *dpy, char **version)
+{
+ int i;
+ Window root = RootWindowOfScreen (DefaultScreenOfDisplay (dpy));
+ Window root2, parent, *kids;
+ unsigned int nkids;
+ XErrorHandler old_handler;
+ Window ret = 0;
+
+ XSync (dpy, False);
+ old_handler = XSetErrorHandler (error_handler);
+
+ if (version) *version = 0;
+
+ if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids))
+ abort ();
+ if (root != root2)
+ abort ();
+ if (parent)
+ abort ();
+ if (! (kids && nkids))
+ goto DONE;
+ for (i = 0; i < nkids; i++)
+ {
+ Atom type;
+ int format;
+ unsigned long nitems, bytesafter;
+ unsigned char *v = 0;
+ int status;
+
+ /* We're walking the list of root-level windows and trying to find
+ the one that has a particular property on it. We need to trap
+ BadWindows errors while doing this, because it's possible that
+ some random window might get deleted in the meantime. (That
+ window won't have been the one we're looking for.)
+ */
+ status = XGetWindowProperty (dpy, kids[i],
+ XA_SCREENSAVER_VERSION,
+ 0, 200, False, XA_STRING,
+ &type, &format, &nitems, &bytesafter,
+ &v);
+ if (status == Success && type != None)
+ {
+ ret = kids[i];
+ if (version)
+ *version = (char *) v;
+ else
+ XFree (v);
+ goto DONE;
+ }
+ if (v) XFree (v);
+ }
+
+ DONE:
+ if (kids) XFree (kids);
+ XSetErrorHandler (old_handler);
+ return ret;
+}
+
+
+void
+clientmessage_response (Display *dpy, XEvent *xev, Bool ok, const char *msg)
+{
+ char *proto;
+ int L = 0;
+
+ if (verbose_p || !ok)
+ {
+ Atom cmd = xev->xclient.data.l[0];
+ char *name = XGetAtomName (dpy, cmd);
+ fprintf (stderr, "%s: ClientMessage %s: %s\n", blurb(),
+ (name ? name : "???"), msg);
+ }
+
+ L = strlen (msg);
+ proto = (char *) malloc (L + 2);
+ if (!proto) return;
+ proto[0] = (ok ? '+' : '-');
+ memcpy (proto+1, msg, L);
+ L++;
+ proto[L] = 0;
+
+ XChangeProperty (dpy, xev->xclient.window,
+ XA_SCREENSAVER_RESPONSE, XA_STRING, 8,
+ PropModeReplace, (unsigned char *) proto, L);
+ free (proto);
+}
diff --git a/driver/clientmsg.h b/driver/clientmsg.h
new file mode 100644
index 0000000..cd836d8
--- /dev/null
+++ b/driver/clientmsg.h
@@ -0,0 +1,19 @@
+/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __CLIENTMSG_H__
+#define __CLIENTMSG_H__
+
+extern Window find_screensaver_window (Display *, char **version);
+extern void clientmessage_response (Display *, XEvent *, Bool ok,
+ const char *msg);
+
+#endif /* __CLIENTMSG_H__ */
diff --git a/driver/demo-Gtk-conf.c b/driver/demo-Gtk-conf.c
index bac6ecc..6d04215 100644
--- a/driver/demo-Gtk-conf.c
+++ b/driver/demo-Gtk-conf.c
@@ -1,5 +1,5 @@
/* demo-Gtk-conf.c --- implements the dynamic configuration dialogs.
- * xscreensaver, Copyright (c) 2001-2014 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 2001-2020 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -59,8 +59,21 @@
# endif /* LIBXML_VERSION */
#endif /* xmlChildrenNode */
+#if (__GNUC__ >= 4) /* Ignore useless warnings generated by gtk.h */
+# undef inline
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wstrict-prototypes"
+# pragma GCC diagnostic ignored "-Wlong-long"
+# pragma GCC diagnostic ignored "-Wvariadic-macros"
+# pragma GCC diagnostic ignored "-Wpedantic"
+#endif
+
#include <gtk/gtk.h>
+#if (__GNUC__ >= 4)
+# pragma GCC diagnostic pop
+#endif
+
#include "demo-Gtk-conf.h"
/* Deal with deprecation of direct access to struct fields on the way to GTK3
@@ -1320,7 +1333,7 @@ parameters_to_cmd_line (GList *parms, gboolean default_p)
{
int L = g_list_length (parms);
int LL = 0;
- char **strs = (char **) calloc (sizeof (*parms), L);
+ char **strs = (char **) calloc (sizeof (*strs), L);
char *result;
char *out;
int i, j;
@@ -1428,7 +1441,7 @@ parse_command_line_into_parameters (const char *filename,
char *option = rest->data;
rest->data = 0;
- if (option[0] != '-' && option[0] != '+')
+ if (option && option[0] != '-' && option[0] != '+')
{
if (debug_p)
fprintf (stderr, "%s: WARNING: %s: not a switch: \"%s\"\n",
@@ -1737,7 +1750,8 @@ get_description (GList *parms, gboolean verbose_p)
s++;
else if (s[1] == ' ' || s[1] == '\t')
s++; /* next line is indented: leave newline */
- else if (!strncmp(s+1, "http:", 5))
+ else if (!strncmp(s+1, "http:", 5) ||
+ !strncmp(s+1, "https:", 5))
s++; /* next line begins a URL: leave newline */
else
s[0] = ' '; /* delete newline to un-fold this line */
@@ -1770,7 +1784,7 @@ get_description (GList *parms, gboolean verbose_p)
}
#if 0
- if (verbose_p)
+ /*if (verbose_p)*/
{
fprintf (stderr, "%s: text read is \"%s\"\n", blurb(),doc->string);
fprintf (stderr, "%s: description is \"%s\"\n", blurb(), d);
diff --git a/driver/demo-Gtk.c b/driver/demo-Gtk.c
index da98c53..b5e82e2 100644
--- a/driver/demo-Gtk.c
+++ b/driver/demo-Gtk.c
@@ -1,5 +1,5 @@
/* demo-Gtk.c --- implements the interactive demo-mode and options dialogs.
- * xscreensaver, Copyright (c) 1993-2020 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 1993-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -16,6 +16,8 @@
#ifdef HAVE_GTK /* whole file */
+#include "blurb.h"
+
#include <xscreensaver-intl.h>
#include <stdlib.h>
@@ -35,18 +37,13 @@
# include <locale.h>
#endif /* ENABLE_NLS */
-#ifndef VMS
-# include <pwd.h> /* for getpwuid() */
-#else /* VMS */
-# include "vms-pwd.h"
-#endif /* VMS */
-
#ifdef HAVE_UNAME
# include <sys/utsname.h> /* for uname() */
#endif /* HAVE_UNAME */
#include <stdio.h>
#include <time.h>
+#include <pwd.h> /* for getpwuid() */
#include <sys/stat.h>
#include <sys/time.h>
@@ -68,20 +65,19 @@
#include <X11/IntrinsicP.h>
#include <X11/ShellP.h>
-#ifdef HAVE_XMU
-# ifndef VMS
-# include <X11/Xmu/Error.h>
-# else /* VMS */
-# include <Xmu/Error.h>
-# endif
-#else
-# include "xmu.h"
-#endif
-
#ifdef HAVE_XINERAMA
# include <X11/extensions/Xinerama.h>
#endif /* HAVE_XINERAMA */
+#if (__GNUC__ >= 4) /* Ignore useless warnings generated by gtk.h */
+# undef inline
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wstrict-prototypes"
+# pragma GCC diagnostic ignored "-Wlong-long"
+# pragma GCC diagnostic ignored "-Wvariadic-macros"
+# pragma GCC diagnostic ignored "-Wpedantic"
+#endif
+
#include <gtk/gtk.h>
#ifdef HAVE_CRAPPLET
@@ -92,38 +88,36 @@
#include <gdk/gdkx.h>
#ifdef HAVE_GTK2
-# include <glade/glade-xml.h>
# include <gmodule.h>
#else /* !HAVE_GTK2 */
# define G_MODULE_EXPORT /**/
#endif /* !HAVE_GTK2 */
-#if defined(DEFAULT_ICONDIR) && !defined(GLADE_DIR)
-# define GLADE_DIR DEFAULT_ICONDIR
-#endif
-#if !defined(DEFAULT_ICONDIR) && defined(GLADE_DIR)
-# define DEFAULT_ICONDIR GLADE_DIR
-#endif
-
#ifndef HAVE_XML
/* Kludge: this is defined in demo-Gtk-conf.c when HAVE_XML.
It is unused otherwise, so in that case, stub it out. */
static const char *hack_configuration_path = 0;
#endif
+#if (__GNUC__ >= 4)
+# pragma GCC diagnostic pop
+#endif
#include "version.h"
-#include "prefs.h"
+#include "types.h"
#include "resources.h" /* for parse_time() */
-#include "visual.h" /* for has_writable_cells() */
#include "remote.h" /* for xscreensaver_command() */
+#include "visual.h"
+#include "atoms.h"
#include "usleep.h"
+#include "xmu.h"
#include "logo-50.xpm"
#include "logo-180.xpm"
#include "demo-Gtk-conf.h"
+#include "atoms.h"
#include <stdio.h>
#include <string.h>
@@ -182,14 +176,6 @@ static void hack_subproc_environment (Window preview_window_id, Bool debug_p);
#define countof(x) (sizeof((x))/sizeof((*x)))
-/* You might think that to read an array of 32-bit quantities out of a
- server-side property, you would pass an array of 32-bit data quantities
- into XGetWindowProperty(). You would be wrong. You have to use an array
- of longs, even if long is 64 bits (using 32 of each 64.)
- */
-typedef long PROP32;
-
-char *progname = 0;
char *progclass = "XScreenSaver";
XrmDatabase db;
@@ -208,7 +194,7 @@ typedef struct {
conf_data *cdata; /* private data for per-hack configuration */
#ifdef HAVE_GTK2
- GladeXML *glade_ui; /* Glade UI file */
+ GtkBuilder *gtk_ui; /* UI file */
#endif /* HAVE_GTK2 */
Bool debug_p; /* whether to print diagnostics */
@@ -247,13 +233,6 @@ typedef struct {
a closure object of our own down into the various widget callbacks. */
static state *global_state_kludge;
-Atom XA_VROOT;
-Atom XA_SCREENSAVER, XA_SCREENSAVER_RESPONSE, XA_SCREENSAVER_VERSION;
-Atom XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_SELECT, XA_DEMO;
-Atom XA_ACTIVATE, XA_SUSPEND, XA_BLANK, XA_LOCK, XA_RESTART, XA_EXIT;
-Atom XA_NEXT, XA_PREV;
-
-
static void populate_demo_window (state *, int list_elt);
static void populate_prefs_page (state *);
static void populate_popup_window (state *);
@@ -272,16 +251,15 @@ static void kill_preview_subproc (state *, Bool reset_p);
static void schedule_preview_check (state *);
-/* Prototypes of functions used by the Glade-generated code,
- to avoid warnings.
+/* Prototypes of functions used by the Gtk-generated code, to avoid warnings.
*/
-void exit_menu_cb (GtkMenuItem *, gpointer user_data);
-void about_menu_cb (GtkMenuItem *, gpointer user_data);
-void doc_menu_cb (GtkMenuItem *, gpointer user_data);
-void file_menu_cb (GtkMenuItem *, gpointer user_data);
-void activate_menu_cb (GtkMenuItem *, gpointer user_data);
-void lock_menu_cb (GtkMenuItem *, gpointer user_data);
-void kill_menu_cb (GtkMenuItem *, gpointer user_data);
+void exit_menu_cb (GtkAction *, gpointer user_data);
+void about_menu_cb (GtkAction *, gpointer user_data);
+void doc_menu_cb (GtkAction *, gpointer user_data);
+void file_menu_cb (GtkAction *, gpointer user_data);
+void activate_menu_cb (GtkAction *, gpointer user_data);
+void lock_menu_cb (GtkAction *, gpointer user_data);
+void kill_menu_cb (GtkAction *, gpointer user_data);
void restart_menu_cb (GtkWidget *, gpointer user_data);
void run_this_cb (GtkButton *, gpointer user_data);
void manual_cb (GtkButton *, gpointer user_data);
@@ -303,33 +281,14 @@ void settings_switch_page_cb (GtkNotebook *, GtkNotebookPage *,
gint page_num, gpointer user_data);
void settings_cancel_cb (GtkButton *, gpointer user_data);
void settings_ok_cb (GtkButton *, gpointer user_data);
+void preview_theme_cb (GtkWidget *, gpointer user_data);
static void kill_gnome_screensaver (void);
static void kill_kde_screensaver (void);
-
/* Some random utility functions
*/
-const char *blurb (void);
-
-const char *
-blurb (void)
-{
- time_t now = time ((time_t *) 0);
- char *ct = (char *) ctime (&now);
- static char buf[255];
- int n = strlen(progname);
- if (n > 100) n = 99;
- strncpy(buf, progname, n);
- buf[n++] = ':';
- buf[n++] = ' ';
- strncpy(buf+n, ct+11, 8);
- strcpy(buf+n+9, ": ");
- return buf;
-}
-
-
static GtkWidget *
name_to_widget (state *s, const char *name)
{
@@ -339,38 +298,49 @@ name_to_widget (state *s, const char *name)
if (!*name) abort();
#ifdef HAVE_GTK2
- if (!s->glade_ui)
+ if (!s->gtk_ui)
{
- /* First try to load the Glade file from the current directory;
+ /* First try to load the UI file from the current directory;
if there isn't one there, check the installed directory.
*/
-# define GLADE_FILE_NAME "xscreensaver-demo.glade2"
- const char * const files[] = { GLADE_FILE_NAME,
- GLADE_DIR "/" GLADE_FILE_NAME };
+# define UI_FILE "xscreensaver.ui"
+ const char * const files[] = { UI_FILE,
+ DEFAULT_ICONDIR "/" UI_FILE };
int i;
+
+ s->gtk_ui = gtk_builder_new ();
+
for (i = 0; i < countof (files); i++)
{
struct stat st;
if (!stat (files[i], &st))
{
- s->glade_ui = glade_xml_new (files[i], NULL, NULL);
- break;
+ GError* error = NULL;
+
+ if (gtk_builder_add_from_file (s->gtk_ui, files[i], &error))
+ break;
+ else
+ {
+ g_warning ("Couldn't load builder file %s: %s",
+ files[i], error->message);
+ g_error_free (error);
+ }
}
}
- if (!s->glade_ui)
+ if (i >= countof (files))
{
fprintf (stderr,
- "%s: could not load \"" GLADE_FILE_NAME "\"\n"
- "\tfrom " GLADE_DIR "/ or current directory.\n",
+ "%s: could not load \"" UI_FILE "\"\n"
+ "\tfrom " DEFAULT_ICONDIR "/ or current directory.\n",
blurb());
exit (-1);
}
-# undef GLADE_FILE_NAME
+# undef UI_FILE
- glade_xml_signal_autoconnect (s->glade_ui);
+ gtk_builder_connect_signals (s->gtk_ui, NULL);
}
- w = glade_xml_get_widget (s->glade_ui, name);
+ w = GTK_WIDGET (gtk_builder_get_object (s->gtk_ui, name));
#else /* !HAVE_GTK2 */
@@ -382,7 +352,7 @@ name_to_widget (state *s, const char *name)
#endif /* HAVE_GTK2 */
if (w) return w;
- fprintf (stderr, "%s: no widget \"%s\" (wrong Glade file?)\n",
+ fprintf (stderr, "%s: no widget \"%s\" (wrong UI file?)\n",
blurb(), name);
abort();
}
@@ -774,12 +744,12 @@ run_hack (state *s, int list_elt, Bool report_errors_p)
/* Button callbacks
According to Eric Lassauge, this G_MODULE_EXPORT crud is needed to make
- libglade work on Cygwin; apparently all Glade callbacks need this magic
- extra declaration. I do not pretend to understand.
+ GTK work on Cygwin; apparently all GTK callbacks need this magic extra
+ declaration. I do not pretend to understand.
*/
G_MODULE_EXPORT void
-exit_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
+exit_menu_cb (GtkAction *menu_action, gpointer user_data)
{
state *s = global_state_kludge; /* I hate C so much... */
flush_dialog_changes_and_save (s);
@@ -798,28 +768,27 @@ wm_toplevel_close_cb (GtkWidget *widget, GdkEvent *event, gpointer data)
G_MODULE_EXPORT void
-about_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
+about_menu_cb (GtkAction *menu_action, gpointer user_data)
{
+#if 1
+ /* Let's just pop up the splash dialog instead. */
+ preview_theme_cb (NULL, user_data);
+#else
char msg [2048];
- char *vers = strdup (screensaver_id + 4);
- char *s, *s2;
char copy[1024];
- char year[5];
char *desc = _("For updates, check https://www.jwz.org/xscreensaver/");
- s = strchr (vers, ',');
+ char *version = strdup (screensaver_id + 17);
+ char *year = strchr (version, '-');
+ char *s = strchr (version, ' ');
+ *s = 0;
+ year = strchr (year+1, '-') + 1;
+ s = strchr (year, ')');
*s = 0;
- s += 2;
-
- s2 = vers;
- s2 = strrchr (vers, '-');
- s2++;
- strncpy (year, s2, 4);
- year[4] = 0;
/* Ole Laursen <olau@hardworking.dk> says "don't use _() here because
non-ASCII characters aren't allowed in localizable string keys."
- (I don't want to just use (c) instead of because that doesn't
+ (I don't want to just use (c) instead of © because that doesn't
look as good in the plain-old default Latin1 "C" locale.)
*/
#ifdef HAVE_GTK2
@@ -837,7 +806,7 @@ about_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
#ifdef HAVE_CRAPPLET
{
const gchar *auth[] = { 0 };
- GtkWidget *about = gnome_about_new (progclass, vers, "", auth, desc,
+ GtkWidget *about = gnome_about_new (progclass, version, "", auth, desc,
"xscreensaver.xpm");
gtk_widget_show (about);
}
@@ -851,7 +820,8 @@ about_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
GtkWidget *dialog = gtk_dialog_new ();
GtkWidget *hbox, *icon, *vbox, *label1, *label2, *hb, *ok;
- GtkWidget *parent = GTK_WIDGET (menuitem);
+ GSList *proxies = gtk_action_get_proxies (menu_action);
+ GtkWidget *parent = GTK_WIDGET (proxies->data);
while (GET_PARENT (parent))
parent = GET_PARENT (parent);
@@ -871,7 +841,7 @@ about_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
vbox = gtk_vbox_new (FALSE, 0);
gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
- label1 = gtk_label_new (vers);
+ label1 = gtk_label_new (version);
gtk_box_pack_start (GTK_BOX (vbox), label1, TRUE, TRUE, 0);
gtk_label_set_justify (GTK_LABEL (label1), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label1), 0.0, 0.75);
@@ -928,11 +898,12 @@ about_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
gdk_window_show (GET_WINDOW (GTK_WIDGET (dialog)));
gdk_window_raise (GET_WINDOW (GTK_WIDGET (dialog)));
}
+#endif /* 0 */
}
G_MODULE_EXPORT void
-doc_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
+doc_menu_cb (GtkAction *menu_action, gpointer user_data)
{
state *s = global_state_kludge; /* I hate C so much... */
saver_preferences *p = &s->prefs;
@@ -947,11 +918,11 @@ doc_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
}
help_command = (char *) malloc (strlen (p->load_url_command) +
- (strlen (p->help_url) * 4) + 20);
+ (strlen (p->help_url) * 5) + 20);
strcpy (help_command, "( ");
sprintf (help_command + strlen(help_command),
p->load_url_command,
- p->help_url, p->help_url, p->help_url, p->help_url);
+ p->help_url, p->help_url, p->help_url, p->help_url, p->help_url);
strcat (help_command, " ) &");
if (system (help_command) < 0)
fprintf (stderr, "%s: fork error\n", blurb());
@@ -960,7 +931,7 @@ doc_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
G_MODULE_EXPORT void
-file_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
+file_menu_cb (GtkAction *menu_action, gpointer user_data)
{
state *s = global_state_kludge; /* I hate C so much... */
sensitize_menu_items (s, False);
@@ -968,7 +939,7 @@ file_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
G_MODULE_EXPORT void
-activate_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
+activate_menu_cb (GtkAction *menu_action, gpointer user_data)
{
state *s = global_state_kludge; /* I hate C so much... */
run_cmd (s, XA_ACTIVATE, 0);
@@ -976,7 +947,7 @@ activate_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
G_MODULE_EXPORT void
-lock_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
+lock_menu_cb (GtkAction *menu_action, gpointer user_data)
{
state *s = global_state_kludge; /* I hate C so much... */
run_cmd (s, XA_LOCK, 0);
@@ -984,7 +955,7 @@ lock_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
G_MODULE_EXPORT void
-kill_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
+kill_menu_cb (GtkAction *menu_action, gpointer user_data)
{
state *s = global_state_kludge; /* I hate C so much... */
run_cmd (s, XA_EXIT, 0);
@@ -998,7 +969,7 @@ restart_menu_cb (GtkWidget *widget, gpointer user_data)
flush_dialog_changes_and_save (s);
xscreensaver_command (GDK_DISPLAY(), XA_EXIT, 0, False, NULL);
sleep (1);
- if (system ("xscreensaver -nosplash &") < 0)
+ if (system ("xscreensaver -splash &") < 0)
fprintf (stderr, "%s: fork error\n", blurb());
await_xscreensaver (s);
@@ -1084,12 +1055,6 @@ demo_write_init_file (state *s, saver_preferences *p)
{
Display *dpy = GDK_DISPLAY();
-#if 0
- /* #### try to figure out why shit keeps getting reordered... */
- if (strcmp (s->prefs.screenhacks[0]->name, "DNA Lounge Slideshow"))
- abort();
-#endif
-
if (!write_init_file (dpy, p, s->short_version, False))
{
if (s->debug_p)
@@ -1191,7 +1156,7 @@ force_list_select_item (state *s, GtkWidget *list, int list_elt, Bool scroll_p)
if (!was) gtk_widget_set_sensitive (parent, True);
#ifdef HAVE_GTK2
model = gtk_tree_view_get_model (GTK_TREE_VIEW (list));
- g_assert (model);
+ if (!model) abort();
if (gtk_tree_model_iter_nth_child (model, &iter, NULL, list_elt))
{
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (list));
@@ -1485,6 +1450,25 @@ flush_checkbox (GtkTreeModel *model,
#endif /* HAVE_GTK2 */
+
+static char *
+theme_name_strip (const char *s)
+{
+ const char *in = s;
+ char *s2 = strdup(s);
+ char *out = s2;
+ for (; *in; in++)
+ if (*in >= 'A' && *in <= 'Z')
+ *out++ = *in + ('a'-'A');
+ else if (*in == ' ' || *in == '\t')
+ ;
+ else
+ *out++ = *in;
+ *out = 0;
+ return s2;
+}
+
+
/* Flush out any changes made in the main dialog window (where changes
take place immediately: clicking on a checkbox causes the init file
to be written right away.)
@@ -1492,6 +1476,7 @@ flush_checkbox (GtkTreeModel *model,
static Bool
flush_dialog_changes_and_save (state *s)
{
+ Display *dpy = GDK_DISPLAY();
saver_preferences *p = &s->prefs;
saver_preferences P2, *p2 = &P2;
#ifdef HAVE_GTK2
@@ -1578,7 +1563,6 @@ flush_dialog_changes_and_save (state *s)
#if 0
CHECKBOX (p2->verbose_p, "verbose_button");
- CHECKBOX (p2->capture_stderr_p, "capture_button");
CHECKBOX (p2->splash_p, "splash_button");
#endif
@@ -1596,7 +1580,6 @@ flush_dialog_changes_and_save (state *s)
TEXT (p2->text_url, "text_url_entry");
}
- CHECKBOX (p2->install_cmap_p, "install_button");
CHECKBOX (p2->fade_p, "fade_button");
CHECKBOX (p2->unfade_p, "unfade_button");
SECONDS (&p2->fade_seconds, "fade_spinbutton");
@@ -1610,12 +1593,13 @@ flush_dialog_changes_and_save (state *s)
/* Warn if the image directory doesn't exist, when:
- not being warned before
- image directory is changed and the directory doesn't exist
- - image directory does not begin with http://
+ - image directory is not a URL
*/
if (p2->image_directory &&
*p2->image_directory &&
!directory_p (p2->image_directory) &&
- strncmp(p2->image_directory, "http://", 6) &&
+ strncmp(p2->image_directory, "http://", 7) &&
+ strncmp(p2->image_directory, "https://", 8) &&
( !already_warned_about_missing_image_directory ||
( p->image_directory &&
*p->image_directory &&
@@ -1634,11 +1618,8 @@ flush_dialog_changes_and_save (state *s)
/* Map the mode menu to `saver_mode' enum values. */
{
- GtkOptionMenu *opt = GTK_OPTION_MENU (name_to_widget (s, "mode_menu"));
- GtkMenu *menu = GTK_MENU (gtk_option_menu_get_menu (opt));
- GtkWidget *selected = gtk_menu_get_active (menu);
- GList *kids = gtk_container_children (GTK_CONTAINER (menu));
- int menu_elt = g_list_index (kids, (gpointer) selected);
+ GtkComboBox *opt = GTK_COMBO_BOX (name_to_widget (s, "mode_menu"));
+ int menu_elt = gtk_combo_box_get_active (opt);
if (menu_elt < 0 || menu_elt >= countof(mode_menu_order)) abort();
p2->mode = mode_menu_order[menu_elt];
}
@@ -1651,11 +1632,33 @@ flush_dialog_changes_and_save (state *s)
: -1);
}
+ /* Theme menu. */
+ {
+ GtkComboBox *cbox = GTK_COMBO_BOX (name_to_widget (s, "theme_menu"));
+ char *themes = get_string_resource (dpy, "themeNames", "ThemeNames");
+ int menu_index = gtk_combo_box_get_active (cbox);
+ char *token = themes;
+ char *name, *last;
+ int i = 0;
+ while ((name = strtok_r (token, ",", &last)))
+ {
+ token = 0;
+ if (i == menu_index)
+ {
+ char *name2 = theme_name_strip (name);
+ if (p->dialog_theme) free (p->dialog_theme);
+ p2->dialog_theme = name2;
+ }
+ i++;
+ }
+ }
+
# define COPY(field, name) \
if (p->field != p2->field) { \
changed = True; \
if (s->debug_p) \
- fprintf (stderr, "%s: %s => %d\n", blurb(), name, (int) p2->field); \
+ fprintf (stderr, "%s: %s => %ld\n", blurb(), \
+ name, (unsigned long) p2->field); \
} \
p->field = p2->field
@@ -1675,7 +1678,6 @@ flush_dialog_changes_and_save (state *s)
#if 0
COPY(verbose_p, "verbose_p");
- COPY(capture_stderr_p, "capture_stderr_p");
COPY(splash_p, "splash_p");
#endif
@@ -1690,6 +1692,7 @@ flush_dialog_changes_and_save (state *s)
COPY(grab_video_p, "grab_video_p");
COPY(random_image_p, "random_image_p");
+ COPY(dialog_theme, "dialog_theme");
# undef COPY
# define COPYSTR(FIELD,NAME) \
@@ -1717,14 +1720,7 @@ flush_dialog_changes_and_save (state *s)
if (changed)
{
- Display *dpy = GDK_DISPLAY();
- Bool enabled_p = (p->dpms_enabled_p && p->mode != DONT_BLANK);
- sync_server_dpms_settings (dpy, enabled_p, p->dpms_quickoff_p,
- p->dpms_standby / 1000,
- p->dpms_suspend / 1000,
- p->dpms_off / 1000,
- False);
-
+ sync_server_dpms_settings (GDK_DISPLAY(), p);
changed = demo_write_init_file (s, p);
}
@@ -1744,9 +1740,10 @@ flush_popup_changes_and_save (state *s)
int list_elt = selected_list_element (s);
GtkEntry *cmd = GTK_ENTRY (name_to_widget (s, "cmd_text"));
- GtkCombo *vis = GTK_COMBO (name_to_widget (s, "visual_combo"));
+ GtkComboBoxEntry *vis = GTK_COMBO_BOX_ENTRY (name_to_widget (s, "visual_combo"));
+ GtkEntry *visent = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (vis)));
- const char *visual = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (vis)->entry));
+ const char *visual = gtk_entry_get_text (visent);
const char *command = gtk_entry_get_text (cmd);
char c;
@@ -1791,7 +1788,7 @@ flush_popup_changes_and_save (state *s)
{
gdk_beep (); /* unparsable */
visual = "";
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (vis)->entry), _("Any"));
+ gtk_entry_set_text (visent, _("Any"));
}
changed = flush_changes (s, list_elt, -1, command, visual);
@@ -1839,21 +1836,8 @@ mode_menu_item_cb (GtkWidget *widget, gpointer user_data)
GtkWidget *list = name_to_widget (s, "list");
int list_elt;
- GList *menu_items =
- gtk_container_children (GTK_CONTAINER (GET_PARENT (widget)));
- int menu_index = 0;
- saver_mode new_mode;
-
- while (menu_items)
- {
- if (menu_items->data == widget)
- break;
- menu_index++;
- menu_items = menu_items->next;
- }
- if (!menu_items) abort();
-
- new_mode = mode_menu_order[menu_index];
+ int menu_index = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
+ saver_mode new_mode = mode_menu_order[menu_index];
/* Keep the same list element displayed as before; except if we're
switching *to* "one screensaver" mode from any other mode, set
@@ -1901,7 +1885,7 @@ list_activated_cb (GtkTreeView *list,
char *str;
int list_elt;
- g_return_if_fail (!gdk_pointer_is_grabbed ());
+ if (gdk_pointer_is_grabbed()) return;
str = gtk_tree_path_to_string (path);
list_elt = strtol (str, NULL, 10);
@@ -2305,7 +2289,12 @@ browse_text_program_cb (GtkButton *button, gpointer user_data)
}
-
+G_MODULE_EXPORT void
+preview_theme_cb (GtkWidget *w, gpointer user_data)
+{
+ if (system ("xscreensaver-auth --splash &") < 0)
+ fprintf (stderr, "%s: splash exec failed\n", blurb());
+}
G_MODULE_EXPORT void
@@ -2761,6 +2750,7 @@ update_list_sensitivity (state *s)
static void
populate_prefs_page (state *s)
{
+ Display *dpy = GDK_DISPLAY();
saver_preferences *p = &s->prefs;
Bool can_lock_p = True;
@@ -2813,7 +2803,6 @@ populate_prefs_page (state *s)
TOGGLE_ACTIVE ("lock_button", p->lock_p);
#if 0
TOGGLE_ACTIVE ("verbose_button", p->verbose_p);
- TOGGLE_ACTIVE ("capture_button", p->capture_stderr_p);
TOGGLE_ACTIVE ("splash_button", p->splash_p);
#endif
TOGGLE_ACTIVE ("dpms_button", p->dpms_enabled_p);
@@ -2821,7 +2810,6 @@ populate_prefs_page (state *s)
TOGGLE_ACTIVE ("grab_desk_button", p->grab_desktop_p);
TOGGLE_ACTIVE ("grab_video_button", p->grab_video_p);
TOGGLE_ACTIVE ("grab_image_button", p->random_image_p);
- TOGGLE_ACTIVE ("install_button", p->install_cmap_p);
TOGGLE_ACTIVE ("fade_button", p->fade_p);
TOGGLE_ACTIVE ("unfade_button", p->unfade_p);
@@ -2866,40 +2854,73 @@ populate_prefs_page (state *s)
p->tmode == TEXT_URL);
+ /* Theme menu */
+ {
+ GtkComboBox *cbox = GTK_COMBO_BOX (name_to_widget (s, "theme_menu"));
+
+ /* Without this, pref_changed_cb gets called an exponentially-increasing
+ number of times on the themes menu, despite the call to
+ gtk_list_store_clear(). */
+ static Bool done_once = False;
+
+ if (cbox && !done_once)
+ {
+ char *themes = get_string_resource (dpy, "themeNames", "ThemeNames");
+ char *token = themes;
+ char *name, *name2, *last;
+ GtkListStore *model;
+ GtkTreeIter iter;
+ int i = 0;
+ done_once = True;
+
+ g_object_get (G_OBJECT (cbox), "model", &model, NULL);
+ if (!model) abort();
+ gtk_list_store_clear (model);
+
+ gtk_signal_connect (GTK_OBJECT (cbox), "changed",
+ GTK_SIGNAL_FUNC (pref_changed_cb), (gpointer) s);
+
+ while ((name = strtok_r (token, ",", &last)))
+ {
+ int L;
+ token = 0;
+
+ /* Strip leading and trailing whitespace */
+ while (*name == ' ' || *name == '\t' || *name == '\n')
+ name++;
+ L = strlen(name);
+ while (L && (name[L-1] == ' ' || name[L-1] == '\t' ||
+ name[L-1] == '\n'))
+ name[--L] = 0;
+
+ gtk_list_store_append (model, &iter);
+ gtk_list_store_set (model, &iter, 0, name, -1);
+
+ name2 = theme_name_strip (name);
+ if (!strcmp (p->dialog_theme, name2))
+ gtk_combo_box_set_active (cbox, i);
+ free (name2);
+ i++;
+ }
+ }
+ }
+
+
/* Map the `saver_mode' enum to mode menu to values. */
{
- GtkOptionMenu *opt = GTK_OPTION_MENU (name_to_widget (s, "mode_menu"));
+ GtkComboBox *opt = GTK_COMBO_BOX (name_to_widget (s, "mode_menu"));
int i;
for (i = 0; i < countof(mode_menu_order); i++)
if (mode_menu_order[i] == p->mode)
break;
- gtk_option_menu_set_history (opt, i);
+ gtk_combo_box_set_active (opt, i);
update_list_sensitivity (s);
}
{
- Bool found_any_writable_cells = False;
- Bool fading_possible = False;
Bool dpms_supported = False;
-
Display *dpy = GDK_DISPLAY();
- int nscreens = ScreenCount(dpy); /* real screens, not Xinerama */
- int i;
- for (i = 0; i < nscreens; i++)
- {
- Screen *s = ScreenOfDisplay (dpy, i);
- if (has_writable_cells (s, DefaultVisualOfScreen (s)))
- {
- found_any_writable_cells = True;
- break;
- }
- }
-
- fading_possible = found_any_writable_cells;
-#ifdef HAVE_XF86VMODE_GAMMA
- fading_possible = True;
-#endif
#ifdef HAVE_DPMS_EXTENSION
{
@@ -2923,7 +2944,6 @@ populate_prefs_page (state *s)
*/
SENSITIZE ("dpms_frame", dpms_supported);
SENSITIZE ("dpms_button", dpms_supported);
- SENSITIZE ("dpms_quickoff_button", dpms_supported);
SENSITIZE ("dpms_standby_label", dpms_supported && p->dpms_enabled_p);
SENSITIZE ("dpms_standby_mlabel", dpms_supported && p->dpms_enabled_p);
@@ -2934,24 +2954,26 @@ populate_prefs_page (state *s)
SENSITIZE ("dpms_off_label", dpms_supported && p->dpms_enabled_p);
SENSITIZE ("dpms_off_mlabel", dpms_supported && p->dpms_enabled_p);
SENSITIZE ("dpms_off_spinbutton", dpms_supported && p->dpms_enabled_p);
+ SENSITIZE ("dpms_quickoff_button", dpms_supported);
- /* Colormaps
- */
- SENSITIZE ("cmap_frame", found_any_writable_cells || fading_possible);
- SENSITIZE ("install_button", found_any_writable_cells);
- SENSITIZE ("fade_button", fading_possible);
- SENSITIZE ("unfade_button", fading_possible);
-
- SENSITIZE ("fade_label", (fading_possible &&
- (p->fade_p || p->unfade_p)));
- SENSITIZE ("fade_spinbutton", (fading_possible &&
- (p->fade_p || p->unfade_p)));
+ SENSITIZE ("fade_label", (p->fade_p || p->unfade_p));
+ SENSITIZE ("fade_spinbutton", (p->fade_p || p->unfade_p));
# undef SENSITIZE
}
}
+/* Allow the documentation label to re-flow when the text is changed.
+ http://blog.borovsak.si/2009/05/wrapping-adn-resizing-gtklabel.html
+ */
+static void
+cb_allocate (GtkWidget *label, GtkAllocation *allocation, gpointer data)
+{
+ gtk_widget_set_size_request (label, allocation->width - 8, -1);
+}
+
+
static void
populate_popup_window (state *s)
{
@@ -2962,6 +2984,9 @@ populate_popup_window (state *s)
gtk_label_set_selectable (doc);
*/
+ g_signal_connect (G_OBJECT (doc), "size-allocate",
+ G_CALLBACK (cb_allocate), NULL);
+
# ifdef HAVE_XML
if (s->cdata)
{
@@ -2998,6 +3023,14 @@ populate_popup_window (state *s)
gtk_label_set_text (doc, (doc_string
? _(doc_string)
: _("No description available.")));
+
+ {
+ GtkWidget *w = name_to_widget (s, "dialog_vbox");
+ gtk_widget_hide (w);
+ gtk_widget_unrealize (w);
+ gtk_widget_realize (w);
+ gtk_widget_show (w);
+ }
}
@@ -3022,7 +3055,7 @@ sensitize_menu_items (state *s, Bool force_p)
static Bool running_p = False;
static time_t last_checked = 0;
time_t now = time ((time_t *) 0);
- const char *names[] = { "activate_menu", "lock_menu", "kill_menu",
+ const char *names[] = { "activate_action", "lock_action", "kill_action",
/* "demo" */ };
int i;
@@ -3034,8 +3067,8 @@ sensitize_menu_items (state *s, Bool force_p)
for (i = 0; i < countof(names); i++)
{
- GtkWidget *w = name_to_widget (s, names[i]);
- gtk_widget_set_sensitive (GTK_WIDGET(w), running_p);
+ GtkAction *a = GTK_ACTION (gtk_builder_get_object (s->gtk_ui, names[i]));
+ gtk_action_set_sensitive (a, running_p);
}
}
@@ -3107,7 +3140,7 @@ fix_text_entry_sizes (state *s)
/* Now fix the width of the combo box.
*/
w = GTK_WIDGET (name_to_widget (s, "visual_combo"));
- w = GTK_COMBO (w)->entry;
+ w = GTK_COMBO_BOX_ENTRY (w)->entry;
width = gdk_string_width (w->style->font, "PseudoColor___");
gtk_widget_set_usize (w, width, -2);
@@ -3313,7 +3346,7 @@ populate_demo_window (state *s, int list_elt)
GtkFrame *frame1 = GTK_FRAME (name_to_widget (s, "preview_frame"));
GtkFrame *frame2 = GTK_FRAME (name_to_widget (s, "opt_frame"));
GtkEntry *cmd = GTK_ENTRY (name_to_widget (s, "cmd_text"));
- GtkCombo *vis = GTK_COMBO (name_to_widget (s, "visual_combo"));
+ GtkComboBoxEntry *vis = GTK_COMBO_BOX_ENTRY (name_to_widget (s, "visual_combo"));
GtkWidget *list = GTK_WIDGET (name_to_widget (s, "list"));
if (p->mode == BLANK_ONLY)
@@ -3363,7 +3396,7 @@ populate_demo_window (state *s, int list_elt)
gtk_window_set_title (GTK_WINDOW (s->popup_widget), title);
}
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (vis)->entry),
+ gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (vis))),
(hack
? (hack->visual && *hack->visual
? hack->visual
@@ -3471,10 +3504,11 @@ initialize_sort_map (state *s)
char *name = (hack->name && *hack->name
? strdup (hack->name)
: make_hack_name (dpy, hack->command));
- char *str;
- for (str = name; *str; str++)
- *str = tolower(*str);
- sort_hack_cmp_names_kludge[i] = name;
+ gchar *s2 = g_str_to_ascii (name, 0); /* Sort "Möbius" properly */
+ gchar *s3 = g_ascii_strdown (s2, -1);
+ free (name);
+ free (s2);
+ sort_hack_cmp_names_kludge[i] = s3;
}
/* Sort list->hack map alphabetically
@@ -3782,7 +3816,7 @@ get_best_gl_visual (state *s)
char *av[10];
int ac = 0;
- av[ac++] = "xscreensaver-gl-helper";
+ av[ac++] = "xscreensaver-gl-visual";
av[ac] = 0;
if (pipe (fds))
@@ -4395,7 +4429,9 @@ gnome_screensaver_window (Screen *screen)
&bytesafter, &name)
== Success
&& type != None
- && !strcmp ((char *) name, "gnome-screensaver"))
+ && (!strcmp ((char *) name, "gnome-screensaver") ||
+ !strcmp ((char *) name, "mate-screensaver") ||
+ !strcmp ((char *) name, "cinnamon-screensaver")))
{
gnome_window = kids[i];
break;
@@ -4464,11 +4500,9 @@ the_network_is_not_the_computer (state *s)
lhost = "<UNKNOWN>";
else
lhost = uts.nodename;
-# elif defined(VMS)
- strcpy (lhost, getenv("SYS$NODE"));
-# else /* !HAVE_UNAME && !VMS */
+# else /* !HAVE_UNAME */
strcat (lhost, "<UNKNOWN>");
-# endif /* !HAVE_UNAME && !VMS */
+# endif /* !HAVE_UNAME */
if (p && p->pw_name)
luser = p->pw_name;
@@ -4791,10 +4825,7 @@ main (int argc, char **argv)
progname = real_progname;
- s->short_version = (char *) malloc (5);
- memcpy (s->short_version, screensaver_id + 17, 4);
- s->short_version [4] = 0;
-
+ s->short_version = XSCREENSAVER_VERSION;
/* Register our error message logger for every ``log domain'' known.
There's no way to do this globally, so I grepped the Gtk/Gdk sources
@@ -5007,7 +5038,7 @@ main (int argc, char **argv)
dpy = XtDisplay (toplevel_shell);
db = XtDatabase (dpy);
- XtGetApplicationNameAndClass (dpy, &progname, &progclass);
+ XtGetApplicationNameAndClass (dpy, (char **) &progname, &progclass);
XSetErrorHandler (demo_ehandler);
/* Let's just ignore these. They seem to confuse Irix Gtk... */
@@ -5046,6 +5077,7 @@ main (int argc, char **argv)
p->db = db;
s->nscreens = screen_count (dpy);
+ init_xscreensaver_atoms (dpy);
hack_environment (s); /* must be before initialize_sort_map() */
load_init_file (dpy, p);
@@ -5069,26 +5101,7 @@ main (int argc, char **argv)
}
#endif
-
- /* Intern the atoms that xscreensaver_command() needs.
- */
- XA_VROOT = XInternAtom (dpy, "__SWM_VROOT", False);
- XA_SCREENSAVER = XInternAtom (dpy, "SCREENSAVER", False);
- XA_SCREENSAVER_VERSION = XInternAtom (dpy, "_SCREENSAVER_VERSION",False);
- XA_SCREENSAVER_STATUS = XInternAtom (dpy, "_SCREENSAVER_STATUS", False);
- XA_SCREENSAVER_ID = XInternAtom (dpy, "_SCREENSAVER_ID", False);
- XA_SCREENSAVER_RESPONSE = XInternAtom (dpy, "_SCREENSAVER_RESPONSE", False);
- XA_SELECT = XInternAtom (dpy, "SELECT", False);
- XA_DEMO = XInternAtom (dpy, "DEMO", False);
- XA_ACTIVATE = XInternAtom (dpy, "ACTIVATE", False);
- XA_SUSPEND = XInternAtom (dpy, "SUSPEND", False);
- XA_BLANK = XInternAtom (dpy, "BLANK", False);
- XA_LOCK = XInternAtom (dpy, "LOCK", False);
- XA_NEXT = XInternAtom (dpy, "NEXT", False);
- XA_PREV = XInternAtom (dpy, "PREV", False);
- XA_EXIT = XInternAtom (dpy, "EXIT", False);
- XA_RESTART = XInternAtom (dpy, "RESTART", False);
-
+ init_xscreensaver_atoms (dpy);
/* Create the window and all its widgets.
*/
@@ -5171,31 +5184,32 @@ main (int argc, char **argv)
#endif /* !HAVE_GTK2 */
/* Hook up callbacks to the items on the mode menu. */
- {
- GtkOptionMenu *opt = GTK_OPTION_MENU (name_to_widget (s, "mode_menu"));
- GtkMenu *menu = GTK_MENU (gtk_option_menu_get_menu (opt));
- GList *kids = gtk_container_children (GTK_CONTAINER (menu));
- int i;
- for (i = 0; kids; kids = kids->next, i++)
- {
- gtk_signal_connect (GTK_OBJECT (kids->data), "activate",
- GTK_SIGNAL_FUNC (mode_menu_item_cb),
- (gpointer) s);
-
- /* The "random-same" mode menu item does not appear unless
- there are multple screens.
- */
- if (s->nscreens <= 1 &&
- mode_menu_order[i] == RANDOM_HACKS_SAME)
- gtk_widget_hide (GTK_WIDGET (kids->data));
- }
+ gtk_signal_connect (GTK_OBJECT (name_to_widget (s, "mode_menu")),
+ "changed", GTK_SIGNAL_FUNC (mode_menu_item_cb),
+ (gpointer) s);
+ if (s->nscreens <= 1)
+ {
+ GtkComboBox *opt = GTK_COMBO_BOX (name_to_widget (s, "mode_menu"));
+ GtkTreeModel *list = gtk_combo_box_get_model (opt);
+ unsigned int i;
+ for (i = 0; i < countof(mode_menu_order); i++)
+ {
+ /* The "random-same" mode menu item does not appear unless
+ there are multiple screens.
+ */
+ if (mode_menu_order[i] == RANDOM_HACKS_SAME)
+ {
+ GtkTreeIter iter;
+ gtk_tree_model_iter_nth_child (list, &iter, NULL, i);
+ gtk_list_store_remove (GTK_LIST_STORE (list), &iter);
+ break;
+ }
+ }
- if (s->nscreens <= 1) /* recompute option-menu size */
- {
- gtk_widget_unrealize (GTK_WIDGET (menu));
- gtk_widget_realize (GTK_WIDGET (menu));
- }
- }
+ /* recompute option-menu size */
+ gtk_widget_unrealize (GTK_WIDGET (opt));
+ gtk_widget_realize (GTK_WIDGET (opt));
+ }
/* Handle the -prefs command-line argument. */
@@ -5299,7 +5313,7 @@ main (int argc, char **argv)
the_network_is_not_the_computer (s);
- if (senesculent_p())
+ if (time ((time_t *) 0) - XSCREENSAVER_RELEASED > 60*60*24*30*17)
warning_dialog (s->toplevel_widget,
_("Warning:\n\n"
"This version of xscreensaver is VERY OLD!\n"
@@ -5312,7 +5326,6 @@ main (int argc, char **argv)
),
D_NONE, 7);
-
/* Run the Gtk event loop, and not the Xt event loop. This means that
if there were Xt timers or fds registered, they would never get serviced,
and if there were any Xt widgets, they would never have events delivered.
diff --git a/driver/demo-Xm-widgets.c b/driver/demo-Xm-widgets.c
index cbe3393..d47259b 100644
--- a/driver/demo-Xm-widgets.c
+++ b/driver/demo-Xm-widgets.c
@@ -79,6 +79,8 @@ tab_cb (Widget button, XtPointer client_data, XtPointer ignored)
}
+extern Widget create_xscreensaver_demo (Widget parent);
+
Widget
create_xscreensaver_demo (Widget parent)
{
@@ -539,14 +541,12 @@ create_options_page (Widget parent)
timeoutLabel
cycleLabel
fadeSecondsLabel
- fadeTicksLabel
lockLabel
passwdLabel
timeoutText
cycleText
fadeSecondsText
- fadeTicksText
lockText
passwdText
@@ -566,11 +566,11 @@ create_options_page (Widget parent)
Arg av[64];
int ac = 0;
Widget children[100];
- Widget timeout_label, cycle_label, fade_seconds_label, fade_ticks_label;
+ Widget timeout_label, cycle_label, fade_seconds_label;
Widget lock_label, passwd_label, hr;
Widget preferences_form;
- Widget timeout_text, cycle_text, fade_text, fade_ticks_text;
+ Widget timeout_text, cycle_text, fade_text;
Widget lock_timeout_text, passwd_timeout_text, verbose_toggle;
Widget install_cmap_toggle, fade_toggle, unfade_toggle;
Widget lock_toggle, prefs_done, prefs_cancel;
@@ -601,10 +601,6 @@ create_options_page (Widget parent)
"fadeSecondsLabel", av, ac);
ac = 0;
XtSetArg(av[ac], XmNalignment, XmALIGNMENT_END); ac++;
- fade_ticks_label = XmCreateLabelGadget (preferences_form, "fadeTicksLabel",
- av, ac);
- ac = 0;
- XtSetArg(av[ac], XmNalignment, XmALIGNMENT_END); ac++;
lock_label = XmCreateLabelGadget (preferences_form, "lockLabel", av, ac);
ac = 0;
XtSetArg(av[ac], XmNalignment, XmALIGNMENT_END); ac++;
@@ -613,8 +609,6 @@ create_options_page (Widget parent)
timeout_text = XmCreateTextField (preferences_form, "timeoutText", av, ac);
cycle_text = XmCreateTextField (preferences_form, "cycleText", av, ac);
fade_text = XmCreateTextField (preferences_form, "fadeSecondsText", av, ac);
- fade_ticks_text = XmCreateTextField (preferences_form, "fadeTicksText",
- av, ac);
lock_timeout_text = XmCreateTextField (preferences_form, "lockText",
av, ac);
passwd_timeout_text = XmCreateTextField (preferences_form, "passwdText",
@@ -684,20 +678,6 @@ create_options_page (Widget parent)
XmNrightWidget, fade_text,
NULL);
- XtVaSetValues (fade_ticks_label,
- XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
- XmNtopOffset, 0,
- XmNtopWidget, fade_ticks_text,
- XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
- XmNbottomOffset, 0,
- XmNbottomWidget, fade_ticks_text,
- XmNleftAttachment, XmATTACH_FORM,
- XmNleftOffset, 20,
- XmNrightAttachment, XmATTACH_WIDGET,
- XmNrightOffset, 4,
- XmNrightWidget, fade_ticks_text,
- NULL);
-
XtVaSetValues (lock_label,
XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNtopOffset, 0,
@@ -751,7 +731,7 @@ create_options_page (Widget parent)
XmNleftWidget, cycle_text,
NULL);
- XtVaSetValues (fade_ticks_text,
+ XtVaSetValues (lock_timeout_text,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopOffset, 2,
XmNtopWidget, fade_text,
@@ -760,15 +740,6 @@ create_options_page (Widget parent)
XmNleftWidget, fade_text,
NULL);
- XtVaSetValues (lock_timeout_text,
- XmNtopAttachment, XmATTACH_WIDGET,
- XmNtopOffset, 2,
- XmNtopWidget, fade_ticks_text,
- XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
- XmNleftOffset, 0,
- XmNleftWidget, fade_ticks_text,
- NULL);
-
XtVaSetValues (passwd_timeout_text,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopOffset, 4,
@@ -822,10 +793,10 @@ create_options_page (Widget parent)
XtVaSetValues (unfade_toggle,
XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNtopOffset, 0,
- XmNtopWidget, fade_ticks_text,
+ XmNtopWidget, lock_timeout_text,
XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNbottomOffset, 0,
- XmNbottomWidget, fade_ticks_text,
+ XmNbottomWidget, lock_timeout_text,
XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNleftOffset, 0,
XmNleftWidget, fade_toggle,
@@ -836,10 +807,10 @@ create_options_page (Widget parent)
XtVaSetValues (lock_toggle,
XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNtopOffset, 0,
- XmNtopWidget, lock_timeout_text,
+ XmNtopWidget, passwd_timeout_text,
XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNbottomOffset, 0,
- XmNbottomWidget, lock_timeout_text,
+ XmNbottomWidget, passwd_timeout_text,
XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNleftOffset, 0,
XmNleftWidget, unfade_toggle,
@@ -872,13 +843,11 @@ create_options_page (Widget parent)
children[ac++] = timeout_label;
children[ac++] = cycle_label;
children[ac++] = fade_seconds_label;
- children[ac++] = fade_ticks_label;
children[ac++] = lock_label;
children[ac++] = passwd_label;
children[ac++] = timeout_text;
children[ac++] = cycle_text;
children[ac++] = fade_text;
- children[ac++] = fade_ticks_text;
children[ac++] = lock_timeout_text;
children[ac++] = passwd_timeout_text;
children[ac++] = verbose_toggle;
diff --git a/driver/demo-Xm.c b/driver/demo-Xm.c
index 3497641..547bbe9 100644
--- a/driver/demo-Xm.c
+++ b/driver/demo-Xm.c
@@ -1,5 +1,5 @@
/* demo-Xm.c --- implements the interactive demo-mode and options dialogs.
- * xscreensaver, Copyright (c) 1993-2003, 2005 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 1993-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -16,23 +16,20 @@
#ifdef HAVE_MOTIF /* whole file */
+#include "blurb.h"
+
#include <stdlib.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
-#ifndef VMS
-# include <pwd.h> /* for getpwuid() */
-#else /* VMS */
-# include "vms-pwd.h"
-#endif /* VMS */
-
#ifdef HAVE_UNAME
# include <sys/utsname.h> /* for uname() */
#endif /* HAVE_UNAME */
#include <stdio.h>
+#include <pwd.h> /* for getpwuid() */
#include <X11/Xproto.h> /* for CARD32 */
#include <X11/Xatom.h> /* for XA_INTEGER */
@@ -48,18 +45,6 @@
# include <X11/xpm.h>
#endif /* HAVE_XPM */
-#ifdef HAVE_XMU
-# ifndef VMS
-# include <X11/Xmu/Error.h>
-# else /* VMS */
-# include <Xmu/Error.h>
-# endif
-#else
-# include "xmu.h"
-#endif
-
-
-
#include <Xm/Xm.h>
#include <Xm/List.h>
#include <Xm/PushB.h>
@@ -78,11 +63,12 @@
#endif /* HAVE_XMCOMBOBOX */
#include "version.h"
-#include "prefs.h"
+#include "types.h"
#include "resources.h" /* for parse_time() */
-#include "visual.h" /* for has_writable_cells() */
#include "remote.h" /* for xscreensaver_command() */
-#include "usleep.h"
+#include "visual.h"
+#include "atoms.h"
+#include "xmu.h"
#include <stdio.h>
#include <string.h>
@@ -92,7 +78,6 @@
#define countof(x) (sizeof((x))/sizeof((*x)))
-char *progname = 0;
char *progclass = "XScreenSaver";
XrmDatabase db;
@@ -102,20 +87,12 @@ typedef struct {
static void *global_prefs_pair; /* I hate C so much... */
-char *blurb (void) { return progname; }
-
extern Widget create_xscreensaver_demo (Widget parent);
extern const char *visual_menu[];
static char *short_version = 0;
-Atom XA_VROOT;
-Atom XA_SCREENSAVER, XA_SCREENSAVER_RESPONSE, XA_SCREENSAVER_VERSION;
-Atom XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_SELECT, XA_DEMO;
-Atom XA_ACTIVATE, XA_SUSPEND, XA_BLANK, XA_LOCK, XA_RESTART, XA_EXIT;
-
-
static void populate_demo_window (Widget toplevel,
int which, prefs_pair *pair);
static void populate_prefs_page (Widget top, prefs_pair *pair);
@@ -297,7 +274,7 @@ run_hack (Widget widget, int which, Bool report_errors_p)
/* Button callbacks
*/
-void
+static void
exit_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
{
apply_changes_and_save (XtParent (button));
@@ -313,7 +290,7 @@ wm_close_cb (Widget widget, GdkEvent *event, XtPointer data)
}
#endif
-void
+static void
cut_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
{
/* #### */
@@ -323,7 +300,7 @@ cut_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
}
-void
+static void
copy_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
{
/* #### */
@@ -333,7 +310,7 @@ copy_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
}
-void
+static void
paste_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
{
/* #### */
@@ -343,7 +320,7 @@ paste_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
}
-void
+static void
about_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
{
char buf [2048];
@@ -356,8 +333,8 @@ about_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
sprintf (buf, "%s\n%s\n"
"\n"
- "This is the Motif version of \"xscreensaver-demo\". The Motif\n"
- "version is no longer maintained. Please use the GTK version\n"
+ "This is the Motif version of \"xscreensaver-settings\".\n"
+ "It is no longer maintained. Please use the GTK version\n"
"instead, which has many more features.\n"
"\n"
"For xscreensaver updates, check https://www.jwz.org/xscreensaver/",
@@ -368,7 +345,7 @@ about_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
}
-void
+static void
doc_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
{
prefs_pair *pair = (prefs_pair *) client_data;
@@ -385,39 +362,39 @@ doc_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
}
help_command = (char *) malloc (strlen (p->load_url_command) +
- (strlen (p->help_url) * 4) + 20);
+ (strlen (p->help_url) * 5) + 20);
strcpy (help_command, "( ");
sprintf (help_command + strlen(help_command),
p->load_url_command,
- p->help_url, p->help_url, p->help_url, p->help_url);
+ p->help_url, p->help_url, p->help_url, p->help_url, p->help_url);
strcat (help_command, " ) &");
system (help_command);
free (help_command);
}
-void
+static void
activate_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
{
run_cmd (XtParent (button), XA_ACTIVATE, 0);
}
-void
+static void
lock_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
{
run_cmd (XtParent (button), XA_LOCK, 0);
}
-void
+static void
kill_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
{
run_cmd (XtParent (button), XA_EXIT, 0);
}
-void
+static void
restart_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
{
#if 0
@@ -427,7 +404,7 @@ restart_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
apply_changes_and_save (button);
xscreensaver_command (XtDisplay (button), XA_EXIT, 0, False, NULL);
sleep (1);
- system ("xscreensaver -nosplash &");
+ system ("xscreensaver -splash &");
#endif
await_xscreensaver (button);
@@ -641,7 +618,7 @@ apply_changes_and_save (Widget widget)
return 0;
}
-void
+static void
run_this_cb (Widget button, XtPointer client_data, XtPointer ignored)
{
int which = selected_hack_number (XtParent (button));
@@ -651,7 +628,7 @@ run_this_cb (Widget button, XtPointer client_data, XtPointer ignored)
}
-void
+static void
manual_cb (Widget button, XtPointer client_data, XtPointer ignored)
{
prefs_pair *pair = (prefs_pair *) client_data;
@@ -695,7 +672,7 @@ manual_cb (Widget button, XtPointer client_data, XtPointer ignored)
}
-void
+static void
run_next_cb (Widget button, XtPointer client_data, XtPointer ignored)
{
prefs_pair *pair = (prefs_pair *) client_data;
@@ -725,7 +702,7 @@ run_next_cb (Widget button, XtPointer client_data, XtPointer ignored)
}
-void
+static void
run_prev_cb (Widget button, XtPointer client_data, XtPointer ignored)
{
prefs_pair *pair = (prefs_pair *) client_data;
@@ -781,7 +758,7 @@ hack_time_text (Widget button, const char *line, Time *store, Bool sec_p)
}
-void
+static void
prefs_ok_cb (Widget button, XtPointer client_data, XtPointer ignored)
{
prefs_pair *pair = (prefs_pair *) client_data;
@@ -825,7 +802,6 @@ prefs_ok_cb (Widget button, XtPointer client_data, XtPointer ignored)
MINUTES (&p2->timeout, "timeoutText");
MINUTES (&p2->cycle, "cycleText");
SECONDS (&p2->fade_seconds, "fadeSecondsText");
- INTEGER (&p2->fade_ticks, "fadeTicksText");
MINUTES (&p2->lock_timeout, "lockText");
SECONDS (&p2->passwd_timeout, "passwdText");
CHECKBOX (p2->verbose_p, "verboseToggle");
@@ -848,7 +824,6 @@ prefs_ok_cb (Widget button, XtPointer client_data, XtPointer ignored)
COPY(lock_timeout);
COPY(passwd_timeout);
COPY(fade_seconds);
- COPY(fade_ticks);
COPY(verbose_p);
COPY(install_cmap_p);
COPY(fade_p);
@@ -863,7 +838,7 @@ prefs_ok_cb (Widget button, XtPointer client_data, XtPointer ignored)
}
-void
+static void
prefs_cancel_cb (Widget button, XtPointer client_data, XtPointer ignored)
{
prefs_pair *pair = (prefs_pair *) client_data;
@@ -996,8 +971,6 @@ populate_prefs_page (Widget top, prefs_pair *pair)
XtVaSetValues (name_to_widget (top, "passwdText"), XmNvalue, s, NULL);
format_time (s, p->fade_seconds);
XtVaSetValues (name_to_widget (top, "fadeSecondsText"), XmNvalue, s, NULL);
- sprintf (s, "%u", p->fade_ticks);
- XtVaSetValues (name_to_widget (top, "fadeTicksText"), XmNvalue, s, NULL);
XtVaSetValues (name_to_widget (top, "verboseToggle"),
XmNset, p->verbose_p, NULL);
@@ -1009,42 +982,6 @@ populate_prefs_page (Widget top, prefs_pair *pair)
XmNset, p->unfade_p, NULL);
XtVaSetValues (name_to_widget (top, "lockToggle"),
XmNset, p->lock_p, NULL);
-
-
- {
- Bool found_any_writable_cells = False;
- Display *dpy = XtDisplay (top);
- int nscreens = ScreenCount(dpy);
- int i;
- for (i = 0; i < nscreens; i++)
- {
- Screen *s = ScreenOfDisplay (dpy, i);
- if (has_writable_cells (s, DefaultVisualOfScreen (s)))
- {
- found_any_writable_cells = True;
- break;
- }
- }
-
-#ifdef HAVE_XF86VMODE_GAMMA
- found_any_writable_cells = True; /* if we can gamma fade, go for it */
-#endif
-
- XtVaSetValues (name_to_widget (top, "fadeSecondsLabel"), XtNsensitive,
- found_any_writable_cells, NULL);
- XtVaSetValues (name_to_widget (top, "fadeTicksLabel"), XtNsensitive,
- found_any_writable_cells, NULL);
- XtVaSetValues (name_to_widget (top, "fadeSecondsText"), XtNsensitive,
- found_any_writable_cells, NULL);
- XtVaSetValues (name_to_widget (top, "fadeTicksText"), XtNsensitive,
- found_any_writable_cells, NULL);
- XtVaSetValues (name_to_widget (top, "cmapToggle"), XtNsensitive,
- found_any_writable_cells, NULL);
- XtVaSetValues (name_to_widget (top, "fadeToggle"), XtNsensitive,
- found_any_writable_cells, NULL);
- XtVaSetValues (name_to_widget (top, "unfadeToggle"), XtNsensitive,
- found_any_writable_cells, NULL);
- }
}
@@ -1054,7 +991,7 @@ sensitize_demo_widgets (Widget toplevel, Bool sensitive_p)
const char *names[] = { "cmdLabel", "cmdText", "enabled",
"visLabel", "combo", "demo", "man" };
int i;
- for (i = 0; i < sizeof(names)/countof(*names); i++)
+ for (i = 0; i < countof(names); i++)
{
Widget w = name_to_widget (toplevel, names[i]);
XtVaSetValues (w, XtNsensitive, sensitive_p, NULL);
@@ -1063,7 +1000,7 @@ sensitize_demo_widgets (Widget toplevel, Bool sensitive_p)
/* I don't know how to handle these yet... */
{
const char *names2[] = { "cut", "copy", "paste" };
- for (i = 0; i < sizeof(names2)/countof(*names2); i++)
+ for (i = 0; i < countof(names2); i++)
{
Widget w = name_to_widget (toplevel, names2[i]);
XtVaSetValues (w, XtNsensitive, FALSE, NULL);
@@ -1208,7 +1145,7 @@ pixmapify_buttons (Widget toplevel)
-char *
+static char *
get_hack_blurb (Display *dpy, screenhack *hack)
{
char *doc_string;
@@ -1301,8 +1238,8 @@ get_hack_blurb (Display *dpy, screenhack *hack)
# endif /* 0 */
doc_string = strdup (
"\n"
- "This is the Motif version of \"xscreensaver-demo\". The Motif "
- "version is no longer maintained. Please use the GTK version "
+ "This is the Motif version of \"xscreensaver-settings\"."
+ "It is no longer maintained. Please use the GTK version "
"instead, which has many more features."
"\n\n"
"If you were running the GTK version, there would be a preview "
@@ -1475,10 +1412,10 @@ sanity_check_resources (Widget toplevel)
{
const char *names[] = { "demoTab", "optionsTab", "cmdLabel", "visLabel",
"enabled", "demo", "man", "timeoutLabel",
- "cycleLabel", "fadeSecondsLabel", "fadeTicksLabel",
+ "cycleLabel", "fadeSecondsLabel",
"lockLabel", "passwdLabel" };
int i;
- for (i = 0; i < sizeof(names)/countof(*names); i++)
+ for (i = 0; i < countof(names); i++)
{
Widget w = name_to_widget (toplevel, names[i]);
const char *name = XtName(w);
@@ -1566,11 +1503,9 @@ the_network_is_not_the_computer (Widget parent)
lhost = "<UNKNOWN>";
else
lhost = uts.nodename;
-# elif defined(VMS)
- strcpy (lhost, getenv("SYS$NODE"));
-# else /* !HAVE_UNAME && !VMS */
+# else /* !HAVE_UNAME */
strcat (lhost, "<UNKNOWN>");
-# endif /* !HAVE_UNAME && !VMS */
+# endif /* !HAVE_UNAME */
if (p && p->pw_name)
luser = p->pw_name;
@@ -1738,7 +1673,7 @@ main (int argc, char **argv)
dpy = XtDisplay (toplevel_shell);
db = XtDatabase (dpy);
- XtGetApplicationNameAndClass (dpy, &progname, &progclass);
+ XtGetApplicationNameAndClass (dpy, (char **) &progname, &progclass);
XSetErrorHandler (demo_ehandler);
/* Complain about unrecognized command-line arguments.
@@ -1758,9 +1693,9 @@ main (int argc, char **argv)
}
}
- short_version = (char *) malloc (5);
- memcpy (short_version, screensaver_id + 17, 4);
- short_version [4] = 0;
+ short_version = strdup (screensaver_id + 17);
+ s = strchr (short_version, ' ');
+ *s = 0;
/* Load the init file, which may end up consulting the X resource database
and the site-wide app-defaults file. Note that at this point, it's
@@ -1789,22 +1724,7 @@ main (int argc, char **argv)
#endif
- /* Intern the atoms that xscreensaver_command() needs.
- */
- XA_VROOT = XInternAtom (dpy, "__SWM_VROOT", False);
- XA_SCREENSAVER = XInternAtom (dpy, "SCREENSAVER", False);
- XA_SCREENSAVER_VERSION = XInternAtom (dpy, "_SCREENSAVER_VERSION",False);
- XA_SCREENSAVER_STATUS = XInternAtom (dpy, "_SCREENSAVER_STATUS", False);
- XA_SCREENSAVER_ID = XInternAtom (dpy, "_SCREENSAVER_ID", False);
- XA_SCREENSAVER_RESPONSE = XInternAtom (dpy, "_SCREENSAVER_RESPONSE", False);
- XA_SELECT = XInternAtom (dpy, "SELECT", False);
- XA_DEMO = XInternAtom (dpy, "DEMO", False);
- XA_ACTIVATE = XInternAtom (dpy, "ACTIVATE", False);
- XA_SUSPEND = XInternAtom (dpy, "SUSPEND", False);
- XA_BLANK = XInternAtom (dpy, "BLANK", False);
- XA_LOCK = XInternAtom (dpy, "LOCK", False);
- XA_EXIT = XInternAtom (dpy, "EXIT", False);
- XA_RESTART = XInternAtom (dpy, "RESTART", False);
+ init_xscreensaver_atoms (dpy);
/* Create the window and all its widgets.
*/
diff --git a/driver/dialog.c b/driver/dialog.c
new file mode 100644
index 0000000..fce74c4
--- /dev/null
+++ b/driver/dialog.c
@@ -0,0 +1,2507 @@
+/* dialog.c --- the password dialog and splash screen.
+ * xscreensaver, Copyright © 1993-2021 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+
+/* This file renders the unlock dialog and splash screen, using Xlib and Xft.
+ * One significant complication is that it must read raw XInput2 events to
+ * get keyboard and mouse input, as the "xscreensaver" process has the mouse
+ * and keyboard grabbed while this is running.
+ *
+ * It might be possible to implement this file using Gtk instead of Xlib,
+ * but the grab situation might make that tricky: those events would have to
+ * be re-sent to the toolkit widgets in a way that it would understand them.
+ * Also, toolkits tend to assume that a window manager exists, and this
+ * window must be an OverrideRedirect window with no focus management.
+ *
+ * Crashes here are interpreted as "unauthorized" and do not unlock the
+ * screen.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <time.h>
+#include <sys/time.h>
+#include <pwd.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#ifdef HAVE_UNAME
+# include <sys/utsname.h>
+#endif /* HAVE_UNAME */
+#include <ctype.h>
+#include <pwd.h>
+
+#include <X11/Xproto.h> /* for CARD32 */
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/extensions/XInput2.h>
+#include <X11/Intrinsic.h>
+
+#ifdef ENABLE_NLS
+# include <locale.h>
+# include <libintl.h>
+# define _(S) gettext(S)
+#else
+# define _(S) (S)
+#endif
+
+#ifdef HAVE_XKB
+# include <X11/XKBlib.h>
+# include <X11/extensions/XKB.h>
+#endif
+
+#include "version.h"
+#include "blurb.h"
+#include "auth.h"
+#include "atoms.h"
+#include "screens.h"
+#include "xft.h"
+#include "xftwrap.h"
+#include "xinput.h"
+#include "resources.h"
+#include "visual.h"
+#include "font-retry.h"
+#include "prefs.h"
+#include "usleep.h"
+
+extern Bool debug_p;
+
+#undef DEBUG_METRICS
+#undef DEBUG_STACKING
+
+#define LOCK_FAILURE_ATOM "_XSCREENSAVER_AUTH_FAILURES"
+
+#undef MAX
+#undef MIN
+#define MAX(a,b) ((a)>(b)?(a):(b))
+#define MIN(a,b) ((a)<(b)?(a):(b))
+
+#define MAX_BYTES_PER_CHAR 8 /* UTF-8 uses up to 6 bytes */
+#define MAX_PASSWD_CHARS 280 /* Longest possible passphrase */
+
+typedef struct window_state window_state;
+
+
+typedef enum {
+ AUTH_READ, /* reading input or ready to do so */
+ AUTH_SUCCESS, /* auth success, unlock */
+ AUTH_FAIL, /* auth fail */
+ AUTH_CANCEL, /* user canceled, or typed blank password */
+ AUTH_TIME, /* timed out */
+ AUTH_FINISHED, /* user pressed enter */
+ AUTH_NOTIFY /* displaying message after finished */
+} auth_state;
+
+
+/* A mini-toolkit for rendering text labels, input fields, and buttons.
+ */
+typedef enum { CENTER, LEFT, RIGHT } line_align;
+
+typedef struct {
+ Bool down_p;
+ XRectangle rect;
+ char *cmd;
+ void (*fn) (window_state *ws);
+ Bool disabled_p;
+} line_button_state;
+
+
+typedef struct {
+ char *text;
+ XftFont *font;
+ XftColor fg;
+ Pixel bg;
+ enum { LABEL, BUTTON, TEXT, TEXT_RO } type;
+ line_align align;
+ Bool float_p;
+ Bool i_beam;
+ line_button_state *button;
+} dialog_line;
+
+
+/* Global state.
+ */
+struct window_state {
+ XtAppContext app;
+ Display *dpy;
+ Screen *screen;
+ Position cx, cy, x, y;
+ Dimension min_height;
+ Window window;
+ Colormap cmap;
+
+ Bool splash_p;
+ auth_state auth_state;
+ int xi_opcode;
+ int xkb_opcode;
+
+ /* Variant strings
+ */
+ char *version;
+ char *user;
+ int nmsgs;
+ const auth_message *msgs;
+
+ /* "Characters" in the password may be a variable number of bytes long.
+ plaintext_passwd contains the raw bytes.
+ plaintext_passwd_char_size indicates the size in bytes of each character,
+ so that we can make backspace work.
+ censored_passwd is the asterisk version.
+
+ Maybe it would be more sensible to use uint32_t and utils/utf8wc.c here,
+ but the multi-byte string returned by XLookupString might not be UTF-8
+ (see comment in handle_keypress).
+ */
+ char plaintext_passwd [MAX_PASSWD_CHARS * MAX_BYTES_PER_CHAR];
+ char censored_passwd [MAX_PASSWD_CHARS * MAX_BYTES_PER_CHAR];
+ char plaintext_passwd_char_size [MAX_PASSWD_CHARS];
+
+ XComposeStatus compose_status;
+
+ XtIntervalId timer;
+
+ XtIntervalId cursor_timer; /* Blink the I-beam */
+ int i_beam;
+
+ double start_time, end_time;
+
+ Bool show_stars_p; /* "I regret that I have but one asterisk for my country."
+ -- Nathan Hale, 1776. */
+ Bool caps_p; /* Whether we saw a keypress with caps-lock on */
+
+ char *dialog_theme;
+ char *heading_label;
+ char *body_label;
+ char *hostname_label;
+ char *date_format;
+ char *kbd_layout_label;
+ char *newlogin_cmd;
+
+ /* Resources for fonts and colors */
+ XftDraw *xftdraw;
+ XftFont *heading_font;
+ XftFont *body_font;
+ XftFont *error_font;
+ XftFont *label_font;
+ XftFont *date_font;
+ XftFont *button_font;
+ XftFont *hostname_font;
+
+ Pixel foreground;
+ Pixel background;
+ XftColor xft_foreground;
+ XftColor xft_text_foreground;
+ XftColor xft_button_foreground;
+ XftColor xft_error_foreground;
+ Pixel passwd_background;
+ Pixel thermo_foreground;
+ Pixel thermo_background;
+ Pixel shadow_top;
+ Pixel shadow_bottom;
+ Pixel border_color;
+ Pixel button_background;
+ Pixel logo_background;
+
+ Dimension preferred_logo_width;
+ Dimension preferred_logo_height;
+ Dimension thermo_width;
+ Dimension internal_padding;
+ Dimension shadow_width;
+ Dimension border_width;
+
+ Pixmap logo_pixmap;
+ Pixmap logo_clipmask;
+ unsigned int logo_width, logo_height;
+ int logo_npixels;
+ unsigned long *logo_pixels;
+
+ line_button_state newlogin_button_state;
+ line_button_state unlock_button_state;
+ line_button_state demo_button_state;
+ line_button_state help_button_state;
+};
+
+
+static void
+draw_shaded_rectangle (Display *dpy, Window window,
+ int x, int y,
+ int width, int height,
+ int thickness,
+ unsigned long top_color,
+ unsigned long bottom_color)
+{
+ XPoint points[4];
+ XGCValues gcv;
+ GC gc1, gc2;
+ if (thickness == 0) return;
+
+ gcv.foreground = top_color;
+ gc1 = XCreateGC (dpy, window, GCForeground, &gcv);
+ gcv.foreground = bottom_color;
+ gc2 = XCreateGC (dpy, window, GCForeground, &gcv);
+
+ points [0].x = x;
+ points [0].y = y;
+ points [1].x = x + width;
+ points [1].y = y;
+ points [2].x = x + width - thickness;
+ points [2].y = y + thickness;
+ points [3].x = x;
+ points [3].y = y + thickness;
+ XFillPolygon (dpy, window, gc1, points, 4, Convex, CoordModeOrigin);
+
+ points [0].x = x;
+ points [0].y = y + thickness;
+ points [1].x = x;
+ points [1].y = y + height;
+ points [2].x = x + thickness;
+ points [2].y = y + height - thickness;
+ points [3].x = x + thickness;
+ points [3].y = y + thickness;
+ XFillPolygon (dpy, window, gc1, points, 4, Convex, CoordModeOrigin);
+
+ points [0].x = x + width;
+ points [0].y = y;
+ points [1].x = x + width - thickness;
+ points [1].y = y + thickness;
+ points [2].x = x + width - thickness;
+ points [2].y = y + height - thickness;
+ points [3].x = x + width;
+ points [3].y = y + height - thickness;
+ XFillPolygon (dpy, window, gc2, points, 4, Convex, CoordModeOrigin);
+
+ points [0].x = x;
+ points [0].y = y + height;
+ points [1].x = x + width;
+ points [1].y = y + height;
+ points [2].x = x + width;
+ points [2].y = y + height - thickness;
+ points [3].x = x + thickness;
+ points [3].y = y + height - thickness;
+ XFillPolygon (dpy, window, gc2, points, 4, Convex, CoordModeOrigin);
+
+ XFreeGC (dpy, gc1);
+ XFreeGC (dpy, gc2);
+}
+
+#define IBEAM_WIDTH 2
+
+static void
+draw_i_beam (Display *dpy, Drawable d, Pixel color, int x, int y, int height)
+{
+ XGCValues gcv;
+ GC gc;
+ gcv.foreground = color;
+ gcv.line_width = IBEAM_WIDTH;
+ gc = XCreateGC (dpy, d, GCForeground | GCLineWidth, &gcv);
+ XDrawLine (dpy, d, gc, x, y, x, y + height); /* Ceci n'est pas une pipe */
+ XFreeGC (dpy, gc);
+}
+
+
+static int
+draw_dialog_line (window_state *ws, Drawable d, dialog_line *line,
+ int left, int right, int y, Bool clear_p)
+{
+ int w = right - left;
+ int h;
+ int xpad = 0, ypad = 0;
+ XGlyphInfo overall;
+ line_align align = line->align;
+ int oleft = left;
+ int tleft = left;
+ int oright = right;
+ int clip_w = 0;
+ int gutter = 0;
+ XRectangle rect;
+ int xoff2 = 0;
+ int yoff2 = 0;
+ char *text2 = 0;
+ char *text = line->text;
+ int nlines = 1;
+
+ /* Adjust left/right margins based on the type of the line.
+ */
+ switch (line->type) {
+ case LABEL:
+ if (line->float_p && line->align == LEFT)
+ {
+ /* Add 1px to leave a little padding between the top border of the
+ label and the ascenders. */
+ ypad = ws->shadow_width + 1;
+ right = left + w/2 - ws->shadow_width * 2 - line->font->ascent / 2;
+ align = RIGHT;
+ }
+
+ if (*line->text)
+ text = text2 = xft_word_wrap (ws->dpy, line->font, line->text,
+ right - left);
+ break;
+
+ case BUTTON: /* box is fixed width at 1/3, text centered */
+ align = CENTER;
+ xpad = 0;
+ /* make the buttons a little taller than everything else */
+ /* Add 1px as above */
+ ypad = ws->shadow_width + line->font->ascent / 2 + 1;
+ gutter = ws->shadow_width;
+ clear_p = True;
+
+ switch (line->align) {
+ case LEFT:
+ right = left + w/3 - xpad;
+ break;
+ case CENTER:
+ xpad = ws->shadow_width * 2;
+ left += w/3 + xpad;
+ right -= w/3 + xpad;
+ break;
+ case RIGHT:
+ left = right - w/3 + xpad;
+ break;
+ }
+ oright = right;
+ xpad = 0;
+ break;
+
+ case TEXT: /* box is fixed width at 1/2, text left */
+ case TEXT_RO:
+ align = LEFT;
+ oleft = left + xoff2;
+ clear_p = True;
+ xpad = ws->shadow_width + line->font->ascent / 4;
+ /* Add 1px as above */
+ ypad = ws->shadow_width + 1;
+ gutter = ws->shadow_width;
+ if (gutter < 2) gutter = 2;
+
+ switch (line->align) {
+ case LEFT:
+ right = left + w/2;
+ break;
+ case RIGHT:
+ left = right - w/2;
+ break;
+ case CENTER:
+ abort();
+ break;
+ }
+
+ /* If the text is longer than the field, scroll horizontally to show
+ the end of the text instead of the beginning.
+ */
+ XftTextExtentsUtf8_multi (ws->dpy, line->font, (FcChar8 *) text,
+ strlen(text), &overall);
+ if (overall.width >= w/2 - ws->shadow_width * 2 - IBEAM_WIDTH)
+ {
+ align = RIGHT;
+ left = right - w/2;
+ }
+ break;
+
+ default: abort(); break;
+ }
+
+ /* Clear out the area we're about to overwrite.
+ */
+ h = nlines * (line->font->ascent + line->font->descent) + ypad*2;
+ if (clear_p)
+ {
+ GC gc;
+ XGCValues gcv;
+ gcv.foreground = line->bg;
+ gc = XCreateGC (ws->dpy, d, GCForeground, &gcv);
+ XFillRectangle (ws->dpy, d, gc, left, y, oright-left, h);
+ XFreeGC (ws->dpy, gc);
+ }
+
+ /* Draw borders if necessary.
+ */
+ switch (line->type) {
+ case LABEL: break;
+ case BUTTON: case TEXT: case TEXT_RO:
+ {
+ Bool in_p = (line->type != BUTTON);
+ if (line->button)
+ {
+ line->button->rect.x = left;
+ line->button->rect.y = y;
+ line->button->rect.width = right-left;
+ line->button->rect.height = h;
+ in_p = line->button->down_p || line->button->disabled_p;
+ }
+ tleft = left;
+ draw_shaded_rectangle (ws->dpy, d,
+ left, y, right-left, h,
+ ws->shadow_width,
+ (in_p ? ws->shadow_bottom : ws->shadow_top),
+ (in_p ? ws->shadow_top : ws->shadow_bottom));
+ clip_w = ws->shadow_width;
+ }
+ break;
+ default: abort(); break;
+ }
+
+ /* Draw the text inside our box.
+ */
+ nlines = XftTextExtentsUtf8_multi (ws->dpy, line->font, (FcChar8 *) text,
+ strlen(text), &overall);
+ w = overall.width - overall.x;
+ switch (align) {
+ case LEFT: left = left + xpad; break;
+ case RIGHT: left = right - w - xpad; break;
+ case CENTER:
+ oleft = left;
+ left = left + xpad + (right - left - w) / 2;
+ if (left < oleft) left = oleft;
+ break;
+ default: abort(); break;
+ }
+
+ rect.x = MAX (oleft, MAX (left, tleft + clip_w));
+ rect.width = MIN (oright, right) - rect.x - clip_w;
+ rect.y = y + ypad - overall.y + line->font->ascent;
+ rect.height = overall.height;
+
+ XftDrawSetClipRectangles (ws->xftdraw, 0, 0, &rect, 1);
+
+ if (line->type == BUTTON &&
+ line->button &&
+ (line->button->down_p || line->button->disabled_p))
+ xoff2 = yoff2 = MIN (ws->shadow_width, line->font->ascent/2);
+
+ XftDrawStringUtf8_multi (ws->xftdraw, &line->fg, line->font,
+ left + xoff2,
+ y + ypad + yoff2 + line->font->ascent,
+ (FcChar8 *) text, strlen (text),
+ (align == LEFT ? 1 : align == CENTER ? 0 : -1));
+# ifdef DEBUG_METRICS
+ {
+ GC gc;
+ XGCValues gcv;
+ int yy = y + ypad + yoff2 + line->font->ascent;
+ gcv.foreground = line->fg.pixel;
+ gc = XCreateGC (ws->dpy, d, GCForeground, &gcv);
+ /* draw a line on the baseline of the text */
+ XDrawLine (ws->dpy, d, gc, 0, yy, right, yy);
+ yy -= line->font->ascent;
+ /* a line above the ascenders */
+ XDrawLine (ws->dpy, d, gc, left, yy, right, yy);
+ yy += line->font->ascent + line->font->descent;
+ /* and below the descenders */
+ XDrawLine (ws->dpy, d, gc, left, yy, right, yy);
+ XFreeGC (ws->dpy, gc);
+ }
+# endif
+
+ if (line->i_beam)
+ draw_i_beam (ws->dpy, d,
+ ws->foreground,
+ left + xoff2 + overall.width,
+ y + ypad + yoff2,
+ line->font->ascent + line->font->descent);
+
+ XftDrawSetClip (ws->xftdraw, 0);
+
+ if (text2) free (text2);
+
+ y += ypad*2 + (nlines * (line->font->ascent + line->font->descent)) + gutter;
+ return y;
+}
+
+
+static int
+draw_dialog_lines (window_state *sp, Drawable d, dialog_line *lines,
+ int left, int right, int top)
+{
+ int i;
+ int maxy = 0;
+ for (i = 0; lines[i].text; i++)
+ {
+ Bool clear_p = (i > 0 && lines[i-1].float_p ? False : True);
+ int y = draw_dialog_line (sp, d, &lines[i], left, right, top, clear_p);
+ if (y > maxy) maxy = y;
+ if (! lines[i].float_p)
+ top = maxy;
+ }
+ return top;
+}
+
+
+static pid_t
+fork_and_exec (Display *dpy, int argc, char **argv)
+{
+ char buf [255];
+ pid_t forked = fork();
+ switch ((int) forked) {
+ case -1:
+ sprintf (buf, "%s: couldn't fork", blurb());
+ perror (buf);
+ break;
+
+ case 0:
+ close (ConnectionNumber (dpy)); /* close display fd */
+ execvp (argv[0], argv); /* shouldn't return. */
+
+ sprintf (buf, "%s: pid %lu: couldn't exec %s", blurb(),
+ (unsigned long) getpid(), argv[0]);
+ perror (buf);
+ exit (1); /* exits child fork */
+ break;
+
+ default: /* parent fork */
+ if (verbose_p)
+ {
+ int i;
+ fprintf (stderr, "%s: pid %lu: launched",
+ blurb(), (unsigned long) forked);
+ for (i = 0; i < argc; i++)
+ fprintf (stderr, " %s", argv[i]);
+ fprintf (stderr, "\n");
+ }
+ break;
+ }
+
+ return forked;
+}
+
+
+/* Loading resources
+ */
+static void
+resource_keys (window_state *ws, const char **name, const char **rclass)
+{
+ const char *theme = ws->dialog_theme;
+ const char *name2 = (ws->splash_p ? "splash" : "passwd");
+ const char *class2 = "Dialog";
+ static char res[200], rclass2[200];
+ char *s;
+
+ /* First try $THEME."Dialog.value" */
+ sprintf (res, "%s.%s.%s", theme, name2, *name);
+ sprintf (rclass2, "%s.%s.%s", theme, class2, *rclass);
+ s = get_string_resource (ws->dpy, res, rclass2);
+ if (s && *s) goto DONE;
+
+ /* Next try "default.Dialog.value" */
+ if (s) free (s);
+ theme = "default";
+ sprintf (res, "%s.%s.%s", theme, name2, *name);
+ sprintf (rclass2, "%s.%s.%s", theme, class2, *rclass);
+ s = get_string_resource (ws->dpy, res, rclass2);
+ if (s && *s) goto DONE;
+
+ /* Next try "Dialog.value" */
+ if (s) free (s);
+ sprintf (res, "%s.%s", theme, *name);
+ sprintf (rclass2, "%s.%s", theme, *rclass);
+ s = get_string_resource (ws->dpy, res, rclass2);
+ if (s && *s) goto DONE;
+
+ DONE:
+ *name = res;
+ *rclass = rclass2;
+ if (s) free (s);
+}
+
+
+static char *
+get_str (window_state *ws, const char *name, const char *rclass)
+{
+ resource_keys (ws, &name, &rclass);
+ return get_string_resource (ws->dpy, (char *) name, (char *) rclass);
+}
+
+
+static XftFont *
+get_font (window_state *ws, const char *name)
+{
+ const char *rclass = "Font";
+ XftFont *f;
+ char *s;
+ resource_keys (ws, &name, &rclass);
+ s = get_string_resource (ws->dpy, (char *) name, (char *) rclass);
+ if (!s || !*s)
+ s = "sans-serif 14";
+ f = load_xft_font_retry (ws->dpy, DefaultScreen(ws->dpy), s);
+ if (!f) abort();
+ return f;
+}
+
+static unsigned long
+get_color (window_state *ws, const char *name, const char *rclass)
+{
+ resource_keys (ws, &name, &rclass);
+ return get_pixel_resource (ws->dpy, DefaultColormapOfScreen (ws->screen),
+ (char *) name, (char *) rclass);
+}
+
+static void
+get_xft_color (window_state *ws, XftColor *ret,
+ const char *name, const char *rclass)
+{
+ char *s;
+ resource_keys (ws, &name, &rclass);
+ s = get_string_resource (ws->dpy, (char *) name, (char *) rclass);
+ if (!s || !*s) s = "black";
+ XftColorAllocName (ws->dpy,
+ DefaultVisualOfScreen(ws->screen),
+ DefaultColormapOfScreen (ws->screen),
+ s, ret);
+}
+
+static int
+get_int (window_state *ws, const char *name, const char *rclass)
+{
+ resource_keys (ws, &name, &rclass);
+ return get_integer_resource (ws->dpy, (char *) name, (char *) rclass);
+}
+
+
+/* Decide where on the X11 screen to place the dialog.
+ This is complicated because, in the face of RANDR and Xinerama, we want
+ to center it on a *monitor*, not on what X calls a 'Screen'. So get the
+ monitor state, then figure out which one of those the mouse is in.
+ */
+static void
+splash_pick_window_position (Display *dpy, Position *xP, Position *yP)
+{
+ Window pointer_root, pointer_child;
+ int root_x = 0, root_y = 0, win_x, win_y;
+ unsigned int mask;
+ monitor **monitors;
+ monitor *m = 0;
+ int i;
+
+ XQueryPointer (dpy, RootWindow (dpy, 0),
+ &pointer_root, &pointer_child,
+ &root_x, &root_y, &win_x, &win_y, &mask);
+
+ monitors = scan_monitors (dpy);
+ if (!monitors || !*monitors) abort();
+
+ for (i = 0; monitors[i]; i++)
+ {
+ monitor *m0 = monitors[i];
+ if (m0->sanity == S_SANE &&
+ root_x >= m0->x &&
+ root_y >= m0->y &&
+ root_x < m0->x + m0->width &&
+ root_y < m0->y + m0->height)
+ {
+ m = m0;
+ break;
+ }
+ }
+
+ if (!m)
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: mouse is not on any monitor?\n", blurb());
+ m = monitors[0];
+ }
+ else if (verbose_p)
+ fprintf (stderr,
+ "%s: mouse is at %d,%d on monitor %d %dx%d+%d+%d \"%s\"\n",
+ blurb(), root_x, root_y, m->id,
+ m->width, m->height, m->x, m->y,
+ (m->desc ? m->desc : ""));
+
+ *xP = m->x + m->width/2;
+ *yP = m->y + m->height/2;
+
+ free_monitors (monitors);
+}
+
+
+static void unlock_cb (window_state *ws);
+
+
+/* This program only needs one option from the init file, so it
+ just reads the .ad file and the .xscreensaver file directly rather
+ than going through Xt and Xrm.
+ */
+static void init_line_handler (int lineno,
+ const char *key, const char *val,
+ void *closure)
+{
+ window_state *ws = (window_state *) closure;
+ if (val && *val && !strcmp (key, "dialogTheme"))
+ {
+ if (ws->dialog_theme) free (ws->dialog_theme);
+ ws->dialog_theme = strdup (val);
+ }
+}
+
+static void
+read_init_file_simple (window_state *ws)
+{
+ const char *home = getenv("HOME");
+ const char *fn1 = AD_DIR "/XScreenSaver";
+ char *fn2;
+ if (!home || !*home) return;
+ fn2 = (char *) malloc (strlen(home) + 40);
+ sprintf (fn2, "%s/.xscreensaver", home);
+
+ if (debug_p)
+ fprintf (stderr, "%s: reading %s\n", blurb(), fn1);
+ parse_init_file (fn1, init_line_handler, ws);
+
+ if (debug_p)
+ fprintf (stderr, "%s: reading %s\n", blurb(), fn2);
+ parse_init_file (fn2, init_line_handler, ws);
+
+ if (verbose_p)
+ fprintf (stderr, "%s: theme: %s\n", blurb(),
+ (ws->dialog_theme ? ws->dialog_theme : "none"));
+}
+
+
+static void
+grab_keyboard_and_mouse (window_state *ws)
+{
+ /* If we have been launched by xscreensaver, these grabs won't succeed,
+ and that is expected. But if we are being run manually for debugging,
+ they are necessary to avoid having events seen by two apps at once.
+ (We don't bother to ungrab, that happens when we exit.)
+ */
+ Display *dpy = ws->dpy;
+ Window root = RootWindowOfScreen (ws->screen);
+ XGrabKeyboard (dpy, root, True, GrabModeAsync, GrabModeAsync, CurrentTime);
+ XGrabPointer (dpy, root, True,
+ (ButtonPressMask | ButtonReleaseMask |
+ EnterWindowMask | LeaveWindowMask |
+ PointerMotionMask | PointerMotionHintMask |
+ Button1MotionMask | Button2MotionMask |
+ Button3MotionMask | Button4MotionMask |
+ Button5MotionMask | ButtonMotionMask),
+ GrabModeAsync, GrabModeAsync, root,
+ None, CurrentTime);
+}
+
+
+static void
+get_keyboard_layout (window_state *ws)
+{
+# ifdef HAVE_XKB
+ XkbStateRec state;
+ XkbDescPtr desc = 0;
+ Atom name = 0;
+ char *namestr = 0;
+
+ if (! ws->xkb_opcode)
+ {
+ if (! XkbQueryExtension (ws->dpy, 0, &ws->xkb_opcode, 0, 0, 0))
+ {
+ ws->xkb_opcode = -1; /* Only try once */
+ if (verbose_p)
+ fprintf (stderr, "%s: XkbQueryExtension failed\n", blurb());
+ return;
+ }
+
+ if (! XkbSelectEvents (ws->dpy, XkbUseCoreKbd,
+ XkbMapNotifyMask | XkbStateNotifyMask,
+ XkbMapNotifyMask | XkbStateNotifyMask))
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: XkbSelectEvents failed\n", blurb());
+ }
+ }
+
+ if (XkbGetState (ws->dpy, XkbUseCoreKbd, &state))
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: XkbGetState failed\n", blurb());
+ return;
+ }
+ desc = XkbGetKeyboard (ws->dpy, XkbAllComponentsMask, XkbUseCoreKbd);
+ if (!desc || !desc->names)
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: XkbGetKeyboard failed\n", blurb());
+ goto DONE;
+ }
+ name = desc->names->groups[state.group];
+ namestr = (name ? XGetAtomName (ws->dpy, name) : 0);
+ if (!namestr)
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: XkbGetKeyboard returned null layout\n", blurb());
+ goto DONE;
+ }
+
+ if (ws->kbd_layout_label)
+ free (ws->kbd_layout_label);
+ ws->kbd_layout_label = namestr;
+
+ if (verbose_p)
+ fprintf (stderr, "%s: kbd layout: %s\n", blurb(),
+ namestr ? namestr : "null");
+
+ DONE:
+ if (desc) XFree (desc);
+# endif /* HAVE_XKB */
+}
+
+
+static double
+double_time (void)
+{
+ struct timeval now;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&now, &tzp);
+# else
+ gettimeofday(&now);
+# endif
+
+ return (now.tv_sec + ((double) now.tv_usec * 0.000001));
+}
+
+
+static void
+create_window (window_state *ws, int w, int h)
+{
+ XSetWindowAttributes attrs;
+ unsigned long attrmask;
+ Window ow = ws->window;
+
+ attrmask = CWOverrideRedirect | CWEventMask;
+ attrs.override_redirect = True;
+ attrs.event_mask = ExposureMask | VisibilityChangeMask;
+ ws->window = XCreateWindow (ws->dpy,
+ RootWindowOfScreen(ws->screen),
+ ws->x, ws->y, w, h, 0,
+ DefaultDepthOfScreen (ws->screen),
+ InputOutput,
+ DefaultVisualOfScreen(ws->screen),
+ attrmask, &attrs);
+ XSetWindowBackground (ws->dpy, ws->window, ws->background);
+ XSetWindowColormap (ws->dpy, ws->window, ws->cmap);
+ xscreensaver_set_wm_atoms (ws->dpy, ws->window, w, h, 0);
+
+ if (ow)
+ {
+ XMapRaised (ws->dpy, ws->window);
+ XDestroyWindow (ws->dpy, ow);
+ }
+}
+
+
+/* Loads resources and creates and returns the global window state.
+ */
+static window_state *
+window_init (Widget root_widget, Bool splash_p)
+{
+ Display *dpy = XtDisplay (root_widget);
+ Screen *screen = XtScreen (root_widget);
+ window_state *ws;
+ Bool resource_error_p = False;
+
+ ws = (window_state *) calloc (1, sizeof(*ws));
+ if (!ws) abort();
+
+ ws->splash_p = splash_p;
+ ws->dpy = dpy;
+ ws->screen = screen;
+ ws->app = XtWidgetToApplicationContext (root_widget);
+
+ /* Read default theme from resources before the init file. */
+ ws->dialog_theme =
+ get_string_resource (ws->dpy, "dialogTheme", "DialogTheme");
+ if (!ws->dialog_theme || !*ws->dialog_theme)
+ ws->dialog_theme = strdup ("default");
+
+ /* Read theme from init file before any other resources. */
+ read_init_file_simple (ws);
+
+ {
+ struct passwd *p = getpwuid (getuid());
+ if (!p || !p->pw_name || !*p->pw_name) abort();
+ ws->user = p->pw_name;
+ }
+
+ ws->cmap = XCreateColormap (dpy, RootWindowOfScreen (screen), /* Old skool */
+ DefaultVisualOfScreen (screen),
+ AllocNone);
+
+ ws->newlogin_cmd = get_str (ws, "newLoginCommand", "NewLoginCommand");
+ ws->date_format = get_str (ws, "dateFormat", "DateFormat");
+ ws->show_stars_p =
+ get_boolean_resource (ws->dpy, "passwd.asterisks", "Passwd.Boolean");
+
+ /* Put the version number in the label. */
+ {
+ char *version = strdup (screensaver_id + 17);
+ char *year = strchr (version, '-');
+ char *s = strchr (version, ' ');
+ *s = 0;
+ year = strchr (year+1, '-') + 1;
+ s = strchr (year, ')');
+ *s = 0;
+ ws->heading_label = (char *) malloc (100);
+ ws->version = strdup(version);
+ sprintf (ws->heading_label, "XScreenSaver %.4s, v%.10s", year, version);
+
+ if (splash_p)
+ {
+ ws->body_label = (char *) malloc (100);
+ sprintf (ws->body_label,
+ _("Copyright \xC2\xA9 1991-%.4s by\nJamie Zawinski <jwz@jwz.org>"),
+ year);
+ }
+ }
+
+ ws->heading_font = get_font (ws, "headingFont");
+ ws->button_font = get_font (ws, "buttonFont");
+ ws->body_font = get_font (ws, "bodyFont");
+ ws->error_font = get_font (ws, "errorFont");
+ ws->label_font = get_font (ws, "labelFont");
+ ws->date_font = get_font (ws, "dateFont");
+ ws->hostname_font = get_font (ws, "unameFont");
+
+ ws->foreground = get_color (ws, "foreground", "Foreground");
+ ws->background = get_color (ws, "background", "Background");
+
+ get_xft_color (ws, &ws->xft_foreground, "foreground", "Foreground");
+ get_xft_color (ws, &ws->xft_text_foreground,
+ "text.foreground", "Text.Foreground");
+ get_xft_color (ws, &ws->xft_error_foreground,
+ "error.foreground", "Error.Foreground");
+ get_xft_color (ws, &ws->xft_button_foreground,
+ "button.foreground", "Button.Foreground");
+
+ ws->shadow_top = get_color (ws, "topShadowColor", "Foreground");
+ ws->shadow_bottom = get_color (ws, "bottomShadowColor", "Background");
+ ws->border_color = get_color (ws, "borderColor", "BorderColor");
+ ws->passwd_background = get_color (ws, "text.background", "Text.Background");
+ ws->button_background =
+ get_color (ws, "button.background", "Button.Background");
+ ws->thermo_foreground =
+ get_color (ws, "thermometer.foreground", "Thermometer.Foreground");
+ ws->thermo_background =
+ get_color ( ws, "thermometer.background", "Thermometer.Background");
+ ws->logo_background = get_color ( ws, "logo.background", "Logo.Background");
+
+ if (resource_error_p)
+ {
+ /* Make sure the error messages show up. */
+ ws->foreground = BlackPixelOfScreen (screen);
+ ws->background = WhitePixelOfScreen (screen);
+ }
+
+ ws->preferred_logo_width = get_int (ws, "logo.width", "Logo.Width");
+ ws->preferred_logo_height = get_int (ws, "logo.height", "Logo.Height");
+ ws->thermo_width = get_int (ws, "thermometer.width", "Thermometer.Width");
+ ws->shadow_width = get_int (ws, "shadowWidth", "ShadowWidth");
+ ws->border_width = get_int (ws, "borderWidth", "BorderWidth");
+ ws->internal_padding =
+ get_int (ws, "internalPadding", "InternalPadding");
+
+ if (ws->preferred_logo_width == 0) ws->preferred_logo_width = 150;
+ if (ws->preferred_logo_height == 0) ws->preferred_logo_height = 150;
+ if (ws->internal_padding == 0) ws->internal_padding = 15;
+ if (ws->thermo_width == 0) ws->thermo_width = ws->shadow_width;
+
+ if (ws->splash_p) ws->thermo_width = 0;
+
+# ifdef HAVE_UNAME
+ if (!splash_p &&
+ get_boolean_resource (ws->dpy, "passwd.uname", "Passwd.Boolean"))
+ {
+ struct utsname uts;
+ if (!uname (&uts) && *uts.nodename)
+ ws->hostname_label = strdup (uts.nodename);
+ }
+# endif
+
+ get_keyboard_layout (ws);
+
+ /* Load the logo pixmap, based on font size */
+ {
+ int x, y;
+ unsigned int bw, d;
+ Window root = RootWindowOfScreen(ws->screen);
+ Visual *visual = DefaultVisualOfScreen (ws->screen);
+ int logo_size = (ws->heading_font->ascent > 24 ? 2 : 1);
+ ws->logo_pixmap = xscreensaver_logo (screen, visual, root, ws->cmap,
+ ws->background,
+ &ws->logo_pixels, &ws->logo_npixels,
+ &ws->logo_clipmask, logo_size);
+ if (!ws->logo_pixmap) abort();
+ XGetGeometry (dpy, ws->logo_pixmap, &root, &x, &y,
+ &ws->logo_width, &ws->logo_height, &bw, &d);
+ }
+
+ splash_pick_window_position (ws->dpy, &ws->cx, &ws->cy);
+
+ ws->x = ws->y = 0;
+ create_window (ws, 1, 1);
+
+ /* Select SubstructureNotifyMask on the root window so that we know
+ when another process has mapped a window, so that we can make our
+ window always be on top. */
+ {
+ Window root = RootWindowOfScreen (ws->screen);
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (ws->dpy, root, &xgwa);
+ XSelectInput (ws->dpy, root,
+ xgwa.your_event_mask | SubstructureNotifyMask);
+ }
+
+
+ ws->newlogin_button_state.cmd = ws->newlogin_cmd;
+ ws->demo_button_state.cmd =
+ get_string_resource (ws->dpy, "demoCommand", "Command");
+ {
+ char *load = get_string_resource (ws->dpy, "loadURL", "Command");
+ char *url = get_string_resource (ws->dpy, "helpURL", "URL");
+ if (load && *load && url && *url)
+ {
+ char *cmd = (char *) malloc (strlen(load) + (strlen(url) * 5) + 10);
+ sprintf (cmd, load, url, url, url, url, url);
+ ws->help_button_state.cmd = cmd;
+ }
+ }
+
+ ws->unlock_button_state.fn = unlock_cb;
+
+ grab_keyboard_and_mouse (ws);
+
+ return ws;
+}
+
+
+#ifdef DEBUG_STACKING
+static void
+describe_window (Display *dpy, Window w)
+{
+ XClassHint ch;
+ char *name = 0;
+ if (XGetClassHint (dpy, w, &ch))
+ {
+ fprintf (stderr, "0x%lx \"%s\", \"%s\"\n", (unsigned long) w,
+ ch.res_class, ch.res_name);
+ XFree (ch.res_class);
+ XFree (ch.res_name);
+ }
+ else if (XFetchName (dpy, w, &name) && name)
+ {
+ fprintf (stderr, "0x%lx \"%s\"\n", (unsigned long) w, name);
+ XFree (name);
+ }
+ else
+ {
+ fprintf (stderr, "0x%lx (untitled)\n", (unsigned long) w);
+ }
+}
+#endif /* DEBUG_STACKING */
+
+
+/* Returns true if some other window is on top of this one.
+ */
+static Bool
+window_occluded_p (Display *dpy, Window window)
+{
+ int screen;
+
+# ifdef DEBUG_STACKING
+ fprintf (stderr, "\n");
+# endif
+
+ for (screen = 0; screen < ScreenCount (dpy); screen++)
+ {
+ int i;
+ Window root = RootWindow (dpy, screen);
+ Window root2 = 0, parent = 0, *kids = 0;
+ unsigned int nkids = 0;
+ Bool saw_our_window_p = False;
+ Bool saw_later_window_p = False;
+ if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids))
+ {
+# ifdef DEBUG_STACKING
+ fprintf (stderr, "%s: XQueryTree failed\n", blurb());
+# endif
+ continue;
+ }
+
+ for (i = 0; i < nkids; i++)
+ {
+ if (kids[i] == window)
+ {
+ saw_our_window_p = True;
+# ifdef DEBUG_STACKING
+ fprintf (stderr, "%s: our window: ", blurb());
+ describe_window (dpy, kids[i]);
+# endif
+ }
+ else if (saw_our_window_p)
+ {
+ saw_later_window_p = True;
+# ifdef DEBUG_STACKING
+ fprintf (stderr, "%s: higher window: ", blurb());
+ describe_window (dpy, kids[i]);
+# endif
+ break;
+ }
+ else
+ {
+# ifdef DEBUG_STACKING
+ fprintf (stderr, "%s: lower window: ", blurb());
+ describe_window (dpy, kids[i]);
+# endif
+ }
+ }
+
+ if (kids)
+ XFree ((char *) kids);
+
+ if (saw_later_window_p)
+ return True;
+ else if (saw_our_window_p)
+ return False;
+ /* else our window is not on this screen; keep going, try the next. */
+ }
+
+ /* Window doesn't exist? */
+# ifdef DEBUG_STACKING
+ fprintf (stderr, "%s: our window isn't on the screen\n", blurb());
+# endif
+ return False;
+}
+
+
+/* Strip leading and trailing whitespace. */
+static char *
+trim (const char *s)
+{
+ char *s2;
+ int L;
+ if (!s) return 0;
+ while (*s == ' ' || *s == '\t' || *s == '\r' || *s == '\n')
+ s++;
+ s2 = strdup (s);
+ L = strlen (s2);
+ while (L > 0 &&
+ (s2[L-1] == ' ' || s2[L-1] == '\t' ||
+ s2[L-1] == '\r' || s2[L-1] == '\n'))
+ s2[--L] = 0;
+ return s2;
+}
+
+
+/* Repaint the entire window.
+ */
+static void
+window_draw (window_state *ws)
+{
+ Display *dpy = ws->dpy;
+ Screen *screen = DefaultScreenOfDisplay (dpy);
+ Window root = RootWindowOfScreen (screen);
+ Visual *visual = DefaultVisualOfScreen(screen);
+ int depth = DefaultDepthOfScreen (screen);
+ XWindowAttributes xgwa;
+
+# define MIN_COLUMNS 22 /* Set window width based on headingFont ascent. */
+
+ int ext_border = (ws->internal_padding / 2 +
+ ws->shadow_width + ws->border_width);
+
+ Pixmap dbuf;
+ unsigned int logo_frame_width, logo_frame_height;
+ unsigned int window_width, window_height;
+ unsigned int text_left, text_right;
+ unsigned int thermo_x;
+ unsigned int x, y;
+ GC gc;
+ XGCValues gcv;
+ char date_text[100];
+ time_t now = time ((time_t *) 0);
+ struct tm *tm = localtime (&now);
+ double ratio = 1 - ((double_time() - ws->start_time) /
+ (ws->end_time - ws->start_time));
+ dialog_line *lines =
+ (dialog_line *) calloc (ws->nmsgs + 40, sizeof(*lines));
+ Bool emitted_user_p = False;
+ int i = 0, j;
+
+ XGetWindowAttributes (ws->dpy, ws->window, &xgwa);
+
+ if (!lines) abort();
+
+ strftime (date_text, sizeof(date_text)-2, ws->date_format, tm);
+
+ logo_frame_width = (ws->logo_width + ws->internal_padding * 2 +
+ ws->shadow_width * 2);
+ logo_frame_height = logo_frame_width;
+ if (logo_frame_width < ws->preferred_logo_width)
+ logo_frame_width = ws->preferred_logo_width;
+ if (logo_frame_height < ws->preferred_logo_height)
+ logo_frame_height = ws->preferred_logo_height;
+
+ thermo_x = ext_border * 1.5 + logo_frame_width + ws->shadow_width;
+ text_left = (thermo_x + ws->internal_padding +
+ (ws->thermo_width
+ ? ws->thermo_width + ws->shadow_width * 3
+ : 0));
+ text_right = text_left + ws->heading_font->ascent * MIN_COLUMNS;
+ window_width = text_right + ws->internal_padding + ext_border;
+ window_height = window_width * 3; /* reduced later */
+
+ dbuf = XCreatePixmap (dpy, root, window_width, window_height, depth);
+ gc = XCreateGC (dpy, dbuf, 0, &gcv);
+ XSetForeground (dpy, gc, ws->background);
+ XFillRectangle (dpy, dbuf, gc, 0, 0, window_width, window_height);
+
+ if (ws->xftdraw)
+ XftDrawDestroy (ws->xftdraw);
+ ws->xftdraw = XftDrawCreate (dpy, dbuf, visual, xgwa.colormap);
+
+ lines[i].text = ws->heading_label; /* XScreenSaver */
+ lines[i].font = ws->heading_font;
+ lines[i].fg = ws->xft_foreground;
+ lines[i].bg = ws->background;
+ lines[i].type = LABEL;
+ lines[i].align = CENTER;
+ i++;
+
+ if (time ((time_t *) 0) - XSCREENSAVER_RELEASED > 60*60*24*30*17)
+ {
+ lines[i].text = _("Update available!\nThis version is very old.\n");
+ lines[i].font = ws->error_font;
+ lines[i].fg = ws->xft_error_foreground;
+ lines[i].bg = ws->background;
+ lines[i].type = LABEL;
+ lines[i].align = CENTER;
+ i++;
+ }
+ else if (strstr (ws->version, "a") ||
+ strstr (ws->version, "b"))
+ {
+ lines[i].text = _("PRE-RELEASE VERSION");
+ lines[i].font = ws->error_font;
+ lines[i].fg = ws->xft_error_foreground;
+ lines[i].bg = ws->background;
+ lines[i].type = LABEL;
+ lines[i].align = CENTER;
+ i++;
+ }
+
+ if (ws->hostname_label && *ws->hostname_label)
+ {
+ lines[i].text = ws->hostname_label;
+ lines[i].font = ws->hostname_font;
+ lines[i].fg = ws->xft_foreground;
+ lines[i].bg = ws->background;
+ lines[i].type = LABEL;
+ lines[i].align = CENTER;
+ i++;
+ }
+
+# define BLANK_LINE \
+ lines[i].text = ""; \
+ lines[i].font = ws->body_font; \
+ lines[i].fg = ws->xft_foreground; \
+ lines[i].bg = ws->background; \
+ lines[i].type = LABEL; \
+ lines[i].align = CENTER; \
+ i++
+
+ BLANK_LINE;
+
+ if (debug_p && !ws->splash_p)
+ {
+ lines[i].text =
+ _("DEBUG MODE:\nAll keystrokes are being logged to stderr.\n");
+ lines[i].font = ws->error_font;
+ lines[i].fg = ws->xft_error_foreground;
+ lines[i].bg = ws->background;
+ lines[i].type = LABEL;
+ lines[i].align = CENTER;
+ i++;
+ }
+
+ if (ws->body_label && *ws->body_label)
+ {
+ lines[i].text = ws->body_label; /* Copyright or error message */
+ lines[i].font = ws->body_font;
+ lines[i].fg = ws->xft_foreground;
+ lines[i].bg = ws->background;
+ lines[i].type = LABEL;
+ lines[i].align = CENTER;
+ i++;
+
+ BLANK_LINE;
+ }
+
+ for (j = 0; j < ws->nmsgs; j++) /* PAM msgs */
+ {
+ switch (ws->msgs[j].type) {
+ case AUTH_MSGTYPE_INFO:
+ case AUTH_MSGTYPE_ERROR:
+ lines[i].text = trim (ws->msgs[j].msg);
+ lines[i].font = (ws->msgs[j].type == AUTH_MSGTYPE_ERROR
+ ? ws->error_font
+ : ws->body_font);
+ lines[i].fg = (ws->msgs[j].type == AUTH_MSGTYPE_ERROR
+ ? ws->xft_error_foreground
+ : ws->xft_foreground);
+ lines[i].bg = ws->background;
+ lines[i].type = LABEL;
+ lines[i].align = CENTER;
+ i++;
+ break;
+
+ case AUTH_MSGTYPE_PROMPT_NOECHO:
+ case AUTH_MSGTYPE_PROMPT_ECHO:
+
+ /* Show the logged in user before the first password field. */
+ if (!emitted_user_p)
+ {
+ lines[i].text = _("Username:");
+ lines[i].font = ws->label_font;
+ lines[i].fg = ws->xft_foreground;
+ lines[i].bg = ws->background;
+ lines[i].type = LABEL;
+ lines[i].align = LEFT;
+ lines[i].float_p = True;
+ i++;
+
+ lines[i].text = ws->user; /* $USER */
+ lines[i].font = ws->label_font;
+ lines[i].fg = ws->xft_text_foreground;
+ lines[i].bg = ws->passwd_background;
+ lines[i].type = TEXT_RO;
+ lines[i].align = RIGHT;
+ i++;
+ }
+
+ lines[i].text = trim (ws->msgs[j].msg); /* PAM prompt text */
+ lines[i].font = ws->label_font;
+ lines[i].fg = ws->xft_foreground;
+ lines[i].bg = ws->background;
+ lines[i].type = LABEL;
+ lines[i].align = LEFT;
+ lines[i].float_p = True;
+ i++;
+
+ lines[i].text = (ws->auth_state == AUTH_FINISHED
+ ? _("Checking...") :
+ ws->msgs[j].type == AUTH_MSGTYPE_PROMPT_ECHO
+ ? ws->plaintext_passwd /* Hopefully UTF-8 */
+ : ws->show_stars_p
+ ? ws->censored_passwd
+ : "");
+ lines[i].font = ws->label_font;
+ lines[i].fg = ws->xft_text_foreground;
+ lines[i].bg = ws->passwd_background;
+ lines[i].type = TEXT;
+ lines[i].align = RIGHT;
+ lines[i].i_beam = (ws->i_beam && ws->auth_state != AUTH_FINISHED);
+ i++;
+
+ /* Show the current time below the first password field only. */
+ if (*date_text && !emitted_user_p)
+ {
+ lines[i].text = date_text;
+ lines[i].font = ws->date_font;
+ lines[i].fg = ws->xft_foreground;
+ lines[i].bg = ws->background;
+ lines[i].type = LABEL;
+ lines[i].align = RIGHT;
+ i++;
+ }
+
+ /* Show the current keyboard layout below that. */
+ if (ws->kbd_layout_label && *ws->kbd_layout_label && !emitted_user_p)
+ {
+ lines[i].text = ws->kbd_layout_label;
+ lines[i].font = ws->date_font;
+ lines[i].fg = ws->xft_foreground;
+ lines[i].bg = ws->background;
+ lines[i].type = LABEL;
+ lines[i].align = RIGHT;
+ i++;
+ }
+
+ emitted_user_p = True;
+ break;
+
+ default:
+ abort();
+ break;
+ }
+ }
+
+ lines[i].text = 0;
+ y = draw_dialog_lines (ws, dbuf, lines,
+ text_left, text_right,
+ ws->border_width + ws->internal_padding +
+ ws->shadow_width);
+ window_height = y;
+ window_height += (ws->button_font->ascent * 4);
+ window_height += (ws->internal_padding + ws->shadow_width * 2 +
+ ws->border_width);
+
+
+ /* Keep logo area square or taller */
+ if (window_height < logo_frame_height + ws->shadow_width * 4)
+ window_height = logo_frame_height + ws->shadow_width * 4;
+
+ /* Fitt's Law: It is distracting to reduce the height of the window
+ after creation. */
+ if (window_height < ws->min_height)
+ window_height = ws->min_height;
+ ws->min_height = window_height;
+
+
+
+ /* Now do a second set of lines for the buttons at the bottom. */
+
+ memset (lines, 0, sizeof(*lines));
+ i = 0;
+
+ if (ws->splash_p)
+ {
+ lines[i].text = _("Settings");
+ lines[i].font = ws->button_font;
+ lines[i].fg = ws->xft_button_foreground;
+ lines[i].bg = ws->button_background;
+ lines[i].type = BUTTON;
+ lines[i].align = LEFT;
+ lines[i].float_p = True;
+ lines[i].button = &ws->demo_button_state;
+ i++;
+
+ lines[i].text = _("Help");
+ lines[i].font = ws->button_font;
+ lines[i].fg = ws->xft_button_foreground;
+ lines[i].bg = ws->button_background;
+ lines[i].type = BUTTON;
+ lines[i].align = RIGHT;
+ lines[i].button = &ws->help_button_state;
+ i++;
+ }
+ else
+ {
+ if (ws->newlogin_cmd && *ws->newlogin_cmd)
+ {
+ lines[i].text = _("New Login");
+ lines[i].font = ws->button_font;
+ lines[i].fg = ws->xft_button_foreground;
+ lines[i].bg = ws->button_background;
+ lines[i].type = BUTTON;
+ lines[i].align = LEFT;
+ lines[i].float_p = True;
+ lines[i].button = &ws->newlogin_button_state;
+ i++;
+ }
+
+ lines[i].text = _("OK");
+ lines[i].font = ws->button_font;
+ lines[i].fg = ws->xft_button_foreground;
+ lines[i].bg = ws->button_background;
+ lines[i].type = BUTTON;
+ lines[i].align = RIGHT;
+ lines[i].button = &ws->unlock_button_state;
+ i++;
+ }
+
+ lines[i].text = 0;
+ y = draw_dialog_lines (ws, dbuf, lines,
+ text_left, text_right,
+ window_height - ws->internal_padding -
+ ext_border -
+ ws->shadow_width -
+ (ws->button_font->ascent * 2));
+
+ /* The thermometer */
+ if (ws->thermo_width)
+ {
+ if (ws->auth_state != AUTH_NOTIFY)
+ {
+ int thermo_w = ws->thermo_width;
+ int thermo_h = window_height - ext_border * 2;
+ int thermo_h2 = thermo_h - ws->shadow_width * 2;
+ int thermo_h3 = thermo_h2 * (1.0 - ratio);
+
+ XSetForeground (dpy, gc, ws->thermo_foreground);
+ XFillRectangle (dpy, dbuf, gc,
+ thermo_x + ws->shadow_width,
+ ext_border + ws->shadow_width,
+ thermo_w, thermo_h2);
+ if (thermo_h3 > 0)
+ {
+ XSetForeground (dpy, gc, ws->thermo_background);
+ XFillRectangle (dpy, dbuf, gc,
+ thermo_x + ws->shadow_width,
+ ext_border + ws->shadow_width,
+ thermo_w, thermo_h3);
+ }
+ }
+
+ draw_shaded_rectangle (dpy, dbuf,
+ thermo_x, ext_border,
+ ws->thermo_width + ws->shadow_width * 2,
+ window_height - ext_border * 2,
+ ws->shadow_width,
+ ws->shadow_bottom, ws->shadow_top);
+ }
+
+ /* The logo, centered vertically.
+ */
+ {
+ int bot = window_height - ext_border * 2;
+ int xoff = (logo_frame_width - ws->logo_width) / 2;
+ int yoff = (bot - ws->logo_height) / 2;
+ x = ext_border;
+ y = ext_border;
+ XSetForeground (dpy, gc, ws->logo_background);
+ XFillRectangle (dpy, dbuf, gc, x, y, logo_frame_width, bot);
+ XSetForeground (dpy, gc, ws->foreground);
+ XSetBackground (dpy, gc, ws->background);
+ XSetClipMask (dpy, gc, ws->logo_clipmask);
+ XSetClipOrigin (dpy, gc, x + xoff, y + yoff);
+ XCopyArea (dpy, ws->logo_pixmap, dbuf, gc, 0, 0,
+ ws->logo_width, ws->logo_height,
+ x + xoff, y + yoff);
+ XSetClipMask (dpy, gc, 0);
+ draw_shaded_rectangle (dpy, dbuf,
+ x, y,
+ logo_frame_width,
+ bot,
+ ws->shadow_width,
+ ws->shadow_bottom, ws->shadow_top);
+ }
+
+ /* The window's shadow */
+ draw_shaded_rectangle (dpy, dbuf,
+ ws->border_width, ws->border_width,
+ window_width - ws->border_width * 2,
+ window_height - ws->border_width * 2,
+ ws->shadow_width,
+ ws->shadow_top, ws->shadow_bottom);
+
+ /* The window's border */
+ draw_shaded_rectangle (dpy, dbuf,
+ 0, 0, window_width, window_height,
+ ws->border_width,
+ ws->border_color, ws->border_color);
+
+
+ /* Now that everything has been rendered into the pixmap, reshape the window
+ and copy the pixmap to it. This double-buffering is to prevent flicker.
+
+ You'd think we could just reshape the window and then XMapRaised, but no.
+ With the XCompose extension enabled and the "Mutter" window manager, the
+ dialog window was sometimes not appearing on the screen, despite the fact
+ that XQueryTree reported it as the topmost window. The mouse pointer also
+ reflected it being there, but it wasn't visible. This is probably related
+ to the "XCompositeGetOverlayWindow" window in some way, which is a magic,
+ invisible window that is secretly excluded from the list returned by
+ XQueryTree, but I can't figure out what was really going on, except that
+ XMapRaised did not make my OverrideRedirect window appear topmost on the
+ screen.
+
+ However! Though XMapRaised was not working, it turns out that destroying
+ and re-creating the window *does* make it appear. So we do that, any time
+ the window's shape has changed, or some other window has raised above it.
+
+ Calling XQueryTree at 30fps could conceivably be a performance problem,
+ if there are thousands of windows on the screen. But here we are.
+ */
+ {
+ Bool size_changed_p, occluded_p;
+
+ /* It's distracting to move or shrink the window after creating it. */
+ if (xgwa.height > 100 && xgwa.height > window_height)
+ window_height = xgwa.height;
+ if (! ws->x)
+ {
+ ws->x = ws->cx - (window_width / 2);
+ ws->y = ws->cy - (window_height / 2);
+ }
+
+ /* If there is any change to the window's size, or if the window is
+ not on top, destroy and re-create the window. */
+ size_changed_p = !(xgwa.x == ws->x &&
+ xgwa.y == ws->y &&
+ xgwa.width == window_width &&
+ xgwa.height == window_height);
+ occluded_p = (!size_changed_p &&
+ window_occluded_p (ws->dpy, ws->window));
+
+ if (size_changed_p || occluded_p)
+ {
+# if 0 /* Window sometimes disappears under Mutter 3.30.2, Feb 2021. */
+ XWindowChanges wc;
+ wc.x = ws->x;
+ wc.y = ws->y;
+ wc.width = window_width;
+ wc.height = window_height;
+ if (verbose_p)
+ fprintf (stderr, "%s: reshaping window %dx%d+%d+%d\n", blurb(),
+ wc.width, wc.height, wc.x, wc.y);
+ XConfigureWindow (ws->dpy, ws->window, CWX|CWY|CWWidth|CWHeight, &wc);
+# else
+ if (verbose_p)
+ fprintf (stderr, "%s: re-creating window: %s\n", blurb(),
+ size_changed_p ? "size changed" : "occluded");
+ create_window (ws, window_width, window_height);
+# endif
+ XMapRaised (ws->dpy, ws->window);
+ XInstallColormap (ws->dpy, ws->cmap);
+ }
+ }
+
+ XFreeGC (dpy, gc);
+ gc = XCreateGC (dpy, ws->window, 0, &gcv);
+ XCopyArea (dpy, dbuf, ws->window, gc, 0, 0,
+ window_width, window_height, 0, 0);
+ XSync (dpy, False);
+ XFreeGC (dpy, gc);
+ XFreePixmap (dpy, dbuf);
+ free (lines);
+
+ if (verbose_p > 1)
+ {
+ static time_t last = 0;
+ static int count = 0;
+ count++;
+ if (now > last)
+ {
+ double fps = count / (double) (now - last);
+ fprintf (stderr, "%s: FPS: %0.1f\n", blurb(), fps);
+ count = 0;
+ last = now;
+ }
+ }
+}
+
+
+/* Unmaps the window and frees window_state.
+ */
+static void
+destroy_window (window_state *ws)
+{
+ XEvent event;
+
+ memset (ws->plaintext_passwd, 0, sizeof(ws->plaintext_passwd));
+ memset (ws->plaintext_passwd_char_size, 0,
+ sizeof(ws->plaintext_passwd_char_size));
+ memset (ws->censored_passwd, 0, sizeof(ws->censored_passwd));
+
+ if (ws->timer)
+ {
+ XtRemoveTimeOut (ws->timer);
+ ws->timer = 0;
+ }
+
+ if (ws->cursor_timer)
+ {
+ XtRemoveTimeOut (ws->cursor_timer);
+ ws->cursor_timer = 0;
+ }
+
+ while (XCheckMaskEvent (ws->dpy, PointerMotionMask, &event))
+ if (verbose_p)
+ fprintf (stderr, "%s: discarding MotionNotify event\n", blurb());
+
+ if (ws->window)
+ {
+ XDestroyWindow (ws->dpy, ws->window);
+ ws->window = 0;
+ }
+
+ if (ws->heading_label) free (ws->heading_label);
+ if (ws->date_format) free (ws->date_format);
+ if (ws->hostname_label) free (ws->hostname_label);
+ if (ws->kbd_layout_label) free (ws->kbd_layout_label);
+
+ if (ws->heading_font) XftFontClose (ws->dpy, ws->heading_font);
+ if (ws->body_font) XftFontClose (ws->dpy, ws->body_font);
+ if (ws->label_font) XftFontClose (ws->dpy, ws->label_font);
+ if (ws->date_font) XftFontClose (ws->dpy, ws->date_font);
+ if (ws->button_font) XftFontClose (ws->dpy, ws->button_font);
+ if (ws->hostname_font) XftFontClose (ws->dpy, ws->hostname_font);
+
+ XftColorFree (ws->dpy, DefaultVisualOfScreen (ws->screen),
+ DefaultColormapOfScreen (ws->screen),
+ &ws->xft_foreground);
+ XftColorFree (ws->dpy, DefaultVisualOfScreen (ws->screen),
+ DefaultColormapOfScreen (ws->screen),
+ &ws->xft_button_foreground);
+ XftColorFree (ws->dpy, DefaultVisualOfScreen (ws->screen),
+ DefaultColormapOfScreen (ws->screen),
+ &ws->xft_text_foreground);
+ XftColorFree (ws->dpy, DefaultVisualOfScreen (ws->screen),
+ DefaultColormapOfScreen (ws->screen),
+ &ws->xft_error_foreground);
+ XftDrawDestroy (ws->xftdraw);
+
+# if 0 /* screw this, we're exiting anyway */
+ if (ws->foreground != black && ws->foreground != white)
+ XFreeColors (ws->dpy, ws->cmap, &ws->foreground, 1, 0L);
+ if (ws->background != black && ws->background != white)
+ XFreeColors (ws->dpy, ws->cmap, &ws->background, 1, 0L);
+ if (ws->button_background != black && ws->button_background != white)
+ XFreeColors (ws->dpy, ws->cmap, &ws->button_background, 1, 0L);
+ if (ws->passwd_background != black && ws->passwd_background != white)
+ XFreeColors (ws->dpy, ws->cmap, &ws->passwd_background, 1, 0L);
+ if (ws->thermo_foreground != black && ws->thermo_foreground != white)
+ XFreeColors (ws->dpy, ws->cmap, &ws->thermo_foreground, 1, 0L);
+ if (ws->thermo_background != black && ws->thermo_background != white)
+ XFreeColors (ws->dpy, ws->cmap, &ws->thermo_background, 1, 0L);
+ if (ws->logo_background != black && ws->logo_background != white)
+ XFreeColors (ws->dpy, ws->cmap, &ws->logo_background, 1, 0L);
+ if (ws->shadow_top != black && ws->shadow_top != white)
+ XFreeColors (ws->dpy, ws->cmap, &ws->shadow_top, 1, 0L);
+ if (ws->shadow_bottom != black && ws->shadow_bottom != white)
+ XFreeColors (ws->dpy, ws->cmap, &ws->shadow_bottom, 1, 0L);
+# endif
+
+ if (ws->logo_pixmap)
+ XFreePixmap (ws->dpy, ws->logo_pixmap);
+ if (ws-> logo_clipmask)
+ XFreePixmap (ws->dpy, ws->logo_clipmask);
+ if (ws->logo_pixels)
+ {
+ if (ws->logo_npixels)
+ XFreeColors (ws->dpy, ws->cmap, ws->logo_pixels, ws->logo_npixels, 0L);
+ free (ws->logo_pixels);
+ ws->logo_pixels = 0;
+ ws->logo_npixels = 0;
+ }
+
+ XSync (ws->dpy, False);
+ memset (ws, 0, sizeof(*ws));
+ free (ws);
+
+}
+
+
+static void
+unlock_cb (window_state *ws)
+{
+ if (ws->auth_state == AUTH_READ)
+ ws->auth_state = AUTH_FINISHED;
+}
+
+
+/* We store the count and last time of authorization failures on a property
+ on the root window, so that on subsequent runs of this program that
+ succeed, we can warn the user that someone tried to log in and failed.
+ */
+static void
+persistent_auth_status_failure (window_state *ws,
+ Bool increment_p, Bool clear_p,
+ int *count_ret,
+ time_t *time_ret)
+{
+ Display *dpy = ws->dpy;
+ Window w = RootWindow (dpy, 0); /* always screen 0 */
+ Atom prop = XInternAtom (ws->dpy, LOCK_FAILURE_ATOM, False);
+ int count = 0;
+ time_t tt = 0;
+
+ Atom type;
+ unsigned char *dataP = 0;
+ int format;
+ unsigned long nitems, bytesafter;
+
+ if (increment_p && clear_p) abort();
+
+ /* Read the old property so that we can increment it. */
+ if (XGetWindowProperty (dpy, w, prop,
+ 0, 999, False, XA_INTEGER,
+ &type, &format, &nitems, &bytesafter,
+ &dataP)
+ == Success
+ && type == XA_INTEGER
+ && nitems >= 2
+ && dataP)
+ {
+ count = ((PROP32 *) dataP) [0];
+ tt = ((PROP32 *) dataP) [1]; /* Y2038 bug: unsigned 32 bit time_t */
+ if (verbose_p)
+ fprintf (stderr, "%s: previous auth failures: %d @ %lu\n",
+ blurb(), count, (unsigned long) tt);
+ }
+
+ if (dataP)
+ XFree (dataP);
+
+ if (clear_p)
+ {
+ XDeleteProperty (dpy, w, prop);
+ if (verbose_p)
+ fprintf (stderr, "%s: deleted auth failure property\n", blurb());
+ }
+ else if (increment_p)
+ {
+ PROP32 vv[2];
+ count++;
+
+ /* Remember the time of the *oldest* failed login. A failed login
+ 5 seconds ago does not mean we should skip warning about a failed
+ login yesterday.
+ */
+ if (tt <= 0) tt = time ((time_t *) 0);
+
+ vv[0] = (PROP32) count;
+ vv[1] = (PROP32) tt;
+ XChangeProperty (dpy, w, prop, XA_INTEGER, 32,
+ PropModeReplace, (unsigned char *) vv, 2);
+ if (verbose_p)
+ fprintf (stderr, "%s: saved auth failure: %d @ %lu\n",
+ blurb(), count, (unsigned long) tt);
+ }
+
+ if (count_ret) *count_ret = count;
+ if (time_ret) *time_ret = tt;
+}
+
+
+
+static void
+handle_keypress (window_state *ws, XKeyEvent *event)
+{
+ unsigned char decoded [MAX_BYTES_PER_CHAR * 10]; /* leave some slack */
+ KeySym keysym = 0;
+
+ /* XLookupString may return more than one character via XRebindKeysym;
+ and on some systems it returns multi-byte UTF-8 characters (contrary
+ to its documentation, which says it returns only Latin1.)
+
+ It seems to only do so, however, if setlocale() has been called.
+ See the code inside ENABLE_NLS in xscreensaver-auth.c.
+
+ The X Keyboard Extension X11R6.4 documentation says: "When Xkb is
+ present, XLookupString is allowed, but not required, to return strings
+ in character sets other than ISO Latin-1, depending on the current
+ locale." So I guess that means that multi-byte strings returned by
+ XLookupString might not be UTF-8, and thus might not be compatible
+ with XftDrawStringUtf8.
+ */
+ int decoded_size = XLookupString (event, (char *)decoded, sizeof(decoded),
+ &keysym, &ws->compose_status);
+
+ if (decoded_size > MAX_BYTES_PER_CHAR)
+ {
+ /* The multi-byte character returned is too large. */
+ XBell (ws->dpy, 0);
+ return;
+ }
+
+ decoded[decoded_size] = 0;
+
+ /* Add 10% to the time remaining every time a key is pressed, but don't
+ go past the max duration. */
+ {
+ time_t now = time ((time_t *) 0);
+ int max = get_seconds_resource (ws->dpy, "passwdTimeout", "Time");
+ int remain = ws->end_time - now;
+ remain *= 1.1;
+ if (remain > max) remain = max;
+ if (remain < 3) remain = 3;
+ ws->end_time = now + remain;
+ }
+
+
+ if (decoded_size == 1) /* Handle single-char commands */
+ {
+ switch (*decoded)
+ {
+ case '\010': case '\177': /* Backspace */
+ {
+ /* kludgey way to get the number of "logical" characters. */
+ int nchars = strlen (ws->plaintext_passwd_char_size);
+ int nbytes = strlen (ws->plaintext_passwd);
+ if (nbytes <= 0)
+ XBell (ws->dpy, 0);
+ else
+ {
+ int i;
+ for (i = ws->plaintext_passwd_char_size[nchars-1]; i >= 0; i--)
+ {
+ if (nbytes < 0) abort();
+ ws->plaintext_passwd[nbytes--] = 0;
+ }
+ ws->plaintext_passwd_char_size[nchars-1] = 0;
+ }
+ }
+ break;
+
+ case '\012': case '\015': /* Enter */
+ unlock_cb (ws);
+ break;
+
+ case '\033': /* Escape */
+ ws->auth_state = AUTH_CANCEL;
+ break;
+
+ case '\025': case '\030': /* Erase line */
+ memset (ws->plaintext_passwd, 0, sizeof (ws->plaintext_passwd));
+ memset (ws->plaintext_passwd_char_size, 0,
+ sizeof (ws->plaintext_passwd_char_size));
+ break;
+
+ default:
+ if (*decoded < ' ' && *decoded != '\t') /* Other ctrl char */
+ XBell (ws->dpy, 0);
+ else
+ goto SELF_INSERT;
+ break;
+ }
+ }
+ else
+ {
+ int nbytes, nchars;
+ SELF_INSERT:
+ nbytes = strlen (ws->plaintext_passwd);
+ nchars = strlen (ws->plaintext_passwd_char_size);
+ if (nchars + 1 >= sizeof (ws->plaintext_passwd_char_size)-1 ||
+ nbytes + decoded_size >= sizeof (ws->plaintext_passwd)-1)
+ XBell (ws->dpy, 0); /* overflow */
+ else if (decoded_size == 0)
+ ; /* Non-inserting keysym (Shift, Ctrl) */
+ else
+ {
+ ws->plaintext_passwd_char_size[nchars] = decoded_size;
+ ws->plaintext_passwd_char_size[nchars+1] = 0;
+ memcpy (ws->plaintext_passwd + nbytes, decoded, decoded_size);
+ ws->plaintext_passwd[nbytes + decoded_size] = 0;
+ }
+ }
+
+ /* Construct the string of asterisks. */
+ {
+ char *out = ws->censored_passwd;
+ int i;
+ *out = 0;
+ for (i = 0; i < MAX_PASSWD_CHARS && ws->plaintext_passwd_char_size[i]; i++)
+ {
+ const char *b = /* "\xE2\x80\xA2"; */ /* U+2022 Bullet */
+ "\xe2\x97\x8f"; /* U+25CF Black Circle */
+ strcat (out, b);
+ out += strlen(out);
+ }
+ }
+}
+
+
+static Bool
+handle_button (window_state *ws, XEvent *xev, line_button_state *bs)
+{
+ Bool mouse_in_box =
+ (xev->xbutton.x_root >= (ws->x + bs->rect.x) &&
+ xev->xbutton.x_root < (ws->x + bs->rect.x + bs->rect.width) &&
+ xev->xbutton.y_root >= (ws->y + bs->rect.y) &&
+ xev->xbutton.y_root < (ws->y + bs->rect.y + bs->rect.height));
+
+ bs->down_p = (!bs->disabled_p &&
+ mouse_in_box &&
+ xev->xany.type != ButtonRelease);
+
+ if (xev->xany.type == ButtonRelease && mouse_in_box && !bs->disabled_p)
+ {
+ bs->disabled_p = True; /* Only allow them to press the button once. */
+ if (bs->fn)
+ bs->fn (ws);
+ else if (bs->cmd)
+ {
+ int ac = 0;
+ char *av[10];
+ av[ac++] = "/bin/sh";
+ av[ac++] = "-c";
+ av[ac++] = bs->cmd;
+ av[ac] = 0;
+ fork_and_exec (ws->dpy, ac, av);
+ }
+ else
+ XBell (ws->dpy, 0);
+ }
+ return mouse_in_box;
+}
+
+
+static Bool
+handle_event (window_state *ws, XEvent *xev)
+{
+ Bool refresh_p = False;
+ switch (xev->xany.type) {
+ case KeyPress:
+ if (ws->splash_p)
+ ws->auth_state = AUTH_CANCEL;
+ else
+ {
+ handle_keypress (ws, &xev->xkey);
+ ws->caps_p = (xev->xkey.state & LockMask);
+ if (ws->auth_state == AUTH_NOTIFY)
+ ws->auth_state = AUTH_CANCEL;
+ }
+ refresh_p = True;
+ break;
+
+ case ButtonPress:
+ case ButtonRelease:
+ {
+ if (! (handle_button (ws, xev, &ws->newlogin_button_state) ||
+ handle_button (ws, xev, &ws->unlock_button_state) ||
+ handle_button (ws, xev, &ws->demo_button_state) ||
+ handle_button (ws, xev, &ws->help_button_state)))
+ if (ws->splash_p && xev->xany.type == ButtonRelease)
+ ws->auth_state = AUTH_CANCEL;
+ refresh_p = True;
+ }
+ default:
+ break;
+ }
+ return refresh_p;
+}
+
+
+/* Blink the I-beam cursor. */
+static void
+cursor_timer (XtPointer closure, XtIntervalId *id)
+{
+ window_state *ws = (window_state *) closure;
+ int timeout = 0.7 * 1000 * (ws->i_beam ? 0.25 : 0.75);
+ if (ws->cursor_timer)
+ XtRemoveTimeOut (ws->cursor_timer);
+ ws->cursor_timer =
+ XtAppAddTimeOut (ws->app, timeout, cursor_timer, (XtPointer) ws);
+ ws->i_beam = !ws->i_beam;
+}
+
+
+/* Redraw the window for the thermometer, and exit if the time has expired.
+ */
+static void
+thermo_timer (XtPointer closure, XtIntervalId *id)
+{
+ window_state *ws = (window_state *) closure;
+ int timeout = 1000/30; /* FPS */
+ double now = double_time();
+ if (now >= ws->end_time)
+ ws->auth_state = AUTH_TIME;
+ if (ws->timer) XtRemoveTimeOut (ws->timer);
+ ws->timer = XtAppAddTimeOut (ws->app, timeout, thermo_timer, (XtPointer) ws);
+}
+
+
+static void
+gui_main_loop (window_state *ws, Bool splash_p, Bool notification_p)
+{
+ int timeout;
+ Bool refresh_p = True;
+
+ if (splash_p)
+ {
+ timeout = get_seconds_resource (ws->dpy, "splashDuration", "Time");
+ if (timeout <= 1) timeout = 1;
+ }
+ else if (ws->auth_state == AUTH_NOTIFY)
+ timeout = 5;
+ else
+ {
+ timeout = get_seconds_resource (ws->dpy, "passwdTimeout", "Time");
+ if (timeout <= 5) timeout = 5;
+ cursor_timer (ws, 0);
+ }
+
+ ws->start_time = double_time();
+ ws->end_time = ws->start_time + timeout;
+
+ /* Since the "xscreensaver" process holds the mouse and keyboard grabbed
+ while "xscreensaver-auth" is running, we don't receive normal KeyPress
+ events. That means that the XInput2 extension is required in order to
+ snoop on the keyboard in a way that bypasses grabs.
+ */
+ if (! ws->xi_opcode)
+ {
+ Bool ov = verbose_p;
+ verbose_p = False;
+ init_xinput (ws->dpy, &ws->xi_opcode);
+ verbose_p = ov;
+ }
+
+ thermo_timer (ws, 0);
+ window_draw (ws);
+
+ while (ws->auth_state == AUTH_READ ||
+ ws->auth_state == AUTH_NOTIFY)
+ {
+ XEvent xev;
+ XtInputMask m = XtAppPending (ws->app);
+
+ if (m & XtIMXEvent)
+ /* Process timers then block on an X event (which we know is there) */
+ XtAppNextEvent (ws->app, &xev);
+ else
+ {
+ if (m)
+ /* Process timers only, don't block */
+ XtAppProcessEvent (ws->app, m);
+ else
+ {
+ if (refresh_p)
+ {
+ /* Redraw when outstanding events have been processed. */
+ window_draw (ws);
+ refresh_p = False;
+ }
+
+ /* No way to say "block until timer *or* X pending".
+ Without this, the timer that changes auth_state will fire but
+ then we will still be blocked until the next X event. */
+ usleep (1000000/30);
+ }
+ continue;
+ }
+
+ if ((m & ~XtIMXEvent) && !ws->splash_p)
+ refresh_p = True; /* In auth mode, all timers refresh */
+
+ if (verbose_p || debug_p)
+ print_xinput_event (ws->dpy, &xev, "");
+
+ /* Convert XInput events to Xlib events, for simplicity and familiarity.
+ */
+ if (xev.xcookie.type == GenericEvent &&
+ xev.xcookie.extension == ws->xi_opcode &&
+ (xev.xcookie.data || XGetEventData (ws->dpy, &xev.xcookie)))
+ {
+ XEvent ev2;
+ Bool ok =
+ xinput_event_to_xlib (xev.xcookie.evtype, xev.xcookie.data, &ev2);
+ XFreeEventData (ws->dpy, &xev.xcookie);
+ if (ok)
+ xev = ev2;
+ }
+
+ if (handle_event (ws, &xev))
+ refresh_p = True;
+
+ XtDispatchEvent (&xev);
+
+ switch (xev.xany.type) {
+
+ /* I don't think we ever receive these, but if we do, redraw. */
+ case Expose: case GraphicsExpose:
+ refresh_p = True;
+ break;
+
+ /* Likewise, receiving this event would be ideal, but we don't. */
+ case VisibilityNotify:
+ refresh_p = True;
+ if (verbose_p > 1)
+ fprintf (stderr, "%s: VisibilityNotify\n", blurb());
+ break;
+
+ /* When another override-redirect window is raised above us,
+ we receive several ConfigureNotify events on the root window. */
+ case ConfigureNotify:
+ if (verbose_p > 1)
+ fprintf (stderr, "%s: ConfigureNotify\n", blurb());
+ break;
+
+ case MappingNotify:
+ /* This event is supposed to be sent when the keymap is changed.
+ You would think that typing XK_ISO_Next_Group to change the
+ keyboard layout would count as such. It does not. */
+ if (verbose_p)
+ fprintf (stderr, "%s: MappingNotify\n", blurb());
+ get_keyboard_layout (ws);
+ refresh_p = True;
+ break;
+
+ default:
+ break;
+ }
+
+ /* Since MappingNotify doesn't work, we have to do this crap instead. */
+ if (xev.xany.type == ws->xkb_opcode)
+ {
+ XkbEvent *xkb = (XkbEvent *) &xev;
+ if (verbose_p)
+ fprintf (stderr, "%s: XKB event %d\n", blurb(), xkb->any.xkb_type);
+ get_keyboard_layout (ws);
+ refresh_p = True;
+ }
+ }
+
+ /* Re-raw the window one last time, since it might sit here for a while
+ while PAM does it's thing. */
+ window_draw (ws);
+ XSync (ws->dpy, False);
+
+ if (verbose_p) {
+ const char *kind = (splash_p ? "splash" :
+ notification_p ? "notification" : "authentication");
+ switch (ws->auth_state) {
+ case AUTH_FINISHED:
+ fprintf (stderr, "%s: %s input finished\n", blurb(), kind); break;
+ case AUTH_CANCEL:
+ fprintf (stderr, "%s: %s canceled\n", blurb(), kind); break;
+ case AUTH_TIME:
+ fprintf (stderr, "%s: %s timed out\n", blurb(), kind); break;
+ default: break;
+ }
+ }
+}
+
+
+/* Pops up a dialog and waits for the user to complete it.
+ Returns 0 on successful completion.
+ Updates 'resp' with any entered response.
+ */
+static Bool
+dialog_session (window_state *ws,
+ int nmsgs,
+ const auth_message *msgs,
+ auth_response *resp)
+{
+ int i;
+
+ ws->auth_state = AUTH_READ;
+ ws->nmsgs = nmsgs;
+ ws->msgs = msgs;
+
+ memset (ws->plaintext_passwd, 0, sizeof(ws->plaintext_passwd));
+ memset (ws->plaintext_passwd_char_size, 0,
+ sizeof(ws->plaintext_passwd_char_size));
+ memset (ws->censored_passwd, 0, sizeof(ws->censored_passwd));
+ ws->unlock_button_state.disabled_p = False;
+
+ gui_main_loop (ws, False, False);
+
+ if (ws->auth_state != AUTH_FINISHED)
+ return True; /* Timed out or canceled */
+
+ /* Find the (at most one) input field in the previous batch and return
+ the entered plaintext to it. */
+ for (i = 0; i < nmsgs; i++)
+ {
+ if (msgs[i].type == AUTH_MSGTYPE_PROMPT_ECHO ||
+ msgs[i].type == AUTH_MSGTYPE_PROMPT_NOECHO)
+ {
+ if (resp[i].response) abort();
+ resp[i].response = strdup(ws->plaintext_passwd);
+ }
+ }
+
+ ws->nmsgs = 0;
+ ws->msgs = 0;
+
+ return False;
+}
+
+
+/* To retain this across multiple calls from PAM to xscreensaver_auth_conv. */
+window_state *global_ws = 0;
+
+
+/* The authentication conversation function.
+
+ Like a PAM conversation function, this accepts multiple messages in a
+ single round. We can only do one text entry field in the dialog at a
+ time, so if there is more than one entry, multiple dialogs will be used.
+
+ PAM might call this multiple times before authenticating. We are unable
+ to combine multiple messages onto a single dialog if PAM splits them
+ between calls to this function.
+
+ Returns True on success. If the user timed out or cancelled, we just exit.
+ */
+Bool
+xscreensaver_auth_conv (void *closure,
+ int nmsgs,
+ const auth_message *msgs,
+ auth_response **resp)
+{
+ Widget root_widget = (Widget) closure;
+ int i;
+ int prev_msg = 0;
+ int field_count = 0;
+ auth_response *responses;
+ window_state *ws = global_ws;
+
+ if (!ws)
+ ws = global_ws = window_init (root_widget, False);
+
+ responses = calloc (nmsgs, sizeof(*responses));
+ if (!responses) abort();
+
+ for (i = 0; i < nmsgs; i++)
+ {
+ if (msgs[i].type == AUTH_MSGTYPE_PROMPT_ECHO ||
+ msgs[i].type == AUTH_MSGTYPE_PROMPT_NOECHO)
+ {
+ /* A text input field. */
+
+ if (field_count > 0)
+ {
+ /* This is the second one -- we must run the dialog on
+ the field collected so far. */
+ if (dialog_session (ws,
+ i - prev_msg,
+ msgs + prev_msg,
+ responses + prev_msg))
+ goto END;
+ prev_msg = i;
+ field_count = 0;
+ }
+
+ field_count++;
+ }
+ }
+
+ if (prev_msg < i || nmsgs == 0)
+ /* Run the dialog on the stuff that's left. This happens if there was
+ more than one text field. */
+ dialog_session (ws,
+ i - prev_msg,
+ msgs + prev_msg,
+ responses + prev_msg);
+
+ END:
+
+ switch (ws->auth_state) {
+ case AUTH_CANCEL:
+ case AUTH_TIME:
+ /* No need to return to PAM or clean up. We're outta here!
+ Exit with 0 to distinguish it from our "success" or "failure"
+ exit codes. */
+ destroy_window (ws);
+ exit (0);
+ break;
+ case AUTH_FINISHED:
+ *resp = responses;
+ return True;
+ default:
+ abort();
+ break;
+ }
+}
+
+
+/* Called after authentication is complete so that we can present a "nope"
+ dialog if it failed, or snitch on previous failed login attempts.
+ */
+void
+xscreensaver_auth_finished (void *closure, Bool authenticated_p)
+{
+ Widget root_widget = (Widget) closure;
+ window_state *ws = global_ws;
+ char msg[1024];
+ int unlock_failures = 0;
+ time_t failure_time = 0;
+ Bool prompted_p = !!ws;
+
+ /* If this was called without xscreensaver_auth_conv() ever having been
+ called, then either PAM decided that the user is authenticated without
+ a prompt (e.g. a bluetooth fob); or there was an error initializing
+ passwords (e.g., shadow passwords but not setuid.)
+ */
+ if (!ws)
+ ws = global_ws = window_init (root_widget, False);
+
+ if (authenticated_p)
+ {
+ /* Read the old failure count, and delete it. */
+ persistent_auth_status_failure (ws, False, True,
+ &unlock_failures, &failure_time);
+ }
+ else
+ {
+ /* Increment the failure count. */
+ persistent_auth_status_failure (ws, True, False,
+ &unlock_failures, &failure_time);
+ }
+
+ /* If we have something to say, put the dialog back up for a few seconds
+ to display it. Otherwise, don't bother.
+ */
+ if (!authenticated_p && !prompted_p)
+ strcpy (msg, _("Password initialization failed"));
+ else if (!authenticated_p && ws && ws->caps_p)
+ strcpy (msg, _("Authentication failed (Caps Lock?)"));
+ else if (!authenticated_p)
+ strcpy (msg, _("Authentication failed!"));
+ else if (authenticated_p && unlock_failures > 0)
+ {
+ time_t now = time ((time_t *) 0);
+ int sec = now - failure_time;
+ int min = (sec + 30) / 60;
+ int hours = (min + 30) / 60;
+ int days = (hours + 12) / 24;
+ char ago[100];
+ int warning_slack =
+ get_integer_resource (ws->dpy, "authWarningSlack", "AuthWarningSlack");
+
+ if (sec < warning_slack)
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: ignoring recent unlock failures:"
+ " %d within %d sec\n",
+ blurb(), unlock_failures, warning_slack);
+ goto END;
+ }
+ else if (days > 1) sprintf (ago, _("%d days ago"), days);
+ else if (hours > 1) sprintf (ago, _("%d hours ago"), hours);
+ else if (min > 1) sprintf (ago, _("%d minutes ago"), min);
+ else sprintf (ago, _("just now"));
+
+ if (unlock_failures == 1)
+ sprintf (msg, _("There has been 1 failed login attempt, %s."), ago);
+ else
+ sprintf (msg,
+ _("There have been %d failed login attempts, oldest %s."),
+ unlock_failures, ago);
+ }
+ else
+ {
+ /* No need to pop up a window. Authenticated, and there are no previous
+ failures to report.
+ */
+ goto END;
+ }
+
+ if (!*msg) abort();
+ ws->body_label = strdup (msg);
+
+ ws->auth_state = AUTH_NOTIFY;
+ gui_main_loop (ws, False, True);
+
+ END:
+ destroy_window (global_ws);
+}
+
+
+void
+xscreensaver_splash (void *closure)
+{
+ Widget root_widget = (Widget) closure;
+ window_state *ws = window_init (root_widget, True);
+ ws->auth_state = AUTH_READ;
+ gui_main_loop (ws, True, False);
+ destroy_window (ws);
+ exit (0);
+}
diff --git a/driver/dpms.c b/driver/dpms.c
index 3a8803c..15721ea 100644
--- a/driver/dpms.c
+++ b/driver/dpms.c
@@ -1,5 +1,5 @@
-/* dpms.c --- syncing the X Display Power Management values
- * xscreensaver, Copyright (c) 2001-2017 Jamie Zawinski <jwz@jwz.org>
+/* dpms.c --- syncing the X Display Power Management System values
+ * xscreensaver, Copyright © 2001-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -10,88 +10,36 @@
* implied warranty.
*/
-/* Display Power Management System (DPMS.)
-
- On XFree86 systems, "man xset" reports:
-
- -dpms The -dpms option disables DPMS (Energy Star) features.
- +dpms The +dpms option enables DPMS (Energy Star) features.
-
- dpms flags...
- The dpms option allows the DPMS (Energy Star)
- parameters to be set. The option can take up to three
- numerical values, or the `force' flag followed by a
- DPMS state. The `force' flags forces the server to
- immediately switch to the DPMS state specified. The
- DPMS state can be one of `standby', `suspend', or
- `off'. When numerical values are given, they set the
- inactivity period before the three modes are activated.
- The first value given is for the `standby' mode, the
- second is for the `suspend' mode, and the third is for
- the `off' mode. Setting these values implicitly
- enables the DPMS features. A value of zero disables a
- particular mode.
-
- However, note that the implementation is more than a little bogus,
- in that there is code in /usr/X11R6/lib/libXdpms.a to implement all
- the usual server-extension-querying utilities -- but there are no
- prototypes in any header file! Thus, the prototypes here. (The
- stuff in X11/extensions/dpms.h and X11/extensions/dpmsstr.h define
- the raw X protcol, they don't define the API to libXdpms.a.)
-
- Some documentation:
- Library: ftp://ftp.x.org/pub/R6.4/xc/doc/specs/Xext/DPMSLib.ms
- Protocol: ftp://ftp.x.org/pub/R6.4/xc/doc/specs/Xext/DPMS.ms
- */
-
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <stdio.h>
#include <X11/Xlib.h>
+#include <X11/Intrinsic.h>
-#ifdef HAVE_DPMS_EXTENSION /* almost the whole file */
+#include "xscreensaver.h"
-# include <X11/Xproto.h>
-# include <X11/extensions/dpms.h>
-/*# include <X11/extensions/dpmsstr.h>*/
+#ifndef HAVE_DPMS_EXTENSION /* almost the whole file */
- /* Why this crap is not in a header file somewhere, I have no idea. Losers!
- */
- extern Bool DPMSQueryExtension (Display *, int *event_ret, int *err_ret);
- extern Status DPMSGetVersion (Display *, int *major_ret, int *minor_ret);
- extern Bool DPMSCapable (Display *);
- extern Status DPMSInfo (Display *, CARD16 *power_level, BOOL *state);
- extern Status DPMSEnable (Display *dpy);
- extern Status DPMSDisable (Display *dpy);
- extern Status DPMSForceLevel (Display *, CARD16 level);
- extern Status DPMSSetTimeouts (Display *, CARD16 standby, CARD16 suspend,
- CARD16 off);
- extern Bool DPMSGetTimeouts (Display *, CARD16 *standby,
- CARD16 *suspend, CARD16 *off);
-
-#endif /* HAVE_DPMS_EXTENSION */
-
-
-/* This file doesn't need the Xt headers, so stub these types out... */
-#undef XtPointer
-#define XtAppContext void*
-#define XrmDatabase void*
-#define XtIntervalId void*
-#define XtPointer void*
-#define Widget void*
+void
+sync_server_dpms_settings (Display *dpy, struct saver_preferences *p)
+{
+ if (p->verbose_p)
+ fprintf (stderr, "%s: DPMS not supported at compile time\n", blurb());
+}
-#include "xscreensaver.h"
+Bool monitor_powered_on_p (Display *dpy) { return True; }
+void monitor_power_on (saver_info *si, Bool on_p) { return; }
+
+#else /* HAVE_DPMS_EXTENSION -- whole file */
-#ifdef HAVE_DPMS_EXTENSION
+# include <X11/Xproto.h>
+# include <X11/extensions/dpms.h>
-#define CLAMP_DOWN(var,val,mi) do { int old = (var); (var) -= (val); if ((var) < (mi) || (var) > old) (var) = (mi); } while (0)
static Bool error_handler_hit_p = False;
-static int idle_offset = 0;
-
static int
ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
{
@@ -99,17 +47,9 @@ ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
return 0;
}
-void
-store_dpms_offset(int offset)
-{
- idle_offset = offset < 15 ? 0 : offset;
-}
-
void
-sync_server_dpms_settings (Display *dpy, Bool enabled_p, Bool dpms_quickoff_p,
- int standby_secs, int suspend_secs, int off_secs,
- Bool verbose_p)
+sync_server_dpms_settings (Display *dpy, struct saver_preferences *p)
{
int event = 0, error = 0;
BOOL o_enabled = False;
@@ -117,11 +57,29 @@ sync_server_dpms_settings (Display *dpy, Bool enabled_p, Bool dpms_quickoff_p,
CARD16 o_standby = 0, o_suspend = 0, o_off = 0;
Bool bogus_p = False;
+ Bool enabled_p = (p->dpms_enabled_p && p->mode != DONT_BLANK);
+ Bool dpms_quickoff_p = p->dpms_quickoff_p;
+ int standby_secs = p->dpms_standby / 1000;
+ int suspend_secs = p->dpms_suspend / 1000;
+ int off_secs = p->dpms_off / 1000;
+ Bool verbose_p = p->verbose_p;
+ static Bool warned_p = False;
+
+ /* If the monitor is currently powered off, defer any changes until
+ we are next called while it is powered on. */
+ if (! monitor_powered_on_p (dpy))
+ return;
+
+ /* Why did I do this? It makes DPMS never happen.
+ XSetScreenSaver (dpy, 0, 0, 0, 0);
+ XForceScreenSaver (dpy, ScreenSaverReset);
+ */
+
if (dpms_quickoff_p && !off_secs)
- {
- /* To do this, we might need to temporarily re-enable DPMS first. */
- off_secs = 0xFFFF;
- }
+ {
+ /* To do this, we might need to temporarily re-enable DPMS first. */
+ off_secs = 0xFFFF;
+ }
if (standby_secs == 0 && suspend_secs == 0 && off_secs == 0)
/* all zero implies "DPMS disabled" */
@@ -135,13 +93,6 @@ sync_server_dpms_settings (Display *dpy, Bool enabled_p, Bool dpms_quickoff_p,
if (bogus_p) enabled_p = False;
- if (idle_offset != 0)
- {
- CLAMP_DOWN (standby_secs, idle_offset, 10);
- CLAMP_DOWN (suspend_secs, idle_offset, 10);
- CLAMP_DOWN (off_secs, idle_offset, 10);
- }
-
/* X protocol sends these values in a CARD16, so truncate them to 16 bits.
This means that the maximum timeout is 18:12:15.
*/
@@ -151,22 +102,25 @@ sync_server_dpms_settings (Display *dpy, Bool enabled_p, Bool dpms_quickoff_p,
if (! DPMSQueryExtension (dpy, &event, &error))
{
- if (verbose_p)
- fprintf (stderr, "%s: XDPMS extension not supported.\n", blurb());
+ if (verbose_p && !warned_p)
+ fprintf (stderr, "%s: XDPMS extension not supported\n", blurb());
+ warned_p = True;
return;
}
if (! DPMSCapable (dpy))
{
- if (verbose_p)
- fprintf (stderr, "%s: DPMS not supported.\n", blurb());
+ if (verbose_p && !warned_p)
+ fprintf (stderr, "%s: DPMS not supported\n", blurb());
+ warned_p = True;
return;
}
if (! DPMSInfo (dpy, &o_power, &o_enabled))
{
- if (verbose_p)
- fprintf (stderr, "%s: unable to get DPMS state.\n", blurb());
+ if (verbose_p && !warned_p)
+ fprintf (stderr, "%s: unable to get DPMS state\n", blurb());
+ warned_p = True;
return;
}
@@ -174,19 +128,20 @@ sync_server_dpms_settings (Display *dpy, Bool enabled_p, Bool dpms_quickoff_p,
{
if (! (enabled_p ? DPMSEnable (dpy) : DPMSDisable (dpy)))
{
- if (verbose_p)
- fprintf (stderr, "%s: unable to set DPMS state.\n", blurb());
+ if (verbose_p && !warned_p)
+ fprintf (stderr, "%s: unable to set DPMS state\n", blurb());
+ warned_p = True;
return;
}
else if (verbose_p)
- fprintf (stderr, "%s: turned DPMS %s.\n", blurb(),
+ fprintf (stderr, "%s: turned DPMS %s\n", blurb(),
enabled_p ? "on" : "off");
}
if (bogus_p)
{
if (verbose_p)
- fprintf (stderr, "%s: not setting bogus DPMS timeouts: %d %d %d.\n",
+ fprintf (stderr, "%s: not setting bogus DPMS timeouts: %d %d %d\n",
blurb(), standby_secs, suspend_secs, off_secs);
return;
}
@@ -194,7 +149,7 @@ sync_server_dpms_settings (Display *dpy, Bool enabled_p, Bool dpms_quickoff_p,
if (!DPMSGetTimeouts (dpy, &o_standby, &o_suspend, &o_off))
{
if (verbose_p)
- fprintf (stderr, "%s: unable to get DPMS timeouts.\n", blurb());
+ fprintf (stderr, "%s: unable to get DPMS timeouts\n", blurb());
return;
}
@@ -205,34 +160,34 @@ sync_server_dpms_settings (Display *dpy, Bool enabled_p, Bool dpms_quickoff_p,
if (!DPMSSetTimeouts (dpy, standby_secs, suspend_secs, off_secs))
{
if (verbose_p)
- fprintf (stderr, "%s: unable to set DPMS timeouts.\n", blurb());
+ fprintf (stderr, "%s: unable to set DPMS timeouts\n", blurb());
return;
}
else if (verbose_p)
- fprintf (stderr, "%s: set DPMS timeouts: %d %d %d.\n", blurb(),
+ fprintf (stderr, "%s: set DPMS timeouts: %d %d %d\n", blurb(),
standby_secs, suspend_secs, off_secs);
}
}
Bool
-monitor_powered_on_p (saver_info *si)
+monitor_powered_on_p (Display *dpy)
{
Bool result;
int event_number, error_number;
BOOL onoff = False;
CARD16 state;
- if (!DPMSQueryExtension(si->dpy, &event_number, &error_number))
+ if (!DPMSQueryExtension(dpy, &event_number, &error_number))
/* Server doesn't know -- assume the monitor is on. */
result = True;
- else if (!DPMSCapable(si->dpy))
+ else if (!DPMSCapable(dpy))
/* Server says the monitor doesn't do power management -- so it's on. */
result = True;
else
{
- DPMSInfo(si->dpy, &state, &onoff);
+ DPMSInfo(dpy, &state, &onoff);
if (!onoff)
/* Server says DPMS is disabled -- so the monitor is on. */
result = True;
@@ -252,17 +207,19 @@ monitor_powered_on_p (saver_info *si)
void
monitor_power_on (saver_info *si, Bool on_p)
{
- if ((!!on_p) != monitor_powered_on_p (si))
+ if ((!!on_p) != monitor_powered_on_p (si->dpy))
{
XErrorHandler old_handler;
int event_number, error_number;
+ static Bool warned_p = False;
if (!DPMSQueryExtension(si->dpy, &event_number, &error_number) ||
!DPMSCapable(si->dpy))
{
- if (si->prefs.verbose_p)
+ if (si->prefs.verbose_p && !warned_p)
fprintf (stderr,
- "%s: unable to power %s monitor: no DPMS extension.\n",
+ "%s: unable to power %s monitor: no DPMS extension\n",
blurb(), (on_p ? "on" : "off"));
+ warned_p = True;
return;
}
@@ -286,42 +243,12 @@ monitor_power_on (saver_info *si, Bool on_p)
XSetErrorHandler (old_handler);
/* Ignore error_handler_hit_p, just probe monitor instead */
- if ((!!on_p) != monitor_powered_on_p (si)) /* double-check */
+ if ((!!on_p) != monitor_powered_on_p (si->dpy)) /* double-check */
fprintf (stderr,
- "%s: DPMSForceLevel(dpy, %s) did not change monitor power state.\n",
+ "%s: DPMSForceLevel(dpy, %s) did not change monitor power state\n",
blurb(),
(on_p ? "DPMSModeOn" : "DPMSModeOff"));
}
}
-#else /* !HAVE_DPMS_EXTENSION */
-
-void
-store_dpms_offset(Display *dpy, Bool reset_p)
-{
-}
-
-
-void
-sync_server_dpms_settings (Display *dpy, Bool enabled_p,
- Bool dpms_quickoff_p,
- int standby_secs, int suspend_secs, int off_secs,
- Bool verbose_p)
-{
- if (verbose_p)
- fprintf (stderr, "%s: DPMS support not compiled in.\n", blurb());
-}
-
-Bool
-monitor_powered_on_p (saver_info *si)
-{
- return True;
-}
-
-void
-monitor_power_on (saver_info *si, Bool on_p)
-{
- return;
-}
-
-#endif /* !HAVE_DPMS_EXTENSION */
+#endif /* HAVE_DPMS_EXTENSION -- whole file */
diff --git a/driver/exec.c b/driver/exec.c
index 38ca88a..8d1c45a 100644
--- a/driver/exec.c
+++ b/driver/exec.c
@@ -1,5 +1,5 @@
/* exec.c --- executes a program in *this* pid, without an intervening process.
- * xscreensaver, Copyright (c) 1991-2013 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -69,14 +69,6 @@
/* and also setrlimit() and RLIMIT_AS */
#endif
-#ifdef VMS
-# include <processes.h>
-# include <unixio.h> /* for close */
-# include <unixlib.h> /* for getpid */
-# define pid_t int
-# define fork vfork
-#endif /* VMS */
-
#include "exec.h"
extern const char *blurb (void);
@@ -84,8 +76,6 @@ extern const char *blurb (void);
static void nice_process (int nice_level);
-#ifndef VMS
-
static void
exec_simple_command (const char *command)
{
@@ -161,26 +151,12 @@ exec_complex_command (const char *shell, const char *command)
execvp (av[0], av); /* shouldn't return. */
}
-#else /* VMS */
-
-static void
-exec_vms_command (const char *command)
-{
- system (command);
- fflush (stderr);
- fflush (stdout);
- exit (1); /* Note that this only exits a child fork. */
-}
-
-#endif /* !VMS */
-
void
exec_command (const char *shell, const char *command, int nice_level)
{
int hairy_p;
-#ifndef VMS
nice_process (nice_level);
hairy_p = !!strpbrk (command, "*?$&!<>[];`'\\\"=");
@@ -204,10 +180,6 @@ exec_command (const char *shell, const char *command, int nice_level)
else
/* Otherwise, we can just exec the program directly. */
exec_simple_command (command);
-
-#else /* VMS */
- exec_vms_command (command);
-#endif /* VMS */
}
@@ -242,7 +214,7 @@ nice_process (int nice_level)
}
#else
fprintf (stderr,
- "%s: don't know how to change process priority on this system.\n",
+ "%s: don't know how to change process priority on this system\n",
blurb());
#endif
diff --git a/driver/exts.c b/driver/exts.c
new file mode 100644
index 0000000..641325d
--- /dev/null
+++ b/driver/exts.c
@@ -0,0 +1,238 @@
+/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* Some random diagnostics printed in -verbose mode about what extensions
+ are available on the server, and their version numbers.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <X11/Xlib.h>
+#include <X11/Xlibint.h>
+#include <X11/Intrinsic.h>
+
+#include <X11/extensions/XInput2.h>
+
+#ifdef HAVE_XSHM_EXTENSION
+# include <X11/extensions/XShm.h>
+#endif /* HAVE_XSHM_EXTENSION */
+
+#ifdef HAVE_DPMS_EXTENSION
+# include <X11/extensions/dpms.h>
+#endif /* HAVE_DPMS_EXTENSION */
+
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+# include <X11/extensions/Xdbe.h>
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+#ifdef HAVE_XF86VMODE
+# include <X11/extensions/xf86vmode.h>
+#endif /* HAVE_XF86VMODE */
+
+#ifdef HAVE_XINERAMA
+# include <X11/extensions/Xinerama.h>
+#endif /* HAVE_XINERAMA */
+
+#ifdef HAVE_RANDR
+# include <X11/extensions/Xrandr.h>
+#endif /* HAVE_RANDR */
+
+#ifdef HAVE_XCOMPOSITE_EXTENSION
+# include <X11/extensions/Xcomposite.h>
+#endif
+
+#ifdef HAVE_XKB
+# include <X11/XKBlib.h>
+#endif
+
+#include "xscreensaver.h"
+
+
+void
+print_available_extensions (saver_info *si)
+{
+ int i, j;
+ static struct {
+ const char *name; const char *desc;
+ Bool useful_p;
+ Status (*version_fn) (Display *, int *majP, int *minP);
+ } exts[] = {
+
+# if 0
+ { "MIT-SCREEN-SAVER", "MIT Screen-Saver",
+ False, 0
+ },
+# endif
+ { "MIT-SHM", "Shared Memory",
+# ifdef HAVE_XSHM_EXTENSION
+ True, (Status (*) (Display*,int*,int*)) XShmQueryVersion /* 4 args */
+# else
+ False, 0
+# endif
+ }, { "DOUBLE-BUFFER", "Double-Buffering",
+# ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ True, XdbeQueryExtension
+# else
+ False, 0
+# endif
+ }, { "DPMS", "Power Management",
+# ifdef HAVE_DPMS_EXTENSION
+ True, DPMSGetVersion
+# else
+ False, 0
+# endif
+ }, { "GLX", "GLX",
+# ifdef HAVE_GL
+ True, 0
+# else
+ False, 0
+# endif
+ }, { "XFree86-VidModeExtension", "XF86 Video-Mode",
+# ifdef HAVE_XF86VMODE
+ True, XF86VidModeQueryVersion
+# else
+ False, 0
+# endif
+ }, { "XC-VidModeExtension", "XC Video-Mode",
+# ifdef HAVE_XF86VMODE
+ True, XF86VidModeQueryVersion
+# else
+ False, 0
+# endif
+ }, { "XINERAMA", "Xinerama",
+# ifdef HAVE_XINERAMA
+ True, XineramaQueryVersion
+# else
+ False, 0
+# endif
+ }, { "RANDR", "Resize-and-Rotate",
+# ifdef HAVE_RANDR
+ True, XRRQueryVersion
+# else
+ False, 0
+# endif
+ }, { "Composite", "Composite",
+# ifdef HAVE_XCOMPOSITE_EXTENSION
+ True, XCompositeQueryVersion
+# else
+ True, 0
+# endif
+ }, { "XKEYBOARD", "XKeyboard",
+# ifdef HAVE_XKB
+ True, 0,
+# else
+ False, 0
+# endif
+ }, { "DRI", "DRI", True, 0
+ }, { "NV-CONTROL", "NVidia", True, 0
+ }, { "NV-GLX", "NVidia GLX", True, 0
+ }, { "Apple-DRI", "Apple-DRI", True, 0
+ }, { "Apple-WM", "Apple-WM", True, 0
+ }, { "XInputExtension", "XInput", True, 0
+ },
+ };
+
+ fprintf (stderr, "%s: running on display \"%s\"\n", blurb(),
+ DisplayString(si->dpy));
+ fprintf (stderr, "%s: vendor is %s, %d\n", blurb(),
+ ServerVendor(si->dpy), VendorRelease(si->dpy));
+
+ fprintf (stderr, "%s: useful extensions:\n", blurb());
+ for (i = 0; i < countof(exts); i++)
+ {
+ int op = 0, event = 0, error = 0;
+ char buf [255];
+ int maj = 0, min = 0;
+ int dummy1, dummy2, dummy3;
+
+ /* Most of the extension version functions take 3 args,
+ writing results into args 2 and 3, but some take more.
+ We only ever care about the first two results, but we
+ pass in three extra pointers just in case.
+ */
+ Status (*version_fn_2) (Display*,int*,int*,int*,int*,int*) =
+ (Status (*) (Display*,int*,int*,int*,int*,int*)) exts[i].version_fn;
+
+ if (!XQueryExtension (si->dpy, exts[i].name, &op, &event, &error))
+ continue;
+ sprintf (buf, "%s: ", blurb());
+ strcat (buf, exts[i].desc);
+
+ if (!strcmp (exts[i].desc, "XInput"))
+ {
+ int maj = 999, min = 999; /* Desired */
+ XIQueryVersion (si->dpy, &maj, &min); /* Actual */
+ sprintf (buf+strlen(buf), " (%d.%d)", maj, min);
+ }
+ else if (!version_fn_2)
+ ;
+ else if (version_fn_2 (si->dpy, &maj, &min, &dummy1, &dummy2, &dummy3))
+ sprintf (buf+strlen(buf), " (%d.%d)", maj, min);
+ else
+ strcat (buf, " (unavailable)");
+
+ if (!exts[i].useful_p)
+ strcat (buf, " (disabled at compile time)");
+ fprintf (stderr, "%s\n", buf);
+ }
+
+# ifdef HAVE_LIBSYSTEMD
+ fprintf (stderr, "%s: libsystemd\n", blurb());
+# else
+ fprintf (stderr, "%s: libsystemd (disabled at compile time)\n", blurb());
+# endif
+
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ unsigned long colormapped_depths = 0;
+ unsigned long non_mapped_depths = 0;
+ XVisualInfo vi_in, *vi_out;
+ int out_count;
+
+ if (!ssi->real_screen_p) continue;
+
+ vi_in.screen = ssi->real_screen_number;
+ vi_out = XGetVisualInfo (si->dpy, VisualScreenMask, &vi_in, &out_count);
+ if (!vi_out) continue;
+ for (j = 0; j < out_count; j++) {
+ if (vi_out[j].depth >= 32) continue;
+ if (vi_out[j].class == PseudoColor)
+ colormapped_depths |= (1 << vi_out[j].depth);
+ else
+ non_mapped_depths |= (1 << vi_out[j].depth);
+ }
+ XFree ((char *) vi_out);
+
+ if (colormapped_depths)
+ {
+ fprintf (stderr, "%s: screen %d colormapped depths:", blurb(),
+ ssi->real_screen_number);
+ for (j = 0; j < 32; j++)
+ if (colormapped_depths & (1 << j))
+ fprintf (stderr, " %d", j);
+ fprintf (stderr, "\n");
+ }
+ if (non_mapped_depths)
+ {
+ fprintf (stderr, "%s: screen %d non-colormapped depths:",
+ blurb(), ssi->real_screen_number);
+ for (j = 0; j < 32; j++)
+ if (non_mapped_depths & (1 << j))
+ fprintf (stderr, " %d", j);
+ fprintf (stderr, "\n");
+ }
+ }
+}
diff --git a/driver/fade.c b/driver/fade.c
new file mode 100644
index 0000000..9451582
--- /dev/null
+++ b/driver/fade.c
@@ -0,0 +1,1749 @@
+/* xscreensaver, Copyright © 1992-2021 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* There are several different mechanisms here for fading the desktop to
+ black, and then fading it back in again.
+
+ - Colormaps: This only works on 8-bit displays, which basically haven't
+ existed since the 90s. It takes the current colormap, makes a writable
+ copy of it, and then animates the color cells to fade and unfade.
+
+ - XF86 Gamma or RANDR Gamma: These do the fade by altering the brightness
+ settings of the screen. This works on any system that has the "XF86
+ Video-Mode" extension (which is every modern system) AND ALSO has gamma
+ support in the video driver. But it turns out that as of 2021, the
+ Raspberry Pi HDMI video driver still does not support gamma. And there's
+ no way to determine that the video driver lacks gamma support even though
+ the extension exists. Since the Pi is probably the single most popular
+ platform for running X11 on the desktop these days, that makes this
+ method pretty much useless now.
+
+ - SGI VC: Same as the above, but only works on SGI.
+
+ - XSHM: This works by taking a screenshot and hacking the bits by hand.
+ It's slow. Also, in order to fade in from black to the desktop (possibly
+ hours after it faded out) it has to retain that first screenshot of the
+ desktop to fade back to. But if the desktop had changed in the meantime,
+ there will be a glitch at the end as it snaps from the screenshot to the
+ new current reality.
+
+ In summary, everything is terrible because X11 doesn't support alpha.
+
+
+ The fade process goes like this:
+
+ Screen saver activates:
+ - Fade out:
+ - Desktop is visible
+ - Save screenshot for later
+ - Map invisible temp windows
+ - Fade from desktop to black
+ - Erase saver windows to black and raise them
+ - Destroy temp windows
+
+ Screen saver deactivates:
+ - Fade out:
+ - Saver graphics are visible
+ - Map invisible temp windows
+ - Do not save a screenshot
+ - Fade from graphics to black
+ - Erase saver windows to black and raise them
+ - Destroy temp windows
+
+ - Fade in:
+ - Screen is black
+ - Map invisible temp windows
+ - Do not save a screenshot
+ - Unmap saver windows
+ - Fade from black to saved screenshot
+ - Destroy temp windows
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/time.h>
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+#else /* real X11 */
+# include <X11/Xlib.h>
+# include <X11/Xatom.h>
+# include <X11/Xproto.h>
+# include <X11/Intrinsic.h>
+#endif /* !HAVE_JWXYZ */
+
+#include "blurb.h"
+#include "visual.h"
+#include "usleep.h"
+#include "fade.h"
+#include "xshm.h"
+#include "atoms.h"
+#include "clientmsg.h"
+#include "xmu.h"
+
+/* Since gamma fading doesn't work on the Raspberry Pi, probably the single
+ most popular desktop Linux system these days, let's not use this fade
+ method even if the extension exists (which it does).
+ */
+#undef HAVE_XF86VMODE_GAMMA
+
+/* I'm not sure that the RANDR fade method brings anything to the party
+ that the XF86 method does See below.
+ */
+#undef HAVE_RANDR_12
+
+#define HAVE_XINPUT2 1 /* Mandatory */
+
+
+#ifdef HAVE_XINPUT2
+# include <X11/extensions/XInput2.h>
+# include "xinput.h"
+#endif
+
+
+typedef struct {
+ int nscreens;
+ Pixmap *screenshots;
+} fade_state;
+
+
+/* #### There's a bunch of duplicated code in the back half of the
+ four _fade and _whack functions that could probably be combined.
+ */
+#ifdef HAVE_SGI_VC_EXTENSION
+static int sgi_gamma_fade (XtAppContext, Display *, Window *wins, int count,
+ double secs, Bool out_p);
+#endif
+#ifdef HAVE_XF86VMODE_GAMMA
+static int xf86_gamma_fade (XtAppContext, Display *, Window *wins, int count,
+ double secs, Bool out_p);
+#endif
+#ifdef HAVE_RANDR_12
+static int randr_gamma_fade (XtAppContext, Display *, Window *wins, int count,
+ double secs, Bool out_p);
+#endif
+static int colormap_fade (XtAppContext, Display *, Window *wins, int count,
+ double secs, Bool out_p, Bool from_desktop_p);
+static int xshm_fade (XtAppContext, Display *,
+ Window *wins, int count, double secs,
+ Bool out_p, Bool from_desktop_p, fade_state *);
+
+
+static double
+double_time (void)
+{
+ struct timeval now;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&now, &tzp);
+# else
+ gettimeofday(&now);
+# endif
+
+ return (now.tv_sec + ((double) now.tv_usec * 0.000001));
+}
+
+
+#ifdef HAVE_XINPUT2
+static int xi_opcode = -1;
+#endif
+
+/* Closure arg points to a Bool saying whether motion events count.
+ Motion aborts fade-out, but only clicks and keys abort fade-in.
+ */
+static Bool
+user_event_p (Display *dpy, XEvent *event, XPointer arg)
+{
+ Bool motion_p = *((Bool *) arg);
+
+ switch (event->xany.type) {
+ case KeyPress: case ButtonPress:
+ return True;
+ break;
+ case MotionNotify:
+ if (motion_p) return True;
+ break;
+# ifdef HAVE_XINPUT2
+ case GenericEvent:
+ {
+ XIRawEvent *re;
+ if (event->xcookie.extension != xi_opcode)
+ return False;
+ if (! event->xcookie.data)
+ XGetEventData (dpy, &event->xcookie);
+ if (! event->xcookie.data)
+ return False;
+ re = event->xcookie.data;
+
+ if (re->evtype == XI_RawKeyPress ||
+ re->evtype == XI_RawButtonPress)
+ return True;
+ else if (motion_p && re->evtype == XI_RawMotion)
+ return True;
+
+ /* Calling XFreeEventData here is bad news */
+ }
+ break;
+# endif /* HAVE_XINPUT2 */
+ default: break;
+ }
+
+ return False;
+}
+
+
+static Bool
+user_active_p (XtAppContext app, Display *dpy, Bool fade_out_p)
+{
+ XEvent event;
+ XtInputMask m;
+ Bool motion_p = fade_out_p; /* Motion aborts fade-out, not fade-in. */
+ motion_p = False; /* Naah, never abort on motion only */
+
+# ifdef HAVE_XINPUT2
+ if (xi_opcode == -1)
+ {
+ Bool ov = verbose_p;
+ xi_opcode = 0; /* only init once */
+ verbose_p = False; /* xscreensaver already printed this */
+ init_xinput (dpy, &xi_opcode);
+ verbose_p = ov;
+ }
+# endif
+
+ m = XtAppPending (app);
+ if (m & ~XtIMXEvent)
+ {
+ /* Process timers and signals only, don't block. */
+ if (verbose_p > 1)
+ fprintf (stderr, "%s: Xt pending %ld\n", blurb(), m);
+ XtAppProcessEvent (app, m);
+ }
+
+ /* If there is user activity, bug out. (Bug out on keypresses or
+ mouse presses, but not motion, and not release events. Bugging
+ out on motion made the unfade hack be totally useless, I think.)
+ */
+ if (XCheckIfEvent (dpy, &event, &user_event_p, (XPointer) &motion_p))
+ {
+ if (verbose_p > 1)
+ {
+ XIRawEvent *re = 0;
+ if (event.xany.type == GenericEvent && !event.xcookie.data)
+ {
+ XGetEventData (dpy, &event.xcookie);
+ re = event.xcookie.data;
+ }
+ fprintf (stderr, "%s: user input %d %d\n", blurb(),
+ event.xany.type,
+ (re ? re->evtype : -1));
+ }
+ XPutBackEvent (dpy, &event);
+ return True;
+ }
+
+ return False;
+}
+
+
+static void
+flush_user_input (Display *dpy)
+{
+ XEvent event;
+ Bool motion_p = True;
+ while (XCheckIfEvent (dpy, &event, &user_event_p, (XPointer) &motion_p))
+ if (verbose_p > 1)
+ {
+ XIRawEvent *re = 0;
+ if (event.xany.type == GenericEvent && !event.xcookie.data)
+ {
+ XGetEventData (dpy, &event.xcookie);
+ re = event.xcookie.data;
+ }
+ fprintf (stderr, "%s: flushed user event %d %d\n", blurb(),
+ event.xany.type,
+ (re ? re->evtype : -1));
+ }
+}
+
+
+/* This bullshit is needed because the VidMode and SHM extensions don't work
+ on remote displays. */
+static Bool error_handler_hit_p = False;
+
+static int
+ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
+{
+ if (verbose_p > 1)
+ XmuPrintDefaultErrorMessage (dpy, error, stderr);
+ error_handler_hit_p = True;
+ return 0;
+}
+
+
+/* Returns true if canceled by user activity. */
+Bool
+fade_screens (XtAppContext app, Display *dpy,
+ Window *saver_windows, int nwindows,
+ double seconds, Bool out_p, Bool from_desktop_p,
+ void **closureP)
+{
+ int status = False;
+ fade_state *state = 0;
+
+ if (nwindows <= 0) abort();
+ if (!saver_windows) abort();
+
+ if (!closureP) abort();
+ state = (fade_state *) *closureP;
+ if (!state)
+ {
+ state = (fade_state *) calloc (1, sizeof (*state));
+ *closureP = state;
+ }
+
+ if (from_desktop_p && !out_p)
+ abort(); /* Fading in from desktop makes no sense */
+
+ if (out_p)
+ flush_user_input (dpy); /* Flush at start of cycle */
+
+# ifdef HAVE_SGI_VC_EXTENSION
+ /* First try to do it by fading the gamma in an SGI-specific way... */
+ status = sgi_gamma_fade (app, dpy, saver_windows, nwindows, seconds, out_p);
+ if (status == 0 || status == 1)
+ return status; /* faded, possibly canceled */
+# endif
+
+# ifdef HAVE_RANDR_12
+ /* Then try to do it by fading the gamma in an RANDR-specific way... */
+ status = randr_gamma_fade (app, dpy, saver_windows, nwindows, seconds, out_p);
+ if (status == 0 || status == 1)
+ return status; /* faded, possibly canceled */
+# endif
+
+# ifdef HAVE_XF86VMODE_GAMMA
+ /* Then try to do it by fading the gamma in an XFree86-specific way... */
+ status = xf86_gamma_fade(app, dpy, saver_windows, nwindows, seconds, out_p);
+ if (status == 0 || status == 1)
+ return status; /* faded, possibly canceled */
+# endif
+
+ if (has_writable_cells (DefaultScreenOfDisplay (dpy),
+ DefaultVisual (dpy, 0)))
+ {
+ /* Do it the old-fashioned way, which only really worked on
+ 8-bit displays. */
+ status = colormap_fade (app, dpy, saver_windows, nwindows, seconds,
+ out_p, from_desktop_p);
+ if (status == 0 || status == 1)
+ return status; /* faded, possibly canceled */
+ }
+
+ /* Else do it the hard way, by hacking a screenshot. */
+ status = xshm_fade (app, dpy, saver_windows, nwindows, seconds, out_p,
+ from_desktop_p, state);
+ status = (status ? True : False);
+
+ return status;
+}
+
+/****************************************************************************
+
+ Colormap fading
+
+ ****************************************************************************/
+
+
+/* The business with `cmaps_per_screen' is to fake out the SGI 8-bit video
+ hardware, which is capable of installing multiple (4) colormaps
+ simultaneously. We have to install multiple copies of the same set of
+ colors in order to fill up all the available slots in the hardware color
+ lookup table, so we install an extra N colormaps per screen to make sure
+ that all screens really go black.
+
+ I'm told that this trick also works with XInside's AcceleratedX when using
+ the Matrox Millennium card (which also allows multiple PseudoColor and
+ TrueColor visuals to co-exist and display properly at the same time.)
+
+ This trick works ok on the 24-bit Indy video hardware, but doesn't work at
+ all on the O2 24-bit hardware. I guess the higher-end hardware is too
+ "good" for this to work (dammit.) So... I figured out the "right" way to
+ do this on SGIs, which is to ramp the monitor's gamma down to 0. That's
+ what is implemented in sgi_gamma_fade(), so we use that if we can.
+
+ Returns:
+ 0: faded normally
+ 1: canceled by user activity
+ -1: unable to fade because the extension isn't supported.
+ */
+static int
+colormap_fade (XtAppContext app, Display *dpy,
+ Window *saver_windows, int nwindows,
+ double seconds, Bool out_p, Bool from_desktop_p)
+{
+ int status = -1;
+ Colormap *window_cmaps = 0;
+ int i, j, k;
+ int cmaps_per_screen = 5;
+ int nscreens = ScreenCount(dpy);
+ int ncmaps = nscreens * cmaps_per_screen;
+ Colormap *fade_cmaps = 0;
+ Bool installed = False;
+ int total_ncolors;
+ XColor *orig_colors, *current_colors, *screen_colors, *orig_screen_colors;
+ int screen;
+
+ window_cmaps = (Colormap *) calloc(sizeof(Colormap), nwindows);
+ if (!window_cmaps) abort();
+ for (screen = 0; screen < nwindows; screen++)
+ {
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (dpy, saver_windows[screen], &xgwa);
+ window_cmaps[screen] = xgwa.colormap;
+ }
+
+ error_handler_hit_p = False;
+
+ if (verbose_p > 1)
+ fprintf (stderr, "%s: colormap fade %s\n",
+ blurb(), (out_p ? "out" : "in"));
+
+ total_ncolors = 0;
+ for (i = 0; i < nscreens; i++)
+ total_ncolors += CellsOfScreen (ScreenOfDisplay(dpy, i));
+
+ orig_colors = (XColor *) calloc(sizeof(XColor), total_ncolors);
+ current_colors = (XColor *) calloc(sizeof(XColor), total_ncolors);
+
+ /* Get the contents of the colormap we are fading from or to. */
+ screen_colors = orig_colors;
+ for (i = 0; i < nscreens; i++)
+ {
+ Screen *sc = ScreenOfDisplay (dpy, i);
+ int ncolors = CellsOfScreen (sc);
+ Colormap cmap = (from_desktop_p || !out_p
+ ? DefaultColormapOfScreen(sc)
+ : window_cmaps[i]);
+ for (j = 0; j < ncolors; j++)
+ screen_colors[j].pixel = j;
+ XQueryColors (dpy, cmap, screen_colors, ncolors);
+
+ screen_colors += ncolors;
+ }
+
+ memcpy (current_colors, orig_colors, total_ncolors * sizeof (XColor));
+
+
+ /* Make the writable colormaps (we keep these around and reuse them.) */
+ if (!fade_cmaps)
+ {
+ fade_cmaps = (Colormap *) calloc(sizeof(Colormap), ncmaps);
+ for (i = 0; i < nscreens; i++)
+ {
+ Visual *v = DefaultVisual(dpy, i);
+ Screen *s = ScreenOfDisplay(dpy, i);
+ if (has_writable_cells (s, v))
+ for (j = 0; j < cmaps_per_screen; j++)
+ fade_cmaps[(i * cmaps_per_screen) + j] =
+ XCreateColormap (dpy, RootWindowOfScreen (s), v, AllocAll);
+ }
+ }
+
+ /* Run the animation at the maximum frame rate in the time allotted. */
+ {
+ double start_time = double_time();
+ double end_time = start_time + seconds;
+ double prev = 0;
+ double now;
+ int frames = 0;
+ double max = 1/60.0; /* max FPS */
+ while ((now = double_time()) < end_time)
+ {
+ double ratio = (end_time - now) / seconds;
+ if (!out_p) ratio = 1-ratio;
+
+ /* For each screen, compute the current value of each color...
+ */
+ orig_screen_colors = orig_colors;
+ screen_colors = current_colors;
+ for (j = 0; j < nscreens; j++)
+ {
+ int ncolors = CellsOfScreen (ScreenOfDisplay (dpy, j));
+ for (k = 0; k < ncolors; k++)
+ {
+ /* This doesn't take into account the relative luminance of the
+ RGB components (0.299, 0.587, and 0.114 at gamma 2.2) but
+ the difference is imperceptible for this application... */
+ screen_colors[k].red = orig_screen_colors[k].red * ratio;
+ screen_colors[k].green = orig_screen_colors[k].green * ratio;
+ screen_colors[k].blue = orig_screen_colors[k].blue * ratio;
+ }
+ screen_colors += ncolors;
+ orig_screen_colors += ncolors;
+ }
+
+ /* Put the colors into the maps...
+ */
+ screen_colors = current_colors;
+ for (j = 0; j < nscreens; j++)
+ {
+ int ncolors = CellsOfScreen (ScreenOfDisplay (dpy, j));
+ for (k = 0; k < cmaps_per_screen; k++)
+ {
+ Colormap c = fade_cmaps[j * cmaps_per_screen + k];
+ if (c)
+ XStoreColors (dpy, c, screen_colors, ncolors);
+ }
+ screen_colors += ncolors;
+ }
+
+ /* Put the maps on the screens, and then take the windows off the
+ screen. (only need to do this the first time through the loop.)
+ */
+ if (!installed)
+ {
+ for (j = 0; j < ncmaps; j++)
+ if (fade_cmaps[j])
+ XInstallColormap (dpy, fade_cmaps[j]);
+ installed = True;
+
+ if (!out_p)
+ for (j = 0; j < nwindows; j++)
+ {
+ XUnmapWindow (dpy, saver_windows[j]);
+ XClearWindow (dpy, saver_windows[j]);
+ }
+ }
+
+ XSync (dpy, False);
+
+ if (error_handler_hit_p)
+ goto DONE;
+ if (user_active_p (app, dpy, out_p))
+ {
+ status = 1; /* user activity status code */
+ goto DONE;
+ }
+ frames++;
+
+ if (now < prev + max)
+ usleep (1000000 * (prev + max - now));
+ prev = now;
+ }
+
+ if (verbose_p > 1)
+ fprintf (stderr, "%s: %.0f FPS\n", blurb(), frames / (now - start_time));
+ }
+
+ status = 0; /* completed fade with no user activity */
+
+ DONE:
+
+ if (orig_colors) free (orig_colors);
+ if (current_colors) free (current_colors);
+
+ /* If we've been given windows to raise after blackout, raise them before
+ releasing the colormaps.
+ */
+ if (out_p)
+ {
+ for (i = 0; i < nwindows; i++)
+ {
+ XClearWindow (dpy, saver_windows[i]);
+ XMapRaised (dpy, saver_windows[i]);
+ }
+ XSync(dpy, False);
+ }
+
+ /* Now put the target maps back.
+ If we're fading out, use the given cmap (or the default cmap, if none.)
+ If we're fading in, always use the default cmap.
+ */
+ for (i = 0; i < nscreens; i++)
+ {
+ Colormap cmap = window_cmaps[i];
+ if (!cmap || !out_p)
+ cmap = DefaultColormap(dpy, i);
+ XInstallColormap (dpy, cmap);
+ }
+
+ /* The fade (in or out) is complete, so we don't need the black maps on
+ stage any more.
+ */
+ for (i = 0; i < ncmaps; i++)
+ if (fade_cmaps[i])
+ {
+ XUninstallColormap(dpy, fade_cmaps[i]);
+ XFreeColormap(dpy, fade_cmaps[i]);
+ fade_cmaps[i] = 0;
+ }
+ free (window_cmaps);
+ free(fade_cmaps);
+ fade_cmaps = 0;
+
+ if (error_handler_hit_p) status = -1;
+ return status;
+}
+
+
+/****************************************************************************
+
+ SGI gamma fading
+
+ ****************************************************************************/
+
+#ifdef HAVE_SGI_VC_EXTENSION
+
+# include <X11/extensions/XSGIvc.h>
+
+struct screen_sgi_gamma_info {
+ int gamma_map; /* ??? always using 0 */
+ int nred, ngreen, nblue;
+ unsigned short *red1, *green1, *blue1;
+ unsigned short *red2, *green2, *blue2;
+ int gamma_size;
+ int gamma_precision;
+ Bool alpha_p;
+};
+
+
+static void sgi_whack_gamma(Display *dpy, int screen,
+ struct screen_sgi_gamma_info *info, float ratio);
+
+/* Returns:
+ 0: faded normally
+ 1: canceled by user activity
+ -1: unable to fade because the extension isn't supported.
+ */
+static int
+sgi_gamma_fade (XtAppContext app, Display *dpy,
+ Window *saver_windows, int nwindows,
+ double seconds, Bool out_p)
+{
+ int nscreens = ScreenCount(dpy);
+ struct timeval then, now;
+ int i, screen;
+ int status = -1;
+ struct screen_sgi_gamma_info *info = (struct screen_sgi_gamma_info *)
+ calloc(nscreens, sizeof(*info));
+
+ if (verbose_p > 1)
+ fprintf (stderr, "%s: sgi fade %s\n",
+ blurb(), (out_p ? "out" : "in"));
+
+ /* Get the current gamma maps for all screens.
+ Bug out and return -1 if we can't get them for some screen.
+ */
+ for (screen = 0; screen < nscreens; screen++)
+ {
+ if (!XSGIvcQueryGammaMap(dpy, screen, info[screen].gamma_map,
+ &info[screen].gamma_size,
+ &info[screen].gamma_precision,
+ &info[screen].alpha_p))
+ goto FAIL;
+
+ if (!XSGIvcQueryGammaColors(dpy, screen, info[screen].gamma_map,
+ XSGIVC_COMPONENT_RED,
+ &info[screen].nred, &info[screen].red1))
+ goto FAIL;
+ if (! XSGIvcQueryGammaColors(dpy, screen, info[screen].gamma_map,
+ XSGIVC_COMPONENT_GREEN,
+ &info[screen].ngreen, &info[screen].green1))
+ goto FAIL;
+ if (!XSGIvcQueryGammaColors(dpy, screen, info[screen].gamma_map,
+ XSGIVC_COMPONENT_BLUE,
+ &info[screen].nblue, &info[screen].blue1))
+ goto FAIL;
+
+ if (info[screen].gamma_precision == 8) /* Scale it up to 16 bits. */
+ {
+ int j;
+ for(j = 0; j < info[screen].nred; j++)
+ info[screen].red1[j] =
+ ((info[screen].red1[j] << 8) | info[screen].red1[j]);
+ for(j = 0; j < info[screen].ngreen; j++)
+ info[screen].green1[j] =
+ ((info[screen].green1[j] << 8) | info[screen].green1[j]);
+ for(j = 0; j < info[screen].nblue; j++)
+ info[screen].blue1[j] =
+ ((info[screen].blue1[j] << 8) | info[screen].blue1[j]);
+ }
+
+ info[screen].red2 = (unsigned short *)
+ malloc(sizeof(*info[screen].red2) * (info[screen].nred+1));
+ info[screen].green2 = (unsigned short *)
+ malloc(sizeof(*info[screen].green2) * (info[screen].ngreen+1));
+ info[screen].blue2 = (unsigned short *)
+ malloc(sizeof(*info[screen].blue2) * (info[screen].nblue+1));
+ }
+
+#ifdef GETTIMEOFDAY_TWO_ARGS
+ gettimeofday(&then, &tzp);
+#else
+ gettimeofday(&then);
+#endif
+
+ /* If we're fading in (from black), then first crank the gamma all the
+ way down to 0, then take the windows off the screen.
+ */
+ if (!out_p)
+ {
+ for (screen = 0; screen < nscreens; screen++)
+ sgi_whack_gamma(dpy, screen, &info[screen], 0.0);
+
+ for (screen = 0; screen < nwindows; screen++)
+ {
+ XUnmapWindow (dpy, saver_windows[screen]);
+ XClearWindow (dpy, saver_windows[screen]);
+ XSync(dpy, False);
+ }
+ }
+
+ /* Run the animation at the maximum frame rate in the time allotted. */
+ {
+ double start_time = double_time();
+ double end_time = start_time + seconds;
+ double prev = 0;
+ double now;
+ int frames = 0;
+ double max = 1/60.0; /* max FPS */
+ while ((now = double_time()) < end_time)
+ {
+ double ratio = (end_time - now) / seconds;
+ if (!out_p) ratio = 1-ratio;
+
+ for (screen = 0; screen < nwindows; screen++)
+ sgi_whack_gamma (dpy, screen, &info[screen], ratio);
+
+ if (error_handler_hit_p)
+ goto FAIL;
+ if (user_active_p (app, dpy, out_p))
+ {
+ status = 1; /* user activity status code */
+ goto DONE;
+ }
+ frames++;
+
+ if (now < prev + max)
+ usleep (1000000 * (prev + max - now));
+ prev = now;
+ }
+
+ if (verbose_p > 1)
+ fprintf (stderr, "%s: %.0f FPS\n", blurb(), frames / (now - start_time));
+ }
+
+ status = 0; /* completed fade with no user activity */
+
+ DONE:
+
+ if (out_p)
+ {
+ for (screen = 0; screen < nwindows; screen++)
+ {
+ XClearWindow (dpy, saver_windows[screen]);
+ XMapRaised (dpy, saver_windows[screen]);
+ }
+ XSync(dpy, False);
+ }
+
+ /* I can't explain this; without this delay, we get a flicker.
+ I suppose there's some lossage with stale bits being in the
+ hardware frame buffer or something, and this delay gives it
+ time to flush out. This sucks! */
+ usleep(100000); /* 1/10th second */
+
+ for (screen = 0; screen < nscreens; screen++)
+ sgi_whack_gamma(dpy, screen, &info[screen], 1.0);
+ XSync(dpy, False);
+
+ FAIL:
+ for (screen = 0; screen < nscreens; screen++)
+ {
+ if (info[screen].red1) free (info[screen].red1);
+ if (info[screen].green1) free (info[screen].green1);
+ if (info[screen].blue1) free (info[screen].blue1);
+ if (info[screen].red2) free (info[screen].red2);
+ if (info[screen].green2) free (info[screen].green2);
+ if (info[screen].blue2) free (info[screen].blue2);
+ }
+ free(info);
+
+ if (verbose_p > 1 && status)
+ fprintf (stderr, "%s: SGI fade %s failed\n",
+ blurb(), (out_p ? "out" : "in"));
+
+ if (error_handler_hit_p) status = -1;
+ return status;
+}
+
+static void
+sgi_whack_gamma (Display *dpy, int screen, struct screen_sgi_gamma_info *info,
+ float ratio)
+{
+ int k;
+
+ if (ratio < 0) ratio = 0;
+ if (ratio > 1) ratio = 1;
+ for (k = 0; k < info->gamma_size; k++)
+ {
+ info->red2[k] = info->red1[k] * ratio;
+ info->green2[k] = info->green1[k] * ratio;
+ info->blue2[k] = info->blue1[k] * ratio;
+ }
+
+ XSGIvcStoreGammaColors16(dpy, screen, info->gamma_map, info->nred,
+ XSGIVC_MComponentRed, info->red2);
+ XSGIvcStoreGammaColors16(dpy, screen, info->gamma_map, info->ngreen,
+ XSGIVC_MComponentGreen, info->green2);
+ XSGIvcStoreGammaColors16(dpy, screen, info->gamma_map, info->nblue,
+ XSGIVC_MComponentBlue, info->blue2);
+ XSync(dpy, False);
+}
+
+#endif /* HAVE_SGI_VC_EXTENSION */
+
+
+/****************************************************************************
+
+ XFree86 gamma fading
+
+ ****************************************************************************/
+
+#ifdef HAVE_XF86VMODE_GAMMA
+
+#include <X11/extensions/xf86vmode.h>
+
+typedef struct {
+ XF86VidModeGamma vmg;
+ int size;
+ unsigned short *r, *g, *b;
+} xf86_gamma_info;
+
+static int xf86_check_gamma_extension (Display *dpy);
+static Bool xf86_whack_gamma (Display *dpy, int screen,
+ xf86_gamma_info *ginfo, float ratio);
+
+/* Returns:
+ 0: faded normally
+ 1: canceled by user activity
+ -1: unable to fade because the extension isn't supported.
+ */
+static int
+xf86_gamma_fade (XtAppContext app, Display *dpy,
+ Window *saver_windows, int nwindows,
+ double seconds, Bool out_p)
+{
+ int nscreens = ScreenCount(dpy);
+ int screen;
+ int status = -1;
+ xf86_gamma_info *info = 0;
+
+ static int ext_ok = -1;
+
+ if (verbose_p > 1)
+ fprintf (stderr, "%s: xf86 fade %s\n",
+ blurb(), (out_p ? "out" : "in"));
+
+ /* Only probe the extension once: the answer isn't going to change. */
+ if (ext_ok == -1)
+ ext_ok = xf86_check_gamma_extension (dpy);
+
+ /* If this server doesn't have the gamma extension, bug out. */
+ if (ext_ok == 0)
+ goto FAIL;
+
+# ifndef HAVE_XF86VMODE_GAMMA_RAMP
+ if (ext_ok == 2) ext_ok = 1; /* server is newer than client! */
+# endif
+
+ info = (xf86_gamma_info *) calloc(nscreens, sizeof(*info));
+
+ /* Get the current gamma maps for all screens.
+ Bug out and return -1 if we can't get them for some screen.
+ */
+ for (screen = 0; screen < nscreens; screen++)
+ {
+ if (ext_ok == 1) /* only have gamma parameter, not ramps. */
+ {
+ if (!XF86VidModeGetGamma(dpy, screen, &info[screen].vmg))
+ goto FAIL;
+ }
+# ifdef HAVE_XF86VMODE_GAMMA_RAMP
+ else if (ext_ok == 2) /* have ramps */
+ {
+ if (!XF86VidModeGetGammaRampSize(dpy, screen, &info[screen].size))
+ goto FAIL;
+ if (info[screen].size <= 0)
+ goto FAIL;
+
+ info[screen].r = (unsigned short *)
+ calloc(info[screen].size, sizeof(unsigned short));
+ info[screen].g = (unsigned short *)
+ calloc(info[screen].size, sizeof(unsigned short));
+ info[screen].b = (unsigned short *)
+ calloc(info[screen].size, sizeof(unsigned short));
+
+ if (!(info[screen].r && info[screen].g && info[screen].b))
+ goto FAIL;
+
+# if 0
+ if (verbose_p > 1 && out_p)
+ {
+ int i;
+ fprintf (stderr, "%s: initial gamma ramps, size %d:\n",
+ blurb(), info[screen].size);
+ fprintf (stderr, "%s: R:", blurb());
+ for (i = 0; i < info[screen].size; i++)
+ fprintf (stderr, " %d", info[screen].r[i]);
+ fprintf (stderr, "\n%s: G:", blurb());
+ for (i = 0; i < info[screen].size; i++)
+ fprintf (stderr, " %d", info[screen].g[i]);
+ fprintf (stderr, "\n%s: B:", blurb());
+ for (i = 0; i < info[screen].size; i++)
+ fprintf (stderr, " %d", info[screen].b[i]);
+ fprintf (stderr, "\n");
+ }
+# endif /* 0 */
+
+ if (!XF86VidModeGetGammaRamp(dpy, screen, info[screen].size,
+ info[screen].r,
+ info[screen].g,
+ info[screen].b))
+ goto FAIL;
+ }
+# endif /* HAVE_XF86VMODE_GAMMA_RAMP */
+ else
+ abort();
+ }
+
+ /* If we're fading in (from black), then first crank the gamma all the
+ way down to 0, then take the windows off the screen.
+ */
+ if (!out_p)
+ {
+ for (screen = 0; screen < nscreens; screen++)
+ xf86_whack_gamma(dpy, screen, &info[screen], 0.0);
+ for (screen = 0; screen < nwindows; screen++)
+ {
+ XUnmapWindow (dpy, saver_windows[screen]);
+ XClearWindow (dpy, saver_windows[screen]);
+ XSync(dpy, False);
+ }
+ }
+
+ /* Run the animation at the maximum frame rate in the time allotted. */
+ {
+ double start_time = double_time();
+ double end_time = start_time + seconds;
+ double prev = 0;
+ double now;
+ int frames = 0;
+ double max = 1/60.0; /* max FPS */
+ while ((now = double_time()) < end_time)
+ {
+ double ratio = (end_time - now) / seconds;
+ if (!out_p) ratio = 1-ratio;
+
+ for (screen = 0; screen < nscreens; screen++)
+ xf86_whack_gamma (dpy, screen, &info[screen], ratio);
+
+ if (error_handler_hit_p)
+ goto FAIL;
+ if (user_active_p (app, dpy, out_p))
+ {
+ status = 1; /* user activity status code */
+ goto DONE;
+ }
+ frames++;
+
+ if (now < prev + max)
+ usleep (1000000 * (prev + max - now));
+ prev = now;
+ }
+
+ if (verbose_p > 1)
+ fprintf (stderr, "%s: %.0f FPS\n", blurb(), frames / (now - start_time));
+ }
+
+ status = 0; /* completed fade with no user activity */
+
+ DONE:
+
+ if (out_p)
+ {
+ for (screen = 0; screen < nwindows; screen++)
+ {
+ XClearWindow (dpy, saver_windows[screen]);
+ XMapRaised (dpy, saver_windows[screen]);
+ }
+ XSync(dpy, False);
+ }
+
+ /* I can't explain this; without this delay, we get a flicker.
+ I suppose there's some lossage with stale bits being in the
+ hardware frame buffer or something, and this delay gives it
+ time to flush out. This sucks! */
+ usleep(100000); /* 1/10th second */
+
+ for (screen = 0; screen < nscreens; screen++)
+ xf86_whack_gamma(dpy, screen, &info[screen], 1.0);
+ XSync(dpy, False);
+
+ FAIL:
+ if (info)
+ {
+ for (screen = 0; screen < nscreens; screen++)
+ {
+ if (info[screen].r) free(info[screen].r);
+ if (info[screen].g) free(info[screen].g);
+ if (info[screen].b) free(info[screen].b);
+ }
+ free(info);
+ }
+
+ if (verbose_p > 1 && status)
+ fprintf (stderr, "%s: xf86 fade %s failed\n",
+ blurb(), (out_p ? "out" : "in"));
+
+ if (error_handler_hit_p) status = -1;
+ return status;
+}
+
+
+static Bool
+safe_XF86VidModeQueryVersion (Display *dpy, int *majP, int *minP)
+{
+ Bool result;
+ XErrorHandler old_handler;
+ XSync (dpy, False);
+ error_handler_hit_p = False;
+ old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+
+ result = XF86VidModeQueryVersion (dpy, majP, minP);
+
+ XSync (dpy, False);
+ XSetErrorHandler (old_handler);
+ XSync (dpy, False);
+
+ return (error_handler_hit_p
+ ? False
+ : result);
+}
+
+
+
+/* VidModeExtension version 2.0 or better is needed to do gamma.
+ 2.0 added gamma values; 2.1 added gamma ramps.
+ */
+# define XF86_VIDMODE_GAMMA_MIN_MAJOR 2
+# define XF86_VIDMODE_GAMMA_MIN_MINOR 0
+# define XF86_VIDMODE_GAMMA_RAMP_MIN_MAJOR 2
+# define XF86_VIDMODE_GAMMA_RAMP_MIN_MINOR 1
+
+
+
+/* Returns 0 if gamma fading not available; 1 if only gamma value setting
+ is available; 2 if gamma ramps are available.
+ */
+static int
+xf86_check_gamma_extension (Display *dpy)
+{
+ int event, error, major, minor;
+
+ if (!XF86VidModeQueryExtension (dpy, &event, &error))
+ return 0; /* display doesn't have the extension. */
+
+ if (!safe_XF86VidModeQueryVersion (dpy, &major, &minor))
+ return 0; /* unable to get version number? */
+
+ if (major < XF86_VIDMODE_GAMMA_MIN_MAJOR ||
+ (major == XF86_VIDMODE_GAMMA_MIN_MAJOR &&
+ minor < XF86_VIDMODE_GAMMA_MIN_MINOR))
+ return 0; /* extension is too old for gamma. */
+
+ if (major < XF86_VIDMODE_GAMMA_RAMP_MIN_MAJOR ||
+ (major == XF86_VIDMODE_GAMMA_RAMP_MIN_MAJOR &&
+ minor < XF86_VIDMODE_GAMMA_RAMP_MIN_MINOR))
+ return 1; /* extension is too old for gamma ramps. */
+
+ /* Copacetic */
+ return 2;
+}
+
+
+/* XFree doesn't let you set gamma to a value smaller than this.
+ Apparently they didn't anticipate the trick I'm doing here...
+ */
+#define XF86_MIN_GAMMA 0.1
+
+
+static Bool
+xf86_whack_gamma(Display *dpy, int screen, xf86_gamma_info *info,
+ float ratio)
+{
+ XErrorHandler old_handler;
+ XSync (dpy, False);
+ error_handler_hit_p = False;
+ old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+
+ if (ratio < 0) ratio = 0;
+ if (ratio > 1) ratio = 1;
+
+ if (info->size == 0) /* we only have a gamma number, not a ramp. */
+ {
+ XF86VidModeGamma g2;
+
+ g2.red = info->vmg.red * ratio;
+ g2.green = info->vmg.green * ratio;
+ g2.blue = info->vmg.blue * ratio;
+
+# ifdef XF86_MIN_GAMMA
+ if (g2.red < XF86_MIN_GAMMA) g2.red = XF86_MIN_GAMMA;
+ if (g2.green < XF86_MIN_GAMMA) g2.green = XF86_MIN_GAMMA;
+ if (g2.blue < XF86_MIN_GAMMA) g2.blue = XF86_MIN_GAMMA;
+# endif
+
+ if (! XF86VidModeSetGamma (dpy, screen, &g2))
+ return -1;
+ }
+ else
+ {
+# ifdef HAVE_XF86VMODE_GAMMA_RAMP
+
+ unsigned short *r, *g, *b;
+ int i;
+ r = (unsigned short *) malloc(info->size * sizeof(unsigned short));
+ g = (unsigned short *) malloc(info->size * sizeof(unsigned short));
+ b = (unsigned short *) malloc(info->size * sizeof(unsigned short));
+
+ for (i = 0; i < info->size; i++)
+ {
+ r[i] = info->r[i] * ratio;
+ g[i] = info->g[i] * ratio;
+ b[i] = info->b[i] * ratio;
+ }
+
+ if (! XF86VidModeSetGammaRamp(dpy, screen, info->size, r, g, b))
+ return -1;
+
+ free (r);
+ free (g);
+ free (b);
+
+# else /* !HAVE_XF86VMODE_GAMMA_RAMP */
+ abort();
+# endif /* !HAVE_XF86VMODE_GAMMA_RAMP */
+ }
+
+ XSync (dpy, False);
+ XSetErrorHandler (old_handler);
+ XSync (dpy, False);
+
+ return status;
+}
+
+#endif /* HAVE_XF86VMODE_GAMMA */
+
+
+/****************************************************************************
+
+ RANDR gamma fading
+
+ ****************************************************************************
+
+
+ Dec 2020: I noticed that gamma fading was not working on a Raspberry Pi
+ with Raspbian 10.6, and wrote this under the hypothesis that the XF86
+ gamma fade code was failing and maybe the RANDR version would work better.
+ Then I discovered that gamma simply isn't supported by the Raspberry Pi
+ HDMI driver:
+
+ https://github.com/raspberrypi/firmware/issues/1274
+
+ I should have tried this first and seen it not work:
+
+ xrandr --output HDMI-1 --brightness .1
+
+ Since I still don't have an answer to the question of whether the XF86
+ gamma fading method works on modern Linux systems that also have RANDR,
+ I'm leaving this new code turned off for now, as it is largely untested.
+ The new code would be useful if:
+
+ A) The XF86 way doesn't work but the RANDR way does, or
+ B) There exist systems that have RANDR but do not have XF86.
+
+ But until Raspberry Pi supports gamma, both gamma methods fail to work
+ for far too many users for them to be used in XScreenSaver.
+ */
+#ifdef HAVE_RANDR_12
+
+# include <X11/extensions/Xrandr.h>
+
+typedef struct {
+ RRCrtc crtc;
+ Bool enabled_p;
+ XRRCrtcGamma *gamma;
+} randr_gamma_info;
+
+
+static int
+randr_check_gamma_extension (Display *dpy)
+{
+ int event, error, major, minor;
+ if (! XRRQueryExtension (dpy, &event, &error))
+ return 0;
+
+ if (! XRRQueryVersion (dpy, &major, &minor)) {
+ if (verbose_p > 1) fprintf (stderr, "%s: no randr ext\n", blurb());
+ return 0;
+ }
+
+ /* Reject if < 1.5. It's possible that 1.2 - 1.4 work, but untested. */
+ if (major < 1 || (major == 1 && minor < 5)) {
+ if (verbose_p > 1) fprintf (stderr, "%s: randr ext only version %d.%d\n",
+ blurb(), major, minor);
+ return 0;
+ }
+
+ return 1;
+}
+
+
+static void randr_whack_gamma (Display *dpy, int screen,
+ randr_gamma_info *ginfo, float ratio);
+
+/* Returns:
+ 0: faded normally
+ 1: canceled by user activity
+ -1: unable to fade because the extension isn't supported.
+ */
+static int
+randr_gamma_fade (XtAppContext app, Display *dpy,
+ Window *saver_windows, int nwindows,
+ double seconds, Bool out_p)
+{
+ int xsc = ScreenCount (dpy);
+ int nscreens = 0;
+ int j, screen;
+ int status = -1;
+ randr_gamma_info *info = 0;
+
+ static int ext_ok = -1;
+
+ if (verbose_p > 1)
+ fprintf (stderr, "%s: randr fade %s\n",
+ blurb(), (out_p ? "out" : "in"));
+
+ /* Only probe the extension once: the answer isn't going to change. */
+ if (ext_ok == -1)
+ ext_ok = randr_check_gamma_extension (dpy);
+
+ /* If this server doesn't have the RANDR extension, bug out. */
+ if (ext_ok == 0)
+ goto FAIL;
+
+ /* Add up the virtual screens on each X screen. */
+ for (screen = 0; screen < xsc; screen++)
+ {
+ XRRScreenResources *res =
+ XRRGetScreenResources (dpy, RootWindow (dpy, screen));
+ nscreens += res->noutput;
+ XRRFreeScreenResources (res);
+ }
+
+ if (nscreens <= 0)
+ goto FAIL;
+
+ info = (randr_gamma_info *) calloc(nscreens, sizeof(*info));
+
+ /* Get the current gamma maps for all screens.
+ Bug out and return -1 if we can't get them for some screen.
+ */
+ for (screen = 0, j = 0; screen < xsc; screen++)
+ {
+ XRRScreenResources *res =
+ XRRGetScreenResources (dpy, RootWindow (dpy, screen));
+ int k;
+ for (k = 0; k < res->noutput; k++, j++)
+ {
+ XRROutputInfo *rroi = XRRGetOutputInfo (dpy, res, res->outputs[j]);
+ RRCrtc crtc = (rroi->crtc ? rroi->crtc :
+ rroi->ncrtc ? rroi->crtcs[0] : 0);
+
+ info[j].crtc = crtc;
+ info[j].gamma = XRRGetCrtcGamma (dpy, crtc);
+
+ /* #### is this test sufficient? */
+ info[j].enabled_p = (rroi->connection != RR_Disconnected);
+
+# if 0
+ if (verbose_p > 1 && out_p)
+ {
+ int m;
+ fprintf (stderr, "%s: initial gamma ramps, size %d:\n",
+ blurb(), info[j].gamma->size);
+ fprintf (stderr, "%s: R:", blurb());
+ for (m = 0; m < info[j].gamma->size; m++)
+ fprintf (stderr, " %d", info[j].gamma->red[m]);
+ fprintf (stderr, "\n%s: G:", blurb());
+ for (m = 0; m < info[j].gamma->size; m++)
+ fprintf (stderr, " %d", info[j].gamma->green[m]);
+ fprintf (stderr, "\n%s: B:", blurb());
+ for (m = 0; m < info[j].gamma->size; m++)
+ fprintf (stderr, " %d", info[j].gamma->blue[m]);
+ fprintf (stderr, "\n");
+ }
+# endif /* 0 */
+
+ XRRFreeOutputInfo (rroi);
+ }
+ XRRFreeScreenResources (res);
+ }
+
+ /* If we're fading in (from black), then first crank the gamma all the
+ way down to 0, then take the windows off the screen.
+ */
+ if (!out_p)
+ {
+ for (screen = 0; screen < nscreens; screen++)
+ randr_whack_gamma(dpy, screen, &info[screen], 0.0);
+ for (screen = 0; screen < nwindows; screen++)
+ {
+ XUnmapWindow (dpy, saver_windows[screen]);
+ XClearWindow (dpy, saver_windows[screen]);
+ XSync(dpy, False);
+ }
+ }
+
+ /* Run the animation at the maximum frame rate in the time allotted. */
+ {
+ double start_time = double_time();
+ double end_time = start_time + seconds;
+ double prev = 0;
+ double now;
+ int frames = 0;
+ double max = 1/60.0; /* max FPS */
+ while ((now = double_time()) < end_time)
+ {
+ double ratio = (end_time - now) / seconds;
+ if (!out_p) ratio = 1-ratio;
+
+ for (screen = 0; screen < nwindows; screen++)
+ {
+ if (!info[screen].enabled_p)
+ continue;
+
+ randr_whack_gamma (dpy, screen, &info[screen], ratio);
+ }
+
+ if (error_handler_hit_p)
+ goto FAIL;
+ if (user_active_p (app, dpy, out_p))
+ {
+ status = 1; /* user activity status code */
+ goto DONE;
+ }
+ frames++;
+
+ if (now < prev + max)
+ usleep (1000000 * (prev + max - now));
+ prev = now;
+ }
+
+ if (verbose_p > 1)
+ fprintf (stderr, "%s: %.0f FPS\n", blurb(), frames / (now - start_time));
+ }
+
+ status = 0; /* completed fade with no user activity */
+
+ DONE:
+
+ if (out_p)
+ {
+ for (screen = 0; screen < nwindows; screen++)
+ {
+ XClearWindow (dpy, saver_windows[screen]);
+ XMapRaised (dpy, saver_windows[screen]);
+ }
+ XSync(dpy, False);
+ }
+
+ /* I can't explain this; without this delay, we get a flicker.
+ I suppose there's some lossage with stale bits being in the
+ hardware frame buffer or something, and this delay gives it
+ time to flush out. This sucks! */
+ /* #### That comment was about XF86, not verified with randr. */
+ usleep(100000); /* 1/10th second */
+
+ for (screen = 0; screen < nscreens; screen++)
+ randr_whack_gamma (dpy, screen, &info[screen], 1.0);
+ XSync(dpy, False);
+
+ FAIL:
+ if (info)
+ {
+ for (screen = 0; screen < nscreens; screen++)
+ {
+ if (info[screen].gamma) XRRFreeGamma (info[screen].gamma);
+ }
+ free(info);
+ }
+
+ if (verbose_p > 1 && status)
+ fprintf (stderr, "%s: randr fade %s failed\n",
+ blurb(), (out_p ? "out" : "in"));
+
+ return status;
+}
+
+
+static void
+randr_whack_gamma (Display *dpy, int screen, randr_gamma_info *info,
+ float ratio)
+{
+ XErrorHandler old_handler;
+ XRRCrtcGamma *g2;
+ int i;
+
+ XSync (dpy, False);
+ error_handler_hit_p = False;
+ old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+
+ if (ratio < 0) ratio = 0;
+ if (ratio > 1) ratio = 1;
+
+ g2 = XRRAllocGamma (info->gamma->size);
+ for (i = 0; i < info->gamma->size; i++)
+ {
+ g2->red[i] = ratio * info->gamma->red[i];
+ g2->green[i] = ratio * info->gamma->green[i];
+ g2->blue[i] = ratio * info->gamma->blue[i];
+ }
+
+ XRRSetCrtcGamma (dpy, info->crtc, g2);
+ XRRFreeGamma (g2);
+
+ XSync (dpy, False);
+ XSetErrorHandler (old_handler);
+ XSync (dpy, False);
+
+ return 0;
+}
+
+#endif /* HAVE_RANDR_12 */
+
+
+/****************************************************************************
+
+ XSHM screen-shot fading
+
+ ****************************************************************************/
+
+typedef struct {
+ GC gc;
+ Window window;
+ Pixmap screenshot;
+ XImage *src, *intermediate;
+} xshm_fade_info;
+
+
+static int xshm_whack (Display *, XShmSegmentInfo *,
+ xshm_fade_info *, float ratio);
+
+/* Returns:
+ 0: faded normally
+ 1: canceled by user activity
+ -1: unknown error
+ */
+static int
+xshm_fade (XtAppContext app, Display *dpy,
+ Window *saver_windows, int nwindows, double seconds,
+ Bool out_p, Bool from_desktop_p, fade_state *state)
+{
+ int screen;
+ int status = -1;
+ xshm_fade_info *info = 0;
+ XShmSegmentInfo shm_info;
+ Window saver_window = 0;
+ XErrorHandler old_handler = 0;
+
+ XSync (dpy, False);
+ old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+ error_handler_hit_p = False;
+
+ if (verbose_p > 1)
+ fprintf (stderr, "%s: SHM fade %s\n",
+ blurb(), (out_p ? "out" : "in"));
+
+ info = (xshm_fade_info *) calloc(nwindows, sizeof(*info));
+ if (!info) goto FAIL;
+
+ saver_window = find_screensaver_window (dpy, 0);
+ if (!saver_window) goto FAIL;
+
+ /* Retrieve a screenshot of the area covered by each window.
+ Windows might not be mapped.
+ Bug out and return -1 if we can't get one for some screen.
+ */
+
+ for (screen = 0; screen < nwindows; screen++)
+ {
+ XWindowAttributes xgwa;
+ Window root;
+ XGCValues gcv;
+ GC gc;
+ unsigned long attrmask = 0;
+ XSetWindowAttributes attrs;
+
+ XGetWindowAttributes (dpy, saver_windows[screen], &xgwa);
+ root = RootWindowOfScreen (xgwa.screen);
+
+ info[screen].src =
+ create_xshm_image (dpy, xgwa.visual, xgwa.depth,
+ ZPixmap, &shm_info, xgwa.width, xgwa.height);
+ if (!info[screen].src) goto FAIL;
+
+ info[screen].intermediate =
+ create_xshm_image (dpy, xgwa.visual, xgwa.depth,
+ ZPixmap, &shm_info, xgwa.width, xgwa.height);
+ if (!info[screen].intermediate) goto FAIL;
+
+ if (!out_p)
+ {
+ /* If we are fading in, retrieve the saved screenshot from
+ before we faded out. */
+ if (state->nscreens <= screen) goto FAIL;
+ info[screen].screenshot = state->screenshots[screen];
+ }
+ else
+ {
+ /* Create a pixmap and grab a screenshot into it. */
+ info[screen].screenshot =
+ XCreatePixmap (dpy, root, xgwa.width, xgwa.height, xgwa.depth);
+ if (!info[screen].screenshot) goto FAIL;
+
+ gcv.function = GXcopy;
+ gcv.subwindow_mode = IncludeInferiors;
+ gc = XCreateGC (dpy, root, GCFunction | GCSubwindowMode, &gcv);
+ XCopyArea (dpy, root, info[screen].screenshot, gc,
+ xgwa.x, xgwa.y, xgwa.width, xgwa.height, 0, 0);
+ XFreeGC (dpy, gc);
+ }
+
+ /* Create the fader window for the animation. */
+ attrmask = CWOverrideRedirect;
+ attrs.override_redirect = True;
+ info[screen].window =
+ XCreateWindow (dpy, root, xgwa.x, xgwa.y,
+ xgwa.width, xgwa.height, xgwa.border_width, xgwa.depth,
+ InputOutput, xgwa.visual,
+ attrmask, &attrs);
+ if (!info[screen].window) goto FAIL;
+ /* XSelectInput (dpy, info[screen].window,
+ KeyPressMask | ButtonPressMask); */
+
+ /* Copy the screenshot pixmap to the source image */
+ if (! get_xshm_image (dpy, info[screen].screenshot, info[screen].src,
+ 0, 0, ~0L, &shm_info))
+ goto FAIL;
+
+ gcv.function = GXcopy;
+ info[screen].gc = XCreateGC (dpy, info[screen].window, GCFunction, &gcv);
+ }
+
+ /* If we're fading out from the desktop, save our screen shots for later use.
+ But not if we're fading out from the savers to black. In that case we
+ don't want to overwrite the desktop screenshot with the current screenshot
+ which is of the final frames of the just-killed graphics hacks. */
+ if (from_desktop_p)
+ {
+ if (!out_p) abort();
+ for (screen = 0; screen < state->nscreens; screen++)
+ if (state->screenshots[screen])
+ XFreePixmap (dpy, state->screenshots[screen]);
+ if (state->screenshots)
+ free (state->screenshots);
+ state->nscreens = nwindows;
+ state->screenshots = calloc (nwindows, sizeof(*state->screenshots));
+ if (!state->screenshots)
+ state->nscreens = 0;
+ for (screen = 0; screen < state->nscreens; screen++)
+ state->screenshots[screen] = info[screen].screenshot;
+ }
+
+ for (screen = 0; screen < nwindows; screen++)
+ {
+ if (out_p)
+ /* Copy the screenshot to the fader window */
+ XSetWindowBackgroundPixmap (dpy, info[screen].window,
+ info[screen].screenshot);
+ else
+ {
+ XSetWindowBackgroundPixmap (dpy, info[screen].window, None);
+ XSetWindowBackground (dpy, info[screen].window, BlackPixel (dpy, 0));
+ }
+
+ XMapRaised (dpy, info[screen].window);
+
+ /* Now that we have mapped the screenshot on the fader windows,
+ take the saver windows off the screen. */
+ if (out_p)
+ {
+ XUnmapWindow (dpy, saver_windows[screen]);
+ XClearWindow (dpy, saver_windows[screen]);
+ }
+ }
+
+ /* Run the animation at the maximum frame rate in the time allotted. */
+ {
+ double start_time = double_time();
+ double end_time = start_time + seconds;
+ double prev = 0;
+ double now;
+ int frames = 0;
+ double max = 1/60.0; /* max FPS */
+ while ((now = double_time()) < end_time)
+ {
+ double ratio = (end_time - now) / seconds;
+ if (!out_p) ratio = 1-ratio;
+
+ for (screen = 0; screen < nwindows; screen++)
+ if (xshm_whack (dpy, &shm_info, &info[screen], ratio))
+ goto FAIL;
+
+ if (error_handler_hit_p)
+ goto FAIL;
+ if (user_active_p (app, dpy, out_p))
+ {
+ status = 1; /* user activity status code */
+ goto DONE;
+ }
+ frames++;
+
+ if (now < prev + max)
+ usleep (1000000 * (prev + max - now));
+ prev = now;
+ }
+
+ if (verbose_p > 1)
+ fprintf (stderr, "%s: %.0f FPS\n", blurb(), frames / (now - start_time));
+ }
+
+ status = 0; /* completed fade with no user activity */
+
+ DONE:
+
+ /* If we're fading out, we have completed the transition from what was
+ on the screen to black, using our fader windows. Now raise the saver
+ windows and take the fader windows off the screen. Since they're both
+ black, that will be imperceptible.
+ */
+ if (out_p)
+ {
+ for (screen = 0; screen < nwindows; screen++)
+ {
+ XClearWindow (dpy, saver_windows[screen]);
+ XMapRaised (dpy, saver_windows[screen]);
+ if (info[screen].window)
+ XUnmapWindow (dpy, info[screen].window);
+ }
+ }
+
+ XSync (dpy, False);
+
+ FAIL:
+
+ /* After fading in, take the saver windows off the screen before
+ destroying the occluding screenshot windows. */
+ if (!out_p)
+ {
+ for (screen = 0; screen < nwindows; screen++)
+ {
+ XUnmapWindow (dpy, saver_windows[screen]);
+ XClearWindow (dpy, saver_windows[screen]);
+ }
+ }
+
+ if (info)
+ {
+ for (screen = 0; screen < nwindows; screen++)
+ {
+ if (info[screen].src)
+ destroy_xshm_image (dpy, info[screen].src, &shm_info);
+ if (info[screen].intermediate)
+ destroy_xshm_image (dpy, info[screen].intermediate, &shm_info);
+ if (info[screen].window)
+ XDestroyWindow (dpy, info[screen].window);
+ if (info[screen].gc)
+ XFreeGC (dpy, info[screen].gc);
+ }
+ free (info);
+ }
+
+ /* If fading in, delete the screenshot pixmaps, and the list of them. */
+ if (!out_p && saver_window)
+ {
+ for (screen = 0; screen < state->nscreens; screen++)
+ if (state->screenshots[screen])
+ XFreePixmap (dpy, state->screenshots[screen]);
+ if (state->screenshots)
+ free (state->screenshots);
+ state->nscreens = 0;
+ state->screenshots = 0;
+ }
+
+ XSync (dpy, False);
+ XSetErrorHandler (old_handler);
+
+ if (error_handler_hit_p) status = -1;
+ if (verbose_p > 1 && status)
+ fprintf (stderr, "%s: SHM fade %s failed\n",
+ blurb(), (out_p ? "out" : "in"));
+
+ return status;
+}
+
+
+static int
+xshm_whack (Display *dpy, XShmSegmentInfo *shm_info,
+ xshm_fade_info *info, float ratio)
+{
+ unsigned char *inbits = (unsigned char *) info->src->data;
+ unsigned char *outbits = (unsigned char *) info->intermediate->data;
+ unsigned char *end = (outbits +
+ info->intermediate->bytes_per_line *
+ info->intermediate->height);
+ unsigned char ramp[256];
+ int i;
+
+ XSync (dpy, False);
+
+ if (ratio < 0) ratio = 0;
+ if (ratio > 1) ratio = 1;
+
+ for (i = 0; i < sizeof(ramp); i++)
+ ramp[i] = i * ratio;
+ while (outbits < end)
+ *outbits++ = ramp[*inbits++];
+
+ put_xshm_image (dpy, info->window, info->gc, info->intermediate, 0, 0, 0, 0,
+ info->intermediate->width, info->intermediate->height,
+ shm_info);
+ XSync (dpy, False);
+ return 0;
+}
diff --git a/driver/fade.h b/driver/fade.h
new file mode 100644
index 0000000..56725b5
--- /dev/null
+++ b/driver/fade.h
@@ -0,0 +1,20 @@
+/* xscreensaver, Copyright © 1992-2021 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __FADE_H__
+#define __FADE_H__
+
+/* Returns true if canceled by user activity. */
+extern Bool fade_screens (XtAppContext app, Display *dpy,
+ Window *black_windows, int nwindows,
+ double seconds, Bool out_p, Bool from_desktop_p,
+ void **closureP);
+#endif /* __FADE_H__ */
diff --git a/driver/passwd-helper.c b/driver/passwd-helper.c
index a3a6b92..4b17c63 100644
--- a/driver/passwd-helper.c
+++ b/driver/passwd-helper.c
@@ -1,6 +1,6 @@
/* passwd-helper.c --- verifying typed passwords with external helper program
+ * xscreensaver, Copyright © 1993-2021 Jamie Zawinski <jwz@jwz.org>
* written by Olaf Kirch <okir@suse.de>
- * xscreensaver, Copyright (c) 1993-2005 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -11,6 +11,18 @@
* implied warranty.
*/
+
+/*****************************************************************************
+
+ I strongly suspect that this code has not been used in decades, and I
+ am considering removing it. These details should be hidden behind PAM.
+ If you are using this code, email me and tell me why. -- jwz, Feb 2021
+
+ *****************************************************************************/
+
+#error "email jwz@jwz.org about passwd-helper.c"
+
+
/* The idea here is to be able to run xscreensaver without any setuid bits.
* Password verification happens through an external program that you feed
* your password to on stdin. The external command is invoked with a user
@@ -35,18 +47,6 @@
#ifndef NO_LOCKING /* whole file */
-#include <X11/Xlib.h> /* not used for much... */
-
-/* This file doesn't need the Xt headers, so stub these types out... */
-#undef XtPointer
-#define XtAppContext void*
-#define XrmDatabase void*
-#define XtIntervalId void*
-#define XtPointer void*
-#define Widget void*
-
-#include "xscreensaver.h"
-
#include <stdlib.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
@@ -57,11 +57,14 @@
#include <sys/types.h>
#include <pwd.h>
#include <errno.h>
-
#include <sys/wait.h>
+#include "blurb.h"
+#include "auth.h"
+
+
static int
-ext_run (const char *user, const char *typed_passwd, int verbose_p)
+ext_run (const char *user, const char *typed_passwd)
{
int pfd[2], status;
pid_t pid;
@@ -70,10 +73,7 @@ ext_run (const char *user, const char *typed_passwd, int verbose_p)
return 0;
if (verbose_p)
- fprintf (stderr, "%s: ext_run (%s, %s)\n",
- blurb(), PASSWD_HELPER_PROGRAM, user);
-
- block_sigchld();
+ fprintf (stderr, "%s: EXT: %s\n", blurb(), PASSWD_HELPER_PROGRAM);
if ((pid = fork()) < 0) {
close(pfd[0]);
@@ -89,7 +89,7 @@ ext_run (const char *user, const char *typed_passwd, int verbose_p)
/* Helper is invoked as helper service-name [user] */
execlp(PASSWD_HELPER_PROGRAM, PASSWD_HELPER_PROGRAM, "xscreensaver", user, NULL);
if (verbose_p)
- fprintf(stderr, "%s: %s\n", PASSWD_HELPER_PROGRAM,
+ fprintf(stderr, "%s: EXT: %s\n", PASSWD_HELPER_PROGRAM,
strerror(errno));
exit(1);
}
@@ -106,14 +106,11 @@ ext_run (const char *user, const char *typed_passwd, int verbose_p)
if (errno == EINTR)
continue;
if (verbose_p)
- fprintf(stderr, "%s: ext_run: waitpid failed: %s\n",
+ fprintf(stderr, "%s: EXT: waitpid failed: %s\n",
blurb(), strerror(errno));
- unblock_sigchld();
return 0;
}
- unblock_sigchld();
-
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
return 0;
return 1;
@@ -126,37 +123,36 @@ ext_run (const char *user, const char *typed_passwd, int verbose_p)
to root.
*/
int
-ext_passwd_valid_p (const char *typed_passwd, int verbose_p)
+ext_passwd_valid_p (void *closure, const char *typed_passwd)
{
struct passwd *pw;
int res = 0;
if ((pw = getpwuid(getuid())) != NULL)
- res = ext_run (pw->pw_name, typed_passwd, verbose_p);
+ res = ext_run (pw->pw_name, typed_passwd);
endpwent();
#ifdef ALLOW_ROOT_PASSWD
if (!res)
- res = ext_run ("root", typed_passwd, verbose_p);
+ res = ext_run ("root", typed_passwd);
#endif /* ALLOW_ROOT_PASSWD */
return res;
}
-int
-ext_priv_init (int argc, char **argv, int verbose_p)
+Bool
+ext_priv_init (void)
{
/* Make sure the passwd helper exists */
if (access(PASSWD_HELPER_PROGRAM, X_OK) < 0) {
fprintf(stderr,
- "%s: warning: %s does not exist.\n"
- "%s: password authentication via "
- "external helper will not work.\n",
+ "%s: EXT: warning: %s does not exist.\n"
+ "%s: EXT password authentication will not work.\n",
blurb(), PASSWD_HELPER_PROGRAM, blurb());
- return 0;
+ return False;
}
- return 1;
+ return True;
}
#endif /* NO_LOCKING -- whole file */
diff --git a/driver/passwd-kerberos.c b/driver/passwd-kerberos.c
index 202e0eb..7d94ebd 100644
--- a/driver/passwd-kerberos.c
+++ b/driver/passwd-kerberos.c
@@ -1,6 +1,6 @@
/* kpasswd.c --- verify kerberos passwords.
- * written by Nat Lanza (magus@cs.cmu.edu) for
- * xscreensaver, Copyright (c) 1993-2004 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 1993-2021 Jamie Zawinski <jwz@jwz.org>
+ * written by Nat Lanza (magus@cs.cmu.edu)
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -11,6 +11,17 @@
* implied warranty.
*/
+/*****************************************************************************
+
+ I strongly suspect that this code has not been used in decades, and I
+ am considering removing it. These details should be hidden behind PAM.
+ If you are using this code, email me and tell me why. -- jwz, Feb 2021
+
+ *****************************************************************************/
+
+#error "email jwz@jwz.org about passwd-kerberos.c"
+
+
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
@@ -48,9 +59,7 @@
# include <des.h>
#endif /* !HAVE_KERBEROS5 */
-#if !defined(VMS) && !defined(HAVE_ADJUNCT_PASSWD)
-# include <pwd.h>
-#endif
+#include <pwd.h>
#ifdef __bsdi__
@@ -60,13 +69,9 @@
# endif
#endif /* __bsdi__ */
-/* blargh */
-#undef Bool
-#undef True
-#undef False
-#define Bool int
-#define True 1
-#define False 0
+#include "blurb.h"
+#include "auth.h"
+
/* The user information we need to store */
#ifdef HAVE_DARWIN
@@ -78,10 +83,6 @@
static const char *tk_file;
#endif /* !HAVE_DARWIN */
-/* warning suppression: duplicated in passwd.c */
-extern Bool kerberos_lock_init (int argc, char **argv, Bool verbose_p);
-extern Bool kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p);
-
/* Called at startup to grab user, instance, and realm information
from the user's ticketfile (remember, name.inst@realm). Since we're
@@ -102,7 +103,7 @@ extern Bool kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p);
We don't use the arguments we're given, though.
*/
Bool
-kerberos_lock_init (int argc, char **argv, Bool verbose_p)
+kerberos_lock_init (void)
{
# ifdef HAVE_DARWIN
@@ -182,7 +183,7 @@ key_to_key(char *user, char *instance, char *realm, char *passwd, C_Block key)
some sites. So, we do a quick, painful hack with a tmpfile.
*/
Bool
-kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
+kerberos_passwd_valid_p (void *closure, const char *typed_passwd)
{
# ifdef HAVE_DARWIN
return (klNoErr ==
@@ -201,10 +202,10 @@ kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
/* temporarily switch to a new ticketfile.
I'm not using tmpnam() because it isn't entirely portable.
this could probably be fixed with autoconf. */
- newtkfile = malloc(80 * sizeof(char));
- memset(newtkfile, 0, sizeof(newtkfile));
-
- sprintf(newtkfile, "/tmp/xscrn-%i.XXXXXX", getpid());
+ char *tmpdir = getenv("TMPDIR");
+ if (!tmpdir || !*tmpdir) tmpdir = "/tmp";
+ newtkfile = malloc (strlen(tmpdir) + 40);
+ sprintf (newtkfile, "%s/xscreensaver.XXXXXX", tmpdir);
if( (fh = mkstemp(newtkfile)) < 0)
{
diff --git a/driver/passwd-pam.c b/driver/passwd-pam.c
index d463bc2..87942ab 100644
--- a/driver/passwd-pam.c
+++ b/driver/passwd-pam.c
@@ -1,7 +1,6 @@
/* passwd-pam.c --- verifying typed passwords with PAM
- * (Pluggable Authentication Modules.)
- * written by Bill Nottingham <notting@redhat.com> (and jwz) for
- * xscreensaver, Copyright (c) 1993-2017 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 1993-2021 Jamie Zawinski <jwz@jwz.org>
+ * By Bill Nottingham <notting@redhat.com> and jwz.
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -10,26 +9,37 @@
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
- *
- * Some PAM resources:
- *
- * PAM home page:
- * http://www.us.kernel.org/pub/linux/libs/pam/
- *
- * PAM FAQ:
- * http://www.us.kernel.org/pub/linux/libs/pam/FAQ
- *
- * PAM Application Developers' Guide:
- * http://www.us.kernel.org/pub/linux/libs/pam/Linux-PAM-html/Linux-PAM_ADG.html
- *
- * PAM Mailing list archives:
- * http://www.linuxhq.com/lnxlists/linux-pam/
- *
- * Compatibility notes, especially between Linux and Solaris:
- * http://www.contrib.andrew.cmu.edu/u/shadow/pam.html
- *
- * The Open Group's PAM API documentation:
- * http://www.opengroup.org/onlinepubs/8329799/pam_start.htm
+ */
+
+/* PAM sucks in that there is no way to tell whether a particular service is
+ configured at all. That is, there is no way to tell the difference between
+ "authentication of the FOO service is not allowed" and "the user typed the
+ wrong password."
+
+ On RedHat 5.1 systems, if a service name is not known, it defaults to being
+ not allowed (because the fallback service, /etc/pam.d/other, is set to
+ `pam_deny'.)
+
+ On Solaris 2.6 systems, unknown services default to authenticating normally.
+
+ So, we require that an "xscreensaver" PAM service exist. This has a bad
+ failure mode, however: if that service doesn't exist, then XScreenSaver
+ will lock the screen, but is unable to unlock. (With the non-PAM password
+ code, XScreenSaver can refuse to lock, because it is able to determine up
+ front that it was unable to retrieve the password info.)
+
+ At startup, we check for the existence of /etc/pam.d/xscreensaver or
+ /etc/pam.conf, and if those don't exist, we print a warning that PAM is
+ probably not configured properly. This isn't *necessarily* correct, since
+ those files are not a part of PAM's C API, but it's how real-world systems
+ actually work.
+
+ Also note that FreeBSD's implementation of PAM requires the calling process
+ to be running as root during the entire interactive PAM conversation: it
+ can't ever disavow privileges. Linux's PAM implementation uses a setuid
+ helper so that a non-root process can still authenticate, as is right and
+ proper. Consequently, XScreenSaver does not support PAM on FreeBSD.
+ Dear FreeBSD, get your shit together.
*/
#ifdef HAVE_CONFIG_H
@@ -43,36 +53,17 @@
# include <unistd.h>
#endif
-extern char *blurb(void);
-
-
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
+#include <sys/stat.h>
#include <pwd.h>
#include <grp.h>
#include <security/pam_appl.h>
-#include <signal.h>
-#include <errno.h>
-#include <X11/Intrinsic.h>
-
-#include <sys/stat.h>
+#include "blurb.h"
#include "auth.h"
-extern sigset_t block_sigchld (void);
-extern void unblock_sigchld (void);
-
-/* blargh */
-#undef Bool
-#undef True
-#undef False
-#define Bool int
-#define True 1
-#define False 0
-
-#undef countof
-#define countof(x) (sizeof((x))/sizeof(*(x)))
/* Some time between Red Hat 4.2 and 7.0, the words were transposed
in the various PAM_x_CRED macro names. Yay!
@@ -89,10 +80,14 @@ static int pam_conversation (int nmsgs,
struct pam_response **resp,
void *closure);
-void pam_try_unlock(saver_info *si, Bool verbose_p,
- Bool (*valid_p)(const char *typed_passwd, Bool verbose_p));
+typedef struct {
+ Bool (*conv_fn) (void *closure,
+ int nmsgs,
+ const auth_message *msg,
+ auth_response **resp);
+ void *conv_fn_closure;
+} pam_conv_closure;
-Bool pam_priv_init (int argc, char **argv, Bool verbose_p);
#ifdef HAVE_PAM_FAIL_DELAY
/* We handle delays ourself.*/
@@ -116,52 +111,6 @@ Bool pam_priv_init (int argc, char **argv, Bool verbose_p);
#endif /* !PAM_STRERROR_TWO_ARGS */
-/* PAM sucks in that there is no way to tell whether a particular service
- is configured at all. That is, there is no way to tell the difference
- between "authentication of the FOO service is not allowed" and "the
- user typed the wrong password."
-
- On RedHat 5.1 systems, if a service name is not known, it defaults to
- being not allowed (because the fallback service, /etc/pam.d/other, is
- set to `pam_deny'.)
-
- On Solaris 2.6 systems, unknown services default to authenticating normally.
-
- So, we could simply require that the person who installs xscreensaver
- set up an "xscreensaver" PAM service. However, if we went that route,
- it would have a really awful failure mode: the failure mode would be that
- xscreensaver was willing to *lock* the screen, but would be unwilling to
- *unlock* the screen. (With the non-PAM password code, the analagous
- situation -- security not being configured properly, for example do to the
- executable not being installed as setuid root -- the failure mode is much
- more palettable, in that xscreensaver will refuse to *lock* the screen,
- because it can know up front that there is no password that will work.)
-
- Another route would be to have the service name to consult be computed at
- compile-time (perhaps with a configure option.) However, that doesn't
- really solve the problem, because it means that the same executable might
- work fine on one machine, but refuse to unlock when run on another
- machine.
-
- Another alternative would be to look in /etc/pam.conf or /etc/pam.d/ at
- runtime to see what services actually exist. But I think that's no good,
- because who is to say that the PAM info is actually specified in those
- files? Opening and reading those files is not a part of the PAM client
- API, so it's not guarenteed to work on any given system.
-
- An alternative I tried was to specify a list of services to try, and to
- try them all in turn ("xscreensaver", "xlock", "xdm", and "login").
- This worked, but it was slow (and I also had to do some contortions to
- work around bugs in Linux PAM 0.64-3.)
-
- So what we do today is, try PAM once, and if that fails, try the usual
- getpwent() method. So if PAM doesn't work, it will at least make an
- attempt at looking up passwords in /etc/passwd or /etc/shadow instead.
-
- This all kind of blows. I'm not sure what else to do.
- */
-
-
/* On SunOS 5.6, the `pam_conv.appdata_ptr' slot seems to be ignored, and
the `closure' argument to pc.conv always comes in as random garbage.
So we get around this by using a global variable instead. Shoot me!
@@ -172,97 +121,70 @@ Bool pam_priv_init (int argc, char **argv, Bool verbose_p);
static void *suns_pam_implementation_blows = 0;
-/**
- * This function is the PAM conversation driver. It conducts a full
- * authentication round by invoking the GUI with various prompts.
+/* This function invokes the PAM conversation. It conducts a full
+ authentication round by presenting the GUI with various prompts.
*/
-void
-pam_try_unlock(saver_info *si, Bool verbose_p,
- Bool (*valid_p)(const char *typed_passwd, Bool verbose_p))
+Bool
+pam_try_unlock (void *closure,
+ Bool (*conv_fn) (void *closure,
+ int nmsgs,
+ const auth_message *msg,
+ auth_response **resp))
{
const char *service = PAM_SERVICE_NAME;
pam_handle_t *pamh = 0;
int status = -1;
struct pam_conv pc;
-# ifdef HAVE_SIGTIMEDWAIT
- sigset_t set;
- struct timespec timeout;
-# endif /* HAVE_SIGTIMEDWAIT */
+ struct passwd *p = getpwuid (getuid());
+ const char *user = (p && p->pw_name && *p->pw_name ? p->pw_name : 0);
+ pam_conv_closure conv_closure;
+
+ if (!user)
+ {
+ fprintf (stderr, "%s: PAM: unable to get current user\n", blurb());
+ return False;
+ }
+ conv_closure.conv_fn = conv_fn;
+ conv_closure.conv_fn_closure = closure;
+ pc.appdata_ptr = &conv_closure;
pc.conv = &pam_conversation;
- pc.appdata_ptr = (void *) si;
/* On SunOS 5.6, the `appdata_ptr' slot seems to be ignored, and the
`closure' argument to pc.conv always comes in as random garbage. */
- suns_pam_implementation_blows = (void *) si;
+ suns_pam_implementation_blows = pc.appdata_ptr;
/* Initialize PAM.
*/
- status = pam_start (service, si->user, &pc, &pamh);
+ status = pam_start (service, user, &pc, &pamh);
if (verbose_p)
- fprintf (stderr, "%s: pam_start (\"%s\", \"%s\", ...) ==> %d (%s)\n",
- blurb(), service, si->user,
+ fprintf (stderr, "%s: PAM: pam_start (\"%s\", \"%s\", ...) ==> %d (%s)\n",
+ blurb(), service, user,
status, PAM_STRERROR (pamh, status));
if (status != PAM_SUCCESS) goto DONE;
- /* #### We should set PAM_TTY to the display we're using, but we
- don't have that handy from here. So set it to :0.0, which is a
- good guess (and has the bonus of counting as a "secure tty" as
- far as PAM is concerned...)
- */
{
- char *tty = strdup (":0.0");
+ char *tty = getenv ("DISPLAY");
+ if (!tty || !*tty) tty = ":0.0";
status = pam_set_item (pamh, PAM_TTY, tty);
if (verbose_p)
fprintf (stderr, "%s: pam_set_item (p, PAM_TTY, \"%s\") ==> %d (%s)\n",
blurb(), tty, status, PAM_STRERROR(pamh, status));
- free (tty);
}
- /* Try to authenticate as the current user.
- We must turn off our SIGCHLD handler for the duration of the call to
- pam_authenticate(), because in some cases, the underlying PAM code
- will do this:
-
- 1: fork a setuid subprocess to do some dirty work;
- 2: read a response from that subprocess;
- 3: waitpid(pid, ...) on that subprocess.
-
- If we (the ignorant parent process) have a SIGCHLD handler, then there's
- a race condition between steps 2 and 3: if the subprocess exits before
- waitpid() was called, then our SIGCHLD handler fires, and gets notified
- of the subprocess death; then PAM's call to waitpid() fails, because the
- process has already been reaped.
-
- I consider this a bug in PAM, since the caller should be able to have
- whatever signal handlers it wants -- the PAM documentation doesn't say
- "oh by the way, if you use PAM, you can't use SIGCHLD."
- */
-
PAM_NO_DELAY(pamh);
if (verbose_p)
fprintf (stderr, "%s: pam_authenticate (...) ...\n", blurb());
-# ifdef HAVE_SIGTIMEDWAIT
- timeout.tv_sec = 0;
- timeout.tv_nsec = 1;
- set =
-# endif /* HAVE_SIGTIMEDWAIT */
- block_sigchld();
status = pam_authenticate (pamh, 0);
-# ifdef HAVE_SIGTIMEDWAIT
- sigtimedwait (&set, NULL, &timeout);
- /* #### What is the portable thing to do if we don't have it? */
-# endif /* HAVE_SIGTIMEDWAIT */
- unblock_sigchld();
if (verbose_p)
fprintf (stderr, "%s: pam_authenticate (...) ==> %d (%s)\n",
blurb(), status, PAM_STRERROR(pamh, status));
- if (status == PAM_SUCCESS) /* Win! */
+ if (status == PAM_SUCCESS) /* So far so good... */
{
int status2;
@@ -341,22 +263,16 @@ pam_try_unlock(saver_info *si, Bool verbose_p,
(status2 == PAM_SUCCESS ? "Success" : "Failure"));
}
- if (status == PAM_SUCCESS)
- si->unlock_state = ul_success; /* yay */
- else if (si->unlock_state == ul_cancel ||
- si->unlock_state == ul_time)
- ; /* more specific failures ok */
- else
- si->unlock_state = ul_fail; /* generic failure */
+ return (status == PAM_SUCCESS);
}
Bool
-pam_priv_init (int argc, char **argv, Bool verbose_p)
+pam_priv_init (void)
{
/* We have nothing to do at init-time.
However, we might as well do some error checking.
- If "/etc/pam.d" exists and is a directory, but "/etc/pam.d/xlock"
+ If "/etc/pam.d" exists and is a directory, but "/etc/pam.d/xscreensaver"
does not exist, warn that PAM probably isn't going to work.
This is a priv-init instead of a non-priv init in case the directory
@@ -375,8 +291,8 @@ pam_priv_init (int argc, char **argv, Bool verbose_p)
{
if (stat (file, &st) != 0)
fprintf (stderr,
- "%s: warning: %s does not exist.\n"
- "%s: password authentication via PAM is unlikely to work.\n",
+ "%s: PAM: warning: %s does not exist.\n"
+ "%s: PAM: password authentication is unlikely to work.\n",
blurb(), file, blurb());
}
else if (stat (file2, &st) == 0)
@@ -396,8 +312,8 @@ pam_priv_init (int argc, char **argv, Bool verbose_p)
if (!ok)
{
fprintf (stderr,
- "%s: warning: %s does not list the `%s' service.\n"
- "%s: password authentication via PAM is unlikely to work.\n",
+ "%s: PAM: warning: %s does not list the `%s' service.\n"
+ "%s: PAM: password authentication is unlikely to work.\n",
blurb(), file2, PAM_SERVICE_NAME, blurb());
}
}
@@ -406,8 +322,8 @@ pam_priv_init (int argc, char **argv, Bool verbose_p)
else
{
fprintf (stderr,
- "%s: warning: neither %s nor %s exist.\n"
- "%s: password authentication via PAM is unlikely to work.\n",
+ "%s: PAM: warning: neither %s nor %s exist.\n"
+ "%s: PAM: password authentication is unlikely to work.\n",
blurb(), file2, file, blurb());
}
@@ -416,23 +332,22 @@ pam_priv_init (int argc, char **argv, Bool verbose_p)
}
+/* This is pam_conv->conv */
static int
pam_conversation (int nmsgs,
const struct pam_message **msg,
struct pam_response **resp,
- void *vsaver_info)
+ void *closure)
{
- int i, ret = -1;
- struct auth_message *messages = 0;
- struct auth_response *authresp = 0;
+ int i;
+ auth_message *messages = 0;
+ auth_response *authresp = 0;
struct pam_response *pam_responses;
- saver_info *si = (saver_info *) vsaver_info;
- Bool verbose_p;
+ pam_conv_closure *conv_closure;
/* On SunOS 5.6, the `closure' argument always comes in as random garbage. */
- si = (saver_info *) suns_pam_implementation_blows;
-
- verbose_p = si->prefs.verbose_p;
+ closure = suns_pam_implementation_blows;
+ conv_closure = closure;
/* Converting the PAM prompts into the XScreenSaver native format.
* It was a design goal to collapse (INFO,PROMPT) pairs from PAM
@@ -443,11 +358,9 @@ pam_conversation (int nmsgs,
* pass along whatever was passed in here.
*/
- messages = calloc(nmsgs, sizeof(struct auth_message));
- pam_responses = calloc(nmsgs, sizeof(*pam_responses));
-
- if (!pam_responses || !messages)
- goto end;
+ messages = calloc (nmsgs, sizeof(*messages));
+ pam_responses = calloc (nmsgs, sizeof(*pam_responses));
+ if (!pam_responses || !messages) abort();
if (verbose_p)
fprintf (stderr, "%s: pam_conversation (", blurb());
@@ -483,44 +396,25 @@ pam_conversation (int nmsgs,
if (verbose_p)
fprintf (stderr, ") ...\n");
- ret = si->unlock_cb(nmsgs, messages, &authresp, si);
-
- /* #### If the user times out, or hits ESC or Cancel, we return PAM_CONV_ERR,
- and PAM logs this as an authentication failure. It would be nice if
- there was some way to indicate that this was a "cancel" rather than
- a "fail", so that it wouldn't show up in syslog, but I think the
- only options are PAM_SUCCESS and PAM_CONV_ERR. (I think that
- PAM_ABORT means "internal error", not "cancel".) Bleh.
- */
-
- if (ret == 0)
- {
- for (i = 0; i < nmsgs; ++i)
- pam_responses[i].resp = authresp[i].response;
- }
+ /* This opens the dialog box and runs the X11 event loop.
+ It only returns if the user entered a password.
+ If they hit cancel, or timed out, it exited.
+ */
+ conv_closure->conv_fn (conv_closure->conv_fn_closure, nmsgs, messages,
+ &authresp);
-end:
- if (messages)
- free(messages);
+ for (i = 0; i < nmsgs; ++i)
+ pam_responses[i].resp = authresp[i].response;
- if (authresp)
- free(authresp);
+ if (messages) free (messages);
+ if (authresp) free (authresp);
if (verbose_p)
- fprintf (stderr, "%s: pam_conversation (...) ==> %s\n", blurb(),
- (ret == 0 ? "PAM_SUCCESS" : "PAM_CONV_ERR"));
-
- if (ret == 0)
- {
- *resp = pam_responses;
- return PAM_SUCCESS;
- }
-
- /* Failure only */
- if (pam_responses)
- free(pam_responses);
+ fprintf (stderr, "%s: pam_conversation (...) ==> PAM_SUCCESS\n",
+ blurb());
- return PAM_CONV_ERR;
+ *resp = pam_responses;
+ return PAM_SUCCESS;
}
#endif /* NO_LOCKING -- whole file */
diff --git a/driver/passwd-pwent.c b/driver/passwd-pwent.c
index bb0edfc..b6c74de 100644
--- a/driver/passwd-pwent.c
+++ b/driver/passwd-pwent.c
@@ -1,5 +1,5 @@
/* passwd-pwent.c --- verifying typed passwords with the OS.
- * xscreensaver, Copyright (c) 1993-1998 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 1993-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -28,13 +28,8 @@
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
-#ifndef VMS
-# include <pwd.h>
-# include <grp.h>
-#else /* VMS */
-# include "vms-pwd.h"
-#endif /* VMS */
-
+#include <pwd.h>
+#include <grp.h>
#ifdef __bsdi__
# include <sys/param.h>
@@ -47,6 +42,7 @@
#if defined(HAVE_SHADOW_PASSWD) /* passwds live in /etc/shadow */
# include <shadow.h>
+# define PWNAME "spnam"
# define PWTYPE struct spwd *
# define PWPSLOT sp_pwdp
# define GETPW getspnam
@@ -56,6 +52,7 @@
# include <sys/security.h>
# include <prot.h>
+# define PWNAME "prpwnam"
# define PWTYPE struct pr_passwd *
# define PWPSLOT ufld.fd_encrypt
# define GETPW getprpwnam
@@ -66,6 +63,7 @@
# include <sys/audit.h>
# include <pwdadj.h>
+# define PWNAME "pwanam"
# define PWTYPE struct passwd_adjunct *
# define PWPSLOT pwa_passwd
# define GETPW getpwanam
@@ -75,43 +73,33 @@
# include <hpsecurity.h>
# include <prot.h>
+# define PWNAME "spwnam"
# define PWTYPE struct s_passwd *
# define PWPSLOT pw_passwd
# define GETPW getspwnam
# define HAVE_BIGCRYPT
-#endif
+#elif defined(HAVE_PWNAM_SHADOW_PASSWD)
+# define PWNAME "pwnam_shadow"
+# define PWTYPE struct passwd *
+# define PWPSLOT pw_passwd
+# define GETPW getpwnam_shadow
-/* blargh */
-#undef Bool
-#undef True
-#undef False
-#define Bool int
-#define True 1
-#define False 0
+#endif
+#include "blurb.h"
+#include "auth.h"
-extern const char *blurb(void);
+#ifdef ALLOW_ROOT_PASSWD
static char *encrypted_root_passwd = 0;
-static char *encrypted_user_passwd = 0;
-
-#ifdef VMS
-# define ROOT "SYSTEM"
-#else
-# define ROOT "root"
-#endif
-
-#ifndef VMS
-Bool pwent_priv_init (int argc, char **argv, Bool verbose_p);
-Bool pwent_lock_init (int argc, char **argv, Bool verbose_p);
-Bool pwent_passwd_valid_p (const char *typed_passwd, Bool verbose_p);
#endif
+static char *encrypted_user_passwd = 0;
+#define ROOT "root"
-#ifndef VMS
static char *
user_name (void)
@@ -140,17 +128,6 @@ user_name (void)
return (u ? strdup(u) : 0);
}
-#else /* VMS */
-
-static char *
-user_name (void)
-{
- char *u = getenv("USER");
- return (u ? strdup(u) : 0);
-}
-
-#endif /* VMS */
-
static Bool
passwd_known_p (const char *pw)
@@ -162,24 +139,28 @@ passwd_known_p (const char *pw)
static char *
-get_encrypted_passwd(const char *user)
+get_encrypted_passwd (const char *user)
{
char *result = 0;
+ const char *pwtype = "pwnam";
-#ifdef PWTYPE
+# ifdef PWTYPE
if (user && *user && !result)
{ /* First check the shadow passwords. */
PWTYPE p = GETPW((char *) user);
if (p && passwd_known_p (p->PWPSLOT))
- result = strdup(p->PWPSLOT);
+ {
+ result = strdup(p->PWPSLOT);
+ pwtype = PWNAME;
+ }
}
-#endif /* PWTYPE */
+# endif /* PWTYPE */
if (user && *user && !result)
{ /* Check non-shadow passwords too. */
struct passwd *p = getpwnam(user);
if (p && passwd_known_p (p->pw_passwd))
- result = strdup(p->pw_passwd);
+ result = strdup(p->pw_passwd);
}
/* The manual for passwd(4) on HPUX 10.10 says:
@@ -200,15 +181,20 @@ get_encrypted_passwd(const char *user)
*s = 0;
}
-#ifndef HAVE_PAM
- /* We only issue this warning if not compiled with support for PAM.
- If we're using PAM, it's not unheard of that normal pwent passwords
- would be unavailable. */
+ /* We only issue this warning in non-verbose mode if not compiled with
+ support for PAM. If we're using PAM, it's common for pwent passwords
+ to be unavailable. */
- if (!result)
- fprintf (stderr, "%s: couldn't get password of \"%s\"\n",
- blurb(), (user ? user : "(null)"));
-#endif /* !HAVE_PAM */
+ if (!result &&
+ (verbose_p
+# ifdef HAVE_PAM
+ || 0
+# else
+ || 1
+# endif
+ ))
+ fprintf (stderr, "%s: %s: couldn't get password of \"%s\"\n",
+ blurb(), pwtype, (user ? user : "(null)"));
return result;
}
@@ -221,10 +207,8 @@ get_encrypted_passwd(const char *user)
locking isn't possible. (It will also have written to stderr.)
*/
-#ifndef VMS
-
Bool
-pwent_priv_init (int argc, char **argv, Bool verbose_p)
+pwent_priv_init (void)
{
char *u;
@@ -235,7 +219,9 @@ pwent_priv_init (int argc, char **argv, Bool verbose_p)
u = user_name();
encrypted_user_passwd = get_encrypted_passwd(u);
+#ifdef ALLOW_ROOT_PASSWD
encrypted_root_passwd = get_encrypted_passwd(ROOT);
+#endif
if (u) free (u);
if (encrypted_user_passwd)
@@ -246,7 +232,7 @@ pwent_priv_init (int argc, char **argv, Bool verbose_p)
Bool
-pwent_lock_init (int argc, char **argv, Bool verbose_p)
+pwent_lock_init (void)
{
if (encrypted_user_passwd)
return True;
@@ -287,7 +273,7 @@ passwds_match_p (const char *cleartext, const char *ciphertext)
to root.
*/
Bool
-pwent_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
+pwent_passwd_valid_p (void *closure, const char *typed_passwd)
{
if (encrypted_user_passwd &&
passwds_match_p (typed_passwd, encrypted_user_passwd))
@@ -305,8 +291,6 @@ pwent_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
return False;
}
-#else /* VMS */
-Bool pwent_lock_init (int argc, char **argv, Bool verbose_p) { return True; }
-#endif /* VMS */
-
+#else /* NO_LOCKING */
+int _ignore_;
#endif /* NO_LOCKING -- whole file */
diff --git a/driver/passwd.c b/driver/passwd.c
index 68e1a0b..11ca134 100644
--- a/driver/passwd.c
+++ b/driver/passwd.c
@@ -1,5 +1,5 @@
/* passwd.c --- verifying typed passwords with the OS.
- * xscreensaver, Copyright (c) 1993-2019 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 1993-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -14,8 +14,6 @@
# include "config.h"
#endif
-#ifndef NO_LOCKING /* whole file */
-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -26,11 +24,7 @@
#include <sys/time.h>
#include <sys/stat.h>
-#ifndef VMS
-# include <pwd.h> /* for getpwuid() */
-#else /* VMS */
-# include "vms-pwd.h"
-#endif /* VMS */
+#include <pwd.h> /* for getpwuid() */
#ifdef HAVE_SYSLOG
# include <syslog.h>
@@ -41,8 +35,24 @@
#include "xscreensaver.h"
#include "auth.h"
+
+#ifdef NO_LOCKING
+
+Bool lock_init (void) { return 0; }
+Bool lock_priv_init (void) { return 0; }
+Bool xscreensaver_auth (void *closure,
+ Bool (*conv_fn) (void *closure,
+ int nmsgs,
+ const auth_message *msg,
+ auth_response **resp),
+ void (*finished_fn) (void *closure, Bool status))
+{
+ return False;
+}
+
+#else /* NO_LOCKING -- whole file */
+
extern const char *blurb(void);
-extern void check_for_leaks (const char *where);
/* blargh */
@@ -58,100 +68,39 @@ extern void check_for_leaks (const char *where);
struct auth_methods {
const char *name;
- Bool (*init) (int argc, char **argv, Bool verbose_p);
- Bool (*priv_init) (int argc, char **argv, Bool verbose_p);
- Bool (*valid_p) (const char *typed_passwd, Bool verbose_p);
- void (*try_unlock) (saver_info *si, Bool verbose_p,
- Bool (*valid_p)(const char *typed_passwd, Bool verbose_p));
+ Bool (*init) (void);
+ Bool (*priv_init) (void);
+ Bool (*valid_p) (void *closure, const char *plaintext);
+ Bool (*try_unlock) (void *closure,
+ Bool (*conv_fn) (void *closure,
+ int nmsgs,
+ const auth_message *msg,
+ auth_response **resp));
Bool initted_p;
Bool priv_initted_p;
};
-#ifdef HAVE_KERBEROS
-extern Bool kerberos_lock_init (int argc, char **argv, Bool verbose_p);
-extern Bool kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p);
-#endif
-#ifdef HAVE_PAM
-extern Bool pam_priv_init (int argc, char **argv, Bool verbose_p);
-extern void pam_try_unlock (saver_info *si, Bool verbose_p,
- Bool (*valid_p)(const char *typed_passwd, Bool verbose_p));
-#endif
-#ifdef PASSWD_HELPER_PROGRAM
-extern Bool ext_priv_init (int argc, char **argv, Bool verbose_p);
-extern Bool ext_passwd_valid_p (const char *typed_passwd, Bool verbose_p);
-#endif
-extern Bool pwent_lock_init (int argc, char **argv, Bool verbose_p);
-extern Bool pwent_priv_init (int argc, char **argv, Bool verbose_p);
-extern Bool pwent_passwd_valid_p (const char *typed_passwd, Bool verbose_p);
-
-Bool lock_priv_init (int argc, char **argv, Bool verbose_p);
-Bool lock_init (int argc, char **argv, Bool verbose_p);
-Bool passwd_valid_p (const char *typed_passwd, Bool verbose_p);
-
-/* The authorization methods to try, in order.
- Note that the last one (the pwent version) is actually two auth methods,
- since that code tries shadow passwords, and then non-shadow passwords.
- (It's all in the same file since the APIs are randomly nearly-identical.)
+
+/* The authorization methods to try, in order of preference.
+ The first that initializes successfully is used and others are ignored.
*/
struct auth_methods methods[] = {
# ifdef HAVE_PAM
- { "PAM", 0, pam_priv_init, 0, pam_try_unlock,
- False, False },
+ { "PAM", 0, pam_priv_init, 0, pam_try_unlock, 0, },
# endif
# ifdef HAVE_KERBEROS
- { "Kerberos", kerberos_lock_init, 0, kerberos_passwd_valid_p, 0,
- False, False },
+ { "KRB", kerberos_lock_init, 0, kerberos_passwd_valid_p, 0, },
# endif
# ifdef PASSWD_HELPER_PROGRAM
- { "external", 0, ext_priv_init, ext_passwd_valid_p, 0,
- False, False },
+ { "EXT", 0, ext_priv_init, ext_passwd_valid_p, 0, },
# endif
- { "normal", pwent_lock_init, pwent_priv_init, pwent_passwd_valid_p, 0,
- False, False }
+ { "pwnam", pwent_lock_init, pwent_priv_init, pwent_passwd_valid_p, 0, }
};
-# ifdef HAVE_PROC_OOM
-/* On some recent Linux systems you can tell the kernel's OOM-killer to
- consider the possibility of maybe sometimes not killing you in low-memory
- situations. Because that would unlock the screen. And that would be bad.
-
- Linux >= 2.6.11: echo -17 > /proc/$$/oom_adj <-- ignoring this.
- Linux >= 2.6.37: echo -1000 > /proc/$$/oom_score_adj <-- trying this.
- */
-static void
-oom_assassin_immunity (Bool verbose_p)
-{
- char fn[1024];
- struct stat st;
- FILE *out;
- sprintf (fn, "/proc/%d/oom_score_adj", getpid());
- if (stat(fn, &st) != 0)
- {
- if (verbose_p)
- fprintf (stderr, "%s: OOM: %s does not exist\n", blurb(), fn);
- return;
- }
- out = fopen (fn, "w");
- if (!out)
- {
- if (verbose_p)
- {
- char b[2048];
- sprintf (b, "%s: OOM: unable to write %s\n", blurb(), fn);
- perror(b);
- }
- return;
- }
- fputs ("-1000\n", out);
- fclose (out);
-}
-# endif /* HAVE_PROC_OOM */
-
-
Bool
-lock_priv_init (int argc, char **argv, Bool verbose_p)
+lock_priv_init (void)
{
int i;
Bool any_ok = False;
@@ -160,26 +109,17 @@ lock_priv_init (int argc, char **argv, Bool verbose_p)
if (!methods[i].priv_init)
methods[i].priv_initted_p = True;
else
- methods[i].priv_initted_p = methods[i].priv_init (argc, argv,
- verbose_p);
+ methods[i].priv_initted_p = methods[i].priv_init();
if (methods[i].priv_initted_p)
any_ok = True;
- else if (verbose_p)
- fprintf (stderr, "%s: initialization of %s passwords failed.\n",
- blurb(), methods[i].name);
}
-
-# ifdef HAVE_PROC_OOM
- oom_assassin_immunity (verbose_p);
-# endif
-
return any_ok;
}
Bool
-lock_init (int argc, char **argv, Bool verbose_p)
+lock_init (void)
{
int i;
Bool any_ok = False;
@@ -191,70 +131,75 @@ lock_init (int argc, char **argv, Bool verbose_p)
if (!methods[i].init)
methods[i].initted_p = True;
else
- methods[i].initted_p = methods[i].init (argc, argv, verbose_p);
+ methods[i].initted_p = methods[i].init();
if (methods[i].initted_p)
any_ok = True;
else if (verbose_p)
- fprintf (stderr, "%s: initialization of %s passwords failed.\n",
+ fprintf (stderr, "%s: %s: passwords initialization failed\n",
blurb(), methods[i].name);
}
return any_ok;
}
-/* A basic auth driver that simply prompts for a password then runs it through
- * valid_p to determine whether the password is correct.
+/* For those auth methods that have a 'valid_p' function instead of a
+ 'try_unlock' function, this does a PAM-like conversation that first
+ prompts for a password and then tests it with the 'valid_p' function.
*/
-static void
-try_unlock_password(saver_info *si,
- Bool verbose_p,
- Bool (*valid_p)(const char *typed_passwd, Bool verbose_p))
+static Bool
+try_valid_p (void *closure,
+ const char *name,
+ Bool (*valid_p) (void *closure, const char *typed_passwd),
+ Bool (*conv_fn) (void *closure,
+ int nmsgs,
+ const auth_message *msg,
+ auth_response **resp))
{
- struct auth_message message;
- struct auth_response *response = NULL;
+ auth_message message;
+ auth_response *response = NULL;
+ Bool ok = False;
- memset(&message, 0, sizeof(message));
+ memset (&message, 0, sizeof(message));
if (verbose_p)
- fprintf(stderr, "%s: non-PAM password auth.\n", blurb());
+ fprintf (stderr, "%s: %s: non-PAM password auth\n", blurb(), name);
- /* Call the auth_conv function with "Password:", then feed
- * the result into valid_p()
- */
+ /* Call the auth_conv function with "Password:", then feed the result
+ into valid_p() */
message.type = AUTH_MSGTYPE_PROMPT_NOECHO;
message.msg = "Password:";
- si->unlock_cb(1, &message, &response, si);
+ ok = conv_fn (closure, 1, &message, &response);
+ if (!response || !response->response)
+ ok = False;
- if (!response)
- return;
+ if (ok)
+ ok = valid_p (closure, response->response);
- if (valid_p (response->response, verbose_p))
- si->unlock_state = ul_success; /* yay */
- else if (si->unlock_state == ul_cancel ||
- si->unlock_state == ul_time)
- ; /* more specific failures ok */
- else
- si->unlock_state = ul_fail; /* generic failure */
+ if (response)
+ {
+ if (response->response)
+ free (response->response);
+ free (response);
+ }
- if (response->response)
- free(response->response);
- free(response);
+ return ok;
}
/* Write a password failure to the system log.
*/
static void
-do_syslog (saver_info *si, Bool verbose_p)
+do_syslog (void)
{
# ifdef HAVE_SYSLOG
struct passwd *pw = getpwuid (getuid ());
- char *d = (si->dpy ? DisplayString (si->dpy) : 0);
+ char *d = getenv ("DISPLAY");
char *u = (pw && pw->pw_name ? pw->pw_name : "???");
int opt = 0;
int fac = 0;
+ int pri = LOG_NOTICE;
# ifdef LOG_PID
opt = LOG_PID;
@@ -270,115 +215,57 @@ do_syslog (saver_info *si, Bool verbose_p)
if (!d) d = "";
-# undef FMT
-# define FMT "FAILED LOGIN %d ON DISPLAY \"%s\", FOR \"%s\""
-
- if (verbose_p)
- fprintf (stderr, "%s: syslog: " FMT "\n", blurb(),
- si->unlock_failures, d, u);
-
openlog (progname, opt, fac);
- syslog (LOG_NOTICE, FMT, si->unlock_failures, d, u);
+ syslog (pri, "Failed login on display \"%s\" for \"%s\"", d, u);
closelog ();
# endif /* HAVE_SYSLOG */
}
-
-/**
- * Runs through each authentication driver calling its try_unlock function.
- * Called xss_authenticate() because AIX beat us to the name authenticate().
+/* Runs through each authentication driver calling its try_unlock function.
*/
-void
-xss_authenticate(saver_info *si, Bool verbose_p)
+Bool
+xscreensaver_auth (void *closure,
+ Bool (*conv_fn) (void *closure,
+ int nmsgs,
+ const auth_message *msg,
+ auth_response **resp),
+ void (*finished_fn) (void *closure, Bool status))
{
- int i, j;
-
- si->unlock_state = ul_read;
+ int i;
+ Bool ok = False;
for (i = 0; i < countof(methods); i++)
{
if (!methods[i].initted_p)
continue;
- if (si->cached_passwd != NULL && methods[i].valid_p)
- si->unlock_state = (methods[i].valid_p(si->cached_passwd, verbose_p) == True)
- ? ul_success : ul_fail;
- else if (methods[i].try_unlock != NULL)
- methods[i].try_unlock(si, verbose_p, methods[i].valid_p);
+ if (methods[i].try_unlock)
+ ok = methods[i].try_unlock (closure, conv_fn);
else if (methods[i].valid_p)
- try_unlock_password(si, verbose_p, methods[i].valid_p);
- else /* Ze goggles, zey do nozing! */
- fprintf(stderr, "%s: authentication method %s does nothing.\n",
- blurb(), methods[i].name);
-
- check_for_leaks (methods[i].name);
-
- /* If password authentication failed, but the password was NULL
- (meaning the user just hit RET) then treat that as "cancel".
- This means that if the password is literally NULL, it will
- work; but if not, then NULL passwords are treated as cancel.
- */
- if (si->unlock_state == ul_fail &&
- si->cached_passwd &&
- !*si->cached_passwd)
- {
- if (verbose_p)
- fprintf (stderr, "%s: assuming null password means cancel.\n",
- blurb());
- si->unlock_state = ul_cancel;
- }
-
- if (si->unlock_state == ul_success)
- {
- /* If we successfully authenticated by method N, but attempting
- to authenticate by method N-1 failed, mention that (since if
- an earlier authentication method fails and a later one succeeds,
- something screwy is probably going on.)
- */
- if (verbose_p && i > 0)
- {
- for (j = 0; j < i; j++)
- if (methods[j].initted_p)
- fprintf (stderr,
- "%s: authentication via %s failed.\n",
- blurb(), methods[j].name);
- fprintf (stderr,
- "%s: authentication via %s succeeded.\n",
- blurb(), methods[i].name);
- }
- goto DONE; /* Successfully authenticated! */
- }
- else if (si->unlock_state == ul_cancel ||
- si->unlock_state == ul_time)
- {
- /* If any auth method gets a cancel or timeout, don't try the
- next auth method! We're done! */
- if (verbose_p)
- fprintf (stderr, "%s: authentication via %s %s.\n",
- blurb(), methods[i].name,
- (si->unlock_state == ul_cancel
- ? "cancelled" : "timed out"));
- goto DONE;
- }
+ ok = try_valid_p (closure, methods[i].name, methods[i].valid_p,
+ conv_fn);
+ else
+ abort(); /* method must have one or the other function */
+
+ /* Only try the first method that initialized properly. That means that
+ if PAM initialized correctly, we will never try pwent or Kerberos.
+ If we did, then typing an incorrect password at PAM would result in a
+ second password prompt that would only go to pwent. There's no
+ sensible way to re-use the password typed the first time, if there
+ even was one. With fingerprint readers or OTP fobs, there might have
+ been 0, 2, or more passwords entered. */
+ break;
}
- if (verbose_p)
- fprintf(stderr, "%s: All authentication mechanisms failed.\n", blurb());
+ if (!ok)
+ do_syslog ();
- if (si->unlock_state == ul_fail)
- {
- /* Note the time of the first failure */
- if (si->unlock_failures == 0)
- si->unlock_failure_time = time((time_t *) 0);
- si->unlock_failures++;
- do_syslog (si, verbose_p);
- }
+ if (finished_fn)
+ finished_fn (closure, ok);
-DONE:
- if (si->auth_finished_cb)
- si->auth_finished_cb (si);
+ return ok;
}
#endif /* NO_LOCKING -- whole file */
diff --git a/driver/prefs.c b/driver/prefs.c
index b608738..a65b679 100644
--- a/driver/prefs.c
+++ b/driver/prefs.c
@@ -1,5 +1,5 @@
-/* dotfile.c --- management of the ~/.xscreensaver file.
- * xscreensaver, Copyright (c) 1998-2020 Jamie Zawinski <jwz@jwz.org>
+/* prefs.c --- reading and writing the ~/.xscreensaver file.
+ * xscreensaver, Copyright © 1998-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -14,311 +14,20 @@
# include "config.h"
#endif
-#include <stdlib.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
#include <stdio.h>
-#include <ctype.h>
+#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/stat.h>
#include <sys/time.h>
-#include <sys/param.h> /* for PATH_MAX */
-#include <X11/Xlib.h>
-#include <X11/Xresource.h>
-
-#ifndef VMS
-# include <pwd.h>
-#else /* VMS */
-# include "vms-pwd.h"
-#endif /* VMS */
-
-
-/* This file doesn't need the Xt headers, so stub these types out... */
-#undef XtPointer
-#define XtAppContext void*
-#define XtIntervalId void*
-#define XtPointer void*
-#define Widget void*
-
-
-/* Just in case there's something pathological about stat.h... */
-#ifndef S_IRUSR
-# define S_IRUSR 00400
-#endif
-#ifndef S_IWUSR
-# define S_IWUSR 00200
-#endif
-#ifndef S_IXUSR
-# define S_IXUSR 00100
-#endif
-#ifndef S_IXGRP
-# define S_IXGRP 00010
-#endif
-#ifndef S_IXOTH
-# define S_IXOTH 00001
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
#endif
-
-#include "version.h"
+#include "blurb.h"
#include "prefs.h"
-#include "resources.h"
-
-/* don't use realpath() on fedora system */
-#ifdef _FORTIFY_SOURCE
-#undef HAVE_REALPATH
-#endif
-
-
-extern char *progname;
-extern char *progclass;
-extern const char *blurb (void);
-
-
-
-static void get_screenhacks (Display *, saver_preferences *);
-static char *format_command (const char *cmd, Bool wrap_p);
-static void merge_system_screenhacks (Display *, saver_preferences *,
- screenhack **system_list, int count);
-static void stop_the_insanity (saver_preferences *p);
-
-
-static char *
-chase_symlinks (const char *file)
-{
-# ifdef HAVE_REALPATH
- if (file)
- {
-# ifndef PATH_MAX
-# ifdef MAXPATHLEN
-# define PATH_MAX MAXPATHLEN
-# else
-# define PATH_MAX 2048
-# endif
-# endif
- char buf[PATH_MAX];
- if (realpath (file, buf))
- return strdup (buf);
-
-/* sprintf (buf, "%.100s: realpath %.200s", blurb(), file);
- perror(buf);*/
- }
-# endif /* HAVE_REALPATH */
- return 0;
-}
-
-
-static Bool
-i_am_a_nobody (uid_t uid)
-{
- struct passwd *p;
-
- p = getpwnam ("nobody");
- if (! p) p = getpwnam ("noaccess");
- if (! p) p = getpwnam ("daemon");
-
- if (! p) /* There is no nobody? */
- return False;
-
- return (uid == p->pw_uid);
-}
-
-
-const char *
-init_file_name (void)
-{
- static char *file = 0;
-
- if (!file)
- {
- uid_t uid = getuid ();
- const char *home = getenv("HOME");
-
- if (i_am_a_nobody (uid) || !home || !*home)
- {
- /* If we're running as nobody, then use root's .xscreensaver file
- (since ~root/.xscreensaver and ~nobody/.xscreensaver are likely
- to be different -- if we didn't do this, then xscreensaver-demo
- would appear to have no effect when the luser is running as root.)
- */
- struct passwd *p = getpwuid (uid);
- uid = 0;
- if (!p || !p->pw_name || !*p->pw_name)
- {
- fprintf (stderr, "%s: couldn't get user info of uid %d\n",
- blurb(), getuid ());
- }
- else if (!p->pw_dir || !*p->pw_dir)
- {
- fprintf (stderr, "%s: couldn't get home directory of \"%s\"\n",
- blurb(), (p->pw_name ? p->pw_name : "???"));
- }
- else
- {
- home = p->pw_dir;
- }
- }
- if (home && *home)
- {
- const char *name = ".xscreensaver";
- file = (char *) malloc(strlen(home) + strlen(name) + 2);
- strcpy(file, home);
- if (!*home || home[strlen(home)-1] != '/')
- strcat(file, "/");
- strcat(file, name);
- }
- else
- {
- file = "";
- }
- }
-
- if (file && *file)
- return file;
- else
- return 0;
-}
-
-
-static const char *
-init_file_tmp_name (void)
-{
- static char *file = 0;
- if (!file)
- {
- const char *name = init_file_name();
- const char *suffix = ".tmp";
-
- char *n2 = chase_symlinks (name);
- if (n2) name = n2;
- if (!name || !*name)
- file = "";
- else
- {
- file = (char *) malloc(strlen(name) + strlen(suffix) + 2);
- strcpy(file, name);
- strcat(file, suffix);
- }
-
- if (n2) free (n2);
- }
-
- if (file && *file)
- return file;
- else
- return 0;
-}
-
-static int
-get_byte_resource (Display *dpy, char *name, char *class)
-{
- char *s = get_string_resource (dpy, name, class);
- char *s2 = s;
- int n = 0;
- if (!s) return 0;
-
- while (isspace(*s2)) s2++;
- while (*s2 >= '0' && *s2 <= '9')
- {
- n = (n * 10) + (*s2 - '0');
- s2++;
- }
- while (isspace(*s2)) s2++;
- if (*s2 == 'k' || *s2 == 'K') n <<= 10;
- else if (*s2 == 'm' || *s2 == 'M') n <<= 20;
- else if (*s2 == 'g' || *s2 == 'G') n <<= 30;
- else if (*s2)
- {
- LOSE:
- fprintf (stderr, "%s: %s must be a number of bytes, not \"%s\".\n",
- progname, name, s);
- free (s);
- return 0;
- }
- s2++;
- if (*s2 == 'b' || *s2 == 'B') s2++;
- while (isspace(*s2)) s2++;
- if (*s2) goto LOSE;
-
- free (s);
- return n;
-}
-
-
-static const char * const prefs[] = {
- "timeout",
- "cycle",
- "lock",
- "lockVTs", /* not saved */
- "lockTimeout",
- "passwdTimeout",
- "visualID",
- "installColormap",
- "verbose",
- "timestamp",
- "splash",
- "splashDuration",
- "quad",
- "demoCommand",
- "prefsCommand",
- "newLoginCommand",
- "helpURL", /* not saved */
- "loadURL", /* not saved */
- "newLoginCommand", /* not saved */
- "externalUngrabCommand", /* not saved */
- "nice",
- "memoryLimit",
- "fade",
- "unfade",
- "fadeSeconds",
- "fadeTicks",
- "captureStderr",
- "captureStdout", /* not saved -- obsolete */
- "logFile", /* not saved */
- "ignoreUninstalledPrograms",
- "font",
- "dpmsEnabled",
- "dpmsQuickOff",
- "dpmsStandby",
- "dpmsSuspend",
- "dpmsOff",
- "dpmsFullThrottle",
- "grabDesktopImages",
- "grabVideoFrames",
- "chooseRandomImages",
- "imageDirectory",
- "mode",
- "selected",
- "textMode",
- "textLiteral",
- "textFile",
- "textProgram",
- "textURL",
- "",
- "programs",
- "",
- "pointerPollTime",
- "pointerHysteresis",
- "windowCreationTimeout",
- "initialDelay",
- "sgiSaverExtension", /* not saved -- obsolete */
- "mitSaverExtension", /* not saved -- obsolete */
- "xidleExtension", /* not saved -- obsolete */
- "GetViewPortIsFullOfLies",
- "procInterrupts",
- "xinputExtensionDev",
- "overlayStderr",
- "overlayTextBackground", /* not saved -- X resources only */
- "overlayTextForeground", /* not saved -- X resources only */
- "bourneShell", /* not saved -- X resources only */
- "authWarningSlack",
- 0
-};
static char *
strip (char *s)
@@ -336,85 +45,49 @@ strip (char *s)
return s;
}
-
-/* Reading
- */
-
-static int
-handle_entry (XrmDatabase *db, const char *key, const char *value,
- const char *filename, int line)
-{
- int i;
- for (i = 0; prefs[i]; i++)
- if (*prefs[i] && !strcasecmp(key, prefs[i]))
- {
- char *val = strdup(value);
- char *spec = (char *) malloc(strlen(progclass) + strlen(prefs[i]) +10);
- strcpy(spec, progclass);
- strcat(spec, ".");
- strcat(spec, prefs[i]);
-
- XrmPutStringResource (db, spec, val);
-
- free(spec);
- free(val);
- return 0;
- }
-
- fprintf(stderr, "%s: %s:%d: unknown option \"%s\"\n",
- blurb(), filename, line, key);
- return 1;
-}
-
-static int
-parse_init_file (saver_preferences *p)
+/* Parse the .xscreensaver or XScreenSaver.ad file and run the callback
+ for each key-value pair.
+*/
+int
+parse_init_file (const char *name,
+ void (*handler) (int lineno,
+ const char *key, const char *val,
+ void *closure),
+ void *closure)
{
- time_t write_date = 0;
- const char *name = init_file_name();
int line = 0;
struct stat st;
FILE *in;
int buf_size = 1024;
- char *buf;
+ char *buf = 0;
if (!name) return 0;
+ if (stat (name, &st) != 0) goto FAIL;
- if (stat(name, &st) != 0)
- {
- p->init_file_date = 0;
- return 0;
- }
+ buf = (char *) malloc (buf_size);
+ if (!buf) goto FAIL;
in = fopen(name, "r");
if (!in)
{
- char *buf = (char *) malloc(1024 + strlen(name));
- sprintf(buf, "%s: error reading \"%s\"", blurb(), name);
- perror(buf);
- free(buf);
- return -1;
+ sprintf (buf, "%s: error reading \"%.100s\"", blurb(), name);
+ perror (buf);
+ goto FAIL;
}
- if (fstat (fileno(in), &st) == 0)
+ if (fstat (fileno (in), &st) != 0)
{
- write_date = st.st_mtime;
- }
- else
- {
- char *buf = (char *) malloc(1024 + strlen(name));
- sprintf(buf, "%s: couldn't re-stat \"%s\"", blurb(), name);
- perror(buf);
- free(buf);
+ sprintf (buf, "%s: couldn't re-stat \"%.100s\"", blurb(), name);
+ perror (buf);
+ free (buf);
return -1;
}
- buf = (char *) malloc(buf_size);
-
while (fgets (buf, buf_size-1, in))
{
char *key, *value;
- int L = strlen(buf);
+ int L = strlen (buf);
line++;
while (L > 2 &&
@@ -427,13 +100,13 @@ parse_init_file (saver_preferences *p)
L -= 2;
}
buf_size += 1024;
- buf = (char *) realloc(buf, buf_size);
- if (!buf) exit(1);
+ buf = (char *) realloc (buf, buf_size);
+ if (!buf) goto FAIL;
line++;
if (!fgets (buf + L, buf_size-L-1, in))
break;
- L = strlen(buf);
+ L = strlen (buf);
}
/* Now handle other backslash escapes. */
@@ -455,7 +128,7 @@ parse_init_file (saver_preferences *p)
}
}
- key = strip(buf);
+ key = strip (buf);
if (*key == '#' || *key == '!' || *key == ';' ||
*key == '\n' || *key == 0)
@@ -464,1320 +137,23 @@ parse_init_file (saver_preferences *p)
value = strchr (key, ':');
if (!value)
{
- fprintf(stderr, "%s: %s:%d: unparsable line: %s\n", blurb(),
- name, line, key);
+ fprintf (stderr, "%s: %s:%d: unparsable line: %s\n", blurb(),
+ name, line, key);
continue;
}
else
{
*value++ = 0;
- value = strip(value);
+ value = strip (value);
}
- if (!p->db) abort();
- handle_entry (&p->db, key, value, name, line);
+ handler (line, key, value, closure);
}
fclose (in);
- free(buf);
-
- p->init_file_date = write_date;
+ free (buf);
return 0;
-}
-
-
-Bool
-init_file_changed_p (saver_preferences *p)
-{
- const char *name = init_file_name();
- struct stat st;
-
- if (!name) return False;
-
- if (stat(name, &st) != 0)
- return False;
-
- if (p->init_file_date == st.st_mtime)
- return False;
-
- return True;
-}
-
-
-/* Writing
- */
-
-static int
-tab_to (FILE *out, int from, int to)
-{
- int tab_width = 8;
- int to_mod = (to / tab_width) * tab_width;
- while (from < to_mod)
- {
- fprintf(out, "\t");
- from = (((from / tab_width) + 1) * tab_width);
- }
- while (from < to)
- {
- fprintf(out, " ");
- from++;
- }
- return from;
-}
-
-static char *
-stab_to (char *out, int from, int to)
-{
- int tab_width = 8;
- int to_mod = (to / tab_width) * tab_width;
- while (from < to_mod)
- {
- *out++ = '\t';
- from = (((from / tab_width) + 1) * tab_width);
- }
- while (from < to)
- {
- *out++ = ' ';
- from++;
- }
- return out;
-}
-
-static int
-string_columns (const char *string, int length, int start)
-{
- int tab_width = 8;
- int col = start;
- const char *end = string + length;
- while (string < end)
- {
- if (*string == '\n')
- col = 0;
- else if (*string == '\t')
- col = (((col / tab_width) + 1) * tab_width);
- else
- col++;
- string++;
- }
- return col;
-}
-
-
-static void
-write_entry (FILE *out, const char *key, const char *value)
-{
- char *v = strdup(value ? value : "");
- char *v2 = v;
- char *nl = 0;
- int col;
- Bool programs_p = (!strcmp(key, "programs"));
- int tab = (programs_p ? 32 : 16);
- Bool first = True;
-
- fprintf(out, "%s:", key);
- col = strlen(key) + 1;
-
- if (strlen(key) > 14)
- col = tab_to (out, col, 20);
-
- while (1)
- {
- if (!programs_p)
- v2 = strip(v2);
- nl = strchr(v2, '\n');
- if (nl)
- *nl = 0;
-
- if (first && programs_p)
- {
- col = tab_to (out, col, 77);
- fprintf (out, " \\\n");
- col = 0;
- }
-
- if (first)
- first = False;
- else
- {
- col = tab_to (out, col, 75);
- fprintf (out, " \\n\\\n");
- col = 0;
- }
-
- if (!programs_p)
- col = tab_to (out, col, tab);
-
- if (programs_p &&
- string_columns(v2, strlen (v2), col) + col > 75)
- {
- int L = strlen (v2);
- int start = 0;
- int end = start;
- while (start < L)
- {
- while (v2[end] == ' ' || v2[end] == '\t')
- end++;
- while (v2[end] != ' ' && v2[end] != '\t' &&
- v2[end] != '\n' && v2[end] != 0)
- end++;
- if (string_columns (v2 + start, (end - start), col) >= 74)
- {
- col = tab_to (out, col, 75);
- fprintf(out, " \\\n");
- col = tab_to (out, 0, tab + 2);
- while (v2[start] == ' ' || v2[start] == '\t')
- start++;
- }
-
- col = string_columns (v2 + start, (end - start), col);
- while (start < end)
- fputc(v2[start++], out);
- }
- }
- else
- {
- fprintf (out, "%s", v2);
- col += string_columns(v2, strlen (v2), col);
- }
-
- if (nl)
- v2 = nl + 1;
- else
- break;
- }
-
- fprintf(out, "\n");
- free(v);
-}
-
-int
-write_init_file (Display *dpy,
- saver_preferences *p, const char *version_string,
- Bool verbose_p)
-{
- int status = -1;
- const char *name = init_file_name();
- const char *tmp_name = init_file_tmp_name();
- char *n2 = chase_symlinks (name);
- struct stat st;
- int i, j;
-
- /* Kludge, since these aren't in the saver_preferences struct as strings...
- */
- char *visual_name;
- char *programs;
- Bool overlay_stderr_p;
- char *stderr_font;
- FILE *out;
-
- if (!name) goto END;
-
- if (n2) name = n2;
-
- /* Throttle the various timeouts to reasonable values before writing
- the file to disk. */
- stop_the_insanity (p);
-
-
- if (verbose_p)
- fprintf (stderr, "%s: writing \"%s\".\n", blurb(), name);
-
- unlink (tmp_name);
- out = fopen(tmp_name, "w");
- if (!out)
- {
- char *buf = (char *) malloc(1024 + strlen(name));
- sprintf(buf, "%s: error writing \"%s\"", blurb(), name);
- perror(buf);
- free(buf);
- goto END;
- }
-
- /* Give the new .xscreensaver file the same permissions as the old one;
- except ensure that it is readable and writable by owner, and not
- executable. Extra hack: if we're running as root, make the file
- be world-readable (so that the daemon, running as "nobody", will
- still be able to read it.)
- */
- if (stat(name, &st) == 0)
- {
- mode_t mode = st.st_mode;
- mode |= S_IRUSR | S_IWUSR; /* read/write by user */
- mode &= ~(S_IXUSR | S_IXGRP | S_IXOTH); /* executable by none */
-
- if (getuid() == (uid_t) 0) /* read by group/other */
- mode |= S_IRGRP | S_IROTH;
-
- if (fchmod (fileno(out), mode) != 0)
- {
- char *buf = (char *) malloc(1024 + strlen(name));
- sprintf (buf, "%s: error fchmodding \"%s\" to 0%o", blurb(),
- tmp_name, (unsigned int) mode);
- perror(buf);
- free(buf);
- goto END;
- }
- }
-
- /* Kludge, since these aren't in the saver_preferences struct... */
- visual_name = get_string_resource (dpy, "visualID", "VisualID");
- programs = 0;
- overlay_stderr_p = get_boolean_resource (dpy, "overlayStderr", "Boolean");
- stderr_font = get_string_resource (dpy, "font", "Font");
-
- i = 0;
- {
- char *ss;
- char **hack_strings = (char **)
- calloc (p->screenhacks_count, sizeof(char *));
-
- for (j = 0; j < p->screenhacks_count; j++)
- {
- hack_strings[j] = format_hack (dpy, p->screenhacks[j], True);
- i += strlen (hack_strings[j]);
- i += 2;
- }
-
- ss = programs = (char *) malloc(i + 10);
- *ss = 0;
- for (j = 0; j < p->screenhacks_count; j++)
- {
- strcat (ss, hack_strings[j]);
- free (hack_strings[j]);
- ss += strlen(ss);
- *ss++ = '\n';
- *ss = 0;
- }
- free (hack_strings);
- }
-
- {
- struct passwd *pw = getpwuid (getuid ());
- char *whoami = (pw && pw->pw_name && *pw->pw_name
- ? pw->pw_name
- : "<unknown>");
- time_t now = time ((time_t *) 0);
- char *timestr = (char *) ctime (&now);
- char *nl = (char *) strchr (timestr, '\n');
- if (nl) *nl = 0;
- fprintf (out,
- "# %s Preferences File\n"
- "# Written by %s %s for %s on %s.\n"
- "# https://www.jwz.org/xscreensaver/\n"
- "\n",
- progclass, progname, version_string, whoami, timestr);
- }
-
- for (j = 0; prefs[j]; j++)
- {
- char buf[255];
- const char *pr = prefs[j];
- enum pref_type { pref_str, pref_int, pref_bool, pref_byte, pref_time
- } type = pref_str;
- const char *s = 0;
- int i = 0;
- Bool b = False;
- Time t = 0;
-
- if (pr && !*pr)
- {
- fprintf(out, "\n");
- continue;
- }
-
-# undef CHECK
-# define CHECK(X) else if (!strcmp(pr, X))
- if (!pr || !*pr) ;
- CHECK("timeout") type = pref_time, t = p->timeout;
- CHECK("cycle") type = pref_time, t = p->cycle;
- CHECK("lock") type = pref_bool, b = p->lock_p;
- CHECK("lockVTs") continue; /* don't save, unused */
- CHECK("lockTimeout") type = pref_time, t = p->lock_timeout;
- CHECK("passwdTimeout") type = pref_time, t = p->passwd_timeout;
- CHECK("visualID") type = pref_str, s = visual_name;
- CHECK("installColormap") type = pref_bool, b = p->install_cmap_p;
- CHECK("verbose") type = pref_bool, b = p->verbose_p;
- CHECK("timestamp") type = pref_bool, b = p->timestamp_p;
- CHECK("splash") type = pref_bool, b = p->splash_p;
- CHECK("splashDuration") type = pref_time, t = p->splash_duration;
-# ifdef QUAD_MODE
- CHECK("quad") type = pref_bool, b = p->quad_p;
-# else /* !QUAD_MODE */
- CHECK("quad") continue; /* don't save */
-# endif /* !QUAD_MODE */
- CHECK("demoCommand") type = pref_str, s = p->demo_command;
- CHECK("prefsCommand") type = pref_str, s = p->prefs_command;
-/* CHECK("helpURL") type = pref_str, s = p->help_url; */
- CHECK("helpURL") continue; /* don't save */
-/* CHECK("loadURL") type = pref_str, s = p->load_url_command; */
- CHECK("loadURL") continue; /* don't save */
-/* CHECK("newLoginCommand") type = pref_str, s = p->new_login_command; */
- CHECK("newLoginCommand") continue; /* don't save */
- CHECK("externalUngrabCommand") continue; /* don't save */
- CHECK("nice") type = pref_int, i = p->nice_inferior;
- CHECK("memoryLimit") type = pref_byte, i = p->inferior_memory_limit;
- CHECK("fade") type = pref_bool, b = p->fade_p;
- CHECK("unfade") type = pref_bool, b = p->unfade_p;
- CHECK("fadeSeconds") type = pref_time, t = p->fade_seconds;
- CHECK("fadeTicks") type = pref_int, i = p->fade_ticks;
- CHECK("captureStderr") type = pref_bool, b = p->capture_stderr_p;
- CHECK("captureStdout") continue; /* don't save */
- CHECK("logFile") continue; /* don't save */
- CHECK("ignoreUninstalledPrograms")
- type = pref_bool, b = p->ignore_uninstalled_p;
-
- CHECK("font") type = pref_str, s = stderr_font;
-
- CHECK("dpmsEnabled") type = pref_bool, b = p->dpms_enabled_p;
- CHECK("dpmsQuickOff") type = pref_bool, b = p->dpms_quickoff_p;
- CHECK("dpmsStandby") type = pref_time, t = p->dpms_standby;
- CHECK("dpmsSuspend") type = pref_time, t = p->dpms_suspend;
- CHECK("dpmsOff") type = pref_time, t = p->dpms_off;
- CHECK("dpmsFullThrottle") continue; /* don't save */
-
- CHECK("grabDesktopImages") type =pref_bool, b = p->grab_desktop_p;
- CHECK("grabVideoFrames") type =pref_bool, b = p->grab_video_p;
- CHECK("chooseRandomImages")type =pref_bool, b = p->random_image_p;
- CHECK("imageDirectory") type =pref_str, s = p->image_directory;
-
- CHECK("mode") type = pref_str,
- s = (p->mode == ONE_HACK ? "one" :
- p->mode == BLANK_ONLY ? "blank" :
- p->mode == DONT_BLANK ? "off" :
- p->mode == RANDOM_HACKS_SAME
- ? "random-same"
- : "random");
- CHECK("selected") type = pref_int, i = p->selected_hack;
-
- CHECK("textMode") type = pref_str,
- s = (p->tmode == TEXT_URL ? "url" :
- p->tmode == TEXT_LITERAL ? "literal" :
- p->tmode == TEXT_FILE ? "file" :
- p->tmode == TEXT_PROGRAM ? "program" :
- "date");
- CHECK("textLiteral") type = pref_str, s = p->text_literal;
- CHECK("textFile") type = pref_str, s = p->text_file;
- CHECK("textProgram") type = pref_str, s = p->text_program;
- CHECK("textURL") type = pref_str, s = p->text_url;
-
- CHECK("programs") type = pref_str, s = programs;
- CHECK("pointerPollTime") type = pref_time, t = p->pointer_timeout;
- CHECK("pointerHysteresis")type = pref_int, i = p->pointer_hysteresis;
- CHECK("windowCreationTimeout")type=pref_time,t= p->notice_events_timeout;
- CHECK("initialDelay") type = pref_time, t = p->initial_delay;
- CHECK("sgiSaverExtension") continue; /* don't save */
- CHECK("mitSaverExtension") continue; /* don't save */
- CHECK("xidleExtension") continue; /* don't save */
- CHECK("procInterrupts") type = pref_bool, b = p->use_proc_interrupts;
- CHECK("xinputExtensionDev") type = pref_bool, b = p->use_xinput_extension;
- CHECK("GetViewPortIsFullOfLies") type = pref_bool,
- b = p->getviewport_full_of_lies_p;
- CHECK("overlayStderr") type = pref_bool, b = overlay_stderr_p;
- CHECK("overlayTextBackground") continue; /* don't save */
- CHECK("overlayTextForeground") continue; /* don't save */
- CHECK("bourneShell") continue; /* don't save */
- CHECK("authWarningSlack") type = pref_int, i = p->auth_warning_slack;
- else abort();
-# undef CHECK
-
- switch (type)
- {
- case pref_str:
- break;
- case pref_int:
- sprintf(buf, "%d", i);
- s = buf;
- break;
- case pref_bool:
- s = b ? "True" : "False";
- break;
- case pref_time:
- {
- unsigned int hour = 0, min = 0, sec = (unsigned int) (t/1000);
- if (sec >= 60)
- {
- min += (sec / 60);
- sec %= 60;
- }
- if (min >= 60)
- {
- hour += (min / 60);
- min %= 60;
- }
- sprintf (buf, "%u:%02u:%02u", hour, min, sec);
- s = buf;
- }
- break;
- case pref_byte:
- {
- if (i >= (1<<30) && i == ((i >> 30) << 30))
- sprintf(buf, "%dG", i >> 30);
- else if (i >= (1<<20) && i == ((i >> 20) << 20))
- sprintf(buf, "%dM", i >> 20);
- else if (i >= (1<<10) && i == ((i >> 10) << 10))
- sprintf(buf, "%dK", i >> 10);
- else
- sprintf(buf, "%d", i);
- s = buf;
- }
- break;
- default:
- abort();
- break;
- }
-
- if (pr && (!strcmp(pr, "mode") || !strcmp(pr, "textMode")))
- fprintf(out, "\n");
-
- write_entry (out, pr, s);
- }
-
- fprintf(out, "\n");
-
- if (visual_name) free(visual_name);
- if (stderr_font) free(stderr_font);
- if (programs) free(programs);
-
- if (fclose(out) == 0)
- {
- time_t write_date = 0;
-
- if (stat(tmp_name, &st) == 0)
- {
- write_date = st.st_mtime;
- }
- else
- {
- char *buf = (char *) malloc(1024 + strlen(tmp_name) + strlen(name));
- sprintf(buf, "%s: couldn't stat \"%s\"", blurb(), tmp_name);
- perror(buf);
- unlink (tmp_name);
- free(buf);
- goto END;
- }
-
- if (rename (tmp_name, name) != 0)
- {
- char *buf = (char *) malloc(1024 + strlen(tmp_name) + strlen(name));
- sprintf(buf, "%s: error renaming \"%s\" to \"%s\"",
- blurb(), tmp_name, name);
- perror(buf);
- unlink (tmp_name);
- free(buf);
- goto END;
- }
- else
- {
- p->init_file_date = write_date;
-
- /* Since the .xscreensaver file is used for IPC, let's try and make
- sure that the bits actually land on the disk right away. */
- sync ();
-
- status = 0; /* wrote and renamed successfully! */
- }
- }
- else
- {
- char *buf = (char *) malloc(1024 + strlen(name));
- sprintf(buf, "%s: error closing \"%s\"", blurb(), name);
- perror(buf);
- free(buf);
- unlink (tmp_name);
- goto END;
- }
-
- END:
- if (n2) free (n2);
- return status;
-}
-
-
-/* Parsing the resource database
- */
-
-void
-free_screenhack (screenhack *hack)
-{
- if (hack->visual) free (hack->visual);
- if (hack->name) free (hack->name);
- free (hack->command);
- memset (hack, 0, sizeof(*hack));
- free (hack);
-}
-
-static void
-free_screenhack_list (screenhack **list, int count)
-{
- int i;
- if (!list) return;
- for (i = 0; i < count; i++)
- if (list[i])
- free_screenhack (list[i]);
- free (list);
-}
-
-
-
-/* Populate `saver_preferences' with the contents of the resource database.
- Note that this may be called multiple times -- it is re-run each time
- the ~/.xscreensaver file is reloaded.
-
- This function can be very noisy, since it issues resource syntax errors
- and so on.
- */
-void
-load_init_file (Display *dpy, saver_preferences *p)
-{
- static Bool first_time = True;
-
- screenhack **system_default_screenhacks = 0;
- int system_default_screenhack_count = 0;
-
- if (first_time)
- {
- /* Get the programs resource before the .xscreensaver file has been
- parsed and merged into the resource database for the first time:
- this is the value of *programs from the app-defaults file.
- Then clear it out so that it will be parsed again later, after
- the init file has been read.
- */
- get_screenhacks (dpy, p);
- system_default_screenhacks = p->screenhacks;
- system_default_screenhack_count = p->screenhacks_count;
- p->screenhacks = 0;
- p->screenhacks_count = 0;
- }
-
- if (parse_init_file (p) != 0) /* file might have gone away */
- if (!first_time) return;
-
- first_time = False;
-
- p->xsync_p = get_boolean_resource (dpy, "synchronous", "Synchronous");
- p->verbose_p = get_boolean_resource (dpy, "verbose", "Boolean");
- p->timestamp_p = get_boolean_resource (dpy, "timestamp", "Boolean");
- p->lock_p = get_boolean_resource (dpy, "lock", "Boolean");
- p->fade_p = get_boolean_resource (dpy, "fade", "Boolean");
- p->unfade_p = get_boolean_resource (dpy, "unfade", "Boolean");
- p->fade_seconds = 1000 * get_seconds_resource (dpy, "fadeSeconds", "Time");
- p->fade_ticks = get_integer_resource (dpy, "fadeTicks", "Integer");
- p->install_cmap_p = get_boolean_resource (dpy, "installColormap", "Boolean");
- p->nice_inferior = get_integer_resource (dpy, "nice", "Nice");
- p->inferior_memory_limit = get_byte_resource (dpy, "memoryLimit",
- "MemoryLimit");
- p->splash_p = get_boolean_resource (dpy, "splash", "Boolean");
-# ifdef QUAD_MODE
- p->quad_p = get_boolean_resource (dpy, "quad", "Boolean");
-# endif
- p->capture_stderr_p = get_boolean_resource (dpy, "captureStderr", "Boolean");
- p->ignore_uninstalled_p = get_boolean_resource (dpy,
- "ignoreUninstalledPrograms",
- "Boolean");
-
- p->initial_delay = 1000 * get_seconds_resource (dpy, "initialDelay", "Time");
- p->splash_duration = 1000 * get_seconds_resource (dpy, "splashDuration", "Time");
- p->timeout = 1000 * get_minutes_resource (dpy, "timeout", "Time");
- p->lock_timeout = 1000 * get_minutes_resource (dpy, "lockTimeout", "Time");
- p->cycle = 1000 * get_minutes_resource (dpy, "cycle", "Time");
- p->passwd_timeout = 1000 * get_seconds_resource (dpy, "passwdTimeout", "Time");
- p->pointer_timeout = 1000 * get_seconds_resource (dpy, "pointerPollTime", "Time");
- p->pointer_hysteresis = get_integer_resource (dpy, "pointerHysteresis","Integer");
- p->notice_events_timeout = 1000*get_seconds_resource(dpy,
- "windowCreationTimeout",
- "Time");
-
- p->dpms_enabled_p = get_boolean_resource (dpy, "dpmsEnabled", "Boolean");
- p->dpms_quickoff_p = get_boolean_resource (dpy, "dpmsQuickOff", "Boolean");
- p->dpms_standby = 1000 * get_minutes_resource (dpy, "dpmsStandby", "Time");
- p->dpms_suspend = 1000 * get_minutes_resource (dpy, "dpmsSuspend", "Time");
- p->dpms_off = 1000 * get_minutes_resource (dpy, "dpmsOff", "Time");
- p->dpms_full_throttle_p = get_boolean_resource (dpy, "dpmsFullThrottle", "Boolean");
-
- p->grab_desktop_p = get_boolean_resource (dpy, "grabDesktopImages", "Boolean");
- p->grab_video_p = get_boolean_resource (dpy, "grabVideoFrames", "Boolean");
- p->random_image_p = get_boolean_resource (dpy, "chooseRandomImages", "Boolean");
- p->image_directory = get_string_resource (dpy,
- "imageDirectory",
- "ImageDirectory");
-
- p->text_literal = get_string_resource (dpy, "textLiteral", "TextLiteral");
- p->text_file = get_string_resource (dpy, "textFile", "TextFile");
- p->text_program = get_string_resource (dpy, "textProgram", "TextProgram");
- p->text_url = get_string_resource (dpy, "textURL", "TextURL");
-
- p->shell = get_string_resource (dpy, "bourneShell", "BourneShell");
-
- p->demo_command = get_string_resource(dpy, "demoCommand", "URL");
- p->prefs_command = get_string_resource(dpy, "prefsCommand", "URL");
- p->help_url = get_string_resource(dpy, "helpURL", "URL");
- p->load_url_command = get_string_resource(dpy, "loadURL", "LoadURL");
- p->new_login_command = get_string_resource(dpy,
- "newLoginCommand",
- "NewLoginCommand");
- p->external_ungrab_command = get_string_resource(dpy,
- "externalUngrabCommand",
- "ExternalUngrabCommand");
- p->auth_warning_slack = get_integer_resource(dpy, "authWarningSlack",
- "Integer");
-
- /* If "*splash" is unset, default to true. */
- {
- char *s = get_string_resource (dpy, "splash", "Boolean");
- if (s)
- free (s);
- else
- p->splash_p = True;
- }
-
- /* If "*grabDesktopImages" is unset, default to true. */
- {
- char *s = get_string_resource (dpy, "grabDesktopImages", "Boolean");
- if (s)
- free (s);
- else
- p->grab_desktop_p = True;
- }
-
- p->use_xidle_extension = get_boolean_resource (dpy, "xidleExtension","Boolean");
-#if 0 /* obsolete. */
- p->use_sgi_saver_extension = get_boolean_resource (dpy,
- "sgiSaverExtension",
- "Boolean");
-#endif
-#ifdef HAVE_XINPUT
- p->use_xinput_extension = get_boolean_resource (dpy, "xinputExtensionDev",
- "Boolean");
-#endif
-#if 0 /* broken and evil. */
- p->use_mit_saver_extension = get_boolean_resource (dpy,
- "mitSaverExtension",
- "Boolean");
-#endif
-
- p->use_proc_interrupts = get_boolean_resource (dpy,
- "procInterrupts", "Boolean");
-
- p->getviewport_full_of_lies_p =
- get_boolean_resource (dpy, "GetViewPortIsFullOfLies", "Boolean");
-
- get_screenhacks (dpy, p); /* Parse the "programs" resource. */
-
- {
- char *s = get_string_resource (dpy, "selected", "Integer");
- if (!s || !*s)
- p->selected_hack = -1;
- else
- p->selected_hack = get_integer_resource (dpy, "selected", "Integer");
- if (s) free (s);
- if (p->selected_hack < 0 || p->selected_hack >= p->screenhacks_count)
- p->selected_hack = -1;
- }
-
- {
- char *s = get_string_resource (dpy, "mode", "Mode");
- if (s && !strcasecmp (s, "one")) p->mode = ONE_HACK;
- else if (s && !strcasecmp (s, "blank")) p->mode = BLANK_ONLY;
- else if (s && !strcasecmp (s, "off")) p->mode = DONT_BLANK;
- else if (s && !strcasecmp (s, "random-same")) p->mode = RANDOM_HACKS_SAME;
- else p->mode = RANDOM_HACKS;
- if (s) free (s);
- }
-
- {
- char *s = get_string_resource (dpy, "textMode", "TextMode");
- if (s && !strcasecmp (s, "url")) p->tmode = TEXT_URL;
- else if (s && !strcasecmp (s, "literal")) p->tmode = TEXT_LITERAL;
- else if (s && !strcasecmp (s, "file")) p->tmode = TEXT_FILE;
- else if (s && !strcasecmp (s, "program")) p->tmode = TEXT_PROGRAM;
- else p->tmode = TEXT_DATE;
- if (s) free (s);
- }
-
- if (system_default_screenhack_count) /* note: first_time is also true */
- {
- merge_system_screenhacks (dpy, p, system_default_screenhacks,
- system_default_screenhack_count);
- free_screenhack_list (system_default_screenhacks,
- system_default_screenhack_count);
- system_default_screenhacks = 0;
- system_default_screenhack_count = 0;
- }
-
- if (p->debug_p)
- {
- p->xsync_p = True;
- p->verbose_p = True;
- p->timestamp_p = True;
- p->initial_delay = 0;
- }
-
- /* Throttle the various timeouts to reasonable values after reading the
- disk file. */
- stop_the_insanity (p);
-}
-
-
-/* If there are any hacks in the system-wide defaults that are not in
- the ~/.xscreensaver file, add the new ones to the end of the list.
- This does *not* actually save the file.
- */
-static void
-merge_system_screenhacks (Display *dpy, saver_preferences *p,
- screenhack **system_list, int system_count)
-{
- /* Yeah yeah, this is an N^2 operation, but I don't have hashtables handy,
- so fuck it. */
-
- int made_space = 0;
- int i;
- for (i = 0; i < system_count; i++)
- {
- int j;
- Bool matched_p = False;
-
- for (j = 0; j < p->screenhacks_count; j++)
- {
- char *name;
- if (!system_list[i]->name)
- system_list[i]->name = make_hack_name (dpy,
- system_list[i]->command);
-
- name = p->screenhacks[j]->name;
- if (!name)
- name = make_hack_name (dpy, p->screenhacks[j]->command);
-
- matched_p = !strcasecmp (name, system_list[i]->name);
-
- if (name != p->screenhacks[j]->name)
- free (name);
-
- if (matched_p)
- break;
- }
-
- if (!matched_p)
- {
- /* We have an entry in the system-wide list that is not in the
- user's .xscreensaver file. Add it to the end.
- Note that p->screenhacks is a single malloc block, not a
- linked list, so we have to realloc it.
- */
- screenhack *oh = system_list[i];
- screenhack *nh = (screenhack *) malloc (sizeof(screenhack));
-
- if (made_space == 0)
- {
- made_space = 10;
- p->screenhacks = (screenhack **)
- realloc (p->screenhacks,
- (p->screenhacks_count + made_space + 1)
- * sizeof(screenhack));
- if (!p->screenhacks) abort();
- }
-
- nh->enabled_p = oh->enabled_p;
- nh->visual = oh->visual ? strdup(oh->visual) : 0;
- nh->name = oh->name ? strdup(oh->name) : 0;
- nh->command = oh->command ? strdup(oh->command) : 0;
-
- p->screenhacks[p->screenhacks_count++] = nh;
- p->screenhacks[p->screenhacks_count] = 0;
- made_space--;
-
-#if 0
- fprintf (stderr, "%s: noticed new hack: %s\n", blurb(),
- (nh->name ? nh->name : make_hack_name (dpy, nh->command)));
-#endif
- }
- }
-}
-
-
-
-/* Parsing the programs resource.
- */
-
-screenhack *
-parse_screenhack (const char *line)
-{
- screenhack *h = (screenhack *) calloc (1, sizeof(*h));
- const char *s;
-
- h->enabled_p = True;
-
- while (isspace(*line)) line++; /* skip whitespace */
- if (*line == '-') /* handle "-" */
- {
- h->enabled_p = False;
- line++;
- while (isspace(*line)) line++; /* skip whitespace */
- }
-
- s = line; /* handle "visual:" */
- while (*line && *line != ':' && *line != '"' && !isspace(*line))
- line++;
- if (*line != ':')
- line = s;
- else
- {
- h->visual = (char *) malloc (line-s+1);
- strncpy (h->visual, s, line-s);
- h->visual[line-s] = 0;
- if (*line == ':') line++; /* skip ":" */
- while (isspace(*line)) line++; /* skip whitespace */
- }
-
- if (*line == '"') /* handle "name" */
- {
- line++;
- s = line;
- while (*line && *line != '"')
- line++;
- h->name = (char *) malloc (line-s+1);
- strncpy (h->name, s, line-s);
- h->name[line-s] = 0;
- if (*line == '"') line++; /* skip "\"" */
- while (isspace(*line)) line++; /* skip whitespace */
- }
-
- h->command = format_command (line, False); /* handle command */
- return h;
-}
-
-
-static char *
-format_command (const char *cmd, Bool wrap_p)
-{
- int tab = 30;
- int col = tab;
- char *cmd2 = (char *) calloc (1, 2 * (strlen (cmd) + 1));
- const char *in = cmd;
- char *out = cmd2;
- while (*in)
- {
- /* shrink all whitespace to one space, for the benefit of the "demo"
- mode display. We only do this when we can easily tell that the
- whitespace is not significant (no shell metachars).
- */
- switch (*in)
- {
- case '\'': case '"': case '`': case '\\':
- /* Metachars are scary. Copy the rest of the line unchanged. */
- while (*in)
- *out++ = *in++, col++;
- break;
-
- case ' ': case '\t':
- /* Squeeze all other whitespace down to one space. */
- while (*in == ' ' || *in == '\t')
- in++;
- *out++ = ' ', col++;
- break;
-
- default:
- /* Copy other chars unchanged. */
- *out++ = *in++, col++;
- break;
- }
- }
-
- *out = 0;
-
- /* Strip trailing whitespace */
- while (out > cmd2 && isspace (out[-1]))
- *(--out) = 0;
-
- return cmd2;
-}
-
-
-/* Returns a new string describing the shell command.
- This may be just the name of the program, capitalized.
- It also may be something from the resource database (gotten
- by looking for "hacks.XYZ.name", where XYZ is the program.)
- */
-char *
-make_hack_name (Display *dpy, const char *shell_command)
-{
- char *s = strdup (shell_command);
- char *s2;
- char res_name[255];
-
- for (s2 = s; *s2; s2++) /* truncate at first whitespace */
- if (isspace (*s2))
- {
- *s2 = 0;
- break;
- }
-
- s2 = strrchr (s, '/'); /* if pathname, take last component */
- if (s2)
- {
- s2 = strdup (s2+1);
- free (s);
- s = s2;
- }
-
- if (strlen (s) > 50) /* 51 is hereby defined as "unreasonable" */
- s[50] = 0;
-
- sprintf (res_name, "hacks.%s.name", s); /* resource? */
- s2 = get_string_resource (dpy, res_name, res_name);
- if (s2)
- {
- free (s);
- return s2;
- }
-
- for (s2 = s; *s2; s2++) /* if it has any capitals, return it */
- if (*s2 >= 'A' && *s2 <= 'Z')
- return s;
-
- if (s[0] >= 'a' && s[0] <= 'z') /* else cap it */
- s[0] -= 'a'-'A';
- if (s[0] == 'X' && s[1] >= 'a' && s[1] <= 'z') /* (magic leading X) */
- s[1] -= 'a'-'A';
- if (s[0] == 'G' && s[1] == 'l' &&
- s[2] >= 'a' && s[2] <= 'z') /* (magic leading GL) */
- s[1] -= 'a'-'A',
- s[2] -= 'a'-'A';
- return s;
-}
-
-
-char *
-format_hack (Display *dpy, screenhack *hack, Bool wrap_p)
-{
- int tab = 32;
- int size;
- char *h2, *out, *s;
- int col = 0;
-
- char *def_name = make_hack_name (dpy, hack->command);
-
- /* Don't ever write out a name for a hack if it's the same as the default.
- */
- if (hack->name && !strcmp (hack->name, def_name))
- {
- free (hack->name);
- hack->name = 0;
- }
- free (def_name);
-
- size = (2 * (strlen(hack->command) +
- (hack->visual ? strlen(hack->visual) : 0) +
- (hack->name ? strlen(hack->name) : 0) +
- tab));
- h2 = (char *) malloc (size);
- out = h2;
-
- if (!hack->enabled_p) *out++ = '-'; /* write disabled flag */
-
- if (hack->visual && *hack->visual) /* write visual name */
- {
- if (hack->enabled_p) *out++ = ' ';
- *out++ = ' ';
- strcpy (out, hack->visual);
- out += strlen (hack->visual);
- *out++ = ':';
- *out++ = ' ';
- }
-
- *out = 0;
- col = string_columns (h2, strlen (h2), 0);
-
- if (hack->name && *hack->name) /* write pretty name */
- {
- int L = (strlen (hack->name) + 2);
- if (L + col < tab)
- out = stab_to (out, col, tab - L - 2);
- else
- *out++ = ' ';
- *out++ = '"';
- strcpy (out, hack->name);
- out += strlen (hack->name);
- *out++ = '"';
- *out = 0;
-
- col = string_columns (h2, strlen (h2), 0);
- if (wrap_p && col >= tab)
- out = stab_to (out, col, 77);
- else
- *out++ = ' ';
-
- if (out >= h2+size) abort();
- }
-
- *out = 0;
- col = string_columns (h2, strlen (h2), 0);
- out = stab_to (out, col, tab); /* indent */
-
- if (out >= h2+size) abort();
- s = format_command (hack->command, wrap_p);
- strcpy (out, s);
- out += strlen (s);
- free (s);
- *out = 0;
-
- return h2;
-}
-
-
-static void
-get_screenhacks (Display *dpy, saver_preferences *p)
-{
- int i, j;
- int start = 0;
- int end = 0;
- int size;
- char *d;
-
- d = get_string_resource (dpy, "monoPrograms", "MonoPrograms");
- if (d && !*d) { free(d); d = 0; }
- if (!d)
- d = get_string_resource (dpy, "colorPrograms", "ColorPrograms");
- if (d && !*d) { free(d); d = 0; }
-
- if (d)
- {
- fprintf (stderr,
- "%s: the `monoPrograms' and `colorPrograms' resources are obsolete;\n\
- see the manual for details.\n", blurb());
- free(d);
- }
-
- d = get_string_resource (dpy, "programs", "Programs");
-
- free_screenhack_list (p->screenhacks, p->screenhacks_count);
- p->screenhacks = 0;
- p->screenhacks_count = 0;
-
- if (!d || !*d)
- return;
-
- size = strlen (d);
-
-
- /* Count up the number of newlines (which will be equal to or larger than
- one less than the number of hacks.)
- */
- for (i = j = 0; d[i]; i++)
- if (d[i] == '\n')
- j++;
- j++;
-
- p->screenhacks = (screenhack **) calloc (j + 1, sizeof (screenhack *));
-
- /* Iterate over the lines in `d' (the string with newlines)
- and make new strings to stuff into the `screenhacks' array.
- */
- p->screenhacks_count = 0;
- while (start < size)
- {
- /* skip forward over whitespace. */
- while (d[start] == ' ' || d[start] == '\t' || d[start] == '\n')
- start++;
-
- /* skip forward to newline or end of string. */
- end = start;
- while (d[end] != 0 && d[end] != '\n')
- end++;
-
- /* null terminate. */
- d[end] = 0;
-
- p->screenhacks[p->screenhacks_count++] = parse_screenhack (d + start);
- if (p->screenhacks_count >= i)
- abort();
-
- start = end+1;
- }
-
- free (d);
-
- if (p->screenhacks_count == 0)
- {
- free (p->screenhacks);
- p->screenhacks = 0;
- }
-}
-
-
-/* Make sure all the values in the preferences struct are sane.
- */
-static void
-stop_the_insanity (saver_preferences *p)
-{
- if (p->passwd_timeout <= 0) p->passwd_timeout = 30000; /* 30 secs */
- if (p->timeout < 15000) p->timeout = 15000; /* 15 secs */
- if (p->cycle != 0 && p->cycle < 2000) p->cycle = 2000; /* 2 secs */
- if (p->pointer_timeout <= 0) p->pointer_timeout = 5000; /* 5 secs */
- if (p->notice_events_timeout <= 0)
- p->notice_events_timeout = 10000; /* 10 secs */
- if (p->fade_seconds <= 0 || p->fade_ticks <= 0)
- p->fade_p = False;
- if (! p->fade_p) p->unfade_p = False;
-
- /* The DPMS settings may have the value 0.
- But if they are negative, or are a range less than 10 seconds,
- reset them to sensible defaults. (Since that must be a mistake.)
- */
- if (p->dpms_standby != 0 &&
- p->dpms_standby < 10 * 1000)
- p->dpms_standby = 2 * 60 * 60 * 1000; /* 2 hours */
- if (p->dpms_suspend != 0 &&
- p->dpms_suspend < 10 * 1000)
- p->dpms_suspend = 2 * 60 * 60 * 1000; /* 2 hours */
- if (p->dpms_off != 0 &&
- p->dpms_off < 10 * 1000)
- p->dpms_off = 4 * 60 * 60 * 1000; /* 4 hours */
-
- /* suspend may not be greater than off, unless off is 0.
- standby may not be greater than suspend, unless suspend is 0.
- */
- if (p->dpms_off != 0 &&
- p->dpms_suspend > p->dpms_off)
- p->dpms_suspend = p->dpms_off;
- if (p->dpms_suspend != 0 &&
- p->dpms_standby > p->dpms_suspend)
- p->dpms_standby = p->dpms_suspend;
-
- /* These fixes above ignores the case
- suspend = 0 and standby > off ...
- */
- if (p->dpms_off != 0 &&
- p->dpms_standby > p->dpms_off)
- p->dpms_standby = p->dpms_off;
-
-
- if (p->dpms_standby == 0 && /* if *all* are 0, then DPMS is disabled */
- p->dpms_suspend == 0 &&
- p->dpms_off == 0 &&
- !(p->dpms_quickoff_p) /* ... but we want to do DPMS quick off */
- )
- p->dpms_enabled_p = False;
-
-
- /* Set watchdog timeout to about half of the cycle timeout, but
- don't let it be faster than 1/2 minute or slower than 1 minute.
- */
- p->watchdog_timeout = p->cycle * 0.6;
- if (p->watchdog_timeout < 27000) p->watchdog_timeout = 27000; /* 27 secs */
- if (p->watchdog_timeout > 57000) p->watchdog_timeout = 57000; /* 57 secs */
-
- if (p->pointer_hysteresis < 0) p->pointer_hysteresis = 0;
-/* if (p->pointer_hysteresis > 100) p->pointer_hysteresis = 100; */
-
- if (p->auth_warning_slack < 0) p->auth_warning_slack = 0;
- if (p->auth_warning_slack > 300) p->auth_warning_slack = 300;
-}
-
-
-Bool
-senesculent_p (void)
-{
- /* If you are in here because you're planning on disabling this warning
- before redistributing my software, please don't.
-
- I sincerely request that you do one of the following:
-
- 1: leave this code intact and this warning in place, -OR-
-
- 2: Remove xscreensaver from your distribution.
-
- I would seriously prefer that you not distribute my software at all
- than that you distribute one version and then never update it for
- years.
-
- I am *constantly* getting email from users reporting bugs that have
- been fixed for literally years who have no idea that the software
- they are running is years out of date. Yes, it would be great if we
- lived in the ideal world where people checked that they were running
- the latest release before they report a bug, but we don't. To most
- people, "running the latest release" is synonymous with "running the
- latest release that my distro packages for me."
-
- When they even bother to tell me what version they're running, I
- say, "That version is three years old!", and they say "But this is
- the latest version my distro ships". Then I say, "your distro
- sucks", and they say "but I don't know how to compile from source,
- herp derp I eat paste", and *everybody* goes away unhappy.
-
- It wastes an enormous amount of my time, but worse than that, it
- does a grave disservice to the users, who are stuck experiencing
- bugs that are already fixed! These users think they are running the
- latest release, and they are not. They would like to be running the
- actual latest release, but they don't know how, because their distro
- makes that very difficult for them. It's terrible for everyone, and
- kind of makes me regret ever having released this software in the
- first place.
-
- So seriously. I ask that if you're planning on disabling this
- obsolescence warning, that you instead just remove xscreensaver from
- your distro entirely. Everybody will be happier that way. Check
- out gnome-screensaver instead, I understand it's really nice.
-
- Of course, my license allows you to ignore me and do whatever the
- fuck you want, but as the author, I hope you will have the common
- courtesy of complying with my request.
-
- Thank you!
-
- jwz, 2014, 2016, 2018.
-
- PS: In particular, since Debian refuses to upgrade software on any
- kind of rational timeline, I have asked that they stop shipping
- xscreensaver at all. They have refused. Instead of upgrading the
- software, they simply patched out this warning.
-
- If you want to witness the sad state of the open source peanut
- gallery, look no farther than the comments on my blog:
- http://jwz.org/b/yiYo
-
- Many of these people fall back on their go-to argument of, "If it is
- legal, it must be right." If you believe in that rhetorical device
- then you are a terrible person, and possibly a sociopath.
-
- There are also the armchair lawyers who say "Well, instead of
- *asking* people to do the right thing out of common courtesy, you
- should just change your license to prohibit them from acting
- amorally." Again, this is the answer of a sociopath, but that aside,
- if you devote even a second's thought to this you will realize that
- the end result of this would be for distros like Debian to just keep
- shipping the last version with the old license and then never
- upgrading it again -- which would be the worst possible outcome for
- everyone involved, most especially the users.
- */
- time_t now = time ((time_t *) 0); /* d */
- struct tm *tm = localtime (&now); /* o */
- const char *s = screensaver_id; /* n */
- char mon[4], year[5]; /* ' */
- int m, y, mrnths; /* t */
- s = strchr (s, ' '); if (!s) abort(); s++; /* */
- s = strchr (s, '('); if (!s) abort(); s++; /* d */
- s = strchr (s, '-'); if (!s) abort(); s++; /* o */
- strncpy (mon, s, 3); /* o */
- mon[3] = 0; /* */
- s = strchr (s, '-'); if (!s) abort(); s++; /* e */
- strncpy (year, s, 4); /* e */
- year[4] = 0; /* t */
- y = atoi (year); /* , */
- if (!strcmp(mon, "Jan")) m = 0; /* */
- else if (!strcmp(mon, "Feb")) m = 1; /* s */
- else if (!strcmp(mon, "Mar")) m = 2; /* t */
- else if (!strcmp(mon, "Apr")) m = 3; /* o */
- else if (!strcmp(mon, "May")) m = 4; /* p */
- else if (!strcmp(mon, "Jun")) m = 5; /* , */
- else if (!strcmp(mon, "Jul")) m = 6; /* */
- else if (!strcmp(mon, "Aug")) m = 7; /* s */
- else if (!strcmp(mon, "Sep")) m = 8; /* t */
- else if (!strcmp(mon, "Oct")) m = 9; /* a */
- else if (!strcmp(mon, "Nov")) m = 10; /* a */
- else if (!strcmp(mon, "Dec")) m = 11; /* a */
- else abort(); /* h */
- mrnths = ((((tm->tm_year + 1900) * 12) + tm->tm_mon) - /* h */
- (y * 12 + m)); /* h */
- /* p */
- return (mrnths >= 34); /* . */
+ FAIL:
+ if (buf) free (buf);
+ return -1;
}
diff --git a/driver/prefs.h b/driver/prefs.h
index c494eaf..14d5542 100644
--- a/driver/prefs.h
+++ b/driver/prefs.h
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1993-2018 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 1993-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -12,28 +12,10 @@
#ifndef __XSCREENSAVER_PREFS_H__
#define __XSCREENSAVER_PREFS_H__
-#include "types.h"
-
-extern void load_init_file (Display *, saver_preferences *);
-extern Bool init_file_changed_p (saver_preferences *);
-extern int write_init_file (Display *,
- saver_preferences *, const char *version_string,
- Bool verbose_p);
-const char *init_file_name (void);
-extern Bool senesculent_p (void);
-
-extern screenhack *parse_screenhack (const char *line);
-extern void free_screenhack (screenhack *);
-extern char *format_hack (Display *, screenhack *, Bool wrap_p);
-char *make_hack_name (Display *, const char *shell_command);
-
-/* From dpms.c */
-extern void sync_server_dpms_settings (Display *, Bool enabled_p,
- Bool dpms_quickoff_p,
- int standby_secs, int suspend_secs,
- int off_secs,
- Bool verbose_p);
-
-extern void store_dpms_offset(int offset);
+extern int parse_init_file (const char *name,
+ void (*handler) (int lineno,
+ const char *key, const char *val,
+ void *closure),
+ void *closure);
#endif /* __XSCREENSAVER_PREFS_H__ */
diff --git a/driver/prefsw.c b/driver/prefsw.c
new file mode 100644
index 0000000..654016c
--- /dev/null
+++ b/driver/prefsw.c
@@ -0,0 +1,1561 @@
+/* prefs.c --- reading and writing the ~/.xscreensaver file.
+ * xscreensaver, Copyright © 1998-2021 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <time.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/param.h> /* for PATH_MAX */
+#include <pwd.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xresource.h>
+#include <X11/Intrinsic.h>
+
+#include "version.h"
+#include "types.h"
+#include "prefs.h"
+#include "resources.h"
+#include "blurb.h"
+
+/* don't use realpath() on fedora system */
+#ifdef _FORTIFY_SOURCE
+# undef HAVE_REALPATH
+#endif
+
+
+extern char *progclass;
+
+static void get_screenhacks (Display *, saver_preferences *);
+static char *format_command (const char *cmd, Bool wrap_p);
+static void merge_system_screenhacks (Display *, saver_preferences *,
+ screenhack **system_list, int count);
+static void stop_the_insanity (saver_preferences *p);
+
+static char *format_hack (Display *, screenhack *, Bool wrap_p);
+
+static char *
+chase_symlinks (const char *file)
+{
+# ifdef HAVE_REALPATH
+ if (file)
+ {
+# ifndef PATH_MAX
+# ifdef MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+# else
+# define PATH_MAX 2048
+# endif
+# endif
+ char buf[PATH_MAX];
+ if (realpath (file, buf))
+ return strdup (buf);
+
+/* sprintf (buf, "%.100s: realpath %.200s", blurb(), file);
+ perror(buf);*/
+ }
+# endif /* HAVE_REALPATH */
+ return 0;
+}
+
+
+static Bool
+i_am_a_nobody (uid_t uid)
+{
+ struct passwd *p;
+
+ p = getpwnam ("nobody");
+ if (! p) p = getpwnam ("noaccess");
+ if (! p) p = getpwnam ("daemon");
+
+ if (! p) /* There is no nobody? */
+ return False;
+
+ return (uid == p->pw_uid);
+}
+
+
+const char *
+init_file_name (void)
+{
+ static char *file = 0;
+
+ if (!file)
+ {
+ uid_t uid = getuid ();
+ const char *home = getenv("HOME");
+
+ if (i_am_a_nobody (uid) || !home || !*home)
+ {
+ /* If we're running as nobody, then use root's .xscreensaver file
+ (since ~root/.xscreensaver and ~nobody/.xscreensaver are likely
+ to be different -- without this, xscreensaver-settings would
+ appear to have no effect when the luser is running as root.)
+ */
+ struct passwd *p = getpwuid (uid);
+ if (!p || !p->pw_name || !*p->pw_name)
+ {
+ fprintf (stderr, "%s: couldn't get user info of uid %d\n",
+ blurb(), getuid ());
+ }
+ else if (!p->pw_dir || !*p->pw_dir)
+ {
+ fprintf (stderr, "%s: couldn't get home directory of \"%s\"\n",
+ blurb(), (p->pw_name ? p->pw_name : "???"));
+ }
+ else
+ {
+ home = p->pw_dir;
+ }
+ }
+ if (home && *home)
+ {
+ const char *name = ".xscreensaver";
+ file = (char *) malloc(strlen(home) + strlen(name) + 2);
+ strcpy(file, home);
+ if (!*home || home[strlen(home)-1] != '/')
+ strcat(file, "/");
+ strcat(file, name);
+ }
+ else
+ {
+ file = "";
+ }
+ }
+
+ if (file && *file)
+ return file;
+ else
+ return 0;
+}
+
+
+static const char *
+init_file_tmp_name (void)
+{
+ static char *file = 0;
+ if (!file)
+ {
+ const char *name = init_file_name();
+ const char *suffix = ".tmp";
+
+ char *n2 = chase_symlinks (name);
+ if (n2) name = n2;
+
+ if (!name || !*name)
+ file = "";
+ else
+ {
+ file = (char *) malloc(strlen(name) + strlen(suffix) + 2);
+ strcpy(file, name);
+ strcat(file, suffix);
+ }
+
+ if (n2) free (n2);
+ }
+
+ if (file && *file)
+ return file;
+ else
+ return 0;
+}
+
+static const char * const prefs[] = {
+ "timeout",
+ "cycle",
+ "lock",
+ "lockVTs", /* not saved */
+ "lockTimeout",
+ "passwdTimeout",
+ "visualID",
+ "installColormap",
+ "verbose",
+ "splash",
+ "splashDuration",
+ "quad",
+ "demoCommand",
+ "prefsCommand",
+ "newLoginCommand",
+ "helpURL", /* not saved */
+ "loadURL", /* not saved */
+ "newLoginCommand", /* not saved */
+ "externalUngrabCommand", /* not saved */
+ "nice",
+ "memoryLimit", /* not saved */
+ "fade",
+ "unfade",
+ "fadeSeconds",
+ "fadeTicks", /* not saved */
+ "logFile", /* not saved */
+ "ignoreUninstalledPrograms",
+ "font",
+ "dpmsEnabled",
+ "dpmsQuickOff",
+ "dpmsStandby",
+ "dpmsSuspend",
+ "dpmsOff",
+ "grabDesktopImages",
+ "grabVideoFrames",
+ "chooseRandomImages",
+ "imageDirectory",
+ "mode",
+ "selected",
+ "textMode",
+ "textLiteral",
+ "textFile",
+ "textProgram",
+ "textURL",
+ "dialogTheme",
+ "",
+ "programs",
+ "",
+ "pointerHysteresis",
+ "bourneShell", /* not saved -- X resources only */
+ "authWarningSlack",
+ 0
+};
+
+static char *
+strip (char *s)
+{
+ char *s2;
+ while (*s == '\t' || *s == ' ' || *s == '\r' || *s == '\n')
+ s++;
+ for (s2 = s; *s2; s2++)
+ ;
+ for (s2--; s2 >= s; s2--)
+ if (*s2 == '\t' || *s2 == ' ' || *s2 == '\r' || *s2 =='\n')
+ *s2 = 0;
+ else
+ break;
+ return s;
+}
+
+
+/* Reading
+ */
+
+static int
+handle_entry (XrmDatabase *db, const char *key, const char *value,
+ const char *filename, int line)
+{
+ int i;
+ for (i = 0; prefs[i]; i++)
+ if (*prefs[i] && !strcasecmp(key, prefs[i]))
+ {
+ char *val = strdup(value);
+ char *spec = (char *) malloc(strlen(progclass) + strlen(prefs[i]) +10);
+ strcpy(spec, progclass);
+ strcat(spec, ".");
+ strcat(spec, prefs[i]);
+
+ XrmPutStringResource (db, spec, val);
+
+ free(spec);
+ free(val);
+ return 0;
+ }
+
+ /* fprintf(stderr, "%s: %s:%d: unknown option \"%s\"\n",
+ blurb(), filename, line, key); */
+ return 1;
+}
+
+
+struct parser_closure {
+ const char *file;
+ saver_preferences *prefs;
+};
+
+static void line_handler (int lineno,
+ const char *key, const char *val,
+ void *closure)
+{
+ struct parser_closure *c = (struct parser_closure *) closure;
+ saver_preferences *p = c->prefs;
+ if (!p->db) abort();
+ handle_entry (&p->db, key, val, c->file, lineno);
+}
+
+static int
+parse_init_file_1 (saver_preferences *p)
+{
+ time_t write_date = 0;
+ const char *name = init_file_name();
+ struct parser_closure C;
+ struct stat st;
+ int status;
+
+ if (!name) return 0;
+
+ C.file = name;
+ C.prefs = p;
+
+ if (stat(name, &st) == 0)
+ write_date = st.st_mtime;
+ else
+ {
+ p->init_file_date = 0;
+ return 0;
+ }
+
+ status = parse_init_file (name, line_handler, &C);
+
+ p->init_file_date = write_date;
+ return status;
+}
+
+
+Bool
+init_file_changed_p (saver_preferences *p)
+{
+ const char *name = init_file_name();
+ struct stat st;
+
+ if (!name) return False;
+
+ if (stat(name, &st) != 0)
+ return False;
+
+ if (p->init_file_date == st.st_mtime)
+ return False;
+
+ return True;
+}
+
+
+/* Writing
+ */
+
+static int
+tab_to (FILE *out, int from, int to)
+{
+ int tab_width = 8;
+ int to_mod = (to / tab_width) * tab_width;
+ while (from < to_mod)
+ {
+ fprintf(out, "\t");
+ from = (((from / tab_width) + 1) * tab_width);
+ }
+ while (from < to)
+ {
+ fprintf(out, " ");
+ from++;
+ }
+ return from;
+}
+
+static char *
+stab_to (char *out, int from, int to)
+{
+ int tab_width = 8;
+ int to_mod = (to / tab_width) * tab_width;
+ while (from < to_mod)
+ {
+ *out++ = '\t';
+ from = (((from / tab_width) + 1) * tab_width);
+ }
+ while (from < to)
+ {
+ *out++ = ' ';
+ from++;
+ }
+ return out;
+}
+
+static int
+string_columns (const char *string, int length, int start)
+{
+ int tab_width = 8;
+ int col = start;
+ const char *end = string + length;
+ while (string < end)
+ {
+ if (*string == '\n')
+ col = 0;
+ else if (*string == '\t')
+ col = (((col / tab_width) + 1) * tab_width);
+ else
+ col++;
+ string++;
+ }
+ return col;
+}
+
+
+static void
+write_entry (FILE *out, const char *key, const char *value)
+{
+ char *v = strdup(value ? value : "");
+ char *v2 = v;
+ char *nl = 0;
+ int col;
+ Bool programs_p = (!strcmp(key, "programs"));
+ int tab = (programs_p ? 32 : 16);
+ Bool first = True;
+
+ fprintf(out, "%s:", key);
+ col = strlen(key) + 1;
+
+ if (strlen(key) > 14)
+ col = tab_to (out, col, 20);
+
+ while (1)
+ {
+ if (!programs_p)
+ v2 = strip(v2);
+ nl = strchr(v2, '\n');
+ if (nl)
+ *nl = 0;
+
+ if (first && programs_p)
+ {
+ col = tab_to (out, col, 77);
+ fprintf (out, " \\\n");
+ col = 0;
+ }
+
+ if (first)
+ first = False;
+ else
+ {
+ col = tab_to (out, col, 75);
+ fprintf (out, " \\n\\\n");
+ col = 0;
+ }
+
+ if (!programs_p)
+ col = tab_to (out, col, tab);
+
+ if (programs_p &&
+ string_columns(v2, strlen (v2), col) + col > 75)
+ {
+ int L = strlen (v2);
+ int start = 0;
+ int end = start;
+ while (start < L)
+ {
+ while (v2[end] == ' ' || v2[end] == '\t')
+ end++;
+ while (v2[end] != ' ' && v2[end] != '\t' &&
+ v2[end] != '\n' && v2[end] != 0)
+ end++;
+ if (string_columns (v2 + start, (end - start), col) >= 74)
+ {
+ col = tab_to (out, col, 75);
+ fprintf(out, " \\\n");
+ col = tab_to (out, 0, tab + 2);
+ while (v2[start] == ' ' || v2[start] == '\t')
+ start++;
+ }
+
+ col = string_columns (v2 + start, (end - start), col);
+ while (start < end)
+ fputc(v2[start++], out);
+ }
+ }
+ else
+ {
+ fprintf (out, "%s", v2);
+ col += string_columns(v2, strlen (v2), col);
+ }
+
+ if (nl)
+ v2 = nl + 1;
+ else
+ break;
+ }
+
+ fprintf(out, "\n");
+ free(v);
+}
+
+int
+write_init_file (Display *dpy,
+ saver_preferences *p, const char *version_string,
+ Bool verbose_p)
+{
+ int status = -1;
+ const char *name = init_file_name();
+ const char *tmp_name = init_file_tmp_name();
+ char *n2 = chase_symlinks (name);
+ struct stat st;
+ int i, j;
+
+ /* Kludge, since these aren't in the saver_preferences struct as strings...
+ */
+ char *visual_name;
+ char *programs;
+ Bool overlay_stderr_p;
+ char *stderr_font;
+ FILE *out;
+
+ if (!name) goto END;
+
+ if (n2) name = n2;
+
+ /* Throttle the various timeouts to reasonable values before writing
+ the file to disk. */
+ stop_the_insanity (p);
+
+
+ if (verbose_p)
+ fprintf (stderr, "%s: writing \"%s\"\n", blurb(), name);
+
+ unlink (tmp_name);
+ out = fopen(tmp_name, "w");
+ if (!out)
+ {
+ char *buf = (char *) malloc(1024 + strlen(name));
+ sprintf(buf, "%s: error writing \"%s\"", blurb(), name);
+ perror(buf);
+ free(buf);
+ goto END;
+ }
+
+ /* Give the new .xscreensaver file the same permissions as the old one;
+ except ensure that it is readable and writable by owner, and not
+ executable. Extra hack: if we're running as root, make the file
+ be world-readable (so that the daemon, running as "nobody", will
+ still be able to read it.)
+ */
+ if (stat(name, &st) == 0)
+ {
+ mode_t mode = st.st_mode;
+ mode |= S_IRUSR | S_IWUSR; /* read/write by user */
+ mode &= ~(S_IXUSR | S_IXGRP | S_IXOTH); /* executable by none */
+
+ if (getuid() == (uid_t) 0) /* read by group/other */
+ mode |= S_IRGRP | S_IROTH;
+
+ if (fchmod (fileno(out), mode) != 0)
+ {
+ char *buf = (char *) malloc(1024 + strlen(name));
+ sprintf (buf, "%s: error fchmodding \"%s\" to 0%o", blurb(),
+ tmp_name, (unsigned int) mode);
+ perror(buf);
+ free(buf);
+ goto END;
+ }
+ }
+
+ /* Kludge, since these aren't in the saver_preferences struct... */
+ visual_name = get_string_resource (dpy, "visualID", "VisualID");
+ programs = 0;
+ overlay_stderr_p = get_boolean_resource (dpy, "overlayStderr", "Boolean");
+ stderr_font = get_string_resource (dpy, "font", "Font");
+
+ i = 0;
+ {
+ char *ss;
+ char **hack_strings = (char **)
+ calloc (p->screenhacks_count, sizeof(char *));
+
+ for (j = 0; j < p->screenhacks_count; j++)
+ {
+ hack_strings[j] = format_hack (dpy, p->screenhacks[j], True);
+ i += strlen (hack_strings[j]);
+ i += 2;
+ }
+
+ ss = programs = (char *) malloc(i + 10);
+ *ss = 0;
+ for (j = 0; j < p->screenhacks_count; j++)
+ {
+ strcat (ss, hack_strings[j]);
+ free (hack_strings[j]);
+ ss += strlen(ss);
+ *ss++ = '\n';
+ *ss = 0;
+ }
+ free (hack_strings);
+ }
+
+ {
+ struct passwd *pw = getpwuid (getuid ());
+ char *whoami = (pw && pw->pw_name && *pw->pw_name
+ ? pw->pw_name
+ : "<unknown>");
+ time_t now = time ((time_t *) 0);
+ char *timestr = (char *) ctime (&now);
+ char *nl = (char *) strchr (timestr, '\n');
+ if (nl) *nl = 0;
+ fprintf (out,
+ "# %s Preferences File\n"
+ "# Written by %s %s for %s on %s.\n"
+ "# https://www.jwz.org/xscreensaver/\n"
+ "\n",
+ progclass, progname, version_string, whoami, timestr);
+ }
+
+ for (j = 0; prefs[j]; j++)
+ {
+ char buf[255];
+ const char *pr = prefs[j];
+ enum pref_type { pref_str, pref_int, pref_bool, pref_byte, pref_time
+ } type = pref_str;
+ const char *s = 0;
+ int i = 0;
+ Bool b = False;
+ Time t = 0;
+
+ if (pr && !*pr)
+ {
+ fprintf(out, "\n");
+ continue;
+ }
+
+# undef CHECK
+# define CHECK(X) else if (!strcmp(pr, X))
+ if (!pr || !*pr) ;
+ CHECK("timeout") type = pref_time, t = p->timeout;
+ CHECK("cycle") type = pref_time, t = p->cycle;
+ CHECK("lock") type = pref_bool, b = p->lock_p;
+ CHECK("lockVTs") continue; /* don't save, unused */
+ CHECK("lockTimeout") type = pref_time, t = p->lock_timeout;
+ CHECK("passwdTimeout") type = pref_time, t = p->passwd_timeout;
+ CHECK("visualID") type = pref_str, s = visual_name;
+ CHECK("installColormap") type = pref_bool, b = p->install_cmap_p;
+ CHECK("verbose") type = pref_bool, b = p->verbose_p;
+ CHECK("splash") type = pref_bool, b = p->splash_p;
+ CHECK("splashDuration") type = pref_time, t = p->splash_duration;
+ CHECK("quad") continue; /* don't save */
+ CHECK("demoCommand") type = pref_str, s = p->demo_command;
+ CHECK("prefsCommand") continue; /* don't save, unused */
+ CHECK("helpURL") continue; /* don't save */
+ CHECK("loadURL") continue; /* don't save */
+ CHECK("newLoginCommand") continue; /* don't save */
+ CHECK("externalUngrabCommand") continue; /* don't save */
+ CHECK("dialogTheme") type = pref_str, s = p->dialog_theme;
+ CHECK("nice") type = pref_int, i = p->nice_inferior;
+ CHECK("memoryLimit") continue; /* don't save */
+ CHECK("fade") type = pref_bool, b = p->fade_p;
+ CHECK("unfade") type = pref_bool, b = p->unfade_p;
+ CHECK("fadeSeconds") type = pref_time, t = p->fade_seconds;
+ CHECK("fadeTicks") continue; /* don't save */
+ CHECK("captureStdout") continue; /* don't save */
+ CHECK("logFile") continue; /* don't save */
+ CHECK("ignoreUninstalledPrograms")
+ type = pref_bool, b = p->ignore_uninstalled_p;
+
+ CHECK("font") type = pref_str, s = stderr_font;
+
+ CHECK("dpmsEnabled") type = pref_bool, b = p->dpms_enabled_p;
+ CHECK("dpmsQuickOff") type = pref_bool, b = p->dpms_quickoff_p;
+ CHECK("dpmsStandby") type = pref_time, t = p->dpms_standby;
+ CHECK("dpmsSuspend") type = pref_time, t = p->dpms_suspend;
+ CHECK("dpmsOff") type = pref_time, t = p->dpms_off;
+
+ CHECK("grabDesktopImages") type =pref_bool, b = p->grab_desktop_p;
+ CHECK("grabVideoFrames") type =pref_bool, b = p->grab_video_p;
+ CHECK("chooseRandomImages")type =pref_bool, b = p->random_image_p;
+ CHECK("imageDirectory") type =pref_str, s = p->image_directory;
+
+ CHECK("mode") type = pref_str,
+ s = (p->mode == ONE_HACK ? "one" :
+ p->mode == BLANK_ONLY ? "blank" :
+ p->mode == DONT_BLANK ? "off" :
+ p->mode == RANDOM_HACKS_SAME
+ ? "random-same"
+ : "random");
+ CHECK("selected") type = pref_int, i = p->selected_hack;
+
+ CHECK("textMode") type = pref_str,
+ s = (p->tmode == TEXT_URL ? "url" :
+ p->tmode == TEXT_LITERAL ? "literal" :
+ p->tmode == TEXT_FILE ? "file" :
+ p->tmode == TEXT_PROGRAM ? "program" :
+ "date");
+ CHECK("textLiteral") type = pref_str, s = p->text_literal;
+ CHECK("textFile") type = pref_str, s = p->text_file;
+ CHECK("textProgram") type = pref_str, s = p->text_program;
+ CHECK("textURL") type = pref_str, s = p->text_url;
+
+ CHECK("programs") type = pref_str, s = programs;
+ CHECK("pointerHysteresis")type = pref_int, i = p->pointer_hysteresis;
+ CHECK("overlayStderr") type = pref_bool, b = overlay_stderr_p;
+ CHECK("overlayTextBackground") continue; /* don't save */
+ CHECK("overlayTextForeground") continue; /* don't save */
+ CHECK("bourneShell") continue; /* don't save */
+ CHECK("authWarningSlack") type = pref_int, i = p->auth_warning_slack;
+ else
+ {
+ fprintf (stderr, "%s: internal error: key %s\n", blurb(), pr);
+ abort();
+ }
+# undef CHECK
+
+ switch (type)
+ {
+ case pref_str:
+ break;
+ case pref_int:
+ sprintf(buf, "%d", i);
+ s = buf;
+ break;
+ case pref_bool:
+ s = b ? "True" : "False";
+ break;
+ case pref_time:
+ {
+ unsigned int hour = 0, min = 0, sec = (unsigned int) (t/1000);
+ if (sec >= 60)
+ {
+ min += (sec / 60);
+ sec %= 60;
+ }
+ if (min >= 60)
+ {
+ hour += (min / 60);
+ min %= 60;
+ }
+ sprintf (buf, "%u:%02u:%02u", hour, min, sec);
+ s = buf;
+ }
+ break;
+ case pref_byte:
+ {
+ if (i >= (1<<30) && i == ((i >> 30) << 30))
+ sprintf(buf, "%dG", i >> 30);
+ else if (i >= (1<<20) && i == ((i >> 20) << 20))
+ sprintf(buf, "%dM", i >> 20);
+ else if (i >= (1<<10) && i == ((i >> 10) << 10))
+ sprintf(buf, "%dK", i >> 10);
+ else
+ sprintf(buf, "%d", i);
+ s = buf;
+ }
+ break;
+ default:
+ abort();
+ break;
+ }
+
+ if (pr && (!strcmp(pr, "mode") || !strcmp(pr, "textMode")))
+ fprintf(out, "\n");
+
+ write_entry (out, pr, s);
+ }
+
+ fprintf(out, "\n");
+
+ if (visual_name) free(visual_name);
+ if (stderr_font) free(stderr_font);
+ if (programs) free(programs);
+
+ if (fclose(out) == 0)
+ {
+ time_t write_date = 0;
+
+ if (stat(tmp_name, &st) == 0)
+ {
+ write_date = st.st_mtime;
+ }
+ else
+ {
+ char *buf = (char *) malloc(1024 + strlen(tmp_name) + strlen(name));
+ sprintf(buf, "%s: couldn't stat \"%s\"", blurb(), tmp_name);
+ perror(buf);
+ unlink (tmp_name);
+ free(buf);
+ goto END;
+ }
+
+ if (rename (tmp_name, name) != 0)
+ {
+ char *buf = (char *) malloc(1024 + strlen(tmp_name) + strlen(name));
+ sprintf(buf, "%s: error renaming \"%s\" to \"%s\"",
+ blurb(), tmp_name, name);
+ perror(buf);
+ unlink (tmp_name);
+ free(buf);
+ goto END;
+ }
+ else
+ {
+ p->init_file_date = write_date;
+
+ /* Since the .xscreensaver file is used for IPC, let's try and make
+ sure that the bits actually land on the disk right away. */
+ /* Update 2020: Apparently here in the future, this sometimes takes
+ 3+ seconds, so let's not. */
+ /* sync(); */
+
+ status = 0; /* wrote and renamed successfully! */
+ }
+ }
+ else
+ {
+ char *buf = (char *) malloc(1024 + strlen(name));
+ sprintf(buf, "%s: error closing \"%s\"", blurb(), name);
+ perror(buf);
+ free(buf);
+ unlink (tmp_name);
+ goto END;
+ }
+
+ END:
+ if (n2) free (n2);
+ return status;
+}
+
+
+/* Parsing the resource database
+ */
+
+static void
+free_screenhack (screenhack *hack)
+{
+ if (hack->visual) free (hack->visual);
+ if (hack->name) free (hack->name);
+ free (hack->command);
+ memset (hack, 0, sizeof(*hack));
+ free (hack);
+}
+
+static void
+free_screenhack_list (screenhack **list, int count)
+{
+ int i;
+ if (!list) return;
+ for (i = 0; i < count; i++)
+ if (list[i])
+ free_screenhack (list[i]);
+ free (list);
+}
+
+
+
+/* Populate `saver_preferences' with the contents of the resource database.
+ Note that this may be called multiple times -- it is re-run each time
+ the ~/.xscreensaver file is reloaded.
+
+ This function can be very noisy, since it issues resource syntax errors
+ and so on.
+ */
+void
+load_init_file (Display *dpy, saver_preferences *p)
+{
+ static Bool first_time = True;
+
+ screenhack **system_default_screenhacks = 0;
+ int system_default_screenhack_count = 0;
+
+ if (first_time)
+ {
+ /* Get the programs resource before the .xscreensaver file has been
+ parsed and merged into the resource database for the first time:
+ this is the value of *programs from the app-defaults file.
+ Then clear it out so that it will be parsed again later, after
+ the init file has been read.
+ */
+ get_screenhacks (dpy, p);
+ system_default_screenhacks = p->screenhacks;
+ system_default_screenhack_count = p->screenhacks_count;
+ p->screenhacks = 0;
+ p->screenhacks_count = 0;
+ }
+
+ if (parse_init_file_1 (p) != 0) /* file might have gone away */
+ if (!first_time) return;
+
+ first_time = False;
+
+ p->xsync_p = get_boolean_resource (dpy, "synchronous", "Synchronous");
+ p->verbose_p = get_boolean_resource (dpy, "verbose", "Boolean");
+ p->lock_p = get_boolean_resource (dpy, "lock", "Boolean");
+ p->fade_p = get_boolean_resource (dpy, "fade", "Boolean");
+ p->unfade_p = get_boolean_resource (dpy, "unfade", "Boolean");
+ p->fade_seconds = 1000 * get_seconds_resource (dpy, "fadeSeconds", "Time");
+ p->install_cmap_p = get_boolean_resource (dpy, "installColormap", "Boolean");
+ p->nice_inferior = get_integer_resource (dpy, "nice", "Nice");
+ p->splash_p = get_boolean_resource (dpy, "splash", "Boolean");
+# ifdef QUAD_MODE
+ p->quad_p = get_boolean_resource (dpy, "quad", "Boolean");
+# endif
+ p->ignore_uninstalled_p = get_boolean_resource (dpy,
+ "ignoreUninstalledPrograms",
+ "Boolean");
+
+ p->splash_duration = 1000 * get_seconds_resource (dpy, "splashDuration", "Time");
+ p->timeout = 1000 * get_minutes_resource (dpy, "timeout", "Time");
+ p->lock_timeout = 1000 * get_minutes_resource (dpy, "lockTimeout", "Time");
+ p->cycle = 1000 * get_minutes_resource (dpy, "cycle", "Time");
+ p->passwd_timeout = 1000 * get_seconds_resource (dpy, "passwdTimeout", "Time");
+ p->pointer_hysteresis = get_integer_resource (dpy, "pointerHysteresis","Integer");
+
+ p->dpms_enabled_p = get_boolean_resource (dpy, "dpmsEnabled", "Boolean");
+ p->dpms_quickoff_p = get_boolean_resource (dpy, "dpmsQuickOff", "Boolean");
+ p->dpms_standby = 1000 * get_minutes_resource (dpy, "dpmsStandby", "Time");
+ p->dpms_suspend = 1000 * get_minutes_resource (dpy, "dpmsSuspend", "Time");
+ p->dpms_off = 1000 * get_minutes_resource (dpy, "dpmsOff", "Time");
+
+ p->grab_desktop_p = get_boolean_resource (dpy, "grabDesktopImages", "Boolean");
+ p->grab_video_p = get_boolean_resource (dpy, "grabVideoFrames", "Boolean");
+ p->random_image_p = get_boolean_resource (dpy, "chooseRandomImages", "Boolean");
+ p->image_directory = get_string_resource (dpy,
+ "imageDirectory",
+ "ImageDirectory");
+
+ p->text_literal = get_string_resource (dpy, "textLiteral", "TextLiteral");
+ p->text_file = get_string_resource (dpy, "textFile", "TextFile");
+ p->text_program = get_string_resource (dpy, "textProgram", "TextProgram");
+ p->text_url = get_string_resource (dpy, "textURL", "TextURL");
+
+ p->shell = get_string_resource (dpy, "bourneShell", "BourneShell");
+
+ p->demo_command = get_string_resource(dpy, "demoCommand", "Command");
+ p->help_url = get_string_resource(dpy, "helpURL", "URL");
+ p->load_url_command = get_string_resource(dpy, "loadURL", "Command");
+ p->new_login_command = get_string_resource(dpy, "newLoginCommand",
+ "Command");
+ p->external_ungrab_command = get_string_resource(dpy,
+ "externalUngrabCommand",
+ "ExternalUngrabCommand");
+
+ p->dialog_theme = get_string_resource(dpy, "dialogTheme", "String");
+ p->auth_warning_slack = get_integer_resource(dpy, "authWarningSlack",
+ "Integer");
+
+ /* If "*splash" is unset, default to true. */
+ {
+ char *s = get_string_resource (dpy, "splash", "Boolean");
+ if (s)
+ free (s);
+ else
+ p->splash_p = True;
+ }
+
+ /* If "*grabDesktopImages" is unset, default to true. */
+ {
+ char *s = get_string_resource (dpy, "grabDesktopImages", "Boolean");
+ if (s)
+ free (s);
+ else
+ p->grab_desktop_p = True;
+ }
+
+ get_screenhacks (dpy, p); /* Parse the "programs" resource. */
+
+ {
+ char *s = get_string_resource (dpy, "selected", "Integer");
+ if (!s || !*s)
+ p->selected_hack = -1;
+ else
+ p->selected_hack = get_integer_resource (dpy, "selected", "Integer");
+ if (s) free (s);
+ if (p->selected_hack < 0 || p->selected_hack >= p->screenhacks_count)
+ p->selected_hack = -1;
+ }
+
+ {
+ char *s = get_string_resource (dpy, "mode", "Mode");
+ if (s && !strcasecmp (s, "one")) p->mode = ONE_HACK;
+ else if (s && !strcasecmp (s, "blank")) p->mode = BLANK_ONLY;
+ else if (s && !strcasecmp (s, "off")) p->mode = DONT_BLANK;
+ else if (s && !strcasecmp (s, "random-same")) p->mode = RANDOM_HACKS_SAME;
+ else p->mode = RANDOM_HACKS;
+ if (s) free (s);
+ }
+
+ {
+ char *s = get_string_resource (dpy, "textMode", "TextMode");
+ if (s && !strcasecmp (s, "url")) p->tmode = TEXT_URL;
+ else if (s && !strcasecmp (s, "literal")) p->tmode = TEXT_LITERAL;
+ else if (s && !strcasecmp (s, "file")) p->tmode = TEXT_FILE;
+ else if (s && !strcasecmp (s, "program")) p->tmode = TEXT_PROGRAM;
+ else p->tmode = TEXT_DATE;
+ if (s) free (s);
+ }
+
+ if (system_default_screenhack_count) /* note: first_time is also true */
+ {
+ merge_system_screenhacks (dpy, p, system_default_screenhacks,
+ system_default_screenhack_count);
+ free_screenhack_list (system_default_screenhacks,
+ system_default_screenhack_count);
+ system_default_screenhacks = 0;
+ system_default_screenhack_count = 0;
+ }
+
+ if (p->debug_p)
+ {
+ p->xsync_p = True;
+ p->verbose_p = True;
+ }
+
+ /* Throttle the various timeouts to reasonable values after reading the
+ disk file. */
+ stop_the_insanity (p);
+}
+
+
+/* If there are any hacks in the system-wide defaults that are not in
+ the ~/.xscreensaver file, add the new ones to the end of the list.
+ This does *not* actually save the file.
+ */
+static void
+merge_system_screenhacks (Display *dpy, saver_preferences *p,
+ screenhack **system_list, int system_count)
+{
+ /* Yeah yeah, this is an N^2 operation, but I don't have hashtables handy,
+ so fuck it. */
+
+ int made_space = 0;
+ int i;
+ for (i = 0; i < system_count; i++)
+ {
+ int j;
+ Bool matched_p = False;
+
+ for (j = 0; j < p->screenhacks_count; j++)
+ {
+ char *name;
+ if (!system_list[i]->name)
+ system_list[i]->name = make_hack_name (dpy,
+ system_list[i]->command);
+
+ name = p->screenhacks[j]->name;
+ if (!name)
+ name = make_hack_name (dpy, p->screenhacks[j]->command);
+
+ matched_p = !strcasecmp (name, system_list[i]->name);
+
+ if (name != p->screenhacks[j]->name)
+ free (name);
+
+ if (matched_p)
+ break;
+ }
+
+ if (!matched_p)
+ {
+ /* We have an entry in the system-wide list that is not in the
+ user's .xscreensaver file. Add it to the end.
+ Note that p->screenhacks is a single malloc block, not a
+ linked list, so we have to realloc it.
+ */
+ screenhack *oh = system_list[i];
+ screenhack *nh = (screenhack *) malloc (sizeof(screenhack));
+
+ if (made_space == 0)
+ {
+ made_space = 10;
+ p->screenhacks = (screenhack **)
+ realloc (p->screenhacks,
+ (p->screenhacks_count + made_space + 1)
+ * sizeof(*p->screenhacks));
+ if (!p->screenhacks) abort();
+ }
+
+ nh->enabled_p = oh->enabled_p;
+ nh->visual = oh->visual ? strdup(oh->visual) : 0;
+ nh->name = oh->name ? strdup(oh->name) : 0;
+ nh->command = oh->command ? strdup(oh->command) : 0;
+
+ p->screenhacks[p->screenhacks_count++] = nh;
+ p->screenhacks[p->screenhacks_count] = 0;
+ made_space--;
+
+#if 0
+ fprintf (stderr, "%s: noticed new hack: %s\n", blurb(),
+ (nh->name ? nh->name : make_hack_name (dpy, nh->command)));
+#endif
+ }
+ }
+}
+
+
+
+/* Parsing the programs resource.
+ */
+
+static screenhack *
+parse_screenhack (const char *line)
+{
+ screenhack *h = (screenhack *) calloc (1, sizeof(*h));
+ const char *s;
+
+ h->enabled_p = True;
+
+ while (isspace(*line)) line++; /* skip whitespace */
+ if (*line == '-') /* handle "-" */
+ {
+ h->enabled_p = False;
+ line++;
+ while (isspace(*line)) line++; /* skip whitespace */
+ }
+
+ s = line; /* handle "visual:" */
+ while (*line && *line != ':' && *line != '"' && !isspace(*line))
+ line++;
+ if (*line != ':')
+ line = s;
+ else
+ {
+ h->visual = (char *) malloc (line-s+1);
+ strncpy (h->visual, s, line-s);
+ h->visual[line-s] = 0;
+ if (*line == ':') line++; /* skip ":" */
+ while (isspace(*line)) line++; /* skip whitespace */
+ }
+
+ if (*line == '"') /* handle "name" */
+ {
+ line++;
+ s = line;
+ while (*line && *line != '"')
+ line++;
+ h->name = (char *) malloc (line-s+1);
+ strncpy (h->name, s, line-s);
+ h->name[line-s] = 0;
+ if (*line == '"') line++; /* skip "\"" */
+ while (isspace(*line)) line++; /* skip whitespace */
+ }
+
+ h->command = format_command (line, False); /* handle command */
+ return h;
+}
+
+
+static char *
+format_command (const char *cmd, Bool wrap_p)
+{
+ int tab = 30;
+ int col = tab;
+ char *cmd2 = (char *) calloc (1, 2 * (strlen (cmd) + 1));
+ const char *in = cmd;
+ char *out = cmd2;
+ while (*in)
+ {
+ /* shrink all whitespace to one space, for the benefit of the "demo"
+ mode display. We only do this when we can easily tell that the
+ whitespace is not significant (no shell metachars).
+ */
+ switch (*in)
+ {
+ case '\'': case '"': case '`': case '\\':
+ /* Metachars are scary. Copy the rest of the line unchanged. */
+ while (*in)
+ *out++ = *in++, col++;
+ break;
+
+ case ' ': case '\t':
+ /* Squeeze all other whitespace down to one space. */
+ while (*in == ' ' || *in == '\t')
+ in++;
+ *out++ = ' ', col++;
+ break;
+
+ default:
+ /* Copy other chars unchanged. */
+ *out++ = *in++, col++;
+ break;
+ }
+ }
+
+ *out = 0;
+
+ /* Strip trailing whitespace */
+ while (out > cmd2 && isspace (out[-1]))
+ *(--out) = 0;
+
+ return cmd2;
+}
+
+
+/* Returns a new string describing the shell command.
+ This may be just the name of the program, capitalized.
+ It also may be something from the resource database (gotten
+ by looking for "hacks.XYZ.name", where XYZ is the program.)
+ */
+char *
+make_hack_name (Display *dpy, const char *shell_command)
+{
+ char *s = strdup (shell_command);
+ char *s2;
+ char res_name[255];
+
+ for (s2 = s; *s2; s2++) /* truncate at first whitespace */
+ if (isspace (*s2))
+ {
+ *s2 = 0;
+ break;
+ }
+
+ s2 = strrchr (s, '/'); /* if pathname, take last component */
+ if (s2)
+ {
+ s2 = strdup (s2+1);
+ free (s);
+ s = s2;
+ }
+
+ if (strlen (s) > 50) /* 51 is hereby defined as "unreasonable" */
+ s[50] = 0;
+
+ sprintf (res_name, "hacks.%s.name", s); /* resource? */
+ s2 = get_string_resource (dpy, res_name, res_name);
+ if (s2)
+ {
+ free (s);
+ return s2;
+ }
+
+ for (s2 = s; *s2; s2++) /* if it has any capitals, return it */
+ if (*s2 >= 'A' && *s2 <= 'Z')
+ return s;
+
+ if (s[0] >= 'a' && s[0] <= 'z') /* else cap it */
+ s[0] -= 'a'-'A';
+ if (s[0] == 'X' && s[1] >= 'a' && s[1] <= 'z') /* (magic leading X) */
+ s[1] -= 'a'-'A';
+ if (s[0] == 'G' && s[1] == 'l' &&
+ s[2] >= 'a' && s[2] <= 'z') /* (magic leading GL) */
+ s[1] -= 'a'-'A',
+ s[2] -= 'a'-'A';
+ return s;
+}
+
+
+static char *
+format_hack (Display *dpy, screenhack *hack, Bool wrap_p)
+{
+ int tab = 32;
+ int size;
+ char *h2, *out, *s;
+ int col = 0;
+
+ char *def_name = make_hack_name (dpy, hack->command);
+
+ /* Don't ever write out a name for a hack if it's the same as the default.
+ */
+ if (hack->name && !strcmp (hack->name, def_name))
+ {
+ free (hack->name);
+ hack->name = 0;
+ }
+ free (def_name);
+
+ size = (2 * (strlen(hack->command) +
+ (hack->visual ? strlen(hack->visual) : 0) +
+ (hack->name ? strlen(hack->name) : 0) +
+ tab));
+ h2 = (char *) malloc (size);
+ out = h2;
+
+ if (!hack->enabled_p) *out++ = '-'; /* write disabled flag */
+
+ if (hack->visual && *hack->visual) /* write visual name */
+ {
+ if (hack->enabled_p) *out++ = ' ';
+ *out++ = ' ';
+ strcpy (out, hack->visual);
+ out += strlen (hack->visual);
+ *out++ = ':';
+ *out++ = ' ';
+ }
+
+ *out = 0;
+ col = string_columns (h2, strlen (h2), 0);
+
+ if (hack->name && *hack->name) /* write pretty name */
+ {
+ int L = (strlen (hack->name) + 2);
+ if (L + col < tab)
+ out = stab_to (out, col, tab - L - 2);
+ else
+ *out++ = ' ';
+ *out++ = '"';
+ strcpy (out, hack->name);
+ out += strlen (hack->name);
+ *out++ = '"';
+ *out = 0;
+
+ col = string_columns (h2, strlen (h2), 0);
+ if (wrap_p && col >= tab)
+ out = stab_to (out, col, 77);
+ else
+ *out++ = ' ';
+
+ if (out >= h2+size) abort();
+ }
+
+ *out = 0;
+ col = string_columns (h2, strlen (h2), 0);
+ out = stab_to (out, col, tab); /* indent */
+
+ if (out >= h2+size) abort();
+ s = format_command (hack->command, wrap_p);
+ strcpy (out, s);
+ out += strlen (s);
+ free (s);
+ *out = 0;
+
+ return h2;
+}
+
+
+static void
+get_screenhacks (Display *dpy, saver_preferences *p)
+{
+ int i, j;
+ int start = 0;
+ int end = 0;
+ int size;
+ char *d = get_string_resource (dpy, "programs", "Programs");
+
+ free_screenhack_list (p->screenhacks, p->screenhacks_count);
+ p->screenhacks = 0;
+ p->screenhacks_count = 0;
+
+ if (!d || !*d)
+ return;
+
+ size = strlen (d);
+
+
+ /* Count up the number of newlines (which will be equal to or larger than
+ one less than the number of hacks.)
+ */
+ for (i = j = 0; d[i]; i++)
+ if (d[i] == '\n')
+ j++;
+ j++;
+
+ p->screenhacks = (screenhack **) calloc (j + 1, sizeof (screenhack *));
+
+ /* Iterate over the lines in `d' (the string with newlines)
+ and make new strings to stuff into the `screenhacks' array.
+ */
+ p->screenhacks_count = 0;
+ while (start < size)
+ {
+ /* skip forward over whitespace. */
+ while (d[start] == ' ' || d[start] == '\t' || d[start] == '\n')
+ start++;
+
+ /* skip forward to newline or end of string. */
+ end = start;
+ while (d[end] != 0 && d[end] != '\n')
+ end++;
+
+ /* null terminate. */
+ d[end] = 0;
+
+ p->screenhacks[p->screenhacks_count++] = parse_screenhack (d + start);
+ if (p->screenhacks_count >= i)
+ abort();
+
+ start = end+1;
+ }
+
+ free (d);
+
+ if (p->screenhacks_count == 0)
+ {
+ free (p->screenhacks);
+ p->screenhacks = 0;
+ }
+}
+
+
+/* Make sure all the values in the preferences struct are sane.
+ */
+static void
+stop_the_insanity (saver_preferences *p)
+{
+ if (p->passwd_timeout <= 0) p->passwd_timeout = 30000; /* 30 secs */
+ if (p->timeout < 15000) p->timeout = 15000; /* 15 secs */
+ if (p->cycle != 0 && p->cycle < 2000) p->cycle = 2000; /* 2 secs */
+ if (p->fade_seconds <= 0)
+ p->fade_p = False;
+ if (! p->fade_p) p->unfade_p = False;
+
+ /* The DPMS settings may have the value 0.
+ But if they are negative, or are a range less than 10 seconds,
+ reset them to sensible defaults. (Since that must be a mistake.)
+ */
+ if (p->dpms_standby != 0 &&
+ p->dpms_standby < 10 * 1000)
+ p->dpms_standby = 2 * 60 * 60 * 1000; /* 2 hours */
+ if (p->dpms_suspend != 0 &&
+ p->dpms_suspend < 10 * 1000)
+ p->dpms_suspend = 2 * 60 * 60 * 1000; /* 2 hours */
+ if (p->dpms_off != 0 &&
+ p->dpms_off < 10 * 1000)
+ p->dpms_off = 4 * 60 * 60 * 1000; /* 4 hours */
+
+ /* suspend may not be greater than off, unless off is 0.
+ standby may not be greater than suspend, unless suspend is 0.
+ */
+ if (p->dpms_off != 0 &&
+ p->dpms_suspend > p->dpms_off)
+ p->dpms_suspend = p->dpms_off;
+ if (p->dpms_suspend != 0 &&
+ p->dpms_standby > p->dpms_suspend)
+ p->dpms_standby = p->dpms_suspend;
+
+ /* These fixes above ignores the case
+ suspend = 0 and standby > off ...
+ */
+ if (p->dpms_off != 0 &&
+ p->dpms_standby > p->dpms_off)
+ p->dpms_standby = p->dpms_off;
+
+ if (p->dpms_standby == 0 && /* if *all* are 0, then DPMS is disabled */
+ p->dpms_suspend == 0 &&
+ p->dpms_off == 0 &&
+ !p->dpms_quickoff_p) /* ... but we want to do DPMS quick off */
+ p->dpms_enabled_p = False;
+
+
+ /* Set watchdog timeout to about half of the cycle timeout, but
+ don't let it be faster than 1/2 minute or slower than 1 minute.
+ */
+ p->watchdog_timeout = p->cycle * 0.6;
+ if (p->watchdog_timeout < 27000) p->watchdog_timeout = 27000; /* 27 secs */
+ if (p->watchdog_timeout > 57000) p->watchdog_timeout = 57000; /* 57 secs */
+
+ if (p->pointer_hysteresis < 0) p->pointer_hysteresis = 0;
+
+ if (p->auth_warning_slack < 0) p->auth_warning_slack = 0;
+ if (p->auth_warning_slack > 300) p->auth_warning_slack = 300;
+}
+
+
+Bool
+senescent_p (void)
+{
+ /* If you are in here because you're planning on disabling this warning
+ before redistributing my software, please don't.
+
+ I sincerely request that you do one of the following:
+
+ 1: leave this code intact and this warning in place, -OR-
+
+ 2: Remove xscreensaver from your distribution.
+
+ I would seriously prefer that you not distribute my software at all
+ than that you distribute one version and then never update it for
+ years.
+
+ I am *constantly* getting email from users reporting bugs that have
+ been fixed for literally years who have no idea that the software
+ they are running is years out of date. Yes, it would be great if we
+ lived in the ideal world where people checked that they were running
+ the latest release before they report a bug, but we don't. To most
+ people, "running the latest release" is synonymous with "running the
+ latest release that my distro packages for me."
+
+ When they even bother to tell me what version they're running, I
+ say, "That version is three years old!", and they say "But this is
+ the latest version my distro ships". Then I say, "your distro
+ sucks", and they say "but I don't know how to compile from source,
+ herp derp I eat paste", and *everybody* goes away unhappy.
+
+ It wastes an enormous amount of my time, but worse than that, it
+ does a grave disservice to the users, who are stuck experiencing
+ bugs that are already fixed! These users think they are running the
+ latest release, and they are not. They would like to be running the
+ actual latest release, but they don't know how, because their distro
+ makes that very difficult for them. It's terrible for everyone, and
+ kind of makes me regret ever having released this software in the
+ first place.
+
+ So seriously. I ask that if you're planning on disabling this
+ obsolescence warning, that you instead just remove xscreensaver from
+ your distro entirely. Everybody will be happier that way. Check
+ out gnome-screensaver instead, I understand it's really nice.
+
+ Of course, my license allows you to ignore me and do whatever the
+ fuck you want, but as the author, I hope you will have the common
+ courtesy of complying with my request.
+
+ Thank you!
+
+ jwz, 2014, 2016, 2018, 2021.
+
+ PS: In particular, since Debian refuses to upgrade software on any
+ kind of rational timeline, I have asked that they stop shipping
+ xscreensaver at all. They have refused. Instead of upgrading the
+ software, they simply patched out this warning.
+
+ If you want to witness the sad state of the open source peanut
+ gallery, look no farther than the comments on my blog:
+ http://jwz.org/b/yiYo
+
+ Many of these people fall back on their go-to argument of, "If it is
+ legal, it must be right." If you believe in that rhetorical device
+ then you are a terrible person, and possibly a sociopath.
+
+ There are also the armchair lawyers who say "Well, instead of
+ *asking* people to do the right thing out of common courtesy, you
+ should just change your license to prohibit them from acting
+ amorally." Again, this is the answer of a sociopath, but that aside,
+ if you devote even a second's thought to this you will realize that
+ the end result of this would be for distros like Debian to just keep
+ shipping the last version with the old license and then never
+ upgrading it again -- which would be the worst possible outcome for
+ everyone involved, most especially the users.
+
+ Also, some have incorrectly characterized this as a "time bomb".
+ It is a software update notification, nothing more. A "time bomb"
+ makes software stop working. This merely alerts the user that the
+ security-critical software that they are running is dangerously out
+ of date.
+ */
+
+ time_t now = time ((time_t *) 0); /* d */
+ struct tm *tm = localtime (&now); /* o */
+ const char *s = screensaver_id; /* n */
+ char mon[4], year[5]; /* ' */
+ int m, y, mrnths; /* t */
+ s = strchr (s, ' '); if (!s) abort(); s++; /* */
+ s = strchr (s, '('); if (!s) abort(); s++; /* d */
+ s = strchr (s, '-'); if (!s) abort(); s++; /* o */
+ strncpy (mon, s, 3); /* o */
+ mon[3] = 0; /* */
+ s = strchr (s, '-'); if (!s) abort(); s++; /* e */
+ strncpy (year, s, 4); /* e */
+ year[4] = 0; /* t */
+ y = atoi (year); /* , */
+ if (!strcmp(mon, "Jan")) m = 0; /* */
+ else if (!strcmp(mon, "Feb")) m = 1; /* s */
+ else if (!strcmp(mon, "Mar")) m = 2; /* t */
+ else if (!strcmp(mon, "Apr")) m = 3; /* o */
+ else if (!strcmp(mon, "May")) m = 4; /* p */
+ else if (!strcmp(mon, "Jun")) m = 5; /* , */
+ else if (!strcmp(mon, "Jul")) m = 6; /* */
+ else if (!strcmp(mon, "Aug")) m = 7; /* s */
+ else if (!strcmp(mon, "Sep")) m = 8; /* t */
+ else if (!strcmp(mon, "Oct")) m = 9; /* a */
+ else if (!strcmp(mon, "Nov")) m = 10; /* a */
+ else if (!strcmp(mon, "Dec")) m = 11; /* a */
+ else abort(); /* h */
+ mrnths = ((((tm->tm_year + 1900) * 12) + tm->tm_mon) - /* h */
+ (y * 12 + m)); /* h */
+ /* p */
+ return (mrnths >= 34); /* . */
+}
diff --git a/driver/remote.c b/driver/remote.c
index 83254e0..123bc28 100644
--- a/driver/remote.c
+++ b/driver/remote.c
@@ -1,4 +1,4 @@
-/* xscreensaver-command, Copyright (c) 1991-2019 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver-command, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -33,102 +33,61 @@
#include <X11/Xutil.h> /* for XGetClassHint() */
#include <X11/Xos.h>
+#ifdef HAVE_DPMS_EXTENSION
+# include <X11/extensions/dpms.h>
+#endif
+
+#include "blurb.h"
+#include "atoms.h"
#include "remote.h"
+#include "clientmsg.h"
#ifdef _VROOT_H_
ERROR! you must not include vroot.h in this file
#endif
-extern char *progname;
-extern Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_RESPONSE;
-extern Atom XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_EXIT;
-extern Atom XA_VROOT, XA_SELECT, XA_DEMO, XA_BLANK, XA_LOCK;
-extern Atom XA_ACTIVATE, XA_SUSPEND, XA_NEXT, XA_PREV, XA_EXIT;
-
-
-static XErrorHandler old_handler = 0;
-static Bool got_badwindow = False;
+static Bool error_handler_hit_p = False;
static int
-BadWindow_ehandler (Display *dpy, XErrorEvent *error)
+ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
{
- if (error->error_code == BadWindow)
- {
- got_badwindow = True;
- return 0;
- }
- else
- {
- fprintf (stderr, "%s: ", progname);
- if (!old_handler) abort();
- return (*old_handler) (dpy, error);
- }
+ error_handler_hit_p = True;
+ return 0;
}
-
-static Window
-find_screensaver_window (Display *dpy, char **version)
+/* See comment in xscreensaver.c for why this is here instead of there.
+ */
+static void
+reset_dpms_timer (Display *dpy)
{
- int i;
- Window root = RootWindowOfScreen (DefaultScreenOfDisplay (dpy));
- Window root2, parent, *kids;
- unsigned int nkids;
-
- if (version) *version = 0;
-
- if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids))
- abort ();
- if (root != root2)
- abort ();
- if (parent)
- abort ();
- if (! (kids && nkids))
- return 0;
- for (i = 0; i < nkids; i++)
- {
- Atom type;
- int format;
- unsigned long nitems, bytesafter;
- unsigned char *v;
- int status;
-
- /* We're walking the list of root-level windows and trying to find
- the one that has a particular property on it. We need to trap
- BadWindows errors while doing this, because it's possible that
- some random window might get deleted in the meantime. (That
- window won't have been the one we're looking for.)
- */
- XSync (dpy, False);
- if (old_handler) abort();
- got_badwindow = False;
- old_handler = XSetErrorHandler (BadWindow_ehandler);
- status = XGetWindowProperty (dpy, kids[i],
- XA_SCREENSAVER_VERSION,
- 0, 200, False, XA_STRING,
- &type, &format, &nitems, &bytesafter,
- &v);
- XSync (dpy, False);
- XSetErrorHandler (old_handler);
- old_handler = 0;
+# ifdef HAVE_DPMS_EXTENSION
- if (got_badwindow)
- {
- status = BadWindow;
- got_badwindow = False;
- }
+ XErrorHandler old_handler;
+ int event_number, error_number;
+ BOOL enabled = False;
+ CARD16 power = 0;
- if (status == Success && type != None)
- {
- Window ret = kids[i];
- if (version)
- *version = (char *) v;
- XFree (kids);
- return ret;
- }
- }
+ XSync (dpy, False);
+ error_handler_hit_p = False;
+ old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
- if (kids) XFree (kids);
- return 0;
+ if (! DPMSQueryExtension (dpy, &event_number, &error_number))
+ goto DONE;
+ if (! DPMSCapable (dpy))
+ goto DONE;
+ if (! DPMSInfo (dpy, &power, &enabled))
+ goto DONE;
+ if (!enabled)
+ goto DONE;
+
+ /* Do this even if power == DPMSModeOn to reset the timer */
+ DPMSForceLevel (dpy, DPMSModeOn);
+
+ DONE:
+ XSync (dpy, False);
+ XSetErrorHandler (old_handler);
+
+# endif /* HAVE_DPMS_EXTENSION */
}
@@ -239,7 +198,7 @@ send_xscreensaver_command (Display *dpy, Atom command, long arg,
if (data) free (data);
fprintf (stdout, "\n");
fflush (stdout);
- fprintf (stderr, "bad status format on root window.\n");
+ fprintf (stderr, "bad status format on root window\n");
status = -1;
goto DONE;
}
@@ -301,7 +260,7 @@ send_xscreensaver_command (Display *dpy, Atom command, long arg,
if (dataP) XFree (dataP);
fprintf (stdout, "\n");
fflush (stdout);
- fprintf (stderr, "no saver status on root window.\n");
+ fprintf (stderr, "no saver status on root window\n");
status = -1;
goto DONE;
}
@@ -316,7 +275,6 @@ send_xscreensaver_command (Display *dpy, Atom command, long arg,
XEvent event;
long arg1 = arg;
long arg2 = 0;
-
if (arg < 0)
abort();
else if (arg == 0 && command == XA_SELECT)
@@ -327,6 +285,9 @@ send_xscreensaver_command (Display *dpy, Atom command, long arg,
arg2 = arg; /* since it didn't use to take an argument. */
}
+ if (command == XA_DEACTIVATE)
+ reset_dpms_timer (dpy);
+
event.xany.type = ClientMessage;
event.xclient.display = dpy;
event.xclient.window = window;
@@ -336,10 +297,11 @@ send_xscreensaver_command (Display *dpy, Atom command, long arg,
event.xclient.data.l[0] = (long) command;
event.xclient.data.l[1] = arg1;
event.xclient.data.l[2] = arg2;
- if (! XSendEvent (dpy, window, False, 0L, &event))
+
+ if (! XSendEvent (dpy, window, False, PropertyChangeMask, &event))
{
- sprintf (err, "XSendEvent(dpy, 0x%x ...) failed.\n",
- (unsigned int) window);
+ sprintf (err, "XSendEvent(dpy, 0x%x ...) failed\n",
+ (unsigned int) window);
if (error_ret)
*error_ret = strdup (err);
else
@@ -416,10 +378,11 @@ xscreensaver_command_response (Display *dpy, Window window,
int format;
unsigned long nitems, bytesafter;
unsigned char *msg = 0;
+ XErrorHandler old_handler;
XSync (dpy, False);
- if (old_handler) abort();
- old_handler = XSetErrorHandler (BadWindow_ehandler);
+ error_handler_hit_p = False;
+ old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
st2 = XGetWindowProperty (dpy, window,
XA_SCREENSAVER_RESPONSE,
0, 1024, True,
@@ -428,9 +391,8 @@ xscreensaver_command_response (Display *dpy, Window window,
&msg);
XSync (dpy, False);
XSetErrorHandler (old_handler);
- old_handler = 0;
- if (got_badwindow)
+ if (error_handler_hit_p)
{
if (exiting_p)
return 0;
@@ -491,109 +453,87 @@ xscreensaver_command_response (Display *dpy, Window window,
}
-/* Wait until the window has been mapped, blanking the screen.
+/* Wait until xscreensaver says the screen is blanked.
Catches errors, times out after a few seconds.
*/
static int
-xscreensaver_command_wait_for_blank (Display *dpy, Window window,
+xscreensaver_command_wait_for_blank (Display *dpy,
Bool verbose_p, char **error_ret)
{
+ Window w = RootWindow (dpy, 0); /* always screen 0 */
time_t start = time((time_t*)0);
int max = 10;
char err[2048];
- Status status = -1;
-
while (1)
{
- XWindowAttributes xgwa;
- xgwa.map_state = IsUnmapped;
+ Atom type;
+ int format;
+ unsigned long nitems, bytesafter;
+ unsigned char *dataP = 0;
+ time_t now;
+ struct timeval tv;
- if (!window)
- got_badwindow = True;
- else
+ /* Wait until the status property on the root window changes to
+ BLANK or LOCKED. */
+ if (XGetWindowProperty (dpy, w,
+ XA_SCREENSAVER_STATUS,
+ 0, 999, False, XA_INTEGER,
+ &type, &format, &nitems, &bytesafter,
+ &dataP)
+ == Success
+ && type == XA_INTEGER
+ && nitems >= 3
+ && dataP)
{
- XSync (dpy, False);
- if (old_handler) abort();
- got_badwindow = False;
- old_handler = XSetErrorHandler (BadWindow_ehandler);
- status = XGetWindowAttributes (dpy, window, &xgwa);
- XSync (dpy, False);
- XSetErrorHandler (old_handler);
- old_handler = 0;
- }
+ Atom state = ((Atom *) dataP)[0];
- if (got_badwindow)
- {
- /* If we got a BadWindow, it might be that in the course of
- activating, xscreensaver had to destroy and re-create the
- window to get one with the proper Visual. So wait for a
- new window to come into existence.
- */
- if (window && verbose_p > 1)
- fprintf (stderr,
- "%s: BadWindow 0x%08x waiting for screen to blank\n",
- progname, (unsigned int) window);
- window = find_screensaver_window (dpy, 0);
- if (window && verbose_p > 1)
- fprintf (stderr, "%s: new window is 0x%08x.\n",
- progname, (unsigned int) window);
- got_badwindow = False;
+ if (verbose_p > 1)
+ {
+ PROP32 *status = (PROP32 *) dataP;
+ int i;
+ fprintf (stderr, "%s: read status property: 0x%lx: %s", progname,
+ (unsigned long) w,
+ (status[0] == XA_LOCK ? "LOCK" :
+ status[0] == XA_BLANK ? "BLANK" :
+ status[0] == 0 ? "0" : "???"));
+ for (i = 1; i < nitems; i++)
+ fprintf (stderr, ", %lu", status[i]);
+ fprintf (stderr, "\n");
+ }
+
+ if (state == XA_BLANK || state == XA_LOCK)
+ {
+ if (verbose_p > 1)
+ fprintf (stderr, "%s: screen blanked\n", progname);
+ break;
+ }
}
- else if (status == 0)
+
+ now = time ((time_t *) 0);
+ if (now >= start + max)
{
- sprintf (err, "error on 0x%08x waiting for screen to blank",
- (unsigned int) window);
+ strcpy (err, "Timed out waiting for screen to blank");
if (error_ret)
*error_ret = strdup (err);
else
fprintf (stderr, "%s: %s\n", progname, err);
return -1;
}
- else if (xgwa.map_state == IsViewable)
+ else if (verbose_p == 1 && now > start + 3)
{
- if (verbose_p)
- fprintf (stderr, "%s: window 0x%08x mapped.\n",
- progname, (unsigned int) window);
- return 0;
+ fprintf (stderr, "%s: waiting for status change\n", progname);
+ verbose_p++;
}
- else
- {
- time_t now = time((time_t*)0);
- if (now >= start + max)
- {
- sprintf (err, "Timed out waiting for screen to blank on 0x%08x",
- (unsigned int) window);
- if (error_ret)
- *error_ret = strdup (err);
- else
- fprintf (stderr, "%s: %s\n", progname, err);
- return -1;
- }
- else if (verbose_p && now > start+1)
- {
- fprintf (stderr, "%s: waiting for window 0x%08x to map\n",
- progname, (unsigned int) window);
- }
- }
-
-# if defined(HAVE_SELECT)
- {
- struct timeval tv;
- tv.tv_sec = 0;
- tv.tv_usec = 1000000L / 10;
- select (0, 0, 0, 0, &tv);
- }
-# else
- sleep (1);
-# endif
+ tv.tv_sec = 0;
+ tv.tv_usec = 1000000L / 10;
+ select (0, 0, 0, 0, &tv);
}
return 0;
}
-
int
xscreensaver_command (Display *dpy, Atom command, long arg, Bool verbose_p,
char **error_ret)
@@ -614,8 +554,7 @@ xscreensaver_command (Display *dpy, Atom command, long arg, Bool verbose_p,
command == XA_NEXT ||
command == XA_PREV ||
command == XA_SELECT))
- status = xscreensaver_command_wait_for_blank (dpy, w, verbose_p,
- error_ret);
+ status = xscreensaver_command_wait_for_blank (dpy, verbose_p, error_ret);
fflush (stdout);
fflush (stderr);
@@ -648,7 +587,7 @@ server_xscreensaver_version (Display *dpy,
if (version_ret)
{
unsigned char *v = 0;
- XGetWindowProperty (dpy, window, XA_SCREENSAVER_VERSION, 0, 1,
+ XGetWindowProperty (dpy, window, XA_SCREENSAVER_VERSION, 0, 100,
False, XA_STRING, &type, &format, &nitems,
&bytesafter, &v);
if (v)
@@ -681,11 +620,12 @@ server_xscreensaver_version (Display *dpy,
{
char *o = 0, *p = 0, *c = 0;
o = strchr ((char *) id, '(');
- if (o) p = strchr (o, '@');
+ if (o) p = strrchr (o, '@');
if (p) c = strchr (p, ')');
if (c)
{
- /* found ID of the form "1234 (user@host)". */
+ /* found ID of the form "1234 (user@host)"
+ or the weirder "1234 (user@crap@host)". */
user = o+1;
host = p+1;
*p = 0;
@@ -695,12 +635,16 @@ server_xscreensaver_version (Display *dpy,
}
- if (user && *user && *user != '?')
+ if (!user_ret)
+ ;
+ else if (user && *user && *user != '?')
*user_ret = strdup (user);
else
*user_ret = 0;
- if (host && *host && *host != '?')
+ if (!host_ret)
+ ;
+ else if (host && *host && *host != '?')
*host_ret = strdup (host);
else
*host_ret = 0;
diff --git a/driver/remote.h b/driver/remote.h
index e1db351..6b1763f 100644
--- a/driver/remote.h
+++ b/driver/remote.h
@@ -1,5 +1,4 @@
-/* xscreensaver-command, Copyright (c) 1991-1998
- * by Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver-command, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
diff --git a/driver/screens.c b/driver/screens.c
index f319c96..dc87e51 100644
--- a/driver/screens.c
+++ b/driver/screens.c
@@ -1,5 +1,5 @@
/* screens.c --- dealing with RANDR, Xinerama, and VidMode Viewports.
- * xscreensaver, Copyright (c) 1991-2008 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -11,115 +11,114 @@
*/
/* There are a bunch of different mechanisms for multiple monitors
- * available in X. XScreenSaver needs to care about this for two
- * reasons: first, to ensure that all visible areas go black; and
- * second, so that the windows of screen savers exactly fill the
- * glass of each monitor (instead of one saver spanning multiple
- * monitors, or a monitor displaying only a sub-rectangle of the
- * screen saver.)
+ * available in X. XScreenSaver needs to care about this for two reasons:
+ * first, to ensure that all visible areas go black; and second, so that
+ * the windows of screen savers exactly fill the glass of each monitor
+ * (instead of one saver spanning multiple monitors, or a monitor
+ * displaying only a sub-rectangle of the screen saver.)
*
* 1) Multi-screen:
*
- * This is the original way. Each monitor gets its own display
- * number. :0.0 is the first one, :0.1 is the next, etc. The
- * value of $DISPLAY determines which screen windows open on by
- * default. A single app can open windows on multiple screens
- * with the same display connection, but windows cannot be moved
- * from one screen to another. The mouse can be moved from one
- * screen to another, though. Screens may be different depths
- * (e.g., one can be TrueColor and one can be PseudoColor.)
- * Screens cannot be resized or moved without restarting X.
+ * This is the original way. Each monitor gets its own display number.
+ * ":0.0" is the first one, ":0.1" is the next, and so on. The value
+ * of $DISPLAY determines which screen windows open on by default. A
+ * single app can open windows on multiple screens with the same
+ * display connection, but windows cannot be moved from one screen to
+ * another. The mouse can be moved from one screen to another, though.
+ * Screens may be different depths (e.g., one can be TrueColor and one
+ * can be PseudoColor.) Screens cannot be resized or moved without
+ * restarting X.
*
- * Everyone hates this way of doing things because of the
- * inability to move a window from one screen to another without
- * restarting the application.
+ * Everyone hates this way of doing things because of the inability to
+ * move a window from one screen to another without restarting the
+ * application.
*
* 2) Xinerama:
*
- * There is a single giant root window that spans all the
- * monitors. All monitors are the same depth, and windows can be
- * moved around. Applications can learn which rectangles are
- * actually visible on monitors by querying the Xinerama server
- * extension. (If you don't do that, you end up with dialog
- * boxes that try to appear in the middle of the screen actually
- * spanning the gap between two monitors.)
+ * There is a single giant root window that spans all the monitors.
+ * All monitors are the same depth, and windows can be moved around.
+ * Applications can learn which rectangles are actually visible on
+ * monitors by querying the Xinerama server extension. (If you don't
+ * do that, you end up with dialog boxes that try to appear in the
+ * middle of the screen actually spanning the gap between two
+ * monitors.)
*
- * Xinerama doesn't work with DRI, which means that if you use
- * it, you lose hardware acceleration on OpenGL programs. Also,
- * screens can't be resized or moved without restarting X.
+ * Xinerama didn't? work with DRI, which means that Xinerama precluded
+ * hardware acceleration in OpenGL programs. Also, screens couldn't
+ * be resized or moved without restarting X.
*
* 3) Vidmode Viewports:
*
+ * No longer supported as of XScreenSaver 6.
+ *
* With this extension, the root window can be bigger than the
- * monitor. Moving the mouse near the edges of the screen
- * scrolls around, like a pan-and-scan movie. There can also be
- * a hot key for changing the monitor's resolution (zooming
- * in/out).
+ * monitor. Moving the mouse near the edges of the screen scrolls
+ * around, like a pan-and-scan movie. There was also a hot-key for
+ * changing the monitor's resolution (zooming in/out).
*
- * Trying to combine this with Xinerama crashes the server, so
- * you can only use this if you have only a single screen, or are
- * in old-multi-screen mode.
+ * Trying to combine this with Xinerama crashes the server, so you
+ * could only use this if you had only a single screen, or were in old
+ * multi-screen mode.
*
- * Also, half the time it doesn't work at all: it tends to lie
- * about the size of the rectangle in use.
+ * Also, half the time it didn't work at all: it tended to lie about
+ * the size of the rectangle in use.
*
* 4) RANDR 1.0:
*
* The first version of the "Resize and Rotate" extension let you
* change the resolution of a screen on the fly. The root window
* would actually resize. However, it was also incompatible with
- * Xinerama (did it crash, or just do nothing? I can't remember)
- * so you needed to be in single-screen or old multi-screen mode.
- * I believe RANDR could co-exist with Vidmode Viewports, but I'm
- * not sure.
+ * Xinerama (did it crash, or just do nothing? I can't remember) so
+ * you needed to be in single-screen or old multi-screen mode. I
+ * believe RANDR could co-exist with Vidmode Viewports, but I'm not
+ * sure.
*
* 5) RANDR 1.2:
*
* Finally, RANDR added the functionality of Xinerama, plus some.
* Each X screen (in the sense of #1, "multi-screen") can have a
- * number of sub-rectangles that are displayed on monitors, and
- * each of those sub-rectangles can be displayed on more than one
- * monitor. So it's possible (I think) to have a hybrid of
- * multi-screen and Xinerama (e.g., to have two monitors running
- * in one depth, and three monitors running in another?)
- * Typically though, there will be a single X screen, with
- * Xinerama-like division of that large root window onto multiple
- * monitors. Also everything's dynamic: monitors can be added,
- * removed, and resized at runtime.
- *
- * I believe that as of RANDR 1.2, the Xinerama extension still
- * exists but only as a compatiblity layer: it's actually
- * returning data from the RANDR extension.
- *
- * Though RANDR 1.2 allows the same image to be cloned onto more
- * than one monitor, and also allows one monitor to show a
- * subsection of something on another monitor (e.g., the
- * rectangles can be enclosed or overlap). Since there's no way
- * to put seperate savers on those duplicated-or-overlapping
- * monitors, xscreensaver just ignores them (which allows them to
- * display duplicates or overlaps).
+ * number of sub-rectangles that are displayed on monitors, and each
+ * of those sub-rectangles can be displayed on more than one monitor.
+ * So it's possible (I think) to have a hybrid of multi-screen and
+ * Xinerama (e.g., to have two monitors running in one depth, and
+ * three monitors running in another?) Typically though, there will
+ * be a single X screen with one giant root window underlying the
+ * rectangles of multiple monitors. Also everything is dynamic:
+ * monitors can be added, removed, and resized at runtime, with
+ * notification events.
*
- * 5a) Nvidia fucks it up:
+ * RANDR rectangles can overlap, meaning one monitor can mirror
+ * another, or show a sub-rectangle of another, or just overlap in
+ * strange ways. The proper way to respond to weird layouts is... not
+ * always obvious.
*
- * Nvidia drivers as of Aug 2008 running in "TwinView" mode
- * apparently report correct screen geometry via Xinerama, but
- * report one giant screen via RANDR. The response from the
- * nvidia developers is, "we don't support RANDR, use Xinerama
- * instead." Which is a seriously lame answer. So, xscreensaver
- * has to query *both* extensions, and make a guess as to which
- * is to be believed.
+ * Also sometimes RANDR says stupid shit like, "You have one screen,
+ * and it has no available sizes or orientations."
*
- * 5b) Also sometimes RANDR says stupid shit like, "You have one
- * screen, and it has no available orientations or sizes."
+ * Sometimes RANDR and Xinerama report the same info, and sometimes
+ * not, so we look at both and see which looks most plausible.
*
+ * Also, Nvidia fucked it up: their drivers that were popular in 2008,
+ * when running in "TwinView" mode, reported correct sizes via
+ * Xinerama, but reported one giant screen via RANDR. Nvidia's
+ * response was, "We don't support RANDR, use Xinerama instead", which
+ * is another reason that XScreenSaver historically had to query both
+ * extensions and make a guess. Maybe this is no longer necessary.
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
#include <X11/Xlib.h>
+#ifndef HAVE_RANDR_12
+# undef HAVE_RANDR /* RANDR 1.1 is no longer supported */
+#endif
+
#ifdef HAVE_RANDR
# include <X11/extensions/Xrandr.h>
#endif /* HAVE_RANDR */
@@ -132,37 +131,14 @@
# include <X11/extensions/xf86vmode.h>
#endif /* HAVE_XF86VMODE */
-/* This file doesn't need the Xt headers, so stub these types out... */
-#undef XtPointer
-#define XtAppContext void*
-#define XrmDatabase void*
-#define XtIntervalId void*
-#define XtPointer void*
-#define Widget void*
-
-#include "xscreensaver.h"
-#include "visual.h"
-
-
-typedef enum { S_SANE, S_ENCLOSED, S_DUPLICATE, S_OVERLAP,
- S_OFFSCREEN, S_DISABLED } monitor_sanity;
-
-/* 'typedef monitor' is in types.h */
-struct _monitor {
- int id;
- char *desc;
- Screen *screen;
- int x, y, width, height;
- monitor_sanity sanity; /* I'm not crazy you're the one who's crazy */
- int enemy; /* which monitor it overlaps or duplicates */
- char *err; /* msg to print at appropriate later time;
- exists only on monitor #0. */
-};
+#include "blurb.h"
+#include "screens.h"
-static Bool layouts_differ_p (monitor **a, monitor **b);
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
-static void
+void
free_monitors (monitor **monitors)
{
monitor **m2 = monitors;
@@ -231,122 +207,6 @@ xinerama_scan_monitors (Display *dpy, char **errP)
#endif /* HAVE_XINERAMA */
-#ifdef HAVE_XF86VMODE
-
-static monitor **
-vidmode_scan_monitors (Display *dpy, char **errP)
-{
- int event, error, nscreens, i;
- monitor **monitors;
-
- /* Note that XF86VidModeGetViewPort() tends to be full of lies on laptops
- that have a docking station or external monitor that runs in a different
- resolution than the laptop's screen:
-
- http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=81593
- http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=208417
- http://bugs.xfree86.org/show_bug.cgi?id=421
-
- Presumably this is fixed by using RANDR instead of VidMode.
- */
-
-# ifdef HAVE_XINERAMA
- /* Attempts to use the VidMode extension when the Xinerama extension is
- active can result in a server crash! Yay! */
- if (XQueryExtension (dpy, "XINERAMA", &error, &event, &error))
- return 0;
-# endif /* !HAVE_XINERAMA */
-
- if (! XF86VidModeQueryExtension (dpy, &event, &error))
- return 0;
-
- nscreens = ScreenCount (dpy);
- monitors = (monitor **) calloc (nscreens + 1, sizeof(*monitors));
- if (!monitors) return 0;
-
- for (i = 0; i < nscreens; i++)
- {
- monitor *m = (monitor *) calloc (1, sizeof (monitor));
- XF86VidModeModeLine ml;
- int dot;
- Screen *screen = ScreenOfDisplay (dpy, i);
-
- monitors[i] = m;
- m->id = i;
- m->screen = screen;
-
- if (! safe_XF86VidModeGetViewPort (dpy, i, &m->x, &m->y))
- m->x = m->y = -1;
-
- if (XF86VidModeGetModeLine (dpy, i, &dot, &ml))
- {
- m->width = ml.hdisplay;
- m->height = ml.vdisplay;
- }
-
- /* On a system that has VidMode but does not have RANDR, and that has
- "Option Rotate" set, WidthOfScreen/HeightOfScreen are the rotated
- size, but XF86VidModeModeLine contains the unrotated size.
- Maybe there's something in 'flags' that indicates this?
- Or, we can just notice that the aspect ratios are inverted:
- */
- if (m->width > 0 &&
- m->height > 0 &&
- ((m->width > m->height) !=
- (WidthOfScreen(screen) > HeightOfScreen(screen))))
- {
- int swap = m->width;
- m->width = m->height;
- m->height = swap;
- }
-
-
- /* Apparently, though the server stores the X position in increments of
- 1 pixel, it will only make changes to the *display* in some other
- increment. With XF86_SVGA on a Thinkpad, the display only updates
- in multiples of 8 pixels when in 8-bit mode, and in multiples of 4
- pixels in 16-bit mode. I don't know what it does in 24- and 32-bit
- mode, because I don't have enough video memory to find out.
-
- I consider it a bug that XF86VidModeGetViewPort() is telling me the
- server's *target* scroll position rather than the server's *actual*
- scroll position. David Dawes agrees, and says they may fix this in
- XFree86 4.0, but it's nontrivial.
-
- He also confirms that this behavior is server-dependent, so the
- actual scroll position cannot be reliably determined by the client.
- So... that means the only solution is to provide a ``sandbox''
- around the blackout window -- we make the window be up to N pixels
- larger than the viewport on both the left and right sides. That
- means some part of the outer edges of each hack might not be
- visible, but screw it.
-
- I'm going to guess that 16 pixels is enough, and that the Y dimension
- doesn't have this problem.
-
- The drawback of doing this, of course, is that some of the screenhacks
- will still look pretty stupid -- for example, "slidescreen" will cut
- off the left and right edges of the grid, etc.
- */
-# define FUDGE 16
- if (m->x > 0 && m->x < m->width - ml.hdisplay)
- {
- /* Not at left edge or right edge:
- Round X position down to next lower multiple of FUDGE.
- Increase width by 2*FUDGE in case some server rounds up.
- */
- m->x = ((m->x - 1) / FUDGE) * FUDGE;
- m->width += (FUDGE * 2);
- }
-# undef FUDGE
- }
-
- return monitors;
-}
-
-#endif /* HAVE_XF86VMODE */
-
-
#ifdef HAVE_RANDR
static monitor **
@@ -354,7 +214,6 @@ randr_scan_monitors (Display *dpy, char **errP)
{
int event, error, major, minor, nscreens, i, j;
monitor **monitors;
- Bool new_randr_p = False;
if (! XRRQueryExtension (dpy, &event, &error))
return 0;
@@ -362,30 +221,17 @@ randr_scan_monitors (Display *dpy, char **errP)
if (! XRRQueryVersion (dpy, &major, &minor))
return 0;
- if (major <= 0) /* Protocol was still in flux back then -- fuck it. */
- return 0;
-
-# ifdef HAVE_RANDR_12
- new_randr_p = (major > 1 || (major == 1 && minor >= 2));
-# endif
+ if (! (major > 1 || (major == 1 && minor >= 2)))
+ return 0; /* 1.2 ir newer is required */
- if (! new_randr_p)
- /* RANDR 1.0 -- no Xinerama-like virtual screens. */
- nscreens = ScreenCount (dpy);
- else /* RANDR 1.2 or newer -- built-in Xinerama */
+ /* Add up the virtual screens on each X screen. */
+ nscreens = 0;
+ for (i = 0; i < ScreenCount (dpy); i++)
{
-# ifdef HAVE_RANDR_12
- int xsc = ScreenCount (dpy);
- nscreens = 0;
- /* Add up the virtual screens on each X screen. */
- for (i = 0; i < xsc; i++)
- {
- XRRScreenResources *res =
- XRRGetScreenResources (dpy, RootWindow (dpy, i));
- nscreens += res->noutput;
- XRRFreeScreenResources (res);
- }
-# endif /* HAVE_RANDR_12 */
+ XRRScreenResources *res =
+ XRRGetScreenResources (dpy, RootWindow (dpy, i));
+ nscreens += res->noutput;
+ XRRFreeScreenResources (res);
}
if (nscreens <= 0)
@@ -401,88 +247,43 @@ randr_scan_monitors (Display *dpy, char **errP)
for (i = 0, j = 0; i < ScreenCount (dpy); i++)
{
Screen *screen = ScreenOfDisplay (dpy, i);
-
- if (! new_randr_p) /* RANDR 1.0 */
+ int k;
+ XRRScreenResources *res =
+ XRRGetScreenResources (dpy, RootWindowOfScreen (screen));
+ for (k = 0; k < res->noutput; k++, j++)
{
- XRRScreenConfiguration *rrc;
monitor *m = (monitor *) calloc (1, sizeof (monitor));
- monitors[i] = m;
+ XRROutputInfo *rroi = XRRGetOutputInfo (dpy, res,
+ res->outputs[k]);
+ RRCrtc crtc = (rroi->crtc ? rroi->crtc :
+ rroi->ncrtc ? rroi->crtcs[0] : 0);
+ XRRCrtcInfo *crtci = (crtc ? XRRGetCrtcInfo(dpy, res, crtc) : 0);
+
+ monitors[j] = m;
m->screen = screen;
- m->id = i;
+ m->id = (i * 1000) + j;
+ m->desc = (rroi->name ? strdup (rroi->name) : 0);
- rrc = XRRGetScreenInfo (dpy, RootWindowOfScreen (screen));
- if (rrc)
+ if (crtci)
{
- SizeID size = -1;
- Rotation rot = ~0;
- XRRScreenSize *rrsizes;
- int nsizes = 0;
-
- size = XRRConfigCurrentConfiguration (rrc, &rot);
- rrsizes = XRRConfigSizes (rrc, &nsizes);
-
- if (nsizes <= 0) /* WTF? Shouldn't happen but does. */
- {
- m->width = DisplayWidth (dpy, i);
- m->height = DisplayHeight (dpy, i);
- }
- else if (rot & (RR_Rotate_90|RR_Rotate_270))
- {
- m->width = rrsizes[size].height;
- m->height = rrsizes[size].width;
- }
- else
- {
- m->width = rrsizes[size].width;
- m->height = rrsizes[size].height;
- }
-
- /* don't free 'rrsizes' */
- XRRFreeScreenConfigInfo (rrc);
+ /* Note: if the screen is rotated, XRRConfigSizes contains
+ the unrotated WxH, but XRRCrtcInfo contains rotated HxW.
+ */
+ m->x = crtci->x;
+ m->y = crtci->y;
+ m->width = crtci->width;
+ m->height = crtci->height;
}
- }
- else /* RANDR 1.2 or newer */
- {
-# ifdef HAVE_RANDR_12
- int k;
- XRRScreenResources *res =
- XRRGetScreenResources (dpy, RootWindowOfScreen (screen));
- for (k = 0; k < res->noutput; k++, j++)
- {
- monitor *m = (monitor *) calloc (1, sizeof (monitor));
- XRROutputInfo *rroi = XRRGetOutputInfo (dpy, res,
- res->outputs[k]);
- RRCrtc crtc = (rroi->crtc ? rroi->crtc :
- rroi->ncrtc ? rroi->crtcs[0] : 0);
- XRRCrtcInfo *crtci = (crtc ? XRRGetCrtcInfo(dpy, res, crtc) : 0);
-
- monitors[j] = m;
- m->screen = screen;
- m->id = (i * 1000) + j;
- m->desc = (rroi->name ? strdup (rroi->name) : 0);
-
- if (crtci)
- {
- /* Note: if the screen is rotated, XRRConfigSizes contains
- the unrotated WxH, but XRRCrtcInfo contains rotated HxW.
- */
- m->x = crtci->x;
- m->y = crtci->y;
- m->width = crtci->width;
- m->height = crtci->height;
- }
- if (rroi->connection == RR_Disconnected)
- m->sanity = S_DISABLED;
- /* #### do the same for RR_UnknownConnection? */
+ if (rroi->connection == RR_Disconnected)
+ m->sanity = S_DISABLED;
+ /* #### do the same for RR_UnknownConnection? */
- if (crtci)
- XRRFreeCrtcInfo (crtci);
- XRRFreeOutputInfo (rroi);
- }
- XRRFreeScreenResources (res);
-# endif /* HAVE_RANDR_12 */
+ if (crtci)
+ XRRFreeCrtcInfo (crtci);
+ XRRFreeOutputInfo (rroi);
}
+ XRRFreeScreenResources (res);
}
/* Work around more fucking brain damage. */
@@ -566,7 +367,7 @@ randr_versus_xinerama_fight (Display *dpy, monitor **randr_monitors,
if (!xinerama_monitors)
return randr_monitors;
- if (! layouts_differ_p (randr_monitors, xinerama_monitors))
+ if (! monitor_layouts_differ_p (randr_monitors, xinerama_monitors))
{
free_monitors (xinerama_monitors);
return randr_monitors;
@@ -582,9 +383,8 @@ randr_versus_xinerama_fight (Display *dpy, monitor **randr_monitors,
}
else
{
- *errP = append (*errP,
- "WARNING: RANDR and Xinerama report different\n"
- " screen layouts! Believing RANDR.");
+ *errP = append (*errP, /* This is "normal" now, I guess. */
+ "RANDR and Xinerama report different screen layouts");
free_monitors (xinerama_monitors);
return randr_monitors;
}
@@ -642,7 +442,6 @@ debug_scan_monitors (Display *dpy, char **errP)
index = (index+1) % countof(geoms);
return monitors;
}
-
#endif /* DEBUG_MULTISCREEN */
@@ -683,42 +482,36 @@ quadruple (monitor **monitors, Bool debug_p, char **errP)
#endif /* QUAD_MODE */
-static monitor **
-scan_monitors (saver_info *si)
+monitor **
+scan_monitors (Display *dpy)
{
- saver_preferences *p = &si->prefs;
monitor **monitors = 0;
char *err = 0;
# ifdef DEBUG_MULTISCREEN
- if (! monitors) monitors = debug_scan_monitors (si->dpy, &err);
+ if (! monitors) monitors = debug_scan_monitors (dpy, &err);
# endif
# ifdef HAVE_RANDR
- if (! p->getviewport_full_of_lies_p)
- if (! monitors) monitors = randr_scan_monitors (si->dpy, &err);
+ if (! monitors) monitors = randr_scan_monitors (dpy, &err);
# ifdef HAVE_XINERAMA
- monitors = randr_versus_xinerama_fight (si->dpy, monitors, &err);
+ monitors = randr_versus_xinerama_fight (dpy, monitors, &err);
# endif
# endif /* HAVE_RANDR */
-# ifdef HAVE_XF86VMODE
- if (! monitors) monitors = vidmode_scan_monitors (si->dpy, &err);
-# endif
-
# ifdef HAVE_XINERAMA
- if (! monitors) monitors = xinerama_scan_monitors (si->dpy, &err);
+ if (! monitors) monitors = xinerama_scan_monitors (dpy, &err);
# endif
- if (! monitors) monitors = basic_scan_monitors (si->dpy, &err);
+ if (! monitors) monitors = basic_scan_monitors (dpy, &err);
# ifdef QUAD_MODE
if (p->quad_p)
monitors = quadruple (monitors, p->debug_p, &err);
# endif
- if (monitors && err) monitors[0]->err = err;
+ if (monitors && *monitors && err) monitors[0]->err = err;
return monitors;
}
@@ -778,7 +571,7 @@ plausible_aspect_ratio_p (monitor **monitors)
/* Mark the ones that overlap, etc.
*/
-static void
+void
check_monitor_sanity (monitor **monitors)
{
int i, j, count = 0;
@@ -862,8 +655,8 @@ check_monitor_sanity (monitor **monitors)
}
-static Bool
-layouts_differ_p (monitor **a, monitor **b)
+Bool
+monitor_layouts_differ_p (monitor **a, monitor **b)
{
if (!a || !b) return True;
while (1)
@@ -886,10 +679,21 @@ layouts_differ_p (monitor **a, monitor **b)
}
+static int
+screen_number (Screen *screen)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ int i;
+ for (i = 0; i < ScreenCount (dpy); i++)
+ if (ScreenOfDisplay (dpy, i) == screen)
+ return i;
+ return 0;
+}
+
+
void
-describe_monitor_layout (saver_info *si)
+describe_monitor_layout (monitor **monitors)
{
- monitor **monitors = si->monitor_layout;
int count = 0;
int good_count = 0;
int bad_count = 0;
@@ -904,7 +708,7 @@ describe_monitor_layout (saver_info *si)
count++;
}
- if (monitors[0]->err) /* deferred error msg */
+ if (monitors && *monitors && monitors[0]->err) /* deferred error msg */
{
char *token = strtok (monitors[0]->err, "\n");
while (token)
@@ -980,115 +784,3 @@ describe_monitor_layout (saver_info *si)
blurb());
}
}
-
-
-/* Synchronize the contents of si->ssi to the current state of the monitors.
- Doesn't change anything if nothing has changed; otherwise, alters and
- reuses existing saver_screen_info structs as much as possible.
- Returns True if anything changed.
- */
-Bool
-update_screen_layout (saver_info *si)
-{
- monitor **monitors = scan_monitors (si);
- int count = 0;
- int good_count = 0;
- int i, j;
- int seen_screens[100] = { 0, };
-
- if (! layouts_differ_p (monitors, si->monitor_layout))
- {
- free_monitors (monitors);
- return False;
- }
-
- free_monitors (si->monitor_layout);
- si->monitor_layout = monitors;
- check_monitor_sanity (si->monitor_layout);
-
- while (monitors[count])
- {
- if (monitors[count]->sanity == S_SANE)
- good_count++;
- count++;
- }
-
- if (si->ssi_count == 0)
- {
- si->ssi_count = 10;
- si->screens = (saver_screen_info *)
- calloc (sizeof(*si->screens), si->ssi_count);
- }
-
- if (si->ssi_count <= good_count)
- {
- si->ssi_count = good_count + 10;
- si->screens = (saver_screen_info *)
- realloc (si->screens, sizeof(*si->screens) * si->ssi_count);
- memset (si->screens + si->nscreens, 0,
- sizeof(*si->screens) * (si->ssi_count - si->nscreens));
- }
-
- if (! si->screens) abort();
-
- si->nscreens = good_count;
-
- /* Regenerate the list of GL visuals as needed. */
- if (si->best_gl_visuals)
- free (si->best_gl_visuals);
- si->best_gl_visuals = 0;
-
- for (i = 0, j = 0; i < count; i++)
- {
- monitor *m = monitors[i];
- saver_screen_info *ssi = &si->screens[j];
- Screen *old_screen = ssi->screen;
- int sn;
- if (monitors[i]->sanity != S_SANE) continue;
-
- ssi->global = si;
- ssi->number = j;
-
- sn = screen_number (m->screen);
- ssi->screen = m->screen;
- ssi->real_screen_number = sn;
- ssi->real_screen_p = (seen_screens[sn] == 0);
- seen_screens[sn]++;
-
- ssi->default_visual =
- get_visual_resource (ssi->screen, "visualID", "VisualID", False);
- ssi->current_visual = ssi->default_visual;
- ssi->current_depth = visual_depth (ssi->screen, ssi->current_visual);
-
- /* If the screen changed (or if this is the first time) we need
- a new toplevel shell for this screen's depth.
- */
- if (ssi->screen != old_screen)
- initialize_screen_root_widget (ssi);
-
- ssi->last_poll_mouse.root_x = -1;
- ssi->last_poll_mouse.root_y = -1;
-
- ssi->x = m->x;
- ssi->y = m->y;
- ssi->width = m->width;
- ssi->height = m->height;
-
-# ifndef DEBUG_MULTISCREEN
- {
- saver_preferences *p = &si->prefs;
- if (p->debug_p
-# ifdef QUAD_MODE
- && !p->quad_p
-# endif
- )
- ssi->width /= 2;
- }
-# endif
-
- j++;
- }
-
- si->default_screen = &si->screens[0];
- return True;
-}
diff --git a/driver/screens.h b/driver/screens.h
new file mode 100644
index 0000000..1e3501c
--- /dev/null
+++ b/driver/screens.h
@@ -0,0 +1,37 @@
+/* xscreensaver, Copyright © 1993-2021 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __XSCREENSAVER_SCREENS_H__
+#define __XSCREENSAVER_SCREENS_H__
+
+typedef struct _monitor monitor;
+
+typedef enum { S_SANE, S_ENCLOSED, S_DUPLICATE, S_OVERLAP,
+ S_OFFSCREEN, S_DISABLED } monitor_sanity;
+
+struct _monitor {
+ int id;
+ char *desc;
+ Screen *screen;
+ int x, y, width, height;
+ monitor_sanity sanity; /* I'm not crazy you're the one who's crazy */
+ int enemy; /* which monitor it overlaps or duplicates */
+ char *err; /* msg to print at appropriate later time;
+ exists only on monitor #0. */
+};
+
+extern monitor **scan_monitors (Display *);
+extern Bool monitor_layouts_differ_p (monitor **a, monitor **b);
+extern void free_monitors (monitor **monitors);
+extern void describe_monitor_layout (monitor **monitors);
+extern void check_monitor_sanity (monitor **monitors);
+
+#endif /* __XSCREENSAVER_SCREENS_H__ */
diff --git a/driver/screensaver-properties.desktop.in b/driver/screensaver-properties.desktop.in
index de42527..9cc17e6 100644
--- a/driver/screensaver-properties.desktop.in
+++ b/driver/screensaver-properties.desktop.in
@@ -1,5 +1,5 @@
[Desktop Entry]
-Exec=xscreensaver-demo
+Exec=xscreensaver-settings
Icon=xscreensaver
Terminal=false
_Name=Screensaver
diff --git a/driver/setuid.c b/driver/setuid.c
index 3ac78e4..164576f 100644
--- a/driver/setuid.c
+++ b/driver/setuid.c
@@ -1,5 +1,5 @@
/* setuid.c --- management of runtime privileges.
- * xscreensaver, Copyright (c) 1993-1998, 2005 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 1993-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -14,24 +14,20 @@
# include "config.h"
#endif
-#include <X11/Xlib.h> /* not used for much... */
-
-/* This file doesn't need the Xt headers, so stub these types out... */
-#undef XtPointer
-#define XtAppContext void*
-#define XrmDatabase void*
-#define XtIntervalId void*
-#define XtPointer void*
-#define Widget void*
-
-#include "xscreensaver.h"
-
-#ifndef EPERM
-#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
#endif
+#include <string.h>
#include <pwd.h> /* for getpwnam() and struct passwd */
#include <grp.h> /* for getgrgid() and struct group */
+#include <errno.h>
+
+#include "blurb.h"
+#include "auth.h"
+
static const char *
uid_gid_string (uid_t uid, gid_t gid)
@@ -49,31 +45,6 @@ uid_gid_string (uid_t uid, gid_t gid)
}
-void
-describe_uids (saver_info *si, FILE *out)
-{
- uid_t uid = getuid();
- gid_t gid = getgid();
- uid_t euid = geteuid();
- gid_t egid = getegid();
- char *s1 = strdup (uid_gid_string (uid, gid));
- char *s2 = strdup (uid_gid_string (euid, egid));
-
- if (si->orig_uid && *si->orig_uid &&
- (!!strcmp (si->orig_uid, s1) ||
- !!strcmp (si->orig_uid, s2)))
- fprintf (out, "%s: initial effective uid/gid was %s\n", blurb(),
- si->orig_uid);
-
- fprintf (out, "%s: running as %s", blurb(), s1);
- if (uid != euid || gid != egid)
- fprintf (out, "; effectively %s", s2);
- fprintf(out, "\n");
- free(s1);
- free(s2);
-}
-
-
/* Returns true if we need to call setgroups().
Without calling setgroups(), the process will retain any supplementary
@@ -113,7 +84,7 @@ setgroups_needed_p (uid_t target_group)
static int
-set_ids_by_number (uid_t uid, gid_t gid, char **message_ret)
+set_ids_by_number (uid_t uid, gid_t gid)
{
int uid_errno = 0;
int gid_errno = 0;
@@ -121,9 +92,6 @@ set_ids_by_number (uid_t uid, gid_t gid, char **message_ret)
struct passwd *p = getpwuid (uid);
struct group *g = getgrgid (gid);
- if (message_ret)
- *message_ret = 0;
-
/* Rumor has it that some implementations of of setuid() do nothing
when called with -1; therefore, if the "nobody" user has a uid of
-1, then that would be Really Bad. Rumor further has it that such
@@ -150,13 +118,12 @@ set_ids_by_number (uid_t uid, gid_t gid, char **message_ret)
if (uid_errno == 0 && gid_errno == 0 && sgs_errno == 0)
{
- static char buf [1024];
- sprintf (buf, "changed uid/gid to %.100s/%.100s (%ld/%ld).",
- (p && p->pw_name ? p->pw_name : "???"),
- (g && g->gr_name ? g->gr_name : "???"),
- (long) uid, (long) gid);
- if (message_ret)
- *message_ret = buf;
+ if (verbose_p)
+ fprintf (stderr, "%s: changed uid/gid to %.100s/%.100s (%ld/%ld)\n",
+ blurb(),
+ (p && p->pw_name ? p->pw_name : "???"),
+ (g && g->gr_name ? g->gr_name : "???"),
+ (long) uid, (long) gid);
return 0;
}
else
@@ -176,7 +143,7 @@ set_ids_by_number (uid_t uid, gid_t gid, char **message_ret)
else
{
errno = sgs_errno;
- perror(buf);
+ perror (buf);
}
fprintf (stderr, "%s: effective group list: ", blurb());
@@ -206,11 +173,11 @@ set_ids_by_number (uid_t uid, gid_t gid, char **message_ret)
(g && g->gr_name ? g->gr_name : "???"),
(long) gid);
if (gid_errno == -1)
- fprintf(stderr, "%s: unknown error\n", buf);
+ fprintf (stderr, "%s: unknown error\n", buf);
else
{
errno = gid_errno;
- perror(buf);
+ perror (buf);
}
}
@@ -241,121 +208,63 @@ set_ids_by_number (uid_t uid, gid_t gid, char **message_ret)
lock-mode.)
*** WARNING: DO NOT DISABLE ANY OF THE FOLLOWING CODE!
- If you do so, you will open a security hole. See the sections
- of the xscreensaver manual titled "LOCKING AND ROOT LOGINS",
- and "USING XDM".
+ If you do so, you will open a security hole.
+ Do not log in to an X11 desktop as root.
+ Log in as a normal users and 'sudo' as needed.
*/
void
-hack_uid (saver_info *si)
+disavow_privileges (void)
{
+ uid_t euid = geteuid();
+ gid_t egid = getegid();
+ uid_t uid = getuid();
+ gid_t gid = getgid();
+ struct passwd *p;
- /* Discard privileges, and set the effective user/group ids to the
- real user/group ids. That is, give up our "chmod +s" rights.
- */
- {
- uid_t euid = geteuid();
- gid_t egid = getegid();
- uid_t uid = getuid();
- gid_t gid = getgid();
-
- si->orig_uid = strdup (uid_gid_string (euid, egid));
-
- if (uid != euid || gid != egid)
- if (set_ids_by_number (uid, gid, &si->uid_message) != 0)
- saver_exit (si, 1, 0);
- }
-
-
- /* Locking can't work when running as root, because we have no way of
- knowing what the user id of the logged in user is (so we don't know
- whose password to prompt for.)
-
- *** WARNING: DO NOT DISABLE THIS CODE!
- If you do so, you will open a security hole. See the sections
- of the xscreensaver manual titled "LOCKING AND ROOT LOGINS",
- and "USING XDM".
- */
- if (getuid() == (uid_t) 0)
+ if (uid != euid || gid != egid)
{
- si->locking_disabled_p = True;
- si->nolock_reason = "running as root";
+ if (verbose_p)
+ fprintf (stderr, "%s: initial effective uid/gid was %s\n", blurb(),
+ uid_gid_string (euid, egid));
+ if (set_ids_by_number (uid, gid) != 0)
+ exit (1); /* already printed error */
}
-
- /* If we're running as root, switch to a safer user. This is above and
- beyond the fact that we've disabling locking, above -- the theory is
- that running graphics demos as root is just always a stupid thing
- to do, since they have probably never been security reviewed and are
- more likely to be buggy than just about any other kind of program.
- (And that assumes non-malicious code. There are also attacks here.)
-
- *** WARNING: DO NOT DISABLE THIS CODE!
- If you do so, you will open a security hole. See the sections
- of the xscreensaver manual titled "LOCKING AND ROOT LOGINS",
- and "USING XDM".
+ /* If we're still running as root, or if the user we are running at seems
+ to be in any way hinky, exit and do not allow password authentication
+ to continue.
*/
- if (getuid() == (uid_t) 0)
- {
- struct passwd *p;
-
- p = getpwnam ("nobody");
- if (! p) p = getpwnam ("noaccess");
- if (! p) p = getpwnam ("daemon");
- if (! p)
- {
- fprintf (stderr,
- "%s: running as root, and couldn't find a safer uid.\n",
- blurb());
- saver_exit(si, 1, 0);
- }
+ uid = getuid (); /* get it again */
+ p = getpwuid (uid);
- if (set_ids_by_number (p->pw_uid, p->pw_gid, &si->uid_message) != 0)
- saver_exit (si, -1, 0);
+ if (!p ||
+ uid == (uid_t) 0 ||
+ uid == (uid_t) -1 ||
+ uid == (uid_t) -2 ||
+ p->pw_uid == (uid_t) 0 ||
+ p->pw_uid == (uid_t) -1 ||
+ p->pw_uid == (uid_t) -2 ||
+ !p->pw_name ||
+ !*p->pw_name ||
+ !strcmp (p->pw_name, "root") ||
+ !strcmp (p->pw_name, "nobody") ||
+ !strcmp (p->pw_name, "noaccess") ||
+ !strcmp (p->pw_name, "operator") ||
+ !strcmp (p->pw_name, "daemon") ||
+ !strcmp (p->pw_name, "bin") ||
+ !strcmp (p->pw_name, "adm") ||
+ !strcmp (p->pw_name, "sys") ||
+ !strcmp (p->pw_name, "games"))
+ {
+ fprintf (stderr,
+ "%s: running as user \"%s\" -- authentication disallowed\n",
+ blurb(),
+ (p && p->pw_name && *p->pw_name
+ ? p->pw_name
+ : "<unknown>"));
+ exit (1);
}
-
- /* If there's anything even remotely funny looking about the passwd struct,
- or if we're running as some other user from the list below (a
- non-comprehensive selection of users known to be privileged in some way,
- and not normal end-users) then disable locking. If it was possible,
- switching to "nobody" would be the thing to do, but only root itself has
- the privs to do that.
-
- *** WARNING: DO NOT DISABLE THIS CODE!
- If you do so, you will open a security hole. See the sections
- of the xscreensaver manual titled "LOCKING AND ROOT LOGINS",
- and "USING XDM".
- */
- {
- uid_t uid = getuid (); /* get it again */
- struct passwd *p = getpwuid (uid); /* get it again */
-
- if (!p ||
- uid == (uid_t) 0 ||
- uid == (uid_t) -1 ||
- uid == (uid_t) -2 ||
- p->pw_uid == (uid_t) 0 ||
- p->pw_uid == (uid_t) -1 ||
- p->pw_uid == (uid_t) -2 ||
- !p->pw_name ||
- !*p->pw_name ||
- !strcmp (p->pw_name, "root") ||
- !strcmp (p->pw_name, "nobody") ||
- !strcmp (p->pw_name, "noaccess") ||
- !strcmp (p->pw_name, "operator") ||
- !strcmp (p->pw_name, "daemon") ||
- !strcmp (p->pw_name, "bin") ||
- !strcmp (p->pw_name, "adm") ||
- !strcmp (p->pw_name, "sys") ||
- !strcmp (p->pw_name, "games"))
- {
- static char buf [1024];
- sprintf (buf, "running as %.100s",
- (p && p->pw_name && *p->pw_name
- ? p->pw_name : "<unknown>"));
- si->nolock_reason = buf;
- si->locking_disabled_p = True;
- si->dangerous_uid_p = True;
- }
- }
+ if (verbose_p)
+ fprintf (stderr, "%s: running as user \"%s\"\n", blurb(), p->pw_name);
}
diff --git a/driver/splash.c b/driver/splash.c
deleted file mode 100644
index b971ade..0000000
--- a/driver/splash.c
+++ /dev/null
@@ -1,917 +0,0 @@
-/* xscreensaver, Copyright (c) 1991-2018 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <X11/Intrinsic.h>
-
-#include "xscreensaver.h"
-#include "resources.h"
-#include "font-retry.h"
-
-#undef MAX
-#define MAX(a,b) ((a)>(b)?(a):(b))
-
-void
-draw_shaded_rectangle (Display *dpy, Window window,
- int x, int y,
- int width, int height,
- int thickness,
- unsigned long top_color,
- unsigned long bottom_color)
-{
- XPoint points[4];
- XGCValues gcv;
- GC gc1, gc2;
- if (thickness == 0) return;
-
- gcv.foreground = top_color;
- gc1 = XCreateGC (dpy, window, GCForeground, &gcv);
- gcv.foreground = bottom_color;
- gc2 = XCreateGC (dpy, window, GCForeground, &gcv);
-
- points [0].x = x;
- points [0].y = y;
- points [1].x = x + width;
- points [1].y = y;
- points [2].x = x + width - thickness;
- points [2].y = y + thickness;
- points [3].x = x;
- points [3].y = y + thickness;
- XFillPolygon (dpy, window, gc1, points, 4, Convex, CoordModeOrigin);
-
- points [0].x = x;
- points [0].y = y + thickness;
- points [1].x = x;
- points [1].y = y + height;
- points [2].x = x + thickness;
- points [2].y = y + height - thickness;
- points [3].x = x + thickness;
- points [3].y = y + thickness;
- XFillPolygon (dpy, window, gc1, points, 4, Convex, CoordModeOrigin);
-
- points [0].x = x + width;
- points [0].y = y;
- points [1].x = x + width - thickness;
- points [1].y = y + thickness;
- points [2].x = x + width - thickness;
- points [2].y = y + height - thickness;
- points [3].x = x + width;
- points [3].y = y + height - thickness;
- XFillPolygon (dpy, window, gc2, points, 4, Convex, CoordModeOrigin);
-
- points [0].x = x;
- points [0].y = y + height;
- points [1].x = x + width;
- points [1].y = y + height;
- points [2].x = x + width;
- points [2].y = y + height - thickness;
- points [3].x = x + thickness;
- points [3].y = y + height - thickness;
- XFillPolygon (dpy, window, gc2, points, 4, Convex, CoordModeOrigin);
-
- XFreeGC (dpy, gc1);
- XFreeGC (dpy, gc2);
-}
-
-
-int
-string_width (XFontStruct *font, char *s)
-{
- return XTextWidth(font, s, strlen(s));
-}
-
-
-static void update_splash_window (saver_info *si);
-static void draw_splash_window (saver_info *si);
-static void destroy_splash_window (saver_info *si);
-static void unsplash_timer (XtPointer closure, XtIntervalId *id);
-
-static void do_demo (saver_screen_info *ssi);
-#ifdef PREFS_BUTTON
-static void do_prefs (saver_screen_info *ssi);
-#endif /* PREFS_BUTTON */
-static void do_help (saver_screen_info *ssi);
-
-
-XFontStruct *
-splash_load_font (Display *dpy, char *name, char *class)
-{
- char *s = get_string_resource (dpy, name, class);
- XFontStruct *f;
- if (!s || !*s)
- s = "-*-helvetica-bold-r-*-*-*-140-*-*-*-*-*-*";
- f = load_font_retry (dpy, s);
- if (!f) abort();
- return f;
-}
-
-
-struct splash_dialog_data {
-
- saver_screen_info *prompt_screen;
- XtIntervalId timer;
-
- Dimension width;
- Dimension height;
-
- char *heading_label;
- char *body_label;
- char *body2_label;
- char *body3_label;
- char *body4_label;
- char *demo_label;
-#ifdef PREFS_BUTTON
- char *prefs_label;
-#endif /* PREFS_BUTTON */
- char *help_label;
-
- XFontStruct *heading_font;
- XFontStruct *body_font;
- XFontStruct *button_font;
-
- Pixel foreground;
- Pixel background;
- Pixel border;
- Pixel button_foreground;
- Pixel button_background;
- Pixel shadow_top;
- Pixel shadow_bottom;
-
- Dimension logo_width;
- Dimension logo_height;
- Dimension internal_border;
- Dimension shadow_width;
-
- Dimension button_width, button_height;
- Dimension demo_button_x, demo_button_y;
-#ifdef PREFS_BUTTON
- Dimension prefs_button_x, prefs_button_y;
-#endif /* PREFS_BUTTON */
- Dimension help_button_x, help_button_y;
-
- Pixmap logo_pixmap;
- Pixmap logo_clipmask;
- int logo_npixels;
- unsigned long *logo_pixels;
-
- int pressed;
-};
-
-
-void
-make_splash_dialog (saver_info *si)
-{
- saver_preferences *p = &si->prefs;
- int x, y, bw;
- XSetWindowAttributes attrs;
- unsigned long attrmask = 0;
- splash_dialog_data *sp;
- saver_screen_info *ssi;
- Colormap cmap;
-
- Bool whyne = senesculent_p ();
-
- if (whyne)
- {
- /* If locking is not enabled, make sure they see the message. */
- if (!p->lock_p)
- {
- si->prefs.splash_p = True;
- if (si->prefs.splash_duration < 5000)
- si->prefs.splash_duration = 5000;
- }
- si->prefs.splash_duration += 3000;
- }
-
- if (si->sp_data)
- return;
- if (!si->prefs.splash_p ||
- si->prefs.splash_duration <= 0)
- return;
-
- ssi = &si->screens[mouse_screen (si)];
-
- if (!ssi || !ssi->screen)
- return; /* WTF? Trying to splash while no screens connected? */
-
- cmap = DefaultColormapOfScreen (ssi->screen);
-
- sp = (splash_dialog_data *) calloc (1, sizeof(*sp));
- sp->prompt_screen = ssi;
-
- sp->heading_label = get_string_resource (si->dpy,
- "splash.heading.label",
- "Dialog.Label.Label");
- sp->body_label = get_string_resource (si->dpy,
- "splash.body.label",
- "Dialog.Label.Label");
- sp->body2_label = get_string_resource (si->dpy,
- "splash.body2.label",
- "Dialog.Label.Label");
- sp->demo_label = get_string_resource (si->dpy,
- "splash.demo.label",
- "Dialog.Button.Label");
-#ifdef PREFS_BUTTON
- sp->prefs_label = get_string_resource (si->dpy,
- "splash.prefs.label",
- "Dialog.Button.Label");
-#endif /* PREFS_BUTTON */
- sp->help_label = get_string_resource (si->dpy,
- "splash.help.label",
- "Dialog.Button.Label");
-
-
-
- if (whyne)
- {
- sp->body3_label = strdup("WARNING: This version is very old!");
- sp->body4_label = strdup("Please upgrade!");
- }
-
- if (!sp->heading_label)
- sp->heading_label = strdup("ERROR: REESOURCES NOT INSTALLED CORRECTLY");
- if (!sp->body_label)
- sp->body_label = strdup("ERROR: REESOURCES NOT INSTALLED CORRECTLY");
- if (!sp->body2_label)
- sp->body2_label = strdup("ERROR: REESOURCES NOT INSTALLED CORRECTLY");
- if (!sp->demo_label) sp->demo_label = strdup("ERROR");
-#ifdef PREFS_BUTTON
- if (!sp->prefs_label) sp->prefs_label = strdup("ERROR");
-#endif /* PREFS_BUTTON */
- if (!sp->help_label) sp->help_label = strdup("ERROR");
-
- /* Put the version number in the label. */
- {
- char *s = (char *) malloc (strlen(sp->heading_label) + 20);
- sprintf(s, sp->heading_label, si->version);
- free (sp->heading_label);
- sp->heading_label = s;
- }
-
- sp->heading_font =
- splash_load_font (si->dpy, "splash.headingFont", "Dialog.Font");
- sp->body_font =
- splash_load_font (si->dpy, "splash.bodyFont", "Dialog.Font");
- sp->button_font =
- splash_load_font (si->dpy, "splash.buttonFont", "Dialog.Font");
-
- sp->foreground = get_pixel_resource (si->dpy, cmap,
- "splash.foreground",
- "Dialog.Foreground");
- sp->background = get_pixel_resource (si->dpy, cmap,
- "splash.background",
- "Dialog.Background");
- sp->border = get_pixel_resource (si->dpy, cmap,
- "splash.borderColor",
- "Dialog.borderColor");
-
- if (sp->foreground == sp->background)
- {
- /* Make sure the error messages show up. */
- sp->foreground = BlackPixelOfScreen (ssi->screen);
- sp->background = WhitePixelOfScreen (ssi->screen);
- }
-
- sp->button_foreground = get_pixel_resource (si->dpy, cmap,
- "splash.Button.foreground",
- "Dialog.Button.Foreground");
- sp->button_background = get_pixel_resource (si->dpy, cmap,
- "splash.Button.background",
- "Dialog.Button.Background");
- sp->shadow_top = get_pixel_resource (si->dpy, cmap,
- "splash.topShadowColor",
- "Dialog.Foreground");
- sp->shadow_bottom = get_pixel_resource (si->dpy, cmap,
- "splash.bottomShadowColor",
- "Dialog.Background");
-
- sp->logo_width = get_integer_resource (si->dpy,
- "splash.logo.width",
- "Dialog.Logo.Width");
- sp->logo_height = get_integer_resource (si->dpy,
- "splash.logo.height",
- "Dialog.Logo.Height");
- sp->internal_border = get_integer_resource (si->dpy,
- "splash.internalBorderWidth",
- "Dialog.InternalBorderWidth");
- sp->shadow_width = get_integer_resource (si->dpy,
- "splash.shadowThickness",
- "Dialog.ShadowThickness");
-
- if (sp->logo_width == 0) sp->logo_width = 150;
- if (sp->logo_height == 0) sp->logo_height = 150;
- if (sp->internal_border == 0) sp->internal_border = 15;
- if (sp->shadow_width == 0) sp->shadow_width = 4;
-
- {
- int direction, ascent, descent;
- XCharStruct overall;
-
- sp->width = 0;
- sp->height = 0;
-
- /* Measure the heading_label. */
- XTextExtents (sp->heading_font,
- sp->heading_label, strlen(sp->heading_label),
- &direction, &ascent, &descent, &overall);
- if (overall.width > sp->width) sp->width = overall.width;
- sp->height += ascent + descent;
-
- /* Measure the body_label. */
- XTextExtents (sp->body_font,
- sp->body_label, strlen(sp->body_label),
- &direction, &ascent, &descent, &overall);
- if (overall.width > sp->width) sp->width = overall.width;
- sp->height += ascent + descent;
-
- /* Measure the body2_label. */
- XTextExtents (sp->body_font,
- sp->body2_label, strlen(sp->body2_label),
- &direction, &ascent, &descent, &overall);
- if (overall.width > sp->width) sp->width = overall.width;
- sp->height += ascent + descent;
-
- /* Measure the optional body3_label. */
- if (sp->body3_label)
- {
- XTextExtents (sp->heading_font,
- sp->body3_label, strlen(sp->body3_label),
- &direction, &ascent, &descent, &overall);
- if (overall.width > sp->width) sp->width = overall.width;
- XTextExtents (sp->heading_font,
- sp->body4_label, strlen(sp->body4_label),
- &direction, &ascent, &descent, &overall);
- if (overall.width > sp->width) sp->width = overall.width;
- sp->height += (ascent + descent) * 5;
- }
-
- {
- Dimension w2 = 0, w3 = 0, w4 = 0;
- Dimension h2 = 0, h3 = 0, h4 = 0;
-
- /* Measure the Demo button. */
- XTextExtents (sp->button_font,
- sp->demo_label, strlen(sp->demo_label),
- &direction, &ascent, &descent, &overall);
- w2 = overall.width;
- h2 = ascent + descent;
-
-#ifdef PREFS_BUTTON
- /* Measure the Prefs button. */
- XTextExtents (sp->button_font,
- sp->prefs_label, strlen(sp->prefs_label),
- &direction, &ascent, &descent, &overall);
- w3 = overall.width;
- h3 = ascent + descent;
-#else /* !PREFS_BUTTON */
- w3 = 0;
- h3 = 0;
-#endif /* !PREFS_BUTTON */
-
- /* Measure the Help button. */
- XTextExtents (sp->button_font,
- sp->help_label, strlen(sp->help_label),
- &direction, &ascent, &descent, &overall);
- w4 = overall.width;
- h4 = ascent + descent;
-
- w2 = MAX(w2, w3); w2 = MAX(w2, w4);
- h2 = MAX(h2, h3); h2 = MAX(h2, h4);
-
- /* Add some horizontal padding inside the buttons. */
- w2 += ascent;
-
- w2 += ((ascent + descent) / 2) + (sp->shadow_width * 2);
- h2 += ((ascent + descent) / 2) + (sp->shadow_width * 2);
-
- sp->button_width = w2;
- sp->button_height = h2;
-
-#ifdef PREFS_BUTTON
- w2 *= 3;
-#else /* !PREFS_BUTTON */
- w2 *= 2;
-#endif /* !PREFS_BUTTON */
-
- w2 += ((ascent + descent) * 2); /* for space between buttons */
-
- if (w2 > sp->width) sp->width = w2;
- sp->height += h2;
- }
-
- sp->width += (sp->internal_border * 2);
- sp->height += (sp->internal_border * 3);
-
- if (sp->logo_height > sp->height)
- sp->height = sp->logo_height;
- else if (sp->height > sp->logo_height)
- sp->logo_height = sp->height;
-
- sp->logo_width = sp->logo_height;
-
- sp->width += sp->logo_width;
- }
-
- attrmask |= CWOverrideRedirect; attrs.override_redirect = True;
- attrmask |= CWEventMask;
- attrs.event_mask = (ExposureMask | ButtonPressMask | ButtonReleaseMask);
-
- {
- int sx = 0, sy = 0, w, h;
-
- x = ssi->x;
- y = ssi->y;
- w = ssi->width;
- h = ssi->height;
- if (si->prefs.debug_p) w /= 2;
- x = sx + (((w + sp->width) / 2) - sp->width);
- y = sy + (((h + sp->height) / 2) - sp->height);
- if (x < sx) x = sx;
- if (y < sy) y = sy;
- }
-
- bw = get_integer_resource (si->dpy,
- "splash.borderWidth",
- "Dialog.BorderWidth");
-
- si->splash_dialog =
- XCreateWindow (si->dpy,
- RootWindowOfScreen(ssi->screen),
- x, y, sp->width, sp->height, bw,
- DefaultDepthOfScreen (ssi->screen), InputOutput,
- DefaultVisualOfScreen(ssi->screen),
- attrmask, &attrs);
- XSetWindowBackground (si->dpy, si->splash_dialog, sp->background);
- XSetWindowBorder (si->dpy, si->splash_dialog, sp->border);
-
-
- sp->logo_pixmap = xscreensaver_logo (ssi->screen,
- /* same visual as si->splash_dialog */
- DefaultVisualOfScreen (ssi->screen),
- si->splash_dialog, cmap,
- sp->background,
- &sp->logo_pixels, &sp->logo_npixels,
- &sp->logo_clipmask, True);
-
- XMapRaised (si->dpy, si->splash_dialog);
- XSync (si->dpy, False);
-
- si->sp_data = sp;
-
- sp->timer = XtAppAddTimeOut (si->app, si->prefs.splash_duration,
- unsplash_timer, (XtPointer) si);
-
- draw_splash_window (si);
- XSync (si->dpy, False);
-}
-
-
-static void
-draw_splash_window (saver_info *si)
-{
- splash_dialog_data *sp = si->sp_data;
- XGCValues gcv;
- GC gc1, gc2;
- int vspacing, height;
- int x1, x2, x3, y1, y2;
- int sw;
-
-#ifdef PREFS_BUTTON
- int hspacing;
- int nbuttons = 3;
-#endif /* !PREFS_BUTTON */
-
- height = (sp->heading_font->ascent + sp->heading_font->descent +
- sp->body_font->ascent + sp->body_font->descent +
- sp->body_font->ascent + sp->body_font->descent +
- sp->button_font->ascent + sp->button_font->descent);
- vspacing = ((sp->height
- - (4 * sp->shadow_width)
- - (2 * sp->internal_border)
- - height) / 5);
- if (vspacing < 0) vspacing = 0;
- if (vspacing > (sp->heading_font->ascent * 2))
- vspacing = (sp->heading_font->ascent * 2);
-
- gcv.foreground = sp->foreground;
- gc1 = XCreateGC (si->dpy, si->splash_dialog, GCForeground, &gcv);
- gc2 = XCreateGC (si->dpy, si->splash_dialog, GCForeground, &gcv);
- x1 = sp->logo_width;
- x3 = sp->width - (sp->shadow_width * 2);
- y1 = sp->internal_border;
-
- /* top heading
- */
- XSetFont (si->dpy, gc1, sp->heading_font->fid);
- sw = string_width (sp->heading_font, sp->heading_label);
- x2 = (x1 + ((x3 - x1 - sw) / 2));
- y1 += sp->heading_font->ascent;
- XDrawString (si->dpy, si->splash_dialog, gc1, x2, y1,
- sp->heading_label, strlen(sp->heading_label));
- y1 += sp->heading_font->descent;
-
- /* text below top heading
- */
- XSetFont (si->dpy, gc1, sp->body_font->fid);
- y1 += vspacing + sp->body_font->ascent;
- sw = string_width (sp->body_font, sp->body_label);
- x2 = (x1 + ((x3 - x1 - sw) / 2));
- XDrawString (si->dpy, si->splash_dialog, gc1, x2, y1,
- sp->body_label, strlen(sp->body_label));
- y1 += sp->body_font->descent;
-
- y1 += sp->body_font->ascent;
- sw = string_width (sp->body_font, sp->body2_label);
- x2 = (x1 + ((x3 - x1 - sw) / 2));
- XDrawString (si->dpy, si->splash_dialog, gc1, x2, y1,
- sp->body2_label, strlen(sp->body2_label));
- y1 += sp->body_font->descent;
-
- if (sp->body3_label)
- {
- XSetFont (si->dpy, gc1, sp->heading_font->fid);
- y1 += sp->heading_font->ascent + sp->heading_font->descent;
- y1 += sp->heading_font->ascent;
- sw = string_width (sp->heading_font, sp->body3_label);
- x2 = (x1 + ((x3 - x1 - sw) / 2));
- XDrawString (si->dpy, si->splash_dialog, gc1, x2, y1,
- sp->body3_label, strlen(sp->body3_label));
- y1 += sp->heading_font->descent + sp->heading_font->ascent;
- sw = string_width (sp->heading_font, sp->body4_label);
- x2 = (x1 + ((x3 - x1 - sw) / 2));
- XDrawString (si->dpy, si->splash_dialog, gc1, x2, y1,
- sp->body4_label, strlen(sp->body4_label));
- y1 += sp->heading_font->descent;
- XSetFont (si->dpy, gc1, sp->body_font->fid);
- }
-
- /* The buttons
- */
- XSetForeground (si->dpy, gc1, sp->button_foreground);
- XSetForeground (si->dpy, gc2, sp->button_background);
-
-/* y1 += (vspacing * 2);*/
- y1 = sp->height - sp->internal_border - sp->button_height;
-
- x1 += sp->internal_border;
- y2 = (y1 + ((sp->button_height -
- (sp->button_font->ascent + sp->button_font->descent))
- / 2)
- + sp->button_font->ascent);
-#ifdef PREFS_BUTTON
- hspacing = ((sp->width - x1 - (sp->shadow_width * 2) -
- sp->internal_border - (sp->button_width * nbuttons))
- / 2);
-#endif
-
- x2 = x1 + ((sp->button_width - string_width(sp->button_font, sp->demo_label))
- / 2);
- XFillRectangle (si->dpy, si->splash_dialog, gc2, x1, y1,
- sp->button_width, sp->button_height);
- XDrawString (si->dpy, si->splash_dialog, gc1, x2, y2,
- sp->demo_label, strlen(sp->demo_label));
- sp->demo_button_x = x1;
- sp->demo_button_y = y1;
-
-#ifdef PREFS_BUTTON
- x1 += hspacing + sp->button_width;
- x2 = x1 + ((sp->button_width - string_width(sp->button_font,sp->prefs_label))
- / 2);
- XFillRectangle (si->dpy, si->splash_dialog, gc2, x1, y1,
- sp->button_width, sp->button_height);
- XDrawString (si->dpy, si->splash_dialog, gc1, x2, y2,
- sp->prefs_label, strlen(sp->prefs_label));
- sp->prefs_button_x = x1;
- sp->prefs_button_y = y1;
-#endif /* PREFS_BUTTON */
-
-#ifdef PREFS_BUTTON
- x1 += hspacing + sp->button_width;
-#else /* !PREFS_BUTTON */
- x1 = (sp->width - sp->button_width -
- sp->internal_border - (sp->shadow_width * 2));
-#endif /* !PREFS_BUTTON */
-
- x2 = x1 + ((sp->button_width - string_width(sp->button_font,sp->help_label))
- / 2);
- XFillRectangle (si->dpy, si->splash_dialog, gc2, x1, y1,
- sp->button_width, sp->button_height);
- XDrawString (si->dpy, si->splash_dialog, gc1, x2, y2,
- sp->help_label, strlen(sp->help_label));
- sp->help_button_x = x1;
- sp->help_button_y = y1;
-
-
- /* The logo
- */
- x1 = sp->shadow_width * 6;
- y1 = sp->shadow_width * 6;
- x2 = sp->logo_width - (sp->shadow_width * 12);
- y2 = sp->logo_height - (sp->shadow_width * 12);
-
- if (sp->logo_pixmap)
- {
- Window root;
- int x, y;
- unsigned int w, h, bw, d;
- XGetGeometry (si->dpy, sp->logo_pixmap, &root, &x, &y, &w, &h, &bw, &d);
- XSetForeground (si->dpy, gc1, sp->foreground);
- XSetBackground (si->dpy, gc1, sp->background);
- XSetClipMask (si->dpy, gc1, sp->logo_clipmask);
- XSetClipOrigin (si->dpy, gc1, x1 + ((x2 - (int)w) /2), y1 + ((y2 - (int)h) / 2));
- if (d == 1)
- XCopyPlane (si->dpy, sp->logo_pixmap, si->splash_dialog, gc1,
- 0, 0, w, h,
- x1 + ((x2 - (int)w) / 2),
- y1 + ((y2 - (int)h) / 2),
- 1);
- else
- XCopyArea (si->dpy, sp->logo_pixmap, si->splash_dialog, gc1,
- 0, 0, w, h,
- x1 + ((x2 - (int)w) / 2),
- y1 + ((y2 - (int)h) / 2));
- }
-
- /* Solid border inside the logo box. */
-#if 0
- XSetForeground (si->dpy, gc1, sp->foreground);
- XDrawRectangle (si->dpy, si->splash_dialog, gc1, x1, y1, x2-1, y2-1);
-#endif
-
- /* The shadow around the logo
- */
- draw_shaded_rectangle (si->dpy, si->splash_dialog,
- sp->shadow_width * 4,
- sp->shadow_width * 4,
- sp->logo_width - (sp->shadow_width * 8),
- sp->logo_height - (sp->shadow_width * 8),
- sp->shadow_width,
- sp->shadow_bottom, sp->shadow_top);
-
- /* The shadow around the whole window
- */
- draw_shaded_rectangle (si->dpy, si->splash_dialog,
- 0, 0, sp->width, sp->height, sp->shadow_width,
- sp->shadow_top, sp->shadow_bottom);
-
- XFreeGC (si->dpy, gc1);
- XFreeGC (si->dpy, gc2);
-
- update_splash_window (si);
-}
-
-
-static void
-update_splash_window (saver_info *si)
-{
- splash_dialog_data *sp = si->sp_data;
- int pressed;
- if (!sp) return;
- pressed = sp->pressed;
-
- /* The shadows around the buttons
- */
- draw_shaded_rectangle (si->dpy, si->splash_dialog,
- sp->demo_button_x, sp->demo_button_y,
- sp->button_width, sp->button_height, sp->shadow_width,
- (pressed == 1 ? sp->shadow_bottom : sp->shadow_top),
- (pressed == 1 ? sp->shadow_top : sp->shadow_bottom));
-#ifdef PREFS_BUTTON
- draw_shaded_rectangle (si->dpy, si->splash_dialog,
- sp->prefs_button_x, sp->prefs_button_y,
- sp->button_width, sp->button_height, sp->shadow_width,
- (pressed == 2 ? sp->shadow_bottom : sp->shadow_top),
- (pressed == 2 ? sp->shadow_top : sp->shadow_bottom));
-#endif /* PREFS_BUTTON */
- draw_shaded_rectangle (si->dpy, si->splash_dialog,
- sp->help_button_x, sp->help_button_y,
- sp->button_width, sp->button_height, sp->shadow_width,
- (pressed == 3 ? sp->shadow_bottom : sp->shadow_top),
- (pressed == 3 ? sp->shadow_top : sp->shadow_bottom));
-}
-
-static void
-destroy_splash_window (saver_info *si)
-{
- splash_dialog_data *sp = si->sp_data;
- saver_screen_info *ssi = sp->prompt_screen;
- Colormap cmap = DefaultColormapOfScreen (ssi->screen);
- Pixel black = BlackPixelOfScreen (ssi->screen);
- Pixel white = WhitePixelOfScreen (ssi->screen);
-
- if (sp->timer)
- XtRemoveTimeOut (sp->timer);
-
- if (si->splash_dialog)
- {
- XDestroyWindow (si->dpy, si->splash_dialog);
- si->splash_dialog = 0;
- }
-
- if (sp->heading_label) free (sp->heading_label);
- if (sp->body_label) free (sp->body_label);
- if (sp->body2_label) free (sp->body2_label);
- if (sp->body3_label) free (sp->body3_label);
- if (sp->body4_label) free (sp->body4_label);
- if (sp->demo_label) free (sp->demo_label);
-#ifdef PREFS_BUTTON
- if (sp->prefs_label) free (sp->prefs_label);
-#endif /* PREFS_BUTTON */
- if (sp->help_label) free (sp->help_label);
-
- if (sp->heading_font) XFreeFont (si->dpy, sp->heading_font);
- if (sp->body_font) XFreeFont (si->dpy, sp->body_font);
- if (sp->button_font) XFreeFont (si->dpy, sp->button_font);
-
- if (sp->foreground != black && sp->foreground != white)
- XFreeColors (si->dpy, cmap, &sp->foreground, 1, 0L);
- if (sp->background != black && sp->background != white)
- XFreeColors (si->dpy, cmap, &sp->background, 1, 0L);
- if (sp->button_foreground != black && sp->button_foreground != white)
- XFreeColors (si->dpy, cmap, &sp->button_foreground, 1, 0L);
- if (sp->button_background != black && sp->button_background != white)
- XFreeColors (si->dpy, cmap, &sp->button_background, 1, 0L);
- if (sp->shadow_top != black && sp->shadow_top != white)
- XFreeColors (si->dpy, cmap, &sp->shadow_top, 1, 0L);
- if (sp->shadow_bottom != black && sp->shadow_bottom != white)
- XFreeColors (si->dpy, cmap, &sp->shadow_bottom, 1, 0L);
-
- if (sp->logo_pixmap)
- XFreePixmap (si->dpy, sp->logo_pixmap);
- if (sp->logo_clipmask)
- XFreePixmap (si->dpy, sp->logo_clipmask);
- if (sp->logo_pixels)
- {
- if (sp->logo_npixels)
- XFreeColors (si->dpy, cmap, sp->logo_pixels, sp->logo_npixels, 0L);
- free (sp->logo_pixels);
- sp->logo_pixels = 0;
- sp->logo_npixels = 0;
- }
-
- memset (sp, 0, sizeof(*sp));
- free (sp);
- si->sp_data = 0;
-}
-
-void
-handle_splash_event (saver_info *si, XEvent *event)
-{
- splash_dialog_data *sp = si->sp_data;
- saver_screen_info *ssi;
- int which = 0;
- if (!sp) return;
- ssi = sp->prompt_screen;
-
- switch (event->xany.type)
- {
- case Expose:
- draw_splash_window (si);
- break;
-
- case ButtonPress: case ButtonRelease:
-
- if (event->xbutton.x >= sp->demo_button_x &&
- event->xbutton.x < sp->demo_button_x + sp->button_width &&
- event->xbutton.y >= sp->demo_button_y &&
- event->xbutton.y < sp->demo_button_y + sp->button_height)
- which = 1;
-
-#ifdef PREFS_BUTTON
- else if (event->xbutton.x >= sp->prefs_button_x &&
- event->xbutton.x < sp->prefs_button_x + sp->button_width &&
- event->xbutton.y >= sp->prefs_button_y &&
- event->xbutton.y < sp->prefs_button_y + sp->button_height)
- which = 2;
-#endif /* PREFS_BUTTON */
-
- else if (event->xbutton.x >= sp->help_button_x &&
- event->xbutton.x < sp->help_button_x + sp->button_width &&
- event->xbutton.y >= sp->help_button_y &&
- event->xbutton.y < sp->help_button_y + sp->button_height)
- which = 3;
-
- if (event->xany.type == ButtonPress)
- {
- sp->pressed = which;
- update_splash_window (si);
- if (which == 0)
- XBell (si->dpy, False);
- }
- else if (event->xany.type == ButtonRelease)
- {
- if (which && sp->pressed == which)
- {
- destroy_splash_window (si);
- sp = si->sp_data;
- switch (which)
- {
- case 1: do_demo (ssi); break;
-#ifdef PREFS_BUTTON
- case 2: do_prefs (ssi); break;
-#endif /* PREFS_BUTTON */
- case 3: do_help (ssi); break;
- default: abort();
- }
- }
- else if (which == 0 && sp->pressed == 0)
- {
- /* click and release on the window but not in a button:
- treat that as "dismiss the splash dialog." */
- destroy_splash_window (si);
- sp = si->sp_data;
- }
- if (sp) sp->pressed = 0;
- update_splash_window (si);
- }
- break;
-
- default:
- break;
- }
-}
-
-static void
-unsplash_timer (XtPointer closure, XtIntervalId *id)
-{
- saver_info *si = (saver_info *) closure;
- if (si && si->sp_data)
- destroy_splash_window (si);
-}
-
-
-/* Button callbacks */
-
-#ifdef VMS
-# define pid_t int
-# define fork vfork
-#endif /* VMS */
-
-
-static void
-do_demo (saver_screen_info *ssi)
-{
- saver_info *si = ssi->global;
- saver_preferences *p = &si->prefs;
- const char *cmd = p->demo_command;
-
- if (cmd && *cmd)
- fork_and_exec (ssi, cmd);
- else
- fprintf (stderr, "%s: no demo-mode command has been specified.\n",
- blurb());
-}
-
-#ifdef PREFS_BUTTON
-static void
-do_prefs (saver_screen_info *ssi)
-{
- saver_info *si = ssi->global;
- saver_preferences *p = &si->prefs;
- const char *cmd = p->prefs_command;
-
- if (cmd && *cmd)
- fork_and_exec (ssi, cmd);
- else
- fprintf (stderr, "%s: no preferences command has been specified.\n",
- blurb());
-}
-#endif /* PREFS_BUTTON */
-
-static void
-do_help (saver_screen_info *ssi)
-{
- saver_info *si = ssi->global;
- saver_preferences *p = &si->prefs;
- char *help_command = 0;
-
- if (!p->load_url_command || !*p->load_url_command)
- {
- fprintf (stderr, "%s: no URL command has been specified.\n", blurb());
- return;
- }
- if (!p->help_url || !*p->help_url)
- {
- fprintf (stderr, "%s: no Help URL has been specified.\n", blurb());
- return;
- }
-
- help_command = (char *) malloc (strlen (p->load_url_command) +
- (strlen (p->help_url) * 4) + 10);
- sprintf (help_command, p->load_url_command,
- p->help_url, p->help_url, p->help_url, p->help_url);
-
- fork_and_exec (ssi, help_command);
- free (help_command);
-}
diff --git a/driver/subprocs.c b/driver/subprocs.c
index 6cb96d3..2b3453d 100644
--- a/driver/subprocs.c
+++ b/driver/subprocs.c
@@ -1,5 +1,5 @@
/* subprocs.c --- choosing, spawning, and killing screenhacks.
- * xscreensaver, Copyright (c) 1991-2019 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -19,6 +19,8 @@
#include <string.h>
#include <X11/Xlib.h> /* not used for much... */
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h> /* For XtAppAddSignal */
#ifndef ESRCH
# include <errno.h>
@@ -35,169 +37,23 @@
# include <sys/resource.h> /* for setrlimit() and RLIMIT_AS */
#endif
-#ifdef VMS
-# include <processes.h>
-# include <unixio.h> /* for close */
-# include <unixlib.h> /* for getpid */
-# define pid_t int
-# define fork vfork
-#endif /* VMS */
-
#include <signal.h> /* for the signal names */
#include <time.h>
-#if !defined(SIGCHLD) && defined(SIGCLD)
-# define SIGCHLD SIGCLD
-#endif
-
-#if 0 /* putenv() is declared in stdlib.h on modern linux systems. */
-#ifdef HAVE_PUTENV
-extern int putenv (/* const char * */); /* getenv() is in stdlib.h... */
-#endif
+#ifdef ENABLE_NLS
+# include <locale.h>
+# include <libintl.h>
+# define _(S) gettext(S)
+#else
+# define _(S) (S)
#endif
-extern int kill (pid_t, int); /* signal() is in sys/signal.h... */
-
-/* This file doesn't need the Xt headers, so stub these types out... */
-#undef XtPointer
-#define XtAppContext void*
-#define XrmDatabase void*
-#define XtIntervalId void*
-#define XtPointer void*
-#define Widget void*
-
#include "xscreensaver.h"
#include "exec.h"
#include "yarandom.h"
-#include "visual.h" /* for id_to_visual() */
-
-extern saver_info *global_si_kludge; /* I hate C so much... */
-
-
-/* Used when printing error/debugging messages from signal handlers.
- */
-static const char *
-no_malloc_number_to_string (long num)
-{
- static char string[128] = "";
- int num_digits;
- Bool negative_p = False;
-
- num_digits = 0;
-
- if (num == 0)
- return "0";
-
- if (num < 0)
- {
- negative_p = True;
- num = -num;
- }
-
- while ((num > 0) && (num_digits < sizeof(string) - 1))
- {
- int digit;
- digit = (int) num % 10;
- num_digits++;
- string[sizeof(string) - 1 - num_digits] = digit + '0';
- num /= 10;
- }
-
- if (negative_p)
- {
- num_digits++;
- string[sizeof(string) - 1 - num_digits] = '-';
- }
-
- return string + sizeof(string) - 1 - num_digits;
-}
-
-/* Like write(), but runs strlen() on the arg to get the length. */
-static int
-write_string (int fd, const char *str)
-{
- return write (fd, str, strlen (str));
-}
-
-static int
-write_long (int fd, long n)
-{
- const char *str = no_malloc_number_to_string (n);
- return write_string (fd, str);
-}
-
-
-/* RLIMIT_AS (called RLIMIT_VMEM on some systems) controls the maximum size
- of a process's address space, i.e., the maximal brk(2) and mmap(2) values.
- Setting this lets you put a cap on how much memory a process can allocate.
-
- Except the "and mmap()" part kinda makes this useless, since many GL
- implementations end up using mmap() to pull the whole frame buffer into
- memory (or something along those lines) making it appear processes are
- using hundreds of megabytes when in fact they're using very little, and
- we end up capping their mallocs prematurely. YAY!
- */
-#if defined(RLIMIT_VMEM) && !defined(RLIMIT_AS)
-# define RLIMIT_AS RLIMIT_VMEM
-#endif
-
-static void
-limit_subproc_memory (int address_space_limit, Bool verbose_p)
-{
-
-/* This has caused way more problems than it has solved...
- Let's just completely ignore the "memoryLimit" option now.
- */
-#undef HAVE_SETRLIMIT
-
-#if defined(HAVE_SETRLIMIT) && defined(RLIMIT_AS)
- struct rlimit r;
-
- if (address_space_limit < 10 * 1024) /* let's not be crazy */
- return;
-
- if (getrlimit (RLIMIT_AS, &r) != 0)
- {
- char buf [512];
- sprintf (buf, "%s: getrlimit(RLIMIT_AS) failed", blurb());
- perror (buf);
- return;
- }
-
- r.rlim_cur = address_space_limit;
-
- if (setrlimit (RLIMIT_AS, &r) != 0)
- {
- char buf [512];
- sprintf (buf, "%s: setrlimit(RLIMIT_AS, {%lu, %lu}) failed",
- blurb(), r.rlim_cur, r.rlim_max);
- perror (buf);
- return;
- }
-
- if (verbose_p)
- {
- int i = address_space_limit;
- char buf[100];
- if (i >= (1<<30) && i == ((i >> 30) << 30))
- sprintf(buf, "%dG", i >> 30);
- else if (i >= (1<<20) && i == ((i >> 20) << 20))
- sprintf(buf, "%dM", i >> 20);
- else if (i >= (1<<10) && i == ((i >> 10) << 10))
- sprintf(buf, "%dK", i >> 10);
- else
- sprintf(buf, "%d bytes", i);
-
- fprintf (stderr, "%s: limited pid %lu address space to %s.\n",
- blurb(), (unsigned long) getpid (), buf);
- }
-
-#endif /* HAVE_SETRLIMIT && RLIMIT_AS */
-}
+#include "visual.h" /* for id_to_visual() */
+#include "atoms.h"
-
-/* Management of child processes, and de-zombification.
- */
enum job_status {
job_running, /* the process is still alive */
@@ -220,10 +76,107 @@ struct screenhack_job {
static struct screenhack_job *jobs = 0;
-/* for debugging -- nothing calls this, but it's useful to invoke from gdb.
+static void clean_job_list (void);
+static void await_dying_children (saver_info *si);
+static void describe_dead_child (saver_info *, pid_t, int wait_status,
+ struct rusage);
+
+static XtSignalId xt_sigterm_id = 0;
+static int sigterm_received = 0;
+
+static XtSignalId xt_sigchld_id = 0;
+static int sigchld_received = 0;
+
+
+const char *
+signal_name (int signal)
+{
+ /* sys_signame[], sys_siglist[], strsignal() and sigabbrev_np()
+ are an unportable mess. */
+ switch (signal) {
+ case SIGHUP: return "SIGHUP";
+ case SIGINT: return "SIGINT";
+ case SIGQUIT: return "SIGQUIT";
+ case SIGILL: return "SIGILL";
+ case SIGTRAP: return "SIGTRAP";
+#ifdef SIGABRT
+ case SIGABRT: return "SIGABRT";
+#endif
+ case SIGFPE: return "SIGFPE";
+ case SIGKILL: return "SIGKILL";
+ case SIGBUS: return "SIGBUS";
+ case SIGSEGV: return "SIGSEGV";
+ case SIGPIPE: return "SIGPIPE";
+ case SIGALRM: return "SIGALRM";
+ case SIGTERM: return "SIGTERM";
+#ifdef SIGSTOP
+ case SIGSTOP: return "SIGSTOP";
+#endif
+#ifdef SIGCONT
+ case SIGCONT: return "SIGCONT";
+#endif
+#ifdef SIGUSR1
+ case SIGUSR1: return "SIGUSR1";
+#endif
+#ifdef SIGUSR2
+ case SIGUSR2: return "SIGUSR2";
+#endif
+#ifdef SIGEMT
+ case SIGEMT: return "SIGEMT";
+#endif
+#ifdef SIGSYS
+ case SIGSYS: return "SIGSYS";
+#endif
+ case SIGCHLD: return "SIGCHLD";
+#ifdef SIGPWR
+ case SIGPWR: return "SIGPWR";
+#endif
+#ifdef SIGWINCH
+ case SIGWINCH: return "SIGWINCH";
+#endif
+#ifdef SIGURG
+ case SIGURG: return "SIGURG";
+#endif
+#ifdef SIGIO
+ case SIGIO: return "SIGIO";
+#endif
+#ifdef SIGVTALRM
+ case SIGVTALRM: return "SIGVTALRM";
+#endif
+#ifdef SIGXCPU
+ case SIGXCPU: return "SIGXCPU";
+#endif
+#ifdef SIGXFSZ
+ case SIGXFSZ: return "SIGXFSZ";
+#endif
+#ifdef SIGDANGER
+ case SIGDANGER: return "SIGDANGER";
+#endif
+ default:
+ {
+ static char buf[50];
+ sprintf(buf, "signal %d\n", signal);
+ return buf;
+ }
+ }
+}
+
+
+/* Management of child processes, and de-zombification.
*/
-void show_job_list (void);
+static char *
+timestring (time_t when)
+{
+ static char buf[255] = { 0 };
+ struct tm tm;
+ localtime_r (&when, &tm);
+ sprintf (buf, "%02d:%02d:%02d", tm.tm_hour, tm.tm_min, tm.tm_sec);
+ return buf;
+}
+
+#ifdef DEBUG
+void show_job_list (void);
void
show_job_list (void)
{
@@ -231,27 +184,24 @@ show_job_list (void)
fprintf(stderr, "%s: job list:\n", blurb());
for (job = jobs; job; job = job->next)
{
- char b[] = " ??:??:?? ";
- char *t = (job->killed ? timestring (job->killed) :
- job->launched ? timestring (job->launched) : b);
- t += 11;
- t[8] = 0;
- fprintf (stderr, " %5ld: %2d: (%s) %s %s\n",
- (long) job->pid,
- job->screen,
- (job->status == job_running ? "running" :
- job->status == job_stopped ? "stopped" :
- job->status == job_killed ? " killed" :
- job->status == job_dead ? " dead" : " ???"),
- t, job->name);
+ fprintf (stderr, " %5ld: %2d: (%s) %s %s\n",
+ (long) job->pid,
+ job->screen,
+ (job->status == job_running ? "running" :
+ job->status == job_stopped ? "stopped" :
+ job->status == job_killed ? " killed" :
+ job->status == job_dead ? " dead" : " ???"),
+ (job->killed ? timestring (job->killed) :
+ job->launched ? timestring (job->launched) :
+ "??:??:??"),
+ job->name);
}
fprintf (stderr, "\n");
}
+#endif /* DEBUG */
-static void clean_job_list (void);
-
-static struct screenhack_job *
+static void
make_job (pid_t pid, int screen, const char *cmd)
{
struct screenhack_job *job = (struct screenhack_job *) malloc (sizeof(*job));
@@ -288,8 +238,6 @@ make_job (pid_t pid, int screen, const char *cmd)
job->killed = 0;
job->next = jobs;
jobs = job;
-
- return jobs;
}
@@ -317,8 +265,7 @@ free_job (struct screenhack_job *job)
}
-/* Cleans out dead jobs from the jobs list -- this must only be called
- from the main thread, not from a signal handler.
+/* Cleans out dead jobs from the jobs list.
*/
static void
clean_job_list (void)
@@ -367,79 +314,8 @@ find_job (pid_t pid)
return 0;
}
-static void await_dying_children (saver_info *si);
-#ifndef VMS
-static void describe_dead_child (saver_info *, pid_t, int wait_status);
-#endif
-
-
-/* Semaphore to temporarily turn the SIGCHLD handler into a no-op.
- Don't alter this directly -- use block_sigchld() / unblock_sigchld().
- */
-static int block_sigchld_handler = 0;
-
-
-#ifdef HAVE_SIGACTION
- sigset_t
-#else /* !HAVE_SIGACTION */
- int
-#endif /* !HAVE_SIGACTION */
-block_sigchld (void)
-{
-#ifdef HAVE_SIGACTION
- struct sigaction sa;
- sigset_t child_set;
-
- memset (&sa, 0, sizeof (sa));
- sa.sa_handler = SIG_IGN;
- sigaction (SIGPIPE, &sa, NULL);
-
- sigemptyset (&child_set);
- sigaddset (&child_set, SIGCHLD);
- sigprocmask (SIG_BLOCK, &child_set, 0);
-
-#else /* !HAVE_SIGACTION */
- signal (SIGPIPE, SIG_IGN);
-#endif /* !HAVE_SIGACTION */
-
- block_sigchld_handler++;
-
-#ifdef HAVE_SIGACTION
- return child_set;
-#else /* !HAVE_SIGACTION */
- return 0;
-#endif /* !HAVE_SIGACTION */
-}
-
-void
-unblock_sigchld (void)
-{
- if (block_sigchld_handler <= 0)
- abort();
-
- if (block_sigchld_handler <= 1) /* only unblock if count going to 0 */
- {
-#ifdef HAVE_SIGACTION
- struct sigaction sa;
- sigset_t child_set;
-
- memset(&sa, 0, sizeof (sa));
- sa.sa_handler = SIG_DFL;
- sigaction(SIGPIPE, &sa, NULL);
-
- sigemptyset(&child_set);
- sigaddset(&child_set, SIGCHLD);
- sigprocmask(SIG_UNBLOCK, &child_set, 0);
-
-#else /* !HAVE_SIGACTION */
- signal(SIGPIPE, SIG_DFL);
-#endif /* !HAVE_SIGACTION */
- }
-
- block_sigchld_handler--;
-}
-int
+static int
kill_job (saver_info *si, pid_t pid, int signal)
{
saver_preferences *p = &si->prefs;
@@ -448,12 +324,6 @@ kill_job (saver_info *si, pid_t pid, int signal)
clean_job_list();
- if (in_signal_handler_p)
- /* This function should not be called from the signal handler. */
- abort();
-
- block_sigchld(); /* we control the horizontal... */
-
job = find_job (pid);
if (!job ||
!job->pid ||
@@ -471,7 +341,6 @@ kill_job (saver_info *si, pid_t pid, int signal)
job->killed = time ((time_t *) 0);
break;
#ifdef SIGSTOP
- /* #### there must be a way to do this on VMS... */
case SIGSTOP: job->status = job_stopped; break;
case SIGCONT: job->status = job_running; break;
#endif /* SIGSTOP */
@@ -492,7 +361,7 @@ kill_job (saver_info *si, pid_t pid, int signal)
{
if (errno == ESRCH)
fprintf (stderr,
- "%s: %d: child process %lu (%s) was already dead.\n",
+ "%s: %d: child process %lu (%s) was already dead\n",
blurb(), job->screen, (unsigned long) job->pid, job->name);
else
{
@@ -506,53 +375,148 @@ kill_job (saver_info *si, pid_t pid, int signal)
await_dying_children (si);
DONE:
- unblock_sigchld();
- if (block_sigchld_handler < 0)
- abort();
-
clean_job_list();
return status;
}
-#ifdef SIGCHLD
-static RETSIGTYPE
-sigchld_handler (int sig)
+/* We use Xt-style signal handling. A Unix signal fires, and we inform Xt of
+ that. Then after we return to the top-level command loop on the main
+ stack, Xt runs our callback function for that signal. Just like Xt timers.
+ */
+static void
+catch_signal (int sig, RETSIGTYPE (*handler) (int))
{
- saver_info *si = global_si_kludge; /* I hate C so much... */
- in_signal_handler_p++;
-
- if (si->prefs.debug_p)
+# ifdef HAVE_SIGACTION
+ struct sigaction a;
+ a.sa_handler = handler;
+ sigemptyset (&a.sa_mask);
+ a.sa_flags = 0;
+ if (sigaction (sig, &a, 0) < 0)
+# else /* !HAVE_SIGACTION */
+ if (((long) signal (sig, handler)) == -1L)
+# endif /* !HAVE_SIGACTION */
{
- /* Don't call fprintf() from signal handlers, as it might malloc.
- fprintf(stderr, "%s: got SIGCHLD%s\n", blurb(),
- (block_sigchld_handler ? " (blocked)" : ""));
- */
- write_string (STDERR_FILENO, blurb());
- write_string (STDERR_FILENO, ": got SIGCHLD");
-
- if (block_sigchld_handler)
- write_string (STDERR_FILENO, " (blocked)\n");
- else
- write_string (STDERR_FILENO, "\n");
+ char buf [255];
+ sprintf (buf, "%s: couldn't catch signal %s", blurb(),
+ signal_name (sig));
+ perror (buf);
+ abort();
}
+}
+
+
+/* Exiting gracefully.
+
+ When xscreensaver sends a SIGTERM signal to xscreensaver-gfx, rather
+ than exiting immediately, we want it to do two things:
+
+ - Send a SIGTERM to each running screenhack. They would *probably*
+ die of a BadWindow X error once their window was deleted, but this
+ is cleaner and more immediate.
+
+ - Fade the screens in from black. This might take several seconds.
+
+ Should another signal come in while that is ongoing, we should just
+ die immediately.
+ */
- if (block_sigchld_handler < 0)
- abort();
- else if (block_sigchld_handler == 0)
+static RETSIGTYPE
+saver_sigterm_handler (int sig)
+{
+ /* This is the actual signal handler, running on the signal stack.
+ After firing once, set this signal back to the default behavior. */
+ sigterm_received = sig;
+ catch_signal (sig, SIG_DFL);
+
+ /* The first time a signal fires, inform Xt of that so that it will run
+ xt_signal_handler(). "XtNoticeSignal is the only Intrinsics function
+ that can safely be called from a signal handler". */
+ if (xt_sigterm_id)
+ XtNoticeSignal (xt_sigterm_id);
+}
+
+
+static void
+xt_sigterm_handler (XtPointer data, XtSignalId *id)
+{
+ /* This runs from the Xt event loop on the main stack, some time after
+ the signal fired. */
+ saver_info *si = (saver_info *) data;
+ saver_preferences *p = &si->prefs;
+ static Bool hit_p = False;
+ int i;
+
+ if (xt_sigterm_id)
+ XtRemoveSignal (xt_sigterm_id);
+ xt_sigterm_id = 0;
+
+ if (hit_p)
+ fprintf (stderr, "%s: second signal: %s: exiting\n", blurb(),
+ signal_name (sigterm_received));
+ else
{
- block_sigchld();
- await_dying_children (si);
- unblock_sigchld();
+ hit_p = True;
+ if (p->verbose_p)
+ fprintf (stderr, "%s: %s: unblanking\n", blurb(),
+ signal_name (sigterm_received));
+
+ /* Kill before unblanking, to stop drawing as soon as possible. */
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ if (ssi->cycle_id)
+ {
+ XtRemoveTimeOut (ssi->cycle_id);
+ ssi->cycle_id = 0;
+ ssi->cycle_at = 0;
+ }
+ kill_screenhack (ssi);
+ }
+ unblank_screen (si);
+
+ if (p->verbose_p)
+ fprintf (stderr, "%s: %s: exiting\n", blurb(),
+ signal_name (sigterm_received));
}
- init_sigchld();
- in_signal_handler_p--;
+ /* Exit with the original signal received. */
+ kill (getpid(), sigterm_received);
+ abort();
+}
+
+
+/* SIGCHLD handling. Basically the same deal as SIGTERM.
+ */
+
+static RETSIGTYPE
+sigchld_handler (int sig)
+{
+ /* This is the actual signal handler, running on the signal stack.
+ After firing once, set this signal to fire again. */
+ sigchld_received = sig;
+# ifndef HAVE_SIGACTION
+ catch_signal (SIGCHLD, sigchld_handler);
+# endif
+
+ if (xt_sigchld_id)
+ XtNoticeSignal (xt_sigchld_id);
}
-#endif /* SIGCHLD */
-#ifndef VMS
+static void
+xt_sigchld_handler (XtPointer data, XtSignalId *id)
+{
+ /* This runs from the Xt event loop on the main stack, some time after
+ the signal fired. */
+ saver_info *si = (saver_info *) data;
+
+ if (si->prefs.debug_p)
+ fprintf(stderr, "%s: got SIGCHLD\n", blurb());
+
+ await_dying_children (si); /* Their first album was better */
+}
+
static void
await_dying_children (saver_info *si)
@@ -561,36 +525,19 @@ await_dying_children (saver_info *si)
{
int wait_status = 0;
pid_t kid;
+ struct rusage rus;
errno = 0;
- kid = waitpid (-1, &wait_status, WNOHANG|WUNTRACED);
+ kid = wait4 (-1, &wait_status, WNOHANG|WUNTRACED, &rus);
if (si->prefs.debug_p)
{
if (kid < 0 && errno)
- {
- /* Don't call fprintf() from signal handlers, as it might malloc.
- fprintf (stderr, "%s: waitpid(-1) ==> %ld (%d)\n", blurb(),
- (long) kid, errno);
- */
- write_string (STDERR_FILENO, blurb());
- write_string (STDERR_FILENO, ": waitpid(-1) ==> ");
- write_long (STDERR_FILENO, (long) kid);
- write_string (STDERR_FILENO, " (");
- write_long (STDERR_FILENO, (long) errno);
- write_string (STDERR_FILENO, ")\n");
- }
+ fprintf (stderr, "%s: waitpid(-1) ==> %ld (%d)\n", blurb(),
+ (long) kid, errno);
else
- {
- /* Don't call fprintf() from signal handlers, as it might malloc.
- fprintf (stderr, "%s: waitpid(-1) ==> %ld\n", blurb(),
- (long) kid);
- */
- write_string (STDERR_FILENO, blurb());
- write_string (STDERR_FILENO, ": waitpid(-1) ==> ");
- write_long (STDERR_FILENO, (long) kid);
- write_string (STDERR_FILENO, "\n");
- }
+ fprintf (stderr, "%s: waitpid(-1) ==> %ld\n", blurb(),
+ (long) kid);
}
/* 0 means no more children to reap.
@@ -600,272 +547,193 @@ await_dying_children (saver_info *si)
(kid < 0 && errno != EINTR))
break;
- describe_dead_child (si, kid, wait_status);
+ describe_dead_child (si, kid, wait_status, rus);
}
}
static void
-describe_dead_child (saver_info *si, pid_t kid, int wait_status)
+describe_dead_child (saver_info *si, pid_t kid, int wait_status,
+ struct rusage rus)
{
int i;
saver_preferences *p = &si->prefs;
struct screenhack_job *job = find_job (kid);
const char *name = job ? job->name : "<unknown>";
int screen_no = job ? job->screen : 0;
+ char msg[1024];
+ *msg = 0;
if (WIFEXITED (wait_status))
{
int exit_status = WEXITSTATUS (wait_status);
-
/* Treat exit code as a signed 8-bit quantity. */
if (exit_status & 0x80) exit_status |= ~0xFF;
- /* One might assume that exiting with non-0 means something went wrong.
- But that loser xswarm exits with the code that it was killed with, so
- it *always* exits abnormally. Treat abnormal exits as "normal" (don't
- mention them) if we've just killed the subprocess. But mention them
- if they happen on their own.
- */
- if (!job ||
- (exit_status != 0 &&
- (p->verbose_p || job->status != job_killed)))
- {
- /* Don't call fprintf() from signal handlers, as it might malloc.
- fprintf (stderr,
- "%s: %d: child pid %lu (%s) exited abnormally (code %d).\n",
- blurb(), screen_no, (unsigned long) kid, name, exit_status);
- */
- write_string (STDERR_FILENO, blurb());
- write_string (STDERR_FILENO, ": ");
- write_long (STDERR_FILENO, (long) screen_no);
- write_string (STDERR_FILENO, ": child pid ");
- write_long (STDERR_FILENO, (long) kid);
- write_string (STDERR_FILENO, " (");
- write_string (STDERR_FILENO, name);
- write_string (STDERR_FILENO, ") exited abnormally (code ");
- write_long (STDERR_FILENO, (long) exit_status);
- write_string (STDERR_FILENO, ").\n");
- }
- else if (p->verbose_p)
- {
- /* Don't call fprintf() from signal handlers, as it might malloc.
- fprintf (stderr, "%s: %d: child pid %lu (%s) exited normally.\n",
- blurb(), screen_no, (unsigned long) kid, name);
- */
- write_string (STDERR_FILENO, blurb());
- write_string (STDERR_FILENO, ": ");
- write_long (STDERR_FILENO, (long) screen_no);
- write_string (STDERR_FILENO, ": child pid ");
- write_long (STDERR_FILENO, (long) kid);
- write_string (STDERR_FILENO, " (");
- write_string (STDERR_FILENO, name);
- write_string (STDERR_FILENO, ") exited normally.\n");
- }
-
+ sprintf (msg, _("crashed with status %d"), exit_status);
+ if (p->verbose_p)
+ fprintf (stderr,
+ "%s: %d: child pid %lu (%s) exited abnormally"
+ " with status %d\n",
+ blurb(), screen_no, (unsigned long) kid, name, exit_status);
if (job)
job->status = job_dead;
}
else if (WIFSIGNALED (wait_status))
{
- if (p->verbose_p ||
- !job ||
- job->status != job_killed ||
- WTERMSIG (wait_status) != SIGTERM)
+ const char *sig = signal_name (WTERMSIG (wait_status));
+ if (job &&
+ job->status == job_killed &&
+ WTERMSIG (wait_status) == SIGTERM)
{
- /* Don't call fprintf() from signal handlers, as it might malloc.
- fprintf (stderr, "%s: %d: child pid %lu (%s) terminated with %s.\n",
- blurb(), screen_no, (unsigned long) kid, name,
- signal_name (WTERMSIG(wait_status)));
- */
- write_string (STDERR_FILENO, blurb());
- write_string (STDERR_FILENO, ": ");
- write_long (STDERR_FILENO, (long) screen_no);
- write_string (STDERR_FILENO, ": child pid ");
- write_long (STDERR_FILENO, (long) kid);
- write_string (STDERR_FILENO, " (");
- write_string (STDERR_FILENO, name);
- write_string (STDERR_FILENO, ") terminated with signal ");
- write_long (STDERR_FILENO, WTERMSIG(wait_status));
- write_string (STDERR_FILENO, ".\n");
+ /* Expected notification after we killed it. */
+ sprintf (msg, _("exited normally with %.100s"), sig);
+ if (p->verbose_p)
+ fprintf (stderr, "%s: %d: child pid %lu (%s)"
+ " exited normally with %s\n",
+ blurb(), screen_no, (unsigned long) kid, name, sig);
+ }
+ else
+ {
+ /* Unexpected signal. */
+ sprintf (msg, _("crashed with %.100s"), sig);
+ if (p->verbose_p)
+ fprintf (stderr, "%s: %d: child pid %lu (%s)"
+ " unexpectedly terminated with %s\n",
+ blurb(), screen_no, (unsigned long) kid, name, sig);
}
-
if (job)
job->status = job_dead;
}
else if (WIFSTOPPED (wait_status))
{
if (p->verbose_p)
- {
- /* Don't call fprintf() from signal handlers, as it might malloc.
- fprintf (stderr, "%s: child pid %lu (%s) stopped with %s.\n",
- blurb(), (unsigned long) kid, name,
- signal_name (WSTOPSIG (wait_status)));
- */
- write_string (STDERR_FILENO, blurb());
- write_string (STDERR_FILENO, ": ");
- write_long (STDERR_FILENO, (long) screen_no);
- write_string (STDERR_FILENO, ": child pid ");
- write_long (STDERR_FILENO, (long) kid);
- write_string (STDERR_FILENO, " (");
- write_string (STDERR_FILENO, name);
- write_string (STDERR_FILENO, ") stopped with signal ");
- write_long (STDERR_FILENO, WSTOPSIG(wait_status));
- write_string (STDERR_FILENO, ".\n");
- }
-
+ fprintf (stderr, "%s: child pid %lu (%s) stopped with %s\n",
+ blurb(), (unsigned long) kid, name,
+ signal_name (WSTOPSIG (wait_status)));
if (job)
job->status = job_stopped;
}
else
{
- /* Don't call fprintf() from signal handlers, as it might malloc.
+ /* Didn't exit, signal or stop; is this even possible? */
+ sprintf (msg, _("crashed mysteriously"));
fprintf (stderr, "%s: child pid %lu (%s) died in a mysterious way!",
blurb(), (unsigned long) kid, name);
- */
- write_string (STDERR_FILENO, blurb());
- write_string (STDERR_FILENO, ": ");
- write_long (STDERR_FILENO, (long) screen_no);
- write_string (STDERR_FILENO, ": child pid ");
- write_long (STDERR_FILENO, (long) kid);
- write_string (STDERR_FILENO, " (");
- write_string (STDERR_FILENO, name);
- write_string (STDERR_FILENO, ") died in a mysterious way!");
if (job)
job->status = job_dead;
}
- /* Clear out the pid so that screenhack_running_p() knows it's dead.
+# ifdef LOG_CPU_TIME
+ if (p->verbose_p && job && job->status == job_dead)
+ {
+ long u = rus.ru_utime.tv_usec / 1000 + rus.ru_utime.tv_sec * 1000;
+ long s = rus.ru_stime.tv_usec / 1000 + rus.ru_stime.tv_sec * 1000;
+ fprintf (stderr, "%s: %d: CPU used: %.1fu, %.1fs\n",
+ blurb(), screen_no, u / 1000.0, s / 1000.0);
+ }
+# endif /* LOG_CPU_TIME */
+
+ /* Clear out the pid so that any_screenhacks_running_p() knows it's dead.
*/
if (!job || job->status == job_dead)
{
- for (i = 0; i < si->nscreens; i++)
- {
- saver_screen_info *ssi = &si->screens[i];
- if (kid == ssi->pid)
- ssi->pid = 0;
- }
-# ifdef HAVE_LIBSYSTEMD
- if (kid == si->systemd_pid)
- si->systemd_pid = 0;
-# endif
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ if (kid == ssi->pid)
+ {
+ ssi->pid = 0;
+ if (*msg)
+ screenhack_obituary (ssi, name, msg);
+ }
+ }
}
}
-#else /* VMS */
-static void await_dying_children (saver_info *si) { return; }
-#endif /* VMS */
-
void
-init_sigchld (void)
+init_sigchld (saver_info *si)
{
-#ifdef SIGCHLD
-
-# ifdef HAVE_SIGACTION /* Thanks to Tom Kelly <tom@ancilla.toronto.on.ca> */
-
- static Bool sigchld_initialized_p = 0;
- if (!sigchld_initialized_p)
- {
- struct sigaction action, old;
-
- action.sa_handler = sigchld_handler;
- sigemptyset(&action.sa_mask);
- action.sa_flags = 0;
-
- if (sigaction(SIGCHLD, &action, &old) < 0)
- {
- char buf [255];
- sprintf (buf, "%s: couldn't catch SIGCHLD", blurb());
- perror (buf);
- }
- sigchld_initialized_p = True;
- }
+ static Bool signals_initialized_p = 0;
+ if (signals_initialized_p) return;
+ signals_initialized_p = True;
-# else /* !HAVE_SIGACTION */
+ catch_signal (SIGTERM, saver_sigterm_handler); /* kill */
+ catch_signal (SIGINT, saver_sigterm_handler); /* shell ^C */
+ catch_signal (SIGQUIT, saver_sigterm_handler); /* shell ^| */
+ catch_signal (SIGCHLD, sigchld_handler);
- if (((long) signal (SIGCHLD, sigchld_handler)) == -1L)
- {
- char buf [255];
- sprintf (buf, "%s: couldn't catch SIGCHLD", blurb());
- perror (buf);
- }
-# endif /* !HAVE_SIGACTION */
-#endif /* SIGCHLD */
+ xt_sigchld_id = XtAppAddSignal (si->app, xt_sigchld_handler, si);
+ xt_sigterm_id = XtAppAddSignal (si->app, xt_sigterm_handler, si);
}
+static void
+hack_subproc_environment (Screen *screen, Window saver_window)
+{
+ /* Store $DISPLAY into the environment, so that the $DISPLAY variable that
+ the spawned processes inherit is correct. First, it must be on the same
+ host and display as the value of -display passed in on our command line
+ (which is not necessarily the same as what our $DISPLAY variable is.)
+ Second, the screen number in the $DISPLAY passed to the subprocess should
+ be the screen on which this particular hack is running -- not the display
+ specification which the driver itself is using, since the driver ignores
+ its screen number and manages all existing screens.
-
+ Likewise, store a window ID in $XSCREENSAVER_WINDOW -- this is necessary
+ in a Xinerama or RANDR world where a single X11 'Screen' spans multiple
+ monitors, and we want to run a hack on each piece of glass, not spanning
+ them. In that case, multiple hacks have the same $DISPLAY, screen and
+ root window.
+ */
+ Display *dpy = DisplayOfScreen (screen);
+ const char *odpy = DisplayString (dpy);
+ char *ndpy = (char *) malloc (strlen(odpy) + 20);
+ char *nssw = (char *) malloc (40);
+ char *s, *c;
-static Bool
-select_visual_of_hack (saver_screen_info *ssi, screenhack *hack)
-{
- saver_info *si = ssi->global;
- saver_preferences *p = &si->prefs;
- Bool selected;
+ strcpy (ndpy, "DISPLAY=");
+ s = ndpy + strlen(ndpy);
+ strcpy (s, odpy);
- if (hack->visual && *hack->visual)
- selected = select_visual(ssi, hack->visual);
- else
- selected = select_visual(ssi, 0);
+ /* We have to find the last colon since it is the boundary between
+ hostname & screen - IPv6 numeric format addresses may have many
+ colons before that point, and DECnet addresses always have two colons */
+ c = strrchr(s,':'); /* skip to last colon */
+ if (c != NULL) s = c+1;
+ while (isdigit(*s)) s++; /* skip over dpy number */
+ while (*s == '.') s++; /* skip over dot */
+ if (s[-1] != '.') *s++ = '.'; /* put on a dot */
+ sprintf(s, "%d", screen_number (screen)); /* put on screen number */
- if (!selected && (p->verbose_p || si->demoing_p))
- fprintf (stderr,
- (si->demoing_p
- ? "%s: warning, no \"%s\" visual for \"%s\".\n"
- : "%s: no \"%s\" visual; skipping \"%s\".\n"),
- blurb(),
- (hack->visual && *hack->visual ? hack->visual : "???"),
- hack->command);
+ sprintf (nssw, "XSCREENSAVER_WINDOW=0x%lX", (unsigned long) saver_window);
- return selected;
+ if (putenv (ndpy))
+ abort ();
+ if (putenv (nssw))
+ abort ();
+
+ /* don't free ndpy/nssw -- some implementations of putenv (BSD 4.4,
+ glibc 2.0) copy the argument, but some (libc4,5, glibc 2.1.2)
+ do not. So we must leak it (and/or the previous setting). Yay.
+ */
}
+#ifdef ABORT_TESTER /* Shoot down processes after a bit, for debugging */
static void
-print_path_error (const char *program)
+abort_debug_timer (XtPointer closure, XtIntervalId *id)
{
- char buf [512];
- char *cmd = strdup (program);
- char *token = strchr (cmd, ' ');
-
- if (token) *token = 0;
- sprintf (buf, "%s: could not execute \"%.100s\"", blurb(), cmd);
- free (cmd);
- perror (buf);
-
- if (errno == ENOENT &&
- (token = getenv("PATH")))
+ saver_screen_info *ssi = (saver_screen_info *) closure;
+ if (ssi->pid)
{
-# ifndef PATH_MAX
-# ifdef MAXPATHLEN
-# define PATH_MAX MAXPATHLEN
-# else
-# define PATH_MAX 2048
-# endif
-# endif
- char path[PATH_MAX];
- fprintf (stderr, "\n");
- *path = 0;
-# if defined(HAVE_GETCWD)
- if (! getcwd (path, sizeof(path)))
- *path = 0;
-# elif defined(HAVE_GETWD)
- getwd (path);
-# endif
- if (*path)
- fprintf (stderr, " Current directory is: %s\n", path);
- fprintf (stderr, " PATH is:\n");
- token = strtok (strdup(token), ":");
- while (token)
- {
- fprintf (stderr, " %s\n", token);
- token = strtok(0, ":");
- }
- fprintf (stderr, "\n");
+ fprintf (stderr, "%s: %d: %ld: born to ill\n", blurb(), ssi->number,
+ (unsigned long) ssi->pid);
+ kill (ssi->pid, SIGILL);
}
}
+#endif /* ABORT_TESTER */
/* Executes the command in another process.
@@ -875,15 +743,10 @@ print_path_error (const char *program)
Otherwise, -1 is returned and an error may have been
printed to stderr.
*/
-pid_t
+static pid_t
fork_and_exec (saver_screen_info *ssi, const char *command)
{
- return fork_and_exec_1 (ssi->global, ssi, command);
-}
-
-pid_t
-fork_and_exec_1 (saver_info *si, saver_screen_info *ssi, const char *command)
-{
+ saver_info *si = ssi->global;
saver_preferences *p = &si->prefs;
pid_t forked;
@@ -899,92 +762,57 @@ fork_and_exec_1 (saver_info *si, saver_screen_info *ssi, const char *command)
case 0:
close (ConnectionNumber (si->dpy)); /* close display fd */
- limit_subproc_memory (p->inferior_memory_limit, p->verbose_p);
if (ssi)
hack_subproc_environment (ssi->screen, ssi->screensaver_window);
- if (p->verbose_p)
- fprintf (stderr, "%s: %d: spawning \"%s\" in pid %lu.\n",
- blurb(), (ssi ? ssi->number : 0), command,
- (unsigned long) getpid ());
-
exec_command (p->shell, command, p->nice_inferior);
-
- /* If that returned, we were unable to exec the subprocess.
- Print an error message, if desired.
- */
- if (! p->ignore_uninstalled_p)
- print_path_error (command);
-
+ /* If that returned, we were unable to exec the subprocess. */
exit (1); /* exits child fork */
break;
default: /* parent */
- (void) make_job (forked, (ssi ? ssi->number : 0), command);
+ make_job (forked, (ssi ? ssi->number : 0), command);
+ if (p->verbose_p)
+ fprintf (stderr, "%s: %d: forked \"%s\" in pid %lu"
+ " on window 0x%lx\n",
+ blurb(), (ssi ? ssi->number : 0), command,
+ (unsigned long) forked,
+ (unsigned long) ssi->screensaver_window);
break;
}
+# ifdef ABORT_TESTER
+ if (forked)
+ XtAppAddTimeOut (si->app, 1000 * (5 + (5 * ssi->number)),
+ abort_debug_timer, (XtPointer) ssi);
+# endif
+
return forked;
}
-/* Execute command in another process and wait for it to
- * finish. Return exit code of process, or -1 on error
- * with fork() or exec().
- */
-int
-exec_and_wait (saver_info *si, const char *command)
+static Bool
+select_visual_of_hack (saver_screen_info *ssi, screenhack *hack)
{
- pid_t forked;
+ saver_info *si = ssi->global;
saver_preferences *p = &si->prefs;
+ Bool selected;
- switch ((int) (forked = fork ()))
- {
- case -1:
- {
- char buf [255];
- sprintf (buf, "%s: couldn't fork", blurb());
- perror (buf);
- return -1;
- }
-
- case 0:
- close (ConnectionNumber (si->dpy)); /* close display fd */
- limit_subproc_memory (p->inferior_memory_limit, p->verbose_p);
-
- if (p->verbose_p)
- fprintf (stderr, "%s: spawning \"%s\" in pid %lu.\n",
- blurb(), command,
- (unsigned long) getpid ());
-
- exec_command (p->shell, command, 0);
-
- /* If that returned, we were unable to exec the subprocess.
- Print an error message, if desired.
- */
- print_path_error (command);
+ if (hack->visual && *hack->visual)
+ selected = select_visual(ssi, hack->visual);
+ else
+ selected = select_visual(ssi, 0);
- exit (-1); /* exits child fork */
- break;
+ if (!selected && (p->verbose_p || si->demoing_p))
+ fprintf (stderr,
+ (si->demoing_p
+ ? "%s: warning, no \"%s\" visual for \"%s\"\n"
+ : "%s: no \"%s\" visual; skipping \"%s\"\n"),
+ blurb(),
+ (hack->visual && *hack->visual ? hack->visual : "???"),
+ hack->command);
- default: /* parent */
- {
- pid_t retpid;
- int wstatus;
- while ((retpid = waitpid (forked, &wstatus, 0)) == -1) {
- if (errno == EINTR)
- continue;
- perror ("Could not waitpid for child.");
- return -1;
- }
- if (WIFEXITED(wstatus))
- return WEXITSTATUS(wstatus);
- if (WIFSIGNALED(wstatus))
- return WTERMSIG(wstatus) + 128;
- return -1;
- }
- }
- return -1;
+ return selected;
}
@@ -995,13 +823,21 @@ spawn_screenhack (saver_screen_info *ssi)
saver_preferences *p = &si->prefs;
XFlush (si->dpy);
- if (!p->dpms_full_throttle_p && !monitor_powered_on_p (si))
+ if (!monitor_powered_on_p (si->dpy))
{
if (si->prefs.verbose_p)
fprintf (stderr,
"%s: %d: X says monitor has powered down; "
- "not launching a hack.\n", blurb(), ssi->number);
- return;
+ "not launching a hack\n", blurb(), ssi->number);
+ ssi->current_hack = -1;
+
+ /* Hooray, this doesn't actually clear the window if it was OpenGL. */
+ XClearWindow (si->dpy, ssi->screensaver_window);
+
+ /* Even though we aren't launching a hack, do launch the cycle timer,
+ in case the monitor powers back up at some point without us having
+ un-blanked. */
+ goto DONE;
}
if (p->screenhacks_count)
@@ -1075,9 +911,7 @@ spawn_screenhack (saver_screen_info *ssi)
if (new_hack < 0) /* don't run a hack */
{
ssi->current_hack = -1;
- if (si->selection_mode < 0)
- si->selection_mode = 0;
- return;
+ goto DONE;
}
ssi->current_hack = new_hack;
@@ -1105,7 +939,7 @@ spawn_screenhack (saver_screen_info *ssi)
*/
if (p->verbose_p)
fprintf(stderr,
- "%s: %d: no programs enabled, or no suitable visuals.\n",
+ "%s: %d: no programs enabled, or no suitable visuals\n",
blurb(), ssi->number);
return;
}
@@ -1113,12 +947,6 @@ spawn_screenhack (saver_screen_info *ssi)
goto AGAIN;
}
- /* Turn off "next" and "prev" modes now, but "demo" mode is only
- turned off by explicit action.
- */
- if (si->selection_mode < 0)
- si->selection_mode = 0;
-
forked = fork_and_exec (ssi, hack->command);
switch ((int) forked)
{
@@ -1126,17 +954,95 @@ spawn_screenhack (saver_screen_info *ssi)
case 0: /* child fork (can't happen) */
sprintf (buf, "%s: couldn't fork", blurb());
perror (buf);
- restore_real_vroot (si);
- saver_exit (si, 1, "couldn't fork");
+ exit (1);
break;
default:
ssi->pid = forked;
break;
}
+
+ XChangeProperty (si->dpy, ssi->screensaver_window, XA_WM_COMMAND,
+ XA_STRING, 8, PropModeReplace,
+ (unsigned char *) hack->command,
+ strlen (hack->command));
+ XChangeProperty (si->dpy, ssi->screensaver_window, XA_NET_WM_PID,
+ XA_CARDINAL, 32, PropModeReplace,
+ (unsigned char *) &ssi->pid, 1);
}
- store_saver_status (si); /* store current hack number */
+ DONE:
+
+ if (ssi->current_hack < 0)
+ XDeleteProperty (si->dpy, ssi->screensaver_window, XA_WM_COMMAND);
+
+ store_saver_status (si); /* store current hack numbers */
+
+ /* Now that the hack has launched, queue a timer to cycle it. */
+ if (!si->demoing_p && p->cycle)
+ {
+ time_t now = time ((time_t *) 0);
+ Time how_long = p->cycle;
+
+ /* If we're in "SELECT n" mode, the cycle timer going off will just
+ restart this same hack again. There's not much point in doing this
+ every 5 or 10 minutes, but on the other hand, leaving one hack
+ running for days is probably not a great idea, since they tend to
+ leak and/or crash. So, restart the thing once an hour.
+ */
+ if (si->selection_mode > 0 && ssi->pid)
+ how_long = 1000 * 60 * 60;
+
+ /* If there are multiple screens, stagger the restart time of subsequent
+ screens: they will all change every N minutes, but not at the same
+ time. But don't let that offset be more than about 5 minutes.
+
+ I originally did this by just adding an offset to the very first
+ cycle only, but after a few days, the cycles would synchronize again!
+ Are Xt timers implemented with Huygens pendulums?? So compare this
+ screen's target time against the previous screen's, and offset it as
+ needed.
+ */
+ if (ssi->number > 0 &&
+ p->mode != RANDOM_HACKS_SAME)
+ {
+ saver_screen_info *prev = &si->screens[ssi->number-1];
+ time_t cycle_at = now + how_long / 1000;
+ time_t prev_at = prev->cycle_at;
+
+ Time max = 1000 * 60 * 60 * 10;
+ Time off = (how_long > max ? max : how_long) / si->nscreens;
+
+ if (cycle_at < prev_at + off / 1000)
+ {
+ time_t old = cycle_at;
+ cycle_at = prev_at + off / 1000;
+ how_long = 1000 * (cycle_at - now);
+
+ if (p->verbose_p && cycle_at - old > 2)
+ fprintf (stderr, "%s: %d: offsetting cycle time by %ld sec\n",
+ blurb(), ssi->number,
+ cycle_at - old);
+ }
+ }
+
+ if (p->debug_p)
+ fprintf (stderr, "%s: %d: starting cycle_timer (%ld)\n",
+ blurb(), ssi->number, how_long);
+
+ if (ssi->cycle_id)
+ XtRemoveTimeOut (ssi->cycle_id);
+ ssi->cycle_id =
+ XtAppAddTimeOut (si->app, how_long, cycle_timer, (XtPointer) ssi);
+ ssi->cycle_at = now + how_long / 1000;
+
+ if (p->verbose_p)
+ {
+ time_t t = time((time_t *) 0) + how_long/1000;
+ fprintf (stderr, "%s: %d: next cycle in %lu sec at %s\n",
+ blurb(), ssi->number, how_long/1000, timestring(t));
+ }
+ }
}
@@ -1147,42 +1053,14 @@ kill_screenhack (saver_screen_info *ssi)
if (ssi->pid)
kill_job (si, ssi->pid, SIGTERM);
ssi->pid = 0;
-}
-
-void
-suspend_screenhack (saver_screen_info *ssi, Bool suspend_p)
-{
-#ifdef SIGSTOP /* older VMS doesn't have it... */
- saver_info *si = ssi->global;
- if (ssi->pid)
- kill_job (si, ssi->pid, (suspend_p ? SIGSTOP : SIGCONT));
-#endif /* SIGSTOP */
+ /* Hooray, this doesn't actually clear the window if it was OpenGL. */
+ XClearWindow (si->dpy, ssi->screensaver_window);
}
-/* Called when we're exiting abnormally, to kill off the subproc. */
-void
-emergency_kill_subproc (saver_info *si)
-{
- int i;
-#ifdef SIGCHLD
- signal (SIGCHLD, SIG_IGN);
-#endif /* SIGCHLD */
-
- for (i = 0; i < si->nscreens; i++)
- {
- saver_screen_info *ssi = &si->screens[i];
- if (ssi->pid)
- {
- kill_job (si, ssi->pid, SIGTERM);
- ssi->pid = 0;
- }
- }
-}
-
Bool
-screenhack_running_p (saver_info *si)
+any_screenhacks_running_p (saver_info *si)
{
Bool any_running_p = False;
int i;
@@ -1190,104 +1068,21 @@ screenhack_running_p (saver_info *si)
{
saver_screen_info *ssi = &si->screens[i];
if (ssi->pid) any_running_p = True;
+ /* Consider it running if an error dialog is posted, so that we
+ don't prematurely clear the window. */
+ if (ssi->error_dialog) any_running_p = True;
}
return any_running_p;
}
-
-/* Environment variables. */
-
-/* Modifies $PATH in the current environment, so that if DEFAULT_PATH_PREFIX
- is defined, the xscreensaver daemon will search that directory for hacks.
+/* Fork "xscreensaver-gl-visual" and wait for it to print the IDs of
+ the GL visual that should be used on this screen.
*/
-void
-hack_environment (saver_info *si)
-{
-#if defined(HAVE_PUTENV) && defined(DEFAULT_PATH_PREFIX)
- static const char *def_path = DEFAULT_PATH_PREFIX;
- if (def_path && *def_path)
- {
- const char *opath = getenv("PATH");
- char *npath;
- if (! opath) opath = "/bin:/usr/bin"; /* WTF */
- npath = (char *) malloc(strlen(def_path) + strlen(opath) + 20);
- strcpy (npath, "PATH=");
- strcat (npath, def_path);
- strcat (npath, ":");
- strcat (npath, opath);
-
- if (putenv (npath))
- abort ();
-
- /* don't free (npath) -- some implementations of putenv (BSD 4.4,
- glibc 2.0) copy the argument, but some (libc4,5, glibc 2.1.2)
- do not. So we must leak it (and/or the previous setting). Yay.
- */
- }
-#endif /* HAVE_PUTENV && DEFAULT_PATH_PREFIX */
-}
-
-
-void
-hack_subproc_environment (Screen *screen, Window saver_window)
-{
- /* Store $DISPLAY into the environment, so that the $DISPLAY variable that
- the spawned processes inherit is correct. First, it must be on the same
- host and display as the value of -display passed in on our command line
- (which is not necessarily the same as what our $DISPLAY variable is.)
- Second, the screen number in the $DISPLAY passed to the subprocess should
- be the screen on which this particular hack is running -- not the display
- specification which the driver itself is using, since the driver ignores
- its screen number and manages all existing screens.
-
- Likewise, store a window ID in $XSCREENSAVER_WINDOW -- this will allow
- us to (eventually) run multiple hacks in Xinerama mode, where each hack
- has the same $DISPLAY but a different piece of glass.
- */
- Display *dpy = DisplayOfScreen (screen);
- const char *odpy = DisplayString (dpy);
- char *ndpy = (char *) malloc (strlen(odpy) + 20);
- char *nssw = (char *) malloc (40);
- char *s, *c;
-
- strcpy (ndpy, "DISPLAY=");
- s = ndpy + strlen(ndpy);
- strcpy (s, odpy);
-
- /* We have to find the last colon since it is the boundary between
- hostname & screen - IPv6 numeric format addresses may have many
- colons before that point, and DECnet addresses always have two colons */
- c = strrchr(s,':'); /* skip to last colon */
- if (c != NULL) s = c+1;
- while (isdigit(*s)) s++; /* skip over dpy number */
- while (*s == '.') s++; /* skip over dot */
- if (s[-1] != '.') *s++ = '.'; /* put on a dot */
- sprintf(s, "%d", screen_number (screen)); /* put on screen number */
-
- sprintf (nssw, "XSCREENSAVER_WINDOW=0x%lX", (unsigned long) saver_window);
-
- /* Allegedly, BSD 4.3 didn't have putenv(), but nobody runs such systems
- any more, right? It's not Posix, but everyone seems to have it. */
-#ifdef HAVE_PUTENV
- if (putenv (ndpy))
- abort ();
- if (putenv (nssw))
- abort ();
-
- /* don't free ndpy/nssw -- some implementations of putenv (BSD 4.4,
- glibc 2.0) copy the argument, but some (libc4,5, glibc 2.1.2)
- do not. So we must leak it (and/or the previous setting). Yay.
- */
-#endif /* HAVE_PUTENV */
-}
-
-
-/* GL crap */
-
Visual *
get_best_gl_visual (saver_info *si, Screen *screen)
{
+ saver_preferences *p = &si->prefs;
pid_t forked;
int fds [2];
int in, out;
@@ -1298,7 +1093,7 @@ get_best_gl_visual (saver_info *si, Screen *screen)
char *av[10];
int ac = 0;
- av[ac++] = "xscreensaver-gl-helper";
+ av[ac++] = "xscreensaver-gl-visual";
av[ac] = 0;
if (pipe (fds))
@@ -1322,18 +1117,13 @@ get_best_gl_visual (saver_info *si, Screen *screen)
errout = errfds [1];
}
- block_sigchld(); /* This blocks it in the parent and child, to avoid
- racing. It is never unblocked in the child before
- the child exits, but that doesn't matter.
- */
-
switch ((int) (forked = fork ()))
{
case -1:
{
sprintf (buf, "%s: couldn't fork", blurb());
perror (buf);
- saver_exit (si, 1, 0);
+ exit (1);
}
case 0:
{
@@ -1375,11 +1165,17 @@ get_best_gl_visual (saver_info *si, Screen *screen)
int result = 0;
int wait_status = 0;
pid_t pid = -1;
-
- FILE *f = fdopen (in, "r");
+ FILE *f;
unsigned long v = 0;
char c;
+ make_job (forked, 0, av[0]); /* Bookkeeping for SIGCHLD */
+
+ if (p->verbose_p)
+ fprintf (stderr, "%s: %d: forked \"%s\" in pid %lu\n",
+ blurb(), 0, av[0], (unsigned long) forked);
+
+ f = fdopen (in, "r");
close (out); /* don't need this one */
*buf = 0;
@@ -1396,16 +1192,8 @@ get_best_gl_visual (saver_info *si, Screen *screen)
/* Wait for the child to die - wait for this pid only, not others. */
pid = waitpid (forked, &wait_status, 0);
if (si->prefs.debug_p)
- {
- write_string (STDERR_FILENO, blurb());
- write_string (STDERR_FILENO, ": waitpid(");
- write_long (STDERR_FILENO, (long) forked);
- write_string (STDERR_FILENO, ") ==> ");
- write_long (STDERR_FILENO, (long) pid);
- write_string (STDERR_FILENO, "\n");
- }
-
- unblock_sigchld(); /* child is dead and waited, unblock now. */
+ fprintf (stderr, "%s: waitpid(%ld) => %ld\n", blurb(),
+ (long) forked, (long) pid);
if (1 == sscanf (buf, "0x%lx %c", &v, &c))
result = (int) v;
@@ -1430,7 +1218,7 @@ get_best_gl_visual (saver_info *si, Screen *screen)
{
Visual *v = id_to_visual (screen, result);
if (si->prefs.verbose_p)
- fprintf (stderr, "%s: %d: %s: GL visual is 0x%X%s.\n",
+ fprintf (stderr, "%s: %d: %s: GL visual is 0x%X%s\n",
blurb(), screen_number (screen),
av[0], result,
(v == DefaultVisualOfScreen (screen)
@@ -1442,54 +1230,3 @@ get_best_gl_visual (saver_info *si, Screen *screen)
abort();
}
-
-
-
-/* Restarting the xscreensaver process from scratch. */
-
-static char **saved_argv;
-
-void
-save_argv (int argc, char **argv)
-{
- saved_argv = (char **) calloc (argc+2, sizeof (char *));
- saved_argv [argc] = 0;
- while (argc--)
- {
- int i = strlen (argv [argc]) + 1;
- saved_argv [argc] = (char *) malloc (i);
- memcpy (saved_argv [argc], argv [argc], i);
- }
-}
-
-
-/* Re-execs the process with the arguments in saved_argv. Does not return.
- */
-void
-restart_process (saver_info *si)
-{
- fflush (stdout);
- fflush (stderr);
- shutdown_stderr (si);
- if (si->prefs.verbose_p)
- {
- int i;
- fprintf (stderr, "%s: re-executing", blurb());
- for (i = 0; saved_argv[i]; i++)
- fprintf (stderr, " %s", saved_argv[i]);
- fprintf (stderr, "\n");
- }
- describe_uids (si, stderr);
- fprintf (stderr, "\n");
-
- fflush (stdout);
- fflush (stderr);
- execvp (saved_argv [0], saved_argv); /* shouldn't return */
- {
- char buf [512];
- sprintf (buf, "%s: could not restart process", blurb());
- perror(buf);
- fflush(stderr);
- abort();
- }
-}
diff --git a/driver/test-apm.c b/driver/test-apm.c
deleted file mode 100644
index 6b87c7e..0000000
--- a/driver/test-apm.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/* test-apm.c --- playing with the APM library.
- * xscreensaver, Copyright (c) 1999 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdlib.h>
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#include <stdio.h>
-#include <time.h>
-#include <sys/time.h>
-
-#include <X11/Xlib.h>
-#include <X11/Intrinsic.h>
-
-#include <apm.h>
-
-#define countof(x) (sizeof((x))/sizeof(*(x)))
-
-
-char *progname = 0;
-char *progclass = "XScreenSaver";
-
-static const char *
-blurb (void)
-{
- static char buf[255];
- time_t now = time ((time_t *) 0);
- char *ct = (char *) ctime (&now);
- int n = strlen(progname);
- if (n > 100) n = 99;
- strncpy(buf, progname, n);
- buf[n++] = ':';
- buf[n++] = ' ';
- strncpy(buf+n, ct+11, 8);
- strcpy(buf+n+9, ": ");
- return buf;
-}
-
-static void
-apm_cb (XtPointer closure, int *fd, XtInputId *id)
-{
- apm_event_t events[100];
- int n, i;
- while ((n = apm_get_events (*fd, 0, events, countof(events)))
- > 0)
- for (i = 0; i < n; i++)
- {
- fprintf (stderr, "%s: APM event 0x%x: %s.\n", blurb(),
- events[i], apm_event_name (events[i]));
-#if 0
- switch (events[i])
- {
- case APM_SYS_STANDBY:
- case APM_USER_STANDBY:
- case APM_SYS_SUSPEND:
- case APM_USER_SUSPEND:
- case APM_CRITICAL_SUSPEND:
- break;
- }
-#endif
- }
-}
-
-int
-main (int argc, char **argv)
-{
- XtAppContext app;
- Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0,
- &argc, argv, 0, 0, 0);
- Display *dpy = XtDisplay (toplevel_shell);
- int fd;
- XtInputId id;
- XtGetApplicationNameAndClass (dpy, &progname, &progclass);
-
- fd = apm_open ();
- if (fd <= 0)
- {
- fprintf (stderr, "%s: couldn't initialize APM.\n", blurb());
- exit (1);
- }
-
- id = XtAppAddInput(app, fd,
- (XtPointer) (XtInputReadMask | XtInputWriteMask),
- apm_cb, 0);
- XtAppMainLoop (app);
- exit (0);
-}
diff --git a/driver/test-fade.c b/driver/test-fade.c
index 9db773d..31852ef 100644
--- a/driver/test-fade.c
+++ b/driver/test-fade.c
@@ -1,5 +1,5 @@
/* test-fade.c --- playing with colormap and/or gamma fading.
- * xscreensaver, Copyright (c) 2001, 2004 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 2001-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -21,30 +21,35 @@
#include <stdio.h>
+#include <X11/Xatom.h>
#include <X11/Intrinsic.h>
+
#include "xscreensaver.h"
+#include "resources.h"
+#include "screens.h"
#include "fade.h"
+#include "atoms.h"
-#ifdef HAVE_SGI_VC_EXTENSION
-# include <X11/extensions/XSGIvc.h>
-#endif
#ifdef HAVE_XF86VMODE_GAMMA
# include <X11/extensions/xf86vmode.h>
#endif
+#ifdef HAVE_RANDR
+# include <X11/extensions/Xrandr.h>
+#endif
XrmDatabase db = 0;
-char *progname = 0;
char *progclass = "XScreenSaver";
+Bool debug_p = True;
-#define SGI_VC_NAME "SGI-VIDEO-CONTROL"
#define XF86_VIDMODE_NAME "XFree86-VidModeExtension"
+#define RANDR_NAME "RANDR"
int
main (int argc, char **argv)
{
- int seconds = 3;
- int ticks = 20;
- int delay = 1;
+ double seconds = 3;
+ double ratio = 1/3.0;
+ int delay = 2;
int op, event, error, major, minor;
@@ -52,70 +57,151 @@ main (int argc, char **argv)
Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0,
&argc, argv, 0, 0, 0);
Display *dpy = XtDisplay (toplevel_shell);
- Colormap *current_maps;
- int i;
-
- XtGetApplicationNameAndClass (dpy, &progname, &progclass);
+ Screen *screen = ScreenOfDisplay (dpy, 0);
+ int nwindows, i;
+ Window windows[100];
+
+ int x, y;
+ unsigned int bw, d;
+ Window root = RootWindow (dpy, 0);
+ Visual *visual = DefaultVisual (dpy, 0);
+ Pixmap logo, logo_clipmask;
+ int logo_npixels;
+ unsigned long *logo_pixels;
+ unsigned int logo_width, logo_height;
+ XSetWindowAttributes attrs;
+ unsigned long attrmask = 0;
+ void *state = 0;
+
+ verbose_p += 2;
+
+ progname = argv[0];
+ progclass = "XScreenSaver";
db = XtDatabase (dpy);
- current_maps = (Colormap *) calloc(sizeof(Colormap), ScreenCount(dpy));
- for (i = 0; i < ScreenCount(dpy); i++)
- current_maps[i] = DefaultColormap (dpy, i);
+ init_xscreensaver_atoms (dpy);
+
+ {
+ const char * version_number = "test-fade";
+ Window daemon_window =
+ XCreateWindow (dpy, RootWindow (dpy, 0),
+ 0, 0, 1, 1, 0,
+ DefaultDepth (dpy, 0), InputOutput,
+ DefaultVisual (dpy, 0), attrmask, &attrs);
+ XChangeProperty (dpy, daemon_window, XA_SCREENSAVER_VERSION, XA_STRING,
+ 8, PropModeReplace, (unsigned char *) version_number,
+ strlen (version_number));
+ }
- if (!XQueryExtension (dpy, SGI_VC_NAME, &op, &event, &error))
- fprintf(stderr, "%s: no " SGI_VC_NAME " extension\n", progname);
- else
- {
-# ifdef HAVE_SGI_VC_EXTENSION
- if (!XSGIvcQueryVersion (dpy, &major, &minor))
- fprintf(stderr, "%s: unable to get " SGI_VC_NAME " version\n",
- progname);
- else
- fprintf(stderr, "%s: " SGI_VC_NAME " version %d.%d\n",
- progname, major, minor);
-# else /* !HAVE_SGI_VC_EXTENSION */
- fprintf(stderr, "%s: no support for display's " SGI_VC_NAME
- " extension\n", progname);
-# endif /* !HAVE_SGI_VC_EXTENSION */
- }
if (!XQueryExtension (dpy, XF86_VIDMODE_NAME, &op, &event, &error))
- fprintf(stderr, "%s: no " XF86_VIDMODE_NAME " extension\n", progname);
+ fprintf(stderr, "%s: no " XF86_VIDMODE_NAME " extension\n", blurb());
else
{
# ifdef HAVE_XF86VMODE_GAMMA
if (!XF86VidModeQueryVersion (dpy, &major, &minor))
fprintf(stderr, "%s: unable to get " XF86_VIDMODE_NAME " version\n",
- progname);
+ blurb());
else
fprintf(stderr, "%s: " XF86_VIDMODE_NAME " version %d.%d\n",
- progname, major, minor);
+ blurb(), major, minor);
# else /* !HAVE_XF86VMODE_GAMMA */
fprintf(stderr, "%s: no support for display's " XF86_VIDMODE_NAME
- " extension\n", progname);
+ " extension\n", blurb());
# endif /* !HAVE_XF86VMODE_GAMMA */
}
+ if (!XQueryExtension (dpy, RANDR_NAME, &op, &event, &error))
+ fprintf(stderr, "%s: no " RANDR_NAME " extension\n", blurb());
+ else
+ {
+# ifdef HAVE_RANDR
+ if (!XRRQueryVersion (dpy, &major, &minor))
+ fprintf(stderr, "%s: unable to get " RANDR_NAME " version\n",
+ blurb());
+ else
+ fprintf(stderr, "%s: " RANDR_NAME " version %d.%d\n",
+ blurb(), major, minor);
+# else /* !HAVE_RANDR */
+ fprintf(stderr, "%s: no support for display's " RANDR_NAME
+ " extension\n", blurb());
+# endif /* !HAVE_RANDR */
+ }
+
+ logo = xscreensaver_logo (screen, visual, root, DefaultColormap (dpy, 0),
+ WhitePixel (dpy, 0),
+ &logo_pixels, &logo_npixels,
+ &logo_clipmask, True);
+ XGetGeometry (dpy, logo, &root, &x, &y, &logo_width, &logo_height, &bw, &d);
+
+ nwindows = 0;
+ {
+ int x, y;
+ for (y = 0; y < 2; y++)
+ for (x = 0; x < 2; x++)
+ {
+ int win_width = 250;
+ int win_height = 200;
+
+ attrmask = CWOverrideRedirect;
+ attrs.override_redirect = True;
+ windows[nwindows] =
+ XCreateWindow (dpy, root,
+ 200 + x * win_width * 1.5,
+ 200 + y * win_height * 1.5,
+ win_width, win_height, 0, DefaultDepth (dpy, 0),
+ InputOutput, visual,
+ attrmask, &attrs);
+ XSetWindowBackground (dpy, windows[nwindows], BlackPixel (dpy, 0));
+ XClearWindow (dpy, windows[nwindows]);
+ nwindows++;
+ }
+ }
+
fprintf (stderr, "%s: fading %d screen%s\n",
- progname, ScreenCount(dpy), ScreenCount(dpy) == 1 ? "" : "s");
+ blurb(), ScreenCount(dpy), ScreenCount(dpy) == 1 ? "" : "s");
while (1)
{
XSync (dpy, False);
- fprintf(stderr, "%s: out...", progname);
+ fprintf(stderr, "%s: fading out\n\n", blurb());
fflush(stderr);
- fade_screens (dpy, current_maps, 0, 0, seconds, ticks, True, False);
- fprintf(stderr, "done.\n");
+ fade_screens (app, dpy, windows, nwindows, seconds,
+ True, /* out_p */
+ True, /* from_desktop_p */
+ &state);
+ for (i = 0; i < nwindows; i++)
+ XMapRaised (dpy, windows[i]);
+ XSync (dpy, False);
+ fprintf(stderr, "%s: out done\n\n", blurb());
fflush(stderr);
+ for (i = 0; i < nwindows; i++)
+ {
+ XSetWindowBackgroundPixmap (dpy, windows[i], logo);
+ XClearWindow (dpy, windows[i]);
+ XSetWindowBackground (dpy, windows[i], BlackPixel (dpy, 0));
+ }
+ XSync (dpy, False);
+
if (delay) sleep (delay);
- fprintf(stderr,"%s: in...", progname);
+ fprintf(stderr, "%s: fading in\n\n", blurb());
fflush(stderr);
- fade_screens (dpy, current_maps, 0, 0, seconds, ticks, False, False);
- fprintf(stderr, "done.\n");
+ fade_screens (app, dpy, windows, nwindows,
+ seconds * ratio,
+ True, /* out_p */
+ False, /* from_desktop_p */
+ &state);
+ fade_screens (app, dpy, windows, nwindows,
+ seconds * ratio,
+ False, /* out_p */
+ False, /* from_desktop_p */
+ &state);
+ XSync (dpy, False);
+ fprintf(stderr, "%s: in done\n\n", blurb());
fflush(stderr);
if (delay) sleep (delay);
diff --git a/driver/test-grab.c b/driver/test-grab.c
index 03018eb..65313a1 100644
--- a/driver/test-grab.c
+++ b/driver/test-grab.c
@@ -1,5 +1,5 @@
/* test-uid.c --- playing with grabs.
- * xscreensaver, Copyright (c) 1999, 2004 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 1999-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -24,8 +24,9 @@
#include <X11/Xlib.h>
#include <X11/Intrinsic.h>
+#include <X11/cursorfont.h>
-char *progname = 0;
+#include "blurb.h"
char *progclass = "XScreenSaver";
#define ALL_POINTER_EVENTS \
@@ -38,38 +39,89 @@ int
main (int argc, char **argv)
{
XtAppContext app;
- int kstatus, mstatus;
- Cursor cursor = 0;
- int delay = 60 * 15;
+ int kstatus = AlreadyGrabbed, mstatus = AlreadyGrabbed;
+ Cursor cursor1, cursor2;
+ int delay1 = 15;
+ int delay2 = 60 * 15 - delay1;
Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0,
&argc, argv, 0, 0, 0);
Display *dpy = XtDisplay (toplevel_shell);
Window w = RootWindow (dpy, DefaultScreen(dpy));
- XtGetApplicationNameAndClass (dpy, &progname, &progclass);
-
- kstatus = XGrabKeyboard (dpy, w, True,
- GrabModeSync, GrabModeAsync,
- CurrentTime);
- fprintf (stderr, "%s: grabbing keyboard on 0x%lx... %s.\n",
- progname, (unsigned long) w,
- (kstatus == GrabSuccess ? "GrabSuccess" :
- kstatus == AlreadyGrabbed ? "AlreadyGrabbed" :
- kstatus == GrabInvalidTime ? "GrabInvalidTime" :
- kstatus == GrabNotViewable ? "GrabNotViewable" :
- kstatus == GrabFrozen ? "GrabFrozen" :
- "???"));
-
- mstatus = XGrabPointer (dpy, w, True, ALL_POINTER_EVENTS,
- GrabModeAsync, GrabModeAsync, None,
- cursor, CurrentTime);
- fprintf (stderr, "%s: grabbing mouse on 0x%lx... %s.\n",
- progname, (unsigned long) w,
- (mstatus == GrabSuccess ? "GrabSuccess" :
- mstatus == AlreadyGrabbed ? "AlreadyGrabbed" :
- mstatus == GrabInvalidTime ? "GrabInvalidTime" :
- mstatus == GrabNotViewable ? "GrabNotViewable" :
- mstatus == GrabFrozen ? "GrabFrozen" :
- "???"));
+ int i;
+
+ Bool grab_kbd_p = True;
+ Bool grab_mouse_p = True;
+ Bool mouse_sync_p = True;
+ Bool kbd_sync_p = True;
+
+ progname = argv[0];
+
+ cursor1 = XCreateFontCursor (dpy, XC_hand1);
+ cursor2 = XCreateFontCursor (dpy, XC_gumby);
+
+ for (i = 1; i < argc; i++)
+ {
+ const char *oa = argv[i];
+ if (argv[i][0] == '-' && argv[i][1] == '-')
+ argv[i]++;
+ if (!strcmp (argv[i], "-kbd") || !strcmp (argv[i], "-keyboard"))
+ grab_mouse_p = False;
+ else if (!strcmp (argv[i], "-mouse") || !strcmp (argv[i], "-pointer"))
+ grab_kbd_p = False;
+ else if (!strcmp (argv[i], "-kbd-sync") ||
+ !strcmp (argv[i], "-keyboard-sync"))
+ kbd_sync_p = True;
+ else if (!strcmp (argv[i], "-kbd-async") ||
+ !strcmp (argv[i], "-keyboard-async"))
+ kbd_sync_p = False;
+ else if (!strcmp (argv[i], "-mouse-sync") ||
+ !strcmp (argv[i], "-pointer-sync"))
+ mouse_sync_p = True;
+ else if (!strcmp (argv[i], "-mouse-async") ||
+ !strcmp (argv[i], "-pointer-async"))
+ mouse_sync_p = False;
+ else
+ {
+ fprintf (stderr, "%s: unknown option: %s\n", blurb(), oa);
+ exit (1);
+ }
+ }
+
+ if (grab_kbd_p)
+ {
+ kstatus = XGrabKeyboard (dpy, w, True,
+ (mouse_sync_p ? GrabModeSync : GrabModeAsync),
+ (kbd_sync_p ? GrabModeSync : GrabModeAsync),
+ CurrentTime);
+ fprintf (stderr, "%s: grabbing keyboard on 0x%lx (%s, %s)... %s\n",
+ progname, (unsigned long) w,
+ (mouse_sync_p ? "sync" : "async"),
+ (kbd_sync_p ? "sync" : "async"),
+ (kstatus == GrabSuccess ? "GrabSuccess" :
+ kstatus == AlreadyGrabbed ? "AlreadyGrabbed" :
+ kstatus == GrabInvalidTime ? "GrabInvalidTime" :
+ kstatus == GrabNotViewable ? "GrabNotViewable" :
+ kstatus == GrabFrozen ? "GrabFrozen" :
+ "???"));
+ }
+
+ if (grab_mouse_p)
+ {
+ mstatus = XGrabPointer (dpy, w, True, ALL_POINTER_EVENTS,
+ (mouse_sync_p ? GrabModeSync : GrabModeAsync),
+ (kbd_sync_p ? GrabModeSync : GrabModeAsync),
+ None, cursor1, CurrentTime);
+ fprintf (stderr, "%s: grabbing mouse on 0x%lx (%s, %s)... %s\n",
+ progname, (unsigned long) w,
+ (mouse_sync_p ? "sync" : "async"),
+ (kbd_sync_p ? "sync" : "async"),
+ (mstatus == GrabSuccess ? "GrabSuccess" :
+ mstatus == AlreadyGrabbed ? "AlreadyGrabbed" :
+ mstatus == GrabInvalidTime ? "GrabInvalidTime" :
+ mstatus == GrabNotViewable ? "GrabNotViewable" :
+ mstatus == GrabFrozen ? "GrabFrozen" :
+ "???"));
+ }
XSync(dpy, False);
@@ -77,12 +129,34 @@ main (int argc, char **argv)
{
fprintf (stderr, "%s: sleeping for %d:%02d:%02d...\n",
progname,
- delay / (60 * 60),
- (delay % (60 * 60)) / 60,
- delay % 60);
- fflush(stderr);
- sleep (delay);
- XSync(dpy, False);
+ delay1 / (60 * 60),
+ (delay1 % (60 * 60)) / 60,
+ delay1 % 60);
+ sleep (delay1);
+ fprintf (stderr, "%s: changing mouse cursor...\n", progname);
+
+ mstatus = XGrabPointer (dpy, w, True, ALL_POINTER_EVENTS,
+ (mouse_sync_p ? GrabModeSync : GrabModeAsync),
+ (kbd_sync_p ? GrabModeSync : GrabModeAsync),
+ None, cursor2, CurrentTime);
+ XSync (dpy, False);
+ if (mstatus != GrabSuccess)
+ fprintf (stderr, "%s: failed: %s\n", progname,
+ (mstatus == GrabSuccess ? "GrabSuccess" :
+ mstatus == AlreadyGrabbed ? "AlreadyGrabbed" :
+ mstatus == GrabInvalidTime ? "GrabInvalidTime" :
+ mstatus == GrabNotViewable ? "GrabNotViewable" :
+ mstatus == GrabFrozen ? "GrabFrozen" :
+ "???"));
+
+ fprintf (stderr, "%s: sleeping for %d:%02d:%02d...\n",
+ progname,
+ delay2 / (60 * 60),
+ (delay2 % (60 * 60)) / 60,
+ delay2 % 60);
+ fflush (stderr);
+ sleep (delay2);
+ XSync (dpy, False);
}
exit (0);
diff --git a/driver/test-mlstring.c b/driver/test-mlstring.c
deleted file mode 100644
index e269a00..0000000
--- a/driver/test-mlstring.c
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
- * (c) 2007, Quest Software, Inc. All rights reserved.
- *
- * This file is part of XScreenSaver,
- * Copyright (c) 1993-2004 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "mlstring.c" /* hokey, but whatever */
-
-#define WRAP_WIDTH_PX 100
-
-#undef Bool
-#undef True
-#undef False
-typedef int Bool;
-#define True 1
-#define False 0
-
-#define SKIPPED -1
-#define SUCCESS 0
-#define FAILURE 1
-
-#define FAIL(msg, ...) \
- do { \
- ++failcount; \
- fprintf(stderr, "[FAIL] "); \
- fprintf(stderr, msg, __VA_ARGS__); \
- putc('\n', stderr); \
- return FAILURE; \
- } while (0)
-
-#define SUCCEED(testname) \
- do { \
- fprintf(stderr, "[SUCCESS] %s\n", (testname)); \
- } while (0)
-
-#define SKIP(testname) \
- do { \
- fprintf(stderr, "[SKIPPED] %s\n", (testname)); \
- } while (0)
-
-extern mlstring* mlstring_allocate(const char *msg);
-extern void mlstring_wrap(mlstring *mstr, XFontStruct *font, Dimension width);
-
-static int failcount = 0;
-
-static char *mlstring_to_cstr(const mlstring *mlstr) {
- char *cstr;
- size_t cstrlen = 0, alloclen = 1024;
- const struct mlstr_line *line;
-
- cstr = malloc(alloclen);
- if (!cstr)
- return NULL;
- cstr[0] = '\0';
-
- for (line = mlstr->lines; line; line = line->next_line) {
- /* Extend the buffer if necessary. */
- if (cstrlen + strlen(line->line) + 1 > alloclen) {
- cstr = realloc(cstr, alloclen *= 2);
- if (!cstr)
- return NULL;
- }
-
- /* If this is not the first line */
- if (line != mlstr->lines) {
- /* Append a newline character */
- cstr[cstrlen] = '\n';
- ++cstrlen;
- cstr[cstrlen] = '\0';
- }
-
- strcat(cstr, line->line);
- cstrlen += strlen(line->line);
- }
- return cstr;
-}
-
-/* Pass -1 for expect_min or expect_exact to not check that value.
- * expect_empty_p means an empty line is expected at some point in the string.
- * Also ensures that the string was not too wide after wrapping. */
-static int mlstring_expect_lines(const mlstring *mlstr, int expect_min, int expect_exact, Bool expect_empty_p)
-{
- int count;
- Bool got_empty_line = False;
- const struct mlstr_line *line = mlstr->lines;
-
- for (count = 0; line; line = line->next_line) {
- if (line->line[0] == '\0') {
- if (!expect_empty_p)
- FAIL("Not expecting empty lines, but got one on line %d of [%s]", count + 1, mlstring_to_cstr(mlstr));
- got_empty_line = True;
- }
- ++count;
- }
-
- if (expect_empty_p && !got_empty_line)
- FAIL("Expecting an empty line, but none found in [%s]", mlstring_to_cstr(mlstr));
-
- if (expect_exact != -1 && expect_exact != count)
- FAIL("Expected %d lines, got %d", expect_exact, count);
-
- if (expect_min != -1 && count < expect_min)
- FAIL("Expected at least %d lines, got %d", expect_min, count);
-
- return SUCCESS;
-}
-
-static int mlstring_expect(const char *msg, int expect_lines, const mlstring *mlstr, Bool expect_empty_p)
-{
- char *str, *str_top;
- const struct mlstr_line *cur;
- int linecount = 0;
-
- /* Duplicate msg so we can chop it up */
- str_top = strdup(msg);
- if (!str_top)
- return SKIPPED;
-
- /* Replace all newlines with NUL */
- str = str_top;
- while ((str = strchr(str, '\n')))
- *str++ = '\0';
-
- /* str is now used to point to the expected string */
- str = str_top;
-
- for (cur = mlstr->lines; cur; cur = cur->next_line)
- {
- ++linecount;
- if (strcmp(cur->line, str))
- FAIL("lines didn't match; expected [%s], got [%s]", str, cur->line);
-
- str += strlen(str) + 1; /* Point to the next expected string */
- }
-
- free(str_top);
-
- return mlstring_expect_lines(mlstr, -1, expect_lines, expect_empty_p);
-}
-
-/* Ensures that the width has been set properly after wrapping */
-static int check_width(const char *msg, const mlstring *mlstr) {
- if (mlstr->overall_width == 0)
- FAIL("Overall width was zero for string [%s]", msg);
-
- if (mlstr->overall_width > WRAP_WIDTH_PX)
- FAIL("Overall width was %hu but the maximum wrap width was %d", mlstr->overall_width, WRAP_WIDTH_PX);
-
- return SUCCESS;
-}
-
-/* FAIL() actually returns the wrong return codes in main, but it
- * prints a message which is what we want. */
-
-#define TRY_NEW(str, numl, expect_empty) \
- do { \
- mlstr = mlstring_allocate((str)); \
- if (!mlstr) \
- FAIL("%s", #str); \
- if (SUCCESS == mlstring_expect((str), (numl), mlstr, (expect_empty))) \
- SUCCEED(#str); \
- free(mlstr); \
- } while (0)
-
-/* Expects an XFontStruct* font, and tries to wrap to 100px */
-#define TRY_WRAP(str, minl, expect_empty) \
- do { \
- mltest = mlstring_allocate((str)); \
- if (!mltest) \
- SKIP(#str); \
- else { \
- mlstring_wrap(mltest, font, WRAP_WIDTH_PX); \
- check_width((str), mltest); \
- if (SUCCESS == mlstring_expect_lines(mltest, (minl), -1, (expect_empty))) \
- SUCCEED(#str); \
- free(mltest); \
- mltest = NULL; \
- } \
- } while (0)
-
-
-/* Ideally this function would use stub functions rather than real Xlib.
- * Then it would be possible to test for exact line counts, which would be
- * more reliable.
- * It also doesn't handle Xlib errors.
- *
- * Don't print anything based on the return value of this function, it only
- * returns a value so that I can use the FAIL() macro without warning.
- *
- * Anyone who understands this function wins a cookie ;)
- */
-static int test_wrapping(void)
-{
- Display *dpy = NULL;
- XFontStruct *font = NULL;
- mlstring *mltest = NULL;
- int ok = 0;
- int chars_per_line, chars_first_word, i;
-
- const char *test_short = "a";
- const char *test_hardwrap = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
- const char *test_withnewlines = "a\nb";
- char *test_softwrap = NULL;
-
- dpy = XOpenDisplay(NULL);
- if (!dpy)
- goto end;
-
- font = XLoadQueryFont(dpy, "fixed");
- if (!font)
- goto end;
-
- TRY_WRAP(test_short, 1, False);
- TRY_WRAP(test_hardwrap, 2, False);
- TRY_WRAP(test_withnewlines, 2, False);
-
- /* See if wrapping splits on word boundaries like it should */
- chars_per_line = WRAP_WIDTH_PX / font->max_bounds.width;
- if (chars_per_line < 3)
- goto end;
-
- /* Allocate for 2 lines + \0 */
- test_softwrap = malloc(chars_per_line * 2 + 1);
- if (!test_softwrap)
- goto end;
-
- /* 2 = strlen(' a'); that is, the minimum space required to start a new word
- * on the same line. */
- chars_first_word = chars_per_line - 2;
-
- for (i = 0; i < chars_first_word; ++i) {
- test_softwrap[i] = 'a'; /* first word */
- test_softwrap[i + chars_per_line] = 'b'; /* second word */
- }
- /* space between first & second words */
- test_softwrap[chars_first_word] = ' ';
- /* first char of second word (last char of first line) */
- test_softwrap[chars_first_word + 1] = 'b';
- /* after second word */
- test_softwrap[chars_per_line * 2] = '\0';
-
- mltest = mlstring_allocate(test_softwrap);
- mlstring_wrap(mltest, font, WRAP_WIDTH_PX);
-
- /* reusing 'i' for a moment here to make freeing mltest easier */
- i = strlen(mltest->lines->line);
- free(mltest);
-
- if (i != chars_first_word)
- FAIL("Soft wrap failed, expected the first line to be %d chars, but it was %d.", chars_first_word, i);
- SUCCEED("Soft wrap");
-
- ok = 1;
-
-end:
- if (test_softwrap)
- free(test_softwrap);
-
- if (font)
- XFreeFont(dpy, font);
-
- if (dpy)
- XCloseDisplay(dpy);
-
- if (!ok)
- SKIP("wrapping");
-
- return ok ? SUCCESS : SKIPPED; /* Unused, actually */
-}
-
-
-int main(int argc, char *argv[])
-{
- const char *oneline = "1Foo";
- const char *twolines = "2Foo\nBar";
- const char *threelines = "3Foo\nBar\nWhippet";
- const char *trailnewline = "4Foo\n";
- const char *trailnewlines = "5Foo\n\n";
- const char *embeddednewlines = "6Foo\n\nBar";
- mlstring *mlstr;
-
- TRY_NEW(oneline, 1, False);
- TRY_NEW(twolines, 2, False);
- TRY_NEW(threelines, 3, False);
- TRY_NEW(trailnewline, 2, True);
- TRY_NEW(trailnewlines, 3, True);
- TRY_NEW(embeddednewlines, 3, True);
-
- (void) test_wrapping();
-
- fprintf(stdout, "%d test failures.\n", failcount);
-
- return !!failcount;
-}
-
-/* vim:ts=8:sw=2:noet
- */
diff --git a/driver/test-passwd.c b/driver/test-passwd.c
index 9b4f98e..2c894ac 100644
--- a/driver/test-passwd.c
+++ b/driver/test-passwd.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1998-2017 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 1998-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -10,8 +10,6 @@
*/
/* This is a kludgy test harness for debugging the password dialog box.
- It's somewhat easier to debug it here than in the xscreensaver executable
- itself.
*/
#ifdef HAVE_CONFIG_H
@@ -19,288 +17,101 @@
#endif
#include <stdio.h>
-#include <ctype.h>
-#include <pwd.h>
-
-#include <X11/Xlib.h>
-#include <X11/Xatom.h>
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
-#include <X11/Shell.h>
-#include <X11/Xlocale.h>
-
-#include "xscreensaver.h"
-#include "resources.h"
-#include "version.h"
-#include "visual.h"
+#include <stdlib.h>
+#include "blurb.h"
#include "auth.h"
-char *progname = 0;
-char *progclass = 0;
-XrmDatabase db = 0;
-saver_info *global_si_kludge;
-
-FILE *real_stderr, *real_stdout;
-
-void monitor_power_on (saver_info *si, Bool on_p) {}
-Bool monitor_powered_on_p (saver_info *si) { return True; }
-void initialize_screensaver_window (saver_info *si) {}
-void raise_window (saver_info *si, Bool i, Bool b, Bool d) {}
-Bool blank_screen (saver_info *si) {return False;}
-void unblank_screen (saver_info *si) {}
-void reset_watchdog_timer(saver_info *si, Bool on_p) {}
-Bool select_visual (saver_screen_info *ssi, const char *v) { return False; }
-Bool window_exists_p (Display *dpy, Window window) {return True;}
-void start_notice_events_timer (saver_info *si, Window w, Bool b) {}
-Bool handle_clientmessage (saver_info *si, XEvent *e, Bool u) { return False; }
-int BadWindow_ehandler (Display *dpy, XErrorEvent *error) { exit(1); }
-const char *signal_name(int signal) { return "???"; }
-Bool restore_real_vroot (saver_info *si) { return False; }
-void store_saver_status (saver_info *si) {}
-void saver_exit (saver_info *si, int status, const char *core) { exit(status);}
-int move_mouse_grab (saver_info *si, Window to, Cursor c, int ts) { return 0; }
-int mouse_screen (saver_info *si) { return 0; }
-void check_for_leaks (const char *where) { }
-void shutdown_stderr (saver_info *si) { }
-void resize_screensaver_window (saver_info *si) { }
-void describe_monitor_layout (saver_info *si) { }
-Bool update_screen_layout (saver_info *si) { return 0; }
-Bool in_signal_handler_p = 0;
-char *timestring (time_t when) { return ""; }
-
-const char *blurb(void) { return progname; }
-Atom XA_SCREENSAVER, XA_DEMO, XA_PREFS;
+extern Bool test_auth_conv (void *, int, auth_message *, auth_response **);
-void
-idle_timer (XtPointer closure, XtIntervalId *id)
+Bool
+test_auth_conv (void *closure,
+ int nmsgs,
+ auth_message *msg,
+ auth_response **resp)
{
- saver_info *si = (saver_info *) closure;
- XEvent fake_event;
- fake_event.type = 0; /* XAnyEvent type, ignored. */
- fake_event.xany.display = si->dpy;
- fake_event.xany.window = 0;
- XPutBackEvent (si->dpy, &fake_event);
-}
-
-static int
-text_auth_conv (
- int num_msg,
- const struct auth_message *auth_msgs,
- struct auth_response **resp,
- saver_info *si)
-{
- char *input;
- char buf[255];
- struct auth_response *responses;
+ int page = 1;
int i;
+ nmsgs = 0;
+ msg = (auth_message *) calloc (100, sizeof(*msg));
- responses = calloc(num_msg, sizeof(struct auth_response));
- if (!responses)
- return -1;
-
- /* The unlock state won't actually be used until this function returns and
- * the auth module processes the response, but set it anyway for consistency
- */
- si->unlock_state = ul_read;
-
- for (i = 0; i < num_msg; ++i)
- {
- printf ("\n%s: %s", progname, auth_msgs[i].msg);
- if ( auth_msgs[i].type == AUTH_MSGTYPE_PROMPT_NOECHO
- || auth_msgs[i].type == AUTH_MSGTYPE_PROMPT_ECHO)
- {
- input = fgets (buf, sizeof(buf)-1, stdin);
- if (!input || !*input)
- exit (0);
- if (input[strlen(input)-1] == '\n')
- input[strlen(input)-1] = 0;
-
- responses[i].response = strdup(input);
- }
- }
-
- *resp = responses;
-
- si->unlock_state = ul_finished;
-
- return 0;
-}
-
-
-#ifdef __GNUC__
- __extension__ /* shut up about "string length is greater than the length
- ISO C89 compilers are required to support" when including
- the .ad file... */
-#endif
-
-static char *fallback[] = {
-#include "XScreenSaver_ad.h"
- 0
-};
+# define DIALOG() \
+ fprintf (stderr, "\n%s: page %d\n", blurb(), page++); \
+ xscreensaver_auth_conv (closure, nmsgs, msg, resp); \
+ if (*resp) \
+ for (i = 0; i < nmsgs; i++) \
+ fprintf (stderr, "%s: resp %d = \"%s\"\n", blurb(), i, \
+ ((*resp)[i].response ? (*resp)[i].response : "")); \
+ nmsgs = 0
-extern Bool debug_passwd_window_p; /* lock.c kludge */
-int
-main (int argc, char **argv)
-{
- enum { PASS, SPLASH, TTY } which;
- Widget toplevel_shell = 0;
- saver_screen_info ssip;
- saver_info sip;
- saver_info *si = &sip;
- saver_preferences *p = &si->prefs;
- struct passwd *pw;
+ msg[nmsgs].type = AUTH_MSGTYPE_INFO;
+ msg[nmsgs].msg = "1/4 Page One";
+ nmsgs++;
- memset(&sip, 0, sizeof(sip));
- memset(&ssip, 0, sizeof(ssip));
+ msg[nmsgs].type = AUTH_MSGTYPE_INFO;
+ msg[nmsgs].msg = "2/4 All work and no play makes Jack a dull boy. "
+ "All work and no play makes Jack a dull boy. ";
+ nmsgs++;
- si->nscreens = 1;
- si->screens = si->default_screen = &ssip;
- ssip.global = si;
+ msg[nmsgs].type = AUTH_MSGTYPE_ERROR;
+ msg[nmsgs].msg = "3/4 Red";
+ nmsgs++;
- global_si_kludge = si;
- real_stderr = stderr;
- real_stdout = stdout;
+ msg[nmsgs].type = AUTH_MSGTYPE_INFO;
+ msg[nmsgs].msg = "4/4 Greets to Crash Override.";
+ nmsgs++;
+ DIALOG();
- si->version = (char *) malloc (5);
- memcpy (si->version, screensaver_id + 17, 4);
- si->version[4] = 0;
- progname = argv[0];
- {
- char *s = strrchr(progname, '/');
- if (*s) progname = s+1;
- }
- if (argc != 2) goto USAGE;
- else if (!strcmp (argv[1], "pass")) which = PASS;
- else if (!strcmp (argv[1], "splash")) which = SPLASH;
- else if (!strcmp (argv[1], "tty")) which = TTY;
- else
- {
- USAGE:
- fprintf (stderr, "usage: %s [ pass | splash | tty ]\n", progname);
- exit (1);
- }
-
-#ifdef NO_LOCKING
- if (which == PASS || which == TTY)
- {
- fprintf (stderr, "%s: compiled with NO_LOCKING\n", progname);
- exit (1);
- }
-#endif
-
-#ifndef NO_LOCKING
- /* before hack_uid() for proper permissions */
- lock_priv_init (argc, argv, True);
-
- hack_uid (si);
-
- if (! lock_init (argc, argv, True))
- {
- si->locking_disabled_p = True;
- si->nolock_reason = "error getting password";
- }
-#endif
+ msg[nmsgs].type = AUTH_MSGTYPE_INFO;
+ msg[nmsgs].msg = "1/1 Page Two";
+ nmsgs++;
+ DIALOG();
- progclass = "XScreenSaver";
- if (!setlocale (LC_CTYPE, ""))
- fprintf (stderr, "%s: warning: could not set default locale\n",
- progname);
+ msg[nmsgs].type = AUTH_MSGTYPE_INFO;
+ msg[nmsgs].msg = "1/2 Page Three";
+ nmsgs++;
+ msg[nmsgs].type = AUTH_MSGTYPE_PROMPT_NOECHO;
+ msg[nmsgs].msg = "2/2 Greets to Crash Override and also Joey";
+ nmsgs++;
- if (which != TTY)
- {
- toplevel_shell = XtAppInitialize (&si->app, progclass, 0, 0,
- &argc, argv, fallback,
- 0, 0);
- si->dpy = XtDisplay (toplevel_shell);
- p->db = XtDatabase (si->dpy);
- si->default_screen->toplevel_shell = toplevel_shell;
- si->default_screen->screen = XtScreen(toplevel_shell);
- si->default_screen->default_visual =
- si->default_screen->current_visual =
- DefaultVisualOfScreen(si->default_screen->screen);
- si->default_screen->screensaver_window =
- RootWindowOfScreen(si->default_screen->screen);
- si->default_screen->current_depth =
- visual_depth(si->default_screen->screen,
- si->default_screen->current_visual);
+ msg[nmsgs].type = AUTH_MSGTYPE_PROMPT_NOECHO;
+ msg[nmsgs].msg = "1/3 Page Four";
+ nmsgs++;
- ssip.width = WidthOfScreen(ssip.screen);
- ssip.height = HeightOfScreen(ssip.screen);
+ msg[nmsgs].type = AUTH_MSGTYPE_INFO;
+ msg[nmsgs].msg = "2/3 Hack the planet.";
+ nmsgs++;
- db = p->db;
- XtGetApplicationNameAndClass (si->dpy, &progname, &progclass);
+ msg[nmsgs].type = AUTH_MSGTYPE_INFO;
+ msg[nmsgs].msg = "3/3 Hack the planet.";
+ nmsgs++;
+ DIALOG();
- load_init_file (si->dpy, &si->prefs);
- }
- p->verbose_p = True;
+ msg[nmsgs].type = AUTH_MSGTYPE_PROMPT_ECHO;
+ msg[nmsgs].msg = "1/1 Page Five visible text";
+ nmsgs++;
- pw = getpwuid (getuid ());
- si->user = strdup (pw->pw_name);
+ msg[nmsgs].type = AUTH_MSGTYPE_PROMPT_ECHO;
+ msg[nmsgs].msg = "1/3 Page six visible text";
+ nmsgs++;
-/* si->nscreens = 0;
- si->screens = si->default_screen = 0; */
+ msg[nmsgs].type = AUTH_MSGTYPE_INFO;
+ msg[nmsgs].msg = "2/3 Poop.";
+ nmsgs++;
- while (1)
- {
-#ifndef NO_LOCKING
- if (which == PASS)
- {
- si->unlock_cb = gui_auth_conv;
- si->auth_finished_cb = auth_finished_cb;
+ msg[nmsgs].type = AUTH_MSGTYPE_INFO;
+ msg[nmsgs].msg = "3/3 \xF0\x9F\x92\xA9 \xF0\x9F\x92\xA9 \xF0\x9F\x92\xA9"
+ " \xE2\x80\x9C"
+ " \xE2\xAC\xA4 \xE2\x80\xA2 \xE2\xAD\x98 "
+ "\xE2\x80\x9D";
+ nmsgs++;
+ DIALOG();
- debug_passwd_window_p = True;
- xss_authenticate(si, True);
-
- if (si->unlock_state == ul_success)
- fprintf (stderr, "%s: authentication succeeded\n", progname);
- else
- fprintf (stderr, "%s: authentication FAILED!\n", progname);
-
- XSync(si->dpy, False);
- fprintf (stderr, "\n######################################\n\n");
- sleep (3);
- }
- else
-#endif
- if (which == SPLASH)
- {
- XEvent event;
- make_splash_dialog (si);
- XtAppAddTimeOut (si->app, p->splash_duration + 1000,
- idle_timer, (XtPointer) si);
- while (si->splash_dialog)
- {
- XtAppNextEvent (si->app, &event);
- if (event.xany.window == si->splash_dialog)
- handle_splash_event (si, &event);
- XtDispatchEvent (&event);
- }
- XSync (si->dpy, False);
- sleep (1);
- }
-#ifndef NO_LOCKING
- else if (which == TTY)
- {
- si->unlock_cb = text_auth_conv;
-
- printf ("%s: Authenticating user %s\n", progname, si->user);
- xss_authenticate(si, True);
-
- if (si->unlock_state == ul_success)
- printf ("%s: Ok!\n", progname);
- else
- printf ("%s: Wrong!\n", progname);
- }
-#endif
- else
- abort();
- }
-
- free(si->user);
+ exit(0);
}
+
diff --git a/driver/test-randr.c b/driver/test-randr.c
index 74ead37..1f88d99 100644
--- a/driver/test-randr.c
+++ b/driver/test-randr.c
@@ -1,5 +1,5 @@
/* test-randr.c --- playing with the Resize And Rotate extension.
- * xscreensaver, Copyright (c) 2004-2008 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 2004-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -30,26 +30,9 @@
#include <X11/Xproto.h>
#include <X11/extensions/Xrandr.h>
-char *progname = 0;
+#include "blurb.h"
char *progclass = "XScreenSaver";
-static const char *
-blurb (void)
-{
- static char buf[255];
- time_t now = time ((time_t *) 0);
- char *ct = (char *) ctime (&now);
- int n = strlen(progname);
- if (n > 100) n = 99;
- strncpy(buf, progname, n);
- buf[n++] = ':';
- buf[n++] = ' ';
- strncpy(buf+n, ct+11, 8);
- strcpy(buf+n+9, ": ");
- return buf;
-}
-
-
static Bool error_handler_hit_p = False;
static int
@@ -72,15 +55,15 @@ main (int argc, char **argv)
Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0,
&argc, argv, 0, 0, 0);
Display *dpy = XtDisplay (toplevel_shell);
- XtGetApplicationNameAndClass (dpy, &progname, &progclass);
+ progname = argv[0];
nscreens = ScreenCount(dpy);
if (!XRRQueryExtension(dpy, &event_number, &error_number))
{
fprintf(stderr, "%s: XRRQueryExtension(dpy, ...) ==> False\n",
blurb());
- fprintf(stderr, "%s: server does not support the RANDR extension.\n",
+ fprintf(stderr, "%s: server does not support the RANDR extension\n",
blurb());
major = -1;
}
diff --git a/driver/test-screens.c b/driver/test-screens.c
index 2fb3e35..141b7ad 100644
--- a/driver/test-screens.c
+++ b/driver/test-screens.c
@@ -1,5 +1,5 @@
/* test-screens.c --- some test cases for the "monitor sanity" checks.
- * xscreensaver, Copyright (c) 2008 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 2008-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -14,39 +14,20 @@
# include "config.h"
#endif
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
#include <X11/Xlib.h>
-/* This file doesn't need the Xt headers, so stub these types out... */
-#undef XtPointer
-#define XtAppContext void*
-#define XrmDatabase void*
-#define XtIntervalId void*
-#define XtPointer void*
-#define Widget void*
-
-#include "xscreensaver.h"
+#include "blurb.h"
#include "visual.h"
+#include "screens.h"
#undef WidthOfScreen
#undef HeightOfScreen
#define WidthOfScreen(s) 10240
#define HeightOfScreen(s) 10240
-#undef screen_number
-#define screen_number(s) ((int) s)
-
-#include "screens.c" /* to get at static void check_monitor_sanity() */
-
-char *progname = 0;
-char *progclass = "XScreenSaver";
-
-const char *blurb(void) { return progname; }
-
-Bool safe_XF86VidModeGetViewPort(Display *d, int i, int *x, int *y) { abort(); }
-void initialize_screen_root_widget(saver_screen_info *ssi) { abort(); }
-Visual *get_best_gl_visual (saver_info *si, Screen *sc) { abort(); }
-
-
static const char *
failstr (monitor_sanity san)
{
diff --git a/driver/test-uid.c b/driver/test-uid.c
index 6a1f9cc..713a3fd 100644
--- a/driver/test-uid.c
+++ b/driver/test-uid.c
@@ -124,12 +124,12 @@ main (int argc, char **argv)
{
if (was_numeric)
{
- fprintf(stderr, "no group numbered %s.\n", group);
+ fprintf(stderr, "no group numbered %s\n", group);
group = "";
}
else
{
- fprintf(stderr, "no group named %s.\n", group);
+ fprintf(stderr, "no group named %s\n", group);
goto NOGROUP;
}
}
@@ -138,14 +138,14 @@ main (int argc, char **argv)
{
gid_t g2 = gid;
if (setgroups(1, &g2) == 0)
- fprintf(stderr, " succeeded.\n");
+ fprintf(stderr, " succeeded\n");
else
perror(" failed");
}
fprintf(stderr, "setgid(%ld) \"%s\"", gid, group);
if (setgid(gid) == 0)
- fprintf(stderr, " succeeded.\n");
+ fprintf(stderr, " succeeded\n");
else
perror(" failed");
@@ -177,19 +177,19 @@ main (int argc, char **argv)
{
if (was_numeric)
{
- fprintf(stderr, "no user numbered \"%s\".\n", user);
+ fprintf(stderr, "no user numbered \"%s\"\n", user);
user = "";
}
else
{
- fprintf(stderr, "no user named %s.\n", user);
+ fprintf(stderr, "no user named %s\n", user);
goto NOUSER;
}
}
fprintf(stderr, "setuid(%ld) \"%s\"", uid, user);
if (setuid(uid) == 0)
- fprintf(stderr, " succeeded.\n");
+ fprintf(stderr, " succeeded\n");
else
perror(" failed");
NOUSER: ;
diff --git a/driver/test-vp.c b/driver/test-vp.c
index bf1a0b1..ded5aca 100644
--- a/driver/test-vp.c
+++ b/driver/test-vp.c
@@ -1,5 +1,5 @@
/* test-xinerama.c --- playing with XF86VidModeGetViewPort
- * xscreensaver, Copyright (c) 2004 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 2004-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -31,26 +31,9 @@
#include <X11/extensions/xf86vmode.h>
#include <X11/extensions/Xinerama.h>
-char *progname = 0;
+#include "blurb.h"
char *progclass = "XScreenSaver";
-static const char *
-blurb (void)
-{
- static char buf[255];
- time_t now = time ((time_t *) 0);
- char *ct = (char *) ctime (&now);
- int n = strlen(progname);
- if (n > 100) n = 99;
- strncpy(buf, progname, n);
- buf[n++] = ':';
- buf[n++] = ' ';
- strncpy(buf+n, ct+11, 8);
- strcpy(buf+n+9, ": ");
- return buf;
-}
-
-
static Bool error_handler_hit_p = False;
static int
@@ -129,14 +112,13 @@ main (int argc, char **argv)
Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0,
&argc, argv, 0, 0, 0);
Display *dpy = XtDisplay (toplevel_shell);
- XtGetApplicationNameAndClass (dpy, &progname, &progclass);
if (!XF86VidModeQueryExtension(dpy, &event_number, &error_number))
{
fprintf(stderr, "%s: XF86VidModeQueryExtension(dpy, ...) ==> False\n",
blurb());
fprintf(stderr,
- "%s: server does not support the XF86VidMode extension.\n",
+ "%s: server does not support the XF86VidMode extension\n",
blurb());
exit(1);
}
diff --git a/driver/test-xdpms.c b/driver/test-xdpms.c
index b86aed3..e837d8d 100644
--- a/driver/test-xdpms.c
+++ b/driver/test-xdpms.c
@@ -1,5 +1,5 @@
/* test-xdpms.c --- playing with the XDPMS extension.
- * xscreensaver, Copyright (c) 1998-2011 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 1998-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -29,42 +29,11 @@
#include <X11/Xproto.h>
#include <X11/extensions/dpms.h>
-#include <X11/extensions/dpmsstr.h>
+/*#include <X11/extensions/dpmsstr.h>*/
-extern Bool DPMSQueryExtension (Display *dpy, int *event_ret, int *error_ret);
-extern Bool DPMSCapable (Display *dpy);
-extern Status DPMSForceLevel (Display *dpy, CARD16 level);
-extern Status DPMSInfo (Display *dpy, CARD16 *power_level, BOOL *state);
-
-extern Status DPMSGetVersion (Display *dpy, int *major_ret, int *minor_ret);
-extern Status DPMSSetTimeouts (Display *dpy,
- CARD16 standby, CARD16 suspend, CARD16 off);
-extern Bool DPMSGetTimeouts (Display *dpy,
- CARD16 *standby, CARD16 *suspend, CARD16 *off);
-extern Status DPMSEnable (Display *dpy);
-extern Status DPMSDisable (Display *dpy);
-
-
-char *progname = 0;
+#include "blurb.h"
char *progclass = "XScreenSaver";
-static const char *
-blurb (void)
-{
- static char buf[255];
- time_t now = time ((time_t *) 0);
- char *ct = (char *) ctime (&now);
- int n = strlen(progname);
- if (n > 100) n = 99;
- strncpy(buf, progname, n);
- buf[n++] = ':';
- buf[n++] = ' ';
- strncpy(buf+n, ct+11, 8);
- strcpy(buf+n+9, ": ");
- return buf;
-}
-
-
static Bool error_handler_hit_p = False;
static int
@@ -90,13 +59,12 @@ main (int argc, char **argv)
Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0,
&argc, argv, 0, 0, 0);
Display *dpy = XtDisplay (toplevel_shell);
- XtGetApplicationNameAndClass (dpy, &progname, &progclass);
if (!DPMSQueryExtension(dpy, &event_number, &error_number))
{
fprintf(stderr, "%s: DPMSQueryExtension(dpy, ...) ==> False\n",
blurb());
- fprintf(stderr, "%s: server does not support the XDPMS extension.\n",
+ fprintf(stderr, "%s: server does not support the XDPMS extension\n",
blurb());
exit(1);
}
@@ -107,7 +75,7 @@ main (int argc, char **argv)
if (!DPMSCapable(dpy))
{
fprintf(stderr, "%s: DPMSCapable(dpy) ==> False\n", blurb());
- fprintf(stderr, "%s: server says hardware doesn't support DPMS.\n",
+ fprintf(stderr, "%s: server says hardware doesn't support DPMS\n",
blurb());
exit(1);
}
@@ -158,13 +126,12 @@ main (int argc, char **argv)
state == DPMSModeSuspend ||
state == DPMSModeOff)
{
- XErrorHandler old_handler;
int st;
- fprintf(stderr, "%s: monitor is off; turning it on.\n", blurb());
+ fprintf(stderr, "%s: monitor is off; turning it on\n", blurb());
XSync (dpy, False);
error_handler_hit_p = False;
- old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+ XSetErrorHandler (ignore_all_errors_ehandler);
XSync (dpy, False);
st = DPMSForceLevel (dpy, DPMSModeOn);
XSync (dpy, False);
diff --git a/driver/test-xinerama.c b/driver/test-xinerama.c
index 8bafbb0..cd8add4 100644
--- a/driver/test-xinerama.c
+++ b/driver/test-xinerama.c
@@ -1,5 +1,5 @@
/* test-xinerama.c --- playing with the Xinerama extension.
- * xscreensaver, Copyright (c) 2003 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 2003-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -30,26 +30,9 @@
#include <X11/Xproto.h>
#include <X11/extensions/Xinerama.h>
-char *progname = 0;
+#include "blurb.h"
char *progclass = "XScreenSaver";
-static const char *
-blurb (void)
-{
- static char buf[255];
- time_t now = time ((time_t *) 0);
- char *ct = (char *) ctime (&now);
- int n = strlen(progname);
- if (n > 100) n = 99;
- strncpy(buf, progname, n);
- buf[n++] = ':';
- buf[n++] = ' ';
- strncpy(buf+n, ct+11, 8);
- strcpy(buf+n+9, ": ");
- return buf;
-}
-
-
int
main (int argc, char **argv)
{
@@ -63,13 +46,12 @@ main (int argc, char **argv)
Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0,
&argc, argv, 0, 0, 0);
Display *dpy = XtDisplay (toplevel_shell);
- XtGetApplicationNameAndClass (dpy, &progname, &progclass);
if (!XineramaQueryExtension(dpy, &event_number, &error_number))
{
fprintf(stderr, "%s: XineramaQueryExtension(dpy, ...) ==> False\n",
blurb());
- fprintf(stderr, "%s: server does not support the Xinerama extension.\n",
+ fprintf(stderr, "%s: server does not support the Xinerama extension\n",
blurb());
exit(1);
}
@@ -80,7 +62,7 @@ main (int argc, char **argv)
if (!XineramaIsActive(dpy))
{
fprintf(stderr, "%s: XineramaIsActive(dpy) ==> False\n", blurb());
- fprintf(stderr, "%s: server says Xinerama is turned off.\n", blurb());
+ fprintf(stderr, "%s: server says Xinerama is turned off\n", blurb());
exit(1);
}
else
diff --git a/driver/test-xinput.c b/driver/test-xinput.c
new file mode 100644
index 0000000..e3a6487
--- /dev/null
+++ b/driver/test-xinput.c
@@ -0,0 +1,306 @@
+/* test-xinput.c --- playing with the XInput2 extension.
+ * xscreensaver, Copyright © 2021 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <stdio.h>
+#include <time.h>
+#include <sys/time.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Xproto.h>
+#include <X11/extensions/XInput2.h>
+
+#include "blurb.h"
+#include "xinput.h"
+
+char *progclass = "XScreenSaver";
+Bool debug_p = True;
+
+static void
+ungrab_timer (XtPointer closure, XtIntervalId *id)
+{
+ Display *dpy = (Display *) closure;
+ fprintf (stderr, "\n%s: ungrabbing\n\n", blurb());
+ XUngrabKeyboard (dpy, CurrentTime);
+ XUngrabPointer (dpy, CurrentTime);
+}
+
+
+static const char *
+grab_string (int status)
+{
+ switch (status) {
+ case GrabSuccess: return "GrabSuccess";
+ case AlreadyGrabbed: return "AlreadyGrabbed";
+ case GrabInvalidTime: return "GrabInvalidTime";
+ case GrabNotViewable: return "GrabNotViewable";
+ case GrabFrozen: return "GrabFrozen";
+ default:
+ {
+ static char buf[255];
+ sprintf(buf, "unknown status: %d", status);
+ return buf;
+ }
+ }
+}
+
+
+int
+main (int argc, char **argv)
+{
+ XtAppContext app;
+ Widget toplevel_shell;
+ Display *dpy;
+ int xi_opcode;
+ Bool grab_kbd_p = False;
+ Bool grab_mouse_p = False;
+ Bool mouse_sync_p = True;
+ Bool kbd_sync_p = True;
+ int i;
+
+ progname = argv[0];
+
+ for (i = 1; i < argc; i++)
+ {
+ const char *oa = argv[i];
+ if (argv[i][0] == '-' && argv[i][1] == '-')
+ argv[i]++;
+ if (!strcmp (argv[i], "-grab"))
+ grab_kbd_p = grab_mouse_p = True;
+ else if (!strcmp (argv[i], "-grab-kbd") ||
+ !strcmp (argv[i], "-grab-keyboard"))
+ grab_kbd_p = True;
+ else if (!strcmp (argv[i], "-grab-mouse") ||
+ !strcmp (argv[i], "-grab-pointer"))
+ grab_mouse_p = True;
+ else if (!strcmp (argv[i], "-kbd-sync") ||
+ !strcmp (argv[i], "-keyboard-sync"))
+ kbd_sync_p = True;
+ else if (!strcmp (argv[i], "-kbd-async") ||
+ !strcmp (argv[i], "-keyboard-async"))
+ kbd_sync_p = False;
+ else if (!strcmp (argv[i], "-mouse-sync") ||
+ !strcmp (argv[i], "-pointer-sync"))
+ mouse_sync_p = True;
+ else if (!strcmp (argv[i], "-mouse-async") ||
+ !strcmp (argv[i], "-pointer-async"))
+ mouse_sync_p = False;
+ else
+ {
+ fprintf (stderr, "%s: unknown option: %s\n", blurb(), oa);
+ exit (1);
+ }
+ }
+
+ toplevel_shell = XtAppInitialize (&app, progclass, 0, 0,
+ &argc, argv, 0, 0, 0);
+ dpy = XtDisplay (toplevel_shell);
+ if (!dpy) exit(1);
+
+ if (! init_xinput (dpy, &xi_opcode))
+ exit (1);
+
+ if (grab_kbd_p || grab_mouse_p)
+ {
+ int timeout = 15;
+ Window w = RootWindow (dpy, 0);
+ int status;
+ XColor black = { 0, };
+ Pixmap bit = XCreateBitmapFromData (dpy, w, "\000", 1, 1);
+ Cursor cursor = XCreatePixmapCursor (dpy, bit, bit, &black, &black, 0, 0);
+
+ if (grab_kbd_p)
+ {
+ status = XGrabKeyboard (dpy, w, True,
+ (mouse_sync_p ? GrabModeSync : GrabModeAsync),
+ (kbd_sync_p ? GrabModeSync : GrabModeAsync),
+ CurrentTime);
+ if (status == GrabSuccess)
+ fprintf (stderr, "%s: grabbed keyboard (%s, %s)\n", blurb(),
+ (mouse_sync_p ? "sync" : "async"),
+ (kbd_sync_p ? "sync" : "async"));
+ else
+ {
+ fprintf (stderr, "%s: failed to grab keyboard (%s, %s): %s\n",
+ blurb(),
+ (mouse_sync_p ? "sync" : "async"),
+ (kbd_sync_p ? "sync" : "async"),
+ grab_string (status));
+ exit(1);
+ }
+ }
+
+ if (grab_mouse_p)
+ {
+ status = XGrabPointer (dpy, w, True,
+ (ButtonPressMask | ButtonReleaseMask |
+ EnterWindowMask | LeaveWindowMask |
+ PointerMotionMask | PointerMotionHintMask |
+ Button1MotionMask | Button2MotionMask |
+ Button3MotionMask | Button4MotionMask |
+ Button5MotionMask | ButtonMotionMask),
+ (mouse_sync_p ? GrabModeSync : GrabModeAsync),
+ (kbd_sync_p ? GrabModeSync : GrabModeAsync),
+ w, cursor, CurrentTime);
+ if (status == GrabSuccess)
+ fprintf (stderr, "%s: grabbed mouse (%s, %s)\n", blurb(),
+ (mouse_sync_p ? "sync" : "async"),
+ (kbd_sync_p ? "sync" : "async"));
+ else
+ {
+ fprintf (stderr, "%s: failed to grab mouse (%s, %s): %s\n",
+ blurb(),
+ (mouse_sync_p ? "sync" : "async"),
+ (kbd_sync_p ? "sync" : "async"),
+ grab_string (status));
+ exit(1);
+ }
+ }
+
+ fprintf (stderr, "%s: ungrabbing in %d seconds\n", blurb(), timeout);
+ XtAppAddTimeOut (app, 1000 * timeout, ungrab_timer, (XtPointer) dpy);
+ }
+
+ while (1)
+ {
+ XEvent xev;
+ XIRawEvent *re;
+
+ XtAppNextEvent (app, &xev);
+ XtDispatchEvent (&xev);
+
+ switch (xev.xany.type) {
+ case KeyPress:
+ case KeyRelease:
+ {
+ static XComposeStatus compose = { 0, };
+ KeySym keysym = 0;
+ char c[100];
+ int n;
+ n = XLookupString (&xev.xkey, c, sizeof(c)-1, &keysym, &compose);
+ c[n] = 0;
+ fprintf (stderr, "%s: X11 Key%s %02x %02x %s \"%s\"\n", blurb(),
+ (xev.xkey.type == KeyPress ? "Press " : "Release"),
+ xev.xkey.keycode, xev.xkey.state,
+ XKeysymToString (keysym), c);
+ }
+ break;
+ case ButtonPress:
+ case ButtonRelease:
+ fprintf (stderr, "%s: X11 Button%s %d %d\n", blurb(),
+ (xev.xany.type == ButtonPress ? "Press " : "Release"),
+ xev.xbutton.button, xev.xbutton.state);
+ break;
+ case MotionNotify:
+ fprintf (stderr, "%s: X11 MotionNotify %4d, %-4d\n",
+ blurb(), xev.xmotion.x_root, xev.xmotion.y_root);
+ break;
+ case GenericEvent:
+ break;
+ case EnterNotify:
+ case LeaveNotify:
+ break;
+ default:
+ fprintf (stderr, "%s: X11 event %d on 0x%lx\n",
+ blurb(), xev.xany.type, xev.xany.window);
+ break;
+ }
+
+ if (xev.xcookie.type != GenericEvent ||
+ xev.xcookie.extension != xi_opcode)
+ continue; /* not an XInput event */
+ if (!xev.xcookie.data)
+ XGetEventData (dpy, &xev.xcookie);
+ if (!xev.xcookie.data)
+ continue; /* Bogus XInput event */
+
+ re = xev.xcookie.data;
+ switch (xev.xcookie.evtype) {
+ case XI_RawKeyPress:
+ case XI_RawKeyRelease:
+ {
+ /* Fake up an XKeyEvent in order to call XKeysymToString(). */
+ XEvent ev2;
+ Bool ok = xinput_event_to_xlib (xev.xcookie.evtype,
+ (XIDeviceEvent *) re,
+ &ev2);
+ if (!ok)
+ fprintf (stderr, "%s: unable to translate XInput2 event\n",
+ blurb());
+ else
+ {
+ static XComposeStatus compose = { 0, };
+ KeySym keysym = 0;
+ char c[100];
+ int n;
+ n = XLookupString (&ev2.xkey, c, sizeof(c)-1, &keysym, &compose);
+ c[n] = 0;
+ fprintf (stderr, "%s: XI_RawKey%s %02x %02x %s \"%s\"\n",
+ blurb(),
+ (ev2.xkey.type == KeyPress ? "Press " : "Release"),
+ ev2.xkey.keycode, ev2.xkey.state,
+ XKeysymToString (keysym), c);
+ }
+ }
+ break;
+ case XI_RawButtonPress:
+ case XI_RawButtonRelease:
+ fprintf (stderr, "%s: XI_RawButton%s %d\n", blurb(),
+ (re->evtype == XI_RawButtonPress ? "Press " : "Release"),
+ re->detail);
+ break;
+ case XI_RawMotion:
+ {
+ Window root_ret, child_ret;
+ int root_x, root_y;
+ int win_x, win_y;
+ unsigned int mask;
+ XQueryPointer (dpy, DefaultRootWindow (dpy),
+ &root_ret, &child_ret, &root_x, &root_y,
+ &win_x, &win_y, &mask);
+ fprintf (stderr, "%s: XI_RawMotion %4d, %-4d %7.02f, %-7.02f\n",
+ blurb(),
+ root_x, root_y,
+ re->raw_values[0], re->raw_values[1]);
+ }
+ break;
+ case XI_RawTouchBegin:
+ fprintf (stderr, "%s: XI_RawTouchBegin\n", blurb());
+ break;
+ case XI_RawTouchEnd:
+ fprintf (stderr, "%s: XI_RawTouchEnd", blurb());
+ break;
+ case XI_RawTouchUpdate:
+ fprintf (stderr, "%s: XI_RawTouchUpdate", blurb());
+ break;
+
+ default:
+ fprintf (stderr, "%s: XInput unknown event %d\n", blurb(),
+ xev.xcookie.evtype);
+ break;
+ }
+
+ XFreeEventData (dpy, &xev.xcookie);
+ }
+
+ exit (0);
+}
diff --git a/driver/test-xkb.c b/driver/test-xkb.c
new file mode 100644
index 0000000..8d26b73
--- /dev/null
+++ b/driver/test-xkb.c
@@ -0,0 +1,89 @@
+/* test-xkb.c --- playing with the X Keyboard extension.
+ * xscreensaver, Copyright © 2021 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <stdio.h>
+#include <time.h>
+#include <sys/time.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Xproto.h>
+#include <X11/XKBlib.h>
+
+#include "blurb.h"
+
+char *progclass = "XScreenSaver";
+
+int
+main (int argc, char **argv)
+{
+ XtAppContext app;
+ Widget toplevel_shell;
+ Display *dpy;
+ int i;
+
+ progname = argv[0];
+
+ for (i = 1; i < argc; i++)
+ {
+ const char *oa = argv[i];
+ if (argv[i][0] == '-' && argv[i][1] == '-')
+ argv[i]++;
+ if (0) ;
+ else
+ {
+ fprintf (stderr, "%s: unknown option: %s\n", blurb(), oa);
+ exit (1);
+ }
+ }
+
+ toplevel_shell = XtAppInitialize (&app, progclass, 0, 0,
+ &argc, argv, 0, 0, 0);
+ dpy = XtDisplay (toplevel_shell);
+ if (!dpy) exit(1);
+
+ {
+ XkbStateRec state;
+ XkbDescPtr desc;
+ char *group;
+ Atom name;
+
+ if (XkbGetState (dpy, XkbUseCoreKbd, &state))
+ {
+ fprintf (stderr, "%s: XkbGetState failed\n", progname);
+ exit (1);
+ }
+ desc = XkbGetKeyboard (dpy, XkbAllComponentsMask, XkbUseCoreKbd);
+ if (!desc || !desc->names)
+ {
+ fprintf (stderr, "%s: XkbGetKeyboard failed\n", progname);
+ exit (1);
+ }
+
+ name = desc->names->groups[state.group];
+ group = (name ? XGetAtomName (dpy, name) : strdup("NULL"));
+ fprintf (stderr, "%s: kbd name: %s\n", progname, group);
+ free (group);
+ }
+
+ exit (0);
+}
diff --git a/driver/test-yarandom.c b/driver/test-yarandom.c
index 6701ff8..e434377 100644
--- a/driver/test-yarandom.c
+++ b/driver/test-yarandom.c
@@ -21,10 +21,9 @@
#include <ctype.h>
#include <stdio.h>
+#include "blurb.h"
#include "yarandom.h"
-char *progname = 0;
-
int
main (int argc, char **argv)
{
diff --git a/driver/timers.c b/driver/timers.c
deleted file mode 100644
index b096000..0000000
--- a/driver/timers.c
+++ /dev/null
@@ -1,1807 +0,0 @@
-/* timers.c --- detecting when the user is idle, and other timer-related tasks.
- * xscreensaver, Copyright (c) 1991-2019 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdio.h>
-#include <X11/Xlib.h>
-#include <X11/Intrinsic.h>
-#include <X11/Xos.h>
-#include <X11/Xatom.h>
-#include <time.h>
-#include <sys/time.h>
-#ifdef HAVE_XMU
-# ifndef VMS
-# include <X11/Xmu/Error.h>
-# else /* VMS */
-# include <Xmu/Error.h>
-# endif /* VMS */
-# else /* !HAVE_XMU */
-# include "xmu.h"
-#endif /* !HAVE_XMU */
-
-#ifdef HAVE_XIDLE_EXTENSION
-#include <X11/extensions/xidle.h>
-#endif /* HAVE_XIDLE_EXTENSION */
-
-#ifdef HAVE_MIT_SAVER_EXTENSION
-#include <X11/extensions/scrnsaver.h>
-#endif /* HAVE_MIT_SAVER_EXTENSION */
-
-#ifdef HAVE_SGI_SAVER_EXTENSION
-#include <X11/extensions/XScreenSaver.h>
-#endif /* HAVE_SGI_SAVER_EXTENSION */
-
-#ifdef HAVE_RANDR
-#include <X11/extensions/Xrandr.h>
-#endif /* HAVE_RANDR */
-
-#include "xscreensaver.h"
-
-#undef ABS
-#define ABS(x)((x)<0?-(x):(x))
-
-#undef MAX
-#define MAX(x,y)((x)>(y)?(x):(y))
-
-
-#ifdef HAVE_PROC_INTERRUPTS
-static Bool proc_interrupts_activity_p (saver_info *si);
-#endif /* HAVE_PROC_INTERRUPTS */
-
-static void check_for_clock_skew (saver_info *si);
-
-
-void
-idle_timer (XtPointer closure, XtIntervalId *id)
-{
- saver_info *si = (saver_info *) closure;
-
- /* What an amazingly shitty design. Not only does Xt execute timeout
- events from XtAppNextEvent() instead of from XtDispatchEvent(), but
- there is no way to tell Xt to block until there is an X event OR a
- timeout happens. Once your timeout proc is called, XtAppNextEvent()
- still won't return until a "real" X event comes in.
-
- So this function pushes a stupid, gratuitous, unnecessary event back
- on the event queue to force XtAppNextEvent to return Right Fucking Now.
- When the code in sleep_until_idle() sees an event of type XAnyEvent,
- which the server never generates, it knows that a timeout has occurred.
- */
- XEvent fake_event;
- fake_event.type = 0; /* XAnyEvent type, ignored. */
- fake_event.xany.display = si->dpy;
- fake_event.xany.window = 0;
- XPutBackEvent (si->dpy, &fake_event);
-
- /* If we are the timer that just went off, clear the pointer to the id. */
- if (id)
- {
- if (si->timer_id && *id != si->timer_id)
- abort(); /* oops, scheduled timer twice?? */
- si->timer_id = 0;
- }
-}
-
-
-void
-schedule_wakeup_event (saver_info *si, Time when, Bool verbose_p)
-{
- if (si->timer_id)
- {
- if (verbose_p)
- fprintf (stderr, "%s: idle_timer already running\n", blurb());
- return;
- }
-
- /* Wake up periodically to ask the server if we are idle. */
- si->timer_id = XtAppAddTimeOut (si->app, when, idle_timer,
- (XtPointer) si);
-
- if (verbose_p)
- fprintf (stderr, "%s: starting idle_timer (%ld, %ld)\n",
- blurb(), when, si->timer_id);
-}
-
-
-static void
-notice_events (saver_info *si, Window window, Bool top_p)
-{
- saver_preferences *p = &si->prefs;
- XWindowAttributes attrs;
- unsigned long events;
- Window root, parent, *kids;
- unsigned int nkids;
- int screen_no;
-
- if (XtWindowToWidget (si->dpy, window))
- /* If it's one of ours, don't mess up its event mask. */
- return;
-
- if (!XQueryTree (si->dpy, window, &root, &parent, &kids, &nkids))
- return;
- if (window == root)
- top_p = False;
-
- /* Figure out which screen this window is on, for the diagnostics. */
- for (screen_no = 0; screen_no < si->nscreens; screen_no++)
- if (root == RootWindowOfScreen (si->screens[screen_no].screen))
- break;
-
- XGetWindowAttributes (si->dpy, window, &attrs);
- events = ((attrs.all_event_masks | attrs.do_not_propagate_mask)
- & (KeyPressMask | PropertyChangeMask));
-
- /* Select for SubstructureNotify on all windows.
- Select for PropertyNotify on all windows.
- Select for KeyPress on all windows that already have it selected.
-
- Note that we can't select for ButtonPress, because of X braindamage:
- only one client at a time may select for ButtonPress on a given
- window, though any number can select for KeyPress. Someone explain
- *that* to me.
-
- So, if the user spends a while clicking the mouse without ever moving
- the mouse or touching the keyboard, we won't know that they've been
- active, and the screensaver will come on. That sucks, but I don't
- know how to get around it.
-
- Since X presents mouse wheels as clicks, this applies to those, too:
- scrolling through a document using only the mouse wheel doesn't
- count as activity... Fortunately, /proc/interrupts helps, on
- systems that have it. Oh, if it's a PS/2 mouse, not serial or USB.
- This sucks!
- */
- XSelectInput (si->dpy, window,
- SubstructureNotifyMask | PropertyChangeMask | events);
-
- if (top_p && p->debug_p && (events & KeyPressMask))
- {
- /* Only mention one window per tree (hack hack). */
- fprintf (stderr, "%s: %d: selected KeyPress on 0x%lX\n",
- blurb(), screen_no, (unsigned long) window);
- top_p = False;
- }
-
- if (kids)
- {
- while (nkids)
- notice_events (si, kids [--nkids], top_p);
- XFree ((char *) kids);
- }
-}
-
-
-int
-BadWindow_ehandler (Display *dpy, XErrorEvent *error)
-{
- /* When we notice a window being created, we spawn a timer that waits
- 30 seconds or so, and then selects events on that window. This error
- handler is used so that we can cope with the fact that the window
- may have been destroyed <30 seconds after it was created.
- */
- if (error->error_code == BadWindow ||
- error->error_code == BadMatch ||
- error->error_code == BadDrawable)
- return 0;
- else
- return saver_ehandler (dpy, error);
-}
-
-
-struct notice_events_timer_arg {
- saver_info *si;
- Window w;
-};
-
-static void
-notice_events_timer (XtPointer closure, XtIntervalId *id)
-{
- struct notice_events_timer_arg *arg =
- (struct notice_events_timer_arg *) closure;
-
- XErrorHandler old_handler = XSetErrorHandler (BadWindow_ehandler);
-
- saver_info *si = arg->si;
- Window window = arg->w;
-
- free(arg);
- notice_events (si, window, True);
- XSync (si->dpy, False);
- XSetErrorHandler (old_handler);
-}
-
-void
-start_notice_events_timer (saver_info *si, Window w, Bool verbose_p)
-{
- saver_preferences *p = &si->prefs;
- struct notice_events_timer_arg *arg =
- (struct notice_events_timer_arg *) malloc(sizeof(*arg));
- arg->si = si;
- arg->w = w;
- XtAppAddTimeOut (si->app, p->notice_events_timeout, notice_events_timer,
- (XtPointer) arg);
-
- if (verbose_p)
- fprintf (stderr, "%s: starting notice_events_timer for 0x%X (%lu)\n",
- blurb(), (unsigned int) w, p->notice_events_timeout);
-}
-
-
-/* When the screensaver is active, this timer will periodically change
- the running program.
- */
-void
-cycle_timer (XtPointer closure, XtIntervalId *id)
-{
- saver_info *si = (saver_info *) closure;
- saver_preferences *p = &si->prefs;
- Time how_long = p->cycle;
-
- if (si->selection_mode > 0 &&
- screenhack_running_p (si))
- /* If we're in "SELECT n" mode, the cycle timer going off will just
- restart this same hack again. There's not much point in doing this
- every 5 or 10 minutes, but on the other hand, leaving one hack running
- for days is probably not a great idea, since they tend to leak and/or
- crash. So, restart the thing once an hour. */
- how_long = 1000 * 60 * 60;
-
- if (si->dbox_up_p)
- {
- if (p->verbose_p)
- fprintf (stderr, "%s: dialog box up; delaying hack change.\n",
- blurb());
- how_long = 30000; /* 30 secs */
- }
- else
- {
- int i;
- maybe_reload_init_file (si);
- for (i = 0; i < si->nscreens; i++)
- kill_screenhack (&si->screens[i]);
-
- raise_window (si, True, True, False);
-
- if (!si->throttled_p)
- for (i = 0; i < si->nscreens; i++)
- spawn_screenhack (&si->screens[i]);
- else
- {
- if (p->verbose_p)
- fprintf (stderr, "%s: not launching new hack (throttled.)\n",
- blurb());
- }
- }
-
- if (how_long > 0)
- {
- si->cycle_id = XtAppAddTimeOut (si->app, how_long, cycle_timer,
- (XtPointer) si);
-
- if (p->debug_p)
- fprintf (stderr, "%s: starting cycle_timer (%ld, %ld)\n",
- blurb(), how_long, si->cycle_id);
- }
- else
- {
- if (p->debug_p)
- fprintf (stderr, "%s: not starting cycle_timer: how_long == %ld\n",
- blurb(), (unsigned long) how_long);
- }
-}
-
-
-void
-activate_lock_timer (XtPointer closure, XtIntervalId *id)
-{
- saver_info *si = (saver_info *) closure;
- saver_preferences *p = &si->prefs;
-
- if (p->verbose_p)
- fprintf (stderr, "%s: timed out; activating lock.\n", blurb());
-
- if (!si->locked_p)
- /* So that "xscreensaver-command -watch" reports the time that the
- screen was locked, instead of duplicating the blank time. */
- si->blank_time = time ((time_t *) 0);
-
- set_locked_p (si, True);
-}
-
-
-/* Call this when user activity (or "simulated" activity) has been noticed.
- */
-void
-reset_timers (saver_info *si)
-{
- saver_preferences *p = &si->prefs;
- if (si->using_mit_saver_extension || si->using_sgi_saver_extension)
- return;
-
- if (si->timer_id)
- {
- if (p->debug_p)
- fprintf (stderr, "%s: killing idle_timer (%ld, %ld)\n",
- blurb(), p->timeout, si->timer_id);
- XtRemoveTimeOut (si->timer_id);
- si->timer_id = 0;
- }
-
- schedule_wakeup_event (si, p->timeout, p->debug_p); /* sets si->timer_id */
-
- if (si->cycle_id) abort (); /* no cycle timer when inactive */
-
- si->last_activity_time = time ((time_t *) 0);
-
- /* This will (hopefully, supposedly) tell the server to re-set its
- DPMS timer. Without this, the -deactivate clientmessage would
- prevent xscreensaver from blanking, but would not prevent the
- monitor from powering down. */
-#if 0
- /* #### With some servers, this causes the screen to flicker every
- time a key is pressed! Ok, I surrender. I give up on ever
- having DPMS work properly.
- */
- XForceScreenSaver (si->dpy, ScreenSaverReset);
-
- /* And if the monitor is already powered off, turn it on.
- You'd think the above would do that, but apparently not? */
- monitor_power_on (si, True);
-#endif
-
-}
-
-
-/* Returns true if a mouse has moved since the last time we checked.
- Small motions (of less than "hysteresis" pixels/second) are ignored.
- */
-static Bool
-device_pointer_moved_p (saver_info *si, poll_mouse_data *last_poll_mouse,
- poll_mouse_data *this_poll_mouse, Bool mods_p,
- const char *debug_type, int debug_id)
-{
- saver_preferences *p = &si->prefs;
-
- unsigned int distance, dps;
- unsigned long seconds = 0;
- Bool moved_p = False;
-
- distance = MAX (ABS (last_poll_mouse->root_x - this_poll_mouse->root_x),
- ABS (last_poll_mouse->root_y - this_poll_mouse->root_y));
- seconds = (this_poll_mouse->time - last_poll_mouse->time);
-
-
- /* When the screen is blanked, we get MotionNotify events, but when not
- blanked, we poll only every 5 seconds, and that's not enough resolution
- to do hysteresis based on a 1 second interval. So, assume that any
- motion we've seen during the 5 seconds when our eyes were closed happened
- in the last 1 second instead.
- */
- if (seconds > 1) seconds = 1;
-
- dps = (seconds <= 0 ? distance : (distance / seconds));
-
- /* Motion only counts if the rate is more than N pixels per second.
- */
- if (dps >= p->pointer_hysteresis &&
- distance > 0)
- moved_p = True;
-
- /* If the mouse is not on this screen but used to be, that's motion.
- If the mouse was not on this screen, but is now, that's motion.
- */
- {
- Bool on_screen_p = (this_poll_mouse->root_x != -1 &&
- this_poll_mouse->root_y != -1);
- Bool was_on_screen_p = (last_poll_mouse->root_x != -1 &&
- last_poll_mouse->root_y != -1);
-
- if (on_screen_p != was_on_screen_p)
- moved_p = True;
- }
-
- if (p->debug_p && (distance != 0 || moved_p))
- {
- fprintf (stderr, "%s: %s %d: pointer %s", blurb(), debug_type, debug_id,
- (moved_p ? "moved: " : "ignored:"));
- if (last_poll_mouse->root_x == -1)
- fprintf (stderr, "off screen");
- else
- fprintf (stderr, "%d,%d",
- last_poll_mouse->root_x,
- last_poll_mouse->root_y);
- fprintf (stderr, " -> ");
- if (this_poll_mouse->root_x == -1)
- fprintf (stderr, "off screen");
- else
- fprintf (stderr, "%d,%d", this_poll_mouse->root_x,
- this_poll_mouse->root_y);
- if (last_poll_mouse->root_x != -1 && this_poll_mouse->root_x != -1)
- fprintf (stderr, " (%d,%d; %d/%lu=%d)",
- ABS(last_poll_mouse->root_x - this_poll_mouse->root_x),
- ABS(last_poll_mouse->root_y - this_poll_mouse->root_y),
- distance, seconds, dps);
-
- fprintf (stderr, ".\n");
- }
-
- if (!moved_p &&
- mods_p &&
- this_poll_mouse->mask != last_poll_mouse->mask)
- {
- moved_p = True;
-
- if (p->debug_p)
- fprintf (stderr, "%s: %s %d: modifiers changed: 0x%04x -> 0x%04x.\n",
- blurb(), debug_type, debug_id,
- last_poll_mouse->mask, this_poll_mouse->mask);
- }
-
- last_poll_mouse->child = this_poll_mouse->child;
- last_poll_mouse->mask = this_poll_mouse->mask;
-
- if (moved_p || seconds > 0)
- {
- last_poll_mouse->time = this_poll_mouse->time;
- last_poll_mouse->root_x = this_poll_mouse->root_x;
- last_poll_mouse->root_y = this_poll_mouse->root_y;
- }
-
- return moved_p;
-}
-
-/* Returns true if core mouse pointer has moved since the last time we checked.
- */
-static Bool
-pointer_moved_p (saver_screen_info *ssi, Bool mods_p)
-{
- saver_info *si = ssi->global;
-
- Window root;
- poll_mouse_data this_poll_mouse;
- int x, y;
-
- /* don't check xinerama pseudo-screens. */
- if (!ssi->real_screen_p) return False;
-
- this_poll_mouse.time = time ((time_t *) 0);
-
- if (!XQueryPointer (si->dpy, ssi->screensaver_window, &root,
- &this_poll_mouse.child,
- &this_poll_mouse.root_x, &this_poll_mouse.root_y,
- &x, &y, &this_poll_mouse.mask))
- {
- /* If XQueryPointer() returns false, the mouse is not on this screen.
- */
- this_poll_mouse.root_x = -1;
- this_poll_mouse.root_y = -1;
- this_poll_mouse.child = 0;
- this_poll_mouse.mask = 0;
- }
- else
- si->last_activity_screen = ssi;
-
- return device_pointer_moved_p(si, &(ssi->last_poll_mouse), &this_poll_mouse,
- mods_p, "screen", ssi->number);
-}
-
-
-/* When we aren't using a server extension, this timer is used to periodically
- wake up and poll the mouse position, which is possibly more reliable than
- selecting motion events on every window.
- */
-static void
-check_pointer_timer (XtPointer closure, XtIntervalId *id)
-{
- int i;
- saver_info *si = (saver_info *) closure;
- saver_preferences *p = &si->prefs;
- Bool active_p = False;
-
- if (!si->using_proc_interrupts &&
- (si->using_xidle_extension ||
- si->using_mit_saver_extension ||
- si->using_sgi_saver_extension))
- /* If an extension is in use, we should not be polling the mouse.
- Unless we're also checking /proc/interrupts, in which case, we should.
- */
- abort ();
-
- if (id && *id == si->check_pointer_timer_id) /* this is us - it's expired */
- si->check_pointer_timer_id = 0;
-
- if (si->check_pointer_timer_id) /* only queue one at a time */
- XtRemoveTimeOut (si->check_pointer_timer_id);
-
- si->check_pointer_timer_id = /* now re-queue */
- XtAppAddTimeOut (si->app, p->pointer_timeout, check_pointer_timer,
- (XtPointer) si);
-
- for (i = 0; i < si->nscreens; i++)
- {
- saver_screen_info *ssi = &si->screens[i];
- if (pointer_moved_p (ssi, True))
- active_p = True;
- }
-
-#ifdef HAVE_PROC_INTERRUPTS
- if (!active_p &&
- si->using_proc_interrupts &&
- proc_interrupts_activity_p (si))
- {
- active_p = True;
- }
-#endif /* HAVE_PROC_INTERRUPTS */
-
- if (active_p)
- reset_timers (si);
-
- check_for_clock_skew (si);
-}
-
-
-/* An unfortunate situation is this: the saver is not active, because the
- user has been typing. The machine is a laptop. The user closes the lid
- and suspends it. The CPU halts. Some hours later, the user opens the
- lid. At this point, Xt's timers will fire, and xscreensaver will blank
- the screen.
-
- So far so good -- well, not really, but it's the best that we can do,
- since the OS doesn't send us a signal *before* shutdown -- but if the
- user had delayed locking (lockTimeout > 0) then we should start off
- in the locked state, rather than only locking N minutes from when the
- lid was opened. Also, eschewing fading is probably a good idea, to
- clamp down as soon as possible.
-
- We only do this when we'd be polling the mouse position anyway.
- This amounts to an assumption that machines with APM support also
- have /proc/interrupts.
-
- Now here's a thing that sucks about this: if the user actually changes
- the time of the machine, it will either trigger or delay the triggering
- of a lock. On most systems, that requires root, but I'll bet at least
- some GUI configs let non-root do it. Also, NTP attacks.
-
- On Linux 2.6.39+ systems, there exists clock_gettime(CLOCK_BOOTTIME)
- which would allow us to detect the "laptop CPU had been halted" state
- independently of changes in wall-clock time. But of course that's not
- portable.
-
- When the wall clock changes, what do Xt timers do, anyway? If I have
- a timer set for 30 seconds from now, and adjust the wall clock +15 seconds,
- does the timer fire 30 seconds from now or 15? I actually have no idea.
- It does not appear to be specified.
- */
-static void
-check_for_clock_skew (saver_info *si)
-{
- saver_preferences *p = &si->prefs;
- time_t now = time ((time_t *) 0);
- long shift = now - si->last_wall_clock_time;
-
- if (p->debug_p)
- {
- int i = (si->last_wall_clock_time == 0 ? 0 : shift);
- fprintf (stderr,
- "%s: checking wall clock for hibernation (%d:%02d:%02d).\n",
- blurb(),
- (i / (60 * 60)), ((i / 60) % 60), (i % 60));
- }
-
- if (si->last_wall_clock_time != 0 &&
- shift > (p->timeout / 1000))
- {
- if (p->verbose_p)
- fprintf (stderr, "%s: wall clock has jumped by %ld:%02ld:%02ld%s\n",
- blurb(),
- (shift / (60 * 60)), ((shift / 60) % 60), (shift % 60),
- (p->mode == DONT_BLANK ? " while saver disabled" : ""));
-
- /* If the saver is entirely disabled, there's no need to do the
- emergency-blank-and-lock thing.
- */
- if (p->mode != DONT_BLANK)
- {
- si->emergency_lock_p = True;
- idle_timer ((XtPointer) si, 0);
- }
- }
-
- si->last_wall_clock_time = now;
-}
-
-
-
-static void
-dispatch_event (saver_info *si, XEvent *event)
-{
- /* If this is for the splash dialog, pass it along.
- Note that the password dialog is handled with its own event loop,
- so events for that window will never come through here.
- */
- if (si->splash_dialog && event->xany.window == si->splash_dialog)
- handle_splash_event (si, event);
-
- XtDispatchEvent (event);
-}
-
-
-static void
-swallow_unlock_typeahead_events (saver_info *si, XEvent *e)
-{
- XEvent event;
- char buf [100];
- int i = 0;
-
- memset (buf, 0, sizeof(buf));
-
- event = *e;
-
- do
- {
- if (event.xany.type == KeyPress)
- {
- char s[2];
- int size = XLookupString ((XKeyEvent *) &event, s, 1, 0, 0);
- if (size != 1) continue;
- switch (*s)
- {
- case '\010': case '\177': /* Backspace */
- if (i > 0) i--;
- break;
- case '\025': case '\030': /* Erase line */
- case '\012': case '\015': /* Enter */
- case '\033': /* ESC */
- i = 0;
- break;
- case '\040': /* Space */
- if (i == 0)
- break; /* ignore space at beginning of line */
- /* else, fall through */
- default:
- buf [i++] = *s;
- break;
- }
- }
-
- } while (i < sizeof(buf)-1 &&
- XCheckMaskEvent (si->dpy, KeyPressMask, &event));
-
- buf[i] = 0;
-
- if (si->unlock_typeahead)
- {
- memset (si->unlock_typeahead, 0, strlen(si->unlock_typeahead));
- free (si->unlock_typeahead);
- }
-
- if (i > 0)
- si->unlock_typeahead = strdup (buf);
- else
- si->unlock_typeahead = 0;
-
- memset (buf, 0, sizeof(buf));
-}
-
-void
-flush_events (saver_info *si)
-{
- int i;
- XEvent xe;
- for (i = 0; i < 10; ++i) {
- while (XtAppPending (si->app) & XtIMXEvent) {
- XtAppNextEvent (si->app, &xe);
- dispatch_event (si, &xe);
- }
- usleep(5000);
- }
-}
-
-/* methods of detecting idleness:
-
- explicitly informed by SGI SCREEN_SAVER server event;
- explicitly informed by MIT-SCREEN-SAVER server event;
- poll server idle time with XIDLE extension;
- select events on all windows, and note absence of recent events;
- note that /proc/interrupts has not changed in a while;
- activated by clientmessage.
-
- methods of detecting non-idleness:
-
- read events on the xscreensaver window;
- explicitly informed by SGI SCREEN_SAVER server event;
- explicitly informed by MIT-SCREEN-SAVER server event;
- select events on all windows, and note events on any of them;
- note that a client updated their window's _NET_WM_USER_TIME property;
- note that /proc/interrupts has changed;
- deactivated by clientmessage.
-
- I trust that explains why this function is a big hairy mess.
- */
-void
-sleep_until_idle (saver_info *si, Bool until_idle_p)
-{
- saver_preferences *p = &si->prefs;
-
- /* We have to go through this union bullshit because gcc-4.4.0 has
- stricter struct-aliasing rules. Without this, the optimizer
- can fuck things up.
- */
- union {
- XEvent x_event;
-# ifdef HAVE_RANDR
- XRRScreenChangeNotifyEvent xrr_event;
-# endif /* HAVE_RANDR */
-# ifdef HAVE_MIT_SAVER_EXTENSION
- XScreenSaverNotifyEvent sevent;
-# endif /* HAVE_MIT_SAVER_EXTENSION */
- } event;
-
- /* We need to select events on all windows if we're not using any extensions.
- Otherwise, we don't need to. */
- Bool scanning_all_windows = !(si->using_xidle_extension ||
- si->using_mit_saver_extension ||
- si->using_sgi_saver_extension);
-
- /* We need to periodically wake up and check for idleness if we're not using
- any extensions, or if we're using the XIDLE extension. The other two
- extensions explicitly deliver events when we go idle/non-idle, so we
- don't need to poll. */
- Bool polling_for_idleness = !(si->using_mit_saver_extension ||
- si->using_sgi_saver_extension);
-
- /* Whether we need to periodically wake up and check to see if the mouse has
- moved. We only need to do this when not using any extensions. The reason
- this isn't the same as `polling_for_idleness' is that the "idleness" poll
- can happen (for example) 5 minutes from now, whereas the mouse-position
- poll should happen with low periodicity. We don't need to poll the mouse
- position with the XIDLE extension, but we do need to periodically wake up
- and query the server with that extension. For our purposes, polling
- /proc/interrupts is just like polling the mouse position. It has to
- happen on the same kind of schedule. */
- Bool polling_mouse_position = (si->using_proc_interrupts ||
- !(si->using_xidle_extension ||
- si->using_mit_saver_extension ||
- si->using_sgi_saver_extension) ||
- si->using_xinput_extension);
-
- const char *why = 0; /* What caused the idle-state to change? */
-
- if (until_idle_p)
- {
- if (polling_for_idleness)
- /* This causes a no-op event to be delivered to us in a while, so that
- we come back around through the event loop again. */
- schedule_wakeup_event (si, p->timeout, p->debug_p);
-
- if (polling_mouse_position)
- /* Check to see if the mouse has moved, and set up a repeating timer
- to do so periodically (typically, every 5 seconds.) */
- check_pointer_timer ((XtPointer) si, 0);
- }
-
- while (1)
- {
- XtAppNextEvent (si->app, &event.x_event);
-
- switch (event.x_event.xany.type) {
- case 0: /* our synthetic "timeout" event has been signalled */
- if (until_idle_p)
- {
- Time idle;
-
- /* We may be idle; check one last time to see if the mouse has
- moved, just in case the idle-timer went off within the 5 second
- window between mouse polling. If the mouse has moved, then
- check_pointer_timer() will reset last_activity_time.
- */
- if (polling_mouse_position)
- check_pointer_timer ((XtPointer) si, 0);
-
-#ifdef HAVE_XIDLE_EXTENSION
- if (si->using_xidle_extension)
- {
- /* The XIDLE extension uses the synthetic event to prod us into
- re-asking the server how long the user has been idle. */
- if (! XGetIdleTime (si->dpy, &idle))
- {
- fprintf (stderr, "%s: XGetIdleTime() failed.\n", blurb());
- saver_exit (si, 1, 0);
- }
- }
- else
-#endif /* HAVE_XIDLE_EXTENSION */
-#ifdef HAVE_MIT_SAVER_EXTENSION
- if (si->using_mit_saver_extension)
- {
- /* We don't need to do anything in this case - the synthetic
- event isn't necessary, as we get sent specific events
- to wake us up. In fact, this event generally shouldn't
- be being delivered when the MIT extension is in use. */
- idle = 0;
- }
- else
-#endif /* HAVE_MIT_SAVER_EXTENSION */
-#ifdef HAVE_SGI_SAVER_EXTENSION
- if (si->using_sgi_saver_extension)
- {
- /* We don't need to do anything in this case - the synthetic
- event isn't necessary, as we get sent specific events
- to wake us up. In fact, this event generally shouldn't
- be being delivered when the SGI extension is in use. */
- idle = 0;
- }
- else
-#endif /* HAVE_SGI_SAVER_EXTENSION */
- {
- /* Otherwise, no server extension is in use. The synthetic
- event was to tell us to wake up and see if the user is now
- idle. Compute the amount of idle time by comparing the
- `last_activity_time' to the wall clock. The l_a_t was set
- by calling `reset_timers()', which is called only in only
- two situations: when polling the mouse position has revealed
- the the mouse has moved (user activity) or when we have read
- an event (again, user activity.)
- */
- idle = 1000 * (si->last_activity_time - time ((time_t *) 0));
- }
-
- if (idle >= p->timeout)
- {
- /* Look, we've been idle long enough. We're done. */
- why = "timeout";
- goto DONE;
- }
- else if (si->emergency_lock_p)
- {
- /* Oops, the wall clock has jumped far into the future, so
- we need to lock down in a hurry! */
- why = "large wall clock change";
- goto DONE;
- }
- else
- {
- /* The event went off, but it turns out that the user has not
- yet been idle for long enough. So re-signal the event.
- Be economical: if we should blank after 5 minutes, and the
- user has been idle for 2 minutes, then set this timer to
- go off in 3 minutes.
- */
- if (polling_for_idleness)
- schedule_wakeup_event (si, p->timeout - idle, p->debug_p);
- }
- }
- break;
-
- case ClientMessage:
- if (handle_clientmessage (si, &event.x_event, until_idle_p))
- {
- why = "ClientMessage";
- goto DONE;
- }
- break;
-
- case CreateNotify:
- /* A window has been created on the screen somewhere. If we're
- supposed to scan all windows for events, prepare this window. */
- if (scanning_all_windows)
- {
- Window w = event.x_event.xcreatewindow.window;
- start_notice_events_timer (si, w, p->debug_p);
- }
- break;
-
- case KeyPress:
- case ButtonPress:
- /* Ignore release events so that hitting ESC at the password dialog
- doesn't result in the password dialog coming right back again when
- the fucking release key is seen! */
- /* case KeyRelease:*/
- /* case ButtonRelease:*/
- case MotionNotify:
-
- if (p->debug_p)
- {
- Window root=0, window=0;
- int x=-1, y=-1;
- const char *type = 0;
- if (event.x_event.xany.type == MotionNotify)
- {
- /*type = "MotionNotify";*/
- root = event.x_event.xmotion.root;
- window = event.x_event.xmotion.window;
- x = event.x_event.xmotion.x_root;
- y = event.x_event.xmotion.y_root;
- }
- else if (event.x_event.xany.type == KeyPress)
- {
- type = "KeyPress";
- root = event.x_event.xkey.root;
- window = event.x_event.xkey.window;
- x = y = -1;
- }
- else if (event.x_event.xany.type == ButtonPress)
- {
- type = "ButtonPress";
- root = event.x_event.xkey.root;
- window = event.x_event.xkey.window;
- x = event.x_event.xmotion.x_root;
- y = event.x_event.xmotion.y_root;
- }
-
- if (type)
- {
- int i;
- for (i = 0; i < si->nscreens; i++)
- if (root == RootWindowOfScreen (si->screens[i].screen))
- break;
- fprintf (stderr,"%s: %d: %s on 0x%lx",
- blurb(), i, type, (unsigned long) window);
-
- /* Be careful never to do this unless in -debug mode, as
- this could expose characters from the unlock password. */
- if (p->debug_p && event.x_event.xany.type == KeyPress)
- {
- KeySym keysym;
- char c = 0;
- XLookupString (&event.x_event.xkey, &c, 1, &keysym, 0);
- fprintf (stderr, " (%s%s)",
- (event.x_event.xkey.send_event ? "synthetic " : ""),
- XKeysymToString (keysym));
- }
-
- if (x == -1)
- fprintf (stderr, "\n");
- else
- fprintf (stderr, " at %d,%d.\n", x, y);
- }
- }
-
- /* If any widgets want to handle this event, let them. */
- dispatch_event (si, &event.x_event);
-
-
- /* If we got a MotionNotify event, figure out what screen it
- was on and poll the mouse there: if the mouse hasn't moved
- far enough to count as "real" motion, then ignore this
- event.
- */
- if (event.x_event.xany.type == MotionNotify)
- {
- int i;
- for (i = 0; i < si->nscreens; i++)
- if (event.x_event.xmotion.root ==
- RootWindowOfScreen (si->screens[i].screen))
- break;
- if (i < si->nscreens)
- {
- if (!pointer_moved_p (&si->screens[i], False))
- continue;
- }
- }
-
-
- /* We got a user event.
- If we're waiting for the user to become active, this is it.
- If we're waiting until the user becomes idle, reset the timers
- (since now we have longer to wait.)
- */
- if (!until_idle_p)
- {
- if (si->demoing_p &&
- (event.x_event.xany.type == MotionNotify ||
- event.x_event.xany.type == KeyRelease))
- /* When we're demoing a single hack, mouse motion doesn't
- cause deactivation. Only clicks and keypresses do. */
- ;
- else
- {
- /* If we're not demoing, then any activity causes deactivation.
- */
- why = (event.x_event.xany.type == MotionNotify ?"mouse motion":
- event.x_event.xany.type == KeyPress?"keyboard activity":
- event.x_event.xany.type == ButtonPress ? "mouse click" :
- "unknown user activity");
- goto DONE;
- }
- }
- else
- reset_timers (si);
-
- break;
-
- case PropertyNotify:
-
- /* Starting in late 2014, GNOME programs don't actually select for
- or receive KeyPress events: they do it behind the scenes through
- some kind of Input Method magic, even when running in an en_US
- locale. However, those applications *do* update the WM_USER_TIME
- property on their own windows every time they recieve a secret
- KeyPress, so we must *also* monitor that property on every
- window, and treat changes to it as identical to KeyPress.
-
- _NET_WM_USER_TIME is documented (such as it is) here:
-
- http://standards.freedesktop.org/wm-spec/latest/ar01s05.html
- #idm139870829932528
-
- Specifically:
-
- "Contains the XServer time at which last user activity in this
- window took place. [...] A client [...] might, for example,
- use the timestamp of the last KeyPress or ButtonPress event."
-
- As of early 2016, KDE4 does something really stupid, though: some
- hidden power management thing reduces the display brightness 150
- seconds after the screen is blanked -- and sets a WM_USER_TIME
- property on a hidden "kded4" window whose time is in the distant
- past (the time at which the X server launched).
-
- So we ignore any WM_USER_TIME whose timestamp is more than a
- couple seconds old.
- */
- if (event.x_event.xproperty.state == PropertyNewValue &&
- event.x_event.xproperty.atom == XA_NET_WM_USER_TIME)
- {
- int threshold = 2; /* seconds */
- Bool bogus_p = True;
- Window w = event.x_event.xproperty.window;
-
- Atom type;
- int format;
- unsigned long nitems, bytesafter;
- unsigned char *data = 0;
- Cardinal user_time = 0;
- XErrorHandler old_handler = XSetErrorHandler (BadWindow_ehandler);
-
- if (XGetWindowProperty (si->dpy, w,
- XA_NET_WM_USER_TIME, 0L, 1L, False,
- XA_CARDINAL, &type, &format, &nitems,
- &bytesafter, &data)
- == Success &&
- data &&
- type == XA_CARDINAL &&
- format == 32 &&
- nitems == 1)
- {
- long diff;
- user_time = ((Cardinal *) data)[0];
- diff = event.x_event.xproperty.time - user_time;
- if (diff >= 0 && diff < threshold)
- bogus_p = False;
- }
-
- if (data) XFree (data);
-
- why = "WM_USER_TIME";
-
- if (p->debug_p)
- {
- XWindowAttributes xgwa;
- int i;
-
- XGetWindowAttributes (si->dpy, w, &xgwa);
- for (i = 0; i < si->nscreens; i++)
- if (xgwa.root == RootWindowOfScreen (si->screens[i].screen))
- break;
- fprintf (stderr,"%s: %d: %s = %ld%s on 0x%lx\n",
- blurb(), i, why, (unsigned long) user_time,
- (bogus_p ? " (bad)" : ""),
- (unsigned long) w);
- }
-
- XSync (si->dpy, False);
- XSetErrorHandler (old_handler);
-
- if (bogus_p)
- break;
- else if (until_idle_p)
- reset_timers (si);
- else
- goto DONE;
- }
- break;
-
- default:
-
-#ifdef HAVE_MIT_SAVER_EXTENSION
- if (event.x_event.type == si->mit_saver_ext_event_number)
- {
- /* This event's number is that of the MIT-SCREEN-SAVER server
- extension. This extension has one event number, and the event
- itself contains sub-codes that say what kind of event it was
- (an "idle" or "not-idle" event.)
- */
- if (event.sevent.state == ScreenSaverOn)
- {
- int i = 0;
- if (p->verbose_p)
- fprintf (stderr, "%s: MIT ScreenSaverOn event received.\n",
- blurb());
-
- /* Get the "real" server window(s) out of the way as soon
- as possible. */
- for (i = 0; i < si->nscreens; i++)
- {
- saver_screen_info *ssi = &si->screens[i];
- if (ssi->server_mit_saver_window &&
- window_exists_p (si->dpy,
- ssi->server_mit_saver_window))
- XUnmapWindow (si->dpy, ssi->server_mit_saver_window);
- }
-
- if (event.sevent.kind != ScreenSaverExternal)
- {
- fprintf (stderr,
- "%s: ScreenSaverOn event wasn't of type External!\n",
- blurb());
- }
-
- if (until_idle_p)
- {
- why = "MIT ScreenSaverOn";
- goto DONE;
- }
- }
- else if (event.sevent.state == ScreenSaverOff)
- {
- if (p->verbose_p)
- fprintf (stderr, "%s: MIT ScreenSaverOff event received.\n",
- blurb());
- if (!until_idle_p)
- {
- why = "MIT ScreenSaverOff";
- goto DONE;
- }
- }
- else
- fprintf (stderr,
- "%s: unknown MIT-SCREEN-SAVER event %d received!\n",
- blurb(), event.sevent.state);
- }
- else
-
-#endif /* HAVE_MIT_SAVER_EXTENSION */
-
-
-#ifdef HAVE_SGI_SAVER_EXTENSION
- if (event.x_event.type == (si->sgi_saver_ext_event_number + ScreenSaverStart))
- {
- /* The SGI SCREEN_SAVER server extension has two event numbers,
- and this event matches the "idle" event. */
- if (p->verbose_p)
- fprintf (stderr, "%s: SGI ScreenSaverStart event received.\n",
- blurb());
-
- if (until_idle_p)
- {
- why = "SGI ScreenSaverStart";
- goto DONE;
- }
- }
- else if (event.x_event.type == (si->sgi_saver_ext_event_number +
- ScreenSaverEnd))
- {
- /* The SGI SCREEN_SAVER server extension has two event numbers,
- and this event matches the "idle" event. */
- if (p->verbose_p)
- fprintf (stderr, "%s: SGI ScreenSaverEnd event received.\n",
- blurb());
- if (!until_idle_p)
- {
- why = "SGI ScreenSaverEnd";
- goto DONE;
- }
- }
- else
-#endif /* HAVE_SGI_SAVER_EXTENSION */
-
-#ifdef HAVE_XINPUT
- /* If we got a MotionNotify event, check to see if the mouse has
- moved far enough to count as "real" motion, if not, then ignore
- this event.
- */
- if ((si->num_xinput_devices > 0) &&
- (event.x_event.type == si->xinput_DeviceMotionNotify))
- {
- XDeviceMotionEvent *dme = (XDeviceMotionEvent *) &event;
- poll_mouse_data *last_poll_mouse = NULL;
- int d;
-
- for (d = 0; d < si->num_xinput_devices; d++)
- {
- if (si->xinput_devices[d].device->device_id == dme->deviceid)
- {
- last_poll_mouse = &(si->xinput_devices[d].last_poll_mouse);
- break;
- }
- }
-
- if (last_poll_mouse)
- {
- poll_mouse_data this_poll_mouse;
- this_poll_mouse.root_x = dme->x_root;
- this_poll_mouse.root_y = dme->y_root;
- this_poll_mouse.child = dme->subwindow;
- this_poll_mouse.mask = dme->device_state;
- this_poll_mouse.time = dme->time / 1000; /* milliseconds */
-
- if (!device_pointer_moved_p (si, last_poll_mouse,
- &this_poll_mouse, False,
- "device", dme->deviceid))
- continue;
- }
- else if (p->debug_p)
- fprintf (stderr,
- "%s: received MotionNotify from unknown device %d\n",
- blurb(), (int) dme->deviceid);
- }
-
- if ((!until_idle_p) &&
- (si->num_xinput_devices > 0) &&
- (event.x_event.type == si->xinput_DeviceMotionNotify ||
- event.x_event.type == si->xinput_DeviceButtonPress))
- /* Ignore DeviceButtonRelease, see ButtonRelease comment above. */
- {
-
- dispatch_event (si, &event.x_event);
- if (si->demoing_p &&
- event.x_event.type == si->xinput_DeviceMotionNotify)
- /* When we're demoing a single hack, mouse motion doesn't
- cause deactivation. Only clicks and keypresses do. */
- ;
- else
- /* If we're not demoing, then any activity causes deactivation.
- */
- {
- why = (event.x_event.type == si->xinput_DeviceMotionNotify
- ? "XI mouse motion" :
- event.x_event.type == si->xinput_DeviceButtonPress
- ? "XI mouse click" : "unknown XINPUT event");
- goto DONE;
- }
- }
- else
-#endif /* HAVE_XINPUT */
-
-#ifdef HAVE_RANDR
- if (si->using_randr_extension &&
- (event.x_event.type ==
- (si->randr_event_number + RRScreenChangeNotify)))
- {
- /* The Resize and Rotate extension sends an event when the
- size, rotation, or refresh rate of any screen has changed.
- */
- if (p->verbose_p)
- {
- /* XRRRootToScreen is in Xrandr.h 1.4, 2001/06/07 */
- int screen = XRRRootToScreen (si->dpy, event.xrr_event.window);
- fprintf (stderr, "%s: %d: screen change event received\n",
- blurb(), screen);
- }
-
-# ifdef RRScreenChangeNotifyMask
- /* Inform Xlib that it's ok to update its data structures. */
- XRRUpdateConfiguration (&event.x_event); /* Xrandr.h 1.9, 2002/09/29 */
-# endif /* RRScreenChangeNotifyMask */
-
- /* Resize the existing xscreensaver windows and cached ssi data. */
- if (update_screen_layout (si))
- {
- if (p->verbose_p)
- {
- fprintf (stderr, "%s: new layout:\n", blurb());
- describe_monitor_layout (si);
- }
- resize_screensaver_window (si);
- }
- }
- else
-#endif /* HAVE_RANDR */
-
- /* Just some random event. Let the Widgets handle it, if desired. */
- dispatch_event (si, &event.x_event);
- }
- }
- DONE:
-
- if (p->verbose_p)
- {
- if (! why) why = "unknown reason";
- fprintf (stderr, "%s: %s (%s)\n", blurb(),
- (until_idle_p ? "user is idle" : "user is active"),
- why);
- }
-
- /* If there's a user event on the queue, swallow it.
- If we're using a server extension, and the user becomes active, we
- get the extension event before the user event -- so the keypress or
- motion or whatever is still on the queue. This makes "unfade" not
- work, because it sees that event, and bugs out. (This problem
- doesn't exhibit itself without an extension, because in that case,
- there's only one event generated by user activity, not two.)
- */
- if (!until_idle_p && si->locked_p)
- swallow_unlock_typeahead_events (si, &event.x_event);
- else
- while (XCheckMaskEvent (si->dpy,
- (KeyPressMask|ButtonPressMask|PointerMotionMask),
- &event.x_event))
- ;
-
-
- if (si->check_pointer_timer_id)
- {
- XtRemoveTimeOut (si->check_pointer_timer_id);
- si->check_pointer_timer_id = 0;
- }
- if (si->timer_id)
- {
- XtRemoveTimeOut (si->timer_id);
- si->timer_id = 0;
- }
-
- if (until_idle_p && si->cycle_id) /* no cycle timer when inactive */
- abort ();
-}
-
-
-
-/* Some crap for dealing with /proc/interrupts.
-
- On Linux systems, it's possible to see the hardware interrupt count
- associated with the keyboard. We can therefore use that as another method
- of detecting idleness.
-
- Why is it a good idea to do this? Because it lets us detect keyboard
- activity that is not associated with X events. For example, if the user
- has switched to another virtual console, it's good for xscreensaver to not
- be running graphics hacks on the (non-visible) X display. The common
- complaint that checking /proc/interrupts addresses is that the user is
- playing Quake on a non-X console, and the GL hacks are perceptibly slowing
- the game...
-
- This is tricky for a number of reasons.
-
- * First, we must be sure to only do this when running on an X server that
- is on the local machine (because otherwise, we'd be reacting to the
- wrong keyboard.) The way we do this is by noting that the $DISPLAY is
- pointing to display 0 on the local machine. It *could* be that display
- 1 is also on the local machine (e.g., two X servers, each on a different
- virtual-terminal) but it's also possible that screen 1 is an X terminal,
- using this machine as the host. So we can't take that chance.
-
- * Second, one can only access these interrupt numbers in a completely
- and utterly brain-damaged way. You would think that one would use an
- ioctl for this. But no. The ONLY way to get this information is to
- open the pseudo-file /proc/interrupts AS A FILE, and read the numbers
- out of it TEXTUALLY. Because this is Unix, and all the world's a file,
- and the only real data type is the short-line sequence of ASCII bytes.
-
- Now it's all well and good that the /proc/interrupts pseudo-file
- exists; that's a clever idea, and a useful API for things that are
- already textually oriented, like shell scripts, and users doing
- interactive debugging sessions. But to make a *C PROGRAM* open a file
- and parse the textual representation of integers out of it is just
- insane.
-
- * Third, you can't just hold the file open, and fseek() back to the
- beginning to get updated data! If you do that, the data never changes.
- And I don't want to call open() every five seconds, because I don't want
- to risk going to disk for any inodes. It turns out that if you dup()
- it early, then each copy gets fresh data, so we can get around that in
- this way (but for how many releases, one might wonder?)
-
- * Fourth, the format of the output of the /proc/interrupts file is
- undocumented, and has changed several times already! In Linux 2.0.33,
- even on a multiprocessor machine, it looks like this:
-
- 0: 309453991 timer
- 1: 4771729 keyboard
-
- but in Linux 2.2 and 2.4 kernels with MP machines, it looks like this:
-
- CPU0 CPU1
- 0: 1671450 1672618 IO-APIC-edge timer
- 1: 13037 13495 IO-APIC-edge keyboard
-
- and in Linux 2.6, it's gotten even goofier: now there are two lines
- labelled "i8042". One of them is the keyboard, and one of them is
- the PS/2 mouse -- and of course, you can't tell them apart, except
- by wiggling the mouse and noting which one changes:
-
- CPU0 CPU1
- 1: 32051 30864 IO-APIC-edge i8042
- 12: 476577 479913 IO-APIC-edge i8042
-
- Joy! So how are we expected to parse that? Well, this code doesn't
- parse it: it saves the first line with the string "keyboard" (or
- "i8042") in it, and does a string-comparison to note when it has
- changed. If there are two "i8042" lines, we assume the first is
- the keyboard and the second is the mouse (doesn't matter which is
- which, really, as long as we don't compare them against each other.)
-
- Thanks to Nat Friedman <nat@nat.org> for figuring out most of this crap.
-
- Note that if you have a serial or USB mouse, or a USB keyboard, it won't
- detect it. That's because there's no way to tell the difference between a
- serial mouse and a general serial port, and all USB devices look the same
- from here. It would be somewhat unfortunate to have the screensaver turn
- off when the modem on COM1 burped, or when a USB disk was accessed.
- */
-
-
-#ifdef HAVE_PROC_INTERRUPTS
-
-#define PROC_INTERRUPTS "/proc/interrupts"
-
-Bool
-query_proc_interrupts_available (saver_info *si, const char **why)
-{
- /* We can use /proc/interrupts if $DISPLAY points to :0, and if the
- "/proc/interrupts" file exists and is readable.
- */
- FILE *f;
- if (why) *why = 0;
-
- if (!display_is_on_console_p (si))
- {
- if (why) *why = "not on primary console";
- return False;
- }
-
- f = fopen (PROC_INTERRUPTS, "r");
- if (!f)
- {
- if (why) *why = "does not exist";
- return False;
- }
-
- fclose (f);
- return True;
-}
-
-
-static Bool
-proc_interrupts_activity_p (saver_info *si)
-{
- static FILE *f0 = 0;
- FILE *f1 = 0;
- int fd;
- static char last_kbd_line[255] = { 0, };
- static char last_ptr_line[255] = { 0, };
- char new_line[sizeof(last_kbd_line)];
- Bool checked_kbd = False, kbd_changed = False;
- Bool checked_ptr = False, ptr_changed = False;
- int i8042_count = 0;
-
- if (!f0)
- {
- /* First time -- open the file. */
- f0 = fopen (PROC_INTERRUPTS, "r");
- if (!f0)
- {
- char buf[255];
- sprintf(buf, "%s: error opening %s", blurb(), PROC_INTERRUPTS);
- perror (buf);
- goto FAIL;
- }
-
-# if defined(HAVE_FCNTL) && defined(FD_CLOEXEC)
- /* Close this fd upon exec instead of inheriting / leaking it. */
- if (fcntl (fileno (f0), F_SETFD, FD_CLOEXEC) != 0)
- perror ("fcntl: CLOEXEC:");
-# endif
- }
-
- if (f0 == (FILE *) -1) /* means we got an error initializing. */
- return False;
-
- fd = dup (fileno (f0));
- if (fd < 0)
- {
- char buf[255];
- sprintf(buf, "%s: could not dup() the %s fd", blurb(), PROC_INTERRUPTS);
- perror (buf);
- goto FAIL;
- }
-
- f1 = fdopen (fd, "r");
- if (!f1)
- {
- char buf[255];
- sprintf(buf, "%s: could not fdopen() the %s fd", blurb(),
- PROC_INTERRUPTS);
- perror (buf);
- goto FAIL;
- }
-
- /* Actually, I'm unclear on why this fseek() is necessary, given the timing
- of the dup() above, but it is. */
- if (fseek (f1, 0, SEEK_SET) != 0)
- {
- char buf[255];
- sprintf(buf, "%s: error rewinding %s", blurb(), PROC_INTERRUPTS);
- perror (buf);
- goto FAIL;
- }
-
- /* Now read through the pseudo-file until we find the "keyboard",
- "PS/2 mouse", or "i8042" lines. */
-
- while (fgets (new_line, sizeof(new_line)-1, f1))
- {
- Bool i8042_p = !!strstr (new_line, "i8042");
- if (i8042_p) i8042_count++;
-
- if (strchr (new_line, ','))
- {
- /* Ignore any line that has a comma on it: this is because
- a setup like this:
-
- 12: 930935 XT-PIC usb-uhci, PS/2 Mouse
-
- is really bad news. It *looks* like we can note mouse
- activity from that line, but really, that interrupt gets
- fired any time any USB device has activity! So we have
- to ignore any shared IRQs.
- */
- }
- else if (!checked_kbd &&
- (strstr (new_line, "keyboard") ||
- (i8042_p && i8042_count == 1)))
- {
- /* Assume the keyboard interrupt is the line that says "keyboard",
- or the *first* line that says "i8042".
- */
- kbd_changed = (*last_kbd_line && !!strcmp (new_line, last_kbd_line));
- strcpy (last_kbd_line, new_line);
- checked_kbd = True;
- }
- else if (!checked_ptr &&
- (strstr (new_line, "PS/2 Mouse") ||
- (i8042_p && i8042_count == 2)))
- {
- /* Assume the mouse interrupt is the line that says "PS/2 mouse",
- or the *second* line that says "i8042".
- */
- ptr_changed = (*last_ptr_line && !!strcmp (new_line, last_ptr_line));
- strcpy (last_ptr_line, new_line);
- checked_ptr = True;
- }
-
- if (checked_kbd && checked_ptr)
- break;
- }
-
- if (checked_kbd || checked_ptr)
- {
- fclose (f1);
-
- if (si->prefs.debug_p && (kbd_changed || ptr_changed))
- fprintf (stderr, "%s: /proc/interrupts activity: %s\n",
- blurb(),
- ((kbd_changed && ptr_changed) ? "mouse and kbd" :
- kbd_changed ? "kbd" :
- ptr_changed ? "mouse" : "ERR"));
-
- return (kbd_changed || ptr_changed);
- }
-
-
- /* If we got here, we didn't find either a "keyboard" or a "PS/2 Mouse"
- line in the file at all. */
- fprintf (stderr, "%s: no keyboard or mouse data in %s?\n",
- blurb(), PROC_INTERRUPTS);
-
- FAIL:
- if (f1)
- fclose (f1);
-
- if (f0 && f0 != (FILE *) -1)
- fclose (f0);
-
- f0 = (FILE *) -1;
- return False;
-}
-
-#endif /* HAVE_PROC_INTERRUPTS */
-
-
-/* This timer goes off every few minutes, whether the user is idle or not,
- to try and clean up anything that has gone wrong.
-
- It calls disable_builtin_screensaver() so that if xset has been used,
- or some other program (like xlock) has messed with the XSetScreenSaver()
- settings, they will be set back to sensible values (if a server extension
- is in use, messing with xlock can cause xscreensaver to never get a wakeup
- event, and could cause monitor power-saving to occur, and all manner of
- heinousness.)
-
- If the screen is currently blanked, it raises the window, in case some
- other window has been mapped on top of it.
-
- If the screen is currently blanked, and there is no hack running, it
- clears the window, in case there is an error message printed on it (we
- don't want the error message to burn in.)
- */
-
-static void
-watchdog_timer (XtPointer closure, XtIntervalId *id)
-{
- saver_info *si = (saver_info *) closure;
- saver_preferences *p = &si->prefs;
-
- disable_builtin_screensaver (si, False);
-
- /* If the DPMS settings on the server have changed, change them back to
- what ~/.xscreensaver says they should be. */
- sync_server_dpms_settings (si->dpy,
- (p->dpms_enabled_p &&
- p->mode != DONT_BLANK),
- p->dpms_quickoff_p,
- p->dpms_standby / 1000,
- p->dpms_suspend / 1000,
- p->dpms_off / 1000,
- False);
-
- if (si->screen_blanked_p)
- {
- Bool running_p = screenhack_running_p (si);
-
- if (si->dbox_up_p)
- {
- if (si->prefs.debug_p)
- fprintf (stderr, "%s: dialog box is up: not raising screen.\n",
- blurb());
- }
- else
- {
- if (si->prefs.debug_p)
- fprintf (stderr, "%s: watchdog timer raising %sscreen.\n",
- blurb(), (running_p ? "" : "and clearing "));
-
- raise_window (si, True, True, running_p);
- }
-
- if (!p->dpms_full_throttle_p && screenhack_running_p (si) &&
- !monitor_powered_on_p (si))
- {
- int i;
- if (si->prefs.verbose_p)
- fprintf (stderr,
- "%s: X says monitor has powered down; "
- "killing running hacks.\n", blurb());
- for (i = 0; i < si->nscreens; i++)
- kill_screenhack (&si->screens[i]);
- }
-
- /* Re-schedule this timer. The watchdog timer defaults to a bit less
- than the hack cycle period, but is never longer than one hour.
- */
- si->watchdog_id = 0;
- reset_watchdog_timer (si, True);
- }
-}
-
-
-void
-reset_watchdog_timer (saver_info *si, Bool on_p)
-{
- saver_preferences *p = &si->prefs;
-
- if (si->watchdog_id)
- {
- XtRemoveTimeOut (si->watchdog_id);
- si->watchdog_id = 0;
- }
-
- if (on_p && p->watchdog_timeout)
- {
- si->watchdog_id = XtAppAddTimeOut (si->app, p->watchdog_timeout,
- watchdog_timer, (XtPointer) si);
-
- if (p->debug_p)
- fprintf (stderr, "%s: restarting watchdog_timer (%ld, %ld)\n",
- blurb(), p->watchdog_timeout, si->watchdog_id);
- }
-}
-
-
-/* It's possible that a race condition could have led to the saver
- window being unexpectedly still mapped. This can happen like so:
-
- - screen is blanked
- - hack is launched
- - that hack tries to grab a screen image (it does this by
- first unmapping the saver window, then remapping it.)
- - hack unmaps window
- - hack waits
- - user becomes active
- - hack re-maps window (*)
- - driver kills subprocess
- - driver unmaps window (**)
-
- The race is that (*) might have been sent to the server before
- the client process was killed, but, due to scheduling randomness,
- might not have been received by the server until after (**).
- In other words, (*) and (**) might happen out of order, meaning
- the driver will unmap the window, and then after that, the
- recently-dead client will re-map it. This leaves the user
- locked out (it looks like a desktop, but it's not!)
-
- To avoid this: after un-blanking the screen, we launch a timer
- that wakes up once a second for ten seconds, and makes damned
- sure that the window is still unmapped.
- */
-
-void
-de_race_timer (XtPointer closure, XtIntervalId *id)
-{
- saver_info *si = (saver_info *) closure;
- saver_preferences *p = &si->prefs;
- int secs = 1;
-
- if (id == 0) /* if id is 0, this is the initialization call. */
- {
- si->de_race_ticks = 10;
- if (p->verbose_p)
- fprintf (stderr, "%s: starting de-race timer (%d seconds.)\n",
- blurb(), si->de_race_ticks);
- }
- else
- {
- int i;
- XSync (si->dpy, False);
- for (i = 0; i < si->nscreens; i++)
- {
- saver_screen_info *ssi = &si->screens[i];
- Window w = ssi->screensaver_window;
- XWindowAttributes xgwa;
- XGetWindowAttributes (si->dpy, w, &xgwa);
- if (xgwa.map_state != IsUnmapped)
- {
- if (p->verbose_p)
- fprintf (stderr,
- "%s: %d: client race! emergency unmap 0x%lx.\n",
- blurb(), i, (unsigned long) w);
- XUnmapWindow (si->dpy, w);
- }
- else if (p->debug_p)
- fprintf (stderr, "%s: %d: (de-race of 0x%lx is cool.)\n",
- blurb(), i, (unsigned long) w);
- }
- XSync (si->dpy, False);
-
- si->de_race_ticks--;
- }
-
- if (id && *id == si->de_race_id)
- si->de_race_id = 0;
-
- if (si->de_race_id) abort();
-
- if (si->de_race_ticks <= 0)
- {
- si->de_race_id = 0;
- if (p->verbose_p)
- fprintf (stderr, "%s: de-race completed.\n", blurb());
- }
- else
- {
- si->de_race_id = XtAppAddTimeOut (si->app, secs * 1000,
- de_race_timer, closure);
- }
-}
diff --git a/driver/types.h b/driver/types.h
index 705750b..2042aad 100644
--- a/driver/types.h
+++ b/driver/types.h
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1993-2020 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 1993-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -14,15 +14,6 @@
typedef struct saver_info saver_info;
-typedef enum {
- ul_read, /* reading input or ready to do so */
- ul_success, /* auth success, unlock */
- ul_fail, /* auth fail */
- ul_cancel, /* user cancelled auth (pw_cancel or pw_null) */
- ul_time, /* timed out */
- ul_finished /* user pressed enter */
-} unlock_state;
-
typedef struct screenhack screenhack;
struct screenhack {
Bool enabled_p;
@@ -39,44 +30,13 @@ typedef enum {
TEXT_DATE, TEXT_LITERAL, TEXT_FILE, TEXT_PROGRAM, TEXT_URL
} text_mode;
-struct auth_message;
-struct auth_response;
-
-typedef int (*auth_conv_cb_t) (
- int num_msg,
- const struct auth_message *msg,
- struct auth_response **resp,
- saver_info *si);
-
typedef struct saver_preferences saver_preferences;
typedef struct saver_screen_info saver_screen_info;
-typedef struct passwd_dialog_data passwd_dialog_data;
-typedef struct splash_dialog_data splash_dialog_data;
-typedef struct _monitor monitor;
-
-typedef struct poll_mouse_data poll_mouse_data;
-struct poll_mouse_data {
- int root_x;
- int root_y;
- Window child;
- unsigned int mask;
- time_t time;
-};
-
-#ifdef HAVE_XINPUT
-/* XInputExtension device support */
-#include <X11/extensions/XInput.h>
-typedef struct xinput_dev_info xinput_dev_info;
-struct xinput_dev_info {
- XDevice *device;
- XEventClass press, release, valuator;
- poll_mouse_data last_poll_mouse;
-};
-#endif
/* This structure holds all the user-specified parameters, read from the
command line, the resource database, or entered through a dialog box.
+ It is used by xscreensaver-gfx and xscreensaver-settings;
*/
struct saver_preferences {
@@ -89,23 +49,20 @@ struct saver_preferences {
wrote it. */
Bool verbose_p; /* whether to print out lots of status info */
- Bool timestamp_p; /* whether to mark messages with a timestamp */
- Bool capture_stderr_p; /* whether to redirect stdout/stderr */
Bool ignore_uninstalled_p; /* whether to avoid displaying or complaining
about hacks that are not on $PATH */
Bool debug_p; /* pay no mind to the man behind the curtain */
- Bool xsync_p; /* whether XSynchronize has been called */
+ Bool xsync_p; /* whether to XSynchronize */
Bool lock_p; /* whether to lock as well as save */
Bool fade_p; /* whether to fade to black, if possible */
Bool unfade_p; /* whether to fade from black, if possible */
Time fade_seconds; /* how long that should take */
- int fade_ticks; /* how many ticks should be used */
Bool splash_p; /* whether to do a splash screen at startup */
Bool install_cmap_p; /* whether we should use our own colormap
- when using the screen's default visual. */
+ when using the screen's default visual */
# ifdef QUAD_MODE
Bool quad_p; /* whether to run four savers per monitor */
@@ -118,31 +75,26 @@ struct saver_preferences {
int selected_hack; /* in one_hack mode, this is the one */
int nice_inferior; /* nice value for subprocs */
- int inferior_memory_limit; /* setrlimit(LIMIT_AS) value for subprocs */
- Time initial_delay; /* how long to sleep after launch */
Time splash_duration; /* how long the splash screen stays up */
Time timeout; /* how much idle time before activation */
Time lock_timeout; /* how long after activation locking starts */
Time cycle; /* how long each hack should run */
- Time passwd_timeout; /* how much time before pw dialog goes down */
- Time pointer_timeout; /* how often to check mouse position */
- Time notice_events_timeout; /* how long after window creation to select */
+ Time passwd_timeout; /* how long before pw dialog goes down */
Time watchdog_timeout; /* how often to re-raise and re-blank screen */
int pointer_hysteresis; /* mouse motions less than N/sec are ignored */
- Bool dpms_enabled_p; /* Whether to power down the monitor */
- Bool dpms_quickoff_p; /* Whether to power down monitor immediately
+ Bool dpms_enabled_p; /* whether to power down the monitor */
+ Bool dpms_quickoff_p; /* whether to power down monitor immediately
in "Blank Only" mode */
Time dpms_standby; /* how long until monitor goes black */
Time dpms_suspend; /* how long until monitor power-saves */
Time dpms_off; /* how long until monitor powers down */
- Bool dpms_full_throttle_p; /* Never kill or suspend hack when screen is off */
Bool grab_desktop_p; /* These are not used by "xscreensaver" */
Bool grab_video_p; /* itself: they are used by the external */
Bool random_image_p; /* "xscreensaver-getimage" program, and set */
- char *image_directory; /* by the "xscreensaver-demo" configurator. */
+ char *image_directory; /* by "xscreensaver-settings". */
text_mode tmode; /* How we generate text to display. */
char *text_literal; /* used when tmode is TEXT_LITERAL. */
@@ -150,26 +102,18 @@ struct saver_preferences {
char *text_program; /* used when tmode is TEXT_PROGRAM. */
char *text_url; /* used when tmode is TEXT_URL. */
- Bool use_xidle_extension; /* which extension to use, if possible */
- Bool use_mit_saver_extension;
- Bool use_sgi_saver_extension;
- Bool use_proc_interrupts;
- Bool use_xinput_extension;
-
- Bool getviewport_full_of_lies_p; /* XFree86 bug #421 */
-
char *shell; /* where to find /bin/sh */
char *demo_command; /* How to enter demo mode. */
- char *prefs_command; /* How to edit preferences. */
char *help_url; /* Where the help document resides. */
char *load_url_command; /* How one loads URLs. */
char *new_login_command; /* Command for the "New Login" button. */
char *external_ungrab_command; /* Command that's supposed to make sure
- nobody is holding the keyboard or
- mouse grab. Called with params
- "pre" and "post" before and after
- trying to get the grab. */
+ nobody is holding the keyboard or
+ mouse grab. Called with params
+ "pre" and "post" before and after
+ trying to get the grab. */
+ char *dialog_theme; /* Color scheme on the unlock dialog */
int auth_warning_slack; /* Don't warn about login failures if they
all happen within this many seconds of
@@ -178,188 +122,46 @@ struct saver_preferences {
/* This structure holds all the data that applies to the program as a whole,
or to the non-screen-specific parts of the display connection.
-
- The saver_preferences structure (prefs.h) holds all the user-specified
- parameters, read from the command line, the resource database, or entered
- through a dialog box.
+ It is used only by xscreensaver-gfx.
*/
struct saver_info {
+
+ XtAppContext app;
+ Display *dpy;
+
char *version;
saver_preferences prefs;
int nscreens;
int ssi_count;
saver_screen_info *screens;
- saver_screen_info *default_screen; /* ...on which dialogs will appear. */
- monitor **monitor_layout; /* private to screens.c */
+ struct _monitor **monitor_layout; /* private to screens.c */
Visual **best_gl_visuals; /* visuals for GL hacks on screen N */
+ void *fade_state; /* fade.c private data */
- /* =======================================================================
- global connection info
- ======================================================================= */
-
- XtAppContext app;
- Display *dpy;
-
- /* =======================================================================
- server extension info
- ======================================================================= */
-
- Bool using_xidle_extension; /* which extension is being used. */
- Bool using_mit_saver_extension; /* Note that `p->use_*' is the *request*, */
- Bool using_sgi_saver_extension; /* and `si->using_*' is the *reality*. */
- Bool using_proc_interrupts;
-
-# ifdef HAVE_MIT_SAVER_EXTENSION
- int mit_saver_ext_event_number;
- int mit_saver_ext_error_number;
-# endif
-# ifdef HAVE_SGI_SAVER_EXTENSION
- int sgi_saver_ext_event_number;
- int sgi_saver_ext_error_number;
-# endif
# ifdef HAVE_RANDR
int randr_event_number;
int randr_error_number;
Bool using_randr_extension;
# endif
- Bool using_xinput_extension; /* Note that `p->use_*' is the *request*, */
- /* and `si->using_*' is the *reality*. */
-#ifdef HAVE_XINPUT
- int xinput_ext_event_number; /* may not be used */
- int xinput_ext_error_number;
- int xinput_DeviceButtonPress; /* Extension device event codes. */
- int xinput_DeviceButtonRelease; /* Assigned by server at runtime */
- int xinput_DeviceMotionNotify;
- xinput_dev_info *xinput_devices;
- int num_xinput_devices;
-# endif
-
- /* =======================================================================
- blanking
- ======================================================================= */
-
- Bool screen_blanked_p; /* Whether the saver is currently active. */
- Window mouse_grab_window; /* Window holding our mouse grab */
- Window keyboard_grab_window; /* Window holding our keyboard grab */
- int mouse_grab_screen; /* The screen number the mouse grab is on */
- int keyboard_grab_screen; /* The screen number the keyboard grab is on */
- Bool fading_possible_p; /* Whether fading to/from black is possible. */
- Bool throttled_p; /* Whether we should temporarily just blank
- the screen, not run hacks. (Deprecated:
- users should use "xset dpms force off"
- instead.) */
- time_t blank_time; /* The time at which the screen was blanked
- (if currently blanked) or unblanked (if
- not blanked.) */
-
-
- /* =======================================================================
- locking and runtime privileges
- ======================================================================= */
-
- Bool locked_p; /* Whether the screen is currently locked. */
- Bool dbox_up_p; /* Whether the demo-mode or passwd dialogs
- are currently visible */
-
- Bool locking_disabled_p; /* Sometimes locking is impossible. */
- char *nolock_reason; /* This is why. */
-
- char *orig_uid; /* What uid/gid we had at startup, before
- discarding privileges. */
- char *uid_message; /* Any diagnostics from our attempt to
- discard privileges (printed only in
- -verbose mode.) */
- Bool dangerous_uid_p; /* Set to true if we're running as a user id
- which is known to not be a normal, non-
- privileged user. */
-
- Window passwd_dialog; /* The password dialog, if it's up. */
- passwd_dialog_data *pw_data; /* Other info necessary to draw it. */
-
- int unlock_failures; /* Counts failed login attempts while the
- screen is locked. */
- time_t unlock_failure_time; /* Time of first failed login attempt. */
- time_t unlock_dismiss_time; /* Time lock dialog most recently dismissed. */
-
- char *unlock_typeahead; /* If the screen is locked, and the user types
- a character, we assume that it is the first
- character of the password. It's stored here
- for the password dialog to use to populate
- itself. */
-
- char *user; /* The user whose session is locked. */
- char *cached_passwd; /* Cached password, used to avoid multiple
- prompts for password-only auth mechanisms.*/
- unlock_state unlock_state;
-
- auth_conv_cb_t unlock_cb; /* The function used to prompt for creds. */
- void (*auth_finished_cb) (saver_info *si);
- /* Called when authentication has finished,
- regardless of success or failure.
- May be NULL. */
-
-
- /* =======================================================================
- demoing
- ======================================================================= */
-
Bool demoing_p; /* Whether we are demoing a single hack
(without UI.) */
-
- Window splash_dialog; /* The splash dialog, if its up. */
- splash_dialog_data *sp_data; /* Other info necessary to draw it. */
-
-
- /* =======================================================================
- timers
- ======================================================================= */
-
- XtIntervalId lock_id; /* Timer to implement `prefs.lock_timeout' */
- XtIntervalId cycle_id; /* Timer to implement `prefs.cycle' */
- XtIntervalId timer_id; /* Timer to implement `prefs.timeout' */
+ Bool emergency_p; /* Restarted because of a crash */
XtIntervalId watchdog_id; /* Timer to implement `prefs.watchdog */
- XtIntervalId check_pointer_timer_id; /* `prefs.pointer_timeout' */
-
- XtIntervalId de_race_id; /* Timer to make sure screen un-blanks */
- int de_race_ticks;
-
- time_t last_activity_time; /* Used only when no server exts. */
- time_t last_wall_clock_time; /* Used to detect laptop suspend. */
- saver_screen_info *last_activity_screen;
-
- Bool emergency_lock_p; /* Set when the wall clock has jumped
- (presumably due to laptop suspend) and we
- need to lock down right away instead of
- waiting for the lock timer to go off. */
-
-
- /* =======================================================================
- remote control
- ======================================================================= */
int selection_mode; /* Set to -1 if the NEXT ClientMessage has just
been received; set to -2 if PREV has just
been received; set to N if SELECT or DEMO N
has been received. (This is kind of nasty.)
*/
-
- /* =======================================================================
- subprocs
- ======================================================================= */
-
- XtIntervalId stderr_popup_timer;
-
-# ifdef HAVE_LIBSYSTEMD
- pid_t systemd_pid;
-# endif
};
+
/* This structure holds all the data that applies to the screen-specific parts
of the display connection; if the display has multiple screens, there will
- be one of these for each screen.
- */
+ be one of these for each screen. It is used only by xscreensaver-gfx.
+*/
struct saver_screen_info {
saver_info *global;
@@ -376,17 +178,10 @@ struct saver_screen_info {
Bool real_screen_p; /* This will be true of exactly one ssi per
X screen. */
- Widget toplevel_shell;
-
- /* =======================================================================
- blanking
- ======================================================================= */
- Window screensaver_window; /* The window that will impersonate the root,
- when the screensaver activates. Note that
- the window stored here may change, as we
- destroy and recreate it on different
- visuals. */
+ Window screensaver_window; /* The window on which hacks are drawn. This
+ window might be destroyed and re-created as
+ hacks cycle. */
Colormap cmap; /* The colormap that goes with the window. */
Bool install_cmap_p; /* Whether this screen should have its own
colormap installed, for whichever of several
@@ -398,55 +193,31 @@ struct saver_screen_info {
Visual *default_visual; /* visual to use when none other specified */
- Window real_vroot; /* The original virtual-root window. */
- Window real_vroot_value; /* What was in the __SWM_VROOT property. */
-
Cursor cursor; /* A blank cursor that goes with the
real root window. */
unsigned long black_pixel; /* Black, allocated from `cmap'. */
-
- int blank_vp_x, blank_vp_y; /* Where the virtual-scrolling viewport was
- when the screen went blank. We need to
- prevent the X server from letting the mouse
- bump the edges to scroll while the screen
- is locked, so we reset to this when it has
- moved, and the lock dialog is up... */
-
-# ifdef HAVE_MIT_SAVER_EXTENSION
- Window server_mit_saver_window;
-# endif
+ Window error_dialog; /* Error message about crashed savers */
- /* =======================================================================
- demoing
- ======================================================================= */
-
- Colormap demo_cmap; /* The colormap that goes with the dialogs:
- this might be the same as `cmap' so care
- must be taken not to free it while it's
- still in use. */
-
- /* =======================================================================
- timers
- ======================================================================= */
+ XtIntervalId cycle_id; /* Timer to implement `prefs.cycle' */
+ time_t cycle_at; /* When cycle_id will fire */
+ int current_hack; /* Index into `prefs.screenhacks' */
+ pid_t pid;
+};
- poll_mouse_data last_poll_mouse; /* Used only when no server exts. */
- /* =======================================================================
- subprocs
- ======================================================================= */
+/* From dpms.c */
+extern void sync_server_dpms_settings (Display *, struct saver_preferences *);
- int current_hack; /* Index into `prefs.screenhacks' */
- pid_t pid;
- int stderr_text_x;
- int stderr_text_y;
- int stderr_line_height;
- XFontStruct *stderr_font;
- GC stderr_gc;
- Window stderr_overlay_window; /* Used if the server has overlay planes */
- Colormap stderr_cmap;
-};
+const char *init_file_name (void);
+extern Bool init_file_changed_p (saver_preferences *);
+extern void load_init_file (Display *, saver_preferences *);
+extern int write_init_file (Display *,
+ saver_preferences *, const char *version_string,
+ Bool verbose_p);
+extern Bool senescent_p (void);
+char *make_hack_name (Display *, const char *shell_command);
#endif /* __XSCREENSAVER_TYPES_H__ */
diff --git a/driver/vms-getpwnam.c b/driver/vms-getpwnam.c
deleted file mode 100644
index ec0650c..0000000
--- a/driver/vms-getpwnam.c
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * getpwnam(name) - retrieves a UAF entry
- *
- * Author: Patrick L. Mahan
- * Location: TGV, Inc
- * Date: 15-Nov-1991
- *
- * Purpose: Provides emulation for the UNIX getpwname routine.
- *
- * Modification History
- *
- * Date | Who | Version | Reason
- * ------------+-----------+---------------+---------------------------
- * 15-Nov-1991 | PLM | 1.0 | First Write
- */
-
-#define PASSWDROUTINES
-
-#include <stdio.h>
-#include <descrip.h>
-#include <uaidef.h>
-#include <string.h>
-#include <stdlib.h>
-#include <starlet.h>
-#include "vms-pwd.h"
-
-struct uic {
- unsigned short uid;
- unsigned short gid;
-};
-
-#define TEST(ptr, str) { if (ptr == NULL) { \
- fprintf(stderr, "getpwnam: memory allocation failure for \"%s\"\n", \
- str); \
- return ((struct passwd *)(NULL)); \
- } }
-
-struct passwd *getpwnam(name)
-char *name;
-{
- int istatus;
- int UserNameLen;
- int UserOwnerLen;
- int UserDeviceLen;
- int UserDirLen;
- static char UserName[13];
- static char UserOwner[32];
- static char UserDevice[32];
- static char UserDir[64];
- char *cptr, *sptr;
- unsigned long int UserPwd[2];
- unsigned short int UserSalt;
- unsigned long int UserEncrypt;
- struct uic UicValue;
- struct passwd *entry;
-
- struct dsc$descriptor_s VMSNAME =
- {strlen(name), DSC$K_DTYPE_T, DSC$K_CLASS_S, name};
-
- struct itmlist3 {
- unsigned short int length;
- unsigned short int item;
- unsigned long int addr;
- unsigned long int retaddr;
- } ItemList[] = {
- {12, UAI$_USERNAME, (unsigned long)&UserName, (unsigned long)&UserNameLen},
- {8, UAI$_PWD, (unsigned long)&UserPwd, 0},
- {4, UAI$_UIC, (unsigned long)&UicValue, 0},
- {32, UAI$_OWNER, (unsigned long)&UserOwner, (unsigned long)&UserOwnerLen},
- {32, UAI$_DEFDEV, (unsigned long)&UserDevice, (unsigned long)&UserDeviceLen},
- {64, UAI$_DEFDIR, (unsigned long)&UserDir, (unsigned long)&UserDirLen},
- {2, UAI$_SALT, (unsigned long)&UserSalt, 0},
- {4, UAI$_ENCRYPT, (unsigned long)&UserEncrypt, 0},
- {0, 0, 0, 0}
- };
-
- UserNameLen = 0;
- istatus = sys$getuai (0, 0, &VMSNAME, &ItemList, 0, 0, 0);
-
- if (!(istatus & 1)) {
- fprintf (stderr, "getpwnam: unable to retrieve passwd entry for %s\n",
- name);
- fprintf (stderr, "getpwnam: vms error number is 0x%x\n", istatus);
- return ((struct passwd *)NULL);
- }
-
- entry = (struct passwd *) calloc (1, sizeof(struct passwd));
- TEST(entry, "PASSWD_ENTRY");
-
- entry->pw_uid = UicValue.uid;
- entry->pw_gid = UicValue.gid;
- entry->pw_salt = UserSalt;
- entry->pw_encrypt = UserEncrypt;
-
- sptr = UserName;
- cptr = calloc (UserNameLen+1, sizeof(char));
- TEST(cptr, "USERNAME");
- strncpy (cptr, sptr, UserNameLen);
- cptr[UserNameLen] = '\0';
- entry->pw_name = cptr;
-
- cptr = calloc(8, sizeof(char));
- TEST(cptr, "PASSWORD");
- memcpy(cptr, UserPwd, 8);
- entry->pw_passwd = cptr;
-
- sptr = UserOwner; sptr++;
- cptr = calloc ((int)UserOwner[0]+1, sizeof(char));
- TEST(cptr, "FULLNAME");
- strncpy (cptr, sptr, (int)UserOwner[0]);
- cptr[(int)UserOwner[0]] = '\0';
- entry->pw_gecos = cptr;
-
- cptr = calloc ((int)UserDevice[0]+(int)UserDir[0]+1, sizeof(char));
- TEST(cptr, "HOME");
- sptr = UserDevice; sptr++;
- strncpy (cptr, sptr, (int)UserDevice[0]);
- sptr = UserDir; sptr++;
- strncat (cptr, sptr, (int)UserDir[0]);
- cptr[(int)UserDevice[0]+(int)UserDir[0]] = '\0';
- entry->pw_dir = cptr;
-
- cptr = calloc (strlen("SYS$SYSTEM:LOGINOUT.EXE")+1, sizeof(char));
- TEST(cptr,"SHELL");
- strcpy (cptr, "SYS$SYSTEM:LOGINOUT.EXE");
- entry->pw_shell = cptr;
-
- return (entry);
-}
diff --git a/driver/vms-hpwd.c b/driver/vms-hpwd.c
deleted file mode 100644
index 707e3ea..0000000
--- a/driver/vms-hpwd.c
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * VAX/VMS Password hashing routines:
- *
- * uses the System Service SYS$HASH_PASSWORD
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- */
-
-#include <syidef.h>
-#include <descrip.h>
-#include <string.h>
-#include <starlet.h>
-/*
- * Hashing routine
- */
-hash_vms_password(output_buf,input_buf,input_length,username,encryption_type,salt)
-char *output_buf;
-char *input_buf;
-int input_length;
-char *username;
-int encryption_type;
-unsigned short salt;
-{
- struct dsc$descriptor_s password;
- struct dsc$descriptor_s user;
-
- /*
- * Check the VMS Version. If this is V5.4 or later, then
- * we can use the new system service SYS$HASH_PASSWORD. Else
- * fail and return garbage.
- */
-
- static char VMS_Version[32];
- struct {
- unsigned short int Size;
- unsigned short int Code;
- char *Buffer;
- unsigned short int *Resultant_Size;
- } Item_List[2]={32, SYI$_VERSION, VMS_Version, 0, 0, 0};
- struct {int Size; char *Ptr;} Descr1;
-
- /*
- * Get the information
- */
- sys$getsyiw(0,0,0,Item_List,0,0,0);
- /*
- * Call the old routine if this isn't V5.4 or later...
- */
-#ifndef __DECC
- if ((VMS_Version[1] < '5') ||
- ((VMS_Version[1] == '5') && (VMS_Version[3] < '4'))) {
- printf("Unsupported OS version\n");
- return(1);
- }
-#endif /* !__DECC */
- /*
- * Call the SYS$HASH_PASSWORD system service...
- */
- password.dsc$b_dtype = DSC$K_DTYPE_T;
- password.dsc$b_class = DSC$K_CLASS_S;
- password.dsc$w_length = input_length;
- password.dsc$a_pointer = input_buf;
- user.dsc$b_dtype = DSC$K_DTYPE_T;
- user.dsc$b_class = DSC$K_CLASS_S;
- user.dsc$w_length = strlen(username);
- user.dsc$a_pointer = username;
- sys$hash_password (&password, encryption_type, salt, &user, output_buf);
-}
diff --git a/driver/vms-pwd.h b/driver/vms-pwd.h
deleted file mode 100644
index 6cb73d3..0000000
--- a/driver/vms-pwd.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* @(#)pwd.h 1.7 89/08/24 SMI; from S5R2 1.1 */
-
-#ifndef __pwd_h
-#define __pwd_h
-
-#ifdef vax11c
-#include <types.h>
-#else
-#include <sys/types.h>
-#endif /* vax11c */
-
-#ifdef PASSWDROUTINES
-#define EXTERN
-#else
-#define EXTERN extern
-#endif /* PASSWDROUTINES */
-
-struct passwd {
- char *pw_name;
- char *pw_passwd;
- int pw_uid;
- int pw_gid;
- short pw_salt;
- int pw_encrypt;
- char *pw_age;
- char *pw_comment;
- char *pw_gecos;
- char *pw_dir;
- char *pw_shell;
-};
-
-
-#ifndef _POSIX_SOURCE
-extern struct passwd *getpwent();
-
-struct comment {
- char *c_dept;
- char *c_name;
- char *c_acct;
- char *c_bin;
-};
-
-#endif
-
-EXTERN struct passwd *getpwuid(/* uid_t uid */);
-EXTERN struct passwd *getpwnam(/* char *name */);
-
-#endif /* !__pwd_h */
diff --git a/driver/vms-validate.c b/driver/vms-validate.c
deleted file mode 100644
index 8f7141d..0000000
--- a/driver/vms-validate.c
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * validate a password for a user
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-/*
- * Includes
- */
-#include <stdio.h>
-#include <ctype.h>
-#include <string.h>
-
-#include "vms-pwd.h"
-int hash_vms_password(char *output_buf,char *input_buf,int input_length,
- char *username,int encryption_type,unsigned short salt);
-
-/*
- *
- * Validate a VMS UserName/Password pair.
- *
- */
-
-int validate_user(name,password)
-char *name;
-char *password;
-{
- char password_buf[64];
- char username_buf[31];
- char encrypt_buf[8];
- register int i;
- register char *cp,*cp1;
- struct passwd *user_entry;
-
- /*
- * Get the users UAF entry
- */
- user_entry = getpwnam(name);
-
- /*
- * If user_entry == NULL then we got a bad error
- * return -1 to indicate a bad error
- */
- if (user_entry == NULL) return (-1);
-
- /*
- * Uppercase the password
- */
- cp = password;
- cp1 = password_buf;
- while (*cp)
- if (islower(*cp))
- *cp1++ = toupper(*cp++);
- else
- *cp1++ = *cp++;
- /*
- * Get the length of the password
- */
- i = strlen(password);
- /*
- * Encrypt the password
- */
- hash_vms_password(encrypt_buf,password_buf,i,user_entry->pw_name,
- user_entry->pw_encrypt, user_entry->pw_salt);
- if (memcmp(encrypt_buf,user_entry->pw_passwd,8) == 0)
- return(1);
- else return(0);
-}
-
diff --git a/driver/windows.c b/driver/windows.c
index 5854c49..c9cdf9d 100644
--- a/driver/windows.c
+++ b/driver/windows.c
@@ -1,5 +1,5 @@
/* windows.c --- turning the screen black; dealing with visuals, virtual roots.
- * xscreensaver, Copyright (c) 1991-2020 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -14,42 +14,17 @@
# include "config.h"
#endif
-#ifdef VMS
-# include <unixlib.h> /* for getpid() */
-# include "vms-gtod.h" /* for gettimeofday() */
-#endif /* VMS */
-
-#ifndef VMS
-# include <pwd.h> /* for getpwuid() */
-#else /* VMS */
-# include "vms-pwd.h"
-#endif /* VMS */
-
#ifdef HAVE_UNAME
# include <sys/utsname.h> /* for uname() */
#endif /* HAVE_UNAME */
#include <stdio.h>
-/* #include <X11/Xproto.h> / * for CARD32 */
+#include <pwd.h> /* for getpwuid() */
#include <X11/Xlib.h>
#include <X11/Xutil.h> /* for XSetClassHint() */
#include <X11/Xatom.h>
-#include <X11/Xos.h> /* for time() */
-#include <X11/extensions/scrnsaver.h>
-#include <signal.h> /* for the signal names */
+#include <X11/Intrinsic.h>
#include <time.h>
-#include <sys/time.h>
-
-/* You might think that to store an array of 32-bit quantities onto a
- server-side property, you would pass an array of 32-bit data quantities
- into XChangeProperty(). You would be wrong. You have to use an array
- of longs, even if long is 64 bits (using 32 of each 64.)
- */
-typedef long PROP32;
-
-#ifdef HAVE_MIT_SAVER_EXTENSION
-# include <X11/extensions/scrnsaver.h>
-#endif /* HAVE_MIT_SAVER_EXTENSION */
#ifdef HAVE_XF86VMODE
# include <X11/extensions/xf86vmode.h>
@@ -59,1144 +34,100 @@ typedef long PROP32;
# include <X11/extensions/Xinerama.h>
#endif /* HAVE_XINERAMA */
-/* This file doesn't need the Xt headers, so stub these types out... */
-#undef XtPointer
-#define XtAppContext void*
-#define XrmDatabase void*
-#define XtIntervalId void*
-#define XtPointer void*
-#define Widget void*
-
#include "xscreensaver.h"
+#include "atoms.h"
#include "visual.h"
+#include "screens.h"
#include "fade.h"
+#include "resources.h"
+#include "xft.h"
+#include "font-retry.h"
extern int kill (pid_t, int); /* signal() is in sys/signal.h... */
-Atom XA_VROOT, XA_XSETROOT_ID, XA_ESETROOT_PMAP_ID, XA_XROOTPMAP_ID;
-Atom XA_NET_WM_USER_TIME;
-Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_ID;
-Atom XA_SCREENSAVER_STATUS;
-
-extern saver_info *global_si_kludge; /* I hate C so much... */
-
-static void maybe_transfer_grabs (saver_screen_info *ssi,
- Window old_w, Window new_w, int new_screen);
-
-#define ALL_POINTER_EVENTS \
- (ButtonPressMask | ButtonReleaseMask | EnterWindowMask | \
- LeaveWindowMask | PointerMotionMask | PointerMotionHintMask | \
- Button1MotionMask | Button2MotionMask | Button3MotionMask | \
- Button4MotionMask | Button5MotionMask | ButtonMotionMask)
-
-
-static const char *
-grab_string(int status)
-{
- switch (status)
- {
- case GrabSuccess: return "GrabSuccess";
- case AlreadyGrabbed: return "AlreadyGrabbed";
- case GrabInvalidTime: return "GrabInvalidTime";
- case GrabNotViewable: return "GrabNotViewable";
- case GrabFrozen: return "GrabFrozen";
- default:
- {
- static char foo[255];
- sprintf(foo, "unknown status: %d", status);
- return foo;
- }
- }
-}
-
-static int
-grab_kbd(saver_info *si, Window w, int screen_no)
-{
- saver_preferences *p = &si->prefs;
- int status = XGrabKeyboard (si->dpy, w, True,
- /* I don't really understand Sync vs Async,
- but these seem to work... */
- GrabModeSync, GrabModeAsync,
- CurrentTime);
- if (status == GrabSuccess)
- {
- si->keyboard_grab_window = w;
- si->keyboard_grab_screen = screen_no;
- }
-
- if (p->verbose_p)
- fprintf(stderr, "%s: %d: grabbing keyboard on 0x%lx... %s.\n",
- blurb(), screen_no, (unsigned long) w, grab_string(status));
- return status;
-}
-
-
-static int
-grab_mouse (saver_info *si, Window w, Cursor cursor, int screen_no)
-{
- saver_preferences *p = &si->prefs;
- int status = XGrabPointer (si->dpy, w, True, ALL_POINTER_EVENTS,
- GrabModeAsync, GrabModeAsync, w,
- cursor, CurrentTime);
- if (status == GrabSuccess)
- {
- si->mouse_grab_window = w;
- si->mouse_grab_screen = screen_no;
- }
-
- if (p->verbose_p)
- fprintf(stderr, "%s: %d: grabbing mouse on 0x%lx... %s.\n",
- blurb(), screen_no, (unsigned long) w, grab_string(status));
- return status;
-}
-
-
-static void
-ungrab_kbd(saver_info *si)
-{
- saver_preferences *p = &si->prefs;
- XUngrabKeyboard(si->dpy, CurrentTime);
- if (p->verbose_p)
- fprintf(stderr, "%s: %d: ungrabbing keyboard (was 0x%lx).\n",
- blurb(), si->keyboard_grab_screen,
- (unsigned long) si->keyboard_grab_window);
- si->keyboard_grab_window = 0;
-}
-
-
-static void
-ungrab_mouse(saver_info *si)
-{
- saver_preferences *p = &si->prefs;
- XUngrabPointer(si->dpy, CurrentTime);
- if (p->verbose_p)
- fprintf(stderr, "%s: %d: ungrabbing mouse (was 0x%lx).\n",
- blurb(), si->mouse_grab_screen,
- (unsigned long) si->mouse_grab_window);
- si->mouse_grab_window = 0;
-}
-
-
-/* Apparently there is this program called "rdesktop" which is a windows
- terminal server client for Unix. It would seem that this program holds
- the keyboard GRABBED the whole time it has focus! This is, of course,
- completely idiotic: the whole point of grabbing is to get events when
- you do *not* have focus, so grabbing *only when* you have focus is
- completely redundant -- unless your goal is to make xscreensaver not
- able to ever lock the screen when your program is running.
-
- If xscreensaver blanks while rdesktop still has a keyboard grab, then
- when we try to prompt for the password, we won't get the characters:
- they'll be typed into rdesktop.
-
- Perhaps rdesktop will release its keyboard grab if it loses focus?
- What the hell, let's give it a try. If we fail to grab the keyboard
- four times in a row, we forcibly set focus to "None" and try four
- more times. (We don't touch focus unless we're already having a hard
- time getting a grab.)
- */
-static void
-nuke_focus (saver_info *si, int screen_no)
-{
- saver_preferences *p = &si->prefs;
- Window focus = 0;
- int rev = 0;
-
- XGetInputFocus (si->dpy, &focus, &rev);
-
- if (p->verbose_p)
- {
- char w[255], r[255];
-
- if (focus == PointerRoot) strcpy (w, "PointerRoot");
- else if (focus == None) strcpy (w, "None");
- else sprintf (w, "0x%lx", (unsigned long) focus);
-
- if (rev == RevertToParent) strcpy (r, "RevertToParent");
- else if (rev == RevertToPointerRoot) strcpy (r, "RevertToPointerRoot");
- else if (rev == RevertToNone) strcpy (r, "RevertToNone");
- else sprintf (r, "0x%x", rev);
-
- fprintf (stderr, "%s: %d: removing focus from %s / %s.\n",
- blurb(), screen_no, w, r);
- }
-
- XSetInputFocus (si->dpy, None, RevertToNone, CurrentTime);
- XSync (si->dpy, False);
-}
-
-
-static void
-ungrab_keyboard_and_mouse (saver_info *si)
-{
- ungrab_mouse (si);
- ungrab_kbd (si);
-}
-
-
-static Bool
-grab_keyboard_and_mouse_real (saver_info *si, Window window, Cursor cursor,
- int screen_no)
-{
- Status mstatus = 0, kstatus = 0;
- int i;
- int retries = 4;
- Bool focus_fuckus = False;
-
- AGAIN:
-
- for (i = 0; i < retries; i++)
- {
- XSync (si->dpy, False);
- kstatus = grab_kbd (si, window, screen_no);
- if (kstatus == GrabSuccess)
- break;
-
- /* else, wait a second and try to grab again. */
- sleep (1);
- }
-
- if (kstatus != GrabSuccess)
- {
- fprintf (stderr, "%s: couldn't grab keyboard! (%s)\n",
- blurb(), grab_string(kstatus));
-
- if (! focus_fuckus)
- {
- focus_fuckus = True;
- nuke_focus (si, screen_no);
- goto AGAIN;
- }
- }
-
- for (i = 0; i < retries; i++)
- {
- XSync (si->dpy, False);
- mstatus = grab_mouse (si, window, cursor, screen_no);
- if (mstatus == GrabSuccess)
- break;
-
- /* else, wait a second and try to grab again. */
- sleep (1);
- }
-
- if (mstatus != GrabSuccess)
- fprintf (stderr, "%s: couldn't grab pointer! (%s)\n",
- blurb(), grab_string(mstatus));
-
-
- /* When should we allow blanking to proceed? The current theory
- is that a keyboard grab is mandatory; a mouse grab is optional.
-
- - If we don't have a keyboard grab, then we won't be able to
- read a password to unlock, so the kbd grab is mandatory.
- (We can't conditionalize this on locked_p, because someone
- might run "xscreensaver-command -lock" at any time.)
-
- - If we don't have a mouse grab, then we might not see mouse
- clicks as a signal to unblank -- but we will still see kbd
- activity, so that's not a disaster.
-
- It has been suggested that we should allow blanking if locking
- is disabled, and we have a mouse grab but no keyboard grab
- (that is: kstatus != GrabSuccess &&
- mstatus == GrabSuccess &&
- si->locking_disabled_p)
- That would allow screen blanking (but not locking) while the gdm
- login screen had the keyboard grabbed, but one would have to use
- the mouse to unblank. Keyboard characters would go to the gdm
- login field without unblanking. I have not made this change
- because I'm not completely convinced it is a safe thing to do.
- */
-
- if (kstatus != GrabSuccess) /* Do not blank without a kbd grab. */
- {
- /* If we didn't get both grabs, release the one we did get. */
- ungrab_keyboard_and_mouse (si);
- return False;
- }
-
- return True; /* Grab is good, go ahead and blank. */
-}
-
-
-static Bool
-grab_keyboard_and_mouse (saver_info *si, Window window, Cursor cursor,
- int screen_no)
-{
- Bool ret;
- char *euc = si->prefs.external_ungrab_command;
- char cmd[200];
- if (euc && *euc)
- {
- snprintf (cmd, sizeof(cmd), "%s %s", euc, "pre");
- exec_and_wait (si, cmd);
- }
- ret = grab_keyboard_and_mouse_real (si, window, cursor, screen_no);
- if (euc && *euc)
- {
- snprintf (cmd, sizeof(cmd), "%s %s", euc, "post");
- exec_and_wait (si, cmd);
- if (ret) {
- /* The external command might have generated some x/input events */
- flush_events (si);
- }
- }
- return ret;
-}
-
-
-int
-move_mouse_grab (saver_info *si, Window to, Cursor cursor, int to_screen_no)
-{
- Window old = si->mouse_grab_window;
-
- if (old == 0)
- return grab_mouse (si, to, cursor, to_screen_no);
- else
- {
- saver_preferences *p = &si->prefs;
- int status;
-
- XSync (si->dpy, False);
- XGrabServer (si->dpy); /* ############ DANGER! */
- XSync (si->dpy, False);
-
- if (p->verbose_p)
- fprintf(stderr, "%s: grabbing server...\n", blurb());
-
- ungrab_mouse (si);
- status = grab_mouse (si, to, cursor, to_screen_no);
-
- if (status != GrabSuccess) /* Augh! */
- {
- sleep (1); /* Note dramatic evil of sleeping
- with server grabbed. */
- XSync (si->dpy, False);
- status = grab_mouse (si, to, cursor, to_screen_no);
- }
-
- if (status != GrabSuccess) /* Augh! Try to get the old one back... */
- grab_mouse (si, old, cursor, to_screen_no);
-
- XUngrabServer (si->dpy);
- XSync (si->dpy, False); /* ###### (danger over) */
-
- if (p->verbose_p)
- fprintf(stderr, "%s: ungrabbing server.\n", blurb());
-
- return status;
- }
-}
-
-
-/* Prints an error message to stderr and returns True if there is another
- xscreensaver running already. Silently returns False otherwise. */
-Bool
-ensure_no_screensaver_running (Display *dpy, Screen *screen)
-{
- Bool status = 0;
- int i;
- Window root = RootWindowOfScreen (screen);
- Window root2, parent, *kids;
- unsigned int nkids;
- XErrorHandler old_handler = XSetErrorHandler (BadWindow_ehandler);
-
- if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids))
- abort ();
- if (root != root2)
- abort ();
- if (parent)
- abort ();
- for (i = 0; i < nkids; i++)
- {
- Atom type;
- int format;
- unsigned long nitems, bytesafter;
- unsigned char *version;
-
- if (XGetWindowProperty (dpy, kids[i], XA_SCREENSAVER_VERSION, 0, 1,
- False, XA_STRING, &type, &format, &nitems,
- &bytesafter, &version)
- == Success
- && type != None)
- {
- unsigned char *id;
- if (XGetWindowProperty (dpy, kids[i], XA_SCREENSAVER_ID, 0, 512,
- False, XA_STRING, &type, &format, &nitems,
- &bytesafter, &id)
- != Success
- || type == None)
- id = (unsigned char *) "???";
-
- fprintf (stderr,
- "%s: already running on display %s (window 0x%x)\n from process %s.\n",
- blurb(), DisplayString (dpy), (int) kids [i],
- (char *) id);
- status = True;
- }
-
- else if (XGetWindowProperty (dpy, kids[i], XA_WM_COMMAND, 0, 128,
- False, XA_STRING, &type, &format, &nitems,
- &bytesafter, &version)
- == Success
- && type != None
- && !strcmp ((char *) version, "gnome-screensaver"))
- {
- fprintf (stderr,
- "%s: \"%s\" is already running on display %s (window 0x%x)\n",
- blurb(), (char *) version,
- DisplayString (dpy), (int) kids [i]);
- status = True;
- break;
- }
- }
-
- if (kids) XFree ((char *) kids);
- XSync (dpy, False);
- XSetErrorHandler (old_handler);
- return status;
-}
-
-
-
-/* Virtual-root hackery */
-
#ifdef _VROOT_H_
ERROR! You must not include vroot.h in this file.
#endif
-static void
-store_vroot_property (Display *dpy, Window win, Window value)
-{
-#if 0
- if (p->verbose_p)
- fprintf (stderr,
- "%s: storing XA_VROOT = 0x%x (%s) = 0x%x (%s)\n", blurb(),
- win,
- (win == screensaver_window ? "ScreenSaver" :
- (win == real_vroot ? "VRoot" :
- (win == real_vroot_value ? "Vroot_value" : "???"))),
- value,
- (value == screensaver_window ? "ScreenSaver" :
- (value == real_vroot ? "VRoot" :
- (value == real_vroot_value ? "Vroot_value" : "???"))));
-#endif
- XChangeProperty (dpy, win, XA_VROOT, XA_WINDOW, 32, PropModeReplace,
- (unsigned char *) &value, 1);
-}
-
-static void
-remove_vroot_property (Display *dpy, Window win)
-{
-#if 0
- if (p->verbose_p)
- fprintf (stderr, "%s: removing XA_VROOT from 0x%x (%s)\n", blurb(), win,
- (win == screensaver_window ? "ScreenSaver" :
- (win == real_vroot ? "VRoot" :
- (win == real_vroot_value ? "Vroot_value" : "???"))));
-#endif
- XDeleteProperty (dpy, win, XA_VROOT);
-}
-
-static Bool safe_XKillClient (Display *dpy, XID id);
+static void reset_watchdog_timer (saver_info *si);
-static void
-kill_xsetroot_data_1 (Display *dpy, Window window,
- Atom prop, const char *atom_name,
- Bool verbose_p)
+void
+store_saver_status (saver_info *si)
{
- Atom type;
- int format;
- unsigned long nitems, bytesafter;
- unsigned char *dataP = 0;
-
- /* If the user has been using xv or xsetroot as a screensaver (to display
- an image on the screensaver window, as a kind of slideshow) then the
- pixmap and its associated color cells have been put in RetainPermanent
- CloseDown mode. Since we're not destroying the xscreensaver window,
- but merely unmapping it, we need to free these resources or those
- colormap cells will stay allocated while the screensaver is off. (We
- could just delete the screensaver window and recreate it later, but
- that could cause other problems.) This code does an atomic read-and-
- delete of the _XSETROOT_ID property, and if it held a pixmap, then we
- cause the RetainPermanent resources of the client which created it
- (and which no longer exists) to be freed.
-
- Update: it seems that Gnome and KDE do this same trick, but with the
- properties "ESETROOT_PMAP_ID" and/or "_XROOTPMAP_ID" instead of
- "_XSETROOT_ID". So, we'll kill those too.
- */
- if (XGetWindowProperty (dpy, window, prop, 0, 1,
- True, AnyPropertyType, &type, &format, &nitems,
- &bytesafter, &dataP)
- == Success
- && type != None)
- {
- Pixmap *pixP = (Pixmap *) dataP;
- if (pixP && *pixP && type == XA_PIXMAP && format == 32 &&
- nitems == 1 && bytesafter == 0)
- {
- if (verbose_p)
- fprintf (stderr, "%s: destroying %s data (0x%lX).\n",
- blurb(), atom_name, *pixP);
- safe_XKillClient (dpy, *pixP);
- }
- else
- fprintf (stderr,
- "%s: deleted unrecognised %s property: \n"
- "\t%lu, %lu; type: %lu, format: %d, "
- "nitems: %lu, bytesafter %ld\n",
- blurb(), atom_name,
- (unsigned long) pixP, (pixP ? *pixP : 0), type,
- format, nitems, bytesafter);
- }
-}
+ /* The contents of XA_SCREENSAVER_STATUS has LOCK/BLANK/0 in the first slot,
+ the time at which that state began in the second slot, and the ordinal of
+ the running hacks on each screen (1-based) in subsequent slots. Since
+ we don't know the blank-versus-lock status here, we leave whatever was
+ there before unchanged: it will be updated by "xscreensaver".
+ XA_SCREENSAVER_STATUS is stored on the (real) root window of screen 0.
-static void
-kill_xsetroot_data (Display *dpy, Window w, Bool verbose_p)
-{
- kill_xsetroot_data_1 (dpy, w, XA_XSETROOT_ID, "_XSETROOT_ID", verbose_p);
- kill_xsetroot_data_1 (dpy, w, XA_ESETROOT_PMAP_ID, "ESETROOT_PMAP_ID",
- verbose_p);
- kill_xsetroot_data_1 (dpy, w, XA_XROOTPMAP_ID, "_XROOTPMAP_ID", verbose_p);
-}
+ XA_SCREENSAVER_VERSION and XA_SCREENSAVER_ID are stored on the unmapped
+ window created by the "xscreensaver" process. ClientMessage events are
+ sent to that window, and the responses are sent via the
+ XA_SCREENSAVER_RESPONSE property on it.
+ These properties are not used on the windows created by "xscreensaver-gfx"
+ for use by the display hacks.
-static void
-save_real_vroot (saver_screen_info *ssi)
-{
- saver_info *si = ssi->global;
+ See the different version of this function in xscreensaver.c.
+ */
Display *dpy = si->dpy;
- Screen *screen = ssi->screen;
+ Window w = RootWindow (dpy, 0); /* always screen 0 */
+ Atom type;
+ unsigned char *dataP = 0;
+ PROP32 *status = 0;
+ int format;
+ unsigned long nitems, bytesafter;
+ int nitems2 = si->nscreens + 2;
int i;
- Window root = RootWindowOfScreen (screen);
- Window root2, parent, *kids;
- unsigned int nkids;
- XErrorHandler old_handler;
-
- /* It's possible that a window might be deleted between our call to
- XQueryTree() and our call to XGetWindowProperty(). Don't die if
- that happens (but just ignore that window, it's not the one we're
- interested in anyway.)
- */
- XSync (dpy, False);
- old_handler = XSetErrorHandler (BadWindow_ehandler);
- XSync (dpy, False);
- ssi->real_vroot = 0;
- ssi->real_vroot_value = 0;
- if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids))
- abort ();
- if (root != root2)
- abort ();
- if (parent)
- abort ();
- for (i = 0; i < nkids; i++)
- {
- Atom type;
- int format;
- unsigned long nitems, bytesafter;
- unsigned char *dataP = 0;
- Window *vrootP;
- int j;
-
- /* Skip this window if it is the xscreensaver window of any other
- screen (this can happen in the Xinerama case.)
- */
- for (j = 0; j < si->nscreens; j++)
- {
- saver_screen_info *ssi2 = &si->screens[j];
- if (kids[i] == ssi2->screensaver_window)
- goto SKIP;
- }
+ /* Read the old property, so we can change just our parts. */
+ XGetWindowProperty (dpy, w,
+ XA_SCREENSAVER_STATUS,
+ 0, 999, False, XA_INTEGER,
+ &type, &format, &nitems, &bytesafter,
+ &dataP);
- if (XGetWindowProperty (dpy, kids[i], XA_VROOT, 0, 1, False, XA_WINDOW,
- &type, &format, &nitems, &bytesafter,
- &dataP)
- != Success)
- continue;
- if (! dataP)
- continue;
+ status = (PROP32 *) calloc (nitems2, sizeof(PROP32));
- vrootP = (Window *) dataP;
- if (ssi->real_vroot)
- {
- if (*vrootP == ssi->screensaver_window) abort ();
- fprintf (stderr,
- "%s: more than one virtual root window found (0x%x and 0x%x).\n",
- blurb(), (int) ssi->real_vroot, (int) kids [i]);
- exit (1);
- }
- ssi->real_vroot = kids [i];
- ssi->real_vroot_value = *vrootP;
- SKIP:
- ;
- }
-
- XSync (dpy, False);
- XSetErrorHandler (old_handler);
- XSync (dpy, False);
-
- if (ssi->real_vroot)
+ if (dataP && type == XA_INTEGER && nitems >= 3)
{
- remove_vroot_property (si->dpy, ssi->real_vroot);
- XSync (dpy, False);
+ status[0] = ((PROP32 *) dataP)[0];
+ status[1] = ((PROP32 *) dataP)[1];
}
- XFree ((char *) kids);
-}
-
-
-static Bool
-restore_real_vroot_1 (saver_screen_info *ssi)
-{
- saver_info *si = ssi->global;
- saver_preferences *p = &si->prefs;
- if (p->verbose_p && ssi->real_vroot)
- fprintf (stderr,
- "%s: restoring __SWM_VROOT property on the real vroot (0x%lx).\n",
- blurb(), (unsigned long) ssi->real_vroot);
- if (ssi->screensaver_window)
- remove_vroot_property (si->dpy, ssi->screensaver_window);
- if (ssi->real_vroot)
- {
- store_vroot_property (si->dpy, ssi->real_vroot, ssi->real_vroot_value);
- ssi->real_vroot = 0;
- ssi->real_vroot_value = 0;
- /* make sure the property change gets there before this process
- terminates! We might be doing this because we have intercepted
- SIGTERM or something. */
- XSync (si->dpy, False);
- return True;
- }
- return False;
-}
-
-Bool
-restore_real_vroot (saver_info *si)
-{
- int i;
- Bool did_any = False;
for (i = 0; i < si->nscreens; i++)
{
saver_screen_info *ssi = &si->screens[i];
- if (restore_real_vroot_1 (ssi))
- did_any = True;
- }
- return did_any;
-}
-
-
-/* Signal hackery to ensure that the vroot doesn't get left in an
- inconsistent state
- */
-
-const char *
-signal_name(int signal)
-{
- switch (signal) {
- case SIGHUP: return "SIGHUP";
- case SIGINT: return "SIGINT";
- case SIGQUIT: return "SIGQUIT";
- case SIGILL: return "SIGILL";
- case SIGTRAP: return "SIGTRAP";
-#ifdef SIGABRT
- case SIGABRT: return "SIGABRT";
-#endif
- case SIGFPE: return "SIGFPE";
- case SIGKILL: return "SIGKILL";
- case SIGBUS: return "SIGBUS";
- case SIGSEGV: return "SIGSEGV";
- case SIGPIPE: return "SIGPIPE";
- case SIGALRM: return "SIGALRM";
- case SIGTERM: return "SIGTERM";
-#ifdef SIGSTOP
- case SIGSTOP: return "SIGSTOP";
-#endif
-#ifdef SIGCONT
- case SIGCONT: return "SIGCONT";
-#endif
-#ifdef SIGUSR1
- case SIGUSR1: return "SIGUSR1";
-#endif
-#ifdef SIGUSR2
- case SIGUSR2: return "SIGUSR2";
-#endif
-#ifdef SIGEMT
- case SIGEMT: return "SIGEMT";
-#endif
-#ifdef SIGSYS
- case SIGSYS: return "SIGSYS";
-#endif
-#ifdef SIGCHLD
- case SIGCHLD: return "SIGCHLD";
-#endif
-#ifdef SIGPWR
- case SIGPWR: return "SIGPWR";
-#endif
-#ifdef SIGWINCH
- case SIGWINCH: return "SIGWINCH";
-#endif
-#ifdef SIGURG
- case SIGURG: return "SIGURG";
-#endif
-#ifdef SIGIO
- case SIGIO: return "SIGIO";
-#endif
-#ifdef SIGVTALRM
- case SIGVTALRM: return "SIGVTALRM";
-#endif
-#ifdef SIGXCPU
- case SIGXCPU: return "SIGXCPU";
-#endif
-#ifdef SIGXFSZ
- case SIGXFSZ: return "SIGXFSZ";
-#endif
-#ifdef SIGDANGER
- case SIGDANGER: return "SIGDANGER";
-#endif
- default:
- {
- static char buf[50];
- sprintf(buf, "signal %d\n", signal);
- return buf;
- }
- }
-}
-
-
-
-static RETSIGTYPE
-restore_real_vroot_handler (int sig)
-{
- saver_info *si = global_si_kludge; /* I hate C so much... */
-
- signal (sig, SIG_DFL);
- if (restore_real_vroot (si))
- fprintf (real_stderr, "\n%s: %s intercepted, vroot restored.\n",
- blurb(), signal_name(sig));
-# ifdef HAVE_LIBSYSTEMD
- if (si->systemd_pid) /* Kill background xscreensaver-systemd process */
- {
- /* We're exiting, so there's no need to do a full kill_job() here,
- which will waitpid(). */
- /* kill_job (si, si->systemd_pid, SIGTERM); */
- kill (si->systemd_pid, SIGTERM);
- si->systemd_pid = 0;
+ status[2 + i] = ssi->current_hack + 1; /* 1-based */
}
-# endif
- kill (getpid (), sig);
-}
-
-static void
-catch_signal (saver_info *si, int sig, RETSIGTYPE (*handler) (int))
-{
-# ifdef HAVE_SIGACTION
-
- struct sigaction a;
- a.sa_handler = handler;
- sigemptyset (&a.sa_mask);
- a.sa_flags = 0;
-
- /* On Linux 2.4.9 (at least) we need to tell the kernel to not mask delivery
- of this signal from inside its handler, or else when we execvp() the
- process again, it starts up with SIGHUP blocked, meaning that killing
- it with -HUP only works *once*. You'd think that execvp() would reset
- all the signal masks, but it doesn't.
- */
-# if defined(SA_NOMASK)
- a.sa_flags |= SA_NOMASK;
-# elif defined(SA_NODEFER)
- a.sa_flags |= SA_NODEFER;
-# endif
-
- if (sigaction (sig, &a, 0) < 0)
-# else /* !HAVE_SIGACTION */
- if (((long) signal (sig, handler)) == -1L)
-# endif /* !HAVE_SIGACTION */
- {
- char buf [255];
- sprintf (buf, "%s: couldn't catch %s", blurb(), signal_name(sig));
- perror (buf);
- saver_exit (si, 1, 0);
- }
-}
-
-static RETSIGTYPE saver_sighup_handler (int sig);
-
-void
-handle_signals (saver_info *si)
-{
- catch_signal (si, SIGHUP, saver_sighup_handler);
-
- catch_signal (si, SIGINT, restore_real_vroot_handler);
- catch_signal (si, SIGQUIT, restore_real_vroot_handler);
- catch_signal (si, SIGILL, restore_real_vroot_handler);
- catch_signal (si, SIGTRAP, restore_real_vroot_handler);
-#ifdef SIGIOT
- catch_signal (si, SIGIOT, restore_real_vroot_handler);
-#endif
- catch_signal (si, SIGABRT, restore_real_vroot_handler);
-#ifdef SIGEMT
- catch_signal (si, SIGEMT, restore_real_vroot_handler);
-#endif
- catch_signal (si, SIGFPE, restore_real_vroot_handler);
- catch_signal (si, SIGBUS, restore_real_vroot_handler);
- catch_signal (si, SIGSEGV, restore_real_vroot_handler);
-#ifdef SIGSYS
- catch_signal (si, SIGSYS, restore_real_vroot_handler);
-#endif
- catch_signal (si, SIGTERM, restore_real_vroot_handler);
-#ifdef SIGXCPU
- catch_signal (si, SIGXCPU, restore_real_vroot_handler);
-#endif
-#ifdef SIGXFSZ
- catch_signal (si, SIGXFSZ, restore_real_vroot_handler);
-#endif
-#ifdef SIGDANGER
- catch_signal (si, SIGDANGER, restore_real_vroot_handler);
-#endif
-}
-
-
-static RETSIGTYPE
-saver_sighup_handler (int sig)
-{
- saver_info *si = global_si_kludge; /* I hate C so much... */
-
- /* Re-establish SIGHUP handler */
- catch_signal (si, SIGHUP, saver_sighup_handler);
-
- fprintf (stderr, "%s: %s received: restarting...\n",
- blurb(), signal_name(sig));
-
- if (si->screen_blanked_p)
- {
- int i;
- for (i = 0; i < si->nscreens; i++)
- kill_screenhack (&si->screens[i]);
- unblank_screen (si);
- XSync (si->dpy, False);
- }
-
- restart_process (si); /* Does not return */
- abort ();
-}
-
-
-
-void
-saver_exit (saver_info *si, int status, const char *dump_core_reason)
-{
- saver_preferences *p = &si->prefs;
- static Bool exiting = False;
- Bool bugp;
- Bool vrs;
- if (exiting)
- exit(status);
-
- exiting = True;
-
- vrs = restore_real_vroot (si);
- emergency_kill_subproc (si);
- shutdown_stderr (si);
-
- if (p->verbose_p && vrs)
- fprintf (real_stderr, "%s: old vroot restored.\n", blurb());
-
-# ifdef HAVE_LIBSYSTEMD
- if (si->systemd_pid) /* Kill background xscreensaver-systemd process */
- {
- kill_job (si, si->systemd_pid, SIGTERM);
- si->systemd_pid = 0;
- }
-# endif
-
- fflush(real_stdout);
-
-#ifdef VMS /* on VMS, 1 is the "normal" exit code instead of 0. */
- if (status == 0) status = 1;
- else if (status == 1) status = -1;
-#endif
-
- bugp = !!dump_core_reason;
-
- if (si->prefs.debug_p && !dump_core_reason)
- dump_core_reason = "because of -debug";
-
- if (dump_core_reason)
- {
- /* Note that the Linux man page for setuid() says If uid is
- different from the old effective uid, the process will be
- forbidden from leaving core dumps.
- */
- char cwd[4096]; /* should really be PATH_MAX, but who cares. */
- cwd[0] = 0;
- fprintf(real_stderr, "%s: dumping core (%s)\n", blurb(),
- dump_core_reason);
-
- if (bugp)
- fprintf(real_stderr,
- "%s: see https://www.jwz.org/xscreensaver/bugs.html\n"
- "\t\t\tfor bug reporting information.\n\n",
- blurb());
-
-# if defined(HAVE_GETCWD)
- if (!getcwd (cwd, sizeof(cwd)))
-# elif defined(HAVE_GETWD)
- if (!getwd (cwd))
-# endif
- strcpy(cwd, "unknown.");
-
- fprintf (real_stderr, "%s: current directory is %s\n", blurb(), cwd);
- describe_uids (si, real_stderr);
-
- /* Do this to drop a core file, so that we can get a stack trace. */
- abort();
- }
-
- exit (status);
-}
-
-
-/* Managing the actual screensaver window */
-
-Bool
-window_exists_p (Display *dpy, Window window)
-{
- XErrorHandler old_handler;
- XWindowAttributes xgwa;
- xgwa.screen = 0;
- old_handler = XSetErrorHandler (BadWindow_ehandler);
- XGetWindowAttributes (dpy, window, &xgwa);
+ XChangeProperty (si->dpy, w, XA_SCREENSAVER_STATUS, XA_INTEGER, 32,
+ PropModeReplace, (unsigned char *) status, nitems2);
XSync (dpy, False);
- XSetErrorHandler (old_handler);
- return (xgwa.screen != 0);
-}
-
-static void
-store_saver_id (saver_screen_info *ssi)
-{
- XClassHint class_hints;
- saver_info *si = ssi->global;
- unsigned long pid = (unsigned long) getpid ();
- char buf[20];
- struct passwd *p = getpwuid (getuid ());
- const char *name, *host;
- char *id;
-# if defined(HAVE_UNAME)
- struct utsname uts;
-# endif /* UNAME */
-
- /* First store the name and class on the window.
- */
- class_hints.res_name = progname;
- class_hints.res_class = progclass;
- XSetClassHint (si->dpy, ssi->screensaver_window, &class_hints);
- XStoreName (si->dpy, ssi->screensaver_window, "screensaver");
-
- /* Then store the xscreensaver version number.
- */
- XChangeProperty (si->dpy, ssi->screensaver_window,
- XA_SCREENSAVER_VERSION,
- XA_STRING, 8, PropModeReplace,
- (unsigned char *) si->version,
- strlen (si->version));
-
- /* Now store the XSCREENSAVER_ID property, that says what user and host
- xscreensaver is running as.
- */
-
- if (p && p->pw_name && *p->pw_name)
- name = p->pw_name;
- else if (p)
- {
- sprintf (buf, "%lu", (unsigned long) p->pw_uid);
- name = buf;
- }
- else
- name = "???";
-
-# if defined(HAVE_UNAME)
- {
- if (uname (&uts) < 0)
- host = "???";
- else
- host = uts.nodename;
- }
-# elif defined(VMS)
- host = getenv("SYS$NODE");
-# else /* !HAVE_UNAME && !VMS */
- host = "???";
-# endif /* !HAVE_UNAME && !VMS */
-
- id = (char *) malloc (strlen(name) + strlen(host) + 50);
- sprintf (id, "%lu (%s@%s)", pid, name, host);
-
- XChangeProperty (si->dpy, ssi->screensaver_window,
- XA_SCREENSAVER_ID, XA_STRING,
- 8, PropModeReplace,
- (unsigned char *) id, strlen (id));
- free (id);
-}
-
-
-void
-store_saver_status (saver_info *si)
-{
- PROP32 *status;
- int size = si->nscreens + 2;
- int i;
- status = (PROP32 *) calloc (size, sizeof(PROP32));
-
- status[0] = (PROP32) (si->screen_blanked_p || si->locked_p
- ? (si->locked_p ? XA_LOCK : XA_BLANK)
- : 0);
- status[1] = (PROP32) si->blank_time;
-
- for (i = 0; i < si->nscreens; i++)
+ if (si->prefs.debug_p && si->prefs.verbose_p)
{
- saver_screen_info *ssi = &si->screens[i];
- status [2 + i] = ssi->current_hack + 1;
+ int i;
+ fprintf (stderr, "%s: wrote status property: 0x%lx: %s", blurb(),
+ (unsigned long) w,
+ (status[0] == XA_LOCK ? "LOCK" :
+ status[0] == XA_BLANK ? "BLANK" :
+ status[0] == 0 ? "0" : "???"));
+ for (i = 1; i < nitems; i++)
+ fprintf (stderr, ", %lu", status[i]);
+ fprintf (stderr, "\n");
}
- XChangeProperty (si->dpy,
- RootWindow (si->dpy, 0), /* always screen #0 */
- XA_SCREENSAVER_STATUS,
- XA_INTEGER, 32, PropModeReplace,
- (unsigned char *) status, size);
free (status);
+ if (dataP)
+ XFree (dataP);
}
-static Bool error_handler_hit_p = False;
-
-static int
-ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
-{
- error_handler_hit_p = True;
- return 0;
-}
-
-
-/* Returns True if successful, False if an X error occurred.
- We need this because other programs might have done things to
- our window that will cause XChangeWindowAttributes() to fail:
- if that happens, we give up, destroy the window, and re-create
- it.
- */
-static Bool
-safe_XChangeWindowAttributes (Display *dpy, Window window,
- unsigned long mask,
- XSetWindowAttributes *attrs)
-{
- XErrorHandler old_handler;
- XSync (dpy, False);
- error_handler_hit_p = False;
- old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
-
- XChangeWindowAttributes (dpy, window, mask, attrs);
-
- XSync (dpy, False);
- XSetErrorHandler (old_handler);
- XSync (dpy, False);
-
- return (!error_handler_hit_p);
-}
-
-
-/* This might not be necessary, but just in case. */
-static Bool
-safe_XConfigureWindow (Display *dpy, Window window,
- unsigned long mask, XWindowChanges *changes)
-{
- XErrorHandler old_handler;
- XSync (dpy, False);
- error_handler_hit_p = False;
- old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
-
- XConfigureWindow (dpy, window, mask, changes);
-
- XSync (dpy, False);
- XSetErrorHandler (old_handler);
- XSync (dpy, False);
-
- return (!error_handler_hit_p);
-}
-
-/* This might not be necessary, but just in case. */
-static Bool
-safe_XDestroyWindow (Display *dpy, Window window)
-{
- XErrorHandler old_handler;
- XSync (dpy, False);
- error_handler_hit_p = False;
- old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
-
- XDestroyWindow (dpy, window);
-
- XSync (dpy, False);
- XSetErrorHandler (old_handler);
- XSync (dpy, False);
-
- return (!error_handler_hit_p);
-}
-
-
-static Bool
-safe_XKillClient (Display *dpy, XID id)
-{
- XErrorHandler old_handler;
- XSync (dpy, False);
- error_handler_hit_p = False;
- old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
-
- XKillClient (dpy, id);
-
- XSync (dpy, False);
- XSetErrorHandler (old_handler);
- XSync (dpy, False);
-
- return (!error_handler_hit_p);
-}
-
-
-#ifdef HAVE_XF86VMODE
-Bool
-safe_XF86VidModeGetViewPort (Display *dpy, int screen, int *xP, int *yP)
-{
- Bool result;
- XErrorHandler old_handler;
- XSync (dpy, False);
- error_handler_hit_p = False;
- old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
-
- result = XF86VidModeGetViewPort (dpy, screen, xP, yP);
-
- XSync (dpy, False);
- XSetErrorHandler (old_handler);
- XSync (dpy, False);
-
- return (error_handler_hit_p
- ? False
- : result);
-}
-
-/* There is no "safe_XF86VidModeGetModeLine" because it fails with an
- untrappable I/O error instead of an X error -- so one must call
- safe_XF86VidModeGetViewPort first, and assume that both have the
- same error condition. Thank you XFree, may I have another.
- */
-
-#endif /* HAVE_XF86VMODE */
-
-
static void
initialize_screensaver_window_1 (saver_screen_info *ssi)
{
@@ -1207,7 +138,8 @@ initialize_screensaver_window_1 (saver_screen_info *ssi)
/* This resets the screensaver window as fully as possible, since there's
no way of knowing what some random client may have done to us in the
meantime. We could just destroy and recreate the window, but that has
- its own set of problems...
+ its own set of problems. (Update: that's exactly what we're doing
+ these days.)
*/
XColor black;
XSetWindowAttributes attrs;
@@ -1241,8 +173,7 @@ initialize_screensaver_window_1 (saver_screen_info *ssi)
if (ssi->cmap)
{
XFreeColors (si->dpy, ssi->cmap, &ssi->black_pixel, 1, 0);
- if (ssi->cmap != ssi->demo_cmap &&
- ssi->cmap != def_cmap)
+ if (ssi->cmap != def_cmap)
XFreeColormap (si->dpy, ssi->cmap);
}
ssi->cmap = def_cmap;
@@ -1253,20 +184,18 @@ initialize_screensaver_window_1 (saver_screen_info *ssi)
CWBackPixel | CWBackingPixel | CWBorderPixel);
attrs.override_redirect = True;
- /* When use_mit_saver_extension or use_sgi_saver_extension is true, we won't
- actually be reading these events during normal operation; but we still
- need to see Button events for demo-mode to work properly.
- */
attrs.event_mask = (KeyPressMask | KeyReleaseMask |
ButtonPressMask | ButtonReleaseMask |
PointerMotionMask);
- attrs.backing_store = NotUseful;
+ attrs.backing_store = Always;
attrs.colormap = ssi->cmap;
attrs.background_pixel = ssi->black_pixel;
attrs.backing_pixel = ssi->black_pixel;
attrs.border_pixel = ssi->black_pixel;
+ printed_visual_info = True; /* Too noisy */
+
if (!p->verbose_p || printed_visual_info)
;
else if (ssi->current_visual == DefaultVisualOfScreen (ssi->screen))
@@ -1287,56 +216,11 @@ initialize_screensaver_window_1 (saver_screen_info *ssi)
}
printed_visual_info = True;
-#ifdef HAVE_MIT_SAVER_EXTENSION
- if (si->using_mit_saver_extension)
+ if (ssi->error_dialog)
{
- XScreenSaverInfo *info;
- Window root = RootWindowOfScreen (ssi->screen);
-
-#if 0
- /* This call sets the server screensaver timeouts to what we think
- they should be (based on the resources and args xscreensaver was
- started with.) It's important that we do this to sync back up
- with the server - if we have turned on prematurely, as by an
- ACTIVATE ClientMessage, then the server may decide to activate
- the screensaver while it's already active. That's ok for us,
- since we would know to ignore that ScreenSaverActivate event,
- but a side effect of this would be that the server would map its
- saver window (which we then hide again right away) meaning that
- the bits currently on the screen get blown away. Ugly. */
-
- /* #### Ok, that doesn't work - when we tell the server that the
- screensaver is "off" it sends us a Deactivate event, which is
- sensible... but causes the saver to never come on. Hmm. */
- disable_builtin_screensaver (si, True);
-#endif /* 0 */
-
-#if 0
- /* #### The MIT-SCREEN-SAVER extension gives us access to the
- window that the server itself uses for saving the screen.
- However, using this window in any way, in particular, calling
- XScreenSaverSetAttributes() as below, tends to make the X server
- crash. So fuck it, let's try and get along without using it...
-
- It's also inconvenient to use this window because it doesn't
- always exist (though the ID is constant.) So to use this
- window, we'd have to reimplement the ACTIVATE ClientMessage to
- tell the *server* to tell *us* to turn on, to cause the window
- to get created at the right time. Gag. */
- XScreenSaverSetAttributes (si->dpy, root,
- 0, 0, width, height, 0,
- current_depth, InputOutput, visual,
- attrmask, &attrs);
- XSync (si->dpy, False);
-#endif /* 0 */
-
- info = XScreenSaverAllocInfo ();
- XScreenSaverQueryInfo (si->dpy, root, info);
- ssi->server_mit_saver_window = info->window;
- if (! ssi->server_mit_saver_window) abort ();
- XFree (info);
+ XDestroyWindow (si->dpy, ssi->error_dialog);
+ ssi->error_dialog = 0;
}
-#endif /* HAVE_MIT_SAVER_EXTENSION */
if (ssi->screensaver_window)
{
@@ -1348,10 +232,13 @@ initialize_screensaver_window_1 (saver_screen_info *ssi)
changes.height = ssi->height;
changes.border_width = 0;
- if (! (safe_XConfigureWindow (si->dpy, ssi->screensaver_window,
- changesmask, &changes) &&
- safe_XChangeWindowAttributes (si->dpy, ssi->screensaver_window,
- attrmask, &attrs)))
+ /* XConfigureWindow and XChangeWindowAttributes can fail if a hack did
+ something weird to the window. In that case, we must destroy and
+ re-create it. */
+ if (! (XConfigureWindow (si->dpy, ssi->screensaver_window,
+ changesmask, &changes) &&
+ XChangeWindowAttributes (si->dpy, ssi->screensaver_window,
+ attrmask, &attrs)))
{
horked_window = ssi->screensaver_window;
ssi->screensaver_window = 0;
@@ -1365,35 +252,31 @@ initialize_screensaver_window_1 (saver_screen_info *ssi)
ssi->x, ssi->y, ssi->width, ssi->height,
0, ssi->current_depth, InputOutput,
ssi->current_visual, attrmask, &attrs);
- reset_stderr (ssi);
+ xscreensaver_set_wm_atoms (si->dpy, ssi->screensaver_window,
+ ssi->width, ssi->height, 0);
if (horked_window)
{
fprintf (stderr,
"%s: someone horked our saver window (0x%lx)! Recreating it...\n",
blurb(), (unsigned long) horked_window);
- maybe_transfer_grabs (ssi, horked_window, ssi->screensaver_window,
- ssi->number);
- safe_XDestroyWindow (si->dpy, horked_window);
- horked_window = 0;
+ XDestroyWindow (si->dpy, horked_window);
}
- if (p->verbose_p)
- fprintf (stderr, "%s: %d: saver window is 0x%lx.\n",
+ if (p->verbose_p > 1)
+ fprintf (stderr, "%s: %d: saver window is 0x%lx\n",
blurb(), ssi->number,
(unsigned long) ssi->screensaver_window);
}
- store_saver_id (ssi); /* store window name and IDs */
-
if (!ssi->cursor)
{
- Pixmap bit;
- bit = XCreatePixmapFromBitmapData (si->dpy, ssi->screensaver_window,
- "\000", 1, 1,
- BlackPixelOfScreen (ssi->screen),
- BlackPixelOfScreen (ssi->screen),
- 1);
+ Pixmap bit =
+ XCreatePixmapFromBitmapData (si->dpy, ssi->screensaver_window,
+ "\000", 1, 1,
+ BlackPixelOfScreen (ssi->screen),
+ BlackPixelOfScreen (ssi->screen),
+ 1);
ssi->cursor = XCreatePixmapCursor (si->dpy, bit, bit, &black, &black,
0, 0);
XFreePixmap (si->dpy, bit);
@@ -1407,6 +290,7 @@ initialize_screensaver_window_1 (saver_screen_info *ssi)
XDefineCursor (si->dpy, ssi->screensaver_window, ssi->cursor);
}
+
void
initialize_screensaver_window (saver_info *si)
{
@@ -1416,6 +300,27 @@ initialize_screensaver_window (saver_info *si)
}
+static void
+raise_window (saver_screen_info *ssi)
+{
+ saver_info *si = ssi->global;
+ if (ssi->error_dialog)
+ {
+ /* Make the error be topmost, and the saver be directly below it. */
+ Window windows[2];
+ windows[0] = ssi->error_dialog;
+ windows[1] = ssi->screensaver_window;
+ XMapRaised (si->dpy, windows[0]);
+ XRestackWindows (si->dpy, windows, countof(windows));
+ }
+ else
+ XMapRaised (si->dpy, ssi->screensaver_window);
+
+ if (ssi->cmap)
+ XInstallColormap (si->dpy, ssi->cmap);
+}
+
+
/* Called when the RANDR (Resize and Rotate) extension tells us that
the size of the screen has changed while the screen was blanked.
Call update_screen_layout() first, then call this to synchronize
@@ -1470,8 +375,8 @@ resize_screensaver_window (saver_info *si)
xgwa.width, xgwa.height, xgwa.x, xgwa.y,
ssi->width, ssi->height, ssi->x, ssi->y);
- if (! safe_XConfigureWindow (si->dpy, ssi->screensaver_window,
- changesmask, &changes))
+ if (! XConfigureWindow (si->dpy, ssi->screensaver_window,
+ changesmask, &changes))
fprintf (stderr, "%s: %d: someone horked our saver window"
" (0x%lx)! Unable to resize it!\n",
blurb(), i, (unsigned long) ssi->screensaver_window);
@@ -1485,27 +390,10 @@ resize_screensaver_window (saver_info *si)
Note that spawn_screenhack() calls select_visual() which may destroy
and re-create the window via initialize_screensaver_window_1().
*/
- if (si->screen_blanked_p)
- {
- if (ssi->cmap)
- XInstallColormap (si->dpy, ssi->cmap);
- XMapRaised (si->dpy, ssi->screensaver_window);
- XSync (si->dpy, False);
- if (! ssi->pid)
- spawn_screenhack (ssi);
-
- /* Make sure the act of adding a screen doesn't present as
- pointer motion (and thus cause an unblank). */
- {
- Window root, child;
- int x, y;
- unsigned int mask;
- XQueryPointer (si->dpy, ssi->screensaver_window, &root, &child,
- &ssi->last_poll_mouse.root_x,
- &ssi->last_poll_mouse.root_y,
- &x, &y, &mask);
- }
- }
+ raise_window (ssi);
+ XSync (si->dpy, False);
+ if (! ssi->pid)
+ spawn_screenhack (ssi);
}
/* Kill off any savers running on no-longer-extant monitors.
@@ -1518,44 +406,47 @@ resize_screensaver_window (saver_info *si)
if (ssi->screensaver_window)
{
XUnmapWindow (si->dpy, ssi->screensaver_window);
- restore_real_vroot_1 (ssi);
}
}
}
-void
-raise_window (saver_info *si,
- Bool inhibit_fade, Bool between_hacks_p, Bool dont_clear)
+static void
+raise_windows (saver_info *si)
{
- saver_preferences *p = &si->prefs;
int i;
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ raise_window (ssi);
+ }
+}
- if (si->demoing_p)
- inhibit_fade = True;
-
- if (si->emergency_lock_p)
- inhibit_fade = True;
- if (!dont_clear)
- initialize_screensaver_window (si);
+/* Called only once, before the main loop begins.
+ */
+void
+blank_screen (saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+ Bool user_active_p = False;
+ int i;
- reset_watchdog_timer (si, True);
+ initialize_screensaver_window (si);
+ sync_server_dpms_settings (si->dpy, p);
- if (p->fade_p && si->fading_possible_p && !inhibit_fade)
+ if (p->fade_p &&
+ !si->demoing_p &&
+ !si->emergency_p)
{
Window *current_windows = (Window *)
- calloc(sizeof(Window), si->nscreens);
- Colormap *current_maps = (Colormap *)
- calloc(sizeof(Colormap), si->nscreens);
+ malloc (si->nscreens * sizeof(*current_windows));
+ if (!current_windows) abort();
for (i = 0; i < si->nscreens; i++)
{
saver_screen_info *ssi = &si->screens[i];
current_windows[i] = ssi->screensaver_window;
- current_maps[i] = (between_hacks_p
- ? ssi->cmap
- : DefaultColormapOfScreen (ssi->screen));
/* Ensure that the default background of the window is really black,
not a pixmap or something. (This does not clear the window.) */
XSetWindowBackground (si->dpy, ssi->screensaver_window,
@@ -1564,282 +455,98 @@ raise_window (saver_info *si,
if (p->verbose_p) fprintf (stderr, "%s: fading...\n", blurb());
- XGrabServer (si->dpy); /* ############ DANGER! */
-
- /* Clear the stderr layer on each screen.
- */
- if (!dont_clear)
- for (i = 0; i < si->nscreens; i++)
- {
- saver_screen_info *ssi = &si->screens[i];
- if (ssi->stderr_overlay_window)
- /* Do this before the fade, since the stderr cmap won't fade
- even if we uninstall it (beats me...) */
- clear_stderr (ssi);
- }
-
- /* Note! The server is grabbed, and this will take several seconds
- to complete! */
- fade_screens (si->dpy, current_maps,
- current_windows, si->nscreens,
- p->fade_seconds/1000, p->fade_ticks, True, !dont_clear);
-
- free(current_maps);
- free(current_windows);
- current_maps = 0;
- current_windows = 0;
-
- if (p->verbose_p) fprintf (stderr, "%s: fading done.\n", blurb());
-
-#ifdef HAVE_MIT_SAVER_EXTENSION
- for (i = 0; i < si->nscreens; i++)
- {
- saver_screen_info *ssi = &si->screens[i];
- if (ssi->server_mit_saver_window &&
- window_exists_p (si->dpy, ssi->server_mit_saver_window))
- XUnmapWindow (si->dpy, ssi->server_mit_saver_window);
- }
-#endif /* HAVE_MIT_SAVER_EXTENSION */
-
- XUngrabServer (si->dpy);
- XSync (si->dpy, False); /* ###### (danger over) */
- }
- else
- {
- for (i = 0; i < si->nscreens; i++)
- {
- saver_screen_info *ssi = &si->screens[i];
- if (!dont_clear)
- XClearWindow (si->dpy, ssi->screensaver_window);
- if (!dont_clear || ssi->stderr_overlay_window)
- clear_stderr (ssi);
- XMapRaised (si->dpy, ssi->screensaver_window);
- XSync (si->dpy, False);
-#ifdef HAVE_MIT_SAVER_EXTENSION
- if (ssi->server_mit_saver_window &&
- window_exists_p (si->dpy, ssi->server_mit_saver_window))
- XUnmapWindow (si->dpy, ssi->server_mit_saver_window);
-#endif /* HAVE_MIT_SAVER_EXTENSION */
- }
- }
-
- for (i = 0; i < si->nscreens; i++)
- {
- saver_screen_info *ssi = &si->screens[i];
- if (ssi->cmap)
- XInstallColormap (si->dpy, ssi->cmap);
+ /* This will take several seconds to complete. */
+ user_active_p = fade_screens (si->app, si->dpy,
+ current_windows, si->nscreens,
+ p->fade_seconds / 1000.0,
+ True, /* out_p */
+ True, /* from_desktop_p */
+ &si->fade_state);
+ free (current_windows);
+
+ if (!p->verbose_p)
+ ;
+ else if (user_active_p)
+ fprintf (stderr, "%s: fading aborted\n", blurb());
+ else
+ fprintf (stderr, "%s: fading done\n", blurb());
}
-}
+ raise_windows (si);
+ reset_watchdog_timer (si);
-int
-mouse_screen (saver_info *si)
-{
- saver_preferences *p = &si->prefs;
- Window pointer_root, pointer_child;
- int root_x, root_y, win_x, win_y;
- unsigned int mask;
- int i;
-
- if (si->nscreens == 1)
- return 0;
+ /* user_active_p means that the user aborted the fade-out -- but that does
+ not mean that we are necessarily about to exit. If we are locking, then
+ the user activity will cause the unlock dialog to appear, but
+ authentication might not succeed. */
for (i = 0; i < si->nscreens; i++)
- {
- saver_screen_info *ssi = &si->screens[i];
- if (XQueryPointer (si->dpy, RootWindowOfScreen (ssi->screen),
- &pointer_root, &pointer_child,
- &root_x, &root_y, &win_x, &win_y, &mask) &&
- root_x >= ssi->x &&
- root_y >= ssi->y &&
- root_x < ssi->x + ssi->width &&
- root_y < ssi->y + ssi->height)
- {
- if (p->verbose_p)
- fprintf (stderr, "%s: mouse is on screen %d of %d\n",
- blurb(), i, si->nscreens);
- return i;
- }
- }
-
- /* couldn't figure out where the mouse is? Oh well. */
- return 0;
-}
-
-static int
-get_idle_time (saver_info *si)
-{
- int ret = 0;
- XScreenSaverInfo *info;
- info = XScreenSaverAllocInfo ();
- if (info != NULL && XScreenSaverQueryInfo (si->dpy, DefaultRootWindow (si->dpy), info))
- ret = info->idle / 1000;
- XFree (info);
- return ret;
-}
-
-Bool
-blank_screen (saver_info *si)
-{
- int i;
- Bool ok;
- Window w;
- int mscreen;
- int idle_s = 0;
- Bool screen_on = True;
- const char *euc = si->prefs.external_ungrab_command;
-
- if (euc && *euc)
- {
- screen_on = monitor_powered_on_p (si);
- if (screen_on)
- idle_s = get_idle_time(si);
- }
- /* Note: we do our grabs on the root window, not on the screensaver window.
- If we grabbed on the saver window, then the demo mode and lock dialog
- boxes wouldn't get any events.
-
- By "the root window", we mean "the root window that contains the mouse."
- We use to always grab the mouse on screen 0, but that has the effect of
- moving the mouse to screen 0 from whichever screen it was on, on
- multi-head systems.
- */
- mscreen = mouse_screen (si);
- w = RootWindowOfScreen(si->screens[mscreen].screen);
- ok = grab_keyboard_and_mouse (si, w,
- (si->demoing_p ? 0 : si->screens[0].cursor),
- mscreen);
-
-
-# if 0
- if (si->using_mit_saver_extension || si->using_sgi_saver_extension)
- /* If we're using a server extension, then failure to get a grab is
- not a big deal -- even without the grab, we will still be able
- to un-blank when there is user activity, since the server will
- tell us. */
- /* #### No, that's not true: if we don't have a keyboard grab,
- then we can't read passwords to unlock.
- */
- ok = True;
-# endif /* 0 */
-
- if (!ok)
- return False;
-
- if (euc && *euc)
- {
- /* ungrab hooks might have messed up idle time -- account for that.
- this might look like the math is backwards, but this handles both
- cases -- ungrab hook did mess up idle time, and ungrab hook
- did *not* mess up idle time. In the latter case the value will be
- zero or negative, so it gets clamped to zero.
- */
- if (screen_on)
- {
- saver_preferences *p = &si->prefs;
- store_dpms_offset (idle_s - get_idle_time(si));
- sync_server_dpms_settings (si->dpy,
- (p->dpms_enabled_p &&
- p->mode != DONT_BLANK),
- p->dpms_quickoff_p,
- p->dpms_standby / 1000,
- p->dpms_suspend / 1000,
- p->dpms_off / 1000,
- False);
- }
- else /* screen was off before, might have been turned on by fake events */
- monitor_power_on (si, False);
- }
-
- for (i = 0; i < si->nscreens; i++)
- {
- saver_screen_info *ssi = &si->screens[i];
- if (ssi->real_screen_p)
- save_real_vroot (ssi);
- store_vroot_property (si->dpy,
- ssi->screensaver_window,
- ssi->screensaver_window);
-
-#ifdef HAVE_XF86VMODE
- {
- int ev, er;
- if (!XF86VidModeQueryExtension (si->dpy, &ev, &er) ||
- !safe_XF86VidModeGetViewPort (si->dpy, i,
- &ssi->blank_vp_x,
- &ssi->blank_vp_y))
- ssi->blank_vp_x = ssi->blank_vp_y = -1;
- }
-#endif /* HAVE_XF86VMODE */
- }
+ /* This also queues each screen's cycle_timer. */
+ spawn_screenhack (&si->screens[i]);
- raise_window (si, False, False, False);
+ /* Turn off "next" and "prev" modes after they have happened once. */
+ if (si->selection_mode < 0)
+ si->selection_mode = 0;
- si->screen_blanked_p = True;
- si->blank_time = time ((time_t *) 0);
- si->last_wall_clock_time = 0;
-
- store_saver_status (si); /* store blank time */
-
- return True;
+ /* If we are blanking only, optionally power down monitor right now. */
+ if (p->mode == BLANK_ONLY &&
+ p->dpms_quickoff_p)
+ monitor_power_on (si, False);
}
+/* Called only once, upon receipt of SIGTERM, just before exiting.
+ */
void
unblank_screen (saver_info *si)
{
saver_preferences *p = &si->prefs;
- Bool unfade_p = (si->fading_possible_p && p->unfade_p);
+ Bool unfade_p = p->unfade_p;
int i;
- store_dpms_offset (0);
monitor_power_on (si, True);
- reset_watchdog_timer (si, False);
if (si->demoing_p)
unfade_p = False;
if (unfade_p)
{
+ double seconds = p->fade_seconds / 1000.0;
+ double ratio = 1/3.0;
Window *current_windows = (Window *)
calloc(sizeof(Window), si->nscreens);
+ Bool interrupted_p = False;
for (i = 0; i < si->nscreens; i++)
{
saver_screen_info *ssi = &si->screens[i];
current_windows[i] = ssi->screensaver_window;
- /* Ensure that the default background of the window is really black,
- not a pixmap or something. (This does not clear the window.) */
- XSetWindowBackground (si->dpy, ssi->screensaver_window,
- ssi->black_pixel);
}
if (p->verbose_p) fprintf (stderr, "%s: unfading...\n", blurb());
+ monitor_power_on (si, True);
+
+ /* When we fade in to the desktop, first fade out from the saver to
+ black, then fade in from black to the desktop. */
+ interrupted_p = fade_screens (si->app, si->dpy,
+ current_windows, si->nscreens,
+ seconds * ratio,
+ True, /* out_p */
+ False, /* from_desktop_p */
+ &si->fade_state);
+ if (! interrupted_p)
+ interrupted_p = fade_screens (si->app, si->dpy,
+ current_windows, si->nscreens,
+ seconds * (1-ratio),
+ False, /* out_p */
+ False, /* from_desktop_p */
+ &si->fade_state);
+ free (current_windows);
- XSync (si->dpy, False);
- XGrabServer (si->dpy); /* ############ DANGER! */
- XSync (si->dpy, False);
-
- /* Clear the stderr layer on each screen.
- */
- for (i = 0; i < si->nscreens; i++)
- {
- saver_screen_info *ssi = &si->screens[i];
- clear_stderr (ssi);
- }
-
- XUngrabServer (si->dpy);
- XSync (si->dpy, False); /* ###### (danger over) */
-
- fade_screens (si->dpy, 0,
- current_windows, si->nscreens,
- p->fade_seconds/1000, p->fade_ticks,
- False, False);
-
- free(current_windows);
- current_windows = 0;
-
- if (p->verbose_p) fprintf (stderr, "%s: unfading done.\n", blurb());
+ if (p->verbose_p)
+ fprintf (stderr, "%s: unfading done%s\n", blurb(),
+ (interrupted_p ? " (interrupted)" : ""));
}
else
{
@@ -1850,118 +557,33 @@ unblank_screen (saver_info *si)
{
Colormap c = DefaultColormapOfScreen (ssi->screen);
/* avoid technicolor */
+ XSetWindowBackground (si->dpy, ssi->screensaver_window,
+ BlackPixelOfScreen (ssi->screen));
XClearWindow (si->dpy, ssi->screensaver_window);
if (c) XInstallColormap (si->dpy, c);
}
XUnmapWindow (si->dpy, ssi->screensaver_window);
}
}
-
-
- /* If the focus window does has a non-default colormap, then install
- that colormap as well. (On SGIs, this will cause both the root map
- and the focus map to be installed simultaneously. It'd be nice to
- pick up the other colormaps that had been installed, too; perhaps
- XListInstalledColormaps could be used for that?)
- */
- {
- Window focus = 0;
- int revert_to;
- XSync (si->dpy, False);
- XGetInputFocus (si->dpy, &focus, &revert_to);
- if (focus && focus != PointerRoot && focus != None)
- {
- XErrorHandler old_handler = XSetErrorHandler (BadWindow_ehandler);
- XWindowAttributes xgwa;
- xgwa.colormap = 0;
- if (XGetWindowAttributes (si->dpy, focus, &xgwa) &&
- xgwa.colormap &&
- xgwa.colormap != DefaultColormapOfScreen (xgwa.screen))
- XInstallColormap (si->dpy, xgwa.colormap);
- XSetErrorHandler (old_handler);
- }
- }
-
-
- for (i = 0; i < si->nscreens; i++)
- {
- saver_screen_info *ssi = &si->screens[i];
- kill_xsetroot_data (si->dpy, ssi->screensaver_window, p->verbose_p);
- }
-
- store_saver_status (si); /* store unblank time */
- ungrab_keyboard_and_mouse (si);
- restore_real_vroot (si);
-
- /* Unmap the windows a second time, dammit -- just to avoid a race
- with the screen-grabbing hacks. (I'm not sure if this is really
- necessary; I'm stabbing in the dark now.)
- */
- for (i = 0; i < si->nscreens; i++)
- XUnmapWindow (si->dpy, si->screens[i].screensaver_window);
-
- si->screen_blanked_p = False;
- si->blank_time = time ((time_t *) 0);
- si->last_wall_clock_time = 0;
-
- store_saver_status (si); /* store unblank time */
-}
-
-
-/* Transfer any grabs from the old window to the new.
- Actually I think none of this is necessary, since we always
- hold our grabs on the root window, but I wrote this before
- re-discovering that...
- */
-static void
-maybe_transfer_grabs (saver_screen_info *ssi,
- Window old_w, Window new_w,
- int new_screen_no)
-{
- saver_info *si = ssi->global;
-
- /* If the old window held our mouse grab, transfer the grab to the new
- window. (Grab the server while so doing, to avoid a race condition.)
- */
- if (old_w == si->mouse_grab_window)
- {
- XGrabServer (si->dpy); /* ############ DANGER! */
- ungrab_mouse (si);
- grab_mouse (si, ssi->screensaver_window,
- (si->demoing_p ? 0 : ssi->cursor),
- new_screen_no);
- XUngrabServer (si->dpy);
- XSync (si->dpy, False); /* ###### (danger over) */
- }
-
- /* If the old window held our keyboard grab, transfer the grab to the new
- window. (Grab the server while so doing, to avoid a race condition.)
- */
- if (old_w == si->keyboard_grab_window)
- {
- XGrabServer (si->dpy); /* ############ DANGER! */
- ungrab_kbd(si);
- grab_kbd(si, ssi->screensaver_window, ssi->number);
- XUngrabServer (si->dpy);
- XSync (si->dpy, False); /* ###### (danger over) */
- }
}
static Visual *
get_screen_gl_visual (saver_info *si, int real_screen_number)
{
- int i;
int nscreens = ScreenCount (si->dpy);
if (! si->best_gl_visuals)
- si->best_gl_visuals = (Visual **)
- calloc (nscreens + 1, sizeof (*si->best_gl_visuals));
+ {
+ int i;
+ si->best_gl_visuals = (Visual **)
+ calloc (nscreens + 1, sizeof (*si->best_gl_visuals));
- for (i = 0; i < nscreens; i++)
- if (! si->best_gl_visuals[i])
- si->best_gl_visuals[i] =
- get_best_gl_visual (si, ScreenOfDisplay (si->dpy, i));
+ for (i = 0; i < nscreens; i++)
+ if (! si->best_gl_visuals[i])
+ si->best_gl_visuals[i] =
+ get_best_gl_visual (si, ScreenOfDisplay (si->dpy, i));
+ }
if (real_screen_number < 0 || real_screen_number >= nscreens) abort();
return si->best_gl_visuals[real_screen_number];
@@ -1999,28 +621,21 @@ select_visual (saver_screen_info *ssi, const char *visual_name)
if (visual_name && *visual_name)
{
- if (!strcmp(visual_name, "default-i") ||
- !strcmp(visual_name, "Default-i") ||
- !strcmp(visual_name, "Default-I")
- )
+ if (!strcasecmp(visual_name, "default-i"))
{
visual_name = "default";
install_cmap_p = True;
}
- else if (!strcmp(visual_name, "default-n") ||
- !strcmp(visual_name, "Default-n") ||
- !strcmp(visual_name, "Default-N"))
+ else if (!strcasecmp(visual_name, "default-n"))
{
visual_name = "default";
install_cmap_p = False;
}
- else if (!strcmp(visual_name, "gl") ||
- !strcmp(visual_name, "Gl") ||
- !strcmp(visual_name, "GL"))
+ else if (!strcasecmp(visual_name, "GL"))
{
new_v = get_screen_gl_visual (si, ssi->real_screen_number);
if (!new_v && p->verbose_p)
- fprintf (stderr, "%s: no GL visuals.\n", progname);
+ fprintf (stderr, "%s: no GL visuals\n", blurb());
}
if (!new_v)
@@ -2052,8 +667,10 @@ select_visual (saver_screen_info *ssi, const char *visual_name)
if (p->verbose_p)
{
+#if 0
fprintf (stderr, "%s: %d: visual ", blurb(), ssi->number);
describe_visual (stderr, ssi->screen, new_v, install_cmap_p);
+#endif
#if 0
fprintf (stderr, "%s: from ", blurb());
describe_visual (stderr, ssi->screen, ssi->current_visual,
@@ -2061,39 +678,334 @@ select_visual (saver_screen_info *ssi, const char *visual_name)
#endif
}
- reset_stderr (ssi);
ssi->current_visual = new_v;
ssi->current_depth = visual_depth(ssi->screen, new_v);
ssi->cmap = 0;
ssi->screensaver_window = 0;
initialize_screensaver_window_1 (ssi);
-
- /* stderr_overlay_window is a child of screensaver_window, so we need
- to destroy that as well (actually, we just need to invalidate and
- drop our pointers to it, but this will destroy it, which is ok so
- long as it happens before old_w itself is destroyed.) */
- reset_stderr (ssi);
-
- raise_window (si, True, True, False);
- store_vroot_property (si->dpy,
- ssi->screensaver_window, ssi->screensaver_window);
-
- /* Transfer any grabs from the old window to the new. */
- maybe_transfer_grabs (ssi, old_w, ssi->screensaver_window, ssi->number);
+ raise_window (ssi);
/* Now we can destroy the old window without horking our grabs. */
XDestroyWindow (si->dpy, old_w);
- if (p->verbose_p)
- fprintf (stderr, "%s: %d: destroyed old saver window 0x%lx.\n",
+ if (p->verbose_p > 1)
+ fprintf (stderr, "%s: %d: destroyed old saver window 0x%lx\n",
blurb(), ssi->number, (unsigned long) old_w);
if (old_c &&
- old_c != DefaultColormapOfScreen (ssi->screen) &&
- old_c != ssi->demo_cmap)
+ old_c != DefaultColormapOfScreen (ssi->screen))
XFreeColormap (si->dpy, old_c);
}
return got_it;
}
+
+
+/* Synchronize the contents of si->ssi to the current state of the monitors.
+ Doesn't change anything if nothing has changed; otherwise, alters and
+ reuses existing saver_screen_info structs as much as possible.
+ Returns True if anything changed.
+ */
+Bool
+update_screen_layout (saver_info *si)
+{
+ monitor **monitors = scan_monitors (si->dpy);
+ int count = 0;
+ int good_count = 0;
+ int i, j;
+ int seen_screens[100] = { 0, };
+
+ if (! monitor_layouts_differ_p (monitors, si->monitor_layout))
+ {
+ free_monitors (monitors);
+ return False;
+ }
+
+ free_monitors (si->monitor_layout);
+ si->monitor_layout = monitors;
+ check_monitor_sanity (si->monitor_layout);
+
+ while (monitors[count])
+ {
+ if (monitors[count]->sanity == S_SANE)
+ good_count++;
+ count++;
+ }
+
+ if (si->ssi_count == 0)
+ {
+ si->ssi_count = 10;
+ si->screens = (saver_screen_info *)
+ calloc (sizeof(*si->screens), si->ssi_count);
+ }
+
+ if (si->ssi_count <= good_count)
+ {
+ si->ssi_count = good_count + 10;
+ si->screens = (saver_screen_info *)
+ realloc (si->screens, sizeof(*si->screens) * si->ssi_count);
+ memset (si->screens + si->nscreens, 0,
+ sizeof(*si->screens) * (si->ssi_count - si->nscreens));
+ }
+
+ if (! si->screens) abort();
+
+ si->nscreens = good_count;
+
+ /* Regenerate the list of GL visuals as needed. */
+ if (si->best_gl_visuals)
+ free (si->best_gl_visuals);
+ si->best_gl_visuals = 0;
+
+ for (i = 0, j = 0; i < count; i++)
+ {
+ monitor *m = monitors[i];
+ saver_screen_info *ssi = &si->screens[j];
+ int sn;
+ if (monitors[i]->sanity != S_SANE) continue;
+
+ ssi->global = si;
+ ssi->number = j;
+
+ sn = screen_number (m->screen);
+ ssi->screen = m->screen;
+ ssi->real_screen_number = sn;
+ ssi->real_screen_p = (seen_screens[sn] == 0);
+ seen_screens[sn]++;
+
+ ssi->default_visual =
+ get_visual_resource (ssi->screen, "visualID", "VisualID", False);
+ ssi->current_visual = ssi->default_visual;
+ ssi->current_depth = visual_depth (ssi->screen, ssi->current_visual);
+
+ ssi->x = m->x;
+ ssi->y = m->y;
+ ssi->width = m->width;
+ ssi->height = m->height;
+
+# ifndef DEBUG_MULTISCREEN
+ {
+ saver_preferences *p = &si->prefs;
+ if (p->debug_p
+# ifdef QUAD_MODE
+ && !p->quad_p
+# endif
+ )
+ ssi->width /= 2;
+ }
+# endif
+
+ j++;
+ }
+
+ return True;
+}
+
+
+/* When the screensaver is active, this timer will periodically change
+ the running program. Each screen has its own timer.
+ */
+void
+cycle_timer (XtPointer closure, XtIntervalId *id)
+{
+ saver_screen_info *ssi = (saver_screen_info *) closure;
+ saver_info *si = ssi->global;
+
+ if (ssi->error_dialog)
+ {
+ XDestroyWindow (si->dpy, ssi->error_dialog);
+ ssi->error_dialog = 0;
+ }
+
+ maybe_reload_init_file (si);
+ kill_screenhack (ssi);
+ raise_window (ssi);
+
+ /* We could do a fade-out of just this screen here; but that would only work
+ if the fade method is SHM, not gamma or colormap. It would also only
+ look right if the cycle timers never fire at the same time, which is
+ currently the case. */
+
+ XSync (si->dpy, False);
+ spawn_screenhack (ssi); /* This also re-adds the cycle_id timer */
+}
+
+
+/* Called when a screenhack has exited unexpectedly.
+ We print a notification on the window, and in a little while, launch
+ a new hack (rather than waiting for the cycle timer to fire).
+ */
+void
+screenhack_obituary (saver_screen_info *ssi,
+ const char *name, const char *error)
+{
+ saver_info *si = ssi->global;
+ saver_preferences *p = &si->prefs;
+ Time how_long = p->cycle;
+ Time max = 1000 * 60; /* Message stays up no longer than this */
+ Window window;
+ Visual *visual;
+ XSetWindowAttributes attrs;
+ XWindowChanges changes;
+ unsigned long attrmask;
+ XftFont *font;
+ XftColor fg;
+ XftDraw *xftdraw;
+ XGlyphInfo overall;
+ XGCValues gcv;
+ GC gc;
+ char *fn, *cn;
+ char buf[255];
+ int x, y, pad;
+ int bw = 4;
+ Colormap cmap;
+
+ /* Restart the cycle timer, to take down the error dialog and launch
+ a new hack.
+ */
+ if (how_long > max)
+ how_long = max;
+ if (ssi->cycle_id)
+ XtRemoveTimeOut (ssi->cycle_id);
+ ssi->cycle_id =
+ XtAppAddTimeOut (si->app, how_long, cycle_timer, (XtPointer) ssi);
+ ssi->cycle_at = time ((time_t *) 0) + how_long / 1000;
+ if (p->verbose_p)
+ fprintf (stderr, "%s: %d: cycling in %lu sec\n", blurb(), ssi->number,
+ how_long / 1000);
+
+ /* Render an error message while we wait.
+
+ We can't just render text on top of ssi->screensaver_window because
+ if there was an OpenGL hack running on it, Xlib graphics might not
+ show up at all. Likewise, creating a sub-window doesn't work.
+ So it must be a top-level override-redirect window atop the saver.
+ */
+ cmap = ssi->cmap ? ssi->cmap : DefaultColormapOfScreen (ssi->screen);
+ window = ssi->error_dialog;
+ if (window) XDestroyWindow (si->dpy, window);
+ attrs.override_redirect = True;
+ attrs.background_pixel = ssi->black_pixel;
+ attrs.border_pixel = ssi->black_pixel;
+ attrs.backing_store = Always;
+ attrs.colormap = cmap;
+ attrmask = (CWOverrideRedirect | CWBackPixel | CWBorderPixel |
+ CWBackingStore | CWColormap);
+ visual = ssi->current_visual;
+ window = ssi->error_dialog =
+ XCreateWindow (si->dpy, RootWindowOfScreen (ssi->screen),
+ 0, 0, 1, 1, 0, ssi->current_depth, InputOutput, visual,
+ attrmask, &attrs);
+
+ fn = get_string_resource (si->dpy, "errorFont", "Font");
+ cn = get_string_resource (si->dpy, "errorColor", "Color");
+ if (!fn || !*fn) fn = strdup ("monospace bold 16");
+ if (!cn || !*cn) cn = strdup ("#FF0000");
+
+ font = load_xft_font_retry (si->dpy, screen_number (ssi->screen), fn);
+ XftColorAllocName (si->dpy, visual, cmap, cn, &fg);
+ xftdraw = XftDrawCreate (si->dpy, window, visual, cmap);
+
+ gcv.foreground =
+ get_pixel_resource (si->dpy, cmap, "errorColor", "Color");
+ gcv.line_width = bw;
+ gc = XCreateGC (si->dpy, window, GCForeground | GCLineWidth, &gcv);
+
+ sprintf (buf, "\"%.100s\" %.100s", name, error);
+
+ XftTextExtentsUtf8 (si->dpy, font, (FcChar8 *) buf, strlen(buf), &overall);
+ x = (ssi->width - overall.width) / 2;
+ y = (ssi->height - overall.height) / 2 + font->ascent;
+ pad = bw + font->ascent * 2;
+
+ attrmask = CWX | CWY | CWWidth | CWHeight;
+ changes.x = ssi->x + x - pad;
+ changes.y = ssi->y + y - (font->ascent + pad);
+ changes.width = overall.width + pad * 2;
+ changes.height = font->ascent + font->descent + pad * 2;
+ XConfigureWindow (si->dpy, window, attrmask, &changes);
+ xscreensaver_set_wm_atoms (si->dpy, window, changes.width, changes.height,
+ ssi->screensaver_window);
+ XMapRaised (si->dpy, window);
+ XClearWindow (si->dpy, window);
+
+ XDrawRectangle (si->dpy, window, gc, gcv.line_width/2, gcv.line_width/2,
+ changes.width - gcv.line_width,
+ changes.height - gcv.line_width);
+
+ x = pad;
+ y = font->ascent + pad;
+ XftDrawStringUtf8 (xftdraw, &fg, font, x, y, (FcChar8 *) buf, strlen (buf));
+ XSync (si->dpy, False);
+
+ XFreeGC (si->dpy, gc);
+ XftDrawDestroy (xftdraw);
+ /* XftColorFree (si->dpy, visual, cmap, &fg); */
+ XftFontClose (si->dpy, font);
+ free (fn);
+ free (cn);
+}
+
+
+/* This timer goes off every few minutes to try and clean up anything that has
+ gone wrong. It raises the windows, in case some other window has been
+ mapped on top of them, and re-sets the server's DPMS settings.
+
+ Maybe we should respond to Expose events to detect when another window has
+ raised above us and re-raise ourselves sooner. But that would result in us
+ fighting against "xscreensaver-auth" which tries very hard to be on top.
+ */
+static void
+watchdog_timer (XtPointer closure, XtIntervalId *id)
+{
+ saver_info *si = (saver_info *) closure;
+ saver_preferences *p = &si->prefs;
+
+ /* If the DPMS settings on the server have changed, change them back to
+ what ~/.xscreensaver says they should be. */
+ sync_server_dpms_settings (si->dpy, p);
+
+ if (si->prefs.debug_p)
+ fprintf (stderr, "%s: watchdog timer raising screen\n", blurb());
+
+ raise_windows (si);
+
+ if (any_screenhacks_running_p (si) &&
+ !monitor_powered_on_p (si->dpy))
+ {
+ int i;
+ if (si->prefs.verbose_p)
+ fprintf (stderr,
+ "%s: monitor has powered down; killing running hacks\n",
+ blurb());
+ for (i = 0; i < si->nscreens; i++)
+ kill_screenhack (&si->screens[i]);
+ }
+
+ /* Re-schedule this timer. The watchdog timer defaults to a bit less
+ than the hack cycle period, but is never longer than one hour.
+ */
+ si->watchdog_id = 0;
+ reset_watchdog_timer (si);
+}
+
+
+static void
+reset_watchdog_timer (saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+
+ if (si->watchdog_id)
+ {
+ XtRemoveTimeOut (si->watchdog_id);
+ si->watchdog_id = 0;
+ }
+
+ if (p->watchdog_timeout <= 0) return;
+ si->watchdog_id = XtAppAddTimeOut (si->app, p->watchdog_timeout,
+ watchdog_timer, (XtPointer) si);
+ if (p->debug_p)
+ fprintf (stderr, "%s: restarting watchdog_timer (%ld, %ld)\n",
+ blurb(), p->watchdog_timeout, si->watchdog_id);
+}
diff --git a/driver/xdpyinfo.c b/driver/xdpyinfo.c
index 9f67966..4bb071c 100644
--- a/driver/xdpyinfo.c
+++ b/driver/xdpyinfo.c
@@ -34,9 +34,14 @@ in this Software without prior written authorization from The Open Group.
* -DHAVE_XRECORD
*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xproto.h> /* for CARD32 */
+#include <X11/extensions/shape.h>
#include <X11/extensions/multibuf.h>
#ifdef HAVE_XIE
#include <X11/extensions/XIElib.h>
@@ -69,18 +74,16 @@ in this Software without prior written authorization from The Open Group.
char *ProgramName;
Bool queryExtensions = False;
-static int StrCmp(a, b)
- char **a, **b;
+static int StrCmp(const void *a, const void *b)
{
- return strcmp(*a, *b);
+ return strcmp(*((char **)a), *((char **)b));
}
#ifdef HAVE_GLX /* Added by jwz, 11-Nov-99 */
static void
-print_glx_versions (dpy)
- Display *dpy;
+print_glx_versions (Display *dpy)
{
/* Note: with Mesa 3.0, this lies: it prints the info from the
client's GL library, rather than the info from the GLX server.
@@ -100,9 +103,7 @@ print_glx_versions (dpy)
}
static void
-print_glx_visual_info (dpy, vip)
- Display *dpy;
- XVisualInfo *vip;
+print_glx_visual_info (Display *dpy, XVisualInfo *vip)
{
int status, value = False;
@@ -271,8 +272,7 @@ struct overlay_list
static struct overlay_list *overlays = 0;
static void
-find_overlay_info (dpy)
- Display *dpy;
+find_overlay_info (Display *dpy)
{
int screen;
Atom OVERLAY = XInternAtom (dpy, "SERVER_OVERLAY_VISUALS", False);
@@ -307,8 +307,7 @@ find_overlay_info (dpy)
}
static void
-print_overlay_visual_info (vip)
- XVisualInfo *vip;
+print_overlay_visual_info (XVisualInfo *vip)
{
int i;
int vis = vip->visualid;
@@ -327,7 +326,7 @@ print_overlay_visual_info (vip)
if (ov->transparency == 1)
printf ("transparent pixel %lu\n", (unsigned long) ov->value);
else if (ov->transparency == 2)
- printf ("transparent mask 0x%x\n", (unsigned long) ov->value);
+ printf ("transparent mask 0x%lx\n", (unsigned long) ov->value);
else
printf ("opaque\n");
}
@@ -335,9 +334,8 @@ print_overlay_visual_info (vip)
#endif /* HAVE_OVERLAY */
-void
-print_extension_info (dpy)
- Display *dpy;
+static void
+print_extension_info (Display *dpy)
{
int n = 0;
char **extlist = XListExtensions (dpy, &n);
@@ -367,9 +365,8 @@ print_extension_info (dpy)
}
}
-void
-print_display_info (dpy)
- Display *dpy;
+static void
+print_display_info (Display *dpy)
{
char dummybuf[40];
char *cp;
@@ -393,7 +390,7 @@ print_display_info (dpy)
req_size = XExtendedMaxRequestSize (dpy);
if (!req_size) req_size = XMaxRequestSize (dpy);
printf ("maximum request size: %ld bytes\n", req_size * 4);
- printf ("motion buffer size: %d\n", XDisplayMotionBufferSize (dpy));
+ printf ("motion buffer size: %ld\n", XDisplayMotionBufferSize (dpy));
switch (BitmapBitOrder (dpy)) {
case LSBFirst: cp = "LSBFirst"; break;
@@ -470,9 +467,8 @@ print_display_info (dpy)
printf ("number of screens: %d\n", ScreenCount (dpy));
}
-void
-print_visual_info (vip)
- XVisualInfo *vip;
+static void
+print_visual_info (XVisualInfo *vip)
{
char errorbuf[40]; /* for sprintfing into */
char *class = NULL; /* for printing */
@@ -507,10 +503,15 @@ print_visual_info (vip)
vip->bits_per_rgb);
}
-void
-print_screen_info (dpy, scr)
- Display *dpy;
- int scr;
+static int print_event_mask (
+ char *buf, /* string to write into */
+ int lastcol, /* strlen(buf)+1 */
+ int indent, /* amount by which to indent */
+ long mask); /* event mask */
+
+
+static void
+print_screen_info (Display *dpy, int scr)
{
Screen *s = ScreenOfDisplay (dpy, scr); /* opaque structure */
XVisualInfo viproto; /* fill in for getting info */
@@ -565,7 +566,7 @@ print_screen_info (dpy, scr)
printf (" default colormap: 0x%lx\n", DefaultColormap (dpy, scr));
printf (" default number of colormap cells: %d\n",
DisplayCells (dpy, scr));
- printf (" preallocated pixels: black %d, white %d\n",
+ printf (" preallocated pixels: black %lu, white %lu\n",
BlackPixel (dpy, scr), WhitePixel (dpy, scr));
printf (" options: backing-store %s, save-unders %s\n",
(DoesBackingStore (s) == NotUseful) ? no :
@@ -637,11 +638,11 @@ static struct _event_table {
{ "OwnerGrabButtonMask ", OwnerGrabButtonMask },
{ NULL, 0 }};
-int print_event_mask (buf, lastcol, indent, mask)
- char *buf; /* string to write into */
- int lastcol; /* strlen(buf)+1 */
- int indent; /* amount by which to indent */
- long mask; /* event mask */
+static int print_event_mask (
+ char *buf, /* string to write into */
+ int lastcol, /* strlen(buf)+1 */
+ int indent, /* amount by which to indent */
+ long mask) /* event mask */
{
struct _event_table *etp;
int len;
@@ -673,11 +674,9 @@ int print_event_mask (buf, lastcol, indent, mask)
return (bitsfound);
}
-void
-print_standard_extension_info(dpy, extname, majorrev, minorrev)
- Display *dpy;
- char *extname;
- int majorrev, minorrev;
+static void
+print_standard_extension_info(Display *dpy, char *extname,
+ int majorrev, int minorrev)
{
int opcode, event, error;
@@ -692,10 +691,8 @@ print_standard_extension_info(dpy, extname, majorrev, minorrev)
printf("\n");
}
-int
-print_multibuf_info(dpy, extname)
- Display *dpy;
- char *extname;
+static int
+print_multibuf_info(Display *dpy, char *extname)
{
int i, j; /* temp variable: iterator */
int nmono, nstereo; /* count */
@@ -850,10 +847,8 @@ print_sync_info(dpy, extname)
}
#endif /* HAVE_XSYNC */
-int
-print_shape_info(dpy, extname)
- Display *dpy;
- char *extname;
+static int
+print_shape_info(Display *dpy, char *extname)
{
int majorrev, minorrev;
@@ -979,9 +974,8 @@ ExtensionPrintInfo known_extensions[] =
int num_known_extensions = sizeof known_extensions / sizeof known_extensions[0];
-void
-print_known_extensions(f)
- FILE *f;
+static void
+print_known_extensions(FILE *f)
{
int i;
for (i = 0; i < num_known_extensions; i++)
@@ -990,9 +984,8 @@ print_known_extensions(f)
}
}
-void
-mark_extension_for_printing(extname)
- char *extname;
+static void
+mark_extension_for_printing(char *extname)
{
int i;
@@ -1015,9 +1008,8 @@ mark_extension_for_printing(extname)
}
}
-void
-print_marked_extensions(dpy)
- Display *dpy;
+static void
+print_marked_extensions(Display *dpy)
{
int i;
for (i = 0; i < num_known_extensions; i++)
@@ -1035,7 +1027,7 @@ print_marked_extensions(dpy)
}
}
-static void usage ()
+static void usage (void)
{
fprintf (stderr, "usage: %s [options]\n", ProgramName);
fprintf (stderr, "-display displayname\tserver to query\n");
@@ -1047,15 +1039,11 @@ static void usage ()
exit (1);
}
-int main (argc, argv)
- int argc;
- char *argv[];
+int main (int argc, char *argv[])
{
Display *dpy; /* X connection */
char *displayname = NULL; /* server to contact */
int i; /* temp variable: iterator */
- Bool multibuf = False;
- int mbuf_event_base, mbuf_error_base;
ProgramName = argv[0];
@@ -1077,7 +1065,7 @@ int main (argc, argv)
dpy = XOpenDisplay (displayname);
if (!dpy) {
- fprintf (stderr, "%s: unable to open display \"%s\".\n",
+ fprintf (stderr, "%s: unable to open display \"%s\"\n",
ProgramName, XDisplayName (displayname));
exit (1);
}
diff --git a/driver/xinput.c b/driver/xinput.c
new file mode 100644
index 0000000..3b21db0
--- /dev/null
+++ b/driver/xinput.c
@@ -0,0 +1,381 @@
+/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/extensions/XInput2.h>
+
+#include "blurb.h"
+#include "xinput.h"
+
+extern Bool debug_p;
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+
+/* Initialize the XInput2 extension. Returns True on success.
+ */
+Bool
+init_xinput (Display *dpy, int *opcode_ret)
+{
+ int nscreens = ScreenCount (dpy);
+ XIEventMask evmasks[1];
+ unsigned char mask1[(XI_LASTEVENT + 7)/8];
+ int major, minor;
+ int xi_opcode, ev, err;
+ int i;
+ int ndevs = 0;
+ XIDeviceInfo *devs;
+
+ if (!XQueryExtension (dpy, "XInputExtension", &xi_opcode, &ev, &err))
+ {
+ fprintf (stderr, "%s: XInput extension missing\n", blurb());
+ return False;
+ }
+
+ major = 2; /* Desired version */
+ minor = 2;
+ if (XIQueryVersion (dpy, &major, &minor) != Success)
+ {
+ fprintf (stderr, "%s: server only supports XInput %d.%d\n",
+ blurb(), major, minor);
+ return False;
+ }
+
+ if (verbose_p)
+ fprintf (stderr, "%s: XInput version %d.%d\n", blurb(), major, minor);
+
+ memset (mask1, 0, sizeof(mask1));
+
+ XISetMask (mask1, XI_RawMotion);
+ XISetMask (mask1, XI_RawKeyPress);
+ XISetMask (mask1, XI_RawKeyRelease);
+ XISetMask (mask1, XI_RawButtonPress);
+ XISetMask (mask1, XI_RawButtonRelease);
+ XISetMask (mask1, XI_RawTouchBegin);
+ XISetMask (mask1, XI_RawTouchUpdate);
+ XISetMask (mask1, XI_RawTouchEnd);
+
+ /* If we use XIAllDevices instead, we get double events. */
+ evmasks[0].deviceid = XIAllMasterDevices;
+ evmasks[0].mask_len = sizeof(mask1);
+ evmasks[0].mask = mask1;
+
+ for (i = 0; i < nscreens; i++)
+ {
+ Window root = RootWindow (dpy, i);
+ if (XISelectEvents (dpy, root, evmasks, countof(evmasks)) != Success)
+ {
+ fprintf (stderr, "%s: XISelectEvents failed\n", blurb());
+ return False;
+ }
+ }
+
+ XFlush (dpy);
+
+ devs = XIQueryDevice (dpy, XIAllDevices, &ndevs);
+ if (!ndevs)
+ {
+ fprintf (stderr, "%s: XInput: no devices\n", blurb());
+ return False;
+ }
+
+ if (verbose_p)
+ for (i = 0; i < ndevs; i++)
+ {
+ XIDeviceInfo *d = &devs[i];
+ fprintf (stderr, "%s: device %2d/%d: %s: %s\n",
+ blurb(), d->deviceid, d->attachment,
+ (d->use == XIMasterPointer ? "MP" :
+ d->use == XIMasterKeyboard ? "MK" :
+ d->use == XISlavePointer ? "SP" :
+ d->use == XISlaveKeyboard ? "SK" :
+ d->use == XIFloatingSlave ? "FS" : "??"),
+ d->name);
+ }
+
+ XIFreeDeviceInfo (devs);
+ *opcode_ret = xi_opcode;
+ return True;
+}
+
+
+/* Convert an XInput2 event to corresponding old-school Xlib event.
+ Returns true on success.
+ */
+Bool
+xinput_event_to_xlib (int evtype, XIDeviceEvent *in, XEvent *out)
+{
+ Display *dpy = in->display;
+ Bool ok = False;
+
+ int root_x = 0, root_y = 0;
+ unsigned int mods = 0;
+
+ /* The closest thing to actual documentation on XInput2 seems to be a series
+ of blog posts by Peter Hutterer. There's basically nothing about it on
+ www.x.org. In http://who-t.blogspot.com/2009/07/xi2-recipes-part-4.html
+ he says:
+
+ "XIDeviceEvent [...] contains the state of the modifier keys [...]
+ The base modifiers are the ones currently pressed, latched the ones
+ pressed until a key is pressed that's configured to unlatch it (e.g.
+ some shift-capslock interactions have this behaviour) and finally
+ locked modifiers are the ones permanently active until unlocked
+ (default capslock behaviour in the US layout). The effective modifiers
+ are a bitwise OR of the three above - which is essentially equivalent
+ to the modifiers state supplied in the core protocol events."
+
+ However, I'm seeing random noise in the various XIDeviceEvent.mods fields.
+ Nonsensical values like base = 0x6045FB3D. So, let's poll the actual
+ modifiers from XQueryPointer. This can race: maybe the modifier state
+ changed between when the server generated the keyboard event, and when
+ we receive it and poll. However, if an actual human is typing and
+ releasing their modifier keys on such a tight timeframe... that's
+ probably already not going well.
+
+ I'm also seeing random noise in the event_xy and root_xy fields in
+ motion events. So just always use XQueryPointer.
+ */
+ switch (evtype) {
+ case XI_RawKeyPress:
+ case XI_RawKeyRelease:
+ case XI_RawButtonPress:
+ case XI_RawButtonRelease:
+ case XI_RawMotion:
+ {
+ Window root_ret, child_ret;
+ int win_x, win_y;
+ int i;
+ for (i = 0; i < ScreenCount (dpy); i++) /* query on correct screen */
+ if (XQueryPointer (dpy, RootWindow (dpy, i),
+ &root_ret, &child_ret, &root_x, &root_y,
+ &win_x, &win_y, &mods))
+ break;
+ }
+ default: break;
+ }
+
+ switch (evtype) {
+ case XI_RawKeyPress:
+ case XI_RawKeyRelease:
+ out->xkey.type = (evtype == XI_RawKeyPress ? KeyPress : KeyRelease);
+ out->xkey.display = in->display;
+ out->xkey.window = in->event;
+ out->xkey.root = in->root;
+ out->xkey.subwindow = in->child;
+ out->xkey.time = in->time;
+ out->xkey.x = root_x;
+ out->xkey.y = root_y;
+ out->xkey.x_root = root_x;
+ out->xkey.y_root = root_y;
+ out->xkey.state = mods;
+ out->xkey.keycode = in->detail;
+ ok = True;
+ break;
+ case XI_RawButtonPress:
+ case XI_RawButtonRelease:
+ out->xbutton.type = (evtype == XI_RawButtonPress
+ ? ButtonPress : ButtonRelease);
+ out->xbutton.display = in->display;
+ out->xbutton.window = in->event;
+ out->xbutton.root = in->root;
+ out->xbutton.subwindow = in->child;
+ out->xbutton.time = in->time;
+ out->xbutton.x = root_x;
+ out->xbutton.y = root_y;
+ out->xbutton.x_root = root_x;
+ out->xbutton.y_root = root_y;
+ out->xbutton.state = mods;
+ out->xbutton.button = in->detail;
+ ok = True;
+ break;
+ case XI_RawMotion:
+ out->xmotion.type = MotionNotify;
+ out->xmotion.display = in->display;
+ out->xmotion.window = in->event;
+ out->xmotion.root = in->root;
+ out->xmotion.subwindow = in->child;
+ out->xmotion.time = in->time;
+ out->xmotion.x = root_x;
+ out->xmotion.y = root_y;
+ out->xmotion.x_root = root_x;
+ out->xmotion.y_root = root_y;
+ out->xmotion.state = mods;
+ ok = True;
+ break;
+ default:
+ break;
+ }
+
+ return ok;
+}
+
+
+static void
+print_kbd_event (XEvent *xev, XComposeStatus *compose, Bool x11_p)
+{
+ if (debug_p) /* Passwords show up in plaintext! */
+ {
+ KeySym keysym = 0;
+ char c[100];
+ char M[100], *mods = M;
+ int n = XLookupString (&xev->xkey, c, sizeof(c)-1, &keysym, compose);
+ const char *ks = keysym ? XKeysymToString (keysym) : "NULL";
+ c[n] = 0;
+ if (*c == '\n') strcpy (c, "\\n");
+ else if (*c == '\r') strcpy (c, "\\r");
+ else if (*c == '\t') strcpy (c, "\\t");
+
+ *mods = 0;
+ if (xev->xkey.state & ShiftMask) strcat (mods, "-Sh");
+ if (xev->xkey.state & LockMask) strcat (mods, "-Lk");
+ if (xev->xkey.state & ControlMask) strcat (mods, "-C");
+ if (xev->xkey.state & Mod1Mask) strcat (mods, "-M1");
+ if (xev->xkey.state & Mod2Mask) strcat (mods, "-M2");
+ if (xev->xkey.state & Mod3Mask) strcat (mods, "-M3");
+ if (xev->xkey.state & Mod4Mask) strcat (mods, "-M4");
+ if (xev->xkey.state & Mod5Mask) strcat (mods, "-M5");
+ if (*mods) mods++;
+ if (!*mods) strcat (mods, "0");
+
+ fprintf (stderr, "%s: %s 0x%02X %s %s \"%s\"\n", blurb(),
+ (x11_p
+ ? (xev->xkey.type == KeyPress
+ ? "X11 KeyPress "
+ : "X11 KeyRelease ")
+ : (xev->xkey.type == KeyPress
+ ? "XI_RawKeyPress "
+ : "XI_RawKeyRelease")),
+ xev->xkey.keycode, mods, ks, c);
+ }
+ else /* Log only that the KeyPress happened. */
+ {
+ fprintf (stderr, "%s: X11 Key%s\n", blurb(),
+ (xev->xkey.type == KeyPress ? "Press " : "Release"));
+ }
+}
+
+
+void
+print_xinput_event (Display *dpy, XEvent *xev, const char *desc)
+{
+ XIRawEvent *re;
+
+ switch (xev->xany.type) {
+ case KeyPress:
+ case KeyRelease:
+ {
+ static XComposeStatus compose = { 0, };
+ print_kbd_event (xev, &compose, True);
+ }
+ break;
+
+ case ButtonPress:
+ case ButtonRelease:
+ fprintf (stderr, "%s: X11 Button%s %d %d\n", blurb(),
+ (xev->xany.type == ButtonPress ? "Press " : "Release"),
+ xev->xbutton.button, xev->xbutton.state);
+ break;
+
+ case MotionNotify:
+ fprintf (stderr, "%s: X11 MotionNotify %4d, %-4d"
+ " %s\n",
+ blurb(), xev->xmotion.x_root, xev->xmotion.y_root,
+ (desc ? desc : ""));
+ break;
+ default:
+ break;
+ }
+
+ if (xev->xany.type != GenericEvent)
+ return; /* not an XInput event */
+
+ if (!xev->xcookie.data)
+ XGetEventData (dpy, &xev->xcookie);
+
+ re = xev->xcookie.data;
+ if (!re) return; /* Bogus XInput event */
+
+ switch (re->evtype) {
+ case XI_RawKeyPress:
+ case XI_RawKeyRelease:
+ if (debug_p)
+ {
+ /* Fake up an XKeyEvent in order to call XKeysymToString(). */
+ XEvent ev2;
+ Bool ok = xinput_event_to_xlib (xev->xcookie.evtype,
+ (XIDeviceEvent *) re,
+ &ev2);
+ if (!ok)
+ fprintf (stderr, "%s: unable to translate XInput2 event\n", blurb());
+ else
+ {
+ static XComposeStatus compose = { 0, };
+ print_kbd_event (&ev2, &compose, False);
+ }
+ break;
+ }
+ else
+ fprintf (stderr, "%s: XI RawKey%s\n", blurb(),
+ (re->evtype == XI_RawKeyPress ? "Press " : "Release"));
+ break;
+
+ case XI_RawButtonPress:
+ case XI_RawButtonRelease:
+ fprintf (stderr, "%s: XI RawButton%s %d\n", blurb(),
+ (re->evtype == XI_RawButtonPress ? "Press " : "Release"),
+ re->detail);
+ break;
+
+ case XI_RawMotion:
+ if (verbose_p > 1)
+ {
+ Window root_ret, child_ret;
+ int root_x, root_y;
+ int win_x, win_y;
+ unsigned int mask;
+ XQueryPointer (dpy, DefaultRootWindow (dpy),
+ &root_ret, &child_ret, &root_x, &root_y,
+ &win_x, &win_y, &mask);
+ fprintf (stderr,
+ "%s: XI_RawMotion %4d, %-4d %7.02f, %-7.02f%s\n",
+ blurb(), root_x, root_y, re->raw_values[0], re->raw_values[1],
+ (desc ? desc : ""));
+ }
+ break;
+
+ /* Touch-screens, possibly trackpads or tablets. */
+ case XI_RawTouchBegin:
+ fprintf (stderr, "%s: XI RawTouchBegin\n", blurb());
+ break;
+ case XI_RawTouchEnd:
+ fprintf (stderr, "%s: XI RawTouchEnd\n", blurb());
+ break;
+ case XI_RawTouchUpdate:
+ if (verbose_p > 1)
+ fprintf (stderr, "%s: XI RawTouchUpdate\n", blurb());
+ break;
+
+ default:
+ fprintf (stderr, "%s: unknown XInput event %d\n", blurb(), re->type);
+ break;
+ }
+}
diff --git a/driver/xinput.h b/driver/xinput.h
new file mode 100644
index 0000000..2ee20ee
--- /dev/null
+++ b/driver/xinput.h
@@ -0,0 +1,19 @@
+/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __XSCREENSAVER_XINPUT_H__
+#define __XSCREENSAVER_XINPUT_H__
+
+extern Bool init_xinput (Display *dpy, int *opcode_ret);
+extern Bool xinput_event_to_xlib (int evtype, XIDeviceEvent *in, XEvent *out);
+extern void print_xinput_event (Display *, XEvent *, const char *desc);
+
+#endif /* __XSCREENSAVER_XINPUT_H__ */
diff --git a/driver/xscreensaver-auth.c b/driver/xscreensaver-auth.c
new file mode 100644
index 0000000..4344d20
--- /dev/null
+++ b/driver/xscreensaver-auth.c
@@ -0,0 +1,340 @@
+/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * XScreenSaver Daemon, version 6.
+ *
+ * This is "xscreensaver-auth" -- When the screen is locked and there is
+ * user activity, this program is launched to pop up a dialog, authenticate
+ * the user, and eventually exit with a status code indicating success or
+ * failure. See the comment atop xscreensaver.c for details of the division
+ * of powers.
+ *
+ * Flow of control within xscreensaver-auth:
+ *
+ * - Privileged password initialization (e.g. read /etc/shadow as root)
+ * - Disavow privileges
+ * - Unprivileged password initialization
+ * - Connect to X server
+ * - xss_authenticate (passwd.c)
+ * - Tries PAM, Kerberos, pwent, shadow passwords (passwd-*.c) until
+ * one of them works. Non-PAM methods are wrapped to act like PAM.
+ * - pam_conv calls our "conversation" function zero or more times.
+ * That function is expected to present messages to the user and/or
+ * to prompt the user to answer a question, wait for the answer, and
+ * return it. There might be only one question (the password) or
+ * there might be others, even multiple passwords.
+ * - xscreensaver_auth_conv (dialog.c) is our conversation function.
+ * - First time it is called, it creates the window.
+ * - Subsequent times, it reuses that window.
+ * - Runs an X11 event loop waiting for the user to complete
+ * or timeout, then returns the entered strings.
+ * - pam_conv takes the user input and returns success/failure.
+ * - xscreensaver_auth_finished is called to pop up a final dialog to
+ * present any error messages.
+ * - Exit with appropriate code.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <ctype.h>
+#include <X11/Xlib.h>
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Shell.h>
+#include <X11/Xos.h>
+#include <time.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <pwd.h>
+
+#ifdef ENABLE_NLS
+# include <locale.h>
+# include <libintl.h>
+#endif
+
+#include "xscreensaver.h"
+#include "version.h"
+#include "atoms.h"
+#include "yarandom.h"
+#include "resources.h"
+#include "visual.h"
+#include "auth.h"
+
+#ifdef __GNUC__
+ __extension__ /* shut up about "string length is greater than the length
+ ISO C89 compilers are required to support" when including
+ the .ad file... */
+#endif
+
+static char *defaults[] = {
+#include "XScreenSaver_ad.h"
+ 0
+};
+
+
+char *progclass = 0;
+Bool debug_p = False;
+
+
+#ifdef HAVE_PROC_OOM
+/* Linux systems have an "out-of-memory killer" that will nuke random procs in
+ low-memory situations. You'd think it would pick the process using the
+ most memory, but most of the time it seems to pick the process that would
+ be most comically inconvenient, such as your screen locker, or crond.
+
+ Since killing "xscreensaver" unlocks the screen... that would be bad.
+
+ This program, "xscreensaver-auth", is the part of the XScreenSaver daemon
+ that might need to be setuid for other reasons, so we handle the OOM killer
+ here. We could instead handle OOM in the "xscreensaver" program, but then
+ that program would *also* need to be setuid.
+
+ So instead, "xscreensaver-auth" sets OOM immunity on its *parent* process.
+ That means that if you run it by hand, it will apply that immunity to the
+ parent shell. Maybe that's bad? I think I don't care.
+
+ Linux >= 2.6.11: echo -17 > /proc/$$/oom_adj
+ Linux >= 2.6.37: echo -1000 > /proc/$$/oom_score_adj
+
+ "An aircraft company discovered that it was cheaper to fly its planes with
+ less fuel on board. On rare occasions, however, the amount of fuel was
+ insufficient, and the plane would crash. In emergency cases, a passenger
+ was selected and thrown out of the plane. When necessary, the procedure
+ was repeated."
+
+ https://lwn.net/Articles/104179/
+
+ The OOM killer preferentially kills processes whose *children* use a lot of
+ memory, and processes that are niced. So if a display mode uses a lot of
+ memory, the OOM-killer is more likely to shoot down the XScreenSaver
+ *daemon* than just that screenhack!
+
+ To disable the OOM-killer entirely:
+
+ echo 2 > /proc/sys/vm/overcommit_memory
+ echo vm.overcommit_memory = 2 >> /etc/sysctl.conf
+ */
+static void
+oom_assassin_immunity (void)
+{
+# define OOM_VAL "-1000"
+ char fn[1024];
+ struct stat st;
+ FILE *fd;
+ pid_t pid = getppid(); /* our parent, not us */
+
+ sprintf (fn, "/proc/%d/oom_score_adj", pid);
+ if (stat(fn, &st) != 0)
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: OOM: %s does not exist\n", blurb(), fn);
+ return;
+ }
+ fd = fopen (fn, "w");
+ if (!fd) goto FAIL;
+ if (fputs (OOM_VAL "\n", fd) <= 0) goto FAIL;
+ if (fclose (fd) != 0) goto FAIL;
+
+ if (verbose_p)
+ fprintf (stderr, "%s: OOM: echo " OOM_VAL " > %s\n", blurb(), fn);
+ return;
+
+ FAIL:
+ {
+ char buf[1024];
+ const char *b = blurb();
+ sprintf (buf, "%.40s: OOM: %.200s", b, fn);
+ perror (buf);
+ if (getuid() == geteuid())
+ fprintf (stderr,
+ "%s: To prevent the kernel from randomly unlocking\n"
+ "%s: your screen via the out-of-memory killer,\n"
+ "%s: \"%s\" must be setuid root.\n",
+ b, b, b, progname);
+ }
+}
+#endif /* HAVE_PROC_OOM */
+
+
+int
+main (int argc, char **argv)
+{
+ Display *dpy;
+ XtAppContext app;
+ Widget root_widget;
+ char *dpy_str = getenv ("DISPLAY");
+ Bool xsync_p = False;
+ Bool splash_p = False;
+ Bool init_p = False;
+ int i;
+
+# undef ya_rand_init
+ ya_rand_init (0);
+
+ /* For Xt and X resource database purposes, this program is
+ "xscreensaver", not "xscreensaver-auth".
+ */
+ {
+ char *s = strrchr(argv[0], '/');
+ if (s) s++;
+ else s = argv[0];
+ if (strlen(s) > 20) /* keep it short. */
+ s[20] = 0;
+ progname = s;
+ }
+
+ progclass = "XScreenSaver";
+ argv[0] = "xscreensaver";
+
+ if (! dpy_str) dpy_str = ":0";
+
+ for (i = 1; i < argc; i++)
+ {
+ const char *oa = argv[i];
+ /* XScreenSaver predates the "--arg" convention. */
+ if (argv[i][0] == '-' && argv[i][1] == '-')
+ argv[i]++;
+
+ if (!strcmp (argv[i], "-v") || !strcmp (argv[i], "-verbose"))
+ verbose_p++;
+ else if (!strcmp (argv[i], "-vv")) verbose_p += 2;
+ else if (!strcmp (argv[i], "-vvv")) verbose_p += 3;
+ else if (!strcmp (argv[i], "-vvvv")) verbose_p += 4;
+ else if (!strcmp (argv[i], "-q") || !strcmp (argv[i], "-quiet"))
+ verbose_p = False;
+ else if (!strcmp (argv[i], "-debug"))
+ /* Does nothing else at the moment but warn that "xscreensaver"
+ is logging keystrokes to stderr. */
+ debug_p = True;
+ else if (!strcmp (argv[i], "-d") ||
+ !strcmp (argv[i], "-dpy") ||
+ !strcmp (argv[i], "-disp") ||
+ !strcmp (argv[i], "-display"))
+ {
+ dpy_str = argv[++i];
+ if (!dpy_str) goto HELP;
+ }
+ else if (!strcmp (argv[i], "-sync") ||
+ !strcmp (argv[i], "-synch") ||
+ !strcmp (argv[i], "-synchronize") ||
+ !strcmp (argv[i], "-synchronise"))
+ xsync_p = True;
+ else if (!strcmp (argv[i], "-splash"))
+ splash_p = True;
+ else if (!strcmp (argv[i], "-init"))
+ init_p = True;
+ else if (!strcmp (argv[i], "-h") || !strcmp (argv[i], "-help"))
+ {
+ HELP:
+ fprintf (stderr,
+ "\n"
+ "\txscreensaver-auth is launched by the xscreensaver daemon\n"
+ "\tto authenticate the user by prompting for a password.\n"
+ "\tDo not run this directly.\n"
+ "\n"
+ "\tOptions:\n"
+ "\t\t--dpy host:display.screen\n"
+ "\t\t--verbose --sync --splash --init\n"
+ "\n"
+ "\tRun 'xscreensaver-settings' to configure.\n"
+ "\n");
+ exit (1);
+ }
+ else
+ {
+ fprintf (stderr, "\n%s: unknown option: %s\n", blurb(), oa);
+ goto HELP;
+ }
+ }
+
+ if (!splash_p && init_p)
+ {
+ const char *v = XSCREENSAVER_VERSION;
+ if (strstr (v, "a") || strstr (v, "b"))
+ splash_p = True; /* Not optional for alpha and beta releases */
+ }
+
+# ifdef HAVE_PROC_OOM
+ if (splash_p || init_p)
+ oom_assassin_immunity ();
+# endif
+
+ if (!splash_p && !init_p)
+ lock_priv_init ();
+
+ if (!splash_p && init_p)
+ exit (0);
+
+ disavow_privileges ();
+
+ if (!splash_p)
+ lock_init ();
+
+ /* Setting the locale is necessary for XLookupString to return multi-byte
+ characters, enabling their use in passwords.
+ */
+# ifdef ENABLE_NLS
+ {
+ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
+ textdomain (GETTEXT_PACKAGE);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+ if (!setlocale (LC_ALL, ""))
+ fprintf (stderr, "%s: warning: could not set default locale\n",
+ progname);
+ }
+# endif /* ENABLE_NLS */
+
+
+ /* Copy the -dpy arg to $DISPLAY for subprocesses. */
+ {
+ char *s = (char *) malloc (strlen(dpy_str) + 20);
+ sprintf (s, "DISPLAY=%s", dpy_str);
+ putenv (s);
+ /* free (s); */ /* some versions of putenv do not copy */
+ }
+
+ /* Open the display */
+ {
+ XrmOptionDescRec options;
+ argc = 1; /* Xt does not receive any of our command-line options. */
+ root_widget = XtAppInitialize (&app, progclass, &options, 0,
+ &argc, argv, defaults, 0, 0);
+ }
+
+ dpy = XtDisplay (root_widget);
+ if (xsync_p) XSynchronize (dpy, True);
+ init_xscreensaver_atoms (dpy);
+
+ if (splash_p)
+ {
+ xscreensaver_splash (root_widget);
+ exit (0);
+ }
+ else if (xscreensaver_auth ((void *) root_widget,
+ xscreensaver_auth_conv,
+ xscreensaver_auth_finished))
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: authentication succeeded\n", blurb());
+ exit (200);
+ }
+ else
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: authentication failed\n", blurb());
+ exit (-1);
+ }
+
+ /* On timeout, xscreensaver_auth did exit(0) */
+}
diff --git a/driver/xscreensaver-auth.man b/driver/xscreensaver-auth.man
new file mode 100644
index 0000000..1655602
--- /dev/null
+++ b/driver/xscreensaver-auth.man
@@ -0,0 +1,27 @@
+.TH XScreenSaver 1 "06-Jan-2021 (6.00)" "X Version 11"
+.SH NAME
+xscreensaver - extensible screen saver and screen locking framework
+.SH SYNOPSIS
+.B xscreensaver-auth
+[\-display \fIhost:display.screen\fP]
+.SH DESCRIPTION
+The
+.BR xscreensaver (1)
+daemon launches this program to prompt the user for their password.
+Do not run this program directly.
+.SH SEE ALSO
+.BR xscreensaver (1),
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-gfx (MANSUFFIX),
+.BR xscreensaver\-systemd (MANSUFFIX).
+.SH COPYRIGHT
+Copyright \(co 2021 by Jamie Zawinski.
+Permission to use, copy, modify, distribute, and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>
diff --git a/driver/xscreensaver-command.c b/driver/xscreensaver-command.c
index 4a4f0b4..0dab564 100644
--- a/driver/xscreensaver-command.c
+++ b/driver/xscreensaver-command.c
@@ -1,4 +1,4 @@
-/* xscreensaver-command, Copyright (c) 1991-2019 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver-command, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -31,30 +31,15 @@
#include <X11/Intrinsic.h> /* only needed to get through xscreensaver.h */
-
-/* You might think that to read an array of 32-bit quantities out of a
- server-side property, you would pass an array of 32-bit data quantities
- into XGetWindowProperty(). You would be wrong. You have to use an array
- of longs, even if long is 64 bits (using 32 of each 64.)
- */
-typedef long PROP32;
-
+#include "blurb.h"
#include "remote.h"
#include "version.h"
+#include "atoms.h"
#ifdef _VROOT_H_
ERROR! you must not include vroot.h in this file
#endif
-char *progname;
-
-Atom XA_VROOT;
-Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_RESPONSE;
-Atom XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_SELECT, XA_DEMO, XA_EXIT;
-Atom XA_BLANK, XA_LOCK, XA_ACTIVATE, XA_SUSPEND, XA_NEXT, XA_PREV;
-static Atom XA_DEACTIVATE, XA_CYCLE;
-static Atom XA_RESTART, XA_PREFS, XA_THROTTLE, XA_UNTHROTTLE;
-
static char *screensaver_version;
# ifdef __GNUC__
__extension__ /* don't warn about "string length is greater than the
@@ -72,10 +57,8 @@ usage: %s -<option>\n\
with this program, xscreensaver-command. See the man pages for\n\
details. These are the arguments understood by xscreensaver-command:\n\
\n\
- -demo Ask the xscreensaver process to enter interactive demo mode.\n\
-\n\
- -prefs Ask the xscreensaver process to bring up the preferences\n\
- panel.\n\
+ -quiet Only print output if an error occurs.\n\
+ -verbose Opposite of -quiet. Default.\n\
\n\
-activate Turn on the screensaver (blank the screen), as if the user\n\
had been idle for long enough.\n\
@@ -92,8 +75,7 @@ usage: %s -<option>\n\
is the next one in the list, instead of a randomly-chosen\n\
one. In other words, repeatedly executing -next will cause\n\
the xscreensaver process to invoke each graphics demo\n\
- sequentially. (Though using the -demo option is probably\n\
- an easier way to accomplish that.)\n\
+ sequentially.\n\
\n\
-prev Like -next, but goes in the other direction.\n\
\n\
@@ -103,15 +85,6 @@ usage: %s -<option>\n\
with a particular graphics demo. (The first element in the\n\
list is numbered 1, not 0.)\n\
\n\
- -exit Causes the xscreensaver process to exit gracefully.\n\
- This does nothing if the display is currently locked.\n\
- (Note that one must *never* kill xscreensaver with -9!)\n\
-\n\
- -restart Causes the screensaver process to exit and then restart with\n\
- the same command line arguments as last time. You shouldn't\n\
- really need to do this, since xscreensaver notices when the\n\
- .xscreensaver file has changed and re-reads it as needed.\n\
-\n\
-lock Tells the running xscreensaver process to lock the screen\n\
immediately. This is like -activate, but forces locking as\n\
well, even if locking is not the default. If the saver is\n\
@@ -122,10 +95,14 @@ usage: %s -<option>\n\
This is intended to be run just after your laptop's lid\n\
is closed, and just before the CPU halts.\n\
\n\
- -version Prints the version of xscreensaver that is currently running\n\
- on the display -- that is, the actual version number of the\n\
- running xscreensaver background process, rather than the\n\
- version number of xscreensaver-command.\n\
+ -exit Causes the xscreensaver process to exit gracefully.\n\
+ This does nothing if the display is currently locked.\n\
+ (Note that one must *never* kill xscreensaver with -9!)\n\
+\n\
+ -restart Causes the screensaver process to exit and then restart with\n\
+ the same command line arguments as last time. You shouldn't\n\
+ really need to do this, since xscreensaver notices when the\n\
+ .xscreensaver file has changed and re-reads it as needed.\n\
\n\
-time Prints the time at which the screensaver last activated or\n\
deactivated (roughly, how long the user has been idle or\n\
@@ -138,19 +115,19 @@ usage: %s -<option>\n\
use by shell scripts that want to react to the screensaver\n\
in some way.\n\
\n\
+ -version Prints the version of xscreensaver that is currently running\n\
+ on the display -- that is, the actual version number of the\n\
+ running xscreensaver background process, rather than the\n\
+ version number of xscreensaver-command.\n\
+\n\
See the man page for more details.\n\
For updates, check https://www.jwz.org/xscreensaver/\n\
\n";
-/* Note: The "-throttle" command is deprecated -- it predates the XDPMS
- extension. Instead of using -throttle, users should instead just
- power off the monitor (e.g., "xset dpms force off".) In a few
- minutes, the xscreensaver daemon will notice that the monitor is
- off, and cease running hacks.
- */
-
-#define USAGE() do { \
- fprintf (stderr, usage, progname, screensaver_version, year); exit (1); \
+#define USAGE(A,B) do { \
+ fprintf (stderr, "%s: %s: %s\n%s: try --help\n", \
+ progname, (A), ((B) ? (B) : ""), progname); \
+ exit (1); \
} while(0)
static int watch (Display *);
@@ -162,18 +139,20 @@ main (int argc, char **argv)
int i;
char *dpyname = 0;
Atom *cmd = 0;
+ const char *cmdstr = 0;
long arg = 0L;
char *s;
Atom XA_WATCH = 0; /* kludge: not really an atom */
char year[5];
+ Bool verbose_p = TRUE;
progname = argv[0];
s = strrchr (progname, '/');
if (s) progname = s+1;
- screensaver_version = (char *) malloc (5);
- memcpy (screensaver_version, screensaver_id + 17, 4);
- screensaver_version [4] = 0;
+ screensaver_version = strdup (screensaver_id + 17);
+ s = strchr (screensaver_version, ' ');
+ *s = 0;
s = strchr (screensaver_id, '-');
s = strrchr (s, '-');
@@ -187,9 +166,16 @@ main (int argc, char **argv)
int L;
if (s[0] == '-' && s[1] == '-') s++;
L = strlen (s);
- if (L < 2) USAGE ();
- if (!strncmp (s, "-display", L)) dpyname = argv [++i];
- else if (cmd) USAGE();
+ if (L < 2) USAGE ("unrecognized", argv[i]);
+ if (!strncmp (s, "-display", L)) dpyname = argv [++i];
+ else if (!strncmp (s, "-dpy", L)) dpyname = argv [++i];
+ else if (!strncmp (s, "-quiet", L)) verbose_p = FALSE;
+ else if (!strcmp (s, "-verbose")) verbose_p = TRUE;
+ else if (!strcmp (s, "-v")) verbose_p = TRUE;
+ else if (!strcmp (s, "-vv")) verbose_p = 2;
+ else if (!strcmp (s, "-vvv")) verbose_p = 3;
+ else if (!strcmp (s, "-vvvv")) verbose_p = 4;
+ else if (cmd) USAGE("extraneous", argv[i]);
else if (!strncmp (s, "-activate", L)) cmd = &XA_ACTIVATE;
else if (!strncmp (s, "-deactivate", L)) cmd = &XA_DEACTIVATE;
else if (!strncmp (s, "-suspend", L)) cmd = &XA_SUSPEND;
@@ -203,12 +189,16 @@ main (int argc, char **argv)
else if (!strncmp (s, "-preferences",L)) cmd = &XA_PREFS;
else if (!strncmp (s, "-prefs",L)) cmd = &XA_PREFS;
else if (!strncmp (s, "-lock", L)) cmd = &XA_LOCK;
- else if (!strncmp (s, "-throttle", L)) cmd = &XA_THROTTLE;
- else if (!strncmp (s, "-unthrottle", L)) cmd = &XA_UNTHROTTLE;
else if (!strncmp (s, "-version", L)) cmd = &XA_SCREENSAVER_VERSION;
else if (!strncmp (s, "-time", L)) cmd = &XA_SCREENSAVER_STATUS;
else if (!strncmp (s, "-watch", L)) cmd = &XA_WATCH;
- else USAGE ();
+ else if (!strncmp (s, "-help", L))
+ {
+ fprintf (stderr, usage, progname, screensaver_version, year);
+ exit (1);
+ }
+ else USAGE ("unrecognized", argv[i]);
+ cmdstr = argv[i];
if (cmd == &XA_SELECT || cmd == &XA_DEMO)
{
@@ -216,6 +206,7 @@ main (int argc, char **argv)
char c;
if (i+1 < argc && (1 == sscanf(argv[i+1], " %ld %c", &a, &c)))
{
+ cmdstr = argv[i+1];
arg = a;
i++;
}
@@ -223,39 +214,34 @@ main (int argc, char **argv)
}
if (!cmd)
- USAGE ();
+ USAGE("no commands", "");
if (arg < 0)
/* no command may have a negative argument. */
- USAGE();
+ USAGE("bad option", cmdstr);
else if (arg == 0)
{
/* SELECT must have a non-zero argument. */
if (cmd == &XA_SELECT)
- USAGE();
+ USAGE("bad option", cmdstr);
}
else /* arg > 0 */
{
/* no command other than SELECT and DEMO may have a non-zero argument. */
if (cmd != &XA_DEMO && cmd != &XA_SELECT)
- USAGE();
+ USAGE("bad option", cmdstr);
}
- /* For backward compatibility: -demo with no arguments used to send a
- "DEMO 0" ClientMessage to the xscreensaver process, which brought up
- the built-in demo mode dialog. Now that the demo mode dialog is no
- longer built in, we bring it up by just running the "xscreensaver-demo"
- program.
-
- Note that "-DEMO <n>" still sends a ClientMessage.
+ /* -demo with no arguments launches xscreensaver-settings.
+ -demo N sends a message to the daemon demo that hack number.
*/
if (cmd == &XA_PREFS ||
(cmd == &XA_DEMO && arg == 0))
{
char buf [512];
- char *new_argv[] = { "xscreensaver-demo", 0, 0, 0, 0, 0 };
+ char *new_argv[] = { "xscreensaver-settings", 0, 0, 0, 0, 0 };
int ac = 1;
if (dpyname)
@@ -286,7 +272,7 @@ main (int argc, char **argv)
{
dpyname = ":0.0";
fprintf (stderr,
- "%s: warning: $DISPLAY is not set: defaulting to \"%s\".\n",
+ "%s: warning: $DISPLAY is not set: defaulting to \"%s\"\n",
progname, dpyname);
}
@@ -298,29 +284,7 @@ main (int argc, char **argv)
exit (1);
}
- XA_VROOT = XInternAtom (dpy, "__SWM_VROOT", False);
- XA_SCREENSAVER = XInternAtom (dpy, "SCREENSAVER", False);
- XA_SCREENSAVER_ID = XInternAtom (dpy, "_SCREENSAVER_ID", False);
- XA_SCREENSAVER_VERSION = XInternAtom (dpy, "_SCREENSAVER_VERSION",False);
- XA_SCREENSAVER_STATUS = XInternAtom (dpy, "_SCREENSAVER_STATUS", False);
- XA_SCREENSAVER_RESPONSE = XInternAtom (dpy, "_SCREENSAVER_RESPONSE", False);
- XA_ACTIVATE = XInternAtom (dpy, "ACTIVATE", False);
- XA_DEACTIVATE = XInternAtom (dpy, "DEACTIVATE", False);
- XA_SUSPEND = XInternAtom (dpy, "SUSPEND", False);
- XA_RESTART = XInternAtom (dpy, "RESTART", False);
- XA_CYCLE = XInternAtom (dpy, "CYCLE", False);
- XA_NEXT = XInternAtom (dpy, "NEXT", False);
- XA_PREV = XInternAtom (dpy, "PREV", False);
- XA_SELECT = XInternAtom (dpy, "SELECT", False);
- XA_EXIT = XInternAtom (dpy, "EXIT", False);
- XA_DEMO = XInternAtom (dpy, "DEMO", False);
- XA_PREFS = XInternAtom (dpy, "PREFS", False);
- XA_LOCK = XInternAtom (dpy, "LOCK", False);
- XA_BLANK = XInternAtom (dpy, "BLANK", False);
- XA_THROTTLE = XInternAtom (dpy, "THROTTLE", False);
- XA_UNTHROTTLE = XInternAtom (dpy, "UNTHROTTLE", False);
-
- XSync (dpy, 0);
+ init_xscreensaver_atoms (dpy);
if (cmd == &XA_WATCH)
{
@@ -338,7 +302,7 @@ main (int argc, char **argv)
if (isatty(0))
sleep (1);
- i = xscreensaver_command (dpy, *cmd, arg, True, NULL);
+ i = xscreensaver_command (dpy, *cmd, arg, verbose_p, NULL);
if (i < 0) exit (i);
else exit (0);
}
@@ -390,7 +354,7 @@ watch (Display *dpy)
STATUS_LOSE:
if (last) XFree (last);
if (data) XFree (data);
- fprintf (stderr, "%s: bad status format on root window.\n",
+ fprintf (stderr, "%s: bad status format on root window\n",
progname);
return -1;
}
@@ -448,7 +412,7 @@ watch (Display *dpy)
{
if (last) XFree (last);
if (dataP) XFree (dataP);
- fprintf (stderr, "%s: no saver status on root window.\n",
+ fprintf (stderr, "%s: no saver status on root window\n",
progname);
return -1;
}
diff --git a/driver/xscreensaver-command.man b/driver/xscreensaver-command.man
index 5837e5d..6d52d2a 100644
--- a/driver/xscreensaver-command.man
+++ b/driver/xscreensaver-command.man
@@ -1,135 +1,102 @@
-.de EX \"Begin example
-.ne 5
-.if n .sp 1
-.if t .sp .5
-.nf
-.in +.5i
-..
-.de EE
-.fi
-.in -.5i
-.if n .sp 1
-.if t .sp .5
-..
-.TH XScreenSaver 1 "03-Jun-2019 (5.42)" "X Version 11"
+.TH XScreenSaver 1 "6-Jan-2021 (6.00)" "X Version 11"
.SH NAME
xscreensaver-command - control a running xscreensaver process
.SH SYNOPSIS
.B xscreensaver-command
-[\-display \fIhost:display.screen\fP] \
-[\-help | \
-\-demo | \
-\-prefs | \
-\-activate | \
-\-deactivate | \
-\-cycle | \
-\-next | \
-\-prev | \
-\-select \fIn\fP | \
-\-exit | \
-\-restart | \
-\-lock | \
-\-suspend | \
-\-version | \
-\-time | \
-\-watch]
+[\-\-display \fIhost:display.screen\fP] \
+[\-\-help | \
+\-\-quiet | \
+\-\-verbose | \
+\-\-activate | \
+\-\-deactivate | \
+\-\-cycle | \
+\-\-next | \
+\-\-prev | \
+\-\-select \fIn\fP | \
+\-\-lock | \
+\-\-suspend | \
+\-\-exit | \
+\-\-restart | \
+\-\-time | \
+\-\-watch | \
+\-\-version]
.SH DESCRIPTION
-The \fIxscreensaver\-command\fP program controls a running \fIxscreensaver\fP
-process by sending it client-messages.
-
+The \fIxscreensaver\-command\fP program controls a running
.BR xscreensaver (1)
-has a client-server model: the xscreensaver process is a
-daemon that runs in the background; it is controlled by other
-foreground programs such as \fIxscreensaver-command\fP and
-.BR xscreensaver\-demo (1).
+daemon.
-This program, \fIxscreensaver-command\fP, is a command-line-oriented tool; the
-.BR xscreensaver\-demo (1).
-program is a graphical tool.
.SH OPTIONS
.I xscreensaver-command
accepts the following command-line options:
+
.TP 8
-.B \-help
+.B \-\-help
Prints a brief summary of command-line options.
+
.TP 8
-.B \-demo
-This just launches the
-.BR xscreensaver\-demo (1)
-program, in which one can experiment with the various graphics hacks
-available, and edit parameters.
-.TP 8
-.B \-demo \fP\fInumber\fP
-When the \fI\-demo\fP option is followed by an integer, it instructs
-the \fIxscreensaver\fP daemon to run that hack, and wait for the user
-to click the mouse before deactivating (i.e., mouse motion does not
-deactivate.) This is the mechanism by which
-.BR xscreensaver\-demo (1)
-communicates with the
-.BR xscreensaver (1)
-daemon. (The first hack in the list is numbered 1, not 0.)
+.B \-\-quiet
+Only print output if an error occurs.
+
.TP 8
-.B \-prefs
-Like the no-argument form of \fI\-demo\fP, but brings up that program's
-Preferences panel by default.
+.B \-\-verbose
+Opposite of \-\-quiet. Default.
+
.TP 8
-.B \-activate
+.B \-\-activate
Tell xscreensaver to turn on immediately (that is, blank the screen, as if
the user had been idle for long enough.) The screensaver will deactivate as
soon as there is any user activity, as usual.
It is useful to run this from a menu; you may wish to run it as
-.EX
-sleep 5 ; xscreensaver-command -activate
-.EE
+.nf
+.sp
+ sleep 5 ; xscreensaver-command -activate
+.sp
+.fi
to be sure that you have time to take your hand off the mouse before
the screensaver comes on. (Because if you jiggle the mouse, xscreensaver
will notice, and deactivate.)
+
.TP 8
-.B \-deactivate
+.B \-\-deactivate
This tells xscreensaver to pretend that there has just been user activity.
This means that if the screensaver is active (the screen is blanked),
then this command will cause the screen to un-blank as if there had been
keyboard or mouse activity. If the screen is locked, then the password
dialog will pop up first, as usual. If the screen is not blanked, then
this simulated user activity will re-start the countdown (so, issuing
-the \fI\-deactivate\fP command periodically is \fIone\fP way to prevent
+the \fI\-\-deactivate\fP command periodically is \fIone\fP way to prevent
the screen from blanking.)
+
.TP 8
-.B \-cycle
+.B \-\-cycle
If the screensaver is active (the screen is blanked), then stop the current
graphics demo and run a new one (chosen randomly.)
+
.TP 8
-.B \-next
-This is like either \fI\-activate\fP or \fI\-cycle\fP, depending on which is
-more appropriate, except that the graphics hack that will be run is the next
-one in the list, instead of a randomly-chosen one. In other words,
+.B \-\-next
+This is like either \fI\-\-activate\fP or \fI\-\-cycle\fP, depending on which
+is more appropriate, except that the graphics hack that will be run is the
+next one in the list, instead of a randomly-chosen one. In other words,
repeatedly executing -next will cause the xscreensaver process to invoke each
-graphics demo sequentially. (Though using the \fI\-demo\fP option is probably
-an easier way to accomplish that.)
+graphics demo sequentially. (Though using the \fI\-\-settings\fP option is
+probably an easier way to accomplish that.)
+
.TP 8
-.B \-prev
-This is like \fI\-next\fP, but cycles in the other direction.
+.B \-\-prev
+This is like \fI\-\-next\fP, but cycles in the other direction.
+
.TP 8
-.B \-select \fInumber\fP
-Like \fI\-activate\fP, but runs the \fIN\fPth element in the list of hacks.
+.B \-\-select \fInumber\fP
+Like \fI\-\-activate\fP, but runs the \fIN\fPth element in the list of hacks.
By knowing what is in the \fIprograms\fP list, and in what order, you can use
this to activate the screensaver with a particular graphics demo. (The first
element in the list is numbered 1, not 0.)
-.TP 8
-.B \-exit
-Causes the xscreensaver process to exit gracefully.
-This does nothing if the display is currently locked.
-.B Warning:
-never use \fIkill -9\fP with \fIxscreensaver\fP while the screensaver is
-active. If you are using a virtual root window manager, that can leave
-things in an inconsistent state, and you may need to restart your window
-manager to repair the damage.
.TP 8
-.B \-lock
+.B \-\-lock
Tells the running xscreensaver process to lock the screen immediately.
-This is like \fI\-activate\fP, but forces locking as well, even if locking
+This is like \fI\-\-activate\fP, but forces locking as well, even if locking
is not the default (that is, even if xscreensaver's \fIlock\fP resource is
false, and even if the \fIlockTimeout\fP resource is non-zero.)
@@ -137,78 +104,99 @@ Note that locking doesn't work unless the \fIxscreensaver\fP process is
running as you. See
.BR xscreensaver (1)
for details.
+
.TP 8
-.B \-suspend
-Like \fI\-activate\fP, but ignores \fIlockTimeout\fP and immediately
+.B \-\-suspend
+Like \fI\-\-activate\fP, but ignores \fIlockTimeout\fP and immediately
powers off the screen without fading out. This is intended to be run
just after your laptop's lid is closed, and just before the CPU halts,
to lock things down quickly.
+
.TP 8
-.B \-version
-Prints the version of xscreensaver that is currently running on the display:
-that is, the actual version number of the running xscreensaver background
-process, rather than the version number of xscreensaver-command. (To see
-the version number of \fIxscreensaver-command\fP itself, use
-the \fI\-help\fP option.)
-.TP 8
-.B \-time
-Prints the time at which the screensaver last activated or
-deactivated (roughly, how long the user has been idle or non-idle: but
-not quite, since it only tells you when the screen became blanked or
-un-blanked.)
+.B \-\-exit
+Causes the xscreensaver process to exit gracefully.
+This does nothing if the display is currently locked.
+
+.B Warning:
+never use \fIkill -9\fP with \fIxscreensaver\fP while the screensaver is
+active. If you are using a virtual root window manager, that can leave
+things in an inconsistent state, and you may need to restart your window
+manager to repair the damage.
+
.TP 8
-.B \-restart
+.B \-\-restart
Causes the screensaver process to exit and then restart with the same command
line arguments as last time. You shouldn't really need to do this,
since xscreensaver notices when the \fI.xscreensaver\fP file has
changed and re-reads it as needed.
+
+.TP 8
+.B \-\-time
+Prints the time at which the screensaver last activated or
+deactivated (roughly, how long the user has been idle or non-idle: but
+not quite, since it only tells you when the screen became blanked or
+un-blanked.)
+
.TP 8
-.B \-watch
+.B \-\-watch
Prints a line each time the screensaver changes state: when the screen
blanks, locks, unblanks, or when the running hack is changed. This option
never returns; it is intended for use by shell scripts that want to react to
the screensaver in some way. An example of its output would be:
-.EX
-BLANK Fri Nov 5 01:57:22 1999
-RUN 34
-RUN 79
-RUN 16
-LOCK Fri Nov 5 01:57:22 1999
-RUN 76
-RUN 12
-UNBLANK Fri Nov 5 02:05:59 1999
-.EE
+.nf
+.sp
+ BLANK Fri Nov 5 01:57:22 1999
+ RUN 34
+ RUN 79
+ RUN 16
+ LOCK Fri Nov 5 01:57:22 1999
+ RUN 76
+ RUN 12
+ UNBLANK Fri Nov 5 02:05:59 1999
+.sp
+.fi
The above shows the screensaver activating, running three different
hacks, then locking (perhaps because the lock-timeout went off) then
unblanking (because the user became active, and typed the correct
password.) The hack numbers are their index in the `programs'
-list (starting with 1, not 0, as for the \fI\-select\fP command.)
+list (starting with 1, not 0, as for the \fI\-\-select\fP command.)
For example, suppose you want to run a program that turns down the volume
on your machine when the screen blanks, and turns it back up when the screen
un-blanks. You could do that by running a Perl program like the following
in the background. The following program tracks the output of
-the \fI\-watch\fP command and reacts accordingly:
-.EX
-#!/usr/bin/perl
+the \fI\-\-watch\fP command and reacts accordingly:
+.nf
+.sp
+ #!/usr/bin/perl
-my $blanked = 0;
-open (IN, "xscreensaver-command -watch |");
-while (<IN>) {
- if (m/^(BLANK|LOCK)/) {
- if (!$blanked) {
- system "sound-off";
- $blanked = 1;
- }
- } elsif (m/^UNBLANK/) {
- system "sound-on";
- $blanked = 0;
- }
-}
-.EE
+ my $blanked = 0;
+ open (my $in, "xscreensaver-command -watch |") || die;
+ while (<$in>) {
+ if (m/^(BLANK|LOCK)/) {
+ if (!$blanked) {
+ system ("sound-off");
+ $blanked = 1;
+ }
+ } elsif (m/^UNBLANK/) {
+ system ("sound-on");
+ $blanked = 0;
+ }
+ }
+.sp
+.fi
Note that LOCK might come either with or without a preceding BLANK
(depending on whether the lock-timeout is non-zero), so the above program
keeps track of both of them.
+
+.TP 8
+.B \-\-version
+Prints the version of xscreensaver that is currently running on the display:
+that is, the actual version number of the running xscreensaver background
+process, rather than the version number of xscreensaver-command. (To see
+the version number of \fIxscreensaver-command\fP itself, use
+the \fI\-\-help\fP option.)
+
.SH STOPPING GRAPHICS
If xscreensaver is running, but you want it to stop running screen hacks
(e.g., if you are logged in remotely, and you want the console to remain
@@ -216,15 +204,17 @@ locked but just be black, with no graphics processes running) you can
accomplish that by simply powering down the monitor remotely. In a
minute or so, xscreensaver will notice that the monitor is off, and
will stop running screen hacks. You can power off the monitor like so:
-.EX
-xset dpms force off
-.EE
+.nf
+.sp
+ xset dpms force off
+.sp
+.fi
See the
.BR xset (1)
manual for more info.
You can also use
-.BR xscreensaver-demo (1)
+.BR xscreensaver\-settings (1)
to make the monitor power down after a few hours, meaning that xscreensaver
will run graphics until it has been idle for the length of time you
specified; and after that, the monitor will power off, and screen hacks
@@ -243,7 +233,7 @@ to get the host and display number of the screen whose saver is
to be manipulated.
.TP 8
.B PATH
-to find the executable to restart (for the \fI\-restart\fP command).
+to find the executable to restart (for the \fI\-\-restart\fP command).
Note that this variable is consulted in the environment of
the \fIxscreensaver\fP process, not the \fIxscreensaver-command\fP process.
.SH UPGRADES
@@ -253,10 +243,10 @@ and related tools can always be found at https://www.jwz.org/xscreensaver/
.SH "SEE ALSO"
.BR X (1),
.BR xscreensaver (1),
-.BR xscreensaver\-demo (1),
+.BR xscreensaver\-settings (1),
.BR xset (1)
.SH COPYRIGHT
-Copyright \(co 1992-2019 by Jamie Zawinski.
+Copyright \(co 1992-2021 by Jamie Zawinski.
Permission to use, copy, modify, distribute, and sell this software
and its documentation for any purpose is hereby granted without fee,
provided that the above copyright notice appear in all copies and that
diff --git a/driver/xscreensaver-gfx.c b/driver/xscreensaver-gfx.c
new file mode 100644
index 0000000..5a543a4
--- /dev/null
+++ b/driver/xscreensaver-gfx.c
@@ -0,0 +1,595 @@
+/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * XScreenSaver Daemon, version 6.
+ *
+ * This is "xscreensaver-gfx" -- When the time comes for the screen to blank,
+ * this process is launched by "xscreensaver" to fade out, black out every
+ * monitor on the system, launch graphics demos to render on those blanked
+ * screens, and cycle them from time to time. See the comment atop
+ * xscreensaver.c for details of the division of powers.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <ctype.h>
+#include <X11/Xlib.h>
+#include <X11/Xlibint.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Shell.h>
+#include <X11/Xos.h>
+#include <time.h>
+#include <sys/time.h>
+#include <netdb.h> /* for gethostbyname() */
+#include <sys/types.h>
+#include <pwd.h>
+
+#include <X11/extensions/XInput2.h>
+
+#ifdef HAVE_RANDR
+# include <X11/extensions/Xrandr.h>
+#endif /* HAVE_RANDR */
+
+#ifdef ENABLE_NLS
+# include <locale.h>
+# include <libintl.h>
+#endif
+
+#include "xscreensaver.h"
+#include "version.h"
+#include "atoms.h"
+#include "yarandom.h"
+#include "resources.h"
+#include "visual.h"
+#include "screens.h"
+#include "clientmsg.h"
+#include "xmu.h"
+
+saver_info *global_si_kludge = 0; /* I hate C so much... */
+
+char *progclass = 0;
+XrmDatabase db = 0;
+Bool debug_p = False;
+
+
+#ifdef __GNUC__
+ __extension__ /* shut up about "string length is greater than the length
+ ISO C89 compilers are required to support" when including
+ the .ad file... */
+#endif
+
+static char *defaults[] = {
+#include "XScreenSaver_ad.h"
+ 0
+};
+
+#ifdef _VROOT_H_
+ERROR! You must not include vroot.h in this file.
+#endif
+
+
+void
+maybe_reload_init_file (saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+ if (init_file_changed_p (p))
+ {
+ if (p->verbose_p)
+ fprintf (stderr, "%s: file \"%s\" has changed, reloading\n",
+ blurb(), init_file_name());
+
+ load_init_file (si->dpy, p);
+
+ /* If the DPMS settings in the init file have changed, change the
+ settings on the server to match. This also would have happened at
+ the watchdog timer. */
+ sync_server_dpms_settings (si->dpy, p);
+ }
+}
+
+
+static int
+saver_ehandler (Display *dpy, XErrorEvent *error)
+{
+ saver_info *si = global_si_kludge; /* I hate C so much... */
+ int i;
+
+ fprintf (stderr, "\n"
+ "#######################################"
+ "#######################################\n\n"
+ "%s: X Error! PLEASE REPORT THIS BUG.\n",
+ blurb());
+
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ fprintf (stderr, "%s: screen %d/%d: 0x%x, 0x%x\n",
+ blurb(), ssi->real_screen_number, ssi->number,
+ (unsigned int) RootWindowOfScreen (si->screens[i].screen),
+ (unsigned int) si->screens[i].screensaver_window);
+ }
+
+ fprintf (stderr, "\n"
+ "#######################################"
+ "#######################################\n\n");
+
+ XmuPrintDefaultErrorMessage (dpy, error, stderr);
+ exit (1);
+}
+
+
+static void
+connect_to_server (saver_info *si)
+{
+ Widget toplevel_shell;
+ Window daemon_window;
+ XrmOptionDescRec options;
+ char *p;
+ int ac = 1;
+ char *av[] = { "xscreensaver" }; /* For Xt and Xrm purposes */
+
+ XSetErrorHandler (saver_ehandler);
+
+ toplevel_shell = XtAppInitialize (&si->app, progclass, &options, 0,
+ &ac, av, defaults, 0, 0);
+
+ si->dpy = XtDisplay (toplevel_shell);
+ si->prefs.db = XtDatabase (si->dpy);
+ XtGetApplicationNameAndClass (si->dpy, &p, &progclass);
+
+ db = si->prefs.db; /* resources.c needs this */
+
+ init_xscreensaver_atoms (si->dpy);
+
+ /* Select property changes on the window created by our parent xscreensaver
+ process: this is where ClientMessage events are sent, and response
+ properties are written.
+ */
+ daemon_window = find_screensaver_window (si->dpy, 0);
+ if (daemon_window)
+ {
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (si->dpy, daemon_window, &xgwa);
+ XSelectInput (si->dpy, daemon_window,
+ xgwa.your_event_mask | PropertyChangeMask);
+ }
+ else
+ {
+ fprintf (stderr, "%s: xscreensaver does not seem to be running!\n",
+ blurb());
+ }
+}
+
+
+static void
+initialize_randr (saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+
+#ifdef HAVE_RANDR
+ if (XRRQueryExtension (si->dpy,
+ &si->randr_event_number, &si->randr_error_number))
+ {
+ int nscreens = ScreenCount (si->dpy); /* number of *real* screens */
+ int i;
+
+ si->using_randr_extension = TRUE;
+
+ if (p->verbose_p)
+ fprintf (stderr, "%s: selecting RANDR events\n", blurb());
+ for (i = 0; i < nscreens; i++)
+# ifdef RRScreenChangeNotifyMask /* randr.h 1.5, 2002/09/29 */
+ XRRSelectInput (si->dpy, RootWindow (si->dpy, i),
+ RRScreenChangeNotifyMask);
+# else /* !RRScreenChangeNotifyMask */ /* Xrandr.h 1.4, 2001/06/07 */
+ XRRScreenChangeSelectInput (si->dpy, RootWindow (si->dpy, i), True);
+# endif /* !RRScreenChangeNotifyMask */
+ }
+# endif /* HAVE_RANDR */
+}
+
+
+/* Read the XA_SCREENSAVER_STATUS propery from the root window of screen 0
+ to see what hacks were selected the last time we ran, so that -next and
+ -prev can work.
+ */
+static void
+read_status_prop (saver_info *si)
+{
+ Window w = RootWindow (si->dpy, 0); /* always screen 0 */
+ Atom type;
+ unsigned char *dataP = 0;
+ int format, i;
+ unsigned long nitems, bytesafter;
+
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ ssi->current_hack = -1;
+ }
+
+ XGetWindowProperty (si->dpy, w, XA_SCREENSAVER_STATUS,
+ 0, 999, False, XA_INTEGER, &type, &format, &nitems,
+ &bytesafter, &dataP);
+ if (dataP && type == XA_INTEGER && nitems >= 3)
+ {
+ for (i = 2; i < nitems; i++)
+ {
+ int j = i - 2;
+ if (j < si->nscreens)
+ {
+ saver_screen_info *ssi = &si->screens[j];
+ int n = ((PROP32 *) dataP)[i];
+ ssi->current_hack = n-1; /* 1-based */
+ }
+ }
+ }
+ if (dataP)
+ XFree (dataP);
+}
+
+
+/* Processing ClientMessage events.
+ Both xscreensaver and xscreensaver-gfx handle these; some are handled
+ exclusively by one program or another, and a couple (next, prev) are
+ handled by xscreensaver only if xscreensaver-gfx is not already running.
+ */
+static void
+handle_clientmessage (saver_info *si, XEvent *xev)
+{
+ Display *dpy = si->dpy;
+ saver_preferences *p = &si->prefs;
+ Atom type = 0;
+
+ if (xev->xclient.message_type != XA_SCREENSAVER ||
+ xev->xclient.format != 32)
+ return;
+
+ /* Preferences might affect our handling of client messages. */
+ maybe_reload_init_file (si);
+
+ type = xev->xclient.data.l[0];
+
+ if (type == XA_CYCLE)
+ {
+ int i;
+ clientmessage_response (dpy, xev, True, "cycling");
+ si->selection_mode = 0; /* 0 means randomize when its time. */
+ CYCLE:
+ si->demoing_p = False;
+ monitor_power_on (si, True);
+
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ cycle_timer ((XtPointer) ssi, 0);
+ }
+ }
+ else if (type == XA_NEXT || type == XA_PREV)
+ {
+ /* If xscreensaver-gfx was not running, these were handled by
+ xscreensaver. If xscreensaver-gfx is running, then xscreensaver
+ ignored these and we reply instead.
+ */
+ clientmessage_response (dpy, xev, True, "cycling");
+ si->selection_mode = (type == XA_NEXT ? -1 : -2);
+ goto CYCLE;
+ }
+ else if (type == XA_SELECT)
+ {
+ /* Same xscreensaver/xscreensaver-gfx division of labor as next/prev. */
+ long which = xev->xclient.data.l[1];
+
+ if (p->mode == DONT_BLANK)
+ {
+ clientmessage_response (dpy, xev, False, "blanking disabled");
+ return;
+ }
+
+ clientmessage_response (dpy, xev, True, "selecting");
+
+ if (which < 0) which = 0; /* 0 == "random" */
+ si->selection_mode = which;
+ goto CYCLE;
+ }
+ else
+ {
+ /* All other ClientMessages are handled by xscreensaver rather than
+ xscreensaver-gfx, and it will return an error message for unknown
+ ones. */
+ }
+}
+
+
+#ifdef DEBUG_MULTISCREEN
+/* For monitor hot-swap stress-testing. See screens.c. */
+static void
+debug_multiscreen_timer (XtPointer closure, XtIntervalId *id)
+{
+ saver_info *si = (saver_info *) closure;
+ saver_preferences *p = &si->prefs;
+ if (update_screen_layout (si))
+ {
+ if (p->verbose_p)
+ {
+ fprintf (stderr, "%s: new layout:\n", blurb());
+ describe_monitor_layout (si->monitor_layout);
+ }
+ resize_screensaver_window (si);
+ }
+ XtAppAddTimeOut (si->app, 1000*4, debug_multiscreen_timer, (XtPointer) si);
+}
+#endif /* DEBUG_MULTISCREEN */
+
+
+static void
+main_loop (saver_info *si, Bool init_p)
+{
+ saver_preferences *p = &si->prefs;
+
+ if (init_p && p->verbose_p)
+ print_available_extensions (si);
+
+ initialize_randr (si);
+ update_screen_layout (si);
+ describe_monitor_layout (si->monitor_layout);
+
+ initialize_screensaver_window (si);
+ init_sigchld (si);
+ read_status_prop (si);
+
+ if (! p->verbose_p)
+ ;
+ else if (si->demoing_p)
+ fprintf (stderr, "%s: demoing %d\n", blurb(), si->selection_mode);
+ else
+ fprintf (stderr, "%s: blanking\n", blurb());
+
+ blank_screen (si);
+
+# ifdef DEBUG_MULTISCREEN
+ if (p->debug_p)
+ debug_multiscreen_timer ((XtPointer) si, 0);
+# endif
+
+ while (1)
+ {
+ /* We have to go through this union bullshit because gcc-4.4.0 has
+ stricter struct-aliasing rules. Without this, the optimizer
+ can fuck things up. */
+ union {
+ XEvent x_event;
+# ifdef HAVE_RANDR
+ XRRScreenChangeNotifyEvent xrr_event;
+# endif /* HAVE_RANDR */
+ } event;
+
+ /* Block waiting for the next X event, while running timers. */
+ XtAppNextEvent (si->app, &event.x_event);
+
+ if (event.x_event.xany.type == ClientMessage)
+ handle_clientmessage (si, &event.x_event);
+# ifdef HAVE_RANDR
+ else if (si->using_randr_extension &&
+ (event.x_event.type ==
+ (si->randr_event_number + RRScreenChangeNotify)))
+ {
+ /* The Resize and Rotate extension sends an event when the
+ size, rotation, or refresh rate of any screen has changed.
+ */
+ if (p->verbose_p)
+ {
+ int screen = XRRRootToScreen (si->dpy, event.xrr_event.window);
+ fprintf (stderr, "%s: %d: screen change event received\n",
+ blurb(), screen);
+ }
+
+ /* Inform Xlib that it's ok to update its data structures. */
+ XRRUpdateConfiguration (&event.x_event);
+
+ /* Resize the existing xscreensaver windows and cached ssi data. */
+ if (update_screen_layout (si))
+ {
+ if (p->verbose_p)
+ {
+ fprintf (stderr, "%s: new layout:\n", blurb());
+ describe_monitor_layout (si->monitor_layout);
+ }
+ resize_screensaver_window (si);
+ }
+ }
+# endif /* HAVE_RANDR */
+
+ XtDispatchEvent (&event.x_event);
+ }
+}
+
+
+int
+main (int argc, char **argv)
+{
+ char *dpy_str = getenv ("DISPLAY");
+ char *s;
+ saver_info the_si;
+ saver_info *si = &the_si;
+ saver_preferences *p = &si->prefs;
+ Bool init_p = False;
+ Bool cmdline_verbose_val = False, cmdline_verbose_p = False;
+ int i;
+
+ memset(si, 0, sizeof(*si));
+ global_si_kludge = si; /* I hate C so much... */
+
+# undef ya_rand_init
+ ya_rand_init (0);
+
+ /* For Xt and X resource database purposes, this program is
+ "xscreensaver", not "xscreensaver-gfx".
+ */
+ s = strrchr(argv[0], '/');
+ if (s) s++;
+ else s = argv[0];
+ if (strlen(s) > 20) /* keep it short. */
+ s[20] = 0;
+ progname = s;
+
+ progclass = "XScreenSaver";
+
+ si->version = strdup (screensaver_id + 17);
+ s = strchr (si->version, ' ');
+ *s = 0;
+
+ for (i = 1; i < argc; i++)
+ {
+ const char *oa = argv[i];
+ /* XScreenSaver predates the "--arg" convention. */
+ if (argv[i][0] == '-' && argv[i][1] == '-')
+ argv[i]++;
+
+ if (!strcmp (argv[i], "-debug"))
+ p->debug_p = True;
+ else if (!strcmp (argv[i], "-v") || !strcmp (argv[i], "-verbose"))
+ {
+ p->verbose_p++;
+ cmdline_verbose_p = True, cmdline_verbose_val = p->verbose_p;
+ }
+ else if (!strcmp (argv[i], "-vv"))
+ {
+ p->verbose_p += 2;
+ cmdline_verbose_p = True, cmdline_verbose_val = p->verbose_p;
+ }
+ else if (!strcmp (argv[i], "-vvv"))
+ {
+ p->verbose_p += 3;
+ cmdline_verbose_p = True, cmdline_verbose_val = p->verbose_p;
+ }
+ else if (!strcmp (argv[i], "-vvvv"))
+ {
+ p->verbose_p += 4;
+ cmdline_verbose_p = True, cmdline_verbose_val = p->verbose_p;
+ }
+ else if (!strcmp (argv[i], "-q") || !strcmp (argv[i], "-quiet"))
+ {
+ p->verbose_p = False;
+ cmdline_verbose_p = True, cmdline_verbose_val = p->verbose_p;
+ }
+ else if (!strcmp (argv[i], "-init"))
+ init_p = True;
+ else if (!strcmp (argv[i], "-d") ||
+ !strcmp (argv[i], "-dpy") ||
+ !strcmp (argv[i], "-disp") ||
+ !strcmp (argv[i], "-display"))
+ {
+ dpy_str = argv[++i];
+ if (!dpy_str) goto HELP;
+ }
+ else if (!strcmp (argv[i], "-sync") ||
+ !strcmp (argv[i], "-synch") ||
+ !strcmp (argv[i], "-synchronize") ||
+ !strcmp (argv[i], "-synchronise"))
+ p->xsync_p = True;
+ else if (!strcmp (argv[i], "-h") || !strcmp (argv[i], "-help"))
+ {
+ HELP:
+ fprintf (stderr,
+ "\n"
+ "\txscreensaver-gfx is launched by the xscreensaver daemon\n"
+ "\tto manage the graphical display modes as subprocesses.\n"
+ "\tDo not run this directly.\n"
+ "\n"
+ "\tOptions:\n"
+ "\t\t--dpy host:display.screen\n"
+ "\t\t--verbose --debug --sync\n"
+ "\t\t--init --emergency\n"
+ "\t\t--next --prev --select N --demo N\n"
+ "\n"
+ "\tRun 'xscreensaver-settings' to configure.\n"
+ "\n");
+ exit (1);
+ }
+ else if (!strcmp (argv[i], "-emergency"))
+ {
+ /* This means we should start up without a fade-out, blanking the
+ screen as quickly as possible. This is used when suspending,
+ and also if xscreensaver-gfx has crashed and is being restarted.
+ */
+ si->emergency_p = True;
+ }
+ else if (!strcmp (argv[i], "-next"))
+ {
+ /* "xscreensaver-command -next" sent a ClientMessage to the daemon
+ while it was idle, so we should start with this hack. */
+ si->selection_mode = -1; /* -1 means next */
+ }
+ else if (!strcmp (argv[i], "-prev"))
+ {
+ si->selection_mode = -2; /* -2 means prev */
+ }
+ else if (!strcmp (argv[i], "-select") ||
+ !strcmp (argv[i], "-demo"))
+ {
+ /* "xscreensaver-command -select N" sent a ClientMessage to the
+ daemon while it was idle, so we should start with this hack. */
+ int n;
+ char c;
+ if (!strcmp (argv[i], "-demo"))
+ si->demoing_p = True; /* Just means "don't auto-cycle" */
+
+ if (! argv[++i]) goto FAIL;
+ if (1 != sscanf (argv[i], " %d %c", &n, &c)) goto HELP;
+ if (n <= 0) goto FAIL;
+ si->selection_mode = n; /* hack number is 1-based */
+ }
+ else
+ {
+ FAIL:
+ fprintf (stderr, "\n%s: unknown option: %s\n", blurb(), oa);
+ goto HELP;
+ }
+ }
+
+ /* Copy the -dpy arg to $DISPLAY for subprocesses. */
+ s = (char *) malloc (strlen(dpy_str) + 20);
+ sprintf (s, "DISPLAY=%s", dpy_str);
+ putenv (s);
+ /* free (s); */ /* some versions of putenv do not copy */
+
+# ifdef ENABLE_NLS
+ {
+ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
+ textdomain (GETTEXT_PACKAGE);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+ if (!setlocale (LC_ALL, ""))
+ fprintf (stderr, "%s: warning: could not set default locale\n",
+ progname);
+ }
+# endif /* ENABLE_NLS */
+
+ connect_to_server (si);
+
+ if (p->xsync_p)
+ XSynchronize (si->dpy, True);
+
+ load_init_file (si->dpy, p);
+
+ /* Command line overrides init file */
+ if (cmdline_verbose_p)
+ p->verbose_p = cmdline_verbose_val;
+ verbose_p = p->verbose_p;
+ debug_p = p->debug_p;
+
+ main_loop (si, init_p); /* doesn't return */
+ exit (-1);
+}
diff --git a/driver/xscreensaver-gfx.man b/driver/xscreensaver-gfx.man
new file mode 100644
index 0000000..7b209ac
--- /dev/null
+++ b/driver/xscreensaver-gfx.man
@@ -0,0 +1,28 @@
+.TH XScreenSaver 1 "6-Jan-2021 (6.00)" "X Version 11"
+.SH NAME
+xscreensaver - extensible screen saver and screen locking framework
+.SH SYNOPSIS
+.B xscreensaver-gfx
+[\-display \fIhost:display.screen\fP]
+.SH DESCRIPTION
+The
+.BR xscreensaver (1)
+daemon launches this program to blank the screen and render graphics.
+It is responsible for launching graphics demos as sub-processes.
+Do not run this program directly.
+.SH SEE ALSO
+.BR xscreensaver (1),
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-auth (MANSUFFIX),
+.BR xscreensaver\-systemd (MANSUFFIX).
+.SH COPYRIGHT
+Copyright \(co 2021 by Jamie Zawinski.
+Permission to use, copy, modify, distribute, and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>
diff --git a/driver/xscreensaver-settings.man b/driver/xscreensaver-settings.man
new file mode 100644
index 0000000..6b9657d
--- /dev/null
+++ b/driver/xscreensaver-settings.man
@@ -0,0 +1,420 @@
+.TH XScreenSaver 1 "6-Jan-2021 (6.00)" "X Version 11"
+.SH NAME
+xscreensaver-settings - configure and control the xscreensaver daemon
+.SH SYNOPSIS
+.B xscreensaver\-settings
+[\-display \fIhost:display.screen\fP]
+[\-prefs]
+[\-debug]
+.SH DESCRIPTION
+The \fIxscreensaver\-settings\fP program is a graphical front-end for
+setting the parameters used by the
+.BR xscreensaver (1)
+daemon. It is a tool for editing the \fI~/.xscreensaver\fP file, and for
+demoing the various display modes.
+
+The main window consists of a menu bar and two tabbed pages. The first page
+is for editing the list of demos, and the second is for editing various other
+parameters of the screensaver.
+.SH MENU COMMANDS
+All of these commands are on either the \fBFile\fP or \fBHelp\fP menus:
+
+.TP 4
+.B Blank Screen Now
+Activates the background \fIxscreensaver\fP daemon, which will then run
+a demo at random. This is the same as running
+.BR xscreensaver\-command (1)
+with the \fI\-activate\fP option.
+
+.TP 4
+.B Lock Screen Now
+Just like \fBBlank Screen Now\fP, except the screen will be locked as
+well (even if it is not configured to lock all the time.) This is the
+same as running
+.BR xscreensaver\-command (1)
+with the \fI\-lock\fP option.
+
+.TP 4
+.B Kill Daemon
+If the xscreensaver daemon is running on this screen, kill it.
+This is the same as running
+.BR xscreensaver\-command (1)
+with the \fI\-exit\fP option.
+
+.TP 4
+.B Restart Daemon
+If the xscreensaver daemon is running on this screen, kill it.
+Then launch it again. This is the same as doing
+"\fIxscreensaver-command --exit\fP" followed by "\fIxscreensaver\fP".
+
+Note that it is \fInot\fP the same as doing
+"\fIxscreensaver-command --restart\fP".
+
+.TP 4
+.B Exit
+Exits the \fIxscreensaver-settings\fP program (this program) without
+affecting the background \fIxscreensaver\fP daemon, if any.
+
+.TP 4
+.B About...
+Displays the version number of this program, \fIxscreensaver-settings\fP.
+
+.TP 4
+.B Documentation...
+Opens up a web browser looking at the XScreenSaver web page, where you
+can find online copies of the
+.BR xscreensaver (1),
+.BR xscreensaver\-settings (1),
+and
+.BR xscreensaver\-command (1)
+manuals.
+.SH DISPLAY MODES TAB
+This page contains a list of the names of the various display modes, a
+preview area, and some fields that let you configure screen saver behavior.
+
+.TP 4
+.B Mode
+This option menu controls the activation behavior of the screen saver.
+The options are:
+.RS 4
+
+.TP 4
+.B Disable Screen Saver
+Don't ever blank the screen, and don't ever allow the monitor to power down.
+
+.TP 4
+.B Blank Screen Only
+When blanking the screen, just go black: don't run any graphics.
+
+.TP 4
+.B Only One Screen Saver
+When blanking the screen, only ever use one particular display mode (the
+one selected in the list.)
+
+.TP 4
+.B Random Screen Saver
+When blanking the screen, select a random display mode from among those
+that are enabled and applicable. If there are multiple monitors
+connected, run a different display mode on each one. This is the default.
+
+.TP 4
+.B Random Same Saver
+This is just like \fBRandom Screen Saver\fP, except that the \fIsame\fP
+randomly-chosen display mode will be run on all monitors, instead of
+different ones on each.
+.RE
+
+.TP 4
+.B Demo List
+Double-clicking in the list on the left will let you try out the indicated
+demo. The screen will go black, and the program will run in full-screen
+mode, just as it would if the \fIxscreensaver\fP daemon had launched it.
+Clicking the mouse again will stop the demo and un-blank the screen.
+
+Single-clicking in the list will run it in the small preview pane on the
+right. (But beware: many of the display modes behave somewhat differently
+when running in full-screen mode, so the scaled-down view might not give
+an accurate impression.)
+
+When \fBMode\fP is set to \fBRandom Screen Saver\fP, each name in the list
+has a checkbox next to it: this controls whether this display mode is
+enabled. If it is unchecked, then that mode will not be chosen. (Though
+you can still run it explicitly by double-clicking on its name.)
+
+.TP 4
+.B Arrow Buttons
+Beneath the list are a pair of up and down arrows. Clicking on the down
+arrow will select the next item in the list, and then run it in full-screen
+mode, just as if you had double-clicked on it. The up arrow goes the other
+way. This is just a shortcut for trying out all of the display modes in turn.
+
+.TP 4
+.B Blank After
+After the user has been idle this long, the \fIxscreensaver\fP daemon
+will blank the screen.
+
+.TP 4
+.B Cycle After
+After the screensaver has been running for this long, the currently
+running graphics demo will be killed, and a new one started.
+If this is 0, then the graphics demo will never be changed:
+only one demo will run until the screensaver is deactivated by user
+activity.
+
+If there are multiple screens, the savers are staggered slightly so
+that while they all change every \fIcycle\fP minutes, they don't all
+change at the same time.
+
+.TP 4
+.B Lock Screen
+When this is checked, the screen will be locked when it activates.
+
+.TP 4
+.B Lock Screen After
+This controls the length of the "grace period" between when the
+screensaver activates, and when the screen becomes locked. For
+example, if this is 5 minutes, and \fIBlank After\fP is 10 minutes,
+then after 10 minutes, the screen would blank. If there was user
+activity at 12 minutes, no password would be required to un-blank the
+screen. But, if there was user activity at 15 minutes or later (that
+is, \fILock Screen After\fP minutes after activation) then a password
+would be required. The default is 0, meaning that if locking is
+enabled, then a password will be required as soon as the screen blanks.
+
+.TP 4
+.B Preview
+This button, below the small preview window, runs the demo in full-screen
+mode so that you can try it out. This is the same thing that happens when
+you double-click an element in the list. Click the mouse to dismiss the
+full-screen preview.
+
+.TP 4
+.B Settings
+This button will pop up a dialog where you can configure settings specific
+to the display mode selected in the list.
+
+.SH SETTINGS DIALOG
+When you click on the \fISettings\fP button on the \fIDisplay Modes\fP
+tab, a configuration dialog will pop up that lets you customize settings
+of the selected display mode. Each display mode has its own custom
+configuration controls on the left side.
+
+On the right side is a paragraph or two describing the display mode.
+Below that is a \fBDocumentation\fP button that will display the display
+mode's manual page in a new window.
+
+The \fBAdvanced\fP button reconfigures the dialog box so that you can
+edit the display mode's command line directly, instead of using the
+graphical controls.
+.SH ADVANCED TAB
+This tab lets you change various settings used by the xscreensaver daemon
+itself, as well as some global options shared by all of the display modes.
+
+.B Image Manipulation
+
+Some of the graphics hacks manipulate images. These settings control
+where those source images come from. The savers load images by running the
+.BR xscreensaver\-getimage (MANSUFFIX)
+and
+.BR xscreensaver\-getimage\-file (MANSUFFIX)
+programs.
+.RS 4
+
+.TP 4
+.B Grab Desktop Images
+If this option is selected, then savers are allowed to manipulate the
+desktop image, that is, a display mode might draw a picture of your
+desktop melting, or being distorted in some way. The
+security-paranoid might want to disable this option, because if it is
+set, it means that the windows on your desktop will occasionally be
+visible while your screen is locked. Others will not be able to
+\fIdo\fP anything, but they may be able to \fIsee\fP whatever you left
+on your screen.
+
+.TP 4
+.B Grab Video Frames
+If your system has a video capture device, selecting this option may allow
+the image-manipulating modes to grab a still-frame of video to operate on.
+
+.TP 4
+.B Choose Random Image
+If this option is set, then the image-manipulating modes will select a
+random image file to operate on, from the specified source. That
+source may be a local directory, which will be recursively searched
+for images. Or, it may be the URL of an RSS or Atom feed (e.g., a
+Flickr gallery), in which case a random image from that feed will be
+selected instead. The contents of the feed will be cached locally and
+refreshed periodically as needed.
+.PP
+If more than one of the above image-related options are selected, then
+one will be chosen at random. If none of them are selected, then an
+image of video colorbars will be used instead.
+.RE
+.PP
+.B Text Manipulation
+
+Some of the display modes display and manipulate text. The following
+options control how that text is generated. The savers load text by
+running the
+.BR xscreensaver\-text (MANSUFFIX)
+program.
+.RS 4
+
+.TP 4
+.B Host Name and Time
+If this checkbox is selected, then the text used by the screen savers
+will be the local host name, OS version, date, time, and system load.
+
+.TP 4
+.B Text
+If this checkbox is selected, then the literal text typed in the
+field to its right will be used. If it contains % escape sequences,
+they will be expanded as per
+.BR strftime (2).
+
+.TP 4
+.B Text File
+If this checkbox is selected, then the contents of the corresponding
+file will be displayed.
+
+.TP 4
+.B Program
+If this checkbox is selected, then the given program will be run,
+repeatedly, and its output will be displayed.
+
+.TP 4
+.B URL
+If this checkbox is selected, then the given web page will be downloaded
+and displayed repeatedly. If the document contains HTML, RSS, or Atom,
+it will be converted to plain-text first.
+
+Note: this re-downloads the document every time the screen saver
+runs out of text, so it will probably be hitting that web server multiple
+times a minute.
+.RE
+.PP
+.B Power Management Settings
+
+These settings control whether, and when, your monitor powers down.
+.RS 4
+
+.TP 4
+.B Power Management Enabled
+Whether the monitor should be powered down after a period of inactivity.
+
+If this option is grayed out, it means your X server does not support
+the XDPMS extension, and so control over the monitor's power state is
+not available.
+
+.TP 4
+.B Standby After
+If \fIPower Management Enabled\fP is selected, the monitor will go black
+after this much idle time. (Graphics demos will stop running, also.)
+
+.TP 4
+.B Suspend After
+If \fIPower Management Enabled\fP is selected, the monitor will go
+into power-saving mode after this much idle time. This duration should
+be greater than or equal to \fIStandby\fP.
+
+.TP 4
+.B Off After
+If \fIPower Management Enabled\fP is selected, the monitor will fully
+power down after this much idle time. This duration should be greater
+than or equal to \fISuspend\fP.
+
+.TP 4
+.B Quick Power-off in "Blank Only" Mode
+If the display mode is set to \fIBlank Screen Only\fP and this is
+checked, then the monitor will be powered off immediately upon
+blanking, regardless of the other power-management settings. In this
+way, the power management idle-timers can be completely disabled, but
+the screen will be powered off when black.
+.RE
+.PP
+.B Blanking
+
+These options control how the screen fades to or from black when
+a screen saver begins or ends. Note: fading doesn't work with all
+video drivers.
+In particular, it does not work on the 2020-vintage Raspberry Pi.
+.RS 4
+
+.TP 4
+.B Fade To Black When Blanking
+If selected, then when the screensaver activates, the current contents
+of the screen will fade to black instead of simply winking out. A fade
+will also be done when switching from one display mode to another.
+
+.TP 4
+.B Unfade From Black When Unblanking
+The opposite: if selected, then when the screensaver deactivates, the original
+contents of the screen will fade in from black instead of appearing
+immediately. This is only done if \fIFade To Black\fP is also selected.
+
+.TP 4
+.B Fade Duration
+When fading or unfading are selected, this controls how long the fade will
+take.
+
+.RE
+.B Theme
+.RS 4
+This option menu lists the color schemes available for use on the
+unlock dialog.
+.RE
+
+There are more settings than these available, but these are the most
+commonly used ones; see the manual for
+.BR xscreensaver (1)
+for other parameters that can be set by editing the \fI~/.xscreensaver\fP
+file, or the X resource database.
+.SH COMMAND-LINE OPTIONS
+.I xscreensaver\-settings
+accepts the following command line options.
+.TP 8
+.B \-display \fIhost:display.screen\fP
+The X display to use. The \fIxscreensaver\-settings\fP program will open its
+window on that display, and also control the \fIxscreensaver\fP daemon that
+is managing that same display.
+
+.TP 8
+.B \-prefs
+Start up with the \fBAdvanced\fP tab selected by default
+instead of the \fBDisplay Modes\fP tab.
+
+.TP 8
+.B \-debug
+Causes lots of diagnostics to be printed on stderr.
+
+.P
+The \fIxscreensaver\fP and \fIxscreensaver\-settings\fP processes must run
+on the same machine, or at least, on two machines that share a file system.
+When \fIxscreensaver\-settings\fP writes a new version of
+the \fI~/.xscreensaver\fP file, \fIxscreensaver\fP needs to see that same
+file, or it won't work.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B PATH
+to find the sub-programs to run. However, note that the sub-programs
+are actually launched by the \fIxscreensaver\fP daemon, not
+by \fIxscreensaver-settings\fP itself. So, what matters is what \fB$PATH\fP
+that the \fIxscreensaver\fP program sees.
+.TP 8
+.B HOME
+for the directory in which to read and write the \fI.xscreensaver\fP file.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.TP 8
+.B HTTP_PROXY, HTTPS_PROXY, http_proxy, or https_proxy
+to get the default proxy host and port.
+.SH UPGRADES
+The latest version of xscreensaver, an online version of this manual,
+and a FAQ can always be found at https://www.jwz.org/xscreensaver/
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-command (1),
+.BR xscreensaver\-getimage (MANSUFFIX),
+.BR xscreensaver\-getimage\-file (MANSUFFIX),
+.BR xscreensaver\-getimage\-video (MANSUFFIX),
+.BR xscreensaver\-text (MANSUFFIX)
+.SH COPYRIGHT
+Copyright \(co 1992-2021 by Jamie Zawinski.
+Permission to use, copy, modify, distribute, and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 13-aug-1992.
+
+Please let me know if you find any bugs or make any improvements.
diff --git a/driver/xscreensaver-systemd.c b/driver/xscreensaver-systemd.c
index a46ed4d..d06174a 100644
--- a/driver/xscreensaver-systemd.c
+++ b/driver/xscreensaver-systemd.c
@@ -1,4 +1,5 @@
-/* xscreensaver-systemd, Copyright (c) 2019 Martin Lucina <martin@lucina.net>
+/* xscreensaver-systemd, Copyright (c) 2019-2021
+ * Martin Lucina <martin@lucina.net> and Jamie Zawinski <jwz@jwz.org>
*
* ISC License
*
@@ -16,217 +17,966 @@
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * This is a small utility providing systemd integration for XScreenSaver.
*
- * When run from ~/.xsession or equivalent, this will:
+ * This utility provides systemd integration for XScreenSaver.
+ * It does two things:
*
- * - Lock the screen before the system goes to sleep (using
- * xscreensaver-command -suspend).
+ * - When the system is about to go to sleep (e.g., laptop lid closing)
+ * it locks the screen *before* the system goes to sleep, by running
+ * "xscreensaver-command -suspend". And then when the system wakes
+ * up again, it runs "xscreensaver-command -deactivate" to force the
+ * unlock dialog to appear immediately.
*
- * - Ensure the XScreenSaver password dialog is shown after the system
- * is resumed (using xscreensaver-command -deactivate).
+ * - When another process on the system makes asks for the screen saver
+ * to be inhibited (e.g. because a video is playing) this program
+ * periodically runs "xscreensaver-command -deactivate" to keep the
+ * display un-blanked. It does this until the other program asks for
+ * it to stop.
*
- * This is implemented using the recommended way to do these things
- * nowadays, namely inhibitor locks. sd-bus is used for DBUS communication,
- * so the only dependency is libsystemd (which you already have if you
- * want this).
+ * For this to work at all, you must prevent Gnome and KDE from usurping
+ * the "org.freedesktop.ScreenSaver" messages, or else this program can't
+ * receive them. The "xscreensaver" man page contains the (complicated)
+ * installation instructions.
+ *
+ * Background:
+ *
+ * For decades, the traditional way for a video player to temporarily
+ * inhibit the screen saver was to have a heartbeat command that ran
+ * "xscreensaver-command -deactivate" once a minute while the video was
+ * playing, and ceased when the video was paused or stopped. The reason
+ * to do it as a heartbeat rather than a toggle is so that the player
+ * fails SAFE -- if the player exits abnormally, the heart stops beating,
+ * and screen saving and locking resumes.
+ *
+ * These days, the popular apps do this by using systemd. The design of
+ * the systemd method easily and trivially allows an app to inhibit the
+ * screen saver, crash, and then never un-inhibit it, so now your screen
+ * will never blank again.
+ *
+ * Furthermore, since the systemd method uses cookies to ensure that only
+ * the app that sent "inhibit" can send the matching "uninhibit", simply
+ * re-launching the crashed video player does not fix the problem.
+ *
+ * "Did IQs just drop sharply while I was away?" -- Ellen Ripley
+ *
+ * We can sometimes detect that the inhibiting app has exited abnormally
+ * by using "tracking peers" but I'm not sure how reliable that is.
+ *
+ * Furthermore, we can't listen for these "inhibit blanking" requests
+ * if some other program is already listening for them -- which Gnome and
+ * KDE do by default, even if their screen savers are otherwise disabled.
+ * That makes it far more complicated for the user to install XScreenSaver
+ * in such a way that "xscreensaver-systemd" can even launch at all.
+ *
+ * To recap: because the existing video players decided to delete the
+ * single line of code that they already had -- the heartbeat call to
+ * "xscreensaver-command -deactivate" -- we had to respond by adding a
+ * THOUSAND LINES of complicated code that talks to a server that may
+ * not be running, and that may not allow us to connect, and that may
+ * not work properly anyway, and that makes installation hellaciously
+ * difficult and confusing for the end user.
+ *
+ * This is what is laughingly referred to as "progress".
+ *
+ * So here's what we're dealing with now, with the various apps that
+ * you might use to play video on Linux at the end of 2020:
+ *
+ *
+ *****************************************************************************
+ *
+ * Firefox (version 78.5)
+ *
+ * When playing media, Firefox will send "inhibit" to one of these
+ * targets: "org.freedesktop.ScreenSaver" or "org.gnome.SessionManager".
+ *
+ * However, Firefox decides which, if any, of those to use at launch time,
+ * and does not revisit that decision. So if xscreensaver-systemd has not
+ * been launched before Firefox, it won't work. Fortunately, in most use
+ * cases, xscreensaver will have been launched earlier in the startup
+ * sequence than the web browser.
+ *
+ * If you close the tab or exit while playing, Firefox sends "uninhibit".
+ *
+ * Critical Firefox Bug:
+ *
+ * If Firefox crashes or is killed while playing, it never sends
+ * "uninhibit", leaving the screen saver permanently inhibited. Once
+ * that happens, the only way to un-fuck things is to kill and restart
+ * the "xscreensaver-systemd" program.
+ *
+ * Annoying Firefox Bug:
+ *
+ * Firefox sends an "inhibit" message when it is merely playing audio.
+ * That's horrible. Playing audio should prevent your machine from going
+ * to sleep, but it should NOT prevent your screen from blanking or
+ * locking.
+ *
+ * However at least it sends it with the reason "audio-playing" instead
+ * of "video-playing", meaning we can (and do) special-case Firefox and
+ * ignore that one.
+ *
+ *
+ *****************************************************************************
+ *
+ * Chrome (version 87)
+ *
+ * Sends "inhibit" to "org.freedesktop.ScreenSaver" (though it uses a
+ * a different object path than Firefox does). Unlike Firefox, Chrome
+ * does not send an "inhibit" message when only audio is playing.
+ *
+ * Critical Chrome Bug:
+ *
+ * If Chrome crashes or is killed while playing, it never sends
+ * "uninhibit", leaving the screen saver permanently inhibited.
+ *
+ *
+ *****************************************************************************
+ *
+ * Chromium (version 78, Raspbian 10.4)
+ *
+ * Does not use "org.freedesktop.ScreenSaver" or "xdg-screensaver".
+ * It appears to make no attempt to inhibit the screen saver while
+ * video is playing.
+ *
+ *
+ *****************************************************************************
+ *
+ * Chromium (version 84.0.4147.141, Raspbian 10.6)
+ *
+ * Sends "inhibit" to "org.freedesktop.ScreenSaver" (though it uses a
+ * a different object path than Firefox does). Unlike Firefox, Chrome
+ * does not send an "inhibit" message when only audio is playing.
+ *
+ * If you close the tab or exit while playing, Chromium sends "uninhibit".
+ *
+ * Critical Chromium Bug:
+ *
+ * If Chromium crashes or is killed while playing, it never sends
+ * "uninhibit", leaving the screen saver permanently inhibited.
+ *
+ * Annoying Chromium Bug:
+ *
+ * Like Firefox, Chromium sends an "inhibit" message when it is merely
+ * playing audio. Unlike Firefox, it sends exactly the same "reason"
+ * string as it does when playing video, so we can't tell them apart.
+ *
+ *
+ *****************************************************************************
+ *
+ * MPV (version 0.29.1)
+ *
+ * While playing, it runs "xdg-screensaver reset" every 10 seconds as a
+ * heartbeat. That program is a super-complicated shell script that will
+ * eventually run "xscreensaver-command -reset". So MPV talks to the
+ * xscreensaver daemon directly rather than going through systemd.
+ * That's fine.
+ *
+ * On Debian 10.4 and 10.6, MPV does not have a dependency on the
+ * "xdg-utils" package, so "xdg-screensaver" might not be installed.
+ * Oddly, Chromium *does* have a dependency on "xdg-utils", even though
+ * Chromium doesn't run "xdg-screensaver".
+ *
+ * The source code suggests that MPlayer and MPV call XResetScreenSaver()
+ * as well, but only affects the X11 server's built-in screen saver, not
+ * a userspace screen locker like xscreensaver.
+ *
+ * They also call XScreenSaverSuspend() which is part of the MIT
+ * SCREEN-SAVER server extension. XScreenSaver does make use of that
+ * extension because it is worse than useless. See the commentary at
+ * the top of xscreensaver.c for details.
+ *
+ * Annoying MPV Bug:
+ *
+ * Like Firefox and Chromium, MPV inhibits screen blanking when only
+ * audio is playing.
+ *
+ *
+ *****************************************************************************
+ *
+ * MPlayer (version mplayer-gui 2:1.3.0)
+ *
+ * I can't get this thing to play video at all. It only plays the audio
+ * of MP4 files, so I can't guess what it might or might not do with video.
+ * It appears to make no attempt to inhibit the screen saver.
+ *
+ *
+ *****************************************************************************
+ *
+ * VLC (version 3.0.11-0+deb10u1+rpt3)
+ *
+ * VLC sends "inhibit" to "org.freedesktop.ScreenSaver" when playing
+ * video. It does not send "inhibit" when playing audio only, and it
+ * sends "uninhibit" under all the right circumstances.
+ *
+ * NOTE: that's what I saw when I tested it on Raspbian 10.6. However,
+ * the version that came with Raspbian 10.4 -- which also called itself
+ * "VLC 3.0.11" -- did not send "uninhibit" when using the window
+ * manager's "close" button! Or when killed with "kill".
+ *
+ * NOTE ALSO: The VLC source code suggests that under some circumstances
+ * it might be talking to these instead: "org.freedesktop.ScreenSaver",
+ * "org.freedesktop.PowerManagement.Inhibit", "org.mate.SessionManager",
+ * and/or "org.gnome.SessionManager". It also contains code to run
+ * "xdg-screensaver reset" as a heartbeat. I can't tell how it decides
+ * which system to use. I have never seen it run "xdg-screensaver".
+ *
+ *
+ *****************************************************************************
+ *
+ * Zoom
+ *
+ * I'm told that the proprietary Zoom executable for Linux sends "inhibit"
+ * to "org.freedesktop.ScreenSaver", but I don't have any further details.
+ *
+ *****************************************************************************
+ *
+ * TO DO:
+ *
+ * - What precisely does the standalone Zoom executable do on Linux?
+ * There doesn't seem to be a Raspbian build, so I can't test it.
+ *
+ * - xscreensaver_method_uninhibit() does not actually send a reply, are
+ * we doing the right thing when registering it?
+ *
+ * - Currently this code is only listening to "org.freedesktop.ScreenSaver".
+ * Perhaps it should listen to "org.mate.SessionManager" and
+ * "org.gnome.SessionManager"? Where are those documented?
+ *
+ * - Do we need to call sd_bus_release_name() explicitly on exit?
+ *
+ * - Run under valgrind to check for any memory leaks.
+ *
+ * - Apparently the two different desktops have managed to come up with
+ * *three* different ways for dbus clients to ask the question, "is the
+ * screen currently blanked?" We should probably also respond to these:
+ *
+ * qdbus org.freedesktop.ScreenSaver /ScreenSaver org.freedesktop.ScreenSaver.GetActive
+ * qdbus org.kde.screensaver /ScreenSaver org.freedesktop.ScreenSaver.GetActive
+ * qdbus org.gnome.ScreenSaver /ScreenSaver org.gnome.ScreenSaver.GetActive
+ *
+ *
+ *
+ * TESTING:
+ *
+ * To call the D-BUS methods manually, you can use "busctl":
+ *
+ * busctl --user call org.freedesktop.ScreenSaver \
+ * /ScreenSaver org.freedesktop.ScreenSaver \
+ * Inhibit ss test-application test-reason
+ *
+ * This will hand out a cookie, which you can pass back to UnInhibit:
+ *
+ * u 1792821391
+ *
+ * busctl --user call org.freedesktop.ScreenSaver \
+ * /ScreenSaver org.freedesktop.ScreenSaver \
+ * UnInhibit u 1792821391
*
* https://github.com/mato/xscreensaver-systemd
*/
-#include <assert.h>
-#include <err.h>
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <poll.h>
#include <errno.h>
+#include <stdint.h>
#include <stdlib.h>
+#include <string.h>
#include <sys/wait.h>
#include <unistd.h>
+#include <time.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <signal.h>
+#include <X11/Xlib.h>
#include <systemd/sd-bus.h>
+#include "version.h"
+#include "blurb.h"
+#include "yarandom.h"
+#include "queue.h"
+
+static char *screensaver_version;
+
+#define DBUS_CLIENT_NAME "org.jwz.XScreenSaver"
+#define DBUS_SD_SERVICE_NAME "org.freedesktop.login1"
+#define DBUS_SD_OBJECT_PATH "/org/freedesktop/login1"
+#define DBUS_SD_INTERFACE "org.freedesktop.login1.Manager"
+#define DBUS_SD_METHOD "Inhibit"
+#define DBUS_SD_METHOD_ARGS "ssss"
+#define DBUS_SD_METHOD_WHAT "sleep"
+#define DBUS_SD_METHOD_WHO "xscreensaver"
+#define DBUS_SD_METHOD_WHY "lock screen on suspend"
+#define DBUS_SD_METHOD_MODE "delay"
+
+#define DBUS_SD_MATCH "type='signal'," \
+ "interface='" DBUS_SD_INTERFACE "'," \
+ "member='PrepareForSleep'"
+
+#define DBUS_FDO_NAME "org.freedesktop.ScreenSaver"
+#define DBUS_FDO_OBJECT_PATH "/ScreenSaver" /* Firefox */
+#define DBUS_FDO_OBJECT_PATH_2 "/org/freedesktop/ScreenSaver" /* Chrome */
+#define DBUS_FDO_INTERFACE "org.freedesktop.ScreenSaver"
+
+#define HEARTBEAT_INTERVAL 50 /* seconds */
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+
struct handler_ctx {
- sd_bus *bus;
- sd_bus_message *lock;
+ sd_bus *system_bus;
+ sd_bus_message *lock_message;
+ int lock_fd;
+ int is_inhibited;
+ sd_bus_track *track;
+};
+
+static struct handler_ctx global_ctx = { NULL, NULL, -1, 0, NULL };
+
+SLIST_HEAD(inhibit_head, inhibit_entry) inhibit_head =
+ SLIST_HEAD_INITIALIZER(inhibit_head);
+
+struct inhibit_entry {
+ uint32_t cookie;
+ time_t start_time;
+ char *appname;
+ char *peer;
+ SLIST_ENTRY(inhibit_entry) entries;
};
-static struct handler_ctx global_ctx = { NULL, NULL };
-static int handler(sd_bus_message *m, void *arg,
- sd_bus_error *ret_error)
+
+static void
+xscreensaver_command (const char *cmd)
{
- struct handler_ctx *ctx = arg;
- int before_sleep;
- int rc;
- sd_bus_error error = SD_BUS_ERROR_NULL;
- sd_bus_message *reply = NULL;
- int fd;
-
- rc = sd_bus_message_read(m, "b", &before_sleep);
- if (rc < 0) {
- warnx("Failed to read message: %s", strerror(-rc));
- return 0;
- }
+ char buf[1024];
+ int rc;
+ sprintf (buf, "xscreensaver-command %.100s -%.100s",
+ (verbose_p ? "-verbose" : "-quiet"),
+ cmd);
+ if (verbose_p)
+ fprintf (stderr, "%s: exec: %s\n", blurb(), buf);
+ rc = system (buf);
+ if (rc == -1)
+ fprintf (stderr, "%s: exec failed: %s\n", blurb(), buf);
+ else if (WEXITSTATUS(rc) != 0)
+ fprintf (stderr, "%s: exec: \"%s\" exited with status %d\n",
+ blurb(), buf, WEXITSTATUS(rc));
+}
- /* Use the scheme described at
- * https://www.freedesktop.org/wiki/Software/systemd/inhibit/
- * under "Taking Delay Locks".
- */
- if (before_sleep) {
- rc = system("xscreensaver-command -suspend");
- if (rc == -1) {
- warnx("Failed to run xscreensaver-command");
- }
- else if (WEXITSTATUS(rc) != 0) {
- warnx("xscreensaver-command failed with %d", WEXITSTATUS(rc));
- }
- if (ctx->lock) {
- /*
- * This will release the lock, since we hold the only ref to the
- * message, and sd_bus_message_unref() will close the underlying
- * fd.
- */
- sd_bus_message_unref(ctx->lock);
- ctx->lock = NULL;
- }
- else {
- warnx("Warning: ctx->lock is NULL, this should not happen?");
- }
+static int
+xscreensaver_register_sleep_lock (struct handler_ctx *ctx)
+{
+ sd_bus_error error = SD_BUS_ERROR_NULL;
+ sd_bus_message *reply = NULL;
+ int fd = -1;
+ int rc = sd_bus_call_method (ctx->system_bus,
+ DBUS_SD_SERVICE_NAME, DBUS_SD_OBJECT_PATH,
+ DBUS_SD_INTERFACE, DBUS_SD_METHOD,
+ &error, &reply,
+ DBUS_SD_METHOD_ARGS,
+ DBUS_SD_METHOD_WHAT, DBUS_SD_METHOD_WHO,
+ DBUS_SD_METHOD_WHY, DBUS_SD_METHOD_MODE);
+ if (rc < 0) {
+ fprintf (stderr, "%s: inhibit sleep failed: %s\n",
+ blurb(), error.message);
+ goto DONE;
+ }
+
+ /* Save the lock fd and explicitly take a ref to the lock message. */
+ rc = sd_bus_message_read (reply, "h", &fd);
+ if (rc < 0 || fd < 0) {
+ fprintf (stderr, "%s: inhibit sleep failed: no lock fd: %s\n",
+ blurb(), strerror(-rc));
+ goto DONE;
+ }
+ sd_bus_message_ref(reply);
+ ctx->lock_message = reply;
+ ctx->lock_fd = fd;
+
+ DONE:
+ sd_bus_error_free (&error);
+
+ return rc;
+}
+
+
+/* Called when DBUS_SD_INTERFACE sends a "PrepareForSleep" signal.
+ The event is sent twice: before sleep, and after.
+ */
+static int
+xscreensaver_systemd_handler (sd_bus_message *m, void *arg,
+ sd_bus_error *ret_error)
+{
+ struct handler_ctx *ctx = arg;
+ int before_sleep;
+ int rc;
+
+ rc = sd_bus_message_read (m, "b", &before_sleep);
+ if (rc < 0) {
+ fprintf (stderr, "%s: message read failed: %s\n",
+ blurb(), strerror(-rc));
+ return 1; /* >= 0 means success */
+ }
+
+ /* Use the scheme described at
+ https://www.freedesktop.org/wiki/Software/systemd/inhibit/
+ under "Taking Delay Locks".
+ */
+
+ if (before_sleep) {
+ /* Tell xscreensaver that we are suspending, and to lock if desired. */
+ xscreensaver_command ("suspend");
+
+ if (ctx->lock_message) {
+ /* Release the lock, meaning we are done and it's ok to sleep now.
+ Don't rely on unref'ing the message to close the fd, do that
+ explicitly here.
+ */
+ close(ctx->lock_fd);
+ sd_bus_message_unref (ctx->lock_message);
+ ctx->lock_message = NULL;
+ ctx->lock_fd = -1;
+ } else {
+ fprintf (stderr, "%s: no context lock\n", blurb());
}
- else {
- rc = system("xscreensaver-command -deactivate");
- if (rc == -1) {
- warnx("Failed to run xscreensaver-command");
- }
- else if (WEXITSTATUS(rc) != 0) {
- warnx("xscreensaver-command exited with %d", WEXITSTATUS(rc));
- }
+ } else {
+ /* Tell xscreensaver to present the unlock dialog right now. */
+ xscreensaver_command ("deactivate");
- rc = sd_bus_call_method(ctx->bus,
- "org.freedesktop.login1",
- "/org/freedesktop/login1",
- "org.freedesktop.login1.Manager",
- "Inhibit",
- &error,
- &reply,
- "ssss",
- "sleep",
- "xscreensaver",
- "lock screen on suspend",
- "delay");
- if (rc < 0) {
- warnx("Failed to call Inhibit(): %s", error.message);
- goto out;
- }
- /*
- * Verify that the reply actually contains a lock fd.
- */
- rc = sd_bus_message_read(reply, "h", &fd);
+ /* We woke from sleep, so we need to re-register for the next sleep. */
+ rc = xscreensaver_register_sleep_lock (ctx);
+ if (rc < 0)
+ fprintf (stderr, "%s: could not re-register sleep lock\n", blurb());
+ }
+
+ return 1; /* >= 0 means success */
+}
+
+
+/* Called from the vtable when another process sends a request to systemd
+ to inhibit the screen saver. We return to them a cookie which they must
+ present with their "uninhibit" request.
+ */
+static int
+xscreensaver_method_inhibit (sd_bus_message *m, void *arg,
+ sd_bus_error *ret_error)
+{
+ struct handler_ctx *ctx = arg;
+ const char *application_name = 0, *inhibit_reason = 0;
+ struct inhibit_entry *entry = 0;
+ const char *s;
+ const char *sender;
+
+ int rc = sd_bus_message_read(m, "ss", &application_name, &inhibit_reason);
+ if (rc < 0) {
+ fprintf (stderr, "%s: failed to parse method call: %s\n",
+ blurb(), strerror(-rc));
+ return rc;
+ }
+
+ if (!application_name || !*application_name) {
+ fprintf (stderr, "%s: no app name in method call\n", blurb());
+ return -1;
+ }
+
+ if (!inhibit_reason || !*inhibit_reason) {
+ fprintf (stderr, "%s: no reason in method call from \"%s\"\n",
+ blurb(), application_name);
+ return -1;
+ }
+
+ sender = sd_bus_message_get_sender (m);
+
+ /* Omit directory (Chrome does this shit) */
+ s = strrchr (application_name, '/');
+ if (s && s[1]) application_name = s+1;
+
+ if (strcasestr (inhibit_reason, "audio") &&
+ !strcasestr (inhibit_reason, "video")) {
+ /* Firefox 78 sends an inhibit when playing audio only, with reason
+ "audio-playing". This is horrible. Ignore it. (But perhaps it
+ would be better to accept it, issue them a cookie, and then just
+ ignore that entry?) */
+ if (verbose_p)
+ fprintf (stderr, "%s: inhibited by \"%s\" (%s) with \"%s\", ignored\n",
+ blurb(), application_name, sender, inhibit_reason);
+ return -1;
+ }
+
+ /* Tell the global tracker object to monitor when this peer exits. */
+ rc = sd_bus_track_add_name(ctx->track, sender);
+ if (rc < 0) {
+ fprintf (stderr, "%s: failed to track peer \"%s\": %s\n",
+ blurb(), sender, strerror(-rc));
+ sender = NULL;
+ }
+
+ entry = malloc(sizeof (struct inhibit_entry));
+ entry->cookie = ya_random();
+ entry->appname = strdup(application_name);
+ entry->peer = sender ? strdup(sender) : NULL;
+ entry->start_time = time ((time_t *)0);
+ SLIST_INSERT_HEAD(&inhibit_head, entry, entries);
+ ctx->is_inhibited++;
+ if (verbose_p)
+ fprintf (stderr, "%s: inhibited by \"%s\" (%s) with \"%s\""
+ " -> cookie %08X\n",
+ blurb(), application_name, sender, inhibit_reason, entry->cookie);
+
+ return sd_bus_reply_method_return (m, "u", entry->cookie);
+}
+
+
+/* Called from the vtable when another process sends a request to systemd
+ to uninhibit the screen saver. The cookie must match an earlier "inhibit"
+ request.
+ */
+static int
+xscreensaver_method_uninhibit (sd_bus_message *m, void *arg,
+ sd_bus_error *ret_error)
+{
+ struct handler_ctx *ctx = arg;
+ uint32_t cookie;
+ struct inhibit_entry *entry;
+ int found = 0;
+ const char *sender;
+
+ int rc = sd_bus_message_read (m, "u", &cookie);
+ if (rc < 0) {
+ fprintf (stderr, "%s: failed to parse method call: %s\n",
+ blurb(), strerror(-rc));
+ return rc;
+ }
+
+ sender = sd_bus_message_get_sender (m);
+
+ SLIST_FOREACH(entry, &inhibit_head, entries) {
+ if (entry->cookie == cookie) {
+ if (verbose_p)
+ fprintf (stderr, "%s: uninhibited by \"%s\" (%s) with cookie %08X\n",
+ blurb(), entry->appname, sender, cookie);
+ SLIST_REMOVE (&inhibit_head, entry, inhibit_entry, entries);
+ if (entry->appname) free (entry->appname);
+ if (entry->peer) {
+ rc = sd_bus_track_remove_name(ctx->track, entry->peer);
if (rc < 0) {
- warnx("Failed to read message: %s", strerror(-rc));
- goto out;
+ fprintf (stderr, "%s: failed to stop tracking peer \"%s\": %s\n",
+ blurb(), entry->peer, strerror(-rc));
}
- assert(fd >= 0);
- ctx->lock = reply;
-
-out:
- sd_bus_error_free(&error);
+ free(entry->peer);
+ }
+ free(entry);
+ ctx->is_inhibited--;
+ if (ctx->is_inhibited < 0)
+ ctx->is_inhibited = 0;
+ found = 1;
+ break;
}
+ }
- return 0;
+ if (! found)
+ fprintf (stderr, "%s: uninhibit: no match for cookie %08X\n",
+ blurb(), cookie);
+
+ return sd_bus_reply_method_return (m, "");
}
-int main(int argc, char *argv[])
+/*
+ * This vtable defines the service interface we implement.
+ */
+static const sd_bus_vtable
+xscreensaver_dbus_vtable[] = {
+ SD_BUS_VTABLE_START(0),
+ SD_BUS_METHOD("Inhibit", "ss", "u", xscreensaver_method_inhibit,
+ SD_BUS_VTABLE_UNPRIVILEGED),
+ SD_BUS_METHOD("UnInhibit", "u", "", xscreensaver_method_uninhibit,
+ SD_BUS_VTABLE_UNPRIVILEGED),
+ SD_BUS_VTABLE_END
+};
+
+
+/* The only reason this program connects to X at all is so that it dies
+ right away when the X server shuts down. Otherwise the process might
+ linger, still connected to systemd but unable to connect to xscreensaver.
+ */
+static Display *
+open_dpy (void)
{
- sd_bus *bus = NULL, *user_bus = NULL;
- sd_bus_slot *slot = NULL;
- struct handler_ctx *ctx = &global_ctx;
- sd_bus_error error = SD_BUS_ERROR_NULL;
- sd_bus_message *reply = NULL;
- int rc;
- int fd;
- const char *match =
- "type='signal',interface='org.freedesktop.login1.Manager'"
- ",member='PrepareForSleep'";
-
- rc = sd_bus_open_user(&user_bus);
- if (rc < 0) {
- warnx("Failed to connect to user bus: %s", strerror(-rc));
- goto out;
- }
- rc = sd_bus_request_name(user_bus, "org.jwz.XScreenSaver", 0);
- if (rc < 0) {
- warnx("Failed to acquire well-known name: %s", strerror(-rc));
- warnx("Is another copy of xscreensaver-systemd running?");
- goto out;
+ Display *d;
+ const char *s = getenv("DISPLAY");
+ if (!s || !*s) {
+ fprintf (stderr, "%s: $DISPLAY unset\n", progname);
+ exit (1);
+ }
+
+ d = XOpenDisplay (s);
+ if (!d) {
+ fprintf (stderr, "%s: can't open display %s\n", progname, s);
+ exit (1);
+ }
+
+ return d;
+}
+
+
+static pid_t
+get_bus_name_pid (sd_bus *bus, const char *name)
+{
+ int rc;
+ sd_bus_creds *creds;
+ pid_t pid;
+
+ rc = sd_bus_get_name_creds (bus, name, SD_BUS_CREDS_PID, &creds);
+ if (rc == 0) {
+ rc = sd_bus_creds_get_pid (creds, &pid);
+ sd_bus_creds_unref (creds);
+ if (rc == 0)
+ return pid;
+ }
+
+ return -1;
+}
+
+
+/* This only works on Linux, but it's useful for the error message.
+ */
+static char *
+process_name (pid_t pid)
+{
+ char fn[100], buf[100], *s;
+ FILE *fd = 0;
+ if (pid <= 0) goto FAIL;
+ /* "comm" truncates at 16 characters. "cmdline" has nulls between args. */
+ sprintf (fn, "/proc/%lu/cmdline", (unsigned long) pid);
+ fd = fopen (fn, "r");
+ if (!fd) goto FAIL;
+ if (!fgets (buf, sizeof(buf)-1, fd)) goto FAIL;
+ if (fclose (fd) != 0) goto FAIL;
+ s = strchr (buf, '\n');
+ if (s) *s = 0;
+ return strdup (buf);
+ FAIL:
+ if (fd) fclose (fd);
+ return 0;
+}
+
+
+static int
+xscreensaver_systemd_loop (void)
+{
+ sd_bus *system_bus = NULL, *user_bus = NULL;
+ struct handler_ctx *ctx = &global_ctx;
+ sd_bus_error error = SD_BUS_ERROR_NULL;
+ int rc;
+ time_t last_deactivate_time = 0;
+ Display *dpy = open_dpy();
+
+ /* 'user_bus' is where we receive messages from other programs sending
+ inhibit/uninhibit to org.freedesktop.ScreenSaver, etc.
+ */
+
+ rc = sd_bus_open_user (&user_bus);
+ if (rc < 0) {
+ fprintf (stderr, "%s: user bus connection failed: %s\n",
+ blurb(), strerror(-rc));
+ goto FAIL;
+ }
+
+ /* Create a single tracking object so that we can later ask it,
+ "is the peer with this name still around?" This is how we tell
+ that Firefox has exited without calling 'uninhibit'.
+ */
+ rc = sd_bus_track_new (user_bus,
+ &global_ctx.track,
+ NULL,
+ NULL);
+ if (rc < 0) {
+ fprintf (stderr, "%s: cannot create user bus tracker: %s\n",
+ blurb(), strerror(-rc));
+ goto FAIL;
+ }
+
+ rc = sd_bus_add_object_vtable (user_bus,
+ NULL,
+ DBUS_FDO_OBJECT_PATH,
+ DBUS_FDO_INTERFACE,
+ xscreensaver_dbus_vtable,
+ &global_ctx);
+ if (rc < 0) {
+ fprintf (stderr, "%s: vtable registration failed: %s\n",
+ blurb(), strerror(-rc));
+ goto FAIL;
+ }
+
+ rc = sd_bus_add_object_vtable (user_bus,
+ NULL,
+ DBUS_FDO_OBJECT_PATH_2,
+ DBUS_FDO_INTERFACE,
+ xscreensaver_dbus_vtable,
+ &global_ctx);
+ if (rc < 0) {
+ fprintf (stderr, "%s: vtable registration failed: %s\n",
+ blurb(), strerror(-rc));
+ goto FAIL;
+ }
+
+ {
+ const char * const names[] = { DBUS_FDO_NAME, DBUS_CLIENT_NAME };
+ int i = 0;
+ for (i = 0; i < countof(names); i++) {
+ rc = sd_bus_request_name (user_bus, names[i], 0);
+ if (rc < 0) {
+ pid_t pid = get_bus_name_pid (user_bus, names[i]);
+ if (pid != -1) {
+ char *pname = process_name (pid);
+ if (pname) {
+ fprintf (stderr,
+ "%s: connection failed: \"%s\" in use by pid %lu (%s)\n",
+ blurb(), names[i], (unsigned long) pid, pname);
+ free (pname);
+ } else {
+ fprintf (stderr,
+ "%s: connection failed: \"%s\" in use by pid %lu\n",
+ blurb(), names[i], (unsigned long) pid);
+ }
+ } else if (-rc == EEXIST || -rc == EALREADY) {
+ fprintf (stderr, "%s: connection failed: \"%s\" already in use\n",
+ blurb(), names[i]);
+ } else {
+ fprintf (stderr, "%s: connection failed for \"%s\": %s\n",
+ blurb(), names[i], strerror(-rc));
+ }
+ goto FAIL;
+ }
}
+ }
- rc = sd_bus_open_system(&bus);
- if (rc < 0) {
- warnx("Failed to connect to system bus: %s", strerror(-rc));
- goto out;
+ /* 'system_bus' is where we hold a lock on org.freedesktop.login1, meaning
+ that the system will send us a PrepareForSleep message when the system is
+ about to suspend.
+ */
+
+ rc = sd_bus_open_system (&system_bus);
+ if (rc < 0) {
+ fprintf (stderr, "%s: system bus connection failed: %s\n",
+ blurb(), strerror(-rc));
+ goto FAIL;
+ }
+
+ /* Obtain a lock fd from the "Inhibit" method, so that we can delay
+ sleep when a "PrepareForSleep" signal is posted. */
+
+ ctx->system_bus = system_bus;
+ rc = xscreensaver_register_sleep_lock (ctx);
+ if (rc < 0)
+ goto FAIL;
+
+ /* This is basically an event mask, saying that we are interested in
+ "PrepareForSleep", and to run our callback when that signal is thrown.
+ */
+ rc = sd_bus_add_match (system_bus, NULL, DBUS_SD_MATCH,
+ xscreensaver_systemd_handler,
+ &global_ctx);
+ if (rc < 0) {
+ fprintf (stderr, "%s: add match failed: %s\n", blurb(), strerror(-rc));
+ goto FAIL;
+ }
+
+ if (verbose_p)
+ fprintf (stderr, "%s: connected\n", blurb());
+
+
+ /* Run an event loop forever, and wait for our callback to run.
+ */
+ while (1) {
+ struct pollfd fds[3];
+ uint64_t poll_timeout, system_timeout, user_timeout;
+ struct inhibit_entry *entry;
+
+ /* We MUST call sd_bus_process() on each bus at least once before calling
+ sd_bus_get_events(), so just always start the event loop by processing
+ all outstanding requests on both busses. */
+ do {
+ rc = sd_bus_process (system_bus, NULL);
+ if (rc < 0) {
+ fprintf (stderr, "%s: failed to process system bus: %s\n",
+ blurb(), strerror(-rc));
+ goto FAIL;
+ }
+ } while (rc > 0);
+
+ do {
+ rc = sd_bus_process (user_bus, NULL);
+ if (rc < 0) {
+ fprintf (stderr, "%s: failed to process user bus: %s\n",
+ blurb(), strerror(-rc));
+ goto FAIL;
+ }
+ } while (rc > 0);
+
+ fds[0].fd = sd_bus_get_fd (system_bus);
+ fds[0].events = sd_bus_get_events (system_bus);
+ fds[0].revents = 0;
+
+ fds[1].fd = sd_bus_get_fd (user_bus);
+ fds[1].events = sd_bus_get_events (user_bus);
+ fds[1].revents = 0;
+
+ fds[2].fd = XConnectionNumber (dpy);
+ fds[2].events = POLLIN;
+ fds[2].revents = 0;
+
+
+ sd_bus_get_timeout (system_bus, &system_timeout);
+ sd_bus_get_timeout (user_bus, &user_timeout);
+
+ if (system_timeout == 0 && user_timeout == 0)
+ poll_timeout = 0;
+ else if (system_timeout == UINT64_MAX && user_timeout == UINT64_MAX)
+ poll_timeout = -1;
+ else {
+ poll_timeout = (system_timeout < user_timeout
+ ? system_timeout : user_timeout);
+ poll_timeout /= 1000000;
}
- ctx->bus = bus;
-
- rc = sd_bus_call_method(bus,
- "org.freedesktop.login1",
- "/org/freedesktop/login1",
- "org.freedesktop.login1.Manager",
- "Inhibit",
- &error,
- &reply,
- "ssss",
- "sleep",
- "xscreensaver",
- "lock screen on suspend",
- "delay");
- if (rc < 0) {
- warnx("Failed to call Inhibit(): %s", error.message);
- goto out;
+
+ /* Prune any entries whose original sender has gone away: this happens
+ if a program inhibits, then exits without having called uninhibit.
+ That would have left us inhibited forever, even if the inhibiting
+ program was re-launched, since the new instance won't have the
+ same cookie. */
+ SLIST_FOREACH (entry, &inhibit_head, entries) {
+ if (entry->peer &&
+ !sd_bus_track_count_name (ctx->track, entry->peer)) {
+ if (verbose_p)
+ fprintf (stderr,
+ "%s: peer %s for inhibiting app \"%s\" has died:"
+ " uninhibiting %08X\n",
+ blurb(),
+ entry->peer,
+ entry->appname,
+ entry->cookie);
+ SLIST_REMOVE (&inhibit_head, entry, inhibit_entry, entries);
+ if (entry->appname) free (entry->appname);
+ free(entry->peer);
+ free (entry);
+ ctx->is_inhibited--;
+ if (ctx->is_inhibited < 0)
+ ctx->is_inhibited = 0;
+ }
}
- /*
- * Verify that the reply actually contains a lock fd.
+
+
+ /* We want to wake up at least once every N seconds to de-activate
+ the screensaver if we have been inhibited.
*/
- rc = sd_bus_message_read(reply, "h", &fd);
+ if (poll_timeout > HEARTBEAT_INTERVAL * 1000)
+ poll_timeout = HEARTBEAT_INTERVAL * 1000;
+
+ rc = poll (fds, 3, poll_timeout);
if (rc < 0) {
- warnx("Failed to read message: %s", strerror(-rc));
- goto out;
+ fprintf (stderr, "%s: poll failed: %s\n", blurb(), strerror(-rc));
+ exit (EXIT_FAILURE);
}
- assert(fd >= 0);
- ctx->lock = reply;
- rc = sd_bus_add_match(bus, &slot, match, handler, &global_ctx);
- if (rc < 0) {
- warnx("Failed to add match: %s", strerror(-rc));
- goto out;
+ if (fds[2].revents & (POLLERR | POLLHUP | POLLNVAL)) {
+ fprintf (stderr, "%s: X connection closed\n", blurb());
+ goto FAIL;
}
- for (;;) {
- rc = sd_bus_process(bus, NULL);
- if (rc < 0) {
- warnx("Failed to process bus: %s", strerror(-rc));
- goto out;
+ if (ctx->is_inhibited) {
+ time_t now = time ((time_t *) 0);
+ if (now - last_deactivate_time >= HEARTBEAT_INTERVAL) {
+ if (verbose_p) {
+ SLIST_FOREACH (entry, &inhibit_head, entries) {
+ char ct[100];
+ ctime_r (&entry->start_time, ct);
+ fprintf (stderr, "%s: inhibited by \"%s\" since %s",
+ blurb(), entry->appname, ct);
+ }
}
- if (rc > 0)
- /* we processed a request, try to process another one, right-away */
- continue;
+ xscreensaver_command ("deactivate");
+ last_deactivate_time = now;
+ }
+ }
+ }
- /* Wait for the next request to process */
- rc = sd_bus_wait(bus, (uint64_t) -1);
- if (rc < 0) {
- warnx("Failed to wait on bus: %s", strerror(-rc));
- goto out;
- }
+ FAIL:
+
+ XCloseDisplay(dpy);
+
+ if (system_bus)
+ sd_bus_flush_close_unref (system_bus);
+
+ if (ctx->track)
+ sd_bus_track_unref (ctx->track);
+
+ if (user_bus)
+ sd_bus_flush_close_unref (user_bus);
+
+ sd_bus_error_free (&error);
+
+ return EXIT_FAILURE;
+}
+
+
+static char *usage = "\n\
+usage: %s [-verbose]\n\
+\n\
+This program is launched by the xscreensaver daemon to monitor DBus.\n\
+It invokes 'xscreensaver-command' to tell the xscreensaver daemon to lock\n\
+the screen before the system suspends, e.g., when a laptop's lid is closed.\n\
+\n\
+It also responds to certain messages sent by media players allowing them to\n\
+request that the screen not be blanked during playback.\n\
+\n\
+From XScreenSaver %s, (c) 1991-%s Jamie Zawinski <jwz@jwz.org>.\n";
+
+
+#define USAGE() do { \
+ fprintf (stderr, usage, progname, screensaver_version, year); exit (1); \
+ } while(0)
+
+
+int
+main (int argc, char **argv)
+{
+ int i;
+ char *version = strdup (screensaver_id + 17);
+ char *year = strchr (version, '-');
+ char *s = strchr (version, ' ');
+ *s = 0;
+ year = strchr (year+1, '-') + 1;
+ s = strchr (year, ')');
+ *s = 0;
+
+ screensaver_version = version;
+
+ progname = argv[0];
+ s = strrchr (progname, '/');
+ if (s) progname = s+1;
+
+ for (i = 1; i < argc; i++)
+ {
+ const char *s = argv [i];
+ int L;
+ if (s[0] == '-' && s[1] == '-') s++;
+ L = strlen (s);
+ if (L < 2) USAGE ();
+ else if (!strncmp (s, "-verbose", L)) verbose_p = 1;
+ else if (!strncmp (s, "-quiet", L)) verbose_p = 0;
+ else USAGE ();
}
-out:
- if (reply)
- sd_bus_message_unref(reply);
- if (slot)
- sd_bus_slot_unref(slot);
- if (bus)
- sd_bus_flush_close_unref(bus);
- if (user_bus)
- sd_bus_flush_close_unref(user_bus);
- sd_bus_error_free(&error);
-
- return EXIT_FAILURE;
+# undef ya_rand_init
+ ya_rand_init (0);
+
+ exit (xscreensaver_systemd_loop());
}
diff --git a/driver/xscreensaver-systemd.man b/driver/xscreensaver-systemd.man
index 082cac7..beb23e7 100644
--- a/driver/xscreensaver-systemd.man
+++ b/driver/xscreensaver-systemd.man
@@ -1,49 +1,67 @@
-.TH XScreenSaver 1 "4-Jun-2019 (5.43)" "X Version 11"
+.TH XScreenSaver 1 "6-Jan-2021 (6.00)" "X Version 11"
.SH NAME
-xscreensaver-systemd - lock the screen when the machine suspends.
+xscreensaver-systemd - lock the screen upon suspend, and inhibit
+screen-blanking during video playback.
.SH SYNOPSIS
-.B xscreensaver-systemd
+.B xscreensaver-systemd [-verbose]
.SH DESCRIPTION
-The \fIxscreensaver\-systemd\fP program is a helper program to
-integrate xscreensaver with
-.BR systemd (1).
-When run from \fI~/.xsession\fP or equivalent, this will:
-.TP 3
-\fB1:
-Lock the screen before the system goes to sleep
-(using \fIxscreensaver-command -suspend\fP).
-.TP 3
-\fB2:
-Ensure the XScreenSaver password dialog is shown after the system
-is resumed (using \fIxscreensaver-command -deactivate\fP).
+The \fIxscreensaver\-systemd\fP program is a helper program launched by
+.BR xscreensaver (1)
+for
+.BR systemd (1)
+or
+.BR elogind (8)
+integration. It does two things:
+.TP 2
+\fB*
+When the system is about to go to sleep (e.g., the laptop lid has just been
+closed) it locks the screen just \fIbefore\fP the system sleeps, by running
+\fIxscreensaver-command -suspend\fP. When the system wakes up again, it
+runs \fIxscreensaver-command -deactivate\fP to make the unlock dialog appear
+immediately. It does this through the
+.BR org.freedesktop.login1 (5)
+D-Bus interface.
+.TP 2
+\fB*
+When another process on the system asks for the screen saver to be
+inhibited (e.g. because a video is playing) this program periodically runs
+\fIxscreensaver-command -deactivate\fP to keep the display un-blanked.
+It does this until the other program asks for it to stop, or exits.
+It does this through the
+.BR org.freedesktop.ScreenSaver (5)
+D-Bus interface.
.RS 0
-
-This is implemented using inhibitor locks;
-.BR sd-bus (3)
-is used for DBUS communication.
.SH BUGS
-Uses libsystemd.
+Only one program at a time can register with
+.BR systemd (1)
+for screen-saver-related events, so if another screen saver is running as a
+part of the desktop environment, \fIxscreensaver-systemd\fP will be unable to
+launch. Likely adversaries include
+.BR ksmserver (1)
+and
+.BR gsd\-screensaver\-proxy (1).
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1),
-.BR xscreensaver\-demo (1),
+.BR xscreensaver\-settings (1),
.BR xscreensaver\-command (1),
.BR systemd (1),
-.BR sd-bus (3)
+.BR sd-bus (3),
+.BR elogind (8)
.SH COPYRIGHT
-Copyright \(co 2019 by Martin Lucina.
+Copyright \(co 2019-2021 by Martin Lucina and Jamie Zawinski.
Permission to use, copy, modify, and/or distribute this software
for any purpose with or without fee is hereby granted, provided
that the above copyright notice and this permission notice appear
in all copies.
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
-WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
-AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
-CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
-OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
-NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+The software is provided "as is" and the author disclaims all
+warranties with regard to this software including all implied
+warranties of merchantability and fitness. in no event shall the
+author be liable for any special, direct, indirect, or
+consequential damages or any damages whatsoever resulting from loss
+of use, data or profits, whether in an action of contract,
+negligence or other tortious action, arising out of or in
+connection with the use or performance of this software.
.SH AUTHOR
Martin Lucina <martin@lucina.net>, 4-Jun-2019
diff --git a/driver/xscreensaver.c b/driver/xscreensaver.c
index b9c54f1..4ac350d 100644
--- a/driver/xscreensaver.c
+++ b/driver/xscreensaver.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1991-2020 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -7,2535 +7,2429 @@
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
- */
-
-/* ========================================================================
- * First we wait until the keyboard and mouse become idle for the specified
- * amount of time. We do this in one of three different ways: periodically
- * checking with the XIdle server extension; selecting key and mouse events
- * on (nearly) all windows; or by waiting for the MIT-SCREEN-SAVER extension
- * to send us a "you are idle" event.
*
- * Then, we map a full screen black window.
+ * XScreenSaver Daemon, version 6.
+ *
+ * Having started its life in 1991, XScreenSaver acquired a lot of optional
+ * features to allow it to detect user activity, lock the screen and
+ * authenticate on systems as varied as VMS, SunOS, HPUX, SGI, and of course
+ * that young upstart, Linux. In such a heterogeneous environment, many
+ * features that would have simplified things were not universally available.
+ * Though I made an effort to follow a principle of minimal library usage in
+ * the XScreenSaver daemon, as described in my 2004 article "On Toolkits"
+ * <https://www.jwz.org/xscreensaver/toolkits.html>, there was still quite a
+ * lot of code in the daemon, more than is strictly necessary when we consider
+ * only modern, still-maintained operating systems.
*
- * We place a __SWM_VROOT property on this window, so that newly-started
- * clients will think that this window is a "virtual root" window (as per
- * the logic in the historical "vroot.h" header.)
+ * This 2021 refactor had one goal: to minimize the amount of code in which a
+ * crash will cause the screen to unlock. In service of that goal, the process
+ * which holds the keyboard an mouse grabbed should:
*
- * If there is an existing "virtual root" window (one that already had
- * an __SWM_VROOT property) then we remove that property from that window.
- * Otherwise, clients would see that window (the real virtual root) instead
- * of ours (the impostor.)
+ * - Be as small as technically possible, for ease of auditing;
*
- * Then we pick a random program to run, and start it. Two assumptions
- * are made about this program: that it has been specified with whatever
- * command-line options are necessary to make it run on the root window;
- * and that it has been compiled with vroot.h, so that it is able to find
- * the root window when a virtual-root window manager (or this program) is
- * running.
+ * - Link against as few libraries as possible, to bring in as little
+ * third-party code as possible;
*
- * Then, we wait for keyboard or mouse events to be generated on the window.
- * When they are, we kill the inferior process, unmap the window, and restore
- * the __SWM_VROOT property to the real virtual root window if there was one.
+ * - Delegate other tasks to helper programs running in other processes,
+ * in such a way that if those other processes should crash, the grabs
+ * remain intact and the screen remains locked.
*
- * On multi-screen systems, we do the above on each screen, and start
- * multiple programs, each with a different value of $DISPLAY.
+ * In the XScreenSaver 6 design, the division of labor is as follows:
*
- * On Xinerama systems, we do a similar thing, but instead create multiple
- * windows on the (only) display, and tell the subprocess which one to use
- * via the $XSCREENSAVER_WINDOW environment variable -- this trick requires
- * a recent (Aug 2003) revision of vroot.h.
+ * A) "xscreensaver" -- This is the main screen saver daemon. If this
+ * process crashes, the screen unlocks, so this is the one where
+ * minimizing the attack surface is critical.
*
- * (See comments in screens.c for more details about Xinerama/RANDR stuff.)
+ * - It reads events using the XInput extension version 2, which is
+ * required. This means that X11R7 is also required, which was
+ * released in 2009, and is ubiquitous as of 2021.
*
- * While we are waiting for user activity, we also set up timers so that,
- * after a certain amount of time has passed, we can start a different
- * screenhack. We do this by killing the running child process with
- * SIGTERM, and then starting a new one in the same way.
+ * - It links against only libX11 and libXi.
*
- * If there was a real virtual root, meaning that we removed the __SWM_VROOT
- * property from it, meaning we must (absolutely must) restore it before we
- * exit, then we set up signal handlers for most signals (SIGINT, SIGTERM,
- * etc.) that do this. Most Xlib and Xt routines are not reentrant, so it
- * is not generally safe to call them from signal handlers; however, this
- * program spends most of its time waiting, so the window of opportunity
- * when code could be called reentrantly is fairly small; and also, the worst
- * that could happen is that the call would fail. If we've gotten one of
- * these signals, then we're on our way out anyway. If we didn't restore the
- * __SWM_VROOT property, that would be very bad, so it's worth a shot. Note
- * that this means that, if you're using a virtual-root window manager, you
- * can really fuck up the world by killing this process with "kill -9".
+ * - It maps no windows and renders no graphics or text. It only
+ * acquires keyboard and mouse grabs, handles timer logic, and
+ * launches and manages several sub-processes.
*
- * This program accepts ClientMessages of type SCREENSAVER; these messages
- * may contain the atoms ACTIVATE, DEACTIVATE, etc, meaning to turn the
- * screensaver on or off now, regardless of the idleness of the user,
- * and a few other things. The included "xscreensaver-command" program
- * sends these messsages.
+ * B) "xscreensaver-gfx" -- When the time comes for the screen to blank,
+ * this process is launched to fade out, black out every monitor on
+ * the system, launch graphics demos to render on those blanked screens,
+ * and cycle them from time to time.
*
- * If we don't have the XIdle, MIT-SCREEN-SAVER, or SGI SCREEN_SAVER
- * extensions, then we do the XAutoLock trick: notice every window that
- * gets created, and wait 30 seconds or so until its creating process has
- * settled down, and then select KeyPress events on those windows which
- * already select for KeyPress events. It's important that we not select
- * KeyPress on windows which don't select them, because that would
- * interfere with event propagation. This will break if any program
- * changes its event mask to contain KeyRelease or PointerMotion more than
- * 30 seconds after creating the window, but such programs do not seem to
- * occur in nature (I've never seen it happen in all these years.)
+ * - If this program crashes, the screen does not unlock. The keyboard
+ * and mouse remain grabbed by the "xscreensaver" process, which will
+ * re-launch this process as necessary.
*
- * The reason that we can't select KeyPresses on windows that don't have
- * them already is that, when dispatching a KeyPress event, X finds the
- * lowest (leafmost) window in the hierarchy on which *any* client selects
- * for KeyPress, and sends the event to that window. This means that if a
- * client had a window with subwindows, and expected to receive KeyPress
- * events on the parent window instead of the subwindows, then that client
- * would malfunction if some other client selected KeyPress events on the
- * subwindows. It is an incredible misdesign that one client can make
- * another client malfunction in this way.
+ * - If it does crash, the logged in user's desktop may be momentarily
+ * visible before it re-launches, but it will be impossible to interact
+ * with it.
*
- * But here's a new kink that started showing up in late 2014: GNOME programs
- * don't actually select for or receive KeyPress events! They do it behind
- * the scenes through some kind of Input Method magic, even when running in
- * an en_US locale. However, in that case, those applications *do* seem to
- * update the _NET_WM_USER_TIME on their own windows every time they have
- * received a secret KeyPress, so we *also* monitor that property on every
- * window, and treat changes to it as identical to KeyPress.
+ * - This process must react to hot-swapping of monitors in order to
+ * keep the screen blanked and the desktop obscured, and manages the
+ * life cycle of the graphics demos, each running in their own
+ * sub-process of "xscreensaver-gfx".
*
- * To detect mouse motion, we periodically wake up and poll the mouse
- * position and button/modifier state, and notice when something has
- * changed. We make this check every five seconds by default, and since the
- * screensaver timeout has a granularity of one minute, this makes the
- * chance of a false positive very small. We could detect mouse motion in
- * the same way as keyboard activity, but that would suffer from the same
- * "client changing event mask" problem that the KeyPress events hack does.
- * I think polling is more reliable.
+ * C) The graphics demos themselves. Launched by "xscreensaver-gfx" to run
+ * on the windows provided, there is one of these processes for each
+ * screen. These can use X11 or OpenGL, and have no impact on security;
+ * if it breaks, you can keep both pieces.
*
- * On systems with /proc/interrupts (Linux) we poll that file and note when
- * the interrupt counter numbers on the "keyboard" and "PS/2" lines change.
- * (There is no reliable way, using /proc/interrupts, to detect non-PS/2
- * mice, so it doesn't help for serial or USB mice.)
+ * D) "xscreensaver-auth" -- When the time comes to prompt the user for their
+ * password to unlock the screen, the "xscreensaver" daemon launches this
+ * process. If it exits with a "success" error code, the screen unlocks,
+ * otherwise it does not. This means that if it crashes, the screen
+ * remains locked.
*
- * None of this crap happens if we're using one of the extensions. Sadly,
- * the XIdle extension hasn't been available for many years; the SGI
- * extension only exists on SGIs; and the MIT extension, while widely
- * deployed, is garbage in several ways.
+ * - It turns out that programs using the XInput 2 extension are able to
+ * snoop the keyboard even when the keyboard is grabbed by another
+ * process! So that's how this program reads user input, even while
+ * the "xscreensaver" process has the keyboard grabbed.
*
- * A third idle-detection option could be implemented (but is not): when
- * running on the console display ($DISPLAY is `localhost`:0) and we're on a
- * machine where /dev/tty and /dev/mouse have reasonable last-modification
- * times, we could just stat() those. But the incremental benefit of
- * implementing this is really small, so forget I said anything.
+ * - This program runs PAM, or whatever other authorization mechanisms
+ * are configured. On some systems, it may need to be setuid in order
+ * to read /etc/shadow, meaning it must disavow privileges after
+ * initialization but before connecting to the X server.
*
- * Debugging hints:
- * - Have a second terminal handy.
- * - Be careful where you set your breakpoints, you don't want this to
- * stop under the debugger with the keyboard grabbed or the blackout
- * window exposed.
- * - If you run your debugger under XEmacs, try M-ESC (x-grab-keyboard)
- * to keep your emacs window alive even when xscreensaver has grabbed.
- * - Go read the code related to `debug_p'.
- * - You probably can't set breakpoints in functions that are called on
- * the other side of a call to fork() -- if your subprocesses are
- * dying with signal 5, Trace/BPT Trap, you're losing in this way.
- * - If you aren't using a server extension, don't leave this stopped
- * under the debugger for very long, or the X input buffer will get
- * huge because of the keypress events it's selecting for. This can
- * make your X server wedge with "no more input buffers."
+ * - It gets to use libXft, so the fonts don't suck.
*
- * ======================================================================== */
+ * - In theory, this program could be implemented using any GUI toolkit,
+ * and thus take advantage of input methods, on-screen keyboards,
+ * screen readers, etc. Again, this is permissible because this
+ * program fails SAFE: if it crashes, the screen remains locked.
+ *
+ * E) "xscreensaver-systemd" -- This runs in the background and monitors
+ * requests on the systemd dbus. This is how closing the laptop lid
+ * causes the screen to lock, and how video players request that blanking
+ * be inhibited. This program invokes "xscreensaver-command" as needed
+ * to pass those requests along to "xscreensaver" via ClientMessages.
+ */
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
-#include <stdio.h>
-#include <ctype.h>
-#include <X11/Xlib.h>
-
-#ifdef ENABLE_NLS
-# include <locale.h>
-# include <libintl.h>
-#endif /* ENABLE_NLS */
+#include "version.h"
-#include <X11/Xlibint.h>
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
-#include <X11/Xatom.h>
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
-#include <X11/Shell.h>
-#include <X11/Xos.h>
+#include <stdio.h>
+#include <ctype.h>
#include <time.h>
#include <sys/time.h>
-#include <netdb.h> /* for gethostbyname() */
#include <sys/types.h>
-#include <pwd.h>
-#ifdef HAVE_XMU
-# ifndef VMS
-# include <X11/Xmu/Error.h>
-# else /* !VMS */
-# include <Xmu/Error.h>
-# endif /* !VMS */
-#else /* !HAVE_XMU */
-# include "xmu.h"
-#endif /* !HAVE_XMU */
+#include <sys/stat.h>
+#include <signal.h>
+#include <errno.h>
-#ifdef HAVE_MIT_SAVER_EXTENSION
-#include <X11/extensions/scrnsaver.h>
-#endif /* HAVE_MIT_SAVER_EXTENSION */
+#include <pwd.h> /* for getpwuid() */
+#include <grp.h> /* for getgrgid() */
-#ifdef HAVE_XIDLE_EXTENSION
-# include <X11/extensions/xidle.h>
-#endif /* HAVE_XIDLE_EXTENSION */
+#ifdef HAVE_UNAME
+# include <sys/utsname.h> /* for uname() */
+#endif /* HAVE_UNAME */
-#ifdef HAVE_SGI_VC_EXTENSION
-# include <X11/extensions/XSGIvc.h>
-#endif /* HAVE_SGI_VC_EXTENSION */
-
-#ifdef HAVE_READ_DISPLAY_EXTENSION
-# include <X11/extensions/readdisplay.h>
-#endif /* HAVE_READ_DISPLAY_EXTENSION */
+#ifdef HAVE_SYS_WAIT_H
+# include <sys/wait.h> /* for waitpid() and associated macros */
+#endif
-#ifdef HAVE_XSHM_EXTENSION
-# include <X11/extensions/XShm.h>
-#endif /* HAVE_XSHM_EXTENSION */
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+#include <X11/cursorfont.h>
+#include <X11/Xos.h>
+#include <X11/extensions/XInput2.h>
-#ifdef HAVE_DPMS_EXTENSION
-# include <X11/extensions/dpms.h>
-#endif /* HAVE_DPMS_EXTENSION */
+#include "xmu.h"
+#include "blurb.h"
+#include "atoms.h"
+#include "clientmsg.h"
+#include "xinput.h"
+#include "prefs.h"
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
-# include <X11/extensions/Xdbe.h>
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
-#ifdef HAVE_XF86VMODE
-# include <X11/extensions/xf86vmode.h>
-#endif /* HAVE_XF86VMODE */
+#undef ABS
+#define ABS(x)((x)<0?-(x):(x))
-#ifdef HAVE_XF86MISCSETGRABKEYSSTATE
-# include <X11/extensions/xf86misc.h>
-#endif /* HAVE_XF86MISCSETGRABKEYSSTATE */
+#undef MAX
+#define MAX(x,y)((x)>(y)?(x):(y))
-#ifdef HAVE_XINERAMA
-# include <X11/extensions/Xinerama.h>
-#endif /* HAVE_XINERAMA */
-#ifdef HAVE_RANDR
-# include <X11/extensions/Xrandr.h>
-#endif /* HAVE_RANDR */
+/* Globals used in this file.
+ */
+Bool debug_p = False;
+static Bool splash_p = True;
+static const char *version_number = 0;
+
+/* Preferences. */
+static Bool lock_p = False;
+static Bool locking_disabled_p = False;
+static unsigned int blank_timeout = 0;
+static unsigned int lock_timeout = 0;
+static unsigned int pointer_hysteresis = 0;
+static char *external_ungrab_command = NULL;
+
+/* Subprocesses. */
+#define SAVER_GFX_PROGRAM "xscreensaver-gfx"
+#define SAVER_AUTH_PROGRAM "xscreensaver-auth"
+#define SAVER_SYSTEMD_PROGRAM "xscreensaver-systemd"
+static pid_t saver_gfx_pid = 0;
+static pid_t saver_auth_pid = 0;
+static pid_t saver_systemd_pid = 0;
+static int sighup_received = 0;
+static int sigterm_received = 0;
+static int sigchld_received = 0;
+static Bool gfx_stopped_p = False;
+
+Window daemon_window = 0;
+Cursor blank_cursor = None;
+Cursor auth_cursor = None;
+
+
+/* for the --restart command.
+ */
+static char **saved_argv;
+static void
+save_argv (int ac, char **av)
+{
+ saved_argv = (char **) calloc (ac+2, sizeof (char *));
+ saved_argv [ac] = 0;
+ while (ac--)
+ {
+ int i = strlen (av[ac]) + 1;
+ saved_argv[ac] = (char *) malloc (i);
+ memcpy (saved_argv[ac], av[ac], i);
+ }
+}
-#include "xscreensaver.h"
-#include "version.h"
-#include "yarandom.h"
-#include "resources.h"
-#include "visual.h"
-#include "usleep.h"
-#include "auth.h"
-saver_info *global_si_kludge = 0; /* I hate C so much... */
+static void
+kill_all_subprocs (void)
+{
+ if (saver_gfx_pid)
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: pid %lu: killing " SAVER_GFX_PROGRAM "\n",
+ blurb(), (unsigned long) saver_gfx_pid);
+ kill (saver_gfx_pid, SIGTERM);
-char *progname = 0;
-char *progclass = 0;
-XrmDatabase db = 0;
+ if (gfx_stopped_p) /* SIGCONT to allow SIGTERM to proceed */
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: pid %lu: sending " SAVER_GFX_PROGRAM
+ " SIGCONT\n",
+ blurb(), (unsigned long) saver_gfx_pid);
+ gfx_stopped_p = False;
+ kill (-saver_gfx_pid, SIGCONT); /* send to process group */
+ }
+ }
+ if (saver_auth_pid)
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: pid %lu: killing " SAVER_AUTH_PROGRAM "\n",
+ blurb(), (unsigned long) saver_auth_pid);
+ kill (saver_auth_pid, SIGTERM);
+ }
-static Atom XA_SCREENSAVER_RESPONSE;
-static Atom XA_ACTIVATE, XA_DEACTIVATE, XA_SUSPEND, XA_CYCLE, XA_NEXT, XA_PREV;
-static Atom XA_RESTART, XA_SELECT;
-static Atom XA_THROTTLE, XA_UNTHROTTLE;
-Atom XA_DEMO, XA_PREFS, XA_EXIT, XA_LOCK, XA_BLANK;
+ if (saver_systemd_pid)
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: pid %lu: killing " SAVER_SYSTEMD_PROGRAM "\n",
+ blurb(), (unsigned long) saver_systemd_pid);
+ kill (saver_systemd_pid, SIGTERM);
+ }
+}
-
-static XrmOptionDescRec options [] = {
- { "-verbose", ".verbose", XrmoptionNoArg, "on" },
- { "-silent", ".verbose", XrmoptionNoArg, "off" },
+static void
+saver_exit (int status)
+{
+ kill_all_subprocs();
+ exit (status);
+}
- /* xscreensaver-demo uses this one */
- { "-nosplash", ".splash", XrmoptionNoArg, "off" },
- { "-no-splash", ".splash", XrmoptionNoArg, "off" },
- /* useful for debugging */
- { "-no-capture-stderr", ".captureStderr", XrmoptionNoArg, "off" },
- { "-log", ".logFile", XrmoptionSepArg, 0 },
-};
+static void
+catch_signal (int sig, RETSIGTYPE (*handler) (int))
+{
+# ifdef HAVE_SIGACTION
+
+ struct sigaction a;
+ a.sa_handler = handler;
+ sigemptyset (&a.sa_mask);
+ a.sa_flags = 0;
+
+ /* On Linux 2.4.9 (at least) we need to tell the kernel to not mask delivery
+ of this signal from inside its handler, or else when we execvp() the
+ process again, it starts up with SIGHUP blocked, meaning that killing
+ it with -HUP only works *once*. You'd think that execvp() would reset
+ all the signal masks, but it doesn't.
+ */
+# if defined(SA_NOMASK)
+ a.sa_flags |= SA_NOMASK;
+# elif defined(SA_NODEFER)
+ a.sa_flags |= SA_NODEFER;
+# endif
+
+ if (sigaction (sig, &a, 0) < 0)
+# else /* !HAVE_SIGACTION */
+ if (((long) signal (sig, handler)) == -1L)
+# endif /* !HAVE_SIGACTION */
+ {
+ char buf [255];
+ sprintf (buf, "%s: couldn't catch signal %d", blurb(), sig);
+ perror (buf);
+ saver_exit (1);
+ }
+}
-#ifdef __GNUC__
- __extension__ /* shut up about "string length is greater than the length
- ISO C89 compilers are required to support" when including
- the .ad file... */
-#endif
-static char *defaults[] = {
-#include "XScreenSaver_ad.h"
- 0
-};
+/* Re-execs the process with the arguments in saved_argv. Does not return.
+ Do not call this while the screen is locked: user must unlock first.
+ */
+static void
+restart_process (void)
+{
+ kill_all_subprocs();
+ execvp (saved_argv [0], saved_argv); /* shouldn't return */
+ {
+ char buf [512];
+ sprintf (buf, "%s: could not restart process", blurb());
+ perror(buf);
+ fflush(stderr);
+ abort();
+ }
+}
-#ifdef _VROOT_H_
-ERROR! You must not include vroot.h in this file.
-#endif
+static RETSIGTYPE saver_sighup_handler (int sig) { sighup_received = sig; }
+static RETSIGTYPE saver_sigchld_handler (int sig) { sigchld_received = sig; }
+static RETSIGTYPE saver_sigterm_handler (int sig) { sigterm_received = sig; }
static void
-do_help (saver_info *si)
+handle_signals (void)
{
- char *s, year[5];
- s = strchr (screensaver_id, '-');
- s = strrchr (s, '-');
- s++;
- strncpy (year, s, 4);
- year[4] = 0;
-
- fflush (stdout);
- fflush (stderr);
- fprintf (stdout, "\
-xscreensaver %s, copyright (c) 1991-%s by Jamie Zawinski <jwz@jwz.org>\n\
-\n\
- All xscreensaver configuration is via the `~/.xscreensaver' file.\n\
- Rather than editing that file by hand, just run `xscreensaver-demo':\n\
- that program lets you configure the screen saver graphically,\n\
- including timeouts, locking, and display modes.\n\
-\n",
- si->version, year);
- fprintf (stdout, "\
- Just getting started? Try this:\n\
-\n\
- xscreensaver &\n\
- xscreensaver-demo\n\
-\n\
- For updates, online manual, and FAQ, please see the web page:\n\
-\n\
- https://www.jwz.org/xscreensaver/\n\
-\n");
-
- fflush (stdout);
- fflush (stderr);
- exit (1);
+ catch_signal (SIGHUP, saver_sighup_handler);
+ catch_signal (SIGCHLD, saver_sigchld_handler);
+ catch_signal (SIGTERM, saver_sigterm_handler); /* kill */
+ catch_signal (SIGINT, saver_sigterm_handler); /* shell ^C */
+ catch_signal (SIGQUIT, saver_sigterm_handler); /* shell ^| */
}
-Bool in_signal_handler_p = 0; /* I hate C so much... */
-
-char *
-timestring (time_t when)
+static pid_t
+fork_and_exec (Display *dpy, int argc, char **argv)
{
- if (in_signal_handler_p)
- {
- /* Turns out that ctime() and even localtime_r() call malloc() on Linux!
- So we can't call them from inside SIGCHLD. WTF.
- */
- static char buf[30];
- strcpy (buf, "... ... .. signal ....");
- return buf;
- }
- else
- {
- char *str, *nl;
- if (! when) when = time ((time_t *) 0);
- str = (char *) ctime (&when);
- nl = (char *) strchr (str, '\n');
- if (nl) *nl = 0; /* take off that dang newline */
- return str;
- }
+ char buf [255];
+ pid_t forked = fork();
+ switch ((int) forked) {
+ case -1:
+ sprintf (buf, "%s: couldn't fork", blurb());
+ perror (buf);
+ break;
+
+ case 0:
+ close (ConnectionNumber (dpy)); /* close display fd */
+ execvp (argv[0], argv); /* shouldn't return. */
+
+ snprintf (buf, 255, "%s: pid %lu: couldn't exec %s", blurb(),
+ (unsigned long) getpid(), argv[0]);
+ perror (buf);
+ exit (1); /* exits child fork */
+ break;
+
+ default: /* parent fork */
+ if (verbose_p)
+ {
+ int i;
+ fprintf (stderr, "%s: pid %lu: launched",
+ blurb(), (unsigned long) forked);
+ for (i = 0; i < argc; i++)
+ fprintf (stderr, " %s", argv[i]);
+ fprintf (stderr, "\n");
+ }
+
+ /* Put each launched process in its own process group so that
+ SIGSTOP will affect all of its inferior processes as well.
+ */
+ if (setpgid (forked, 0))
+ {
+ char buf [255];
+ sprintf (buf, "%s: setpgid %d", blurb(), forked);
+ perror (buf);
+ }
+ break;
+ }
+
+ return forked;
}
-static Bool blurb_timestamp_p = True; /* kludge */
-const char *
-blurb (void)
+/* Execute command in another process and wait for it to
+ * finish. Return exit code of process, or -1 on error
+ * with fork() or exec().
+ */
+static int
+exec_and_wait (Display *dpy, int argc, char **argv)
{
- if (!blurb_timestamp_p)
- return progname;
- else
- {
- static char buf[255];
- char *ct = timestring(0);
- int n = strlen(progname);
- if (n > 100) n = 99;
- strncpy(buf, progname, n);
- buf[n++] = ':';
- buf[n++] = ' ';
- strncpy(buf+n, ct+11, 8);
- strcpy(buf+n+9, ": ");
- return buf;
+ char buf [255];
+ pid_t forked = fork();
+ switch ((int) forked) {
+ case -1:
+ sprintf (buf, "%s: couldn't fork", blurb());
+ perror (buf);
+ break;
+
+ case 0:
+ close (ConnectionNumber (dpy)); /* close display fd */
+ execvp (argv[0], argv); /* shouldn't return. */
+
+ snprintf (buf, 255, "%s: pid %lu: couldn't exec %s", blurb(),
+ (unsigned long) getpid(), argv[0]);
+ perror (buf);
+ exit (1); /* exits child fork */
+ break;
+
+ default: /* parent fork */
+ if (verbose_p)
+ {
+ int i;
+ fprintf (stderr, "%s: pid %lu: launched",
+ blurb(), (unsigned long) forked);
+ for (i = 0; i < argc; i++)
+ fprintf (stderr, " %s", argv[i]);
+ fprintf (stderr, "\n");
+ }
+
+ /* Put each launched process in its own process group so that
+ SIGSTOP will affect all of its inferior processes as well.
+ */
+ if (setpgid (forked, 0))
+ {
+ char buf [255];
+ sprintf (buf, "%s: setpgid %d", blurb(), forked);
+ perror (buf);
+ }
+ {
+ pid_t retpid;
+ int wstatus;
+ while ((retpid = waitpid (forked, &wstatus, 0)) == -1) {
+ if (errno == EINTR)
+ continue;
+ perror ("Could not waitpid for child.");
+ return -1;
+ }
+ if (WIFEXITED(wstatus))
+ return WEXITSTATUS(wstatus);
+ if (WIFSIGNALED(wstatus))
+ return WTERMSIG(wstatus) + 128;
+ return -1;
+ }
}
+ return -1;
}
-int
-saver_ehandler (Display *dpy, XErrorEvent *error)
-{
- saver_info *si = global_si_kludge; /* I hate C so much... */
- int i;
- Bool fatal_p;
+static int respawn_thrashing_count = 0;
- if (!real_stderr) real_stderr = stderr;
+/* Called from the main loop some time after the SIGCHLD signal has fired.
+ Returns true if:
+ - the process that died was "xscreensaver-auth", and
+ - it exited with a "success" status meaning "user is authenticated".
+ */
+static Bool
+handle_sigchld (Display *dpy, Bool blanked_p)
+{
+ Bool authenticated_p = False;
- fprintf (real_stderr, "\n"
- "#######################################"
- "#######################################\n\n"
- "%s: X Error! PLEASE REPORT THIS BUG.\n",
- blurb());
+ sigchld_received = 0;
+ if (debug_p)
+ fprintf (stderr, "%s: SIGCHLD received\n", blurb());
- for (i = 0; i < si->nscreens; i++)
+ /* Reap every now-dead inferior without blocking. */
+ while (1)
{
- saver_screen_info *ssi = &si->screens[i];
- fprintf (real_stderr, "%s: screen %d/%d: 0x%x, 0x%x, 0x%x\n",
- blurb(), ssi->real_screen_number, ssi->number,
- (unsigned int) RootWindowOfScreen (si->screens[i].screen),
- (unsigned int) si->screens[i].real_vroot,
- (unsigned int) si->screens[i].screensaver_window);
- }
+ int wait_status = 0;
+ pid_t kid = waitpid (-1, &wait_status, WNOHANG | WUNTRACED);
+ char how[100];
- fprintf (real_stderr, "\n"
- "#######################################"
- "#######################################\n\n");
+ /* 0 means no more children to reap.
+ -1 means error -- except "interrupted system call"
+ isn't a "real" error, so if we get that, try again.
+ */
+ if (kid == 0 ||
+ (kid < 0 && errno != EINTR))
+ break;
- fatal_p = XmuPrintDefaultErrorMessage (dpy, error, real_stderr);
+ /* We get SIGCHLD after sending SIGSTOP, but no action is required. */
+ if (WIFSTOPPED (wait_status))
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: pid %lu: %s stopped\n", blurb(),
+ (unsigned long) kid,
+ (kid == saver_gfx_pid ? SAVER_GFX_PROGRAM :
+ kid == saver_auth_pid ? SAVER_AUTH_PROGRAM :
+ kid == saver_systemd_pid ? SAVER_SYSTEMD_PROGRAM :
+ "unknown"));
+ continue;
+ }
- fatal_p = True; /* The only time I've ever seen a supposedly nonfatal error,
- it has been BadImplementation / Xlib sequence lost, which
- are in truth pretty damned fatal.
- */
+ if (WIFSIGNALED (wait_status))
+ {
+ if (WTERMSIG (wait_status) == SIGTERM)
+ strcpy (how, "with SIGTERM");
+ else
+ sprintf (how, "with signal %d", WTERMSIG (wait_status));
+ }
+ else if (WIFEXITED (wait_status))
+ {
+ int exit_status = WEXITSTATUS (wait_status);
+ /* Treat exit code as a signed 8-bit quantity. */
+ if (exit_status & 0x80) exit_status |= ~0xFF;
+ if (exit_status)
+ sprintf (how, "with status %d", exit_status);
+ else
+ strcpy (how, "normally");
+ }
+ else
+ sprintf (how, "for unknown reason %d", wait_status);
- fprintf (real_stderr, "\n");
+ if (kid == saver_gfx_pid)
+ {
+ saver_gfx_pid = 0;
+ gfx_stopped_p = False;
+ if (blanked_p)
+ {
+ if (respawn_thrashing_count > 5)
+ {
+ /* If we have tried to re-launch this pid N times in a row
+ without unblanking, give up instead of forking it in a
+ tight loop. Screen will remain grabbed, but desktop will
+ be visible.
+ */
+ fprintf (stderr, "%s: pid %lu: " SAVER_GFX_PROGRAM
+ " won't re-launch!\n",
+ blurb(), (unsigned long) kid);
+ }
+ else
+ {
+ char *av[10];
+ int ac = 0;
+ av[ac++] = SAVER_GFX_PROGRAM;
+ av[ac++] = "--emergency";
+ if (verbose_p) av[ac++] = "--verbose";
+ if (debug_p) av[ac++] = "--debug";
+ av[ac] = 0;
+ fprintf (stderr, "%s: pid %lu: " SAVER_GFX_PROGRAM
+ " exited unexpectedly %s: re-launching\n",
+ blurb(), (unsigned long) kid, how);
+ gfx_stopped_p = False;
+ saver_gfx_pid = fork_and_exec (dpy, ac, av);
+ respawn_thrashing_count++;
+ }
+ }
+ else
+ {
+ /* Should not have been running anyway. */
+ if (verbose_p)
+ fprintf (stderr, "%s: pid %lu: " SAVER_GFX_PROGRAM
+ " exited %s\n", blurb(), (unsigned long) kid, how);
+ }
+ }
+ else if (kid == saver_systemd_pid)
+ {
+ /* xscreensaver-systemd might fail if systemd isn't running, or if
+ xscreensaver-systemd was already running, or if some other
+ program has bound to our targets. Or if it doesn't exist because
+ this system doesn't use systemd. So don't re-launch it if it
+ failed to start, or dies.
+ */
+ saver_systemd_pid = 0;
+ fprintf (stderr, "%s: pid %lu: " SAVER_SYSTEMD_PROGRAM
+ " exited unexpectedly %s\n",
+ blurb(), (unsigned long) kid, how);
+ }
+ else if (kid == saver_auth_pid)
+ {
+ saver_auth_pid = 0;
- if (! fatal_p)
- fprintf (real_stderr, "%s: nonfatal error.\n\n", blurb());
- else
- {
- if (si->prefs.xsync_p)
- {
- saver_exit (si, -1, "because of synchronous X Error");
- }
- else
- {
-#ifdef __GNUC__
- __extension__ /* don't warn about "string length is greater than the
- length ISO C89 compilers are required to support". */
-#endif
- fprintf (real_stderr,
- "#######################################################################\n"
- "\n"
- " If at all possible, please re-run xscreensaver with the command\n"
- " line arguments `-sync -verbose -log log.txt', and reproduce this\n"
- " bug. That will cause xscreensaver to dump a `core' file to the\n"
- " current directory. Please include the stack trace from that core\n"
- " file in your bug report. *DO NOT* mail the core file itself! That\n"
- " won't work. A \"log.txt\" file will also be written. Please *do*\n"
- " include the complete \"log.txt\" file with your bug report.\n"
- "\n"
- " https://www.jwz.org/xscreensaver/bugs.html explains how to create\n"
- " the most useful bug reports, and how to examine core files.\n"
- "\n"
- " The more information you can provide, the better. But please\n"
- " report this bug, regardless!\n"
- "\n"
- "#######################################################################\n"
- "\n"
- "\n");
+ /* xscreensaver-auth exits with status 200 to mean "ok to unlock".
+ Any other exit code, or dying with a signal, means "nope".
+ */
+ if (!WIFSIGNALED (wait_status) &&
+ WIFEXITED (wait_status))
+ {
+ unsigned int status = (unsigned int) WEXITSTATUS (wait_status);
+ if (status == 200)
+ {
+ authenticated_p = True;
+ strcpy (how, "and authenticated");
+ }
+ else if (status == 0 && !blanked_p)
+ strcpy (how, "normally"); /* This was the splash dialog */
+ else if (status == 0)
+ strcpy (how, "and authentication canceled");
+ else if (status == 255) /* which is -1 */
+ strcpy (how, "and authentication failed");
+ }
- saver_exit (si, -1, 0);
- }
+ if (verbose_p)
+ fprintf (stderr, "%s: pid %lu: " SAVER_AUTH_PROGRAM " exited %s\n",
+ blurb(), (unsigned long) kid, how);
+ }
+ else if (verbose_p)
+ {
+ fprintf (stderr, "%s: pid %lu: unknown child"
+ " exited unexpectedly %s\n",
+ blurb(), (unsigned long) kid, how);
+ }
}
- return 0;
+ return authenticated_p;
}
-#ifdef __GNUC__ /* Silence warning */
-static void startup_ehandler (String, String, String, String, String *,
- Cardinal *) __attribute__((noreturn));
-#endif /* __GNUC__ */
-
-/* This error handler is used only while the X connection is being set up;
- after we've got a connection, we don't use this handler again. The only
- reason for having this is so that we can present a more idiot-proof error
- message than "cannot open display."
+/* Add DEFAULT_PATH_PREFIX to the front of $PATH.
+ Typically "/usr/libexec/xscreensaver".
*/
-static void
-startup_ehandler (String name, String type, String class,
- String defalt, /* one can't even spel properly
- in this joke of a language */
- String *av, Cardinal *ac)
+static void
+hack_environment (void)
{
- char fmt[512];
- String p[10];
- saver_info *si = global_si_kludge; /* I hate C so much... */
- XrmDatabase *db = XtAppGetErrorDatabase(si->app);
- *fmt = 0;
- XtAppGetErrorDatabaseText(si->app, name, type, class, defalt,
- fmt, sizeof(fmt)-1, *db);
-
- fprintf (stderr, "%s: ", blurb());
-
- memset (p, 0, sizeof(p));
- if (*ac > countof (p)) *ac = countof (p);
- memcpy ((char *) p, (char *) av, (*ac) * sizeof(*av));
- fprintf (stderr, fmt, /* Did I mention that I hate C? */
- p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9]);
- fprintf (stderr, "\n");
-
- describe_uids (si, stderr);
-
- if (si->orig_uid && !strncmp (si->orig_uid, "root/", 5))
- {
- fprintf (stderr, "\n"
- "%s: This is probably because you're logging in as root. You\n"
-" shouldn't log in as root: you should log in as a normal user,\n"
-" and then `su' as needed. If you insist on logging in as\n"
-" root, you will have to turn off X's security features before\n"
-" xscreensaver will work.\n"
- "\n"
-" Please read the manual and FAQ for more information:\n",
- blurb());
- }
- else
+ static const char *def_path = DEFAULT_PATH_PREFIX;
+ const char *opath = getenv("PATH");
+ char *npath;
+ if (! opath) opath = "/bin:/usr/bin"; /* WTF */
+ npath = (char *) malloc(strlen(def_path) + strlen(opath) + 20);
+ strcpy (npath, "PATH=");
+ strcat (npath, def_path);
+ strcat (npath, ":");
+ strcat (npath, opath);
+
+ /* Can fail if out of memory, I guess. Ignore errors. */
+ putenv (npath);
+
+ /* don't free (npath) -- some implementations of putenv (BSD 4.4,
+ glibc 2.0) copy the argument, but some (libc4,5, glibc 2.1.2)
+ do not. So we must leak it (and/or the previous setting). Yay.
+ */
+}
+
+
+static void
+print_banner(void)
+{
+ const time_t rel = XSCREENSAVER_RELEASED;
+ struct tm *tm = localtime (&rel);
+ char buf[100];
+ int months = (time ((time_t *) 0) - XSCREENSAVER_RELEASED) / (60*60*24*30);
+ int years = months / 12.0 + 0.7;
+
+ strftime (buf, sizeof(buf), "%b %Y", tm);
+
+ if (months > 18)
+ sprintf (buf + strlen(buf), " -- %d years ago", years);
+ else if (months > 1)
+ sprintf (buf + strlen(buf), " -- %d months ago", months);
+
+ if (verbose_p || debug_p)
{
- fprintf (stderr, "\n"
- "%s: Errors at startup are usually authorization problems.\n"
-" But you're not logging in as root (good!) so something\n"
-" else must be wrong. Did you read the manual and the FAQ?\n",
- blurb());
+ fprintf (stderr,
+ "\tXScreenSaver " XSCREENSAVER_VERSION ", released %s\n"
+ "\tCopyright \302\251 1991-%d by"
+ " Jamie Zawinski <jwz@jwz.org>\n\n",
+ buf, tm->tm_year + 1900);
+ if (months > 18)
+ fprintf (stderr,
+ /* Hey jerks, the only time someone will see this particular
+ message is if they are running xscreensaver with '-log' in
+ order to send me a bug report, and they had damned well
+ better try the latest release before they do that. */
+ "\t ###################################################\n"
+ "\t ### ###\n"
+ "\t ### THIS VERSION IS VERY OLD! PLEASE UPGRADE! ###\n"
+ "\t ### ###\n"
+ "\t ###################################################\n"
+ "\n");
}
- fprintf (stderr, "\n"
- " https://www.jwz.org/xscreensaver/faq.html\n"
- " https://www.jwz.org/xscreensaver/man.html\n"
- "\n");
+ if (debug_p)
+ fprintf (stderr,
+ "#####################################"
+ "#####################################\n"
+ "\n"
+ "\t\t\t DEBUG MODE IS NOT SECURE\n"
+ "\n"
+ "\tThe XScreenSaver window will only cover the left half of\n"
+ "\tthe screen. Position your terminal window on the right.\n"
+ "\tWARNING: stderr and the log file will include every\n"
+ "\tcharacter that you type, including passwords.\n"
+ "\n"
+ "#####################################"
+ "#####################################\n"
+ "\n");
- fflush (stderr);
- fflush (stdout);
- exit (1);
+ version_number = XSCREENSAVER_VERSION;
}
-
-/* The zillions of initializations.
- */
-/* Set progname, version, etc. This is done very early.
- */
static void
-set_version_string (saver_info *si, int *argc, char **argv)
+fix_fds (void)
{
- progclass = "XScreenSaver";
+ /* Bad Things Happen if stdin, stdout, and stderr have been closed
+ (as by the `sh incantation "xscreensaver >&- 2>&-"). When you do
+ that, the X connection gets allocated to one of these fds, and
+ then some random library writes to stderr, and random bits get
+ stuffed down the X pipe, causing "Xlib: sequence lost" errors.
+ So, we cause the first three file descriptors to be open to
+ /dev/null if they aren't open to something else already. This
+ must be done before any other files are opened (or the closing
+ of that other file will again free up one of the "magic" first
+ three FDs.)
- /* progname is reset later, after we connect to X. */
- progname = strrchr(argv[0], '/');
- if (progname) progname++;
- else progname = argv[0];
+ We do this by opening /dev/null three times, and then closing
+ those fds, *unless* any of them got allocated as #0, #1, or #2,
+ in which case we leave them open. Gag.
- if (strlen(progname) > 100) /* keep it short. */
- progname[99] = 0;
+ Really, this crap is technically required of *every* X program,
+ if you want it to be robust in the face of "2>&-".
+ */
+ int fd0 = open ("/dev/null", O_RDWR);
+ int fd1 = open ("/dev/null", O_RDWR);
+ int fd2 = open ("/dev/null", O_RDWR);
+ if (fd0 > 2) close (fd0);
+ if (fd1 > 2) close (fd1);
+ if (fd2 > 2) close (fd2);
+}
- /* The X resource database blows up if argv[0] has a "." in it. */
- {
- char *s = argv[0];
- while ((s = strchr (s, '.')))
- *s = '_';
- }
- si->version = (char *) malloc (32);
- memcpy (si->version, screensaver_id + 17, 4);
- si->version [4] = 0;
+/* Mostly duplicated in resources.c.
+ */
+static int
+parse_time (const char *string)
+{
+ unsigned int h, m, s;
+ char c;
+ if (3 == sscanf (string, " %u : %2u : %2u %c", &h, &m, &s, &c))
+ ;
+ else if (2 == sscanf (string, " : %2u : %2u %c", &m, &s, &c) ||
+ 2 == sscanf (string, " %u : %2u %c", &m, &s, &c))
+ h = 0;
+ else if (1 == sscanf (string, " : %2u %c", &s, &c))
+ h = m = 0;
+ else if (1 == sscanf (string, " %u %c", &m, &c))
+ h = s = 0;
+ else
+ {
+ fprintf (stderr, "%s: unparsable duration \"%s\"\n", blurb(), string);
+ return -1;
+ }
+ if (s >= 60 && (h != 0 || m != 0))
+ {
+ fprintf (stderr, "%s: seconds > 59 in \"%s\"\n", blurb(), string);
+ return -1;
+ }
+ if (m >= 60 && h > 0)
+ {
+ fprintf (stderr, "%s: minutes > 59 in \"%s\"\n", blurb(), string);
+ return -1;
+ }
+ return ((h * 60 * 60) + (m * 60) + s);
}
-/* Initializations that potentially take place as a priveleged user:
- If the xscreensaver executable is setuid root, then these initializations
- are run as root, before discarding privileges.
+/* This program only needs a very few options from the init file, so it
+ just reads the .ad file and the .xscreensaver file directly rather
+ than going through Xt and Xrm.
*/
-static void
-privileged_initialization (saver_info *si, int *argc, char **argv)
+static void init_line_handler (int lineno,
+ const char *key, const char *val,
+ void *closure)
{
-#ifndef NO_LOCKING
- /* before hack_uid() for proper permissions */
- lock_priv_init (*argc, argv, si->prefs.verbose_p);
-#endif /* NO_LOCKING */
+ if (!strcmp (key, "verbose")) verbose_p = !strcasecmp (val, "true");
+ else if (!strcmp (key, "splash")) splash_p = !strcasecmp (val, "true");
+ else if (!strcmp (key, "lock")) lock_p = !strcasecmp (val, "true");
+ else if (!strcmp (key, "timeout"))
+ {
+ int t = parse_time (val);
+ if (t > 0) blank_timeout = t;
+ }
+ if (!strcmp (key, "lockTimeout"))
+ {
+ int t = parse_time (val);
+ if (t >= 0) lock_timeout = t;
+ }
+ if (!strcmp (key, "pointerHysteresis"))
+ {
+ int i = atoi (val);
+ if (i >= 0)
+ pointer_hysteresis = i;
+ }
+ if (!strcmp (key, "externalUngrabCommand"))
+ {
+ free(external_ungrab_command);
+ external_ungrab_command = strdup(val);
+ }
+}
- hack_uid (si);
+static void
+read_init_file_simple (const char *filename)
+{
+ if (debug_p)
+ fprintf (stderr, "%s: reading %s\n", blurb(), filename);
+ parse_init_file (filename, init_line_handler, 0);
}
-/* Figure out what locking mechanisms are supported.
- */
+static time_t init_file_time = 0;
+
static void
-lock_initialization (saver_info *si, int *argc, char **argv)
+read_init_files (Bool both_p)
{
-#ifdef NO_LOCKING
- si->locking_disabled_p = True;
- si->nolock_reason = "not compiled with locking support";
-#else /* !NO_LOCKING */
+ static const char *home = 0;
+ char *fn;
+ struct stat st;
+ Bool read_p = False;
- /* Finish initializing locking, now that we're out of privileged code. */
- if (! lock_init (*argc, argv, si->prefs.verbose_p))
+ if (!home)
{
- si->locking_disabled_p = True;
- si->nolock_reason = "error getting password";
+ home = getenv("HOME");
+ if (!home) home = "";
}
- /* If locking is currently enabled, but the environment indicates that
- we have been launched as GDM's "Background" program, then disable
- locking just in case.
- */
- if (!si->locking_disabled_p && getenv ("RUNNING_UNDER_GDM"))
+ if (both_p)
{
- si->locking_disabled_p = True;
- si->nolock_reason = "running under GDM";
+ read_init_file_simple (AD_DIR "/XScreenSaver");
+ read_p = True;
}
- /* If the server is XDarwin (MacOS X) then disable locking.
- (X grabs only affect X programs, so you can use Command-Tab
- to bring any other Mac program to the front, e.g., Terminal.)
- */
- if (!si->locking_disabled_p)
- {
- int op = 0, event = 0, error = 0;
- Bool macos_p = False;
+ fn = (char *) malloc (strlen(home) + 40);
+ sprintf (fn, "%s/.xscreensaver", home);
-#ifdef __APPLE__
- /* Disable locking if *running* on Apple hardware, since we have no
- reliable way to determine whether the server is running on MacOS.
- Hopefully __APPLE__ means "MacOS" and not "Linux on Mac hardware"
- but I'm not really sure about that.
- */
- macos_p = True;
-#endif
-
- if (!macos_p)
- /* This extension exists on the Apple X11 server, but not
- on earlier versions of the XDarwin server. */
- macos_p = XQueryExtension (si->dpy, "Apple-DRI", &op, &event, &error);
-
- if (macos_p)
+ if (!stat (fn, &st))
+ {
+ if (both_p || st.st_mtime != init_file_time)
{
- si->locking_disabled_p = True;
- si->nolock_reason = "Cannot lock securely on MacOS X";
+ Bool ov = verbose_p;
+ init_file_time = st.st_mtime;
+ read_init_file_simple (fn);
+ read_p = True;
+
+ /* Changes to verbose in .xscreenaver after startup are ignored; else
+ running xscreensaver-settings would turn off cmd line -verbose. */
+ if (!both_p) verbose_p = ov;
}
}
- /* Like MacOS, locking under Wayland's embedded X11 server does not work.
- (X11 grabs don't work because the Wayland window manager lives at a
- higher level than the X11 emulation layer.)
- */
- if (!si->locking_disabled_p && getenv ("WAYLAND_DISPLAY"))
+ if (blank_timeout < 5)
+ blank_timeout = 60 * 60 * 10;
+
+ free (fn);
+
+ if (read_p && verbose_p)
{
- si->locking_disabled_p = True;
- si->nolock_reason = "Cannot lock securely under Wayland";
+ fprintf (stderr, "%s: blank after: %d\n", blurb(), blank_timeout);
+ if (lock_p)
+ fprintf (stderr, "%s: lock after: %d\n", blurb(), lock_timeout);
}
+}
- if (si->prefs.debug_p) /* But allow locking anyway in debug mode. */
- si->locking_disabled_p = False;
-#endif /* NO_LOCKING */
-}
-/* Open the connection to the X server, and intern our Atoms.
+/* We trap and ignore ALL protocol errors that happen after initialization.
+ By default, Xlib would exit. Ignoring an X error is less bad than
+ crashing and unlocking.
*/
-static Widget
-connect_to_server (saver_info *si, int *argc, char **argv)
+static Bool ignore_x11_error_p = False;
+static Bool error_handler_hit_p = False;
+static Bool print_x11_error_p = True;
+
+static int
+error_handler (Display *dpy, XErrorEvent *event)
{
- Widget toplevel_shell;
+ error_handler_hit_p = True;
-#ifdef HAVE_PUTENV
- char *d = getenv ("DISPLAY");
- if (!d || !*d)
+ if (print_x11_error_p)
{
- char *ndpy = strdup("DISPLAY=:0.0");
- /* if (si->prefs.verbose_p) */ /* sigh, too early to test this... */
- fprintf (stderr,
- "%s: warning: $DISPLAY is not set: defaulting to \"%s\".\n",
- blurb(), ndpy+8);
- if (putenv (ndpy))
- abort ();
- /* don't free (ndpy) -- some implementations of putenv (BSD 4.4,
- glibc 2.0) copy the argument, but some (libc4,5, glibc 2.1.2)
- do not. So we must leak it (and/or the previous setting). Yay.
- */
+ const char *b = blurb();
+ const char *p = progname;
+ fprintf (stderr, "\n%s: X ERROR! PLEASE REPORT THIS BUG!\n\n", b);
+ progname = b;
+ XmuPrintDefaultErrorMessage (dpy, event, stderr);
+ progname = p;
+
+# ifdef __GNUC__
+ __extension__ /* don't warn about "string length is greater than the
+ length ISO C89 compilers are required to support". */
+# endif
+ fprintf (stderr, "\n"
+ "#######################################################################\n"
+ "\n"
+ " If at all possible, please re-run xscreensaver with the command\n"
+ " line arguments \"-sync -log log.txt\", and reproduce this bug.\n"
+ " Please include the complete \"log.txt\" file with your bug report.\n"
+ "\n"
+ " https://www.jwz.org/xscreensaver/bugs.html explains how to create\n"
+ " the most useful bug reports.\n"
+ "\n"
+ " The more information you can provide, the better. But please\n"
+ " report this bug, regardless!\n"
+ "\n"
+ "#######################################################################\n"
+ "\n"
+ "\n");
+
+ fflush (stderr);
+
+ if (! ignore_x11_error_p)
+ abort();
}
-#endif /* HAVE_PUTENV */
-
- XSetErrorHandler (saver_ehandler);
-
- XtAppSetErrorMsgHandler (si->app, startup_ehandler);
- toplevel_shell = XtAppInitialize (&si->app, progclass,
- options, XtNumber (options),
- argc, argv, defaults, 0, 0);
- XtAppSetErrorMsgHandler (si->app, 0);
-
- si->dpy = XtDisplay (toplevel_shell);
- si->prefs.db = XtDatabase (si->dpy);
- XtGetApplicationNameAndClass (si->dpy, &progname, &progclass);
-
- if(strlen(progname) > 100) /* keep it short. */
- progname [99] = 0;
-
- db = si->prefs.db; /* resources.c needs this */
-
- XA_VROOT = XInternAtom (si->dpy, "__SWM_VROOT", False);
- XA_SCREENSAVER = XInternAtom (si->dpy, "SCREENSAVER", False);
- XA_SCREENSAVER_VERSION = XInternAtom (si->dpy, "_SCREENSAVER_VERSION",False);
- XA_SCREENSAVER_ID = XInternAtom (si->dpy, "_SCREENSAVER_ID", False);
- XA_SCREENSAVER_STATUS = XInternAtom (si->dpy, "_SCREENSAVER_STATUS", False);
- XA_SCREENSAVER_RESPONSE = XInternAtom (si->dpy, "_SCREENSAVER_RESPONSE",
- False);
- XA_XSETROOT_ID = XInternAtom (si->dpy, "_XSETROOT_ID", False);
- XA_ESETROOT_PMAP_ID = XInternAtom (si->dpy, "ESETROOT_PMAP_ID", False);
- XA_XROOTPMAP_ID = XInternAtom (si->dpy, "_XROOTPMAP_ID", False);
- XA_NET_WM_USER_TIME = XInternAtom (si->dpy, "_NET_WM_USER_TIME", False);
- XA_ACTIVATE = XInternAtom (si->dpy, "ACTIVATE", False);
- XA_DEACTIVATE = XInternAtom (si->dpy, "DEACTIVATE", False);
- XA_SUSPEND = XInternAtom (si->dpy, "SUSPEND", False);
- XA_RESTART = XInternAtom (si->dpy, "RESTART", False);
- XA_CYCLE = XInternAtom (si->dpy, "CYCLE", False);
- XA_NEXT = XInternAtom (si->dpy, "NEXT", False);
- XA_PREV = XInternAtom (si->dpy, "PREV", False);
- XA_SELECT = XInternAtom (si->dpy, "SELECT", False);
- XA_EXIT = XInternAtom (si->dpy, "EXIT", False);
- XA_DEMO = XInternAtom (si->dpy, "DEMO", False);
- XA_PREFS = XInternAtom (si->dpy, "PREFS", False);
- XA_LOCK = XInternAtom (si->dpy, "LOCK", False);
- XA_BLANK = XInternAtom (si->dpy, "BLANK", False);
- XA_THROTTLE = XInternAtom (si->dpy, "THROTTLE", False);
- XA_UNTHROTTLE = XInternAtom (si->dpy, "UNTHROTTLE", False);
-
- return toplevel_shell;
+
+ return 0;
}
-/* Handle the command-line arguments that were not handled for us by Xt.
- Issue an error message and exit if there are unknown options.
+/* Check for other running instances of XScreenSaver, gnome-screensaver, etc.
*/
static void
-process_command_line (saver_info *si, int *argc, char **argv)
+ensure_no_screensaver_running (Display *dpy)
{
- int i;
- for (i = 1; i < *argc; i++)
+ int screen, nscreens = ScreenCount (dpy);
+
+ /* Silently ignore BadWindow race conditions. */
+ Bool op = print_x11_error_p;
+ print_x11_error_p = False;
+
+ for (screen = 0; screen < nscreens; screen++)
{
- if (!strcmp (argv[i], "-debug"))
- /* no resource for this one, out of paranoia. */
- si->prefs.debug_p = True;
+ int i;
+ Window root = RootWindow (dpy, screen);
+ Window root2 = 0, parent = 0, *kids = 0;
+ unsigned int nkids = 0;
- else if (!strcmp (argv[i], "-h") ||
- !strcmp (argv[i], "-help") ||
- !strcmp (argv[i], "--help"))
- do_help (si);
+ if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids))
+ continue;
+ if (root != root2)
+ continue;
+ if (parent)
+ continue;
+ for (i = 0; i < nkids; i++)
+ {
+ Atom type;
+ int format;
+ unsigned long nitems, bytesafter;
+ unsigned char *version;
+
+ if (XGetWindowProperty (dpy, kids[i], XA_SCREENSAVER_VERSION, 0, 1,
+ False, XA_STRING, &type, &format, &nitems,
+ &bytesafter, &version)
+ == Success
+ && type != None)
+ {
+ unsigned char *id;
+ if (XGetWindowProperty (dpy, kids[i], XA_SCREENSAVER_ID, 0, 512,
+ False, XA_STRING, &type, &format,
+ &nitems, &bytesafter, &id)
+ != Success
+ || type == None)
+ id = (unsigned char *) "???";
- else
- {
- const char *s = argv[i];
- fprintf (stderr, "%s: unknown option \"%s\". Try \"-help\".\n",
- blurb(), s);
-
- if (s[0] == '-' && s[1] == '-') s++;
- if (!strcmp (s, "-activate") ||
- !strcmp (s, "-deactivate") ||
- !strcmp (s, "-cycle") ||
- !strcmp (s, "-next") ||
- !strcmp (s, "-prev") ||
- !strcmp (s, "-exit") ||
- !strcmp (s, "-restart") ||
- !strcmp (s, "-demo") ||
- !strcmp (s, "-prefs") ||
- !strcmp (s, "-preferences") ||
- !strcmp (s, "-lock") ||
- !strcmp (s, "-version") ||
- !strcmp (s, "-time"))
- {
-
- if (!strcmp (s, "-demo") || !strcmp (s, "-prefs"))
- fprintf (stderr, "\n\
- Perhaps you meant to run the `xscreensaver-demo' program instead?\n");
- else
- fprintf (stderr, "\n\
- However, `%s' is an option to the `xscreensaver-command' program.\n", s);
-
- fprintf (stderr, "\
- The `xscreensaver' program is a daemon that runs in the background.\n\
- You control a running xscreensaver process by sending it messages\n\
- with `xscreensaver-demo' or `xscreensaver-command'.\n\
-. See the man pages for details, or check the web page:\n\
- https://www.jwz.org/xscreensaver/\n\n");
- }
-
- exit (1);
- }
+ fprintf (stderr,
+ "%s: already running on display %s"
+ " (window 0x%x)\n from process %s\n",
+ blurb(), DisplayString (dpy), (int) kids [i],
+ (char *) id);
+ saver_exit (1);
+ }
+ else if (XGetWindowProperty (dpy, kids[i], XA_WM_COMMAND, 0, 128,
+ False, XA_STRING, &type, &format,
+ &nitems, &bytesafter, &version)
+ == Success
+ && type != None
+ && (!strcmp ((char *) version, "gnome-screensaver") ||
+ !strcmp ((char *) version, "mate-screensaver") ||
+ !strcmp ((char *) version, "cinnamon-screensaver")))
+ {
+ fprintf (stderr,
+ "%s: \"%s\" is already running on display %s"
+ " (window 0x%x)\n",
+ blurb(), (char *) version,
+ DisplayString (dpy), (int) kids [i]);
+ saver_exit (1);
+ }
+ }
+ if (kids) XFree ((char *) kids);
}
+
+ print_x11_error_p = op;
}
-/* Print out the xscreensaver banner to the tty if applicable;
- Issue any other warnings that are called for at this point.
+/* Store a property on the root window indicating that xscreensaver is
+ running, and whether it is blanked or locked. This property is read
+ by "xscreensaver-command" and by ensure_no_screensaver_running().
+ This property is also overwritten by "xscreensaver-gfx" to indicate
+ which screenhacks are running.
*/
static void
-print_banner (saver_info *si)
+store_saver_status (Display *dpy,
+ Bool blanked_p, Bool locked_p, time_t blank_time)
{
- saver_preferences *p = &si->prefs;
-
- char *s, year[5];
- s = strchr (screensaver_id, '-');
- s = strrchr (s, '-');
- s++;
- strncpy (year, s, 4);
- year[4] = 0;
-
- /* This resource gets set some time before the others, so that we know
- whether to print the banner (and so that the banner gets printed before
- any resource-database-related error messages.)
- */
- p->verbose_p = (p->debug_p ||
- get_boolean_resource (si->dpy, "verbose", "Boolean"));
+ /* The contents of XA_SCREENSAVER_STATUS has LOCK/BLANK/0 in the first slot,
+ the time at which that state began in the second slot, and the ordinal of
+ the running hacks on each screen (1-based) in subsequent slots. Since
+ we don't know the hacks here (or even how many monitors are attached) we
+ leave whatever was there before unchanged: it will be updated by
+ "xscreensaver-gfx".
- /* Ditto, for the locking_disabled_p message. */
- p->lock_p = get_boolean_resource (si->dpy, "lock", "Boolean");
+ XA_SCREENSAVER_STATUS is stored on the (real) root window of screen 0.
- if (p->verbose_p)
- fprintf (stderr,
- "%s %s, copyright (c) 1991-%s "
- "by Jamie Zawinski <jwz@jwz.org>.\n",
- progname, si->version, year);
+ XA_SCREENSAVER_VERSION and XA_SCREENSAVER_ID are stored on the unmapped
+ window created by the "xscreensaver" process. ClientMessage events are
+ sent to that window, and the responses are sent via the
+ XA_SCREENSAVER_RESPONSE property on it.
- if (p->debug_p)
- fprintf (stderr, "\n"
- "%s: Warning: running in DEBUG MODE. Be afraid.\n"
- "\n"
- "\tNote that in debug mode, the xscreensaver window will only\n"
- "\tcover the left half of the screen. (The idea is that you\n"
- "\tcan still see debugging output in a shell, if you position\n"
- "\tit on the right side of the screen.)\n"
- "\n"
- "\tDebug mode is NOT SECURE. Do not run with -debug in\n"
- "\tuntrusted environments.\n"
- "\n",
- blurb());
-
- if (p->verbose_p && senesculent_p ())
- fprintf (stderr, "\n"
- "*************************************"
- "**************************************\n"
- "%s: Warning: this version of xscreensaver is VERY OLD!\n"
- "%s: Please upgrade! https://www.jwz.org/xscreensaver/\n"
- "*************************************"
- "**************************************\n"
- "\n",
- blurb(), blurb());
-
- if (p->verbose_p)
- {
- if (!si->uid_message || !*si->uid_message)
- describe_uids (si, stderr);
- else
- {
- if (si->orig_uid && *si->orig_uid)
- fprintf (stderr, "%s: initial effective uid/gid was %s.\n",
- blurb(), si->orig_uid);
- fprintf (stderr, "%s: %s\n", blurb(), si->uid_message);
- }
-
- fprintf (stderr, "%s: in process %lu.\n", blurb(),
- (unsigned long) getpid());
- }
-}
-
-static void
-print_lock_failure_banner (saver_info *si)
-{
- saver_preferences *p = &si->prefs;
+ These properties are not used on the windows created by "xscreensaver-gfx"
+ for use by the display hacks.
- /* If locking was not able to be initalized for some reason, explain why.
- (This has to be done after we've read the lock_p resource.)
+ See the different version of this function in windows.c.
*/
- if (si->locking_disabled_p)
+ Window w = RootWindow (dpy, 0); /* always screen 0 */
+ Atom type;
+ unsigned char *dataP = 0;
+ PROP32 *status = 0;
+ int format;
+ unsigned long nitems, bytesafter;
+
+ /* Read the old property, so we can change just parts. */
+ if (XGetWindowProperty (dpy, w,
+ XA_SCREENSAVER_STATUS,
+ 0, 999, False, XA_INTEGER,
+ &type, &format, &nitems, &bytesafter,
+ &dataP)
+ == Success
+ && type == XA_INTEGER
+ && nitems >= 3
+ && dataP)
+ status = (PROP32 *) dataP;
+
+ if (!status) /* There was no existing property */
{
- p->lock_p = False;
- fprintf (stderr, "%s: locking is disabled (%s).\n", blurb(),
- si->nolock_reason);
- if (strstr (si->nolock_reason, "passw"))
- fprintf (stderr, "%s: does xscreensaver need to be setuid? "
- "consult the manual.\n", blurb());
- else if (strstr (si->nolock_reason, "running as "))
- fprintf (stderr,
- "%s: locking only works when xscreensaver is launched\n"
- "\t by a normal, non-privileged user (e.g., not \"root\".)\n"
- "\t See the manual for details.\n",
- blurb());
+ nitems = 3;
+ status = (PROP32 *) malloc (nitems * sizeof(*status));
}
-}
+ status[0] = (PROP32) (locked_p ? XA_LOCK : blanked_p ? XA_BLANK : 0);
+ status[1] = (PROP32) blank_time; /* Y2038 bug: unsigned 32 bit time_t */
+ XChangeProperty (dpy, w, XA_SCREENSAVER_STATUS, XA_INTEGER, 32,
+ PropModeReplace, (unsigned char *) status, nitems);
+ XSync (dpy, False);
+# if 0
+ if (debug_p && verbose_p)
+ {
+ int i;
+ fprintf (stderr, "%s: wrote status property: 0x%lx: %s", blurb(),
+ (unsigned long) w,
+ (status[0] == XA_LOCK ? "LOCK" :
+ status[0] == XA_BLANK ? "BLANK" :
+ status[0] == 0 ? "0" : "???"));
+ for (i = 1; i < nitems; i++)
+ fprintf (stderr, ", %lu", status[i]);
+ fprintf (stderr, "\n");
+ if (system ("xprop -root _SCREENSAVER_STATUS") <= 0)
+ fprintf (stderr, "%s: xprop exec failed\n", blurb());
+ }
+# endif /* 0 */
-/* called from screens.c so that all the Xt crud is here. */
-void
-initialize_screen_root_widget (saver_screen_info *ssi)
-{
- saver_info *si = ssi->global;
- if (ssi->toplevel_shell)
- XtDestroyWidget (ssi->toplevel_shell);
- ssi->toplevel_shell =
- XtVaAppCreateShell (progname, progclass,
- applicationShellWidgetClass,
- si->dpy,
- XtNscreen, ssi->screen,
- XtNvisual, ssi->current_visual,
- XtNdepth, visual_depth (ssi->screen,
- ssi->current_visual),
- NULL);
+ if (status != (PROP32 *) dataP)
+ free (status);
+ if (dataP)
+ XFree (dataP);
}
-/* Examine all of the display's screens, and populate the `saver_screen_info'
- structures. Make sure this is called after hack_environment() sets $PATH.
+/* This process does not map any windows on the screen. However, it creates
+ one hidden window on screen 0, which is the rendezvous point for
+ communication with xscreensaver-command: that window is how it can tell
+ that XScreenSaver is running, what the version number is, and it is where
+ bidirectional ClientMessage communication takes place. Since there are
+ no "blanking" windows around at all when xscreensaver-gfx is not running,
+ this window is needed. We could have instead re-tooled xscreensaver-command
+ to do all of its communication through the root window instead, but this
+ seemed easier.
*/
static void
-initialize_per_screen_info (saver_info *si, Widget toplevel_shell)
+create_daemon_window (Display *dpy)
{
- int i;
-
- update_screen_layout (si);
+ XClassHint class_hints;
+ XSetWindowAttributes attrs;
+ unsigned long attrmask = 0;
+ const char *name = "???";
+ const char *host = "???";
+ char buf[20];
+ pid_t pid = getpid();
+ struct passwd *p = getpwuid (getuid ());
+ time_t now = time ((time_t *) 0);
+ char *id;
+# ifdef HAVE_UNAME
+ struct utsname uts;
+# endif
- /* Check to see whether fading is ever possible -- if any of the
- screens on the display has a PseudoColor visual, then fading can
- work (on at least some screens.) If no screen has a PseudoColor
- visual, then don't bother ever trying to fade, because it will
- just cause a delay without causing any visible effect.
- */
- for (i = 0; i < si->nscreens; i++)
+ if (p && p->pw_name && *p->pw_name)
+ name = p->pw_name;
+ else if (p)
{
- saver_screen_info *ssi = &si->screens[i];
- if (has_writable_cells (ssi->screen, ssi->current_visual) ||
- get_visual (ssi->screen, "PseudoColor", True, False) ||
- get_visual (ssi->screen, "GrayScale", True, False))
- {
- si->fading_possible_p = True;
- break;
- }
+ sprintf (buf, "%lu", (unsigned long) p->pw_uid);
+ name = buf;
}
+ else
+ name = "???";
-#ifdef HAVE_XF86VMODE_GAMMA
- si->fading_possible_p = True; /* if we can gamma fade, go for it */
-#endif
-}
-
-
-/* If any server extensions have been requested, try and initialize them.
- Issue warnings if requests can't be honored.
- */
-static void
-initialize_server_extensions (saver_info *si)
-{
- saver_preferences *p = &si->prefs;
-
- Bool server_has_xidle_extension_p = False;
- Bool server_has_sgi_saver_extension_p = False;
- Bool server_has_mit_saver_extension_p = False;
- Bool system_has_proc_interrupts_p = False;
- Bool server_has_xinput_extension_p = False;
- const char *piwhy = 0;
-
- si->using_xidle_extension = p->use_xidle_extension;
- si->using_sgi_saver_extension = p->use_sgi_saver_extension;
- si->using_mit_saver_extension = p->use_mit_saver_extension;
- si->using_proc_interrupts = p->use_proc_interrupts;
- si->using_xinput_extension = p->use_xinput_extension;
-
-#ifdef HAVE_XIDLE_EXTENSION
+# ifdef HAVE_UNAME
{
- int ev, er;
- server_has_xidle_extension_p = XidleQueryExtension (si->dpy, &ev, &er);
+ if (! uname (&uts))
+ host = uts.nodename;
}
-#endif
-#ifdef HAVE_SGI_SAVER_EXTENSION
- server_has_sgi_saver_extension_p =
- XScreenSaverQueryExtension (si->dpy,
- &si->sgi_saver_ext_event_number,
- &si->sgi_saver_ext_error_number);
-#endif
-#ifdef HAVE_MIT_SAVER_EXTENSION
- server_has_mit_saver_extension_p =
- XScreenSaverQueryExtension (si->dpy,
- &si->mit_saver_ext_event_number,
- &si->mit_saver_ext_error_number);
-#endif
-#ifdef HAVE_PROC_INTERRUPTS
- system_has_proc_interrupts_p = query_proc_interrupts_available (si, &piwhy);
-#endif
-
-#ifdef HAVE_XINPUT
- server_has_xinput_extension_p = query_xinput_extension (si);
-#endif
+# endif
- if (!server_has_xidle_extension_p)
- si->using_xidle_extension = False;
- else if (p->verbose_p)
- {
- if (si->using_xidle_extension)
- fprintf (stderr, "%s: using XIDLE extension.\n", blurb());
- else
- fprintf (stderr, "%s: not using server's XIDLE extension.\n", blurb());
- }
+ class_hints.res_name = (char *) progname; /* not const? */
+ class_hints.res_class = "XScreenSaver";
+ id = (char *) malloc (strlen(name) + strlen(host) + 50);
+ sprintf (id, "%lu (%s@%s)", (unsigned long) pid, name, host);
+
+ attrmask = CWOverrideRedirect | CWEventMask;
+ attrs.override_redirect = True;
+ attrs.event_mask = PropertyChangeMask;
+
+ daemon_window = XCreateWindow (dpy, RootWindow (dpy, 0),
+ 0, 0, 1, 1, 0,
+ DefaultDepth (dpy, 0), InputOutput,
+ DefaultVisual (dpy, 0), attrmask, &attrs);
+ XStoreName (dpy, daemon_window, "XScreenSaver Daemon");
+ XSetClassHint (dpy, daemon_window, &class_hints);
+ XChangeProperty (dpy, daemon_window, XA_WM_COMMAND, XA_STRING,
+ 8, PropModeReplace, (unsigned char *) progname,
+ strlen (progname));
+ XChangeProperty (dpy, daemon_window, XA_SCREENSAVER_VERSION, XA_STRING,
+ 8, PropModeReplace, (unsigned char *) version_number,
+ strlen (version_number));
+ XChangeProperty (dpy, daemon_window, XA_SCREENSAVER_ID, XA_STRING,
+ 8, PropModeReplace, (unsigned char *) id, strlen (id));
+
+ store_saver_status (dpy, False, False, now);
+ free (id);
+}
- if (!server_has_sgi_saver_extension_p)
- si->using_sgi_saver_extension = False;
- else if (p->verbose_p)
- {
- if (si->using_sgi_saver_extension)
- fprintf (stderr, "%s: using SGI SCREEN_SAVER extension.\n", blurb());
- else
- fprintf (stderr,
- "%s: not using server's SGI SCREEN_SAVER extension.\n",
- blurb());
- }
- if (!server_has_mit_saver_extension_p)
- si->using_mit_saver_extension = False;
- else if (p->verbose_p)
+static const char *
+grab_string (int status)
+{
+ switch (status) {
+ case GrabSuccess: return "GrabSuccess";
+ case AlreadyGrabbed: return "AlreadyGrabbed";
+ case GrabInvalidTime: return "GrabInvalidTime";
+ case GrabNotViewable: return "GrabNotViewable";
+ case GrabFrozen: return "GrabFrozen";
+ default:
{
- if (si->using_mit_saver_extension)
- fprintf (stderr, "%s: using lame MIT-SCREEN-SAVER extension.\n",
- blurb());
- else
- fprintf (stderr,
- "%s: not using server's lame MIT-SCREEN-SAVER extension.\n",
- blurb());
+ static char buf[255];
+ sprintf(buf, "unknown status: %d", status);
+ return buf;
}
+ }
+}
-#ifdef HAVE_RANDR
- if (XRRQueryExtension (si->dpy,
- &si->randr_event_number, &si->randr_error_number))
- {
- int nscreens = ScreenCount (si->dpy); /* number of *real* screens */
- int i;
+static int
+grab_kbd (Screen *screen)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ Window w = RootWindowOfScreen (screen);
+ int status = XGrabKeyboard (dpy, w, True, GrabModeAsync, GrabModeAsync,
+ CurrentTime);
+ if (verbose_p)
+ fprintf (stderr, "%s: grabbing keyboard on 0x%lx: %s\n",
+ blurb(), (unsigned long) w, grab_string (status));
+ return status;
+}
- si->using_randr_extension = TRUE;
-
- if (p->verbose_p)
- fprintf (stderr, "%s: selecting RANDR events\n", blurb());
- for (i = 0; i < nscreens; i++)
-# ifdef RRScreenChangeNotifyMask /* randr.h 1.5, 2002/09/29 */
- XRRSelectInput (si->dpy, RootWindow (si->dpy, i),
- RRScreenChangeNotifyMask);
-# else /* !RRScreenChangeNotifyMask */ /* Xrandr.h 1.4, 2001/06/07 */
- XRRScreenChangeSelectInput (si->dpy, RootWindow (si->dpy, i), True);
-# endif /* !RRScreenChangeNotifyMask */
- }
-# endif /* HAVE_RANDR */
-#ifdef HAVE_XINPUT
- if (!server_has_xinput_extension_p)
- si->using_xinput_extension = False;
- else
- {
- if (si->using_xinput_extension)
- init_xinput_extension(si);
+static int
+grab_mouse (Screen *screen, Cursor cursor)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ Window w = RootWindowOfScreen (screen);
+ int status = XGrabPointer (dpy, w, True,
+ (ButtonPressMask | ButtonReleaseMask |
+ EnterWindowMask | LeaveWindowMask |
+ PointerMotionMask | PointerMotionHintMask |
+ Button1MotionMask | Button2MotionMask |
+ Button3MotionMask | Button4MotionMask |
+ Button5MotionMask | ButtonMotionMask),
+ GrabModeAsync, GrabModeAsync, w,
+ cursor, CurrentTime);
+ if (verbose_p)
+ fprintf (stderr, "%s: grabbing mouse on 0x%lx... %s\n",
+ blurb(), (unsigned long) w, grab_string (status));
+ return status;
+}
- if (p->verbose_p)
- {
- if (si->using_xinput_extension)
- fprintf (stderr,
- "%s: selecting events from %d XInputExtension devices.\n",
- blurb(), si->num_xinput_devices);
- else
- fprintf (stderr,
- "%s: not using XInputExtension.\n",
- blurb());
- }
- }
-#endif
- if (!system_has_proc_interrupts_p)
- {
- si->using_proc_interrupts = False;
- if (p->verbose_p && piwhy)
- fprintf (stderr, "%s: not using /proc/interrupts: %s.\n", blurb(),
- piwhy);
- }
- else if (p->verbose_p)
- {
- if (si->using_proc_interrupts)
- fprintf (stderr,
- "%s: consulting /proc/interrupts for keyboard activity.\n",
- blurb());
- else
- fprintf (stderr,
- "%s: not consulting /proc/interrupts for keyboard activity.\n",
- blurb());
- }
+static void
+ungrab_kbd (Display *dpy)
+{
+ if (verbose_p)
+ fprintf (stderr, "%s: ungrabbing keyboard\n", blurb());
+ XUngrabKeyboard (dpy, CurrentTime);
}
-#ifdef DEBUG_MULTISCREEN
static void
-debug_multiscreen_timer (XtPointer closure, XtIntervalId *id)
+ungrab_mouse (Display *dpy)
{
- saver_info *si = (saver_info *) closure;
- saver_preferences *p = &si->prefs;
- if (update_screen_layout (si))
- {
- if (p->verbose_p)
- {
- fprintf (stderr, "%s: new layout:\n", blurb());
- describe_monitor_layout (si);
- }
- resize_screensaver_window (si);
- }
- XtAppAddTimeOut (si->app, 1000*4, debug_multiscreen_timer, (XtPointer) si);
+ if (verbose_p)
+ fprintf (stderr, "%s: ungrabbing mouse\n", blurb());
+ XUngrabPointer (dpy, CurrentTime);
}
-#endif /* DEBUG_MULTISCREEN */
-/* For the case where we aren't using an server extensions, select user events
- on all the existing windows, and launch timers to select events on
- newly-created windows as well.
+/* Some remote desktop clients (e.g., "rdesktop") hold the keyboard GRABBED the
+ whole time they have focus! This is idiotic because the whole point of
+ grabbing is to get events when you do *not* have focus, so grabbing only
+ when* you have focus is redundant. Anyway, that prevents us from getting a
+ keyboard grab. It turns out that for some of these apps, de-focusing them
+ forces them to release their grab.
- If a server extension is being used, this does nothing.
+ So if we fail to grab the keyboard four times in a row, we forcibly set
+ focus to "None" and try four more times. We don't touch focus unless we're
+ already having a hard time getting a grab.
*/
static void
-select_events (saver_info *si)
+nuke_focus (Screen *screen)
{
- saver_preferences *p = &si->prefs;
- int i;
+ Display *dpy = DisplayOfScreen (screen);
+ Window focus = 0;
+ int rev = 0;
- if (si->using_xidle_extension ||
- si->using_mit_saver_extension ||
- si->using_sgi_saver_extension)
- return;
+ XGetInputFocus (dpy, &focus, &rev);
- if (p->initial_delay)
+ if (verbose_p)
{
- if (p->verbose_p)
- {
- fprintf (stderr, "%s: waiting for %d second%s...", blurb(),
- (int) p->initial_delay/1000,
- (p->initial_delay == 1000 ? "" : "s"));
- fflush (stderr);
- fflush (stdout);
- }
- usleep (p->initial_delay);
- if (p->verbose_p)
- fprintf (stderr, " done.\n");
- }
+ char w[255], r[255];
- if (p->verbose_p)
- {
- fprintf (stderr, "%s: selecting events on extant windows...", blurb());
- fflush (stderr);
- fflush (stdout);
- }
+ if (focus == PointerRoot) strcpy (w, "PointerRoot");
+ else if (focus == None) strcpy (w, "None");
+ else sprintf (w, "0x%lx", (unsigned long) focus);
- /* Select events on the root windows of every screen. This also selects
- for window creation events, so that new subwindows will be noticed.
- */
- for (i = 0; i < si->nscreens; i++)
- {
- saver_screen_info *ssi = &si->screens[i];
- if (ssi->real_screen_p)
- start_notice_events_timer (si,
- RootWindowOfScreen (si->screens[i].screen), False);
- }
+ if (rev == RevertToParent) strcpy (r, "RevertToParent");
+ else if (rev == RevertToPointerRoot) strcpy (r, "RevertToPointerRoot");
+ else if (rev == RevertToNone) strcpy (r, "RevertToNone");
+ else sprintf (r, "0x%x", rev);
- if (p->verbose_p)
- fprintf (stderr, " done.\n");
+ fprintf (stderr, "%s: removing focus from %s / %s\n",
+ blurb(), w, r);
+ }
-# ifdef DEBUG_MULTISCREEN
- if (p->debug_p) debug_multiscreen_timer ((XtPointer) si, 0);
-# endif
+ XSetInputFocus (dpy, None, RevertToNone, CurrentTime);
}
-void
-maybe_reload_init_file (saver_info *si)
+static void
+ungrab_keyboard_and_mouse (Display *dpy)
{
- saver_preferences *p = &si->prefs;
- if (init_file_changed_p (p))
- {
- if (p->verbose_p)
- fprintf (stderr, "%s: file \"%s\" has changed, reloading.\n",
- blurb(), init_file_name());
-
- load_init_file (si->dpy, p);
-
- /* If a server extension is in use, and p->timeout has changed,
- we need to inform the server of the new timeout. */
- disable_builtin_screensaver (si, False);
-
- /* If the DPMS settings in the init file have changed,
- change the settings on the server to match. */
- sync_server_dpms_settings (si->dpy,
- (p->dpms_enabled_p &&
- p->mode != DONT_BLANK),
- p->dpms_quickoff_p,
- p->dpms_standby / 1000,
- p->dpms_suspend / 1000,
- p->dpms_off / 1000,
- False);
- }
+ ungrab_mouse (dpy);
+ ungrab_kbd (dpy);
}
-/* Loop forever:
-
- - wait until the user is idle;
- - blank the screen;
- - wait until the user is active;
- - unblank the screen;
- - repeat.
-
+/* Returns true if it succeeds.
*/
-static void
-main_loop (saver_info *si)
+static Bool
+grab_keyboard_and_mouse_real (Screen *screen)
{
- saver_preferences *p = &si->prefs;
- Bool ok_to_unblank;
+ Display *dpy = DisplayOfScreen (screen);
+ Status mstatus = 0, kstatus = 0;
int i;
+ int retries = 4;
+ Bool focus_fuckus = False;
- while (1)
+ AGAIN:
+
+ for (i = 0; i < retries; i++)
{
- Bool was_locked = False;
-
- if (p->verbose_p)
- fprintf (stderr, "%s: awaiting idleness.\n", blurb());
-
- check_for_leaks ("unblanked A");
- sleep_until_idle (si, True);
- check_for_leaks ("unblanked B");
-
- if (p->verbose_p)
- {
- if (si->demoing_p)
- fprintf (stderr, "%s: demoing %d at %s.\n", blurb(),
- si->selection_mode, timestring(0));
- else
- fprintf (stderr, "%s: blanking screen at %s.\n", blurb(),
- timestring(0));
- }
-
- maybe_reload_init_file (si);
-
- /* Treat DONT_BLANK as BLANK_ONLY in emergency-lock when locking
- is enabled. */
-
- if (p->mode == DONT_BLANK &&
- (!si->emergency_lock_p ||
- !p->lock_p ||
- si->locking_disabled_p))
- {
- if (p->verbose_p)
- fprintf (stderr, "%s: idle with blanking disabled at %s.\n",
- blurb(), timestring(0));
+ XSync (dpy, False);
+ kstatus = grab_kbd (screen);
+ if (kstatus == GrabSuccess)
+ break;
- /* Go around the loop and wait for the next bout of idleness,
- or for the init file to change, or for a remote command to
- come in, or something.
+ /* else, wait a second and try to grab again. */
+ sleep (1);
+ }
- But, if locked_p is true, go ahead. This can only happen
- if we're in "disabled" mode but a "lock" clientmessage came
- in: in that case, we should go ahead and blank/lock the screen.
- */
- if (!si->locked_p)
- continue;
- }
+ if (kstatus != GrabSuccess)
+ {
+ fprintf (stderr, "%s: couldn't grab keyboard: %s\n",
+ blurb(), grab_string (kstatus));
- /* Since we're about to blank the screen, kill the de-race timer,
- if any. It might still be running if we have unblanked and then
- re-blanked in a short period (e.g., when using the "next" button
- in xscreensaver-demo.)
- */
- if (si->de_race_id)
+ if (! focus_fuckus)
{
- if (p->verbose_p)
- fprintf (stderr, "%s: stopping de-race timer (%d remaining.)\n",
- blurb(), si->de_race_ticks);
- XtRemoveTimeOut (si->de_race_id);
- si->de_race_id = 0;
+ focus_fuckus = True;
+ nuke_focus (screen);
+ goto AGAIN;
}
+ }
+ for (i = 0; i < retries; i++)
+ {
+ XSync (dpy, False);
+ mstatus = grab_mouse (screen, blank_cursor);
+ if (mstatus == GrabSuccess)
+ break;
- /* Now, try to blank.
- */
-
- if (! blank_screen (si))
- {
- /* We were unable to grab either the keyboard or mouse.
- This means we did not (and must not) blank the screen.
- If we were to blank the screen while some other program
- is holding both the mouse and keyboard grabbed, then
- we would never be able to un-blank it! We would never
- see any events, and the display would be wedged.
-
- In particular, without that keyboard grab, we will be
- unable to ever read keypresses on the unlock dialog.
- You can't unlock if you can't type your password.
-
- So, just go around the loop again and wait for the
- next bout of idleness. (If the user remains idle, we
- will next try to blank the screen again in no more than
- 60 seconds.)
- */
- Time retry = 60 * 1000;
- if (p->timeout < retry)
- retry = p->timeout;
-
- if (p->debug_p)
- {
- fprintf (stderr,
- "%s: DEBUG MODE: unable to grab -- BLANKING ANYWAY.\n",
- blurb());
- }
- else
- {
- fprintf (stderr,
- "%s: unable to grab keyboard or mouse! Blanking aborted.\n",
- blurb());
-
- /* Since we were unable to blank, clearly we're not locked,
- but we might have been prematurely marked as locked by
- the LOCK ClientMessage. */
- if (si->locked_p)
- set_locked_p (si, False);
+ /* else, wait a second and try to grab again. */
+ sleep (1);
+ }
- schedule_wakeup_event (si, retry, p->debug_p);
- continue;
- }
- }
+ if (mstatus != GrabSuccess)
+ fprintf (stderr, "%s: couldn't grab pointer: %s\n",
+ blurb(), grab_string (mstatus));
+
+
+ /* When should we allow blanking to proceed? The current theory
+ is that a keyboard grab is mandatory; a mouse grab is optional.
+
+ - If we don't have a keyboard grab, then we won't be able to
+ read a password to unlock, so the kbd grab is mandatory.
+ (We can't conditionalize this on locked_p, because someone
+ might run "xscreensaver-command -lock" at any time.)
+
+ - If we don't have a mouse grab, then we might not see mouse
+ clicks as a signal to unblank -- but we will still see kbd
+ activity, so that's not a disaster.
+
+ If the mouse grab failed with AlreadyGrabbed, then I *think*
+ that means that we will still see the mouse events via XInput2.
+ But if it failed with GrabFrozen, that means that the grabber
+ used GrabModeSync, and we will only receive those mouse events
+ as a replay after they release the grab, which doesn't help us.
+
+ If the keyboard grab failed with AlreadyGrabbed rather than
+ GrabFrozen then we may still get those keypresses -- but so will
+ the program holding the grab, so that's unacceptable for our
+ purpose of reading passwords.
+
+ It has been suggested that we should allow blanking if locking
+ is disabled, and we have a mouse grab but no keyboard grab.
+ That would allow screen blanking (but not locking) while the gdm
+ login screen had the keyboard grabbed, but one would have to use
+ the mouse to unblank. Keyboard characters would go to the gdm
+ login field without unblanking. I have not made this change
+ because I'm not completely convinced it is a safe thing to do.
+ */
- for (i = 0; i < si->nscreens; i++)
- kill_screenhack (&si->screens[i]);
+ if (kstatus != GrabSuccess) /* Do not blank without a kbd grab. */
+ {
+ /* If we didn't get both grabs, release the one we did get. */
+ ungrab_keyboard_and_mouse (dpy);
+ return False;
+ }
- raise_window (si, True, True, False);
- if (si->throttled_p)
- fprintf (stderr, "%s: not launching hack (throttled.)\n", blurb());
- else
- for (i = 0; i < si->nscreens; i++)
- spawn_screenhack (&si->screens[i]);
+ return True; /* Grab is good, go ahead and blank. */
+}
- /* If we are blanking only, optionally power down monitor right now. */
- if (p->mode == BLANK_ONLY &&
- p->dpms_enabled_p &&
- p->dpms_quickoff_p)
- {
- sync_server_dpms_settings (si->dpy, True,
- p->dpms_quickoff_p,
- p->dpms_standby / 1000,
- p->dpms_suspend / 1000,
- p->dpms_off / 1000,
- False);
- monitor_power_on (si, False);
- }
- /* Don't start the cycle timer in demo mode. */
- if (!si->demoing_p && p->cycle)
- si->cycle_id = XtAppAddTimeOut (si->app,
- (si->selection_mode
- /* see comment in cycle_timer() */
- ? 1000 * 60 * 60
- : p->cycle),
- cycle_timer,
- (XtPointer) si);
+static Bool
+grab_keyboard_and_mouse (Screen *screen)
+{
+ Bool ret;
+ char op[10];
+ char *args[3];
+ args[0] = external_ungrab_command; /* Because C89 */
+ args[1] = op;
+ args[2] = NULL;
+ if (external_ungrab_command && *external_ungrab_command)
+ {
+ snprintf (op, sizeof(op), "pre");
+ exec_and_wait (DisplayOfScreen(screen), 2, args);
+ }
+ ret = grab_keyboard_and_mouse_real (screen);
+ if (external_ungrab_command && *external_ungrab_command)
+ {
+ snprintf (op, sizeof(op), "post");
+ exec_and_wait (DisplayOfScreen(screen), 2, args);
+ }
+ return ret;
+}
-#ifndef NO_LOCKING
- /* Maybe start locking the screen.
- */
+/* Which screen is the mouse on?
+ */
+static Screen *
+mouse_screen (Display *dpy)
+{
+ int i, nscreens = ScreenCount (dpy);
+ if (nscreens > 1)
+ for (i = 0; i < nscreens; i++)
{
- Time lock_timeout = p->lock_timeout;
-
- /* If we're fading, don't lock until the fade finishes. */
- if (si->fading_possible_p && p->fade_p)
- lock_timeout += p->fade_seconds / 1000;
-
- if (si->emergency_lock_p)
- lock_timeout = 0;
-
- if (si->emergency_lock_p && p->lock_p && lock_timeout)
+ Window pointer_root, pointer_child;
+ int root_x, root_y, win_x, win_y;
+ unsigned int mask;
+ int status = XQueryPointer (dpy, RootWindow (dpy, i),
+ &pointer_root, &pointer_child,
+ &root_x, &root_y, &win_x, &win_y, &mask);
+ if (status != None)
{
- int secs = p->lock_timeout / 1000;
- if (p->verbose_p)
- fprintf (stderr,
- "%s: locking now, instead of waiting for %d:%02d:%02d.\n",
- blurb(),
- (secs / (60 * 60)), ((secs / 60) % 60), (secs % 60));
- lock_timeout = 0;
+ if (verbose_p)
+ fprintf (stderr, "%s: mouse is on screen %d of %d\n",
+ blurb(), i, nscreens);
+ return ScreenOfDisplay (dpy, i);
}
-
- si->emergency_lock_p = False;
-
- if (!si->demoing_p && /* if not going into demo mode */
- p->lock_p && /* and locking is enabled */
- !si->locking_disabled_p && /* and locking is possible */
- lock_timeout == 0) /* and locking is not timer-deferred */
- set_locked_p (si, True); /* then lock right now. */
-
- /* locked_p might be true already because of the above, or because of
- the LOCK ClientMessage. But if not, and if we're supposed to lock
- after some time, set up a timer to do so.
- */
- if (p->lock_p &&
- !si->locked_p &&
- lock_timeout > 0)
- si->lock_id = XtAppAddTimeOut (si->app, lock_timeout,
- activate_lock_timer,
- (XtPointer) si);
}
-#endif /* !NO_LOCKING */
-
-
- ok_to_unblank = True;
- do {
-
- check_for_leaks ("blanked A");
- sleep_until_idle (si, False); /* until not idle */
- check_for_leaks ("blanked B");
-
- maybe_reload_init_file (si);
-#ifndef NO_LOCKING
- /* Maybe unlock the screen.
- */
- if (si->locked_p)
- {
- saver_screen_info *ssi = si->default_screen;
- if (si->locking_disabled_p) abort ();
-
- was_locked = True;
- si->dbox_up_p = True;
- if (p->dpms_full_throttle_p)
- {
- for (i = 0; i < si->nscreens; i++)
- if (si->screens[i].pid == 0)
- spawn_screenhack (&si->screens[i]);
- usleep(100000);
- }
- else
- for (i = 0; i < si->nscreens; i++)
- suspend_screenhack (&si->screens[i], True); /* suspend */
- XUndefineCursor (si->dpy, ssi->screensaver_window);
-
- ok_to_unblank = unlock_p (si);
+ return ScreenOfDisplay (dpy, 0);
+}
- si->dbox_up_p = False;
- XDefineCursor (si->dpy, ssi->screensaver_window, ssi->cursor);
- for (i = 0; i < si->nscreens; i++)
- suspend_screenhack (&si->screens[i], False); /* resume */
- if (!ok_to_unblank &&
- !screenhack_running_p (si))
- {
- /* If the lock dialog has been dismissed and we're not about to
- unlock the screen, and there is currently no hack running,
- then launch one. (There might be no hack running if DPMS
- had kicked in. But DPMS is off now, so bring back the hack)
- */
- if (si->cycle_id)
- XtRemoveTimeOut (si->cycle_id);
- si->cycle_id = 0;
- cycle_timer ((XtPointer) si, 0);
- }
- }
-#endif /* !NO_LOCKING */
+static void
+maybe_disable_locking (Display *dpy)
+{
+ const char *why = 0;
- } while (!ok_to_unblank);
+# ifdef NO_LOCKING
+ why = "locking disabled at compile time";
+# endif
+ if (!why)
+ {
+ uid_t u = getuid();
+ if (u == 0 || u == (uid_t) -1 || u == (uid_t) -2)
+ why = "cannot lock when running as root";
+ }
- if (p->verbose_p)
- fprintf (stderr, "%s: unblanking screen at %s.\n",
- blurb(), timestring (0));
+ if (!why && getenv ("RUNNING_UNDER_GDM"))
+ /* Launched as GDM's "Background" program */
+ why = "cannot lock when running under GDM";
- /* Kill before unblanking, to stop drawing as soon as possible. */
- for (i = 0; i < si->nscreens; i++)
- kill_screenhack (&si->screens[i]);
- unblank_screen (si);
+ /* X11 grabs don't work under Wayland's embedded X11 server. The Wayland
+ window manager lives at a higher level than the X11 emulation layer. */
+ if (!why && getenv ("WAYLAND_DISPLAY"))
+ why = "cannot lock securely under Wayland";
- set_locked_p (si, False);
- si->emergency_lock_p = False;
- si->demoing_p = 0;
- si->selection_mode = 0;
+ if (!why)
+ {
+ /* Grabs under the macOS XDarwin server only affect other X11 programs:
+ you can Cmd-Tab to "Terminal". These extensions exist on later
+ releases XQuartz. */
+ int op = 0, event = 0, error = 0;
+ if (XQueryExtension (dpy, "Apple-DRI", &op, &event, &error) ||
+ XQueryExtension (dpy, "Apple-WM", &op, &event, &error))
+ why = "cannot lock securely under macOS X11";
+ }
- /* If we're throttled, and the user has explicitly unlocked the screen,
- then unthrottle. If we weren't locked, then don't unthrottle
- automatically, because someone might have just bumped the desk... */
- if (was_locked)
+ if (why)
+ {
+ if (debug_p)
{
- if (si->throttled_p && p->verbose_p)
- fprintf (stderr, "%s: unthrottled.\n", blurb());
- si->throttled_p = False;
+ fprintf (stderr, "%s: %s\n", blurb(), why);
+ fprintf (stderr, "%s: DEBUG MODE: allowing locking anyway!\n",
+ blurb());
+ }
+ else
+ {
+ locking_disabled_p = True;
+ if (lock_p || verbose_p)
+ fprintf (stderr, "%s: locking disabled: %s\n", blurb(), why);
}
-
- if (si->cycle_id)
- {
- XtRemoveTimeOut (si->cycle_id);
- si->cycle_id = 0;
- }
-
- if (si->lock_id)
- {
- XtRemoveTimeOut (si->lock_id);
- si->lock_id = 0;
- }
-
-# ifdef HAVE_LIBSYSTEMD
- /* This might be a good spot to re-launch si->systemd_pid
- if it has died unexpectedly. Which shouldn't happen. */
-# endif
-
- /* Since we're unblanked now, break race conditions and make
- sure we stay that way (see comment in timers.c.) */
- if (! si->de_race_id)
- de_race_timer ((XtPointer) si, 0);
}
}
-static void analyze_display (saver_info *si);
-static void fix_fds (void);
-int
-main (int argc, char **argv)
+static void
+main_loop (Display *dpy)
{
- Widget shell;
- saver_info the_si;
- saver_info *si = &the_si;
- saver_preferences *p = &si->prefs;
- struct passwd *spasswd;
- int i;
+ int xi_opcode;
+ time_t now = time ((time_t *) 0);
+ time_t active_at = now;
+ time_t blanked_at = 0;
+ time_t ignore_activity_before = now;
+ time_t last_checked_init_file = now;
+ Bool authenticated_p = False;
+ Bool ignore_motion_p = False;
- /* It turns out that if we do setlocale (LC_ALL, "") here, people
- running in Japanese locales get font craziness on the password
- dialog, presumably because it is displaying Japanese characters
- in a non-Japanese font. However, if we don't call setlocale()
- at all, then XLookupString() never returns multi-byte UTF-8
- characters when people type non-Latin1 characters on the
- keyboard.
+ enum { UNBLANKED, BLANKED, LOCKED, AUTH } current_state = UNBLANKED;
- The current theory (and at this point, I'm really guessing!) is
- that using LC_CTYPE instead of LC_ALL will make XLookupString()
- behave usefully, without having the side-effect of screwing up
- the fonts on the unlock dialog.
+ struct { time_t time; int x, y; } last_mouse = { 0, 0, 0 };
- See https://bugs.launchpad.net/ubuntu/+source/xscreensaver/+bug/671923
- from comment #20 onward.
+ maybe_disable_locking (dpy);
+ init_xscreensaver_atoms (dpy);
+ ensure_no_screensaver_running (dpy);
- -- jwz, 24-Sep-2011
- */
-#ifdef ENABLE_NLS
- if (!setlocale (LC_CTYPE, ""))
- fprintf (stderr, "%s: warning: could not set default locale\n",
- progname);
+ if (! init_xinput (dpy, &xi_opcode))
+ saver_exit (1);
- bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
- textdomain (GETTEXT_PACKAGE);
-#endif /* ENABLE_NLS */
+ create_daemon_window (dpy);
- memset(si, 0, sizeof(*si));
- global_si_kludge = si; /* I hate C so much... */
+ handle_signals();
- fix_fds();
+ blank_cursor = None; /* Cursor of window under mouse (which is blank). */
+ auth_cursor = XCreateFontCursor (dpy, XC_top_left_arrow);
-# undef ya_rand_init
- ya_rand_init (0);
+ if (strchr (version_number, 'a') || strchr (version_number, 'b'))
+ splash_p = True; /* alpha and beta releases */
- save_argv (argc, argv);
- set_version_string (si, &argc, argv);
- privileged_initialization (si, &argc, argv);
- hack_environment (si);
+ /* Launch "xscreensaver-auth" once at startup with either --splash or --init,
+ The latter to handle the OOM-killer while setuid. */
+ {
+ char *av[10];
+ int ac = 0;
+ av[ac++] = SAVER_AUTH_PROGRAM;
+ av[ac++] = (splash_p ? "--splash" : "--init");
+ if (verbose_p) av[ac++] = "--verbose";
+ if (verbose_p > 1) av[ac++] = "--verbose";
+ if (verbose_p > 2) av[ac++] = "--verbose";
+ if (debug_p) av[ac++] = "--debug";
+ av[ac] = 0;
+ saver_auth_pid = fork_and_exec (dpy, ac, av);
+ }
- spasswd = getpwuid(getuid());
- if (!spasswd)
- {
- fprintf(stderr, "Could not figure out who the current user is!\n");
- return 1;
- }
+# ifdef HAVE_LIBSYSTEMD
+ /* Launch xscreensaver-systemd at startup. */
+ {
+ char *av[10];
+ int ac = 0;
+ av[ac++] = SAVER_SYSTEMD_PROGRAM;
+ if (verbose_p || debug_p)
+ av[ac++] = "--verbose";
+ av[ac] = 0;
+ saver_systemd_pid = fork_and_exec (dpy, ac, av);
+ }
+# endif /* HAVE_LIBSYSTEMD */
- si->user = strdup(spasswd->pw_name ? spasswd->pw_name : "(unknown)");
-# ifndef NO_LOCKING
- si->unlock_cb = gui_auth_conv;
- si->auth_finished_cb = auth_finished_cb;
-# endif /* !NO_LOCKING */
+ /* X11 errors during startup initialization were fatal.
+ Once we enter the main loop, they are printed but ignored.
+ */
+ XSync (dpy, False);
+ ignore_x11_error_p = True;
- shell = connect_to_server (si, &argc, argv);
- process_command_line (si, &argc, argv);
- stderr_log_file (si);
- print_banner (si);
+ /************************************************************************
+ Main loop
+ ************************************************************************/
- load_init_file(si->dpy, p); /* must be before initialize_per_screen_info() */
- blurb_timestamp_p = p->timestamp_p; /* kludge */
- initialize_per_screen_info (si, shell); /* also sets si->fading_possible_p */
+ while (1)
+ {
+ Bool force_blank_p = False;
+ Bool force_lock_p = False;
+ Atom blank_mode = 0;
+ char blank_mode_arg[20] = { 0 };
- /* We can only issue this warning now. */
- if (p->verbose_p && !si->fading_possible_p && (p->fade_p || p->unfade_p))
- fprintf (stderr,
- "%s: there are no PseudoColor or GrayScale visuals.\n"
- "%s: ignoring the request for fading/unfading.\n",
- blurb(), blurb());
+ /* Wait until an event comes in, or a timeout. */
+ {
+ int xfd = ConnectionNumber (dpy);
+ fd_set in_fds;
+ struct timeval tv;
+ time_t until;
+ switch (current_state) {
+ case UNBLANKED: until = active_at + blank_timeout; break;
+ case BLANKED: until = blanked_at + lock_timeout; break;
+ default: until = 0;
+ }
- for (i = 0; i < si->nscreens; i++)
- {
- saver_screen_info *ssi = &si->screens[i];
- if (ssi->real_screen_p)
- if (ensure_no_screensaver_running (si->dpy, si->screens[i].screen))
- exit (1);
- ssi->current_hack = -1;
- }
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+ if (until >= now)
+ tv.tv_sec = until - now;
+
+ if (verbose_p > 3)
+ {
+ if (!tv.tv_sec)
+ fprintf (stderr, "%s: block until input\n", blurb());
+ else
+ {
+ struct tm tm;
+ time_t t = now + tv.tv_sec;
+ localtime_r (&t, &tm);
+ fprintf (stderr,
+ "%s: block for %ld sec until %02d:%02d:%02d\n",
+ blurb(), tv.tv_sec, tm.tm_hour, tm.tm_min, tm.tm_sec);
+ }
+ }
- lock_initialization (si, &argc, argv);
- print_lock_failure_banner (si);
+ FD_ZERO (&in_fds);
+ FD_SET (xfd, &in_fds);
+ select (xfd + 1, &in_fds, NULL, NULL, (tv.tv_sec ? &tv : NULL));
+ }
- if (p->xsync_p) XSynchronize (si->dpy, True);
+ now = time ((time_t *) 0);
- if (p->verbose_p) analyze_display (si);
- initialize_server_extensions (si);
- si->blank_time = time ((time_t *) 0); /* must be before ..._window */
- initialize_screensaver_window (si);
+ /********************************************************************
+ Signal handlers
+ ********************************************************************/
- select_events (si);
- init_sigchld ();
- disable_builtin_screensaver (si, True);
- sync_server_dpms_settings (si->dpy,
- (p->dpms_enabled_p &&
- p->mode != DONT_BLANK),
- p->dpms_quickoff_p,
- p->dpms_standby / 1000,
- p->dpms_suspend / 1000,
- p->dpms_off / 1000,
- False);
+ /* If a signal handler fired, it set a flag, and that caused select()
+ to return. Now that we are back on the program stack, handle
+ those signals. */
- initialize_stderr (si);
- handle_signals (si);
+ /* SIGHUP is the same as "xscreensaver-command -restart". */
+ if (sighup_received)
+ {
+ sighup_received = 0;
+ if (current_state == LOCKED)
+ {
+ fprintf (stderr,
+ "%s: SIGHUP received while locked: ignoring\n",
+ blurb());
+ }
+ else
+ {
+ fprintf (stderr, "%s: SIGHUP received: restarting\n", blurb());
+ restart_process(); /* Does not return */
+ fprintf (stderr, "%s: SIGHUP RESTART FAILED!\n", blurb());
+ }
+ }
- store_saver_status (si); /* for xscreensaver-command -status */
+ /* Upon SIGTERM, SIGINT or SIGQUIT we must kill our subprocesses
+ before exiting.
+ */
+ if (sigterm_received)
+ {
+ int sig = sigterm_received; /* Same handler for all 3 signals */
+ const char *sn = (sig == SIGINT ? "SIGINT" :
+ sig == SIGQUIT ? "SIGQUIT" : "SIGTERM");
+ sigterm_received = 0;
+ fprintf (stderr, "%s: %s received%s: exiting\n", blurb(), sn,
+ (current_state == LOCKED ? " while locked" : ""));
+
+ /* Rather than calling saver_exit(), set our SIGTERM handler back to
+ the default and re-signal it so that this process actually dies
+ with a signal. */
+ signal (sig, SIG_DFL);
+ kill_all_subprocs();
+ kill (getpid(), sig);
+ abort();
+ }
-# ifdef HAVE_LIBSYSTEMD /* Launch it in the background */
- si->systemd_pid = fork_and_exec_1 (si, 0, "xscreensaver-systemd");
-# endif
+ /* SIGCHLD is fired any time one of our subprocesses dies.
+ When "xscreensaver-auth" dies, it analyzes its exit code.
+ */
+ if (sigchld_received)
+ authenticated_p = handle_sigchld (dpy, current_state != UNBLANKED);
- make_splash_dialog (si);
+ /* Now process any outstanding X11 events on the queue: user activity
+ from XInput, and ClientMessages from xscreensaver-command.
+ */
+ while (XPending (dpy))
+ {
+ XEvent xev;
+ XNextEvent (dpy, &xev);
+ now = time ((time_t *) 0);
+
+ /****************************************************************
+ Client Messages
+ Both xscreensaver and xscreensaver-gfx handle these; some are
+ handled exclusively by one program or another, and some of them
+ (select, next, prev) are handled by xscreensaver only if
+ xscreensaver-gfx is not already running.
+ ****************************************************************/
+
+ switch (xev.xany.type) {
+ case ClientMessage:
+ {
+ Atom msg = xev.xclient.data.l[0];
- main_loop (si); /* doesn't return */
- return 0;
-}
+ /* Re-load the .xscreensaver file before processing the results
+ of any ClientMessage, in case they just changed the timeouts.
+ */
+ last_checked_init_file = 0;
-static void
-fix_fds (void)
-{
- /* Bad Things Happen if stdin, stdout, and stderr have been closed
- (as by the `sh incantation "xscreensaver >&- 2>&-"). When you do
- that, the X connection gets allocated to one of these fds, and
- then some random library writes to stderr, and random bits get
- stuffed down the X pipe, causing "Xlib: sequence lost" errors.
- So, we cause the first three file descriptors to be open to
- /dev/null if they aren't open to something else already. This
- must be done before any other files are opened (or the closing
- of that other file will again free up one of the "magic" first
- three FDs.)
+ if (! (xev.xclient.message_type == XA_SCREENSAVER &&
+ xev.xclient.format == 32 &&
+ xev.xclient.data.l[0]))
+ {
+ goto BAD_CM;
+ }
+ else if (msg == XA_ACTIVATE ||
+ msg == XA_SELECT ||
+ msg == XA_DEMO ||
+ msg == XA_NEXT ||
+ msg == XA_PREV)
+ {
+ /* The others are the same as -activate except that they
+ cause some extra args to be added to the xscreensaver-gfx
+ command line.
+ */
+ if (msg != XA_ACTIVATE)
+ blank_mode = msg;
+ if (msg == XA_SELECT || msg == XA_DEMO)
+ { /* see remote.c */
+ unsigned long n = xev.xclient.data.l[1];
+ if (n == 5000) n = xev.xclient.data.l[2];
+ sprintf (blank_mode_arg, "%lu", n);
+ }
+
+ if (msg == XA_DEMO) ignore_motion_p = True;
+
+ if (current_state == UNBLANKED)
+ {
+ force_blank_p = True;
+ ignore_activity_before = now + 2;
+ clientmessage_response (dpy, &xev, True, "blanking");
+ }
+ else if (msg == XA_SELECT ||
+ msg == XA_NEXT ||
+ msg == XA_PREV)
+ {
+ /* When active, these are handled by xscreensaver-gfx
+ instead of xscreensaver, so silently ignore them,
+ and allow xscreensaver-gfx to reply instead. */
+ }
+ else
+ clientmessage_response (dpy, &xev, False,
+ "already active");
+ }
+ else if (msg == XA_CYCLE)
+ {
+ if (current_state == UNBLANKED)
+ /* Only allowed when screen already blanked */
+ clientmessage_response (dpy, &xev, False, "not blanked");
+ /* else xscreensaver-gfx will respond to this. */
+ }
+ else if (msg == XA_DEACTIVATE)
+ {
+ if (current_state == UNBLANKED)
+ {
+ clientmessage_response (dpy, &xev, True,
+ "already inactive, resetting activity time");
+ active_at = now;
+ ignore_activity_before = now;
+ }
+ else
+ {
+ /* This behaves just like user input: if state is
+ LOCKED, it will advance to AUTH. */
+ active_at = now;
+ ignore_activity_before = now;
+ clientmessage_response (dpy, &xev, True, "deactivating");
+ }
+
+ /* DEACTIVATE while inactive also needs to reset the
+ server's DPMS time, but doing that here would mean
+ linking with additional libraries, doing additional X
+ protocol, and also some finicky error handling, since
+ the DPMS extension is a pain in the ass. So instead,
+ I made xscreensaver-command do that instead. This
+ somewhat breaks the abstraction of ClientMessage
+ handling, but it's more robust. */
+ }
+ else if (msg == XA_LOCK)
+ {
+ if (locking_disabled_p)
+ clientmessage_response (dpy, &xev, False,
+ "locking disabled");
+ else if (current_state == UNBLANKED ||
+ current_state == BLANKED)
+ {
+ force_lock_p = True;
+ ignore_activity_before = now + 2;
+ clientmessage_response (dpy, &xev, True, "locking");
+ }
+ else
+ clientmessage_response (dpy, &xev, False,
+ "already locked");
+ }
+ else if (msg == XA_SUSPEND)
+ {
+ force_blank_p = True;
+ if (lock_p) force_lock_p = True;
+ ignore_activity_before = now + 2;
+ blank_mode = msg;
+ clientmessage_response (dpy, &xev, True, "suspending");
+ }
+ else if (msg == XA_EXIT)
+ {
+ if (current_state == UNBLANKED ||
+ current_state == BLANKED)
+ {
+ clientmessage_response (dpy, &xev, True, "exiting");
+ XSync (dpy, False);
+ saver_exit (0);
+ }
+ else
+ clientmessage_response (dpy, &xev, False,
+ "screen is locked");
+ }
+ else if (msg == XA_RESTART)
+ {
+ if (current_state == UNBLANKED ||
+ current_state == BLANKED)
+ {
+ clientmessage_response (dpy, &xev, True, "restarting");
+ XSync (dpy, False);
+ restart_process(); /* Does not return */
+ fprintf (stderr, "%s: RESTART FAILED!\n", blurb());
+ }
+ else
+ clientmessage_response (dpy, &xev, False,
+ "screen is locked");
+ }
+ else
+ {
+ BAD_CM:
+ if (verbose_p)
+ {
+ Atom type;
+ char *tstr, *name;
+ Bool op = print_x11_error_p;
+ print_x11_error_p = False; /* Ignore BadAtom */
+ type = xev.xclient.message_type;
+ tstr = type ? XGetAtomName (dpy, type) : 0;
+ name = msg ? XGetAtomName (dpy, msg) : 0;
+ fprintf (stderr,
+ "%s: unrecognized ClientMessage %s %s\n",
+ blurb(),
+ (tstr ? tstr : "???"),
+ (name ? name : "???"));
+ if (tstr) XFree (tstr);
+ if (name) XFree (name);
+ print_x11_error_p = op;
+ }
+ }
+ continue;
+ }
- We do this by opening /dev/null three times, and then closing
- those fds, *unless* any of them got allocated as #0, #1, or #2,
- in which case we leave them open. Gag.
- Really, this crap is technically required of *every* X program,
- if you want it to be robust in the face of "2>&-".
- */
- int fd0 = open ("/dev/null", O_RDWR);
- int fd1 = open ("/dev/null", O_RDWR);
- int fd2 = open ("/dev/null", O_RDWR);
- if (fd0 > 2) close (fd0);
- if (fd1 > 2) close (fd1);
- if (fd2 > 2) close (fd2);
-}
+ /****************************************************************
+ Normal X11 keyboard and mouse events
+ ****************************************************************/
+
+ /* XInput2 "raw" events bypass X11 grabs, but grabs take priority.
+ If this process has the keyboard and mouse grabbed, it receives
+ the following events:
+
+ - X11 KeyPress, KeyRelease
+ - X11 ButtonPress, ButtonRelease
+ - X11 MotionNotify
+ - XInput XI_RawButtonPress, XI_RawButtonRelease
+ - XInput XI_RawMotion
+
+ Note that button and motion events are doubly reported, but
+ keyboard events are not.
+
+ If this process does *not* have the keyboard and mouse grabbed,
+ it receives the following events, regardless of the window in
+ which they occur:
+
+ - XInput XI_RawKeyPress, XI_RawKeyRelease
+ - XInput XI_RawButtonPress, XI_RawButtonRelease
+ - XInput XI_RawMotion
+
+ But here's an irritating kink: though XInput2 generally allows
+ snooping of everything, it respects GrabModeSync. What this
+ means is that if some other process has the keyboard grabbed with
+ "Sync" instead of "Async", then this process will not see any of
+ the events until that process releases its grab, and then the
+ events come in late, all at once. Verify this by running:
+
+ test-xinput &
+ Note that keyboard and mouse events are detected.
+ test-grab --mouse --mouse-async --kbd-async
+ Same.
+ test-grab --mouse --mouse-sync --kbd-async
+ Keyboard events are detected.
+ No motion or button events until "test-grab" is killed.
+ test-grab --mouse --mouse-async --kbd-sync
+ Vice versa.
+ */
+ case KeyPress:
+ case KeyRelease:
+ if (current_state != AUTH && /* logged by xscreensaver-auth */
+ (verbose_p > 1 ||
+ (verbose_p && now - active_at > 1)))
+ print_xinput_event (dpy, &xev, "");
+ active_at = now;
+ continue;
+ break;
+ case ButtonPress:
+ case ButtonRelease:
+ active_at = now;
+ if (verbose_p)
+ print_xinput_event (dpy, &xev, "");
+ continue;
+ break;
+ case MotionNotify:
+ /* Since we always get XI_RawMotion, but only get MotionNotify
+ when grabbed, we can just ignore MotionNotify and let the
+ XI_RawMotion clause handle hysteresis. */
+ if (verbose_p > 1)
+ print_xinput_event (dpy, &xev, "ignored");
+ continue;
+ break;
+ default:
+ break;
+ }
-
-/* Processing ClientMessage events.
- */
+ /****************************************************************
+ XInput keyboard and mouse events
+ ****************************************************************/
+
+ if (xev.xcookie.type != GenericEvent ||
+ xev.xcookie.extension != xi_opcode)
+ continue; /* not an XInput event */
+
+ if (!xev.xcookie.data)
+ XGetEventData (dpy, &xev.xcookie);
+ if (!xev.xcookie.data)
+ continue; /* Bogus XInput event */
+
+ switch (xev.xcookie.evtype) {
+ case XI_RawKeyPress:
+ case XI_RawKeyRelease:
+ case XI_RawButtonPress:
+ case XI_RawButtonRelease:
+ if (current_state != AUTH && /* logged by xscreensaver-auth */
+ (verbose_p > 1 ||
+ (verbose_p && now - active_at > 1)))
+ print_xinput_event (dpy, &xev, "");
+ active_at = now;
+ break;
+
+ case XI_RawMotion:
+ {
+ /* Mouse wheel scrolling sends Button4 and Button5 events as well
+ as motion, so we handled those above, in XI_RawButtonPress.
+ The raw_values in the motion event for a mouse wheel reflect
+ the position of the wheel sensor.
+
+ On a trackpad where two-finger-swipe is a scroll gesture, I
+ saw behavior identical to a mouse wheel -- it does not send
+ RawTouch events.
+ */
+
+ /* Don't poll the mouse position more frequently than once
+ a second. The motion only counts as activity if it has
+ moved farther than N pixels per second.
+ */
+ int secs = now - last_mouse.time;
+ if (secs >= 1)
+ {
+ Window root_ret, child_ret;
+ int root_x, root_y;
+ int win_x, win_y;
+ unsigned int mask;
+ int dist;
+ Bool ignored_p = False;
+
+ XQueryPointer (dpy, DefaultRootWindow (dpy),
+ &root_ret, &child_ret, &root_x, &root_y,
+ &win_x, &win_y, &mask);
+ dist = MAX (ABS (last_mouse.x - root_x),
+ ABS (last_mouse.y - root_y));
+
+ ignored_p = (ignore_motion_p || dist < pointer_hysteresis);
+
+ if (! ignored_p)
+ {
+ active_at = now;
+ last_mouse.time = now;
+ last_mouse.x = root_x;
+ last_mouse.y = root_y;
+ }
+
+ if (verbose_p > 1 ||
+ (verbose_p && now - active_at > 5))
+ print_xinput_event (dpy, &xev,
+ (ignored_p ? " ignored" : ""));
+ }
+ }
+ break;
-static Bool error_handler_hit_p = False;
+ default:
+ if (verbose_p)
+ print_xinput_event (dpy, &xev, "");
+ break;
+ }
-static int
-ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
-{
- error_handler_hit_p = True;
- return 0;
-}
+ XFreeEventData (dpy, &xev.xcookie);
+ }
-/* Sometimes some systems send us ClientMessage events with bogus atoms in
- them. We only look up the atom names for printing warning messages,
- so don't bomb out when it happens...
- */
-static char *
-XGetAtomName_safe (Display *dpy, Atom atom)
-{
- char *result;
- XErrorHandler old_handler;
- if (!atom) return 0;
- XSync (dpy, False);
- error_handler_hit_p = False;
- old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
- result = XGetAtomName (dpy, atom);
- XSync (dpy, False);
- XSetErrorHandler (old_handler);
- XSync (dpy, False);
- if (error_handler_hit_p) result = 0;
+ /********************************************************************
+ Advancing the state machine
+ ********************************************************************/
- if (result)
- return result;
- else
- {
- char buf[100];
- sprintf (buf, "<<undefined atom 0x%04X>>", (unsigned int) atom);
- return strdup (buf);
- }
-}
+ /* If it's time, see if the .xscreensaver file has changed, since that
+ might change the blank and lock timeouts.
+ */
+ if (now >= last_checked_init_file + 60)
+ {
+ last_checked_init_file = now;
+ if (verbose_p)
+ fprintf(stderr,"%s: checking init file\n", blurb());
+ read_init_files (False);
+ }
+ /* Now that events have been processed, see if the state should change,
+ based on any events received and the current time.
+ */
+ switch (current_state) {
+ case UNBLANKED:
+ if (!locking_disabled_p &&
+ (force_lock_p ||
+ (lock_p &&
+ now >= active_at + blank_timeout + lock_timeout)))
+ {
+ fprintf (stderr, "%s: locking\n", blurb());
+ if (grab_keyboard_and_mouse (mouse_screen (dpy)))
+ {
+ current_state = LOCKED;
+ blanked_at = now;
+ authenticated_p = False;
+ store_saver_status (dpy, True, True, now);
+ }
+ else
+ fprintf (stderr, "%s: unable to grab -- locking aborted!\n",
+ blurb());
-static void
-clientmessage_response (saver_info *si, Window w, Bool error,
- const char *stderr_msg,
- const char *protocol_msg)
-{
- char *proto;
- int L;
- saver_preferences *p = &si->prefs;
- XErrorHandler old_handler;
-
- if (error || p->verbose_p)
- fprintf (stderr, "%s: %s\n", blurb(), stderr_msg);
-
- L = strlen(protocol_msg);
- proto = (char *) malloc (L + 2);
- proto[0] = (error ? '-' : '+');
- strcpy (proto+1, protocol_msg);
- L++;
-
- /* Ignore all X errors while sending a response to a ClientMessage.
- Pretty much the only way we could get an error here is if the
- window we're trying to send the reply on has been deleted, in
- which case, the sender of the ClientMessage won't see our response
- anyway.
- */
- XSync (si->dpy, False);
- error_handler_hit_p = False;
- old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+ force_lock_p = False; /* Single shot */
+ }
+ else if (force_blank_p ||
+ now >= active_at + blank_timeout)
+ {
+ fprintf (stderr, "%s: blanking\n", blurb());
+ if (grab_keyboard_and_mouse (mouse_screen (dpy)))
+ {
+ current_state = BLANKED;
+ blanked_at = now;
+ store_saver_status (dpy, True, False, now);
+ }
+ else
+ fprintf (stderr, "%s: unable to grab -- blanking aborted!\n",
+ blurb());
+ }
- XChangeProperty (si->dpy, w, XA_SCREENSAVER_RESPONSE, XA_STRING, 8,
- PropModeReplace, (unsigned char *) proto, L);
+ if (current_state == BLANKED || current_state == LOCKED)
+ {
+ /* Grab succeeded and state changed: launch graphics. */
+ if (! saver_gfx_pid)
+ {
+ static Bool first_time_p = True;
+ char *av[20];
+ int ac = 0;
+ av[ac++] = SAVER_GFX_PROGRAM;
+ if (first_time_p) av[ac++] = "--init";
+ if (verbose_p) av[ac++] = "--verbose";
+ if (debug_p) av[ac++] = "--debug";
+
+ if (blank_mode == XA_NEXT)
+ av[ac++] = "--next";
+ else if (blank_mode == XA_PREV)
+ av[ac++] = "--prev";
+ else if (blank_mode == XA_SELECT)
+ av[ac++] = "--select";
+ else if (blank_mode == XA_DEMO)
+ av[ac++] = "--demo";
+ else if (blank_mode == XA_SUSPEND)
+ av[ac++] = "--emergency";
+
+ if (blank_mode == XA_SELECT || blank_mode == XA_DEMO)
+ av[ac++] = blank_mode_arg;
+
+ av[ac] = 0;
+ gfx_stopped_p = False;
+ saver_gfx_pid = fork_and_exec (dpy, ac, av);
+ respawn_thrashing_count = 0;
+ first_time_p = False;
+ }
+ }
+ break;
- XSync (si->dpy, False);
- XSetErrorHandler (old_handler);
- XSync (si->dpy, False);
+ case BLANKED:
+ if (!locking_disabled_p &&
+ (force_lock_p ||
+ (lock_p &&
+ now >= blanked_at + lock_timeout)))
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: locking%s\n", blurb(),
+ (force_lock_p ? "" : " after timeout"));
+ current_state = LOCKED;
+ authenticated_p = False;
+ store_saver_status (dpy, True, True, now);
+ force_lock_p = False; /* Single shot */
+ }
+ else if (active_at >= now &&
+ active_at >= ignore_activity_before)
+ {
+ UNBLANK:
+ if (verbose_p)
+ fprintf (stderr, "%s: unblanking\n", blurb());
+ current_state = UNBLANKED;
+ ignore_motion_p = False;
+ store_saver_status (dpy, False, False, now);
+
+ if (saver_gfx_pid)
+ {
+ if (verbose_p)
+ fprintf (stderr,
+ "%s: pid %lu: killing " SAVER_GFX_PROGRAM "\n",
+ blurb(), (unsigned long) saver_gfx_pid);
+ kill (saver_gfx_pid, SIGTERM);
+ respawn_thrashing_count = 0;
+
+ if (gfx_stopped_p) /* SIGCONT to allow SIGTERM to proceed */
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: pid %lu: sending "
+ SAVER_GFX_PROGRAM " SIGCONT\n",
+ blurb(), (unsigned long) saver_gfx_pid);
+ gfx_stopped_p = False;
+ kill (-saver_gfx_pid, SIGCONT); /* send to process group */
+ }
+ }
- free (proto);
-}
+ ungrab_keyboard_and_mouse (dpy);
+ }
+ break;
+
+ case LOCKED:
+ if (active_at >= now &&
+ active_at >= ignore_activity_before)
+ {
+ char *av[10];
+ int ac = 0;
+ if (saver_gfx_pid)
+ {
+ /* To suspend or not suspend? If we don't suspend, then a
+ misbehaving or heavily-loaded screenhack might make it more
+ difficult to type in the password. Though that seems pretty
+ unlikely.
+
+ But if we do suspend, then attaching a new monitor while
+ the unlock dialog is up will cause a new desktop to be
+ visible, since "xscreensaver-gfx" is the process that
+ handles RANDR. You can't interact with that new desktop,
+ but you can see it, possibly including (depending on the
+ window manager) the names of file icons on the desktop, or
+ other things. */
+# if 0
+ if (verbose_p)
+ fprintf (stderr, "%s: pid %lu: sending " SAVER_GFX_PROGRAM
+ " SIGSTOP\n", blurb(),
+ (unsigned long) saver_gfx_pid);
+ gfx_stopped_p = True;
+ kill (-saver_gfx_pid, SIGSTOP); /* send to process group */
+# endif
+ }
-static void
-bogus_clientmessage_warning (saver_info *si, XEvent *event)
-{
-#if 0 /* Oh, fuck it. GNOME likes to spew random ClientMessages at us
- all the time. This is presumably indicative of an error in
- the sender of that ClientMessage: if we're getting it and
- ignoring it, then it's not reaching the intended recipient.
- But people complain to me about this all the time ("waaah!
- xscreensaver is printing to it's stderr and that gets my
- panties all in a bunch!") And I'm sick of hearing about it.
- So we'll just ignore these messages and let GNOME go right
- ahead and continue to stumble along in its malfunction.
- */
-
- saver_preferences *p = &si->prefs;
- char *str = XGetAtomName_safe (si->dpy, event->xclient.message_type);
- Window w = event->xclient.window;
- char wdesc[255];
- int screen = 0;
- Bool root_p = False;
-
- *wdesc = 0;
- for (screen = 0; screen < si->nscreens; screen++)
- if (w == si->screens[screen].screensaver_window)
- {
- strcpy (wdesc, "xscreensaver");
+ if (verbose_p)
+ fprintf (stderr, "%s: authorizing\n", blurb());
+ current_state = AUTH;
+
+ /* We already hold the mouse grab, but try to re-grab it with
+ a different mouse pointer, so that the pointer shows up while
+ the auth dialog is raised. We can ignore failures here. */
+ grab_mouse (mouse_screen (dpy), auth_cursor);
+
+ av[ac++] = SAVER_AUTH_PROGRAM;
+ if (verbose_p) av[ac++] = "--verbose";
+ if (verbose_p > 1) av[ac++] = "--verbose";
+ if (verbose_p > 2) av[ac++] = "--verbose";
+ if (debug_p) av[ac++] = "--debug";
+ av[ac] = 0;
+ saver_auth_pid = fork_and_exec (dpy, ac, av);
+ }
break;
- }
- else if (w == RootWindow (si->dpy, screen))
- {
- strcpy (wdesc, "root");
- root_p = True;
+
+ case AUTH:
+ if (saver_auth_pid)
+ {
+ /* xscreensaver-auth still running -- wait for it to exit. */
+ }
+ else if (authenticated_p)
+ {
+ /* xscreensaver-auth exited with "success" status */
+ if (verbose_p)
+ fprintf (stderr, "%s: unlocking\n", blurb());
+ authenticated_p = False;
+ goto UNBLANK;
+ }
+ else
+ {
+ /* xscreensaver-auth exited with non-success, or with signal. */
+ if (verbose_p)
+ fprintf (stderr, "%s: authorization failed\n", blurb());
+ current_state = LOCKED;
+ authenticated_p = False;
+
+ /* We already hold the mouse grab, but try to re-grab it with
+ a different mouse pointer, to hide the pointer again now that
+ the auth dialog is gone. We can ignore failures here. */
+ grab_mouse (mouse_screen (dpy), blank_cursor);
+
+ /* When the unlock dialog is dismissed, ignore any input for a
+ second to give the user time to take their hands off of the
+ keyboard and mouse, so that it doesn't pop up again
+ immediately. */
+ ignore_activity_before = now + 1;
+
+ if (gfx_stopped_p) /* SIGCONT to resume savers */
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: pid %lu: sending " SAVER_GFX_PROGRAM
+ " SIGCONT\n",
+ blurb(), (unsigned long) saver_gfx_pid);
+ gfx_stopped_p = False;
+ kill (-saver_gfx_pid, SIGCONT); /* send to process group */
+ }
+ }
+ break;
+
+ default:
+ /* abort(); */
break;
}
+ }
+}
- /* If this ClientMessage was sent to the real root window instead of to the
- xscreensaver window, then it might be intended for someone else who is
- listening on the root window (e.g., the window manager). So only print
- the warning if: we are in debug mode; or if the bogus message was
- actually sent to one of the xscreensaver-created windows.
+
+/* There is no good reason for this executable to be setuid, but in case
+ it is, turn that off.
+ */
+static const char *
+disavow_privileges (void)
+{
+ static char msg[255];
+ uid_t euid = geteuid();
+ gid_t egid = getegid();
+ uid_t uid = getuid();
+ gid_t gid = getgid();
+
+ if (uid == euid && gid == egid)
+ return 0;
+
+ /* Without setgroups(), the process will retain any supplementary groups
+ associated with the uid, e.g. the default groups of the "root" user.
+ But setgroups() can only be called by root, and returns EPERM for other
+ users even if the call would be a no-op. So ignore its error status.
*/
- if (root_p && !p->debug_p)
- return;
+ setgroups (1, &gid);
- if (!*wdesc)
+ if (gid != egid && setgid (gid) != 0)
{
- XErrorHandler old_handler;
- XClassHint hint;
- XWindowAttributes xgwa;
- memset (&hint, 0, sizeof(hint));
- memset (&xgwa, 0, sizeof(xgwa));
-
- XSync (si->dpy, False);
- old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
- XGetClassHint (si->dpy, w, &hint);
- XGetWindowAttributes (si->dpy, w, &xgwa);
- XSync (si->dpy, False);
- XSetErrorHandler (old_handler);
- XSync (si->dpy, False);
-
- screen = (xgwa.screen ? screen_number (xgwa.screen) : -1);
-
- sprintf (wdesc, "%.20s / %.20s",
- (hint.res_name ? hint.res_name : "(null)"),
- (hint.res_class ? hint.res_class : "(null)"));
- if (hint.res_name) XFree (hint.res_name);
- if (hint.res_class) XFree (hint.res_class);
+ fprintf (stderr, "%s: setgid %d -> %d failed\n", blurb(), egid, gid);
+ exit (1);
}
- fprintf (stderr, "%s: %d: unrecognised ClientMessage \"%s\" received\n",
- blurb(), screen, (str ? str : "(null)"));
- fprintf (stderr, "%s: %d: for window 0x%lx (%s)\n",
- blurb(), screen, (unsigned long) w, wdesc);
- if (str) XFree (str);
+ if (uid != euid && setgid (gid) != 0)
+ {
+ fprintf (stderr, "%s: setuid %d -> %d failed\n", blurb(), euid, uid);
+ exit (1);
+ }
-#endif /* 0 */
+ /* Return the message since this is before verbose_p is set or log opened. */
+ sprintf (msg, "setuid %d:%d -> %d:%d", euid, egid, uid, gid);
+ return msg;
}
-Bool
-handle_clientmessage (saver_info *si, XEvent *event, Bool until_idle_p)
+int
+main (int argc, char **argv)
{
- saver_preferences *p = &si->prefs;
- Atom type = 0;
- Window window = event->xclient.window;
+ Display *dpy = 0;
+ char *dpy_str = getenv ("DISPLAY");
+ char *logfile = 0;
+ Bool sync_p = False;
+ Bool cmdline_verbose_val = False, cmdline_verbose_p = False;
+ Bool cmdline_splash_val = False, cmdline_splash_p = False;
+ const char *s;
+ const char *pmsg;
+ int i;
- /* Preferences might affect our handling of client messages. */
- maybe_reload_init_file (si);
+ progname = argv[0];
+ s = strrchr (progname, '/');
+ if (s) progname = s+1;
- if (event->xclient.message_type != XA_SCREENSAVER ||
- event->xclient.format != 32)
- {
- bogus_clientmessage_warning (si, event);
- return False;
- }
+ pmsg = disavow_privileges();
- type = event->xclient.data.l[0];
- if (type == XA_ACTIVATE)
- {
- if (until_idle_p)
- {
- if (p->mode == DONT_BLANK)
- {
- clientmessage_response(si, window, True,
- "ACTIVATE ClientMessage received in DONT_BLANK mode.",
- "screen blanking is currently disabled.");
- return False;
- }
+ fclose (stdin);
+ fix_fds();
- clientmessage_response(si, window, False,
- "ACTIVATE ClientMessage received.",
- "activating.");
- si->selection_mode = 0;
- si->demoing_p = False;
-
- if (si->throttled_p && p->verbose_p)
- fprintf (stderr, "%s: unthrottled.\n", blurb());
- si->throttled_p = False;
-
- if (si->using_mit_saver_extension || si->using_sgi_saver_extension)
- {
- XForceScreenSaver (si->dpy, ScreenSaverActive);
- return False;
- }
- else
- {
- return True;
- }
- }
- clientmessage_response(si, window, True,
- "ClientMessage ACTIVATE received while already active.",
- "already active.");
- }
- else if (type == XA_DEACTIVATE)
+ for (i = 1; i < argc; i++)
{
+ const char *oa = argv[i];
+ /* XScreenSaver predates the "--arg" convention. */
+ if (argv[i][0] == '-' && argv[i][1] == '-')
+ argv[i]++;
- /* Regardless of whether the screen saver is active, a DEACTIVATE
- message should cause the monitor to become powered on. */
- monitor_power_on (si, True);
-
-# if 0
- /* When -deactivate is received while locked, pop up the dialog box
- instead of just ignoring it. Some people depend on this behavior
- to be able to unlock by using e.g. a fingerprint reader without
- also having to click the mouse first.
- */
- if (si->locked_p)
+ if (!strcmp (argv[i], "-debug"))
+ debug_p = True;
+ else if (!strcmp (argv[i], "-v") || !strcmp (argv[i], "-verbose"))
{
- clientmessage_response(si, window, False,
- "DEACTIVATE ClientMessage received while locked: ignored.",
- "screen is locked.");
+ verbose_p++;
+ cmdline_verbose_p = True, cmdline_verbose_val = verbose_p;
}
- else
-# endif /* 0 */
+ else if (!strcmp (argv[i], "-vv"))
{
- if (! until_idle_p)
- {
- if (si->throttled_p && p->verbose_p)
- fprintf (stderr, "%s: unthrottled.\n", blurb());
- si->throttled_p = False;
-
- clientmessage_response(si, window, False,
- "DEACTIVATE ClientMessage received.",
- "deactivating.");
- if (si->using_mit_saver_extension ||
- si->using_sgi_saver_extension)
- {
- XForceScreenSaver (si->dpy, ScreenSaverReset);
- return False;
- }
- else
- {
- return True;
- }
- }
- clientmessage_response(si, window, False,
- "ClientMessage DEACTIVATE received while inactive: "
- "resetting idle timer.",
- "not active: idle timer reset.");
- reset_timers (si);
+ verbose_p += 2;
+ cmdline_verbose_p = True, cmdline_verbose_val = verbose_p;
}
- }
- else if (type == XA_SUSPEND)
- {
- clientmessage_response(si, window, False,
- "SUSPEND ClientMessage received.",
- "suspending.");
- si->selection_mode = 0;
- si->demoing_p = False;
- si->throttled_p = True;
-
- /* When suspending, immediately lock, if locking enabled. */
-# ifndef NO_LOCKING
- if (p->lock_p && !si->locked_p && !si->locking_disabled_p)
+ else if (!strcmp (argv[i], "-vvv"))
{
- si->emergency_lock_p = True;
- if (p->verbose_p)
- fprintf (stderr, "%s: locking.\n", blurb());
- set_locked_p (si, True);
+ verbose_p += 3;
+ cmdline_verbose_p = True, cmdline_verbose_val = verbose_p;
}
-# endif
-
- /* When suspending, immediately power off the display. */
- monitor_power_on (si, False);
-
- if (until_idle_p)
- return True; /* Blank now */
- else
- return False; /* Do not unblank now */
- }
- else if (type == XA_CYCLE)
- {
- if (! until_idle_p)
- {
- clientmessage_response(si, window, False,
- "CYCLE ClientMessage received.",
- "cycling.");
- si->selection_mode = 0; /* 0 means randomize when its time. */
- si->demoing_p = False;
-
- if (si->throttled_p && p->verbose_p)
- fprintf (stderr, "%s: unthrottled.\n", blurb());
- si->throttled_p = False;
-
- if (si->cycle_id)
- XtRemoveTimeOut (si->cycle_id);
- si->cycle_id = 0;
- cycle_timer ((XtPointer) si, 0);
- return False;
- }
- clientmessage_response(si, window, True,
- "ClientMessage CYCLE received while inactive.",
- "not active.");
- }
- else if (type == XA_NEXT || type == XA_PREV)
- {
- clientmessage_response(si, window, False,
- (type == XA_NEXT
- ? "NEXT ClientMessage received."
- : "PREV ClientMessage received."),
- "cycling.");
- si->selection_mode = (type == XA_NEXT ? -1 : -2);
- si->demoing_p = False;
-
- if (si->throttled_p && p->verbose_p)
- fprintf (stderr, "%s: unthrottled.\n", blurb());
- si->throttled_p = False;
-
- if (! until_idle_p)
- {
- if (si->cycle_id)
- XtRemoveTimeOut (si->cycle_id);
- si->cycle_id = 0;
- cycle_timer ((XtPointer) si, 0);
- }
- else
- return True;
- }
- else if (type == XA_SELECT)
- {
- char buf [255];
- char buf2 [255];
- long which = event->xclient.data.l[1];
-
- if (p->mode == DONT_BLANK)
+ else if (!strcmp (argv[i], "-vvvv"))
{
- clientmessage_response(si, window, True,
- "SELECT ClientMessage received in DONT_BLANK mode.",
- "screen blanking is currently disabled.");
- return False;
+ verbose_p += 4;
+ cmdline_verbose_p = True, cmdline_verbose_val = verbose_p;
+ }
+ else if (!strcmp (argv[i], "-q") || !strcmp (argv[i], "-quiet"))
+ {
+ verbose_p = 0;
+ cmdline_verbose_p = True, cmdline_verbose_val = verbose_p;
+ }
+ else if (!strcmp (argv[i], "-splash"))
+ {
+ splash_p = True;
+ cmdline_splash_p = True, cmdline_splash_val = splash_p;
+ }
+ else if (!strcmp (argv[i], "-no-splash") ||
+ !strcmp (argv[i], "-nosplash"))
+ {
+ splash_p = False;
+ cmdline_splash_p = True, cmdline_splash_val = splash_p;
+ }
+ else if (!strcmp (argv[i], "-log"))
+ {
+ logfile = argv[++i];
+ if (!logfile) goto HELP;
+ }
+ else if (!strcmp (argv[i], "-d") ||
+ !strcmp (argv[i], "-dpy") ||
+ !strcmp (argv[i], "-disp") ||
+ !strcmp (argv[i], "-display"))
+ {
+ dpy_str = argv[++i];
+ if (!dpy_str) goto HELP;
+ }
+ else if (!strcmp (argv[i], "-sync") ||
+ !strcmp (argv[i], "-synch") ||
+ !strcmp (argv[i], "-synchronize") ||
+ !strcmp (argv[i], "-synchronise"))
+ sync_p = True;
+ else if (!strcmp (argv[i], "-h") || !strcmp (argv[i], "-help"))
+ {
+ HELP:
+ print_banner();
+ fprintf (stderr,
+ "\t\thttps://www.jwz.org/xscreensaver/\n"
+ "\n"
+ "\tOptions:\n\n"
+ "\t\t--dpy host:display.screen\n"
+ "\t\t--verbose\n"
+ "\t\t--no-splash\n"
+ "\t\t--log logfile\n"
+ "\n"
+ "\tRun 'xscreensaver-settings' to configure.\n"
+ "\n");
+ saver_exit (1);
}
-
- sprintf (buf, "SELECT %ld ClientMessage received.", which);
- sprintf (buf2, "activating (%ld).", which);
- clientmessage_response (si, window, False, buf, buf2);
-
- if (which < 0) which = 0; /* 0 == "random" */
- si->selection_mode = which;
- si->demoing_p = False;
-
- if (si->throttled_p && p->verbose_p)
- fprintf (stderr, "%s: unthrottled.\n", blurb());
- si->throttled_p = False;
-
- if (! until_idle_p)
- {
- if (si->cycle_id)
- XtRemoveTimeOut (si->cycle_id);
- si->cycle_id = 0;
- cycle_timer ((XtPointer) si, 0);
- }
- else
- return True;
- }
- else if (type == XA_EXIT)
- {
- /* Ignore EXIT message if the screen is locked. */
- if (until_idle_p || !si->locked_p)
- {
- clientmessage_response (si, window, False,
- "EXIT ClientMessage received.",
- "exiting.");
- if (! until_idle_p)
- {
- int i;
- for (i = 0; i < si->nscreens; i++)
- kill_screenhack (&si->screens[i]);
- unblank_screen (si);
- XSync (si->dpy, False);
- }
- saver_exit (si, 0, 0);
- }
- else
- clientmessage_response (si, window, True,
- "EXIT ClientMessage received while locked.",
- "screen is locked.");
- }
- else if (type == XA_RESTART)
- {
- /* The RESTART message works whether the screensaver is active or not,
- unless the screen is locked, in which case it doesn't work.
- */
- if (until_idle_p || !si->locked_p)
- {
- clientmessage_response (si, window, False,
- "RESTART ClientMessage received.",
- "restarting.");
- if (! until_idle_p)
- {
- int i;
- for (i = 0; i < si->nscreens; i++)
- kill_screenhack (&si->screens[i]);
- unblank_screen (si);
- XSync (si->dpy, False);
- }
-
- restart_process (si); /* does not return */
- abort();
- }
- else
- clientmessage_response (si, window, True,
- "RESTART ClientMessage received while locked.",
- "screen is locked.");
- }
- else if (type == XA_DEMO)
- {
- long arg = event->xclient.data.l[1];
- Bool demo_one_hack_p = (arg == 5000);
-
- if (demo_one_hack_p)
- {
- if (until_idle_p)
- {
- long which = event->xclient.data.l[2];
- char buf [255];
- char buf2 [255];
- sprintf (buf, "DEMO %ld ClientMessage received.", which);
- sprintf (buf2, "demoing (%ld).", which);
- clientmessage_response (si, window, False, buf, buf2);
-
- if (which < 0) which = 0; /* 0 == "random" */
- si->selection_mode = which;
- si->demoing_p = True;
-
- if (si->throttled_p && p->verbose_p)
- fprintf (stderr, "%s: unthrottled.\n", blurb());
- si->throttled_p = False;
-
- return True;
- }
-
- clientmessage_response (si, window, True,
- "DEMO ClientMessage received while active.",
- "already active.");
- }
- else
- {
- clientmessage_response (si, window, True,
- "obsolete form of DEMO ClientMessage.",
- "obsolete form of DEMO ClientMessage.");
- }
- }
- else if (type == XA_PREFS)
- {
- clientmessage_response (si, window, True,
- "the PREFS client-message is obsolete.",
- "the PREFS client-message is obsolete.");
- }
- else if (type == XA_LOCK)
- {
-#ifdef NO_LOCKING
- clientmessage_response (si, window, True,
- "not compiled with support for locking.",
- "locking not enabled.");
-#else /* !NO_LOCKING */
- if (si->locking_disabled_p)
- clientmessage_response (si, window, True,
- "LOCK ClientMessage received, but locking is disabled.",
- "locking not enabled.");
- else if (si->locked_p)
- clientmessage_response (si, window, True,
- "LOCK ClientMessage received while already locked.",
- "already locked.");
- else
- {
- char buf [255];
- char *response = (until_idle_p
- ? "activating and locking."
- : "locking.");
- sprintf (buf, "LOCK ClientMessage received; %s", response);
- clientmessage_response (si, window, False, buf, response);
-
- /* Have to set the time or xscreensaver-command doesn't report
- the LOCK state change. Must come before set_locked_p(). */
- si->blank_time = time ((time_t *) 0);
-
- /* Note that this leaves things in a slightly inconsistent state:
- we are blanked but not locked. And blanking might actually
- fail if we can't get the grab. */
- set_locked_p (si, True);
-
- si->selection_mode = 0;
- si->demoing_p = False;
-
- if (si->lock_id) /* we're doing it now, so lose the timeout */
- {
- XtRemoveTimeOut (si->lock_id);
- si->lock_id = 0;
- }
-
- if (until_idle_p)
- {
- if (si->using_mit_saver_extension ||
- si->using_sgi_saver_extension)
- {
- XForceScreenSaver (si->dpy, ScreenSaverActive);
- return False;
- }
- else
- {
- return True;
- }
- }
- }
-#endif /* !NO_LOCKING */
- }
- else if (type == XA_THROTTLE)
- {
- /* The THROTTLE command is deprecated -- it predates the XDPMS
- extension. Instead of using -throttle, users should instead
- just power off the monitor (e.g., "xset dpms force off".)
- In a few minutes, xscreensaver will notice that the monitor
- is off, and cease running hacks.
- */
- if (si->throttled_p)
- clientmessage_response (si, window, True,
- "THROTTLE ClientMessage received, but "
- "already throttled.",
- "already throttled.");
- else
- {
- char buf [255];
- char *response = "throttled.";
- si->throttled_p = True;
- si->selection_mode = 0;
- si->demoing_p = False;
- sprintf (buf, "THROTTLE ClientMessage received; %s", response);
- clientmessage_response (si, window, False, buf, response);
-
- if (! until_idle_p)
- {
- if (si->cycle_id)
- XtRemoveTimeOut (si->cycle_id);
- si->cycle_id = 0;
- cycle_timer ((XtPointer) si, 0);
- }
- }
- }
- else if (type == XA_UNTHROTTLE)
- {
- if (! si->throttled_p)
- clientmessage_response (si, window, True,
- "UNTHROTTLE ClientMessage received, but "
- "not throttled.",
- "not throttled.");
else
- {
- char buf [255];
- char *response = "unthrottled.";
- si->throttled_p = False;
- si->selection_mode = 0;
- si->demoing_p = False;
- sprintf (buf, "UNTHROTTLE ClientMessage received; %s", response);
- clientmessage_response (si, window, False, buf, response);
-
- if (! until_idle_p)
- {
- if (si->cycle_id)
- XtRemoveTimeOut (si->cycle_id);
- si->cycle_id = 0;
- cycle_timer ((XtPointer) si, 0);
- }
- }
+ {
+ fprintf (stderr, "\n%s: unknown option: %s\n\n", blurb(), oa);
+ goto HELP;
+ }
}
- else
+
+ if (logfile)
{
- char buf [1024];
- char *str;
- str = XGetAtomName_safe (si->dpy, type);
-
- if (str)
- {
- if (strlen (str) > 80)
- strcpy (str+70, "...");
- sprintf (buf, "unrecognised screensaver ClientMessage %s received.",
- str);
- free (str);
- }
- else
- {
- sprintf (buf,
- "unrecognised screensaver ClientMessage 0x%x received.",
- (unsigned int) event->xclient.data.l[0]);
- }
+ int stdout_fd = 1;
+ int stderr_fd = 2;
+ int fd = open (logfile, O_WRONLY | O_APPEND | O_CREAT, 0666);
+ if (fd < 0)
+ {
+ char buf[255];
+ FAIL:
+ sprintf (buf, "%.100s: %.100s", blurb(), logfile);
+ perror (buf);
+ fflush (stderr);
+ fflush (stdout);
+ saver_exit (1);
+ }
- clientmessage_response (si, window, True, buf, buf);
- }
- return False;
-}
+ fprintf (stderr, "%s: logging to file %s\n", blurb(), logfile);
-
-/* Some random diagnostics printed in -verbose mode.
- */
+ if (dup2 (fd, stdout_fd) < 0) goto FAIL;
+ if (dup2 (fd, stderr_fd) < 0) goto FAIL;
-static void
-analyze_display (saver_info *si)
-{
- int i, j;
- static struct {
- const char *name; const char *desc;
- Bool useful_p;
- Status (*version_fn) (Display *, int *majP, int *minP);
- } exts[] = {
-
- { "SCREEN_SAVER", /* underscore */ "SGI Screen-Saver",
-# ifdef HAVE_SGI_SAVER_EXTENSION
- True, 0
-# else
- False, 0
-# endif
- }, { "SCREEN-SAVER", /* dash */ "SGI Screen-Saver",
-# ifdef HAVE_SGI_SAVER_EXTENSION
- True, 0
-# else
- False, 0
-# endif
- }, { "MIT-SCREEN-SAVER", "MIT Screen-Saver",
-# ifdef HAVE_MIT_SAVER_EXTENSION
- True, XScreenSaverQueryVersion
-# else
- False, 0
-# endif
- }, { "XIDLE", "XIdle",
-# ifdef HAVE_XIDLE_EXTENSION
- True, 0
-# else
- False, 0
-# endif
- }, { "SGI-VIDEO-CONTROL", "SGI Video-Control",
-# ifdef HAVE_SGI_VC_EXTENSION
- True, XSGIvcQueryVersion
-# else
- False, 0
-# endif
- }, { "READDISPLAY", "SGI Read-Display",
-# ifdef HAVE_READ_DISPLAY_EXTENSION
- True, XReadDisplayQueryVersion
-# else
- False, 0
-# endif
- }, { "MIT-SHM", "Shared Memory",
-# ifdef HAVE_XSHM_EXTENSION
- True, (Status (*) (Display*,int*,int*)) XShmQueryVersion /* 4 args */
-# else
- False, 0
-# endif
- }, { "DOUBLE-BUFFER", "Double-Buffering",
-# ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- True, XdbeQueryExtension
-# else
- False, 0
-# endif
- }, { "DPMS", "Power Management",
-# ifdef HAVE_DPMS_EXTENSION
- True, DPMSGetVersion
-# else
- False, 0
-# endif
- }, { "GLX", "GLX",
-# ifdef HAVE_GL
- True, 0
-# else
- False, 0
-# endif
- }, { "XFree86-VidModeExtension", "XF86 Video-Mode",
-# ifdef HAVE_XF86VMODE
- True, XF86VidModeQueryVersion
-# else
- False, 0
-# endif
- }, { "XC-VidModeExtension", "XC Video-Mode",
-# ifdef HAVE_XF86VMODE
- True, XF86VidModeQueryVersion
-# else
- False, 0
-# endif
- }, { "XFree86-MISC", "XF86 Misc",
-# ifdef HAVE_XF86MISCSETGRABKEYSSTATE
- True, XF86MiscQueryVersion
-# else
- False, 0
-# endif
- }, { "XC-MISC", "XC Misc",
-# ifdef HAVE_XF86MISCSETGRABKEYSSTATE
- True, XF86MiscQueryVersion
-# else
- False, 0
-# endif
- }, { "XINERAMA", "Xinerama",
-# ifdef HAVE_XINERAMA
- True, XineramaQueryVersion
-# else
- False, 0
-# endif
- }, { "RANDR", "Resize-and-Rotate",
-# ifdef HAVE_RANDR
- True, XRRQueryVersion
-# else
- False, 0
-# endif
- }, { "DRI", "DRI",
- True, 0
- }, { "NV-CONTROL", "NVidia",
- True, 0
- }, { "NV-GLX", "NVidia GLX",
- True, 0
- }, { "Apple-DRI", "Apple-DRI (XDarwin)",
- True, 0
- }, { "XInputExtension", "XInput",
- True, 0
- },
- };
-
- fprintf (stderr, "%s: running on display \"%s\"\n", blurb(),
- DisplayString(si->dpy));
- fprintf (stderr, "%s: vendor is %s, %d.\n", blurb(),
- ServerVendor(si->dpy), VendorRelease(si->dpy));
-
- fprintf (stderr, "%s: useful extensions:\n", blurb());
- for (i = 0; i < countof(exts); i++)
- {
- int op = 0, event = 0, error = 0;
- char buf [255];
- int maj = 0, min = 0;
- int dummy1, dummy2, dummy3;
+ fprintf (stderr, "\n\n"
+ "#####################################"
+ "#####################################\n"
+ "%s: logging to \"%s\"\n"
+ "#####################################"
+ "#####################################\n"
+ "\n",
+ blurb(), logfile);
- /* Most of the extension version functions take 3 args,
- writing results into args 2 and 3, but some take more.
- We only ever care about the first two results, but we
- pass in three extra pointers just in case.
- */
- Status (*version_fn_2) (Display*,int*,int*,int*,int*,int*) =
- (Status (*) (Display*,int*,int*,int*,int*,int*)) exts[i].version_fn;
+ if (!verbose_p)
+ verbose_p = True;
+ cmdline_verbose_val = verbose_p;
+ }
- if (!XQueryExtension (si->dpy, exts[i].name, &op, &event, &error))
- continue;
- sprintf (buf, "%s: ", blurb());
- strcat (buf, exts[i].desc);
+ save_argv (argc, argv);
+ hack_environment();
+ print_banner();
+ read_init_files (True);
- if (!version_fn_2)
- ;
- else if (version_fn_2 (si->dpy, &maj, &min, &dummy1, &dummy2, &dummy3))
- sprintf (buf+strlen(buf), " (%d.%d)", maj, min);
- else
- strcat (buf, " (unavailable)");
+ /* Command line overrides init file */
+ if (cmdline_verbose_p) verbose_p = cmdline_verbose_val;
+ if (cmdline_splash_p) splash_p = cmdline_splash_val;
- if (!exts[i].useful_p)
- strcat (buf, " (disabled at compile time)");
- fprintf (stderr, "%s\n", buf);
- }
+ if (verbose_p)
+ fprintf (stderr, "%s: running in process %lu\n", blurb(),
+ (unsigned long) getpid());
-# ifdef HAVE_LIBSYSTEMD
- fprintf (stderr, "%s: libsystemd\n", blurb());
-# else
- fprintf (stderr, "%s: libsystemd (disabled at compile time)\n", blurb());
-# endif
+ if (verbose_p && pmsg)
+ fprintf (stderr, "%s: %s\n", blurb(), pmsg);
- for (i = 0; i < si->nscreens; i++)
+ if (! dpy_str)
{
- saver_screen_info *ssi = &si->screens[i];
- unsigned long colormapped_depths = 0;
- unsigned long non_mapped_depths = 0;
- XVisualInfo vi_in, *vi_out;
- int out_count;
-
- if (!ssi->real_screen_p) continue;
-
- vi_in.screen = ssi->real_screen_number;
- vi_out = XGetVisualInfo (si->dpy, VisualScreenMask, &vi_in, &out_count);
- if (!vi_out) continue;
- for (j = 0; j < out_count; j++) {
- if (vi_out[j].depth >= 32) continue;
- if (vi_out[j].class == PseudoColor)
- colormapped_depths |= (1 << vi_out[j].depth);
- else
- non_mapped_depths |= (1 << vi_out[j].depth);
- }
- XFree ((char *) vi_out);
-
- if (colormapped_depths)
- {
- fprintf (stderr, "%s: screen %d colormapped depths:", blurb(),
- ssi->real_screen_number);
- for (j = 0; j < 32; j++)
- if (colormapped_depths & (1 << j))
- fprintf (stderr, " %d", j);
- fprintf (stderr, ".\n");
- }
- if (non_mapped_depths)
- {
- fprintf (stderr, "%s: screen %d non-colormapped depths:",
- blurb(), ssi->real_screen_number);
- for (j = 0; j < 32; j++)
- if (non_mapped_depths & (1 << j))
- fprintf (stderr, " %d", j);
- fprintf (stderr, ".\n");
- }
+ dpy_str = ":0.0";
+ fprintf (stderr,
+ "%s: warning: $DISPLAY is not set: defaulting to \"%s\"\n",
+ blurb(), dpy_str);
}
- describe_monitor_layout (si);
-}
+ /* Copy the -dpy arg to $DISPLAY for subprocesses. */
+ {
+ char *s = (char *) malloc (strlen(dpy_str) + 20);
+ sprintf (s, "DISPLAY=%s", dpy_str);
+ putenv (s);
+ /* free (s); */ /* some versions of putenv do not copy */
+ }
+ dpy = XOpenDisplay (dpy_str);
+ if (!dpy) saver_exit (1);
-Bool
-display_is_on_console_p (saver_info *si)
-{
- Bool not_on_console = True;
- char *dpystr = DisplayString (si->dpy);
- char *tail = (char *) strchr (dpystr, ':');
- if (! tail || strncmp (tail, ":0", 2))
- not_on_console = True;
- else
+ if (sync_p)
{
- char dpyname[255], localname[255];
- strncpy (dpyname, dpystr, tail-dpystr);
- dpyname [tail-dpystr] = 0;
- if (!*dpyname ||
- !strcmp(dpyname, "unix") ||
- !strcmp(dpyname, "localhost"))
- not_on_console = False;
- else if (gethostname (localname, sizeof (localname)))
- not_on_console = True; /* can't find hostname? */
- else if (!strncmp (dpyname, "/tmp/launch-", 12)) /* MacOS X launchd */
- not_on_console = False;
- else
- {
- /* We have to call gethostbyname() on the result of gethostname()
- because the two aren't guarenteed to be the same name for the
- same host: on some losing systems, one is a FQDN and the other
- is not. Here in the wide wonderful world of Unix it's rocket
- science to obtain the local hostname in a portable fashion.
-
- And don't forget, gethostbyname() reuses the structure it
- returns, so we have to copy the fucker before calling it again.
- Thank you master, may I have another.
- */
- struct hostent *h = gethostbyname (dpyname);
- if (!h)
- not_on_console = True;
- else
- {
- char hn [255];
- struct hostent *l;
- strcpy (hn, h->h_name);
- l = gethostbyname (localname);
- not_on_console = (!l || !!(strcmp (l->h_name, hn)));
- }
- }
+ XSynchronize (dpy, True);
+ XSync (dpy, False);
}
- return !not_on_console;
-}
+ XSetErrorHandler (error_handler);
-/* Do a little bit of heap introspection...
- */
-void
-check_for_leaks (const char *where)
-{
-#if defined(HAVE_SBRK) && defined(LEAK_PARANOIA)
- static unsigned long last_brk = 0;
- int b = (unsigned long) sbrk(0);
- if (last_brk && last_brk < b)
- fprintf (stderr, "%s: %s: brk grew by %luK.\n",
- blurb(), where,
- (((b - last_brk) + 1023) / 1024));
- last_brk = b;
-#endif /* HAVE_SBRK */
+ main_loop (dpy);
+ saver_exit (0);
+ return (1);
}
diff --git a/driver/xscreensaver.h b/driver/xscreensaver.h
index fe84d20..4bd84b4 100644
--- a/driver/xscreensaver.h
+++ b/driver/xscreensaver.h
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1993-2019 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 1993-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -24,35 +24,22 @@
# include <signal.h> /* for sigset_t */
#endif
-#include "prefs.h"
+#include "blurb.h"
+#include "types.h"
-extern char *progname;
extern char *progclass;
#undef countof
#define countof(x) (sizeof((x))/sizeof((*x)))
-
-
/* =======================================================================
server extensions and virtual roots
======================================================================= */
-extern Bool restore_real_vroot (saver_info *si);
-extern void disable_builtin_screensaver (saver_info *, Bool unblank_screen_p);
extern Bool ensure_no_screensaver_running (Display *, Screen *);
-#ifdef HAVE_PROC_INTERRUPTS
-extern Bool query_proc_interrupts_available (saver_info *, const char **why);
-#endif
-
-#ifdef HAVE_XINPUT
-extern Bool query_xinput_extension (saver_info *);
-extern void init_xinput_extension (saver_info *si);
-#endif
-
/* Display Power Management System (DPMS) interface. */
-extern Bool monitor_powered_on_p (saver_info *si);
+extern Bool monitor_powered_on_p (Display *);
extern void monitor_power_on (saver_info *si, Bool on_p);
@@ -62,12 +49,8 @@ extern void monitor_power_on (saver_info *si, Bool on_p);
extern Bool update_screen_layout (saver_info *si);
extern void initialize_screensaver_window (saver_info *si);
-extern void initialize_screen_root_widget (saver_screen_info *ssi);
-extern void raise_window (saver_info *si,
- Bool inhibit_fade, Bool between_hacks_p,
- Bool dont_clear);
-extern Bool blank_screen (saver_info *si);
+extern void blank_screen (saver_info *si);
extern void unblank_screen (saver_info *si);
extern void resize_screensaver_window (saver_info *si);
@@ -79,74 +62,17 @@ extern void get_screen_viewport (saver_screen_info *ssi,
/* =======================================================================
- locking
- ======================================================================= */
-
-#ifndef NO_LOCKING
-extern Bool unlock_p (saver_info *si);
-extern Bool lock_priv_init (int argc, char **argv, Bool verbose_p);
-extern Bool lock_init (int argc, char **argv, Bool verbose_p);
-extern Bool passwd_valid_p (const char *typed_passwd, Bool verbose_p);
-#endif /* NO_LOCKING */
-
-extern void set_locked_p (saver_info *si, Bool locked_p);
-extern int move_mouse_grab (saver_info *si, Window to, Cursor cursor,
- int to_screen_no);
-extern int mouse_screen (saver_info *si);
-
-
-/* =======================================================================
- runtime privileges
- ======================================================================= */
-
-extern void hack_uid (saver_info *si);
-extern void describe_uids (saver_info *si, FILE *out);
-
-/* =======================================================================
- demoing
- ======================================================================= */
-
-extern void draw_shaded_rectangle (Display *dpy, Window window,
- int x, int y,
- int width, int height,
- int thickness,
- unsigned long top_color,
- unsigned long bottom_color);
-extern int string_width (XFontStruct *font, char *s);
-
-extern void make_splash_dialog (saver_info *si);
-extern void handle_splash_event (saver_info *si, XEvent *e);
-extern XFontStruct *splash_load_font (Display *, char *name, char *class);
-
-
-/* =======================================================================
timers
======================================================================= */
-extern void start_notice_events_timer (saver_info *, Window, Bool verbose_p);
extern void cycle_timer (XtPointer si, XtIntervalId *id);
-extern void activate_lock_timer (XtPointer si, XtIntervalId *id);
-extern void reset_watchdog_timer (saver_info *si, Bool on_p);
-extern void idle_timer (XtPointer si, XtIntervalId *id);
-extern void de_race_timer (XtPointer si, XtIntervalId *id);
-void flush_events (saver_info *si);
extern void sleep_until_idle (saver_info *si, Bool until_idle_p);
-extern void reset_timers (saver_info *si);
-extern void schedule_wakeup_event (saver_info *si, Time when, Bool verbose_p);
-
-
-/* =======================================================================
- remote control
- ======================================================================= */
-extern Bool handle_clientmessage (saver_info *, XEvent *, Bool);
-extern void maybe_reload_init_file (saver_info *);
/* =======================================================================
subprocs
======================================================================= */
-extern void handle_signals (saver_info *si);
#ifdef HAVE_SIGACTION
extern sigset_t block_sigchld (void);
#else /* !HAVE_SIGACTION */
@@ -154,62 +80,22 @@ extern void handle_signals (saver_info *si);
#endif /* !HAVE_SIGACTION */
extern void unblock_sigchld (void);
extern void hack_environment (saver_info *si);
-extern void hack_subproc_environment (Screen *, Window saver_window);
-extern void init_sigchld (void);
+extern void init_sigchld (saver_info *si);
extern void spawn_screenhack (saver_screen_info *ssi);
-extern pid_t fork_and_exec (saver_screen_info *ssi, const char *command);
-extern pid_t fork_and_exec_1 (saver_info *si, saver_screen_info *ssi,
- const char *command);
-extern int exec_and_wait (saver_info *si, const char *command);
extern void kill_screenhack (saver_screen_info *ssi);
-int kill_job (saver_info *si, pid_t pid, int signal);
-extern void suspend_screenhack (saver_screen_info *ssi, Bool suspend_p);
-extern Bool screenhack_running_p (saver_info *si);
-extern void emergency_kill_subproc (saver_info *si);
+extern Bool any_screenhacks_running_p (saver_info *si);
extern Bool select_visual (saver_screen_info *ssi, const char *visual_name);
extern void store_saver_status (saver_info *si);
extern const char *signal_name (int signal);
-
-/* =======================================================================
- subprocs diagnostics
- ======================================================================= */
-
-extern FILE *real_stderr;
-extern FILE *real_stdout;
-extern void stderr_log_file (saver_info *si);
-extern void initialize_stderr (saver_info *si);
-extern void reset_stderr (saver_screen_info *ssi);
-extern void clear_stderr (saver_screen_info *ssi);
-extern void shutdown_stderr (saver_info *si);
-
+extern void screenhack_obituary (saver_screen_info *,
+ const char *name, const char *error);
/* =======================================================================
misc
======================================================================= */
-extern const char *blurb (void);
-extern void save_argv (int argc, char **argv);
-extern void saver_exit (saver_info *si, int status, const char *core_reason);
-extern void restart_process (saver_info *si);
-
-extern int saver_ehandler (Display *dpy, XErrorEvent *error);
-extern int BadWindow_ehandler (Display *dpy, XErrorEvent *error);
-extern Bool window_exists_p (Display *dpy, Window window);
-extern Bool in_signal_handler_p;
-extern char *timestring (time_t);
-extern Bool display_is_on_console_p (saver_info *si);
extern Visual *get_best_gl_visual (saver_info *si, Screen *screen);
-extern void check_for_leaks (const char *where);
-extern void describe_monitor_layout (saver_info *si);
-
-#ifdef HAVE_XF86VMODE
-Bool safe_XF86VidModeGetViewPort (Display *, int, int *, int *);
-#endif /* HAVE_XF86VMODE */
-
-extern Atom XA_VROOT, XA_XSETROOT_ID, XA_ESETROOT_PMAP_ID, XA_XROOTPMAP_ID;
-extern Atom XA_NET_WM_USER_TIME;
-extern Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_ID;
-extern Atom XA_SCREENSAVER_STATUS, XA_LOCK, XA_BLANK;
-extern Atom XA_DEMO, XA_PREFS;
+extern void maybe_reload_init_file (saver_info *);
+void print_available_extensions (saver_info *);
#endif /* __XSCREENSAVER_H__ */
diff --git a/driver/xscreensaver.man b/driver/xscreensaver.man
index 0679ff4..9c3bdd0 100644
--- a/driver/xscreensaver.man
+++ b/driver/xscreensaver.man
@@ -1,208 +1,149 @@
-.de EX \"Begin example
-.ne 5
-.if n .sp 1
-.if t .sp .5
-.nf
-.in +.5i
-..
-.de EE
-.fi
-.in -.5i
-.if n .sp 1
-.if t .sp .5
-..
-.TH XScreenSaver 1 "6-Jun-2019 (5.43)" "X Version 11"
+.TH XScreenSaver 1 "6-Jan-2021 (6.00)" "X Version 11"
.SH NAME
xscreensaver - extensible screen saver and screen locking framework
.SH SYNOPSIS
.B xscreensaver
-[\-display \fIhost:display.screen\fP] \
-[\-verbose] \
-[\-no\-splash] \
-[\-no\-capture\-stderr] \
-[\-log \fIfilename\fP]
+[\-\-display \fIhost:display.screen\fP] \
+[\-\-verbose] \
+[\-\-no\-splash] \
+[\-\-log \fIfilename\fP]
.SH DESCRIPTION
-The \fIxscreensaver\fP program waits until the keyboard and mouse have been
-idle for a period, and then runs a graphics demo chosen at random. It
-turns off as soon as there is any mouse or keyboard activity.
-
-This program can lock your terminal in order to prevent others from using it,
-though its default mode of operation is merely to display pretty pictures on
-your screen when it is not in use.
+XScreenSaver waits until the user is idle, and then runs graphics demos chosen
+at random. It can also lock your screen, and provides configuration and
+control of display power management.
-It also provides configuration and control of your monitor's power-saving
-features.
+XScreenSaver is also available on macOS, iOS and Android.
.SH GETTING STARTED
-For the impatient, try this:
-.EX
-xscreensaver &
-xscreensaver-demo
-.EE
-The
-.BR xscreensaver-demo (1)
-program pops up a dialog box that lets you configure the screen saver,
-and experiment with the various display modes.
-
-.B Note that xscreensaver has a client-server model:
-the \fIxscreensaver\fP program is a daemon that runs in the background;
-it is controlled by the foreground
-.BR xscreensaver-demo (1)
-and
-.BR xscreensaver-command (1)
-programs.
-.SH CONFIGURATION
-The easiest way to configure \fIxscreensaver\fP is to simply run the
-.BR xscreensaver-demo (1)
-program, and change the settings through the GUI. The rest of this
-manual page describes lower level ways of changing settings.
-
-I'll repeat that because it's important:
+XScreenSaver is a daemon that runs in the background. You configure it
+with the
+.BR xscreensaver\-settings (1)
+program.
+.nf
+.sp
+ xscreensaver &
+ xscreensaver-settings
+.sp
+.fi
-.RS 4
-The easy way to configure xscreensaver is to run the
-.BR xscreensaver-demo (1)
-program. You shouldn't need to know any of the stuff described
-in \fIthis\fP manual unless you are trying to do something tricky,
-like customize xscreensaver for site-wide use or something.
-.RE
+.SH HOW IT WORKS
+When it is time to activate the screensaver, a full-screen black window is
+created that covers each monitor. A sub-process is launched for each one
+running a graphics demo, pointed at the appropriate window. Because of this,
+any program which can draw on a provided window can be used as a screensaver.
+The various graphics demos are, in fact, just standalone programs that do
+that.
-Options to \fIxscreensaver\fP are stored in one of two places: in
-a \fI.xscreensaver\fP file in your home directory; or in the X resource
-database. If the \fI.xscreensaver\fP file exists, it overrides any settings
-in the resource database.
+When the user becomes active again, the screensaver windows are unmapped, and
+the running subprocesses are killed.
-The syntax of the \fI.xscreensaver\fP file is similar to that of
-the \fI.Xdefaults\fP file; for example, to set the \fItimeout\fP parameter
-in the \fI.xscreensaver\fP file, you would write the following:
-.EX
-timeout: 5
-.EE
-whereas, in the \fI.Xdefaults\fP file, you would write
-.EX
-xscreensaver.timeout: 5
-.EE
-If you change a setting in the \fI.xscreensaver\fP file while xscreensaver
-is already running, it will notice this, and reload the file. (The file will
-be reloaded the next time the screen saver needs to take some action, such as
-blanking or unblanking the screen, or picking a new graphics mode.)
+The display modes are run at a low process priority, and spend most of their
+time sleeping/idle by default, so they should not consume significant system
+resources.
-If you change a setting in your X resource database, or if you want
-xscreensaver to notice your changes immediately instead of the next time
-it wakes up, then you will need to reload your \fI.Xdefaults\fP file,
-and then tell the running xscreensaver process to restart itself, like so:
-.EX
-xrdb < ~/.Xdefaults
-xscreensaver-command -restart
-.EE
-If you want to set the system-wide defaults, then make your edits to
-the xscreensaver app-defaults file, which should have been installed
-when xscreensaver itself was installed. The app-defaults file will
-usually be named /usr/lib/X11/app-defaults/XScreenSaver, but different
-systems might keep it in a different place (for example,
-/usr/openwin/lib/app-defaults/XScreenSaver on Solaris).
-
-When settings are changed in the Preferences dialog box (see above)
-the current settings will be written to the \fI.xscreensaver\fP file.
-(The \fI.Xdefaults\fP file and the app-defaults file will never be
-written by xscreensaver itself.)
.SH COMMAND-LINE OPTIONS
-.I xscreensaver
-also accepts a few command-line options, mostly for use when debugging:
-for normal operation, you should configure things via the \fI~/.xscreensaver\fP
-file.
.TP 8
-.B \-display \fIhost:display.screen\fP
+.B \-\-display \fIhost:display.screen\fP
The X display to use. For displays with multiple screens, XScreenSaver
-will manage all screens on the display simultaniously.
+will manage all screens on the display simultaneously.
.TP 8
-.B \-verbose
-Same as setting the \fIverbose\fP resource to \fItrue\fP: print diagnostics
-on stderr and on the xscreensaver window.
+.B \-\-verbose
+Print diagnostics to stderr.
.TP 8
-.B \-no-capture-stderr
-Do not redirect the stdout and stderr streams to the xscreensaver window
-itself. If xscreensaver is crashing, you might need to do this in order
-to see the error message.
+.B \-\-log \fIfilename\fP
+Append all diagnostic output to the given file. This also
+implies \fI\-\-verbose\fP. Use this when reporting bugs.
.TP 8
-.B \-log \fIfilename\fP
-This is exactly the same as redirecting stdout and stderr to the given
-file (for append). This is useful when reporting bugs.
-.SH HOW IT WORKS
-When it is time to activate the screensaver, a full-screen black window is
-created on each screen of the display. Each window is created in such a way
-that, to any subsequently-created programs, it will appear to be a "virtual
-root" window. Because of this, any program which draws on the root
-window (and which understands virtual roots) can be used as a screensaver.
-The various graphics demos are, in fact, just standalone programs that
-know how to draw on the provided window.
-
-When the user becomes active again, the screensaver windows are unmapped, and
-the running subprocesses are killed by sending them \fBSIGTERM\fP. This is
-also how the subprocesses are killed when the screensaver decides that it's
-time to run a different demo: the old one is killed and a new one is launched.
+.B \-\-no\-splash
+Don't display the splash screen at startup.
-You can control a running screensaver process by using the
-.BR xscreensaver\-command (1)
-program (which see).
.SH POWER MANAGEMENT
-Modern X servers contain support to power down the monitor after an idle
-period. If the monitor has powered down, then \fIxscreensaver\fP will
-notice this (after a few minutes), and will not waste CPU by drawing
-graphics demos on a black screen. An attempt will also be made to
-explicitly power the monitor back up as soon as user activity is detected.
-
-The \fI~/.xscreensaver\fP file controls the configuration of your
-display's power management settings: if you have used
-.BR xset (1)
-to change your power management settings, then xscreensaver will
-override those changes with the values specified
-in \fI~/.xscreensaver\fP (or with its built-in defaults, if there
-is no \fI~/.xscreensaver\fP file yet).
-
-To change your power management settings, run
-.BR xscreensaver\-demo (1)
-and change the various timeouts through the user interface.
-Alternatively, you can edit the \fI~/.xscreensaver\fP file directly.
+The
+.BR xscreensaver\-settings (1)
+program is where you configure if and when your monitor should power off.
+It saves the settings in your \fI~/.xscreensaver\fP file.
If the power management section is grayed out in the
-.BR xscreensaver\-demo (1)
+.BR xscreensaver\-settings (1)
window, then that means that your X server does not support
the XDPMS extension, and so control over the monitor's power state
is not available.
-If you're using a laptop, don't be surprised if changing the DPMS
-settings has no effect: many laptops have monitor power-saving behavior
-built in at a very low level that is invisible to Unix and X. On such
-systems, you can typically adjust the power-saving delays only by
-changing settings in the BIOS in some hardware-specific way.
+When the monitor is powered down, the display hacks are stopped
+(though it may take a minute or two for XScreenSaver to notice).
-If DPMS seems not to be working with XFree86, make sure the "DPMS"
-option is set in your \fI/etc/X11/XF86Config\fP file. See the
-.BR XF86Config (5)
-manual for details.
-.SH USING GNOME OR UNITY
-For the better part of a decade, GNOME shipped xscreensaver as-is,
-and everything just worked out of the box. In 2005, however, they
-decided to re-invent the wheel and ship their own replacement for
-the \fIxscreensaver\fP daemon called "\fIgnome-screensaver\fP",
-rather than improving xscreensaver and contributing their changes
-back. As a result, the "\fIgnome-screensaver\fP" program is insecure,
-bug-ridden, and missing many features of xscreensaver. You shouldn't
-use it.
-
-To replace gnome-screensaver with xscreensaver:
+Note: if you use
+.BR xset (1)
+to change the power management settings, XScreenSaver will override those
+changes. Whatever is in the \fI~/.xscreensaver\fP file takes precedence.
+
+.SH LAPTOP LIDS
+If your system has
+.BR systemd (1)
+221 or newer, or
+.BR elogind (8),
+then closing the lid of your laptop will cause the screen to lock immediately.
+
+If not, then the screen might not lock until a few seconds \fIafter\fP you
+re-open the lid. Which is less than ideal. So if you don't
+use \fIsystemd\fP, you might want to get in the habit of
+doing \fIxscreensaver-command --lock\fP before closing the lid.
+
+.SH PLAYING VIDEOS
+Likewise, if you have
+.BR systemd (1)
+221 or newer, or
+.BR elogind (8),
+then all of the popular video players and web browsers will
+prevent XScreenSaver from blanking the screen while video is playing.
+
+Both of these features require that
+.BR xscreensaver\-systemd (MANSUFFIX)
+be able connect to the systemd bus. Parts of KDE and GNOME may need to be
+disabled first for that to work; see below.
+
+.SH INSTALLATION
+Each desktop environment has its own system for launching long-running
+daemons like XScreenSaver, and since many of them come bundled with
+their own (buggy, insecure, inferior) screen-locking frameworks, it is
+also necessary to disable those other frameworks before XScreenSaver
+can work.
+
+.SS INSTALLING XSCREENSAVER ON GNOME OR UNITY
+For many years, GNOME shipped XScreenSaver as-is, and everything just worked.
+In 2005, however, they decided to needlessly re-invent the wheel and ship
+their own replacement for the \fIxscreensaver\fP daemon called
+.BR gnome-screensaver (1)
+rather than improving XScreenSaver and contributing their changes back. As a
+result, the \fIgnome-screensaver\fP program is insecure, bug-ridden, and
+missing many features of XScreenSaver. In fact, in 2011 it lost the ability
+to run display modes at all.
+
+In 2012 some distros forked and renamed it as both
+.BR mate-screensaver (1)
+and
+.BR cinnamon-screensaver (1),
+which seem to be basically the same.
+
+To replace gnome-screensaver with XScreenSaver:
.RS 4
.TP 3
-\fB1: Fully uninstall the gnome-screensaver package.\fP
-.EX
-sudo apt-get remove gnome-screensaver
-.EE
-or possibly
-.EX
-sudo dpkg -P gnome-screensaver
-.EE
+\fB1: Fully uninstall the other screen saver packages:\fP
+.nf
+.sp
+ sudo apt-get remove gnome-screensaver
+ sudo apt-get remove mate-screensaver
+ sudo apt-get remove cinnamon-screensaver
+or
+ sudo rpm -e gnome-screensaver
+ sudo rpm -e mate-screensaver
+ sudo rpm -e cinnamon-screensaver
+.sp
+.fi
+Be careful that it doesn't try to uninstall all of GNOME.
+
.TP 3
-\fB2: Launch xscreensaver at login.\fP
+\fB2: Launch XScreenSaver at login.\fP
+
Select "\fIStartup Applications\fP" from the menu (or manually
launch "\fIgnome-session-properties\fP") and add "\fIxscreensaver\fP".
@@ -210,27 +151,49 @@ Do this as your normal user account, not as root.
(This should go without saying, because you should never, ever, ever
be logged in to the graphical desktop as user "root".)
.TP 3
-\fB3: Make GNOME's "Lock Screen" use xscreensaver.\fP
-.EX
-sudo ln -sf /usr/bin/xscreensaver-command \\
+\fB3: Make GNOME's "Lock Screen" use XScreenSaver.\fP
+.nf
+.sp
+ sudo ln -sf /usr/bin/xscreensaver-command \\
/usr/bin/gnome-screensaver-command
-.EE
+.sp
+.fi
That doesn't work under Unity, though. Apparently it has its own
built-in screen locker which is not gnome-screensaver, and cannot be
removed, and yet still manages to be bug-addled and insecure.
Keep reinventing that wheel, guys! (If you have figured out how to
-replace Unity's locking "feature" with xscreensaver, let me know.)
+replace Unity's locking "feature" with XScreenSaver, let me know.)
+
.TP 3
\fB4: Turn off Unity's built-in blanking.\fP
+
Open "\fISystem Settings / Brightness & Lock\fP";
.br
Un-check "\fIStart Automatically\fP";
.br
Set \fI"Turn screen off when inactive for"\fP to \fI"Never".\fP
-.SH USING KDE
+.br
+Or possibly that has been randomly renamed again:
+.br
+Set "\fISettings / Power / Power Settings\fP" to \fI"Never".\fP
+.TP 3
+\fB5: Stop GNOME from blocking XScreenSaver's "systemd" integration:\fP
+.nf
+.sp
+ sudo systemctl \-\-user mask gsd\-screensaver\-proxy.service
+.sp
+.fi
+Without the above, video players will not be able to tell XScreenSaver
+not to blank the screen while videos are playing, and the screen will not
+auto-lock when you close your laptop's lid.
+
+After running that command, reboot. Yes, you have to reboot; it won't let
+you simply stop the service. Logging out won't do it either.
+
+.SS INSTALLING XSCREENSAVER ON KDE
Like GNOME, KDE also decided to invent their own screen saver framework
-from scratch instead of simply using xscreensaver. To replace the KDE
-screen saver with xscreensaver, do the following:
+from scratch instead of simply using XScreenSaver. To replace the KDE
+screen saver with XScreenSaver, do the following:
.RS 4
.TP 3
\fB1: Turn off KDE's screen saver.\fP
@@ -257,19 +220,21 @@ add "\fI/usr/bin/xscreensaver\fP".
If you are lucky, that will create a \fI"xscreensaver.desktop"\fP file
for you in \fI~/.config/autostart/\fP or \fI~/.kde/Autostart/\fP.
.TP 3
-\fB3: Make xscreensaver be an Autostart program.\fP
+\fB3: Make XScreenSaver be an Autostart program.\fP
If it does not already exist, create a file in your autostart directory
called \fIxscreensaver.desktop\fP that contains the following six lines:
-.EX
-[Desktop Entry]
-Exec=xscreensaver
-Name=XScreenSaver
-Type=Application
-StartupNotify=false
-X-KDE-StartupNotify=false
-.EE
+.nf
+.sp
+ [Desktop Entry]
+ Exec=xscreensaver
+ Name=XScreenSaver
+ Type=Application
+ StartupNotify=false
+ X-KDE-StartupNotify=false
+.sp
+.fi
.TP 3
-\fB4: Make the various "lock session" buttons call xscreensaver.\fP
+\fB4: Make the various "lock session" buttons call XScreenSaver.\fP
The file you want to replace next has moved around over the years. It
might be called \fI/usr/libexec/kde4/kscreenlocker\fP,
or it might be called "\fIkdesktop_lock\fP" or "\fIkrunner_lock\fP"
@@ -278,52 +243,96 @@ it might be in \fI/usr/lib/kde4/libexec/\fP
or in \fI/usr/kde/3.5/bin/\fP or even in \fI/usr/bin/\fP,
depending on the distro and phase of the moon. Replace the contents
of that file with these two lines:
-.EX
-#!/bin/sh
-xscreensaver-command -lock
-.EE
+.nf
+.sp
+ #!/bin/sh
+ xscreensaver-command \-\-lock
+.sp
+.fi
Make sure the file is executable (chmod a+x).
-.RE
-.PP
-Now use xscreensaver normally, controlling it via the usual
-.BR xscreensaver-demo (1)
-and
-.BR xscreensaver-command (1)
-mechanisms.
-.SH USING SYSTEMD
+.TP 3
+\fB5: Stop KDE from blocking XScreenSaver's "systemd" integration:\fP
+You must arrange for KDE's
+.BR ksmserver (1)
+daemon to be launched with the command line switch \fI\-\-no\-lockscreen\fP.
+
+One way to accomplish that is to edit the
+.BR startkde (1)
+script in \fI/usr/bin/\fP by hand, then log out and log back in. Another
+way would be to wrap the \fIksmserver\fP program:
+.nf
+.sp
+ mv /usr/bin/ksmserver /usr/bin/ksmserver-orig
+.sp
+.fi
+and replace \fI/usr/bin/ksmserver\fP with:
+.nf
+.sp
+ #!/bin/sh
+ ksmserver-orig \-\-no\-lockscreen
+.sp
+.fi
+Either change will, of course, get blown away the next time your system
+upgrades KDE.
+
+Instead of being in \fI/usr/bin/\fP, the \fIksmserver\fP program might be
+in \fI/usr/lib/\fP or \fIusr/lib*/libexec/\fP or \fIusr/lib/*/libexec/\fP
+or somewhere else, depending on your distro.
+
+But without this, video players will not be able to tell XScreenSaver not to
+blank the screen while videos are playing, and the screen will not auto-lock
+when you close your laptop's lid.
+
+It seems that KDE 5.17 replaced \fIstartkde\fP with \fIstartplasma-x11\fP,
+and I don't know how to change how \fIthat\fP launches \fIksmserver\fP.
+Let me know if you figure it out.
+
+.SS LAUNCHING XSCREENSAVER FROM SYSTEMD
If the above didn't do it, and your system has
.BR systemd (1),
-then give this a try:
+maybe this is how it works:
+.RS 4
.TP 3
\fB1: Create a service.\fP
Create the file \fI~/.config/systemd/user/xscreensaver.service\fP
containing:
-.EX
-[Unit]
-Description=XScreenSaver
-[Service]
-ExecStart=/usr/bin/xscreensaver
-[Install]
-WantedBy=default.target
-.EE
+.nf
+.sp
+ [Unit]
+ Description=XScreenSaver
+ [Service]
+ ExecStart=/usr/bin/xscreensaver
+ Restart=on-failure
+ [Install]
+ WantedBy=default.target
+.sp
+.fi
.TP 3
\fB2. Enable it.\fP
-.EX
-systemctl --user enable xscreensaver
-.EE
+.nf
+.sp
+ systemctl \-\-user enable xscreensaver
+.sp
+.fi
+.RE
Then restart X11.
-.SH USING UPSTART
-If it's still not working, but on your distro, that newfangled
-.BR systemd (1)
-nonsense has already fallen out of favor? Then maybe this will work:
-launch the \fI"Startup Applications"\fP applet, click \fI"Add"\fP,
-enter these lines, then restart X11:
-.EX
-Name: XScreenSaver
-Command: xscreensaver
-Comment: xscreensaver
-.EE
-.SH USING GDM
+
+.SS LAUNCHING XSCREENAVER FROM UPSTART
+If your system has
+.BR upstart (7)
+instead of
+.BR systemd (1),
+maybe this will work: launch the \fI"Startup Applications"\fP applet,
+click \fI"Add"\fP, enter these lines, then restart X11:
+.nf
+.sp
+ Name: XScreenSaver
+ Command: xscreensaver
+ Comment: XScreenSaver
+.sp
+.fi
+
+.SS LAUNCHING XSCREENSAVER FROM GDM
You can run \fIxscreensaver\fP from your
.BR gdm (1)
session, so that the screensaver will run even when nobody is logged
@@ -334,20 +343,22 @@ On the \fIGeneral\fP page set the \fILocal Greeter\fP to
\fIStandard Greeter\fP.
On the \fIBackground\fP page, type the
-command \fB"xscreensaver -nosplash"\fP into the \fIBackground Program\fP
-field. That will cause gdm to run xscreensaver while nobody is logged
+command \fB"xscreensaver \-\-nosplash"\fP into the \fIBackground Program\fP
+field. That will cause gdm to run XScreenSaver while nobody is logged
in, and kill it as soon as someone does log in. (The user will then
-be responsible for starting xscreensaver on their own, if they want.)
+be responsible for starting XScreenSaver on their own, if they want.)
If that doesn't work, you can edit the config file directly. Edit
\fI/etc/X11/gdm/gdm.conf\fP to include:
-.EX
-Greeter=/usr/bin/gdmlogin
-BackgroundProgram=xscreensaver -nosplash
-RunBackgroundProgramAlways=true
-.EE
+.nf
+.sp
+ Greeter=/usr/bin/gdmlogin
+ BackgroundProgram=xscreensaver \-\-nosplash
+ RunBackgroundProgramAlways=true
+.sp
+.fi
In this situation, the \fIxscreensaver\fP process will probably be running
-as user \fIgdm\fP instead of \fIroot\fP. You can configure the settings
+as user \fIgdm\fP instead of as \fIroot\fP. You can configure the settings
for this nobody-logged-in state (timeouts, DPMS, etc.) by editing
the \fI~gdm/.xscreensaver\fP file.
@@ -369,127 +380,26 @@ X server's access control mechanisms, see the man pages for
.BR xauth (1),
and
.BR xhost (1).
-.SH LAPTOP LIDS
-If you are running a system with
-.BR systemd (1)
-221 or newer, and if xscreensaver was compiled with \fIlibsystemd\fP
-support, then closing the lid of your laptop will cause the screen to
-lock immediately.
-If not, then the screen might not lock until a few seconds \fIafter\fP you
-re-open the lid. Which is less than ideal. So if you don't
-use \fIsystemd\fP, you might want to get in the habit of
-doing \fIxscreensaver-command -lock\fP before closing the lid.
-.SH BUGS
-Bugs? There are no bugs. Ok, well, maybe. If you find one, please let
-me know. https://www.jwz.org/xscreensaver/bugs.html explains how to
-construct the most useful bug reports.
-.PP
-.TP 4
-.B Locking and root logins
-In order for it to be safe for xscreensaver to be launched by \fIxdm\fP,
-certain precautions had to be taken, among them that xscreensaver never
-runs as \fIroot\fP. In particular, if it is launched as root (as \fIxdm\fP
-is likely to do), xscreensaver will disavow its privileges, and switch
-itself to a safe user id (such as \fInobody\fP).
+.SS LAPTOP LIDS WITHOUT SYSTEMD
+BSD systems or other systems without
+.BR systemd (1)
+or
+.BR elogind (8)
+might have luck by adding \fIxscreensaver\-command \-\-suspend\fP to
+some appropriate spot in \fI/etc/acpi/events/anything\fP or in
+\fI/etc/acpi/handler.sh\fP, if those files exist.
-An implication of this is that if you log in as \fIroot\fP on the console,
-xscreensaver will refuse to lock the screen (because it can't tell
-the difference between \fIroot\fP being logged in on the console, and a
-normal user being logged in on the console but xscreensaver having been
-launched by the
-.BR xdm (1)
-.I Xsetup
-file).
+.SH SECURITY CONCERNS
+XScreenSaver has a decades-long track record of securely locking your screen.
+However, there are many things that can go wrong. X11 is a very old system,
+and has a number of design flaws that make it susceptible to foot-shooting.
-The solution to this is simple: you shouldn't be logging in on the console
-as \fIroot\fP in the first place! (What, are you crazy or something?)
+.SS MAGIC BACKDOOR KEYSTROKES
+The XFree86 and Xorg X servers, as well as the Linux kernel, both trap
+certain magic keystrokes before X11 client programs ever see them.
+If you care about keeping your screen locked, this is a big problem.
-Proper Unix hygiene dictates that you should log in as yourself, and
-.BR su (1)
-to \fIroot\fP as necessary. People who spend their day logged in
-as \fIroot\fP are just begging for disaster.
-.TP 4
-.B XAUTH and XDM
-For xscreensaver to work when launched by
-.BR xdm (1)
-or
-.BR gdm (1),
-programs running on the local machine as user \fI"nobody"\fP must be
-able to connect to the X server. This means that if you want to run
-xscreensaver on the console while nobody is logged in, you may need
-to disable cookie-based access control (and allow all users who can log
-in to the local machine to connect to the display).
-
-You should be sure that this is an acceptable thing to do in your
-environment before doing it. See the "\fIUsing GDM\fP" section,
-above, for more details.
-.TP 4
-.B Passwords
-If you get an error message at startup like "couldn't get password
-of \fIuser\fP" then this probably means that you're on a system in which
-the
-.BR getpwent (3)
-library routine can only be effectively used by root. If this is the case,
-then \fIxscreensaver\fP must be installed as setuid to root in order for
-locking to work. Care has been taken to make this a safe thing to do.
-
-It also may mean that your system uses shadow passwords instead of the standard
-.BR getpwent (3)
-interface; in that case, you may need to change some options
-with \fIconfigure\fP and recompile.
-
-If you change your password after xscreensaver has been launched, it will
-continue using your old password to unlock the screen until xscreensaver
-is restarted. On some systems, it may accept \fIboth\fP your old and new
-passwords. So, after you change your password, you'll have to do
-.EX
-xscreensaver-command -restart
-.EE
-to make \fIxscreensaver\fP notice.
-.TP 4
-.B PAM Passwords
-If your system uses PAM (Pluggable Authentication Modules), then in order
-for xscreensaver to use PAM properly, PAM must be told about xscreensaver.
-The xscreensaver installation process should update the PAM data (on Linux,
-by creating the file \fI/etc/pam.d/xscreensaver\fP for you, and on Solaris,
-by telling you what lines to add to the \fI/etc/pam.conf\fP file).
-
-If the PAM configuration files do not know about xscreensaver, then
-you \fImight\fP be in a situation where xscreensaver will refuse to ever
-unlock the screen.
-
-This is a design flaw in PAM (there is no way for a client to tell the
-difference between PAM responding "I have never heard of your module",
-and responding, "you typed the wrong password"). As far as I can tell,
-there is no way for xscreensaver to automatically work around this, or
-detect the problem in advance, so if you have PAM, make sure it is
-configured correctly!
-.TP 4
-.B Machine Load
-Although this program "nices" the subprocesses that it starts,
-graphics-intensive subprograms can still overload the machine by causing
-the X server process itself (which is not "niced") to consume many
-cycles. Care has been taken in all the modules shipped with xscreensaver
-to sleep periodically, and not run full tilt, so as not to cause
-appreciable load.
-
-However, if you are running the OpenGL-based screen savers on a machine
-that does not have a video card with 3D acceleration, they \fIwill\fP
-make your machine slow, despite
-.BR nice (1).
-
-Your options are: don't use the OpenGL display modes; or, collect the
-spare change hidden under the cushions of your couch, and use it to
-buy a video card manufactured after 1998. (It doesn't even need to be
-\fIfast\fP 3D hardware: the problem will be fixed if there is any
-3D hardware \fIat all.\fP)
-.TP 4
-.B Magic Backdoor Keystrokes
-The XFree86 X server and the Linux kernel both trap certain magic
-keystrokes before X11 client programs ever see them. If you care
-about keeping your screen locked, this is a big problem.
-.RS 4
.TP 3
.B Ctrl+Alt+Backspace
This keystroke kills the X server, and on some systems, leaves you at
@@ -500,6 +410,7 @@ permanently, you need to set the \fBDontZap\fP flag in your
depending which is in use on your system. See
.BR XF86Config (5)
for details.
+
.TP 3
.B Ctrl-Alt-F1, Ctrl-Alt-F2, etc.
These keystrokes will switch to a different virtual console, while
@@ -512,48 +423,147 @@ since VT switching is an actual useful feature.
There is no way to disable VT switching only when the screen is
locked. It's all or nothing.
+
.TP 3
.B Ctrl-Alt-KP_Multiply
This keystroke kills any X11 app that holds a lock, so typing this
-will kill xscreensaver and unlock the screen. This so-called
-"feature" showed up in the X server in 2008, and as of 2011, some
-vendors are shipping it turned on by default. How nice. You can
-disable it by turning off
-\fBAllowClosedownGrabs\fP in \fIxorg.conf\fP.
+will kill XScreenSaver and unlock the screen. You can disable it by
+turning off \fBAllowClosedownGrabs\fP in \fIxorg.conf\fP.
+
.TP 3
.B Alt-SysRq-F
-This is the Linux kernel "OOM-killer" keystroke. It shoots down
-random long-running programs of its choosing, and so might might
-target and kill xscreensaver, and there's no way for xscreensaver to
-protect itself from that. You can disable it globally with:
-.EX
-echo 176 > /proc/sys/kernel/sysrq
-.EE
-.RE
+This is the Linux kernel "OOM-killer" keystroke. It shoots down random
+long-running programs of its choosing, and so might target and kill
+XScreenSaver. You can disable this keystroke globally with:
+.nf
+.sp
+ echo 176 > /proc/sys/kernel/sysrq
+.sp
+.fi
There's little that I can do to make the screen locker be secure so long
as the kernel and X11 developers are \fIactively\fP working against
security like this. The strength of the lock on your front door
doesn't matter much so long as someone else in the house insists on
leaving a key under the welcome mat.
-.TP 4
-.B Dangerous Backdoor Server Extensions
-Many distros enable by default several X11 server extensions that can
-be used to bypass grabs, and thus snoop on you while you're typing
-your password. These extensions are nominally for debugging and
-automation, but they are also security-circumventing keystroke
-loggers. If your server is configured to load the \fBRECORD, XTRAP\fP
-or \fBXTEST\fP extensions, you absolutely should disable those, 100%
-of the time. Look for them in \fIxorg.conf\fP or whatever it is
-called.
+.SS THE OOM-KILLER
+Even if you have disabled the \fBAlt-SysRq-F\fP OOM-killer keystroke, the
+OOM-killer might still decide to assassinate XScreenSaver at random, which
+will unlock your screen. If the
+.BR xscreensaver\-auth (MANSUFFIX)
+program is installed setuid, it attempts to tell the OOM-killer to leave
+the XScreenSaver daemon alone, but that may or may not work.
+
+You would think that the OOM-killer would pick the process using the most
+memory, but most of the time it seems to pick the process that would be most
+comically inconvenient, such as your screen locker, or
+.BR crond (8).
+You can disable the OOM-killer entirely with:
+.nf
+.sp
+ echo 2 > /proc/sys/vm/overcommit_memory
+ echo vm.overcommit_memory = 2 >> /etc/sysctl.conf
+.sp
+.fi
+
+.SS X SERVER ACCESS IS GAME OVER
+X11's security model is all-or-nothing. If a program can connect to your X
+server at all, either locally or over the network, it can log all of your
+keystrokes, simulate keystrokes, launch arbitrary programs, and change the
+settings of other programs. Assume that anything that can connect to your X
+server can execute arbitrary code as the logged-in user. See
+.BR Xsecurity (1)
+and
+.BR xauth (1).
+
+.SS PAM PASSWORDS
+If your system uses PAM (Pluggable Authentication Modules), then PAM must be
+configured for XScreenSaver. If it is not, then you \fImight\fP be in a
+situation where you can't unlock. Probably the file you need
+is \fI/etc/pam.d/xscreensaver\fP.
+
+.SS DON'T LOG IN AS ROOT
+In order for it to be safe for XScreenSaver to be launched by \fIxdm\fP,
+certain precautions had to be taken, among them that XScreenSaver never
+runs as \fIroot\fP. In particular, if it is launched as root (as \fIxdm\fP
+is likely to do), XScreenSaver will disavow its privileges, and switch
+itself to a safe user id (such as \fInobody\fP).
+
+An implication of this is that if you log in as \fIroot\fP on the console,
+XScreenSaver will refuse to lock the screen (because it can't tell
+the difference between \fIroot\fP being logged in on the console, and a
+normal user being logged in on the console but XScreenSaver having been
+launched by the
+.BR xdm (1)
+.I Xsetup
+file).
+
+Proper Unix hygiene dictates that you should log in as yourself, and
+.BR sudo (1)
+to \fIroot\fP as necessary. People who spend their day logged in
+as \fIroot\fP are just begging for disaster.
+
+.SH MULTI-USER OR SITE-WIDE CONFIGURATION
+For a single user, the proper way to configure XScreenSaver is to simply
+run the
+.BR xscreensaver\-settings (1)
+program, and change the settings through the GUI. The rest of this manual
+describes lower-level ways of changing settings. You shouldn't need to
+know any of the stuff described below unless you are trying to do something
+complicated.
+
+Options to XScreenSaver are stored in one of two places: in a file
+called \fI.xscreensaver\fP in your home directory; or in the X resource
+database. If the \fI.xscreensaver\fP file exists, it overrides any settings
+in the resource database.
+
+The syntax of the \fI.xscreensaver\fP file is similar to that of
+the \fI.Xdefaults\fP file; for example, to set the \fItimeout\fP parameter
+n the \fI.xscreensaver\fP file, you would write the following:
+.nf
+.sp
+ timeout: 5
+.sp
+.fi
+whereas, in the \fI.Xdefaults\fP file, you would write
+.nf
+.sp
+ xscreensaver.timeout: 5
+.sp
+.fi
+If you change a setting in the \fI.xscreensaver\fP file while XScreenSaver
+is already running, it will notice this, and reload the file as needed.
+
+If you change a setting in your X resource database, or if you want
+XScreenSaver to notice your changes immediately instead of the next time it
+wakes up, then you will need to reload your \fI.Xdefaults\fP file, and then
+tell the running \fIxscreensaver\fP process to restart itself, like so:
+.nf
+.sp
+ xrdb < ~/.Xdefaults
+ xscreensaver-command \-\-restart
+.sp
+.fi
+If you want to set the system-wide defaults, then make your edits to
+the XScreenSaver app-defaults file, which should have been installed
+when XScreenSaver itself was installed. The app-defaults file will
+usually be named /etc/X11/app-defaults/XScreenSaver, but different
+systems might keep it in a different place.
+
+When settings are changed in the Preferences dialog box, those settings are
+written to the \fI.xscreensaver\fP file. The \fI.Xdefaults\fP file and the
+app-defaults file will never be written by XScreenSaver itself.
+
.SH X RESOURCES
-These are the X resources use by the \fIxscreensaver\fP program.
-You probably won't need to change these manually (that's what the
-.BR xscreensaver\-demo (1)
-program is for).
+These are the X resources use by XScreenSaver program. You probably won't
+need to change these manually: that's what the
+.BR xscreensaver\-settings (1)
+program is for.
+
.TP 8
.B timeout\fP (class \fBTime\fP)
The screensaver will activate (blank the screen) after the keyboard and
mouse have been idle for this many minutes. Default 10 minutes.
+
.TP 8
.B cycle\fP (class \fBTime\fP)
After the screensaver has been running for this many minutes, the currently
@@ -562,46 +572,46 @@ new one started. If this is 0, then the graphics hack will never be changed:
only one demo will run until the screensaver is deactivated by user activity.
Default 10 minutes.
-The running saver will be restarted every \fIcycle\fP minutes even when
-\fImode\fP is \fIone\fP, since some savers tend to converge on a steady
-state.
+If there are multiple screens, the savers are staggered slightly so
+that while they all change every \fIcycle\fP minutes, they don't all
+change at the same time.
+
.TP 8
.B lock\fP (class \fBBoolean\fP)
Enable locking: before the screensaver will turn off, it will require you
-to type the password of the logged-in user (really, the person who ran
-xscreensaver), or the root password. (\fBNote:\fP this doesn't work if the
-screensaver is launched by
-.BR xdm (1)
-because it can't know the user-id of the logged-in user. See
-the "\fIUsing XDM(1)\fP" section, below.
+to type the password of the logged-in user.
+
.TP 8
.B lockTimeout\fP (class \fBTime\fP)
If locking is enabled, this controls the length of the "grace period"
between when the screensaver activates, and when the screen becomes locked.
-For example, if this is 5, and \fI\-timeout\fP is 10, then after 10 minutes,
+For example, if this is 5, and \fItimeout\fP is 10, then after 10 minutes,
the screen would blank. If there was user activity at 12 minutes, no password
would be required to un-blank the screen. But, if there was user activity
-at 15 minutes or later (that is, \fI\-lock\-timeout\fP minutes after
+at 15 minutes or later (that is, \fIlockTimeout\fP minutes after
activation) then a password would be required. The default is 0, meaning
that if locking is enabled, then a password will be required as soon as the
screen blanks.
+
.TP 8
.B passwdTimeout\fP (class \fBTime\fP)
If the screen is locked, then this is how many seconds the password dialog box
-should be left on the screen before giving up (default 30 seconds). This
-should not be too large: the X server is grabbed for the duration that the
-password dialog box is up (for security purposes) and leaving the server
-grabbed for too long can cause problems.
+should be left on the screen before giving up (default 30 seconds). A few
+seconds are added each time you type a character.
+
.TP 8
.B dpmsEnabled\fP (class \fBBoolean\fP)
Whether power management is enabled.
+
.TP 8
.B dpmsStandby\fP (class \fBTime\fP)
If power management is enabled, how long until the monitor goes solid black.
+
.TP 8
.B dpmsSuspend\fP (class \fBTime\fP)
If power management is enabled, how long until the monitor goes into
power-saving mode.
+
.TP 8
.B dpmsOff\fP (class \fBTime\fP)
If power management is enabled, how long until the monitor powers down
@@ -609,109 +619,42 @@ completely. Note that these settings will have no effect unless both
the X server and the display hardware support power management; not
all do. See the \fIPower Management\fP section, below, for more
information.
+
.TP 8
.B dpmsQuickOff\fP (class \fBBoolean\fP)
If \fImode\fP is \fIblank\fP and this is true, then the screen will be
powered down immediately upon blanking, regardless of other
power-management settings.
-.TP 8
-.B visualID\fP (class \fBVisualID\fP)
-This is an historical artifacts left over from when 8-bit
-displays were still common. You should probably ignore this.
-Specify which X visual to use by default. (Note carefully that this resource
-is called \fBvisualID\fP, not merely \fBvisual\fP; if you set the \fBvisual\fP
-resource instead, things will malfunction in obscure ways for obscure reasons.)
-
-Legal values for the \fBVisualID\fP resource are:
-.RS 8
-.TP 8
-.B default
-Use the screen's default visual (the visual of the root window).
-This is the default.
-.TP 8
-.B best
-Use the visual which supports the most colors. Note, however, that the
-visual with the most colors might be a TrueColor visual, which does not
-support colormap animation. Some programs have more interesting behavior
-when run on PseudoColor visuals than on TrueColor.
-.TP 8
-.B mono
-Use a monochrome visual, if there is one.
-.TP 8
-.B gray
-Use a grayscale or staticgray visual, if there is one and it has more than
-one plane (that is, it's not monochrome).
-.TP 8
-.B color
-Use the best of the color visuals, if there are any.
-.TP 8
-.B GL
-Use the visual that is best for OpenGL programs. (OpenGL programs have
-somewhat different requirements than other X programs.)
-.TP 8
-.I class
-where \fIclass\fP is one of \fBStaticGray\fP, \fBStaticColor\fP,
-\fBTrueColor\fP, \fBGrayScale\fP, \fBPseudoColor\fP, or \fBDirectColor\fP.
-Selects the deepest visual of the given class.
-.TP 8
-.I number
-where \fInumber\fP (decimal or hex) is interpreted as a visual id number,
-as reported by the
-.BR xdpyinfo (1)
-program; in this way you can have finer control over exactly which visual
-gets used, for example, to select a shallower one than would otherwise
-have been chosen.
-
-.RE
-.RS 8
-Note that this option specifies only the \fIdefault\fP visual that will
-be used: the visual used may be overridden on a program-by-program basis.
-See the description of the \fBprograms\fP resource, below.
-.RE
-.TP 8
-.B installColormap\fP (class \fBBoolean\fP)
-On PseudoColor (8-bit) displays, install a private colormap while the
-screensaver is active, so that the graphics hacks can get as many
-colors as possible. This is the default. (This only applies when the
-screen's default visual is being used, since non-default visuals get
-their own colormaps automatically.) This can also be overridden on a
-per-hack basis: see the discussion of the \fBdefault\-n\fP name in the
-section about the \fBprograms\fP resource.
-
-This does nothing if you have a TrueColor (16-bit or deeper) display.
-(Which, in this century, you do.)
.TP 8
.B verbose\fP (class \fBBoolean\fP)
Whether to print diagnostics. Default false.
-.TP 8
-.B timestamp\fP (class \fBBoolean\fP)
-Whether to print the time of day along with any other diagnostic messages.
-Default true.
+
.TP 8
.B splash\fP (class \fBBoolean\fP)
Whether to display a splash screen at startup. Default true.
+
.TP 8
.B splashDuration\fP (class \fBTime\fP)
How long the splash screen should remain visible; default 5 seconds.
+
.TP 8
.B helpURL\fP (class \fBURL\fP)
The splash screen has a \fIHelp\fP button on it. When you press it, it will
display the web page indicated here in your web browser.
+
.TP 8
.B loadURL\fP (class \fBLoadURL\fP)
This is the shell command used to load a URL into your web browser.
The default setting will load it into Mozilla/Netscape if it is already
running, otherwise, will launch a new browser looking at the \fIhelpURL\fP.
+
.TP 8
.B demoCommand\fP (class \fBDemoCommand\fP)
This is the shell command run when the \fIDemo\fP button on the splash window
is pressed. It defaults to
-.BR xscreensaver\-demo (1).
-.TP 8
-.B prefsCommand\fP (class \fBPrefsCommand\fP)
-This is the shell command run when the \fIPrefs\fP button on the splash window
-is pressed. It defaults to \fIxscreensaver\-demo\ \-prefs\fP.
+.BR xscreensaver\-settings (1).
+
.TP 8
.B newLoginCommand\fP (class \fBNewLoginCommand\fP)
If set, this is the shell command that is run when the "New Login" button
@@ -723,104 +666,92 @@ Typically this will be some variant of
.BR lxdm (1)
or
.BR dm-tool (1).
+
.TP 8
.B nice\fP (class \fBNice\fP)
-The sub-processes created by \fIxscreensaver\fP will be "niced" to this
-level, so that they are given lower priority than other processes on the
-system, and don't increase the load unnecessarily. The default is 10.
-(Higher numbers mean lower priority; see
+The sub-processes launched by XScreenSaver will be "niced" to this level, so
+that they are given lower priority than other processes on the system, and
+don't increase the load unnecessarily. The default is 10. (Higher numbers
+mean lower priority; see
.BR nice (1)
for details.)
+
.TP 8
.B fade\fP (class \fBBoolean\fP)
If this is true, then when the screensaver activates, the current contents
-of the screen will fade to black instead of simply winking out. This only
-works on certain systems. A fade will also be done when switching graphics
-hacks (when the \fIcycle\fP timer expires). Default: true.
+of the screen will fade to black instead of simply winking out.
+Default: true.
+
.TP 8
.B unfade\fP (class \fBBoolean\fP)
If this is true, then when the screensaver deactivates, the original contents
of the screen will fade in from black instead of appearing immediately. This
-only works on certain systems, and if \fIfade\fP is true as well.
-Default false.
+is only done if \fIfade\fP is true as well. Default: true.
+
.TP 8
.B fadeSeconds\fP (class \fBTime\fP)
If \fIfade\fP is true, this is how long the fade will be in
-seconds (default 3 seconds).
-.TP 8
-.B fadeTicks\fP (class \fBInteger\fP)
-If \fIfade\fP is true, this is how many times a second the colormap will
-be changed to effect a fade. Higher numbers yield smoother fades, but
-may make the fades take longer than the specified \fIfadeSeconds\fP if
-your server isn't fast enough to keep up. Default 20.
-.TP 8
-.B captureStderr\fP (class \fBBoolean\fP)
-Whether \fIxscreensaver\fP should redirect its stdout and stderr streams to
-the window itself. Since its nature is to take over the screen, you would not
-normally see error messages generated by xscreensaver or the sub-programs it
-runs; this resource will cause the output of all relevant programs to be
-drawn on the screensaver window itself, as well as being written to the
-controlling terminal of the screensaver driver process. Default true.
+seconds. Default 3 seconds.
+
.TP 8
.B ignoreUninstalledPrograms\fP (class \fBBoolean\fP)
There may be programs in the list that are not installed on the system,
yet are marked as "enabled". If this preference is true, then such
programs will simply be ignored. If false, then a warning will be printed
if an attempt is made to run the nonexistent program. Also, the
-.BR xscreensaver-demo (1)
+.BR xscreensaver\-settings (1)
program will suppress the non-existent programs from the list if this
is true. Default: false.
+
.TP 8
.B authWarningSlack\fP (class \fBInteger\fP)
-If \fIall\fP failed unlock attempts (incorrect password entered) were
-made within this period of time, the usual dialog that warns about such
-attempts after a successful login will be suppressed. The assumption
+After you successfully unlock the screen, a dialog may pop up informing
+you of previous failed login attempts. If all of those login attemps
+were within this amount of time, they are ignored. The assumption
is that incorrect passwords entered within a few seconds of a correct
one are user error, rather than hostile action. Default 20 seconds.
-.TP 8
-.B GetViewPortIsFullOfLies\fP (class \fBBoolean\fP)
-Set this to true if the xscreensaver window doesn't cover the whole screen.
-This works around a longstanding XFree86 bug #421. See the
-xscreensaver FAQ for details.
-.TP 8
-.B font\fP (class \fBFont\fP)
-The font used for the stdout/stderr text, if \fBcaptureStderr\fP is true.
-Default \fB*\-medium\-r\-*\-140\-*\-m\-*\fP (a 14 point fixed-width font).
+
.TP 8
.B mode\fP (class \fBMode\fP)
-Controls the behavior of xscreensaver. Legal values are:
+Controls the screen-saving behavior. Valid values are:
.RS 8
+
.TP 8
.B random
When blanking the screen, select a random display mode from among those
that are enabled and applicable. This is the default.
+
.TP 8
.B random-same
Like \fIrandom\fP, but if there are multiple screens, each screen
will run the \fIsame\fP random display mode, instead of each screen
running a different one.
+
.TP 8
.B one
When blanking the screen, only ever use one particular display mode (the
one indicated by the \fIselected\fP setting).
+
.TP 8
.B blank
When blanking the screen, just go black: don't run any graphics hacks.
+
.TP 8
.B off
Don't ever blank the screen, and don't ever allow the monitor to power down.
-
.RE
+
.TP 8
.B selected\fP (class \fBInteger\fP)
When \fImode\fP is set to \fIone\fP, this is the one, indicated by its
index in the \fIprograms\fP list. You're crazy if you count them and
set this number by hand: let
-.BR xscreensaver\-demo (1)
+.BR xscreensaver\-settings (1)
do it for you!
+
.TP 8
.B programs\fP (class \fBPrograms\fP)
-The graphics hacks which \fIxscreensaver\fP runs when the user is idle.
+The graphics hacks which XScreenSaver runs when the user is idle.
The value of this resource is a multi-line string, one \fIsh\fP-syntax
command per line. Each line must contain exactly one command: no
semicolons, no ampersands.
@@ -832,7 +763,7 @@ expires, it is killed, and another is selected and run.
If a line begins with a dash (-) then that particular program is
disabled: it won't be selected at random (though you can still select
it explicitly using the
-.BR xscreensaver\-demo (1)
+.BR xscreensaver\-settings (1)
program).
If all programs are disabled, then the screen will just be made blank,
@@ -850,32 +781,28 @@ for each screen. (All screens are blanked and unblanked simultaneously.)
Note that you must escape the newlines; here is an example of how you
might set this in your \fI~/.xscreensaver\fP file:
-
-.RS 8
-.EX
-programs: \\
- qix -root \\n\\
- ico -r -faces -sleep 1 -obj ico \\n\\
- xdaliclock -builtin2 -root \\n\\
- xv -root -rmode 5 image.gif -quit \\n
-.EE
-.RE
+.nf
+.sp
+ programs: \\
+ qix -root \\n\\
+ ico -r -faces -sleep 1 -obj ico \\n\\
+ xdaliclock -builtin2 -root \\n\\
+ xv -root -rmode 5 image.gif -quit \\n
+.sp
+.fi
.RS 8
Make sure your \fB$PATH\fP environment variable is set up correctly
-\fIbefore\fP xscreensaver is launched, or it won't be able to find the
+\fIbefore\fP XScreenSaver is launched, or it won't be able to find the
programs listed in the \fIprograms\fP resource.
-To use a program as a screensaver, two things are required: that that
-program draw on the root window (or be able to be configured to draw on
-the root window); and that that program understand "virtual root"
-windows, as used by virtual window managers such as
-.BR tvtwm (1).
-(Generally, this is accomplished by just including the \fI"vroot.h"\fP
-header file in the program's source.)
+To use a program as a screensaver, it must be able to render onto
+the window provided to it in the \fB$XSCREENSAVER_WINDOW\fP environment
+variable. If it creates and maps its own window instead, it won't work.
+It must render onto the provided window.
.B Visuals:
-Because xscreensaver was created back when dinosaurs roamed the earth,
+Because XScreenSaver was created back when dinosaurs roamed the earth,
it still contains support for some things you've probably never seen,
such as 1-bit monochrome monitors, grayscale monitors, and monitors
capable of displaying only 8-bit colormapped images.
@@ -883,22 +810,22 @@ capable of displaying only 8-bit colormapped images.
If there are some programs that you want to run only when using a color
display, and others that you want to run only when using a monochrome
display, you can specify that like this:
-.EX
- mono: mono-program -root \\n\\
- color: color-program -root \\n\\
-.EE
-.RE
-.RS 8
+.nf
+.sp
+ mono: mono-program -root \\n\\
+ color: color-program -root \\n\\
+.sp
+.fi
More generally, you can specify the kind of visual that should be used for
the window on which the program will be drawing. For example, if one
program works best if it has a colormap, but another works best if it has
a 24-bit visual, both can be accommodated:
-.EX
- PseudoColor: cmap-program -root \\n\\
- TrueColor: 24bit-program -root \\n\\
-.EE
-.RE
-.RS 8
+.nf
+.sp
+ PseudoColor: cmap-program -root \\n\\
+ TrueColor: 24bit-program -root \\n\\
+.sp
+.fi
In addition to the symbolic visual names described above (in the discussion
of the \fIvisualID\fP resource) one other visual name is supported in
the \fIprograms\fP list:
@@ -906,15 +833,7 @@ the \fIprograms\fP list:
.TP 4
.B default-n
This is like \fBdefault\fP, but also requests the use of the default colormap,
-instead of a private colormap. (That is, it behaves as if
-the \fI\-no\-install\fP command-line option was specified, but only for
-this particular hack.) This is provided because some third-party programs
-that draw on the root window (notably:
-.BR xv (1),
-and
-.BR xearth (1))
-make assumptions about the visual and colormap of the root window:
-assumptions which xscreensaver can violate.
+instead of a private colormap.
.RE
If you specify a particular visual for a program, and that visual does not
@@ -924,72 +843,88 @@ arrange for appropriate hacks to be run on each. For example, if one screen
is color and the other is monochrome, hacks that look good in mono can be
run on one, and hacks that only look good in color will show up on the other.
.RE
-.PP
-.PP
-You shouldn't ever need to change the following resources:
-.PP
+
.TP 8
-.B pointerPollTime\fP (class \fBTime\fP)
-When server extensions are not in use, this controls how
-frequently \fIxscreensaver\fP checks to see if the mouse position or buttons
-have changed. Default 5 seconds.
+.B visualID\fP (class \fBVisualID\fP)
+This is an historical artifact left over from when 8-bit
+displays were still common. You should probably ignore this.
+
+Specify which X visual to use by default. (Note carefully that this resource
+is called \fBvisualID\fP, not merely \fBvisual\fP; if you set the \fBvisual\fP
+resource instead, things will malfunction in obscure ways for obscure reasons.)
+
+Valid values for the \fBVisualID\fP resource are:
+.RS 8
.TP 8
-.B pointerHysteresis\fP (class \fBInteger\fP)
-If the mouse moves less than this-many pixels in a second, ignore it
-(do not consider that to be "activity"). This is so that the screen
-doesn't un-blank (or fail to blank) just because you bumped the desk.
-Default: 10 pixels.
+.B default
+Use the screen's default visual (the visual of the root window).
+This is the default.
+.TP 8
+.B best
+Use the visual which supports the most colors. Note, however, that the
+visual with the most colors might be a TrueColor visual, which does not
+support colormap animation. Some programs have more interesting behavior
+when run on PseudoColor visuals than on TrueColor.
+.TP 8
+.B mono
+Use a monochrome visual, if there is one.
.TP 8
-.B windowCreationTimeout\fP (class \fBTime\fP)
-When server extensions are not in use, this controls the delay between when
-windows are created and when \fIxscreensaver\fP selects events on them.
-Default 30 seconds.
+.B gray
+Use a grayscale or staticgray visual, if there is one and it has more than
+one plane (that is, it's not monochrome).
.TP 8
-.B initialDelay\fP (class \fBTime\fP)
-When server extensions are not in use, \fIxscreensaver\fP will wait this many
-seconds before selecting events on existing windows, under the assumption that
-\fIxscreensaver\fP is started during your login procedure, and the window
-state may be in flux. Default 0. (This used to default to 30, but that was
-back in the days when slow machines and X terminals were more common...)
+.B color
+Use the best of the color visuals, if there are any.
.TP 8
-.B procInterrupts\fP (class \fBBoolean\fP)
-This resource controls whether the \fB/proc/interrupts\fP file should be
-consulted to decide whether the user is idle. This is the default
-if \fIxscreensaver\fP has been compiled on a system which supports this
-mechanism (i.e., Linux systems).
-
-The benefit to doing this is that \fIxscreensaver\fP can note that the user
-is active even when the X console is not the active one: if the user is
-typing in another virtual console, xscreensaver will notice that and will
-fail to activate. For example, if you're playing Quake in VGA-mode,
-xscreensaver won't wake up in the middle of your game and start competing
-for CPU.
-
-The drawback to doing this is that perhaps you \fIreally do\fP want idleness
-on the X console to cause the X display to lock, even if there is activity
-on other virtual consoles. If you want that, then set this option to False.
-(Or just lock the X console manually.)
-
-The default value for this resource is True, on systems where it works.
+.B GL
+Use the visual that is best for OpenGL programs. (OpenGL programs have
+somewhat different requirements than other X programs.)
.TP 8
-.B overlayStderr\fP (class \fBBoolean\fP)
-If \fBcaptureStderr\fP is True, and your server supports "overlay" visuals,
-then the text will be written into one of the higher layers instead of into
-the same layer as the running screenhack. Set this to False to disable
-that (though you shouldn't need to).
+.I class
+where \fIclass\fP is one of \fBStaticGray\fP, \fBStaticColor\fP,
+\fBTrueColor\fP, \fBGrayScale\fP, \fBPseudoColor\fP, or \fBDirectColor\fP.
+Selects the deepest visual of the given class.
.TP 8
-.B overlayTextForeground\fP (class \fBForeground\fP)
-The foreground color used for the stdout/stderr text, if \fBcaptureStderr\fP
-is true. Default: Yellow.
+.I N
+where \fInumber\fP (decimal or hex) is interpreted as a visual id number,
+as reported by the
+.BR xdpyinfo (1)
+program; in this way you can have finer control over exactly which visual
+gets used, for example, to select a shallower one than would otherwise
+have been chosen.
+
+.RE
+.RS 8
+Note that this option specifies only the \fIdefault\fP visual that will
+be used: the visual used may be overridden on a program-by-program basis.
+See the description of the \fBprograms\fP resource, above.
+.RE
+
.TP 8
-.B overlayTextBackground\fP (class \fBBackground\fP)
-The background color used for the stdout/stderr text, if \fBcaptureStderr\fP
-is true. Default: Black.
+.B installColormap\fP (class \fBBoolean\fP)
+This is an historical artifact left over from when 8-bit displays were still
+common. On PseudoColor (8-bit) displays, install a private colormap while the
+screensaver is active, so that the graphics hacks can get as many colors as
+possible. This is the default. (This only applies when the screen's default
+visual is being used, since non-default visuals get their own colormaps
+automatically.) This can also be overridden on a per-hack basis: see the
+discussion of the \fBdefault\-n\fP name in the section about the
+\fBprograms\fP resource.
+
+This does nothing if you have a TrueColor (16-bit or deeper) display.
+(Which, in this century, you do.)
+
.TP 8
-.B bourneShell\fP (class \fBBourneShell\fP)
-The pathname of the shell that \fIxscreensaver\fP uses to start subprocesses.
-This must be whatever your local variant of \fB/bin/sh\fP is: in particular,
-it must not be \fBcsh\fP.
+.B pointerHysteresis\fP (class \fBInteger\fP)
+If the mouse moves less than this-many pixels in a second, ignore it
+(do not consider that to be "activity"). This is so that the screen
+doesn't un-blank (or fail to blank) just because you bumped the desk.
+Default: 10 pixels.
+
+.SH BUGS
+https://www.jwz.org/xscreensaver/bugs.html explains how to write the most
+useful bug reports. If you find a bug, please let me know!
+
.SH ENVIRONMENT
.PP
.TP 8
@@ -1003,7 +938,7 @@ should draw. This is necessary on Xinerama/RANDR systems where
multiple physical monitors share a single X11 "Screen".
.TP 8
.B PATH
-to find the sub-programs to run.
+to find the sub-programs to run, including the display modes.
.TP 8
.B HOME
for the directory in which to read the \fI.xscreensaver\fP file.
@@ -1012,7 +947,7 @@ for the directory in which to read the \fI.xscreensaver\fP file.
to get the name of a resource file that overrides the global resources
stored in the RESOURCE_MANAGER property.
.SH UPGRADES
-The latest version of xscreensaver, an online version of this manual,
+The latest version of XScreenSaver, an online version of this manual,
and a FAQ can always be found at https://www.jwz.org/xscreensaver/
.SH SEE ALSO
.BR X (1),
@@ -1021,13 +956,16 @@ and a FAQ can always be found at https://www.jwz.org/xscreensaver/
.BR xdm (1),
.BR gdm (1),
.BR xhost (1),
-.BR xscreensaver\-demo (1),
+.BR systemd (1),
+.BR elogind (8),
+.BR xscreensaver\-settings (1),
.BR xscreensaver\-command (1),
-.BR xscreensaver\-gl\-helper (1),
-.BR xscreensaver\-getimage (1),
-.BR xscreensaver\-text (1).
+.BR xscreensaver\-systemd (MANSUFFIX),
+.BR xscreensaver\-gl\-helper (MANSUFFIX),
+.BR xscreensaver\-getimage (MANSUFFIX),
+.BR xscreensaver\-text (MANSUFFIX).
.SH COPYRIGHT
-Copyright \(co 1991-2019 by Jamie Zawinski.
+Copyright \(co 1991-2021 by Jamie Zawinski.
Permission to use, copy, modify, distribute, and sell this software
and its documentation for any purpose is hereby granted without fee,
provided that the above copyright notice appear in all copies and that
@@ -1042,5 +980,5 @@ to comp.sources.x on 17-Aug-1992.
Please let me know if you find any bugs or make any improvements.
And a huge thank you to the hundreds of people who have contributed, in
-large ways and small, to the xscreensaver collection over the past
-two decades!
+large ways and small, to the XScreenSaver collection over the past
+three decades!
diff --git a/driver/xscreensaver.ui b/driver/xscreensaver.ui
new file mode 100644
index 0000000..e9e4522
--- /dev/null
+++ b/driver/xscreensaver.ui
@@ -0,0 +1,2994 @@
+<?xml version="1.0"?>
+<!--*- mode: xml -*-->
+<interface>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="upper">720</property>
+ <property name="lower">1</property>
+ <property name="page_increment">15</property>
+ <property name="step_increment">1</property>
+ <property name="page_size">0</property>
+ <property name="value">1</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment2">
+ <property name="upper">720</property>
+ <property name="lower">0</property>
+ <property name="page_increment">15</property>
+ <property name="step_increment">1</property>
+ <property name="page_size">0</property>
+ <property name="value">0</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment3">
+ <property name="upper">720</property>
+ <property name="lower">0</property>
+ <property name="page_increment">15</property>
+ <property name="step_increment">1</property>
+ <property name="page_size">0</property>
+ <property name="value">0</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment4">
+ <property name="upper">1440</property>
+ <property name="lower">0</property>
+ <property name="page_increment">15</property>
+ <property name="step_increment">1</property>
+ <property name="page_size">0</property>
+ <property name="value">0</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment5">
+ <property name="upper">1440</property>
+ <property name="lower">0</property>
+ <property name="page_increment">15</property>
+ <property name="step_increment">1</property>
+ <property name="page_size">0</property>
+ <property name="value">0</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment6">
+ <property name="upper">1440</property>
+ <property name="lower">0</property>
+ <property name="page_increment">15</property>
+ <property name="step_increment">1</property>
+ <property name="page_size">0</property>
+ <property name="value">0</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment7">
+ <property name="upper">10</property>
+ <property name="lower">0</property>
+ <property name="page_increment">1</property>
+ <property name="step_increment">1</property>
+ <property name="page_size">0</property>
+ <property name="value">0</property>
+ </object>
+ <object class="GtkListStore" id="mode_menu_model">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">Disable Screen Saver</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Blank Screen Only</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Only One Screen Saver</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Random Screen Saver</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Same Random Savers</col>
+ </row>
+ </data>
+ </object>
+
+ <object class="GtkListStore" id="theme_menu_model">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">Default</col>
+ </row>
+ </data>
+ </object>
+
+
+
+
+
+ <object class="GtkListStore" id="visual_combo_model">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">Any</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Best</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Default</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Default-N</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">GL</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">TrueColor</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">PseudoColor</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">StaticGray</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">GrayScale</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">DirectColor</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Color</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Gray</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Mono</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkUIManager" id="uimanager1">
+ <child>
+ <object class="GtkActionGroup" id="actiongroup1">
+ <child>
+ <object class="GtkAction" id="file">
+ <property name="name">file</property>
+ <property name="label" translatable="yes">_File</property>
+ <signal handler="file_menu_cb" last_modification_time="Sun, 06 Mar 2005 21:41:13 GMT" name="activate"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkAction" id="activate_action">
+ <property name="name">activate_action</property>
+ <property name="label" translatable="yes">_Blank Screen Now</property>
+ <signal handler="activate_menu_cb" name="activate"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkAction" id="lock_action">
+ <property name="name">lock_action</property>
+ <property name="label" translatable="yes">_Lock Screen Now</property>
+ <signal handler="lock_menu_cb" name="activate"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkAction" id="kill_action">
+ <property name="name">kill_action</property>
+ <property name="label" translatable="yes">_Kill Daemon</property>
+ <signal handler="kill_menu_cb" name="activate"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkAction" id="restart_action">
+ <property name="name">restart_action</property>
+ <property name="label" translatable="yes">_Restart Daemon</property>
+ <signal handler="restart_menu_cb" name="activate"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkAction" id="exit_action">
+ <property name="name">exit_action</property>
+ <property name="label" translatable="yes">_Quit</property>
+ <signal handler="exit_menu_cb" name="activate"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkAction" id="help">
+ <property name="name">help</property>
+ <property name="label" translatable="yes">_Help</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkAction" id="about_action">
+ <property name="name">about_action</property>
+ <property name="label" translatable="yes">_About...</property>
+ <signal handler="about_menu_cb" name="activate"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkAction" id="doc_action">
+ <property name="name">doc_action</property>
+ <property name="label" translatable="yes">_Documentation...</property>
+ <signal handler="doc_menu_cb" name="activate"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ <ui>
+ <menubar name="menubar">
+ <menu action="file">
+ <menuitem name="activate_menu" action="activate_action"/>
+ <menuitem name="lock_menu" action="lock_action"/>
+ <menuitem name="kill_menu" action="kill_action"/>
+ <menuitem name="restart_menu" action="restart_action"/>
+ <separator/>
+ <menuitem name="exit_menu" action="exit_action"/>
+ </menu>
+ <menu action="help">
+ <menuitem name="about_menu" action="about_action"/>
+ <menuitem name="doc_menu" action="doc_action"/>
+ </menu>
+ </menubar>
+ </ui>
+ </object>
+ <object class="GtkWindow" id="xscreensaver_demo">
+ <property name="title" translatable="yes">XScreenSaver</property>
+ <property name="type">GTK_WINDOW_TOPLEVEL</property>
+ <property name="window_position">GTK_WIN_POS_NONE</property>
+ <property name="modal">False</property>
+ <property name="resizable">True</property>
+ <property name="destroy_with_parent">False</property>
+ <property name="decorated">True</property>
+ <property name="skip_taskbar_hint">False</property>
+ <property name="skip_pager_hint">False</property>
+ <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+ <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+ <property name="focus_on_map">True</property>
+ <property name="urgency_hint">False</property>
+ <child>
+ <object class="GtkVBox" id="outer_vbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkMenuBar" constructor="uimanager1" id="menubar">
+ <property name="visible">True</property>
+ <property name="pack_direction">GTK_PACK_DIRECTION_LTR</property>
+ <property name="child_pack_direction">GTK_PACK_DIRECTION_LTR</property>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="spacer_hbox">
+ <property name="border_width">8</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+ <child>
+ <object class="GtkNotebook" id="notebook">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="show_tabs">True</property>
+ <property name="show_border">True</property>
+ <property name="tab_pos">GTK_POS_TOP</property>
+ <property name="scrollable">False</property>
+ <property name="enable_popup">False</property>
+ <signal handler="switch_page_cb" name="switch_page"/>
+ <child>
+ <object class="GtkTable" id="demos_table">
+ <property name="border_width">10</property>
+ <property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">2</property>
+ <property name="homogeneous">False</property>
+ <property name="row_spacing">0</property>
+ <property name="column_spacing">0</property>
+ <child>
+ <object class="GtkTable" id="blanking_table">
+ <property name="visible">True</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">4</property>
+ <property name="homogeneous">False</property>
+ <property name="row_spacing">2</property>
+ <property name="column_spacing">0</property>
+ <child>
+ <object class="GtkLabel" id="cycle_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Cycle After</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_RIGHT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">8</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">cycle_spinbutton</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="cycle_spinbutton" type="label-for"/>
+ <relation target="cycle_spinbutton" type="flows-to"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEventBox" id="lock_button_eventbox">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Whether a password should be required to un-blank the screen.</property>
+ <property name="visible_window">False</property>
+ <property name="above_child">False</property>
+ <child>
+ <object class="GtkCheckButton" id="lock_button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Lock Screen After </property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <accessibility>
+ <relation target="lock_spinbutton" type="controller-for"/>
+ <relation target="lock_spinbutton" type="label-for"/>
+ <relation target="lock_spinbutton" type="flows-to"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="toggled"/>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="a11y-lock_button1">
+ <property name="AtkObject::accessible_name" translatable="yes">Lock Screen</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="timeout_spinbutton">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">How long before the screen saver activates.</property>
+ <property name="can_focus">True</property>
+ <property name="climb_rate">15</property>
+ <property name="digits">0</property>
+ <property name="numeric">True</property>
+ <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+ <property name="snap_to_ticks">True</property>
+ <property name="wrap">False</property>
+ <property name="adjustment">adjustment1</property>
+ <accessibility>
+ <relation target="timeout_label" type="labelled-by"/>
+ <relation target="timeout_mlabel" type="labelled-by"/>
+ <relation target="timeout_label" type="flows-from"/>
+ <relation target="timeout_mlabel" type="flows-to"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="activate"/>
+ <signal handler="pref_changed_event_cb" name="focus_out_event"/>
+ <signal handler="pref_changed_cb" name="value_changed"/>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="lock_spinbutton">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">How long after the screen blanks until a password will be required.</property>
+ <property name="can_focus">True</property>
+ <property name="climb_rate">15</property>
+ <property name="digits">0</property>
+ <property name="numeric">True</property>
+ <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+ <property name="snap_to_ticks">True</property>
+ <property name="wrap">False</property>
+ <property name="adjustment">adjustment2</property>
+ <accessibility>
+ <relation target="lock_button" type="controlled-by"/>
+ <relation target="lock_button" type="labelled-by"/>
+ <relation target="lock_mlabel" type="labelled-by"/>
+ <relation target="lock_button" type="flows-from"/>
+ <relation target="lock_mlabel" type="flows-to"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="activate"/>
+ <signal handler="pref_changed_event_cb" name="focus_out_event"/>
+ <signal handler="pref_changed_cb" name="value_changed"/>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="a11y-lock_spinbutton1">
+ <property name="AtkObject::accessible_name" translatable="yes">Lock Screen After</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_padding">10</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="cycle_spinbutton">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">How long each display mode should run before choosing a new one (in Random mode.)</property>
+ <property name="can_focus">True</property>
+ <property name="climb_rate">15</property>
+ <property name="digits">0</property>
+ <property name="numeric">True</property>
+ <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+ <property name="snap_to_ticks">True</property>
+ <property name="wrap">False</property>
+ <property name="adjustment">adjustment3</property>
+ <accessibility>
+ <relation target="cycle_label" type="labelled-by"/>
+ <relation target="cycle_mlabel" type="labelled-by"/>
+ <relation target="cycle_label" type="flows-from"/>
+ <relation target="cycle_mlabel" type="flows-to"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="activate"/>
+ <signal handler="pref_changed_event_cb" name="focus_out_event"/>
+ <signal handler="pref_changed_cb" name="value_changed"/>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lock_mlabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">minutes</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">8</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="lock_spinbutton" type="label-for"/>
+ <relation target="lock_spinbutton" type="flows-to"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="cycle_mlabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">minutes</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">8</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="cycle_spinbutton" type="label-for"/>
+ <relation target="cycle_spinbutton" type="flows-from"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="timeout_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Blank After</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_RIGHT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">8</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">timeout_spinbutton</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="timeout_spinbutton" type="label-for"/>
+ <relation target="timeout_spinbutton" type="flows-to"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="timeout_mlabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">minutes</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">8</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="timeout_spinbutton" type="label-for"/>
+ <relation target="timeout_spinbutton" type="flows-from"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options">fill</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="demo_manual_hbbox">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_SPREAD</property>
+ <property name="spacing">30</property>
+ <child>
+ <object class="GtkButton" id="demo">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Demo the selected screen saver in full-screen mode (click the mouse to return.)</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Preview</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal handler="run_this_cb" name="clicked"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="settings">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Customization and explanation of the selected screen saver.</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Settings...</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal handler="settings_cb" name="clicked"/>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options">fill</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="list_vbox">
+ <property name="border_width">10</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+ <child>
+ <object class="GtkHBox" id="mode_hbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+ <child>
+ <object class="GtkLabel" id="mode_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Mode:</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">mode_menu</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="mode_menu" type="label-for"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="mode_menu">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="has_entry">False</property>
+ <property name="model">mode_menu_model</property>
+ <accessibility>
+ <relation target="mode_label" type="labelled-by"/>
+ </accessibility>
+ <child>
+ <object class="GtkCellRendererText" id="renderer1"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">4</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">10</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scroller">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
+ <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
+ <property name="shadow_type">GTK_SHADOW_IN</property>
+ <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+ <child>
+ <object class="GtkTreeView" id="list">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="headers_visible">False</property>
+ <property name="rules_hint">True</property>
+ <property name="reorderable">False</property>
+ <property name="enable_search">True</property>
+ <property name="fixed_height_mode">False</property>
+ <property name="hover_selection">False</property>
+ <property name="hover_expand">False</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="centering_hbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">True</property>
+ <property name="spacing">0</property>
+ <child>
+ <object class="GtkHBox" id="next_prev_hbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+ <child>
+ <object class="GtkButton" id="next">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Run the next screen saver in the list in full-screen mode (click the mouse to return.)</property>
+ <property name="can_focus">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal handler="run_next_cb" name="clicked"/>
+ <child>
+ <object class="GtkArrow" id="arrow1">
+ <property name="visible">True</property>
+ <property name="arrow_type">GTK_ARROW_DOWN</property>
+ <property name="shadow_type">GTK_SHADOW_OUT</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="prev">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Run the previous screen saver in the list in full-screen mode (click the mouse to return.)</property>
+ <property name="can_focus">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal handler="run_prev_cb" name="clicked"/>
+ <child>
+ <object class="GtkArrow" id="arrow2">
+ <property name="visible">True</property>
+ <property name="arrow_type">GTK_ARROW_UP</property>
+ <property name="shadow_type">GTK_SHADOW_OUT</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">GTK_PACK_END</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="preview_frame">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="label_yalign">0.5</property>
+ <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+ <accessibility>
+ <relation target="label1" type="labelled-by"/>
+ </accessibility>
+ <child>
+ <object class="GtkNotebook" id="preview_notebook">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="show_tabs">True</property>
+ <property name="show_border">False</property>
+ <property name="tab_pos">GTK_POS_BOTTOM</property>
+ <property name="scrollable">False</property>
+ <property name="enable_popup">False</property>
+ <child>
+ <object class="GtkAspectFrame" id="preview_aspectframe">
+ <property name="border_width">8</property>
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="label_yalign">0.5</property>
+ <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="ratio">1.33000004292</property>
+ <property name="obey_child">False</property>
+ <child>
+ <object class="GtkDrawingArea" id="preview">
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="preview_tab">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">preview</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="no_preview_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">No Preview
+Available</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_CENTER</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="no_preview_tab">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">no preview</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="not_installed_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Not
+Installed</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_CENTER</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="not_installed_tab">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">not installed</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="nothing_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Very few (or no) screen savers appear to be available.
+
+This probably means that the "xscreensaver-extras" and
+"xscreensaver-gl-extras" packages are not installed.</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_CENTER</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="nothing_tab">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">nothing</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Description</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="preview_frame" type="label-for"/>
+ </accessibility>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="y_padding">6</property>
+ <property name="x_options">expand|shrink|fill</property>
+ <property name="y_options">expand|shrink|fill</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="demo_tab">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Display Modes</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_CENTER</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">notebook</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTable" id="options_table">
+ <property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">2</property>
+ <property name="homogeneous">True</property>
+ <property name="row_spacing">0</property>
+ <property name="column_spacing">0</property>
+ <child>
+ <object class="GtkFrame" id="grab_frame">
+ <property name="border_width">10</property>
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="label_yalign">0.5</property>
+ <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+ <accessibility>
+ <relation target="label2" type="labelled-by"/>
+ </accessibility>
+ <child>
+ <object class="GtkHBox" id="grab_hbox">
+ <property name="border_width">8</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">8</property>
+ <child>
+ <object class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="pixbuf">screensaver-snap.png</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="xpad">4</property>
+ <property name="ypad">8</property>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="grab_vbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+ <child>
+ <object class="GtkCheckButton" id="grab_desk_button">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Whether the image-manipulating modes should be allowed to operate on an image of your desktop.</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Grab Desktop _Images</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <signal handler="pref_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="grab_video_button">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Whether the image-manipulating modes should operate on images captured from the system's video input (if there is one.)</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Grab _Video Frames</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <signal handler="pref_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="grab_image_button">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Whether the image-manipulating modes should load image files.</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Choose _Random Image:</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <accessibility>
+ <relation target="image_text" type="controller-for"/>
+ <relation target="image_browse_button" type="controller-for"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="image_hbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+ <child>
+ <object class="GtkLabel" id="grab_dummy">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"/>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">8</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="image_text">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">The local directory, RSS feed or Atom feed from which images will be randomly chosen.</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text" translatable="yes"/>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">*</property>
+ <property name="activates_default">False</property>
+ <accessibility>
+ <relation target="grab_image_button" type="labelled-by"/>
+ <relation target="grab_image_button" type="controlled-by"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="activate"/>
+ <signal handler="pref_changed_event_cb" name="focus_out_event"/>
+ </object>
+ <packing>
+ <property name="padding">2</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="image_browse_button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Browse</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal handler="browse_image_dir_cb" name="clicked"/>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Local directory, or RSS feed URL.</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">20</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Image Manipulation</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="grab_frame" type="label-for"/>
+ </accessibility>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="diag_frame">
+ <property name="border_width">10</property>
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="label_yalign">0.5</property>
+ <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+ <accessibility>
+ <relation target="label3" type="labelled-by"/>
+ </accessibility>
+ <child>
+ <object class="GtkHBox" id="diag_hbox">
+ <property name="border_width">8</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">8</property>
+ <child>
+ <object class="GtkImage" id="diag_logo">
+ <property name="visible">True</property>
+ <property name="pixbuf">screensaver-diagnostic.png</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="text_table">
+ <property name="visible">True</property>
+ <property name="n_rows">5</property>
+ <property name="n_columns">3</property>
+ <property name="homogeneous">False</property>
+ <property name="row_spacing">2</property>
+ <property name="column_spacing">2</property>
+ <child>
+ <object class="GtkRadioButton" id="text_radio">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Text-displaying modes will display the text typed here.</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Text</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <accessibility>
+ <relation target="text_entry" type="controller-for"/>
+ <relation target="text_entry" type="label-for"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:31:44 GMT" name="toggled"/>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="text_file_radio">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Text-displaying modes will display the contents of this file.</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Text _file</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">text_radio</property>
+ <accessibility>
+ <relation target="text_file_entry" type="label-for"/>
+ <relation target="text_file_entry" type="controller-for"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:31:55 GMT" name="toggled"/>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="text_program_radio">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Text-displaying modes will display the output of this program.</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Program</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">text_radio</property>
+ <accessibility>
+ <relation target="text_program_entry" type="label-for"/>
+ <relation target="text_program_entry" type="controller-for"/>
+ <relation target="text_program_browse" type="controller-for"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:32:07 GMT" name="toggled"/>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="text_url_radio">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Text-displaying modes will display the contents of this URL (HTML or RSS).</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_URL</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">text_radio</property>
+ <accessibility>
+ <relation target="text_url_entry" type="label-for"/>
+ <relation target="text_url_entry" type="controller-for"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:32:17 GMT" name="toggled"/>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="text_host_radio">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Text-displaying modes will display the local host name, date, and time.</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Host Name and Time</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">True</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">text_radio</property>
+ <signal handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:31:32 GMT" name="toggled"/>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="text_url_entry">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Text-displaying modes will display the contents of this URL (HTML or RSS).</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text" translatable="yes"/>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">*</property>
+ <property name="activates_default">False</property>
+ <accessibility>
+ <relation target="text_url_radio" type="controlled-by"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:33:10 GMT" name="activate"/>
+ <signal handler="pref_changed_event_cb" last_modification_time="Sun, 20 Mar 2005 21:34:26 GMT" name="focus_out_event"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="text_file_browse">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Browse</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <accessibility>
+ <relation target="text_file_radio" type="controlled-by"/>
+ </accessibility>
+ <signal handler="browse_text_file_cb" last_modification_time="Sun, 20 Mar 2005 01:24:38 GMT" name="clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="text_entry">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Text-displaying modes will display the text typed here.</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text" translatable="yes"/>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">*</property>
+ <property name="activates_default">False</property>
+ <accessibility>
+ <relation target="text_program_radio" type="labelled-by"/>
+ <relation target="text_program_radio" type="controlled-by"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:32:42 GMT" name="activate"/>
+ <signal handler="pref_changed_event_cb" last_modification_time="Sun, 20 Mar 2005 21:33:43 GMT" name="focus_out_event"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="text_program_entry">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Text-displaying modes will display the output of this program.</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text" translatable="yes"/>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">*</property>
+ <property name="activates_default">False</property>
+ <accessibility>
+ <relation target="text_program_radio" type="labelled-by"/>
+ <relation target="text_program_radio" type="controlled-by"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:33:02 GMT" name="activate"/>
+ <signal handler="pref_changed_event_cb" last_modification_time="Sun, 20 Mar 2005 21:34:15 GMT" name="focus_out_event"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="text_program_browse">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Browse</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <accessibility>
+ <relation target="text_program_radio" type="controller-for"/>
+ </accessibility>
+ <signal handler="browse_text_program_cb" last_modification_time="Sun, 20 Mar 2005 01:24:51 GMT" name="clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="text_file_entry">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Text-displaying modes will display the contents of this file.</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text" translatable="yes"/>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">*</property>
+ <property name="activates_default">False</property>
+ <accessibility>
+ <relation target="text_file_radio" type="labelled-by"/>
+ <relation target="text_file_radio" type="controlled-by"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:32:53 GMT" name="activate"/>
+ <signal handler="pref_changed_event_cb" last_modification_time="Sun, 20 Mar 2005 21:33:55 GMT" name="focus_out_event"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Text Manipulation</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="diag_frame" type="label-for"/>
+ </accessibility>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="dpms_frame">
+ <property name="border_width">10</property>
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="label_yalign">0.5</property>
+ <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+ <child>
+ <object class="GtkHBox" id="dpms_hbox">
+ <property name="border_width">8</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">8</property>
+ <child>
+ <object class="GtkImage" id="dpms_logo">
+ <property name="visible">True</property>
+ <property name="pixbuf">screensaver-power.png</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox6">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+ <child>
+ <object class="GtkCheckButton" id="dpms_button">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Whether the monitor should be powered down after a while.</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Power Management Enabled</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">True</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <accessibility>
+ <relation target="dpms_suspend_spinbutton" type="controller-for"/>
+ <relation target="dpms_standby_spinbutton" type="controller-for"/>
+ <relation target="dpms_off_spinbutton" type="controller-for"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="dpms_table">
+ <property name="visible">True</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">3</property>
+ <property name="homogeneous">False</property>
+ <property name="row_spacing">2</property>
+ <property name="column_spacing">4</property>
+ <child>
+ <object class="GtkLabel" id="dpms_standby_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Stand_by After</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">10</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">dpms_standby_spinbutton</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="dpms_standby_spinbutton" type="label-for"/>
+ <relation target="dpms_standby_spinbutton" type="flows-to"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="dpms_suspend_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Sus_pend After</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">10</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">dpms_suspend_spinbutton</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="dpms_suspend_spinbutton" type="label-for"/>
+ <relation target="dpms_suspend_spinbutton" type="flows-to"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="dpms_off_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Off After</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">10</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">dpms_off_spinbutton</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="dpms_off_spinbutton" type="label-for"/>
+ <relation target="dpms_off_spinbutton" type="flows-to"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="dpms_standby_mlabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">minutes</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="dpms_standby_spinbutton" type="label-for"/>
+ <relation target="dpms_standby_spinbutton" type="flows-from"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="dpms_suspend_mlabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">minutes</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="dpms_suspend_spinbutton" type="label-for"/>
+ <relation target="dpms_suspend_spinbutton" type="flows-from"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="dpms_off_mlabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">minutes</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="dpms_off_spinbutton" type="label-for"/>
+ <relation target="dpms_off_spinbutton" type="flows-from"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="dpms_off_spinbutton">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">How long until the monitor powers down.</property>
+ <property name="can_focus">True</property>
+ <property name="climb_rate">15</property>
+ <property name="digits">0</property>
+ <property name="numeric">True</property>
+ <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+ <property name="snap_to_ticks">True</property>
+ <property name="wrap">False</property>
+ <property name="adjustment">adjustment4</property>
+ <accessibility>
+ <relation target="dpms_button" type="controlled-by"/>
+ <relation target="dpms_off_label" type="labelled-by"/>
+ <relation target="dpms_off_mlabel" type="labelled-by"/>
+ <relation target="dpms_off_label" type="flows-from"/>
+ <relation target="dpms_off_mlabel" type="flows-to"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="activate"/>
+ <signal handler="pref_changed_event_cb" name="focus_out_event"/>
+ <signal handler="pref_changed_cb" name="value_changed"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options"/>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="dpms_suspend_spinbutton">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">How long until the monitor goes into power-saving mode.</property>
+ <property name="can_focus">True</property>
+ <property name="climb_rate">15</property>
+ <property name="digits">0</property>
+ <property name="numeric">True</property>
+ <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+ <property name="snap_to_ticks">True</property>
+ <property name="wrap">False</property>
+ <property name="adjustment">adjustment5</property>
+ <accessibility>
+ <relation target="dpms_button" type="controlled-by"/>
+ <relation target="dpms_suspend_label" type="labelled-by"/>
+ <relation target="dpms_suspend_mlabel" type="labelled-by"/>
+ <relation target="dpms_suspend_label" type="flows-from"/>
+ <relation target="dpms_suspend_mlabel" type="flows-to"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="activate"/>
+ <signal handler="pref_changed_event_cb" name="focus_out_event"/>
+ <signal handler="pref_changed_cb" name="value_changed"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options"/>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="dpms_standby_spinbutton">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">How long until the monitor goes completely black.</property>
+ <property name="can_focus">True</property>
+ <property name="climb_rate">15</property>
+ <property name="digits">0</property>
+ <property name="numeric">True</property>
+ <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+ <property name="snap_to_ticks">True</property>
+ <property name="wrap">False</property>
+ <property name="adjustment">adjustment6</property>
+ <accessibility>
+ <relation target="dpms_button" type="controlled-by"/>
+ <relation target="dpms_standby_label" type="labelled-by"/>
+ <relation target="dpms_standby_mlabel" type="labelled-by"/>
+ <relation target="dpms_standby_label" type="flows-from"/>
+ <relation target="dpms_standby_mlabel" type="flows-to"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="activate"/>
+ <signal handler="pref_changed_event_cb" name="focus_out_event"/>
+ <signal handler="pref_changed_cb" name="value_changed"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options"/>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="dpms_quickoff_button">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Whether the monitor should be powered off immediately in "Blank Screen Only" mode, regardless of the above power-management timeouts.</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Quick Power-off in Blank Only Mode</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <signal handler="pref_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Display Power Management</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="dpms_frame" type="label-for"/>
+ </accessibility>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="y_options">fill</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="blanking_frame">
+ <property name="border_width">10</property>
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="label_yalign">0.5</property>
+ <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+ <accessibility>
+ <relation target="label5" type="labelled-by"/>
+ </accessibility>
+ <child>
+ <object class="GtkHBox" id="fading_hbox">
+ <property name="border_width">8</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">8</property>
+ <child>
+ <object class="GtkImage" id="image5">
+ <property name="visible">True</property>
+ <property name="pixbuf">screensaver-colorselector.png</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox7">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+ <child>
+ <object class="GtkCheckButton" id="fade_button">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Whether the screen should slowly fade to black when the screen saver activates.</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Fade to Black when _Blanking</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <accessibility>
+ <relation target="fade_spinbutton" type="controller-for"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="unfade_button">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Whether the screen should slowly fade in from black when the screen saver deactivates.</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Fade from Black When _Unblanking</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <accessibility>
+ <relation target="fade_spinbutton" type="controller-for"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="fade_hbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+ <child>
+ <object class="GtkLabel" id="fade_dummy">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"/>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">3</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="fade_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">F_ade Duration</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">fade_spinbutton</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="fade_spinbutton" type="label-for"/>
+ <relation target="fade_spinbutton" type="flows-to"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="padding">14</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="fade_spinbutton">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">How long it should take for the screen to fade in and out.</property>
+ <property name="can_focus">True</property>
+ <property name="climb_rate">1</property>
+ <property name="digits">0</property>
+ <property name="numeric">True</property>
+ <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+ <property name="snap_to_ticks">True</property>
+ <property name="wrap">False</property>
+ <property name="adjustment">adjustment7</property>
+ <accessibility>
+ <relation target="unfade_button" type="controlled-by"/>
+ <relation target="fade_button" type="controlled-by"/>
+ <relation target="fade_label" type="labelled-by"/>
+ <relation target="fade_sec_label" type="labelled-by"/>
+ <relation target="fade_label" type="flows-from"/>
+ <relation target="fade_sec_label" type="flows-to"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="activate"/>
+ <signal handler="pref_changed_event_cb" name="focus_out_event"/>
+ <signal handler="pref_changed_cb" name="value_changed"/>
+ </object>
+ <packing>
+ <property name="padding">4</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="fade_sec_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">seconds</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="fade_spinbutton" type="label-for"/>
+ <relation target="fade_spinbutton" type="flows-from"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="padding">2</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHSeparator" id="blanking_hr">
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="padding">8</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+
+ <child>
+ <object class="GtkHBox" id="theme_hbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+ <child>
+ <object class="GtkLabel" id="theme_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Theme:</property>
+ <property name="tooltip-text" translatable="yes">The color scheme to use on the unlock dialog.</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">theme_menu</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="theme_menu" type="label-for"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="theme_menu">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="has_entry">False</property>
+ <property name="model">theme_menu_model</property>
+ <accessibility>
+ <relation target="theme_label" type="labelled-by"/>
+ </accessibility>
+ <child>
+ <object class="GtkCellRendererText" id="renderer2"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">4</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="theme_preview">
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Show the what the unlock dialog will look like.</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Preview</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal handler="preview_theme_cb" name="clicked"/>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">10</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+
+
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Blanking</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="blanking_frame" type="label-for"/>
+ </accessibility>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options">fill</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="options_tab">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Advanced</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">notebook</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbuttonbox2">
+ <property name="border_width">5</property>
+ <property name="layout_style">GTK_BUTTONBOX_EDGE</property>
+ <property name="spacing">10</property>
+ <child>
+ <object class="GtkButton" id="helpbutton">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label">gtk-help</property>
+ <property name="use_stock">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal handler="doc_menu_cb" name="clicked"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="closebutton">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label">gtk-close</property>
+ <property name="use_stock">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal handler="exit_menu_cb" name="clicked"/>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">GTK_PACK_END</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkDialog" id="xscreensaver_settings_dialog">
+ <property name="title" translatable="yes">dialog1</property>
+ <property name="type">GTK_WINDOW_TOPLEVEL</property>
+ <property name="window_position">GTK_WIN_POS_NONE</property>
+ <property name="modal">False</property>
+ <property name="resizable">True</property>
+ <property name="destroy_with_parent">False</property>
+ <property name="decorated">True</property>
+ <property name="skip_taskbar_hint">False</property>
+ <property name="skip_pager_hint">False</property>
+ <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+ <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+ <property name="focus_on_map">True</property>
+ <property name="urgency_hint">False</property>
+ <property name="has_separator">False</property>
+ <child internal-child="vbox">
+ <object class="GtkVBox" id="dialog_vbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+ <child internal-child="action_area">
+ <object class="GtkHButtonBox" id="dialog_action_area">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_END</property>
+ <child>
+ <object class="GtkButton" id="adv_button">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Advanced &gt;&gt;</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal handler="settings_adv_cb" name="clicked"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="std_button">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Standard &lt;&lt;</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal handler="settings_std_cb" name="clicked"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="reset_button">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Reset to Defaults</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal handler="settings_reset_cb" name="clicked"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="cancel_button">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label">gtk-cancel</property>
+ <property name="use_stock">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal handler="settings_cancel_cb" name="clicked"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="ok_button">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label">gtk-ok</property>
+ <property name="use_stock">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal handler="settings_ok_cb" name="clicked"/>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">GTK_PACK_END</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+ <child>
+ <object class="GtkFrame" id="opt_frame">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="label_yalign">0</property>
+ <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+ <accessibility>
+ <relation target="label6" type="labelled-by"/>
+ </accessibility>
+ <child>
+ <object class="GtkNotebook" id="opt_notebook">
+ <property name="border_width">12</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="show_tabs">True</property>
+ <property name="show_border">False</property>
+ <property name="tab_pos">GTK_POS_BOTTOM</property>
+ <property name="scrollable">False</property>
+ <property name="enable_popup">False</property>
+ <signal handler="settings_switch_page_cb" name="switch_page"/>
+ <child>
+ <object class="GtkVBox" id="settings_vbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="tab_expand">True</property>
+ <property name="tab_fill">True</property>
+ <property name="tab_pack">GTK_PACK_END</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="std_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Standard</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTable" id="adv_table">
+ <property name="visible">True</property>
+ <property name="n_rows">4</property>
+ <property name="n_columns">2</property>
+ <property name="homogeneous">False</property>
+ <property name="row_spacing">0</property>
+ <property name="column_spacing">0</property>
+ <child>
+ <object class="GtkImage" id="cmd_logo">
+ <property name="visible">True</property>
+ <property name="pixbuf">screensaver-cmndln.png</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">4</property>
+ <property name="ypad">8</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options">fill</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="cmd_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Command Line:</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">cmd_text</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="cmd_text" type="label-for"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="cmd_text">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text" translatable="yes"/>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">*</property>
+ <property name="activates_default">False</property>
+ <accessibility>
+ <relation target="cmd_label" type="labelled-by"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="visual_hbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+ <child>
+ <object class="GtkLabel" id="visual">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Visual:</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">3</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">visual_combo</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="visual_combo" type="label-for"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxEntry" id="visual_combo">
+ <property name="has_entry">False</property>
+ <property name="visible">True</property>
+ <property name="model">visual_combo_model</property>
+ <property name="text-column">0</property>
+ <accessibility>
+ <relation target="visual" type="labelled-by"/>
+ </accessibility>
+ <child internal-child="entry">
+ <object class="GtkEntry" id="visual_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text" translatable="yes"/>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">*</property>
+ <property name="activates_default">False</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">fill</property>
+ <property name="y_options">fill</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="adv_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Advanced</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Settings</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="opt_frame" type="label-for"/>
+ </accessibility>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="doc_frame">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="label_yalign">0</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <child>
+ <object class="GtkVBox" id="doc_vbox">
+ <property name="border_width">5</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="doc">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes"/>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">True</property>
+ <property name="selectable">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+ <child>
+ <object class="GtkButton" id="manual">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Documentation...</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal handler="manual_cb" name="clicked"/>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">GTK_PACK_END</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"/>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">adv_button</action-widget>
+ <action-widget response="0">std_button</action-widget>
+ <action-widget response="0">reset_button</action-widget>
+ <action-widget response="-6">cancel_button</action-widget>
+ <action-widget response="-5">ok_button</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/driver/xset.c b/driver/xset.c
deleted file mode 100644
index a381429..0000000
--- a/driver/xset.c
+++ /dev/null
@@ -1,389 +0,0 @@
-/* xset.c --- interacting with server extensions and the builtin screensaver.
- * xscreensaver, Copyright (c) 1991-2008 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdio.h>
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <X11/Xatom.h>
-#include <X11/Xos.h>
-
-/* This file doesn't need the Xt headers, so stub these types out... */
-#undef XtPointer
-#define XtAppContext void*
-#define XrmDatabase void*
-#define XtIntervalId void*
-#define XtPointer void*
-#define Widget void*
-
-#include "xscreensaver.h"
-
-#ifdef _VROOT_H_
-ERROR! You must not include vroot.h in this file.
-#endif
-
-
-/* MIT SCREEN-SAVER server extension hackery.
- */
-
-#ifdef HAVE_MIT_SAVER_EXTENSION
-
-# include <X11/extensions/scrnsaver.h>
-
-static int
-ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
-{
- return 0;
-}
-
-static void
-init_mit_saver_extension (saver_info *si)
-{
- int i;
- Pixmap *blank_pix = (Pixmap *) calloc (sizeof(Pixmap), si->nscreens);
-
- for (i = 0; i < si->nscreens; i++)
- {
- saver_screen_info *ssi = &si->screens[i];
- XID kill_id = 0;
- Atom kill_type = 0;
- Window root = RootWindowOfScreen (ssi->screen);
- blank_pix[i] = XCreatePixmap (si->dpy, root, 1, 1, 1);
-
- /* Kill off the old MIT-SCREEN-SAVER client if there is one.
- This tends to generate X errors, though (possibly due to a bug
- in the server extension itself?) so just ignore errors here. */
- if (XScreenSaverGetRegistered (si->dpy,
- XScreenNumberOfScreen (ssi->screen),
- &kill_id, &kill_type)
- && kill_id != blank_pix[i])
- {
- XErrorHandler old_handler =
- XSetErrorHandler (ignore_all_errors_ehandler);
- XKillClient (si->dpy, kill_id);
- XSync (si->dpy, False);
- XSetErrorHandler (old_handler);
- }
- XScreenSaverSelectInput (si->dpy, root, ScreenSaverNotifyMask);
- XScreenSaverRegister (si->dpy,
- XScreenNumberOfScreen (ssi->screen),
- (XID) blank_pix[i], XA_PIXMAP);
- }
- free(blank_pix);
-}
-#endif /* HAVE_MIT_SAVER_EXTENSION */
-
-
-#ifdef HAVE_XINPUT
-/* XInputExtension device support */
-
-Bool
-query_xinput_extension (saver_info *si)
-{
- XExtCodes codes;
- return XQueryExtension (si->dpy, INAME, &codes.major_opcode,
- &codes.first_event, &codes.first_error);
-}
-
-void
-init_xinput_extension (saver_info *si)
-{
- int i, ndevices;
- int class;
- XDeviceInfo *list;
- XDevice *dev;
- XAnyClassPtr pClass;
- XEventClass *event_list;
- int nevents = 0;
-
- /* skip if already initialized */
- if (si->num_xinput_devices && si->xinput_devices)
- return;
-
- si->num_xinput_devices = 0;
-
- list = XListInputDevices (si->dpy, &ndevices);
- if (list == NULL)
- {
- si->xinput_devices = NULL;
- return;
- }
-
- /* We only care about 3 event types per device (DeviceButtonPress,
- DeviceButtonRelease, and DeviceMotionNotify), hence the "* 3"
- for the event count. */
- event_list = calloc(ndevices * 3, sizeof(XEventClass));
- if (event_list == NULL)
- return;
-
- si->xinput_devices = calloc(ndevices, sizeof(struct xinput_dev_info));
- if (si->xinput_devices == NULL)
- {
- free(event_list);
- return;
- }
-
- for (i = 0; i < ndevices; i++)
- {
- if ((list[i].use == IsXExtensionDevice)
-#ifdef IsXExtensionPointer
- || (list[i].use == IsXExtensionPointer)
-#endif
- )
- {
- struct xinput_dev_info *dev_info =
- &si->xinput_devices[si->num_xinput_devices];
- Bool device_we_want = False;
-
- if (si->prefs.debug_p)
- fprintf(stderr,
- "Extension device #%2d: XID=%2d type=%3d name=\"%s\"\n",
- i, (int) list[i].id, (int) list[i].type, list[i].name);
-
- dev = XOpenDevice (si->dpy, list[i].id);
- if (!dev)
- continue;
- dev_info->device = dev;
-
- pClass = list[i].inputclassinfo;
- for (class = 0; class < list[i].num_classes; class++)
- {
- switch (pClass->class)
- {
- case ButtonClass:
- if (((XButtonInfo *) pClass)->num_buttons > 0)
- {
- /* Macros set values in the second & third arguments */
- DeviceButtonPress (dev, si->xinput_DeviceButtonPress,
- dev_info->press);
- event_list[nevents++] = dev_info->press;
-
- DeviceButtonRelease (dev, si->xinput_DeviceButtonRelease,
- dev_info->release);
- event_list[nevents++] = dev_info->release;
- device_we_want = True;
- }
- break;
-
- case ValuatorClass:
- if (((XValuatorInfo *) pClass)->num_axes > 0)
- {
- DeviceMotionNotify (dev, si->xinput_DeviceMotionNotify,
- dev_info->valuator);
- event_list[nevents++] = dev_info->valuator;
- device_we_want = True;
- }
- break;
-
- default:
- /* ignore other classes of devices/events */
- break;
- }
-
- pClass = (XAnyClassPtr) & ((char *) pClass)[pClass->length];
- }
-
- if (device_we_want)
- si->num_xinput_devices++;
- else
- XCloseDevice (si->dpy, dev);
- }
- }
-
- if (list)
- XFreeDeviceList (list);
-
- if ((nevents == 0) || (si->num_xinput_devices == 0))
- {
- free(event_list);
- free(si->xinput_devices);
- si->xinput_devices = NULL;
- si->num_xinput_devices = 0;
- return;
- }
-
- for (i = 0; i < si->nscreens; i++)
- {
- saver_screen_info *ssi = &si->screens[i];
- Window root = RootWindowOfScreen (ssi->screen);
- XSelectExtensionEvent (si->dpy, root, event_list, nevents);
- }
-
- free(event_list);
-}
-
-#if 0
-/* not used */
-static void
-close_xinput_extension (saver_info *si)
-{
- int i;
-
- for (i = 0; i < si->num_xinput_devices; i++)
- XCloseDevice (si->dpy, si->xinput_devices[i].device);
-
- free(si->xinput_devices);
- si->xinput_devices = NULL;
- si->num_xinput_devices = 0;
-}
-#endif
-#endif /* HAVE_XINPUT */
-
-
-/* SGI SCREEN_SAVER server extension hackery.
- */
-
-#ifdef HAVE_SGI_SAVER_EXTENSION
-
-# include <X11/extensions/XScreenSaver.h>
-
-static void
-init_sgi_saver_extension (saver_info *si)
-{
- saver_preferences *p = &si->prefs;
- int i;
- if (si->screen_blanked_p)
- /* If you mess with this while the server thinks it's active,
- the server crashes. */
- return;
-
- for (i = 0; i < si->nscreens; i++)
- {
- saver_screen_info *ssi = &si->screens[i];
- XScreenSaverDisable (si->dpy, XScreenNumberOfScreen(ssi->screen));
- if (! XScreenSaverEnable (si->dpy, XScreenNumberOfScreen(ssi->screen)))
- {
- fprintf (stderr,
- "%s: SGI SCREEN_SAVER extension exists, but can't be initialized;\n\
- perhaps some other screensaver program is already running?\n",
- blurb());
- si->using_sgi_saver_extension = False;
- return;
- }
- }
-}
-
-#endif /* HAVE_SGI_SAVER_EXTENSION */
-
-
-
-/* Figuring out what the appropriate XSetScreenSaver() parameters are
- (one wouldn't expect this to be rocket science.)
- */
-
-void
-disable_builtin_screensaver (saver_info *si, Bool unblank_screen_p)
-{
- saver_preferences *p = &si->prefs;
- int current_server_timeout, current_server_interval;
- int current_prefer_blank, current_allow_exp;
- int desired_server_timeout, desired_server_interval;
- int desired_prefer_blank, desired_allow_exp;
-
- XGetScreenSaver (si->dpy, &current_server_timeout, &current_server_interval,
- &current_prefer_blank, &current_allow_exp);
-
- desired_server_timeout = current_server_timeout;
- desired_server_interval = current_server_interval;
- desired_prefer_blank = current_prefer_blank;
- desired_allow_exp = current_allow_exp;
-
- /* On SGIs, if interval is non-zero, it is the number of seconds after
- screen saving starts at which the monitor should be powered down.
- Obviously I don't want that, so set it to 0 (meaning "never".)
-
- Power saving is disabled if DontPreferBlanking, but in that case,
- we don't get extension events either. So we can't turn it off that way.
-
- Note: if you're running Irix 6.3 (O2), you may find that your monitor is
- powering down anyway, regardless of the xset settings. This is fixed by
- installing SGI patches 2447 and 2537.
- */
- desired_server_interval = 0;
-
- /* I suspect (but am not sure) that DontAllowExposures might have
- something to do with powering off the monitor as well, at least
- on some systems that don't support XDPMS? Who knows... */
- desired_allow_exp = AllowExposures;
-
- if (si->using_mit_saver_extension || si->using_sgi_saver_extension)
- {
- desired_server_timeout = (p->timeout / 1000);
-
- /* The SGI extension won't give us events unless blanking is on.
- I think (unsure right now) that the MIT extension is the opposite. */
- if (si->using_sgi_saver_extension)
- desired_prefer_blank = PreferBlanking;
- else
- desired_prefer_blank = DontPreferBlanking;
- }
- else
- {
- /* When we're not using an extension, set the server-side timeout to 0,
- so that the server never gets involved with screen blanking, and we
- do it all ourselves. (However, when we *are* using an extension,
- we tell the server when to notify us, and rather than blanking the
- screen, the server will send us an X event telling us to blank.)
- */
- desired_server_timeout = 0;
- }
-
- /* XSetScreenSaver() generates BadValue if either timeout parameter
- exceeds 15 bits (signed short.) That is 09:06:07.
- */
- if (desired_server_timeout > 0x7FFF) desired_server_timeout = 0x7FFF;
- if (desired_server_interval > 0x7FFF) desired_server_interval = 0x7FFF;
-
- if (desired_server_timeout != current_server_timeout ||
- desired_server_interval != current_server_interval ||
- desired_prefer_blank != current_prefer_blank ||
- desired_allow_exp != current_allow_exp)
- {
- if (p->verbose_p)
- fprintf (stderr,
- "%s: disabling server builtin screensaver:\n"
- "%s: (xset s %d %d; xset s %s; xset s %s)\n",
- blurb(), blurb(),
- desired_server_timeout, desired_server_interval,
- (desired_prefer_blank ? "blank" : "noblank"),
- (desired_allow_exp ? "expose" : "noexpose"));
-
- XSetScreenSaver (si->dpy,
- desired_server_timeout, desired_server_interval,
- desired_prefer_blank, desired_allow_exp);
- XSync(si->dpy, False);
- }
-
-
-#if defined(HAVE_MIT_SAVER_EXTENSION) || defined(HAVE_SGI_SAVER_EXTENSION)
- {
- static Bool extension_initted = False;
- if (!extension_initted)
- {
- extension_initted = True;
-# ifdef HAVE_MIT_SAVER_EXTENSION
- if (si->using_mit_saver_extension) init_mit_saver_extension(si);
-# endif
-# ifdef HAVE_SGI_SAVER_EXTENSION
- if (si->using_sgi_saver_extension) init_sgi_saver_extension(si);
-# endif
- }
- }
-#endif /* HAVE_MIT_SAVER_EXTENSION || HAVE_SGI_SAVER_EXTENSION */
-
- if (unblank_screen_p)
- /* Turn off the server builtin saver if it is now running. */
- XForceScreenSaver (si->dpy, ScreenSaverReset);
-}
diff --git a/hacks/Makefile.in b/hacks/Makefile.in
index 7acaeb3..ef6ee5c 100644
--- a/hacks/Makefile.in
+++ b/hacks/Makefile.in
@@ -1,4 +1,4 @@
-# hacks/Makefile.in --- xscreensaver, Copyright (c) 1997-2015 Jamie Zawinski.
+# hacks/Makefile.in --- xscreensaver, Copyright © 1997-2021 Jamie Zawinski.
# the `../configure' script generates `hacks/Makefile' from this file.
@SET_MAKE@
@@ -49,13 +49,12 @@ X_CFLAGS = @X_CFLAGS@
X_LIBS = @X_LIBS@
X_PRE_LIBS = @X_PRE_LIBS@
X_EXTRA_LIBS = @X_EXTRA_LIBS@
-XMU_LIBS = @XMU_LIBS@
XFT_LIBS = @XFT_LIBS@
# Note: see comment in ../driver/Makefile.in for explanation of X_LIBS, etc.
#
HACK_PRE = $(LIBS) $(X_LIBS)
-HACK_POST = $(X_PRE_LIBS) $(XFT_LIBS) -lXt -lX11 $(XMU_LIBS) -lXext $(X_EXTRA_LIBS) -lm
+HACK_POST = $(X_PRE_LIBS) $(XFT_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS) -lm
HACK_LIBS = $(HACK_PRE) @ANIM_LIBS@ @HACK_LIBS@ $(HACK_POST)
PNG_LIBS = $(HACK_PRE) @PNG_LIBS@ @HACK_LIBS@ $(HACK_POST)
JPEG_LIBS = @JPEG_LIBS@
@@ -90,9 +89,10 @@ UTIL_OBJS = $(UTILS_BIN)/alpha.o $(UTILS_BIN)/colors.o \
$(UTILS_BIN)/textclient.o $(UTILS_BIN)/aligned_malloc.o \
$(UTILS_BIN)/thread_util.o $(UTILS_BIN)/pow2.o \
$(UTILS_BIN)/xft.o $(UTILS_BIN)/utf8wc.o \
- $(UTILS_BIN)/font-retry-xft.o
+ $(UTILS_BIN)/font-retry.o
-SRCS = attraction.c blitspin.c bouboule.c braid.c bubbles.c \
+SRCS = xscreensaver-getimage.c \
+ attraction.c blitspin.c bouboule.c braid.c bubbles.c \
bubbles-default.c decayscreen.c deco.c drift.c flag.c \
flame.c forest.c vines.c galaxy.c grav.c greynetic.c \
halo.c helix.c hopalong.c hypercube.c ifs.c imsmap.c \
@@ -102,7 +102,7 @@ SRCS = attraction.c blitspin.c bouboule.c braid.c bubbles.c \
slip.c sphere.c spiral.c strange.c swirl.c xlockmore.c \
fps.c goop.c starfish.c munch.c fadeplot.c \
rd-bomb.c coral.c mountain.c triangle.c lissie.c worm.c \
- rotor.c ant.c xjack.c xlyap.c xscreensaver-sgigl.c \
+ rotor.c ant.c xjack.c xlyap.c \
cynosure.c moire2.c flow.c epicycle.c interference.c \
truchet.c bsod.c crystal.c discrete.c distort.c kumppa.c \
demon.c loop.c t3d.c penetrate.c deluxe.c compass.c \
@@ -124,15 +124,12 @@ SRCS = attraction.c blitspin.c bouboule.c braid.c bubbles.c \
tessellimage.c delaunay.c recanim.c binaryring.c \
glitchpeg.c vfeedback.c scooter.c webcollage-cocoa.m \
webcollage-helper-cocoa.m testx11.c
-SCRIPTS = vidwhacker webcollage ljlatest
+SCRIPTS = xscreensaver-getimage-file xscreensaver-getimage-video \
+ xscreensaver-text vidwhacker webcollage
# Programs that are mentioned in XScreenSaver.ad, and that have XML files,
# but that are not shipped with xscreensaver itself.
#
-EXTERNALS = cosmos electricsheep fireflies goban \
- sphereeversion ssystem xaos xdaliclock xearth xfishtank \
- xmountains xplanet xsnow
-
OBJS = attraction.o blitspin.o bouboule.o braid.o bubbles.o \
bubbles-default.o decayscreen.o deco.o drift.o flag.o \
flame.o forest.o vines.o galaxy.o grav.o greynetic.o \
@@ -143,7 +140,7 @@ OBJS = attraction.o blitspin.o bouboule.o braid.o bubbles.o \
slip.o sphere.o spiral.o strange.o swirl.o xlockmore.o \
fps.o goop.o starfish.o munch.o fadeplot.o \
rd-bomb.o coral.o mountain.o triangle.o lissie.o worm.o \
- rotor.o ant.o xjack.o xlyap.o xscreensaver-sgigl.o \
+ rotor.o ant.o xjack.o xlyap.o xscreensaver-getimage.o \
cynosure.o moire2.o flow.o epicycle.o interference.o \
truchet.o bsod.o crystal.o discrete.o distort.o kumppa.o \
demon.o loop.o t3d.o penetrate.o deluxe.o compass.o \
@@ -187,27 +184,26 @@ EXES = attraction blitspin bouboule braid decayscreen deco \
intermomentary fireworkx fiberlamp boxfit interaggregate \
celtic cwaves m6502 abstractile lcdscrub hexadrop \
tessellimage binaryring glitchpeg vfeedback scooter \
- @JPEG_EXES@
+ xscreensaver-getimage @JPEG_EXES@
JPEG_EXES = webcollage-helper
RETIRED_EXES = ant bubbles critical flag forest hyperball hypercube laser \
lightning lisa lissie lmorph rotor sphere spiral t3d vines \
- whirlygig worm xsublim juggle testx11
+ whirlygig worm xsublim juggle
HACK_OBJS_1 = fps.o $(UTILS_BIN)/resources.o $(UTILS_BIN)/visual.o \
$(UTILS_BIN)/usleep.o $(UTILS_BIN)/yarandom.o \
- $(UTILS_BIN)/utf8wc.o $(UTILS_BIN)/font-retry-xft.o \
- @XMU_OBJS@ @XFT_OBJS@ @ANIM_OBJS@
+ $(UTILS_BIN)/utf8wc.o $(UTILS_BIN)/font-retry.o \
+ $(UTILS_BIN)/xmu.o @XFT_OBJS@ @ANIM_OBJS@
HACK_OBJS = screenhack.o $(HACK_OBJS_1)
XLOCK_OBJS = screenhack.o xlockmore.o $(COLOR_OBJS) $(HACK_OBJS_1) \
$(ERASE)
COLOR_OBJS = $(UTILS_BIN)/hsv.o $(UTILS_BIN)/colors.o
GRAB_OBJS = $(UTILS_BIN)/grabclient.o
-XSHM_OBJS = $(UTILS_BIN)/xshm.o
+XSHM_OBJS = $(UTILS_BIN)/xshm.o $(UTILS_BIN)/aligned_malloc.o
XDBE_OBJS = $(UTILS_BIN)/xdbe.o
ANIM_OBJS = recanim.o
ANIM_LIBS = @PNG_LIBS@
-THREAD_OBJS = $(UTILS_BIN)/aligned_malloc.o $(UTILS_BIN)/thread_util.o
HDRS = screenhack.h screenhackI.h fps.h fpsI.h xlockmore.h \
xlockmoreI.h automata.h bubbles.h ximage-loader.h \
@@ -238,14 +234,18 @@ MEN = anemone.man apollonian.man attraction.man \
xflame.man xjack.man xlyap.man xmatrix.man \
xrayswarm.man xspirograph.man \
zoom.man halftone.man eruption.man metaballs.man \
- barcode.man piecewise.man cloudlife.man ljlatest.man \
+ barcode.man piecewise.man cloudlife.man \
fontglide.man apple2.man xanalogtv.man filmleader.man \
pong.man wormhole.man pacman.man fuzzyflakes.man \
anemotaxis.man memscroller.man substrate.man \
intermomentary.man fireworkx.man fiberlamp.man boxfit.man \
interaggregate.man celtic.man cwaves.man abstractile.man \
lcdscrub.man hexadrop.man tessellimage.man binaryring.man \
- glitchpeg.man vfeedback.man scooter.man
+ glitchpeg.man vfeedback.man scooter.man \
+ xscreensaver-text.man \
+ xscreensaver-getimage.man \
+ xscreensaver-getimage-file.man \
+ xscreensaver-getimage-video.man
RETIRED_MEN = ant.man bubbles.man critical.man flag.man forest.man \
laser.man lightning.man lisa.man lissie.man lmorph.man \
@@ -261,11 +261,7 @@ EXTRAS = README Makefile.in xml2man.pl m6502.sh .gdbinit \
config/$(STAR).dtd \
config/$(STAR).xsd \
-VMSFILES = compile_axp.com compile_decc.com link_axp.com link_decc.com \
- vms_axp.opt vms_axp_12.opt vms_decc.opt vms_decc_12.opt
-
-TARFILES = $(SRCS) $(HDRS) $(SCRIPTS) $(MEN) $(RETIRED_MEN) \
- $(EXTRAS) $(VMSFILES)
+TARFILES = $(SRCS) $(HDRS) $(SCRIPTS) $(MEN) $(RETIRED_MEN) $(EXTRAS)
default: all
@@ -330,7 +326,8 @@ munge-scripts: $(SCRIPTS)
install-man: $(MEN)
@men="$(MEN)" ; \
U=$(UTILS_SRC)/version.h ; \
- V=`sed -n 's/.*xscreensaver \([0-9]\.[^)]*)\).*/\1/p' < $$U` ; \
+ V=`sed -n 's/.*xscreensaver \([0-9]\.[^)]*)\).*/\1/p' < $$U | \
+ head -1`; \
T=/tmp/xs$$$$.$(mansuffix) ; \
TH=".TH XScreenSaver $(mansuffix) \"$$V\" \"X Version 11\"" ; \
echo "installing man pages: $$TH" ; \
@@ -359,7 +356,7 @@ install-xml:
$(INSTALL_DIRS) $$dest ; \
fi ; \
src=$(srcdir)/config ; \
- for file in $(EXES) $(SCRIPTS) $(EXTERNALS) ; do \
+ for file in $(EXES) $(SCRIPTS) ; do \
if [ -f $$src/$$file.xml ]; then \
echo $(INSTALL_DATA) $$src/$$file.xml $$dest/$$file.xml ; \
$(INSTALL_DATA) $$src/$$file.xml $$dest/$$file.xml ; \
@@ -382,13 +379,13 @@ uninstall-man:
uninstall-xml:
@dest=$(install_prefix)$(HACK_CONF_DIR) ; \
- for file in $(EXES) $(RETIRED_EXES) $(SCRIPTS) $(EXTERNALS) ; do \
+ for file in $(EXES) $(RETIRED_EXES) $(SCRIPTS) ; do \
echo rm -f $$dest/$$file.xml ; \
rm -f $$dest/$$file.xml ; \
done
clean::
- -rm -f *.o a.out core $(EXES) $(RETIRED_EXES) m6502.h
+ -rm -f *.o a.out core $(EXES) $(RETIRED_EXES) m6502.h testx11
distclean: clean
-rm -f Makefile TAGS *~ "#"*
@@ -429,8 +426,9 @@ TAGS: tags
tags:
find $(srcdir) -name '*.[chly]' -print | xargs etags -a
-echo_tarfiles:
- @echo $(TARFILES)
+list_tarfiles:
+ @find $(TARFILES) -type f -print | sort
+
check_men:
@badmen="" ; \
@@ -457,55 +455,6 @@ munge_ad_file:
@echo "Updating hack list in XScreenSaver.ad.in..." ; \
cd $(srcdir) ; ./munge-ad.pl ../driver/XScreenSaver.ad.in
-
-# Rules for generating the VMS makefiles on Unix, so that it doesn't have to
-# be done by hand...
-#
-VMS_AXP_COMPILE_1=$$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE
-VMS_AXP_COMPILE_2=)/INCL=([],[-],[-.UTILS])
-
-compile_axp.com: Makefile.in
- @echo generating $@ from $<... ; \
- ( for c in $(SRCS) ; do \
- c=`echo $$c | tr a-z A-Z` ; \
- echo "$(VMS_AXP_COMPILE_1)$(VMS_AXP_COMPILE_2) $$c" ; \
- done ; \
- ) | sort -d > $@
-
-compile_decc.com: compile_axp.com
- @echo generating $@ from $<... ; \
- sed 's/axp/decc/g' < $< > $@
-
-#### TODO: generating link_axp.com is kinda tricky...
-
-link_decc.com: link_axp.com
- @echo generating $@ from $<... ; \
- sed 's/axp/decc/g' < $< > $@
-
-$(srcdir)/../setup.com: Makefile.in
- @echo generating $@ from $<... ; \
- ( echo '$$! Xscreensaver - definition of various DCL symbols' ; \
- echo '$$ set NOON' ; \
- echo '$$ set def [.HACKS]' ; \
- echo '$$ mydisk = f$$trnlmn("SYS$$DISK")' ; \
- echo '$$ mydir = mydisk+f$$directory()' ; \
- ( for c in $(EXES) ; do \
- c2="$${c} " ; \
- c2=`echo "$${c2}" | sed 's/^\(........*\) $$/\1/'` ; \
- echo '$$' "$${c2}:== $$'mydir'$${c}" ; \
- done ; \
- ) | sort -d ; \
- echo '$$ set def [-.DRIVER]' ; \
- echo '$$ mydir = mydisk+f$$directory()' ; \
- echo "$$ xscreensaver :== $$'mydir'xscreensaver" ; \
- echo "$$ xscreen*command :== $$'mydir'xscreensaver-command" ; \
- echo '$$ set def [-]' ; \
- echo '$$ exit' ; \
- ) > $@
-
-distdepend:: compile_axp.com compile_decc.com
-distdepend:: link_axp.com link_decc.com
-distdepend:: $(srcdir)/../setup.com
distdepend:: check_men validate_xml munge_ad_file
@@ -532,12 +481,19 @@ $(UTILS_BIN)/textclient.o: $(UTILS_SRC)/textclient.c
$(UTILS_BIN)/aligned_malloc.o: $(UTILS_SRC)/aligned_malloc.c
$(UTILS_BIN)/thread_util.o: $(UTILS_SRC)/thread_util.c
$(UTILS_BIN)/pow2.o: $(UTILS_SRC)/pow2.c
-$(UTILS_BIN)/font-retry-xft.o: $(UTILS_SRC)/font-retry.c
+$(UTILS_BIN)/font-retry.o: $(UTILS_SRC)/font-retry.c
$(UTIL_OBJS):
cd $(UTILS_BIN) ; \
$(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)"
+# For xscreensaver-getimage
+$(srcdir)/../driver/prefs.o: $(srcdir)/../driver/prefs.c
+$(srcdir)/../driver/prefs.o:
+ cd $(srcdir)/../driver ; \
+ $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)"
+
+
# How we build object files in this directory.
HACK_CFLAGS_BASE=$(INCLUDES) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS)
.c.o:
@@ -555,30 +511,44 @@ SPL = $(UTILS_BIN)/spline.o
GRAB = $(GRAB_OBJS)
ERASE = $(UTILS_BIN)/erase.o
COL = $(COLOR_OBJS)
-SHM = $(XSHM_OBJS) $(THREAD_OBJS)
+SHM = $(XSHM_OBJS)
DBE = $(XDBE_OBJS)
BARS = $(UTILS_BIN)/colorbars.o
-THRO = $(THREAD_OBJS)
+THRO = $(UTILS_BIN)/thread_util.o
THRL = $(THREAD_CFLAGS) $(THREAD_LIBS)
-ATV = analogtv.o $(SHM)
+ATV = analogtv.o $(SHM) $(THRO)
APPLE2 = apple2.o $(ATV)
TEXT = $(UTILS_BIN)/textclient.o
CC_HACK = $(CC) $(LDFLAGS)
-xscreensaver-sgigl: xscreensaver-sgigl.c
- $(CC) $(LDFLAGS) -o $@ $< -I$(UTILS_SRC) $(HACK_PRE) \
- $(XMU_LIBS) -lX11 -lXext $(X_EXTRA_LIBS) -lm
-
test-utf8wc: $(UTILS_SRC)/utf8wc.c
- $(CC) $(HACK_CFLAGS_BASE) $(LDFLAGS)\
- -o $@ -DSELFTEST $<
+ $(CC) $(HACK_CFLAGS_BASE) $(LDFLAGS) -o $@ -DSELFTEST $<
-# Make sure the images have been packaged. This is the first one hit:
-images/gen/som_png.h:
- cd $(srcdir)/images && $(MAKE)
-images/gen/6x10font_png.h:
+# Make sure the images have been packaged. These are the first ones hit.
+#
+images/gen/som_png.h images/gen/6x10font_png.h:
cd $(srcdir)/images && $(MAKE)
+ @if ! [ -f "$@" ]; then \
+ echo; echo $@ "wasn't built -- try 'gmake' instead?"; echo; exit 1; \
+ fi
+
+GETIMG_OBJS = xscreensaver-getimage.o \
+ $(UTILS_BIN)/colorbars.o $(UTILS_BIN)/resources.o \
+ $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/visual.o \
+ $(UTILS_BIN)/usleep.o $(UTILS_BIN)/hsv.o \
+ $(UTILS_BIN)/colors.o $(UTILS_BIN)/grabscreen.o \
+ $(UTILS_BIN)/logo.o $(UTILS_BIN)/minixpm.o \
+ $(UTILS_BIN)/xmu.o \
+ $(srcdir)/../driver/prefs.o
+GETIMG_LIBS = $(LIBS) $(X_LIBS) $(PNG_LIBS) $(JPEG_LIBS) \
+ $(X_PRE_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS)
+
+# xscreensaver-getimage.o: XScreenSaver_ad.h
+xscreensaver-getimage: $(GETIMG_OBJS)
+ $(CC) $(LDFLAGS) -o $@ $(GETIMG_OBJS) $(GETIMG_LIBS) -lm
+
+
# The rules for those hacks which follow the `screenhack.c' API.
# If make wasn't such an utter abomination, these could all be combined
@@ -665,7 +635,7 @@ starfish: starfish.o $(HACK_OBJS) $(COL) $(SPL)
$(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SPL) $(HACK_LIBS)
munch: munch.o $(HACK_OBJS) $(COL) $(SPL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SPL) $(HACK_LIBS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SPL) $(UTILS_BIN)/pow2.o $(HACK_LIBS)
rd-bomb: rd-bomb.o $(HACK_OBJS) $(COL) $(SHM)
$(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SHM) $(HACK_LIBS) $(THRL)
@@ -685,8 +655,8 @@ cynosure: cynosure.o $(HACK_OBJS) $(COL)
epicycle: epicycle.o $(HACK_OBJS) $(COL) $(ERASE)
$(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
-interference: interference.o $(HACK_OBJS) $(COL) $(SHM) $(DBE)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SHM) $(DBE) $(HACK_LIBS) $(THRL)
+interference: interference.o $(HACK_OBJS) $(COL) $(SHM) $(THRO) $(DBE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SHM) $(THRO) $(DBE) $(HACK_LIBS) $(THRL)
truchet: truchet.o $(HACK_OBJS) $(COL)
$(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
@@ -709,7 +679,8 @@ analogtv2.o: $(srcdir)/analogtv.c
analogtv-cli.o: $(srcdir)/analogtv-cli.c
$(CC) -o $@ -c $(ATVCLI_CFLAGS) $<
-ATVCLI=analogtv2.o $(UTILS_BIN)/yarandom.o $(THRO) $(PNG)
+ATVCLI = analogtv2.o $(UTILS_BIN)/yarandom.o \
+ $(UTILS_BIN)/aligned_malloc.o $(THRO) $(PNG) @ANIM_OBJS@
analogtv-cli: analogtv-cli.o $(ATVCLI)
$(CC_HACK) -o $@ $@.o $(ATVCLI) $(THRL) $(PNG_LIBS) -lpng
clean::
@@ -972,8 +943,8 @@ sphere: sphere.o $(XLOCK_OBJS)
spiral: spiral.o $(XLOCK_OBJS)
$(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-strange: strange.o $(XLOCK_OBJS) $(SHM) $(UTILS_BIN)/pow2.o
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(SHM) $(UTILS_BIN)/pow2.o $(HACK_LIBS) $(THRL)
+strange: strange.o $(XLOCK_OBJS) $(SHM) $(THRO) $(UTILS_BIN)/pow2.o
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(SHM) $(THRO) $(UTILS_BIN)/pow2.o $(HACK_LIBS) $(THRL)
swirl: swirl.o $(XLOCK_OBJS) $(SHM)
$(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(SHM) $(HACK_LIBS) $(THRL)
@@ -1061,14 +1032,23 @@ abstractile.o: $(UTILS_SRC)/hsv.h
abstractile.o: $(UTILS_SRC)/resources.h
abstractile.o: $(UTILS_SRC)/usleep.h
abstractile.o: $(UTILS_SRC)/visual.h
+abstractile.o: $(UTILS_SRC)/xft.h
abstractile.o: $(UTILS_SRC)/yarandom.h
analogtv-cli.o: $(srcdir)/analogtv.h
analogtv-cli.o: ../config.h
+analogtv-cli.o: $(srcdir)/fps.h
+analogtv-cli.o: $(srcdir)/recanim.h
+analogtv-cli.o: $(srcdir)/screenhackI.h
analogtv-cli.o: $(UTILS_SRC)/aligned_malloc.h
+analogtv-cli.o: $(UTILS_SRC)/colors.h
analogtv-cli.o: $(UTILS_SRC)/font-retry.h
+analogtv-cli.o: $(UTILS_SRC)/grabscreen.h
+analogtv-cli.o: $(UTILS_SRC)/hsv.h
analogtv-cli.o: $(UTILS_SRC)/resources.h
analogtv-cli.o: $(UTILS_SRC)/thread_util.h
+analogtv-cli.o: $(UTILS_SRC)/usleep.h
analogtv-cli.o: $(UTILS_SRC)/visual.h
+analogtv-cli.o: $(UTILS_SRC)/xft.h
analogtv-cli.o: $(UTILS_SRC)/xshm.h
analogtv-cli.o: $(UTILS_SRC)/yarandom.h
analogtv-cli.o: $(srcdir)/ximage-loader.h
@@ -1082,6 +1062,7 @@ analogtv.o: $(UTILS_SRC)/resources.h
analogtv.o: $(UTILS_SRC)/thread_util.h
analogtv.o: $(UTILS_SRC)/utils.h
analogtv.o: $(UTILS_SRC)/visual.h
+analogtv.o: $(UTILS_SRC)/xft.h
analogtv.o: $(UTILS_SRC)/xshm.h
analogtv.o: $(UTILS_SRC)/yarandom.h
analogtv.o: $(srcdir)/ximage-loader.h
@@ -1098,6 +1079,7 @@ anemone.o: $(UTILS_SRC)/resources.h
anemone.o: $(UTILS_SRC)/usleep.h
anemone.o: $(UTILS_SRC)/visual.h
anemone.o: $(UTILS_SRC)/xdbe.h
+anemone.o: $(UTILS_SRC)/xft.h
anemone.o: $(UTILS_SRC)/yarandom.h
anemotaxis.o: ../config.h
anemotaxis.o: $(srcdir)/fps.h
@@ -1112,6 +1094,7 @@ anemotaxis.o: $(UTILS_SRC)/resources.h
anemotaxis.o: $(UTILS_SRC)/usleep.h
anemotaxis.o: $(UTILS_SRC)/visual.h
anemotaxis.o: $(UTILS_SRC)/xdbe.h
+anemotaxis.o: $(UTILS_SRC)/xft.h
anemotaxis.o: $(UTILS_SRC)/yarandom.h
ant.o: $(srcdir)/automata.h
ant.o: ../config.h
@@ -1126,6 +1109,7 @@ ant.o: $(UTILS_SRC)/hsv.h
ant.o: $(UTILS_SRC)/resources.h
ant.o: $(UTILS_SRC)/usleep.h
ant.o: $(UTILS_SRC)/visual.h
+ant.o: $(UTILS_SRC)/xft.h
ant.o: $(UTILS_SRC)/yarandom.h
ant.o: $(srcdir)/xlockmoreI.h
ant.o: $(srcdir)/xlockmore.h
@@ -1141,6 +1125,7 @@ apollonian.o: $(UTILS_SRC)/hsv.h
apollonian.o: $(UTILS_SRC)/resources.h
apollonian.o: $(UTILS_SRC)/usleep.h
apollonian.o: $(UTILS_SRC)/visual.h
+apollonian.o: $(UTILS_SRC)/xft.h
apollonian.o: $(UTILS_SRC)/yarandom.h
apollonian.o: $(srcdir)/xlockmoreI.h
apollonian.o: $(srcdir)/xlockmore.h
@@ -1162,6 +1147,7 @@ apple2-main.o: $(UTILS_SRC)/thread_util.h
apple2-main.o: $(UTILS_SRC)/usleep.h
apple2-main.o: $(UTILS_SRC)/utf8wc.h
apple2-main.o: $(UTILS_SRC)/visual.h
+apple2-main.o: $(UTILS_SRC)/xft.h
apple2-main.o: $(UTILS_SRC)/xshm.h
apple2-main.o: $(UTILS_SRC)/yarandom.h
apple2.o: $(srcdir)/analogtv.h
@@ -1180,6 +1166,7 @@ apple2.o: $(UTILS_SRC)/resources.h
apple2.o: $(UTILS_SRC)/thread_util.h
apple2.o: $(UTILS_SRC)/usleep.h
apple2.o: $(UTILS_SRC)/visual.h
+apple2.o: $(UTILS_SRC)/xft.h
apple2.o: $(UTILS_SRC)/xshm.h
apple2.o: $(UTILS_SRC)/yarandom.h
apple2.o: $(srcdir)/ximage-loader.h
@@ -1199,6 +1186,7 @@ attraction.o: $(UTILS_SRC)/resources.h
attraction.o: $(UTILS_SRC)/spline.h
attraction.o: $(UTILS_SRC)/usleep.h
attraction.o: $(UTILS_SRC)/visual.h
+attraction.o: $(UTILS_SRC)/xft.h
attraction.o: $(UTILS_SRC)/yarandom.h
barcode.o: ../config.h
barcode.o: $(srcdir)/fps.h
@@ -1212,6 +1200,7 @@ barcode.o: $(UTILS_SRC)/hsv.h
barcode.o: $(UTILS_SRC)/resources.h
barcode.o: $(UTILS_SRC)/usleep.h
barcode.o: $(UTILS_SRC)/visual.h
+barcode.o: $(UTILS_SRC)/xft.h
barcode.o: $(UTILS_SRC)/yarandom.h
binaryring.o: ../config.h
binaryring.o: $(srcdir)/fps.h
@@ -1225,6 +1214,7 @@ binaryring.o: $(UTILS_SRC)/hsv.h
binaryring.o: $(UTILS_SRC)/resources.h
binaryring.o: $(UTILS_SRC)/usleep.h
binaryring.o: $(UTILS_SRC)/visual.h
+binaryring.o: $(UTILS_SRC)/xft.h
binaryring.o: $(UTILS_SRC)/yarandom.h
blaster.o: ../config.h
blaster.o: $(srcdir)/fps.h
@@ -1238,6 +1228,7 @@ blaster.o: $(UTILS_SRC)/hsv.h
blaster.o: $(UTILS_SRC)/resources.h
blaster.o: $(UTILS_SRC)/usleep.h
blaster.o: $(UTILS_SRC)/visual.h
+blaster.o: $(UTILS_SRC)/xft.h
blaster.o: $(UTILS_SRC)/yarandom.h
blitspin.o: ../config.h
blitspin.o: $(srcdir)/fps.h
@@ -1253,6 +1244,7 @@ blitspin.o: $(UTILS_SRC)/pow2.h
blitspin.o: $(UTILS_SRC)/resources.h
blitspin.o: $(UTILS_SRC)/usleep.h
blitspin.o: $(UTILS_SRC)/visual.h
+blitspin.o: $(UTILS_SRC)/xft.h
blitspin.o: $(UTILS_SRC)/yarandom.h
blitspin.o: $(srcdir)/ximage-loader.h
bouboule.o: ../config.h
@@ -1267,6 +1259,7 @@ bouboule.o: $(UTILS_SRC)/hsv.h
bouboule.o: $(UTILS_SRC)/resources.h
bouboule.o: $(UTILS_SRC)/usleep.h
bouboule.o: $(UTILS_SRC)/visual.h
+bouboule.o: $(UTILS_SRC)/xft.h
bouboule.o: $(UTILS_SRC)/yarandom.h
bouboule.o: $(srcdir)/xlockmoreI.h
bouboule.o: $(srcdir)/xlockmore.h
@@ -1282,6 +1275,7 @@ boxfit.o: $(UTILS_SRC)/hsv.h
boxfit.o: $(UTILS_SRC)/resources.h
boxfit.o: $(UTILS_SRC)/usleep.h
boxfit.o: $(UTILS_SRC)/visual.h
+boxfit.o: $(UTILS_SRC)/xft.h
boxfit.o: $(UTILS_SRC)/yarandom.h
boxfit.o: $(srcdir)/ximage-loader.h
braid.o: ../config.h
@@ -1296,6 +1290,7 @@ braid.o: $(UTILS_SRC)/hsv.h
braid.o: $(UTILS_SRC)/resources.h
braid.o: $(UTILS_SRC)/usleep.h
braid.o: $(UTILS_SRC)/visual.h
+braid.o: $(UTILS_SRC)/xft.h
braid.o: $(UTILS_SRC)/yarandom.h
braid.o: $(srcdir)/xlockmoreI.h
braid.o: $(srcdir)/xlockmore.h
@@ -1309,6 +1304,8 @@ bsod.o: images/gen/apple_png.h
bsod.o: images/gen/atari_png.h
bsod.o: images/gen/atm_png.h
bsod.o: images/gen/dvd_png.h
+bsod.o: images/gen/gnome1_png.h
+bsod.o: images/gen/gnome2_png.h
bsod.o: images/gen/hmac_png.h
bsod.o: images/gen/macbomb_png.h
bsod.o: images/gen/mac_png.h
@@ -1328,6 +1325,7 @@ bsod.o: $(UTILS_SRC)/resources.h
bsod.o: $(UTILS_SRC)/thread_util.h
bsod.o: $(UTILS_SRC)/usleep.h
bsod.o: $(UTILS_SRC)/visual.h
+bsod.o: $(UTILS_SRC)/xft.h
bsod.o: $(UTILS_SRC)/xshm.h
bsod.o: $(UTILS_SRC)/yarandom.h
bsod.o: $(srcdir)/ximage-loader.h
@@ -1391,6 +1389,7 @@ bubbles.o: $(UTILS_SRC)/hsv.h
bubbles.o: $(UTILS_SRC)/resources.h
bubbles.o: $(UTILS_SRC)/usleep.h
bubbles.o: $(UTILS_SRC)/visual.h
+bubbles.o: $(UTILS_SRC)/xft.h
bubbles.o: $(UTILS_SRC)/yarandom.h
bubbles.o: $(srcdir)/ximage-loader.h
bumps.o: ../config.h
@@ -1405,6 +1404,7 @@ bumps.o: $(UTILS_SRC)/hsv.h
bumps.o: $(UTILS_SRC)/resources.h
bumps.o: $(UTILS_SRC)/usleep.h
bumps.o: $(UTILS_SRC)/visual.h
+bumps.o: $(UTILS_SRC)/xft.h
bumps.o: $(UTILS_SRC)/xshm.h
bumps.o: $(UTILS_SRC)/yarandom.h
ccurve.o: ../config.h
@@ -1420,6 +1420,7 @@ ccurve.o: $(UTILS_SRC)/hsv.h
ccurve.o: $(UTILS_SRC)/resources.h
ccurve.o: $(UTILS_SRC)/usleep.h
ccurve.o: $(UTILS_SRC)/visual.h
+ccurve.o: $(UTILS_SRC)/xft.h
ccurve.o: $(UTILS_SRC)/yarandom.h
celtic.o: ../config.h
celtic.o: $(srcdir)/fps.h
@@ -1434,6 +1435,7 @@ celtic.o: $(UTILS_SRC)/hsv.h
celtic.o: $(UTILS_SRC)/resources.h
celtic.o: $(UTILS_SRC)/usleep.h
celtic.o: $(UTILS_SRC)/visual.h
+celtic.o: $(UTILS_SRC)/xft.h
celtic.o: $(UTILS_SRC)/yarandom.h
cloudlife.o: ../config.h
cloudlife.o: $(srcdir)/fps.h
@@ -1447,6 +1449,7 @@ cloudlife.o: $(UTILS_SRC)/hsv.h
cloudlife.o: $(UTILS_SRC)/resources.h
cloudlife.o: $(UTILS_SRC)/usleep.h
cloudlife.o: $(UTILS_SRC)/visual.h
+cloudlife.o: $(UTILS_SRC)/xft.h
cloudlife.o: $(UTILS_SRC)/yarandom.h
compass.o: ../config.h
compass.o: $(srcdir)/fps.h
@@ -1461,6 +1464,7 @@ compass.o: $(UTILS_SRC)/resources.h
compass.o: $(UTILS_SRC)/usleep.h
compass.o: $(UTILS_SRC)/visual.h
compass.o: $(UTILS_SRC)/xdbe.h
+compass.o: $(UTILS_SRC)/xft.h
compass.o: $(UTILS_SRC)/yarandom.h
coral.o: ../config.h
coral.o: $(srcdir)/fps.h
@@ -1475,6 +1479,7 @@ coral.o: $(UTILS_SRC)/hsv.h
coral.o: $(UTILS_SRC)/resources.h
coral.o: $(UTILS_SRC)/usleep.h
coral.o: $(UTILS_SRC)/visual.h
+coral.o: $(UTILS_SRC)/xft.h
coral.o: $(UTILS_SRC)/yarandom.h
critical.o: ../config.h
critical.o: $(srcdir)/fps.h
@@ -1489,6 +1494,7 @@ critical.o: $(UTILS_SRC)/hsv.h
critical.o: $(UTILS_SRC)/resources.h
critical.o: $(UTILS_SRC)/usleep.h
critical.o: $(UTILS_SRC)/visual.h
+critical.o: $(UTILS_SRC)/xft.h
critical.o: $(UTILS_SRC)/yarandom.h
crystal.o: ../config.h
crystal.o: $(srcdir)/fps.h
@@ -1502,6 +1508,7 @@ crystal.o: $(UTILS_SRC)/hsv.h
crystal.o: $(UTILS_SRC)/resources.h
crystal.o: $(UTILS_SRC)/usleep.h
crystal.o: $(UTILS_SRC)/visual.h
+crystal.o: $(UTILS_SRC)/xft.h
crystal.o: $(UTILS_SRC)/yarandom.h
crystal.o: $(srcdir)/xlockmoreI.h
crystal.o: $(srcdir)/xlockmore.h
@@ -1517,6 +1524,7 @@ cwaves.o: $(UTILS_SRC)/hsv.h
cwaves.o: $(UTILS_SRC)/resources.h
cwaves.o: $(UTILS_SRC)/usleep.h
cwaves.o: $(UTILS_SRC)/visual.h
+cwaves.o: $(UTILS_SRC)/xft.h
cwaves.o: $(UTILS_SRC)/yarandom.h
cwaves.o: $(srcdir)/ximage-loader.h
cynosure.o: ../config.h
@@ -1531,6 +1539,7 @@ cynosure.o: $(UTILS_SRC)/hsv.h
cynosure.o: $(UTILS_SRC)/resources.h
cynosure.o: $(UTILS_SRC)/usleep.h
cynosure.o: $(UTILS_SRC)/visual.h
+cynosure.o: $(UTILS_SRC)/xft.h
cynosure.o: $(UTILS_SRC)/yarandom.h
decayscreen.o: ../config.h
decayscreen.o: $(srcdir)/fps.h
@@ -1544,6 +1553,7 @@ decayscreen.o: $(UTILS_SRC)/hsv.h
decayscreen.o: $(UTILS_SRC)/resources.h
decayscreen.o: $(UTILS_SRC)/usleep.h
decayscreen.o: $(UTILS_SRC)/visual.h
+decayscreen.o: $(UTILS_SRC)/xft.h
decayscreen.o: $(UTILS_SRC)/yarandom.h
deco.o: ../config.h
deco.o: $(srcdir)/fps.h
@@ -1557,8 +1567,8 @@ deco.o: $(UTILS_SRC)/hsv.h
deco.o: $(UTILS_SRC)/resources.h
deco.o: $(UTILS_SRC)/usleep.h
deco.o: $(UTILS_SRC)/visual.h
+deco.o: $(UTILS_SRC)/xft.h
deco.o: $(UTILS_SRC)/yarandom.h
-delaunay.o: ../config.h
delaunay.o: $(srcdir)/delaunay.h
deluxe.o: ../config.h
deluxe.o: $(srcdir)/fps.h
@@ -1574,6 +1584,7 @@ deluxe.o: $(UTILS_SRC)/resources.h
deluxe.o: $(UTILS_SRC)/usleep.h
deluxe.o: $(UTILS_SRC)/visual.h
deluxe.o: $(UTILS_SRC)/xdbe.h
+deluxe.o: $(UTILS_SRC)/xft.h
deluxe.o: $(UTILS_SRC)/yarandom.h
demon.o: $(srcdir)/automata.h
demon.o: ../config.h
@@ -1588,6 +1599,7 @@ demon.o: $(UTILS_SRC)/hsv.h
demon.o: $(UTILS_SRC)/resources.h
demon.o: $(UTILS_SRC)/usleep.h
demon.o: $(UTILS_SRC)/visual.h
+demon.o: $(UTILS_SRC)/xft.h
demon.o: $(UTILS_SRC)/yarandom.h
demon.o: $(srcdir)/xlockmoreI.h
demon.o: $(srcdir)/xlockmore.h
@@ -1603,6 +1615,7 @@ discrete.o: $(UTILS_SRC)/hsv.h
discrete.o: $(UTILS_SRC)/resources.h
discrete.o: $(UTILS_SRC)/usleep.h
discrete.o: $(UTILS_SRC)/visual.h
+discrete.o: $(UTILS_SRC)/xft.h
discrete.o: $(UTILS_SRC)/yarandom.h
discrete.o: $(srcdir)/xlockmoreI.h
discrete.o: $(srcdir)/xlockmore.h
@@ -1618,6 +1631,7 @@ distort.o: $(UTILS_SRC)/hsv.h
distort.o: $(UTILS_SRC)/resources.h
distort.o: $(UTILS_SRC)/usleep.h
distort.o: $(UTILS_SRC)/visual.h
+distort.o: $(UTILS_SRC)/xft.h
distort.o: $(UTILS_SRC)/xshm.h
distort.o: $(UTILS_SRC)/yarandom.h
drift.o: ../config.h
@@ -1632,6 +1646,7 @@ drift.o: $(UTILS_SRC)/hsv.h
drift.o: $(UTILS_SRC)/resources.h
drift.o: $(UTILS_SRC)/usleep.h
drift.o: $(UTILS_SRC)/visual.h
+drift.o: $(UTILS_SRC)/xft.h
drift.o: $(UTILS_SRC)/yarandom.h
drift.o: $(srcdir)/xlockmoreI.h
drift.o: $(srcdir)/xlockmore.h
@@ -1648,6 +1663,7 @@ epicycle.o: $(UTILS_SRC)/hsv.h
epicycle.o: $(UTILS_SRC)/resources.h
epicycle.o: $(UTILS_SRC)/usleep.h
epicycle.o: $(UTILS_SRC)/visual.h
+epicycle.o: $(UTILS_SRC)/xft.h
epicycle.o: $(UTILS_SRC)/yarandom.h
eruption.o: ../config.h
eruption.o: $(srcdir)/fps.h
@@ -1661,6 +1677,7 @@ eruption.o: $(UTILS_SRC)/hsv.h
eruption.o: $(UTILS_SRC)/resources.h
eruption.o: $(UTILS_SRC)/usleep.h
eruption.o: $(UTILS_SRC)/visual.h
+eruption.o: $(UTILS_SRC)/xft.h
eruption.o: $(UTILS_SRC)/xshm.h
eruption.o: $(UTILS_SRC)/yarandom.h
euler2d.o: ../config.h
@@ -1675,6 +1692,7 @@ euler2d.o: $(UTILS_SRC)/hsv.h
euler2d.o: $(UTILS_SRC)/resources.h
euler2d.o: $(UTILS_SRC)/usleep.h
euler2d.o: $(UTILS_SRC)/visual.h
+euler2d.o: $(UTILS_SRC)/xft.h
euler2d.o: $(UTILS_SRC)/yarandom.h
euler2d.o: $(srcdir)/xlockmoreI.h
euler2d.o: $(srcdir)/xlockmore.h
@@ -1690,6 +1708,7 @@ fadeplot.o: $(UTILS_SRC)/hsv.h
fadeplot.o: $(UTILS_SRC)/resources.h
fadeplot.o: $(UTILS_SRC)/usleep.h
fadeplot.o: $(UTILS_SRC)/visual.h
+fadeplot.o: $(UTILS_SRC)/xft.h
fadeplot.o: $(UTILS_SRC)/yarandom.h
fadeplot.o: $(srcdir)/xlockmoreI.h
fadeplot.o: $(srcdir)/xlockmore.h
@@ -1705,6 +1724,7 @@ fiberlamp.o: $(UTILS_SRC)/hsv.h
fiberlamp.o: $(UTILS_SRC)/resources.h
fiberlamp.o: $(UTILS_SRC)/usleep.h
fiberlamp.o: $(UTILS_SRC)/visual.h
+fiberlamp.o: $(UTILS_SRC)/xft.h
fiberlamp.o: $(UTILS_SRC)/yarandom.h
fiberlamp.o: $(srcdir)/xlockmoreI.h
fiberlamp.o: $(srcdir)/xlockmore.h
@@ -1738,6 +1758,7 @@ fireworkx.o: $(UTILS_SRC)/hsv.h
fireworkx.o: $(UTILS_SRC)/resources.h
fireworkx.o: $(UTILS_SRC)/usleep.h
fireworkx.o: $(UTILS_SRC)/visual.h
+fireworkx.o: $(UTILS_SRC)/xft.h
fireworkx.o: $(UTILS_SRC)/yarandom.h
flag.o: ../config.h
flag.o: $(srcdir)/fps.h
@@ -1752,6 +1773,7 @@ flag.o: $(UTILS_SRC)/hsv.h
flag.o: $(UTILS_SRC)/resources.h
flag.o: $(UTILS_SRC)/usleep.h
flag.o: $(UTILS_SRC)/visual.h
+flag.o: $(UTILS_SRC)/xft.h
flag.o: $(UTILS_SRC)/yarandom.h
flag.o: $(srcdir)/ximage-loader.h
flag.o: $(srcdir)/xlockmoreI.h
@@ -1768,6 +1790,7 @@ flame.o: $(UTILS_SRC)/hsv.h
flame.o: $(UTILS_SRC)/resources.h
flame.o: $(UTILS_SRC)/usleep.h
flame.o: $(UTILS_SRC)/visual.h
+flame.o: $(UTILS_SRC)/xft.h
flame.o: $(UTILS_SRC)/yarandom.h
flow.o: ../config.h
flow.o: $(srcdir)/fps.h
@@ -1781,6 +1804,7 @@ flow.o: $(UTILS_SRC)/hsv.h
flow.o: $(UTILS_SRC)/resources.h
flow.o: $(UTILS_SRC)/usleep.h
flow.o: $(UTILS_SRC)/visual.h
+flow.o: $(UTILS_SRC)/xft.h
flow.o: $(UTILS_SRC)/yarandom.h
flow.o: $(srcdir)/xlockmoreI.h
flow.o: $(srcdir)/xlockmore.h
@@ -1797,6 +1821,7 @@ fluidballs.o: $(UTILS_SRC)/resources.h
fluidballs.o: $(UTILS_SRC)/usleep.h
fluidballs.o: $(UTILS_SRC)/visual.h
fluidballs.o: $(UTILS_SRC)/xdbe.h
+fluidballs.o: $(UTILS_SRC)/xft.h
fluidballs.o: $(UTILS_SRC)/yarandom.h
fontglide.o: ../config.h
fontglide.o: $(srcdir)/fps.h
@@ -1827,6 +1852,7 @@ forest.o: $(UTILS_SRC)/hsv.h
forest.o: $(UTILS_SRC)/resources.h
forest.o: $(UTILS_SRC)/usleep.h
forest.o: $(UTILS_SRC)/visual.h
+forest.o: $(UTILS_SRC)/xft.h
forest.o: $(UTILS_SRC)/yarandom.h
forest.o: $(srcdir)/xlockmoreI.h
forest.o: $(srcdir)/xlockmore.h
@@ -1842,6 +1868,7 @@ fps.o: $(UTILS_SRC)/hsv.h
fps.o: $(UTILS_SRC)/resources.h
fps.o: $(UTILS_SRC)/usleep.h
fps.o: $(UTILS_SRC)/visual.h
+fps.o: $(UTILS_SRC)/xft.h
fps.o: $(UTILS_SRC)/yarandom.h
fuzzyflakes.o: ../config.h
fuzzyflakes.o: $(srcdir)/fps.h
@@ -1855,6 +1882,7 @@ fuzzyflakes.o: $(UTILS_SRC)/hsv.h
fuzzyflakes.o: $(UTILS_SRC)/resources.h
fuzzyflakes.o: $(UTILS_SRC)/usleep.h
fuzzyflakes.o: $(UTILS_SRC)/visual.h
+fuzzyflakes.o: $(UTILS_SRC)/xft.h
fuzzyflakes.o: $(UTILS_SRC)/yarandom.h
galaxy.o: ../config.h
galaxy.o: $(srcdir)/fps.h
@@ -1868,6 +1896,7 @@ galaxy.o: $(UTILS_SRC)/hsv.h
galaxy.o: $(UTILS_SRC)/resources.h
galaxy.o: $(UTILS_SRC)/usleep.h
galaxy.o: $(UTILS_SRC)/visual.h
+galaxy.o: $(UTILS_SRC)/xft.h
galaxy.o: $(UTILS_SRC)/yarandom.h
galaxy.o: $(srcdir)/xlockmoreI.h
galaxy.o: $(srcdir)/xlockmore.h
@@ -1883,6 +1912,7 @@ glitchpeg.o: $(UTILS_SRC)/hsv.h
glitchpeg.o: $(UTILS_SRC)/resources.h
glitchpeg.o: $(UTILS_SRC)/usleep.h
glitchpeg.o: $(UTILS_SRC)/visual.h
+glitchpeg.o: $(UTILS_SRC)/xft.h
glitchpeg.o: $(UTILS_SRC)/yarandom.h
glitchpeg.o: $(srcdir)/ximage-loader.h
goop.o: ../config.h
@@ -1899,6 +1929,7 @@ goop.o: $(UTILS_SRC)/resources.h
goop.o: $(UTILS_SRC)/spline.h
goop.o: $(UTILS_SRC)/usleep.h
goop.o: $(UTILS_SRC)/visual.h
+goop.o: $(UTILS_SRC)/xft.h
goop.o: $(UTILS_SRC)/yarandom.h
grav.o: ../config.h
grav.o: $(srcdir)/fps.h
@@ -1912,6 +1943,7 @@ grav.o: $(UTILS_SRC)/hsv.h
grav.o: $(UTILS_SRC)/resources.h
grav.o: $(UTILS_SRC)/usleep.h
grav.o: $(UTILS_SRC)/visual.h
+grav.o: $(UTILS_SRC)/xft.h
grav.o: $(UTILS_SRC)/yarandom.h
grav.o: $(srcdir)/xlockmoreI.h
grav.o: $(srcdir)/xlockmore.h
@@ -1927,6 +1959,7 @@ greynetic.o: $(UTILS_SRC)/hsv.h
greynetic.o: $(UTILS_SRC)/resources.h
greynetic.o: $(UTILS_SRC)/usleep.h
greynetic.o: $(UTILS_SRC)/visual.h
+greynetic.o: $(UTILS_SRC)/xft.h
greynetic.o: $(UTILS_SRC)/yarandom.h
halftone.o: ../config.h
halftone.o: $(srcdir)/fps.h
@@ -1940,6 +1973,7 @@ halftone.o: $(UTILS_SRC)/hsv.h
halftone.o: $(UTILS_SRC)/resources.h
halftone.o: $(UTILS_SRC)/usleep.h
halftone.o: $(UTILS_SRC)/visual.h
+halftone.o: $(UTILS_SRC)/xft.h
halftone.o: $(UTILS_SRC)/yarandom.h
halo.o: ../config.h
halo.o: $(srcdir)/fps.h
@@ -1953,6 +1987,7 @@ halo.o: $(UTILS_SRC)/hsv.h
halo.o: $(UTILS_SRC)/resources.h
halo.o: $(UTILS_SRC)/usleep.h
halo.o: $(UTILS_SRC)/visual.h
+halo.o: $(UTILS_SRC)/xft.h
halo.o: $(UTILS_SRC)/yarandom.h
helix.o: ../config.h
helix.o: $(srcdir)/fps.h
@@ -1967,6 +2002,7 @@ helix.o: $(UTILS_SRC)/hsv.h
helix.o: $(UTILS_SRC)/resources.h
helix.o: $(UTILS_SRC)/usleep.h
helix.o: $(UTILS_SRC)/visual.h
+helix.o: $(UTILS_SRC)/xft.h
helix.o: $(UTILS_SRC)/yarandom.h
hexadrop.o: ../config.h
hexadrop.o: $(srcdir)/fps.h
@@ -1980,6 +2016,7 @@ hexadrop.o: $(UTILS_SRC)/hsv.h
hexadrop.o: $(UTILS_SRC)/resources.h
hexadrop.o: $(UTILS_SRC)/usleep.h
hexadrop.o: $(UTILS_SRC)/visual.h
+hexadrop.o: $(UTILS_SRC)/xft.h
hexadrop.o: $(UTILS_SRC)/yarandom.h
hopalong.o: ../config.h
hopalong.o: $(srcdir)/fps.h
@@ -1993,6 +2030,7 @@ hopalong.o: $(UTILS_SRC)/hsv.h
hopalong.o: $(UTILS_SRC)/resources.h
hopalong.o: $(UTILS_SRC)/usleep.h
hopalong.o: $(UTILS_SRC)/visual.h
+hopalong.o: $(UTILS_SRC)/xft.h
hopalong.o: $(UTILS_SRC)/yarandom.h
hopalong.o: $(srcdir)/xlockmoreI.h
hopalong.o: $(srcdir)/xlockmore.h
@@ -2008,6 +2046,7 @@ hyperball.o: $(UTILS_SRC)/hsv.h
hyperball.o: $(UTILS_SRC)/resources.h
hyperball.o: $(UTILS_SRC)/usleep.h
hyperball.o: $(UTILS_SRC)/visual.h
+hyperball.o: $(UTILS_SRC)/xft.h
hyperball.o: $(UTILS_SRC)/yarandom.h
hypercube.o: ../config.h
hypercube.o: $(srcdir)/fps.h
@@ -2021,6 +2060,7 @@ hypercube.o: $(UTILS_SRC)/hsv.h
hypercube.o: $(UTILS_SRC)/resources.h
hypercube.o: $(UTILS_SRC)/usleep.h
hypercube.o: $(UTILS_SRC)/visual.h
+hypercube.o: $(UTILS_SRC)/xft.h
hypercube.o: $(UTILS_SRC)/yarandom.h
ifs.o: ../config.h
ifs.o: $(srcdir)/fps.h
@@ -2034,6 +2074,7 @@ ifs.o: $(UTILS_SRC)/hsv.h
ifs.o: $(UTILS_SRC)/resources.h
ifs.o: $(UTILS_SRC)/usleep.h
ifs.o: $(UTILS_SRC)/visual.h
+ifs.o: $(UTILS_SRC)/xft.h
ifs.o: $(UTILS_SRC)/yarandom.h
imsmap.o: ../config.h
imsmap.o: $(srcdir)/fps.h
@@ -2047,6 +2088,7 @@ imsmap.o: $(UTILS_SRC)/hsv.h
imsmap.o: $(UTILS_SRC)/resources.h
imsmap.o: $(UTILS_SRC)/usleep.h
imsmap.o: $(UTILS_SRC)/visual.h
+imsmap.o: $(UTILS_SRC)/xft.h
imsmap.o: $(UTILS_SRC)/yarandom.h
interaggregate.o: ../config.h
interaggregate.o: $(srcdir)/fps.h
@@ -2060,6 +2102,7 @@ interaggregate.o: $(UTILS_SRC)/hsv.h
interaggregate.o: $(UTILS_SRC)/resources.h
interaggregate.o: $(UTILS_SRC)/usleep.h
interaggregate.o: $(UTILS_SRC)/visual.h
+interaggregate.o: $(UTILS_SRC)/xft.h
interaggregate.o: $(UTILS_SRC)/yarandom.h
interference.o: ../config.h
interference.o: $(srcdir)/fps.h
@@ -2076,6 +2119,7 @@ interference.o: $(UTILS_SRC)/thread_util.h
interference.o: $(UTILS_SRC)/usleep.h
interference.o: $(UTILS_SRC)/visual.h
interference.o: $(UTILS_SRC)/xdbe.h
+interference.o: $(UTILS_SRC)/xft.h
interference.o: $(UTILS_SRC)/xshm.h
interference.o: $(UTILS_SRC)/yarandom.h
intermomentary.o: ../config.h
@@ -2090,6 +2134,7 @@ intermomentary.o: $(UTILS_SRC)/hsv.h
intermomentary.o: $(UTILS_SRC)/resources.h
intermomentary.o: $(UTILS_SRC)/usleep.h
intermomentary.o: $(UTILS_SRC)/visual.h
+intermomentary.o: $(UTILS_SRC)/xft.h
intermomentary.o: $(UTILS_SRC)/yarandom.h
juggle.o: ../config.h
juggle.o: $(srcdir)/fps.h
@@ -2103,6 +2148,7 @@ juggle.o: $(UTILS_SRC)/hsv.h
juggle.o: $(UTILS_SRC)/resources.h
juggle.o: $(UTILS_SRC)/usleep.h
juggle.o: $(UTILS_SRC)/visual.h
+juggle.o: $(UTILS_SRC)/xft.h
juggle.o: $(UTILS_SRC)/yarandom.h
juggle.o: $(srcdir)/xlockmoreI.h
juggle.o: $(srcdir)/xlockmore.h
@@ -2118,6 +2164,7 @@ julia.o: $(UTILS_SRC)/hsv.h
julia.o: $(UTILS_SRC)/resources.h
julia.o: $(UTILS_SRC)/usleep.h
julia.o: $(UTILS_SRC)/visual.h
+julia.o: $(UTILS_SRC)/xft.h
julia.o: $(UTILS_SRC)/yarandom.h
julia.o: $(srcdir)/xlockmoreI.h
julia.o: $(srcdir)/xlockmore.h
@@ -2134,6 +2181,7 @@ kaleidescope.o: $(UTILS_SRC)/resources.h
kaleidescope.o: $(UTILS_SRC)/spline.h
kaleidescope.o: $(UTILS_SRC)/usleep.h
kaleidescope.o: $(UTILS_SRC)/visual.h
+kaleidescope.o: $(UTILS_SRC)/xft.h
kaleidescope.o: $(UTILS_SRC)/yarandom.h
kumppa.o: ../config.h
kumppa.o: $(srcdir)/fps.h
@@ -2148,6 +2196,7 @@ kumppa.o: $(UTILS_SRC)/resources.h
kumppa.o: $(UTILS_SRC)/usleep.h
kumppa.o: $(UTILS_SRC)/visual.h
kumppa.o: $(UTILS_SRC)/xdbe.h
+kumppa.o: $(UTILS_SRC)/xft.h
kumppa.o: $(UTILS_SRC)/yarandom.h
laser.o: ../config.h
laser.o: $(srcdir)/fps.h
@@ -2161,6 +2210,7 @@ laser.o: $(UTILS_SRC)/hsv.h
laser.o: $(UTILS_SRC)/resources.h
laser.o: $(UTILS_SRC)/usleep.h
laser.o: $(UTILS_SRC)/visual.h
+laser.o: $(UTILS_SRC)/xft.h
laser.o: $(UTILS_SRC)/yarandom.h
laser.o: $(srcdir)/xlockmoreI.h
laser.o: $(srcdir)/xlockmore.h
@@ -2176,6 +2226,7 @@ lcdscrub.o: $(UTILS_SRC)/hsv.h
lcdscrub.o: $(UTILS_SRC)/resources.h
lcdscrub.o: $(UTILS_SRC)/usleep.h
lcdscrub.o: $(UTILS_SRC)/visual.h
+lcdscrub.o: $(UTILS_SRC)/xft.h
lcdscrub.o: $(UTILS_SRC)/yarandom.h
lightning.o: ../config.h
lightning.o: $(srcdir)/fps.h
@@ -2189,6 +2240,7 @@ lightning.o: $(UTILS_SRC)/hsv.h
lightning.o: $(UTILS_SRC)/resources.h
lightning.o: $(UTILS_SRC)/usleep.h
lightning.o: $(UTILS_SRC)/visual.h
+lightning.o: $(UTILS_SRC)/xft.h
lightning.o: $(UTILS_SRC)/yarandom.h
lightning.o: $(srcdir)/xlockmoreI.h
lightning.o: $(srcdir)/xlockmore.h
@@ -2204,6 +2256,7 @@ lisa.o: $(UTILS_SRC)/hsv.h
lisa.o: $(UTILS_SRC)/resources.h
lisa.o: $(UTILS_SRC)/usleep.h
lisa.o: $(UTILS_SRC)/visual.h
+lisa.o: $(UTILS_SRC)/xft.h
lisa.o: $(UTILS_SRC)/yarandom.h
lisa.o: $(srcdir)/xlockmoreI.h
lisa.o: $(srcdir)/xlockmore.h
@@ -2219,6 +2272,7 @@ lissie.o: $(UTILS_SRC)/hsv.h
lissie.o: $(UTILS_SRC)/resources.h
lissie.o: $(UTILS_SRC)/usleep.h
lissie.o: $(UTILS_SRC)/visual.h
+lissie.o: $(UTILS_SRC)/xft.h
lissie.o: $(UTILS_SRC)/yarandom.h
lissie.o: $(srcdir)/xlockmoreI.h
lissie.o: $(srcdir)/xlockmore.h
@@ -2234,6 +2288,7 @@ lmorph.o: $(UTILS_SRC)/hsv.h
lmorph.o: $(UTILS_SRC)/resources.h
lmorph.o: $(UTILS_SRC)/usleep.h
lmorph.o: $(UTILS_SRC)/visual.h
+lmorph.o: $(UTILS_SRC)/xft.h
lmorph.o: $(UTILS_SRC)/yarandom.h
loop.o: $(srcdir)/automata.h
loop.o: ../config.h
@@ -2248,6 +2303,7 @@ loop.o: $(UTILS_SRC)/hsv.h
loop.o: $(UTILS_SRC)/resources.h
loop.o: $(UTILS_SRC)/usleep.h
loop.o: $(UTILS_SRC)/visual.h
+loop.o: $(UTILS_SRC)/xft.h
loop.o: $(UTILS_SRC)/yarandom.h
loop.o: $(srcdir)/xlockmoreI.h
loop.o: $(srcdir)/xlockmore.h
@@ -2268,11 +2324,13 @@ m6502.o: $(UTILS_SRC)/resources.h
m6502.o: $(UTILS_SRC)/thread_util.h
m6502.o: $(UTILS_SRC)/usleep.h
m6502.o: $(UTILS_SRC)/visual.h
+m6502.o: $(UTILS_SRC)/xft.h
m6502.o: $(UTILS_SRC)/xshm.h
m6502.o: $(UTILS_SRC)/yarandom.h
maze.o: ../config.h
maze.o: $(srcdir)/fps.h
maze.o: images/gen/logo-180_png.h
+maze.o: images/gen/logo-360_png.h
maze.o: images/gen/logo-50_png.h
maze.o: $(srcdir)/recanim.h
maze.o: $(srcdir)/screenhackI.h
@@ -2285,6 +2343,7 @@ maze.o: $(UTILS_SRC)/hsv.h
maze.o: $(UTILS_SRC)/resources.h
maze.o: $(UTILS_SRC)/usleep.h
maze.o: $(UTILS_SRC)/visual.h
+maze.o: $(UTILS_SRC)/xft.h
maze.o: $(UTILS_SRC)/yarandom.h
maze.o: $(srcdir)/ximage-loader.h
memscroller.o: ../config.h
@@ -2299,6 +2358,7 @@ memscroller.o: $(UTILS_SRC)/hsv.h
memscroller.o: $(UTILS_SRC)/resources.h
memscroller.o: $(UTILS_SRC)/usleep.h
memscroller.o: $(UTILS_SRC)/visual.h
+memscroller.o: $(UTILS_SRC)/xft.h
memscroller.o: $(UTILS_SRC)/xshm.h
memscroller.o: $(UTILS_SRC)/yarandom.h
metaballs.o: ../config.h
@@ -2313,6 +2373,7 @@ metaballs.o: $(UTILS_SRC)/hsv.h
metaballs.o: $(UTILS_SRC)/resources.h
metaballs.o: $(UTILS_SRC)/usleep.h
metaballs.o: $(UTILS_SRC)/visual.h
+metaballs.o: $(UTILS_SRC)/xft.h
metaballs.o: $(UTILS_SRC)/yarandom.h
moire2.o: ../config.h
moire2.o: $(srcdir)/fps.h
@@ -2327,6 +2388,7 @@ moire2.o: $(UTILS_SRC)/resources.h
moire2.o: $(UTILS_SRC)/usleep.h
moire2.o: $(UTILS_SRC)/visual.h
moire2.o: $(UTILS_SRC)/xdbe.h
+moire2.o: $(UTILS_SRC)/xft.h
moire2.o: $(UTILS_SRC)/yarandom.h
moire.o: ../config.h
moire.o: $(srcdir)/fps.h
@@ -2340,6 +2402,7 @@ moire.o: $(UTILS_SRC)/hsv.h
moire.o: $(UTILS_SRC)/resources.h
moire.o: $(UTILS_SRC)/usleep.h
moire.o: $(UTILS_SRC)/visual.h
+moire.o: $(UTILS_SRC)/xft.h
moire.o: $(UTILS_SRC)/xshm.h
moire.o: $(UTILS_SRC)/yarandom.h
mountain.o: ../config.h
@@ -2354,6 +2417,7 @@ mountain.o: $(UTILS_SRC)/hsv.h
mountain.o: $(UTILS_SRC)/resources.h
mountain.o: $(UTILS_SRC)/usleep.h
mountain.o: $(UTILS_SRC)/visual.h
+mountain.o: $(UTILS_SRC)/xft.h
mountain.o: $(UTILS_SRC)/yarandom.h
mountain.o: $(srcdir)/xlockmoreI.h
mountain.o: $(srcdir)/xlockmore.h
@@ -2366,9 +2430,11 @@ munch.o: $(UTILS_SRC)/colors.h
munch.o: $(UTILS_SRC)/font-retry.h
munch.o: $(UTILS_SRC)/grabscreen.h
munch.o: $(UTILS_SRC)/hsv.h
+munch.o: $(UTILS_SRC)/pow2.h
munch.o: $(UTILS_SRC)/resources.h
munch.o: $(UTILS_SRC)/usleep.h
munch.o: $(UTILS_SRC)/visual.h
+munch.o: $(UTILS_SRC)/xft.h
munch.o: $(UTILS_SRC)/yarandom.h
nerverot.o: ../config.h
nerverot.o: $(srcdir)/fps.h
@@ -2382,6 +2448,7 @@ nerverot.o: $(UTILS_SRC)/hsv.h
nerverot.o: $(UTILS_SRC)/resources.h
nerverot.o: $(UTILS_SRC)/usleep.h
nerverot.o: $(UTILS_SRC)/visual.h
+nerverot.o: $(UTILS_SRC)/xft.h
nerverot.o: $(UTILS_SRC)/yarandom.h
noseguy.o: ../config.h
noseguy.o: $(srcdir)/fps.h
@@ -2422,8 +2489,8 @@ pacman_ai.o: $(UTILS_SRC)/hsv.h
pacman_ai.o: $(UTILS_SRC)/resources.h
pacman_ai.o: $(UTILS_SRC)/usleep.h
pacman_ai.o: $(UTILS_SRC)/visual.h
+pacman_ai.o: $(UTILS_SRC)/xft.h
pacman_ai.o: $(UTILS_SRC)/yarandom.h
-pacman_ai.o: $(srcdir)/ximage-loader.h
pacman_ai.o: $(srcdir)/xlockmoreI.h
pacman_level.o: ../config.h
pacman_level.o: $(srcdir)/fps.h
@@ -2432,16 +2499,14 @@ pacman_level.o: $(srcdir)/pacman_level.h
pacman_level.o: $(srcdir)/recanim.h
pacman_level.o: $(srcdir)/screenhackI.h
pacman_level.o: $(UTILS_SRC)/colors.h
-pacman_level.o: $(UTILS_SRC)/erase.h
pacman_level.o: $(UTILS_SRC)/font-retry.h
pacman_level.o: $(UTILS_SRC)/grabscreen.h
pacman_level.o: $(UTILS_SRC)/hsv.h
pacman_level.o: $(UTILS_SRC)/resources.h
pacman_level.o: $(UTILS_SRC)/usleep.h
pacman_level.o: $(UTILS_SRC)/visual.h
+pacman_level.o: $(UTILS_SRC)/xft.h
pacman_level.o: $(UTILS_SRC)/yarandom.h
-pacman_level.o: $(srcdir)/ximage-loader.h
-pacman_level.o: $(srcdir)/xlockmoreI.h
pacman.o: ../config.h
pacman.o: $(srcdir)/fps.h
pacman.o: images/gen/pacman_png.h
@@ -2458,6 +2523,7 @@ pacman.o: $(UTILS_SRC)/hsv.h
pacman.o: $(UTILS_SRC)/resources.h
pacman.o: $(UTILS_SRC)/usleep.h
pacman.o: $(UTILS_SRC)/visual.h
+pacman.o: $(UTILS_SRC)/xft.h
pacman.o: $(UTILS_SRC)/yarandom.h
pacman.o: $(srcdir)/ximage-loader.h
pacman.o: $(srcdir)/xlockmoreI.h
@@ -2475,6 +2541,7 @@ pedal.o: $(UTILS_SRC)/hsv.h
pedal.o: $(UTILS_SRC)/resources.h
pedal.o: $(UTILS_SRC)/usleep.h
pedal.o: $(UTILS_SRC)/visual.h
+pedal.o: $(UTILS_SRC)/xft.h
pedal.o: $(UTILS_SRC)/yarandom.h
penetrate.o: ../config.h
penetrate.o: $(srcdir)/fps.h
@@ -2488,6 +2555,7 @@ penetrate.o: $(UTILS_SRC)/hsv.h
penetrate.o: $(UTILS_SRC)/resources.h
penetrate.o: $(UTILS_SRC)/usleep.h
penetrate.o: $(UTILS_SRC)/visual.h
+penetrate.o: $(UTILS_SRC)/xft.h
penetrate.o: $(UTILS_SRC)/yarandom.h
penrose.o: ../config.h
penrose.o: $(srcdir)/fps.h
@@ -2501,6 +2569,7 @@ penrose.o: $(UTILS_SRC)/hsv.h
penrose.o: $(UTILS_SRC)/resources.h
penrose.o: $(UTILS_SRC)/usleep.h
penrose.o: $(UTILS_SRC)/visual.h
+penrose.o: $(UTILS_SRC)/xft.h
penrose.o: $(UTILS_SRC)/yarandom.h
penrose.o: $(srcdir)/xlockmoreI.h
penrose.o: $(srcdir)/xlockmore.h
@@ -2517,6 +2586,7 @@ petri.o: $(UTILS_SRC)/resources.h
petri.o: $(UTILS_SRC)/spline.h
petri.o: $(UTILS_SRC)/usleep.h
petri.o: $(UTILS_SRC)/visual.h
+petri.o: $(UTILS_SRC)/xft.h
petri.o: $(UTILS_SRC)/yarandom.h
phosphor.o: ../config.h
phosphor.o: $(srcdir)/fps.h
@@ -2533,6 +2603,7 @@ phosphor.o: $(UTILS_SRC)/textclient.h
phosphor.o: $(UTILS_SRC)/usleep.h
phosphor.o: $(UTILS_SRC)/utf8wc.h
phosphor.o: $(UTILS_SRC)/visual.h
+phosphor.o: $(UTILS_SRC)/xft.h
phosphor.o: $(UTILS_SRC)/yarandom.h
phosphor.o: $(srcdir)/ximage-loader.h
piecewise.o: ../config.h
@@ -2548,6 +2619,7 @@ piecewise.o: $(UTILS_SRC)/resources.h
piecewise.o: $(UTILS_SRC)/usleep.h
piecewise.o: $(UTILS_SRC)/visual.h
piecewise.o: $(UTILS_SRC)/xdbe.h
+piecewise.o: $(UTILS_SRC)/xft.h
piecewise.o: $(UTILS_SRC)/yarandom.h
polyominoes.o: ../config.h
polyominoes.o: $(srcdir)/fps.h
@@ -2561,6 +2633,7 @@ polyominoes.o: $(UTILS_SRC)/hsv.h
polyominoes.o: $(UTILS_SRC)/resources.h
polyominoes.o: $(UTILS_SRC)/usleep.h
polyominoes.o: $(UTILS_SRC)/visual.h
+polyominoes.o: $(UTILS_SRC)/xft.h
polyominoes.o: $(UTILS_SRC)/yarandom.h
polyominoes.o: $(srcdir)/xlockmoreI.h
polyominoes.o: $(srcdir)/xlockmore.h
@@ -2579,6 +2652,7 @@ pong.o: $(UTILS_SRC)/resources.h
pong.o: $(UTILS_SRC)/thread_util.h
pong.o: $(UTILS_SRC)/usleep.h
pong.o: $(UTILS_SRC)/visual.h
+pong.o: $(UTILS_SRC)/xft.h
pong.o: $(UTILS_SRC)/xshm.h
pong.o: $(UTILS_SRC)/yarandom.h
popsquares.o: ../config.h
@@ -2594,6 +2668,7 @@ popsquares.o: $(UTILS_SRC)/resources.h
popsquares.o: $(UTILS_SRC)/usleep.h
popsquares.o: $(UTILS_SRC)/visual.h
popsquares.o: $(UTILS_SRC)/xdbe.h
+popsquares.o: $(UTILS_SRC)/xft.h
popsquares.o: $(UTILS_SRC)/yarandom.h
pyro.o: ../config.h
pyro.o: $(srcdir)/fps.h
@@ -2607,6 +2682,7 @@ pyro.o: $(UTILS_SRC)/hsv.h
pyro.o: $(UTILS_SRC)/resources.h
pyro.o: $(UTILS_SRC)/usleep.h
pyro.o: $(UTILS_SRC)/visual.h
+pyro.o: $(UTILS_SRC)/xft.h
pyro.o: $(UTILS_SRC)/yarandom.h
qix.o: ../config.h
qix.o: $(srcdir)/fps.h
@@ -2621,6 +2697,7 @@ qix.o: $(UTILS_SRC)/hsv.h
qix.o: $(UTILS_SRC)/resources.h
qix.o: $(UTILS_SRC)/usleep.h
qix.o: $(UTILS_SRC)/visual.h
+qix.o: $(UTILS_SRC)/xft.h
qix.o: $(UTILS_SRC)/yarandom.h
rd-bomb.o: ../config.h
rd-bomb.o: $(srcdir)/fps.h
@@ -2634,6 +2711,7 @@ rd-bomb.o: $(UTILS_SRC)/hsv.h
rd-bomb.o: $(UTILS_SRC)/resources.h
rd-bomb.o: $(UTILS_SRC)/usleep.h
rd-bomb.o: $(UTILS_SRC)/visual.h
+rd-bomb.o: $(UTILS_SRC)/xft.h
rd-bomb.o: $(UTILS_SRC)/xshm.h
rd-bomb.o: $(UTILS_SRC)/yarandom.h
recanim.o: ../config.h
@@ -2647,6 +2725,7 @@ recanim.o: $(UTILS_SRC)/hsv.h
recanim.o: $(UTILS_SRC)/resources.h
recanim.o: $(UTILS_SRC)/usleep.h
recanim.o: $(UTILS_SRC)/visual.h
+recanim.o: $(UTILS_SRC)/xft.h
recanim.o: $(UTILS_SRC)/yarandom.h
ripples.o: ../config.h
ripples.o: $(srcdir)/fps.h
@@ -2660,6 +2739,7 @@ ripples.o: $(UTILS_SRC)/hsv.h
ripples.o: $(UTILS_SRC)/resources.h
ripples.o: $(UTILS_SRC)/usleep.h
ripples.o: $(UTILS_SRC)/visual.h
+ripples.o: $(UTILS_SRC)/xft.h
ripples.o: $(UTILS_SRC)/xshm.h
ripples.o: $(UTILS_SRC)/yarandom.h
rocks.o: ../config.h
@@ -2674,6 +2754,7 @@ rocks.o: $(UTILS_SRC)/hsv.h
rocks.o: $(UTILS_SRC)/resources.h
rocks.o: $(UTILS_SRC)/usleep.h
rocks.o: $(UTILS_SRC)/visual.h
+rocks.o: $(UTILS_SRC)/xft.h
rocks.o: $(UTILS_SRC)/yarandom.h
rorschach.o: ../config.h
rorschach.o: $(srcdir)/fps.h
@@ -2688,6 +2769,7 @@ rorschach.o: $(UTILS_SRC)/hsv.h
rorschach.o: $(UTILS_SRC)/resources.h
rorschach.o: $(UTILS_SRC)/usleep.h
rorschach.o: $(UTILS_SRC)/visual.h
+rorschach.o: $(UTILS_SRC)/xft.h
rorschach.o: $(UTILS_SRC)/yarandom.h
rotor.o: ../config.h
rotor.o: $(srcdir)/fps.h
@@ -2701,6 +2783,7 @@ rotor.o: $(UTILS_SRC)/hsv.h
rotor.o: $(UTILS_SRC)/resources.h
rotor.o: $(UTILS_SRC)/usleep.h
rotor.o: $(UTILS_SRC)/visual.h
+rotor.o: $(UTILS_SRC)/xft.h
rotor.o: $(UTILS_SRC)/yarandom.h
rotor.o: $(srcdir)/xlockmoreI.h
rotor.o: $(srcdir)/xlockmore.h
@@ -2716,6 +2799,7 @@ rotzoomer.o: $(UTILS_SRC)/hsv.h
rotzoomer.o: $(UTILS_SRC)/resources.h
rotzoomer.o: $(UTILS_SRC)/usleep.h
rotzoomer.o: $(UTILS_SRC)/visual.h
+rotzoomer.o: $(UTILS_SRC)/xft.h
rotzoomer.o: $(UTILS_SRC)/xshm.h
rotzoomer.o: $(UTILS_SRC)/yarandom.h
scooter.o: ../config.h
@@ -2730,6 +2814,7 @@ scooter.o: $(UTILS_SRC)/hsv.h
scooter.o: $(UTILS_SRC)/resources.h
scooter.o: $(UTILS_SRC)/usleep.h
scooter.o: $(UTILS_SRC)/visual.h
+scooter.o: $(UTILS_SRC)/xft.h
scooter.o: $(UTILS_SRC)/yarandom.h
scooter.o: $(srcdir)/xlockmoreI.h
scooter.o: $(srcdir)/xlockmore.h
@@ -2746,6 +2831,7 @@ screenhack.o: $(UTILS_SRC)/usleep.h
screenhack.o: $(UTILS_SRC)/version.h
screenhack.o: $(UTILS_SRC)/visual.h
screenhack.o: $(UTILS_SRC)/vroot.h
+screenhack.o: $(UTILS_SRC)/xft.h
screenhack.o: $(UTILS_SRC)/xmu.h
screenhack.o: $(UTILS_SRC)/yarandom.h
shadebobs.o: ../config.h
@@ -2760,6 +2846,7 @@ shadebobs.o: $(UTILS_SRC)/hsv.h
shadebobs.o: $(UTILS_SRC)/resources.h
shadebobs.o: $(UTILS_SRC)/usleep.h
shadebobs.o: $(UTILS_SRC)/visual.h
+shadebobs.o: $(UTILS_SRC)/xft.h
shadebobs.o: $(UTILS_SRC)/yarandom.h
sierpinski.o: ../config.h
sierpinski.o: $(srcdir)/fps.h
@@ -2773,6 +2860,7 @@ sierpinski.o: $(UTILS_SRC)/hsv.h
sierpinski.o: $(UTILS_SRC)/resources.h
sierpinski.o: $(UTILS_SRC)/usleep.h
sierpinski.o: $(UTILS_SRC)/visual.h
+sierpinski.o: $(UTILS_SRC)/xft.h
sierpinski.o: $(UTILS_SRC)/yarandom.h
sierpinski.o: $(srcdir)/xlockmoreI.h
sierpinski.o: $(srcdir)/xlockmore.h
@@ -2788,6 +2876,7 @@ slidescreen.o: $(UTILS_SRC)/hsv.h
slidescreen.o: $(UTILS_SRC)/resources.h
slidescreen.o: $(UTILS_SRC)/usleep.h
slidescreen.o: $(UTILS_SRC)/visual.h
+slidescreen.o: $(UTILS_SRC)/xft.h
slidescreen.o: $(UTILS_SRC)/yarandom.h
slip.o: ../config.h
slip.o: $(srcdir)/fps.h
@@ -2801,6 +2890,7 @@ slip.o: $(UTILS_SRC)/hsv.h
slip.o: $(UTILS_SRC)/resources.h
slip.o: $(UTILS_SRC)/usleep.h
slip.o: $(UTILS_SRC)/visual.h
+slip.o: $(UTILS_SRC)/xft.h
slip.o: $(UTILS_SRC)/yarandom.h
slip.o: $(srcdir)/xlockmoreI.h
slip.o: $(srcdir)/xlockmore.h
@@ -2817,6 +2907,7 @@ speedmine.o: $(UTILS_SRC)/hsv.h
speedmine.o: $(UTILS_SRC)/resources.h
speedmine.o: $(UTILS_SRC)/usleep.h
speedmine.o: $(UTILS_SRC)/visual.h
+speedmine.o: $(UTILS_SRC)/xft.h
speedmine.o: $(UTILS_SRC)/yarandom.h
sphere.o: ../config.h
sphere.o: $(srcdir)/fps.h
@@ -2830,6 +2921,7 @@ sphere.o: $(UTILS_SRC)/hsv.h
sphere.o: $(UTILS_SRC)/resources.h
sphere.o: $(UTILS_SRC)/usleep.h
sphere.o: $(UTILS_SRC)/visual.h
+sphere.o: $(UTILS_SRC)/xft.h
sphere.o: $(UTILS_SRC)/yarandom.h
sphere.o: $(srcdir)/xlockmoreI.h
sphere.o: $(srcdir)/xlockmore.h
@@ -2845,6 +2937,7 @@ spiral.o: $(UTILS_SRC)/hsv.h
spiral.o: $(UTILS_SRC)/resources.h
spiral.o: $(UTILS_SRC)/usleep.h
spiral.o: $(UTILS_SRC)/visual.h
+spiral.o: $(UTILS_SRC)/xft.h
spiral.o: $(UTILS_SRC)/yarandom.h
spiral.o: $(srcdir)/xlockmoreI.h
spiral.o: $(srcdir)/xlockmore.h
@@ -2860,6 +2953,7 @@ spotlight.o: $(UTILS_SRC)/hsv.h
spotlight.o: $(UTILS_SRC)/resources.h
spotlight.o: $(UTILS_SRC)/usleep.h
spotlight.o: $(UTILS_SRC)/visual.h
+spotlight.o: $(UTILS_SRC)/xft.h
spotlight.o: $(UTILS_SRC)/yarandom.h
squiral.o: ../config.h
squiral.o: $(srcdir)/fps.h
@@ -2874,6 +2968,7 @@ squiral.o: $(UTILS_SRC)/hsv.h
squiral.o: $(UTILS_SRC)/resources.h
squiral.o: $(UTILS_SRC)/usleep.h
squiral.o: $(UTILS_SRC)/visual.h
+squiral.o: $(UTILS_SRC)/xft.h
squiral.o: $(UTILS_SRC)/yarandom.h
starfish.o: ../config.h
starfish.o: $(srcdir)/fps.h
@@ -2888,6 +2983,7 @@ starfish.o: $(UTILS_SRC)/resources.h
starfish.o: $(UTILS_SRC)/spline.h
starfish.o: $(UTILS_SRC)/usleep.h
starfish.o: $(UTILS_SRC)/visual.h
+starfish.o: $(UTILS_SRC)/xft.h
starfish.o: $(UTILS_SRC)/yarandom.h
strange.o: ../config.h
strange.o: $(srcdir)/fps.h
@@ -2904,6 +3000,7 @@ strange.o: $(UTILS_SRC)/resources.h
strange.o: $(UTILS_SRC)/thread_util.h
strange.o: $(UTILS_SRC)/usleep.h
strange.o: $(UTILS_SRC)/visual.h
+strange.o: $(UTILS_SRC)/xft.h
strange.o: $(UTILS_SRC)/xshm.h
strange.o: $(UTILS_SRC)/yarandom.h
strange.o: $(srcdir)/xlockmoreI.h
@@ -2920,6 +3017,7 @@ substrate.o: $(UTILS_SRC)/hsv.h
substrate.o: $(UTILS_SRC)/resources.h
substrate.o: $(UTILS_SRC)/usleep.h
substrate.o: $(UTILS_SRC)/visual.h
+substrate.o: $(UTILS_SRC)/xft.h
substrate.o: $(UTILS_SRC)/yarandom.h
swirl.o: ../config.h
swirl.o: $(srcdir)/fps.h
@@ -2933,6 +3031,7 @@ swirl.o: $(UTILS_SRC)/hsv.h
swirl.o: $(UTILS_SRC)/resources.h
swirl.o: $(UTILS_SRC)/usleep.h
swirl.o: $(UTILS_SRC)/visual.h
+swirl.o: $(UTILS_SRC)/xft.h
swirl.o: $(UTILS_SRC)/xshm.h
swirl.o: $(UTILS_SRC)/yarandom.h
swirl.o: $(srcdir)/xlockmoreI.h
@@ -2949,6 +3048,7 @@ t3d.o: $(UTILS_SRC)/hsv.h
t3d.o: $(UTILS_SRC)/resources.h
t3d.o: $(UTILS_SRC)/usleep.h
t3d.o: $(UTILS_SRC)/visual.h
+t3d.o: $(UTILS_SRC)/xft.h
t3d.o: $(UTILS_SRC)/yarandom.h
tessellimage.o: ../config.h
tessellimage.o: $(srcdir)/delaunay.h
@@ -2963,6 +3063,7 @@ tessellimage.o: $(UTILS_SRC)/hsv.h
tessellimage.o: $(UTILS_SRC)/resources.h
tessellimage.o: $(UTILS_SRC)/usleep.h
tessellimage.o: $(UTILS_SRC)/visual.h
+tessellimage.o: $(UTILS_SRC)/xft.h
tessellimage.o: $(UTILS_SRC)/yarandom.h
testx11.o: ../config.h
testx11.o: $(srcdir)/fps.h
@@ -2980,6 +3081,7 @@ testx11.o: $(UTILS_SRC)/hsv.h
testx11.o: $(UTILS_SRC)/resources.h
testx11.o: $(UTILS_SRC)/usleep.h
testx11.o: $(UTILS_SRC)/visual.h
+testx11.o: $(UTILS_SRC)/xft.h
testx11.o: $(UTILS_SRC)/yarandom.h
testx11.o: $(srcdir)/ximage-loader.h
thornbird.o: ../config.h
@@ -2994,6 +3096,7 @@ thornbird.o: $(UTILS_SRC)/hsv.h
thornbird.o: $(UTILS_SRC)/resources.h
thornbird.o: $(UTILS_SRC)/usleep.h
thornbird.o: $(UTILS_SRC)/visual.h
+thornbird.o: $(UTILS_SRC)/xft.h
thornbird.o: $(UTILS_SRC)/yarandom.h
thornbird.o: $(srcdir)/xlockmoreI.h
thornbird.o: $(srcdir)/xlockmore.h
@@ -3009,6 +3112,7 @@ triangle.o: $(UTILS_SRC)/hsv.h
triangle.o: $(UTILS_SRC)/resources.h
triangle.o: $(UTILS_SRC)/usleep.h
triangle.o: $(UTILS_SRC)/visual.h
+triangle.o: $(UTILS_SRC)/xft.h
triangle.o: $(UTILS_SRC)/yarandom.h
triangle.o: $(srcdir)/xlockmoreI.h
triangle.o: $(srcdir)/xlockmore.h
@@ -3024,6 +3128,7 @@ truchet.o: $(UTILS_SRC)/hsv.h
truchet.o: $(UTILS_SRC)/resources.h
truchet.o: $(UTILS_SRC)/usleep.h
truchet.o: $(UTILS_SRC)/visual.h
+truchet.o: $(UTILS_SRC)/xft.h
truchet.o: $(UTILS_SRC)/yarandom.h
twang.o: ../config.h
twang.o: $(srcdir)/fps.h
@@ -3037,6 +3142,7 @@ twang.o: $(UTILS_SRC)/hsv.h
twang.o: $(UTILS_SRC)/resources.h
twang.o: $(UTILS_SRC)/usleep.h
twang.o: $(UTILS_SRC)/visual.h
+twang.o: $(UTILS_SRC)/xft.h
twang.o: $(UTILS_SRC)/xshm.h
twang.o: $(UTILS_SRC)/yarandom.h
vermiculate.o: ../config.h
@@ -3051,6 +3157,7 @@ vermiculate.o: $(UTILS_SRC)/hsv.h
vermiculate.o: $(UTILS_SRC)/resources.h
vermiculate.o: $(UTILS_SRC)/usleep.h
vermiculate.o: $(UTILS_SRC)/visual.h
+vermiculate.o: $(UTILS_SRC)/xft.h
vermiculate.o: $(UTILS_SRC)/yarandom.h
vfeedback.o: $(srcdir)/analogtv.h
vfeedback.o: ../config.h
@@ -3067,6 +3174,7 @@ vfeedback.o: $(UTILS_SRC)/resources.h
vfeedback.o: $(UTILS_SRC)/thread_util.h
vfeedback.o: $(UTILS_SRC)/usleep.h
vfeedback.o: $(UTILS_SRC)/visual.h
+vfeedback.o: $(UTILS_SRC)/xft.h
vfeedback.o: $(UTILS_SRC)/xshm.h
vfeedback.o: $(UTILS_SRC)/yarandom.h
vines.o: ../config.h
@@ -3081,6 +3189,7 @@ vines.o: $(UTILS_SRC)/hsv.h
vines.o: $(UTILS_SRC)/resources.h
vines.o: $(UTILS_SRC)/usleep.h
vines.o: $(UTILS_SRC)/visual.h
+vines.o: $(UTILS_SRC)/xft.h
vines.o: $(UTILS_SRC)/yarandom.h
vines.o: $(srcdir)/xlockmoreI.h
vines.o: $(srcdir)/xlockmore.h
@@ -3097,6 +3206,7 @@ wander.o: $(UTILS_SRC)/hsv.h
wander.o: $(UTILS_SRC)/resources.h
wander.o: $(UTILS_SRC)/usleep.h
wander.o: $(UTILS_SRC)/visual.h
+wander.o: $(UTILS_SRC)/xft.h
wander.o: $(UTILS_SRC)/yarandom.h
webcollage-cocoa.o: ../config.h
webcollage-cocoa.o: $(srcdir)/fps.h
@@ -3110,6 +3220,7 @@ webcollage-cocoa.o: $(UTILS_SRC)/hsv.h
webcollage-cocoa.o: $(UTILS_SRC)/resources.h
webcollage-cocoa.o: $(UTILS_SRC)/usleep.h
webcollage-cocoa.o: $(UTILS_SRC)/visual.h
+webcollage-cocoa.o: $(UTILS_SRC)/xft.h
webcollage-cocoa.o: $(UTILS_SRC)/yarandom.h
webcollage-helper.o: ../config.h
whirlwindwarp.o: ../config.h
@@ -3125,6 +3236,7 @@ whirlwindwarp.o: $(UTILS_SRC)/hsv.h
whirlwindwarp.o: $(UTILS_SRC)/resources.h
whirlwindwarp.o: $(UTILS_SRC)/usleep.h
whirlwindwarp.o: $(UTILS_SRC)/visual.h
+whirlwindwarp.o: $(UTILS_SRC)/xft.h
whirlwindwarp.o: $(UTILS_SRC)/yarandom.h
whirlygig.o: ../config.h
whirlygig.o: $(srcdir)/fps.h
@@ -3139,6 +3251,7 @@ whirlygig.o: $(UTILS_SRC)/resources.h
whirlygig.o: $(UTILS_SRC)/usleep.h
whirlygig.o: $(UTILS_SRC)/visual.h
whirlygig.o: $(UTILS_SRC)/xdbe.h
+whirlygig.o: $(UTILS_SRC)/xft.h
whirlygig.o: $(UTILS_SRC)/yarandom.h
wormhole.o: ../config.h
wormhole.o: $(srcdir)/fps.h
@@ -3152,6 +3265,7 @@ wormhole.o: $(UTILS_SRC)/hsv.h
wormhole.o: $(UTILS_SRC)/resources.h
wormhole.o: $(UTILS_SRC)/usleep.h
wormhole.o: $(UTILS_SRC)/visual.h
+wormhole.o: $(UTILS_SRC)/xft.h
wormhole.o: $(UTILS_SRC)/yarandom.h
worm.o: ../config.h
worm.o: $(srcdir)/fps.h
@@ -3165,6 +3279,7 @@ worm.o: $(UTILS_SRC)/hsv.h
worm.o: $(UTILS_SRC)/resources.h
worm.o: $(UTILS_SRC)/usleep.h
worm.o: $(UTILS_SRC)/visual.h
+worm.o: $(UTILS_SRC)/xft.h
worm.o: $(UTILS_SRC)/yarandom.h
worm.o: $(srcdir)/xlockmoreI.h
worm.o: $(srcdir)/xlockmore.h
@@ -3187,6 +3302,7 @@ xanalogtv.o: $(UTILS_SRC)/resources.h
xanalogtv.o: $(UTILS_SRC)/thread_util.h
xanalogtv.o: $(UTILS_SRC)/usleep.h
xanalogtv.o: $(UTILS_SRC)/visual.h
+xanalogtv.o: $(UTILS_SRC)/xft.h
xanalogtv.o: $(UTILS_SRC)/xshm.h
xanalogtv.o: $(UTILS_SRC)/yarandom.h
xanalogtv.o: $(srcdir)/ximage-loader.h
@@ -3203,10 +3319,23 @@ xflame.o: $(UTILS_SRC)/hsv.h
xflame.o: $(UTILS_SRC)/resources.h
xflame.o: $(UTILS_SRC)/usleep.h
xflame.o: $(UTILS_SRC)/visual.h
+xflame.o: $(UTILS_SRC)/xft.h
xflame.o: $(UTILS_SRC)/xshm.h
xflame.o: $(UTILS_SRC)/yarandom.h
xflame.o: $(srcdir)/ximage-loader.h
ximage-loader.o: ../config.h
+ximage-loader.o: $(srcdir)/fps.h
+ximage-loader.o: $(srcdir)/recanim.h
+ximage-loader.o: $(srcdir)/screenhackI.h
+ximage-loader.o: $(UTILS_SRC)/colors.h
+ximage-loader.o: $(UTILS_SRC)/font-retry.h
+ximage-loader.o: $(UTILS_SRC)/grabscreen.h
+ximage-loader.o: $(UTILS_SRC)/hsv.h
+ximage-loader.o: $(UTILS_SRC)/resources.h
+ximage-loader.o: $(UTILS_SRC)/usleep.h
+ximage-loader.o: $(UTILS_SRC)/visual.h
+ximage-loader.o: $(UTILS_SRC)/xft.h
+ximage-loader.o: $(UTILS_SRC)/yarandom.h
ximage-loader.o: $(srcdir)/ximage-loader.h
xjack.o: ../config.h
xjack.o: $(srcdir)/fps.h
@@ -3220,6 +3349,7 @@ xjack.o: $(UTILS_SRC)/hsv.h
xjack.o: $(UTILS_SRC)/resources.h
xjack.o: $(UTILS_SRC)/usleep.h
xjack.o: $(UTILS_SRC)/visual.h
+xjack.o: $(UTILS_SRC)/xft.h
xjack.o: $(UTILS_SRC)/yarandom.h
xlockmore.o: ../config.h
xlockmore.o: $(srcdir)/fps.h
@@ -3234,6 +3364,7 @@ xlockmore.o: $(UTILS_SRC)/hsv.h
xlockmore.o: $(UTILS_SRC)/resources.h
xlockmore.o: $(UTILS_SRC)/usleep.h
xlockmore.o: $(UTILS_SRC)/visual.h
+xlockmore.o: $(UTILS_SRC)/xft.h
xlockmore.o: $(UTILS_SRC)/yarandom.h
xlockmore.o: $(srcdir)/xlockmoreI.h
xlyap.o: ../config.h
@@ -3248,6 +3379,7 @@ xlyap.o: $(UTILS_SRC)/hsv.h
xlyap.o: $(UTILS_SRC)/resources.h
xlyap.o: $(UTILS_SRC)/usleep.h
xlyap.o: $(UTILS_SRC)/visual.h
+xlyap.o: $(UTILS_SRC)/xft.h
xlyap.o: $(UTILS_SRC)/yarandom.h
xmatrix.o: ../config.h
xmatrix.o: $(srcdir)/fps.h
@@ -3266,6 +3398,7 @@ xmatrix.o: $(UTILS_SRC)/resources.h
xmatrix.o: $(UTILS_SRC)/textclient.h
xmatrix.o: $(UTILS_SRC)/usleep.h
xmatrix.o: $(UTILS_SRC)/visual.h
+xmatrix.o: $(UTILS_SRC)/xft.h
xmatrix.o: $(UTILS_SRC)/yarandom.h
xmatrix.o: $(srcdir)/ximage-loader.h
xrayswarm.o: ../config.h
@@ -3280,8 +3413,19 @@ xrayswarm.o: $(UTILS_SRC)/hsv.h
xrayswarm.o: $(UTILS_SRC)/resources.h
xrayswarm.o: $(UTILS_SRC)/usleep.h
xrayswarm.o: $(UTILS_SRC)/visual.h
+xrayswarm.o: $(UTILS_SRC)/xft.h
xrayswarm.o: $(UTILS_SRC)/yarandom.h
-xscreensaver-sgigl.o: $(UTILS_SRC)/vroot.h
+xscreensaver-getimage.o: ../config.h
+xscreensaver-getimage.o: $(srcdir)/../driver/prefs.h
+xscreensaver-getimage.o: $(UTILS_SRC)/colorbars.h
+xscreensaver-getimage.o: $(UTILS_SRC)/grabscreen.h
+xscreensaver-getimage.o: $(UTILS_SRC)/resources.h
+xscreensaver-getimage.o: $(UTILS_SRC)/utils.h
+xscreensaver-getimage.o: $(UTILS_SRC)/version.h
+xscreensaver-getimage.o: $(UTILS_SRC)/visual.h
+xscreensaver-getimage.o: $(UTILS_SRC)/vroot.h
+xscreensaver-getimage.o: $(UTILS_SRC)/xmu.h
+xscreensaver-getimage.o: $(UTILS_SRC)/yarandom.h
xspirograph.o: ../config.h
xspirograph.o: $(srcdir)/fps.h
xspirograph.o: $(srcdir)/recanim.h
@@ -3295,12 +3439,14 @@ xspirograph.o: $(UTILS_SRC)/hsv.h
xspirograph.o: $(UTILS_SRC)/resources.h
xspirograph.o: $(UTILS_SRC)/usleep.h
xspirograph.o: $(UTILS_SRC)/visual.h
+xspirograph.o: $(UTILS_SRC)/xft.h
xspirograph.o: $(UTILS_SRC)/yarandom.h
xsublim.o: ../config.h
xsublim.o: $(UTILS_SRC)/font-retry.h
xsublim.o: $(UTILS_SRC)/resources.h
xsublim.o: $(UTILS_SRC)/usleep.h
xsublim.o: $(UTILS_SRC)/vroot.h
+xsublim.o: $(UTILS_SRC)/xft.h
xsublim.o: $(UTILS_SRC)/yarandom.h
zoom.o: ../config.h
zoom.o: $(srcdir)/fps.h
@@ -3314,5 +3460,6 @@ zoom.o: $(UTILS_SRC)/hsv.h
zoom.o: $(UTILS_SRC)/resources.h
zoom.o: $(UTILS_SRC)/usleep.h
zoom.o: $(UTILS_SRC)/visual.h
+zoom.o: $(UTILS_SRC)/xft.h
zoom.o: $(UTILS_SRC)/yarandom.h
diff --git a/hacks/README b/hacks/README
index 34e687e..ffb2d17 100644
--- a/hacks/README
+++ b/hacks/README
@@ -4,3 +4,6 @@ the xscreensaver program (in the ../driver/ directory) but some of them use
the utility functions found in the ../utils/ directory.
If you have compilation problems, check the parameters in ../config.h.
+
+Writing a screen saver? Make sure you have read ../README.hacking.
+
diff --git a/hacks/abstractile.man b/hacks/abstractile.man
index d043ce7..bbb096c 100644
--- a/hacks/abstractile.man
+++ b/hacks/abstractile.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "27-Apr-97" "X Version 11"
.SH NAME
-abstractile - draw abstract mosaic patterns of interlocking tiles
+abstractile \- draw abstract mosaic patterns of interlocking tiles
.SH SYNOPSIS
.B abstractile
[\-sleep \fIseconds\fP] [\-speed \fIint\fP] [\-tile \fItile_mode\fP]
diff --git a/hacks/analogtv-cli.c b/hacks/analogtv-cli.c
index aeec901..2c4a880 100644
--- a/hacks/analogtv-cli.c
+++ b/hacks/analogtv-cli.c
@@ -1,4 +1,4 @@
-/* xanalogtv-cli, Copyright (c) 2018-2019 Jamie Zawinski <jwz@jwz.org>
+/* xanalogtv-cli, Copyright (c) 2018-2020 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -36,6 +36,7 @@
#include <X11/Xutil.h>
#include <X11/Xos.h>
+#include "screenhackI.h"
#include "resources.h"
#include "visual.h"
#include "yarandom.h"
@@ -54,13 +55,9 @@ const char *progclass;
int mono_p = 0;
static Bool verbose_p = 0;
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-
-enum {
- N_CHANNELS=12,
- MAX_MULTICHAN=2,
- MAX_STATIONS=11
-};
+#define MAX_MULTICHAN 2
+static int N_CHANNELS=12;
+static int MAX_STATIONS=6;
typedef struct chansetting_s {
analogtv_reception recs[MAX_MULTICHAN];
@@ -78,12 +75,12 @@ struct state {
analogtv_font ugly_font;
int n_stations;
- analogtv_input *stations[MAX_STATIONS];
+ analogtv_input **stations;
Bool image_loading_p;
XImage *logo, *logo_mask;
int curinputi;
- chansetting chansettings[N_CHANNELS];
+ chansetting *chansettings;
chansetting *cs;
};
@@ -120,6 +117,9 @@ XCreateGC(Display *dpy, Drawable d, unsigned long mask, XGCValues *gcv)
return 0;
}
+int screen_number (Screen *screen) { return 0; }
+
+
XImage *
XCreateImage (Display *dpy, Visual *v, unsigned int depth,
int format, int offset, char *data,
@@ -319,13 +319,15 @@ get_boolean_resource (Display *dpy, char *name, char *class)
abort();
}
+static int darkp = 0;
double
get_float_resource (Display *dpy, char *name, char *class)
{
- if (!strcmp(name, "TVTint")) return 5;
- if (!strcmp(name, "TVColor")) return 70;
- if (!strcmp(name, "TVBrightness")) return -15;
- if (!strcmp(name, "TVContrast")) return 150;
+ if (!strcmp(name, "TVTint")) return 5; /* default 5 */
+ if (!strcmp(name, "TVColor")) return 70; /* default 70 */
+ if (!strcmp(name, "TVBrightness"))
+ return (darkp ? -15 : 2); /* default 2 */
+ if (!strcmp(name, "TVContrast")) return 150; /* default 150 */
abort();
}
@@ -535,7 +537,7 @@ delete_tmp_files(void)
for (i = 0; i <= st->frames_written; i++)
{
sprintf (outfile, st->framefile_fmt, i);
- if (verbose_p > 1)
+ if (verbose_p > 2)
fprintf (stderr, "%s: rm %s\n", progname, outfile);
unlink (outfile);
}
@@ -551,6 +553,25 @@ analogtv_signal (int sig)
}
+static char *
+quote (const char *s)
+{
+ char *s2, *o;
+ if (!s) return 0;
+
+ s2 = malloc (strlen(s) * 2 + 2);
+ o = s2;
+ while (*s)
+ {
+ if (*s == '"' || *s == '\\')
+ *o++ = '\\';
+ *o++ = *s++;
+ }
+ *o = 0;
+ return s2;
+}
+
+
static void
analogtv_write_mp4 (struct state *st, const char *outfile,
const char *audiofile,
@@ -558,33 +579,37 @@ analogtv_write_mp4 (struct state *st, const char *outfile,
{
char cmd[1024];
struct stat ss;
+ char *qout = quote (outfile);
+ char *qaudio = quote (audiofile);
sprintf (cmd,
"ffmpeg"
" -hide_banner"
- " -v 16"
- " -framerate 30" /* rate of input: must be before -i */
- " -i '%s'"
- " -r 30", /* rate of output: must be after -i */
+ " -loglevel error"
+ " -framerate 30" /* rate of input: must be before -i */
+ " -thread_queue_size 4096"
+ " -i \"%s\""
+ " -r 30", /* rate of output: must be after -i */
st->framefile_fmt);
if (audiofile)
sprintf (cmd + strlen(cmd),
- " -i '%s'"
+ " -i \"%s\""
" -map 0:v:0"
" -map 1:a:0"
" -acodec aac"
+ " -b:a 96k"
/* Truncate or pad audio to length of video */
" -filter_complex '[1:0] apad' -shortest",
- audiofile);
+ qaudio);
sprintf (cmd + strlen(cmd),
" -c:v libx264"
" -profile:v high"
- " -crf 24" /* 18 is very high; 24 is good enough */
" -pix_fmt yuv420p"
+ " -preset veryfast"
+ " -crf 24" /* 18 is very high; 24 is good enough */
" '%s'"
- " </dev/null"
- /*" 2>&-"*/,
- outfile);
+ " </dev/null",
+ qout);
if (verbose_p > 1)
fprintf (stderr, "%s: exec: %s\n", progname, cmd);
@@ -631,36 +656,51 @@ flip_ximage (XImage *ximage)
static void
-analogtv_convert (const char *infile, const char *outfile,
+analogtv_convert (const char **infiles, const char *outfile,
const char *audiofile, const char *logofile,
int duration, Bool powerp)
{
+ unsigned long start_time = time((time_t *)0);
struct state *st = &global_state;
- XImage *ximage = file_to_ximage (0, 0, infile);
Display *dpy = 0;
Window window = 0;
- int i;
+ int i, n;
unsigned long curticks = 0;
time_t lastlog = time((time_t *)0);
- int frames_left;
+ int frames_left = 0;
int channel_changes = 0;
int fps = 30;
+ XImage **ximages;
+ int singlep;
+ int *stats;
+
+ stats = (int *) calloc(N_CHANNELS, sizeof(*stats));
+ ximages = calloc (MAX_STATIONS, sizeof(*ximages));
+ i = 0;
+ while (infiles[i])
+ {
+ ximages[i] = file_to_ximage (0, 0, infiles[i]);
+ if (verbose_p > 1)
+ fprintf (stderr, "%s: loaded %s %dx%d\n",
+ progname, infiles[i], ximages[i]->width, ximages[i]->height);
+ flip_ximage (ximages[i]);
+ i++;
+ }
- if (verbose_p)
- fprintf (stderr, "%s: loaded %s %dx%d\n",
- progname, infile, ximage->width, ximage->height);
+ singlep = !infiles[1];
- flip_ximage (ximage);
+ if (singlep) powerp = 0; /* #### These don't work together but should */
memset (st, 0, sizeof(*st));
st->dpy = dpy;
st->window = window;
- st->output_frame = XCreateImage (dpy, 0, ximage->depth, ximage->format, 0,
+ st->output_frame = XCreateImage (dpy, 0, ximages[0]->depth,
+ ximages[0]->format, 0,
NULL,
- ximage->width & ~1, /* can't be odd */
- ximage->height & ~1,
- ximage->bitmap_pad, 0);
+ ximages[0]->width & ~1, /* can't be odd */
+ ximages[0]->height & ~1,
+ ximages[0]->bitmap_pad, 0);
st->output_frame->data = (char *)
calloc (st->output_frame->height, st->output_frame->bytes_per_line);
@@ -759,6 +799,8 @@ analogtv_convert (const char *infile, const char *outfile,
st->tv=analogtv_allocate(dpy, window);
+ st->stations = (analogtv_input **)
+ calloc (MAX_STATIONS, sizeof(*st->stations));
while (st->n_stations < MAX_STATIONS) {
analogtv_input *input=analogtv_input_allocate();
st->stations[st->n_stations++]=input;
@@ -774,16 +816,17 @@ analogtv_convert (const char *infile, const char *outfile,
if (1) {
st->tv->color_control += frand(0.3) * RANDSIGN();
}
- if (random()%4==0) {
- st->tv->brightness_control += frand(0.15);
- }
- if (random()%4==0) {
- st->tv->contrast_control += frand(0.2) * RANDSIGN();
+ if (darkp) {
+ if (random()%4==0) {
+ st->tv->brightness_control += frand(0.15);
+ }
+ if (random()%4==0) {
+ st->tv->contrast_control += frand(0.2) * RANDSIGN();
+ }
}
+ st->chansettings = calloc (N_CHANNELS, sizeof (*st->chansettings));
for (i=0; i<N_CHANNELS; i++) {
- memset(&st->chansettings[i], 0, sizeof(chansetting));
-
st->chansettings[i].noise_level = 0.06;
{
int last_station=42;
@@ -820,13 +863,15 @@ analogtv_convert (const char *infile, const char *outfile,
st->curinputi=0;
st->cs = &st->chansettings[st->curinputi];
- /* First channel (initial unadulterated image) stays for this long */
- frames_left = fps * (2 + frand(1.5));
+ if (singlep)
+ /* First channel (initial unadulterated image) stays for this long */
+ frames_left = fps * (2 + frand(1.5));
st->tv->powerup=0.0;
/* load_station_images() */
+ n = 0;
for (i = 0; i < MAX_STATIONS; i++) {
analogtv_input *input = st->stations[i];
@@ -834,6 +879,13 @@ analogtv_convert (const char *infile, const char *outfile,
station 1 is colorbars. */
input->updater = update_smpte_colorbars;
} else {
+ XImage *ximage = ximages[n++];
+ if (!ximage) {
+ n = 0;
+ ximage = ximages[n++];
+ }
+
+ {
int w = ximage->width * 0.815; /* underscan */
int h = ximage->height * 0.970;
int x = (ximage->width - w) / 2;
@@ -841,6 +893,7 @@ analogtv_convert (const char *infile, const char *outfile,
analogtv_input *input = st->stations[i];
analogtv_setup_sync(input, 1, (random()%20)==0);
analogtv_load_ximage (st->tv, input, ximage, 0, x, y, w, h);
+ }
}
}
@@ -857,32 +910,57 @@ analogtv_convert (const char *infile, const char *outfile,
channel_changes++;
- if (channel_changes == 1) {
- /* Second channel has short duration */
+ if (singlep && channel_changes == 1) {
+ /* Second channel has short duration, 0.25 to 0.75 sec. */
frames_left = fps * (0.25 + frand(0.5));
+ } else if (singlep) {
+ /* 0.5 - 2.0 sec (was 0.5 - 3.0 sec) */
+ frames_left = fps * (0.5 + frand(1.5));
} else {
- frames_left = fps * (0.5 + frand(2.5));
+ /* 1 - 7 sec */
+ frames_left = fps * (1 + frand(6));
}
- if (channel_changes == 2) {
+ if (singlep && channel_changes == 2) {
/* Always use the unadulterated image for the third channel:
So the effect is, plain, brief blip, plain, then random. */
st->curinputi = 0;
- } else if (st->curinputi != 0 && !(random() % 3)) {
- /* Use the unadulterated image 1/3 of the time */
+ frames_left += fps * (0.1 + frand(0.5));
+
+ } else if (singlep && st->curinputi != 0 && ((random() % 100) < 75)) {
+ /* Use the unadulterated image 75% of the time (was 33%) */
st->curinputi = 0;
} else {
/* Otherwise random */
st->curinputi = 1 + (random() % (N_CHANNELS - 1));
}
+ stats[st->curinputi]++;
st->cs = &st->chansettings[st->curinputi];
/* Set channel change noise flag */
st->tv->channel_change_cycles=200000;
- if (verbose_p)
+ if (verbose_p > 1)
fprintf (stderr, "%s: %.1f: channel %d\n",
progname, curticks/1000.0, st->curinputi);
+
+ /* Turn the knobs every now and then */
+ if (! (random() % 5)) {
+ if (random()%4==0) {
+ st->tv->tint_control += pow(frand(2.0)-1.0, 7) * 180.0 * RANDSIGN();
+ }
+ if (1) {
+ st->tv->color_control += frand(0.3) * RANDSIGN();
+ }
+ if (darkp) {
+ if (random()%4==0) {
+ st->tv->brightness_control += frand(0.15);
+ }
+ if (random()%4==0) {
+ st->tv->contrast_control += frand(0.2) * RANDSIGN();
+ }
+ }
+ }
}
for (i=0; i<MAX_MULTICHAN; i++) {
@@ -899,9 +977,9 @@ analogtv_convert (const char *infile, const char *outfile,
st->tv->powerup=(powerp ? curtime : 9999);
- if (st->curinputi == 0) {
- XPutImage (dpy, 0, 0, ximage, 0, 0, 0, 0,
- ximage->width, ximage->height);
+ if (st->curinputi == 0 && singlep) {
+ XPutImage (dpy, 0, 0, ximages[0], 0, 0, 0, 0,
+ ximages[0]->width, ximages[0]->height);
} else {
for (i=0; i<MAX_MULTICHAN; i++) {
analogtv_reception *rec = &st->cs->recs[i];
@@ -923,14 +1001,41 @@ analogtv_convert (const char *infile, const char *outfile,
if (verbose_p) {
unsigned long now = time((time_t *)0);
- if (now > lastlog + 5) {
- fprintf (stderr, "%s: %2d%%...\n", progname,
- (int) (curtime * 100 / duration));
+ if (now > (verbose_p == 1 ? lastlog : lastlog + 10)) {
+ unsigned long elapsed = now - start_time;
+ double ratio = curtime / (double) duration;
+ int remaining = (ratio ? (elapsed / ratio) - elapsed : 0);
+ int pct = 100 * ratio;
+ int cols = 47;
+ char dots[80];
+ int ii;
+ for (ii = 0; ii < cols * ratio; ii++)
+ dots[ii] = '.';
+ dots[ii] = 0;
+ fprintf (stderr, "%s%s: %s %2d%%, %d:%02d:%02d ETA%s",
+ (verbose_p == 1 ? "\r" : ""),
+ progname,
+ dots, pct,
+ (remaining/60/60),
+ (remaining/60)%60,
+ remaining%60,
+ (verbose_p == 1 ? "" : "\n"));
lastlog = now;
}
}
}
+ if (verbose_p == 1) fprintf(stderr, "\n");
+
+ if (verbose_p > 1) {
+ if (channel_changes == 0) channel_changes++;
+ fprintf(stderr, "%s: channels shown: %d\n", progname, channel_changes);
+ for (i = 0; i < N_CHANNELS; i++)
+ fprintf(stderr, "%s: %2d: %3d%%\n", progname,
+ i+1, stats[i] * 100 / channel_changes);
+ }
+
+ free (stats);
analogtv_write_mp4 (st, outfile, audiofile, st->frames_written);
}
@@ -940,7 +1045,7 @@ usage(const char *err)
{
if (err) fprintf (stderr, "%s: %s unknown\n", progname, err);
fprintf (stderr, "usage: %s [--verbose] [--duration secs]"
- " [--audio mp3-file] [--no-powerup] infile.png outfile.mp4\n",
+ " [--audio mp3-file] [--no-powerup] infile.png ... outfile.mp4\n",
progname);
exit (1);
}
@@ -949,17 +1054,20 @@ int
main (int argc, char **argv)
{
int i;
- const char *infile = 0;
+ const char *infiles[1000];
const char *outfile = 0;
int duration = 30;
Bool powerp = False;
char *audio = 0;
char *logo = 0;
+ int nfiles = 0;
char *s = strrchr (argv[0], '/');
progname = s ? s+1 : argv[0];
progclass = progname;
+ memset (infiles, 0, sizeof(infiles));
+
for (i = 1; i < argc; i++)
{
if (argv[i][0] == '-' && argv[i][1] == '-')
@@ -990,18 +1098,29 @@ main (int argc, char **argv)
powerp = False;
else if (argv[i][0] == '-')
usage(argv[i]);
- else if (!infile)
- infile = argv[i];
- else if (!outfile)
- outfile = argv[i];
+ else if (nfiles >= countof(infiles)-1)
+ usage("too many files");
else
- usage(argv[i]);
+ infiles[nfiles++] = argv[i];
}
- if (!infile) usage("input file");
- if (!outfile) usage("output file");
+
+ if (nfiles < 2)
+ usage("");
+
+ outfile = infiles[nfiles-1];
+ infiles[--nfiles] = 0;
+
+ /* stations should be a multiple of files, but >= 6.
+ channels should be double that. */
+ MAX_STATIONS = 0;
+ while (MAX_STATIONS < 6)
+ MAX_STATIONS += nfiles;
+ N_CHANNELS = MAX_STATIONS * 2;
+
+ darkp = (nfiles == 1);
# undef ya_rand_init
ya_rand_init (0);
- analogtv_convert (infile, outfile, audio, logo, duration, powerp);
+ analogtv_convert (infiles, outfile, audio, logo, duration, powerp);
exit (0);
}
diff --git a/hacks/analogtv.c b/hacks/analogtv.c
index 8ef3c7d..ca87a12 100644
--- a/hacks/analogtv.c
+++ b/hacks/analogtv.c
@@ -85,6 +85,7 @@
#include "yarandom.h"
#include "grabscreen.h"
#include "visual.h"
+#include "xft.h"
#include "font-retry.h"
#include "ximage-loader.h"
@@ -647,11 +648,6 @@ analogtv_set_demod(analogtv *it)
cmap_again:
if (it->use_cmap && !it->n_colors) {
- if (it->n_colors) {
- XFreeColors(it->dpy, it->colormap, it->colors, it->n_colors, 0L);
- it->n_colors=0;
- }
-
{
int yli,qli,ili;
for (yli=0; yli<y_levels; yli++) {
@@ -1799,8 +1795,13 @@ analogtv_draw(analogtv *it, double noiselevel,
analogtv_setup_levels(it, it->puheight * (double)it->useheight/(double)ANALOGTV_VISLINES);
/* calculate tint once per frame */
- it->tint_i = -cos((103 + it->tint_control)*3.1415926/180);
- it->tint_q = sin((103 + it->tint_control)*3.1415926/180);
+ /* Christopher Mosher argues that this should use 33 degress instead of
+ 103 degrees, and then TVTint should default to 0 in analogtv.h and
+ all relevant XML files. But that makes all the colors go really green
+ and saturated, so apparently that's not right. -- jwz, Nov 2020.
+ */
+ it->tint_i = -cos((103 + it->tint_control)*M_PI/180);
+ it->tint_q = sin((103 + it->tint_control)*M_PI/180);
for (lineno=ANALOGTV_TOP; lineno<ANALOGTV_BOT; lineno++) {
int slineno, ytop, ybot;
@@ -2024,7 +2025,7 @@ analogtv_load_ximage(analogtv *it, analogtv_input *input,
for (i=0; i<x_length+4; i++) {
double phase=90.0-90.0*i;
double ampl=1.0;
- multiq[i]=(int)(-cos(3.1415926/180.0*(phase-303)) * 4096.0 * ampl);
+ multiq[i]=(int)(-cos(M_PI/180.0*(phase-303)) * 4096.0 * ampl);
}
for (y=0; y<y_scanlength; y++) {
@@ -2210,8 +2211,6 @@ analogtv_make_font(Display *dpy, Window window, analogtv_font *f,
int w, int h, char *fontname)
{
int i;
- XFontStruct *font;
- Pixmap text_pm;
GC gc;
XGCValues gcv;
XWindowAttributes xgwa;
@@ -2256,40 +2255,63 @@ analogtv_make_font(Display *dpy, Window window, analogtv_font *f,
} else if (fontname) {
- font = load_font_retry (dpy, fontname);
+ XftFont *font;
+ XftColor xft_fg;
+ XftDraw *xftdraw;
+ Pixmap text_pm;
+ XImage *xim;
+ int x, y;
+
+ font = load_xft_font_retry (dpy, screen_number (xgwa.screen), fontname);
if (!font) {
fprintf(stderr, "analogtv: can't load font %s\n", fontname);
abort();
}
- text_pm=XCreatePixmap(dpy, window, 256*f->char_w, f->char_h, 1);
+ text_pm=XCreatePixmap(dpy, window, 256*f->char_w, f->char_h, xgwa.depth);
memset(&gcv, 0, sizeof(gcv));
gcv.foreground=1;
gcv.background=0;
- gcv.font=font->fid;
- gc=XCreateGC(dpy, text_pm, GCFont|GCBackground|GCForeground, &gcv);
+ gc=XCreateGC(dpy, text_pm, GCBackground|GCForeground, &gcv);
# ifdef HAVE_JWXYZ
- jwxyz_XSetAntiAliasing (dpy, gc, False);
+ jwxyz_XSetAntiAliasing (dpy, gc, False);
# endif
XSetForeground(dpy, gc, 0);
XFillRectangle(dpy, text_pm, gc, 0, 0, 256*f->char_w, f->char_h);
- XSetForeground(dpy, gc, 1);
+
+ xftdraw = XftDrawCreate (dpy, text_pm, xgwa.visual, xgwa.colormap);
+ xft_fg.pixel = ~0L;
+ xft_fg.color.red = xft_fg.color.green = xft_fg.color.blue = ~0L;
+
for (i=0; i<256; i++) {
char c=i;
int x=f->char_w*i+1;
int y=f->char_h*8/10;
- XDrawString(dpy, text_pm, gc, x, y, &c, 1);
+ XftDrawStringUtf8 (xftdraw, &xft_fg, font, x, y, (FcChar8 *) &c, 1);
}
- f->text_im = XGetImage(dpy, text_pm, 0, 0, 256*f->char_w, f->char_h,
- 1, XYPixmap);
+ xim = XGetImage(dpy, text_pm, 0, 0, 256*f->char_w, f->char_h,
+ xgwa.depth, ZPixmap);
+ f->text_im = XCreateImage(dpy, xgwa.visual, 1, XYPixmap, 0, 0,
+ 256*f->char_w, f->char_h, 8, 0);
+ f->text_im->data = (char *)calloc(f->text_im->height,
+ f->text_im->bytes_per_line);
+ for (y = 0; y < xim->height; y++)
+ for (x = 0; x < xim->width; x++)
+ XPutPixel (f->text_im, x, y, XGetPixel (xim, x, y) ? 1 : 0);
+
+ XDestroyImage (xim);
+ xim = 0;
+
# if 0
XWriteBitmapFile(dpy, "/tmp/tvfont.xbm", text_pm,
256*f->char_w, f->char_h, -1, -1);
# endif
XFreeGC(dpy, gc);
XFreePixmap(dpy, text_pm);
+ XftDrawDestroy (xftdraw);
+
} else {
f->text_im = XCreateImage(dpy, xgwa.visual, 1, XYPixmap, 0, 0,
256*f->char_w, f->char_h, 8, 0);
@@ -2343,7 +2365,7 @@ analogtv_lcp_to_ntsc(double luma, double chroma, double phase, int ntsc[4])
int i;
for (i=0; i<4; i++) {
double w=90.0*i + phase;
- double val=luma + chroma * (cos(3.1415926/180.0*w));
+ double val=luma + chroma * (cos(M_PI/180.0*w));
if (val<0.0) val=0.0;
if (val>127.0) val=127.0;
ntsc[i]=(int)val;
diff --git a/hacks/analogtv.h b/hacks/analogtv.h
index 4b11b58..474a7f8 100644
--- a/hacks/analogtv.h
+++ b/hacks/analogtv.h
@@ -15,7 +15,7 @@
#include "thread_util.h"
#include "xshm.h"
-#if defined(USE_IPHONE) || defined(HAVE_ANDROID)
+#if defined(HAVE_IPHONE) || defined(HAVE_ANDROID)
# define HAVE_MOBILE
#endif
diff --git a/hacks/anemone.man b/hacks/anemone.man
index 463a999..8c5464e 100644
--- a/hacks/anemone.man
+++ b/hacks/anemone.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-anemone - wiggling tentacles.
+anemone \- wiggling tentacles.
.SH SYNOPSIS
.B anemone
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/anemotaxis.man b/hacks/anemotaxis.man
index cf5c1ea..7da9566 100644
--- a/hacks/anemotaxis.man
+++ b/hacks/anemotaxis.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-anemotaxis - directional search on a plane.
+anemotaxis \- directional search on a plane.
.SH SYNOPSIS
.B anemotaxis
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/ant.man b/hacks/ant.man
index fb71d57..aa006b6 100644
--- a/hacks/ant.man
+++ b/hacks/ant.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-ant - cellular automaton.
+ant \- cellular automaton.
.SH SYNOPSIS
.B ant
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/apollonian.c b/hacks/apollonian.c
index 4b28ac3..782b41c 100644
--- a/hacks/apollonian.c
+++ b/hacks/apollonian.c
@@ -46,9 +46,6 @@ static const char sccsid[] = "@(#)apollonian.c 5.02 2001/07/01 xlockmore";
* sum(a^2,b^2,c^2,d^2) >= 2*max(a,b,c,d)^2
*
*
- * Todo:
- * Add a small font
- *
* Revision History:
* 25-Jun-2001: Converted from C and Postscript code by David Bagley
* Original code by Allan R. Wilks <allan@research.att.com>.
@@ -70,7 +67,7 @@ static const char sccsid[] = "@(#)apollonian.c 5.02 2001/07/01 xlockmore";
"*count: 64 \n" \
"*cycles: 20 \n" \
"*ncolors: 64 \n" \
- "*font: fixed" "\n" \
+ "*font: sans-serif bold 10\n" \
"*fpsTop: true \n" \
"*fpsSolid: true \n" \
"*ignoreRotation: True" \
@@ -112,10 +109,6 @@ static OptionStruct desc[] =
ENTRYPOINT ModeSpecOpt apollonian_opts =
{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
-#ifdef DOFONT
-extern XFontStruct *getFont(Display * display);
-#endif
-
#ifdef USE_MODULES
ModStruct apollonian_description =
{"apollonian", "init_apollonian", "draw_apollonian", (char *) NULL,
@@ -294,19 +287,15 @@ typedef struct {
int count;
Bool label, altgeom;
apollonian_quadruple *quad;
-#ifdef DOFONT
- XFontStruct *font;
-#endif
+ XftFont *font;
+ XftColor xft_fg;
+ XftDraw *xftdraw;
int time;
int game;
} apollonianstruct;
static apollonianstruct *apollonians = (apollonianstruct *) NULL;
-#define FONT_HEIGHT 19
-#define FONT_WIDTH 15
-#define FONT_LENGTH 20
-#define MAX_CHAR 10
#define K 2.15470053837925152902 /* 1+2/sqrt(3) */
#define MAXBEND 100 /* Do not want configurable by user since it will take too
much time if increased. */
@@ -501,12 +490,27 @@ cquad(circle *c1, circle *c2, circle *c3, circle *c4)
}
static void
+set_xft_color (ModeInfo *mi, XftColor *c, unsigned long pixel)
+{
+ XColor xc;
+ xc.pixel = pixel;
+ XQueryColor (MI_DISPLAY(mi), MI_COLORMAP(mi), &xc);
+ c->pixel = pixel;
+ c->color.red = xc.red;
+ c->color.green = xc.green;
+ c->color.blue = xc.blue;
+ c->color.alpha = 0xFFFF;
+}
+
+
+static void
p(ModeInfo *mi, circle c)
{
apollonianstruct *cp = &apollonians[MI_SCREEN(mi)];
char string[15];
double g, e;
int g_width;
+ unsigned long pix;
#ifdef DEBUG
(void) printf("c.e=%g c.s=%g c.h=%g c.x=%g c.y=%g\n",
@@ -518,12 +522,12 @@ p(ModeInfo *mi, circle c)
if (g < 0.0)
g = -g;
if (MI_NPIXELS(mi) <= 2)
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi),
- MI_WHITE_PIXEL(mi));
+ pix = MI_WHITE_PIXEL(mi);
else
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi),
- MI_PIXEL(mi, ((int) ((g + cp->color_offset) *
- g)) % MI_NPIXELS(mi)));
+ pix = MI_PIXEL(mi, ((int) ((g + cp->color_offset) * g))
+ % MI_NPIXELS(mi));
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), pix);
+ set_xft_color (mi, &cp->xft_fg, pix);
XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
((int) (cp->size * (-cp->c1.e) * (c.x - 1.0) /
(-2.0 * c.e) + cp->size / 2.0 + cp->offset.x)),
@@ -537,22 +541,24 @@ p(ModeInfo *mi, circle c)
#endif
return;
}
- (void) sprintf(string, "%g", (g == 0.0) ? 0 : -g);
- if (cp->size >= 10 * FONT_WIDTH) {
- /* hard code these to corners */
- XDrawString(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
- ((int) (cp->size * c.x / (2.0 * c.e))) + cp->offset.x,
- ((int) (cp->size * c.y / (2.0 * c.e))) + FONT_HEIGHT,
- string, (g == 0.0) ? 1 : ((g < 10.0) ? 2 :
- ((g < 100.0) ? 3 : 4)));
- }
- if (cp->altgeom && MI_HEIGHT(mi) >= 30 * FONT_WIDTH) {
- XDrawString(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
- ((int) (cp->size * c.x / (2.0 * c.e) + cp->offset.x)),
- ((int) (cp->size * c.y / (2.0 * c.e) + MI_HEIGHT(mi) -
- FONT_HEIGHT / 2)), (char *) space_string[cp->geometry],
- strlen(space_string[cp->geometry]));
- }
+
+ sprintf(string, "%g", (g == 0.0) ? 0 : -g);
+ XftDrawStringUtf8 (cp->xftdraw, &cp->xft_fg, cp->font,
+ ((int) (cp->size * c.x / (2.0 * c.e))) +
+ cp->offset.x + cp->font->ascent * 2,
+ ((int) (cp->size * c.y / (2.0 * c.e))) +
+ cp->font->ascent * 4,
+ (FcChar8 *) string,
+ (g == 0 ? 1 :
+ g < 10 ? 2 :
+ g < 100 ? 3 : 4));
+ XftDrawStringUtf8 (cp->xftdraw, &cp->xft_fg, cp->font,
+ ((int) (cp->size * c.x / (2.0 * c.e) +
+ cp->offset.x)) + cp->font->ascent * 2,
+ ((int) (cp->size * c.y / (2.0 * c.e) +
+ MI_HEIGHT(mi) - cp->font->ascent * 4)),
+ (FcChar8 *) space_string[cp->geometry],
+ strlen(space_string[cp->geometry]));
return;
}
if (MI_NPIXELS(mi) <= 2)
@@ -590,22 +596,27 @@ p(ModeInfo *mi, circle c)
return;
}
if (MI_NPIXELS(mi) <= 2)
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ pix = MI_BLACK_PIXEL(mi);
else
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi),
- MI_PIXEL(mi, ((int) ((g + cp->color_offset) * g) +
- MI_NPIXELS(mi) / 2) % MI_NPIXELS(mi)));
+ pix = MI_PIXEL(mi, ((int) ((g + cp->color_offset) * g) +
+ MI_NPIXELS(mi) / 2) % MI_NPIXELS(mi));
g_width = (g < 10.0) ? 1: ((g < 100.0) ? 2 : 3);
- if (c.e < e * cp->size / (FONT_LENGTH + 5 * g_width) && g < 1000.0) {
- (void) sprintf(string, "%g", g);
- XDrawString(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
- ((int) (cp->size * e * c.x / (2.0 * c.e) +
- cp->size / 2.0 + cp->offset.x)) -
- g_width * FONT_WIDTH / 2,
- ((int) (cp->size * e * c.y / (2.0 * c.e) +
- cp->size / 2.0 + cp->offset.y)) +
- FONT_HEIGHT / 2,
- string, g_width);
+ if (c.e < e * cp->size / ((cp->font->ascent + cp->font->descent) * 2) &&
+ g < 1000.0) {
+ XGlyphInfo overall;
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), pix);
+ set_xft_color (mi, &cp->xft_fg, pix);
+ sprintf(string, "%g", g);
+ XftTextExtentsUtf8 (MI_DISPLAY(mi), cp->font,
+ (FcChar8 *) string, g_width, &overall);
+ XftDrawStringUtf8 (cp->xftdraw, &cp->xft_fg, cp->font,
+ ((int) (cp->size * e * c.x / (2.0 * c.e) +
+ cp->size / 2.0 + cp->offset.x)) -
+ overall.width / 2,
+ ((int) (cp->size * e * c.y / (2.0 * c.e) +
+ cp->size / 2.0 + cp->offset.y)) +
+ cp->font->ascent / 2,
+ (FcChar8 *) string, g_width);
}
}
@@ -643,16 +654,9 @@ free_apollonian (ModeInfo * mi)
(void) free((void *) cp->quad);
cp->quad = (apollonian_quadruple *) NULL;
}
-#ifdef DOFONT
- if (cp->gc != None) {
- XFreeGC(display, cp->gc);
- cp->gc = None;
- }
- if (cp->font != None) {
- XFreeFont(display, cp->font);
- cp->font = None;
- }
-#endif
+
+ XftFontClose (MI_DISPLAY(mi), cp->font);
+ XftDrawDestroy (cp->xftdraw);
}
#ifndef DEBUG
@@ -678,6 +682,7 @@ init_apollonian (ModeInfo * mi)
{
apollonianstruct *cp;
int i;
+ char *s;
MI_INIT (mi, apollonians);
cp = &apollonians[MI_SCREEN(mi)];
@@ -687,12 +692,16 @@ init_apollonian (ModeInfo * mi)
cp->offset.y = (MI_HEIGHT(mi) - cp->size) / 2;
cp->color_offset = NRAND(MI_NPIXELS(mi));
-#ifdef DOFONT
- if (cp->font == None) {
- if ((cp->font = getFont(MI_DISPLAY(mi))) == None)
- return False;
- }
-#endif
+ cp->font = load_xft_font_retry (MI_DISPLAY(mi), MI_SCREEN(mi),
+ get_string_resource (MI_DISPLAY(mi),
+ "font", "Font"));
+ cp->xftdraw = XftDrawCreate (MI_DISPLAY(mi), MI_WINDOW(mi),
+ MI_VISUAL(mi), MI_COLORMAP(mi));
+ s = get_string_resource (MI_DISPLAY(mi), "foreground", "Foreground");
+ XftColorAllocName (MI_DISPLAY(mi), MI_VISUAL(mi), MI_COLORMAP(mi), s,
+ &cp->xft_fg);
+ free(s);
+
cp->label = label;
cp->altgeom = cp->label && altgeom;
diff --git a/hacks/apollonian.man b/hacks/apollonian.man
index 157d109..3dd3ad1 100644
--- a/hacks/apollonian.man
+++ b/hacks/apollonian.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-apollonian - Descartes Circle Theorem.
+apollonian \- Descartes Circle Theorem.
.SH SYNOPSIS
.B apollonian
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/apple2-main.c b/hacks/apple2-main.c
index c30be1f..a87ea1a 100644
--- a/hacks/apple2-main.c
+++ b/hacks/apple2-main.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1998-2014 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1998-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -13,9 +13,10 @@
* Pty and vt100 emulation by Fredrik Tolf <fredrik@dolda2000.com>
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
+#include "screenhack.h"
+#include "apple2.h"
+#include "textclient.h"
+#include "utf8wc.h"
#include <math.h>
#include <ctype.h>
@@ -24,14 +25,6 @@
# include <unistd.h>
#endif
-#include "screenhack.h"
-#include "apple2.h"
-#include "textclient.h"
-#include "utf8wc.h"
-
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#define SCREEN_COLS 40
#define SCREEN_ROWS 24
diff --git a/hacks/apple2.man b/hacks/apple2.man
index b0d6d5c..ec0bcd3 100644
--- a/hacks/apple2.man
+++ b/hacks/apple2.man
@@ -1,19 +1,6 @@
-.de EX \"Begin example
-.ne 5
-.if n .sp 1
-.if t .sp .5
-.nf
-.in +.5i
-..
-.de EE
-.fi
-.in -.5i
-.if n .sp 1
-.if t .sp .5
-..
.TH XScreenSaver 1 "5-May-2004" "X Version 11"
.SH NAME
-apple2 - Apple ][ display emulator
+apple2 \- Apple ][ display emulator
.SH SYNOPSIS
.B apple2
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
@@ -43,7 +30,7 @@ colors, you can only make out the general shape of the pictures.
In text mode it displays the output of a command or the contents of
a file or URL (via the default
-.BR xscreensaver-text (1)
+.BR xscreensaver\-text (MANSUFFIX)
program, which can be overridden with \fI\-program\fP).
In text mode, it is also a fully functional (if anachronistic)
@@ -83,31 +70,35 @@ option may be any string acceptable to /bin/sh. The program will be
run at the end of a pipe, and any characters that it prints to
\fIstdout\fP will be printed on the Apple ][ display. If the program
exits, it will be launched again after 3 seconds. Default:
-.BR xscreensaver-text (1).
+.BR xscreensaver\-text (MANSUFFIX).
In text mode, \fIapple2\fP emulates a vt100 terminal running on a 40x24
uppercase-only screen.
For example:
-.EX
-apple2 -text \\
- -program 'cat /usr/src/linux*/README | fold -sw40'
-apple2 -text -program 'ping apple.com'
-apple2 -text -program 'ps -e'
-apple2 -text -program 'od -txCz -w7 /dev/urandom'
-apple2 -text -program 'cat /dev/random'
-apple2 -text -fast -program 'xemacs -nw -q -f life'
-apple2 -text -fast \\
- -program 'xemacs -nw -q --eval "(hanoi 5)"'
-.EE
+.nf
+.sp
+ apple2 -text \\
+ -program 'cat /usr/src/linux*/README | fold -sw40'
+ apple2 -text -program 'ping apple.com'
+ apple2 -text -program 'ps -e'
+ apple2 -text -program 'od -txCz -w7 /dev/urandom'
+ apple2 -text -program 'cat /dev/random'
+ apple2 -text -fast -program 'xemacs -nw -q -f life'
+ apple2 -text -fast \\
+ -program 'xemacs -nw -q --eval "(hanoi 5)"'
+.sp
+.fi
You can also use \fIapple2\fP as an extremely lo-fi replacement for the
.BR xterm (1)
and
.BR gnome-terminal (1)
terminal emulators:
-.EX
-apple2 -text -fast -program tcsh
-.EE
+.nf
+.sp
+ apple2 -text -fast -program tcsh
+.sp
+.fi
.TP 8
.B \-pty
In \fI\-text\fP mode, launch the sub-program under a pty so that it
@@ -180,7 +171,7 @@ Apple ][ and Applesoft are trademarks of Apple Computer.
.SH SEE ALSO
.BR xscreensaver (1),
.BR bsod (MANSUFFIX),
-.BR xscreensaver-text (1),
+.BR xscreensaver\-text (MANSUFFIX),
.BR fortune (1),
.BR phosphor (MANSUFFIX),
.BR starwars (MANSUFFIX),
diff --git a/hacks/asm6502.c b/hacks/asm6502.c
index 27d2824..8876beb 100644
--- a/hacks/asm6502.c
+++ b/hacks/asm6502.c
@@ -20,6 +20,10 @@
I changed the structure of the assembler in this version.
*/
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
#include <stdlib.h>
#include <stdio.h>
/*#include <malloc.h>*/
@@ -29,9 +33,7 @@
#include <assert.h>
#include <ctype.h>
#include <math.h>
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
+
#if defined(HAVE_STDINT_H)
# include <stdint.h>
#elif defined(HAVE_INTTYPES_H)
@@ -119,9 +121,8 @@ static void *ecalloc(uint32_t nelm, size_t nsize){
/* estrdup() - Allocates memory for a new string a returns a copy of the source sting in it. */
static char *estrdup(const char *source){
- int ln = strlen(source) + 1;
- char *s = ecalloc(ln, sizeof(char));
- strncpy(s,source,ln);
+ char *s = strdup (source);
+ if (!s) abort();
return s;
}
@@ -1010,8 +1011,8 @@ static void jmpSTY(machine_6502 *machine, m6502_AddrMode adm){
static void assignOpCodes(m6502_Opcodes *opcodes){
#define SETOP(num, _name, _Imm, _ZP, _ZPX, _ZPY, _ABS, _ABSX, _ABSY, _INDX, _INDY, _SNGL, _BRA, _func) \
-{opcodes[num].name[3] = '\0'; \
- strncpy(opcodes[num].name, _name, 3); opcodes[num].Imm = _Imm; opcodes[num].ZP = _ZP; \
+{sprintf(opcodes[num].name, "%.*s", MAX_LABEL_LEN-1, _name); \
+ opcodes[num].Imm = _Imm; opcodes[num].ZP = _ZP; \
opcodes[num].ZPX = _ZPX; opcodes[num].ZPY = _ZPY; opcodes[num].ABS = _ABS; \
opcodes[num].ABSX = _ABSX; opcodes[num].ABSY = _ABSY; opcodes[num].INDX = _INDX; \
opcodes[num].INDY = _INDY; opcodes[num].SNGL = _SNGL; opcodes[num].BRA = _BRA; \
@@ -1179,7 +1180,7 @@ static AsmLine *newAsmLine(char *cmd, char *label, BOOL decl, Param *param, int
newp = (AsmLine *) ecalloc(1, sizeof(AsmLine));
newp->labelDecl = decl;
newp->label = newLabel();
- strncpy(newp->label->label,label,MAX_LABEL_LEN);
+ sprintf(newp->label->label, "%.*s", MAX_LABEL_LEN - 1, label);
newp->command = estrdup(cmd);
newp->param = newParam();
copyParam(newp->param, param);
@@ -1413,8 +1414,7 @@ static BOOL immediate(char **s, Param *param){
param->type = (**s == '<') ? IMMEDIATE_LESS : IMMEDIATE_GREAT;
(*s)++; /* move past < or > */
if (paramLabel(s, &label)){
- int ln = strlen(label) + 1;
- strncpy(param->label, label, ln);
+ sprintf(param->label, "%.*s", MAX_LABEL_LEN-1, label);
free(label);
return TRUE;
}
@@ -2069,7 +2069,7 @@ static BOOL compileCode(machine_6502 *machine, const char *code){
}
}
else{
- fprintf(stderr,"An error occured while parsing the file.\n");
+ fprintf(stderr,"An error occurred while parsing the file.\n");
codeOk = FALSE;
}
freeallAsmLine(asmlist);
@@ -2117,7 +2117,6 @@ machine_6502 *m6502_build(void){
void m6502_destroy6502(machine_6502 *machine){
free(machine);
- machine = NULL;
}
void m6502_trace(machine_6502 *machine, FILE *output){
diff --git a/hacks/attraction.man b/hacks/attraction.man
index 6630355..1238f92 100644
--- a/hacks/attraction.man
+++ b/hacks/attraction.man
@@ -1,19 +1,6 @@
-.de EX \"Begin example
-.ne 5
-.if n .sp 1
-.if t .sp .5
-.nf
-.in +.5i
-..
-.de EE
-.fi
-.in -.5i
-.if n .sp 1
-.if t .sp .5
-..
.TH XScreenSaver 1 "14-Jun-97" "X Version 11"
.SH NAME
-attraction - interactions of opposing forces
+attraction \- interactions of opposing forces
.SH SYNOPSIS
.B attraction
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
@@ -144,9 +131,12 @@ points move; the default is 1, meaning no resistance. Values higher than 1
aren't interesting; lower values cause less motion.
One interesting thing to try is
-.EX
-attraction -viscosity 0.8 -points 300 -size 10 -geometry =500x500
-.EE
+.nf
+.sp
+ attraction -viscosity 0.8 -points 300 \\
+ -size 10 -geometry =500x500
+.sp
+.fi
Give it a few seconds to settle down into a stable clump, and then move
the drag the mouse through it to make "waves".
.TP 8
diff --git a/hacks/barcode.c b/hacks/barcode.c
index 1f56013..75a2258 100644
--- a/hacks/barcode.c
+++ b/hacks/barcode.c
@@ -119,6 +119,7 @@ static const char *words[] =
"bellicosity",
"bells",
"belly",
+ "bird flu",
"bliss",
"bogosity",
"boobies",
@@ -129,6 +130,7 @@ static const char *words[] =
"bubba",
"burrito",
"California",
+ "cancer",
"capybara",
"cardinality",
"caribou",
@@ -143,6 +145,8 @@ static const char *words[] =
"contrition",
"cop",
"corpse",
+ "coronavirus",
+ "covid-19",
"cowboy",
"crabapple",
"craziness",
@@ -297,6 +301,8 @@ static const char *words[] =
"roadrunner",
"rootkit",
"rule",
+ "SARS",
+ "SARS-CoV-2",
"savor",
"scab",
"scalar",
diff --git a/hacks/barcode.man b/hacks/barcode.man
index 9074e16..b21fb8f 100644
--- a/hacks/barcode.man
+++ b/hacks/barcode.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-barcode - draws a random sequence of barcodes for the products you enjoy
+barcode \- draws a random sequence of barcodes for the products you enjoy
.SH SYNOPSIS
.B barcode
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/binaryring.man b/hacks/binaryring.man
index 2d44496..9dce286 100644
--- a/hacks/binaryring.man
+++ b/hacks/binaryring.man
@@ -1,6 +1,6 @@
.TH "Binary Ring" 1 "02-Sep-14" "X Version 11"
.SH NAME
-binaryring - A system of path tracing particles evolves continuously from an initial creation.
+binaryring \- A system of path tracing particles evolves continuously from an initial creation.
.SH SYNOPSIS
.B binaryring
[\-fps]
diff --git a/hacks/blaster.man b/hacks/blaster.man
index 6ac369f..92f26fd 100644
--- a/hacks/blaster.man
+++ b/hacks/blaster.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-blaster - simulation of space combat
+blaster \- simulation of space combat
.SH SYNOPSIS
.B blaster
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/blitspin.man b/hacks/blitspin.man
index 4a221da..1b70c7b 100644
--- a/hacks/blitspin.man
+++ b/hacks/blitspin.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "24-Nov-97" "X Version 11"
.SH NAME
-blitspin - rotate a bitmap in an interesting way
+blitspin \- rotate a bitmap in an interesting way
.SH SYNOPSIS
.B blitspin
[\-display \fIhost:display.screen\fP]
@@ -54,7 +54,7 @@ the system's video input, or from a random file on disk, as indicated by
the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP file;
see
-.BR xscreensaver-demo (1)
+.BR xscreensaver\-settings (1)
for more details.
.TP 8
.B \-delay \fImicroseconds\fP
@@ -79,8 +79,8 @@ stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1),
-.BR xscreensaver-demo (1),
-.BR xscreensaver-getimage (1)
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-getimage (MANSUFFIX)
.SH COPYRIGHT
Copyright \(co 1992, 1993, 1997, 2001 by Jamie Zawinski.
Permission to use, copy, modify, distribute, and sell this software and its
diff --git a/hacks/bouboule.man b/hacks/bouboule.man
index 259490f..cc50c28 100644
--- a/hacks/bouboule.man
+++ b/hacks/bouboule.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "15-May-97" "X Version 11"
.SH NAME
-bouboule - draws spinning 3D blobs
+bouboule \- draws spinning 3D blobs
.SH SYNOPSIS
.B bouboule
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP] [\-3d]
diff --git a/hacks/boxfit.man b/hacks/boxfit.man
index ec157e3..8e14dba 100644
--- a/hacks/boxfit.man
+++ b/hacks/boxfit.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-boxfit - fills space with a gradient of growing boxes or circles.
+boxfit \- fills space with a gradient of growing boxes or circles.
.SH SYNOPSIS
.B boxfit
[\-display \fIhost:display.screen\fP]
@@ -66,7 +66,7 @@ or from a random file on disk, as indicated by
the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
file; see
-.BR xscreensaver-demo (1)
+.BR xscreensaver\-settings (1)
for more details.
.TP 8
.B \-peek
@@ -88,8 +88,8 @@ stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1)
-.BR xscreensaver\-demo (1),
-.BR xscreensaver\-getimage (1)
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-getimage (MANSUFFIX)
.SH COPYRIGHT
Copyright \(co 2005 by Jamie Zawinski. Permission to use, copy, modify,
distribute, and sell this software and its documentation for any purpose is
diff --git a/hacks/braid.man b/hacks/braid.man
index 28f0c4d..19a3282 100644
--- a/hacks/braid.man
+++ b/hacks/braid.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "10-May-97" "X Version 11"
.SH NAME
-braid - draws random color-cycling braids around a circle
+braid \- draws random color-cycling braids around a circle
.SH SYNOPSIS
.B braid
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP]
diff --git a/hacks/bsod.c b/hacks/bsod.c
index ffde1a6..06fcb91 100644
--- a/hacks/bsod.c
+++ b/hacks/bsod.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1998-2019 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 1998-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -36,6 +36,7 @@
#include "screenhack.h"
+#include "xft.h"
#include "ximage-loader.h"
#include "apple2.h"
@@ -63,6 +64,8 @@
#include "images/gen/atm_png.h"
#include "images/gen/sun_png.h"
#include "images/gen/dvd_png.h"
+#include "images/gen/gnome1_png.h"
+#include "images/gen/gnome2_png.h"
#undef countof
#define countof(x) (sizeof((x))/sizeof((*x)))
@@ -92,7 +95,9 @@ struct bsod_state {
Display *dpy;
Window window;
XWindowAttributes xgwa;
- XFontStruct *font, *fontA, *fontB, *fontC;
+ XftFont *font, *fontA, *fontB, *fontC;
+ XftDraw *xftdraw;
+ XftColor xft_fg, xft_bg;
unsigned long fg, bg;
GC gc;
int left_margin, right_margin; /* for text wrapping */
@@ -375,16 +380,15 @@ position_for_text (struct bsod_state *bst, const char *line)
bst->queue[bst->pos].type != LEFT_FULL)
while (*start)
{
- int dir, ascent, descent;
- XCharStruct ov;
+ XGlyphInfo ov;
const char *end = start;
while (*end && *end != '\r' && *end != '\n')
end++;
- XTextExtents (bst->font, start, end-start,
- &dir, &ascent, &descent, &ov);
- if (ov.width > max_width)
- max_width = ov.width;
+ XftTextExtentsUtf8 (bst->dpy, bst->font,
+ (FcChar8 *) start, end-start, &ov);
+ if (ov.xOff > max_width)
+ max_width = ov.xOff;
if (!*end) break;
start = end+1;
}
@@ -440,6 +444,23 @@ bst_crlf (struct bsod_state *bst)
}
+/* This is slow, use it sparingly. */
+static void
+set_xft_color (Display *dpy, Colormap cmap, XftColor *c, unsigned long pixel)
+{
+ XColor xc;
+ if (c->pixel == pixel && c->color.alpha)
+ return; /* Using alpha as "is initialized" */
+ xc.pixel = pixel;
+ XQueryColor (dpy, cmap, &xc);
+ c->pixel = pixel;
+ c->color.red = xc.red;
+ c->color.green = xc.green;
+ c->color.blue = xc.blue;
+ c->color.alpha = 0xFFFF;
+}
+
+
static void
draw_char (struct bsod_state *bst, char c)
{
@@ -461,47 +482,47 @@ draw_char (struct bsod_state *bst, char c)
if (bst->macx_eol_kludge)
{
/* Special case for the weird way OSX crashes print newlines... */
- XDrawImageString (bst->dpy, bst->window, bst->gc,
- bst->x, bst->y, " ", 1);
- XDrawImageString (bst->dpy, bst->window, bst->gc,
- bst->x,
- bst->y + bst->font->ascent + bst->font->descent,
- " ", 1);
+ XGlyphInfo ov;
+ XftTextExtentsUtf8 (bst->dpy, bst->font, (FcChar8 *) "n", 1, &ov);
+ XSetForeground (bst->dpy, bst->gc, bst->bg);
+ XFillRectangle (bst->dpy, bst->window, bst->gc,
+ bst->x, bst->y - bst->font->ascent,
+ ov.width,
+ (bst->font->ascent + bst->font->descent) * 2);
+ XSetForeground (bst->dpy, bst->gc, bst->fg);
}
bst_crlf (bst);
}
else if (c == '\b') /* backspace */
{
- int cw = (bst->font->per_char
- ? bst->font->per_char['n'-bst->font->min_char_or_byte2].width
- : bst->font->min_bounds.width);
- bst->x -= cw;
+ XGlyphInfo ov;
+ XftTextExtentsUtf8 (bst->dpy, bst->font, (FcChar8 *) "n", 1, &ov);
+ bst->x -= ov.xOff;
if (bst->x < bst->left_margin + bst->xoff)
bst->x = bst->left_margin + bst->xoff;
}
else
{
- int dir, ascent, descent;
- XCharStruct ov;
+ XGlyphInfo ov;
Bool cursorp = (c == '\033'); /* apparently \e is non-standard now! */
if (cursorp) c = ' ';
- XTextExtents (bst->font, &c, 1, &dir, &ascent, &descent, &ov);
+ XftTextExtentsUtf8 (bst->dpy, bst->font, (FcChar8 *) &c, 1, &ov);
if (bst->x < bst->left_margin)
bst->x = bst->left_margin;
if ((bst->wrap_p || bst->word_wrap_p) &&
- bst->x + ov.width > bst->xgwa.width - bst->right_margin - bst->xoff)
+ bst->x + ov.xOff > bst->xgwa.width - bst->right_margin - bst->xoff)
{
- XCharStruct ov2;
+ XGlyphInfo ov2;
int L = 0;
if (bst->word_wrap_p && *bst->word_buf)
{
L = strlen(bst->word_buf);
- XTextExtents (bst->font, bst->word_buf, L,
- &dir, &ascent, &descent, &ov2);
+ XftTextExtentsUtf8 (bst->dpy, bst->font,
+ (FcChar8 *) bst->word_buf, L, &ov2);
}
if (L) /* Erase the truncated wrapped word */
@@ -519,8 +540,17 @@ draw_char (struct bsod_state *bst, char c)
if (L) /* Draw wrapped partial word on the next line, no delay */
{
- XDrawImageString (bst->dpy, bst->window, bst->gc,
- bst->x, bst->y, bst->word_buf, L);
+ XftTextExtentsUtf8 (bst->dpy, bst->font,
+ (FcChar8 *) bst->word_buf, L, &ov);
+ XSetForeground (bst->dpy, bst->gc, bst->bg);
+ XFillRectangle (bst->dpy, bst->window, bst->gc,
+ bst->x,
+ bst->y - bst->font->ascent,
+ ov.xOff,
+ bst->font->ascent + bst->font->descent);
+ XftDrawStringUtf8 (bst->xftdraw, &bst->xft_fg, bst->font,
+ bst->x, bst->y,
+ (FcChar8 *) bst->word_buf, L);
bst->x += ov2.width;
bst->last_nonwhite = bst->x;
}
@@ -530,27 +560,41 @@ draw_char (struct bsod_state *bst, char c)
if (cursorp)
{
+ XftColor cswap = bst->xft_fg;
unsigned long swap = bst->fg;
bst->fg = bst->bg;
+ bst->xft_fg = bst->xft_bg;
bst->bg = swap;
+ bst->xft_bg = cswap;
XSetForeground (bst->dpy, bst->gc, bst->fg);
XSetBackground (bst->dpy, bst->gc, bst->bg);
}
- XDrawImageString (bst->dpy, bst->window, bst->gc,
- bst->x, bst->y, &c, 1);
+ XftTextExtentsUtf8 (bst->dpy, bst->font, (FcChar8 *) &c, 1, &ov);
+ XSetForeground (bst->dpy, bst->gc, bst->bg);
+ XFillRectangle (bst->dpy, bst->window, bst->gc,
+ bst->x,
+ bst->y - bst->font->ascent,
+ ov.xOff,
+ bst->font->ascent + bst->font->descent);
+ XSetForeground (bst->dpy, bst->gc, bst->fg);
+ XftDrawStringUtf8 (bst->xftdraw, &bst->xft_fg, bst->font,
+ bst->x, bst->y, (FcChar8 *) &c, 1);
if (cursorp)
{
+ XftColor cswap = bst->xft_fg;
unsigned long swap = bst->fg;
bst->fg = bst->bg;
+ bst->xft_fg = bst->xft_bg;
bst->bg = swap;
+ bst->xft_bg = cswap;
XSetForeground (bst->dpy, bst->gc, bst->fg);
XSetBackground (bst->dpy, bst->gc, bst->bg);
c = ' ';
}
- bst->x += ov.width;
+ bst->x += ov.xOff;
if (bst->word_wrap_p)
{
@@ -637,9 +681,12 @@ bsod_pop (struct bsod_state *bst)
}
case INVERT:
{
+ XftColor cswap = bst->xft_fg;
unsigned long swap = bst->fg;
bst->fg = bst->bg;
+ bst->xft_fg = bst->xft_bg;
bst->bg = swap;
+ bst->xft_bg = cswap;
XSetForeground (bst->dpy, bst->gc, bst->fg);
XSetBackground (bst->dpy, bst->gc, bst->bg);
bst->pos++;
@@ -651,6 +698,7 @@ bsod_pop (struct bsod_state *bst)
bst->bg = (unsigned long) bst->queue[bst->pos].arg2;
XSetForeground (bst->dpy, bst->gc, bst->fg);
XSetBackground (bst->dpy, bst->gc, bst->bg);
+ set_xft_color (bst->dpy, bst->xgwa.colormap, &bst->xft_fg, bst->fg);
bst->pos++;
return 0;
}
@@ -736,7 +784,6 @@ bsod_pop (struct bsod_state *bst)
case 2: bst->font = bst->fontC; break;
default: abort(); break;
}
- XSetFont (bst->dpy, bst->gc, bst->font->fid);
bst->pos++;
return 0;
}
@@ -781,11 +828,20 @@ bsod_pop (struct bsod_state *bst)
if (type == CURSOR_BLOCK)
{
+ XGlyphInfo ov;
+ XftColor cswap = bst->xft_fg;
unsigned long swap = bst->fg;
bst->fg = bst->bg;
+ bst->xft_fg = bst->xft_bg;
bst->bg = swap;
+ bst->xft_bg = cswap;
XSetForeground (bst->dpy, bst->gc, bst->fg);
XSetBackground (bst->dpy, bst->gc, bst->bg);
+ XftTextExtentsUtf8 (bst->dpy, bst->font, (FcChar8 *) "n", 1, &ov);
+ XFillRectangle (bst->dpy, bst->window, bst->gc,
+ bst->x, bst->y - bst->font->ascent,
+ ov.width,
+ bst->font->ascent + bst->font->descent);
draw_char (bst, ' ');
}
else
@@ -874,6 +930,7 @@ make_bsod_state (Display *dpy, Window window,
char buf5[1024], buf6[1024];
char buf7[1024], buf8[1024];
char *font1, *font3, *font4;
+ int screen_no;
bst = (struct bsod_state *) calloc (1, sizeof (*bst));
bst->queue_size = 10;
@@ -882,6 +939,7 @@ make_bsod_state (Display *dpy, Window window,
bst->dpy = dpy;
bst->window = window;
XGetWindowAttributes (dpy, window, &bst->xgwa);
+ screen_no = screen_number (bst->xgwa.screen);
/* If the window is small, use ".font"; if big, ".bigFont". */
if (
@@ -925,43 +983,51 @@ make_bsod_state (Display *dpy, Window window,
#undef RES2
if (font1 && *font1)
- bst->font = load_font_retry (dpy, font1);
+ bst->font = load_xft_font_retry (dpy, screen_no, font1);
if (! bst->font)
abort();
if (font3 && *font3)
- bst->fontB = load_font_retry (dpy, font3);
+ bst->fontB = load_xft_font_retry (dpy, screen_no, font3);
if (font4 && *font4)
- bst->fontC = load_font_retry (dpy, font4);
+ bst->fontC = load_xft_font_retry (dpy, screen_no, font4);
if (! bst->fontB) bst->fontB = bst->font;
if (! bst->fontC) bst->fontC = bst->font;
bst->fontA = bst->font;
-
- gcv.font = bst->font->fid;
+ bst->xftdraw = XftDrawCreate (dpy, bst->window, bst->xgwa.visual,
+ bst->xgwa.colormap);
sprintf (buf1, "%.100s.foreground", name);
sprintf (buf2, "%.100s.Foreground", class);
bst->fg = gcv.foreground = get_pixel_resource (dpy, bst->xgwa.colormap,
buf1, buf2);
+ set_xft_color (bst->dpy, bst->xgwa.colormap, &bst->xft_fg, bst->fg);
+
sprintf (buf1, "%.100s.background", name);
sprintf (buf2, "%.100s.Background", class);
bst->bg = gcv.background = get_pixel_resource (dpy, bst->xgwa.colormap,
buf1, buf2);
- bst->gc = XCreateGC (dpy, window, GCFont|GCForeground|GCBackground, &gcv);
+
+ set_xft_color (bst->dpy, bst->xgwa.colormap, &bst->xft_fg, bst->fg);
+ set_xft_color (bst->dpy, bst->xgwa.colormap, &bst->xft_bg, bst->bg);
+
+ bst->gc = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv);
#ifdef HAVE_JWXYZ
jwxyz_XSetAntiAliasing (dpy, bst->gc, True);
#endif
-# ifdef USE_IPHONE
+# ifdef HAVE_IPHONE
/* Stupid iPhone X bezel.
- #### This is the worst of all possible ways to do this!
+ #### This is the worst of all possible ways to do this! But how else?
+ This magic number should catch iPhone X and larger, but unfortunately
+ also catches iPads which do not have the stupid bezel.
*/
- if (bst->xgwa.width == 2436 || bst->xgwa.height == 2436) {
+ if (bst->xgwa.width >= 1218 || bst->xgwa.height >= 1218) {
if (bst->xgwa.width > bst->xgwa.height)
bst->xoff = 96;
else
@@ -995,11 +1061,15 @@ free_bsod_state (struct bsod_state *bst)
if (bst->mask)
XFreePixmap(bst->dpy, bst->mask);
- XFreeFont (bst->dpy, bst->font);
- if (bst->fontB && bst->fontB != bst->font) XFreeFont (bst->dpy, bst->fontB);
- if (bst->fontC && bst->fontC != bst->font) XFreeFont (bst->dpy, bst->fontC);
+ XftFontClose (bst->dpy, bst->font);
+ if (bst->fontB && bst->fontB != bst->font)
+ XftFontClose (bst->dpy, bst->fontB);
+ if (bst->fontC && bst->fontC != bst->font)
+ XftFontClose (bst->dpy, bst->fontC);
XFreeGC (bst->dpy, bst->gc);
+ XftDrawDestroy (bst->xftdraw);
+
for (i = 0; i < bst->queue_size; i++)
switch (bst->queue[i].type) {
case LEFT: case LEFT_FULL:
@@ -1057,25 +1127,105 @@ static struct bsod_state *
windows_31 (Display *dpy, Window window)
{
struct bsod_state *bst = make_bsod_state (dpy, window, "windows", "Windows");
+ int lines = 9;
bst->xoff = bst->left_margin = bst->right_margin = 0;
- BSOD_INVERT (bst);
- BSOD_TEXT (bst, CENTER, "Windows\n");
- BSOD_INVERT (bst);
- BSOD_TEXT (bst, CENTER,
- "A fatal exception 0E has occured at F0AD:42494C4C\n"
- "the current application will be terminated.\n"
- "\n"
- "* Press any key to terminate the current application.\n"
- "* Press CTRL+ALT+DELETE again to restart your computer.\n"
- " You will lose any unsaved information in all applications.\n"
- "\n"
- "\n");
- BSOD_TEXT (bst, CENTER, "Press any key to continue");
+ switch (random() % 8) {
+
+ case 0: /* Windows 3.1 */
+ case 1:
+ case 2:
+ BSOD_INVERT (bst);
+ BSOD_TEXT (bst, CENTER, "Windows\n");
+ BSOD_INVERT (bst);
+ BSOD_TEXT (bst, CENTER,
+ "A fatal exception 0E has occurred at F0AD:42494C4C\n"
+ "the current application will be terminated.\n"
+ "\n"
+ "* Press any key to terminate the current application.\n"
+ "* Press CTRL+ALT+DELETE again to restart your computer.\n"
+ " You will lose any unsaved information in all applications.\n"
+ "\n"
+ "\n");
+ BSOD_TEXT (bst, CENTER, "Press any key to continue ");
+ BSOD_CURSOR (bst, CURSOR_LINE, 120000, 999999);
+ break;
+
+ case 3: /* Windows 3.1 */
+ case 4:
+ BSOD_INVERT (bst);
+ BSOD_TEXT (bst, CENTER, "NETSCAPE.EXE\n");
+ BSOD_INVERT (bst);
+ BSOD_TEXT (bst, CENTER,
+ " This windows application has stopped responding to the system.\n"
+ "\n"
+ "* Press ESC to cancel and return to Windows.\n"
+ "* Press ENTER to close this application that is not responding.\n"
+ " You will lose any unsaved information in this application.\n"
+ "* Press CTRL+ALT+DEL again to restart your computer. You will\n"
+ " lose any unsaved information in all applications.\n"
+ "\n");
+ BSOD_TEXT (bst, CENTER, "Press ENTER for OK or ESC to Cancel: OK\b\b");
+ BSOD_CURSOR (bst, CURSOR_LINE, 120000, 999999);
+ break;
+
+ case 5: /* Windows 95 */
+ BSOD_INVERT (bst);
+ BSOD_TEXT (bst, CENTER, "Windows\n");
+ BSOD_INVERT (bst);
+ BSOD_TEXT (bst, CENTER,
+ "An exception 00 has occurred at 0028:C18580AE in VxD HSFLOP(03) +\n"
+ "0000156E. This was called from 0028:C1858AED in VxD HSFLOP(03) +\n"
+ "0000F0AD. It may be possible to continue normally.\n"
+ "\n"
+ "* Press any key to attempt to continue.\n"
+ "* Press CTRL+ALT+DEL to restart your computer. You will\n"
+ " lose any unsaved information in all applications.\n"
+ "\n");
+ BSOD_TEXT (bst, CENTER, "Press any key to continue ");
+ BSOD_CURSOR (bst, CURSOR_LINE, 120000, 999999);
+ break;
+
+ case 6: /* Windows 95 */
+ BSOD_INVERT (bst);
+ BSOD_TEXT (bst, CENTER, "Windows\n");
+ BSOD_INVERT (bst);
+ BSOD_TEXT (bst, CENTER,
+ "A fatal exception 0E has occurred at F0AD:011747F3. The current\n"
+ "application will be terminated.\n"
+ "\n"
+ "* Press any key to terminate the current application.\n"
+ "* Press CTRL+ALT+DEL again to restart your computer. You will\n"
+ " lose any unsaved information in all applications.\n"
+ "\n");
+ BSOD_TEXT (bst, CENTER, "Press any key to continue ");
+ BSOD_CURSOR (bst, CURSOR_LINE, 120000, 999999);
+ break;
+
+ case 7: /* Windows 95 */
+ BSOD_INVERT (bst);
+ BSOD_TEXT (bst, CENTER, "WARNING!\n");
+ BSOD_INVERT (bst);
+ BSOD_TEXT (bst, CENTER,
+ "The system is either busy or has become unstable. You can wait and\n"
+ "see if it becomes available again, or you can restart your computer.\n"
+ "\n"
+ "* Press any key to return to Windows and wait.\n"
+ "* Press CTRL+ALT+DEL again to restart your computer. You will\n"
+ " lose unsaved information in any programs that are running.\n"
+ "\n");
+ BSOD_TEXT (bst, CENTER, "Press any key to continue ");
+ BSOD_CURSOR (bst, CURSOR_LINE, 120000, 999999);
+ break;
+
+ default:
+ abort();
+ break;
+ }
bst->y = ((bst->xgwa.height - bst->yoff -
- ((bst->font->ascent + bst->font->descent) * 9))
+ ((bst->font->ascent + bst->font->descent) * lines))
/ 2);
XClearWindow (dpy, window);
@@ -1121,7 +1271,7 @@ vmware (Display *dpy, Window window)
BSOD_CHAR_DELAY (bst, 100000);
BSOD_TEXT (bst, LEFT, "4321");
BSOD_CHAR_DELAY (bst, 0);
- BSOD_TEXT (bst, LEFT, "Disk dump successfull.\n"
+ BSOD_TEXT (bst, LEFT, "Disk dump successful.\n"
"Waiting for Debugger (world 1037)\n"
"Debugger is listening on serial port ...\n");
BSOD_CHAR_DELAY (bst, 10000);
@@ -1140,13 +1290,16 @@ vmware (Display *dpy, Window window)
}
-
+/* Windows NT 3.1 - 4.0
+ */
static struct bsod_state *
windows_nt (Display *dpy, Window window)
{
struct bsod_state *bst = make_bsod_state (dpy, window, "nt", "NT");
- BSOD_TEXT (bst, LEFT,
+ switch (random() % 4) {
+ case 0: case 1: case 2:
+ BSOD_TEXT (bst, LEFT,
"*** STOP: 0x0000001E (0x80000003,0x80106fc0,0x8025ea21,0xfd6829e8)\n"
"Unhandled Kernel exception c0000047 from fa8418b4 (8025ea21,fd6829e8)\n"
"\n"
@@ -1193,6 +1346,37 @@ windows_nt (Display *dpy, Window window)
);
bst->line_delay = 750;
+ break;
+
+ case 3:
+ BSOD_TEXT (bst, CENTER,
+ "Microsoft (R) Windows NT (R) Version 5.0 (Build 1796)\n"
+ "1 System Processor [128 MB Memory] MultiProcessor Kernel\n"
+ "\n"
+ "*** STOP: 0x0000006B (0xC000003A, 0x00000002,0x00000000,0x00000000)\n"
+ "PROCESS1_INITIALIZATION_FAILED\n"
+ "\n"
+ "If this is the first time you[ve seen this Stop error screen,\n"
+ "restart your computer. If this screen appears again, follow\n"
+ "these steps:\n"
+ "\n"
+ "Check to make sure any new hardware or software is properly installed.\n"
+ "If this is a new installation, ask your hardware or software manufacturer\n"
+ "for any Windows NT updates you might need.\n"
+ "\n"
+ "If problems continue, disable or remove any newly installed hardware\n"
+ "or software. Disable BIOS memory options such as caching or shadowing.\n"
+ "If you need to use Safe Mode to remove or disable components, restart\n"
+ "your computer, press F8 to select Advanced Startup Options, and then\n"
+ "select Safe Mode.\n"
+ "\n"
+ "Refer to your Getting Started manual for more information on\n"
+ "troubleshooting Stop errors.\n"
+ "\n");
+ break;
+ default:
+ abort();
+ }
XClearWindow (dpy, window);
return bst;
@@ -1204,21 +1388,50 @@ windows_2k (Display *dpy, Window window)
{
struct bsod_state *bst = make_bsod_state (dpy, window, "windows", "Windows");
- BSOD_TEXT (bst, LEFT,
+ switch (random() % 4) {
+ case 0: case 1: case 2:
+ BSOD_TEXT (bst, LEFT,
"*** STOP: 0x000000D1 (0xE1D38000,0x0000001C,0x00000000,0xF09D42DA)\n"
"DRIVER_IRQL_NOT_LESS_OR_EQUAL \n"
"\n"
"*** Address F09D42DA base at F09D4000, DateStamp 39f459ff - CRASHDD.SYS\n"
"\n"
"Beginning dump of physical memory\n");
- BSOD_PAUSE (bst, 4000000);
- BSOD_TEXT (bst, LEFT,
- "Physical memory dump complete. Contact your system administrator or\n"
- "technical support group.\n");
+ BSOD_PAUSE (bst, 4000000);
+ BSOD_TEXT (bst, LEFT,
+ "Physical memory dump complete. Contact your system administrator or\n"
+ "technical support group.\n");
- bst->left_margin = 40;
- bst->y = (bst->font->ascent + bst->font->descent) * 10;
- bst->line_delay = 750;
+ bst->left_margin = 40;
+ bst->y = (bst->font->ascent + bst->font->descent) * 10;
+ bst->line_delay = 750;
+ break;
+
+ case 3:
+ BSOD_TEXT (bst, CENTER,
+ "\n\n\n"
+ "*** STOP: 0x0000007B (0xF641F84C,0xC00000034,0x00000000,0x00000000)\n"
+ "INACCESSIBLE_BOOT_DEVICE\n"
+ "\n"
+ "If this is the first time you[ve seen this Stop error screen,\n"
+ "restart your computer. If this screen appears again, follow\n"
+ "these steps:\n"
+ "\n"
+ "Check for viruses on your computer. Remove any newly installed\n"
+ "hard drives or hard drive controllers. Chcek your hard drive\n"
+ "to make sure it is properly configured and terminated.\n"
+ "Run CHKDSK /F to check for hard drive corruption, and then\n"
+ "restart your computer.\n"
+ "\n"
+ "Refer to your Getting Started manual for more information on\n"
+ "troubleshooting Stop errors.\n"
+ "\n"
+ "\n");
+ break;
+
+ default:
+ abort();
+ }
XClearWindow (dpy, window);
return bst;
@@ -1230,15 +1443,42 @@ windows_me (Display *dpy, Window window)
{
struct bsod_state *bst = make_bsod_state (dpy, window, "windows", "Windows");
- BSOD_TEXT (bst, LEFT,
- "Windows protection error. You need to restart your computer.\n\n"
- "System halted.");
- BSOD_CURSOR (bst, CURSOR_LINE, 120000, 999999);
-
- bst->left_margin = 40;
- bst->y = ((bst->xgwa.height - bst->yoff -
- ((bst->font->ascent + bst->font->descent) * 3))
- / 2);
+ switch (random() % 3) {
+ case 0: case 1:
+ BSOD_TEXT (bst, LEFT,
+ "Windows protection error. You need to restart your computer.\n\n"
+ "System halted.");
+ BSOD_CURSOR (bst, CURSOR_LINE, 120000, 999999);
+
+ bst->left_margin = 40;
+ bst->y = ((bst->xgwa.height - bst->yoff -
+ ((bst->font->ascent + bst->font->descent) * 3))
+ / 2);
+ break;
+ case 2:
+ BSOD_INVERT (bst);
+ BSOD_TEXT (bst, CENTER, "Windows\n");
+ BSOD_INVERT (bst);
+ BSOD_TEXT (bst, CENTER,
+ "\n"
+ "An error has occurred. To continue:\n"
+ "\n"
+ "Press Enter to return to Windows, or\n"
+ "\n"
+ "Press CTRL+ALT+DEL to restart your computer. If you do this,\n"
+ "you will lose any unsaved information in all open applications.\n"
+ "\n"
+ "Error: 0E : 015F : FOAD0D0D\n"
+ "\n");
+ BSOD_TEXT (bst, CENTER, "Press any key to continue ");
+ BSOD_CURSOR (bst, CURSOR_LINE, 120000, 999999);
+ bst->y = ((bst->xgwa.height - bst->yoff -
+ ((bst->font->ascent + bst->font->descent) * 11))
+ / 2);
+ break;
+ default:
+ abort();
+ }
XClearWindow (dpy, window);
return bst;
@@ -1250,7 +1490,9 @@ windows_xp (Display *dpy, Window window)
{
struct bsod_state *bst = make_bsod_state (dpy, window, "windows", "Windows");
- BSOD_TEXT (bst, LEFT, /* From Wm. Rhodes <xscreensaver@27.org> */
+ switch (random() % 6) {
+ case 0: case 1: case 2:
+ BSOD_TEXT (bst, LEFT, /* From Wm. Rhodes <xscreensaver@27.org> */
"A problem has been detected and windows has been shut down to prevent "
"damage\n"
"to your computer.\n"
@@ -1279,12 +1521,73 @@ windows_xp (Display *dpy, Window window)
"3b9f3248\n"
"\n"
"Beginning dump of physical memory\n");
- BSOD_PAUSE (bst, 4000000);
- BSOD_TEXT (bst, LEFT,
+ BSOD_PAUSE (bst, 4000000);
+ BSOD_TEXT (bst, LEFT,
"Physical memory dump complete.\n"
"Contact your system administrator or technical support group for "
"further\n"
"assistance.\n");
+ break;
+ case 3: /* Windows XP/Vista/7 */
+ BSOD_TEXT (bst, LEFT,
+ "STOP: C0000021a {Fatal System Error}\n"
+ "The Session Manager Initialization system process terminated"
+ " unexpectedly\n"
+ "with a status of 0x00000001 (0x00000000 0x00000000).\n"
+ "The system has been shut down.\n");
+ break;
+ case 4: /* Windows CE */
+ BSOD_TEXT (bst, LEFT,
+ "A error has occurred and Windows CE has been shut down to prevent\n"
+ "damage to your computer.\n"
+ "If you will try to restart your computer, press Ctrl+Alt+Delete.\n"
+ "\n"
+ "Technical information:\n"
+ "\n"
+ "*** STOP: 0x0004c2 (inaccessible embedded device)\n"
+ "\n"
+ "\n"
+ "The computer will restart automatically\n"
+ "after 23 seconds.\n");
+ break;
+ case 5: /* Windows 8 */
+ BSOD_TEXT (bst, LEFT,
+ "A problem has been detected and windows has been shut down to prevent\n"
+ "damage to your computer.\n"
+ "\n"
+ "SYSTEM_SERVICE_EXCEPTION\n"
+ "\n"
+ "If this is the first time you[ve seen this Stop error screen,\n"
+ "restart your computer. If this screen appears again, follow\n"
+ "these steps:\n"
+ "\n"
+ "Check to make sure any new hardware or software is properly installed.\n"
+ "If this is a new installation, ask your hardware or software"
+ " manufacturer\n"
+ "for any Windows NT updates you might need.\n"
+ "\n"
+ "If problems continue, disable or remove any newly installed hardware\n"
+ "or software. Disable BIOS memory options such as caching or shadowing.\n"
+ "If you need to use Safe Mode to remove or disable components, restart\n"
+ "your computer, press F8 to select Advanced Startup Options, and then\n"
+ "select Safe Mode.\n"
+ "\n"
+ "Technical information:\n"
+ "\n"
+ "*** STOP: 0x0000003B (0x00000000c000005,0xFFFFF880041C9062,"
+ "0xFFFFF88002E22F60,0x0000000000000000(\n"
+ "\n"
+ "*** dxgmms1.sys - Address FFFFF880041C9062 base at FFFFF8800418F000,"
+ " DateStamp 4cdb7409\n"
+ "\n"
+ "Collecting data for crash dump ...\n");
+ BSOD_PAUSE (bst, 4000000);
+ BSOD_TEXT (bst, LEFT,
+ "Initializing disk for for crash dump ...\n");
+ break;
+ default:
+ abort();
+ }
XClearWindow (dpy, window);
return bst;
@@ -1445,12 +1748,11 @@ windows_10 (Display *dpy, Window window)
/ 2);
{
- int dir, ascent, descent;
- XCharStruct ov;
+ XGlyphInfo ov;
const char *s = lines[2];
- XTextExtents (bst->fontA, s, strlen(s),
- &dir, &ascent, &descent, &ov);
- left = left0 = (bst->xgwa.width - ov.width) / 2;
+
+ XftTextExtentsUtf8 (bst->dpy, bst->font, (FcChar8 *) s, strlen(s), &ov);
+ left = left0 = (bst->xgwa.width - ov.xOff) / 2;
}
pixmap = XCreatePixmapFromBitmapData (dpy, window, (char *) qr_bits,
@@ -1626,7 +1928,7 @@ windows_ransomware (Display *dpy, Window window)
const char *excuse_quip = excuse_quips[random() % countof(excuse_quips)];
- /* WELL ACTUALLY, screensavers aren't really nescessary anymore because... */
+ /* WELL ACTUALLY, screensavers aren't really necessary anymore because... */
const char *screensaver_quips[] = {
"I read it on hacker news",
"that's official Debian policy now",
@@ -1673,7 +1975,7 @@ windows_ransomware (Display *dpy, Window window)
". Also you didn't click hard enough and now Tinkerbelle is dead.\n",
"\n",
"*But Aren't Screensavers Are Necessary?\n",
- "WELL ACTUALLY, screensavers aren't really nescessary anymore because ",
+ "WELL ACTUALLY, screensavers aren't really necessary anymore because ",
"[S]", ".\n",
"\n",
"Please file complaints to @POTUS on Twitter.\n",
@@ -1929,7 +2231,7 @@ windows_ransomware (Display *dpy, Window window)
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123459789";
buf[i] = s[random() % strlen(s)];
}
- strncpy (buf, " //", 3);
+ memcpy (buf, " //", 3);
buf[10] = '/';
buf[17] = '/';
buf[24] = '/';
@@ -2310,11 +2612,13 @@ atari (Display *dpy, Window window)
atari_png, sizeof(atari_png),
&pix_w, &pix_h, &mask);
- pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
- pixmap, pix_w, pix_h);
- mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h);
- pix_w *= 2;
- pix_h *= 2;
+ for (i = 0; i < 3; i++)
+ {
+ pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
+ pixmap, pix_w, pix_h);
+ mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h);
+ pix_w *= 2; pix_h *= 2;
+ }
offset = pix_w;
x = 0;
@@ -2482,6 +2786,7 @@ macsbug (Display *dpy, Window window)
"EmToNatEndMoveParams+00014\n"
" 24DAF780 PPC 003AA180 __DisposePtr+00010");
+ XGlyphInfo ov;
const char *s;
int body_lines = 1;
@@ -2499,9 +2804,8 @@ macsbug (Display *dpy, Window window)
for (s = body; *s; s++) if (*s == '\n') body_lines++;
- char_width = (bst->font->per_char
- ? bst->font->per_char['n'-bst->font->min_char_or_byte2].width
- : bst->font->min_bounds.width);
+ XftTextExtentsUtf8 (bst->dpy, bst->font, (FcChar8 *) "n", 1, &ov);
+ char_width = ov.xOff;
line_height = bst->font->ascent + bst->font->descent;
col_right = char_width * 12; /* number of columns in `left' */
@@ -2625,17 +2929,13 @@ static struct bsod_state *
macx_10_0 (Display *dpy, Window window)
{
struct bsod_state *bst = make_bsod_state (dpy, window, "macx", "MacX");
-
+ unsigned long fg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "macx.textForeground",
+ "MacX.TextForeground");
+ unsigned long bg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "macx.textBackground",
+ "MacX.TextBackground");
XClearWindow (dpy, window);
- XSetForeground (dpy, bst->gc,
- get_pixel_resource (dpy, bst->xgwa.colormap,
- "macx.textForeground",
- "MacX.TextForeground"));
- XSetBackground (dpy, bst->gc,
- get_pixel_resource (dpy, bst->xgwa.colormap,
- "macx.textBackground",
- "MacX.TextBackground"));
-
{
Pixmap pixmap = 0;
Pixmap mask = 0;
@@ -2644,7 +2944,7 @@ macx_10_0 (Display *dpy, Window window)
hmac_png, sizeof(hmac_png),
&pix_w, &pix_h, &mask);
-# ifdef HAVE_MOBILE
+/*# ifdef HAVE_MOBILE*/
if (pixmap)
{
pixmap = double_pixmap (dpy, bst->xgwa.visual,
@@ -2654,7 +2954,7 @@ macx_10_0 (Display *dpy, Window window)
pix_w *= 2;
pix_h *= 2;
}
-# endif
+/*# endif*/
x = (bst->xgwa.width - pix_w) / 2;
y = (bst->xgwa.height - pix_h) / 2;
@@ -2674,6 +2974,7 @@ macx_10_0 (Display *dpy, Window window)
bst->wrap_p = True;
BSOD_PAUSE (bst, 3000000);
+ BSOD_COLOR(bst, fg2, bg2);
BSOD_TEXT (bst, LEFT,
"panic(cpu 0): Unable to find driver for this platform: "
"\"PowerMac 3,5\".\n"
@@ -2726,7 +3027,7 @@ macx_10_2 (Display *dpy, Window window, Bool v10_3_p)
if (! pixmap) abort();
if (! mask) abort();
-#if 0
+#if 1
if (bst->xgwa.height > 600) /* scale up the bitmap */
{
pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
@@ -2759,18 +3060,20 @@ static struct bsod_state *
mac_diskfail (Display *dpy, Window window)
{
struct bsod_state *bst = make_bsod_state (dpy, window, "macdisk", "Mac");
- int cw = (bst->font->per_char
- ? bst->font->per_char['n'-bst->font->min_char_or_byte2].width
- : bst->font->min_bounds.width);
- int h = bst->font->ascent + bst->font->descent;
- int L = (bst->xgwa.width - (cw * 80)) / 2;
- int T = (bst->xgwa.height - (h * 10)) / 2;
-
- unsigned long fg = bst->fg;
- unsigned long bg = bst->bg;
- unsigned long bg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
- "macx.background",
- "Mac.Background");
+ XGlyphInfo ov;
+ int cw, h, L, T;
+ unsigned long fg, bg, bg2;
+
+ XftTextExtentsUtf8 (bst->dpy, bst->font, (FcChar8 *) "n", 1, &ov);
+ cw = ov.xOff;
+ h = bst->font->ascent + bst->font->descent;
+ L = (bst->xgwa.width - (cw * 80)) / 2;
+ T = (bst->xgwa.height - (h * 10)) / 2;
+
+ fg = bst->fg;
+ bg = bst->bg;
+ bg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "macx.background", "Mac.Background");
if (L < 0) L = 0;
if (T < 0) T = 0;
@@ -3028,7 +3331,7 @@ macx_install (Display *dpy, Window window)
static struct bsod_state *
macx (Display *dpy, Window window)
{
- switch (1?4:random() % 5) {
+ switch (random() % 5) {
case 0: return macx_10_0 (dpy, window); break;
case 1: return macx_10_2 (dpy, window, False); break;
case 2: return macx_10_2 (dpy, window, True); break;
@@ -3222,7 +3525,7 @@ os2 (Display *dpy, Window window)
"contact your service representative.\n",
/* Warp 4.52+, typical JFS problem. */
- "Exeption in module: JFS\n"
+ "Exception in module: JFS\n"
"TRAP 0003 ERRCD=0000 ERACC=**** ERLIM=********\n"
"EAX=00000000 EBX=ffffff05 ECX=00000001 EDX=f5cd8010\n"
"ESI=000000e6 EDI=000000e7 EBP=f9c7378e FLG=00002296\n"
@@ -3267,10 +3570,9 @@ sparc_solaris (Display *dpy, Window window)
Pixmap pixmap = image_data_to_pixmap (dpy, window,
sun_png, sizeof(sun_png),
&pix_w, &pix_h, &mask);
-
- char_width = (bst->font->per_char
- ? bst->font->per_char['n'-bst->font->min_char_or_byte2].width
- : bst->font->min_bounds.width);
+ XGlyphInfo ov;
+ XftTextExtentsUtf8 (bst->dpy, bst->font, (FcChar8 *) "n", 1, &ov);
+ char_width = ov.xOff;
if (pixmap)
while (pix_w < char_width * 4)
@@ -4596,7 +4898,6 @@ hpux (Display *dpy, Window window)
int size = 40;
for (i = 0; i <= steps; i++)
{
- if (i > steps) i = steps;
sprintf (buf,
"*** Dumping: %3d%% complete (%d of 40 MB) (device 64:0x2)\r",
i * 100 / steps,
@@ -5652,14 +5953,14 @@ static struct bsod_state *
tivo (Display *dpy, Window window)
{
struct bsod_state *bst = make_bsod_state (dpy, window, "tivo", "Tivo");
- int char_width =
- (bst->font->per_char
- ? bst->font->per_char['n'-bst->font->min_char_or_byte2].width
- : bst->font->min_bounds.width);
+ XGlyphInfo ov;
int line_height = bst->font->ascent + bst->font->descent;
+ int char_width, left, top;
+ XftTextExtentsUtf8 (bst->dpy, bst->font, (FcChar8 *) "n", 1, &ov);
+ char_width = ov.xOff;
- int left = (bst->xgwa.width - char_width * 44) / 2;
- int top = (bst->xgwa.height - line_height * 15) / 2;
+ left = (bst->xgwa.width - char_width * 44) / 2;
+ top = (bst->xgwa.height - line_height * 15) / 2;
if (left < 0) left = 0;
if (top < 0) top = 0;
@@ -5705,16 +6006,17 @@ nintendo (Display *dpy, Window window)
unsigned long fg = get_pixel_resource (dpy, bst->xgwa.colormap,
"nintendo.foreground",
"Nintendo.Foreground");
- int char_width =
- (bst->font->per_char
- ? bst->font->per_char['n'-bst->font->min_char_or_byte2].width
- : bst->font->min_bounds.width);
int line_height = bst->font->ascent + bst->font->descent;
-
- int left = (bst->xgwa.width - char_width * 30) / 2;
- int top = (bst->xgwa.height - line_height * 9) / 2;
- int left2 = left - char_width * 4;
- int top2 = top - line_height;
+ XGlyphInfo ov;
+ int char_width;
+ int left, top, left2, top2;
+
+ XftTextExtentsUtf8 (bst->dpy, bst->font, (FcChar8 *) "n", 1, &ov);
+ char_width = ov.xOff;
+ left = (bst->xgwa.width - char_width * 30) / 2;
+ top = (bst->xgwa.height - line_height * 9) / 2;
+ left2 = left - char_width * 4;
+ top2 = top - line_height;
if (left < 0) left = 0;
if (top < 0) top = 0;
if (left2 < 0) left2 = 0;
@@ -5741,8 +6043,7 @@ nintendo (Display *dpy, Window window)
ビデオゲームのコピーは法律で禁じられています。
詳しくは取扱説明書をご覧になってください。
- but BSOD_TEXT doesn't do Xft, and more importantly, "PxPlus IBM VGA8"
- doesn't contain Japanese characters.
+ but "PxPlus IBM VGA8" doesn't contain Japanese characters.
*/
BSOD_TEXT (bst, CENTER, "WARNING");
@@ -5763,7 +6064,7 @@ nintendo (Display *dpy, Window window)
}
-/* An Android phone boot loader, by jwz.
+/* A 2013 Android phone boot loader, by jwz.
*/
static struct bsod_state *
android (Display *dpy, Window window)
@@ -5841,16 +6142,16 @@ android (Display *dpy, Window window)
" No image!\n",
};
- int cw = (bst->font->per_char
- ? bst->font->per_char['n'-bst->font->min_char_or_byte2].width
- : bst->font->min_bounds.width);
int line_height = bst->font->ascent + bst->font->descent;
-
+ int cw;
+ XGlyphInfo ov;
int state = 0;
-
Pixmap pixmap = 0, mask = 0;
int pix_w = 0, pix_h = 0;
+ XftTextExtentsUtf8 (bst->dpy, bst->font, (FcChar8 *) "n", 1, &ov);
+ cw = ov.xOff;
+
pixmap = image_data_to_pixmap (dpy, window,
android_png, sizeof(android_png),
&pix_w, &pix_h, &mask);
@@ -5995,6 +6296,65 @@ android (Display *dpy, Window window)
}
+/* Gnome SOD. Truly 2020 will be the year of the Linux Desktop. */
+static struct bsod_state *
+gnome (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "gnome", "Gnome");
+
+ int pix_w, pix_h;
+ int x, y;
+ int lh = bst->font->ascent + bst->font->descent;
+ Pixmap mask = 0;
+ Pixmap pixmap;
+ unsigned long fg, bg;
+ Bool which = random() & 1;
+
+ if (which)
+ {
+ pixmap = image_data_to_pixmap (dpy, window,
+ gnome2_png, sizeof(gnome2_png),
+ &pix_w, &pix_h, &mask);
+ fg = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "gnome.foreground2", "Gnome.Foreground");
+ bg = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "gnome.background2", "Gnome.Background");
+ }
+ else
+ {
+ pixmap = image_data_to_pixmap (dpy, window,
+ gnome1_png, sizeof(gnome1_png),
+ &pix_w, &pix_h, &mask);
+ fg = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "gnome.foreground", "Gnome.Foreground");
+ bg = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "gnome.background", "Gnome.Background");
+ }
+
+ x = (bst->xgwa.width - pix_w) / 2;
+ y = (bst->xgwa.height - pix_h) / 2;
+ if (y < 0) y = 0;
+
+ XSetWindowBackground (dpy, window, bg);
+ XClearWindow (dpy, window);
+ XSetClipMask (dpy, bst->gc, mask);
+ XSetClipOrigin (dpy, bst->gc, x, y);
+ XCopyArea (dpy, pixmap, window, bst->gc, 0, 0, pix_w, pix_h, x, y);
+ XSetClipMask (dpy, bst->gc, None);
+ XFreePixmap (dpy, mask);
+
+ BSOD_MOVETO (bst, 0, y + pix_h + lh * 2);
+ BSOD_COLOR (bst, fg, bg);
+ BSOD_FONT (bst, 0);
+ BSOD_TEXT (bst, CENTER, "Oh no! Something has gone wrong!\n\n");
+ BSOD_FONT (bst, 1);
+ BSOD_TEXT (bst, CENTER,
+ "A problem has occurred and the system can't recover.\n");
+ BSOD_TEXT (bst, CENTER, "Please log out and try again.");
+ BSOD_PAUSE (bst, 60 * 1000000);
+
+ return bst;
+}
/*****************************************************************************
@@ -6042,6 +6402,7 @@ static const struct {
{ "DVD", dvd },
{ "Tivo", tivo },
{ "Nintendo", nintendo },
+ { "Gnome", gnome },
};
@@ -6165,8 +6526,9 @@ bsod_draw (Display *dpy, Window window, void *closure)
/* XSync (dpy, False); slows down char drawing too much on HAVE_JWXYZ */
- if (this_delay == 0)
+ if (this_delay == 0){
goto AGAIN; /* no delay, not expired: stay here */
+}
else if (this_delay >= 0)
{
dst->delay_remaining = this_delay; /* return; time to sleep */
@@ -6365,6 +6727,7 @@ static const char *bsod_defaults [] = {
"*doDVD: True",
"*doTivo: True",
"*doNintendo: True",
+ "*doGnome: True",
".foreground: White",
".background: Black",
@@ -6483,6 +6846,11 @@ static const char *bsod_defaults [] = {
".nintendo.background2: #085C89",
".nintendo.foreground: #EEAACF",
+ ".gnome.background: #000000",
+ ".gnome.foreground: #E2E2E2",
+ ".gnome.background2: #F0F0F0",
+ ".gnome.foreground2: #2E3436",
+
"*dontClearRoot: True",
ANALOGTV_DEFAULTS
@@ -6493,166 +6861,63 @@ static const char *bsod_defaults [] = {
".lowrez: false", /* This is required on macOS */
- "*fontB: ",
- "*fontC: ",
-
-# if defined(USE_IPHONE)
-
- "*font: PxPlus IBM VGA8 16, Courier-Bold 14",
- "*bigFont: ",
-
- ".mac.font: Courier-Bold 18",
- ".macsbug.font: Courier-Bold 8",
- ".macx.font: Courier-Bold 14",
- ".macdisk.font: Courier-Bold 14",
- ".macinstall.font: Helvetica 12, Arial 12",
- ".macinstall.bigFont: Helvetica 12, Arial 12",
- ".msdos.font: PxPlus IBM VGA8 32, Courier-Bold 28",
- ".nt.font: PxPlus IBM VGA8 12, Courier-Bold 10",
- ".win10.font: Arial 12, Helvetica 12",
- ".win10.bigFont: Arial 12, Helvetica 12",
- ".win10.fontB: Arial 50, Helvetica 50",
- ".win10.fontC: Arial 9, Helvetica 9",
-
- /* The real Solaris font is Gallant (../OSX/gallant12x22.ttf)
- but Luxi Mono (../OSX/luximr.ttf) is pretty close as well. */
- ".solaris.font: Gallant12x22 12, Luxi Mono 12, PxPlus IBM VGA8 12, Courier Bold 12",
- /* "Arial" loads "ArialMT" but "Arial Bold" does not load "Arial-BoldMT"? */
- ".ransomware.font: Arial 11, Helvetica 11",
- ".ransomware.fontB: Arial 9, Helvetica 9",
- ".ransomware.fontC: Arial Bold 11, Arial-BoldMT 11, Helvetica Bold 11",
-
- ".tivo.font: Helvetica-Bold 13",
- ".tivo.fontB: Helvetica-Bold 17",
-
- ".nintendo.font: PxPlus IBM VGA8 18, Courier-Bold 18",
-
-# elif defined(HAVE_ANDROID)
-
- "*font: PxPlus IBM VGA8 16",
- "*bigFont: ",
-
- ".mac.font: -*-courier-bold-r-*-*-*-180-*-*-m-*-*-*",
- ".macsbug.font: -*-courier-bold-r-*-*-*-80-*-*-m-*-*-*",
- ".macx.font: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
- ".macdisk.font: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
- ".macinstall.font: -*-helvetica-medium-r-*-*-*-120-*-*-*-*-*-*",
- ".macinstall.bigFont: -*-helvetica-medium-r-*-*-*-120-*-*-*-*-*-*",
- ".msdos.font: PxPlus IBM VGA8 32",
- ".nt.font: PxPlus IBM VGA8 12",
- ".solaris.font: Gallant12x22 14, Luxi Mono 12, PxPlus IBM VGA8 12, Courier Bold 12",
-
- ".win10.font: -*-helvetica-medium-r-*-*-*-120-*-*-*-*-*-*",
- ".win10.bigFont: -*-helvetica-medium-r-*-*-*-120-*-*-*-*-*-*",
- ".win10.fontB: -*-helvetica-medium-r-*-*-*-500-*-*-*-*-*-*",
- ".win10.fontC: -*-helvetica-medium-r-*-*-*-90-*-*-*-*-*-*",
-
- ".ransomware.font: -*-helvetica-medium-r-*-*-*-100-*-*-*-*-*-*",
- ".ransomware.fontB: -*-helvetica-medium-r-*-*-*-80-*-*-*-*-*-*",
- ".ransomware.fontC: -*-helvetica-bold-r-*-*-*-100-*-*-*-*-*-*",
-
- ".tivo.font: -*-helvetica-medium-r-*-*-*-180-*-*-*-*-*-*",
- ".tivo.fontB: -*-helvetica-bold-r-*-*-*-240-*-*-*-*-*-*",
-
- ".nintendo.font: PxPlus IBM VGA8 18",
-
-# elif defined(HAVE_COCOA)
+ /* "bigFont" replaces "font" on desktop if window height >= 640. */
- "*font: PxPlus IBM VGA8 8, Courier Bold 9",
- "*bigFont: PxPlus IBM VGA8 32, Courier Bold 24",
- ".mac.font: Monaco 10, Courier Bold 9",
- ".mac.bigFont: Monaco 18, Courier Bold 18",
+ /* Some of the following fonts can only display ASCII, but that's
+ ok because this program only displays static ASCII text. */
- ".macsbug.font: Monaco 10, Courier Bold 9",
- ".macsbug.bigFont: Monaco 10, Courier Bold 9",
- ".macx.font: Courier Bold 9",
- ".macx.bigFont: Courier Bold 14",
- ".macdisk.font: Courier Bold 9",
- ".macdisk.bigFont: Courier Bold 18",
- ".macinstall.font: Helvetica 24, Arial 24",
- ".macinstall.bigFont: Helvetica 24, Arial 24",
+ /* "Classic Console" is the MS-DOS 8x16 VGA font. */
+ "*font: Classic Console 12, Courier Bold 12",
+ "*bigFont: Classic Console 24, Courier Bold 24",
+ "*fontB: ",
+ "*fontC: ",
- ".hvx.bigFont: PxPlus IBM VGA8 24, Courier Bold 14",
- ".hppalinux.bigFont: PxPlus IBM VGA8 24, Courier Bold 14",
- ".linux.bigFont: PxPlus IBM VGA8 24, Courier Bold 14",
- ".hpux.bigFont: PxPlus IBM VGA8 24, Courier Bold 14",
- ".msdos.font: PxPlus IBM VGA8 24, Courier Bold 14",
- ".solaris.font: Gallant12x22 12, Luxi Mono 12, PxPlus IBM VGA8 12, Courier Bold 12",
- ".solaris.bigFont: Gallant12x22 22, Luxi Mono 16, PxPlus IBM VGA8 16, Courier Bold 14",
+ ".win10.font: Arial 24, Helvetica 24",
+ ".win10.bigFont: Arial 24, Helvetica 24",
+ ".win10.fontB: Arial 36, Helvetica 36",
+ ".win10.fontC: Arial 16, Helvetica 16",
- ".win10.font: Arial 24, Helvetica 24",
- ".win10.bigFont: Arial 24, Helvetica 24",
- ".win10.fontB: Arial 100, Helvetica 100",
- ".win10.fontC: Arial 16, Helvetica 16",
-
- ".ransomware.font: Arial 24, Helvetica 24",
- ".ransomware.bigFont: Arial 24, Helvetica 24",
- ".ransomware.fontB: Arial 16, Helvetica 16",
- ".ransomware.fontC: Arial Bold 24, Helvetica Bold 24",
-
- ".tivo.font: Helvetica 36",
- ".tivo.fontB: Helvetica 48",
-
- ".nintendo.font: PxPlus IBM VGA8 12, Courier Bold 12",
- ".nintendo.bigFont: PxPlus IBM VGA8 48, Courier Bold 48",
-
-# else /* X11 */
-
- "*font: 9x15bold",
- "*bigFont: -*-courier-bold-r-*-*-*-180-*-*-m-*-*-*",
+ /* "Arial" loads "ArialMT" but "Arial Bold" does not load "Arial-BoldMT"? */
+ ".ransomware.font: Arial 12, Helvetica 12",
+ ".ransomware.bigFont: Arial 12, Helvetica 12",
+ ".ransomware.fontB: Arial 8, Helvetica 8",
+ ".ransomware.fontC: Arial Bold 16, Arial-BoldMT 16, Helvetica Bold 16",
- ".macsbug.font: -*-courier-medium-r-*-*-*-80-*-*-m-*-*-*",
- ".macsbug.bigFont: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+ ".macsbug.font: Monaco 8, Courier Bold 8",
+ ".macsbug.bigFont: Monaco 14, Courier Bold 14",
- ".macdisk.font: -*-courier-bold-r-*-*-*-80-*-*-m-*-*-*",
- ".macdisk.bigFont: -*-courier-bold-r-*-*-*-100-*-*-m-*-*-*",
- ".macinstall.font: -*-helvetica-medium-r-*-*-*-180-*-*-*-*-*-*",
- ".macinstall.bigFont: -*-helvetica-medium-r-*-*-*-180-*-*-*-*-*-*",
+ ".macx.font: Courier Bold 10",
+ ".macx.bigFont: Courier Bold 14",
- ".sco.font: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
- ".hvx.font: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
- ".hppalinux.bigFont: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
- ".sparclinux.bigFont: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+ ".macdisk.font: Courier Bold 14",
+ ".macdisk.bigFont: Courier Bold 14",
- /* Some systems might have this, but I'm not sure where it comes from: */
- /* ".bsd.font: -*-vga-normal-r-*-*-*-120-*-*-c-*-*-*", */
- /* The fonts/misc/vga.pcf that comes with xdosemu has no XLFD name: */
- ".bsd.font: vga",
- ".bsd.bigFont: -*-vga-normal-r-*-*-*-220-*-*-c-*-*-*",
+ ".macinstall.font: Helvetica 12, Arial 12",
+ ".macinstall.bigFont: Helvetica 24, Arial 24",
- /* The original Solaris console font was:
- -sun-gallant-demi-r-normal-*-*-140-*-*-c-*-*-*
- Red Hat introduced Luxi Mono as its console font, which is similar
- to Gallant. X.Org includes it but Debian and Fedora do not. */
- ".solaris.font: -*-luxi mono-medium-r-normal--*-140-*-*-m-*-*-*",
-
- ".hpux.bigFont: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
- ".os390.bigFont: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
- ".tru64.bigFont: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
- ".vms.bigFont: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
- ".msdos.bigFont: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
-
- ".win10.font: -*-helvetica-medium-r-*-*-*-180-*-*-*-*-*-*",
- ".win10.bigFont: -*-helvetica-medium-r-*-*-*-180-*-*-*-*-*-*",
- ".win10.fontB: -*-helvetica-medium-r-*-*-*-240-*-*-*-*-*-*",
- ".win10.fontC: -*-helvetica-medium-r-*-*-*-140-*-*-*-*-*-*",
+ /* "Gallant" was the original Solaris 2.x console font. */
+ ".solaris.font: Gallant12x22 12, Luxi Mono 12, Courier Bold 12",
+ ".solaris.bigFont: Gallant12x22 24, Luxi Mono 24, Courier Bold 24",
- ".ransomware.font: -*-helvetica-medium-r-*-*-*-180-*-*-*-*-*-*",
- ".ransomware.bigFont: -*-helvetica-medium-r-*-*-*-180-*-*-*-*-*-*",
- ".ransomware.fontB: -*-helvetica-medium-r-*-*-*-140-*-*-*-*-*-*",
- ".ransomware.fontC: -*-helvetica-bold-r-*-*-*-180-*-*-*-*-*-*",
+ /* "Luxi Mono" was the Red Hat console font. */
+ ".linux.font: Luxi Mono 12, Gallant12x22 12, Courier Bold 12",
+ ".linux.bigFont: Luxi Mono 24, Gallant12x22 24, Courier Bold 24",
- ".tivo.font: -*-helvetica-medium-r-*-*-*-180-*-*-*-*-*-*",
- ".tivo.fontB: -*-helvetica-bold-r-*-*-*-240-*-*-*-*-*-*",
+ ".android.font: Courier Bold 12",
+ ".android.bigFont: Courier Bold 24",
- ".nintendo.font: -*-courier-bold-r-*-*-*-180-*-*-m-*-*-*",
- ".nintendo.bigFont: -*-courier-bold-r-*-*-*-360-*-*-m-*-*-*",
+ ".tivo.font: Helvetica Bold 16",
+ ".tivo.bigFont: Helvetica Bold 28",
-# endif /* X11 */
+ ".nintendo.font: Classic Console 18, Courier Bold 18",
+ ".nintendo.bigFont: Classic Console 40, Courier Bold 40",
+ ".gnome.font: Helvetica Bold 13",
+ ".gnome.bigFont: Helvetica Bold 13",
+ ".gnome.fontB: Helvetica 13",
0
};
@@ -6730,6 +6995,8 @@ static const XrmOptionDescRec bsod_options [] = {
{ "-no-tivo", ".doTivo", XrmoptionNoArg, "False" },
{ "-nintendo", ".doNintendo", XrmoptionNoArg, "True" },
{ "-no-nintendo", ".doNintendo", XrmoptionNoArg, "False" },
+ { "-gnome", ".doGnome", XrmoptionNoArg, "True" },
+ { "-no-gnome", ".doGnome", XrmoptionNoArg, "False" },
ANALOGTV_OPTIONS
{ 0, 0, 0, 0 }
};
diff --git a/hacks/bsod.man b/hacks/bsod.man
index 0043e7f..a722da9 100644
--- a/hacks/bsod.man
+++ b/hacks/bsod.man
@@ -1,19 +1,6 @@
-.de EX \"Begin example
-.ne 5
-.if n .sp 1
-.if t .sp .5
-.nf
-.in +.5i
-..
-.de EE
-.fi
-.in -.5i
-.if n .sp 1
-.if t .sp .5
-..
.TH XScreenSaver 1 "5-May-2004" "X Version 11"
.SH NAME
-bsod - Blue Screen of Death emulator
+bsod \- Blue Screen of Death emulator
.SH SYNOPSIS
.B bsod
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
diff --git a/hacks/bubbles.c b/hacks/bubbles.c
index eefe048..8116e36 100644
--- a/hacks/bubbles.c
+++ b/hacks/bubbles.c
@@ -39,9 +39,10 @@
* Internet E-mail : j-macnicol@adfa.edu.au
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include "screenhack.h"
+#include "yarandom.h"
+#include "bubbles.h"
+#include "ximage-loader.h"
#undef DEBUG /* doesn't compile */
@@ -60,11 +61,6 @@
# include <unistd.h>
#endif
-#include "screenhack.h"
-#include "yarandom.h"
-#include "bubbles.h"
-#include "ximage-loader.h"
-
#define FANCY_BUBBLES
/*
@@ -157,9 +153,9 @@ calc_bubble_area(struct state *st, int r)
10.0 * PI * (double)r * (double)r * (double)r);
#endif /* DEBUG */
if (st->threed)
- return (long)(10.0 * PI * (double)r * (double)r * (double)r);
+ return (long)(10.0 * M_PI * (double)r * (double)r * (double)r);
else
- return (long)(10.0 * PI * (double)r * (double)r);
+ return (long)(10.0 * M_PI * (double)r * (double)r);
}
static void *
diff --git a/hacks/bubbles.h b/hacks/bubbles.h
index 24872e3..08e81d5 100644
--- a/hacks/bubbles.h
+++ b/hacks/bubbles.h
@@ -138,15 +138,6 @@
* End of options *
****************************************************************************/
-/* Some machines define M_PI and not PI. If they don't define either, use
-own own. Really, the accuracy of this is _not_ very important. */
-#ifndef PI
-# define PI M_PI
-# ifndef M_PI
-# define M_PI 3.1415926535
-# endif
-#endif
-
/* for delete_bubble_in_mesh() */
#define DELETE_BUBBLE 0
#define KEEP_BUBBLE 1
diff --git a/hacks/bubbles.man b/hacks/bubbles.man
index f9b892e..25d77f6 100644
--- a/hacks/bubbles.man
+++ b/hacks/bubbles.man
@@ -1,19 +1,6 @@
-.de EX \"Begin example
-.ne 5
-.if n .sp 1
-.if t .sp .5
-.nf
-.in +.5i
-..
-.de EE
-.fi
-.in -.5i
-.if n .sp 1
-.if t .sp .5
-..
.TH XScreenSaver 1 "14-Dec-95" "X Version 11"
.SH NAME
-bubbles - frying pan / soft drink simulation
+bubbles \- frying pan / soft drink simulation
.SH SYNOPSIS
.B bubbles
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-simple] [\-broken] [\-3D] [\-rise|\-drop] [-trails]
diff --git a/hacks/bumps.man b/hacks/bumps.man
index 8e47184..717c1c3 100644
--- a/hacks/bumps.man
+++ b/hacks/bumps.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "05-Apr-1999" "X Version 11"
.SH NAME
-bumps - move distorting spotlight around desktop
+bumps \- move distorting spotlight around desktop
.SH SYNOPSIS
.B bumps
[\-display \fIhost:display.screen\fP]
@@ -24,7 +24,7 @@ or from a random file on disk, as indicated by
the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
file; see
-.BR xscreensaver-demo (1)
+.BR xscreensaver\-settings (1)
for more details.
.SH OPTIONS
.I bumps
@@ -66,8 +66,8 @@ stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1),
-.BR xscreensaver\-demo (1),
-.BR xscreensaver\-getimage (1)
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-getimage (MANSUFFIX)
.SH COPYRIGHT
Copyright \(co 1999 by Shane Smit. Permission to use, copy, modify,
distribute, and sell this software and its documentation for any purpose is
diff --git a/hacks/ccurve.man b/hacks/ccurve.man
index 93b81fc..d2b8ae8 100644
--- a/hacks/ccurve.man
+++ b/hacks/ccurve.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-ccurve - self-similar linear fractals.
+ccurve \- self-similar linear fractals.
.SH SYNOPSIS
.B ccurve
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/celtic.man b/hacks/celtic.man
index 9747cd5..06b81d7 100644
--- a/hacks/celtic.man
+++ b/hacks/celtic.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-celtic - draws celtic cross-stich patterns
+celtic \- draws celtic cross-stich patterns
.SH SYNOPSIS
.B ifs
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/check-configs.pl b/hacks/check-configs.pl
index 7cc60b4..0922e7d 100755
--- a/hacks/check-configs.pl
+++ b/hacks/check-configs.pl
@@ -1,5 +1,5 @@
#!/usr/bin/perl -w
-# Copyright © 2008-2018 Jamie Zawinski <jwz@jwz.org>
+# Copyright © 2008-2021 Jamie Zawinski <jwz@jwz.org>
#
# Permission to use, copy, modify, distribute, and sell this software and its
# documentation for any purpose is hereby granted without fee, provided that
@@ -21,7 +21,7 @@ use diagnostics;
use strict;
my $progname = $0; $progname =~ s@.*/@@g;
-my ($version) = ('$Revision: 1.28 $' =~ m/\s(\d[.\d]+)\s/s);
+my ($version) = ('$Revision: 1.36 $' =~ m/\s(\d[.\d]+)\s/s);
my $verbose = 0;
my $debug_p = 0;
@@ -80,7 +80,7 @@ sub parse_src($) {
$file = "../hacks/$ofile" unless (-f $file);
$file = "../hacks/glx/$ofile" unless (-f $file);
my $body = '';
- open (my $in, '<', $file) || error ("$ofile: $!");
+ open (my $in, '<:utf8', $file) || error ("$ofile: $!");
while (<$in>) { $body .= $_; }
close $in;
$file =~ s@^.*/@@;
@@ -103,6 +103,7 @@ sub parse_src($) {
s/^\s*//s;
s/\s*$//s;
next if m/^0?$/s;
+ s/"[ \t]*\n\s*"//s; # string-append continuation lines
my ($key, $val) = m@^\"([^:\s]+)\s*:\s*(.*?)\s*\"$@;
print STDERR "$progname: $file: unparsable: $_\n" unless $key;
$key =~ s/^[.*]//s;
@@ -221,7 +222,7 @@ sub parse_xml($$$) {
my $ofile = $file;
$file = "../hacks/$ofile" unless (-f $file);
my $body = '';
- open (my $in, '<', $file) || error ("$ofile: $!");
+ open (my $in, '<:utf8', $file) || error ("$ofile: $!");
while (<$in>) { $body .= $_; }
close $in;
$file =~ s@^.*/@@;
@@ -440,11 +441,12 @@ sub parse_xml($$$) {
}
-sub check_config($) {
- my ($saver) = @_;
+sub check_config($$) {
+ my ($saver, $android_p) = @_;
# kludge
return 0 if ($saver =~ m/(-helper)$/);
+ return 0 if ($saver =~ m/(xscreensaver-)/);
my ($src_opts, $switchmap) = parse_src ($saver);
my ($saver_title, $gl_p, $xml_opts, $widgets) =
@@ -461,6 +463,8 @@ sub check_config($) {
if ($verbose > 1);
} elsif (!defined($sval)) {
print STDERR "$progname: $saver: $res: not in source\n";
+ } elsif ($res eq 'progclass') {
+ # Ignore this one
} elsif ($claim !~ m/ = %$/s &&
($compare eq '!='
? $sval eq $xval
@@ -477,7 +481,7 @@ sub check_config($) {
# the XCode target name.
#
my $obd = "../OSX/build/Debug";
- if (-d $obd) {
+ if (!$android_p && -d $obd) {
my $progclass = $src_opts->{progclass};
$progclass = 'DNAlogo' if ($progclass eq 'DNALogo');
my $f = (glob("$obd/$progclass.saver*"))[0];
@@ -577,7 +581,7 @@ sub write_file_if_changed($$;$) {
my ($outfile, $body, $suffix_msg) = @_;
my $file_tmp = "$outfile.tmp";
- open (my $out, '>', $file_tmp) || error ("$file_tmp: $!");
+ open (my $out, '>:utf8', $file_tmp) || error ("$file_tmp: $!");
(print $out $body) || error ("$file_tmp: $!");
close $out || error ("$file_tmp: $!");
rename_or_delete ($outfile, $file_tmp, $suffix_msg);
@@ -589,7 +593,7 @@ sub write_file_if_changed($$;$) {
sub read_template($$) {
my ($file, $subs) = @_;
my $body = '';
- open (my $in, '<', $file) || error ("$file: $!");
+ open (my $in, '<:utf8', $file) || error ("$file: $!");
while (<$in>) { $body .= $_; }
close $in;
@@ -680,6 +684,8 @@ sub munge_blurb($$$$) {
"\n" .
$desc .
"\n");
+ utf8::decode($desc1); # Pack UTF-8 into wide chars.
+ utf8::decode($desc2);
# unwrap lines, but only when it's obviously ok: leave blank lines,
# and don't unwrap if that would compress leading whitespace on a line.
@@ -719,7 +725,7 @@ sub build_android(@) {
{
my $file = "../utils/version.h";
my $body = '';
- open (my $in, '<', $file) || error ("$file: $!");
+ open (my $in, '<:utf8', $file) || error ("$file: $!");
while (<$in>) { $body .= $_; }
close $in;
($vers) = ($body =~ m@ (\d+\.[0-9a-z]+) @s);
@@ -735,16 +741,16 @@ sub build_android(@) {
my ($saver_title, $gl_p, $xml_opts, $widgets) =
parse_xml ($saver, $switchmap, $src_opts);
- my $saver_class = "${saver_title}";
- $saver_class =~ s/\s+//gs;
- $saver_class =~ s/^([a-z])/\U$1/gs; # upcase first letter
+ # The Android daydream list sorts the $saver_title strings with strcmp,
+ # meaning capitals come before lower case, and "ö" comes after "z".
+ # It doesn't matter how we order them in the XML files.
+ $saver_title =~ s/^([a-z])/\U$1/gs; # upcase first letter
- $saver_title =~ s/(.[a-z])([A-Z\d])/$1 $2/gs; # Spaces in InterCaps
- $saver_title =~ s/^(GL|RD)[- ]?(.)/$1 \U$2/gs; # Space after "GL"
- $saver_title =~ s/^Apple ?2$/Apple &#x5D;&#x5B;/gs; # "Apple ]["
- $saver_title =~ s/(m)oe(bius)/$1&#xF6;$2/gsi; # &ouml;
- $saver_title =~ s/(moir)e/$1&#xE9;/gsi; # &eacute;
- $saver_title =~ s/^([a-z])/\U$1/s; # "M6502" for sorting
+ # This is a Java class name, so it could just be $saver, but it turns
+ # out that unicrud is allowed in class names, so why not.
+ my $saver_class = $saver_title;
+ $saver_class =~ s/\]\[/2/gs;
+ $saver_class =~ s/[-_\s]//gs;
my $settings = '';
@@ -1091,8 +1097,18 @@ sub build_android(@) {
" android:versionCode=\"$versb\"\n" .
" android:versionName=\"$vers\">\n" .
- " <uses-sdk android:minSdkVersion=\"16\"" .
- " android:targetSdkVersion=\"19\" />\n" .
+ # Without this shit we get "APP_PLATFORM android-18 is higher
+ # than android:minSdkVersion 1 in AndroidManifest.xml"
+ #
+ # But with it "lintVitalRelease" complains with:
+ # "The minSdk version should not be declared in the android
+ # manifest file. You can move the version from the manifest to
+ # the defaultConfig in the build.gradle file."
+ #
+ # That crap is already in android/xscreensaver/build.gradle.
+ #
+ # " <uses-sdk android:minSdkVersion=\"18\"" .
+ # " android:targetSdkVersion=\"30\" />\n" .
" <uses-feature android:glEsVersion=\"0x00010001\"\n" .
" android:required=\"true\" />\n" .
@@ -1216,6 +1232,9 @@ sub usage() {
}
sub main() {
+ binmode (STDOUT, ':utf8');
+ binmode (STDERR, ':utf8');
+
my $android_p = 0;
my @files = ();
while ($#ARGV >= 0) {
@@ -1232,7 +1251,7 @@ sub main() {
usage unless ($#files >= 0);
my $failures = 0;
foreach my $file (@files) {
- $failures += check_config ($file);
+ $failures += check_config ($file, $android_p);
}
build_android (@files) if ($android_p);
diff --git a/hacks/cloudlife.man b/hacks/cloudlife.man
index 35eae12..c94d77b 100644
--- a/hacks/cloudlife.man
+++ b/hacks/cloudlife.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 6 "20-May-2003" "X Version 11"
.SH NAME
-cloudlife - a cellular automaton based on Conway's Life
+cloudlife \- a cellular automaton based on Conway's Life
.SH SYNOPSIS
.B cloudlife
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-cycle-delay \fImicroseconds\fP] [\-cycle-colors \fIinteger\fP][\-cell-size \fIinteger\fP] [\-initial-density \fIinteger\fP] [\-max-age \fIinteger\fP]
diff --git a/hacks/compass.c b/hacks/compass.c
index 1678ca9..e321d70 100644
--- a/hacks/compass.c
+++ b/hacks/compass.c
@@ -16,7 +16,6 @@
# include "xdbe.h"
#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-#define countof(x) (sizeof(x)/sizeof(*(x)))
#define ABS(x) ((x)<0?-(x):(x))
#define MAX(x,y) ((x)<(y)?(y):(x))
#define MIN(x,y) ((x)>(y)?(y):(x))
diff --git a/hacks/compass.man b/hacks/compass.man
index 8d7cc7e..13ffde4 100644
--- a/hacks/compass.man
+++ b/hacks/compass.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-compass - draws a spinning compass.
+compass \- draws a spinning compass.
.SH SYNOPSIS
.B compass
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/config/README b/hacks/config/README
index 5ba2e7b..b031323 100644
--- a/hacks/config/README
+++ b/hacks/config/README
@@ -4,8 +4,8 @@
a screen saver and locker for the X window system
by Jamie Zawinski
- version 5.44
- 20-Mar-2020
+ version 6.00
+ 01-Apr-2021
https://www.jwz.org/xscreensaver/
@@ -13,8 +13,7 @@
This directory contains XML files that describe each of the screenhacks;
the per-hack user interface is constructed based on the things in these
-files. The files are loaded at run-time by xscreensaver-demo (also
-known as "the Control Center screensaver properties capplet".)
+files. The files are loaded at run-time by "xscreensaver-settings".
The tags and parameters used here are:
@@ -76,6 +75,7 @@ The tags and parameters used here are:
_high-label="RIGHT LABEL"
low="MIN VALUE"
high="MAX VALUE"
+ step="MODULUS"
default="DEFAULT VALUE"
[ convert="invert" ]
/>
@@ -256,6 +256,9 @@ The tags and parameters used here are:
-----------------------------------------------------------------------
+Those tags and parameters whose names begin with an underscore contain
+strings that are translatable via the ../../po/ directory.
+
If you are DTD-minded, you may also find the included files "xss.dtd"
and "xss.xsd" useful.
diff --git a/hacks/config/antinspect.xml b/hacks/config/antinspect.xml
index ee4ce7b..9878e6b 100644
--- a/hacks/config/antinspect.xml
+++ b/hacks/config/antinspect.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="antinspect" _label="AntInspect" gl="yes">
+<screensaver name="antinspect" _label="Ant Inspect" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/antmaze.xml b/hacks/config/antmaze.xml
index 1580205..3344c24 100644
--- a/hacks/config/antmaze.xml
+++ b/hacks/config/antmaze.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="antmaze" _label="AntMaze" gl="yes">
+<screensaver name="antmaze" _label="Ant Maze" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/antspotlight.xml b/hacks/config/antspotlight.xml
index fe78174..3df385c 100644
--- a/hacks/config/antspotlight.xml
+++ b/hacks/config/antspotlight.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="antspotlight" _label="AntSpotlight" gl="yes">
+<screensaver name="antspotlight" _label="Ant Spotlight" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/apple2.xml b/hacks/config/apple2.xml
index 4084bc9..dcfa241 100644
--- a/hacks/config/apple2.xml
+++ b/hacks/config/apple2.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="apple2" _label="Apple2">
+<screensaver name="apple2" _label="Apple ][">
<command arg="-root"/>
diff --git a/hacks/config/beats.xml b/hacks/config/beats.xml
new file mode 100644
index 0000000..581ebf9
--- /dev/null
+++ b/hacks/config/beats.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="beats" _label="Beats" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=u7N5l0LXryg"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of balls" _low-label="Few" _high-label="Many"
+ low="1" high="100" default="30"/>
+
+ <select id="cycle">
+ <option id="random" _label="Random cycle style"/>
+ <option _label="Clockwise cycle" arg-set="-cycle 0"/>
+ <option _label="Rain dance cycle" arg-set="-cycle 1"/>
+ <option _label="Metronome cycle" arg-set="-cycle 2"/>
+ <option _label="Galaxy cycle" arg-set="-cycle 3"/>
+ </select>
+
+ <hgroup>
+ <boolean id="tick" _label="Tick" arg-unset="-no-tick"/>
+ <boolean id="blur" _label="Motion Blur" arg-unset="-no-blur"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Draws figures that move around at a slightly different rate from
+each other, creating interesting chaotic and ordered patterns.
+
+Written by David Eccles; 2020.
+ </_description>
+</screensaver>
diff --git a/hacks/config/binaryring.xml b/hacks/config/binaryring.xml
index a96026c..479d40e 100644
--- a/hacks/config/binaryring.xml
+++ b/hacks/config/binaryring.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="binaryring" _label="BinaryRing">
+<screensaver name="binaryring" _label="Binary Ring">
<command arg="-root"/>
diff --git a/hacks/config/blinkbox.xml b/hacks/config/blinkbox.xml
index d457df2..0f84baf 100644
--- a/hacks/config/blinkbox.xml
+++ b/hacks/config/blinkbox.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="blinkbox" _label="BlinkBox" gl="yes">
+<screensaver name="blinkbox" _label="Blink Box" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/blitspin.xml b/hacks/config/blitspin.xml
index df53aa7..34b182f 100644
--- a/hacks/config/blitspin.xml
+++ b/hacks/config/blitspin.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="blitspin" _label="BlitSpin">
+<screensaver name="blitspin" _label="Blit Spin">
<command arg="-root"/>
diff --git a/hacks/config/blocktube.xml b/hacks/config/blocktube.xml
index 85f88f9..87d91c1 100644
--- a/hacks/config/blocktube.xml
+++ b/hacks/config/blocktube.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="blocktube" _label="BlockTube" gl="yes">
+<screensaver name="blocktube" _label="Block Tube" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/bouncingcow.xml b/hacks/config/bouncingcow.xml
index abbb0cb..48a1aed 100644
--- a/hacks/config/bouncingcow.xml
+++ b/hacks/config/bouncingcow.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="bouncingcow" _label="BouncingCow" gl="yes">
+<screensaver name="bouncingcow" _label="Bouncing Cow" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/boxfit.xml b/hacks/config/boxfit.xml
index a297e13..b978a5d 100644
--- a/hacks/config/boxfit.xml
+++ b/hacks/config/boxfit.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="boxfit" _label="BoxFit">
+<screensaver name="boxfit" _label="Box Fit">
<command arg="-root"/>
diff --git a/hacks/config/bsod.xml b/hacks/config/bsod.xml
index 6a3ac4a..aa3dca1 100644
--- a/hacks/config/bsod.xml
+++ b/hacks/config/bsod.xml
@@ -10,7 +10,7 @@
<number id="delay" type="slider" arg="-delay %"
_label="Duration" _low-label="5 seconds" _high-label="2 minutes"
low="5" high="120" default="45"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+<!-- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/> -->
</hgroup>
<hgroup>
@@ -19,49 +19,54 @@
<boolean id="nt" _label="Windows NT" arg-unset="-no-nt"/>
<boolean id="2k" _label="Windows 2000 " arg-unset="-no-2k"/>
<boolean id="win10" _label="Windows 10 " arg-unset="-no-win10"/>
- <boolean id="msdos" _label="MS-DOS" arg-unset="-no-msdos"/>
</vgroup>
<vgroup>
- <boolean id="amiga" _label="AmigaDOS" arg-unset="-no-amiga"/>
+ <boolean id="msdos" _label="MS-DOS" arg-unset="-no-msdos"/>
<boolean id="glados" _label="GLaDOS" arg-unset="-no-glados"/>
+ <boolean id="amiga" _label="AmigaDOS" arg-unset="-no-amiga"/>
<boolean id="android" _label="Android" arg-set="-android"/>
- <boolean id="apple2" _label="Apple ][" arg-unset="-no-apple2"/>
- <boolean id="ransomware" _label="Ransomware" arg-unset="-no-ransomware"/>
</vgroup>
<vgroup>
+ <boolean id="apple2" _label="Apple ][" arg-unset="-no-apple2"/>
+ <boolean id="ransomware" _label="Ransomware" arg-unset="-no-ransomware"/>
<boolean id="nvidia" _label="NVidia" arg-unset="-no-nvidia"/>
<boolean id="os2" _label="OS/2" arg-unset="-no-os2"/>
+ </vgroup>
+ <vgroup>
<boolean id="mac" _label="Sad Mac" arg-unset="-no-mac"/>
<boolean id="mac1" _label="Mac bomb" arg-unset="-no-mac1"/>
- <boolean id="vmware" _label="VMware" arg-unset="-no-vmware"/>
+ <boolean id="macsbug" _label="MacsBug" arg-unset="-no-macsbug"/>
+ <boolean id="macx" _label="MacOS X" arg-unset="-no-macx"/>
</vgroup>
<vgroup>
- <boolean id="macsbug" _label="MacsBug" arg-unset="-no-macsbug"/>
+ <boolean id="vmware" _label="VMware" arg-unset="-no-vmware"/>
<boolean id="atari" _label="Atari" arg-set="-atari"/>
- <boolean id="macx" _label="MacOS X" arg-unset="-no-macx"/>
<boolean id="os390" _label="OS/390" arg-unset="-no-os390"/>
- <boolean id="encom" _label="Encom" arg-unset="-no-encom"/>
+ <boolean id="hvx" _label="HVX/GCOS" arg-unset="-no-hvx"/>
</vgroup>
<vgroup>
- <boolean id="hvx" _label="HVX/GCOS6" arg-unset="-no-hvx"/>
- <boolean id="blitdamage" _label="NCD X Terminal " arg-unset="-no-blitdamage"/>
+ <boolean id="encom" _label="Encom" arg-unset="-no-encom"/>
+ <boolean id="blitdamage" _label="NCD XTerm" arg-unset="-no-blitdamage"/>
<boolean id="atm" _label="ATM" arg-unset="-no-atm"/>
<boolean id="dvd" _label="DVD" arg-unset="-no-dvd"/>
- <boolean id="nintendo" _label="Nintendo" arg-unset="-no-nintendo"/>
</vgroup>
<vgroup>
+ <boolean id="nintendo" _label="Nintendo" arg-unset="-no-nintendo"/>
<boolean id="tivo" _label="Tivo" arg-unset="-no-tivo"/>
<boolean id="vms" _label="VMS" arg-unset="-no-vms"/>
<boolean id="bsd" _label="BSD" arg-set="-bsd"/>
- <boolean id="linux" _label="Linux (fsck)" arg-unset="-no-linux"/>
- <boolean id="sparclinux" _label="Linux (sparc)" arg-set="-sparclinux"/>
</vgroup>
<vgroup>
+ <boolean id="linux" _label="Linux (fsck)" arg-unset="-no-linux"/>
+ <boolean id="sparclinux" _label="Linux (sparc)" arg-set="-sparclinux"/>
<boolean id="hppalinux" _label="Linux (hppa)" arg-unset="-no-hppalinux"/>
<boolean id="solaris" _label="Solaris" arg-unset="-no-solaris"/>
+ </vgroup>
+ <vgroup>
<boolean id="sco" _label="SCO" arg-unset="-no-sco"/>
<boolean id="hpux" _label="HPUX" arg-unset="-no-hpux"/>
<boolean id="tru64" _label="Tru64" arg-unset="-no-tru64"/>
+ <boolean id="gnome" _label="GNOME" arg-unset="-no-gnome"/>
</vgroup>
</hgroup>
diff --git a/hacks/config/bubble3d.xml b/hacks/config/bubble3d.xml
index 985c394..bcc0f4b 100644
--- a/hacks/config/bubble3d.xml
+++ b/hacks/config/bubble3d.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="bubble3d" _label="Bubble3D" gl="yes">
+<screensaver name="bubble3d" _label="Bubble 3D" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/cage.xml b/hacks/config/cage.xml
index 6ede618..6fedb3c 100644
--- a/hacks/config/cage.xml
+++ b/hacks/config/cage.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
+<?xml version="1.0" encoding="UTF-8"?>
<screensaver name="cage" _label="Cage" gl="yes">
@@ -17,7 +17,7 @@
<xscreensaver-updater />
<_description>
-Escher's "Impossible Cage", a 3d analog of a moebius
+Escher's "Impossible Cage", a 3d analog of a möbius
strip, and rotates it in three dimensions.
https://en.wikipedia.org/wiki/Maurits_Cornelis_Escher
diff --git a/hacks/config/ccurve.xml b/hacks/config/ccurve.xml
index e15138f..84a6121 100644
--- a/hacks/config/ccurve.xml
+++ b/hacks/config/ccurve.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="ccurve" _label="CCurve">
+<screensaver name="ccurve" _label="C Curve">
<command arg="-root"/>
diff --git a/hacks/config/cityflow.xml b/hacks/config/cityflow.xml
index 61f67d9..4a94c35 100644
--- a/hacks/config/cityflow.xml
+++ b/hacks/config/cityflow.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="cityflow" _label="Cityflow" gl="yes">
+<screensaver name="cityflow" _label="City Flow" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/cloudlife.xml b/hacks/config/cloudlife.xml
index 767a8ea..92ea6c3 100644
--- a/hacks/config/cloudlife.xml
+++ b/hacks/config/cloudlife.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="cloudlife" _label="CloudLife">
+<screensaver name="cloudlife" _label="Cloud Life">
<command arg="-root"/>
diff --git a/hacks/config/co____9.xml b/hacks/config/co____9.xml
new file mode 100644
index 0000000..f1dc4bb
--- /dev/null
+++ b/hacks/config/co____9.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="co____9" _label="Co____9" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=xJDxZXbO8mY"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="4.0" default="1"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="How many pretty pretty balls"
+ _low-label="Not so many" _high-label="A bunch"
+ low="1" high="400" default="60"/>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This is fine.
+
+Written by Jamie Zawinski; 2020.
+ </_description>
+</screensaver>
diff --git a/hacks/config/companioncube.xml b/hacks/config/companioncube.xml
index 128edc5..2a59f3a 100644
--- a/hacks/config/companioncube.xml
+++ b/hacks/config/companioncube.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="companioncube" _label="CompanionCube" gl="yes">
+<screensaver name="companioncube" _label="Companion Cube" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/covid19.xml b/hacks/config/covid19.xml
new file mode 100644
index 0000000..96f395b
--- /dev/null
+++ b/hacks/config/covid19.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="covid19" _label="COVID19" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=xJDxZXbO8mY"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="4.0" default="1"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Government Response"
+ _low-label="Taiwan" _high-label="United States"
+ low="1" high="400" default="60"/>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+SARS-CoV-2. Stay the fuck home. Wear a fucking mask.
+
+Written by Jamie Zawinski; 2020.
+ </_description>
+</screensaver>
diff --git a/hacks/config/cube21.xml b/hacks/config/cube21.xml
index f16d7fd..17082db 100644
--- a/hacks/config/cube21.xml
+++ b/hacks/config/cube21.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="cube21" _label="Cube21" gl="yes">
+<screensaver name="cube21" _label="Cube 21" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/cubestack.xml b/hacks/config/cubestack.xml
index 68c550e..9dcc3aa 100644
--- a/hacks/config/cubestack.xml
+++ b/hacks/config/cubestack.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="cubestack" _label="CubeStack" gl="yes">
+<screensaver name="cubestack" _label="Cube Stack" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/cubestorm.xml b/hacks/config/cubestorm.xml
index 533d710..366bb89 100644
--- a/hacks/config/cubestorm.xml
+++ b/hacks/config/cubestorm.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="cubestorm" _label="CubeStorm" gl="yes">
+<screensaver name="cubestorm" _label="Cube Storm" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/cubetwist.xml b/hacks/config/cubetwist.xml
index 00f54b8..ced60ec 100644
--- a/hacks/config/cubetwist.xml
+++ b/hacks/config/cubetwist.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="cubetwist" _label="CubeTwist" gl="yes">
+<screensaver name="cubetwist" _label="Cube Twist" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/cubicgrid.xml b/hacks/config/cubicgrid.xml
index b8a90a8..10bdf80 100644
--- a/hacks/config/cubicgrid.xml
+++ b/hacks/config/cubicgrid.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="cubicgrid" _label="CubicGrid" gl="yes">
+<screensaver name="cubicgrid" _label="Cubic Grid" gl="yes">
<command arg="-root"/>
@@ -21,6 +21,12 @@
<boolean id="bigdots" _label="Big dots" arg-unset="-no-bigdots"/>
<boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ <select id="symmetry">
+ <option id="random" _label="Random symmetry"/>
+ <option id="cubic" _label="Cubic symmetry" arg-set="-symmetry cubic"/>
+ <option id="hexagonal" _label="Hexagonal symmetry" arg-set="-symmetry hexagonal"/>
+ </select>
+
<xscreensaver-updater />
<_description>
diff --git a/hacks/config/cwaves.xml b/hacks/config/cwaves.xml
index b18f365..3e77b42 100644
--- a/hacks/config/cwaves.xml
+++ b/hacks/config/cwaves.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="cwaves" _label="CWaves">
+<screensaver name="cwaves" _label="C Waves">
<command arg="-root"/>
diff --git a/hacks/config/dangerball.xml b/hacks/config/dangerball.xml
index 12bbac5..51d9fe1 100644
--- a/hacks/config/dangerball.xml
+++ b/hacks/config/dangerball.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="dangerball" _label="DangerBall" gl="yes">
+<screensaver name="dangerball" _label="Danger Ball" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/decayscreen.xml b/hacks/config/decayscreen.xml
index 93d85b3..266d8d6 100644
--- a/hacks/config/decayscreen.xml
+++ b/hacks/config/decayscreen.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="decayscreen" _label="DecayScreen">
+<screensaver name="decayscreen" _label="Decay Screen">
<command arg="-root"/>
diff --git a/hacks/config/deepstars.xml b/hacks/config/deepstars.xml
index d690d2d..3186376 100644
--- a/hacks/config/deepstars.xml
+++ b/hacks/config/deepstars.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="deepstars" _label="DeepStars" gl="yes">
+<screensaver name="deepstars" _label="Deep Stars" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/dymaxionmap.xml b/hacks/config/dymaxionmap.xml
index 6f846c7..1cc027a 100644
--- a/hacks/config/dymaxionmap.xml
+++ b/hacks/config/dymaxionmap.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="dymaxionmap" _label="DymaxionMap" gl="yes">
+<screensaver name="dymaxionmap" _label="Dymaxion Map" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/energystream.xml b/hacks/config/energystream.xml
index a3c034f..c9f8966 100644
--- a/hacks/config/energystream.xml
+++ b/hacks/config/energystream.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="energystream" _label="EnergyStream" gl="yes">
+<screensaver name="energystream" _label="Energy Stream" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/epicycle.xml b/hacks/config/epicycle.xml
index 0b56922..18b23df 100644
--- a/hacks/config/epicycle.xml
+++ b/hacks/config/epicycle.xml
@@ -50,6 +50,17 @@ This draws the path traced out by a point on the edge of a
circle. That circle rotates around a point on the rim of another
circle, and so on, several times.
+The geometry of epicycles was perfected by Hipparchus of Rhodes at some time
+around 125 B.C., 185 years after the birth of Aristarchus of Samos, the
+inventor of the heliocentric universe model. Hipparchus applied epicycles to
+the Sun and the Moon. Ptolemy of Alexandria went on to apply them to what was
+then the known universe, at around 150 A.D. Copernicus went on to apply them
+to the heliocentric model at the beginning of the sixteenth century. Johannes
+Kepler discovered that the planets actually move in elliptical orbits in about
+1602. The inverse-square law of gravity was suggested by Boulliau in 1645.
+Isaac Newton's Principia Mathematica was published in 1687, and proved that
+Kepler's laws derived from Newtonian gravitation.
+
https://en.wikipedia.org/wiki/Deferent_and_epicycle
Written by James Youngman; 1998.
diff --git a/hacks/config/etruscanvenus.xml b/hacks/config/etruscanvenus.xml
index 090b102..d4bff27 100644
--- a/hacks/config/etruscanvenus.xml
+++ b/hacks/config/etruscanvenus.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
-<screensaver name="etruscanvenus" _label="EtruscanVenus" gl="yes">
+<screensaver name="etruscanvenus" _label="Etruscan Venus" gl="yes">
<video href="https://www.youtube.com/watch?v=p3MgGyie6-I"/>
@@ -98,7 +98,7 @@
<number id="delay" type="slider" arg="-delay %"
_label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
+ low="0" high="100000" default="25000"
convert="invert"/>
</vgroup>
diff --git a/hacks/config/euler2d.xml b/hacks/config/euler2d.xml
index 31222e6..125ae27 100644
--- a/hacks/config/euler2d.xml
+++ b/hacks/config/euler2d.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="euler2d" _label="Euler2D">
+<screensaver name="euler2d" _label="Euler 2D">
<command arg="-root"/>
diff --git a/hacks/config/fadeplot.xml b/hacks/config/fadeplot.xml
index a977c2b..ddca5e8 100644
--- a/hacks/config/fadeplot.xml
+++ b/hacks/config/fadeplot.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="fadeplot" _label="FadePlot">
+<screensaver name="fadeplot" _label="Fade Plot">
<command arg="-root"/>
diff --git a/hacks/config/fiberlamp.xml b/hacks/config/fiberlamp.xml
index b07e863..13787f5 100644
--- a/hacks/config/fiberlamp.xml
+++ b/hacks/config/fiberlamp.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="fiberlamp" _label="Fiberlamp">
+<screensaver name="fiberlamp" _label="Fiber Lamp">
<command arg="-root"/>
diff --git a/hacks/config/filmleader.xml b/hacks/config/filmleader.xml
index 02b4fd7..45afd2e 100644
--- a/hacks/config/filmleader.xml
+++ b/hacks/config/filmleader.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="filmleader" _label="FilmLeader">
+<screensaver name="filmleader" _label="Film Leader">
<command arg="-root"/>
diff --git a/hacks/config/flipflop.xml b/hacks/config/flipflop.xml
index 7f843a3..398a4fd 100644
--- a/hacks/config/flipflop.xml
+++ b/hacks/config/flipflop.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="flipflop" _label="FlipFlop" gl="yes">
+<screensaver name="flipflop" _label="Flip Flop" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/flipscreen3d.xml b/hacks/config/flipscreen3d.xml
index 5ed1cfb..9143de0 100644
--- a/hacks/config/flipscreen3d.xml
+++ b/hacks/config/flipscreen3d.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="flipscreen3d" _label="FlipScreen3D" gl="yes">
+<screensaver name="flipscreen3d" _label="Flip Screen 3D" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/fliptext.xml b/hacks/config/fliptext.xml
index 48c7e64..0128c64 100644
--- a/hacks/config/fliptext.xml
+++ b/hacks/config/fliptext.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="fliptext" _label="FlipText" gl="yes">
+<screensaver name="fliptext" _label="Flip Text" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/fluidballs.xml b/hacks/config/fluidballs.xml
index 2acd92c..36335fa 100644
--- a/hacks/config/fluidballs.xml
+++ b/hacks/config/fluidballs.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="fluidballs" _label="FluidBalls">
+<screensaver name="fluidballs" _label="Fluid Balls">
<command arg="-root"/>
diff --git a/hacks/config/flyingtoasters.xml b/hacks/config/flyingtoasters.xml
index 6b5f1f1..37b6c1c 100644
--- a/hacks/config/flyingtoasters.xml
+++ b/hacks/config/flyingtoasters.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="flyingtoasters" _label="FlyingToasters" gl="yes">
+<screensaver name="flyingtoasters" _label="Flying Toasters" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/fontglide.xml b/hacks/config/fontglide.xml
index db437d3..fa818a2 100644
--- a/hacks/config/fontglide.xml
+++ b/hacks/config/fontglide.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="fontglide" _label="FontGlide">
+<screensaver name="fontglide" _label="Font Glide">
<command arg="-root"/>
diff --git a/hacks/config/fuzzyflakes.xml b/hacks/config/fuzzyflakes.xml
index b59517d..96f8389 100644
--- a/hacks/config/fuzzyflakes.xml
+++ b/hacks/config/fuzzyflakes.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="fuzzyflakes" _label="FuzzyFlakes">
+<screensaver name="fuzzyflakes" _label="Fuzzy Flakes">
<command arg="-root"/>
diff --git a/hacks/config/gears.xml b/hacks/config/gears.xml
index 957fbdb..a1cbaeb 100644
--- a/hacks/config/gears.xml
+++ b/hacks/config/gears.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
+<?xml version="1.0" encoding="UTF-8"?>
<screensaver name="gears" _label="Gears" gl="yes">
@@ -29,7 +29,7 @@
<xscreensaver-updater />
<_description>
-Interlocking gears. See also the "Pinion" and "MoebiusGears" screen savers.
+Interlocking gears. See also the "Pinion" and "Möbius Gears" screen savers.
https://en.wikipedia.org/wiki/Involute_gear
https://en.wikipedia.org/wiki/Epicyclic_gearing
diff --git a/hacks/config/geodesicgears.xml b/hacks/config/geodesicgears.xml
index 813268a..3922f70 100644
--- a/hacks/config/geodesicgears.xml
+++ b/hacks/config/geodesicgears.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="geodesicgears" _label="GeodesicGears" gl="yes">
+<screensaver name="geodesicgears" _label="Geodesic Gears" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/glblur.xml b/hacks/config/glblur.xml
index ffa953d..7aa6c52 100644
--- a/hacks/config/glblur.xml
+++ b/hacks/config/glblur.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="glblur" _label="GLBlur" gl="yes">
+<screensaver name="glblur" _label="GL Blur" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/glcells.xml b/hacks/config/glcells.xml
index da86fe6..6d6cdca 100644
--- a/hacks/config/glcells.xml
+++ b/hacks/config/glcells.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="glcells" _label="GLCells" gl="yes">
+<screensaver name="glcells" _label="GL Cells" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/glforestfire.xml b/hacks/config/glforestfire.xml
index 08f882c..a479f7f 100644
--- a/hacks/config/glforestfire.xml
+++ b/hacks/config/glforestfire.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="glforestfire" _label="GLForestFire" gl="yes">
+<screensaver name="glforestfire" _label="GL Forest Fire" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/glhanoi.xml b/hacks/config/glhanoi.xml
index 6d9aec2..825be84 100644
--- a/hacks/config/glhanoi.xml
+++ b/hacks/config/glhanoi.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="glhanoi" _label="GLHanoi" gl="yes">
+<screensaver name="glhanoi" _label="GL Hanoi" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/glknots.xml b/hacks/config/glknots.xml
index afdd296..ec50ae9 100644
--- a/hacks/config/glknots.xml
+++ b/hacks/config/glknots.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="glknots" _label="GLKnots" gl="yes">
+<screensaver name="glknots" _label="GL Knots" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/glmatrix.xml b/hacks/config/glmatrix.xml
index 18293da..b4cfd9a 100644
--- a/hacks/config/glmatrix.xml
+++ b/hacks/config/glmatrix.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="glmatrix" _label="GLMatrix" gl="yes">
+<screensaver name="glmatrix" _label="GL Matrix" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/glplanet.xml b/hacks/config/glplanet.xml
index 802f629..2958d42 100644
--- a/hacks/config/glplanet.xml
+++ b/hacks/config/glplanet.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="glplanet" _label="GLPlanet" gl="yes">
+<screensaver name="glplanet" _label="GL Planet" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/glschool.xml b/hacks/config/glschool.xml
index a79ce12..ca5bb1d 100644
--- a/hacks/config/glschool.xml
+++ b/hacks/config/glschool.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="glschool" _label="GLSchool" gl="yes">
+<screensaver name="glschool" _label="GL School" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/glslideshow.xml b/hacks/config/glslideshow.xml
index c92a6de..74f67b2 100644
--- a/hacks/config/glslideshow.xml
+++ b/hacks/config/glslideshow.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="glslideshow" _label="GLSlideshow" gl="yes">
+<screensaver name="glslideshow" _label="GL Slideshow" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/glsnake.xml b/hacks/config/glsnake.xml
index d73663d..36c1821 100644
--- a/hacks/config/glsnake.xml
+++ b/hacks/config/glsnake.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="glsnake" _label="GLSnake" gl="yes">
+<screensaver name="glsnake" _label="GL Snake" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/gltext.xml b/hacks/config/gltext.xml
index 99ec92f..48b5076 100644
--- a/hacks/config/gltext.xml
+++ b/hacks/config/gltext.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="gltext" _label="GLText" gl="yes">
+<screensaver name="gltext" _label="GL Text" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/gravitywell.xml b/hacks/config/gravitywell.xml
index ebecd1c..eb8d190 100644
--- a/hacks/config/gravitywell.xml
+++ b/hacks/config/gravitywell.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="gravitywell" _label="GravityWell" gl="yes">
+<screensaver name="gravitywell" _label="Gravity Well" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/headroom.xml b/hacks/config/headroom.xml
new file mode 100644
index 0000000..b176a33
--- /dev/null
+++ b/hacks/config/headroom.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="headroom" _label="Headroom" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=kuS_HK4bIFI"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="spikespeed" type="slider" arg="-speed %"
+ _label="Spike growth" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="10.0" default="1.0"/>
+
+ <select id="rotation">
+ <option id="no" _label="Don't wobble" arg-set="-spin 0"/>
+ <option id="x" _label="Wobble around X axis" arg-set="-spin X"/>
+ <option id="y" _label="Wobble around Y axis" arg-set="-spin Y"/>
+ <option id="z" _label="Wobble around Z axis" arg-set="-spin Z"/>
+ <option id="xy" _label="Wobble around X and Y axes" arg-set="-spin XY"/>
+ <option id="xz" _label="Wobble around X and Z axes" arg-set="-spin XZ"/>
+ <option id="yz" _label="Wobble around Y and Z axes" arg-set="-spin YZ"/>
+ <option id="xyz" _label="Wobble around all three axes"/>
+ </select>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-set="-wander"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+"Back in my day, we used to say 'No future'. Well. This is it."
+-- Blank Reg
+
+"I can dump down all the information in the mind. Then I can eliminate any
+information I don't want. My parrot squawks in much the same way. For the
+moment, the computer power is only enough to generate a human head."
+-- Bryce Lynch
+
+Written by Jamie Zawinski; 2020.
+ </_description>
+</screensaver>
diff --git a/hacks/config/hexstrut.xml b/hacks/config/hexstrut.xml
index 0823dc8..679a672 100644
--- a/hacks/config/hexstrut.xml
+++ b/hacks/config/hexstrut.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="hexstrut" _label="Hexstrut" gl="yes">
+<screensaver name="hexstrut" _label="Hex Strut" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/hyperball.xml b/hacks/config/hyperball.xml
index 8f674d2..75c679c 100644
--- a/hacks/config/hyperball.xml
+++ b/hacks/config/hyperball.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="hyperball" _label="HyperBall">
+<screensaver name="hyperball" _label="Hyperball">
<command arg="-root"/>
diff --git a/hacks/config/hypercube.xml b/hacks/config/hypercube.xml
index f471230..857d3a6 100644
--- a/hacks/config/hypercube.xml
+++ b/hacks/config/hypercube.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="hypercube" _label="HyperCube">
+<screensaver name="hypercube" _label="Hypercube">
<command arg="-root"/>
diff --git a/hacks/config/hypnowheel.xml b/hacks/config/hypnowheel.xml
index ae8975c..27a45a6 100644
--- a/hacks/config/hypnowheel.xml
+++ b/hacks/config/hypnowheel.xml
@@ -44,7 +44,7 @@
<xscreensaver-updater />
<_description>
-A overlapping, translucent spiral patterns.
+Overlapping, translucent spiral patterns.
The tightness of their spirals fluctuates in and out.
https://en.wikipedia.org/wiki/Moire_pattern
diff --git a/hacks/config/imsmap.xml b/hacks/config/imsmap.xml
index f0feda9..ea92c08 100644
--- a/hacks/config/imsmap.xml
+++ b/hacks/config/imsmap.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="imsmap" _label="IMSMap">
+<screensaver name="imsmap" _label="IMS Map">
<command arg="-root"/>
diff --git a/hacks/config/jigglypuff.xml b/hacks/config/jigglypuff.xml
index 832bbef..f2d63c0 100644
--- a/hacks/config/jigglypuff.xml
+++ b/hacks/config/jigglypuff.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="jigglypuff" _label="JigglyPuff" gl="yes">
+<screensaver name="jigglypuff" _label="Jiggly Puff" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/juggler3d.xml b/hacks/config/juggler3d.xml
index 0e136f2..80d0c02 100644
--- a/hacks/config/juggler3d.xml
+++ b/hacks/config/juggler3d.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="juggler3d" _label="Juggler3D" gl="yes">
+<screensaver name="juggler3d" _label="Juggler 3D" gl="yes">
<command arg="-root"/>
<video href="https://www.youtube.com/watch?v=TJkKaXBOvCA"/>
diff --git a/hacks/config/klein.xml b/hacks/config/klein.xml
index 4880eb0..e0e3b36 100644
--- a/hacks/config/klein.xml
+++ b/hacks/config/klein.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
+<?xml version="1.0" encoding="UTF-8"?>
<screensaver name="klein" _label="Klein" gl="yes">
@@ -111,7 +111,7 @@
<number id="delay" type="slider" arg="-delay %"
_label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
+ low="0" high="100000" default="25000"
convert="invert"/>
<boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
@@ -121,7 +121,7 @@
<xscreensaver-updater />
<_description>
-A Klein bottle is the 4D analog of a moebius strip.
+A Klein bottle is the 4D analog of a möbius strip.
You can walk on the surface of the bottle or rotate it in 4D or walk
on it while it rotates in 4D. Inspired by Thomas Banchoff's book
diff --git a/hacks/config/lcdscrub.xml b/hacks/config/lcdscrub.xml
index c92b125..7cfd3d1 100644
--- a/hacks/config/lcdscrub.xml
+++ b/hacks/config/lcdscrub.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="lcdscrub" _label="LCDscrub">
+<screensaver name="lcdscrub" _label="LCD Scrub">
<command arg="-root"/>
diff --git a/hacks/config/maze3d.xml b/hacks/config/maze3d.xml
index ac578da..332c433 100755
--- a/hacks/config/maze3d.xml
+++ b/hacks/config/maze3d.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="maze3d" _label="Maze3D" gl="yes">
+<screensaver name="maze3d" _label="Maze 3D" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/memscroller.xml b/hacks/config/memscroller.xml
index ccb6c0a..ef70552 100644
--- a/hacks/config/memscroller.xml
+++ b/hacks/config/memscroller.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="memscroller" _label="MemScroller">
+<screensaver name="memscroller" _label="Mem Scroller">
<command arg="-root"/>
diff --git a/hacks/config/menger.xml b/hacks/config/menger.xml
index 760167e..b3bfba0 100644
--- a/hacks/config/menger.xml
+++ b/hacks/config/menger.xml
@@ -41,7 +41,7 @@
<_description>
The Menger Gasket is a cube-based recursive fractal object
-analagous to the Sierpinski Tetrahedron.
+analogous to the Sierpinski Tetrahedron.
https://en.wikipedia.org/wiki/Menger_sponge
https://en.wikipedia.org/wiki/Sierpinski_carpet
diff --git a/hacks/config/metaballs.xml b/hacks/config/metaballs.xml
index 0d1a218..5b73beb 100644
--- a/hacks/config/metaballs.xml
+++ b/hacks/config/metaballs.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="metaballs" _label="MetaBalls">
+<screensaver name="metaballs" _label="Meta Balls">
<command arg="-root"/>
@@ -27,14 +27,14 @@
<vgroup>
<number id="count" type="slider" arg="-count %"
- _label="Metaball count" _low-label="Two" _high-label="Many"
+ _label="Ball count" _low-label="Two" _high-label="Many"
low="2" high="255" default="10"/>
<number id="radius" type="slider" arg="-radius %"
- _label="MetaBall Radius" _low-label="Small" _high-label="Big" low="2" high="100" default="100"/>
+ _label="Ball Radius" _low-label="Small" _high-label="Big" low="2" high="100" default="100"/>
<number id="delta" type="slider" arg="-delta %"
- _label="MetaBall Movement" _low-label="Small" _high-label="Big" low="1" high="20" default="3"/>
+ _label="Ball Movement" _low-label="Small" _high-label="Big" low="1" high="20" default="3"/>
</vgroup>
</hgroup>
diff --git a/hacks/config/mirrorblob.xml b/hacks/config/mirrorblob.xml
index 74b1015..2d920e3 100644
--- a/hacks/config/mirrorblob.xml
+++ b/hacks/config/mirrorblob.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="mirrorblob" _label="MirrorBlob" gl="yes">
+<screensaver name="mirrorblob" _label="Mirror Blob" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/moebius.xml b/hacks/config/moebius.xml
index 324c527..1df5a76 100644
--- a/hacks/config/moebius.xml
+++ b/hacks/config/moebius.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
+<?xml version="1.0" encoding="UTF-8"?>
-<screensaver name="moebius" _label="Moebius" gl="yes">
+<screensaver name="moebius" _label="Möbius" gl="yes">
<command arg="-root"/>
@@ -18,8 +18,8 @@
<xscreensaver-updater />
<_description>
-M. C. Escher's "Moebius Strip II", an image of ants walking along the
-surface of a moebius strip.
+M. C. Escher's "Möbius Strip II", an image of ants walking along the
+surface of a möbius strip.
https://en.wikipedia.org/wiki/Moebius_strip
https://en.wikipedia.org/wiki/Maurits_Cornelis_Escher
diff --git a/hacks/config/moebiusgears.xml b/hacks/config/moebiusgears.xml
index 9233f91..b46ba59 100644
--- a/hacks/config/moebiusgears.xml
+++ b/hacks/config/moebiusgears.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
+<?xml version="1.0" encoding="UTF-8"?>
-<screensaver name="moebiusgears" _label="MoebiusGears" gl="yes">
+<screensaver name="moebiusgears" _label="Möbius Gears" gl="yes">
<command arg="-root"/>
@@ -36,7 +36,7 @@
<_description>
An interlinked loop of rotating gears. The layout of the gears
-follows the path of a moebius strip. See also the "Pinion" and
+follows the path of a möbius strip. See also the "Pinion" and
"Gears" screen savers.
https://en.wikipedia.org/wiki/Involute_gear
diff --git a/hacks/config/moire.xml b/hacks/config/moire.xml
index 9c3f558..4970832 100644
--- a/hacks/config/moire.xml
+++ b/hacks/config/moire.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
+<?xml version="1.0" encoding="UTF-8"?>
-<screensaver name="moire" _label="Moire">
+<screensaver name="moire" _label="Moiré">
<command arg="-root"/>
@@ -29,7 +29,7 @@
<_description>
When the lines on the screen
Make more lines in between,
- That's a moire'!
+ That's a moiré!
https://en.wikipedia.org/wiki/Moire_pattern
diff --git a/hacks/config/moire2.xml b/hacks/config/moire2.xml
index 1785df3..8b244eb 100644
--- a/hacks/config/moire2.xml
+++ b/hacks/config/moire2.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
+<?xml version="1.0" encoding="UTF-8"?>
-<screensaver name="moire2" _label="Moire2">
+<screensaver name="moire2" _label="Moiré 2">
<command arg="-root"/>
diff --git a/hacks/config/morph3d.xml b/hacks/config/morph3d.xml
index 0122fb7..31e138d 100644
--- a/hacks/config/morph3d.xml
+++ b/hacks/config/morph3d.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="morph3d" _label="Morph3D" gl="yes">
+<screensaver name="morph3d" _label="Morph 3D" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/nerverot.xml b/hacks/config/nerverot.xml
index ef6db85..8a123bc 100644
--- a/hacks/config/nerverot.xml
+++ b/hacks/config/nerverot.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="nerverot" _label="NerveRot">
+<screensaver name="nerverot" _label="Nerve Rot">
<command arg="-root"/>
diff --git a/hacks/config/noseguy.xml b/hacks/config/noseguy.xml
index bfc1674..c2e82e5 100644
--- a/hacks/config/noseguy.xml
+++ b/hacks/config/noseguy.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="noseguy" _label="NoseGuy">
+<screensaver name="noseguy" _label="Nose Guy">
<command arg="-root"/>
diff --git a/hacks/config/pacman.xml b/hacks/config/pacman.xml
index 5ef77d5..77e63e4 100644
--- a/hacks/config/pacman.xml
+++ b/hacks/config/pacman.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="pacman" _label="Pacman">
+<screensaver name="pacman" _label="Pac-Man">
<command arg="-root"/>
diff --git a/hacks/config/photopile.xml b/hacks/config/photopile.xml
index a174afd..5b888e3 100644
--- a/hacks/config/photopile.xml
+++ b/hacks/config/photopile.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="photopile" _label="Photopile" gl="yes">
+<screensaver name="photopile" _label="Photo Pile" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/pinion.xml b/hacks/config/pinion.xml
index edb4f0e..31aa52d 100644
--- a/hacks/config/pinion.xml
+++ b/hacks/config/pinion.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
+<?xml version="1.0" encoding="UTF-8"?>
<screensaver name="pinion" _label="Pinion" gl="yes">
@@ -40,7 +40,7 @@
<_description>
A gear system marches across the screen.
-See also the "Gears" and "MoebiusGears" screen savers.
+See also the "Gears" and "Möbius Gears" screen savers.
https://en.wikipedia.org/wiki/Involute_gear
diff --git a/hacks/config/popsquares.xml b/hacks/config/popsquares.xml
index 8bc519a..6528b69 100644
--- a/hacks/config/popsquares.xml
+++ b/hacks/config/popsquares.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="popsquares" _label="PopSquares">
+<screensaver name="popsquares" _label="Pop Squares">
<command arg="-root"/>
diff --git a/hacks/config/projectiveplane.xml b/hacks/config/projectiveplane.xml
index 996d010..1c58c1d 100644
--- a/hacks/config/projectiveplane.xml
+++ b/hacks/config/projectiveplane.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="projectiveplane" _label="ProjectivePlane" gl="yes">
+<screensaver name="projectiveplane" _label="Projective Plane" gl="yes">
<command arg="-root"/>
@@ -111,7 +111,7 @@
<hgroup>
<number id="delay" type="slider" arg="-delay %"
_label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
+ low="0" high="100000" default="25000"
convert="invert"/>
</hgroup>
</vgroup>
diff --git a/hacks/config/quasicrystal.xml b/hacks/config/quasicrystal.xml
index 0823c89..0496d79 100644
--- a/hacks/config/quasicrystal.xml
+++ b/hacks/config/quasicrystal.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="quasicrystal" _label="QuasiCrystal" gl="yes">
+<screensaver name="quasicrystal" _label="Quasi-Crystal" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/raverhoop.xml b/hacks/config/raverhoop.xml
index 4932255..89936e6 100644
--- a/hacks/config/raverhoop.xml
+++ b/hacks/config/raverhoop.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="raverhoop" _label="RaverHoop" gl="yes">
+<screensaver name="raverhoop" _label="Raver Hoop" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/razzledazzle.xml b/hacks/config/razzledazzle.xml
index 043788e..20bd489 100644
--- a/hacks/config/razzledazzle.xml
+++ b/hacks/config/razzledazzle.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="razzledazzle" _label="RazzleDazzle" gl="yes">
+<screensaver name="razzledazzle" _label="Razzle Dazzle" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/rd-bomb.xml b/hacks/config/rd-bomb.xml
index c8a656d..a6cc47d 100644
--- a/hacks/config/rd-bomb.xml
+++ b/hacks/config/rd-bomb.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="rd-bomb" _label="RDbomb">
+<screensaver name="rd-bomb" _label="RD-Bomb">
<command arg="-root"/>
diff --git a/hacks/config/romanboy.xml b/hacks/config/romanboy.xml
index 941317c..4cd6259 100644
--- a/hacks/config/romanboy.xml
+++ b/hacks/config/romanboy.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
-<screensaver name="romanboy" _label="RomanBoy" gl="yes">
+<screensaver name="romanboy" _label="Roman Boy" gl="yes">
<video href="https://www.youtube.com/watch?v=KEW5TuPbWyg"/>
@@ -101,7 +101,7 @@
<number id="delay" type="slider" arg="-delay %"
_label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
+ low="0" high="100000" default="25000"
convert="invert"/>
</vgroup>
diff --git a/hacks/config/rotzoomer.xml b/hacks/config/rotzoomer.xml
index d610fcb..c333d95 100644
--- a/hacks/config/rotzoomer.xml
+++ b/hacks/config/rotzoomer.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="rotzoomer" _label="RotZoomer">
+<screensaver name="rotzoomer" _label="Rot Zoomer">
<command arg="-root"/>
diff --git a/hacks/config/rubikblocks.xml b/hacks/config/rubikblocks.xml
index de96caf..50ab78b 100644
--- a/hacks/config/rubikblocks.xml
+++ b/hacks/config/rubikblocks.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="rubikblocks" _label="RubikBlocks" gl="yes">
+<screensaver name="rubikblocks" _label="Rubik Blocks" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/shadebobs.xml b/hacks/config/shadebobs.xml
index f34c5b9..7ea34a0 100644
--- a/hacks/config/shadebobs.xml
+++ b/hacks/config/shadebobs.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="shadebobs" _label="ShadeBobs">
+<screensaver name="shadebobs" _label="Shade Bobs">
<command arg="-root"/>
diff --git a/hacks/config/sierpinski3d.xml b/hacks/config/sierpinski3d.xml
index 782fe9d..c7dcd3b 100644
--- a/hacks/config/sierpinski3d.xml
+++ b/hacks/config/sierpinski3d.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="sierpinski3d" _label="Sierpinski3D" gl="yes">
+<screensaver name="sierpinski3d" _label="Sierpinski 3D" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/skytentacles.xml b/hacks/config/skytentacles.xml
index e6d1b5b..9436760 100644
--- a/hacks/config/skytentacles.xml
+++ b/hacks/config/skytentacles.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="skytentacles" _label="SkyTentacles" gl="yes">
+<screensaver name="skytentacles" _label="Sky Tentacles" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/slidescreen.xml b/hacks/config/slidescreen.xml
index 3018998..ec76d77 100644
--- a/hacks/config/slidescreen.xml
+++ b/hacks/config/slidescreen.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="slidescreen" _label="SlideScreen">
+<screensaver name="slidescreen" _label="Slide Screen">
<command arg="-root"/>
diff --git a/hacks/config/speedmine.xml b/hacks/config/speedmine.xml
index cf7b88a..90ee0bb 100644
--- a/hacks/config/speedmine.xml
+++ b/hacks/config/speedmine.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="speedmine" _label="SpeedMine">
+<screensaver name="speedmine" _label="Speed Mine">
<command arg="-root"/>
diff --git a/hacks/config/sphereeversion.xml b/hacks/config/sphereeversion.xml
new file mode 100644
index 0000000..365db9b
--- /dev/null
+++ b/hacks/config/sphereeversion.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<screensaver name="sphereeversion" _label="Sphere Eversion" gl="yes">
+
+ <video href="https://www.youtube.com/watch?v=CbmIggJ5GdA"/>
+
+ <command arg="-root"/>
+
+ <hgroup>
+
+ <vgroup>
+ <number id="deform-speed" type="slider" arg="-deformation-speed %"
+ _label="Deformation speed"
+ _low-label="1.0" _high-label="100.0"
+ low="1.0" high="100.0" default="10.0"/>
+
+ <select id="surface-order">
+ <option id="random" _label="Random surface order"/>
+ <option id="2" _label="2" arg-set="-surface-order 2"/>
+ <option id="3" _label="3" arg-set="-surface-order 3"/>
+ <option id="4" _label="4" arg-set="-surface-order 4"/>
+ <option id="5" _label="5" arg-set="-surface-order 5"/>
+ </select>
+ </vgroup>
+
+ <vgroup>
+ <select id="display-mode">
+ <option id="random" _label="Random surface"/>
+ <option id="surface" _label="Solid surface" arg-set="-mode surface"/>
+ <option id="transparent" _label="Transparent surface" arg-set="-mode transparent"/>
+ </select>
+
+ <select id="appearance">
+ <option id="random" _label="Random pattern"/>
+ <option id="solid" _label="Solid object" arg-set="-appearance solid"/>
+ <option id="bands" _label="Parallel bands" arg-set="-appearance parallel-bands"/>
+ <option id="bands" _label="Meridian bands" arg-set="-appearance meridian-bands"/>
+ </select>
+
+ <select id="graticule">
+ <option id="random" _label="Random graticule"/>
+ <option id="bands" _label="With graticule" arg-set="-graticule on"/>
+ <option id="bands" _label="Without graticule" arg-set="-graticule off"/>
+ </select>
+
+ <select id="colors">
+ <option id="random" _label="Random coloration"/>
+ <option id="twosided" _label="Two-sided" arg-set="-colors two-sided"/>
+ <option id="rainbow" _label="Parallel colors" arg-set="-colors parallel"/>
+ <option id="rainbow" _label="Meridian colors" arg-set="-colors meridian"/>
+ </select>
+
+ <select id="projection">
+ <option id="random" _label="Random Projection"/>
+ <option id="perspective" _label="Perspective" arg-set="-projection perspective"/>
+ <option id="orthographic" _label="Orthographic" arg-set="-projection orthographic"/>
+ </select>
+ </vgroup>
+
+ <vgroup>
+ <number id="speed-x" type="slider" arg="-speed-x %"
+ _label="X rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="0.0"/>
+
+ <number id="speed-y" type="slider" arg="-speed-y %"
+ _label="Y rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="0.0"/>
+
+ <number id="speed-z" type="slider" arg="-speed-z %"
+ _label="Z rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="0.0"/>
+ </vgroup>
+
+ <vgroup>
+ <xscreensaver-updater />
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+
+ </hgroup>
+
+ <_description>
+Turns a sphere inside out: a smooth deformation (homotopy). During the
+eversion, the deformed sphere is allowed to intersect itself transversally,
+however, no creases or pinch points occur.
+
+Inspired by the following paper: Adam Bednorz, Witold Bednorz:
+"Analytic sphere eversion using ruled surfaces", Differential Geometry
+and its Applications 64:59-79, 2019.
+
+https://en.wikipedia.org/wiki/Sphere_eversion
+https://mathworld.wolfram.com/SphereEversion.html
+
+Written by Carsten Steger; 2020.
+ </_description>
+</screensaver>
diff --git a/hacks/config/spheremonics.xml b/hacks/config/spheremonics.xml
index fc4fa92..e88a5f9 100644
--- a/hacks/config/spheremonics.xml
+++ b/hacks/config/spheremonics.xml
@@ -15,7 +15,7 @@
<number id="duration" type="slider" arg="-duration %"
_label="Duration" _low-label="Short" _high-label="Long"
- low="5" high="1000" default="100"/>
+ low="5" high="1000" default="200"/>
<number id="resolution" type="slider" arg="-resolution %"
_label="Resolution" _low-label="Low" _high-label="High"
diff --git a/hacks/config/spiral.xml b/hacks/config/spiral.xml
index 71e78c7..14d3e75 100644
--- a/hacks/config/spiral.xml
+++ b/hacks/config/spiral.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
+<?xml version="1.0" encoding="UTF-8"?>
<screensaver name="spiral" _label="Spiral">
@@ -31,7 +31,7 @@
This screen saver was removed from the XScreenSaver distribution as of
version 5.08.
-Moving circular moire patterns.
+Moving circular moiré patterns.
Written by Peter Schmitzberger; 1997.
</_description>
diff --git a/hacks/config/splitflap.xml b/hacks/config/splitflap.xml
index 265c9b6..713a126 100644
--- a/hacks/config/splitflap.xml
+++ b/hacks/config/splitflap.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="splitflap" _label="SplitFlap" gl="yes">
+<screensaver name="splitflap" _label="Split-Flap" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/starwars.xml b/hacks/config/starwars.xml
index caa005e..2f4e90e 100644
--- a/hacks/config/starwars.xml
+++ b/hacks/config/starwars.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="starwars" _label="StarWars" gl="yes">
+<screensaver name="starwars" _label="Star Wars" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/stonerview.xml b/hacks/config/stonerview.xml
index 5db55f5..72daad1 100644
--- a/hacks/config/stonerview.xml
+++ b/hacks/config/stonerview.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="stonerview" _label="StonerView" gl="yes">
+<screensaver name="stonerview" _label="Stoner View" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/surfaces.xml b/hacks/config/surfaces.xml
index 92a184a..b5508ae 100644
--- a/hacks/config/surfaces.xml
+++ b/hacks/config/surfaces.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
+<?xml version="1.0" encoding="UTF-8"?>
<screensaver name="surfaces" _label="Surfaces" gl="yes">
@@ -25,7 +25,7 @@
<option id="dini" _label="Dini's Surface" arg-set="-surface dini"/>
<option id="enneper" _label="Enneper's Surface" arg-set="-surface enneper"/>
<option id="kuen" _label="Kuen Surface" arg-set="-surface kuen"/>
- <option id="moebius" _label="Moebius Strip" arg-set="-surface moebius"/>
+ <option id="moebius" _label="Möbius Strip" arg-set="-surface moebius"/>
<option id="seashell" _label="Seashell" arg-set="-surface seashell"/>
<option id="swallow" _label="Swallowtail" arg-set="-surface swallowtail"/>
<option id="bohemian" _label="Bohemian Dome" arg-set="-surface bohemian"/>
diff --git a/hacks/config/testx11.xml b/hacks/config/testx11.xml
index aaf85a7..bbc678b 100644
--- a/hacks/config/testx11.xml
+++ b/hacks/config/testx11.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
-<screensaver name="testx11" _label="TestX11">
+<screensaver name="testx11" _label="Test X11">
<command arg="-root"/>
diff --git a/hacks/config/timetunnel.xml b/hacks/config/timetunnel.xml
index caab9fc..f543150 100644
--- a/hacks/config/timetunnel.xml
+++ b/hacks/config/timetunnel.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="timetunnel" _label="TimeTunnel" gl="yes">
+<screensaver name="timetunnel" _label="Time Tunnel" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/topblock.xml b/hacks/config/topblock.xml
index df498bc..39dff21 100644
--- a/hacks/config/topblock.xml
+++ b/hacks/config/topblock.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="topblock" _label="TopBlock" gl="yes">
+<screensaver name="topblock" _label="Top Block" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/tronbit.xml b/hacks/config/tronbit.xml
index 965d333..c7cc3a5 100644
--- a/hacks/config/tronbit.xml
+++ b/hacks/config/tronbit.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="tronbit" _label="TronBit" gl="yes">
+<screensaver name="tronbit" _label="Tron Bit" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/unknownpleasures.xml b/hacks/config/unknownpleasures.xml
index 8cac817..956c3f3 100644
--- a/hacks/config/unknownpleasures.xml
+++ b/hacks/config/unknownpleasures.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="unknownpleasures" _label="UnknownPleasures" gl="yes">
+<screensaver name="unknownpleasures" _label="Unknown Pleasures" gl="yes">
<command arg="-root"/>
diff --git a/hacks/config/vidwhacker.xml b/hacks/config/vidwhacker.xml
index e1fade1..9884541 100644
--- a/hacks/config/vidwhacker.xml
+++ b/hacks/config/vidwhacker.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="vidwhacker" _label="VidWhacker">
+<screensaver name="vidwhacker" _label="Vid Whacker">
<command arg="-root"/>
diff --git a/hacks/config/webcollage.xml b/hacks/config/webcollage.xml
index c26ea98..9c76910 100644
--- a/hacks/config/webcollage.xml
+++ b/hacks/config/webcollage.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="webcollage" _label="WebCollage">
+<screensaver name="webcollage" _label="Web Collage">
<command arg="-root"/>
diff --git a/hacks/config/whirlwindwarp.xml b/hacks/config/whirlwindwarp.xml
index 7cd774e..c92b6fe 100644
--- a/hacks/config/whirlwindwarp.xml
+++ b/hacks/config/whirlwindwarp.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="whirlwindwarp" _label="WhirlWindWarp">
+<screensaver name="whirlwindwarp" _label="Whirlwind Warp">
<command arg="-root"/>
diff --git a/hacks/config/winduprobot.xml b/hacks/config/winduprobot.xml
index 0aaf78a..1312743 100644
--- a/hacks/config/winduprobot.xml
+++ b/hacks/config/winduprobot.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<screensaver name="winduprobot" _label="WindupRobot" gl="yes">
+<screensaver name="winduprobot" _label="Windup Robot" gl="yes">
<command arg="-root"/>
diff --git a/hacks/coral.man b/hacks/coral.man
index aaa497e..9ad124e 100644
--- a/hacks/coral.man
+++ b/hacks/coral.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-coral - simulates coral growth, albeit somewhat slowly.
+coral \- simulates coral growth, albeit somewhat slowly.
.SH SYNOPSIS
.B coral
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/critical.man b/hacks/critical.man
index 324c116..5993fed 100644
--- a/hacks/critical.man
+++ b/hacks/critical.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "08 Feb 2000" "X Version 11"
.SH NAME
-critical - Draw a system showing self-organizing criticality
+critical \- Draw a system showing self-organizing criticality
.SH SYNOPSIS
.B critical
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIseconds\fP] [\-random \fIboolean\fP] [\-ncolors \fIint\fP] [\-offset \fIint\fP]
@@ -77,8 +77,8 @@ stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1)
-.BR xscreensaver-command (1)
-.BR xscreensaver-demo (1)
+.BR xscreensaver\-command (1)
+.BR xscreensaver\-settings (1)
.SH COPYRIGHT
Copyright \(co 1998 by Martin Pool.
diff --git a/hacks/crystal.c b/hacks/crystal.c
index 9f33529..e82492c 100644
--- a/hacks/crystal.c
+++ b/hacks/crystal.c
@@ -1142,8 +1142,9 @@ init_crystal(ModeInfo * mi)
cryst->offset_h = (int) ((cryst->win_height - cryst->b * cos((
cryst->gamma - 90) * PI_RAD)) / 2.0);
if (!centre) {
+ int n2 = (2 * cryst->offset_h);
if (cryst->offset_h > 0)
- cryst->offset_h = NRAND(2 * cryst->offset_h);
+ cryst->offset_h = NRAND(n2);
cryst->offset_w = (int) (cryst->win_width - cryst->a -
cryst->b *
fabs(sin((cryst->gamma - 90) * PI_RAD)));
diff --git a/hacks/crystal.man b/hacks/crystal.man
index 06bf654..b56e1cc 100644
--- a/hacks/crystal.man
+++ b/hacks/crystal.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-crystal - kaleidescope.
+crystal \- kaleidescope.
.SH SYNOPSIS
.B crystal
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/cwaves.c b/hacks/cwaves.c
index b032626..3b93bb7 100644
--- a/hacks/cwaves.c
+++ b/hacks/cwaves.c
@@ -52,7 +52,8 @@ cwaves_init (Display *dpy, Window window)
XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
st->debug_p = get_boolean_resource (dpy, "debug", "Boolean");
- st->scale = get_integer_resource (dpy, "scale", "Integer");
+ /* Xft uses 'scale' */
+ st->scale = get_integer_resource (dpy, "waveScale", "Integer");
if (st->scale <= 0) st->scale = 1;
st->ncolors = get_integer_resource (dpy, "ncolors", "Integer");
if (st->ncolors < 4) st->ncolors = 4;
@@ -195,7 +196,7 @@ static const char *cwaves_defaults [] = {
".foreground: white",
"*ncolors: 600",
"*nwaves: 15",
- "*scale: 2",
+ "*waveScale: 2",
"*debug: False",
"*delay: 20000",
#ifdef HAVE_MOBILE
@@ -208,7 +209,7 @@ static XrmOptionDescRec cwaves_options [] = {
{ "-delay", ".delay", XrmoptionSepArg, 0 },
{ "-waves", ".nwaves", XrmoptionSepArg, 0 },
{ "-colors", ".ncolors", XrmoptionSepArg, 0 },
- { "-scale", ".scale", XrmoptionSepArg, 0 },
+ { "-scale", ".waveScale", XrmoptionSepArg, 0 },
{ "-debug", ".debug", XrmoptionNoArg, "True" },
{ 0, 0, 0, 0 }
};
diff --git a/hacks/cwaves.man b/hacks/cwaves.man
index 57f3978..9247eb8 100644
--- a/hacks/cwaves.man
+++ b/hacks/cwaves.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "14-Jun-97" "X Version 11"
.SH NAME
-cwaves - languid sinusoidal colors
+cwaves \- languid sinusoidal colors
.SH SYNOPSIS
.B cwaves
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/cynosure.man b/hacks/cynosure.man
index b89eb81..fd97fa6 100644
--- a/hacks/cynosure.man
+++ b/hacks/cynosure.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-cynosure - gentle overlapping squares screen saver.
+cynosure \- gentle overlapping squares screen saver.
.SH SYNOPSIS
.B cynosure
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/decayscreen.man b/hacks/decayscreen.man
index 7b0f816..2272981 100644
--- a/hacks/decayscreen.man
+++ b/hacks/decayscreen.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "05-Apr-1999" "X Version 11"
.SH NAME
-decayscreen - make a screen meltdown.
+decayscreen \- make a screen meltdown.
.SH SYNOPSIS
.B decayscreen
[\-display \fIhost:display.screen\fP]
@@ -23,7 +23,7 @@ or from a random file on disk, as indicated by
the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
file; see
-.BR xscreensaver-demo (1)
+.BR xscreensaver\-settings (1)
for more details.
.SH OPTIONS
.I decayscreen
@@ -75,8 +75,8 @@ stored in the RESOURCE_MANAGER property.
.SH "SEE ALSO"
.BR X (1),
.BR xscreensaver (1),
-.BR xscreensaver\-demo (1),
-.BR xscreensaver\-getimage (1)
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-getimage (MANSUFFIX)
.SH COPYRIGHT
Copyright 1992 by Vivek Khera. Permission to use, copy, modify, distribute,
and sell this software and its documentation for any purpose is hereby granted
diff --git a/hacks/deco.man b/hacks/deco.man
index e62190c..446b27f 100644
--- a/hacks/deco.man
+++ b/hacks/deco.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "27-Apr-97" "X Version 11"
.SH NAME
-deco - draw tacky 70s basement wall panelling
+deco \- draw tacky 70s basement wall panelling
.SH SYNOPSIS
.B deco
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/delaunay.c b/hacks/delaunay.c
index a5ea9ae..a6db5b1 100644
--- a/hacks/delaunay.c
+++ b/hacks/delaunay.c
@@ -204,8 +204,10 @@ delaunay (int nv,XYZ *pxyz,ITRIANGLE *v,int *ntri)
if (inside) {
/* Check that we haven't exceeded the edge list size */
if (nedge+3 >= emax) {
+ IEDGE *edges_old = edges;
emax += 100;
if ((edges = realloc(edges,emax*(long)sizeof(IEDGE))) == NULL) {
+ edges = edges_old;
status = 3;
goto skip;
}
diff --git a/hacks/delaunay.h b/hacks/delaunay.h
index 913de6d..9c18c84 100644
--- a/hacks/delaunay.h
+++ b/hacks/delaunay.h
@@ -22,10 +22,6 @@
#ifndef __DELAUNAY_H__
#define __DELAUNAY_H__
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
-
typedef struct {
double x,y,z;
} XYZ;
diff --git a/hacks/deluxe.c b/hacks/deluxe.c
index 5fd7eb7..3116f6b 100644
--- a/hacks/deluxe.c
+++ b/hacks/deluxe.c
@@ -17,7 +17,6 @@
# include "xdbe.h"
#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-#define countof(x) (sizeof(x)/sizeof(*(x)))
#define ABS(x) ((x)<0?-(x):(x))
struct state {
diff --git a/hacks/deluxe.man b/hacks/deluxe.man
index 380e7e5..4bf5d3b 100644
--- a/hacks/deluxe.man
+++ b/hacks/deluxe.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-deluxe - pulsing sequence of stars, circles, and lines.
+deluxe \- pulsing sequence of stars, circles, and lines.
.SH SYNOPSIS
.B deluxe
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/demon.man b/hacks/demon.man
index 43481bc..1fe5fb8 100644
--- a/hacks/demon.man
+++ b/hacks/demon.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-demon - cellular automaton.
+demon \- cellular automaton.
.SH SYNOPSIS
.B demon
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/discrete.man b/hacks/discrete.man
index 63e1787..d3c6c5b 100644
--- a/hacks/discrete.man
+++ b/hacks/discrete.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-discrete - discrete map iterative function fractal systems.
+discrete \- discrete map iterative function fractal systems.
.SH SYNOPSIS
.B discrete
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/distort.man b/hacks/distort.man
index eedb924..f26cab6 100644
--- a/hacks/distort.man
+++ b/hacks/distort.man
@@ -31,7 +31,7 @@ or from a random file on disk, as indicated by
the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
file; see
-.BR xscreensaver-demo (1)
+.BR xscreensaver\-settings (1)
for more details.
.SH OPTIONS
.I distort
@@ -121,8 +121,8 @@ stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1),
-.BR xscreensaver\-demo (1),
-.BR xscreensaver\-getimage (1)
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-getimage (MANSUFFIX)
.SH COPYRIGHT
Copyright \(co 1998 by Jonas Munsin and Jamie Zawinski. Permission to use,
copy, modify, distribute, and sell this software and its documentation for
diff --git a/hacks/drift.man b/hacks/drift.man
index f0a9be8..125b2e6 100644
--- a/hacks/drift.man
+++ b/hacks/drift.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "10-May-97" "X Version 11"
.SH NAME
-drift - draws drifting recursive fractal cosmic flames
+drift \- draws drifting recursive fractal cosmic flames
.SH SYNOPSIS
.B drift
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-count \fIinteger\fP] [\-grow] [\-no\-grow] [\-liss] [\-no\-liss]
diff --git a/hacks/epicycle.man b/hacks/epicycle.man
index 290884f..a7c0ed2 100644
--- a/hacks/epicycle.man
+++ b/hacks/epicycle.man
@@ -1,19 +1,6 @@
-.de EX \"Begin example
-.ne 5
-.if n .sp 1
-.if t .sp .5
-.nf
-.in +.5i
-..
-.de EE
-.fi
-.in -.5i
-.if n .sp 1
-.if t .sp .5
-..
.TH XScreenSaver 1 "27-Apr-97" "X Version 11"
.SH NAME
-epicycle - draws a point moving around a circle which moves around a cicle which...
+epicycle \- draws a point moving around a circle which moves around a cicle which...
.SH SYNOPSIS
.B epicycle
[\-display \fIhost:display.screen\fP] [\-root] [\-window] [\-mono] [\-install] [\-noinstall] [\-visual \fIviz\fP] [\-colors \fIN\fP] [\-foreground \fIname\fP] [\-color\-shift \fIN\fP] [\-delay \fImicroseconds\fP] [\-holdtime \fIseconds\fP] [\-linewidth \fIN\fP] [\-min_circles \fIN\fP] [\-max_circles \fIN\fP] [\-min_speed \fInumber\fP] [\-max_speed \fInumber\fP] [\-harmonics \fIN\fP] [\-timestep \fInumber\fP] [\-divisor_poisson \fIprobability\fP] [\-size_factor_min \fInumber\fP] [\-size_factor_max \fInumber\fP]
@@ -140,30 +127,6 @@ Epicycles are never more than this factor smaller than their parents.
.TP 8
.B \-fps
Display the current frame rate and CPU load.
-.SH RESOURCES
-.EX
-Option Resource Default Value
------- -------- -------------
--colors .colors 100
--delay .delay 1000
--holdtime .holdtime 2
--linewidth .lineWidth 4
--min_circles .minCircles 2
--max_circles .maxCircles 10
--min_speed .minSpeed 0.003
--max_speed .maxSpeed 0.005
--harmonics .harmonics 8
--timestep .timestep 1.0
--divisor_poisson .divisorPoisson 0.4
--size_factor_min .sizeFactorMin 1.05
--size_factor_max .sizeFactorMax 2.05
- .timestepCoarseFactor 1.0
-.EE
-Before the drawing of the figure is begun, a preliminary calculation
-of the path is done in order to scale the radii of the epicycles so
-as to fit the figure on the screen or window. For the sake of speed,
-This calculation is done with a larger timestep than the actual
-drawing. The time-step used is the value of the
.B \-timestep
option multiplied by the timestepCoarseFactor resource. The default
value of 1 will almost always work fast enough and so this resource
diff --git a/hacks/euler2d.man b/hacks/euler2d.man
index ddfd619..e99d023 100644
--- a/hacks/euler2d.man
+++ b/hacks/euler2d.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-euler2d - two dimensional incompressible inviscid fluid flow.
+euler2d \- two dimensional incompressible inviscid fluid flow.
.SH SYNOPSIS
.B euler2d
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/fadeplot.man b/hacks/fadeplot.man
index d525afd..7638d63 100644
--- a/hacks/fadeplot.man
+++ b/hacks/fadeplot.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-fadeplot - draws a waving ribbon following a sinusoidal path.
+fadeplot \- draws a waving ribbon following a sinusoidal path.
.SH SYNOPSIS
.B fadeplot
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/fiberlamp.man b/hacks/fiberlamp.man
index da0d4f4..cc6e84d 100644
--- a/hacks/fiberlamp.man
+++ b/hacks/fiberlamp.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-fiberlamp - Fiber Optic Lamp
+fiberlamp \- Fiber Optic Lamp
.SH SYNOPSIS
.B fiberlamp
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/filmleader.c b/hacks/filmleader.c
index c242083..454b91d 100644
--- a/hacks/filmleader.c
+++ b/hacks/filmleader.c
@@ -11,20 +11,11 @@
* Simulate an SMPTE Universal Film Leader playing on an analog television.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
-
-#include "xft.h" /* before screenhack.h */
-
#include "screenhack.h"
#include "analogtv.h"
#include <time.h>
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
struct state {
Display *dpy;
Window window;
@@ -126,11 +117,13 @@ filmleader_init (Display *dpy, Window window)
"traceColor", "Foreground");
s = get_string_resource (dpy, "textColor", "Foreground");
+ if (!s) s = strdup ("white");
XftColorAllocName (dpy, st->xgwa.visual, st->xgwa.colormap, s,
&st->xft_text_color_1);
- if (s) free (s);
+ free (s);
s = get_string_resource (dpy, "textBackground", "Background");
+ if (!s) s = strdup ("black");
XftColorAllocName (dpy, st->xgwa.visual, st->xgwa.colormap, s,
&st->xft_text_color_2);
if (s) free (s);
@@ -170,14 +163,6 @@ filmleader_draw (Display *dpy, Window window, void *closure)
XftFont *xftfont;
XftColor *xftcolor;
- /* You may ask, why use Xft for this instead of the much simpler XDrawString?
- Well, for some reason, XLoadQueryFont is giving me horribly-scaled bitmap
- fonts, but Xft works properly. So perhaps in This Modern World, if one
- expects large fonts to work, one must use Xft instead of Xlib?
-
- Everything is terrible.
- */
-
const struct { double t; int k, f; const char * const s[4]; } blurbs[] = {
{ 9.1, 3, 1, { "PICTURE", " START", 0, 0 }},
{ 10.0, 2, 1, { " 16", "SOUND", "START", 0 }},
@@ -550,28 +535,19 @@ static const char *filmleader_defaults [] = {
712 x Y or X x 712 canvas that we draw in, which is then scaled to
the size of the screen by analogtv. */
-# ifdef USE_IPHONE
+# if defined(HAVE_IPHONE) || defined(HAVE_COCOA)
"*numberFont: Helvetica Bold 120",
"*numberFont2: Helvetica 36",
"*numberFont3: Helvetica 28",
-
-# elif defined(HAVE_COCOA)
- /* Need to double these because ANALOGTV_DEFAULTS sets lowrez: true */
- "*numberFont: Helvetica Bold 240",
- "*numberFont2: Helvetica 72",
- "*numberFont3: Helvetica 56",
-
# else /* X11 or Android */
-
- "*numberFont: -*-helvetica-bold-r-*-*-*-1700-*-*-*-*-*-*",
- "*numberFont2: -*-helvetica-medium-r-*-*-*-500-*-*-*-*-*-*",
- "*numberFont3: -*-helvetica-medium-r-*-*-*-360-*-*-*-*-*-*",
-
+ "*numberFont: Helvetica Bold 170",
+ "*numberFont2: Helvetica 50",
+ "*numberFont3: Helvetica 36",
# endif
-
"*noise: 0.04",
ANALOGTV_DEFAULTS
+ ".lowrez: false", /* Required on macOS, or font size fucks up */
"*geometry: 1280x720",
0
};
diff --git a/hacks/filmleader.man b/hacks/filmleader.man
index 4a98270..9724bb3 100644
--- a/hacks/filmleader.man
+++ b/hacks/filmleader.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-filmleader - screen saver.
+filmleader \- screen saver.
.SH SYNOPSIS
.B filmleader
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/fireworkx.man b/hacks/fireworkx.man
index 05a383c..0c114c3 100644
--- a/hacks/fireworkx.man
+++ b/hacks/fireworkx.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-fireworkx - pyrotechnic explosions eye-candy.
+fireworkx \- pyrotechnic explosions eye-candy.
.SH SYNOPSIS
.B fireworkx
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/flag.c b/hacks/flag.c
index ca58ed8..737388c 100644
--- a/hacks/flag.c
+++ b/hacks/flag.c
@@ -35,7 +35,7 @@ static const char sccsid[] = "@(#)flag.c 4.02 97/04/01 xlockmore";
#ifdef HAVE_COCOA
# define DEF_FONT "Monaco 15"
#else
-# define DEF_FONT "fixed"
+# define DEF_FONT "-*-fixed-medium-r-*-*-*-100-*-*-c-*-*-*"
#endif
#ifdef STANDALONE
@@ -274,7 +274,7 @@ make_flag_bits(ModeInfo *mi)
# if defined(_AIX)
sprintf(text, "%s\n%s %s.%s",
uts.nodename, uts.sysname, uts.version, uts.release);
-# elif defined(__APPLE__) && !defined(USE_IPHONE) /* MacOS X + XDarwin */
+# elif defined(__APPLE__) && !defined(HAVE_IPHONE) /* MacOS X + XDarwin */
{
const char *file =
"/System/Library/CoreServices/SystemVersion.plist";
diff --git a/hacks/flag.man b/hacks/flag.man
index dcf93f7..ac53dfb 100644
--- a/hacks/flag.man
+++ b/hacks/flag.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "24-May-97" "X Version 11"
.SH NAME
-flag - draws a waving flag, containing text or an image
+flag \- draws a waving flag, containing text or an image
.SH SYNOPSIS
.B flag
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-size \fIinteger\fP] [\-text \fIstring\fP] [\-font \fIfont\fP] [\-bitmap \fIxbm-file\fP]
diff --git a/hacks/flame.man b/hacks/flame.man
index dae4d1b..f0136e2 100644
--- a/hacks/flame.man
+++ b/hacks/flame.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "13-aug-92" "X Version 11"
.SH NAME
-flame - draw weird cosmic fractals
+flame \- draw weird cosmic fractals
.SH SYNOPSIS
.B flame
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-colors \fIinteger\fP] [\-iterations \fIinteger\fP] [\-points \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-delay2 \fImicroseconds\fP]
diff --git a/hacks/flow.man b/hacks/flow.man
index ea3a295..afe0771 100644
--- a/hacks/flow.man
+++ b/hacks/flow.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-flow - strange attractors.
+flow \- strange attractors.
.SH SYNOPSIS
.B flow
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/fluidballs.c b/hacks/fluidballs.c
index 533ee2d..c42632a 100644
--- a/hacks/fluidballs.c
+++ b/hacks/fluidballs.c
@@ -21,7 +21,7 @@
*
* It would be nice to detect when there are more balls than fit in
* the window, and scale the number of balls back. Useful for the
- * xscreensaver-demo preview, which is often too tight by default.
+ * xscreensaver-settings preview, which is often too tight by default.
*/
#include <math.h>
@@ -76,7 +76,9 @@ typedef struct {
int time_since_shake;
Bool fps_p; /* Whether to draw some text at the bottom. */
- GC font_gc;
+ XftColor xft_fg;
+ XftDraw *xftdraw;
+ XftFont *font;
int font_height;
int font_baseline;
int frame_count;
@@ -96,10 +98,10 @@ draw_fps_string (b_state *state)
XFillRectangle (state->dpy, state->b, state->erase_gc,
0, state->xgwa.height - state->font_height*3 - 20,
state->xgwa.width, state->font_height*3 + 20);
- XDrawImageString (state->dpy, state->b, state->font_gc,
+ XftDrawStringUtf8 (state->xftdraw, &state->xft_fg, state->font,
10, state->xgwa.height - state->font_height*2 -
state->font_baseline - 10,
- state->fps_str, strlen(state->fps_str));
+ (FcChar8 *) state->fps_str, strlen(state->fps_str));
}
/* Finds the origin of the window relative to the root window, by
@@ -346,18 +348,23 @@ fluidballs_init (Display *dpy, Window window)
state->fps_p = get_boolean_resource (dpy, "doFPS", "DoFPS");
if (state->fps_p)
{
- XFontStruct *font;
char *fontname = get_string_resource (dpy, "fpsFont", "Font");
- if (!fontname) fontname = "-*-courier-bold-r-normal-*-180-*";
- font = load_font_retry (dpy, fontname);
- if (!font) abort();
- gcv.font = font->fid;
- gcv.foreground = get_pixel_resource(state->dpy, state->xgwa.colormap,
- "textColor", "Foreground");
- state->font_gc = XCreateGC(dpy, state->b,
- GCFont|GCForeground|GCBackground, &gcv);
- state->font_height = font->ascent + font->descent;
- state->font_baseline = font->descent;
+ char *s;
+ if (!fontname) fontname = "monospace bold 18";
+ state->font =
+ load_xft_font_retry (dpy, screen_number (state->xgwa.screen),
+ fontname);
+ if (!state->font) abort();
+ s = get_string_resource (state->dpy, "textColor", "Foreground");
+ if (!s) s = strdup ("white");
+ XftColorAllocName (state->dpy, state->xgwa.visual, state->xgwa.colormap,
+ s, &state->xft_fg);
+ free (s);
+ state->xftdraw = XftDrawCreate (state->dpy, state->window,
+ state->xgwa.visual,
+ state->xgwa.colormap);
+ state->font_height = state->font->ascent + state->font->descent;
+ state->font_baseline = state->font->descent;
}
state->m = (float *) malloc (sizeof (*state->m) * (state->count + 1));
@@ -437,7 +444,9 @@ check_wall_clock (b_state *state, float max_d)
{
state->frame_count++;
+#if 0
if (state->time_tick++ > 20) /* don't call gettimeofday() too often -- it's slow. */
+#endif
{
struct timeval now;
# ifdef GETTIMEOFDAY_TWO_ARGS
@@ -451,8 +460,10 @@ check_wall_clock (b_state *state, float max_d)
state->last_time = now;
state->time_tick = 0;
+#if 0
if (now.tv_sec == state->last_time.tv_sec)
return;
+#endif
state->time_since_shake += (now.tv_sec - state->last_time.tv_sec);
@@ -478,7 +489,8 @@ check_wall_clock (b_state *state, float max_d)
float fps = state->frame_count / elapsed;
float cps = state->collision_count / elapsed;
- sprintf (state->fps_str, "Collisions: %.3f/frame Max motion: %.3f",
+ sprintf (state->fps_str,
+ "Collisions: %6.3f/frame Max motion: %6.3f",
cps/fps, max_d);
draw_fps_string(state);
@@ -803,6 +815,8 @@ fluidballs_free (Display *dpy, Window window, void *closure)
XFreeGC (dpy, state->draw_gc);
XFreeGC (dpy, state->draw_gc2);
XFreeGC (dpy, state->erase_gc);
+ XftFontClose (state->dpy, state->font);
+ XftDrawDestroy (state->xftdraw);
free (state->m);
free (state->r);
free (state->vx);
diff --git a/hacks/fluidballs.man b/hacks/fluidballs.man
index 650fe63..0fa3ded 100644
--- a/hacks/fluidballs.man
+++ b/hacks/fluidballs.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-fluidballs - the physics of bouncing balls.
+fluidballs \- the physics of bouncing balls.
.SH SYNOPSIS
.B fluidballs
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/fontglide.c b/hacks/fontglide.c
index 54c11b1..3eff604 100644
--- a/hacks/fontglide.c
+++ b/hacks/fontglide.c
@@ -13,17 +13,20 @@
* Requires a system with scalable fonts. (X's font handing sucks. A lot.)
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
-
-
/* If you turn on DEBUG, this program also masquerades as a tool for
debugging font metrics issues, which is probably only if interest
if you are doing active development on libjwxyz.a itself.
*/
/* #define DEBUG */
+#include "screenhack.h"
+#include "textclient.h"
+#include "utf8wc.h"
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+#include "xdbe.h"
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
#include <math.h>
#include <time.h>
@@ -35,15 +38,6 @@
# include <unistd.h>
#endif
-#include "screenhack.h"
-#include "textclient.h"
-#include "xft.h"
-#include "utf8wc.h"
-
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
-#include "xdbe.h"
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-
typedef struct {
char *text;
@@ -205,7 +199,84 @@ pick_font_1 (state *s, sentence *se)
char pattern[1024];
char pattern2[1024];
-#ifndef HAVE_JWXYZ /* real Xlib */
+# define _DONE_1 /**/
+# define _DONE_2 /**/
+# if defined(HAVE_XFT) && !defined(HAVE_JWXYZ) /* Real Xft under real X11 */
+# undef _DONE_1
+# undef _DONE_2
+# define _DONE_1 DONE_1:
+# define _DONE_2 DONE_2:
+ if (s->font_override)
+ {
+ sprintf (pattern, "%.200s", s->font_override);
+ ok = True;
+ goto DONE_1;
+ }
+ else
+ {
+ unsigned long pixel = pick_font_size (s);
+
+ /* https://keithp.com/~keithp/render/Xft.tutorial */
+ XftFontSet *fs =
+ XftListFonts (s->dpy, DefaultScreen (s->dpy),
+ /* Pattern-triples to match, followed by a NULL */
+ /* XFT_FAMILY, XftTypeString, "Helvetica", */
+ /* XFT_SIZE, XftTypeDouble, 12.0, */
+ NULL,
+ /* Properties to return, followed by a second NULL */
+ XFT_FAMILY,
+ XFT_STYLE,
+ XFT_SLANT,
+ XFT_WEIGHT,
+ XFT_SIZE,
+ NULL);
+ XftPattern *pat;
+ char name1[1024], name2[1024], *s1, *s2;
+ XftFont *font;
+
+ if (!fs) abort();
+ if (fs->nfont <= 0)
+ {
+ fprintf (stderr, "%s: unable to list fonts\n", progname);
+ abort();
+ }
+ pat = fs->fonts[(random() % fs->nfont)];
+ if (!pat) abort();
+ if (! XftNameUnparse (pat, name1, sizeof(name1)-1))
+ {
+ /* I've seen this happen but rarely. Bogus font? */
+ /* fprintf (stderr, "%s: unable to get font name\n", progname); */
+ return False;
+ }
+
+ /* Convert "Helvetica:style=..." into "Helvetica-48:style=" */
+ s1 = strchr (name1, ':');
+ s2 = strchr (name1, '-');
+ if (!s1) abort();
+ if (!s2) s2 = s1;
+ memcpy (name2, name1, s2 - name1);
+ name2[s2 - name1] = 0;
+ sprintf (name2 + strlen(name2), "-%ld:", pixel);
+ strcat (name2, s2 + 1);
+ font = XftFontOpenName (s->dpy, screen_number (s->xgwa.screen), name2);
+
+ if (!font)
+ {
+ fprintf (stderr, "%s: unable to load Xft font \"%s\"\n",
+ progname, name2);
+ return False;
+ }
+
+ /* #### This gets a link error with FcFontSetDestroy missing. */
+ /* if (fs) XftFontSetDestroy (fs); */
+
+ se->xftfont = font;
+ ok = True;
+ goto DONE_2;
+ }
+
+# elif !defined(HAVE_JWXYZ) /* No Xft but real Xlib */
+
char **names = 0;
char **names2 = 0;
XFontStruct *info = 0;
@@ -243,6 +314,7 @@ pick_font_1 (state *s, sentence *se)
"0", /* avg width */
s->charset); /* registry + encoding */
+
names = XListFonts (s->dpy, pattern, 1000, &count);
if (count <= 0)
@@ -364,7 +436,7 @@ pick_font_1 (state *s, sentence *se)
XFreeFontInfo (names2, info, count2);
XFreeFontNames (names);
-# else /* HAVE_JWXYZ */
+# else /* HAVE_JWXYZ -- no Xft on macOS, iOS or Android */
if (s->font_override)
sprintf (pattern, "%.200s", s->font_override);
@@ -379,11 +451,15 @@ pick_font_1 (state *s, sentence *se)
ok = True;
# endif /* HAVE_JWXYZ */
+ _DONE_1
+
if (! ok) return False;
se->xftfont = XftFontOpenXlfd (s->dpy, screen_number (s->xgwa.screen),
pattern);
+ _DONE_2
+
if (! se->xftfont)
{
# ifdef DEBUG
@@ -1638,12 +1714,12 @@ fontglide_draw_metrics (state *s)
if (! s->metrics_xftfont)
{
s->metrics_xftfont =
- XftFontOpenXlfd (s->dpy, screen_number(s->xgwa.screen), fn);
+ load_xft_font_retry (s->dpy, screen_number(s->xgwa.screen), fn);
if (! s->metrics_xftfont)
{
const char *fn2 = "fixed";
s->metrics_xftfont =
- XftFontOpenName (s->dpy, screen_number(s->xgwa.screen), fn2);
+ load_xft_font_retry (s->dpy, screen_number(s->xgwa.screen), fn2);
if (s->metrics_xftfont)
fn = fn2;
else
diff --git a/hacks/fontglide.man b/hacks/fontglide.man
index f60d20d..0edcb3b 100644
--- a/hacks/fontglide.man
+++ b/hacks/fontglide.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "30-Oct-99" "X Version 11"
.SH NAME
-fontglide - characters float onto the screen to form words
+fontglide \- characters float onto the screen to form words
.SH SYNOPSIS
.B fontglide
[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
@@ -68,7 +68,7 @@ a pipe, and any words that it prints to \fIstdout\fP will end up on
the window. (Whitespace and line breaks are ignored.) If the program
exits, it will be launched again after we have processed all the text
it produced. Default:
-.BR xscreensaver-text (1).
+.BR xscreensaver\-text (MANSUFFIX).
.TP 8
.B \-font\fP \fIstring\fP
The base font pattern to use when loading fonts. The default is to search
@@ -101,7 +101,7 @@ to get the name of a resource file that overrides the global resources
stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR xscreensaver (1),
-.BR xscreensaver-text (1),
+.BR xscreensaver\-text (MANSUFFIX),
.BR fortune (1),
.BR phosphor (MANSUFFIX),
.BR apple2 (MANSUFFIX),
diff --git a/hacks/fonts/Makefile.in b/hacks/fonts/Makefile.in
new file mode 100644
index 0000000..193ecec
--- /dev/null
+++ b/hacks/fonts/Makefile.in
@@ -0,0 +1,96 @@
+# hacks/fonts/Makefile.in --- xscreensaver, Copyright © 2021 Jamie Zawinski.
+# the `../configure' script generates `hacks/fonts/Makefile' from this file.
+
+@SET_MAKE@
+srcdir = @srcdir@
+VPATH = ${srcdir}
+top_srcdir = @top_srcdir@
+top_builddir = ..
+
+install_prefix =
+prefix = @prefix@
+datarootdir = @datarootdir@
+datadir = @datadir@
+FONT_DIR = @FONT_DIR@
+
+RM = rm -f
+
+STAR = *
+TARFILES = Makefile.in \
+ $(STAR).ttf \
+ $(STAR).otf
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_DIRS = @INSTALL_DIRS@
+
+# "Classic Console" is a reproduction of the MS-DOS 8x16 VGA font by
+# Deejayy. Freely redistributable. http://webdraft.hu/fonts/classic-console/
+# It us used by BSOD.
+#
+# "Gallant" was the original Solaris 2.x console font. It is used by BSOD.
+#
+# "Luxi Mono" was the Red Hat console font; it is very similar to "Gallant".
+# Also used by BSOD.
+#
+# "OCR-A Std" is the ANSI Standard Optical Character Recognition font,
+# ANSI X3.17-1981 / ISO 1073-1:1976. It is used by Esper, MemScroller,
+# Carousel and Photopile.
+#
+# "Special Elite Regular" is a typewriter font by Astigmatic One Eye
+# Typographic Institute, Brian J. Bonislawsky. Apache 2.0 license.
+# https://www.1001fonts.com/special-elite-font.html
+# Used by XJack.
+#
+FONTS = clacon.ttf \
+ gallant12x22.ttf \
+ luximr.ttf \
+ OCRAStd.otf \
+ SpecialElite.ttf
+
+default: all
+
+all:
+clean:
+distclean:: clean
+ -rm -f Makefile TAGS *~ "#"*
+
+list_tarfiles:
+ @find $(TARFILES) -type f -print | sort
+
+install:: install-fonts
+install-fonts:
+ @if [ -z "$(FONT_DIR)" ]; then \
+ echo "not installing fonts" ; \
+ else \
+ dest="$(install_prefix)$(FONT_DIR)" ; \
+ if [ ! -d "$$dest" ]; then \
+ echo $(INSTALL_DIRS) "$$dest" ; \
+ $(INSTALL_DIRS) "$$dest" ; \
+ fi ; \
+ for f in $(FONTS) ; do \
+ echo $(INSTALL_DATA) $$f $$dest/$$f ; \
+ $(INSTALL_DATA) $$f $$dest/$$f ; \
+ done ; \
+ fi
+
+uninstall:: uninstall-fonts
+uninstall-fonts:
+ @if ! [ -z "$(FONT_DIR)" ]; then \
+ dest="$(install_prefix)$(FONT_DIR)" ; \
+ for f in $(FONTS) ; do \
+ echo $(RM) $$dest/$$f ; \
+ $(RM) $$dest/$$f ; \
+ done ; \
+ rmdir "$(install_prefix)$(FONT_DIR)" ; \
+ exit 0 ; \
+ fi
+
+install-program:
+install-man:
+install-strip:
+uninstall-program:
+uninstall-man:
+depend:
+distdepend:
+tags:
diff --git a/hacks/fonts/OCRAStd.otf b/hacks/fonts/OCRAStd.otf
new file mode 100644
index 0000000..aee7c35
--- /dev/null
+++ b/hacks/fonts/OCRAStd.otf
Binary files differ
diff --git a/hacks/fonts/SpecialElite.ttf b/hacks/fonts/SpecialElite.ttf
new file mode 100644
index 0000000..b62fddb
--- /dev/null
+++ b/hacks/fonts/SpecialElite.ttf
Binary files differ
diff --git a/hacks/fonts/clacon.ttf b/hacks/fonts/clacon.ttf
new file mode 100644
index 0000000..c7b98fc
--- /dev/null
+++ b/hacks/fonts/clacon.ttf
Binary files differ
diff --git a/hacks/fonts/gallant12x22.ttf b/hacks/fonts/gallant12x22.ttf
new file mode 100644
index 0000000..c7ce0dc
--- /dev/null
+++ b/hacks/fonts/gallant12x22.ttf
Binary files differ
diff --git a/hacks/fonts/luximr.ttf b/hacks/fonts/luximr.ttf
new file mode 100644
index 0000000..6ad6e12
--- /dev/null
+++ b/hacks/fonts/luximr.ttf
Binary files differ
diff --git a/hacks/forest.c b/hacks/forest.c
index 38a480d..6afd98f 100644
--- a/hacks/forest.c
+++ b/hacks/forest.c
@@ -14,10 +14,6 @@
* implied warranty.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
/* ****************************** NOTE ******************************
This is not the xlockmore version of forest, but a much better
diff --git a/hacks/forest.man b/hacks/forest.man
index 4447221..cc46df6 100644
--- a/hacks/forest.man
+++ b/hacks/forest.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "27-May-97" "X Version 11"
.SH NAME
-forest - draws a fractal forest
+forest \- draws a fractal forest
.SH SYNOPSIS
.B forest
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP]
diff --git a/hacks/fps.c b/hacks/fps.c
index 6322fbe..c62b867 100644
--- a/hacks/fps.c
+++ b/hacks/fps.c
@@ -1,4 +1,4 @@
-/* fps, Copyright (c) 2001-2019 Jamie Zawinski <jwz@jwz.org>
+/* fps, Copyright © 2001-2021 Jamie Zawinski <jwz@jwz.org>
* Draw a frames-per-second display (Xlib and OpenGL).
*
* Permission to use, copy, modify, distribute, and sell this software and its
@@ -10,22 +10,22 @@
* implied warranty.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
-
-#include <time.h>
#include "screenhackI.h"
+#include "xft.h"
#include "fpsI.h"
+#include <time.h>
+
fps_state *
fps_init (Display *dpy, Window window)
{
fps_state *st;
const char *font;
- XFontStruct *f;
+ XftFont *f;
Bool top_p;
XWindowAttributes xgwa;
+ XGCValues gcv;
+ char *s;
if (! get_boolean_resource (dpy, "doFPS", "DoFPS"))
return 0;
@@ -42,22 +42,21 @@ fps_init (Display *dpy, Window window)
font = get_string_resource (dpy, "fpsFont", "Font");
+ XGetWindowAttributes (dpy, window, &xgwa);
+
if (!font)
- font = "-*-courier-bold-r-normal-*-*-180-*-*-*-*-*-*"; /* also texfont.c */
- f = load_font_retry (dpy, font);
+ font = "monospace bold 18"; /* also texfont.c */
+ f = load_xft_font_retry (dpy, screen_number (xgwa.screen), font);
if (!f) abort();
- {
- XGCValues gcv;
- XGetWindowAttributes (dpy, window, &xgwa);
- gcv.font = f->fid;
- gcv.foreground =
- get_pixel_resource (st->dpy, xgwa.colormap, "foreground", "Foreground");
- st->draw_gc = XCreateGC (dpy, window, GCFont|GCForeground, &gcv);
- gcv.foreground =
- get_pixel_resource (st->dpy, xgwa.colormap, "background", "Background");
- st->erase_gc = XCreateGC (dpy, window, GCFont|GCForeground, &gcv);
- }
+ s = get_string_resource (st->dpy, "foreground", "Foreground");
+ if (!s) s = strdup ("white");
+ XftColorAllocName (st->dpy, xgwa.visual, xgwa.colormap, s, &st->fg);
+ free (s);
+ st->xftdraw = XftDrawCreate (dpy, window, xgwa.visual, xgwa.colormap);
+ gcv.foreground =
+ get_pixel_resource (st->dpy, xgwa.colormap, "background", "Background");
+ st->erase_gc = XCreateGC (dpy, window, GCForeground, &gcv);
st->font = f;
st->x = 10;
@@ -65,14 +64,22 @@ fps_init (Display *dpy, Window window)
if (top_p)
st->y = - (st->font->ascent + st->font->descent + 10);
-# ifdef USE_IPHONE
+ {
+ XGlyphInfo overall;
+ XftTextExtentsUtf8 (st->dpy, st->font, (FcChar8 *) "m", 1, &overall);
+ st->em = overall.xOff;
+ }
+
+# ifdef HAVE_IPHONE
/* Don't hide the FPS display under the iPhone X bezel.
#### This is the worst of all possible ways to do this! But how else?
+ This magic number should catch iPhone X and larger, but unfortunately
+ also catches iPads which do not have the stupid bezel.
*/
- if (xgwa.width == 2436 || xgwa.height == 2436)
+ if (xgwa.width >= 1218 || xgwa.height >= 1218)
{
- st->x += 48;
- st->y += 48 * (top_p ? -1 : 1);
+ st->x += 18;
+ st->y += 18 * (top_p ? -1 : 1);
}
# endif
@@ -84,9 +91,9 @@ fps_init (Display *dpy, Window window)
void
fps_free (fps_state *st)
{
- if (st->draw_gc) XFreeGC (st->dpy, st->draw_gc);
+ if (st->xftdraw) XftDrawDestroy (st->xftdraw);
if (st->erase_gc) XFreeGC (st->dpy, st->erase_gc);
- if (st->font) XFreeFont (st->dpy, st->font);
+ if (st->font) XftFontClose (st->dpy, st->font);
free (st);
}
@@ -212,37 +219,6 @@ fps_compute (fps_state *st, unsigned long polys, double depth)
}
-
-/* Width (and optionally height) of the string in pixels.
- */
-static int
-string_width (XFontStruct *f, const char *c, int *height_ret)
-{
- int x = 0;
- int max_w = 0;
- int h = f->ascent + f->descent;
- while (*c)
- {
- int cc = *((unsigned char *) c);
- if (*c == '\n')
- {
- if (x > max_w) max_w = x;
- x = 0;
- h += f->ascent + f->descent;
- }
- else
- x += (f->per_char
- ? f->per_char[cc-f->min_char_or_byte2].width
- : f->min_bounds.rbearing);
- c++;
- }
- if (x > max_w) max_w = x;
- if (height_ret) *height_ret = h;
-
- return max_w;
-}
-
-
/* This function is used only in Xlib mode. For GL mode, see glx/fps-gl.c.
*/
void
@@ -272,12 +248,41 @@ fps_draw (fps_state *st)
if (st->clear_p)
{
int w, h;
- w = string_width (st->font, string, &h);
+ int olines = lines;
+ const char *ostring = string;
+ int maxw = 0;
+ while (lines)
+ {
+ s = strchr (string, '\n');
+ if (! s) s = string + strlen(string);
+# if 0
+ {
+ XGlyphInfo overall;
+ XftTextExtentsUtf8 (st->dpy, st->font, (FcChar8 *) string,
+ s - string, &overall);
+ w = overall.width - overall.x + st->em;
+ }
+# else
+ /* Measuring the font is slow, let's just assume this will fit. */
+ w = st->em * 12; /* "Load: 100.0%" */
+# endif
+ if (w > maxw) maxw = w;
+ string = s;
+ string++;
+ lines--;
+ }
+ w = maxw;
+ h = olines * (st->font->ascent + st->font->descent);
+
XFillRectangle (st->dpy, st->window, st->erase_gc,
x - st->font->descent,
y - lh,
w + 2*st->font->descent,
h + 2*st->font->descent);
+
+
+ lines = olines;
+ string = ostring;
}
/* draw the text */
@@ -285,8 +290,8 @@ fps_draw (fps_state *st)
{
s = strchr (string, '\n');
if (! s) s = string + strlen(string);
- XDrawString (st->dpy, st->window, st->draw_gc,
- x, y, string, (int) (s - string));
+ XftDrawStringUtf8 (st->xftdraw, &st->fg, st->font,
+ x, y, (FcChar8 *) string, s - string);
string = s;
string++;
lines--;
diff --git a/hacks/fps.h b/hacks/fps.h
index d3832c1..2678217 100644
--- a/hacks/fps.h
+++ b/hacks/fps.h
@@ -13,10 +13,6 @@
#ifndef __XSCREENSAVER_FPS_H__
# define __XSCREENSAVER_FPS_H__
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
-
typedef struct fps_state fps_state;
extern fps_state *fps_init (Display *, Window);
diff --git a/hacks/fpsI.h b/hacks/fpsI.h
index 552de9c..87e9f82 100644
--- a/hacks/fpsI.h
+++ b/hacks/fpsI.h
@@ -1,4 +1,4 @@
-/* fps, Copyright (c) 2001-2014 Jamie Zawinski <jwz@jwz.org>
+/* fps, Copyright (c) 2001-2021 Jamie Zawinski <jwz@jwz.org>
* Draw a frames-per-second display (Xlib and OpenGL).
*
* Permission to use, copy, modify, distribute, and sell this software and its
@@ -14,21 +14,21 @@
# define __XSCREENSAVER_FPSI_H__
#include "fps.h"
-#undef HAVE_GLBITMAP
-
struct fps_state {
Display *dpy;
Window window;
- int x, y;
- XFontStruct *font;
+ int x, y, em;
+ XftFont *font;
Bool clear_p;
char string[1024];
/* for glx/fps-gl.c */
void *gl_fps_data;
- GC draw_gc, erase_gc;
+ XftColor fg;
+ XftDraw *xftdraw;
+ GC erase_gc;
int last_ifps;
double last_fps;
diff --git a/hacks/fuzzyflakes.c b/hacks/fuzzyflakes.c
index d655ca9..db6524c 100644
--- a/hacks/fuzzyflakes.c
+++ b/hacks/fuzzyflakes.c
@@ -447,8 +447,11 @@ FuzzyFlakesFreeFlake(Flake *flake)
if (flake->DB.ba) XFreePixmap(flake->dpy, flake->DB.ba);
XFreeGC (flake->dpy, flake->GCVar);
if (flake->Colors.Back) free (flake->Colors.Back);
+ flake->Colors.Back = 0;
if (flake->Colors.Fore) free (flake->Colors.Fore);
+ flake->Colors.Fore = 0;
if (flake->Colors.Bord) free (flake->Colors.Bord);
+ flake->Colors.Bord = 0;
}
static void
diff --git a/hacks/fuzzyflakes.man b/hacks/fuzzyflakes.man
index 22222bd..f4e9122 100644
--- a/hacks/fuzzyflakes.man
+++ b/hacks/fuzzyflakes.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "12-May-04" "X Version 11"
.SH NAME
-fuzzyflakes - falling snowflakes/flower shapes
+fuzzyflakes \- falling snowflakes/flower shapes
.SH SYNOPSIS
.B fuzzyflakes
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
diff --git a/hacks/galaxy.man b/hacks/galaxy.man
index 1a2a79d..bac06eb 100644
--- a/hacks/galaxy.man
+++ b/hacks/galaxy.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "10-May-97" "X Version 11"
.SH NAME
-galaxy - draws spinning galaxies
+galaxy \- draws spinning galaxies
.SH SYNOPSIS
.B galaxy
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP] [\-size \fIinteger\fP] [\-tracks] [\-no\-tracks] [\-spin] [\-no\-spin]
diff --git a/hacks/glitchpeg.c b/hacks/glitchpeg.c
index 91a05de..7b4c5b0 100644
--- a/hacks/glitchpeg.c
+++ b/hacks/glitchpeg.c
@@ -1,4 +1,4 @@
-/* glitchpeg, Copyright (c) 2018-2019 Jamie Zawinski <jwz@jwz.org>
+/* glitchpeg, Copyright (c) 2018-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -23,9 +23,6 @@
#include <sys/stat.h>
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
struct state {
Display *dpy;
Window window;
@@ -83,13 +80,13 @@ draw_image (Display *dpy, Window window, Visual *v, GC gc,
int x, y, w2, h2, xoff, yoff;
double xs, ys, s;
- unsigned long crpos=0, cgpos=0, cbpos=0, capos=0; /* bitfield positions */
+ unsigned long crpos=0, cgpos=0, cbpos=0/*,capos=0*/; /* bitfield positions */
unsigned long srpos=0, sgpos=0, sbpos=0;
unsigned long srmsk=0, sgmsk=0, sbmsk=0;
unsigned long srsiz=0, sgsiz=0, sbsiz=0;
# ifdef HAVE_JWXYZ
- // BlackPixel has alpha: 0xFF000000.
+ /* BlackPixel has alpha: 0xFF000000. */
unsigned long black = BlackPixelOfScreen (DefaultScreenOfDisplay (dpy));
#else
unsigned long black = 0;
@@ -130,9 +127,9 @@ draw_image (Display *dpy, Window window, Visual *v, GC gc,
/* 'in' is RGBA in client endianness. Convert to what the server wants. */
if (bigendian())
- crpos = 24, cgpos = 16, cbpos = 8, capos = 0;
+ crpos = 24, cgpos = 16, cbpos = 8/*, capos = 0*/;
else
- crpos = 0, cgpos = 8, cbpos = 16, capos = 24;
+ crpos = 0, cgpos = 8, cbpos = 16/*, capos = 24*/;
/* Iterate the destination rectangle and pull in the corresponding
scaled and cropped source pixel, or black. Nearest-neighbor is fine.
@@ -177,6 +174,7 @@ static FILE *
open_image_name_pipe (void)
{
char *s;
+ FILE *pipe;
/* /bin/sh on OS X 10.10 wipes out the PATH. */
const char *path = getenv("PATH");
@@ -199,13 +197,13 @@ open_image_name_pipe (void)
*s = 0;
- FILE *pipe = popen (cmd, "r");
+ pipe = popen (cmd, "r");
free (cmd);
return pipe;
}
-/* Duplicated from utils/grabclient.c */
+/* Mostly duplicated from utils/grabclient.c */
static void
xscreensaver_getimage_file_cb (XtPointer closure, int *source, XtInputId *id)
{
@@ -214,18 +212,22 @@ xscreensaver_getimage_file_cb (XtPointer closure, int *source, XtInputId *id)
struct state *st = (struct state *) closure;
char buf[10240];
char *file = buf;
+ char *result;
FILE *fp;
struct stat stat;
int n;
unsigned char *s;
int L;
+ static int error_count = 0;
+
*buf = 0;
- fgets (buf, sizeof(buf)-1, st->pipe);
+ result = fgets (buf, sizeof(buf)-1, st->pipe);
pclose (st->pipe);
st->pipe = 0;
XtRemoveInput (st->pipe_id);
st->pipe_id = 0;
+ if (!result) goto FAIL;
/* strip trailing newline */
L = strlen(buf);
@@ -234,22 +236,22 @@ xscreensaver_getimage_file_cb (XtPointer closure, int *source, XtInputId *id)
if (!*file)
{
- fprintf (stderr, "%s: no suitable images in imageDirectory\n",
- progname);
- return;
+ /* fprintf (stderr, "%s: no suitable images in imageDirectory\n",
+ progname); */
+ goto FAIL;
}
fp = fopen (file, "r");
if (! fp)
{
fprintf (stderr, "%s: unable to read %s\n", progname, file);
- return;
+ goto FAIL;
}
if (fstat (fileno (fp), &stat))
{
fprintf (stderr, "%s: %s: stat failed\n", progname, file);
- return;
+ goto FAIL;
}
if (st->image_data) free (st->image_data);
@@ -264,9 +266,16 @@ xscreensaver_getimage_file_cb (XtPointer closure, int *source, XtInputId *id)
fclose (fp);
- /* fprintf (stderr, "loaded %s (%lu)\n", file, st->image_size); */
-
st->start_time = time((time_t *) 0);
+ error_count = 0;
+ return;
+
+ FAIL:
+ if (++error_count > 10)
+ {
+ fprintf (stderr, "%s: too many errors loading images\n", progname);
+ exit (1);
+ }
}
@@ -330,6 +339,7 @@ glitchpeg_draw (Display *dpy, Window window, void *closure)
unsigned char *glitched = malloc (st->image_size);
int nn = random() % st->count;
if (nn <= 0) nn = 1;
+ if (! (random() % 30)) nn *= 20;
memcpy (glitched, st->image_data, st->image_size);
diff --git a/hacks/glitchpeg.man b/hacks/glitchpeg.man
index ca80165..9593d2c 100644
--- a/hacks/glitchpeg.man
+++ b/hacks/glitchpeg.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-glitchpeg - glitched image screen saver.
+glitchpeg \- glitched image screen saver.
.SH SYNOPSIS
.B glitchpeg
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/Makefile.in b/hacks/glx/Makefile.in
index 7ddb223..ed07a1f 100644
--- a/hacks/glx/Makefile.in
+++ b/hacks/glx/Makefile.in
@@ -1,5 +1,4 @@
-# hacks/glx/Makefile.in --- xscreensaver, Copyright (c) 1999-2018
-# by Jamie Zawinski.
+# hacks/glx/Makefile.in --- xscreensaver, Copyright © 1999-2021 Jamie Zawinski.
# the `../../configure' script generates `hacks/glx/Makefile' from this file.
@SET_MAKE@
@@ -32,6 +31,9 @@ DEFS = -DSTANDALONE -DUSE_GL @DEFS@
LIBS = @LIBS@
PERL = @PERL@
+THREAD_LIBS = @PTHREAD_LIBS@
+THREAD_CFLAGS = @PTHREAD_CFLAGS@
+
DEPEND = @DEPEND@
DEPEND_FLAGS = @DEPEND_FLAGS@
DEPEND_DEFINES = @DEPEND_DEFINES@
@@ -40,7 +42,7 @@ SHELL = /bin/sh
INSTALL = @INSTALL@
SUID_FLAGS = -o root -m 4755
INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SETUID = @INSTALL_SETUID@
+INSTALL_SETUID = $(INSTALL_PROGRAM) $(SUID_FLAGS)
INSTALL_DATA = @INSTALL_DATA@
INSTALL_DIRS = @INSTALL_DIRS@
PROG_SETCAP = @PROG_SETCAP@
@@ -50,13 +52,12 @@ X_CFLAGS = @X_CFLAGS@
X_LIBS = @X_LIBS@
X_PRE_LIBS = @X_PRE_LIBS@
X_EXTRA_LIBS = @X_EXTRA_LIBS@
-XMU_LIBS = @XMU_LIBS@
XFT_LIBS = @XFT_LIBS@
# Note: see comment in ../../driver/Makefile.in for explanation of X_LIBS, etc.
#
HACK_PRE = $(LIBS) $(X_LIBS)
-HACK_POST = $(X_PRE_LIBS) $(XFT_LIBS) -lXt -lX11 $(XMU_LIBS) -lXext $(X_EXTRA_LIBS) -lm
+HACK_POST = $(X_PRE_LIBS) $(XFT_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS) -lm
HACK_POST2 = @GL_LIBS@ @HACK_LIBS@ $(HACK_POST)
HACK_LIBS = $(HACK_PRE) @ANIM_LIBS@ $(HACK_POST2)
PNG_LIBS = $(HACK_PRE) @PNG_LIBS@ $(HACK_POST2)
@@ -86,13 +87,13 @@ UTILDIR_OBJS = $(UTILS_BIN)/colors.o $(UTILS_BIN)/grabclient.o \
$(UTILS_BIN)/textclient.o $(UTILS_BIN)/async_netdb.o \
$(UTILS_BIN)/aligned_malloc.o $(UTILS_BIN)/thread_util.o \
$(UTILS_BIN)/spline.o $(UTILS_BIN)/pow2.o \
- $(UTILS_SRC)/font-retry.c
+ $(UTILS_BIN)/font-retry.o
JWXYZ_OBJS = $(JWXYZ_BIN)/jwzgles.o
HACKDIR_OBJS = $(HACK_BIN)/screenhack.o $(HACK_BIN)/xlockmore.o \
$(HACK_BIN)/fps.o $(HACK_BIN)/ximage-loader.o
PNG = $(HACK_BIN)/ximage-loader.o
-SRCS = xscreensaver-gl-helper.c normals.c erase-gl.c fps-gl.c \
+SRCS = xscreensaver-gl-visual.c normals.c erase-gl.c fps-gl.c \
atlantis.c b_draw.c b_lockglue.c b_sphere.c bubble3d.c \
buildlwo.c cage.c dolphin.c gears.c lament.c lament_model.c \
moebius.c morph3d.c pipeobjs.c pipes.c rubik.c s1_1.c s1_2.c \
@@ -120,8 +121,8 @@ SRCS = xscreensaver-gl-helper.c normals.c erase-gl.c fps-gl.c \
flipflop.c antspotlight.c polytopes.c gleidescope.c \
mirrorblob.c blinkbox.c noof.c polyhedra.c polyhedra-gl.c \
antinspect.c providence.c pinion.c involute.c boing.c \
- texfont.c carousel.c fliptext.c antmaze.c tangram.c \
- tangram_shapes.c crackberg.c glhanoi.c cube21.c \
+ texfont.c carousel.c fliptext.c antmaze.c \
+ tangram.c tangram_shapes.c crackberg.c glhanoi.c cube21.c \
timetunnel.c juggler3d.c topblock.c glschool.c \
glschool_gl.c glschool_alg.c glcells.c voronoi.c \
moebiusgears.c lockward.c cubicgrid.c hypnowheel.c \
@@ -138,9 +139,10 @@ SRCS = xscreensaver-gl-helper.c normals.c erase-gl.c fps-gl.c \
splodesic.c hexstrut.c vigilance.c seccam.c esper.c \
razzledazzle.c ships.c peepers.c crumbler.c quickhull.c \
maze3d.c handsy.c handsy_model.c gravitywell.c deepstars.c \
- gibson.c etruscanvenus.c
+ gibson.c etruscanvenus.c sphereeversion.c covid19.c \
+ co____9.c headroom.c headroom_model.c beats.c glsl-utils.c
-OBJS = xscreensaver-gl-helper.o normals.o erase-gl.o fps-gl.o \
+OBJS = xscreensaver-gl-visual.o normals.o erase-gl.o fps-gl.o \
atlantis.o b_draw.o b_lockglue.o b_sphere.o bubble3d.o \
buildlwo.o cage.o dolphin.o gears.o lament.o lament_model.o \
moebius.o morph3d.o pipeobjs.o pipes.o rubik.o s1_1.o s1_2.o \
@@ -168,8 +170,8 @@ OBJS = xscreensaver-gl-helper.o normals.o erase-gl.o fps-gl.o \
flipflop.o antspotlight.o polytopes.o gleidescope.o \
mirrorblob.o blinkbox.o noof.o polyhedra.o polyhedra-gl.o \
antinspect.o providence.o pinion.o involute.o boing.o \
- texfont.o carousel.o fliptext.o antmaze.o tangram.o \
- tangram_shapes.o crackberg.o glhanoi.o cube21.o \
+ texfont.o texfont-glsl.o carousel.o fliptext.o antmaze.o \
+ tangram.o tangram_shapes.o crackberg.o glhanoi.o cube21.o \
timetunnel.o juggler3d.o topblock.o glschool.o \
glschool_gl.o glschool_alg.o glcells.o voronoi.o \
moebiusgears.o lockward.o cubicgrid.o hypnowheel.o \
@@ -186,7 +188,8 @@ OBJS = xscreensaver-gl-helper.o normals.o erase-gl.o fps-gl.o \
splodesic.o hexstrut.o vigilance.o seccam.o esper.o \
razzledazzle.o ships.o peepers.o crumbler.o quickhull.o \
maze3d.o handsy.o handsy_model.o gravitywell.o deepstars.o \
- gibson.o etruscanvenus.o
+ gibson.o etruscanvenus.o sphereeversion.o covid19.o \
+ headroom.o headroom_model.o beats.o glsl-utils.o
GL_EXES = cage gears moebius pipes sproingies stairs superquadrics \
morph3d rubik atlantis lament bubble3d glplanet pulsar \
@@ -207,15 +210,16 @@ GL_EXES = cage gears moebius pipes sproingies stairs superquadrics \
splitflap dymaxionmap unicrud energystream raverhoop \
hydrostat discoball cubetwist cubestack splodesic \
hexstrut vigilance esper razzledazzle peepers crumbler \
- maze3d handsy gravitywell deepstars gibson etruscanvenus
+ maze3d handsy gravitywell deepstars gibson etruscanvenus \
+ sphereeversion covid19 headroom beats
GLE_EXES = extrusion
SUID_EXES = sonar
SETCAP_EXES = sonar
-GL_UTIL_EXES = xscreensaver-gl-helper
+GL_UTIL_EXES = xscreensaver-gl-visual
JWZGLES_OBJS = @JWZGLES_OBJS@
HACK_EXES_1 = @GL_EXES@ @GLE_EXES@
HACK_EXES = $(HACK_EXES_1) @SUID_EXES@
-XSHM_OBJS = $(UTILS_BIN)/xshm.o
+XSHM_OBJS = $(UTILS_BIN)/xshm.o $(UTILS_BIN)/aligned_malloc.o
GRAB_OBJS = $(UTILS_BIN)/grabclient.o grab-ximage.o $(XSHM_OBJS)
ANIM_OBJS = recanim-gl.o
ANIM_LIBS = @PNG_LIBS@
@@ -224,16 +228,23 @@ EXES = @GL_UTIL_EXES@ $(HACK_EXES)
RETIRED_EXES = @RETIRED_GL_EXES@
RETIRED_GL_EXES = glforestfire
-FPS_OBJS = texfont.o $(HACK_BIN)/fps.o fps-gl.o @XFT_OBJS@
-HACK_OBJS = $(JWZGLES_OBJS) $(HACK_BIN)/screenhack.o @ANIM_OBJS@ \
- $(HACK_BIN)/xlockmore.o xlock-gl-utils.o erase-gl.o \
- ${FPS_OBJS} $(UTILS_BIN)/resources.o $(UTILS_BIN)/visual.o \
- $(UTILS_BIN)/visual-gl.o $(UTILS_BIN)/usleep.o \
- $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/hsv.o \
- $(UTILS_BIN)/colors.o $(UTILS_BIN)/async_netdb.o \
- $(UTILS_BIN)/aligned_malloc.o $(UTILS_BIN)/thread_util.o \
- $(UTILS_BIN)/utf8wc.o $(UTILS_BIN)/pow2.o \
- $(UTILS_BIN)/font-retry-xft.o @XMU_OBJS@
+FPS_OBJS = texfont.o $(HACK_BIN)/fps.o fps-gl.o \
+ @XFT_OBJS@
+HACK_GLSL_OBJS = glsl-utils.o
+HACK_OBJS = $(HACK_BIN)/screenhack.o $(HACK_BIN)/xlockmore.o \
+ xlock-gl-utils.o erase-gl.o \
+ $(UTILS_BIN)/resources.o \
+ $(UTILS_BIN)/colors.o \
+ $(UTILS_BIN)/hsv.o \
+ $(UTILS_BIN)/visual.o \
+ $(UTILS_BIN)/visual-gl.o \
+ $(UTILS_BIN)/font-retry.o \
+ $(UTILS_BIN)/pow2.o \
+ $(UTILS_BIN)/utf8wc.o \
+ $(UTILS_BIN)/usleep.o \
+ $(UTILS_BIN)/xmu.o \
+ $(UTILS_BIN)/yarandom.o \
+ ${FPS_OBJS} $(JWZGLES_OBJS) $(HACK_GLSL_OBJS) @ANIM_OBJS@
HDRS = atlantis.h bubble3d.h buildlwo.h e_textures.h \
grab-ximage.h tube.h sphere.h boxed.h \
@@ -245,15 +256,17 @@ HDRS = atlantis.h bubble3d.h buildlwo.h e_textures.h \
sproingies.h extrusion.h glschool.h glschool_gl.h \
glschool_alg.h topblock.h involute.h teapot.h sonar.h \
dropshadow.h starwars.h teapot2.h dnapizza.h curlicue.h \
- quickhull.h dymaxionmap-coords.h handsy_anim.h
-GL_MEN = atlantis.man boxed.man bubble3d.man cage.man circuit.man \
+ quickhull.h dymaxionmap-coords.h handsy_anim.h \
+ glsl-utils.h
+GL_MEN = xscreensaver-gl-visual.man \
+ atlantis.man boxed.man bubble3d.man cage.man circuit.man \
cubenetic.man dangerball.man engine.man extrusion.man \
flipscreen3d.man gears.man gflux.man \
glplanet.man glsnake.man gltext.man lament.man lavalite.man \
menger.man moebius.man molecule.man morph3d.man pipes.man \
pulsar.man queens.man rubik.man sballs.man sierpinski3d.man \
spheremonics.man sproingies.man stairs.man starwars.man \
- stonerview.man superquadrics.man xscreensaver-gl-helper.man \
+ stonerview.man superquadrics.man \
endgame.man flurry.man glblur.man atunnel.man \
flyingtoasters.man bouncingcow.man glslideshow.man \
jigglypuff.man klein.man hypertorus.man glmatrix.man \
@@ -275,7 +288,8 @@ GL_MEN = atlantis.man boxed.man bubble3d.man cage.man circuit.man \
discoball.man cubetwist.man cubestack.man splodesic.man \
hexstrut.man vigilance.man esper.man razzledazzle.man \
peepers.man crumbler.man maze3d.man handsy.man \
- gravitywell.man deepstars.man gibson.man etruscanvenus.man
+ gravitywell.man deepstars.man gibson.man etruscanvenus.man \
+ sphereeversion.man covid19.man headroom.man beats.man
MEN = @GL_MEN@
RETIRED_MEN = glforestfire.man
EXTRAS = README Makefile.in dxf2gl.pl vrml2gl.pl wfront2gl.pl \
@@ -295,7 +309,7 @@ install-strip:
# the hacks, in $HACKDIR
install-program:: $(EXES)
- @exes="$(HACK_EXES_1)" ; \
+ @exes="$(HACK_EXES_1) @GL_UTIL_EXES@" ; \
idir="$(install_prefix)$(HACKDIR)" ; \
if [ "$$exes" != "" ]; then \
if [ ! -d $$idir ]; then \
@@ -347,20 +361,6 @@ install-program:: $(EXES)
fi
-# the xscreensaver-gl-helper program, in $bindir
-install-program:: $(EXES)
- @exes="@GL_UTIL_EXES@" ; \
- idir="$(install_prefix)$(bindir)" ; \
- if [ "$$exes" != "" ]; then \
- if [ ! -d $$idir ]; then \
- $(INSTALL_DIRS) $$idir ; \
- fi ; \
- for program in $$exes; do \
- echo $(INSTALL_PROGRAM) $$program $$idir/$$program ; \
- $(INSTALL_PROGRAM) $$program $$idir/$$program ; \
- done ; \
- fi
-
# When installing man pages, we install "foo.man" as "foo.N" and update
# the .TH line in the installed file with one like
#
@@ -371,7 +371,7 @@ install-program:: $(EXES)
install-man: $(MEN)
@men="$(MEN)" ; \
U=$(UTILS_SRC)/version.h ; \
- V=`sed -n 's/.*xscreensaver \([0-9]\.[^)]*)\).*/\1/p' < $$U` ; \
+ V=`sed -n 's/.*xscreensaver \([0-9]\.[^)]*)\).*/\1/p' < $$U` ; \
T=/tmp/xs$$$$.$(mansuffix) ; \
TH=".TH XScreenSaver $(mansuffix) \"$$V\" \"X Version 11\"" ; \
echo "installing man pages: $$TH" ; \
@@ -409,21 +409,16 @@ install-xml:
# the hacks, in $HACKDIR
uninstall-program::
- @exes="$(HACK_EXES) $(RETIRED_EXES)" ; \
+ @exes="$(HACK_EXES) $(RETIRED_EXES) @GL_UTIL_EXES@" ; \
idir="$(install_prefix)$(HACKDIR)" ; \
for program in $$exes; do \
echo rm -f $$idir/$$program ; \
rm -f $$idir/$$program ; \
done
-# the xscreensaver-gl-helper program, in $bindir
+# $HACKDIR/xscreensaver-gl-visual used to be $bindir/xscreensaver-gl-helper
uninstall-program::
- @exes="$(GL_UTIL_EXES)" ; \
- idir="$(install_prefix)$(bindir)" ; \
- for program in $$exes; do \
- echo rm -f $$idir/$$program ; \
- rm -f $$idir/$$program ; \
- done
+ rm -f $(install_prefix)$(bindir)/xscreensaver-gl-helper
uninstall-man:
@men="$(MEN) $(RETIRED_MEN)" ; \
@@ -487,8 +482,8 @@ TAGS: tags
tags:
find $(srcdir) -name '*.[chly]' -print | xargs etags -a
-echo_tarfiles:
- @echo $(TARFILES)
+list_tarfiles:
+ @find $(TARFILES) -type f -print | sort
check_men:
@badmen="" ; \
@@ -537,7 +532,7 @@ $(UTILS_BIN)/aligned_malloc.o: $(UTILS_SRC)/aligned_malloc.c
$(UTILS_BIN)/thread_util.o: $(UTILS_SRC)/thread_util.c
$(UTILS_BIN)/spline.o: $(UTILS_SRC)/spline.c
$(UTILS_BIN)/pow2.o: $(UTILS_SRC)/pow2.c
-$(UTILS_BIN)/font-retry-xft.o: $(UTILS_SRC)/font-retry.c
+$(UTILS_BIN)/font-retry.o: $(UTILS_SRC)/font-retry.c
$(HACK_BIN)/screenhack.o: $(HACK_SRC)/screenhack.c
$(HACK_BIN)/xlockmore.o: $(HACK_SRC)/xlockmore.c
$(HACK_BIN)/fps.o: $(HACK_SRC)/fps.c
@@ -551,20 +546,25 @@ $(HACKDIR_OBJS):
# How we build object files in this directory.
+HACK_CFLAGS_BASE=$(INCLUDES) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS)
.c.o:
- $(CC) -c $(INCLUDES) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) $<
+ $(CC) -c $(HACK_CFLAGS_BASE) $<
-# Make sure the images have been packaged. This is the first one hit:
+# Make sure the images have been packaged. This is the first one hit.
+#
../images/gen/wood_png.h:
cd ../images && $(MAKE)
+ @if ! [ -f "$@" ]; then \
+ echo; echo $@ "wasn't built -- try 'gmake' instead?"; echo; exit 1; \
+ fi
-# How to build the "xscreensaver-gl-helper" program, that lets the daemon
+# How to build the "xscreensaver-gl-visual" program, that lets the daemon
# know which visual is the right one for GL programs.
#
-HELPER_OBJS = xscreensaver-gl-helper.o $(UTILS_BIN)/visual-gl.o \
- $(UTILS_BIN)/visual.o $(UTILS_BIN)/resources.o
-xscreensaver-gl-helper: $(HELPER_OBJS)
- $(CC) $(LDFLAGS) -o $@ $(HELPER_OBJS) $(LIBS) $(X_LIBS) $(HACK_POST2)
+GLH1=xscreensaver-gl-visual.o $(UTILS_BIN)/visual-gl.o
+GLH2=$(UTILS_BIN)/visual.o $(UTILS_BIN)/resources.o
+xscreensaver-gl-visual: $(GLH1) $(GLH2)
+ $(CC) $(LDFLAGS) -o $@ $(GLH1) $(GLH2) $(LIBS) $(X_LIBS) $(HACK_POST2)
# These hacks use a slightly-differently-compiled variant of recanim.c.
@@ -576,12 +576,12 @@ recanim-gl.o: $(HACK_SRC)/recanim.c
CC_HACK = $(CC) $(LDFLAGS)
-
-TRACK_OBJS=rotator.o trackball.o gltrackball.o
-HACK_TRACK_OBJS=$(HACK_OBJS) $(TRACK_OBJS)
-HACK_GRAB_OBJS=$(HACK_OBJS) $(GRAB_OBJS)
-HACK_TRACK_GRAB_OBJS=$(HACK_TRACK_OBJS) $(GRAB_OBJS)
-TEXT=$(UTILS_BIN)/textclient.o
+THREAD_OBJS = $(UTILS_BIN)/thread_util.o
+TRACK_OBJS = rotator.o trackball.o gltrackball.o
+HACK_TRACK_OBJS = $(HACK_OBJS) $(TRACK_OBJS)
+HACK_GRAB_OBJS = $(HACK_OBJS) $(GRAB_OBJS)
+HACK_TRACK_GRAB_OBJS = $(HACK_TRACK_OBJS) $(GRAB_OBJS)
+TEXT = $(UTILS_BIN)/textclient.o
ATLANTIS_OBJS = $(HACK_OBJS) dolphin.o shark.o swim.o whale.o $(PNG)
atlantis: atlantis.o $(ATLANTIS_OBJS)
@@ -622,14 +622,14 @@ morph3d: morph3d.o $(HACK_OBJS)
rubik: rubik.o $(HACK_TRACK_OBJS)
$(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-stairs: stairs.o sphere.o $(PNG) $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o sphere.o $(PNG) $(HACK_TRACK_OBJS) \
- $(HACK_LIBS) $(PNG_LIBS)
+STAIRS=sphere.o $(PNG) $(HACK_TRACK_OBJS)
+stairs: stairs.o $(STAIRS)
+ $(CC_HACK) -o $@ $@.o $(STAIRS) $(HACK_LIBS) $(PNG_LIBS)
-SPROINGIES = sproingiewrap.o gllist.o \
- s1_1.o s1_2.o s1_3.o s1_4.o s1_5.o s1_6.o s1_b.o
-sproingies: sproingies.o $(HACK_OBJS) $(SPROINGIES)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(SPROINGIES) $(HACK_LIBS)
+SPROING1=$(HACK_OBJS) sproingiewrap.o gllist.o
+SPROING2=s1_1.o s1_2.o s1_3.o s1_4.o s1_5.o s1_6.o s1_b.o
+sproingies: sproingies.o $(SPROING1) $(SPROING2)
+ $(CC_HACK) -o $@ $@.o $(SPROING1) $(SPROING2) $(HACK_LIBS)
LAMENTOBJS = gllist.o lament_model.o $(HACK_TRACK_OBJS) $(PNG) normals.o
lament: lament.o $(LAMENTOBJS)
@@ -654,12 +654,11 @@ dymaxionmap: dymaxionmap.o $(DYMAXIOBJS)
pulsar: pulsar.o $(HACK_OBJS) $(PNG)
$(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(PNG) $(PNG_LIBS)
-EXTRUSION_OBJS=extrusion.o extrusion-helix2.o extrusion-helix3.o \
- extrusion-helix4.o extrusion-joinoffset.o extrusion-screw.o \
- extrusion-taper.o extrusion-twistoid.o $(PNG) \
- $(HACK_TRACK_OBJS)
-extrusion: $(EXTRUSION_OBJS)
- $(CC_HACK) -o $@ $(EXTRUSION_OBJS) $(GLE_LIBS)
+EXTR1=extrusion.o extrusion-helix2.o extrusion-helix3.o
+EXTR2=extrusion-helix4.o extrusion-joinoffset.o extrusion-screw.o
+EXTR3=extrusion-taper.o extrusion-twistoid.o $(PNG) $(HACK_TRACK_OBJS)
+extrusion: $(EXTR1) $(EXTR2) $(EXTR3)
+ $(CC_HACK) -o $@ $(EXTR1) $(EXTR2) $(EXTR3) $(GLE_LIBS)
sierpinski3d: sierpinski3d.o $(HACK_TRACK_OBJS)
$(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
@@ -671,10 +670,10 @@ SW_OBJS=starwars.o glut_stroke.o glut_swidth.o $(TEXT) $(HACK_OBJS)
starwars: $(SW_OBJS)
$(CC_HACK) -o $@ $(SW_OBJS) $(HACK_LIBS) $(TEXT_LIBS)
-GLT_OBJS=gltext.o glut_stroke.o glut_swidth.o tube.o sphere.o \
- $(TEXT) $(HACK_TRACK_OBJS)
-gltext: $(GLT_OBJS)
- $(CC_HACK) -o $@ $(GLT_OBJS) $(HACK_LIBS) $(TEXT_LIBS)
+GLT1=gltext.o glut_stroke.o glut_swidth.o tube.o sphere.o
+GLT2=$(TEXT) $(HACK_TRACK_OBJS)
+gltext: $(GLT1) $(GLT2)
+ $(CC_HACK) -o $@ $(GLT1) $(GLT2) $(HACK_LIBS) $(TEXT_LIBS)
DB_OBJS=sphere.o tube.o $(HACK_TRACK_OBJS)
dangerball: dangerball.o $(DB_OBJS)
@@ -723,13 +722,11 @@ endgame: endgame.o chessmodels.o $(HACK_TRACK_OBJS)
glblur: glblur.o $(HACK_TRACK_OBJS)
$(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-TOAST_OBJS=\
- toaster.o toaster_base.o toaster_handle.o toaster_handle2.o \
- toaster_jet.o toaster_knob.o toaster_slots.o toaster_wing.o \
- toast.o toast2.o \
- flyingtoasters.o gllist.o $(PNG) $(HACK_TRACK_OBJS)
-flyingtoasters: $(TOAST_OBJS)
- $(CC_HACK) -o $@ $(TOAST_OBJS) $(PNG_LIBS)
+TOAST1=toaster.o toaster_base.o toaster_handle.o toaster_handle2.o
+TOAST2=toaster_jet.o toaster_knob.o toaster_slots.o toaster_wing.o
+TOAST3=toast.o toast2.o flyingtoasters.o gllist.o $(PNG) $(HACK_TRACK_OBJS)
+flyingtoasters: $(TOAST1) $(TOAST2) $(TOAST3)
+ $(CC_HACK) -o $@ $(TOAST1) $(TOAST2) $(TOAST3) $(PNG_LIBS)
toaster_dxf::
@set -e ; \
@@ -749,17 +746,15 @@ toaster_dxf::
./dxf2gl.pl --normalize --smooth $$f $$f2 ; \
done ; \
-COW_OBJS=\
- cow_face.o cow_hide.o cow_hoofs.o cow_horns.o cow_tail.o cow_udder.o \
- bouncingcow.o gllist.o $(PNG) $(HACK_TRACK_OBJS)
-bouncingcow: $(COW_OBJS)
- $(CC_HACK) -o $@ $(COW_OBJS) $(PNG_LIBS)
+COW1=cow_face.o cow_hide.o cow_hoofs.o cow_horns.o cow_tail.o cow_udder.o
+COW2=bouncingcow.o gllist.o $(PNG) $(HACK_TRACK_OBJS)
+bouncingcow: $(COW1) $(COW2)
+ $(CC_HACK) -o $@ $(COW1) $(COW2) $(PNG_LIBS)
-ROBO_OBJS=\
- robot.o robot-wireframe.o gllist.o $(PNG) sphere.o \
- winduprobot.o $(GEARS_OBJS_1) $(TEXT) $(HACK_TRACK_OBJS)
-winduprobot: $(ROBO_OBJS)
- $(CC_HACK) -o $@ $(ROBO_OBJS) $(PNG_LIBS) $(TEXT_LIBS)
+ROBO1=robot.o robot-wireframe.o gllist.o $(PNG) sphere.o
+ROBO2=winduprobot.o $(GEARS_OBJS_1) $(TEXT) $(HACK_TRACK_OBJS)
+winduprobot: $(ROBO1) $(ROBO2)
+ $(CC_HACK) -o $@ $(ROBO1) $(ROBO2) $(PNG_LIBS) $(TEXT_LIBS)
winduprobot_dxf::
./dxf2gl.pl --smooth --layers robot.dxf robot.c
@@ -787,8 +782,8 @@ surfaces: surfaces.o $(HACK_TRACK_OBJS)
hypertorus: hypertorus.o $(HACK_TRACK_OBJS)
$(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-projectiveplane: projectiveplane.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+projectiveplane: projectiveplane.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
romanboy: romanboy.o $(HACK_TRACK_OBJS)
$(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
@@ -796,6 +791,9 @@ romanboy: romanboy.o $(HACK_TRACK_OBJS)
etruscanvenus: etruscanvenus.o $(HACK_TRACK_OBJS)
$(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+sphereeversion: sphereeversion.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
glmatrix: glmatrix.o $(PNG) $(HACK_OBJS)
$(CC_HACK) -o $@ $@.o $(PNG) $(HACK_OBJS) $(PNG_LIBS)
@@ -898,10 +896,9 @@ dnalogo: dnalogo.o tube.o sphere.o normals.o $(HACK_TRACK_OBJS)
topblock: topblock.o sphere.o tube.o $(HACK_TRACK_OBJS)
$(CC_HACK) -o $@ $@.o sphere.o tube.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-SCHOOL_OBJS=glschool.o glschool_alg.o glschool_gl.o \
- sphere.o tube.o normals.o $(HACK_OBJS)
-glschool: $(SCHOOL_OBJS)
- $(CC_HACK) -o $@ $(SCHOOL_OBJS) $(HACK_LIBS)
+SCHOOL_OBJS=glschool.o glschool_alg.o glschool_gl.o sphere.o tube.o normals.o
+glschool: $(SCHOOL_OBJS) $(HACK_OBJS)
+ $(CC_HACK) -o $@ $(SCHOOL_OBJS) $(HACK_OBJS) $(HACK_LIBS)
glcells: glcells.o $(HACK_OBJS)
$(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
@@ -922,9 +919,13 @@ TENTACLE_OBJS=normals.o $(PNG) $(HACK_TRACK_OBJS)
skytentacles: skytentacles.o $(TENTACLE_OBJS)
$(CC_HACK) -o $@ $@.o $(TENTACLE_OBJS) $(PNG_LIBS)
-SONAR_OBJS=sonar-sim.o sonar-icmp.o $(HACK_TRACK_OBJS)
+SONAR_OBJS = sonar-sim.o sonar-icmp.o $(UTILS_BIN)/async_netdb.o \
+ $(THREAD_OBJS) $(UTILS_BIN)/aligned_malloc.o \
+ $(HACK_TRACK_OBJS)
+sonar-icmp.o: sonar-icmp.c
+ $(CC) -c $(HACK_CFLAGS_BASE) $(THREAD_CFLAGS) $<
sonar: sonar.o $(SONAR_OBJS)
- $(CC_HACK) -o $@ $@.o $(SONAR_OBJS) $(HACK_LIBS) $(LIBCAP_LIBS)
+ $(CC_HACK) -o $@ $@.o $(THREAD_CFLAGS) $(SONAR_OBJS) $(LIBCAP_LIBS) $(THREAD_LIBS) $(HACK_LIBS)
JIGSAW_OBJS=normals.o $(UTILS_BIN)/spline.o $(HACK_TRACK_GRAB_OBJS)
jigsaw: jigsaw.o $(JIGSAW_OBJS)
@@ -941,15 +942,15 @@ HILB_OBJS=sphere.o tube.o $(HACK_TRACK_OBJS)
hilbert: hilbert.o $(HILB_OBJS)
$(CC_HACK) -o $@ $@.o $(HILB_OBJS) $(HACK_LIBS)
-CCUBE_OBJS=companion.o companion_quad.o companion_disc.o companion_heart.o \
- gllist.o $(HACK_TRACK_OBJS)
-companioncube: $(CCUBE_OBJS)
- $(CC_HACK) -o $@ $(CCUBE_OBJS) $(HACK_LIBS)
+CCUBE1=companion.o companion_quad.o companion_disc.o companion_heart.o
+CCUBE2=gllist.o $(HACK_TRACK_OBJS)
+companioncube: $(CCUBE1) $(CCUBE2)
+ $(CC_HACK) -o $@ $(CCUBE1) $(CCUBE2) $(HACK_LIBS)
-TBIT_OBJS=tronbit.o tronbit_idle1.o tronbit_idle2.o tronbit_no.o tronbit_yes.o\
- gllist.o $(HACK_TRACK_OBJS)
-tronbit: $(TBIT_OBJS)
- $(CC_HACK) -o $@ $(TBIT_OBJS) $(HACK_LIBS)
+TBIT1=tronbit.o tronbit_idle1.o tronbit_idle2.o tronbit_no.o tronbit_yes.o
+TBIT2=gllist.o $(HACK_TRACK_OBJS)
+tronbit: $(TBIT1) $(TBIT2)
+ $(CC_HACK) -o $@ $(TBIT1) $(TBIT2) $(HACK_LIBS)
KALEIDOCYCLE_OBJS=kaleidocycle.o normals.o $(HACK_TRACK_OBJS)
kaleidocycle: $(KALEIDOCYCLE_OBJS)
@@ -1041,6 +1042,19 @@ deepstars: deepstars.o $(HACK_TRACK_OBJS)
gibson: gibson.o $(PNG) $(HACK_TRACK_OBJS)
$(CC_HACK) -o $@ $@.o $(PNG) $(HACK_TRACK_OBJS) $(PNG_LIBS)
+covid19: covid19.o $(DB_OBJS)
+ $(CC_HACK) -o $@ $@.o $(DB_OBJS) $(HACK_LIBS)
+
+HEADROOM_OBJS=gllist.o headroom_model.o normals.o $(HACK_TRACK_OBJS)
+headroom: headroom.o $(HEADROOM_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HEADROOM_OBJS) $(HACK_LIBS)
+
+headroom_dxf::
+ ./dxf2gl.pl --layers headroom.dxf headroom_model.c
+
+beats: beats.o sphere.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o sphere.o $(HACK_OBJS) $(HACK_LIBS)
+
##############################################################################
#
# DO NOT DELETE: updated by make distdepend
@@ -1059,6 +1073,7 @@ antinspect.o: $(UTILS_SRC)/hsv.h
antinspect.o: $(UTILS_SRC)/resources.h
antinspect.o: $(UTILS_SRC)/usleep.h
antinspect.o: $(UTILS_SRC)/visual.h
+antinspect.o: $(UTILS_SRC)/xft.h
antinspect.o: $(UTILS_SRC)/yarandom.h
antinspect.o: $(HACK_SRC)/xlockmoreI.h
antinspect.o: $(HACK_SRC)/xlockmore.h
@@ -1079,6 +1094,7 @@ antmaze.o: $(UTILS_SRC)/hsv.h
antmaze.o: $(UTILS_SRC)/resources.h
antmaze.o: $(UTILS_SRC)/usleep.h
antmaze.o: $(UTILS_SRC)/visual.h
+antmaze.o: $(UTILS_SRC)/xft.h
antmaze.o: $(UTILS_SRC)/yarandom.h
antmaze.o: $(HACK_SRC)/xlockmoreI.h
antmaze.o: $(HACK_SRC)/xlockmore.h
@@ -1100,6 +1116,7 @@ antspotlight.o: $(UTILS_SRC)/hsv.h
antspotlight.o: $(UTILS_SRC)/resources.h
antspotlight.o: $(UTILS_SRC)/usleep.h
antspotlight.o: $(UTILS_SRC)/visual.h
+antspotlight.o: $(UTILS_SRC)/xft.h
antspotlight.o: $(UTILS_SRC)/yarandom.h
antspotlight.o: $(HACK_SRC)/xlockmoreI.h
antspotlight.o: $(HACK_SRC)/xlockmore.h
@@ -1117,6 +1134,7 @@ atlantis.o: $(UTILS_SRC)/hsv.h
atlantis.o: $(UTILS_SRC)/resources.h
atlantis.o: $(UTILS_SRC)/usleep.h
atlantis.o: $(UTILS_SRC)/visual.h
+atlantis.o: $(UTILS_SRC)/xft.h
atlantis.o: $(UTILS_SRC)/yarandom.h
atlantis.o: $(HACK_SRC)/ximage-loader.h
atlantis.o: $(HACK_SRC)/xlockmoreI.h
@@ -1140,6 +1158,7 @@ atunnel.o: $(UTILS_SRC)/hsv.h
atunnel.o: $(UTILS_SRC)/resources.h
atunnel.o: $(UTILS_SRC)/usleep.h
atunnel.o: $(UTILS_SRC)/visual.h
+atunnel.o: $(UTILS_SRC)/xft.h
atunnel.o: $(UTILS_SRC)/yarandom.h
atunnel.o: $(HACK_SRC)/ximage-loader.h
atunnel.o: $(HACK_SRC)/xlockmoreI.h
@@ -1150,15 +1169,31 @@ b_draw.o: $(HACK_SRC)/fps.h
b_draw.o: $(HACK_SRC)/recanim.h
b_draw.o: $(HACK_SRC)/screenhackI.h
b_draw.o: $(UTILS_SRC)/colors.h
-b_draw.o: $(UTILS_SRC)/erase.h
b_draw.o: $(UTILS_SRC)/font-retry.h
b_draw.o: $(UTILS_SRC)/grabscreen.h
b_draw.o: $(UTILS_SRC)/hsv.h
b_draw.o: $(UTILS_SRC)/resources.h
b_draw.o: $(UTILS_SRC)/usleep.h
b_draw.o: $(UTILS_SRC)/visual.h
+b_draw.o: $(UTILS_SRC)/xft.h
b_draw.o: $(UTILS_SRC)/yarandom.h
-b_draw.o: $(HACK_SRC)/xlockmoreI.h
+beats.o: ../../config.h
+beats.o: $(HACK_SRC)/fps.h
+beats.o: $(HACK_SRC)/recanim.h
+beats.o: $(HACK_SRC)/screenhackI.h
+beats.o: $(srcdir)/sphere.h
+beats.o: $(UTILS_SRC)/colors.h
+beats.o: $(UTILS_SRC)/erase.h
+beats.o: $(UTILS_SRC)/font-retry.h
+beats.o: $(UTILS_SRC)/grabscreen.h
+beats.o: $(UTILS_SRC)/hsv.h
+beats.o: $(UTILS_SRC)/resources.h
+beats.o: $(UTILS_SRC)/usleep.h
+beats.o: $(UTILS_SRC)/visual.h
+beats.o: $(UTILS_SRC)/xft.h
+beats.o: $(UTILS_SRC)/yarandom.h
+beats.o: $(HACK_SRC)/xlockmoreI.h
+beats.o: $(HACK_SRC)/xlockmore.h
blinkbox.o: ../../config.h
blinkbox.o: $(HACK_SRC)/fps.h
blinkbox.o: $(HACK_SRC)/recanim.h
@@ -1172,6 +1207,7 @@ blinkbox.o: $(UTILS_SRC)/hsv.h
blinkbox.o: $(UTILS_SRC)/resources.h
blinkbox.o: $(UTILS_SRC)/usleep.h
blinkbox.o: $(UTILS_SRC)/visual.h
+blinkbox.o: $(UTILS_SRC)/xft.h
blinkbox.o: $(UTILS_SRC)/yarandom.h
blinkbox.o: $(HACK_SRC)/xlockmoreI.h
blinkbox.o: $(HACK_SRC)/xlockmore.h
@@ -1188,6 +1224,7 @@ b_lockglue.o: $(UTILS_SRC)/hsv.h
b_lockglue.o: $(UTILS_SRC)/resources.h
b_lockglue.o: $(UTILS_SRC)/usleep.h
b_lockglue.o: $(UTILS_SRC)/visual.h
+b_lockglue.o: $(UTILS_SRC)/xft.h
b_lockglue.o: $(UTILS_SRC)/yarandom.h
b_lockglue.o: $(HACK_SRC)/xlockmoreI.h
b_lockglue.o: $(HACK_SRC)/xlockmore.h
@@ -1204,6 +1241,7 @@ blocktube.o: $(UTILS_SRC)/hsv.h
blocktube.o: $(UTILS_SRC)/resources.h
blocktube.o: $(UTILS_SRC)/usleep.h
blocktube.o: $(UTILS_SRC)/visual.h
+blocktube.o: $(UTILS_SRC)/xft.h
blocktube.o: $(UTILS_SRC)/yarandom.h
blocktube.o: $(HACK_SRC)/ximage-loader.h
blocktube.o: $(HACK_SRC)/xlockmoreI.h
@@ -1221,6 +1259,7 @@ boing.o: $(UTILS_SRC)/hsv.h
boing.o: $(UTILS_SRC)/resources.h
boing.o: $(UTILS_SRC)/usleep.h
boing.o: $(UTILS_SRC)/visual.h
+boing.o: $(UTILS_SRC)/xft.h
boing.o: $(UTILS_SRC)/yarandom.h
boing.o: $(HACK_SRC)/xlockmoreI.h
boing.o: $(HACK_SRC)/xlockmore.h
@@ -1239,6 +1278,7 @@ bouncingcow.o: $(UTILS_SRC)/hsv.h
bouncingcow.o: $(UTILS_SRC)/resources.h
bouncingcow.o: $(UTILS_SRC)/usleep.h
bouncingcow.o: $(UTILS_SRC)/visual.h
+bouncingcow.o: $(UTILS_SRC)/xft.h
bouncingcow.o: $(UTILS_SRC)/yarandom.h
bouncingcow.o: $(HACK_SRC)/ximage-loader.h
bouncingcow.o: $(HACK_SRC)/xlockmoreI.h
@@ -1256,6 +1296,7 @@ boxed.o: $(UTILS_SRC)/hsv.h
boxed.o: $(UTILS_SRC)/resources.h
boxed.o: $(UTILS_SRC)/usleep.h
boxed.o: $(UTILS_SRC)/visual.h
+boxed.o: $(UTILS_SRC)/xft.h
boxed.o: $(UTILS_SRC)/yarandom.h
boxed.o: $(HACK_SRC)/xlockmoreI.h
boxed.o: $(HACK_SRC)/xlockmore.h
@@ -1265,32 +1306,42 @@ b_sphere.o: $(HACK_SRC)/fps.h
b_sphere.o: $(HACK_SRC)/recanim.h
b_sphere.o: $(HACK_SRC)/screenhackI.h
b_sphere.o: $(UTILS_SRC)/colors.h
-b_sphere.o: $(UTILS_SRC)/erase.h
b_sphere.o: $(UTILS_SRC)/font-retry.h
b_sphere.o: $(UTILS_SRC)/grabscreen.h
b_sphere.o: $(UTILS_SRC)/hsv.h
b_sphere.o: $(UTILS_SRC)/resources.h
b_sphere.o: $(UTILS_SRC)/usleep.h
b_sphere.o: $(UTILS_SRC)/visual.h
+b_sphere.o: $(UTILS_SRC)/xft.h
b_sphere.o: $(UTILS_SRC)/yarandom.h
-b_sphere.o: $(HACK_SRC)/xlockmoreI.h
bubble3d.o: $(srcdir)/bubble3d.h
bubble3d.o: ../../config.h
bubble3d.o: $(HACK_SRC)/fps.h
bubble3d.o: $(HACK_SRC)/recanim.h
bubble3d.o: $(HACK_SRC)/screenhackI.h
bubble3d.o: $(UTILS_SRC)/colors.h
-bubble3d.o: $(UTILS_SRC)/erase.h
bubble3d.o: $(UTILS_SRC)/font-retry.h
bubble3d.o: $(UTILS_SRC)/grabscreen.h
bubble3d.o: $(UTILS_SRC)/hsv.h
bubble3d.o: $(UTILS_SRC)/resources.h
bubble3d.o: $(UTILS_SRC)/usleep.h
bubble3d.o: $(UTILS_SRC)/visual.h
+bubble3d.o: $(UTILS_SRC)/xft.h
bubble3d.o: $(UTILS_SRC)/yarandom.h
-bubble3d.o: $(HACK_SRC)/xlockmoreI.h
buildlwo.o: $(srcdir)/buildlwo.h
buildlwo.o: ../../config.h
+buildlwo.o: $(HACK_SRC)/fps.h
+buildlwo.o: $(HACK_SRC)/recanim.h
+buildlwo.o: $(HACK_SRC)/screenhackI.h
+buildlwo.o: $(UTILS_SRC)/colors.h
+buildlwo.o: $(UTILS_SRC)/font-retry.h
+buildlwo.o: $(UTILS_SRC)/grabscreen.h
+buildlwo.o: $(UTILS_SRC)/hsv.h
+buildlwo.o: $(UTILS_SRC)/resources.h
+buildlwo.o: $(UTILS_SRC)/usleep.h
+buildlwo.o: $(UTILS_SRC)/visual.h
+buildlwo.o: $(UTILS_SRC)/xft.h
+buildlwo.o: $(UTILS_SRC)/yarandom.h
cage.o: ../../config.h
cage.o: $(HACK_SRC)/fps.h
cage.o: ../images/gen/wood_png.h
@@ -1304,6 +1355,7 @@ cage.o: $(UTILS_SRC)/hsv.h
cage.o: $(UTILS_SRC)/resources.h
cage.o: $(UTILS_SRC)/usleep.h
cage.o: $(UTILS_SRC)/visual.h
+cage.o: $(UTILS_SRC)/xft.h
cage.o: $(UTILS_SRC)/yarandom.h
cage.o: $(HACK_SRC)/ximage-loader.h
cage.o: $(HACK_SRC)/xlockmoreI.h
@@ -1324,11 +1376,24 @@ carousel.o: $(UTILS_SRC)/hsv.h
carousel.o: $(UTILS_SRC)/resources.h
carousel.o: $(UTILS_SRC)/usleep.h
carousel.o: $(UTILS_SRC)/visual.h
+carousel.o: $(UTILS_SRC)/xft.h
carousel.o: $(UTILS_SRC)/yarandom.h
carousel.o: $(HACK_SRC)/xlockmoreI.h
carousel.o: $(HACK_SRC)/xlockmore.h
chessmodels.o: $(srcdir)/chessmodels.h
chessmodels.o: ../../config.h
+chessmodels.o: $(HACK_SRC)/fps.h
+chessmodels.o: $(HACK_SRC)/recanim.h
+chessmodels.o: $(HACK_SRC)/screenhackI.h
+chessmodels.o: $(UTILS_SRC)/colors.h
+chessmodels.o: $(UTILS_SRC)/font-retry.h
+chessmodels.o: $(UTILS_SRC)/grabscreen.h
+chessmodels.o: $(UTILS_SRC)/hsv.h
+chessmodels.o: $(UTILS_SRC)/resources.h
+chessmodels.o: $(UTILS_SRC)/usleep.h
+chessmodels.o: $(UTILS_SRC)/visual.h
+chessmodels.o: $(UTILS_SRC)/xft.h
+chessmodels.o: $(UTILS_SRC)/yarandom.h
circuit.o: ../../config.h
circuit.o: $(HACK_SRC)/fps.h
circuit.o: $(HACK_SRC)/recanim.h
@@ -1342,6 +1407,7 @@ circuit.o: $(UTILS_SRC)/hsv.h
circuit.o: $(UTILS_SRC)/resources.h
circuit.o: $(UTILS_SRC)/usleep.h
circuit.o: $(UTILS_SRC)/visual.h
+circuit.o: $(UTILS_SRC)/xft.h
circuit.o: $(UTILS_SRC)/yarandom.h
circuit.o: $(HACK_SRC)/xlockmoreI.h
circuit.o: $(HACK_SRC)/xlockmore.h
@@ -1358,13 +1424,62 @@ cityflow.o: $(UTILS_SRC)/hsv.h
cityflow.o: $(UTILS_SRC)/resources.h
cityflow.o: $(UTILS_SRC)/usleep.h
cityflow.o: $(UTILS_SRC)/visual.h
+cityflow.o: $(UTILS_SRC)/xft.h
cityflow.o: $(UTILS_SRC)/yarandom.h
cityflow.o: $(HACK_SRC)/xlockmoreI.h
cityflow.o: $(HACK_SRC)/xlockmore.h
+co____9.o: ../../config.h
+co____9.o: $(HACK_SRC)/fps.h
+co____9.o: $(srcdir)/gltrackball.h
+co____9.o: $(HACK_SRC)/recanim.h
+co____9.o: $(srcdir)/rotator.h
+co____9.o: $(HACK_SRC)/screenhackI.h
+co____9.o: $(srcdir)/sphere.h
+co____9.o: $(srcdir)/tube.h
+co____9.o: $(UTILS_SRC)/colors.h
+co____9.o: $(UTILS_SRC)/erase.h
+co____9.o: $(UTILS_SRC)/font-retry.h
+co____9.o: $(UTILS_SRC)/grabscreen.h
+co____9.o: $(UTILS_SRC)/hsv.h
+co____9.o: $(UTILS_SRC)/resources.h
+co____9.o: $(UTILS_SRC)/usleep.h
+co____9.o: $(UTILS_SRC)/visual.h
+co____9.o: $(UTILS_SRC)/xft.h
+co____9.o: $(UTILS_SRC)/yarandom.h
+co____9.o: $(HACK_SRC)/xlockmoreI.h
+co____9.o: $(HACK_SRC)/xlockmore.h
companion_disc.o: ../../config.h
+companion_disc.o: $(HACK_SRC)/fps.h
companion_disc.o: $(srcdir)/gllist.h
+companion_disc.o: $(HACK_SRC)/recanim.h
+companion_disc.o: $(HACK_SRC)/screenhackI.h
+companion_disc.o: $(UTILS_SRC)/colors.h
+companion_disc.o: $(UTILS_SRC)/erase.h
+companion_disc.o: $(UTILS_SRC)/font-retry.h
+companion_disc.o: $(UTILS_SRC)/grabscreen.h
+companion_disc.o: $(UTILS_SRC)/hsv.h
+companion_disc.o: $(UTILS_SRC)/resources.h
+companion_disc.o: $(UTILS_SRC)/usleep.h
+companion_disc.o: $(UTILS_SRC)/visual.h
+companion_disc.o: $(UTILS_SRC)/xft.h
+companion_disc.o: $(UTILS_SRC)/yarandom.h
+companion_disc.o: $(HACK_SRC)/xlockmoreI.h
companion_heart.o: ../../config.h
+companion_heart.o: $(HACK_SRC)/fps.h
companion_heart.o: $(srcdir)/gllist.h
+companion_heart.o: $(HACK_SRC)/recanim.h
+companion_heart.o: $(HACK_SRC)/screenhackI.h
+companion_heart.o: $(UTILS_SRC)/colors.h
+companion_heart.o: $(UTILS_SRC)/erase.h
+companion_heart.o: $(UTILS_SRC)/font-retry.h
+companion_heart.o: $(UTILS_SRC)/grabscreen.h
+companion_heart.o: $(UTILS_SRC)/hsv.h
+companion_heart.o: $(UTILS_SRC)/resources.h
+companion_heart.o: $(UTILS_SRC)/usleep.h
+companion_heart.o: $(UTILS_SRC)/visual.h
+companion_heart.o: $(UTILS_SRC)/xft.h
+companion_heart.o: $(UTILS_SRC)/yarandom.h
+companion_heart.o: $(HACK_SRC)/xlockmoreI.h
companion.o: ../../config.h
companion.o: $(HACK_SRC)/fps.h
companion.o: $(srcdir)/gllist.h
@@ -1380,24 +1495,143 @@ companion.o: $(UTILS_SRC)/hsv.h
companion.o: $(UTILS_SRC)/resources.h
companion.o: $(UTILS_SRC)/usleep.h
companion.o: $(UTILS_SRC)/visual.h
+companion.o: $(UTILS_SRC)/xft.h
companion.o: $(UTILS_SRC)/yarandom.h
companion.o: $(HACK_SRC)/ximage-loader.h
companion.o: $(HACK_SRC)/xlockmoreI.h
companion.o: $(HACK_SRC)/xlockmore.h
companion_quad.o: ../../config.h
+companion_quad.o: $(HACK_SRC)/fps.h
companion_quad.o: $(srcdir)/gllist.h
+companion_quad.o: $(HACK_SRC)/recanim.h
+companion_quad.o: $(HACK_SRC)/screenhackI.h
+companion_quad.o: $(UTILS_SRC)/colors.h
+companion_quad.o: $(UTILS_SRC)/erase.h
+companion_quad.o: $(UTILS_SRC)/font-retry.h
+companion_quad.o: $(UTILS_SRC)/grabscreen.h
+companion_quad.o: $(UTILS_SRC)/hsv.h
+companion_quad.o: $(UTILS_SRC)/resources.h
+companion_quad.o: $(UTILS_SRC)/usleep.h
+companion_quad.o: $(UTILS_SRC)/visual.h
+companion_quad.o: $(UTILS_SRC)/xft.h
+companion_quad.o: $(UTILS_SRC)/yarandom.h
+companion_quad.o: $(HACK_SRC)/xlockmoreI.h
+covid19.o: ../../config.h
+covid19.o: $(HACK_SRC)/fps.h
+covid19.o: $(srcdir)/gltrackball.h
+covid19.o: $(HACK_SRC)/recanim.h
+covid19.o: $(srcdir)/rotator.h
+covid19.o: $(HACK_SRC)/screenhackI.h
+covid19.o: $(srcdir)/sphere.h
+covid19.o: $(srcdir)/tube.h
+covid19.o: $(UTILS_SRC)/colors.h
+covid19.o: $(UTILS_SRC)/erase.h
+covid19.o: $(UTILS_SRC)/font-retry.h
+covid19.o: $(UTILS_SRC)/grabscreen.h
+covid19.o: $(UTILS_SRC)/hsv.h
+covid19.o: $(UTILS_SRC)/resources.h
+covid19.o: $(UTILS_SRC)/usleep.h
+covid19.o: $(UTILS_SRC)/visual.h
+covid19.o: $(UTILS_SRC)/xft.h
+covid19.o: $(UTILS_SRC)/yarandom.h
+covid19.o: $(HACK_SRC)/xlockmoreI.h
+covid19.o: $(HACK_SRC)/xlockmore.h
cow_face.o: ../../config.h
+cow_face.o: $(HACK_SRC)/fps.h
cow_face.o: $(srcdir)/gllist.h
+cow_face.o: $(HACK_SRC)/recanim.h
+cow_face.o: $(HACK_SRC)/screenhackI.h
+cow_face.o: $(UTILS_SRC)/colors.h
+cow_face.o: $(UTILS_SRC)/erase.h
+cow_face.o: $(UTILS_SRC)/font-retry.h
+cow_face.o: $(UTILS_SRC)/grabscreen.h
+cow_face.o: $(UTILS_SRC)/hsv.h
+cow_face.o: $(UTILS_SRC)/resources.h
+cow_face.o: $(UTILS_SRC)/usleep.h
+cow_face.o: $(UTILS_SRC)/visual.h
+cow_face.o: $(UTILS_SRC)/xft.h
+cow_face.o: $(UTILS_SRC)/yarandom.h
+cow_face.o: $(HACK_SRC)/xlockmoreI.h
cow_hide.o: ../../config.h
+cow_hide.o: $(HACK_SRC)/fps.h
cow_hide.o: $(srcdir)/gllist.h
+cow_hide.o: $(HACK_SRC)/recanim.h
+cow_hide.o: $(HACK_SRC)/screenhackI.h
+cow_hide.o: $(UTILS_SRC)/colors.h
+cow_hide.o: $(UTILS_SRC)/erase.h
+cow_hide.o: $(UTILS_SRC)/font-retry.h
+cow_hide.o: $(UTILS_SRC)/grabscreen.h
+cow_hide.o: $(UTILS_SRC)/hsv.h
+cow_hide.o: $(UTILS_SRC)/resources.h
+cow_hide.o: $(UTILS_SRC)/usleep.h
+cow_hide.o: $(UTILS_SRC)/visual.h
+cow_hide.o: $(UTILS_SRC)/xft.h
+cow_hide.o: $(UTILS_SRC)/yarandom.h
+cow_hide.o: $(HACK_SRC)/xlockmoreI.h
cow_hoofs.o: ../../config.h
+cow_hoofs.o: $(HACK_SRC)/fps.h
cow_hoofs.o: $(srcdir)/gllist.h
+cow_hoofs.o: $(HACK_SRC)/recanim.h
+cow_hoofs.o: $(HACK_SRC)/screenhackI.h
+cow_hoofs.o: $(UTILS_SRC)/colors.h
+cow_hoofs.o: $(UTILS_SRC)/erase.h
+cow_hoofs.o: $(UTILS_SRC)/font-retry.h
+cow_hoofs.o: $(UTILS_SRC)/grabscreen.h
+cow_hoofs.o: $(UTILS_SRC)/hsv.h
+cow_hoofs.o: $(UTILS_SRC)/resources.h
+cow_hoofs.o: $(UTILS_SRC)/usleep.h
+cow_hoofs.o: $(UTILS_SRC)/visual.h
+cow_hoofs.o: $(UTILS_SRC)/xft.h
+cow_hoofs.o: $(UTILS_SRC)/yarandom.h
+cow_hoofs.o: $(HACK_SRC)/xlockmoreI.h
cow_horns.o: ../../config.h
+cow_horns.o: $(HACK_SRC)/fps.h
cow_horns.o: $(srcdir)/gllist.h
+cow_horns.o: $(HACK_SRC)/recanim.h
+cow_horns.o: $(HACK_SRC)/screenhackI.h
+cow_horns.o: $(UTILS_SRC)/colors.h
+cow_horns.o: $(UTILS_SRC)/erase.h
+cow_horns.o: $(UTILS_SRC)/font-retry.h
+cow_horns.o: $(UTILS_SRC)/grabscreen.h
+cow_horns.o: $(UTILS_SRC)/hsv.h
+cow_horns.o: $(UTILS_SRC)/resources.h
+cow_horns.o: $(UTILS_SRC)/usleep.h
+cow_horns.o: $(UTILS_SRC)/visual.h
+cow_horns.o: $(UTILS_SRC)/xft.h
+cow_horns.o: $(UTILS_SRC)/yarandom.h
+cow_horns.o: $(HACK_SRC)/xlockmoreI.h
cow_tail.o: ../../config.h
+cow_tail.o: $(HACK_SRC)/fps.h
cow_tail.o: $(srcdir)/gllist.h
+cow_tail.o: $(HACK_SRC)/recanim.h
+cow_tail.o: $(HACK_SRC)/screenhackI.h
+cow_tail.o: $(UTILS_SRC)/colors.h
+cow_tail.o: $(UTILS_SRC)/erase.h
+cow_tail.o: $(UTILS_SRC)/font-retry.h
+cow_tail.o: $(UTILS_SRC)/grabscreen.h
+cow_tail.o: $(UTILS_SRC)/hsv.h
+cow_tail.o: $(UTILS_SRC)/resources.h
+cow_tail.o: $(UTILS_SRC)/usleep.h
+cow_tail.o: $(UTILS_SRC)/visual.h
+cow_tail.o: $(UTILS_SRC)/xft.h
+cow_tail.o: $(UTILS_SRC)/yarandom.h
+cow_tail.o: $(HACK_SRC)/xlockmoreI.h
cow_udder.o: ../../config.h
+cow_udder.o: $(HACK_SRC)/fps.h
cow_udder.o: $(srcdir)/gllist.h
+cow_udder.o: $(HACK_SRC)/recanim.h
+cow_udder.o: $(HACK_SRC)/screenhackI.h
+cow_udder.o: $(UTILS_SRC)/colors.h
+cow_udder.o: $(UTILS_SRC)/erase.h
+cow_udder.o: $(UTILS_SRC)/font-retry.h
+cow_udder.o: $(UTILS_SRC)/grabscreen.h
+cow_udder.o: $(UTILS_SRC)/hsv.h
+cow_udder.o: $(UTILS_SRC)/resources.h
+cow_udder.o: $(UTILS_SRC)/usleep.h
+cow_udder.o: $(UTILS_SRC)/visual.h
+cow_udder.o: $(UTILS_SRC)/xft.h
+cow_udder.o: $(UTILS_SRC)/yarandom.h
+cow_udder.o: $(HACK_SRC)/xlockmoreI.h
crackberg.o: ../../config.h
crackberg.o: $(HACK_SRC)/fps.h
crackberg.o: $(HACK_SRC)/recanim.h
@@ -1410,6 +1644,7 @@ crackberg.o: $(UTILS_SRC)/hsv.h
crackberg.o: $(UTILS_SRC)/resources.h
crackberg.o: $(UTILS_SRC)/usleep.h
crackberg.o: $(UTILS_SRC)/visual.h
+crackberg.o: $(UTILS_SRC)/xft.h
crackberg.o: $(UTILS_SRC)/yarandom.h
crackberg.o: $(HACK_SRC)/xlockmoreI.h
crackberg.o: $(HACK_SRC)/xlockmore.h
@@ -1428,6 +1663,7 @@ crumbler.o: $(UTILS_SRC)/hsv.h
crumbler.o: $(UTILS_SRC)/resources.h
crumbler.o: $(UTILS_SRC)/usleep.h
crumbler.o: $(UTILS_SRC)/visual.h
+crumbler.o: $(UTILS_SRC)/xft.h
crumbler.o: $(UTILS_SRC)/yarandom.h
crumbler.o: $(HACK_SRC)/xlockmoreI.h
crumbler.o: $(HACK_SRC)/xlockmore.h
@@ -1444,6 +1680,7 @@ cube21.o: $(UTILS_SRC)/hsv.h
cube21.o: $(UTILS_SRC)/resources.h
cube21.o: $(UTILS_SRC)/usleep.h
cube21.o: $(UTILS_SRC)/visual.h
+cube21.o: $(UTILS_SRC)/xft.h
cube21.o: $(UTILS_SRC)/yarandom.h
cube21.o: $(HACK_SRC)/xlockmoreI.h
cube21.o: $(HACK_SRC)/xlockmore.h
@@ -1461,6 +1698,7 @@ cubenetic.o: $(UTILS_SRC)/hsv.h
cubenetic.o: $(UTILS_SRC)/resources.h
cubenetic.o: $(UTILS_SRC)/usleep.h
cubenetic.o: $(UTILS_SRC)/visual.h
+cubenetic.o: $(UTILS_SRC)/xft.h
cubenetic.o: $(UTILS_SRC)/yarandom.h
cubenetic.o: $(HACK_SRC)/xlockmoreI.h
cubenetic.o: $(HACK_SRC)/xlockmore.h
@@ -1478,6 +1716,7 @@ cubestack.o: $(UTILS_SRC)/hsv.h
cubestack.o: $(UTILS_SRC)/resources.h
cubestack.o: $(UTILS_SRC)/usleep.h
cubestack.o: $(UTILS_SRC)/visual.h
+cubestack.o: $(UTILS_SRC)/xft.h
cubestack.o: $(UTILS_SRC)/yarandom.h
cubestack.o: $(HACK_SRC)/xlockmoreI.h
cubestack.o: $(HACK_SRC)/xlockmore.h
@@ -1495,6 +1734,7 @@ cubestorm.o: $(UTILS_SRC)/hsv.h
cubestorm.o: $(UTILS_SRC)/resources.h
cubestorm.o: $(UTILS_SRC)/usleep.h
cubestorm.o: $(UTILS_SRC)/visual.h
+cubestorm.o: $(UTILS_SRC)/xft.h
cubestorm.o: $(UTILS_SRC)/yarandom.h
cubestorm.o: $(HACK_SRC)/xlockmoreI.h
cubestorm.o: $(HACK_SRC)/xlockmore.h
@@ -1513,6 +1753,7 @@ cubetwist.o: $(UTILS_SRC)/hsv.h
cubetwist.o: $(UTILS_SRC)/resources.h
cubetwist.o: $(UTILS_SRC)/usleep.h
cubetwist.o: $(UTILS_SRC)/visual.h
+cubetwist.o: $(UTILS_SRC)/xft.h
cubetwist.o: $(UTILS_SRC)/yarandom.h
cubetwist.o: $(HACK_SRC)/xlockmoreI.h
cubetwist.o: $(HACK_SRC)/xlockmore.h
@@ -1530,6 +1771,7 @@ cubicgrid.o: $(UTILS_SRC)/hsv.h
cubicgrid.o: $(UTILS_SRC)/resources.h
cubicgrid.o: $(UTILS_SRC)/usleep.h
cubicgrid.o: $(UTILS_SRC)/visual.h
+cubicgrid.o: $(UTILS_SRC)/xft.h
cubicgrid.o: $(UTILS_SRC)/yarandom.h
cubicgrid.o: $(HACK_SRC)/xlockmoreI.h
cubicgrid.o: $(HACK_SRC)/xlockmore.h
@@ -1549,6 +1791,7 @@ dangerball.o: $(UTILS_SRC)/hsv.h
dangerball.o: $(UTILS_SRC)/resources.h
dangerball.o: $(UTILS_SRC)/usleep.h
dangerball.o: $(UTILS_SRC)/visual.h
+dangerball.o: $(UTILS_SRC)/xft.h
dangerball.o: $(UTILS_SRC)/yarandom.h
dangerball.o: $(HACK_SRC)/xlockmoreI.h
dangerball.o: $(HACK_SRC)/xlockmore.h
@@ -1566,6 +1809,7 @@ deepstars.o: $(UTILS_SRC)/hsv.h
deepstars.o: $(UTILS_SRC)/resources.h
deepstars.o: $(UTILS_SRC)/usleep.h
deepstars.o: $(UTILS_SRC)/visual.h
+deepstars.o: $(UTILS_SRC)/xft.h
deepstars.o: $(UTILS_SRC)/yarandom.h
deepstars.o: $(HACK_SRC)/xlockmoreI.h
deepstars.o: $(HACK_SRC)/xlockmore.h
@@ -1584,6 +1828,7 @@ discoball.o: $(UTILS_SRC)/hsv.h
discoball.o: $(UTILS_SRC)/resources.h
discoball.o: $(UTILS_SRC)/usleep.h
discoball.o: $(UTILS_SRC)/visual.h
+discoball.o: $(UTILS_SRC)/xft.h
discoball.o: $(UTILS_SRC)/yarandom.h
discoball.o: $(HACK_SRC)/xlockmoreI.h
discoball.o: $(HACK_SRC)/xlockmore.h
@@ -1606,6 +1851,7 @@ dnalogo.o: $(UTILS_SRC)/resources.h
dnalogo.o: $(UTILS_SRC)/usleep.h
dnalogo.o: $(UTILS_SRC)/utf8wc.h
dnalogo.o: $(UTILS_SRC)/visual.h
+dnalogo.o: $(UTILS_SRC)/xft.h
dnalogo.o: $(UTILS_SRC)/yarandom.h
dnalogo.o: $(HACK_SRC)/xlockmoreI.h
dnalogo.o: $(HACK_SRC)/xlockmore.h
@@ -1615,28 +1861,30 @@ dolphin.o: $(HACK_SRC)/fps.h
dolphin.o: $(HACK_SRC)/recanim.h
dolphin.o: $(HACK_SRC)/screenhackI.h
dolphin.o: $(UTILS_SRC)/colors.h
+dolphin.o: $(UTILS_SRC)/erase.h
dolphin.o: $(UTILS_SRC)/font-retry.h
dolphin.o: $(UTILS_SRC)/grabscreen.h
dolphin.o: $(UTILS_SRC)/hsv.h
dolphin.o: $(UTILS_SRC)/resources.h
dolphin.o: $(UTILS_SRC)/usleep.h
dolphin.o: $(UTILS_SRC)/visual.h
+dolphin.o: $(UTILS_SRC)/xft.h
dolphin.o: $(UTILS_SRC)/yarandom.h
+dolphin.o: $(HACK_SRC)/xlockmoreI.h
dropshadow.o: ../../config.h
dropshadow.o: $(srcdir)/dropshadow.h
dropshadow.o: $(HACK_SRC)/fps.h
dropshadow.o: $(HACK_SRC)/recanim.h
dropshadow.o: $(HACK_SRC)/screenhackI.h
dropshadow.o: $(UTILS_SRC)/colors.h
-dropshadow.o: $(UTILS_SRC)/erase.h
dropshadow.o: $(UTILS_SRC)/font-retry.h
dropshadow.o: $(UTILS_SRC)/grabscreen.h
dropshadow.o: $(UTILS_SRC)/hsv.h
dropshadow.o: $(UTILS_SRC)/resources.h
dropshadow.o: $(UTILS_SRC)/usleep.h
dropshadow.o: $(UTILS_SRC)/visual.h
+dropshadow.o: $(UTILS_SRC)/xft.h
dropshadow.o: $(UTILS_SRC)/yarandom.h
-dropshadow.o: $(HACK_SRC)/xlockmoreI.h
dymaxionmap-coords.o: ../../config.h
dymaxionmap-coords.o: $(srcdir)/dymaxionmap-coords.h
dymaxionmap.o: ../../config.h
@@ -1661,6 +1909,7 @@ dymaxionmap.o: $(UTILS_SRC)/hsv.h
dymaxionmap.o: $(UTILS_SRC)/resources.h
dymaxionmap.o: $(UTILS_SRC)/usleep.h
dymaxionmap.o: $(UTILS_SRC)/visual.h
+dymaxionmap.o: $(UTILS_SRC)/xft.h
dymaxionmap.o: $(UTILS_SRC)/yarandom.h
dymaxionmap.o: $(HACK_SRC)/ximage-loader.h
dymaxionmap.o: $(HACK_SRC)/xlockmoreI.h
@@ -1680,6 +1929,7 @@ endgame.o: $(UTILS_SRC)/hsv.h
endgame.o: $(UTILS_SRC)/resources.h
endgame.o: $(UTILS_SRC)/usleep.h
endgame.o: $(UTILS_SRC)/visual.h
+endgame.o: $(UTILS_SRC)/xft.h
endgame.o: $(UTILS_SRC)/yarandom.h
endgame.o: $(HACK_SRC)/xlockmoreI.h
endgame.o: $(HACK_SRC)/xlockmore.h
@@ -1697,6 +1947,7 @@ energystream.o: $(UTILS_SRC)/hsv.h
energystream.o: $(UTILS_SRC)/resources.h
energystream.o: $(UTILS_SRC)/usleep.h
energystream.o: $(UTILS_SRC)/visual.h
+energystream.o: $(UTILS_SRC)/xft.h
energystream.o: $(UTILS_SRC)/yarandom.h
energystream.o: $(HACK_SRC)/xlockmoreI.h
energystream.o: $(HACK_SRC)/xlockmore.h
@@ -1715,6 +1966,7 @@ engine.o: $(UTILS_SRC)/hsv.h
engine.o: $(UTILS_SRC)/resources.h
engine.o: $(UTILS_SRC)/usleep.h
engine.o: $(UTILS_SRC)/visual.h
+engine.o: $(UTILS_SRC)/xft.h
engine.o: $(UTILS_SRC)/yarandom.h
engine.o: $(HACK_SRC)/xlockmoreI.h
engine.o: $(HACK_SRC)/xlockmore.h
@@ -1735,6 +1987,7 @@ esper.o: $(UTILS_SRC)/hsv.h
esper.o: $(UTILS_SRC)/resources.h
esper.o: $(UTILS_SRC)/usleep.h
esper.o: $(UTILS_SRC)/visual.h
+esper.o: $(UTILS_SRC)/xft.h
esper.o: $(UTILS_SRC)/xshm.h
esper.o: $(UTILS_SRC)/yarandom.h
esper.o: $(HACK_SRC)/xlockmoreI.h
@@ -1742,6 +1995,7 @@ esper.o: $(HACK_SRC)/xlockmore.h
etruscanvenus.o: ../../config.h
etruscanvenus.o: $(srcdir)/curlicue.h
etruscanvenus.o: $(HACK_SRC)/fps.h
+etruscanvenus.o: $(srcdir)/glsl-utils.h
etruscanvenus.o: $(srcdir)/gltrackball.h
etruscanvenus.o: $(HACK_SRC)/recanim.h
etruscanvenus.o: $(HACK_SRC)/screenhackI.h
@@ -1753,17 +2007,74 @@ etruscanvenus.o: $(UTILS_SRC)/hsv.h
etruscanvenus.o: $(UTILS_SRC)/resources.h
etruscanvenus.o: $(UTILS_SRC)/usleep.h
etruscanvenus.o: $(UTILS_SRC)/visual.h
+etruscanvenus.o: $(UTILS_SRC)/xft.h
etruscanvenus.o: $(UTILS_SRC)/yarandom.h
etruscanvenus.o: $(HACK_SRC)/xlockmoreI.h
etruscanvenus.o: $(HACK_SRC)/xlockmore.h
extrusion-helix2.o: ../../config.h
extrusion-helix2.o: $(srcdir)/extrusion.h
+extrusion-helix2.o: $(HACK_SRC)/fps.h
+extrusion-helix2.o: $(HACK_SRC)/recanim.h
+extrusion-helix2.o: $(HACK_SRC)/screenhackI.h
+extrusion-helix2.o: $(UTILS_SRC)/colors.h
+extrusion-helix2.o: $(UTILS_SRC)/erase.h
+extrusion-helix2.o: $(UTILS_SRC)/font-retry.h
+extrusion-helix2.o: $(UTILS_SRC)/grabscreen.h
+extrusion-helix2.o: $(UTILS_SRC)/hsv.h
+extrusion-helix2.o: $(UTILS_SRC)/resources.h
+extrusion-helix2.o: $(UTILS_SRC)/usleep.h
+extrusion-helix2.o: $(UTILS_SRC)/visual.h
+extrusion-helix2.o: $(UTILS_SRC)/xft.h
+extrusion-helix2.o: $(UTILS_SRC)/yarandom.h
+extrusion-helix2.o: $(HACK_SRC)/xlockmoreI.h
extrusion-helix3.o: ../../config.h
extrusion-helix3.o: $(srcdir)/extrusion.h
+extrusion-helix3.o: $(HACK_SRC)/fps.h
+extrusion-helix3.o: $(HACK_SRC)/recanim.h
+extrusion-helix3.o: $(HACK_SRC)/screenhackI.h
+extrusion-helix3.o: $(UTILS_SRC)/colors.h
+extrusion-helix3.o: $(UTILS_SRC)/erase.h
+extrusion-helix3.o: $(UTILS_SRC)/font-retry.h
+extrusion-helix3.o: $(UTILS_SRC)/grabscreen.h
+extrusion-helix3.o: $(UTILS_SRC)/hsv.h
+extrusion-helix3.o: $(UTILS_SRC)/resources.h
+extrusion-helix3.o: $(UTILS_SRC)/usleep.h
+extrusion-helix3.o: $(UTILS_SRC)/visual.h
+extrusion-helix3.o: $(UTILS_SRC)/xft.h
+extrusion-helix3.o: $(UTILS_SRC)/yarandom.h
+extrusion-helix3.o: $(HACK_SRC)/xlockmoreI.h
extrusion-helix4.o: ../../config.h
extrusion-helix4.o: $(srcdir)/extrusion.h
+extrusion-helix4.o: $(HACK_SRC)/fps.h
+extrusion-helix4.o: $(HACK_SRC)/recanim.h
+extrusion-helix4.o: $(HACK_SRC)/screenhackI.h
+extrusion-helix4.o: $(UTILS_SRC)/colors.h
+extrusion-helix4.o: $(UTILS_SRC)/erase.h
+extrusion-helix4.o: $(UTILS_SRC)/font-retry.h
+extrusion-helix4.o: $(UTILS_SRC)/grabscreen.h
+extrusion-helix4.o: $(UTILS_SRC)/hsv.h
+extrusion-helix4.o: $(UTILS_SRC)/resources.h
+extrusion-helix4.o: $(UTILS_SRC)/usleep.h
+extrusion-helix4.o: $(UTILS_SRC)/visual.h
+extrusion-helix4.o: $(UTILS_SRC)/xft.h
+extrusion-helix4.o: $(UTILS_SRC)/yarandom.h
+extrusion-helix4.o: $(HACK_SRC)/xlockmoreI.h
extrusion-joinoffset.o: ../../config.h
extrusion-joinoffset.o: $(srcdir)/extrusion.h
+extrusion-joinoffset.o: $(HACK_SRC)/fps.h
+extrusion-joinoffset.o: $(HACK_SRC)/recanim.h
+extrusion-joinoffset.o: $(HACK_SRC)/screenhackI.h
+extrusion-joinoffset.o: $(UTILS_SRC)/colors.h
+extrusion-joinoffset.o: $(UTILS_SRC)/erase.h
+extrusion-joinoffset.o: $(UTILS_SRC)/font-retry.h
+extrusion-joinoffset.o: $(UTILS_SRC)/grabscreen.h
+extrusion-joinoffset.o: $(UTILS_SRC)/hsv.h
+extrusion-joinoffset.o: $(UTILS_SRC)/resources.h
+extrusion-joinoffset.o: $(UTILS_SRC)/usleep.h
+extrusion-joinoffset.o: $(UTILS_SRC)/visual.h
+extrusion-joinoffset.o: $(UTILS_SRC)/xft.h
+extrusion-joinoffset.o: $(UTILS_SRC)/yarandom.h
+extrusion-joinoffset.o: $(HACK_SRC)/xlockmoreI.h
extrusion.o: ../../config.h
extrusion.o: $(srcdir)/extrusion.h
extrusion.o: $(HACK_SRC)/fps.h
@@ -1779,16 +2090,59 @@ extrusion.o: $(UTILS_SRC)/hsv.h
extrusion.o: $(UTILS_SRC)/resources.h
extrusion.o: $(UTILS_SRC)/usleep.h
extrusion.o: $(UTILS_SRC)/visual.h
+extrusion.o: $(UTILS_SRC)/xft.h
extrusion.o: $(UTILS_SRC)/yarandom.h
extrusion.o: $(HACK_SRC)/ximage-loader.h
extrusion.o: $(HACK_SRC)/xlockmoreI.h
extrusion.o: $(HACK_SRC)/xlockmore.h
extrusion-screw.o: ../../config.h
extrusion-screw.o: $(srcdir)/extrusion.h
+extrusion-screw.o: $(HACK_SRC)/fps.h
+extrusion-screw.o: $(HACK_SRC)/recanim.h
+extrusion-screw.o: $(HACK_SRC)/screenhackI.h
+extrusion-screw.o: $(UTILS_SRC)/colors.h
+extrusion-screw.o: $(UTILS_SRC)/erase.h
+extrusion-screw.o: $(UTILS_SRC)/font-retry.h
+extrusion-screw.o: $(UTILS_SRC)/grabscreen.h
+extrusion-screw.o: $(UTILS_SRC)/hsv.h
+extrusion-screw.o: $(UTILS_SRC)/resources.h
+extrusion-screw.o: $(UTILS_SRC)/usleep.h
+extrusion-screw.o: $(UTILS_SRC)/visual.h
+extrusion-screw.o: $(UTILS_SRC)/xft.h
+extrusion-screw.o: $(UTILS_SRC)/yarandom.h
+extrusion-screw.o: $(HACK_SRC)/xlockmoreI.h
extrusion-taper.o: ../../config.h
extrusion-taper.o: $(srcdir)/extrusion.h
+extrusion-taper.o: $(HACK_SRC)/fps.h
+extrusion-taper.o: $(HACK_SRC)/recanim.h
+extrusion-taper.o: $(HACK_SRC)/screenhackI.h
+extrusion-taper.o: $(UTILS_SRC)/colors.h
+extrusion-taper.o: $(UTILS_SRC)/erase.h
+extrusion-taper.o: $(UTILS_SRC)/font-retry.h
+extrusion-taper.o: $(UTILS_SRC)/grabscreen.h
+extrusion-taper.o: $(UTILS_SRC)/hsv.h
+extrusion-taper.o: $(UTILS_SRC)/resources.h
+extrusion-taper.o: $(UTILS_SRC)/usleep.h
+extrusion-taper.o: $(UTILS_SRC)/visual.h
+extrusion-taper.o: $(UTILS_SRC)/xft.h
+extrusion-taper.o: $(UTILS_SRC)/yarandom.h
+extrusion-taper.o: $(HACK_SRC)/xlockmoreI.h
extrusion-twistoid.o: ../../config.h
extrusion-twistoid.o: $(srcdir)/extrusion.h
+extrusion-twistoid.o: $(HACK_SRC)/fps.h
+extrusion-twistoid.o: $(HACK_SRC)/recanim.h
+extrusion-twistoid.o: $(HACK_SRC)/screenhackI.h
+extrusion-twistoid.o: $(UTILS_SRC)/colors.h
+extrusion-twistoid.o: $(UTILS_SRC)/erase.h
+extrusion-twistoid.o: $(UTILS_SRC)/font-retry.h
+extrusion-twistoid.o: $(UTILS_SRC)/grabscreen.h
+extrusion-twistoid.o: $(UTILS_SRC)/hsv.h
+extrusion-twistoid.o: $(UTILS_SRC)/resources.h
+extrusion-twistoid.o: $(UTILS_SRC)/usleep.h
+extrusion-twistoid.o: $(UTILS_SRC)/visual.h
+extrusion-twistoid.o: $(UTILS_SRC)/xft.h
+extrusion-twistoid.o: $(UTILS_SRC)/yarandom.h
+extrusion-twistoid.o: $(HACK_SRC)/xlockmoreI.h
flipflop.o: ../../config.h
flipflop.o: $(HACK_SRC)/fps.h
flipflop.o: $(srcdir)/gltrackball.h
@@ -1803,6 +2157,7 @@ flipflop.o: $(UTILS_SRC)/hsv.h
flipflop.o: $(UTILS_SRC)/resources.h
flipflop.o: $(UTILS_SRC)/usleep.h
flipflop.o: $(UTILS_SRC)/visual.h
+flipflop.o: $(UTILS_SRC)/xft.h
flipflop.o: $(UTILS_SRC)/yarandom.h
flipflop.o: $(HACK_SRC)/xlockmoreI.h
flipflop.o: $(HACK_SRC)/xlockmore.h
@@ -1820,6 +2175,7 @@ flipscreen3d.o: $(UTILS_SRC)/hsv.h
flipscreen3d.o: $(UTILS_SRC)/resources.h
flipscreen3d.o: $(UTILS_SRC)/usleep.h
flipscreen3d.o: $(UTILS_SRC)/visual.h
+flipscreen3d.o: $(UTILS_SRC)/xft.h
flipscreen3d.o: $(UTILS_SRC)/yarandom.h
flipscreen3d.o: $(HACK_SRC)/xlockmoreI.h
flipscreen3d.o: $(HACK_SRC)/xlockmore.h
@@ -1837,6 +2193,7 @@ fliptext.o: $(UTILS_SRC)/resources.h
fliptext.o: $(UTILS_SRC)/textclient.h
fliptext.o: $(UTILS_SRC)/usleep.h
fliptext.o: $(UTILS_SRC)/visual.h
+fliptext.o: $(UTILS_SRC)/xft.h
fliptext.o: $(UTILS_SRC)/yarandom.h
fliptext.o: $(HACK_SRC)/xlockmoreI.h
fliptext.o: $(HACK_SRC)/xlockmore.h
@@ -1855,29 +2212,82 @@ flurry.o: $(UTILS_SRC)/hsv.h
flurry.o: $(UTILS_SRC)/resources.h
flurry.o: $(UTILS_SRC)/usleep.h
flurry.o: $(UTILS_SRC)/visual.h
+flurry.o: $(UTILS_SRC)/xft.h
flurry.o: $(UTILS_SRC)/yarandom.h
flurry.o: $(HACK_SRC)/xlockmoreI.h
flurry.o: $(HACK_SRC)/xlockmore.h
flurry-smoke.o: ../../config.h
flurry-smoke.o: $(srcdir)/flurry.h
+flurry-smoke.o: $(HACK_SRC)/fps.h
flurry-smoke.o: $(srcdir)/gltrackball.h
+flurry-smoke.o: $(HACK_SRC)/recanim.h
flurry-smoke.o: $(srcdir)/rotator.h
+flurry-smoke.o: $(HACK_SRC)/screenhackI.h
+flurry-smoke.o: $(UTILS_SRC)/colors.h
+flurry-smoke.o: $(UTILS_SRC)/erase.h
+flurry-smoke.o: $(UTILS_SRC)/font-retry.h
+flurry-smoke.o: $(UTILS_SRC)/grabscreen.h
+flurry-smoke.o: $(UTILS_SRC)/hsv.h
+flurry-smoke.o: $(UTILS_SRC)/resources.h
+flurry-smoke.o: $(UTILS_SRC)/usleep.h
+flurry-smoke.o: $(UTILS_SRC)/visual.h
+flurry-smoke.o: $(UTILS_SRC)/xft.h
flurry-smoke.o: $(UTILS_SRC)/yarandom.h
+flurry-smoke.o: $(HACK_SRC)/xlockmoreI.h
flurry-spark.o: ../../config.h
flurry-spark.o: $(srcdir)/flurry.h
+flurry-spark.o: $(HACK_SRC)/fps.h
flurry-spark.o: $(srcdir)/gltrackball.h
+flurry-spark.o: $(HACK_SRC)/recanim.h
flurry-spark.o: $(srcdir)/rotator.h
+flurry-spark.o: $(HACK_SRC)/screenhackI.h
+flurry-spark.o: $(UTILS_SRC)/colors.h
+flurry-spark.o: $(UTILS_SRC)/erase.h
+flurry-spark.o: $(UTILS_SRC)/font-retry.h
+flurry-spark.o: $(UTILS_SRC)/grabscreen.h
+flurry-spark.o: $(UTILS_SRC)/hsv.h
+flurry-spark.o: $(UTILS_SRC)/resources.h
+flurry-spark.o: $(UTILS_SRC)/usleep.h
+flurry-spark.o: $(UTILS_SRC)/visual.h
+flurry-spark.o: $(UTILS_SRC)/xft.h
flurry-spark.o: $(UTILS_SRC)/yarandom.h
+flurry-spark.o: $(HACK_SRC)/xlockmoreI.h
flurry-star.o: ../../config.h
flurry-star.o: $(srcdir)/flurry.h
+flurry-star.o: $(HACK_SRC)/fps.h
flurry-star.o: $(srcdir)/gltrackball.h
+flurry-star.o: $(HACK_SRC)/recanim.h
flurry-star.o: $(srcdir)/rotator.h
+flurry-star.o: $(HACK_SRC)/screenhackI.h
+flurry-star.o: $(UTILS_SRC)/colors.h
+flurry-star.o: $(UTILS_SRC)/erase.h
+flurry-star.o: $(UTILS_SRC)/font-retry.h
+flurry-star.o: $(UTILS_SRC)/grabscreen.h
+flurry-star.o: $(UTILS_SRC)/hsv.h
+flurry-star.o: $(UTILS_SRC)/resources.h
+flurry-star.o: $(UTILS_SRC)/usleep.h
+flurry-star.o: $(UTILS_SRC)/visual.h
+flurry-star.o: $(UTILS_SRC)/xft.h
flurry-star.o: $(UTILS_SRC)/yarandom.h
+flurry-star.o: $(HACK_SRC)/xlockmoreI.h
flurry-texture.o: ../../config.h
flurry-texture.o: $(srcdir)/flurry.h
+flurry-texture.o: $(HACK_SRC)/fps.h
flurry-texture.o: $(srcdir)/gltrackball.h
+flurry-texture.o: $(HACK_SRC)/recanim.h
flurry-texture.o: $(srcdir)/rotator.h
+flurry-texture.o: $(HACK_SRC)/screenhackI.h
+flurry-texture.o: $(UTILS_SRC)/colors.h
+flurry-texture.o: $(UTILS_SRC)/erase.h
+flurry-texture.o: $(UTILS_SRC)/font-retry.h
+flurry-texture.o: $(UTILS_SRC)/grabscreen.h
+flurry-texture.o: $(UTILS_SRC)/hsv.h
+flurry-texture.o: $(UTILS_SRC)/resources.h
+flurry-texture.o: $(UTILS_SRC)/usleep.h
+flurry-texture.o: $(UTILS_SRC)/visual.h
+flurry-texture.o: $(UTILS_SRC)/xft.h
flurry-texture.o: $(UTILS_SRC)/yarandom.h
+flurry-texture.o: $(HACK_SRC)/xlockmoreI.h
flyingtoasters.o: ../../config.h
flyingtoasters.o: $(HACK_SRC)/fps.h
flyingtoasters.o: $(srcdir)/gllist.h
@@ -1894,6 +2304,7 @@ flyingtoasters.o: $(UTILS_SRC)/hsv.h
flyingtoasters.o: $(UTILS_SRC)/resources.h
flyingtoasters.o: $(UTILS_SRC)/usleep.h
flyingtoasters.o: $(UTILS_SRC)/visual.h
+flyingtoasters.o: $(UTILS_SRC)/xft.h
flyingtoasters.o: $(UTILS_SRC)/yarandom.h
flyingtoasters.o: $(HACK_SRC)/ximage-loader.h
flyingtoasters.o: $(HACK_SRC)/xlockmoreI.h
@@ -1912,6 +2323,7 @@ fps-gl.o: $(UTILS_SRC)/hsv.h
fps-gl.o: $(UTILS_SRC)/resources.h
fps-gl.o: $(UTILS_SRC)/usleep.h
fps-gl.o: $(UTILS_SRC)/visual.h
+fps-gl.o: $(UTILS_SRC)/xft.h
fps-gl.o: $(UTILS_SRC)/yarandom.h
fps-gl.o: $(HACK_SRC)/xlockmoreI.h
gears.o: ../../config.h
@@ -1931,6 +2343,7 @@ gears.o: $(UTILS_SRC)/hsv.h
gears.o: $(UTILS_SRC)/resources.h
gears.o: $(UTILS_SRC)/usleep.h
gears.o: $(UTILS_SRC)/visual.h
+gears.o: $(UTILS_SRC)/xft.h
gears.o: $(UTILS_SRC)/yarandom.h
gears.o: $(HACK_SRC)/xlockmoreI.h
gears.o: $(HACK_SRC)/xlockmore.h
@@ -1952,6 +2365,7 @@ geodesicgears.o: $(UTILS_SRC)/hsv.h
geodesicgears.o: $(UTILS_SRC)/resources.h
geodesicgears.o: $(UTILS_SRC)/usleep.h
geodesicgears.o: $(UTILS_SRC)/visual.h
+geodesicgears.o: $(UTILS_SRC)/xft.h
geodesicgears.o: $(UTILS_SRC)/yarandom.h
geodesicgears.o: $(HACK_SRC)/xlockmoreI.h
geodesicgears.o: $(HACK_SRC)/xlockmore.h
@@ -1971,6 +2385,7 @@ geodesic.o: $(UTILS_SRC)/hsv.h
geodesic.o: $(UTILS_SRC)/resources.h
geodesic.o: $(UTILS_SRC)/usleep.h
geodesic.o: $(UTILS_SRC)/visual.h
+geodesic.o: $(UTILS_SRC)/xft.h
geodesic.o: $(UTILS_SRC)/yarandom.h
geodesic.o: $(HACK_SRC)/xlockmoreI.h
geodesic.o: $(HACK_SRC)/xlockmore.h
@@ -1988,6 +2403,7 @@ gflux.o: $(UTILS_SRC)/hsv.h
gflux.o: $(UTILS_SRC)/resources.h
gflux.o: $(UTILS_SRC)/usleep.h
gflux.o: $(UTILS_SRC)/visual.h
+gflux.o: $(UTILS_SRC)/xft.h
gflux.o: $(UTILS_SRC)/yarandom.h
gflux.o: $(HACK_SRC)/xlockmoreI.h
gflux.o: $(HACK_SRC)/xlockmore.h
@@ -2005,6 +2421,7 @@ gibson.o: $(UTILS_SRC)/hsv.h
gibson.o: $(UTILS_SRC)/resources.h
gibson.o: $(UTILS_SRC)/usleep.h
gibson.o: $(UTILS_SRC)/visual.h
+gibson.o: $(UTILS_SRC)/xft.h
gibson.o: $(UTILS_SRC)/yarandom.h
gibson.o: $(HACK_SRC)/xlockmoreI.h
gibson.o: $(HACK_SRC)/xlockmore.h
@@ -2022,6 +2439,7 @@ glblur.o: $(UTILS_SRC)/hsv.h
glblur.o: $(UTILS_SRC)/resources.h
glblur.o: $(UTILS_SRC)/usleep.h
glblur.o: $(UTILS_SRC)/visual.h
+glblur.o: $(UTILS_SRC)/xft.h
glblur.o: $(UTILS_SRC)/yarandom.h
glblur.o: $(HACK_SRC)/xlockmoreI.h
glblur.o: $(HACK_SRC)/xlockmore.h
@@ -2037,6 +2455,7 @@ glcells.o: $(UTILS_SRC)/hsv.h
glcells.o: $(UTILS_SRC)/resources.h
glcells.o: $(UTILS_SRC)/usleep.h
glcells.o: $(UTILS_SRC)/visual.h
+glcells.o: $(UTILS_SRC)/xft.h
glcells.o: $(UTILS_SRC)/yarandom.h
glcells.o: $(HACK_SRC)/xlockmoreI.h
glcells.o: $(HACK_SRC)/xlockmore.h
@@ -2053,6 +2472,7 @@ gleidescope.o: $(UTILS_SRC)/hsv.h
gleidescope.o: $(UTILS_SRC)/resources.h
gleidescope.o: $(UTILS_SRC)/usleep.h
gleidescope.o: $(UTILS_SRC)/visual.h
+gleidescope.o: $(UTILS_SRC)/xft.h
gleidescope.o: $(UTILS_SRC)/yarandom.h
gleidescope.o: $(HACK_SRC)/ximage-loader.h
gleidescope.o: $(HACK_SRC)/xlockmoreI.h
@@ -2072,6 +2492,7 @@ glforestfire.o: $(UTILS_SRC)/hsv.h
glforestfire.o: $(UTILS_SRC)/resources.h
glforestfire.o: $(UTILS_SRC)/usleep.h
glforestfire.o: $(UTILS_SRC)/visual.h
+glforestfire.o: $(UTILS_SRC)/xft.h
glforestfire.o: $(UTILS_SRC)/yarandom.h
glforestfire.o: $(HACK_SRC)/ximage-loader.h
glforestfire.o: $(HACK_SRC)/xlockmoreI.h
@@ -2089,6 +2510,7 @@ glhanoi.o: $(UTILS_SRC)/hsv.h
glhanoi.o: $(UTILS_SRC)/resources.h
glhanoi.o: $(UTILS_SRC)/usleep.h
glhanoi.o: $(UTILS_SRC)/visual.h
+glhanoi.o: $(UTILS_SRC)/xft.h
glhanoi.o: $(UTILS_SRC)/yarandom.h
glhanoi.o: $(HACK_SRC)/xlockmoreI.h
glhanoi.o: $(HACK_SRC)/xlockmore.h
@@ -2107,11 +2529,26 @@ glknots.o: $(UTILS_SRC)/hsv.h
glknots.o: $(UTILS_SRC)/resources.h
glknots.o: $(UTILS_SRC)/usleep.h
glknots.o: $(UTILS_SRC)/visual.h
+glknots.o: $(UTILS_SRC)/xft.h
glknots.o: $(UTILS_SRC)/yarandom.h
glknots.o: $(HACK_SRC)/xlockmoreI.h
glknots.o: $(HACK_SRC)/xlockmore.h
gllist.o: ../../config.h
+gllist.o: $(HACK_SRC)/fps.h
gllist.o: $(srcdir)/gllist.h
+gllist.o: $(HACK_SRC)/recanim.h
+gllist.o: $(HACK_SRC)/screenhackI.h
+gllist.o: $(UTILS_SRC)/colors.h
+gllist.o: $(UTILS_SRC)/erase.h
+gllist.o: $(UTILS_SRC)/font-retry.h
+gllist.o: $(UTILS_SRC)/grabscreen.h
+gllist.o: $(UTILS_SRC)/hsv.h
+gllist.o: $(UTILS_SRC)/resources.h
+gllist.o: $(UTILS_SRC)/usleep.h
+gllist.o: $(UTILS_SRC)/visual.h
+gllist.o: $(UTILS_SRC)/xft.h
+gllist.o: $(UTILS_SRC)/yarandom.h
+gllist.o: $(HACK_SRC)/xlockmoreI.h
glmatrix.o: ../../config.h
glmatrix.o: $(HACK_SRC)/fps.h
glmatrix.o: ../images/gen/matrix3_png.h
@@ -2125,6 +2562,7 @@ glmatrix.o: $(UTILS_SRC)/hsv.h
glmatrix.o: $(UTILS_SRC)/resources.h
glmatrix.o: $(UTILS_SRC)/usleep.h
glmatrix.o: $(UTILS_SRC)/visual.h
+glmatrix.o: $(UTILS_SRC)/xft.h
glmatrix.o: $(UTILS_SRC)/yarandom.h
glmatrix.o: $(HACK_SRC)/ximage-loader.h
glmatrix.o: $(HACK_SRC)/xlockmoreI.h
@@ -2146,6 +2584,7 @@ glplanet.o: $(UTILS_SRC)/hsv.h
glplanet.o: $(UTILS_SRC)/resources.h
glplanet.o: $(UTILS_SRC)/usleep.h
glplanet.o: $(UTILS_SRC)/visual.h
+glplanet.o: $(UTILS_SRC)/xft.h
glplanet.o: $(UTILS_SRC)/yarandom.h
glplanet.o: $(HACK_SRC)/ximage-loader.h
glplanet.o: $(HACK_SRC)/xlockmoreI.h
@@ -2154,10 +2593,24 @@ glschool_alg.o: ../../config.h
glschool_alg.o: $(srcdir)/glschool_alg.h
glschool_alg.o: $(UTILS_SRC)/yarandom.h
glschool_gl.o: ../../config.h
+glschool_gl.o: $(HACK_SRC)/fps.h
glschool_gl.o: $(srcdir)/glschool_alg.h
glschool_gl.o: $(srcdir)/glschool_gl.h
+glschool_gl.o: $(HACK_SRC)/recanim.h
+glschool_gl.o: $(HACK_SRC)/screenhackI.h
glschool_gl.o: $(srcdir)/sphere.h
glschool_gl.o: $(srcdir)/tube.h
+glschool_gl.o: $(UTILS_SRC)/colors.h
+glschool_gl.o: $(UTILS_SRC)/erase.h
+glschool_gl.o: $(UTILS_SRC)/font-retry.h
+glschool_gl.o: $(UTILS_SRC)/grabscreen.h
+glschool_gl.o: $(UTILS_SRC)/hsv.h
+glschool_gl.o: $(UTILS_SRC)/resources.h
+glschool_gl.o: $(UTILS_SRC)/usleep.h
+glschool_gl.o: $(UTILS_SRC)/visual.h
+glschool_gl.o: $(UTILS_SRC)/xft.h
+glschool_gl.o: $(UTILS_SRC)/yarandom.h
+glschool_gl.o: $(HACK_SRC)/xlockmoreI.h
glschool.o: ../../config.h
glschool.o: $(HACK_SRC)/fps.h
glschool.o: $(srcdir)/glschool_alg.h
@@ -2173,6 +2626,7 @@ glschool.o: $(UTILS_SRC)/hsv.h
glschool.o: $(UTILS_SRC)/resources.h
glschool.o: $(UTILS_SRC)/usleep.h
glschool.o: $(UTILS_SRC)/visual.h
+glschool.o: $(UTILS_SRC)/xft.h
glschool.o: $(UTILS_SRC)/yarandom.h
glschool.o: $(HACK_SRC)/xlockmoreI.h
glschool.o: $(HACK_SRC)/xlockmore.h
@@ -2190,9 +2644,24 @@ glslideshow.o: $(UTILS_SRC)/hsv.h
glslideshow.o: $(UTILS_SRC)/resources.h
glslideshow.o: $(UTILS_SRC)/usleep.h
glslideshow.o: $(UTILS_SRC)/visual.h
+glslideshow.o: $(UTILS_SRC)/xft.h
glslideshow.o: $(UTILS_SRC)/yarandom.h
glslideshow.o: $(HACK_SRC)/xlockmoreI.h
glslideshow.o: $(HACK_SRC)/xlockmore.h
+glsl-utils.o: ../../config.h
+glsl-utils.o: $(HACK_SRC)/fps.h
+glsl-utils.o: $(srcdir)/glsl-utils.h
+glsl-utils.o: $(HACK_SRC)/recanim.h
+glsl-utils.o: $(HACK_SRC)/screenhackI.h
+glsl-utils.o: $(UTILS_SRC)/colors.h
+glsl-utils.o: $(UTILS_SRC)/font-retry.h
+glsl-utils.o: $(UTILS_SRC)/grabscreen.h
+glsl-utils.o: $(UTILS_SRC)/hsv.h
+glsl-utils.o: $(UTILS_SRC)/resources.h
+glsl-utils.o: $(UTILS_SRC)/usleep.h
+glsl-utils.o: $(UTILS_SRC)/visual.h
+glsl-utils.o: $(UTILS_SRC)/xft.h
+glsl-utils.o: $(UTILS_SRC)/yarandom.h
glsnake.o: ../../config.h
glsnake.o: $(HACK_SRC)/fps.h
glsnake.o: $(HACK_SRC)/recanim.h
@@ -2206,6 +2675,7 @@ glsnake.o: $(UTILS_SRC)/hsv.h
glsnake.o: $(UTILS_SRC)/resources.h
glsnake.o: $(UTILS_SRC)/usleep.h
glsnake.o: $(UTILS_SRC)/visual.h
+glsnake.o: $(UTILS_SRC)/xft.h
glsnake.o: $(UTILS_SRC)/yarandom.h
glsnake.o: $(HACK_SRC)/xlockmoreI.h
glsnake.o: $(HACK_SRC)/xlockmore.h
@@ -2230,22 +2700,71 @@ gltext.o: $(UTILS_SRC)/textclient.h
gltext.o: $(UTILS_SRC)/usleep.h
gltext.o: $(UTILS_SRC)/utf8wc.h
gltext.o: $(UTILS_SRC)/visual.h
+gltext.o: $(UTILS_SRC)/xft.h
gltext.o: $(UTILS_SRC)/yarandom.h
gltext.o: $(HACK_SRC)/xlockmoreI.h
gltext.o: $(HACK_SRC)/xlockmore.h
gltrackball.o: ../../config.h
+gltrackball.o: $(HACK_SRC)/fps.h
gltrackball.o: $(srcdir)/gltrackball.h
+gltrackball.o: $(HACK_SRC)/recanim.h
+gltrackball.o: $(HACK_SRC)/screenhackI.h
gltrackball.o: $(srcdir)/trackball.h
+gltrackball.o: $(UTILS_SRC)/colors.h
+gltrackball.o: $(UTILS_SRC)/font-retry.h
+gltrackball.o: $(UTILS_SRC)/grabscreen.h
+gltrackball.o: $(UTILS_SRC)/hsv.h
+gltrackball.o: $(UTILS_SRC)/resources.h
+gltrackball.o: $(UTILS_SRC)/usleep.h
+gltrackball.o: $(UTILS_SRC)/visual.h
+gltrackball.o: $(UTILS_SRC)/xft.h
+gltrackball.o: $(UTILS_SRC)/yarandom.h
glut_stroke.o: ../../config.h
+glut_stroke.o: $(HACK_SRC)/fps.h
glut_stroke.o: $(srcdir)/glutstroke.h
+glut_stroke.o: $(HACK_SRC)/recanim.h
+glut_stroke.o: $(HACK_SRC)/screenhackI.h
+glut_stroke.o: $(UTILS_SRC)/colors.h
+glut_stroke.o: $(UTILS_SRC)/font-retry.h
+glut_stroke.o: $(UTILS_SRC)/grabscreen.h
+glut_stroke.o: $(UTILS_SRC)/hsv.h
+glut_stroke.o: $(UTILS_SRC)/resources.h
+glut_stroke.o: $(UTILS_SRC)/usleep.h
+glut_stroke.o: $(UTILS_SRC)/visual.h
+glut_stroke.o: $(UTILS_SRC)/xft.h
+glut_stroke.o: $(UTILS_SRC)/yarandom.h
glut_swidth.o: ../../config.h
+glut_swidth.o: $(HACK_SRC)/fps.h
glut_swidth.o: $(srcdir)/glutstroke.h
+glut_swidth.o: $(HACK_SRC)/recanim.h
+glut_swidth.o: $(HACK_SRC)/screenhackI.h
+glut_swidth.o: $(UTILS_SRC)/colors.h
+glut_swidth.o: $(UTILS_SRC)/font-retry.h
+glut_swidth.o: $(UTILS_SRC)/grabscreen.h
+glut_swidth.o: $(UTILS_SRC)/hsv.h
+glut_swidth.o: $(UTILS_SRC)/resources.h
+glut_swidth.o: $(UTILS_SRC)/usleep.h
+glut_swidth.o: $(UTILS_SRC)/visual.h
+glut_swidth.o: $(UTILS_SRC)/xft.h
+glut_swidth.o: $(UTILS_SRC)/yarandom.h
grab-ximage.o: ../../config.h
+grab-ximage.o: $(HACK_SRC)/fps.h
grab-ximage.o: $(srcdir)/grab-ximage.h
+grab-ximage.o: $(HACK_SRC)/recanim.h
+grab-ximage.o: $(HACK_SRC)/screenhackI.h
+grab-ximage.o: $(UTILS_SRC)/colors.h
+grab-ximage.o: $(UTILS_SRC)/erase.h
+grab-ximage.o: $(UTILS_SRC)/font-retry.h
grab-ximage.o: $(UTILS_SRC)/grabscreen.h
+grab-ximage.o: $(UTILS_SRC)/hsv.h
grab-ximage.o: $(UTILS_SRC)/pow2.h
+grab-ximage.o: $(UTILS_SRC)/resources.h
+grab-ximage.o: $(UTILS_SRC)/usleep.h
grab-ximage.o: $(UTILS_SRC)/visual.h
+grab-ximage.o: $(UTILS_SRC)/xft.h
grab-ximage.o: $(UTILS_SRC)/xshm.h
+grab-ximage.o: $(UTILS_SRC)/yarandom.h
+grab-ximage.o: $(HACK_SRC)/xlockmoreI.h
gravitywell.o: ../../config.h
gravitywell.o: $(HACK_SRC)/fps.h
gravitywell.o: $(srcdir)/gltrackball.h
@@ -2259,11 +2778,26 @@ gravitywell.o: $(UTILS_SRC)/hsv.h
gravitywell.o: $(UTILS_SRC)/resources.h
gravitywell.o: $(UTILS_SRC)/usleep.h
gravitywell.o: $(UTILS_SRC)/visual.h
+gravitywell.o: $(UTILS_SRC)/xft.h
gravitywell.o: $(UTILS_SRC)/yarandom.h
gravitywell.o: $(HACK_SRC)/xlockmoreI.h
gravitywell.o: $(HACK_SRC)/xlockmore.h
handsy_model.o: ../../config.h
+handsy_model.o: $(HACK_SRC)/fps.h
handsy_model.o: $(srcdir)/gllist.h
+handsy_model.o: $(HACK_SRC)/recanim.h
+handsy_model.o: $(HACK_SRC)/screenhackI.h
+handsy_model.o: $(UTILS_SRC)/colors.h
+handsy_model.o: $(UTILS_SRC)/erase.h
+handsy_model.o: $(UTILS_SRC)/font-retry.h
+handsy_model.o: $(UTILS_SRC)/grabscreen.h
+handsy_model.o: $(UTILS_SRC)/hsv.h
+handsy_model.o: $(UTILS_SRC)/resources.h
+handsy_model.o: $(UTILS_SRC)/usleep.h
+handsy_model.o: $(UTILS_SRC)/visual.h
+handsy_model.o: $(UTILS_SRC)/xft.h
+handsy_model.o: $(UTILS_SRC)/yarandom.h
+handsy_model.o: $(HACK_SRC)/xlockmoreI.h
handsy.o: ../../config.h
handsy.o: $(HACK_SRC)/fps.h
handsy.o: $(srcdir)/gllist.h
@@ -2282,9 +2816,45 @@ handsy.o: $(UTILS_SRC)/hsv.h
handsy.o: $(UTILS_SRC)/resources.h
handsy.o: $(UTILS_SRC)/usleep.h
handsy.o: $(UTILS_SRC)/visual.h
+handsy.o: $(UTILS_SRC)/xft.h
handsy.o: $(UTILS_SRC)/yarandom.h
handsy.o: $(HACK_SRC)/xlockmoreI.h
handsy.o: $(HACK_SRC)/xlockmore.h
+headroom_model.o: ../../config.h
+headroom_model.o: $(HACK_SRC)/fps.h
+headroom_model.o: $(srcdir)/gllist.h
+headroom_model.o: $(HACK_SRC)/recanim.h
+headroom_model.o: $(HACK_SRC)/screenhackI.h
+headroom_model.o: $(UTILS_SRC)/colors.h
+headroom_model.o: $(UTILS_SRC)/erase.h
+headroom_model.o: $(UTILS_SRC)/font-retry.h
+headroom_model.o: $(UTILS_SRC)/grabscreen.h
+headroom_model.o: $(UTILS_SRC)/hsv.h
+headroom_model.o: $(UTILS_SRC)/resources.h
+headroom_model.o: $(UTILS_SRC)/usleep.h
+headroom_model.o: $(UTILS_SRC)/visual.h
+headroom_model.o: $(UTILS_SRC)/xft.h
+headroom_model.o: $(UTILS_SRC)/yarandom.h
+headroom_model.o: $(HACK_SRC)/xlockmoreI.h
+headroom.o: ../../config.h
+headroom.o: $(HACK_SRC)/fps.h
+headroom.o: $(srcdir)/gllist.h
+headroom.o: $(srcdir)/gltrackball.h
+headroom.o: $(HACK_SRC)/recanim.h
+headroom.o: $(srcdir)/rotator.h
+headroom.o: $(HACK_SRC)/screenhackI.h
+headroom.o: $(UTILS_SRC)/colors.h
+headroom.o: $(UTILS_SRC)/erase.h
+headroom.o: $(UTILS_SRC)/font-retry.h
+headroom.o: $(UTILS_SRC)/grabscreen.h
+headroom.o: $(UTILS_SRC)/hsv.h
+headroom.o: $(UTILS_SRC)/resources.h
+headroom.o: $(UTILS_SRC)/usleep.h
+headroom.o: $(UTILS_SRC)/visual.h
+headroom.o: $(UTILS_SRC)/xft.h
+headroom.o: $(UTILS_SRC)/yarandom.h
+headroom.o: $(HACK_SRC)/xlockmoreI.h
+headroom.o: $(HACK_SRC)/xlockmore.h
hexstrut.o: ../../config.h
hexstrut.o: $(HACK_SRC)/fps.h
hexstrut.o: $(srcdir)/gltrackball.h
@@ -2300,6 +2870,7 @@ hexstrut.o: $(UTILS_SRC)/hsv.h
hexstrut.o: $(UTILS_SRC)/resources.h
hexstrut.o: $(UTILS_SRC)/usleep.h
hexstrut.o: $(UTILS_SRC)/visual.h
+hexstrut.o: $(UTILS_SRC)/xft.h
hexstrut.o: $(UTILS_SRC)/yarandom.h
hexstrut.o: $(HACK_SRC)/xlockmoreI.h
hexstrut.o: $(HACK_SRC)/xlockmore.h
@@ -2319,6 +2890,7 @@ hilbert.o: $(UTILS_SRC)/hsv.h
hilbert.o: $(UTILS_SRC)/resources.h
hilbert.o: $(UTILS_SRC)/usleep.h
hilbert.o: $(UTILS_SRC)/visual.h
+hilbert.o: $(UTILS_SRC)/xft.h
hilbert.o: $(UTILS_SRC)/yarandom.h
hilbert.o: $(HACK_SRC)/xlockmoreI.h
hilbert.o: $(HACK_SRC)/xlockmore.h
@@ -2337,11 +2909,13 @@ hydrostat.o: $(UTILS_SRC)/hsv.h
hydrostat.o: $(UTILS_SRC)/resources.h
hydrostat.o: $(UTILS_SRC)/usleep.h
hydrostat.o: $(UTILS_SRC)/visual.h
+hydrostat.o: $(UTILS_SRC)/xft.h
hydrostat.o: $(UTILS_SRC)/yarandom.h
hydrostat.o: $(HACK_SRC)/xlockmoreI.h
hydrostat.o: $(HACK_SRC)/xlockmore.h
hypertorus.o: ../../config.h
hypertorus.o: $(HACK_SRC)/fps.h
+hypertorus.o: $(srcdir)/glsl-utils.h
hypertorus.o: $(srcdir)/gltrackball.h
hypertorus.o: $(HACK_SRC)/recanim.h
hypertorus.o: $(HACK_SRC)/screenhackI.h
@@ -2353,6 +2927,7 @@ hypertorus.o: $(UTILS_SRC)/hsv.h
hypertorus.o: $(UTILS_SRC)/resources.h
hypertorus.o: $(UTILS_SRC)/usleep.h
hypertorus.o: $(UTILS_SRC)/visual.h
+hypertorus.o: $(UTILS_SRC)/xft.h
hypertorus.o: $(UTILS_SRC)/yarandom.h
hypertorus.o: $(HACK_SRC)/xlockmoreI.h
hypertorus.o: $(HACK_SRC)/xlockmore.h
@@ -2369,6 +2944,7 @@ hypnowheel.o: $(UTILS_SRC)/hsv.h
hypnowheel.o: $(UTILS_SRC)/resources.h
hypnowheel.o: $(UTILS_SRC)/usleep.h
hypnowheel.o: $(UTILS_SRC)/visual.h
+hypnowheel.o: $(UTILS_SRC)/xft.h
hypnowheel.o: $(UTILS_SRC)/yarandom.h
hypnowheel.o: $(HACK_SRC)/xlockmoreI.h
hypnowheel.o: $(HACK_SRC)/xlockmore.h
@@ -2385,6 +2961,7 @@ involute.o: $(UTILS_SRC)/hsv.h
involute.o: $(UTILS_SRC)/resources.h
involute.o: $(UTILS_SRC)/usleep.h
involute.o: $(UTILS_SRC)/visual.h
+involute.o: $(UTILS_SRC)/xft.h
involute.o: $(UTILS_SRC)/yarandom.h
jigglypuff.o: ../../config.h
jigglypuff.o: $(HACK_SRC)/fps.h
@@ -2400,6 +2977,7 @@ jigglypuff.o: $(UTILS_SRC)/hsv.h
jigglypuff.o: $(UTILS_SRC)/resources.h
jigglypuff.o: $(UTILS_SRC)/usleep.h
jigglypuff.o: $(UTILS_SRC)/visual.h
+jigglypuff.o: $(UTILS_SRC)/xft.h
jigglypuff.o: $(UTILS_SRC)/yarandom.h
jigglypuff.o: $(HACK_SRC)/ximage-loader.h
jigglypuff.o: $(HACK_SRC)/xlockmoreI.h
@@ -2422,6 +3000,7 @@ jigsaw.o: $(UTILS_SRC)/resources.h
jigsaw.o: $(UTILS_SRC)/spline.h
jigsaw.o: $(UTILS_SRC)/usleep.h
jigsaw.o: $(UTILS_SRC)/visual.h
+jigsaw.o: $(UTILS_SRC)/xft.h
jigsaw.o: $(UTILS_SRC)/yarandom.h
jigsaw.o: $(HACK_SRC)/xlockmoreI.h
jigsaw.o: $(HACK_SRC)/xlockmore.h
@@ -2442,6 +3021,7 @@ juggler3d.o: $(UTILS_SRC)/hsv.h
juggler3d.o: $(UTILS_SRC)/resources.h
juggler3d.o: $(UTILS_SRC)/usleep.h
juggler3d.o: $(UTILS_SRC)/visual.h
+juggler3d.o: $(UTILS_SRC)/xft.h
juggler3d.o: $(UTILS_SRC)/yarandom.h
juggler3d.o: $(HACK_SRC)/xlockmoreI.h
juggler3d.o: $(HACK_SRC)/xlockmore.h
@@ -2460,12 +3040,14 @@ kaleidocycle.o: $(UTILS_SRC)/hsv.h
kaleidocycle.o: $(UTILS_SRC)/resources.h
kaleidocycle.o: $(UTILS_SRC)/usleep.h
kaleidocycle.o: $(UTILS_SRC)/visual.h
+kaleidocycle.o: $(UTILS_SRC)/xft.h
kaleidocycle.o: $(UTILS_SRC)/yarandom.h
kaleidocycle.o: $(HACK_SRC)/xlockmoreI.h
kaleidocycle.o: $(HACK_SRC)/xlockmore.h
klein.o: ../../config.h
klein.o: $(srcdir)/curlicue.h
klein.o: $(HACK_SRC)/fps.h
+klein.o: $(srcdir)/glsl-utils.h
klein.o: $(srcdir)/gltrackball.h
klein.o: $(HACK_SRC)/recanim.h
klein.o: $(HACK_SRC)/screenhackI.h
@@ -2477,11 +3059,26 @@ klein.o: $(UTILS_SRC)/hsv.h
klein.o: $(UTILS_SRC)/resources.h
klein.o: $(UTILS_SRC)/usleep.h
klein.o: $(UTILS_SRC)/visual.h
+klein.o: $(UTILS_SRC)/xft.h
klein.o: $(UTILS_SRC)/yarandom.h
klein.o: $(HACK_SRC)/xlockmoreI.h
klein.o: $(HACK_SRC)/xlockmore.h
lament_model.o: ../../config.h
+lament_model.o: $(HACK_SRC)/fps.h
lament_model.o: $(srcdir)/gllist.h
+lament_model.o: $(HACK_SRC)/recanim.h
+lament_model.o: $(HACK_SRC)/screenhackI.h
+lament_model.o: $(UTILS_SRC)/colors.h
+lament_model.o: $(UTILS_SRC)/erase.h
+lament_model.o: $(UTILS_SRC)/font-retry.h
+lament_model.o: $(UTILS_SRC)/grabscreen.h
+lament_model.o: $(UTILS_SRC)/hsv.h
+lament_model.o: $(UTILS_SRC)/resources.h
+lament_model.o: $(UTILS_SRC)/usleep.h
+lament_model.o: $(UTILS_SRC)/visual.h
+lament_model.o: $(UTILS_SRC)/xft.h
+lament_model.o: $(UTILS_SRC)/yarandom.h
+lament_model.o: $(HACK_SRC)/xlockmoreI.h
lament.o: ../../config.h
lament.o: $(HACK_SRC)/fps.h
lament.o: $(srcdir)/gllist.h
@@ -2499,6 +3096,7 @@ lament.o: $(UTILS_SRC)/hsv.h
lament.o: $(UTILS_SRC)/resources.h
lament.o: $(UTILS_SRC)/usleep.h
lament.o: $(UTILS_SRC)/visual.h
+lament.o: $(UTILS_SRC)/xft.h
lament.o: $(UTILS_SRC)/yarandom.h
lament.o: $(HACK_SRC)/ximage-loader.h
lament.o: $(HACK_SRC)/xlockmoreI.h
@@ -2518,6 +3116,7 @@ lavalite.o: $(UTILS_SRC)/hsv.h
lavalite.o: $(UTILS_SRC)/resources.h
lavalite.o: $(UTILS_SRC)/usleep.h
lavalite.o: $(UTILS_SRC)/visual.h
+lavalite.o: $(UTILS_SRC)/xft.h
lavalite.o: $(UTILS_SRC)/yarandom.h
lavalite.o: $(HACK_SRC)/ximage-loader.h
lavalite.o: $(HACK_SRC)/xlockmoreI.h
@@ -2534,12 +3133,25 @@ lockward.o: $(UTILS_SRC)/hsv.h
lockward.o: $(UTILS_SRC)/resources.h
lockward.o: $(UTILS_SRC)/usleep.h
lockward.o: $(UTILS_SRC)/visual.h
+lockward.o: $(UTILS_SRC)/xft.h
lockward.o: $(UTILS_SRC)/yarandom.h
lockward.o: $(HACK_SRC)/xlockmoreI.h
lockward.o: $(HACK_SRC)/xlockmore.h
marching.o: ../../config.h
+marching.o: $(HACK_SRC)/fps.h
marching.o: $(srcdir)/marching.h
marching.o: $(srcdir)/normals.h
+marching.o: $(HACK_SRC)/recanim.h
+marching.o: $(HACK_SRC)/screenhackI.h
+marching.o: $(UTILS_SRC)/colors.h
+marching.o: $(UTILS_SRC)/font-retry.h
+marching.o: $(UTILS_SRC)/grabscreen.h
+marching.o: $(UTILS_SRC)/hsv.h
+marching.o: $(UTILS_SRC)/resources.h
+marching.o: $(UTILS_SRC)/usleep.h
+marching.o: $(UTILS_SRC)/visual.h
+marching.o: $(UTILS_SRC)/xft.h
+marching.o: $(UTILS_SRC)/yarandom.h
maze3d.o: ../../config.h
maze3d.o: $(HACK_SRC)/fps.h
maze3d.o: ../images/gen/bob_png.h
@@ -2558,6 +3170,7 @@ maze3d.o: $(UTILS_SRC)/hsv.h
maze3d.o: $(UTILS_SRC)/resources.h
maze3d.o: $(UTILS_SRC)/usleep.h
maze3d.o: $(UTILS_SRC)/visual.h
+maze3d.o: $(UTILS_SRC)/xft.h
maze3d.o: $(UTILS_SRC)/yarandom.h
maze3d.o: $(HACK_SRC)/ximage-loader.h
maze3d.o: $(HACK_SRC)/xlockmoreI.h
@@ -2576,6 +3189,7 @@ menger.o: $(UTILS_SRC)/hsv.h
menger.o: $(UTILS_SRC)/resources.h
menger.o: $(UTILS_SRC)/usleep.h
menger.o: $(UTILS_SRC)/visual.h
+menger.o: $(UTILS_SRC)/xft.h
menger.o: $(UTILS_SRC)/yarandom.h
menger.o: $(HACK_SRC)/xlockmoreI.h
menger.o: $(HACK_SRC)/xlockmore.h
@@ -2593,6 +3207,7 @@ mirrorblob.o: $(UTILS_SRC)/hsv.h
mirrorblob.o: $(UTILS_SRC)/resources.h
mirrorblob.o: $(UTILS_SRC)/usleep.h
mirrorblob.o: $(UTILS_SRC)/visual.h
+mirrorblob.o: $(UTILS_SRC)/xft.h
mirrorblob.o: $(UTILS_SRC)/yarandom.h
mirrorblob.o: $(HACK_SRC)/xlockmoreI.h
mirrorblob.o: $(HACK_SRC)/xlockmore.h
@@ -2612,6 +3227,7 @@ moebiusgears.o: $(UTILS_SRC)/hsv.h
moebiusgears.o: $(UTILS_SRC)/resources.h
moebiusgears.o: $(UTILS_SRC)/usleep.h
moebiusgears.o: $(UTILS_SRC)/visual.h
+moebiusgears.o: $(UTILS_SRC)/xft.h
moebiusgears.o: $(UTILS_SRC)/yarandom.h
moebiusgears.o: $(HACK_SRC)/xlockmoreI.h
moebiusgears.o: $(HACK_SRC)/xlockmore.h
@@ -2631,6 +3247,7 @@ moebius.o: $(UTILS_SRC)/hsv.h
moebius.o: $(UTILS_SRC)/resources.h
moebius.o: $(UTILS_SRC)/usleep.h
moebius.o: $(UTILS_SRC)/visual.h
+moebius.o: $(UTILS_SRC)/xft.h
moebius.o: $(UTILS_SRC)/yarandom.h
moebius.o: $(HACK_SRC)/xlockmoreI.h
moebius.o: $(HACK_SRC)/xlockmore.h
@@ -2652,6 +3269,7 @@ molecule.o: $(UTILS_SRC)/hsv.h
molecule.o: $(UTILS_SRC)/resources.h
molecule.o: $(UTILS_SRC)/usleep.h
molecule.o: $(UTILS_SRC)/visual.h
+molecule.o: $(UTILS_SRC)/xft.h
molecule.o: $(UTILS_SRC)/yarandom.h
molecule.o: $(HACK_SRC)/xlockmoreI.h
molecule.o: $(HACK_SRC)/xlockmore.h
@@ -2667,6 +3285,7 @@ morph3d.o: $(UTILS_SRC)/hsv.h
morph3d.o: $(UTILS_SRC)/resources.h
morph3d.o: $(UTILS_SRC)/usleep.h
morph3d.o: $(UTILS_SRC)/visual.h
+morph3d.o: $(UTILS_SRC)/xft.h
morph3d.o: $(UTILS_SRC)/yarandom.h
morph3d.o: $(HACK_SRC)/xlockmoreI.h
morph3d.o: $(HACK_SRC)/xlockmore.h
@@ -2683,11 +3302,24 @@ noof.o: $(UTILS_SRC)/pow2.h
noof.o: $(UTILS_SRC)/resources.h
noof.o: $(UTILS_SRC)/usleep.h
noof.o: $(UTILS_SRC)/visual.h
+noof.o: $(UTILS_SRC)/xft.h
noof.o: $(UTILS_SRC)/yarandom.h
noof.o: $(HACK_SRC)/xlockmoreI.h
noof.o: $(HACK_SRC)/xlockmore.h
normals.o: ../../config.h
+normals.o: $(HACK_SRC)/fps.h
normals.o: $(srcdir)/normals.h
+normals.o: $(HACK_SRC)/recanim.h
+normals.o: $(HACK_SRC)/screenhackI.h
+normals.o: $(UTILS_SRC)/colors.h
+normals.o: $(UTILS_SRC)/font-retry.h
+normals.o: $(UTILS_SRC)/grabscreen.h
+normals.o: $(UTILS_SRC)/hsv.h
+normals.o: $(UTILS_SRC)/resources.h
+normals.o: $(UTILS_SRC)/usleep.h
+normals.o: $(UTILS_SRC)/visual.h
+normals.o: $(UTILS_SRC)/xft.h
+normals.o: $(UTILS_SRC)/yarandom.h
peepers.o: ../../config.h
peepers.o: $(HACK_SRC)/fps.h
peepers.o: $(srcdir)/gltrackball.h
@@ -2705,6 +3337,7 @@ peepers.o: $(UTILS_SRC)/hsv.h
peepers.o: $(UTILS_SRC)/resources.h
peepers.o: $(UTILS_SRC)/usleep.h
peepers.o: $(UTILS_SRC)/visual.h
+peepers.o: $(UTILS_SRC)/xft.h
peepers.o: $(UTILS_SRC)/yarandom.h
peepers.o: $(HACK_SRC)/ximage-loader.h
peepers.o: $(HACK_SRC)/xlockmoreI.h
@@ -2724,6 +3357,7 @@ photopile.o: $(UTILS_SRC)/hsv.h
photopile.o: $(UTILS_SRC)/resources.h
photopile.o: $(UTILS_SRC)/usleep.h
photopile.o: $(UTILS_SRC)/visual.h
+photopile.o: $(UTILS_SRC)/xft.h
photopile.o: $(UTILS_SRC)/yarandom.h
photopile.o: $(HACK_SRC)/xlockmoreI.h
photopile.o: $(HACK_SRC)/xlockmore.h
@@ -2743,11 +3377,24 @@ pinion.o: $(UTILS_SRC)/hsv.h
pinion.o: $(UTILS_SRC)/resources.h
pinion.o: $(UTILS_SRC)/usleep.h
pinion.o: $(UTILS_SRC)/visual.h
+pinion.o: $(UTILS_SRC)/xft.h
pinion.o: $(UTILS_SRC)/yarandom.h
pinion.o: $(HACK_SRC)/xlockmoreI.h
pinion.o: $(HACK_SRC)/xlockmore.h
pipeobjs.o: $(srcdir)/buildlwo.h
pipeobjs.o: ../../config.h
+pipeobjs.o: $(HACK_SRC)/fps.h
+pipeobjs.o: $(HACK_SRC)/recanim.h
+pipeobjs.o: $(HACK_SRC)/screenhackI.h
+pipeobjs.o: $(UTILS_SRC)/colors.h
+pipeobjs.o: $(UTILS_SRC)/font-retry.h
+pipeobjs.o: $(UTILS_SRC)/grabscreen.h
+pipeobjs.o: $(UTILS_SRC)/hsv.h
+pipeobjs.o: $(UTILS_SRC)/resources.h
+pipeobjs.o: $(UTILS_SRC)/usleep.h
+pipeobjs.o: $(UTILS_SRC)/visual.h
+pipeobjs.o: $(UTILS_SRC)/xft.h
+pipeobjs.o: $(UTILS_SRC)/yarandom.h
pipes.o: $(srcdir)/buildlwo.h
pipes.o: ../../config.h
pipes.o: $(HACK_SRC)/fps.h
@@ -2764,6 +3411,7 @@ pipes.o: $(UTILS_SRC)/hsv.h
pipes.o: $(UTILS_SRC)/resources.h
pipes.o: $(UTILS_SRC)/usleep.h
pipes.o: $(UTILS_SRC)/visual.h
+pipes.o: $(UTILS_SRC)/xft.h
pipes.o: $(UTILS_SRC)/yarandom.h
pipes.o: $(HACK_SRC)/xlockmoreI.h
pipes.o: $(HACK_SRC)/xlockmore.h
@@ -2785,6 +3433,7 @@ polyhedra-gl.o: $(UTILS_SRC)/hsv.h
polyhedra-gl.o: $(UTILS_SRC)/resources.h
polyhedra-gl.o: $(UTILS_SRC)/usleep.h
polyhedra-gl.o: $(UTILS_SRC)/visual.h
+polyhedra-gl.o: $(UTILS_SRC)/xft.h
polyhedra-gl.o: $(UTILS_SRC)/yarandom.h
polyhedra-gl.o: $(HACK_SRC)/xlockmoreI.h
polyhedra-gl.o: $(HACK_SRC)/xlockmore.h
@@ -2803,12 +3452,14 @@ polytopes.o: $(UTILS_SRC)/hsv.h
polytopes.o: $(UTILS_SRC)/resources.h
polytopes.o: $(UTILS_SRC)/usleep.h
polytopes.o: $(UTILS_SRC)/visual.h
+polytopes.o: $(UTILS_SRC)/xft.h
polytopes.o: $(UTILS_SRC)/yarandom.h
polytopes.o: $(HACK_SRC)/xlockmoreI.h
polytopes.o: $(HACK_SRC)/xlockmore.h
projectiveplane.o: ../../config.h
projectiveplane.o: $(srcdir)/curlicue.h
projectiveplane.o: $(HACK_SRC)/fps.h
+projectiveplane.o: $(srcdir)/glsl-utils.h
projectiveplane.o: $(srcdir)/gltrackball.h
projectiveplane.o: $(HACK_SRC)/recanim.h
projectiveplane.o: $(HACK_SRC)/screenhackI.h
@@ -2820,6 +3471,7 @@ projectiveplane.o: $(UTILS_SRC)/hsv.h
projectiveplane.o: $(UTILS_SRC)/resources.h
projectiveplane.o: $(UTILS_SRC)/usleep.h
projectiveplane.o: $(UTILS_SRC)/visual.h
+projectiveplane.o: $(UTILS_SRC)/xft.h
projectiveplane.o: $(UTILS_SRC)/yarandom.h
projectiveplane.o: $(HACK_SRC)/xlockmoreI.h
projectiveplane.o: $(HACK_SRC)/xlockmore.h
@@ -2836,6 +3488,7 @@ providence.o: $(UTILS_SRC)/hsv.h
providence.o: $(UTILS_SRC)/resources.h
providence.o: $(UTILS_SRC)/usleep.h
providence.o: $(UTILS_SRC)/visual.h
+providence.o: $(UTILS_SRC)/xft.h
providence.o: $(UTILS_SRC)/yarandom.h
providence.o: $(HACK_SRC)/xlockmoreI.h
providence.o: $(HACK_SRC)/xlockmore.h
@@ -2851,6 +3504,7 @@ pulsar.o: $(UTILS_SRC)/hsv.h
pulsar.o: $(UTILS_SRC)/resources.h
pulsar.o: $(UTILS_SRC)/usleep.h
pulsar.o: $(UTILS_SRC)/visual.h
+pulsar.o: $(UTILS_SRC)/xft.h
pulsar.o: $(UTILS_SRC)/yarandom.h
pulsar.o: $(HACK_SRC)/ximage-loader.h
pulsar.o: $(HACK_SRC)/xlockmoreI.h
@@ -2868,6 +3522,7 @@ quasicrystal.o: $(UTILS_SRC)/hsv.h
quasicrystal.o: $(UTILS_SRC)/resources.h
quasicrystal.o: $(UTILS_SRC)/usleep.h
quasicrystal.o: $(UTILS_SRC)/visual.h
+quasicrystal.o: $(UTILS_SRC)/xft.h
quasicrystal.o: $(UTILS_SRC)/yarandom.h
quasicrystal.o: $(HACK_SRC)/xlockmoreI.h
quasicrystal.o: $(HACK_SRC)/xlockmore.h
@@ -2885,6 +3540,7 @@ queens.o: $(UTILS_SRC)/hsv.h
queens.o: $(UTILS_SRC)/resources.h
queens.o: $(UTILS_SRC)/usleep.h
queens.o: $(UTILS_SRC)/visual.h
+queens.o: $(UTILS_SRC)/xft.h
queens.o: $(UTILS_SRC)/yarandom.h
queens.o: $(HACK_SRC)/xlockmoreI.h
queens.o: $(HACK_SRC)/xlockmore.h
@@ -2900,6 +3556,7 @@ quickhull.o: $(UTILS_SRC)/hsv.h
quickhull.o: $(UTILS_SRC)/resources.h
quickhull.o: $(UTILS_SRC)/usleep.h
quickhull.o: $(UTILS_SRC)/visual.h
+quickhull.o: $(UTILS_SRC)/xft.h
quickhull.o: $(UTILS_SRC)/yarandom.h
raverhoop.o: ../../config.h
raverhoop.o: $(HACK_SRC)/fps.h
@@ -2915,6 +3572,7 @@ raverhoop.o: $(UTILS_SRC)/hsv.h
raverhoop.o: $(UTILS_SRC)/resources.h
raverhoop.o: $(UTILS_SRC)/usleep.h
raverhoop.o: $(UTILS_SRC)/visual.h
+raverhoop.o: $(UTILS_SRC)/xft.h
raverhoop.o: $(UTILS_SRC)/yarandom.h
raverhoop.o: $(HACK_SRC)/xlockmoreI.h
raverhoop.o: $(HACK_SRC)/xlockmore.h
@@ -2932,16 +3590,46 @@ razzledazzle.o: $(UTILS_SRC)/hsv.h
razzledazzle.o: $(UTILS_SRC)/resources.h
razzledazzle.o: $(UTILS_SRC)/usleep.h
razzledazzle.o: $(UTILS_SRC)/visual.h
+razzledazzle.o: $(UTILS_SRC)/xft.h
razzledazzle.o: $(UTILS_SRC)/yarandom.h
razzledazzle.o: $(HACK_SRC)/xlockmoreI.h
razzledazzle.o: $(HACK_SRC)/xlockmore.h
robot.o: ../../config.h
+robot.o: $(HACK_SRC)/fps.h
robot.o: $(srcdir)/gllist.h
+robot.o: $(HACK_SRC)/recanim.h
+robot.o: $(HACK_SRC)/screenhackI.h
+robot.o: $(UTILS_SRC)/colors.h
+robot.o: $(UTILS_SRC)/erase.h
+robot.o: $(UTILS_SRC)/font-retry.h
+robot.o: $(UTILS_SRC)/grabscreen.h
+robot.o: $(UTILS_SRC)/hsv.h
+robot.o: $(UTILS_SRC)/resources.h
+robot.o: $(UTILS_SRC)/usleep.h
+robot.o: $(UTILS_SRC)/visual.h
+robot.o: $(UTILS_SRC)/xft.h
+robot.o: $(UTILS_SRC)/yarandom.h
+robot.o: $(HACK_SRC)/xlockmoreI.h
robot-wireframe.o: ../../config.h
+robot-wireframe.o: $(HACK_SRC)/fps.h
robot-wireframe.o: $(srcdir)/gllist.h
+robot-wireframe.o: $(HACK_SRC)/recanim.h
+robot-wireframe.o: $(HACK_SRC)/screenhackI.h
+robot-wireframe.o: $(UTILS_SRC)/colors.h
+robot-wireframe.o: $(UTILS_SRC)/erase.h
+robot-wireframe.o: $(UTILS_SRC)/font-retry.h
+robot-wireframe.o: $(UTILS_SRC)/grabscreen.h
+robot-wireframe.o: $(UTILS_SRC)/hsv.h
+robot-wireframe.o: $(UTILS_SRC)/resources.h
+robot-wireframe.o: $(UTILS_SRC)/usleep.h
+robot-wireframe.o: $(UTILS_SRC)/visual.h
+robot-wireframe.o: $(UTILS_SRC)/xft.h
+robot-wireframe.o: $(UTILS_SRC)/yarandom.h
+robot-wireframe.o: $(HACK_SRC)/xlockmoreI.h
romanboy.o: ../../config.h
romanboy.o: $(srcdir)/curlicue.h
romanboy.o: $(HACK_SRC)/fps.h
+romanboy.o: $(srcdir)/glsl-utils.h
romanboy.o: $(srcdir)/gltrackball.h
romanboy.o: $(HACK_SRC)/recanim.h
romanboy.o: $(HACK_SRC)/screenhackI.h
@@ -2953,6 +3641,7 @@ romanboy.o: $(UTILS_SRC)/hsv.h
romanboy.o: $(UTILS_SRC)/resources.h
romanboy.o: $(UTILS_SRC)/usleep.h
romanboy.o: $(UTILS_SRC)/visual.h
+romanboy.o: $(UTILS_SRC)/xft.h
romanboy.o: $(UTILS_SRC)/yarandom.h
romanboy.o: $(HACK_SRC)/xlockmoreI.h
romanboy.o: $(HACK_SRC)/xlockmore.h
@@ -2973,6 +3662,7 @@ rubikblocks.o: $(UTILS_SRC)/hsv.h
rubikblocks.o: $(UTILS_SRC)/resources.h
rubikblocks.o: $(UTILS_SRC)/usleep.h
rubikblocks.o: $(UTILS_SRC)/visual.h
+rubikblocks.o: $(UTILS_SRC)/xft.h
rubikblocks.o: $(UTILS_SRC)/yarandom.h
rubikblocks.o: $(HACK_SRC)/xlockmoreI.h
rubikblocks.o: $(HACK_SRC)/xlockmore.h
@@ -2989,23 +3679,122 @@ rubik.o: $(UTILS_SRC)/hsv.h
rubik.o: $(UTILS_SRC)/resources.h
rubik.o: $(UTILS_SRC)/usleep.h
rubik.o: $(UTILS_SRC)/visual.h
+rubik.o: $(UTILS_SRC)/xft.h
rubik.o: $(UTILS_SRC)/yarandom.h
rubik.o: $(HACK_SRC)/xlockmoreI.h
rubik.o: $(HACK_SRC)/xlockmore.h
s1_1.o: ../../config.h
+s1_1.o: $(HACK_SRC)/fps.h
s1_1.o: $(srcdir)/gllist.h
+s1_1.o: $(HACK_SRC)/recanim.h
+s1_1.o: $(HACK_SRC)/screenhackI.h
+s1_1.o: $(UTILS_SRC)/colors.h
+s1_1.o: $(UTILS_SRC)/erase.h
+s1_1.o: $(UTILS_SRC)/font-retry.h
+s1_1.o: $(UTILS_SRC)/grabscreen.h
+s1_1.o: $(UTILS_SRC)/hsv.h
+s1_1.o: $(UTILS_SRC)/resources.h
+s1_1.o: $(UTILS_SRC)/usleep.h
+s1_1.o: $(UTILS_SRC)/visual.h
+s1_1.o: $(UTILS_SRC)/xft.h
+s1_1.o: $(UTILS_SRC)/yarandom.h
+s1_1.o: $(HACK_SRC)/xlockmoreI.h
s1_2.o: ../../config.h
+s1_2.o: $(HACK_SRC)/fps.h
s1_2.o: $(srcdir)/gllist.h
+s1_2.o: $(HACK_SRC)/recanim.h
+s1_2.o: $(HACK_SRC)/screenhackI.h
+s1_2.o: $(UTILS_SRC)/colors.h
+s1_2.o: $(UTILS_SRC)/erase.h
+s1_2.o: $(UTILS_SRC)/font-retry.h
+s1_2.o: $(UTILS_SRC)/grabscreen.h
+s1_2.o: $(UTILS_SRC)/hsv.h
+s1_2.o: $(UTILS_SRC)/resources.h
+s1_2.o: $(UTILS_SRC)/usleep.h
+s1_2.o: $(UTILS_SRC)/visual.h
+s1_2.o: $(UTILS_SRC)/xft.h
+s1_2.o: $(UTILS_SRC)/yarandom.h
+s1_2.o: $(HACK_SRC)/xlockmoreI.h
s1_3.o: ../../config.h
+s1_3.o: $(HACK_SRC)/fps.h
s1_3.o: $(srcdir)/gllist.h
+s1_3.o: $(HACK_SRC)/recanim.h
+s1_3.o: $(HACK_SRC)/screenhackI.h
+s1_3.o: $(UTILS_SRC)/colors.h
+s1_3.o: $(UTILS_SRC)/erase.h
+s1_3.o: $(UTILS_SRC)/font-retry.h
+s1_3.o: $(UTILS_SRC)/grabscreen.h
+s1_3.o: $(UTILS_SRC)/hsv.h
+s1_3.o: $(UTILS_SRC)/resources.h
+s1_3.o: $(UTILS_SRC)/usleep.h
+s1_3.o: $(UTILS_SRC)/visual.h
+s1_3.o: $(UTILS_SRC)/xft.h
+s1_3.o: $(UTILS_SRC)/yarandom.h
+s1_3.o: $(HACK_SRC)/xlockmoreI.h
s1_4.o: ../../config.h
+s1_4.o: $(HACK_SRC)/fps.h
s1_4.o: $(srcdir)/gllist.h
+s1_4.o: $(HACK_SRC)/recanim.h
+s1_4.o: $(HACK_SRC)/screenhackI.h
+s1_4.o: $(UTILS_SRC)/colors.h
+s1_4.o: $(UTILS_SRC)/erase.h
+s1_4.o: $(UTILS_SRC)/font-retry.h
+s1_4.o: $(UTILS_SRC)/grabscreen.h
+s1_4.o: $(UTILS_SRC)/hsv.h
+s1_4.o: $(UTILS_SRC)/resources.h
+s1_4.o: $(UTILS_SRC)/usleep.h
+s1_4.o: $(UTILS_SRC)/visual.h
+s1_4.o: $(UTILS_SRC)/xft.h
+s1_4.o: $(UTILS_SRC)/yarandom.h
+s1_4.o: $(HACK_SRC)/xlockmoreI.h
s1_5.o: ../../config.h
+s1_5.o: $(HACK_SRC)/fps.h
s1_5.o: $(srcdir)/gllist.h
+s1_5.o: $(HACK_SRC)/recanim.h
+s1_5.o: $(HACK_SRC)/screenhackI.h
+s1_5.o: $(UTILS_SRC)/colors.h
+s1_5.o: $(UTILS_SRC)/erase.h
+s1_5.o: $(UTILS_SRC)/font-retry.h
+s1_5.o: $(UTILS_SRC)/grabscreen.h
+s1_5.o: $(UTILS_SRC)/hsv.h
+s1_5.o: $(UTILS_SRC)/resources.h
+s1_5.o: $(UTILS_SRC)/usleep.h
+s1_5.o: $(UTILS_SRC)/visual.h
+s1_5.o: $(UTILS_SRC)/xft.h
+s1_5.o: $(UTILS_SRC)/yarandom.h
+s1_5.o: $(HACK_SRC)/xlockmoreI.h
s1_6.o: ../../config.h
+s1_6.o: $(HACK_SRC)/fps.h
s1_6.o: $(srcdir)/gllist.h
+s1_6.o: $(HACK_SRC)/recanim.h
+s1_6.o: $(HACK_SRC)/screenhackI.h
+s1_6.o: $(UTILS_SRC)/colors.h
+s1_6.o: $(UTILS_SRC)/erase.h
+s1_6.o: $(UTILS_SRC)/font-retry.h
+s1_6.o: $(UTILS_SRC)/grabscreen.h
+s1_6.o: $(UTILS_SRC)/hsv.h
+s1_6.o: $(UTILS_SRC)/resources.h
+s1_6.o: $(UTILS_SRC)/usleep.h
+s1_6.o: $(UTILS_SRC)/visual.h
+s1_6.o: $(UTILS_SRC)/xft.h
+s1_6.o: $(UTILS_SRC)/yarandom.h
+s1_6.o: $(HACK_SRC)/xlockmoreI.h
s1_b.o: ../../config.h
+s1_b.o: $(HACK_SRC)/fps.h
s1_b.o: $(srcdir)/gllist.h
+s1_b.o: $(HACK_SRC)/recanim.h
+s1_b.o: $(HACK_SRC)/screenhackI.h
+s1_b.o: $(UTILS_SRC)/colors.h
+s1_b.o: $(UTILS_SRC)/erase.h
+s1_b.o: $(UTILS_SRC)/font-retry.h
+s1_b.o: $(UTILS_SRC)/grabscreen.h
+s1_b.o: $(UTILS_SRC)/hsv.h
+s1_b.o: $(UTILS_SRC)/resources.h
+s1_b.o: $(UTILS_SRC)/usleep.h
+s1_b.o: $(UTILS_SRC)/visual.h
+s1_b.o: $(UTILS_SRC)/xft.h
+s1_b.o: $(UTILS_SRC)/yarandom.h
+s1_b.o: $(HACK_SRC)/xlockmoreI.h
sballs.o: ../../config.h
sballs.o: $(HACK_SRC)/fps.h
sballs.o: $(srcdir)/gltrackball.h
@@ -3021,27 +3810,59 @@ sballs.o: $(UTILS_SRC)/hsv.h
sballs.o: $(UTILS_SRC)/resources.h
sballs.o: $(UTILS_SRC)/usleep.h
sballs.o: $(UTILS_SRC)/visual.h
+sballs.o: $(UTILS_SRC)/xft.h
sballs.o: $(UTILS_SRC)/yarandom.h
sballs.o: $(HACK_SRC)/ximage-loader.h
sballs.o: $(HACK_SRC)/xlockmoreI.h
sballs.o: $(HACK_SRC)/xlockmore.h
seccam.o: ../../config.h
+seccam.o: $(HACK_SRC)/fps.h
seccam.o: $(srcdir)/gllist.h
+seccam.o: $(HACK_SRC)/recanim.h
+seccam.o: $(HACK_SRC)/screenhackI.h
+seccam.o: $(UTILS_SRC)/colors.h
+seccam.o: $(UTILS_SRC)/erase.h
+seccam.o: $(UTILS_SRC)/font-retry.h
+seccam.o: $(UTILS_SRC)/grabscreen.h
+seccam.o: $(UTILS_SRC)/hsv.h
+seccam.o: $(UTILS_SRC)/resources.h
+seccam.o: $(UTILS_SRC)/usleep.h
+seccam.o: $(UTILS_SRC)/visual.h
+seccam.o: $(UTILS_SRC)/xft.h
+seccam.o: $(UTILS_SRC)/yarandom.h
+seccam.o: $(HACK_SRC)/xlockmoreI.h
shark.o: $(srcdir)/atlantis.h
shark.o: ../../config.h
shark.o: $(HACK_SRC)/fps.h
shark.o: $(HACK_SRC)/recanim.h
shark.o: $(HACK_SRC)/screenhackI.h
shark.o: $(UTILS_SRC)/colors.h
+shark.o: $(UTILS_SRC)/erase.h
shark.o: $(UTILS_SRC)/font-retry.h
shark.o: $(UTILS_SRC)/grabscreen.h
shark.o: $(UTILS_SRC)/hsv.h
shark.o: $(UTILS_SRC)/resources.h
shark.o: $(UTILS_SRC)/usleep.h
shark.o: $(UTILS_SRC)/visual.h
+shark.o: $(UTILS_SRC)/xft.h
shark.o: $(UTILS_SRC)/yarandom.h
+shark.o: $(HACK_SRC)/xlockmoreI.h
ships.o: ../../config.h
+ships.o: $(HACK_SRC)/fps.h
ships.o: $(srcdir)/gllist.h
+ships.o: $(HACK_SRC)/recanim.h
+ships.o: $(HACK_SRC)/screenhackI.h
+ships.o: $(UTILS_SRC)/colors.h
+ships.o: $(UTILS_SRC)/erase.h
+ships.o: $(UTILS_SRC)/font-retry.h
+ships.o: $(UTILS_SRC)/grabscreen.h
+ships.o: $(UTILS_SRC)/hsv.h
+ships.o: $(UTILS_SRC)/resources.h
+ships.o: $(UTILS_SRC)/usleep.h
+ships.o: $(UTILS_SRC)/visual.h
+ships.o: $(UTILS_SRC)/xft.h
+ships.o: $(UTILS_SRC)/yarandom.h
+ships.o: $(HACK_SRC)/xlockmoreI.h
sierpinski3d.o: ../../config.h
sierpinski3d.o: $(HACK_SRC)/fps.h
sierpinski3d.o: $(srcdir)/gltrackball.h
@@ -3056,6 +3877,7 @@ sierpinski3d.o: $(UTILS_SRC)/hsv.h
sierpinski3d.o: $(UTILS_SRC)/resources.h
sierpinski3d.o: $(UTILS_SRC)/usleep.h
sierpinski3d.o: $(UTILS_SRC)/visual.h
+sierpinski3d.o: $(UTILS_SRC)/xft.h
sierpinski3d.o: $(UTILS_SRC)/yarandom.h
sierpinski3d.o: $(HACK_SRC)/xlockmoreI.h
sierpinski3d.o: $(HACK_SRC)/xlockmore.h
@@ -3075,6 +3897,7 @@ skytentacles.o: $(UTILS_SRC)/hsv.h
skytentacles.o: $(UTILS_SRC)/resources.h
skytentacles.o: $(UTILS_SRC)/usleep.h
skytentacles.o: $(UTILS_SRC)/visual.h
+skytentacles.o: $(UTILS_SRC)/xft.h
skytentacles.o: $(UTILS_SRC)/yarandom.h
skytentacles.o: $(HACK_SRC)/ximage-loader.h
skytentacles.o: $(HACK_SRC)/xlockmoreI.h
@@ -3095,6 +3918,7 @@ sonar-icmp.o: $(UTILS_SRC)/thread_util.h
sonar-icmp.o: $(UTILS_SRC)/usleep.h
sonar-icmp.o: $(UTILS_SRC)/version.h
sonar-icmp.o: $(UTILS_SRC)/visual.h
+sonar-icmp.o: $(UTILS_SRC)/xft.h
sonar-icmp.o: $(UTILS_SRC)/yarandom.h
sonar.o: ../../config.h
sonar.o: $(HACK_SRC)/fps.h
@@ -3114,6 +3938,7 @@ sonar.o: $(UTILS_SRC)/resources.h
sonar.o: $(UTILS_SRC)/thread_util.h
sonar.o: $(UTILS_SRC)/usleep.h
sonar.o: $(UTILS_SRC)/visual.h
+sonar.o: $(UTILS_SRC)/xft.h
sonar.o: $(UTILS_SRC)/yarandom.h
sonar.o: $(HACK_SRC)/xlockmoreI.h
sonar.o: $(HACK_SRC)/xlockmore.h
@@ -3129,7 +3954,27 @@ sonar-sim.o: $(UTILS_SRC)/hsv.h
sonar-sim.o: $(UTILS_SRC)/resources.h
sonar-sim.o: $(UTILS_SRC)/usleep.h
sonar-sim.o: $(UTILS_SRC)/visual.h
+sonar-sim.o: $(UTILS_SRC)/xft.h
sonar-sim.o: $(UTILS_SRC)/yarandom.h
+sphereeversion.o: ../../config.h
+sphereeversion.o: $(HACK_SRC)/fps.h
+sphereeversion.o: $(srcdir)/glsl-utils.h
+sphereeversion.o: $(srcdir)/gltrackball.h
+sphereeversion.o: $(HACK_SRC)/recanim.h
+sphereeversion.o: $(HACK_SRC)/screenhackI.h
+sphereeversion.o: $(UTILS_SRC)/colors.h
+sphereeversion.o: $(UTILS_SRC)/erase.h
+sphereeversion.o: $(UTILS_SRC)/font-retry.h
+sphereeversion.o: $(UTILS_SRC)/grabscreen.h
+sphereeversion.o: $(UTILS_SRC)/hsv.h
+sphereeversion.o: $(UTILS_SRC)/pow2.h
+sphereeversion.o: $(UTILS_SRC)/resources.h
+sphereeversion.o: $(UTILS_SRC)/usleep.h
+sphereeversion.o: $(UTILS_SRC)/visual.h
+sphereeversion.o: $(UTILS_SRC)/xft.h
+sphereeversion.o: $(UTILS_SRC)/yarandom.h
+sphereeversion.o: $(HACK_SRC)/xlockmoreI.h
+sphereeversion.o: $(HACK_SRC)/xlockmore.h
spheremonics.o: ../../config.h
spheremonics.o: $(HACK_SRC)/fps.h
spheremonics.o: $(srcdir)/gltrackball.h
@@ -3146,11 +3991,24 @@ spheremonics.o: $(UTILS_SRC)/hsv.h
spheremonics.o: $(UTILS_SRC)/resources.h
spheremonics.o: $(UTILS_SRC)/usleep.h
spheremonics.o: $(UTILS_SRC)/visual.h
+spheremonics.o: $(UTILS_SRC)/xft.h
spheremonics.o: $(UTILS_SRC)/yarandom.h
spheremonics.o: $(HACK_SRC)/xlockmoreI.h
spheremonics.o: $(HACK_SRC)/xlockmore.h
sphere.o: ../../config.h
+sphere.o: $(HACK_SRC)/fps.h
+sphere.o: $(HACK_SRC)/recanim.h
+sphere.o: $(HACK_SRC)/screenhackI.h
sphere.o: $(srcdir)/sphere.h
+sphere.o: $(UTILS_SRC)/colors.h
+sphere.o: $(UTILS_SRC)/font-retry.h
+sphere.o: $(UTILS_SRC)/grabscreen.h
+sphere.o: $(UTILS_SRC)/hsv.h
+sphere.o: $(UTILS_SRC)/resources.h
+sphere.o: $(UTILS_SRC)/usleep.h
+sphere.o: $(UTILS_SRC)/visual.h
+sphere.o: $(UTILS_SRC)/xft.h
+sphere.o: $(UTILS_SRC)/yarandom.h
splitflap.o: ../../config.h
splitflap.o: $(HACK_SRC)/fps.h
splitflap.o: $(srcdir)/gllist.h
@@ -3169,12 +4027,27 @@ splitflap.o: $(UTILS_SRC)/textclient.h
splitflap.o: $(UTILS_SRC)/usleep.h
splitflap.o: $(UTILS_SRC)/utf8wc.h
splitflap.o: $(UTILS_SRC)/visual.h
+splitflap.o: $(UTILS_SRC)/xft.h
splitflap.o: $(UTILS_SRC)/yarandom.h
splitflap.o: $(HACK_SRC)/ximage-loader.h
splitflap.o: $(HACK_SRC)/xlockmoreI.h
splitflap.o: $(HACK_SRC)/xlockmore.h
splitflap_obj.o: ../../config.h
+splitflap_obj.o: $(HACK_SRC)/fps.h
splitflap_obj.o: $(srcdir)/gllist.h
+splitflap_obj.o: $(HACK_SRC)/recanim.h
+splitflap_obj.o: $(HACK_SRC)/screenhackI.h
+splitflap_obj.o: $(UTILS_SRC)/colors.h
+splitflap_obj.o: $(UTILS_SRC)/erase.h
+splitflap_obj.o: $(UTILS_SRC)/font-retry.h
+splitflap_obj.o: $(UTILS_SRC)/grabscreen.h
+splitflap_obj.o: $(UTILS_SRC)/hsv.h
+splitflap_obj.o: $(UTILS_SRC)/resources.h
+splitflap_obj.o: $(UTILS_SRC)/usleep.h
+splitflap_obj.o: $(UTILS_SRC)/visual.h
+splitflap_obj.o: $(UTILS_SRC)/xft.h
+splitflap_obj.o: $(UTILS_SRC)/yarandom.h
+splitflap_obj.o: $(HACK_SRC)/xlockmoreI.h
splodesic.o: ../../config.h
splodesic.o: $(HACK_SRC)/fps.h
splodesic.o: $(srcdir)/gltrackball.h
@@ -3190,6 +4063,7 @@ splodesic.o: $(UTILS_SRC)/hsv.h
splodesic.o: $(UTILS_SRC)/resources.h
splodesic.o: $(UTILS_SRC)/usleep.h
splodesic.o: $(UTILS_SRC)/visual.h
+splodesic.o: $(UTILS_SRC)/xft.h
splodesic.o: $(UTILS_SRC)/yarandom.h
splodesic.o: $(HACK_SRC)/xlockmoreI.h
splodesic.o: $(HACK_SRC)/xlockmore.h
@@ -3207,6 +4081,7 @@ sproingies.o: $(UTILS_SRC)/hsv.h
sproingies.o: $(UTILS_SRC)/resources.h
sproingies.o: $(UTILS_SRC)/usleep.h
sproingies.o: $(UTILS_SRC)/visual.h
+sproingies.o: $(UTILS_SRC)/xft.h
sproingies.o: $(UTILS_SRC)/yarandom.h
sproingies.o: $(HACK_SRC)/xlockmoreI.h
sproingiewrap.o: ../../config.h
@@ -3222,6 +4097,7 @@ sproingiewrap.o: $(UTILS_SRC)/hsv.h
sproingiewrap.o: $(UTILS_SRC)/resources.h
sproingiewrap.o: $(UTILS_SRC)/usleep.h
sproingiewrap.o: $(UTILS_SRC)/visual.h
+sproingiewrap.o: $(UTILS_SRC)/xft.h
sproingiewrap.o: $(UTILS_SRC)/yarandom.h
sproingiewrap.o: $(HACK_SRC)/xlockmoreI.h
sproingiewrap.o: $(HACK_SRC)/xlockmore.h
@@ -3240,6 +4116,7 @@ stairs.o: $(UTILS_SRC)/hsv.h
stairs.o: $(UTILS_SRC)/resources.h
stairs.o: $(UTILS_SRC)/usleep.h
stairs.o: $(UTILS_SRC)/visual.h
+stairs.o: $(UTILS_SRC)/xft.h
stairs.o: $(UTILS_SRC)/yarandom.h
stairs.o: $(HACK_SRC)/ximage-loader.h
stairs.o: $(HACK_SRC)/xlockmoreI.h
@@ -3262,6 +4139,7 @@ starwars.o: $(UTILS_SRC)/textclient.h
starwars.o: $(UTILS_SRC)/usleep.h
starwars.o: $(UTILS_SRC)/utf8wc.h
starwars.o: $(UTILS_SRC)/visual.h
+starwars.o: $(UTILS_SRC)/xft.h
starwars.o: $(UTILS_SRC)/yarandom.h
starwars.o: $(HACK_SRC)/xlockmoreI.h
starwars.o: $(HACK_SRC)/xlockmore.h
@@ -3286,6 +4164,7 @@ stonerview.o: $(UTILS_SRC)/hsv.h
stonerview.o: $(UTILS_SRC)/resources.h
stonerview.o: $(UTILS_SRC)/usleep.h
stonerview.o: $(UTILS_SRC)/visual.h
+stonerview.o: $(UTILS_SRC)/xft.h
stonerview.o: $(UTILS_SRC)/yarandom.h
stonerview.o: $(HACK_SRC)/xlockmoreI.h
stonerview.o: $(HACK_SRC)/xlockmore.h
@@ -3295,9 +4174,21 @@ stonerview-osc.o: $(srcdir)/stonerview-move.h
stonerview-osc.o: $(srcdir)/stonerview-osc.h
stonerview-osc.o: $(UTILS_SRC)/yarandom.h
stonerview-view.o: ../../config.h
+stonerview-view.o: $(HACK_SRC)/fps.h
+stonerview-view.o: $(HACK_SRC)/recanim.h
+stonerview-view.o: $(HACK_SRC)/screenhackI.h
stonerview-view.o: $(srcdir)/stonerview.h
stonerview-view.o: $(srcdir)/stonerview-move.h
stonerview-view.o: $(srcdir)/stonerview-osc.h
+stonerview-view.o: $(UTILS_SRC)/colors.h
+stonerview-view.o: $(UTILS_SRC)/font-retry.h
+stonerview-view.o: $(UTILS_SRC)/grabscreen.h
+stonerview-view.o: $(UTILS_SRC)/hsv.h
+stonerview-view.o: $(UTILS_SRC)/resources.h
+stonerview-view.o: $(UTILS_SRC)/usleep.h
+stonerview-view.o: $(UTILS_SRC)/visual.h
+stonerview-view.o: $(UTILS_SRC)/xft.h
+stonerview-view.o: $(UTILS_SRC)/yarandom.h
superquadrics.o: ../../config.h
superquadrics.o: $(HACK_SRC)/fps.h
superquadrics.o: $(HACK_SRC)/recanim.h
@@ -3310,6 +4201,7 @@ superquadrics.o: $(UTILS_SRC)/hsv.h
superquadrics.o: $(UTILS_SRC)/resources.h
superquadrics.o: $(UTILS_SRC)/usleep.h
superquadrics.o: $(UTILS_SRC)/visual.h
+superquadrics.o: $(UTILS_SRC)/xft.h
superquadrics.o: $(UTILS_SRC)/yarandom.h
superquadrics.o: $(HACK_SRC)/xlockmoreI.h
superquadrics.o: $(HACK_SRC)/xlockmore.h
@@ -3327,6 +4219,7 @@ surfaces.o: $(UTILS_SRC)/hsv.h
surfaces.o: $(UTILS_SRC)/resources.h
surfaces.o: $(UTILS_SRC)/usleep.h
surfaces.o: $(UTILS_SRC)/visual.h
+surfaces.o: $(UTILS_SRC)/xft.h
surfaces.o: $(UTILS_SRC)/yarandom.h
surfaces.o: $(HACK_SRC)/xlockmoreI.h
surfaces.o: $(HACK_SRC)/xlockmore.h
@@ -3343,6 +4236,7 @@ swim.o: $(UTILS_SRC)/hsv.h
swim.o: $(UTILS_SRC)/resources.h
swim.o: $(UTILS_SRC)/usleep.h
swim.o: $(UTILS_SRC)/visual.h
+swim.o: $(UTILS_SRC)/xft.h
swim.o: $(UTILS_SRC)/yarandom.h
swim.o: $(HACK_SRC)/xlockmoreI.h
tangram.o: ../../config.h
@@ -3359,20 +4253,56 @@ tangram.o: $(UTILS_SRC)/hsv.h
tangram.o: $(UTILS_SRC)/resources.h
tangram.o: $(UTILS_SRC)/usleep.h
tangram.o: $(UTILS_SRC)/visual.h
+tangram.o: $(UTILS_SRC)/xft.h
tangram.o: $(UTILS_SRC)/yarandom.h
tangram.o: $(HACK_SRC)/xlockmoreI.h
tangram.o: $(HACK_SRC)/xlockmore.h
tangram_shapes.o: ../../config.h
+tangram_shapes.o: $(HACK_SRC)/fps.h
+tangram_shapes.o: $(HACK_SRC)/recanim.h
+tangram_shapes.o: $(HACK_SRC)/screenhackI.h
tangram_shapes.o: $(srcdir)/tangram_shapes.h
+tangram_shapes.o: $(UTILS_SRC)/colors.h
+tangram_shapes.o: $(UTILS_SRC)/font-retry.h
+tangram_shapes.o: $(UTILS_SRC)/grabscreen.h
+tangram_shapes.o: $(UTILS_SRC)/hsv.h
+tangram_shapes.o: $(UTILS_SRC)/resources.h
+tangram_shapes.o: $(UTILS_SRC)/usleep.h
+tangram_shapes.o: $(UTILS_SRC)/visual.h
+tangram_shapes.o: $(UTILS_SRC)/xft.h
+tangram_shapes.o: $(UTILS_SRC)/yarandom.h
teapot.o: ../../config.h
+teapot.o: $(HACK_SRC)/fps.h
+teapot.o: $(HACK_SRC)/recanim.h
+teapot.o: $(HACK_SRC)/screenhackI.h
teapot.o: $(srcdir)/teapot.h
+teapot.o: $(UTILS_SRC)/colors.h
+teapot.o: $(UTILS_SRC)/font-retry.h
+teapot.o: $(UTILS_SRC)/grabscreen.h
+teapot.o: $(UTILS_SRC)/hsv.h
+teapot.o: $(UTILS_SRC)/resources.h
+teapot.o: $(UTILS_SRC)/usleep.h
+teapot.o: $(UTILS_SRC)/visual.h
+teapot.o: $(UTILS_SRC)/xft.h
+teapot.o: $(UTILS_SRC)/yarandom.h
texfont.o: ../../config.h
texfont.o: $(HACK_SRC)/fps.h
+texfont.o: $(srcdir)/glsl-utils.h
+texfont.o: $(HACK_SRC)/recanim.h
+texfont.o: $(HACK_SRC)/screenhackI.h
texfont.o: $(srcdir)/texfont.h
+texfont.o: $(UTILS_SRC)/colors.h
+texfont.o: $(UTILS_SRC)/font-retry.h
+texfont.o: $(UTILS_SRC)/grabscreen.h
+texfont.o: $(UTILS_SRC)/hsv.h
texfont.o: $(UTILS_SRC)/pow2.h
texfont.o: $(UTILS_SRC)/resources.h
+texfont.o: $(UTILS_SRC)/usleep.h
+texfont.o: $(UTILS_SRC)/utf8wc.h
+texfont.o: $(UTILS_SRC)/visual.h
texfont.o: $(UTILS_SRC)/xft.h
texfont.o: $(UTILS_SRC)/xshm.h
+texfont.o: $(UTILS_SRC)/yarandom.h
timetunnel.o: ../../config.h
timetunnel.o: $(HACK_SRC)/fps.h
timetunnel.o: $(srcdir)/gltrackball.h
@@ -3392,30 +4322,171 @@ timetunnel.o: $(UTILS_SRC)/hsv.h
timetunnel.o: $(UTILS_SRC)/resources.h
timetunnel.o: $(UTILS_SRC)/usleep.h
timetunnel.o: $(UTILS_SRC)/visual.h
+timetunnel.o: $(UTILS_SRC)/xft.h
timetunnel.o: $(UTILS_SRC)/yarandom.h
timetunnel.o: $(HACK_SRC)/ximage-loader.h
timetunnel.o: $(HACK_SRC)/xlockmoreI.h
timetunnel.o: $(HACK_SRC)/xlockmore.h
toast2.o: ../../config.h
+toast2.o: $(HACK_SRC)/fps.h
toast2.o: $(srcdir)/gllist.h
+toast2.o: $(HACK_SRC)/recanim.h
+toast2.o: $(HACK_SRC)/screenhackI.h
+toast2.o: $(UTILS_SRC)/colors.h
+toast2.o: $(UTILS_SRC)/erase.h
+toast2.o: $(UTILS_SRC)/font-retry.h
+toast2.o: $(UTILS_SRC)/grabscreen.h
+toast2.o: $(UTILS_SRC)/hsv.h
+toast2.o: $(UTILS_SRC)/resources.h
+toast2.o: $(UTILS_SRC)/usleep.h
+toast2.o: $(UTILS_SRC)/visual.h
+toast2.o: $(UTILS_SRC)/xft.h
+toast2.o: $(UTILS_SRC)/yarandom.h
+toast2.o: $(HACK_SRC)/xlockmoreI.h
toaster_base.o: ../../config.h
+toaster_base.o: $(HACK_SRC)/fps.h
toaster_base.o: $(srcdir)/gllist.h
+toaster_base.o: $(HACK_SRC)/recanim.h
+toaster_base.o: $(HACK_SRC)/screenhackI.h
+toaster_base.o: $(UTILS_SRC)/colors.h
+toaster_base.o: $(UTILS_SRC)/erase.h
+toaster_base.o: $(UTILS_SRC)/font-retry.h
+toaster_base.o: $(UTILS_SRC)/grabscreen.h
+toaster_base.o: $(UTILS_SRC)/hsv.h
+toaster_base.o: $(UTILS_SRC)/resources.h
+toaster_base.o: $(UTILS_SRC)/usleep.h
+toaster_base.o: $(UTILS_SRC)/visual.h
+toaster_base.o: $(UTILS_SRC)/xft.h
+toaster_base.o: $(UTILS_SRC)/yarandom.h
+toaster_base.o: $(HACK_SRC)/xlockmoreI.h
toaster_handle2.o: ../../config.h
+toaster_handle2.o: $(HACK_SRC)/fps.h
toaster_handle2.o: $(srcdir)/gllist.h
+toaster_handle2.o: $(HACK_SRC)/recanim.h
+toaster_handle2.o: $(HACK_SRC)/screenhackI.h
+toaster_handle2.o: $(UTILS_SRC)/colors.h
+toaster_handle2.o: $(UTILS_SRC)/erase.h
+toaster_handle2.o: $(UTILS_SRC)/font-retry.h
+toaster_handle2.o: $(UTILS_SRC)/grabscreen.h
+toaster_handle2.o: $(UTILS_SRC)/hsv.h
+toaster_handle2.o: $(UTILS_SRC)/resources.h
+toaster_handle2.o: $(UTILS_SRC)/usleep.h
+toaster_handle2.o: $(UTILS_SRC)/visual.h
+toaster_handle2.o: $(UTILS_SRC)/xft.h
+toaster_handle2.o: $(UTILS_SRC)/yarandom.h
+toaster_handle2.o: $(HACK_SRC)/xlockmoreI.h
toaster_handle.o: ../../config.h
+toaster_handle.o: $(HACK_SRC)/fps.h
toaster_handle.o: $(srcdir)/gllist.h
+toaster_handle.o: $(HACK_SRC)/recanim.h
+toaster_handle.o: $(HACK_SRC)/screenhackI.h
+toaster_handle.o: $(UTILS_SRC)/colors.h
+toaster_handle.o: $(UTILS_SRC)/erase.h
+toaster_handle.o: $(UTILS_SRC)/font-retry.h
+toaster_handle.o: $(UTILS_SRC)/grabscreen.h
+toaster_handle.o: $(UTILS_SRC)/hsv.h
+toaster_handle.o: $(UTILS_SRC)/resources.h
+toaster_handle.o: $(UTILS_SRC)/usleep.h
+toaster_handle.o: $(UTILS_SRC)/visual.h
+toaster_handle.o: $(UTILS_SRC)/xft.h
+toaster_handle.o: $(UTILS_SRC)/yarandom.h
+toaster_handle.o: $(HACK_SRC)/xlockmoreI.h
toaster_jet.o: ../../config.h
+toaster_jet.o: $(HACK_SRC)/fps.h
toaster_jet.o: $(srcdir)/gllist.h
+toaster_jet.o: $(HACK_SRC)/recanim.h
+toaster_jet.o: $(HACK_SRC)/screenhackI.h
+toaster_jet.o: $(UTILS_SRC)/colors.h
+toaster_jet.o: $(UTILS_SRC)/erase.h
+toaster_jet.o: $(UTILS_SRC)/font-retry.h
+toaster_jet.o: $(UTILS_SRC)/grabscreen.h
+toaster_jet.o: $(UTILS_SRC)/hsv.h
+toaster_jet.o: $(UTILS_SRC)/resources.h
+toaster_jet.o: $(UTILS_SRC)/usleep.h
+toaster_jet.o: $(UTILS_SRC)/visual.h
+toaster_jet.o: $(UTILS_SRC)/xft.h
+toaster_jet.o: $(UTILS_SRC)/yarandom.h
+toaster_jet.o: $(HACK_SRC)/xlockmoreI.h
toaster_knob.o: ../../config.h
+toaster_knob.o: $(HACK_SRC)/fps.h
toaster_knob.o: $(srcdir)/gllist.h
+toaster_knob.o: $(HACK_SRC)/recanim.h
+toaster_knob.o: $(HACK_SRC)/screenhackI.h
+toaster_knob.o: $(UTILS_SRC)/colors.h
+toaster_knob.o: $(UTILS_SRC)/erase.h
+toaster_knob.o: $(UTILS_SRC)/font-retry.h
+toaster_knob.o: $(UTILS_SRC)/grabscreen.h
+toaster_knob.o: $(UTILS_SRC)/hsv.h
+toaster_knob.o: $(UTILS_SRC)/resources.h
+toaster_knob.o: $(UTILS_SRC)/usleep.h
+toaster_knob.o: $(UTILS_SRC)/visual.h
+toaster_knob.o: $(UTILS_SRC)/xft.h
+toaster_knob.o: $(UTILS_SRC)/yarandom.h
+toaster_knob.o: $(HACK_SRC)/xlockmoreI.h
toaster.o: ../../config.h
+toaster.o: $(HACK_SRC)/fps.h
toaster.o: $(srcdir)/gllist.h
+toaster.o: $(HACK_SRC)/recanim.h
+toaster.o: $(HACK_SRC)/screenhackI.h
+toaster.o: $(UTILS_SRC)/colors.h
+toaster.o: $(UTILS_SRC)/erase.h
+toaster.o: $(UTILS_SRC)/font-retry.h
+toaster.o: $(UTILS_SRC)/grabscreen.h
+toaster.o: $(UTILS_SRC)/hsv.h
+toaster.o: $(UTILS_SRC)/resources.h
+toaster.o: $(UTILS_SRC)/usleep.h
+toaster.o: $(UTILS_SRC)/visual.h
+toaster.o: $(UTILS_SRC)/xft.h
+toaster.o: $(UTILS_SRC)/yarandom.h
+toaster.o: $(HACK_SRC)/xlockmoreI.h
toaster_slots.o: ../../config.h
+toaster_slots.o: $(HACK_SRC)/fps.h
toaster_slots.o: $(srcdir)/gllist.h
+toaster_slots.o: $(HACK_SRC)/recanim.h
+toaster_slots.o: $(HACK_SRC)/screenhackI.h
+toaster_slots.o: $(UTILS_SRC)/colors.h
+toaster_slots.o: $(UTILS_SRC)/erase.h
+toaster_slots.o: $(UTILS_SRC)/font-retry.h
+toaster_slots.o: $(UTILS_SRC)/grabscreen.h
+toaster_slots.o: $(UTILS_SRC)/hsv.h
+toaster_slots.o: $(UTILS_SRC)/resources.h
+toaster_slots.o: $(UTILS_SRC)/usleep.h
+toaster_slots.o: $(UTILS_SRC)/visual.h
+toaster_slots.o: $(UTILS_SRC)/xft.h
+toaster_slots.o: $(UTILS_SRC)/yarandom.h
+toaster_slots.o: $(HACK_SRC)/xlockmoreI.h
toaster_wing.o: ../../config.h
+toaster_wing.o: $(HACK_SRC)/fps.h
toaster_wing.o: $(srcdir)/gllist.h
+toaster_wing.o: $(HACK_SRC)/recanim.h
+toaster_wing.o: $(HACK_SRC)/screenhackI.h
+toaster_wing.o: $(UTILS_SRC)/colors.h
+toaster_wing.o: $(UTILS_SRC)/erase.h
+toaster_wing.o: $(UTILS_SRC)/font-retry.h
+toaster_wing.o: $(UTILS_SRC)/grabscreen.h
+toaster_wing.o: $(UTILS_SRC)/hsv.h
+toaster_wing.o: $(UTILS_SRC)/resources.h
+toaster_wing.o: $(UTILS_SRC)/usleep.h
+toaster_wing.o: $(UTILS_SRC)/visual.h
+toaster_wing.o: $(UTILS_SRC)/xft.h
+toaster_wing.o: $(UTILS_SRC)/yarandom.h
+toaster_wing.o: $(HACK_SRC)/xlockmoreI.h
toast.o: ../../config.h
+toast.o: $(HACK_SRC)/fps.h
toast.o: $(srcdir)/gllist.h
+toast.o: $(HACK_SRC)/recanim.h
+toast.o: $(HACK_SRC)/screenhackI.h
+toast.o: $(UTILS_SRC)/colors.h
+toast.o: $(UTILS_SRC)/erase.h
+toast.o: $(UTILS_SRC)/font-retry.h
+toast.o: $(UTILS_SRC)/grabscreen.h
+toast.o: $(UTILS_SRC)/hsv.h
+toast.o: $(UTILS_SRC)/resources.h
+toast.o: $(UTILS_SRC)/usleep.h
+toast.o: $(UTILS_SRC)/visual.h
+toast.o: $(UTILS_SRC)/xft.h
+toast.o: $(UTILS_SRC)/yarandom.h
+toast.o: $(HACK_SRC)/xlockmoreI.h
topblock.o: ../../config.h
topblock.o: $(HACK_SRC)/fps.h
topblock.o: $(srcdir)/gltrackball.h
@@ -3432,17 +4503,60 @@ topblock.o: $(UTILS_SRC)/hsv.h
topblock.o: $(UTILS_SRC)/resources.h
topblock.o: $(UTILS_SRC)/usleep.h
topblock.o: $(UTILS_SRC)/visual.h
+topblock.o: $(UTILS_SRC)/xft.h
topblock.o: $(UTILS_SRC)/yarandom.h
topblock.o: $(HACK_SRC)/xlockmoreI.h
topblock.o: $(HACK_SRC)/xlockmore.h
trackball.o: ../../config.h
trackball.o: $(srcdir)/trackball.h
tronbit_idle1.o: ../../config.h
+tronbit_idle1.o: $(HACK_SRC)/fps.h
tronbit_idle1.o: $(srcdir)/gllist.h
+tronbit_idle1.o: $(HACK_SRC)/recanim.h
+tronbit_idle1.o: $(HACK_SRC)/screenhackI.h
+tronbit_idle1.o: $(UTILS_SRC)/colors.h
+tronbit_idle1.o: $(UTILS_SRC)/erase.h
+tronbit_idle1.o: $(UTILS_SRC)/font-retry.h
+tronbit_idle1.o: $(UTILS_SRC)/grabscreen.h
+tronbit_idle1.o: $(UTILS_SRC)/hsv.h
+tronbit_idle1.o: $(UTILS_SRC)/resources.h
+tronbit_idle1.o: $(UTILS_SRC)/usleep.h
+tronbit_idle1.o: $(UTILS_SRC)/visual.h
+tronbit_idle1.o: $(UTILS_SRC)/xft.h
+tronbit_idle1.o: $(UTILS_SRC)/yarandom.h
+tronbit_idle1.o: $(HACK_SRC)/xlockmoreI.h
tronbit_idle2.o: ../../config.h
+tronbit_idle2.o: $(HACK_SRC)/fps.h
tronbit_idle2.o: $(srcdir)/gllist.h
+tronbit_idle2.o: $(HACK_SRC)/recanim.h
+tronbit_idle2.o: $(HACK_SRC)/screenhackI.h
+tronbit_idle2.o: $(UTILS_SRC)/colors.h
+tronbit_idle2.o: $(UTILS_SRC)/erase.h
+tronbit_idle2.o: $(UTILS_SRC)/font-retry.h
+tronbit_idle2.o: $(UTILS_SRC)/grabscreen.h
+tronbit_idle2.o: $(UTILS_SRC)/hsv.h
+tronbit_idle2.o: $(UTILS_SRC)/resources.h
+tronbit_idle2.o: $(UTILS_SRC)/usleep.h
+tronbit_idle2.o: $(UTILS_SRC)/visual.h
+tronbit_idle2.o: $(UTILS_SRC)/xft.h
+tronbit_idle2.o: $(UTILS_SRC)/yarandom.h
+tronbit_idle2.o: $(HACK_SRC)/xlockmoreI.h
tronbit_no.o: ../../config.h
+tronbit_no.o: $(HACK_SRC)/fps.h
tronbit_no.o: $(srcdir)/gllist.h
+tronbit_no.o: $(HACK_SRC)/recanim.h
+tronbit_no.o: $(HACK_SRC)/screenhackI.h
+tronbit_no.o: $(UTILS_SRC)/colors.h
+tronbit_no.o: $(UTILS_SRC)/erase.h
+tronbit_no.o: $(UTILS_SRC)/font-retry.h
+tronbit_no.o: $(UTILS_SRC)/grabscreen.h
+tronbit_no.o: $(UTILS_SRC)/hsv.h
+tronbit_no.o: $(UTILS_SRC)/resources.h
+tronbit_no.o: $(UTILS_SRC)/usleep.h
+tronbit_no.o: $(UTILS_SRC)/visual.h
+tronbit_no.o: $(UTILS_SRC)/xft.h
+tronbit_no.o: $(UTILS_SRC)/yarandom.h
+tronbit_no.o: $(HACK_SRC)/xlockmoreI.h
tronbit.o: ../../config.h
tronbit.o: $(HACK_SRC)/fps.h
tronbit.o: $(srcdir)/gllist.h
@@ -3459,28 +4573,54 @@ tronbit.o: $(UTILS_SRC)/hsv.h
tronbit.o: $(UTILS_SRC)/resources.h
tronbit.o: $(UTILS_SRC)/usleep.h
tronbit.o: $(UTILS_SRC)/visual.h
+tronbit.o: $(UTILS_SRC)/xft.h
tronbit.o: $(UTILS_SRC)/yarandom.h
tronbit.o: $(HACK_SRC)/xlockmoreI.h
tronbit.o: $(HACK_SRC)/xlockmore.h
tronbit_yes.o: ../../config.h
+tronbit_yes.o: $(HACK_SRC)/fps.h
tronbit_yes.o: $(srcdir)/gllist.h
+tronbit_yes.o: $(HACK_SRC)/recanim.h
+tronbit_yes.o: $(HACK_SRC)/screenhackI.h
+tronbit_yes.o: $(UTILS_SRC)/colors.h
+tronbit_yes.o: $(UTILS_SRC)/erase.h
+tronbit_yes.o: $(UTILS_SRC)/font-retry.h
+tronbit_yes.o: $(UTILS_SRC)/grabscreen.h
+tronbit_yes.o: $(UTILS_SRC)/hsv.h
+tronbit_yes.o: $(UTILS_SRC)/resources.h
+tronbit_yes.o: $(UTILS_SRC)/usleep.h
+tronbit_yes.o: $(UTILS_SRC)/visual.h
+tronbit_yes.o: $(UTILS_SRC)/xft.h
+tronbit_yes.o: $(UTILS_SRC)/yarandom.h
+tronbit_yes.o: $(HACK_SRC)/xlockmoreI.h
tube.o: ../../config.h
+tube.o: $(HACK_SRC)/fps.h
+tube.o: $(HACK_SRC)/recanim.h
+tube.o: $(HACK_SRC)/screenhackI.h
tube.o: $(srcdir)/tube.h
+tube.o: $(UTILS_SRC)/colors.h
+tube.o: $(UTILS_SRC)/font-retry.h
+tube.o: $(UTILS_SRC)/grabscreen.h
+tube.o: $(UTILS_SRC)/hsv.h
+tube.o: $(UTILS_SRC)/resources.h
+tube.o: $(UTILS_SRC)/usleep.h
+tube.o: $(UTILS_SRC)/visual.h
+tube.o: $(UTILS_SRC)/xft.h
+tube.o: $(UTILS_SRC)/yarandom.h
tunnel_draw.o: ../../config.h
tunnel_draw.o: $(HACK_SRC)/fps.h
tunnel_draw.o: $(HACK_SRC)/recanim.h
tunnel_draw.o: $(HACK_SRC)/screenhackI.h
tunnel_draw.o: $(srcdir)/tunnel_draw.h
tunnel_draw.o: $(UTILS_SRC)/colors.h
-tunnel_draw.o: $(UTILS_SRC)/erase.h
tunnel_draw.o: $(UTILS_SRC)/font-retry.h
tunnel_draw.o: $(UTILS_SRC)/grabscreen.h
tunnel_draw.o: $(UTILS_SRC)/hsv.h
tunnel_draw.o: $(UTILS_SRC)/resources.h
tunnel_draw.o: $(UTILS_SRC)/usleep.h
tunnel_draw.o: $(UTILS_SRC)/visual.h
+tunnel_draw.o: $(UTILS_SRC)/xft.h
tunnel_draw.o: $(UTILS_SRC)/yarandom.h
-tunnel_draw.o: $(HACK_SRC)/xlockmoreI.h
unicrud.o: ../../config.h
unicrud.o: $(HACK_SRC)/fps.h
unicrud.o: $(srcdir)/gltrackball.h
@@ -3497,6 +4637,7 @@ unicrud.o: $(UTILS_SRC)/resources.h
unicrud.o: $(UTILS_SRC)/usleep.h
unicrud.o: $(UTILS_SRC)/utf8wc.h
unicrud.o: $(UTILS_SRC)/visual.h
+unicrud.o: $(UTILS_SRC)/xft.h
unicrud.o: $(UTILS_SRC)/yarandom.h
unicrud.o: $(HACK_SRC)/xlockmoreI.h
unicrud.o: $(HACK_SRC)/xlockmore.h
@@ -3514,6 +4655,7 @@ unknownpleasures.o: $(UTILS_SRC)/hsv.h
unknownpleasures.o: $(UTILS_SRC)/resources.h
unknownpleasures.o: $(UTILS_SRC)/usleep.h
unknownpleasures.o: $(UTILS_SRC)/visual.h
+unknownpleasures.o: $(UTILS_SRC)/xft.h
unknownpleasures.o: $(UTILS_SRC)/yarandom.h
unknownpleasures.o: $(HACK_SRC)/ximage-loader.h
unknownpleasures.o: $(HACK_SRC)/xlockmoreI.h
@@ -3533,6 +4675,7 @@ vigilance.o: $(UTILS_SRC)/hsv.h
vigilance.o: $(UTILS_SRC)/resources.h
vigilance.o: $(UTILS_SRC)/usleep.h
vigilance.o: $(UTILS_SRC)/visual.h
+vigilance.o: $(UTILS_SRC)/xft.h
vigilance.o: $(UTILS_SRC)/yarandom.h
vigilance.o: $(HACK_SRC)/ximage-loader.h
vigilance.o: $(HACK_SRC)/xlockmoreI.h
@@ -3549,6 +4692,7 @@ voronoi.o: $(UTILS_SRC)/hsv.h
voronoi.o: $(UTILS_SRC)/resources.h
voronoi.o: $(UTILS_SRC)/usleep.h
voronoi.o: $(UTILS_SRC)/visual.h
+voronoi.o: $(UTILS_SRC)/xft.h
voronoi.o: $(UTILS_SRC)/yarandom.h
voronoi.o: $(HACK_SRC)/xlockmoreI.h
voronoi.o: $(HACK_SRC)/xlockmore.h
@@ -3558,13 +4702,16 @@ whale.o: $(HACK_SRC)/fps.h
whale.o: $(HACK_SRC)/recanim.h
whale.o: $(HACK_SRC)/screenhackI.h
whale.o: $(UTILS_SRC)/colors.h
+whale.o: $(UTILS_SRC)/erase.h
whale.o: $(UTILS_SRC)/font-retry.h
whale.o: $(UTILS_SRC)/grabscreen.h
whale.o: $(UTILS_SRC)/hsv.h
whale.o: $(UTILS_SRC)/resources.h
whale.o: $(UTILS_SRC)/usleep.h
whale.o: $(UTILS_SRC)/visual.h
+whale.o: $(UTILS_SRC)/xft.h
whale.o: $(UTILS_SRC)/yarandom.h
+whale.o: $(HACK_SRC)/xlockmoreI.h
winduprobot.o: ../../config.h
winduprobot.o: $(HACK_SRC)/fps.h
winduprobot.o: $(srcdir)/gllist.h
@@ -3584,6 +4731,7 @@ winduprobot.o: $(UTILS_SRC)/resources.h
winduprobot.o: $(UTILS_SRC)/textclient.h
winduprobot.o: $(UTILS_SRC)/usleep.h
winduprobot.o: $(UTILS_SRC)/visual.h
+winduprobot.o: $(UTILS_SRC)/xft.h
winduprobot.o: $(UTILS_SRC)/yarandom.h
winduprobot.o: $(HACK_SRC)/ximage-loader.h
winduprobot.o: $(HACK_SRC)/xlockmoreI.h
@@ -3601,9 +4749,9 @@ xlock-gl-utils.o: $(UTILS_SRC)/hsv.h
xlock-gl-utils.o: $(UTILS_SRC)/resources.h
xlock-gl-utils.o: $(UTILS_SRC)/usleep.h
xlock-gl-utils.o: $(UTILS_SRC)/visual.h
+xlock-gl-utils.o: $(UTILS_SRC)/xft.h
xlock-gl-utils.o: $(UTILS_SRC)/yarandom.h
xlock-gl-utils.o: $(HACK_SRC)/xlockmoreI.h
-xscreensaver-gl-helper.o: ../../config.h
-xscreensaver-gl-helper.o: $(UTILS_SRC)/utils.h
-xscreensaver-gl-helper.o: $(UTILS_SRC)/visual.h
+xscreensaver-gl-visual.o: ../../config.h
+xscreensaver-gl-visual.o: $(UTILS_SRC)/visual.h
diff --git a/hacks/glx/README b/hacks/glx/README
index 5142503..1b7b3e8 100644
--- a/hacks/glx/README
+++ b/hacks/glx/README
@@ -5,6 +5,5 @@ but some of them use the utility functions found in the ../../utils/ directory.
If you have compilation problems, check the parameters in ../../config.h.
-If you're looking for a free implementation of the OpenGL library,
-check out <http://www.mesa3d.org/>. For general OpenGL info, see
-<http://www.opengl.org/>.
+Writing a screen saver? Make sure you have read ../../README.hacking.
+
diff --git a/hacks/glx/antinspect.c b/hacks/glx/antinspect.c
index 8f2152b..913503f 100644
--- a/hacks/glx/antinspect.c
+++ b/hacks/glx/antinspect.c
@@ -25,18 +25,6 @@
#include "xlock.h"
#endif
-#ifdef HAVE_JWXYZ
-# include "jwxyz.h"
-#else
-# include <X11/Xlib.h>
-# include <GL/gl.h>
-# include <GL/glu.h>
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
#include "sphere.h"
#include "gltrackball.h"
@@ -656,15 +644,12 @@ ENTRYPOINT void draw_antinspect(ModeInfo * mi)
the antbubble */
glTranslatef(0.0, 0.0, -10.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
- glRotatef(o, 0, 0, 1);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
gltrackball_rotate(mp->trackball);
glRotatef((15.0/2.0 + 15.0*sin(mp->ant_step/100.0)), 1.0, 0.0, 0.0);
diff --git a/hacks/glx/antinspect.man b/hacks/glx/antinspect.man
index 804d7a4..ba5d06b 100644
--- a/hacks/glx/antinspect.man
+++ b/hacks/glx/antinspect.man
@@ -41,8 +41,8 @@ stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1)
-.BR xscreensaver\-demo (1),
-.BR xscreensaver\-getimage (1)
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-getimage (MANSUFFIX)
.SH COPYRIGHT
Copyright \(co 2004 by Blair Tennessy. Permission to use, copy, modify,
distribute, and sell this software and its documentation for any purpose is
diff --git a/hacks/glx/antmaze.c b/hacks/glx/antmaze.c
index 6853b35..fe9905f 100644
--- a/hacks/glx/antmaze.c
+++ b/hacks/glx/antmaze.c
@@ -31,18 +31,6 @@ static const char sccsid[] = "@(#)antmaze.c 5.01 2001/03/01 xlockmore";
# include "xlock.h" /* from the xlockmore distribution */
#endif /* !STANDALONE */
-#ifdef HAVE_JWXYZ
-# include "jwxyz.h"
-#else
-# include <X11/Xlib.h>
-# include <GL/gl.h>
-# include <GL/glu.h>
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
#ifdef MODE_antmaze
@@ -106,7 +94,7 @@ ModStruct antmaze_description =
#include "ants.h"
#define ANTCOUNT 5
-#define PI 3.14157
+#define PI M_PI
#define EPSILON 0.01
#define BOARDSIZE 10
diff --git a/hacks/glx/antmaze.man b/hacks/glx/antmaze.man
index 4c4bec8..cca7add 100644
--- a/hacks/glx/antmaze.man
+++ b/hacks/glx/antmaze.man
@@ -37,8 +37,8 @@ stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1)
-.BR xscreensaver\-demo (1),
-.BR xscreensaver\-getimage (1)
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-getimage (MANSUFFIX)
.SH COPYRIGHT
Copyright \(co 2005 by Blair Tennessy. Permission to use, copy, modify,
distribute, and sell this software and its documentation for any purpose is
diff --git a/hacks/glx/antspotlight.c b/hacks/glx/antspotlight.c
index f5e1e69..5c416bc 100644
--- a/hacks/glx/antspotlight.c
+++ b/hacks/glx/antspotlight.c
@@ -25,18 +25,6 @@
#include "xlock.h"
#endif
-#ifdef HAVE_JWXYZ
-# include "jwxyz.h"
-#else
-# include <X11/Xlib.h>
-# include <GL/gl.h>
-# include <GL/glu.h>
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
#include "sphere.h"
#include "tube.h"
#include "rotator.h"
diff --git a/hacks/glx/antspotlight.man b/hacks/glx/antspotlight.man
index c5f8ed7..f1c74b4 100644
--- a/hacks/glx/antspotlight.man
+++ b/hacks/glx/antspotlight.man
@@ -41,8 +41,8 @@ stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1)
-.BR xscreensaver\-demo (1),
-.BR xscreensaver\-getimage (1)
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-getimage (MANSUFFIX)
.SH COPYRIGHT
Copyright \(co 2003 by Blair Tennessy. Permission to use, copy, modify,
distribute, and sell this software and its documentation for any purpose is
diff --git a/hacks/glx/atlantis.h b/hacks/glx/atlantis.h
index 3b24bfa..dce68ac 100644
--- a/hacks/glx/atlantis.h
+++ b/hacks/glx/atlantis.h
@@ -68,28 +68,13 @@
* OpenGL(TM) is a trademark of Silicon Graphics, Inc.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
-
#ifdef STANDALONE
-# include <math.h>
-# include "screenhackI.h"
-# ifndef HAVE_JWXYZ
-# include <GL/gl.h>
-# include <GL/glx.h>
-# endif
+# include "xlockmoreI.h"
#else
# include "xlock.h"
#endif
-#ifdef HAVE_ANDROID
-#include <GLES/gl.h>
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
+#include <math.h>
#define RAD 57.295
#define RRAD 0.01745
diff --git a/hacks/glx/atlantis.man b/hacks/glx/atlantis.man
index 0c2df5a..1a77391 100644
--- a/hacks/glx/atlantis.man
+++ b/hacks/glx/atlantis.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-atlantis - draw swimming sharks, whales, and dolphins.
+atlantis \- draw swimming sharks, whales, and dolphins.
.SH SYNOPSIS
.B atlantis
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/atunnel.c b/hacks/glx/atunnel.c
index 1b8fb07..f09684c 100644
--- a/hacks/glx/atunnel.c
+++ b/hacks/glx/atunnel.c
@@ -72,9 +72,6 @@ static const char sccsid[] = "@(#)atunnel.c 5.13 2004/05/25 xlockmore";
#endif /* HAVE_XPM */
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#define DEF_LIGHT "True"
#define DEF_WIRE "False"
#define DEF_TEXTURE "True"
diff --git a/hacks/glx/atunnel.man b/hacks/glx/atunnel.man
index dc19582..6debadf 100644
--- a/hacks/glx/atunnel.man
+++ b/hacks/glx/atunnel.man
@@ -1,19 +1,6 @@
-.de EX \"Begin example
-.ne 5
-.if n .sp 1
-.if t .sp .5
-.nf
-.in +.5i
-..
-.de EE
-.fi
-.in -.5i
-.if n .sp 1
-.if t .sp .5
-..
.TH XScreenSaver 1 "12-Feb-03" "X Version 11"
.SH NAME
-atunnel - hypnotic GL tunnel journey
+atunnel \- hypnotic GL tunnel journey
.SH SYNOPSIS
.B sballs
[\-display \fIhost:display.screen\fP] [\-window] [\-root]
diff --git a/hacks/glx/b_lockglue.c b/hacks/glx/b_lockglue.c
index d134a66..5c74c80 100644
--- a/hacks/glx/b_lockglue.c
+++ b/hacks/glx/b_lockglue.c
@@ -58,9 +58,6 @@ struct glb_config glb_config =
static Bool transparent_p;
static char *bubble_color_str;
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
static XrmOptionDescRec opts[] = {
{ "-transparent", ".transparent", XrmoptionNoArg, "True" },
{ "+transparent", ".transparent", XrmoptionNoArg, "False" },
@@ -200,15 +197,15 @@ draw_bubble3d(ModeInfo * mi)
glb_config.polygon_count = 0;
glPushMatrix();
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
- glRotatef(o, 0, 0, 1);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ /* Portrait needs to be a little zoomed in or else
+ the bubbles pop into existence already on-screen. */
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi)) * 1.5
+ : 1);
+ glRotatef (current_device_rotation(), 0, 0, 1);
+ glScalef (s, s, s);
}
-# endif
do_display(c);
glPopMatrix();
diff --git a/hacks/glx/beats.c b/hacks/glx/beats.c
new file mode 100644
index 0000000..67a6eb8
--- /dev/null
+++ b/hacks/glx/beats.c
@@ -0,0 +1,439 @@
+/* beats, Copyright (c) 2020 David Eccles (gringer) <hacking@gringene.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation. No representations are made
+ * about the suitability of this software for any purpose. It is
+ * provided "as is" without express or implied warranty.
+ */
+
+/* Beats changes the position of objects in time with a
+ * synchronisation signal (or more correctly, based on the time
+ * elapsed since the last synchronisation point). By default, the
+ * system clock is used for this signal, with synchronisation
+ * happening every minute. The location of objects is entirely
+ * dependant on this synchronisation signal; there is no multi-object
+ * state that needs to be stored, although there may be some styling
+ * state required.
+ */
+
+#define DEFAULTS "*count: 30 \n" \
+ "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+# define release_beats 0
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "sphere.h"
+#include "hsv.h"
+#include <ctype.h>
+#include <sys/time.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_CYCLE "-1"
+#define DEF_TICK "True"
+#define DEF_BLUR "True"
+
+#define SPHERE_SLICES 16 /* how densely to render spheres */
+#define SPHERE_STACKS 16
+
+
+typedef struct {
+ GLXContext *glx_context;
+ Bool button_down_p;
+
+ GLuint beats_list;
+
+ GLfloat pos;
+
+ int ball_count; /* Number of balls */
+ int preset_cycle; /* Cycle to show (-1 for random) */
+ Bool use_tick; /* Add tick for clockwise / galaxy */
+ Bool use_blur; /* Motion blur */
+ int ncolors;
+ XColor *colors;
+ int ccolor;
+ int color_shift;
+
+} beats_configuration;
+
+static beats_configuration *bps = NULL;
+
+static int cycle_arg;
+static Bool tick_arg;
+static Bool blur_arg;
+
+static XrmOptionDescRec opts[] = {
+ { "-cycle", ".cycle", XrmoptionSepArg, 0 },
+ { "-count", ".count", XrmoptionSepArg, 0 },
+ { "-tick", ".tick", XrmoptionNoArg, "on" },
+ { "+tick", ".tick", XrmoptionNoArg, "off" },
+ { "-blur", ".blur", XrmoptionNoArg, "on" },
+ { "+blur", ".blur", XrmoptionNoArg, "off" }
+};
+
+static argtype vars[] = {
+ {&cycle_arg, "cycle", "Cycle", DEF_CYCLE, t_Int},
+ {&tick_arg, "tick", "Tick", DEF_TICK, t_Bool},
+ {&blur_arg, "blur", "Blur", DEF_BLUR, t_Bool}
+};
+
+static OptionStruct desc[] = {
+ {"-count num", "number of balls"},
+ {"-cycle num", "cycle / pattern type"},
+ {"-/+tick", "enable/disable tick for clockwise and galaxy"},
+ {"-/+blur", "enable/disable motion blur"}
+};
+
+ENTRYPOINT ModeSpecOpt beats_opts =
+ {countof(opts), opts, countof(vars), vars, desc};
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_beats (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+beats_handle_event (ModeInfo *mi, XEvent *event)
+{
+ return True;
+}
+
+static Bool getFracColour (GLfloat* retVal, float posFrac, float s){
+ /* top: red, right: yellow, bottom: [dark] green, left: blue */
+ /* note: fixed point; align to 0.1 degree increments */
+ int theta, h, v;
+ unsigned short r,g,b;
+ theta = ((int)(posFrac * 3600) % 3600 + 3600) % 3600;
+ v = 100;
+ if ((theta >= 0) && (theta < 900)) {
+ h = (theta * 600) / 900;
+ } else if ((theta >= 900) && (theta < 1800)) {
+ h = ((theta - 900) * 600) / 900 + 600;
+ v = 100 - ((theta - 900) / 18);
+ } else if ((theta >= 1800) && (theta < 2700)) {
+ h = ((theta - 1800) * 1200) / 900 + 1200;
+ v = ((theta - 1800) / 18) + 50;
+ } else /* if ((theta >= 2700) && (theta < 3600))*/ {
+ h = ((theta - 2700) * 1200) / 900 + 2400;
+ }
+ hsv_to_rgb((int)h / 10.0, s, v / 100.0, &r, &g, &b);
+ retVal[0] = r / 65535.0;
+ retVal[1] = g / 65535.0;
+ retVal[2] = b / 65535.0;
+ return True;
+}
+
+
+ENTRYPOINT void
+init_beats (ModeInfo *mi)
+{
+ beats_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, bps);
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_beats (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.02, 0.02, 0.02, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.2, 0.2, 0.2, 0.2};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+ glEnable(GL_LIGHT0);
+ }
+
+ if (cycle_arg > 3) cycle_arg = -1;
+
+ bp->ball_count = MI_COUNT(mi);
+ if (bp->ball_count < 2) bp->ball_count = 2;
+
+ bp->preset_cycle = cycle_arg;
+ bp->use_tick = tick_arg;
+ bp->use_blur = blur_arg;
+
+# ifdef HAVE_ANDROID
+ bp->use_blur = False; /* Works on iOS but not Android */
+# endif
+
+ bp->ncolors = 128;
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+
+ bp->beats_list = glGenLists(1);
+
+ glNewList (bp->beats_list, GL_COMPILE);
+ glScalef(0.71, 0.71, 0.71);
+ unit_sphere (SPHERE_STACKS, SPHERE_SLICES, wire);
+ glEndList ();
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+
+ENTRYPOINT void
+draw_beats (ModeInfo *mi)
+{
+ beats_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ unsigned num_objects = bp->ball_count, oi;
+ struct timeval tv, tvOrig;
+ struct tm *now;
+ Bool sineWaveTick = bp->use_tick;
+ Bool motionBlur = bp->use_blur;
+ size_t cycle, dist;
+ unsigned int tmS, tmM, tmH, tmD;
+ unsigned int timeSeed;
+ int timeDelta = 0;
+ size_t blurOffset = 10; /* offset per blur frame, in milliseconds */
+ size_t framesPerBlur = 20; /* number of sub-frames to blur */
+ size_t deltaLimit = (motionBlur) ? (blurOffset * framesPerBlur) : 1;
+ float ballAlpha;
+ float secFrac, minFrac, minProp, hourProp, halfDayProp,
+ z, op, mp, m2m,
+ theta, delta, blurFrac, oFP, pathLength;
+
+ static const GLfloat bspec[4] = {1.0, 1.0, 1.0, 1.0};
+ static const GLfloat bshiny = 92.0;
+
+ GLfloat bcolor[4] = {0.85, 0.75, 0.75, 1.0};
+
+ if (!bp->glx_context)
+ return;
+ gettimeofday (&tvOrig, NULL);
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
+
+ glShadeModel(GL_SMOOTH);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_ALPHA_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_BLEND);
+ glEnable(GL_DEPTH_TEST);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glPushMatrix ();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ {
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi)
+ : 1);
+ glScalef (s, s, s);
+ }
+
+ /* timeDelta is in milliseconds */
+ for(timeDelta = 0; timeDelta <= deltaLimit; timeDelta += blurOffset){
+ if(timeDelta < blurOffset){
+ /* glEnable(GL_DEPTH_TEST); */
+ ballAlpha = 1.0;
+ } else {
+ /* glDisable(GL_DEPTH_TEST); */
+ ballAlpha = 1.0 / framesPerBlur;
+ }
+ blurFrac = sin((1 - (float) timeDelta / deltaLimit) * M_PI_2) * ballAlpha;
+ tv = tvOrig;
+ now = localtime (&tv.tv_sec); /* This seems to be needed for seconds */
+ tmS = now->tm_sec;
+ tmM = now->tm_min;
+ tmH = now->tm_hour;
+ tmD = now->tm_yday;
+ secFrac = ((tv.tv_usec % 1000000) - (timeDelta * 1000)) / (1e6);
+ if(secFrac < 0){
+ secFrac += 1;
+ tmS--;
+ if(tmS < 0){
+ tmS += 60;
+ tmM--;
+ }
+ if(tmM < 0){
+ tmM += 60;
+ tmH--;
+ }
+ if(tmH < 0){
+ tmH += 24;
+ tmD--;
+ }
+ if(tmD < 0){
+ /* note: this won't be accurate for leap years, but the rare
+ event logic is complex enough */
+ tmD += 365;
+ }
+ }
+ /* pseudo-random generator based on current minute */
+ timeSeed = (((tmM+1) * (tmM+1) * ((tmH+1) * 37) *
+ ((tmD+1) * 1151) * 1233599) % 653);
+ cycle = timeSeed % 4;
+ if(bp->preset_cycle != -1){
+ cycle = bp->preset_cycle;
+ }
+ if(sineWaveTick && (cycle == 0 || cycle == 3)){
+ Bool doTick = (timeSeed % 2 == 0);
+ if(doTick){ /* choose to tick randomly */
+ /* sine-wave 'tick' motion, converts linear 0..1 to
+ pause/fast/pause 0..1 */
+ secFrac = (1.0 - sin((0.5-secFrac) * M_PI))/2.0;
+ }
+ }
+ minFrac = tmS / 60.0;
+ /* now we have enough information to calculate our goal statistic,
+ minProp: the position in the synchronisation cycle of one
+ minute */
+ minProp = (minFrac - trunc(minFrac)) + (secFrac / 60);
+ m2m = minProp * 2 * M_PI;
+
+ /* change colour based on the minute and hour */
+ hourProp = tmM / 60.0 + minProp / 60.0;
+ hourProp = hourProp - trunc(hourProp);
+
+ halfDayProp = tmH / 12.0 + hourProp / 12.0;
+ halfDayProp = halfDayProp - trunc(halfDayProp);
+
+ mi->polygon_count = 0;
+
+ for(oi = 0; oi < num_objects; oi++){
+ glPushMatrix ();
+ glScalef(1.1, 1.1, 1.1);
+
+ /* Object Fraction Position - 0..1 depending on native Z order */
+ oFP = oi * 1.0 / (num_objects - 1);
+
+ /* set Z distance between [-3.5 .. 0.5] (common to all cycles) */
+ z = (oFP) * 4.0 - 3.5;
+
+ /* set colour (common to all cycles) */
+ if(oFP < (1 / 3.0)){ /* "second" objects */
+ getFracColour(bcolor, minProp, 1.0);
+ } else if(oFP < (2 / 3.0)) { /* "minute" objects */
+ getFracColour(bcolor, hourProp, 1.0);
+ } else { /* "hour" objects */
+ getFracColour(bcolor, halfDayProp, 1.0);
+ }
+
+ /* set x/y location */
+ if(cycle == 0){
+ /* clockwise */
+ glRotatef(-minProp * 360 * (oi + 1), 0, 0, 1);
+ glTranslatef(0, 5, 0);
+ } else if(cycle == 1){
+ /* rain dance */
+ float y = 10 * cos(m2m * (oi + 1.0))/2;
+ /* rotate around Y axis */
+ glTranslatef(0, 0, -20);
+ glRotatef(minProp * 360, 0, 1, 0);
+ glTranslatef(0, y, 20);
+ } else if(cycle == 2){
+ /* metronome */
+ theta = sin(-m2m * (oi + 1.0)) * 90;
+ /* rotate around z axis at (-5, 0, 0) */
+ glTranslatef(0, -5, 0);
+ glRotatef(theta, 0, 0, 1);
+ glTranslatef(0, 10, 0);
+ } else if (cycle == 3){
+ /* galaxy */
+ mp = (num_objects - 1.0) / 2;
+ op = mp - oi;
+ dist = (int)(fabs(op)+0.5); /* dist from centre */
+ /* make sure each object travels an integer number of loops in
+ a path through one cycle */
+ pathLength = (int)((60.0 / dist) + 0.5) * 720.0;
+ delta = pathLength / 2;
+ theta = -minProp * delta - 180;
+ /* rotate around X axis after translating (0,-5,0) */
+ glTranslatef(0, 0, -20);
+ glRotatef(minProp * 360 - 180, 1, 0, 0);
+ glTranslatef(0, 0, 20);
+ glTranslatef(0, -5, 0);
+ /* rotate around Y axis */
+ glTranslatef(0, 0, -20);
+ glRotatef(theta, 0, 1, 0);
+ glTranslatef(0, 0, 20);
+ }
+
+ /* spread out based on Z position */
+ glTranslatef(0, 0, (z - 0.5) * 10);
+
+ /* set up colours */
+ glMaterialfv (GL_FRONT, GL_SPECULAR, bspec);
+ glMateriali (GL_FRONT, GL_SHININESS, bshiny);
+ if(motionBlur){
+ bcolor[3] = (timeDelta == 0) ? 1.0 : blurFrac; /* was ballAlpha */
+ }
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bcolor);
+ glCallList (bp->beats_list); /* draw sphere */
+ mi->polygon_count += (SPHERE_SLICES * SPHERE_STACKS);
+
+ glPopMatrix();
+ }
+ }
+ glPopMatrix();
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+ glXSwapBuffers(dpy, window);
+}
+
+
+ENTRYPOINT void
+free_beats (ModeInfo *mi)
+{
+ beats_configuration *bp = &bps[MI_SCREEN(mi)];
+ if (!bp->glx_context) return;
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
+ if (bp->colors) free (bp->colors);
+ if (glIsList(bp->beats_list)) glDeleteLists(bp->beats_list, 1);
+}
+
+XSCREENSAVER_MODULE ("Beats", beats)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/beats.man b/hacks/glx/beats.man
new file mode 100644
index 0000000..4fdab0b
--- /dev/null
+++ b/hacks/glx/beats.man
@@ -0,0 +1,75 @@
+.TH XScreenSaver 1 "2020-Feb-04" "X Version 11"
+.SH NAME
+beats - create offset beating figures
+.SH SYNOPSIS
+.B beats
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-count \fInumber\fP]
+[\-cycle \fInumber\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+The \fIbeats\fP program draws balls that move around at a slightly different rate from each other, creating interesting chaotic and ordered beating patterns. Each cycle / pattern is created such that it finishes as a single line of balls at the top of the screen, so that the patterns can smoothly transition between each other.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-count \fInumber\fP
+Number of balls. Default: 30.
+.TP 8
+.B \-cycle \fInumber\fP
+Cycle type to use (Default: -1):
+ -1 - pseudo-random based on current time
+ 0 - clockwise
+ 1 - rain dance
+ 2 - metronome
+ 3 - galaxy
+.TP 8
+.B \-tick | \-no-tick
+Add a tick for 'clockwise' and 'galaxy' patterns.
+.TP 8
+.B \-blur | \-no-blur
+Add motion blur to the ball movement.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2020 by David Eccles. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+David Eccles (gringer) <hacking@gringene.org>, 2020-Feb-04.
diff --git a/hacks/glx/blinkbox.c b/hacks/glx/blinkbox.c
index 45071a9..61531e7 100644
--- a/hacks/glx/blinkbox.c
+++ b/hacks/glx/blinkbox.c
@@ -18,8 +18,6 @@
# define release_ball 0
# define ball_handle_event xlockmore_no_events
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "sphere.h"
@@ -249,14 +247,6 @@ reshape_ball (ModeInfo *mi, int width, int height)
gluLookAt( 0.0, 0.0, 40.0,
0.0, 0.0, 0.0,
0.0, 2.0, 10.0);
-
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
- {
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
- }
-# endif
}
static void
@@ -462,7 +452,14 @@ draw_ball (ModeInfo *mi)
glPushMatrix();
- glScalef(0.5,0.5,0.5);
+
+ {
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi)
+ : 1);
+ s *= 0.5;
+ glScalef (s, s, s);
+ }
glColor3f(1,1,1);
glPushMatrix();
diff --git a/hacks/glx/blocktube.c b/hacks/glx/blocktube.c
index 811b185..ca29d87 100644
--- a/hacks/glx/blocktube.c
+++ b/hacks/glx/blocktube.c
@@ -20,8 +20,6 @@
# define release_blocktube 0
# define blocktube_handle_event xlockmore_no_events
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "colors.h"
@@ -321,13 +319,12 @@ ENTRYPOINT void reshape_blocktube (ModeInfo *mi, int width, int height)
gluPerspective(45.0, 1/h, 1.0, 100.0);
glMatrixMode(GL_MODELVIEW);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
}
static int cube_vertices(float x, float y, float z, int wire)
diff --git a/hacks/glx/blocktube.man b/hacks/glx/blocktube.man
index 5d016e0..1fbb241 100644
--- a/hacks/glx/blocktube.man
+++ b/hacks/glx/blocktube.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-blocktube - draws a swirling, falling tunnel of reflective slabs
+blocktube \- draws a swirling, falling tunnel of reflective slabs
.SH SYNOPSIS
.B blocktube
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/boing.c b/hacks/glx/boing.c
index adaf96b..bf010be 100644
--- a/hacks/glx/boing.c
+++ b/hacks/glx/boing.c
@@ -26,8 +26,6 @@
"*wireframe: False \n" \
# define release_boing 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "gltrackball.h"
diff --git a/hacks/glx/boing.man b/hacks/glx/boing.man
index 1f00d72..510d307 100644
--- a/hacks/glx/boing.man
+++ b/hacks/glx/boing.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "30-Oct-99" "X Version 11"
.SH NAME
-boing - draws a bouncing ball like the ancient Amiga demo
+boing \- draws a bouncing ball like the ancient Amiga demo
.SH SYNOPSIS
.B boing
[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
diff --git a/hacks/glx/bouncingcow.c b/hacks/glx/bouncingcow.c
index 5dc9466..29baa46 100644
--- a/hacks/glx/bouncingcow.c
+++ b/hacks/glx/bouncingcow.c
@@ -21,9 +21,6 @@
#define DEF_TEXTURE "(none)"
#define DEF_MATHEMATICAL "False"
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#undef BELLRAND
#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
#undef RANDSIGN
@@ -551,15 +548,13 @@ draw_cow (ModeInfo *mi)
glPushMatrix ();
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
- glRotatef(o, 0, 0, 1);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glRotatef(current_device_rotation(), 0, 0, 1);
+ glScalef (s, s, s);
}
-# endif
glScalef (0.5, 0.5, 0.5);
diff --git a/hacks/glx/bouncingcow.man b/hacks/glx/bouncingcow.man
index 9657d41..328e7d1 100644
--- a/hacks/glx/bouncingcow.man
+++ b/hacks/glx/bouncingcow.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-bouncingcow - a happy cow on a trampoline in 3D. Moo.
+bouncingcow \- a happy cow on a trampoline in 3D. Moo.
.SH SYNOPSIS
.B bouncingcow
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/boxed.c b/hacks/glx/boxed.c
index 7d1b5d0..ddc4af4 100644
--- a/hacks/glx/boxed.c
+++ b/hacks/glx/boxed.c
@@ -61,8 +61,6 @@ static const char sccsid[] = "@(#)boxed.c 0.9 01/09/26 xlockmore";
# define DEF_DECAY "0.07"
# define DEF_MOMENTUM "0.6"
-#undef countof
-#define countof(x) (int)(sizeof((x))/sizeof((*x)))
#undef rnd
#define rnd() (frand(1.0))
@@ -1029,15 +1027,13 @@ static void draw(ModeInfo * mi)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
- glRotatef(o, 0, 0, 1);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glRotatef(current_device_rotation(), 0, 0, 1);
+ glScalef (s, s, s);
}
-# endif
gp->tic += 0.01f;
gp->camtic += 0.01f + 0.01f * sin(gp->tic * speed);
diff --git a/hacks/glx/boxed.man b/hacks/glx/boxed.man
index 4233446..455b806 100644
--- a/hacks/glx/boxed.man
+++ b/hacks/glx/boxed.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-boxed - draws a box full of 3D bouncing balls that explode.
+boxed \- draws a box full of 3D bouncing balls that explode.
.SH SYNOPSIS
.B boxed
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/bubble3d.h b/hacks/glx/bubble3d.h
index 92ccbbd..2816b27 100644
--- a/hacks/glx/bubble3d.h
+++ b/hacks/glx/bubble3d.h
@@ -3,25 +3,13 @@
#ifndef __bubbles3d_h__
#define __bubbles3d_h__
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
-
#ifdef STANDALONE
-# include <math.h>
-# include "xlockmoreI.h" /* from the xscreensaver distribution */
+# include "screenhackI.h" /* from the xscreensaver distribution */
#else /* !STANDALONE */
# include "xlock.h" /* from the xlockmore distribution */
#endif /* !STANDALONE */
-#if !defined(HAVE_JWXYZ) && !defined(HAVE_JWZGLES)
-# include <GL/gl.h>
-# include <GL/glu.h>
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
+#include <math.h>
/* Static configuration. */
#define GLB_SLOW_GL 0 /* Set this if you have a slow GL
diff --git a/hacks/glx/bubble3d.man b/hacks/glx/bubble3d.man
index f847e12..6db573a 100644
--- a/hacks/glx/bubble3d.man
+++ b/hacks/glx/bubble3d.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-bubble3d - 3d rising bubbles.
+bubble3d \- 3d rising bubbles.
.SH SYNOPSIS
.B bubble3d
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/buildlwo.c b/hacks/glx/buildlwo.c
index c20c9e2..645866d 100644
--- a/hacks/glx/buildlwo.c
+++ b/hacks/glx/buildlwo.c
@@ -17,7 +17,9 @@ static const char sccsid[] = "@(#)buildlwo.c 4.02 97/04/20 xlockmore";
*/
#ifndef STANDALONE
-#include "xlock.h"
+# include "xlock.h"
+#else
+# include "screenhackI.h"
#endif
#ifdef USE_GL
diff --git a/hacks/glx/buildlwo.h b/hacks/glx/buildlwo.h
index b7fbbd9..9b16f73 100644
--- a/hacks/glx/buildlwo.h
+++ b/hacks/glx/buildlwo.h
@@ -9,25 +9,6 @@
#ifndef __BUILD_LWO_H__
#define __BUILD_LWO_H__
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
-
-#ifdef STANDALONE
-# ifndef HAVE_JWXYZ
-# include <GL/gl.h>
-# endif
-#endif
-
-#ifdef HAVE_ANDROID
-# include <GLES/gl.h>
-#endif
-
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
struct lwo {
int num_pnts;
const GLfloat *pnts;
diff --git a/hacks/glx/cage.c b/hacks/glx/cage.c
index 32384a7..eb7c7a5 100644
--- a/hacks/glx/cage.c
+++ b/hacks/glx/cage.c
@@ -439,6 +439,18 @@ draw_cage (ModeInfo * mi)
h = 1.7;
glScalef (h, h, h);
}
+ h = 0.7;
+ glScalef (h, h, h);
+ }
+# else
+ {
+ /* Don't understand why this clause doesn't work on mobile, but it
+ doesn't. */
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glRotatef (current_device_rotation(), 0, 0, 1);
+ glScalef (s, s, s);
}
# endif
diff --git a/hacks/glx/cage.man b/hacks/glx/cage.man
index dc5595b..b08458f 100644
--- a/hacks/glx/cage.man
+++ b/hacks/glx/cage.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-cage - Escher's impossible cage, for xscreensaver.
+cage \- Escher's impossible cage, for xscreensaver.
.SH SYNOPSIS
.B cage
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/carousel.c b/hacks/glx/carousel.c
index c1132b1..ec207a4 100644
--- a/hacks/glx/carousel.c
+++ b/hacks/glx/carousel.c
@@ -12,15 +12,9 @@
* Created: 21-Feb-2005
*/
-#if defined(HAVE_COCOA) || defined(HAVE_ANDROID)
-# define DEF_FONT "OCR A Std 48, Lucida Console 48, Monaco 48"
-#elif 0 /* real X11, XQueryFont() */
-# define DEF_FONT "-*-helvetica-bold-r-normal-*-*-480-*-*-*-*-*-*"
-#else /* real X11, load_font_retry() */
-# define DEF_FONT "-*-ocr a std-medium-r-*-*-*-480-*-*-m-*-*-*"
-#endif
-
-#define DEF_TITLE_FONT "-*-helvetica-bold-r-normal-*-*-480-*-*-*-*-*-*"
+#define DEF_FONT \
+ "OCR A Std 48, Lucida Console 48, Monaco 48, Courier 48, monospace 48"
+#define DEF_TITLE_FONT "sans-serif bold 48"
#define DEFAULTS "*count: 7 \n" \
"*delay: 10000 \n" \
@@ -37,9 +31,6 @@
# define release_carousel 0
# include "xlockmore.h"
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#ifdef USE_GL
# define DEF_SPEED "1.0"
@@ -548,14 +539,13 @@ loading_msg (ModeInfo *mi, int n)
}
*/
-# ifdef HAVE_MOBILE
- if (MI_WIDTH(mi) < MI_HEIGHT(mi)) /* portrait orientation */
- {
- GLfloat s = (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi));
- glScalef (s, s, s);
- glTranslatef(-s/2, 0, 0);
- }
-# endif
+ {
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glRotatef (current_device_rotation(), 0, 0, 1);
+ glScalef (s, s, s);
+ }
glOrtho(0, MI_WIDTH(mi), 0, MI_HEIGHT(mi), -1, 1);
glTranslatef ((MI_WIDTH(mi) - ss->loading_sw) / 2,
@@ -564,7 +554,9 @@ loading_msg (ModeInfo *mi, int n)
glColor3f (1, 1, 0);
glEnable (GL_TEXTURE_2D);
glDisable (GL_DEPTH_TEST);
+# ifndef HAVE_ANDROID /* Doesn't work -- photo displays as static */
print_texture_string (ss->titlefont, text);
+# endif
glEnable (GL_DEPTH_TEST);
glPopMatrix();
@@ -800,8 +792,8 @@ draw_frame (ModeInfo *mi, image_frame *frame, time_t now, Bool body_p)
glEnd();
}
- else /* Draw a title under the image. */
- {
+ else if (frame->current.title && *frame->current.title)
+ { /* Draw a title under the image. */
XCharStruct e;
int sw, sh;
GLfloat scale = 0.05;
@@ -821,7 +813,9 @@ draw_frame (ModeInfo *mi, image_frame *frame, time_t now, Bool body_p)
if (!wire)
{
glEnable (GL_TEXTURE_2D);
+# ifndef HAVE_ANDROID /* Doesn't work -- photo displays as static */
print_texture_string (ss->texfont, title);
+# endif
}
else
{
diff --git a/hacks/glx/carousel.man b/hacks/glx/carousel.man
index d5c9e43..cde2eb8 100644
--- a/hacks/glx/carousel.man
+++ b/hacks/glx/carousel.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-carousel - displays multiple images rotating in a circular formation
+carousel \- displays multiple images rotating in a circular formation
.SH SYNOPSIS
.B carousel
[\-display \fIhost:display.screen\fP]
@@ -26,7 +26,7 @@ This program requires a good video card capable of supporting large
textures.
To specify the directory that images are loaded from, run
-.BR xscreensaver-demo (1)
+.BR xscreensaver\-settings (1)
and click on the "Advanced" tab.
.SH OPTIONS
.TP 8
@@ -90,8 +90,8 @@ to get the name of a resource file that overrides the global resources
stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
-.BR xscreensaver-demo (1)
-.BR xscreensaver-getimage (1)
+.BR xscreensaver\-settings (1)
+.BR xscreensaver\-getimage (MANSUFFIX)
.BR xscreensaver (1)
.BR glslideshow (MANSUFFIX)
.BR photopile (MANSUFFIX)
diff --git a/hacks/glx/chessmodels.c b/hacks/glx/chessmodels.c
index 7dd7eca..ab0bd09 100644
--- a/hacks/glx/chessmodels.c
+++ b/hacks/glx/chessmodels.c
@@ -26,30 +26,12 @@
/* chessmodels.c: Contains the code for piece model creation */
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
+#include "screenhackI.h"
+#include "chessmodels.h"
#include <math.h>
#include <stdlib.h>
-#ifndef HAVE_JWXYZ
-# include <GL/glx.h>
-# include <GL/gl.h>
-#endif
-
-#ifdef HAVE_ANDROID
-#include <GLES/gl.h>
-#define Bool int
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
-#include "chessmodels.h"
-
-/* End of Data */
#define ENDOFDATA 65535
/* Section headers */
diff --git a/hacks/glx/circuit.c b/hacks/glx/circuit.c
index b8b845e..00e88c8 100644
--- a/hacks/glx/circuit.c
+++ b/hacks/glx/circuit.c
@@ -33,7 +33,7 @@
#define DEFAULTS "*delay: 20000 \n" \
"*showFPS: False \n" \
"*suppressRotationAnimation: True\n" \
- "*componentFont: -*-courier-bold-r-normal-*-*-140-*-*-*-*-*-*"
+ "*componentFont: monospace bold 12" \
# define release_circuit 0
# define circuit_handle_event xlockmore_no_events
@@ -57,18 +57,12 @@
#include "texfont.h"
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
static int maxparts;
static int rotatespeed;
static int spin;
static int uselight;
static int seven;
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
static XrmOptionDescRec opts[] = {
{"-parts", ".circuit.parts", XrmoptionSepArg, 0 },
{"-rotate-speed", ".circuit.rotatespeed", XrmoptionSepArg, 0 },
@@ -1117,6 +1111,7 @@ static int DrawIC(Circuit *ci, IC *c)
glTranslatef (-w/2, 0, 0);
glColor4fv (texfg);
print_texture_string (ci->font, c->text);
+ glEnable(GL_LIGHTING);
glPopMatrix();
}
@@ -1358,6 +1353,7 @@ static int DrawTransistor(Circuit *ci, Transistor *t)
glTranslatef (-w/2, 0, 0);
glColor4fv (texfg);
print_texture_string (ci->font, t->text);
+ glEnable (GL_LIGHTING);
glPopMatrix();
}
@@ -1385,6 +1381,7 @@ static int DrawTransistor(Circuit *ci, Transistor *t)
glTranslatef (-w/2, 0, 0);
glColor4fv (texfg);
print_texture_string (ci->font, t->text);
+ glEnable (GL_LIGHTING);
glPopMatrix();
}
glDisable(GL_TEXTURE_2D);
@@ -1932,6 +1929,16 @@ static void display(ModeInfo *mi)
h = 2;
glScalef (h, h, h);
}
+# else
+ {
+ /* Don't understand why this clause doesn't work on mobile, but it
+ doesn't. */
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ s = 1/s;
+ glScalef (s, s, s);
+ }
# endif
mi->polygon_count += drawgrid(ci);
diff --git a/hacks/glx/circuit.man b/hacks/glx/circuit.man
index f41f51c..d76db94 100644
--- a/hacks/glx/circuit.man
+++ b/hacks/glx/circuit.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "5-May-2004" "X Version 11"
.SH NAME
-circuit - animates a number of 3D electronic components.
+circuit \- animates a number of 3D electronic components.
.SH SYNOPSIS
.B circuit
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/cityflow.c b/hacks/glx/cityflow.c
index a6660af..ce385fc 100644
--- a/hacks/glx/cityflow.c
+++ b/hacks/glx/cityflow.c
@@ -15,8 +15,6 @@
"*wireframe: False \n" \
# define release_cube 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "colors.h"
diff --git a/hacks/glx/cityflow.man b/hacks/glx/cityflow.man
index eabcdc2..ff795e2 100644
--- a/hacks/glx/cityflow.man
+++ b/hacks/glx/cityflow.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-cityflow - waves of boxes.
+cityflow \- waves of boxes.
.SH SYNOPSIS
.B cityflow
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/companion.c b/hacks/glx/companion.c
index 1f518b1..3daebcb 100644
--- a/hacks/glx/companion.c
+++ b/hacks/glx/companion.c
@@ -31,9 +31,6 @@
#define DEF_SPIN "False"
#define DEF_WANDER "False"
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#undef BELLRAND
#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
#undef RANDSIGN
@@ -367,13 +364,12 @@ reshape_cube (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
diff --git a/hacks/glx/companioncube.man b/hacks/glx/companioncube.man
index e15b15e..9f5b735 100644
--- a/hacks/glx/companioncube.man
+++ b/hacks/glx/companioncube.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-companioncube - a vital aparatus.
+companioncube \- a vital aparatus.
.SH SYNOPSIS
.B companioncube
[\-display \fIhost:display.screen\fP]
@@ -67,9 +67,9 @@ to get the name of a resource file that overrides the global resources
stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
-.BR tronbit (1),
-.BR lament (1),
-.BR dangerball (1),
+.BR tronbit (MANSUFFIX),
+.BR lament (MANSUFFIX),
+.BR dangerball (MANSUFFIX),
.BR xscreensaver (1)
.SH COPYRIGHT
Copyright \(co 2011 by Jamie Zawinski. Permission to use, copy,
diff --git a/hacks/glx/covid19.c b/hacks/glx/covid19.c
new file mode 100644
index 0000000..62d3c6e
--- /dev/null
+++ b/hacks/glx/covid19.c
@@ -0,0 +1,656 @@
+/* covid19, Copyright (c) 2020 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Created: Thursday, March 264th, 2020.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 60 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*membraneColor: #AAFFAA" "\n" \
+ "*spikeColor: #DD0000" "\n" \
+ "*mpColor: #8888FF" "\n" \
+ "*epColor: #FF8888" "\n" \
+ "*hesColor: #880088" "\n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define release_ball 0
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "sphere.h"
+#include "tube.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_SPEED "1"
+
+#define SPIKE_FACES 12
+#define SMOOTH_SPIKES True
+#define SPHERE_SLICES 64
+#define SPHERE_STACKS 32
+#define SPHERE_SLICES_2 16
+#define SPHERE_STACKS_2 8
+
+#define SPIKE_FACESb 3
+#define SPHERE_SLICESb 10
+#define SPHERE_STACKSb 5
+#define SPHERE_SLICES_2b 5
+#define SPHERE_STACKS_2b 3
+
+
+typedef struct { GLfloat x, y, z; } XYZ;
+typedef enum { MEMBRANE, SPIKE, M_PROTEIN, E_PROTEIN, HES } feature;
+typedef enum { IN, DRAW, OUT } draw_mode;
+
+#undef RANDSIGN
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+typedef struct {
+ XYZ pos;
+ GLfloat scale;
+ rotator *rot;
+ GLuint dlist;
+} ball;
+
+typedef struct {
+ GLXContext *glx_context;
+ trackball_state *trackball;
+ Bool button_down_p;
+ draw_mode mode;
+ GLfloat tick;
+ GLuint ball_lists[20];
+ int ball_polys;
+ int max_balls, count, ball_delta;
+ ball *balls;
+ GLfloat membrane_color[4];
+ GLfloat spike_color[4];
+ GLfloat mp_color[4];
+ GLfloat ep_color[4];
+ GLfloat hes_color[4];
+} ball_configuration;
+
+static ball_configuration *bps = NULL;
+
+static Bool do_spin;
+static GLfloat speed;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt ball_opts = {
+ countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_ball (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ {
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
+ }
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+ball_handle_event (ModeInfo *mi, XEvent *event)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ bp->mode = OUT;
+ bp->tick = 1;
+ return True;
+ }
+
+ return False;
+}
+
+
+static int
+unit_spike (ModeInfo *mi, Bool lowrez)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int polys = 0;
+ GLfloat r = 0.2;
+ GLfloat s = 0.2;
+ int i;
+ glPushMatrix();
+
+ glColor4fv (bp->spike_color);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bp->spike_color);
+
+ glScalef (s, s, s);
+ glTranslatef (0, -r, 0);
+ if (!lowrez)
+ glTranslatef (-r, 0, 0);
+ polys += tube (0, 0, 0,
+ 0, 1, 0,
+ r, 0,
+ (lowrez ? SPIKE_FACESb : SPIKE_FACES),
+ True, False, wire);
+ if (!lowrez)
+ glTranslatef (r*2, 0, 0);
+ if (! lowrez)
+ polys += tube (0, 0, 0,
+ 0, 1, 0,
+ r, 0,
+ (lowrez ? SPIKE_FACESb : SPIKE_FACES),
+ True, False, wire);
+ if (!lowrez)
+ glTranslatef (-r, 0, 0);
+
+ glTranslatef (0, 1, 0);
+ r *= 2;
+ glScalef (r, r, r);
+
+ for (i = 0; i < (lowrez ? 1 : 3); i++)
+ {
+ glPushMatrix();
+ glRotatef (360.0 / 3 * i, 0, 1, 0);
+ if (!lowrez)
+ glTranslatef (r, 0, 0);
+ polys += unit_sphere ((lowrez ? SPHERE_STACKS_2b : SPHERE_STACKS_2),
+ (lowrez ? SPHERE_SLICES_2b : SPHERE_SLICES_2),
+ wire);
+ glPopMatrix();
+ }
+
+ glPopMatrix();
+ return polys;
+}
+
+
+static int
+unit_ball (ModeInfo *mi, Bool lowrez)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int polys = 0;
+ feature f;
+
+ for (f = 0; f <= HES; f++)
+ {
+ switch (f) {
+ case MEMBRANE:
+ glColor4fv (bp->membrane_color);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bp->membrane_color);
+ polys += unit_sphere ((lowrez ? SPHERE_STACKSb : SPHERE_STACKS),
+ (lowrez ? SPHERE_SLICESb : SPHERE_SLICES),
+ wire);
+ break;
+
+ case SPIKE:
+ {
+ GLfloat th0 = atan (0.5); /* lat division: 26.57 deg */
+ GLfloat s = M_PI / 5; /* lon division: 72 deg */
+ int i, j;
+ int n = (lowrez ? 8 : 10);
+ for (j = 0; j < n; j++)
+ for (i = 0; i < n; i++)
+ {
+ GLfloat th1 = s * i;
+ GLfloat a = th0;
+ GLfloat o = th1;
+ GLfloat x, y, z;
+
+ a += (0.2 + frand (0.9)) * RANDSIGN();
+ o += (0.2 + frand (0.9)) * RANDSIGN();
+
+ x = cos(a) * cos(o);
+ y = cos(a) * sin(o);
+ z = sin(a);
+
+ glPushMatrix();
+
+ if (! (i & 1))
+ {
+ glRotatef (180, 0, 1, 0);
+ glRotatef (180/5, 0, 0, 1);
+ }
+
+ glTranslatef (x, y, z);
+ glRotatef (-atan2 (x, y) * (180/M_PI), 0, 0, 1);
+ glRotatef ( atan2 (z, sqrt(x*x + y*y)) * (180/M_PI), 1, 0, 0);
+ polys += unit_spike (mi, lowrez);
+ glPopMatrix();
+ }
+
+ glPushMatrix();
+ glRotatef (90, 1, 0, 0);
+ glTranslatef (0, 1, 0);
+ polys += unit_spike (mi, lowrez);
+
+ glTranslatef (0, -2, 0);
+ glRotatef (180, 1, 0, 0);
+ polys += unit_spike (mi, lowrez);
+ glPopMatrix();
+
+ }
+ break;
+
+ default:
+ {
+ GLfloat s = 0.04;
+ int n = (lowrez ? 50 : 200);
+ int i;
+ GLfloat *c;
+ switch (f) {
+ case M_PROTEIN: c = bp->mp_color; break;
+ case E_PROTEIN: c = bp->ep_color; break;
+ case HES: c = bp->hes_color; break;
+ default: abort();
+ }
+
+ glColor4fv (c);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, c);
+
+ if (f == HES)
+ {
+ s *= 1.5;
+ n /= 8;
+ }
+
+ for (i = 0; i < n; i++)
+ {
+ glPushMatrix();
+ glRotatef (random() % 360, 1, 0, 0);
+ glRotatef (random() % 180, 0, 1, 0);
+ glTranslatef (1, 0, 0);
+ glRotatef (90, 0, 0, 1);
+ glScalef (s, s, s);
+ polys += unit_dome ((lowrez ? SPHERE_STACKS_2b : SPHERE_STACKS_2),
+ (lowrez ? SPHERE_SLICES_2b : SPHERE_SLICES_2),
+ wire);
+ glPopMatrix();
+ }
+ }
+ break;
+ }
+ }
+
+ return polys;
+}
+
+
+static void
+parse_color (ModeInfo *mi, char *key, GLfloat color[4])
+{
+ XColor xcolor;
+ char *string = get_string_resource (mi->dpy, key, "RobotColor");
+ if (!XParseColor (mi->dpy, mi->xgwa.colormap, string, &xcolor))
+ {
+ fprintf (stderr, "%s: unparsable color in %s: %s\n", progname,
+ key, string);
+ exit (1);
+ }
+ free (string);
+
+ color[0] = xcolor.red / 65536.0;
+ color[1] = xcolor.green / 65536.0;
+ color[2] = xcolor.blue / 65536.0;
+ color[3] = 1;
+}
+
+
+static void
+make_balls (ModeInfo *mi, int count)
+{
+ /* Distribute the balls into a rectangular grid that fills the window.
+ There may be some empty cells. N items in a W x H rectangle:
+ N = W * H
+ N = W * W * R
+ N/R = W*W
+ W = sqrt(N/R)
+ */
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ GLfloat aspect = MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi);
+ int nlines = sqrt (count / aspect) + 0.5;
+ int *cols = (int *) calloc (nlines, sizeof(*cols));
+ int i, x, y, max = 0;
+ GLfloat scale, spacing;
+ Bool lowrez = (count > 40);
+
+ if (bp->balls)
+ {
+ for (i = 0; i < bp->count; i++)
+ free_rotator (bp->balls[i].rot);
+ free (bp->balls);
+ }
+
+ bp->count = count;
+ bp->balls = (ball *) calloc (sizeof (*bp->balls), count);
+
+ for (i = 0; i < count; i++)
+ {
+ cols[i % nlines]++;
+ if (cols[i % nlines] > max) max = cols[i % nlines];
+ }
+
+ /* That gave us, e.g. 7777666. Redistribute to 6767767. */
+ for (i = 0; i < nlines / 2; i += 2)
+ {
+ int j = nlines-i-1;
+ int swap = cols[i];
+ cols[i] = cols[j];
+ cols[j] = swap;
+ }
+
+ scale = 1.0 / nlines; /* Scale for height */
+ if (scale * max > aspect) /* Shrink if overshot width */
+ scale *= aspect / (scale * max);
+
+ scale *= 0.9; /* Add padding */
+ spacing = scale * 4;
+
+ if (count == 1) spacing = 0;
+
+ i = 0;
+ for (y = 0; y < nlines; y++)
+ for (x = 0; x < cols[y]; x++)
+ {
+ ball *v = &bp->balls[i];
+ double spin_speed = 1.0 * speed;
+ double wander_speed = 0.04 * speed;
+ double spin_accel = 1.0;
+ int n = countof (bp->ball_lists) / 2;
+
+ v->scale = scale;
+ v->pos.x = spacing * (x - cols[y] / 2.0) + spacing/2;
+ v->pos.y = spacing * (y - nlines / 2.0) + spacing/2;
+ v->pos.z = 0;
+ v->dlist = bp->ball_lists [(random() % n) + (lowrez ? n : 0)];
+ v->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ True);
+ i++;
+ }
+ free (cols);
+}
+
+
+ENTRYPOINT void
+init_ball (ModeInfo *mi)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+
+ MI_INIT (mi, bps);
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_ball (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ parse_color (mi, "membraneColor", bp->membrane_color);
+ parse_color (mi, "spikeColor", bp->spike_color);
+ parse_color (mi, "mpColor", bp->mp_color);
+ parse_color (mi, "epColor", bp->ep_color);
+ parse_color (mi, "hesColor", bp->hes_color);
+
+ for (i = 0; i < countof(bp->ball_lists); i++)
+ {
+ Bool lowrez = (i > countof(bp->ball_lists) / 2);
+ bp->ball_lists[i] = glGenLists (1);
+ glNewList (bp->ball_lists[i], GL_COMPILE);
+ bp->ball_polys = unit_ball (mi, lowrez);
+ glEndList ();
+ }
+
+ bp->ball_delta = 1;
+ bp->max_balls = MI_COUNT(mi);
+ if (bp->max_balls < 1) bp->max_balls = 1;
+ bp->count = (bp->max_balls > 10 ? 1 + random() % 5 :
+ bp->max_balls > 5 ? 1 + random() % 3 : 1);
+ make_balls (mi, bp->count);
+
+ bp->trackball = gltrackball_init (True);
+}
+
+
+ENTRYPOINT void
+draw_ball (ModeInfo *mi)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GLfloat s = 1;
+ int i;
+
+ static const GLfloat bspec[4] = {1.0, 1.0, 1.0, 1.0};
+ static const GLfloat bshiny = 128.0;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ glScalef (4, 4, 4);
+
+ gltrackball_rotate (bp->trackball);
+
+ mi->polygon_count = 0;
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, bspec);
+ glMateriali (GL_FRONT, GL_SHININESS, bshiny);
+
+ switch (bp->mode) {
+ case DRAW:
+ bp->tick -= 1/30.0/5; /* No more often than 5 sec */
+ if (bp->tick <= 0)
+ {
+ bp->tick = 1;
+ if (! (random() % 20))
+ {
+ bp->mode = OUT;
+ bp->tick = 1;
+ }
+ }
+ s = 1;
+ break;
+ case IN:
+ bp->tick += 1/12.0;
+ if (bp->tick >= 1)
+ {
+ bp->tick = 1;
+ bp->mode = DRAW;
+ }
+ s = bp->tick;
+ break;
+ case OUT:
+ bp->tick -= 1/12.0;
+ s = bp->tick;
+ if (bp->tick <= 0)
+ {
+ int c2;
+ int n;
+ bp->tick = 0;
+ bp->mode = IN;
+
+ n = (bp->count < 5 ? 2 :
+ bp->count < 20 ? 5 : 20);
+ c2 = bp->count + (1 + (random() % n)) * bp->ball_delta;
+ if (c2 < 1)
+ {
+ c2 = 1;
+ bp->ball_delta = 1;
+ }
+ else if (c2 > bp->max_balls)
+ {
+ c2 = bp->max_balls;
+ bp->ball_delta = -1;
+ }
+
+ make_balls (mi, c2);
+ s = 0;
+ }
+ break;
+ default:
+ abort();
+ }
+
+ if (s > 0)
+ for (i = 0; i < bp->count; i++)
+ {
+ ball *v = &bp->balls[i];
+ double x, y, z;
+ glPushMatrix();
+ glTranslatef (v->pos.x, v->pos.y, v->pos.z);
+ glScalef (v->scale, v->scale, v->scale);
+
+ get_position (v->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 2,
+ (y - 0.5) * 2,
+ (z - 0.5) * 8 * (bp->count > 8 ? 3 : 1));
+ get_rotation (v->rot, &x, &y, &z, !bp->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+
+ glScalef (s, s, s);
+ glCallList (v->dlist);
+ mi->polygon_count += bp->ball_polys;
+ glPopMatrix ();
+ }
+ glPopMatrix ();
+
+ mi->recursion_depth = bp->count;
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+
+ENTRYPOINT void
+free_ball (ModeInfo *mi)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+ int i;
+ if (!bp->glx_context) return;
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
+ for (i = 0; i < bp->count; i++)
+ free_rotator (bp->balls[i].rot);
+ free (bp->balls);
+ if (bp->trackball) gltrackball_free (bp->trackball);
+ for (i = 0; i < countof(bp->ball_lists); i++)
+ if (glIsList(bp->ball_lists[i])) glDeleteLists(bp->ball_lists[i], 1);
+}
+
+#ifndef HAVE_IPHONE
+XSCREENSAVER_MODULE_2 ("COVID19", covid19, ball)
+#else
+XSCREENSAVER_MODULE_2 ("Co____9", co____9, ball)
+
+ /* App Store Connect Resolution Center: App Review
+
+ Binary Rejected
+
+ Guideline 1.1 - Safety - Objectionable Content We found that your app
+ includes content or concepts that some users may find upsetting,
+
+ We found that your app includes content or concepts that some users may
+ find upsetting, offensive, or otherwise objectionable.
+
+ Specifically, your entertainment or gaming app inappropriately references
+ the C____-__ p__d__ic in the metadata or binary. Entertainment or gaming
+ apps that directly or indirectly reference the C____-__ p__d__ic in any
+ way are not appropriate for the App Store.
+
+ */
+#endif
+
+
+#endif /* USE_GL */
diff --git a/hacks/glx/covid19.man b/hacks/glx/covid19.man
new file mode 100644
index 0000000..4ebca96
--- /dev/null
+++ b/hacks/glx/covid19.man
@@ -0,0 +1,72 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+covid19 \- the most 2020 of all screen savers.
+.SH SYNOPSIS
+.B covid19
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-count \fInumber\fP]
+[\-no-wander]
+[\-no-spin]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+SARS-CoV-2. Stay the fuck home. Wear a fucking mask.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-count \fInumber\fP
+Maximum number of virus particles. 1 - 200. Default: 60.
+.TP 8
+.B \-wander | \-no-wander
+Whether the viruses should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the viruses should spin.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2020 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/crackberg.c b/hacks/glx/crackberg.c
index 22d3adc..95b49e4 100644
--- a/hacks/glx/crackberg.c
+++ b/hacks/glx/crackberg.c
@@ -11,8 +11,6 @@
"*wireframe: False \n" \
# define release_crackberg 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#ifdef USE_GL /* whole file */
diff --git a/hacks/glx/crackberg.man b/hacks/glx/crackberg.man
index 5183baa..a633951 100644
--- a/hacks/glx/crackberg.man
+++ b/hacks/glx/crackberg.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-crackberg - Lose your way wandering some height fields, and enjoy candy.
+crackberg \- Lose your way wandering some height fields, and enjoy candy.
.SH SYNOPSIS
.B crackberg
[\-root]
diff --git a/hacks/glx/crumbler.c b/hacks/glx/crumbler.c
index b7b8acc..fccee8d 100644
--- a/hacks/glx/crumbler.c
+++ b/hacks/glx/crumbler.c
@@ -15,8 +15,6 @@
"*suppressRotationAnimation: True\n" \
# define release_crumbler 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "colors.h"
@@ -111,17 +109,29 @@ make_point_cloud (qh_vertex_t *verts, int nverts)
}
}
+static void crumbler_oom (void)
+{
+# ifdef HAVE_JWXYZ
+ jwxyz_abort ("%s: out of memory, try reducing 'density'", progname);
+# else
+ fprintf (stderr, "%s: out of memory, try reducing 'density'\n", progname);
+ exit (1);
+# endif
+}
+
static chunk *
make_chunk (void)
{
chunk *c = (chunk *) calloc (1, sizeof(*c));
+ if (!c) crumbler_oom();
c->dlist = glGenLists (1);
c->color_shift = 1 + (random() % 3) * RANDSIGN();
return c;
}
-static void
+/* Return False if out of memory */
+static Bool
render_chunk (ModeInfo *mi, chunk *c)
{
int wire = MI_IS_WIREFRAME(mi);
@@ -169,6 +179,12 @@ render_chunk (ModeInfo *mi, chunk *c)
m = qh_quickhull3d (c->verts, c->nverts);
+ if (!m.vertices) /* out of memory */
+ {
+ qh_free_mesh (m);
+ return False;
+ }
+
glNewList (c->dlist, GL_COMPILE);
if (! wire) glBegin (GL_TRIANGLES);
for (i = 0, j = 0; i < m.nindices; i += 3, j++)
@@ -212,6 +228,7 @@ render_chunk (ModeInfo *mi, chunk *c)
glEndList();
qh_free_mesh (m);
+ return True;
}
@@ -245,7 +262,7 @@ pad_chunk (chunk *c, int min)
if (c->nverts >= min) return;
if (c->nverts <= 3) abort();
verts = (qh_vertex_t *) calloc (min, sizeof(*verts));
- if (!verts) abort();
+ if (!verts) crumbler_oom();
memcpy (verts, c->verts, c->nverts * sizeof(*verts));
i = c->nverts;
while (i < min)
@@ -312,6 +329,7 @@ pad_chunk (chunk *c, int min)
#if 0
qh_vertex_t *verts2 = (qh_vertex_t *) calloc (n, sizeof(*verts2));
+ if (!verts2) crumbler_oom();
memcpy (verts2, v, n * sizeof(*verts2));
free (c->verts);
c->verts = verts2;
@@ -342,7 +360,9 @@ split_chunk (ModeInfo *mi, chunk *c, int nchunks)
RETRY:
chunks = (chunk **) calloc (nchunks, sizeof(*chunks));
+ if (!chunks) crumbler_oom();
keys = (int *) calloc (nchunks, sizeof(*keys));
+ if (!keys) crumbler_oom();
for (i = 0; i < nchunks; i++)
{
@@ -370,6 +390,7 @@ split_chunk (ModeInfo *mi, chunk *c, int nchunks)
chunks[i] = c2;
chunks[i]->nverts = 0;
c2->verts = (qh_vertex_t *) calloc (c->nverts, sizeof(*c2->verts));
+ if (!c2->verts) crumbler_oom();
c2->color = (c->color + (random() % (1 + (bp->ncolors / 3))))
% bp->ncolors;
}
@@ -430,7 +451,8 @@ split_chunk (ModeInfo *mi, chunk *c, int nchunks)
if (i == 0) /* The one we're gonna keep */
pad_chunk (c2, c->nverts);
- render_chunk (mi, c2);
+ if (! render_chunk (mi, c2))
+ crumbler_oom(); /* We are too far in to recover from this */
}
return chunks;
@@ -483,7 +505,8 @@ tick_crumbler (ModeInfo *mi)
/* Re-render it to move the verts in the display list too.
This also recomputes min, max and mid.
*/
- render_chunk (mi, c);
+ if (! render_chunk (mi, c))
+ crumbler_oom(); /* We are too far in to recover from this */
break;
}
@@ -530,7 +553,8 @@ tick_crumbler (ModeInfo *mi)
/* Re-render it to move the verts in the display list too.
This also recomputes min, max and mid (now 0).
*/
- render_chunk (mi, c);
+ if (! render_chunk (mi, c))
+ crumbler_oom(); /* We are too far in to recover from this */
break;
}
@@ -584,13 +608,12 @@ reshape_crumbler (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
@@ -661,6 +684,7 @@ init_crumbler (ModeInfo *mi)
bp->ncolors = 1024;
bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ if (!bp->colors) crumbler_oom();
make_smooth_colormap (0, 0, 0,
bp->colors, &bp->ncolors,
False, 0, False);
@@ -676,35 +700,56 @@ init_crumbler (ModeInfo *mi)
# undef R
}
-# ifdef HAVE_MOBILE
-# ifdef USE_IPHONE
- density *= 0.5; /* iPhone 6s runs out of memory at 4500 nverts. */
-# else
- density *= 0.3; /* Android Nexus_5_8.1 emulator runs out earlier. */
-# endif
-# endif
-
{
+ double d2 = density;
chunk *c;
+
bp->nchunks = 1;
bp->chunks = (chunk **) calloc (bp->nchunks, sizeof(*bp->chunks));
+ if (! bp->chunks) crumbler_oom();
+
c = make_chunk();
+ if (! c) crumbler_oom();
+
bp->chunks[0] = c;
- c->nverts = 4500 * density;
- c->verts = (qh_vertex_t *) calloc (c->nverts, sizeof(*c->verts));
- make_point_cloud (c->verts, c->nverts);
-
- /* Let's shrink it to a point then zoom in. */
- bp->state = ZOOM;
- bp->tick = 0;
- for (i = 0; i < c->nverts; i++)
+
+ while (1)
{
- c->verts[i].x /= 500;
- c->verts[i].y /= 500;
- c->verts[i].z /= 500;
+ c->nverts = 4500 * d2;
+ c->verts = (qh_vertex_t *) calloc (c->nverts, sizeof(*c->verts));
+ if (c->verts)
+ {
+ make_point_cloud (c->verts, c->nverts);
+
+ /* Let's shrink it to a point then zoom in. */
+ bp->state = ZOOM;
+ bp->tick = 0;
+ for (i = 0; i < c->nverts; i++)
+ {
+ c->verts[i].x /= 500;
+ c->verts[i].y /= 500;
+ c->verts[i].z /= 500;
+ }
+
+ if (! render_chunk (mi, c))
+ {
+ free (c->verts);
+ c->verts = 0;
+ }
+ }
+
+ if (c->verts)
+ break;
+
+ if (d2 < 0.1)
+ crumbler_oom();
+ d2 *= 0.9;
}
- render_chunk (mi, c);
+ if (density != d2)
+ fprintf (stderr,
+ "%s: out of memory: reduced density from %.01f to %0.1f\n",
+ progname, density, d2);
}
}
diff --git a/hacks/glx/crumbler.man b/hacks/glx/crumbler.man
index a608d9d..629e513 100644
--- a/hacks/glx/crumbler.man
+++ b/hacks/glx/crumbler.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-crumbler - voronoi divisions of a sphere.
+crumbler \- voronoi divisions of a sphere.
.SH SYNOPSIS
.B crumbler
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/cube21.c b/hacks/glx/cube21.c
index de72206..7a1abcb 100644
--- a/hacks/glx/cube21.c
+++ b/hacks/glx/cube21.c
@@ -81,9 +81,6 @@
#define BORDER 3
#define BORDER2 9
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#define rnd01() (random()%2)
#define rndcolor() (frand(0.5)+0.3)
@@ -515,14 +512,12 @@ static Bool draw_main(ModeInfo *mi, cube21_conf *cp)
glTranslatef(0, 0, zpos);
glScalef(size, size, size);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glRotatef(cp->xrot, 1.0, 0.0, 0.0);
glRotatef(cp->yrot, 0.0, 1.0, 0.0);
diff --git a/hacks/glx/cube21.man b/hacks/glx/cube21.man
index d90c0fb..a6e1ec2 100644
--- a/hacks/glx/cube21.man
+++ b/hacks/glx/cube21.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "30-Aug-05" "X Version 11"
.SH NAME
-cube21 - animates the Cube 21 puzzle
+cube21 \- animates the Cube 21 puzzle
.SH SYNOPSIS
.B cube21
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/cubenetic.c b/hacks/glx/cubenetic.c
index 0ddbb29..7524410 100644
--- a/hacks/glx/cubenetic.c
+++ b/hacks/glx/cubenetic.c
@@ -16,8 +16,6 @@
"*suppressRotationAnimation: True\n" \
# define release_cube 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "colors.h"
@@ -206,13 +204,12 @@ reshape_cube (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
diff --git a/hacks/glx/cubenetic.man b/hacks/glx/cubenetic.man
index e11d479..5b087c2 100644
--- a/hacks/glx/cubenetic.man
+++ b/hacks/glx/cubenetic.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-cubenetic - cubist 3D undulating blob.
+cubenetic \- cubist 3D undulating blob.
.SH SYNOPSIS
.B cubenetic
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/cubestack.c b/hacks/glx/cubestack.c
index 928ad1c..ef62ab4 100644
--- a/hacks/glx/cubestack.c
+++ b/hacks/glx/cubestack.c
@@ -15,8 +15,6 @@
"*suppressRotationAnimation: True\n" \
# define release_cube 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "colors.h"
@@ -306,13 +304,12 @@ reshape_cube (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
diff --git a/hacks/glx/cubestack.man b/hacks/glx/cubestack.man
index 511d116..8e2a8e2 100644
--- a/hacks/glx/cubestack.man
+++ b/hacks/glx/cubestack.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-cubestack - An endless stack of unfolding, translucent cubes.
+cubestack \- An endless stack of unfolding, translucent cubes.
.SH SYNOPSIS
.B cubestack
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/cubestorm.c b/hacks/glx/cubestorm.c
index afa1797..681a17a 100644
--- a/hacks/glx/cubestorm.c
+++ b/hacks/glx/cubestorm.c
@@ -18,8 +18,6 @@
# define release_cube 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "colors.h"
@@ -191,13 +189,12 @@ reshape_cube (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
diff --git a/hacks/glx/cubestorm.man b/hacks/glx/cubestorm.man
index 9d912fd..aad0c97 100644
--- a/hacks/glx/cubestorm.man
+++ b/hacks/glx/cubestorm.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-cubestorm - a series of 3D boxes that fill space
+cubestorm \- a series of 3D boxes that fill space
.SH SYNOPSIS
.B cubestorm
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/cubetwist.c b/hacks/glx/cubetwist.c
index 776e396..eed1901 100644
--- a/hacks/glx/cubetwist.c
+++ b/hacks/glx/cubetwist.c
@@ -15,8 +15,6 @@
"*suppressRotationAnimation: True\n" \
# define release_cube 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "normals.h"
@@ -360,13 +358,12 @@ reshape_cube (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
diff --git a/hacks/glx/cubetwist.man b/hacks/glx/cubetwist.man
index 3a6574b..79efdd4 100644
--- a/hacks/glx/cubetwist.man
+++ b/hacks/glx/cubetwist.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-cubetwist - A series of nested cubes rotate and slide recursively.
+cubetwist \- A series of nested cubes rotate and slide recursively.
.SH SYNOPSIS
.B cubetwist
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/cubicgrid.c b/hacks/glx/cubicgrid.c
index d7ef6f2..9d7d2ba 100644
--- a/hacks/glx/cubicgrid.c
+++ b/hacks/glx/cubicgrid.c
@@ -33,33 +33,49 @@
#define DEF_DIV "30"
#define DEF_ZOOM "20"
#define DEF_BIGDOTS "True"
+#define DEF_SYMMETRY "random"
#undef countof
#define countof(x) (sizeof((x))/sizeof((*x)))
+#undef RAND
+#define RAND(n) ((random() & 0x7fffffff) % ((long) (n)))
+
+#undef TOUPPER
+#define TOUPPER(x) ((x)&(~0x20))
+
#include "rotator.h"
#include "gltrackball.h"
/*************************************************************************/
+enum HACKS_GLX_CUBICGRID_SYMMETRY {
+ HACKS_GLX_CUBICGRID_SYMMETRY_CUBIC = 0,
+ HACKS_GLX_CUBICGRID_SYMMETRY_HEXAGONAL = 1
+};
+
static int ticks;
static float size;
static float speed;
static Bool bigdots;
+static char *symmetry;
+static int symmetry_id;
static argtype vars[] = {
- { &speed, "speed", "Speed", DEF_SPEED, t_Float },
- { &size, "zoom", "Zoom", DEF_ZOOM, t_Float },
- { &ticks, "ticks", "Ticks", DEF_DIV, t_Int },
- { &bigdots, "bigdots", "BigDots", DEF_BIGDOTS, t_Bool },
+ { &speed, "speed", "Speed", DEF_SPEED, t_Float },
+ { &size, "zoom", "Zoom", DEF_ZOOM, t_Float },
+ { &ticks, "ticks", "Ticks", DEF_DIV, t_Int },
+ { &bigdots, "bigdots", "BigDots", DEF_BIGDOTS, t_Bool },
+ { &symmetry,"symmetry", "Symmety", DEF_SYMMETRY, t_String },
};
static XrmOptionDescRec opts[] = {
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-zoom", ".zoom", XrmoptionSepArg, 0 },
- { "-ticks", ".ticks", XrmoptionSepArg, 0 },
- { "-bigdots", ".bigdots", XrmoptionNoArg, "True" },
- { "+bigdots", ".bigdots", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-zoom", ".zoom", XrmoptionSepArg, 0 },
+ { "-ticks", ".ticks", XrmoptionSepArg, 0 },
+ { "-symmetry", ".symmetry", XrmoptionSepArg, 0 },
+ { "-bigdots", ".bigdots", XrmoptionNoArg, "True" },
+ { "+bigdots", ".bigdots", XrmoptionNoArg, "False" },
};
ENTRYPOINT ModeSpecOpt cubicgrid_opts = {countof(opts), opts, countof(vars), vars, NULL};
@@ -119,15 +135,12 @@ static Bool draw_main(ModeInfo *mi)
glScalef(size/ticks, size/ticks, size/ticks);
-
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
gltrackball_rotate (cp->trackball);
@@ -146,10 +159,13 @@ static void init_gl(ModeInfo *mi)
cubicgrid_conf *cp = &cubicgrid[MI_SCREEN(mi)];
int x, y, z;
float tf = ticks;
+ float i, j, k;
+ float sqrt_3 = sqrtf(3.0f);
+ float sqrt_6 = sqrtf(6.0f);
glDrawBuffer(GL_BACK);
if(bigdots) {
- glPointSize(2.0);
+ glPointSize(2.5);
}
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glShadeModel(GL_FLAT);
@@ -162,7 +178,14 @@ static void init_gl(ModeInfo *mi)
for(x = 0; x < ticks; x++) {
for(y = 0; y < ticks; y++) {
for(z = 0; z < ticks; z++) {
- glVertex3f(x, y, z);
+ if (symmetry_id == HACKS_GLX_CUBICGRID_SYMMETRY_HEXAGONAL) {
+ i = 2*x+(y+z)%2;
+ j = sqrt_3*(y+(1.0f/3.0f)*(z % 2));
+ k = (2.0f/3.0f)*sqrt_6*z;
+ glVertex3f(i, j, k);
+ } else {
+ glVertex3f(x, y, z);
+ }
cp->npoints++;
}
}
@@ -176,7 +199,14 @@ static void init_gl(ModeInfo *mi)
for(y = 0; y < ticks; y++) {
for(z = 0; z < ticks; z++) {
glColor3f(x/tf, y/tf, z/tf);
- glVertex3f(x, y, z);
+ if (symmetry_id == HACKS_GLX_CUBICGRID_SYMMETRY_HEXAGONAL) {
+ i = 2*x+(y+z)%2;
+ j = sqrt_3*(y+(1.0f/3.0f)*(z % 2));
+ k = (2.0f/3.0f)*sqrt_6*z;
+ glVertex3f(i, j, k);
+ } else {
+ glVertex3f(x, y, z);
+ }
cp->npoints++;
}
}
@@ -212,9 +242,21 @@ ENTRYPOINT void reshape_cubicgrid(ModeInfo *mi, int width, int height)
ENTRYPOINT void init_cubicgrid(ModeInfo *mi)
{
cubicgrid_conf *cp;
+
MI_INIT(mi, cubicgrid);
cp = &cubicgrid[MI_SCREEN(mi)];
+ if (!symmetry || !*symmetry || !strcmp(symmetry, "random"))
+ symmetry_id = RAND(2);
+ else if (!strcmp(symmetry, "hexagonal"))
+ symmetry_id = HACKS_GLX_CUBICGRID_SYMMETRY_HEXAGONAL;
+ else if (!strcmp(symmetry, "cubic"))
+ symmetry_id = HACKS_GLX_CUBICGRID_SYMMETRY_CUBIC;
+ else {
+ fprintf(stderr, "%s: unknown symmetry: %s\n", progname, symmetry);
+ exit(1);
+ }
+
if ((cp->glx_context = init_GL(mi)) != NULL) {
init_gl(mi);
reshape_cubicgrid(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
@@ -257,6 +299,7 @@ ENTRYPOINT void change_cubicgrid(ModeInfo * mi)
{
cubicgrid_conf *cp = &cubicgrid[MI_SCREEN(mi)];
if (!cp->glx_context) return;
+ srand(time(NULL));
glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *cp->glx_context);
init_gl(mi);
}
diff --git a/hacks/glx/cubicgrid.man b/hacks/glx/cubicgrid.man
index d267bc3..b83114d 100644
--- a/hacks/glx/cubicgrid.man
+++ b/hacks/glx/cubicgrid.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "Dec-28-07" "X Version 11"
.SH NAME
-cubicgrid - rotating 3D lattice seen from inside
+cubicgrid \- rotating 3D lattice seen from inside
.SH SYNOPSIS
.B cubicgrid
[\-display \fIhost:display.screen\fP]
@@ -15,6 +15,7 @@ cubicgrid - rotating 3D lattice seen from inside
[\-ticks \fInumber\fP]
[\-bigdots]
[\-fps]
+[\-symmetry \fcrystalographic symmetry\fP]
.SH DESCRIPTION
This program shows the view of an observer located inside a set of points
arranged to a 3D lattice. As the lattice rotates, various view-throughs appear
@@ -59,6 +60,10 @@ Draw the points twice as big.
.TP 8
.B \-fps
Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-symmetry \fSymmetry\fP
+Which crystalographic symmetry system to use. One of "auto", "cubic", or
+"hexagonal". "auto" will randomly select between symmetry systems.
.SH ENVIRONMENT
.PP
.TP 8
diff --git a/hacks/glx/dangerball.c b/hacks/glx/dangerball.c
index 7cb38e0..18cc9d1 100644
--- a/hacks/glx/dangerball.c
+++ b/hacks/glx/dangerball.c
@@ -16,8 +16,6 @@
"*suppressRotationAnimation: True\n" \
# define release_ball 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "colors.h"
@@ -108,13 +106,12 @@ reshape_ball (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
diff --git a/hacks/glx/dangerball.man b/hacks/glx/dangerball.man
index 3e33f82..f50dc03 100644
--- a/hacks/glx/dangerball.man
+++ b/hacks/glx/dangerball.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-dangerball - a 3D ball that periodically extrudes spikes. Ouch!
+dangerball \- a 3D ball that periodically extrudes spikes. Ouch!
.SH SYNOPSIS
.B dangerball
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/deepstars.c b/hacks/glx/deepstars.c
index f415f18..5b530c5 100644
--- a/hacks/glx/deepstars.c
+++ b/hacks/glx/deepstars.c
@@ -30,9 +30,6 @@
#define SMEAR_BASE 400
#define SPEED_BASE 0.02
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#undef BELLRAND
#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
diff --git a/hacks/glx/deepstars.man b/hacks/glx/deepstars.man
index bd4a65a..c95af2a 100644
--- a/hacks/glx/deepstars.man
+++ b/hacks/glx/deepstars.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-deepstars - screen saver.
+deepstars \- screen saver.
.SH SYNOPSIS
.B deepstars
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/discoball.c b/hacks/glx/discoball.c
index 427d7e9..e54d1b3 100644
--- a/hacks/glx/discoball.c
+++ b/hacks/glx/discoball.c
@@ -15,8 +15,6 @@
"*wireframe: False \n" \
# define release_ball 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "normals.h"
@@ -518,13 +516,12 @@ reshape_ball (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
diff --git a/hacks/glx/discoball.man b/hacks/glx/discoball.man
index 041cbd2..96c216a 100644
--- a/hacks/glx/discoball.man
+++ b/hacks/glx/discoball.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-discoball - A dusty, dented disco ball screen saver.
+discoball \- A dusty, dented disco ball screen saver.
.SH SYNOPSIS
.B discoball
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/dnalogo.c b/hacks/glx/dnalogo.c
index 3afb73c..bd79c5b 100644
--- a/hacks/glx/dnalogo.c
+++ b/hacks/glx/dnalogo.c
@@ -61,15 +61,9 @@
"*cwFont: " CWFONT "\n" \
"*geometry: =640x640\n" \
-# if defined(HAVE_COCOA) || defined(HAVE_ANDROID)
-# define CWFONT "Yearling 28, OCR A Std 24"
-# else
-# define CWFONT "-*-helvetica-medium-r-normal-*-*-240-*-*-*-*-*-*"
-# endif
+#define CWFONT "Yearling 28, OCR A Std 24, Courier 24"
# define release_logo 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#undef DXF_OUTPUT_HACK
@@ -2382,11 +2376,6 @@ codeword_text_output (ModeInfo *mi, GLfloat anim_ratio)
buf[1] = 0;
texture_string_metrics (dc->font, buf, &e, &ascent, &descent);
-# ifdef HAVE_MOBILE
- /* #### Magic magic magic WTF... */
- glScalef (0.5, 0.5, 0.5);
-# endif
-
glTranslatef (-e.width * 1.0,
-(ascent + descent + e.descent * 2.4), /* #### WTF */
0);
@@ -2551,14 +2540,12 @@ draw_codeword_path (ModeInfo *mi)
glColor4fv (dc->codeword_color);
glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, dc->codeword_color);
-# ifdef HAVE_MOBILE /* Make the whole thing fit on the phone screen */
{
- GLfloat size = MI_WIDTH(mi) < MI_HEIGHT(mi) ? MI_WIDTH(mi) : MI_HEIGHT(mi);
- glScalef (0.9, 0.9, 0.9);
- if (size <= 768) /* iPad retina / iPhone 6 */
- glScalef (0.7, 0.7, 0.7);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
codeword_text_output (mi, anim_ratio);
@@ -2780,13 +2767,12 @@ reshape_logo (ModeInfo *mi, int width, int height)
0, 0, 0,
0, 1, 0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h); /* #### Why does this change the lighting? */
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
diff --git a/hacks/glx/dropshadow.c b/hacks/glx/dropshadow.c
index 0a5855c..a4a5987 100644
--- a/hacks/glx/dropshadow.c
+++ b/hacks/glx/dropshadow.c
@@ -9,14 +9,11 @@
* implied warranty.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
+#include "screenhackI.h"
+#include "dropshadow.h"
#include <stdlib.h>
-#include "dropshadow.h"
-
/* (Alpha) texture data for drop shadow.
*/
static int drop_shadow_width = 32;
diff --git a/hacks/glx/dropshadow.h b/hacks/glx/dropshadow.h
index 09af0c8..8c7179b 100644
--- a/hacks/glx/dropshadow.h
+++ b/hacks/glx/dropshadow.h
@@ -12,12 +12,6 @@
#ifndef __DROPSHADOW_H__
#define __DROPSHADOW_H__
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
-
-#include "xlockmoreI.h"
-
/* Initialize drop shadow texture, return a texture ID.
*/
GLuint
diff --git a/hacks/glx/dymaxionmap-coords.c b/hacks/glx/dymaxionmap-coords.c
index 1eb064d..8da6c02 100644
--- a/hacks/glx/dymaxionmap-coords.c
+++ b/hacks/glx/dymaxionmap-coords.c
@@ -140,7 +140,7 @@ static double radians(double degrees)
double pi2, c1;
- pi2 = 2 * 3.14159265358979323846;
+ pi2 = 2 * M_PI;
c1 = pi2 / 360;
return(c1 * degrees);
diff --git a/hacks/glx/dymaxionmap.c b/hacks/glx/dymaxionmap.c
index 41de703..1527daa 100644
--- a/hacks/glx/dymaxionmap.c
+++ b/hacks/glx/dymaxionmap.c
@@ -14,7 +14,7 @@
* other special, indirect and consequential damages.
*/
-#define LABEL_FONT "-*-helvetica-bold-r-normal-*-*-240-*-*-*-*-*-*"
+#define LABEL_FONT "sans-serif bold 24"
#ifdef STANDALONE
#define DEFAULTS "*delay: 20000 \n" \
@@ -34,14 +34,6 @@
#include "texfont.h"
#include "dymaxionmap-coords.h"
-#ifdef HAVE_XMU
-# ifndef VMS
-# include <X11/Xmu/Drawing.h>
-#else /* VMS */
-# include <Xmu/Drawing.h>
-# endif /* VMS */
-#endif
-
#define DEF_ROTATE "True"
#define DEF_ROLL "True"
#define DEF_WANDER "True"
@@ -53,9 +45,6 @@
#define DEF_IMAGE2 "NONE"
#define DEF_FRAMES "720"
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#undef BELLRAND
#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
#undef RANDSIGN
@@ -468,7 +457,8 @@ load_images (ModeInfo *mi)
# ifdef HAVE_MOBILE
unsigned long max = 320 * 1024 * 1024L; /* 320 MB */
# else
- unsigned long max = 2 * 1024 * 1024 * 1024L; /* 2 GB */
+ /*unsigned long max = 2 * 1024 * 1024 * 1024L;*/ /* 2 GB */
+ unsigned long max = 0x80000000L; /* 2 GB */
# endif
gp->cache_p = (cache_size < max);
}
diff --git a/hacks/glx/dymaxionmap.man b/hacks/glx/dymaxionmap.man
index 9f3e794..c41e495 100644
--- a/hacks/glx/dymaxionmap.man
+++ b/hacks/glx/dymaxionmap.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-dymaxionmap - An animation of Buckminster Fuller's unwrapped icosahedral globe.
+dymaxionmap \- An animation of Buckminster Fuller's unwrapped icosahedral globe.
.SH SYNOPSIS
.B dymaxionmap
[\-display \fIhost:display.screen\fP]
@@ -94,7 +94,7 @@ stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1)
-.BR glplanet (1)
+.BR glplanet (MANSUFFIX)
.SH COPYRIGHT
Copyright \(co 2016-2018 by Jamie Zawinski. Permission to use, copy, modify,
distribute, and sell this software and its documentation for any purpose is
diff --git a/hacks/glx/endgame.c b/hacks/glx/endgame.c
index cc5f22c..724af95 100644
--- a/hacks/glx/endgame.c
+++ b/hacks/glx/endgame.c
@@ -36,9 +36,6 @@
#include "chessmodels.h"
#include "chessgames.h"
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#define DEF_ROTATE "True"
#define DEF_REFLECTIONS "True"
#define DEF_SHADOWS "True"
diff --git a/hacks/glx/endgame.man b/hacks/glx/endgame.man
index 93ca5c3..c43cf64 100644
--- a/hacks/glx/endgame.man
+++ b/hacks/glx/endgame.man
@@ -57,8 +57,8 @@ It's not unknown for this and other OpenGL hacks to fail under hardware accelara
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1)
-.BR xscreensaver\-demo (1),
-.BR xscreensaver\-getimage (1)
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-getimage (MANSUFFIX)
.SH COPYRIGHT
Copyright \(co 2002 by Blair Tennessy. Permission to use, copy, modify,
distribute, and sell this software and its documentation for any purpose is
diff --git a/hacks/glx/energystream.c b/hacks/glx/energystream.c
index cc8b5b2..b20abb7 100644
--- a/hacks/glx/energystream.c
+++ b/hacks/glx/energystream.c
@@ -18,8 +18,6 @@
"*wireframe: False \n" \
# define release_stream 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "gltrackball.h"
diff --git a/hacks/glx/energystream.man b/hacks/glx/energystream.man
index c2591f3..e149d84 100644
--- a/hacks/glx/energystream.man
+++ b/hacks/glx/energystream.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-energystream - a flow of particles which form an energy stream
+energystream \- a flow of particles which form an energy stream
.SH SYNOPSIS
.B energystream
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/engine.c b/hacks/glx/engine.c
index ba30d81..cdc68f9 100644
--- a/hacks/glx/engine.c
+++ b/hacks/glx/engine.c
@@ -25,7 +25,7 @@
#define DEFAULTS "*delay: 30000 \n" \
"*showFPS: False \n" \
"*suppressRotationAnimation: True\n" \
- "*titleFont: -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n" \
+ "*titleFont: sans-serif 18\n" \
# define release_engine 0
# include "xlockmore.h" /* from the xscreensaver distribution */
@@ -49,9 +49,6 @@
#define DEF_SPIN "True"
#define DEF_MOVE "True"
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
static char *which_engine;
static int move;
static int spin;
@@ -619,14 +616,12 @@ static int display(ModeInfo *mi)
0.0, 1.0, 0.0);
glPushMatrix();
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_sp);
diff --git a/hacks/glx/engine.man b/hacks/glx/engine.man
index af794e5..ff9d644 100644
--- a/hacks/glx/engine.man
+++ b/hacks/glx/engine.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-engine - draws a 3D four-stroke engine.
+engine \- draws a 3D four-stroke engine.
.SH SYNOPSIS
.B engine
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/esper.c b/hacks/glx/esper.c
index 90887a8..bbc0aa6 100644
--- a/hacks/glx/esper.c
+++ b/hacks/glx/esper.c
@@ -1,4 +1,4 @@
-/* esper, Copyright (c) 2017-2018 Jamie Zawinski <jwz@jwz.org>
+/* esper, Copyright © 2017-2021 Jamie Zawinski <jwz@jwz.org>
* Enhance 224 to 176. Pull out track right. Center in pull back.
* Pull back. Wait a minute. Go right. Stop. Enhance 57 19. Track 45 left.
* Gimme a hardcopy right there.
@@ -126,13 +126,8 @@
/* Use a small point size to keep it nice and grainy. */
-#if defined(HAVE_COCOA) || defined(HAVE_ANDROID)
-# define TITLE_FONT "OCR A Std 10, Lucida Console 10, Monaco 10"
-#elif 0 /* real X11, XQueryFont() */
-# define TITLE_FONT "-*-courier-bold-r-*-*-*-100-*-*-m-*-*-*"
-#else /* real X11, load_font_retry() */
-# define TITLE_FONT "-*-ocr a std-medium-r-*-*-*-100-*-*-m-*-*-*"
-#endif
+#define TITLE_FONT \
+ "OCR A Std 10, Lucida Console 10, Monaco 10, Courier 10, monospace 10"
#define DEFAULTS "*delay: 20000 \n" \
"*wireframe: False \n" \
@@ -151,9 +146,6 @@
# define release_esper 0
# include "xlockmore.h"
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#undef RANDSIGN
#define RANDSIGN() ((random() & 1) ? 1 : -1)
#undef BELLRAND
@@ -162,6 +154,7 @@
#ifdef USE_GL
#undef SMOOTH
+#define USE_ASYNC_LOADER
# define DEF_GRID_SIZE "11"
# define DEF_GRID_THICKNESS "15"
@@ -189,6 +182,9 @@ typedef struct {
int tw, th; /* size in pixels of the texture */
XRectangle geom; /* where in the image the bits are */
Bool loaded_p; /* whether the image has finished loading */
+# ifdef USE_ASYNC_LOADER
+ texture_loader_t *loader; /* asynchronous image loader */
+# endif
Bool used_p; /* whether the image has yet appeared
on screen */
GLuint texid; /* which texture contains the image */
@@ -388,6 +384,18 @@ alloc_image (ModeInfo *mi)
# elif defined(__APPLE__)
/* MacOS 10.13 "sysctl kern.sysv.shmmax" is paltry: */
shmmax = 0x400000;
+# elif defined(__linux__)
+ {
+ /* Raspbian 10.6 = 0xFEFFFFFF, CentOS 7.7 = 0xFFFFFFFFFEFFFFFF */
+ FILE *fp = fopen ("/proc/sys/kernel/shmmax", "r");
+ if (fp)
+ {
+ int result = fscanf (fp, "%lu", &shmmax);
+ if (!result || result == EOF)
+ shmmax = 0; /* Just go with max_max. */
+ fclose (fp);
+ }
+ }
# endif /* !SHMMAX */
if (shmmax)
@@ -407,8 +415,14 @@ alloc_image (ModeInfo *mi)
if (max < MI_WIDTH(mi) || max < MI_HEIGHT(mi))
max = 0;
+# ifdef USE_ASYNC_LOADER
+ img->loader = alloc_texture_loader (mi->xgwa.screen, mi->window,
+ *ss->glx_context, 0, 0, False,
+ img->texid);
+# else
load_texture_async (mi->xgwa.screen, mi->window, *ss->glx_context,
max, max, False, img->texid, image_loaded_cb, img);
+# endif
}
ss->images[ss->nimages++] = img;
@@ -442,6 +456,15 @@ image_loaded_cb (const char *filename, XRectangle *geom,
goto DONE;
}
+# ifdef USE_ASYNC_LOADER
+ if (img->loader)
+ {
+ texture_loader_t *loader = img->loader;
+ img->loader = 0;
+ free_texture_loader (loader);
+ }
+# endif
+
if (image_width == 0 || image_height == 0)
exit (1);
@@ -639,8 +662,9 @@ copy_sprite (ModeInfo *mi, sprite *old)
{
sprite *sp = new_sprite (mi, (sprite_type) ~0L);
int id;
- double tt = sp->start_time;
+ double tt;
if (!sp) abort();
+ tt = sp->start_time;
id = sp->id;
memcpy (sp, old, sizeof(*sp));
sp->id = id;
@@ -1172,7 +1196,9 @@ draw_text_sprite (ModeInfo *mi, sprite *sp)
if (wire)
glEnable (GL_TEXTURE_2D);
+#ifndef HAVE_ANDROID /* Doesn't work -- prevents image loading? */
print_texture_string (ss->font_data, text);
+# endif
mi->polygon_count++;
if (wire)
@@ -1212,6 +1238,7 @@ draw_flash_sprite (ModeInfo *mi, sprite *sp)
static void
draw_sprite (ModeInfo *mi, sprite *sp)
{
+ glEnable (GL_BLEND);
switch (sp->type) {
case IMAGE:
draw_image_sprite (mi, sp);
@@ -1238,6 +1265,22 @@ tick_sprites (ModeInfo *mi)
{
esper_state *ss = &sss[MI_SCREEN(mi)];
int i;
+
+# ifdef USE_ASYNC_LOADER
+ double end_by_time = ss->now + ((double) mi->pause) / 2000000;
+ for (i = 0; i < ss->nimages; i++)
+ {
+ image *img = ss->images[i];
+ if (img->loader)
+ {
+ if (texture_loader_failed (img->loader))
+ abort();
+ step_texture_loader (img->loader, end_by_time - double_time(),
+ image_loaded_cb, img);
+ }
+ }
+# endif
+
for (i = 0; i < ss->nsprites; i++)
tick_sprite (mi, ss->sprites[i]);
@@ -1602,8 +1645,9 @@ tick_animation (ModeInfo *mi)
/* Only advance once an image has loaded. */
if (find_newest_sprite (mi, IMAGE))
ss->anim_state = RETICLE_ON;
- else
+ else {
ss->anim_state = IMAGE_LOAD;
+ }
break;
case RETICLE_ON:
ss->anim_state = RETICLE_MOVE;
@@ -2340,7 +2384,6 @@ init_esper (ModeInfo *mi)
{
int screen = MI_SCREEN(mi);
esper_state *ss;
- int wire = MI_IS_WIREFRAME(mi);
MI_INIT (mi, sss);
ss = &sss[screen];
@@ -2355,20 +2398,6 @@ init_esper (ModeInfo *mi)
parse_color (mi, "reticleColor", ss->reticle_color);
parse_color (mi, "textColor", ss->text_color);
- glDisable (GL_LIGHTING);
- glDisable (GL_DEPTH_TEST);
- glDepthMask (GL_FALSE);
- glEnable (GL_CULL_FACE);
- glCullFace (GL_BACK);
-
- if (! wire)
- {
- glEnable (GL_TEXTURE_2D);
- glShadeModel (GL_SMOOTH);
- glEnable (GL_BLEND);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- }
-
ss->font_data = load_texture_font (mi->dpy, "titleFont");
ss->now = double_time();
@@ -2386,6 +2415,7 @@ ENTRYPOINT void
draw_esper (ModeInfo *mi)
{
esper_state *ss = &sss[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
if (!ss->glx_context)
return;
@@ -2396,6 +2426,20 @@ draw_esper (ModeInfo *mi)
ss->now = double_time();
+ glDisable (GL_LIGHTING);
+ glDisable (GL_DEPTH_TEST);
+ glDepthMask (GL_FALSE);
+ glEnable (GL_CULL_FACE);
+ glCullFace (GL_BACK);
+
+ if (! wire)
+ {
+ glEnable (GL_TEXTURE_2D);
+ glShadeModel (GL_SMOOTH);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
tick_sprites (mi);
draw_sprites (mi);
if (ss->now >= ss->anim_start + ss->anim_duration)
diff --git a/hacks/glx/esper.man b/hacks/glx/esper.man
index 4d994d9..48a4e78 100644
--- a/hacks/glx/esper.man
+++ b/hacks/glx/esper.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-esper - Enhance 224 to 176. Go right. Enhance 57 19. Track 45 left.
+esper \- Enhance 224 to 176. Go right. Enhance 57 19. Track 45 left.
.SH SYNOPSIS
.B esper
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/etruscanvenus.c b/hacks/glx/etruscanvenus.c
index 71af80a..80a8d9b 100644
--- a/hacks/glx/etruscanvenus.c
+++ b/hacks/glx/etruscanvenus.c
@@ -7,7 +7,7 @@
static const char sccsid[] = "@(#)etruscanvenus.c 1.1 05/01/20 xlockmore";
#endif
-/* Copyright (c) 2019-2020 Carsten Steger <carsten@mirsanmir.org>. */
+/* Copyright (c) 2019-2021 Carsten Steger <carsten@mirsanmir.org>. */
/*
* Permission to use, copy, modify, and distribute this software and its
@@ -24,6 +24,8 @@ static const char sccsid[] = "@(#)etruscanvenus.c 1.1 05/01/20 xlockmore";
*
* REVISION HISTORY:
* C. Steger - 05/01/20: Initial version
+ * C. Steger - 20/12/20: Added per-fragment shading
+ * C. Steger - 20/12/30: Make the shader code work under macOS and iOS
*/
/*
@@ -175,9 +177,11 @@ static const char sccsid[] = "@(#)etruscanvenus.c 1.1 05/01/20 xlockmore";
#define DEF_DEFORM_SPEED "10.0"
#define DEF_INIT_DEFORM "0.0"
+
#ifdef STANDALONE
-# define DEFAULTS "*delay: 10000 \n" \
+# define DEFAULTS "*delay: 25000 \n" \
"*showFPS: False \n" \
+ "*prefersGLSL: True \n" \
# define release_etruscanvenus 0
# include "xlockmore.h" /* from the xscreensaver distribution */
@@ -187,10 +191,7 @@ static const char sccsid[] = "@(#)etruscanvenus.c 1.1 05/01/20 xlockmore";
#ifdef USE_GL
-#ifndef HAVE_JWXYZ
-# include <X11/keysym.h>
-#endif
-
+#include "glsl-utils.h"
#include "gltrackball.h"
#include <float.h>
@@ -342,7 +343,7 @@ typedef struct {
int defdir;
/* The viewing offset in 3d */
float offset3d[3];
- /* The 3d coordinates of the surface and their derivatives */
+ /* The 3d coordinates of the surface and their normals */
float *ev;
float *evn;
/* The precomputed colors of the surface */
@@ -358,11 +359,241 @@ typedef struct {
Bool button_pressed;
/* A random factor to modify the rotation speeds */
float speed_scale;
+#ifdef HAVE_GLSL
+ GLfloat *uv;
+ GLuint *indices;
+ Bool use_shaders, buffers_initialized;
+ GLuint shader_program;
+ GLint vertex_uv_index, vertex_t_index, color_index;
+ GLint mat_mv_index, mat_p_index, db_index, dl_index;
+ GLint bool_textures_index, draw_lines_index;
+ GLint glbl_ambient_index, lt_ambient_index;
+ GLint lt_diffuse_index, lt_specular_index;
+ GLint lt_direction_index, lt_halfvect_index;
+ GLint front_ambient_index, back_ambient_index;
+ GLint front_diffuse_index, back_diffuse_index;
+ GLint specular_index, shininess_index;
+ GLint texture_sampler_index;
+ GLuint vertex_uv_buffer, vertex_t_buffer;
+ GLuint color_buffer, indices_buffer;
+ GLint ni, ne, nt;
+#endif /* HAVE_GLSL */
} etruscanvenusstruct;
static etruscanvenusstruct *etruscanvenus = (etruscanvenusstruct *) NULL;
+#ifdef HAVE_GLSL
+
+/* The GLSL versions that correspond to different versions of OpenGL. */
+static const GLchar *shader_version_2_1 =
+ "#version 120\n";
+static const GLchar *shader_version_3_0 =
+ "#version 130\n";
+static const GLchar *shader_version_3_0_es =
+ "#version 300 es\n"
+ "precision highp float;\n"
+ "precision highp int;\n";
+
+/* The vertex shader code is composed of code fragments that depend on
+ the OpenGL version and code fragments that are version-independent.
+ They are concatenated by glsl_CompileAndLinkShaders in the function
+ init_glsl(). */
+static const GLchar *vertex_shader_attribs_2_1 =
+ "attribute vec3 VertexUV;\n"
+ "attribute vec4 VertexT;\n"
+ "attribute vec4 VertexColor;\n"
+ "\n"
+ "varying vec3 Normal;\n"
+ "varying vec4 Color;\n"
+ "varying vec4 TexCoord;\n"
+ "\n";
+static const GLchar *vertex_shader_attribs_3_0 =
+ "in vec3 VertexUV;\n"
+ "in vec4 VertexT;\n"
+ "in vec4 VertexColor;\n"
+ "\n"
+ "out vec3 Normal;\n"
+ "out vec4 Color;\n"
+ "out vec4 TexCoord;\n"
+ "\n";
+static const GLchar *vertex_shader_main =
+ "uniform mat4 MatModelView;\n"
+ "uniform mat4 MatProj;\n"
+ "uniform float DB;\n"
+ "uniform float DL;\n"
+ "uniform bool BoolTextures;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " const float EPSILON = 1.19e-6f;\n"
+ " const float M_SQRT2 = 1.41421356237f;\n"
+ " float u = VertexUV.x;\n"
+ " float v = VertexUV.y;\n"
+ " float bosqrt2 = DB/M_SQRT2;\n"
+ " float b2osqrt2 = 2.0f*bosqrt2;\n"
+ " float b3osqrt2 = 3.0f*bosqrt2;\n"
+ " float cu = cos(u);\n"
+ " float su = sin(u);\n"
+ " float c2u = cos(2.0f*u);\n"
+ " float s2u = sin(2.0f*u);\n"
+ " float c3u = cos(3.0f*u);\n"
+ " float s3u = sin(3.0f*u);\n"
+ " float cv = cos(v);\n"
+ " float sv = sin(v);\n"
+ " float c2v = cos(2.0f*v);\n"
+ " float s2v = sin(2.0f*v);\n"
+ " float nom = (1.0f-DL+DL*cv);\n"
+ " float den = (1.0f-bosqrt2*s3u*s2v);\n"
+ " float f = nom/den;\n"
+ " float fx = c2u*cv+cu*sv;\n"
+ " float fy = s2u*cv-su*sv;\n"
+ " float fz = M_SQRT2*cv;\n"
+ " vec3 x = f*vec3(fx,fy,fz);\n"
+ " float nomv = -DL*sv;\n"
+ " float denu = -b3osqrt2*c3u*s2v;\n"
+ " float denv = -b2osqrt2*s3u*c2v;\n"
+ " float den2 = 1.0f/(den*den);\n"
+ " float fu = -nom*denu*den2;\n"
+ " float fv = (den*nomv-nom*denv)*den2;\n"
+ " float fxu = -su*sv-2.0f*s2u*cv;\n"
+ " float fxv = cu*cv-c2u*sv;\n"
+ " float fyu = 2.0f*c2u*cv-cu*sv;\n"
+ " float fyv = -s2u*sv-su*cv;\n"
+ " float fzv = -M_SQRT2*sv;\n"
+ " vec3 xu = vec3(fu*fx+f*fxu,fu*fy+f*fyu,fu*fz);\n"
+ " vec3 xv = vec3(fv*fx+f*fxv,fv*fy+f*fyv,fv*fz+f*fzv);\n"
+ " vec3 n = cross(xu,xv);\n"
+ " float t = length(n);\n"
+ " if (t < EPSILON)\n"
+ " {\n"
+ " u += 0.01f;\n"
+ " v += 0.01f;\n"
+ " cu = cos(u);\n"
+ " su = sin(u);\n"
+ " c2u = cos(2.0f*u);\n"
+ " s2u = sin(2.0f*u);\n"
+ " c3u = cos(3.0f*u);\n"
+ " s3u = sin(3.0f*u);\n"
+ " cv = cos(v);\n"
+ " sv = sin(v);\n"
+ " c2v = cos(2.0f*v);\n"
+ " s2v = sin(2.0f*v);\n"
+ " nom = (1.0f-DL+DL*cv);\n"
+ " den = (1.0f-bosqrt2*s3u*s2v);\n"
+ " f = nom/den;\n"
+ " fx = c2u*cv+cu*sv;\n"
+ " fy = s2u*cv-su*sv;\n"
+ " fz = M_SQRT2*cv;\n"
+ " nomv = -DL*sv;\n"
+ " denu = -b3osqrt2*c3u*s2v;\n"
+ " denv = -b2osqrt2*s3u*c2v;\n"
+ " den2 = 1.0f/(den*den);\n"
+ " fu = -nom*denu*den2;\n"
+ " fv = (den*nomv-nom*denv)*den2;\n"
+ " fxu = -su*sv-2.0f*s2u*cv;\n"
+ " fxv = cu*cv-c2u*sv;\n"
+ " fyu = 2.0f*c2u*cv-cu*sv;\n"
+ " fyv = -s2u*sv-su*cv;\n"
+ " fzv = -M_SQRT2*sv;\n"
+ " xu = vec3(fu*fx+f*fxu,fu*fy+f*fyu,fu*fz);\n"
+ " xv = vec3(fv*fx+f*fxv,fv*fy+f*fyv,fv*fz+f*fzv);\n"
+ " }\n"
+ " vec4 Position = MatModelView*vec4(x,1.0f);\n"
+ " vec4 pu = MatModelView*vec4(xu,0.0f);\n"
+ " vec4 pv = MatModelView*vec4(xv,0.0f);\n"
+ " Normal = normalize(cross(pu.xyz,pv.xyz));\n"
+ " gl_Position = MatProj*Position;\n"
+ " Color = VertexColor;\n"
+ " if (BoolTextures)\n"
+ " TexCoord = VertexT;\n"
+ "}\n";
+
+/* The fragment shader code is composed of code fragments that depend on
+ the OpenGL version and code fragments that are version-independent.
+ They are concatenated by glsl_CompileAndLinkShaders in the function
+ init_glsl(). */
+static const GLchar *fragment_shader_attribs_2_1 =
+ "varying vec3 Normal;\n"
+ "varying vec4 Color;\n"
+ "varying vec4 TexCoord;\n"
+ "\n";
+static const GLchar *fragment_shader_attribs_3_0 =
+ "in vec3 Normal;\n"
+ "in vec4 Color;\n"
+ "in vec4 TexCoord;\n"
+ "\n"
+ "out vec4 FragColor;\n"
+ "\n";
+static const GLchar *fragment_shader_main =
+ "uniform bool DrawLines;\n"
+ "uniform vec4 LtGlblAmbient;\n"
+ "uniform vec4 LtAmbient, LtDiffuse, LtSpecular;\n"
+ "uniform vec3 LtDirection, LtHalfVector;\n"
+ "uniform vec4 MatFrontAmbient, MatBackAmbient;\n"
+ "uniform vec4 MatFrontDiffuse, MatBackDiffuse;\n"
+ "uniform vec4 MatSpecular;\n"
+ "uniform float MatShininess;\n"
+ "uniform bool BoolTextures;\n"
+ "uniform sampler2D TextureSampler;"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " vec4 color;\n"
+ " if (DrawLines)\n"
+ " {\n"
+ " color = Color;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " vec3 normalDirection;\n"
+ " vec4 ambientColor, diffuseColor, sceneColor;\n"
+ " vec4 ambientLighting, diffuseReflection, specularReflection;\n"
+ " float ndotl, ndoth, pf;\n"
+ " \n"
+ " if (gl_FrontFacing)\n"
+ " {\n"
+ " normalDirection = normalize(Normal);\n"
+ " sceneColor = Color*MatFrontAmbient*LtGlblAmbient;\n"
+ " ambientColor = Color*MatFrontAmbient;\n"
+ " diffuseColor = Color*MatFrontDiffuse;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " normalDirection = -normalize(Normal);\n"
+ " sceneColor = Color*MatBackAmbient*LtGlblAmbient;\n"
+ " ambientColor = Color*MatBackAmbient;\n"
+ " diffuseColor = Color*MatBackDiffuse;\n"
+ " }\n"
+ " \n"
+ " ndotl = max(0.0,dot(normalDirection,LtDirection));\n"
+ " ndoth = max(0.0,dot(normalDirection,LtHalfVector));\n"
+ " if (ndotl == 0.0)\n"
+ " pf = 0.0;\n"
+ " else\n"
+ " pf = pow(ndoth,MatShininess);\n"
+ " ambientLighting = ambientColor*LtAmbient;\n"
+ " diffuseReflection = LtDiffuse*diffuseColor*ndotl;\n"
+ " specularReflection = LtSpecular*MatSpecular*pf;\n"
+ " color = sceneColor+ambientLighting+diffuseReflection;\n";
+static const GLchar *fragment_shader_out_2_1 =
+ " if (BoolTextures)\n"
+ " color *= texture2D(TextureSampler,TexCoord.st);"
+ " color += specularReflection;\n"
+ " }\n"
+ " gl_FragColor = clamp(color,0.0,1.0);\n"
+ "}\n";
+static const GLchar *fragment_shader_out_3_0 =
+ " if (BoolTextures)\n"
+ " color *= texture(TextureSampler,TexCoord.st);"
+ " color += specularReflection;\n"
+ " }\n"
+ " FragColor = clamp(color,0.0,1.0);\n"
+ "}\n";
+
+#endif /* HAVE_GLSL */
+
+
/* Add a rotation around the x-axis to the matrix m. */
static void rotatex(float m[3][3], float phi)
{
@@ -605,11 +836,206 @@ static void setup_etruscan_venus_color_texture(ModeInfo *mi, double umin,
}
-/* Draw a 3d immersion of the surface. */
-static int etruscan_venus(ModeInfo *mi, double umin, double umax,
- double vmin, double vmax, int numu, int numv)
+/* Compute the current walk frame, i.e., the coordinate system of the
+ point and direction at which the viewer is currently walking on the
+ surface. */
+static void compute_walk_frame(etruscanvenusstruct *ev, float db,
+ float dl, float radius, float oz,
+ float mat[3][3])
+{
+ float p[3], pu[3], pv[3], pm[3], n[3], b[3];
+ int l, m;
+ float u, v;
+ float xx[3], xxu[3], xxv[3];
+ float r, t;
+ float cv, sv, c2v, s2v, cu, su, c2u, s2u, c3u, s3u;
+ float bosqrt2, b2osqrt2, b3osqrt2, nom, den, nomv, denu, denv, den2;
+ float f, fx, fy, fz, x, y, z;
+ float fu, fv, fxu, fxv, fyu, fyv, fzv, xu, xv, yu, yv, zu, zv;
+
+ u = ev->umove;
+ v = ev->vmove;
+ u = 0.5f*u;
+ bosqrt2 = db/(float)M_SQRT2;
+ b2osqrt2 = 2.0f*bosqrt2;
+ b3osqrt2 = 3.0f*bosqrt2;
+ cu = cosf(u);
+ su = sinf(u);
+ c2u = cosf(2.0f*u);
+ s2u = sinf(2.0f*u);
+ c3u = cosf(3.0f*u);
+ s3u = sinf(3.0f*u);
+ cv = cosf(v);
+ sv = sinf(v);
+ c2v = cosf(2.0f*v);
+ s2v = sinf(2.0f*v);
+ nom = (1.0f-dl+dl*cv);
+ den = (1.0f-bosqrt2*s3u*s2v);
+ f = nom/den;
+ fx = c2u*cv+cu*sv;
+ fy = s2u*cv-su*sv;
+ fz = (float)M_SQRT2*cv;
+ x = f*fx;
+ y = f*fy;
+ z = f*fz;
+ nomv = -dl*sv;
+ denu = -b3osqrt2*c3u*s2v;
+ denv = -b2osqrt2*s3u*c2v;
+ den2 = 1.0f/(den*den);
+ fu = -nom*denu*den2;
+ fv = (den*nomv-nom*denv)*den2;
+ fxu = -su*sv-2.0f*s2u*cv;
+ fxv = cu*cv-c2u*sv;
+ fyu = 2.0f*c2u*cv-cu*sv;
+ fyv = -s2u*sv-su*cv;
+ fzv = -(float)M_SQRT2*sv;
+ xu = fu*fx+f*fxu;
+ xv = fv*fx+f*fxv;
+ yu = fu*fy+f*fyu;
+ yv = fv*fy+f*fyv;
+ zu = fu*fz;
+ zv = fv*fz+f*fzv;
+ xx[0] = x;
+ xx[1] = y;
+ xx[2] = z-oz;
+ n[0] = yu*zv-zu*yv;
+ n[1] = zu*xv-xu*zv;
+ n[2] = xu*yv-yu*xv;
+ t = n[0]*n[0]+n[1]*n[1]+n[2]*n[2];
+ /* Avoid degenerate tangential plane basis vectors as much as possible. */
+ if (t < 10.0f*FLT_EPSILON)
+ {
+ u += 0.01f;
+ v += 0.01f;
+ cu = cosf(u);
+ su = sinf(u);
+ c2u = cosf(2.0f*u);
+ s2u = sinf(2.0f*u);
+ c3u = cosf(3.0f*u);
+ s3u = sinf(3.0f*u);
+ cv = cosf(v);
+ sv = sinf(v);
+ c2v = cosf(2.0f*v);
+ s2v = sinf(2.0f*v);
+ nom = (1.0f-dl+dl*cv);
+ den = (1.0f-bosqrt2*s3u*s2v);
+ f = nom/den;
+ fx = c2u*cv+cu*sv;
+ fy = s2u*cv-su*sv;
+ fz = (float)M_SQRT2*cv;
+ nomv = -dl*sv;
+ denu = -b3osqrt2*c3u*s2v;
+ denv = -b2osqrt2*s3u*c2v;
+ den2 = 1.0f/(den*den);
+ fu = -nom*denu*den2;
+ fv = (den*nomv-nom*denv)*den2;
+ fxu = -su*sv-2.0f*s2u*cv;
+ fxv = cu*cv-c2u*sv;
+ fyu = 2.0f*c2u*cv-cu*sv;
+ fyv = -s2u*sv-su*cv;
+ fzv = -(float)M_SQRT2*sv;
+ xu = fu*fx+f*fxu;
+ xv = fv*fx+f*fxv;
+ yu = fu*fy+f*fyu;
+ yv = fv*fy+f*fyv;
+ zu = fu*fz;
+ zv = fv*fz+f*fzv;
+ }
+ xxu[0] = xu;
+ xxu[1] = yu;
+ xxu[2] = zu;
+ xxv[0] = xv;
+ xxv[1] = yv;
+ xxv[2] = zv;
+ for (l=0; l<3; l++)
+ {
+ p[l] = xx[l]*radius;
+ pu[l] = xxu[l]*radius;
+ pv[l] = xxv[l]*radius;
+ }
+ n[0] = pu[1]*pv[2]-pu[2]*pv[1];
+ n[1] = pu[2]*pv[0]-pu[0]*pv[2];
+ n[2] = pu[0]*pv[1]-pu[1]*pv[0];
+ t = 1.0f/(ev->side*4.0f*sqrtf(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]));
+ n[0] *= t;
+ n[1] *= t;
+ n[2] *= t;
+ pm[0] = 0.5f*pu[0]*ev->dumove+pv[0]*ev->dvmove;
+ pm[1] = 0.5f*pu[1]*ev->dumove+pv[1]*ev->dvmove;
+ pm[2] = 0.5f*pu[2]*ev->dumove+pv[2]*ev->dvmove;
+ t = 1.0f/(4.0f*sqrtf(pm[0]*pm[0]+pm[1]*pm[1]+pm[2]*pm[2]));
+ pm[0] *= t;
+ pm[1] *= t;
+ pm[2] *= t;
+ b[0] = n[1]*pm[2]-n[2]*pm[1];
+ b[1] = n[2]*pm[0]-n[0]*pm[2];
+ b[2] = n[0]*pm[1]-n[1]*pm[0];
+ t = 1.0f/(4.0f*sqrtf(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]));
+ b[0] *= t;
+ b[1] *= t;
+ b[2] *= t;
+
+ /* Compute alpha, beta, gamma from the three basis vectors.
+ | -b[0] -b[1] -b[2] |
+ m = | n[0] n[1] n[2] |
+ | -pm[0] -pm[1] -pm[2] |
+ */
+ ev->alpha = atan2f(-n[2],-pm[2])*180.0f/(float)M_PI;
+ ev->beta = atan2f(-b[2],sqrtf(b[0]*b[0]+b[1]*b[1]))*180.0f/(float)M_PI;
+ ev->delta = atan2f(b[1],-b[0])*180.0f/(float)M_PI;
+
+ /* Compute the rotation that rotates the surface in 3D. */
+ rotateall(ev->alpha,ev->beta,ev->delta,mat);
+
+ u = ev->umove;
+ v = ev->vmove;
+ u = 0.5f*u;
+ bosqrt2 = db/(float)M_SQRT2;
+ b2osqrt2 = 2.0f*bosqrt2;
+ b3osqrt2 = 3.0f*bosqrt2;
+ cu = cosf(u);
+ su = sinf(u);
+ c2u = cosf(2.0f*u);
+ s2u = sinf(2.0f*u);
+ s3u = sinf(3.0f*u);
+ cv = cosf(v);
+ sv = sinf(v);
+ s2v = sinf(2.0f*v);
+ nom = (1.0f-dl+dl*cv);
+ den = (1.0f-bosqrt2*s3u*s2v);
+ f = nom/den;
+ fx = c2u*cv+cu*sv;
+ fy = s2u*cv-su*sv;
+ fz = (float)M_SQRT2*cv;
+ x = f*fx;
+ y = f*fy;
+ z = f*fz;
+ xx[0] = x;
+ xx[1] = y;
+ xx[2] = z-oz;
+ for (l=0; l<3; l++)
+ {
+ r = 0.0f;
+ for (m=0; m<3; m++)
+ r += mat[l][m]*xx[m];
+ p[l] = r*radius;
+ }
+
+ ev->offset3d[0] = -p[0];
+ ev->offset3d[1] = -p[1]-DELTAY;
+ ev->offset3d[2] = -p[2];
+}
+
+
+/* Draw a 3d immersion of the surface using OpenGL's fixed functionality. */
+static int etruscan_venus_ff(ModeInfo *mi, double umin, double umax,
+ double vmin, double vmax, int numu, int numv)
{
- int polys = 0;
+ static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+ static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
+ static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
static const GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
static const GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
static const GLfloat mat_diff_oneside[] = { 0.9, 0.4, 0.3, 1.0 };
@@ -617,226 +1043,139 @@ static int etruscan_venus(ModeInfo *mi, double umin, double umax,
static const GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 };
static const GLfloat mat_diff_trans_oneside[] = { 0.9, 0.4, 0.3, 0.7 };
float mat_diff_dyn[4], mat_diff_dyn_compl[4];
- float p[3], pu[3], pv[3], pm[3], n[3], b[3], mat[3][3], matc[3][3];
+ float p[3], pu[3], pv[3], n[3], mat[3][3], matc[3][3];
int i, j, k, l, m, o;
- double u, v, ur, vr, oz, vc;
- double xx[3], xxu[3], xxv[3];
- double r, s, t;
- double dd, bb, ll, db, dl, radius;
- double cv, sv, c2v, s2v, cu, su, c2u, s2u, c3u, s3u;
- double bosqrt2, b2osqrt2, b3osqrt2, nom, den, nomv, denu, denv, den2;
- double f, fx, fy, fz, x, y, z;
- double fu, fv, fxu, fxv, fyu, fyv, fzv, xu, xv, yu, yv, zu, zv;
+ float u, v, ur, vr, oz, vc;
+ float xx[3], xxu[3], xxv[3];
+ float r, s, t;
+ float dd, bb, ll, db, dl, radius;
+ float cv, sv, c2v, s2v, cu, su, c2u, s2u, c3u, s3u;
+ float bosqrt2, b2osqrt2, b3osqrt2, nom, den, nomv, denu, denv, den2;
+ float f, fx, fy, fz, x, y, z;
+ float fu, fv, fxu, fxv, fyu, fyv, fzv, xu, xv, yu, yv, zu, zv;
float qu[4], r1[3][3], r2[3][3];
etruscanvenusstruct *ev = &etruscanvenus[MI_SCREEN(mi)];
+ int polys;
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ if (ev->projection == DISP_PERSPECTIVE || ev->view == VIEW_WALK)
+ {
+ if (ev->view == VIEW_WALK)
+ gluPerspective(60.0,ev->aspect,0.01,10.0);
+ else
+ gluPerspective(60.0,ev->aspect,0.1,10.0);
+ }
+ else
+ {
+ if (ev->aspect >= 1.0)
+ glOrtho(-ev->aspect,ev->aspect,-1.0,1.0,0.1,10.0);
+ else
+ glOrtho(-1.0,1.0,-1.0/ev->aspect,1.0/ev->aspect,0.1,10.0);
+ }
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ if (ev->display_mode == DISP_SURFACE)
+ {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glDepthMask(GL_TRUE);
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+ glDisable(GL_BLEND);
+ }
+ else if (ev->display_mode == DISP_TRANSPARENT)
+ {
+ glDisable(GL_DEPTH_TEST);
+ glDepthMask(GL_FALSE);
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ }
+ else /* ev->display_mode == DISP_WIREFRAME */
+ {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glDepthMask(GL_TRUE);
+ glShadeModel(GL_FLAT);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_LIGHT0);
+ glDisable(GL_BLEND);
+ }
+
+ if (ev->marks)
+ {
+ glEnable(GL_TEXTURE_2D);
+#ifndef HAVE_JWZGLES
+ glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SEPARATE_SPECULAR_COLOR);
+#endif
+ }
+ else
+ {
+ glDisable(GL_TEXTURE_2D);
+#ifndef HAVE_JWZGLES
+ glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SINGLE_COLOR);
+#endif
+ }
dd = ev->dd;
- if (dd < 1.0)
+ if (dd < 1.0f)
{
- bb = 0.0;
+ bb = 0.0f;
ll = dd;
}
- else if (dd < 2.0)
+ else if (dd < 2.0f)
{
- bb = dd-1.0;
+ bb = dd-1.0f;
ll = 1.0;
}
- else if (dd < 3.0)
+ else if (dd < 3.0f)
{
- bb = 1.0;
- ll = 3.0-dd;
+ bb = 1.0f;
+ ll = 3.0f-dd;
}
- else /* dd < 4.0 */
+ else /* dd < 4.0f */
{
- bb = 4.0-dd;
- ll = 0.0;
+ bb = 4.0f-dd;
+ ll = 0.0f;
}
- db = ((6.0*bb-15.0)*bb+10.0)*bb*bb*bb;
- dl = ((6.0*ll-15.0)*ll+10.0)*ll*ll*ll;
+ db = ((6.0f*bb-15.0f)*bb+10.0f)*bb*bb*bb;
+ dl = ((6.0f*ll-15.0f)*ll+10.0f)*ll*ll*ll;
/* Calculate the approximate center of the surface in the z direction. */
- oz = (Z1*(sin(0.5*M_PI*pow(dl,Z3))+Z2*sin(1.5*M_PI*pow(dl,Z3)))*
- exp(Z4*pow(db,Z5)));
+ oz = (Z1*(sinf(0.5f*M_PI*powf(dl,Z3))+Z2*sinf(1.5f*M_PI*powf(dl,Z3)))*
+ expf(Z4*powf(db,Z5)));
/* Calculate the approximate radius of the surface. */
- r = R1+(db-0.5)*(dl-0.5)+R2*exp(R3*(1.0-db))*exp(R4*dl);
- radius = 0.8/r;
+ r = R1+(db-0.5f)*(dl-0.5f)+R2*expf(R3*(1.0f-db))*expf(R4*dl);
+ radius = 0.8f/r;
if (ev->change_colors)
rotateall(ev->rho,ev->sigma,ev->tau,matc);
if (ev->view == VIEW_WALK)
{
- u = ev->umove;
- v = ev->vmove;
- u = 0.5*u;
- bosqrt2 = db/M_SQRT2;
- b2osqrt2 = 2.0*bosqrt2;
- b3osqrt2 = 3.0*bosqrt2;
- cu = cos(u);
- su = sin(u);
- c2u = cos(2.0*u);
- s2u = sin(2.0*u);
- c3u = cos(3.0*u);
- s3u = sin(3.0*u);
- cv = cos(v);
- sv = sin(v);
- c2v = cos(2.0*v);
- s2v = sin(2.0*v);
- nom = (1.0-dl+dl*cv);
- den = (1.0-bosqrt2*s3u*s2v);
- f = nom/den;
- fx = c2u*cv+cu*sv;
- fy = s2u*cv-su*sv;
- fz = M_SQRT2*cv;
- x = f*fx;
- y = f*fy;
- z = f*fz;
- nomv = -dl*sv;
- denu = -b3osqrt2*c3u*s2v;
- denv = -b2osqrt2*s3u*c2v;
- den2 = 1.0/(den*den);
- fu = -nom*denu*den2;
- fv = (den*nomv-nom*denv)*den2;
- fxu = -su*sv-2.0*s2u*cv;
- fxv = cu*cv-c2u*sv;
- fyu = 2.0*c2u*cv-cu*sv;
- fyv = -s2u*sv-su*cv;
- fzv = -M_SQRT2*sv;
- xu = fu*fx+f*fxu;
- xv = fv*fx+f*fxv;
- yu = fu*fy+f*fyu;
- yv = fv*fy+f*fyv;
- zu = fu*fz;
- zv = fv*fz+f*fzv;
- xx[0] = x;
- xx[1] = y;
- xx[2] = z-oz;
- n[0] = yu*zv-zu*yv;
- n[1] = zu*xv-xu*zv;
- n[2] = xu*yv-yu*xv;
- t = n[0]*n[0]+n[1]*n[1]+n[2]*n[2];
- /* Avoid degenerate tangential plane basis vectors as much as
- possible. */
- if (t < FLT_EPSILON)
- {
- u += 0.01;
- v += 0.01;
- cu = cos(u);
- su = sin(u);
- c2u = cos(2.0*u);
- s2u = sin(2.0*u);
- c3u = cos(3.0*u);
- s3u = sin(3.0*u);
- cv = cos(v);
- sv = sin(v);
- c2v = cos(2.0*v);
- s2v = sin(2.0*v);
- nom = (1.0-dl+dl*cv);
- den = (1.0-bosqrt2*s3u*s2v);
- f = nom/den;
- fx = c2u*cv+cu*sv;
- fy = s2u*cv-su*sv;
- fz = M_SQRT2*cv;
- nomv = -dl*sv;
- denu = -b3osqrt2*c3u*s2v;
- denv = -b2osqrt2*s3u*c2v;
- den2 = 1.0/(den*den);
- fu = -nom*denu*den2;
- fv = (den*nomv-nom*denv)*den2;
- fxu = -su*sv-2.0*s2u*cv;
- fxv = cu*cv-c2u*sv;
- fyu = 2.0*c2u*cv-cu*sv;
- fyv = -s2u*sv-su*cv;
- fzv = -M_SQRT2*sv;
- xu = fu*fx+f*fxu;
- xv = fv*fx+f*fxv;
- yu = fu*fy+f*fyu;
- yv = fv*fy+f*fyv;
- zu = fu*fz;
- zv = fv*fz+f*fzv;
- }
- xxu[0] = xu;
- xxu[1] = yu;
- xxu[2] = zu;
- xxv[0] = xv;
- xxv[1] = yv;
- xxv[2] = zv;
- for (l=0; l<3; l++)
- {
- p[l] = xx[l]*radius;
- pu[l] = xxu[l]*radius;
- pv[l] = xxv[l]*radius;
- }
- n[0] = pu[1]*pv[2]-pu[2]*pv[1];
- n[1] = pu[2]*pv[0]-pu[0]*pv[2];
- n[2] = pu[0]*pv[1]-pu[1]*pv[0];
- t = 1.0/(ev->side*4.0*sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]));
- n[0] *= t;
- n[1] *= t;
- n[2] *= t;
- pm[0] = 0.5*pu[0]*ev->dumove+pv[0]*ev->dvmove;
- pm[1] = 0.5*pu[1]*ev->dumove+pv[1]*ev->dvmove;
- pm[2] = 0.5*pu[2]*ev->dumove+pv[2]*ev->dvmove;
- t = 1.0/(4.0*sqrt(pm[0]*pm[0]+pm[1]*pm[1]+pm[2]*pm[2]));
- pm[0] *= t;
- pm[1] *= t;
- pm[2] *= t;
- b[0] = n[1]*pm[2]-n[2]*pm[1];
- b[1] = n[2]*pm[0]-n[0]*pm[2];
- b[2] = n[0]*pm[1]-n[1]*pm[0];
- t = 1.0/(4.0*sqrt(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]));
- b[0] *= t;
- b[1] *= t;
- b[2] *= t;
-
- /* Compute alpha, beta, gamma from the three basis vectors.
- | -b[0] -b[1] -b[2] |
- m = | n[0] n[1] n[2] |
- | -pm[0] -pm[1] -pm[2] |
- */
- ev->alpha = atan2(-n[2],-pm[2])*180/M_PI;
- ev->beta = atan2(-b[2],sqrt(b[0]*b[0]+b[1]*b[1]))*180/M_PI;
- ev->delta = atan2(b[1],-b[0])*180/M_PI;
-
- /* Compute the rotation that rotates the surface in 3D. */
- rotateall(ev->alpha,ev->beta,ev->delta,mat);
-
- u = ev->umove;
- v = ev->vmove;
- u = 0.5*u;
- bosqrt2 = db/M_SQRT2;
- b2osqrt2 = 2.0*bosqrt2;
- b3osqrt2 = 3.0*bosqrt2;
- cu = cos(u);
- su = sin(u);
- c2u = cos(2.0*u);
- s2u = sin(2.0*u);
- s3u = sin(3.0*u);
- cv = cos(v);
- sv = sin(v);
- s2v = sin(2.0*v);
- nom = (1.0-dl+dl*cv);
- den = (1.0-bosqrt2*s3u*s2v);
- f = nom/den;
- fx = c2u*cv+cu*sv;
- fy = s2u*cv-su*sv;
- fz = M_SQRT2*cv;
- x = f*fx;
- y = f*fy;
- z = f*fz;
- xx[0] = x;
- xx[1] = y;
- xx[2] = z-oz;
- for (l=0; l<3; l++)
- {
- r = 0.0;
- for (m=0; m<3; m++)
- r += mat[l][m]*xx[m];
- p[l] = r*radius;
- }
-
- ev->offset3d[0] = -p[0];
- ev->offset3d[1] = -p[1]-DELTAY;
- ev->offset3d[2] = -p[2];
+ /* Compute the walk frame. */
+ compute_walk_frame(ev,db,dl,radius,oz,mat);
}
else
{
@@ -923,11 +1262,11 @@ static int etruscan_venus(ModeInfo *mi, double umin, double umax,
/* Compute the colors dynamically. */
if (ev->colors == COLORS_DISTANCE)
{
- vc = -4.0*v;
- if (vc >= 4.0*M_PI)
- vc -= 4.0*M_PI;
- if (vc >= 2.0*M_PI)
- vc = 4.0*M_PI-vc;
+ vc = -4.0f*v;
+ if (vc >= 4.0f*M_PI)
+ vc -= 4.0f*M_PI;
+ if (vc >= 2.0f*M_PI)
+ vc = 4.0f*M_PI-vc;
color(ev,vc,matc,&ev->col[4*o]);
}
else if (ev->colors == COLORS_DIRECTION)
@@ -935,40 +1274,40 @@ static int etruscan_venus(ModeInfo *mi, double umin, double umax,
color(ev,u,matc,&ev->col[4*o]);
}
}
- u = 0.5*u;
- bosqrt2 = db/M_SQRT2;
- b2osqrt2 = 2.0*bosqrt2;
- b3osqrt2 = 3.0*bosqrt2;
- cu = cos(u);
- su = sin(u);
- c2u = cos(2.0*u);
- s2u = sin(2.0*u);
- c3u = cos(3.0*u);
- s3u = sin(3.0*u);
- cv = cos(v);
- sv = sin(v);
- c2v = cos(2.0*v);
- s2v = sin(2.0*v);
- nom = (1.0-dl+dl*cv);
- den = (1.0-bosqrt2*s3u*s2v);
+ u = 0.5f*u;
+ bosqrt2 = db/(float)M_SQRT2;
+ b2osqrt2 = 2.0f*bosqrt2;
+ b3osqrt2 = 3.0f*bosqrt2;
+ cu = cosf(u);
+ su = sinf(u);
+ c2u = cosf(2.0f*u);
+ s2u = sinf(2.0f*u);
+ c3u = cosf(3.0f*u);
+ s3u = sinf(3.0f*u);
+ cv = cosf(v);
+ sv = sinf(v);
+ c2v = cosf(2.0f*v);
+ s2v = sinf(2.0f*v);
+ nom = (1.0f-dl+dl*cv);
+ den = (1.0f-bosqrt2*s3u*s2v);
f = nom/den;
fx = c2u*cv+cu*sv;
fy = s2u*cv-su*sv;
- fz = M_SQRT2*cv;
+ fz = (float)M_SQRT2*cv;
x = f*fx;
y = f*fy;
z = f*fz;
nomv = -dl*sv;
denu = -b3osqrt2*c3u*s2v;
denv = -b2osqrt2*s3u*c2v;
- den2 = 1.0/(den*den);
+ den2 = 1.0f/(den*den);
fu = -nom*denu*den2;
fv = (den*nomv-nom*denv)*den2;
- fxu = -su*sv-2.0*s2u*cv;
+ fxu = -su*sv-2.0f*s2u*cv;
fxv = cu*cv-c2u*sv;
- fyu = 2.0*c2u*cv-cu*sv;
+ fyu = 2.0f*c2u*cv-cu*sv;
fyv = -s2u*sv-su*cv;
- fzv = -M_SQRT2*sv;
+ fzv = -(float)M_SQRT2*sv;
xu = fu*fx+f*fxu;
xv = fv*fx+f*fxv;
yu = fu*fy+f*fyu;
@@ -984,37 +1323,37 @@ static int etruscan_venus(ModeInfo *mi, double umin, double umax,
t = n[0]*n[0]+n[1]*n[1]+n[2]*n[2];
/* Avoid degenerate tangential plane basis vectors as much as
possible. */
- if (t < FLT_EPSILON)
+ if (t < 10.0f*FLT_EPSILON)
{
- u += 0.01;
- v += 0.01;
- cu = cos(u);
- su = sin(u);
- c2u = cos(2.0*u);
- s2u = sin(2.0*u);
- c3u = cos(3.0*u);
- s3u = sin(3.0*u);
- cv = cos(v);
- sv = sin(v);
- c2v = cos(2.0*v);
- s2v = sin(2.0*v);
- nom = (1.0-dl+dl*cv);
- den = (1.0-bosqrt2*s3u*s2v);
+ u += 0.01f;
+ v += 0.01f;
+ cu = cosf(u);
+ su = sinf(u);
+ c2u = cosf(2.0f*u);
+ s2u = sinf(2.0f*u);
+ c3u = cosf(3.0f*u);
+ s3u = sinf(3.0f*u);
+ cv = cosf(v);
+ sv = sinf(v);
+ c2v = cosf(2.0f*v);
+ s2v = sinf(2.0f*v);
+ nom = (1.0f-dl+dl*cv);
+ den = (1.0f-bosqrt2*s3u*s2v);
f = nom/den;
fx = c2u*cv+cu*sv;
fy = s2u*cv-su*sv;
- fz = M_SQRT2*cv;
+ fz = (float)M_SQRT2*cv;
nomv = -dl*sv;
denu = -b3osqrt2*c3u*s2v;
denv = -b2osqrt2*s3u*c2v;
- den2 = 1.0/(den*den);
+ den2 = 1.0f/(den*den);
fu = -nom*denu*den2;
fv = (den*nomv-nom*denv)*den2;
- fxu = -su*sv-2.0*s2u*cv;
+ fxu = -su*sv-2.0f*s2u*cv;
fxv = cu*cv-c2u*sv;
- fyu = 2.0*c2u*cv-cu*sv;
+ fyu = 2.0f*c2u*cv-cu*sv;
fyv = -s2u*sv-su*cv;
- fzv = -M_SQRT2*sv;
+ fzv = -(float)M_SQRT2*sv;
xu = fu*fx+f*fxu;
xv = fv*fx+f*fxv;
yu = fu*fy+f*fyu;
@@ -1030,9 +1369,9 @@ static int etruscan_venus(ModeInfo *mi, double umin, double umax,
xxv[2] = zv;
for (l=0; l<3; l++)
{
- r = 0.0;
- s = 0.0;
- t = 0.0;
+ r = 0.0f;
+ s = 0.0f;
+ t = 0.0f;
for (m=0; m<3; m++)
{
r += mat[l][m]*xx[m];
@@ -1046,7 +1385,7 @@ static int etruscan_venus(ModeInfo *mi, double umin, double umax,
n[0] = pu[1]*pv[2]-pu[2]*pv[1];
n[1] = pu[2]*pv[0]-pu[0]*pv[2];
n[2] = pu[0]*pv[1]-pu[1]*pv[0];
- t = 1.0/sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
+ t = 1.0f/sqrtf(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
n[0] *= t;
n[1] *= t;
n[2] *= t;
@@ -1076,11 +1415,11 @@ static int etruscan_venus(ModeInfo *mi, double umin, double umax,
/* Compute the colors dynamically. */
if (ev->colors == COLORS_DISTANCE)
{
- vc = 4.0*v;
- if (vc >= 4.0*M_PI)
- vc -= 4.0*M_PI;
- if (vc >= 2.0*M_PI)
- vc = 4.0*M_PI-vc;
+ vc = 4.0f*v;
+ if (vc >= 4.0f*M_PI)
+ vc -= 4.0f*M_PI;
+ if (vc >= 2.0f*M_PI)
+ vc = 4.0f*M_PI-vc;
color(ev,vc,matc,&ev->col[4*o]);
}
else if (ev->colors == COLORS_DIRECTION)
@@ -1088,40 +1427,40 @@ static int etruscan_venus(ModeInfo *mi, double umin, double umax,
color(ev,u,matc,&ev->col[4*o]);
}
}
- u = 0.5*u;
- bosqrt2 = db/M_SQRT2;
- b2osqrt2 = 2.0*bosqrt2;
- b3osqrt2 = 3.0*bosqrt2;
- cu = cos(u);
- su = sin(u);
- c2u = cos(2.0*u);
- s2u = sin(2.0*u);
- c3u = cos(3.0*u);
- s3u = sin(3.0*u);
- cv = cos(v);
- sv = sin(v);
- c2v = cos(2.0*v);
- s2v = sin(2.0*v);
- nom = (1.0-dl+dl*cv);
- den = (1.0-bosqrt2*s3u*s2v);
+ u = 0.5f*u;
+ bosqrt2 = db/(float)M_SQRT2;
+ b2osqrt2 = 2.0f*bosqrt2;
+ b3osqrt2 = 3.0f*bosqrt2;
+ cu = cosf(u);
+ su = sinf(u);
+ c2u = cosf(2.0f*u);
+ s2u = sinf(2.0f*u);
+ c3u = cosf(3.0f*u);
+ s3u = sinf(3.0f*u);
+ cv = cosf(v);
+ sv = sinf(v);
+ c2v = cosf(2.0f*v);
+ s2v = sinf(2.0f*v);
+ nom = (1.0f-dl+dl*cv);
+ den = (1.0f-bosqrt2*s3u*s2v);
f = nom/den;
fx = c2u*cv+cu*sv;
fy = s2u*cv-su*sv;
- fz = M_SQRT2*cv;
+ fz = (float)M_SQRT2*cv;
x = f*fx;
y = f*fy;
z = f*fz;
nomv = -dl*sv;
denu = -b3osqrt2*c3u*s2v;
denv = -b2osqrt2*s3u*c2v;
- den2 = 1.0/(den*den);
+ den2 = 1.0f/(den*den);
fu = -nom*denu*den2;
fv = (den*nomv-nom*denv)*den2;
- fxu = -su*sv-2.0*s2u*cv;
+ fxu = -su*sv-2.0f*s2u*cv;
fxv = cu*cv-c2u*sv;
- fyu = 2.0*c2u*cv-cu*sv;
+ fyu = 2.0f*c2u*cv-cu*sv;
fyv = -s2u*sv-su*cv;
- fzv = -M_SQRT2*sv;
+ fzv = -(float)M_SQRT2*sv;
xu = fu*fx+f*fxu;
xv = fv*fx+f*fxv;
yu = fu*fy+f*fyu;
@@ -1137,37 +1476,37 @@ static int etruscan_venus(ModeInfo *mi, double umin, double umax,
t = n[0]*n[0]+n[1]*n[1]+n[2]*n[2];
/* Avoid degenerate tangential plane basis vectors as much as
possible. */
- if (t < FLT_EPSILON)
+ if (t < 10.0f*FLT_EPSILON)
{
- u += 0.01;
- v += 0.01;
- cu = cos(u);
- su = sin(u);
- c2u = cos(2.0*u);
- s2u = sin(2.0*u);
- c3u = cos(3.0*u);
- s3u = sin(3.0*u);
- cv = cos(v);
- sv = sin(v);
- c2v = cos(2.0*v);
- s2v = sin(2.0*v);
- nom = (1.0-dl+dl*cv);
- den = (1.0-bosqrt2*s3u*s2v);
+ u += 0.01f;
+ v += 0.01f;
+ cu = cosf(u);
+ su = sinf(u);
+ c2u = cosf(2.0f*u);
+ s2u = sinf(2.0f*u);
+ c3u = cosf(3.0f*u);
+ s3u = sinf(3.0f*u);
+ cv = cosf(v);
+ sv = sinf(v);
+ c2v = cosf(2.0f*v);
+ s2v = sinf(2.0f*v);
+ nom = (1.0f-dl+dl*cv);
+ den = (1.0f-bosqrt2*s3u*s2v);
f = nom/den;
fx = c2u*cv+cu*sv;
fy = s2u*cv-su*sv;
- fz = M_SQRT2*cv;
+ fz = (float)M_SQRT2*cv;
nomv = -dl*sv;
denu = -b3osqrt2*c3u*s2v;
denv = -b2osqrt2*s3u*c2v;
- den2 = 1.0/(den*den);
+ den2 = 1.0f/(den*den);
fu = -nom*denu*den2;
fv = (den*nomv-nom*denv)*den2;
- fxu = -su*sv-2.0*s2u*cv;
+ fxu = -su*sv-2.0f*s2u*cv;
fxv = cu*cv-c2u*sv;
- fyu = 2.0*c2u*cv-cu*sv;
+ fyu = 2.0f*c2u*cv-cu*sv;
fyv = -s2u*sv-su*cv;
- fzv = -M_SQRT2*sv;
+ fzv = -(float)M_SQRT2*sv;
xu = fu*fx+f*fxu;
xv = fv*fx+f*fxv;
yu = fu*fy+f*fyu;
@@ -1183,9 +1522,9 @@ static int etruscan_venus(ModeInfo *mi, double umin, double umax,
xxv[2] = zv;
for (l=0; l<3; l++)
{
- r = 0.0;
- s = 0.0;
- t = 0.0;
+ r = 0.0f;
+ s = 0.0f;
+ t = 0.0f;
for (m=0; m<3; m++)
{
r += mat[l][m]*xx[m];
@@ -1199,7 +1538,7 @@ static int etruscan_venus(ModeInfo *mi, double umin, double umax,
n[0] = pu[1]*pv[2]-pu[2]*pv[1];
n[1] = pu[2]*pv[0]-pu[0]*pv[2];
n[2] = pu[0]*pv[1]-pu[1]*pv[0];
- t = 1.0/sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
+ t = 1.0f/sqrtf(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
n[0] *= t;
n[1] *= t;
n[2] *= t;
@@ -1228,7 +1567,7 @@ static int etruscan_venus(ModeInfo *mi, double umin, double umax,
{
for (k=0; k<=1; k++)
{
- l = (i+k);
+ l = i+k;
m = j;
o = l*(numu+1)+m;
glTexCoord2fv(&ev->tex[2*o]);
@@ -1240,11 +1579,11 @@ static int etruscan_venus(ModeInfo *mi, double umin, double umax,
}
glNormal3fv(&ev->evn[3*o]);
glVertex3fv(&ev->ev[3*o]);
- polys++;
}
}
glEnd();
}
+ polys = numv*(numu+1);
}
else /* ev->appearance != APPEARANCE_DISTANCE_BANDS */
{
@@ -1262,7 +1601,7 @@ static int etruscan_venus(ModeInfo *mi, double umin, double umax,
for (k=0; k<=1; k++)
{
l = i;
- m = (j+k);
+ m = j+k;
o = l*(numu+1)+m;
glTexCoord2fv(&ev->tex[2*o]);
if (ev->colors != COLORS_ONESIDED && ev->colors != COLORS_TWOSIDED)
@@ -1273,26 +1612,561 @@ static int etruscan_venus(ModeInfo *mi, double umin, double umax,
}
glNormal3fv(&ev->evn[3*o]);
glVertex3fv(&ev->ev[3*o]);
- polys++;
}
}
glEnd();
}
+ polys = 2*numu*(numv+1);
+ if (ev->appearance == APPEARANCE_DIRECTION_BANDS)
+ polys /= 2;
+ }
+
+ return polys;
+}
+
+
+#ifdef HAVE_GLSL
+
+/* Draw a 3d immersion of the surface using OpenGL's programmable
+ functionality. */
+static int etruscan_venus_pf(ModeInfo *mi, double umin, double umax,
+ double vmin, double vmax, int numu, int numv)
+{
+ static const GLfloat light_model_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
+ static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+ static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
+ static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_oneside[] = { 0.9, 0.4, 0.3, 1.0 };
+ static const GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.7 };
+ static const GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 };
+ static const GLfloat mat_diff_trans_oneside[] = { 0.9, 0.4, 0.3, 0.7 };
+ static const GLfloat mat_diff_white[] = { 1.0, 1.0, 1.0, 1.0 };
+ GLfloat light_direction[3], half_vector[3], len;
+ GLfloat p_mat[16], mv_mat[16], rot_mat[16];
+ float mat_diff_dyn[4], mat_diff_dyn_compl[4];
+ float mat[3][3], matc[3][3];
+ int i, j, k, l, m, o;
+ float u, v, ur, vr, oz, vc;
+ float r;
+ float dd, bb, ll, db, dl, radius;
+ float qu[4], r1[3][3], r2[3][3];
+ GLsizeiptr index_offset;
+ etruscanvenusstruct *ev = &etruscanvenus[MI_SCREEN(mi)];
+ int polys;
+
+ if (!ev->use_shaders)
+ return 0;
+
+ dd = ev->dd;
+ if (dd < 1.0f)
+ {
+ bb = 0.0f;
+ ll = dd;
+ }
+ else if (dd < 2.0f)
+ {
+ bb = dd-1.0f;
+ ll = 1.0;
+ }
+ else if (dd < 3.0f)
+ {
+ bb = 1.0f;
+ ll = 3.0f-dd;
+ }
+ else /* dd < 4.0f */
+ {
+ bb = 4.0f-dd;
+ ll = 0.0f;
+ }
+ db = ((6.0f*bb-15.0f)*bb+10.0f)*bb*bb*bb;
+ dl = ((6.0f*ll-15.0f)*ll+10.0f)*ll*ll*ll;
+ /* Calculate the approximate center of the surface in the z direction. */
+ oz = (Z1*(sinf(0.5f*M_PI*powf(dl,Z3))+Z2*sinf(1.5f*M_PI*powf(dl,Z3)))*
+ expf(Z4*powf(db,Z5)));
+ /* Calculate the approximate radius of the surface. */
+ r = R1+(db-0.5f)*(dl-0.5f)+R2*expf(R3*(1.0f-db))*expf(R4*dl);
+ radius = 0.8f/r;
+
+ if (!ev->buffers_initialized)
+ {
+ /* The u and v values need to be computed once (or each time the value
+ of appearance changes, once we support that). */
+ ur = umax-umin;
+ vr = vmax-vmin;
+ for (j=0; j<=numu; j++)
+ {
+ for (i=0; i<=numv; i++)
+ {
+ o = i*(numu+1)+j;
+ u = 0.5f*ur*j/numu+umin;
+ if (ev->appearance == APPEARANCE_DISTANCE_BANDS)
+ v = -vr*i/numv+vmin;
+ else
+ v = vr*i/numv+vmin;
+ ev->uv[2*o+0] = u;
+ ev->uv[2*o+1] = v;
+ }
+ }
+ glBindBuffer(GL_ARRAY_BUFFER,ev->vertex_uv_buffer);
+ glBufferData(GL_ARRAY_BUFFER,2*(numu+1)*(numv+1)*sizeof(GLfloat),
+ ev->uv,GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+
+ glBindBuffer(GL_ARRAY_BUFFER,ev->vertex_t_buffer);
+ glBufferData(GL_ARRAY_BUFFER,2*(numu+1)*(numv+1)*sizeof(GLfloat),
+ ev->tex,GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+
+ if (!ev->change_colors &&
+ ev->colors != COLORS_ONESIDED && ev->colors != COLORS_TWOSIDED)
+ {
+ glBindBuffer(GL_ARRAY_BUFFER,ev->color_buffer);
+ glBufferData(GL_ARRAY_BUFFER,4*(numu+1)*(numv+1)*sizeof(GLfloat),
+ ev->col,GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+ }
+
+ /* The indices only need to be computed once (or each time the value of
+ appearance changes, once we support that). */
+ ev->ni = 0;
+ ev->ne = 0;
+ ev->nt = 0;
+ if (ev->display_mode != DISP_WIREFRAME)
+ {
+ if (ev->appearance == APPEARANCE_DISTANCE_BANDS)
+ {
+ for (i=0; i<numv; i++)
+ {
+ if ((i & (NUMBDIST-1)) >= NUMBDIST/4 &&
+ (i & (NUMBDIST-1)) < 3*NUMBDIST/4)
+ continue;
+ for (j=0; j<=numu; j++)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = i+k;
+ m = j;
+ o = l*(numu+1)+m;
+ ev->indices[ev->ni++] = o;
+ }
+ }
+ ev->ne++;
+ }
+ ev->nt = 2*(numu+1);
+ }
+ else /* ev->appearance != APPEARANCE_DISTANCE_BANDS */
+ {
+ for (j=0; j<numu; j++)
+ {
+ if (ev->appearance == APPEARANCE_DIRECTION_BANDS &&
+ ((j & (NUMBDIR-1)) >= NUMBDIR/2))
+ continue;
+ for (i=0; i<=numv; i++)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = i;
+ m = j+k;
+ o = l*(numu+1)+m;
+ ev->indices[ev->ni++] = o;
+ }
+ }
+ ev->ne++;
+ }
+ ev->nt = 2*(numv+1);
+ }
+ }
+ else /* ev->display_mode == DISP_WIREFRAME */
+ {
+ if (ev->appearance == APPEARANCE_DISTANCE_BANDS)
+ {
+ for (i=0; i<=numv; i++)
+ {
+ if ((i & (NUMBDIST-1)) > NUMBDIST/4 &&
+ (i & (NUMBDIST-1)) < 3*NUMBDIST/4)
+ continue;
+ if ((i & (NUMBDIST-1)) == NUMBDIST/4)
+ {
+ for (j=0; j<numu; j++)
+ {
+ ev->indices[ev->ni++] = i*(numu+1)+j;
+ ev->indices[ev->ni++] = i*(numu+1)+j+1;
+ }
+ continue;
+ }
+ for (j=0; j<numu; j++)
+ {
+ ev->indices[ev->ni++] = i*(numu+1)+j;
+ ev->indices[ev->ni++] = i*(numu+1)+j+1;
+ if (i < numv)
+ {
+ ev->indices[ev->ni++] = i*(numu+1)+j;
+ ev->indices[ev->ni++] = (i+1)*(numu+1)+j;
+ }
+ }
+ }
+ }
+ else /* ev->appearance != APPEARANCE_DISTANCE_BANDS */
+ {
+ for (j=0; j<numu; j++)
+ {
+ if (ev->appearance == APPEARANCE_DIRECTION_BANDS &&
+ ((j & (NUMBDIR-1)) > NUMBDIR/2))
+ continue;
+ if (ev->appearance == APPEARANCE_DIRECTION_BANDS &&
+ ((j & (NUMBDIR-1)) == NUMBDIR/2))
+ {
+ for (i=0; i<numv; i++)
+ {
+ ev->indices[ev->ni++] = i*(numu+1)+j;
+ ev->indices[ev->ni++] = (i+1)*(numu+1)+j;
+ }
+ continue;
+ }
+ for (i=0; i<=numv; i++)
+ {
+ ev->indices[ev->ni++] = i*(numu+1)+j;
+ ev->indices[ev->ni++] = i*(numu+1)+j+1;
+ if (i < numv)
+ {
+ ev->indices[ev->ni++] = i*(numu+1)+j;
+ ev->indices[ev->ni++] = (i+1)*(numu+1)+j;
+ }
+ }
+ }
+ }
+ ev->ne = 1;
+ }
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ev->indices_buffer);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER,ev->ni*sizeof(GLuint),
+ ev->indices,GL_STATIC_DRAW);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
+
+ ev->buffers_initialized = True;
+ }
+
+ if (ev->change_colors)
+ rotateall(ev->rho,ev->sigma,ev->tau,matc);
+
+ if (ev->view == VIEW_WALK)
+ {
+ /* Compute the walk frame. */
+ compute_walk_frame(ev,db,dl,radius,oz,mat);
+ }
+ else
+ {
+ /* Compute the rotation that rotates the surface in 3D, including the
+ trackball rotations. */
+ rotateall(ev->alpha,ev->beta,ev->delta,r1);
+
+ gltrackball_get_quaternion(ev->trackball,qu);
+ quat_to_rotmat(qu,r2);
+
+ mult_rotmat(r2,r1,mat);
+ }
+
+ if (ev->change_colors &&
+ (ev->colors == COLORS_DISTANCE || ev->colors == COLORS_DIRECTION))
+ {
+ ur = umax-umin;
+ vr = vmax-vmin;
+ for (j=0; j<=numu; j++)
+ {
+ for (i=0; i<=numv; i++)
+ {
+ o = i*(numu+1)+j;
+ u = ur*j/numu+umin;
+ if (ev->appearance == APPEARANCE_DISTANCE_BANDS)
+ v = -vr*i/numv+vmin;
+ else
+ v = vr*i/numv+vmin;
+ if (ev->colors == COLORS_DISTANCE)
+ {
+ if (ev->appearance == APPEARANCE_DISTANCE_BANDS)
+ vc = -4.0f*v;
+ else
+ vc = 4.0f*v;
+ if (vc >= 4.0f*M_PI)
+ vc -= 4.0f*M_PI;
+ if (vc >= 2.0f*M_PI)
+ vc = 4.0f*M_PI-vc;
+ color(ev,vc,matc,&ev->col[4*o]);
+ }
+ else if (ev->colors == COLORS_DIRECTION)
+ {
+ color(ev,u,matc,&ev->col[4*o]);
+ }
+ }
+ }
+ }
+
+ glUseProgram(ev->shader_program);
+
+ glUniform1f(ev->db_index,db);
+ glUniform1f(ev->dl_index,dl);
+
+ glsl_Identity(p_mat);
+ if (ev->projection == DISP_PERSPECTIVE || ev->view == VIEW_WALK)
+ {
+ if (ev->view == VIEW_WALK)
+ glsl_Perspective(p_mat,60.0f,ev->aspect,0.01f,10.0f);
+ else
+ glsl_Perspective(p_mat,60.0f,ev->aspect,0.1f,10.0f);
+ }
+ else
+ {
+ if (ev->aspect >= 1.0)
+ glsl_Orthographic(p_mat,-ev->aspect,ev->aspect,-1.0f,1.0f,
+ 0.1f,10.0f);
+ else
+ glsl_Orthographic(p_mat,-1.0f,1.0f,-1.0f/ev->aspect,1.0f/ev->aspect,
+ 0.1f,10.0f);
+ }
+ glUniformMatrix4fv(ev->mat_p_index,1,GL_FALSE,p_mat);
+ glsl_Identity(rot_mat);
+ for (i=0; i<3; i++)
+ for (j=0; j<3; j++)
+ rot_mat[GLSL__LINCOOR(i,j,4)] = mat[i][j];
+ glsl_Identity(mv_mat);
+ glsl_Translate(mv_mat,ev->offset3d[0],ev->offset3d[1],ev->offset3d[2]);
+ glsl_Scale(mv_mat,radius,radius,radius);
+ glsl_MultMatrix(mv_mat,rot_mat);
+ glsl_Translate(mv_mat,0.0f,0.0f,-oz);
+ glUniformMatrix4fv(ev->mat_mv_index,1,GL_FALSE,mv_mat);
+
+ len = sqrtf(light_position[0]*light_position[0]+
+ light_position[1]*light_position[1]+
+ light_position[2]*light_position[2]);
+ light_direction[0] = light_position[0]/len;
+ light_direction[1] = light_position[1]/len;
+ light_direction[2] = light_position[2]/len;
+ half_vector[0] = light_direction[0];
+ half_vector[1] = light_direction[1];
+ half_vector[2] = light_direction[2]+1.0f;
+ len = sqrtf(half_vector[0]*half_vector[0]+
+ half_vector[1]*half_vector[1]+
+ half_vector[2]*half_vector[2]);
+ half_vector[0] /= len;
+ half_vector[1] /= len;
+ half_vector[2] /= len;
+
+ glUniform4fv(ev->front_ambient_index,1,mat_diff_white);
+ glUniform4fv(ev->front_diffuse_index,1,mat_diff_white);
+ glUniform4fv(ev->back_ambient_index,1,mat_diff_white);
+ glUniform4fv(ev->back_diffuse_index,1,mat_diff_white);
+ glVertexAttrib4f(ev->color_index,1.0f,1.0f,1.0f,1.0f);
+
+ if (ev->display_mode == DISP_SURFACE)
+ {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glDepthMask(GL_TRUE);
+ glDisable(GL_BLEND);
+ glUniform4fv(ev->glbl_ambient_index,1,light_model_ambient);
+ glUniform4fv(ev->lt_ambient_index,1,light_ambient);
+ glUniform4fv(ev->lt_diffuse_index,1,light_diffuse);
+ glUniform4fv(ev->lt_specular_index,1,light_specular);
+ glUniform3fv(ev->lt_direction_index,1,light_direction);
+ glUniform3fv(ev->lt_halfvect_index,1,half_vector);
+ glUniform4fv(ev->specular_index,1,mat_specular);
+ glUniform1f(ev->shininess_index,50.0f);
+ glUniform1i(ev->draw_lines_index,GL_FALSE);
+ }
+ else if (ev->display_mode == DISP_TRANSPARENT)
+ {
+ glDisable(GL_DEPTH_TEST);
+ glDepthMask(GL_FALSE);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ glUniform4fv(ev->glbl_ambient_index,1,light_model_ambient);
+ glUniform4fv(ev->lt_ambient_index,1,light_ambient);
+ glUniform4fv(ev->lt_diffuse_index,1,light_diffuse);
+ glUniform4fv(ev->lt_specular_index,1,light_specular);
+ glUniform3fv(ev->lt_direction_index,1,light_direction);
+ glUniform3fv(ev->lt_halfvect_index,1,half_vector);
+ glUniform4fv(ev->specular_index,1,mat_specular);
+ glUniform1f(ev->shininess_index,50.0f);
+ glUniform1i(ev->draw_lines_index,GL_FALSE);
+ }
+ else /* ev->display_mode == DISP_WIREFRAME */
+ {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glDepthMask(GL_TRUE);
+ glDisable(GL_BLEND);
+ glUniform1i(ev->draw_lines_index,GL_TRUE);
+ }
+
+ if (ev->marks)
+ glEnable(GL_TEXTURE_2D);
+ else
+ glDisable(GL_TEXTURE_2D);
+
+ if (!ev->change_colors)
+ {
+ if (ev->colors == COLORS_ONESIDED)
+ {
+ if (ev->display_mode == DISP_TRANSPARENT)
+ {
+ glUniform4fv(ev->front_ambient_index,1,mat_diff_trans_oneside);
+ glUniform4fv(ev->front_diffuse_index,1,mat_diff_trans_oneside);
+ glUniform4fv(ev->back_ambient_index,1,mat_diff_trans_oneside);
+ glUniform4fv(ev->back_diffuse_index,1,mat_diff_trans_oneside);
+ }
+ else if (ev->display_mode == DISP_SURFACE)
+ {
+ glUniform4fv(ev->front_ambient_index,1,mat_diff_oneside);
+ glUniform4fv(ev->front_diffuse_index,1,mat_diff_oneside);
+ glUniform4fv(ev->back_ambient_index,1,mat_diff_oneside);
+ glUniform4fv(ev->back_diffuse_index,1,mat_diff_oneside);
+ }
+ else /* ev->display_mode == DISP_WIREFRAME */
+ {
+ glVertexAttrib4fv(ev->color_index,mat_diff_oneside);
+ }
+ }
+ else if (ev->colors == COLORS_TWOSIDED)
+ {
+ if (ev->display_mode == DISP_TRANSPARENT)
+ {
+ glUniform4fv(ev->front_ambient_index,1,mat_diff_trans_red);
+ glUniform4fv(ev->front_diffuse_index,1,mat_diff_trans_red);
+ glUniform4fv(ev->back_ambient_index,1,mat_diff_trans_green);
+ glUniform4fv(ev->back_diffuse_index,1,mat_diff_trans_green);
+ }
+ else if (ev->display_mode == DISP_SURFACE)
+ {
+ glUniform4fv(ev->front_ambient_index,1,mat_diff_red);
+ glUniform4fv(ev->front_diffuse_index,1,mat_diff_red);
+ glUniform4fv(ev->back_ambient_index,1,mat_diff_green);
+ glUniform4fv(ev->back_diffuse_index,1,mat_diff_green);
+ }
+ else /* ev->display_mode == DISP_WIREFRAME */
+ {
+ glVertexAttrib4fv(ev->color_index,mat_diff_red);
+ }
+ }
+ }
+ else /* ev->change_colors */
+ {
+ color(ev,0.0,matc,mat_diff_dyn);
+ if (ev->colors == COLORS_ONESIDED)
+ {
+ if (ev->display_mode == DISP_TRANSPARENT ||
+ ev->display_mode == DISP_SURFACE)
+ {
+ glUniform4fv(ev->front_ambient_index,1,mat_diff_dyn);
+ glUniform4fv(ev->front_diffuse_index,1,mat_diff_dyn);
+ glUniform4fv(ev->back_ambient_index,1,mat_diff_dyn);
+ glUniform4fv(ev->back_diffuse_index,1,mat_diff_dyn);
+ }
+ else /* ev->display_mode == DISP_WIREFRAME */
+ {
+ glVertexAttrib4fv(ev->color_index,mat_diff_dyn);
+ }
+ }
+ else if (ev->colors == COLORS_TWOSIDED)
+ {
+ if (ev->display_mode == DISP_TRANSPARENT ||
+ ev->display_mode == DISP_SURFACE)
+ {
+ mat_diff_dyn_compl[0] = 1.0f-mat_diff_dyn[0];
+ mat_diff_dyn_compl[1] = 1.0f-mat_diff_dyn[1];
+ mat_diff_dyn_compl[2] = 1.0f-mat_diff_dyn[2];
+ mat_diff_dyn_compl[3] = mat_diff_dyn[3];
+ glUniform4fv(ev->front_ambient_index,1,mat_diff_dyn);
+ glUniform4fv(ev->front_diffuse_index,1,mat_diff_dyn);
+ glUniform4fv(ev->back_ambient_index,1,mat_diff_dyn_compl);
+ glUniform4fv(ev->back_diffuse_index,1,mat_diff_dyn_compl);
+ }
+ else /* ev->display_mode == DISP_WIREFRAME */
+ {
+ glVertexAttrib4fv(ev->color_index,mat_diff_dyn);
+ }
+ }
+ }
+
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D,ev->tex_name);
+ glUniform1i(ev->texture_sampler_index,0);
+ glUniform1i(ev->bool_textures_index,marks);
+
+ glEnableVertexAttribArray(ev->vertex_uv_index);
+ glBindBuffer(GL_ARRAY_BUFFER,ev->vertex_uv_buffer);
+ glVertexAttribPointer(ev->vertex_uv_index,2,GL_FLOAT,GL_FALSE,0,0);
+
+ glEnableVertexAttribArray(ev->vertex_t_index);
+ glBindBuffer(GL_ARRAY_BUFFER,ev->vertex_t_buffer);
+ glVertexAttribPointer(ev->vertex_t_index,2,GL_FLOAT,GL_FALSE,0,0);
+
+ if (ev->colors != COLORS_ONESIDED && ev->colors != COLORS_TWOSIDED)
+ {
+ glEnableVertexAttribArray(ev->color_index);
+ glBindBuffer(GL_ARRAY_BUFFER,ev->color_buffer);
+ if (ev->change_colors)
+ glBufferData(GL_ARRAY_BUFFER,4*(numu+1)*(numv+1)*sizeof(GLfloat),
+ ev->col,GL_STREAM_DRAW);
+ glVertexAttribPointer(ev->color_index,4,GL_FLOAT,GL_FALSE,0,0);
+ }
+
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ev->indices_buffer);
+
+ if (ev->display_mode != DISP_WIREFRAME)
+ {
+ for (i=0; i<ev->ne; i++)
+ {
+ index_offset = ev->nt*i*sizeof(GLuint);
+ glDrawElements(GL_TRIANGLE_STRIP,ev->nt,GL_UNSIGNED_INT,
+ (const GLvoid *)index_offset);
+ }
+ }
+ else /* ev->display_mode == DISP_WIREFRAME */
+ {
+ glLineWidth(1.0f);
+ index_offset = 0;
+ glDrawElements(GL_LINES,ev->ni,GL_UNSIGNED_INT,
+ (const void *)index_offset);
+ }
+
+ glDisableVertexAttribArray(ev->vertex_uv_index);
+ if (ev->marks)
+ glDisableVertexAttribArray(ev->vertex_t_index);
+ if (ev->colors != COLORS_ONESIDED && ev->colors != COLORS_TWOSIDED)
+ glDisableVertexAttribArray(ev->color_index);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
+
+ glUseProgram(0);
+
+ if (ev->appearance == APPEARANCE_DISTANCE_BANDS)
+ {
+ polys = numv*(numu+1);
+ }
+ else /* ev->appearance != APPEARANCE_DISTANCE_BANDS */
+ {
+ polys = 2*numu*(numv+1);
+ if (ev->appearance == APPEARANCE_DIRECTION_BANDS)
+ polys /= 2;
}
- polys /= 2;
return polys;
}
+#endif /* HAVE_GLSL */
+
/* Generate a texture image that shows the orientation reversal. */
static void gen_texture(ModeInfo *mi)
{
etruscanvenusstruct *ev = &etruscanvenus[MI_SCREEN(mi)];
+ glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glGenTextures(1,&ev->tex_name);
glBindTexture(GL_TEXTURE_2D,ev->tex_name);
- glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
@@ -1303,13 +2177,151 @@ static void gen_texture(ModeInfo *mi)
}
+#ifdef HAVE_GLSL
+
+static void init_glsl(ModeInfo *mi)
+{
+ etruscanvenusstruct *ev = &etruscanvenus[MI_SCREEN(mi)];
+ GLint gl_major, gl_minor, glsl_major, glsl_minor;
+ GLboolean gl_gles3;
+ const GLchar *vertex_shader_source[3];
+ const GLchar *fragment_shader_source[4];
+
+ ev->uv = calloc(2*(NUMU+1)*(NUMV+1),sizeof(float));
+ ev->indices = calloc(4*(NUMU+1)*(NUMV+1),sizeof(float));
+
+ /* Determine whether to use shaders to render the Klein bottle. */
+ ev->use_shaders = False;
+ ev->buffers_initialized = False;
+ ev->shader_program = 0;
+ ev->ni = 0;
+ ev->ne = 0;
+ ev->nt = 0;
+
+ if (!glsl_GetGlAndGlslVersions(&gl_major,&gl_minor,&glsl_major,&glsl_minor,
+ &gl_gles3))
+ return;
+ if (!gl_gles3)
+ {
+ if (gl_major < 3 ||
+ (glsl_major < 1 || (glsl_major == 1 && glsl_minor < 30)))
+ {
+ if ((gl_major < 2 || (gl_major == 2 && gl_minor < 1)) ||
+ (glsl_major < 1 || (glsl_major == 1 && glsl_minor < 20)))
+ return;
+ /* We have at least OpenGL 2.1 and at least GLSL 1.20. */
+ vertex_shader_source[0] = shader_version_2_1;
+ vertex_shader_source[1] = vertex_shader_attribs_2_1;
+ vertex_shader_source[2] = vertex_shader_main;
+ fragment_shader_source[0] = shader_version_2_1;
+ fragment_shader_source[1] = fragment_shader_attribs_2_1;
+ fragment_shader_source[2] = fragment_shader_main;
+ fragment_shader_source[3] = fragment_shader_out_2_1;
+ }
+ else
+ {
+ /* We have at least OpenGL 3.0 and at least GLSL 1.30. */
+ vertex_shader_source[0] = shader_version_3_0;
+ vertex_shader_source[1] = vertex_shader_attribs_3_0;
+ vertex_shader_source[2] = vertex_shader_main;
+ fragment_shader_source[0] = shader_version_3_0;
+ fragment_shader_source[1] = fragment_shader_attribs_3_0;
+ fragment_shader_source[2] = fragment_shader_main;
+ fragment_shader_source[3] = fragment_shader_out_3_0;
+ }
+ }
+ else /* gl_gles3 */
+ {
+ if (gl_major < 3 || glsl_major < 3)
+ return;
+ /* We have at least OpenGL ES 3.0 and at least GLSL ES 3.0. */
+ vertex_shader_source[0] = shader_version_3_0_es;
+ vertex_shader_source[1] = vertex_shader_attribs_3_0;
+ vertex_shader_source[2] = vertex_shader_main;
+ fragment_shader_source[0] = shader_version_3_0_es;
+ fragment_shader_source[1] = fragment_shader_attribs_3_0;
+ fragment_shader_source[2] = fragment_shader_main;
+ fragment_shader_source[3] = fragment_shader_out_3_0;
+ }
+ if (!glsl_CompileAndLinkShaders(3,vertex_shader_source,
+ 4,fragment_shader_source,
+ &ev->shader_program))
+ return;
+ ev->vertex_uv_index = glGetAttribLocation(ev->shader_program,"VertexUV");
+ ev->vertex_t_index = glGetAttribLocation(ev->shader_program,"VertexT");
+ ev->color_index = glGetAttribLocation(ev->shader_program,"VertexColor");
+ if (ev->vertex_uv_index == -1 || ev->vertex_t_index == -1 ||
+ ev->color_index == -1)
+ {
+ glDeleteProgram(ev->shader_program);
+ return;
+ }
+ ev->mat_mv_index = glGetUniformLocation(ev->shader_program,
+ "MatModelView");
+ ev->mat_p_index = glGetUniformLocation(ev->shader_program,
+ "MatProj");
+ ev->db_index = glGetUniformLocation(ev->shader_program,
+ "DB");
+ ev->dl_index = glGetUniformLocation(ev->shader_program,
+ "DL");
+ ev->bool_textures_index = glGetUniformLocation(ev->shader_program,
+ "BoolTextures");
+ ev->draw_lines_index = glGetUniformLocation(ev->shader_program,
+ "DrawLines");
+ ev->glbl_ambient_index = glGetUniformLocation(ev->shader_program,
+ "LtGlblAmbient");
+ ev->lt_ambient_index = glGetUniformLocation(ev->shader_program,
+ "LtAmbient");
+ ev->lt_diffuse_index = glGetUniformLocation(ev->shader_program,
+ "LtDiffuse");
+ ev->lt_specular_index = glGetUniformLocation(ev->shader_program,
+ "LtSpecular");
+ ev->lt_direction_index = glGetUniformLocation(ev->shader_program,
+ "LtDirection");
+ ev->lt_halfvect_index = glGetUniformLocation(ev->shader_program,
+ "LtHalfVector");
+ ev->front_ambient_index = glGetUniformLocation(ev->shader_program,
+ "MatFrontAmbient");
+ ev->back_ambient_index = glGetUniformLocation(ev->shader_program,
+ "MatBackAmbient");
+ ev->front_diffuse_index = glGetUniformLocation(ev->shader_program,
+ "MatFrontDiffuse");
+ ev->back_diffuse_index = glGetUniformLocation(ev->shader_program,
+ "MatBackDiffuse");
+ ev->specular_index = glGetUniformLocation(ev->shader_program,
+ "MatSpecular");
+ ev->shininess_index = glGetUniformLocation(ev->shader_program,
+ "MatShininess");
+ ev->texture_sampler_index = glGetUniformLocation(ev->shader_program,
+ "TextureSampler");
+ if (ev->mat_mv_index == -1 || ev->mat_p_index == -1 ||
+ ev->db_index == -1 || ev->dl_index == -1 ||
+ ev->bool_textures_index == -1 || ev->draw_lines_index == -1 ||
+ ev->glbl_ambient_index == -1 || ev->lt_ambient_index == -1 ||
+ ev->lt_diffuse_index == -1 || ev->lt_specular_index == -1 ||
+ ev->lt_direction_index == -1 || ev->lt_halfvect_index == -1 ||
+ ev->front_ambient_index == -1 || ev->back_ambient_index == -1 ||
+ ev->front_diffuse_index == -1 || ev->back_diffuse_index == -1 ||
+ ev->specular_index == -1 || ev->shininess_index == -1 ||
+ ev->texture_sampler_index == -1)
+ {
+ glDeleteProgram(ev->shader_program);
+ return;
+ }
+
+ glGenBuffers(1,&ev->vertex_uv_buffer);
+ glGenBuffers(1,&ev->vertex_t_buffer);
+ glGenBuffers(1,&ev->color_buffer);
+ glGenBuffers(1,&ev->indices_buffer);
+
+ ev->use_shaders = True;
+}
+
+#endif /* HAVE_GLSL */
+
+
static void init(ModeInfo *mi)
{
- static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
- static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
- static const GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
- static const GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
- static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
etruscanvenusstruct *ev = &etruscanvenus[MI_SCREEN(mi)];
if (deform_speed == 0.0)
@@ -1352,80 +2364,24 @@ static void init(ModeInfo *mi)
ev->offset3d[1] = 0.0;
ev->offset3d[2] = -2.0;
+ ev->ev = calloc(3*(NUMU+1)*(NUMV+1),sizeof(float));
+ ev->evn = calloc(3*(NUMU+1)*(NUMV+1),sizeof(float));
+ ev->col = calloc(4*(NUMU+1)*(NUMV+1),sizeof(float));
+ ev->tex = calloc(2*(NUMU+1)*(NUMV+1),sizeof(float));
+
gen_texture(mi);
setup_etruscan_venus_color_texture(mi,0.0,2.0*M_PI,0.0,2.0*M_PI,NUMU,NUMV);
- if (ev->marks)
- glEnable(GL_TEXTURE_2D);
- else
- glDisable(GL_TEXTURE_2D);
+#ifdef HAVE_GLSL
+ init_glsl(mi);
+#endif /* HAVE_GLSL */
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- if (ev->projection == DISP_PERSPECTIVE || ev->view == VIEW_WALK)
- {
- if (ev->view == VIEW_WALK)
- gluPerspective(60.0,1.0,0.01,10.0);
- else
- gluPerspective(60.0,1.0,0.1,10.0);
- }
- else
- {
- glOrtho(-1.0,1.0,-1.0,1.0,0.1,10.0);
- }
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
-# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
- if (ev->display_mode == DISP_WIREFRAME)
+#ifdef HAVE_ANDROID
+ /* glPolygonMode(...,GL_LINE) is not supported for an OpenGL ES 1.1
+ context. */
+ if (!ev->use_shaders && ev->display_mode == DISP_WIREFRAME)
ev->display_mode = DISP_SURFACE;
-# endif
-
- if (ev->display_mode == DISP_SURFACE)
- {
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LESS);
- glShadeModel(GL_SMOOTH);
- glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
- glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
- glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
- glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
- glLightfv(GL_LIGHT0,GL_POSITION,light_position);
- glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
- glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
- glDepthMask(GL_TRUE);
- glDisable(GL_BLEND);
- }
- else if (ev->display_mode == DISP_TRANSPARENT)
- {
- glDisable(GL_DEPTH_TEST);
- glShadeModel(GL_SMOOTH);
- glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
- glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
- glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
- glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
- glLightfv(GL_LIGHT0,GL_POSITION,light_position);
- glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
- glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
- glDepthMask(GL_FALSE);
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE);
- }
- else /* ev->display_mode == DISP_WIREFRAME */
- {
- glDisable(GL_DEPTH_TEST);
- glShadeModel(GL_FLAT);
- glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
- glDisable(GL_LIGHTING);
- glDisable(GL_LIGHT0);
- glDisable(GL_BLEND);
- }
+#endif /* HAVE_ANDROID */
}
@@ -1500,26 +2456,14 @@ static void display_etruscanvenus(ModeInfo *mi)
}
}
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- if (ev->projection == DISP_PERSPECTIVE || ev->view == VIEW_WALK)
- {
- if (ev->view == VIEW_WALK)
- gluPerspective(60.0,ev->aspect,0.01,10.0);
- else
- gluPerspective(60.0,ev->aspect,0.1,10.0);
- }
+#ifdef HAVE_GLSL
+ if (ev->use_shaders)
+ mi->polygon_count = etruscan_venus_pf(mi,0.0,2.0*M_PI,0.0,2.0*M_PI,
+ NUMU,NUMV);
else
- {
- if (ev->aspect >= 1.0)
- glOrtho(-ev->aspect,ev->aspect,-1.0,1.0,0.1,10.0);
- else
- glOrtho(-1.0,1.0,-1.0/ev->aspect,1.0/ev->aspect,0.1,10.0);
- }
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- mi->polygon_count = etruscan_venus(mi,0.0,2.0*M_PI,0.0,2.0*M_PI,NUMU,NUMV);
+#endif /* HAVE_GLSL */
+ mi->polygon_count = etruscan_venus_ff(mi,0.0,2.0*M_PI,0.0,2.0*M_PI,
+ NUMU,NUMV);
}
@@ -1589,11 +2533,6 @@ ENTRYPOINT void init_etruscanvenus(ModeInfo *mi)
MI_INIT (mi, etruscanvenus);
ev = &etruscanvenus[MI_SCREEN(mi)];
- ev->ev = calloc(3*(NUMU+1)*(NUMV+1),sizeof(float));
- ev->evn = calloc(3*(NUMU+1)*(NUMV+1),sizeof(float));
- ev->col = calloc(4*(NUMU+1)*(NUMV+1),sizeof(float));
- ev->tex = calloc(2*(NUMU+1)*(NUMV+1),sizeof(float));
-
ev->trackball = gltrackball_init(True);
ev->button_pressed = False;
@@ -1741,7 +2680,6 @@ ENTRYPOINT void init_etruscanvenus(ModeInfo *mi)
if ((ev->glx_context = init_GL(mi)) != NULL)
{
reshape_etruscanvenus(mi,MI_WIDTH(mi),MI_HEIGHT(mi));
- glDrawBuffer(GL_BACK);
init(mi);
}
else
@@ -1771,6 +2709,8 @@ ENTRYPOINT void draw_etruscanvenus(ModeInfo *mi)
glXMakeCurrent(display, window, *ev->glx_context);
+ glClearColor(0.0f,0.0f,0.0f,1.0f);
+ glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
@@ -1785,12 +2725,19 @@ ENTRYPOINT void draw_etruscanvenus(ModeInfo *mi)
}
-/*
- *-----------------------------------------------------------------------------
- * The display is being taken away from us. Free up malloc'ed
- * memory and X resources that we've alloc'ed.
- *-----------------------------------------------------------------------------
- */
+#ifndef STANDALONE
+ENTRYPOINT void change_etruscanvenus(ModeInfo *mi)
+{
+ etruscanvenusstruct *ev = &etruscanvenus[MI_SCREEN(mi)];
+
+ if (!ev->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *ev->glx_context);
+ init(mi);
+}
+#endif /* !STANDALONE */
+
ENTRYPOINT void free_etruscanvenus(ModeInfo *mi)
{
@@ -1805,20 +2752,24 @@ ENTRYPOINT void free_etruscanvenus(ModeInfo *mi)
if (ev->tex) free(ev->tex);
gltrackball_free(ev->trackball);
if (ev->tex_name) glDeleteTextures(1, &ev->tex_name);
+#ifdef HAVE_GLSL
+ if (ev->uv) free(ev->uv);
+ if (ev->indices) free(ev->indices);
+ if (ev->use_shaders)
+ {
+ glDeleteBuffers(1,&ev->vertex_uv_buffer);
+ glDeleteBuffers(1,&ev->vertex_t_buffer);
+ glDeleteBuffers(1,&ev->color_buffer);
+ glDeleteBuffers(1,&ev->indices_buffer);
+ if (ev->shader_program != 0)
+ {
+ glUseProgram(0);
+ glDeleteProgram(ev->shader_program);
+ }
+ }
+#endif /* HAVE_GLSL */
}
-#ifndef STANDALONE
-ENTRYPOINT void change_etruscanvenus(ModeInfo *mi)
-{
- etruscanvenusstruct *ev = &etruscanvenus[MI_SCREEN(mi)];
-
- if (!ev->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *ev->glx_context);
- init(mi);
-}
-#endif /* !STANDALONE */
XSCREENSAVER_MODULE ("EtruscanVenus", etruscanvenus)
diff --git a/hacks/glx/etruscanvenus.man b/hacks/glx/etruscanvenus.man
index a96bd23..9517274 100644
--- a/hacks/glx/etruscanvenus.man
+++ b/hacks/glx/etruscanvenus.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-etruscanvenus - Draws a 3d immersion of a Klein bottle that smoothly
+etruscanvenus \- Draws a 3d immersion of a Klein bottle that smoothly
deforms between the Etruscan Venus surface, the Roman surface, the Boy
surface surface, and the Ida surface.
.SH SYNOPSIS
diff --git a/hacks/glx/extrusion.c b/hacks/glx/extrusion.c
index f8aaeb5..b76edfb 100644
--- a/hacks/glx/extrusion.c
+++ b/hacks/glx/extrusion.c
@@ -22,10 +22,6 @@
* which can be obtained from http://www.linas.org/gle/index.html
*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#ifdef STANDALONE
#define DEFAULTS "*delay: 20000 \n" \
"*showFPS: False \n" \
@@ -39,17 +35,6 @@
#ifdef USE_GL /* whole file */
-#ifdef HAVE_XMU
-# ifndef VMS
-# include <X11/Xmu/Drawing.h>
-#else /* VMS */
-# include <Xmu/Drawing.h>
-# endif /* VMS */
-#endif
-
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#include "ximage-loader.h"
#include "rotator.h"
#include "gltrackball.h"
diff --git a/hacks/glx/extrusion.h b/hacks/glx/extrusion.h
index 226a442..6ad5566 100644
--- a/hacks/glx/extrusion.h
+++ b/hacks/glx/extrusion.h
@@ -17,15 +17,11 @@
#ifndef __XSCREENSAVER_EXTRUSION_H__
#define __XSCREENSAVER_EXTRUSION_H__
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
+#include "xlockmoreI.h"
#ifdef HAVE_COCOA
# include <GLUT/tube.h> /* gle is included with GLUT on OSX */
#else /* !HAVE_COCOA */
-# include <GL/gl.h>
-# include <GL/glu.h>
# ifdef HAVE_GLE3
# include <GL/gle.h>
# else
@@ -33,10 +29,6 @@
# endif
#endif /* !HAVE_COCOA */
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
extern void InitStuff_helix2(void);
extern void DrawStuff_helix2(void);
extern void InitStuff_helix3(void);
diff --git a/hacks/glx/extrusion.man b/hacks/glx/extrusion.man
index e01d573..b4a0b29 100644
--- a/hacks/glx/extrusion.man
+++ b/hacks/glx/extrusion.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-extrusion - various rotating extruded shapes.
+extrusion \- various rotating extruded shapes.
.SH SYNOPSIS
.B extrusion
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/flipflop.c b/hacks/glx/flipflop.c
index fe1643b..dc4f2ff 100644
--- a/hacks/glx/flipflop.c
+++ b/hacks/glx/flipflop.c
@@ -1,5 +1,5 @@
/* flipflop, Copyright (c) 2003 Kevin Ogden <kogden1@hotmail.com>
- * (c) 2006 Sergio Gutirrez "Sergut" <sergut@gmail.com>
+ * (c) 2006 Sergio Gutiérrez "Sergut" <sergut@gmail.com>
* (c) 2008 Andrew Galante <a.drew7@gmail.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
@@ -12,7 +12,7 @@
*
*
* 2003 Kevin Odgen First version
- * 2006 Sergio Gutirrez "Sergut" Made several parameters dynamic and selectable
+ * 2006 Sergio Gutiérrez "Sergut" Made several parameters dynamic and selectable
* from the command line: size of the board,
* rotation speed and number of free squares; also
* added the "sticks" mode.
@@ -54,9 +54,6 @@
#include "gltrackball.h"
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
static XrmOptionDescRec opts[] = {
{"-sticks", ".mode", XrmoptionNoArg, "sticks"},
{"-tiles", ".mode", XrmoptionNoArg, "tiles" },
@@ -71,26 +68,27 @@ static XrmOptionDescRec opts[] = {
{"+texture", ".textured", XrmoptionNoArg, "False" },
};
-static int wire, clearbits;
-static int board_x_size, board_y_size, board_avg_size;
-static int numsquares, freesquares;
-static float half_thick;
-static float spin;
-static char* flipflopmode_str="tiles";
-static int textured;
+/* The code had been modifying these. That's not allowed. */
+static int board_x_size_arg, board_y_size_arg, board_avg_size_arg;
+static int numsquares_arg, freesquares_arg;
+static float half_thick_arg;
+static float spin_arg;
+static char* flipflopmode_str_arg="tiles";
+static int textured_arg;
static argtype vars[] = {
- { &flipflopmode_str, "mode", "Mode", DEF_MODE, t_String},
- { &board_avg_size, "size", "Integer", DEF_BOARD_SIZE, t_Int},
- { &board_x_size, "sizex", "Integer", DEF_SIZEX, t_Int},
- { &board_y_size, "sizey", "Integer", DEF_SIZEY, t_Int},
- { &numsquares, "numsquares", "Integer", DEF_NUMSQUARES, t_Int},
- { &freesquares, "freesquares", "Integer", DEF_NUMSQUARES, t_Int},
- { &spin, "spin", "Float", DEF_SPIN, t_Float},
- { &textured, "textured", "Bool", DEF_TEXTURED, t_Bool},
+ { &flipflopmode_str_arg, "mode", "Mode", DEF_MODE, t_String},
+ { &board_avg_size_arg, "size", "Integer", DEF_BOARD_SIZE, t_Int},
+ { &board_x_size_arg, "sizex", "Integer", DEF_SIZEX, t_Int},
+ { &board_y_size_arg, "sizey", "Integer", DEF_SIZEY, t_Int},
+ { &numsquares_arg, "numsquares", "Integer", DEF_NUMSQUARES, t_Int},
+ { &freesquares_arg, "freesquares", "Integer", DEF_NUMSQUARES, t_Int},
+ { &spin_arg, "spin", "Float", DEF_SPIN, t_Float},
+ { &textured_arg, "textured", "Bool", DEF_TEXTURED, t_Bool},
};
-ENTRYPOINT ModeSpecOpt flipflop_opts = {countof(opts), opts, countof(vars), vars, NULL};
+ENTRYPOINT ModeSpecOpt flipflop_opts =
+ {countof(opts), opts, countof(vars), vars, NULL};
#ifdef USE_MODULES
ModStruct flipflop_description =
@@ -102,58 +100,66 @@ ModStruct flipflop_description =
#endif /* USE_MODULES */
typedef struct {
- /* array specifying which squares are where (to avoid collisions) */
- /* -1 means empty otherwise integer represents square index 0 - n-1 */
- /* occupied[x*board_y_size+y] is the tile [x][y] (i.e. that starts at column x and row y)*/
- int *occupied; /* size: size_x * size_y */
- /* an array of xpositions of the squares */
- int *xpos; /* size: numsquares */
- /* array of y positions of the squares */
- int *ypos; /* size: numsquares */
- /* integer representing the direction of movement of a square */
- int *direction; /* 0 not, 1 x+, 2 y+, 3 x-, 4 y-*/ /* size: numsquares */
- /* angle of moving square (during a flip) */
- float *angle; /* size: numsquares */
- /* array of colors for a square (RGB) */
- /* eg. color[ 3*3 + 0 ] is the red component of square 3 */
- /* eg. color[ 4*3 + 1 ] is the green component of square 4 */
- /* eg. color[ 5*3 + 2 ] is the blue component of square 5 */
- /* ^-- n is the number of square */
- float *color; /* size: numsquares * 3 */
- /* array of texcoords for each square */
- /* tex[ n*4 + 0 ] is x texture coordinate of square n's left side */
- /* tex[ n*4 + 1 ] is y texture coordinate of square n's top side */
- /* tex[ n*4 + 2 ] is x texture coordinate of square n's right side */
- /* tex[ n*4 + 3 ] is y texture coordinate of square n's bottom side */
- float *tex; /* size: numsquares * 4 */
+ /* array specifying which squares are where (to avoid collisions) */
+ /* -1 means empty otherwise integer represents square index 0 - n-1 */
+ /* occupied[x*board_y_size+y] is the tile [x][y] (i.e. that starts at column x and row y)*/
+ int *occupied; /* size: size_x * size_y */
+ /* an array of xpositions of the squares */
+ int *xpos; /* size: numsquares */
+ /* array of y positions of the squares */
+ int *ypos; /* size: numsquares */
+ /* integer representing the direction of movement of a square */
+ int *direction; /* 0 not, 1 x+, 2 y+, 3 x-, 4 y-*/ /* size: numsquares */
+ /* angle of moving square (during a flip) */
+ float *angle; /* size: numsquares */
+ /* array of colors for a square (RGB) */
+ /* eg. color[ 3*3 + 0 ] is the red component of square 3 */
+ /* eg. color[ 4*3 + 1 ] is the green component of square 4 */
+ /* eg. color[ 5*3 + 2 ] is the blue component of square 5 */
+ /* ^-- n is the number of square */
+ float *color; /* size: numsquares * 3 */
+ /* array of texcoords for each square */
+ /* tex[ n*4 + 0 ] is x texture coordinate of square n's left side */
+ /* tex[ n*4 + 1 ] is y texture coordinate of square n's top side */
+ /* tex[ n*4 + 2 ] is x texture coordinate of square n's right side */
+ /* tex[ n*4 + 3 ] is y texture coordinate of square n's bottom side */
+ float *tex; /* size: numsquares * 4 */
} randsheet;
typedef struct {
- GLXContext *glx_context;
- Window window;
- trackball_state *trackball;
- Bool button_down_p;
+ GLXContext *glx_context;
+ Window window;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ int clearbits;
+ int board_x_size, board_y_size, board_avg_size;
+ int numsquares, freesquares;
+ float half_thick;
+ float spin;
+ const char *flipflopmode_str;
+ int textured;
- randsheet *sheet;
+ randsheet *sheet;
- float theta; /* angle of rotation of the board */
- float flipspeed; /* amount of flip; 1 is a entire flip */
- float reldist; /* relative distace of camera from center */
- float energy; /* likelyhood that a square will attempt to move */
+ float theta; /* angle of rotation of the board */
+ float flipspeed; /* amount of flip; 1 is a entire flip */
+ float reldist; /* relative distace of camera from center */
+ float energy; /* likelyhood that a square will attempt to move */
- /* texture rectangle */
- float tex_x;
- float tex_y;
- float tex_width;
- float tex_height;
+ /* texture rectangle */
+ float tex_x;
+ float tex_y;
+ float tex_width;
+ float tex_height;
- /* id of texture in use */
- GLuint texid;
+ /* id of texture in use */
+ GLuint texid;
- Bool mipmap;
- Bool got_texture;
+ Bool mipmap;
+ Bool got_texture;
- GLfloat anisotropic;
+ GLfloat anisotropic;
} Flipflopcreen;
@@ -161,36 +167,38 @@ static Flipflopcreen *qs = NULL;
#include "grab-ximage.h"
-static void randsheet_create( randsheet *rs );
-static void randsheet_initialize( randsheet *rs );
-static void randsheet_free( randsheet *rs );
-static int randsheet_new_move( randsheet* rs );
-static void randsheet_move( randsheet *rs, float rot );
-static int randsheet_draw( randsheet *rs );
-static void setup_lights(void);
-static int drawBoard(Flipflopcreen *);
+static void randsheet_create(ModeInfo *mi, randsheet *rs);
+static void randsheet_initialize(ModeInfo *mi, randsheet *rs);
+static void randsheet_free (randsheet *rs);
+static int randsheet_new_move(ModeInfo *mi, randsheet* rs);
+static void randsheet_move(ModeInfo *mi, randsheet *rs, float rot);
+static int randsheet_draw(ModeInfo *mi, randsheet *rs);
+static void setup_lights(ModeInfo *mi);
+static int drawBoard(ModeInfo *mi, Flipflopcreen *);
static int display(ModeInfo *mi);
-static int draw_sheet(float *tex);
+static int draw_sheet(ModeInfo *mi, float *tex);
/* configure lighting */
static void
-setup_lights(void)
+setup_lights(ModeInfo *mi)
{
- /* GLfloat position0[] = { board_avg_size*0.5, board_avg_size*0.1, board_avg_size*0.5, 1.0 }; */
+ Flipflopcreen *c = &qs[MI_SCREEN(mi)];
- /* GLfloat position0[] = { -board_avg_size*0.5, 0.2*board_avg_size, -board_avg_size*0.5, 1.0 }; */
- GLfloat position0[4];
- position0[0] = 0;
- position0[1] = board_avg_size*0.3;
- position0[2] = 0;
- position0[3] = 1;
+ /* GLfloat position0[] = { c->board_avg_size*0.5, c->board_avg_size*0.1, c->board_avg_size*0.5, 1.0 }; */
- if (wire) return;
+ /* GLfloat position0[] = { -c->board_avg_size*0.5, 0.2*c->board_avg_size, -c->board_avg_size*0.5, 1.0 }; */
+ GLfloat position0[4];
+ position0[0] = 0;
+ position0[1] = c->board_avg_size*0.3;
+ position0[2] = 0;
+ position0[3] = 1;
- glEnable(GL_LIGHTING);
- glLightfv(GL_LIGHT0, GL_POSITION, position0);
- glEnable(GL_LIGHT0);
+ if (MI_IS_WIREFRAME(mi)) return;
+
+ glEnable(GL_LIGHTING);
+ glLightfv(GL_LIGHT0, GL_POSITION, position0);
+ glEnable(GL_LIGHT0);
}
static void get_texture(ModeInfo *);
@@ -199,7 +207,7 @@ static void get_texture(ModeInfo *);
ENTRYPOINT Bool
flipflop_handle_event (ModeInfo *mi, XEvent *event)
{
- Flipflopcreen *c = &qs[MI_SCREEN(mi)];
+ Flipflopcreen *c = &qs[MI_SCREEN(mi)];
if (gltrackball_event_handler (event, c->trackball,
MI_WIDTH (mi), MI_HEIGHT (mi),
@@ -207,77 +215,68 @@ flipflop_handle_event (ModeInfo *mi, XEvent *event)
return True;
else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
{
- if (!textured || c->got_texture)
+ if (!c->textured || c->got_texture)
{
- textured = 1;
+ c->textured = 1;
c->got_texture = False;
get_texture (mi);
return True;
}
}
- return False;
+ return False;
}
/* draw board */
static int
-drawBoard(Flipflopcreen *c)
+drawBoard(ModeInfo *mi, Flipflopcreen *c)
{
- int i;
- for( i=0; i < (c->energy) ; i++ ) {
- randsheet_new_move( c->sheet );
- }
- randsheet_move( c->sheet, c->flipspeed * 3.14159 );
- return randsheet_draw( c->sheet );
+ int i;
+ for (i=0; i < (c->energy) ; i++) {
+ randsheet_new_move(mi, c->sheet);
+ }
+ randsheet_move(mi, c->sheet, c->flipspeed * M_PI);
+ return randsheet_draw(mi, c->sheet);
}
static int
display(ModeInfo *mi)
{
- Flipflopcreen *c = &qs[MI_SCREEN(mi)];
- GLfloat amb[] = { 0.8, 0.8, 0.8, 1.0 };
- int polys = 0;
-
+ Flipflopcreen *c = &qs[MI_SCREEN(mi)];
+ GLfloat amb[] = { 0.8, 0.8, 0.8, 1.0 };
+ int polys = 0;
- glClear(clearbits);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 1.2);
- glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.15/board_avg_size );
- glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.15/board_avg_size );
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glClear(c->clearbits);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 1.2);
+ glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.15/c->board_avg_size);
+ glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.15/c->board_avg_size);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glRotatef(current_device_rotation(), 0, 0, 1);
- /** setup perspectif */
- glTranslatef(0.0, 0.0, -c->reldist*board_avg_size);
- glRotatef(22.5, 1.0, 0.0, 0.0);
- gltrackball_rotate (c->trackball);
- glRotatef(c->theta*100, 0.0, 1.0, 0.0);
- glTranslatef(-0.5*board_x_size, 0.0, -0.5*board_y_size); /* Center the board */
+ glRotatef(current_device_rotation(), 0, 0, 1);
- /* set texture */
- if(textured)
- glBindTexture(GL_TEXTURE_2D, c->texid);
+ /** setup perspectif */
+ glTranslatef(0.0, 0.0, -c->reldist*c->board_avg_size);
+ glRotatef(22.5, 1.0, 0.0, 0.0);
+ gltrackball_rotate (c->trackball);
+ glRotatef(c->theta*100, 0.0, 1.0, 0.0);
+ glTranslatef(-0.5*c->board_x_size, 0.0, -0.5*c->board_y_size); /* Center the board */
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
- {
- GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
- }
-# endif
+ /* set texture */
+ if(c->textured)
+ glBindTexture(GL_TEXTURE_2D, c->texid);
- polys = drawBoard(c);
+ polys = drawBoard(mi, c);
- if (!c->button_down_p) {
- c->theta += .01 * spin;
- }
+ if (!c->button_down_p) {
+ c->theta += .01 * c->spin;
+ }
- return polys;
+ return polys;
}
ENTRYPOINT void
@@ -305,52 +304,52 @@ image_loaded_cb (const char *filename, XRectangle *geometry,
int texture_width, int texture_height,
void *closure)
{
- Flipflopcreen *c = (Flipflopcreen *)closure;
- int i, j;
- int index = 0;
- randsheet *rs = c->sheet;
-
- c->tex_x = (float)geometry->x / (float)texture_width;
- c->tex_y = (float)geometry->y / (float)texture_height;
- c->tex_width = (float)geometry->width / (float)texture_width;
- c->tex_height = (float)geometry->height / (float)texture_height;
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
- (c->mipmap ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
-
- if(c->anisotropic >= 1)
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, c->anisotropic);
-
- glEnable(GL_TEXTURE_2D);
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- for(i = 0; i < board_x_size && index < numsquares; i++)
- for(j = 0; j < board_y_size && index < numsquares; j++)
- {
- /* arrange squares to form loaded image */
- rs->tex[ index*4 + 0 ] = c->tex_x + c->tex_width / board_x_size * (i + 0);
- rs->tex[ index*4 + 1 ] = c->tex_y + c->tex_height / board_y_size * (j + 1);
- rs->tex[ index*4 + 2 ] = c->tex_x + c->tex_width / board_x_size * (i + 1);
- rs->tex[ index*4 + 3 ] = c->tex_y + c->tex_height / board_y_size * (j + 0);
- rs->color[ index*3 + 0 ] = 1;
- rs->color[ index*3 + 1 ] = 1;
- rs->color[ index*3 + 2 ] = 1;
- index++;
- }
-
- c->got_texture = True;
+ Flipflopcreen *c = (Flipflopcreen *)closure;
+ int i, j;
+ int index = 0;
+ randsheet *rs = c->sheet;
+
+ c->tex_x = (float)geometry->x / (float)texture_width;
+ c->tex_y = (float)geometry->y / (float)texture_height;
+ c->tex_width = (float)geometry->width / (float)texture_width;
+ c->tex_height = (float)geometry->height / (float)texture_height;
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+ (c->mipmap ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
+
+ if(c->anisotropic >= 1)
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, c->anisotropic);
+
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ for(i = 0; i < c->board_x_size && index < c->numsquares; i++)
+ for(j = 0; j < c->board_y_size && index < c->numsquares; j++)
+ {
+ /* arrange squares to form loaded image */
+ rs->tex[ index*4 + 0 ] = c->tex_x + c->tex_width / c->board_x_size * (i + 0);
+ rs->tex[ index*4 + 1 ] = c->tex_y + c->tex_height / c->board_y_size * (j + 1);
+ rs->tex[ index*4 + 2 ] = c->tex_x + c->tex_width / c->board_x_size * (i + 1);
+ rs->tex[ index*4 + 3 ] = c->tex_y + c->tex_height / c->board_y_size * (j + 0);
+ rs->color[ index*3 + 0 ] = 1;
+ rs->color[ index*3 + 1 ] = 1;
+ rs->color[ index*3 + 2 ] = 1;
+ index++;
+ }
+
+ c->got_texture = True;
}
static void
get_texture(ModeInfo *modeinfo)
{
- Flipflopcreen *c = &qs[MI_SCREEN(modeinfo)];
+ Flipflopcreen *c = &qs[MI_SCREEN(modeinfo)];
- c->got_texture = False;
- c->mipmap = True;
- load_texture_async (modeinfo->xgwa.screen, modeinfo->window,
+ c->got_texture = False;
+ c->mipmap = True;
+ load_texture_async (modeinfo->xgwa.screen, modeinfo->window,
*c->glx_context, 0, 0, c->mipmap, c->texid,
image_loaded_cb, c);
}
@@ -358,114 +357,119 @@ get_texture(ModeInfo *modeinfo)
ENTRYPOINT void
init_flipflop(ModeInfo *mi)
{
- int screen;
- Flipflopcreen *c;
-
- if (MI_IS_WIREFRAME(mi)) textured = 0;
-
- /* Set all constants to their correct values */
- if (board_avg_size != 0) { /* general size specified by user */
- board_x_size = board_avg_size;
- board_y_size = board_avg_size;
- } else {
- board_avg_size = (board_x_size + board_y_size) / 2;
- }
- if ((numsquares == 0) && (freesquares != 0)) {
- numsquares = board_x_size * board_y_size - freesquares;
- }
- if (strcmp(flipflopmode_str, "tiles")) {
- textured = 0; /* textures look dumb in stick mode */
- half_thick = 1.0 * DEF_STICK_THICK / 100.0;
- if (numsquares == 0) { /* No value defined by user */
- numsquares = board_x_size * board_y_size * DEF_STICK_RATIO / 100;
- }
- } else {
- half_thick = 1.0 * DEF_TILE_THICK / 100.0;
- if (numsquares == 0) { /* No value defined by user */
- numsquares = board_x_size * board_y_size * DEF_TILE_RATIO/ 100;;
- }
- }
- if (board_avg_size < 2) {
- fprintf (stderr,"%s: the board must be at least 2x2.\n", progname);
- exit(1);
- }
- if ((board_x_size < 1) || (board_y_size < 1) || (numsquares < 1)) {
- fprintf (stderr,"%s: the number of elements ('-count') and the dimensions of the board ('-size-x', '-size-y') must be positive integers.\n", progname);
- exit(1);
+ Flipflopcreen *c;
+ MI_INIT(mi, qs);
+ c = &qs[MI_SCREEN(mi)];
+
+ c->board_x_size = board_x_size_arg;
+ c->board_y_size = board_y_size_arg;
+ c->board_avg_size = board_avg_size_arg;
+ c->numsquares = numsquares_arg;
+ c->freesquares = freesquares_arg;
+ c->half_thick = half_thick_arg;
+ c->spin = spin_arg;
+ c->flipflopmode_str = flipflopmode_str_arg;
+ c->textured = textured_arg;
+
+ if (MI_IS_WIREFRAME(mi)) c->textured = 0;
+
+ /* Set all constants to their correct values */
+ if (c->board_avg_size != 0) { /* general size specified by user */
+ c->board_x_size = c->board_avg_size;
+ c->board_y_size = c->board_avg_size;
+ } else {
+ c->board_avg_size = (c->board_x_size + c->board_y_size) / 2;
+ }
+ if ((c->numsquares == 0) && (c->freesquares != 0)) {
+ c->numsquares = c->board_x_size * c->board_y_size - c->freesquares;
+ }
+ if (strcmp(c->flipflopmode_str, "tiles")) {
+ c->textured = 0; /* textures look dumb in stick mode */
+ c->half_thick = 1.0 * DEF_STICK_THICK / 100.0;
+ if (c->numsquares == 0) { /* No value defined by user */
+ c->numsquares = c->board_x_size * c->board_y_size * DEF_STICK_RATIO / 100;
}
- if (board_x_size * board_y_size <= numsquares) {
- fprintf (stderr,"%s: the number of elements ('-count') that you specified is too big \n for the dimensions of the board ('-size-x', '-size-y'). Nothing will move.\n", progname);
+ } else {
+ c->half_thick = 1.0 * DEF_TILE_THICK / 100.0;
+ if (c->numsquares == 0) { /* No value defined by user */
+ c->numsquares = c->board_x_size * c->board_y_size * DEF_TILE_RATIO/ 100;;
}
+ }
+ if (c->board_avg_size < 2) {
+ fprintf (stderr,"%s: the board must be at least 2x2.\n", progname);
+ exit(1);
+ }
+ if ((c->board_x_size < 1) || (c->board_y_size < 1) || (c->numsquares < 1)) {
+ fprintf (stderr,"%s: the number of elements ('-count') and the dimensions of the board ('-size-x', '-size-y') must be positive integers.\n", progname);
+ exit(1);
+ }
+ if (c->board_x_size * c->board_y_size <= c->numsquares) {
+ fprintf (stderr,"%s: the number of elements ('-count') that you specified is too big \n for the dimensions of the board ('-size-x', '-size-y'). Nothing will move.\n", progname);
+ }
+
+ c->window = MI_WINDOW(mi);
+ c->trackball = gltrackball_init (False);
+
+ c->flipspeed = 0.03;
+ c->reldist = 1;
+ c->energy = 40;
- screen = MI_SCREEN(mi);
- wire = MI_IS_WIREFRAME(mi);
+ if((c->glx_context = init_GL(mi)))
+ reshape_flipflop(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ else
+ MI_CLEARWINDOW(mi);
- MI_INIT(mi, qs);
+ /* At this point, all the constants have already been set, */
+ /* so we can create the board */
+ c->sheet = (randsheet*) malloc(sizeof(randsheet));
+ randsheet_create(mi, c->sheet);
- c = &qs[screen];
- c->window = MI_WINDOW(mi);
- c->trackball = gltrackball_init (False);
+ c->clearbits = GL_COLOR_BUFFER_BIT;
- c->flipspeed = 0.03;
- c->reldist = 1;
- c->energy = 40;
+ glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
+ glEnable(GL_COLOR_MATERIAL);
+ setup_lights(mi);
- if((c->glx_context = init_GL(mi)))
- reshape_flipflop(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ glEnable(GL_DEPTH_TEST);
+ c->clearbits |= GL_DEPTH_BUFFER_BIT;
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+
+ randsheet_initialize(mi, c->sheet);
+ if (c->textured){
+ /* check for anisotropic filtering */
+ if(strstr((char *)glGetString(GL_EXTENSIONS),
+ "GL_EXT_texture_filter_anisotropic"))
+ glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &c->anisotropic);
else
- MI_CLEARWINDOW(mi);
-
- /* At this point, all the constants have already been set, */
- /* so we can create the board */
- c->sheet = (randsheet*) malloc(sizeof(randsheet));
- randsheet_create( c->sheet );
-
- clearbits = GL_COLOR_BUFFER_BIT;
-
- glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
- glEnable(GL_COLOR_MATERIAL);
- setup_lights();
-
- glEnable(GL_DEPTH_TEST);
- clearbits |= GL_DEPTH_BUFFER_BIT;
- glEnable(GL_CULL_FACE);
- glCullFace(GL_BACK);
-
- randsheet_initialize( c->sheet );
- if( textured ){
- /* check for anisotropic filtering */
- if(strstr((char *)glGetString(GL_EXTENSIONS),
- "GL_EXT_texture_filter_anisotropic"))
- glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &c->anisotropic);
- else
- c->anisotropic = 0;
-
- /* allocate a new texture and get it */
- glGenTextures(1, &c->texid);
- get_texture(mi);
- }
+ c->anisotropic = 0;
+
+ /* allocate a new texture and get it */
+ glGenTextures(1, &c->texid);
+ get_texture(mi);
+ }
}
ENTRYPOINT void
draw_flipflop(ModeInfo *mi)
{
- Flipflopcreen *c = &qs[MI_SCREEN(mi)];
- Window w = MI_WINDOW(mi);
- Display *disp = MI_DISPLAY(mi);
-
- if(!c->glx_context || (textured && !c->got_texture))
- return;
+ Flipflopcreen *c = &qs[MI_SCREEN(mi)];
+ Window w = MI_WINDOW(mi);
+ Display *disp = MI_DISPLAY(mi);
- glXMakeCurrent(disp, w, *c->glx_context);
+ glXMakeCurrent(disp, w, *c->glx_context);
+ if(!c->textured || c->got_texture)
mi->polygon_count = display(mi);
+ else
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ if(mi->fps_p){
+ do_fps(mi);
+ }
- if(mi->fps_p){
- do_fps(mi);
- }
-
- glFinish();
- glXSwapBuffers(disp, w);
+ glFinish();
+ glXSwapBuffers(disp, w);
}
@@ -487,145 +491,149 @@ free_flipflop(ModeInfo *mi)
/*** ADDED RANDSHEET FUNCTIONS ***/
static int
-draw_sheet(float *tex)
+draw_sheet(ModeInfo *mi, float *tex)
{
- int polys = 0;
- glBegin( wire ? GL_LINE_LOOP : GL_QUADS );
-
- glNormal3f( 0, -1, 0 );
- glTexCoord2f(tex[0], tex[3]);
- glVertex3f( half_thick, -half_thick, half_thick );
- glTexCoord2f(tex[2], tex[3]);
- glVertex3f( 1-half_thick, -half_thick, half_thick );
- glTexCoord2f(tex[2], tex[1]);
- glVertex3f( 1-half_thick, -half_thick, 1-half_thick);
- glTexCoord2f(tex[0], tex[1]);
- glVertex3f( half_thick, -half_thick, 1-half_thick );
- polys++;
-
- if (wire) { glEnd(); glBegin (GL_LINE_LOOP); }
-
- /* back */
- glNormal3f( 0, 1, 0 );
- glTexCoord2f(tex[0], tex[1]);
- glVertex3f( half_thick, half_thick, 1-half_thick );
- glTexCoord2f(tex[2], tex[1]);
- glVertex3f( 1-half_thick, half_thick, 1-half_thick);
- glTexCoord2f(tex[2], tex[3]);
- glVertex3f( 1-half_thick, half_thick, half_thick );
- glTexCoord2f(tex[0], tex[3]);
- glVertex3f( half_thick, half_thick, half_thick );
- polys++;
-
- if (wire) { glEnd(); return polys; }
-
- /* 4 edges!!! weee.... */
- glNormal3f( 0, 0, -1 );
- glTexCoord2f(tex[0], tex[3]);
- glVertex3f( half_thick, half_thick, half_thick );
- glTexCoord2f(tex[2], tex[3]);
- glVertex3f( 1-half_thick, half_thick, half_thick );
- glTexCoord2f(tex[2], tex[3]);
- glVertex3f( 1-half_thick, -half_thick, half_thick );
- glTexCoord2f(tex[0], tex[3]);
- glVertex3f( half_thick, -half_thick, half_thick );
- polys++;
- glNormal3f( 0, 0, 1 );
- glTexCoord2f(tex[0], tex[1]);
- glVertex3f( half_thick, half_thick, 1-half_thick );
- glTexCoord2f(tex[0], tex[1]);
- glVertex3f( half_thick, -half_thick, 1-half_thick );
- glTexCoord2f(tex[2], tex[1]);
- glVertex3f( 1-half_thick, -half_thick, 1-half_thick );
- glTexCoord2f(tex[2], tex[1]);
- glVertex3f( 1-half_thick, half_thick, 1-half_thick );
- polys++;
- glNormal3f( 1, 0, 0 );
- glTexCoord2f(tex[2], tex[1]);
- glVertex3f( 1-half_thick, half_thick, 1-half_thick );
- glTexCoord2f(tex[2], tex[1]);
- glVertex3f( 1-half_thick, -half_thick, 1-half_thick );
- glTexCoord2f(tex[2], tex[3]);
- glVertex3f( 1-half_thick, -half_thick, half_thick );
- glTexCoord2f(tex[2], tex[3]);
- glVertex3f( 1-half_thick, half_thick, half_thick );
- polys++;
- glNormal3f( -1, 0, 0 );
- glTexCoord2f(tex[0], tex[1]);
- glVertex3f( half_thick, half_thick, 1-half_thick );
- glTexCoord2f(tex[0], tex[3]);
- glVertex3f( half_thick, half_thick, half_thick );
- glTexCoord2f(tex[0], tex[3]);
- glVertex3f( half_thick, -half_thick, half_thick );
- glTexCoord2f(tex[0], tex[1]);
- glVertex3f( half_thick, -half_thick, 1-half_thick );
- polys++;
- glEnd();
-
- return polys;
+ Flipflopcreen *c = &qs[MI_SCREEN(mi)];
+ int polys = 0;
+ int wire = MI_IS_WIREFRAME(mi);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+
+ glNormal3f (0, -1, 0);
+ glTexCoord2f(tex[0], tex[3]);
+ glVertex3f (c->half_thick, -c->half_thick, c->half_thick);
+ glTexCoord2f(tex[2], tex[3]);
+ glVertex3f (1-c->half_thick, -c->half_thick, c->half_thick);
+ glTexCoord2f(tex[2], tex[1]);
+ glVertex3f (1-c->half_thick, -c->half_thick, 1-c->half_thick);
+ glTexCoord2f(tex[0], tex[1]);
+ glVertex3f (c->half_thick, -c->half_thick, 1-c->half_thick);
+ polys++;
+
+ if (wire) { glEnd(); glBegin (GL_LINE_LOOP); }
+
+ /* back */
+ glNormal3f (0, 1, 0);
+ glTexCoord2f(tex[0], tex[1]);
+ glVertex3f (c->half_thick, c->half_thick, 1-c->half_thick);
+ glTexCoord2f(tex[2], tex[1]);
+ glVertex3f (1-c->half_thick, c->half_thick, 1-c->half_thick);
+ glTexCoord2f(tex[2], tex[3]);
+ glVertex3f (1-c->half_thick, c->half_thick, c->half_thick);
+ glTexCoord2f(tex[0], tex[3]);
+ glVertex3f (c->half_thick, c->half_thick, c->half_thick);
+ polys++;
+
+ if (wire) { glEnd(); return polys; }
+
+ /* 4 edges!!! weee.... */
+ glNormal3f (0, 0, -1);
+ glTexCoord2f(tex[0], tex[3]);
+ glVertex3f (c->half_thick, c->half_thick, c->half_thick);
+ glTexCoord2f(tex[2], tex[3]);
+ glVertex3f (1-c->half_thick, c->half_thick, c->half_thick);
+ glTexCoord2f(tex[2], tex[3]);
+ glVertex3f (1-c->half_thick, -c->half_thick, c->half_thick);
+ glTexCoord2f(tex[0], tex[3]);
+ glVertex3f (c->half_thick, -c->half_thick, c->half_thick);
+ polys++;
+ glNormal3f (0, 0, 1);
+ glTexCoord2f(tex[0], tex[1]);
+ glVertex3f (c->half_thick, c->half_thick, 1-c->half_thick);
+ glTexCoord2f(tex[0], tex[1]);
+ glVertex3f (c->half_thick, -c->half_thick, 1-c->half_thick);
+ glTexCoord2f(tex[2], tex[1]);
+ glVertex3f (1-c->half_thick, -c->half_thick, 1-c->half_thick);
+ glTexCoord2f(tex[2], tex[1]);
+ glVertex3f (1-c->half_thick, c->half_thick, 1-c->half_thick);
+ polys++;
+ glNormal3f (1, 0, 0);
+ glTexCoord2f(tex[2], tex[1]);
+ glVertex3f (1-c->half_thick, c->half_thick, 1-c->half_thick);
+ glTexCoord2f(tex[2], tex[1]);
+ glVertex3f (1-c->half_thick, -c->half_thick, 1-c->half_thick);
+ glTexCoord2f(tex[2], tex[3]);
+ glVertex3f (1-c->half_thick, -c->half_thick, c->half_thick);
+ glTexCoord2f(tex[2], tex[3]);
+ glVertex3f (1-c->half_thick, c->half_thick, c->half_thick);
+ polys++;
+ glNormal3f (-1, 0, 0);
+ glTexCoord2f(tex[0], tex[1]);
+ glVertex3f (c->half_thick, c->half_thick, 1-c->half_thick);
+ glTexCoord2f(tex[0], tex[3]);
+ glVertex3f (c->half_thick, c->half_thick, c->half_thick);
+ glTexCoord2f(tex[0], tex[3]);
+ glVertex3f (c->half_thick, -c->half_thick, c->half_thick);
+ glTexCoord2f(tex[0], tex[1]);
+ glVertex3f (c->half_thick, -c->half_thick, 1-c->half_thick);
+ polys++;
+ glEnd();
+
+ return polys;
}
/* Reserve memory for the randsheet */
static void
-randsheet_create( randsheet *rs )
+randsheet_create(ModeInfo *mi, randsheet *rs)
{
- rs -> occupied = (int*) malloc(board_x_size*board_y_size * sizeof(int));
- rs -> xpos = (int*) malloc(numsquares * sizeof(int));
- rs -> ypos = (int*) malloc(numsquares * sizeof(int));
- rs -> direction = (int*) malloc(numsquares * sizeof(int));
- rs -> angle = (float*) malloc(numsquares * sizeof(float));
- rs -> color = (float*) malloc(numsquares*3 * sizeof(float));
- rs -> tex = (float*) malloc(numsquares*4 * sizeof(float));
+ Flipflopcreen *c = &qs[MI_SCREEN(mi)];
+ rs -> occupied = (int*) malloc(c->board_x_size*c->board_y_size * sizeof(int));
+ rs -> xpos = (int*) malloc(c->numsquares * sizeof(int));
+ rs -> ypos = (int*) malloc(c->numsquares * sizeof(int));
+ rs -> direction = (int*) malloc(c->numsquares * sizeof(int));
+ rs -> angle = (float*) malloc(c->numsquares * sizeof(float));
+ rs -> color = (float*) malloc(c->numsquares*3 * sizeof(float));
+ rs -> tex = (float*) malloc(c->numsquares*4 * sizeof(float));
}
/* Free reserved memory for the randsheet */
static void
-randsheet_free( randsheet *rs )
+randsheet_free (randsheet *rs)
{
- free(rs->occupied);
- free(rs->xpos);
- free(rs->ypos);
- free(rs->direction);
- free(rs->angle);
- free(rs->color);
- free(rs->tex);
+ free(rs->occupied);
+ free(rs->xpos);
+ free(rs->ypos);
+ free(rs->direction);
+ free(rs->angle);
+ free(rs->color);
+ free(rs->tex);
}
static void
-randsheet_initialize( randsheet *rs )
+randsheet_initialize(ModeInfo *mi, randsheet *rs)
{
- int i, j, index;
- index = 0;
- /* put the moving sheets on the board */
- for( i = 0; i < board_x_size; i++ )
- {
- for( j = 0; j < board_y_size; j++ )
- {
- /* initially fill up a corner with the moving squares */
- if( index < numsquares )
- {
- rs->occupied[ i * board_y_size + j ] = index;
- rs->xpos[ index ] = i;
- rs->ypos[ index ] = j;
- /* have the square colors start out as a pattern */
- rs->color[ index*3 + 0 ] = ((i+j)%3 == 0)||((i+j+1)%3 == 0);
- rs->color[ index*3 + 1 ] = ((i+j+1)%3 == 0);
- rs->color[ index*3 + 2 ] = ((i+j+2)%3 == 0);
- index++;
- }
- /* leave everything else empty*/
- else
- {
- rs->occupied[ i * board_y_size + j ] = -1;
- }
- }
- }
- /* initially everything is at rest */
- for( i=0; i<numsquares; i++ )
+ Flipflopcreen *c = &qs[MI_SCREEN(mi)];
+ int i, j, index;
+ index = 0;
+ /* put the moving sheets on the board */
+ for (i = 0; i < c->board_x_size; i++)
+ {
+ for (j = 0; j < c->board_y_size; j++)
{
- rs->direction[ i ] = 0;
- rs->angle[ i ] = 0;
+ /* initially fill up a corner with the moving squares */
+ if (index < c->numsquares)
+ {
+ rs->occupied[ i * c->board_y_size + j ] = index;
+ rs->xpos[ index ] = i;
+ rs->ypos[ index ] = j;
+ /* have the square colors start out as a pattern */
+ rs->color[ index*3 + 0 ] = ((i+j)%3 == 0)||((i+j+1)%3 == 0);
+ rs->color[ index*3 + 1 ] = ((i+j+1)%3 == 0);
+ rs->color[ index*3 + 2 ] = ((i+j+2)%3 == 0);
+ index++;
+ }
+ /* leave everything else empty*/
+ else
+ {
+ rs->occupied[ i * c->board_y_size + j ] = -1;
+ }
}
+ }
+ /* initially everything is at rest */
+ for (i=0; i<c->numsquares; i++)
+ {
+ rs->direction[ i ] = 0;
+ rs->angle[ i ] = 0;
+ }
}
/* Pick and random square and direction and try to move it. */
@@ -635,225 +643,229 @@ randsheet_initialize( randsheet *rs )
/* to avoid trying to move a square which is already moving */
/* but speed is most likely bottlenecked by rendering anyway... */
static int
-randsheet_new_move( randsheet* rs )
+randsheet_new_move(ModeInfo *mi, randsheet* rs)
{
- int i, j;
- int num, dir;
- /* pick a random square */
- num = random( ) % numsquares;
- i = rs->xpos[ num ];
- j = rs->ypos[ num ];
- /* pick a random direction */
- dir = ( random( )% 4 ) + 1;
-
- if( rs->direction[ num ] == 0 )
+ Flipflopcreen *c = &qs[MI_SCREEN(mi)];
+ int i, j;
+ int num, dir;
+ /* pick a random square */
+ num = random() % c->numsquares;
+ i = rs->xpos[ num ];
+ j = rs->ypos[ num ];
+ /* pick a random direction */
+ dir = (random()% 4) + 1;
+
+ if (rs->direction[ num ] == 0)
+ {
+ switch (dir)
{
- switch( dir )
+ case 1:
+ /* move up in x */
+ if ((i + 1) < c->board_x_size)
+ {
+ if (rs->occupied[ (i + 1) * c->board_y_size + j ] == -1)
{
- case 1:
- /* move up in x */
- if( ( i + 1 ) < board_x_size )
- {
- if( rs->occupied[ (i + 1) * board_y_size + j ] == -1 )
- {
- rs->direction[ num ] = dir;
- rs->occupied[ (i + 1) * board_y_size + j ] = num;
- rs->occupied[ i * board_y_size + j ] = -1;
- return 1;
- }
- }
- return 0;
- break;
- case 2:
- /* move up in y */
- if( ( j + 1 ) < board_y_size )
- {
- if( rs->occupied[ i * board_y_size + (j + 1) ] == -1 )
- {
- rs->direction[ num ] = dir;
- rs->occupied[ i * board_y_size + (j + 1) ] = num;
- rs->occupied[ i * board_y_size + j ] = -1;
- return 1;
- }
- }
- return 0;
- break;
- case 3:
- /* move down in x */
- if( ( i - 1 ) >= 0 )
- {
- if( rs->occupied[ (i - 1) * board_y_size + j ] == -1 )
- {
- rs->direction[ num ] = dir;
- rs->occupied[ (i - 1) * board_y_size + j ] = num;
- rs->occupied[ i * board_y_size + j ] = -1;
- return 1;
- }
- }
- return 0;
- break;
- case 4:
- /* move down in y */
- if( ( j - 1 ) >= 0 )
- {
- if( rs->occupied[ i * board_y_size + (j - 1) ] == -1 )
- {
- rs->direction[ num ] = dir;
- rs->occupied[ i * board_y_size + (j - 1) ] = num;
- rs->occupied[ i * board_y_size + j ] = -1;
- return 1;
- }
- }
- return 0;
- break;
- default:
- break;
+ rs->direction[ num ] = dir;
+ rs->occupied[ (i + 1) * c->board_y_size + j ] = num;
+ rs->occupied[ i * c->board_y_size + j ] = -1;
+ return 1;
}
+ }
+ return 0;
+ break;
+ case 2:
+ /* move up in y */
+ if ((j + 1) < c->board_y_size)
+ {
+ if (rs->occupied[ i * c->board_y_size + (j + 1) ] == -1)
+ {
+ rs->direction[ num ] = dir;
+ rs->occupied[ i * c->board_y_size + (j + 1) ] = num;
+ rs->occupied[ i * c->board_y_size + j ] = -1;
+ return 1;
+ }
+ }
+ return 0;
+ break;
+ case 3:
+ /* move down in x */
+ if ((i - 1) >= 0)
+ {
+ if (rs->occupied[ (i - 1) * c->board_y_size + j ] == -1)
+ {
+ rs->direction[ num ] = dir;
+ rs->occupied[ (i - 1) * c->board_y_size + j ] = num;
+ rs->occupied[ i * c->board_y_size + j ] = -1;
+ return 1;
+ }
+ }
+ return 0;
+ break;
+ case 4:
+ /* move down in y */
+ if ((j - 1) >= 0)
+ {
+ if (rs->occupied[ i * c->board_y_size + (j - 1) ] == -1)
+ {
+ rs->direction[ num ] = dir;
+ rs->occupied[ i * c->board_y_size + (j - 1) ] = num;
+ rs->occupied[ i * c->board_y_size + j ] = -1;
+ return 1;
+ }
+ }
+ return 0;
+ break;
+ default:
+ break;
}
- return 0;
+ }
+ return 0;
}
/* move a single frame. */
/* Pass in the angle in rads the square rotates in a frame. */
static void
-randsheet_move( randsheet *rs, float rot )
+randsheet_move(ModeInfo *mi, randsheet *rs, float rot)
{
- int index;
- float tmp;
- for( index = 0 ; index < numsquares; index++ )
+ Flipflopcreen *c = &qs[MI_SCREEN(mi)];
+ int index;
+ float tmp;
+ for (index = 0 ; index < c->numsquares; index++)
+ {
+ switch (rs->direction[ index ])
{
- switch( rs->direction[ index ] )
+ case 0:
+ /* not moving */
+ break;
+ case 1:
+ /* move up in x */
+ if (c->textured && rs->angle[ index ] == 0)
+ {
+ tmp = rs->tex[ index * 4 + 0 ];
+ rs->tex[ index * 4 + 0 ] = rs->tex[ index * 4 + 2 ];
+ rs->tex[ index * 4 + 2 ] = tmp;
+ }
+ rs->angle[ index ] += rot;
+ /* check to see if we have finished moving */
+ if (rs->angle[ index ] >= M_PI)
+ {
+ rs->xpos[ index ] += 1;
+ rs->direction[ index ] = 0;
+ rs->angle[ index ] = 0;
+ }
+ break;
+ case 2:
+ /* move up in y */
+ if (c->textured && rs->angle[ index ] == 0)
+ {
+ tmp = rs->tex[ index * 4 + 1 ];
+ rs->tex[ index * 4 + 1 ] = rs->tex[ index * 4 + 3 ];
+ rs->tex[ index * 4 + 3 ] = tmp;
+ }
+ rs->angle[ index ] += rot;
+ /* check to see if we have finished moving */
+ if (rs->angle[ index ] >= M_PI)
+ {
+ rs->ypos[ index ] += 1;
+ rs->direction[ index ] = 0;
+ rs->angle[ index ] = 0;
+ }
+ break;
+ case 3:
+ /* down in x */
+ rs->angle[ index ] += rot;
+ /* check to see if we have finished moving */
+ if (rs->angle[ index ] >= M_PI)
+ {
+ rs->xpos[ index ] -= 1;
+ rs->direction[ index ] = 0;
+ rs->angle[ index ] = 0;
+ if (c->textured)
+ {
+ tmp = rs->tex[ index * 4 + 0 ];
+ rs->tex[ index * 4 + 0 ] = rs->tex[ index * 4 + 2 ];
+ rs->tex[ index * 4 + 2 ] = tmp;
+ }
+ }
+ break;
+ case 4:
+ /* down in y */
+ rs->angle[ index ] += rot;
+ /* check to see if we have finished moving */
+ if (rs->angle[ index ] >= M_PI)
+ {
+ rs->ypos[ index ] -= 1;
+ rs->direction[ index ] = 0;
+ rs->angle[ index ] = 0;
+ if (c->textured)
{
- case 0:
- /* not moving */
- break;
- case 1:
- /* move up in x */
- if( textured && rs->angle[ index ] == 0 )
- {
- tmp = rs->tex[ index * 4 + 0 ];
- rs->tex[ index * 4 + 0 ] = rs->tex[ index * 4 + 2 ];
- rs->tex[ index * 4 + 2 ] = tmp;
- }
- rs->angle[ index ] += rot;
- /* check to see if we have finished moving */
- if( rs->angle[ index ] >= M_PI )
- {
- rs->xpos[ index ] += 1;
- rs->direction[ index ] = 0;
- rs->angle[ index ] = 0;
- }
- break;
- case 2:
- /* move up in y */
- if( textured && rs->angle[ index ] == 0 )
- {
- tmp = rs->tex[ index * 4 + 1 ];
- rs->tex[ index * 4 + 1 ] = rs->tex[ index * 4 + 3 ];
- rs->tex[ index * 4 + 3 ] = tmp;
- }
- rs->angle[ index ] += rot;
- /* check to see if we have finished moving */
- if( rs->angle[ index ] >= M_PI )
- {
- rs->ypos[ index ] += 1;
- rs->direction[ index ] = 0;
- rs->angle[ index ] = 0;
- }
- break;
- case 3:
- /* down in x */
- rs->angle[ index ] += rot;
- /* check to see if we have finished moving */
- if( rs->angle[ index ] >= M_PI )
- {
- rs->xpos[ index ] -= 1;
- rs->direction[ index ] = 0;
- rs->angle[ index ] = 0;
- if( textured )
- {
- tmp = rs->tex[ index * 4 + 0 ];
- rs->tex[ index * 4 + 0 ] = rs->tex[ index * 4 + 2 ];
- rs->tex[ index * 4 + 2 ] = tmp;
- }
- }
- break;
- case 4:
- /* down in y */
- rs->angle[ index ] += rot;
- /* check to see if we have finished moving */
- if( rs->angle[ index ] >= M_PI )
- {
- rs->ypos[ index ] -= 1;
- rs->direction[ index ] = 0;
- rs->angle[ index ] = 0;
- if( textured )
- {
- tmp = rs->tex[ index * 4 + 1 ];
- rs->tex[ index * 4 + 1 ] = rs->tex[ index * 4 + 3 ];
- rs->tex[ index * 4 + 3 ] = tmp;
- }
- }
- break;
- default:
- break;
+ tmp = rs->tex[ index * 4 + 1 ];
+ rs->tex[ index * 4 + 1 ] = rs->tex[ index * 4 + 3 ];
+ rs->tex[ index * 4 + 3 ] = tmp;
}
+ }
+ break;
+ default:
+ break;
}
+ }
}
/* draw all the moving squares */
static int
-randsheet_draw( randsheet *rs )
+randsheet_draw(ModeInfo *mi, randsheet *rs)
{
- int i, j, polys = 0;
- int index;
+ Flipflopcreen *c = &qs[MI_SCREEN(mi)];
- /* for all moving squares ... */
- for( index = 0; index < numsquares; index++ )
- {
- /* set color */
- glColor3f( rs->color[ index*3 + 0 ],
- rs->color[ index*3 + 1 ],
- rs->color[ index*3 + 2 ] );
- /* find x and y position */
- i = rs->xpos[ index ];
- j = rs->ypos[ index ];
- glPushMatrix();
- switch( rs->direction[ index ] )
- {
- case 0:
-
- /* not moving */
- /* front */
- glTranslatef( i, 0, j );
- break;
- case 1:
- glTranslatef( i+1, 0, j );
- glRotatef( 180 - rs->angle[ index ]*180/M_PI, 0, 0, 1 );
-
- break;
- case 2:
- glTranslatef( i, 0, j+1 );
- glRotatef( 180 - rs->angle[ index ]*180/M_PI, -1, 0, 0 );
-
- break;
- case 3:
- glTranslatef( i, 0, j );
- glRotatef( rs->angle[ index ]*180/M_PI, 0, 0, 1 );
- break;
- case 4:
- glTranslatef( i, 0, j );
- glRotatef( rs->angle[ index ]*180/M_PI, -1, 0, 0 );
- break;
- default:
- break;
- }
- polys += draw_sheet( rs->tex + index*4 );
- glPopMatrix();
+ int i, j, polys = 0;
+ int index;
+ /* for all moving squares ... */
+ for (index = 0; index < c->numsquares; index++)
+ {
+ /* set color */
+ glColor3f (rs->color[ index*3 + 0 ],
+ rs->color[ index*3 + 1 ],
+ rs->color[ index*3 + 2 ]);
+ /* find x and y position */
+ i = rs->xpos[ index ];
+ j = rs->ypos[ index ];
+ glPushMatrix();
+ switch (rs->direction[ index ])
+ {
+ case 0:
+
+ /* not moving */
+ /* front */
+ glTranslatef (i, 0, j);
+ break;
+ case 1:
+ glTranslatef (i+1, 0, j);
+ glRotatef (180 - rs->angle[ index ]*180/M_PI, 0, 0, 1);
+
+ break;
+ case 2:
+ glTranslatef (i, 0, j+1);
+ glRotatef (180 - rs->angle[ index ]*180/M_PI, -1, 0, 0);
+
+ break;
+ case 3:
+ glTranslatef (i, 0, j);
+ glRotatef (rs->angle[ index ]*180/M_PI, 0, 0, 1);
+ break;
+ case 4:
+ glTranslatef (i, 0, j);
+ glRotatef (rs->angle[ index ]*180/M_PI, -1, 0, 0);
+ break;
+ default:
+ break;
}
- return polys;
+ polys += draw_sheet(mi, rs->tex + index*4);
+ glPopMatrix();
+
+ }
+ return polys;
}
/**** END RANDSHEET_BAK FUNCTIONS ***/
diff --git a/hacks/glx/flipflop.man b/hacks/glx/flipflop.man
index 17691bc..ab84249 100644
--- a/hacks/glx/flipflop.man
+++ b/hacks/glx/flipflop.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-flipflop - draws a grid of 3D squares that change positions
+flipflop \- draws a grid of 3D squares that change positions
.SH SYNOPSIS
.B flipflop
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/flipscreen3d.c b/hacks/glx/flipscreen3d.c
index ce3dc76..4de26de 100644
--- a/hacks/glx/flipscreen3d.c
+++ b/hacks/glx/flipscreen3d.c
@@ -49,10 +49,6 @@ static int rotate;
#define QW 12
#define QH 12
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
-
static XrmOptionDescRec opts[] = {
{"+rotate", ".screenflip.rotate", XrmoptionNoArg, "false" },
{"-rotate", ".screenflip.rotate", XrmoptionNoArg, "true" },
diff --git a/hacks/glx/flipscreen3d.man b/hacks/glx/flipscreen3d.man
index fecd005..3edaf0b 100644
--- a/hacks/glx/flipscreen3d.man
+++ b/hacks/glx/flipscreen3d.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-flipscreen3d - rotates an image of the screen through 3 dimensions.
+flipscreen3d \- rotates an image of the screen through 3 dimensions.
.SH SYNOPSIS
.B flipscreen3d
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/fliptext.c b/hacks/glx/fliptext.c
index 030900b..84f43da 100644
--- a/hacks/glx/fliptext.c
+++ b/hacks/glx/fliptext.c
@@ -10,11 +10,7 @@
* implied warranty.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
-
-#define DEF_FONT "-*-utopia-bold-r-normal-*-*-720-*-*-*-*-*-*"
+#define DEF_FONT "sans-serif bold 72"
#define DEF_COLOR "#00CCFF"
#define DEFAULTS "*delay: 10000 \n" \
@@ -28,8 +24,6 @@
# define release_fliptext 0
# define fliptext_handle_event xlockmore_no_events
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#undef BELLRAND
#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
diff --git a/hacks/glx/fliptext.man b/hacks/glx/fliptext.man
index 8d2915e..d35a8b0 100644
--- a/hacks/glx/fliptext.man
+++ b/hacks/glx/fliptext.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "20-Mar-2005" "X Version 11"
.SH NAME
-fliptext - draws pages of text whose lines transparently flip around
+fliptext \- draws pages of text whose lines transparently flip around
.SH SYNOPSIS
.B fliptext
[\-display \fIhost:display.screen\fP] [\-window] [\-root]
@@ -42,7 +42,7 @@ This program will be run periodically, and its output will be the text
that is displayed. Default \fIxscreensaver\-text\fP.
You can configure the text printed through the "Advanced" tab of
-.BR xscreensaver\-demo (1),
+.BR xscreensaver\-settings (1),
or by editing your ~/.xscreensaver file.
.TP 8
.B \-size \fIinteger\fP
@@ -90,7 +90,7 @@ to get the name of a resource file that overrides the global resources
stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR xscreensaver (1),
-.BR xscreensaver-text (1),
+.BR xscreensaver\-text (MANSUFFIX),
.BR fortune (1),
.BR phosphor (MANSUFFIX),
.BR apple2 (MANSUFFIX),
diff --git a/hacks/glx/flurry.h b/hacks/glx/flurry.h
index b4c7787..dd66a12 100644
--- a/hacks/glx/flurry.h
+++ b/hacks/glx/flurry.h
@@ -35,33 +35,19 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef __GLCODE__
#define __GLCODE__
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
-
-#ifndef HAVE_JWXYZ
-# include <GL/gl.h>
-# include <GL/glu.h>
-# include <GL/glx.h>
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
-
-#include <stdlib.h>
-#include <math.h>
-
+#include "xlockmoreI.h"
#include "yarandom.h"
#include "rotator.h"
#include "gltrackball.h"
+#include <stdlib.h>
+#include <math.h>
+
typedef struct _global_info_t global_info_t;
typedef struct _flurry_info_t flurry_info_t;
#define sqr(X) ((X) * (X))
-#define PI 3.14159265358979323846f
+#define PI M_PI
#define DEG2RAD(X) (PI*(X)/180.0)
#define RAD2DEG(X) ((X)*180.0/PI)
#define rnd() (frand(1.0))
diff --git a/hacks/glx/flurry.man b/hacks/glx/flurry.man
index bec54d9..6d0940f 100644
--- a/hacks/glx/flurry.man
+++ b/hacks/glx/flurry.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-flurry - a colorful particle system
+flurry \- a colorful particle system
.SH SYNOPSIS
.B flurry
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/flyingtoasters.c b/hacks/glx/flyingtoasters.c
index dce20e7..d024ac9 100644
--- a/hacks/glx/flyingtoasters.c
+++ b/hacks/glx/flyingtoasters.c
@@ -33,8 +33,6 @@
/* #define DEBUG */
# define release_toasters 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#define DEF_SPEED "1.0"
#define DEF_NTOASTERS "20"
@@ -315,13 +313,12 @@ reshape_toasters (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
diff --git a/hacks/glx/flyingtoasters.man b/hacks/glx/flyingtoasters.man
index 1de96da..caef5fb 100644
--- a/hacks/glx/flyingtoasters.man
+++ b/hacks/glx/flyingtoasters.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-flyingtoasters - 3d space-age jet-powered flying toasters (and toast)
+flyingtoasters \- 3d space-age jet-powered flying toasters (and toast)
.SH SYNOPSIS
.B flyingtoasters
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/fps-gl.c b/hacks/glx/fps-gl.c
index b8cbb25..20aca19 100644
--- a/hacks/glx/fps-gl.c
+++ b/hacks/glx/fps-gl.c
@@ -10,23 +10,6 @@
* implied warranty.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
-
-#ifdef HAVE_COCOA
-# include "jwxyz.h"
-#elif defined(HAVE_ANDROID)
-# include <GLES/gl.h>
-#else /* real Xlib */
-# include <GL/glx.h>
-# include <GL/glu.h>
-#endif /* !HAVE_COCOA */
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
#include "xlockmoreI.h"
#include "fpsI.h"
#include "texfont.h"
diff --git a/hacks/glx/gears.c b/hacks/glx/gears.c
index 86e7e97..c8b2081 100644
--- a/hacks/glx/gears.c
+++ b/hacks/glx/gears.c
@@ -19,8 +19,6 @@
"*suppressRotationAnimation: True\n" \
# define release_gears 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "involute.h"
@@ -105,13 +103,12 @@ reshape_gears (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
diff --git a/hacks/glx/gears.man b/hacks/glx/gears.man
index a54a6af..5be1368 100644
--- a/hacks/glx/gears.man
+++ b/hacks/glx/gears.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-gears - draw interlocking gears, for xscreensaver.
+gears \- draw interlocking gears, for xscreensaver.
.SH SYNOPSIS
.B gears
[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
diff --git a/hacks/glx/geodesic.c b/hacks/glx/geodesic.c
index 83fd4ac..edf81c9 100644
--- a/hacks/glx/geodesic.c
+++ b/hacks/glx/geodesic.c
@@ -15,8 +15,6 @@
"*suppressRotationAnimation: True\n" \
# define release_geodesic 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "colors.h"
@@ -475,13 +473,12 @@ reshape_geodesic (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
diff --git a/hacks/glx/geodesic.man b/hacks/glx/geodesic.man
index 4a408ca..a9f5f70 100644
--- a/hacks/glx/geodesic.man
+++ b/hacks/glx/geodesic.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-geodesic - animates a mesh geodesic sphere.
+geodesic \- animates a mesh geodesic sphere.
.SH SYNOPSIS
.B geodesic
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/geodesicgears.c b/hacks/glx/geodesicgears.c
index 3911b38..146b835 100644
--- a/hacks/glx/geodesicgears.c
+++ b/hacks/glx/geodesicgears.c
@@ -18,11 +18,9 @@
"*showFPS: False \n" \
"*texFontCacheSize: 100 \n" \
"*suppressRotationAnimation: True\n" \
- "*font: -*-helvetica-medium-r-normal-*-*-160-*-*-*-*-*-*\n" \
+ "*font: sans-serif 16\n" \
# define release_geodesic 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "involute.h"
@@ -1339,13 +1337,12 @@ reshape_geodesic (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
@@ -1413,7 +1410,6 @@ ENTRYPOINT void
init_geodesic (ModeInfo *mi)
{
geodesic_configuration *bp;
- int wire = MI_IS_WIREFRAME(mi);
MI_INIT (mi, bps);
@@ -1441,15 +1437,6 @@ init_geodesic (ModeInfo *mi)
glMateriali (GL_FRONT, GL_SHININESS, shiny);
}
- if (! wire)
- {
- glEnable (GL_DEPTH_TEST);
- glEnable (GL_BLEND);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glEnable (GL_LIGHTING);
- glEnable (GL_LIGHT0);
- }
-
if (! bp->rot)
{
double spin_speed = 0.25 * speed;
@@ -1529,6 +1516,15 @@ draw_geodesic (ModeInfo *mi)
glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
+ if (! wire)
+ {
+ glEnable (GL_DEPTH_TEST);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable (GL_LIGHTING);
+ glEnable (GL_LIGHT0);
+ }
+
if (bp->draw_time == 0)
{
diff --git a/hacks/glx/geodesicgears.man b/hacks/glx/geodesicgears.man
index b15cf90..f6ca5e0 100644
--- a/hacks/glx/geodesicgears.man
+++ b/hacks/glx/geodesicgears.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-geodesicgears - gears on the surface of a sphere.
+geodesicgears \- gears on the surface of a sphere.
.SH SYNOPSIS
.B geodesicgears
[\-display \fIhost:display.screen\fP]
@@ -64,8 +64,8 @@ stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1),
-.BR geodesic (1),
-.BR pinion (1)
+.BR geodesic (MANSUFFIX),
+.BR pinion (MANSUFFIX)
.SH COPYRIGHT
Copyright \(co 2014 by Jamie Zawinski. Permission to use, copy, modify,
distribute, and sell this software and its documentation for any purpose is
diff --git a/hacks/glx/gflux.c b/hacks/glx/gflux.c
index 63c9676..0488d9f 100644
--- a/hacks/glx/gflux.c
+++ b/hacks/glx/gflux.c
@@ -54,17 +54,6 @@
#ifdef USE_GL /* whole file */
-#ifdef HAVE_XMU
-# ifndef VMS
-# include <X11/Xmu/Drawing.h>
-#else /* VMS */
-# include <Xmu/Drawing.h>
-# endif /* VMS */
-#endif
-
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#include <stdlib.h>
#include <stdio.h>
@@ -295,14 +284,12 @@ reshape_gflux(ModeInfo *mi, int width, int height)
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
- {
- GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
- }
-# endif
+ {
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
+ }
}
diff --git a/hacks/glx/gflux.man b/hacks/glx/gflux.man
index 654aeb4..da6e4d6 100644
--- a/hacks/glx/gflux.man
+++ b/hacks/glx/gflux.man
@@ -49,7 +49,7 @@ or from a random file on disk, as indicated by
the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
file; see
-.BR xscreensaver-demo (1)
+.BR xscreensaver\-settings (1)
for more details.
.TP 8
.B \-wireframe
@@ -96,8 +96,8 @@ stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1)
-.BR xscreensaver\-demo (1),
-.BR xscreensaver\-getimage (1)
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-getimage (MANSUFFIX)
.SH COPYRIGHT
Copyright \(co 2000 by Josiah Pease. Permission to use, copy, modify,
distribute, and sell this software and its documentation for any purpose is
diff --git a/hacks/glx/gibson.c b/hacks/glx/gibson.c
index 8f99040..e90d8d2 100644
--- a/hacks/glx/gibson.c
+++ b/hacks/glx/gibson.c
@@ -1,4 +1,4 @@
-/* gibson, Copyright (c) 2020 Jamie Zawinski <jwz@jwz.org>
+/* gibson, Copyright (c) 2020-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -14,7 +14,7 @@
* edge-lit etched perspex, each about four feet tall.
*/
-#define TOWER_FONT "-*-helvetica-bold-r-normal-*-*-480-*-*-*-*-*-*"
+#define TOWER_FONT "sans-serif bold 48"
#define DEFAULTS "*delay: 20000 \n" \
"*groundColor: #8A2BE2" "\n" \
@@ -26,8 +26,6 @@
"*wireframe: False \n" \
# define release_gibson 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "colors.h"
@@ -441,10 +439,6 @@ draw_tower_face_text (ModeInfo *mi, GLfloat height, Bool which)
Bool wire2 = False; /* Debugging quads */
Bool bg_p = (which == 1 && do_tex && !wire);
- glColor4fv (which ? bp->tower_color2 : bp->tower_color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE,
- which ? bp->tower_color2 : bp->tower_color);
-
/* The texture is a tex_width x tex_height rectangle, of which we
only use the rbearing+lbearing x ascent+descent sub-rectangle.
Texture coordinates reference the tex_width x tex_height rectangle
@@ -479,6 +473,10 @@ draw_tower_face_text (ModeInfo *mi, GLfloat height, Bool which)
GLfloat m3 = m2 / (which ? 1 : height);
GLfloat h2 = height * (which ? 1-margin : 1);
+ glColor4fv (which ? bp->tower_color2 : bp->tower_color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE,
+ which ? bp->tower_color2 : bp->tower_color);
+
glBindTexture (GL_TEXTURE_2D, bp->text[n].texid);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
@@ -1237,7 +1235,7 @@ draw_gibson (ModeInfo *mi)
if (do_tex)
{
glEnable (GL_TEXTURE_2D);
- enable_texture_string_parameters();
+ enable_texture_string_parameters (bp->text[0].font_data);
}
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE);
@@ -1306,7 +1304,6 @@ free_gibson (ModeInfo *mi)
if (!bp->glx_context) return;
glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
- if (bp->towers) free (bp->towers);
if (bp->rot) free_rotator (bp->rot);
if (bp->rot2) free_rotator (bp->rot2);
if (glIsList(bp->ground_dlist)) glDeleteLists(bp->ground_dlist, 1);
@@ -1316,16 +1313,17 @@ free_gibson (ModeInfo *mi)
if (bp->text[i].font_data) free_texture_font (bp->text[i].font_data);
if (bp->text[i].text) free (bp->text[i].text);
}
- for (i = 0; i < bp->ntowers; i++)
- {
- for (j = 0; j < countof(bp->towers[i].fg_dlists); j++)
- {
- if (glIsList(bp->towers[i].fg_dlists[j]))
- glDeleteLists(bp->towers[i].fg_dlists[j], 1);
- if (glIsList(bp->towers[i].bg_dlists[j]))
- glDeleteLists(bp->towers[i].bg_dlists[j], 1);
- }
- }
+ if (bp->towers)
+ for (i = 0; i < bp->ntowers; i++)
+ {
+ for (j = 0; j < countof(bp->towers[i].fg_dlists); j++)
+ {
+ if (glIsList(bp->towers[i].fg_dlists[j]))
+ glDeleteLists(bp->towers[i].fg_dlists[j], 1);
+ if (glIsList(bp->towers[i].bg_dlists[j]))
+ glDeleteLists(bp->towers[i].bg_dlists[j], 1);
+ }
+ }
}
diff --git a/hacks/glx/gibson.man b/hacks/glx/gibson.man
index a57e018..56aae6d 100644
--- a/hacks/glx/gibson.man
+++ b/hacks/glx/gibson.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-Hacking the Gibson - screen saver.
+gibson \- Hacking the Gibson screen saver.
.SH SYNOPSIS
.B gibson
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/glblur.c b/hacks/glx/glblur.c
index d1514d1..02bc447 100644
--- a/hacks/glx/glblur.c
+++ b/hacks/glx/glblur.c
@@ -28,8 +28,6 @@
"*suppressRotationAnimation: True\n" \
# define release_glblur 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#undef ABS
#define ABS(n) ((n)<0?-(n):(n))
@@ -124,13 +122,12 @@ reshape_glblur (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
diff --git a/hacks/glx/glblur.man b/hacks/glx/glblur.man
index 968f42f..96db6ed 100644
--- a/hacks/glx/glblur.man
+++ b/hacks/glx/glblur.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-glblur - 3D radial blur texture fields
+glblur \- 3D radial blur texture fields
.SH SYNOPSIS
.B glblur
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/glcells.c b/hacks/glx/glcells.c
index b8ee5b8..e46aeed 100644
--- a/hacks/glx/glcells.c
+++ b/hacks/glx/glcells.c
@@ -56,9 +56,6 @@
"*wireframe: False \n" \
"*suppressRotationAnimation: True\n" \
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#ifndef HAVE_JWZGLES /* glDrawElements unimplemented... */
# define USE_VERTEX_ARRAY
#endif
@@ -1224,9 +1221,7 @@ ENTRYPOINT void
reshape_glcells( ModeInfo *mi, int width, int height )
{
State *st = &sstate[MI_SCREEN(mi)];
-# ifdef HAVE_MOBILE
int rot = current_device_rotation();
-# endif
st->height = height;
st->width = width;
# ifdef HAVE_MOBILE
@@ -1250,9 +1245,7 @@ reshape_glcells( ModeInfo *mi, int width, int height )
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho( 0, width, height, 0, 200, 0 );
-# ifdef HAVE_MOBILE
glRotatef (rot, 0, 0, 1);
-# endif
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
if (st->food) free( st->food );
diff --git a/hacks/glx/glcells.man b/hacks/glx/glcells.man
index 6c1e7e9..56f5d07 100644
--- a/hacks/glx/glcells.man
+++ b/hacks/glx/glcells.man
@@ -55,7 +55,7 @@ Food is ditributed randomly on the screen (Yes, the cells need to eat). This par
maximum amount of food per pixel. Default is 20.
.TP 8
.B \-divideage \fInum\fP\fP
-Specifies the minimum age in frames a cell needs to have before beeing able to divide. Default is 20
+Specifies the minimum age in frames a cell needs to have before being able to divide. Default is 20
.TP 8
.B \-mindist \fInum\fP\fP
Specifies the minimum distance between cells. Default 1.4
@@ -83,7 +83,7 @@ stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1)
-.BR xscreensaver\-demo (1),
+.BR xscreensaver\-settings (1),
.SH COPYRIGHT
Copyright \(co 2007 by Matthias Toussaint. Permission to use, copy, modify,
distribute, and sell this software and its documentation for any purpose is
diff --git a/hacks/glx/gleidescope.c b/hacks/glx/gleidescope.c
index 60faf3e..b33770a 100644
--- a/hacks/glx/gleidescope.c
+++ b/hacks/glx/gleidescope.c
@@ -1325,14 +1325,12 @@ draw(ModeInfo * mi)
0.0);
#endif
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
if (gp->fade == 0)
{
diff --git a/hacks/glx/gleidescope.man b/hacks/glx/gleidescope.man
index c0b9b15..726e38f 100644
--- a/hacks/glx/gleidescope.man
+++ b/hacks/glx/gleidescope.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-gleidescope - a tiled OpenGL kaleidescope
+gleidescope \- a tiled OpenGL kaleidescope
.SH SYNOPSIS
.B gleidescope
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/glforestfire.c b/hacks/glx/glforestfire.c
index 8aa1c97..304324a 100644
--- a/hacks/glx/glforestfire.c
+++ b/hacks/glx/glforestfire.c
@@ -155,7 +155,6 @@ static Bool do_fog;
static Bool do_shadows;
static Bool do_wander;
static int num_trees;
-static XFontStruct *mode_font = None;
static XrmOptionDescRec opts[] = {
{"-texture", ".fire.texture", XrmoptionNoArg, "on"},
@@ -282,7 +281,6 @@ typedef struct {
XImage *ttexture; /* tree texture image bits */
GLuint groundid; /* ground texture id: GL world */
GLuint treeid; /* tree texture id: GL world */
- GLuint fontbase; /* fontbase id: GL world */
int num_trees; /* number of trees: set it through 'trees' resource */
treestruct *treepos; /* trees positions: float treepos[num_trees][3] */
@@ -888,12 +886,6 @@ free_fire(ModeInfo * mi)
if (!fs->glx_context) return;
glXMakeCurrent (MI_DISPLAY(mi), MI_WINDOW(mi), *fs->glx_context);
- if (mode_font != None && fs->fontbase != None) {
- glDeleteLists(fs->fontbase, mode_font->max_char_or_byte2 -
- mode_font->min_char_or_byte2 + 1);
- fs->fontbase = None;
- }
-
if (fs->p != NULL) {
free(fs->p);
fs->p = (part *) NULL;
@@ -1038,12 +1030,6 @@ ENTRYPOINT void draw_fire(ModeInfo * mi)
ENTRYPOINT void release_fire(ModeInfo * mi)
{
- if (mode_font != None)
- {
- /* only free-ed when there are no more screens used */
- XFreeFont(MI_DISPLAY(mi), mode_font);
- mode_font = None;
- }
FreeAllGL(mi);
}
diff --git a/hacks/glx/glforestfire.man b/hacks/glx/glforestfire.man
index aae3a25..a0d18c7 100644
--- a/hacks/glx/glforestfire.man
+++ b/hacks/glx/glforestfire.man
@@ -1,19 +1,6 @@
-.de EX \"Begin example
-.ne 5
-.if n .sp 1
-.if t .sp .5
-.nf
-.in +.5i
-..
-.de EE
-.fi
-.in -.5i
-.if n .sp 1
-.if t .sp .5
-..
.TH XScreenSaver 1 "03-Oct-01" "X Version 11"
.SH NAME
-glforestfire - draws a GL animation of sprinkling fire-like 3D triangles
+glforestfire \- draws a GL animation of sprinkling fire-like 3D triangles
.SH SYNOPSIS
.B glforestfire
[\-display \fIhost:display.screen\fP] [\-window] [\-root]
diff --git a/hacks/glx/glhanoi.c b/hacks/glx/glhanoi.c
index 11ac75f..b544283 100644
--- a/hacks/glx/glhanoi.c
+++ b/hacks/glx/glhanoi.c
@@ -60,9 +60,6 @@ enum {
#define MARBLE_TEXTURE_SIZE 256
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#include <math.h>
#include "xlockmore.h"
@@ -1978,14 +1975,12 @@ ENTRYPOINT void draw_glhanoi(ModeInfo * mi)
update_glhanoi(glhanoi);
updateView(glhanoi);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
if(!glhanoi->wire && glhanoi->texture) {
glEnable(GL_TEXTURE_2D);
diff --git a/hacks/glx/glhanoi.man b/hacks/glx/glhanoi.man
index 2060cde..a1e517a 100644
--- a/hacks/glx/glhanoi.man
+++ b/hacks/glx/glhanoi.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-glhanoi - OpenGL Towers of Hanoi
+glhanoi \- OpenGL Towers of Hanoi
.SH SYNOPSIS
.B glhanoi
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/glknots.c b/hacks/glx/glknots.c
index 06be339..5bcb97f 100644
--- a/hacks/glx/glknots.c
+++ b/hacks/glx/glknots.c
@@ -19,8 +19,6 @@
"*suppressRotationAnimation: True\n" \
# define release_knot 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "colors.h"
@@ -197,13 +195,12 @@ reshape_knot (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
diff --git a/hacks/glx/glknots.man b/hacks/glx/glknots.man
index c4f1d1a..8443963 100644
--- a/hacks/glx/glknots.man
+++ b/hacks/glx/glknots.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-glknots - generates some twisting 3d knot patterns
+glknots \- generates some twisting 3d knot patterns
.SH SYNOPSIS
.B glknots
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/gllist.h b/hacks/glx/gllist.h
index 1d6326a..3bb2a25 100644
--- a/hacks/glx/gllist.h
+++ b/hacks/glx/gllist.h
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1998-2014 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1998-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -12,22 +12,7 @@
#ifndef __GLLIST_H__
#define __GLLIST_H__
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
-
-#include <stdlib.h>
-
-#ifdef HAVE_COCOA
-#elif defined(HAVE_ANDROID)
-# include <GLES/gl.h>
-#else /* real X11 */
-# include <GL/gl.h>
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
+#include "xlockmoreI.h"
struct gllist
{
diff --git a/hacks/glx/glmatrix.c b/hacks/glx/glmatrix.c
index a638583..4087ec1 100644
--- a/hacks/glx/glmatrix.c
+++ b/hacks/glx/glmatrix.c
@@ -21,8 +21,6 @@
"*wireframe: False \n" \
# define release_matrix 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#undef BELLRAND
#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
diff --git a/hacks/glx/glmatrix.man b/hacks/glx/glmatrix.man
index 9290290..46116f1 100644
--- a/hacks/glx/glmatrix.man
+++ b/hacks/glx/glmatrix.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "30-Oct-99" "X Version 11"
.SH NAME
-glmatrix - simulates the title sequence effect of the movie
+glmatrix \- simulates the title sequence effect of the movie
.SH SYNOPSIS
.B glmatrix
[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
diff --git a/hacks/glx/glplanet.c b/hacks/glx/glplanet.c
index 83748cc..2cbe9d5 100644
--- a/hacks/glx/glplanet.c
+++ b/hacks/glx/glplanet.c
@@ -48,14 +48,6 @@
#include "sphere.h"
-#ifdef HAVE_XMU
-# ifndef VMS
-# include <X11/Xmu/Drawing.h>
-#else /* VMS */
-# include <Xmu/Drawing.h>
-# endif /* VMS */
-#endif
-
#define DEF_ROTATE "True"
#define DEF_ROLL "True"
#define DEF_WANDER "True"
@@ -69,9 +61,6 @@
#define BLENDED_TERMINATOR
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#undef BELLRAND
#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
diff --git a/hacks/glx/glplanet.man b/hacks/glx/glplanet.man
index f0602a8..26e9d9b 100644
--- a/hacks/glx/glplanet.man
+++ b/hacks/glx/glplanet.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-glplanet - rotating 3d texture-mapped planet.
+glplanet \- rotating 3d texture-mapped planet.
.SH SYNOPSIS
.B glplanet
[\-display \fIhost:display.screen\fP]
@@ -70,7 +70,7 @@ stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1)
-.BR dymaxionmap (1)
+.BR dymaxionmap (MANSUFFIX)
.BR ssystem (1)
.SH COPYRIGHT
Copyright \(co 2002-2018 by David Konerding and Jamie Zawinski.
diff --git a/hacks/glx/glschool.c b/hacks/glx/glschool.c
index 6ad80a9..75e40e8 100644
--- a/hacks/glx/glschool.c
+++ b/hacks/glx/glschool.c
@@ -19,9 +19,6 @@
#define release_glschool (0)
#define glschool_handle_event (xlockmore_no_events)
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#define DEF_NFISH "100"
#define DEF_FOG "False"
#define DEF_DRAWBBOX "True"
diff --git a/hacks/glx/glschool.man b/hacks/glx/glschool.man
index 8de00c4..676984b 100644
--- a/hacks/glx/glschool.man
+++ b/hacks/glx/glschool.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-glschool - a 3D schooling simulation
+glschool \- a 3D schooling simulation
.SH SYNOPSIS
.B glschool
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/glschool_alg.c b/hacks/glx/glschool_alg.c
index 32b4a5f..09b9e6f 100644
--- a/hacks/glx/glschool_alg.c
+++ b/hacks/glx/glschool_alg.c
@@ -23,7 +23,7 @@
#undef drand48
#define drand48() frand(1.0)
-#define RAD2DEG (180.0/3.1415926535)
+#define RAD2DEG (180.0 / M_PI)
static inline double
diff --git a/hacks/glx/glschool_gl.h b/hacks/glx/glschool_gl.h
index c5e2d38..1676643 100644
--- a/hacks/glx/glschool_gl.h
+++ b/hacks/glx/glschool_gl.h
@@ -1,4 +1,5 @@
-/* glschool_gl.h, Copyright (c) 2005-2006 David C. Lambert <dcl@panix.com>
+/* glschool_gl.h, Copyright (c) 2005-2006, 2021
+ * -David C. Lambert <dcl@panix.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -11,29 +12,7 @@
#ifndef __GLSCHOOL_GL_H__
#define __GLSCHOOL_GL_H__
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
-
-#ifdef HAVE_JWXYZ
-# include "jwxyz.h"
-# ifndef HAVE_JWZGLES
-# include <OpenGL/glu.h>
-# endif
-#else
-# include <X11/Xlib.h>
-# include <GL/gl.h>
-# include <GL/glu.h>
-#endif
-
-#ifdef HAVE_ANDROID
-#include <GLES/gl.h>
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
+#include "xlockmoreI.h"
#include "glschool_alg.h"
extern void glschool_initFog(void);
diff --git a/hacks/glx/glsl-utils.c b/hacks/glx/glsl-utils.c
new file mode 100644
index 0000000..e4d5d31
--- /dev/null
+++ b/hacks/glx/glsl-utils.c
@@ -0,0 +1,391 @@
+/* glsl-utils.c --- support functions for GLSL in OpenGL hacks.
+ * Copyright (c) 2020-2021 Carsten Steger <carsten@mirsanmir.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include "screenhackI.h"
+#include "glsl-utils.h"
+
+#include <math.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+#ifdef HAVE_GLSL
+
+extern const char *progname;
+
+/* Copy a 4x4 column-major matrix: c = m. */
+void glsl_CopyMatrix(GLfloat c[16], GLfloat m[16])
+{
+ int i, j;
+
+ for (j=0; j<4; j++)
+ for (i=0; i<4; i++)
+ c[GLSL__LINCOOR(i,j,4)] = m[GLSL__LINCOOR(i,j,4)];
+}
+
+
+/* Create a 4x4 column-major identity matrix. */
+void glsl_Identity(GLfloat c[16])
+{
+ int i, j;
+
+ for (j=0; j<4; j++)
+ for (i=0; i<4; i++)
+ c[GLSL__LINCOOR(i,j,4)] = (i==j);
+}
+
+
+/* Multiply two 4x4 column-major matrices: c = c*m. */
+void glsl_MultMatrix(GLfloat c[16], GLfloat m[16])
+{
+ int i, j;
+ GLfloat t[16];
+
+ /* Copy c to t. */
+ glsl_CopyMatrix(t,c);
+ /* Compute c = t*m. */
+ for (j=0; j<4; j++)
+ for (i=0; i<4; i++)
+ c[GLSL__LINCOOR(i,j,4)] =
+ (t[GLSL__LINCOOR(i,0,4)]*m[GLSL__LINCOOR(0,j,4)]+
+ t[GLSL__LINCOOR(i,1,4)]*m[GLSL__LINCOOR(1,j,4)]+
+ t[GLSL__LINCOOR(i,2,4)]*m[GLSL__LINCOOR(2,j,4)]+
+ t[GLSL__LINCOOR(i,3,4)]*m[GLSL__LINCOOR(3,j,4)]);
+}
+
+
+/* Multiply a 4x4 column-major matrix by a rotation matrix that rotates
+ around the axis (x,y,z) by the angle angle: c = c*r(angle,x,y,z). */
+void glsl_Rotate(GLfloat c[16], GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
+{
+ GLfloat l, t, ct, st, omct, n[3], r[16];
+
+ l = sqrtf(x*x+y*y+z*z);
+ n[0] = x/l;
+ n[1] = y/l;
+ n[2] = z/l;
+ t = angle*180.0f/M_PI;
+ ct = cosf(t);
+ st = sinf(t);
+ omct = 1.0f-ct;
+
+ r[GLSL__LINCOOR(0,0,4)] = n[0]*n[0]*omct+ct;
+ r[GLSL__LINCOOR(1,0,4)] = n[0]*n[1]*omct+n[2]*st;
+ r[GLSL__LINCOOR(2,0,4)] = n[0]*n[2]*omct-n[1]*st;
+ r[GLSL__LINCOOR(3,0,4)] = 0.0f;
+
+ r[GLSL__LINCOOR(0,1,4)] = n[0]*n[1]*omct-n[2]*st;
+ r[GLSL__LINCOOR(1,1,4)] = n[1]*n[1]*omct+ct;
+ r[GLSL__LINCOOR(2,1,4)] = n[1]*n[2]*omct+n[0]*st;
+ r[GLSL__LINCOOR(3,1,4)] = 0.0f;
+
+ r[GLSL__LINCOOR(0,2,4)] = n[0]*n[2]*omct+n[1]*st;
+ r[GLSL__LINCOOR(1,2,4)] = n[1]*n[2]*omct-n[0]*st;
+ r[GLSL__LINCOOR(2,2,4)] = n[2]*n[2]*omct+ct;
+ r[GLSL__LINCOOR(3,2,4)] = 0.0f;
+
+ r[GLSL__LINCOOR(0,3,4)] = 0.0f;
+ r[GLSL__LINCOOR(1,3,4)] = 0.0f;
+ r[GLSL__LINCOOR(2,3,4)] = 0.0f;
+ r[GLSL__LINCOOR(3,3,4)] = 1.0f;
+
+ glsl_MultMatrix(c,r);
+}
+
+
+/* Multiply a 4x4 column-major matrix by a matrix that stretches, shrinks,
+ or reflects an object along the axes: c = c*m(sx,sy,sz). */
+void glsl_Scale(GLfloat c[16], GLfloat sx, GLfloat sy, GLfloat sz)
+{
+ int i;
+
+ for (i=0; i<4; i++)
+ {
+ c[GLSL__LINCOOR(i,0,4)] *= sx;
+ c[GLSL__LINCOOR(i,1,4)] *= sy;
+ c[GLSL__LINCOOR(i,2,4)] *= sz;
+ }
+}
+
+
+/* Multiply a 4x4 column-major matrix by a matrix that translates an object
+ by a translation vector: c = c*t(tx,ty,tz). */
+void glsl_Translate(GLfloat c[16], GLfloat tx, GLfloat ty, GLfloat tz)
+{
+ int i;
+
+ for (i=0; i<4; i++)
+ {
+ c[GLSL__LINCOOR(i,3,4)] = (tx*c[GLSL__LINCOOR(i,0,4)]+
+ ty*c[GLSL__LINCOOR(i,1,4)]+
+ tz*c[GLSL__LINCOOR(i,2,4)]+
+ c[GLSL__LINCOOR(i,3,4)]);
+ }
+}
+
+
+/* Add a perspective projection to a 4x4 column-major matrix. */
+void glsl_Perspective(GLfloat c[16], GLfloat fovy, GLfloat aspect,
+ GLfloat z_near, GLfloat z_far)
+{
+ GLfloat m[16];
+ double s, cot, dz;
+ double rad;
+
+ rad = fovy*(0.5f*(float)M_PI/180.0f);
+ dz = z_far-z_near;
+ s = sinf(rad);
+ if (dz == 0.0f || s == 0.0f || aspect == 0.0f)
+ return;
+ cot = cosf(rad)/s;
+
+ glsl_Identity(m);
+ m[GLSL__LINCOOR(0,0,4)] = cot/aspect;
+ m[GLSL__LINCOOR(1,1,4)] = cot;
+ m[GLSL__LINCOOR(2,2,4)] = -(z_far+z_near)/dz;
+ m[GLSL__LINCOOR(3,2,4)] = -1.0f;
+ m[GLSL__LINCOOR(2,3,4)] = -2.0f*z_near*z_far/dz;
+ m[GLSL__LINCOOR(3,3,4)] = 0.0f;
+ glsl_MultMatrix(c,m);
+}
+
+
+/* Add an orthographic projection to a 4x4 column-major matrix. */
+void glsl_Orthographic(GLfloat c[16], GLfloat left, GLfloat right,
+ GLfloat bottom, GLfloat top,
+ GLfloat nearval, GLfloat farval)
+{
+ GLfloat m[16];
+
+ if (left == right || bottom == top || nearval == farval)
+ return;
+
+ glsl_Identity(m);
+ m[GLSL__LINCOOR(0,0,4)] = 2.0f/(right-left);
+ m[GLSL__LINCOOR(0,3,4)] = -(right+left)/(right-left);
+ m[GLSL__LINCOOR(1,1,4)] = 2.0f/(top-bottom);
+ m[GLSL__LINCOOR(1,3,4)] = -(top+bottom)/(top-bottom);
+ m[GLSL__LINCOOR(2,2,4)] = -2.0f/(farval-nearval);
+ m[GLSL__LINCOOR(2,3,4)] = -(farval+nearval)/(farval-nearval);
+ glsl_MultMatrix(c,m);
+}
+
+
+/* Get the OpenGL and GLSL versions. */
+GLboolean glsl_GetGlAndGlslVersions(GLint *gl_major, GLint *gl_minor,
+ GLint *glsl_major, GLint *glsl_minor,
+ GLboolean *gl_gles3)
+{
+ const char *gl_version, *glsl_version;
+ int n;
+ const char *err = 0;
+
+ *gl_major = -1;
+ *gl_minor = -1;
+ *glsl_major = 1;
+ *glsl_minor = -1;
+ *gl_gles3 = GL_FALSE;
+ gl_version = (const char *)glGetString(GL_VERSION);
+ glsl_version = (const char *)glGetString(GL_SHADING_LANGUAGE_VERSION);
+ if (gl_version == NULL || glsl_version == NULL)
+ {
+ err = "GL version unknown";
+ goto DONE;
+ }
+ if (!strncmp(gl_version,"OpenGL ES",9))
+ {
+ if (!strncmp(glsl_version,"OpenGL ES GLSL ES",17))
+ *gl_gles3 = GL_TRUE;
+ else
+ {
+ err = "GLSL not supported";
+ goto DONE;
+ }
+ }
+ if (*gl_gles3)
+ n = sscanf(&gl_version[9],"%d.%d",gl_major,gl_minor);
+ else
+ n = sscanf(gl_version,"%d.%d",gl_major,gl_minor);
+ if (n != 2)
+ {
+ err = "GL version number unparsable";
+ goto DONE;
+ }
+ if (*gl_gles3)
+ n = sscanf(&glsl_version[17],"%d.%d",glsl_major,glsl_minor);
+ else
+ n = sscanf(glsl_version,"%d.%d",glsl_major,glsl_minor);
+ if (n != 2)
+ {
+ err = "GLSL version number unparsable";
+ goto DONE;
+ }
+
+ DONE:
+
+#if 0/*# ifndef __OPTIMIZE__*/
+ if (err)
+ fprintf (stderr, "%s: GLSL: %s\n", progname, err);
+ else
+ fprintf (stderr, "%s: GLSL available: GL=%d.%d, GLSL=%d.%d GLES3=%d\n",
+ progname,
+ *gl_major, *gl_minor,
+ *glsl_major, *glsl_minor,
+ *gl_gles3 ? 1 : 0);
+# endif
+
+ return (err ? GL_FALSE : GL_TRUE);
+}
+
+
+#define PRINT_ERRORS
+/* #undef PRINT_ERRORS */
+
+#ifdef PRINT_ERRORS
+
+#define PRINT_COMPILE_ERROR(shader) print_compile_error(shader)
+#define PRINT_LINK_ERROR(program) print_link_error(program)
+
+static void print_compile_error(GLuint shader)
+{
+ GLint length_log;
+ GLsizei length;
+ GLchar *log;
+
+ glGetShaderiv(shader,GL_INFO_LOG_LENGTH,&length_log);
+ if (length_log > 0)
+ {
+ log = malloc(length_log*sizeof(*log));
+ if (log != NULL)
+ {
+ glGetShaderInfoLog(shader,length_log,&length,log);
+ fprintf(stderr,"%s: %s",progname,log);
+ }
+ free(log);
+ }
+}
+
+
+static void print_link_error(GLuint program)
+{
+ GLint length_log;
+ GLsizei length;
+ GLchar *log;
+
+ glGetProgramiv(program,GL_INFO_LOG_LENGTH,&length_log);
+ if (length_log > 0)
+ {
+ log = malloc(length_log*sizeof(*log));
+ if (log != NULL)
+ {
+ glGetProgramInfoLog(program,length_log,&length,log);
+ fprintf(stderr,"%s: %s",progname,log);
+ }
+ free(log);
+ }
+}
+
+#else
+
+#define PRINT_COMPILE_ERROR(shader)
+#define PRINT_LINK_ERROR(program)
+
+#endif
+
+
+/* Compile and link a vertex and a Fragment shader into a GLSL program. */
+GLboolean glsl_CompileAndLinkShaders(GLsizei vertex_shader_count,
+ const GLchar **vertex_shader_source,
+ GLsizei fragment_shader_count,
+ const GLchar **fragment_shader_source,
+ GLuint *shader_program)
+{
+ GLuint vertex_shader, fragment_shader;
+ GLint status;
+ const char *err = 0;
+
+ /* Create and compile the vertex shader. */
+ vertex_shader = glCreateShader(GL_VERTEX_SHADER);
+ if (vertex_shader == 0)
+ return GL_FALSE;
+ fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
+ if (fragment_shader == 0)
+ {
+ glDeleteShader(vertex_shader);
+ err = "unable to create fragment shader";
+ goto DONE;
+ }
+ glShaderSource(vertex_shader,vertex_shader_count,vertex_shader_source,
+ NULL);
+ glShaderSource(fragment_shader,fragment_shader_count,fragment_shader_source,
+ NULL);
+ glCompileShader(vertex_shader);
+ glGetShaderiv(vertex_shader,GL_COMPILE_STATUS,&status);
+ if (status == GL_FALSE)
+ {
+ PRINT_COMPILE_ERROR(vertex_shader);
+ glDeleteShader(vertex_shader);
+ glDeleteShader(fragment_shader);
+ err = "vertex shader compilation failed";
+ goto DONE;
+ }
+ glCompileShader(fragment_shader);
+ glGetShaderiv(fragment_shader,GL_COMPILE_STATUS,&status);
+ if (status == GL_FALSE)
+ {
+ PRINT_COMPILE_ERROR(fragment_shader);
+ glDeleteShader(vertex_shader);
+ glDeleteShader(fragment_shader);
+ err = "fragment shader compilation failed";
+ goto DONE;
+ }
+ *shader_program = glCreateProgram();
+ if (*shader_program == 0)
+ {
+ glDeleteShader(vertex_shader);
+ glDeleteShader(fragment_shader);
+ err = "shader creation failed";
+ goto DONE;
+ }
+ glAttachShader(*shader_program,vertex_shader);
+ glAttachShader(*shader_program,fragment_shader);
+ glLinkProgram(*shader_program);
+ glGetProgramiv(*shader_program,GL_LINK_STATUS,&status);
+ if (status == GL_FALSE)
+ {
+ PRINT_LINK_ERROR(*shader_program);
+ glDeleteProgram(*shader_program);
+ glDeleteShader(vertex_shader);
+ glDeleteShader(fragment_shader);
+ err = "shader attachment failed";
+ goto DONE;
+ }
+ /* Once the shader program has compiled successfully, we can delete the
+ vertex and fragment shaders. */
+ glDeleteShader(vertex_shader);
+ glDeleteShader(fragment_shader);
+
+ DONE:
+ if (err)
+ fprintf (stderr, "%s: GLSL: %s\n", progname, err);
+#if 0/*# ifndef __OPTIMIZE__*/
+ else
+ fprintf (stderr, "%s: GLSL: shaders initialized\n", progname);
+# endif
+
+ return (err ? GL_FALSE : GL_TRUE);
+}
+
+
+#endif /* HAVE_GLSL */
diff --git a/hacks/glx/glsl-utils.h b/hacks/glx/glsl-utils.h
new file mode 100644
index 0000000..20edc9d
--- /dev/null
+++ b/hacks/glx/glsl-utils.h
@@ -0,0 +1,73 @@
+/* glsl-utils.h --- support functions for GLSL in OpenGL hacks.
+ * Copyright (c) 2020-2021 Carsten Steger <carsten@mirsanmir.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+
+#ifndef __GLSL_UTILS_H__
+#define __GLSL_UTILS_H__
+
+#ifdef HAVE_GLSL
+
+
+/* Column-major linearized matrix coordinate */
+#define GLSL__LINCOOR(r,c,h) ((c)*(h)+(r))
+
+
+/* Copy a 4x4 column-major matrix: c = m. */
+extern void glsl_CopyMatrix(GLfloat c[16], GLfloat m[16]);
+
+/* Create a 4x4 column-major identity matrix. */
+extern void glsl_Identity(GLfloat c[16]);
+
+/* Multiply two 4x4 column-major matrices: c = c*m. */
+extern void glsl_MultMatrix(GLfloat c[16], GLfloat m[16]);
+
+/* Multiply a 4x4 column-major matrix by a rotation matrix that rotates
+ around the axis (x,y,z) by the angle angle: c = c*r(angle,x,y,z). */
+extern void glsl_Rotate(GLfloat c[16], GLfloat angle, GLfloat x, GLfloat y,
+ GLfloat z);
+
+/* Multiply a 4x4 column-major matrix by a matrix that stretches, shrinks,
+ or reflects an object along the axes: c = c*s(sx,sy,sz). */
+extern void glsl_Scale(GLfloat c[16], GLfloat sx, GLfloat sy, GLfloat sz);
+
+/* Multiply a 4x4 column-major matrix by a matrix that translates an object
+ by a translation vector: c = c*t(tx,ty,tz). */
+extern void glsl_Translate(GLfloat c[16], GLfloat tx, GLfloat ty, GLfloat tz);
+
+/* Add a perspective projection to a 4x4 column-major matrix. */
+extern void glsl_Perspective(GLfloat c[16], GLfloat fovy, GLfloat aspect,
+ GLfloat z_near, GLfloat z_far);
+
+/* Add an orthographic projection to a 4x4 column-major matrix. */
+extern void glsl_Orthographic(GLfloat c[16], GLfloat left, GLfloat right,
+ GLfloat bottom, GLfloat top,
+ GLfloat nearval, GLfloat farval);
+
+/* Get the OpenGL and GLSL versions. */
+extern GLboolean glsl_GetGlAndGlslVersions(GLint *gl_major,
+ GLint *gl_minor,
+ GLint *glsl_major,
+ GLint *glsl_minor,
+ GLboolean *gl_gles3);
+
+/* Compile and link a vertex and a Fragment shader into a GLSL program. */
+extern GLboolean glsl_CompileAndLinkShaders(GLsizei vertex_shader_count,
+ const GLchar **vertex_shader_source,
+ GLsizei fragment_shader_count,
+ const GLchar **fragment_shader_source,
+ GLuint *shader_program);
+
+
+#endif /* HAVE_GLSL */
+
+
+#endif /* __GLSL_UTILS_H__ */
diff --git a/hacks/glx/glslideshow.c b/hacks/glx/glslideshow.c
index 0edc1eb..88055e3 100644
--- a/hacks/glx/glslideshow.c
+++ b/hacks/glx/glslideshow.c
@@ -1,10 +1,11 @@
-/* glslideshow, Copyright (c) 2003-2014 Jamie Zawinski <jwz@jwz.org>
+/* glslideshow, Copyright (c) 2003-2020 Jamie Zawinski <jwz@jwz.org>
* Loads a sequence of images and smoothly pans around them; crossfades
* when loading new images.
*
* Originally written by Mike Oliphant <oliphant@gtk.org> (c) 2002, 2003.
* Rewritten by jwz, 21-Jun-2003.
* Rewritten by jwz again, 6-Feb-2005.
+ * Modified by Richard Weeks <rtweeks21@gmail.com> Copyright (c) 2020
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -16,14 +17,6 @@
*
*****************************************************************************
*
- * TODO:
- *
- * - When a new image is loaded, there is a glitch: animation pauses during
- * the period when we're loading the image-to-fade-in. On fast (2GHz)
- * machines, this stutter is short but noticable (usually around 1/10th
- * second.) On slower machines, it can be much more pronounced.
- * This turns out to be hard to fix...
- *
* Image loading happens in three stages:
*
* 1: Fork a process and run xscreensaver-getimage in the background.
@@ -34,14 +27,11 @@
* (or XShmGetImage.)
*
* 3: Once we have the bits, we must convert them from server-native bitmap
- * layout to 32 bit RGBA in client-endianness, to make them usable as
- * OpenGL textures.
+ * layout to 32 bit RGBA in client-endianness, and copy that into an
+ * OpenGL texture.
*
- * 4: We must actually construct a texture.
- *
- * So, the speed of step 1 doesn't really matter, since that happens in
- * the background. But steps 2, 3, and 4 happen in *this* process, and
- * cause the visible glitch.
+ * The speed of step 1 doesn't really matter, since that happens in the
+ * background. Steps 2 and 3 happen in *this* process.
*
* Step 2 can't be moved to another process without opening a second
* connection to the X server, which is pretty heavy-weight. (That would
@@ -49,23 +39,13 @@
* retrieve the pixmap, and feed it back to us through a pipe or
* something.)
*
- * Step 3 might be able to be optimized by coding tuned versions of
- * grab-ximage.c:copy_ximage() for the most common depths and bit orders.
- * (Or by moving it into the other process along with step 2.)
- *
- * Step 4 is the hard one, though. It might be possible to speed up this
- * step if there is some way to allow two GL processes share texture
- * data. Unless, of course, all the time being consumed by step 4 is
- * because the graphics pipeline is flooded, in which case, that other
- * process would starve the screen anyway.
+ * Step 3 is carried out over the course of several animation frames. The
+ * bits are processed in "stripes" small enough to complete within a single
+ * frame. Each stripe is first converted to a client-endian, 32 bit RGBA
+ * XImage, then copied into the partially completed OpenGL texture.
*
- * Is it possible to use a single GLX context in a multithreaded way?
- * Or use a second GLX context, but allow the two contexts to share data?
- * I can't find any documentation about this.
- *
- * How does Apple do this with their MacOSX slideshow screen saver?
- * Perhaps it's easier for them because their OpenGL libraries have
- * thread support at a lower level?
+ * This entire process is accomplished via a texture loader created with
+ * alloc_texture_loader.
*/
#define DEFAULTS "*delay: 20000 \n" \
@@ -73,7 +53,7 @@
"*showFPS: False \n" \
"*fpsSolid: True \n" \
"*useSHM: True \n" \
- "*titleFont: -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n" \
+ "*titleFont: sans-serif 18\n" \
"*desktopGrabber: xscreensaver-getimage -no-desktop %s\n" \
"*grabDesktopImages: False \n" \
"*chooseRandomImages: True \n"
@@ -81,9 +61,6 @@
# define release_slideshow 0
# include "xlockmore.h"
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#ifdef USE_GL
@@ -116,6 +93,7 @@ typedef struct {
on screen */
GLuint texid; /* which texture contains the image */
int refcount; /* how many sprites refer to this image */
+ texture_loader_t *loader; /* asynchronous image loader */
} image;
@@ -298,6 +276,44 @@ alloc_image (ModeInfo *mi)
}
+/* Allocate an image structure and start asynchronous file loading in the
+ background.
+
+ The texture_loader_t referenced by *result->loader must be stepped with
+ step_texture_loader() until it calls back to the callback function passed
+ to it.
+ */
+static image *
+alloc_image_incremental (ModeInfo *mi)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ image *img = (image *) calloc (1, sizeof (*img));
+
+ img->id = ++ss->image_id;
+ img->loaded_p = False;
+ img->used_p = False;
+ img->mi = mi;
+
+ glGenTextures (1, &img->texid);
+ if (img->texid <= 0) abort();
+
+ ss->image_load_time = ss->now;
+
+ if (wire)
+ image_loaded_cb (0, 0, 0, 0, 0, 0, img);
+ else
+ img->loader = alloc_texture_loader (mi->xgwa.screen, mi->window,
+ *ss->glx_context, 0, 0, mipmap_p,
+ img->texid);
+
+ ss->images[ss->nimages++] = img;
+ if (ss->nimages >= countof(ss->images)) abort();
+
+ return img;
+}
+
+
/* Callback that tells us that the texture has been loaded.
*/
static void
@@ -321,6 +337,13 @@ image_loaded_cb (const char *filename, XRectangle *geom,
goto DONE;
}
+ if (img->loader)
+ {
+ texture_loader_t *loader = img->loader;
+ img->loader = 0;
+ free_texture_loader(loader);
+ }
+
if (image_width == 0 || image_height == 0)
exit (1);
@@ -361,11 +384,10 @@ image_loaded_cb (const char *filename, XRectangle *geom,
*/
if (img->title && img->title[0] == '/')
{
- /* strip filename to part between last "/" and last ".". */
+ /* strip filename to part between last "/" and end. */
+ /* xscreensaver-getimage has already stripped off the extension. */
char *s = strrchr (img->title, '/');
if (s) strcpy (img->title, s+1);
- s = strrchr (img->title, '.');
- if (s) *s = 0;
}
if (debug_p)
@@ -457,7 +479,7 @@ get_image (ModeInfo *mi)
/* Make sure that there is always one unused image in the pipe.
*/
if (!new_img && !loading_img)
- alloc_image (mi);
+ alloc_image_incremental (mi);
return img;
}
@@ -1128,6 +1150,10 @@ init_slideshow (ModeInfo *mi)
}
+static void
+slideshow_idle (ModeInfo *mi);
+
+
ENTRYPOINT void
draw_slideshow (ModeInfo *mi)
{
@@ -1204,7 +1230,10 @@ draw_slideshow (ModeInfo *mi)
frame buffers. Note that this means that the FPS display will be
wrong: "Load" will be frozen on whatever it last was, when in
reality it will be close to 0. */
- return;
+ {
+ slideshow_idle (mi);
+ return;
+ }
if (debug_p && ss->now - ss->prev_frame_time > 1)
fprintf (stderr, "%s: static screen for %.1f secs\n",
@@ -1218,6 +1247,9 @@ draw_slideshow (ModeInfo *mi)
glXSwapBuffers (MI_DISPLAY (mi), MI_WINDOW(mi));
ss->prev_frame_time = ss->now;
ss->redisplay_needed_p = False;
+
+ slideshow_idle (mi);
+
check_fps (mi);
}
@@ -1249,6 +1281,28 @@ free_slideshow (ModeInfo *mi)
# endif
}
+
+static void
+slideshow_idle (ModeInfo *mi)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+ double end_by_time = ss->now + ((double) mi->pause) / 2000000;
+ int i;
+
+ for (i = 0; i < ss->nimages; i++)
+ {
+ image *img = ss->images[i];
+ if (img->loader)
+ {
+ if (texture_loader_failed (img->loader))
+ abort();
+ step_texture_loader (img->loader, end_by_time - double_time(),
+ image_loaded_cb, img);
+ break; /* only do the first one! */
+ }
+ }
+}
+
XSCREENSAVER_MODULE_2 ("GLSlideshow", glslideshow, slideshow)
#endif /* USE_GL */
diff --git a/hacks/glx/glslideshow.man b/hacks/glx/glslideshow.man
index 4ce4672..98f2b9f 100644
--- a/hacks/glx/glslideshow.man
+++ b/hacks/glx/glslideshow.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-glslideshow - slideshow of images using smooth zooming and fades
+glslideshow \- slideshow of images using smooth zooming and fades
.SH SYNOPSIS
.B glslideshow
[\-display \fIhost:display.screen\fP]
@@ -26,7 +26,7 @@ This program requires a good video card capable of supporting large
textures.
To specify the directory that images are loaded from, run
-.BR xscreensaver-demo (1)
+.BR xscreensaver\-settings (1)
and click on the "Advanced" tab.
.SH OPTIONS
.TP 8
@@ -110,8 +110,8 @@ to get the name of a resource file that overrides the global resources
stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
-.BR xscreensaver-demo (1),
-.BR xscreensaver-getimage (1),
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-getimage (MANSUFFIX),
.BR xscreensaver (1),
.BR carousel (MANSUFFIX)
.BR photopile (MANSUFFIX)
diff --git a/hacks/glx/glsnake.c b/hacks/glx/glsnake.c
index 8efc681..d7e133e 100644
--- a/hacks/glx/glsnake.c
+++ b/hacks/glx/glsnake.c
@@ -19,33 +19,16 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
/* HAVE_GLUT defined if we're building a standalone glsnake,
* and not defined if we're building as an xscreensaver hack */
#ifdef HAVE_GLUT
# include <GL/glut.h>
#else
-# ifdef HAVE_JWXYZ
+# include "xlockmoreI.h"
+# ifndef HAVE_GETTIMEOFDAY
# define HAVE_GETTIMEOFDAY
-# else
-# include <GL/gl.h>
-# include <GL/glu.h>
# endif
#endif
-# ifdef HAVE_ANDROID
-# include <GLES/gl.h>
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
-#ifdef STANDALONE
-# include "xlockmoreI.h"
-#endif
#include <stdio.h>
#include <stddef.h>
@@ -151,13 +134,10 @@ static GLfloat angvel;
#define DEFAULTS "*delay: 30000 \n" \
"*count: 30 \n" \
"*showFPS: False \n" \
- "*suppressRotationAnimation: True\n" \
- "*labelfont: -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n" \
+ "*suppressRotationAnimation: True\n" \
+ "*labelfont: sans-serif 18\n" \
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#include "xlockmore.h"
#include "texfont.h"
@@ -2269,14 +2249,12 @@ ENTRYPOINT void glsnake_display(
glRotatef(yspin, 0.0, 1.0, 0.0);
glRotatef(zspin, 0.0, 0.0, 1.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
/* now draw each node along the snake -- this is quite ugly :p */
mi->polygon_count = 0;
diff --git a/hacks/glx/glsnake.man b/hacks/glx/glsnake.man
index 217be2f..063a751 100644
--- a/hacks/glx/glsnake.man
+++ b/hacks/glx/glsnake.man
@@ -1,4 +1,3 @@
-.\" Hey, EMACS: -*- nroff -*-
.TH XScreenSaver 1 "January 15, 2001" "X Version 11"
.SH NAME
glsnake \- OpenGL enhanced Rubik's Snake cyclewaster.
@@ -66,24 +65,21 @@ to get the default host and display number.
.B XENVIRONMENT
to get the name of a resource file that overrides the global resources
stored in the RESOURCE_MANAGER property.
-.SH FILES
-.TP
-\fB/usr/share/glsnake/*.glsnake\fP
-This XScreenSaver will attempt to read model files installed with the interactive \fBglsnake\fP.
.SH SEE ALSO
.BR X (1),
-.BR xscreensaver (1),
-.BR glsnake (MANSUFFIX)
+.BR xscreensaver (1)
.PP
-.EX
-http://spacepants.org/src/glsnake/
-.EE
+.nf
+.sp
+ https://spacepants.org/src/glsnake/
+.sp
+.fi
.SH BUGS
The snake will happily intersect itself while morphing (this is not a bug).
.PP
The rotation/camera position sucks.
.SH COPYRIGHT
-Copyright \(co 2001,2002 by Jamie Wilkinson, Andrew Bennetts, and Peter Aylett.
+Copyright \(co 2001, 2002 by Jamie Wilkinson, Andrew Bennetts, and Peter Aylett.
.PP
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
diff --git a/hacks/glx/gltext.c b/hacks/glx/gltext.c
index ab5a512..07fd49e 100644
--- a/hacks/glx/gltext.c
+++ b/hacks/glx/gltext.c
@@ -1,4 +1,4 @@
-/* gltext, Copyright (c) 2001-2017 Jamie Zawinski <jwz@jwz.orgq2
+/* gltext, Copyright (c) 2001-2021 Jamie Zawinski <jwz@jwz.orgq2
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -24,9 +24,6 @@
#endif
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#include "xlockmore.h"
#include "colors.h"
#include "tube.h"
@@ -41,7 +38,7 @@
#ifdef USE_GL /* whole file */
#define DEF_TEXT "(default)"
-#define DEF_PROGRAM "(default)"
+#define DEF_PROGRAM "xscreensaver-text --date --cols 20 --lines 3"
#define DEF_SCALE_FACTOR "0.01"
#define DEF_WANDER_SPEED "0.02"
#define DEF_MAX_LINES "8"
@@ -50,10 +47,6 @@
#define DEF_FACE_FRONT "True"
#define DEF_USE_MONOSPACE "False"
-#ifdef HAVE_UNAME
-# include <sys/utsname.h>
-#endif /* HAVE_UNAME */
-
#include "glutstroke.h"
#include "glut_roman.h"
#include "glut_mroman.h"
@@ -113,6 +106,7 @@ static XrmOptionDescRec opts[] = {
static argtype vars[] = {
{&text_fmt, "text", "Text", DEF_TEXT, t_String},
+ /* This happens to be what utils/textclient.c reads */
{&program_str, "program", "Program", DEF_PROGRAM, t_String},
{&do_spin, "spin", "Spin", DEF_SPIN, t_String},
{&scale_factor, "scaleFactor", "ScaleFactor", DEF_SCALE_FACTOR, t_Float},
@@ -152,13 +146,12 @@ reshape_text (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
@@ -193,7 +186,36 @@ parse_text (ModeInfo *mi)
text_configuration *tp = &tps[MI_SCREEN(mi)];
char *old = tp->text;
- if (program_str && *program_str && !!strcmp(program_str, "(default)"))
+ const char *tt =
+ (text_fmt && *text_fmt && !!strcmp(text_fmt, "(default)")
+ ? text_fmt : 0);
+ const char *pr =
+ (program_str && *program_str && !!strcmp(program_str, "(default)")
+ ? program_str : 0);
+
+ /* We used to do some "#ifdef HAVE_UNAME" stuff in here, but
+ "xscreensaver-text --date" does a much better job of that
+ by reading random files from /etc/ and such.
+ */
+
+ if (tt && !strchr (tt, '%')) /* Static text with no formatting */
+ {
+ tp->text = strdup (tt);
+ tp->reload = 0;
+ }
+ else if (tt) /* Format string */
+ {
+ time_t now = time ((time_t *) 0);
+ struct tm *tm = localtime (&now);
+ int L = strlen(text_fmt) + 100;
+ tp->text = (char *) malloc (L);
+ *tp->text = 0;
+ strftime (tp->text, L-1, text_fmt, tm);
+ if (!*tp->text)
+ sprintf (tp->text, "strftime error:\n%s", text_fmt);
+ tp->reload = 1; /* Clock ticks every second */
+ }
+ else if (pr)
{
int max_lines = max_no_lines;
char buf[4096];
@@ -201,6 +223,7 @@ parse_text (ModeInfo *mi)
int lines = 0;
if (! tp->tc)
+ /* This runs 'pr' because it reads the same "program" resource. */
tp->tc = textclient_open (mi->dpy);
while (p < buf + sizeof(buf) - 1 &&
@@ -220,94 +243,19 @@ parse_text (ModeInfo *mi)
tp->text = strdup (buf);
- tp->reload = 7; /* Let this one linger for a few seconds */
if (!*tp->text)
- tp->reload = 1;
-
- }
- else if (!text_fmt || !*text_fmt || !strcmp(text_fmt, "(default)"))
- {
-# ifdef HAVE_UNAME
- struct utsname uts;
-
- if (uname (&uts) < 0)
+ tp->reload = 1; /* No output, try again right away */
+ else if (!strncmp (pr, "xscreensaver-text --date", 24))
{
- tp->text = strdup("uname() failed");
+ /* If it's the default, and we have results, there's no need
+ to ever reload. */
+ tp->reload = 0;
}
else
- {
- char *s;
- if ((s = strchr(uts.nodename, '.')))
- *s = 0;
- tp->text = (char *) malloc(strlen(uts.nodename) +
- strlen(uts.sysname) +
- strlen(uts.version) +
- strlen(uts.release) + 10);
-# if defined(_AIX)
- sprintf(tp->text, "%s\n%s %s.%s",
- uts.nodename, uts.sysname, uts.version, uts.release);
-# elif defined(USE_IPHONE)
- /* "My iPhone\n iPhone4,1\n Darwin 11.0.0" */
- sprintf(tp->text, "%s\n%s\n%s %s",
- uts.nodename, uts.machine, uts.sysname, uts.release);
-# elif defined(__APPLE__) /* MacOS X + XDarwin */
- {
- const char *file =
- "/System/Library/CoreServices/SystemVersion.plist";
- FILE *f = fopen (file, "r");
- char *pbv = 0, *pn = 0, *puvv = 0;
- if (f) {
- char *s, buf[255];
-
- while (fgets (buf, sizeof(buf)-1, f)) {
-# define GRAB(S,V) \
- if (strstr(buf, S)) { \
- fgets (buf, sizeof(buf)-1, f); \
- if ((s = strchr (buf, '>'))) V = strdup(s+1); \
- if ((s = strchr (V, '<'))) *s = 0; \
- }
- GRAB ("ProductName", pn)
- GRAB ("ProductBuildVersion", pbv)
- GRAB ("ProductUserVisibleVersion", puvv)
-# undef GRAB
- }
- }
- if (pbv)
- sprintf (tp->text, "%s\n%s\n%s\n%s",
- uts.nodename, pn, puvv, uts.machine);
- else
- sprintf(tp->text, "%s\n%s %s\n%s",
- uts.nodename, uts.sysname, uts.release, uts.machine);
- }
-# else
- sprintf(tp->text, "%s\n%s %s",
- uts.nodename, uts.sysname, uts.release);
-# endif /* special system types */
- }
-# else /* !HAVE_UNAME */
-# ifdef VMS
- tp->text = strdup(getenv("SYS$NODE"));
-# else
- tp->text = strdup("* *\n* * *\nxscreensaver\n* * *\n* *");
-# endif
-# endif /* !HAVE_UNAME */
- }
- else if (!strchr (text_fmt, '%'))
- {
- tp->text = strdup (text_fmt);
+ tp->reload = 7; /* Linger a bit */
}
else
- {
- time_t now = time ((time_t *) 0);
- struct tm *tm = localtime (&now);
- int L = strlen(text_fmt) + 100;
- tp->text = (char *) malloc (L);
- *tp->text = 0;
- strftime (tp->text, L-1, text_fmt, tm);
- if (!*tp->text)
- sprintf (tp->text, "strftime error:\n%s", text_fmt);
- tp->reload = 1;
- }
+ abort();
{
/* The GLUT font only has ASCII characters. */
diff --git a/hacks/glx/gltext.man b/hacks/glx/gltext.man
index 0d30c5f..9d3f462 100644
--- a/hacks/glx/gltext.man
+++ b/hacks/glx/gltext.man
@@ -1,19 +1,6 @@
-.de EX \"Begin example
-.ne 5
-.if n .sp 1
-.if t .sp .5
-.nf
-.in +.5i
-..
-.de EE
-.fi
-.in -.5i
-.if n .sp 1
-.if t .sp .5
-..
.TH XScreenSaver 1 "25-Jul-98" "X Version 11"
.SH NAME
-gltext - draws text spinning around in 3D
+gltext \- draws text spinning around in 3D
.SH SYNOPSIS
.B gltext
[\-display \fIhost:display.screen\fP] [\-window] [\-root]
@@ -56,9 +43,11 @@ and
.BR strftime (3) ,
in which case, it will be updated once a second. So to make this
program display a spinning digital clock, you could do this:
-.EX
-gltext -text "%A%n%d %b %Y%n%l:%M:%S %p"
-.EE
+.nf
+.sp
+ gltext -text "%A%n%d %b %Y%n%l:%M:%S %p"
+.sp
+.fi
To include a literal `%', you must double it: `%%'.
See the man page for
@@ -71,9 +60,11 @@ If specified, this overrides \fI\-text\fP.
The output of this program will be repeatedely displayed, with new
pages of text shifting in every few seconds. Lines should be relatively
short. You might try:
-.EX
--program 'xscreensaver-text --cols 20'
-.EE
+.nf
+.sp
+ -program 'xscreensaver-text --cols 20'
+.sp
+.fi
.TP 8
.B \-maxlines
Set the number of lines of text to display. By default,
@@ -138,7 +129,7 @@ stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1)
-.BR xscreensaver-text (1)
+.BR xscreensaver\-text (MANSUFFIX)
.SH COPYRIGHT
Copyright \(co 2001-2014 by Jamie Zawinski.
Permission to use, copy, modify, distribute, and sell this software and
diff --git a/hacks/glx/gltrackball.c b/hacks/glx/gltrackball.c
index 9e3314c..7a46f06 100644
--- a/hacks/glx/gltrackball.c
+++ b/hacks/glx/gltrackball.c
@@ -10,29 +10,12 @@
* implied warranty.
*/
+#include "screenhackI.h"
+
#include <math.h>
#include <stdlib.h>
#include <string.h>
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#ifdef HAVE_COCOA
-# include "jwxyz.h"
-#elif defined(HAVE_ANDROID)
-# include "jwxyz.h"
-# include <GLES/gl.h>
-#else /* real X11 */
-# include <X11/X.h>
-# include <X11/Xlib.h>
-# include <GL/gl.h>
-#endif /* !HAVE_COCOA */
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
# define Button4 4 /* WTF */
# define Button5 5
# define Button6 6
@@ -41,7 +24,7 @@
#include "trackball.h"
#include "gltrackball.h"
-#if defined(USE_IPHONE) || defined(HAVE_ANDROID)
+#if defined(HAVE_IPHONE) || defined(HAVE_ANDROID)
/* Surely this should be defined somewhere more centrally... */
# define HAVE_MOBILE
#endif
@@ -216,7 +199,7 @@ gltrackball_reset (trackball_state *ts, float x, float y)
/* Execute the rotations current encapsulated in the trackball_state:
- this does something analagous to glRotatef().
+ this does something analogous to glRotatef().
*/
void
gltrackball_rotate (trackball_state *ts)
diff --git a/hacks/glx/gltrackball.h b/hacks/glx/gltrackball.h
index 2ccfb9a..048747c 100644
--- a/hacks/glx/gltrackball.h
+++ b/hacks/glx/gltrackball.h
@@ -38,7 +38,7 @@ extern void gltrackball_track (trackball_state *, int x, int y, int w, int h);
extern void gltrackball_stop (trackball_state *);
/* Execute the rotations current encapsulated in the trackball_state:
- this does something analagous to glRotatef().
+ this does something analogous to glRotatef().
*/
extern void gltrackball_rotate (trackball_state *);
diff --git a/hacks/glx/glut_stroke.c b/hacks/glx/glut_stroke.c
index 59850ea..42fd75a 100644
--- a/hacks/glx/glut_stroke.c
+++ b/hacks/glx/glut_stroke.c
@@ -8,24 +8,7 @@
#if 0 /* for Mesa */
# include "glutint.h"
#else /* for xscreensaver */
-
-# ifdef HAVE_CONFIG_H
-# include "config.h"
-# endif
-
-# ifdef HAVE_COCOA
-# include "jwxyz.h"
-# elif defined(HAVE_ANDROID)
-# include "jwxyz.h"
-# include <GLES/gl.h>
-# else /* real X11 */
-# include <GL/gl.h>
-# endif
-
-# ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-# endif /* HAVE_JWZGLES */
-
+# include "screenhackI.h"
# undef APIENTRY
# define APIENTRY /**/
#endif
diff --git a/hacks/glx/glut_swidth.c b/hacks/glx/glut_swidth.c
index b165a0a..4da6105 100644
--- a/hacks/glx/glut_swidth.c
+++ b/hacks/glx/glut_swidth.c
@@ -8,19 +8,7 @@
#if 0 /* for Mesa */
# include "glutint.h"
#else /* for xscreensaver */
-# ifdef HAVE_CONFIG_H
-# include "config.h"
-# endif
-# ifndef HAVE_JWXYZ
-# include <GL/gl.h>
-# endif
-#ifdef HAVE_ANDROID
-#include <GLES/gl.h>
-#define Bool int
-#endif
-# ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-# endif /* HAVE_JWZGLES */
+# include "screenhackI.h"
# undef APIENTRY
# define APIENTRY /**/
#endif
diff --git a/hacks/glx/grab-ximage.c b/hacks/glx/grab-ximage.c
index 0f71847..7675302 100644
--- a/hacks/glx/grab-ximage.c
+++ b/hacks/glx/grab-ximage.c
@@ -1,5 +1,7 @@
/* grab-ximage.c --- grab the screen to an XImage for use with OpenGL.
- * xscreensaver, Copyright (c) 2001-2008 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 2001-2021 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Modified by Richard Weeks <rtweeks21@gmail.com> Copyright (c) 2020
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -10,39 +12,17 @@
* implied warranty.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#ifdef HAVE_ANDROID
-#include <GLES/gl.h>
-#endif
-
-#ifdef HAVE_JWXYZ
-# include "jwxyz.h"
-# ifndef HAVE_JWZGLES
-# include <OpenGL/glu.h>
-# endif
-#else
-# include <X11/Xlib.h>
-# include <X11/Xutil.h>
-# include <GL/gl.h> /* only for GLfloat */
-# include <GL/glu.h> /* for gluBuild2DMipmaps */
-# include <GL/glx.h> /* for glXMakeCurrent() */
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
+#include "xlockmoreI.h"
#include "grab-ximage.h"
#include "grabscreen.h"
#include "pow2.h"
#include "visual.h"
+#include "xshm.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/time.h>
/* If REFORMAT_IMAGE_DATA is defined, then we convert Pixmaps to textures
like this:
@@ -65,27 +45,11 @@
*/
#define REFORMAT_IMAGE_DATA
-
-#include "xshm.h"
-
-extern char *progname;
-
-#include <sys/time.h>
-
-#ifdef HAVE_JWXYZ
-# include "jwxyz.h"
-#else
-# include <X11/Xutil.h>
-#endif
-
#undef MAX
#define MAX(a,b) ((a)>(b)?(a):(b))
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
-
static int debug_p = 0;
+static double perf = 32768000.0; /* initially assume 2^19 pixels in 1/60/sec */
static Bool
bigendian (void)
@@ -95,6 +59,12 @@ bigendian (void)
return !u.c[0];
}
+#if defined(HAVE_IPHONE) || defined(HAVE_ANDROID)
+# undef GENERATE_MIPMAPS
+#else
+# define GENERATE_MIPMAPS
+#endif
+
#ifdef REFORMAT_IMAGE_DATA
@@ -492,6 +462,27 @@ typedef struct {
} img_closure;
+typedef enum { TLP_LOADING = 0, TLP_IMPORTING, TLP_COMPLETE, TLP_ERROR } texture_loader_phase;
+struct texture_loader_t {
+ texture_loader_phase phase;
+ Screen *screen;
+ Window window;
+ XShmSegmentInfo shm_info;
+ XImage *ximage;
+ img_closure load_closure;
+ Bool pixmap_valid_p;
+ int img_width, img_height, tex_width, tex_height;
+ XRectangle geometry;
+ int y;
+ unsigned int stripe_height;
+ char *name;
+
+ /* debugging */
+ int steps; /* number of calls to step_texture_loader() that loaded part of the texture */
+ int stripes; /* number of stripes put into the texture so far */
+ double loaded_time, work_seconds;
+};
+
/* Returns the current time in seconds as a double.
*/
@@ -678,6 +669,95 @@ load_texture_async (Screen *screen, Window window,
}
+static void incremental_load_texture_async_cb (Screen *screen,
+ Window window,
+ Drawable drawable,
+ const char *name,
+ XRectangle *geometry,
+ void *closure);
+
+
+/* Allocate a texture loader to grab the image of a Window and load the image
+ into GL's texture memory.
+
+ The returned texture loader should be stepped with step_texture_loader
+ until that function calls the callback function passed to it.
+ */
+texture_loader_t*
+alloc_texture_loader (Screen *screen, Window window,
+ GLXContext glx_context,
+ int desired_width, int desired_height,
+ Bool mipmap_p,
+ GLuint texid)
+{
+ texture_loader_t *loader = (texture_loader_t*) calloc (1, sizeof(*loader));
+ Display *dpy = DisplayOfScreen (screen);
+ XWindowAttributes xgwa;
+ img_closure *data = &loader->load_closure;
+
+ if (debug_p)
+ data->load_time = double_time();
+
+ data->texid = texid;
+ data->mipmap_p = mipmap_p;
+ data->glx_context = glx_context;
+ loader->screen = screen;
+ loader->window = window;
+
+ XGetWindowAttributes (dpy, window, &xgwa);
+ data->pix_width = xgwa.width;
+ data->pix_height = xgwa.height;
+ data->pix_depth = xgwa.depth;
+
+ /* Allow the pixmap to be larger than the window. Esper wants this. */
+ if (desired_width /* && desired_width < xgwa.width */)
+ data->pix_width = desired_width;
+ if (desired_height /* && desired_height < xgwa.height */)
+ data->pix_height = desired_height;
+
+ data->pixmap = XCreatePixmap (dpy, window, data->pix_width, data->pix_height,
+ data->pix_depth);
+ loader->pixmap_valid_p = True;
+ load_image_async (screen, window, data->pixmap,
+ incremental_load_texture_async_cb, loader);
+
+ return loader;
+}
+
+
+/* Free the texture loader
+ */
+void
+free_texture_loader (texture_loader_t *loader)
+{
+ Display *dpy = DisplayOfScreen(loader->screen);
+
+ /* If the loader is still awaiting asynchronous completion of loading the
+ XImage, there is no way to recover from this request.
+ */
+ if (loader->phase == TLP_LOADING)
+ abort();
+
+ if (loader->ximage)
+ {
+ XImage *ximage = loader->ximage;
+ loader->ximage = 0;
+ destroy_xshm_image (dpy, ximage, &loader->shm_info);
+ }
+
+ if (loader->pixmap_valid_p)
+ {
+ loader->pixmap_valid_p = False;
+ XFreePixmap (dpy, loader->load_closure.pixmap);
+ }
+
+ free ((char *) loader->name);
+ loader->name = 0;
+
+ free (loader);
+}
+
+
/* Once we have an XImage, this loads it into GL.
This is used in both synchronous and asynchronous mode.
*/
@@ -811,3 +891,297 @@ load_texture_async_cb (Screen *screen, Window window, Drawable drawable,
if (dd.texture_height_return) *dd.texture_height_return = th;
}
}
+
+
+/* Once we have a pixmap, this sets us up to step-load it into a GL texture.
+ */
+static void
+incremental_load_texture_async_cb (Screen *screen, Window window,
+ Drawable drawable, const char *name,
+ XRectangle *geometry,
+ void *closure)
+{
+ texture_loader_t *loader = (texture_loader_t *) closure;
+ Display *dpy = DisplayOfScreen (screen);
+ img_closure dd = loader->load_closure;
+ GLenum err = 0;
+ GLsizei tex_width = 0, tex_height = 0;
+
+ loader->load_closure.texid = dd.texid;
+ loader->phase = TLP_IMPORTING;
+
+ if (debug_p)
+ loader->loaded_time = double_time();
+
+ /* Like load_texture_async_cb() until it calls pixmap_to_gl_ximage() */
+
+ if (dd.glx_context)
+ glXMakeCurrent (dpy, window, dd.glx_context);
+
+ if (geometry->width <= 0 || geometry->height <= 0)
+ {
+ geometry->x = 0;
+ geometry->y = 0;
+ geometry->width = dd.pix_width;
+ geometry->height = dd.pix_height;
+ }
+
+ if (geometry->width <= 0 || geometry->height <= 0)
+ abort();
+
+ loader->geometry = *geometry;
+
+ /* Like pixmap_to_gl_ximage(): */
+ {
+ Visual *visual = DefaultVisualOfScreen (screen);
+ unsigned int width, height, depth;
+
+ {
+ Window root;
+ int x, y;
+ unsigned int bw;
+ XGetGeometry (dpy, dd.pixmap, &root, &x, &y, &width, &height, &bw, &depth);
+ }
+
+ if (width < 5 || height < 5)
+ {
+ loader->phase = TLP_ERROR;
+ return;
+ }
+
+ loader->ximage = create_xshm_image (dpy, visual, depth, ZPixmap,
+ &loader->shm_info, width, height);
+
+ get_xshm_image (dpy, dd.pixmap, loader->ximage, 0, 0, ~0L, &loader->shm_info);
+ }
+
+ loader->img_width = loader->ximage->width;
+ loader->img_height = loader->ximage->height;
+ loader->stripe_height = (1 << 19) / loader->img_width;
+ if (dd.texid != -1)
+ glBindTexture (GL_TEXTURE_2D, dd.texid);
+
+ /* as much of ximage_to_texture() functionality as we can precompute */
+ tex_width = (GLsizei) to_pow2 (loader->ximage->width);
+ tex_height = (GLsizei) to_pow2 (loader->ximage->height);
+
+ /* glTexImage2D() to allocate OpenGL texture */
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, tex_width, tex_height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, 0);
+ err = glGetError();
+
+ if (err)
+ {
+ loader->phase = TLP_ERROR;
+ loader->img_width = loader->img_height = 0;
+ return;
+ }
+
+ /* Capture texture dimensions and name in loader */
+ loader->tex_width = tex_width;
+ loader->tex_height = tex_height;
+ loader->name = name ? strdup(name) : 0;
+}
+
+
+static void
+advance_texture_loader (texture_loader_t *loader, double allowed_seconds);
+static void
+complete_texture_load (texture_loader_t *loader,
+ void (*callback) (const char *filename,
+ XRectangle *geometry,
+ int image_width,
+ int image_height,
+ int texture_width,
+ int texture_height,
+ void *closure),
+ void *closure);
+
+
+void
+step_texture_loader (texture_loader_t *loader, double allowed_seconds,
+ void (*callback) (const char *filename,
+ XRectangle *geometry,
+ int image_width,
+ int image_height,
+ int texture_width,
+ int texture_height,
+ void *closure),
+ void *closure)
+{
+ if (loader->phase != TLP_IMPORTING)
+ return;
+
+ if (loader->y < loader->ximage->height)
+ {
+ loader->steps++;
+ if (loader->steps == 1)
+ /* Initial tune on the loader for the number of allowed_seconds */
+ loader->stripe_height = ((unsigned int) (perf * allowed_seconds / loader->ximage->width)) / 8 + 1;
+ else
+ advance_texture_loader (loader, allowed_seconds);
+ }
+ else
+ {
+ loader->phase = TLP_COMPLETE;
+ complete_texture_load (loader, callback, closure);
+ }
+}
+
+
+static unsigned int
+texture_loader_next_stripe_height (texture_loader_t *loader)
+{
+ if (loader->y + loader->stripe_height <= loader->img_height)
+ return loader->stripe_height;
+ else
+ return loader->img_height - loader->y;
+}
+
+
+static void
+advance_texture_loader (texture_loader_t *loader, double allowed_seconds)
+{
+ Display *dpy = loader->screen ? DisplayOfScreen (loader->screen) : 0;
+ double start_time = double_time(), elapsed_seconds = 0;
+ double step_end = start_time + allowed_seconds;
+ int iter_count = 0;
+ unsigned int lines_processed = 0;
+
+ if (loader->load_closure.glx_context)
+ glXMakeCurrent (dpy, loader->window, loader->load_closure.glx_context);
+
+ for (
+ ;
+ (double_time() < step_end) && (loader->y < loader->img_height);
+ loader->y += loader->stripe_height, ++iter_count
+ )
+ {
+ /*
+ * Use XSubImage() to extract a section of the shared image
+ loader->stripe_height tall
+ * Use convert_ximage_to_rgba32() to convert that to the desired format
+ * Use XDestroyImage() to free the extracted section of the shared image
+ * glBindTexture(GL_TEXTURE_2D, loader->load_closure.texid)
+ * Import the data to the next stripe of the texture with glTexSubImage2D()
+ * XDestroyImage() to destroy the converted image
+ * Increment loader->y by loader->stripe_height
+ */
+ unsigned int patch_height = texture_loader_next_stripe_height (loader);
+ XImage* patch = XSubImage (loader->ximage,
+ 0, loader->y,
+ loader->img_width, patch_height);
+ XImage* cvt_patch = convert_ximage_to_rgba32 (loader->screen, patch);
+ Bool use_old_mipmap_p = False;
+# ifdef GENERATE_MIPMAPS
+ use_old_mipmap_p = (loader->load_closure.mipmap_p &&
+ (loader->y + loader->stripe_height >=
+ loader->ximage->height));
+# endif
+
+ loader->stripes++;
+
+ XDestroyImage (patch);
+
+ glBindTexture (GL_TEXTURE_2D, loader->load_closure.texid);
+ glPixelStorei (GL_UNPACK_ALIGNMENT, cvt_patch->bitmap_pad / 8);
+
+ if (use_old_mipmap_p)
+ /* Use old GL_GENERATE_MIPMAP (if before OpenGL 3.0) */
+ glTexParameteri (GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
+
+ /* CHECK: loader->y or -loader->y? */
+ glTexSubImage2D (GL_TEXTURE_2D, 0, 0, loader->y,
+ cvt_patch->width, cvt_patch->height,
+ GL_RGBA, GL_UNSIGNED_BYTE, cvt_patch->data);
+
+ if (use_old_mipmap_p)
+ /* Turn off GL_GENERATE_MIPMAP if we turned it on */
+ glTexParameteri (GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE);
+
+ XDestroyImage (cvt_patch);
+
+ lines_processed += patch_height;
+ }
+
+ if (iter_count == 1 && loader->y < loader->img_height && loader->stripe_height > 1)
+ {
+ loader->stripe_height >>= 1;
+ }
+
+ elapsed_seconds = double_time() - start_time;
+ /* monitor perf for use setting the next initial stripe_height (px/s) */
+ if (elapsed_seconds > 0.001)
+ {
+ perf = lines_processed * (double) loader->ximage->width / elapsed_seconds;
+ if (perf > 2e8)
+ perf = 2e8;
+ else if (perf < 1e6)
+ perf = 1e6;
+ }
+
+ if (debug_p)
+ loader->work_seconds += elapsed_seconds;
+}
+
+
+static void
+complete_texture_load (texture_loader_t *loader,
+ void (*callback) (const char *filename,
+ XRectangle *geometry,
+ int image_width,
+ int image_height,
+ int texture_width,
+ int texture_height,
+ void *closure),
+ void *closure)
+{
+ XImage *ximage = loader->ximage;
+ Display *dpy = loader->screen ? DisplayOfScreen (loader->screen) : 0;
+ char *name = loader->name;
+ XRectangle geometry = loader->geometry;
+
+ loader->name = 0;
+
+ if (loader->load_closure.glx_context)
+ glXMakeCurrent (dpy, loader->window, loader->load_closure.glx_context);
+
+ loader->ximage = 0;
+ destroy_xshm_image (dpy, ximage, &loader->shm_info);
+
+ loader->pixmap_valid_p = False;
+ XFreePixmap (dpy, loader->load_closure.pixmap);
+
+ if (loader->load_closure.mipmap_p)
+ {
+ glBindTexture (GL_TEXTURE_2D, loader->load_closure.texid);
+# ifdef GENERATE_MIPMAPS
+ glGenerateMipmap (GL_TEXTURE_2D);
+# endif
+ }
+
+ if (debug_p)
+ {
+ double done_time = double_time();
+ fprintf (stderr,
+ "%s: texture loading: [load %.2f sec] [import %.2f sec, %d stripes, %d steps] [elapsed %2.f sec]\n",
+ progname,
+ loader->loaded_time - loader->load_closure.load_time,
+ loader->work_seconds,
+ loader->stripes,
+ loader->steps,
+ done_time - loader->load_closure.load_time);
+ }
+
+ callback (name, &geometry,
+ loader->img_width, loader->img_height,
+ loader->tex_width, loader->tex_height,
+ closure);
+
+ free (name);
+}
+
+Bool texture_loader_failed (texture_loader_t *loader)
+{
+ return loader->phase == TLP_ERROR;
+}
diff --git a/hacks/glx/grab-ximage.h b/hacks/glx/grab-ximage.h
index 2fd589f..22e51d2 100644
--- a/hacks/glx/grab-ximage.h
+++ b/hacks/glx/grab-ximage.h
@@ -1,6 +1,8 @@
/* grab-ximage.c --- grab the screen to an XImage for use with OpenGL.
* xscreensaver, Copyright (c) 2001-2006 Jamie Zawinski <jwz@jwz.org>
*
+ * Modified by Richard Weeks <rtweeks21@gmail.com> Copyright (c) 2020
+ *
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
@@ -73,4 +75,53 @@ void load_texture_async (Screen *, Window, GLXContext,
void *closure),
void *closure);
+struct texture_loader_t;
+typedef struct texture_loader_t texture_loader_t;
+
+/* Incremental Texture Loading
+
+ The process works like load_texture_async, but split into multiple calls
+ to facilitate chunks of work fitted to animation idle periods. The
+ necessary calls are:
+
+ * alloc_texture_loader - one call - allocates texture loader and starts
+ background loading of image
+ * step_texture_loader - multiple calls - each call processes part of the
+ image into an OpenGL texture; calls back to provided function when
+ texture is ready with image
+ * free_texture_loader - one call - frees the texture loader resources
+ and memory
+
+ With the exception of the pointer to the loader and the time limit, all
+ arguments are the same types as used by load_texture_async.
+ */
+texture_loader_t *alloc_texture_loader (Screen *, Window, GLXContext,
+ int desired_width, int desired_height,
+ Bool mipmap_p,
+ GLuint texid);
+
+/* Give an incremental texture loader time to work
+
+ The given callback function will be called (with the passed closure) if
+ the texture loader completes its work, and this callback will only be
+ made once during the lifetime of the texture loader.
+
+ This function will return either when all work is complete or when a
+ processed "stripe" takes the elapsed time beyond allowed_seconds.
+ */
+void step_texture_loader (texture_loader_t *loader,
+ double allowed_seconds,
+ void (*callback) (const char *filename,
+ XRectangle *geometry,
+ int image_width,
+ int image_height,
+ int texture_width,
+ int texture_height,
+ void *closure),
+ void *closure);
+
+Bool texture_loader_failed (texture_loader_t *loader);
+
+void free_texture_loader (texture_loader_t *loader);
+
#endif /* __GRAB_XIMAGE_H__ */
diff --git a/hacks/glx/gravitywell.c b/hacks/glx/gravitywell.c
index 90edcf0..c41011a 100644
--- a/hacks/glx/gravitywell.c
+++ b/hacks/glx/gravitywell.c
@@ -17,8 +17,6 @@
"*wireframe: False \n"
# define release_gw 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#define DEF_SPEED "1.0"
#define DEF_RESOLUTION "1.0"
@@ -573,9 +571,7 @@ draw_gw (ModeInfo *mi)
glPushMatrix ();
-# ifdef HAVE_MOBILE
glRotatef (current_device_rotation(), 0, 0, 1); /* right side up */
-# endif
gltrackball_rotate (bp->user_trackball);
diff --git a/hacks/glx/gravitywell.man b/hacks/glx/gravitywell.man
index a33d578..8837072 100644
--- a/hacks/glx/gravitywell.man
+++ b/hacks/glx/gravitywell.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-gravitywell - spaaaaace.
+gravitywell \- spaaaaace.
.SH SYNOPSIS
.B gravitywell
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/handsy.c b/hacks/glx/handsy.c
index 077df76..ed21b2d 100644
--- a/hacks/glx/handsy.c
+++ b/hacks/glx/handsy.c
@@ -17,8 +17,6 @@
"*wireframe: False \n"
# define release_hands 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "sphere.h"
diff --git a/hacks/glx/handsy.man b/hacks/glx/handsy.man
index c8143db..494fb17 100644
--- a/hacks/glx/handsy.man
+++ b/hacks/glx/handsy.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-handsy - some hands.
+handsy \- some hands.
.SH SYNOPSIS
.B handsy
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/headroom.c b/hacks/glx/headroom.c
new file mode 100644
index 0000000..c122b22
--- /dev/null
+++ b/hacks/glx/headroom.c
@@ -0,0 +1,559 @@
+/* headroom, Copyright (c) 2020 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Well, it's supposed to be Max Headroom, but I have so far been unable to
+ * find or commission a decent 3D model of Max. So it's a skull instead.
+ * This will have to do for now.
+ *
+ * Created 29-Nov-2020.
+ */
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*skullColor: #777777" "\n" \
+ "*teethColor: #FFFFFF" "\n" \
+ "*torsoColor: #447744" "\n" \
+ "*torsoCapColor:#222222" "\n" \
+ "*gridColor1: #AA0000" "\n" \
+ "*gridColor2: #00FF00" "\n" \
+ "*gridColor3: #6666FF" "\n" \
+ "*wireframe: False \n"
+
+# define release_headroom 0
+
+#define DEF_SPEED "1.0"
+#define DEF_SPIN "XYZ"
+#define DEF_WANDER "False"
+
+#include "xlockmore.h"
+
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#include "gltrackball.h"
+#include "rotator.h"
+#include "gllist.h"
+
+extern const struct gllist
+ *headroom_model_skull_half, *headroom_model_jaw_half,
+ *headroom_model_teeth_upper_half, *headroom_model_teeth_lower_half,
+ *headroom_model_torso_half, *headroom_model_torso_cap_half;
+
+static const struct gllist * const *all_objs[] = {
+ &headroom_model_skull_half, &headroom_model_jaw_half,
+ &headroom_model_teeth_upper_half, &headroom_model_teeth_lower_half,
+ &headroom_model_torso_half, &headroom_model_torso_cap_half,
+};
+
+enum { SKULL_HALF, JAW_HALF, TEETH_UPPER_HALF, TEETH_LOWER_HALF, TORSO_HALF,
+ TORSO_CAP_HALF };
+
+typedef struct { GLfloat x, y, z; } XYZ;
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot, *rot2, *rot3;
+ trackball_state *trackball;
+ Bool button_down_p;
+ Bool spinx, spiny, spinz;
+
+ XYZ head_pos;
+ GLfloat jaw_pos;
+ GLfloat grid_colors[3][4];
+
+ GLuint *dlists;
+ GLfloat component_colors[countof(all_objs)][4];
+} headroom_configuration;
+
+static headroom_configuration *bps = NULL;
+
+static GLfloat speed;
+static char *do_spin;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-spin", ".spin", XrmoptionSepArg, 0 },
+ { "+spin", ".spin", XrmoptionNoArg, "" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+};
+
+static argtype vars[] = {
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_String},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt headroom_opts = {
+ countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_headroom (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30, 1/h, 1, 500);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0, 0, 30,
+ 0, 0, 0,
+ 0, 1, 0);
+
+ {
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
+ }
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+headroom_handle_event (ModeInfo *mi, XEvent *event)
+{
+ headroom_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+static void
+parse_color (ModeInfo *mi, char *key, GLfloat color[4])
+{
+ XColor xcolor;
+ char *string = get_string_resource (mi->dpy, key, "Color");
+ if (!XParseColor (mi->dpy, mi->xgwa.colormap, string, &xcolor))
+ {
+ fprintf (stderr, "%s: unparsable color in %s: %s\n", progname,
+ key, string);
+ exit (1);
+ }
+ free (string);
+
+ color[0] = xcolor.red / 65536.0;
+ color[1] = xcolor.green / 65536.0;
+ color[2] = xcolor.blue / 65536.0;
+ color[3] = 1;
+}
+
+
+ENTRYPOINT void
+init_headroom (ModeInfo *mi)
+{
+ headroom_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+ bp->glx_context = init_GL(mi);
+ reshape_headroom (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {0.4, 0.2, 0.4, 0.0};
+/* GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};*/
+ GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+
+ {
+ double spin_speed = 0.5;
+ double wander_speed = 0.002 * speed;
+ double tilt_speed = 0.005 * speed;
+ double spin_accel = 0.5;
+
+ double spin_speed_2 = 0.2 * speed;
+ double spin_accel_2 = 0.2;
+ double wander_speed_2 = 0.01 * speed;
+
+ char *s = do_spin;
+ while (*s)
+ {
+ if (*s == 'x' || *s == 'X') bp->spinx = True;
+ else if (*s == 'y' || *s == 'Y') bp->spiny = True;
+ else if (*s == 'z' || *s == 'Z') bp->spinz = True;
+ else if (*s == '0') ;
+ else
+ {
+ fprintf (stderr,
+ "%s: spin must contain only the characters X, Y, or Z (not \"%s\")\n",
+ progname, do_spin);
+ exit (1);
+ }
+ s++;
+ }
+
+ bp->rot = make_rotator (bp->spinx ? spin_speed : 0,
+ bp->spiny ? spin_speed : 0,
+ bp->spinz ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ False);
+ bp->rot2 = make_rotator (0, 0, 0, 0, tilt_speed, True);
+
+ bp->rot3 = make_rotator (spin_speed_2, spin_speed_2, spin_speed_2,
+ spin_accel_2, wander_speed_2, True);
+
+ bp->trackball = gltrackball_init (False);
+ }
+
+ bp->dlists = (GLuint *) calloc (countof(all_objs)+1, sizeof(GLuint));
+ for (i = 0; i < countof(all_objs); i++)
+ bp->dlists[i] = glGenLists (1);
+
+ for (i = 0; i < countof(all_objs); i++)
+ {
+ const struct gllist *gll = *all_objs[i];
+ char *key = 0;
+ GLfloat spec[4] = {0.4, 0.4, 0.4, 1.0};
+ GLfloat shiny = 80; /* 0-128 */
+
+ glNewList (bp->dlists[i], GL_COMPILE);
+
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glMatrixMode(GL_TEXTURE);
+ glPushMatrix();
+ glMatrixMode(GL_MODELVIEW);
+
+ glRotatef (-90, 1, 0, 0);
+
+ glBindTexture (GL_TEXTURE_2D, 0);
+
+ switch (i) {
+ case SKULL_HALF:
+ case JAW_HALF:
+ key = "skullColor";
+ break;
+ case TEETH_UPPER_HALF:
+ case TEETH_LOWER_HALF:
+ key = "teethColor";
+ break;
+ case TORSO_HALF:
+ key = "torsoColor";
+ break;
+ case TORSO_CAP_HALF:
+ key = "torsoCapColor";
+ break;
+ default:
+ abort();
+ }
+
+ parse_color (mi, key, bp->component_colors[i]);
+
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+ renderList (gll, wire);
+
+ glMatrixMode(GL_TEXTURE);
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+ glPopMatrix();
+
+ glEndList ();
+ }
+
+ parse_color (mi, "gridColor1", bp->grid_colors[0]);
+ parse_color (mi, "gridColor2", bp->grid_colors[1]);
+ parse_color (mi, "gridColor3", bp->grid_colors[2]);
+
+ reshape_headroom (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+}
+
+
+static int
+draw_unit_panel (ModeInfo *mi, GLfloat *color1, GLfloat *color2)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ int polys = 0;
+ int rows = 36;
+ GLfloat spacing = 1.0 / rows;
+ GLfloat thickness = spacing / 8;
+ int i;
+ glFrontFace (GL_CCW);
+ glBegin (wire ? GL_LINES : GL_QUADS);
+ glNormal3f (0, 0, 1);
+ for (i = 0; i < rows; i++)
+ {
+ GLfloat y = i / (GLfloat) rows + spacing/2;
+ glColor4fv (color2);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color2);
+ glVertex3f (1, y, 0);
+ glColor4fv (color1);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color1);
+ glVertex3f (0, y, 0);
+ glVertex3f (0, y + thickness, 0);
+ glColor4fv (color2);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color2);
+ glVertex3f (1, y + thickness, 0);
+ polys++;
+ }
+ glEnd();
+ return polys;
+}
+
+static int
+draw_box (ModeInfo *mi)
+{
+ headroom_configuration *bp = &bps[MI_SCREEN(mi)];
+ int polys = 0;
+ GLfloat *c0 = bp->grid_colors[0];
+ GLfloat *c1 = bp->grid_colors[1];
+ GLfloat *c2 = bp->grid_colors[2];
+
+ glPushMatrix();
+ glTranslatef (-0.5, -0.5, 0.5);
+ polys += draw_unit_panel (mi, c0, c1);
+ glRotatef (-90, 0, 1, 0);
+ glTranslatef (-1, 0, 0);
+ polys += draw_unit_panel (mi, c1, c0);
+ glRotatef (-90, 0, 1, 0);
+ glTranslatef (-1, 0, 0);
+ polys += draw_unit_panel (mi, c0, c1);
+ glRotatef (-90, 0, 1, 0);
+ glTranslatef (-1, 0, 0);
+ polys += draw_unit_panel (mi, c1, c0);
+
+ glRotatef (-90, 1, 0, 0);
+ glTranslatef (0, 0, 1);
+ polys += draw_unit_panel (mi, c2, c1);
+ glRotatef (-180, 1, 0, 0);
+ glTranslatef (0, -1, 1);
+ polys += draw_unit_panel (mi, c1, c2);
+
+
+ glPopMatrix();
+ return polys;
+}
+
+
+
+static int
+draw_component (ModeInfo *mi, int i)
+{
+ headroom_configuration *bp = &bps[MI_SCREEN(mi)];
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE,
+ bp->component_colors[i]);
+
+ glFrontFace (GL_CCW);
+ glCallList (bp->dlists[i]);
+
+ glPushMatrix();
+ glScalef (-1, 1, 1);
+ glFrontFace (GL_CW);
+ glCallList (bp->dlists[i]);
+ glPopMatrix();
+
+ return 2 * (*all_objs[i])->points / 3;
+}
+
+
+ENTRYPOINT void
+draw_headroom (ModeInfo *mi)
+{
+ headroom_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int wire = MI_IS_WIREFRAME(mi);
+ GLfloat s;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ mi->polygon_count = 0;
+
+ {
+ double x, y, z;
+ get_rotation (bp->rot3, &x, &y, &z, !bp->button_down_p);
+
+ glPushMatrix();
+ glRotatef (x * 360, 1, 0, 0);
+ glRotatef (y * 360, 0, 1, 0);
+ glRotatef (z * 360, 0, 0, 1);
+
+ get_position (bp->rot3, &x, &y, &z, !bp->button_down_p);
+ s = 3;
+ glScalef (1+x*s, 1+y*s, 1+z*s);
+
+ s = 60;
+ glScalef (s, s, s);
+
+ if (!wire) glDisable(GL_LIGHTING);
+ mi->polygon_count += draw_box (mi);
+ if (!wire) glEnable(GL_LIGHTING);
+ glPopMatrix();
+ glClear(GL_DEPTH_BUFFER_BIT);
+ }
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 6,
+ (z - 0.5) * 10);
+
+ gltrackball_rotate (bp->trackball);
+
+ {
+ double maxx = 40;
+ double maxy = 20;
+ double maxz = 2;
+ get_position (bp->rot2, &x, &y, &z, !bp->button_down_p);
+ if (bp->spinx) glRotatef (maxy/2 - x*maxy, 1, 0, 0);
+ if (bp->spiny) glRotatef (maxx/2 - y*maxx, 0, 1, 0);
+ if (bp->spinz) glRotatef (maxz/2 - z*maxz, 0, 0, 1);
+ }
+ }
+
+ glTranslatef (0, -6, 0);
+ s = 0.03;
+
+ glScalef (s, s, s);
+
+ {
+ /* head x, nod: -50 to +30
+ head y, turn: +- 70
+ head z, tilt: +- 30
+ jaw, open: 0 - 22
+ */
+ const XYZ head_base = { 0, 200, 0 };
+ const XYZ jaw_base = { 0, 270, 40 };
+
+ mi->polygon_count += draw_component (mi, TORSO_HALF);
+ mi->polygon_count += draw_component (mi, TORSO_CAP_HALF);
+
+ glTranslatef (head_base.x, head_base.y, head_base.z);
+ glRotatef (bp->head_pos.x, 1, 0, 0);
+ glRotatef (bp->head_pos.y, 0, 1, 0);
+ glRotatef (bp->head_pos.z, 0, 0, 1);
+ glTranslatef (-head_base.x, -head_base.y, -head_base.z);
+
+ mi->polygon_count += draw_component (mi, SKULL_HALF);
+ mi->polygon_count += draw_component (mi, TEETH_UPPER_HALF);
+
+ glTranslatef (jaw_base.x, jaw_base.y, jaw_base.z);
+ glRotatef (bp->jaw_pos, 1, 0, 0);
+ glTranslatef (-jaw_base.x, -jaw_base.y, -jaw_base.z);
+
+ mi->polygon_count += draw_component (mi, JAW_HALF);
+ mi->polygon_count += draw_component (mi, TEETH_LOWER_HALF);
+
+ glFrontFace (GL_CCW);
+ }
+
+ if (! bp->button_down_p)
+ {
+ int twitch = 200 / speed;
+ int untwitch = 50 / speed;
+ if (twitch < 10) twitch = 10;
+ if (untwitch < 5) untwitch = 5;
+
+ if (! (random() % twitch))
+ bp->head_pos.x = -20.0 + (random() % (20 + 30));
+ if (! (random() % twitch))
+ bp->head_pos.y = -50.0 + (random() % (50 * 2));
+ if (! (random() % twitch))
+ bp->head_pos.z = -30.0 + (random() % (30 * 2));
+ if (! (random() % twitch))
+ bp->jaw_pos = (random() % 22);
+
+ if (! (random() % untwitch))
+ {
+ bp->head_pos.x = 0;
+ bp->head_pos.y = 0;
+ bp->head_pos.z = 0;
+ bp->jaw_pos = 0;
+ }
+ }
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+
+ENTRYPOINT void
+free_headroom (ModeInfo *mi)
+{
+ headroom_configuration *bp = &bps[MI_SCREEN(mi)];
+ int i;
+
+ if (!bp->glx_context) return;
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
+
+ if (bp->trackball) gltrackball_free (bp->trackball);
+ if (bp->rot) free_rotator (bp->rot);
+ if (bp->rot2) free_rotator (bp->rot2);
+ if (bp->rot3) free_rotator (bp->rot3);
+ if (bp->dlists) {
+ for (i = 0; i < countof(all_objs); i++)
+ if (glIsList(bp->dlists[i])) glDeleteLists(bp->dlists[i], 1);
+ free (bp->dlists);
+ }
+}
+
+XSCREENSAVER_MODULE ("Headroom", headroom)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/headroom.dxf b/hacks/glx/headroom.dxf
new file mode 100644
index 0000000..bfdf754
--- /dev/null
+++ b/hacks/glx/headroom.dxf
@@ -0,0 +1,259600 @@
+ 0
+SECTION
+ 2
+ENTITIES
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.28175868300487
+20
+4.1529284212134385
+30
+254.0923897219521
+11
+36.63584649468839
+21
+3.1985767198370456
+31
+253.89068899577632
+12
+33.31310843844554
+22
+1.4851853324750732
+32
+256.47264082541614
+13
+33.31310843844554
+23
+1.4851853324750732
+33
+256.47264082541614
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.13717887872326
+20
+-3.2269452070905293
+30
+252.8794473459897
+11
+35.77337053887001
+21
+-1.111673488994261
+31
+256.1233913025658
+12
+37.57802922314326
+22
+0.8682184053505946
+32
+254.14289095957588
+13
+37.57802922314326
+23
+0.8682184053505946
+33
+254.14289095957588
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.63584649468839
+20
+3.1985767198370456
+30
+253.89068899577632
+11
+37.57802922314326
+21
+0.8682184053505946
+31
+254.14289095957588
+12
+33.31310843844554
+22
+1.4851853324750732
+32
+256.47264082541614
+13
+33.31310843844554
+23
+1.4851853324750732
+33
+256.47264082541614
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.31310843844554
+20
+1.4851853324750732
+30
+256.47264082541614
+11
+37.57802922314326
+21
+0.8682184053505946
+31
+254.14289095957588
+12
+35.77337053887001
+22
+-1.111673488994261
+32
+256.1233913025658
+13
+35.77337053887001
+23
+-1.111673488994261
+33
+256.1233913025658
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.610368331585578
+20
+-58.662092902799024
+30
+275.66737026328656
+11
+10.54891501833147
+21
+-48.260663298061445
+31
+275.72517288466685
+12
+12.014059358092108
+22
+-50.16480333596974
+32
+279.3104565316927
+13
+12.014059358092108
+23
+-50.16480333596974
+33
+279.3104565316927
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.610368331585578
+20
+-58.662092902799024
+30
+275.66737026328656
+11
+12.014059358092108
+21
+-50.16480333596974
+31
+279.3104565316927
+12
+11.304608236762828
+22
+-55.33722527629574
+32
+278.9657703736871
+13
+11.304608236762828
+23
+-55.33722527629574
+33
+278.9657703736871
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+11.304608236762828
+20
+-55.33722527629574
+30
+278.9657703736871
+11
+14.805925970630177
+21
+-59.056976074105265
+31
+277.0138671170615
+12
+10.610368331585578
+22
+-58.662092902799024
+32
+275.66737026328656
+13
+10.610368331585578
+23
+-58.662092902799024
+33
+275.66737026328656
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.285687728064268
+20
+-56.67398695173371
+30
+279.89943482109624
+11
+14.805925970630177
+21
+-59.056976074105265
+31
+277.0138671170615
+12
+11.304608236762828
+22
+-55.33722527629574
+32
+278.9657703736871
+13
+11.304608236762828
+23
+-55.33722527629574
+33
+278.9657703736871
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.37350600625016
+20
+-55.554137218623254
+30
+279.0369588652784
+11
+14.805925970630177
+21
+-59.056976074105265
+31
+277.0138671170615
+12
+15.285687728064268
+22
+-56.67398695173371
+32
+279.89943482109624
+13
+15.285687728064268
+23
+-56.67398695173371
+33
+279.89943482109624
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.426195414806173
+20
+-54.532247717532265
+30
+280.5906324830439
+11
+22.37350600625016
+21
+-55.554137218623254
+31
+279.0369588652784
+12
+15.285687728064268
+22
+-56.67398695173371
+32
+279.89943482109624
+13
+15.285687728064268
+23
+-56.67398695173371
+33
+279.89943482109624
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+20.593793716466177
+20
+-50.02820661492478
+30
+279.1343106486526
+11
+22.37350600625016
+21
+-55.554137218623254
+31
+279.0369588652784
+12
+18.426195414806173
+22
+-54.532247717532265
+32
+280.5906324830439
+13
+18.426195414806173
+23
+-54.532247717532265
+33
+280.5906324830439
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+20.593793716466177
+20
+-50.02820661492478
+30
+279.1343106486526
+11
+18.426195414806173
+21
+-54.532247717532265
+31
+280.5906324830439
+12
+17.22937692796682
+22
+-51.4827031033796
+32
+281.61069663819785
+13
+17.22937692796682
+23
+-51.4827031033796
+33
+281.61069663819785
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.71615049499836
+20
+-46.57556477274322
+30
+276.9797939928842
+11
+20.593793716466177
+21
+-50.02820661492478
+31
+279.1343106486526
+12
+17.22937692796682
+22
+-51.4827031033796
+32
+281.61069663819785
+13
+17.22937692796682
+23
+-51.4827031033796
+33
+281.61069663819785
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.71615049499836
+20
+-46.57556477274322
+30
+276.9797939928842
+11
+17.22937692796682
+21
+-51.4827031033796
+31
+281.61069663819785
+12
+15.628548540130343
+22
+-49.263082442480005
+32
+282.3633476133994
+13
+15.628548540130343
+23
+-49.263082442480005
+33
+282.3633476133994
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.71615049499836
+20
+-46.57556477274322
+30
+276.9797939928842
+11
+15.628548540130343
+21
+-49.263082442480005
+31
+282.3633476133994
+12
+10.54891501833147
+22
+-48.260663298061445
+32
+275.72517288466685
+13
+10.54891501833147
+23
+-48.260663298061445
+33
+275.72517288466685
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.54891501833147
+20
+-48.260663298061445
+30
+275.72517288466685
+11
+15.628548540130343
+21
+-49.263082442480005
+31
+282.3633476133994
+12
+12.014059358092108
+22
+-50.16480333596974
+32
+279.3104565316927
+13
+12.014059358092108
+23
+-50.16480333596974
+33
+279.3104565316927
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.628548540130343
+20
+-49.263082442480005
+30
+282.3633476133994
+11
+17.22937692796682
+21
+-51.4827031033796
+31
+281.61069663819785
+12
+12.014059358092108
+22
+-50.16480333596974
+32
+279.3104565316927
+13
+12.014059358092108
+23
+-50.16480333596974
+33
+279.3104565316927
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.22937692796682
+20
+-51.4827031033796
+30
+281.61069663819785
+11
+18.426195414806173
+21
+-54.532247717532265
+31
+280.5906324830439
+12
+15.285687728064268
+22
+-56.67398695173371
+32
+279.89943482109624
+13
+15.285687728064268
+23
+-56.67398695173371
+33
+279.89943482109624
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+12.014059358092108
+20
+-50.16480333596974
+30
+279.3104565316927
+11
+17.22937692796682
+21
+-51.4827031033796
+31
+281.61069663819785
+12
+11.304608236762828
+22
+-55.33722527629574
+32
+278.9657703736871
+13
+11.304608236762828
+23
+-55.33722527629574
+33
+278.9657703736871
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.22937692796682
+20
+-51.4827031033796
+30
+281.61069663819785
+11
+15.285687728064268
+21
+-56.67398695173371
+31
+279.89943482109624
+12
+11.304608236762828
+22
+-55.33722527629574
+32
+278.9657703736871
+13
+11.304608236762828
+23
+-55.33722527629574
+33
+278.9657703736871
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.33302609192341
+20
+-32.47233360525124
+30
+262.9054641360879
+11
+42.4231057918783
+21
+-32.716625736653036
+31
+265.35325303926817
+12
+40.68841870190421
+22
+-28.405767079177412
+32
+269.90566580923985
+13
+40.68841870190421
+23
+-28.405767079177412
+33
+269.90566580923985
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+42.4231057918783
+20
+-32.716625736653036
+30
+265.35325303926817
+11
+40.057457455919256
+21
+-29.276761316041373
+31
+271.91080832239624
+12
+40.68841870190421
+22
+-28.405767079177412
+32
+269.90566580923985
+13
+40.68841870190421
+23
+-28.405767079177412
+33
+269.90566580923985
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.26808323863559
+20
+-34.08289717142753
+30
+272.61417495726346
+11
+36.14117774542537
+21
+-38.28149705370251
+31
+272.2199002346025
+12
+31.803547347521036
+22
+-35.9170656150349
+32
+269.89501795793154
+13
+31.803547347521036
+23
+-35.9170656150349
+33
+269.89501795793154
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.868882326137026
+20
+-37.21184433389341
+30
+270.4791286581679
+11
+36.14117774542537
+21
+-38.28149705370251
+31
+272.2199002346025
+12
+33.26808323863559
+22
+-34.08289717142753
+32
+272.61417495726346
+13
+33.26808323863559
+23
+-34.08289717142753
+33
+272.61417495726346
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.95525273354536
+20
+-39.64472624524407
+30
+269.66228635080495
+11
+36.14117774542537
+21
+-38.28149705370251
+31
+272.2199002346025
+12
+36.868882326137026
+22
+-37.21184433389341
+32
+270.4791286581679
+13
+36.868882326137026
+23
+-37.21184433389341
+33
+270.4791286581679
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.868882326137026
+20
+-37.21184433389341
+30
+270.4791286581679
+11
+38.83052076109894
+21
+-37.770095966671406
+31
+269.0495785642029
+12
+38.95525273354536
+22
+-39.64472624524407
+32
+269.66228635080495
+13
+38.95525273354536
+23
+-39.64472624524407
+33
+269.66228635080495
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.83052076109894
+20
+-37.770095966671406
+30
+269.0495785642029
+11
+41.89649348869605
+21
+-39.767632871751815
+31
+268.0392495873865
+12
+38.95525273354536
+22
+-39.64472624524407
+32
+269.66228635080495
+13
+38.95525273354536
+23
+-39.64472624524407
+33
+269.66228635080495
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.70788905857879
+20
+-37.171990947574585
+30
+268.4225722344176
+11
+41.89649348869605
+21
+-39.767632871751815
+31
+268.0392495873865
+12
+38.83052076109894
+22
+-37.770095966671406
+32
+269.0495785642029
+13
+38.83052076109894
+23
+-37.770095966671406
+33
+269.0495785642029
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.33302609192341
+20
+-32.47233360525124
+30
+262.9054641360879
+11
+41.89649348869605
+21
+-39.767632871751815
+31
+268.0392495873865
+12
+40.70788905857879
+22
+-37.171990947574585
+32
+268.4225722344176
+13
+40.70788905857879
+23
+-37.171990947574585
+33
+268.4225722344176
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.33302609192341
+20
+-32.47233360525124
+30
+262.9054641360879
+11
+40.70788905857879
+21
+-37.171990947574585
+31
+268.4225722344176
+12
+42.4231057918783
+22
+-32.716625736653036
+32
+265.35325303926817
+13
+42.4231057918783
+23
+-32.716625736653036
+33
+265.35325303926817
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.943736159772385
+20
+-29.902854972857973
+30
+272.37414196638593
+11
+31.14703125840072
+21
+-32.136469952616565
+31
+268.445997507293
+12
+35.72469464718358
+22
+-29.067759206112502
+32
+270.05473572752925
+13
+35.72469464718358
+23
+-29.067759206112502
+33
+270.05473572752925
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.943736159772385
+20
+-29.902854972857973
+30
+272.37414196638593
+11
+32.15157997307879
+21
+-31.42154279347379
+31
+272.90501341009013
+12
+31.14703125840072
+22
+-32.136469952616565
+32
+268.445997507293
+13
+31.14703125840072
+23
+-32.136469952616565
+33
+268.445997507293
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.14703125840072
+20
+-32.136469952616565
+30
+268.445997507293
+11
+32.15157997307879
+21
+-31.42154279347379
+31
+272.90501341009013
+12
+31.803547347521036
+22
+-35.9170656150349
+32
+269.89501795793154
+13
+31.803547347521036
+23
+-35.9170656150349
+33
+269.89501795793154
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.803547347521036
+20
+-35.9170656150349
+30
+269.89501795793154
+11
+32.15157997307879
+21
+-31.42154279347379
+31
+272.90501341009013
+12
+33.26808323863559
+22
+-34.08289717142753
+32
+272.61417495726346
+13
+33.26808323863559
+23
+-34.08289717142753
+33
+272.61417495726346
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.68841870190421
+20
+-28.405767079177412
+30
+269.90566580923985
+11
+40.057457455919256
+21
+-29.276761316041373
+31
+271.91080832239624
+12
+38.583794835113494
+22
+-27.97772345666017
+32
+269.9363924658669
+13
+38.583794835113494
+23
+-27.97772345666017
+33
+269.9363924658669
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.057457455919256
+20
+-29.276761316041373
+30
+271.91080832239624
+11
+38.28960991473386
+21
+-29.44104245048306
+31
+271.772386255413
+12
+38.583794835113494
+22
+-27.97772345666017
+32
+269.9363924658669
+13
+38.583794835113494
+23
+-27.97772345666017
+33
+269.9363924658669
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.583794835113494
+20
+-27.97772345666017
+30
+269.9363924658669
+11
+38.28960991473386
+21
+-29.44104245048306
+31
+271.772386255413
+12
+35.72469464718358
+22
+-29.067759206112502
+32
+270.05473572752925
+13
+35.72469464718358
+23
+-29.067759206112502
+33
+270.05473572752925
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.28960991473386
+20
+-29.44104245048306
+30
+271.772386255413
+11
+35.943736159772385
+21
+-29.902854972857973
+31
+272.37414196638593
+12
+35.72469464718358
+22
+-29.067759206112502
+32
+270.05473572752925
+13
+35.72469464718358
+23
+-29.067759206112502
+33
+270.05473572752925
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+42.4231057918783
+20
+-32.716625736653036
+30
+265.35325303926817
+11
+38.5914004431895
+21
+-32.60041204525381
+31
+273.2749501869068
+12
+40.057457455919256
+22
+-29.276761316041373
+32
+271.91080832239624
+13
+40.057457455919256
+23
+-29.276761316041373
+33
+271.91080832239624
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.057457455919256
+20
+-29.276761316041373
+30
+271.91080832239624
+11
+38.5914004431895
+21
+-32.60041204525381
+31
+273.2749501869068
+12
+38.23515376090967
+22
+-31.41941322321268
+32
+273.79213153607503
+13
+38.23515376090967
+23
+-31.41941322321268
+33
+273.79213153607503
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.868882326137026
+20
+-37.21184433389341
+30
+270.4791286581679
+11
+33.26808323863559
+21
+-34.08289717142753
+31
+272.61417495726346
+12
+35.110465738965836
+22
+-34.49694647508531
+32
+273.78695972258254
+13
+35.110465738965836
+23
+-34.49694647508531
+33
+273.78695972258254
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.868882326137026
+20
+-37.21184433389341
+30
+270.4791286581679
+11
+35.110465738965836
+21
+-34.49694647508531
+31
+273.78695972258254
+12
+36.06968502951094
+22
+-35.00956445940748
+32
+272.9722469854813
+13
+36.06968502951094
+23
+-35.00956445940748
+33
+272.9722469854813
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.06968502951094
+20
+-35.00956445940748
+30
+272.9722469854813
+11
+38.83052076109894
+21
+-37.770095966671406
+31
+269.0495785642029
+12
+36.868882326137026
+22
+-37.21184433389341
+32
+270.4791286581679
+13
+36.868882326137026
+23
+-37.21184433389341
+33
+270.4791286581679
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.83052076109894
+20
+-37.770095966671406
+30
+269.0495785642029
+11
+36.06968502951094
+21
+-35.00956445940748
+31
+272.9722469854813
+12
+36.99787343910598
+22
+-34.50607320477633
+32
+273.10793103355695
+13
+36.99787343910598
+23
+-34.50607320477633
+33
+273.10793103355695
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.99787343910598
+20
+-34.50607320477633
+30
+273.10793103355695
+11
+40.70788905857879
+21
+-37.171990947574585
+31
+268.4225722344176
+12
+38.83052076109894
+22
+-37.770095966671406
+32
+269.0495785642029
+13
+38.83052076109894
+23
+-37.770095966671406
+33
+269.0495785642029
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.75234976024519
+20
+-33.5520257277229
+30
+273.1861166845788
+11
+40.70788905857879
+21
+-37.171990947574585
+31
+268.4225722344176
+12
+36.99787343910598
+22
+-34.50607320477633
+32
+273.10793103355695
+13
+36.99787343910598
+23
+-34.50607320477633
+33
+273.10793103355695
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+51.12678113945886
+20
+-24.703965516424564
+30
+261.4713506772798
+11
+50.17242943808238
+21
+-29.65095723337649
+31
+255.778096695908
+12
+48.48678330898237
+22
+-25.057474179797175
+32
+262.06428388288464
+13
+48.48678330898237
+23
+-25.057474179797175
+33
+262.06428388288464
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+48.804515191965315
+20
+-23.71554069086823
+30
+264.02592231784666
+11
+48.48678330898237
+21
+-25.057474179797175
+31
+262.06428388288464
+12
+47.51886320279832
+22
+-23.37693901932493
+32
+265.16098326710926
+13
+47.51886320279832
+23
+-23.37693901932493
+33
+265.16098326710926
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+48.48678330898237
+20
+-25.057474179797175
+30
+262.06428388288464
+11
+46.33695170778788
+21
+-24.186784167257358
+31
+264.62767802881996
+12
+47.51886320279832
+22
+-23.37693901932493
+32
+265.16098326710926
+13
+47.51886320279832
+23
+-23.37693901932493
+33
+265.16098326710926
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.57286638642966
+20
+-19.352963898475107
+30
+265.7453981916702
+11
+49.804226739907065
+21
+-19.650191062083966
+31
+261.0229240251202
+12
+50.02755781545073
+22
+-20.481331912630978
+32
+268.249164370289
+13
+50.02755781545073
+23
+-20.481331912630978
+33
+268.249164370289
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.02755781545073
+20
+-20.481331912630978
+30
+268.249164370289
+11
+49.804226739907065
+21
+-19.650191062083966
+31
+261.0229240251202
+12
+47.10025053429524
+22
+-20.514796588164142
+32
+263.04905801656633
+13
+47.10025053429524
+23
+-20.514796588164142
+33
+263.04905801656633
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.70865522987268
+20
+-22.401900063980527
+30
+260.36732060896827
+11
+53.57286638642966
+21
+-19.352963898475107
+31
+265.7453981916702
+12
+53.68603783460055
+22
+-22.490125117663016
+32
+263.5711069549022
+13
+53.68603783460055
+23
+-22.490125117663016
+33
+263.5711069549022
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.70865522987268
+20
+-22.401900063980527
+30
+260.36732060896827
+11
+49.804226739907065
+21
+-19.650191062083966
+31
+261.0229240251202
+12
+53.57286638642966
+22
+-19.352963898475107
+32
+265.7453981916702
+13
+53.57286638642966
+23
+-19.352963898475107
+33
+265.7453981916702
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.68603783460055
+20
+-22.490125117663016
+30
+263.5711069549022
+11
+51.69187781950566
+21
+-23.439000781224696
+31
+263.3207303370402
+12
+49.42318577529947
+22
+-23.557039818563485
+32
+260.4020021817945
+13
+49.42318577529947
+23
+-23.557039818563485
+33
+260.4020021817945
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.68603783460055
+20
+-22.490125117663016
+30
+263.5711069549022
+11
+49.42318577529947
+21
+-23.557039818563485
+31
+260.4020021817945
+12
+50.70865522987268
+22
+-22.401900063980527
+32
+260.36732060896827
+13
+50.70865522987268
+23
+-22.401900063980527
+33
+260.36732060896827
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.10025053429524
+20
+-20.514796588164142
+30
+263.04905801656633
+11
+48.804515191965315
+21
+-23.71554069086823
+31
+264.02592231784666
+12
+50.02755781545073
+22
+-20.481331912630978
+32
+268.249164370289
+13
+50.02755781545073
+23
+-20.481331912630978
+33
+268.249164370289
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.242627517477985
+20
+-24.174919418657957
+30
+260.90397231481035
+11
+48.804515191965315
+21
+-23.71554069086823
+31
+264.02592231784666
+12
+47.10025053429524
+22
+-20.514796588164142
+32
+263.04905801656633
+13
+47.10025053429524
+23
+-20.514796588164142
+33
+263.04905801656633
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+51.69187781950566
+20
+-23.439000781224696
+30
+263.3207303370402
+11
+48.804515191965315
+21
+-23.71554069086823
+31
+264.02592231784666
+12
+47.242627517477985
+22
+-24.174919418657957
+32
+260.90397231481035
+13
+47.242627517477985
+23
+-24.174919418657957
+33
+260.90397231481035
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+51.69187781950566
+20
+-23.439000781224696
+30
+263.3207303370402
+11
+47.242627517477985
+21
+-24.174919418657957
+31
+260.90397231481035
+12
+49.42318577529947
+22
+-23.557039818563485
+32
+260.4020021817945
+13
+49.42318577529947
+23
+-23.557039818563485
+33
+260.4020021817945
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+49.804226739907065
+20
+-19.650191062083966
+30
+261.0229240251202
+11
+47.57088556203812
+21
+-22.55401222549905
+31
+254.37288454778806
+12
+47.10025053429524
+22
+-20.514796588164142
+32
+263.04905801656633
+13
+47.10025053429524
+23
+-20.514796588164142
+33
+263.04905801656633
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.57088556203812
+20
+-22.55401222549905
+30
+254.37288454778806
+11
+45.701427096957325
+21
+-23.086404790819394
+31
+255.8745358063134
+12
+47.10025053429524
+22
+-20.514796588164142
+32
+263.04905801656633
+13
+47.10025053429524
+23
+-20.514796588164142
+33
+263.04905801656633
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+48.96298564183685
+20
+-23.89655416307475
+30
+255.16964804982948
+11
+49.804226739907065
+21
+-19.650191062083966
+31
+261.0229240251202
+12
+50.70865522987268
+22
+-22.401900063980527
+32
+260.36732060896827
+13
+50.70865522987268
+23
+-22.401900063980527
+33
+260.36732060896827
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.57088556203812
+20
+-22.55401222549905
+30
+254.37288454778806
+11
+49.804226739907065
+21
+-19.650191062083966
+31
+261.0229240251202
+12
+48.96298564183685
+22
+-23.89655416307475
+32
+255.16964804982948
+13
+48.96298564183685
+23
+-23.89655416307475
+33
+255.16964804982948
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.70865522987268
+20
+-22.401900063980527
+30
+260.36732060896827
+11
+49.42318577529947
+21
+-23.557039818563485
+31
+260.4020021817945
+12
+48.44157557457861
+22
+-24.873418464356323
+32
+255.6752688747217
+13
+48.44157557457861
+23
+-24.873418464356323
+33
+255.6752688747217
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+48.96298564183685
+20
+-23.89655416307475
+30
+255.16964804982948
+11
+50.70865522987268
+21
+-22.401900063980527
+31
+260.36732060896827
+12
+48.44157557457861
+22
+-24.873418464356323
+32
+255.6752688747217
+13
+48.44157557457861
+23
+-24.873418464356323
+33
+255.6752688747217
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.701427096957325
+20
+-23.086404790819394
+30
+255.8745358063134
+11
+47.242627517477985
+21
+-24.174919418657957
+31
+260.90397231481035
+12
+47.10025053429524
+22
+-20.514796588164142
+32
+263.04905801656633
+13
+47.10025053429524
+23
+-20.514796588164142
+33
+263.04905801656633
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.701427096957325
+20
+-23.086404790819394
+30
+255.8745358063134
+11
+47.131585639568364
+21
+-25.689348098749743
+31
+256.21526704811754
+12
+47.242627517477985
+22
+-24.174919418657957
+32
+260.90397231481035
+13
+47.242627517477985
+23
+-24.174919418657957
+33
+260.90397231481035
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+49.42318577529947
+20
+-23.557039818563485
+30
+260.4020021817945
+11
+47.242627517477985
+21
+-24.174919418657957
+31
+260.90397231481035
+12
+47.131585639568364
+22
+-25.689348098749743
+32
+256.21526704811754
+13
+47.131585639568364
+23
+-25.689348098749743
+33
+256.21526704811754
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+49.42318577529947
+20
+-23.557039818563485
+30
+260.4020021817945
+11
+47.131585639568364
+21
+-25.689348098749743
+31
+256.21526704811754
+12
+48.44157557457861
+22
+-24.873418464356323
+32
+255.6752688747217
+13
+48.44157557457861
+23
+-24.873418464356323
+33
+255.6752688747217
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.701427096957325
+20
+-23.086404790819394
+30
+255.8745358063134
+11
+45.856277277384685
+21
+-29.05924092506093
+31
+244.96687692803573
+12
+44.54324509914407
+22
+-29.433132618077497
+32
+246.02131843169224
+13
+44.54324509914407
+23
+-29.433132618077497
+33
+246.02131843169224
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.856277277384685
+20
+-29.05924092506093
+30
+244.96687692803573
+11
+45.701427096957325
+21
+-23.086404790819394
+31
+255.8745358063134
+12
+47.57088556203812
+22
+-22.55401222549905
+32
+254.37288454778806
+13
+47.57088556203812
+23
+-22.55401222549905
+33
+254.37288454778806
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+46.83405425163524
+20
+-30.002336326485057
+30
+245.52634545810602
+11
+47.57088556203812
+21
+-22.55401222549905
+31
+254.37288454778806
+12
+48.96298564183685
+22
+-23.89655416307475
+32
+255.16964804982948
+13
+48.96298564183685
+23
+-23.89655416307475
+33
+255.16964804982948
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.57088556203812
+20
+-22.55401222549905
+30
+254.37288454778806
+11
+46.83405425163524
+21
+-30.002336326485057
+31
+245.52634545810602
+12
+45.856277277384685
+22
+-29.05924092506093
+32
+244.96687692803573
+13
+45.856277277384685
+23
+-29.05924092506093
+33
+244.96687692803573
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+46.46776816669508
+20
+-30.68836217494036
+30
+245.88167946741655
+11
+48.96298564183685
+21
+-23.89655416307475
+31
+255.16964804982948
+12
+48.44157557457861
+22
+-24.873418464356323
+32
+255.6752688747217
+13
+48.44157557457861
+23
+-24.873418464356323
+33
+255.6752688747217
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+48.96298564183685
+20
+-23.89655416307475
+30
+255.16964804982948
+11
+46.46776816669508
+21
+-30.68836217494036
+31
+245.88167946741655
+12
+46.83405425163524
+22
+-30.002336326485057
+32
+245.52634545810602
+13
+46.83405425163524
+23
+-30.002336326485057
+33
+245.52634545810602
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.701427096957325
+20
+-23.086404790819394
+30
+255.8745358063134
+11
+45.54779381382213
+21
+-31.26152079954778
+31
+246.2607429739243
+12
+47.131585639568364
+22
+-25.689348098749743
+32
+256.21526704811754
+13
+47.131585639568364
+23
+-25.689348098749743
+33
+256.21526704811754
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.54779381382213
+20
+-31.26152079954778
+30
+246.2607429739243
+11
+45.701427096957325
+21
+-23.086404790819394
+31
+255.8745358063134
+12
+44.54324509914407
+22
+-29.433132618077497
+32
+246.02131843169224
+13
+44.54324509914407
+23
+-29.433132618077497
+33
+246.02131843169224
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+46.46776816669508
+20
+-30.68836217494036
+30
+245.88167946741655
+11
+47.131585639568364
+21
+-25.689348098749743
+31
+256.21526704811754
+12
+45.54779381382213
+22
+-31.26152079954778
+32
+246.2607429739243
+13
+45.54779381382213
+23
+-31.26152079954778
+33
+246.2607429739243
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.131585639568364
+20
+-25.689348098749743
+30
+256.21526704811754
+11
+46.46776816669508
+21
+-30.68836217494036
+31
+245.88167946741655
+12
+48.44157557457861
+22
+-24.873418464356323
+32
+255.6752688747217
+13
+48.44157557457861
+23
+-24.873418464356323
+33
+255.6752688747217
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.54324509914407
+20
+-29.433132618077497
+30
+246.02131843169224
+11
+44.50126214256455
+21
+-34.82337917369852
+31
+239.94656714922786
+12
+44.03640737695941
+22
+-34.95571675422097
+32
+240.31985039359822
+13
+44.03640737695941
+23
+-34.95571675422097
+33
+240.31985039359822
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.50126214256455
+20
+-34.82337917369852
+30
+239.94656714922786
+11
+44.54324509914407
+21
+-29.433132618077497
+31
+246.02131843169224
+12
+45.856277277384685
+22
+-29.05924092506093
+32
+244.96687692803573
+13
+45.856277277384685
+23
+-29.05924092506093
+33
+244.96687692803573
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.847469422184055
+20
+-35.15711325607339
+30
+240.1446171835271
+11
+45.856277277384685
+21
+-29.05924092506093
+31
+244.96687692803573
+12
+46.83405425163524
+22
+-30.002336326485057
+32
+245.52634545810602
+13
+46.83405425163524
+23
+-30.002336326485057
+33
+245.52634545810602
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.856277277384685
+20
+-29.05924092506093
+30
+244.96687692803573
+11
+44.847469422184055
+21
+-35.15711325607339
+31
+240.1446171835271
+12
+44.50126214256455
+22
+-34.82337917369852
+32
+239.94656714922786
+13
+44.50126214256455
+23
+-34.82337917369852
+33
+239.94656714922786
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.71756563624597
+20
+-35.40018849018243
+30
+240.2702618289426
+11
+46.83405425163524
+21
+-30.002336326485057
+31
+245.52634545810602
+12
+46.46776816669508
+22
+-30.68836217494036
+32
+245.88167946741655
+13
+46.46776816669508
+23
+-30.68836217494036
+33
+245.88167946741655
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+46.83405425163524
+20
+-30.002336326485057
+30
+245.52634545810602
+11
+44.71756563624597
+21
+-35.40018849018243
+31
+240.2702618289426
+12
+44.847469422184055
+22
+-35.15711325607339
+32
+240.1446171835271
+13
+44.847469422184055
+23
+-35.15711325607339
+33
+240.1446171835271
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.54324509914407
+20
+-29.433132618077497
+30
+246.02131843169224
+11
+44.39204561059317
+21
+-35.602801889327
+31
+240.40442475540317
+12
+45.54779381382213
+22
+-31.26152079954778
+32
+246.2607429739243
+13
+45.54779381382213
+23
+-31.26152079954778
+33
+246.2607429739243
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.39204561059317
+20
+-35.602801889327
+30
+240.40442475540317
+11
+44.54324509914407
+21
+-29.433132618077497
+31
+246.02131843169224
+12
+44.03640737695941
+22
+-34.95571675422097
+32
+240.31985039359822
+13
+44.03640737695941
+23
+-34.95571675422097
+33
+240.31985039359822
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.71756563624597
+20
+-35.40018849018243
+30
+240.2702618289426
+11
+45.54779381382213
+21
+-31.26152079954778
+31
+246.2607429739243
+12
+44.39204561059317
+22
+-35.602801889327
+32
+240.40442475540317
+13
+44.39204561059317
+23
+-35.602801889327
+33
+240.40442475540317
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.54779381382213
+20
+-31.26152079954778
+30
+246.2607429739243
+11
+44.71756563624597
+21
+-35.40018849018243
+31
+240.2702618289426
+12
+46.46776816669508
+22
+-30.68836217494036
+32
+245.88167946741655
+13
+46.46776816669508
+23
+-30.68836217494036
+33
+245.88167946741655
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.50126214256455
+20
+-34.82337917369852
+30
+239.94656714922786
+11
+44.847469422184055
+21
+-35.15711325607339
+31
+240.1446171835271
+12
+44.71756563624597
+22
+-35.40018849018243
+32
+240.2702618289426
+13
+44.71756563624597
+23
+-35.40018849018243
+33
+240.2702618289426
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.50126214256455
+20
+-34.82337917369852
+30
+239.94656714922786
+11
+44.39204561059317
+21
+-35.602801889327
+31
+240.40442475540317
+12
+44.03640737695941
+22
+-34.95571675422097
+32
+240.31985039359822
+13
+44.03640737695941
+23
+-34.95571675422097
+33
+240.31985039359822
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.50126214256455
+20
+-34.82337917369852
+30
+239.94656714922786
+11
+44.71756563624597
+21
+-35.40018849018243
+31
+240.2702618289426
+12
+44.39204561059317
+22
+-35.602801889327
+32
+240.40442475540317
+13
+44.39204561059317
+23
+-35.602801889327
+33
+240.40442475540317
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.77337053887001
+20
+-1.111673488994261
+30
+256.1233913025658
+11
+40.58224441316325
+21
+-6.289875691456865
+31
+251.0291550132596
+12
+34.738095167564865
+22
+-8.703591470455816
+32
+249.94489952594444
+13
+34.738095167564865
+23
+-8.703591470455816
+33
+249.94489952594444
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.77337053887001
+20
+-1.111673488994261
+30
+256.1233913025658
+11
+39.13717887872326
+21
+-3.2269452070905293
+31
+252.8794473459897
+12
+40.58224441316325
+22
+-6.289875691456865
+32
+251.0291550132596
+13
+40.58224441316325
+23
+-6.289875691456865
+33
+251.0291550132596
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.35584291615144
+20
+0.27893589162312954
+30
+250.17519733848803
+11
+40.58224441316325
+21
+-6.289875691456865
+31
+251.0291550132596
+12
+39.13717887872326
+22
+-3.2269452070905293
+32
+252.8794473459897
+13
+39.13717887872326
+23
+-3.2269452070905293
+33
+252.8794473459897
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.57802922314326
+20
+0.8682184053505946
+30
+254.14289095957588
+11
+44.35584291615144
+21
+0.27893589162312954
+31
+250.17519733848803
+12
+39.13717887872326
+22
+-3.2269452070905293
+32
+252.8794473459897
+13
+39.13717887872326
+23
+-3.2269452070905293
+33
+252.8794473459897
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.87248906751094
+20
+4.79058260230604
+30
+251.260973947419
+11
+44.35584291615144
+21
+0.27893589162312954
+31
+250.17519733848803
+12
+37.57802922314326
+22
+0.8682184053505946
+32
+254.14289095957588
+13
+37.57802922314326
+23
+0.8682184053505946
+33
+254.14289095957588
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.87248906751094
+20
+4.79058260230604
+30
+251.260973947419
+11
+37.57802922314326
+21
+0.8682184053505946
+31
+254.14289095957588
+12
+36.63584649468839
+22
+3.1985767198370456
+32
+253.89068899577632
+13
+36.63584649468839
+23
+3.1985767198370456
+33
+253.89068899577632
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.87248906751094
+20
+4.79058260230604
+30
+251.260973947419
+11
+36.63584649468839
+21
+3.1985767198370456
+31
+253.89068899577632
+12
+32.26688099151096
+22
+8.102672807242747
+32
+250.3251799297488
+13
+32.26688099151096
+23
+8.102672807242747
+33
+250.3251799297488
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.63584649468839
+20
+3.1985767198370456
+30
+253.89068899577632
+11
+34.28175868300487
+21
+4.1529284212134385
+31
+254.0923897219521
+12
+32.26688099151096
+22
+8.102672807242747
+32
+250.3251799297488
+13
+32.26688099151096
+23
+8.102672807242747
+33
+250.3251799297488
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.31310843844554
+20
+1.4851853324750732
+30
+256.47264082541614
+11
+35.77337053887001
+21
+-1.111673488994261
+31
+256.1233913025658
+12
+34.738095167564865
+22
+-8.703591470455816
+32
+249.94489952594444
+13
+34.738095167564865
+23
+-8.703591470455816
+33
+249.94489952594444
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.26688099151096
+20
+8.102672807242747
+30
+250.3251799297488
+11
+34.28175868300487
+21
+4.1529284212134385
+31
+254.0923897219521
+12
+33.31310843844554
+22
+1.4851853324750732
+32
+256.47264082541614
+13
+33.31310843844554
+23
+1.4851853324750732
+33
+256.47264082541614
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.53723580781222
+20
+29.979443877044822
+30
+266.9461715947217
+11
+60.47449937891509
+21
+55.661452779434676
+31
+270.16912407301413
+12
+75.57265056125725
+22
+38.636146989145686
+32
+276.050692910342
+13
+75.57265056125725
+23
+38.636146989145686
+33
+276.050692910342
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+57.15799792129453
+20
+50.89060694552399
+30
+259.98886555112534
+11
+60.47449937891509
+21
+55.661452779434676
+31
+270.16912407301413
+12
+75.53723580781222
+22
+29.979443877044822
+32
+266.9461715947217
+13
+75.53723580781222
+23
+29.979443877044822
+33
+266.9461715947217
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+60.6309619482546
+20
+39.40309650753487
+30
+255.32845314647267
+11
+57.15799792129453
+21
+50.89060694552399
+31
+259.98886555112534
+12
+75.53723580781222
+22
+29.979443877044822
+32
+266.9461715947217
+13
+75.53723580781222
+23
+29.979443877044822
+33
+266.9461715947217
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.53723580781222
+20
+29.979443877044822
+30
+266.9461715947217
+11
+68.86810929645328
+21
+32.97361966440619
+31
+259.1069192386278
+12
+60.6309619482546
+22
+39.40309650753487
+32
+255.32845314647267
+13
+60.6309619482546
+23
+39.40309650753487
+33
+255.32845314647267
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+76.14204897323182
+20
+45.24481195854033
+30
+289.3361690975005
+11
+77.95973150077444
+21
+47.60650537829655
+31
+302.52459772560815
+12
+87.5509813108242
+22
+27.796025910575093
+32
+312.14295392283566
+13
+87.5509813108242
+23
+27.796025910575093
+33
+312.14295392283566
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+76.14204897323182
+20
+45.24481195854033
+30
+289.3361690975005
+11
+87.5509813108242
+21
+27.796025910575093
+31
+312.14295392283566
+12
+85.73570519767682
+22
+21.969217451393796
+32
+297.36860389871964
+13
+85.73570519767682
+23
+21.969217451393796
+33
+297.36860389871964
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.95973150077444
+20
+47.60650537829655
+30
+302.52459772560815
+11
+76.70783320024876
+21
+53.667262341895125
+31
+317.8082192664932
+12
+88.41835527824354
+22
+32.11023103560109
+32
+329.6586693218647
+13
+88.41835527824354
+23
+32.11023103560109
+33
+329.6586693218647
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.95973150077444
+20
+47.60650537829655
+30
+302.52459772560815
+11
+88.41835527824354
+21
+32.11023103560109
+31
+329.6586693218647
+12
+87.5509813108242
+22
+27.796025910575093
+32
+312.14295392283566
+13
+87.5509813108242
+23
+27.796025910575093
+33
+312.14295392283566
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.75516208918426
+20
+61.847854388449896
+30
+282.7125971362779
+11
+62.26972710917412
+21
+66.90132461846463
+31
+294.1219219232483
+12
+77.95973150077444
+22
+47.60650537829655
+32
+302.52459772560815
+13
+77.95973150077444
+23
+47.60650537829655
+33
+302.52459772560815
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.75516208918426
+20
+61.847854388449896
+30
+282.7125971362779
+11
+77.95973150077444
+21
+47.60650537829655
+31
+302.52459772560815
+12
+76.14204897323182
+22
+45.24481195854033
+32
+289.3361690975005
+13
+76.14204897323182
+23
+45.24481195854033
+33
+289.3361690975005
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+62.26972710917412
+20
+66.90132461846463
+30
+294.1219219232483
+11
+61.0541075591709
+21
+72.0390649859604
+31
+308.2327586988137
+12
+76.70783320024876
+22
+53.667262341895125
+32
+317.8082192664932
+13
+76.70783320024876
+23
+53.667262341895125
+33
+317.8082192664932
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+62.26972710917412
+20
+66.90132461846463
+30
+294.1219219232483
+11
+76.70783320024876
+21
+53.667262341895125
+31
+317.8082192664932
+12
+77.95973150077444
+22
+47.60650537829655
+32
+302.52459772560815
+13
+77.95973150077444
+23
+47.60650537829655
+33
+302.52459772560815
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+62.26972710917412
+20
+66.90132461846463
+30
+294.1219219232483
+11
+38.22420168528024
+21
+81.98446233046919
+31
+275.43098796432076
+12
+38.4544994978215
+22
+86.81158966414226
+32
+286.9337096184644
+13
+38.4544994978215
+23
+86.81158966414226
+33
+286.9337096184644
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.22420168528024
+20
+81.98446233046919
+30
+275.43098796432076
+11
+62.26972710917412
+21
+66.90132461846463
+31
+294.1219219232483
+12
+61.75516208918426
+22
+61.847854388449896
+32
+282.7125971362779
+13
+61.75516208918426
+23
+61.847854388449896
+33
+282.7125971362779
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.0541075591709
+20
+72.0390649859604
+30
+308.2327586988137
+11
+38.4544994978215
+21
+86.81158966414226
+31
+286.9337096184644
+12
+37.35077365383238
+22
+91.88787671838405
+32
+300.0013611903258
+13
+37.35077365383238
+23
+91.88787671838405
+33
+300.0013611903258
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+62.26972710917412
+20
+66.90132461846463
+30
+294.1219219232483
+11
+38.4544994978215
+21
+86.81158966414226
+31
+286.9337096184644
+12
+61.0541075591709
+22
+72.0390649859604
+32
+308.2327586988137
+13
+61.0541075591709
+23
+72.0390649859604
+33
+308.2327586988137
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.4544994978215
+20
+86.81158966414226
+30
+286.9337096184644
+11
+14.294220659276885
+21
+89.8565709134533
+31
+271.43895639739196
+12
+13.930064144598031
+22
+94.99491972959613
+32
+283.2687191988036
+13
+13.930064144598031
+23
+94.99491972959613
+33
+283.2687191988036
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.4544994978215
+20
+86.81158966414226
+30
+286.9337096184644
+11
+38.22420168528024
+21
+81.98446233046919
+31
+275.43098796432076
+12
+14.294220659276885
+22
+89.8565709134533
+32
+271.43895639739196
+13
+14.294220659276885
+23
+89.8565709134533
+33
+271.43895639739196
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.35077365383238
+20
+91.88787671838405
+30
+300.0013611903258
+11
+13.930064144598031
+21
+94.99491972959613
+31
+283.2687191988036
+12
+14.647425098326345
+22
+98.81293498374522
+32
+293.5079972393619
+13
+14.647425098326345
+23
+98.81293498374522
+33
+293.5079972393619
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.4544994978215
+20
+86.81158966414226
+30
+286.9337096184644
+11
+13.930064144598031
+21
+94.99491972959613
+31
+283.2687191988036
+12
+37.35077365383238
+22
+91.88787671838405
+32
+300.0013611903258
+13
+37.35077365383238
+23
+91.88787671838405
+33
+300.0013611903258
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+90.63341257429785
+20
+2.857541253695383
+30
+307.5345638774193
+11
+92.63736861259457
+21
+7.527993061001994
+31
+320.9706311044821
+12
+93.16912230683617
+22
+-16.457052567474474
+32
+332.2092860462195
+13
+93.16912230683617
+23
+-16.457052567474474
+33
+332.2092860462195
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+90.63341257429785
+20
+2.857541253695383
+30
+307.5345638774193
+11
+93.16912230683617
+21
+-16.457052567474474
+31
+332.2092860462195
+12
+92.42721045023855
+22
+-21.132067739627296
+32
+321.1692895874198
+13
+92.42721045023855
+23
+-21.132067739627296
+33
+321.1692895874198
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+92.63736861259457
+20
+7.527993061001994
+30
+320.9706311044821
+11
+92.92489102029971
+21
+12.684291112202292
+31
+338.9797983554822
+12
+92.55568438185834
+22
+-8.98895388549282
+32
+348.67177683888497
+13
+92.55568438185834
+23
+-8.98895388549282
+33
+348.67177683888497
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+92.63736861259457
+20
+7.527993061001994
+30
+320.9706311044821
+11
+92.55568438185834
+21
+-8.98895388549282
+31
+348.67177683888497
+12
+93.16912230683617
+22
+-16.457052567474474
+32
+332.2092860462195
+13
+93.16912230683617
+23
+-16.457052567474474
+33
+332.2092860462195
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+85.73570519767682
+20
+21.969217451393796
+30
+297.36860389871964
+11
+87.5509813108242
+21
+27.796025910575093
+31
+312.14295392283566
+12
+92.63736861259457
+22
+7.527993061001994
+32
+320.9706311044821
+13
+92.63736861259457
+23
+7.527993061001994
+33
+320.9706311044821
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+85.73570519767682
+20
+21.969217451393796
+30
+297.36860389871964
+11
+92.63736861259457
+21
+7.527993061001994
+31
+320.9706311044821
+12
+90.63341257429785
+22
+2.857541253695383
+32
+307.5345638774193
+13
+90.63341257429785
+23
+2.857541253695383
+33
+307.5345638774193
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+87.5509813108242
+20
+27.796025910575093
+30
+312.14295392283566
+11
+88.41835527824354
+21
+32.11023103560109
+31
+329.6586693218647
+12
+92.92489102029971
+22
+12.684291112202292
+32
+338.9797983554822
+13
+92.92489102029971
+23
+12.684291112202292
+33
+338.9797983554822
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+87.5509813108242
+20
+27.796025910575093
+30
+312.14295392283566
+11
+92.92489102029971
+21
+12.684291112202292
+31
+338.9797983554822
+12
+92.63736861259457
+22
+7.527993061001994
+32
+320.9706311044821
+13
+92.63736861259457
+23
+7.527993061001994
+33
+320.9706311044821
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.930064144598031
+20
+94.99491972959613
+30
+283.2687191988036
+11
+0.020623870886214313
+21
+92.5705560992921
+31
+274.17636685610654
+12
+0.020623870886214313
+22
+96.50934840968858
+32
+284.1865639814157
+13
+0.020623870886214313
+23
+96.50934840968858
+33
+284.1865639814157
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.294220659276885
+20
+89.8565709134533
+30
+271.43895639739196
+11
+0.020623870886214313
+21
+92.5705560992921
+31
+274.17636685610654
+12
+13.930064144598031
+22
+94.99491972959613
+32
+283.2687191988036
+13
+13.930064144598031
+23
+94.99491972959613
+33
+283.2687191988036
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.647425098326345
+20
+98.81293498374522
+30
+293.5079972393619
+11
+0.020623870886214313
+21
+96.50934840968858
+31
+284.1865639814157
+12
+0.020623870886214313
+22
+99.09829739875687
+32
+292.78363912620364
+13
+0.020623870886214313
+23
+99.09829739875687
+33
+292.78363912620364
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.647425098326345
+20
+98.81293498374522
+30
+293.5079972393619
+11
+13.930064144598031
+21
+94.99491972959613
+31
+283.2687191988036
+12
+0.020623870886214313
+22
+96.50934840968858
+32
+284.1865639814157
+13
+0.020623870886214313
+23
+96.50934840968858
+33
+284.1865639814157
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.957110809013557
+20
+-99.86593099104559
+30
+400.09603105960446
+11
+0.020623870886214313
+21
+-101.2501516608779
+31
+401.412713929721
+12
+16.492849841886972
+22
+-110.78149970171967
+32
+395.32518522568876
+13
+16.492849841886972
+23
+-110.78149970171967
+33
+395.32518522568876
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-101.2501516608779
+30
+401.412713929721
+11
+0.020623870886214313
+21
+-114.34031583264124
+31
+394.6866183716268
+12
+16.492849841886972
+22
+-110.78149970171967
+32
+395.32518522568876
+13
+16.492849841886972
+23
+-110.78149970171967
+33
+395.32518522568876
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-89.42860291619074
+30
+405.84282852183264
+11
+15.957110809013557
+21
+-99.86593099104559
+31
+400.09603105960446
+12
+15.452402657090182
+22
+-89.58619111552514
+32
+404.5891200865852
+13
+15.452402657090182
+23
+-89.58619111552514
+33
+404.5891200865852
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-89.42860291619074
+30
+405.84282852183264
+11
+0.020623870886214313
+21
+-101.2501516608779
+31
+401.412713929721
+12
+15.957110809013557
+22
+-99.86593099104559
+32
+400.09603105960446
+13
+15.957110809013557
+23
+-99.86593099104559
+33
+400.09603105960446
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+88.24859810598728
+20
+-43.55583414226228
+30
+331.6866286592298
+11
+89.03952050102662
+21
+-36.28091790540956
+31
+342.260857679456
+12
+85.81833252381449
+22
+-49.82224674824562
+32
+352.668980219297
+13
+85.81833252381449
+23
+-49.82224674824562
+33
+352.668980219297
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+88.24859810598728
+20
+-43.55583414226228
+30
+331.6866286592298
+11
+85.81833252381449
+21
+-49.82224674824562
+31
+352.668980219297
+12
+85.93162566171459
+22
+-55.624108812938914
+32
+342.9228498063858
+13
+85.93162566171459
+23
+-55.624108812938914
+33
+342.9228498063858
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+89.03952050102662
+20
+-36.28091790540956
+30
+342.260857679456
+11
+89.36239377506898
+21
+-25.811646276637916
+31
+357.53930740685036
+12
+84.01467777980731
+22
+-42.674192054101475
+32
+367.1722663715848
+13
+84.01467777980731
+23
+-42.674192054101475
+33
+367.1722663715848
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+89.03952050102662
+20
+-36.28091790540956
+30
+342.260857679456
+11
+84.01467777980731
+21
+-42.674192054101475
+31
+367.1722663715848
+12
+85.81833252381449
+22
+-49.82224674824562
+32
+352.668980219297
+13
+85.81833252381449
+23
+-49.82224674824562
+33
+352.668980219297
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+92.42721045023855
+20
+-21.132067739627296
+30
+321.1692895874198
+11
+93.16912230683617
+21
+-16.457052567474474
+31
+332.2092860462195
+12
+89.03952050102662
+22
+-36.28091790540956
+32
+342.260857679456
+13
+89.03952050102662
+23
+-36.28091790540956
+33
+342.260857679456
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+92.42721045023855
+20
+-21.132067739627296
+30
+321.1692895874198
+11
+89.03952050102662
+21
+-36.28091790540956
+31
+342.260857679456
+12
+88.24859810598728
+22
+-43.55583414226228
+32
+331.6866286592298
+13
+88.24859810598728
+23
+-43.55583414226228
+33
+331.6866286592298
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+93.16912230683617
+20
+-16.457052567474474
+30
+332.2092860462195
+11
+92.55568438185834
+21
+-8.98895388549282
+31
+348.67177683888497
+12
+89.36239377506898
+22
+-25.811646276637916
+32
+357.53930740685036
+13
+89.36239377506898
+23
+-25.811646276637916
+33
+357.53930740685036
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+93.16912230683617
+20
+-16.457052567474474
+30
+332.2092860462195
+11
+89.36239377506898
+21
+-25.811646276637916
+31
+357.53930740685036
+12
+89.03952050102662
+22
+-36.28091790540956
+32
+342.260857679456
+13
+89.03952050102662
+23
+-36.28091790540956
+33
+342.260857679456
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.60121441994757
+20
+-88.86426679694232
+30
+370.0158511190277
+11
+68.75323419207338
+21
+-79.76217927591023
+31
+376.54724311037575
+12
+51.40283429018535
+22
+-90.61872846791874
+32
+388.48074640594007
+13
+51.40283429018535
+23
+-90.61872846791874
+33
+388.48074640594007
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.60121441994757
+20
+-88.86426679694232
+30
+370.0158511190277
+11
+51.40283429018535
+21
+-90.61872846791874
+31
+388.48074640594007
+12
+53.764071373460304
+22
+-101.36332310904378
+32
+382.02419359805936
+13
+53.764071373460304
+23
+-101.36332310904378
+33
+382.02419359805936
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+42.4231057918783
+20
+-32.716625736653036
+30
+265.35325303926817
+11
+40.70788905857879
+21
+-37.171990947574585
+31
+268.4225722344176
+12
+37.75234976024519
+22
+-33.5520257277229
+32
+273.1861166845788
+13
+37.75234976024519
+23
+-33.5520257277229
+33
+273.1861166845788
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+42.4231057918783
+20
+-32.716625736653036
+30
+265.35325303926817
+11
+37.75234976024519
+21
+-33.5520257277229
+31
+273.1861166845788
+12
+38.5914004431895
+22
+-32.60041204525381
+32
+273.2749501869068
+13
+38.5914004431895
+23
+-32.60041204525381
+33
+273.2749501869068
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.5743931814343
+20
+-31.34792050729845
+30
+274.4979319655278
+11
+32.15157997307879
+21
+-31.42154279347379
+31
+272.90501341009013
+12
+35.943736159772385
+22
+-29.902854972857973
+32
+272.37414196638593
+13
+35.943736159772385
+23
+-29.902854972857973
+33
+272.37414196638593
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.5743931814343
+20
+-31.34792050729845
+30
+274.4979319655278
+11
+34.43417506884791
+21
+-32.76165093646522
+31
+274.04342082690545
+12
+32.15157997307879
+22
+-31.42154279347379
+32
+272.90501341009013
+13
+32.15157997307879
+23
+-31.42154279347379
+33
+272.90501341009013
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.15157997307879
+20
+-31.42154279347379
+30
+272.90501341009013
+11
+34.43417506884791
+21
+-32.76165093646522
+31
+274.04342082690545
+12
+33.26808323863559
+22
+-34.08289717142753
+32
+272.61417495726346
+13
+33.26808323863559
+23
+-34.08289717142753
+33
+272.61417495726346
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.43417506884791
+20
+-32.76165093646522
+30
+274.04342082690545
+11
+35.110465738965836
+21
+-34.49694647508531
+31
+273.78695972258254
+12
+33.26808323863559
+22
+-34.08289717142753
+32
+272.61417495726346
+13
+33.26808323863559
+23
+-34.08289717142753
+33
+272.61417495726346
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.057457455919256
+20
+-29.276761316041373
+30
+271.91080832239624
+11
+38.23515376090967
+21
+-31.41941322321268
+31
+273.79213153607503
+12
+38.28960991473386
+22
+-29.44104245048306
+32
+271.772386255413
+13
+38.28960991473386
+23
+-29.44104245048306
+33
+271.772386255413
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.28960991473386
+20
+-29.44104245048306
+30
+271.772386255413
+11
+38.23515376090967
+21
+-31.41941322321268
+31
+273.79213153607503
+12
+37.917543567655905
+22
+-30.856294001265702
+32
+274.1009192239608
+13
+37.917543567655905
+23
+-30.856294001265702
+33
+274.1009192239608
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.28960991473386
+20
+-29.44104245048306
+30
+271.772386255413
+11
+37.917543567655905
+21
+-30.856294001265702
+31
+274.1009192239608
+12
+35.943736159772385
+22
+-29.902854972857973
+32
+272.37414196638593
+13
+35.943736159772385
+23
+-29.902854972857973
+33
+272.37414196638593
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.917543567655905
+20
+-30.856294001265702
+30
+274.1009192239608
+11
+36.5743931814343
+21
+-31.34792050729845
+31
+274.4979319655278
+12
+35.943736159772385
+22
+-29.902854972857973
+32
+272.37414196638593
+13
+35.943736159772385
+23
+-29.902854972857973
+33
+272.37414196638593
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.917543567655905
+20
+-30.856294001265702
+30
+274.1009192239608
+11
+38.23515376090967
+21
+-31.41941322321268
+31
+273.79213153607503
+12
+36.5743931814343
+22
+-31.34792050729845
+32
+274.4979319655278
+13
+36.5743931814343
+23
+-31.34792050729845
+33
+274.4979319655278
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.5743931814343
+20
+-31.34792050729845
+30
+274.4979319655278
+11
+35.110465738965836
+21
+-34.49694647508531
+31
+273.78695972258254
+12
+34.43417506884791
+22
+-32.76165093646522
+32
+274.04342082690545
+13
+34.43417506884791
+23
+-32.76165093646522
+33
+274.04342082690545
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.5743931814343
+20
+-31.34792050729845
+30
+274.4979319655278
+11
+37.75234976024519
+21
+-33.5520257277229
+31
+273.1861166845788
+12
+35.110465738965836
+22
+-34.49694647508531
+32
+273.78695972258254
+13
+35.110465738965836
+23
+-34.49694647508531
+33
+273.78695972258254
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.75234976024519
+20
+-33.5520257277229
+30
+273.1861166845788
+11
+36.99787343910598
+21
+-34.50607320477633
+31
+273.10793103355695
+12
+36.06968502951094
+22
+-35.00956445940748
+32
+272.9722469854813
+13
+36.06968502951094
+23
+-35.00956445940748
+33
+272.9722469854813
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.75234976024519
+20
+-33.5520257277229
+30
+273.1861166845788
+11
+36.06968502951094
+21
+-35.00956445940748
+31
+272.9722469854813
+12
+35.110465738965836
+22
+-34.49694647508531
+32
+273.78695972258254
+13
+35.110465738965836
+23
+-34.49694647508531
+33
+273.78695972258254
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.5743931814343
+20
+-31.34792050729845
+30
+274.4979319655278
+11
+38.23515376090967
+21
+-31.41941322321268
+31
+273.79213153607503
+12
+38.5914004431895
+22
+-32.60041204525381
+32
+273.2749501869068
+13
+38.5914004431895
+23
+-32.60041204525381
+33
+273.2749501869068
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.5743931814343
+20
+-31.34792050729845
+30
+274.4979319655278
+11
+38.5914004431895
+21
+-32.60041204525381
+31
+273.2749501869068
+12
+37.75234976024519
+22
+-33.5520257277229
+32
+273.1861166845788
+13
+37.75234976024519
+23
+-33.5520257277229
+33
+273.1861166845788
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+88.83626823080367
+20
+1.0385840262428065
+30
+293.6156926496928
+11
+91.53756726237273
+21
+-26.135949404986974
+31
+312.5189751860992
+12
+90.34792846955709
+22
+-28.781179893818063
+32
+305.87441174658187
+13
+90.34792846955709
+23
+-28.781179893818063
+33
+305.87441174658187
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+88.83626823080367
+20
+1.0385840262428065
+30
+293.6156926496928
+11
+90.34792846955709
+21
+-28.781179893818063
+31
+305.87441174658187
+12
+90.2206105903648
+22
+-17.706197637868065
+32
+298.7263570524369
+13
+90.2206105903648
+23
+-17.706197637868065
+33
+298.7263570524369
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+88.1525240647712
+20
+-24.892584596717963
+30
+294.82346321215493
+11
+90.34792846955709
+21
+-28.781179893818063
+31
+305.87441174658187
+12
+88.08982343179265
+22
+-30.730953580179566
+32
+298.87755654098413
+13
+88.08982343179265
+23
+-30.730953580179566
+33
+298.87755654098413
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+88.1525240647712
+20
+-24.892584596717963
+30
+294.82346321215493
+11
+90.2206105903648
+21
+-17.706197637868065
+31
+298.7263570524369
+12
+90.34792846955709
+22
+-28.781179893818063
+32
+305.87441174658187
+13
+90.34792846955709
+23
+-28.781179893818063
+33
+305.87441174658187
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+85.62947006407128
+20
+-27.633341522983965
+30
+289.65834265558107
+11
+88.1525240647712
+21
+-24.892584596717963
+31
+294.82346321215493
+12
+83.91638290103303
+22
+-35.39775469561103
+32
+291.0921518900666
+13
+83.91638290103303
+23
+-35.39775469561103
+33
+291.0921518900666
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+83.91638290103303
+20
+-35.39775469561103
+30
+291.0921518900666
+11
+88.1525240647712
+21
+-24.892584596717963
+31
+294.82346321215493
+12
+88.08982343179265
+22
+-30.730953580179566
+32
+298.87755654098413
+13
+88.08982343179265
+23
+-30.730953580179566
+33
+298.87755654098413
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+87.15813644248266
+20
+-14.889080406514347
+30
+285.79773599620677
+11
+90.2206105903648
+21
+-17.706197637868065
+31
+298.7263570524369
+12
+85.62947006407128
+22
+-27.633341522983965
+32
+289.65834265558107
+13
+85.62947006407128
+23
+-27.633341522983965
+33
+289.65834265558107
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+85.62947006407128
+20
+-27.633341522983965
+30
+289.65834265558107
+11
+90.2206105903648
+21
+-17.706197637868065
+31
+298.7263570524369
+12
+88.1525240647712
+22
+-24.892584596717963
+32
+294.82346321215493
+13
+88.1525240647712
+23
+-24.892584596717963
+33
+294.82346321215493
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+87.15813644248266
+20
+-14.889080406514347
+30
+285.79773599620677
+11
+88.83626823080367
+21
+1.0385840262428065
+31
+293.6156926496928
+12
+90.2206105903648
+22
+-17.706197637868065
+32
+298.7263570524369
+13
+90.2206105903648
+23
+-17.706197637868065
+33
+298.7263570524369
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+86.04896498311113
+20
+-1.7551079322308865
+30
+283.4132257522227
+11
+88.83626823080367
+21
+1.0385840262428065
+31
+293.6156926496928
+12
+87.15813644248266
+22
+-14.889080406514347
+32
+285.79773599620677
+13
+87.15813644248266
+23
+-14.889080406514347
+33
+285.79773599620677
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+86.04896498311113
+20
+-1.7551079322308865
+30
+283.4132257522227
+11
+83.50227275251099
+21
+18.033771608551852
+31
+283.6788135862414
+12
+88.83626823080367
+22
+1.0385840262428065
+32
+293.6156926496928
+13
+88.83626823080367
+23
+1.0385840262428065
+33
+293.6156926496928
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+81.88678075230398
+20
+16.04566565748787
+30
+274.40301397675165
+11
+83.50227275251099
+21
+18.033771608551852
+31
+283.6788135862414
+12
+86.04896498311113
+22
+-1.7551079322308865
+32
+283.4132257522227
+13
+86.04896498311113
+23
+-1.7551079322308865
+33
+283.4132257522227
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+81.88678075230398
+20
+16.04566565748787
+30
+274.40301397675165
+11
+75.57265056125725
+21
+38.636146989145686
+31
+276.050692910342
+12
+83.50227275251099
+22
+18.033771608551852
+32
+283.6788135862414
+13
+83.50227275251099
+23
+18.033771608551852
+33
+283.6788135862414
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.53723580781222
+20
+29.979443877044822
+30
+266.9461715947217
+11
+75.57265056125725
+21
+38.636146989145686
+31
+276.050692910342
+12
+81.88678075230398
+22
+16.04566565748787
+32
+274.40301397675165
+13
+81.88678075230398
+23
+16.04566565748787
+33
+274.40301397675165
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+57.15799792129453
+20
+50.89060694552399
+30
+259.98886555112534
+11
+38.111334461432385
+21
+75.80901279708286
+31
+265.6617365028584
+12
+60.47449937891509
+22
+55.661452779434676
+32
+270.16912407301413
+13
+60.47449937891509
+23
+55.661452779434676
+33
+270.16912407301413
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.111334461432385
+20
+75.80901279708286
+30
+265.6617365028584
+11
+57.15799792129453
+21
+50.89060694552399
+31
+259.98886555112534
+12
+34.01799619492919
+22
+65.09970817743178
+32
+253.9311508307566
+13
+34.01799619492919
+23
+65.09970817743178
+33
+253.9311508307566
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.87647671324042
+20
+84.09304111346269
+30
+263.04479887607073
+11
+38.111334461432385
+21
+75.80901279708286
+31
+265.6617365028584
+12
+34.01799619492919
+22
+65.09970817743178
+32
+253.9311508307566
+13
+34.01799619492919
+23
+65.09970817743178
+33
+253.9311508307566
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.87647671324042
+20
+84.09304111346269
+30
+263.04479887607073
+11
+34.01799619492919
+21
+65.09970817743178
+31
+253.9311508307566
+12
+17.1539292958529
+22
+71.74853075747056
+32
+255.693522334129
+13
+17.1539292958529
+23
+71.74853075747056
+33
+255.693522334129
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+86.68472812144014
+30
+264.0277476638134
+11
+16.87647671324042
+21
+84.09304111346269
+31
+263.04479887607073
+12
+17.1539292958529
+22
+71.74853075747056
+32
+255.693522334129
+13
+17.1539292958529
+23
+71.74853075747056
+33
+255.693522334129
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+86.68472812144014
+30
+264.0277476638134
+11
+17.1539292958529
+21
+71.74853075747056
+31
+255.693522334129
+12
+0.020623870886214313
+22
+74.75335439613674
+32
+255.15595795531783
+13
+0.020623870886214313
+23
+74.75335439613674
+33
+255.15595795531783
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+74.75335439613674
+30
+255.15595795531783
+11
+11.97724821500427
+21
+55.13666582219602
+31
+249.42224213897822
+12
+0.020623870886214313
+22
+60.98750800290071
+32
+251.72643716168466
+13
+0.020623870886214313
+23
+60.98750800290071
+33
+251.72643716168466
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+74.75335439613674
+30
+255.15595795531783
+11
+17.1539292958529
+21
+71.74853075747056
+31
+255.693522334129
+12
+11.97724821500427
+22
+55.13666582219602
+32
+249.42224213897822
+13
+11.97724821500427
+23
+55.13666582219602
+33
+249.42224213897822
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.1539292958529
+20
+71.74853075747056
+30
+255.693522334129
+11
+28.684335363391913
+21
+51.22799171977902
+31
+246.80743408244842
+12
+11.97724821500427
+22
+55.13666582219602
+32
+249.42224213897822
+13
+11.97724821500427
+23
+55.13666582219602
+33
+249.42224213897822
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.1539292958529
+20
+71.74853075747056
+30
+255.693522334129
+11
+34.01799619492919
+21
+65.09970817743178
+31
+253.9311508307566
+12
+28.684335363391913
+22
+51.22799171977902
+32
+246.80743408244842
+13
+28.684335363391913
+23
+51.22799171977902
+33
+246.80743408244842
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.01799619492919
+20
+65.09970817743178
+30
+253.9311508307566
+11
+41.48639910123813
+21
+51.44855435398247
+31
+247.89899095351592
+12
+28.684335363391913
+22
+51.22799171977902
+32
+246.80743408244842
+13
+28.684335363391913
+23
+51.22799171977902
+33
+246.80743408244842
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.48639910123813
+20
+51.44855435398247
+30
+247.89899095351592
+11
+43.781467394251926
+21
+37.200512408728045
+31
+244.38763381698467
+12
+28.684335363391913
+22
+51.22799171977902
+32
+246.80743408244842
+13
+28.684335363391913
+23
+51.22799171977902
+33
+246.80743408244842
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.01799619492919
+20
+65.09970817743178
+30
+253.9311508307566
+11
+51.108284300618024
+21
+50.16624883236822
+31
+251.72065689954408
+12
+41.48639910123813
+22
+51.44855435398247
+32
+247.89899095351592
+13
+41.48639910123813
+23
+51.44855435398247
+33
+247.89899095351592
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+57.15799792129453
+20
+50.89060694552399
+30
+259.98886555112534
+11
+51.108284300618024
+21
+50.16624883236822
+31
+251.72065689954408
+12
+34.01799619492919
+22
+65.09970817743178
+32
+253.9311508307566
+13
+34.01799619492919
+23
+65.09970817743178
+33
+253.9311508307566
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+51.108284300618024
+20
+50.16624883236822
+30
+251.72065689954408
+11
+57.15799792129453
+21
+50.89060694552399
+31
+259.98886555112534
+12
+60.6309619482546
+22
+39.40309650753487
+32
+255.32845314647267
+13
+60.6309619482546
+23
+39.40309650753487
+33
+255.32845314647267
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.3959531470952
+20
+-4.494039512549523
+30
+242.72869858343674
+11
+68.23675255884842
+21
+-14.608281356337109
+31
+241.87930427350648
+12
+65.35480512425815
+22
+-12.944478533631502
+32
+242.18292014790083
+13
+65.35480512425815
+23
+-12.944478533631502
+33
+242.18292014790083
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.35480512425815
+20
+-12.944478533631502
+30
+242.18292014790083
+11
+69.06615933075231
+21
+-19.641368556712333
+31
+247.67538607606312
+12
+65.78406564406758
+22
+-19.040525518708396
+32
+247.77608432698963
+13
+65.78406564406758
+23
+-19.040525518708396
+33
+247.77608432698963
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+69.06615933075231
+20
+-19.641368556712333
+30
+247.67538607606312
+11
+65.35480512425815
+21
+-12.944478533631502
+31
+242.18292014790083
+12
+68.23675255884842
+22
+-14.608281356337109
+32
+241.87930427350648
+13
+68.23675255884842
+23
+-14.608281356337109
+33
+241.87930427350648
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+66.90075144421822
+20
+-21.398568246593527
+30
+255.97614673020914
+11
+65.58881447354052
+21
+-19.943767533815734
+31
+253.93814799016462
+12
+65.78406564406758
+22
+-19.040525518708396
+32
+247.77608432698963
+13
+65.78406564406758
+23
+-19.040525518708396
+33
+247.77608432698963
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+69.06615933075231
+20
+-19.641368556712333
+30
+247.67538607606312
+11
+66.90075144421822
+21
+-21.398568246593527
+31
+255.97614673020914
+12
+65.78406564406758
+22
+-19.040525518708396
+32
+247.77608432698963
+13
+65.78406564406758
+23
+-19.040525518708396
+33
+247.77608432698963
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+59.81883511789928
+20
+-1.9972704933622147
+30
+250.4499119021926
+11
+68.3959531470952
+21
+-4.494039512549523
+31
+242.72869858343674
+12
+65.35480512425815
+22
+-12.944478533631502
+32
+242.18292014790083
+13
+65.35480512425815
+23
+-12.944478533631502
+33
+242.18292014790083
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.35480512425815
+20
+-12.944478533631502
+30
+242.18292014790083
+11
+59.87587717846929
+21
+-5.364121076445766
+31
+249.89166026941317
+12
+59.81883511789928
+22
+-1.9972704933622147
+32
+250.4499119021926
+13
+59.81883511789928
+23
+-1.9972704933622147
+33
+250.4499119021926
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+59.81883511789928
+20
+-1.9972704933622147
+30
+250.4499119021926
+11
+59.87587717846929
+21
+-5.364121076445766
+31
+249.89166026941317
+12
+50.69797695613398
+22
+-2.5372686667582705
+32
+250.71032792271464
+13
+50.69797695613398
+23
+-2.5372686667582705
+33
+250.71032792271464
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+59.87587717846929
+20
+-5.364121076445766
+30
+249.89166026941317
+11
+56.51100405348539
+21
+-4.972584372693963
+31
+252.5411498987688
+12
+50.69797695613398
+22
+-2.5372686667582705
+32
+250.71032792271464
+13
+50.69797695613398
+23
+-2.5372686667582705
+33
+250.71032792271464
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.69797695613398
+20
+-2.5372686667582705
+30
+250.71032792271464
+11
+56.51100405348539
+21
+-4.972584372693963
+31
+252.5411498987688
+12
+46.59037056888021
+22
+-8.934193507320439
+32
+251.23815712318742
+13
+46.59037056888021
+23
+-8.934193507320439
+33
+251.23815712318742
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+56.51100405348539
+20
+-4.972584372693963
+30
+252.5411498987688
+11
+50.2989259116024
+21
+-7.8450704308377395
+31
+252.42311086142857
+12
+46.59037056888021
+22
+-8.934193507320439
+32
+251.23815712318742
+13
+46.59037056888021
+23
+-8.934193507320439
+33
+251.23815712318742
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+66.90075144421822
+20
+-21.398568246593527
+30
+255.97614673020914
+11
+58.229202185150676
+21
+-26.936972047536965
+31
+256.70445975956557
+12
+58.10039360677555
+22
+-25.60690330720575
+32
+255.60560150474535
+13
+58.10039360677555
+23
+-25.60690330720575
+33
+255.60560150474535
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.58881447354052
+20
+-19.943767533815734
+30
+253.93814799016462
+11
+66.90075144421822
+21
+-21.398568246593527
+31
+255.97614673020914
+12
+58.10039360677555
+22
+-25.60690330720575
+32
+255.60560150474535
+13
+58.10039360677555
+23
+-25.60690330720575
+33
+255.60560150474535
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.58881447354052
+20
+-19.943767533815734
+30
+253.93814799016462
+11
+58.10039360677555
+21
+-25.60690330720575
+31
+255.60560150474535
+12
+57.70724451411096
+22
+-24.372361004309926
+32
+257.57271597752236
+13
+57.70724451411096
+23
+-24.372361004309926
+33
+257.57271597752236
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.12119014449848
+20
+-18.35419544593177
+30
+254.09147704897723
+11
+65.58881447354052
+21
+-19.943767533815734
+31
+253.93814799016462
+12
+57.70724451411096
+22
+-24.372361004309926
+32
+257.57271597752236
+13
+57.70724451411096
+23
+-24.372361004309926
+33
+257.57271597752236
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.78406564406758
+20
+-19.040525518708396
+30
+247.77608432698963
+11
+65.58881447354052
+21
+-19.943767533815734
+31
+253.93814799016462
+12
+63.12119014449848
+22
+-18.35419544593177
+32
+254.09147704897723
+13
+63.12119014449848
+23
+-18.35419544593177
+33
+254.09147704897723
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.78406564406758
+20
+-19.040525518708396
+30
+247.77608432698963
+11
+63.12119014449848
+21
+-18.35419544593177
+31
+254.09147704897723
+12
+63.232171177543464
+22
+-16.844938579329355
+32
+249.69513135672653
+13
+63.232171177543464
+23
+-16.844938579329355
+33
+249.69513135672653
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.35480512425815
+20
+-12.944478533631502
+30
+242.18292014790083
+11
+65.78406564406758
+21
+-19.040525518708396
+31
+247.77608432698963
+12
+63.232171177543464
+22
+-16.844938579329355
+32
+249.69513135672653
+13
+63.232171177543464
+23
+-16.844938579329355
+33
+249.69513135672653
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.35480512425815
+20
+-12.944478533631502
+30
+242.18292014790083
+11
+63.232171177543464
+21
+-16.844938579329355
+31
+249.69513135672653
+12
+59.87587717846929
+22
+-5.364121076445766
+32
+249.89166026941317
+13
+59.87587717846929
+23
+-5.364121076445766
+33
+249.89166026941317
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+56.51100405348539
+20
+-4.972584372693963
+30
+252.5411498987688
+11
+59.60094965773804
+21
+-10.005975797391077
+31
+253.7705203881721
+12
+54.750762120375924
+22
+-9.445898818675344
+32
+257.3646265405665
+13
+54.750762120375924
+23
+-9.445898818675344
+33
+257.3646265405665
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+56.51100405348539
+20
+-4.972584372693963
+30
+252.5411498987688
+11
+54.750762120375924
+21
+-9.445898818675344
+31
+257.3646265405665
+12
+50.2989259116024
+22
+-7.8450704308377395
+32
+252.42311086142857
+13
+50.2989259116024
+23
+-7.8450704308377395
+33
+252.42311086142857
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.232171177543464
+20
+-16.844938579329355
+30
+249.69513135672653
+11
+59.60094965773804
+21
+-10.005975797391077
+31
+253.7705203881721
+12
+59.87587717846929
+22
+-5.364121076445766
+32
+249.89166026941317
+13
+59.87587717846929
+23
+-5.364121076445766
+33
+249.89166026941317
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+56.51100405348539
+20
+-4.972584372693963
+30
+252.5411498987688
+11
+59.87587717846929
+21
+-5.364121076445766
+31
+249.89166026941317
+12
+59.60094965773804
+22
+-10.005975797391077
+32
+253.7705203881721
+13
+59.60094965773804
+23
+-10.005975797391077
+33
+253.7705203881721
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+58.10039360677555
+20
+-25.60690330720575
+30
+255.60560150474535
+11
+50.93116489974413
+21
+-30.685319931711984
+31
+254.41517172868856
+12
+57.70724451411096
+22
+-24.372361004309926
+32
+257.57271597752236
+13
+57.70724451411096
+23
+-24.372361004309926
+33
+257.57271597752236
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+57.70724451411096
+20
+-24.372361004309926
+30
+257.57271597752236
+11
+50.93116489974413
+21
+-30.685319931711984
+31
+254.41517172868856
+12
+50.17242943808238
+22
+-29.65095723337649
+32
+255.778096695908
+13
+50.17242943808238
+23
+-29.65095723337649
+33
+255.778096695908
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+58.229202185150676
+20
+-26.936972047536965
+30
+256.70445975956557
+11
+50.54489127678024
+21
+-32.81884510919139
+31
+253.30870786579155
+12
+50.93116489974413
+22
+-30.685319931711984
+32
+254.41517172868856
+13
+50.93116489974413
+23
+-30.685319931711984
+33
+254.41517172868856
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+58.10039360677555
+20
+-25.60690330720575
+30
+255.60560150474535
+11
+58.229202185150676
+21
+-26.936972047536965
+31
+256.70445975956557
+12
+50.93116489974413
+22
+-30.685319931711984
+32
+254.41517172868856
+13
+50.93116489974413
+23
+-30.685319931711984
+33
+254.41517172868856
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.17242943808238
+20
+-29.65095723337649
+30
+255.778096695908
+11
+50.54489127678024
+21
+-32.81884510919139
+31
+253.30870786579155
+12
+46.90889343510309
+22
+-29.995339167058177
+32
+257.25906070046665
+13
+46.90889343510309
+23
+-29.995339167058177
+33
+257.25906070046665
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.17242943808238
+20
+-29.65095723337649
+30
+255.778096695908
+11
+50.93116489974413
+21
+-30.685319931711984
+31
+254.41517172868856
+12
+50.54489127678024
+22
+-32.81884510919139
+32
+253.30870786579155
+13
+50.54489127678024
+23
+-32.81884510919139
+33
+253.30870786579155
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+54.750762120375924
+20
+-9.445898818675344
+30
+257.3646265405665
+11
+46.59037056888021
+21
+-8.934193507320439
+31
+251.23815712318742
+12
+50.2989259116024
+22
+-7.8450704308377395
+32
+252.42311086142857
+13
+50.2989259116024
+23
+-7.8450704308377395
+33
+252.42311086142857
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+46.59037056888021
+20
+-8.934193507320439
+30
+251.23815712318742
+11
+54.750762120375924
+21
+-9.445898818675344
+31
+257.3646265405665
+12
+50.32636694554061
+22
+-11.89094970294707
+32
+254.34124521819467
+13
+50.32636694554061
+23
+-11.89094970294707
+33
+254.34124521819467
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+54.750762120375924
+20
+-9.445898818675344
+30
+257.3646265405665
+11
+58.29549266514109
+21
+-14.422400294964005
+31
+258.57756891652605
+12
+55.54411830999964
+22
+-15.633213100663442
+32
+259.64265827148876
+13
+55.54411830999964
+23
+-15.633213100663442
+33
+259.64265827148876
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+54.750762120375924
+20
+-9.445898818675344
+30
+257.3646265405665
+11
+55.54411830999964
+21
+-15.633213100663442
+31
+259.64265827148876
+12
+50.32636694554061
+22
+-11.89094970294707
+32
+254.34124521819467
+13
+50.32636694554061
+23
+-11.89094970294707
+33
+254.34124521819467
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.232171177543464
+20
+-16.844938579329355
+30
+249.69513135672653
+11
+58.29549266514109
+21
+-14.422400294964005
+31
+258.57756891652605
+12
+54.750762120375924
+22
+-9.445898818675344
+32
+257.3646265405665
+13
+54.750762120375924
+23
+-9.445898818675344
+33
+257.3646265405665
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+54.750762120375924
+20
+-9.445898818675344
+30
+257.3646265405665
+11
+59.60094965773804
+21
+-10.005975797391077
+31
+253.7705203881721
+12
+63.232171177543464
+22
+-16.844938579329355
+32
+249.69513135672653
+13
+63.232171177543464
+23
+-16.844938579329355
+33
+249.69513135672653
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.12119014449848
+20
+-18.35419544593177
+30
+254.09147704897723
+11
+59.50134661437474
+21
+-15.970597874914837
+31
+259.68281588212994
+12
+58.29549266514109
+22
+-14.422400294964005
+32
+258.57756891652605
+13
+58.29549266514109
+23
+-14.422400294964005
+33
+258.57756891652605
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.232171177543464
+20
+-16.844938579329355
+30
+249.69513135672653
+11
+63.12119014449848
+21
+-18.35419544593177
+31
+254.09147704897723
+12
+58.29549266514109
+22
+-14.422400294964005
+32
+258.57756891652605
+13
+58.29549266514109
+23
+-14.422400294964005
+33
+258.57756891652605
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+46.59037056888021
+20
+-8.934193507320439
+30
+251.23815712318742
+11
+50.32636694554061
+21
+-11.89094970294707
+31
+254.34124521819467
+12
+43.444995292969644
+22
+-16.548015640042248
+32
+250.00665706351958
+13
+43.444995292969644
+23
+-16.548015640042248
+33
+250.00665706351958
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.32636694554061
+20
+-11.89094970294707
+30
+254.34124521819467
+11
+49.38521857978407
+21
+-15.630475081754179
+31
+252.24818187567854
+12
+43.444995292969644
+22
+-16.548015640042248
+32
+250.00665706351958
+13
+43.444995292969644
+23
+-16.548015640042248
+33
+250.00665706351958
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.32636694554061
+20
+-11.89094970294707
+30
+254.34124521819467
+11
+55.54411830999964
+21
+-15.633213100663442
+31
+259.64265827148876
+12
+53.52032684584066
+22
+-16.335058613916132
+32
+257.3378548001375
+13
+53.52032684584066
+23
+-16.335058613916132
+33
+257.3378548001375
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+49.38521857978407
+20
+-15.630475081754179
+30
+252.24818187567854
+11
+50.32636694554061
+21
+-11.89094970294707
+31
+254.34124521819467
+12
+53.52032684584066
+22
+-16.335058613916132
+32
+257.3378548001375
+13
+53.52032684584066
+23
+-16.335058613916132
+33
+257.3378548001375
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.52032684584066
+20
+-16.335058613916132
+30
+257.3378548001375
+11
+52.58955252949978
+21
+-15.786846383799393
+31
+262.0378163667826
+12
+49.38521857978407
+22
+-15.630475081754179
+32
+252.24818187567854
+13
+49.38521857978407
+23
+-15.630475081754179
+33
+252.24818187567854
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+52.58955252949978
+20
+-15.786846383799393
+30
+262.0378163667826
+11
+48.0171826439378
+21
+-15.896367140092384
+31
+256.982520790827
+12
+49.38521857978407
+22
+-15.630475081754179
+32
+252.24818187567854
+13
+49.38521857978407
+23
+-15.630475081754179
+33
+252.24818187567854
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+49.38521857978407
+20
+-15.630475081754179
+30
+252.24818187567854
+11
+48.0171826439378
+21
+-15.896367140092384
+31
+256.982520790827
+12
+43.444995292969644
+22
+-16.548015640042248
+32
+250.00665706351958
+13
+43.444995292969644
+23
+-16.548015640042248
+33
+250.00665706351958
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.444995292969644
+20
+-16.548015640042248
+30
+250.00665706351958
+11
+48.0171826439378
+21
+-15.896367140092384
+31
+256.982520790827
+12
+43.984993466365644
+22
+-19.090722532011196
+32
+252.45049105049918
+13
+43.984993466365644
+23
+-19.090722532011196
+33
+252.45049105049918
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+58.29549266514109
+20
+-14.422400294964005
+30
+258.57756891652605
+11
+59.50134661437474
+21
+-15.970597874914837
+31
+259.68281588212994
+12
+55.54411830999964
+22
+-15.633213100663442
+32
+259.64265827148876
+13
+55.54411830999964
+23
+-15.633213100663442
+33
+259.64265827148876
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+59.50134661437474
+20
+-15.970597874914837
+30
+259.68281588212994
+11
+55.17990095045616
+21
+-15.725393070545275
+31
+262.33504353039274
+12
+55.54411830999964
+22
+-15.633213100663442
+32
+259.64265827148876
+13
+55.54411830999964
+23
+-15.633213100663442
+33
+259.64265827148876
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.95525273354536
+20
+-39.64472624524407
+30
+269.66228635080495
+11
+36.44874853601878
+21
+-46.6519250778264
+31
+277.5620793471828
+12
+34.378197793408546
+22
+-44.780641266807066
+32
+277.0071741819583
+13
+34.378197793408546
+23
+-44.780641266807066
+33
+277.0071741819583
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.95525273354536
+20
+-39.64472624524407
+30
+269.66228635080495
+11
+41.89649348869605
+21
+-39.767632871751815
+31
+268.0392495873865
+12
+36.44874853601878
+22
+-46.6519250778264
+32
+277.5620793471828
+13
+36.44874853601878
+23
+-46.6519250778264
+33
+277.5620793471828
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+6.603429772825727
+20
+-34.28246832733743
+30
+255.7933079120588
+11
+20.19069648843817
+21
+-28.88917952848756
+31
+268.0967479844436
+12
+15.335276292719787
+22
+-34.09780416325493
+32
+266.49044355879136
+13
+15.335276292719787
+23
+-34.09780416325493
+33
+266.49044355879136
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+20.19069648843817
+20
+-28.88917952848756
+30
+268.0967479844436
+11
+6.603429772825727
+21
+-34.28246832733743
+31
+255.7933079120588
+12
+11.777068610443962
+22
+-29.594979957936477
+32
+253.28467414427217
+13
+11.777068610443962
+23
+-29.594979957936477
+33
+253.28467414427217
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.354556197216564
+20
+-18.99884678645491
+30
+259.5550416664523
+11
+22.41853120606009
+21
+-28.132877861410115
+31
+268.40888213988313
+12
+17.039236726066825
+22
+-24.388484893429226
+32
+250.45204147244806
+13
+17.039236726066825
+23
+-24.388484893429226
+33
+250.45204147244806
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.354556197216564
+20
+-18.99884678645491
+30
+259.5550416664523
+11
+17.039236726066825
+21
+-24.388484893429226
+31
+250.45204147244806
+12
+19.28167421119466
+22
+-20.4022335886354
+32
+247.76482802703683
+13
+19.28167421119466
+23
+-20.4022335886354
+33
+247.76482802703683
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.41853120606009
+20
+-28.132877861410115
+30
+268.40888213988313
+11
+20.19069648843817
+21
+-28.88917952848756
+31
+268.0967479844436
+12
+11.777068610443962
+22
+-29.594979957936477
+32
+253.28467414427217
+13
+11.777068610443962
+23
+-29.594979957936477
+33
+253.28467414427217
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.41853120606009
+20
+-28.132877861410115
+30
+268.40888213988313
+11
+11.777068610443962
+21
+-29.594979957936477
+31
+253.28467414427217
+12
+17.039236726066825
+22
+-24.388484893429226
+32
+250.45204147244806
+13
+17.039236726066825
+23
+-24.388484893429226
+33
+250.45204147244806
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+20.19069648843817
+20
+-28.88917952848756
+30
+268.0967479844436
+11
+25.440391406816413
+21
+-36.35454019156776
+31
+274.60167245968296
+12
+15.335276292719787
+22
+-34.09780416325493
+32
+266.49044355879136
+13
+15.335276292719787
+23
+-34.09780416325493
+33
+266.49044355879136
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.440391406816413
+20
+-36.35454019156776
+30
+274.60167245968296
+11
+19.789424606348415
+21
+-40.36482521788137
+31
+275.9323496486591
+12
+15.335276292719787
+22
+-34.09780416325493
+32
+266.49044355879136
+13
+15.335276292719787
+23
+-34.09780416325493
+33
+266.49044355879136
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.41853120606009
+20
+-28.132877861410115
+30
+268.40888213988313
+11
+25.440391406816413
+21
+-36.35454019156776
+31
+274.60167245968296
+12
+20.19069648843817
+22
+-28.88917952848756
+32
+268.0967479844436
+13
+20.19069648843817
+23
+-28.88917952848756
+33
+268.0967479844436
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.41853120606009
+20
+-28.132877861410115
+30
+268.40888213988313
+11
+25.797854986388412
+21
+-31.93416077779596
+31
+272.22507204809585
+12
+25.440391406816413
+22
+-36.35454019156776
+32
+274.60167245968296
+13
+25.440391406816413
+23
+-36.35454019156776
+33
+274.60167245968296
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.00672524480919
+20
+-26.777558502267187
+30
+269.2786594794548
+11
+35.72469464718358
+21
+-29.067759206112502
+31
+270.05473572752925
+12
+31.14703125840072
+22
+-32.136469952616565
+32
+268.445997507293
+13
+31.14703125840072
+23
+-32.136469952616565
+33
+268.445997507293
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.00672524480919
+20
+-26.777558502267187
+30
+269.2786594794548
+11
+31.14703125840072
+21
+-32.136469952616565
+31
+268.445997507293
+12
+29.733605053556875
+22
+-30.1075979422628
+32
+268.4021892047757
+13
+29.733605053556875
+23
+-30.1075979422628
+33
+268.4021892047757
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.733605053556875
+20
+-30.1075979422628
+30
+268.4021892047757
+11
+31.14703125840072
+21
+-32.136469952616565
+31
+268.445997507293
+12
+25.797854986388412
+22
+-31.93416077779596
+32
+272.22507204809585
+13
+25.797854986388412
+23
+-31.93416077779596
+33
+272.22507204809585
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.797854986388412
+20
+-31.93416077779596
+30
+272.22507204809585
+11
+31.14703125840072
+21
+-32.136469952616565
+31
+268.445997507293
+12
+31.803547347521036
+22
+-35.9170656150349
+32
+269.89501795793154
+13
+31.803547347521036
+23
+-35.9170656150349
+33
+269.89501795793154
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.354556197216564
+20
+-18.99884678645491
+30
+259.5550416664523
+11
+34.047505954264075
+21
+-22.654102027780763
+31
+260.29369832279247
+12
+25.293451058788087
+22
+-28.185812893619044
+32
+268.15272525988314
+13
+25.293451058788087
+23
+-28.185812893619044
+33
+268.15272525988314
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.354556197216564
+20
+-18.99884678645491
+30
+259.5550416664523
+11
+25.293451058788087
+21
+-28.185812893619044
+31
+268.15272525988314
+12
+22.41853120606009
+22
+-28.132877861410115
+32
+268.40888213988313
+13
+22.41853120606009
+23
+-28.132877861410115
+33
+268.40888213988313
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.738095167564865
+20
+-8.703591470455816
+30
+249.94489952594444
+11
+43.444995292969644
+21
+-16.548015640042248
+31
+250.00665706351958
+12
+34.047505954264075
+22
+-22.654102027780763
+32
+260.29369832279247
+13
+34.047505954264075
+23
+-22.654102027780763
+33
+260.29369832279247
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.738095167564865
+20
+-8.703591470455816
+30
+249.94489952594444
+11
+34.047505954264075
+21
+-22.654102027780763
+31
+260.29369832279247
+12
+28.354556197216564
+22
+-18.99884678645491
+32
+259.5550416664523
+13
+28.354556197216564
+23
+-18.99884678645491
+33
+259.5550416664523
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.58224441316325
+20
+-6.289875691456865
+30
+251.0291550132596
+11
+46.59037056888021
+21
+-8.934193507320439
+31
+251.23815712318742
+12
+34.738095167564865
+22
+-8.703591470455816
+32
+249.94489952594444
+13
+34.738095167564865
+23
+-8.703591470455816
+33
+249.94489952594444
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.738095167564865
+20
+-8.703591470455816
+30
+249.94489952594444
+11
+46.59037056888021
+21
+-8.934193507320439
+31
+251.23815712318742
+12
+43.444995292969644
+22
+-16.548015640042248
+32
+250.00665706351958
+13
+43.444995292969644
+23
+-16.548015640042248
+33
+250.00665706351958
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.35584291615144
+20
+0.27893589162312954
+30
+250.17519733848803
+11
+50.69797695613398
+21
+-2.5372686667582705
+31
+250.71032792271464
+12
+40.58224441316325
+22
+-6.289875691456865
+32
+251.0291550132596
+13
+40.58224441316325
+23
+-6.289875691456865
+33
+251.0291550132596
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.69797695613398
+20
+-2.5372686667582705
+30
+250.71032792271464
+11
+46.59037056888021
+21
+-8.934193507320439
+31
+251.23815712318742
+12
+40.58224441316325
+22
+-6.289875691456865
+32
+251.0291550132596
+13
+40.58224441316325
+23
+-6.289875691456865
+33
+251.0291550132596
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.95603355500676
+20
+5.760753968481378
+30
+248.34954717592635
+11
+44.35584291615144
+21
+0.27893589162312954
+31
+250.17519733848803
+12
+39.87248906751094
+22
+4.79058260230604
+32
+251.260973947419
+13
+39.87248906751094
+23
+4.79058260230604
+33
+251.260973947419
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.95603355500676
+20
+5.760753968481378
+30
+248.34954717592635
+11
+50.69797695613398
+21
+-2.5372686667582705
+31
+250.71032792271464
+12
+44.35584291615144
+22
+0.27893589162312954
+32
+250.17519733848803
+13
+44.35584291615144
+23
+0.27893589162312954
+33
+250.17519733848803
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.726695732228954
+20
+9.646611246671357
+30
+248.09186917431248
+11
+47.95603355500676
+21
+5.760753968481378
+31
+248.34954717592635
+12
+32.26688099151096
+22
+8.102672807242747
+32
+250.3251799297488
+13
+32.26688099151096
+23
+8.102672807242747
+33
+250.3251799297488
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.26688099151096
+20
+8.102672807242747
+30
+250.3251799297488
+11
+47.95603355500676
+21
+5.760753968481378
+31
+248.34954717592635
+12
+39.87248906751094
+22
+4.79058260230604
+32
+251.260973947419
+13
+39.87248906751094
+23
+4.79058260230604
+33
+251.260973947419
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+24.298029073801224
+20
+-1.6224661273756518
+30
+245.48344982856472
+11
+32.26688099151096
+21
+8.102672807242747
+31
+250.3251799297488
+12
+31.9462285550268
+22
+-0.16371049840077204
+32
+252.77753219777196
+13
+31.9462285550268
+23
+-0.16371049840077204
+33
+252.77753219777196
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.26688099151096
+20
+8.102672807242747
+30
+250.3251799297488
+11
+24.298029073801224
+21
+-1.6224661273756518
+31
+245.48344982856472
+12
+22.60806295931401
+22
+6.502757092376987
+32
+243.8452018489964
+13
+22.60806295931401
+23
+6.502757092376987
+33
+243.8452018489964
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.9462285550268
+20
+-0.16371049840077204
+30
+252.77753219777196
+11
+24.292248811663452
+21
+-8.70876328394589
+31
+243.81934278153415
+12
+24.298029073801224
+22
+-1.6224661273756518
+32
+245.48344982856472
+13
+24.298029073801224
+23
+-1.6224661273756518
+33
+245.48344982856472
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.13355742427869
+20
+9.801765651420741
+30
+251.7495582102225
+11
+63.10774342942014
+21
+3.593459891143782
+31
+250.15542275749132
+12
+47.95603355500676
+22
+5.760753968481378
+32
+248.34954717592635
+13
+47.95603355500676
+23
+5.760753968481378
+33
+248.34954717592635
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.13355742427869
+20
+9.801765651420741
+30
+251.7495582102225
+11
+47.95603355500676
+21
+5.760753968481378
+31
+248.34954717592635
+12
+50.726695732228954
+22
+9.646611246671357
+32
+248.09186917431248
+13
+50.726695732228954
+23
+9.646611246671357
+33
+248.09186917431248
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.10774342942014
+20
+3.593459891143782
+30
+250.15542275749132
+11
+59.81883511789928
+21
+-1.9972704933622147
+31
+250.4499119021926
+12
+50.69797695613398
+22
+-2.5372686667582705
+32
+250.71032792271464
+13
+50.69797695613398
+23
+-2.5372686667582705
+33
+250.71032792271464
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.95603355500676
+20
+5.760753968481378
+30
+248.34954717592635
+11
+63.10774342942014
+21
+3.593459891143782
+31
+250.15542275749132
+12
+50.69797695613398
+22
+-2.5372686667582705
+32
+250.71032792271464
+13
+50.69797695613398
+23
+-2.5372686667582705
+33
+250.71032792271464
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+69.93697103302202
+20
+1.6585931966106635
+30
+246.35657363569004
+11
+68.3959531470952
+21
+-4.494039512549523
+31
+242.72869858343674
+12
+59.81883511789928
+22
+-1.9972704933622147
+32
+250.4499119021926
+13
+59.81883511789928
+23
+-1.9972704933622147
+33
+250.4499119021926
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.10774342942014
+20
+3.593459891143782
+30
+250.15542275749132
+11
+69.93697103302202
+21
+1.6585931966106635
+31
+246.35657363569004
+12
+59.81883511789928
+22
+-1.9972704933622147
+32
+250.4499119021926
+13
+59.81883511789928
+23
+-1.9972704933622147
+33
+250.4499119021926
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.26667694835976
+20
+-0.350504232745811
+30
+246.81990727967977
+11
+72.33404574155108
+21
+-6.469976490693818
+31
+241.28272037602716
+12
+68.3959531470952
+22
+-4.494039512549523
+32
+242.72869858343674
+13
+68.3959531470952
+23
+-4.494039512549523
+33
+242.72869858343674
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+69.93697103302202
+20
+1.6585931966106635
+30
+246.35657363569004
+11
+75.26667694835976
+21
+-0.350504232745811
+31
+246.81990727967977
+12
+68.3959531470952
+22
+-4.494039512549523
+32
+242.72869858343674
+13
+68.3959531470952
+23
+-4.494039512549523
+33
+242.72869858343674
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.33404574155108
+20
+-6.469976490693818
+30
+241.28272037602716
+11
+77.38353367517992
+21
+-8.556955346751463
+31
+253.43131026798287
+12
+73.63101487553521
+22
+-11.626578766223606
+32
+248.00699058817892
+13
+73.63101487553521
+23
+-11.626578766223606
+33
+248.00699058817892
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.33404574155108
+20
+-6.469976490693818
+30
+241.28272037602716
+11
+75.26667694835976
+21
+-0.350504232745811
+31
+246.81990727967977
+12
+77.38353367517992
+22
+-8.556955346751463
+32
+253.43131026798287
+13
+77.38353367517992
+23
+-8.556955346751463
+33
+253.43131026798287
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+69.06615933075231
+20
+-19.641368556712333
+30
+247.67538607606312
+11
+77.38353367517992
+21
+-8.556955346751463
+31
+253.43131026798287
+12
+66.90075144421822
+22
+-21.398568246593527
+32
+255.97614673020914
+13
+66.90075144421822
+23
+-21.398568246593527
+33
+255.97614673020914
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+69.06615933075231
+20
+-19.641368556712333
+30
+247.67538607606312
+11
+73.63101487553521
+21
+-11.626578766223606
+31
+248.00699058817892
+12
+77.38353367517992
+22
+-8.556955346751463
+32
+253.43131026798287
+13
+77.38353367517992
+23
+-8.556955346751463
+33
+253.43131026798287
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.33404574155108
+20
+-6.469976490693818
+30
+241.28272037602716
+11
+73.63101487553521
+21
+-11.626578766223606
+31
+248.00699058817892
+12
+69.06615933075231
+22
+-19.641368556712333
+32
+247.67538607606312
+13
+69.06615933075231
+23
+-19.641368556712333
+33
+247.67538607606312
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.33404574155108
+20
+-6.469976490693818
+30
+241.28272037602716
+11
+69.06615933075231
+21
+-19.641368556712333
+31
+247.67538607606312
+12
+68.23675255884842
+22
+-14.608281356337109
+32
+241.87930427350648
+13
+68.23675255884842
+23
+-14.608281356337109
+33
+241.87930427350648
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.3959531470952
+20
+-4.494039512549523
+30
+242.72869858343674
+11
+72.33404574155108
+21
+-6.469976490693818
+31
+241.28272037602716
+12
+68.23675255884842
+22
+-14.608281356337109
+32
+241.87930427350648
+13
+68.23675255884842
+23
+-14.608281356337109
+33
+241.87930427350648
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+48.0171826439378
+20
+-15.896367140092384
+30
+256.982520790827
+11
+47.08199707491285
+21
+-16.02444558009322
+31
+261.0390479142422
+12
+39.39120618846166
+22
+-20.635573644411384
+32
+264.33957759490204
+13
+39.39120618846166
+23
+-20.635573644411384
+33
+264.33957759490204
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+48.0171826439378
+20
+-15.896367140092384
+30
+256.982520790827
+11
+39.39120618846166
+21
+-20.635573644411384
+31
+264.33957759490204
+12
+38.26588041753671
+22
+-21.160969050301233
+32
+263.5154339037866
+13
+38.26588041753671
+23
+-21.160969050301233
+33
+263.5154339037866
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.7552455018004
+20
+-15.261450977909519
+30
+263.94712821818183
+11
+39.39120618846166
+21
+-20.635573644411384
+31
+264.33957759490204
+12
+47.08199707491285
+22
+-16.02444558009322
+32
+261.0390479142422
+13
+47.08199707491285
+23
+-16.02444558009322
+33
+261.0390479142422
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.7552455018004
+20
+-15.261450977909519
+30
+263.94712821818183
+11
+47.08199707491285
+21
+-16.02444558009322
+31
+261.0390479142422
+12
+47.66184863462711
+22
+-15.899409383324077
+32
+262.00100522369445
+13
+47.66184863462711
+23
+-15.899409383324077
+33
+262.00100522369445
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+52.58955252949978
+20
+-15.786846383799393
+30
+262.0378163667826
+11
+47.66184863462711
+21
+-15.899409383324077
+31
+262.00100522369445
+12
+47.08199707491285
+22
+-16.02444558009322
+32
+261.0390479142422
+13
+47.08199707491285
+23
+-16.02444558009322
+33
+261.0390479142422
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+52.58955252949978
+20
+-15.786846383799393
+30
+262.0378163667826
+11
+47.08199707491285
+21
+-16.02444558009322
+31
+261.0390479142422
+12
+48.0171826439378
+22
+-15.896367140092384
+32
+256.982520790827
+13
+48.0171826439378
+23
+-15.896367140092384
+33
+256.982520790827
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+55.17990095045616
+20
+-15.725393070545275
+30
+262.33504353039274
+11
+52.05795094741968
+21
+-17.264768145128038
+31
+263.83639056459447
+12
+52.58955252949978
+22
+-15.786846383799393
+32
+262.0378163667826
+13
+52.58955252949978
+23
+-15.786846383799393
+33
+262.0378163667826
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+52.58955252949978
+20
+-15.786846383799393
+30
+262.0378163667826
+11
+52.05795094741968
+21
+-17.264768145128038
+31
+263.83639056459447
+12
+47.66184863462711
+22
+-15.899409383324077
+32
+262.00100522369445
+13
+47.66184863462711
+23
+-15.899409383324077
+33
+262.00100522369445
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.39120618846166
+20
+-20.635573644411384
+30
+264.33957759490204
+11
+27.62107135436712
+21
+-25.251265073576
+31
+271.2037909956523
+12
+38.26588041753671
+22
+-21.160969050301233
+32
+263.5154339037866
+13
+38.26588041753671
+23
+-21.160969050301233
+33
+263.5154339037866
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.39120618846166
+20
+-20.635573644411384
+30
+264.33957759490204
+11
+28.62987920956776
+21
+-24.211122113102256
+31
+271.5533447428255
+12
+27.62107135436712
+22
+-25.251265073576
+32
+271.2037909956523
+13
+27.62107135436712
+23
+-25.251265073576
+33
+271.2037909956523
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.265722694888886
+20
+-27.239979473289306
+30
+274.35464230937714
+11
+26.149538303822645
+21
+-30.496700851431534
+31
+270.5521424956993
+12
+26.43915985935674
+22
+-28.022444432147896
+32
+273.2186686871453
+13
+26.43915985935674
+23
+-28.022444432147896
+33
+273.2186686871453
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.315311259544398
+20
+-29.993513821123035
+30
+269.2476285985039
+11
+26.149538303822645
+21
+-30.496700851431534
+31
+270.5521424956993
+12
+28.265722694888886
+22
+-27.239979473289306
+32
+274.35464230937714
+13
+28.265722694888886
+23
+-27.239979473289306
+33
+274.35464230937714
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.293451058788087
+20
+-28.185812893619044
+30
+268.15272525988314
+11
+26.036975304297847
+21
+-26.641874454191743
+31
+270.7082095734198
+12
+26.43915985935674
+22
+-28.022444432147896
+32
+273.2186686871453
+13
+26.43915985935674
+23
+-28.022444432147896
+33
+273.2186686871453
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.293451058788087
+20
+-28.185812893619044
+30
+268.15272525988314
+11
+26.43915985935674
+21
+-28.022444432147896
+31
+273.2186686871453
+12
+26.149538303822645
+22
+-30.496700851431534
+32
+270.5521424956993
+13
+26.149538303822645
+23
+-30.496700851431534
+33
+270.5521424956993
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.62987920956776
+20
+-24.211122113102256
+30
+271.5533447428255
+11
+26.036975304297847
+21
+-26.641874454191743
+31
+270.7082095734198
+12
+27.62107135436712
+22
+-25.251265073576
+32
+271.2037909956523
+13
+27.62107135436712
+23
+-25.251265073576
+33
+271.2037909956523
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+42.405765005465014
+20
+-19.694607813250055
+30
+269.7791084908574
+11
+39.0462158061343
+21
+-18.900582330115938
+31
+271.49219565389586
+12
+39.39120618846166
+22
+-20.635573644411384
+32
+264.33957759490204
+13
+39.39120618846166
+23
+-20.635573644411384
+33
+264.33957759490204
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+51.956705092711985
+20
+-17.55165168175585
+30
+268.0781903007413
+11
+49.447919212762606
+21
+-19.1561307614691
+31
+269.20838366083456
+12
+50.41580889651438
+22
+-17.159810753679405
+32
+264.35904795157745
+13
+50.41580889651438
+23
+-17.159810753679405
+33
+264.35904795157745
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.7552455018004
+20
+-15.261450977909519
+30
+263.94712821818183
+11
+42.405765005465014
+21
+-19.694607813250055
+31
+269.7791084908574
+12
+39.39120618846166
+22
+-20.635573644411384
+32
+264.33957759490204
+13
+39.39120618846166
+23
+-20.635573644411384
+33
+264.33957759490204
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.7552455018004
+20
+-15.261450977909519
+30
+263.94712821818183
+11
+45.741888931921636
+21
+-19.865277658475435
+31
+269.6294301239217
+12
+42.405765005465014
+22
+-19.694607813250055
+32
+269.7791084908574
+13
+42.405765005465014
+23
+-19.694607813250055
+33
+269.7791084908574
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.42320834305095
+20
+-21.001555505030687
+30
+272.9692047422543
+11
+32.66876132224682
+21
+-23.97899895462346
+31
+274.08722912942574
+12
+28.265722694888886
+22
+-27.239979473289306
+32
+274.35464230937714
+13
+28.265722694888886
+23
+-27.239979473289306
+33
+274.35464230937714
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.42320834305095
+20
+-21.001555505030687
+30
+272.9692047422543
+11
+28.265722694888886
+21
+-27.239979473289306
+31
+274.35464230937714
+12
+28.62987920956776
+22
+-24.211122113102256
+32
+271.5533447428255
+13
+28.62987920956776
+23
+-24.211122113102256
+33
+271.5533447428255
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.39120618846166
+20
+-20.635573644411384
+30
+264.33957759490204
+11
+39.0462158061343
+21
+-18.900582330115938
+31
+271.49219565389586
+12
+28.62987920956776
+22
+-24.211122113102256
+32
+271.5533447428255
+13
+28.62987920956776
+23
+-24.211122113102256
+33
+271.5533447428255
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.0462158061343
+20
+-18.900582330115938
+30
+271.49219565389586
+11
+35.42320834305095
+21
+-21.001555505030687
+31
+272.9692047422543
+12
+28.62987920956776
+22
+-24.211122113102256
+32
+271.5533447428255
+13
+28.62987920956776
+23
+-24.211122113102256
+33
+271.5533447428255
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.62987920956776
+20
+-24.211122113102256
+30
+271.5533447428255
+11
+28.265722694888886
+21
+-27.239979473289306
+31
+274.35464230937714
+12
+26.43915985935674
+22
+-28.022444432147896
+32
+273.2186686871453
+13
+26.43915985935674
+23
+-28.022444432147896
+33
+273.2186686871453
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.036975304297847
+20
+-26.641874454191743
+30
+270.7082095734198
+11
+28.62987920956776
+21
+-24.211122113102256
+31
+271.5533447428255
+12
+26.43915985935674
+22
+-28.022444432147896
+32
+273.2186686871453
+13
+26.43915985935674
+23
+-28.022444432147896
+33
+273.2186686871453
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.7552455018004
+20
+-15.261450977909519
+30
+263.94712821818183
+11
+50.41580889651438
+21
+-17.159810753679405
+31
+264.35904795157745
+12
+45.741888931921636
+22
+-19.865277658475435
+32
+269.6294301239217
+13
+45.741888931921636
+23
+-19.865277658475435
+33
+269.6294301239217
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.41580889651438
+20
+-17.159810753679405
+30
+264.35904795157745
+11
+49.447919212762606
+21
+-19.1561307614691
+31
+269.20838366083456
+12
+45.741888931921636
+22
+-19.865277658475435
+32
+269.6294301239217
+13
+45.741888931921636
+23
+-19.865277658475435
+33
+269.6294301239217
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+57.70724451411096
+20
+-24.372361004309926
+30
+257.57271597752236
+11
+50.17242943808238
+21
+-29.65095723337649
+31
+255.778096695908
+12
+51.12678113945886
+22
+-24.703965516424564
+32
+261.4713506772798
+13
+51.12678113945886
+23
+-24.703965516424564
+33
+261.4713506772798
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+57.70724451411096
+20
+-24.372361004309926
+30
+257.57271597752236
+11
+51.12678113945886
+21
+-24.703965516424564
+31
+261.4713506772798
+12
+55.29529323618523
+22
+-23.16002707699654
+32
+261.4990350906769
+13
+55.29529323618523
+23
+-23.16002707699654
+33
+261.4990350906769
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.12119014449848
+20
+-18.35419544593177
+30
+254.09147704897723
+11
+57.70724451411096
+21
+-24.372361004309926
+31
+257.57271597752236
+12
+55.29529323618523
+22
+-23.16002707699654
+32
+261.4990350906769
+13
+55.29529323618523
+23
+-23.16002707699654
+33
+261.4990350906769
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.12119014449848
+20
+-18.35419544593177
+30
+254.09147704897723
+11
+55.29529323618523
+21
+-23.16002707699654
+31
+261.4990350906769
+12
+59.50134661437474
+22
+-15.970597874914837
+32
+259.68281588212994
+13
+59.50134661437474
+23
+-15.970597874914837
+33
+259.68281588212994
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+55.17990095045616
+20
+-15.725393070545275
+30
+262.33504353039274
+11
+56.00681308291117
+21
+-18.163446795388086
+31
+264.0371786178009
+12
+53.57286638642966
+22
+-19.352963898475107
+32
+265.7453981916702
+13
+53.57286638642966
+23
+-19.352963898475107
+33
+265.7453981916702
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+55.17990095045616
+20
+-15.725393070545275
+30
+262.33504353039274
+11
+53.57286638642966
+21
+-19.352963898475107
+31
+265.7453981916702
+12
+52.05795094741968
+22
+-17.264768145128038
+32
+263.83639056459447
+13
+52.05795094741968
+23
+-17.264768145128038
+33
+263.83639056459447
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+59.50134661437474
+20
+-15.970597874914837
+30
+259.68281588212994
+11
+55.29529323618523
+21
+-23.16002707699654
+31
+261.4990350906769
+12
+56.00681308291117
+22
+-18.163446795388086
+32
+264.0371786178009
+13
+56.00681308291117
+23
+-18.163446795388086
+33
+264.0371786178009
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+55.17990095045616
+20
+-15.725393070545275
+30
+262.33504353039274
+11
+59.50134661437474
+21
+-15.970597874914837
+31
+259.68281588212994
+12
+56.00681308291117
+22
+-18.163446795388086
+32
+264.0371786178009
+13
+56.00681308291117
+23
+-18.163446795388086
+33
+264.0371786178009
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+55.29529323618523
+20
+-23.16002707699654
+30
+261.4990350906769
+11
+53.57286638642966
+21
+-19.352963898475107
+31
+265.7453981916702
+12
+56.00681308291117
+22
+-18.163446795388086
+32
+264.0371786178009
+13
+56.00681308291117
+23
+-18.163446795388086
+33
+264.0371786178009
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+55.29529323618523
+20
+-23.16002707699654
+30
+261.4990350906769
+11
+53.68603783460055
+21
+-22.490125117663016
+31
+263.5711069549022
+12
+53.57286638642966
+22
+-19.352963898475107
+32
+265.7453981916702
+13
+53.57286638642966
+23
+-19.352963898475107
+33
+265.7453981916702
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+55.29529323618523
+20
+-23.16002707699654
+30
+261.4990350906769
+11
+51.12678113945886
+21
+-24.703965516424564
+31
+261.4713506772798
+12
+51.69187781950566
+22
+-23.439000781224696
+32
+263.3207303370402
+13
+51.69187781950566
+23
+-23.439000781224696
+33
+263.3207303370402
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+55.29529323618523
+20
+-23.16002707699654
+30
+261.4990350906769
+11
+51.69187781950566
+21
+-23.439000781224696
+31
+263.3207303370402
+12
+53.68603783460055
+22
+-22.490125117663016
+32
+263.5711069549022
+13
+53.68603783460055
+23
+-22.490125117663016
+33
+263.5711069549022
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.02755781545073
+20
+-20.481331912630978
+30
+268.249164370289
+11
+48.804515191965315
+21
+-23.71554069086823
+31
+264.02592231784666
+12
+46.989208656385685
+22
+-21.523300219043357
+32
+269.3863548898123
+13
+46.989208656385685
+23
+-21.523300219043357
+33
+269.3863548898123
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+48.804515191965315
+20
+-23.71554069086823
+30
+264.02592231784666
+11
+47.51886320279832
+21
+-23.37693901932493
+31
+265.16098326710926
+12
+46.989208656385685
+22
+-21.523300219043357
+32
+269.3863548898123
+13
+46.989208656385685
+23
+-21.523300219043357
+33
+269.3863548898123
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+46.989208656385685
+20
+-21.523300219043357
+30
+269.3863548898123
+11
+46.33695170778788
+21
+-24.186784167257358
+31
+264.62767802881996
+12
+44.95181836498677
+22
+-22.347748134481563
+32
+268.4840255476755
+13
+44.95181836498677
+23
+-22.347748134481563
+33
+268.4840255476755
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.51886320279832
+20
+-23.37693901932493
+30
+265.16098326710926
+11
+46.33695170778788
+21
+-24.186784167257358
+31
+264.62767802881996
+12
+46.989208656385685
+22
+-21.523300219043357
+32
+269.3863548898123
+13
+46.989208656385685
+23
+-21.523300219043357
+33
+269.3863548898123
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+51.12678113945886
+20
+-24.703965516424564
+30
+261.4713506772798
+11
+48.48678330898237
+21
+-25.057474179797175
+31
+262.06428388288464
+12
+48.804515191965315
+22
+-23.71554069086823
+32
+264.02592231784666
+13
+48.804515191965315
+23
+-23.71554069086823
+33
+264.02592231784666
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+51.69187781950566
+20
+-23.439000781224696
+30
+263.3207303370402
+11
+51.12678113945886
+21
+-24.703965516424564
+31
+261.4713506772798
+12
+48.804515191965315
+22
+-23.71554069086823
+32
+264.02592231784666
+13
+48.804515191965315
+23
+-23.71554069086823
+33
+264.02592231784666
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.17242943808238
+20
+-29.65095723337649
+30
+255.778096695908
+11
+46.33695170778788
+21
+-24.186784167257358
+31
+264.62767802881996
+12
+48.48678330898237
+22
+-25.057474179797175
+32
+262.06428388288464
+13
+48.48678330898237
+23
+-25.057474179797175
+33
+262.06428388288464
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+55.54411830999964
+20
+-15.633213100663442
+30
+259.64265827148876
+11
+55.17990095045616
+21
+-15.725393070545275
+31
+262.33504353039274
+12
+52.58955252949978
+22
+-15.786846383799393
+32
+262.0378163667826
+13
+52.58955252949978
+23
+-15.786846383799393
+33
+262.0378163667826
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+55.54411830999964
+20
+-15.633213100663442
+30
+259.64265827148876
+11
+52.58955252949978
+21
+-15.786846383799393
+31
+262.0378163667826
+12
+53.52032684584066
+22
+-16.335058613916132
+32
+257.3378548001375
+13
+53.52032684584066
+23
+-16.335058613916132
+33
+257.3378548001375
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.984993466365644
+20
+-19.090722532011196
+30
+252.45049105049918
+11
+34.047505954264075
+21
+-22.654102027780763
+31
+260.29369832279247
+12
+43.444995292969644
+22
+-16.548015640042248
+32
+250.00665706351958
+13
+43.444995292969644
+23
+-16.548015640042248
+33
+250.00665706351958
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.984993466365644
+20
+-19.090722532011196
+30
+252.45049105049918
+11
+36.758144672550465
+21
+-20.259248156810642
+31
+263.502048033573
+12
+34.047505954264075
+22
+-22.654102027780763
+32
+260.29369832279247
+13
+34.047505954264075
+23
+-22.654102027780763
+33
+260.29369832279247
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.758144672550465
+20
+-20.259248156810642
+30
+263.502048033573
+11
+25.293451058788087
+21
+-28.185812893619044
+31
+268.15272525988314
+12
+34.047505954264075
+22
+-22.654102027780763
+32
+260.29369832279247
+13
+34.047505954264075
+23
+-22.654102027780763
+33
+260.29369832279247
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.758144672550465
+20
+-20.259248156810642
+30
+263.502048033573
+11
+26.036975304297847
+21
+-26.641874454191743
+31
+270.7082095734198
+12
+25.293451058788087
+22
+-28.185812893619044
+32
+268.15272525988314
+13
+25.293451058788087
+23
+-28.185812893619044
+33
+268.15272525988314
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.315311259544398
+20
+-29.993513821123035
+30
+269.2476285985039
+11
+25.797854986388412
+21
+-31.93416077779596
+31
+272.22507204809585
+12
+26.149538303822645
+22
+-30.496700851431534
+32
+270.5521424956993
+13
+26.149538303822645
+23
+-30.496700851431534
+33
+270.5521424956993
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.315311259544398
+20
+-29.993513821123035
+30
+269.2476285985039
+11
+29.733605053556875
+21
+-30.1075979422628
+31
+268.4021892047757
+12
+25.797854986388412
+22
+-31.93416077779596
+32
+272.22507204809585
+13
+25.797854986388412
+23
+-31.93416077779596
+33
+272.22507204809585
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.797854986388412
+20
+-31.93416077779596
+30
+272.22507204809585
+11
+22.41853120606009
+21
+-28.132877861410115
+31
+268.40888213988313
+12
+25.293451058788087
+22
+-28.185812893619044
+32
+268.15272525988314
+13
+25.293451058788087
+23
+-28.185812893619044
+33
+268.15272525988314
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.149538303822645
+20
+-30.496700851431534
+30
+270.5521424956993
+11
+25.797854986388412
+21
+-31.93416077779596
+31
+272.22507204809585
+12
+25.293451058788087
+22
+-28.185812893619044
+32
+268.15272525988314
+13
+25.293451058788087
+23
+-28.185812893619044
+33
+268.15272525988314
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.00672524480919
+20
+-26.777558502267187
+30
+269.2786594794548
+11
+29.733605053556875
+21
+-30.1075979422628
+31
+268.4021892047757
+12
+28.315311259544398
+22
+-29.993513821123035
+32
+269.2476285985039
+13
+28.315311259544398
+23
+-29.993513821123035
+33
+269.2476285985039
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.00672524480919
+20
+-26.777558502267187
+30
+269.2786594794548
+11
+28.315311259544398
+21
+-29.993513821123035
+31
+269.2476285985039
+12
+34.15854783217367
+22
+-26.513796014191808
+32
+270.46513433931085
+13
+34.15854783217367
+23
+-26.513796014191808
+33
+270.46513433931085
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.90414304727462
+20
+-25.731331055332745
+30
+269.81683230691283
+11
+40.68841870190421
+21
+-28.405767079177412
+31
+269.90566580923985
+12
+38.583794835113494
+22
+-27.97772345666017
+32
+269.9363924658669
+13
+38.583794835113494
+23
+-27.97772345666017
+33
+269.9363924658669
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.87516848574824
+20
+-24.972291369346983
+30
+265.9306708043999
+11
+40.68841870190421
+21
+-28.405767079177412
+31
+269.90566580923985
+12
+38.90414304727462
+22
+-25.731331055332745
+32
+269.81683230691283
+13
+38.90414304727462
+23
+-25.731331055332745
+33
+269.81683230691283
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.00672524480919
+20
+-26.777558502267187
+30
+269.2786594794548
+11
+38.583794835113494
+21
+-27.97772345666017
+31
+269.9363924658669
+12
+35.72469464718358
+22
+-29.067759206112502
+32
+270.05473572752925
+13
+35.72469464718358
+23
+-29.067759206112502
+33
+270.05473572752925
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.90414304727462
+20
+-25.731331055332745
+30
+269.81683230691283
+11
+38.583794835113494
+21
+-27.97772345666017
+31
+269.9363924658669
+12
+35.00672524480919
+22
+-26.777558502267187
+32
+269.2786594794548
+13
+35.00672524480919
+23
+-26.777558502267187
+33
+269.2786594794548
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.38239833326102
+20
+-24.415865082508027
+30
+270.66561816819467
+11
+43.87516848574824
+21
+-24.972291369346983
+31
+265.9306708043999
+12
+38.90414304727462
+22
+-25.731331055332745
+32
+269.81683230691283
+13
+38.90414304727462
+23
+-25.731331055332745
+33
+269.81683230691283
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.22078196688917
+20
+-23.689377399087604
+30
+267.190159501786
+11
+43.87516848574824
+21
+-24.972291369346983
+31
+265.9306708043999
+12
+38.38239833326102
+22
+-24.415865082508027
+32
+270.66561816819467
+13
+38.38239833326102
+23
+-24.415865082508027
+33
+270.66561816819467
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.90414304727462
+20
+-25.731331055332745
+30
+269.81683230691283
+11
+35.00672524480919
+21
+-26.777558502267187
+31
+269.2786594794548
+12
+34.15854783217367
+22
+-26.513796014191808
+32
+270.46513433931085
+13
+34.15854783217367
+23
+-26.513796014191808
+33
+270.46513433931085
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.38239833326102
+20
+-24.415865082508027
+30
+270.66561816819467
+11
+38.90414304727462
+21
+-25.731331055332745
+31
+269.81683230691283
+12
+34.15854783217367
+22
+-26.513796014191808
+32
+270.46513433931085
+13
+34.15854783217367
+23
+-26.513796014191808
+33
+270.46513433931085
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.42320834305095
+20
+-21.001555505030687
+30
+272.9692047422543
+11
+43.22078196688917
+21
+-23.689377399087604
+31
+267.190159501786
+12
+38.38239833326102
+22
+-24.415865082508027
+32
+270.66561816819467
+13
+38.38239833326102
+23
+-24.415865082508027
+33
+270.66561816819467
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.0462158061343
+20
+-18.900582330115938
+30
+271.49219565389586
+11
+43.22078196688917
+21
+-23.689377399087604
+31
+267.190159501786
+12
+35.42320834305095
+22
+-21.001555505030687
+32
+272.9692047422543
+13
+35.42320834305095
+23
+-21.001555505030687
+33
+272.9692047422543
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.38239833326102
+20
+-24.415865082508027
+30
+270.66561816819467
+11
+34.15854783217367
+21
+-26.513796014191808
+31
+270.46513433931085
+12
+32.66876132224682
+22
+-23.97899895462346
+32
+274.08722912942574
+13
+32.66876132224682
+23
+-23.97899895462346
+33
+274.08722912942574
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.42320834305095
+20
+-21.001555505030687
+30
+272.9692047422543
+11
+38.38239833326102
+21
+-24.415865082508027
+31
+270.66561816819467
+12
+32.66876132224682
+22
+-23.97899895462346
+32
+274.08722912942574
+13
+32.66876132224682
+23
+-23.97899895462346
+33
+274.08722912942574
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.66876132224682
+20
+-23.97899895462346
+30
+274.08722912942574
+11
+28.315311259544398
+21
+-29.993513821123035
+31
+269.2476285985039
+12
+28.265722694888886
+22
+-27.239979473289306
+32
+274.35464230937714
+13
+28.265722694888886
+23
+-27.239979473289306
+33
+274.35464230937714
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.15854783217367
+20
+-26.513796014191808
+30
+270.46513433931085
+11
+28.315311259544398
+21
+-29.993513821123035
+31
+269.2476285985039
+12
+32.66876132224682
+22
+-23.97899895462346
+32
+274.08722912942574
+13
+32.66876132224682
+23
+-23.97899895462346
+33
+274.08722912942574
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.758144672550465
+20
+-20.259248156810642
+30
+263.502048033573
+11
+38.26588041753671
+21
+-21.160969050301233
+31
+263.5154339037866
+12
+26.036975304297847
+22
+-26.641874454191743
+32
+270.7082095734198
+13
+26.036975304297847
+23
+-26.641874454191743
+33
+270.7082095734198
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.26588041753671
+20
+-21.160969050301233
+30
+263.5154339037866
+11
+27.62107135436712
+21
+-25.251265073576
+31
+271.2037909956523
+12
+26.036975304297847
+22
+-26.641874454191743
+32
+270.7082095734198
+13
+26.036975304297847
+23
+-26.641874454191743
+33
+270.7082095734198
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+48.0171826439378
+20
+-15.896367140092384
+30
+256.982520790827
+11
+38.26588041753671
+21
+-21.160969050301233
+31
+263.5154339037866
+12
+36.758144672550465
+22
+-20.259248156810642
+32
+263.502048033573
+13
+36.758144672550465
+23
+-20.259248156810642
+33
+263.502048033573
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+48.0171826439378
+20
+-15.896367140092384
+30
+256.982520790827
+11
+36.758144672550465
+21
+-20.259248156810642
+31
+263.502048033573
+12
+43.984993466365644
+22
+-19.090722532011196
+32
+252.45049105049918
+13
+43.984993466365644
+23
+-19.090722532011196
+33
+252.45049105049918
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+46.90889343510309
+20
+-29.995339167058177
+30
+257.25906070046665
+11
+43.87516848574824
+21
+-24.972291369346983
+31
+265.9306708043999
+12
+46.33695170778788
+22
+-24.186784167257358
+32
+264.62767802881996
+13
+46.33695170778788
+23
+-24.186784167257358
+33
+264.62767802881996
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.17242943808238
+20
+-29.65095723337649
+30
+255.778096695908
+11
+46.90889343510309
+21
+-29.995339167058177
+31
+257.25906070046665
+12
+46.33695170778788
+22
+-24.186784167257358
+32
+264.62767802881996
+13
+46.33695170778788
+23
+-24.186784167257358
+33
+264.62767802881996
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.0462158061343
+20
+-18.900582330115938
+30
+271.49219565389586
+11
+42.405765005465014
+21
+-19.694607813250055
+31
+269.7791084908574
+12
+43.22078196688917
+22
+-23.689377399087604
+32
+267.190159501786
+13
+43.22078196688917
+23
+-23.689377399087604
+33
+267.190159501786
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+42.405765005465014
+20
+-19.694607813250055
+30
+269.7791084908574
+11
+44.95181836498677
+21
+-22.347748134481563
+31
+268.4840255476755
+12
+43.22078196688917
+22
+-23.689377399087604
+32
+267.190159501786
+13
+43.22078196688917
+23
+-23.689377399087604
+33
+267.190159501786
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.95181836498677
+20
+-22.347748134481563
+30
+268.4840255476755
+11
+43.87516848574824
+21
+-24.972291369346983
+31
+265.9306708043999
+12
+43.22078196688917
+22
+-23.689377399087604
+32
+267.190159501786
+13
+43.22078196688917
+23
+-23.689377399087604
+33
+267.190159501786
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+46.33695170778788
+20
+-24.186784167257358
+30
+264.62767802881996
+11
+43.87516848574824
+21
+-24.972291369346983
+31
+265.9306708043999
+12
+44.95181836498677
+22
+-22.347748134481563
+32
+268.4840255476755
+13
+44.95181836498677
+23
+-22.347748134481563
+33
+268.4840255476755
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+42.405765005465014
+20
+-19.694607813250055
+30
+269.7791084908574
+11
+45.741888931921636
+21
+-19.865277658475435
+31
+269.6294301239217
+12
+46.989208656385685
+22
+-21.523300219043357
+32
+269.3863548898123
+13
+46.989208656385685
+23
+-21.523300219043357
+33
+269.3863548898123
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+42.405765005465014
+20
+-19.694607813250055
+30
+269.7791084908574
+11
+46.989208656385685
+21
+-21.523300219043357
+31
+269.3863548898123
+12
+44.95181836498677
+22
+-22.347748134481563
+32
+268.4840255476755
+13
+44.95181836498677
+23
+-22.347748134481563
+33
+268.4840255476755
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+49.447919212762606
+20
+-19.1561307614691
+30
+269.20838366083456
+11
+50.02755781545073
+21
+-20.481331912630978
+31
+268.249164370289
+12
+45.741888931921636
+22
+-19.865277658475435
+32
+269.6294301239217
+13
+45.741888931921636
+23
+-19.865277658475435
+33
+269.6294301239217
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.741888931921636
+20
+-19.865277658475435
+30
+269.6294301239217
+11
+50.02755781545073
+21
+-20.481331912630978
+31
+268.249164370289
+12
+46.989208656385685
+22
+-21.523300219043357
+32
+269.3863548898123
+13
+46.989208656385685
+23
+-21.523300219043357
+33
+269.3863548898123
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+51.956705092711985
+20
+-17.55165168175585
+30
+268.0781903007413
+11
+53.57286638642966
+21
+-19.352963898475107
+31
+265.7453981916702
+12
+49.447919212762606
+22
+-19.1561307614691
+32
+269.20838366083456
+13
+49.447919212762606
+23
+-19.1561307614691
+33
+269.20838366083456
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+49.447919212762606
+20
+-19.1561307614691
+30
+269.20838366083456
+11
+53.57286638642966
+21
+-19.352963898475107
+31
+265.7453981916702
+12
+50.02755781545073
+22
+-20.481331912630978
+32
+268.249164370289
+13
+50.02755781545073
+23
+-20.481331912630978
+33
+268.249164370289
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+52.05795094741968
+20
+-17.264768145128038
+30
+263.83639056459447
+11
+51.956705092711985
+21
+-17.55165168175585
+31
+268.0781903007413
+12
+50.41580889651438
+22
+-17.159810753679405
+32
+264.35904795157745
+13
+50.41580889651438
+23
+-17.159810753679405
+33
+264.35904795157745
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+52.05795094741968
+20
+-17.264768145128038
+30
+263.83639056459447
+11
+53.57286638642966
+21
+-19.352963898475107
+31
+265.7453981916702
+12
+51.956705092711985
+22
+-17.55165168175585
+32
+268.0781903007413
+13
+51.956705092711985
+23
+-17.55165168175585
+33
+268.0781903007413
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.41580889651438
+20
+-17.159810753679405
+30
+264.35904795157745
+11
+47.7552455018004
+21
+-15.261450977909519
+31
+263.94712821818183
+12
+47.66184863462711
+22
+-15.899409383324077
+32
+262.00100522369445
+13
+47.66184863462711
+23
+-15.899409383324077
+33
+262.00100522369445
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+52.05795094741968
+20
+-17.264768145128038
+30
+263.83639056459447
+11
+50.41580889651438
+21
+-17.159810753679405
+31
+264.35904795157745
+12
+47.66184863462711
+22
+-15.899409383324077
+32
+262.00100522369445
+13
+47.66184863462711
+23
+-15.899409383324077
+33
+262.00100522369445
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.006090925022978
+20
+-83.42351900366741
+30
+263.2586685751247
+11
+16.082451230106024
+21
+-89.18826570095459
+31
+271.5898516615735
+12
+14.929136821461386
+22
+-86.01642290894102
+32
+277.5216175122083
+13
+14.929136821461386
+23
+-86.01642290894102
+33
+277.5216175122083
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.006090925022978
+20
+-83.42351900366741
+30
+263.2586685751247
+11
+14.929136821461386
+21
+-86.01642290894102
+31
+277.5216175122083
+12
+15.540323486448743
+22
+-79.63623040614361
+32
+267.68026488618904
+13
+15.540323486448743
+23
+-79.63623040614361
+33
+267.68026488618904
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.320065076567788
+20
+-87.58439506988398
+30
+257.268491654466
+11
+18.180382161789858
+21
+-94.29558363614852
+31
+265.6924631594419
+12
+16.006090925022978
+22
+-83.42351900366741
+32
+263.2586685751247
+13
+16.006090925022978
+23
+-83.42351900366741
+33
+263.2586685751247
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.006090925022978
+20
+-83.42351900366741
+30
+263.2586685751247
+11
+18.180382161789858
+21
+-94.29558363614852
+31
+265.6924631594419
+12
+16.082451230106024
+22
+-89.18826570095459
+32
+271.5898516615735
+13
+16.082451230106024
+23
+-89.18826570095459
+33
+271.5898516615735
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.110454517993233
+20
+-89.31208500042753
+30
+254.88793632667756
+11
+18.86975447779849
+21
+-98.23163792763907
+31
+261.64445431707065
+12
+15.320065076567788
+22
+-87.58439506988398
+32
+257.268491654466
+13
+15.320065076567788
+23
+-87.58439506988398
+33
+257.268491654466
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.320065076567788
+20
+-87.58439506988398
+30
+257.268491654466
+11
+18.86975447779849
+21
+-98.23163792763907
+31
+261.64445431707065
+12
+18.180382161789858
+22
+-94.29558363614852
+32
+265.6924631594419
+13
+18.180382161789858
+23
+-94.29558363614852
+33
+265.6924631594419
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.180382161789858
+20
+-94.29558363614852
+30
+265.6924631594419
+11
+18.376302625827616
+21
+-109.03160139556046
+31
+267.5308907435688
+12
+17.15818843637546
+22
+-109.41796628582242
+32
+271.85817751448974
+13
+17.15818843637546
+23
+-109.41796628582242
+33
+271.85817751448974
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.86975447779849
+20
+-98.23163792763907
+30
+261.64445431707065
+11
+18.376302625827616
+21
+-109.03160139556046
+31
+267.5308907435688
+12
+18.180382161789858
+22
+-94.29558363614852
+32
+265.6924631594419
+13
+18.180382161789858
+23
+-94.29558363614852
+33
+265.6924631594419
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.082451230106024
+20
+-89.18826570095459
+30
+271.5898516615735
+11
+17.15818843637546
+21
+-109.41796628582242
+31
+271.85817751448974
+12
+14.954691664596735
+22
+-102.2969875564264
+32
+276.7044709805187
+13
+14.954691664596735
+23
+-102.2969875564264
+33
+276.7044709805187
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.180382161789858
+20
+-94.29558363614852
+30
+265.6924631594419
+11
+17.15818843637546
+21
+-109.41796628582242
+31
+271.85817751448974
+12
+16.082451230106024
+22
+-89.18826570095459
+32
+271.5898516615735
+13
+16.082451230106024
+23
+-89.18826570095459
+33
+271.5898516615735
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.954691664596735
+20
+-102.2969875564264
+30
+276.7044709805187
+11
+12.505685864124754
+21
+-98.50726516431857
+31
+282.3566546782798
+12
+12.765493436000916
+22
+-92.53655860033471
+32
+279.1501303134398
+13
+12.765493436000916
+23
+-92.53655860033471
+33
+279.1501303134398
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.082451230106024
+20
+-89.18826570095459
+30
+271.5898516615735
+11
+14.954691664596735
+21
+-102.2969875564264
+31
+276.7044709805187
+12
+12.765493436000916
+22
+-92.53655860033471
+32
+279.1501303134398
+13
+12.765493436000916
+23
+-92.53655860033471
+33
+279.1501303134398
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.082451230106024
+20
+-89.18826570095459
+30
+271.5898516615735
+11
+12.765493436000916
+21
+-92.53655860033471
+31
+279.1501303134398
+12
+14.929136821461386
+22
+-86.01642290894102
+32
+277.5216175122083
+13
+14.929136821461386
+23
+-86.01642290894102
+33
+277.5216175122083
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.459733341178188
+20
+-87.56492471320799
+30
+251.78576090463918
+11
+6.178428393538843
+21
+-89.47301966731385
+31
+247.7438365487293
+12
+5.639647117434997
+22
+-90.39603626341768
+32
+249.58287258150585
+13
+5.639647117434997
+23
+-90.39603626341768
+33
+249.58287258150585
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.293003761984753
+20
+-85.69607469677305
+30
+250.85087955993777
+11
+6.178428393538843
+21
+-89.47301966731385
+31
+247.7438365487293
+12
+13.459733341178188
+22
+-87.56492471320799
+32
+251.78576090463918
+13
+13.459733341178188
+23
+-87.56492471320799
+33
+251.78576090463918
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+5.639647117434997
+20
+-90.39603626341768
+30
+249.58287258150585
+11
+0.020623870886214313
+21
+-85.92667673363631
+31
+246.7316822259761
+12
+0.020623870886214313
+22
+-87.74228749353958
+32
+248.8968467330513
+13
+0.020623870886214313
+23
+-87.74228749353958
+33
+248.8968467330513
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+6.178428393538843
+20
+-89.47301966731385
+30
+247.7438365487293
+11
+0.020623870886214313
+21
+-85.92667673363631
+31
+246.7316822259761
+12
+5.639647117434997
+22
+-90.39603626341768
+32
+249.58287258150585
+13
+5.639647117434997
+23
+-90.39603626341768
+33
+249.58287258150585
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+5.639647117434997
+20
+-90.39603626341768
+30
+249.58287258150585
+11
+7.04790150878716
+21
+-95.38714050721184
+31
+248.97898730027018
+12
+14.035021536046834
+22
+-93.34883754284478
+32
+252.6950874062043
+13
+14.035021536046834
+23
+-93.34883754284478
+33
+252.6950874062043
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.459733341178188
+20
+-87.56492471320799
+30
+251.78576090463918
+11
+5.639647117434997
+21
+-90.39603626341768
+31
+249.58287258150585
+12
+14.035021536046834
+22
+-93.34883754284478
+32
+252.6950874062043
+13
+14.035021536046834
+23
+-93.34883754284478
+33
+252.6950874062043
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-87.74228749353958
+30
+248.8968467330513
+11
+0.020623870886214313
+21
+-91.87852138959173
+31
+250.0337330282507
+12
+7.04790150878716
+22
+-95.38714050721184
+32
+248.97898730027018
+13
+7.04790150878716
+23
+-95.38714050721184
+33
+248.97898730027018
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-87.74228749353958
+30
+248.8968467330513
+11
+7.04790150878716
+21
+-95.38714050721184
+31
+248.97898730027018
+12
+5.639647117434997
+22
+-90.39603626341768
+32
+249.58287258150585
+13
+5.639647117434997
+23
+-90.39603626341768
+33
+249.58287258150585
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.459733341178188
+20
+-87.56492471320799
+30
+251.78576090463918
+11
+15.110454517993233
+21
+-89.31208500042753
+31
+254.88793632667756
+12
+14.000035738897225
+22
+-86.50683251767529
+32
+253.32452753057572
+13
+14.000035738897225
+23
+-86.50683251767529
+33
+253.32452753057572
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.459733341178188
+20
+-87.56492471320799
+30
+251.78576090463918
+11
+14.035021536046834
+21
+-93.34883754284478
+31
+252.6950874062043
+12
+15.110454517993233
+22
+-89.31208500042753
+32
+254.88793632667756
+13
+15.110454517993233
+23
+-89.31208500042753
+33
+254.88793632667756
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.293003761984753
+20
+-85.69607469677305
+30
+250.85087955993777
+11
+13.459733341178188
+21
+-87.56492471320799
+31
+251.78576090463918
+12
+14.000035738897225
+22
+-86.50683251767529
+32
+253.32452753057572
+13
+14.000035738897225
+23
+-86.50683251767529
+33
+253.32452753057572
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.293003761984753
+20
+-85.69607469677305
+30
+250.85087955993777
+11
+14.000035738897225
+21
+-86.50683251767529
+31
+253.32452753057572
+12
+16.16033265680426
+22
+-83.83787253164563
+32
+254.3585860045894
+13
+16.16033265680426
+23
+-83.83787253164563
+33
+254.3585860045894
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.16033265680426
+20
+-83.83787253164563
+30
+254.3585860045894
+11
+14.000035738897225
+21
+-86.50683251767529
+31
+253.32452753057572
+12
+15.110454517993233
+22
+-89.31208500042753
+32
+254.88793632667756
+13
+15.110454517993233
+23
+-89.31208500042753
+33
+254.88793632667756
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.16033265680426
+20
+-83.83787253164563
+30
+254.3585860045894
+11
+15.110454517993233
+21
+-89.31208500042753
+31
+254.88793632667756
+12
+15.320065076567788
+22
+-87.58439506988398
+32
+257.268491654466
+13
+15.320065076567788
+23
+-87.58439506988398
+33
+257.268491654466
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-96.77683721485921
+30
+251.86394655565815
+11
+0.6321147601966108
+21
+-113.08964964058839
+31
+257.2757930382123
+12
+0.9442489156356495
+22
+-112.04037995042249
+32
+253.53200851888246
+13
+0.9442489156356495
+23
+-112.04037995042249
+33
+253.53200851888246
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-96.77683721485921
+30
+251.86394655565815
+11
+0.020623870886214313
+21
+-108.01062456743557
+31
+257.057055749948
+12
+0.6321147601966108
+22
+-113.08964964058839
+32
+257.2757930382123
+13
+0.6321147601966108
+23
+-113.08964964058839
+33
+257.2757930382123
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.9442489156356495
+20
+-112.04037995042249
+30
+253.53200851888246
+11
+0.6321147601966108
+21
+-113.08964964058839
+31
+257.2757930382123
+12
+2.658857200289076
+22
+-122.43876731193058
+32
+257.0768303309419
+13
+2.658857200289076
+23
+-122.43876731193058
+33
+257.0768303309419
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-91.87852138959173
+30
+250.0337330282507
+11
+0.020623870886214313
+21
+-96.77683721485921
+31
+251.86394655565815
+12
+0.9442489156356495
+22
+-112.04037995042249
+32
+253.53200851888246
+13
+0.9442489156356495
+23
+-112.04037995042249
+33
+253.53200851888246
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-91.87852138959173
+30
+250.0337330282507
+11
+0.9442489156356495
+21
+-112.04037995042249
+31
+253.53200851888246
+12
+3.771101325323326
+22
+-109.6065853661019
+32
+251.17518268829224
+13
+3.771101325323326
+23
+-109.6065853661019
+33
+251.17518268829224
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-91.87852138959173
+30
+250.0337330282507
+11
+3.771101325323326
+21
+-109.6065853661019
+31
+251.17518268829224
+12
+7.04790150878716
+22
+-95.38714050721184
+32
+248.97898730027018
+13
+7.04790150878716
+23
+-95.38714050721184
+33
+248.97898730027018
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.04790150878716
+20
+-95.38714050721184
+30
+248.97898730027018
+11
+3.771101325323326
+21
+-109.6065853661019
+31
+251.17518268829224
+12
+11.295481507071619
+22
+-105.8457642846805
+32
+247.65439459775126
+13
+11.295481507071619
+23
+-105.8457642846805
+33
+247.65439459775126
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.04790150878716
+20
+-95.38714050721184
+30
+248.97898730027018
+11
+11.295481507071619
+21
+-105.8457642846805
+31
+247.65439459775126
+12
+15.355659322363474
+22
+-103.73110101523027
+32
+250.73588276582424
+13
+15.355659322363474
+23
+-103.73110101523027
+33
+250.73588276582424
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.035021536046834
+20
+-93.34883754284478
+30
+252.6950874062043
+11
+7.04790150878716
+21
+-95.38714050721184
+31
+248.97898730027018
+12
+15.355659322363474
+22
+-103.73110101523027
+32
+250.73588276582424
+13
+15.355659322363474
+23
+-103.73110101523027
+33
+250.73588276582424
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.110454517993233
+20
+-89.31208500042753
+30
+254.88793632667756
+11
+14.035021536046834
+21
+-93.34883754284478
+31
+252.6950874062043
+12
+15.355659322363474
+22
+-103.73110101523027
+32
+250.73588276582424
+13
+15.355659322363474
+23
+-103.73110101523027
+33
+250.73588276582424
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.355659322363474
+20
+-103.73110101523027
+30
+250.73588276582424
+11
+18.86975447779849
+21
+-98.23163792763907
+31
+261.64445431707065
+12
+15.110454517993233
+22
+-89.31208500042753
+32
+254.88793632667756
+13
+15.110454517993233
+23
+-89.31208500042753
+33
+254.88793632667756
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.355659322363474
+20
+-103.73110101523027
+30
+250.73588276582424
+11
+17.783369420222666
+21
+-110.6917535263891
+31
+264.92673053834596
+12
+18.376302625827616
+22
+-109.03160139556046
+32
+267.5308907435688
+13
+18.376302625827616
+23
+-109.03160139556046
+33
+267.5308907435688
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.355659322363474
+20
+-103.73110101523027
+30
+250.73588276582424
+11
+18.376302625827616
+21
+-109.03160139556046
+31
+267.5308907435688
+12
+18.86975447779849
+22
+-98.23163792763907
+32
+261.64445431707065
+13
+18.86975447779849
+23
+-98.23163792763907
+33
+261.64445431707065
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+11.295481507071619
+20
+-105.8457642846805
+30
+247.65439459775126
+11
+3.771101325323326
+21
+-109.6065853661019
+31
+251.17518268829224
+12
+14.550681763599636
+22
+-116.81153000865763
+32
+248.91144950054974
+13
+14.550681763599636
+23
+-116.81153000865763
+33
+248.91144950054974
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.771101325323326
+20
+-109.6065853661019
+30
+251.17518268829224
+11
+0.9442489156356495
+21
+-112.04037995042249
+31
+253.53200851888246
+12
+5.23928790831437
+22
+-121.78194699848548
+32
+250.25307876515456
+13
+5.23928790831437
+23
+-121.78194699848548
+33
+250.25307876515456
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.771101325323326
+20
+-109.6065853661019
+30
+251.17518268829224
+11
+10.105964403985231
+21
+-122.2808748882708
+31
+249.2704342017355
+12
+14.550681763599636
+22
+-116.81153000865763
+32
+248.91144950054974
+13
+14.550681763599636
+23
+-116.81153000865763
+33
+248.91144950054974
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.771101325323326
+20
+-109.6065853661019
+30
+251.17518268829224
+11
+5.23928790831437
+21
+-121.78194699848548
+31
+250.25307876515456
+12
+10.105964403985231
+22
+-122.2808748882708
+32
+249.2704342017355
+13
+10.105964403985231
+23
+-122.2808748882708
+33
+249.2704342017355
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.783369420222666
+20
+-110.6917535263891
+30
+264.92673053834596
+11
+18.252787550673382
+21
+-118.56021141749713
+31
+270.7127729382414
+12
+18.376302625827616
+22
+-109.03160139556046
+32
+267.5308907435688
+13
+18.376302625827616
+23
+-109.03160139556046
+33
+267.5308907435688
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.783369420222666
+20
+-110.6917535263891
+30
+264.92673053834596
+11
+17.572237740032907
+21
+-120.32075757492889
+31
+267.86827551781727
+12
+18.252787550673382
+22
+-118.56021141749713
+32
+270.7127729382414
+13
+18.252787550673382
+23
+-118.56021141749713
+33
+270.7127729382414
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.15818843637546
+20
+-109.41796628582242
+30
+271.85817751448974
+11
+12.244052946310362
+21
+-119.79840441227046
+31
+272.77906454032905
+12
+11.769158778044908
+22
+-114.57608968296597
+32
+273.3476598000922
+13
+11.769158778044908
+23
+-114.57608968296597
+33
+273.3476598000922
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.15818843637546
+20
+-109.41796628582242
+30
+271.85817751448974
+11
+16.335870091198345
+21
+-119.90762094424133
+31
+270.8332457701652
+12
+12.244052946310362
+22
+-119.79840441227046
+32
+272.77906454032905
+13
+12.244052946310362
+23
+-119.79840441227046
+33
+272.77906454032905
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+11.111121567309398
+20
+-109.17124035983883
+30
+279.12153322706934
+11
+10.24834138716796
+21
+-111.60168847660634
+31
+282.7022535092499
+12
+10.916113776240744
+22
+-101.8954114500154
+32
+283.71227826174527
+13
+10.916113776240744
+23
+-101.8954114500154
+33
+283.71227826174527
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.885995568259794
+20
+-114.35704817037869
+30
+279.1117980487311
+11
+10.24834138716796
+21
+-111.60168847660634
+31
+282.7022535092499
+12
+11.111121567309398
+22
+-109.17124035983883
+32
+279.12153322706934
+13
+11.111121567309398
+23
+-109.17124035983883
+33
+279.12153322706934
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+11.769158778044908
+20
+-114.57608968296597
+30
+273.3476598000922
+11
+10.885995568259794
+21
+-114.35704817037869
+31
+279.1117980487311
+12
+11.111121567309398
+22
+-109.17124035983883
+32
+279.12153322706934
+13
+11.111121567309398
+23
+-109.17124035983883
+33
+279.12153322706934
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+12.244052946310362
+20
+-119.79840441227046
+30
+272.77906454032905
+11
+10.885995568259794
+21
+-114.35704817037869
+31
+279.1117980487311
+12
+11.769158778044908
+22
+-114.57608968296597
+32
+273.3476598000922
+13
+11.769158778044908
+23
+-114.57608968296597
+33
+273.3476598000922
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.916113776240744
+20
+-101.8954114500154
+30
+283.71227826174527
+11
+9.85284976721596
+21
+-107.99054576212225
+31
+285.4539625111473
+12
+9.62863644113548
+22
+-104.09890822179428
+32
+284.23980323789596
+13
+9.62863644113548
+23
+-104.09890822179428
+33
+284.23980323789596
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.24834138716796
+20
+-111.60168847660634
+30
+282.7022535092499
+11
+9.85284976721596
+21
+-107.99054576212225
+31
+285.4539625111473
+12
+10.916113776240744
+22
+-101.8954114500154
+32
+283.71227826174527
+13
+10.916113776240744
+23
+-101.8954114500154
+33
+283.71227826174527
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+6.47170064094941
+20
+-109.29627655660906
+30
+282.1506948115789
+11
+9.62863644113548
+21
+-104.09890822179428
+31
+284.23980323789596
+12
+5.818226795059477
+22
+-115.2487296612101
+32
+283.70284730772744
+13
+5.818226795059477
+23
+-115.2487296612101
+33
+283.70284730772744
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+9.62863644113548
+20
+-104.09890822179428
+30
+284.23980323789596
+11
+9.85284976721596
+21
+-107.99054576212225
+31
+285.4539625111473
+12
+5.818226795059477
+22
+-115.2487296612101
+32
+283.70284730772744
+13
+5.818226795059477
+23
+-115.2487296612101
+33
+283.70284730772744
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.689873431071632
+20
+-117.10449803175307
+30
+279.64632018431166
+11
+6.47170064094941
+21
+-109.29627655660906
+31
+282.1506948115789
+12
+5.818226795059477
+22
+-115.2487296612101
+32
+283.70284730772744
+13
+5.818226795059477
+23
+-115.2487296612101
+33
+283.70284730772744
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+5.306217259383158
+20
+-102.93677130777985
+30
+277.9149795618947
+11
+8.17261883106604
+21
+-97.1790217699253
+31
+279.8212491700648
+12
+9.62863644113548
+22
+-104.09890822179428
+32
+284.23980323789596
+13
+9.62863644113548
+23
+-104.09890822179428
+33
+284.23980323789596
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-88.18128319169226
+30
+272.0346276218583
+11
+3.7394619957271624
+21
+-92.99532887947869
+31
+277.776557494914
+12
+0.020623870886214313
+22
+-95.639342471018
+32
+272.6318199679839
+13
+0.020623870886214313
+23
+-95.639342471018
+33
+272.6318199679839
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-95.639342471018
+30
+272.6318199679839
+11
+3.7394619957271624
+21
+-92.99532887947869
+31
+277.776557494914
+12
+3.2575706680318146
+22
+-99.95446026901782
+32
+274.4404335684554
+13
+3.2575706680318146
+23
+-99.95446026901782
+33
+274.4404335684554
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.7394619957271624
+20
+-92.99532887947869
+30
+277.776557494914
+11
+8.17261883106604
+21
+-97.1790217699253
+31
+279.8212491700648
+12
+3.2575706680318146
+22
+-99.95446026901782
+32
+274.4404335684554
+13
+3.2575706680318146
+23
+-99.95446026901782
+33
+274.4404335684554
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.2575706680318146
+20
+-99.95446026901782
+30
+274.4404335684554
+11
+8.17261883106604
+21
+-97.1790217699253
+31
+279.8212491700648
+12
+5.306217259383158
+22
+-102.93677130777985
+32
+277.9149795618947
+13
+5.306217259383158
+23
+-102.93677130777985
+33
+277.9149795618947
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.15818843637546
+20
+-109.41796628582242
+30
+271.85817751448974
+11
+11.769158778044908
+21
+-114.57608968296597
+31
+273.3476598000922
+12
+11.111121567309398
+22
+-109.17124035983883
+32
+279.12153322706934
+13
+11.111121567309398
+23
+-109.17124035983883
+33
+279.12153322706934
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.15818843637546
+20
+-109.41796628582242
+30
+271.85817751448974
+11
+11.111121567309398
+21
+-109.17124035983883
+31
+279.12153322706934
+12
+14.954691664596735
+22
+-102.2969875564264
+32
+276.7044709805187
+13
+14.954691664596735
+23
+-102.2969875564264
+33
+276.7044709805187
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+11.111121567309398
+20
+-109.17124035983883
+30
+279.12153322706934
+11
+10.916113776240744
+21
+-101.8954114500154
+31
+283.71227826174527
+12
+12.505685864124754
+22
+-98.50726516431857
+32
+282.3566546782798
+13
+12.505685864124754
+23
+-98.50726516431857
+33
+282.3566546782798
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.954691664596735
+20
+-102.2969875564264
+30
+276.7044709805187
+11
+11.111121567309398
+21
+-109.17124035983883
+31
+279.12153322706934
+12
+12.505685864124754
+22
+-98.50726516431857
+32
+282.3566546782798
+13
+12.505685864124754
+23
+-98.50726516431857
+33
+282.3566546782798
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.17261883106604
+20
+-97.1790217699253
+30
+279.8212491700648
+11
+10.916113776240744
+21
+-101.8954114500154
+31
+283.71227826174527
+12
+9.62863644113548
+22
+-104.09890822179428
+32
+284.23980323789596
+13
+9.62863644113548
+23
+-104.09890822179428
+33
+284.23980323789596
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.17261883106604
+20
+-97.1790217699253
+30
+279.8212491700648
+11
+12.505685864124754
+21
+-98.50726516431857
+31
+282.3566546782798
+12
+10.916113776240744
+22
+-101.8954114500154
+32
+283.71227826174527
+13
+10.916113776240744
+23
+-101.8954114500154
+33
+283.71227826174527
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-79.19875582961288
+30
+270.5795226847603
+11
+3.7394619957271624
+21
+-92.99532887947869
+31
+277.776557494914
+12
+0.020623870886214313
+22
+-88.18128319169226
+32
+272.0346276218583
+13
+0.020623870886214313
+23
+-88.18128319169226
+33
+272.0346276218583
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-79.19875582961288
+30
+270.5795226847603
+11
+5.766508660142677
+21
+-85.41132073041456
+31
+277.91741335648356
+12
+3.7394619957271624
+22
+-92.99532887947869
+32
+277.776557494914
+13
+3.7394619957271624
+23
+-92.99532887947869
+33
+277.776557494914
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+5.766508660142677
+20
+-85.41132073041456
+30
+277.91741335648356
+11
+10.360600162369717
+21
+-93.37135014275707
+31
+281.450674644268
+12
+3.7394619957271624
+22
+-92.99532887947869
+32
+277.776557494914
+13
+3.7394619957271624
+23
+-92.99532887947869
+33
+277.776557494914
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.7394619957271624
+20
+-92.99532887947869
+30
+277.776557494914
+11
+10.360600162369717
+21
+-93.37135014275707
+31
+281.450674644268
+12
+8.17261883106604
+22
+-97.1790217699253
+32
+279.8212491700648
+13
+8.17261883106604
+23
+-97.1790217699253
+33
+279.8212491700648
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+12.765493436000916
+20
+-92.53655860033471
+30
+279.1501303134398
+11
+8.17261883106604
+21
+-97.1790217699253
+31
+279.8212491700648
+12
+10.360600162369717
+22
+-93.37135014275707
+32
+281.450674644268
+13
+10.360600162369717
+23
+-93.37135014275707
+33
+281.450674644268
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+12.765493436000916
+20
+-92.53655860033471
+30
+279.1501303134398
+11
+12.505685864124754
+21
+-98.50726516431857
+31
+282.3566546782798
+12
+8.17261883106604
+22
+-97.1790217699253
+32
+279.8212491700648
+13
+8.17261883106604
+23
+-97.1790217699253
+33
+279.8212491700648
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-72.79726762420493
+30
+268.9558774726976
+11
+6.285515355248926
+21
+-76.99678017945105
+31
+277.18301584066717
+12
+0.020623870886214313
+22
+-79.19875582961288
+32
+270.5795226847603
+13
+0.020623870886214313
+23
+-79.19875582961288
+33
+270.5795226847603
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-79.19875582961288
+30
+270.5795226847603
+11
+6.285515355248926
+21
+-76.99678017945105
+31
+277.18301584066717
+12
+5.766508660142677
+22
+-85.41132073041456
+32
+277.91741335648356
+13
+5.766508660142677
+23
+-85.41132073041456
+33
+277.91741335648356
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+12.199331970823456
+20
+-68.54755805566059
+30
+274.9901669201967
+11
+6.285515355248926
+21
+-76.99678017945105
+31
+277.18301584066717
+12
+0.020623870886214313
+22
+-72.79726762420493
+32
+268.9558774726976
+13
+0.020623870886214313
+23
+-72.79726762420493
+33
+268.9558774726976
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.636575573869563
+20
+-63.20842118630851
+30
+274.6716440539755
+11
+12.199331970823456
+21
+-68.54755805566059
+31
+274.9901669201967
+12
+0.020623870886214313
+22
+-72.79726762420493
+32
+268.9558774726976
+13
+0.020623870886214313
+23
+-72.79726762420493
+33
+268.9558774726976
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-67.40884641452016
+30
+267.81990385046754
+11
+7.636575573869563
+21
+-63.20842118630851
+31
+274.6716440539755
+12
+0.020623870886214313
+22
+-72.79726762420493
+32
+268.9558774726976
+13
+0.020623870886214313
+23
+-72.79726762420493
+33
+268.9558774726976
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-56.70258403809637
+30
+267.9762751525128
+11
+7.636575573869563
+21
+-63.20842118630851
+31
+274.6716440539755
+12
+0.020623870886214313
+22
+-67.40884641452016
+32
+267.81990385046754
+13
+0.020623870886214313
+23
+-67.40884641452016
+33
+267.81990385046754
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+6.285515355248926
+20
+-76.99678017945105
+30
+277.18301584066717
+11
+10.360600162369717
+21
+-93.37135014275707
+31
+281.450674644268
+12
+5.766508660142677
+22
+-85.41132073041456
+32
+277.91741335648356
+13
+5.766508660142677
+23
+-85.41132073041456
+33
+277.91741335648356
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+6.285515355248926
+20
+-76.99678017945105
+30
+277.18301584066717
+11
+11.432990901085711
+21
+-82.65626526096467
+31
+279.36339156389334
+12
+10.360600162369717
+22
+-93.37135014275707
+32
+281.450674644268
+13
+10.360600162369717
+23
+-93.37135014275707
+33
+281.450674644268
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+11.432990901085711
+20
+-82.65626526096467
+30
+279.36339156389334
+11
+14.929136821461386
+21
+-86.01642290894102
+31
+277.5216175122083
+12
+10.360600162369717
+22
+-93.37135014275707
+32
+281.450674644268
+13
+10.360600162369717
+23
+-93.37135014275707
+33
+281.450674644268
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.929136821461386
+20
+-86.01642290894102
+30
+277.5216175122083
+11
+12.765493436000916
+21
+-92.53655860033471
+31
+279.1501303134398
+12
+10.360600162369717
+22
+-93.37135014275707
+32
+281.450674644268
+13
+10.360600162369717
+23
+-93.37135014275707
+33
+281.450674644268
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.092215708778346
+20
+-73.44100629175855
+30
+273.3856878404827
+11
+11.432990901085711
+21
+-82.65626526096467
+31
+279.36339156389334
+12
+6.285515355248926
+22
+-76.99678017945105
+32
+277.18301584066717
+13
+6.285515355248926
+23
+-76.99678017945105
+33
+277.18301584066717
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+12.199331970823456
+20
+-68.54755805566059
+30
+274.9901669201967
+11
+14.092215708778346
+21
+-73.44100629175855
+31
+273.3856878404827
+12
+6.285515355248926
+22
+-76.99678017945105
+32
+277.18301584066717
+13
+6.285515355248926
+23
+-76.99678017945105
+33
+277.18301584066717
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.540323486448743
+20
+-79.63623040614361
+30
+267.68026488618904
+11
+14.929136821461386
+21
+-86.01642290894102
+31
+277.5216175122083
+12
+11.432990901085711
+22
+-82.65626526096467
+32
+279.36339156389334
+13
+11.432990901085711
+23
+-82.65626526096467
+33
+279.36339156389334
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.540323486448743
+20
+-79.63623040614361
+30
+267.68026488618904
+11
+11.432990901085711
+21
+-82.65626526096467
+31
+279.36339156389334
+12
+14.092215708778346
+22
+-73.44100629175855
+32
+273.3856878404827
+13
+14.092215708778346
+23
+-73.44100629175855
+33
+273.3856878404827
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+42.62511074237685
+20
+-55.43001369482223
+30
+276.4787365328351
+11
+42.29076821135589
+21
+-56.389537209690616
+31
+277.31504919687177
+12
+41.912921602140216
+22
+-57.391043681138456
+32
+277.8708670350656
+13
+41.912921602140216
+23
+-57.391043681138456
+33
+277.8708670350656
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.49339626066806
+20
+-54.51794917434869
+30
+277.2040073189627
+11
+42.62511074237685
+21
+-55.43001369482223
+31
+276.4787365328351
+12
+41.912921602140216
+22
+-57.391043681138456
+32
+277.8708670350656
+13
+41.912921602140216
+23
+-57.391043681138456
+33
+277.8708670350656
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.49339626066806
+20
+-54.51794917434869
+30
+277.2040073189627
+11
+41.912921602140216
+21
+-57.391043681138456
+31
+277.8708670350656
+12
+40.36381134922053
+22
+-57.931041854534556
+32
+278.16170548789177
+13
+40.36381134922053
+23
+-57.931041854534556
+33
+278.16170548789177
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.49339626066806
+20
+-54.51794917434869
+30
+277.2040073189627
+11
+40.36381134922053
+21
+-57.931041854534556
+31
+278.16170548789177
+12
+39.449617258485354
+22
+-56.27028127505904
+32
+277.70202253577867
+13
+39.449617258485354
+23
+-56.27028127505904
+33
+277.70202253577867
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+6.603429772825727
+20
+-34.28246832733743
+30
+255.7933079120588
+11
+15.335276292719787
+21
+-34.09780416325493
+31
+266.49044355879136
+12
+9.840680794294354
+22
+-42.23337100999042
+32
+265.735663013327
+13
+9.840680794294354
+23
+-42.23337100999042
+33
+265.735663013327
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+9.840680794294354
+20
+-42.23337100999042
+30
+265.735663013327
+11
+0.020623870886214313
+21
+-36.452500423582265
+31
+257.6779775932911
+12
+6.603429772825727
+22
+-34.28246832733743
+32
+255.7933079120588
+13
+6.603429772825727
+23
+-34.28246832733743
+33
+255.7933079120588
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-36.452500423582265
+30
+257.6779775932911
+11
+9.840680794294354
+21
+-42.23337100999042
+31
+265.735663013327
+12
+8.608268061659325
+22
+-48.226285949556164
+32
+268.7958554787848
+13
+8.608268061659325
+23
+-48.226285949556164
+33
+268.7958554787848
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-36.452500423582265
+30
+257.6779775932911
+11
+8.608268061659325
+21
+-48.226285949556164
+31
+268.7958554787848
+12
+0.020623870886214313
+22
+-48.70391813672793
+32
+264.9206460519012
+13
+0.020623870886214313
+23
+-48.70391813672793
+33
+264.9206460519012
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-48.70391813672793
+30
+264.9206460519012
+11
+7.636575573869563
+21
+-63.20842118630851
+31
+274.6716440539755
+12
+0.020623870886214313
+22
+-56.70258403809637
+32
+267.9762751525128
+13
+0.020623870886214313
+23
+-56.70258403809637
+33
+267.9762751525128
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.608268061659325
+20
+-48.226285949556164
+30
+268.7958554787848
+11
+7.636575573869563
+21
+-63.20842118630851
+31
+274.6716440539755
+12
+0.020623870886214313
+22
+-48.70391813672793
+32
+264.9206460519012
+13
+0.020623870886214313
+23
+-48.70391813672793
+33
+264.9206460519012
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.608268061659325
+20
+-48.226285949556164
+30
+268.7958554787848
+11
+10.54891501833147
+21
+-48.260663298061445
+31
+275.72517288466685
+12
+7.636575573869563
+22
+-63.20842118630851
+32
+274.6716440539755
+13
+7.636575573869563
+23
+-63.20842118630851
+33
+274.6716440539755
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.54891501833147
+20
+-48.260663298061445
+30
+275.72517288466685
+11
+10.610368331585578
+21
+-58.662092902799024
+31
+275.66737026328656
+12
+7.636575573869563
+22
+-63.20842118630851
+32
+274.6716440539755
+13
+7.636575573869563
+23
+-63.20842118630851
+33
+274.6716440539755
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.610368331585578
+20
+-58.662092902799024
+30
+275.66737026328656
+11
+15.021621015665545
+21
+-61.68212775761751
+31
+277.3564237048039
+12
+7.636575573869563
+22
+-63.20842118630851
+32
+274.6716440539755
+13
+7.636575573869563
+23
+-63.20842118630851
+33
+274.6716440539755
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.610368331585578
+20
+-58.662092902799024
+30
+275.66737026328656
+11
+14.805925970630177
+21
+-59.056976074105265
+31
+277.0138671170615
+12
+15.021621015665545
+22
+-61.68212775761751
+32
+277.3564237048039
+13
+15.021621015665545
+23
+-61.68212775761751
+33
+277.3564237048039
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.072569550093522
+20
+-58.39893886336902
+30
+274.2052681667564
+11
+15.021621015665545
+21
+-61.68212775761751
+31
+277.3564237048039
+12
+14.805925970630177
+22
+-59.056976074105265
+32
+277.0138671170615
+13
+14.805925970630177
+23
+-59.056976074105265
+33
+277.0138671170615
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.072569550093522
+20
+-58.39893886336902
+30
+274.2052681667564
+11
+14.805925970630177
+21
+-59.056976074105265
+31
+277.0138671170615
+12
+22.37350600625016
+22
+-55.554137218623254
+32
+279.0369588652784
+13
+22.37350600625016
+23
+-55.554137218623254
+33
+279.0369588652784
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.71615049499836
+20
+-46.57556477274322
+30
+276.9797939928842
+11
+10.54891501833147
+21
+-48.260663298061445
+31
+275.72517288466685
+12
+9.840680794294354
+22
+-42.23337100999042
+32
+265.735663013327
+13
+9.840680794294354
+23
+-42.23337100999042
+33
+265.735663013327
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+9.840680794294354
+20
+-42.23337100999042
+30
+265.735663013327
+11
+10.54891501833147
+21
+-48.260663298061445
+31
+275.72517288466685
+12
+8.608268061659325
+22
+-48.226285949556164
+32
+268.7958554787848
+13
+8.608268061659325
+23
+-48.226285949556164
+33
+268.7958554787848
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.335276292719787
+20
+-34.09780416325493
+30
+266.49044355879136
+11
+19.789424606348415
+21
+-40.36482521788137
+31
+275.9323496486591
+12
+16.71615049499836
+22
+-46.57556477274322
+32
+276.9797939928842
+13
+16.71615049499836
+23
+-46.57556477274322
+33
+276.9797939928842
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+9.840680794294354
+20
+-42.23337100999042
+30
+265.735663013327
+11
+15.335276292719787
+21
+-34.09780416325493
+31
+266.49044355879136
+12
+16.71615049499836
+22
+-46.57556477274322
+32
+276.9797939928842
+13
+16.71615049499836
+23
+-46.57556477274322
+33
+276.9797939928842
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.37350600625016
+20
+-55.554137218623254
+30
+279.0369588652784
+11
+28.16502444396265
+21
+-57.196948563037836
+31
+273.46022279963177
+12
+26.072569550093522
+22
+-58.39893886336902
+32
+274.2052681667564
+13
+26.072569550093522
+23
+-58.39893886336902
+33
+274.2052681667564
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.16502444396265
+20
+-57.196948563037836
+30
+273.46022279963177
+11
+22.37350600625016
+21
+-55.554137218623254
+31
+279.0369588652784
+12
+26.453762626862662
+22
+-52.926247516203865
+32
+279.46713205805764
+13
+26.453762626862662
+23
+-52.926247516203865
+33
+279.46713205805764
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.899465910283766
+20
+-45.78671110310091
+30
+278.824610287799
+11
+22.37350600625016
+21
+-55.554137218623254
+31
+279.0369588652784
+12
+20.593793716466177
+22
+-50.02820661492478
+32
+279.1343106486526
+13
+20.593793716466177
+23
+-50.02820661492478
+33
+279.1343106486526
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.899465910283766
+20
+-45.78671110310091
+30
+278.824610287799
+11
+26.453762626862662
+21
+-52.926247516203865
+31
+279.46713205805764
+12
+22.37350600625016
+22
+-55.554137218623254
+32
+279.0369588652784
+13
+22.37350600625016
+23
+-55.554137218623254
+33
+279.0369588652784
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.789424606348415
+20
+-40.36482521788137
+30
+275.9323496486591
+11
+20.593793716466177
+21
+-50.02820661492478
+31
+279.1343106486526
+12
+16.71615049499836
+22
+-46.57556477274322
+32
+276.9797939928842
+13
+16.71615049499836
+23
+-46.57556477274322
+33
+276.9797939928842
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.789424606348415
+20
+-40.36482521788137
+30
+275.9323496486591
+11
+25.899465910283766
+21
+-45.78671110310091
+31
+278.824610287799
+12
+20.593793716466177
+22
+-50.02820661492478
+32
+279.1343106486526
+13
+20.593793716466177
+23
+-50.02820661492478
+33
+279.1343106486526
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.046347657641995
+20
+-55.47929803515443
+30
+275.19217187069887
+11
+28.16502444396265
+21
+-57.196948563037836
+31
+273.46022279963177
+12
+26.453762626862662
+22
+-52.926247516203865
+32
+279.46713205805764
+13
+26.453762626862662
+23
+-52.926247516203865
+33
+279.46713205805764
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.046347657641995
+20
+-55.47929803515443
+30
+275.19217187069887
+11
+26.453762626862662
+21
+-52.926247516203865
+31
+279.46713205805764
+12
+29.604309716264886
+22
+-51.22350398014905
+32
+279.77379017568217
+13
+29.604309716264886
+23
+-51.22350398014905
+33
+279.77379017568217
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.44874853601878
+20
+-46.6519250778264
+30
+277.5620793471828
+11
+30.046347657641995
+21
+-55.47929803515443
+31
+275.19217187069887
+12
+29.604309716264886
+22
+-51.22350398014905
+32
+279.77379017568217
+13
+29.604309716264886
+23
+-51.22350398014905
+33
+279.77379017568217
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.378197793408546
+20
+-44.780641266807066
+30
+277.0071741819583
+11
+36.44874853601878
+21
+-46.6519250778264
+31
+277.5620793471828
+12
+29.604309716264886
+22
+-51.22350398014905
+32
+279.77379017568217
+13
+29.604309716264886
+23
+-51.22350398014905
+33
+279.77379017568217
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.899465910283766
+20
+-45.78671110310091
+30
+278.824610287799
+11
+29.18630549640792
+21
+-47.809498626994476
+31
+281.01593808665564
+12
+29.604309716264886
+22
+-51.22350398014905
+32
+279.77379017568217
+13
+29.604309716264886
+23
+-51.22350398014905
+33
+279.77379017568217
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.899465910283766
+20
+-45.78671110310091
+30
+278.824610287799
+11
+29.604309716264886
+21
+-51.22350398014905
+31
+279.77379017568217
+12
+26.453762626862662
+22
+-52.926247516203865
+32
+279.46713205805764
+13
+26.453762626862662
+23
+-52.926247516203865
+33
+279.46713205805764
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.561051261723115
+20
+-42.53120662225079
+30
+282.10992875230886
+11
+29.604309716264886
+21
+-51.22350398014905
+31
+279.77379017568217
+12
+29.18630549640792
+22
+-47.809498626994476
+32
+281.01593808665564
+13
+29.18630549640792
+23
+-47.809498626994476
+33
+281.01593808665564
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.378197793408546
+20
+-44.780641266807066
+30
+277.0071741819583
+11
+29.604309716264886
+21
+-51.22350398014905
+31
+279.77379017568217
+12
+33.561051261723115
+22
+-42.53120662225079
+32
+282.10992875230886
+13
+33.561051261723115
+23
+-42.53120662225079
+33
+282.10992875230886
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.561051261723115
+20
+-42.53120662225079
+30
+282.10992875230886
+11
+25.899465910283766
+21
+-45.78671110310091
+31
+278.824610287799
+12
+30.37278035626393
+22
+-40.41471800686001
+32
+276.3956832926491
+13
+30.37278035626393
+23
+-40.41471800686001
+33
+276.3956832926491
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.561051261723115
+20
+-42.53120662225079
+30
+282.10992875230886
+11
+29.18630549640792
+21
+-47.809498626994476
+31
+281.01593808665564
+12
+25.899465910283766
+22
+-45.78671110310091
+32
+278.824610287799
+13
+25.899465910283766
+23
+-45.78671110310091
+33
+278.824610287799
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.440391406816413
+20
+-36.35454019156776
+30
+274.60167245968296
+11
+30.37278035626393
+21
+-40.41471800686001
+31
+276.3956832926491
+12
+19.789424606348415
+22
+-40.36482521788137
+32
+275.9323496486591
+13
+19.789424606348415
+23
+-40.36482521788137
+33
+275.9323496486591
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.789424606348415
+20
+-40.36482521788137
+30
+275.9323496486591
+11
+30.37278035626393
+21
+-40.41471800686001
+31
+276.3956832926491
+12
+25.899465910283766
+22
+-45.78671110310091
+32
+278.824610287799
+13
+25.899465910283766
+23
+-45.78671110310091
+33
+278.824610287799
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.797854986388412
+20
+-31.93416077779596
+30
+272.22507204809585
+11
+30.37278035626393
+21
+-40.41471800686001
+31
+276.3956832926491
+12
+25.440391406816413
+22
+-36.35454019156776
+32
+274.60167245968296
+13
+25.440391406816413
+23
+-36.35454019156776
+33
+274.60167245968296
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.803547347521036
+20
+-35.9170656150349
+30
+269.89501795793154
+11
+30.37278035626393
+21
+-40.41471800686001
+31
+276.3956832926491
+12
+25.797854986388412
+22
+-31.93416077779596
+32
+272.22507204809585
+13
+25.797854986388412
+23
+-31.93416077779596
+33
+272.22507204809585
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.561051261723115
+20
+-42.53120662225079
+30
+282.10992875230886
+11
+30.37278035626393
+21
+-40.41471800686001
+31
+276.3956832926491
+12
+31.803547347521036
+22
+-35.9170656150349
+32
+269.89501795793154
+13
+31.803547347521036
+23
+-35.9170656150349
+33
+269.89501795793154
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.14117774542537
+20
+-38.28149705370251
+30
+272.2199002346025
+11
+33.561051261723115
+21
+-42.53120662225079
+31
+282.10992875230886
+12
+31.803547347521036
+22
+-35.9170656150349
+32
+269.89501795793154
+13
+31.803547347521036
+23
+-35.9170656150349
+33
+269.89501795793154
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.14117774542537
+20
+-38.28149705370251
+30
+272.2199002346025
+11
+34.378197793408546
+21
+-44.780641266807066
+31
+277.0071741819583
+12
+33.561051261723115
+22
+-42.53120662225079
+32
+282.10992875230886
+13
+33.561051261723115
+23
+-42.53120662225079
+33
+282.10992875230886
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.95525273354536
+20
+-39.64472624524407
+30
+269.66228635080495
+11
+34.378197793408546
+21
+-44.780641266807066
+31
+277.0071741819583
+12
+36.14117774542537
+22
+-38.28149705370251
+32
+272.2199002346025
+13
+36.14117774542537
+23
+-38.28149705370251
+33
+272.2199002346025
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.273779028963133
+20
+-112.1830611579273
+30
+249.78183528876832
+11
+15.197462674382669
+21
+-115.22378326671362
+31
+255.75588832030408
+12
+17.211123468584425
+22
+-111.22688411061395
+32
+255.24905059812042
+13
+17.211123468584425
+23
+-111.22688411061395
+33
+255.24905059812042
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.273779028963133
+20
+-112.1830611579273
+30
+249.78183528876832
+11
+17.211123468584425
+21
+-111.22688411061395
+31
+255.24905059812042
+12
+15.355659322363474
+22
+-103.73110101523027
+32
+250.73588276582424
+13
+15.355659322363474
+23
+-103.73110101523027
+33
+250.73588276582424
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.211123468584425
+20
+-111.22688411061395
+30
+255.24905059812042
+11
+15.197462674382669
+21
+-115.22378326671362
+31
+255.75588832030408
+12
+17.783369420222666
+22
+-110.6917535263891
+32
+264.92673053834596
+13
+17.783369420222666
+23
+-110.6917535263891
+33
+264.92673053834596
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.355659322363474
+20
+-103.73110101523027
+30
+250.73588276582424
+11
+17.211123468584425
+21
+-111.22688411061395
+31
+255.24905059812042
+12
+17.783369420222666
+22
+-110.6917535263891
+32
+264.92673053834596
+13
+17.783369420222666
+23
+-110.6917535263891
+33
+264.92673053834596
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.635425069025175
+20
+-56.32808389643555
+30
+273.49307902652015
+11
+43.79637438608084
+21
+-58.62801977861841
+31
+275.0032485660903
+12
+41.75715874874377
+22
+-58.23648307486595
+32
+275.59466065008013
+13
+41.75715874874377
+23
+-58.23648307486595
+33
+275.59466065008013
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.36194205277973
+20
+-56.14950421881122
+30
+274.01695331079526
+11
+44.635425069025175
+21
+-56.32808389643555
+31
+273.49307902652015
+12
+41.75715874874377
+22
+-58.23648307486595
+32
+275.59466065008013
+13
+41.75715874874377
+23
+-58.23648307486595
+33
+275.59466065008013
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.281901755485165
+20
+-53.5094455434695
+30
+271.51835894566835
+11
+44.635425069025175
+21
+-56.32808389643555
+31
+273.49307902652015
+12
+43.36194205277973
+22
+-56.14950421881122
+32
+274.01695331079526
+13
+43.36194205277973
+23
+-56.14950421881122
+33
+274.01695331079526
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.281901755485165
+20
+-53.5094455434695
+30
+271.51835894566835
+11
+43.36194205277973
+21
+-56.14950421881122
+31
+274.01695331079526
+12
+44.034277806698135
+22
+-54.36948770470372
+32
+272.1779172780186
+13
+44.034277806698135
+23
+-54.36948770470372
+33
+272.1779172780186
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.79637438608084
+20
+-58.62801977861841
+30
+275.0032485660903
+11
+37.20018261392761
+21
+-63.54580596056047
+31
+276.93781103630033
+12
+37.27380490010326
+22
+-60.056352975291546
+32
+276.53319268665797
+13
+37.27380490010326
+23
+-60.056352975291546
+33
+276.53319268665797
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.75715874874377
+20
+-58.23648307486595
+30
+275.59466065008013
+11
+43.79637438608084
+21
+-58.62801977861841
+31
+275.0032485660903
+12
+37.27380490010326
+22
+-60.056352975291546
+32
+276.53319268665797
+13
+37.27380490010326
+23
+-60.056352975291546
+33
+276.53319268665797
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.496222180580546
+20
+-58.8829597613261
+30
+275.80031629245497
+11
+37.20018261392761
+21
+-63.54580596056047
+31
+276.93781103630033
+12
+32.053619741059904
+22
+-60.9203500527242
+32
+272.92570066404954
+13
+32.053619741059904
+23
+-60.9203500527242
+33
+272.92570066404954
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.496222180580546
+20
+-58.8829597613261
+30
+275.80031629245497
+11
+37.27380490010326
+21
+-60.056352975291546
+31
+276.53319268665797
+12
+37.20018261392761
+22
+-63.54580596056047
+32
+276.93781103630033
+13
+37.20018261392761
+23
+-63.54580596056047
+33
+276.93781103630033
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.737963316057176
+20
+-51.23202226119153
+30
+269.55154869721537
+11
+45.281901755485165
+21
+-53.5094455434695
+31
+271.51835894566835
+12
+44.034277806698135
+22
+-54.36948770470372
+32
+272.1779172780186
+13
+44.034277806698135
+23
+-54.36948770470372
+33
+272.1779172780186
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.737963316057176
+20
+-51.23202226119153
+30
+269.55154869721537
+11
+44.034277806698135
+21
+-54.36948770470372
+31
+272.1779172780186
+12
+40.25550749021833
+22
+-51.75011628332995
+32
+274.683508802577
+13
+40.25550749021833
+23
+-51.75011628332995
+33
+274.683508802577
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.737963316057176
+20
+-51.23202226119153
+30
+269.55154869721537
+11
+40.25550749021833
+21
+-51.75011628332995
+31
+274.683508802577
+12
+37.73409630086278
+22
+-50.19796378717996
+32
+274.89768272599736
+13
+37.73409630086278
+23
+-50.19796378717996
+33
+274.89768272599736
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.73409630086278
+20
+-50.19796378717996
+30
+274.89768272599736
+11
+40.25550749021833
+21
+-51.75011628332995
+31
+274.683508802577
+12
+38.10251195606423
+22
+-51.66219545397171
+32
+275.83834433283687
+13
+38.10251195606423
+23
+-51.66219545397171
+33
+275.83834433283687
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.73409630086278
+20
+-50.19796378717996
+30
+274.89768272599736
+11
+38.10251195606423
+21
+-51.66219545397171
+31
+275.83834433283687
+12
+33.30793662495383
+22
+-54.10815901121369
+32
+277.2800633997228
+13
+33.30793662495383
+23
+-54.10815901121369
+33
+277.2800633997228
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.10251195606423
+20
+-51.66219545397171
+30
+275.83834433283687
+11
+36.058428729558464
+21
+-55.58030051040386
+31
+275.6208239418623
+12
+33.30793662495383
+22
+-54.10815901121369
+32
+277.2800633997228
+13
+33.30793662495383
+23
+-54.10815901121369
+33
+277.2800633997228
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.30793662495383
+20
+-54.10815901121369
+30
+277.2800633997228
+11
+36.058428729558464
+21
+-55.58030051040386
+31
+275.6208239418623
+12
+32.053619741059904
+22
+-60.9203500527242
+32
+272.92570066404954
+13
+32.053619741059904
+23
+-60.9203500527242
+33
+272.92570066404954
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.058428729558464
+20
+-55.58030051040386
+30
+275.6208239418623
+11
+35.496222180580546
+21
+-58.8829597613261
+31
+275.80031629245497
+12
+32.053619741059904
+22
+-60.9203500527242
+32
+272.92570066404954
+13
+32.053619741059904
+23
+-60.9203500527242
+33
+272.92570066404954
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+42.8109918037543
+20
+-56.27028127505868
+30
+275.6977926955912
+11
+41.75715874874377
+21
+-58.23648307486595
+31
+275.59466065008013
+12
+41.64824644109542
+22
+-57.782580384890686
+32
+276.8410677015752
+13
+41.64824644109542
+23
+-57.782580384890686
+33
+276.8410677015752
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.75715874874377
+20
+-58.23648307486595
+30
+275.59466065008013
+11
+42.8109918037543
+21
+-56.27028127505868
+31
+275.6977926955912
+12
+43.36194205277973
+22
+-56.14950421881122
+32
+274.01695331079526
+13
+43.36194205277973
+23
+-56.14950421881122
+33
+274.01695331079526
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.29805494494132
+20
+-54.98067436969166
+30
+274.3652901606763
+11
+43.36194205277973
+21
+-56.14950421881122
+31
+274.01695331079526
+12
+42.8109918037543
+22
+-56.27028127505868
+32
+275.6977926955912
+13
+42.8109918037543
+23
+-56.27028127505868
+33
+275.6977926955912
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.36194205277973
+20
+-56.14950421881122
+30
+274.01695331079526
+11
+43.29805494494132
+21
+-54.98067436969166
+31
+274.3652901606763
+12
+44.034277806698135
+22
+-54.36948770470372
+32
+272.1779172780186
+13
+44.034277806698135
+23
+-54.36948770470372
+33
+272.1779172780186
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.39973911967434
+20
+-59.10108860094619
+30
+277.52100906356924
+11
+41.75715874874377
+21
+-58.23648307486595
+31
+275.59466065008013
+12
+37.27380490010326
+22
+-60.056352975291546
+32
+276.53319268665797
+13
+37.27380490010326
+23
+-60.056352975291546
+33
+276.53319268665797
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.75715874874377
+20
+-58.23648307486595
+30
+275.59466065008013
+11
+38.39973911967434
+21
+-59.10108860094619
+31
+277.52100906356924
+12
+41.64824644109542
+22
+-57.782580384890686
+32
+276.8410677015752
+13
+41.64824644109542
+23
+-57.782580384890686
+33
+276.8410677015752
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.496222180580546
+20
+-58.8829597613261
+30
+275.80031629245497
+11
+38.39973911967434
+21
+-59.10108860094619
+31
+277.52100906356924
+12
+37.27380490010326
+22
+-60.056352975291546
+32
+276.53319268665797
+13
+37.27380490010326
+23
+-60.056352975291546
+33
+276.53319268665797
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.39973911967434
+20
+-59.10108860094619
+30
+277.52100906356924
+11
+35.496222180580546
+21
+-58.8829597613261
+31
+275.80031629245497
+12
+37.11165333592294
+22
+-58.25078161804923
+32
+276.9898333955416
+13
+37.11165333592294
+23
+-58.25078161804923
+33
+276.9898333955416
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.25550749021833
+20
+-51.75011628332995
+30
+274.683508802577
+11
+43.29805494494132
+21
+-54.98067436969166
+31
+274.3652901606763
+12
+40.56003603758137
+22
+-53.082618818245535
+32
+276.1809009205795
+13
+40.56003603758137
+23
+-53.082618818245535
+33
+276.1809009205795
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.29805494494132
+20
+-54.98067436969166
+30
+274.3652901606763
+11
+40.25550749021833
+21
+-51.75011628332995
+31
+274.683508802577
+12
+44.034277806698135
+22
+-54.36948770470372
+32
+272.1779172780186
+13
+44.034277806698135
+23
+-54.36948770470372
+33
+272.1779172780186
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.25550749021833
+20
+-51.75011628332995
+30
+274.683508802577
+11
+38.99997370903222
+21
+-53.01903593473045
+31
+277.0175178089396
+12
+38.10251195606423
+22
+-51.66219545397171
+32
+275.83834433283687
+13
+38.10251195606423
+23
+-51.66219545397171
+33
+275.83834433283687
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.99997370903222
+20
+-53.01903593473045
+30
+277.0175178089396
+11
+40.25550749021833
+21
+-51.75011628332995
+31
+274.683508802577
+12
+40.56003603758137
+22
+-53.082618818245535
+32
+276.1809009205795
+13
+40.56003603758137
+23
+-53.082618818245535
+33
+276.1809009205795
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.058428729558464
+20
+-55.58030051040386
+30
+275.6208239418623
+11
+38.99997370903222
+21
+-53.01903593473045
+31
+277.0175178089396
+12
+37.51900970447352
+22
+-55.85775309301662
+32
+276.85992960960414
+13
+37.51900970447352
+23
+-55.85775309301662
+33
+276.85992960960414
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.99997370903222
+20
+-53.01903593473045
+30
+277.0175178089396
+11
+36.058428729558464
+21
+-55.58030051040386
+31
+275.6208239418623
+12
+38.10251195606423
+22
+-51.66219545397171
+32
+275.83834433283687
+13
+38.10251195606423
+23
+-51.66219545397171
+33
+275.83834433283687
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.058428729558464
+20
+-55.58030051040386
+30
+275.6208239418623
+11
+37.11165333592294
+21
+-58.25078161804923
+31
+276.9898333955416
+12
+35.496222180580546
+22
+-58.8829597613261
+32
+275.80031629245497
+13
+35.496222180580546
+23
+-58.8829597613261
+33
+275.80031629245497
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.11165333592294
+20
+-58.25078161804923
+30
+276.9898333955416
+11
+36.058428729558464
+21
+-55.58030051040386
+31
+275.6208239418623
+12
+37.51900970447352
+22
+-55.85775309301662
+32
+276.85992960960414
+13
+37.51900970447352
+23
+-55.85775309301662
+33
+276.85992960960414
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+42.8109918037543
+20
+-56.27028127505868
+30
+275.6977926955912
+11
+41.64824644109542
+21
+-57.782580384890686
+31
+276.8410677015752
+12
+41.912921602140216
+22
+-57.391043681138456
+32
+277.8708670350656
+13
+41.912921602140216
+23
+-57.391043681138456
+33
+277.8708670350656
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+42.8109918037543
+20
+-56.27028127505868
+30
+275.6977926955912
+11
+41.912921602140216
+21
+-57.391043681138456
+31
+277.8708670350656
+12
+42.29076821135589
+22
+-56.389537209690616
+32
+277.31504919687177
+13
+42.29076821135589
+23
+-56.389537209690616
+33
+277.31504919687177
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.29805494494132
+20
+-54.98067436969166
+30
+274.3652901606763
+11
+42.8109918037543
+21
+-56.27028127505868
+31
+275.6977926955912
+12
+42.29076821135589
+22
+-56.389537209690616
+32
+277.31504919687177
+13
+42.29076821135589
+23
+-56.389537209690616
+33
+277.31504919687177
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.29805494494132
+20
+-54.98067436969166
+30
+274.3652901606763
+11
+42.29076821135589
+21
+-56.389537209690616
+31
+277.31504919687177
+12
+42.62511074237685
+22
+-55.43001369482223
+32
+276.4787365328351
+13
+42.62511074237685
+23
+-55.43001369482223
+33
+276.4787365328351
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.64824644109542
+20
+-57.782580384890686
+30
+276.8410677015752
+11
+38.39973911967434
+21
+-59.10108860094619
+31
+277.52100906356924
+12
+40.36381134922053
+22
+-57.931041854534556
+32
+278.16170548789177
+13
+40.36381134922053
+23
+-57.931041854534556
+33
+278.16170548789177
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.912921602140216
+20
+-57.391043681138456
+30
+277.8708670350656
+11
+41.64824644109542
+21
+-57.782580384890686
+31
+276.8410677015752
+12
+40.36381134922053
+22
+-57.931041854534556
+32
+278.16170548789177
+13
+40.36381134922053
+23
+-57.931041854534556
+33
+278.16170548789177
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.36473867235718
+20
+-57.52611928056823
+30
+277.82584183525563
+11
+38.39973911967434
+21
+-59.10108860094619
+31
+277.52100906356924
+12
+37.11165333592294
+22
+-58.25078161804923
+32
+276.9898333955416
+13
+37.11165333592294
+23
+-58.25078161804923
+33
+276.9898333955416
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.36473867235718
+20
+-57.52611928056823
+30
+277.82584183525563
+11
+40.36381134922053
+21
+-57.931041854534556
+31
+278.16170548789177
+12
+38.39973911967434
+22
+-59.10108860094619
+32
+277.52100906356924
+13
+38.39973911967434
+23
+-59.10108860094619
+33
+277.52100906356924
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.29805494494132
+20
+-54.98067436969166
+30
+274.3652901606763
+11
+42.62511074237685
+21
+-55.43001369482223
+31
+276.4787365328351
+12
+40.56003603758137
+22
+-53.082618818245535
+32
+276.1809009205795
+13
+40.56003603758137
+23
+-53.082618818245535
+33
+276.1809009205795
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.56003603758137
+20
+-53.082618818245535
+30
+276.1809009205795
+11
+42.62511074237685
+21
+-55.43001369482223
+31
+276.4787365328351
+12
+41.49339626066806
+22
+-54.51794917434869
+32
+277.2040073189627
+13
+41.49339626066806
+23
+-54.51794917434869
+33
+277.2040073189627
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.49339626066806
+20
+-54.51794917434869
+30
+277.2040073189627
+11
+38.99997370903222
+21
+-53.01903593473045
+31
+277.0175178089396
+12
+40.56003603758137
+22
+-53.082618818245535
+32
+276.1809009205795
+13
+40.56003603758137
+23
+-53.082618818245535
+33
+276.1809009205795
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.49339626066806
+20
+-54.51794917434869
+30
+277.2040073189627
+11
+40.437737859719256
+21
+-54.418772045037585
+31
+277.7923771597221
+12
+38.99997370903222
+22
+-53.01903593473045
+32
+277.0175178089396
+13
+38.99997370903222
+23
+-53.01903593473045
+33
+277.0175178089396
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.99997370903222
+20
+-53.01903593473045
+30
+277.0175178089396
+11
+40.437737859719256
+21
+-54.418772045037585
+31
+277.7923771597221
+12
+37.51900970447352
+22
+-55.85775309301662
+32
+276.85992960960414
+13
+37.51900970447352
+23
+-55.85775309301662
+33
+276.85992960960414
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.437737859719256
+20
+-54.418772045037585
+30
+277.7923771597221
+11
+39.449617258485354
+21
+-56.27028127505904
+31
+277.70202253577867
+12
+37.51900970447352
+22
+-55.85775309301662
+32
+276.85992960960414
+13
+37.51900970447352
+23
+-55.85775309301662
+33
+276.85992960960414
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.51900970447352
+20
+-55.85775309301662
+30
+276.85992960960414
+11
+39.449617258485354
+21
+-56.27028127505904
+31
+277.70202253577867
+12
+37.11165333592294
+22
+-58.25078161804923
+32
+276.9898333955416
+13
+37.11165333592294
+23
+-58.25078161804923
+33
+276.9898333955416
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.449617258485354
+20
+-56.27028127505904
+30
+277.70202253577867
+11
+39.36473867235718
+21
+-57.52611928056823
+31
+277.82584183525563
+12
+37.11165333592294
+22
+-58.25078161804923
+32
+276.9898333955416
+13
+37.11165333592294
+23
+-58.25078161804923
+33
+276.9898333955416
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.437737859719256
+20
+-54.418772045037585
+30
+277.7923771597221
+11
+41.49339626066806
+21
+-54.51794917434869
+31
+277.2040073189627
+12
+39.449617258485354
+22
+-56.27028127505904
+32
+277.70202253577867
+13
+39.449617258485354
+23
+-56.27028127505904
+33
+277.70202253577867
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.449617258485354
+20
+-56.27028127505904
+30
+277.70202253577867
+11
+40.36381134922053
+21
+-57.931041854534556
+31
+278.16170548789177
+12
+39.36473867235718
+22
+-57.52611928056823
+32
+277.82584183525563
+13
+39.36473867235718
+23
+-57.52611928056823
+33
+277.82584183525563
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.3266149391943625
+20
+-152.695701584196
+30
+254.08387144086652
+11
+2.497922533400925
+21
+-149.88253926904594
+31
+257.1900017791054
+12
+3.005977152877723
+22
+-154.30261445849354
+32
+254.76898461635224
+13
+3.005977152877723
+23
+-154.30261445849354
+33
+254.76898461635224
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.005977152877723
+20
+-154.30261445849354
+30
+254.76898461635224
+11
+2.497922533400925
+21
+-149.88253926904594
+31
+257.1900017791054
+12
+2.224729091311017
+22
+-155.6211226745493
+32
+256.6606514570146
+13
+2.224729091311017
+23
+-155.6211226745493
+33
+256.6606514570146
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.3266149391943625
+20
+-152.695701584196
+30
+254.08387144086652
+11
+2.3610215880329326
+21
+-145.65747187066668
+31
+257.6941014823838
+12
+2.497922533400925
+22
+-149.88253926904594
+32
+257.1900017791054
+13
+2.497922533400925
+23
+-149.88253926904594
+33
+257.1900017791054
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+6.752499691115323
+20
+-146.9227408301888
+30
+252.99231456980047
+11
+4.3266149391943625
+21
+-152.695701584196
+31
+254.08387144086652
+12
+7.175371500140917
+22
+-151.5259590621073
+32
+253.95396765492876
+13
+7.175371500140917
+23
+-151.5259590621073
+33
+253.95396765492876
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+6.752499691115323
+20
+-146.9227408301888
+30
+252.99231456980047
+11
+3.428544737580289
+21
+-147.8621855397364
+31
+253.60806459963328
+12
+4.3266149391943625
+22
+-152.695701584196
+32
+254.08387144086652
+13
+4.3266149391943625
+23
+-152.695701584196
+33
+254.08387144086652
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.676777135013405
+20
+-135.13891590155703
+30
+251.11707584258508
+11
+3.428544737580289
+21
+-147.8621855397364
+31
+253.60806459963328
+12
+6.752499691115323
+22
+-146.9227408301888
+32
+252.99231456980047
+13
+6.752499691115323
+23
+-146.9227408301888
+33
+252.99231456980047
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.676777135013405
+20
+-135.13891590155703
+30
+251.11707584258508
+11
+3.035182687889568
+21
+-136.19214050792218
+31
+254.37105920182054
+12
+3.428544737580289
+22
+-147.8621855397364
+32
+253.60806459963328
+13
+3.428544737580289
+23
+-147.8621855397364
+33
+253.60806459963328
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+9.473482036385072
+20
+-134.29682297538213
+30
+250.76691364676617
+11
+6.752499691115323
+21
+-146.9227408301888
+31
+252.99231456980047
+12
+11.37549250403116
+22
+-144.3191890736125
+32
+253.4769439164039
+13
+11.37549250403116
+23
+-144.3191890736125
+33
+253.4769439164039
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+9.473482036385072
+20
+-134.29682297538213
+30
+250.76691364676617
+11
+4.676777135013405
+21
+-135.13891590155703
+31
+251.11707584258508
+12
+6.752499691115323
+22
+-146.9227408301888
+32
+252.99231456980047
+13
+6.752499691115323
+23
+-146.9227408301888
+33
+252.99231456980047
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+11.37549250403116
+20
+-144.3191890736125
+30
+253.4769439164039
+11
+7.175371500140917
+21
+-151.5259590621073
+31
+253.95396765492876
+12
+12.297292202842364
+22
+-149.32124539303655
+32
+255.02392459906108
+13
+12.297292202842364
+23
+-149.32124539303655
+33
+255.02392459906108
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+11.37549250403116
+20
+-144.3191890736125
+30
+253.4769439164039
+11
+6.752499691115323
+21
+-146.9227408301888
+31
+252.99231456980047
+12
+7.175371500140917
+22
+-151.5259590621073
+32
+253.95396765492876
+13
+7.175371500140917
+23
+-151.5259590621073
+33
+253.95396765492876
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.7195116127193
+20
+-133.13194804246223
+30
+252.09120212495958
+11
+11.37549250403116
+21
+-144.3191890736125
+31
+253.4769439164039
+12
+17.459978964831137
+22
+-143.8585934485313
+32
+258.82338216950893
+13
+17.459978964831137
+23
+-143.8585934485313
+33
+258.82338216950893
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.7195116127193
+20
+-133.13194804246223
+30
+252.09120212495958
+11
+9.473482036385072
+21
+-134.29682297538213
+31
+250.76691364676617
+12
+11.37549250403116
+22
+-144.3191890736125
+32
+253.4769439164039
+13
+11.37549250403116
+23
+-144.3191890736125
+33
+253.4769439164039
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.459978964831137
+20
+-143.8585934485313
+30
+258.82338216950893
+11
+11.37549250403116
+21
+-144.3191890736125
+31
+253.4769439164039
+12
+16.52601029309834
+22
+-147.5019839412583
+32
+258.5863914218599
+13
+16.52601029309834
+23
+-147.5019839412583
+33
+258.5863914218599
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+11.37549250403116
+20
+-144.3191890736125
+30
+253.4769439164039
+11
+12.297292202842364
+21
+-149.32124539303655
+31
+255.02392459906108
+12
+16.52601029309834
+22
+-147.5019839412583
+32
+258.5863914218599
+13
+16.52601029309834
+23
+-147.5019839412583
+33
+258.5863914218599
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.6321147601966108
+20
+-113.08964964058839
+30
+257.2757930382123
+11
+0.7103004112178869
+21
+-112.11978249873853
+31
+263.15492808096064
+12
+1.9661384167270082
+22
+-126.46852269492001
+32
+263.3627132935933
+13
+1.9661384167270082
+23
+-126.46852269492001
+33
+263.3627132935933
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-108.01062456743557
+30
+257.057055749948
+11
+0.7103004112178869
+21
+-112.11978249873853
+31
+263.15492808096064
+12
+0.6321147601966108
+22
+-113.08964964058839
+32
+257.2757930382123
+13
+0.6321147601966108
+23
+-113.08964964058839
+33
+257.2757930382123
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-108.01062456743557
+30
+257.057055749948
+11
+0.020623870886214313
+21
+-107.43929128876809
+31
+263.2918290263299
+12
+0.7103004112178869
+22
+-112.11978249873853
+32
+263.15492808096064
+13
+0.7103004112178869
+23
+-112.11978249873853
+33
+263.15492808096064
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.7103004112178869
+20
+-112.11978249873853
+30
+263.15492808096064
+11
+0.020623870886214313
+21
+-107.43929128876809
+31
+263.2918290263299
+12
+1.137127136443013
+22
+-112.10031214206509
+32
+268.0672382250876
+13
+1.137127136443013
+23
+-112.10031214206509
+33
+268.0672382250876
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-107.43929128876809
+30
+263.2918290263299
+11
+0.020623870886214313
+21
+-105.88409654938873
+31
+267.6836113537355
+12
+1.137127136443013
+22
+-112.10031214206509
+32
+268.0672382250876
+13
+1.137127136443013
+23
+-112.10031214206509
+33
+268.0672382250876
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-95.639342471018
+30
+272.6318199679839
+11
+3.2575706680318146
+21
+-99.95446026901782
+31
+274.4404335684554
+12
+0.020623870886214313
+22
+-102.47860947727995
+32
+271.2579429251335
+13
+0.020623870886214313
+23
+-102.47860947727995
+33
+271.2579429251335
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.2575706680318146
+20
+-99.95446026901782
+30
+274.4404335684554
+11
+2.1720982834250795
+21
+-104.63312613304961
+31
+273.1009338741093
+12
+0.020623870886214313
+22
+-102.47860947727995
+32
+271.2579429251335
+13
+0.020623870886214313
+23
+-102.47860947727995
+33
+271.2579429251335
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-105.88409654938873
+30
+267.6836113537355
+11
+0.020623870886214313
+21
+-102.47860947727995
+31
+271.2579429251335
+12
+2.1720982834250795
+22
+-104.63312613304961
+32
+273.1009338741093
+13
+2.1720982834250795
+23
+-104.63312613304961
+33
+273.1009338741093
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-105.88409654938873
+30
+267.6836113537355
+11
+2.1720982834250795
+21
+-104.63312613304961
+31
+273.1009338741093
+12
+1.137127136443013
+22
+-112.10031214206509
+32
+268.0672382250876
+13
+1.137127136443013
+23
+-112.10031214206509
+33
+268.0672382250876
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+2.055580367700773
+20
+-123.82755134661284
+30
+275.2283745651228
+11
+3.689873431071632
+21
+-117.10449803175307
+31
+279.64632018431166
+12
+2.422170676963968
+22
+-132.6503609390978
+32
+282.647493131097
+13
+2.422170676963968
+23
+-132.6503609390978
+33
+282.647493131097
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+2.1720982834250795
+20
+-104.63312613304961
+30
+273.1009338741093
+11
+3.2575706680318146
+21
+-99.95446026901782
+31
+274.4404335684554
+12
+5.306217259383158
+22
+-102.93677130777985
+32
+277.9149795618947
+13
+5.306217259383158
+23
+-102.93677130777985
+33
+277.9149795618947
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+2.1720982834250795
+20
+-104.63312613304961
+30
+273.1009338741093
+11
+5.306217259383158
+21
+-102.93677130777985
+31
+277.9149795618947
+12
+3.689873431071632
+22
+-117.10449803175307
+32
+279.64632018431166
+13
+3.689873431071632
+23
+-117.10449803175307
+33
+279.64632018431166
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+2.422170676963968
+20
+-132.6503609390978
+30
+282.647493131097
+11
+7.68859793310939
+21
+-141.95962522412418
+31
+292.0671908453823
+12
+2.840174896820924
+22
+-146.74051046069778
+32
+292.028250132032
+13
+2.840174896820924
+23
+-146.74051046069778
+33
+292.028250132032
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+2.422170676963968
+20
+-132.6503609390978
+30
+282.647493131097
+11
+5.921967289216125
+21
+-125.07304572514187
+31
+287.82569533356303
+12
+7.68859793310939
+22
+-141.95962522412418
+32
+292.0671908453823
+13
+7.68859793310939
+23
+-141.95962522412418
+33
+292.0671908453823
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.689873431071632
+20
+-117.10449803175307
+30
+279.64632018431166
+11
+5.818226795059477
+21
+-115.2487296612101
+31
+283.70284730772744
+12
+2.422170676963968
+22
+-132.6503609390978
+32
+282.647493131097
+13
+2.422170676963968
+23
+-132.6503609390978
+33
+282.647493131097
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+2.422170676963968
+20
+-132.6503609390978
+30
+282.647493131097
+11
+5.818226795059477
+21
+-115.2487296612101
+31
+283.70284730772744
+12
+5.921967289216125
+22
+-125.07304572514187
+32
+287.82569533356303
+13
+5.921967289216125
+23
+-125.07304572514187
+33
+287.82569533356303
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+5.818226795059477
+20
+-115.2487296612101
+30
+283.70284730772744
+11
+9.85284976721596
+21
+-107.99054576212225
+31
+285.4539625111473
+12
+5.921967289216125
+22
+-125.07304572514187
+32
+287.82569533356303
+13
+5.921967289216125
+23
+-125.07304572514187
+33
+287.82569533356303
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+9.85284976721596
+20
+-107.99054576212225
+30
+285.4539625111473
+11
+9.948680428973564
+21
+-125.54946101502216
+31
+286.6337444358919
+12
+5.921967289216125
+22
+-125.07304572514187
+32
+287.82569533356303
+13
+5.921967289216125
+23
+-125.07304572514187
+33
+287.82569533356303
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+5.921967289216125
+20
+-125.07304572514187
+30
+287.82569533356303
+11
+9.948680428973564
+21
+-125.54946101502216
+31
+286.6337444358919
+12
+7.68859793310939
+22
+-141.95962522412418
+32
+292.0671908453823
+13
+7.68859793310939
+23
+-141.95962522412418
+33
+292.0671908453823
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+9.948680428973564
+20
+-125.54946101502216
+30
+286.6337444358919
+11
+10.35542834887803
+21
+-140.79018692635796
+31
+289.8195815467631
+12
+7.68859793310939
+22
+-141.95962522412418
+32
+292.0671908453823
+13
+7.68859793310939
+23
+-141.95962522412418
+33
+292.0671908453823
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.8873589672271407
+20
+-147.4606094333251
+30
+259.0652405063248
+11
+0.020623870886214313
+21
+-152.66527915189332
+31
+259.2906707296962
+12
+1.2548619494594848
+22
+-151.99994055740467
+32
+258.4236314090323
+13
+1.2548619494594848
+23
+-151.99994055740467
+33
+258.4236314090323
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.8873589672271407
+20
+-147.4606094333251
+30
+259.0652405063248
+11
+0.020623870886214313
+21
+-147.740495810522
+31
+259.972133213307
+12
+0.020623870886214313
+22
+-152.66527915189332
+32
+259.2906707296962
+13
+0.020623870886214313
+23
+-152.66527915189332
+33
+259.2906707296962
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.005977152877723
+20
+-154.30261445849354
+30
+254.76898461635224
+11
+2.224729091311017
+21
+-155.6211226745493
+31
+256.6606514570146
+12
+2.193393986037892
+22
+-157.414829283193
+32
+256.19397134547074
+13
+2.193393986037892
+23
+-157.414829283193
+33
+256.19397134547074
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+2.193393986037892
+20
+-157.414829283193
+30
+256.19397134547074
+11
+2.224729091311017
+21
+-155.6211226745493
+31
+256.6606514570146
+12
+1.0120909396735747
+22
+-159.11635592195614
+32
+257.3600631756826
+13
+1.0120909396735747
+23
+-159.11635592195614
+33
+257.3600631756826
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.3266149391943625
+20
+-152.695701584196
+30
+254.08387144086652
+11
+3.005977152877723
+21
+-154.30261445849354
+31
+254.76898461635224
+12
+3.035182687889568
+22
+-156.0789802807242
+32
+254.9646008560665
+13
+3.035182687889568
+23
+-156.0789802807242
+33
+254.9646008560665
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.005977152877723
+20
+-154.30261445849354
+30
+254.76898461635224
+11
+2.193393986037892
+21
+-157.414829283193
+31
+256.19397134547074
+12
+3.035182687889568
+22
+-156.0789802807242
+32
+254.9646008560665
+13
+3.035182687889568
+23
+-156.0789802807242
+33
+254.9646008560665
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+2.497922533400925
+20
+-149.88253926904594
+30
+257.1900017791054
+11
+1.0120909396735747
+21
+-159.11635592195614
+31
+257.3600631756826
+12
+2.224729091311017
+22
+-155.6211226745493
+32
+256.6606514570146
+13
+2.224729091311017
+23
+-155.6211226745493
+33
+256.6606514570146
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+2.497922533400925
+20
+-149.88253926904594
+30
+257.1900017791054
+11
+1.2548619494594848
+21
+-151.99994055740467
+31
+258.4236314090323
+12
+1.0120909396735747
+22
+-159.11635592195614
+32
+257.3600631756826
+13
+1.0120909396735747
+23
+-159.11635592195614
+33
+257.3600631756826
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+2.3610215880329326
+20
+-145.65747187066668
+30
+257.6941014823838
+11
+2.068966237914519
+21
+-136.13372943789986
+31
+259.65573991734846
+12
+0.8873589672271407
+22
+-147.4606094333251
+32
+259.0652405063248
+13
+0.8873589672271407
+23
+-147.4606094333251
+33
+259.0652405063248
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.8873589672271407
+20
+-147.4606094333251
+30
+259.0652405063248
+11
+2.068966237914519
+21
+-136.13372943789986
+31
+259.65573991734846
+12
+0.596520514400937
+22
+-137.4467616161409
+32
+261.2699541753983
+13
+0.596520514400937
+23
+-137.4467616161409
+33
+261.2699541753983
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+2.068966237914519
+20
+-136.13372943789986
+30
+259.65573991734846
+11
+1.9661384167270082
+21
+-126.46852269492001
+31
+263.3627132935933
+12
+0.596520514400937
+22
+-137.4467616161409
+32
+261.2699541753983
+13
+0.596520514400937
+23
+-137.4467616161409
+33
+261.2699541753983
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.596520514400937
+20
+-137.4467616161409
+30
+261.2699541753983
+11
+1.9661384167270082
+21
+-126.46852269492001
+31
+263.3627132935933
+12
+0.6920469518354924
+22
+-129.91629694793264
+32
+264.5269797778662
+13
+0.6920469518354924
+23
+-129.91629694793264
+33
+264.5269797778662
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+2.497922533400925
+20
+-149.88253926904594
+30
+257.1900017791054
+11
+2.3610215880329326
+21
+-145.65747187066668
+31
+257.6941014823838
+12
+1.2548619494594848
+22
+-151.99994055740467
+32
+258.4236314090323
+13
+1.2548619494594848
+23
+-151.99994055740467
+33
+258.4236314090323
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+2.3610215880329326
+20
+-145.65747187066668
+30
+257.6941014823838
+11
+0.8873589672271407
+21
+-147.4606094333251
+31
+259.0652405063248
+12
+1.2548619494594848
+22
+-151.99994055740467
+32
+258.4236314090323
+13
+1.2548619494594848
+23
+-151.99994055740467
+33
+258.4236314090323
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+12.297292202842364
+20
+-149.32124539303655
+30
+255.02392459906108
+11
+7.175371500140917
+21
+-151.5259590621073
+31
+253.95396765492876
+12
+13.888081188018505
+22
+-150.39150656149138
+32
+255.39203602993913
+13
+13.888081188018505
+23
+-150.39150656149138
+33
+255.39203602993913
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.888081188018505
+20
+-150.39150656149138
+30
+255.39203602993913
+11
+7.175371500140917
+21
+-151.5259590621073
+31
+253.95396765492876
+12
+7.904597202467808
+22
+-152.50647405526504
+32
+253.89129744438227
+13
+7.904597202467808
+23
+-152.50647405526504
+33
+253.89129744438227
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.175371500140917
+20
+-151.5259590621073
+30
+253.95396765492876
+11
+4.3266149391943625
+21
+-152.695701584196
+31
+254.08387144086652
+12
+7.904597202467808
+22
+-152.50647405526504
+32
+253.89129744438227
+13
+7.904597202467808
+23
+-152.50647405526504
+33
+253.89129744438227
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.904597202467808
+20
+-152.50647405526504
+30
+253.89129744438227
+11
+4.3266149391943625
+21
+-152.695701584196
+31
+254.08387144086652
+12
+3.035182687889568
+22
+-156.0789802807242
+32
+254.9646008560665
+13
+3.035182687889568
+23
+-156.0789802807242
+33
+254.9646008560665
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.52601029309834
+20
+-147.5019839412583
+30
+258.5863914218599
+11
+12.297292202842364
+21
+-149.32124539303655
+31
+255.02392459906108
+12
+17.161839128251934
+22
+-149.4989123976933
+32
+259.8218463977248
+13
+17.161839128251934
+23
+-149.4989123976933
+33
+259.8218463977248
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.161839128251934
+20
+-149.4989123976933
+30
+259.8218463977248
+11
+12.297292202842364
+21
+-149.32124539303655
+31
+255.02392459906108
+12
+13.888081188018505
+22
+-150.39150656149138
+32
+255.39203602993913
+13
+13.888081188018505
+23
+-150.39150656149138
+33
+255.39203602993913
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.52601029309834
+20
+-147.5019839412583
+30
+258.5863914218599
+11
+18.39120961765658
+21
+-150.28350692681386
+31
+261.9611518373419
+12
+18.14326679437898
+22
+-148.3623303268164
+32
+261.8826619619979
+13
+18.14326679437898
+23
+-148.3623303268164
+33
+261.8826619619979
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.52601029309834
+20
+-147.5019839412583
+30
+258.5863914218599
+11
+17.161839128251934
+21
+-149.4989123976933
+31
+259.8218463977248
+12
+18.39120961765658
+22
+-150.28350692681386
+32
+261.9611518373419
+13
+18.39120961765658
+23
+-150.28350692681386
+33
+261.9611518373419
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.14326679437898
+20
+-148.3623303268164
+30
+261.8826619619979
+11
+18.867016458891147
+21
+-151.77238076377296
+31
+267.04808674289336
+12
+18.53662884406969
+22
+-150.4143233857224
+32
+267.1779905288315
+13
+18.53662884406969
+23
+-150.4143233857224
+33
+267.1779905288315
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.14326679437898
+20
+-148.3623303268164
+30
+261.8826619619979
+11
+18.39120961765658
+21
+-150.28350692681386
+31
+261.9611518373419
+12
+18.867016458891147
+22
+-151.77238076377296
+32
+267.04808674289336
+13
+18.867016458891147
+23
+-151.77238076377296
+33
+267.04808674289336
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.867016458891147
+20
+-151.77238076377296
+30
+267.04808674289336
+11
+17.33463854373867
+21
+-154.86147453992314
+31
+275.08569335760933
+12
+17.691189450341543
+22
+-152.35284077213512
+32
+274.2475553476348
+13
+17.691189450341543
+23
+-152.35284077213512
+33
+274.2475553476348
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.867016458891147
+20
+-151.77238076377296
+30
+267.04808674289336
+11
+17.691189450341543
+21
+-152.35284077213512
+31
+274.2475553476348
+12
+18.53662884406969
+22
+-150.4143233857224
+32
+267.1779905288315
+13
+18.53662884406969
+23
+-150.4143233857224
+33
+267.1779905288315
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.33463854373867
+20
+-154.86147453992314
+30
+275.08569335760933
+11
+16.338303885782665
+21
+-156.303802055457
+31
+279.40811253936124
+12
+16.188017070200903
+22
+-154.19218102923617
+32
+278.5520252943273
+13
+16.188017070200903
+23
+-154.19218102923617
+33
+278.5520252943273
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.691189450341543
+20
+-152.35284077213512
+30
+274.2475553476348
+11
+17.33463854373867
+21
+-154.86147453992314
+31
+275.08569335760933
+12
+16.188017070200903
+22
+-154.19218102923617
+32
+278.5520252943273
+13
+16.188017070200903
+23
+-154.19218102923617
+33
+278.5520252943273
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.338303885782665
+20
+-156.303802055457
+30
+279.40811253936124
+11
+13.125390810157233
+21
+-158.61651535920842
+31
+285.15247620700194
+12
+13.836971501747783
+22
+-156.5030689870492
+32
+283.41200885489064
+13
+13.836971501747783
+23
+-156.5030689870492
+33
+283.41200885489064
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.188017070200903
+20
+-154.19218102923617
+30
+278.5520252943273
+11
+16.338303885782665
+21
+-156.303802055457
+31
+279.40811253936124
+12
+13.836971501747783
+22
+-156.5030689870492
+32
+283.41200885489064
+13
+13.836971501747783
+23
+-156.5030689870492
+33
+283.41200885489064
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.125390810157233
+20
+-158.61651535920842
+30
+285.15247620700194
+11
+12.087681644267786
+21
+-157.783853387049
+31
+289.08518403094024
+12
+12.29303306231978
+22
+-156.15229834258514
+32
+287.72195483939834
+13
+12.29303306231978
+23
+-156.15229834258514
+33
+287.72195483939834
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.836971501747783
+20
+-156.5030689870492
+30
+283.41200885489064
+11
+13.125390810157233
+21
+-158.61651535920842
+31
+285.15247620700194
+12
+12.29303306231978
+22
+-156.15229834258514
+32
+287.72195483939834
+13
+12.29303306231978
+23
+-156.15229834258514
+33
+287.72195483939834
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+12.29303306231978
+20
+-156.15229834258514
+30
+287.72195483939834
+11
+7.546829398572749
+21
+-163.61431253811267
+31
+297.1431736752991
+12
+6.72968286688732
+22
+-161.23299664951705
+32
+297.0932808863212
+13
+6.72968286688732
+23
+-161.23299664951705
+33
+297.0932808863212
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+12.29303306231978
+20
+-156.15229834258514
+30
+287.72195483939834
+11
+12.087681644267786
+21
+-157.783853387049
+31
+289.08518403094024
+12
+7.546829398572749
+22
+-163.61431253811267
+32
+297.1431736752991
+13
+7.546829398572749
+23
+-163.61431253811267
+33
+297.1431736752991
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.68859793310939
+20
+-141.95962522412418
+30
+292.0671908453823
+11
+10.031429444840427
+21
+-151.21017421480147
+31
+292.08301051017804
+12
+2.840174896820924
+22
+-146.74051046069778
+32
+292.028250132032
+13
+2.840174896820924
+23
+-146.74051046069778
+33
+292.028250132032
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+2.840174896820924
+20
+-146.74051046069778
+30
+292.028250132032
+11
+10.031429444840427
+21
+-151.21017421480147
+31
+292.08301051017804
+12
+4.687120761996767
+22
+-154.24207381821907
+32
+295.99016349098
+13
+4.687120761996767
+23
+-154.24207381821907
+33
+295.99016349098
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.031429444840427
+20
+-151.21017421480147
+30
+292.08301051017804
+11
+6.72968286688732
+21
+-161.23299664951705
+31
+297.0932808863212
+12
+4.687120761996767
+22
+-154.24207381821907
+32
+295.99016349098
+13
+4.687120761996767
+23
+-154.24207381821907
+33
+295.99016349098
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+12.29303306231978
+20
+-156.15229834258514
+30
+287.72195483939834
+11
+6.72968286688732
+21
+-161.23299664951705
+31
+297.0932808863212
+12
+10.031429444840427
+22
+-151.21017421480147
+32
+292.08301051017804
+13
+10.031429444840427
+23
+-151.21017421480147
+33
+292.08301051017804
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.9661384167270082
+20
+-126.46852269492001
+30
+263.3627132935933
+11
+1.745575782523003
+21
+-120.5294554605346
+31
+268.9327564241342
+12
+0.6920469518354924
+22
+-129.91629694793264
+32
+264.5269797778662
+13
+0.6920469518354924
+23
+-129.91629694793264
+33
+264.5269797778662
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.6920469518354924
+20
+-129.91629694793264
+30
+264.5269797778662
+11
+1.745575782523003
+21
+-120.5294554605346
+31
+268.9327564241342
+12
+0.8243845323578977
+22
+-126.56982939449381
+32
+268.9674379969592
+13
+0.8243845323578977
+23
+-126.56982939449381
+33
+268.9674379969592
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.745575782523003
+20
+-120.5294554605346
+30
+268.9327564241342
+11
+2.055580367700773
+21
+-123.82755134661284
+31
+275.2283745651228
+12
+0.8243845323578977
+22
+-126.56982939449381
+32
+268.9674379969592
+13
+0.8243845323578977
+23
+-126.56982939449381
+33
+268.9674379969592
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.8243845323578977
+20
+-126.56982939449381
+30
+268.9674379969592
+11
+2.055580367700773
+21
+-123.82755134661284
+31
+275.2283745651228
+12
+0.8904012104575811
+22
+-129.1052349027107
+32
+274.8058069804191
+13
+0.8904012104575811
+23
+-129.1052349027107
+33
+274.8058069804191
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.8904012104575811
+20
+-129.1052349027107
+30
+274.8058069804191
+11
+2.055580367700773
+21
+-123.82755134661284
+31
+275.2283745651228
+12
+2.422170676963968
+22
+-132.6503609390978
+32
+282.647493131097
+13
+2.422170676963968
+23
+-132.6503609390978
+33
+282.647493131097
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.8904012104575811
+20
+-129.1052349027107
+30
+274.8058069804191
+11
+2.422170676963968
+21
+-132.6503609390978
+31
+282.647493131097
+12
+1.0239556882721288
+22
+-137.20033991448392
+32
+282.32136465679724
+13
+1.0239556882721288
+23
+-137.20033991448392
+33
+282.32136465679724
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.0239556882721288
+20
+-137.20033991448392
+30
+282.32136465679724
+11
+2.422170676963968
+21
+-132.6503609390978
+31
+282.647493131097
+12
+2.840174896820924
+22
+-146.74051046069778
+32
+292.028250132032
+13
+2.840174896820924
+23
+-146.74051046069778
+33
+292.028250132032
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.0239556882721288
+20
+-137.20033991448392
+30
+282.32136465679724
+11
+2.840174896820924
+21
+-146.74051046069778
+31
+292.028250132032
+12
+1.2478647900295676
+22
+-150.95401733480156
+32
+291.12166164937173
+13
+1.2478647900295676
+23
+-150.95401733480156
+33
+291.12166164937173
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.59929905461594
+20
+-146.84455517917164
+30
+269.30938613605093
+11
+17.686321861172907
+21
+-149.84025208814774
+31
+274.1362092454027
+12
+17.99115463285898
+22
+-143.95746635352216
+32
+269.99115284398425
+13
+17.99115463285898
+23
+-143.95746635352216
+33
+269.99115284398425
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.572237740032907
+20
+-120.32075757492889
+30
+267.86827551781727
+11
+17.29204713851307
+21
+-132.79973508170684
+31
+268.8576130163401
+12
+18.252787550673382
+22
+-118.56021141749713
+32
+270.7127729382414
+13
+18.252787550673382
+23
+-118.56021141749713
+33
+270.7127729382414
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.29204713851307
+20
+-132.79973508170684
+30
+268.8576130163401
+11
+18.19863562117225
+21
+-128.779106428411
+31
+271.8980309008026
+12
+18.252787550673382
+22
+-118.56021141749713
+32
+270.7127729382414
+13
+18.252787550673382
+23
+-118.56021141749713
+33
+270.7127729382414
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.716484019656423
+20
+-121.25837693853579
+30
+258.6803967376857
+11
+14.633430779466511
+21
+-133.70419399410306
+31
+262.2787620305997
+12
+17.572237740032907
+22
+-120.32075757492889
+32
+267.86827551781727
+13
+17.572237740032907
+23
+-120.32075757492889
+33
+267.86827551781727
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.633430779466511
+20
+-133.70419399410306
+30
+262.2787620305997
+11
+17.29204713851307
+21
+-132.79973508170684
+31
+268.8576130163401
+12
+17.572237740032907
+22
+-120.32075757492889
+32
+267.86827551781727
+13
+17.572237740032907
+23
+-120.32075757492889
+33
+267.86827551781727
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.089158815380433
+20
+-139.38923391875184
+30
+263.3694062286968
+11
+15.968062884642984
+21
+-142.04419958592203
+31
+263.725652910976
+12
+17.21720795504523
+22
+-138.34665716369548
+32
+269.468495457003
+13
+17.21720795504523
+23
+-138.34665716369548
+33
+269.468495457003
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.968062884642984
+20
+-142.04419958592203
+30
+263.725652910976
+11
+17.99115463285898
+21
+-143.95746635352216
+31
+269.99115284398425
+12
+17.21720795504523
+22
+-138.34665716369548
+32
+269.468495457003
+13
+17.21720795504523
+23
+-138.34665716369548
+33
+269.468495457003
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.633430779466511
+20
+-133.70419399410306
+30
+262.2787620305997
+11
+15.089158815380433
+21
+-139.38923391875184
+31
+263.3694062286968
+12
+17.29204713851307
+22
+-132.79973508170684
+32
+268.8576130163401
+13
+17.29204713851307
+23
+-132.79973508170684
+33
+268.8576130163401
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.089158815380433
+20
+-139.38923391875184
+30
+263.3694062286968
+11
+17.21720795504523
+21
+-138.34665716369548
+31
+269.468495457003
+12
+17.29204713851307
+22
+-132.79973508170684
+32
+268.8576130163401
+13
+17.29204713851307
+23
+-132.79973508170684
+33
+268.8576130163401
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.5177522858737
+20
+-143.17408872169233
+30
+262.7433125718796
+11
+17.99115463285898
+21
+-143.95746635352216
+31
+269.99115284398425
+12
+15.968062884642984
+22
+-142.04419958592203
+32
+263.725652910976
+13
+15.968062884642984
+23
+-142.04419958592203
+33
+263.725652910976
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.5177522858737
+20
+-143.17408872169233
+30
+262.7433125718796
+11
+18.59929905461594
+21
+-146.84455517917164
+31
+269.30938613605093
+12
+17.99115463285898
+22
+-143.95746635352216
+32
+269.99115284398425
+13
+17.99115463285898
+23
+-143.95746635352216
+33
+269.99115284398425
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.14326679437898
+20
+-148.3623303268164
+30
+261.8826619619979
+11
+18.53662884406969
+21
+-150.4143233857224
+31
+267.1779905288315
+12
+18.59929905461594
+22
+-146.84455517917164
+32
+269.30938613605093
+13
+18.59929905461594
+23
+-146.84455517917164
+33
+269.30938613605093
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.14326679437898
+20
+-148.3623303268164
+30
+261.8826619619979
+11
+18.59929905461594
+21
+-146.84455517917164
+31
+269.30938613605093
+12
+19.5177522858737
+22
+-143.17408872169233
+32
+262.7433125718796
+13
+19.5177522858737
+23
+-143.17408872169233
+33
+262.7433125718796
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.52601029309834
+20
+-147.5019839412583
+30
+258.5863914218599
+11
+18.14326679437898
+21
+-148.3623303268164
+31
+261.8826619619979
+12
+19.5177522858737
+22
+-143.17408872169233
+32
+262.7433125718796
+13
+19.5177522858737
+23
+-143.17408872169233
+33
+262.7433125718796
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.52601029309834
+20
+-147.5019839412583
+30
+258.5863914218599
+11
+19.5177522858737
+21
+-143.17408872169233
+31
+262.7433125718796
+12
+17.459978964831137
+22
+-143.8585934485313
+32
+258.82338216950893
+13
+17.459978964831137
+23
+-143.8585934485313
+33
+258.82338216950893
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.05473751637434
+20
+-129.67017947059074
+30
+254.53016852277221
+11
+17.459978964831137
+21
+-143.8585934485313
+31
+258.82338216950893
+12
+18.12653445661179
+22
+-136.10787037044082
+32
+257.1446723549762
+13
+18.12653445661179
+23
+-136.10787037044082
+33
+257.1446723549762
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.7195116127193
+20
+-133.13194804246223
+30
+252.09120212495958
+11
+17.459978964831137
+21
+-143.8585934485313
+31
+258.82338216950893
+12
+18.05473751637434
+22
+-129.67017947059074
+32
+254.53016852277221
+13
+18.05473751637434
+23
+-129.67017947059074
+33
+254.53016852277221
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.5177522858737
+20
+-143.17408872169233
+30
+262.7433125718796
+11
+15.968062884642984
+21
+-142.04419958592203
+31
+263.725652910976
+12
+17.459978964831137
+22
+-143.8585934485313
+32
+258.82338216950893
+13
+17.459978964831137
+23
+-143.8585934485313
+33
+258.82338216950893
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.459978964831137
+20
+-143.8585934485313
+30
+258.82338216950893
+11
+15.968062884642984
+21
+-142.04419958592203
+31
+263.725652910976
+12
+15.951026322552744
+22
+-140.47135983580463
+32
+261.5732658254684
+13
+15.951026322552744
+23
+-140.47135983580463
+33
+261.5732658254684
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.25039770659161
+20
+-138.39137813918012
+30
+261.32288920760703
+11
+15.968062884642984
+21
+-142.04419958592203
+31
+263.725652910976
+12
+15.089158815380433
+22
+-139.38923391875184
+32
+263.3694062286968
+13
+15.089158815380433
+23
+-139.38923391875184
+33
+263.3694062286968
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.25039770659161
+20
+-138.39137813918012
+30
+261.32288920760703
+11
+15.951026322552744
+21
+-140.47135983580463
+31
+261.5732658254684
+12
+15.968062884642984
+22
+-142.04419958592203
+32
+263.725652910976
+13
+15.968062884642984
+23
+-142.04419958592203
+33
+263.725652910976
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.459978964831137
+20
+-143.8585934485313
+30
+258.82338216950893
+11
+15.951026322552744
+21
+-140.47135983580463
+31
+261.5732658254684
+12
+15.25039770659161
+22
+-138.39137813918012
+32
+261.32288920760703
+13
+15.25039770659161
+23
+-138.39137813918012
+33
+261.32288920760703
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.12653445661179
+20
+-136.10787037044082
+30
+257.1446723549762
+11
+17.459978964831137
+21
+-143.8585934485313
+31
+258.82338216950893
+12
+15.25039770659161
+22
+-138.39137813918012
+32
+261.32288920760703
+13
+15.25039770659161
+23
+-138.39137813918012
+33
+261.32288920760703
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.05473751637434
+20
+-129.67017947059074
+30
+254.53016852277221
+11
+15.25039770659161
+21
+-138.39137813918012
+31
+261.32288920760703
+12
+15.097981320748591
+22
+-133.03185824018416
+32
+260.1975634366835
+13
+15.097981320748591
+23
+-133.03185824018416
+33
+260.1975634366835
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.05473751637434
+20
+-129.67017947059074
+30
+254.53016852277221
+11
+18.12653445661179
+21
+-136.10787037044082
+31
+257.1446723549762
+12
+15.25039770659161
+22
+-138.39137813918012
+32
+261.32288920760703
+13
+15.25039770659161
+23
+-138.39137813918012
+33
+261.32288920760703
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.097981320748591
+20
+-133.03185824018416
+30
+260.1975634366835
+11
+15.089158815380433
+21
+-139.38923391875184
+31
+263.3694062286968
+12
+14.633430779466511
+22
+-133.70419399410306
+32
+262.2787620305997
+13
+14.633430779466511
+23
+-133.70419399410306
+33
+262.2787620305997
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.097981320748591
+20
+-133.03185824018416
+30
+260.1975634366835
+11
+15.25039770659161
+21
+-138.39137813918012
+31
+261.32288920760703
+12
+15.089158815380433
+22
+-139.38923391875184
+32
+263.3694062286968
+13
+15.089158815380433
+23
+-139.38923391875184
+33
+263.3694062286968
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.60903423295324
+20
+-117.73180858585444
+30
+252.10945558434597
+11
+14.633430779466511
+21
+-133.70419399410306
+31
+262.2787620305997
+12
+14.716484019656423
+22
+-121.25837693853579
+32
+258.6803967376857
+13
+14.716484019656423
+23
+-121.25837693853579
+33
+258.6803967376857
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.60903423295324
+20
+-117.73180858585444
+30
+252.10945558434597
+11
+15.097981320748591
+21
+-133.03185824018416
+31
+260.1975634366835
+12
+14.633430779466511
+22
+-133.70419399410306
+32
+262.2787620305997
+13
+14.633430779466511
+23
+-133.70419399410306
+33
+262.2787620305997
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.762421892435471
+20
+-123.2805560137804
+30
+249.84298437769652
+11
+15.097981320748591
+21
+-133.03185824018416
+31
+260.1975634366835
+12
+18.60903423295324
+22
+-117.73180858585444
+32
+252.10945558434597
+13
+18.60903423295324
+23
+-117.73180858585444
+33
+252.10945558434597
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.05473751637434
+20
+-129.67017947059074
+30
+254.53016852277221
+11
+15.097981320748591
+21
+-133.03185824018416
+31
+260.1975634366835
+12
+14.762421892435471
+22
+-123.2805560137804
+32
+249.84298437769652
+13
+14.762421892435471
+23
+-123.2805560137804
+33
+249.84298437769652
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.05473751637434
+20
+-129.67017947059074
+30
+254.53016852277221
+11
+9.473482036385072
+21
+-134.29682297538213
+31
+250.76691364676617
+12
+15.7195116127193
+22
+-133.13194804246223
+32
+252.09120212495958
+13
+15.7195116127193
+23
+-133.13194804246223
+33
+252.09120212495958
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.762421892435471
+20
+-123.2805560137804
+30
+249.84298437769652
+11
+9.473482036385072
+21
+-134.29682297538213
+31
+250.76691364676617
+12
+18.05473751637434
+22
+-129.67017947059074
+32
+254.53016852277221
+13
+18.05473751637434
+23
+-129.67017947059074
+33
+254.53016852277221
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+5.23928790831437
+20
+-121.78194699848548
+30
+250.25307876515456
+11
+3.035182687889568
+21
+-136.19214050792218
+31
+254.37105920182054
+12
+4.676777135013405
+22
+-135.13891590155703
+32
+251.11707584258508
+13
+4.676777135013405
+23
+-135.13891590155703
+33
+251.11707584258508
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.105964403985231
+20
+-122.2808748882708
+30
+249.2704342017355
+11
+4.676777135013405
+21
+-135.13891590155703
+31
+251.11707584258508
+12
+9.473482036385072
+22
+-134.29682297538213
+32
+250.76691364676617
+13
+9.473482036385072
+23
+-134.29682297538213
+33
+250.76691364676617
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+5.23928790831437
+20
+-121.78194699848548
+30
+250.25307876515456
+11
+4.676777135013405
+21
+-135.13891590155703
+31
+251.11707584258508
+12
+10.105964403985231
+22
+-122.2808748882708
+32
+249.2704342017355
+13
+10.105964403985231
+23
+-122.2808748882708
+33
+249.2704342017355
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.550681763599636
+20
+-116.81153000865763
+30
+248.91144950054974
+11
+9.473482036385072
+21
+-134.29682297538213
+31
+250.76691364676617
+12
+14.762421892435471
+22
+-123.2805560137804
+32
+249.84298437769652
+13
+14.762421892435471
+23
+-123.2805560137804
+33
+249.84298437769652
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.550681763599636
+20
+-116.81153000865763
+30
+248.91144950054974
+11
+10.105964403985231
+21
+-122.2808748882708
+31
+249.2704342017355
+12
+9.473482036385072
+22
+-134.29682297538213
+32
+250.76691364676617
+13
+9.473482036385072
+23
+-134.29682297538213
+33
+250.76691364676617
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.273779028963133
+20
+-112.1830611579273
+30
+249.78183528876832
+11
+14.762421892435471
+21
+-123.2805560137804
+31
+249.84298437769652
+12
+18.60903423295324
+22
+-117.73180858585444
+32
+252.10945558434597
+13
+18.60903423295324
+23
+-117.73180858585444
+33
+252.10945558434597
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.273779028963133
+20
+-112.1830611579273
+30
+249.78183528876832
+11
+14.550681763599636
+21
+-116.81153000865763
+31
+248.91144950054974
+12
+14.762421892435471
+22
+-123.2805560137804
+32
+249.84298437769652
+13
+14.762421892435471
+23
+-123.2805560137804
+33
+249.84298437769652
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.273779028963133
+20
+-112.1830611579273
+30
+249.78183528876832
+11
+14.716484019656423
+21
+-121.25837693853579
+31
+258.6803967376857
+12
+15.197462674382669
+22
+-115.22378326671362
+32
+255.75588832030408
+13
+15.197462674382669
+23
+-115.22378326671362
+33
+255.75588832030408
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.273779028963133
+20
+-112.1830611579273
+30
+249.78183528876832
+11
+18.60903423295324
+21
+-117.73180858585444
+31
+252.10945558434597
+12
+14.716484019656423
+22
+-121.25837693853579
+32
+258.6803967376857
+13
+14.716484019656423
+23
+-121.25837693853579
+33
+258.6803967376857
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.197462674382669
+20
+-115.22378326671362
+30
+255.75588832030408
+11
+17.572237740032907
+21
+-120.32075757492889
+31
+267.86827551781727
+12
+17.783369420222666
+22
+-110.6917535263891
+32
+264.92673053834596
+13
+17.783369420222666
+23
+-110.6917535263891
+33
+264.92673053834596
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.197462674382669
+20
+-115.22378326671362
+30
+255.75588832030408
+11
+14.716484019656423
+21
+-121.25837693853579
+31
+258.6803967376857
+12
+17.572237740032907
+22
+-120.32075757492889
+32
+267.86827551781727
+13
+17.572237740032907
+23
+-120.32075757492889
+33
+267.86827551781727
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.376302625827616
+20
+-109.03160139556046
+30
+267.5308907435688
+11
+16.335870091198345
+21
+-119.90762094424133
+31
+270.8332457701652
+12
+17.15818843637546
+22
+-109.41796628582242
+32
+271.85817751448974
+13
+17.15818843637546
+23
+-109.41796628582242
+33
+271.85817751448974
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.376302625827616
+20
+-109.03160139556046
+30
+267.5308907435688
+11
+18.252787550673382
+21
+-118.56021141749713
+31
+270.7127729382414
+12
+16.335870091198345
+22
+-119.90762094424133
+32
+270.8332457701652
+13
+16.335870091198345
+23
+-119.90762094424133
+33
+270.8332457701652
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.162245903747628
+20
+-128.98780431401946
+30
+283.41961446297375
+11
+11.950172250253717
+21
+-139.16623748996986
+31
+287.9221344439628
+12
+9.948680428973564
+22
+-125.54946101502216
+32
+286.6337444358919
+13
+9.948680428973564
+23
+-125.54946101502216
+33
+286.6337444358919
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+9.948680428973564
+20
+-125.54946101502216
+30
+286.6337444358919
+11
+11.950172250253717
+21
+-139.16623748996986
+31
+287.9221344439628
+12
+10.35542834887803
+22
+-140.79018692635796
+32
+289.8195815467631
+13
+10.35542834887803
+23
+-140.79018692635796
+33
+289.8195815467631
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.24834138716796
+20
+-111.60168847660634
+30
+282.7022535092499
+11
+10.162245903747628
+21
+-128.98780431401946
+31
+283.41961446297375
+12
+9.85284976721596
+22
+-107.99054576212225
+32
+285.4539625111473
+13
+9.85284976721596
+23
+-107.99054576212225
+33
+285.4539625111473
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.162245903747628
+20
+-128.98780431401946
+30
+283.41961446297375
+11
+9.948680428973564
+21
+-125.54946101502216
+31
+286.6337444358919
+12
+9.85284976721596
+22
+-107.99054576212225
+32
+285.4539625111473
+13
+9.85284976721596
+23
+-107.99054576212225
+33
+285.4539625111473
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.52792354004172
+20
+-130.30996322195023
+30
+279.38833795837036
+11
+13.150945653292583
+21
+-138.49146794146628
+31
+284.49017985574903
+12
+10.162245903747628
+22
+-128.98780431401946
+32
+283.41961446297375
+13
+10.162245903747628
+23
+-128.98780431401946
+33
+283.41961446297375
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.162245903747628
+20
+-128.98780431401946
+30
+283.41961446297375
+11
+13.150945653292583
+21
+-138.49146794146628
+31
+284.49017985574903
+12
+11.950172250253717
+22
+-139.16623748996986
+32
+287.9221344439628
+13
+11.950172250253717
+23
+-139.16623748996986
+33
+287.9221344439628
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.885995568259794
+20
+-114.35704817037869
+30
+279.1117980487311
+11
+10.162245903747628
+21
+-128.98780431401946
+31
+283.41961446297375
+12
+10.24834138716796
+22
+-111.60168847660634
+32
+282.7022535092499
+13
+10.24834138716796
+23
+-111.60168847660634
+33
+282.7022535092499
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.885995568259794
+20
+-114.35704817037869
+30
+279.1117980487311
+11
+10.52792354004172
+21
+-130.30996322195023
+31
+279.38833795837036
+12
+10.162245903747628
+22
+-128.98780431401946
+32
+283.41961446297375
+13
+10.162245903747628
+23
+-128.98780431401946
+33
+283.41961446297375
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+12.29303306231978
+20
+-156.15229834258514
+30
+287.72195483939834
+11
+10.031429444840427
+21
+-151.21017421480147
+31
+292.08301051017804
+12
+11.921879388210998
+22
+-147.16064425081524
+32
+289.0766657498978
+13
+11.921879388210998
+23
+-147.16064425081524
+33
+289.0766657498978
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+12.84611288160651
+20
+-150.3781206912856
+30
+285.9513692793071
+11
+12.29303306231978
+21
+-156.15229834258514
+31
+287.72195483939834
+12
+11.921879388210998
+22
+-147.16064425081524
+32
+289.0766657498978
+13
+11.921879388210998
+23
+-147.16064425081524
+33
+289.0766657498978
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.35542834887803
+20
+-140.79018692635796
+30
+289.8195815467631
+11
+10.031429444840427
+21
+-151.21017421480147
+31
+292.08301051017804
+12
+7.68859793310939
+22
+-141.95962522412418
+32
+292.0671908453823
+13
+7.68859793310939
+23
+-141.95962522412418
+33
+292.0671908453823
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+11.921879388210998
+20
+-147.16064425081524
+30
+289.0766657498978
+11
+10.031429444840427
+21
+-151.21017421480147
+31
+292.08301051017804
+12
+10.35542834887803
+22
+-140.79018692635796
+32
+289.8195815467631
+13
+10.35542834887803
+23
+-140.79018692635796
+33
+289.8195815467631
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+12.84611288160651
+20
+-150.3781206912856
+30
+285.9513692793071
+11
+10.35542834887803
+21
+-140.79018692635796
+31
+289.8195815467631
+12
+11.950172250253717
+22
+-139.16623748996986
+32
+287.9221344439628
+13
+11.950172250253717
+23
+-139.16623748996986
+33
+287.9221344439628
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+12.84611288160651
+20
+-150.3781206912856
+30
+285.9513692793071
+11
+11.921879388210998
+21
+-147.16064425081524
+31
+289.0766657498978
+12
+10.35542834887803
+22
+-140.79018692635796
+32
+289.8195815467631
+13
+10.35542834887803
+23
+-140.79018692635796
+33
+289.8195815467631
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.620972232389388
+20
+-145.94861454782236
+30
+283.20604898819516
+11
+11.950172250253717
+21
+-139.16623748996986
+31
+287.9221344439628
+12
+13.150945653292583
+22
+-138.49146794146628
+32
+284.49017985574903
+13
+13.150945653292583
+23
+-138.49146794146628
+33
+284.49017985574903
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.620972232389388
+20
+-145.94861454782236
+30
+283.20604898819516
+11
+12.84611288160651
+21
+-150.3781206912856
+31
+285.9513692793071
+12
+11.950172250253717
+22
+-139.16623748996986
+32
+287.9221344439628
+13
+11.950172250253717
+23
+-139.16623748996986
+33
+287.9221344439628
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.836971501747783
+20
+-156.5030689870492
+30
+283.41200885489064
+11
+12.29303306231978
+21
+-156.15229834258514
+31
+287.72195483939834
+12
+12.84611288160651
+22
+-150.3781206912856
+32
+285.9513692793071
+13
+12.84611288160651
+23
+-150.3781206912856
+33
+285.9513692793071
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.051145425167936
+20
+-152.04770377612826
+30
+282.5948623232063
+11
+13.836971501747783
+21
+-156.5030689870492
+31
+283.41200885489064
+12
+12.84611288160651
+22
+-150.3781206912856
+32
+285.9513692793071
+13
+12.84611288160651
+23
+-150.3781206912856
+33
+285.9513692793071
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.387009077804105
+20
+-147.8284166398862
+30
+281.4601055982682
+11
+12.84611288160651
+21
+-150.3781206912856
+31
+285.9513692793071
+12
+13.620972232389388
+22
+-145.94861454782236
+32
+283.20604898819516
+13
+13.620972232389388
+23
+-145.94861454782236
+33
+283.20604898819516
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.387009077804105
+20
+-147.8284166398862
+30
+281.4601055982682
+11
+14.051145425167936
+21
+-152.04770377612826
+31
+282.5948623232063
+12
+12.84611288160651
+22
+-150.3781206912856
+32
+285.9513692793071
+13
+12.84611288160651
+23
+-150.3781206912856
+33
+285.9513692793071
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.188017070200903
+20
+-154.19218102923617
+30
+278.5520252943273
+11
+13.836971501747783
+21
+-156.5030689870492
+31
+283.41200885489064
+12
+14.051145425167936
+22
+-152.04770377612826
+32
+282.5948623232063
+13
+14.051145425167936
+23
+-152.04770377612826
+33
+282.5948623232063
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.188017070200903
+20
+-154.19218102923617
+30
+278.5520252943273
+11
+14.051145425167936
+21
+-152.04770377612826
+31
+282.5948623232063
+12
+16.04685698431035
+22
+-151.50040421897816
+32
+278.58974911038496
+13
+16.04685698431035
+23
+-151.50040421897816
+33
+278.58974911038496
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.68268581946394
+20
+-147.61180892188037
+30
+276.6338909375617
+11
+16.04685698431035
+21
+-151.50040421897816
+31
+278.58974911038496
+12
+14.387009077804105
+22
+-147.8284166398862
+32
+281.4601055982682
+13
+14.387009077804105
+23
+-147.8284166398862
+33
+281.4601055982682
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.04685698431035
+20
+-151.50040421897816
+30
+278.58974911038496
+11
+14.051145425167936
+21
+-152.04770377612826
+31
+282.5948623232063
+12
+14.387009077804105
+22
+-147.8284166398862
+32
+281.4601055982682
+13
+14.387009077804105
+23
+-147.8284166398862
+33
+281.4601055982682
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.157334364076434
+20
+-125.26835774052986
+30
+273.63636868265445
+11
+15.593562742980735
+21
+-127.3824125613347
+31
+273.2335756789489
+12
+10.52792354004172
+22
+-130.30996322195023
+32
+279.38833795837036
+13
+10.52792354004172
+23
+-130.30996322195023
+33
+279.38833795837036
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.593562742980735
+20
+-127.3824125613347
+30
+273.2335756789489
+11
+13.150945653292583
+21
+-138.49146794146628
+31
+284.49017985574903
+12
+10.52792354004172
+22
+-130.30996322195023
+32
+279.38833795837036
+13
+10.52792354004172
+23
+-130.30996322195023
+33
+279.38833795837036
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+12.244052946310362
+20
+-119.79840441227046
+30
+272.77906454032905
+11
+16.335870091198345
+21
+-119.90762094424133
+31
+270.8332457701652
+12
+13.157334364076434
+22
+-125.26835774052986
+32
+273.63636868265445
+13
+13.157334364076434
+23
+-125.26835774052986
+33
+273.63636868265445
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.335870091198345
+20
+-119.90762094424133
+30
+270.8332457701652
+11
+15.593562742980735
+21
+-127.3824125613347
+31
+273.2335756789489
+12
+13.157334364076434
+22
+-125.26835774052986
+32
+273.63636868265445
+13
+13.157334364076434
+23
+-125.26835774052986
+33
+273.63636868265445
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+12.244052946310362
+20
+-119.79840441227046
+30
+272.77906454032905
+11
+10.52792354004172
+21
+-130.30996322195023
+31
+279.38833795837036
+12
+10.885995568259794
+22
+-114.35704817037869
+32
+279.1117980487311
+13
+10.885995568259794
+23
+-114.35704817037869
+33
+279.1117980487311
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+12.244052946310362
+20
+-119.79840441227046
+30
+272.77906454032905
+11
+13.157334364076434
+21
+-125.26835774052986
+31
+273.63636868265445
+12
+10.52792354004172
+22
+-130.30996322195023
+32
+279.38833795837036
+13
+10.52792354004172
+23
+-130.30996322195023
+33
+279.38833795837036
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.252787550673382
+20
+-118.56021141749713
+30
+270.7127729382414
+11
+18.19863562117225
+21
+-128.779106428411
+31
+271.8980309008026
+12
+16.335870091198345
+22
+-119.90762094424133
+32
+270.8332457701652
+13
+16.335870091198345
+23
+-119.90762094424133
+33
+270.8332457701652
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.335870091198345
+20
+-119.90762094424133
+30
+270.8332457701652
+11
+18.19863562117225
+21
+-128.779106428411
+31
+271.8980309008026
+12
+15.593562742980735
+22
+-127.3824125613347
+32
+273.2335756789489
+13
+15.593562742980735
+23
+-127.3824125613347
+33
+273.2335756789489
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.593562742980735
+20
+-127.3824125613347
+30
+273.2335756789489
+11
+18.19863562117225
+21
+-128.779106428411
+31
+271.8980309008026
+12
+13.620972232389388
+22
+-145.94861454782236
+32
+283.20604898819516
+13
+13.620972232389388
+23
+-145.94861454782236
+33
+283.20604898819516
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.593562742980735
+20
+-127.3824125613347
+30
+273.2335756789489
+11
+13.620972232389388
+21
+-145.94861454782236
+31
+283.20604898819516
+12
+13.150945653292583
+22
+-138.49146794146628
+32
+284.49017985574903
+13
+13.150945653292583
+23
+-138.49146794146628
+33
+284.49017985574903
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.29204713851307
+20
+-132.79973508170684
+30
+268.8576130163401
+11
+13.620972232389388
+21
+-145.94861454782236
+31
+283.20604898819516
+12
+18.19863562117225
+22
+-128.779106428411
+32
+271.8980309008026
+13
+18.19863562117225
+23
+-128.779106428411
+33
+271.8980309008026
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.29204713851307
+20
+-132.79973508170684
+30
+268.8576130163401
+11
+14.387009077804105
+21
+-147.8284166398862
+31
+281.4601055982682
+12
+13.620972232389388
+22
+-145.94861454782236
+32
+283.20604898819516
+13
+13.620972232389388
+23
+-145.94861454782236
+33
+283.20604898819516
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.29204713851307
+20
+-132.79973508170684
+30
+268.8576130163401
+11
+17.21720795504523
+21
+-138.34665716369548
+31
+269.468495457003
+12
+14.387009077804105
+22
+-147.8284166398862
+32
+281.4601055982682
+13
+14.387009077804105
+23
+-147.8284166398862
+33
+281.4601055982682
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.21720795504523
+20
+-138.34665716369548
+30
+269.468495457003
+11
+16.68268581946394
+21
+-147.61180892188037
+31
+276.6338909375617
+12
+14.387009077804105
+22
+-147.8284166398862
+32
+281.4601055982682
+13
+14.387009077804105
+23
+-147.8284166398862
+33
+281.4601055982682
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.686321861172907
+20
+-149.84025208814774
+30
+274.1362092454027
+11
+17.691189450341543
+21
+-152.35284077213512
+31
+274.2475553476348
+12
+16.04685698431035
+22
+-151.50040421897816
+32
+278.58974911038496
+13
+16.04685698431035
+23
+-151.50040421897816
+33
+278.58974911038496
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.691189450341543
+20
+-152.35284077213512
+30
+274.2475553476348
+11
+16.188017070200903
+21
+-154.19218102923617
+31
+278.5520252943273
+12
+16.04685698431035
+22
+-151.50040421897816
+32
+278.58974911038496
+13
+16.04685698431035
+23
+-151.50040421897816
+33
+278.58974911038496
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.800710206635944
+20
+-146.3045570057768
+30
+273.9226437706296
+11
+17.686321861172907
+21
+-149.84025208814774
+31
+274.1362092454027
+12
+16.68268581946394
+22
+-147.61180892188037
+32
+276.6338909375617
+13
+16.68268581946394
+23
+-147.61180892188037
+33
+276.6338909375617
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.686321861172907
+20
+-149.84025208814774
+30
+274.1362092454027
+11
+16.04685698431035
+21
+-151.50040421897816
+31
+278.58974911038496
+12
+16.68268581946394
+22
+-147.61180892188037
+32
+276.6338909375617
+13
+16.68268581946394
+23
+-147.61180892188037
+33
+276.6338909375617
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.21720795504523
+20
+-138.34665716369548
+30
+269.468495457003
+11
+17.99115463285898
+21
+-143.95746635352216
+31
+269.99115284398425
+12
+16.68268581946394
+22
+-147.61180892188037
+32
+276.6338909375617
+13
+16.68268581946394
+23
+-147.61180892188037
+33
+276.6338909375617
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.99115463285898
+20
+-143.95746635352216
+30
+269.99115284398425
+11
+17.800710206635944
+21
+-146.3045570057768
+31
+273.9226437706296
+12
+16.68268581946394
+22
+-147.61180892188037
+32
+276.6338909375617
+13
+16.68268581946394
+23
+-147.61180892188037
+33
+276.6338909375617
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.53662884406969
+20
+-150.4143233857224
+30
+267.1779905288315
+11
+17.691189450341543
+21
+-152.35284077213512
+31
+274.2475553476348
+12
+17.686321861172907
+22
+-149.84025208814774
+32
+274.1362092454027
+13
+17.686321861172907
+23
+-149.84025208814774
+33
+274.1362092454027
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.53662884406969
+20
+-150.4143233857224
+30
+267.1779905288315
+11
+17.686321861172907
+21
+-149.84025208814774
+31
+274.1362092454027
+12
+18.59929905461594
+22
+-146.84455517917164
+32
+269.30938613605093
+13
+18.59929905461594
+23
+-146.84455517917164
+33
+269.30938613605093
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.99115463285898
+20
+-143.95746635352216
+30
+269.99115284398425
+11
+17.686321861172907
+21
+-149.84025208814774
+31
+274.1362092454027
+12
+17.800710206635944
+22
+-146.3045570057768
+32
+273.9226437706296
+13
+17.800710206635944
+23
+-146.3045570057768
+33
+273.9226437706296
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.65078621604731
+20
+-130.55334268037103
+30
+235.81428816935113
+11
+19.58863655314203
+21
+-130.92236678421722
+31
+230.65525209923857
+12
+18.795523742976737
+22
+-133.7884641315769
+32
+230.14598058246906
+13
+18.795523742976737
+23
+-133.7884641315769
+33
+230.14598058246906
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.360541561699618
+20
+-127.62122865491192
+30
+236.9794673265951
+11
+19.58863655314203
+21
+-130.92236678421722
+31
+230.65525209923857
+12
+13.65078621604731
+22
+-130.55334268037103
+32
+235.81428816935113
+13
+13.65078621604731
+23
+-130.55334268037103
+33
+235.81428816935113
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.360541561699618
+20
+-127.62122865491192
+30
+236.9794673265951
+11
+19.745616303830662
+21
+-127.8329687837464
+31
+231.6041277628013
+12
+19.58863655314203
+22
+-130.92236678421722
+32
+230.65525209923857
+13
+19.58863655314203
+23
+-130.92236678421722
+33
+230.65525209923857
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.9506376264195011
+20
+-157.5468626393883
+30
+240.52915672781813
+11
+0.7309876651846112
+21
+-157.56724566903353
+31
+246.39216788144495
+12
+0.020623870886214313
+22
+-157.61287931748808
+32
+240.80873888069186
+13
+0.020623870886214313
+23
+-157.61287931748808
+33
+240.80873888069186
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.7309876651846112
+20
+-157.56724566903353
+30
+246.39216788144495
+11
+0.020623870886214313
+21
+-158.09781288841532
+31
+246.49499570263234
+12
+0.020623870886214313
+22
+-157.61287931748808
+32
+240.80873888069186
+13
+0.020623870886214313
+23
+-157.61287931748808
+33
+240.80873888069186
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.064996671547489
+20
+-157.17053715178795
+30
+240.47348367670168
+11
+1.3141856924522781
+21
+-157.09904443587493
+31
+246.3730017490936
+12
+0.9506376264195011
+22
+-157.5468626393883
+32
+240.52915672781813
+13
+0.9506376264195011
+23
+-157.5468626393883
+33
+240.52915672781813
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.3141856924522781
+20
+-157.09904443587493
+30
+246.3730017490936
+11
+0.7309876651846112
+21
+-157.56724566903353
+31
+246.39216788144495
+12
+0.9506376264195011
+22
+-157.5468626393883
+32
+240.52915672781813
+13
+0.9506376264195011
+23
+-157.5468626393883
+33
+240.52915672781813
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.7309876651846112
+20
+-157.56724566903353
+30
+246.39216788144495
+11
+0.020623870886214313
+21
+-161.6402921731923
+31
+255.0485667692241
+12
+0.020623870886214313
+22
+-158.09781288841532
+32
+246.49499570263234
+13
+0.020623870886214313
+23
+-158.09781288841532
+33
+246.49499570263234
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.9965754991985257
+20
+-161.0338818300765
+30
+254.90375599145725
+11
+0.020623870886214313
+21
+-161.6402921731923
+31
+255.0485667692241
+12
+0.7309876651846112
+22
+-157.56724566903353
+32
+246.39216788144495
+13
+0.7309876651846112
+23
+-157.56724566903353
+33
+246.39216788144495
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.3141856924522781
+20
+-157.09904443587493
+30
+246.3730017490936
+11
+0.9965754991985257
+21
+-161.0338818300765
+31
+254.90375599145725
+12
+0.7309876651846112
+22
+-157.56724566903353
+32
+246.39216788144495
+13
+0.7309876651846112
+23
+-157.56724566903353
+33
+246.39216788144495
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.3141856924522781
+20
+-157.09904443587493
+30
+246.3730017490936
+11
+2.874552245324444
+21
+-158.6536307266113
+31
+253.97069999269414
+12
+0.9965754991985257
+22
+-161.0338818300765
+32
+254.90375599145725
+13
+0.9965754991985257
+23
+-161.0338818300765
+33
+254.90375599145725
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+48.44321838592302
+20
+-131.35588644456183
+30
+279.7229847137141
+11
+41.90136107786469
+21
+-132.0915008576725
+31
+279.39533511779985
+12
+51.80273716282142
+22
+-135.80212492579153
+32
+280.164718430767
+13
+51.80273716282142
+23
+-135.80212492579153
+33
+280.164718430767
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.90136107786469
+20
+-132.0915008576725
+30
+279.39533511779985
+11
+45.230792069214445
+21
+-138.1470860077837
+31
+279.70108056245317
+12
+51.80273716282142
+22
+-135.80212492579153
+32
+280.164718430767
+13
+51.80273716282142
+23
+-135.80212492579153
+33
+280.164718430767
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.05899322770198
+20
+-122.02258843801765
+30
+279.6216780141442
+11
+41.90136107786469
+21
+-132.0915008576725
+31
+279.39533511779985
+12
+45.40328726037814
+22
+-124.40253531715928
+32
+278.4099525354752
+13
+45.40328726037814
+23
+-124.40253531715928
+33
+278.4099525354752
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.40328726037814
+20
+-124.40253531715928
+30
+278.4099525354752
+11
+41.90136107786469
+21
+-132.0915008576725
+31
+279.39533511779985
+12
+48.44321838592302
+22
+-131.35588644456183
+32
+279.7229847137141
+13
+48.44321838592302
+23
+-131.35588644456183
+33
+279.7229847137141
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+48.44321838592302
+20
+-131.35588644456183
+30
+279.7229847137141
+11
+51.80273716282142
+21
+-135.80212492579153
+31
+280.164718430767
+12
+55.72041630520133
+22
+-133.94331431201732
+32
+280.9003328438782
+13
+55.72041630520133
+23
+-133.94331431201732
+33
+280.9003328438782
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+49.54907380017342
+20
+-123.52241435060463
+30
+278.1467984960459
+11
+45.40328726037814
+21
+-124.40253531715928
+31
+278.4099525354752
+12
+48.44321838592302
+22
+-131.35588644456183
+32
+279.7229847137141
+13
+48.44321838592302
+23
+-131.35588644456183
+33
+279.7229847137141
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+49.54907380017342
+20
+-123.52241435060463
+30
+278.1467984960459
+11
+48.44321838592302
+21
+-131.35588644456183
+31
+279.7229847137141
+12
+55.72041630520133
+22
+-133.94331431201732
+32
+280.9003328438782
+13
+55.72041630520133
+23
+-133.94331431201732
+33
+280.9003328438782
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.90200225604073
+20
+-121.85283126574973
+30
+234.62477106626704
+11
+19.66165039067161
+21
+-123.85401886270648
+31
+233.01390327576968
+12
+13.753005588588755
+22
+-122.30277903952711
+32
+239.25354414132025
+13
+13.753005588588755
+23
+-122.30277903952711
+33
+239.25354414132025
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.561879462882025
+20
+-115.5350047491792
+30
+238.88086934559828
+11
+18.90200225604073
+21
+-121.85283126574973
+31
+234.62477106626704
+12
+13.753005588588755
+22
+-122.30277903952711
+32
+239.25354414132025
+13
+13.753005588588755
+23
+-122.30277903952711
+33
+239.25354414132025
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.561879462882025
+20
+-115.5350047491792
+30
+238.88086934559828
+11
+13.753005588588755
+21
+-122.30277903952711
+31
+239.25354414132025
+12
+13.074889572532609
+22
+-116.89458324884554
+32
+241.26112044906284
+13
+13.074889572532609
+23
+-116.89458324884554
+33
+241.26112044906284
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.4220974261263715
+20
+-117.03969825093571
+30
+241.65569939604566
+11
+8.263277679331958
+21
+-128.61969288312923
+31
+237.71173527215214
+12
+4.870263804466834
+22
+-128.3881781732958
+32
+237.60829900231863
+13
+4.870263804466834
+23
+-128.3881781732958
+33
+237.60829900231863
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-117.07316292647016
+30
+241.65630784469178
+11
+4.870263804466834
+21
+-128.3881781732958
+31
+237.60829900231863
+12
+0.020623870886214313
+22
+-128.43046535419836
+32
+237.4713980569506
+13
+0.020623870886214313
+23
+-128.43046535419836
+33
+237.4713980569506
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.4220974261263715
+20
+-117.03969825093571
+30
+241.65569939604566
+11
+4.870263804466834
+21
+-128.3881781732958
+31
+237.60829900231863
+12
+0.020623870886214313
+22
+-117.07316292647016
+32
+241.65630784469178
+13
+0.020623870886214313
+23
+-117.07316292647016
+33
+241.65630784469178
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.71237138080909
+20
+-109.09457583042332
+30
+242.38127440649814
+11
+7.4220974261263715
+21
+-117.03969825093571
+31
+241.65569939604566
+12
+0.020623870886214313
+22
+-117.07316292647016
+32
+241.65630784469178
+13
+0.020623870886214313
+23
+-117.07316292647016
+33
+241.65630784469178
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.71237138080909
+20
+-109.09457583042332
+30
+242.38127440649814
+11
+0.020623870886214313
+21
+-117.07316292647016
+31
+241.65630784469178
+12
+0.020623870886214313
+22
+-109.91446038101589
+32
+241.62193049619015
+13
+0.020623870886214313
+23
+-109.91446038101589
+33
+241.62193049619015
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.618058411471765
+20
+-114.31567366243303
+30
+231.7264259406669
+11
+19.139905676658017
+21
+-108.3674796983577
+31
+242.33564075804233
+12
+24.645453250712876
+22
+-107.01702792838122
+32
+234.94086013790943
+13
+24.645453250712876
+23
+-107.01702792838122
+33
+234.94086013790943
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.618058411471765
+20
+-114.31567366243303
+30
+231.7264259406669
+11
+18.561879462882025
+21
+-115.5350047491792
+31
+238.88086934559828
+12
+19.139905676658017
+22
+-108.3674796983577
+32
+242.33564075804233
+13
+19.139905676658017
+23
+-108.3674796983577
+33
+242.33564075804233
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.53105025508233
+20
+-118.89090325663096
+30
+229.33613543454044
+11
+18.90200225604073
+21
+-121.85283126574973
+31
+234.62477106626704
+12
+18.561879462882025
+22
+-115.5350047491792
+32
+238.88086934559828
+13
+18.561879462882025
+23
+-115.5350047491792
+33
+238.88086934559828
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.53105025508233
+20
+-118.89090325663096
+30
+229.33613543454044
+11
+18.561879462882025
+21
+-115.5350047491792
+31
+238.88086934559828
+12
+25.618058411471765
+22
+-114.31567366243303
+32
+231.7264259406669
+13
+25.618058411471765
+23
+-114.31567366243303
+33
+231.7264259406669
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.242286201042196
+20
+-140.12180608862306
+30
+227.8563883272684
+11
+16.42500781784906
+21
+-143.4208146476677
+31
+223.78647533363815
+12
+9.015015981563794
+22
+-146.03045089070483
+32
+223.74053746085875
+13
+9.015015981563794
+23
+-146.03045089070483
+33
+223.74053746085875
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.42500781784906
+20
+-143.4208146476677
+30
+223.78647533363815
+11
+8.242286201042196
+21
+-140.12180608862306
+31
+227.8563883272684
+12
+13.320094376902826
+22
+-138.91555664776962
+32
+228.66227855900163
+13
+13.320094376902826
+23
+-138.91555664776962
+33
+228.66227855900163
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.320094376902826
+20
+-138.91555664776962
+30
+228.66227855900163
+11
+20.074787021359942
+21
+-139.68341883912163
+31
+224.96504036109613
+12
+16.42500781784906
+22
+-143.4208146476677
+32
+223.78647533363815
+13
+16.42500781784906
+23
+-143.4208146476677
+33
+223.78647533363815
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.853659889012416
+20
+-135.81764036625358
+30
+229.65100760888245
+11
+20.074787021359942
+21
+-139.68341883912163
+31
+224.96504036109613
+12
+13.320094376902826
+22
+-138.91555664776962
+32
+228.66227855900163
+13
+13.320094376902826
+23
+-138.91555664776962
+33
+228.66227855900163
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.340649779361843
+20
+-134.7394693653993
+30
+227.63704259035794
+11
+20.074787021359942
+21
+-139.68341883912163
+31
+224.96504036109613
+12
+16.853659889012416
+22
+-135.81764036625358
+32
+229.65100760888245
+13
+16.853659889012416
+23
+-135.81764036625358
+33
+229.65100760888245
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.795523742976737
+20
+-133.7884641315769
+30
+230.14598058246906
+11
+22.340649779361843
+21
+-134.7394693653993
+31
+227.63704259035794
+12
+16.853659889012416
+22
+-135.81764036625358
+32
+229.65100760888245
+13
+16.853659889012416
+23
+-135.81764036625358
+33
+229.65100760888245
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+23.870289675606973
+20
+-131.42281579561723
+30
+227.71796626028745
+11
+22.340649779361843
+21
+-134.7394693653993
+31
+227.63704259035794
+12
+18.795523742976737
+22
+-133.7884641315769
+32
+230.14598058246906
+13
+18.795523742976737
+23
+-133.7884641315769
+33
+230.14598058246906
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.58863655314203
+20
+-130.92236678421722
+30
+230.65525209923857
+11
+23.870289675606973
+21
+-131.42281579561723
+31
+227.71796626028745
+12
+18.795523742976737
+22
+-133.7884641315769
+32
+230.14598058246906
+13
+18.795523742976737
+23
+-133.7884641315769
+33
+230.14598058246906
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.094488351519942
+20
+-127.67446791144154
+30
+228.16791403406455
+11
+23.870289675606973
+21
+-131.42281579561723
+31
+227.71796626028745
+12
+19.58863655314203
+22
+-130.92236678421722
+32
+230.65525209923857
+13
+19.58863655314203
+23
+-130.92236678421722
+33
+230.65525209923857
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.094488351519942
+20
+-127.67446791144154
+30
+228.16791403406455
+11
+19.58863655314203
+21
+-130.92236678421722
+31
+230.65525209923857
+12
+19.745616303830662
+22
+-127.8329687837464
+32
+231.6041277628013
+13
+19.745616303830662
+23
+-127.8329687837464
+33
+231.6041277628013
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.608931681780568
+20
+-123.46187371030673
+30
+228.57435772964712
+11
+25.094488351519942
+21
+-127.67446791144154
+31
+228.16791403406455
+12
+19.745616303830662
+22
+-127.8329687837464
+32
+231.6041277628013
+13
+19.745616303830662
+23
+-127.8329687837464
+33
+231.6041277628013
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.608931681780568
+20
+-123.46187371030673
+30
+228.57435772964712
+11
+19.745616303830662
+21
+-127.8329687837464
+31
+231.6041277628013
+12
+19.66165039067161
+22
+-123.85401886270648
+32
+233.01390327576968
+13
+19.66165039067161
+23
+-123.85401886270648
+33
+233.01390327576968
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.53105025508233
+20
+-118.89090325663096
+30
+229.33613543454044
+11
+25.608931681780568
+21
+-123.46187371030673
+31
+228.57435772964712
+12
+19.66165039067161
+22
+-123.85401886270648
+32
+233.01390327576968
+13
+19.66165039067161
+23
+-123.85401886270648
+33
+233.01390327576968
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.53105025508233
+20
+-118.89090325663096
+30
+229.33613543454044
+11
+19.66165039067161
+21
+-123.85401886270648
+31
+233.01390327576968
+12
+18.90200225604073
+22
+-121.85283126574973
+32
+234.62477106626704
+13
+18.90200225604073
+23
+-121.85283126574973
+33
+234.62477106626704
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.5760788840871625
+20
+-134.95486018611294
+30
+232.77843364973393
+11
+0.020623870886214313
+21
+-140.34875743361098
+31
+228.38786821961924
+12
+0.020623870886214313
+22
+-135.47690912444975
+32
+232.88126147092132
+13
+0.020623870886214313
+23
+-135.47690912444975
+33
+232.88126147092132
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.5760788840871625
+20
+-134.95486018611294
+30
+232.77843364973393
+11
+4.856269485607
+21
+-139.93927149479904
+31
+227.9379204458432
+12
+0.020623870886214313
+22
+-140.34875743361098
+32
+228.38786821961924
+13
+0.020623870886214313
+23
+-140.34875743361098
+33
+228.38786821961924
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.870263804466834
+20
+-128.3881781732958
+30
+237.60829900231863
+11
+0.020623870886214313
+21
+-135.47690912444975
+31
+232.88126147092132
+12
+0.020623870886214313
+22
+-128.43046535419836
+32
+237.4713980569506
+13
+0.020623870886214313
+23
+-128.43046535419836
+33
+237.4713980569506
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.870263804466834
+20
+-128.3881781732958
+30
+237.60829900231863
+11
+4.5760788840871625
+21
+-134.95486018611294
+31
+232.77843364973393
+12
+0.020623870886214313
+22
+-135.47690912444975
+32
+232.88126147092132
+13
+0.020623870886214313
+23
+-135.47690912444975
+33
+232.88126147092132
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.097779647598198
+20
+-134.6600668170873
+30
+233.35919788241733
+11
+4.856269485607
+21
+-139.93927149479904
+31
+227.9379204458432
+12
+4.5760788840871625
+22
+-134.95486018611294
+32
+232.77843364973393
+13
+4.5760788840871625
+23
+-134.95486018611294
+33
+232.77843364973393
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.242286201042196
+20
+-140.12180608862306
+30
+227.8563883272684
+11
+4.856269485607
+21
+-139.93927149479904
+31
+227.9379204458432
+12
+8.097779647598198
+22
+-134.6600668170873
+32
+233.35919788241733
+13
+8.097779647598198
+23
+-134.6600668170873
+33
+233.35919788241733
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.870263804466834
+20
+-128.3881781732958
+30
+237.60829900231863
+11
+8.263277679331958
+21
+-128.61969288312923
+31
+237.71173527215214
+12
+4.5760788840871625
+22
+-134.95486018611294
+32
+232.77843364973393
+13
+4.5760788840871625
+23
+-134.95486018611294
+33
+232.77843364973393
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.139905676658017
+20
+-108.3674796983577
+30
+242.33564075804233
+11
+13.074889572532609
+21
+-116.89458324884554
+31
+241.26112044906284
+12
+4.71237138080909
+22
+-109.09457583042332
+32
+242.38127440649814
+13
+4.71237138080909
+23
+-109.09457583042332
+33
+242.38127440649814
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.139905676658017
+20
+-108.3674796983577
+30
+242.33564075804233
+11
+18.561879462882025
+21
+-115.5350047491792
+31
+238.88086934559828
+12
+13.074889572532609
+22
+-116.89458324884554
+32
+241.26112044906284
+13
+13.074889572532609
+23
+-116.89458324884554
+33
+241.26112044906284
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.71237138080909
+20
+-109.09457583042332
+30
+242.38127440649814
+11
+13.074889572532609
+21
+-116.89458324884554
+31
+241.26112044906284
+12
+7.4220974261263715
+22
+-117.03969825093571
+32
+241.65569939604566
+13
+7.4220974261263715
+23
+-117.03969825093571
+33
+241.65569939604566
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.074889572532609
+20
+-116.89458324884554
+30
+241.26112044906284
+11
+13.753005588588755
+21
+-122.30277903952711
+31
+239.25354414132025
+12
+7.4220974261263715
+22
+-117.03969825093571
+32
+241.65569939604566
+13
+7.4220974261263715
+23
+-117.03969825093571
+33
+241.65569939604566
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.4220974261263715
+20
+-117.03969825093571
+30
+241.65569939604566
+11
+13.753005588588755
+21
+-122.30277903952711
+31
+239.25354414132025
+12
+8.263277679331958
+22
+-128.61969288312923
+32
+237.71173527215214
+13
+8.263277679331958
+23
+-128.61969288312923
+33
+237.71173527215214
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.753005588588755
+20
+-122.30277903952711
+30
+239.25354414132025
+11
+19.745616303830662
+21
+-127.8329687837464
+31
+231.6041277628013
+12
+14.360541561699618
+22
+-127.62122865491192
+32
+236.9794673265951
+13
+14.360541561699618
+23
+-127.62122865491192
+33
+236.9794673265951
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.753005588588755
+20
+-122.30277903952711
+30
+239.25354414132025
+11
+19.66165039067161
+21
+-123.85401886270648
+31
+233.01390327576968
+12
+19.745616303830662
+22
+-127.8329687837464
+32
+231.6041277628013
+13
+19.745616303830662
+23
+-127.8329687837464
+33
+231.6041277628013
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.320094376902826
+20
+-138.91555664776962
+30
+228.66227855900163
+11
+8.242286201042196
+21
+-140.12180608862306
+31
+227.8563883272684
+12
+8.097779647598198
+22
+-134.6600668170873
+32
+233.35919788241733
+13
+8.097779647598198
+23
+-134.6600668170873
+33
+233.35919788241733
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.320094376902826
+20
+-138.91555664776962
+30
+228.66227855900163
+11
+8.097779647598198
+21
+-134.6600668170873
+31
+233.35919788241733
+12
+12.23736001120347
+22
+-133.37441482792056
+32
+234.39051833752328
+13
+12.23736001120347
+23
+-133.37441482792056
+33
+234.39051833752328
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+12.23736001120347
+20
+-133.37441482792056
+30
+234.39051833752328
+11
+16.853659889012416
+21
+-135.81764036625358
+31
+229.65100760888245
+12
+13.320094376902826
+22
+-138.91555664776962
+32
+228.66227855900163
+13
+13.320094376902826
+23
+-138.91555664776962
+33
+228.66227855900163
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+12.23736001120347
+20
+-133.37441482792056
+30
+234.39051833752328
+11
+18.795523742976737
+21
+-133.7884641315769
+31
+230.14598058246906
+12
+16.853659889012416
+22
+-135.81764036625358
+32
+229.65100760888245
+13
+16.853659889012416
+23
+-135.81764036625358
+33
+229.65100760888245
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.65078621604731
+20
+-130.55334268037103
+30
+235.81428816935113
+11
+18.795523742976737
+21
+-133.7884641315769
+31
+230.14598058246906
+12
+12.23736001120347
+22
+-133.37441482792056
+32
+234.39051833752328
+13
+12.23736001120347
+23
+-133.37441482792056
+33
+234.39051833752328
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.24425461946073
+20
+-135.24022260113944
+30
+291.20654023550395
+11
+17.88132965224154
+21
+-127.31913390214885
+31
+298.2608938381575
+12
+16.9135920806513
+22
+-136.2219544915914
+32
+298.15106885753744
+13
+16.9135920806513
+23
+-136.2219544915914
+33
+298.15106885753744
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.00787232045866
+20
+-129.82229163212014
+30
+291.1414362303748
+11
+17.88132965224154
+21
+-127.31913390214885
+31
+298.2608938381575
+12
+19.24425461946073
+22
+-135.24022260113944
+32
+291.20654023550395
+13
+19.24425461946073
+23
+-135.24022260113944
+33
+291.20654023550395
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+21.694477317224887
+20
+-122.38674495269952
+30
+291.0948899089516
+11
+17.88132965224154
+21
+-127.31913390214885
+31
+298.2608938381575
+12
+19.00787232045866
+22
+-129.82229163212014
+32
+291.1414362303748
+13
+19.00787232045866
+23
+-129.82229163212014
+33
+291.1414362303748
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.630879783542003
+20
+-116.42121020220806
+30
+290.8174373263406
+11
+17.88132965224154
+21
+-127.31913390214885
+31
+298.2608938381575
+12
+21.694477317224887
+22
+-122.38674495269952
+32
+291.0948899089516
+13
+21.694477317224887
+23
+-122.38674495269952
+33
+291.0948899089516
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.630879783542003
+20
+-116.42121020220806
+30
+290.8174373263406
+11
+18.7024311001265
+21
+-119.86442109037688
+31
+298.75556258742245
+12
+17.88132965224154
+22
+-127.31913390214885
+32
+298.2608938381575
+13
+17.88132965224154
+23
+-127.31913390214885
+33
+298.2608938381575
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+24.98892251142504
+20
+-102.92764457809199
+30
+290.88284555579764
+11
+20.39361411190586
+21
+-96.79965403909883
+31
+296.93903915455655
+12
+20.407608430765702
+22
+-108.25369980155446
+32
+295.7124066840563
+13
+20.407608430765702
+23
+-108.25369980155446
+33
+295.7124066840563
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.630879783542003
+20
+-116.42121020220806
+30
+290.8174373263406
+11
+24.98892251142504
+21
+-102.92764457809199
+31
+290.88284555579764
+12
+20.407608430765702
+22
+-108.25369980155446
+32
+295.7124066840563
+13
+20.407608430765702
+23
+-108.25369980155446
+33
+295.7124066840563
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+24.98892251142504
+20
+-102.92764457809199
+30
+290.88284555579764
+11
+22.630879783542003
+21
+-116.42121020220806
+31
+290.8174373263406
+12
+27.09050413498537
+22
+-105.77883493362214
+32
+288.3246232233536
+13
+27.09050413498537
+23
+-105.77883493362214
+33
+288.3246232233536
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.630879783542003
+20
+-116.42121020220806
+30
+290.8174373263406
+11
+20.407608430765702
+21
+-108.25369980155446
+31
+295.7124066840563
+12
+18.7024311001265
+22
+-119.86442109037688
+32
+298.75556258742245
+13
+18.7024311001265
+23
+-119.86442109037688
+33
+298.75556258742245
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+20.407608430765702
+20
+-108.25369980155446
+30
+295.7124066840563
+11
+19.116480403783935
+21
+-112.99108095993422
+31
+299.066175621248
+12
+18.7024311001265
+22
+-119.86442109037688
+32
+298.75556258742245
+13
+18.7024311001265
+23
+-119.86442109037688
+33
+298.75556258742245
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.09050413498537
+20
+-105.77883493362214
+30
+288.3246232233536
+11
+22.630879783542003
+21
+-116.42121020220806
+31
+290.8174373263406
+12
+33.26869168728169
+22
+-111.68535016544278
+32
+283.8656073205549
+13
+33.26869168728169
+23
+-111.68535016544278
+33
+283.8656073205549
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.26869168728169
+20
+-111.68535016544278
+30
+283.8656073205549
+11
+22.630879783542003
+21
+-116.42121020220806
+31
+290.8174373263406
+12
+27.607381259830305
+22
+-116.50091697484334
+32
+286.13177430287857
+13
+27.607381259830305
+23
+-116.50091697484334
+33
+286.13177430287857
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.581551492706964
+20
+-90.48760778466654
+30
+303.2933725898947
+11
+22.114611107343148
+21
+-90.64063261915496
+31
+300.5316241853375
+12
+24.497600229715445
+22
+-90.9807554123126
+32
+296.3899142514708
+13
+24.497600229715445
+23
+-90.9807554123126
+33
+296.3899142514708
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.581551492706964
+20
+-90.48760778466654
+30
+303.2933725898947
+11
+24.53775784035672
+21
+-91.14108163055656
+31
+303.52397462675873
+12
+22.114611107343148
+22
+-90.64063261915496
+32
+300.5316241853375
+13
+22.114611107343148
+23
+-90.64063261915496
+33
+300.5316241853375
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.554446227621373
+20
+-85.72010841830779
+30
+307.52574137202834
+11
+24.53775784035672
+21
+-91.14108163055656
+31
+303.52397462675873
+12
+25.581551492706964
+22
+-90.48760778466654
+32
+303.2933725898947
+13
+25.581551492706964
+23
+-90.48760778466654
+33
+303.2933725898947
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.554446227621373
+20
+-85.72010841830779
+30
+307.52574137202834
+11
+26.259363284440084
+21
+-86.50166070419769
+31
+307.92670902979484
+12
+24.53775784035672
+22
+-91.14108163055656
+32
+303.52397462675873
+13
+24.53775784035672
+23
+-91.14108163055656
+33
+303.52397462675873
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.554446227621373
+20
+-85.72010841830779
+30
+307.52574137202834
+11
+26.819440263156743
+21
+-84.90113654068465
+31
+309.54761622295234
+12
+26.259363284440084
+22
+-86.50166070419769
+32
+307.92670902979484
+13
+26.259363284440084
+23
+-86.50166070419769
+33
+307.92670902979484
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.309732670557025
+20
+-88.00392041137039
+30
+312.5515271886485
+11
+26.819440263156743
+21
+-84.90113654068465
+31
+309.54761622295234
+12
+27.554446227621373
+22
+-85.72010841830779
+32
+307.52574137202834
+13
+27.554446227621373
+23
+-85.72010841830779
+33
+307.52574137202834
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.335969213176075
+20
+-85.04199240224901
+30
+297.299849201685
+11
+28.014129179734798
+21
+-88.18554233222079
+31
+295.0984820001665
+12
+30.858322375835755
+22
+-88.93150037231516
+32
+296.2861737573147
+13
+30.858322375835755
+23
+-88.93150037231516
+33
+296.2861737573147
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.335969213176075
+20
+-85.04199240224901
+30
+297.299849201685
+11
+28.11726122524536
+21
+-85.6531790672361
+31
+296.2627484844415
+12
+28.014129179734798
+22
+-88.18554233222079
+32
+295.0984820001665
+13
+28.014129179734798
+23
+-88.18554233222079
+33
+295.0984820001665
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.858322375835755
+20
+-88.93150037231516
+30
+296.2861737573147
+11
+32.35997363436119
+21
+-89.10247444186452
+31
+299.8236941856238
+12
+30.876880059541193
+22
+-84.93399276757049
+32
+299.93869097973396
+13
+30.876880059541193
+23
+-84.93399276757049
+33
+299.93869097973396
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.858322375835755
+20
+-88.93150037231516
+30
+296.2861737573147
+11
+30.876880059541193
+21
+-84.93399276757049
+31
+299.93869097973396
+12
+30.335969213176075
+22
+-85.04199240224901
+32
+297.299849201685
+13
+30.335969213176075
+23
+-85.04199240224901
+33
+297.299849201685
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.35997363436119
+20
+-89.10247444186452
+30
+299.8236941856238
+11
+32.30034566704535
+21
+-85.48859370847353
+31
+304.16071613488265
+12
+30.904868697260873
+22
+-83.73413203750184
+32
+304.1917470158335
+13
+30.904868697260873
+23
+-83.73413203750184
+33
+304.1917470158335
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.35997363436119
+20
+-89.10247444186452
+30
+299.8236941856238
+11
+30.904868697260873
+21
+-83.73413203750184
+31
+304.1917470158335
+12
+30.876880059541193
+22
+-84.93399276757049
+32
+299.93869097973396
+13
+30.876880059541193
+23
+-84.93399276757049
+33
+299.93869097973396
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.11726122524536
+20
+-85.6531790672361
+30
+296.2627484844415
+11
+24.497600229715445
+21
+-90.9807554123126
+31
+296.3899142514708
+12
+28.014129179734798
+22
+-88.18554233222079
+32
+295.0984820001665
+13
+28.014129179734798
+23
+-88.18554233222079
+33
+295.0984820001665
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.11726122524536
+20
+-85.6531790672361
+30
+296.2627484844415
+11
+25.70141587598473
+21
+-86.35472035616662
+31
+297.3324012042499
+12
+24.497600229715445
+22
+-90.9807554123126
+32
+296.3899142514708
+13
+24.497600229715445
+23
+-90.9807554123126
+33
+296.3899142514708
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.30034566704535
+20
+-85.48859370847353
+30
+304.16071613488265
+11
+35.309732670557025
+21
+-88.00392041137039
+31
+312.5515271886485
+12
+32.965075812887754
+22
+-84.55675460700327
+32
+309.22574688917615
+13
+32.965075812887754
+23
+-84.55675460700327
+33
+309.22574688917615
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.30034566704535
+20
+-85.48859370847353
+30
+304.16071613488265
+11
+32.965075812887754
+21
+-84.55675460700327
+31
+309.22574688917615
+12
+30.904868697260873
+22
+-83.73413203750184
+32
+304.1917470158335
+13
+30.904868697260873
+23
+-83.73413203750184
+33
+304.1917470158335
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+24.497600229715445
+20
+-90.9807554123126
+30
+296.3899142514708
+11
+25.70141587598473
+21
+-86.35472035616662
+31
+297.3324012042499
+12
+25.581551492706964
+22
+-90.48760778466654
+32
+303.2933725898947
+13
+25.581551492706964
+23
+-90.48760778466654
+33
+303.2933725898947
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.70141587598473
+20
+-86.35472035616662
+30
+297.3324012042499
+11
+26.794493868667445
+21
+-86.49618466638151
+31
+302.3764404802531
+12
+25.581551492706964
+22
+-90.48760778466654
+32
+303.2933725898947
+13
+25.581551492706964
+23
+-90.48760778466654
+33
+303.2933725898947
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.794493868667445
+20
+-86.49618466638151
+30
+302.3764404802531
+11
+27.554446227621373
+21
+-85.72010841830779
+31
+307.52574137202834
+12
+25.581551492706964
+22
+-90.48760778466654
+32
+303.2933725898947
+13
+25.581551492706964
+23
+-90.48760778466654
+33
+303.2933725898947
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.794493868667445
+20
+-86.49618466638151
+30
+302.3764404802531
+11
+28.50210499389096
+21
+-83.72713487807242
+31
+306.24891188822994
+12
+27.554446227621373
+22
+-85.72010841830779
+32
+307.52574137202834
+13
+27.554446227621373
+23
+-85.72010841830779
+33
+307.52574137202834
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.50210499389096
+20
+-83.72713487807242
+30
+306.24891188822994
+11
+35.309732670557025
+21
+-88.00392041137039
+31
+312.5515271886485
+12
+27.554446227621373
+22
+-85.72010841830779
+32
+307.52574137202834
+13
+27.554446227621373
+23
+-85.72010841830779
+33
+307.52574137202834
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.50210499389096
+20
+-83.72713487807242
+30
+306.24891188822994
+11
+32.965075812887754
+21
+-84.55675460700327
+31
+309.22574688917615
+12
+35.309732670557025
+22
+-88.00392041137039
+32
+312.5515271886485
+13
+35.309732670557025
+23
+-88.00392041137039
+33
+312.5515271886485
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.965075812887754
+20
+-84.55675460700327
+30
+309.22574688917615
+11
+28.50210499389096
+21
+-83.72713487807242
+31
+306.24891188822994
+12
+30.904868697260873
+22
+-83.73413203750184
+32
+304.1917470158335
+13
+30.904868697260873
+23
+-83.73413203750184
+33
+304.1917470158335
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.904868697260873
+20
+-83.73413203750184
+30
+304.1917470158335
+11
+28.50210499389096
+21
+-83.72713487807242
+31
+306.24891188822994
+12
+26.794493868667445
+22
+-86.49618466638151
+32
+302.3764404802531
+13
+26.794493868667445
+23
+-86.49618466638151
+33
+302.3764404802531
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.904868697260873
+20
+-83.73413203750184
+30
+304.1917470158335
+11
+26.794493868667445
+21
+-86.49618466638151
+31
+302.3764404802531
+12
+30.876880059541193
+22
+-84.93399276757049
+32
+299.93869097973396
+13
+30.876880059541193
+23
+-84.93399276757049
+33
+299.93869097973396
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.876880059541193
+20
+-84.93399276757049
+30
+299.93869097973396
+11
+26.794493868667445
+21
+-86.49618466638151
+31
+302.3764404802531
+12
+25.70141587598473
+22
+-86.35472035616662
+32
+297.3324012042499
+13
+25.70141587598473
+23
+-86.35472035616662
+33
+297.3324012042499
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.11726122524536
+20
+-85.6531790672361
+30
+296.2627484844415
+11
+30.876880059541193
+21
+-84.93399276757049
+31
+299.93869097973396
+12
+25.70141587598473
+22
+-86.35472035616662
+32
+297.3324012042499
+13
+25.70141587598473
+23
+-86.35472035616662
+33
+297.3324012042499
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.876880059541193
+20
+-84.93399276757049
+30
+299.93869097973396
+11
+28.11726122524536
+21
+-85.6531790672361
+31
+296.2627484844415
+12
+30.335969213176075
+22
+-85.04199240224901
+32
+297.299849201685
+13
+30.335969213176075
+23
+-85.04199240224901
+33
+297.299849201685
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.114611107343148
+20
+-90.64063261915496
+30
+300.5316241853375
+11
+22.38719610078697
+21
+-89.92053364651954
+31
+301.54834187293727
+12
+21.224450738128105
+22
+-90.15813284281502
+32
+306.3520439337389
+13
+21.224450738128105
+23
+-90.15813284281502
+33
+306.3520439337389
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.38719610078697
+20
+-89.92053364651954
+30
+301.54834187293727
+11
+21.96523696473048
+21
+-89.25276125744774
+31
+305.5342889534076
+12
+21.224450738128105
+22
+-90.15813284281502
+32
+306.3520439337389
+13
+21.224450738128105
+23
+-90.15813284281502
+33
+306.3520439337389
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+21.96523696473048
+20
+-89.25276125744774
+30
+305.5342889534076
+11
+23.379271618220415
+21
+-86.81987934609792
+31
+309.51901913658617
+12
+21.224450738128105
+22
+-90.15813284281502
+32
+306.3520439337389
+13
+21.224450738128105
+23
+-90.15813284281502
+33
+306.3520439337389
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+21.96523696473048
+20
+-89.25276125744774
+30
+305.5342889534076
+11
+23.85994604862361
+21
+-86.28353186457821
+31
+308.70491484813124
+12
+23.379271618220415
+22
+-86.81987934609792
+32
+309.51901913658617
+13
+23.379271618220415
+23
+-86.81987934609792
+33
+309.51901913658617
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.819440263156743
+20
+-84.90113654068465
+30
+309.54761622295234
+11
+23.379271618220415
+21
+-86.81987934609792
+31
+309.51901913658617
+12
+23.85994604862361
+22
+-86.28353186457821
+32
+308.70491484813124
+13
+23.85994604862361
+23
+-86.28353186457821
+33
+308.70491484813124
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.819440263156743
+20
+-84.90113654068465
+30
+309.54761622295234
+11
+23.85994604862361
+21
+-86.28353186457821
+31
+308.70491484813124
+12
+25.408143628574162
+22
+-84.8649338462426
+32
+308.3973440575382
+13
+25.408143628574162
+23
+-84.8649338462426
+33
+308.3973440575382
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.114611107343148
+20
+-90.64063261915496
+30
+300.5316241853375
+11
+24.53775784035672
+21
+-91.14108163055656
+31
+303.52397462675873
+12
+23.805185670476416
+22
+-89.76385812015457
+32
+303.9851787004878
+13
+23.805185670476416
+23
+-89.76385812015457
+33
+303.9851787004878
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.114611107343148
+20
+-90.64063261915496
+30
+300.5316241853375
+11
+23.805185670476416
+21
+-89.76385812015457
+31
+303.9851787004878
+12
+22.38719610078697
+22
+-89.92053364651954
+32
+301.54834187293727
+13
+22.38719610078697
+23
+-89.92053364651954
+33
+301.54834187293727
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.91469283579742
+20
+-116.92652680277529
+30
+282.2550437543797
+11
+47.518254754152196
+21
+-117.68343691849817
+31
+279.78778449452483
+12
+49.54907380017342
+22
+-123.52241435060463
+32
+278.1467984960459
+13
+49.54907380017342
+23
+-123.52241435060463
+33
+278.1467984960459
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.91469283579742
+20
+-116.92652680277529
+30
+282.2550437543797
+11
+49.54907380017342
+21
+-123.52241435060463
+31
+278.1467984960459
+12
+56.4002359774665
+22
+-123.41319781863416
+32
+281.6392937245451
+13
+56.4002359774665
+23
+-123.41319781863416
+33
+281.6392937245451
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+67.34993865718677
+20
+-126.15578009084169
+30
+289.76482116861973
+11
+63.89124275097733
+21
+-124.37241710918181
+31
+292.03646418875985
+12
+62.30623402793898
+22
+-128.24428006851053
+32
+286.69124283294605
+13
+62.30623402793898
+23
+-128.24428006851053
+33
+286.69124283294605
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+67.34993865718677
+20
+-126.15578009084169
+30
+289.76482116861973
+11
+62.30623402793898
+21
+-128.24428006851053
+31
+286.69124283294605
+12
+64.83741081806401
+22
+-131.04253539183142
+32
+282.8498023059193
+13
+64.83741081806401
+23
+-131.04253539183142
+33
+282.8498023059193
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+62.30623402793898
+20
+-128.24428006851053
+30
+286.69124283294605
+11
+60.41794407726195
+21
+-117.46926299508148
+31
+293.08056206543495
+12
+58.602607119249974
+22
+-119.36853544381859
+32
+286.90906744824497
+13
+58.602607119249974
+23
+-119.36853544381859
+33
+286.90906744824497
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+62.30623402793898
+20
+-128.24428006851053
+30
+286.69124283294605
+11
+63.89124275097733
+21
+-124.37241710918181
+31
+292.03646418875985
+12
+60.41794407726195
+22
+-117.46926299508148
+32
+293.08056206543495
+13
+60.41794407726195
+23
+-117.46926299508148
+33
+293.08056206543495
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.83741081806401
+20
+-131.04253539183142
+30
+282.8498023059193
+11
+62.30623402793898
+21
+-128.24428006851053
+31
+286.69124283294605
+12
+60.52968567111454
+22
+-131.43133407667682
+32
+283.2662854041609
+13
+60.52968567111454
+23
+-131.43133407667682
+33
+283.2662854041609
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.83741081806401
+20
+-131.04253539183142
+30
+282.8498023059193
+11
+60.52968567111454
+21
+-131.43133407667682
+31
+283.2662854041609
+12
+63.54184111596588
+22
+-132.78482808988116
+32
+281.3904382282959
+13
+63.54184111596588
+23
+-132.78482808988116
+33
+281.3904382282959
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+56.4002359774665
+20
+-123.41319781863416
+30
+281.6392937245451
+11
+60.52968567111454
+21
+-131.43133407667682
+31
+283.2662854041609
+12
+58.602607119249974
+22
+-119.36853544381859
+32
+286.90906744824497
+13
+58.602607119249974
+23
+-119.36853544381859
+33
+286.90906744824497
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+60.52968567111454
+20
+-131.43133407667682
+30
+283.2662854041609
+11
+62.30623402793898
+21
+-128.24428006851053
+31
+286.69124283294605
+12
+58.602607119249974
+22
+-119.36853544381859
+32
+286.90906744824497
+13
+58.602607119249974
+23
+-119.36853544381859
+33
+286.90906744824497
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.54184111596588
+20
+-132.78482808988116
+30
+281.3904382282959
+11
+60.52968567111454
+21
+-131.43133407667682
+31
+283.2662854041609
+12
+55.72041630520133
+22
+-133.94331431201732
+32
+280.9003328438782
+13
+55.72041630520133
+23
+-133.94331431201732
+33
+280.9003328438782
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.54184111596588
+20
+-132.78482808988116
+30
+281.3904382282959
+11
+55.72041630520133
+21
+-133.94331431201732
+31
+280.9003328438782
+12
+58.389254601502024
+22
+-136.19427007818985
+32
+279.1483049674903
+13
+58.389254601502024
+23
+-136.19427007818985
+33
+279.1483049674903
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+56.4002359774665
+20
+-123.41319781863416
+30
+281.6392937245451
+11
+49.54907380017342
+21
+-123.52241435060463
+31
+278.1467984960459
+12
+55.72041630520133
+22
+-133.94331431201732
+32
+280.9003328438782
+13
+55.72041630520133
+23
+-133.94331431201732
+33
+280.9003328438782
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+56.4002359774665
+20
+-123.41319781863416
+30
+281.6392937245451
+11
+55.72041630520133
+21
+-133.94331431201732
+31
+280.9003328438782
+12
+60.52968567111454
+22
+-131.43133407667682
+32
+283.2662854041609
+13
+60.52968567111454
+23
+-131.43133407667682
+33
+283.2662854041609
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.230792069214445
+20
+-138.1470860077837
+30
+279.70108056245317
+11
+34.02742714894343
+21
+-140.20516355314956
+31
+280.59915076406696
+12
+45.03639272679189
+22
+-140.22615503143857
+32
+277.66216914943885
+13
+45.03639272679189
+23
+-140.22615503143857
+33
+277.66216914943885
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.509014252315744
+20
+-137.45680101880646
+30
+281.5890967112395
+11
+34.02742714894343
+21
+-140.20516355314956
+31
+280.59915076406696
+12
+45.230792069214445
+22
+-138.1470860077837
+32
+279.70108056245317
+13
+45.230792069214445
+23
+-138.1470860077837
+33
+279.70108056245317
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+51.80273716282142
+20
+-135.80212492579153
+30
+280.164718430767
+11
+45.03639272679189
+21
+-140.22615503143857
+31
+277.66216914943885
+12
+53.29900365082906
+22
+-138.20884354536042
+32
+277.8869909241659
+13
+53.29900365082906
+23
+-138.20884354536042
+33
+277.8869909241659
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+51.80273716282142
+20
+-135.80212492579153
+30
+280.164718430767
+11
+45.230792069214445
+21
+-138.1470860077837
+31
+279.70108056245317
+12
+45.03639272679189
+22
+-140.22615503143857
+32
+277.66216914943885
+13
+45.03639272679189
+23
+-140.22615503143857
+33
+277.66216914943885
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+55.72041630520133
+20
+-133.94331431201732
+30
+280.9003328438782
+11
+53.29900365082906
+21
+-138.20884354536042
+31
+277.8869909241659
+12
+58.389254601502024
+22
+-136.19427007818985
+32
+279.1483049674903
+13
+58.389254601502024
+23
+-136.19427007818985
+33
+279.1483049674903
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+55.72041630520133
+20
+-133.94331431201732
+30
+280.9003328438782
+11
+51.80273716282142
+21
+-135.80212492579153
+31
+280.164718430767
+12
+53.29900365082906
+22
+-138.20884354536042
+32
+277.8869909241659
+13
+53.29900365082906
+23
+-138.20884354536042
+33
+277.8869909241659
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.24425461946073
+20
+-135.24022260113944
+30
+291.20654023550395
+11
+16.07484562203002
+21
+-141.67152479020677
+31
+297.85475436689535
+12
+19.081494606634337
+22
+-140.490830192487
+32
+291.7696594574496
+13
+19.081494606634337
+23
+-140.490830192487
+33
+291.7696594574496
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.24425461946073
+20
+-135.24022260113944
+30
+291.20654023550395
+11
+16.9135920806513
+21
+-136.2219544915914
+31
+298.15106885753744
+12
+16.07484562203002
+22
+-141.67152479020677
+32
+297.85475436689535
+13
+16.07484562203002
+23
+-141.67152479020677
+33
+297.85475436689535
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.398987598547926
+20
+-136.14985332702759
+30
+285.4737370921379
+11
+19.081494606634337
+21
+-140.490830192487
+31
+291.7696594574496
+12
+23.63816651712744
+22
+-139.837660570919
+32
+286.8473099106626
+13
+23.63816651712744
+23
+-139.837660570919
+33
+286.8473099106626
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.24425461946073
+20
+-135.24022260113944
+30
+291.20654023550395
+11
+19.081494606634337
+21
+-140.490830192487
+31
+291.7696594574496
+12
+27.398987598547926
+22
+-136.14985332702759
+32
+285.4737370921379
+13
+27.398987598547926
+23
+-136.14985332702759
+33
+285.4737370921379
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.509014252315744
+20
+-137.45680101880646
+30
+281.5890967112395
+11
+23.63816651712744
+21
+-139.837660570919
+31
+286.8473099106626
+12
+34.02742714894343
+22
+-140.20516355314956
+32
+280.59915076406696
+13
+34.02742714894343
+23
+-140.20516355314956
+33
+280.59915076406696
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.398987598547926
+20
+-136.14985332702759
+30
+285.4737370921379
+11
+23.63816651712744
+21
+-139.837660570919
+31
+286.8473099106626
+12
+34.509014252315744
+22
+-137.45680101880646
+32
+281.5890967112395
+13
+34.509014252315744
+23
+-137.45680101880646
+33
+281.5890967112395
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.64582729667862
+20
+-117.19272308543479
+30
+279.86262367799304
+11
+49.54907380017342
+21
+-123.52241435060463
+31
+278.1467984960459
+12
+47.518254754152196
+22
+-117.68343691849817
+32
+279.78778449452483
+13
+47.518254754152196
+23
+-117.68343691849817
+33
+279.78778449452483
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.64582729667862
+20
+-117.19272308543479
+30
+279.86262367799304
+11
+45.40328726037814
+21
+-124.40253531715928
+31
+278.4099525354752
+12
+49.54907380017342
+22
+-123.52241435060463
+32
+278.1467984960459
+13
+49.54907380017342
+23
+-123.52241435060463
+33
+278.1467984960459
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.64582729667862
+20
+-117.19272308543479
+30
+279.86262367799304
+11
+39.05899322770198
+21
+-122.02258843801765
+31
+279.6216780141442
+12
+45.40328726037814
+22
+-124.40253531715928
+32
+278.4099525354752
+13
+45.40328726037814
+23
+-124.40253531715928
+33
+278.4099525354752
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.26869168728169
+20
+-111.68535016544278
+30
+283.8656073205549
+11
+39.05899322770198
+21
+-122.02258843801765
+31
+279.6216780141442
+12
+40.64582729667862
+22
+-117.19272308543479
+32
+279.86262367799304
+13
+40.64582729667862
+23
+-117.19272308543479
+33
+279.86262367799304
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.26869168728169
+20
+-111.68535016544278
+30
+283.8656073205549
+11
+33.960193573551585
+21
+-121.23921080619037
+31
+281.89545060454526
+12
+39.05899322770198
+22
+-122.02258843801765
+32
+279.6216780141442
+13
+39.05899322770198
+23
+-122.02258843801765
+33
+279.6216780141442
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.16613879008215
+20
+-131.43255097396826
+30
+280.9824734110997
+11
+45.230792069214445
+21
+-138.1470860077837
+31
+279.70108056245317
+12
+41.90136107786469
+22
+-132.0915008576725
+32
+279.39533511779985
+13
+41.90136107786469
+23
+-132.0915008576725
+33
+279.39533511779985
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.16613879008215
+20
+-131.43255097396826
+30
+280.9824734110997
+11
+34.509014252315744
+21
+-137.45680101880646
+31
+281.5890967112395
+12
+45.230792069214445
+22
+-138.1470860077837
+32
+279.70108056245317
+13
+45.230792069214445
+23
+-138.1470860077837
+33
+279.70108056245317
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.960193573551585
+20
+-121.23921080619037
+30
+281.89545060454526
+11
+41.90136107786469
+21
+-132.0915008576725
+31
+279.39533511779985
+12
+39.05899322770198
+22
+-122.02258843801765
+32
+279.6216780141442
+13
+39.05899322770198
+23
+-122.02258843801765
+33
+279.6216780141442
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.960193573551585
+20
+-121.23921080619037
+30
+281.89545060454526
+11
+35.16613879008215
+21
+-131.43255097396826
+31
+280.9824734110997
+12
+41.90136107786469
+22
+-132.0915008576725
+32
+279.39533511779985
+13
+41.90136107786469
+23
+-132.0915008576725
+33
+279.39533511779985
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.960193573551585
+20
+-121.23921080619037
+30
+281.89545060454526
+11
+27.70442881888008
+21
+-122.86316024257859
+31
+284.9413445268214
+12
+35.16613879008215
+22
+-131.43255097396826
+32
+280.9824734110997
+13
+35.16613879008215
+23
+-131.43255097396826
+33
+280.9824734110997
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.70442881888008
+20
+-122.86316024257859
+30
+284.9413445268214
+11
+27.528891384486002
+21
+-131.97376604465765
+31
+285.8369809338488
+12
+35.16613879008215
+22
+-131.43255097396826
+32
+280.9824734110997
+13
+35.16613879008215
+23
+-131.43255097396826
+33
+280.9824734110997
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.16613879008215
+20
+-131.43255097396826
+30
+280.9824734110997
+11
+27.528891384486002
+21
+-131.97376604465765
+31
+285.8369809338488
+12
+34.509014252315744
+22
+-137.45680101880646
+32
+281.5890967112395
+13
+34.509014252315744
+23
+-137.45680101880646
+33
+281.5890967112395
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.528891384486002
+20
+-131.97376604465765
+30
+285.8369809338488
+11
+27.398987598547926
+21
+-136.14985332702759
+31
+285.4737370921379
+12
+34.509014252315744
+22
+-137.45680101880646
+32
+281.5890967112395
+13
+34.509014252315744
+23
+-137.45680101880646
+33
+281.5890967112395
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.26869168728169
+20
+-111.68535016544278
+30
+283.8656073205549
+11
+27.607381259830305
+21
+-116.50091697484334
+31
+286.13177430287857
+12
+33.960193573551585
+22
+-121.23921080619037
+32
+281.89545060454526
+13
+33.960193573551585
+23
+-121.23921080619037
+33
+281.89545060454526
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.607381259830305
+20
+-116.50091697484334
+30
+286.13177430287857
+11
+27.70442881888008
+21
+-122.86316024257859
+31
+284.9413445268214
+12
+33.960193573551585
+22
+-121.23921080619037
+32
+281.89545060454526
+13
+33.960193573551585
+23
+-121.23921080619037
+33
+281.89545060454526
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.630879783542003
+20
+-116.42121020220806
+30
+290.8174373263406
+11
+27.70442881888008
+21
+-122.86316024257859
+31
+284.9413445268214
+12
+27.607381259830305
+22
+-116.50091697484334
+32
+286.13177430287857
+13
+27.607381259830305
+23
+-116.50091697484334
+33
+286.13177430287857
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.70442881888008
+20
+-122.86316024257859
+30
+284.9413445268214
+11
+22.630879783542003
+21
+-116.42121020220806
+31
+290.8174373263406
+12
+21.694477317224887
+22
+-122.38674495269952
+32
+291.0948899089516
+13
+21.694477317224887
+23
+-122.38674495269952
+33
+291.0948899089516
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.00787232045866
+20
+-129.82229163212014
+30
+291.1414362303748
+11
+27.398987598547926
+21
+-136.14985332702759
+31
+285.4737370921379
+12
+27.528891384486002
+22
+-131.97376604465765
+32
+285.8369809338488
+13
+27.528891384486002
+23
+-131.97376604465765
+33
+285.8369809338488
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.00787232045866
+20
+-129.82229163212014
+30
+291.1414362303748
+11
+19.24425461946073
+21
+-135.24022260113944
+31
+291.20654023550395
+12
+27.398987598547926
+22
+-136.14985332702759
+32
+285.4737370921379
+13
+27.398987598547926
+23
+-136.14985332702759
+33
+285.4737370921379
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.70442881888008
+20
+-122.86316024257859
+30
+284.9413445268214
+11
+21.694477317224887
+21
+-122.38674495269952
+31
+291.0948899089516
+12
+27.528891384486002
+22
+-131.97376604465765
+32
+285.8369809338488
+13
+27.528891384486002
+23
+-131.97376604465765
+33
+285.8369809338488
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+21.694477317224887
+20
+-122.38674495269952
+30
+291.0948899089516
+11
+19.00787232045866
+21
+-129.82229163212014
+31
+291.1414362303748
+12
+27.528891384486002
+22
+-131.97376604465765
+32
+285.8369809338488
+13
+27.528891384486002
+23
+-131.97376604465765
+33
+285.8369809338488
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+23.870289675606973
+20
+-131.42281579561723
+30
+227.71796626028745
+11
+29.307386776977836
+21
+-131.87306779371622
+31
+226.7821722426163
+12
+26.720871582491768
+22
+-136.73244290563403
+32
+225.90296394902944
+13
+26.720871582491768
+23
+-136.73244290563403
+33
+225.90296394902944
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+23.870289675606973
+20
+-131.42281579561723
+30
+227.71796626028745
+11
+26.720871582491768
+21
+-136.73244290563403
+31
+225.90296394902944
+12
+22.340649779361843
+22
+-134.7394693653993
+32
+227.63704259035794
+13
+22.340649779361843
+23
+-134.7394693653993
+33
+227.63704259035794
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.340649779361843
+20
+-134.7394693653993
+30
+227.63704259035794
+11
+26.720871582491768
+21
+-136.73244290563403
+31
+225.90296394902944
+12
+24.91347487931111
+22
+-143.42355266657526
+32
+224.8153619941597
+13
+24.91347487931111
+23
+-143.42355266657526
+33
+224.8153619941597
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.340649779361843
+20
+-134.7394693653993
+30
+227.63704259035794
+11
+24.91347487931111
+21
+-143.42355266657526
+31
+224.8153619941597
+12
+20.074787021359942
+22
+-139.68341883912163
+32
+224.96504036109613
+13
+20.074787021359942
+23
+-139.68341883912163
+33
+224.96504036109613
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.720871582491768
+20
+-136.73244290563403
+30
+225.90296394902944
+11
+33.312499989799434
+21
+-139.10630529831448
+31
+223.93950016812863
+12
+28.652087585149673
+22
+-147.30788882315008
+32
+224.37149870684334
+13
+28.652087585149673
+23
+-147.30788882315008
+33
+224.37149870684334
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.720871582491768
+20
+-136.73244290563403
+30
+225.90296394902944
+11
+28.652087585149673
+21
+-147.30788882315008
+31
+224.37149870684334
+12
+24.91347487931111
+22
+-143.42355266657526
+32
+224.8153619941597
+13
+24.91347487931111
+23
+-143.42355266657526
+33
+224.8153619941597
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.312499989799434
+20
+-139.10630529831448
+30
+223.93950016812863
+11
+34.48528475511863
+21
+-139.17536421964545
+31
+227.1429822897396
+12
+29.461628508759116
+22
+-148.3130459864747
+32
+226.5972038542036
+13
+29.461628508759116
+23
+-148.3130459864747
+33
+226.5972038542036
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.312499989799434
+20
+-139.10630529831448
+30
+223.93950016812863
+11
+29.461628508759116
+21
+-148.3130459864747
+31
+226.5972038542036
+12
+28.652087585149673
+22
+-147.30788882315008
+32
+224.37149870684334
+13
+28.652087585149673
+23
+-147.30788882315008
+33
+224.37149870684334
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.461628508759116
+20
+-148.3130459864747
+30
+226.5972038542036
+11
+22.299883720074494
+21
+-155.03092748784405
+31
+226.58564332992623
+12
+28.652087585149673
+22
+-147.30788882315008
+32
+224.37149870684334
+13
+28.652087585149673
+23
+-147.30788882315008
+33
+224.37149870684334
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.07262815076362
+20
+-154.38080010950662
+30
+223.2291363738264
+11
+28.652087585149673
+21
+-147.30788882315008
+31
+224.37149870684334
+12
+22.299883720074494
+22
+-155.03092748784405
+32
+226.58564332992623
+13
+22.299883720074494
+23
+-155.03092748784405
+33
+226.58564332992623
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+24.91347487931111
+20
+-143.42355266657526
+30
+224.8153619941597
+11
+28.652087585149673
+21
+-147.30788882315008
+31
+224.37149870684334
+12
+22.07262815076362
+22
+-154.38080010950662
+32
+223.2291363738264
+13
+22.07262815076362
+23
+-154.38080010950662
+33
+223.2291363738264
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+24.91347487931111
+20
+-143.42355266657526
+30
+224.8153619941597
+11
+22.07262815076362
+21
+-154.38080010950662
+31
+223.2291363738264
+12
+19.471814413094663
+22
+-148.4605947831483
+32
+223.656267323376
+13
+19.471814413094663
+23
+-148.4605947831483
+33
+223.656267323376
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+20.074787021359942
+20
+-139.68341883912163
+30
+224.96504036109613
+11
+24.91347487931111
+21
+-143.42355266657526
+31
+224.8153619941597
+12
+19.471814413094663
+22
+-148.4605947831483
+32
+223.656267323376
+13
+19.471814413094663
+23
+-148.4605947831483
+33
+223.656267323376
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+20.074787021359942
+20
+-139.68341883912163
+30
+224.96504036109613
+11
+19.471814413094663
+21
+-148.4605947831483
+31
+223.656267323376
+12
+16.42500781784906
+22
+-143.4208146476677
+32
+223.78647533363815
+13
+16.42500781784906
+23
+-143.4208146476677
+33
+223.78647533363815
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.42500781784906
+20
+-143.4208146476677
+30
+223.78647533363815
+11
+19.471814413094663
+21
+-148.4605947831483
+31
+223.656267323376
+12
+9.635329376242348
+22
+-151.69297821544845
+32
+223.99334787330352
+13
+9.635329376242348
+23
+-151.69297821544845
+33
+223.99334787330352
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.42500781784906
+20
+-143.4208146476677
+30
+223.78647533363815
+11
+9.635329376242348
+21
+-151.69297821544845
+31
+223.99334787330352
+12
+9.015015981563794
+22
+-146.03045089070483
+32
+223.74053746085875
+13
+9.015015981563794
+23
+-146.03045089070483
+33
+223.74053746085875
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.471814413094663
+20
+-148.4605947831483
+30
+223.656267323376
+11
+22.07262815076362
+21
+-154.38080010950662
+31
+223.2291363738264
+12
+13.110179594005233
+22
+-157.95756547548797
+32
+223.58994642095084
+13
+13.110179594005233
+23
+-157.95756547548797
+33
+223.58994642095084
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.471814413094663
+20
+-148.4605947831483
+30
+223.656267323376
+11
+13.110179594005233
+21
+-157.95756547548797
+31
+223.58994642095084
+12
+9.635329376242348
+22
+-151.69297821544845
+32
+223.99334787330352
+13
+9.635329376242348
+23
+-151.69297821544845
+33
+223.99334787330352
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.299883720074494
+20
+-155.03092748784405
+30
+226.58564332992623
+11
+12.612772825834837
+21
+-159.8434520540136
+31
+226.25160502322737
+12
+22.07262815076362
+22
+-154.38080010950662
+32
+223.2291363738264
+13
+22.07262815076362
+23
+-154.38080010950662
+33
+223.2291363738264
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.07262815076362
+20
+-154.38080010950662
+30
+223.2291363738264
+11
+12.612772825834837
+21
+-159.8434520540136
+31
+226.25160502322737
+12
+13.110179594005233
+22
+-157.95756547548797
+32
+223.58994642095084
+13
+13.110179594005233
+23
+-157.95756547548797
+33
+223.58994642095084
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.110179594005233
+20
+-157.95756547548797
+30
+223.58994642095084
+11
+12.612772825834837
+21
+-159.8434520540136
+31
+226.25160502322737
+12
+6.940206098431001
+22
+-160.6000883678463
+32
+225.87801755453404
+13
+6.940206098431001
+23
+-160.6000883678463
+33
+225.87801755453404
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.110179594005233
+20
+-157.95756547548797
+30
+223.58994642095084
+11
+6.940206098431001
+21
+-160.6000883678463
+31
+225.87801755453404
+12
+7.1060083544878
+22
+-158.2639193687895
+32
+224.42321684175712
+13
+7.1060083544878
+23
+-158.2639193687895
+33
+224.42321684175712
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+9.635329376242348
+20
+-151.69297821544845
+30
+223.99334787330352
+11
+13.110179594005233
+21
+-157.95756547548797
+31
+223.58994642095084
+12
+7.1060083544878
+22
+-158.2639193687895
+32
+224.42321684175712
+13
+7.1060083544878
+23
+-158.2639193687895
+33
+224.42321684175712
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+5.321124251212118
+20
+-151.53843225934423
+30
+224.5205686251319
+11
+9.635329376242348
+21
+-151.69297821544845
+31
+223.99334787330352
+12
+7.1060083544878
+22
+-158.2639193687895
+32
+224.42321684175712
+13
+7.1060083544878
+23
+-158.2639193687895
+33
+224.42321684175712
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+9.015015981563794
+20
+-146.03045089070483
+30
+223.74053746085875
+11
+9.635329376242348
+21
+-151.69297821544845
+31
+223.99334787330352
+12
+5.321124251212118
+22
+-151.53843225934423
+32
+224.5205686251319
+13
+5.321124251212118
+23
+-151.53843225934423
+33
+224.5205686251319
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+9.015015981563794
+20
+-146.03045089070483
+30
+223.74053746085875
+11
+5.321124251212118
+21
+-151.53843225934423
+31
+224.5205686251319
+12
+4.799683761521563
+22
+-146.58566028025282
+32
+223.72137132850708
+13
+4.799683761521563
+23
+-146.58566028025282
+33
+223.72137132850708
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-157.71388179273322
+30
+224.6735934596194
+11
+2.0911746134964577
+21
+-158.02084413468063
+31
+224.98390226912014
+12
+0.020623870886214313
+22
+-160.18357484717228
+32
+226.02221988365508
+13
+0.020623870886214313
+23
+-160.18357484717228
+33
+226.02221988365508
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+2.0911746134964577
+20
+-158.02084413468063
+30
+224.98390226912014
+11
+1.7826911499338802
+21
+-160.21095503624593
+31
+226.27472607177828
+12
+0.020623870886214313
+22
+-160.18357484717228
+32
+226.02221988365508
+13
+0.020623870886214313
+23
+-160.18357484717228
+33
+226.02221988365508
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.68407851876636
+20
+-157.88424741363556
+30
+224.5622473573867
+11
+1.7826911499338802
+21
+-160.21095503624593
+31
+226.27472607177828
+12
+2.0911746134964577
+22
+-158.02084413468063
+32
+224.98390226912014
+13
+2.0911746134964577
+23
+-158.02084413468063
+33
+224.98390226912014
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.68407851876636
+20
+-157.88424741363556
+30
+224.5622473573867
+11
+4.3853302335410795
+21
+-160.40322480840712
+31
+226.029521267408
+12
+1.7826911499338802
+22
+-160.21095503624593
+32
+226.27472607177828
+13
+1.7826911499338802
+23
+-160.21095503624593
+33
+226.27472607177828
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.1060083544878
+20
+-158.2639193687895
+30
+224.42321684175712
+11
+6.940206098431001
+21
+-160.6000883678463
+31
+225.87801755453404
+12
+4.3853302335410795
+22
+-160.40322480840712
+32
+226.029521267408
+13
+4.3853302335410795
+23
+-160.40322480840712
+33
+226.029521267408
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.68407851876636
+20
+-157.88424741363556
+30
+224.5622473573867
+11
+7.1060083544878
+21
+-158.2639193687895
+31
+224.42321684175712
+12
+4.3853302335410795
+22
+-160.40322480840712
+32
+226.029521267408
+13
+4.3853302335410795
+23
+-160.40322480840712
+33
+226.029521267408
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-152.09942191102994
+30
+224.32191014218665
+11
+2.0911746134964577
+21
+-158.02084413468063
+31
+224.98390226912014
+12
+0.020623870886214313
+22
+-157.71388179273322
+32
+224.6735934596194
+13
+0.020623870886214313
+23
+-157.71388179273322
+33
+224.6735934596194
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-152.09942191102994
+30
+224.32191014218665
+11
+1.1395609310273316
+21
+-152.2472749320275
+31
+224.37271560413424
+12
+2.0911746134964577
+22
+-158.02084413468063
+32
+224.98390226912014
+13
+2.0911746134964577
+23
+-158.02084413468063
+33
+224.98390226912014
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.1395609310273316
+20
+-152.2472749320275
+30
+224.37271560413424
+11
+4.68407851876636
+21
+-157.88424741363556
+31
+224.5622473573867
+12
+2.0911746134964577
+22
+-158.02084413468063
+32
+224.98390226912014
+13
+2.0911746134964577
+23
+-158.02084413468063
+33
+224.98390226912014
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.1395609310273316
+20
+-152.2472749320275
+30
+224.37271560413424
+11
+3.1465287901222103
+21
+-152.33032817221732
+31
+224.44055762817214
+12
+4.68407851876636
+22
+-157.88424741363556
+32
+224.5622473573867
+13
+4.68407851876636
+23
+-157.88424741363556
+33
+224.5622473573867
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.1465287901222103
+20
+-152.33032817221732
+30
+224.44055762817214
+11
+7.1060083544878
+21
+-158.2639193687895
+31
+224.42321684175712
+12
+4.68407851876636
+22
+-157.88424741363556
+32
+224.5622473573867
+13
+4.68407851876636
+23
+-157.88424741363556
+33
+224.5622473573867
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+5.321124251212118
+20
+-151.53843225934423
+30
+224.5205686251319
+11
+7.1060083544878
+21
+-158.2639193687895
+31
+224.42321684175712
+12
+3.1465287901222103
+22
+-152.33032817221732
+32
+224.44055762817214
+13
+3.1465287901222103
+23
+-152.33032817221732
+33
+224.44055762817214
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.799683761521563
+20
+-146.58566028025282
+30
+223.72137132850708
+11
+5.321124251212118
+21
+-151.53843225934423
+31
+224.5205686251319
+12
+1.1395609310273316
+22
+-152.2472749320275
+32
+224.37271560413424
+13
+1.1395609310273316
+23
+-152.2472749320275
+33
+224.37271560413424
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+5.321124251212118
+20
+-151.53843225934423
+30
+224.5205686251319
+11
+3.1465287901222103
+21
+-152.33032817221732
+31
+224.44055762817214
+12
+1.1395609310273316
+22
+-152.2472749320275
+32
+224.37271560413424
+13
+1.1395609310273316
+23
+-152.2472749320275
+33
+224.37271560413424
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-146.76758642543078
+30
+223.81598509297245
+11
+1.1395609310273316
+21
+-152.2472749320275
+31
+224.37271560413424
+12
+0.020623870886214313
+22
+-152.09942191102994
+32
+224.32191014218665
+13
+0.020623870886214313
+23
+-152.09942191102994
+33
+224.32191014218665
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.799683761521563
+20
+-146.58566028025282
+30
+223.72137132850708
+11
+1.1395609310273316
+21
+-152.2472749320275
+31
+224.37271560413424
+12
+0.020623870886214313
+22
+-146.76758642543078
+32
+223.81598509297245
+13
+0.020623870886214313
+23
+-146.76758642543078
+33
+223.81598509297245
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.856269485607
+20
+-139.93927149479904
+30
+227.9379204458432
+11
+9.015015981563794
+21
+-146.03045089070483
+31
+223.74053746085875
+12
+4.799683761521563
+22
+-146.58566028025282
+32
+223.72137132850708
+13
+4.799683761521563
+23
+-146.58566028025282
+33
+223.72137132850708
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.856269485607
+20
+-139.93927149479904
+30
+227.9379204458432
+11
+8.242286201042196
+21
+-140.12180608862306
+31
+227.8563883272684
+12
+9.015015981563794
+22
+-146.03045089070483
+32
+223.74053746085875
+13
+9.015015981563794
+23
+-146.03045089070483
+33
+223.74053746085875
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-140.34875743361098
+30
+228.38786821961924
+11
+4.799683761521563
+21
+-146.58566028025282
+31
+223.72137132850708
+12
+0.020623870886214313
+22
+-146.76758642543078
+32
+223.81598509297245
+13
+0.020623870886214313
+23
+-146.76758642543078
+33
+223.81598509297245
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.856269485607
+20
+-139.93927149479904
+30
+227.9379204458432
+11
+4.799683761521563
+21
+-146.58566028025282
+31
+223.72137132850708
+12
+0.020623870886214313
+22
+-140.34875743361098
+32
+228.38786821961924
+13
+0.020623870886214313
+23
+-140.34875743361098
+33
+228.38786821961924
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+24.53775784035672
+20
+-91.14108163055656
+30
+303.52397462675873
+11
+26.259363284440084
+21
+-86.50166070419769
+31
+307.92670902979484
+12
+25.557213546863768
+22
+-86.24915451607431
+32
+307.14698208984345
+13
+25.557213546863768
+23
+-86.24915451607431
+33
+307.14698208984345
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.557213546863768
+20
+-86.24915451607431
+30
+307.14698208984345
+11
+23.805185670476416
+21
+-89.76385812015457
+31
+303.9851787004878
+12
+24.53775784035672
+22
+-91.14108163055656
+32
+303.52397462675873
+13
+24.53775784035672
+23
+-91.14108163055656
+33
+303.52397462675873
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.408143628574162
+20
+-84.8649338462426
+30
+308.3973440575382
+11
+26.259363284440084
+21
+-86.50166070419769
+31
+307.92670902979484
+12
+26.819440263156743
+22
+-84.90113654068465
+32
+309.54761622295234
+13
+26.819440263156743
+23
+-84.90113654068465
+33
+309.54761622295234
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.557213546863768
+20
+-86.24915451607431
+30
+307.14698208984345
+11
+26.259363284440084
+21
+-86.50166070419769
+31
+307.92670902979484
+12
+25.408143628574162
+22
+-84.8649338462426
+32
+308.3973440575382
+13
+25.408143628574162
+23
+-84.8649338462426
+33
+308.3973440575382
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+23.76350693821993
+20
+-84.84728883550562
+30
+305.7746261686104
+11
+25.557213546863768
+21
+-86.24915451607431
+31
+307.14698208984345
+12
+25.408143628574162
+22
+-84.8649338462426
+32
+308.3973440575382
+13
+25.408143628574162
+23
+-84.8649338462426
+33
+308.3973440575382
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+23.805185670476416
+20
+-89.76385812015457
+30
+303.9851787004878
+11
+25.557213546863768
+21
+-86.24915451607431
+31
+307.14698208984345
+12
+23.76350693821993
+22
+-84.84728883550562
+32
+305.7746261686104
+13
+23.76350693821993
+23
+-84.84728883550562
+33
+305.7746261686104
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+23.805185670476416
+20
+-89.76385812015457
+30
+303.9851787004878
+11
+23.76350693821993
+21
+-84.84728883550562
+31
+305.7746261686104
+12
+22.81250170439691
+22
+-86.2786642754084
+32
+304.2754087046689
+13
+22.81250170439691
+23
+-86.2786642754084
+33
+304.2754087046689
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.38719610078697
+20
+-89.92053364651954
+30
+301.54834187293727
+11
+23.805185670476416
+21
+-89.76385812015457
+31
+303.9851787004878
+12
+22.81250170439691
+22
+-86.2786642754084
+32
+304.2754087046689
+13
+22.81250170439691
+23
+-86.2786642754084
+33
+304.2754087046689
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.408143628574162
+20
+-84.8649338462426
+30
+308.3973440575382
+11
+23.85994604862361
+21
+-86.28353186457821
+31
+308.70491484813124
+12
+23.76350693821993
+22
+-84.84728883550562
+32
+305.7746261686104
+13
+23.76350693821993
+23
+-84.84728883550562
+33
+305.7746261686104
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.81250170439691
+20
+-86.2786642754084
+30
+304.2754087046689
+11
+23.85994604862361
+21
+-86.28353186457821
+31
+308.70491484813124
+12
+21.96523696473048
+22
+-89.25276125744774
+32
+305.5342889534076
+13
+21.96523696473048
+23
+-89.25276125744774
+33
+305.5342889534076
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.81250170439691
+20
+-86.2786642754084
+30
+304.2754087046689
+11
+23.76350693821993
+21
+-84.84728883550562
+31
+305.7746261686104
+12
+23.85994604862361
+22
+-86.28353186457821
+32
+308.70491484813124
+13
+23.85994604862361
+23
+-86.28353186457821
+33
+308.70491484813124
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.38719610078697
+20
+-89.92053364651954
+30
+301.54834187293727
+11
+22.81250170439691
+21
+-86.2786642754084
+31
+304.2754087046689
+12
+21.96523696473048
+22
+-89.25276125744774
+32
+305.5342889534076
+13
+21.96523696473048
+23
+-89.25276125744774
+33
+305.5342889534076
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.10811984538664
+20
+-105.9774934165531
+30
+233.23385746133224
+11
+30.225840008235597
+21
+-113.40178379602085
+31
+231.59043766826824
+12
+24.645453250712876
+22
+-107.01702792838122
+32
+234.94086013790943
+13
+24.645453250712876
+23
+-107.01702792838122
+33
+234.94086013790943
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+24.645453250712876
+20
+-107.01702792838122
+30
+234.94086013790943
+11
+30.225840008235597
+21
+-113.40178379602085
+31
+231.59043766826824
+12
+25.618058411471765
+22
+-114.31567366243303
+32
+231.7264259406669
+13
+25.618058411471765
+23
+-114.31567366243303
+33
+231.7264259406669
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.96046849753959
+20
+-104.24463167251768
+30
+234.41607318066613
+11
+38.27987473639654
+21
+-110.71031121008564
+31
+230.28227307919667
+12
+29.10811984538664
+22
+-105.9774934165531
+32
+233.23385746133224
+13
+29.10811984538664
+23
+-105.9774934165531
+33
+233.23385746133224
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.10811984538664
+20
+-105.9774934165531
+30
+233.23385746133224
+11
+38.27987473639654
+21
+-110.71031121008564
+31
+230.28227307919667
+12
+30.225840008235597
+22
+-113.40178379602085
+32
+231.59043766826824
+13
+30.225840008235597
+23
+-113.40178379602085
+33
+231.59043766826824
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.30696535131463
+20
+-103.82358520943055
+30
+235.58581570275481
+11
+39.82046670827109
+21
+-110.83565163117865
+31
+232.39967436755526
+12
+35.96046849753959
+22
+-104.24463167251768
+32
+234.41607318066613
+13
+35.96046849753959
+23
+-104.24463167251768
+33
+234.41607318066613
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.27987473639654
+20
+-110.71031121008564
+30
+230.28227307919667
+11
+35.96046849753959
+21
+-104.24463167251768
+31
+234.41607318066613
+12
+39.82046670827109
+22
+-110.83565163117865
+32
+232.39967436755526
+13
+39.82046670827109
+23
+-110.83565163117865
+33
+232.39967436755526
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.27987473639654
+20
+-110.71031121008564
+30
+230.28227307919667
+11
+39.82046670827109
+21
+-110.83565163117865
+31
+232.39967436755526
+12
+40.230865320052054
+22
+-117.44036168437673
+32
+231.17517146731763
+13
+40.230865320052054
+23
+-117.44036168437673
+33
+231.17517146731763
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.605394762049336
+20
+-116.56297873672848
+30
+227.78641673297525
+11
+38.27987473639654
+21
+-110.71031121008564
+31
+230.28227307919667
+12
+40.230865320052054
+22
+-117.44036168437673
+32
+231.17517146731763
+13
+40.230865320052054
+23
+-117.44036168437673
+33
+231.17517146731763
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.27987473639654
+20
+-110.71031121008564
+30
+230.28227307919667
+11
+38.605394762049336
+21
+-116.56297873672848
+31
+227.78641673297525
+12
+30.225840008235597
+22
+-113.40178379602085
+32
+231.59043766826824
+13
+30.225840008235597
+23
+-113.40178379602085
+33
+231.59043766826824
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.225840008235597
+20
+-113.40178379602085
+30
+231.59043766826824
+11
+38.605394762049336
+21
+-116.56297873672848
+31
+227.78641673297525
+12
+30.84524072994503
+22
+-118.44004280988594
+32
+230.34281371947995
+13
+30.84524072994503
+23
+-118.44004280988594
+33
+230.34281371947995
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.225840008235597
+20
+-113.40178379602085
+30
+231.59043766826824
+11
+30.84524072994503
+21
+-118.44004280988594
+31
+230.34281371947995
+12
+25.618058411471765
+22
+-114.31567366243303
+32
+231.7264259406669
+13
+25.618058411471765
+23
+-114.31567366243303
+33
+231.7264259406669
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.618058411471765
+20
+-114.31567366243303
+30
+231.7264259406669
+11
+30.84524072994503
+21
+-118.44004280988594
+31
+230.34281371947995
+12
+25.53105025508233
+22
+-118.89090325663096
+32
+229.33613543454044
+13
+25.53105025508233
+23
+-118.89090325663096
+33
+229.33613543454044
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.84524072994503
+20
+-118.44004280988594
+30
+230.34281371947995
+11
+30.80842958685722
+21
+-123.60577181510466
+31
+228.58165911340004
+12
+25.53105025508233
+22
+-118.89090325663096
+32
+229.33613543454044
+13
+25.53105025508233
+23
+-118.89090325663096
+33
+229.33613543454044
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.53105025508233
+20
+-118.89090325663096
+30
+229.33613543454044
+11
+30.80842958685722
+21
+-123.60577181510466
+31
+228.58165911340004
+12
+25.608931681780568
+22
+-123.46187371030673
+32
+228.57435772964712
+13
+25.608931681780568
+23
+-123.46187371030673
+33
+228.57435772964712
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.605394762049336
+20
+-116.56297873672848
+30
+227.78641673297525
+11
+37.93549280271526
+21
+-122.09742762147181
+31
+226.4237959900777
+12
+30.84524072994503
+22
+-118.44004280988594
+32
+230.34281371947995
+13
+30.84524072994503
+23
+-118.44004280988594
+33
+230.34281371947995
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.84524072994503
+20
+-118.44004280988594
+30
+230.34281371947995
+11
+37.93549280271526
+21
+-122.09742762147181
+31
+226.4237959900777
+12
+30.80842958685722
+22
+-123.60577181510466
+32
+228.58165911340004
+13
+30.80842958685722
+23
+-123.60577181510466
+33
+228.58165911340004
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.605394762049336
+20
+-116.56297873672848
+30
+227.78641673297525
+11
+40.230865320052054
+21
+-117.44036168437673
+31
+231.17517146731763
+12
+39.76144718960134
+22
+-122.34232820151988
+32
+229.8359759972943
+13
+39.76144718960134
+23
+-122.34232820151988
+33
+229.8359759972943
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.93549280271526
+20
+-122.09742762147181
+30
+226.4237959900777
+11
+38.605394762049336
+21
+-116.56297873672848
+31
+227.78641673297525
+12
+39.76144718960134
+22
+-122.34232820151988
+32
+229.8359759972943
+13
+39.76144718960134
+23
+-122.34232820151988
+33
+229.8359759972943
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.93549280271526
+20
+-122.09742762147181
+30
+226.4237959900777
+11
+39.76144718960134
+21
+-122.34232820151988
+31
+229.8359759972943
+12
+38.9640752389135
+22
+-128.55884801851897
+32
+228.79917950437206
+13
+38.9640752389135
+23
+-128.55884801851897
+33
+228.79917950437206
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.233343065138946
+20
+-127.5786372496831
+30
+224.93309680718005
+11
+37.93549280271526
+21
+-122.09742762147181
+31
+226.4237959900777
+12
+38.9640752389135
+22
+-128.55884801851897
+32
+228.79917950437206
+13
+38.9640752389135
+23
+-128.55884801851897
+33
+228.79917950437206
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.93549280271526
+20
+-122.09742762147181
+30
+226.4237959900777
+11
+37.233343065138946
+21
+-127.5786372496831
+31
+224.93309680718005
+12
+30.80842958685722
+22
+-123.60577181510466
+32
+228.58165911340004
+13
+30.80842958685722
+23
+-123.60577181510466
+33
+228.58165911340004
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.80842958685722
+20
+-123.60577181510466
+30
+228.58165911340004
+11
+37.233343065138946
+21
+-127.5786372496831
+31
+224.93309680718005
+12
+31.139121426001676
+22
+-127.40522938555101
+32
+227.27014805677365
+13
+31.139121426001676
+23
+-127.40522938555101
+33
+227.27014805677365
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.608931681780568
+20
+-123.46187371030673
+30
+228.57435772964712
+11
+30.80842958685722
+21
+-123.60577181510466
+31
+228.58165911340004
+12
+31.139121426001676
+22
+-127.40522938555101
+32
+227.27014805677365
+13
+31.139121426001676
+23
+-127.40522938555101
+33
+227.27014805677365
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.608931681780568
+20
+-123.46187371030673
+30
+228.57435772964712
+11
+31.139121426001676
+21
+-127.40522938555101
+31
+227.27014805677365
+12
+25.094488351519942
+22
+-127.67446791144154
+32
+228.16791403406455
+13
+25.094488351519942
+23
+-127.67446791144154
+33
+228.16791403406455
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.139121426001676
+20
+-127.40522938555101
+30
+227.27014805677365
+11
+29.307386776977836
+21
+-131.87306779371622
+31
+226.7821722426163
+12
+25.094488351519942
+22
+-127.67446791144154
+32
+228.16791403406455
+13
+25.094488351519942
+23
+-127.67446791144154
+33
+228.16791403406455
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.094488351519942
+20
+-127.67446791144154
+30
+228.16791403406455
+11
+29.307386776977836
+21
+-131.87306779371622
+31
+226.7821722426163
+12
+23.870289675606973
+22
+-131.42281579561723
+32
+227.71796626028745
+13
+23.870289675606973
+23
+-131.42281579561723
+33
+227.71796626028745
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.139121426001676
+20
+-127.40522938555101
+30
+227.27014805677365
+11
+37.233343065138946
+21
+-127.5786372496831
+31
+224.93309680718005
+12
+35.164921892789984
+22
+-132.62328497433245
+32
+224.70249477031467
+13
+35.164921892789984
+23
+-132.62328497433245
+33
+224.70249477031467
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.139121426001676
+20
+-127.40522938555101
+30
+227.27014805677365
+11
+35.164921892789984
+21
+-132.62328497433245
+31
+224.70249477031467
+12
+29.307386776977836
+22
+-131.87306779371622
+32
+226.7821722426163
+13
+29.307386776977836
+23
+-131.87306779371622
+33
+226.7821722426163
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.233343065138946
+20
+-127.5786372496831
+30
+224.93309680718005
+11
+38.9640752389135
+21
+-128.55884801851897
+31
+228.79917950437206
+12
+36.94676375283527
+22
+-133.64973784027015
+32
+228.2202406176259
+13
+36.94676375283527
+23
+-133.64973784027015
+33
+228.2202406176259
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.164921892789984
+20
+-132.62328497433245
+30
+224.70249477031467
+11
+37.233343065138946
+21
+-127.5786372496831
+31
+224.93309680718005
+12
+36.94676375283527
+22
+-133.64973784027015
+32
+228.2202406176259
+13
+36.94676375283527
+23
+-133.64973784027015
+33
+228.2202406176259
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.164921892789984
+20
+-132.62328497433245
+30
+224.70249477031467
+11
+36.94676375283527
+21
+-133.64973784027015
+31
+228.2202406176259
+12
+34.48528475511863
+22
+-139.17536421964545
+32
+227.1429822897396
+13
+34.48528475511863
+23
+-139.17536421964545
+33
+227.1429822897396
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.312499989799434
+20
+-139.10630529831448
+30
+223.93950016812863
+11
+35.164921892789984
+21
+-132.62328497433245
+31
+224.70249477031467
+12
+34.48528475511863
+22
+-139.17536421964545
+32
+227.1429822897396
+13
+34.48528475511863
+23
+-139.17536421964545
+33
+227.1429822897396
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.307386776977836
+20
+-131.87306779371622
+30
+226.7821722426163
+11
+35.164921892789984
+21
+-132.62328497433245
+31
+224.70249477031467
+12
+33.312499989799434
+22
+-139.10630529831448
+32
+223.93950016812863
+13
+33.312499989799434
+23
+-139.10630529831448
+33
+223.93950016812863
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.307386776977836
+20
+-131.87306779371622
+30
+226.7821722426163
+11
+33.312499989799434
+21
+-139.10630529831448
+31
+223.93950016812863
+12
+26.720871582491768
+22
+-136.73244290563403
+32
+225.90296394902944
+13
+26.720871582491768
+23
+-136.73244290563403
+33
+225.90296394902944
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.286234146845345
+20
+-104.22637821314689
+30
+279.8017788133884
+11
+35.32433543806294
+21
+-100.26781132175101
+31
+282.2294889112486
+12
+35.09373340119866
+22
+-102.06030103310312
+32
+283.7615626020776
+13
+35.09373340119866
+23
+-102.06030103310312
+33
+283.7615626020776
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.286234146845345
+20
+-104.22637821314689
+30
+279.8017788133884
+11
+35.09373340119866
+21
+-102.06030103310312
+31
+283.7615626020776
+12
+40.58589510503976
+22
+-106.0882310701522
+32
+281.84069022640205
+13
+40.58589510503976
+23
+-106.0882310701522
+33
+281.84069022640205
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.09373340119866
+20
+-102.06030103310312
+30
+283.7615626020776
+11
+33.26869168728169
+21
+-111.68535016544278
+31
+283.8656073205549
+12
+40.58589510503976
+22
+-106.0882310701522
+32
+281.84069022640205
+13
+40.58589510503976
+23
+-106.0882310701522
+33
+281.84069022640205
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.58589510503976
+20
+-106.0882310701522
+30
+281.84069022640205
+11
+33.26869168728169
+21
+-111.68535016544278
+31
+283.8656073205549
+12
+40.64582729667862
+22
+-117.19272308543479
+32
+279.86262367799304
+13
+40.64582729667862
+23
+-117.19272308543479
+33
+279.86262367799304
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.35730886629145
+20
+-92.16692604784348
+30
+288.29541768834525
+11
+28.92832327047
+21
+-90.85206852366501
+31
+289.88255598164534
+12
+25.92927989394169
+22
+-95.77898143529822
+32
+291.2637344082456
+13
+25.92927989394169
+23
+-95.77898143529822
+33
+291.2637344082456
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.35730886629145
+20
+-92.16692604784348
+30
+288.29541768834525
+11
+25.92927989394169
+21
+-95.77898143529822
+31
+291.2637344082456
+12
+30.57782754999288
+22
+-97.0077434760559
+32
+288.0988887756602
+13
+30.57782754999288
+23
+-97.0077434760559
+33
+288.0988887756602
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.756711451940397
+20
+-95.43307837999998
+30
+284.7128720602254
+11
+27.35730886629145
+21
+-92.16692604784348
+31
+288.29541768834525
+12
+30.57782754999288
+22
+-97.0077434760559
+32
+288.0988887756602
+13
+30.57782754999288
+23
+-97.0077434760559
+33
+288.0988887756602
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.756711451940397
+20
+-95.43307837999998
+30
+284.7128720602254
+11
+30.57782754999288
+21
+-97.0077434760559
+31
+288.0988887756602
+12
+33.0170981721276
+22
+-98.75277419301285
+32
+286.223345824118
+13
+33.0170981721276
+23
+-98.75277419301285
+33
+286.223345824118
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.32433543806294
+20
+-100.26781132175101
+30
+282.2294889112486
+11
+30.756711451940397
+21
+-95.43307837999998
+31
+284.7128720602254
+12
+33.0170981721276
+22
+-98.75277419301285
+32
+286.223345824118
+13
+33.0170981721276
+23
+-98.75277419301285
+33
+286.223345824118
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.32433543806294
+20
+-100.26781132175101
+30
+282.2294889112486
+11
+33.0170981721276
+21
+-98.75277419301285
+31
+286.223345824118
+12
+35.09373340119866
+22
+-102.06030103310312
+32
+283.7615626020776
+13
+35.09373340119866
+23
+-102.06030103310312
+33
+283.7615626020776
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.0170981721276
+20
+-98.75277419301285
+30
+286.223345824118
+11
+27.09050413498537
+21
+-105.77883493362214
+31
+288.3246232233536
+12
+35.09373340119866
+22
+-102.06030103310312
+32
+283.7615626020776
+13
+35.09373340119866
+23
+-102.06030103310312
+33
+283.7615626020776
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.09373340119866
+20
+-102.06030103310312
+30
+283.7615626020776
+11
+27.09050413498537
+21
+-105.77883493362214
+31
+288.3246232233536
+12
+33.26869168728169
+22
+-111.68535016544278
+32
+283.8656073205549
+13
+33.26869168728169
+23
+-111.68535016544278
+33
+283.8656073205549
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.57782754999288
+20
+-97.0077434760559
+30
+288.0988887756602
+11
+24.98892251142504
+21
+-102.92764457809199
+31
+290.88284555579764
+12
+33.0170981721276
+22
+-98.75277419301285
+32
+286.223345824118
+13
+33.0170981721276
+23
+-98.75277419301285
+33
+286.223345824118
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.0170981721276
+20
+-98.75277419301285
+30
+286.223345824118
+11
+24.98892251142504
+21
+-102.92764457809199
+31
+290.88284555579764
+12
+27.09050413498537
+22
+-105.77883493362214
+32
+288.3246232233536
+13
+27.09050413498537
+23
+-105.77883493362214
+33
+288.3246232233536
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.92927989394169
+20
+-95.77898143529822
+30
+291.2637344082456
+11
+20.39361411190586
+21
+-96.79965403909883
+31
+296.93903915455655
+12
+30.57782754999288
+22
+-97.0077434760559
+32
+288.0988887756602
+13
+30.57782754999288
+23
+-97.0077434760559
+33
+288.0988887756602
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+20.39361411190586
+20
+-96.79965403909883
+30
+296.93903915455655
+11
+24.98892251142504
+21
+-102.92764457809199
+31
+290.88284555579764
+12
+30.57782754999288
+22
+-97.0077434760559
+32
+288.0988887756602
+13
+30.57782754999288
+23
+-97.0077434760559
+33
+288.0988887756602
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+60.41794407726195
+20
+-117.46926299508148
+30
+293.08056206543495
+11
+55.15236864922104
+21
+-109.95583488896492
+31
+302.0764752977296
+12
+57.04309239448233
+22
+-112.6077583129028
+32
+295.23568716985153
+13
+57.04309239448233
+23
+-112.6077583129028
+33
+295.23568716985153
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.72352275958811
+20
+-116.25723329209242
+30
+301.9955516277994
+11
+55.15236864922104
+21
+-109.95583488896492
+31
+302.0764752977296
+12
+60.41794407726195
+22
+-117.46926299508148
+32
+293.08056206543495
+13
+60.41794407726195
+23
+-117.46926299508148
+33
+293.08056206543495
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+62.29303069231901
+20
+-115.07684291869887
+30
+308.4496706410932
+11
+56.55180053520503
+21
+-108.10402143462349
+31
+313.88920153705027
+12
+55.77301669065494
+22
+-106.07089028374612
+32
+309.93337266456166
+13
+55.77301669065494
+23
+-106.07089028374612
+33
+309.93337266456166
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+62.29303069231901
+20
+-115.07684291869887
+30
+308.4496706410932
+11
+62.124338305193305
+21
+-116.24567276781973
+31
+313.03341851633667
+12
+56.55180053520503
+22
+-108.10402143462349
+32
+313.88920153705027
+13
+56.55180053520503
+23
+-108.10402143462349
+33
+313.88920153705027
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+62.124338305193305
+20
+-116.24567276781973
+30
+313.03341851633667
+11
+57.78658621755979
+21
+-113.2986517505327
+31
+318.60376587119976
+12
+56.55180053520503
+22
+-108.10402143462349
+32
+313.88920153705027
+13
+56.55180053520503
+23
+-108.10402143462349
+33
+313.88920153705027
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+62.124338305193305
+20
+-116.24567276781973
+30
+313.03341851633667
+11
+60.934729934810015
+21
+-117.97975140914899
+31
+318.0607254545721
+12
+57.78658621755979
+22
+-113.2986517505327
+32
+318.60376587119976
+13
+57.78658621755979
+23
+-113.2986517505327
+33
+318.60376587119976
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.72352275958811
+20
+-116.25723329209242
+30
+301.9955516277994
+11
+55.77301669065494
+21
+-106.07089028374612
+31
+309.93337266456166
+12
+55.15236864922104
+22
+-109.95583488896492
+32
+302.0764752977296
+13
+55.15236864922104
+23
+-109.95583488896492
+33
+302.0764752977296
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.72352275958811
+20
+-116.25723329209242
+30
+301.9955516277994
+11
+62.29303069231901
+21
+-115.07684291869887
+31
+308.4496706410932
+12
+55.77301669065494
+22
+-106.07089028374612
+32
+309.93337266456166
+13
+55.77301669065494
+23
+-106.07089028374612
+33
+309.93337266456166
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.85405188853431
+20
+-122.58662033293868
+30
+298.4498171427665
+11
+62.29303069231901
+21
+-115.07684291869887
+31
+308.4496706410932
+12
+61.72352275958811
+22
+-116.25723329209242
+32
+301.9955516277994
+13
+61.72352275958811
+23
+-116.25723329209242
+33
+301.9955516277994
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.85405188853431
+20
+-122.58662033293868
+30
+298.4498171427665
+11
+65.0044908162776
+21
+-121.83396935773986
+31
+306.71954691596306
+12
+62.29303069231901
+22
+-115.07684291869887
+32
+308.4496706410932
+13
+62.29303069231901
+23
+-115.07684291869887
+33
+308.4496706410932
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.16077085102324
+20
+-122.76154931868992
+30
+310.9765578682615
+11
+60.934729934810015
+21
+-117.97975140914899
+31
+318.0607254545721
+12
+62.124338305193305
+22
+-116.24567276781973
+32
+313.03341851633667
+13
+62.124338305193305
+23
+-116.24567276781973
+33
+313.03341851633667
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.16077085102324
+20
+-122.76154931868992
+30
+310.9765578682615
+11
+62.996032257999815
+21
+-126.55705197293835
+31
+315.9071214717698
+12
+60.934729934810015
+22
+-117.97975140914899
+32
+318.0607254545721
+13
+60.934729934810015
+23
+-117.97975140914899
+33
+318.0607254545721
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.0044908162776
+20
+-121.83396935773986
+30
+306.71954691596306
+11
+62.124338305193305
+21
+-116.24567276781973
+31
+313.03341851633667
+12
+62.29303069231901
+22
+-115.07684291869887
+32
+308.4496706410932
+13
+62.29303069231901
+23
+-115.07684291869887
+33
+308.4496706410932
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.0044908162776
+20
+-121.83396935773986
+30
+306.71954691596306
+11
+65.16077085102324
+21
+-122.76154931868992
+31
+310.9765578682615
+12
+62.124338305193305
+22
+-116.24567276781973
+32
+313.03341851633667
+13
+62.124338305193305
+23
+-116.24567276781973
+33
+313.03341851633667
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.89124275097733
+20
+-124.37241710918181
+30
+292.03646418875985
+11
+61.72352275958811
+21
+-116.25723329209242
+31
+301.9955516277994
+12
+60.41794407726195
+22
+-117.46926299508148
+32
+293.08056206543495
+13
+60.41794407726195
+23
+-117.46926299508148
+33
+293.08056206543495
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.89124275097733
+20
+-124.37241710918181
+30
+292.03646418875985
+11
+64.85405188853431
+21
+-122.58662033293868
+31
+298.4498171427665
+12
+61.72352275958811
+22
+-116.25723329209242
+32
+301.9955516277994
+13
+61.72352275958811
+23
+-116.25723329209242
+33
+301.9955516277994
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+60.934729934810015
+20
+-117.97975140914899
+30
+318.0607254545721
+11
+62.996032257999815
+21
+-126.55705197293835
+31
+315.9071214717698
+12
+56.50601477458751
+22
+-133.31417841198095
+32
+321.0503378770823
+13
+56.50601477458751
+23
+-133.31417841198095
+33
+321.0503378770823
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+60.934729934810015
+20
+-117.97975140914899
+30
+318.0607254545721
+11
+56.50601477458751
+21
+-133.31417841198095
+31
+321.0503378770823
+12
+54.445533857069904
+22
+-121.97786746254229
+32
+324.1488626072476
+13
+54.445533857069904
+23
+-121.97786746254229
+33
+324.1488626072476
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+57.78658621755979
+20
+-113.2986517505327
+30
+318.60376587119976
+11
+60.934729934810015
+21
+-117.97975140914899
+31
+318.0607254545721
+12
+54.445533857069904
+22
+-121.97786746254229
+32
+324.1488626072476
+13
+54.445533857069904
+23
+-121.97786746254229
+33
+324.1488626072476
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+57.78658621755979
+20
+-113.2986517505327
+30
+318.60376587119976
+11
+54.445533857069904
+21
+-121.97786746254229
+31
+324.1488626072476
+12
+52.247756502564336
+22
+-116.22954887870125
+32
+323.32076399993423
+13
+52.247756502564336
+23
+-116.22954887870125
+33
+323.32076399993423
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.99310497191507
+20
+-107.18952311956653
+30
+318.7689596786121
+11
+57.78658621755979
+21
+-113.2986517505327
+31
+318.60376587119976
+12
+52.247756502564336
+22
+-116.22954887870125
+32
+323.32076399993423
+13
+52.247756502564336
+23
+-116.22954887870125
+33
+323.32076399993423
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.99310497191507
+20
+-107.18952311956653
+30
+318.7689596786121
+11
+52.247756502564336
+21
+-116.22954887870125
+31
+323.32076399993423
+12
+48.11444316001369
+22
+-112.05254892336194
+32
+322.6143551218364
+13
+48.11444316001369
+23
+-112.05254892336194
+33
+322.6143551218364
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.70667216128662
+20
+-98.97120725696395
+30
+318.6910782519159
+11
+50.99310497191507
+21
+-107.18952311956653
+31
+318.7689596786121
+12
+48.11444316001369
+22
+-112.05254892336194
+32
+322.6143551218364
+13
+48.11444316001369
+23
+-112.05254892336194
+33
+322.6143551218364
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.70667216128662
+20
+-98.97120725696395
+30
+318.6910782519159
+11
+48.11444316001369
+21
+-112.05254892336194
+31
+322.6143551218364
+12
+37.729837160340246
+22
+-105.30850413021089
+32
+321.4053676620772
+13
+37.729837160340246
+23
+-105.30850413021089
+33
+321.4053676620772
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+62.996032257999815
+20
+-126.55705197293835
+30
+315.9071214717698
+11
+58.78833606846589
+21
+-135.79604043934114
+31
+320.41572593922024
+12
+56.50601477458751
+22
+-133.31417841198095
+32
+321.0503378770823
+13
+56.50601477458751
+23
+-133.31417841198095
+33
+321.0503378770823
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+62.996032257999815
+20
+-126.55705197293835
+30
+315.9071214717698
+11
+65.85470653187747
+21
+-130.07844851212593
+31
+314.8405109951907
+12
+58.78833606846589
+22
+-135.79604043934114
+32
+320.41572593922024
+13
+58.78833606846589
+23
+-135.79604043934114
+33
+320.41572593922024
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.16077085102324
+20
+-122.76154931868992
+30
+310.9765578682615
+11
+65.85470653187747
+21
+-130.07844851212593
+31
+314.8405109951907
+12
+62.996032257999815
+22
+-126.55705197293835
+32
+315.9071214717698
+13
+62.996032257999815
+23
+-126.55705197293835
+33
+315.9071214717698
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.62692025314716
+20
+-126.02374673464742
+30
+309.4161913153885
+11
+65.85470653187747
+21
+-130.07844851212593
+31
+314.8405109951907
+12
+65.16077085102324
+22
+-122.76154931868992
+32
+310.9765578682615
+13
+65.16077085102324
+23
+-122.76154931868992
+33
+310.9765578682615
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.0044908162776
+20
+-121.83396935773986
+30
+306.71954691596306
+11
+68.62692025314716
+21
+-126.02374673464742
+31
+309.4161913153885
+12
+65.16077085102324
+22
+-122.76154931868992
+32
+310.9765578682615
+13
+65.16077085102324
+23
+-122.76154931868992
+33
+310.9765578682615
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.73038694541307
+20
+-124.09344340495674
+30
+302.08286400850983
+11
+68.62692025314716
+21
+-126.02374673464742
+31
+309.4161913153885
+12
+65.0044908162776
+22
+-121.83396935773986
+32
+306.71954691596306
+13
+65.0044908162776
+23
+-121.83396935773986
+33
+306.71954691596306
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.337651486634016
+20
+-97.26633415064434
+30
+305.3435403028595
+11
+19.734055779555145
+21
+-93.01206121725299
+31
+305.38035144594835
+12
+22.478767622022012
+22
+-92.66402859169678
+32
+311.37965509629726
+13
+22.478767622022012
+23
+-92.66402859169678
+33
+311.37965509629726
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.337651486634016
+20
+-97.26633415064434
+30
+305.3435403028595
+11
+22.478767622022012
+21
+-92.66402859169678
+31
+311.37965509629726
+12
+22.074149272378815
+22
+-96.32536831948337
+32
+312.13261029582026
+13
+22.074149272378815
+23
+-96.32536831948337
+33
+312.13261029582026
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.734055779555145
+20
+-93.01206121725299
+30
+305.38035144594835
+11
+21.224450738128105
+21
+-90.15813284281502
+31
+306.3520439337389
+12
+23.379271618220415
+22
+-86.81987934609792
+32
+309.51901913658617
+13
+23.379271618220415
+23
+-86.81987934609792
+33
+309.51901913658617
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.734055779555145
+20
+-93.01206121725299
+30
+305.38035144594835
+11
+23.379271618220415
+21
+-86.81987934609792
+31
+309.51901913658617
+12
+22.478767622022012
+22
+-92.66402859169678
+32
+311.37965509629726
+13
+22.478767622022012
+23
+-92.66402859169678
+33
+311.37965509629726
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.819440263156743
+20
+-84.90113654068465
+30
+309.54761622295234
+11
+22.478767622022012
+21
+-92.66402859169678
+31
+311.37965509629726
+12
+23.379271618220415
+22
+-86.81987934609792
+32
+309.51901913658617
+13
+23.379271618220415
+23
+-86.81987934609792
+33
+309.51901913658617
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.819440263156743
+20
+-84.90113654068465
+30
+309.54761622295234
+11
+27.559618041113048
+21
+-89.5265631481856
+31
+312.60141997762673
+12
+22.478767622022012
+22
+-92.66402859169678
+32
+311.37965509629726
+13
+22.478767622022012
+23
+-92.66402859169678
+33
+311.37965509629726
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.559618041113048
+20
+-89.5265631481856
+30
+312.60141997762673
+11
+22.074149272378815
+21
+-96.32536831948337
+31
+312.13261029582026
+12
+22.478767622022012
+22
+-92.66402859169678
+32
+311.37965509629726
+13
+22.478767622022012
+23
+-92.66402859169678
+33
+311.37965509629726
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.559618041113048
+20
+-89.5265631481856
+30
+312.60141997762673
+11
+27.61103195170681
+21
+-94.5048899704129
+31
+315.29350101220615
+12
+22.074149272378815
+22
+-96.32536831948337
+32
+312.13261029582026
+13
+22.074149272378815
+23
+-96.32536831948337
+33
+312.13261029582026
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.559618041113048
+20
+-89.5265631481856
+30
+312.60141997762673
+11
+36.79769383454566
+21
+-91.85205387350403
+31
+315.25303917724284
+12
+27.61103195170681
+22
+-94.5048899704129
+32
+315.29350101220615
+13
+27.61103195170681
+23
+-94.5048899704129
+33
+315.29350101220615
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.79769383454566
+20
+-91.85205387350403
+30
+315.25303917724284
+11
+35.918789765283115
+21
+-96.52767749430639
+31
+317.50034425153785
+12
+27.61103195170681
+22
+-94.5048899704129
+32
+315.29350101220615
+13
+27.61103195170681
+23
+-94.5048899704129
+33
+315.29350101220615
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.819440263156743
+20
+-84.90113654068465
+30
+309.54761622295234
+11
+35.309732670557025
+21
+-88.00392041137039
+31
+312.5515271886485
+12
+27.559618041113048
+22
+-89.5265631481856
+32
+312.60141997762673
+13
+27.559618041113048
+23
+-89.5265631481856
+33
+312.60141997762673
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.309732670557025
+20
+-88.00392041137039
+30
+312.5515271886485
+11
+36.79769383454566
+21
+-91.85205387350403
+31
+315.25303917724284
+12
+27.559618041113048
+22
+-89.5265631481856
+32
+312.60141997762673
+13
+27.559618041113048
+23
+-89.5265631481856
+33
+312.60141997762673
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.12550115310758
+20
+-94.70689492091051
+30
+311.6339866303582
+11
+49.67526604937041
+21
+-102.47739257999926
+31
+316.0224224902081
+12
+41.896189264373014
+22
+-96.34057953563644
+32
+316.26063013515005
+13
+41.896189264373014
+23
+-96.34057953563644
+33
+316.26063013515005
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.05837012888838
+20
+-91.30962190552313
+30
+313.0130354866993
+11
+47.12550115310758
+21
+-94.70689492091051
+31
+311.6339866303582
+12
+41.896189264373014
+22
+-96.34057953563644
+32
+316.26063013515005
+13
+41.896189264373014
+23
+-96.34057953563644
+33
+316.26063013515005
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.309732670557025
+20
+-88.00392041137039
+30
+312.5515271886485
+11
+40.05837012888838
+21
+-91.30962190552313
+31
+313.0130354866993
+12
+41.896189264373014
+22
+-96.34057953563644
+32
+316.26063013515005
+13
+41.896189264373014
+23
+-96.34057953563644
+33
+316.26063013515005
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.309732670557025
+20
+-88.00392041137039
+30
+312.5515271886485
+11
+41.896189264373014
+21
+-96.34057953563644
+31
+316.26063013515005
+12
+36.79769383454566
+22
+-91.85205387350403
+32
+315.25303917724284
+13
+36.79769383454566
+23
+-91.85205387350403
+33
+315.25303917724284
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.896189264373014
+20
+-96.34057953563644
+30
+316.26063013515005
+11
+49.67526604937041
+21
+-102.47739257999926
+31
+316.0224224902081
+12
+50.99310497191507
+22
+-107.18952311956653
+32
+318.7689596786121
+13
+50.99310497191507
+23
+-107.18952311956653
+33
+318.7689596786121
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.896189264373014
+20
+-96.34057953563644
+30
+316.26063013515005
+11
+50.99310497191507
+21
+-107.18952311956653
+31
+318.7689596786121
+12
+40.70667216128662
+22
+-98.97120725696395
+32
+318.6910782519159
+13
+40.70667216128662
+23
+-98.97120725696395
+33
+318.6910782519159
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.79769383454566
+20
+-91.85205387350403
+30
+315.25303917724284
+11
+41.896189264373014
+21
+-96.34057953563644
+31
+316.26063013515005
+12
+40.70667216128662
+22
+-98.97120725696395
+32
+318.6910782519159
+13
+40.70667216128662
+23
+-98.97120725696395
+33
+318.6910782519159
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.79769383454566
+20
+-91.85205387350403
+30
+315.25303917724284
+11
+40.70667216128662
+21
+-98.97120725696395
+31
+318.6910782519159
+12
+35.918789765283115
+22
+-96.52767749430639
+32
+317.50034425153785
+13
+35.918789765283115
+23
+-96.52767749430639
+33
+317.50034425153785
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.41886130152325
+20
+-97.70654674607954
+30
+291.0617294577463
+11
+49.026173033732256
+21
+-104.25223728060762
+31
+288.9151226343746
+12
+48.53758877093003
+22
+-104.56315453875445
+32
+288.6498390246837
+13
+48.53758877093003
+23
+-104.56315453875445
+33
+288.6498390246837
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+48.53758877093003
+20
+-104.56315453875445
+30
+288.6498390246837
+11
+47.22528673106468
+21
+-103.01282738854523
+31
+298.8109314142201
+12
+41.41886130152325
+22
+-97.70654674607954
+32
+291.0617294577463
+13
+41.41886130152325
+23
+-97.70654674607954
+33
+291.0617294577463
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.22528673106468
+20
+-103.01282738854523
+30
+298.8109314142201
+11
+55.15236864922104
+21
+-109.95583488896492
+31
+302.0764752977296
+12
+47.12550115310758
+22
+-94.70689492091051
+32
+311.6339866303582
+13
+47.12550115310758
+23
+-94.70689492091051
+33
+311.6339866303582
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+55.15236864922104
+20
+-109.95583488896492
+30
+302.0764752977296
+11
+55.77301669065494
+21
+-106.07089028374612
+31
+309.93337266456166
+12
+47.12550115310758
+22
+-94.70689492091051
+32
+311.6339866303582
+13
+47.12550115310758
+23
+-94.70689492091051
+33
+311.6339866303582
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+51.95533608325829
+20
+-109.51379694758346
+30
+285.18776622848725
+11
+47.22528673106468
+21
+-103.01282738854523
+31
+298.8109314142201
+12
+48.53758877093003
+22
+-104.56315453875445
+32
+288.6498390246837
+13
+48.53758877093003
+23
+-104.56315453875445
+33
+288.6498390246837
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+55.15236864922104
+20
+-109.95583488896492
+30
+302.0764752977296
+11
+47.22528673106468
+21
+-103.01282738854523
+31
+298.8109314142201
+12
+51.95533608325829
+22
+-109.51379694758346
+32
+285.18776622848725
+13
+51.95533608325829
+23
+-109.51379694758346
+33
+285.18776622848725
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+56.55180053520503
+20
+-108.10402143462349
+30
+313.88920153705027
+11
+50.99310497191507
+21
+-107.18952311956653
+31
+318.7689596786121
+12
+49.67526604937041
+22
+-102.47739257999926
+32
+316.0224224902081
+13
+49.67526604937041
+23
+-102.47739257999926
+33
+316.0224224902081
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+57.78658621755979
+20
+-113.2986517505327
+30
+318.60376587119976
+11
+50.99310497191507
+21
+-107.18952311956653
+31
+318.7689596786121
+12
+56.55180053520503
+22
+-108.10402143462349
+32
+313.88920153705027
+13
+56.55180053520503
+23
+-108.10402143462349
+33
+313.88920153705027
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+55.77301669065494
+20
+-106.07089028374612
+30
+309.93337266456166
+11
+49.67526604937041
+21
+-102.47739257999926
+31
+316.0224224902081
+12
+47.12550115310758
+22
+-94.70689492091051
+32
+311.6339866303582
+13
+47.12550115310758
+23
+-94.70689492091051
+33
+311.6339866303582
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+56.55180053520503
+20
+-108.10402143462349
+30
+313.88920153705027
+11
+49.67526604937041
+21
+-102.47739257999926
+31
+316.0224224902081
+12
+55.77301669065494
+22
+-106.07089028374612
+32
+309.93337266456166
+13
+55.77301669065494
+23
+-106.07089028374612
+33
+309.93337266456166
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.31923456831122
+20
+-110.35315185485032
+30
+283.31709086611403
+11
+51.95533608325829
+21
+-109.51379694758346
+31
+285.18776622848725
+12
+49.026173033732256
+22
+-104.25223728060762
+32
+288.9151226343746
+13
+49.026173033732256
+23
+-104.25223728060762
+33
+288.9151226343746
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+49.026173033732256
+20
+-104.25223728060762
+30
+288.9151226343746
+11
+51.95533608325829
+21
+-109.51379694758346
+31
+285.18776622848725
+12
+48.53758877093003
+22
+-104.56315453875445
+32
+288.6498390246837
+13
+48.53758877093003
+23
+-104.56315453875445
+33
+288.6498390246837
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+51.11290851032824
+20
+-113.6040929708548
+30
+279.6037287790869
+11
+50.810813757549504
+21
+-113.83956259688821
+31
+281.3910466769469
+12
+53.31923456831122
+22
+-110.35315185485032
+32
+283.31709086611403
+13
+53.31923456831122
+23
+-110.35315185485032
+33
+283.31709086611403
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.31923456831122
+20
+-110.35315185485032
+30
+283.31709086611403
+11
+50.810813757549504
+21
+-113.83956259688821
+31
+281.3910466769469
+12
+51.95533608325829
+22
+-109.51379694758346
+32
+285.18776622848725
+13
+51.95533608325829
+23
+-109.51379694758346
+33
+285.18776622848725
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+51.95533608325829
+20
+-109.51379694758346
+30
+285.18776622848725
+11
+50.810813757549504
+21
+-113.83956259688821
+31
+281.3910466769469
+12
+53.91469283579742
+22
+-116.92652680277529
+32
+282.2550437543797
+13
+53.91469283579742
+23
+-116.92652680277529
+33
+282.2550437543797
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.91469283579742
+20
+-116.92652680277529
+30
+282.2550437543797
+11
+55.44244654123968
+21
+-113.69657716506089
+31
+287.0843006583175
+12
+51.95533608325829
+22
+-109.51379694758346
+32
+285.18776622848725
+13
+51.95533608325829
+23
+-109.51379694758346
+33
+285.18776622848725
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+51.95533608325829
+20
+-109.51379694758346
+30
+285.18776622848725
+11
+55.44244654123968
+21
+-113.69657716506089
+31
+287.0843006583175
+12
+55.15236864922104
+22
+-109.95583488896492
+32
+302.0764752977296
+13
+55.15236864922104
+23
+-109.95583488896492
+33
+302.0764752977296
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+57.04309239448233
+20
+-112.6077583129028
+30
+295.23568716985153
+11
+55.15236864922104
+21
+-109.95583488896492
+31
+302.0764752977296
+12
+55.44244654123968
+22
+-113.69657716506089
+32
+287.0843006583175
+13
+55.44244654123968
+23
+-113.69657716506089
+33
+287.0843006583175
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+48.15487457254571
+20
+-111.18155468648708
+30
+278.7826273312026
+11
+40.286234146845345
+21
+-104.22637821314689
+31
+279.8017788133884
+12
+40.58589510503976
+22
+-106.0882310701522
+32
+281.84069022640205
+13
+40.58589510503976
+23
+-106.0882310701522
+33
+281.84069022640205
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+48.15487457254571
+20
+-111.18155468648708
+30
+278.7826273312026
+11
+40.58589510503976
+21
+-106.0882310701522
+31
+281.84069022640205
+12
+47.769239820660204
+22
+-112.80185343099869
+32
+281.0938195133371
+13
+47.769239820660204
+23
+-112.80185343099869
+33
+281.0938195133371
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.58589510503976
+20
+-106.0882310701522
+30
+281.84069022640205
+11
+40.64582729667862
+21
+-117.19272308543479
+31
+279.86262367799304
+12
+47.769239820660204
+22
+-112.80185343099869
+32
+281.0938195133371
+13
+47.769239820660204
+23
+-112.80185343099869
+33
+281.0938195133371
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.769239820660204
+20
+-112.80185343099869
+30
+281.0938195133371
+11
+40.64582729667862
+21
+-117.19272308543479
+31
+279.86262367799304
+12
+47.518254754152196
+22
+-117.68343691849817
+32
+279.78778449452483
+13
+47.518254754152196
+23
+-117.68343691849817
+33
+279.78778449452483
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+51.11290851032824
+20
+-113.6040929708548
+30
+279.6037287790869
+11
+48.15487457254571
+21
+-111.18155468648708
+31
+278.7826273312026
+12
+47.769239820660204
+22
+-112.80185343099869
+32
+281.0938195133371
+13
+47.769239820660204
+23
+-112.80185343099869
+33
+281.0938195133371
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+51.11290851032824
+20
+-113.6040929708548
+30
+279.6037287790869
+11
+47.769239820660204
+21
+-112.80185343099869
+31
+281.0938195133371
+12
+50.810813757549504
+22
+-113.83956259688821
+32
+281.3910466769469
+13
+50.810813757549504
+23
+-113.83956259688821
+33
+281.3910466769469
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.769239820660204
+20
+-112.80185343099869
+30
+281.0938195133371
+11
+47.518254754152196
+21
+-117.68343691849817
+31
+279.78778449452483
+12
+50.810813757549504
+22
+-113.83956259688821
+32
+281.3910466769469
+13
+50.810813757549504
+23
+-113.83956259688821
+33
+281.3910466769469
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.810813757549504
+20
+-113.83956259688821
+30
+281.3910466769469
+11
+47.518254754152196
+21
+-117.68343691849817
+31
+279.78778449452483
+12
+53.91469283579742
+22
+-116.92652680277529
+32
+282.2550437543797
+13
+53.91469283579742
+23
+-116.92652680277529
+33
+282.2550437543797
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.9135920806513
+20
+-136.2219544915914
+30
+298.15106885753744
+11
+17.88132965224154
+21
+-127.31913390214885
+31
+298.2608938381575
+12
+17.188610868679472
+22
+-130.1411187226701
+32
+306.19354306142446
+13
+17.188610868679472
+23
+-130.1411187226701
+33
+306.19354306142446
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.88132965224154
+20
+-127.31913390214885
+30
+298.2608938381575
+11
+17.769983550008906
+21
+-121.30614015726538
+31
+306.35964954180685
+12
+17.188610868679472
+22
+-130.1411187226701
+32
+306.19354306142446
+13
+17.188610868679472
+23
+-130.1411187226701
+33
+306.19354306142446
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.88132965224154
+20
+-127.31913390214885
+30
+298.2608938381575
+11
+18.7024311001265
+21
+-119.86442109037688
+31
+298.75556258742245
+12
+17.769983550008906
+22
+-121.30614015726538
+32
+306.35964954180685
+13
+17.769983550008906
+23
+-121.30614015726538
+33
+306.35964954180685
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.07484562203002
+20
+-141.67152479020677
+30
+297.85475436689535
+11
+16.816848745924577
+21
+-137.8133519254159
+31
+306.4597393440825
+12
+14.767289481604097
+22
+-141.62741226336811
+32
+306.05329564850035
+13
+14.767289481604097
+23
+-141.62741226336811
+33
+306.05329564850035
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.07484562203002
+20
+-141.67152479020677
+30
+297.85475436689535
+11
+16.9135920806513
+21
+-136.2219544915914
+31
+298.15106885753744
+12
+16.816848745924577
+22
+-137.8133519254159
+32
+306.4597393440825
+13
+16.816848745924577
+23
+-137.8133519254159
+33
+306.4597393440825
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+20.39361411190586
+20
+-96.79965403909883
+30
+296.93903915455655
+11
+19.337651486634016
+21
+-97.26633415064434
+31
+305.3435403028595
+12
+18.236967885875295
+22
+-106.93519158550106
+32
+302.94777375891704
+13
+18.236967885875295
+23
+-106.93519158550106
+33
+302.94777375891704
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+20.407608430765702
+20
+-108.25369980155446
+30
+295.7124066840563
+11
+20.39361411190586
+21
+-96.79965403909883
+31
+296.93903915455655
+12
+18.236967885875295
+22
+-106.93519158550106
+32
+302.94777375891704
+13
+18.236967885875295
+23
+-106.93519158550106
+33
+302.94777375891704
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.61103195170681
+20
+-94.5048899704129
+30
+315.29350101220615
+11
+35.918789765283115
+21
+-96.52767749430639
+31
+317.50034425153785
+12
+30.71624961697607
+22
+-102.16799644346871
+32
+320.4917820199886
+13
+30.71624961697607
+23
+-102.16799644346871
+33
+320.4917820199886
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.61103195170681
+20
+-94.5048899704129
+30
+315.29350101220615
+11
+30.71624961697607
+21
+-102.16799644346871
+31
+320.4917820199886
+12
+23.648205919787763
+22
+-104.40069875025834
+32
+316.95091512412546
+13
+23.648205919787763
+23
+-104.40069875025834
+33
+316.95091512412546
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.918789765283115
+20
+-96.52767749430639
+30
+317.50034425153785
+11
+40.70667216128662
+21
+-98.97120725696395
+31
+318.6910782519159
+12
+37.729837160340246
+22
+-105.30850413021089
+32
+321.4053676620772
+13
+37.729837160340246
+23
+-105.30850413021089
+33
+321.4053676620772
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.918789765283115
+20
+-96.52767749430639
+30
+317.50034425153785
+11
+37.729837160340246
+21
+-105.30850413021089
+31
+321.4053676620772
+12
+30.71624961697607
+22
+-102.16799644346871
+32
+320.4917820199886
+13
+30.71624961697607
+23
+-102.16799644346871
+33
+320.4917820199886
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.61103195170681
+20
+-94.5048899704129
+30
+315.29350101220615
+11
+23.648205919787763
+21
+-104.40069875025834
+31
+316.95091512412546
+12
+22.074149272378815
+22
+-96.32536831948337
+32
+312.13261029582026
+13
+22.074149272378815
+23
+-96.32536831948337
+33
+312.13261029582026
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.074149272378815
+20
+-96.32536831948337
+30
+312.13261029582026
+11
+23.648205919787763
+21
+-104.40069875025834
+31
+316.95091512412546
+12
+20.045277262025056
+22
+-105.14118075253657
+32
+312.41584314056826
+13
+20.045277262025056
+23
+-105.14118075253657
+33
+312.41584314056826
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.337651486634016
+20
+-97.26633415064434
+30
+305.3435403028595
+11
+22.074149272378815
+21
+-96.32536831948337
+31
+312.13261029582026
+12
+20.045277262025056
+22
+-105.14118075253657
+32
+312.41584314056826
+13
+20.045277262025056
+23
+-105.14118075253657
+33
+312.41584314056826
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.236967885875295
+20
+-106.93519158550106
+30
+302.94777375891704
+11
+19.337651486634016
+21
+-97.26633415064434
+31
+305.3435403028595
+12
+20.045277262025056
+22
+-105.14118075253657
+32
+312.41584314056826
+13
+20.045277262025056
+23
+-105.14118075253657
+33
+312.41584314056826
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.017530818763404
+20
+-115.23625646397582
+30
+323.8884465867271
+11
+52.247756502564336
+21
+-116.22954887870125
+31
+323.32076399993423
+12
+45.58734297581733
+22
+-119.51821381076408
+32
+325.067315838506
+13
+45.58734297581733
+23
+-119.51821381076408
+33
+325.067315838506
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+48.11444316001369
+20
+-112.05254892336194
+30
+322.6143551218364
+11
+52.247756502564336
+21
+-116.22954887870125
+31
+323.32076399993423
+12
+45.017530818763404
+22
+-115.23625646397582
+32
+323.8884465867271
+13
+45.017530818763404
+23
+-115.23625646397582
+33
+323.8884465867271
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.7024311001265
+20
+-119.86442109037688
+30
+298.75556258742245
+11
+19.116480403783935
+21
+-112.99108095993422
+31
+299.066175621248
+12
+18.393947636563947
+22
+-113.98376492601537
+32
+305.4208132809073
+13
+18.393947636563947
+23
+-113.98376492601537
+33
+305.4208132809073
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.7024311001265
+20
+-119.86442109037688
+30
+298.75556258742245
+11
+18.393947636563947
+21
+-113.98376492601537
+31
+305.4208132809073
+12
+17.769983550008906
+22
+-121.30614015726538
+32
+306.35964954180685
+13
+17.769983550008906
+23
+-121.30614015726538
+33
+306.35964954180685
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+20.407608430765702
+20
+-108.25369980155446
+30
+295.7124066840563
+11
+18.236967885875295
+21
+-106.93519158550106
+31
+302.94777375891704
+12
+19.116480403783935
+22
+-112.99108095993422
+32
+299.066175621248
+13
+19.116480403783935
+23
+-112.99108095993422
+33
+299.066175621248
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.116480403783935
+20
+-112.99108095993422
+30
+299.066175621248
+11
+18.236967885875295
+21
+-106.93519158550106
+31
+302.94777375891704
+12
+18.393947636563947
+22
+-113.98376492601537
+32
+305.4208132809073
+13
+18.393947636563947
+23
+-113.98376492601537
+33
+305.4208132809073
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.393947636563947
+20
+-113.98376492601537
+30
+305.4208132809073
+11
+20.572802238176426
+21
+-115.27945631784485
+31
+313.55759702493475
+12
+17.769983550008906
+22
+-121.30614015726538
+32
+306.35964954180685
+13
+17.769983550008906
+23
+-121.30614015726538
+33
+306.35964954180685
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.769983550008906
+20
+-121.30614015726538
+30
+306.35964954180685
+11
+20.572802238176426
+21
+-115.27945631784485
+31
+313.55759702493475
+12
+20.528993935658658
+22
+-124.49593218434188
+32
+314.12254159281747
+13
+20.528993935658658
+23
+-124.49593218434188
+33
+314.12254159281747
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.236967885875295
+20
+-106.93519158550106
+30
+302.94777375891704
+11
+20.045277262025056
+21
+-105.14118075253657
+31
+312.41584314056826
+12
+18.393947636563947
+22
+-113.98376492601537
+32
+305.4208132809073
+13
+18.393947636563947
+23
+-113.98376492601537
+33
+305.4208132809073
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.393947636563947
+20
+-113.98376492601537
+30
+305.4208132809073
+11
+20.045277262025056
+21
+-105.14118075253657
+31
+312.41584314056826
+12
+20.572802238176426
+22
+-115.27945631784485
+32
+313.55759702493475
+13
+20.572802238176426
+23
+-115.27945631784485
+33
+313.55759702493475
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+20.572802238176426
+20
+-115.27945631784485
+30
+313.55759702493475
+11
+24.01479622905097
+21
+-115.26333242872501
+31
+318.59524759015414
+12
+20.528993935658658
+22
+-124.49593218434188
+32
+314.12254159281747
+13
+20.528993935658658
+23
+-124.49593218434188
+33
+314.12254159281747
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+20.528993935658658
+20
+-124.49593218434188
+30
+314.12254159281747
+11
+24.01479622905097
+21
+-115.26333242872501
+31
+318.59524759015414
+12
+24.10515085299385
+22
+-125.79375314643185
+32
+319.8818122522876
+13
+24.10515085299385
+23
+-125.79375314643185
+33
+319.8818122522876
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+20.045277262025056
+20
+-105.14118075253657
+30
+312.41584314056826
+11
+23.648205919787763
+21
+-104.40069875025834
+31
+316.95091512412546
+12
+20.572802238176426
+22
+-115.27945631784485
+32
+313.55759702493475
+13
+20.572802238176426
+23
+-115.27945631784485
+33
+313.55759702493475
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+20.572802238176426
+20
+-115.27945631784485
+30
+313.55759702493475
+11
+23.648205919787763
+21
+-104.40069875025834
+31
+316.95091512412546
+12
+24.01479622905097
+22
+-115.26333242872501
+32
+318.59524759015414
+13
+24.01479622905097
+23
+-115.26333242872501
+33
+318.59524759015414
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+24.01479622905097
+20
+-115.26333242872501
+30
+318.59524759015414
+11
+29.566585900207915
+21
+-117.66487923480379
+31
+322.5422539572742
+12
+24.10515085299385
+22
+-125.79375314643185
+32
+319.8818122522876
+13
+24.10515085299385
+23
+-125.79375314643185
+33
+319.8818122522876
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.566585900207915
+20
+-117.66487923480379
+30
+322.5422539572742
+11
+27.324756863726183
+21
+-126.90690994443615
+31
+323.3755243780785
+12
+24.10515085299385
+22
+-125.79375314643185
+32
+319.8818122522876
+13
+24.10515085299385
+23
+-125.79375314643185
+33
+319.8818122522876
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.71624961697607
+20
+-102.16799644346871
+30
+320.4917820199886
+11
+24.01479622905097
+21
+-115.26333242872501
+31
+318.59524759015414
+12
+23.648205919787763
+22
+-104.40069875025834
+32
+316.95091512412546
+13
+23.648205919787763
+23
+-104.40069875025834
+33
+316.95091512412546
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.71624961697607
+20
+-102.16799644346871
+30
+320.4917820199886
+11
+29.566585900207915
+21
+-117.66487923480379
+31
+322.5422539572742
+12
+24.01479622905097
+22
+-115.26333242872501
+32
+318.59524759015414
+13
+24.01479622905097
+23
+-115.26333242872501
+33
+318.59524759015414
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.71624961697607
+20
+-102.16799644346871
+30
+320.4917820199886
+11
+37.729837160340246
+21
+-105.30850413021089
+31
+321.4053676620772
+12
+38.82291515302294
+22
+-116.21707568145683
+32
+324.1211781938524
+13
+38.82291515302294
+23
+-116.21707568145683
+33
+324.1211781938524
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.71624961697607
+20
+-102.16799644346871
+30
+320.4917820199886
+11
+38.82291515302294
+21
+-116.21707568145683
+31
+324.1211781938524
+12
+29.566585900207915
+22
+-117.66487923480379
+32
+322.5422539572742
+13
+29.566585900207915
+23
+-117.66487923480379
+33
+322.5422539572742
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+48.11444316001369
+20
+-112.05254892336194
+30
+322.6143551218364
+11
+45.017530818763404
+21
+-115.23625646397582
+31
+323.8884465867271
+12
+38.82291515302294
+22
+-116.21707568145683
+32
+324.1211781938524
+13
+38.82291515302294
+23
+-116.21707568145683
+33
+324.1211781938524
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.729837160340246
+20
+-105.30850413021089
+30
+321.4053676620772
+11
+48.11444316001369
+21
+-112.05254892336194
+31
+322.6143551218364
+12
+38.82291515302294
+22
+-116.21707568145683
+32
+324.1211781938524
+13
+38.82291515302294
+23
+-116.21707568145683
+33
+324.1211781938524
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.82291515302294
+20
+-116.21707568145683
+30
+324.1211781938524
+11
+45.58734297581733
+21
+-119.51821381076408
+31
+325.067315838506
+12
+39.759926067986136
+22
+-123.44240335365751
+32
+326.7642791124219
+13
+39.759926067986136
+23
+-123.44240335365751
+33
+326.7642791124219
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.017530818763404
+20
+-115.23625646397582
+30
+323.8884465867271
+11
+45.58734297581733
+21
+-119.51821381076408
+31
+325.067315838506
+12
+38.82291515302294
+22
+-116.21707568145683
+32
+324.1211781938524
+13
+38.82291515302294
+23
+-116.21707568145683
+33
+324.1211781938524
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.566585900207915
+20
+-117.66487923480379
+30
+322.5422539572742
+11
+33.54279780234073
+21
+-125.48861615042436
+31
+326.20663592828924
+12
+27.324756863726183
+22
+-126.90690994443615
+32
+323.3755243780785
+13
+27.324756863726183
+23
+-126.90690994443615
+33
+323.3755243780785
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.82291515302294
+20
+-116.21707568145683
+30
+324.1211781938524
+11
+39.759926067986136
+21
+-123.44240335365751
+31
+326.7642791124219
+12
+29.566585900207915
+22
+-117.66487923480379
+32
+322.5422539572742
+13
+29.566585900207915
+23
+-117.66487923480379
+33
+322.5422539572742
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.566585900207915
+20
+-117.66487923480379
+30
+322.5422539572742
+11
+39.759926067986136
+21
+-123.44240335365751
+31
+326.7642791124219
+12
+33.54279780234073
+22
+-125.48861615042436
+32
+326.20663592828924
+13
+33.54279780234073
+23
+-125.48861615042436
+33
+326.20663592828924
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+58.602607119249974
+20
+-119.36853544381859
+30
+286.90906744824497
+11
+60.41794407726195
+21
+-117.46926299508148
+31
+293.08056206543495
+12
+55.44244654123968
+22
+-113.69657716506089
+32
+287.0843006583175
+13
+55.44244654123968
+23
+-113.69657716506089
+33
+287.0843006583175
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+55.44244654123968
+20
+-113.69657716506089
+30
+287.0843006583175
+11
+60.41794407726195
+21
+-117.46926299508148
+31
+293.08056206543495
+12
+57.04309239448233
+22
+-112.6077583129028
+32
+295.23568716985153
+13
+57.04309239448233
+23
+-112.6077583129028
+33
+295.23568716985153
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+56.4002359774665
+20
+-123.41319781863416
+30
+281.6392937245451
+11
+55.44244654123968
+21
+-113.69657716506089
+31
+287.0843006583175
+12
+53.91469283579742
+22
+-116.92652680277529
+32
+282.2550437543797
+13
+53.91469283579742
+23
+-116.92652680277529
+33
+282.2550437543797
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+56.4002359774665
+20
+-123.41319781863416
+30
+281.6392937245451
+11
+58.602607119249974
+21
+-119.36853544381859
+31
+286.90906744824497
+12
+55.44244654123968
+22
+-113.69657716506089
+32
+287.0843006583175
+13
+55.44244654123968
+23
+-113.69657716506089
+33
+287.0843006583175
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.73038694541307
+20
+-124.09344340495674
+30
+302.08286400850983
+11
+65.0044908162776
+21
+-121.83396935773986
+31
+306.71954691596306
+12
+64.85405188853431
+22
+-122.58662033293868
+32
+298.4498171427665
+13
+64.85405188853431
+23
+-122.58662033293868
+33
+298.4498171427665
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.73038694541307
+20
+-124.09344340495674
+30
+302.08286400850983
+11
+64.85405188853431
+21
+-122.58662033293868
+31
+298.4498171427665
+12
+68.71094701117082
+22
+-124.41014092524011
+32
+297.21679596148493
+13
+68.71094701117082
+23
+-124.41014092524011
+33
+297.21679596148493
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.71094701117082
+20
+-124.41014092524011
+30
+297.21679596148493
+11
+64.85405188853431
+21
+-122.58662033293868
+31
+298.4498171427665
+12
+63.89124275097733
+22
+-124.37241710918181
+32
+292.03646418875985
+13
+63.89124275097733
+23
+-124.37241710918181
+33
+292.03646418875985
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.71094701117082
+20
+-124.41014092524011
+30
+297.21679596148493
+11
+63.89124275097733
+21
+-124.37241710918181
+31
+292.03646418875985
+12
+67.34993865718677
+22
+-126.15578009084169
+32
+289.76482116861973
+13
+67.34993865718677
+23
+-126.15578009084169
+33
+289.76482116861973
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+52.247756502564336
+20
+-116.22954887870125
+30
+323.32076399993423
+11
+54.445533857069904
+21
+-121.97786746254229
+31
+324.1488626072476
+12
+46.61440429040041
+22
+-126.62945736182454
+32
+326.32011160078287
+13
+46.61440429040041
+23
+-126.62945736182454
+33
+326.32011160078287
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+52.247756502564336
+20
+-116.22954887870125
+30
+323.32076399993423
+11
+46.61440429040041
+21
+-126.62945736182454
+31
+326.32011160078287
+12
+45.58734297581733
+22
+-119.51821381076408
+32
+325.067315838506
+13
+45.58734297581733
+23
+-119.51821381076408
+33
+325.067315838506
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+54.445533857069904
+20
+-121.97786746254229
+30
+324.1488626072476
+11
+56.50601477458751
+21
+-133.31417841198095
+31
+321.0503378770823
+12
+47.85259728517316
+22
+-138.64418855164251
+32
+324.0046602781223
+13
+47.85259728517316
+23
+-138.64418855164251
+33
+324.0046602781223
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+54.445533857069904
+20
+-121.97786746254229
+30
+324.1488626072476
+11
+47.85259728517316
+21
+-138.64418855164251
+31
+324.0046602781223
+12
+46.61440429040041
+22
+-126.62945736182454
+32
+326.32011160078287
+13
+46.61440429040041
+23
+-126.62945736182454
+33
+326.32011160078287
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+46.61440429040041
+20
+-126.62945736182454
+30
+326.32011160078287
+11
+47.85259728517316
+21
+-138.64418855164251
+31
+324.0046602781223
+12
+40.73800726655977
+22
+-142.32469441178074
+32
+325.3310783265758
+13
+40.73800726655977
+23
+-142.32469441178074
+33
+325.3310783265758
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+46.61440429040041
+20
+-126.62945736182454
+30
+326.32011160078287
+11
+40.73800726655977
+21
+-142.32469441178074
+31
+325.3310783265758
+12
+39.20623780005334
+22
+-130.79733058747274
+32
+327.6200621331316
+13
+39.20623780005334
+23
+-130.79733058747274
+33
+327.6200621331316
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.58734297581733
+20
+-119.51821381076408
+30
+325.067315838506
+11
+46.61440429040041
+21
+-126.62945736182454
+31
+326.32011160078287
+12
+39.20623780005334
+22
+-130.79733058747274
+32
+327.6200621331316
+13
+39.20623780005334
+23
+-130.79733058747274
+33
+327.6200621331316
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.58734297581733
+20
+-119.51821381076408
+30
+325.067315838506
+11
+39.20623780005334
+21
+-130.79733058747274
+31
+327.6200621331316
+12
+39.759926067986136
+22
+-123.44240335365751
+32
+326.7642791124219
+13
+39.759926067986136
+23
+-123.44240335365751
+33
+326.7642791124219
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.759926067986136
+20
+-123.44240335365751
+30
+326.7642791124219
+11
+39.20623780005334
+21
+-130.79733058747274
+31
+327.6200621331316
+12
+32.55011383626119
+22
+-132.89739108941768
+32
+326.85828442823896
+13
+32.55011383626119
+23
+-132.89739108941768
+33
+326.85828442823896
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.759926067986136
+20
+-123.44240335365751
+30
+326.7642791124219
+11
+32.55011383626119
+21
+-132.89739108941768
+31
+326.85828442823896
+12
+33.54279780234073
+22
+-125.48861615042436
+32
+326.20663592828924
+13
+33.54279780234073
+23
+-125.48861615042436
+33
+326.20663592828924
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.20623780005334
+20
+-130.79733058747274
+30
+327.6200621331316
+11
+40.73800726655977
+21
+-142.32469441178074
+31
+325.3310783265758
+12
+34.15428869165113
+22
+-143.4688820907345
+32
+326.4980828297569
+13
+34.15428869165113
+23
+-143.4688820907345
+33
+326.4980828297569
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.20623780005334
+20
+-130.79733058747274
+30
+327.6200621331316
+11
+34.15428869165113
+21
+-143.4688820907345
+31
+326.4980828297569
+12
+32.55011383626119
+22
+-132.89739108941768
+32
+326.85828442823896
+13
+32.55011383626119
+23
+-132.89739108941768
+33
+326.85828442823896
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.55011383626119
+20
+-132.89739108941768
+30
+326.85828442823896
+11
+34.15428869165113
+21
+-143.4688820907345
+31
+326.4980828297569
+12
+26.61773953698122
+22
+-143.88992855382136
+32
+324.096231799356
+13
+26.61773953698122
+23
+-143.88992855382136
+33
+324.096231799356
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.55011383626119
+20
+-132.89739108941768
+30
+326.85828442823896
+11
+26.61773953698122
+21
+-143.88992855382136
+31
+324.096231799356
+12
+27.106323799783436
+22
+-135.44618246784603
+32
+323.87232269760085
+13
+27.106323799783436
+23
+-135.44618246784603
+33
+323.87232269760085
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.54279780234073
+20
+-125.48861615042436
+30
+326.20663592828924
+11
+32.55011383626119
+21
+-132.89739108941768
+31
+326.85828442823896
+12
+27.106323799783436
+22
+-135.44618246784603
+32
+323.87232269760085
+13
+27.106323799783436
+23
+-135.44618246784603
+33
+323.87232269760085
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.54279780234073
+20
+-125.48861615042436
+30
+326.20663592828924
+11
+27.106323799783436
+21
+-135.44618246784603
+31
+323.87232269760085
+12
+27.324756863726183
+22
+-126.90690994443615
+32
+323.3755243780785
+13
+27.324756863726183
+23
+-126.90690994443615
+33
+323.3755243780785
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+56.50601477458751
+20
+-133.31417841198095
+30
+321.0503378770823
+11
+49.569669786843214
+21
+-139.79385226841072
+31
+324.080107910236
+12
+47.85259728517316
+22
+-138.64418855164251
+32
+324.0046602781223
+13
+47.85259728517316
+23
+-138.64418855164251
+33
+324.0046602781223
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+56.50601477458751
+20
+-133.31417841198095
+30
+321.0503378770823
+11
+58.78833606846589
+21
+-135.79604043934114
+31
+320.41572593922024
+12
+49.569669786843214
+22
+-139.79385226841072
+32
+324.080107910236
+13
+49.569669786843214
+23
+-139.79385226841072
+33
+324.080107910236
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.85259728517316
+20
+-138.64418855164251
+30
+324.0046602781223
+11
+40.64369772641734
+21
+-143.61034640094823
+31
+326.9811910547444
+12
+40.73800726655977
+22
+-142.32469441178074
+32
+325.3310783265758
+13
+40.73800726655977
+23
+-142.32469441178074
+33
+325.3310783265758
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.85259728517316
+20
+-138.64418855164251
+30
+324.0046602781223
+11
+49.569669786843214
+21
+-139.79385226841072
+31
+324.080107910236
+12
+40.64369772641734
+22
+-143.61034640094823
+32
+326.9811910547444
+13
+40.64369772641734
+23
+-143.61034640094823
+33
+326.9811910547444
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.73800726655977
+20
+-142.32469441178074
+30
+325.3310783265758
+11
+33.95045839521433
+21
+-145.81353894840413
+31
+327.8281515700872
+12
+34.15428869165113
+22
+-143.4688820907345
+32
+326.4980828297569
+13
+34.15428869165113
+23
+-143.4688820907345
+33
+326.4980828297569
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.73800726655977
+20
+-142.32469441178074
+30
+325.3310783265758
+11
+40.64369772641734
+21
+-143.61034640094823
+31
+326.9811910547444
+12
+33.95045839521433
+22
+-145.81353894840413
+32
+327.8281515700872
+13
+33.95045839521433
+23
+-145.81353894840413
+33
+327.8281515700872
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.15428869165113
+20
+-143.4688820907345
+30
+326.4980828297569
+11
+26.087780766245533
+21
+-145.86495285899713
+31
+324.8945164230125
+12
+26.61773953698122
+22
+-143.88992855382136
+32
+324.096231799356
+13
+26.61773953698122
+23
+-143.88992855382136
+33
+324.096231799356
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.15428869165113
+20
+-143.4688820907345
+30
+326.4980828297569
+11
+33.95045839521433
+21
+-145.81353894840413
+31
+327.8281515700872
+12
+26.087780766245533
+22
+-145.86495285899713
+32
+324.8945164230125
+13
+26.087780766245533
+23
+-145.86495285899713
+33
+324.8945164230125
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.61773953698122
+20
+-143.88992855382136
+30
+324.096231799356
+11
+26.087780766245533
+21
+-145.86495285899713
+31
+324.8945164230125
+12
+22.65795574829258
+22
+-145.41987267438878
+32
+321.811202909002
+13
+22.65795574829258
+23
+-145.41987267438878
+33
+321.811202909002
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+24.071381953136406
+20
+-142.819667385366
+30
+321.76861150377727
+11
+26.61773953698122
+21
+-143.88992855382136
+31
+324.096231799356
+12
+22.65795574829258
+22
+-145.41987267438878
+32
+321.811202909002
+13
+22.65795574829258
+23
+-145.41987267438878
+33
+321.811202909002
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.324756863726183
+20
+-126.90690994443615
+30
+323.3755243780785
+11
+27.106323799783436
+21
+-135.44618246784603
+31
+323.87232269760085
+12
+23.524082395987453
+22
+-134.11854752209862
+32
+320.5949140654912
+13
+23.524082395987453
+23
+-134.11854752209862
+33
+320.5949140654912
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+24.10515085299385
+20
+-125.79375314643185
+30
+319.8818122522876
+11
+27.324756863726183
+21
+-126.90690994443615
+31
+323.3755243780785
+12
+23.524082395987453
+22
+-134.11854752209862
+32
+320.5949140654912
+13
+23.524082395987453
+23
+-134.11854752209862
+33
+320.5949140654912
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.106323799783436
+20
+-135.44618246784603
+30
+323.87232269760085
+11
+26.61773953698122
+21
+-143.88992855382136
+31
+324.096231799356
+12
+24.071381953136406
+22
+-142.819667385366
+32
+321.76861150377727
+13
+24.071381953136406
+23
+-142.819667385366
+33
+321.76861150377727
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+23.524082395987453
+20
+-134.11854752209862
+30
+320.5949140654912
+11
+27.106323799783436
+21
+-135.44618246784603
+31
+323.87232269760085
+12
+24.071381953136406
+22
+-142.819667385366
+32
+321.76861150377727
+13
+24.071381953136406
+23
+-142.819667385366
+33
+321.76861150377727
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.376911074473693
+20
+-139.3630706269836
+30
+314.53476555053334
+11
+23.524082395987453
+21
+-134.11854752209862
+31
+320.5949140654912
+12
+24.071381953136406
+22
+-142.819667385366
+32
+321.76861150377727
+13
+24.071381953136406
+23
+-142.819667385366
+33
+321.76861150377727
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.54756626953161
+20
+-132.24209189758616
+30
+313.9065423234573
+11
+23.524082395987453
+21
+-134.11854752209862
+31
+320.5949140654912
+12
+18.376911074473693
+22
+-139.3630706269836
+32
+314.53476555053334
+13
+18.376911074473693
+23
+-139.3630706269836
+33
+314.53476555053334
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.54756626953161
+20
+-132.24209189758616
+30
+313.9065423234573
+11
+24.10515085299385
+21
+-125.79375314643185
+31
+319.8818122522876
+12
+23.524082395987453
+22
+-134.11854752209862
+32
+320.5949140654912
+13
+23.524082395987453
+23
+-134.11854752209862
+33
+320.5949140654912
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.54756626953161
+20
+-132.24209189758616
+30
+313.9065423234573
+11
+20.528993935658658
+21
+-124.49593218434188
+31
+314.12254159281747
+12
+24.10515085299385
+22
+-125.79375314643185
+32
+319.8818122522876
+13
+24.10515085299385
+23
+-125.79375314643185
+33
+319.8818122522876
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.610570004735937
+20
+-142.80415194488927
+30
+315.52501572202743
+11
+24.071381953136406
+21
+-142.819667385366
+31
+321.76861150377727
+12
+22.65795574829258
+22
+-145.41987267438878
+32
+321.811202909002
+13
+22.65795574829258
+23
+-145.41987267438878
+33
+321.811202909002
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.376911074473693
+20
+-139.3630706269836
+30
+314.53476555053334
+11
+24.071381953136406
+21
+-142.819667385366
+31
+321.76861150377727
+12
+17.610570004735937
+22
+-142.80415194488927
+32
+315.52501572202743
+13
+17.610570004735937
+23
+-142.80415194488927
+33
+315.52501572202743
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.767289481604097
+20
+-141.62741226336811
+30
+306.05329564850035
+11
+18.376911074473693
+21
+-139.3630706269836
+31
+314.53476555053334
+12
+17.610570004735937
+22
+-142.80415194488927
+32
+315.52501572202743
+13
+17.610570004735937
+23
+-142.80415194488927
+33
+315.52501572202743
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.767289481604097
+20
+-141.62741226336811
+30
+306.05329564850035
+11
+16.816848745924577
+21
+-137.8133519254159
+31
+306.4597393440825
+12
+18.376911074473693
+22
+-139.3630706269836
+32
+314.53476555053334
+13
+18.376911074473693
+23
+-139.3630706269836
+33
+314.53476555053334
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.188610868679472
+20
+-130.1411187226701
+30
+306.19354306142446
+11
+20.528993935658658
+21
+-124.49593218434188
+31
+314.12254159281747
+12
+19.54756626953161
+22
+-132.24209189758616
+32
+313.9065423234573
+13
+19.54756626953161
+23
+-132.24209189758616
+33
+313.9065423234573
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.188610868679472
+20
+-130.1411187226701
+30
+306.19354306142446
+11
+17.769983550008906
+21
+-121.30614015726538
+31
+306.35964954180685
+12
+20.528993935658658
+22
+-124.49593218434188
+32
+314.12254159281747
+13
+20.528993935658658
+23
+-124.49593218434188
+33
+314.12254159281747
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.816848745924577
+20
+-137.8133519254159
+30
+306.4597393440825
+11
+19.54756626953161
+21
+-132.24209189758616
+31
+313.9065423234573
+12
+18.376911074473693
+22
+-139.3630706269836
+32
+314.53476555053334
+13
+18.376911074473693
+23
+-139.3630706269836
+33
+314.53476555053334
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.188610868679472
+20
+-130.1411187226701
+30
+306.19354306142446
+11
+19.54756626953161
+21
+-132.24209189758616
+31
+313.9065423234573
+12
+16.816848745924577
+22
+-137.8133519254159
+32
+306.4597393440825
+13
+16.816848745924577
+23
+-137.8133519254159
+33
+306.4597393440825
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.9135920806513
+20
+-136.2219544915914
+30
+298.15106885753744
+11
+17.188610868679472
+21
+-130.1411187226701
+31
+306.19354306142446
+12
+16.816848745924577
+22
+-137.8133519254159
+32
+306.4597393440825
+13
+16.816848745924577
+23
+-137.8133519254159
+33
+306.4597393440825
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+22.350714752458487
+30
+403.9472067649992
+11
+0.020623870886214313
+21
+-4.192857432783509
+31
+412.01462736336754
+12
+12.484390161511953
+22
+-3.00181920808168
+32
+411.0614925592837
+13
+12.484390161511953
+23
+-3.00181920808168
+33
+411.0614925592837
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.16904575260993
+20
+-0.23642011164273047
+30
+390.23125316073487
+11
+48.474948982816116
+21
+-1.4204611769168638
+31
+399.6987140937399
+12
+57.751630842842516
+22
+-21.461238457175828
+32
+396.5889330636198
+13
+57.751630842842516
+23
+-21.461238457175828
+33
+396.5889330636198
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+48.474948982816116
+20
+-1.4204611769168638
+30
+399.6987140937399
+11
+46.38988673999685
+21
+-21.686364456227
+31
+402.62352673544115
+12
+57.751630842842516
+22
+-21.461238457175828
+32
+396.5889330636198
+13
+57.751630842842516
+23
+-21.461238457175828
+33
+396.5889330636198
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.942826915998193
+20
+44.49885391841957
+30
+391.36053384787147
+11
+36.944938406897045
+21
+21.200442587045607
+31
+398.76413697336693
+12
+37.7745581358271
+22
+37.30121065961662
+32
+390.7347444153764
+13
+37.7745581358271
+23
+37.30121065961662
+33
+390.7347444153764
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.942826915998193
+20
+44.49885391841957
+30
+391.36053384787147
+11
+13.957140109348584
+21
+23.883396891934023
+31
+402.69349832975223
+12
+36.944938406897045
+22
+21.200442587045607
+32
+398.76413697336693
+13
+36.944938406897045
+23
+21.200442587045607
+33
+398.76413697336693
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.90445070079258
+20
+62.637316506714946
+30
+374.37264764932246
+11
+37.7745581358271
+21
+37.30121065961662
+31
+390.7347444153764
+12
+36.14939180214743
+22
+50.75948626226252
+32
+381.33177903885945
+13
+36.14939180214743
+23
+50.75948626226252
+33
+381.33177903885945
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.90445070079258
+20
+62.637316506714946
+30
+374.37264764932246
+11
+14.942826915998193
+21
+44.49885391841957
+31
+391.36053384787147
+12
+37.7745581358271
+22
+37.30121065961662
+32
+390.7347444153764
+13
+37.7745581358271
+23
+37.30121065961662
+33
+390.7347444153764
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+48.4543785665867
+30
+389.1728567408918
+11
+13.957140109348584
+21
+23.883396891934023
+31
+402.69349832975223
+12
+14.942826915998193
+22
+44.49885391841957
+32
+391.36053384787147
+13
+14.942826915998193
+23
+44.49885391841957
+33
+391.36053384787147
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+48.4543785665867
+30
+389.1728567408918
+11
+0.020623870886214313
+21
+22.350714752458487
+31
+403.9472067649992
+12
+13.957140109348584
+22
+23.883396891934023
+32
+402.69349832975223
+13
+13.957140109348584
+23
+23.883396891934023
+33
+402.69349832975223
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+64.50555807450392
+30
+373.276831637733
+11
+14.942826915998193
+21
+44.49885391841957
+31
+391.36053384787147
+12
+17.90445070079258
+22
+62.637316506714946
+32
+374.37264764932246
+13
+17.90445070079258
+23
+62.637316506714946
+33
+374.37264764932246
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+64.50555807450392
+30
+373.276831637733
+11
+0.020623870886214313
+21
+48.4543785665867
+31
+389.1728567408918
+12
+14.942826915998193
+22
+44.49885391841957
+32
+391.36053384787147
+13
+14.942826915998193
+23
+44.49885391841957
+33
+391.36053384787147
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.14939180214743
+20
+50.75948626226252
+30
+381.33177903885945
+11
+55.01467672061313
+21
+35.66661337192453
+31
+384.2660226345763
+12
+51.46516985397624
+22
+49.05552582891695
+32
+375.795200583854
+13
+51.46516985397624
+23
+49.05552582891695
+33
+375.795200583854
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.14939180214743
+20
+50.75948626226252
+30
+381.33177903885945
+11
+37.7745581358271
+21
+37.30121065961662
+31
+390.7347444153764
+12
+55.01467672061313
+22
+35.66661337192453
+32
+384.2660226345763
+13
+55.01467672061313
+23
+35.66661337192453
+33
+384.2660226345763
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.944938406897045
+20
+21.200442587045607
+30
+398.76413697336693
+11
+32.892366199681184
+21
+-0.22546803601725074
+31
+405.5909307823789
+12
+48.474948982816116
+22
+-1.4204611769168638
+32
+399.6987140937399
+13
+48.474948982816116
+23
+-1.4204611769168638
+33
+399.6987140937399
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.944938406897045
+20
+21.200442587045607
+30
+398.76413697336693
+11
+48.474948982816116
+21
+-1.4204611769168638
+31
+399.6987140937399
+12
+52.583559310335886
+22
+16.54428932291966
+32
+394.2345410276232
+13
+52.583559310335886
+23
+16.54428932291966
+33
+394.2345410276232
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.20757856836609
+20
+17.629761707529237
+30
+382.78992621918167
+11
+52.583559310335886
+21
+16.54428932291966
+31
+394.2345410276232
+12
+48.474948982816116
+22
+-1.4204611769168638
+32
+399.6987140937399
+13
+48.474948982816116
+23
+-1.4204611769168638
+33
+399.6987140937399
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.20757856836609
+20
+17.629761707529237
+30
+382.78992621918167
+11
+48.474948982816116
+21
+-1.4204611769168638
+31
+399.6987140937399
+12
+65.16904575260993
+22
+-0.23642011164273047
+32
+390.23125316073487
+13
+65.16904575260993
+23
+-0.23642011164273047
+33
+390.23125316073487
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+55.01467672061313
+20
+35.66661337192453
+30
+384.2660226345763
+11
+36.944938406897045
+21
+21.200442587045607
+31
+398.76413697336693
+12
+52.583559310335886
+22
+16.54428932291966
+32
+394.2345410276232
+13
+52.583559310335886
+23
+16.54428932291966
+33
+394.2345410276232
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.7745581358271
+20
+37.30121065961662
+30
+390.7347444153764
+11
+36.944938406897045
+21
+21.200442587045607
+31
+398.76413697336693
+12
+55.01467672061313
+22
+35.66661337192453
+32
+384.2660226345763
+13
+55.01467672061313
+23
+35.66661337192453
+33
+384.2660226345763
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+55.01467672061313
+20
+35.66661337192453
+30
+384.2660226345763
+11
+52.583559310335886
+21
+16.54428932291966
+31
+394.2345410276232
+12
+68.40556663570327
+22
+34.8747174590534
+32
+375.73770218679584
+13
+68.40556663570327
+23
+34.8747174590534
+33
+375.73770218679584
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.40556663570327
+20
+34.8747174590534
+30
+375.73770218679584
+11
+52.583559310335886
+21
+16.54428932291966
+31
+394.2345410276232
+12
+70.20757856836609
+22
+17.629761707529237
+32
+382.78992621918167
+13
+70.20757856836609
+23
+17.629761707529237
+33
+382.78992621918167
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+57.751630842842516
+20
+-21.461238457175828
+30
+396.5889330636198
+11
+46.38988673999685
+21
+-21.686364456227
+31
+402.62352673544115
+12
+57.090095052392
+22
+-36.91066225411659
+32
+397.6944842535427
+13
+57.090095052392
+23
+-36.91066225411659
+33
+397.6944842535427
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+46.38988673999685
+20
+-21.686364456227
+30
+402.62352673544115
+11
+47.260576752537325
+21
+-42.09981653221126
+31
+403.3402792405177
+12
+57.090095052392
+22
+-36.91066225411659
+32
+397.6944842535427
+13
+57.090095052392
+23
+-36.91066225411659
+33
+397.6944842535427
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+79.59010919710781
+20
+35.4259719324055
+30
+361.8218732023004
+11
+68.40556663570327
+21
+34.8747174590534
+31
+375.73770218679584
+12
+70.20757856836609
+22
+17.629761707529237
+32
+382.78992621918167
+13
+70.20757856836609
+23
+17.629761707529237
+33
+382.78992621918167
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+79.59010919710781
+20
+35.4259719324055
+30
+361.8218732023004
+11
+70.20757856836609
+21
+17.629761707529237
+31
+382.78992621918167
+12
+82.52169691448852
+22
+18.705498913802014
+32
+369.7460041445184
+13
+82.52169691448852
+23
+18.705498913802014
+33
+369.7460041445184
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+82.52169691448852
+20
+18.705498913802014
+30
+369.7460041445184
+11
+70.20757856836609
+21
+17.629761707529237
+31
+382.78992621918167
+12
+80.02985024484597
+22
+1.5241260457929693
+32
+377.86392598051384
+13
+80.02985024484597
+23
+1.5241260457929693
+33
+377.86392598051384
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.20757856836609
+20
+17.629761707529237
+30
+382.78992621918167
+11
+65.16904575260993
+21
+-0.23642011164273047
+31
+390.23125316073487
+12
+80.02985024484597
+22
+1.5241260457929693
+32
+377.86392598051384
+13
+80.02985024484597
+23
+1.5241260457929693
+33
+377.86392598051384
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.02985024484597
+20
+1.5241260457929693
+30
+377.86392598051384
+11
+65.16904575260993
+21
+-0.23642011164273047
+31
+390.23125316073487
+12
+57.751630842842516
+22
+-21.461238457175828
+32
+396.5889330636198
+13
+57.751630842842516
+23
+-21.461238457175828
+33
+396.5889330636198
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.02985024484597
+20
+1.5241260457929693
+30
+377.86392598051384
+11
+57.751630842842516
+21
+-21.461238457175828
+31
+396.5889330636198
+12
+73.65109368085585
+22
+-18.674847882449416
+32
+384.01655868966964
+13
+73.65109368085585
+23
+-18.674847882449416
+33
+384.01655868966964
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+57.090095052392
+20
+-36.91066225411659
+30
+397.6944842535427
+11
+61.87682139596797
+21
+-54.07925770055454
+31
+392.4889018620014
+12
+72.86680337605877
+22
+-45.522644390729255
+32
+383.577562991516
+13
+72.86680337605877
+23
+-45.522644390729255
+33
+383.577562991516
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.45951913624852
+20
+-26.680510943248844
+30
+391.18773443236637
+11
+57.090095052392
+21
+-36.91066225411659
+31
+397.6944842535427
+12
+72.86680337605877
+22
+-45.522644390729255
+32
+383.577562991516
+13
+72.86680337605877
+23
+-45.522644390729255
+33
+383.577562991516
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+73.65109368085585
+20
+-18.674847882449416
+30
+384.01655868966964
+11
+57.751630842842516
+21
+-21.461238457175828
+31
+396.5889330636198
+12
+57.090095052392
+22
+-36.91066225411659
+32
+397.6944842535427
+13
+57.090095052392
+23
+-36.91066225411659
+33
+397.6944842535427
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+73.65109368085585
+20
+-18.674847882449416
+30
+384.01655868966964
+11
+57.090095052392
+21
+-36.91066225411659
+31
+397.6944842535427
+12
+65.45951913624852
+22
+-26.680510943248844
+32
+391.18773443236637
+13
+65.45951913624852
+23
+-26.680510943248844
+33
+391.18773443236637
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+85.81379958140127
+20
+-17.878084380403713
+30
+368.83181005377435
+11
+73.65109368085585
+21
+-18.674847882449416
+31
+384.01655868966964
+12
+79.83657653241872
+22
+-34.48842819406656
+32
+376.057441950293
+13
+79.83657653241872
+23
+-34.48842819406656
+33
+376.057441950293
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+73.65109368085585
+20
+-18.674847882449416
+30
+384.01655868966964
+11
+65.45951913624852
+21
+-26.680510943248844
+31
+391.18773443236637
+12
+72.86680337605877
+22
+-45.522644390729255
+32
+383.577562991516
+13
+72.86680337605877
+23
+-45.522644390729255
+33
+383.577562991516
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+79.83657653241872
+20
+-34.48842819406656
+30
+376.057441950293
+11
+73.65109368085585
+21
+-18.674847882449416
+31
+384.01655868966964
+12
+72.86680337605877
+22
+-45.522644390729255
+32
+383.577562991516
+13
+72.86680337605877
+23
+-45.522644390729255
+33
+383.577562991516
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.2521767320265
+20
+-120.9565864100797
+30
+257.0591853202059
+11
+73.13741091140281
+21
+-118.53252700409917
+31
+265.58537619772534
+12
+69.93304653925485
+22
+-124.01647465121756
+32
+263.01620178965135
+13
+69.93304653925485
+23
+-124.01647465121756
+33
+263.01620178965135
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.2521767320265
+20
+-120.9565864100797
+30
+257.0591853202059
+11
+72.7754143894175
+21
+-115.93262593939801
+31
+260.5166947515568
+12
+73.13741091140281
+22
+-118.53252700409917
+32
+265.58537619772534
+13
+73.13741091140281
+23
+-118.53252700409917
+33
+265.58537619772534
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+67.09898401311108
+20
+-118.00682737388367
+30
+256.2718527721792
+11
+67.50205081870678
+21
+-120.11236391364476
+31
+260.8601640122679
+12
+71.36074086484922
+22
+-114.81003818738034
+32
+260.06218361293503
+13
+71.36074086484922
+23
+-114.81003818738034
+33
+260.06218361293503
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+71.36074086484922
+20
+-114.81003818738034
+30
+260.06218361293503
+11
+67.50205081870678
+21
+-120.11236391364476
+31
+260.8601640122679
+12
+70.77751241514923
+22
+-117.91312628238941
+32
+263.73873455687294
+13
+70.77751241514923
+23
+-117.91312628238941
+33
+263.73873455687294
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.77751241514923
+20
+-117.91312628238941
+30
+263.73873455687294
+11
+67.50205081870678
+21
+-120.11236391364476
+31
+260.8601640122679
+12
+68.73263820540357
+22
+-119.11420390975239
+32
+268.48585089358875
+13
+68.73263820540357
+23
+-119.11420390975239
+33
+268.48585089358875
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.73263820540357
+20
+-119.11420390975239
+30
+268.48585089358875
+11
+67.50205081870678
+21
+-120.11236391364476
+31
+260.8601640122679
+12
+65.65623058352618
+22
+-121.81602012267024
+32
+266.94343357577526
+13
+65.65623058352618
+23
+-121.81602012267024
+33
+266.94343357577526
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.996762522181399
+20
+14.621287377023682
+30
+239.83187457945482
+11
+0.020623870886214313
+21
+16.30273521046403
+31
+246.00215229935253
+12
+0.020623870886214313
+22
+15.154592615312872
+32
+238.85774829708083
+13
+0.020623870886214313
+23
+15.154592615312872
+33
+238.85774829708083
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.996762522181399
+20
+14.621287377023682
+30
+239.83187457945482
+11
+8.110557069165878
+21
+16.307298575309513
+31
+246.31063576291515
+12
+0.020623870886214313
+22
+16.30273521046403
+32
+246.00215229935253
+13
+0.020623870886214313
+23
+16.30273521046403
+33
+246.00215229935253
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.423603897574033
+20
+17.853366585001176
+30
+237.17873425822356
+11
+0.020623870886214313
+21
+15.154592615312872
+31
+238.85774829708083
+12
+0.020623870886214313
+22
+17.7964766365927
+32
+237.14496535836636
+13
+0.020623870886214313
+23
+17.7964766365927
+33
+237.14496535836636
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.423603897574033
+20
+17.853366585001176
+30
+237.17873425822356
+11
+8.996762522181399
+21
+14.621287377023682
+31
+239.83187457945482
+12
+0.020623870886214313
+22
+15.154592615312872
+32
+238.85774829708083
+13
+0.020623870886214313
+23
+15.154592615312872
+33
+238.85774829708083
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.28372255013123
+20
+-67.17398523716388
+30
+387.13881291701654
+11
+50.86149752976797
+21
+-75.9751949027131
+31
+394.91052747339415
+12
+68.75323419207338
+22
+-79.76217927591023
+32
+376.54724311037575
+13
+68.75323419207338
+23
+-79.76217927591023
+33
+376.54724311037575
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.86149752976797
+20
+-75.9751949027131
+30
+394.91052747339415
+11
+51.40283429018535
+21
+-90.61872846791874
+31
+388.48074640594007
+12
+68.75323419207338
+22
+-79.76217927591023
+32
+376.54724311037575
+13
+68.75323419207338
+23
+-79.76217927591023
+33
+376.54724311037575
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+82.40280604904443
+20
+-73.35095589215923
+30
+352.9601228964403
+11
+80.25667685786136
+21
+-65.15849909701765
+31
+363.0287310917742
+12
+68.75323419207338
+22
+-79.76217927591023
+32
+376.54724311037575
+13
+68.75323419207338
+23
+-79.76217927591023
+33
+376.54724311037575
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+82.40280604904443
+20
+-73.35095589215923
+30
+352.9601228964403
+11
+68.75323419207338
+21
+-79.76217927591023
+31
+376.54724311037575
+12
+70.60121441994757
+22
+-88.86426679694232
+32
+370.0158511190277
+13
+70.60121441994757
+23
+-88.86426679694232
+33
+370.0158511190277
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.25667685786136
+20
+-65.15849909701765
+30
+363.0287310917742
+11
+75.80202048961326
+21
+-57.01715198814808
+31
+377.7255039135156
+12
+64.28372255013123
+22
+-67.17398523716388
+32
+387.13881291701654
+13
+64.28372255013123
+23
+-67.17398523716388
+33
+387.13881291701654
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.25667685786136
+20
+-65.15849909701765
+30
+363.0287310917742
+11
+64.28372255013123
+21
+-67.17398523716388
+31
+387.13881291701654
+12
+68.75323419207338
+22
+-79.76217927591023
+32
+376.54724311037575
+13
+68.75323419207338
+23
+-79.76217927591023
+33
+376.54724311037575
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+85.93162566171459
+20
+-55.624108812938914
+30
+342.9228498063858
+11
+85.81833252381449
+21
+-49.82224674824562
+31
+352.668980219297
+12
+80.25667685786136
+22
+-65.15849909701765
+32
+363.0287310917742
+13
+80.25667685786136
+23
+-65.15849909701765
+33
+363.0287310917742
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+85.93162566171459
+20
+-55.624108812938914
+30
+342.9228498063858
+11
+80.25667685786136
+21
+-65.15849909701765
+31
+363.0287310917742
+12
+82.40280604904443
+22
+-73.35095589215923
+32
+352.9601228964403
+13
+82.40280604904443
+23
+-73.35095589215923
+33
+352.9601228964403
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+85.81833252381449
+20
+-49.82224674824562
+30
+352.668980219297
+11
+84.01467777980731
+21
+-42.674192054101475
+31
+367.1722663715848
+12
+75.80202048961326
+22
+-57.01715198814808
+32
+377.7255039135156
+13
+75.80202048961326
+23
+-57.01715198814808
+33
+377.7255039135156
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+85.81833252381449
+20
+-49.82224674824562
+30
+352.668980219297
+11
+75.80202048961326
+21
+-57.01715198814808
+31
+377.7255039135156
+12
+80.25667685786136
+22
+-65.15849909701765
+32
+363.0287310917742
+13
+80.25667685786136
+23
+-65.15849909701765
+33
+363.0287310917742
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+51.40283429018535
+20
+-90.61872846791874
+30
+388.48074640594007
+11
+33.044174136878155
+21
+-98.29035322202007
+31
+395.1399126129606
+12
+53.764071373460304
+22
+-101.36332310904378
+32
+382.02419359805936
+13
+53.764071373460304
+23
+-101.36332310904378
+33
+382.02419359805936
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.044174136878155
+20
+-98.29035322202007
+30
+395.1399126129606
+11
+34.04446371103367
+21
+-109.15511647074618
+31
+389.66204945229913
+12
+53.764071373460304
+22
+-101.36332310904378
+32
+382.02419359805936
+13
+53.764071373460304
+23
+-101.36332310904378
+33
+382.02419359805936
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.86149752976797
+20
+-75.9751949027131
+30
+394.91052747339415
+11
+32.16952920813815
+21
+-83.43781754688598
+31
+401.6369272558066
+12
+51.40283429018535
+22
+-90.61872846791874
+32
+388.48074640594007
+13
+51.40283429018535
+23
+-90.61872846791874
+33
+388.48074640594007
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.16952920813815
+20
+-83.43781754688598
+30
+401.6369272558066
+11
+33.044174136878155
+21
+-98.29035322202007
+31
+395.1399126129606
+12
+51.40283429018535
+22
+-90.61872846791874
+32
+388.48074640594007
+13
+51.40283429018535
+23
+-90.61872846791874
+33
+388.48074640594007
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.044174136878155
+20
+-98.29035322202007
+30
+395.1399126129606
+11
+15.957110809013557
+21
+-99.86593099104559
+31
+400.09603105960446
+12
+34.04446371103367
+22
+-109.15511647074618
+32
+389.66204945229913
+13
+34.04446371103367
+23
+-109.15511647074618
+33
+389.66204945229913
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.957110809013557
+20
+-99.86593099104559
+30
+400.09603105960446
+11
+16.492849841886972
+21
+-110.78149970171967
+31
+395.32518522568876
+12
+34.04446371103367
+22
+-109.15511647074618
+32
+389.66204945229913
+13
+34.04446371103367
+23
+-109.15511647074618
+33
+389.66204945229913
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.16952920813815
+20
+-83.43781754688598
+30
+401.6369272558066
+11
+15.452402657090182
+21
+-89.58619111552514
+31
+404.5891200865852
+12
+33.044174136878155
+22
+-98.29035322202007
+32
+395.1399126129606
+13
+33.044174136878155
+23
+-98.29035322202007
+33
+395.1399126129606
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.452402657090182
+20
+-89.58619111552514
+30
+404.5891200865852
+11
+15.957110809013557
+21
+-99.86593099104559
+31
+400.09603105960446
+12
+33.044174136878155
+22
+-98.29035322202007
+32
+395.1399126129606
+13
+33.044174136878155
+23
+-98.29035322202007
+33
+395.1399126129606
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.63138568101544
+20
+80.11561231401667
+30
+345.94562268014647
+11
+9.65875464911644
+21
+84.98959019344088
+31
+343.02202693573327
+12
+24.65792644795753
+22
+72.16714342594669
+32
+360.0065666667302
+13
+24.65792644795753
+23
+72.16714342594669
+33
+360.0065666667302
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+24.65792644795753
+20
+72.16714342594669
+30
+360.0065666667302
+11
+9.65875464911644
+21
+84.98959019344088
+31
+343.02202693573327
+12
+9.959632504602991
+22
+74.58390144817649
+32
+359.6792212951398
+13
+9.959632504602991
+23
+74.58390144817649
+33
+359.6792212951398
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.84524072994503
+20
+87.03063117671918
+30
+331.82413805327747
+11
+10.339912908402994
+21
+91.81607977813896
+31
+329.5162923386974
+12
+29.63138568101544
+22
+80.11561231401667
+32
+345.94562268014647
+13
+29.63138568101544
+23
+80.11561231401667
+33
+345.94562268014647
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.63138568101544
+20
+80.11561231401667
+30
+345.94562268014647
+11
+10.339912908402994
+21
+91.81607977813896
+31
+329.5162923386974
+12
+9.65875464911644
+22
+84.98959019344088
+32
+343.02202693573327
+13
+9.65875464911644
+23
+84.98959019344088
+33
+343.02202693573327
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.17600239073221
+20
+70.12458132105813
+30
+352.3565418395659
+11
+30.84524072994503
+21
+87.03063117671918
+31
+331.82413805327747
+12
+29.63138568101544
+22
+80.11561231401667
+32
+345.94562268014647
+13
+29.63138568101544
+23
+80.11561231401667
+33
+345.94562268014647
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.58865562879545
+20
+73.95811201568833
+30
+339.99012733231393
+11
+30.84524072994503
+21
+87.03063117671918
+31
+331.82413805327747
+12
+47.17600239073221
+22
+70.12458132105813
+32
+352.3565418395659
+13
+47.17600239073221
+23
+70.12458132105813
+33
+352.3565418395659
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.00697086846214
+20
+64.47665676381719
+30
+365.3204529172679
+11
+29.63138568101544
+21
+80.11561231401667
+31
+345.94562268014647
+12
+24.65792644795753
+22
+72.16714342594669
+32
+360.0065666667302
+13
+24.65792644795753
+23
+72.16714342594669
+33
+360.0065666667302
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.17600239073221
+20
+70.12458132105813
+30
+352.3565418395659
+11
+29.63138568101544
+21
+80.11561231401667
+31
+345.94562268014647
+12
+39.00697086846214
+22
+64.47665676381719
+32
+365.3204529172679
+13
+39.00697086846214
+23
+64.47665676381719
+33
+365.3204529172679
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.85300175357119
+20
+51.05002049076981
+30
+365.3816020061954
+11
+53.58865562879545
+21
+73.95811201568833
+31
+339.99012733231393
+12
+47.17600239073221
+22
+70.12458132105813
+32
+352.3565418395659
+13
+47.17600239073221
+23
+70.12458132105813
+33
+352.3565418395659
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.75089278688327
+20
+55.24527390549513
+30
+350.96806202920743
+11
+53.58865562879545
+21
+73.95811201568833
+31
+339.99012733231393
+12
+63.85300175357119
+22
+51.05002049076981
+32
+365.3816020061954
+13
+63.85300175357119
+23
+51.05002049076981
+33
+365.3816020061954
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+51.46516985397624
+20
+49.05552582891695
+30
+375.795200583854
+11
+47.17600239073221
+21
+70.12458132105813
+31
+352.3565418395659
+12
+39.00697086846214
+22
+64.47665676381719
+32
+365.3204529172679
+13
+39.00697086846214
+23
+64.47665676381719
+33
+365.3204529172679
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.85300175357119
+20
+51.05002049076981
+30
+365.3816020061954
+11
+47.17600239073221
+21
+70.12458132105813
+31
+352.3565418395659
+12
+51.46516985397624
+22
+49.05552582891695
+32
+375.795200583854
+13
+51.46516985397624
+23
+49.05552582891695
+33
+375.795200583854
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.85300175357119
+20
+51.05002049076981
+30
+365.3816020061954
+11
+55.01467672061313
+21
+35.66661337192453
+31
+384.2660226345763
+12
+68.40556663570327
+22
+34.8747174590534
+32
+375.73770218679584
+13
+68.40556663570327
+23
+34.8747174590534
+33
+375.73770218679584
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.85300175357119
+20
+51.05002049076981
+30
+365.3816020061954
+11
+51.46516985397624
+21
+49.05552582891695
+31
+375.795200583854
+12
+55.01467672061313
+22
+35.66661337192453
+32
+384.2660226345763
+13
+55.01467672061313
+23
+35.66661337192453
+33
+384.2660226345763
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.75089278688327
+20
+55.24527390549513
+30
+350.96806202920743
+11
+68.40556663570327
+21
+34.8747174590534
+31
+375.73770218679584
+12
+79.59010919710781
+22
+35.4259719324055
+32
+361.8218732023004
+13
+79.59010919710781
+23
+35.4259719324055
+33
+361.8218732023004
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.75089278688327
+20
+55.24527390549513
+30
+350.96806202920743
+11
+63.85300175357119
+21
+51.05002049076981
+31
+365.3816020061954
+12
+68.40556663570327
+22
+34.8747174590534
+32
+375.73770218679584
+13
+68.40556663570327
+23
+34.8747174590534
+33
+375.73770218679584
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+9.959632504602991
+20
+74.58390144817649
+30
+359.6792212951398
+11
+9.65875464911644
+21
+84.98959019344088
+31
+343.02202693573327
+12
+0.020623870886214313
+22
+86.21348464503126
+32
+341.0920278303678
+13
+0.020623870886214313
+23
+86.21348464503126
+33
+341.0920278303678
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+9.959632504602991
+20
+74.58390144817649
+30
+359.6792212951398
+11
+0.020623870886214313
+21
+86.21348464503126
+31
+341.0920278303678
+12
+0.020623870886214313
+22
+74.90881302518322
+32
+359.66309740601866
+13
+0.020623870886214313
+23
+74.90881302518322
+33
+359.66309740601866
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.339912908402994
+20
+91.81607977813896
+30
+329.5162923386974
+11
+0.020623870886214313
+21
+92.57177299657081
+31
+327.7158927949469
+12
+9.65875464911644
+22
+84.98959019344088
+32
+343.02202693573327
+13
+9.65875464911644
+23
+84.98959019344088
+33
+343.02202693573327
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+9.65875464911644
+20
+84.98959019344088
+30
+343.02202693573327
+11
+0.020623870886214313
+21
+92.57177299657081
+31
+327.7158927949469
+12
+0.020623870886214313
+22
+86.21348464503126
+32
+341.0920278303678
+13
+0.020623870886214313
+23
+86.21348464503126
+33
+341.0920278303678
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.957140109348584
+20
+23.883396891934023
+30
+402.69349832975223
+11
+12.484390161511953
+21
+-3.00181920808168
+31
+411.0614925592837
+12
+32.892366199681184
+22
+-0.22546803601725074
+32
+405.5909307823789
+13
+32.892366199681184
+23
+-0.22546803601725074
+33
+405.5909307823789
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.957140109348584
+20
+23.883396891934023
+30
+402.69349832975223
+11
+32.892366199681184
+21
+-0.22546803601725074
+31
+405.5909307823789
+12
+36.944938406897045
+22
+21.200442587045607
+32
+398.76413697336693
+13
+36.944938406897045
+23
+21.200442587045607
+33
+398.76413697336693
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+12.484390161511953
+20
+-3.00181920808168
+30
+411.0614925592837
+11
+16.069065359892278
+21
+-24.58988139532383
+31
+414.02889660620997
+12
+31.863175314836866
+22
+-22.322497515705425
+32
+408.89632805220236
+13
+31.863175314836866
+23
+-22.322497515705425
+33
+408.89632805220236
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.892366199681184
+20
+-0.22546803601725074
+30
+405.5909307823789
+11
+12.484390161511953
+21
+-3.00181920808168
+31
+411.0614925592837
+12
+31.863175314836866
+22
+-22.322497515705425
+32
+408.89632805220236
+13
+31.863175314836866
+23
+-22.322497515705425
+33
+408.89632805220236
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.892366199681184
+20
+-0.22546803601725074
+30
+405.5909307823789
+11
+46.38988673999685
+21
+-21.686364456227
+31
+402.62352673544115
+12
+48.474948982816116
+22
+-1.4204611769168638
+32
+399.6987140937399
+13
+48.474948982816116
+23
+-1.4204611769168638
+33
+399.6987140937399
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.892366199681184
+20
+-0.22546803601725074
+30
+405.5909307823789
+11
+31.863175314836866
+21
+-22.322497515705425
+31
+408.89632805220236
+12
+46.38988673999685
+22
+-21.686364456227
+32
+402.62352673544115
+13
+46.38988673999685
+23
+-21.686364456227
+33
+402.62352673544115
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+12.484390161511953
+20
+-3.00181920808168
+30
+411.0614925592837
+11
+0.020623870886214313
+21
+-4.192857432783509
+31
+412.01462736336754
+12
+16.069065359892278
+22
+-24.58988139532383
+32
+414.02889660620997
+13
+16.069065359892278
+23
+-24.58988139532383
+33
+414.02889660620997
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-4.192857432783509
+30
+412.01462736336754
+11
+0.020623870886214313
+21
+-23.08336254763007
+31
+415.219630606589
+12
+16.069065359892278
+22
+-24.58988139532383
+32
+414.02889660620997
+13
+16.069065359892278
+23
+-24.58988139532383
+33
+414.02889660620997
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.957140109348584
+20
+23.883396891934023
+30
+402.69349832975223
+11
+0.020623870886214313
+21
+22.350714752458487
+31
+403.9472067649992
+12
+12.484390161511953
+22
+-3.00181920808168
+32
+411.0614925592837
+13
+12.484390161511953
+23
+-3.00181920808168
+33
+411.0614925592837
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+20.500092624969852
+20
+1.13015554748824
+30
+253.29410509829435
+11
+21.566703101548093
+21
+-7.275866722433358
+31
+266.2893512812688
+12
+20.874288542309053
+22
+-3.750211042721097
+32
+259.7415311764798
+13
+20.874288542309053
+23
+-3.750211042721097
+33
+259.7415311764798
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.110557069165878
+20
+16.307298575309513
+30
+246.31063576291515
+11
+7.9319773915413885
+21
+7.801794951755712
+31
+252.1620863922642
+12
+0.020623870886214313
+22
+7.191825184060687
+32
+251.58618974874932
+13
+0.020623870886214313
+23
+7.191825184060687
+33
+251.58618974874932
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.110557069165878
+20
+16.307298575309513
+30
+246.31063576291515
+11
+0.020623870886214313
+21
+7.191825184060687
+31
+251.58618974874932
+12
+0.020623870886214313
+22
+16.30273521046403
+32
+246.00215229935253
+13
+0.020623870886214313
+23
+16.30273521046403
+33
+246.00215229935253
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.9319773915413885
+20
+7.801794951755712
+30
+252.1620863922642
+11
+7.75309348959387
+21
+-0.7040128961211294
+31
+258.0138412459364
+12
+0.020623870886214313
+22
+-1.9190848423426758
+32
+257.17022719814594
+13
+0.020623870886214313
+23
+-1.9190848423426758
+33
+257.17022719814594
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.9319773915413885
+20
+7.801794951755712
+30
+252.1620863922642
+11
+0.020623870886214313
+21
+-1.9190848423426758
+31
+257.17022719814594
+12
+0.020623870886214313
+22
+7.191825184060687
+32
+251.58618974874932
+13
+0.020623870886214313
+23
+7.191825184060687
+33
+251.58618974874932
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.75309348959387
+20
+-0.7040128961211294
+30
+258.0138412459364
+11
+7.5745138119694015
+21
+-9.209516519674931
+31
+263.86529187528555
+12
+0.020623870886214313
+22
+-11.029994868746016
+32
+262.75426464754304
+13
+0.020623870886214313
+23
+-11.029994868746016
+33
+262.75426464754304
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.75309348959387
+20
+-0.7040128961211294
+30
+258.0138412459364
+11
+0.020623870886214313
+21
+-11.029994868746016
+31
+262.75426464754304
+12
+0.020623870886214313
+22
+-1.9190848423426758
+32
+257.17022719814594
+13
+0.020623870886214313
+23
+-1.9190848423426758
+33
+257.17022719814594
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.5745138119694015
+20
+-9.209516519674931
+30
+263.86529187528555
+11
+7.395934134344922
+21
+-17.715324367551794
+31
+269.7167425046348
+12
+0.020623870886214313
+22
+-20.141209119472396
+32
+268.33830209693986
+13
+0.020623870886214313
+23
+-20.141209119472396
+33
+268.33830209693986
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.5745138119694015
+20
+-9.209516519674931
+30
+263.86529187528555
+11
+0.020623870886214313
+21
+-20.141209119472396
+31
+268.33830209693986
+12
+0.020623870886214313
+22
+-11.029994868746016
+32
+262.75426464754304
+13
+0.020623870886214313
+23
+-11.029994868746016
+33
+262.75426464754304
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.395934134344922
+20
+-17.715324367551794
+30
+269.7167425046348
+11
+7.31044709957069
+21
+-25.341619697519985
+31
+275.48574834244033
+12
+0.020623870886214313
+22
+-26.046811678326367
+32
+273.97527457854653
+13
+0.020623870886214313
+23
+-26.046811678326367
+33
+273.97527457854653
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.395934134344922
+20
+-17.715324367551794
+30
+269.7167425046348
+11
+0.020623870886214313
+21
+-26.046811678326367
+31
+273.97527457854653
+12
+0.020623870886214313
+22
+-20.141209119472396
+32
+268.33830209693986
+13
+0.020623870886214313
+23
+-20.141209119472396
+33
+268.33830209693986
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+20.874288542309053
+20
+-3.750211042721097
+30
+259.7415311764798
+11
+7.75309348959387
+21
+-0.7040128961211294
+31
+258.0138412459364
+12
+20.500092624969852
+22
+1.13015554748824
+32
+253.29410509829435
+13
+20.500092624969852
+23
+1.13015554748824
+33
+253.29410509829435
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+21.566703101548093
+20
+-7.275866722433358
+30
+266.2893512812688
+11
+18.513812019841698
+21
+-14.440957978671987
+31
+269.03345467508774
+12
+7.5745138119694015
+22
+-9.209516519674931
+32
+263.86529187528555
+13
+7.5745138119694015
+23
+-9.209516519674931
+33
+263.86529187528555
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.110557069165878
+20
+16.307298575309513
+30
+246.31063576291515
+11
+13.533659851676914
+21
+13.151579672415203
+31
+249.09428831873032
+12
+18.576786454710998
+22
+8.245658239071338
+32
+251.1681855288927
+13
+18.576786454710998
+23
+8.245658239071338
+33
+251.1681855288927
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.110557069165878
+20
+16.307298575309513
+30
+246.31063576291515
+11
+18.576786454710998
+21
+8.245658239071338
+31
+251.1681855288927
+12
+7.9319773915413885
+22
+7.801794951755712
+32
+252.1620863922642
+13
+7.9319773915413885
+23
+7.801794951755712
+33
+252.1620863922642
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+21.566703101548093
+20
+-7.275866722433358
+30
+266.2893512812688
+11
+7.75309348959387
+21
+-0.7040128961211294
+31
+258.0138412459364
+12
+20.874288542309053
+22
+-3.750211042721097
+32
+259.7415311764798
+13
+20.874288542309053
+23
+-3.750211042721097
+33
+259.7415311764798
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.75309348959387
+20
+-0.7040128961211294
+30
+258.0138412459364
+11
+21.566703101548093
+21
+-7.275866722433358
+31
+266.2893512812688
+12
+7.5745138119694015
+22
+-9.209516519674931
+32
+263.86529187528555
+13
+7.5745138119694015
+23
+-9.209516519674931
+33
+263.86529187528555
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.5745138119694015
+20
+-9.209516519674931
+30
+263.86529187528555
+11
+18.513812019841698
+21
+-14.440957978671987
+31
+269.03345467508774
+12
+15.597517659180257
+22
+-19.097719691445796
+32
+270.55974810377825
+13
+15.597517659180257
+23
+-19.097719691445796
+33
+270.55974810377825
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.5745138119694015
+20
+-9.209516519674931
+30
+263.86529187528555
+11
+15.597517659180257
+21
+-19.097719691445796
+31
+270.55974810377825
+12
+7.395934134344922
+22
+-17.715324367551794
+32
+269.7167425046348
+13
+7.395934134344922
+23
+-17.715324367551794
+33
+269.7167425046348
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.576786454710998
+20
+8.245658239071338
+30
+251.1681855288927
+11
+20.500092624969852
+21
+1.13015554748824
+31
+253.29410509829435
+12
+7.9319773915413885
+22
+7.801794951755712
+32
+252.1620863922642
+13
+7.9319773915413885
+23
+7.801794951755712
+33
+252.1620863922642
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.9319773915413885
+20
+7.801794951755712
+30
+252.1620863922642
+11
+20.500092624969852
+21
+1.13015554748824
+31
+253.29410509829435
+12
+7.75309348959387
+22
+-0.7040128961211294
+32
+258.0138412459364
+13
+7.75309348959387
+23
+-0.7040128961211294
+33
+258.0138412459364
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.395934134344922
+20
+-17.715324367551794
+30
+269.7167425046348
+11
+15.597517659180257
+21
+-19.097719691445796
+31
+270.55974810377825
+12
+7.31044709957069
+22
+-25.341619697519985
+32
+275.48574834244033
+13
+7.31044709957069
+23
+-25.341619697519985
+33
+275.48574834244033
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.597517659180257
+20
+-19.097719691445796
+30
+270.55974810377825
+11
+11.713181502605547
+21
+-23.59172139139388
+31
+275.41243028058807
+12
+7.31044709957069
+22
+-25.341619697519985
+32
+275.48574834244033
+13
+7.31044709957069
+23
+-25.341619697519985
+33
+275.48574834244033
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.22528673106468
+20
+-103.01282738854523
+30
+298.8109314142201
+11
+35.77397898751606
+21
+-96.66670800992969
+31
+294.4456166029207
+12
+41.41886130152325
+22
+-97.70654674607954
+32
+291.0617294577463
+13
+41.41886130152325
+23
+-97.70654674607954
+33
+291.0617294577463
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.22528673106468
+20
+-103.01282738854523
+30
+298.8109314142201
+11
+37.45390569934294
+21
+-91.9740478270398
+31
+302.5741862902278
+12
+35.77397898751606
+22
+-96.66670800992969
+32
+294.4456166029207
+13
+35.77397898751606
+23
+-96.66670800992969
+33
+294.4456166029207
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.22528673106468
+20
+-103.01282738854523
+30
+298.8109314142201
+11
+47.12550115310758
+21
+-94.70689492091051
+31
+311.6339866303582
+12
+37.45390569934294
+22
+-91.9740478270398
+32
+302.5741862902278
+13
+37.45390569934294
+23
+-91.9740478270398
+33
+302.5741862902278
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.12550115310758
+20
+-94.70689492091051
+30
+311.6339866303582
+11
+40.05837012888838
+21
+-91.30962190552313
+31
+313.0130354866993
+12
+37.45390569934294
+22
+-91.9740478270398
+32
+302.5741862902278
+13
+37.45390569934294
+23
+-91.9740478270398
+33
+302.5741862902278
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.94987924690327
+20
+-90.15204835635089
+30
+293.4602340205958
+11
+30.858322375835755
+21
+-88.93150037231516
+31
+296.2861737573147
+12
+28.273936751610957
+22
+-89.84508601440344
+32
+293.04618471693846
+13
+28.273936751610957
+23
+-89.84508601440344
+33
+293.04618471693846
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.858322375835755
+20
+-88.93150037231516
+30
+296.2861737573147
+11
+28.014129179734798
+21
+-88.18554233222079
+31
+295.0984820001665
+12
+28.273936751610957
+22
+-89.84508601440344
+32
+293.04618471693846
+13
+28.273936751610957
+23
+-89.84508601440344
+33
+293.04618471693846
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.94987924690327
+20
+-90.15204835635089
+30
+293.4602340205958
+11
+35.77397898751606
+21
+-96.66670800992969
+31
+294.4456166029207
+12
+32.35997363436119
+22
+-89.10247444186452
+32
+299.8236941856238
+13
+32.35997363436119
+23
+-89.10247444186452
+33
+299.8236941856238
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.35997363436119
+20
+-89.10247444186452
+30
+299.8236941856238
+11
+30.858322375835755
+21
+-88.93150037231516
+31
+296.2861737573147
+12
+31.94987924690327
+22
+-90.15204835635089
+32
+293.4602340205958
+13
+31.94987924690327
+23
+-90.15204835635089
+33
+293.4602340205958
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.05837012888838
+20
+-91.30962190552313
+30
+313.0130354866993
+11
+35.309732670557025
+21
+-88.00392041137039
+31
+312.5515271886485
+12
+37.45390569934294
+22
+-91.9740478270398
+32
+302.5741862902278
+13
+37.45390569934294
+23
+-91.9740478270398
+33
+302.5741862902278
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.45390569934294
+20
+-91.9740478270398
+30
+302.5741862902278
+11
+35.309732670557025
+21
+-88.00392041137039
+31
+312.5515271886485
+12
+32.30034566704535
+22
+-85.48859370847353
+32
+304.16071613488265
+13
+32.30034566704535
+23
+-85.48859370847353
+33
+304.16071613488265
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.35997363436119
+20
+-89.10247444186452
+30
+299.8236941856238
+11
+37.45390569934294
+21
+-91.9740478270398
+31
+302.5741862902278
+12
+32.30034566704535
+22
+-85.48859370847353
+32
+304.16071613488265
+13
+32.30034566704535
+23
+-85.48859370847353
+33
+304.16071613488265
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.45390569934294
+20
+-91.9740478270398
+30
+302.5741862902278
+11
+32.35997363436119
+21
+-89.10247444186452
+31
+299.8236941856238
+12
+35.77397898751606
+22
+-96.66670800992969
+32
+294.4456166029207
+13
+35.77397898751606
+23
+-96.66670800992969
+33
+294.4456166029207
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.273936751610957
+20
+-89.84508601440344
+30
+293.04618471693846
+11
+28.014129179734798
+21
+-88.18554233222079
+31
+295.0984820001665
+12
+24.497600229715445
+22
+-90.9807554123126
+32
+296.3899142514708
+13
+24.497600229715445
+23
+-90.9807554123126
+33
+296.3899142514708
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.273936751610957
+20
+-89.84508601440344
+30
+293.04618471693846
+11
+24.497600229715445
+21
+-90.9807554123126
+31
+296.3899142514708
+12
+24.044305988385855
+22
+-92.74099734542169
+32
+294.82985192292125
+13
+24.044305988385855
+23
+-92.74099734542169
+33
+294.82985192292125
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.92832327047
+20
+-90.85206852366501
+30
+289.88255598164534
+11
+28.273936751610957
+21
+-89.84508601440344
+31
+293.04618471693846
+12
+24.044305988385855
+22
+-92.74099734542169
+32
+294.82985192292125
+13
+24.044305988385855
+23
+-92.74099734542169
+33
+294.82985192292125
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.92832327047
+20
+-90.85206852366501
+30
+289.88255598164534
+11
+24.044305988385855
+21
+-92.74099734542169
+31
+294.82985192292125
+12
+25.92927989394169
+22
+-95.77898143529822
+32
+291.2637344082456
+13
+25.92927989394169
+23
+-95.77898143529822
+33
+291.2637344082456
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.885863716752098
+20
+-92.61109355948437
+30
+297.9828328069079
+11
+25.92927989394169
+21
+-95.77898143529822
+31
+291.2637344082456
+12
+24.044305988385855
+22
+-92.74099734542169
+32
+294.82985192292125
+13
+24.044305988385855
+23
+-92.74099734542169
+33
+294.82985192292125
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.92927989394169
+20
+-95.77898143529822
+30
+291.2637344082456
+11
+19.885863716752098
+21
+-92.61109355948437
+31
+297.9828328069079
+12
+20.39361411190586
+22
+-96.79965403909883
+32
+296.93903915455655
+13
+20.39361411190586
+23
+-96.79965403909883
+33
+296.93903915455655
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+24.044305988385855
+20
+-92.74099734542169
+30
+294.82985192292125
+11
+24.497600229715445
+21
+-90.9807554123126
+31
+296.3899142514708
+12
+22.114611107343148
+22
+-90.64063261915496
+32
+300.5316241853375
+13
+22.114611107343148
+23
+-90.64063261915496
+33
+300.5316241853375
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+24.044305988385855
+20
+-92.74099734542169
+30
+294.82985192292125
+11
+22.114611107343148
+21
+-90.64063261915496
+31
+300.5316241853375
+12
+19.885863716752098
+22
+-92.61109355948437
+32
+297.9828328069079
+13
+19.885863716752098
+23
+-92.61109355948437
+33
+297.9828328069079
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.114611107343148
+20
+-90.64063261915496
+30
+300.5316241853375
+11
+21.224450738128105
+21
+-90.15813284281502
+31
+306.3520439337389
+12
+19.885863716752098
+22
+-92.61109355948437
+32
+297.9828328069079
+13
+19.885863716752098
+23
+-92.61109355948437
+33
+297.9828328069079
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.885863716752098
+20
+-92.61109355948437
+30
+297.9828328069079
+11
+21.224450738128105
+21
+-90.15813284281502
+31
+306.3520439337389
+12
+19.734055779555145
+22
+-93.01206121725299
+32
+305.38035144594835
+13
+19.734055779555145
+23
+-93.01206121725299
+33
+305.38035144594835
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+20.39361411190586
+20
+-96.79965403909883
+30
+296.93903915455655
+11
+19.885863716752098
+21
+-92.61109355948437
+31
+297.9828328069079
+12
+19.734055779555145
+22
+-93.01206121725299
+32
+305.38035144594835
+13
+19.734055779555145
+23
+-93.01206121725299
+33
+305.38035144594835
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+20.39361411190586
+20
+-96.79965403909883
+30
+296.93903915455655
+11
+19.734055779555145
+21
+-93.01206121725299
+31
+305.38035144594835
+12
+19.337651486634016
+22
+-97.26633415064434
+32
+305.3435403028595
+13
+19.337651486634016
+23
+-97.26633415064434
+33
+305.3435403028595
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.423603897574033
+20
+17.853366585001176
+30
+237.17873425822356
+11
+18.217801753523784
+21
+12.897552362678766
+31
+240.3012927099048
+12
+8.996762522181399
+22
+14.621287377023682
+32
+239.83187457945482
+13
+8.996762522181399
+23
+14.621287377023682
+33
+239.83187457945482
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.996762522181399
+20
+14.621287377023682
+30
+239.83187457945482
+11
+18.217801753523784
+21
+12.897552362678766
+31
+240.3012927099048
+12
+14.793756997708584
+22
+10.567194048191887
+32
+242.099866907717
+13
+14.793756997708584
+23
+10.567194048191887
+33
+242.099866907717
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.793756997708584
+20
+10.567194048191887
+30
+242.099866907717
+11
+8.110557069165878
+21
+16.307298575309513
+31
+246.31063576291515
+12
+8.996762522181399
+22
+14.621287377023682
+32
+239.83187457945482
+13
+8.996762522181399
+23
+14.621287377023682
+33
+239.83187457945482
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.793756997708584
+20
+10.567194048191887
+30
+242.099866907717
+11
+13.533659851676914
+21
+13.151579672415203
+31
+249.09428831873032
+12
+8.110557069165878
+22
+16.307298575309513
+32
+246.31063576291515
+13
+8.110557069165878
+23
+16.307298575309513
+33
+246.31063576291515
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.793756997708584
+20
+10.567194048191887
+30
+242.099866907717
+11
+19.25672781670536
+21
+5.072294325442874
+31
+244.8756096311325
+12
+13.533659851676914
+22
+13.151579672415203
+32
+249.09428831873032
+13
+13.533659851676914
+23
+13.151579672415203
+33
+249.09428831873032
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.25672781670536
+20
+5.072294325442874
+30
+244.8756096311325
+11
+18.576786454710998
+21
+8.245658239071338
+31
+251.1681855288927
+12
+13.533659851676914
+22
+13.151579672415203
+32
+249.09428831873032
+13
+13.533659851676914
+23
+13.151579672415203
+33
+249.09428831873032
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.217801753523784
+20
+12.897552362678766
+30
+240.3012927099048
+11
+22.60806295931401
+21
+6.502757092376987
+31
+243.8452018489964
+12
+14.793756997708584
+22
+10.567194048191887
+32
+242.099866907717
+13
+14.793756997708584
+23
+10.567194048191887
+33
+242.099866907717
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.793756997708584
+20
+10.567194048191887
+30
+242.099866907717
+11
+22.60806295931401
+21
+6.502757092376987
+31
+243.8452018489964
+12
+19.25672781670536
+22
+5.072294325442874
+32
+244.8756096311325
+13
+19.25672781670536
+23
+5.072294325442874
+33
+244.8756096311325
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.60806295931401
+20
+6.502757092376987
+30
+243.8452018489964
+11
+24.298029073801224
+21
+-1.6224661273756518
+31
+245.48344982856472
+12
+19.25672781670536
+22
+5.072294325442874
+32
+244.8756096311325
+13
+19.25672781670536
+23
+5.072294325442874
+33
+244.8756096311325
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.25672781670536
+20
+5.072294325442874
+30
+244.8756096311325
+11
+24.298029073801224
+21
+-1.6224661273756518
+31
+245.48344982856472
+12
+22.60806295931401
+22
+-3.30756465269406
+32
+244.88291101488306
+13
+22.60806295931401
+23
+-3.30756465269406
+33
+244.88291101488306
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.25672781670536
+20
+5.072294325442874
+30
+244.8756096311325
+11
+22.60806295931401
+21
+-3.30756465269406
+31
+244.88291101488306
+12
+18.576786454710998
+22
+8.245658239071338
+32
+251.1681855288927
+13
+18.576786454710998
+23
+8.245658239071338
+33
+251.1681855288927
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.60806295931401
+20
+-3.30756465269406
+30
+244.88291101488306
+11
+20.500092624969852
+21
+1.13015554748824
+31
+253.29410509829435
+12
+18.576786454710998
+22
+8.245658239071338
+32
+251.1681855288927
+13
+18.576786454710998
+23
+8.245658239071338
+33
+251.1681855288927
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.16754613955209
+20
+-9.003556652971616
+30
+243.62129274723497
+11
+20.500092624969852
+21
+1.13015554748824
+31
+253.29410509829435
+12
+22.60806295931401
+22
+-3.30756465269406
+32
+244.88291101488306
+13
+22.60806295931401
+23
+-3.30756465269406
+33
+244.88291101488306
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.16754613955209
+20
+-9.003556652971616
+30
+243.62129274723497
+11
+21.938160999979935
+21
+-7.895267444138602
+31
+249.98110222038642
+12
+20.500092624969852
+22
+1.13015554748824
+32
+253.29410509829435
+13
+20.500092624969852
+23
+1.13015554748824
+33
+253.29410509829435
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+24.298029073801224
+20
+-1.6224661273756518
+30
+245.48344982856472
+11
+24.292248811663452
+21
+-8.70876328394589
+31
+243.81934278153415
+12
+22.60806295931401
+22
+-3.30756465269406
+32
+244.88291101488306
+13
+22.60806295931401
+23
+-3.30756465269406
+33
+244.88291101488306
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.60806295931401
+20
+-3.30756465269406
+30
+244.88291101488306
+11
+24.292248811663452
+21
+-8.70876328394589
+31
+243.81934278153415
+12
+22.16754613955209
+22
+-9.003556652971616
+32
+243.62129274723497
+13
+22.16754613955209
+23
+-9.003556652971616
+33
+243.62129274723497
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+24.292248811663452
+20
+-8.70876328394589
+30
+243.81934278153415
+11
+19.28167421119466
+21
+-20.4022335886354
+31
+247.76482802703683
+12
+22.16754613955209
+22
+-9.003556652971616
+32
+243.62129274723497
+13
+22.16754613955209
+23
+-9.003556652971616
+33
+243.62129274723497
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.16754613955209
+20
+-9.003556652971616
+30
+243.62129274723497
+11
+19.28167421119466
+21
+-20.4022335886354
+31
+247.76482802703683
+12
+17.382705986778976
+22
+-20.176194916616126
+32
+245.83726271625542
+13
+17.382705986778976
+23
+-20.176194916616126
+33
+245.83726271625542
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.16754613955209
+20
+-9.003556652971616
+30
+243.62129274723497
+11
+17.382705986778976
+21
+-20.176194916616126
+31
+245.83726271625542
+12
+21.938160999979935
+22
+-7.895267444138602
+32
+249.98110222038642
+13
+21.938160999979935
+23
+-7.895267444138602
+33
+249.98110222038642
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.382705986778976
+20
+-20.176194916616126
+30
+245.83726271625542
+11
+18.0702529568494
+21
+-17.60093602208464
+31
+253.8055061853195
+12
+21.938160999979935
+22
+-7.895267444138602
+32
+249.98110222038642
+13
+21.938160999979935
+23
+-7.895267444138602
+33
+249.98110222038642
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.382705986778976
+20
+-20.176194916616126
+30
+245.83726271625542
+11
+13.358730865928907
+21
+-24.692404992146237
+31
+250.73284052261394
+12
+18.0702529568494
+22
+-17.60093602208464
+32
+253.8055061853195
+13
+18.0702529568494
+23
+-17.60093602208464
+33
+253.8055061853195
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.358730865928907
+20
+-24.692404992146237
+30
+250.73284052261394
+11
+16.17067628378762
+21
+-21.31855724963454
+31
+258.08016214835385
+12
+18.0702529568494
+22
+-17.60093602208464
+32
+253.8055061853195
+13
+18.0702529568494
+23
+-17.60093602208464
+33
+253.8055061853195
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.28167421119466
+20
+-20.4022335886354
+30
+247.76482802703683
+11
+17.039236726066825
+21
+-24.388484893429226
+31
+250.45204147244806
+12
+17.382705986778976
+22
+-20.176194916616126
+32
+245.83726271625542
+13
+17.382705986778976
+23
+-20.176194916616126
+33
+245.83726271625542
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.382705986778976
+20
+-20.176194916616126
+30
+245.83726271625542
+11
+17.039236726066825
+21
+-24.388484893429226
+31
+250.45204147244806
+12
+13.358730865928907
+22
+-24.692404992146237
+32
+250.73284052261394
+13
+13.358730865928907
+23
+-24.692404992146237
+33
+250.73284052261394
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.039236726066825
+20
+-24.388484893429226
+30
+250.45204147244806
+11
+11.777068610443962
+21
+-29.594979957936477
+31
+253.28467414427217
+12
+13.358730865928907
+22
+-24.692404992146237
+32
+250.73284052261394
+13
+13.358730865928907
+23
+-24.692404992146237
+33
+250.73284052261394
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.358730865928907
+20
+-24.692404992146237
+30
+250.73284052261394
+11
+11.777068610443962
+21
+-29.594979957936477
+31
+253.28467414427217
+12
+11.422343049779311
+22
+-27.88310969218997
+32
+251.1840051936814
+13
+11.422343049779311
+23
+-27.88310969218997
+33
+251.1840051936814
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.358730865928907
+20
+-24.692404992146237
+30
+250.73284052261394
+11
+11.422343049779311
+21
+-27.88310969218997
+31
+251.1840051936814
+12
+16.17067628378762
+22
+-21.31855724963454
+32
+258.08016214835385
+13
+16.17067628378762
+23
+-21.31855724963454
+33
+258.08016214835385
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.17067628378762
+20
+-21.31855724963454
+30
+258.08016214835385
+11
+11.422343049779311
+21
+-27.88310969218997
+31
+251.1840051936814
+12
+11.217600080373392
+22
+-26.156940883262457
+32
+257.08778240659603
+13
+11.217600080373392
+23
+-26.156940883262457
+33
+257.08778240659603
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+11.422343049779311
+20
+-27.88310969218997
+30
+251.1840051936814
+11
+6.243228174346362
+21
+-33.06039922168506
+31
+252.98166671852348
+12
+11.217600080373392
+22
+-26.156940883262457
+32
+257.08778240659603
+13
+11.217600080373392
+23
+-26.156940883262457
+33
+257.08778240659603
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+11.217600080373392
+20
+-26.156940883262457
+30
+257.08778240659603
+11
+6.243228174346362
+21
+-33.06039922168506
+31
+252.98166671852348
+12
+5.516132042280773
+22
+-30.824958895988235
+32
+256.9910390718682
+13
+5.516132042280773
+23
+-30.824958895988235
+33
+256.9910390718682
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+11.777068610443962
+20
+-29.594979957936477
+30
+253.28467414427217
+11
+6.603429772825727
+21
+-34.28246832733743
+31
+255.7933079120588
+12
+11.422343049779311
+22
+-27.88310969218997
+32
+251.1840051936814
+13
+11.422343049779311
+23
+-27.88310969218997
+33
+251.1840051936814
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+11.422343049779311
+20
+-27.88310969218997
+30
+251.1840051936814
+11
+6.603429772825727
+21
+-34.28246832733743
+31
+255.7933079120588
+12
+6.243228174346362
+22
+-33.06039922168506
+32
+252.98166671852348
+13
+6.243228174346362
+23
+-33.06039922168506
+33
+252.98166671852348
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+6.603429772825727
+20
+-34.28246832733743
+30
+255.7933079120588
+11
+0.020623870886214313
+21
+-36.452500423582265
+31
+257.6779775932911
+12
+6.243228174346362
+22
+-33.06039922168506
+32
+252.98166671852348
+13
+6.243228174346362
+23
+-33.06039922168506
+33
+252.98166671852348
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+6.243228174346362
+20
+-33.06039922168506
+30
+252.98166671852348
+11
+0.020623870886214313
+21
+-36.452500423582265
+31
+257.6779775932911
+12
+0.020623870886214313
+22
+-35.328999998594355
+32
+253.0805396235109
+13
+0.020623870886214313
+23
+-35.328999998594355
+33
+253.0805396235109
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+6.243228174346362
+20
+-33.06039922168506
+30
+252.98166671852348
+11
+0.020623870886214313
+21
+-35.328999998594355
+31
+253.0805396235109
+12
+5.516132042280773
+22
+-30.824958895988235
+32
+256.9910390718682
+13
+5.516132042280773
+23
+-30.824958895988235
+33
+256.9910390718682
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+5.516132042280773
+20
+-30.824958895988235
+30
+256.9910390718682
+11
+0.020623870886214313
+21
+-35.328999998594355
+31
+253.0805396235109
+12
+0.020623870886214313
+22
+-33.21737897237517
+32
+258.7610161833143
+13
+0.020623870886214313
+23
+-33.21737897237517
+33
+258.7610161833143
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+5.516132042280773
+20
+-30.824958895988235
+30
+256.9910390718682
+11
+0.020623870886214313
+21
+-33.21737897237517
+31
+258.7610161833143
+12
+0.020623870886214313
+22
+-26.046811678326367
+32
+273.97527457854653
+13
+0.020623870886214313
+23
+-26.046811678326367
+33
+273.97527457854653
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.31044709957069
+20
+-25.341619697519985
+30
+275.48574834244033
+11
+5.516132042280773
+21
+-30.824958895988235
+31
+256.9910390718682
+12
+0.020623870886214313
+22
+-26.046811678326367
+32
+273.97527457854653
+13
+0.020623870886214313
+23
+-26.046811678326367
+33
+273.97527457854653
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+11.217600080373392
+20
+-26.156940883262457
+30
+257.08778240659603
+11
+5.516132042280773
+21
+-30.824958895988235
+31
+256.9910390718682
+12
+7.31044709957069
+22
+-25.341619697519985
+32
+275.48574834244033
+13
+7.31044709957069
+23
+-25.341619697519985
+33
+275.48574834244033
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+11.713181502605547
+20
+-23.59172139139388
+30
+275.41243028058807
+11
+11.217600080373392
+21
+-26.156940883262457
+31
+257.08778240659603
+12
+7.31044709957069
+22
+-25.341619697519985
+32
+275.48574834244033
+13
+7.31044709957069
+23
+-25.341619697519985
+33
+275.48574834244033
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.17067628378762
+20
+-21.31855724963454
+30
+258.08016214835385
+11
+11.217600080373392
+21
+-26.156940883262457
+31
+257.08778240659603
+12
+11.713181502605547
+22
+-23.59172139139388
+32
+275.41243028058807
+13
+11.713181502605547
+23
+-23.59172139139388
+33
+275.41243028058807
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.17067628378762
+20
+-21.31855724963454
+30
+258.08016214835385
+11
+11.713181502605547
+21
+-23.59172139139388
+31
+275.41243028058807
+12
+15.597517659180257
+22
+-19.097719691445796
+32
+270.55974810377825
+13
+15.597517659180257
+23
+-19.097719691445796
+33
+270.55974810377825
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.0702529568494
+20
+-17.60093602208464
+30
+253.8055061853195
+11
+16.17067628378762
+21
+-21.31855724963454
+31
+258.08016214835385
+12
+15.597517659180257
+22
+-19.097719691445796
+32
+270.55974810377825
+13
+15.597517659180257
+23
+-19.097719691445796
+33
+270.55974810377825
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.0702529568494
+20
+-17.60093602208464
+30
+253.8055061853195
+11
+15.597517659180257
+21
+-19.097719691445796
+31
+270.55974810377825
+12
+18.513812019841698
+22
+-14.440957978671987
+32
+269.03345467508774
+13
+18.513812019841698
+23
+-14.440957978671987
+33
+269.03345467508774
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+21.938160999979935
+20
+-7.895267444138602
+30
+249.98110222038642
+11
+18.0702529568494
+21
+-17.60093602208464
+31
+253.8055061853195
+12
+18.513812019841698
+22
+-14.440957978671987
+32
+269.03345467508774
+13
+18.513812019841698
+23
+-14.440957978671987
+33
+269.03345467508774
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+21.938160999979935
+20
+-7.895267444138602
+30
+249.98110222038642
+11
+18.513812019841698
+21
+-14.440957978671987
+31
+269.03345467508774
+12
+21.566703101548093
+22
+-7.275866722433358
+32
+266.2893512812688
+13
+21.566703101548093
+23
+-7.275866722433358
+33
+266.2893512812688
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+21.938160999979935
+20
+-7.895267444138602
+30
+249.98110222038642
+11
+21.566703101548093
+21
+-7.275866722433358
+31
+266.2893512812688
+12
+20.500092624969852
+22
+1.13015554748824
+32
+253.29410509829435
+13
+20.500092624969852
+23
+1.13015554748824
+33
+253.29410509829435
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.811706232767941
+20
+-149.68205544017877
+30
+320.12549593503644
+11
+12.850676246452098
+21
+-154.78207199162432
+31
+331.16762196409496
+12
+7.004701654915481
+22
+-152.18947231067506
+32
+322.4877978034414
+13
+7.004701654915481
+23
+-152.18947231067506
+33
+322.4877978034414
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.935771155898177
+20
+-150.86427115951372
+30
+325.4454666720366
+11
+12.850676246452098
+21
+-154.78207199162432
+31
+331.16762196409496
+12
+14.811706232767941
+22
+-149.68205544017877
+32
+320.12549593503644
+13
+14.811706232767941
+23
+-149.68205544017877
+33
+320.12549593503644
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.95045839521433
+20
+-145.81353894840413
+30
+327.8281515700872
+11
+24.877576409192407
+21
+-150.48885834488306
+31
+328.4804085186838
+12
+26.087780766245533
+22
+-145.86495285899713
+32
+324.8945164230125
+13
+26.087780766245533
+23
+-145.86495285899713
+33
+324.8945164230125
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.34595001516631
+20
+-148.02829202013606
+30
+330.2768531462355
+11
+24.877576409192407
+21
+-150.48885834488306
+31
+328.4804085186838
+12
+33.95045839521433
+22
+-145.81353894840413
+32
+327.8281515700872
+13
+33.95045839521433
+23
+-145.81353894840413
+33
+327.8281515700872
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+24.877576409192407
+20
+-150.48885834488306
+30
+328.4804085186838
+11
+18.935771155898177
+21
+-150.86427115951372
+31
+325.4454666720366
+12
+22.65795574829258
+22
+-145.41987267438878
+32
+321.811202909002
+13
+22.65795574829258
+23
+-145.41987267438878
+33
+321.811202909002
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.65795574829258
+20
+-145.41987267438878
+30
+321.811202909002
+11
+26.087780766245533
+21
+-145.86495285899713
+31
+324.8945164230125
+12
+24.877576409192407
+22
+-150.48885834488306
+32
+328.4804085186838
+13
+24.877576409192407
+23
+-150.48885834488306
+33
+328.4804085186838
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.935771155898177
+20
+-150.86427115951372
+30
+325.4454666720366
+11
+14.811706232767941
+21
+-149.68205544017877
+31
+320.12549593503644
+12
+17.610570004735937
+22
+-142.80415194488927
+32
+315.52501572202743
+13
+17.610570004735937
+23
+-142.80415194488927
+33
+315.52501572202743
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.65795574829258
+20
+-145.41987267438878
+30
+321.811202909002
+11
+18.935771155898177
+21
+-150.86427115951372
+31
+325.4454666720366
+12
+17.610570004735937
+22
+-142.80415194488927
+32
+315.52501572202743
+13
+17.610570004735937
+23
+-142.80415194488927
+33
+315.52501572202743
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.68061809035825
+20
+-121.5732491128939
+30
+304.0758375487455
+11
+75.19664450919596
+21
+-118.40110209655633
+31
+306.13087285088153
+12
+71.71975598846872
+22
+-125.34441382129953
+32
+311.10159406503027
+13
+71.71975598846872
+23
+-125.34441382129953
+33
+311.10159406503027
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.19664450919596
+20
+-118.40110209655633
+30
+306.13087285088153
+11
+73.81187623558249
+21
+-122.58540343565005
+31
+312.1682045416092
+12
+71.71975598846872
+22
+-125.34441382129953
+32
+311.10159406503027
+13
+71.71975598846872
+23
+-125.34441382129953
+33
+311.10159406503027
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.53021735267963
+20
+-114.4410140835379
+30
+279.95784589110536
+11
+73.95686954794336
+21
+-115.65730292705409
+31
+288.8013427375544
+12
+73.95145435499329
+22
+-116.75768230348979
+32
+288.75297107019117
+13
+73.95145435499329
+23
+-116.75768230348979
+33
+288.75297107019117
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.53021735267963
+20
+-114.4410140835379
+30
+279.95784589110536
+11
+75.725459396477
+21
+-113.35036988543962
+31
+280.16958601994145
+12
+73.95686954794336
+22
+-115.65730292705409
+32
+288.8013427375544
+13
+73.95686954794336
+23
+-115.65730292705409
+33
+288.8013427375544
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+73.95145435499329
+20
+-116.75768230348979
+30
+288.75297107019117
+11
+75.91175420293378
+21
+-115.13951312924222
+31
+297.09054286742577
+12
+75.82825679523228
+22
+-116.18787014643806
+32
+297.178159472461
+13
+75.82825679523228
+23
+-116.18787014643806
+33
+297.178159472461
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+73.95145435499329
+20
+-116.75768230348979
+30
+288.75297107019117
+11
+73.95686954794336
+21
+-115.65730292705409
+31
+288.8013427375544
+12
+75.91175420293378
+22
+-115.13951312924222
+32
+297.09054286742577
+13
+75.91175420293378
+23
+-115.13951312924222
+33
+297.09054286742577
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.82825679523228
+20
+-116.18787014643806
+30
+297.178159472461
+11
+75.26457780053079
+21
+-116.71935003879129
+31
+306.4211028550621
+12
+75.19664450919596
+22
+-118.40110209655633
+32
+306.13087285088153
+13
+75.19664450919596
+23
+-118.40110209655633
+33
+306.13087285088153
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.91175420293378
+20
+-115.13951312924222
+30
+297.09054286742577
+11
+75.26457780053079
+21
+-116.71935003879129
+31
+306.4211028550621
+12
+75.82825679523228
+22
+-116.18787014643806
+32
+297.178159472461
+13
+75.82825679523228
+23
+-116.18787014643806
+33
+297.178159472461
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.474840758254
+20
+-121.83731582528625
+30
+279.4309293635981
+11
+73.95145435499329
+21
+-116.75768230348979
+31
+288.75297107019117
+12
+72.41274857392153
+22
+-120.42054315289144
+32
+288.88044106154393
+13
+72.41274857392153
+23
+-120.42054315289144
+33
+288.88044106154393
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+73.95145435499329
+20
+-116.75768230348979
+30
+288.75297107019117
+11
+72.474840758254
+21
+-121.83731582528625
+31
+279.4309293635981
+12
+75.53021735267963
+22
+-114.4410140835379
+32
+279.95784589110536
+13
+75.53021735267963
+23
+-114.4410140835379
+33
+279.95784589110536
+70
+1
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.41274857392153
+20
+-120.42054315289144
+30
+288.88044106154393
+11
+75.82825679523228
+21
+-116.18787014643806
+31
+297.178159472461
+12
+72.95305097164064
+22
+-120.18659464847576
+32
+297.0132698893723
+13
+72.95305097164064
+23
+-120.18659464847576
+33
+297.0132698893723
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+73.95145435499329
+20
+-116.75768230348979
+30
+288.75297107019117
+11
+75.82825679523228
+21
+-116.18787014643806
+31
+297.178159472461
+12
+72.41274857392153
+22
+-120.42054315289144
+32
+288.88044106154393
+13
+72.41274857392153
+23
+-120.42054315289144
+33
+288.88044106154393
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.95305097164064
+20
+-120.18659464847576
+30
+297.0132698893723
+11
+75.82825679523228
+21
+-116.18787014643806
+31
+297.178159472461
+12
+72.68061809035825
+22
+-121.5732491128939
+32
+304.0758375487455
+13
+72.68061809035825
+23
+-121.5732491128939
+33
+304.0758375487455
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.82825679523228
+20
+-116.18787014643806
+30
+297.178159472461
+11
+75.19664450919596
+21
+-118.40110209655633
+31
+306.13087285088153
+12
+72.68061809035825
+22
+-121.5732491128939
+32
+304.0758375487455
+13
+72.68061809035825
+23
+-121.5732491128939
+33
+304.0758375487455
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.04433185952597
+20
+-144.89173924959474
+30
+334.81496737302405
+11
+34.20813639682922
+21
+-150.00209942802164
+31
+338.59495458679476
+12
+34.34595001516631
+22
+-148.02829202013606
+32
+330.2768531462355
+13
+34.34595001516631
+23
+-148.02829202013606
+33
+330.2768531462355
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.04433185952597
+20
+-144.89173924959474
+30
+334.81496737302405
+11
+34.34595001516631
+21
+-148.02829202013606
+31
+330.2768531462355
+12
+41.902273750833814
+22
+-145.16249889709934
+32
+330.98265357568914
+13
+41.902273750833814
+23
+-145.16249889709934
+33
+330.98265357568914
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.64369772641734
+20
+-143.61034640094823
+30
+326.9811910547444
+11
+34.34595001516631
+21
+-148.02829202013606
+31
+330.2768531462355
+12
+33.95045839521433
+22
+-145.81353894840413
+32
+327.8281515700872
+13
+33.95045839521433
+23
+-145.81353894840413
+33
+327.8281515700872
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.902273750833814
+20
+-145.16249889709934
+30
+330.98265357568914
+11
+34.34595001516631
+21
+-148.02829202013606
+31
+330.2768531462355
+12
+40.64369772641734
+22
+-143.61034640094823
+32
+326.9811910547444
+13
+40.64369772641734
+23
+-143.61034640094823
+33
+326.9811910547444
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.371696369673586
+20
+-140.5355511679831
+30
+327.3024519398754
+11
+40.64369772641734
+21
+-143.61034640094823
+31
+326.9811910547444
+12
+49.569669786843214
+22
+-139.79385226841072
+32
+324.080107910236
+13
+49.569669786843214
+23
+-139.79385226841072
+33
+324.080107910236
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.371696369673586
+20
+-140.5355511679831
+30
+327.3024519398754
+11
+41.902273750833814
+21
+-145.16249889709934
+31
+330.98265357568914
+12
+40.64369772641734
+22
+-143.61034640094823
+32
+326.9811910547444
+13
+40.64369772641734
+23
+-143.61034640094823
+33
+326.9811910547444
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+59.433839237092165
+20
+-136.14589841083767
+30
+322.61374667318415
+11
+49.569669786843214
+21
+-139.79385226841072
+31
+324.080107910236
+12
+58.78833606846589
+22
+-135.79604043934114
+32
+320.41572593922024
+13
+58.78833606846589
+23
+-135.79604043934114
+33
+320.41572593922024
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+59.433839237092165
+20
+-136.14589841083767
+30
+322.61374667318415
+11
+50.371696369673586
+21
+-140.5355511679831
+31
+327.3024519398754
+12
+49.569669786843214
+22
+-139.79385226841072
+32
+324.080107910236
+13
+49.569669786843214
+23
+-139.79385226841072
+33
+324.080107910236
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.766944610167144
+20
+-139.769210098246
+30
+330.0675468119862
+11
+43.04433185952597
+21
+-144.89173924959474
+31
+334.81496737302405
+12
+41.902273750833814
+22
+-145.16249889709934
+32
+330.98265357568914
+13
+41.902273750833814
+23
+-145.16249889709934
+33
+330.98265357568914
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.766944610167144
+20
+-139.769210098246
+30
+330.0675468119862
+11
+41.902273750833814
+21
+-145.16249889709934
+31
+330.98265357568914
+12
+50.371696369673586
+22
+-140.5355511679831
+32
+327.3024519398754
+13
+50.371696369673586
+23
+-140.5355511679831
+33
+327.3024519398754
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+58.91775309548711
+20
+-134.89279842423682
+30
+326.13240519346505
+11
+50.766944610167144
+21
+-139.769210098246
+31
+330.0675468119862
+12
+50.371696369673586
+22
+-140.5355511679831
+32
+327.3024519398754
+13
+50.371696369673586
+23
+-140.5355511679831
+33
+327.3024519398754
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+59.433839237092165
+20
+-136.14589841083767
+30
+322.61374667318415
+11
+58.91775309548711
+21
+-134.89279842423682
+31
+326.13240519346505
+12
+50.371696369673586
+22
+-140.5355511679831
+32
+327.3024519398754
+13
+50.371696369673586
+23
+-140.5355511679831
+33
+327.3024519398754
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.12753602687701
+20
+-128.90535952248496
+30
+319.78750271214443
+11
+58.91775309548711
+21
+-134.89279842423682
+31
+326.13240519346505
+12
+59.433839237092165
+22
+-136.14589841083767
+32
+322.61374667318415
+13
+59.433839237092165
+23
+-136.14589841083767
+33
+322.61374667318415
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.12753602687701
+20
+-128.90535952248496
+30
+319.78750271214443
+11
+59.433839237092165
+21
+-136.14589841083767
+31
+322.61374667318415
+12
+67.17774769034617
+22
+-130.522616023765
+32
+316.93296588905963
+13
+67.17774769034617
+23
+-130.522616023765
+33
+316.93296588905963
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.85470653187747
+20
+-130.07844851212593
+30
+314.8405109951907
+11
+59.433839237092165
+21
+-136.14589841083767
+31
+322.61374667318415
+12
+58.78833606846589
+22
+-135.79604043934114
+32
+320.41572593922024
+13
+58.78833606846589
+23
+-135.79604043934114
+33
+320.41572593922024
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+67.17774769034617
+20
+-130.522616023765
+30
+316.93296588905963
+11
+59.433839237092165
+21
+-136.14589841083767
+31
+322.61374667318415
+12
+65.85470653187747
+22
+-130.07844851212593
+32
+314.8405109951907
+13
+65.85470653187747
+23
+-130.07844851212593
+33
+314.8405109951907
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.59044487891194
+20
+-126.33435976847167
+30
+310.96408467101594
+11
+65.85470653187747
+21
+-130.07844851212593
+31
+314.8405109951907
+12
+68.62692025314716
+22
+-126.02374673464742
+32
+309.4161913153885
+13
+68.62692025314716
+23
+-126.02374673464742
+33
+309.4161913153885
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.59044487891194
+20
+-126.33435976847167
+30
+310.96408467101594
+11
+67.17774769034617
+21
+-130.522616023765
+31
+316.93296588905963
+12
+65.85470653187747
+22
+-130.07844851212593
+32
+314.8405109951907
+13
+65.85470653187747
+23
+-130.07844851212593
+33
+314.8405109951907
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.81815678470737
+20
+-123.1692099115614
+30
+302.7728447731648
+11
+68.62692025314716
+21
+-126.02374673464742
+31
+309.4161913153885
+12
+68.73038694541307
+22
+-124.09344340495674
+32
+302.08286400850983
+13
+68.73038694541307
+23
+-124.09344340495674
+33
+302.08286400850983
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.81815678470737
+20
+-123.1692099115614
+30
+302.7728447731648
+11
+70.59044487891194
+21
+-126.33435976847167
+31
+310.96408467101594
+12
+68.62692025314716
+22
+-126.02374673464742
+32
+309.4161913153885
+13
+68.62692025314716
+23
+-126.02374673464742
+33
+309.4161913153885
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.70300787843674
+20
+-122.74238318633489
+30
+297.35217578523805
+11
+68.73038694541307
+21
+-124.09344340495674
+31
+302.08286400850983
+12
+68.71094701117082
+22
+-124.41014092524011
+32
+297.21679596148493
+13
+68.71094701117082
+23
+-124.41014092524011
+33
+297.21679596148493
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.81815678470737
+20
+-123.1692099115614
+30
+302.7728447731648
+11
+68.73038694541307
+21
+-124.09344340495674
+31
+302.08286400850983
+12
+70.70300787843674
+22
+-122.74238318633489
+32
+297.35217578523805
+13
+70.70300787843674
+23
+-122.74238318633489
+33
+297.35217578523805
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.25217785412377
+20
+-123.62007035830317
+30
+288.7286331243461
+11
+68.71094701117082
+21
+-124.41014092524011
+31
+297.21679596148493
+12
+67.34993865718677
+22
+-126.15578009084169
+32
+289.76482116861973
+13
+67.34993865718677
+23
+-126.15578009084169
+33
+289.76482116861973
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.70300787843674
+20
+-122.74238318633489
+30
+297.35217578523805
+11
+68.71094701117082
+21
+-124.41014092524011
+31
+297.21679596148493
+12
+70.25217785412377
+22
+-123.62007035830317
+32
+288.7286331243461
+13
+70.25217785412377
+23
+-123.62007035830317
+33
+288.7286331243461
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.88557177259584
+20
+-127.64404547915105
+30
+280.61253663428397
+11
+67.34993865718677
+21
+-126.15578009084169
+31
+289.76482116861973
+12
+64.83741081806401
+22
+-131.04253539183142
+32
+282.8498023059193
+13
+64.83741081806401
+23
+-131.04253539183142
+33
+282.8498023059193
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.25217785412377
+20
+-123.62007035830317
+30
+288.7286331243461
+11
+67.34993865718677
+21
+-126.15578009084169
+31
+289.76482116861973
+12
+68.88557177259584
+22
+-127.64404547915105
+32
+280.61253663428397
+13
+68.88557177259584
+23
+-127.64404547915105
+33
+280.61253663428397
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+57.68725697608723
+20
+-82.77612964424473
+30
+288.0207031246426
+11
+52.02393866810381
+21
+-88.55182841715937
+31
+288.9376352342837
+12
+47.60647980783381
+22
+-87.03374904518896
+32
+285.89965114440656
+13
+47.60647980783381
+23
+-87.03374904518896
+33
+285.89965114440656
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+49.81168023582154
+20
+-78.95050878201525
+30
+282.38951090517315
+11
+57.68725697608723
+21
+-82.77612964424473
+31
+288.0207031246426
+12
+47.60647980783381
+22
+-87.03374904518896
+32
+285.89965114440656
+13
+47.60647980783381
+23
+-87.03374904518896
+33
+285.89965114440656
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+52.02393866810381
+20
+-88.55182841715937
+30
+288.9376352342837
+11
+47.90887878493556
+21
+-94.31140330095366
+31
+292.9777342442533
+12
+45.24174414484389
+22
+-95.03849943301859
+32
+290.4328977820236
+13
+45.24174414484389
+23
+-95.03849943301859
+33
+290.4328977820236
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.60647980783381
+20
+-87.03374904518896
+30
+285.89965114440656
+11
+52.02393866810381
+21
+-88.55182841715937
+31
+288.9376352342837
+12
+45.24174414484389
+22
+-95.03849943301859
+32
+290.4328977820236
+13
+45.24174414484389
+23
+-95.03849943301859
+33
+290.4328977820236
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+60.286610437005585
+20
+-71.97312393309284
+30
+282.23283537880934
+11
+57.68725697608723
+21
+-82.77612964424473
+31
+288.0207031246426
+12
+49.81168023582154
+22
+-78.95050878201525
+32
+282.38951090517315
+13
+49.81168023582154
+23
+-78.95050878201525
+33
+282.38951090517315
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+56.07060892345266
+20
+-71.42186945974356
+30
+279.18024852142617
+11
+60.286610437005585
+21
+-71.97312393309284
+31
+282.23283537880934
+12
+49.81168023582154
+22
+-78.95050878201525
+32
+282.38951090517315
+13
+49.81168023582154
+23
+-78.95050878201525
+33
+282.38951090517315
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.32503621320006
+20
+-67.98748107694438
+30
+276.7199864210026
+11
+60.286610437005585
+21
+-71.97312393309284
+31
+282.23283537880934
+12
+56.07060892345266
+22
+-71.42186945974356
+32
+279.18024852142617
+13
+56.07060892345266
+23
+-71.42186945974356
+33
+279.18024852142617
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.32503621320006
+20
+-67.98748107694438
+30
+276.7199864210026
+11
+56.07060892345266
+21
+-71.42186945974356
+31
+279.18024852142617
+12
+60.57166862769407
+22
+-69.95915891456646
+32
+276.0683379210504
+13
+60.57166862769407
+23
+-69.95915891456646
+33
+276.0683379210504
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.07237167847732
+20
+-44.53208999488541
+30
+284.2236793487902
+11
+83.00669133027883
+21
+-31.566353571243905
+31
+285.3231460522601
+12
+85.62947006407128
+22
+-27.633341522983965
+32
+289.65834265558107
+13
+85.62947006407128
+23
+-27.633341522983965
+33
+289.65834265558107
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.07237167847732
+20
+-44.53208999488541
+30
+284.2236793487902
+11
+85.62947006407128
+21
+-27.633341522983965
+31
+289.65834265558107
+12
+83.91638290103303
+22
+-35.39775469561103
+32
+291.0921518900666
+13
+83.91638290103303
+23
+-35.39775469561103
+33
+291.0921518900666
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.36973270078948
+20
+-47.7465241921251
+30
+280.52157356171557
+11
+81.55447652424746
+21
+-35.010781356702026
+31
+282.2349649490801
+12
+83.00669133027883
+22
+-31.566353571243905
+32
+285.3231460522601
+13
+83.00669133027883
+23
+-31.566353571243905
+33
+285.3231460522601
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.36973270078948
+20
+-47.7465241921251
+30
+280.52157356171557
+11
+83.00669133027883
+21
+-31.566353571243905
+31
+285.3231460522601
+12
+80.07237167847732
+22
+-44.53208999488541
+32
+284.2236793487902
+13
+80.07237167847732
+23
+-44.53208999488541
+33
+284.2236793487902
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+83.92821722719928
+20
+-19.840939712634775
+30
+279.40020270699733
+11
+85.81267395140596
+21
+-19.028356545795837
+31
+282.92038234889344
+12
+81.55447652424746
+22
+-35.010781356702026
+32
+282.2349649490801
+13
+81.55447652424746
+23
+-35.010781356702026
+33
+282.2349649490801
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+81.55447652424746
+20
+-35.010781356702026
+30
+282.2349649490801
+11
+85.81267395140596
+21
+-19.028356545795837
+31
+282.92038234889344
+12
+83.00669133027883
+22
+-31.566353571243905
+32
+285.3231460522601
+13
+83.00669133027883
+23
+-31.566353571243905
+33
+285.3231460522601
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+85.81267395140596
+20
+-19.028356545795837
+30
+282.92038234889344
+11
+87.15813644248266
+21
+-14.889080406514347
+31
+285.79773599620677
+12
+83.00669133027883
+22
+-31.566353571243905
+32
+285.3231460522601
+13
+83.00669133027883
+23
+-31.566353571243905
+33
+285.3231460522601
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+83.00669133027883
+20
+-31.566353571243905
+30
+285.3231460522601
+11
+87.15813644248266
+21
+-14.889080406514347
+31
+285.79773599620677
+12
+85.62947006407128
+22
+-27.633341522983965
+32
+289.65834265558107
+13
+85.62947006407128
+23
+-27.633341522983965
+33
+289.65834265558107
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+85.13017710509803
+20
+-4.794917368044837
+30
+276.80881992334656
+11
+86.04896498311113
+21
+-1.7551079322308865
+31
+283.4132257522227
+12
+85.81267395140596
+22
+-19.028356545795837
+32
+282.92038234889344
+13
+85.81267395140596
+23
+-19.028356545795837
+33
+282.92038234889344
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+85.81267395140596
+20
+-19.028356545795837
+30
+282.92038234889344
+11
+86.04896498311113
+21
+-1.7551079322308865
+31
+283.4132257522227
+12
+87.15813644248266
+22
+-14.889080406514347
+32
+285.79773599620677
+13
+87.15813644248266
+23
+-14.889080406514347
+33
+285.79773599620677
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+82.87103770463536
+20
+-8.8830838210554
+30
+272.45719520658133
+11
+85.13017710509803
+21
+-4.794917368044837
+31
+276.80881992334656
+12
+83.92821722719928
+22
+-19.840939712634775
+32
+279.40020270699733
+13
+83.92821722719928
+23
+-19.840939712634775
+33
+279.40020270699733
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+85.13017710509803
+20
+-4.794917368044837
+30
+276.80881992334656
+11
+85.81267395140596
+21
+-19.028356545795837
+31
+282.92038234889344
+12
+83.92821722719928
+22
+-19.840939712634775
+32
+279.40020270699733
+13
+83.92821722719928
+23
+-19.840939712634775
+33
+279.40020270699733
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.19664450919596
+20
+-118.40110209655633
+30
+306.13087285088153
+11
+72.6749290955174
+21
+-120.87475006719644
+31
+313.40213839585994
+12
+73.81187623558249
+22
+-122.58540343565005
+32
+312.1682045416092
+13
+73.81187623558249
+23
+-122.58540343565005
+33
+312.1682045416092
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.19664450919596
+20
+-118.40110209655633
+30
+306.13087285088153
+11
+75.26457780053079
+21
+-116.71935003879129
+31
+306.4211028550621
+12
+72.6749290955174
+22
+-120.87475006719644
+32
+313.40213839585994
+13
+72.6749290955174
+23
+-120.87475006719644
+33
+313.40213839585994
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+73.81187623558249
+20
+-122.58540343565005
+30
+312.1682045416092
+11
+72.6749290955174
+21
+-120.87475006719644
+31
+313.40213839585994
+12
+68.67745191320414
+22
+-126.2005010663375
+32
+324.327746509194
+13
+68.67745191320414
+23
+-126.2005010663375
+33
+324.327746509194
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.6749290955174
+20
+-120.87475006719644
+30
+313.40213839585994
+11
+69.59739584364476
+21
+-121.66390796116451
+31
+322.42634449019516
+12
+68.67745191320414
+22
+-126.2005010663375
+32
+324.327746509194
+13
+68.67745191320414
+23
+-126.2005010663375
+33
+324.327746509194
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+71.71975598846872
+20
+-125.34441382129953
+30
+311.10159406503027
+11
+68.67745191320414
+21
+-126.2005010663375
+31
+324.327746509194
+12
+68.12753602687701
+22
+-128.90535952248496
+32
+319.78750271214443
+13
+68.12753602687701
+23
+-128.90535952248496
+33
+319.78750271214443
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+71.71975598846872
+20
+-125.34441382129953
+30
+311.10159406503027
+11
+73.81187623558249
+21
+-122.58540343565005
+31
+312.1682045416092
+12
+68.67745191320414
+22
+-126.2005010663375
+32
+324.327746509194
+13
+68.67745191320414
+23
+-126.2005010663375
+33
+324.327746509194
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+21.92447090544313
+20
+-153.68351796112853
+30
+337.6317803800492
+11
+0.020623870886214313
+21
+-153.18154782811376
+31
+343.01198753301173
+12
+0.020623870886214313
+22
+-154.09787148910831
+32
+335.4988636512156
+13
+0.020623870886214313
+23
+-154.09787148910831
+33
+335.4988636512156
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+21.92447090544313
+20
+-153.68351796112853
+30
+337.6317803800492
+11
+18.944593661266335
+21
+-152.10428950022992
+31
+346.14488961167785
+12
+0.020623870886214313
+22
+-153.18154782811376
+32
+343.01198753301173
+13
+0.020623870886214313
+23
+-153.18154782811376
+33
+343.01198753301173
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.20813639682922
+20
+-150.00209942802164
+30
+338.59495458679476
+11
+18.944593661266335
+21
+-152.10428950022992
+31
+346.14488961167785
+12
+21.92447090544313
+22
+-153.68351796112853
+32
+337.6317803800492
+13
+21.92447090544313
+23
+-153.68351796112853
+33
+337.6317803800492
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.20813639682922
+20
+-150.00209942802164
+30
+338.59495458679476
+11
+33.92399087910983
+21
+-149.0343618564325
+31
+342.89546961728837
+12
+18.944593661266335
+22
+-152.10428950022992
+32
+346.14488961167785
+13
+18.944593661266335
+23
+-152.10428950022992
+33
+346.14488961167785
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.04433185952597
+20
+-144.89173924959474
+30
+334.81496737302405
+11
+33.92399087910983
+21
+-149.0343618564325
+31
+342.89546961728837
+12
+34.20813639682922
+22
+-150.00209942802164
+32
+338.59495458679476
+13
+34.20813639682922
+23
+-150.00209942802164
+33
+338.59495458679476
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.24632215985701
+20
+-142.7320507803351
+30
+339.3561238430427
+11
+33.92399087910983
+21
+-149.0343618564325
+31
+342.89546961728837
+12
+43.04433185952597
+22
+-144.89173924959474
+32
+334.81496737302405
+13
+43.04433185952597
+23
+-144.89173924959474
+33
+334.81496737302405
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.766944610167144
+20
+-139.769210098246
+30
+330.0675468119862
+11
+44.24632215985701
+21
+-142.7320507803351
+31
+339.3561238430427
+12
+43.04433185952597
+22
+-144.89173924959474
+32
+334.81496737302405
+13
+43.04433185952597
+23
+-144.89173924959474
+33
+334.81496737302405
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.766944610167144
+20
+-139.769210098246
+30
+330.0675468119862
+11
+50.5186671401342
+21
+-138.34422336912806
+31
+335.0963748718378
+12
+44.24632215985701
+22
+-142.7320507803351
+32
+339.3561238430427
+13
+44.24632215985701
+23
+-142.7320507803351
+33
+339.3561238430427
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+58.91775309548711
+20
+-134.89279842423682
+30
+326.13240519346505
+11
+50.5186671401342
+21
+-138.34422336912806
+31
+335.0963748718378
+12
+50.766944610167144
+22
+-139.769210098246
+32
+330.0675468119862
+13
+50.766944610167144
+23
+-139.769210098246
+33
+330.0675468119862
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+58.91775309548711
+20
+-134.89279842423682
+30
+326.13240519346505
+11
+58.2985653308038
+21
+-133.73887556694706
+31
+329.75389153493353
+12
+50.5186671401342
+22
+-138.34422336912806
+32
+335.0963748718378
+13
+50.5186671401342
+23
+-138.34422336912806
+33
+335.0963748718378
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.12753602687701
+20
+-128.90535952248496
+30
+319.78750271214443
+11
+58.2985653308038
+21
+-133.73887556694706
+31
+329.75389153493353
+12
+58.91775309548711
+22
+-134.89279842423682
+32
+326.13240519346505
+13
+58.91775309548711
+23
+-134.89279842423682
+33
+326.13240519346505
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.67745191320414
+20
+-126.2005010663375
+30
+324.327746509194
+11
+58.2985653308038
+21
+-133.73887556694706
+31
+329.75389153493353
+12
+68.12753602687701
+22
+-128.90535952248496
+32
+319.78750271214443
+13
+68.12753602687701
+23
+-128.90535952248496
+33
+319.78750271214443
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+21.92447090544313
+20
+-153.68351796112853
+30
+337.6317803800492
+11
+0.020623870886214313
+21
+-154.09787148910831
+31
+335.4988636512156
+12
+0.020623870886214313
+22
+-154.92870811532882
+32
+328.83178761179386
+13
+0.020623870886214313
+23
+-154.92870811532882
+33
+328.83178761179386
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+21.92447090544313
+20
+-153.68351796112853
+30
+337.6317803800492
+11
+0.020623870886214313
+21
+-154.92870811532882
+31
+328.83178761179386
+12
+12.850676246452098
+22
+-154.78207199162432
+32
+331.16762196409496
+13
+12.850676246452098
+23
+-154.78207199162432
+33
+331.16762196409496
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+12.850676246452098
+20
+-154.78207199162432
+30
+331.16762196409496
+11
+0.020623870886214313
+21
+-154.92870811532882
+31
+328.83178761179386
+12
+0.020623870886214313
+22
+-151.98442511694574
+32
+321.0725462526594
+13
+0.020623870886214313
+23
+-151.98442511694574
+33
+321.0725462526594
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+12.850676246452098
+20
+-154.78207199162432
+30
+331.16762196409496
+11
+0.020623870886214313
+21
+-151.98442511694574
+31
+321.0725462526594
+12
+7.004701654915481
+22
+-152.18947231067506
+32
+322.4877978034414
+13
+7.004701654915481
+23
+-152.18947231067506
+33
+322.4877978034414
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.20813639682922
+20
+-150.00209942802164
+30
+338.59495458679476
+11
+21.92447090544313
+21
+-153.68351796112853
+31
+337.6317803800492
+12
+24.877576409192407
+22
+-150.48885834488306
+32
+328.4804085186838
+13
+24.877576409192407
+23
+-150.48885834488306
+33
+328.4804085186838
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.34595001516631
+20
+-148.02829202013606
+30
+330.2768531462355
+11
+34.20813639682922
+21
+-150.00209942802164
+31
+338.59495458679476
+12
+24.877576409192407
+22
+-150.48885834488306
+32
+328.4804085186838
+13
+24.877576409192407
+23
+-150.48885834488306
+33
+328.4804085186838
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+21.92447090544313
+20
+-153.68351796112853
+30
+337.6317803800492
+11
+12.850676246452098
+21
+-154.78207199162432
+31
+331.16762196409496
+12
+18.935771155898177
+22
+-150.86427115951372
+32
+325.4454666720366
+13
+18.935771155898177
+23
+-150.86427115951372
+33
+325.4454666720366
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+24.877576409192407
+20
+-150.48885834488306
+30
+328.4804085186838
+11
+21.92447090544313
+21
+-153.68351796112853
+31
+337.6317803800492
+12
+18.935771155898177
+22
+-150.86427115951372
+32
+325.4454666720366
+13
+18.935771155898177
+23
+-150.86427115951372
+33
+325.4454666720366
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+71.12426729855022
+20
+-125.04809933064918
+30
+274.72305796455333
+11
+74.71928612391389
+21
+-117.38803510082514
+31
+275.0120710714433
+12
+72.474840758254
+22
+-121.83731582528625
+32
+279.4309293635981
+13
+72.474840758254
+23
+-121.83731582528625
+33
+279.4309293635981
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+74.71928612391389
+20
+-117.38803510082514
+30
+275.0120710714433
+11
+75.53021735267963
+21
+-114.4410140835379
+31
+279.95784589110536
+12
+72.474840758254
+22
+-121.83731582528625
+32
+279.4309293635981
+13
+72.474840758254
+23
+-121.83731582528625
+33
+279.4309293635981
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+82.27004255446977
+20
+-97.30375374237018
+30
+273.9454605948702
+11
+78.31767179986072
+21
+-106.36537942843987
+31
+274.99168804180243
+12
+79.79898961730709
+22
+-105.3018111950921
+32
+275.1590114194747
+13
+79.79898961730709
+23
+-105.3018111950921
+33
+275.1590114194747
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+81.40065157978867
+20
+-97.7746929944359
+30
+273.1882462548235
+11
+78.31767179986072
+21
+-106.36537942843987
+31
+274.99168804180243
+12
+82.27004255446977
+22
+-97.30375374237018
+32
+273.9454605948702
+13
+82.27004255446977
+23
+-97.30375374237018
+33
+273.9454605948702
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+76.5269900936608
+20
+-113.11581293237445
+30
+275.01785133358214
+11
+79.79898961730709
+21
+-105.3018111950921
+31
+275.1590114194747
+12
+75.725459396477
+22
+-113.35036988543962
+32
+280.16958601994145
+13
+75.725459396477
+23
+-113.35036988543962
+33
+280.16958601994145
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+79.79898961730709
+20
+-105.3018111950921
+30
+275.1590114194747
+11
+78.31767179986072
+21
+-106.36537942843987
+31
+274.99168804180243
+12
+75.725459396477
+22
+-113.35036988543962
+32
+280.16958601994145
+13
+75.725459396477
+23
+-113.35036988543962
+33
+280.16958601994145
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+74.71928612391389
+20
+-117.38803510082514
+30
+275.0120710714433
+11
+75.725459396477
+21
+-113.35036988543962
+31
+280.16958601994145
+12
+75.53021735267963
+22
+-114.4410140835379
+32
+279.95784589110536
+13
+75.53021735267963
+23
+-114.4410140835379
+33
+279.95784589110536
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+74.71928612391389
+20
+-117.38803510082514
+30
+275.0120710714433
+11
+76.5269900936608
+21
+-113.11581293237445
+31
+275.01785133358214
+12
+75.725459396477
+22
+-113.35036988543962
+32
+280.16958601994145
+13
+75.725459396477
+23
+-113.35036988543962
+33
+280.16958601994145
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+84.71999145034319
+20
+-75.9706315378368
+30
+275.89371315962387
+11
+84.0089279401018
+21
+-76.2718136176464
+31
+275.8027500870346
+12
+84.27086508223925
+22
+-88.47090474722707
+32
+275.1632705600016
+13
+84.27086508223925
+23
+-88.47090474722707
+33
+275.1632705600016
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+84.0089279401018
+20
+-76.2718136176464
+30
+275.8027500870346
+11
+83.24806290817882
+21
+-88.51653839568291
+31
+274.2636792367721
+12
+84.27086508223925
+22
+-88.47090474722707
+32
+275.1632705600016
+13
+84.27086508223925
+23
+-88.47090474722707
+33
+275.1632705600016
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+83.50531499574137
+20
+-65.45055444711346
+30
+275.21316334898614
+11
+82.67198373007028
+21
+-66.0148905663526
+31
+275.1307185574421
+12
+84.71999145034319
+22
+-75.9706315378368
+32
+275.89371315962387
+13
+84.71999145034319
+23
+-75.9706315378368
+33
+275.89371315962387
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+82.67198373007028
+20
+-66.0148905663526
+30
+275.1307185574421
+11
+84.0089279401018
+21
+-76.2718136176464
+31
+275.8027500870346
+12
+84.71999145034319
+22
+-75.9706315378368
+32
+275.89371315962387
+13
+84.71999145034319
+23
+-75.9706315378368
+33
+275.89371315962387
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+81.83177699469834
+20
+-56.286709388502864
+30
+276.46930557882064
+11
+81.22467910461268
+21
+-57.003766117908334
+31
+276.94298284979345
+12
+83.50531499574137
+22
+-65.45055444711346
+32
+275.21316334898614
+13
+83.50531499574137
+23
+-65.45055444711346
+33
+275.21316334898614
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+81.22467910461268
+20
+-57.003766117908334
+30
+276.94298284979345
+11
+82.67198373007028
+21
+-66.0148905663526
+31
+275.1307185574421
+12
+83.50531499574137
+22
+-65.45055444711346
+32
+275.21316334898614
+13
+83.50531499574137
+23
+-65.45055444711346
+33
+275.21316334898614
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+81.83177699469834
+20
+-56.286709388502864
+30
+276.46930557882064
+11
+80.24419757613026
+21
+-47.229951291602795
+31
+279.162299286373
+12
+80.36973270078948
+22
+-47.7465241921251
+32
+280.52157356171557
+13
+80.36973270078948
+23
+-47.7465241921251
+33
+280.52157356171557
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+81.83177699469834
+20
+-56.286709388502864
+30
+276.46930557882064
+11
+80.36973270078948
+21
+-47.7465241921251
+31
+280.52157356171557
+12
+81.22467910461268
+22
+-57.003766117908334
+32
+276.94298284979345
+13
+81.22467910461268
+23
+-57.003766117908334
+33
+276.94298284979345
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.24419757613026
+20
+-47.229951291602795
+30
+279.162299286373
+11
+79.0290556583142
+21
+-34.99830815945657
+31
+279.3673464801051
+12
+81.55447652424746
+22
+-35.010781356702026
+32
+282.2349649490801
+13
+81.55447652424746
+23
+-35.010781356702026
+33
+282.2349649490801
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.24419757613026
+20
+-47.229951291602795
+30
+279.162299286373
+11
+81.55447652424746
+21
+-35.010781356702026
+31
+282.2349649490801
+12
+80.36973270078948
+22
+-47.7465241921251
+32
+280.52157356171557
+13
+80.36973270078948
+23
+-47.7465241921251
+33
+280.52157356171557
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+83.92821722719928
+20
+-19.840939712634775
+30
+279.40020270699733
+11
+79.0290556583142
+21
+-34.99830815945657
+31
+279.3673464801051
+12
+80.01915371764788
+22
+-20.612148371540492
+32
+276.76744541540904
+13
+80.01915371764788
+23
+-20.612148371540492
+33
+276.76744541540904
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+79.0290556583142
+20
+-34.99830815945657
+30
+279.3673464801051
+11
+83.92821722719928
+21
+-19.840939712634775
+31
+279.40020270699733
+12
+81.55447652424746
+22
+-35.010781356702026
+32
+282.2349649490801
+13
+81.55447652424746
+23
+-35.010781356702026
+33
+282.2349649490801
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+78.89549509601319
+20
+-12.224988009648744
+30
+268.8925988135208
+11
+82.87103770463536
+21
+-8.8830838210554
+31
+272.45719520658133
+12
+80.01915371764788
+22
+-20.612148371540492
+32
+276.76744541540904
+13
+80.01915371764788
+23
+-20.612148371540492
+33
+276.76744541540904
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+82.87103770463536
+20
+-8.8830838210554
+30
+272.45719520658133
+11
+83.92821722719928
+21
+-19.840939712634775
+31
+279.40020270699733
+12
+80.01915371764788
+22
+-20.612148371540492
+32
+276.76744541540904
+13
+80.01915371764788
+23
+-20.612148371540492
+33
+276.76744541540904
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+66.20252620040911
+20
+-131.70483174308785
+30
+276.2210585312006
+11
+61.30141151137013
+21
+-135.90616964426974
+31
+274.45899125215175
+12
+61.25523025913265
+22
+-135.54748916740476
+32
+271.1490306174767
+13
+61.25523025913265
+23
+-135.54748916740476
+33
+271.1490306174767
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+67.16925983173333
+20
+-130.70910553377666
+30
+271.40944663800013
+11
+66.20252620040911
+21
+-131.70483174308785
+31
+276.2210585312006
+12
+61.25523025913265
+22
+-135.54748916740476
+32
+271.1490306174767
+13
+61.25523025913265
+23
+-135.54748916740476
+33
+271.1490306174767
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.96990387703973
+20
+-125.1421046464675
+30
+270.69817017073404
+11
+66.20252620040911
+21
+-131.70483174308785
+31
+276.2210585312006
+12
+67.16925983173333
+22
+-130.70910553377666
+32
+271.40944663800013
+13
+67.16925983173333
+23
+-130.70910553377666
+33
+271.40944663800013
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.96990387703973
+20
+-125.1421046464675
+30
+270.69817017073404
+11
+71.12426729855022
+21
+-125.04809933064918
+31
+274.72305796455333
+12
+66.20252620040911
+22
+-131.70483174308785
+32
+276.2210585312006
+13
+66.20252620040911
+23
+-131.70483174308785
+33
+276.2210585312006
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+73.60865438779177
+20
+-119.08986596390984
+30
+271.0322084774336
+11
+76.65420453658321
+21
+-112.96370077085386
+31
+272.84660234004576
+12
+74.71928612391389
+22
+-117.38803510082514
+32
+275.0120710714433
+13
+74.71928612391389
+23
+-117.38803510082514
+33
+275.0120710714433
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+76.65420453658321
+20
+-112.96370077085386
+30
+272.84660234004576
+11
+76.5269900936608
+21
+-113.11581293237445
+31
+275.01785133358214
+12
+74.71928612391389
+22
+-117.38803510082514
+32
+275.0120710714433
+13
+74.71928612391389
+23
+-117.38803510082514
+33
+275.0120710714433
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+76.65420453658321
+20
+-112.96370077085386
+30
+272.84660234004576
+11
+79.60307219551254
+21
+-105.75510543642116
+31
+273.20284902232703
+12
+76.5269900936608
+22
+-113.11581293237445
+32
+275.01785133358214
+13
+76.5269900936608
+23
+-113.11581293237445
+33
+275.01785133358214
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+79.60307219551254
+20
+-105.75510543642116
+30
+273.20284902232703
+11
+79.79898961730709
+21
+-105.3018111950921
+31
+275.1590114194747
+12
+76.5269900936608
+22
+-113.11581293237445
+32
+275.01785133358214
+13
+76.5269900936608
+23
+-113.11581293237445
+33
+275.01785133358214
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.96990387703973
+20
+-125.1421046464675
+30
+270.69817017073404
+11
+73.60865438779177
+21
+-119.08986596390984
+31
+271.0322084774336
+12
+71.12426729855022
+22
+-125.04809933064918
+32
+274.72305796455333
+13
+71.12426729855022
+23
+-125.04809933064918
+33
+274.72305796455333
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+73.60865438779177
+20
+-119.08986596390984
+30
+271.0322084774336
+11
+74.71928612391389
+21
+-117.38803510082514
+31
+275.0120710714433
+12
+71.12426729855022
+22
+-125.04809933064918
+32
+274.72305796455333
+13
+71.12426729855022
+23
+-125.04809933064918
+33
+274.72305796455333
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+82.2862881333201
+20
+-97.20457661305868
+30
+272.1906946995755
+11
+79.79898961730709
+21
+-105.3018111950921
+31
+275.1590114194747
+12
+79.60307219551254
+22
+-105.75510543642116
+32
+273.20284902232703
+13
+79.60307219551254
+23
+-105.75510543642116
+33
+273.20284902232703
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+82.2862881333201
+20
+-97.20457661305868
+30
+272.1906946995755
+11
+82.27004255446977
+21
+-97.30375374237018
+31
+273.9454605948702
+12
+79.79898961730709
+22
+-105.3018111950921
+32
+275.1590114194747
+13
+79.79898961730709
+23
+-105.3018111950921
+33
+275.1590114194747
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+84.32769418578312
+20
+-88.822892288984
+30
+273.9323789489817
+11
+84.77097944688468
+21
+-75.41085878344289
+31
+274.7714296319295
+12
+84.71999145034319
+22
+-75.9706315378368
+32
+275.89371315962387
+13
+84.71999145034319
+23
+-75.9706315378368
+33
+275.89371315962387
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+84.32769418578312
+20
+-88.822892288984
+30
+273.9323789489817
+11
+84.71999145034319
+21
+-75.9706315378368
+31
+275.89371315962387
+12
+84.27086508223925
+22
+-88.47090474722707
+32
+275.1632705600016
+13
+84.27086508223925
+23
+-88.47090474722707
+33
+275.1632705600016
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+83.14928127048766
+20
+-65.01034185167424
+30
+273.88157348704016
+11
+83.50531499574137
+21
+-65.45055444711346
+31
+275.21316334898614
+12
+84.77097944688468
+22
+-75.41085878344289
+32
+274.7714296319295
+13
+84.77097944688468
+23
+-75.41085878344289
+33
+274.7714296319295
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+84.77097944688468
+20
+-75.41085878344289
+30
+274.7714296319295
+11
+83.50531499574137
+21
+-65.45055444711346
+31
+275.21316334898614
+12
+84.71999145034319
+22
+-75.9706315378368
+32
+275.89371315962387
+13
+84.71999145034319
+23
+-75.9706315378368
+33
+275.89371315962387
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+83.14928127048766
+20
+-65.01034185167424
+30
+273.88157348704016
+11
+81.42619729619436
+21
+-55.74671121510647
+31
+274.8785165936446
+12
+81.83177699469834
+22
+-56.286709388502864
+32
+276.46930557882064
+13
+81.83177699469834
+23
+-56.286709388502864
+33
+276.46930557882064
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+83.14928127048766
+20
+-65.01034185167424
+30
+273.88157348704016
+11
+81.83177699469834
+21
+-56.286709388502864
+31
+276.46930557882064
+12
+83.50531499574137
+22
+-65.45055444711346
+32
+275.21316334898614
+13
+83.50531499574137
+23
+-65.45055444711346
+33
+275.21316334898614
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+81.42619729619436
+20
+-55.74671121510647
+30
+274.8785165936446
+11
+79.16973202753113
+21
+-46.62910825359825
+31
+277.0877936275634
+12
+80.24419757613026
+22
+-47.229951291602795
+32
+279.162299286373
+13
+80.24419757613026
+23
+-47.229951291602795
+33
+279.162299286373
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+81.42619729619436
+20
+-55.74671121510647
+30
+274.8785165936446
+11
+80.24419757613026
+21
+-47.229951291602795
+31
+279.162299286373
+12
+81.83177699469834
+22
+-56.286709388502864
+32
+276.46930557882064
+13
+81.83177699469834
+23
+-56.286709388502864
+33
+276.46930557882064
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+79.0290556583142
+20
+-34.99830815945657
+30
+279.3673464801051
+11
+79.16973202753113
+21
+-46.62910825359825
+31
+277.0877936275634
+12
+75.83455423871915
+22
+-35.37980546054849
+32
+278.07621845312326
+13
+75.83455423871915
+23
+-35.37980546054849
+33
+278.07621845312326
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+79.16973202753113
+20
+-46.62910825359825
+30
+277.0877936275634
+11
+79.0290556583142
+21
+-34.99830815945657
+31
+279.3673464801051
+12
+80.24419757613026
+22
+-47.229951291602795
+32
+279.162299286373
+13
+80.24419757613026
+23
+-47.229951291602795
+33
+279.162299286373
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.01915371764788
+20
+-20.612148371540492
+30
+276.76744541540904
+11
+75.83455423871915
+21
+-35.37980546054849
+31
+278.07621845312326
+12
+75.57310081325534
+22
+-20.959268324129074
+32
+276.6253726565492
+13
+75.57310081325534
+23
+-20.959268324129074
+33
+276.6253726565492
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.01915371764788
+20
+-20.612148371540492
+30
+276.76744541540904
+11
+79.0290556583142
+21
+-34.99830815945657
+31
+279.3673464801051
+12
+75.83455423871915
+22
+-35.37980546054849
+32
+278.07621845312326
+13
+75.83455423871915
+23
+-35.37980546054849
+33
+278.07621845312326
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.59044487891194
+20
+-126.33435976847167
+30
+310.96408467101594
+11
+68.12753602687701
+21
+-128.90535952248496
+31
+319.78750271214443
+12
+67.17774769034617
+22
+-130.522616023765
+32
+316.93296588905963
+13
+67.17774769034617
+23
+-130.522616023765
+33
+316.93296588905963
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+71.71975598846872
+20
+-125.34441382129953
+30
+311.10159406503027
+11
+68.12753602687701
+21
+-128.90535952248496
+31
+319.78750271214443
+12
+70.59044487891194
+22
+-126.33435976847167
+32
+310.96408467101594
+13
+70.59044487891194
+23
+-126.33435976847167
+33
+310.96408467101594
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+71.71975598846872
+20
+-125.34441382129953
+30
+311.10159406503027
+11
+70.59044487891194
+21
+-126.33435976847167
+31
+310.96408467101594
+12
+70.81815678470737
+22
+-123.1692099115614
+32
+302.7728447731648
+13
+70.81815678470737
+23
+-123.1692099115614
+33
+302.7728447731648
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.81815678470737
+20
+-123.1692099115614
+30
+302.7728447731648
+11
+72.68061809035825
+21
+-121.5732491128939
+31
+304.0758375487455
+12
+71.71975598846872
+22
+-125.34441382129953
+32
+311.10159406503027
+13
+71.71975598846872
+23
+-125.34441382129953
+33
+311.10159406503027
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.68061809035825
+20
+-121.5732491128939
+30
+304.0758375487455
+11
+70.81815678470737
+21
+-123.1692099115614
+31
+302.7728447731648
+12
+70.70300787843674
+22
+-122.74238318633489
+32
+297.35217578523805
+13
+70.70300787843674
+23
+-122.74238318633489
+33
+297.35217578523805
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.95305097164064
+20
+-120.18659464847576
+30
+297.0132698893723
+11
+72.68061809035825
+21
+-121.5732491128939
+31
+304.0758375487455
+12
+70.70300787843674
+22
+-122.74238318633489
+32
+297.35217578523805
+13
+70.70300787843674
+23
+-122.74238318633489
+33
+297.35217578523805
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.25217785412377
+20
+-123.62007035830317
+30
+288.7286331243461
+11
+72.95305097164064
+21
+-120.18659464847576
+31
+297.0132698893723
+12
+70.70300787843674
+22
+-122.74238318633489
+32
+297.35217578523805
+13
+70.70300787843674
+23
+-122.74238318633489
+33
+297.35217578523805
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.25217785412377
+20
+-123.62007035830317
+30
+288.7286331243461
+11
+72.41274857392153
+21
+-120.42054315289144
+31
+288.88044106154393
+12
+72.95305097164064
+22
+-120.18659464847576
+32
+297.0132698893723
+13
+72.95305097164064
+23
+-120.18659464847576
+33
+297.0132698893723
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.88557177259584
+20
+-127.64404547915105
+30
+280.61253663428397
+11
+72.41274857392153
+21
+-120.42054315289144
+31
+288.88044106154393
+12
+70.25217785412377
+22
+-123.62007035830317
+32
+288.7286331243461
+13
+70.25217785412377
+23
+-123.62007035830317
+33
+288.7286331243461
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.474840758254
+20
+-121.83731582528625
+30
+279.4309293635981
+11
+72.41274857392153
+21
+-120.42054315289144
+31
+288.88044106154393
+12
+68.88557177259584
+22
+-127.64404547915105
+32
+280.61253663428397
+13
+68.88557177259584
+23
+-127.64404547915105
+33
+280.61253663428397
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.04823715183348
+20
+-121.70254445017906
+30
+277.67433812236516
+11
+57.68193305043402
+21
+-116.28735150006817
+31
+281.7585496591786
+12
+63.03640282566724
+22
+-120.27025633730818
+32
+283.2811923959928
+13
+63.03640282566724
+23
+-120.27025633730818
+33
+283.2811923959928
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.03640282566724
+20
+-120.27025633730818
+30
+283.2811923959928
+11
+57.68193305043402
+21
+-116.28735150006817
+31
+281.7585496591786
+12
+58.54459154084625
+22
+-114.05008582843327
+32
+286.6310064169878
+13
+58.54459154084625
+23
+-114.05008582843327
+33
+286.6310064169878
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.93549722820116
+20
+-114.1468291631579
+30
+278.4963522432213
+11
+69.1928079164339
+21
+-115.39201931735926
+31
+273.1788153008048
+12
+63.04823715183348
+22
+-121.70254445017906
+32
+277.67433812236516
+13
+63.04823715183348
+23
+-121.70254445017906
+33
+277.67433812236516
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.93549722820116
+20
+-114.1468291631579
+30
+278.4963522432213
+11
+63.04823715183348
+21
+-121.70254445017906
+31
+277.67433812236516
+12
+63.03640282566724
+22
+-120.27025633730818
+32
+283.2811923959928
+13
+63.03640282566724
+23
+-120.27025633730818
+33
+283.2811923959928
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.2535175632424
+20
+-110.99415250349215
+30
+269.3714478979603
+11
+72.93549722820116
+21
+-114.1468291631579
+31
+278.4963522432213
+12
+74.66528630657429
+22
+-108.62241968107286
+32
+272.01028967600985
+13
+74.66528630657429
+23
+-108.62241968107286
+33
+272.01028967600985
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.93549722820116
+20
+-114.1468291631579
+30
+278.4963522432213
+11
+72.2535175632424
+21
+-110.99415250349215
+31
+269.3714478979603
+12
+69.1928079164339
+22
+-115.39201931735926
+32
+273.1788153008048
+13
+69.1928079164339
+23
+-115.39201931735926
+33
+273.1788153008048
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.04737796719371
+20
+-100.57507788801708
+30
+265.38185012561644
+11
+74.66528630657429
+21
+-108.62241968107286
+31
+272.01028967600985
+12
+78.5724523690229
+22
+-97.24534267234493
+32
+267.89261346366635
+13
+78.5724523690229
+23
+-97.24534267234493
+33
+267.89261346366635
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.04737796719371
+20
+-100.57507788801708
+30
+265.38185012561644
+11
+72.2535175632424
+21
+-110.99415250349215
+31
+269.3714478979603
+12
+74.66528630657429
+22
+-108.62241968107286
+32
+272.01028967600985
+13
+74.66528630657429
+23
+-108.62241968107286
+33
+272.01028967600985
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+76.7299229283447
+20
+-73.25512523038003
+30
+269.13719516922924
+11
+79.47525538843051
+21
+-85.03073610228905
+31
+268.2923642241441
+12
+79.27280931266354
+22
+-73.88395690610402
+32
+270.3674783316025
+13
+79.27280931266354
+23
+-73.88395690610402
+33
+270.3674783316025
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.89032880595934
+20
+-84.52481105307302
+30
+266.29026395421795
+11
+79.47525538843051
+21
+-85.03073610228905
+31
+268.2923642241441
+12
+76.7299229283447
+22
+-73.25512523038003
+32
+269.13719516922924
+13
+76.7299229283447
+23
+-73.25512523038003
+33
+269.13719516922924
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.28010676907608
+20
+-66.90991852473525
+30
+271.0875773042403
+11
+70.30785090524014
+21
+-68.95582709717932
+31
+271.3616834192988
+12
+74.24113675539193
+22
+-71.93965925755526
+32
+269.8740264796325
+13
+74.24113675539193
+23
+-71.93965925755526
+33
+269.8740264796325
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.28010676907608
+20
+-66.90991852473525
+30
+271.0875773042403
+11
+74.24113675539193
+21
+-71.93965925755526
+31
+269.8740264796325
+12
+76.7299229283447
+22
+-73.25512523038003
+32
+269.13719516922924
+13
+76.7299229283447
+23
+-73.25512523038003
+33
+269.13719516922924
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.38101348863943
+20
+-68.62118034183553
+30
+272.160880715925
+11
+64.32503621320006
+21
+-67.98748107694438
+31
+276.7199864210026
+12
+60.57166862769407
+22
+-69.95915891456646
+32
+276.0683379210504
+13
+60.57166862769407
+23
+-69.95915891456646
+33
+276.0683379210504
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.38101348863943
+20
+-68.62118034183553
+30
+272.160880715925
+11
+60.57166862769407
+21
+-69.95915891456646
+31
+276.0683379210504
+12
+62.54012168749207
+22
+-69.19220939618201
+32
+273.7799625631437
+13
+62.54012168749207
+23
+-69.19220939618201
+33
+273.7799625631437
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.583402709785325
+20
+-76.71141776444071
+30
+281.78623407258533
+11
+47.60647980783381
+21
+-87.03374904518896
+31
+285.89965114440656
+12
+42.18063900641541
+22
+-85.19805947996502
+32
+283.16011111543185
+13
+42.18063900641541
+23
+-85.19805947996502
+33
+283.16011111543185
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.583402709785325
+20
+-76.71141776444071
+30
+281.78623407258533
+11
+49.81168023582154
+21
+-78.95050878201525
+31
+282.38951090517315
+12
+47.60647980783381
+22
+-87.03374904518896
+32
+285.89965114440656
+13
+47.60647980783381
+23
+-87.03374904518896
+33
+285.89965114440656
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+42.18063900641541
+20
+-85.19805947996502
+30
+283.16011111543185
+11
+45.24174414484389
+21
+-95.03849943301859
+31
+290.4328977820236
+12
+40.763562109695094
+22
+-93.19520425971906
+32
+289.75721556055225
+13
+40.763562109695094
+23
+-93.19520425971906
+33
+289.75721556055225
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+42.18063900641541
+20
+-85.19805947996502
+30
+283.16011111543185
+11
+47.60647980783381
+21
+-87.03374904518896
+31
+285.89965114440656
+12
+45.24174414484389
+22
+-95.03849943301859
+32
+290.4328977820236
+13
+45.24174414484389
+23
+-95.03849943301859
+33
+290.4328977820236
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.57951200474219
+20
+-68.53873555029342
+30
+278.9383901846101
+11
+49.81168023582154
+21
+-78.95050878201525
+31
+282.38951090517315
+12
+44.583402709785325
+22
+-76.71141776444071
+32
+281.78623407258533
+13
+44.583402709785325
+23
+-76.71141776444071
+33
+281.78623407258533
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.57951200474219
+20
+-68.53873555029342
+30
+278.9383901846101
+11
+56.07060892345266
+21
+-71.42186945974356
+31
+279.18024852142617
+12
+49.81168023582154
+22
+-78.95050878201525
+32
+282.38951090517315
+13
+49.81168023582154
+23
+-78.95050878201525
+33
+282.38951090517315
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.763562109695094
+20
+-93.19520425971906
+30
+289.75721556055225
+11
+49.026173033732256
+21
+-104.25223728060762
+31
+288.9151226343746
+12
+41.41886130152325
+22
+-97.70654674607954
+32
+291.0617294577463
+13
+41.41886130152325
+23
+-97.70654674607954
+33
+291.0617294577463
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.763562109695094
+20
+-93.19520425971906
+30
+289.75721556055225
+11
+45.24174414484389
+21
+-95.03849943301859
+31
+290.4328977820236
+12
+49.026173033732256
+22
+-104.25223728060762
+32
+288.9151226343746
+13
+49.026173033732256
+23
+-104.25223728060762
+33
+288.9151226343746
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.757246649748865
+20
+-91.57308016927028
+30
+291.7337609873432
+11
+41.41886130152325
+21
+-97.70654674607954
+31
+291.0617294577463
+12
+35.77397898751606
+22
+-96.66670800992969
+32
+294.4456166029207
+13
+35.77397898751606
+23
+-96.66670800992969
+33
+294.4456166029207
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.757246649748865
+20
+-91.57308016927028
+30
+291.7337609873432
+11
+40.763562109695094
+21
+-93.19520425971906
+31
+289.75721556055225
+12
+41.41886130152325
+22
+-97.70654674607954
+32
+291.0617294577463
+13
+41.41886130152325
+23
+-97.70654674607954
+33
+291.0617294577463
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.333113992928546
+20
+-84.0228409200616
+30
+284.0377982874026
+11
+42.18063900641541
+21
+-85.19805947996502
+31
+283.16011111543185
+12
+35.757246649748865
+22
+-91.57308016927028
+32
+291.7337609873432
+13
+35.757246649748865
+23
+-91.57308016927028
+33
+291.7337609873432
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+42.18063900641541
+20
+-85.19805947996502
+30
+283.16011111543185
+11
+40.763562109695094
+21
+-93.19520425971906
+31
+289.75721556055225
+12
+35.757246649748865
+22
+-91.57308016927028
+32
+291.7337609873432
+13
+35.757246649748865
+23
+-91.57308016927028
+33
+291.7337609873432
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.322132616964055
+20
+-75.41755171855154
+30
+281.51729977101814
+11
+44.583402709785325
+21
+-76.71141776444071
+31
+281.78623407258533
+12
+38.333113992928546
+22
+-84.0228409200616
+32
+284.0377982874026
+13
+38.333113992928546
+23
+-84.0228409200616
+33
+284.0377982874026
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.583402709785325
+20
+-76.71141776444071
+30
+281.78623407258533
+11
+42.18063900641541
+21
+-85.19805947996502
+31
+283.16011111543185
+12
+38.333113992928546
+22
+-84.0228409200616
+32
+284.0377982874026
+13
+38.333113992928546
+23
+-84.0228409200616
+33
+284.0377982874026
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+46.88455548925988
+20
+-65.36263361775569
+30
+278.45102281910084
+11
+50.57951200474219
+21
+-68.53873555029342
+31
+278.9383901846101
+12
+40.322132616964055
+22
+-75.41755171855154
+32
+281.51729977101814
+13
+40.322132616964055
+23
+-75.41755171855154
+33
+281.51729977101814
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.57951200474219
+20
+-68.53873555029342
+30
+278.9383901846101
+11
+44.583402709785325
+21
+-76.71141776444071
+31
+281.78623407258533
+12
+40.322132616964055
+22
+-75.41755171855154
+32
+281.51729977101814
+13
+40.322132616964055
+23
+-75.41755171855154
+33
+281.51729977101814
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+66.20252620040911
+20
+-131.70483174308785
+30
+276.2210585312006
+11
+64.83741081806401
+21
+-131.04253539183142
+31
+282.8498023059193
+12
+63.54184111596588
+22
+-132.78482808988116
+32
+281.3904382282959
+13
+63.54184111596588
+23
+-132.78482808988116
+33
+281.3904382282959
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+66.20252620040911
+20
+-131.70483174308785
+30
+276.2210585312006
+11
+68.88557177259584
+21
+-127.64404547915105
+31
+280.61253663428397
+12
+64.83741081806401
+22
+-131.04253539183142
+32
+282.8498023059193
+13
+64.83741081806401
+23
+-131.04253539183142
+33
+282.8498023059193
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.54184111596588
+20
+-132.78482808988116
+30
+281.3904382282959
+11
+58.389254601502024
+21
+-136.19427007818985
+31
+279.1483049674903
+12
+61.30141151137013
+22
+-135.90616964426974
+32
+274.45899125215175
+13
+61.30141151137013
+23
+-135.90616964426974
+33
+274.45899125215175
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+66.20252620040911
+20
+-131.70483174308785
+30
+276.2210585312006
+11
+63.54184111596588
+21
+-132.78482808988116
+31
+281.3904382282959
+12
+61.30141151137013
+22
+-135.90616964426974
+32
+274.45899125215175
+13
+61.30141151137013
+23
+-135.90616964426974
+33
+274.45899125215175
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+71.12426729855022
+20
+-125.04809933064918
+30
+274.72305796455333
+11
+68.88557177259584
+21
+-127.64404547915105
+31
+280.61253663428397
+12
+66.20252620040911
+22
+-131.70483174308785
+32
+276.2210585312006
+13
+66.20252620040911
+23
+-131.70483174308785
+33
+276.2210585312006
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+71.12426729855022
+20
+-125.04809933064918
+30
+274.72305796455333
+11
+72.474840758254
+21
+-121.83731582528625
+31
+279.4309293635981
+12
+68.88557177259584
+22
+-127.64404547915105
+32
+280.61253663428397
+13
+68.88557177259584
+23
+-127.64404547915105
+33
+280.61253663428397
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.04441969762796
+20
+-119.31712153324125
+30
+350.63463217111064
+11
+64.67449869307612
+21
+-111.1085408489787
+31
+361.185740142786
+12
+48.93447982276801
+22
+-130.28349570586812
+32
+366.136991000257
+13
+48.93447982276801
+23
+-130.28349570586812
+33
+366.136991000257
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+69.21288672175451
+20
+-100.77525749260263
+30
+363.32869627428244
+11
+55.42309787429434
+21
+-113.6153492708316
+31
+374.0735951397288
+12
+48.93447982276801
+22
+-130.28349570586812
+32
+366.136991000257
+13
+48.93447982276801
+23
+-130.28349570586812
+33
+366.136991000257
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.67449869307612
+20
+-111.1085408489787
+30
+361.185740142786
+11
+69.21288672175451
+21
+-100.77525749260263
+31
+363.32869627428244
+12
+48.93447982276801
+22
+-130.28349570586812
+32
+366.136991000257
+13
+48.93447982276801
+23
+-130.28349570586812
+33
+366.136991000257
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+78.82632665392681
+20
+-88.99812549907419
+30
+347.7076899591506
+11
+69.21288672175451
+21
+-100.77525749260263
+31
+363.32869627428244
+12
+64.67449869307612
+22
+-111.1085408489787
+32
+361.185740142786
+13
+64.67449869307612
+23
+-111.1085408489787
+33
+361.185740142786
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+74.00551501719748
+20
+-101.24041648252681
+30
+347.36422069843525
+11
+78.82632665392681
+21
+-88.99812549907419
+31
+347.7076899591506
+12
+64.67449869307612
+22
+-111.1085408489787
+32
+361.185740142786
+13
+64.67449869307612
+23
+-111.1085408489787
+33
+361.185740142786
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.48119792450834
+20
+-112.4337420001362
+30
+342.1735452987239
+11
+74.00551501719748
+21
+-101.24041648252681
+31
+347.36422069843525
+12
+64.67449869307612
+22
+-111.1085408489787
+32
+361.185740142786
+13
+64.67449869307612
+23
+-111.1085408489787
+33
+361.185740142786
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.48119792450834
+20
+-112.4337420001362
+30
+342.1735452987239
+11
+64.67449869307612
+21
+-111.1085408489787
+31
+361.185740142786
+12
+64.04441969762796
+22
+-119.31712153324125
+32
+350.63463217111064
+13
+64.04441969762796
+23
+-119.31712153324125
+33
+350.63463217111064
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+90.34792846955709
+20
+-28.781179893818063
+30
+305.87441174658187
+11
+91.53756726237273
+21
+-26.135949404986974
+31
+312.5189751860992
+12
+86.90006294924783
+22
+-48.320291265389336
+32
+322.5024005709738
+13
+86.90006294924783
+23
+-48.320291265389336
+33
+322.5024005709738
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+90.34792846955709
+20
+-28.781179893818063
+30
+305.87441174658187
+11
+86.90006294924783
+21
+-48.320291265389336
+31
+322.5024005709738
+12
+85.14864352150661
+22
+-51.6460715648604
+32
+313.85269461829995
+13
+85.14864352150661
+23
+-51.6460715648604
+33
+313.85269461829995
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+88.08982343179265
+20
+-30.730953580179566
+30
+298.87755654098413
+11
+85.14864352150661
+21
+-51.6460715648604
+31
+313.85269461829995
+12
+84.1970906839021
+22
+-51.81947942899092
+32
+304.9501782531802
+13
+84.1970906839021
+23
+-51.81947942899092
+33
+304.9501782531802
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+88.08982343179265
+20
+-30.730953580179566
+30
+298.87755654098413
+11
+90.34792846955709
+21
+-28.781179893818063
+31
+305.87441174658187
+12
+85.14864352150661
+22
+-51.6460715648604
+32
+313.85269461829995
+13
+85.14864352150661
+23
+-51.6460715648604
+33
+313.85269461829995
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+78.33697179091436
+20
+-67.63914422707256
+30
+311.5728375414341
+11
+85.14864352150661
+21
+-51.6460715648604
+31
+313.85269461829995
+12
+80.57581121497356
+22
+-66.9354733678832
+32
+319.95513031415544
+13
+80.57581121497356
+23
+-66.9354733678832
+33
+319.95513031415544
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+84.1970906839021
+20
+-51.81947942899092
+30
+304.9501782531802
+11
+85.14864352150661
+21
+-51.6460715648604
+31
+313.85269461829995
+12
+78.33697179091436
+22
+-67.63914422707256
+32
+311.5728375414341
+13
+78.33697179091436
+23
+-67.63914422707256
+33
+311.5728375414341
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.57581121497356
+20
+-66.9354733678832
+30
+319.95513031415544
+11
+77.93683862046568
+21
+-82.27020459504078
+31
+332.4319782506679
+12
+73.6515804397727
+22
+-84.52450682876498
+32
+324.54222465694795
+13
+73.6515804397727
+23
+-84.52450682876498
+33
+324.54222465694795
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+78.33697179091436
+20
+-67.63914422707256
+30
+311.5728375414341
+11
+80.57581121497356
+21
+-66.9354733678832
+31
+319.95513031415544
+12
+73.6515804397727
+22
+-84.52450682876498
+32
+324.54222465694795
+13
+73.6515804397727
+23
+-84.52450682876498
+33
+324.54222465694795
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.57581121497356
+20
+-66.9354733678832
+30
+319.95513031415544
+11
+86.90006294924783
+21
+-48.320291265389336
+31
+322.5024005709738
+12
+83.33969527427841
+22
+-64.25586553055062
+32
+334.4237348936153
+13
+83.33969527427841
+23
+-64.25586553055062
+33
+334.4237348936153
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+85.14864352150661
+20
+-51.6460715648604
+30
+313.85269461829995
+11
+86.90006294924783
+21
+-48.320291265389336
+31
+322.5024005709738
+12
+80.57581121497356
+22
+-66.9354733678832
+32
+319.95513031415544
+13
+80.57581121497356
+23
+-66.9354733678832
+33
+319.95513031415544
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.93683862046568
+20
+-82.27020459504078
+30
+332.4319782506679
+11
+83.33969527427841
+21
+-64.25586553055062
+31
+334.4237348936153
+12
+78.82632665392681
+22
+-88.99812549907419
+32
+347.7076899591506
+13
+78.82632665392681
+23
+-88.99812549907419
+33
+347.7076899591506
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.57581121497356
+20
+-66.9354733678832
+30
+319.95513031415544
+11
+83.33969527427841
+21
+-64.25586553055062
+31
+334.4237348936153
+12
+77.93683862046568
+22
+-82.27020459504078
+32
+332.4319782506679
+13
+77.93683862046568
+23
+-82.27020459504078
+33
+332.4319782506679
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+74.72193287552435
+20
+-96.65058412081986
+30
+338.2572655882341
+11
+78.82632665392681
+21
+-88.99812549907419
+31
+347.7076899591506
+12
+74.00551501719748
+22
+-101.24041648252681
+32
+347.36422069843525
+13
+74.00551501719748
+23
+-101.24041648252681
+33
+347.36422069843525
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.93683862046568
+20
+-82.27020459504078
+30
+332.4319782506679
+11
+78.82632665392681
+21
+-88.99812549907419
+31
+347.7076899591506
+12
+74.72193287552435
+22
+-96.65058412081986
+32
+338.2572655882341
+13
+74.72193287552435
+23
+-96.65058412081986
+33
+338.2572655882341
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.72576497989745
+20
+-95.77563496775467
+30
+329.6163821409292
+11
+77.93683862046568
+21
+-82.27020459504078
+31
+332.4319782506679
+12
+74.72193287552435
+22
+-96.65058412081986
+32
+338.2572655882341
+13
+74.72193287552435
+23
+-96.65058412081986
+33
+338.2572655882341
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+73.6515804397727
+20
+-84.52450682876498
+30
+324.54222465694795
+11
+77.93683862046568
+21
+-82.27020459504078
+31
+332.4319782506679
+12
+72.72576497989745
+22
+-95.77563496775467
+32
+329.6163821409292
+13
+72.72576497989745
+23
+-95.77563496775467
+33
+329.6163821409292
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+69.59739584364476
+20
+-121.66390796116451
+30
+322.42634449019516
+11
+70.43364766281712
+21
+-114.81642689818271
+31
+332.1593932572157
+12
+68.67745191320414
+22
+-126.2005010663375
+32
+324.327746509194
+13
+68.67745191320414
+23
+-126.2005010663375
+33
+324.327746509194
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.67745191320414
+20
+-126.2005010663375
+30
+324.327746509194
+11
+70.43364766281712
+21
+-114.81642689818271
+31
+332.1593932572157
+12
+67.49514492657376
+22
+-120.41597978805764
+32
+334.7830238191112
+13
+67.49514492657376
+23
+-120.41597978805764
+33
+334.7830238191112
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.43364766281712
+20
+-114.81642689818271
+30
+332.1593932572157
+11
+71.89468497421672
+21
+-108.33158122826335
+31
+336.9250672776389
+12
+67.49514492657376
+22
+-120.41597978805764
+32
+334.7830238191112
+13
+67.49514492657376
+23
+-120.41597978805764
+33
+334.7830238191112
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+67.49514492657376
+20
+-120.41597978805764
+30
+334.7830238191112
+11
+71.89468497421672
+21
+-108.33158122826335
+31
+336.9250672776389
+12
+70.48119792450834
+22
+-112.4337420001362
+32
+342.1735452987239
+13
+70.48119792450834
+23
+-112.4337420001362
+33
+342.1735452987239
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+71.89468497421672
+20
+-108.33158122826335
+30
+336.9250672776389
+11
+74.72193287552435
+21
+-96.65058412081986
+31
+338.2572655882341
+12
+70.48119792450834
+22
+-112.4337420001362
+32
+342.1735452987239
+13
+70.48119792450834
+23
+-112.4337420001362
+33
+342.1735452987239
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+74.72193287552435
+20
+-96.65058412081986
+30
+338.2572655882341
+11
+74.00551501719748
+21
+-101.24041648252681
+31
+347.36422069843525
+12
+70.48119792450834
+22
+-112.4337420001362
+32
+342.1735452987239
+13
+70.48119792450834
+23
+-112.4337420001362
+33
+342.1735452987239
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.59528092355104
+20
+-117.57543728382913
+30
+319.1179049771362
+11
+70.43364766281712
+21
+-114.81642689818271
+31
+332.1593932572157
+12
+69.59739584364476
+22
+-121.66390796116451
+32
+322.42634449019516
+13
+69.59739584364476
+23
+-121.66390796116451
+33
+322.42634449019516
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.59528092355104
+20
+-117.57543728382913
+30
+319.1179049771362
+11
+69.11428761865724
+21
+-110.98989336298473
+31
+328.7198330609265
+12
+70.43364766281712
+22
+-114.81642689818271
+32
+332.1593932572157
+13
+70.43364766281712
+23
+-114.81642689818271
+33
+332.1593932572157
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+69.11428761865724
+20
+-110.98989336298473
+30
+328.7198330609265
+11
+71.89468497421672
+21
+-108.33158122826335
+31
+336.9250672776389
+12
+70.43364766281712
+22
+-114.81642689818271
+32
+332.1593932572157
+13
+70.43364766281712
+23
+-114.81642689818271
+33
+332.1593932572157
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+69.11428761865724
+20
+-110.98989336298473
+30
+328.7198330609265
+11
+71.19074031313446
+21
+-106.54182953581788
+31
+332.2664802189279
+12
+71.89468497421672
+22
+-108.33158122826335
+32
+336.9250672776389
+13
+71.89468497421672
+23
+-108.33158122826335
+33
+336.9250672776389
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+71.19074031313446
+20
+-106.54182953581788
+30
+332.2664802189279
+11
+74.72193287552435
+21
+-96.65058412081986
+31
+338.2572655882341
+12
+71.89468497421672
+22
+-108.33158122826335
+32
+336.9250672776389
+13
+71.89468497421672
+23
+-108.33158122826335
+33
+336.9250672776389
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.72576497989745
+20
+-95.77563496775467
+30
+329.6163821409292
+11
+74.72193287552435
+21
+-96.65058412081986
+31
+338.2572655882341
+12
+71.19074031313446
+22
+-106.54182953581788
+32
+332.2664802189279
+13
+71.19074031313446
+23
+-106.54182953581788
+33
+332.2664802189279
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.6749290955174
+20
+-120.87475006719644
+30
+313.40213839585994
+11
+70.33343617080781
+21
+-118.39684295603591
+31
+314.39330124032483
+12
+69.59739584364476
+22
+-121.66390796116451
+32
+322.42634449019516
+13
+69.59739584364476
+23
+-121.66390796116451
+33
+322.42634449019516
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.33343617080781
+20
+-118.39684295603591
+30
+314.39330124032483
+11
+68.59528092355104
+21
+-117.57543728382913
+31
+319.1179049771362
+12
+69.59739584364476
+22
+-121.66390796116451
+32
+322.42634449019516
+13
+69.59739584364476
+23
+-121.66390796116451
+33
+322.42634449019516
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.26457780053079
+20
+-116.71935003879129
+30
+306.4211028550621
+11
+71.98576973653493
+21
+-115.75252514017023
+31
+306.6617442945869
+12
+72.6749290955174
+22
+-120.87475006719644
+32
+313.40213839585994
+13
+72.6749290955174
+23
+-120.87475006719644
+33
+313.40213839585994
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+71.98576973653493
+20
+-115.75252514017023
+30
+306.6617442945869
+11
+70.33343617080781
+21
+-118.39684295603591
+31
+314.39330124032483
+12
+72.6749290955174
+22
+-120.87475006719644
+32
+313.40213839585994
+13
+72.6749290955174
+23
+-120.87475006719644
+33
+313.40213839585994
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.91175420293378
+20
+-115.13951312924222
+30
+297.09054286742577
+11
+72.15336691609762
+21
+-115.31352944202122
+31
+297.709030916166
+12
+75.26457780053079
+22
+-116.71935003879129
+32
+306.4211028550621
+13
+75.26457780053079
+23
+-116.71935003879129
+33
+306.4211028550621
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.26457780053079
+20
+-116.71935003879129
+30
+306.4211028550621
+11
+72.15336691609762
+21
+-115.31352944202122
+31
+297.709030916166
+12
+71.98576973653493
+22
+-115.75252514017023
+32
+306.6617442945869
+13
+71.98576973653493
+23
+-115.75252514017023
+33
+306.6617442945869
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.91175420293378
+20
+-115.13951312924222
+30
+297.09054286742577
+11
+73.95686954794336
+21
+-115.65730292705409
+31
+288.8013427375544
+12
+71.19451269474017
+22
+-115.9347555096667
+32
+288.6391911733744
+13
+71.19451269474017
+23
+-115.9347555096667
+33
+288.6391911733744
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.91175420293378
+20
+-115.13951312924222
+30
+297.09054286742577
+11
+71.19451269474017
+21
+-115.9347555096667
+31
+288.6391911733744
+12
+72.15336691609762
+22
+-115.31352944202122
+32
+297.709030916166
+13
+72.15336691609762
+23
+-115.31352944202122
+33
+297.709030916166
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.725459396477
+20
+-113.35036988543962
+30
+280.16958601994145
+11
+72.93549722820116
+21
+-114.1468291631579
+31
+278.4963522432213
+12
+73.95686954794336
+22
+-115.65730292705409
+32
+288.8013427375544
+13
+73.95686954794336
+23
+-115.65730292705409
+33
+288.8013427375544
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+73.95686954794336
+20
+-115.65730292705409
+30
+288.8013427375544
+11
+72.93549722820116
+21
+-114.1468291631579
+31
+278.4963522432213
+12
+71.19451269474017
+22
+-115.9347555096667
+32
+288.6391911733744
+13
+71.19451269474017
+23
+-115.9347555096667
+33
+288.6391911733744
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+74.66528630657429
+20
+-108.62241968107286
+30
+272.01028967600985
+11
+75.725459396477
+21
+-113.35036988543962
+31
+280.16958601994145
+12
+78.31767179986072
+22
+-106.36537942843987
+32
+274.99168804180243
+13
+78.31767179986072
+23
+-106.36537942843987
+33
+274.99168804180243
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.725459396477
+20
+-113.35036988543962
+30
+280.16958601994145
+11
+74.66528630657429
+21
+-108.62241968107286
+31
+272.01028967600985
+12
+72.93549722820116
+22
+-114.1468291631579
+32
+278.4963522432213
+13
+72.93549722820116
+23
+-114.1468291631579
+33
+278.4963522432213
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.500539921773193
+20
+-43.51658920461027
+30
+409.89205426150727
+11
+15.964107968443475
+21
+-66.69118123650554
+31
+410.95744784078755
+12
+33.14061324728183
+22
+-63.96046371289752
+32
+407.04421037352455
+13
+33.14061324728183
+23
+-63.96046371289752
+33
+407.04421037352455
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.500539921773193
+20
+-43.51658920461027
+30
+409.89205426150727
+11
+14.871029975760745
+21
+-47.81497466484341
+31
+414.2044340405983
+12
+15.964107968443475
+22
+-66.69118123650554
+32
+410.95744784078755
+13
+15.964107968443475
+23
+-66.69118123650554
+33
+410.95744784078755
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.14061324728183
+20
+-63.96046371289752
+30
+407.04421037352455
+11
+15.452402657090182
+21
+-89.58619111552514
+31
+404.5891200865852
+12
+32.16952920813815
+22
+-83.43781754688598
+32
+401.6369272558066
+13
+32.16952920813815
+23
+-83.43781754688598
+33
+401.6369272558066
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.14061324728183
+20
+-63.96046371289752
+30
+407.04421037352455
+11
+15.964107968443475
+21
+-66.69118123650554
+31
+410.95744784078755
+12
+15.452402657090182
+22
+-89.58619111552514
+32
+404.5891200865852
+13
+15.452402657090182
+23
+-89.58619111552514
+33
+404.5891200865852
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+48.58641677477795
+20
+-58.465563990147366
+30
+400.76593301894906
+11
+33.14061324728183
+21
+-63.96046371289752
+31
+407.04421037352455
+12
+50.86149752976797
+22
+-75.9751949027131
+32
+394.91052747339415
+13
+50.86149752976797
+23
+-75.9751949027131
+33
+394.91052747339415
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.14061324728183
+20
+-63.96046371289752
+30
+407.04421037352455
+11
+32.16952920813815
+21
+-83.43781754688598
+31
+401.6369272558066
+12
+50.86149752976797
+22
+-75.9751949027131
+32
+394.91052747339415
+13
+50.86149752976797
+23
+-75.9751949027131
+33
+394.91052747339415
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.260576752537325
+20
+-42.09981653221126
+30
+403.3402792405177
+11
+31.500539921773193
+21
+-43.51658920461027
+31
+409.89205426150727
+12
+33.14061324728183
+22
+-63.96046371289752
+32
+407.04421037352455
+13
+33.14061324728183
+23
+-63.96046371289752
+33
+407.04421037352455
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.260576752537325
+20
+-42.09981653221126
+30
+403.3402792405177
+11
+33.14061324728183
+21
+-63.96046371289752
+31
+407.04421037352455
+12
+48.58641677477795
+22
+-58.465563990147366
+32
+400.76593301894906
+13
+48.58641677477795
+23
+-58.465563990147366
+33
+400.76593301894906
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+57.090095052392
+20
+-36.91066225411659
+30
+397.6944842535427
+11
+47.260576752537325
+21
+-42.09981653221126
+31
+403.3402792405177
+12
+48.58641677477795
+22
+-58.465563990147366
+32
+400.76593301894906
+13
+48.58641677477795
+23
+-58.465563990147366
+33
+400.76593301894906
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+57.090095052392
+20
+-36.91066225411659
+30
+397.6944842535427
+11
+48.58641677477795
+21
+-58.465563990147366
+31
+400.76593301894906
+12
+61.87682139596797
+22
+-54.07925770055454
+32
+392.4889018620014
+13
+61.87682139596797
+23
+-54.07925770055454
+33
+392.4889018620014
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.87682139596797
+20
+-54.07925770055454
+30
+392.4889018620014
+11
+50.86149752976797
+21
+-75.9751949027131
+31
+394.91052747339415
+12
+64.28372255013123
+22
+-67.17398523716388
+32
+387.13881291701654
+13
+64.28372255013123
+23
+-67.17398523716388
+33
+387.13881291701654
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.87682139596797
+20
+-54.07925770055454
+30
+392.4889018620014
+11
+48.58641677477795
+21
+-58.465563990147366
+31
+400.76593301894906
+12
+50.86149752976797
+22
+-75.9751949027131
+32
+394.91052747339415
+13
+50.86149752976797
+23
+-75.9751949027131
+33
+394.91052747339415
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.80202048961326
+20
+-57.01715198814808
+30
+377.7255039135156
+11
+72.86680337605877
+21
+-45.522644390729255
+31
+383.577562991516
+12
+64.28372255013123
+22
+-67.17398523716388
+32
+387.13881291701654
+13
+64.28372255013123
+23
+-67.17398523716388
+33
+387.13881291701654
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.86680337605877
+20
+-45.522644390729255
+30
+383.577562991516
+11
+61.87682139596797
+21
+-54.07925770055454
+31
+392.4889018620014
+12
+64.28372255013123
+22
+-67.17398523716388
+32
+387.13881291701654
+13
+64.28372255013123
+23
+-67.17398523716388
+33
+387.13881291701654
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+84.01467777980731
+20
+-42.674192054101475
+30
+367.1722663715848
+11
+79.83657653241872
+21
+-34.48842819406656
+31
+376.057441950293
+12
+75.80202048961326
+22
+-57.01715198814808
+32
+377.7255039135156
+13
+75.80202048961326
+23
+-57.01715198814808
+33
+377.7255039135156
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+79.83657653241872
+20
+-34.48842819406656
+30
+376.057441950293
+11
+72.86680337605877
+21
+-45.522644390729255
+31
+383.577562991516
+12
+75.80202048961326
+22
+-57.01715198814808
+32
+377.7255039135156
+13
+75.80202048961326
+23
+-57.01715198814808
+33
+377.7255039135156
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.986591268013367
+20
+-143.4122963666606
+30
+371.1448275818151
+11
+0.020623870886214313
+21
+-132.80734068981232
+31
+383.0728548395701
+12
+0.020623870886214313
+22
+-143.58327043620915
+32
+371.50229116138706
+13
+0.020623870886214313
+23
+-143.58327043620915
+33
+371.50229116138706
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.37510037870297
+20
+-128.428031559652
+30
+384.9742568585712
+11
+0.020623870886214313
+21
+-132.80734068981232
+31
+383.0728548395701
+12
+17.986591268013367
+22
+-143.4122963666606
+32
+371.1448275818151
+13
+17.986591268013367
+23
+-143.4122963666606
+33
+371.1448275818151
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.638239767965047
+20
+-151.1392899475493
+30
+354.7091085295771
+11
+0.020623870886214313
+21
+-143.58327043620915
+31
+371.50229116138706
+12
+0.020623870886214313
+22
+-152.0972923408024
+32
+355.3446331404075
+13
+0.020623870886214313
+23
+-152.0972923408024
+33
+355.3446331404075
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.638239767965047
+20
+-151.1392899475493
+30
+354.7091085295771
+11
+17.986591268013367
+21
+-143.4122963666606
+31
+371.1448275818151
+12
+0.020623870886214313
+22
+-143.58327043620915
+32
+371.50229116138706
+13
+0.020623870886214313
+23
+-143.58327043620915
+33
+371.50229116138706
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.944593661266335
+20
+-152.10428950022992
+30
+346.14488961167785
+11
+0.020623870886214313
+21
+-152.0972923408024
+31
+355.3446331404075
+12
+0.020623870886214313
+22
+-153.18154782811376
+32
+343.01198753301173
+13
+0.020623870886214313
+23
+-153.18154782811376
+33
+343.01198753301173
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.944593661266335
+20
+-152.10428950022992
+30
+346.14488961167785
+11
+18.638239767965047
+21
+-151.1392899475493
+31
+354.7091085295771
+12
+0.020623870886214313
+22
+-152.0972923408024
+32
+355.3446331404075
+13
+0.020623870886214313
+23
+-152.0972923408024
+33
+355.3446331404075
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.92399087910983
+20
+-149.0343618564325
+30
+342.89546961728837
+11
+32.86468178628455
+21
+-146.73898933909854
+31
+354.0343389810756
+12
+18.944593661266335
+22
+-152.10428950022992
+32
+346.14488961167785
+13
+18.944593661266335
+23
+-152.10428950022992
+33
+346.14488961167785
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.86468178628455
+20
+-146.73898933909854
+30
+354.0343389810756
+11
+18.638239767965047
+21
+-151.1392899475493
+31
+354.7091085295771
+12
+18.944593661266335
+22
+-152.10428950022992
+32
+346.14488961167785
+13
+18.944593661266335
+23
+-152.10428950022992
+33
+346.14488961167785
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+46.36767836441493
+20
+-139.31469895962928
+30
+349.5908385187552
+11
+33.92399087910983
+21
+-149.0343618564325
+31
+342.89546961728837
+12
+44.24632215985701
+22
+-142.7320507803351
+32
+339.3561238430427
+13
+44.24632215985701
+23
+-142.7320507803351
+33
+339.3561238430427
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+46.36767836441493
+20
+-139.31469895962928
+30
+349.5908385187552
+11
+32.86468178628455
+21
+-146.73898933909854
+31
+354.0343389810756
+12
+33.92399087910983
+22
+-149.0343618564325
+32
+342.89546961728837
+13
+33.92399087910983
+23
+-149.0343618564325
+33
+342.89546961728837
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+55.42309787429434
+20
+-113.6153492708316
+30
+374.0735951397288
+11
+34.438129985047425
+21
+-123.70890386065481
+31
+382.2502322700722
+12
+34.194142077969374
+22
+-138.71233480001533
+32
+370.2275912478508
+13
+34.194142077969374
+23
+-138.71233480001533
+33
+370.2275912478508
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+55.42309787429434
+20
+-113.6153492708316
+30
+374.0735951397288
+11
+34.194142077969374
+21
+-138.71233480001533
+31
+370.2275912478508
+12
+48.93447982276801
+22
+-130.28349570586812
+32
+366.136991000257
+13
+48.93447982276801
+23
+-130.28349570586812
+33
+366.136991000257
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.438129985047425
+20
+-123.70890386065481
+30
+382.2502322700722
+11
+17.37510037870297
+21
+-128.428031559652
+31
+384.9742568585712
+12
+17.986591268013367
+22
+-143.4122963666606
+32
+371.1448275818151
+13
+17.986591268013367
+23
+-143.4122963666606
+33
+371.1448275818151
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.438129985047425
+20
+-123.70890386065481
+30
+382.2502322700722
+11
+17.986591268013367
+21
+-143.4122963666606
+31
+371.1448275818151
+12
+34.194142077969374
+22
+-138.71233480001533
+32
+370.2275912478508
+13
+34.194142077969374
+23
+-138.71233480001533
+33
+370.2275912478508
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.86468178628455
+20
+-146.73898933909854
+30
+354.0343389810756
+11
+17.986591268013367
+21
+-143.4122963666606
+31
+371.1448275818151
+12
+18.638239767965047
+22
+-151.1392899475493
+32
+354.7091085295771
+13
+18.638239767965047
+23
+-151.1392899475493
+33
+354.7091085295771
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.194142077969374
+20
+-138.71233480001533
+30
+370.2275912478508
+11
+17.986591268013367
+21
+-143.4122963666606
+31
+371.1448275818151
+12
+32.86468178628455
+22
+-146.73898933909854
+32
+354.0343389810756
+13
+32.86468178628455
+23
+-146.73898933909854
+33
+354.0343389810756
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+48.93447982276801
+20
+-130.28349570586812
+30
+366.136991000257
+11
+32.86468178628455
+21
+-146.73898933909854
+31
+354.0343389810756
+12
+46.36767836441493
+22
+-139.31469895962928
+32
+349.5908385187552
+13
+46.36767836441493
+23
+-139.31469895962928
+33
+349.5908385187552
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+48.93447982276801
+20
+-130.28349570586812
+30
+366.136991000257
+11
+34.194142077969374
+21
+-138.71233480001533
+31
+370.2275912478508
+12
+32.86468178628455
+22
+-146.73898933909854
+32
+354.0343389810756
+13
+32.86468178628455
+23
+-146.73898933909854
+33
+354.0343389810756
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+54.02530879965475
+20
+-133.09239888049083
+30
+344.0329643611391
+11
+44.24632215985701
+21
+-142.7320507803351
+31
+339.3561238430427
+12
+50.5186671401342
+22
+-138.34422336912806
+32
+335.0963748718378
+13
+50.5186671401342
+23
+-138.34422336912806
+33
+335.0963748718378
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+54.02530879965475
+20
+-133.09239888049083
+30
+344.0329643611391
+11
+46.36767836441493
+21
+-139.31469895962928
+31
+349.5908385187552
+12
+44.24632215985701
+22
+-142.7320507803351
+32
+339.3561238430427
+13
+44.24632215985701
+23
+-142.7320507803351
+33
+339.3561238430427
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+60.118131006906054
+20
+-127.47733055014031
+30
+339.5392668855167
+11
+50.5186671401342
+21
+-138.34422336912806
+31
+335.0963748718378
+12
+58.2985653308038
+22
+-133.73887556694706
+32
+329.75389153493353
+13
+58.2985653308038
+23
+-133.73887556694706
+33
+329.75389153493353
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.5186671401342
+20
+-138.34422336912806
+30
+335.0963748718378
+11
+60.118131006906054
+21
+-127.47733055014031
+31
+339.5392668855167
+12
+54.02530879965475
+22
+-133.09239888049083
+32
+344.0329643611391
+13
+54.02530879965475
+23
+-133.09239888049083
+33
+344.0329643611391
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.67745191320414
+20
+-126.2005010663375
+30
+324.327746509194
+11
+67.49514492657376
+21
+-120.41597978805764
+31
+334.7830238191112
+12
+58.2985653308038
+22
+-133.73887556694706
+32
+329.75389153493353
+13
+58.2985653308038
+23
+-133.73887556694706
+33
+329.75389153493353
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+58.2985653308038
+20
+-133.73887556694706
+30
+329.75389153493353
+11
+67.49514492657376
+21
+-120.41597978805764
+31
+334.7830238191112
+12
+60.118131006906054
+22
+-127.47733055014031
+32
+339.5392668855167
+13
+60.118131006906054
+23
+-127.47733055014031
+33
+339.5392668855167
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+67.49514492657376
+20
+-120.41597978805764
+30
+334.7830238191112
+11
+70.48119792450834
+21
+-112.4337420001362
+31
+342.1735452987239
+12
+64.04441969762796
+22
+-119.31712153324125
+32
+350.63463217111064
+13
+64.04441969762796
+23
+-119.31712153324125
+33
+350.63463217111064
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+67.49514492657376
+20
+-120.41597978805764
+30
+334.7830238191112
+11
+64.04441969762796
+21
+-119.31712153324125
+31
+350.63463217111064
+12
+60.118131006906054
+22
+-127.47733055014031
+32
+339.5392668855167
+13
+60.118131006906054
+23
+-127.47733055014031
+33
+339.5392668855167
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+60.118131006906054
+20
+-127.47733055014031
+30
+339.5392668855167
+11
+64.04441969762796
+21
+-119.31712153324125
+31
+350.63463217111064
+12
+54.02530879965475
+22
+-133.09239888049083
+32
+344.0329643611391
+13
+54.02530879965475
+23
+-133.09239888049083
+33
+344.0329643611391
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+54.02530879965475
+20
+-133.09239888049083
+30
+344.0329643611391
+11
+64.04441969762796
+21
+-119.31712153324125
+31
+350.63463217111064
+12
+57.31689428521834
+22
+-128.24245472258949
+32
+353.47182820777937
+13
+57.31689428521834
+23
+-128.24245472258949
+33
+353.47182820777937
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+57.31689428521834
+20
+-128.24245472258949
+30
+353.47182820777937
+11
+46.36767836441493
+21
+-139.31469895962928
+31
+349.5908385187552
+12
+54.02530879965475
+22
+-133.09239888049083
+32
+344.0329643611391
+13
+54.02530879965475
+23
+-133.09239888049083
+33
+344.0329643611391
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+57.31689428521834
+20
+-128.24245472258949
+30
+353.47182820777937
+11
+48.93447982276801
+21
+-130.28349570586812
+31
+366.136991000257
+12
+46.36767836441493
+22
+-139.31469895962928
+32
+349.5908385187552
+13
+46.36767836441493
+23
+-139.31469895962928
+33
+349.5908385187552
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.04441969762796
+20
+-119.31712153324125
+30
+350.63463217111064
+11
+48.93447982276801
+21
+-130.28349570586812
+31
+366.136991000257
+12
+57.31689428521834
+22
+-128.24245472258949
+32
+353.47182820777937
+13
+57.31689428521834
+23
+-128.24245472258949
+33
+353.47182820777937
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+67.23399876767623
+20
+-80.30734926277756
+30
+297.65487898667396
+11
+58.638536011800994
+21
+-91.0285186310317
+31
+303.4585663973052
+12
+52.02393866810381
+22
+-88.55182841715937
+32
+288.9376352342837
+13
+52.02393866810381
+23
+-88.55182841715937
+33
+288.9376352342837
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+67.23399876767623
+20
+-80.30734926277756
+30
+297.65487898667396
+11
+52.02393866810381
+21
+-88.55182841715937
+31
+288.9376352342837
+12
+57.68725697608723
+22
+-82.77612964424473
+32
+288.0207031246426
+13
+57.68725697608723
+23
+-82.77612964424473
+33
+288.0207031246426
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.90887878493556
+20
+-94.31140330095366
+30
+292.9777342442533
+11
+58.638536011800994
+21
+-91.0285186310317
+31
+303.4585663973052
+12
+56.61626566925722
+22
+-96.57848295625055
+32
+303.99673922476154
+13
+56.61626566925722
+23
+-96.57848295625055
+33
+303.99673922476154
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+58.638536011800994
+20
+-91.0285186310317
+30
+303.4585663973052
+11
+47.90887878493556
+21
+-94.31140330095366
+31
+292.9777342442533
+12
+52.02393866810381
+22
+-88.55182841715937
+32
+288.9376352342837
+13
+52.02393866810381
+23
+-88.55182841715937
+33
+288.9376352342837
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.62408086806756
+20
+-103.71954049096551
+30
+292.5782877080995
+11
+56.61626566925722
+21
+-96.57848295625055
+31
+303.99673922476154
+12
+58.03352510057135
+22
+-105.27047608982602
+32
+302.5334202309369
+13
+58.03352510057135
+23
+-105.27047608982602
+33
+302.5334202309369
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.62408086806756
+20
+-103.71954049096551
+30
+292.5782877080995
+11
+47.90887878493556
+21
+-94.31140330095366
+31
+292.9777342442533
+12
+56.61626566925722
+22
+-96.57848295625055
+32
+303.99673922476154
+13
+56.61626566925722
+23
+-96.57848295625055
+33
+303.99673922476154
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+59.625500560607364
+20
+-113.10942422159492
+30
+291.8353719112333
+11
+58.03352510057135
+21
+-105.27047608982602
+31
+302.5334202309369
+12
+61.686833306229495
+22
+-111.81677507300029
+32
+300.9125130377781
+13
+61.686833306229495
+23
+-111.81677507300029
+33
+300.9125130377781
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+59.625500560607364
+20
+-113.10942422159492
+30
+291.8353719112333
+11
+50.62408086806756
+21
+-103.71954049096551
+31
+292.5782877080995
+12
+58.03352510057135
+22
+-105.27047608982602
+32
+302.5334202309369
+13
+58.03352510057135
+23
+-105.27047608982602
+33
+302.5334202309369
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+66.25771249260856
+20
+-116.24841078672367
+30
+299.6956157456169
+11
+64.32016862403144
+21
+-117.46713342481956
+31
+290.72251933755183
+12
+61.686833306229495
+22
+-111.81677507300029
+32
+300.9125130377781
+13
+61.686833306229495
+23
+-111.81677507300029
+33
+300.9125130377781
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.32016862403144
+20
+-117.46713342481956
+30
+290.72251933755183
+11
+59.625500560607364
+21
+-113.10942422159492
+31
+291.8353719112333
+12
+61.686833306229495
+22
+-111.81677507300029
+32
+300.9125130377781
+13
+61.686833306229495
+23
+-111.81677507300029
+33
+300.9125130377781
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.15336691609762
+20
+-115.31352944202122
+30
+297.709030916166
+11
+71.19451269474017
+21
+-115.9347555096667
+31
+288.6391911733744
+12
+64.32016862403144
+22
+-117.46713342481956
+32
+290.72251933755183
+13
+64.32016862403144
+23
+-117.46713342481956
+33
+290.72251933755183
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.15336691609762
+20
+-115.31352944202122
+30
+297.709030916166
+11
+64.32016862403144
+21
+-117.46713342481956
+31
+290.72251933755183
+12
+66.25771249260856
+22
+-116.24841078672367
+32
+299.6956157456169
+13
+66.25771249260856
+23
+-116.24841078672367
+33
+299.6956157456169
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+71.98576973653493
+20
+-115.75252514017023
+30
+306.6617442945869
+11
+65.8236756509274
+21
+-115.64239593522943
+31
+305.4402836375813
+12
+70.33343617080781
+22
+-118.39684295603591
+32
+314.39330124032483
+13
+70.33343617080781
+23
+-118.39684295603591
+33
+314.39330124032483
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.33343617080781
+20
+-118.39684295603591
+30
+314.39330124032483
+11
+65.8236756509274
+21
+-115.64239593522943
+31
+305.4402836375813
+12
+65.55802697204888
+22
+-114.72485537694224
+32
+310.934270687361
+13
+65.55802697204888
+23
+-114.72485537694224
+33
+310.934270687361
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.33343617080781
+20
+-118.39684295603591
+30
+314.39330124032483
+11
+65.55802697204888
+21
+-114.72485537694224
+31
+310.934270687361
+12
+68.59528092355104
+22
+-117.57543728382913
+32
+319.1179049771362
+13
+68.59528092355104
+23
+-117.57543728382913
+33
+319.1179049771362
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.55802697204888
+20
+-114.72485537694224
+30
+310.934270687361
+11
+65.32343959655273
+21
+-111.27282198340886
+31
+316.1769684463102
+12
+68.59528092355104
+22
+-117.57543728382913
+32
+319.1179049771362
+13
+68.59528092355104
+23
+-117.57543728382913
+33
+319.1179049771362
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.15336691609762
+20
+-115.31352944202122
+30
+297.709030916166
+11
+66.25771249260856
+21
+-116.24841078672367
+31
+299.6956157456169
+12
+71.98576973653493
+22
+-115.75252514017023
+32
+306.6617442945869
+13
+71.98576973653493
+23
+-115.75252514017023
+33
+306.6617442945869
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+71.98576973653493
+20
+-115.75252514017023
+30
+306.6617442945869
+11
+66.25771249260856
+21
+-116.24841078672367
+31
+299.6956157456169
+12
+65.8236756509274
+22
+-115.64239593522943
+32
+305.4402836375813
+13
+65.8236756509274
+23
+-115.64239593522943
+33
+305.4402836375813
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.686833306229495
+20
+-111.81677507300029
+30
+300.9125130377781
+11
+62.64538330326392
+21
+-110.89588804716023
+31
+308.71982183995385
+12
+65.8236756509274
+22
+-115.64239593522943
+32
+305.4402836375813
+13
+65.8236756509274
+23
+-115.64239593522943
+33
+305.4402836375813
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+66.25771249260856
+20
+-116.24841078672367
+30
+299.6956157456169
+11
+61.686833306229495
+21
+-111.81677507300029
+31
+300.9125130377781
+12
+65.8236756509274
+22
+-115.64239593522943
+32
+305.4402836375813
+13
+65.8236756509274
+23
+-115.64239593522943
+33
+305.4402836375813
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+58.03352510057135
+20
+-105.27047608982602
+30
+302.5334202309369
+11
+61.42580883706117
+21
+-104.66111477077926
+31
+311.7854903432295
+12
+62.64538330326392
+22
+-110.89588804716023
+32
+308.71982183995385
+13
+62.64538330326392
+23
+-110.89588804716023
+33
+308.71982183995385
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.686833306229495
+20
+-111.81677507300029
+30
+300.9125130377781
+11
+58.03352510057135
+21
+-105.27047608982602
+31
+302.5334202309369
+12
+62.64538330326392
+22
+-110.89588804716023
+32
+308.71982183995385
+13
+62.64538330326392
+23
+-110.89588804716023
+33
+308.71982183995385
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.8236756509274
+20
+-115.64239593522943
+30
+305.4402836375813
+11
+65.32343959655273
+21
+-111.27282198340886
+31
+316.1769684463102
+12
+65.55802697204888
+22
+-114.72485537694224
+32
+310.934270687361
+13
+65.55802697204888
+23
+-114.72485537694224
+33
+310.934270687361
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.8236756509274
+20
+-115.64239593522943
+30
+305.4402836375813
+11
+62.64538330326392
+21
+-110.89588804716023
+31
+308.71982183995385
+12
+65.32343959655273
+22
+-111.27282198340886
+32
+316.1769684463102
+13
+65.32343959655273
+23
+-111.27282198340886
+33
+316.1769684463102
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+62.64538330326392
+20
+-110.89588804716023
+30
+308.71982183995385
+11
+61.42580883706117
+21
+-104.66111477077926
+31
+311.7854903432295
+12
+65.32343959655273
+22
+-111.27282198340886
+32
+316.1769684463102
+13
+65.32343959655273
+23
+-111.27282198340886
+33
+316.1769684463102
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.42580883706117
+20
+-104.66111477077926
+30
+311.7854903432295
+11
+66.47818385951565
+21
+-107.80010133590838
+31
+320.9718480017445
+12
+65.32343959655273
+22
+-111.27282198340886
+32
+316.1769684463102
+13
+65.32343959655273
+23
+-111.27282198340886
+33
+316.1769684463102
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.42580883706117
+20
+-104.66111477077926
+30
+311.7854903432295
+11
+62.62098451255612
+21
+-99.00162968926662
+31
+313.32608231510557
+12
+66.47818385951565
+22
+-107.80010133590838
+32
+320.9718480017445
+13
+66.47818385951565
+23
+-107.80010133590838
+33
+320.9718480017445
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+62.62098451255612
+20
+-99.00162968926662
+30
+313.32608231510557
+11
+67.75473954142379
+21
+-103.52605382152002
+31
+323.25900646236033
+12
+66.47818385951565
+22
+-107.80010133590838
+32
+320.9718480017445
+13
+66.47818385951565
+23
+-107.80010133590838
+33
+320.9718480017445
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+56.61626566925722
+20
+-96.57848295625055
+30
+303.99673922476154
+11
+62.62098451255612
+21
+-99.00162968926662
+31
+313.32608231510557
+12
+61.42580883706117
+22
+-104.66111477077926
+32
+311.7854903432295
+13
+61.42580883706117
+23
+-104.66111477077926
+33
+311.7854903432295
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+58.03352510057135
+20
+-105.27047608982602
+30
+302.5334202309369
+11
+56.61626566925722
+21
+-96.57848295625055
+31
+303.99673922476154
+12
+61.42580883706117
+22
+-104.66111477077926
+32
+311.7854903432295
+13
+61.42580883706117
+23
+-104.66111477077926
+33
+311.7854903432295
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+62.62098451255612
+20
+-99.00162968926662
+30
+313.32608231510557
+11
+68.65503058059606
+21
+-97.67521164081468
+31
+323.11297878730267
+12
+67.75473954142379
+22
+-103.52605382152002
+32
+323.25900646236033
+13
+67.75473954142379
+23
+-103.52605382152002
+33
+323.25900646236033
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+69.35833637059993
+20
+-63.8917090158591
+30
+285.31706156579105
+11
+68.60297779892392
+21
+-87.89135741184703
+31
+318.1395195542473
+12
+67.23399876767623
+22
+-80.30734926277756
+32
+297.65487898667396
+13
+67.23399876767623
+23
+-80.30734926277756
+33
+297.65487898667396
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+69.35833637059993
+20
+-63.8917090158591
+30
+285.31706156579105
+11
+75.55078595916036
+21
+-67.9038193881146
+31
+300.9748790240126
+12
+68.60297779892392
+22
+-87.89135741184703
+32
+318.1395195542473
+13
+68.60297779892392
+23
+-87.89135741184703
+33
+318.1395195542473
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+58.638536011800994
+20
+-91.0285186310317
+30
+303.4585663973052
+11
+68.60297779892392
+21
+-87.89135741184703
+31
+318.1395195542473
+12
+64.03596226144745
+22
+-91.13651826571312
+32
+311.92908422370783
+13
+64.03596226144745
+23
+-91.13651826571312
+33
+311.92908422370783
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.60297779892392
+20
+-87.89135741184703
+30
+318.1395195542473
+11
+58.638536011800994
+21
+-91.0285186310317
+31
+303.4585663973052
+12
+67.23399876767623
+22
+-80.30734926277756
+32
+297.65487898667396
+13
+67.23399876767623
+23
+-80.30734926277756
+33
+297.65487898667396
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.03596226144745
+20
+-91.13651826571312
+30
+311.92908422370783
+11
+68.65503058059606
+21
+-97.67521164081468
+31
+323.11297878730267
+12
+62.62098451255612
+22
+-99.00162968926662
+32
+313.32608231510557
+13
+62.62098451255612
+23
+-99.00162968926662
+33
+313.32608231510557
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.03596226144745
+20
+-91.13651826571312
+30
+311.92908422370783
+11
+68.60297779892392
+21
+-87.89135741184703
+31
+318.1395195542473
+12
+68.65503058059606
+22
+-97.67521164081468
+32
+323.11297878730267
+13
+68.65503058059606
+23
+-97.67521164081468
+33
+323.11297878730267
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+58.638536011800994
+20
+-91.0285186310317
+30
+303.4585663973052
+11
+64.03596226144745
+21
+-91.13651826571312
+31
+311.92908422370783
+12
+62.62098451255612
+22
+-99.00162968926662
+32
+313.32608231510557
+13
+62.62098451255612
+23
+-99.00162968926662
+33
+313.32608231510557
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+58.638536011800994
+20
+-91.0285186310317
+30
+303.4585663973052
+11
+62.62098451255612
+21
+-99.00162968926662
+31
+313.32608231510557
+12
+56.61626566925722
+22
+-96.57848295625055
+32
+303.99673922476154
+13
+56.61626566925722
+23
+-96.57848295625055
+33
+303.99673922476154
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.93549722820116
+20
+-114.1468291631579
+30
+278.4963522432213
+11
+63.03640282566724
+21
+-120.27025633730818
+31
+283.2811923959928
+12
+71.19451269474017
+22
+-115.9347555096667
+32
+288.6391911733744
+13
+71.19451269474017
+23
+-115.9347555096667
+33
+288.6391911733744
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+71.19451269474017
+20
+-115.9347555096667
+30
+288.6391911733744
+11
+63.03640282566724
+21
+-120.27025633730818
+31
+283.2811923959928
+12
+64.32016862403144
+22
+-117.46713342481956
+32
+290.72251933755183
+13
+64.32016862403144
+23
+-117.46713342481956
+33
+290.72251933755183
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.32016862403144
+20
+-117.46713342481956
+30
+290.72251933755183
+11
+63.03640282566724
+21
+-120.27025633730818
+31
+283.2811923959928
+12
+59.625500560607364
+22
+-113.10942422159492
+32
+291.8353719112333
+13
+59.625500560607364
+23
+-113.10942422159492
+33
+291.8353719112333
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.03640282566724
+20
+-120.27025633730818
+30
+283.2811923959928
+11
+58.54459154084625
+21
+-114.05008582843327
+31
+286.6310064169878
+12
+59.625500560607364
+22
+-113.10942422159492
+32
+291.8353719112333
+13
+59.625500560607364
+23
+-113.10942422159492
+33
+291.8353719112333
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+58.54459154084625
+20
+-114.05008582843327
+30
+286.6310064169878
+11
+50.62408086806756
+21
+-103.71954049096551
+31
+292.5782877080995
+12
+59.625500560607364
+22
+-113.10942422159492
+32
+291.8353719112333
+13
+59.625500560607364
+23
+-113.10942422159492
+33
+291.8353719112333
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+58.54459154084625
+20
+-114.05008582843327
+30
+286.6310064169878
+11
+49.026173033732256
+21
+-104.25223728060762
+31
+288.9151226343746
+12
+50.62408086806756
+22
+-103.71954049096551
+32
+292.5782877080995
+13
+50.62408086806756
+23
+-103.71954049096551
+33
+292.5782877080995
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+49.026173033732256
+20
+-104.25223728060762
+30
+288.9151226343746
+11
+47.90887878493556
+21
+-94.31140330095366
+31
+292.9777342442533
+12
+50.62408086806756
+22
+-103.71954049096551
+32
+292.5782877080995
+13
+50.62408086806756
+23
+-103.71954049096551
+33
+292.5782877080995
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.90887878493556
+20
+-94.31140330095366
+30
+292.9777342442533
+11
+49.026173033732256
+21
+-104.25223728060762
+31
+288.9151226343746
+12
+45.24174414484389
+22
+-95.03849943301859
+32
+290.4328977820236
+13
+45.24174414484389
+23
+-95.03849943301859
+33
+290.4328977820236
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+78.5724523690229
+20
+-97.24534267234493
+30
+267.89261346366635
+11
+78.31767179986072
+21
+-106.36537942843987
+31
+274.99168804180243
+12
+81.40065157978867
+22
+-97.7746929944359
+32
+273.1882462548235
+13
+81.40065157978867
+23
+-97.7746929944359
+33
+273.1882462548235
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+78.5724523690229
+20
+-97.24534267234493
+30
+267.89261346366635
+11
+74.66528630657429
+21
+-108.62241968107286
+31
+272.01028967600985
+12
+78.31767179986072
+22
+-106.36537942843987
+32
+274.99168804180243
+13
+78.31767179986072
+23
+-106.36537942843987
+33
+274.99168804180243
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+79.27280931266354
+20
+-73.88395690610402
+30
+270.3674783316025
+11
+83.24806290817882
+21
+-88.51653839568291
+31
+274.2636792367721
+12
+84.0089279401018
+22
+-76.2718136176464
+32
+275.8027500870346
+13
+84.0089279401018
+23
+-76.2718136176464
+33
+275.8027500870346
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+79.47525538843051
+20
+-85.03073610228905
+30
+268.2923642241441
+11
+83.24806290817882
+21
+-88.51653839568291
+31
+274.2636792367721
+12
+79.27280931266354
+22
+-73.88395690610402
+32
+270.3674783316025
+13
+79.27280931266354
+23
+-73.88395690610402
+33
+270.3674783316025
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+78.62071086493809
+20
+-64.24613035219758
+30
+273.2901614030506
+11
+84.0089279401018
+21
+-76.2718136176464
+31
+275.8027500870346
+12
+82.67198373007028
+22
+-66.0148905663526
+32
+275.1307185574421
+13
+82.67198373007028
+23
+-66.0148905663526
+33
+275.1307185574421
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+79.27280931266354
+20
+-73.88395690610402
+30
+270.3674783316025
+11
+84.0089279401018
+21
+-76.2718136176464
+31
+275.8027500870346
+12
+78.62071086493809
+22
+-64.24613035219758
+32
+273.2901614030506
+13
+78.62071086493809
+23
+-64.24613035219758
+33
+273.2901614030506
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+81.22467910461268
+20
+-57.003766117908334
+30
+276.94298284979345
+11
+76.86701857727938
+21
+-58.02170070279953
+31
+274.6491314540719
+12
+82.67198373007028
+22
+-66.0148905663526
+32
+275.1307185574421
+13
+82.67198373007028
+23
+-66.0148905663526
+33
+275.1307185574421
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+76.86701857727938
+20
+-58.02170070279953
+30
+274.6491314540719
+11
+78.62071086493809
+21
+-64.24613035219758
+31
+273.2901614030506
+12
+82.67198373007028
+22
+-66.0148905663526
+32
+275.1307185574421
+13
+82.67198373007028
+23
+-66.0148905663526
+33
+275.1307185574421
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.36973270078948
+20
+-47.7465241921251
+30
+280.52157356171557
+11
+75.34312852073973
+21
+-55.00440386688936
+31
+276.7257666831436
+12
+81.22467910461268
+22
+-57.003766117908334
+32
+276.94298284979345
+13
+81.22467910461268
+23
+-57.003766117908334
+33
+276.94298284979345
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.34312852073973
+20
+-55.00440386688936
+30
+276.7257666831436
+11
+76.86701857727938
+21
+-58.02170070279953
+31
+274.6491314540719
+12
+81.22467910461268
+22
+-57.003766117908334
+32
+276.94298284979345
+13
+81.22467910461268
+23
+-57.003766117908334
+33
+276.94298284979345
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.36973270078948
+20
+-47.7465241921251
+30
+280.52157356171557
+11
+80.07237167847732
+21
+-44.53208999488541
+31
+284.2236793487902
+12
+74.1993363334063
+22
+-52.44070549663286
+32
+282.75275474688976
+13
+74.1993363334063
+23
+-52.44070549663286
+33
+282.75275474688976
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.36973270078948
+20
+-47.7465241921251
+30
+280.52157356171557
+11
+74.1993363334063
+21
+-52.44070549663286
+31
+282.75275474688976
+12
+75.34312852073973
+22
+-55.00440386688936
+32
+276.7257666831436
+13
+75.34312852073973
+23
+-55.00440386688936
+33
+276.7257666831436
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.07237167847732
+20
+-44.53208999488541
+30
+284.2236793487902
+11
+83.91638290103303
+21
+-35.39775469561103
+31
+291.0921518900666
+12
+77.56529553922347
+22
+-51.853248328844906
+32
+291.6923864794201
+13
+77.56529553922347
+23
+-51.853248328844906
+33
+291.6923864794201
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+74.1993363334063
+20
+-52.44070549663286
+30
+282.75275474688976
+11
+80.07237167847732
+21
+-44.53208999488541
+31
+284.2236793487902
+12
+77.56529553922347
+22
+-51.853248328844906
+32
+291.6923864794201
+13
+77.56529553922347
+23
+-51.853248328844906
+33
+291.6923864794201
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+83.91638290103303
+20
+-35.39775469561103
+30
+291.0921518900666
+11
+88.08982343179265
+21
+-30.730953580179566
+31
+298.87755654098413
+12
+84.1970906839021
+22
+-51.81947942899092
+32
+304.9501782531802
+13
+84.1970906839021
+23
+-51.81947942899092
+33
+304.9501782531802
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+83.91638290103303
+20
+-35.39775469561103
+30
+291.0921518900666
+11
+84.1970906839021
+21
+-51.81947942899092
+31
+304.9501782531802
+12
+77.56529553922347
+22
+-51.853248328844906
+32
+291.6923864794201
+13
+77.56529553922347
+23
+-51.853248328844906
+33
+291.6923864794201
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.65503058059606
+20
+-97.67521164081468
+30
+323.11297878730267
+11
+71.19074031313446
+21
+-106.54182953581788
+31
+332.2664802189279
+12
+67.75473954142379
+22
+-103.52605382152002
+32
+323.25900646236033
+13
+67.75473954142379
+23
+-103.52605382152002
+33
+323.25900646236033
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.65503058059606
+20
+-97.67521164081468
+30
+323.11297878730267
+11
+72.72576497989745
+21
+-95.77563496775467
+31
+329.6163821409292
+12
+71.19074031313446
+22
+-106.54182953581788
+32
+332.2664802189279
+13
+71.19074031313446
+23
+-106.54182953581788
+33
+332.2664802189279
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.32343959655273
+20
+-111.27282198340886
+30
+316.1769684463102
+11
+66.47818385951565
+21
+-107.80010133590838
+31
+320.9718480017445
+12
+68.59528092355104
+22
+-117.57543728382913
+32
+319.1179049771362
+13
+68.59528092355104
+23
+-117.57543728382913
+33
+319.1179049771362
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.59528092355104
+20
+-117.57543728382913
+30
+319.1179049771362
+11
+66.47818385951565
+21
+-107.80010133590838
+31
+320.9718480017445
+12
+69.11428761865724
+22
+-110.98989336298473
+32
+328.7198330609265
+13
+69.11428761865724
+23
+-110.98989336298473
+33
+328.7198330609265
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+66.47818385951565
+20
+-107.80010133590838
+30
+320.9718480017445
+11
+67.75473954142379
+21
+-103.52605382152002
+31
+323.25900646236033
+12
+69.11428761865724
+22
+-110.98989336298473
+32
+328.7198330609265
+13
+69.11428761865724
+23
+-110.98989336298473
+33
+328.7198330609265
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+67.75473954142379
+20
+-103.52605382152002
+30
+323.25900646236033
+11
+71.19074031313446
+21
+-106.54182953581788
+31
+332.2664802189279
+12
+69.11428761865724
+22
+-110.98989336298473
+32
+328.7198330609265
+13
+69.11428761865724
+23
+-110.98989336298473
+33
+328.7198330609265
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.55078595916036
+20
+-67.9038193881146
+30
+300.9748790240126
+11
+84.1970906839021
+21
+-51.81947942899092
+31
+304.9501782531802
+12
+78.33697179091436
+22
+-67.63914422707256
+32
+311.5728375414341
+13
+78.33697179091436
+23
+-67.63914422707256
+33
+311.5728375414341
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.56529553922347
+20
+-51.853248328844906
+30
+291.6923864794201
+11
+84.1970906839021
+21
+-51.81947942899092
+31
+304.9501782531802
+12
+75.55078595916036
+22
+-67.9038193881146
+32
+300.9748790240126
+13
+75.55078595916036
+23
+-67.9038193881146
+33
+300.9748790240126
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+78.33697179091436
+20
+-67.63914422707256
+30
+311.5728375414341
+11
+73.6515804397727
+21
+-84.52450682876498
+31
+324.54222465694795
+12
+68.60297779892392
+22
+-87.89135741184703
+32
+318.1395195542473
+13
+68.60297779892392
+23
+-87.89135741184703
+33
+318.1395195542473
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.55078595916036
+20
+-67.9038193881146
+30
+300.9748790240126
+11
+78.33697179091436
+21
+-67.63914422707256
+31
+311.5728375414341
+12
+68.60297779892392
+22
+-87.89135741184703
+32
+318.1395195542473
+13
+68.60297779892392
+23
+-87.89135741184703
+33
+318.1395195542473
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.60297779892392
+20
+-87.89135741184703
+30
+318.1395195542473
+11
+72.72576497989745
+21
+-95.77563496775467
+31
+329.6163821409292
+12
+68.65503058059606
+22
+-97.67521164081468
+32
+323.11297878730267
+13
+68.65503058059606
+23
+-97.67521164081468
+33
+323.11297878730267
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.60297779892392
+20
+-87.89135741184703
+30
+318.1395195542473
+11
+73.6515804397727
+21
+-84.52450682876498
+31
+324.54222465694795
+12
+72.72576497989745
+22
+-95.77563496775467
+32
+329.6163821409292
+13
+72.72576497989745
+23
+-95.77563496775467
+33
+329.6163821409292
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+74.1993363334063
+20
+-52.44070549663286
+30
+282.75275474688976
+11
+77.56529553922347
+21
+-51.853248328844906
+31
+291.6923864794201
+12
+75.55078595916036
+22
+-67.9038193881146
+32
+300.9748790240126
+13
+75.55078595916036
+23
+-67.9038193881146
+33
+300.9748790240126
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+74.1993363334063
+20
+-52.44070549663286
+30
+282.75275474688976
+11
+75.55078595916036
+21
+-67.9038193881146
+31
+300.9748790240126
+12
+69.35833637059993
+22
+-63.8917090158591
+32
+285.31706156579105
+13
+69.35833637059993
+23
+-63.8917090158591
+33
+285.31706156579105
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.34312852073973
+20
+-55.00440386688936
+30
+276.7257666831436
+11
+74.1993363334063
+21
+-52.44070549663286
+31
+282.75275474688976
+12
+69.35833637059993
+22
+-63.8917090158591
+32
+285.31706156579105
+13
+69.35833637059993
+23
+-63.8917090158591
+33
+285.31706156579105
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.34312852073973
+20
+-55.00440386688936
+30
+276.7257666831436
+11
+69.35833637059993
+21
+-63.8917090158591
+31
+285.31706156579105
+12
+66.86844282111137
+22
+-63.31489969937311
+32
+277.04885291421
+13
+66.86844282111137
+23
+-63.31489969937311
+33
+277.04885291421
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.34312852073973
+20
+-55.00440386688936
+30
+276.7257666831436
+11
+66.86844282111137
+21
+-63.31489969937311
+31
+277.04885291421
+12
+76.86701857727938
+22
+-58.02170070279953
+32
+274.6491314540719
+13
+76.86701857727938
+23
+-58.02170070279953
+33
+274.6491314540719
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+76.86701857727938
+20
+-58.02170070279953
+30
+274.6491314540719
+11
+66.86844282111137
+21
+-63.31489969937311
+31
+277.04885291421
+12
+68.19686875009788
+22
+-64.0377366909151
+32
+272.9716385368278
+13
+68.19686875009788
+23
+-64.0377366909151
+33
+272.9716385368278
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+78.62071086493809
+20
+-64.24613035219758
+30
+273.2901614030506
+11
+72.28010676907608
+21
+-66.90991852473525
+31
+271.0875773042403
+12
+79.27280931266354
+22
+-73.88395690610402
+32
+270.3674783316025
+13
+79.27280931266354
+23
+-73.88395690610402
+33
+270.3674783316025
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.28010676907608
+20
+-66.90991852473525
+30
+271.0875773042403
+11
+76.7299229283447
+21
+-73.25512523038003
+31
+269.13719516922924
+12
+79.27280931266354
+22
+-73.88395690610402
+32
+270.3674783316025
+13
+79.27280931266354
+23
+-73.88395690610402
+33
+270.3674783316025
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+76.86701857727938
+20
+-58.02170070279953
+30
+274.6491314540719
+11
+68.19686875009788
+21
+-64.0377366909151
+31
+272.9716385368278
+12
+78.62071086493809
+22
+-64.24613035219758
+32
+273.2901614030506
+13
+78.62071086493809
+23
+-64.24613035219758
+33
+273.2901614030506
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.19686875009788
+20
+-64.0377366909151
+30
+272.9716385368278
+11
+72.28010676907608
+21
+-66.90991852473525
+31
+271.0875773042403
+12
+78.62071086493809
+22
+-64.24613035219758
+32
+273.2901614030506
+13
+78.62071086493809
+23
+-64.24613035219758
+33
+273.2901614030506
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.19686875009788
+20
+-64.0377366909151
+30
+272.9716385368278
+11
+64.38101348863943
+21
+-68.62118034183553
+31
+272.160880715925
+12
+70.30785090524014
+22
+-68.95582709717932
+32
+271.3616834192988
+13
+70.30785090524014
+23
+-68.95582709717932
+33
+271.3616834192988
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.19686875009788
+20
+-64.0377366909151
+30
+272.9716385368278
+11
+70.30785090524014
+21
+-68.95582709717932
+31
+271.3616834192988
+12
+72.28010676907608
+22
+-66.90991852473525
+32
+271.0875773042403
+13
+72.28010676907608
+23
+-66.90991852473525
+33
+271.0875773042403
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.38101348863943
+20
+-68.62118034183553
+30
+272.160880715925
+11
+66.86844282111137
+21
+-63.31489969937311
+31
+277.04885291421
+12
+64.32503621320006
+22
+-67.98748107694438
+32
+276.7199864210026
+13
+64.32503621320006
+23
+-67.98748107694438
+33
+276.7199864210026
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.38101348863943
+20
+-68.62118034183553
+30
+272.160880715925
+11
+68.19686875009788
+21
+-64.0377366909151
+31
+272.9716385368278
+12
+66.86844282111137
+22
+-63.31489969937311
+32
+277.04885291421
+13
+66.86844282111137
+23
+-63.31489969937311
+33
+277.04885291421
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+66.86844282111137
+20
+-63.31489969937311
+30
+277.04885291421
+11
+69.35833637059993
+21
+-63.8917090158591
+31
+285.31706156579105
+12
+60.286610437005585
+22
+-71.97312393309284
+32
+282.23283537880934
+13
+60.286610437005585
+23
+-71.97312393309284
+33
+282.23283537880934
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.32503621320006
+20
+-67.98748107694438
+30
+276.7199864210026
+11
+66.86844282111137
+21
+-63.31489969937311
+31
+277.04885291421
+12
+60.286610437005585
+22
+-71.97312393309284
+32
+282.23283537880934
+13
+60.286610437005585
+23
+-71.97312393309284
+33
+282.23283537880934
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+69.35833637059993
+20
+-63.8917090158591
+30
+285.31706156579105
+11
+67.23399876767623
+21
+-80.30734926277756
+31
+297.65487898667396
+12
+57.68725697608723
+22
+-82.77612964424473
+32
+288.0207031246426
+13
+57.68725697608723
+23
+-82.77612964424473
+33
+288.0207031246426
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+60.286610437005585
+20
+-71.97312393309284
+30
+282.23283537880934
+11
+69.35833637059993
+21
+-63.8917090158591
+31
+285.31706156579105
+12
+57.68725697608723
+22
+-82.77612964424473
+32
+288.0207031246426
+13
+57.68725697608723
+23
+-82.77612964424473
+33
+288.0207031246426
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+11.72808849443452
+20
+97.91243098754273
+30
+309.65044404418705
+11
+0.020623870886214313
+21
+98.07306143010814
+31
+308.2723078608159
+12
+10.339912908402994
+22
+91.81607977813896
+32
+329.5162923386974
+13
+10.339912908402994
+23
+91.81607977813896
+33
+329.5162923386974
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.339912908402994
+20
+91.81607977813896
+30
+329.5162923386974
+11
+0.020623870886214313
+21
+98.07306143010814
+31
+308.2723078608159
+12
+0.020623870886214313
+22
+92.57177299657081
+32
+327.7158927949469
+13
+0.020623870886214313
+23
+92.57177299657081
+33
+327.7158927949469
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.90445070079258
+20
+62.637316506714946
+30
+374.37264764932246
+11
+9.959632504602991
+21
+74.58390144817649
+31
+359.6792212951398
+12
+0.020623870886214313
+22
+74.90881302518322
+32
+359.66309740601866
+13
+0.020623870886214313
+23
+74.90881302518322
+33
+359.66309740601866
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.90445070079258
+20
+62.637316506714946
+30
+374.37264764932246
+11
+0.020623870886214313
+21
+74.90881302518322
+31
+359.66309740601866
+12
+0.020623870886214313
+22
+64.50555807450392
+32
+373.276831637733
+13
+0.020623870886214313
+23
+64.50555807450392
+33
+373.276831637733
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.87647671324042
+20
+84.09304111346269
+30
+263.04479887607073
+11
+0.020623870886214313
+21
+86.68472812144014
+31
+264.0277476638134
+12
+0.020623870886214313
+22
+92.5705560992921
+32
+274.17636685610654
+13
+0.020623870886214313
+23
+92.5705560992921
+33
+274.17636685610654
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.87647671324042
+20
+84.09304111346269
+30
+263.04479887607073
+11
+0.020623870886214313
+21
+92.5705560992921
+31
+274.17636685610654
+12
+14.294220659276885
+22
+89.8565709134533
+32
+271.43895639739196
+13
+14.294220659276885
+23
+89.8565709134533
+33
+271.43895639739196
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.111334461432385
+20
+75.80901279708286
+30
+265.6617365028584
+11
+16.87647671324042
+21
+84.09304111346269
+31
+263.04479887607073
+12
+14.294220659276885
+22
+89.8565709134533
+32
+271.43895639739196
+13
+14.294220659276885
+23
+89.8565709134533
+33
+271.43895639739196
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.22420168528024
+20
+81.98446233046919
+30
+275.43098796432076
+11
+38.111334461432385
+21
+75.80901279708286
+31
+265.6617365028584
+12
+14.294220659276885
+22
+89.8565709134533
+32
+271.43895639739196
+13
+14.294220659276885
+23
+89.8565709134533
+33
+271.43895639739196
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.111334461432385
+20
+75.80901279708286
+30
+265.6617365028584
+11
+38.22420168528024
+21
+81.98446233046919
+31
+275.43098796432076
+12
+60.47449937891509
+22
+55.661452779434676
+32
+270.16912407301413
+13
+60.47449937891509
+23
+55.661452779434676
+33
+270.16912407301413
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+60.47449937891509
+20
+55.661452779434676
+30
+270.16912407301413
+11
+38.22420168528024
+21
+81.98446233046919
+31
+275.43098796432076
+12
+61.75516208918426
+22
+61.847854388449896
+32
+282.7125971362779
+13
+61.75516208918426
+23
+61.847854388449896
+33
+282.7125971362779
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+60.47449937891509
+20
+55.661452779434676
+30
+270.16912407301413
+11
+61.75516208918426
+21
+61.847854388449896
+31
+282.7125971362779
+12
+75.57265056125725
+22
+38.636146989145686
+32
+276.050692910342
+13
+75.57265056125725
+23
+38.636146989145686
+33
+276.050692910342
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.57265056125725
+20
+38.636146989145686
+30
+276.050692910342
+11
+61.75516208918426
+21
+61.847854388449896
+31
+282.7125971362779
+12
+76.14204897323182
+22
+45.24481195854033
+32
+289.3361690975005
+13
+76.14204897323182
+23
+45.24481195854033
+33
+289.3361690975005
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.57265056125725
+20
+38.636146989145686
+30
+276.050692910342
+11
+76.14204897323182
+21
+45.24481195854033
+31
+289.3361690975005
+12
+83.50227275251099
+22
+18.033771608551852
+32
+283.6788135862414
+13
+83.50227275251099
+23
+18.033771608551852
+33
+283.6788135862414
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+83.50227275251099
+20
+18.033771608551852
+30
+283.6788135862414
+11
+76.14204897323182
+21
+45.24481195854033
+31
+289.3361690975005
+12
+85.73570519767682
+22
+21.969217451393796
+32
+297.36860389871964
+13
+85.73570519767682
+23
+21.969217451393796
+33
+297.36860389871964
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+83.50227275251099
+20
+18.033771608551852
+30
+283.6788135862414
+11
+85.73570519767682
+21
+21.969217451393796
+31
+297.36860389871964
+12
+88.83626823080367
+22
+1.0385840262428065
+32
+293.6156926496928
+13
+88.83626823080367
+23
+1.0385840262428065
+33
+293.6156926496928
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+88.83626823080367
+20
+1.0385840262428065
+30
+293.6156926496928
+11
+85.73570519767682
+21
+21.969217451393796
+31
+297.36860389871964
+12
+90.63341257429785
+22
+2.857541253695383
+32
+307.5345638774193
+13
+90.63341257429785
+23
+2.857541253695383
+33
+307.5345638774193
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+88.83626823080367
+20
+1.0385840262428065
+30
+293.6156926496928
+11
+90.63341257429785
+21
+2.857541253695383
+31
+307.5345638774193
+12
+91.53756726237273
+22
+-26.135949404986974
+32
+312.5189751860992
+13
+91.53756726237273
+23
+-26.135949404986974
+33
+312.5189751860992
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+90.63341257429785
+20
+2.857541253695383
+30
+307.5345638774193
+11
+92.42721045023855
+21
+-21.132067739627296
+31
+321.1692895874198
+12
+91.53756726237273
+22
+-26.135949404986974
+32
+312.5189751860992
+13
+91.53756726237273
+23
+-26.135949404986974
+33
+312.5189751860992
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+91.53756726237273
+20
+-26.135949404986974
+30
+312.5189751860992
+11
+92.42721045023855
+21
+-21.132067739627296
+31
+321.1692895874198
+12
+86.90006294924783
+22
+-48.320291265389336
+32
+322.5024005709738
+13
+86.90006294924783
+23
+-48.320291265389336
+33
+322.5024005709738
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+92.42721045023855
+20
+-21.132067739627296
+30
+321.1692895874198
+11
+88.24859810598728
+21
+-43.55583414226228
+31
+331.6866286592298
+12
+86.90006294924783
+22
+-48.320291265389336
+32
+322.5024005709738
+13
+86.90006294924783
+23
+-48.320291265389336
+33
+322.5024005709738
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+88.24859810598728
+20
+-43.55583414226228
+30
+331.6866286592298
+11
+85.93162566171459
+21
+-55.624108812938914
+31
+342.9228498063858
+12
+83.33969527427841
+22
+-64.25586553055062
+32
+334.4237348936153
+13
+83.33969527427841
+23
+-64.25586553055062
+33
+334.4237348936153
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+86.90006294924783
+20
+-48.320291265389336
+30
+322.5024005709738
+11
+88.24859810598728
+21
+-43.55583414226228
+31
+331.6866286592298
+12
+83.33969527427841
+22
+-64.25586553055062
+32
+334.4237348936153
+13
+83.33969527427841
+23
+-64.25586553055062
+33
+334.4237348936153
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+85.93162566171459
+20
+-55.624108812938914
+30
+342.9228498063858
+11
+82.40280604904443
+21
+-73.35095589215923
+31
+352.9601228964403
+12
+78.82632665392681
+22
+-88.99812549907419
+32
+347.7076899591506
+13
+78.82632665392681
+23
+-88.99812549907419
+33
+347.7076899591506
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+83.33969527427841
+20
+-64.25586553055062
+30
+334.4237348936153
+11
+85.93162566171459
+21
+-55.624108812938914
+31
+342.9228498063858
+12
+78.82632665392681
+22
+-88.99812549907419
+32
+347.7076899591506
+13
+78.82632665392681
+23
+-88.99812549907419
+33
+347.7076899591506
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+82.40280604904443
+20
+-73.35095589215923
+30
+352.9601228964403
+11
+70.60121441994757
+21
+-88.86426679694232
+31
+370.0158511190277
+12
+69.21288672175451
+22
+-100.77525749260263
+32
+363.32869627428244
+13
+69.21288672175451
+23
+-100.77525749260263
+33
+363.32869627428244
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+78.82632665392681
+20
+-88.99812549907419
+30
+347.7076899591506
+11
+82.40280604904443
+21
+-73.35095589215923
+31
+352.9601228964403
+12
+69.21288672175451
+22
+-100.77525749260263
+32
+363.32869627428244
+13
+69.21288672175451
+23
+-100.77525749260263
+33
+363.32869627428244
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.60121441994757
+20
+-88.86426679694232
+30
+370.0158511190277
+11
+53.764071373460304
+21
+-101.36332310904378
+31
+382.02419359805936
+12
+55.42309787429434
+22
+-113.6153492708316
+32
+374.0735951397288
+13
+55.42309787429434
+23
+-113.6153492708316
+33
+374.0735951397288
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+69.21288672175451
+20
+-100.77525749260263
+30
+363.32869627428244
+11
+70.60121441994757
+21
+-88.86426679694232
+31
+370.0158511190277
+12
+55.42309787429434
+22
+-113.6153492708316
+32
+374.0735951397288
+13
+55.42309787429434
+23
+-113.6153492708316
+33
+374.0735951397288
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.764071373460304
+20
+-101.36332310904378
+30
+382.02419359805936
+11
+34.04446371103367
+21
+-109.15511647074618
+31
+389.66204945229913
+12
+34.438129985047425
+22
+-123.70890386065481
+32
+382.2502322700722
+13
+34.438129985047425
+23
+-123.70890386065481
+33
+382.2502322700722
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.764071373460304
+20
+-101.36332310904378
+30
+382.02419359805936
+11
+34.438129985047425
+21
+-123.70890386065481
+31
+382.2502322700722
+12
+55.42309787429434
+22
+-113.6153492708316
+32
+374.0735951397288
+13
+55.42309787429434
+23
+-113.6153492708316
+33
+374.0735951397288
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.04446371103367
+20
+-109.15511647074618
+30
+389.66204945229913
+11
+16.492849841886972
+21
+-110.78149970171967
+31
+395.32518522568876
+12
+17.37510037870297
+22
+-128.428031559652
+32
+384.9742568585712
+13
+17.37510037870297
+23
+-128.428031559652
+33
+384.9742568585712
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.04446371103367
+20
+-109.15511647074618
+30
+389.66204945229913
+11
+17.37510037870297
+21
+-128.428031559652
+31
+384.9742568585712
+12
+34.438129985047425
+22
+-123.70890386065481
+32
+382.2502322700722
+13
+34.438129985047425
+23
+-123.70890386065481
+33
+382.2502322700722
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.492849841886972
+20
+-110.78149970171967
+30
+395.32518522568876
+11
+0.020623870886214313
+21
+-114.34031583264124
+31
+394.6866183716268
+12
+0.020623870886214313
+22
+-132.80734068981232
+32
+383.0728548395701
+13
+0.020623870886214313
+23
+-132.80734068981232
+33
+383.0728548395701
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.492849841886972
+20
+-110.78149970171967
+30
+395.32518522568876
+11
+0.020623870886214313
+21
+-132.80734068981232
+31
+383.0728548395701
+12
+17.37510037870297
+22
+-128.428031559652
+32
+384.9742568585712
+13
+17.37510037870297
+23
+-128.428031559652
+33
+384.9742568585712
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-64.7584441122329
+30
+412.7885740411657
+11
+15.452402657090182
+21
+-89.58619111552514
+31
+404.5891200865852
+12
+15.964107968443475
+22
+-66.69118123650554
+32
+410.95744784078755
+13
+15.964107968443475
+23
+-66.69118123650554
+33
+410.95744784078755
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-64.7584441122329
+30
+412.7885740411657
+11
+0.020623870886214313
+21
+-89.42860291619074
+31
+405.84282852183264
+12
+15.452402657090182
+22
+-89.58619111552514
+32
+404.5891200865852
+13
+15.452402657090182
+23
+-89.58619111552514
+33
+404.5891200865852
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.871029975760745
+20
+-47.81497466484341
+30
+414.2044340405983
+11
+0.020623870886214313
+21
+-51.43554833334271
+31
+414.7785053381737
+12
+15.964107968443475
+22
+-66.69118123650554
+32
+410.95744784078755
+13
+15.964107968443475
+23
+-66.69118123650554
+33
+410.95744784078755
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-51.43554833334271
+30
+414.7785053381737
+11
+0.020623870886214313
+21
+-64.7584441122329
+31
+412.7885740411657
+12
+15.964107968443475
+22
+-66.69118123650554
+32
+410.95744784078755
+13
+15.964107968443475
+23
+-66.69118123650554
+33
+410.95744784078755
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-23.08336254763007
+30
+415.219630606589
+11
+14.871029975760745
+21
+-47.81497466484341
+31
+414.2044340405983
+12
+16.069065359892278
+22
+-24.58988139532383
+32
+414.02889660620997
+13
+16.069065359892278
+23
+-24.58988139532383
+33
+414.02889660620997
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-23.08336254763007
+30
+415.219630606589
+11
+0.020623870886214313
+21
+-51.43554833334271
+31
+414.7785053381737
+12
+14.871029975760745
+22
+-47.81497466484341
+32
+414.2044340405983
+13
+14.871029975760745
+23
+-47.81497466484341
+33
+414.2044340405983
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+89.36239377506898
+20
+-25.811646276637916
+30
+357.53930740685036
+11
+85.81379958140127
+21
+-17.878084380403713
+31
+368.83181005377435
+12
+79.83657653241872
+22
+-34.48842819406656
+32
+376.057441950293
+13
+79.83657653241872
+23
+-34.48842819406656
+33
+376.057441950293
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+89.36239377506898
+20
+-25.811646276637916
+30
+357.53930740685036
+11
+79.83657653241872
+21
+-34.48842819406656
+31
+376.057441950293
+12
+84.01467777980731
+22
+-42.674192054101475
+32
+367.1722663715848
+13
+84.01467777980731
+23
+-42.674192054101475
+33
+367.1722663715848
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+46.38988673999685
+20
+-21.686364456227
+30
+402.62352673544115
+11
+31.863175314836866
+21
+-22.322497515705425
+31
+408.89632805220236
+12
+31.500539921773193
+22
+-43.51658920461027
+32
+409.89205426150727
+13
+31.500539921773193
+23
+-43.51658920461027
+33
+409.89205426150727
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+46.38988673999685
+20
+-21.686364456227
+30
+402.62352673544115
+11
+31.500539921773193
+21
+-43.51658920461027
+31
+409.89205426150727
+12
+47.260576752537325
+22
+-42.09981653221126
+32
+403.3402792405177
+13
+47.260576752537325
+23
+-42.09981653221126
+33
+403.3402792405177
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.863175314836866
+20
+-22.322497515705425
+30
+408.89632805220236
+11
+14.871029975760745
+21
+-47.81497466484341
+31
+414.2044340405983
+12
+31.500539921773193
+22
+-43.51658920461027
+32
+409.89205426150727
+13
+31.500539921773193
+23
+-43.51658920461027
+33
+409.89205426150727
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.863175314836866
+20
+-22.322497515705425
+30
+408.89632805220236
+11
+16.069065359892278
+21
+-24.58988139532383
+31
+414.02889660620997
+12
+14.871029975760745
+22
+-47.81497466484341
+32
+414.2044340405983
+13
+14.871029975760745
+23
+-47.81497466484341
+33
+414.2044340405983
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+84.85780506868038
+20
+36.438430479486456
+30
+346.7396481632697
+11
+79.59010919710781
+21
+35.4259719324055
+31
+361.8218732023004
+12
+82.52169691448852
+22
+18.705498913802014
+32
+369.7460041445184
+13
+82.52169691448852
+23
+18.705498913802014
+33
+369.7460041445184
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+84.85780506868038
+20
+36.438430479486456
+30
+346.7396481632697
+11
+82.52169691448852
+21
+18.705498913802014
+31
+369.7460041445184
+12
+89.88024441774766
+22
+17.371779481598423
+32
+355.26705593807594
+13
+89.88024441774766
+23
+17.371779481598423
+33
+355.26705593807594
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+89.88024441774766
+20
+17.371779481598423
+30
+355.26705593807594
+11
+82.52169691448852
+21
+18.705498913802014
+31
+369.7460041445184
+12
+80.02985024484597
+22
+1.5241260457929693
+32
+377.86392598051384
+13
+80.02985024484597
+23
+1.5241260457929693
+33
+377.86392598051384
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+89.88024441774766
+20
+17.371779481598423
+30
+355.26705593807594
+11
+80.02985024484597
+21
+1.5241260457929693
+31
+377.86392598051384
+12
+89.34842987864144
+22
+-1.9279073477380417
+32
+362.7871769792967
+13
+89.34842987864144
+23
+-1.9279073477380417
+33
+362.7871769792967
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+89.34842987864144
+20
+-1.9279073477380417
+30
+362.7871769792967
+11
+80.02985024484597
+21
+1.5241260457929693
+31
+377.86392598051384
+12
+73.65109368085585
+22
+-18.674847882449416
+32
+384.01655868966964
+13
+73.65109368085585
+23
+-18.674847882449416
+33
+384.01655868966964
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+89.34842987864144
+20
+-1.9279073477380417
+30
+362.7871769792967
+11
+73.65109368085585
+21
+-18.674847882449416
+31
+384.01655868966964
+12
+85.81379958140127
+22
+-17.878084380403713
+32
+368.83181005377435
+13
+85.81379958140127
+23
+-17.878084380403713
+33
+368.83181005377435
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+92.55568438185834
+20
+-8.98895388549282
+30
+348.67177683888497
+11
+89.34842987864144
+21
+-1.9279073477380417
+31
+362.7871769792967
+12
+85.81379958140127
+22
+-17.878084380403713
+32
+368.83181005377435
+13
+85.81379958140127
+23
+-17.878084380403713
+33
+368.83181005377435
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+92.55568438185834
+20
+-8.98895388549282
+30
+348.67177683888497
+11
+85.81379958140127
+21
+-17.878084380403713
+31
+368.83181005377435
+12
+89.36239377506898
+22
+-25.811646276637916
+32
+357.53930740685036
+13
+89.36239377506898
+23
+-25.811646276637916
+33
+357.53930740685036
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+92.92489102029971
+20
+12.684291112202292
+30
+338.9797983554822
+11
+89.88024441774766
+21
+17.371779481598423
+31
+355.26705593807594
+12
+89.34842987864144
+22
+-1.9279073477380417
+32
+362.7871769792967
+13
+89.34842987864144
+23
+-1.9279073477380417
+33
+362.7871769792967
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+92.92489102029971
+20
+12.684291112202292
+30
+338.9797983554822
+11
+89.34842987864144
+21
+-1.9279073477380417
+31
+362.7871769792967
+12
+92.55568438185834
+22
+-8.98895388549282
+32
+348.67177683888497
+13
+92.55568438185834
+23
+-8.98895388549282
+33
+348.67177683888497
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+88.41835527824354
+20
+32.11023103560109
+30
+329.6586693218647
+11
+84.85780506868038
+21
+36.438430479486456
+31
+346.7396481632697
+12
+89.88024441774766
+22
+17.371779481598423
+32
+355.26705593807594
+13
+89.88024441774766
+23
+17.371779481598423
+33
+355.26705593807594
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+88.41835527824354
+20
+32.11023103560109
+30
+329.6586693218647
+11
+89.88024441774766
+21
+17.371779481598423
+31
+355.26705593807594
+12
+92.92489102029971
+22
+12.684291112202292
+32
+338.9797983554822
+13
+92.92489102029971
+23
+12.684291112202292
+33
+338.9797983554822
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+51.46516985397624
+20
+49.05552582891695
+30
+375.795200583854
+11
+17.90445070079258
+21
+62.637316506714946
+31
+374.37264764932246
+12
+36.14939180214743
+22
+50.75948626226252
+32
+381.33177903885945
+13
+36.14939180214743
+23
+50.75948626226252
+33
+381.33177903885945
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.00697086846214
+20
+64.47665676381719
+30
+365.3204529172679
+11
+17.90445070079258
+21
+62.637316506714946
+31
+374.37264764932246
+12
+51.46516985397624
+22
+49.05552582891695
+32
+375.795200583854
+13
+51.46516985397624
+23
+49.05552582891695
+33
+375.795200583854
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.00697086846214
+20
+64.47665676381719
+30
+365.3204529172679
+11
+24.65792644795753
+21
+72.16714342594669
+31
+360.0065666667302
+12
+17.90445070079258
+22
+62.637316506714946
+32
+374.37264764932246
+13
+17.90445070079258
+23
+62.637316506714946
+33
+374.37264764932246
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+24.65792644795753
+20
+72.16714342594669
+30
+360.0065666667302
+11
+9.959632504602991
+21
+74.58390144817649
+31
+359.6792212951398
+12
+17.90445070079258
+22
+62.637316506714946
+32
+374.37264764932246
+13
+17.90445070079258
+23
+62.637316506714946
+33
+374.37264764932246
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.02955671920471
+20
+92.40262427296368
+30
+315.5876859326342
+11
+10.339912908402994
+21
+91.81607977813896
+31
+329.5162923386974
+12
+30.84524072994503
+22
+87.03063117671918
+32
+331.82413805327747
+13
+30.84524072994503
+23
+87.03063117671918
+33
+331.82413805327747
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.02955671920471
+20
+92.40262427296368
+30
+315.5876859326342
+11
+11.72808849443452
+21
+97.91243098754273
+31
+309.65044404418705
+12
+10.339912908402994
+22
+91.81607977813896
+32
+329.5162923386974
+13
+10.339912908402994
+23
+91.81607977813896
+33
+329.5162923386974
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+74.46890950605204
+20
+55.91700121077101
+30
+336.89859976157675
+11
+79.59010919710781
+21
+35.4259719324055
+31
+361.8218732023004
+12
+84.85780506868038
+22
+36.438430479486456
+32
+346.7396481632697
+13
+84.85780506868038
+23
+36.438430479486456
+33
+346.7396481632697
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+74.46890950605204
+20
+55.91700121077101
+30
+336.89859976157675
+11
+70.75089278688327
+21
+55.24527390549513
+31
+350.96806202920743
+12
+79.59010919710781
+22
+35.4259719324055
+32
+361.8218732023004
+13
+79.59010919710781
+23
+35.4259719324055
+33
+361.8218732023004
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.75089278688327
+20
+55.24527390549513
+30
+350.96806202920743
+11
+58.20702423200106
+21
+74.98912824647502
+31
+323.9772800891038
+12
+53.58865562879545
+22
+73.95811201568833
+32
+339.99012733231393
+13
+53.58865562879545
+23
+73.95811201568833
+33
+339.99012733231393
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+74.46890950605204
+20
+55.91700121077101
+30
+336.89859976157675
+11
+58.20702423200106
+21
+74.98912824647502
+31
+323.9772800891038
+12
+70.75089278688327
+22
+55.24527390549513
+32
+350.96806202920743
+13
+70.75089278688327
+23
+55.24527390549513
+33
+350.96806202920743
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.58865562879545
+20
+73.95811201568833
+30
+339.99012733231393
+11
+34.02955671920471
+21
+92.40262427296368
+31
+315.5876859326342
+12
+30.84524072994503
+22
+87.03063117671918
+32
+331.82413805327747
+13
+30.84524072994503
+23
+87.03063117671918
+33
+331.82413805327747
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+58.20702423200106
+20
+74.98912824647502
+30
+323.9772800891038
+11
+34.02955671920471
+21
+92.40262427296368
+31
+315.5876859326342
+12
+53.58865562879545
+22
+73.95811201568833
+32
+339.99012733231393
+13
+53.58865562879545
+23
+73.95811201568833
+33
+339.99012733231393
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.02955671920471
+20
+92.40262427296368
+30
+315.5876859326342
+11
+14.647425098326345
+21
+98.81293498374522
+31
+293.5079972393619
+12
+11.72808849443452
+22
+97.91243098754273
+32
+309.65044404418705
+13
+11.72808849443452
+23
+97.91243098754273
+33
+309.65044404418705
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.35077365383238
+20
+91.88787671838405
+30
+300.0013611903258
+11
+14.647425098326345
+21
+98.81293498374522
+31
+293.5079972393619
+12
+34.02955671920471
+22
+92.40262427296368
+32
+315.5876859326342
+13
+34.02955671920471
+23
+92.40262427296368
+33
+315.5876859326342
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+58.20702423200106
+20
+74.98912824647502
+30
+323.9772800891038
+11
+37.35077365383238
+21
+91.88787671838405
+31
+300.0013611903258
+12
+34.02955671920471
+22
+92.40262427296368
+32
+315.5876859326342
+13
+34.02955671920471
+23
+92.40262427296368
+33
+315.5876859326342
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.0541075591709
+20
+72.0390649859604
+30
+308.2327586988137
+11
+37.35077365383238
+21
+91.88787671838405
+31
+300.0013611903258
+12
+58.20702423200106
+22
+74.98912824647502
+32
+323.9772800891038
+13
+58.20702423200106
+23
+74.98912824647502
+33
+323.9772800891038
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.0541075591709
+20
+72.0390649859604
+30
+308.2327586988137
+11
+58.20702423200106
+21
+74.98912824647502
+31
+323.9772800891038
+12
+74.46890950605204
+22
+55.91700121077101
+32
+336.89859976157675
+13
+74.46890950605204
+23
+55.91700121077101
+33
+336.89859976157675
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.0541075591709
+20
+72.0390649859604
+30
+308.2327586988137
+11
+74.46890950605204
+21
+55.91700121077101
+31
+336.89859976157675
+12
+76.70783320024876
+22
+53.667262341895125
+32
+317.8082192664932
+13
+76.70783320024876
+23
+53.667262341895125
+33
+317.8082192664932
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+76.70783320024876
+20
+53.667262341895125
+30
+317.8082192664932
+11
+74.46890950605204
+21
+55.91700121077101
+31
+336.89859976157675
+12
+84.85780506868038
+22
+36.438430479486456
+32
+346.7396481632697
+13
+84.85780506868038
+23
+36.438430479486456
+33
+346.7396481632697
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+76.70783320024876
+20
+53.667262341895125
+30
+317.8082192664932
+11
+84.85780506868038
+21
+36.438430479486456
+31
+346.7396481632697
+12
+88.41835527824354
+22
+32.11023103560109
+32
+329.6586693218647
+13
+88.41835527824354
+23
+32.11023103560109
+33
+329.6586693218647
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.647425098326345
+20
+98.81293498374522
+30
+293.5079972393619
+11
+0.020623870886214313
+21
+99.09829739875687
+31
+292.78363912620364
+12
+11.72808849443452
+22
+97.91243098754273
+32
+309.65044404418705
+13
+11.72808849443452
+23
+97.91243098754273
+33
+309.65044404418705
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+11.72808849443452
+20
+97.91243098754273
+30
+309.65044404418705
+11
+0.020623870886214313
+21
+99.09829739875687
+31
+292.78363912620364
+12
+0.020623870886214313
+22
+98.07306143010814
+32
+308.2723078608159
+13
+0.020623870886214313
+23
+98.07306143010814
+33
+308.2723078608159
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.26780831464761
+20
+-93.52620032317418
+30
+241.6754739770493
+11
+37.30696535131463
+21
+-103.82358520943055
+31
+235.58581570275481
+12
+35.96046849753959
+22
+-104.24463167251768
+32
+234.41607318066613
+13
+35.96046849753959
+23
+-104.24463167251768
+33
+234.41607318066613
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.30696535131463
+20
+-103.82358520943055
+30
+235.58581570275481
+11
+31.26780831464761
+21
+-93.52620032317418
+31
+241.6754739770493
+12
+31.987907287283267
+22
+-94.20735858246191
+32
+245.9121018997042
+13
+31.987907287283267
+23
+-94.20735858246191
+33
+245.9121018997042
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.6974463096177
+20
+-94.53531240269754
+30
+240.42906692555428
+11
+35.96046849753959
+21
+-104.24463167251768
+31
+234.41607318066613
+12
+29.10811984538664
+22
+-105.9774934165531
+32
+233.23385746133224
+13
+29.10811984538664
+23
+-105.9774934165531
+33
+233.23385746133224
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.26780831464761
+20
+-93.52620032317418
+30
+241.6754739770493
+11
+35.96046849753959
+21
+-104.24463167251768
+31
+234.41607318066613
+12
+26.6974463096177
+22
+-94.53531240269754
+32
+240.42906692555428
+13
+26.6974463096177
+23
+-94.53531240269754
+33
+240.42906692555428
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+23.44255027741273
+20
+-96.3889512029809
+30
+242.94834854464796
+11
+29.10811984538664
+21
+-105.9774934165531
+31
+233.23385746133224
+12
+24.645453250712876
+22
+-107.01702792838122
+32
+234.94086013790943
+13
+24.645453250712876
+23
+-107.01702792838122
+33
+234.94086013790943
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.10811984538664
+20
+-105.9774934165531
+30
+233.23385746133224
+11
+23.44255027741273
+21
+-96.3889512029809
+31
+242.94834854464796
+12
+26.6974463096177
+22
+-94.53531240269754
+32
+240.42906692555428
+13
+26.6974463096177
+23
+-94.53531240269754
+33
+240.42906692555428
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+24.645453250712876
+20
+-107.01702792838122
+30
+234.94086013790943
+11
+19.139905676658017
+21
+-108.3674796983577
+31
+242.33564075804233
+12
+17.1737038768505
+22
+-99.00740995138776
+32
+249.0717757187964
+13
+17.1737038768505
+23
+-99.00740995138776
+33
+249.0717757187964
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+24.645453250712876
+20
+-107.01702792838122
+30
+234.94086013790943
+11
+17.1737038768505
+21
+-99.00740995138776
+31
+249.0717757187964
+12
+23.44255027741273
+22
+-96.3889512029809
+32
+242.94834854464796
+13
+23.44255027741273
+23
+-96.3889512029809
+33
+242.94834854464796
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+6.064344272398843
+20
+-98.42451614844241
+30
+246.2875147143345
+11
+19.139905676658017
+21
+-108.3674796983577
+31
+242.33564075804233
+12
+4.71237138080909
+22
+-109.09457583042332
+32
+242.38127440649814
+13
+4.71237138080909
+23
+-109.09457583042332
+33
+242.38127440649814
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+6.064344272398843
+20
+-98.42451614844241
+30
+246.2875147143345
+11
+17.1737038768505
+21
+-99.00740995138776
+31
+249.0717757187964
+12
+19.139905676658017
+22
+-108.3674796983577
+32
+242.33564075804233
+13
+19.139905676658017
+23
+-108.3674796983577
+33
+242.33564075804233
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-97.59215840060475
+30
+245.4439006665445
+11
+4.71237138080909
+21
+-109.09457583042332
+31
+242.38127440649814
+12
+0.020623870886214313
+22
+-109.91446038101589
+32
+241.62193049619015
+13
+0.020623870886214313
+23
+-109.91446038101589
+33
+241.62193049619015
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-97.59215840060475
+30
+245.4439006665445
+11
+6.064344272398843
+21
+-98.42451614844241
+31
+246.2875147143345
+12
+4.71237138080909
+22
+-109.09457583042332
+32
+242.38127440649814
+13
+4.71237138080909
+23
+-109.09457583042332
+33
+242.38127440649814
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+6.554145432493247
+20
+-93.1389227599457
+30
+247.20961863747004
+11
+0.020623870886214313
+21
+-97.59215840060475
+31
+245.4439006665445
+12
+0.020623870886214313
+22
+-93.58065647699968
+32
+246.88227326587892
+13
+0.020623870886214313
+23
+-93.58065647699968
+33
+246.88227326587892
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+6.554145432493247
+20
+-93.1389227599457
+30
+247.20961863747004
+11
+6.064344272398843
+21
+-98.42451614844241
+31
+246.2875147143345
+12
+0.020623870886214313
+22
+-97.59215840060475
+32
+245.4439006665445
+13
+0.020623870886214313
+23
+-97.59215840060475
+33
+245.4439006665445
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.105601578992115
+20
+-92.64182021609923
+30
+250.706677230815
+11
+6.064344272398843
+21
+-98.42451614844241
+31
+246.2875147143345
+12
+6.554145432493247
+22
+-93.1389227599457
+32
+247.20961863747004
+13
+6.554145432493247
+23
+-93.1389227599457
+33
+247.20961863747004
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.105601578992115
+20
+-92.64182021609923
+30
+250.706677230815
+11
+17.1737038768505
+21
+-99.00740995138776
+31
+249.0717757187964
+12
+6.064344272398843
+22
+-98.42451614844241
+32
+246.2875147143345
+13
+6.064344272398843
+23
+-98.42451614844241
+33
+246.2875147143345
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+21.00845146876971
+20
+-90.66253677040027
+30
+247.8366249672561
+11
+17.1737038768505
+21
+-99.00740995138776
+31
+249.0717757187964
+12
+14.105601578992115
+22
+-92.64182021609923
+32
+250.706677230815
+13
+14.105601578992115
+23
+-92.64182021609923
+33
+250.706677230815
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+23.44255027741273
+20
+-96.3889512029809
+30
+242.94834854464796
+11
+17.1737038768505
+21
+-99.00740995138776
+31
+249.0717757187964
+12
+21.00845146876971
+22
+-90.66253677040027
+32
+247.8366249672561
+13
+21.00845146876971
+23
+-90.66253677040027
+33
+247.8366249672561
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.883327370995122
+20
+-89.41217480270589
+30
+247.886821980558
+11
+23.44255027741273
+21
+-96.3889512029809
+31
+242.94834854464796
+12
+21.00845146876971
+22
+-90.66253677040027
+32
+247.8366249672561
+13
+21.00845146876971
+23
+-90.66253677040027
+33
+247.8366249672561
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.6974463096177
+20
+-94.53531240269754
+30
+240.42906692555428
+11
+23.44255027741273
+21
+-96.3889512029809
+31
+242.94834854464796
+12
+26.883327370995122
+22
+-89.41217480270589
+32
+247.886821980558
+13
+26.883327370995122
+23
+-89.41217480270589
+33
+247.886821980558
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.460092736976396
+20
+-88.79003606208923
+30
+248.51109029143635
+11
+26.6974463096177
+21
+-94.53531240269754
+31
+240.42906692555428
+12
+26.883327370995122
+22
+-89.41217480270589
+32
+247.886821980558
+13
+26.883327370995122
+23
+-89.41217480270589
+33
+247.886821980558
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.26780831464761
+20
+-93.52620032317418
+30
+241.6754739770493
+11
+26.6974463096177
+21
+-94.53531240269754
+31
+240.42906692555428
+12
+30.460092736976396
+22
+-88.79003606208923
+32
+248.51109029143635
+13
+30.460092736976396
+23
+-88.79003606208923
+33
+248.51109029143635
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.26780831464761
+20
+-93.52620032317418
+30
+241.6754739770493
+11
+30.460092736976396
+21
+-88.79003606208923
+31
+248.51109029143635
+12
+30.787133884244398
+22
+-91.20861943025801
+32
+251.43286068991188
+13
+30.787133884244398
+23
+-91.20861943025801
+33
+251.43286068991188
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.26780831464761
+20
+-93.52620032317418
+30
+241.6754739770493
+11
+30.787133884244398
+21
+-91.20861943025801
+31
+251.43286068991188
+12
+31.987907287283267
+22
+-94.20735858246191
+32
+245.9121018997042
+13
+31.987907287283267
+23
+-94.20735858246191
+33
+245.9121018997042
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.539191060966804
+20
+-81.21119972651657
+30
+247.74383654873145
+11
+31.298839195597672
+21
+-81.7110402892717
+31
+249.33675510416876
+12
+30.460092736976396
+22
+-88.79003606208923
+32
+248.51109029143635
+13
+30.460092736976396
+23
+-88.79003606208923
+33
+248.51109029143635
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.460092736976396
+20
+-88.79003606208923
+30
+248.51109029143635
+11
+31.298839195597672
+21
+-81.7110402892717
+31
+249.33675510416876
+12
+30.787133884244398
+22
+-91.20861943025801
+32
+251.43286068991188
+13
+30.787133884244398
+23
+-91.20861943025801
+33
+251.43286068991188
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.57236616234568
+20
+-81.55466898722894
+30
+248.61848147747125
+11
+30.460092736976396
+21
+-88.79003606208923
+31
+248.51109029143635
+12
+26.883327370995122
+22
+-89.41217480270589
+32
+247.886821980558
+13
+26.883327370995122
+23
+-89.41217480270589
+33
+247.886821980558
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.539191060966804
+20
+-81.21119972651657
+30
+247.74383654873145
+11
+30.460092736976396
+21
+-88.79003606208923
+31
+248.51109029143635
+12
+29.57236616234568
+22
+-81.55466898722894
+32
+248.61848147747125
+13
+29.57236616234568
+23
+-81.55466898722894
+33
+248.61848147747125
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.57236616234568
+20
+-81.55466898722894
+30
+248.61848147747125
+11
+27.9502420718964
+21
+-80.56654838599603
+31
+252.34766322929582
+12
+29.832173734221836
+22
+-78.81665007986965
+32
+251.11707584259952
+13
+29.832173734221836
+23
+-78.81665007986965
+33
+251.11707584259952
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.539191060966804
+20
+-81.21119972651657
+30
+247.74383654873145
+11
+29.57236616234568
+21
+-81.55466898722894
+31
+248.61848147747125
+12
+29.832173734221836
+22
+-78.81665007986965
+32
+251.11707584259952
+13
+29.832173734221836
+23
+-78.81665007986965
+33
+251.11707584259952
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.539191060966804
+20
+-81.21119972651657
+30
+247.74383654873145
+11
+29.832173734221836
+21
+-78.81665007986965
+31
+251.11707584259952
+12
+30.588171176976264
+22
+-80.08404860965459
+32
+252.5016007367542
+13
+30.588171176976264
+23
+-80.08404860965459
+33
+252.5016007367542
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.539191060966804
+20
+-81.21119972651657
+30
+247.74383654873145
+11
+30.588171176976264
+21
+-80.08404860965459
+31
+252.5016007367542
+12
+31.298839195597672
+22
+-81.7110402892717
+32
+249.33675510416876
+13
+31.298839195597672
+23
+-81.7110402892717
+33
+249.33675510416876
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.832173734221836
+20
+-78.81665007986965
+30
+251.11707584259952
+11
+28.581203317881364
+21
+-74.47689011170564
+31
+257.3275111731392
+12
+29.45858626552872
+22
+-75.589742685386
+32
+257.5867102963687
+13
+29.45858626552872
+23
+-75.589742685386
+33
+257.5867102963687
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.832173734221836
+20
+-78.81665007986965
+30
+251.11707584259952
+11
+29.45858626552872
+21
+-75.589742685386
+31
+257.5867102963687
+12
+30.588171176976264
+22
+-80.08404860965459
+32
+252.5016007367542
+13
+30.588171176976264
+23
+-80.08404860965459
+33
+252.5016007367542
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.581203317881364
+20
+-74.47689011170564
+30
+257.3275111731392
+11
+27.9502420718964
+21
+-80.56654838599603
+31
+252.34766322929582
+12
+27.79965103199161
+22
+-75.0865556550776
+32
+256.66034723271235
+13
+27.79965103199161
+23
+-75.0865556550776
+33
+256.66034723271235
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.832173734221836
+20
+-78.81665007986965
+30
+251.11707584259952
+11
+27.9502420718964
+21
+-80.56654838599603
+31
+252.34766322929582
+12
+28.581203317881364
+22
+-74.47689011170564
+32
+257.3275111731392
+13
+28.581203317881364
+23
+-74.47689011170564
+33
+257.3275111731392
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.21520680709674
+20
+-68.48671319104935
+30
+262.5017584594051
+11
+27.79965103199161
+21
+-75.0865556550776
+31
+256.66034723271235
+12
+26.696837860971623
+22
+-68.7142729846832
+32
+262.1385146176952
+13
+26.696837860971623
+23
+-68.7142729846832
+33
+262.1385146176952
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.21520680709674
+20
+-68.48671319104935
+30
+262.5017584594051
+11
+28.581203317881364
+21
+-74.47689011170564
+31
+257.3275111731392
+12
+27.79965103199161
+22
+-75.0865556550776
+32
+256.66034723271235
+13
+27.79965103199161
+23
+-75.0865556550776
+33
+256.66034723271235
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.581203317881364
+20
+-74.47689011170564
+30
+257.3275111731392
+11
+29.21520680709674
+21
+-68.48671319104935
+31
+262.5017584594051
+12
+29.736951521110313
+22
+-71.02850741004886
+32
+263.616740603346
+13
+29.736951521110313
+23
+-71.02850741004886
+33
+263.616740603346
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.581203317881364
+20
+-74.47689011170564
+30
+257.3275111731392
+11
+29.736951521110313
+21
+-71.02850741004886
+31
+263.616740603346
+12
+29.45858626552872
+22
+-75.589742685386
+32
+257.5867102963687
+13
+29.45858626552872
+23
+-75.589742685386
+33
+257.5867102963687
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.21520680709674
+20
+-68.48671319104935
+30
+262.5017584594051
+11
+30.216409054221355
+21
+-63.56040872806379
+31
+267.0124924971204
+12
+30.331710072653514
+22
+-68.07692302791553
+32
+266.72925965236897
+13
+30.331710072653514
+23
+-68.07692302791553
+33
+266.72925965236897
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.21520680709674
+20
+-68.48671319104935
+30
+262.5017584594051
+11
+30.331710072653514
+21
+-68.07692302791553
+31
+266.72925965236897
+12
+29.736951521110313
+22
+-71.02850741004886
+32
+263.616740603346
+13
+29.736951521110313
+23
+-71.02850741004886
+33
+263.616740603346
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.216409054221355
+20
+-63.56040872806379
+30
+267.0124924971204
+11
+26.696837860971623
+21
+-68.7142729846832
+31
+262.1385146176952
+12
+27.56600675189688
+22
+-63.57561994421555
+32
+266.0645295065278
+13
+27.56600675189688
+23
+-63.57561994421555
+33
+266.0645295065278
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.216409054221355
+20
+-63.56040872806379
+30
+267.0124924971204
+11
+29.21520680709674
+21
+-68.48671319104935
+31
+262.5017584594051
+12
+26.696837860971623
+22
+-68.7142729846832
+32
+262.1385146176952
+13
+26.696837860971623
+23
+-68.7142729846832
+33
+262.1385146176952
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.216409054221355
+20
+-63.56040872806379
+30
+267.0124924971204
+11
+27.56600675189688
+21
+-63.57561994421555
+31
+266.0645295065278
+12
+26.072569550093522
+22
+-58.39893886336902
+32
+274.2052681667564
+13
+26.072569550093522
+23
+-58.39893886336902
+33
+274.2052681667564
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.16502444396265
+20
+-57.196948563037836
+30
+273.46022279963177
+11
+30.216409054221355
+21
+-63.56040872806379
+31
+267.0124924971204
+12
+26.072569550093522
+22
+-58.39893886336902
+32
+274.2052681667564
+13
+26.072569550093522
+23
+-58.39893886336902
+33
+274.2052681667564
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.57310081325534
+20
+-20.959268324129074
+30
+276.6253726565492
+11
+72.04728389465357
+21
+-30.55632881874907
+31
+277.34577585350553
+12
+65.61941944043838
+22
+-26.665603951390587
+32
+277.50458095013323
+13
+65.61941944043838
+23
+-26.665603951390587
+33
+277.50458095013323
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.57310081325534
+20
+-20.959268324129074
+30
+276.6253726565492
+11
+65.61941944043838
+21
+-26.665603951390587
+31
+277.50458095013323
+12
+70.272317504309
+22
+-23.36963763557469
+32
+275.365883959163
+13
+70.272317504309
+23
+-23.36963763557469
+33
+275.365883959163
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.1603595871385
+20
+-29.199184113667595
+30
+277.09935415184344
+11
+72.04728389465357
+21
+-30.55632881874907
+31
+277.34577585350553
+12
+66.95654618506376
+22
+-33.00137970302084
+32
+274.4839376466675
+13
+66.95654618506376
+23
+-33.00137970302084
+33
+274.4839376466675
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.61941944043838
+20
+-26.665603951390587
+30
+277.50458095013323
+11
+72.04728389465357
+21
+-30.55632881874907
+31
+277.34577585350553
+12
+64.1603595871385
+22
+-29.199184113667595
+32
+277.09935415184344
+13
+64.1603595871385
+23
+-29.199184113667595
+33
+277.09935415184344
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.8047067903857
+20
+-16.119059344559858
+30
+265.47190052525804
+11
+67.49368464982324
+21
+-20.598154052679554
+31
+272.50526264961866
+12
+63.5685520115288
+22
+-23.022213458661767
+32
+270.62028874406207
+13
+63.5685520115288
+23
+-23.022213458661767
+33
+270.62028874406207
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.8047067903857
+20
+-16.119059344559858
+30
+265.47190052525804
+11
+63.5685520115288
+21
+-23.022213458661767
+31
+270.62028874406207
+12
+68.46540756004524
+22
+-25.331276070533047
+32
+261.46891688269534
+13
+68.46540756004524
+23
+-25.331276070533047
+33
+261.46891688269534
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.46540756004524
+20
+-25.331276070533047
+30
+261.46891688269534
+11
+63.5685520115288
+21
+-23.022213458661767
+31
+270.62028874406207
+12
+61.071478768016476
+22
+-28.187638239558584
+32
+272.8100954213027
+13
+61.071478768016476
+23
+-28.187638239558584
+33
+272.8100954213027
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.46540756004524
+20
+-25.331276070533047
+30
+261.46891688269534
+11
+61.071478768016476
+21
+-28.187638239558584
+31
+272.8100954213027
+12
+63.86730029675407
+22
+-33.103903299883655
+32
+268.0611537386471
+13
+63.86730029675407
+23
+-33.103903299883655
+33
+268.0611537386471
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+66.95654618506376
+20
+-33.00137970302084
+30
+274.4839376466675
+11
+63.86730029675407
+21
+-33.103903299883655
+31
+268.0611537386471
+12
+61.071478768016476
+22
+-28.187638239558584
+32
+272.8100954213027
+13
+61.071478768016476
+23
+-28.187638239558584
+33
+272.8100954213027
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.86730029675407
+20
+-33.103903299883655
+30
+268.0611537386471
+11
+66.95654618506376
+21
+-33.00137970302084
+31
+274.4839376466675
+12
+68.52874706410216
+22
+-35.87873335033269
+32
+272.76598289445997
+13
+68.52874706410216
+23
+-35.87873335033269
+33
+272.76598289445997
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.071478768016476
+20
+-28.187638239558584
+30
+272.8100954213027
+11
+65.61941944043838
+21
+-26.665603951390587
+31
+277.50458095013323
+12
+64.1603595871385
+22
+-29.199184113667595
+32
+277.09935415184344
+13
+64.1603595871385
+23
+-29.199184113667595
+33
+277.09935415184344
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+66.95654618506376
+20
+-33.00137970302084
+30
+274.4839376466675
+11
+61.071478768016476
+21
+-28.187638239558584
+31
+272.8100954213027
+12
+64.1603595871385
+22
+-29.199184113667595
+32
+277.09935415184344
+13
+64.1603595871385
+23
+-29.199184113667595
+33
+277.09935415184344
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.5685520115288
+20
+-23.022213458661767
+30
+270.62028874406207
+11
+65.61941944043838
+21
+-26.665603951390587
+31
+277.50458095013323
+12
+61.071478768016476
+22
+-28.187638239558584
+32
+272.8100954213027
+13
+61.071478768016476
+23
+-28.187638239558584
+33
+272.8100954213027
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.5685520115288
+20
+-23.022213458661767
+30
+270.62028874406207
+11
+67.49368464982324
+21
+-20.598154052679554
+31
+272.50526264961866
+12
+65.61941944043838
+22
+-26.665603951390587
+32
+277.50458095013323
+13
+65.61941944043838
+23
+-26.665603951390587
+33
+277.50458095013323
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+67.49368464982324
+20
+-20.598154052679554
+30
+272.50526264961866
+11
+70.272317504309
+21
+-23.36963763557469
+31
+275.365883959163
+12
+65.61941944043838
+22
+-26.665603951390587
+32
+277.50458095013323
+13
+65.61941944043838
+23
+-26.665603951390587
+33
+277.50458095013323
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+82.11580082268848
+20
+-66.12015218212355
+30
+271.52353075915687
+11
+80.12935593642595
+21
+-59.12998991163354
+31
+271.82562551193735
+12
+83.14928127048766
+22
+-65.01034185167424
+32
+273.88157348704016
+13
+83.14928127048766
+23
+-65.01034185167424
+33
+273.88157348704016
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.12935593642595
+20
+-59.12998991163354
+30
+271.82562551193735
+11
+81.42619729619436
+21
+-55.74671121510647
+31
+274.8785165936446
+12
+83.14928127048766
+22
+-65.01034185167424
+32
+273.88157348704016
+13
+83.14928127048766
+23
+-65.01034185167424
+33
+273.88157348704016
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.12935593642595
+20
+-59.12998991163354
+30
+271.82562551193735
+11
+79.84194913396354
+21
+-68.26249986497068
+31
+269.4484166517004
+12
+77.30257958281905
+22
+-63.094641289490255
+32
+269.6312554698488
+13
+77.30257958281905
+23
+-63.094641289490255
+33
+269.6312554698488
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.12935593642595
+20
+-59.12998991163354
+30
+271.82562551193735
+11
+82.11580082268848
+21
+-66.12015218212355
+31
+271.52353075915687
+12
+79.84194913396354
+22
+-68.26249986497068
+32
+269.4484166517004
+13
+79.84194913396354
+23
+-68.26249986497068
+33
+269.4484166517004
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+83.42055809934243
+20
+-75.09811617935695
+30
+271.49675901872706
+11
+82.11580082268848
+21
+-66.12015218212355
+31
+271.52353075915687
+12
+84.77097944688468
+22
+-75.41085878344289
+32
+274.7714296319295
+13
+84.77097944688468
+23
+-75.41085878344289
+33
+274.7714296319295
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+82.11580082268848
+20
+-66.12015218212355
+30
+271.52353075915687
+11
+83.14928127048766
+21
+-65.01034185167424
+31
+273.88157348704016
+12
+84.77097944688468
+22
+-75.41085878344289
+32
+274.7714296319295
+13
+84.77097944688468
+23
+-75.41085878344289
+33
+274.7714296319295
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+82.11580082268848
+20
+-66.12015218212355
+30
+271.52353075915687
+11
+80.82658332445543
+21
+-73.85870628729135
+31
+269.0666151262838
+12
+79.84194913396354
+22
+-68.26249986497068
+32
+269.4484166517004
+13
+79.84194913396354
+23
+-68.26249986497068
+33
+269.4484166517004
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.82658332445543
+20
+-73.85870628729135
+30
+269.0666151262838
+11
+82.11580082268848
+21
+-66.12015218212355
+31
+271.52353075915687
+12
+83.42055809934243
+22
+-75.09811617935695
+32
+271.49675901872706
+13
+83.42055809934243
+23
+-75.09811617935695
+33
+271.49675901872706
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.82658332445543
+20
+-73.85870628729135
+30
+269.0666151262838
+11
+83.42055809934243
+21
+-75.09811617935695
+31
+271.49675901872706
+12
+79.87605268057634
+22
+-85.54913434874868
+32
+266.76485389816014
+13
+79.87605268057634
+23
+-85.54913434874868
+33
+266.76485389816014
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+83.42055809934243
+20
+-75.09811617935695
+30
+271.49675901872706
+11
+82.8692427811294
+21
+-87.52050796204884
+31
+269.399740760009
+12
+79.87605268057634
+22
+-85.54913434874868
+32
+266.76485389816014
+13
+79.87605268057634
+23
+-85.54913434874868
+33
+266.76485389816014
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+82.8692427811294
+20
+-87.52050796204884
+30
+269.399740760009
+11
+83.42055809934243
+21
+-75.09811617935695
+31
+271.49675901872706
+12
+84.32769418578312
+22
+-88.822892288984
+32
+273.9323789489817
+13
+84.32769418578312
+23
+-88.822892288984
+33
+273.9323789489817
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+83.42055809934243
+20
+-75.09811617935695
+30
+271.49675901872706
+11
+84.77097944688468
+21
+-75.41085878344289
+31
+274.7714296319295
+12
+84.32769418578312
+22
+-88.822892288984
+32
+273.9323789489817
+13
+84.32769418578312
+23
+-88.822892288984
+33
+273.9323789489817
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.22706694149996
+20
+-51.87028489093086
+30
+275.05192445777845
+11
+77.30257958281905
+21
+-63.094641289490255
+31
+269.6312554698488
+12
+70.33529193917828
+22
+-55.87448543078301
+32
+274.0099561513654
+13
+70.33529193917828
+23
+-55.87448543078301
+33
+274.0099561513654
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.22706694149996
+20
+-51.87028489093086
+30
+275.05192445777845
+11
+80.12935593642595
+21
+-59.12998991163354
+31
+271.82562551193735
+12
+77.30257958281905
+22
+-63.094641289490255
+32
+269.6312554698488
+13
+77.30257958281905
+23
+-63.094641289490255
+33
+269.6312554698488
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.22706694149996
+20
+-51.87028489093086
+30
+275.05192445777845
+11
+81.42619729619436
+21
+-55.74671121510647
+31
+274.8785165936446
+12
+80.12935593642595
+22
+-59.12998991163354
+32
+271.82562551193735
+13
+80.12935593642595
+23
+-59.12998991163354
+33
+271.82562551193735
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+79.16973202753113
+20
+-46.62910825359825
+30
+277.0877936275634
+11
+81.42619729619436
+21
+-55.74671121510647
+31
+274.8785165936446
+12
+75.22706694149996
+22
+-51.87028489093086
+32
+275.05192445777845
+13
+75.22706694149996
+23
+-51.87028489093086
+33
+275.05192445777845
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+73.86398986211924
+20
+-42.98145862034831
+30
+275.6673702632906
+11
+79.16973202753113
+21
+-46.62910825359825
+31
+277.0877936275634
+12
+75.22706694149996
+22
+-51.87028489093086
+32
+275.05192445777845
+13
+75.22706694149996
+23
+-51.87028489093086
+33
+275.05192445777845
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+73.86398986211924
+20
+-42.98145862034831
+30
+275.6673702632906
+11
+75.22706694149996
+21
+-51.87028489093086
+31
+275.05192445777845
+12
+70.54922248314001
+22
+-48.31968281673178
+32
+277.94357664827425
+13
+70.54922248314001
+23
+-48.31968281673178
+33
+277.94357664827425
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+69.03525013953146
+20
+-40.32223381265477
+30
+272.1192019836758
+11
+73.86398986211924
+21
+-42.98145862034831
+31
+275.6673702632906
+12
+70.54922248314001
+22
+-48.31968281673178
+32
+277.94357664827425
+13
+70.54922248314001
+23
+-48.31968281673178
+33
+277.94357664827425
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+69.03525013953146
+20
+-40.32223381265477
+30
+272.1192019836758
+11
+70.54922248314001
+21
+-48.31968281673178
+31
+277.94357664827425
+12
+66.16760124812411
+22
+-44.42500303317314
+32
+275.84442881929954
+13
+66.16760124812411
+23
+-44.42500303317314
+33
+275.84442881929954
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.12891632020645
+20
+-38.71745050861977
+30
+275.9092286001086
+11
+69.03525013953146
+21
+-40.32223381265477
+31
+272.1192019836758
+12
+66.16760124812411
+22
+-44.42500303317314
+32
+275.84442881929954
+13
+66.16760124812411
+23
+-44.42500303317314
+33
+275.84442881929954
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.12891632020645
+20
+-38.71745050861977
+30
+275.9092286001086
+11
+66.16760124812411
+21
+-44.42500303317314
+31
+275.84442881929954
+12
+62.33045028405291
+22
+-42.8777181261919
+32
+276.4367535762588
+13
+62.33045028405291
+23
+-42.8777181261919
+33
+276.4367535762588
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.54922248314001
+20
+-48.31968281673178
+30
+277.94357664827425
+11
+70.33529193917828
+21
+-55.87448543078301
+31
+274.0099561513654
+12
+67.06056048111118
+22
+-53.03941896437395
+32
+276.5383645001516
+13
+67.06056048111118
+23
+-53.03941896437395
+33
+276.5383645001516
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.54922248314001
+20
+-48.31968281673178
+30
+277.94357664827425
+11
+75.22706694149996
+21
+-51.87028489093086
+31
+275.05192445777845
+12
+70.33529193917828
+22
+-55.87448543078301
+32
+274.0099561513654
+13
+70.33529193917828
+23
+-55.87448543078301
+33
+274.0099561513654
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.727112606599974
+20
+-49.53566743592273
+30
+278.2134236228107
+11
+70.33529193917828
+21
+-55.87448543078301
+31
+274.0099561513654
+12
+63.51099276960963
+22
+-56.18631536189963
+32
+275.6156521283704
+13
+63.51099276960963
+23
+-56.18631536189963
+33
+275.6156521283704
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.33529193917828
+20
+-55.87448543078301
+30
+274.0099561513654
+11
+61.727112606599974
+21
+-49.53566743592273
+31
+278.2134236228107
+12
+67.06056048111118
+22
+-53.03941896437395
+32
+276.5383645001516
+13
+67.06056048111118
+23
+-53.03941896437395
+33
+276.5383645001516
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.54922248314001
+20
+-48.31968281673178
+30
+277.94357664827425
+11
+67.06056048111118
+21
+-53.03941896437395
+31
+276.5383645001516
+12
+61.727112606599974
+22
+-49.53566743592273
+32
+278.2134236228107
+13
+61.727112606599974
+23
+-49.53566743592273
+33
+278.2134236228107
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+66.16760124812411
+20
+-44.42500303317314
+30
+275.84442881929954
+11
+70.54922248314001
+21
+-48.31968281673178
+31
+277.94357664827425
+12
+61.727112606599974
+22
+-49.53566743592273
+32
+278.2134236228107
+13
+61.727112606599974
+23
+-49.53566743592273
+33
+278.2134236228107
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+62.33045028405291
+20
+-42.8777181261919
+30
+276.4367535762588
+11
+66.16760124812411
+21
+-44.42500303317314
+31
+275.84442881929954
+12
+56.25220042187524
+22
+-48.51043146727742
+32
+276.31597652001045
+13
+56.25220042187524
+23
+-48.51043146727742
+33
+276.31597652001045
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+66.16760124812411
+20
+-44.42500303317314
+30
+275.84442881929954
+11
+61.727112606599974
+21
+-49.53566743592273
+31
+278.2134236228107
+12
+56.25220042187524
+22
+-48.51043146727742
+32
+276.31597652001045
+13
+56.25220042187524
+23
+-48.51043146727742
+33
+276.31597652001045
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+56.25220042187524
+20
+-48.51043146727742
+30
+276.31597652001045
+11
+61.727112606599974
+21
+-49.53566743592273
+31
+278.2134236228107
+12
+63.51099276960963
+22
+-56.18631536189963
+32
+275.6156521283704
+13
+63.51099276960963
+23
+-56.18631536189963
+33
+275.6156521283704
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.8243845323578977
+20
+-126.56982939449381
+30
+268.9674379969592
+11
+0.020623870886214313
+21
+-130.87125709795782
+31
+274.678336989065
+12
+0.020623870886214313
+22
+-127.72131845720034
+32
+269.6236498617562
+13
+0.020623870886214313
+23
+-127.72131845720034
+33
+269.6236498617562
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.8904012104575811
+20
+-129.1052349027107
+30
+274.8058069804191
+11
+1.0239556882721288
+21
+-137.20033991448392
+31
+282.32136465679724
+12
+0.020623870886214313
+22
+-139.3731100296356
+32
+282.27055919484894
+13
+0.020623870886214313
+23
+-139.3731100296356
+33
+282.27055919484894
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.0239556882721288
+20
+-137.20033991448392
+30
+282.32136465679724
+11
+1.2478647900295676
+21
+-150.95401733480156
+31
+291.12166164937173
+12
+0.020623870886214313
+22
+-152.27130865356466
+32
+290.70152785925313
+13
+0.020623870886214313
+23
+-152.27130865356466
+33
+290.70152785925313
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-139.3731100296356
+30
+282.27055919484894
+11
+1.0239556882721288
+21
+-137.20033991448392
+31
+282.32136465679724
+12
+0.020623870886214313
+22
+-152.27130865356466
+32
+290.70152785925313
+13
+0.020623870886214313
+23
+-152.27130865356466
+33
+290.70152785925313
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.973439800479975
+20
+-161.88485810649541
+30
+299.3049917148218
+11
+2.106994278294534
+21
+-164.26726920265452
+31
+301.08531245325133
+12
+0.020623870886214313
+22
+-165.33175010897165
+32
+302.2127677944373
+13
+0.020623870886214313
+23
+-165.33175010897165
+33
+302.2127677944373
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.973439800479975
+20
+-161.88485810649541
+30
+299.3049917148218
+11
+0.020623870886214313
+21
+-165.33175010897165
+31
+302.2127677944373
+12
+0.020623870886214313
+22
+-164.55822934520955
+32
+299.5888330082175
+13
+0.020623870886214313
+23
+-164.55822934520955
+33
+299.5888330082175
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-163.7540427696865
+30
+303.1546462985695
+11
+0.020623870886214313
+21
+-165.33175010897165
+31
+302.2127677944373
+12
+2.106994278294534
+22
+-164.26726920265452
+32
+301.08531245325133
+13
+2.106994278294534
+23
+-164.26726920265452
+33
+301.08531245325133
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.421837152305891
+20
+-163.7231031560331
+30
+302.2343677213732
+11
+0.020623870886214313
+21
+-163.7540427696865
+31
+303.1546462985695
+12
+2.106994278294534
+22
+-164.26726920265452
+32
+301.08531245325133
+13
+2.106994278294534
+23
+-164.26726920265452
+33
+301.08531245325133
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.546829398572749
+20
+-163.61431253811267
+30
+297.1431736752991
+11
+4.421837152305891
+21
+-163.7231031560331
+31
+302.2343677213732
+12
+2.106994278294534
+22
+-164.26726920265452
+32
+301.08531245325133
+13
+2.106994278294534
+23
+-164.26726920265452
+33
+301.08531245325133
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+9.084074902893873
+20
+-162.75609572281695
+30
+297.649707173161
+11
+4.421837152305891
+21
+-163.7231031560331
+31
+302.2343677213732
+12
+7.546829398572749
+22
+-163.61431253811267
+32
+297.1431736752991
+13
+7.546829398572749
+23
+-163.61431253811267
+33
+297.1431736752991
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+6.72968286688732
+20
+-161.23299664951705
+30
+297.0932808863212
+11
+7.546829398572749
+21
+-163.61431253811267
+31
+297.1431736752991
+12
+1.973439800479975
+22
+-161.88485810649541
+32
+299.3049917148218
+13
+1.973439800479975
+23
+-161.88485810649541
+33
+299.3049917148218
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.973439800479975
+20
+-161.88485810649541
+30
+299.3049917148218
+11
+7.546829398572749
+21
+-163.61431253811267
+31
+297.1431736752991
+12
+2.106994278294534
+22
+-164.26726920265452
+32
+301.08531245325133
+13
+2.106994278294534
+23
+-164.26726920265452
+33
+301.08531245325133
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-152.27130865356466
+30
+290.70152785925313
+11
+1.2478647900295676
+21
+-150.95401733480156
+31
+291.12166164937173
+12
+1.9627919491735744
+22
+-156.55600401926122
+32
+295.53139321183505
+13
+1.9627919491735744
+23
+-156.55600401926122
+33
+295.53139321183505
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-152.27130865356466
+30
+290.70152785925313
+11
+1.9627919491735744
+21
+-156.55600401926122
+31
+295.53139321183505
+12
+0.020623870886214313
+22
+-157.86051791645644
+32
+294.49246714865313
+13
+0.020623870886214313
+23
+-157.86051791645644
+33
+294.49246714865313
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-157.86051791645644
+30
+294.49246714865313
+11
+1.9627919491735744
+21
+-156.55600401926122
+31
+295.53139321183505
+12
+1.973439800479975
+22
+-161.88485810649541
+32
+299.3049917148218
+13
+1.973439800479975
+23
+-161.88485810649541
+33
+299.3049917148218
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-157.86051791645644
+30
+294.49246714865313
+11
+1.973439800479975
+21
+-161.88485810649541
+31
+299.3049917148218
+12
+0.020623870886214313
+22
+-164.55822934520955
+32
+299.5888330082175
+13
+0.020623870886214313
+23
+-164.55822934520955
+33
+299.5888330082175
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.2478647900295676
+20
+-150.95401733480156
+30
+291.12166164937173
+11
+2.840174896820924
+21
+-146.74051046069778
+31
+292.028250132032
+12
+4.687120761996767
+22
+-154.24207381821907
+32
+295.99016349098
+13
+4.687120761996767
+23
+-154.24207381821907
+33
+295.99016349098
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.2478647900295676
+20
+-150.95401733480156
+30
+291.12166164937173
+11
+4.687120761996767
+21
+-154.24207381821907
+31
+295.99016349098
+12
+1.9627919491735744
+22
+-156.55600401926122
+32
+295.53139321183505
+13
+1.9627919491735744
+23
+-156.55600401926122
+33
+295.53139321183505
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.687120761996767
+20
+-154.24207381821907
+30
+295.99016349098
+11
+6.72968286688732
+21
+-161.23299664951705
+31
+297.0932808863212
+12
+1.9627919491735744
+22
+-156.55600401926122
+32
+295.53139321183505
+13
+1.9627919491735744
+23
+-156.55600401926122
+33
+295.53139321183505
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.9627919491735744
+20
+-156.55600401926122
+30
+295.53139321183505
+11
+6.72968286688732
+21
+-161.23299664951705
+31
+297.0932808863212
+12
+1.973439800479975
+22
+-161.88485810649541
+32
+299.3049917148218
+13
+1.973439800479975
+23
+-161.88485810649541
+33
+299.3049917148218
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.10226976160619
+20
+-157.48997269099246
+30
+289.3675042027214
+11
+7.546829398572749
+21
+-163.61431253811267
+31
+297.1431736752991
+12
+12.087681644267786
+22
+-157.783853387049
+32
+289.08518403094024
+13
+12.087681644267786
+23
+-157.783853387049
+33
+289.08518403094024
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.10226976160619
+20
+-157.48997269099246
+30
+289.3675042027214
+11
+9.084074902893873
+21
+-162.75609572281695
+31
+297.649707173161
+12
+7.546829398572749
+22
+-163.61431253811267
+32
+297.1431736752991
+13
+7.546829398572749
+23
+-163.61431253811267
+33
+297.1431736752991
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.125390810157233
+20
+-158.61651535920842
+30
+285.15247620700194
+11
+14.260147535096436
+21
+-156.85505652880718
+31
+286.3021399237706
+12
+12.087681644267786
+22
+-157.783853387049
+32
+289.08518403094024
+13
+12.087681644267786
+23
+-157.783853387049
+33
+289.08518403094024
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.260147535096436
+20
+-156.85505652880718
+30
+286.3021399237706
+11
+13.10226976160619
+21
+-157.48997269099246
+31
+289.3675042027214
+12
+12.087681644267786
+22
+-157.783853387049
+32
+289.08518403094024
+13
+12.087681644267786
+23
+-157.783853387049
+33
+289.08518403094024
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.338303885782665
+20
+-156.303802055457
+30
+279.40811253936124
+11
+17.969858930246176
+21
+-154.60805567883196
+31
+279.53679942800755
+12
+13.125390810157233
+22
+-158.61651535920842
+32
+285.15247620700194
+13
+13.125390810157233
+23
+-158.61651535920842
+33
+285.15247620700194
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.969858930246176
+20
+-154.60805567883196
+30
+279.53679942800755
+11
+14.260147535096436
+21
+-156.85505652880718
+31
+286.3021399237706
+12
+13.125390810157233
+22
+-158.61651535920842
+32
+285.15247620700194
+13
+13.125390810157233
+23
+-158.61651535920842
+33
+285.15247620700194
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.031297593332752
+20
+-153.71363616909326
+30
+275.2326337056379
+11
+16.338303885782665
+21
+-156.303802055457
+31
+279.40811253936124
+12
+17.33463854373867
+22
+-154.86147453992314
+32
+275.08569335760933
+13
+17.33463854373867
+23
+-154.86147453992314
+33
+275.08569335760933
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.031297593332752
+20
+-153.71363616909326
+30
+275.2326337056379
+11
+17.969858930246176
+21
+-154.60805567883196
+31
+279.53679942800755
+12
+16.338303885782665
+22
+-156.303802055457
+32
+279.40811253936124
+13
+16.338303885782665
+23
+-156.303802055457
+33
+279.40811253936124
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.940928319222333
+20
+-151.05228179113757
+30
+267.66292409975733
+11
+17.33463854373867
+21
+-154.86147453992314
+31
+275.08569335760933
+12
+18.867016458891147
+22
+-151.77238076377296
+32
+267.04808674289336
+13
+18.867016458891147
+23
+-151.77238076377296
+33
+267.04808674289336
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.940928319222333
+20
+-151.05228179113757
+30
+267.66292409975733
+11
+19.031297593332752
+21
+-153.71363616909326
+31
+275.2326337056379
+12
+17.33463854373867
+22
+-154.86147453992314
+32
+275.08569335760933
+13
+17.33463854373867
+23
+-154.86147453992314
+33
+275.08569335760933
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.901683381550185
+20
+-149.30816374714755
+30
+261.6964766762974
+11
+18.867016458891147
+21
+-151.77238076377296
+31
+267.04808674289336
+12
+18.39120961765658
+22
+-150.28350692681386
+32
+261.9611518373419
+13
+18.39120961765658
+23
+-150.28350692681386
+33
+261.9611518373419
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.940928319222333
+20
+-151.05228179113757
+30
+267.66292409975733
+11
+18.867016458891147
+21
+-151.77238076377296
+31
+267.04808674289336
+12
+19.901683381550185
+22
+-149.30816374714755
+32
+261.6964766762974
+13
+19.901683381550185
+23
+-149.30816374714755
+33
+261.6964766762974
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.39120961765658
+20
+-150.28350692681386
+30
+261.9611518373419
+11
+17.161839128251934
+21
+-149.4989123976933
+31
+259.8218463977248
+12
+17.759335698702497
+22
+-149.4061239791656
+32
+258.51216068703764
+13
+17.759335698702497
+23
+-149.4061239791656
+33
+258.51216068703764
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.901683381550185
+20
+-149.30816374714755
+30
+261.6964766762974
+11
+18.39120961765658
+21
+-150.28350692681386
+31
+261.9611518373419
+12
+17.759335698702497
+22
+-149.4061239791656
+32
+258.51216068703764
+13
+17.759335698702497
+23
+-149.4061239791656
+33
+258.51216068703764
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.161839128251934
+20
+-149.4989123976933
+30
+259.8218463977248
+11
+13.888081188018505
+21
+-150.39150656149138
+31
+255.39203602993913
+12
+14.603008347162513
+22
+-151.03828747227413
+32
+254.29165665350325
+13
+14.603008347162513
+23
+-151.03828747227413
+33
+254.29165665350325
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.759335698702497
+20
+-149.4061239791656
+30
+258.51216068703764
+11
+17.161839128251934
+21
+-149.4989123976933
+31
+259.8218463977248
+12
+14.603008347162513
+22
+-151.03828747227413
+32
+254.29165665350325
+13
+14.603008347162513
+23
+-151.03828747227413
+33
+254.29165665350325
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.888081188018505
+20
+-150.39150656149138
+30
+255.39203602993913
+11
+7.904597202467808
+21
+-152.50647405526504
+31
+253.89129744438227
+12
+8.06948678555548
+22
+-153.13530573098848
+32
+252.90074304856364
+13
+8.06948678555548
+23
+-153.13530573098848
+33
+252.90074304856364
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.603008347162513
+20
+-151.03828747227413
+30
+254.29165665350325
+11
+13.888081188018505
+21
+-150.39150656149138
+31
+255.39203602993913
+12
+8.06948678555548
+22
+-153.13530573098848
+32
+252.90074304856364
+13
+8.06948678555548
+23
+-153.13530573098848
+33
+252.90074304856364
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+2.874552245324444
+20
+-158.6536307266113
+30
+253.97069999269414
+11
+2.193393986037892
+21
+-157.414829283193
+31
+256.19397134547074
+12
+1.0120909396735747
+22
+-159.11635592195614
+32
+257.3600631756826
+13
+1.0120909396735747
+23
+-159.11635592195614
+33
+257.3600631756826
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+2.874552245324444
+20
+-158.6536307266113
+30
+253.97069999269414
+11
+1.0120909396735747
+21
+-159.11635592195614
+31
+257.3600631756826
+12
+0.9965754991985257
+22
+-161.0338818300765
+32
+254.90375599145725
+13
+0.9965754991985257
+23
+-161.0338818300765
+33
+254.90375599145725
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.258483341000918
+20
+-157.564507650128
+30
+253.4912424595832
+11
+3.035182687889568
+21
+-156.0789802807242
+31
+254.9646008560665
+12
+2.193393986037892
+22
+-157.414829283193
+32
+256.19397134547074
+13
+2.193393986037892
+23
+-157.414829283193
+33
+256.19397134547074
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.258483341000918
+20
+-157.564507650128
+30
+253.4912424595832
+11
+2.193393986037892
+21
+-157.414829283193
+31
+256.19397134547074
+12
+2.874552245324444
+22
+-158.6536307266113
+32
+253.97069999269414
+13
+2.874552245324444
+23
+-158.6536307266113
+33
+253.97069999269414
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.06948678555548
+20
+-153.13530573098848
+30
+252.90074304856364
+11
+7.904597202467808
+21
+-152.50647405526504
+31
+253.89129744438227
+12
+3.258483341000918
+22
+-157.564507650128
+32
+253.4912424595832
+13
+3.258483341000918
+23
+-157.564507650128
+33
+253.4912424595832
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.904597202467808
+20
+-152.50647405526504
+30
+253.89129744438227
+11
+3.035182687889568
+21
+-156.0789802807242
+31
+254.9646008560665
+12
+3.258483341000918
+22
+-157.564507650128
+32
+253.4912424595832
+13
+3.258483341000918
+23
+-157.564507650128
+33
+253.4912424595832
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.0120909396735747
+20
+-159.11635592195614
+30
+257.3600631756826
+11
+1.2548619494594848
+21
+-151.99994055740467
+31
+258.4236314090323
+12
+0.020623870886214313
+22
+-160.23377186048216
+32
+258.16260693986186
+13
+0.020623870886214313
+23
+-160.23377186048216
+33
+258.16260693986186
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.2548619494594848
+20
+-151.99994055740467
+30
+258.4236314090323
+11
+0.020623870886214313
+21
+-152.66527915189332
+31
+259.2906707296962
+12
+0.020623870886214313
+22
+-160.23377186048216
+32
+258.16260693986186
+13
+0.020623870886214313
+23
+-160.23377186048216
+33
+258.16260693986186
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.88783213517064
+20
+-59.49201685605117
+30
+272.18917357797005
+11
+30.046347657641995
+21
+-55.47929803515443
+31
+275.19217187069887
+12
+32.053619741059904
+22
+-60.9203500527242
+32
+272.92570066404954
+13
+32.053619741059904
+23
+-60.9203500527242
+33
+272.92570066404954
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.30793662495383
+20
+-54.10815901121369
+30
+277.2800633997228
+11
+32.053619741059904
+21
+-60.9203500527242
+31
+272.92570066404954
+12
+30.046347657641995
+22
+-55.47929803515443
+32
+275.19217187069887
+13
+30.046347657641995
+23
+-55.47929803515443
+33
+275.19217187069887
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.331710072653514
+20
+-68.07692302791553
+30
+266.72925965236897
+11
+30.216409054221355
+21
+-63.56040872806379
+31
+267.0124924971204
+12
+32.053619741059904
+22
+-60.9203500527242
+32
+272.92570066404954
+13
+32.053619741059904
+23
+-60.9203500527242
+33
+272.92570066404954
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.216409054221355
+20
+-63.56040872806379
+30
+267.0124924971204
+11
+30.88783213517064
+21
+-59.49201685605117
+31
+272.18917357797005
+12
+32.053619741059904
+22
+-60.9203500527242
+32
+272.92570066404954
+13
+32.053619741059904
+23
+-60.9203500527242
+33
+272.92570066404954
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.216409054221355
+20
+-63.56040872806379
+30
+267.0124924971204
+11
+30.046347657641995
+21
+-55.47929803515443
+31
+275.19217187069887
+12
+30.88783213517064
+22
+-59.49201685605117
+32
+272.18917357797005
+13
+30.88783213517064
+23
+-59.49201685605117
+33
+272.18917357797005
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.216409054221355
+20
+-63.56040872806379
+30
+267.0124924971204
+11
+28.16502444396265
+21
+-57.196948563037836
+31
+273.46022279963177
+12
+30.046347657641995
+22
+-55.47929803515443
+32
+275.19217187069887
+13
+30.046347657641995
+23
+-55.47929803515443
+33
+275.19217187069887
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.021621015665545
+20
+-61.68212775761751
+30
+277.3564237048039
+11
+27.56600675189688
+21
+-63.57561994421555
+31
+266.0645295065278
+12
+16.68116469784874
+22
+-67.13869521566203
+32
+273.6537094690826
+13
+16.68116469784874
+23
+-67.13869521566203
+33
+273.6537094690826
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.56600675189688
+20
+-63.57561994421555
+30
+266.0645295065278
+11
+15.021621015665545
+21
+-61.68212775761751
+31
+277.3564237048039
+12
+26.072569550093522
+22
+-58.39893886336902
+32
+274.2052681667564
+13
+26.072569550093522
+23
+-58.39893886336902
+33
+274.2052681667564
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.696837860971623
+20
+-68.7142729846832
+30
+262.1385146176952
+11
+17.8703775766121
+21
+-70.48272897451672
+31
+269.39791541407493
+12
+16.68116469784874
+22
+-67.13869521566203
+32
+273.6537094690826
+13
+16.68116469784874
+23
+-67.13869521566203
+33
+273.6537094690826
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.696837860971623
+20
+-68.7142729846832
+30
+262.1385146176952
+11
+16.68116469784874
+21
+-67.13869521566203
+31
+273.6537094690826
+12
+27.56600675189688
+22
+-63.57561994421555
+32
+266.0645295065278
+13
+27.56600675189688
+23
+-63.57561994421555
+33
+266.0645295065278
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.79965103199161
+20
+-75.0865556550776
+30
+256.66034723271235
+11
+17.386660902978498
+21
+-78.00437113735553
+31
+261.6435416441068
+12
+17.8703775766121
+22
+-70.48272897451672
+32
+269.39791541407493
+13
+17.8703775766121
+23
+-70.48272897451672
+33
+269.39791541407493
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.696837860971623
+20
+-68.7142729846832
+30
+262.1385146176952
+11
+27.79965103199161
+21
+-75.0865556550776
+31
+256.66034723271235
+12
+17.8703775766121
+22
+-70.48272897451672
+32
+269.39791541407493
+13
+17.8703775766121
+23
+-70.48272897451672
+33
+269.39791541407493
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.386660902978498
+20
+-78.00437113735553
+30
+261.6435416441068
+11
+27.9502420718964
+21
+-80.56654838599603
+31
+252.34766322929582
+12
+17.010943864024107
+22
+-82.01678573392914
+32
+257.98250614064233
+13
+17.010943864024107
+23
+-82.01678573392914
+33
+257.98250614064233
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.79965103199161
+20
+-75.0865556550776
+30
+256.66034723271235
+11
+27.9502420718964
+21
+-80.56654838599603
+31
+252.34766322929582
+12
+17.386660902978498
+22
+-78.00437113735553
+32
+261.6435416441068
+13
+17.386660902978498
+23
+-78.00437113735553
+33
+261.6435416441068
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.010943864024107
+20
+-82.01678573392914
+30
+257.98250614064233
+11
+16.006090925022978
+21
+-83.42351900366741
+31
+263.2586685751247
+12
+15.540323486448743
+22
+-79.63623040614361
+32
+267.68026488618904
+13
+15.540323486448743
+23
+-79.63623040614361
+33
+267.68026488618904
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.010943864024107
+20
+-82.01678573392914
+30
+257.98250614064233
+11
+15.540323486448743
+21
+-79.63623040614361
+31
+267.68026488618904
+12
+17.386660902978498
+22
+-78.00437113735553
+32
+261.6435416441068
+13
+17.386660902978498
+23
+-78.00437113735553
+33
+261.6435416441068
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.386660902978498
+20
+-78.00437113735553
+30
+261.6435416441068
+11
+15.540323486448743
+21
+-79.63623040614361
+31
+267.68026488618904
+12
+14.092215708778346
+22
+-73.44100629175855
+32
+273.3856878404827
+13
+14.092215708778346
+23
+-73.44100629175855
+33
+273.3856878404827
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.386660902978498
+20
+-78.00437113735553
+30
+261.6435416441068
+11
+14.092215708778346
+21
+-73.44100629175855
+31
+273.3856878404827
+12
+17.8703775766121
+22
+-70.48272897451672
+32
+269.39791541407493
+13
+17.8703775766121
+23
+-70.48272897451672
+33
+269.39791541407493
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.8703775766121
+20
+-70.48272897451672
+30
+269.39791541407493
+11
+14.092215708778346
+21
+-73.44100629175855
+31
+273.3856878404827
+12
+12.199331970823456
+22
+-68.54755805566059
+32
+274.9901669201967
+13
+12.199331970823456
+23
+-68.54755805566059
+33
+274.9901669201967
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.8703775766121
+20
+-70.48272897451672
+30
+269.39791541407493
+11
+12.199331970823456
+21
+-68.54755805566059
+31
+274.9901669201967
+12
+16.68116469784874
+22
+-67.13869521566203
+32
+273.6537094690826
+13
+16.68116469784874
+23
+-67.13869521566203
+33
+273.6537094690826
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.636575573869563
+20
+-63.20842118630851
+30
+274.6716440539755
+11
+16.68116469784874
+21
+-67.13869521566203
+31
+273.6537094690826
+12
+12.199331970823456
+22
+-68.54755805566059
+32
+274.9901669201967
+13
+12.199331970823456
+23
+-68.54755805566059
+33
+274.9901669201967
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.021621015665545
+20
+-61.68212775761751
+30
+277.3564237048039
+11
+16.68116469784874
+21
+-67.13869521566203
+31
+273.6537094690826
+12
+7.636575573869563
+22
+-63.20842118630851
+32
+274.6716440539755
+13
+7.636575573869563
+23
+-63.20842118630851
+33
+274.6716440539755
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+20.327597433806176
+20
+-85.39276304670159
+30
+248.61270121533255
+11
+14.105601578992115
+21
+-92.64182021609923
+31
+250.706677230815
+12
+14.293003761984753
+22
+-85.69607469677305
+32
+250.85087955993777
+13
+14.293003761984753
+23
+-85.69607469677305
+33
+250.85087955993777
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+20.327597433806176
+20
+-85.39276304670159
+30
+248.61270121533255
+11
+21.00845146876971
+21
+-90.66253677040027
+31
+247.8366249672561
+12
+14.105601578992115
+22
+-92.64182021609923
+32
+250.706677230815
+13
+14.105601578992115
+23
+-92.64182021609923
+33
+250.706677230815
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-85.92667673363631
+30
+246.7316822259761
+11
+6.178428393538843
+21
+-89.47301966731385
+31
+247.7438365487293
+12
+0.020623870886214313
+22
+-93.58065647699968
+32
+246.88227326587892
+13
+0.020623870886214313
+23
+-93.58065647699968
+33
+246.88227326587892
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+6.178428393538843
+20
+-89.47301966731385
+30
+247.7438365487293
+11
+6.554145432493247
+21
+-93.1389227599457
+31
+247.20961863747004
+12
+0.020623870886214313
+22
+-93.58065647699968
+32
+246.88227326587892
+13
+0.020623870886214313
+23
+-93.58065647699968
+33
+246.88227326587892
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.293003761984753
+20
+-85.69607469677305
+30
+250.85087955993777
+11
+6.554145432493247
+21
+-93.1389227599457
+31
+247.20961863747004
+12
+6.178428393538843
+22
+-89.47301966731385
+32
+247.7438365487293
+13
+6.178428393538843
+23
+-89.47301966731385
+33
+247.7438365487293
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.293003761984753
+20
+-85.69607469677305
+30
+250.85087955993777
+11
+14.105601578992115
+21
+-92.64182021609923
+31
+250.706677230815
+12
+6.554145432493247
+22
+-93.1389227599457
+32
+247.20961863747004
+13
+6.554145432493247
+23
+-93.1389227599457
+33
+247.20961863747004
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.57236616234568
+20
+-81.55466898722894
+30
+248.61848147747125
+11
+21.00845146876971
+21
+-90.66253677040027
+31
+247.8366249672561
+12
+20.327597433806176
+22
+-85.39276304670159
+32
+248.61270121533255
+13
+20.327597433806176
+23
+-85.39276304670159
+33
+248.61270121533255
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.57236616234568
+20
+-81.55466898722894
+30
+248.61848147747125
+11
+26.883327370995122
+21
+-89.41217480270589
+31
+247.886821980558
+12
+21.00845146876971
+22
+-90.66253677040027
+32
+247.8366249672561
+13
+21.00845146876971
+23
+-90.66253677040027
+33
+247.8366249672561
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.57236616234568
+20
+-81.55466898722894
+30
+248.61848147747125
+11
+20.327597433806176
+21
+-85.39276304670159
+31
+248.61270121533255
+12
+20.503439092523298
+22
+-82.66387086903299
+32
+249.394557725546
+13
+20.503439092523298
+23
+-82.66387086903299
+33
+249.394557725546
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.57236616234568
+20
+-81.55466898722894
+30
+248.61848147747125
+11
+20.503439092523298
+21
+-82.66387086903299
+31
+249.394557725546
+12
+27.9502420718964
+22
+-80.56654838599603
+32
+252.34766322929582
+13
+27.9502420718964
+23
+-80.56654838599603
+33
+252.34766322929582
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.9502420718964
+20
+-80.56654838599603
+30
+252.34766322929582
+11
+20.503439092523298
+21
+-82.66387086903299
+31
+249.394557725546
+12
+16.16033265680426
+22
+-83.83787253164563
+32
+254.3585860045894
+13
+16.16033265680426
+23
+-83.83787253164563
+33
+254.3585860045894
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.9502420718964
+20
+-80.56654838599603
+30
+252.34766322929582
+11
+16.16033265680426
+21
+-83.83787253164563
+31
+254.3585860045894
+12
+17.010943864024107
+22
+-82.01678573392914
+32
+257.98250614064233
+13
+17.010943864024107
+23
+-82.01678573392914
+33
+257.98250614064233
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.16033265680426
+20
+-83.83787253164563
+30
+254.3585860045894
+11
+15.320065076567788
+21
+-87.58439506988398
+31
+257.268491654466
+12
+17.010943864024107
+22
+-82.01678573392914
+32
+257.98250614064233
+13
+17.010943864024107
+23
+-82.01678573392914
+33
+257.98250614064233
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.320065076567788
+20
+-87.58439506988398
+30
+257.268491654466
+11
+16.006090925022978
+21
+-83.42351900366741
+31
+263.2586685751247
+12
+17.010943864024107
+22
+-82.01678573392914
+32
+257.98250614064233
+13
+17.010943864024107
+23
+-82.01678573392914
+33
+257.98250614064233
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+20.327597433806176
+20
+-85.39276304670159
+30
+248.61270121533255
+11
+14.293003761984753
+21
+-85.69607469677305
+31
+250.85087955993777
+12
+16.16033265680426
+22
+-83.83787253164563
+32
+254.3585860045894
+13
+16.16033265680426
+23
+-83.83787253164563
+33
+254.3585860045894
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+20.327597433806176
+20
+-85.39276304670159
+30
+248.61270121533255
+11
+16.16033265680426
+21
+-83.83787253164563
+31
+254.3585860045894
+12
+20.503439092523298
+22
+-82.66387086903299
+32
+249.394557725546
+13
+20.503439092523298
+23
+-82.66387086903299
+33
+249.394557725546
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.9965754991985257
+20
+-161.0338818300765
+30
+254.90375599145725
+11
+1.0120909396735747
+21
+-159.11635592195614
+31
+257.3600631756826
+12
+0.020623870886214313
+22
+-160.23377186048216
+32
+258.16260693986186
+13
+0.020623870886214313
+23
+-160.23377186048216
+33
+258.16260693986186
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.9965754991985257
+20
+-161.0338818300765
+30
+254.90375599145725
+11
+0.020623870886214313
+21
+-160.23377186048216
+31
+258.16260693986186
+12
+0.020623870886214313
+22
+-161.6402921731923
+32
+255.0485667692241
+13
+0.020623870886214313
+23
+-161.6402921731923
+33
+255.0485667692241
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.8873589672271407
+20
+-147.4606094333251
+30
+259.0652405063248
+11
+0.596520514400937
+21
+-137.4467616161409
+31
+261.2699541753983
+12
+0.020623870886214313
+22
+-138.5760423032655
+32
+261.72294419240455
+13
+0.020623870886214313
+23
+-138.5760423032655
+33
+261.72294419240455
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.8873589672271407
+20
+-147.4606094333251
+30
+259.0652405063248
+11
+0.020623870886214313
+21
+-138.5760423032655
+31
+261.72294419240455
+12
+0.020623870886214313
+22
+-147.740495810522
+32
+259.972133213307
+13
+0.020623870886214313
+23
+-147.740495810522
+33
+259.972133213307
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.596520514400937
+20
+-137.4467616161409
+30
+261.2699541753983
+11
+0.6920469518354924
+21
+-129.91629694793264
+31
+264.5269797778662
+12
+0.020623870886214313
+22
+-130.10887094441713
+32
+265.23886469377976
+13
+0.020623870886214313
+23
+-130.10887094441713
+33
+265.23886469377976
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.596520514400937
+20
+-137.4467616161409
+30
+261.2699541753983
+11
+0.020623870886214313
+21
+-130.10887094441713
+31
+265.23886469377976
+12
+0.020623870886214313
+22
+-138.5760423032655
+32
+261.72294419240455
+13
+0.020623870886214313
+23
+-138.5760423032655
+33
+261.72294419240455
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.6920469518354924
+20
+-129.91629694793264
+30
+264.5269797778662
+11
+0.8243845323578977
+21
+-126.56982939449381
+31
+268.9674379969592
+12
+0.020623870886214313
+22
+-127.72131845720034
+32
+269.6236498617562
+13
+0.020623870886214313
+23
+-127.72131845720034
+33
+269.6236498617562
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.6920469518354924
+20
+-129.91629694793264
+30
+264.5269797778662
+11
+0.020623870886214313
+21
+-127.72131845720034
+31
+269.6236498617562
+12
+0.020623870886214313
+22
+-130.10887094441713
+32
+265.23886469377976
+13
+0.020623870886214313
+23
+-130.10887094441713
+33
+265.23886469377976
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.76716885106902
+20
+-124.78251149662779
+30
+245.0824821707662
+11
+42.33366384090457
+21
+-131.07113247818927
+31
+252.1998102082854
+12
+40.6662103263223
+22
+-130.3954502567162
+32
+247.2814155776979
+13
+40.6662103263223
+23
+-130.3954502567162
+33
+247.2814155776979
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.5864303028482
+20
+-126.94098306859755
+30
+249.36687331213798
+11
+42.33366384090457
+21
+-131.07113247818927
+31
+252.1998102082854
+12
+43.76716885106902
+22
+-124.78251149662779
+32
+245.0824821707662
+13
+43.76716885106902
+23
+-124.78251149662779
+33
+245.0824821707662
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.46601607159445
+20
+-123.43145127800587
+30
+240.6523675786581
+11
+40.6662103263223
+21
+-130.3954502567162
+31
+247.2814155776979
+12
+38.86307276366422
+22
+-129.23818093187063
+32
+241.9626617379899
+13
+38.86307276366422
+23
+-129.23818093187063
+33
+241.9626617379899
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.46601607159445
+20
+-123.43145127800587
+30
+240.6523675786581
+11
+43.76716885106902
+21
+-124.78251149662779
+31
+245.0824821707662
+12
+40.6662103263223
+22
+-130.3954502567162
+32
+247.2814155776979
+13
+40.6662103263223
+23
+-130.3954502567162
+33
+247.2814155776979
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.016082947985815
+20
+-114.803649476592
+30
+242.67424242958393
+11
+38.00485594836838
+21
+-106.55734497627067
+31
+245.60057619290808
+12
+43.396015176960205
+22
+-117.24322432305114
+32
+247.88438818596657
+13
+43.396015176960205
+23
+-117.24322432305114
+33
+247.88438818596657
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.00485594836838
+20
+-106.55734497627067
+30
+245.60057619290808
+11
+41.00207397895846
+21
+-111.23418549436596
+31
+251.59257845950265
+12
+43.396015176960205
+22
+-117.24322432305114
+32
+247.88438818596657
+13
+43.396015176960205
+23
+-117.24322432305114
+33
+247.88438818596657
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.84783224717718
+20
+-119.48596603249993
+30
+240.02870771642716
+11
+40.016082947985815
+21
+-114.803649476592
+31
+242.67424242958393
+12
+43.30231408546388
+22
+-120.04604301121783
+32
+244.71984677770354
+13
+43.30231408546388
+23
+-120.04604301121783
+33
+244.71984677770354
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.016082947985815
+20
+-114.803649476592
+30
+242.67424242958393
+11
+43.396015176960205
+21
+-117.24322432305114
+31
+247.88438818596657
+12
+43.30231408546388
+22
+-120.04604301121783
+32
+244.71984677770354
+13
+43.30231408546388
+23
+-120.04604301121783
+33
+244.71984677770354
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.84783224717718
+20
+-119.48596603249993
+30
+240.02870771642716
+11
+43.76716885106902
+21
+-124.78251149662779
+31
+245.0824821707662
+12
+41.46601607159445
+22
+-123.43145127800587
+32
+240.6523675786581
+13
+41.46601607159445
+23
+-123.43145127800587
+33
+240.6523675786581
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.84783224717718
+20
+-119.48596603249993
+30
+240.02870771642716
+11
+43.30231408546388
+21
+-120.04604301121783
+31
+244.71984677770354
+12
+43.76716885106902
+22
+-124.78251149662779
+32
+245.0824821707662
+13
+43.76716885106902
+23
+-124.78251149662779
+33
+245.0824821707662
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.93637617534934
+20
+-122.4783164739205
+30
+236.59492778227386
+11
+39.88313691881735
+21
+-118.86960755402022
+31
+237.36339842227386
+12
+41.46601607159445
+22
+-123.43145127800587
+32
+240.6523675786581
+13
+41.46601607159445
+23
+-123.43145127800587
+33
+240.6523675786581
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.88313691881735
+20
+-118.86960755402022
+30
+237.36339842227386
+11
+40.84783224717718
+21
+-119.48596603249993
+31
+240.02870771642716
+12
+41.46601607159445
+22
+-123.43145127800587
+32
+240.6523675786581
+13
+41.46601607159445
+23
+-123.43145127800587
+33
+240.6523675786581
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.88313691881735
+20
+-118.86960755402022
+30
+237.36339842227386
+11
+39.40763430190582
+21
+-112.76078314737723
+31
+238.28519812108638
+12
+40.84783224717718
+22
+-119.48596603249993
+32
+240.02870771642716
+13
+40.84783224717718
+23
+-119.48596603249993
+33
+240.02870771642716
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.40763430190582
+20
+-112.76078314737723
+30
+238.28519812108638
+11
+40.016082947985815
+21
+-114.803649476592
+31
+242.67424242958393
+12
+40.84783224717718
+22
+-119.48596603249993
+32
+240.02870771642716
+13
+40.84783224717718
+23
+-119.48596603249993
+33
+240.02870771642716
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.40763430190582
+20
+-112.76078314737723
+30
+238.28519812108638
+11
+37.62670511482968
+21
+-105.33862233817082
+31
+239.83369992536214
+12
+40.016082947985815
+22
+-114.803649476592
+32
+242.67424242958393
+13
+40.016082947985815
+23
+-114.803649476592
+33
+242.67424242958393
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.62670511482968
+20
+-105.33862233817082
+30
+239.83369992536214
+11
+38.00485594836838
+21
+-106.55734497627067
+31
+245.60057619290808
+12
+40.016082947985815
+22
+-114.803649476592
+32
+242.67424242958393
+13
+40.016082947985815
+23
+-114.803649476592
+33
+242.67424242958393
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.93637617534934
+20
+-122.4783164739205
+30
+236.59492778227386
+11
+38.86307276366422
+21
+-129.23818093187063
+31
+241.9626617379899
+12
+37.75508777915255
+22
+-129.7006019028902
+32
+237.0098897588986
+13
+37.75508777915255
+23
+-129.7006019028902
+33
+237.0098897588986
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.93637617534934
+20
+-122.4783164739205
+30
+236.59492778227386
+11
+41.46601607159445
+21
+-123.43145127800587
+31
+240.6523675786581
+12
+38.86307276366422
+22
+-129.23818093187063
+32
+241.9626617379899
+13
+38.86307276366422
+23
+-129.23818093187063
+33
+241.9626617379899
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.9640752389135
+20
+-128.55884801851897
+30
+228.79917950437206
+11
+39.76144718960134
+21
+-122.34232820151988
+31
+229.8359759972943
+12
+37.75508777915255
+22
+-129.7006019028902
+32
+237.0098897588986
+13
+37.75508777915255
+23
+-129.7006019028902
+33
+237.0098897588986
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.76144718960134
+20
+-122.34232820151988
+30
+229.8359759972943
+11
+39.93637617534934
+21
+-122.4783164739205
+31
+236.59492778227386
+12
+37.75508777915255
+22
+-129.7006019028902
+32
+237.0098897588986
+13
+37.75508777915255
+23
+-129.7006019028902
+33
+237.0098897588986
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.82046670827109
+20
+-110.83565163117865
+30
+232.39967436755526
+11
+37.30696535131463
+21
+-103.82358520943055
+31
+235.58581570275481
+12
+39.40763430190582
+22
+-112.76078314737723
+32
+238.28519812108638
+13
+39.40763430190582
+23
+-112.76078314737723
+33
+238.28519812108638
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.30696535131463
+20
+-103.82358520943055
+30
+235.58581570275481
+11
+37.62670511482968
+21
+-105.33862233817082
+31
+239.83369992536214
+12
+39.40763430190582
+22
+-112.76078314737723
+32
+238.28519812108638
+13
+39.40763430190582
+23
+-112.76078314737723
+33
+238.28519812108638
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.230865320052054
+20
+-117.44036168437673
+30
+231.17517146731763
+11
+39.82046670827109
+21
+-110.83565163117865
+31
+232.39967436755526
+12
+39.88313691881735
+22
+-118.86960755402022
+32
+237.36339842227386
+13
+39.88313691881735
+23
+-118.86960755402022
+33
+237.36339842227386
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.82046670827109
+20
+-110.83565163117865
+30
+232.39967436755526
+11
+39.40763430190582
+21
+-112.76078314737723
+31
+238.28519812108638
+12
+39.88313691881735
+22
+-118.86960755402022
+32
+237.36339842227386
+13
+39.88313691881735
+23
+-118.86960755402022
+33
+237.36339842227386
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+39.76144718960134
+20
+-122.34232820151988
+30
+229.8359759972943
+11
+40.230865320052054
+21
+-117.44036168437673
+31
+231.17517146731763
+12
+39.93637617534934
+22
+-122.4783164739205
+32
+236.59492778227386
+13
+39.93637617534934
+23
+-122.4783164739205
+33
+236.59492778227386
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.230865320052054
+20
+-117.44036168437673
+30
+231.17517146731763
+11
+39.88313691881735
+21
+-118.86960755402022
+31
+237.36339842227386
+12
+39.93637617534934
+22
+-122.4783164739205
+32
+236.59492778227386
+13
+39.93637617534934
+23
+-122.4783164739205
+33
+236.59492778227386
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.30696535131463
+20
+-103.82358520943055
+30
+235.58581570275481
+11
+31.987907287283267
+21
+-94.20735858246191
+31
+245.9121018997042
+12
+34.57898584661495
+22
+-96.30346416820805
+32
+248.48036363480728
+13
+34.57898584661495
+23
+-96.30346416820805
+33
+248.48036363480728
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.30696535131463
+20
+-103.82358520943055
+30
+235.58581570275481
+11
+34.57898584661495
+21
+-96.30346416820805
+31
+248.48036363480728
+12
+37.62670511482968
+22
+-105.33862233817082
+32
+239.83369992536214
+13
+37.62670511482968
+23
+-105.33862233817082
+33
+239.83369992536214
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.62670511482968
+20
+-105.33862233817082
+30
+239.83369992536214
+11
+34.57898584661495
+21
+-96.30346416820805
+31
+248.48036363480728
+12
+36.21267046133975
+22
+-99.88570557200534
+32
+253.3774625627812
+13
+36.21267046133975
+23
+-99.88570557200534
+33
+253.3774625627812
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.62670511482968
+20
+-105.33862233817082
+30
+239.83369992536214
+11
+36.21267046133975
+21
+-99.88570557200534
+31
+253.3774625627812
+12
+38.00485594836838
+22
+-106.55734497627067
+32
+245.60057619290808
+13
+38.00485594836838
+23
+-106.55734497627067
+33
+245.60057619290808
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.00485594836838
+20
+-106.55734497627067
+30
+245.60057619290808
+11
+36.21267046133975
+21
+-99.88570557200534
+31
+253.3774625627812
+12
+38.394263081859584
+22
+-103.92793415223925
+32
+258.83981028296347
+13
+38.394263081859584
+23
+-103.92793415223925
+33
+258.83981028296347
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.00485594836838
+20
+-106.55734497627067
+30
+245.60057619290808
+11
+38.394263081859584
+21
+-103.92793415223925
+31
+258.83981028296347
+12
+41.00207397895846
+22
+-111.23418549436596
+32
+251.59257845950265
+13
+41.00207397895846
+23
+-111.23418549436596
+33
+251.59257845950265
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.00207397895846
+20
+-111.23418549436596
+30
+251.59257845950265
+11
+38.394263081859584
+21
+-103.92793415223925
+31
+258.83981028296347
+12
+41.45871468784149
+22
+-106.94857745570455
+32
+263.3669724341209
+13
+41.45871468784149
+23
+-106.94857745570455
+33
+263.3669724341209
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.00207397895846
+20
+-111.23418549436596
+30
+251.59257845950265
+11
+41.45871468784149
+21
+-106.94857745570455
+31
+263.3669724341209
+12
+44.6357292933482
+22
+-115.06041480524135
+32
+256.5435250926546
+13
+44.6357292933482
+23
+-115.06041480524135
+33
+256.5435250926546
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.6357292933482
+20
+-115.06041480524135
+30
+256.5435250926546
+11
+41.45871468784149
+21
+-106.94857745570455
+31
+263.3669724341209
+12
+44.77567248194661
+22
+-110.86242337161498
+32
+266.62491070955497
+13
+44.77567248194661
+23
+-110.86242337161498
+33
+266.62491070955497
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.76326349585836
+20
+-117.57634995678295
+30
+259.23438922994274
+11
+44.6357292933482
+21
+-115.06041480524135
+31
+256.5435250926546
+12
+44.77567248194661
+22
+-110.86242337161498
+32
+266.62491070955497
+13
+44.77567248194661
+23
+-110.86242337161498
+33
+266.62491070955497
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.686087458492544
+20
+-97.68433837049348
+30
+274.9576149176242
+11
+30.756711451940397
+21
+-95.43307837999998
+31
+284.7128720602254
+12
+35.32433543806294
+22
+-100.26781132175101
+32
+282.2294889112486
+13
+35.32433543806294
+23
+-100.26781132175101
+33
+282.2294889112486
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.686087458492544
+20
+-97.68433837049348
+30
+274.9576149176242
+11
+26.58518753441593
+21
+-92.19248089097715
+31
+281.4217733335795
+12
+30.756711451940397
+22
+-95.43307837999998
+32
+284.7128720602254
+13
+30.756711451940397
+23
+-95.43307837999998
+33
+284.7128720602254
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.80645773924373
+20
+-105.05843173665951
+30
+273.0169679609502
+11
+35.32433543806294
+21
+-100.26781132175101
+31
+282.2294889112486
+12
+40.286234146845345
+22
+-104.22637821314689
+32
+279.8017788133884
+13
+40.286234146845345
+23
+-104.22637821314689
+33
+279.8017788133884
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.80645773924373
+20
+-105.05843173665951
+30
+273.0169679609502
+11
+33.686087458492544
+21
+-97.68433837049348
+31
+274.9576149176242
+12
+35.32433543806294
+22
+-100.26781132175101
+32
+282.2294889112486
+13
+35.32433543806294
+23
+-100.26781132175101
+33
+282.2294889112486
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+48.16004638603738
+20
+-114.65762180154074
+30
+273.57004778023446
+11
+40.286234146845345
+21
+-104.22637821314689
+31
+279.8017788133884
+12
+48.15487457254571
+22
+-111.18155468648708
+32
+278.7826273312026
+13
+48.15487457254571
+23
+-111.18155468648708
+33
+278.7826273312026
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.80645773924373
+20
+-105.05843173665951
+30
+273.0169679609502
+11
+40.286234146845345
+21
+-104.22637821314689
+31
+279.8017788133884
+12
+48.16004638603738
+22
+-114.65762180154074
+32
+273.57004778023446
+13
+48.16004638603738
+23
+-114.65762180154074
+33
+273.57004778023446
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+56.01590939017007
+20
+-118.29949117265369
+30
+277.8401403784229
+11
+48.16004638603738
+21
+-114.65762180154074
+31
+273.57004778023446
+12
+51.11290851032824
+22
+-113.6040929708548
+32
+279.6037287790869
+13
+51.11290851032824
+23
+-113.6040929708548
+33
+279.6037287790869
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+48.16004638603738
+20
+-114.65762180154074
+30
+273.57004778023446
+11
+48.15487457254571
+21
+-111.18155468648708
+31
+278.7826273312026
+12
+51.11290851032824
+22
+-113.6040929708548
+32
+279.6037287790869
+13
+51.11290851032824
+23
+-113.6040929708548
+33
+279.6037287790869
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+62.580400987862575
+20
+-122.47527423069948
+30
+273.0568213472637
+11
+53.723670383360584
+21
+-118.59458876600027
+31
+269.09247419373065
+12
+56.01590939017007
+22
+-118.29949117265369
+32
+277.8401403784229
+13
+56.01590939017007
+23
+-118.29949117265369
+33
+277.8401403784229
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+56.01590939017007
+20
+-118.29949117265369
+30
+277.8401403784229
+11
+53.723670383360584
+21
+-118.59458876600027
+31
+269.09247419373065
+12
+48.16004638603738
+22
+-114.65762180154074
+32
+273.57004778023446
+13
+48.16004638603738
+23
+-114.65762180154074
+33
+273.57004778023446
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+66.47143007954416
+20
+-129.334924266603
+30
+263.6961431516443
+11
+61.25523025913265
+21
+-135.54748916740476
+31
+271.1490306174767
+12
+59.38418982757204
+22
+-134.00050848474453
+32
+264.143048682189
+13
+59.38418982757204
+23
+-134.00050848474453
+33
+264.143048682189
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+67.16925983173333
+20
+-130.70910553377666
+30
+271.40944663800013
+11
+61.25523025913265
+21
+-135.54748916740476
+31
+271.1490306174767
+12
+66.47143007954416
+22
+-129.334924266603
+32
+263.6961431516443
+13
+66.47143007954416
+23
+-129.334924266603
+33
+263.6961431516443
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.06142583728591
+20
+-127.834794129691
+30
+256.8036368888506
+11
+59.38418982757204
+21
+-134.00050848474453
+31
+264.143048682189
+12
+56.361051884658956
+22
+-130.8128460279296
+32
+256.9222843748351
+13
+56.361051884658956
+23
+-130.8128460279296
+33
+256.9222843748351
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+66.47143007954416
+20
+-129.334924266603
+30
+263.6961431516443
+11
+59.38418982757204
+21
+-134.00050848474453
+31
+264.143048682189
+12
+64.06142583728591
+22
+-127.834794129691
+32
+256.8036368888506
+13
+64.06142583728591
+23
+-127.834794129691
+33
+256.8036368888506
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.06142583728591
+20
+-127.834794129691
+30
+256.8036368888506
+11
+68.2521767320265
+21
+-120.9565864100797
+31
+257.0591853202059
+12
+66.47143007954416
+22
+-129.334924266603
+32
+263.6961431516443
+13
+66.47143007954416
+23
+-129.334924266603
+33
+263.6961431516443
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.2521767320265
+20
+-120.9565864100797
+30
+257.0591853202059
+11
+69.93304653925485
+21
+-124.01647465121756
+31
+263.01620178965135
+12
+66.47143007954416
+22
+-129.334924266603
+32
+263.6961431516443
+13
+66.47143007954416
+23
+-129.334924266603
+33
+263.6961431516443
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+56.361051884658956
+20
+-130.8128460279296
+30
+256.9222843748351
+11
+48.720275476915546
+21
+-134.5742755579978
+31
+263.4393778229973
+12
+45.48238558436852
+22
+-132.52927965852132
+32
+257.17874547915744
+13
+45.48238558436852
+23
+-132.52927965852132
+33
+257.17874547915744
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+59.38418982757204
+20
+-134.00050848474453
+30
+264.143048682189
+11
+48.720275476915546
+21
+-134.5742755579978
+31
+263.4393778229973
+12
+56.361051884658956
+22
+-130.8128460279296
+32
+256.9222843748351
+13
+56.361051884658956
+23
+-130.8128460279296
+33
+256.9222843748351
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+67.45258394378047
+20
+-118.93592845644756
+30
+255.2237999793062
+11
+64.06142583728591
+21
+-127.834794129691
+31
+256.8036368888506
+12
+62.23589736445213
+22
+-124.07792796446913
+32
+253.43739475441393
+13
+62.23589736445213
+23
+-124.07792796446913
+33
+253.43739475441393
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+67.45258394378047
+20
+-118.93592845644756
+30
+255.2237999793062
+11
+68.2521767320265
+21
+-120.9565864100797
+31
+257.0591853202059
+12
+64.06142583728591
+22
+-127.834794129691
+32
+256.8036368888506
+13
+64.06142583728591
+23
+-127.834794129691
+33
+256.8036368888506
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+55.79686787758127
+20
+-127.6720341168639
+30
+254.10364602187062
+11
+45.48238558436852
+21
+-132.52927965852132
+31
+257.17874547915744
+12
+47.47353377866533
+22
+-130.10582870118387
+32
+254.128592416359
+13
+47.47353377866533
+23
+-130.10582870118387
+33
+254.128592416359
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+55.79686787758127
+20
+-127.6720341168639
+30
+254.10364602187062
+11
+56.361051884658956
+21
+-130.8128460279296
+31
+256.9222843748351
+12
+45.48238558436852
+22
+-132.52927965852132
+32
+257.17874547915744
+13
+45.48238558436852
+23
+-132.52927965852132
+33
+257.17874547915744
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+62.23589736445213
+20
+-124.07792796446913
+30
+253.43739475441393
+11
+56.361051884658956
+21
+-130.8128460279296
+31
+256.9222843748351
+12
+55.79686787758127
+22
+-127.6720341168639
+32
+254.10364602187062
+13
+55.79686787758127
+23
+-127.6720341168639
+33
+254.10364602187062
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+62.23589736445213
+20
+-124.07792796446913
+30
+253.43739475441393
+11
+64.06142583728591
+21
+-127.834794129691
+31
+256.8036368888506
+12
+56.361051884658956
+22
+-130.8128460279296
+32
+256.9222843748351
+13
+56.361051884658956
+23
+-130.8128460279296
+33
+256.9222843748351
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.47353377866533
+20
+-130.10582870118387
+30
+254.128592416359
+11
+42.33366384090457
+21
+-131.07113247818927
+31
+252.1998102082854
+12
+45.5864303028482
+22
+-126.94098306859755
+32
+249.36687331213798
+13
+45.5864303028482
+23
+-126.94098306859755
+33
+249.36687331213798
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.47353377866533
+20
+-130.10582870118387
+30
+254.128592416359
+11
+45.48238558436852
+21
+-132.52927965852132
+31
+257.17874547915744
+12
+42.33366384090457
+22
+-131.07113247818927
+32
+252.1998102082854
+13
+42.33366384090457
+23
+-131.07113247818927
+33
+252.1998102082854
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+60.80932866885291
+20
+-122.79470976988624
+30
+252.63758900914206
+11
+55.79686787758127
+21
+-127.6720341168639
+31
+254.10364602187062
+12
+54.34489645100827
+22
+-124.51874900855394
+32
+252.75897451403463
+13
+54.34489645100827
+23
+-124.51874900855394
+33
+252.75897451403463
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+60.80932866885291
+20
+-122.79470976988624
+30
+252.63758900914206
+11
+62.23589736445213
+21
+-124.07792796446913
+31
+253.43739475441393
+12
+55.79686787758127
+22
+-127.6720341168639
+32
+254.10364602187062
+13
+55.79686787758127
+23
+-127.6720341168639
+33
+254.10364602187062
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+66.88091601835602
+20
+-117.78413516941802
+30
+254.89919262662278
+11
+62.23589736445213
+21
+-124.07792796446913
+31
+253.43739475441393
+12
+60.80932866885291
+22
+-122.79470976988624
+32
+252.63758900914206
+13
+60.80932866885291
+23
+-122.79470976988624
+33
+252.63758900914206
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+66.88091601835602
+20
+-117.78413516941802
+30
+254.89919262662278
+11
+67.45258394378047
+21
+-118.93592845644756
+31
+255.2237999793062
+12
+62.23589736445213
+22
+-124.07792796446913
+32
+253.43739475441393
+13
+62.23589736445213
+23
+-124.07792796446913
+33
+253.43739475441393
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+54.34489645100827
+20
+-124.51874900855394
+30
+252.75897451403463
+11
+47.47353377866533
+21
+-130.10582870118387
+31
+254.128592416359
+12
+45.5864303028482
+22
+-126.94098306859755
+32
+249.36687331213798
+13
+45.5864303028482
+23
+-126.94098306859755
+33
+249.36687331213798
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+54.34489645100827
+20
+-124.51874900855394
+30
+252.75897451403463
+11
+55.79686787758127
+21
+-127.6720341168639
+31
+254.10364602187062
+12
+47.47353377866533
+22
+-130.10582870118387
+32
+254.128592416359
+13
+47.47353377866533
+23
+-130.10582870118387
+33
+254.128592416359
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.400245017147725
+20
+-121.23282209539744
+30
+247.02921361390014
+11
+53.42896828163174
+21
+-122.60031042746368
+31
+252.73098587631543
+12
+45.5864303028482
+22
+-126.94098306859755
+32
+249.36687331213798
+13
+45.5864303028482
+23
+-126.94098306859755
+33
+249.36687331213798
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.42896828163174
+20
+-122.60031042746368
+30
+252.73098587631543
+11
+54.34489645100827
+21
+-124.51874900855394
+31
+252.75897451403463
+12
+45.5864303028482
+22
+-126.94098306859755
+32
+249.36687331213798
+13
+45.5864303028482
+23
+-126.94098306859755
+33
+249.36687331213798
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.42896828163174
+20
+-122.60031042746368
+30
+252.73098587631543
+11
+60.08722181568517
+21
+-123.02379068513592
+31
+254.77841557037453
+12
+54.34489645100827
+22
+-124.51874900855394
+32
+252.75897451403463
+13
+54.34489645100827
+23
+-124.51874900855394
+33
+252.75897451403463
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+60.80932866885291
+20
+-122.79470976988624
+30
+252.63758900914206
+11
+54.34489645100827
+21
+-124.51874900855394
+31
+252.75897451403463
+12
+60.08722181568517
+22
+-123.02379068513592
+32
+254.77841557037453
+13
+60.08722181568517
+23
+-123.02379068513592
+33
+254.77841557037453
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+67.09898401311108
+20
+-118.00682737388367
+30
+256.2718527721792
+11
+66.88091601835602
+21
+-117.78413516941802
+31
+254.89919262662278
+12
+60.80932866885291
+22
+-122.79470976988624
+32
+252.63758900914206
+13
+60.80932866885291
+23
+-122.79470976988624
+33
+252.63758900914206
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+67.09898401311108
+20
+-118.00682737388367
+30
+256.2718527721792
+11
+60.80932866885291
+21
+-122.79470976988624
+31
+252.63758900914206
+12
+60.08722181568517
+22
+-123.02379068513592
+32
+254.77841557037453
+13
+60.08722181568517
+23
+-123.02379068513592
+33
+254.77841557037453
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+67.50205081870678
+20
+-120.11236391364476
+30
+260.8601640122679
+11
+59.83319450594677
+21
+-123.98909446214293
+31
+259.1017474250957
+12
+57.547222520191916
+22
+-124.10469970489949
+32
+264.382473224424
+13
+57.547222520191916
+23
+-124.10469970489949
+33
+264.382473224424
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+67.50205081870678
+20
+-120.11236391364476
+30
+260.8601640122679
+11
+57.547222520191916
+21
+-124.10469970489949
+31
+264.382473224424
+12
+65.65623058352618
+22
+-121.81602012267024
+32
+266.94343357577526
+13
+65.65623058352618
+23
+-121.81602012267024
+33
+266.94343357577526
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+67.50205081870678
+20
+-120.11236391364476
+30
+260.8601640122679
+11
+67.09898401311108
+21
+-118.00682737388367
+31
+256.2718527721792
+12
+60.08722181568517
+22
+-123.02379068513592
+32
+254.77841557037453
+13
+60.08722181568517
+23
+-123.02379068513592
+33
+254.77841557037453
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+67.50205081870678
+20
+-120.11236391364476
+30
+260.8601640122679
+11
+60.08722181568517
+21
+-123.02379068513592
+31
+254.77841557037453
+12
+59.83319450594677
+22
+-123.98909446214293
+32
+259.1017474250957
+13
+59.83319450594677
+23
+-123.98909446214293
+33
+259.1017474250957
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+59.83319450594677
+20
+-123.98909446214293
+30
+259.1017474250957
+11
+53.42896828163174
+21
+-122.60031042746368
+31
+252.73098587631543
+12
+53.02955216791253
+22
+-120.65966347079222
+32
+255.34457703555253
+13
+53.02955216791253
+23
+-120.65966347079222
+33
+255.34457703555253
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+60.08722181568517
+20
+-123.02379068513592
+30
+254.77841557037453
+11
+53.42896828163174
+21
+-122.60031042746368
+31
+252.73098587631543
+12
+59.83319450594677
+22
+-123.98909446214293
+32
+259.1017474250957
+13
+59.83319450594677
+23
+-123.98909446214293
+33
+259.1017474250957
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.02955216791253
+20
+-120.65966347079222
+30
+255.34457703555253
+11
+50.76326349585836
+21
+-117.57634995678295
+31
+259.23438922994274
+12
+57.547222520191916
+22
+-124.10469970489949
+32
+264.382473224424
+13
+57.547222520191916
+23
+-124.10469970489949
+33
+264.382473224424
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+59.83319450594677
+20
+-123.98909446214293
+30
+259.1017474250957
+11
+53.02955216791253
+21
+-120.65966347079222
+31
+255.34457703555253
+12
+57.547222520191916
+22
+-124.10469970489949
+32
+264.382473224424
+13
+57.547222520191916
+23
+-124.10469970489949
+33
+264.382473224424
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.02955216791253
+20
+-120.65966347079222
+30
+255.34457703555253
+11
+45.50550663291958
+21
+-118.71262780333495
+31
+250.41340498339738
+12
+44.6357292933482
+22
+-115.06041480524135
+32
+256.5435250926546
+13
+44.6357292933482
+23
+-115.06041480524135
+33
+256.5435250926546
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.02955216791253
+20
+-120.65966347079222
+30
+255.34457703555253
+11
+44.6357292933482
+21
+-115.06041480524135
+31
+256.5435250926546
+12
+50.76326349585836
+22
+-117.57634995678295
+32
+259.23438922994274
+13
+50.76326349585836
+23
+-117.57634995678295
+33
+259.23438922994274
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.42896828163174
+20
+-122.60031042746368
+30
+252.73098587631543
+11
+45.400245017147725
+21
+-121.23282209539744
+31
+247.02921361390014
+12
+45.50550663291958
+22
+-118.71262780333495
+32
+250.41340498339738
+13
+45.50550663291958
+23
+-118.71262780333495
+33
+250.41340498339738
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.42896828163174
+20
+-122.60031042746368
+30
+252.73098587631543
+11
+45.50550663291958
+21
+-118.71262780333495
+31
+250.41340498339738
+12
+53.02955216791253
+22
+-120.65966347079222
+32
+255.34457703555253
+13
+53.02955216791253
+23
+-120.65966347079222
+33
+255.34457703555253
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.30231408546388
+20
+-120.04604301121783
+30
+244.71984677770354
+11
+45.5864303028482
+21
+-126.94098306859755
+31
+249.36687331213798
+12
+43.76716885106902
+22
+-124.78251149662779
+32
+245.0824821707662
+13
+43.76716885106902
+23
+-124.78251149662779
+33
+245.0824821707662
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.30231408546388
+20
+-120.04604301121783
+30
+244.71984677770354
+11
+45.400245017147725
+21
+-121.23282209539744
+31
+247.02921361390014
+12
+45.5864303028482
+22
+-126.94098306859755
+32
+249.36687331213798
+13
+45.5864303028482
+23
+-126.94098306859755
+33
+249.36687331213798
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.30231408546388
+20
+-120.04604301121783
+30
+244.71984677770354
+11
+43.396015176960205
+21
+-117.24322432305114
+31
+247.88438818596657
+12
+45.400245017147725
+22
+-121.23282209539744
+32
+247.02921361390014
+13
+45.400245017147725
+23
+-121.23282209539744
+33
+247.02921361390014
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.400245017147725
+20
+-121.23282209539744
+30
+247.02921361390014
+11
+43.396015176960205
+21
+-117.24322432305114
+31
+247.88438818596657
+12
+45.50550663291958
+22
+-118.71262780333495
+32
+250.41340498339738
+13
+45.50550663291958
+23
+-118.71262780333495
+33
+250.41340498339738
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.396015176960205
+20
+-117.24322432305114
+30
+247.88438818596657
+11
+41.00207397895846
+21
+-111.23418549436596
+31
+251.59257845950265
+12
+45.50550663291958
+22
+-118.71262780333495
+32
+250.41340498339738
+13
+45.50550663291958
+23
+-118.71262780333495
+33
+250.41340498339738
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.50550663291958
+20
+-118.71262780333495
+30
+250.41340498339738
+11
+41.00207397895846
+21
+-111.23418549436596
+31
+251.59257845950265
+12
+44.6357292933482
+22
+-115.06041480524135
+32
+256.5435250926546
+13
+44.6357292933482
+23
+-115.06041480524135
+33
+256.5435250926546
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.31380478809672
+20
+-77.93926713222768
+30
+272.2132072994854
+11
+37.20018261392761
+21
+-63.54580596056047
+31
+276.93781103630033
+12
+27.56053071408214
+22
+-84.02618738761304
+32
+276.2593907959159
+13
+27.56053071408214
+23
+-84.02618738761304
+33
+276.2593907959159
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.331710072653514
+20
+-68.07692302791553
+30
+266.72925965236897
+11
+37.20018261392761
+21
+-63.54580596056047
+31
+276.93781103630033
+12
+27.31380478809672
+22
+-77.93926713222768
+32
+272.2132072994854
+13
+27.31380478809672
+23
+-77.93926713222768
+33
+272.2132072994854
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.331710072653514
+20
+-68.07692302791553
+30
+266.72925965236897
+11
+32.053619741059904
+21
+-60.9203500527242
+31
+272.92570066404954
+12
+37.20018261392761
+22
+-63.54580596056047
+32
+276.93781103630033
+13
+37.20018261392761
+23
+-63.54580596056047
+33
+276.93781103630033
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.85353925847732
+20
+-48.289260384424985
+30
+267.7246816373608
+11
+45.281901755485165
+21
+-53.5094455434695
+31
+271.51835894566835
+12
+43.737963316057176
+22
+-51.23202226119153
+32
+269.55154869721537
+13
+43.737963316057176
+23
+-51.23202226119153
+33
+269.55154869721537
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.85353925847732
+20
+-48.289260384424985
+30
+267.7246816373608
+11
+47.86172401486436
+21
+-50.84170245473152
+31
+270.76144882994544
+12
+45.281901755485165
+22
+-53.5094455434695
+32
+271.51835894566835
+13
+45.281901755485165
+23
+-53.5094455434695
+33
+271.51835894566835
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.44874853601878
+20
+-46.6519250778264
+30
+277.5620793471828
+11
+43.737963316057176
+21
+-51.23202226119153
+31
+269.55154869721537
+12
+37.73409630086278
+22
+-50.19796378717996
+32
+274.89768272599736
+13
+37.73409630086278
+23
+-50.19796378717996
+33
+274.89768272599736
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.85353925847732
+20
+-48.289260384424985
+30
+267.7246816373608
+11
+43.737963316057176
+21
+-51.23202226119153
+31
+269.55154869721537
+12
+36.44874853601878
+22
+-46.6519250778264
+32
+277.5620793471828
+13
+36.44874853601878
+23
+-46.6519250778264
+33
+277.5620793471828
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+37.73409630086278
+20
+-50.19796378717996
+30
+274.89768272599736
+11
+33.30793662495383
+21
+-54.10815901121369
+31
+277.2800633997228
+12
+30.046347657641995
+22
+-55.47929803515443
+32
+275.19217187069887
+13
+30.046347657641995
+23
+-55.47929803515443
+33
+275.19217187069887
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.44874853601878
+20
+-46.6519250778264
+30
+277.5620793471828
+11
+37.73409630086278
+21
+-50.19796378717996
+31
+274.89768272599736
+12
+30.046347657641995
+22
+-55.47929803515443
+32
+275.19217187069887
+13
+30.046347657641995
+23
+-55.47929803515443
+33
+275.19217187069887
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+66.90075144421822
+20
+-21.398568246593527
+30
+255.97614673020914
+11
+75.8047067903857
+21
+-16.119059344559858
+31
+265.47190052525804
+12
+68.46540756004524
+22
+-25.331276070533047
+32
+261.46891688269534
+13
+68.46540756004524
+23
+-25.331276070533047
+33
+261.46891688269534
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.38353367517992
+20
+-8.556955346751463
+30
+253.43131026798287
+11
+75.8047067903857
+21
+-16.119059344559858
+31
+265.47190052525804
+12
+66.90075144421822
+22
+-21.398568246593527
+32
+255.97614673020914
+13
+66.90075144421822
+23
+-21.398568246593527
+33
+255.97614673020914
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.46540756004524
+20
+-25.331276070533047
+30
+261.46891688269534
+11
+57.8414682854362
+21
+-31.1857689431158
+31
+265.4810272549454
+12
+58.229202185150676
+22
+-26.936972047536965
+32
+256.70445975956557
+13
+58.229202185150676
+23
+-26.936972047536965
+33
+256.70445975956557
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.46540756004524
+20
+-25.331276070533047
+30
+261.46891688269534
+11
+58.229202185150676
+21
+-26.936972047536965
+31
+256.70445975956557
+12
+66.90075144421822
+22
+-21.398568246593527
+32
+255.97614673020914
+13
+66.90075144421822
+23
+-21.398568246593527
+33
+255.97614673020914
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+57.8414682854362
+20
+-31.1857689431158
+30
+265.4810272549454
+11
+47.60374178892644
+21
+-34.189375684489285
+31
+264.48590949428075
+12
+50.54489127678024
+22
+-32.81884510919139
+32
+253.30870786579155
+13
+50.54489127678024
+23
+-32.81884510919139
+33
+253.30870786579155
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+58.229202185150676
+20
+-26.936972047536965
+30
+256.70445975956557
+11
+57.8414682854362
+21
+-31.1857689431158
+31
+265.4810272549454
+12
+50.54489127678024
+22
+-32.81884510919139
+32
+253.30870786579155
+13
+50.54489127678024
+23
+-32.81884510919139
+33
+253.30870786579155
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.60374178892644
+20
+-34.189375684489285
+30
+264.48590949428075
+11
+44.33302609192341
+21
+-32.47233360525124
+31
+262.9054641360879
+12
+46.90889343510309
+22
+-29.995339167058177
+32
+257.25906070046665
+13
+46.90889343510309
+23
+-29.995339167058177
+33
+257.25906070046665
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.54489127678024
+20
+-32.81884510919139
+30
+253.30870786579155
+11
+47.60374178892644
+21
+-34.189375684489285
+31
+264.48590949428075
+12
+46.90889343510309
+22
+-29.995339167058177
+32
+257.25906070046665
+13
+46.90889343510309
+23
+-29.995339167058177
+33
+257.25906070046665
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.33302609192341
+20
+-32.47233360525124
+30
+262.9054641360879
+11
+40.68841870190421
+21
+-28.405767079177412
+31
+269.90566580923985
+12
+43.87516848574824
+22
+-24.972291369346983
+32
+265.9306708043999
+13
+43.87516848574824
+23
+-24.972291369346983
+33
+265.9306708043999
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+46.90889343510309
+20
+-29.995339167058177
+30
+257.25906070046665
+11
+44.33302609192341
+21
+-32.47233360525124
+31
+262.9054641360879
+12
+43.87516848574824
+22
+-24.972291369346983
+32
+265.9306708043999
+13
+43.87516848574824
+23
+-24.972291369346983
+33
+265.9306708043999
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.60374178892644
+20
+-34.189375684489285
+30
+264.48590949428075
+11
+46.17875505980711
+21
+-38.74087578149255
+31
+271.04650702063714
+12
+41.89649348869605
+22
+-39.767632871751815
+32
+268.0392495873865
+13
+41.89649348869605
+23
+-39.767632871751815
+33
+268.0392495873865
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.33302609192341
+20
+-32.47233360525124
+30
+262.9054641360879
+11
+47.60374178892644
+21
+-34.189375684489285
+31
+264.48590949428075
+12
+41.89649348869605
+22
+-39.767632871751815
+32
+268.0392495873865
+13
+41.89649348869605
+23
+-39.767632871751815
+33
+268.0392495873865
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.85353925847732
+20
+-48.289260384424985
+30
+267.7246816373608
+11
+36.44874853601878
+21
+-46.6519250778264
+31
+277.5620793471828
+12
+41.89649348869605
+22
+-39.767632871751815
+32
+268.0392495873865
+13
+41.89649348869605
+23
+-39.767632871751815
+33
+268.0392495873865
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+46.17875505980711
+20
+-38.74087578149255
+30
+271.04650702063714
+11
+45.85353925847732
+21
+-48.289260384424985
+31
+267.7246816373608
+12
+41.89649348869605
+22
+-39.767632871751815
+32
+268.0392495873865
+13
+41.89649348869605
+23
+-39.767632871751815
+33
+268.0392495873865
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.85353925847732
+20
+-48.289260384424985
+30
+267.7246816373608
+11
+56.25220042187524
+21
+-48.51043146727742
+31
+276.31597652001045
+12
+47.86172401486436
+22
+-50.84170245473152
+32
+270.76144882994544
+13
+47.86172401486436
+23
+-50.84170245473152
+33
+270.76144882994544
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+52.84178491573224
+20
+-42.37787756343698
+30
+275.5304693179227
+11
+56.25220042187524
+21
+-48.51043146727742
+31
+276.31597652001045
+12
+45.85353925847732
+22
+-48.289260384424985
+32
+267.7246816373608
+13
+45.85353925847732
+23
+-48.289260384424985
+33
+267.7246816373608
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+52.3242689198089
+20
+-36.61313086615211
+30
+276.0549520508452
+11
+45.85353925847732
+21
+-48.289260384424985
+31
+267.7246816373608
+12
+46.17875505980711
+22
+-38.74087578149255
+32
+271.04650702063714
+13
+46.17875505980711
+23
+-38.74087578149255
+33
+271.04650702063714
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+52.3242689198089
+20
+-36.61313086615211
+30
+276.0549520508452
+11
+52.84178491573224
+21
+-42.37787756343698
+31
+275.5304693179227
+12
+45.85353925847732
+22
+-48.289260384424985
+32
+267.7246816373608
+13
+45.85353925847732
+23
+-48.289260384424985
+33
+267.7246816373608
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+57.8414682854362
+20
+-31.1857689431158
+30
+265.4810272549454
+11
+52.3242689198089
+21
+-36.61313086615211
+31
+276.0549520508452
+12
+46.17875505980711
+22
+-38.74087578149255
+32
+271.04650702063714
+13
+46.17875505980711
+23
+-38.74087578149255
+33
+271.04650702063714
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+57.8414682854362
+20
+-31.1857689431158
+30
+265.4810272549454
+11
+46.17875505980711
+21
+-38.74087578149255
+31
+271.04650702063714
+12
+47.60374178892644
+22
+-34.189375684489285
+32
+264.48590949428075
+13
+47.60374178892644
+23
+-34.189375684489285
+33
+264.48590949428075
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.12891632020645
+20
+-38.71745050861977
+30
+275.9092286001086
+11
+56.25220042187524
+21
+-48.51043146727742
+31
+276.31597652001045
+12
+52.84178491573224
+22
+-42.37787756343698
+32
+275.5304693179227
+13
+52.84178491573224
+23
+-42.37787756343698
+33
+275.5304693179227
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.12891632020645
+20
+-38.71745050861977
+30
+275.9092286001086
+11
+62.33045028405291
+21
+-42.8777181261919
+31
+276.4367535762588
+12
+56.25220042187524
+22
+-48.51043146727742
+32
+276.31597652001045
+13
+56.25220042187524
+23
+-48.51043146727742
+33
+276.31597652001045
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.86730029675407
+20
+-33.103903299883655
+30
+268.0611537386471
+11
+52.84178491573224
+21
+-42.37787756343698
+31
+275.5304693179227
+12
+52.3242689198089
+22
+-36.61313086615211
+32
+276.0549520508452
+13
+52.3242689198089
+23
+-36.61313086615211
+33
+276.0549520508452
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.86730029675407
+20
+-33.103903299883655
+30
+268.0611537386471
+11
+61.12891632020645
+21
+-38.71745050861977
+31
+275.9092286001086
+12
+52.84178491573224
+22
+-42.37787756343698
+32
+275.5304693179227
+13
+52.84178491573224
+23
+-42.37787756343698
+33
+275.5304693179227
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.46540756004524
+20
+-25.331276070533047
+30
+261.46891688269534
+11
+63.86730029675407
+21
+-33.103903299883655
+31
+268.0611537386471
+12
+52.3242689198089
+22
+-36.61313086615211
+32
+276.0549520508452
+13
+52.3242689198089
+23
+-36.61313086615211
+33
+276.0549520508452
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.46540756004524
+20
+-25.331276070533047
+30
+261.46891688269534
+11
+52.3242689198089
+21
+-36.61313086615211
+31
+276.0549520508452
+12
+57.8414682854362
+22
+-31.1857689431158
+32
+265.4810272549454
+13
+57.8414682854362
+23
+-31.1857689431158
+33
+265.4810272549454
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.86730029675407
+20
+-33.103903299883655
+30
+268.0611537386471
+11
+68.52874706410216
+21
+-35.87873335033269
+31
+272.76598289445997
+12
+69.03525013953146
+22
+-40.32223381265477
+32
+272.1192019836758
+13
+69.03525013953146
+23
+-40.32223381265477
+33
+272.1192019836758
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+69.03525013953146
+20
+-40.32223381265477
+30
+272.1192019836758
+11
+61.12891632020645
+21
+-38.71745050861977
+31
+275.9092286001086
+12
+63.86730029675407
+22
+-33.103903299883655
+32
+268.0611537386471
+13
+63.86730029675407
+23
+-33.103903299883655
+33
+268.0611537386471
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.52874706410216
+20
+-35.87873335033269
+30
+272.76598289445997
+11
+72.34919611283847
+21
+-35.98369074178263
+31
+277.1206498544545
+12
+73.86398986211924
+22
+-42.98145862034831
+32
+275.6673702632906
+13
+73.86398986211924
+23
+-42.98145862034831
+33
+275.6673702632906
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.52874706410216
+20
+-35.87873335033269
+30
+272.76598289445997
+11
+73.86398986211924
+21
+-42.98145862034831
+31
+275.6673702632906
+12
+69.03525013953146
+22
+-40.32223381265477
+32
+272.1192019836758
+13
+69.03525013953146
+23
+-40.32223381265477
+33
+272.1192019836758
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.83455423871915
+20
+-35.37980546054849
+30
+278.07621845312326
+11
+79.16973202753113
+21
+-46.62910825359825
+31
+277.0877936275634
+12
+72.34919611283847
+22
+-35.98369074178263
+32
+277.1206498544545
+13
+72.34919611283847
+23
+-35.98369074178263
+33
+277.1206498544545
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.34919611283847
+20
+-35.98369074178263
+30
+277.1206498544545
+11
+79.16973202753113
+21
+-46.62910825359825
+31
+277.0877936275634
+12
+73.86398986211924
+22
+-42.98145862034831
+32
+275.6673702632906
+13
+73.86398986211924
+23
+-42.98145862034831
+33
+275.6673702632906
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.57310081325534
+20
+-20.959268324129074
+30
+276.6253726565492
+11
+75.83455423871915
+21
+-35.37980546054849
+31
+278.07621845312326
+12
+72.34919611283847
+22
+-35.98369074178263
+32
+277.1206498544545
+13
+72.34919611283847
+23
+-35.98369074178263
+33
+277.1206498544545
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.57310081325534
+20
+-20.959268324129074
+30
+276.6253726565492
+11
+72.34919611283847
+21
+-35.98369074178263
+31
+277.1206498544545
+12
+72.04728389465357
+22
+-30.55632881874907
+32
+277.34577585350553
+13
+72.04728389465357
+23
+-30.55632881874907
+33
+277.34577585350553
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.04728389465357
+20
+-30.55632881874907
+30
+277.34577585350553
+11
+68.52874706410216
+21
+-35.87873335033269
+31
+272.76598289445997
+12
+66.95654618506376
+22
+-33.00137970302084
+32
+274.4839376466675
+13
+66.95654618506376
+23
+-33.00137970302084
+33
+274.4839376466675
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.52874706410216
+20
+-35.87873335033269
+30
+272.76598289445997
+11
+72.04728389465357
+21
+-30.55632881874907
+31
+277.34577585350553
+12
+72.34919611283847
+22
+-35.98369074178263
+32
+277.1206498544545
+13
+72.34919611283847
+23
+-35.98369074178263
+33
+277.1206498544545
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+67.49368464982324
+20
+-20.598154052679554
+30
+272.50526264961866
+11
+75.57310081325534
+21
+-20.959268324129074
+31
+276.6253726565492
+12
+70.272317504309
+22
+-23.36963763557469
+32
+275.365883959163
+13
+70.272317504309
+23
+-23.36963763557469
+33
+275.365883959163
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.8047067903857
+20
+-16.119059344559858
+30
+265.47190052525804
+11
+75.57310081325534
+21
+-20.959268324129074
+31
+276.6253726565492
+12
+67.49368464982324
+22
+-20.598154052679554
+32
+272.50526264961866
+13
+67.49368464982324
+23
+-20.598154052679554
+33
+272.50526264961866
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.723670383360584
+20
+-118.59458876600027
+30
+269.09247419373065
+11
+65.65623058352618
+21
+-121.81602012267024
+31
+266.94343357577526
+12
+57.547222520191916
+22
+-124.10469970489949
+32
+264.382473224424
+13
+57.547222520191916
+23
+-124.10469970489949
+33
+264.382473224424
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.65623058352618
+20
+-121.81602012267024
+30
+266.94343357577526
+11
+53.723670383360584
+21
+-118.59458876600027
+31
+269.09247419373065
+12
+62.580400987862575
+22
+-122.47527423069948
+32
+273.0568213472637
+13
+62.580400987862575
+23
+-122.47527423069948
+33
+273.0568213472637
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+50.76326349585836
+20
+-117.57634995678295
+30
+259.23438922994274
+11
+44.77567248194661
+21
+-110.86242337161498
+31
+266.62491070955497
+12
+57.547222520191916
+22
+-124.10469970489949
+32
+264.382473224424
+13
+57.547222520191916
+23
+-124.10469970489949
+33
+264.382473224424
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+57.547222520191916
+20
+-124.10469970489949
+30
+264.382473224424
+11
+44.77567248194661
+21
+-110.86242337161498
+31
+266.62491070955497
+12
+53.723670383360584
+22
+-118.59458876600027
+32
+269.09247419373065
+13
+53.723670383360584
+23
+-118.59458876600027
+33
+269.09247419373065
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.77567248194661
+20
+-110.86242337161498
+30
+266.62491070955497
+11
+40.80645773924373
+21
+-105.05843173665951
+31
+273.0169679609502
+12
+48.16004638603738
+22
+-114.65762180154074
+32
+273.57004778023446
+13
+48.16004638603738
+23
+-114.65762180154074
+33
+273.57004778023446
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.723670383360584
+20
+-118.59458876600027
+30
+269.09247419373065
+11
+44.77567248194661
+21
+-110.86242337161498
+31
+266.62491070955497
+12
+48.16004638603738
+22
+-114.65762180154074
+32
+273.57004778023446
+13
+48.16004638603738
+23
+-114.65762180154074
+33
+273.57004778023446
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.45871468784149
+20
+-106.94857745570455
+30
+263.3669724341209
+11
+33.686087458492544
+21
+-97.68433837049348
+31
+274.9576149176242
+12
+40.80645773924373
+22
+-105.05843173665951
+32
+273.0169679609502
+13
+40.80645773924373
+23
+-105.05843173665951
+33
+273.0169679609502
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.45871468784149
+20
+-106.94857745570455
+30
+263.3669724341209
+11
+40.80645773924373
+21
+-105.05843173665951
+31
+273.0169679609502
+12
+44.77567248194661
+22
+-110.86242337161498
+32
+266.62491070955497
+13
+44.77567248194661
+23
+-110.86242337161498
+33
+266.62491070955497
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.394263081859584
+20
+-103.92793415223925
+30
+258.83981028296347
+11
+34.07184390010727
+21
+-97.13125855120492
+31
+267.6136397594388
+12
+33.686087458492544
+22
+-97.68433837049348
+32
+274.9576149176242
+13
+33.686087458492544
+23
+-97.68433837049348
+33
+274.9576149176242
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.394263081859584
+20
+-103.92793415223925
+30
+258.83981028296347
+11
+33.686087458492544
+21
+-97.68433837049348
+31
+274.9576149176242
+12
+41.45871468784149
+22
+-106.94857745570455
+32
+263.3669724341209
+13
+41.45871468784149
+23
+-106.94857745570455
+33
+263.3669724341209
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.21267046133975
+20
+-99.88570557200534
+30
+253.3774625627812
+11
+32.36484122352983
+21
+-95.29678588327228
+31
+261.9736250346007
+12
+34.07184390010727
+22
+-97.13125855120492
+32
+267.6136397594388
+13
+34.07184390010727
+23
+-97.13125855120492
+33
+267.6136397594388
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.21267046133975
+20
+-99.88570557200534
+30
+253.3774625627812
+11
+34.07184390010727
+21
+-97.13125855120492
+31
+267.6136397594388
+12
+38.394263081859584
+22
+-103.92793415223925
+32
+258.83981028296347
+13
+38.394263081859584
+23
+-103.92793415223925
+33
+258.83981028296347
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.57898584661495
+20
+-96.30346416820805
+30
+248.48036363480728
+11
+29.353628874079927
+21
+-92.49366297078015
+31
+256.1188279376966
+12
+32.36484122352983
+22
+-95.29678588327228
+32
+261.9736250346007
+13
+32.36484122352983
+23
+-95.29678588327228
+33
+261.9736250346007
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.57898584661495
+20
+-96.30346416820805
+30
+248.48036363480728
+11
+32.36484122352983
+21
+-95.29678588327228
+31
+261.9736250346007
+12
+36.21267046133975
+22
+-99.88570557200534
+32
+253.3774625627812
+13
+36.21267046133975
+23
+-99.88570557200534
+33
+253.3774625627812
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.987907287283267
+20
+-94.20735858246191
+30
+245.9121018997042
+11
+30.787133884244398
+21
+-91.20861943025801
+31
+251.43286068991188
+12
+29.353628874079927
+22
+-92.49366297078015
+32
+256.1188279376966
+13
+29.353628874079927
+23
+-92.49366297078015
+33
+256.1188279376966
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.57898584661495
+20
+-96.30346416820805
+30
+248.48036363480728
+11
+31.987907287283267
+21
+-94.20735858246191
+31
+245.9121018997042
+12
+29.353628874079927
+22
+-92.49366297078015
+32
+256.1188279376966
+13
+29.353628874079927
+23
+-92.49366297078015
+33
+256.1188279376966
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.298839195597672
+20
+-81.7110402892717
+30
+249.33675510416876
+11
+29.353628874079927
+21
+-92.49366297078015
+31
+256.1188279376966
+12
+30.787133884244398
+22
+-91.20861943025801
+32
+251.43286068991188
+13
+30.787133884244398
+23
+-91.20861943025801
+33
+251.43286068991188
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.298839195597672
+20
+-81.7110402892717
+30
+249.33675510416876
+11
+30.588171176976264
+21
+-80.08404860965459
+31
+252.5016007367542
+12
+29.353628874079927
+22
+-92.49366297078015
+32
+256.1188279376966
+13
+29.353628874079927
+23
+-92.49366297078015
+33
+256.1188279376966
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.588171176976264
+20
+-80.08404860965459
+30
+252.5016007367542
+11
+29.45858626552872
+21
+-75.589742685386
+31
+257.5867102963687
+12
+26.71448287170792
+22
+-88.598070514254
+32
+260.06948499669505
+13
+26.71448287170792
+23
+-88.598070514254
+33
+260.06948499669505
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.588171176976264
+20
+-80.08404860965459
+30
+252.5016007367542
+11
+26.71448287170792
+21
+-88.598070514254
+31
+260.06948499669505
+12
+29.353628874079927
+22
+-92.49366297078015
+32
+256.1188279376966
+13
+29.353628874079927
+23
+-92.49366297078015
+33
+256.1188279376966
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.45858626552872
+20
+-75.589742685386
+30
+257.5867102963687
+11
+29.736951521110313
+21
+-71.02850741004886
+31
+263.616740603346
+12
+25.75648047845496
+22
+-82.9513628543105
+32
+267.6720508294661
+13
+25.75648047845496
+23
+-82.9513628543105
+33
+267.6720508294661
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.45858626552872
+20
+-75.589742685386
+30
+257.5867102963687
+11
+25.75648047845496
+21
+-82.9513628543105
+31
+267.6720508294661
+12
+26.71448287170792
+22
+-88.598070514254
+32
+260.06948499669505
+13
+26.71448287170792
+23
+-88.598070514254
+33
+260.06948499669505
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.71448287170792
+20
+-88.598070514254
+30
+260.06948499669505
+11
+25.75648047845496
+21
+-82.9513628543105
+31
+267.6720508294661
+12
+22.702372499456402
+22
+-87.31850301155083
+32
+272.04466702451884
+13
+22.702372499456402
+23
+-87.31850301155083
+33
+272.04466702451884
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.71448287170792
+20
+-88.598070514254
+30
+260.06948499669505
+11
+22.702372499456402
+21
+-87.31850301155083
+31
+272.04466702451884
+12
+25.781731097267286
+22
+-91.05224812821899
+32
+265.33287000960945
+13
+25.781731097267286
+23
+-91.05224812821899
+33
+265.33287000960945
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.353628874079927
+20
+-92.49366297078015
+30
+256.1188279376966
+11
+26.71448287170792
+21
+-88.598070514254
+31
+260.06948499669505
+12
+32.36484122352983
+22
+-95.29678588327228
+32
+261.9736250346007
+13
+32.36484122352983
+23
+-95.29678588327228
+33
+261.9736250346007
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.36484122352983
+20
+-95.29678588327228
+30
+261.9736250346007
+11
+26.71448287170792
+21
+-88.598070514254
+31
+260.06948499669505
+12
+25.781731097267286
+22
+-91.05224812821899
+32
+265.33287000960945
+13
+25.781731097267286
+23
+-91.05224812821899
+33
+265.33287000960945
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.781731097267286
+20
+-91.05224812821899
+30
+265.33287000960945
+11
+22.702372499456402
+21
+-87.31850301155083
+31
+272.04466702451884
+12
+22.94940264976487
+22
+-88.92450321288055
+32
+278.0366692911143
+13
+22.94940264976487
+23
+-88.92450321288055
+33
+278.0366692911143
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.781731097267286
+20
+-91.05224812821899
+30
+265.33287000960945
+11
+22.94940264976487
+21
+-88.92450321288055
+31
+278.0366692911143
+12
+25.683162416602322
+22
+-91.12952110627367
+32
+275.0762624036115
+13
+25.683162416602322
+23
+-91.12952110627367
+33
+275.0762624036115
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.36484122352983
+20
+-95.29678588327228
+30
+261.9736250346007
+11
+25.781731097267286
+21
+-91.05224812821899
+31
+265.33287000960945
+12
+25.683162416602322
+22
+-91.12952110627367
+32
+275.0762624036115
+13
+25.683162416602322
+23
+-91.12952110627367
+33
+275.0762624036115
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.07184390010727
+20
+-97.13125855120492
+30
+267.6136397594388
+11
+32.36484122352983
+21
+-95.29678588327228
+31
+261.9736250346007
+12
+25.683162416602322
+22
+-91.12952110627367
+32
+275.0762624036115
+13
+25.683162416602322
+23
+-91.12952110627367
+33
+275.0762624036115
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.07184390010727
+20
+-97.13125855120492
+30
+267.6136397594388
+11
+26.58518753441593
+21
+-92.19248089097715
+31
+281.4217733335795
+12
+33.686087458492544
+22
+-97.68433837049348
+32
+274.9576149176242
+13
+33.686087458492544
+23
+-97.68433837049348
+33
+274.9576149176242
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.07184390010727
+20
+-97.13125855120492
+30
+267.6136397594388
+11
+25.683162416602322
+21
+-91.12952110627367
+31
+275.0762624036115
+12
+26.58518753441593
+22
+-92.19248089097715
+32
+281.4217733335795
+13
+26.58518753441593
+23
+-92.19248089097715
+33
+281.4217733335795
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.805676917782314
+20
+-84.7776214655232
+30
+281.52612227638417
+11
+28.92832327047
+21
+-90.85206852366501
+31
+289.88255598164534
+12
+27.35730886629145
+22
+-92.16692604784348
+32
+288.29541768834525
+13
+27.35730886629145
+23
+-92.16692604784348
+33
+288.29541768834525
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.805676917782314
+20
+-84.7776214655232
+30
+281.52612227638417
+11
+27.35730886629145
+21
+-92.16692604784348
+31
+288.29541768834525
+12
+26.291915287005363
+22
+-87.60173585630378
+32
+282.00831782840186
+13
+26.291915287005363
+23
+-87.60173585630378
+33
+282.00831782840186
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.291915287005363
+20
+-87.60173585630378
+30
+282.00831782840186
+11
+27.35730886629145
+21
+-92.16692604784348
+31
+288.29541768834525
+12
+30.756711451940397
+22
+-95.43307837999998
+32
+284.7128720602254
+13
+30.756711451940397
+23
+-95.43307837999998
+33
+284.7128720602254
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.291915287005363
+20
+-87.60173585630378
+30
+282.00831782840186
+11
+30.756711451940397
+21
+-95.43307837999998
+31
+284.7128720602254
+12
+26.58518753441593
+22
+-92.19248089097715
+32
+281.4217733335795
+13
+26.58518753441593
+23
+-92.19248089097715
+33
+281.4217733335795
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.58518753441593
+20
+-92.19248089097715
+30
+281.4217733335795
+11
+25.683162416602322
+21
+-91.12952110627367
+31
+275.0762624036115
+12
+22.94940264976487
+22
+-88.92450321288055
+32
+278.0366692911143
+13
+22.94940264976487
+23
+-88.92450321288055
+33
+278.0366692911143
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.94940264976487
+20
+-88.92450321288055
+30
+278.0366692911143
+11
+26.291915287005363
+21
+-87.60173585630378
+31
+282.00831782840186
+12
+26.58518753441593
+22
+-92.19248089097715
+32
+281.4217733335795
+13
+26.58518753441593
+23
+-92.19248089097715
+33
+281.4217733335795
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.702372499456402
+20
+-87.31850301155083
+30
+272.04466702451884
+11
+27.56053071408214
+21
+-84.02618738761304
+31
+276.2593907959159
+12
+26.291915287005363
+22
+-87.60173585630378
+32
+282.00831782840186
+13
+26.291915287005363
+23
+-87.60173585630378
+33
+282.00831782840186
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.291915287005363
+20
+-87.60173585630378
+30
+282.00831782840186
+11
+22.94940264976487
+21
+-88.92450321288055
+31
+278.0366692911143
+12
+22.702372499456402
+22
+-87.31850301155083
+32
+272.04466702451884
+13
+22.702372499456402
+23
+-87.31850301155083
+33
+272.04466702451884
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.75648047845496
+20
+-82.9513628543105
+30
+267.6720508294661
+11
+27.31380478809672
+21
+-77.93926713222768
+31
+272.2132072994854
+12
+27.56053071408214
+22
+-84.02618738761304
+32
+276.2593907959159
+13
+27.56053071408214
+23
+-84.02618738761304
+33
+276.2593907959159
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.56053071408214
+20
+-84.02618738761304
+30
+276.2593907959159
+11
+22.702372499456402
+21
+-87.31850301155083
+31
+272.04466702451884
+12
+25.75648047845496
+22
+-82.9513628543105
+32
+267.6720508294661
+13
+25.75648047845496
+23
+-82.9513628543105
+33
+267.6720508294661
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.736951521110313
+20
+-71.02850741004886
+30
+263.616740603346
+11
+30.331710072653514
+21
+-68.07692302791553
+31
+266.72925965236897
+12
+27.31380478809672
+22
+-77.93926713222768
+32
+272.2132072994854
+13
+27.31380478809672
+23
+-77.93926713222768
+33
+272.2132072994854
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.736951521110313
+20
+-71.02850741004886
+30
+263.616740603346
+11
+27.31380478809672
+21
+-77.93926713222768
+31
+272.2132072994854
+12
+25.75648047845496
+22
+-82.9513628543105
+32
+267.6720508294661
+13
+25.75648047845496
+23
+-82.9513628543105
+33
+267.6720508294661
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.73359040338937
+20
+-77.94900231056718
+30
+280.8081528740113
+11
+31.805676917782314
+21
+-84.7776214655232
+31
+281.52612227638417
+12
+26.291915287005363
+22
+-87.60173585630378
+32
+282.00831782840186
+13
+26.291915287005363
+23
+-87.60173585630378
+33
+282.00831782840186
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.56053071408214
+20
+-84.02618738761304
+30
+276.2593907959159
+11
+30.73359040338937
+21
+-77.94900231056718
+31
+280.8081528740113
+12
+26.291915287005363
+22
+-87.60173585630378
+32
+282.00831782840186
+13
+26.291915287005363
+23
+-87.60173585630378
+33
+282.00831782840186
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.56053071408214
+20
+-84.02618738761304
+30
+276.2593907959159
+11
+37.20018261392761
+21
+-63.54580596056047
+31
+276.93781103630033
+12
+30.73359040338937
+22
+-77.94900231056718
+32
+280.8081528740113
+13
+30.73359040338937
+23
+-77.94900231056718
+33
+280.8081528740113
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+76.12612282992072
+20
+-110.43072905722063
+30
+263.9078832804851
+11
+79.30210307272905
+21
+-105.03531068810727
+31
+268.3066627673218
+12
+76.77449787615646
+22
+-111.56122664163806
+32
+267.5102034896014
+13
+76.77449787615646
+23
+-111.56122664163806
+33
+267.5102034896014
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+76.12612282992072
+20
+-110.43072905722063
+30
+263.9078832804851
+11
+78.31576887672004
+21
+-104.57684463328546
+31
+265.62644648133926
+12
+79.30210307272905
+22
+-105.03531068810727
+32
+268.3066627673218
+13
+79.30210307272905
+23
+-105.03531068810727
+33
+268.3066627673218
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.7754143894175
+20
+-115.93262593939801
+30
+260.5166947515568
+11
+76.12612282992072
+21
+-110.43072905722063
+31
+263.9078832804851
+12
+73.13741091140281
+22
+-118.53252700409917
+32
+265.58537619772534
+13
+73.13741091140281
+23
+-118.53252700409917
+33
+265.58537619772534
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+76.12612282992072
+20
+-110.43072905722063
+30
+263.9078832804851
+11
+76.77449787615646
+21
+-111.56122664163806
+31
+267.5102034896014
+12
+73.13741091140281
+22
+-118.53252700409917
+32
+265.58537619772534
+13
+73.13741091140281
+23
+-118.53252700409917
+33
+265.58537619772534
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.85390098551858
+20
+-100.7320576387055
+30
+264.4989911401543
+11
+79.37519905082588
+21
+-99.81177906150988
+31
+265.99547058518834
+12
+78.31576887672004
+22
+-104.57684463328546
+32
+265.62644648133926
+13
+78.31576887672004
+23
+-104.57684463328546
+33
+265.62644648133926
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.31225087404842
+20
+-103.89629482264438
+30
+263.86559609958425
+11
+77.85390098551858
+21
+-100.7320576387055
+31
+264.4989911401543
+12
+78.31576887672004
+22
+-104.57684463328546
+32
+265.62644648133926
+13
+78.31576887672004
+23
+-104.57684463328546
+33
+265.62644648133926
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+74.64928410718245
+20
+-108.59960285684207
+30
+261.1747319622942
+11
+78.31576887672004
+21
+-104.57684463328546
+31
+265.62644648133926
+12
+76.12612282992072
+22
+-110.43072905722063
+32
+263.9078832804851
+13
+76.12612282992072
+23
+-110.43072905722063
+33
+263.9078832804851
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+74.64928410718245
+20
+-108.59960285684207
+30
+261.1747319622942
+11
+77.31225087404842
+21
+-103.89629482264438
+31
+263.86559609958425
+12
+78.31576887672004
+22
+-104.57684463328546
+32
+265.62644648133926
+13
+78.31576887672004
+23
+-104.57684463328546
+33
+265.62644648133926
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+71.59137332414583
+20
+-113.79514584571854
+30
+258.4257609793036
+11
+74.64928410718245
+21
+-108.59960285684207
+31
+261.1747319622942
+12
+72.7754143894175
+22
+-115.93262593939801
+32
+260.5166947515568
+13
+72.7754143894175
+23
+-115.93262593939801
+33
+260.5166947515568
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+72.7754143894175
+20
+-115.93262593939801
+30
+260.5166947515568
+11
+74.64928410718245
+21
+-108.59960285684207
+31
+261.1747319622942
+12
+76.12612282992072
+22
+-110.43072905722063
+32
+263.9078832804851
+13
+76.12612282992072
+23
+-110.43072905722063
+33
+263.9078832804851
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.31225087404842
+20
+-103.89629482264438
+30
+263.86559609958425
+11
+77.04737796719371
+21
+-100.57507788801708
+31
+265.38185012561644
+12
+77.85390098551858
+22
+-100.7320576387055
+32
+264.4989911401543
+13
+77.85390098551858
+23
+-100.7320576387055
+33
+264.4989911401543
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.04737796719371
+20
+-100.57507788801708
+30
+265.38185012561644
+11
+77.31225087404842
+21
+-103.89629482264438
+31
+263.86559609958425
+12
+76.43799231019875
+22
+-103.50932148373775
+32
+264.82207737122206
+13
+76.43799231019875
+23
+-103.50932148373775
+33
+264.82207737122206
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.31225087404842
+20
+-103.89629482264438
+30
+263.86559609958425
+11
+74.64928410718245
+21
+-108.59960285684207
+31
+261.1747319622942
+12
+74.22434357276012
+22
+-108.19407183422982
+32
+261.50603225008496
+13
+74.22434357276012
+23
+-108.19407183422982
+33
+261.50603225008496
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.31225087404842
+20
+-103.89629482264438
+30
+263.86559609958425
+11
+74.22434357276012
+21
+-108.19407183422982
+31
+261.50603225008496
+12
+76.43799231019875
+22
+-103.50932148373775
+32
+264.82207737122206
+13
+76.43799231019875
+23
+-103.50932148373775
+33
+264.82207737122206
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+74.22434357276012
+20
+-108.19407183422982
+30
+261.50603225008496
+11
+71.59137332414583
+21
+-113.79514584571854
+31
+258.4257609793036
+12
+71.06844213527238
+22
+-113.40147957170474
+32
+258.48538894661937
+13
+71.06844213527238
+23
+-113.40147957170474
+33
+258.48538894661937
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+74.22434357276012
+20
+-108.19407183422982
+30
+261.50603225008496
+11
+74.64928410718245
+21
+-108.59960285684207
+31
+261.1747319622942
+12
+71.59137332414583
+22
+-113.79514584571854
+32
+258.4257609793036
+13
+71.59137332414583
+23
+-113.79514584571854
+33
+258.4257609793036
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+71.06844213527238
+20
+-113.40147957170474
+30
+258.48538894661937
+11
+71.36074086484922
+21
+-114.81003818738034
+31
+260.06218361293503
+12
+73.59907132161601
+22
+-109.46207881266106
+32
+263.54950702794423
+13
+73.59907132161601
+23
+-109.46207881266106
+33
+263.54950702794423
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+71.06844213527238
+20
+-113.40147957170474
+30
+258.48538894661937
+11
+73.59907132161601
+21
+-109.46207881266106
+31
+263.54950702794423
+12
+74.22434357276012
+22
+-108.19407183422982
+32
+261.50603225008496
+13
+74.22434357276012
+23
+-108.19407183422982
+33
+261.50603225008496
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+74.22434357276012
+20
+-108.19407183422982
+30
+261.50603225008496
+11
+73.59907132161601
+21
+-109.46207881266106
+31
+263.54950702794423
+12
+76.43799231019875
+22
+-103.50932148373775
+32
+264.82207737122206
+13
+76.43799231019875
+23
+-103.50932148373775
+33
+264.82207737122206
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+73.59907132161601
+20
+-109.46207881266106
+30
+263.54950702794423
+11
+74.16057815465093
+21
+-108.92786090140355
+31
+266.28113722452053
+12
+76.43799231019875
+22
+-103.50932148373775
+32
+264.82207737122206
+13
+76.43799231019875
+23
+-103.50932148373775
+33
+264.82207737122206
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+76.43799231019875
+20
+-103.50932148373775
+30
+264.82207737122206
+11
+72.2535175632424
+21
+-110.99415250349215
+31
+269.3714478979603
+12
+77.04737796719371
+22
+-100.57507788801708
+32
+265.38185012561644
+13
+77.04737796719371
+23
+-100.57507788801708
+33
+265.38185012561644
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+76.43799231019875
+20
+-103.50932148373775
+30
+264.82207737122206
+11
+74.16057815465093
+21
+-108.92786090140355
+31
+266.28113722452053
+12
+72.2535175632424
+22
+-110.99415250349215
+32
+269.3714478979603
+13
+72.2535175632424
+23
+-110.99415250349215
+33
+269.3714478979603
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+71.9089835173996
+20
+-114.04673936087514
+30
+268.38271884807955
+11
+69.1928079164339
+21
+-115.39201931735926
+31
+273.1788153008048
+12
+72.2535175632424
+22
+-110.99415250349215
+32
+269.3714478979603
+13
+72.2535175632424
+23
+-110.99415250349215
+33
+269.3714478979603
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+71.9089835173996
+20
+-114.04673936087514
+30
+268.38271884807955
+11
+69.91077731880827
+21
+-116.36857939431682
+31
+270.04530477349255
+12
+69.1928079164339
+22
+-115.39201931735926
+32
+273.1788153008048
+13
+69.1928079164339
+23
+-115.39201931735926
+33
+273.1788153008048
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+71.36074086484922
+20
+-114.81003818738034
+30
+260.06218361293503
+11
+70.77751241514923
+21
+-117.91312628238941
+31
+263.73873455687294
+12
+71.9089835173996
+22
+-114.04673936087514
+32
+268.38271884807955
+13
+71.9089835173996
+23
+-114.04673936087514
+33
+268.38271884807955
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+71.36074086484922
+20
+-114.81003818738034
+30
+260.06218361293503
+11
+71.9089835173996
+21
+-114.04673936087514
+31
+268.38271884807955
+12
+73.59907132161601
+22
+-109.46207881266106
+32
+263.54950702794423
+13
+73.59907132161601
+23
+-109.46207881266106
+33
+263.54950702794423
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+71.9089835173996
+20
+-114.04673936087514
+30
+268.38271884807955
+11
+68.73263820540357
+21
+-119.11420390975239
+31
+268.48585089358875
+12
+69.91077731880827
+22
+-116.36857939431682
+32
+270.04530477349255
+13
+69.91077731880827
+23
+-116.36857939431682
+33
+270.04530477349255
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.77751241514923
+20
+-117.91312628238941
+30
+263.73873455687294
+11
+68.73263820540357
+21
+-119.11420390975239
+31
+268.48585089358875
+12
+71.9089835173996
+22
+-114.04673936087514
+32
+268.38271884807955
+13
+71.9089835173996
+23
+-114.04673936087514
+33
+268.38271884807955
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+73.59907132161601
+20
+-109.46207881266106
+30
+263.54950702794423
+11
+71.9089835173996
+21
+-114.04673936087514
+31
+268.38271884807955
+12
+74.16057815465093
+22
+-108.92786090140355
+32
+266.28113722452053
+13
+74.16057815465093
+23
+-108.92786090140355
+33
+266.28113722452053
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+74.16057815465093
+20
+-108.92786090140355
+30
+266.28113722452053
+11
+71.9089835173996
+21
+-114.04673936087514
+31
+268.38271884807955
+12
+72.2535175632424
+22
+-110.99415250349215
+32
+269.3714478979603
+13
+72.2535175632424
+23
+-110.99415250349215
+33
+269.3714478979603
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.73263820540357
+20
+-119.11420390975239
+30
+268.48585089358875
+11
+65.65623058352618
+21
+-121.81602012267024
+31
+266.94343357577526
+12
+63.04823715183348
+22
+-121.70254445017906
+32
+277.67433812236516
+13
+63.04823715183348
+23
+-121.70254445017906
+33
+277.67433812236516
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.65623058352618
+20
+-121.81602012267024
+30
+266.94343357577526
+11
+62.580400987862575
+21
+-122.47527423069948
+31
+273.0568213472637
+12
+63.04823715183348
+22
+-121.70254445017906
+32
+277.67433812236516
+13
+63.04823715183348
+23
+-121.70254445017906
+33
+277.67433812236516
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+66.88091601835602
+20
+-117.78413516941802
+30
+254.89919262662278
+11
+67.09898401311108
+21
+-118.00682737388367
+31
+256.2718527721792
+12
+71.06844213527238
+22
+-113.40147957170474
+32
+258.48538894661937
+13
+71.06844213527238
+23
+-113.40147957170474
+33
+258.48538894661937
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+67.09898401311108
+20
+-118.00682737388367
+30
+256.2718527721792
+11
+71.36074086484922
+21
+-114.81003818738034
+31
+260.06218361293503
+12
+71.06844213527238
+22
+-113.40147957170474
+32
+258.48538894661937
+13
+71.06844213527238
+23
+-113.40147957170474
+33
+258.48538894661937
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+57.68193305043402
+20
+-116.28735150006817
+30
+281.7585496591786
+11
+53.31923456831122
+21
+-110.35315185485032
+31
+283.31709086611403
+12
+58.54459154084625
+22
+-114.05008582843327
+32
+286.6310064169878
+13
+58.54459154084625
+23
+-114.05008582843327
+33
+286.6310064169878
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+58.54459154084625
+20
+-114.05008582843327
+30
+286.6310064169878
+11
+53.31923456831122
+21
+-110.35315185485032
+31
+283.31709086611403
+12
+49.026173033732256
+22
+-104.25223728060762
+32
+288.9151226343746
+13
+49.026173033732256
+23
+-104.25223728060762
+33
+288.9151226343746
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+57.68193305043402
+20
+-116.28735150006817
+30
+281.7585496591786
+11
+56.01590939017007
+21
+-118.29949117265369
+31
+277.8401403784229
+12
+51.11290851032824
+22
+-113.6040929708548
+32
+279.6037287790869
+13
+51.11290851032824
+23
+-113.6040929708548
+33
+279.6037287790869
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.31923456831122
+20
+-110.35315185485032
+30
+283.31709086611403
+11
+57.68193305043402
+21
+-116.28735150006817
+31
+281.7585496591786
+12
+51.11290851032824
+22
+-113.6040929708548
+32
+279.6037287790869
+13
+51.11290851032824
+23
+-113.6040929708548
+33
+279.6037287790869
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.04823715183348
+20
+-121.70254445017906
+30
+277.67433812236516
+11
+62.580400987862575
+21
+-122.47527423069948
+31
+273.0568213472637
+12
+56.01590939017007
+22
+-118.29949117265369
+32
+277.8401403784229
+13
+56.01590939017007
+23
+-118.29949117265369
+33
+277.8401403784229
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.04823715183348
+20
+-121.70254445017906
+30
+277.67433812236516
+11
+56.01590939017007
+21
+-118.29949117265369
+31
+277.8401403784229
+12
+57.68193305043402
+22
+-116.28735150006817
+32
+281.7585496591786
+13
+57.68193305043402
+23
+-116.28735150006817
+33
+281.7585496591786
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+78.5724523690229
+20
+-97.24534267234493
+30
+267.89261346366635
+11
+81.40065157978867
+21
+-97.7746929944359
+31
+273.1882462548235
+12
+82.50937582940533
+22
+-92.78450142361085
+32
+273.47604246442074
+13
+82.50937582940533
+23
+-92.78450142361085
+33
+273.47604246442074
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+79.34169482612948
+20
+-92.50370237344346
+30
+267.7325914697486
+11
+78.5724523690229
+21
+-97.24534267234493
+31
+267.89261346366635
+12
+82.50937582940533
+22
+-92.78450142361085
+32
+273.47604246442074
+13
+82.50937582940533
+23
+-92.78450142361085
+33
+273.47604246442074
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+79.34169482612948
+20
+-92.50370237344346
+30
+267.7325914697486
+11
+82.50937582940533
+21
+-92.78450142361085
+31
+273.47604246442074
+12
+83.24806290817882
+22
+-88.51653839568291
+32
+274.2636792367721
+13
+83.24806290817882
+23
+-88.51653839568291
+33
+274.2636792367721
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+79.34169482612948
+20
+-92.50370237344346
+30
+267.7325914697486
+11
+83.24806290817882
+21
+-88.51653839568291
+31
+274.2636792367721
+12
+79.47525538843051
+22
+-85.03073610228905
+32
+268.2923642241441
+13
+79.47525538843051
+23
+-85.03073610228905
+33
+268.2923642241441
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.04737796719371
+20
+-100.57507788801708
+30
+265.38185012561644
+11
+78.5724523690229
+21
+-97.24534267234493
+31
+267.89261346366635
+12
+79.34169482612948
+22
+-92.50370237344346
+32
+267.7325914697486
+13
+79.34169482612948
+23
+-92.50370237344346
+33
+267.7325914697486
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.04737796719371
+20
+-100.57507788801708
+30
+265.38185012561644
+11
+79.34169482612948
+21
+-92.50370237344346
+31
+267.7325914697486
+12
+77.61982774912832
+22
+-92.90801649876312
+32
+265.8028965887058
+13
+77.61982774912832
+23
+-92.90801649876312
+33
+265.8028965887058
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.6986339065748
+20
+-140.65359020530525
+30
+260.1361101234274
+11
+24.48330168653256
+21
+-146.5844433829721
+31
+268.19775045966276
+12
+23.733692954562006
+22
+-145.5172244577461
+32
+261.6952597790061
+13
+23.733692954562006
+23
+-145.5172244577461
+33
+261.6952597790061
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.166516265242816
+20
+-141.11783652226578
+30
+265.3596417500241
+11
+24.48330168653256
+21
+-146.5844433829721
+31
+268.19775045966276
+12
+28.6986339065748
+22
+-140.65359020530525
+32
+260.1361101234274
+13
+28.6986339065748
+23
+-140.65359020530525
+33
+260.1361101234274
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.2123662370167
+20
+-135.09297802878044
+30
+261.30128928067205
+11
+28.6986339065748
+21
+-140.65359020530525
+31
+260.1361101234274
+12
+34.44938628499994
+22
+-135.80547139333922
+32
+257.8325235493698
+13
+34.44938628499994
+23
+-135.80547139333922
+33
+257.8325235493698
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.2123662370167
+20
+-135.09297802878044
+30
+261.30128928067205
+11
+30.166516265242816
+21
+-141.11783652226578
+31
+265.3596417500241
+12
+28.6986339065748
+22
+-140.65359020530525
+32
+260.1361101234274
+13
+28.6986339065748
+23
+-140.65359020530525
+33
+260.1361101234274
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.11828767035973
+20
+-136.25785296170176
+30
+265.821150048077
+11
+30.166516265242816
+21
+-141.11783652226578
+31
+265.3596417500241
+12
+36.2123662370167
+22
+-135.09297802878044
+32
+261.30128928067205
+13
+36.2123662370167
+23
+-135.09297802878044
+33
+261.30128928067205
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.11828767035973
+20
+-136.25785296170176
+30
+265.821150048077
+11
+30.75640722761736
+21
+-142.47406855437956
+31
+271.5737277724388
+12
+30.166516265242816
+22
+-141.11783652226578
+32
+265.3596417500241
+13
+30.166516265242816
+23
+-141.11783652226578
+33
+265.3596417500241
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.652780505606
+20
+-138.97153392321994
+30
+271.05593797462535
+11
+30.75640722761736
+21
+-142.47406855437956
+31
+271.5737277724388
+12
+41.11828767035973
+22
+-136.25785296170176
+32
+265.821150048077
+13
+41.11828767035973
+23
+-136.25785296170176
+33
+265.821150048077
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.652780505606
+20
+-138.97153392321994
+30
+271.05593797462535
+11
+33.919731738587274
+21
+-143.0755200410305
+31
+274.94149102849116
+12
+30.75640722761736
+22
+-142.47406855437956
+32
+271.5737277724388
+13
+30.75640722761736
+23
+-142.47406855437956
+33
+271.5737277724388
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.44938628499994
+20
+-135.80547139333922
+30
+257.8325235493698
+11
+25.761652291946636
+21
+-141.5194126286753
+31
+253.282240349659
+12
+32.81418054865993
+22
+-135.21345086070139
+32
+249.98962050139875
+13
+32.81418054865993
+23
+-135.21345086070139
+33
+249.98962050139875
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.44938628499994
+20
+-135.80547139333922
+30
+257.8325235493698
+11
+28.6986339065748
+21
+-140.65359020530525
+31
+260.1361101234274
+12
+25.761652291946636
+22
+-141.5194126286753
+32
+253.282240349659
+13
+25.761652291946636
+23
+-141.5194126286753
+33
+253.282240349659
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+42.33366384090457
+20
+-131.07113247818927
+30
+252.1998102082854
+11
+32.81418054865993
+21
+-135.21345086070139
+31
+249.98962050139875
+12
+40.6662103263223
+22
+-130.3954502567162
+32
+247.2814155776979
+13
+40.6662103263223
+23
+-130.3954502567162
+33
+247.2814155776979
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+42.33366384090457
+20
+-131.07113247818927
+30
+252.1998102082854
+11
+34.44938628499994
+21
+-135.80547139333922
+31
+257.8325235493698
+12
+32.81418054865993
+22
+-135.21345086070139
+32
+249.98962050139875
+13
+32.81418054865993
+23
+-135.21345086070139
+33
+249.98962050139875
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.66778437521814
+20
+-136.958785801987
+30
+269.89227993899783
+11
+41.11828767035973
+21
+-136.25785296170176
+31
+265.821150048077
+12
+48.720275476915546
+22
+-134.5742755579978
+32
+263.4393778229973
+13
+48.720275476915546
+23
+-134.5742755579978
+33
+263.4393778229973
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.66778437521814
+20
+-136.958785801987
+30
+269.89227993899783
+11
+43.652780505606
+21
+-138.97153392321994
+31
+271.05593797462535
+12
+41.11828767035973
+22
+-136.25785296170176
+32
+265.821150048077
+13
+41.11828767035973
+23
+-136.25785296170176
+33
+265.821150048077
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+48.720275476915546
+20
+-134.5742755579978
+30
+263.4393778229973
+11
+36.2123662370167
+21
+-135.09297802878044
+31
+261.30128928067205
+12
+45.48238558436852
+22
+-132.52927965852132
+32
+257.17874547915744
+13
+45.48238558436852
+23
+-132.52927965852132
+33
+257.17874547915744
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+48.720275476915546
+20
+-134.5742755579978
+30
+263.4393778229973
+11
+41.11828767035973
+21
+-136.25785296170176
+31
+265.821150048077
+12
+36.2123662370167
+22
+-135.09297802878044
+32
+261.30128928067205
+13
+36.2123662370167
+23
+-135.09297802878044
+33
+261.30128928067205
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.48238558436852
+20
+-132.52927965852132
+30
+257.17874547915744
+11
+34.44938628499994
+21
+-135.80547139333922
+31
+257.8325235493698
+12
+42.33366384090457
+22
+-131.07113247818927
+32
+252.1998102082854
+13
+42.33366384090457
+23
+-131.07113247818927
+33
+252.1998102082854
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.48238558436852
+20
+-132.52927965852132
+30
+257.17874547915744
+11
+36.2123662370167
+21
+-135.09297802878044
+31
+261.30128928067205
+12
+34.44938628499994
+22
+-135.80547139333922
+32
+257.8325235493698
+13
+34.44938628499994
+23
+-135.80547139333922
+33
+257.8325235493698
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.48528475511863
+20
+-139.17536421964545
+30
+227.1429822897396
+11
+36.94676375283527
+21
+-133.64973784027015
+31
+228.2202406176259
+12
+35.59205284233815
+22
+-134.71665254117354
+32
+235.79786005590566
+13
+35.59205284233815
+23
+-134.71665254117354
+33
+235.79786005590566
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.48528475511863
+20
+-139.17536421964545
+30
+227.1429822897396
+11
+35.59205284233815
+21
+-134.71665254117354
+31
+235.79786005590566
+12
+31.52609476490855
+22
+-141.20667002458558
+32
+235.40297688459836
+13
+31.52609476490855
+23
+-141.20667002458558
+33
+235.40297688459836
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.52609476490855
+20
+-141.20667002458558
+30
+235.40297688459836
+11
+35.59205284233815
+21
+-134.71665254117354
+31
+235.79786005590566
+12
+33.299418343908705
+22
+-135.8991724848315
+32
+242.22794534767894
+13
+33.299418343908705
+23
+-135.8991724848315
+33
+242.22794534767894
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.52609476490855
+20
+-141.20667002458558
+30
+235.40297688459836
+11
+33.299418343908705
+21
+-135.8991724848315
+31
+242.22794534767894
+12
+26.826437422586647
+22
+-141.89938880815004
+32
+244.3967605466294
+13
+26.826437422586647
+23
+-141.89938880815004
+33
+244.3967605466294
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.299418343908705
+20
+-135.8991724848315
+30
+242.22794534767894
+11
+32.81418054865993
+21
+-135.21345086070139
+31
+249.98962050139875
+12
+26.826437422586647
+22
+-141.89938880815004
+32
+244.3967605466294
+13
+26.826437422586647
+23
+-141.89938880815004
+33
+244.3967605466294
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.81418054865993
+20
+-135.21345086070139
+30
+249.98962050139875
+11
+25.761652291946636
+21
+-141.5194126286753
+31
+253.282240349659
+12
+26.826437422586647
+22
+-141.89938880815004
+32
+244.3967605466294
+13
+26.826437422586647
+23
+-141.89938880815004
+33
+244.3967605466294
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.86307276366422
+20
+-129.23818093187063
+30
+241.9626617379899
+11
+40.6662103263223
+21
+-130.3954502567162
+31
+247.2814155776979
+12
+33.299418343908705
+22
+-135.8991724848315
+32
+242.22794534767894
+13
+33.299418343908705
+23
+-135.8991724848315
+33
+242.22794534767894
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.6662103263223
+20
+-130.3954502567162
+30
+247.2814155776979
+11
+32.81418054865993
+21
+-135.21345086070139
+31
+249.98962050139875
+12
+33.299418343908705
+22
+-135.8991724848315
+32
+242.22794534767894
+13
+33.299418343908705
+23
+-135.8991724848315
+33
+242.22794534767894
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.59205284233815
+20
+-134.71665254117354
+30
+235.79786005590566
+11
+37.75508777915255
+21
+-129.7006019028902
+31
+237.0098897588986
+12
+38.86307276366422
+22
+-129.23818093187063
+32
+241.9626617379899
+13
+38.86307276366422
+23
+-129.23818093187063
+33
+241.9626617379899
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.59205284233815
+20
+-134.71665254117354
+30
+235.79786005590566
+11
+38.86307276366422
+21
+-129.23818093187063
+31
+241.9626617379899
+12
+33.299418343908705
+22
+-135.8991724848315
+32
+242.22794534767894
+13
+33.299418343908705
+23
+-135.8991724848315
+33
+242.22794534767894
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.94676375283527
+20
+-133.64973784027015
+30
+228.2202406176259
+11
+38.9640752389135
+21
+-128.55884801851897
+31
+228.79917950437206
+12
+37.75508777915255
+22
+-129.7006019028902
+32
+237.0098897588986
+13
+37.75508777915255
+23
+-129.7006019028902
+33
+237.0098897588986
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.94676375283527
+20
+-133.64973784027015
+30
+228.2202406176259
+11
+37.75508777915255
+21
+-129.7006019028902
+31
+237.0098897588986
+12
+35.59205284233815
+22
+-134.71665254117354
+32
+235.79786005590566
+13
+35.59205284233815
+23
+-134.71665254117354
+33
+235.79786005590566
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+69.93304653925485
+20
+-124.01647465121756
+30
+263.01620178965135
+11
+73.13741091140281
+21
+-118.53252700409917
+31
+265.58537619772534
+12
+70.96990387703973
+22
+-125.1421046464675
+32
+270.69817017073404
+13
+70.96990387703973
+23
+-125.1421046464675
+33
+270.69817017073404
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+73.13741091140281
+20
+-118.53252700409917
+30
+265.58537619772534
+11
+73.60865438779177
+21
+-119.08986596390984
+31
+271.0322084774336
+12
+70.96990387703973
+22
+-125.1421046464675
+32
+270.69817017073404
+13
+70.96990387703973
+23
+-125.1421046464675
+33
+270.69817017073404
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+67.45258394378047
+20
+-118.93592845644756
+30
+255.2237999793062
+11
+71.59137332414583
+21
+-113.79514584571854
+31
+258.4257609793036
+12
+68.2521767320265
+22
+-120.9565864100797
+32
+257.0591853202059
+13
+68.2521767320265
+23
+-120.9565864100797
+33
+257.0591853202059
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.2521767320265
+20
+-120.9565864100797
+30
+257.0591853202059
+11
+71.59137332414583
+21
+-113.79514584571854
+31
+258.4257609793036
+12
+72.7754143894175
+22
+-115.93262593939801
+32
+260.5166947515568
+13
+72.7754143894175
+23
+-115.93262593939801
+33
+260.5166947515568
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+71.06844213527238
+20
+-113.40147957170474
+30
+258.48538894661937
+11
+67.45258394378047
+21
+-118.93592845644756
+31
+255.2237999793062
+12
+66.88091601835602
+22
+-117.78413516941802
+32
+254.89919262662278
+13
+66.88091601835602
+23
+-117.78413516941802
+33
+254.89919262662278
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+71.06844213527238
+20
+-113.40147957170474
+30
+258.48538894661937
+11
+71.59137332414583
+21
+-113.79514584571854
+31
+258.4257609793036
+12
+67.45258394378047
+22
+-118.93592845644756
+32
+255.2237999793062
+13
+67.45258394378047
+23
+-118.93592845644756
+33
+255.2237999793062
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+69.91077731880827
+20
+-116.36857939431682
+30
+270.04530477349255
+11
+63.04823715183348
+21
+-121.70254445017906
+31
+277.67433812236516
+12
+69.1928079164339
+22
+-115.39201931735926
+32
+273.1788153008048
+13
+69.1928079164339
+23
+-115.39201931735926
+33
+273.1788153008048
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.73263820540357
+20
+-119.11420390975239
+30
+268.48585089358875
+11
+63.04823715183348
+21
+-121.70254445017906
+31
+277.67433812236516
+12
+69.91077731880827
+22
+-116.36857939431682
+32
+270.04530477349255
+13
+69.91077731880827
+23
+-116.36857939431682
+33
+270.04530477349255
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+79.30210307272905
+20
+-105.03531068810727
+30
+268.3066627673218
+11
+81.24657412914189
+21
+-97.62045126265346
+31
+268.6863347224776
+12
+79.60307219551254
+22
+-105.75510543642116
+32
+273.20284902232703
+13
+79.60307219551254
+23
+-105.75510543642116
+33
+273.20284902232703
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+81.24657412914189
+20
+-97.62045126265346
+30
+268.6863347224776
+11
+82.2862881333201
+21
+-97.20457661305868
+31
+272.1906946995755
+12
+79.60307219551254
+22
+-105.75510543642116
+32
+273.20284902232703
+13
+79.60307219551254
+23
+-105.75510543642116
+33
+273.20284902232703
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+79.37519905082588
+20
+-99.81177906150988
+30
+265.99547058518834
+11
+81.24657412914189
+21
+-97.62045126265346
+31
+268.6863347224776
+12
+79.30210307272905
+22
+-105.03531068810727
+32
+268.3066627673218
+13
+79.30210307272905
+23
+-105.03531068810727
+33
+268.3066627673218
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+78.31576887672004
+20
+-104.57684463328546
+30
+265.62644648133926
+11
+79.37519905082588
+21
+-99.81177906150988
+31
+265.99547058518834
+12
+79.30210307272905
+22
+-105.03531068810727
+32
+268.3066627673218
+13
+79.30210307272905
+23
+-105.03531068810727
+33
+268.3066627673218
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+73.13741091140281
+20
+-118.53252700409917
+30
+265.58537619772534
+11
+76.65420453658321
+21
+-112.96370077085386
+31
+272.84660234004576
+12
+73.60865438779177
+22
+-119.08986596390984
+32
+271.0322084774336
+13
+73.60865438779177
+23
+-119.08986596390984
+33
+271.0322084774336
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+73.13741091140281
+20
+-118.53252700409917
+30
+265.58537619772534
+11
+76.77449787615646
+21
+-111.56122664163806
+31
+267.5102034896014
+12
+76.65420453658321
+22
+-112.96370077085386
+32
+272.84660234004576
+13
+76.65420453658321
+23
+-112.96370077085386
+33
+272.84660234004576
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+76.77449787615646
+20
+-111.56122664163806
+30
+267.5102034896014
+11
+79.30210307272905
+21
+-105.03531068810727
+31
+268.3066627673218
+12
+76.65420453658321
+22
+-112.96370077085386
+32
+272.84660234004576
+13
+76.65420453658321
+23
+-112.96370077085386
+33
+272.84660234004576
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+79.30210307272905
+20
+-105.03531068810727
+30
+268.3066627673218
+11
+79.60307219551254
+21
+-105.75510543642116
+31
+273.20284902232703
+12
+76.65420453658321
+22
+-112.96370077085386
+32
+272.84660234004576
+13
+76.65420453658321
+23
+-112.96370077085386
+33
+272.84660234004576
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+62.08780096399621
+20
+-67.30297635010326
+30
+272.4328572607231
+11
+64.38101348863943
+21
+-68.62118034183553
+31
+272.160880715925
+12
+61.03071270872912
+22
+-67.95614597167037
+32
+273.09819585521143
+13
+61.03071270872912
+23
+-67.95614597167037
+33
+273.09819585521143
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.03071270872912
+20
+-67.95614597167037
+30
+273.09819585521143
+11
+60.57166862769407
+21
+-69.95915891456646
+31
+276.0683379210504
+12
+57.699060879821175
+22
+-68.13533409794172
+32
+276.31323850109806
+13
+57.699060879821175
+23
+-68.13533409794172
+33
+276.31323850109806
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+62.54012168749207
+20
+-69.19220939618201
+30
+273.7799625631437
+11
+60.57166862769407
+21
+-69.95915891456646
+31
+276.0683379210504
+12
+61.03071270872912
+22
+-67.95614597167037
+32
+273.09819585521143
+13
+61.03071270872912
+23
+-67.95614597167037
+33
+273.09819585521143
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.341199564434696
+20
+-64.212665676664
+30
+276.4108945087949
+11
+61.03071270872912
+21
+-67.95614597167037
+31
+273.09819585521143
+12
+57.699060879821175
+22
+-68.13533409794172
+32
+276.31323850109806
+13
+57.699060879821175
+23
+-68.13533409794172
+33
+276.31323850109806
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+55.989168072174856
+20
+-64.07941542317188
+30
+274.1036572428596
+11
+61.03071270872912
+21
+-67.95614597167037
+31
+273.09819585521143
+12
+53.341199564434696
+22
+-64.212665676664
+32
+276.4108945087949
+13
+53.341199564434696
+23
+-64.212665676664
+33
+276.4108945087949
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+59.469220525861715
+20
+-61.715592433150896
+30
+273.26521500856194
+11
+62.08780096399621
+21
+-67.30297635010326
+31
+272.4328572607231
+12
+61.03071270872912
+22
+-67.95614597167037
+32
+273.09819585521143
+13
+61.03071270872912
+23
+-67.95614597167037
+33
+273.09819585521143
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+59.469220525861715
+20
+-61.715592433150896
+30
+273.26521500856194
+11
+61.03071270872912
+21
+-67.95614597167037
+31
+273.09819585521143
+12
+55.989168072174856
+22
+-64.07941542317188
+32
+274.1036572428596
+13
+55.989168072174856
+23
+-64.07941542317188
+33
+274.1036572428596
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+57.699060879821175
+20
+-68.13533409794172
+30
+276.31323850109806
+11
+56.07060892345266
+21
+-71.42186945974356
+31
+279.18024852142617
+12
+50.57951200474219
+22
+-68.53873555029342
+32
+278.9383901846101
+13
+50.57951200474219
+23
+-68.53873555029342
+33
+278.9383901846101
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+57.699060879821175
+20
+-68.13533409794172
+30
+276.31323850109806
+11
+60.57166862769407
+21
+-69.95915891456646
+31
+276.0683379210504
+12
+56.07060892345266
+22
+-71.42186945974356
+32
+279.18024852142617
+13
+56.07060892345266
+23
+-71.42186945974356
+33
+279.18024852142617
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.341199564434696
+20
+-64.212665676664
+30
+276.4108945087949
+11
+57.699060879821175
+21
+-68.13533409794172
+31
+276.31323850109806
+12
+46.88455548925988
+22
+-65.36263361775569
+32
+278.45102281910084
+13
+46.88455548925988
+23
+-65.36263361775569
+33
+278.45102281910084
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+46.88455548925988
+20
+-65.36263361775569
+30
+278.45102281910084
+11
+57.699060879821175
+21
+-68.13533409794172
+31
+276.31323850109806
+12
+50.57951200474219
+22
+-68.53873555029342
+32
+278.9383901846101
+13
+50.57951200474219
+23
+-68.53873555029342
+33
+278.9383901846101
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+49.15972751154681
+20
+-59.61157701500667
+30
+274.9840824337385
+11
+46.88455548925988
+21
+-65.36263361775569
+31
+278.45102281910084
+12
+41.781192470263896
+22
+-63.48587376892186
+32
+278.1373675420469
+13
+41.781192470263896
+23
+-63.48587376892186
+33
+278.1373675420469
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+49.15972751154681
+20
+-59.61157701500667
+30
+274.9840824337385
+11
+53.341199564434696
+21
+-64.212665676664
+31
+276.4108945087949
+12
+46.88455548925988
+22
+-65.36263361775569
+32
+278.45102281910084
+13
+46.88455548925988
+23
+-65.36263361775569
+33
+278.45102281910084
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+52.372092983390786
+20
+-55.80116736893026
+30
+273.2703868220549
+11
+55.989168072174856
+21
+-64.07941542317188
+31
+274.1036572428596
+12
+51.17859054167256
+22
+-57.82760558469983
+32
+273.87913969245767
+13
+51.17859054167256
+23
+-57.82760558469983
+33
+273.87913969245767
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+52.372092983390786
+20
+-55.80116736893026
+30
+273.2703868220549
+11
+59.469220525861715
+21
+-61.715592433150896
+31
+273.26521500856194
+12
+55.989168072174856
+22
+-64.07941542317188
+32
+274.1036572428596
+13
+55.989168072174856
+23
+-64.07941542317188
+33
+274.1036572428596
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+51.17859054167256
+20
+-57.82760558469983
+30
+273.87913969245767
+11
+53.341199564434696
+21
+-64.212665676664
+31
+276.4108945087949
+12
+49.15972751154681
+22
+-59.61157701500667
+32
+274.9840824337385
+13
+49.15972751154681
+23
+-59.61157701500667
+33
+274.9840824337385
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+51.17859054167256
+20
+-57.82760558469983
+30
+273.87913969245767
+11
+55.989168072174856
+21
+-64.07941542317188
+31
+274.1036572428596
+12
+53.341199564434696
+22
+-64.212665676664
+32
+276.4108945087949
+13
+53.341199564434696
+23
+-64.212665676664
+33
+276.4108945087949
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+56.25220042187524
+20
+-48.51043146727742
+30
+276.31597652001045
+11
+59.469220525861715
+21
+-61.715592433150896
+31
+273.26521500856194
+12
+52.372092983390786
+22
+-55.80116736893026
+32
+273.2703868220549
+13
+52.372092983390786
+23
+-55.80116736893026
+33
+273.2703868220549
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+56.25220042187524
+20
+-48.51043146727742
+30
+276.31597652001045
+11
+63.51099276960963
+21
+-56.18631536189963
+31
+275.6156521283704
+12
+59.469220525861715
+22
+-61.715592433150896
+32
+273.26521500856194
+13
+59.469220525861715
+23
+-61.715592433150896
+33
+273.26521500856194
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+47.86172401486436
+20
+-50.84170245473152
+30
+270.76144882994544
+11
+52.372092983390786
+21
+-55.80116736893026
+31
+273.2703868220549
+12
+45.281901755485165
+22
+-53.5094455434695
+32
+271.51835894566835
+13
+45.281901755485165
+23
+-53.5094455434695
+33
+271.51835894566835
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+56.25220042187524
+20
+-48.51043146727742
+30
+276.31597652001045
+11
+52.372092983390786
+21
+-55.80116736893026
+31
+273.2703868220549
+12
+47.86172401486436
+22
+-50.84170245473152
+32
+270.76144882994544
+13
+47.86172401486436
+23
+-50.84170245473152
+33
+270.76144882994544
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.635425069025175
+20
+-56.32808389643555
+30
+273.49307902652015
+11
+49.15972751154681
+21
+-59.61157701500667
+31
+274.9840824337385
+12
+43.79637438608084
+22
+-58.62801977861841
+32
+275.0032485660903
+13
+43.79637438608084
+23
+-58.62801977861841
+33
+275.0032485660903
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+44.635425069025175
+20
+-56.32808389643555
+30
+273.49307902652015
+11
+51.17859054167256
+21
+-57.82760558469983
+31
+273.87913969245767
+12
+49.15972751154681
+22
+-59.61157701500667
+32
+274.9840824337385
+13
+49.15972751154681
+23
+-59.61157701500667
+33
+274.9840824337385
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.281901755485165
+20
+-53.5094455434695
+30
+271.51835894566835
+11
+51.17859054167256
+21
+-57.82760558469983
+31
+273.87913969245767
+12
+44.635425069025175
+22
+-56.32808389643555
+32
+273.49307902652015
+13
+44.635425069025175
+23
+-56.32808389643555
+33
+273.49307902652015
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.281901755485165
+20
+-53.5094455434695
+30
+271.51835894566835
+11
+52.372092983390786
+21
+-55.80116736893026
+31
+273.2703868220549
+12
+51.17859054167256
+22
+-57.82760558469983
+32
+273.87913969245767
+13
+51.17859054167256
+23
+-57.82760558469983
+33
+273.87913969245767
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.79637438608084
+20
+-58.62801977861841
+30
+275.0032485660903
+11
+41.781192470263896
+21
+-63.48587376892186
+31
+278.1373675420469
+12
+37.20018261392761
+22
+-63.54580596056047
+32
+276.93781103630033
+13
+37.20018261392761
+23
+-63.54580596056047
+33
+276.93781103630033
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.79637438608084
+20
+-58.62801977861841
+30
+275.0032485660903
+11
+49.15972751154681
+21
+-59.61157701500667
+31
+274.9840824337385
+12
+41.781192470263896
+22
+-63.48587376892186
+32
+278.1373675420469
+13
+41.781192470263896
+23
+-63.48587376892186
+33
+278.1373675420469
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.781192470263896
+20
+-63.48587376892186
+30
+278.1373675420469
+11
+36.85975559644582
+21
+-74.75343002135514
+31
+281.27757100446325
+12
+30.73359040338937
+22
+-77.94900231056718
+32
+280.8081528740113
+13
+30.73359040338937
+23
+-77.94900231056718
+33
+280.8081528740113
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.781192470263896
+20
+-63.48587376892186
+30
+278.1373675420469
+11
+30.73359040338937
+21
+-77.94900231056718
+31
+280.8081528740113
+12
+37.20018261392761
+22
+-63.54580596056047
+32
+276.93781103630033
+13
+37.20018261392761
+23
+-63.54580596056047
+33
+276.93781103630033
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+46.88455548925988
+20
+-65.36263361775569
+30
+278.45102281910084
+11
+40.322132616964055
+21
+-75.41755171855154
+31
+281.51729977101814
+12
+36.85975559644582
+22
+-74.75343002135514
+32
+281.27757100446325
+13
+36.85975559644582
+23
+-74.75343002135514
+33
+281.27757100446325
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.781192470263896
+20
+-63.48587376892186
+30
+278.1373675420469
+11
+46.88455548925988
+21
+-65.36263361775569
+31
+278.45102281910084
+12
+36.85975559644582
+22
+-74.75343002135514
+32
+281.27757100446325
+13
+36.85975559644582
+23
+-74.75343002135514
+33
+281.27757100446325
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.322132616964055
+20
+-75.41755171855154
+30
+281.51729977101814
+11
+38.333113992928546
+21
+-84.0228409200616
+31
+284.0377982874026
+12
+34.636788467992545
+22
+-83.12537916709343
+32
+283.33473587685734
+13
+34.636788467992545
+23
+-83.12537916709343
+33
+283.33473587685734
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.85975559644582
+20
+-74.75343002135514
+30
+281.27757100446325
+11
+40.322132616964055
+21
+-75.41755171855154
+31
+281.51729977101814
+12
+34.636788467992545
+22
+-83.12537916709343
+32
+283.33473587685734
+13
+34.636788467992545
+23
+-83.12537916709343
+33
+283.33473587685734
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.85975559644582
+20
+-74.75343002135514
+30
+281.27757100446325
+11
+34.636788467992545
+21
+-83.12537916709343
+31
+283.33473587685734
+12
+31.805676917782314
+22
+-84.7776214655232
+32
+281.52612227638417
+13
+31.805676917782314
+23
+-84.7776214655232
+33
+281.52612227638417
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+36.85975559644582
+20
+-74.75343002135514
+30
+281.27757100446325
+11
+31.805676917782314
+21
+-84.7776214655232
+31
+281.52612227638417
+12
+30.73359040338937
+22
+-77.94900231056718
+32
+280.8081528740113
+13
+30.73359040338937
+23
+-77.94900231056718
+33
+280.8081528740113
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.636788467992545
+20
+-83.12537916709343
+30
+283.33473587685734
+11
+32.51360691749639
+21
+-90.37169831758496
+31
+290.29995175285626
+12
+28.92832327047
+22
+-90.85206852366501
+32
+289.88255598164534
+13
+28.92832327047
+23
+-90.85206852366501
+33
+289.88255598164534
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.636788467992545
+20
+-83.12537916709343
+30
+283.33473587685734
+11
+28.92832327047
+21
+-90.85206852366501
+31
+289.88255598164534
+12
+31.805676917782314
+22
+-84.7776214655232
+32
+281.52612227638417
+13
+31.805676917782314
+23
+-84.7776214655232
+33
+281.52612227638417
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+38.333113992928546
+20
+-84.0228409200616
+30
+284.0377982874026
+11
+35.757246649748865
+21
+-91.57308016927028
+31
+291.7337609873432
+12
+32.51360691749639
+22
+-90.37169831758496
+32
+290.29995175285626
+13
+32.51360691749639
+23
+-90.37169831758496
+33
+290.29995175285626
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.636788467992545
+20
+-83.12537916709343
+30
+283.33473587685734
+11
+38.333113992928546
+21
+-84.0228409200616
+31
+284.0377982874026
+12
+32.51360691749639
+22
+-90.37169831758496
+32
+290.29995175285626
+13
+32.51360691749639
+23
+-90.37169831758496
+33
+290.29995175285626
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.94987924690327
+20
+-90.15204835635089
+30
+293.4602340205958
+11
+35.757246649748865
+21
+-91.57308016927028
+31
+291.7337609873432
+12
+35.77397898751606
+22
+-96.66670800992969
+32
+294.4456166029207
+13
+35.77397898751606
+23
+-96.66670800992969
+33
+294.4456166029207
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+35.757246649748865
+20
+-91.57308016927028
+30
+291.7337609873432
+11
+31.94987924690327
+21
+-90.15204835635089
+31
+293.4602340205958
+12
+32.51360691749639
+22
+-90.37169831758496
+32
+290.29995175285626
+13
+32.51360691749639
+23
+-90.37169831758496
+33
+290.29995175285626
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.51360691749639
+20
+-90.37169831758496
+30
+290.29995175285626
+11
+31.94987924690327
+21
+-90.15204835635089
+31
+293.4602340205958
+12
+28.273936751610957
+22
+-89.84508601440344
+32
+293.04618471693846
+13
+28.273936751610957
+23
+-89.84508601440344
+33
+293.04618471693846
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.51360691749639
+20
+-90.37169831758496
+30
+290.29995175285626
+11
+28.273936751610957
+21
+-89.84508601440344
+31
+293.04618471693846
+12
+28.92832327047
+22
+-90.85206852366501
+32
+289.88255598164534
+13
+28.92832327047
+23
+-90.85206852366501
+33
+289.88255598164534
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+59.38418982757204
+20
+-134.00050848474453
+30
+264.143048682189
+11
+53.66778437521814
+21
+-136.958785801987
+31
+269.89227993899783
+12
+48.720275476915546
+22
+-134.5742755579978
+32
+263.4393778229973
+13
+48.720275476915546
+23
+-134.5742755579978
+33
+263.4393778229973
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.25523025913265
+20
+-135.54748916740476
+30
+271.1490306174767
+11
+53.66778437521814
+21
+-136.958785801987
+31
+269.89227993899783
+12
+59.38418982757204
+22
+-134.00050848474453
+32
+264.143048682189
+13
+59.38418982757204
+23
+-134.00050848474453
+33
+264.143048682189
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+69.93304653925485
+20
+-124.01647465121756
+30
+263.01620178965135
+11
+67.16925983173333
+21
+-130.70910553377666
+31
+271.40944663800013
+12
+66.47143007954416
+22
+-129.334924266603
+32
+263.6961431516443
+13
+66.47143007954416
+23
+-129.334924266603
+33
+263.6961431516443
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+69.93304653925485
+20
+-124.01647465121756
+30
+263.01620178965135
+11
+70.96990387703973
+21
+-125.1421046464675
+31
+270.69817017073404
+12
+67.16925983173333
+22
+-130.70910553377666
+32
+271.40944663800013
+13
+67.16925983173333
+23
+-130.70910553377666
+33
+271.40944663800013
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.61982774912832
+20
+-92.90801649876312
+30
+265.8028965887058
+11
+79.34169482612948
+21
+-92.50370237344346
+31
+267.7325914697486
+12
+79.47525538843051
+22
+-85.03073610228905
+32
+268.2923642241441
+13
+79.47525538843051
+23
+-85.03073610228905
+33
+268.2923642241441
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.61982774912832
+20
+-92.90801649876312
+30
+265.8028965887058
+11
+79.47525538843051
+21
+-85.03073610228905
+31
+268.2923642241441
+12
+77.89032880595934
+22
+-84.52481105307302
+32
+266.29026395421795
+13
+77.89032880595934
+23
+-84.52481105307302
+33
+266.29026395421795
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+83.3298079837796
+20
+-92.86603354218589
+30
+274.4233970063672
+11
+81.40065157978867
+21
+-97.7746929944359
+31
+273.1882462548235
+12
+82.27004255446977
+22
+-97.30375374237018
+32
+273.9454605948702
+13
+82.27004255446977
+23
+-97.30375374237018
+33
+273.9454605948702
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+81.40065157978867
+20
+-97.7746929944359
+30
+273.1882462548235
+11
+83.3298079837796
+21
+-92.86603354218589
+31
+274.4233970063672
+12
+82.50937582940533
+22
+-92.78450142361085
+32
+273.47604246442074
+13
+82.50937582940533
+23
+-92.78450142361085
+33
+273.47604246442074
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+82.50937582940533
+20
+-92.78450142361085
+30
+273.47604246442074
+11
+83.3298079837796
+21
+-92.86603354218589
+31
+274.4233970063672
+12
+84.27086508223925
+22
+-88.47090474722707
+32
+275.1632705600016
+13
+84.27086508223925
+23
+-88.47090474722707
+33
+275.1632705600016
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+84.27086508223925
+20
+-88.47090474722707
+30
+275.1632705600016
+11
+83.24806290817882
+21
+-88.51653839568291
+31
+274.2636792367721
+12
+82.50937582940533
+22
+-92.78450142361085
+32
+273.47604246442074
+13
+82.50937582940533
+23
+-92.78450142361085
+33
+273.47604246442074
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+82.2862881333201
+20
+-97.20457661305868
+30
+272.1906946995755
+11
+83.47285426047301
+21
+-93.0573906413775
+31
+272.8177010293619
+12
+82.27004255446977
+22
+-97.30375374237018
+32
+273.9454605948702
+13
+82.27004255446977
+23
+-97.30375374237018
+33
+273.9454605948702
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+83.47285426047301
+20
+-93.0573906413775
+30
+272.8177010293619
+11
+83.3298079837796
+21
+-92.86603354218589
+31
+274.4233970063672
+12
+82.27004255446977
+22
+-97.30375374237018
+32
+273.9454605948702
+13
+82.27004255446977
+23
+-97.30375374237018
+33
+273.9454605948702
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+83.47285426047301
+20
+-93.0573906413775
+30
+272.8177010293619
+11
+84.32769418578312
+21
+-88.822892288984
+31
+273.9323789489817
+12
+83.3298079837796
+22
+-92.86603354218589
+32
+274.4233970063672
+13
+83.3298079837796
+23
+-92.86603354218589
+33
+274.4233970063672
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+84.32769418578312
+20
+-88.822892288984
+30
+273.9323789489817
+11
+84.27086508223925
+21
+-88.47090474722707
+31
+275.1632705600016
+12
+83.3298079837796
+22
+-92.86603354218589
+32
+274.4233970063672
+13
+83.3298079837796
+23
+-92.86603354218589
+33
+274.4233970063672
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.71991450916532
+20
+-91.97648162161433
+30
+264.54949237778123
+11
+77.89032880595934
+21
+-84.52481105307302
+31
+266.29026395421795
+12
+78.60089764745146
+22
+-84.93003785136203
+32
+265.3575121797772
+13
+78.60089764745146
+23
+-84.93003785136203
+33
+265.3575121797772
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.71991450916532
+20
+-91.97648162161433
+30
+264.54949237778123
+11
+77.61982774912832
+21
+-92.90801649876312
+31
+265.8028965887058
+12
+77.89032880595934
+22
+-84.52481105307302
+32
+266.29026395421795
+13
+77.89032880595934
+23
+-84.52481105307302
+33
+266.29026395421795
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.85390098551858
+20
+-100.7320576387055
+30
+264.4989911401543
+11
+77.61982774912832
+21
+-92.90801649876312
+31
+265.8028965887058
+12
+77.71991450916532
+22
+-91.97648162161433
+32
+264.54949237778123
+13
+77.71991450916532
+23
+-91.97648162161433
+33
+264.54949237778123
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.85390098551858
+20
+-100.7320576387055
+30
+264.4989911401543
+11
+77.04737796719371
+21
+-100.57507788801708
+31
+265.38185012561644
+12
+77.61982774912832
+22
+-92.90801649876312
+32
+265.8028965887058
+13
+77.61982774912832
+23
+-92.90801649876312
+33
+265.8028965887058
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+78.60089764745146
+20
+-84.93003785136203
+30
+265.3575121797772
+11
+79.87605268057634
+21
+-85.54913434874868
+31
+266.76485389816014
+12
+79.83837449816788
+22
+-93.3047250160073
+32
+266.0815660686101
+13
+79.83837449816788
+23
+-93.3047250160073
+33
+266.0815660686101
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+78.60089764745146
+20
+-84.93003785136203
+30
+265.3575121797772
+11
+79.83837449816788
+21
+-93.3047250160073
+31
+266.0815660686101
+12
+77.71991450916532
+22
+-91.97648162161433
+32
+264.54949237778123
+13
+77.71991450916532
+23
+-91.97648162161433
+33
+264.54949237778123
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.71991450916532
+20
+-91.97648162161433
+30
+264.54949237778123
+11
+79.83837449816788
+21
+-93.3047250160073
+31
+266.0815660686101
+12
+79.37519905082588
+22
+-99.81177906150988
+32
+265.99547058518834
+13
+79.37519905082588
+23
+-99.81177906150988
+33
+265.99547058518834
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.71991450916532
+20
+-91.97648162161433
+30
+264.54949237778123
+11
+79.37519905082588
+21
+-99.81177906150988
+31
+265.99547058518834
+12
+77.85390098551858
+22
+-100.7320576387055
+32
+264.4989911401543
+13
+77.85390098551858
+23
+-100.7320576387055
+33
+264.4989911401543
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+79.87605268057634
+20
+-85.54913434874868
+30
+266.76485389816014
+11
+82.8692427811294
+21
+-87.52050796204884
+31
+269.399740760009
+12
+82.14725761769088
+22
+-92.8310477450348
+32
+268.8834720838088
+13
+82.14725761769088
+23
+-92.8310477450348
+33
+268.8834720838088
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+79.83837449816788
+20
+-93.3047250160073
+30
+266.0815660686101
+11
+79.87605268057634
+21
+-85.54913434874868
+31
+266.76485389816014
+12
+82.14725761769088
+22
+-92.8310477450348
+32
+268.8834720838088
+13
+82.14725761769088
+23
+-92.8310477450348
+33
+268.8834720838088
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+79.83837449816788
+20
+-93.3047250160073
+30
+266.0815660686101
+11
+82.14725761769088
+21
+-92.8310477450348
+31
+268.8834720838088
+12
+81.24657412914189
+22
+-97.62045126265346
+32
+268.6863347224776
+13
+81.24657412914189
+23
+-97.62045126265346
+33
+268.6863347224776
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+79.37519905082588
+20
+-99.81177906150988
+30
+265.99547058518834
+11
+79.83837449816788
+21
+-93.3047250160073
+31
+266.0815660686101
+12
+81.24657412914189
+22
+-97.62045126265346
+32
+268.6863347224776
+13
+81.24657412914189
+23
+-97.62045126265346
+33
+268.6863347224776
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+81.24657412914189
+20
+-97.62045126265346
+30
+268.6863347224776
+11
+82.14725761769088
+21
+-92.8310477450348
+31
+268.8834720838088
+12
+82.2862881333201
+22
+-97.20457661305868
+32
+272.1906946995755
+13
+82.2862881333201
+23
+-97.20457661305868
+33
+272.1906946995755
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+82.14725761769088
+20
+-92.8310477450348
+30
+268.8834720838088
+11
+83.47285426047301
+21
+-93.0573906413775
+31
+272.8177010293619
+12
+82.2862881333201
+22
+-97.20457661305868
+32
+272.1906946995755
+13
+82.2862881333201
+23
+-97.20457661305868
+33
+272.1906946995755
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+82.14725761769088
+20
+-92.8310477450348
+30
+268.8834720838088
+11
+82.8692427811294
+21
+-87.52050796204884
+31
+269.399740760009
+12
+83.47285426047301
+22
+-93.0573906413775
+32
+272.8177010293619
+13
+83.47285426047301
+23
+-93.0573906413775
+33
+272.8177010293619
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+82.8692427811294
+20
+-87.52050796204884
+30
+269.399740760009
+11
+84.32769418578312
+21
+-88.822892288984
+31
+273.9323789489817
+12
+83.47285426047301
+22
+-93.0573906413775
+32
+272.8177010293619
+13
+83.47285426047301
+23
+-93.0573906413775
+33
+272.8177010293619
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+78.51440241327066
+20
+-72.95242202895504
+30
+268.5816815553583
+11
+77.89032880595934
+21
+-84.52481105307302
+31
+266.29026395421795
+12
+76.7299229283447
+22
+-73.25512523038003
+32
+269.13719516922924
+13
+76.7299229283447
+23
+-73.25512523038003
+33
+269.13719516922924
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+78.60089764745146
+20
+-84.93003785136203
+30
+265.3575121797772
+11
+77.89032880595934
+21
+-84.52481105307302
+31
+266.29026395421795
+12
+78.51440241327066
+22
+-72.95242202895504
+32
+268.5816815553583
+13
+78.51440241327066
+23
+-72.95242202895504
+33
+268.5816815553583
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.39585059592255
+20
+-70.04373327636992
+30
+269.5710190538851
+11
+78.51440241327066
+21
+-72.95242202895504
+31
+268.5816815553583
+12
+74.24113675539193
+22
+-71.93965925755526
+32
+269.8740264796325
+13
+74.24113675539193
+23
+-71.93965925755526
+33
+269.8740264796325
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+74.24113675539193
+20
+-71.93965925755526
+30
+269.8740264796325
+11
+78.51440241327066
+21
+-72.95242202895504
+31
+268.5816815553583
+12
+76.7299229283447
+22
+-73.25512523038003
+32
+269.13719516922924
+13
+76.7299229283447
+23
+-73.25512523038003
+33
+269.13719516922924
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+71.82437873316219
+20
+-66.85880883846455
+30
+271.19861918214997
+11
+75.39585059592255
+21
+-70.04373327636992
+31
+269.5710190538851
+12
+70.30785090524014
+22
+-68.95582709717932
+32
+271.3616834192988
+13
+70.30785090524014
+23
+-68.95582709717932
+33
+271.3616834192988
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.30785090524014
+20
+-68.95582709717932
+30
+271.3616834192988
+11
+75.39585059592255
+21
+-70.04373327636992
+31
+269.5710190538851
+12
+74.24113675539193
+22
+-71.93965925755526
+32
+269.8740264796325
+13
+74.24113675539193
+23
+-71.93965925755526
+33
+269.8740264796325
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.82708296334545
+20
+-63.24066896455007
+30
+272.13928078899045
+11
+70.30785090524014
+21
+-68.95582709717932
+31
+271.3616834192988
+12
+64.38101348863943
+22
+-68.62118034183553
+32
+272.160880715925
+13
+64.38101348863943
+23
+-68.62118034183553
+33
+272.160880715925
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+65.82708296334545
+20
+-63.24066896455007
+30
+272.13928078899045
+11
+71.82437873316219
+21
+-66.85880883846455
+31
+271.19861918214997
+12
+70.30785090524014
+22
+-68.95582709717932
+32
+271.3616834192988
+13
+70.30785090524014
+23
+-68.95582709717932
+33
+271.3616834192988
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+78.51440241327066
+20
+-72.95242202895504
+30
+268.5816815553583
+11
+80.82658332445543
+21
+-73.85870628729135
+31
+269.0666151262838
+12
+78.60089764745146
+22
+-84.93003785136203
+32
+265.3575121797772
+13
+78.60089764745146
+23
+-84.93003785136203
+33
+265.3575121797772
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+78.60089764745146
+20
+-84.93003785136203
+30
+265.3575121797772
+11
+80.82658332445543
+21
+-73.85870628729135
+31
+269.0666151262838
+12
+79.87605268057634
+22
+-85.54913434874868
+32
+266.76485389816014
+13
+79.87605268057634
+23
+-85.54913434874868
+33
+266.76485389816014
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+79.84194913396354
+20
+-68.26249986497068
+30
+269.4484166517004
+11
+78.51440241327066
+21
+-72.95242202895504
+31
+268.5816815553583
+12
+75.39585059592255
+22
+-70.04373327636992
+32
+269.5710190538851
+13
+75.39585059592255
+23
+-70.04373327636992
+33
+269.5710190538851
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+79.84194913396354
+20
+-68.26249986497068
+30
+269.4484166517004
+11
+80.82658332445543
+21
+-73.85870628729135
+31
+269.0666151262838
+12
+78.51440241327066
+22
+-72.95242202895504
+32
+268.5816815553583
+13
+78.51440241327066
+23
+-72.95242202895504
+33
+268.5816815553583
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.30257958281905
+20
+-63.094641289490255
+30
+269.6312554698488
+11
+75.39585059592255
+21
+-70.04373327636992
+31
+269.5710190538851
+12
+71.82437873316219
+22
+-66.85880883846455
+32
+271.19861918214997
+13
+71.82437873316219
+23
+-66.85880883846455
+33
+271.19861918214997
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.30257958281905
+20
+-63.094641289490255
+30
+269.6312554698488
+11
+79.84194913396354
+21
+-68.26249986497068
+31
+269.4484166517004
+12
+75.39585059592255
+22
+-70.04373327636992
+32
+269.5710190538851
+13
+75.39585059592255
+23
+-70.04373327636992
+33
+269.5710190538851
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.33529193917828
+20
+-55.87448543078301
+30
+274.0099561513654
+11
+77.30257958281905
+21
+-63.094641289490255
+31
+269.6312554698488
+12
+65.82708296334545
+22
+-63.24066896455007
+32
+272.13928078899045
+13
+65.82708296334545
+23
+-63.24066896455007
+33
+272.13928078899045
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.30257958281905
+20
+-63.094641289490255
+30
+269.6312554698488
+11
+71.82437873316219
+21
+-66.85880883846455
+31
+271.19861918214997
+12
+65.82708296334545
+22
+-63.24066896455007
+32
+272.13928078899045
+13
+65.82708296334545
+23
+-63.24066896455007
+33
+272.13928078899045
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.51099276960963
+20
+-56.18631536189963
+30
+275.6156521283704
+11
+65.82708296334545
+21
+-63.24066896455007
+31
+272.13928078899045
+12
+59.469220525861715
+22
+-61.715592433150896
+32
+273.26521500856194
+13
+59.469220525861715
+23
+-61.715592433150896
+33
+273.26521500856194
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.33529193917828
+20
+-55.87448543078301
+30
+274.0099561513654
+11
+65.82708296334545
+21
+-63.24066896455007
+31
+272.13928078899045
+12
+63.51099276960963
+22
+-56.18631536189963
+32
+275.6156521283704
+13
+63.51099276960963
+23
+-56.18631536189963
+33
+275.6156521283704
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+59.469220525861715
+20
+-61.715592433150896
+30
+273.26521500856194
+11
+64.38101348863943
+21
+-68.62118034183553
+31
+272.160880715925
+12
+62.08780096399621
+22
+-67.30297635010326
+32
+272.4328572607231
+13
+62.08780096399621
+23
+-67.30297635010326
+33
+272.4328572607231
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+59.469220525861715
+20
+-61.715592433150896
+30
+273.26521500856194
+11
+65.82708296334545
+21
+-63.24066896455007
+31
+272.13928078899045
+12
+64.38101348863943
+22
+-68.62118034183553
+32
+272.160880715925
+13
+64.38101348863943
+23
+-68.62118034183553
+33
+272.160880715925
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.38101348863943
+20
+-68.62118034183553
+30
+272.160880715925
+11
+62.54012168749207
+21
+-69.19220939618201
+31
+273.7799625631437
+12
+61.03071270872912
+22
+-67.95614597167037
+32
+273.09819585521143
+13
+61.03071270872912
+23
+-67.95614597167037
+33
+273.09819585521143
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+23.17574554610665
+20
+20.34192154746638
+30
+244.84123228263292
+11
+32.26688099151096
+21
+8.102672807242747
+31
+250.3251799297488
+12
+18.217801753523784
+22
+12.897552362678766
+32
+240.3012927099048
+13
+18.217801753523784
+23
+12.897552362678766
+33
+240.3012927099048
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+11.011944437998359
+20
+26.396594024608785
+30
+243.5662281447736
+11
+18.217801753523784
+21
+12.897552362678766
+31
+240.3012927099048
+12
+8.423603897574033
+22
+17.853366585001176
+32
+237.17873425822356
+13
+8.423603897574033
+23
+17.853366585001176
+33
+237.17873425822356
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+11.011944437998359
+20
+26.396594024608785
+30
+243.5662281447736
+11
+23.17574554610665
+21
+20.34192154746638
+31
+244.84123228263292
+12
+18.217801753523784
+22
+12.897552362678766
+32
+240.3012927099048
+13
+18.217801753523784
+23
+12.897552362678766
+33
+240.3012927099048
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+11.011944437998359
+20
+26.396594024608785
+30
+243.5662281447736
+11
+8.423603897574033
+21
+17.853366585001176
+31
+237.17873425822356
+12
+0.020623870886214313
+22
+22.55424082461445
+32
+240.08711878648745
+13
+0.020623870886214313
+23
+22.55424082461445
+33
+240.08711878648745
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+11.309171601608414
+20
+35.146694003884136
+30
+247.92454579664712
+11
+23.17574554610665
+21
+20.34192154746638
+31
+244.84123228263292
+12
+11.011944437998359
+22
+26.396594024608785
+32
+243.5662281447736
+13
+11.011944437998359
+23
+26.396594024608785
+33
+243.5662281447736
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+11.309171601608414
+20
+35.146694003884136
+30
+247.92454579664712
+11
+27.60494746524601
+21
+31.59791727562364
+31
+243.50477483152105
+12
+23.17574554610665
+22
+20.34192154746638
+32
+244.84123228263292
+13
+23.17574554610665
+23
+20.34192154746638
+33
+244.84123228263292
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+11.97724821500427
+20
+55.13666582219602
+30
+249.42224213897822
+11
+27.60494746524601
+21
+31.59791727562364
+31
+243.50477483152105
+12
+11.309171601608414
+22
+35.146694003884136
+32
+247.92454579664712
+13
+11.309171601608414
+23
+35.146694003884136
+33
+247.92454579664712
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+11.97724821500427
+20
+55.13666582219602
+30
+249.42224213897822
+11
+28.684335363391913
+21
+51.22799171977902
+31
+246.80743408244842
+12
+27.60494746524601
+22
+31.59791727562364
+32
+243.50477483152105
+13
+27.60494746524601
+23
+31.59791727562364
+33
+243.50477483152105
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+60.98750800290071
+30
+251.72643716168466
+11
+11.309171601608414
+21
+35.146694003884136
+31
+247.92454579664712
+12
+0.020623870886214313
+22
+38.13478530478291
+32
+248.525997283298
+13
+0.020623870886214313
+23
+38.13478530478291
+33
+248.525997283298
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+60.98750800290071
+30
+251.72643716168466
+11
+11.97724821500427
+21
+55.13666582219602
+31
+249.42224213897822
+12
+11.309171601608414
+22
+35.146694003884136
+32
+247.92454579664712
+13
+11.309171601608414
+23
+35.146694003884136
+33
+247.92454579664712
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+38.13478530478291
+30
+248.525997283298
+11
+11.011944437998359
+21
+26.396594024608785
+31
+243.5662281447736
+12
+0.020623870886214313
+22
+22.55424082461445
+32
+240.08711878648745
+13
+0.020623870886214313
+23
+22.55424082461445
+33
+240.08711878648745
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+38.13478530478291
+30
+248.525997283298
+11
+11.309171601608414
+21
+35.146694003884136
+31
+247.92454579664712
+12
+11.011944437998359
+22
+26.396594024608785
+32
+243.5662281447736
+13
+11.011944437998359
+23
+26.396594024608785
+33
+243.5662281447736
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+51.108284300618024
+20
+50.16624883236822
+30
+251.72065689954408
+11
+61.41455253710869
+21
+28.21524702773882
+31
+254.57397682533062
+12
+52.060080517680966
+22
+31.67519025367467
+32
+247.96135693973406
+13
+52.060080517680966
+23
+31.67519025367467
+33
+247.96135693973406
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+51.108284300618024
+20
+50.16624883236822
+30
+251.72065689954408
+11
+60.6309619482546
+21
+39.40309650753487
+31
+255.32845314647267
+12
+61.41455253710869
+22
+28.21524702773882
+32
+254.57397682533062
+13
+61.41455253710869
+23
+28.21524702773882
+33
+254.57397682533062
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.48639910123813
+20
+51.44855435398247
+30
+247.89899095351592
+11
+52.060080517680966
+21
+31.67519025367467
+31
+247.96135693973406
+12
+43.781467394251926
+22
+37.200512408728045
+32
+244.38763381698467
+13
+43.781467394251926
+23
+37.200512408728045
+33
+244.38763381698467
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+41.48639910123813
+20
+51.44855435398247
+30
+247.89899095351592
+11
+51.108284300618024
+21
+50.16624883236822
+31
+251.72065689954408
+12
+52.060080517680966
+22
+31.67519025367467
+32
+247.96135693973406
+13
+52.060080517680966
+23
+31.67519025367467
+33
+247.96135693973406
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.228654707175466
+20
+-149.9768488092036
+30
+316.44164360734504
+11
+0.020623870886214313
+21
+-151.98442511694574
+31
+321.0725462526594
+12
+0.020623870886214313
+22
+-150.16759745974977
+32
+316.3129567186991
+13
+0.020623870886214313
+23
+-150.16759745974977
+33
+316.3129567186991
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.004701654915481
+20
+-152.18947231067506
+30
+322.4877978034414
+11
+0.020623870886214313
+21
+-151.98442511694574
+31
+321.0725462526594
+12
+4.228654707175466
+22
+-149.9768488092036
+32
+316.44164360734504
+13
+4.228654707175466
+23
+-149.9768488092036
+33
+316.44164360734504
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.466268553637254
+20
+-151.5186576783694
+30
+313.04771705951043
+11
+0.020623870886214313
+21
+-150.16759745974977
+31
+316.3129567186991
+12
+0.020623870886214313
+22
+-151.140811069154
+32
+314.0647389714332
+13
+0.020623870886214313
+23
+-151.140811069154
+33
+314.0647389714332
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.228654707175466
+20
+-149.9768488092036
+30
+316.44164360734504
+11
+0.020623870886214313
+21
+-150.16759745974977
+31
+316.3129567186991
+12
+3.466268553637254
+22
+-151.5186576783694
+32
+313.04771705951043
+13
+3.466268553637254
+23
+-151.5186576783694
+33
+313.04771705951043
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.445885523993568
+20
+-154.33699180701106
+30
+309.56130631747135
+11
+0.020623870886214313
+21
+-151.140811069154
+31
+314.0647389714332
+12
+0.020623870886214313
+22
+-154.31204541252188
+32
+309.88256720260154
+13
+0.020623870886214313
+23
+-154.31204541252188
+33
+309.88256720260154
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.466268553637254
+20
+-151.5186576783694
+30
+313.04771705951043
+11
+0.020623870886214313
+21
+-151.140811069154
+31
+314.0647389714332
+12
+3.445885523993568
+22
+-154.33699180701106
+32
+309.56130631747135
+13
+3.445885523993568
+23
+-154.33699180701106
+33
+309.56130631747135
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-154.31204541252188
+30
+309.88256720260154
+11
+0.020623870886214313
+21
+-159.05916174923726
+31
+306.5975529624144
+12
+3.640284866416135
+22
+-158.48174398410717
+32
+306.32740176355503
+13
+3.640284866416135
+23
+-158.48174398410717
+33
+306.32740176355503
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-154.31204541252188
+30
+309.88256720260154
+11
+3.640284866416135
+21
+-158.48174398410717
+31
+306.32740176355503
+12
+3.445885523993568
+22
+-154.33699180701106
+32
+309.56130631747135
+13
+3.445885523993568
+23
+-154.33699180701106
+33
+309.56130631747135
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.020623870886214313
+20
+-159.05916174923726
+30
+306.5975529624144
+11
+0.020623870886214313
+21
+-163.7540427696865
+31
+303.1546462985695
+12
+4.421837152305891
+22
+-163.7231031560331
+32
+302.2343677213732
+13
+4.421837152305891
+23
+-163.7231031560331
+33
+302.2343677213732
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.640284866416135
+20
+-158.48174398410717
+30
+306.32740176355503
+11
+0.020623870886214313
+21
+-159.05916174923726
+31
+306.5975529624144
+12
+4.421837152305891
+22
+-163.7231031560331
+32
+302.2343677213732
+13
+4.421837152305891
+23
+-163.7231031560331
+33
+302.2343677213732
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+9.084074902893873
+20
+-162.75609572281695
+30
+297.649707173161
+11
+8.977900614152917
+21
+-157.49849097204088
+31
+301.85195774731386
+12
+4.421837152305891
+22
+-163.7231031560331
+32
+302.2343677213732
+13
+4.421837152305891
+23
+-163.7231031560331
+33
+302.2343677213732
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.977900614152917
+20
+-157.49849097204088
+30
+301.85195774731386
+11
+3.640284866416135
+21
+-158.48174398410717
+31
+306.32740176355503
+12
+4.421837152305891
+22
+-163.7231031560331
+32
+302.2343677213732
+13
+4.421837152305891
+23
+-163.7231031560331
+33
+302.2343677213732
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.88054883078012
+20
+-152.82256312691675
+30
+304.8528264697816
+11
+3.640284866416135
+21
+-158.48174398410717
+31
+306.32740176355503
+12
+8.977900614152917
+22
+-157.49849097204088
+32
+301.85195774731386
+13
+8.977900614152917
+23
+-157.49849097204088
+33
+301.85195774731386
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.88054883078012
+20
+-152.82256312691675
+30
+304.8528264697816
+11
+3.445885523993568
+21
+-154.33699180701106
+31
+309.56130631747135
+12
+3.640284866416135
+22
+-158.48174398410717
+32
+306.32740176355503
+13
+3.640284866416135
+23
+-158.48174398410717
+33
+306.32740176355503
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.88054883078012
+20
+-152.82256312691675
+30
+304.8528264697816
+11
+8.7533830637494
+21
+-148.74595719818163
+31
+307.73778572517097
+12
+3.445885523993568
+22
+-154.33699180701106
+32
+309.56130631747135
+13
+3.445885523993568
+23
+-154.33699180701106
+33
+309.56130631747135
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.7533830637494
+20
+-148.74595719818163
+30
+307.73778572517097
+11
+3.466268553637254
+21
+-151.5186576783694
+31
+313.04771705951043
+12
+3.445885523993568
+22
+-154.33699180701106
+32
+309.56130631747135
+13
+3.445885523993568
+23
+-154.33699180701106
+33
+309.56130631747135
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.001615461182505
+20
+-146.83421155219946
+30
+312.77999965523645
+11
+3.466268553637254
+21
+-151.5186576783694
+31
+313.04771705951043
+12
+8.7533830637494
+22
+-148.74595719818163
+32
+307.73778572517097
+13
+8.7533830637494
+23
+-148.74595719818163
+33
+307.73778572517097
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.001615461182505
+20
+-146.83421155219946
+30
+312.77999965523645
+11
+4.228654707175466
+21
+-149.9768488092036
+31
+316.44164360734504
+12
+3.466268553637254
+22
+-151.5186576783694
+32
+313.04771705951043
+13
+3.466268553637254
+23
+-151.5186576783694
+33
+313.04771705951043
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.590854024408427
+20
+-145.02559795172385
+30
+301.92618848213885
+11
+14.767289481604097
+21
+-141.62741226336811
+31
+306.05329564850035
+12
+8.7533830637494
+22
+-148.74595719818163
+32
+307.73778572517097
+13
+8.7533830637494
+23
+-148.74595719818163
+33
+307.73778572517097
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.767289481604097
+20
+-141.62741226336811
+30
+306.05329564850035
+11
+10.001615461182505
+21
+-146.83421155219946
+31
+312.77999965523645
+12
+8.7533830637494
+22
+-148.74595719818163
+32
+307.73778572517097
+13
+8.7533830637494
+23
+-148.74595719818163
+33
+307.73778572517097
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.160376607306807
+20
+-148.7885486034047
+30
+298.4254791969166
+11
+13.590854024408427
+21
+-145.02559795172385
+31
+301.92618848213885
+12
+8.88054883078012
+22
+-152.82256312691675
+32
+304.8528264697816
+13
+8.88054883078012
+23
+-152.82256312691675
+33
+304.8528264697816
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.590854024408427
+20
+-145.02559795172385
+30
+301.92618848213885
+11
+8.7533830637494
+21
+-148.74595719818163
+31
+307.73778572517097
+12
+8.88054883078012
+22
+-152.82256312691675
+32
+304.8528264697816
+13
+8.88054883078012
+23
+-152.82256312691675
+33
+304.8528264697816
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.78190689927755
+20
+-151.89285359570368
+30
+293.8971001484653
+11
+13.160376607306807
+21
+-148.7885486034047
+31
+298.4254791969166
+12
+8.977900614152917
+22
+-157.49849097204088
+32
+301.85195774731386
+13
+8.977900614152917
+23
+-157.49849097204088
+33
+301.85195774731386
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.160376607306807
+20
+-148.7885486034047
+30
+298.4254791969166
+11
+8.88054883078012
+21
+-152.82256312691675
+31
+304.8528264697816
+12
+8.977900614152917
+22
+-157.49849097204088
+32
+301.85195774731386
+13
+8.977900614152917
+23
+-157.49849097204088
+33
+301.85195774731386
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.10226976160619
+20
+-157.48997269099246
+30
+289.3675042027214
+11
+13.78190689927755
+21
+-151.89285359570368
+31
+293.8971001484653
+12
+9.084074902893873
+22
+-162.75609572281695
+32
+297.649707173161
+13
+9.084074902893873
+23
+-162.75609572281695
+33
+297.649707173161
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.78190689927755
+20
+-151.89285359570368
+30
+293.8971001484653
+11
+8.977900614152917
+21
+-157.49849097204088
+31
+301.85195774731386
+12
+9.084074902893873
+22
+-162.75609572281695
+32
+297.649707173161
+13
+9.084074902893873
+23
+-162.75609572281695
+33
+297.649707173161
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.811706232767941
+20
+-149.68205544017877
+30
+320.12549593503644
+11
+10.001615461182505
+21
+-146.83421155219946
+31
+312.77999965523645
+12
+14.767289481604097
+22
+-141.62741226336811
+32
+306.05329564850035
+13
+14.767289481604097
+23
+-141.62741226336811
+33
+306.05329564850035
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.767289481604097
+20
+-141.62741226336811
+30
+306.05329564850035
+11
+17.610570004735937
+21
+-142.80415194488927
+31
+315.52501572202743
+12
+14.811706232767941
+22
+-149.68205544017877
+32
+320.12549593503644
+13
+14.811706232767941
+23
+-149.68205544017877
+33
+320.12549593503644
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.001615461182505
+20
+-146.83421155219946
+30
+312.77999965523645
+11
+7.004701654915481
+21
+-152.18947231067506
+31
+322.4877978034414
+12
+4.228654707175466
+22
+-149.9768488092036
+32
+316.44164360734504
+13
+4.228654707175466
+23
+-149.9768488092036
+33
+316.44164360734504
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.811706232767941
+20
+-149.68205544017877
+30
+320.12549593503644
+11
+7.004701654915481
+21
+-152.18947231067506
+31
+322.4877978034414
+12
+10.001615461182505
+22
+-146.83421155219946
+32
+312.77999965523645
+13
+10.001615461182505
+23
+-146.83421155219946
+33
+312.77999965523645
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.8047067903857
+20
+-16.119059344559858
+30
+265.47190052525804
+11
+78.89549509601319
+21
+-12.224988009648744
+31
+268.8925988135208
+12
+75.57310081325534
+22
+-20.959268324129074
+32
+276.6253726565492
+13
+75.57310081325534
+23
+-20.959268324129074
+33
+276.6253726565492
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+78.89549509601319
+20
+-12.224988009648744
+30
+268.8925988135208
+11
+80.01915371764788
+21
+-20.612148371540492
+31
+276.76744541540904
+12
+75.57310081325534
+22
+-20.959268324129074
+32
+276.6253726565492
+13
+75.57310081325534
+23
+-20.959268324129074
+33
+276.6253726565492
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.3932705366631
+20
+-2.8536619627218207
+30
+257.6597241339173
+11
+82.60359410225082
+21
+2.972538047816262
+31
+261.91643086189447
+12
+78.89549509601319
+22
+-12.224988009648744
+32
+268.8925988135208
+13
+78.89549509601319
+23
+-12.224988009648744
+33
+268.8925988135208
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+82.60359410225082
+20
+2.972538047816262
+30
+261.91643086189447
+11
+82.87103770463536
+21
+-8.8830838210554
+31
+272.45719520658133
+12
+78.89549509601319
+22
+-12.224988009648744
+32
+268.8925988135208
+13
+78.89549509601319
+23
+-12.224988009648744
+33
+268.8925988135208
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.38353367517992
+20
+-8.556955346751463
+30
+253.43131026798287
+11
+80.3932705366631
+21
+-2.8536619627218207
+31
+257.6597241339173
+12
+75.8047067903857
+22
+-16.119059344559858
+32
+265.47190052525804
+13
+75.8047067903857
+23
+-16.119059344559858
+33
+265.47190052525804
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+80.3932705366631
+20
+-2.8536619627218207
+30
+257.6597241339173
+11
+78.89549509601319
+21
+-12.224988009648744
+31
+268.8925988135208
+12
+75.8047067903857
+22
+-16.119059344559858
+32
+265.47190052525804
+13
+75.8047067903857
+23
+-16.119059344559858
+33
+265.47190052525804
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+82.60359410225082
+20
+2.972538047816262
+30
+261.91643086189447
+11
+81.95976416740127
+21
+9.2827589563105
+31
+267.4688289816991
+12
+82.87103770463536
+22
+-8.8830838210554
+32
+272.45719520658133
+13
+82.87103770463536
+23
+-8.8830838210554
+33
+272.45719520658133
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+81.95976416740127
+20
+9.2827589563105
+30
+267.4688289816991
+11
+85.13017710509803
+21
+-4.794917368044837
+31
+276.80881992334656
+12
+82.87103770463536
+22
+-8.8830838210554
+32
+272.45719520658133
+13
+82.87103770463536
+23
+-8.8830838210554
+33
+272.45719520658133
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+81.95976416740127
+20
+9.2827589563105
+30
+267.4688289816991
+11
+81.88678075230398
+21
+16.04566565748787
+31
+274.40301397675165
+12
+85.13017710509803
+22
+-4.794917368044837
+32
+276.80881992334656
+13
+85.13017710509803
+23
+-4.794917368044837
+33
+276.80881992334656
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+81.88678075230398
+20
+16.04566565748787
+30
+274.40301397675165
+11
+86.04896498311113
+21
+-1.7551079322308865
+31
+283.4132257522227
+12
+85.13017710509803
+22
+-4.794917368044837
+32
+276.80881992334656
+13
+85.13017710509803
+23
+-4.794917368044837
+33
+276.80881992334656
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.16105138549753
+20
+18.401883039436306
+30
+260.20912396099806
+11
+75.53723580781222
+21
+29.979443877044822
+31
+266.9461715947217
+12
+81.95976416740127
+22
+9.2827589563105
+32
+267.4688289816991
+13
+81.95976416740127
+23
+9.2827589563105
+33
+267.4688289816991
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.53723580781222
+20
+29.979443877044822
+30
+266.9461715947217
+11
+81.88678075230398
+21
+16.04566565748787
+31
+274.40301397675165
+12
+81.95976416740127
+22
+9.2827589563105
+32
+267.4688289816991
+13
+81.95976416740127
+23
+9.2827589563105
+33
+267.4688289816991
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.6437124007302
+20
+11.587562427664523
+30
+255.65640696670266
+11
+77.16105138549753
+21
+18.401883039436306
+31
+260.20912396099806
+12
+82.60359410225082
+22
+2.972538047816262
+32
+261.91643086189447
+13
+82.60359410225082
+23
+2.972538047816262
+33
+261.91643086189447
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.16105138549753
+20
+18.401883039436306
+30
+260.20912396099806
+11
+81.95976416740127
+21
+9.2827589563105
+31
+267.4688289816991
+12
+82.60359410225082
+22
+2.972538047816262
+32
+261.91643086189447
+13
+82.60359410225082
+23
+2.972538047816262
+33
+261.91643086189447
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+75.26667694835976
+20
+-0.350504232745811
+30
+246.81990727967977
+11
+76.7997606639417
+21
+5.685002112043642
+31
+251.1265067966355
+12
+77.38353367517992
+22
+-8.556955346751463
+32
+253.43131026798287
+13
+77.38353367517992
+23
+-8.556955346751463
+33
+253.43131026798287
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+76.7997606639417
+20
+5.685002112043642
+30
+251.1265067966355
+11
+80.3932705366631
+21
+-2.8536619627218207
+31
+257.6597241339173
+12
+77.38353367517992
+22
+-8.556955346751463
+32
+253.43131026798287
+13
+77.38353367517992
+23
+-8.556955346751463
+33
+253.43131026798287
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+76.7997606639417
+20
+5.685002112043642
+30
+251.1265067966355
+11
+77.6437124007302
+21
+11.587562427664523
+31
+255.65640696670266
+12
+80.3932705366631
+22
+-2.8536619627218207
+32
+257.6597241339173
+13
+80.3932705366631
+23
+-2.8536619627218207
+33
+257.6597241339173
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+77.6437124007302
+20
+11.587562427664523
+30
+255.65640696670266
+11
+82.60359410225082
+21
+2.972538047816262
+31
+261.91643086189447
+12
+80.3932705366631
+22
+-2.8536619627218207
+32
+257.6597241339173
+13
+80.3932705366631
+23
+-2.8536619627218207
+33
+257.6597241339173
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+69.34069135986364
+20
+13.899971507092385
+30
+253.6676925669905
+11
+76.7997606639417
+21
+5.685002112043642
+31
+251.1265067966355
+12
+70.06097286709313
+22
+7.258754535129926
+32
+249.70760455397735
+13
+70.06097286709313
+23
+7.258754535129926
+33
+249.70760455397735
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+69.34069135986364
+20
+13.899971507092385
+30
+253.6676925669905
+11
+77.6437124007302
+21
+11.587562427664523
+31
+255.65640696670266
+12
+76.7997606639417
+22
+5.685002112043642
+32
+251.1265067966355
+13
+76.7997606639417
+23
+5.685002112043642
+33
+251.1265067966355
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.06097286709313
+20
+7.258754535129926
+30
+249.70760455397735
+11
+75.26667694835976
+21
+-0.350504232745811
+31
+246.81990727967977
+12
+69.93697103302202
+22
+1.6585931966106635
+32
+246.35657363569004
+13
+69.93697103302202
+23
+1.6585931966106635
+33
+246.35657363569004
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+70.06097286709313
+20
+7.258754535129926
+30
+249.70760455397735
+11
+76.7997606639417
+21
+5.685002112043642
+31
+251.1265067966355
+12
+75.26667694835976
+22
+-0.350504232745811
+32
+246.81990727967977
+13
+75.26667694835976
+23
+-0.350504232745811
+33
+246.81990727967977
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.72932216028242
+20
+20.968927877248916
+30
+257.30104365705927
+11
+77.6437124007302
+21
+11.587562427664523
+31
+255.65640696670266
+12
+69.34069135986364
+22
+13.899971507092385
+32
+253.6676925669905
+13
+69.34069135986364
+23
+13.899971507092385
+33
+253.6676925669905
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.72932216028242
+20
+20.968927877248916
+30
+257.30104365705927
+11
+77.16105138549753
+21
+18.401883039436306
+31
+260.20912396099806
+12
+77.6437124007302
+22
+11.587562427664523
+32
+255.65640696670266
+13
+77.6437124007302
+23
+11.587562427664523
+33
+255.65640696670266
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.86810929645328
+20
+32.97361966440619
+30
+259.1069192386278
+11
+77.16105138549753
+21
+18.401883039436306
+31
+260.20912396099806
+12
+68.72932216028242
+22
+20.968927877248916
+32
+257.30104365705927
+13
+68.72932216028242
+23
+20.968927877248916
+33
+257.30104365705927
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+68.86810929645328
+20
+32.97361966440619
+30
+259.1069192386278
+11
+75.53723580781222
+21
+29.979443877044822
+31
+266.9461715947217
+12
+77.16105138549753
+22
+18.401883039436306
+32
+260.20912396099806
+13
+77.16105138549753
+23
+18.401883039436306
+33
+260.20912396099806
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+60.6309619482546
+20
+39.40309650753487
+30
+255.32845314647267
+11
+68.72932216028242
+21
+20.968927877248916
+31
+257.30104365705927
+12
+61.41455253710869
+22
+28.21524702773882
+32
+254.57397682533062
+13
+61.41455253710869
+23
+28.21524702773882
+33
+254.57397682533062
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+60.6309619482546
+20
+39.40309650753487
+30
+255.32845314647267
+11
+68.86810929645328
+21
+32.97361966440619
+31
+259.1069192386278
+12
+68.72932216028242
+22
+20.968927877248916
+32
+257.30104365705927
+13
+68.72932216028242
+23
+20.968927877248916
+33
+257.30104365705927
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.41455253710869
+20
+28.21524702773882
+30
+254.57397682533062
+11
+69.34069135986364
+21
+13.899971507092385
+31
+253.6676925669905
+12
+63.34908458488777
+22
+14.920644110891466
+32
+253.25638128224094
+13
+63.34908458488777
+23
+14.920644110891466
+33
+253.25638128224094
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.41455253710869
+20
+28.21524702773882
+30
+254.57397682533062
+11
+68.72932216028242
+21
+20.968927877248916
+31
+257.30104365705927
+12
+69.34069135986364
+22
+13.899971507092385
+32
+253.6676925669905
+13
+69.34069135986364
+23
+13.899971507092385
+33
+253.6676925669905
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.13355742427869
+20
+9.801765651420741
+30
+251.7495582102225
+11
+69.93697103302202
+21
+1.6585931966106635
+31
+246.35657363569004
+12
+63.10774342942014
+22
+3.593459891143782
+32
+250.15542275749132
+13
+63.10774342942014
+23
+3.593459891143782
+33
+250.15542275749132
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+64.13355742427869
+20
+9.801765651420741
+30
+251.7495582102225
+11
+70.06097286709313
+21
+7.258754535129926
+31
+249.70760455397735
+12
+69.93697103302202
+22
+1.6585931966106635
+32
+246.35657363569004
+13
+69.93697103302202
+23
+1.6585931966106635
+33
+246.35657363569004
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.34908458488777
+20
+14.920644110891466
+30
+253.25638128224094
+11
+70.06097286709313
+21
+7.258754535129926
+31
+249.70760455397735
+12
+64.13355742427869
+22
+9.801765651420741
+32
+251.7495582102225
+13
+64.13355742427869
+23
+9.801765651420741
+33
+251.7495582102225
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+63.34908458488777
+20
+14.920644110891466
+30
+253.25638128224094
+11
+69.34069135986364
+21
+13.899971507092385
+31
+253.6676925669905
+12
+70.06097286709313
+22
+7.258754535129926
+32
+249.70760455397735
+13
+70.06097286709313
+23
+7.258754535129926
+33
+249.70760455397735
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+52.093240968892324
+20
+19.86033444409345
+30
+247.31853094514727
+11
+64.13355742427869
+21
+9.801765651420741
+31
+251.7495582102225
+12
+50.726695732228954
+22
+9.646611246671357
+32
+248.09186917431248
+13
+50.726695732228954
+23
+9.646611246671357
+33
+248.09186917431248
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+52.093240968892324
+20
+19.86033444409345
+30
+247.31853094514727
+11
+63.34908458488777
+21
+14.920644110891466
+31
+253.25638128224094
+12
+64.13355742427869
+22
+9.801765651420741
+32
+251.7495582102225
+13
+64.13355742427869
+23
+9.801765651420741
+33
+251.7495582102225
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+52.060080517680966
+20
+31.67519025367467
+30
+247.96135693973406
+11
+63.34908458488777
+21
+14.920644110891466
+31
+253.25638128224094
+12
+52.093240968892324
+22
+19.86033444409345
+32
+247.31853094514727
+13
+52.093240968892324
+23
+19.86033444409345
+33
+247.31853094514727
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+52.060080517680966
+20
+31.67519025367467
+30
+247.96135693973406
+11
+61.41455253710869
+21
+28.21524702773882
+31
+254.57397682533062
+12
+63.34908458488777
+22
+14.920644110891466
+32
+253.25638128224094
+13
+63.34908458488777
+23
+14.920644110891466
+33
+253.25638128224094
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.959786798055895
+20
+21.846006600576395
+30
+243.76671197365604
+11
+50.726695732228954
+21
+9.646611246671357
+31
+248.09186917431248
+12
+32.26688099151096
+22
+8.102672807242747
+32
+250.3251799297488
+13
+32.26688099151096
+23
+8.102672807242747
+33
+250.3251799297488
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+40.959786798055895
+20
+21.846006600576395
+30
+243.76671197365604
+11
+52.093240968892324
+21
+19.86033444409345
+31
+247.31853094514727
+12
+50.726695732228954
+22
+9.646611246671357
+32
+248.09186917431248
+13
+50.726695732228954
+23
+9.646611246671357
+33
+248.09186917431248
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.781467394251926
+20
+37.200512408728045
+30
+244.38763381698467
+11
+52.093240968892324
+21
+19.86033444409345
+31
+247.31853094514727
+12
+40.959786798055895
+22
+21.846006600576395
+32
+243.76671197365604
+13
+40.959786798055895
+23
+21.846006600576395
+33
+243.76671197365604
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+43.781467394251926
+20
+37.200512408728045
+30
+244.38763381698467
+11
+52.060080517680966
+21
+31.67519025367467
+31
+247.96135693973406
+12
+52.093240968892324
+22
+19.86033444409345
+32
+247.31853094514727
+13
+52.093240968892324
+23
+19.86033444409345
+33
+247.31853094514727
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.684335363391913
+20
+51.22799171977902
+30
+246.80743408244842
+11
+40.959786798055895
+21
+21.846006600576395
+31
+243.76671197365604
+12
+27.60494746524601
+22
+31.59791727562364
+32
+243.50477483152105
+13
+27.60494746524601
+23
+31.59791727562364
+33
+243.50477483152105
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.684335363391913
+20
+51.22799171977902
+30
+246.80743408244842
+11
+43.781467394251926
+21
+37.200512408728045
+31
+244.38763381698467
+12
+40.959786798055895
+22
+21.846006600576395
+32
+243.76671197365604
+13
+40.959786798055895
+23
+21.846006600576395
+33
+243.76671197365604
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.60494746524601
+20
+31.59791727562364
+30
+243.50477483152105
+11
+32.26688099151096
+21
+8.102672807242747
+31
+250.3251799297488
+12
+23.17574554610665
+22
+20.34192154746638
+32
+244.84123228263292
+13
+23.17574554610665
+23
+20.34192154746638
+33
+244.84123228263292
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+27.60494746524601
+20
+31.59791727562364
+30
+243.50477483152105
+11
+40.959786798055895
+21
+21.846006600576395
+31
+243.76671197365604
+12
+32.26688099151096
+22
+8.102672807242747
+32
+250.3251799297488
+13
+32.26688099151096
+23
+8.102672807242747
+33
+250.3251799297488
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.217801753523784
+20
+12.897552362678766
+30
+240.3012927099048
+11
+32.26688099151096
+21
+8.102672807242747
+31
+250.3251799297488
+12
+22.60806295931401
+22
+6.502757092376987
+32
+243.8452018489964
+13
+22.60806295931401
+23
+6.502757092376987
+33
+243.8452018489964
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.06948678555548
+20
+-153.13530573098848
+30
+252.90074304856364
+11
+2.6819782488401187
+21
+-155.74615887131603
+31
+246.20659104439102
+12
+7.799031362372918
+22
+-153.1708999767825
+32
+246.54306314567398
+13
+7.799031362372918
+23
+-153.1708999767825
+33
+246.54306314567398
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.3141856924522781
+20
+-157.09904443587493
+30
+246.3730017490936
+11
+3.258483341000918
+21
+-157.564507650128
+31
+253.4912424595832
+12
+2.874552245324444
+22
+-158.6536307266113
+32
+253.97069999269414
+13
+2.874552245324444
+23
+-158.6536307266113
+33
+253.97069999269414
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.258483341000918
+20
+-157.564507650128
+30
+253.4912424595832
+11
+1.3141856924522781
+21
+-157.09904443587493
+31
+246.3730017490936
+12
+2.6819782488401187
+22
+-155.74615887131603
+32
+246.20659104439102
+13
+2.6819782488401187
+23
+-155.74615887131603
+33
+246.20659104439102
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+5.466239253302204
+20
+-156.61228551900956
+30
+240.78531360781804
+11
+1.3141856924522781
+21
+-157.09904443587493
+31
+246.3730017490936
+12
+3.064996671547489
+22
+-157.17053715178795
+32
+240.47348367670168
+13
+3.064996671547489
+23
+-157.17053715178795
+33
+240.47348367670168
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+5.466239253302204
+20
+-156.61228551900956
+30
+240.78531360781804
+11
+2.6819782488401187
+21
+-155.74615887131603
+31
+246.20659104439102
+12
+1.3141856924522781
+22
+-157.09904443587493
+32
+246.3730017490936
+13
+1.3141856924522781
+23
+-157.09904443587493
+33
+246.3730017490936
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+6.359441865747653
+20
+-159.34361149126028
+30
+231.65402055177177
+11
+3.064996671547489
+21
+-157.17053715178795
+31
+240.47348367670168
+12
+3.4638347590529355
+22
+-159.4026310099304
+32
+232.47207975642627
+13
+3.4638347590529355
+23
+-159.4026310099304
+33
+232.47207975642627
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+6.359441865747653
+20
+-159.34361149126028
+30
+231.65402055177177
+11
+5.466239253302204
+21
+-156.61228551900956
+31
+240.78531360781804
+12
+3.064996671547489
+22
+-157.17053715178795
+32
+240.47348367670168
+13
+3.064996671547489
+23
+-157.17053715178795
+33
+240.47348367670168
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.4638347590529355
+20
+-159.4026310099304
+30
+232.47207975642627
+11
+0.9506376264195011
+21
+-157.5468626393883
+31
+240.52915672781813
+12
+1.3802023705519617
+22
+-159.476253296106
+32
+232.7349295715329
+13
+1.3802023705519617
+23
+-159.476253296106
+33
+232.7349295715329
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.4638347590529355
+20
+-159.4026310099304
+30
+232.47207975642627
+11
+3.064996671547489
+21
+-157.17053715178795
+31
+240.47348367670168
+12
+0.9506376264195011
+22
+-157.5468626393883
+32
+240.52915672781813
+13
+0.9506376264195011
+23
+-157.5468626393883
+33
+240.52915672781813
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.3802023705519617
+20
+-159.476253296106
+30
+232.7349295715329
+11
+0.020623870886214313
+21
+-157.61287931748808
+31
+240.80873888069186
+12
+0.020623870886214313
+22
+-159.53466436612968
+32
+232.67104246369442
+13
+0.020623870886214313
+23
+-159.53466436612968
+33
+232.67104246369442
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.3802023705519617
+20
+-159.476253296106
+30
+232.7349295715329
+11
+0.9506376264195011
+21
+-157.5468626393883
+31
+240.52915672781813
+12
+0.020623870886214313
+22
+-157.61287931748808
+32
+240.80873888069186
+13
+0.020623870886214313
+23
+-157.61287931748808
+33
+240.80873888069186
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.7826911499338802
+20
+-160.21095503624593
+30
+226.27472607177828
+11
+0.020623870886214313
+21
+-159.53466436612968
+31
+232.67104246369442
+12
+0.020623870886214313
+22
+-160.18357484717228
+32
+226.02221988365508
+13
+0.020623870886214313
+23
+-160.18357484717228
+33
+226.02221988365508
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.7826911499338802
+20
+-160.21095503624593
+30
+226.27472607177828
+11
+1.3802023705519617
+21
+-159.476253296106
+31
+232.7349295715329
+12
+0.020623870886214313
+22
+-159.53466436612968
+32
+232.67104246369442
+13
+0.020623870886214313
+23
+-159.53466436612968
+33
+232.67104246369442
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.3853302335410795
+20
+-160.40322480840712
+30
+226.029521267408
+11
+1.3802023705519617
+21
+-159.476253296106
+31
+232.7349295715329
+12
+1.7826911499338802
+22
+-160.21095503624593
+32
+226.27472607177828
+13
+1.7826911499338802
+23
+-160.21095503624593
+33
+226.27472607177828
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+4.3853302335410795
+20
+-160.40322480840712
+30
+226.029521267408
+11
+3.4638347590529355
+21
+-159.4026310099304
+31
+232.47207975642627
+12
+1.3802023705519617
+22
+-159.476253296106
+32
+232.7349295715329
+13
+1.3802023705519617
+23
+-159.476253296106
+33
+232.7349295715329
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+6.940206098431001
+20
+-160.6000883678463
+30
+225.87801755453404
+11
+3.4638347590529355
+21
+-159.4026310099304
+31
+232.47207975642627
+12
+4.3853302335410795
+22
+-160.40322480840712
+32
+226.029521267408
+13
+4.3853302335410795
+23
+-160.40322480840712
+33
+226.029521267408
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+6.940206098431001
+20
+-160.6000883678463
+30
+225.87801755453404
+11
+6.359441865747653
+21
+-159.34361149126028
+31
+231.65402055177177
+12
+3.4638347590529355
+22
+-159.4026310099304
+32
+232.47207975642627
+13
+3.4638347590529355
+23
+-159.4026310099304
+33
+232.47207975642627
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.070934656333076
+20
+-158.42424558703357
+30
+232.42309964041686
+11
+6.940206098431001
+21
+-160.6000883678463
+31
+225.87801755453404
+12
+12.612772825834837
+22
+-159.8434520540136
+32
+226.25160502322737
+13
+12.612772825834837
+23
+-159.8434520540136
+33
+226.25160502322737
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.070934656333076
+20
+-158.42424558703357
+30
+232.42309964041686
+11
+6.359441865747653
+21
+-159.34361149126028
+31
+231.65402055177177
+12
+6.940206098431001
+22
+-160.6000883678463
+32
+225.87801755453404
+13
+6.940206098431001
+23
+-160.6000883678463
+33
+225.87801755453404
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.070934656333076
+20
+-158.42424558703357
+30
+232.42309964041686
+11
+10.387676127120283
+21
+-155.0434006850924
+31
+241.31983574339975
+12
+6.359441865747653
+22
+-159.34361149126028
+32
+231.65402055177177
+13
+6.359441865747653
+23
+-159.34361149126028
+33
+231.65402055177177
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.387676127120283
+20
+-155.0434006850924
+30
+241.31983574339975
+11
+5.466239253302204
+21
+-156.61228551900956
+31
+240.78531360781804
+12
+6.359441865747653
+22
+-159.34361149126028
+32
+231.65402055177177
+13
+6.359441865747653
+23
+-159.34361149126028
+33
+231.65402055177177
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+10.387676127120283
+20
+-155.0434006850924
+30
+241.31983574339975
+11
+7.799031362372918
+21
+-153.1708999767825
+31
+246.54306314567398
+12
+5.466239253302204
+22
+-156.61228551900956
+32
+240.78531360781804
+13
+5.466239253302204
+23
+-156.61228551900956
+33
+240.78531360781804
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+7.799031362372918
+20
+-153.1708999767825
+30
+246.54306314567398
+11
+2.6819782488401187
+21
+-155.74615887131603
+31
+246.20659104439102
+12
+5.466239253302204
+22
+-156.61228551900956
+32
+240.78531360781804
+13
+5.466239253302204
+23
+-156.61228551900956
+33
+240.78531360781804
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.455400949817996
+20
+-151.05258601545424
+30
+243.094680444016
+11
+16.854268337658503
+21
+-150.36473482106237
+31
+249.17125707241726
+12
+10.387676127120283
+22
+-155.0434006850924
+32
+241.31983574339975
+13
+10.387676127120283
+23
+-155.0434006850924
+33
+241.31983574339975
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.854268337658503
+20
+-150.36473482106237
+30
+249.17125707241726
+11
+7.799031362372918
+21
+-153.1708999767825
+31
+246.54306314567398
+12
+10.387676127120283
+22
+-155.0434006850924
+32
+241.31983574339975
+13
+10.387676127120283
+23
+-155.0434006850924
+33
+241.31983574339975
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+20.28531025290362
+20
+-154.89189697221647
+30
+233.69658265666345
+11
+18.455400949817996
+21
+-151.05258601545424
+31
+243.094680444016
+12
+13.070934656333076
+22
+-158.42424558703357
+32
+232.42309964041686
+13
+13.070934656333076
+23
+-158.42424558703357
+33
+232.42309964041686
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.455400949817996
+20
+-151.05258601545424
+30
+243.094680444016
+11
+10.387676127120283
+21
+-155.0434006850924
+31
+241.31983574339975
+12
+13.070934656333076
+22
+-158.42424558703357
+32
+232.42309964041686
+13
+13.070934656333076
+23
+-158.42424558703357
+33
+232.42309964041686
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.299883720074494
+20
+-155.03092748784405
+30
+226.58564332992623
+11
+20.28531025290362
+21
+-154.89189697221647
+31
+233.69658265666345
+12
+12.612772825834837
+22
+-159.8434520540136
+32
+226.25160502322737
+13
+12.612772825834837
+23
+-159.8434520540136
+33
+226.25160502322737
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+20.28531025290362
+20
+-154.89189697221647
+30
+233.69658265666345
+11
+13.070934656333076
+21
+-158.42424558703357
+31
+232.42309964041686
+12
+12.612772825834837
+22
+-159.8434520540136
+32
+226.25160502322737
+13
+12.612772825834837
+23
+-159.8434520540136
+33
+226.25160502322737
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.461628508759116
+20
+-148.3130459864747
+30
+226.5972038542036
+11
+26.70292234743239
+21
+-148.8643004598251
+31
+234.11276153058344
+12
+22.299883720074494
+22
+-155.03092748784405
+32
+226.58564332992623
+13
+22.299883720074494
+23
+-155.03092748784405
+33
+226.58564332992623
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.70292234743239
+20
+-148.8643004598251
+30
+234.11276153058344
+11
+20.28531025290362
+21
+-154.89189697221647
+31
+233.69658265666345
+12
+22.299883720074494
+22
+-155.03092748784405
+32
+226.58564332992623
+13
+22.299883720074494
+23
+-155.03092748784405
+33
+226.58564332992623
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.70292234743239
+20
+-148.8643004598251
+30
+234.11276153058344
+11
+21.56518197993289
+21
+-146.90905073564983
+31
+244.98147969551124
+12
+20.28531025290362
+22
+-154.89189697221647
+32
+233.69658265666345
+13
+20.28531025290362
+23
+-154.89189697221647
+33
+233.69658265666345
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+21.56518197993289
+20
+-146.90905073564983
+30
+244.98147969551124
+11
+18.455400949817996
+21
+-151.05258601545424
+31
+243.094680444016
+12
+20.28531025290362
+22
+-154.89189697221647
+32
+233.69658265666345
+13
+20.28531025290362
+23
+-154.89189697221647
+33
+233.69658265666345
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+18.455400949817996
+20
+-151.05258601545424
+30
+243.094680444016
+11
+21.56518197993289
+21
+-146.90905073564983
+31
+244.98147969551124
+12
+21.02700915247513
+22
+-145.62491986810042
+32
+254.47662504191302
+13
+21.02700915247513
+23
+-145.62491986810042
+33
+254.47662504191302
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+21.02700915247513
+20
+-145.62491986810042
+30
+254.47662504191302
+11
+16.854268337658503
+21
+-150.36473482106237
+31
+249.17125707241726
+12
+18.455400949817996
+22
+-151.05258601545424
+32
+243.094680444016
+13
+18.455400949817996
+23
+-151.05258601545424
+33
+243.094680444016
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.761652291946636
+20
+-141.5194126286753
+30
+253.282240349659
+11
+23.733692954562006
+21
+-145.5172244577461
+31
+261.6952597790061
+12
+21.02700915247513
+22
+-145.62491986810042
+32
+254.47662504191302
+13
+21.02700915247513
+23
+-145.62491986810042
+33
+254.47662504191302
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+28.6986339065748
+20
+-140.65359020530525
+30
+260.1361101234274
+11
+23.733692954562006
+21
+-145.5172244577461
+31
+261.6952597790061
+12
+25.761652291946636
+22
+-141.5194126286753
+32
+253.282240349659
+13
+25.761652291946636
+23
+-141.5194126286753
+33
+253.282240349659
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.826437422586647
+20
+-141.89938880815004
+30
+244.3967605466294
+11
+25.761652291946636
+21
+-141.5194126286753
+31
+253.282240349659
+12
+21.56518197993289
+22
+-146.90905073564983
+32
+244.98147969551124
+13
+21.56518197993289
+23
+-146.90905073564983
+33
+244.98147969551124
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+25.761652291946636
+20
+-141.5194126286753
+30
+253.282240349659
+11
+21.02700915247513
+21
+-145.62491986810042
+31
+254.47662504191302
+12
+21.56518197993289
+22
+-146.90905073564983
+32
+244.98147969551124
+13
+21.56518197993289
+23
+-146.90905073564983
+33
+244.98147969551124
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.70292234743239
+20
+-148.8643004598251
+30
+234.11276153058344
+11
+31.52609476490855
+21
+-141.20667002458558
+31
+235.40297688459836
+12
+26.826437422586647
+22
+-141.89938880815004
+32
+244.3967605466294
+13
+26.826437422586647
+23
+-141.89938880815004
+33
+244.3967605466294
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+26.70292234743239
+20
+-148.8643004598251
+30
+234.11276153058344
+11
+26.826437422586647
+21
+-141.89938880815004
+31
+244.3967605466294
+12
+21.56518197993289
+22
+-146.90905073564983
+32
+244.98147969551124
+13
+21.56518197993289
+23
+-146.90905073564983
+33
+244.98147969551124
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.461628508759116
+20
+-148.3130459864747
+30
+226.5972038542036
+11
+34.48528475511863
+21
+-139.17536421964545
+31
+227.1429822897396
+12
+31.52609476490855
+22
+-141.20667002458558
+32
+235.40297688459836
+13
+31.52609476490855
+23
+-141.20667002458558
+33
+235.40297688459836
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+29.461628508759116
+20
+-148.3130459864747
+30
+226.5972038542036
+11
+31.52609476490855
+21
+-141.20667002458558
+31
+235.40297688459836
+12
+26.70292234743239
+22
+-148.8643004598251
+32
+234.11276153058344
+13
+26.70292234743239
+23
+-148.8643004598251
+33
+234.11276153058344
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.919731738587274
+20
+-143.0755200410305
+30
+274.94149102849116
+11
+24.826770947244725
+21
+-148.83935406534664
+31
+276.22440499874955
+12
+24.319629000737052
+22
+-148.6841996605954
+32
+272.7331266675426
+13
+24.319629000737052
+23
+-148.6841996605954
+33
+272.7331266675426
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.919731738587274
+20
+-143.0755200410305
+30
+274.94149102849116
+11
+24.319629000737052
+21
+-148.6841996605954
+31
+272.7331266675426
+12
+30.75640722761736
+22
+-142.47406855437956
+32
+271.5737277724388
+13
+30.75640722761736
+23
+-142.47406855437956
+33
+271.5737277724388
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.166516265242816
+20
+-141.11783652226578
+30
+265.3596417500241
+11
+24.319629000737052
+21
+-148.6841996605954
+31
+272.7331266675426
+12
+24.48330168653256
+22
+-146.5844433829721
+32
+268.19775045966276
+13
+24.48330168653256
+23
+-146.5844433829721
+33
+268.19775045966276
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+30.75640722761736
+20
+-142.47406855437956
+30
+271.5737277724388
+11
+24.319629000737052
+21
+-148.6841996605954
+31
+272.7331266675426
+12
+30.166516265242816
+22
+-141.11783652226578
+32
+265.3596417500241
+13
+30.166516265242816
+23
+-141.11783652226578
+33
+265.3596417500241
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.30141151137013
+20
+-135.90616964426974
+30
+274.45899125215175
+11
+54.07386300161193
+21
+-138.47321448208095
+31
+273.2734290652643
+12
+53.66778437521814
+22
+-136.958785801987
+32
+269.89227993899783
+13
+53.66778437521814
+23
+-136.958785801987
+33
+269.89227993899783
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.30141151137013
+20
+-135.90616964426974
+30
+274.45899125215175
+11
+53.66778437521814
+21
+-136.958785801987
+31
+269.89227993899783
+12
+61.25523025913265
+22
+-135.54748916740476
+32
+271.1490306174767
+13
+61.25523025913265
+23
+-135.54748916740476
+33
+271.1490306174767
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+58.389254601502024
+20
+-136.19427007818985
+30
+279.1483049674903
+11
+53.29900365082906
+21
+-138.20884354536042
+31
+277.8869909241659
+12
+54.07386300161193
+22
+-138.47321448208095
+32
+273.2734290652643
+13
+54.07386300161193
+23
+-138.47321448208095
+33
+273.2734290652643
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+61.30141151137013
+20
+-135.90616964426974
+30
+274.45899125215175
+11
+58.389254601502024
+21
+-136.19427007818985
+31
+279.1483049674903
+12
+54.07386300161193
+22
+-138.47321448208095
+32
+273.2734290652643
+13
+54.07386300161193
+23
+-138.47321448208095
+33
+273.2734290652643
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+53.29900365082906
+20
+-138.20884354536042
+30
+277.8869909241659
+11
+45.03639272679189
+21
+-140.22615503143857
+31
+277.66216914943885
+12
+45.20219498284869
+22
+-140.6496352891095
+32
+274.80580698041615
+13
+45.20219498284869
+23
+-140.6496352891095
+33
+274.80580698041615
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+54.07386300161193
+20
+-138.47321448208095
+30
+273.2734290652643
+11
+53.29900365082906
+21
+-138.20884354536042
+31
+277.8869909241659
+12
+45.20219498284869
+22
+-140.6496352891095
+32
+274.80580698041615
+13
+45.20219498284869
+23
+-140.6496352891095
+33
+274.80580698041615
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+54.07386300161193
+20
+-138.47321448208095
+30
+273.2734290652643
+11
+45.20219498284869
+21
+-140.6496352891095
+31
+274.80580698041615
+12
+43.652780505606
+22
+-138.97153392321994
+32
+271.05593797462535
+13
+43.652780505606
+23
+-138.97153392321994
+33
+271.05593797462535
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+54.07386300161193
+20
+-138.47321448208095
+30
+273.2734290652643
+11
+43.652780505606
+21
+-138.97153392321994
+31
+271.05593797462535
+12
+53.66778437521814
+22
+-136.958785801987
+32
+269.89227993899783
+13
+53.66778437521814
+23
+-136.958785801987
+33
+269.89227993899783
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.20219498284869
+20
+-140.6496352891095
+30
+274.80580698041615
+11
+33.75088723930006
+21
+-141.84554110298063
+31
+278.0762184530958
+12
+33.919731738587274
+22
+-143.0755200410305
+32
+274.94149102849116
+13
+33.919731738587274
+23
+-143.0755200410305
+33
+274.94149102849116
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.20219498284869
+20
+-140.6496352891095
+30
+274.80580698041615
+11
+33.919731738587274
+21
+-143.0755200410305
+31
+274.94149102849116
+12
+43.652780505606
+22
+-138.97153392321994
+32
+271.05593797462535
+13
+43.652780505606
+23
+-138.97153392321994
+33
+271.05593797462535
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.03639272679189
+20
+-140.22615503143857
+30
+277.66216914943885
+11
+34.02742714894343
+21
+-140.20516355314956
+31
+280.59915076406696
+12
+33.75088723930006
+22
+-141.84554110298063
+32
+278.0762184530958
+13
+33.75088723930006
+23
+-141.84554110298063
+33
+278.0762184530958
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+45.20219498284869
+20
+-140.6496352891095
+30
+274.80580698041615
+11
+45.03639272679189
+21
+-140.22615503143857
+31
+277.66216914943885
+12
+33.75088723930006
+22
+-141.84554110298063
+32
+278.0762184530958
+13
+33.75088723930006
+23
+-141.84554110298063
+33
+278.0762184530958
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+23.63816651712744
+20
+-139.837660570919
+30
+286.8473099106626
+11
+23.138021730049687
+21
+-144.2306597956155
+31
+283.2176095124712
+12
+34.02742714894343
+22
+-140.20516355314956
+32
+280.59915076406696
+13
+34.02742714894343
+23
+-140.20516355314956
+33
+280.59915076406696
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.02742714894343
+20
+-140.20516355314956
+30
+280.59915076406696
+11
+23.138021730049687
+21
+-144.2306597956155
+31
+283.2176095124712
+12
+33.75088723930006
+22
+-141.84554110298063
+32
+278.0762184530958
+13
+33.75088723930006
+23
+-141.84554110298063
+33
+278.0762184530958
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.75088723930006
+20
+-141.84554110298063
+30
+278.0762184530958
+11
+23.138021730049687
+21
+-144.2306597956155
+31
+283.2176095124712
+12
+22.020301567200733
+22
+-146.89505641679938
+32
+281.41599307142764
+13
+22.020301567200733
+23
+-146.89505641679938
+33
+281.41599307142764
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.919731738587274
+20
+-143.0755200410305
+30
+274.94149102849116
+11
+33.75088723930006
+21
+-141.84554110298063
+31
+278.0762184530958
+12
+22.020301567200733
+22
+-146.89505641679938
+32
+281.41599307142764
+13
+22.020301567200733
+23
+-146.89505641679938
+33
+281.41599307142764
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+23.138021730049687
+20
+-144.2306597956155
+30
+283.2176095124712
+11
+17.8186594416953
+21
+-145.48284710924966
+31
+289.17432175759416
+12
+16.251904178039304
+22
+-150.154515813852
+32
+289.38940835398216
+13
+16.251904178039304
+23
+-150.154515813852
+33
+289.38940835398216
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.020301567200733
+20
+-146.89505641679938
+30
+281.41599307142764
+11
+23.138021730049687
+21
+-144.2306597956155
+31
+283.2176095124712
+12
+16.251904178039304
+22
+-150.154515813852
+32
+289.38940835398216
+13
+16.251904178039304
+23
+-150.154515813852
+33
+289.38940835398216
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+23.63816651712744
+20
+-139.837660570919
+30
+286.8473099106626
+11
+19.081494606634337
+21
+-140.490830192487
+31
+291.7696594574496
+12
+17.8186594416953
+22
+-145.48284710924966
+32
+289.17432175759416
+13
+17.8186594416953
+23
+-145.48284710924966
+33
+289.17432175759416
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+23.138021730049687
+20
+-144.2306597956155
+30
+283.2176095124712
+11
+23.63816651712744
+21
+-139.837660570919
+31
+286.8473099106626
+12
+17.8186594416953
+22
+-145.48284710924966
+32
+289.17432175759416
+13
+17.8186594416953
+23
+-145.48284710924966
+33
+289.17432175759416
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.286296176710344
+20
+-145.98025387742157
+30
+294.9074291252825
+11
+14.767289481604097
+21
+-141.62741226336811
+31
+306.05329564850035
+12
+13.590854024408427
+22
+-145.02559795172385
+32
+301.92618848213885
+13
+13.590854024408427
+23
+-145.02559795172385
+33
+301.92618848213885
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.286296176710344
+20
+-145.98025387742157
+30
+294.9074291252825
+11
+16.07484562203002
+21
+-141.67152479020677
+31
+297.85475436689535
+12
+14.767289481604097
+22
+-141.62741226336811
+32
+306.05329564850035
+13
+14.767289481604097
+23
+-141.62741226336811
+33
+306.05329564850035
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.8186594416953
+20
+-145.48284710924966
+30
+289.17432175759416
+11
+16.07484562203002
+21
+-141.67152479020677
+31
+297.85475436689535
+12
+15.286296176710344
+22
+-145.98025387742157
+32
+294.9074291252825
+13
+15.286296176710344
+23
+-145.98025387742157
+33
+294.9074291252825
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.8186594416953
+20
+-145.48284710924966
+30
+289.17432175759416
+11
+19.081494606634337
+21
+-140.490830192487
+31
+291.7696594574496
+12
+16.07484562203002
+22
+-141.67152479020677
+32
+297.85475436689535
+13
+16.07484562203002
+23
+-141.67152479020677
+33
+297.85475436689535
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.78190689927755
+20
+-151.89285359570368
+30
+293.8971001484653
+11
+13.590854024408427
+21
+-145.02559795172385
+31
+301.92618848213885
+12
+13.160376607306807
+22
+-148.7885486034047
+32
+298.4254791969166
+13
+13.160376607306807
+23
+-148.7885486034047
+33
+298.4254791969166
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.78190689927755
+20
+-151.89285359570368
+30
+293.8971001484653
+11
+15.286296176710344
+21
+-145.98025387742157
+31
+294.9074291252825
+12
+13.590854024408427
+22
+-145.02559795172385
+32
+301.92618848213885
+13
+13.590854024408427
+23
+-145.02559795172385
+33
+301.92618848213885
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.8186594416953
+20
+-145.48284710924966
+30
+289.17432175759416
+11
+13.78190689927755
+21
+-151.89285359570368
+31
+293.8971001484653
+12
+16.251904178039304
+22
+-150.154515813852
+32
+289.38940835398216
+13
+16.251904178039304
+23
+-150.154515813852
+33
+289.38940835398216
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.8186594416953
+20
+-145.48284710924966
+30
+289.17432175759416
+11
+15.286296176710344
+21
+-145.98025387742157
+31
+294.9074291252825
+12
+13.78190689927755
+22
+-151.89285359570368
+32
+293.8971001484653
+13
+13.78190689927755
+23
+-151.89285359570368
+33
+293.8971001484653
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+22.020301567200733
+20
+-146.89505641679938
+30
+281.41599307142764
+11
+16.251904178039304
+21
+-150.154515813852
+31
+289.38940835398216
+12
+14.260147535096436
+22
+-156.85505652880718
+32
+286.3021399237706
+13
+14.260147535096436
+23
+-156.85505652880718
+33
+286.3021399237706
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.969858930246176
+20
+-154.60805567883196
+30
+279.53679942800755
+11
+22.020301567200733
+21
+-146.89505641679938
+31
+281.41599307142764
+12
+14.260147535096436
+22
+-156.85505652880718
+32
+286.3021399237706
+13
+14.260147535096436
+23
+-156.85505652880718
+33
+286.3021399237706
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.260147535096436
+20
+-156.85505652880718
+30
+286.3021399237706
+11
+16.251904178039304
+21
+-150.154515813852
+31
+289.38940835398216
+12
+13.10226976160619
+22
+-157.48997269099246
+32
+289.3675042027214
+13
+13.10226976160619
+23
+-157.48997269099246
+33
+289.3675042027214
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.10226976160619
+20
+-157.48997269099246
+30
+289.3675042027214
+11
+16.251904178039304
+21
+-150.154515813852
+31
+289.38940835398216
+12
+13.78190689927755
+22
+-151.89285359570368
+32
+293.8971001484653
+13
+13.78190689927755
+23
+-151.89285359570368
+33
+293.8971001484653
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.919731738587274
+20
+-143.0755200410305
+30
+274.94149102849116
+11
+22.020301567200733
+21
+-146.89505641679938
+31
+281.41599307142764
+12
+17.969858930246176
+22
+-154.60805567883196
+32
+279.53679942800755
+13
+17.969858930246176
+23
+-154.60805567883196
+33
+279.53679942800755
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+33.919731738587274
+20
+-143.0755200410305
+30
+274.94149102849116
+11
+17.969858930246176
+21
+-154.60805567883196
+31
+279.53679942800755
+12
+24.826770947244725
+22
+-148.83935406534664
+32
+276.22440499874955
+13
+24.826770947244725
+23
+-148.83935406534664
+33
+276.22440499874955
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+24.319629000737052
+20
+-148.6841996605954
+30
+272.7331266675426
+11
+17.969858930246176
+21
+-154.60805567883196
+31
+279.53679942800755
+12
+19.031297593332752
+22
+-153.71363616909326
+32
+275.2326337056379
+13
+19.031297593332752
+23
+-153.71363616909326
+33
+275.2326337056379
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+24.826770947244725
+20
+-148.83935406534664
+30
+276.22440499874955
+11
+17.969858930246176
+21
+-154.60805567883196
+31
+279.53679942800755
+12
+24.319629000737052
+22
+-148.6841996605954
+32
+272.7331266675426
+13
+24.319629000737052
+23
+-148.6841996605954
+33
+272.7331266675426
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+19.940928319222333
+20
+-151.05228179113757
+30
+267.66292409975733
+11
+24.48330168653256
+21
+-146.5844433829721
+31
+268.19775045966276
+12
+19.031297593332752
+22
+-153.71363616909326
+32
+275.2326337056379
+13
+19.031297593332752
+23
+-153.71363616909326
+33
+275.2326337056379
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+24.48330168653256
+20
+-146.5844433829721
+30
+268.19775045966276
+11
+24.319629000737052
+21
+-148.6841996605954
+31
+272.7331266675426
+12
+19.031297593332752
+22
+-153.71363616909326
+32
+275.2326337056379
+13
+19.031297593332752
+23
+-153.71363616909326
+33
+275.2326337056379
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+23.733692954562006
+20
+-145.5172244577461
+30
+261.6952597790061
+11
+19.940928319222333
+21
+-151.05228179113757
+31
+267.66292409975733
+12
+19.901683381550185
+22
+-149.30816374714755
+32
+261.6964766762974
+13
+19.901683381550185
+23
+-149.30816374714755
+33
+261.6964766762974
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+23.733692954562006
+20
+-145.5172244577461
+30
+261.6952597790061
+11
+24.48330168653256
+21
+-146.5844433829721
+31
+268.19775045966276
+12
+19.940928319222333
+22
+-151.05228179113757
+32
+267.66292409975733
+13
+19.940928319222333
+23
+-151.05228179113757
+33
+267.66292409975733
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+21.02700915247513
+20
+-145.62491986810042
+30
+254.47662504191302
+11
+19.901683381550185
+21
+-149.30816374714755
+31
+261.6964766762974
+12
+17.759335698702497
+22
+-149.4061239791656
+32
+258.51216068703764
+13
+17.759335698702497
+23
+-149.4061239791656
+33
+258.51216068703764
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+23.733692954562006
+20
+-145.5172244577461
+30
+261.6952597790061
+11
+19.901683381550185
+21
+-149.30816374714755
+31
+261.6964766762974
+12
+21.02700915247513
+22
+-145.62491986810042
+32
+254.47662504191302
+13
+21.02700915247513
+23
+-145.62491986810042
+33
+254.47662504191302
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+17.759335698702497
+20
+-149.4061239791656
+30
+258.51216068703764
+11
+14.603008347162513
+21
+-151.03828747227413
+31
+254.29165665350325
+12
+16.854268337658503
+22
+-150.36473482106237
+32
+249.17125707241726
+13
+16.854268337658503
+23
+-150.36473482106237
+33
+249.17125707241726
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.854268337658503
+20
+-150.36473482106237
+30
+249.17125707241726
+11
+21.02700915247513
+21
+-145.62491986810042
+31
+254.47662504191302
+12
+17.759335698702497
+22
+-149.4061239791656
+32
+258.51216068703764
+13
+17.759335698702497
+23
+-149.4061239791656
+33
+258.51216068703764
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.603008347162513
+20
+-151.03828747227413
+30
+254.29165665350325
+11
+8.06948678555548
+21
+-153.13530573098848
+31
+252.90074304856364
+12
+7.799031362372918
+22
+-153.1708999767825
+32
+246.54306314567398
+13
+7.799031362372918
+23
+-153.1708999767825
+33
+246.54306314567398
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+16.854268337658503
+20
+-150.36473482106237
+30
+249.17125707241726
+11
+14.603008347162513
+21
+-151.03828747227413
+31
+254.29165665350325
+12
+7.799031362372918
+22
+-153.1708999767825
+32
+246.54306314567398
+13
+7.799031362372918
+23
+-153.1708999767825
+33
+246.54306314567398
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.06948678555548
+20
+-153.13530573098848
+30
+252.90074304856364
+11
+3.258483341000918
+21
+-157.564507650128
+31
+253.4912424595832
+12
+2.6819782488401187
+22
+-155.74615887131603
+32
+246.20659104439102
+13
+2.6819782488401187
+23
+-155.74615887131603
+33
+246.20659104439102
+70
+0
+ 0
+LINE
+ 8
+skull_half
+10
+-8.382660380124642
+20
+17.853366585001176
+30
+237.17873425822356
+11
+8.423603897574033
+21
+17.853366585001176
+31
+237.17873425822356
+ 0
+3DFACE
+ 8
+skull_half
+10
+13.753005588588755
+20
+-122.30277903952711
+30
+239.25354414132025
+11
+14.360541561699618
+21
+-127.62122865491192
+31
+236.9794673265951
+12
+8.263277679331958
+22
+-128.61969288312923
+32
+237.71173527215214
+13
+8.263277679331958
+23
+-128.61969288312923
+33
+237.71173527215214
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.428544737580289
+20
+-147.8621855397364
+30
+253.60806459963328
+11
+2.3610215880329326
+21
+-145.65747187066668
+31
+257.6941014823838
+12
+4.3266149391943625
+22
+-152.695701584196
+32
+254.08387144086652
+13
+4.3266149391943625
+23
+-152.695701584196
+33
+254.08387144086652
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.428544737580289
+20
+-147.8621855397364
+30
+253.60806459963328
+11
+3.035182687889568
+21
+-136.19214050792218
+31
+254.37105920182054
+12
+2.3610215880329326
+22
+-145.65747187066668
+32
+257.6941014823838
+13
+2.3610215880329326
+23
+-145.65747187066668
+33
+257.6941014823838
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.035182687889568
+20
+-136.19214050792218
+30
+254.37105920182054
+11
+1.9661384167270082
+21
+-126.46852269492001
+31
+263.3627132935933
+12
+2.068966237914519
+22
+-136.13372943789986
+32
+259.65573991734846
+13
+2.068966237914519
+23
+-136.13372943789986
+33
+259.65573991734846
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.035182687889568
+20
+-136.19214050792218
+30
+254.37105920182054
+11
+2.068966237914519
+21
+-136.13372943789986
+31
+259.65573991734846
+12
+2.3610215880329326
+22
+-145.65747187066668
+32
+257.6941014823838
+13
+2.3610215880329326
+23
+-145.65747187066668
+33
+257.6941014823838
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+5.23928790831437
+20
+-121.78194699848548
+30
+250.25307876515456
+11
+2.658857200289076
+21
+-122.43876731193058
+31
+257.0768303309419
+12
+3.035182687889568
+22
+-136.19214050792218
+32
+254.37105920182054
+13
+3.035182687889568
+23
+-136.19214050792218
+33
+254.37105920182054
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+3.035182687889568
+20
+-136.19214050792218
+30
+254.37105920182054
+11
+2.658857200289076
+21
+-122.43876731193058
+31
+257.0768303309419
+12
+1.9661384167270082
+22
+-126.46852269492001
+32
+263.3627132935933
+13
+1.9661384167270082
+23
+-126.46852269492001
+33
+263.3627132935933
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+2.658857200289076
+20
+-122.43876731193058
+30
+257.0768303309419
+11
+0.6321147601966108
+21
+-113.08964964058839
+31
+257.2757930382123
+12
+1.9661384167270082
+22
+-126.46852269492001
+32
+263.3627132935933
+13
+1.9661384167270082
+23
+-126.46852269492001
+33
+263.3627132935933
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.745575782523003
+20
+-120.5294554605346
+30
+268.9327564241342
+11
+3.689873431071632
+21
+-117.10449803175307
+31
+279.64632018431166
+12
+2.055580367700773
+22
+-123.82755134661284
+32
+275.2283745651228
+13
+2.055580367700773
+23
+-123.82755134661284
+33
+275.2283745651228
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.7103004112178869
+20
+-112.11978249873853
+30
+263.15492808096064
+11
+1.137127136443013
+21
+-112.10031214206509
+31
+268.0672382250876
+12
+1.745575782523003
+22
+-120.5294554605346
+32
+268.9327564241342
+13
+1.745575782523003
+23
+-120.5294554605346
+33
+268.9327564241342
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.137127136443013
+20
+-112.10031214206509
+30
+268.0672382250876
+11
+2.1720982834250795
+21
+-104.63312613304961
+31
+273.1009338741093
+12
+1.745575782523003
+22
+-120.5294554605346
+32
+268.9327564241342
+13
+1.745575782523003
+23
+-120.5294554605346
+33
+268.9327564241342
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+0.7103004112178869
+20
+-112.11978249873853
+30
+263.15492808096064
+11
+1.745575782523003
+21
+-120.5294554605346
+31
+268.9327564241342
+12
+1.9661384167270082
+22
+-126.46852269492001
+32
+263.3627132935933
+13
+1.9661384167270082
+23
+-126.46852269492001
+33
+263.3627132935933
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.738095167564865
+20
+-8.703591470455816
+30
+249.94489952594444
+11
+28.354556197216564
+21
+-18.99884678645491
+31
+259.5550416664523
+12
+24.292248811663452
+22
+-8.70876328394589
+32
+243.81934278153415
+13
+24.292248811663452
+23
+-8.70876328394589
+33
+243.81934278153415
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+5.306217259383158
+20
+-102.93677130777985
+30
+277.9149795618947
+11
+6.47170064094941
+21
+-109.29627655660906
+31
+282.1506948115789
+12
+3.689873431071632
+22
+-117.10449803175307
+32
+279.64632018431166
+13
+3.689873431071632
+23
+-117.10449803175307
+33
+279.64632018431166
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.263277679331958
+20
+-128.61969288312923
+30
+237.71173527215214
+11
+13.65078621604731
+21
+-130.55334268037103
+31
+235.81428816935113
+12
+12.23736001120347
+22
+-133.37441482792056
+32
+234.39051833752328
+13
+12.23736001120347
+23
+-133.37441482792056
+33
+234.39051833752328
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+34.738095167564865
+20
+-8.703591470455816
+30
+249.94489952594444
+11
+31.9462285550268
+21
+-0.16371049840077204
+31
+252.77753219777196
+12
+33.31310843844554
+22
+1.4851853324750732
+32
+256.47264082541614
+13
+33.31310843844554
+23
+1.4851853324750732
+33
+256.47264082541614
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+31.9462285550268
+20
+-0.16371049840077204
+30
+252.77753219777196
+11
+34.738095167564865
+21
+-8.703591470455816
+31
+249.94489952594444
+12
+24.292248811663452
+22
+-8.70876328394589
+32
+243.81934278153415
+13
+24.292248811663452
+23
+-8.70876328394589
+33
+243.81934278153415
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+5.306217259383158
+20
+-102.93677130777985
+30
+277.9149795618947
+11
+9.62863644113548
+21
+-104.09890822179428
+31
+284.23980323789596
+12
+6.47170064094941
+22
+-109.29627655660906
+32
+282.1506948115789
+13
+6.47170064094941
+23
+-109.29627655660906
+33
+282.1506948115789
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+1.745575782523003
+20
+-120.5294554605346
+30
+268.9327564241342
+11
+2.1720982834250795
+21
+-104.63312613304961
+31
+273.1009338741093
+12
+3.689873431071632
+22
+-117.10449803175307
+32
+279.64632018431166
+13
+3.689873431071632
+23
+-117.10449803175307
+33
+279.64632018431166
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+24.292248811663452
+20
+-8.70876328394589
+30
+243.81934278153415
+11
+28.354556197216564
+21
+-18.99884678645491
+31
+259.5550416664523
+12
+19.28167421119466
+22
+-20.4022335886354
+32
+247.76482802703683
+13
+19.28167421119466
+23
+-20.4022335886354
+33
+247.76482802703683
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+14.360541561699618
+20
+-127.62122865491192
+30
+236.9794673265951
+11
+13.65078621604731
+21
+-130.55334268037103
+31
+235.81428816935113
+12
+8.263277679331958
+22
+-128.61969288312923
+32
+237.71173527215214
+13
+8.263277679331958
+23
+-128.61969288312923
+33
+237.71173527215214
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+32.26688099151096
+20
+8.102672807242747
+30
+250.3251799297488
+11
+33.31310843844554
+21
+1.4851853324750732
+31
+256.47264082541614
+12
+31.9462285550268
+22
+-0.16371049840077204
+32
+252.77753219777196
+13
+31.9462285550268
+23
+-0.16371049840077204
+33
+252.77753219777196
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.355659322363474
+20
+-103.73110101523027
+30
+250.73588276582424
+11
+14.550681763599636
+21
+-116.81153000865763
+31
+248.91144950054974
+12
+18.273779028963133
+22
+-112.1830611579273
+32
+249.78183528876832
+13
+18.273779028963133
+23
+-112.1830611579273
+33
+249.78183528876832
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+15.355659322363474
+20
+-103.73110101523027
+30
+250.73588276582424
+11
+11.295481507071619
+21
+-105.8457642846805
+31
+247.65439459775126
+12
+14.550681763599636
+22
+-116.81153000865763
+32
+248.91144950054974
+13
+14.550681763599636
+23
+-116.81153000865763
+33
+248.91144950054974
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+5.23928790831437
+20
+-121.78194699848548
+30
+250.25307876515456
+11
+0.9442489156356495
+21
+-112.04037995042249
+31
+253.53200851888246
+12
+2.658857200289076
+22
+-122.43876731193058
+32
+257.0768303309419
+13
+2.658857200289076
+23
+-122.43876731193058
+33
+257.0768303309419
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.263277679331958
+20
+-128.61969288312923
+30
+237.71173527215214
+11
+8.097779647598198
+21
+-134.6600668170873
+31
+233.35919788241733
+12
+4.5760788840871625
+22
+-134.95486018611294
+32
+232.77843364973393
+13
+4.5760788840871625
+23
+-134.95486018611294
+33
+232.77843364973393
+70
+0
+ 0
+3DFACE
+ 8
+skull_half
+10
+8.263277679331958
+20
+-128.61969288312923
+30
+237.71173527215214
+11
+12.23736001120347
+21
+-133.37441482792056
+31
+234.39051833752328
+12
+8.097779647598198
+22
+-134.6600668170873
+32
+233.35919788241733
+13
+8.097779647598198
+23
+-134.6600668170873
+33
+233.35919788241733
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.3400301097431475
+20
+-146.3873060216241
+30
+197.5462147984683
+11
+3.2937733624735763
+21
+-148.4450793426672
+31
+199.72476517575745
+12
+2.02820017862717
+22
+-148.22542938143232
+32
+199.48108149300248
+13
+2.02820017862717
+23
+-148.22542938143232
+33
+199.48108149300248
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.2937733624735763
+20
+-148.4450793426672
+30
+199.72476517575745
+11
+2.3400301097431475
+21
+-146.3873060216241
+31
+197.5462147984683
+12
+3.280083267936769
+22
+-146.5503702587736
+32
+197.72692404635427
+13
+3.280083267936769
+23
+-146.5503702587736
+33
+197.72692404635427
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.3540390787705348
+20
+-147.55796121668243
+30
+199.42692956350155
+11
+2.3400301097431475
+21
+-146.3873060216241
+31
+197.5462147984683
+12
+2.02820017862717
+22
+-148.22542938143232
+32
+199.48108149300248
+13
+2.02820017862717
+23
+-148.22542938143232
+33
+199.48108149300248
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.3400301097431475
+20
+-146.3873060216241
+30
+197.5462147984683
+11
+1.3540390787705348
+21
+-147.55796121668243
+31
+199.42692956350155
+12
+1.8325839389124492
+22
+-145.91454142361988
+32
+197.53252470393195
+13
+1.8325839389124492
+23
+-145.91454142361988
+33
+197.53252470393195
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.691885799992747
+20
+-138.01992024073226
+30
+198.98306627618862
+11
+12.098329495574188
+21
+-139.83979014115778
+31
+199.86622948597292
+12
+11.66328871362699
+22
+-140.07008795369958
+32
+201.7472484753295
+13
+11.66328871362699
+23
+-140.07008795369958
+33
+201.7472484753295
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.098329495574188
+20
+-139.83979014115778
+30
+199.86622948597292
+11
+11.691885799992747
+21
+-138.01992024073226
+31
+198.98306627618862
+12
+12.049349379564745
+22
+-138.26117012890276
+32
+197.99524989927758
+13
+12.049349379564745
+23
+-138.26117012890276
+33
+197.99524989927758
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.334667844073687
+20
+-140.53281314904277
+30
+199.05790545965544
+11
+15.983274100794985
+21
+-140.98884540928003
+31
+200.63500435029502
+12
+15.949200976614502
+22
+-142.22521305811443
+32
+200.06914710944
+13
+15.949200976614502
+23
+-142.22521305811443
+33
+200.06914710944
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.286296176710344
+20
+-141.39437643189189
+30
+198.5936591426962
+11
+15.334667844073687
+21
+-140.53281314904277
+31
+199.05790545965544
+12
+15.949200976614502
+22
+-142.22521305811443
+32
+200.06914710944
+13
+15.949200976614502
+23
+-142.22521305811443
+33
+200.06914710944
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.983274100794985
+20
+-140.98884540928003
+30
+200.63500435029502
+11
+14.969902880748746
+21
+-139.85773937621684
+31
+198.74181638801707
+12
+15.475219481318176
+22
+-139.22038941944876
+32
+201.32468089062715
+13
+15.475219481318176
+23
+-139.22038941944876
+33
+201.32468089062715
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.969902880748746
+20
+-139.85773937621684
+30
+198.74181638801707
+11
+15.983274100794985
+21
+-140.98884540928003
+31
+200.63500435029502
+12
+15.334667844073687
+22
+-140.53281314904277
+32
+199.05790545965544
+13
+15.334667844073687
+23
+-140.53281314904277
+33
+199.05790545965544
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.793177849397546
+20
+-140.95325116348423
+30
+200.21669590611504
+11
+13.532442954384749
+21
+-142.46737561925488
+31
+201.78375539409367
+12
+12.586001085407322
+22
+-141.5839081851469
+32
+202.29454803247808
+13
+12.586001085407322
+23
+-141.5839081851469
+33
+202.29454803247808
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.532442954384749
+20
+-142.46737561925488
+30
+201.78375539409367
+11
+12.793177849397546
+21
+-140.95325116348423
+31
+200.21669590611504
+12
+13.493198016712592
+22
+-141.60672500937414
+32
+199.8388492968992
+13
+13.493198016712592
+23
+-141.60672500937414
+33
+199.8388492968992
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.377273899466832
+20
+-141.9535407376396
+30
+198.88388914687653
+11
+13.532442954384749
+21
+-142.46737561925488
+31
+201.78375539409367
+12
+13.493198016712592
+22
+-141.60672500937414
+32
+199.8388492968992
+13
+13.493198016712592
+23
+-141.60672500937414
+33
+199.8388492968992
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.532442954384749
+20
+-142.46737561925488
+30
+201.78375539409367
+11
+14.377273899466832
+21
+-141.9535407376396
+31
+198.88388914687653
+12
+14.77732888426442
+22
+-143.0761284896575
+32
+200.7214040580375
+13
+14.77732888426442
+23
+-143.0761284896575
+33
+200.7214040580375
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.511436825927467
+20
+-140.06795838343746
+30
+198.3414571788967
+11
+14.522388901556917
+21
+-140.60369741631087
+31
+198.53494384835003
+12
+13.730797213006838
+22
+-141.20454045431495
+32
+198.91492002782644
+13
+13.730797213006838
+23
+-141.20454045431495
+33
+198.91492002782644
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.511436825927467
+20
+-140.06795838343746
+30
+198.3414571788967
+11
+13.730797213006838
+21
+-141.20454045431495
+31
+198.91492002782644
+12
+13.280240990584593
+22
+-140.88114999892346
+32
+198.99706059504737
+13
+13.280240990584593
+23
+-140.88114999892346
+33
+198.99706059504737
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.684236241414183
+20
+-141.07828736025323
+30
+198.31164319523853
+11
+14.714962898041232
+21
+-141.48625217745
+31
+198.3721838355234
+12
+14.221815270393384
+22
+-141.42966645336446
+32
+198.48900597557076
+13
+14.221815270393384
+23
+-141.42966645336446
+33
+198.48900597557076
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.11533675732939
+20
+-137.95329511398634
+30
+198.38344013547677
+11
+14.419256856046356
+21
+-138.1507366996395
+31
+198.95051427362293
+12
+14.969902880748746
+22
+-139.85773937621684
+32
+198.74181638801707
+13
+14.969902880748746
+23
+-139.85773937621684
+33
+198.74181638801707
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.969902880748746
+20
+-139.85773937621684
+30
+198.74181638801707
+11
+14.419256856046356
+21
+-138.1507366996395
+31
+198.95051427362293
+12
+14.83999909481067
+22
+-139.13824885222732
+32
+199.0792011622686
+13
+14.83999909481067
+23
+-139.13824885222732
+33
+199.0792011622686
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.611860152865699
+20
+-139.2660230679039
+30
+197.98003868312506
+11
+13.010698240371145
+21
+-140.62103820272426
+31
+199.06520684340873
+12
+12.657189576998668
+22
+-139.95296158932842
+32
+198.8546836118652
+13
+12.657189576998668
+23
+-139.95296158932842
+33
+198.8546836118652
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.611860152865699
+20
+-139.2660230679039
+30
+197.98003868312506
+11
+13.280240990584593
+21
+-140.88114999892346
+31
+198.99706059504737
+12
+13.010698240371145
+22
+-140.62103820272426
+32
+199.06520684340873
+13
+13.010698240371145
+23
+-140.62103820272426
+33
+199.06520684340873
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.684236241414183
+20
+-141.07828736025323
+30
+198.31164319523853
+11
+14.221815270393384
+21
+-141.42966645336446
+31
+198.48900597557076
+12
+13.730797213006838
+22
+-141.20454045431495
+32
+198.91492002782644
+13
+13.730797213006838
+23
+-141.20454045431495
+33
+198.91492002782644
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.522388901556917
+20
+-140.60369741631087
+30
+198.53494384835003
+11
+14.684236241414183
+21
+-141.07828736025323
+31
+198.31164319523853
+12
+13.730797213006838
+22
+-141.20454045431495
+32
+198.91492002782644
+13
+13.730797213006838
+23
+-141.20454045431495
+33
+198.91492002782644
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.993357453957865
+20
+-138.08502424586237
+30
+197.70410722212824
+11
+13.592375146023631
+21
+-138.2064097507555
+31
+197.62683424407612
+12
+12.749065322556753
+22
+-138.86931455065962
+32
+197.6940678194679
+13
+12.749065322556753
+23
+-138.86931455065962
+33
+197.6940678194679
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.592375146023631
+20
+-138.2064097507555
+30
+197.62683424407612
+11
+14.511436825927467
+21
+-140.06795838343746
+31
+198.3414571788967
+12
+12.749065322556753
+22
+-138.86931455065962
+32
+197.6940678194679
+13
+12.749065322556753
+23
+-138.86931455065962
+33
+197.6940678194679
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.657189576998668
+20
+-139.95296158932842
+30
+198.8546836118652
+11
+12.793177849397546
+21
+-140.95325116348423
+31
+200.21669590611504
+12
+12.098329495574188
+22
+-139.83979014115778
+32
+199.86622948597292
+13
+12.098329495574188
+23
+-139.83979014115778
+33
+199.86622948597292
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.657189576998668
+20
+-139.95296158932842
+30
+198.8546836118652
+11
+13.010698240371145
+21
+-140.62103820272426
+31
+199.06520684340873
+12
+12.793177849397546
+22
+-140.95325116348423
+32
+200.21669590611504
+13
+12.793177849397546
+23
+-140.95325116348423
+33
+200.21669590611504
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.221815270393384
+20
+-141.42966645336446
+30
+198.48900597557076
+11
+15.126578407114348
+21
+-141.9924814509887
+31
+198.70439679628294
+12
+14.377273899466832
+22
+-141.9535407376396
+32
+198.88388914687653
+13
+14.377273899466832
+23
+-141.9535407376396
+33
+198.88388914687653
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.221815270393384
+20
+-141.42966645336446
+30
+198.48900597557076
+11
+14.714962898041232
+21
+-141.48625217745
+31
+198.3721838355234
+12
+15.126578407114348
+22
+-141.9924814509887
+32
+198.70439679628294
+13
+15.126578407114348
+23
+-141.9924814509887
+33
+198.70439679628294
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.286296176710344
+20
+-141.39437643189189
+30
+198.5936591426962
+11
+15.126578407114348
+21
+-141.9924814509887
+31
+198.70439679628294
+12
+14.714962898041232
+22
+-141.48625217745
+32
+198.3721838355234
+13
+14.714962898041232
+23
+-141.48625217745
+33
+198.3721838355234
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.684236241414183
+20
+-141.07828736025323
+30
+198.31164319523853
+11
+15.286296176710344
+21
+-141.39437643189189
+31
+198.5936591426962
+12
+14.714962898041232
+22
+-141.48625217745
+32
+198.3721838355234
+13
+14.714962898041232
+23
+-141.48625217745
+33
+198.3721838355234
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.592375146023631
+20
+-138.2064097507555
+30
+197.62683424407612
+11
+13.932193714859311
+21
+-137.31929162477098
+31
+198.48839752692578
+12
+14.11533675732939
+22
+-137.95329511398634
+32
+198.38344013547677
+13
+14.11533675732939
+23
+-137.95329511398634
+33
+198.38344013547677
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.838811497853543
+20
+-137.29434523028164
+30
+197.89759389158192
+11
+13.932193714859311
+21
+-137.31929162477098
+31
+198.48839752692578
+12
+13.592375146023631
+22
+-138.2064097507555
+32
+197.62683424407612
+13
+13.592375146023631
+23
+-138.2064097507555
+33
+197.62683424407612
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.838811497853543
+20
+-137.29434523028164
+30
+197.89759389158192
+11
+13.592375146023631
+21
+-138.2064097507555
+31
+197.62683424407612
+12
+12.993357453957865
+22
+-138.08502424586237
+32
+197.70410722212824
+13
+12.993357453957865
+23
+-138.08502424586237
+33
+197.70410722212824
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.838811497853543
+20
+-137.29434523028164
+30
+197.89759389158192
+11
+12.993357453957865
+21
+-138.08502424586237
+31
+197.70410722212824
+12
+12.049349379564745
+22
+-138.26117012890276
+32
+197.99524989927758
+13
+12.049349379564745
+23
+-138.26117012890276
+33
+197.99524989927758
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.993357453957865
+20
+-138.08502424586237
+30
+197.70410722212824
+11
+12.749065322556753
+21
+-138.86931455065962
+31
+197.6940678194679
+12
+12.049349379564745
+22
+-138.26117012890276
+32
+197.99524989927758
+13
+12.049349379564745
+23
+-138.26117012890276
+33
+197.99524989927758
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.611860152865699
+20
+-139.2660230679039
+30
+197.98003868312506
+11
+12.657189576998668
+21
+-139.95296158932842
+31
+198.8546836118652
+12
+12.049349379564745
+22
+-138.26117012890276
+32
+197.99524989927758
+13
+12.049349379564745
+23
+-138.26117012890276
+33
+197.99524989927758
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.049349379564745
+20
+-138.26117012890276
+30
+197.99524989927758
+11
+12.657189576998668
+21
+-139.95296158932842
+31
+198.8546836118652
+12
+12.098329495574188
+22
+-139.83979014115778
+32
+199.86622948597292
+13
+12.098329495574188
+23
+-139.83979014115778
+33
+199.86622948597292
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.334667844073687
+20
+-140.53281314904277
+30
+199.05790545965544
+11
+15.286296176710344
+21
+-141.39437643189189
+31
+198.5936591426962
+12
+14.684236241414183
+22
+-141.07828736025323
+32
+198.31164319523853
+13
+14.684236241414183
+23
+-141.07828736025323
+33
+198.31164319523853
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.334667844073687
+20
+-140.53281314904277
+30
+199.05790545965544
+11
+14.684236241414183
+21
+-141.07828736025323
+31
+198.31164319523853
+12
+14.522388901556917
+22
+-140.60369741631087
+32
+198.53494384835003
+13
+14.522388901556917
+23
+-140.60369741631087
+33
+198.53494384835003
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.010698240371145
+20
+-140.62103820272426
+30
+199.06520684340873
+11
+13.493198016712592
+21
+-141.60672500937414
+31
+199.8388492968992
+12
+12.793177849397546
+22
+-140.95325116348423
+32
+200.21669590611504
+13
+12.793177849397546
+23
+-140.95325116348423
+33
+200.21669590611504
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.280240990584593
+20
+-140.88114999892346
+30
+198.99706059504737
+11
+13.493198016712592
+21
+-141.60672500937414
+31
+199.8388492968992
+12
+13.010698240371145
+22
+-140.62103820272426
+32
+199.06520684340873
+13
+13.010698240371145
+23
+-140.62103820272426
+33
+199.06520684340873
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.221815270393384
+20
+-141.42966645336446
+30
+198.48900597557076
+11
+14.377273899466832
+21
+-141.9535407376396
+31
+198.88388914687653
+12
+13.730797213006838
+22
+-141.20454045431495
+32
+198.91492002782644
+13
+13.730797213006838
+23
+-141.20454045431495
+33
+198.91492002782644
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.377273899466832
+20
+-141.9535407376396
+30
+198.88388914687653
+11
+13.493198016712592
+21
+-141.60672500937414
+31
+199.8388492968992
+12
+13.730797213006838
+22
+-141.20454045431495
+32
+198.91492002782644
+13
+13.730797213006838
+23
+-141.20454045431495
+33
+198.91492002782644
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.592375146023631
+20
+-138.2064097507555
+30
+197.62683424407612
+11
+14.969902880748746
+21
+-139.85773937621684
+31
+198.74181638801707
+12
+14.511436825927467
+22
+-140.06795838343746
+32
+198.3414571788967
+13
+14.511436825927467
+23
+-140.06795838343746
+33
+198.3414571788967
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.592375146023631
+20
+-138.2064097507555
+30
+197.62683424407612
+11
+14.11533675732939
+21
+-137.95329511398634
+31
+198.38344013547677
+12
+14.969902880748746
+22
+-139.85773937621684
+32
+198.74181638801707
+13
+14.969902880748746
+23
+-139.85773937621684
+33
+198.74181638801707
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.049349379564745
+20
+-138.26117012890276
+30
+197.99524989927758
+11
+12.749065322556753
+21
+-138.86931455065962
+31
+197.6940678194679
+12
+12.611860152865699
+22
+-139.2660230679039
+32
+197.98003868312506
+13
+12.611860152865699
+23
+-139.2660230679039
+33
+197.98003868312506
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.511436825927467
+20
+-140.06795838343746
+30
+198.3414571788967
+11
+14.969902880748746
+21
+-139.85773937621684
+31
+198.74181638801707
+12
+14.522388901556917
+22
+-140.60369741631087
+32
+198.53494384835003
+13
+14.522388901556917
+23
+-140.60369741631087
+33
+198.53494384835003
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.969902880748746
+20
+-139.85773937621684
+30
+198.74181638801707
+11
+15.334667844073687
+21
+-140.53281314904277
+31
+199.05790545965544
+12
+14.522388901556917
+22
+-140.60369741631087
+32
+198.53494384835003
+13
+14.522388901556917
+23
+-140.60369741631087
+33
+198.53494384835003
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.730797213006838
+20
+-141.20454045431495
+30
+198.91492002782644
+11
+13.493198016712592
+21
+-141.60672500937414
+31
+199.8388492968992
+12
+13.280240990584593
+22
+-140.88114999892346
+32
+198.99706059504737
+13
+13.280240990584593
+23
+-140.88114999892346
+33
+198.99706059504737
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.969902880748746
+20
+-139.85773937621684
+30
+198.74181638801707
+11
+14.83999909481067
+21
+-139.13824885222732
+31
+199.0792011622686
+12
+15.475219481318176
+22
+-139.22038941944876
+32
+201.32468089062715
+13
+15.475219481318176
+23
+-139.22038941944876
+33
+201.32468089062715
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.749065322556753
+20
+-138.86931455065962
+30
+197.6940678194679
+11
+13.280240990584593
+21
+-140.88114999892346
+31
+198.99706059504737
+12
+12.611860152865699
+22
+-139.2660230679039
+32
+197.98003868312506
+13
+12.611860152865699
+23
+-139.2660230679039
+33
+197.98003868312506
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.749065322556753
+20
+-138.86931455065962
+30
+197.6940678194679
+11
+14.511436825927467
+21
+-140.06795838343746
+31
+198.3414571788967
+12
+13.280240990584593
+22
+-140.88114999892346
+32
+198.99706059504737
+13
+13.280240990584593
+23
+-140.88114999892346
+33
+198.99706059504737
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.213861487491783
+20
+-141.34843855911578
+30
+209.6205739556043
+11
+16.57711997936905
+21
+-141.2912443863851
+31
+212.4337362707553
+12
+16.589897400936742
+22
+-142.26080730391305
+32
+211.43892273441418
+13
+16.589897400936742
+23
+-142.26080730391305
+33
+211.43892273441418
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.213861487491783
+20
+-141.34843855911578
+30
+209.6205739556043
+11
+16.658043649297696
+21
+-139.8775139572176
+31
+209.88677023826477
+12
+16.57711997936905
+22
+-141.2912443863851
+32
+212.4337362707553
+13
+16.57711997936905
+23
+-141.2912443863851
+33
+212.4337362707553
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.574686184784756
+20
+-143.07643271398274
+30
+209.02307738515327
+11
+16.589897400936742
+21
+-142.26080730391305
+31
+211.43892273441418
+12
+15.888051887683467
+22
+-143.47222855825825
+32
+211.25517124329767
+13
+15.888051887683467
+23
+-143.47222855825825
+33
+211.25517124329767
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.574686184784756
+20
+-143.07643271398274
+30
+209.02307738515327
+11
+17.213861487491783
+21
+-141.34843855911578
+31
+209.6205739556043
+12
+16.589897400936742
+22
+-142.26080730391305
+32
+211.43892273441418
+13
+16.589897400936742
+23
+-142.26080730391305
+33
+211.43892273441418
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.836623326922187
+20
+-142.70345369393524
+30
+207.27774244387302
+11
+17.213861487491783
+21
+-141.34843855911578
+31
+209.6205739556043
+12
+16.574686184784756
+22
+-143.07643271398274
+32
+209.02307738515327
+13
+16.574686184784756
+23
+-143.07643271398274
+33
+209.02307738515327
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.836623326922187
+20
+-142.70345369393524
+30
+207.27774244387302
+11
+17.10890409604299
+21
+-140.46314577906878
+31
+207.60995540463318
+12
+17.213861487491783
+22
+-141.34843855911578
+32
+209.6205739556043
+13
+17.213861487491783
+23
+-141.34843855911578
+33
+209.6205739556043
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.902365081033858
+20
+-145.0964822189677
+30
+206.8655184861529
+11
+14.43811876407484
+21
+-145.1746678699895
+31
+208.73862764311036
+12
+13.330742228209239
+22
+-145.23368738865938
+32
+208.3166685070539
+13
+13.330742228209239
+23
+-145.23368738865938
+33
+208.3166685070539
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.902365081033858
+20
+-145.0964822189677
+30
+206.8655184861529
+11
+13.330742228209239
+21
+-145.23368738865938
+31
+208.3166685070539
+12
+14.139370478849536
+22
+-145.0830963487539
+32
+206.68328811665225
+13
+14.139370478849536
+23
+-145.0830963487539
+33
+206.68328811665225
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.836623326922187
+20
+-142.70345369393524
+30
+207.27774244387302
+11
+16.574686184784756
+21
+-143.07643271398274
+31
+209.02307738515327
+12
+15.787353636757224
+22
+-144.56986991578611
+32
+208.76752895379943
+13
+15.787353636757224
+23
+-144.56986991578611
+33
+208.76752895379943
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.05689638697066
+20
+-144.34748193564334
+30
+207.07999663389649
+11
+16.836623326922187
+21
+-142.70345369393524
+31
+207.27774244387302
+12
+15.787353636757224
+22
+-144.56986991578611
+32
+208.76752895379943
+13
+15.787353636757224
+23
+-144.56986991578611
+33
+208.76752895379943
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.05689638697066
+20
+-144.34748193564334
+30
+207.07999663389649
+11
+15.787353636757224
+21
+-144.56986991578611
+31
+208.76752895379943
+12
+14.43811876407484
+22
+-145.1746678699895
+32
+208.73862764311036
+13
+14.43811876407484
+23
+-145.1746678699895
+33
+208.73862764311036
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.05689638697066
+20
+-144.34748193564334
+30
+207.07999663389649
+11
+14.43811876407484
+21
+-145.1746678699895
+31
+208.73862764311036
+12
+14.902365081033858
+22
+-145.0964822189677
+32
+206.8655184861529
+13
+14.902365081033858
+23
+-145.0964822189677
+33
+206.8655184861529
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.787353636757224
+20
+-144.56986991578611
+30
+208.76752895379943
+11
+15.11501788283882
+21
+-144.4238422407274
+31
+211.0221354118489
+12
+13.864351690821385
+22
+-145.0143416517479
+32
+210.50130337080415
+13
+13.864351690821385
+23
+-145.0143416517479
+33
+210.50130337080415
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.787353636757224
+20
+-144.56986991578611
+30
+208.76752895379943
+11
+13.864351690821385
+21
+-145.0143416517479
+31
+210.50130337080415
+12
+14.43811876407484
+22
+-145.1746678699895
+32
+208.73862764311036
+13
+14.43811876407484
+23
+-145.1746678699895
+33
+208.73862764311036
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.574686184784756
+20
+-143.07643271398274
+30
+209.02307738515327
+11
+15.888051887683467
+21
+-143.47222855825825
+31
+211.25517124329767
+12
+15.11501788283882
+22
+-144.4238422407274
+32
+211.0221354118489
+13
+15.11501788283882
+23
+-144.4238422407274
+33
+211.0221354118489
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.787353636757224
+20
+-144.56986991578611
+30
+208.76752895379943
+11
+16.574686184784756
+21
+-143.07643271398274
+31
+209.02307738515327
+12
+15.11501788283882
+22
+-144.4238422407274
+32
+211.0221354118489
+13
+15.11501788283882
+23
+-144.4238422407274
+33
+211.0221354118489
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.43811876407484
+20
+-145.1746678699895
+30
+208.73862764311036
+11
+13.864351690821385
+21
+-145.0143416517479
+31
+210.50130337080415
+12
+12.722293582129238
+22
+-145.36115738001328
+32
+209.92814474619675
+13
+12.722293582129238
+23
+-145.36115738001328
+33
+209.92814474619675
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.43811876407484
+20
+-145.1746678699895
+30
+208.73862764311036
+11
+12.722293582129238
+21
+-145.36115738001328
+31
+209.92814474619675
+12
+13.330742228209239
+22
+-145.23368738865938
+32
+208.3166685070539
+13
+13.330742228209239
+23
+-145.23368738865938
+33
+208.3166685070539
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.589897400936742
+20
+-142.26080730391305
+30
+211.43892273441418
+11
+16.236997186210345
+21
+-142.19813709336717
+31
+212.3616351061945
+12
+15.497123632577065
+22
+-142.99581326837793
+32
+212.39966314657443
+13
+15.497123632577065
+23
+-142.99581326837793
+33
+212.39966314657443
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.888051887683467
+20
+-143.47222855825825
+30
+211.25517124329767
+11
+16.589897400936742
+21
+-142.26080730391305
+31
+211.43892273441418
+12
+15.497123632577065
+22
+-142.99581326837793
+32
+212.39966314657443
+13
+15.497123632577065
+23
+-142.99581326837793
+33
+212.39966314657443
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.888051887683467
+20
+-143.47222855825825
+30
+211.25517124329767
+11
+15.497123632577065
+21
+-142.99581326837793
+31
+212.39966314657443
+12
+14.555245128445234
+22
+-143.74755157060977
+32
+212.46081223550502
+13
+14.555245128445234
+23
+-143.74755157060977
+33
+212.46081223550502
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.888051887683467
+20
+-143.47222855825825
+30
+211.25517124329767
+11
+14.555245128445234
+21
+-143.74755157060977
+31
+212.46081223550502
+12
+15.11501788283882
+22
+-144.4238422407274
+32
+211.0221354118489
+13
+15.11501788283882
+23
+-144.4238422407274
+33
+211.0221354118489
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.589897400936742
+20
+-142.26080730391305
+30
+211.43892273441418
+11
+16.384545982884738
+21
+-141.6432319281422
+31
+212.4115278951733
+12
+16.236997186210345
+22
+-142.19813709336717
+32
+212.3616351061945
+13
+16.236997186210345
+23
+-142.19813709336717
+33
+212.3616351061945
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.589897400936742
+20
+-142.26080730391305
+30
+211.43892273441418
+11
+16.57711997936905
+21
+-141.2912443863851
+31
+212.4337362707553
+12
+16.384545982884738
+22
+-141.6432319281422
+32
+212.4115278951733
+13
+16.384545982884738
+23
+-141.6432319281422
+33
+212.4115278951733
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.497123632577065
+20
+-142.99581326837793
+30
+212.39966314657443
+11
+14.47432145851659
+21
+-143.4351131908477
+31
+212.32026059826038
+12
+14.555245128445234
+22
+-143.74755157060977
+32
+212.46081223550502
+13
+14.555245128445234
+23
+-143.74755157060977
+33
+212.46081223550502
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.565269880938027
+20
+-142.44182077612206
+30
+212.15293722058897
+11
+14.47432145851659
+21
+-143.4351131908477
+31
+212.32026059826038
+12
+15.497123632577065
+22
+-142.99581326837793
+32
+212.39966314657443
+13
+15.497123632577065
+23
+-142.99581326837793
+33
+212.39966314657443
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.11501788283882
+20
+-144.4238422407274
+30
+211.0221354118489
+11
+14.555245128445234
+21
+-143.74755157060977
+31
+212.46081223550502
+12
+13.864351690821385
+22
+-145.0143416517479
+32
+210.50130337080415
+13
+13.864351690821385
+23
+-145.0143416517479
+33
+210.50130337080415
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.555245128445234
+20
+-143.74755157060977
+30
+212.46081223550502
+11
+13.583552640655473
+21
+-144.62097960205753
+31
+212.0665375128451
+12
+13.864351690821385
+22
+-145.0143416517479
+32
+210.50130337080415
+13
+13.864351690821385
+23
+-145.0143416517479
+33
+210.50130337080415
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.555245128445234
+20
+-143.74755157060977
+30
+212.46081223550502
+11
+13.243734071819793
+21
+-144.62037115341144
+31
+212.02546722923455
+12
+13.583552640655473
+22
+-144.62097960205753
+32
+212.0665375128451
+13
+13.583552640655473
+23
+-144.62097960205753
+33
+212.0665375128451
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.47432145851659
+20
+-143.4351131908477
+30
+212.32026059826038
+11
+13.243734071819793
+21
+-144.62037115341144
+31
+212.02546722923455
+12
+14.555245128445234
+22
+-143.74755157060977
+32
+212.46081223550502
+13
+14.555245128445234
+23
+-143.74755157060977
+33
+212.46081223550502
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.350531459374356
+20
+-145.12021171616595
+30
+210.85268246391544
+11
+13.243734071819793
+21
+-144.62037115341144
+31
+212.02546722923455
+12
+12.30854850279483
+22
+-144.6666132505133
+32
+210.94942579864218
+13
+12.30854850279483
+23
+-144.6666132505133
+33
+210.94942579864218
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.583552640655473
+20
+-144.62097960205753
+30
+212.0665375128451
+11
+13.243734071819793
+21
+-144.62037115341144
+31
+212.02546722923455
+12
+12.350531459374356
+22
+-145.12021171616595
+32
+210.85268246391544
+13
+12.350531459374356
+23
+-145.12021171616595
+33
+210.85268246391544
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.864351690821385
+20
+-145.0143416517479
+30
+210.50130337080415
+11
+13.583552640655473
+21
+-144.62097960205753
+31
+212.0665375128451
+12
+12.350531459374356
+22
+-145.12021171616595
+32
+210.85268246391544
+13
+12.350531459374356
+23
+-145.12021171616595
+33
+210.85268246391544
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.864351690821385
+20
+-145.0143416517479
+30
+210.50130337080415
+11
+12.350531459374356
+21
+-145.12021171616595
+31
+210.85268246391544
+12
+12.722293582129238
+22
+-145.36115738001328
+32
+209.92814474619675
+13
+12.722293582129238
+23
+-145.36115738001328
+33
+209.92814474619675
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.66328871362699
+20
+-140.07008795369958
+30
+201.7472484753295
+11
+12.793177849397546
+21
+-140.95325116348423
+31
+200.21669590611504
+12
+12.586001085407322
+22
+-141.5839081851469
+32
+202.29454803247808
+13
+12.586001085407322
+23
+-141.5839081851469
+33
+202.29454803247808
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.793177849397546
+20
+-140.95325116348423
+30
+200.21669590611504
+11
+11.66328871362699
+21
+-140.07008795369958
+31
+201.7472484753295
+12
+12.098329495574188
+22
+-139.83979014115778
+32
+199.86622948597292
+13
+12.098329495574188
+23
+-139.83979014115778
+33
+199.86622948597292
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.365090276377709
+20
+-143.01345827911103
+30
+199.85193094278958
+11
+14.77732888426442
+21
+-143.0761284896575
+31
+200.7214040580375
+12
+15.126578407114348
+22
+-141.9924814509887
+32
+198.70439679628294
+13
+15.126578407114348
+23
+-141.9924814509887
+33
+198.70439679628294
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.126578407114348
+20
+-141.9924814509887
+30
+198.70439679628294
+11
+14.77732888426442
+21
+-143.0761284896575
+31
+200.7214040580375
+12
+14.377273899466832
+22
+-141.9535407376396
+32
+198.88388914687653
+13
+14.377273899466832
+23
+-141.9535407376396
+33
+198.88388914687653
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.286296176710344
+20
+-141.39437643189189
+30
+198.5936591426962
+11
+15.949200976614502
+21
+-142.22521305811443
+31
+200.06914710944
+12
+15.365090276377709
+22
+-143.01345827911103
+32
+199.85193094278958
+13
+15.365090276377709
+23
+-143.01345827911103
+33
+199.85193094278958
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.286296176710344
+20
+-141.39437643189189
+30
+198.5936591426962
+11
+15.365090276377709
+21
+-143.01345827911103
+31
+199.85193094278958
+12
+15.126578407114348
+22
+-141.9924814509887
+32
+198.70439679628294
+13
+15.126578407114348
+23
+-141.9924814509887
+33
+198.70439679628294
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.419256856046356
+20
+-138.1507366996395
+30
+198.95051427362293
+11
+15.475219481318176
+21
+-139.22038941944876
+31
+201.32468089062715
+12
+14.83999909481067
+22
+-139.13824885222732
+32
+199.0792011622686
+13
+14.83999909481067
+23
+-139.13824885222732
+33
+199.0792011622686
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.419256856046356
+20
+-138.1507366996395
+30
+198.95051427362293
+11
+14.873767994668102
+21
+-137.892146025056
+31
+201.17287295343053
+12
+15.475219481318176
+22
+-139.22038941944876
+32
+201.32468089062715
+13
+15.475219481318176
+23
+-139.22038941944876
+33
+201.32468089062715
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.11533675732939
+20
+-137.95329511398634
+30
+198.38344013547677
+11
+14.873767994668102
+21
+-137.892146025056
+31
+201.17287295343053
+12
+14.419256856046356
+22
+-138.1507366996395
+32
+198.95051427362293
+13
+14.419256856046356
+23
+-138.1507366996395
+33
+198.95051427362293
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.11533675732939
+20
+-137.95329511398634
+30
+198.38344013547677
+11
+14.083088979087139
+21
+-136.81397502420188
+31
+199.63410632749455
+12
+14.873767994668102
+22
+-137.892146025056
+32
+201.17287295343053
+13
+14.873767994668102
+23
+-137.892146025056
+33
+201.17287295343053
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.083088979087139
+20
+-136.81397502420188
+30
+199.63410632749455
+11
+14.11533675732939
+21
+-137.95329511398634
+31
+198.38344013547677
+12
+13.932193714859311
+22
+-137.31929162477098
+32
+198.48839752692578
+13
+13.932193714859311
+23
+-137.31929162477098
+33
+198.48839752692578
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.083088979087139
+20
+-136.81397502420188
+30
+199.63410632749455
+11
+12.838811497853543
+21
+-137.29434523028164
+31
+197.89759389158192
+12
+12.644716379754016
+22
+-136.9359689777408
+32
+198.553197307733
+13
+12.644716379754016
+23
+-136.9359689777408
+33
+198.553197307733
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.76213231827994
+20
+-138.70655453783516
+30
+205.37329818164355
+11
+11.725654699850212
+21
+-139.9347081299476
+31
+204.94190809157251
+12
+13.711326856332267
+22
+-140.20607622609955
+32
+206.24459664282978
+13
+13.711326856332267
+23
+-140.20607622609955
+33
+206.24459664282978
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.803825700703946
+20
+-137.7126536744631
+30
+203.59936615399752
+11
+11.725654699850212
+21
+-139.9347081299476
+31
+204.94190809157251
+12
+13.76213231827994
+22
+-138.70655453783516
+32
+205.37329818164355
+13
+13.76213231827994
+23
+-138.70655453783516
+33
+205.37329818164355
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.586001085407322
+20
+-141.5839081851469
+30
+202.29454803247808
+11
+12.591781347545073
+21
+-142.50905435151176
+31
+203.96230577138317
+12
+11.467976698235331
+22
+-140.56384402999424
+32
+204.86463511352028
+13
+11.467976698235331
+23
+-140.56384402999424
+33
+204.86463511352028
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.66328871362699
+20
+-140.07008795369958
+30
+201.7472484753295
+11
+12.586001085407322
+21
+-141.5839081851469
+31
+202.29454803247808
+12
+11.467976698235331
+22
+-140.56384402999424
+32
+204.86463511352028
+13
+11.467976698235331
+23
+-140.56384402999424
+33
+204.86463511352028
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.498644754192245
+20
+-143.79501056500123
+30
+201.53550834649272
+11
+14.696709438658837
+21
+-143.61034640091606
+31
+202.06455444425896
+12
+15.365090276377709
+22
+-143.01345827911103
+32
+199.85193094278958
+13
+15.365090276377709
+23
+-143.01345827911103
+33
+199.85193094278958
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.365090276377709
+20
+-143.01345827911103
+30
+199.85193094278958
+11
+14.696709438658837
+21
+-143.61034640091606
+31
+202.06455444425896
+12
+14.77732888426442
+22
+-143.0761284896575
+32
+200.7214040580375
+13
+14.77732888426442
+23
+-143.0761284896575
+33
+200.7214040580375
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.949200976614502
+20
+-142.22521305811443
+30
+200.06914710944
+11
+16.342867250628263
+21
+-142.59484561060856
+31
+201.7524202888202
+12
+15.498644754192245
+22
+-143.79501056500123
+32
+201.53550834649272
+13
+15.498644754192245
+23
+-143.79501056500123
+33
+201.53550834649272
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.365090276377709
+20
+-143.01345827911103
+30
+199.85193094278958
+11
+15.949200976614502
+21
+-142.22521305811443
+31
+200.06914710944
+12
+15.498644754192245
+22
+-143.79501056500123
+32
+201.53550834649272
+13
+15.498644754192245
+23
+-143.79501056500123
+33
+201.53550834649272
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.873767994668102
+20
+-137.892146025056
+30
+201.17287295343053
+11
+14.993936602268903
+21
+-138.12092271598274
+31
+203.42747941148
+12
+16.02860352492793
+22
+-139.94687710286888
+32
+203.6754222347568
+13
+16.02860352492793
+23
+-139.94687710286888
+33
+203.6754222347568
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.873767994668102
+20
+-137.892146025056
+30
+201.17287295343053
+11
+16.02860352492793
+21
+-139.94687710286888
+31
+203.6754222347568
+12
+15.475219481318176
+22
+-139.22038941944876
+32
+201.32468089062715
+13
+15.475219481318176
+23
+-139.22038941944876
+33
+201.32468089062715
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.993936602268903
+20
+-138.12092271598274
+30
+203.42747941148
+11
+14.083088979087139
+21
+-136.81397502420188
+31
+199.63410632749455
+12
+13.918807844645565
+22
+-137.32933102743218
+32
+201.7040486214586
+13
+13.918807844645565
+23
+-137.32933102743218
+33
+201.7040486214586
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.083088979087139
+20
+-136.81397502420188
+30
+199.63410632749455
+11
+14.993936602268903
+21
+-138.12092271598274
+31
+203.42747941148
+12
+14.873767994668102
+22
+-137.892146025056
+32
+201.17287295343053
+13
+14.873767994668102
+23
+-137.892146025056
+33
+201.17287295343053
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.918807844645565
+20
+-137.32933102743218
+30
+201.7040486214586
+11
+12.644716379754016
+21
+-136.9359689777408
+31
+198.553197307733
+12
+12.758800500894026
+22
+-137.3685759651042
+32
+201.13088999685118
+13
+12.758800500894026
+23
+-137.3685759651042
+33
+201.13088999685118
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.083088979087139
+20
+-136.81397502420188
+30
+199.63410632749455
+11
+12.644716379754016
+21
+-136.9359689777408
+31
+198.553197307733
+12
+13.918807844645565
+22
+-137.32933102743218
+32
+201.7040486214586
+13
+13.918807844645565
+23
+-137.32933102743218
+33
+201.7040486214586
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.758800500894026
+20
+-137.3685759651042
+30
+201.13088999685118
+11
+11.691885799992747
+21
+-138.01992024073226
+31
+198.98306627618862
+12
+11.631953608353887
+22
+-138.60494361393896
+32
+201.74907382126798
+13
+11.631953608353887
+23
+-138.60494361393896
+33
+201.74907382126798
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.644716379754016
+20
+-136.9359689777408
+30
+198.553197307733
+11
+11.691885799992747
+21
+-138.01992024073226
+31
+198.98306627618862
+12
+12.758800500894026
+22
+-137.3685759651042
+32
+201.13088999685118
+13
+12.758800500894026
+23
+-137.3685759651042
+33
+201.13088999685118
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.691885799992747
+20
+-138.01992024073226
+30
+198.98306627618862
+11
+11.66328871362699
+21
+-140.07008795369958
+31
+201.7472484753295
+12
+11.467976698235331
+22
+-140.56384402999424
+32
+204.86463511352028
+13
+11.467976698235331
+23
+-140.56384402999424
+33
+204.86463511352028
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.691885799992747
+20
+-138.01992024073226
+30
+198.98306627618862
+11
+11.467976698235331
+21
+-140.56384402999424
+31
+204.86463511352028
+12
+11.631953608353887
+22
+-138.60494361393896
+32
+201.74907382126798
+13
+11.631953608353887
+23
+-138.60494361393896
+33
+201.74907382126798
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.591781347545073
+20
+-142.50905435151176
+30
+203.96230577138317
+11
+12.449100140039306
+21
+-143.42781180709306
+31
+205.8369360499553
+12
+11.872899272201545
+22
+-141.84827912186958
+32
+206.71401477327964
+13
+11.872899272201545
+23
+-141.84827912186958
+33
+206.71401477327964
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.591781347545073
+20
+-142.50905435151176
+30
+203.96230577138317
+11
+11.872899272201545
+21
+-141.84827912186958
+31
+206.71401477327964
+12
+11.467976698235331
+22
+-140.56384402999424
+32
+204.86463511352028
+13
+11.467976698235331
+23
+-140.56384402999424
+33
+204.86463511352028
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.498644754192245
+20
+-143.79501056500123
+30
+201.53550834649272
+11
+15.437191440938195
+21
+-144.53123342675866
+31
+203.39857810078928
+12
+14.720134711532918
+22
+-144.37364522742413
+32
+204.00702674686949
+13
+14.720134711532918
+23
+-144.37364522742413
+33
+204.00702674686949
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.498644754192245
+20
+-143.79501056500123
+30
+201.53550834649272
+11
+14.720134711532918
+21
+-144.37364522742413
+31
+204.00702674686949
+12
+14.696709438658837
+22
+-143.61034640091606
+32
+202.06455444425896
+13
+14.696709438658837
+23
+-143.61034640091606
+33
+202.06455444425896
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.342867250628263
+20
+-142.59484561060856
+30
+201.7524202888202
+11
+16.3705516640249
+21
+-143.55649869573872
+31
+204.24310482154883
+12
+15.437191440938195
+22
+-144.53123342675866
+32
+203.39857810078928
+13
+15.437191440938195
+23
+-144.53123342675866
+33
+203.39857810078928
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.498644754192245
+20
+-143.79501056500123
+30
+201.53550834649272
+11
+16.342867250628263
+21
+-142.59484561060856
+31
+201.7524202888202
+12
+15.437191440938195
+22
+-144.53123342675866
+32
+203.39857810078928
+13
+15.437191440938195
+23
+-144.53123342675866
+33
+203.39857810078928
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.993936602268903
+20
+-138.12092271598274
+30
+203.42747941148
+11
+15.487692678562828
+21
+-138.35365432310888
+31
+205.5105033513347
+12
+16.498934328347776
+22
+-139.92527717593353
+32
+205.80316715009877
+13
+16.498934328347776
+23
+-139.92527717593353
+33
+205.80316715009877
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.993936602268903
+20
+-138.12092271598274
+30
+203.42747941148
+11
+16.498934328347776
+21
+-139.92527717593353
+31
+205.80316715009877
+12
+16.02860352492793
+22
+-139.94687710286888
+32
+203.6754222347568
+13
+16.02860352492793
+23
+-139.94687710286888
+33
+203.6754222347568
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.487692678562828
+20
+-138.35365432310888
+30
+205.5105033513347
+11
+13.918807844645565
+21
+-137.32933102743218
+31
+201.7040486214586
+12
+14.043539817091954
+22
+-137.7379042932755
+32
+203.94618188226335
+13
+14.043539817091954
+23
+-137.7379042932755
+33
+203.94618188226335
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.487692678562828
+20
+-138.35365432310888
+30
+205.5105033513347
+11
+14.993936602268903
+21
+-138.12092271598274
+31
+203.42747941148
+12
+13.918807844645565
+22
+-137.32933102743218
+32
+201.7040486214586
+13
+13.918807844645565
+23
+-137.32933102743218
+33
+201.7040486214586
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.236997186210345
+20
+-142.19813709336717
+30
+212.3616351061945
+11
+15.565269880938027
+21
+-142.44182077612206
+31
+212.15293722058897
+12
+15.497123632577065
+22
+-142.99581326837793
+32
+212.39966314657443
+13
+15.497123632577065
+23
+-142.99581326837793
+33
+212.39966314657443
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.384545982884738
+20
+-141.6432319281422
+30
+212.4115278951733
+11
+15.565269880938027
+21
+-142.44182077612206
+31
+212.15293722058897
+12
+16.236997186210345
+22
+-142.19813709336717
+32
+212.3616351061945
+13
+16.236997186210345
+23
+-142.19813709336717
+33
+212.3616351061945
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.083088979087139
+20
+-136.81397502420188
+30
+199.63410632749455
+11
+13.932193714859311
+21
+-137.31929162477098
+31
+198.48839752692578
+12
+12.838811497853543
+22
+-137.29434523028164
+32
+197.89759389158192
+13
+12.838811497853543
+23
+-137.29434523028164
+33
+197.89759389158192
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.049349379564745
+20
+-138.26117012890276
+30
+197.99524989927758
+11
+11.691885799992747
+21
+-138.01992024073226
+31
+198.98306627618862
+12
+12.644716379754016
+22
+-136.9359689777408
+32
+198.553197307733
+13
+12.644716379754016
+23
+-136.9359689777408
+33
+198.553197307733
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.838811497853543
+20
+-137.29434523028164
+30
+197.89759389158192
+11
+12.049349379564745
+21
+-138.26117012890276
+31
+197.99524989927758
+12
+12.644716379754016
+22
+-136.9359689777408
+32
+198.553197307733
+13
+12.644716379754016
+23
+-136.9359689777408
+33
+198.553197307733
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.532442954384749
+20
+-142.46737561925488
+30
+201.78375539409367
+11
+12.591781347545073
+21
+-142.50905435151176
+31
+203.96230577138317
+12
+12.586001085407322
+22
+-141.5839081851469
+32
+202.29454803247808
+13
+12.586001085407322
+23
+-141.5839081851469
+33
+202.29454803247808
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.720134711532918
+20
+-144.37364522742413
+30
+204.00702674686949
+11
+13.469164295192423
+21
+-143.92156788338673
+31
+204.96198689689226
+12
+14.696709438658837
+22
+-143.61034640091606
+32
+202.06455444425896
+13
+14.696709438658837
+23
+-143.61034640091606
+33
+202.06455444425896
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.696709438658837
+20
+-143.61034640091606
+30
+202.06455444425896
+11
+13.469164295192423
+21
+-143.92156788338673
+31
+204.96198689689226
+12
+13.558910470489225
+22
+-143.05939615189098
+32
+203.06575669138374
+13
+13.558910470489225
+23
+-143.05939615189098
+33
+203.06575669138374
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.558910470489225
+20
+-143.05939615189098
+30
+203.06575669138374
+11
+13.469164295192423
+21
+-143.92156788338673
+31
+204.96198689689226
+12
+12.449100140039306
+22
+-143.42781180709306
+32
+205.8369360499553
+13
+12.449100140039306
+23
+-143.42781180709306
+33
+205.8369360499553
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.558910470489225
+20
+-143.05939615189098
+30
+203.06575669138374
+11
+12.449100140039306
+21
+-143.42781180709306
+31
+205.8369360499553
+12
+12.591781347545073
+22
+-142.50905435151176
+32
+203.96230577138317
+13
+12.591781347545073
+23
+-142.50905435151176
+33
+203.96230577138317
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.720134711532918
+20
+-144.37364522742413
+30
+204.00702674686949
+11
+14.139370478849536
+21
+-145.0830963487539
+31
+206.68328811665225
+12
+13.263812877140428
+22
+-144.64288375331512
+32
+207.0273658260102
+13
+13.263812877140428
+23
+-144.64288375331512
+33
+207.0273658260102
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.720134711532918
+20
+-144.37364522742413
+30
+204.00702674686949
+11
+13.263812877140428
+21
+-144.64288375331512
+31
+207.0273658260102
+12
+13.469164295192423
+22
+-143.92156788338673
+32
+204.96198689689226
+13
+13.469164295192423
+23
+-143.92156788338673
+33
+204.96198689689226
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.469164295192423
+20
+-143.92156788338673
+30
+204.96198689689226
+11
+13.263812877140428
+21
+-144.64288375331512
+31
+207.0273658260102
+12
+12.483781712865865
+22
+-144.19780356870768
+32
+207.3863505271978
+13
+12.483781712865865
+23
+-144.19780356870768
+33
+207.3863505271978
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.469164295192423
+20
+-143.92156788338673
+30
+204.96198689689226
+11
+12.483781712865865
+21
+-144.19780356870768
+31
+207.3863505271978
+12
+12.449100140039306
+22
+-143.42781180709306
+32
+205.8369360499553
+13
+12.449100140039306
+23
+-143.42781180709306
+33
+205.8369360499553
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.811127084456913
+20
+-142.62952718343672
+30
+208.20836464805245
+11
+11.913969555811954
+21
+-143.03384130875693
+31
+208.3285332556531
+12
+11.93039766925612
+22
+-144.17498674448038
+32
+209.8076719142732
+13
+11.93039766925612
+23
+-144.17498674448038
+33
+209.8076719142732
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.128737277710677
+20
+-143.5066059067615
+30
+210.1328877156033
+11
+12.811127084456913
+21
+-142.62952718343672
+31
+208.20836464805245
+12
+11.93039766925612
+22
+-144.17498674448038
+32
+209.8076719142732
+13
+11.93039766925612
+23
+-144.17498674448038
+33
+209.8076719142732
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.110150293670184
+20
+-140.50695408158674
+30
+207.92726137356357
+11
+15.339535433242336
+21
+-141.47286630723914
+31
+210.1995128423495
+12
+16.404929012528424
+22
+-140.58209748937819
+32
+210.5901368731331
+13
+16.404929012528424
+23
+-140.58209748937819
+33
+210.5901368731331
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.110150293670184
+20
+-140.50695408158674
+30
+207.92726137356357
+11
+16.404929012528424
+21
+-140.58209748937819
+31
+210.5901368731331
+12
+15.718903164073211
+22
+-139.21339226002053
+32
+208.25704053973968
+13
+15.718903164073211
+23
+-139.21339226002053
+33
+208.25704053973968
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.339535433242336
+20
+-141.47286630723914
+30
+210.1995128423495
+11
+14.393397788587945
+21
+-141.3539145969299
+31
+207.8210870848226
+12
+14.512045274573556
+22
+-142.12147256396042
+32
+210.19829594505723
+13
+14.512045274573556
+23
+-142.12147256396042
+33
+210.19829594505723
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.393397788587945
+20
+-141.3539145969299
+30
+207.8210870848226
+11
+15.339535433242336
+21
+-141.47286630723914
+31
+210.1995128423495
+12
+15.110150293670184
+22
+-140.50695408158674
+32
+207.92726137356357
+13
+15.110150293670184
+23
+-140.50695408158674
+33
+207.92726137356357
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.393397788587945
+20
+-141.3539145969299
+30
+207.8210870848226
+11
+12.811127084456913
+21
+-142.62952718343672
+31
+208.20836464805245
+12
+13.128737277710677
+22
+-143.5066059067615
+32
+210.1328877156033
+13
+13.128737277710677
+23
+-143.5066059067615
+33
+210.1328877156033
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.393397788587945
+20
+-141.3539145969299
+30
+207.8210870848226
+11
+13.128737277710677
+21
+-143.5066059067615
+31
+210.1328877156033
+12
+14.512045274573556
+22
+-142.12147256396042
+32
+210.19829594505723
+13
+14.512045274573556
+23
+-142.12147256396042
+33
+210.19829594505723
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.128737277710677
+20
+-143.5066059067615
+30
+210.1328877156033
+11
+13.243734071819793
+21
+-144.62037115341144
+31
+212.02546722923455
+12
+14.512045274573556
+22
+-142.12147256396042
+32
+210.19829594505723
+13
+14.512045274573556
+23
+-142.12147256396042
+33
+210.19829594505723
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.512045274573556
+20
+-142.12147256396042
+30
+210.19829594505723
+11
+13.243734071819793
+21
+-144.62037115341144
+31
+212.02546722923455
+12
+14.47432145851659
+22
+-143.4351131908477
+32
+212.32026059826038
+13
+14.47432145851659
+23
+-143.4351131908477
+33
+212.32026059826038
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.565269880938027
+20
+-142.44182077612206
+30
+212.15293722058897
+11
+14.512045274573556
+21
+-142.12147256396042
+31
+210.19829594505723
+12
+14.47432145851659
+22
+-143.4351131908477
+32
+212.32026059826038
+13
+14.47432145851659
+23
+-143.4351131908477
+33
+212.32026059826038
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.565269880938027
+20
+-142.44182077612206
+30
+212.15293722058897
+11
+15.339535433242336
+21
+-141.47286630723914
+31
+210.1995128423495
+12
+14.512045274573556
+22
+-142.12147256396042
+32
+210.19829594505723
+13
+14.512045274573556
+23
+-142.12147256396042
+33
+210.19829594505723
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.339535433242336
+20
+-141.47286630723914
+30
+210.1995128423495
+11
+15.565269880938027
+21
+-142.44182077612206
+31
+212.15293722058897
+12
+16.384545982884738
+22
+-141.6432319281422
+32
+212.4115278951733
+13
+16.384545982884738
+23
+-141.6432319281422
+33
+212.4115278951733
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.339535433242336
+20
+-141.47286630723914
+30
+210.1995128423495
+11
+16.384545982884738
+21
+-141.6432319281422
+31
+212.4115278951733
+12
+16.404929012528424
+22
+-140.58209748937819
+32
+210.5901368731331
+13
+16.404929012528424
+23
+-140.58209748937819
+33
+210.5901368731331
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.128737277710677
+20
+-143.5066059067615
+30
+210.1328877156033
+11
+11.93039766925612
+21
+-144.17498674448038
+31
+209.8076719142732
+12
+12.30854850279483
+22
+-144.6666132505133
+32
+210.94942579864218
+13
+12.30854850279483
+23
+-144.6666132505133
+33
+210.94942579864218
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.243734071819793
+20
+-144.62037115341144
+30
+212.02546722923455
+11
+13.128737277710677
+21
+-143.5066059067615
+31
+210.1328877156033
+12
+12.30854850279483
+22
+-144.6666132505133
+32
+210.94942579864218
+13
+12.30854850279483
+23
+-144.6666132505133
+33
+210.94942579864218
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.613395924648433
+20
+-143.71104465184416
+30
+208.2284434533727
+11
+11.984853823080265
+21
+-144.51297996737765
+31
+209.42769573479615
+12
+11.913969555811954
+22
+-143.03384130875693
+32
+208.3285332556531
+13
+11.913969555811954
+23
+-143.03384130875693
+33
+208.3285332556531
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.913969555811954
+20
+-143.03384130875693
+30
+208.3285332556531
+11
+11.984853823080265
+21
+-144.51297996737765
+31
+209.42769573479615
+12
+11.93039766925612
+22
+-144.17498674448038
+32
+209.8076719142732
+13
+11.93039766925612
+23
+-144.17498674448038
+33
+209.8076719142732
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.984853823080265
+20
+-144.51297996737765
+30
+209.42769573479615
+11
+12.350531459374356
+21
+-145.12021171616595
+31
+210.85268246391544
+12
+11.93039766925612
+22
+-144.17498674448038
+32
+209.8076719142732
+13
+11.93039766925612
+23
+-144.17498674448038
+33
+209.8076719142732
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.93039766925612
+20
+-144.17498674448038
+30
+209.8076719142732
+11
+12.350531459374356
+21
+-145.12021171616595
+31
+210.85268246391544
+12
+12.30854850279483
+22
+-144.6666132505133
+32
+210.94942579864218
+13
+12.30854850279483
+23
+-144.6666132505133
+33
+210.94942579864218
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.483781712865865
+20
+-144.19780356870768
+30
+207.3863505271978
+11
+12.400120024029887
+21
+-144.49868142419453
+31
+208.21901249935823
+12
+11.613395924648433
+22
+-143.71104465184416
+32
+208.2284434533727
+13
+11.613395924648433
+23
+-143.71104465184416
+33
+208.2284434533727
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.913969555811954
+20
+-143.03384130875693
+30
+208.3285332556531
+11
+12.483781712865865
+21
+-144.19780356870768
+31
+207.3863505271978
+12
+11.613395924648433
+22
+-143.71104465184416
+32
+208.2284434533727
+13
+11.613395924648433
+23
+-143.71104465184416
+33
+208.2284434533727
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.423241072580918
+20
+-144.926116598066
+30
+209.28714409755165
+11
+12.722293582129238
+21
+-145.36115738001328
+31
+209.92814474619675
+12
+11.984853823080265
+22
+-144.51297996737765
+32
+209.42769573479615
+13
+11.984853823080265
+23
+-144.51297996737765
+33
+209.42769573479615
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.984853823080265
+20
+-144.51297996737765
+30
+209.42769573479615
+11
+12.722293582129238
+21
+-145.36115738001328
+31
+209.92814474619675
+12
+12.350531459374356
+22
+-145.12021171616595
+32
+210.85268246391544
+13
+12.350531459374356
+23
+-145.12021171616595
+33
+210.85268246391544
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.400120024029887
+20
+-144.49868142419453
+30
+208.21901249935823
+11
+12.423241072580918
+21
+-144.926116598066
+31
+209.28714409755165
+12
+11.613395924648433
+22
+-143.71104465184416
+32
+208.2284434533727
+13
+11.613395924648433
+23
+-143.71104465184416
+33
+208.2284434533727
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.613395924648433
+20
+-143.71104465184416
+30
+208.2284434533727
+11
+12.423241072580918
+21
+-144.926116598066
+31
+209.28714409755165
+12
+11.984853823080265
+22
+-144.51297996737765
+32
+209.42769573479615
+13
+11.984853823080265
+23
+-144.51297996737765
+33
+209.42769573479615
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.330742228209239
+20
+-145.23368738865938
+30
+208.3166685070539
+11
+12.483781712865865
+21
+-144.19780356870768
+31
+207.3863505271978
+12
+13.263812877140428
+22
+-144.64288375331512
+32
+207.0273658260102
+13
+13.263812877140428
+23
+-144.64288375331512
+33
+207.0273658260102
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.330742228209239
+20
+-145.23368738865938
+30
+208.3166685070539
+11
+12.400120024029887
+21
+-144.49868142419453
+31
+208.21901249935823
+12
+12.483781712865865
+22
+-144.19780356870768
+32
+207.3863505271978
+13
+12.483781712865865
+23
+-144.19780356870768
+33
+207.3863505271978
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.330742228209239
+20
+-145.23368738865938
+30
+208.3166685070539
+11
+12.722293582129238
+21
+-145.36115738001328
+31
+209.92814474619675
+12
+12.400120024029887
+22
+-144.49868142419453
+32
+208.21901249935823
+13
+12.400120024029887
+23
+-144.49868142419453
+33
+208.21901249935823
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.722293582129238
+20
+-145.36115738001328
+30
+209.92814474619675
+11
+12.423241072580918
+21
+-144.926116598066
+31
+209.28714409755165
+12
+12.400120024029887
+22
+-144.49868142419453
+32
+208.21901249935823
+13
+12.400120024029887
+23
+-144.49868142419453
+33
+208.21901249935823
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.139370478849536
+20
+-145.0830963487539
+30
+206.68328811665225
+11
+13.330742228209239
+21
+-145.23368738865938
+31
+208.3166685070539
+12
+13.263812877140428
+22
+-144.64288375331512
+32
+207.0273658260102
+13
+13.263812877140428
+23
+-144.64288375331512
+33
+207.0273658260102
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.658043649297696
+20
+-139.8775139572176
+30
+209.88677023826477
+11
+16.384545982884738
+21
+-141.6432319281422
+31
+212.4115278951733
+12
+16.57711997936905
+22
+-141.2912443863851
+32
+212.4337362707553
+13
+16.57711997936905
+23
+-141.2912443863851
+33
+212.4337362707553
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.658043649297696
+20
+-139.8775139572176
+30
+209.88677023826477
+11
+16.404929012528424
+21
+-140.58209748937819
+31
+210.5901368731331
+12
+16.384545982884738
+22
+-141.6432319281422
+32
+212.4115278951733
+13
+16.384545982884738
+23
+-141.6432319281422
+33
+212.4115278951733
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.658043649297696
+20
+-139.8775139572176
+30
+209.88677023826477
+11
+16.331915174998834
+21
+-138.8014725266244
+31
+207.96042182477578
+12
+16.404929012528424
+22
+-140.58209748937819
+32
+210.5901368731331
+13
+16.404929012528424
+23
+-140.58209748937819
+33
+210.5901368731331
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.404929012528424
+20
+-140.58209748937819
+30
+210.5901368731331
+11
+16.331915174998834
+21
+-138.8014725266244
+31
+207.96042182477578
+12
+15.718903164073211
+22
+-139.21339226002053
+32
+208.25704053973968
+13
+15.718903164073211
+23
+-139.21339226002053
+33
+208.25704053973968
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.10890409604299
+20
+-140.46314577906878
+30
+207.60995540463318
+11
+16.658043649297696
+21
+-139.8775139572176
+31
+209.88677023826477
+12
+17.213861487491783
+22
+-141.34843855911578
+32
+209.6205739556043
+13
+17.213861487491783
+23
+-141.34843855911578
+33
+209.6205739556043
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.10890409604299
+20
+-140.46314577906878
+30
+207.60995540463318
+11
+16.331915174998834
+21
+-138.8014725266244
+31
+207.96042182477578
+12
+16.658043649297696
+22
+-139.8775139572176
+32
+209.88677023826477
+13
+16.658043649297696
+23
+-139.8775139572176
+33
+209.88677023826477
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.725654699850212
+20
+-139.9347081299476
+30
+204.94190809157251
+11
+11.872899272201545
+21
+-141.84827912186958
+31
+206.71401477327964
+12
+12.712558403791952
+22
+-141.82941721384117
+32
+206.84848192406383
+13
+12.712558403791952
+23
+-141.82941721384117
+33
+206.84848192406383
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.712558403791952
+20
+-141.82941721384117
+30
+206.84848192406383
+11
+11.872899272201545
+21
+-141.84827912186958
+31
+206.71401477327964
+12
+11.913969555811954
+22
+-143.03384130875693
+32
+208.3285332556531
+13
+11.913969555811954
+23
+-143.03384130875693
+33
+208.3285332556531
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.725654699850212
+20
+-139.9347081299476
+30
+204.94190809157251
+11
+12.712558403791952
+21
+-141.82941721384117
+31
+206.84848192406383
+12
+13.711326856332267
+22
+-140.20607622609955
+32
+206.24459664282978
+13
+13.711326856332267
+23
+-140.20607622609955
+33
+206.24459664282978
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.711326856332267
+20
+-140.20607622609955
+30
+206.24459664282978
+11
+12.712558403791952
+21
+-141.82941721384117
+31
+206.84848192406383
+12
+12.811127084456913
+22
+-142.62952718343672
+32
+208.20836464805245
+13
+12.811127084456913
+23
+-142.62952718343672
+33
+208.20836464805245
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.393397788587945
+20
+-141.3539145969299
+30
+207.8210870848226
+11
+13.711326856332267
+21
+-140.20607622609955
+31
+206.24459664282978
+12
+12.811127084456913
+22
+-142.62952718343672
+32
+208.20836464805245
+13
+12.811127084456913
+23
+-142.62952718343672
+33
+208.20836464805245
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.711326856332267
+20
+-140.20607622609955
+30
+206.24459664282978
+11
+14.393397788587945
+21
+-141.3539145969299
+31
+207.8210870848226
+12
+15.110150293670184
+22
+-140.50695408158674
+32
+207.92726137356357
+13
+15.110150293670184
+23
+-140.50695408158674
+33
+207.92726137356357
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.76213231827994
+20
+-138.70655453783516
+30
+205.37329818164355
+11
+13.711326856332267
+21
+-140.20607622609955
+31
+206.24459664282978
+12
+15.110150293670184
+22
+-140.50695408158674
+32
+207.92726137356357
+13
+15.110150293670184
+23
+-140.50695408158674
+33
+207.92726137356357
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.76213231827994
+20
+-138.70655453783516
+30
+205.37329818164355
+11
+15.110150293670184
+21
+-140.50695408158674
+31
+207.92726137356357
+12
+15.718903164073211
+22
+-139.21339226002053
+32
+208.25704053973968
+13
+15.718903164073211
+23
+-139.21339226002053
+33
+208.25704053973968
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.718903164073211
+20
+-139.21339226002053
+30
+208.25704053973968
+11
+14.53729589338588
+21
+-138.5389269358403
+31
+205.68604078572875
+12
+13.76213231827994
+22
+-138.70655453783516
+32
+205.37329818164355
+13
+13.76213231827994
+23
+-138.70655453783516
+33
+205.37329818164355
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.811127084456913
+20
+-142.62952718343672
+30
+208.20836464805245
+11
+12.712558403791952
+21
+-141.82941721384117
+31
+206.84848192406383
+12
+11.913969555811954
+22
+-143.03384130875693
+32
+208.3285332556531
+13
+11.913969555811954
+23
+-143.03384130875693
+33
+208.3285332556531
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.331915174998834
+20
+-138.8014725266244
+30
+207.96042182477578
+11
+14.53729589338588
+21
+-138.5389269358403
+31
+205.68604078572875
+12
+15.718903164073211
+22
+-139.21339226002053
+32
+208.25704053973968
+13
+15.718903164073211
+23
+-139.21339226002053
+33
+208.25704053973968
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.475219481318176
+20
+-139.22038941944876
+30
+201.32468089062715
+11
+16.02860352492793
+21
+-139.94687710286888
+31
+203.6754222347568
+12
+16.354427774903776
+22
+-141.48868597203537
+32
+202.72624234687186
+13
+16.354427774903776
+23
+-141.48868597203537
+33
+202.72624234687186
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.983274100794985
+20
+-140.98884540928003
+30
+200.63500435029502
+11
+15.475219481318176
+21
+-139.22038941944876
+31
+201.32468089062715
+12
+16.354427774903776
+22
+-141.48868597203537
+32
+202.72624234687186
+13
+16.354427774903776
+23
+-141.48868597203537
+33
+202.72624234687186
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.983274100794985
+20
+-140.98884540928003
+30
+200.63500435029502
+11
+16.354427774903776
+21
+-141.48868597203537
+31
+202.72624234687186
+12
+16.342867250628263
+22
+-142.59484561060856
+32
+201.7524202888202
+13
+16.342867250628263
+23
+-142.59484561060856
+33
+201.7524202888202
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.949200976614502
+20
+-142.22521305811443
+30
+200.06914710944
+11
+15.983274100794985
+21
+-140.98884540928003
+31
+200.63500435029502
+12
+16.342867250628263
+22
+-142.59484561060856
+32
+201.7524202888202
+13
+16.342867250628263
+23
+-142.59484561060856
+33
+201.7524202888202
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.02860352492793
+20
+-139.94687710286888
+30
+203.6754222347568
+11
+16.498934328347776
+21
+-139.92527717593353
+31
+205.80316715009877
+12
+16.731361711150345
+22
+-142.0350728562157
+32
+204.92182928625132
+13
+16.731361711150345
+23
+-142.0350728562157
+33
+204.92182928625132
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.354427774903776
+20
+-141.48868597203537
+30
+202.72624234687186
+11
+16.02860352492793
+21
+-139.94687710286888
+31
+203.6754222347568
+12
+16.731361711150345
+22
+-142.0350728562157
+32
+204.92182928625132
+13
+16.731361711150345
+23
+-142.0350728562157
+33
+204.92182928625132
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.354427774903776
+20
+-141.48868597203537
+30
+202.72624234687186
+11
+16.731361711150345
+21
+-142.0350728562157
+31
+204.92182928625132
+12
+16.3705516640249
+22
+-143.55649869573872
+32
+204.24310482154883
+13
+16.3705516640249
+23
+-143.55649869573872
+33
+204.24310482154883
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.342867250628263
+20
+-142.59484561060856
+30
+201.7524202888202
+11
+16.354427774903776
+21
+-141.48868597203537
+31
+202.72624234687186
+12
+16.3705516640249
+22
+-143.55649869573872
+32
+204.24310482154883
+13
+16.3705516640249
+23
+-143.55649869573872
+33
+204.24310482154883
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.498934328347776
+20
+-139.92527717593353
+30
+205.80316715009877
+11
+17.10890409604299
+21
+-140.46314577906878
+31
+207.60995540463318
+12
+16.836623326922187
+22
+-142.70345369393524
+32
+207.27774244387302
+13
+16.836623326922187
+23
+-142.70345369393524
+33
+207.27774244387302
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.731361711150345
+20
+-142.0350728562157
+30
+204.92182928625132
+11
+16.498934328347776
+21
+-139.92527717593353
+31
+205.80316715009877
+12
+16.836623326922187
+22
+-142.70345369393524
+32
+207.27774244387302
+13
+16.836623326922187
+23
+-142.70345369393524
+33
+207.27774244387302
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.731361711150345
+20
+-142.0350728562157
+30
+204.92182928625132
+11
+16.836623326922187
+21
+-142.70345369393524
+31
+207.27774244387302
+12
+16.05689638697066
+22
+-144.34748193564334
+32
+207.07999663389649
+13
+16.05689638697066
+23
+-144.34748193564334
+33
+207.07999663389649
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.3705516640249
+20
+-143.55649869573872
+30
+204.24310482154883
+11
+16.731361711150345
+21
+-142.0350728562157
+31
+204.92182928625132
+12
+16.05689638697066
+22
+-144.34748193564334
+32
+207.07999663389649
+13
+16.05689638697066
+23
+-144.34748193564334
+33
+207.07999663389649
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.77732888426442
+20
+-143.0761284896575
+30
+200.7214040580375
+11
+14.696709438658837
+21
+-143.61034640091606
+31
+202.06455444425896
+12
+13.558910470489225
+22
+-143.05939615189098
+32
+203.06575669138374
+13
+13.558910470489225
+23
+-143.05939615189098
+33
+203.06575669138374
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.77732888426442
+20
+-143.0761284896575
+30
+200.7214040580375
+11
+13.558910470489225
+21
+-143.05939615189098
+31
+203.06575669138374
+12
+13.532442954384749
+22
+-142.46737561925488
+32
+201.78375539409367
+13
+13.532442954384749
+23
+-142.46737561925488
+33
+201.78375539409367
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+13.558910470489225
+20
+-143.05939615189098
+30
+203.06575669138374
+11
+12.591781347545073
+21
+-142.50905435151176
+31
+203.96230577138317
+12
+13.532442954384749
+22
+-142.46737561925488
+32
+201.78375539409367
+13
+13.532442954384749
+23
+-142.46737561925488
+33
+201.78375539409367
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.043539817091954
+20
+-137.7379042932755
+30
+203.94618188226335
+11
+12.758800500894026
+21
+-137.3685759651042
+31
+201.13088999685118
+12
+12.803825700703946
+22
+-137.7126536744631
+32
+203.59936615399752
+13
+12.803825700703946
+23
+-137.7126536744631
+33
+203.59936615399752
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.043539817091954
+20
+-137.7379042932755
+30
+203.94618188226335
+11
+13.918807844645565
+21
+-137.32933102743218
+31
+201.7040486214586
+12
+12.758800500894026
+22
+-137.3685759651042
+32
+201.13088999685118
+13
+12.758800500894026
+23
+-137.3685759651042
+33
+201.13088999685118
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.631953608353887
+20
+-138.60494361393896
+30
+201.74907382126798
+11
+11.725654699850212
+21
+-139.9347081299476
+31
+204.94190809157251
+12
+12.803825700703946
+22
+-137.7126536744631
+32
+203.59936615399752
+13
+12.803825700703946
+23
+-137.7126536744631
+33
+203.59936615399752
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.758800500894026
+20
+-137.3685759651042
+30
+201.13088999685118
+11
+11.631953608353887
+21
+-138.60494361393896
+31
+201.74907382126798
+12
+12.803825700703946
+22
+-137.7126536744631
+32
+203.59936615399752
+13
+12.803825700703946
+23
+-137.7126536744631
+33
+203.59936615399752
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.872899272201545
+20
+-141.84827912186958
+30
+206.71401477327964
+11
+11.631953608353887
+21
+-138.60494361393896
+31
+201.74907382126798
+12
+11.467976698235331
+22
+-140.56384402999424
+32
+204.86463511352028
+13
+11.467976698235331
+23
+-140.56384402999424
+33
+204.86463511352028
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.631953608353887
+20
+-138.60494361393896
+30
+201.74907382126798
+11
+11.872899272201545
+21
+-141.84827912186958
+31
+206.71401477327964
+12
+11.725654699850212
+22
+-139.9347081299476
+32
+204.94190809157251
+13
+11.725654699850212
+23
+-139.9347081299476
+33
+204.94190809157251
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.449100140039306
+20
+-143.42781180709306
+30
+205.8369360499553
+11
+12.483781712865865
+21
+-144.19780356870768
+31
+207.3863505271978
+12
+11.913969555811954
+22
+-143.03384130875693
+32
+208.3285332556531
+13
+11.913969555811954
+23
+-143.03384130875693
+33
+208.3285332556531
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.449100140039306
+20
+-143.42781180709306
+30
+205.8369360499553
+11
+11.913969555811954
+21
+-143.03384130875693
+31
+208.3285332556531
+12
+11.872899272201545
+22
+-141.84827912186958
+32
+206.71401477327964
+13
+11.872899272201545
+23
+-141.84827912186958
+33
+206.71401477327964
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.437191440938195
+20
+-144.53123342675866
+30
+203.39857810078928
+11
+14.902365081033858
+21
+-145.0964822189677
+31
+206.8655184861529
+12
+14.139370478849536
+22
+-145.0830963487539
+32
+206.68328811665225
+13
+14.139370478849536
+23
+-145.0830963487539
+33
+206.68328811665225
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.437191440938195
+20
+-144.53123342675866
+30
+203.39857810078928
+11
+14.139370478849536
+21
+-145.0830963487539
+31
+206.68328811665225
+12
+14.720134711532918
+22
+-144.37364522742413
+32
+204.00702674686949
+13
+14.720134711532918
+23
+-144.37364522742413
+33
+204.00702674686949
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.3705516640249
+20
+-143.55649869573872
+30
+204.24310482154883
+11
+16.05689638697066
+21
+-144.34748193564334
+31
+207.07999663389649
+12
+14.902365081033858
+22
+-145.0964822189677
+32
+206.8655184861529
+13
+14.902365081033858
+23
+-145.0964822189677
+33
+206.8655184861529
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.437191440938195
+20
+-144.53123342675866
+30
+203.39857810078928
+11
+16.3705516640249
+21
+-143.55649869573872
+31
+204.24310482154883
+12
+14.902365081033858
+22
+-145.0964822189677
+32
+206.8655184861529
+13
+14.902365081033858
+23
+-145.0964822189677
+33
+206.8655184861529
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.487692678562828
+20
+-138.35365432310888
+30
+205.5105033513347
+11
+16.331915174998834
+21
+-138.8014725266244
+31
+207.96042182477578
+12
+17.10890409604299
+22
+-140.46314577906878
+32
+207.60995540463318
+13
+17.10890409604299
+23
+-140.46314577906878
+33
+207.60995540463318
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.487692678562828
+20
+-138.35365432310888
+30
+205.5105033513347
+11
+17.10890409604299
+21
+-140.46314577906878
+31
+207.60995540463318
+12
+16.498934328347776
+22
+-139.92527717593353
+32
+205.80316715009877
+13
+16.498934328347776
+23
+-139.92527717593353
+33
+205.80316715009877
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.331915174998834
+20
+-138.8014725266244
+30
+207.96042182477578
+11
+14.043539817091954
+21
+-137.7379042932755
+31
+203.94618188226335
+12
+14.53729589338588
+22
+-138.5389269358403
+32
+205.68604078572875
+13
+14.53729589338588
+23
+-138.5389269358403
+33
+205.68604078572875
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.331915174998834
+20
+-138.8014725266244
+30
+207.96042182477578
+11
+15.487692678562828
+21
+-138.35365432310888
+31
+205.5105033513347
+12
+14.043539817091954
+22
+-137.7379042932755
+32
+203.94618188226335
+13
+14.043539817091954
+23
+-137.7379042932755
+33
+203.94618188226335
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.53729589338588
+20
+-138.5389269358403
+30
+205.68604078572875
+11
+12.803825700703946
+21
+-137.7126536744631
+31
+203.59936615399752
+12
+13.76213231827994
+22
+-138.70655453783516
+32
+205.37329818164355
+13
+13.76213231827994
+23
+-138.70655453783516
+33
+205.37329818164355
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+14.53729589338588
+20
+-138.5389269358403
+30
+205.68604078572875
+11
+14.043539817091954
+21
+-137.7379042932755
+31
+203.94618188226335
+12
+12.803825700703946
+22
+-137.7126536744631
+32
+203.59936615399752
+13
+12.803825700703946
+23
+-137.7126536744631
+33
+203.59936615399752
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.29368203227351
+20
+-91.84962007889482
+30
+218.40383438610505
+11
+27.696214762157997
+21
+-93.22319289742038
+31
+218.26632499209026
+12
+30.219147073128717
+22
+-91.99564775395427
+32
+219.56536285147152
+13
+30.219147073128717
+23
+-91.99564775395427
+33
+219.56536285147152
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.86020632244408
+20
+-96.30589796278426
+30
+216.5663194749422
+11
+26.774719287669836
+21
+-97.51823189009912
+31
+218.41265689147167
+12
+26.838302171185212
+22
+-96.09354938530298
+32
+218.67915739845512
+13
+26.838302171185212
+23
+-96.09354938530298
+33
+218.67915739845512
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.86020632244408
+20
+-96.30589796278426
+30
+216.5663194749422
+11
+26.838302171185212
+21
+-96.09354938530298
+31
+218.67915739845512
+12
+26.908577989807444
+22
+-94.87847743908081
+32
+217.10935989156906
+13
+26.908577989807444
+23
+-94.87847743908081
+33
+217.10935989156906
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.05977747835832
+20
+-98.52156370748448
+30
+216.29130068691353
+11
+26.71874201223048
+21
+-99.08985474292362
+31
+217.78869280491622
+12
+26.774719287669836
+22
+-97.51823189009912
+32
+218.41265689147167
+13
+26.774719287669836
+23
+-97.51823189009912
+33
+218.41265689147167
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.05977747835832
+20
+-98.52156370748448
+30
+216.29130068691353
+11
+26.774719287669836
+21
+-97.51823189009912
+31
+218.41265689147167
+12
+26.86020632244408
+22
+-96.30589796278426
+32
+216.5663194749422
+13
+26.86020632244408
+23
+-96.30589796278426
+33
+216.5663194749422
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.24402021678039
+20
+-93.26578430264587
+30
+217.8857403639672
+11
+33.211801738873184
+21
+-91.65887142834873
+31
+218.47380598040414
+12
+32.610046027900076
+22
+-91.83623420868129
+32
+219.30585950391847
+13
+32.610046027900076
+23
+-91.83623420868129
+33
+219.30585950391847
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.24402021678039
+20
+-93.26578430264587
+30
+217.8857403639672
+11
+32.610046027900076
+21
+-91.83623420868129
+31
+219.30585950391847
+12
+34.93705787483304
+22
+-93.91256521342929
+32
+219.15526846401315
+13
+34.93705787483304
+23
+-93.91256521342929
+33
+219.15526846401315
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.24402021678039
+20
+-93.26578430264587
+30
+217.8857403639672
+11
+34.93705787483304
+21
+-93.91256521342929
+31
+219.15526846401315
+12
+35.4563687942623
+22
+-95.22985653219246
+32
+219.16561209099632
+13
+35.4563687942623
+23
+-95.22985653219246
+33
+219.16561209099632
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.611523199012744
+20
+-94.55873767556594
+30
+217.74336338078447
+11
+35.24402021678039
+21
+-93.26578430264587
+31
+217.8857403639672
+12
+35.4563687942623
+22
+-95.22985653219246
+32
+219.16561209099632
+13
+35.4563687942623
+23
+-95.22985653219246
+33
+219.16561209099632
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.72625971930135
+20
+-91.24451790036753
+30
+215.6320465788876
+11
+30.060646200824873
+21
+-91.44074258872796
+31
+214.32114397090785
+12
+30.01927169289143
+22
+-91.67621221476128
+32
+215.67768022734361
+13
+30.01927169289143
+23
+-91.67621221476128
+33
+215.67768022734361
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.72625971930135
+20
+-91.24451790036753
+30
+215.6320465788876
+11
+32.57232221184311
+21
+-91.39845540782537
+31
+214.0969306448278
+12
+30.060646200824873
+22
+-91.44074258872796
+32
+214.32114397090785
+13
+30.060646200824873
+23
+-91.44074258872796
+33
+214.32114397090785
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.21275836234488
+20
+-91.77812736297999
+30
+216.89944510867213
+11
+28.07679939028104
+21
+-92.52743187062704
+31
+215.09874134059817
+12
+27.711730202633042
+22
+-92.89706442312094
+32
+216.23775720605994
+13
+27.711730202633042
+23
+-92.89706442312094
+33
+216.23775720605994
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.21275836234488
+20
+-91.77812736297999
+30
+216.89944510867213
+11
+30.01927169289143
+21
+-91.67621221476128
+31
+215.67768022734361
+12
+28.07679939028104
+22
+-92.52743187062704
+32
+215.09874134059817
+13
+28.07679939028104
+23
+-92.52743187062704
+33
+215.09874134059817
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.07316334857207
+20
+-97.27637355328123
+30
+214.23383159019437
+11
+27.08381119987848
+21
+-98.09169473902875
+31
+215.43369232026373
+12
+26.90583997090008
+22
+-95.79145463252334
+32
+215.5915847439219
+13
+26.90583997090008
+23
+-95.79145463252334
+33
+215.5915847439219
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.229765624100075
+20
+-99.59821358672293
+30
+215.75038984054814
+11
+29.183263253177515
+21
+-99.29246814206759
+31
+215.28370972900439
+12
+32.10625054894583
+22
+-98.7056194229233
+32
+214.49485605936226
+13
+32.10625054894583
+23
+-98.7056194229233
+33
+214.49485605936226
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.10625054894583
+20
+-98.7056194229233
+30
+214.49485605936226
+11
+29.183263253177515
+21
+-99.29246814206759
+31
+215.28370972900439
+12
+29.137325380398483
+22
+-98.60005358282822
+32
+214.0896292610729
+13
+29.137325380398483
+23
+-98.60005358282822
+33
+214.0896292610729
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.4995832983015
+20
+-97.39349991765181
+30
+214.46930121622717
+11
+34.81567236994007
+21
+-98.24167733028749
+31
+215.43034585271025
+12
+32.229765624100075
+22
+-99.59821358672293
+32
+215.75038984054814
+13
+32.229765624100075
+23
+-99.59821358672293
+33
+215.75038984054814
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.4995832983015
+20
+-97.39349991765181
+30
+214.46930121622717
+11
+32.229765624100075
+21
+-99.59821358672293
+31
+215.75038984054814
+12
+32.10625054894583
+22
+-98.7056194229233
+32
+214.49485605936226
+13
+32.10625054894583
+23
+-98.7056194229233
+33
+214.49485605936226
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.65504192737495
+20
+-92.42277870350173
+30
+216.65636987456315
+11
+32.72625971930135
+21
+-91.24451790036753
+31
+215.6320465788876
+12
+33.199024317305515
+22
+-91.48211709666211
+32
+216.9338224571757
+13
+33.199024317305515
+23
+-91.48211709666211
+33
+216.9338224571757
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.65504192737495
+20
+-92.42277870350173
+30
+216.65636987456315
+11
+34.289364291080865
+21
+-92.17270630996252
+31
+215.38927556910144
+12
+32.72625971930135
+22
+-91.24451790036753
+32
+215.6320465788876
+13
+32.72625971930135
+23
+-91.24451790036753
+33
+215.6320465788876
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.199024317305515
+20
+-91.48211709666211
+30
+216.9338224571757
+11
+30.01927169289143
+21
+-91.67621221476128
+31
+215.67768022734361
+12
+30.21275836234488
+22
+-91.77812736297999
+32
+216.89944510867213
+13
+30.21275836234488
+23
+-91.77812736297999
+33
+216.89944510867213
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.199024317305515
+20
+-91.48211709666211
+30
+216.9338224571757
+11
+32.72625971930135
+21
+-91.24451790036753
+31
+215.6320465788876
+12
+30.01927169289143
+22
+-91.67621221476128
+32
+215.67768022734361
+13
+30.01927169289143
+23
+-91.67621221476128
+33
+215.67768022734361
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.29368203227351
+20
+-91.84962007889482
+30
+218.40383438610505
+11
+27.711730202633042
+21
+-92.89706442312094
+31
+216.23775720605994
+12
+27.696214762157997
+22
+-93.22319289742038
+32
+218.26632499209026
+13
+27.696214762157997
+23
+-93.22319289742038
+33
+218.26632499209026
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.29368203227351
+20
+-91.84962007889482
+30
+218.40383438610505
+11
+30.21275836234488
+21
+-91.77812736297999
+31
+216.89944510867213
+12
+27.711730202633042
+22
+-92.89706442312094
+32
+216.23775720605994
+13
+27.711730202633042
+23
+-92.89706442312094
+33
+216.23775720605994
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.08381119987848
+20
+-98.09169473902875
+30
+215.43369232026373
+11
+27.05977747835832
+21
+-98.52156370748448
+31
+216.29130068691353
+12
+26.86020632244408
+22
+-96.30589796278426
+32
+216.5663194749422
+13
+26.86020632244408
+23
+-96.30589796278426
+33
+216.5663194749422
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.08381119987848
+20
+-98.09169473902875
+30
+215.43369232026373
+11
+26.86020632244408
+21
+-96.30589796278426
+31
+216.5663194749422
+12
+26.90583997090008
+22
+-95.79145463252334
+32
+215.5915847439219
+13
+26.90583997090008
+23
+-95.79145463252334
+33
+215.5915847439219
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.229765624100075
+20
+-99.59821358672293
+30
+215.75038984054814
+11
+31.922499057829672
+21
+-100.10687665484598
+31
+216.55323782905026
+12
+29.10811984538664
+22
+-99.80599879935934
+32
+216.22254598990605
+13
+29.10811984538664
+23
+-99.80599879935934
+33
+216.22254598990605
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.229765624100075
+20
+-99.59821358672293
+30
+215.75038984054814
+11
+29.10811984538664
+21
+-99.80599879935934
+31
+216.22254598990605
+12
+29.183263253177515
+22
+-99.29246814206759
+32
+215.28370972900439
+13
+29.183263253177515
+23
+-99.29246814206759
+33
+215.28370972900439
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.81567236994007
+20
+-98.24167733028749
+30
+215.43034585271025
+11
+34.58263653849143
+21
+-99.17138686149796
+31
+216.34149770021486
+12
+31.922499057829672
+22
+-100.10687665484598
+32
+216.55323782905026
+13
+31.922499057829672
+23
+-100.10687665484598
+33
+216.55323782905026
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.81567236994007
+20
+-98.24167733028749
+30
+215.43034585271025
+11
+31.922499057829672
+21
+-100.10687665484598
+31
+216.55323782905026
+12
+32.229765624100075
+22
+-99.59821358672293
+32
+215.75038984054814
+13
+32.229765624100075
+23
+-99.59821358672293
+33
+215.75038984054814
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.24402021678039
+20
+-93.26578430264587
+30
+217.8857403639672
+11
+33.199024317305515
+21
+-91.48211709666211
+31
+216.9338224571757
+12
+33.211801738873184
+22
+-91.65887142834873
+32
+218.47380598040414
+13
+33.211801738873184
+23
+-91.65887142834873
+33
+218.47380598040414
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.24402021678039
+20
+-93.26578430264587
+30
+217.8857403639672
+11
+34.65504192737495
+21
+-92.42277870350173
+31
+216.65636987456315
+12
+33.199024317305515
+22
+-91.48211709666211
+32
+216.9338224571757
+13
+33.199024317305515
+23
+-91.48211709666211
+33
+216.9338224571757
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.211801738873184
+20
+-91.65887142834873
+30
+218.47380598040414
+11
+30.21275836234488
+21
+-91.77812736297999
+31
+216.89944510867213
+12
+30.29368203227351
+22
+-91.84962007889482
+32
+218.40383438610505
+13
+30.29368203227351
+23
+-91.84962007889482
+33
+218.40383438610505
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.211801738873184
+20
+-91.65887142834873
+30
+218.47380598040414
+11
+33.199024317305515
+21
+-91.48211709666211
+31
+216.9338224571757
+12
+30.21275836234488
+22
+-91.77812736297999
+32
+216.89944510867213
+13
+30.21275836234488
+23
+-91.77812736297999
+33
+216.89944510867213
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.000655408515904
+20
+-93.95576506729923
+30
+212.5435612513846
+11
+34.704934716353534
+21
+-94.23565144449627
+31
+213.62081957926944
+12
+34.754219056686004
+22
+-95.48053737437593
+32
+213.57701127675108
+13
+34.754219056686004
+23
+-95.48053737437593
+33
+213.57701127675108
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.000655408515904
+20
+-93.95576506729923
+30
+212.5435612513846
+11
+34.754219056686004
+21
+-95.48053737437593
+31
+213.57701127675108
+12
+34.15824360785063
+22
+-94.96731094140722
+32
+212.55846824321347
+13
+34.15824360785063
+23
+-94.96731094140722
+33
+212.55846824321347
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.15824360785063
+20
+-94.96731094140722
+30
+212.55846824321347
+11
+34.754219056686004
+21
+-95.48053737437593
+31
+213.57701127675108
+12
+34.130254970130956
+22
+-96.56327174007535
+32
+213.47661725014746
+13
+34.130254970130956
+23
+-96.56327174007535
+33
+213.47661725014746
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.720769031319136
+20
+-95.88911064021836
+30
+212.48393328406863
+11
+34.15824360785063
+21
+-94.96731094140722
+31
+212.55846824321347
+12
+34.130254970130956
+22
+-96.56327174007535
+32
+213.47661725014746
+13
+34.130254970130956
+23
+-96.56327174007535
+33
+213.47661725014746
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.704934716353534
+20
+-94.23565144449627
+30
+213.62081957926944
+11
+35.2418906465191
+21
+-94.71510897760761
+31
+214.89977863332956
+12
+35.49074614276583
+22
+-96.21097997399528
+32
+214.63966683712948
+13
+35.49074614276583
+23
+-96.21097997399528
+33
+214.63966683712948
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.754219056686004
+20
+-95.48053737437593
+30
+213.57701127675108
+11
+34.704934716353534
+21
+-94.23565144449627
+31
+213.62081957926944
+12
+35.49074614276583
+22
+-96.21097997399528
+32
+214.63966683712948
+13
+35.49074614276583
+23
+-96.21097997399528
+33
+214.63966683712948
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.754219056686004
+20
+-95.48053737437593
+30
+213.57701127675108
+11
+35.49074614276583
+21
+-96.21097997399528
+31
+214.63966683712948
+12
+34.4995832983015
+22
+-97.39349991765181
+32
+214.46930121622717
+13
+34.4995832983015
+23
+-97.39349991765181
+33
+214.46930121622717
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.130254970130956
+20
+-96.56327174007535
+30
+213.47661725014746
+11
+34.754219056686004
+21
+-95.48053737437593
+31
+213.57701127675108
+12
+34.4995832983015
+22
+-97.39349991765181
+32
+214.46930121622717
+13
+34.4995832983015
+23
+-97.39349991765181
+33
+214.46930121622717
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.2418906465191
+20
+-94.71510897760761
+30
+214.89977863332956
+11
+35.686362382480546
+21
+-95.34272375603953
+31
+216.2341065141827
+12
+35.84151678723095
+22
+-96.95967603299697
+32
+215.76712217831604
+13
+35.84151678723095
+23
+-96.95967603299697
+33
+215.76712217831604
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.49074614276583
+20
+-96.21097997399528
+30
+214.63966683712948
+11
+35.2418906465191
+21
+-94.71510897760761
+31
+214.89977863332956
+12
+35.84151678723095
+22
+-96.95967603299697
+32
+215.76712217831604
+13
+35.84151678723095
+23
+-96.95967603299697
+33
+215.76712217831604
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.49074614276583
+20
+-96.21097997399528
+30
+214.63966683712948
+11
+35.84151678723095
+21
+-96.95967603299697
+31
+215.76712217831604
+12
+34.81567236994007
+22
+-98.24167733028749
+32
+215.43034585271025
+13
+34.81567236994007
+23
+-98.24167733028749
+33
+215.43034585271025
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.4995832983015
+20
+-97.39349991765181
+30
+214.46930121622717
+11
+35.49074614276583
+21
+-96.21097997399528
+31
+214.63966683712948
+12
+34.81567236994007
+22
+-98.24167733028749
+32
+215.43034585271025
+13
+34.81567236994007
+23
+-98.24167733028749
+33
+215.43034585271025
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.686362382480546
+20
+-95.34272375603953
+30
+216.2341065141827
+11
+35.7955789144519
+21
+-96.46135659185806
+31
+217.6630481595014
+12
+35.96624875967735
+22
+-98.00864149883922
+32
+216.86476353584402
+13
+35.96624875967735
+23
+-98.00864149883922
+33
+216.86476353584402
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.84151678723095
+20
+-96.95967603299697
+30
+215.76712217831604
+11
+35.686362382480546
+21
+-95.34272375603953
+31
+216.2341065141827
+12
+35.96624875967735
+22
+-98.00864149883922
+32
+216.86476353584402
+13
+35.96624875967735
+23
+-98.00864149883922
+33
+216.86476353584402
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.84151678723095
+20
+-96.95967603299697
+30
+215.76712217831604
+11
+35.96624875967735
+21
+-98.00864149883922
+31
+216.86476353584402
+12
+34.58263653849143
+22
+-99.17138686149796
+32
+216.34149770021486
+13
+34.58263653849143
+23
+-99.17138686149796
+33
+216.34149770021486
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.81567236994007
+20
+-98.24167733028749
+30
+215.43034585271025
+11
+35.84151678723095
+21
+-96.95967603299697
+31
+215.76712217831604
+12
+34.58263653849143
+22
+-99.17138686149796
+32
+216.34149770021486
+13
+34.58263653849143
+23
+-99.17138686149796
+33
+216.34149770021486
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.385513827329035
+20
+-92.33668322008039
+30
+212.83074901233502
+11
+34.07762416224503
+21
+-92.42369137647017
+31
+213.82799634326028
+12
+34.48984811996422
+22
+-93.1802972678706
+32
+213.85750610259478
+13
+34.48984811996422
+23
+-93.1802972678706
+33
+213.85750610259478
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.385513827329035
+20
+-92.33668322008039
+30
+212.83074901233502
+11
+34.48984811996422
+21
+-93.1802972678706
+31
+213.85750610259478
+12
+33.99304980043991
+22
+-92.96460222283496
+32
+212.86695170677635
+13
+33.99304980043991
+23
+-92.96460222283496
+33
+212.86695170677635
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.07762416224503
+20
+-92.42369137647017
+30
+213.82799634326028
+11
+34.289364291080865
+21
+-92.17270630996252
+31
+215.38927556910144
+12
+35.011288609654784
+22
+-93.18516485703964
+32
+215.33786165850742
+13
+35.011288609654784
+23
+-93.18516485703964
+33
+215.33786165850742
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.07762416224503
+20
+-92.42369137647017
+30
+213.82799634326028
+11
+35.011288609654784
+21
+-93.18516485703964
+31
+215.33786165850742
+12
+34.48984811996422
+22
+-93.1802972678706
+32
+213.85750610259478
+13
+34.48984811996422
+23
+-93.1802972678706
+33
+213.85750610259478
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.289364291080865
+20
+-92.17270630996252
+30
+215.38927556910144
+11
+34.65504192737495
+21
+-92.42277870350173
+31
+216.65636987456315
+12
+35.38365918105575
+22
+-93.59647614179013
+32
+216.62746856387398
+13
+35.38365918105575
+23
+-93.59647614179013
+33
+216.62746856387398
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.71930651037399
+20
+-98.1726184089585
+30
+219.6246865944628
+11
+28.193317306005355
+21
+-98.29278701655942
+31
+219.92252220671892
+12
+28.284280378594318
+22
+-98.82152889000282
+32
+219.75884952092326
+13
+28.284280378594318
+23
+-98.82152889000282
+33
+219.75884952092326
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.43177057459864
+20
+-98.62986756648735
+30
+218.78411478990313
+11
+29.565064778592717
+21
+-98.87659349247305
+31
+219.79231419645774
+12
+31.129690471987438
+22
+-99.41020295508494
+32
+218.61892098249234
+13
+31.129690471987438
+23
+-99.41020295508494
+33
+218.61892098249234
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.71930651037399
+20
+-98.1726184089585
+30
+219.6246865944628
+11
+29.565064778592717
+21
+-98.87659349247305
+31
+219.79231419645774
+12
+32.43177057459864
+22
+-98.62986756648735
+32
+218.78411478990313
+13
+32.43177057459864
+23
+-98.62986756648735
+33
+218.78411478990313
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.565064778592717
+20
+-98.87659349247305
+30
+219.79231419645774
+11
+28.873867116645837
+21
+-99.59821358672383
+31
+219.40229861432033
+12
+31.129690471987438
+22
+-99.41020295508494
+32
+218.61892098249234
+13
+31.129690471987438
+23
+-99.41020295508494
+33
+218.61892098249234
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.284280378594318
+20
+-98.82152889000282
+30
+219.75884952092326
+11
+28.873867116645837
+21
+-99.59821358672383
+31
+219.40229861432033
+12
+29.565064778592717
+22
+-98.87659349247305
+32
+219.79231419645774
+13
+29.565064778592717
+23
+-98.87659349247305
+33
+219.79231419645774
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.99304980043991
+20
+-92.96460222283496
+30
+212.86695170677635
+11
+34.48984811996422
+21
+-93.1802972678706
+31
+213.85750610259478
+12
+34.45881723901418
+22
+-93.68896033599343
+32
+213.71269532482776
+13
+34.45881723901418
+23
+-93.68896033599343
+33
+213.71269532482776
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.81751236604583
+20
+-93.52741722045893
+30
+212.69476073993584
+11
+33.99304980043991
+21
+-92.96460222283496
+31
+212.86695170677635
+12
+34.45881723901418
+22
+-93.68896033599343
+32
+213.71269532482776
+13
+34.45881723901418
+23
+-93.68896033599343
+33
+213.71269532482776
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.81751236604583
+20
+-93.52741722045893
+30
+212.69476073993584
+11
+34.45881723901418
+21
+-93.68896033599343
+31
+213.71269532482776
+12
+34.704934716353534
+22
+-94.23565144449627
+32
+213.62081957926944
+13
+34.704934716353534
+23
+-94.23565144449627
+33
+213.62081957926944
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.000655408515904
+20
+-93.95576506729923
+30
+212.5435612513846
+11
+33.81751236604583
+21
+-93.52741722045893
+31
+212.69476073993584
+12
+34.704934716353534
+22
+-94.23565144449627
+32
+213.62081957926944
+13
+34.704934716353534
+23
+-94.23565144449627
+33
+213.62081957926944
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.48984811996422
+20
+-93.1802972678706
+30
+213.85750610259478
+11
+35.011288609654784
+21
+-93.18516485703964
+31
+215.33786165850742
+12
+34.96748030713704
+22
+-93.89674554863011
+32
+215.0744033947546
+13
+34.96748030713704
+23
+-93.89674554863011
+33
+215.0744033947546
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.45881723901418
+20
+-93.68896033599343
+30
+213.71269532482776
+11
+34.48984811996422
+21
+-93.1802972678706
+31
+213.85750610259478
+12
+34.96748030713704
+22
+-93.89674554863011
+32
+215.0744033947546
+13
+34.96748030713704
+23
+-93.89674554863011
+33
+215.0744033947546
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.45881723901418
+20
+-93.68896033599343
+30
+213.71269532482776
+11
+34.96748030713704
+21
+-93.89674554863011
+31
+215.0744033947546
+12
+35.2418906465191
+22
+-94.71510897760761
+32
+214.89977863332956
+13
+35.2418906465191
+23
+-94.71510897760761
+33
+214.89977863332956
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.704934716353534
+20
+-94.23565144449627
+30
+213.62081957926944
+11
+34.45881723901418
+21
+-93.68896033599343
+31
+213.71269532482776
+12
+35.2418906465191
+22
+-94.71510897760761
+32
+214.89977863332956
+13
+35.2418906465191
+23
+-94.71510897760761
+33
+214.89977863332956
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.011288609654784
+20
+-93.18516485703964
+30
+215.33786165850742
+11
+35.38365918105575
+21
+-93.59647614179013
+31
+216.62746856387398
+12
+35.30212706248103
+22
+-94.46351546245386
+32
+216.31259638952727
+13
+35.30212706248103
+23
+-94.46351546245386
+33
+216.31259638952727
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.96748030713704
+20
+-93.89674554863011
+30
+215.0744033947546
+11
+35.011288609654784
+21
+-93.18516485703964
+31
+215.33786165850742
+12
+35.30212706248103
+22
+-94.46351546245386
+32
+216.31259638952727
+13
+35.30212706248103
+23
+-94.46351546245386
+33
+216.31259638952727
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.96748030713704
+20
+-93.89674554863011
+30
+215.0744033947546
+11
+35.30212706248103
+21
+-94.46351546245386
+31
+216.31259638952727
+12
+35.686362382480546
+22
+-95.34272375603953
+32
+216.2341065141827
+13
+35.686362382480546
+23
+-95.34272375603953
+33
+216.2341065141827
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.2418906465191
+20
+-94.71510897760761
+30
+214.89977863332956
+11
+34.96748030713704
+21
+-93.89674554863011
+31
+215.0744033947546
+12
+35.686362382480546
+22
+-95.34272375603953
+32
+216.2341065141827
+13
+35.686362382480546
+23
+-95.34272375603953
+33
+216.2341065141827
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.38365918105575
+20
+-93.59647614179013
+30
+216.62746856387398
+11
+35.611523199012744
+21
+-94.55873767556594
+31
+217.74336338078447
+12
+35.444808269986794
+22
+-95.36979972079055
+32
+217.7619210644897
+13
+35.444808269986794
+23
+-95.36979972079055
+33
+217.7619210644897
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.30212706248103
+20
+-94.46351546245386
+30
+216.31259638952727
+11
+35.38365918105575
+21
+-93.59647614179013
+31
+216.62746856387398
+12
+35.444808269986794
+22
+-95.36979972079055
+32
+217.7619210644897
+13
+35.444808269986794
+23
+-95.36979972079055
+33
+217.7619210644897
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.30212706248103
+20
+-94.46351546245386
+30
+216.31259638952727
+11
+35.444808269986794
+21
+-95.36979972079055
+31
+217.7619210644897
+12
+35.7955789144519
+22
+-96.46135659185806
+32
+217.6630481595014
+13
+35.7955789144519
+23
+-96.46135659185806
+33
+217.6630481595014
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.686362382480546
+20
+-95.34272375603953
+30
+216.2341065141827
+11
+35.30212706248103
+21
+-94.46351546245386
+31
+216.31259638952727
+12
+35.7955789144519
+22
+-96.46135659185806
+32
+217.6630481595014
+13
+35.7955789144519
+23
+-96.46135659185806
+33
+217.6630481595014
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.7955789144519
+20
+-96.46135659185806
+30
+217.6630481595014
+11
+35.444808269986794
+21
+-95.36979972079055
+31
+217.7619210644897
+12
+35.40404221069942
+22
+-97.17689219964831
+32
+218.77620495750455
+13
+35.40404221069942
+23
+-97.17689219964831
+33
+218.77620495750455
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.444808269986794
+20
+-95.36979972079055
+30
+217.7619210644897
+11
+35.147885330699765
+21
+-96.13644501485152
+31
+218.77924720073523
+12
+35.40404221069942
+22
+-97.17689219964831
+32
+218.77620495750455
+13
+35.40404221069942
+23
+-97.17689219964831
+33
+218.77620495750455
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.611523199012744
+20
+-94.55873767556594
+30
+217.74336338078447
+11
+35.147885330699765
+21
+-96.13644501485152
+31
+218.77924720073523
+12
+35.444808269986794
+22
+-95.36979972079055
+32
+217.7619210644897
+13
+35.444808269986794
+23
+-95.36979972079055
+33
+217.7619210644897
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.611523199012744
+20
+-94.55873767556594
+30
+217.74336338078447
+11
+35.4563687942623
+21
+-95.22985653219246
+31
+219.16561209099632
+12
+35.147885330699765
+22
+-96.13644501485152
+32
+218.77924720073523
+13
+35.147885330699765
+23
+-96.13644501485152
+33
+218.77924720073523
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.147885330699765
+20
+-96.13644501485152
+30
+218.77924720073523
+11
+34.13907747549911
+21
+-95.97125120744099
+31
+219.76584668035372
+12
+34.7749063106527
+22
+-97.42118433104957
+32
+219.35088470372662
+13
+34.7749063106527
+23
+-97.42118433104957
+33
+219.35088470372662
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.4563687942623
+20
+-95.22985653219246
+30
+219.16561209099632
+11
+34.13907747549911
+21
+-95.97125120744099
+31
+219.76584668035372
+12
+35.147885330699765
+22
+-96.13644501485152
+32
+218.77924720073523
+13
+35.147885330699765
+23
+-96.13644501485152
+33
+218.77924720073523
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.147885330699765
+20
+-96.13644501485152
+30
+218.77924720073523
+11
+34.7749063106527
+21
+-97.42118433104957
+31
+219.35088470372662
+12
+35.40404221069942
+22
+-97.17689219964831
+32
+218.77620495750455
+13
+35.40404221069942
+23
+-97.17689219964831
+33
+218.77620495750455
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.839779342297835
+20
+-91.20527296269469
+30
+213.05192009518555
+11
+27.926816799022323
+21
+-91.76687106302606
+31
+211.1660335166599
+12
+27.772270842918
+22
+-91.77721469000979
+32
+212.55633867295302
+13
+27.772270842918
+23
+-91.77721469000979
+33
+212.55633867295302
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.926816799022323
+20
+-91.76687106302606
+30
+211.1660335166599
+11
+29.839779342297835
+21
+-91.20527296269469
+31
+213.05192009518555
+12
+29.680974245670953
+22
+-91.28193749210041
+32
+211.56639272578104
+13
+29.680974245670953
+23
+-91.28193749210041
+33
+211.56639272578104
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.264216223441203
+20
+-93.79391772744148
+30
+210.54845814088833
+11
+27.205500929094473
+21
+-96.01110459375732
+31
+211.82802564359417
+12
+26.990718557028245
+22
+-94.16507140155056
+32
+211.83502280302443
+13
+26.990718557028245
+23
+-94.16507140155056
+33
+211.83502280302443
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.205500929094473
+20
+-96.01110459375732
+30
+211.82802564359417
+11
+27.264216223441203
+21
+-93.79391772744148
+31
+210.54845814088833
+12
+27.445533919973037
+22
+-95.36280256135876
+32
+210.54632857062666
+13
+27.445533919973037
+23
+-95.36280256135876
+33
+210.54632857062666
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.098659591037357
+20
+-96.28216846558571
+30
+211.0130086821701
+11
+28.86048124643208
+21
+-97.2042723887201
+31
+211.73341187912843
+12
+28.85105029241783
+22
+-96.35883299499164
+32
+210.43954583323958
+13
+28.85105029241783
+23
+-96.35883299499164
+33
+210.43954583323958
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.86048124643208
+20
+-97.2042723887201
+30
+211.73341187912843
+11
+31.098659591037357
+21
+-96.28216846558571
+31
+211.0130086821701
+12
+31.52761588652376
+22
+-97.13490924306718
+32
+212.4471221409805
+13
+31.52761588652376
+23
+-97.13490924306718
+33
+212.4471221409805
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.070337428659585
+20
+-95.33663926957755
+30
+211.2731204783691
+11
+31.52761588652376
+21
+-97.13490924306718
+31
+212.4471221409805
+12
+31.098659591037357
+22
+-96.28216846558571
+32
+211.0130086821701
+13
+31.098659591037357
+23
+-96.28216846558571
+33
+211.0130086821701
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.52761588652376
+20
+-97.13490924306718
+30
+212.4471221409805
+11
+33.070337428659585
+21
+-95.33663926957755
+31
+211.2731204783691
+12
+33.720769031319136
+22
+-95.88911064021836
+32
+212.48393328406863
+13
+33.720769031319136
+23
+-95.88911064021836
+33
+212.48393328406863
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.23493743759175
+20
+-91.35008374046176
+30
+213.03427508444918
+11
+32.68884012756743
+21
+-92.24115678264545
+31
+211.38659615086425
+12
+31.704065993886946
+22
+-91.40545256725466
+32
+211.5335364988928
+13
+31.704065993886946
+23
+-91.40545256725466
+33
+211.5335364988928
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.68884012756743
+20
+-92.24115678264545
+30
+211.38659615086425
+11
+32.23493743759175
+21
+-91.35008374046176
+31
+213.03427508444918
+12
+33.385513827329035
+22
+-92.33668322008039
+32
+212.83074901233502
+13
+33.385513827329035
+23
+-92.33668322008039
+33
+212.83074901233502
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.060646200824873
+20
+-91.44074258872796
+30
+214.32114397090785
+11
+27.772270842918
+21
+-91.77721469000979
+31
+212.55633867295302
+12
+27.823988977834798
+22
+-92.12007550207618
+32
+213.7647176840675
+13
+27.823988977834798
+23
+-92.12007550207618
+33
+213.7647176840675
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.060646200824873
+20
+-91.44074258872796
+30
+214.32114397090785
+11
+29.839779342297835
+21
+-91.20527296269469
+31
+213.05192009518555
+12
+27.772270842918
+22
+-91.77721469000979
+32
+212.55633867295302
+13
+27.772270842918
+23
+-91.77721469000979
+33
+212.55633867295302
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.205500929094473
+20
+-96.01110459375732
+30
+211.82802564359417
+11
+27.21036851826312
+21
+-96.6222912587449
+31
+212.96369504150255
+12
+27.04121979465288
+22
+-94.66704153456689
+32
+213.04005534658606
+13
+27.04121979465288
+23
+-94.66704153456689
+33
+213.04005534658606
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.205500929094473
+20
+-96.01110459375732
+30
+211.82802564359417
+11
+27.04121979465288
+21
+-94.66704153456689
+31
+213.04005534658606
+12
+26.990718557028245
+22
+-94.16507140155056
+32
+211.83502280302443
+13
+26.990718557028245
+23
+-94.16507140155056
+33
+211.83502280302443
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.864696436452075
+20
+-97.82762802662958
+30
+213.4455863691976
+11
+29.0789143103748
+21
+-97.83492941038237
+31
+212.86299679057595
+12
+31.52761588652376
+22
+-97.13490924306718
+32
+212.4471221409805
+13
+31.52761588652376
+23
+-97.13490924306718
+33
+212.4471221409805
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.52761588652376
+20
+-97.13490924306718
+30
+212.4471221409805
+11
+29.0789143103748
+21
+-97.83492941038237
+31
+212.86299679057595
+12
+28.86048124643208
+22
+-97.2042723887201
+32
+211.73341187912843
+13
+28.86048124643208
+23
+-97.2042723887201
+33
+211.73341187912843
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.130254970130956
+20
+-96.56327174007535
+30
+213.47661725014746
+11
+31.864696436452075
+21
+-97.82762802662958
+31
+213.4455863691976
+12
+33.720769031319136
+22
+-95.88911064021836
+32
+212.48393328406863
+13
+33.720769031319136
+23
+-95.88911064021836
+33
+212.48393328406863
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.720769031319136
+20
+-95.88911064021836
+30
+212.48393328406863
+11
+31.864696436452075
+21
+-97.82762802662958
+31
+213.4455863691976
+12
+31.52761588652376
+22
+-97.13490924306718
+32
+212.4471221409805
+13
+31.52761588652376
+23
+-97.13490924306718
+33
+212.4471221409805
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.07762416224503
+20
+-92.42369137647017
+30
+213.82799634326028
+11
+32.23493743759175
+21
+-91.35008374046176
+31
+213.03427508444918
+12
+32.57232221184311
+22
+-91.39845540782537
+32
+214.0969306448278
+13
+32.57232221184311
+23
+-91.39845540782537
+33
+214.0969306448278
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.07762416224503
+20
+-92.42369137647017
+30
+213.82799634326028
+11
+33.385513827329035
+21
+-92.33668322008039
+31
+212.83074901233502
+12
+32.23493743759175
+22
+-91.35008374046176
+32
+213.03427508444918
+13
+32.23493743759175
+23
+-91.35008374046176
+33
+213.03427508444918
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.57232221184311
+20
+-91.39845540782537
+30
+214.0969306448278
+11
+29.839779342297835
+21
+-91.20527296269469
+31
+213.05192009518555
+12
+30.060646200824873
+22
+-91.44074258872796
+32
+214.32114397090785
+13
+30.060646200824873
+23
+-91.44074258872796
+33
+214.32114397090785
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.57232221184311
+20
+-91.39845540782537
+30
+214.0969306448278
+11
+32.23493743759175
+21
+-91.35008374046176
+31
+213.03427508444918
+12
+29.839779342297835
+22
+-91.20527296269469
+32
+213.05192009518555
+13
+29.839779342297835
+23
+-91.20527296269469
+33
+213.05192009518555
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.01927169289143
+20
+-91.67621221476128
+30
+215.67768022734361
+11
+27.823988977834798
+21
+-92.12007550207618
+31
+213.7647176840675
+12
+28.07679939028104
+22
+-92.52743187062704
+32
+215.09874134059817
+13
+28.07679939028104
+23
+-92.52743187062704
+33
+215.09874134059817
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.060646200824873
+20
+-91.44074258872796
+30
+214.32114397090785
+11
+27.823988977834798
+21
+-92.12007550207618
+31
+213.7647176840675
+12
+30.01927169289143
+22
+-91.67621221476128
+32
+215.67768022734361
+13
+30.01927169289143
+23
+-91.67621221476128
+33
+215.67768022734361
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.040611346006802
+20
+-95.20825660525537
+30
+214.340614327582
+11
+27.07316334857207
+21
+-97.27637355328123
+31
+214.23383159019437
+12
+26.90583997090008
+22
+-95.79145463252334
+32
+215.5915847439219
+13
+26.90583997090008
+23
+-95.79145463252334
+33
+215.5915847439219
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.07316334857207
+20
+-97.27637355328123
+30
+214.23383159019437
+11
+27.040611346006802
+21
+-95.20825660525537
+31
+214.340614327582
+12
+27.21036851826312
+22
+-96.6222912587449
+32
+212.96369504150255
+13
+27.21036851826312
+23
+-96.6222912587449
+33
+212.96369504150255
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.21036851826312
+20
+-96.6222912587449
+30
+212.96369504150255
+11
+27.040611346006802
+21
+-95.20825660525537
+31
+214.340614327582
+12
+27.04121979465288
+22
+-94.66704153456689
+32
+213.04005534658606
+13
+27.04121979465288
+23
+-94.66704153456689
+33
+213.04005534658606
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.10625054894583
+20
+-98.7056194229233
+30
+214.49485605936226
+11
+29.137325380398483
+21
+-98.60005358282822
+31
+214.0896292610729
+12
+31.864696436452075
+22
+-97.82762802662958
+32
+213.4455863691976
+13
+31.864696436452075
+23
+-97.82762802662958
+33
+213.4455863691976
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.864696436452075
+20
+-97.82762802662958
+30
+213.4455863691976
+11
+29.137325380398483
+21
+-98.60005358282822
+31
+214.0896292610729
+12
+29.0789143103748
+22
+-97.83492941038237
+32
+212.86299679057595
+13
+29.0789143103748
+23
+-97.83492941038237
+33
+212.86299679057595
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.130254970130956
+20
+-96.56327174007535
+30
+213.47661725014746
+11
+34.4995832983015
+21
+-97.39349991765181
+31
+214.46930121622717
+12
+32.10625054894583
+22
+-98.7056194229233
+32
+214.49485605936226
+13
+32.10625054894583
+23
+-98.7056194229233
+33
+214.49485605936226
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.130254970130956
+20
+-96.56327174007535
+30
+213.47661725014746
+11
+32.10625054894583
+21
+-98.7056194229233
+31
+214.49485605936226
+12
+31.864696436452075
+22
+-97.82762802662958
+32
+213.4455863691976
+13
+31.864696436452075
+23
+-97.82762802662958
+33
+213.4455863691976
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.289364291080865
+20
+-92.17270630996252
+30
+215.38927556910144
+11
+32.57232221184311
+21
+-91.39845540782537
+31
+214.0969306448278
+12
+32.72625971930135
+22
+-91.24451790036753
+32
+215.6320465788876
+13
+32.72625971930135
+23
+-91.24451790036753
+33
+215.6320465788876
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.289364291080865
+20
+-92.17270630996252
+30
+215.38927556910144
+11
+34.07762416224503
+21
+-92.42369137647017
+31
+213.82799634326028
+12
+32.57232221184311
+22
+-91.39845540782537
+32
+214.0969306448278
+13
+32.57232221184311
+23
+-91.39845540782537
+33
+214.0969306448278
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.011288609654784
+20
+-93.18516485703964
+30
+215.33786165850742
+11
+34.289364291080865
+21
+-92.17270630996252
+31
+215.38927556910144
+12
+35.38365918105575
+22
+-93.59647614179013
+32
+216.62746856387398
+13
+35.38365918105575
+23
+-93.59647614179013
+33
+216.62746856387398
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.65504192737495
+20
+-92.42277870350173
+30
+216.65636987456315
+11
+35.24402021678039
+21
+-93.26578430264587
+31
+217.8857403639672
+12
+35.611523199012744
+22
+-94.55873767556594
+32
+217.74336338078447
+13
+35.611523199012744
+23
+-94.55873767556594
+33
+217.74336338078447
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.38365918105575
+20
+-93.59647614179013
+30
+216.62746856387398
+11
+34.65504192737495
+21
+-92.42277870350173
+31
+216.65636987456315
+12
+35.611523199012744
+22
+-94.55873767556594
+32
+217.74336338078447
+13
+35.611523199012744
+23
+-94.55873767556594
+33
+217.74336338078447
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.0789143103748
+20
+-97.83492941038237
+30
+212.86299679057595
+11
+27.964844839402325
+21
+-97.42696459318576
+31
+212.95304719019578
+12
+28.86048124643208
+22
+-97.2042723887201
+32
+211.73341187912843
+13
+28.86048124643208
+23
+-97.2042723887201
+33
+211.73341187912843
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.86048124643208
+20
+-97.2042723887201
+30
+211.73341187912843
+11
+27.964844839402325
+21
+-97.42696459318576
+31
+212.95304719019578
+12
+27.855932531753993
+22
+-96.81243146064469
+32
+211.8216369328103
+13
+27.855932531753993
+23
+-96.81243146064469
+33
+211.8216369328103
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.855932531753993
+20
+-96.81243146064469
+30
+211.8216369328103
+11
+27.964844839402325
+21
+-97.42696459318576
+31
+212.95304719019578
+12
+27.21036851826312
+22
+-96.6222912587449
+32
+212.96369504150255
+13
+27.21036851826312
+23
+-96.6222912587449
+33
+212.96369504150255
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.855932531753993
+20
+-96.81243146064469
+30
+211.8216369328103
+11
+27.21036851826312
+21
+-96.6222912587449
+31
+212.96369504150255
+12
+27.205500929094473
+22
+-96.01110459375732
+32
+211.82802564359417
+13
+27.205500929094473
+23
+-96.01110459375732
+33
+211.82802564359417
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.137325380398483
+20
+-98.60005358282822
+30
+214.0896292610729
+11
+27.837983296694645
+21
+-98.13033122805452
+31
+214.23291891722485
+12
+29.0789143103748
+22
+-97.83492941038237
+32
+212.86299679057595
+13
+29.0789143103748
+23
+-97.83492941038237
+33
+212.86299679057595
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.0789143103748
+20
+-97.83492941038237
+30
+212.86299679057595
+11
+27.837983296694645
+21
+-98.13033122805452
+31
+214.23291891722485
+12
+27.964844839402325
+22
+-97.42696459318576
+32
+212.95304719019578
+13
+27.964844839402325
+23
+-97.42696459318576
+33
+212.95304719019578
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.964844839402325
+20
+-97.42696459318576
+30
+212.95304719019578
+11
+27.837983296694645
+21
+-98.13033122805452
+31
+214.23291891722485
+12
+27.07316334857207
+22
+-97.27637355328123
+32
+214.23383159019437
+13
+27.07316334857207
+23
+-97.27637355328123
+33
+214.23383159019437
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.964844839402325
+20
+-97.42696459318576
+30
+212.95304719019578
+11
+27.07316334857207
+21
+-97.27637355328123
+31
+214.23383159019437
+12
+27.21036851826312
+22
+-96.6222912587449
+32
+212.96369504150255
+13
+27.21036851826312
+23
+-96.6222912587449
+33
+212.96369504150255
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.183263253177515
+20
+-99.29246814206759
+30
+215.28370972900439
+11
+27.998917963582805
+21
+-98.82761337646251
+31
+215.38288685831589
+12
+29.137325380398483
+22
+-98.60005358282822
+32
+214.0896292610729
+13
+29.137325380398483
+23
+-98.60005358282822
+33
+214.0896292610729
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.137325380398483
+20
+-98.60005358282822
+30
+214.0896292610729
+11
+27.998917963582805
+21
+-98.82761337646251
+31
+215.38288685831589
+12
+27.837983296694645
+22
+-98.13033122805452
+32
+214.23291891722485
+13
+27.837983296694645
+23
+-98.13033122805452
+33
+214.23291891722485
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.998917963582805
+20
+-98.82761337646251
+30
+215.38288685831589
+11
+27.08381119987848
+21
+-98.09169473902875
+31
+215.43369232026373
+12
+27.837983296694645
+22
+-98.13033122805452
+32
+214.23291891722485
+13
+27.837983296694645
+23
+-98.13033122805452
+33
+214.23291891722485
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.837983296694645
+20
+-98.13033122805452
+30
+214.23291891722485
+11
+27.08381119987848
+21
+-98.09169473902875
+31
+215.43369232026373
+12
+27.07316334857207
+22
+-97.27637355328123
+32
+214.23383159019437
+13
+27.07316334857207
+23
+-97.27637355328123
+33
+214.23383159019437
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.183263253177515
+20
+-99.29246814206759
+30
+215.28370972900439
+11
+29.10811984538664
+21
+-99.80599879935934
+31
+216.22254598990605
+12
+27.898828161302642
+22
+-99.35848482016753
+32
+216.29525560311274
+13
+27.898828161302642
+23
+-99.35848482016753
+33
+216.29525560311274
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.183263253177515
+20
+-99.29246814206759
+30
+215.28370972900439
+11
+27.898828161302642
+21
+-99.35848482016753
+31
+216.29525560311274
+12
+27.998917963582805
+22
+-98.82761337646251
+32
+215.38288685831589
+13
+27.998917963582805
+23
+-98.82761337646251
+33
+215.38288685831589
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.998917963582805
+20
+-98.82761337646251
+30
+215.38288685831589
+11
+27.898828161302642
+21
+-99.35848482016753
+31
+216.29525560311274
+12
+27.05977747835832
+22
+-98.52156370748448
+32
+216.29130068691353
+13
+27.05977747835832
+23
+-98.52156370748448
+33
+216.29130068691353
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.998917963582805
+20
+-98.82761337646251
+30
+215.38288685831589
+11
+27.05977747835832
+21
+-98.52156370748448
+31
+216.29130068691353
+12
+27.08381119987848
+22
+-98.09169473902875
+32
+215.43369232026373
+13
+27.08381119987848
+23
+-98.09169473902875
+33
+215.43369232026373
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.990718557028245
+20
+-94.16507140155056
+30
+211.83502280302443
+11
+27.04121979465288
+21
+-94.66704153456689
+31
+213.04005534658606
+12
+27.086853443108875
+22
+-93.29955320250214
+32
+213.41911885309426
+13
+27.086853443108875
+23
+-93.29955320250214
+33
+213.41911885309426
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.990718557028245
+20
+-94.16507140155056
+30
+211.83502280302443
+11
+27.086853443108875
+21
+-93.29955320250214
+31
+213.41911885309426
+12
+27.018402970424884
+22
+-92.87637716915317
+32
+212.17636249347586
+13
+27.018402970424884
+23
+-92.87637716915317
+33
+212.17636249347586
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.018402970424884
+20
+-92.87637716915317
+30
+212.17636249347586
+11
+27.086853443108875
+21
+-93.29955320250214
+31
+213.41911885309426
+12
+27.823988977834798
+22
+-92.12007550207618
+32
+213.7647176840675
+13
+27.823988977834798
+23
+-92.12007550207618
+33
+213.7647176840675
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.018402970424884
+20
+-92.87637716915317
+30
+212.17636249347586
+11
+27.823988977834798
+21
+-92.12007550207618
+31
+213.7647176840675
+12
+27.772270842918
+22
+-91.77721469000979
+32
+212.55633867295302
+13
+27.772270842918
+23
+-91.77721469000979
+33
+212.55633867295302
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.04121979465288
+20
+-94.66704153456689
+30
+213.04005534658606
+11
+27.040611346006802
+21
+-95.20825660525537
+31
+214.340614327582
+12
+27.100239313322643
+22
+-93.82677395433089
+32
+214.74766647180945
+13
+27.100239313322643
+23
+-93.82677395433089
+33
+214.74766647180945
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.04121979465288
+20
+-94.66704153456689
+30
+213.04005534658606
+11
+27.100239313322643
+21
+-93.82677395433089
+31
+214.74766647180945
+12
+27.086853443108875
+22
+-93.29955320250214
+32
+213.41911885309426
+13
+27.086853443108875
+23
+-93.29955320250214
+33
+213.41911885309426
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.086853443108875
+20
+-93.29955320250214
+30
+213.41911885309426
+11
+27.100239313322643
+21
+-93.82677395433089
+31
+214.74766647180945
+12
+28.07679939028104
+22
+-92.52743187062704
+32
+215.09874134059817
+13
+28.07679939028104
+23
+-92.52743187062704
+33
+215.09874134059817
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.086853443108875
+20
+-93.29955320250214
+30
+213.41911885309426
+11
+28.07679939028104
+21
+-92.52743187062704
+31
+215.09874134059817
+12
+27.823988977834798
+22
+-92.12007550207618
+32
+213.7647176840675
+13
+27.823988977834798
+23
+-92.12007550207618
+33
+213.7647176840675
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.040611346006802
+20
+-95.20825660525537
+30
+214.340614327582
+11
+26.90583997090008
+21
+-95.79145463252334
+31
+215.5915847439219
+12
+26.958775003109054
+22
+-94.16233338264422
+32
+216.09325065261564
+13
+26.958775003109054
+23
+-94.16233338264422
+33
+216.09325065261564
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.040611346006802
+20
+-95.20825660525537
+30
+214.340614327582
+11
+26.958775003109054
+21
+-94.16233338264422
+31
+216.09325065261564
+12
+27.100239313322643
+22
+-93.82677395433089
+32
+214.74766647180945
+13
+27.100239313322643
+23
+-93.82677395433089
+33
+214.74766647180945
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.100239313322643
+20
+-93.82677395433089
+30
+214.74766647180945
+11
+26.958775003109054
+21
+-94.16233338264422
+31
+216.09325065261564
+12
+27.711730202633042
+22
+-92.89706442312094
+32
+216.23775720605994
+13
+27.711730202633042
+23
+-92.89706442312094
+33
+216.23775720605994
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.100239313322643
+20
+-93.82677395433089
+30
+214.74766647180945
+11
+27.711730202633042
+21
+-92.89706442312094
+31
+216.23775720605994
+12
+28.07679939028104
+22
+-92.52743187062704
+32
+215.09874134059817
+13
+28.07679939028104
+23
+-92.52743187062704
+33
+215.09874134059817
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.90583997090008
+20
+-95.79145463252334
+30
+215.5915847439219
+11
+26.86020632244408
+21
+-96.30589796278426
+31
+216.5663194749422
+12
+26.908577989807444
+22
+-94.87847743908081
+32
+217.10935989156906
+13
+26.908577989807444
+23
+-94.87847743908081
+33
+217.10935989156906
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.90583997090008
+20
+-95.79145463252334
+30
+215.5915847439219
+11
+26.908577989807444
+21
+-94.87847743908081
+31
+217.10935989156906
+12
+26.958775003109054
+22
+-94.16233338264422
+32
+216.09325065261564
+13
+26.958775003109054
+23
+-94.16233338264422
+33
+216.09325065261564
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.958775003109054
+20
+-94.16233338264422
+30
+216.09325065261564
+11
+26.908577989807444
+21
+-94.87847743908081
+31
+217.10935989156906
+12
+27.696214762157997
+22
+-93.22319289742038
+32
+218.26632499209026
+13
+27.696214762157997
+23
+-93.22319289742038
+33
+218.26632499209026
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.958775003109054
+20
+-94.16233338264422
+30
+216.09325065261564
+11
+27.696214762157997
+21
+-93.22319289742038
+31
+218.26632499209026
+12
+27.711730202633042
+22
+-92.89706442312094
+32
+216.23775720605994
+13
+27.711730202633042
+23
+-92.89706442312094
+33
+216.23775720605994
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.610046027900076
+20
+-91.83623420868129
+30
+219.30585950391847
+11
+30.29368203227351
+21
+-91.84962007889482
+31
+218.40383438610505
+12
+30.219147073128717
+22
+-91.99564775395427
+32
+219.56536285147152
+13
+30.219147073128717
+23
+-91.99564775395427
+33
+219.56536285147152
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.211801738873184
+20
+-91.65887142834873
+30
+218.47380598040414
+11
+30.29368203227351
+21
+-91.84962007889482
+31
+218.40383438610505
+12
+32.610046027900076
+22
+-91.83623420868129
+32
+219.30585950391847
+13
+32.610046027900076
+23
+-91.83623420868129
+33
+219.30585950391847
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.219147073128717
+20
+-91.99564775395427
+30
+219.56536285147152
+11
+27.696214762157997
+21
+-93.22319289742038
+31
+218.26632499209026
+12
+27.594299613939597
+22
+-93.42580629656537
+32
+219.5991317513288
+13
+27.594299613939597
+23
+-93.42580629656537
+33
+219.5991317513288
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.71874201223048
+20
+-99.08985474292362
+30
+217.78869280491622
+11
+26.79327697137528
+21
+-98.08256800933866
+31
+219.32685098220662
+12
+26.774719287669836
+22
+-97.51823189009912
+32
+218.41265689147167
+13
+26.774719287669836
+23
+-97.51823189009912
+33
+218.41265689147167
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.774719287669836
+20
+-97.51823189009912
+30
+218.41265689147167
+11
+26.79327697137528
+21
+-98.08256800933866
+31
+219.32685098220662
+12
+26.848037349522475
+22
+-97.2453426723327
+32
+220.27146750524602
+13
+26.848037349522475
+23
+-97.2453426723327
+33
+220.27146750524602
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.774719287669836
+20
+-97.51823189009912
+30
+218.41265689147167
+11
+26.848037349522475
+21
+-97.2453426723327
+31
+220.27146750524602
+12
+26.838302171185212
+22
+-96.09354938530298
+32
+218.67915739845512
+13
+26.838302171185212
+23
+-96.09354938530298
+33
+218.67915739845512
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.908577989807444
+20
+-94.87847743908081
+30
+217.10935989156906
+11
+27.272734504486323
+21
+-95.10847102729942
+31
+218.93440160548582
+12
+27.696214762157997
+22
+-93.22319289742038
+32
+218.26632499209026
+13
+27.696214762157997
+23
+-93.22319289742038
+33
+218.26632499209026
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.696214762157997
+20
+-93.22319289742038
+30
+218.26632499209026
+11
+27.272734504486323
+21
+-95.10847102729942
+31
+218.93440160548582
+12
+27.594299613939597
+22
+-93.42580629656537
+32
+219.5991317513288
+13
+27.594299613939597
+23
+-93.42580629656537
+33
+219.5991317513288
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.908577989807444
+20
+-94.87847743908081
+30
+217.10935989156906
+11
+26.838302171185212
+21
+-96.09354938530298
+31
+218.67915739845512
+12
+27.272734504486323
+22
+-95.10847102729942
+32
+218.93440160548582
+13
+27.272734504486323
+23
+-95.10847102729942
+33
+218.93440160548582
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.838302171185212
+20
+-96.09354938530298
+30
+218.67915739845512
+11
+26.848037349522475
+21
+-97.2453426723327
+31
+220.27146750524602
+12
+27.14830675636295
+22
+-95.65303256554132
+32
+220.0718963493322
+13
+27.14830675636295
+23
+-95.65303256554132
+33
+220.0718963493322
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.838302171185212
+20
+-96.09354938530298
+30
+218.67915739845512
+11
+27.14830675636295
+21
+-95.65303256554132
+31
+220.0718963493322
+12
+27.272734504486323
+22
+-95.10847102729942
+32
+218.93440160548582
+13
+27.272734504486323
+23
+-95.10847102729942
+33
+218.93440160548582
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.272734504486323
+20
+-95.10847102729942
+30
+218.93440160548582
+11
+27.14830675636295
+21
+-95.65303256554132
+31
+220.0718963493322
+12
+27.491776017075125
+22
+-93.84198517048435
+32
+220.6456634225862
+13
+27.491776017075125
+23
+-93.84198517048435
+33
+220.6456634225862
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.272734504486323
+20
+-95.10847102729942
+30
+218.93440160548582
+11
+27.491776017075125
+21
+-93.84198517048435
+31
+220.6456634225862
+12
+27.594299613939597
+22
+-93.42580629656537
+32
+219.5991317513288
+13
+27.594299613939597
+23
+-93.42580629656537
+33
+219.5991317513288
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.389237770043117
+20
+-93.18425218407184
+30
+220.55409190135126
+11
+27.594299613939597
+21
+-93.42580629656537
+31
+219.5991317513288
+12
+27.491776017075125
+22
+-93.84198517048435
+32
+220.6456634225862
+13
+27.491776017075125
+23
+-93.84198517048435
+33
+220.6456634225862
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.219147073128717
+20
+-91.99564775395427
+30
+219.56536285147152
+11
+27.594299613939597
+21
+-93.42580629656537
+31
+219.5991317513288
+12
+28.389237770043117
+22
+-93.18425218407184
+32
+220.55409190135126
+13
+28.389237770043117
+23
+-93.18425218407184
+33
+220.55409190135126
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.219147073128717
+20
+-91.99564775395427
+30
+219.56536285147152
+11
+30.143090992368737
+21
+-93.67739981171984
+31
+220.60428891465284
+12
+32.22611493222361
+22
+-94.15716156915374
+32
+220.56960734182616
+13
+32.22611493222361
+23
+-94.15716156915374
+33
+220.56960734182616
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.610046027900076
+20
+-91.83623420868129
+30
+219.30585950391847
+11
+30.219147073128717
+21
+-91.99564775395427
+31
+219.56536285147152
+12
+32.22611493222361
+22
+-94.15716156915374
+32
+220.56960734182616
+13
+32.22611493222361
+23
+-94.15716156915374
+33
+220.56960734182616
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.610046027900076
+20
+-91.83623420868129
+30
+219.30585950391847
+11
+32.22611493222361
+21
+-94.15716156915374
+31
+220.56960734182616
+12
+33.9997427355468
+22
+-94.74583563423604
+32
+220.18628469479546
+13
+33.9997427355468
+23
+-94.74583563423604
+33
+220.18628469479546
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.610046027900076
+20
+-91.83623420868129
+30
+219.30585950391847
+11
+33.9997427355468
+21
+-94.74583563423604
+31
+220.18628469479546
+12
+34.93705787483304
+22
+-93.91256521342929
+32
+219.15526846401315
+13
+34.93705787483304
+23
+-93.91256521342929
+33
+219.15526846401315
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.93705787483304
+20
+-93.91256521342929
+30
+219.15526846401315
+11
+33.9997427355468
+21
+-94.74583563423604
+31
+220.18628469479546
+12
+34.13907747549911
+22
+-95.97125120744099
+32
+219.76584668035372
+13
+34.13907747549911
+23
+-95.97125120744099
+33
+219.76584668035372
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.93705787483304
+20
+-93.91256521342929
+30
+219.15526846401315
+11
+34.13907747549911
+21
+-95.97125120744099
+31
+219.76584668035372
+12
+35.4563687942623
+22
+-95.22985653219246
+32
+219.16561209099632
+13
+35.4563687942623
+23
+-95.22985653219246
+33
+219.16561209099632
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.75878242153161
+20
+-99.32441169598776
+30
+218.7314839820171
+11
+35.40404221069942
+21
+-97.17689219964831
+31
+218.77620495750455
+12
+34.7749063106527
+22
+-97.42118433104957
+32
+219.35088470372662
+13
+34.7749063106527
+23
+-97.42118433104957
+33
+219.35088470372662
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.385484526993984
+20
+-99.35270455803021
+30
+218.07770591180403
+11
+35.40404221069942
+21
+-97.17689219964831
+31
+218.77620495750455
+12
+34.75878242153161
+22
+-99.32441169598776
+32
+218.7314839820171
+13
+34.75878242153161
+23
+-99.32441169598776
+33
+218.7314839820171
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.385484526993984
+20
+-99.35270455803021
+30
+218.07770591180403
+11
+34.75878242153161
+21
+-99.32441169598776
+31
+218.7314839820171
+12
+33.271125481866
+22
+-99.92829697722192
+32
+218.13155361698216
+13
+33.271125481866
+23
+-99.92829697722192
+33
+218.13155361698216
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.385484526993984
+20
+-99.35270455803021
+30
+218.07770591180403
+11
+33.271125481866
+21
+-99.92829697722192
+31
+218.13155361698216
+12
+33.69095504766119
+22
+-99.96480389598652
+32
+217.2389594531824
+13
+33.69095504766119
+23
+-99.96480389598652
+33
+217.2389594531824
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.128807099353356
+20
+-100.31831255935928
+30
+218.44094975351334
+11
+28.049114976884404
+21
+-100.2617268352739
+31
+218.70866715778857
+12
+28.9648301892348
+22
+-100.39741088334945
+32
+217.56782594638878
+13
+28.9648301892348
+23
+-100.39741088334945
+33
+217.56782594638878
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.9648301892348
+20
+-100.39741088334945
+30
+217.56782594638878
+11
+28.049114976884404
+21
+-100.2617268352739
+31
+218.70866715778857
+12
+27.736372372799277
+22
+-100.24073535698389
+32
+217.6886030026357
+13
+27.736372372799277
+23
+-100.24073535698389
+33
+217.6886030026357
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.96813270628567
+20
+-100.3459969727556
+30
+217.2572129125649
+11
+31.766127755787114
+21
+-100.13364839527405
+31
+217.88999950448795
+12
+29.128807099353356
+22
+-100.31831255935928
+32
+218.44094975351334
+13
+29.128807099353356
+23
+-100.31831255935928
+33
+218.44094975351334
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.96813270628567
+20
+-100.3459969727556
+30
+217.2572129125649
+11
+29.128807099353356
+21
+-100.31831255935928
+31
+218.44094975351334
+12
+28.9648301892348
+22
+-100.39741088334945
+32
+217.56782594638878
+13
+28.9648301892348
+23
+-100.39741088334945
+33
+217.56782594638878
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.69095504766119
+20
+-99.96480389598652
+30
+217.2389594531824
+11
+33.271125481866
+21
+-99.92829697722192
+31
+218.13155361698216
+12
+31.766127755787114
+22
+-100.13364839527405
+32
+217.88999950448795
+13
+31.766127755787114
+23
+-100.13364839527405
+33
+217.88999950448795
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.69095504766119
+20
+-99.96480389598652
+30
+217.2389594531824
+11
+31.766127755787114
+21
+-100.13364839527405
+31
+217.88999950448795
+12
+31.96813270628567
+22
+-100.3459969727556
+32
+217.2572129125649
+13
+31.96813270628567
+23
+-100.3459969727556
+33
+217.2572129125649
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.049114976884404
+20
+-100.2617268352739
+30
+218.70866715778857
+11
+27.16929823465272
+21
+-99.42754374149841
+31
+219.3940845575979
+12
+27.736372372799277
+22
+-100.24073535698389
+32
+217.6886030026357
+13
+27.736372372799277
+23
+-100.24073535698389
+33
+217.6886030026357
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.736372372799277
+20
+-100.24073535698389
+30
+217.6886030026357
+11
+27.16929823465272
+21
+-99.42754374149841
+31
+219.3940845575979
+12
+26.71874201223048
+22
+-99.08985474292362
+32
+217.78869280491622
+13
+26.71874201223048
+23
+-99.08985474292362
+33
+217.78869280491622
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.79327697137528
+20
+-98.08256800933866
+30
+219.32685098220662
+11
+27.16929823465272
+21
+-99.42754374149841
+31
+219.3940845575979
+12
+27.22831775332248
+22
+-98.21399291689204
+32
+219.8315591341297
+13
+27.22831775332248
+23
+-98.21399291689204
+33
+219.8315591341297
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.79327697137528
+20
+-98.08256800933866
+30
+219.32685098220662
+11
+27.22831775332248
+21
+-98.21399291689204
+31
+219.8315591341297
+12
+27.281252785531443
+22
+-97.34756204487427
+32
+220.39437413175426
+13
+27.281252785531443
+23
+-97.34756204487427
+33
+220.39437413175426
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.281252785531443
+20
+-97.34756204487427
+30
+220.39437413175426
+11
+26.848037349522475
+21
+-97.2453426723327
+31
+220.27146750524602
+12
+26.79327697137528
+22
+-98.08256800933866
+32
+219.32685098220662
+13
+26.79327697137528
+23
+-98.08256800933866
+33
+219.32685098220662
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.839779342297835
+20
+-91.20527296269469
+30
+213.05192009518555
+11
+31.704065993886946
+21
+-91.40545256725466
+31
+211.5335364988928
+12
+29.680974245670953
+22
+-91.28193749210041
+32
+211.56639272578104
+13
+29.680974245670953
+23
+-91.28193749210041
+33
+211.56639272578104
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.704065993886946
+20
+-91.40545256725466
+30
+211.5335364988928
+11
+29.839779342297835
+21
+-91.20527296269469
+31
+213.05192009518555
+12
+32.23493743759175
+22
+-91.35008374046176
+32
+213.03427508444918
+13
+32.23493743759175
+23
+-91.35008374046176
+33
+213.03427508444918
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.720769031319136
+20
+-95.88911064021836
+30
+212.48393328406863
+11
+33.45000938381351
+21
+-94.53683352430528
+31
+211.33792025917725
+12
+34.15824360785063
+22
+-94.96731094140722
+32
+212.55846824321347
+13
+34.15824360785063
+23
+-94.96731094140722
+33
+212.55846824321347
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.45000938381351
+20
+-94.53683352430528
+30
+211.33792025917725
+11
+33.720769031319136
+21
+-95.88911064021836
+31
+212.48393328406863
+12
+33.070337428659585
+22
+-95.33663926957755
+32
+211.2731204783691
+13
+33.070337428659585
+23
+-95.33663926957755
+33
+211.2731204783691
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.45000938381351
+20
+-94.53683352430528
+30
+211.33792025917725
+11
+34.000655408515904
+21
+-93.95576506729923
+31
+212.5435612513846
+12
+34.15824360785063
+22
+-94.96731094140722
+32
+212.55846824321347
+13
+34.15824360785063
+23
+-94.96731094140722
+33
+212.55846824321347
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.000655408515904
+20
+-93.95576506729923
+30
+212.5435612513846
+11
+33.45000938381351
+21
+-94.53683352430528
+31
+211.33792025917725
+12
+33.18533422276871
+22
+-93.60347330121856
+32
+211.0978872682988
+13
+33.18533422276871
+23
+-93.60347330121856
+33
+211.0978872682988
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.199328541628546
+20
+-92.77263667499638
+30
+211.40819607779994
+11
+33.385513827329035
+21
+-92.33668322008039
+31
+212.83074901233502
+12
+33.99304980043991
+22
+-92.96460222283496
+32
+212.86695170677635
+13
+33.99304980043991
+23
+-92.96460222283496
+33
+212.86695170677635
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.385513827329035
+20
+-92.33668322008039
+30
+212.83074901233502
+11
+33.199328541628546
+21
+-92.77263667499638
+31
+211.40819607779994
+12
+32.68884012756743
+22
+-92.24115678264545
+32
+211.38659615086425
+13
+32.68884012756743
+23
+-92.24115678264545
+33
+211.38659615086425
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.445533919973037
+20
+-95.36280256135876
+30
+210.54632857062666
+11
+27.855932531753993
+21
+-96.81243146064469
+31
+211.8216369328103
+12
+27.205500929094473
+22
+-96.01110459375732
+32
+211.82802564359417
+13
+27.205500929094473
+23
+-96.01110459375732
+33
+211.82802564359417
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.855932531753993
+20
+-96.81243146064469
+30
+211.8216369328103
+11
+27.445533919973037
+21
+-95.36280256135876
+31
+210.54632857062666
+12
+28.000134860874965
+22
+-96.0320960720467
+32
+210.5219906247835
+13
+28.000134860874965
+23
+-96.0320960720467
+33
+210.5219906247835
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.000134860874965
+20
+-96.0320960720467
+30
+210.5219906247835
+11
+28.86048124643208
+21
+-97.2042723887201
+31
+211.73341187912843
+12
+27.855932531753993
+22
+-96.81243146064469
+32
+211.8216369328103
+13
+27.855932531753993
+23
+-96.81243146064469
+33
+211.8216369328103
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.86048124643208
+20
+-97.2042723887201
+30
+211.73341187912843
+11
+28.000134860874965
+21
+-96.0320960720467
+31
+210.5219906247835
+12
+28.85105029241783
+22
+-96.35883299499164
+32
+210.43954583323958
+13
+28.85105029241783
+23
+-96.35883299499164
+33
+210.43954583323958
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.926816799022323
+20
+-91.76687106302606
+30
+211.1660335166599
+11
+27.018402970424884
+21
+-92.87637716915317
+31
+212.17636249347586
+12
+27.772270842918
+22
+-91.77721469000979
+32
+212.55633867295302
+13
+27.772270842918
+23
+-91.77721469000979
+33
+212.55633867295302
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.018402970424884
+20
+-92.87637716915317
+30
+212.17636249347586
+11
+27.926816799022323
+21
+-91.76687106302606
+31
+211.1660335166599
+12
+27.2693880369329
+22
+-92.71179181038835
+32
+210.92873854468885
+13
+27.2693880369329
+23
+-92.71179181038835
+33
+210.92873854468885
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.2693880369329
+20
+-92.71179181038835
+30
+210.92873854468885
+11
+26.990718557028245
+21
+-94.16507140155056
+31
+211.83502280302443
+12
+27.018402970424884
+22
+-92.87637716915317
+32
+212.17636249347586
+13
+27.018402970424884
+23
+-92.87637716915317
+33
+212.17636249347586
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.990718557028245
+20
+-94.16507140155056
+30
+211.83502280302443
+11
+27.2693880369329
+21
+-92.71179181038835
+31
+210.92873854468885
+12
+27.264216223441203
+22
+-93.79391772744148
+32
+210.54845814088833
+13
+27.264216223441203
+23
+-93.79391772744148
+33
+210.54845814088833
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.192027157875586
+20
+-93.21132814882
+30
+211.22535725965272
+11
+33.81751236604583
+21
+-93.52741722045893
+31
+212.69476073993584
+12
+34.000655408515904
+22
+-93.95576506729923
+32
+212.5435612513846
+13
+34.000655408515904
+23
+-93.95576506729923
+33
+212.5435612513846
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.18533422276871
+20
+-93.60347330121856
+30
+211.0978872682988
+11
+33.192027157875586
+21
+-93.21132814882
+31
+211.22535725965272
+12
+34.000655408515904
+22
+-93.95576506729923
+32
+212.5435612513846
+13
+34.000655408515904
+23
+-93.95576506729923
+33
+212.5435612513846
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.199328541628546
+20
+-92.77263667499638
+30
+211.40819607779994
+11
+33.99304980043991
+21
+-92.96460222283496
+31
+212.86695170677635
+12
+33.81751236604583
+22
+-93.52741722045893
+32
+212.69476073993584
+13
+33.81751236604583
+23
+-93.52741722045893
+33
+212.69476073993584
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.192027157875586
+20
+-93.21132814882
+30
+211.22535725965272
+11
+33.199328541628546
+21
+-92.77263667499638
+31
+211.40819607779994
+12
+33.81751236604583
+22
+-93.52741722045893
+32
+212.69476073993584
+13
+33.81751236604583
+23
+-93.52741722045893
+33
+212.69476073993584
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.69709813479208
+20
+-91.59863501238489
+30
+210.98623694174367
+11
+31.15646221241496
+21
+-91.93236909475976
+31
+210.9156568987984
+12
+28.4917613669076
+22
+-91.91168184079301
+32
+210.74498705357297
+13
+28.4917613669076
+23
+-91.91168184079301
+33
+210.74498705357297
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.85252746353047
+20
+-92.22472866920118
+30
+210.98258624986715
+11
+32.11628995160615
+21
+-92.72821992383238
+31
+210.94790467704047
+12
+27.80208482657592
+22
+-92.66007367547145
+32
+210.53750606525944
+13
+27.80208482657592
+23
+-92.66007367547145
+33
+210.53750606525944
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.284526002247304
+20
+-93.24266325409305
+30
+210.8681979044038
+11
+32.37701019645144
+21
+-93.65945057665778
+31
+210.72977583742016
+12
+27.685871135174636
+22
+-93.66553506311841
+32
+210.26127037993857
+13
+27.685871135174636
+23
+-93.66553506311841
+33
+210.26127037993857
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.872360645198164
+20
+-95.13889345960125
+30
+210.24940563133956
+11
+30.87444626495687
+21
+-95.64633963043212
+31
+210.67197321604235
+12
+28.534048547810162
+22
+-95.88606839698741
+32
+210.29108436359616
+13
+28.534048547810162
+23
+-95.88606839698741
+33
+210.29108436359616
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.4917613669076
+20
+-91.91168184079301
+30
+210.74498705357297
+11
+31.15646221241496
+21
+-91.93236909475976
+31
+210.9156568987984
+12
+31.85252746353047
+22
+-92.22472866920118
+32
+210.98258624986715
+13
+31.85252746353047
+23
+-92.22472866920118
+33
+210.98258624986715
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.4917613669076
+20
+-91.91168184079301
+30
+210.74498705357297
+11
+31.85252746353047
+21
+-92.22472866920118
+31
+210.98258624986715
+12
+27.80208482657592
+22
+-92.66007367547145
+32
+210.53750606525944
+13
+27.80208482657592
+23
+-92.66007367547145
+33
+210.53750606525944
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.80208482657592
+20
+-92.66007367547145
+30
+210.53750606525944
+11
+32.284526002247304
+21
+-93.24266325409305
+31
+210.8681979044038
+12
+27.685871135174636
+22
+-93.66553506311841
+32
+210.26127037993857
+13
+27.685871135174636
+23
+-93.66553506311841
+33
+210.26127037993857
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.80208482657592
+20
+-92.66007367547145
+30
+210.53750606525944
+11
+32.11628995160615
+21
+-92.72821992383238
+31
+210.94790467704047
+12
+32.284526002247304
+22
+-93.24266325409305
+32
+210.8681979044038
+13
+32.284526002247304
+23
+-93.24266325409305
+33
+210.8681979044038
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.37701019645144
+20
+-93.65945057665778
+30
+210.72977583742016
+11
+32.36849191540632
+21
+-94.31018640364033
+31
+210.72186600502124
+12
+27.685871135174636
+22
+-93.66553506311841
+32
+210.26127037993857
+13
+27.685871135174636
+23
+-93.66553506311841
+33
+210.26127037993857
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.685871135174636
+20
+-93.66553506311841
+30
+210.26127037993857
+11
+32.36849191540632
+21
+-94.31018640364033
+31
+210.72186600502124
+12
+27.872360645198164
+22
+-95.13889345960125
+32
+210.24940563133956
+13
+27.872360645198164
+23
+-95.13889345960125
+33
+210.24940563133956
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.36849191540632
+20
+-94.31018640364033
+30
+210.72186600502124
+11
+32.00616074666567
+21
+-94.97278697922145
+31
+210.72125755637464
+12
+27.872360645198164
+22
+-95.13889345960125
+32
+210.24940563133956
+13
+27.872360645198164
+23
+-95.13889345960125
+33
+210.24940563133956
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.00616074666567
+20
+-94.97278697922145
+30
+210.72125755637464
+11
+30.87444626495687
+21
+-95.64633963043212
+31
+210.67197321604235
+12
+27.872360645198164
+22
+-95.13889345960125
+32
+210.24940563133956
+13
+27.872360645198164
+23
+-95.13889345960125
+33
+210.24940563133956
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.69709813479208
+20
+-91.59863501238489
+30
+210.98623694174367
+11
+27.926816799022323
+21
+-91.76687106302606
+31
+211.1660335166599
+12
+29.680974245670953
+22
+-91.28193749210041
+32
+211.56639272578104
+13
+29.680974245670953
+23
+-91.28193749210041
+33
+211.56639272578104
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.69709813479208
+20
+-91.59863501238489
+30
+210.98623694174367
+11
+28.4917613669076
+21
+-91.91168184079301
+31
+210.74498705357297
+12
+27.926816799022323
+22
+-91.76687106302606
+32
+211.1660335166599
+13
+27.926816799022323
+23
+-91.76687106302606
+33
+211.1660335166599
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.685871135174636
+20
+-93.66553506311841
+30
+210.26127037993857
+11
+27.445533919973037
+21
+-95.36280256135876
+31
+210.54632857062666
+12
+27.264216223441203
+22
+-93.79391772744148
+32
+210.54845814088833
+13
+27.264216223441203
+23
+-93.79391772744148
+33
+210.54845814088833
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.685871135174636
+20
+-93.66553506311841
+30
+210.26127037993857
+11
+27.872360645198164
+21
+-95.13889345960125
+31
+210.24940563133956
+12
+27.445533919973037
+22
+-95.36280256135876
+32
+210.54632857062666
+13
+27.445533919973037
+23
+-95.36280256135876
+33
+210.54632857062666
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.534048547810162
+20
+-95.88606839698741
+30
+210.29108436359616
+11
+31.098659591037357
+21
+-96.28216846558571
+31
+211.0130086821701
+12
+28.85105029241783
+22
+-96.35883299499164
+32
+210.43954583323958
+13
+28.85105029241783
+23
+-96.35883299499164
+33
+210.43954583323958
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.070337428659585
+20
+-95.33663926957755
+30
+211.2731204783691
+11
+31.098659591037357
+21
+-96.28216846558571
+31
+211.0130086821701
+12
+30.87444626495687
+22
+-95.64633963043212
+32
+210.67197321604235
+13
+30.87444626495687
+23
+-95.64633963043212
+33
+210.67197321604235
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.00616074666567
+20
+-94.97278697922145
+30
+210.72125755637464
+11
+33.070337428659585
+21
+-95.33663926957755
+31
+211.2731204783691
+12
+30.87444626495687
+22
+-95.64633963043212
+32
+210.67197321604235
+13
+30.87444626495687
+23
+-95.64633963043212
+33
+210.67197321604235
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.704065993886946
+20
+-91.40545256725466
+30
+211.5335364988928
+11
+32.68884012756743
+21
+-92.24115678264545
+31
+211.38659615086425
+12
+31.85252746353047
+22
+-92.22472866920118
+32
+210.98258624986715
+13
+31.85252746353047
+23
+-92.22472866920118
+33
+210.98258624986715
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.704065993886946
+20
+-91.40545256725466
+30
+211.5335364988928
+11
+31.85252746353047
+21
+-92.22472866920118
+31
+210.98258624986715
+12
+31.15646221241496
+22
+-91.93236909475976
+32
+210.9156568987984
+13
+31.15646221241496
+23
+-91.93236909475976
+33
+210.9156568987984
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.15646221241496
+20
+-91.93236909475976
+30
+210.9156568987984
+11
+29.69709813479208
+21
+-91.59863501238489
+31
+210.98623694174367
+12
+29.680974245670953
+22
+-91.28193749210041
+32
+211.56639272578104
+13
+29.680974245670953
+23
+-91.28193749210041
+33
+211.56639272578104
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.704065993886946
+20
+-91.40545256725466
+30
+211.5335364988928
+11
+31.15646221241496
+21
+-91.93236909475976
+31
+210.9156568987984
+12
+29.680974245670953
+22
+-91.28193749210041
+32
+211.56639272578104
+13
+29.680974245670953
+23
+-91.28193749210041
+33
+211.56639272578104
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.45000938381351
+20
+-94.53683352430528
+30
+211.33792025917725
+11
+33.070337428659585
+21
+-95.33663926957755
+31
+211.2731204783691
+12
+32.00616074666567
+22
+-94.97278697922145
+32
+210.72125755637464
+13
+32.00616074666567
+23
+-94.97278697922145
+33
+210.72125755637464
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.36849191540632
+20
+-94.31018640364033
+30
+210.72186600502124
+11
+33.45000938381351
+21
+-94.53683352430528
+31
+211.33792025917725
+12
+32.00616074666567
+22
+-94.97278697922145
+32
+210.72125755637464
+13
+32.00616074666567
+23
+-94.97278697922145
+33
+210.72125755637464
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.18533422276871
+20
+-93.60347330121856
+30
+211.0978872682988
+11
+33.45000938381351
+21
+-94.53683352430528
+31
+211.33792025917725
+12
+32.36849191540632
+22
+-94.31018640364033
+32
+210.72186600502124
+13
+32.36849191540632
+23
+-94.31018640364033
+33
+210.72186600502124
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.18533422276871
+20
+-93.60347330121856
+30
+211.0978872682988
+11
+32.36849191540632
+21
+-94.31018640364033
+31
+210.72186600502124
+12
+32.37701019645144
+22
+-93.65945057665778
+32
+210.72977583742016
+13
+32.37701019645144
+23
+-93.65945057665778
+33
+210.72977583742016
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.85252746353047
+20
+-92.22472866920118
+30
+210.98258624986715
+11
+32.68884012756743
+21
+-92.24115678264545
+31
+211.38659615086425
+12
+32.11628995160615
+22
+-92.72821992383238
+32
+210.94790467704047
+13
+32.11628995160615
+23
+-92.72821992383238
+33
+210.94790467704047
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.68884012756743
+20
+-92.24115678264545
+30
+211.38659615086425
+11
+33.199328541628546
+21
+-92.77263667499638
+31
+211.40819607779994
+12
+32.11628995160615
+22
+-92.72821992383238
+32
+210.94790467704047
+13
+32.11628995160615
+23
+-92.72821992383238
+33
+210.94790467704047
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.872360645198164
+20
+-95.13889345960125
+30
+210.24940563133956
+11
+28.000134860874965
+21
+-96.0320960720467
+31
+210.5219906247835
+12
+27.445533919973037
+22
+-95.36280256135876
+32
+210.54632857062666
+13
+27.445533919973037
+23
+-95.36280256135876
+33
+210.54632857062666
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.872360645198164
+20
+-95.13889345960125
+30
+210.24940563133956
+11
+28.534048547810162
+21
+-95.88606839698741
+31
+210.29108436359616
+12
+28.000134860874965
+22
+-96.0320960720467
+32
+210.5219906247835
+13
+28.000134860874965
+23
+-96.0320960720467
+33
+210.5219906247835
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.534048547810162
+20
+-95.88606839698741
+30
+210.29108436359616
+11
+28.85105029241783
+21
+-96.35883299499164
+31
+210.43954583323958
+12
+28.000134860874965
+22
+-96.0320960720467
+32
+210.5219906247835
+13
+28.000134860874965
+23
+-96.0320960720467
+33
+210.5219906247835
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.926816799022323
+20
+-91.76687106302606
+30
+211.1660335166599
+11
+28.4917613669076
+21
+-91.91168184079301
+31
+210.74498705357297
+12
+27.2693880369329
+22
+-92.71179181038835
+32
+210.92873854468885
+13
+27.2693880369329
+23
+-92.71179181038835
+33
+210.92873854468885
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.4917613669076
+20
+-91.91168184079301
+30
+210.74498705357297
+11
+27.80208482657592
+21
+-92.66007367547145
+31
+210.53750606525944
+12
+27.2693880369329
+22
+-92.71179181038835
+32
+210.92873854468885
+13
+27.2693880369329
+23
+-92.71179181038835
+33
+210.92873854468885
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.98027237887223
+20
+-98.94991155432552
+30
+218.82701041945134
+11
+31.129690471987438
+21
+-99.41020295508494
+31
+218.61892098249234
+12
+32.54037865792391
+22
+-99.2103275748476
+32
+218.4421666508058
+13
+32.54037865792391
+23
+-99.2103275748476
+33
+218.4421666508058
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.43177057459864
+20
+-98.62986756648735
+30
+218.78411478990313
+11
+31.129690471987438
+21
+-99.41020295508494
+31
+218.61892098249234
+12
+33.98027237887223
+22
+-98.94991155432552
+32
+218.82701041945134
+13
+33.98027237887223
+23
+-98.94991155432552
+33
+218.82701041945134
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.506045259922953
+20
+-95.03028537627848
+30
+220.4092811235839
+11
+30.015012552368876
+21
+-96.62928841817663
+31
+219.8924039987385
+12
+30.99157262932727
+22
+-95.81366300810646
+32
+220.15799183275251
+13
+30.99157262932727
+23
+-95.81366300810646
+33
+220.15799183275251
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.506045259922953
+20
+-95.03028537627848
+30
+220.4092811235839
+11
+28.554431577453837
+21
+-96.52706904563544
+31
+220.42905570458097
+12
+30.015012552368876
+22
+-96.62928841817663
+32
+219.8924039987385
+13
+30.015012552368876
+23
+-96.62928841817663
+33
+219.8924039987385
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.99157262932727
+20
+-95.81366300810646
+30
+220.15799183275251
+11
+30.015012552368876
+21
+-96.62928841817663
+31
+219.8924039987385
+12
+32.26505564557271
+22
+-96.61042651014813
+32
+219.42572388719518
+13
+32.26505564557271
+23
+-96.61042651014813
+33
+219.42572388719518
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.26505564557271
+20
+-96.61042651014813
+30
+219.42572388719518
+11
+30.015012552368876
+21
+-96.62928841817663
+31
+219.8924039987385
+12
+29.819396312654156
+22
+-97.39349991765316
+32
+219.68826947797797
+13
+29.819396312654156
+23
+-97.39349991765316
+33
+219.68826947797797
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.26505564557271
+20
+-96.61042651014813
+30
+219.42572388719518
+11
+29.819396312654156
+21
+-97.39349991765316
+31
+219.68826947797797
+12
+32.32590051018071
+22
+-97.53557267651263
+32
+219.2754370716131
+13
+32.32590051018071
+23
+-97.53557267651263
+33
+219.2754370716131
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.554431577453837
+20
+-96.52706904563544
+30
+220.42905570458097
+11
+28.280021238071757
+21
+-97.14129795385307
+31
+220.26386189717024
+12
+30.015012552368876
+22
+-96.62928841817663
+32
+219.8924039987385
+13
+30.015012552368876
+23
+-96.62928841817663
+33
+219.8924039987385
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.015012552368876
+20
+-96.62928841817663
+30
+219.8924039987385
+11
+28.280021238071757
+21
+-97.14129795385307
+31
+220.26386189717024
+12
+29.819396312654156
+22
+-97.39349991765316
+32
+219.68826947797797
+13
+29.819396312654156
+23
+-97.39349991765316
+33
+219.68826947797797
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.819396312654156
+20
+-97.39349991765316
+30
+219.68826947797797
+11
+28.193317306005355
+21
+-98.29278701655942
+31
+219.92252220671892
+12
+29.71930651037399
+22
+-98.1726184089585
+32
+219.6246865944628
+13
+29.71930651037399
+23
+-98.1726184089585
+33
+219.6246865944628
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.280021238071757
+20
+-97.14129795385307
+30
+220.26386189717024
+11
+28.193317306005355
+21
+-98.29278701655942
+31
+219.92252220671892
+12
+29.819396312654156
+22
+-97.39349991765316
+32
+219.68826947797797
+13
+29.819396312654156
+23
+-97.39349991765316
+33
+219.68826947797797
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.32590051018071
+20
+-97.53557267651263
+30
+219.2754370716131
+11
+29.71930651037399
+21
+-98.1726184089585
+31
+219.6246865944628
+12
+32.43177057459864
+22
+-98.62986756648735
+32
+218.78411478990313
+13
+32.43177057459864
+23
+-98.62986756648735
+33
+218.78411478990313
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.819396312654156
+20
+-97.39349991765316
+30
+219.68826947797797
+11
+29.71930651037399
+21
+-98.1726184089585
+31
+219.6246865944628
+12
+32.32590051018071
+22
+-97.53557267651263
+32
+219.2754370716131
+13
+32.32590051018071
+23
+-97.53557267651263
+33
+219.2754370716131
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.71930651037399
+20
+-98.1726184089585
+30
+219.6246865944628
+11
+28.284280378594318
+21
+-98.82152889000282
+31
+219.75884952092326
+12
+29.565064778592717
+22
+-98.87659349247305
+32
+219.79231419645774
+13
+29.565064778592717
+23
+-98.87659349247305
+33
+219.79231419645774
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.80208482657592
+20
+-92.66007367547145
+30
+210.53750606525944
+11
+27.685871135174636
+21
+-93.66553506311841
+31
+210.26127037993857
+12
+27.264216223441203
+22
+-93.79391772744148
+32
+210.54845814088833
+13
+27.264216223441203
+23
+-93.79391772744148
+33
+210.54845814088833
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.80208482657592
+20
+-92.66007367547145
+30
+210.53750606525944
+11
+27.264216223441203
+21
+-93.79391772744148
+31
+210.54845814088833
+12
+27.2693880369329
+22
+-92.71179181038835
+32
+210.92873854468885
+13
+27.2693880369329
+23
+-92.71179181038835
+33
+210.92873854468885
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.192027157875586
+20
+-93.21132814882
+30
+211.22535725965272
+11
+33.18533422276871
+21
+-93.60347330121856
+31
+211.0978872682988
+12
+32.37701019645144
+22
+-93.65945057665778
+32
+210.72977583742016
+13
+32.37701019645144
+23
+-93.65945057665778
+33
+210.72977583742016
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.192027157875586
+20
+-93.21132814882
+30
+211.22535725965272
+11
+32.37701019645144
+21
+-93.65945057665778
+31
+210.72977583742016
+12
+32.284526002247304
+22
+-93.24266325409305
+32
+210.8681979044038
+13
+32.284526002247304
+23
+-93.24266325409305
+33
+210.8681979044038
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.11628995160615
+20
+-92.72821992383238
+30
+210.94790467704047
+11
+33.199328541628546
+21
+-92.77263667499638
+31
+211.40819607779994
+12
+32.284526002247304
+22
+-93.24266325409305
+32
+210.8681979044038
+13
+32.284526002247304
+23
+-93.24266325409305
+33
+210.8681979044038
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.199328541628546
+20
+-92.77263667499638
+30
+211.40819607779994
+11
+33.192027157875586
+21
+-93.21132814882
+31
+211.22535725965272
+12
+32.284526002247304
+22
+-93.24266325409305
+32
+210.8681979044038
+13
+32.284526002247304
+23
+-93.24266325409305
+33
+210.8681979044038
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.87444626495687
+20
+-95.64633963043212
+30
+210.67197321604235
+11
+31.098659591037357
+21
+-96.28216846558571
+31
+211.0130086821701
+12
+28.534048547810162
+22
+-95.88606839698741
+32
+210.29108436359616
+13
+28.534048547810162
+23
+-95.88606839698741
+33
+210.29108436359616
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.14830675636295
+20
+-95.65303256554132
+30
+220.0718963493322
+11
+27.533150525008562
+21
+-96.25843896839109
+31
+220.83215293260918
+12
+28.16411177099352
+22
+-94.38715515737212
+32
+220.956884905056
+13
+28.16411177099352
+23
+-94.38715515737212
+33
+220.956884905056
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.491776017075125
+20
+-93.84198517048435
+30
+220.6456634225862
+11
+27.14830675636295
+21
+-95.65303256554132
+31
+220.0718963493322
+12
+28.16411177099352
+22
+-94.38715515737212
+32
+220.956884905056
+13
+28.16411177099352
+23
+-94.38715515737212
+33
+220.956884905056
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.533150525008562
+20
+-96.25843896839109
+30
+220.83215293260918
+11
+26.848037349522475
+21
+-97.2453426723327
+31
+220.27146750524602
+12
+27.281252785531443
+22
+-97.34756204487427
+32
+220.39437413175426
+13
+27.281252785531443
+23
+-97.34756204487427
+33
+220.39437413175426
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.14830675636295
+20
+-95.65303256554132
+30
+220.0718963493322
+11
+26.848037349522475
+21
+-97.2453426723327
+31
+220.27146750524602
+12
+27.533150525008562
+22
+-96.25843896839109
+32
+220.83215293260918
+13
+27.533150525008562
+23
+-96.25843896839109
+33
+220.83215293260918
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.491776017075125
+20
+-93.84198517048435
+30
+220.6456634225862
+11
+28.16411177099352
+21
+-94.38715515737212
+31
+220.956884905056
+12
+29.35910491189464
+22
+-94.22165712563834
+32
+220.7527503842961
+13
+29.35910491189464
+23
+-94.22165712563834
+33
+220.7527503842961
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.389237770043117
+20
+-93.18425218407184
+30
+220.55409190135126
+11
+27.491776017075125
+21
+-93.84198517048435
+31
+220.6456634225862
+12
+29.35910491189464
+22
+-94.22165712563834
+32
+220.7527503842961
+13
+29.35910491189464
+23
+-94.22165712563834
+33
+220.7527503842961
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.389237770043117
+20
+-93.18425218407184
+30
+220.55409190135126
+11
+29.35910491189464
+21
+-94.22165712563834
+31
+220.7527503842961
+12
+30.143090992368737
+22
+-93.67739981171984
+32
+220.60428891465284
+13
+30.143090992368737
+23
+-93.67739981171984
+33
+220.60428891465284
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.219147073128717
+20
+-91.99564775395427
+30
+219.56536285147152
+11
+28.389237770043117
+21
+-93.18425218407184
+31
+220.55409190135126
+12
+30.143090992368737
+22
+-93.67739981171984
+32
+220.60428891465284
+13
+30.143090992368737
+23
+-93.67739981171984
+33
+220.60428891465284
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.143090992368737
+20
+-93.67739981171984
+30
+220.60428891465284
+11
+30.358786037404084
+21
+-94.75526658825035
+31
+220.3237940888096
+12
+31.534917270276726
+22
+-94.53683352430767
+32
+220.61280719569774
+13
+31.534917270276726
+23
+-94.53683352430767
+33
+220.61280719569774
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.143090992368737
+20
+-93.67739981171984
+30
+220.60428891465284
+11
+31.534917270276726
+21
+-94.53683352430767
+31
+220.61280719569774
+12
+32.22611493222361
+22
+-94.15716156915374
+32
+220.56960734182616
+13
+32.22611493222361
+23
+-94.15716156915374
+33
+220.56960734182616
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.22611493222361
+20
+-94.15716156915374
+30
+220.56960734182616
+11
+31.534917270276726
+21
+-94.53683352430767
+31
+220.61280719569774
+12
+32.664502181724224
+22
+-95.49392324459153
+32
+220.3073659753649
+13
+32.664502181724224
+23
+-95.49392324459153
+33
+220.3073659753649
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.22611493222361
+20
+-94.15716156915374
+30
+220.56960734182616
+11
+32.664502181724224
+21
+-95.49392324459153
+31
+220.3073659753649
+12
+33.9997427355468
+22
+-94.74583563423604
+32
+220.18628469479546
+13
+33.9997427355468
+23
+-94.74583563423604
+33
+220.18628469479546
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.9997427355468
+20
+-94.74583563423604
+30
+220.18628469479546
+11
+32.664502181724224
+21
+-95.49392324459153
+31
+220.3073659753649
+12
+33.31675913032199
+22
+-96.320196505968
+32
+219.56049526230183
+13
+33.31675913032199
+23
+-96.320196505968
+33
+219.56049526230183
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.9997427355468
+20
+-94.74583563423604
+30
+220.18628469479546
+11
+33.31675913032199
+21
+-96.320196505968
+31
+219.56049526230183
+12
+34.13907747549911
+22
+-95.97125120744099
+32
+219.76584668035372
+13
+34.13907747549911
+23
+-95.97125120744099
+33
+219.76584668035372
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.7749063106527
+20
+-97.42118433104957
+30
+219.35088470372662
+11
+34.068801656876865
+21
+-97.62166815993298
+31
+219.41507603588835
+12
+33.98027237887223
+22
+-98.94991155432552
+32
+218.82701041945134
+13
+33.98027237887223
+23
+-98.94991155432552
+33
+218.82701041945134
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.7749063106527
+20
+-97.42118433104957
+30
+219.35088470372662
+11
+33.98027237887223
+21
+-98.94991155432552
+31
+218.82701041945134
+12
+34.75878242153161
+22
+-99.32441169598776
+32
+218.7314839820171
+13
+34.75878242153161
+23
+-99.32441169598776
+33
+218.7314839820171
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.98027237887223
+20
+-98.94991155432552
+30
+218.82701041945134
+11
+32.54037865792391
+21
+-99.2103275748476
+31
+218.4421666508058
+12
+34.75878242153161
+22
+-99.32441169598776
+32
+218.7314839820171
+13
+34.75878242153161
+23
+-99.32441169598776
+33
+218.7314839820171
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.54037865792391
+20
+-99.2103275748476
+30
+218.4421666508058
+11
+33.271125481866
+21
+-99.92829697722192
+31
+218.13155361698216
+12
+34.75878242153161
+22
+-99.32441169598776
+32
+218.7314839820171
+13
+34.75878242153161
+23
+-99.32441169598776
+33
+218.7314839820171
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.13907747549911
+20
+-95.97125120744099
+30
+219.76584668035372
+11
+33.31675913032199
+21
+-96.320196505968
+31
+219.56049526230183
+12
+34.068801656876865
+22
+-97.62166815993298
+32
+219.41507603588835
+13
+34.068801656876865
+23
+-97.62166815993298
+33
+219.41507603588835
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.13907747549911
+20
+-95.97125120744099
+30
+219.76584668035372
+11
+34.068801656876865
+21
+-97.62166815993298
+31
+219.41507603588835
+12
+34.7749063106527
+22
+-97.42118433104957
+32
+219.35088470372662
+13
+34.7749063106527
+23
+-97.42118433104957
+33
+219.35088470372662
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.128807099353356
+20
+-100.31831255935928
+30
+218.44094975351334
+11
+28.873867116645837
+21
+-99.59821358672383
+31
+219.40229861432033
+12
+28.049114976884404
+22
+-100.2617268352739
+32
+218.70866715778857
+13
+28.049114976884404
+23
+-100.2617268352739
+33
+218.70866715778857
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.129690471987438
+20
+-99.41020295508494
+30
+218.61892098249234
+11
+28.873867116645837
+21
+-99.59821358672383
+31
+219.40229861432033
+12
+31.766127755787114
+22
+-100.13364839527405
+32
+217.88999950448795
+13
+31.766127755787114
+23
+-100.13364839527405
+33
+217.88999950448795
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.766127755787114
+20
+-100.13364839527405
+30
+217.88999950448795
+11
+28.873867116645837
+21
+-99.59821358672383
+31
+219.40229861432033
+12
+29.128807099353356
+22
+-100.31831255935928
+32
+218.44094975351334
+13
+29.128807099353356
+23
+-100.31831255935928
+33
+218.44094975351334
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.54037865792391
+20
+-99.2103275748476
+30
+218.4421666508058
+11
+31.129690471987438
+21
+-99.41020295508494
+31
+218.61892098249234
+12
+33.271125481866
+22
+-99.92829697722192
+32
+218.13155361698216
+13
+33.271125481866
+23
+-99.92829697722192
+33
+218.13155361698216
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.271125481866
+20
+-99.92829697722192
+30
+218.13155361698216
+11
+31.129690471987438
+21
+-99.41020295508494
+31
+218.61892098249234
+12
+31.766127755787114
+22
+-100.13364839527405
+32
+217.88999950448795
+13
+31.766127755787114
+23
+-100.13364839527405
+33
+217.88999950448795
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.284280378594318
+20
+-98.82152889000282
+30
+219.75884952092326
+11
+28.049114976884404
+21
+-100.2617268352739
+31
+218.70866715778857
+12
+28.873867116645837
+22
+-99.59821358672383
+32
+219.40229861432033
+13
+28.873867116645837
+23
+-99.59821358672383
+33
+219.40229861432033
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.284280378594318
+20
+-98.82152889000282
+30
+219.75884952092326
+11
+27.16929823465272
+21
+-99.42754374149841
+31
+219.3940845575979
+12
+28.049114976884404
+22
+-100.2617268352739
+32
+218.70866715778857
+13
+28.049114976884404
+23
+-100.2617268352739
+33
+218.70866715778857
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.193317306005355
+20
+-98.29278701655942
+30
+219.92252220671892
+11
+27.16929823465272
+21
+-99.42754374149841
+31
+219.3940845575979
+12
+28.284280378594318
+22
+-98.82152889000282
+32
+219.75884952092326
+13
+28.284280378594318
+23
+-98.82152889000282
+33
+219.75884952092326
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.22831775332248
+20
+-98.21399291689204
+30
+219.8315591341297
+11
+27.16929823465272
+21
+-99.42754374149841
+31
+219.3940845575979
+12
+28.193317306005355
+22
+-98.29278701655942
+32
+219.92252220671892
+13
+28.193317306005355
+23
+-98.29278701655942
+33
+219.92252220671892
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.280021238071757
+20
+-97.14129795385307
+30
+220.26386189717024
+11
+27.22831775332248
+21
+-98.21399291689204
+31
+219.8315591341297
+12
+28.193317306005355
+22
+-98.29278701655942
+32
+219.92252220671892
+13
+28.193317306005355
+23
+-98.29278701655942
+33
+219.92252220671892
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.280021238071757
+20
+-97.14129795385307
+30
+220.26386189717024
+11
+27.281252785531443
+21
+-97.34756204487427
+31
+220.39437413175426
+12
+27.22831775332248
+22
+-98.21399291689204
+32
+219.8315591341297
+13
+27.22831775332248
+23
+-98.21399291689204
+33
+219.8315591341297
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.506045259922953
+20
+-95.03028537627848
+30
+220.4092811235839
+11
+27.533150525008562
+21
+-96.25843896839109
+31
+220.83215293260918
+12
+28.554431577453837
+22
+-96.52706904563544
+32
+220.42905570458097
+13
+28.554431577453837
+23
+-96.52706904563544
+33
+220.42905570458097
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.16411177099352
+20
+-94.38715515737212
+30
+220.956884905056
+11
+27.533150525008562
+21
+-96.25843896839109
+31
+220.83215293260918
+12
+29.506045259922953
+22
+-95.03028537627848
+32
+220.4092811235839
+13
+29.506045259922953
+23
+-95.03028537627848
+33
+220.4092811235839
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.554431577453837
+20
+-96.52706904563544
+30
+220.42905570458097
+11
+27.281252785531443
+21
+-97.34756204487427
+31
+220.39437413175426
+12
+28.280021238071757
+22
+-97.14129795385307
+32
+220.26386189717024
+13
+28.280021238071757
+23
+-97.14129795385307
+33
+220.26386189717024
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.533150525008562
+20
+-96.25843896839109
+30
+220.83215293260918
+11
+27.281252785531443
+21
+-97.34756204487427
+31
+220.39437413175426
+12
+28.554431577453837
+22
+-96.52706904563544
+32
+220.42905570458097
+13
+28.554431577453837
+23
+-96.52706904563544
+33
+220.42905570458097
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.358786037404084
+20
+-94.75526658825035
+30
+220.3237940888096
+11
+28.16411177099352
+21
+-94.38715515737212
+31
+220.956884905056
+12
+29.506045259922953
+22
+-95.03028537627848
+32
+220.4092811235839
+13
+29.506045259922953
+23
+-95.03028537627848
+33
+220.4092811235839
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.16411177099352
+20
+-94.38715515737212
+30
+220.956884905056
+11
+30.358786037404084
+21
+-94.75526658825035
+31
+220.3237940888096
+12
+29.35910491189464
+22
+-94.22165712563834
+32
+220.7527503842961
+13
+29.35910491189464
+23
+-94.22165712563834
+33
+220.7527503842961
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.143090992368737
+20
+-93.67739981171984
+30
+220.60428891465284
+11
+29.35910491189464
+21
+-94.22165712563834
+31
+220.7527503842961
+12
+30.358786037404084
+22
+-94.75526658825035
+32
+220.3237940888096
+13
+30.358786037404084
+23
+-94.75526658825035
+33
+220.3237940888096
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.534917270276726
+20
+-94.53683352430767
+30
+220.61280719569774
+11
+30.358786037404084
+21
+-94.75526658825035
+31
+220.3237940888096
+12
+32.664502181724224
+22
+-95.49392324459153
+32
+220.3073659753649
+13
+32.664502181724224
+23
+-95.49392324459153
+33
+220.3073659753649
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.358786037404084
+20
+-94.75526658825035
+30
+220.3237940888096
+11
+30.99157262932727
+21
+-95.81366300810646
+31
+220.15799183275251
+12
+32.664502181724224
+22
+-95.49392324459153
+32
+220.3073659753649
+13
+32.664502181724224
+23
+-95.49392324459153
+33
+220.3073659753649
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.358786037404084
+20
+-94.75526658825035
+30
+220.3237940888096
+11
+29.506045259922953
+21
+-95.03028537627848
+31
+220.4092811235839
+12
+30.99157262932727
+22
+-95.81366300810646
+32
+220.15799183275251
+13
+30.99157262932727
+23
+-95.81366300810646
+33
+220.15799183275251
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.664502181724224
+20
+-95.49392324459153
+30
+220.3073659753649
+11
+32.26505564557271
+21
+-96.61042651014813
+31
+219.42572388719518
+12
+33.31675913032199
+22
+-96.320196505968
+32
+219.56049526230183
+13
+33.31675913032199
+23
+-96.320196505968
+33
+219.56049526230183
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.664502181724224
+20
+-95.49392324459153
+30
+220.3073659753649
+11
+30.99157262932727
+21
+-95.81366300810646
+31
+220.15799183275251
+12
+32.26505564557271
+22
+-96.61042651014813
+32
+219.42572388719518
+13
+32.26505564557271
+23
+-96.61042651014813
+33
+219.42572388719518
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.31675913032199
+20
+-96.320196505968
+30
+219.56049526230183
+11
+32.26505564557271
+21
+-96.61042651014813
+31
+219.42572388719518
+12
+32.32590051018071
+22
+-97.53557267651263
+32
+219.2754370716131
+13
+32.32590051018071
+23
+-97.53557267651263
+33
+219.2754370716131
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.31675913032199
+20
+-96.320196505968
+30
+219.56049526230183
+11
+32.32590051018071
+21
+-97.53557267651263
+31
+219.2754370716131
+12
+34.068801656876865
+22
+-97.62166815993298
+32
+219.41507603588835
+13
+34.068801656876865
+23
+-97.62166815993298
+33
+219.41507603588835
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.068801656876865
+20
+-97.62166815993298
+30
+219.41507603588835
+11
+32.43177057459864
+21
+-98.62986756648735
+31
+218.78411478990313
+12
+33.98027237887223
+22
+-98.94991155432552
+32
+218.82701041945134
+13
+33.98027237887223
+23
+-98.94991155432552
+33
+218.82701041945134
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.32590051018071
+20
+-97.53557267651263
+30
+219.2754370716131
+11
+32.43177057459864
+21
+-98.62986756648735
+31
+218.78411478990313
+12
+34.068801656876865
+22
+-97.62166815993298
+32
+219.41507603588835
+13
+34.068801656876865
+23
+-97.62166815993298
+33
+219.41507603588835
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.7955789144519
+20
+-96.46135659185806
+30
+217.6630481595014
+11
+35.40404221069942
+21
+-97.17689219964831
+31
+218.77620495750455
+12
+35.385484526993984
+22
+-99.35270455803021
+32
+218.07770591180403
+13
+35.385484526993984
+23
+-99.35270455803021
+33
+218.07770591180403
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.96624875967735
+20
+-98.00864149883922
+30
+216.86476353584402
+11
+35.7955789144519
+21
+-96.46135659185806
+31
+217.6630481595014
+12
+35.385484526993984
+22
+-99.35270455803021
+32
+218.07770591180403
+13
+35.385484526993984
+23
+-99.35270455803021
+33
+218.07770591180403
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.96624875967735
+20
+-98.00864149883922
+30
+216.86476353584402
+11
+35.385484526993984
+21
+-99.35270455803021
+31
+218.07770591180403
+12
+33.69095504766119
+22
+-99.96480389598652
+32
+217.2389594531824
+13
+33.69095504766119
+23
+-99.96480389598652
+33
+217.2389594531824
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.96624875967735
+20
+-98.00864149883922
+30
+216.86476353584402
+11
+33.69095504766119
+21
+-99.96480389598652
+31
+217.2389594531824
+12
+34.58263653849143
+22
+-99.17138686149796
+32
+216.34149770021486
+13
+34.58263653849143
+23
+-99.17138686149796
+33
+216.34149770021486
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.58263653849143
+20
+-99.17138686149796
+30
+216.34149770021486
+11
+33.69095504766119
+21
+-99.96480389598652
+31
+217.2389594531824
+12
+31.922499057829672
+22
+-100.10687665484598
+32
+216.55323782905026
+13
+31.922499057829672
+23
+-100.10687665484598
+33
+216.55323782905026
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.69095504766119
+20
+-99.96480389598652
+30
+217.2389594531824
+11
+31.96813270628567
+21
+-100.3459969727556
+31
+217.2572129125649
+12
+31.922499057829672
+22
+-100.10687665484598
+32
+216.55323782905026
+13
+31.922499057829672
+23
+-100.10687665484598
+33
+216.55323782905026
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.10811984538664
+20
+-99.80599879935934
+30
+216.22254598990605
+11
+28.9648301892348
+21
+-100.39741088334945
+31
+217.56782594638878
+12
+27.736372372799277
+22
+-100.24073535698389
+32
+217.6886030026357
+13
+27.736372372799277
+23
+-100.24073535698389
+33
+217.6886030026357
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.10811984538664
+20
+-99.80599879935934
+30
+216.22254598990605
+11
+27.736372372799277
+21
+-100.24073535698389
+31
+217.6886030026357
+12
+27.898828161302642
+22
+-99.35848482016753
+32
+216.29525560311274
+13
+27.898828161302642
+23
+-99.35848482016753
+33
+216.29525560311274
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.96813270628567
+20
+-100.3459969727556
+30
+217.2572129125649
+11
+28.9648301892348
+21
+-100.39741088334945
+31
+217.56782594638878
+12
+31.922499057829672
+22
+-100.10687665484598
+32
+216.55323782905026
+13
+31.922499057829672
+23
+-100.10687665484598
+33
+216.55323782905026
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.922499057829672
+20
+-100.10687665484598
+30
+216.55323782905026
+11
+28.9648301892348
+21
+-100.39741088334945
+31
+217.56782594638878
+12
+29.10811984538664
+22
+-99.80599879935934
+32
+216.22254598990605
+13
+29.10811984538664
+23
+-99.80599879935934
+33
+216.22254598990605
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.898828161302642
+20
+-99.35848482016753
+30
+216.29525560311274
+11
+27.736372372799277
+21
+-100.24073535698389
+31
+217.6886030026357
+12
+27.05977747835832
+22
+-98.52156370748448
+32
+216.29130068691353
+13
+27.05977747835832
+23
+-98.52156370748448
+33
+216.29130068691353
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.05977747835832
+20
+-98.52156370748448
+30
+216.29130068691353
+11
+27.736372372799277
+21
+-100.24073535698389
+31
+217.6886030026357
+12
+26.71874201223048
+22
+-99.08985474292362
+32
+217.78869280491622
+13
+26.71874201223048
+23
+-99.08985474292362
+33
+217.78869280491622
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.71874201223048
+20
+-99.08985474292362
+30
+217.78869280491622
+11
+27.16929823465272
+21
+-99.42754374149841
+31
+219.3940845575979
+12
+26.79327697137528
+22
+-98.08256800933866
+32
+219.32685098220662
+13
+26.79327697137528
+23
+-98.08256800933866
+33
+219.32685098220662
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.95086517071001
+20
+-131.4794015196974
+30
+206.20839394838998
+11
+26.747339098596246
+21
+-133.08205525347248
+31
+208.38298940947988
+12
+24.714512172042966
+22
+-133.46842014373345
+32
+209.17427687370673
+13
+24.714512172042966
+23
+-133.46842014373345
+33
+209.17427687370673
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.95086517071001
+20
+-131.4794015196974
+30
+206.20839394838998
+11
+24.714512172042966
+21
+-133.46842014373345
+31
+209.17427687370673
+12
+24.831030087767285
+22
+-132.18854841670375
+32
+207.27317907902983
+13
+24.831030087767285
+23
+-132.18854841670375
+33
+207.27317907902983
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.831030087767285
+20
+-132.18854841670375
+30
+207.27317907902983
+11
+24.714512172042966
+21
+-133.46842014373345
+31
+209.17427687370673
+12
+21.92842582164265
+22
+-131.96585621223872
+32
+208.31666850705705
+13
+21.92842582164265
+23
+-131.96585621223872
+33
+208.31666850705705
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.714512172042966
+20
+-133.46842014373345
+30
+209.17427687370673
+11
+21.78909108169033
+21
+-132.58616960691757
+31
+209.58984729897952
+12
+21.92842582164265
+22
+-131.96585621223872
+32
+208.31666850705705
+13
+21.92842582164265
+23
+-131.96585621223872
+33
+208.31666850705705
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.78909108169033
+20
+-132.58616960691757
+30
+209.58984729897952
+11
+21.481824515419937
+21
+-132.52562896663292
+31
+210.81100373166186
+12
+19.53691841822522
+22
+-130.8110206819798
+32
+211.41245521831277
+13
+19.53691841822522
+23
+-130.8110206819798
+33
+211.41245521831277
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.78909108169033
+20
+-132.58616960691757
+30
+209.58984729897952
+11
+19.53691841822522
+21
+-130.8110206819798
+31
+211.41245521831277
+12
+19.5010199481065
+22
+-130.74561245252582
+32
+210.33793490933536
+13
+19.5010199481065
+23
+-130.74561245252582
+33
+210.33793490933536
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.5010199481065
+20
+-130.74561245252582
+30
+210.33793490933536
+11
+19.53691841822522
+21
+-130.8110206819798
+31
+211.41245521831277
+12
+18.808301164544417
+22
+-129.03252528948792
+32
+211.85297203807482
+13
+18.808301164544417
+23
+-129.03252528948792
+33
+211.85297203807482
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.5010199481065
+20
+-130.74561245252582
+30
+210.33793490933536
+11
+18.808301164544417
+21
+-129.03252528948792
+31
+211.85297203807482
+12
+18.60507931675369
+22
+-128.55580577528391
+32
+210.34219404985816
+13
+18.60507931675369
+23
+-128.55580577528391
+33
+210.34219404985816
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.0903171120025
+20
+-127.46516157718538
+30
+209.80006630620167
+11
+18.60507931675369
+21
+-128.55580577528391
+31
+210.34219404985816
+12
+18.808301164544417
+22
+-129.03252528948792
+32
+211.85297203807482
+13
+18.808301164544417
+23
+-129.03252528948792
+33
+211.85297203807482
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.0903171120025
+20
+-127.46516157718538
+30
+209.80006630620167
+11
+18.808301164544417
+21
+-129.03252528948792
+31
+211.85297203807482
+12
+19.465121477987775
+22
+-128.04349201528512
+32
+212.819492712373
+13
+19.465121477987775
+23
+-128.04349201528512
+33
+212.819492712373
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.0903171120025
+20
+-127.46516157718538
+30
+209.80006630620167
+11
+19.465121477987775
+21
+-128.04349201528512
+31
+212.819492712373
+12
+19.671689793331947
+22
+-125.8579444785651
+32
+209.99598677023982
+13
+19.671689793331947
+23
+-125.8579444785651
+33
+209.99598677023982
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.671689793331947
+20
+-125.8579444785651
+30
+209.99598677023982
+11
+19.465121477987775
+21
+-128.04349201528512
+31
+212.819492712373
+12
+19.838404722357858
+22
+-127.16884708654514
+32
+212.93205571189839
+13
+19.838404722357858
+23
+-127.16884708654514
+33
+212.93205571189839
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.671689793331947
+20
+-125.8579444785651
+30
+209.99598677023982
+11
+19.838404722357858
+21
+-127.16884708654514
+31
+212.93205571189839
+12
+21.02761760112122
+22
+-125.31672940787789
+32
+212.95395986315782
+13
+21.02761760112122
+23
+-125.31672940787789
+33
+212.95395986315782
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.671689793331947
+20
+-125.8579444785651
+30
+209.99598677023982
+11
+21.02761760112122
+21
+-125.31672940787789
+31
+212.95395986315782
+12
+20.432554825254975
+22
+-124.95318134184429
+32
+210.53811451389694
+13
+20.432554825254975
+23
+-124.95318134184429
+33
+210.53811451389694
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.57978474743881
+20
+-124.34108200388792
+30
+211.26277685137862
+11
+20.432554825254975
+21
+-124.95318134184429
+31
+210.53811451389694
+12
+21.02761760112122
+22
+-125.31672940787789
+32
+212.95395986315782
+13
+21.02761760112122
+23
+-125.31672940787789
+33
+212.95395986315782
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.521359027247616
+20
+-124.83544652882863
+30
+213.6071294847245
+11
+21.57978474743881
+21
+-124.34108200388792
+31
+211.26277685137862
+12
+21.02761760112122
+22
+-125.31672940787789
+32
+212.95395986315782
+13
+21.02761760112122
+23
+-125.31672940787789
+33
+212.95395986315782
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.816441970428883
+20
+-125.11442023305621
+30
+213.60682526040176
+11
+21.57978474743881
+21
+-124.34108200388792
+31
+211.26277685137862
+12
+22.521359027247616
+22
+-124.83544652882863
+32
+213.6071294847245
+13
+22.521359027247616
+23
+-124.83544652882863
+33
+213.6071294847245
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.12431698534537
+20
+-124.21026554498077
+30
+211.2128840624001
+11
+21.57978474743881
+21
+-124.34108200388792
+31
+211.26277685137862
+12
+23.816441970428883
+22
+-125.11442023305621
+32
+213.60682526040176
+13
+23.816441970428883
+23
+-125.11442023305621
+33
+213.60682526040176
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.46013668747896
+20
+-125.66111134155857
+30
+211.38690037517864
+11
+26.147408733561363
+21
+-126.43779603828018
+31
+213.231716670093
+12
+27.192723507526804
+22
+-127.65621445205525
+32
+212.78815760710043
+13
+27.192723507526804
+23
+-127.65621445205525
+33
+212.78815760710043
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.261463554366326
+20
+-127.2652861969482
+30
+210.5667116002625
+11
+27.46013668747896
+21
+-125.66111134155857
+31
+211.38690037517864
+12
+27.192723507526804
+22
+-127.65621445205525
+32
+212.78815760710043
+13
+27.192723507526804
+23
+-127.65621445205525
+33
+212.78815760710043
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.261463554366326
+20
+-127.2652861969482
+30
+210.5667116002625
+11
+27.192723507526804
+21
+-127.65621445205525
+31
+212.78815760710043
+12
+27.61955023275193
+22
+-129.74623555133994
+32
+212.62661449156536
+13
+27.61955023275193
+23
+-129.74623555133994
+33
+212.62661449156536
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.678250876931116
+20
+-128.84421043352563
+30
+209.92297293270946
+11
+28.261463554366326
+21
+-127.2652861969482
+31
+210.5667116002625
+12
+27.61955023275193
+22
+-129.74623555133994
+32
+212.62661449156536
+13
+27.61955023275193
+23
+-129.74623555133994
+33
+212.62661449156536
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.747339098596246
+20
+-133.08205525347248
+30
+208.38298940947988
+11
+26.142541144392727
+21
+-133.67103354287846
+31
+210.553934178693
+12
+24.353397900594487
+22
+-133.73370375342458
+32
+210.1073328724704
+13
+24.353397900594487
+23
+-133.73370375342458
+33
+210.1073328724704
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.747339098596246
+20
+-133.08205525347248
+30
+208.38298940947988
+11
+24.353397900594487
+21
+-133.73370375342458
+31
+210.1073328724704
+12
+24.714512172042966
+22
+-133.46842014373345
+32
+209.17427687370673
+13
+24.714512172042966
+23
+-133.46842014373345
+33
+209.17427687370673
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.316355784021216
+20
+-124.63161623239012
+30
+206.473677558083
+11
+18.922993734330507
+21
+-127.19318503238722
+31
+208.54696631959976
+12
+19.47303131038682
+22
+-125.45545569918288
+32
+208.83871744539556
+13
+19.47303131038682
+23
+-125.45545569918288
+33
+208.83871744539556
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.316355784021216
+20
+-124.63161623239012
+30
+206.473677558083
+11
+19.47303131038682
+21
+-125.45545569918288
+31
+208.83871744539556
+12
+20.049840626870655
+22
+-124.79072555334058
+32
+209.26219770306759
+13
+20.049840626870655
+23
+-124.79072555334058
+33
+209.26219770306759
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.316355784021216
+20
+-124.63161623239012
+30
+206.473677558083
+11
+20.049840626870655
+21
+-124.79072555334058
+31
+209.26219770306759
+12
+19.746833201122826
+22
+-123.84854282488509
+32
+207.0328418638306
+13
+19.746833201122826
+23
+-123.84854282488509
+33
+207.0328418638306
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.97437834458922
+20
+-123.46369905623966
+30
+207.44567427019564
+11
+19.746833201122826
+21
+-123.84854282488509
+31
+207.0328418638306
+12
+20.049840626870655
+22
+-124.79072555334058
+32
+209.26219770306759
+13
+20.049840626870655
+23
+-124.79072555334058
+33
+209.26219770306759
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.267954816322813
+20
+-124.15428826954101
+30
+209.95369958933753
+11
+20.97437834458922
+21
+-123.46369905623966
+31
+207.44567427019564
+12
+20.049840626870655
+22
+-124.79072555334058
+32
+209.26219770306759
+13
+20.049840626870655
+23
+-124.79072555334058
+33
+209.26219770306759
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.28373053061833
+20
+-124.03411966194022
+30
+209.94731087855374
+11
+20.97437834458922
+21
+-123.46369905623966
+31
+207.44567427019564
+12
+21.267954816322813
+22
+-124.15428826954101
+32
+209.95369958933753
+13
+21.267954816322813
+23
+-124.15428826954101
+33
+209.95369958933753
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.28373053061833
+20
+-124.03411966194022
+30
+209.94731087855374
+11
+24.23414196596281
+21
+-123.64075761224885
+31
+207.4596685890558
+12
+20.97437834458922
+22
+-123.46369905623966
+32
+207.44567427019564
+13
+20.97437834458922
+23
+-123.46369905623966
+33
+207.44567427019564
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.737893494414486
+20
+-124.79681003980073
+30
+206.9330562858734
+11
+28.00074330952104
+21
+-125.3383293348127
+31
+209.9284489705251
+12
+28.580594869235277
+22
+-127.06632348967969
+32
+209.06293077147544
+13
+28.580594869235277
+23
+-127.06632348967969
+33
+209.06293077147544
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.37433077821416
+20
+-126.077594439799
+30
+206.44568892036293
+11
+27.737893494414486
+21
+-124.79681003980073
+31
+206.9330562858734
+12
+28.580594869235277
+22
+-127.06632348967969
+32
+209.06293077147544
+13
+28.580594869235277
+23
+-127.06632348967969
+33
+209.06293077147544
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.37433077821416
+20
+-126.077594439799
+30
+206.44568892036293
+11
+28.580594869235277
+21
+-127.06632348967969
+31
+209.06293077147544
+12
+28.906114894888088
+22
+-128.41008232454718
+32
+208.06507499190414
+13
+28.906114894888088
+23
+-128.41008232454718
+33
+208.06507499190414
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.599456777263757
+20
+-127.57437810915553
+30
+205.36630102221628
+11
+28.37433077821416
+21
+-126.077594439799
+31
+206.44568892036293
+12
+28.906114894888088
+22
+-128.41008232454718
+32
+208.06507499190414
+13
+28.906114894888088
+23
+-128.41008232454718
+33
+208.06507499190414
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.300187944397532
+20
+-128.78154022297767
+30
+203.1771027936201
+11
+22.299275271428407
+21
+-129.70972863257307
+31
+204.58596563361849
+12
+19.950359273236558
+22
+-128.7352981258761
+32
+204.97598121575558
+13
+19.950359273236558
+23
+-128.7352981258761
+33
+204.97598121575558
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.300187944397532
+20
+-128.78154022297767
+30
+203.1771027936201
+11
+19.950359273236558
+21
+-128.7352981258761
+31
+204.97598121575558
+12
+19.80646116843866
+22
+-127.9671317101997
+32
+203.48376091124504
+13
+19.80646116843866
+23
+-127.9671317101997
+33
+203.48376091124504
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.80646116843866
+20
+-127.9671317101997
+30
+203.48376091124504
+11
+19.950359273236558
+21
+-128.7352981258761
+31
+204.97598121575558
+12
+18.66379461110042
+22
+-126.96684213604458
+32
+204.82143525965208
+13
+18.66379461110042
+23
+-126.96684213604458
+33
+204.82143525965208
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.444144649865542
+20
+-126.09310988027333
+30
+203.41257241965405
+11
+19.80646116843866
+21
+-127.9671317101997
+31
+203.48376091124504
+12
+18.66379461110042
+22
+-126.96684213604458
+32
+204.82143525965208
+13
+18.66379461110042
+23
+-126.96684213604458
+33
+204.82143525965208
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.436843266112575
+20
+-124.74904682108242
+30
+203.00004423761223
+11
+18.444144649865542
+21
+-126.09310988027333
+31
+203.41257241965405
+12
+18.66379461110042
+22
+-126.96684213604458
+32
+204.82143525965208
+13
+18.66379461110042
+23
+-126.96684213604458
+33
+204.82143525965208
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.436843266112575
+20
+-124.74904682108242
+30
+203.00004423761223
+11
+18.66379461110042
+21
+-126.96684213604458
+31
+204.82143525965208
+12
+18.545147125114813
+22
+-125.7295618142408
+32
+204.36844524264586
+13
+18.545147125114813
+23
+-125.7295618142408
+33
+204.36844524264586
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.436843266112575
+20
+-124.74904682108242
+30
+203.00004423761223
+11
+18.545147125114813
+21
+-125.7295618142408
+31
+204.36844524264586
+12
+18.980187907062007
+22
+-122.99488937443387
+32
+203.2948376066383
+13
+18.980187907062007
+23
+-122.99488937443387
+33
+203.2948376066383
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.980187907062007
+20
+-122.99488937443387
+30
+203.2948376066383
+11
+18.545147125114813
+21
+-125.7295618142408
+31
+204.36844524264586
+12
+19.082103055280417
+22
+-123.98300997566815
+32
+204.6586752468262
+13
+19.082103055280417
+23
+-123.98300997566815
+33
+204.6586752468262
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.980187907062007
+20
+-122.99488937443387
+30
+203.2948376066383
+11
+19.082103055280417
+21
+-123.98300997566815
+31
+204.6586752468262
+12
+19.598371731479308
+22
+-123.25226315172625
+32
+205.19897764454555
+13
+19.598371731479308
+23
+-123.25226315172625
+33
+205.19897764454555
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.980187907062007
+20
+-122.99488937443387
+30
+203.2948376066383
+11
+19.598371731479308
+21
+-123.25226315172625
+31
+205.19897764454555
+12
+19.504366415659955
+22
+-122.24680176407873
+32
+203.84304983675668
+13
+19.504366415659955
+23
+-122.24680176407873
+33
+203.84304983675668
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.762029767107293
+20
+-122.0651798432239
+30
+204.309121499654
+11
+19.504366415659955
+21
+-122.24680176407873
+31
+203.84304983675668
+12
+19.598371731479308
+22
+-123.25226315172625
+32
+205.19897764454555
+13
+19.598371731479308
+23
+-123.25226315172625
+33
+205.19897764454555
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.06169072530169
+20
+-122.88384749652498
+30
+205.76300953946205
+11
+20.762029767107293
+21
+-122.0651798432239
+31
+204.309121499654
+12
+19.598371731479308
+22
+-123.25226315172625
+32
+205.19897764454555
+13
+19.598371731479308
+23
+-123.25226315172625
+33
+205.19897764454555
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.190333663445056
+20
+-123.1302691981874
+30
+205.68451966411718
+11
+20.762029767107293
+21
+-122.0651798432239
+31
+204.309121499654
+12
+21.06169072530169
+22
+-122.88384749652498
+32
+205.76300953946205
+13
+21.06169072530169
+23
+-122.88384749652498
+33
+205.76300953946205
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.190333663445056
+20
+-123.1302691981874
+30
+205.68451966411718
+11
+24.11579870430025
+21
+-122.60609068958898
+31
+204.16826563808598
+12
+20.762029767107293
+22
+-122.0651798432239
+32
+204.309121499654
+13
+20.762029767107293
+23
+-122.0651798432239
+33
+204.309121499654
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.714512172042966
+20
+-133.46842014373345
+30
+209.17427687370673
+11
+24.353397900594487
+21
+-133.73370375342458
+31
+210.1073328724704
+12
+21.78909108169033
+22
+-132.58616960691757
+32
+209.58984729897952
+13
+21.78909108169033
+23
+-132.58616960691757
+33
+209.58984729897952
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.353397900594487
+20
+-133.73370375342458
+30
+210.1073328724704
+11
+21.481824515419937
+21
+-132.52562896663292
+31
+210.81100373166186
+12
+21.78909108169033
+22
+-132.58616960691757
+32
+209.58984729897952
+13
+21.78909108169033
+23
+-132.58616960691757
+33
+209.58984729897952
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.179946085959124
+20
+-126.14726180977404
+30
+202.06090375238736
+11
+28.1008331118012
+21
+-126.77609348549811
+31
+203.61305624853733
+12
+27.676440181160398
+22
+-127.9084164158529
+32
+203.07366652378707
+13
+27.676440181160398
+23
+-127.9084164158529
+33
+203.07366652378707
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.771372820116405
+20
+-127.00121948454728
+30
+201.81569894801697
+11
+27.179946085959124
+21
+-126.14726180977404
+31
+202.06090375238736
+12
+27.676440181160398
+22
+-127.9084164158529
+32
+203.07366652378707
+13
+27.676440181160398
+23
+-127.9084164158529
+33
+203.07366652378707
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.771372820116405
+20
+-127.00121948454728
+30
+201.81569894801697
+11
+27.676440181160398
+21
+-127.9084164158529
+31
+203.07366652378707
+12
+26.751902463441844
+22
+-128.7444248555669
+32
+203.1405958748555
+13
+26.751902463441844
+23
+-128.7444248555669
+33
+203.1405958748555
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.771372820116405
+20
+-127.00121948454728
+30
+201.81569894801697
+11
+26.751902463441844
+21
+-128.7444248555669
+31
+203.1405958748555
+12
+26.305605381542158
+22
+-127.67294678981962
+32
+201.95777170687637
+13
+26.305605381542158
+23
+-127.67294678981962
+33
+201.95777170687637
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.1008331118012
+20
+-126.77609348549811
+30
+203.61305624853733
+11
+28.599456777263757
+21
+-127.57437810915553
+31
+205.36630102221628
+12
+28.19210040871319
+22
+-128.9001877089636
+32
+204.57136286611248
+13
+28.19210040871319
+23
+-128.9001877089636
+33
+204.57136286611248
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.676440181160398
+20
+-127.9084164158529
+30
+203.07366652378707
+11
+28.1008331118012
+21
+-126.77609348549811
+31
+203.61305624853733
+12
+28.19210040871319
+22
+-128.9001877089636
+32
+204.57136286611248
+13
+28.19210040871319
+23
+-128.9001877089636
+33
+204.57136286611248
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.676440181160398
+20
+-127.9084164158529
+30
+203.07366652378707
+11
+28.19210040871319
+21
+-128.9001877089636
+31
+204.57136286611248
+12
+27.18755169403513
+22
+-129.91720962088633
+32
+204.41194932083957
+13
+27.18755169403513
+23
+-129.91720962088633
+33
+204.41194932083957
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.676440181160398
+20
+-127.9084164158529
+30
+203.07366652378707
+11
+27.18755169403513
+21
+-129.91720962088633
+31
+204.41194932083957
+12
+26.751902463441844
+22
+-128.7444248555669
+32
+203.1405958748555
+13
+26.751902463441844
+23
+-128.7444248555669
+33
+203.1405958748555
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.599456777263757
+20
+-127.57437810915553
+30
+205.36630102221628
+11
+28.906114894888088
+21
+-128.41008232454718
+31
+208.06507499190414
+12
+28.48598110476984
+22
+-130.16089330364196
+32
+206.70275847333053
+13
+28.48598110476984
+23
+-130.16089330364196
+33
+206.70275847333053
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.19210040871319
+20
+-128.9001877089636
+30
+204.57136286611248
+11
+28.599456777263757
+21
+-127.57437810915553
+31
+205.36630102221628
+12
+28.48598110476984
+22
+-130.16089330364196
+32
+206.70275847333053
+13
+28.48598110476984
+23
+-130.16089330364196
+33
+206.70275847333053
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.19210040871319
+20
+-128.9001877089636
+30
+204.57136286611248
+11
+28.48598110476984
+21
+-130.16089330364196
+31
+206.70275847333053
+12
+26.95086517071001
+22
+-131.4794015196974
+32
+206.20839394838998
+13
+26.95086517071001
+23
+-131.4794015196974
+33
+206.20839394838998
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.18755169403513
+20
+-129.91720962088633
+30
+204.41194932083957
+11
+28.19210040871319
+21
+-128.9001877089636
+31
+204.57136286611248
+12
+26.95086517071001
+22
+-131.4794015196974
+32
+206.20839394838998
+13
+26.95086517071001
+23
+-131.4794015196974
+33
+206.20839394838998
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.906114894888088
+20
+-128.41008232454718
+30
+208.06507499190414
+11
+28.678250876931116
+21
+-128.84421043352563
+31
+209.92297293270946
+12
+28.3077056514684
+22
+-131.16239977509017
+32
+208.6896475271044
+13
+28.3077056514684
+23
+-131.16239977509017
+33
+208.6896475271044
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.48598110476984
+20
+-130.16089330364196
+30
+206.70275847333053
+11
+28.906114894888088
+21
+-128.41008232454718
+31
+208.06507499190414
+12
+28.3077056514684
+22
+-131.16239977509017
+32
+208.6896475271044
+13
+28.3077056514684
+23
+-131.16239977509017
+33
+208.6896475271044
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.48598110476984
+20
+-130.16089330364196
+30
+206.70275847333053
+11
+28.3077056514684
+21
+-131.16239977509017
+31
+208.6896475271044
+12
+26.747339098596246
+22
+-133.08205525347248
+32
+208.38298940947988
+13
+26.747339098596246
+23
+-133.08205525347248
+33
+208.38298940947988
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.95086517071001
+20
+-131.4794015196974
+30
+206.20839394838998
+11
+28.48598110476984
+21
+-130.16089330364196
+31
+206.70275847333053
+12
+26.747339098596246
+22
+-133.08205525347248
+32
+208.38298940947988
+13
+26.747339098596246
+23
+-133.08205525347248
+33
+208.38298940947988
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.678250876931116
+20
+-128.84421043352563
+30
+209.92297293270946
+11
+27.61955023275193
+21
+-129.74623555133994
+31
+212.62661449156536
+12
+27.394728458025366
+22
+-132.0695967063961
+32
+211.10883934391842
+13
+27.394728458025366
+23
+-132.0695967063961
+33
+211.10883934391842
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.3077056514684
+20
+-131.16239977509017
+30
+208.6896475271044
+11
+28.678250876931116
+21
+-128.84421043352563
+31
+209.92297293270946
+12
+27.394728458025366
+22
+-132.0695967063961
+32
+211.10883934391842
+13
+27.394728458025366
+23
+-132.0695967063961
+33
+211.10883934391842
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.3077056514684
+20
+-131.16239977509017
+30
+208.6896475271044
+11
+27.394728458025366
+21
+-132.0695967063961
+31
+211.10883934391842
+12
+26.142541144392727
+22
+-133.67103354287846
+32
+210.553934178693
+13
+26.142541144392727
+23
+-133.67103354287846
+33
+210.553934178693
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.747339098596246
+20
+-133.08205525347248
+30
+208.38298940947988
+11
+28.3077056514684
+21
+-131.16239977509017
+31
+208.6896475271044
+12
+26.142541144392727
+22
+-133.67103354287846
+32
+210.553934178693
+13
+26.142541144392727
+23
+-133.67103354287846
+33
+210.553934178693
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.25997173308616
+20
+-123.71559679571622
+30
+205.54427225119602
+11
+24.11579870430025
+21
+-122.60609068958898
+31
+204.16826563808598
+12
+24.190333663445056
+22
+-123.1302691981874
+32
+205.68451966411718
+13
+24.190333663445056
+23
+-123.1302691981874
+33
+205.68451966411718
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.25997173308616
+20
+-123.71559679571622
+30
+205.54427225119602
+11
+25.708413035414658
+21
+-123.20267458707045
+31
+204.01615347656627
+12
+24.11579870430025
+22
+-122.60609068958898
+32
+204.16826563808598
+13
+24.11579870430025
+23
+-122.60609068958898
+33
+204.16826563808598
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.61924600842888
+20
+-124.59389241633265
+30
+205.3699517140939
+11
+25.708413035414658
+21
+-123.20267458707045
+31
+204.01615347656627
+12
+26.25997173308616
+22
+-123.71559679571622
+32
+205.54427225119602
+13
+26.25997173308616
+23
+-123.71559679571622
+33
+205.54427225119602
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.61924600842888
+20
+-124.59389241633265
+30
+205.3699517140939
+11
+26.88363159531816
+21
+-123.78252614678463
+31
+203.75421633442866
+12
+25.708413035414658
+22
+-123.20267458707045
+32
+204.01615347656627
+13
+25.708413035414658
+23
+-123.20267458707045
+33
+204.01615347656627
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.373447405580084
+20
+-124.01434508094196
+30
+207.19195118478012
+11
+24.190333663445056
+21
+-123.1302691981874
+31
+205.68451966411718
+12
+24.23414196596281
+22
+-123.64075761224885
+32
+207.4596685890558
+13
+24.23414196596281
+23
+-123.64075761224885
+33
+207.4596685890558
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.373447405580084
+20
+-124.01434508094196
+30
+207.19195118478012
+11
+26.25997173308616
+21
+-123.71559679571622
+31
+205.54427225119602
+12
+24.190333663445056
+22
+-123.1302691981874
+32
+205.68451966411718
+13
+24.190333663445056
+23
+-123.1302691981874
+33
+205.68451966411718
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.737893494414486
+20
+-124.79681003980073
+30
+206.9330562858734
+11
+26.25997173308616
+21
+-123.71559679571622
+31
+205.54427225119602
+12
+26.373447405580084
+22
+-124.01434508094196
+32
+207.19195118478012
+13
+26.373447405580084
+23
+-124.01434508094196
+33
+207.19195118478012
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.737893494414486
+20
+-124.79681003980073
+30
+206.9330562858734
+11
+27.61924600842888
+21
+-124.59389241633265
+31
+205.3699517140939
+12
+26.25997173308616
+22
+-123.71559679571622
+32
+205.54427225119602
+13
+26.25997173308616
+23
+-123.71559679571622
+33
+205.54427225119602
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.5894466749385
+20
+-124.41622541167845
+30
+209.94061794344688
+11
+24.23414196596281
+21
+-123.64075761224885
+31
+207.4596685890558
+12
+24.28373053061833
+22
+-124.03411966194022
+32
+209.94731087855374
+13
+24.28373053061833
+23
+-124.03411966194022
+33
+209.94731087855374
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.5894466749385
+20
+-124.41622541167845
+30
+209.94061794344688
+11
+26.373447405580084
+21
+-124.01434508094196
+31
+207.19195118478012
+12
+24.23414196596281
+22
+-123.64075761224885
+32
+207.4596685890558
+13
+24.23414196596281
+23
+-123.64075761224885
+33
+207.4596685890558
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.00074330952104
+20
+-125.3383293348127
+30
+209.9284489705251
+11
+26.373447405580084
+21
+-124.01434508094196
+31
+207.19195118478012
+12
+26.5894466749385
+22
+-124.41622541167845
+32
+209.94061794344688
+13
+26.5894466749385
+23
+-124.41622541167845
+33
+209.94061794344688
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.00074330952104
+20
+-125.3383293348127
+30
+209.9284489705251
+11
+27.737893494414486
+21
+-124.79681003980073
+31
+206.9330562858734
+12
+26.373447405580084
+22
+-124.01434508094196
+32
+207.19195118478012
+13
+26.373447405580084
+23
+-124.01434508094196
+33
+207.19195118478012
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.263013976316557
+20
+-124.60910363248627
+30
+211.29593730259003
+11
+24.28373053061833
+21
+-124.03411966194022
+31
+209.94731087855374
+12
+24.12431698534537
+22
+-124.21026554498077
+32
+211.2128840624001
+13
+24.12431698534537
+23
+-124.21026554498077
+33
+211.2128840624001
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.5894466749385
+20
+-124.41622541167845
+30
+209.94061794344688
+11
+24.28373053061833
+21
+-124.03411966194022
+31
+209.94731087855374
+12
+26.263013976316557
+22
+-124.60910363248627
+32
+211.29593730259003
+13
+26.263013976316557
+23
+-124.60910363248627
+33
+211.29593730259003
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.46013668747896
+20
+-125.66111134155857
+30
+211.38690037517864
+11
+26.5894466749385
+21
+-124.41622541167845
+31
+209.94061794344688
+12
+26.263013976316557
+22
+-124.60910363248627
+32
+211.29593730259003
+13
+26.263013976316557
+23
+-124.60910363248627
+33
+211.29593730259003
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.00074330952104
+20
+-125.3383293348127
+30
+209.9284489705251
+11
+26.5894466749385
+21
+-124.41622541167845
+31
+209.94061794344688
+12
+27.46013668747896
+22
+-125.66111134155857
+32
+211.38690037517864
+13
+27.46013668747896
+23
+-125.66111134155857
+33
+211.38690037517864
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.13160371893081
+20
+-125.80227142744958
+30
+213.45349620158927
+11
+24.12431698534537
+21
+-124.21026554498077
+31
+211.2128840624001
+12
+23.816441970428883
+22
+-125.11442023305621
+32
+213.60682526040176
+13
+23.816441970428883
+23
+-125.11442023305621
+33
+213.60682526040176
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.263013976316557
+20
+-124.60910363248627
+30
+211.29593730259003
+11
+24.12431698534537
+21
+-124.21026554498077
+31
+211.2128840624001
+12
+25.13160371893081
+22
+-125.80227142744958
+32
+213.45349620158927
+13
+25.13160371893081
+23
+-125.80227142744958
+33
+213.45349620158927
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.263013976316557
+20
+-124.60910363248627
+30
+211.29593730259003
+11
+25.13160371893081
+21
+-125.80227142744958
+31
+213.45349620158927
+12
+26.147408733561363
+22
+-126.43779603828018
+32
+213.231716670093
+13
+26.147408733561363
+23
+-126.43779603828018
+33
+213.231716670093
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.46013668747896
+20
+-125.66111134155857
+30
+211.38690037517864
+11
+26.263013976316557
+21
+-124.60910363248627
+31
+211.29593730259003
+12
+26.147408733561363
+22
+-126.43779603828018
+32
+213.231716670093
+13
+26.147408733561363
+23
+-126.43779603828018
+33
+213.231716670093
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.70482094420825
+20
+-132.30263253784472
+30
+211.43679316415557
+11
+20.239372380124575
+21
+-130.74682934981848
+31
+212.27249737954676
+12
+21.481824515419937
+22
+-132.52562896663292
+32
+210.81100373166186
+13
+21.481824515419937
+23
+-132.52562896663292
+33
+210.81100373166186
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.481824515419937
+20
+-132.52562896663292
+30
+210.81100373166186
+11
+20.239372380124575
+21
+-130.74682934981848
+31
+212.27249737954676
+12
+19.53691841822522
+22
+-130.8110206819798
+32
+211.41245521831277
+13
+19.53691841822522
+23
+-130.8110206819798
+33
+211.41245521831277
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.53691841822522
+20
+-130.8110206819798
+30
+211.41245521831277
+11
+20.239372380124575
+21
+-130.74682934981848
+31
+212.27249737954676
+12
+19.658303923118186
+22
+-129.13657000796786
+32
+213.00811179265784
+13
+19.658303923118186
+23
+-129.13657000796786
+33
+213.00811179265784
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.53691841822522
+20
+-130.8110206819798
+30
+211.41245521831277
+11
+19.658303923118186
+21
+-129.13657000796786
+31
+213.00811179265784
+12
+18.808301164544417
+22
+-129.03252528948792
+32
+211.85297203807482
+13
+18.808301164544417
+23
+-129.03252528948792
+33
+211.85297203807482
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.18755169403513
+20
+-129.91720962088633
+30
+204.41194932083957
+11
+26.95086517071001
+21
+-131.4794015196974
+31
+206.20839394838998
+12
+24.831030087767285
+22
+-132.18854841670375
+32
+207.27317907902983
+13
+24.831030087767285
+23
+-132.18854841670375
+33
+207.27317907902983
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.18755169403513
+20
+-129.91720962088633
+30
+204.41194932083957
+11
+24.831030087767285
+21
+-132.18854841670375
+31
+207.27317907902983
+12
+25.226825932042324
+22
+-130.7002830283915
+32
+205.27868441718016
+13
+25.226825932042324
+23
+-130.7002830283915
+33
+205.27868441718016
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.226825932042324
+20
+-130.7002830283915
+30
+205.27868441718016
+11
+24.831030087767285
+21
+-132.18854841670375
+31
+207.27317907902983
+12
+22.206791077224256
+22
+-130.72948856340358
+32
+206.1104337163717
+13
+22.206791077224256
+23
+-130.72948856340358
+33
+206.1104337163717
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.831030087767285
+20
+-132.18854841670375
+30
+207.27317907902983
+11
+21.92842582164265
+21
+-131.96585621223872
+31
+208.31666850705705
+12
+22.206791077224256
+22
+-130.72948856340358
+32
+206.1104337163717
+13
+22.206791077224256
+23
+-130.72948856340358
+33
+206.1104337163717
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.92842582164265
+20
+-131.96585621223872
+30
+208.31666850705705
+11
+21.78909108169033
+21
+-132.58616960691757
+31
+209.58984729897952
+12
+19.5010199481065
+22
+-130.74561245252582
+32
+210.33793490933536
+13
+19.5010199481065
+23
+-130.74561245252582
+33
+210.33793490933536
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.92842582164265
+20
+-131.96585621223872
+30
+208.31666850705705
+11
+19.5010199481065
+21
+-130.74561245252582
+31
+210.33793490933536
+12
+19.64917719342698
+22
+-130.4313487268251
+32
+209.04893645261475
+13
+19.64917719342698
+23
+-130.4313487268251
+33
+209.04893645261475
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.64917719342698
+20
+-130.4313487268251
+30
+209.04893645261475
+11
+19.5010199481065
+21
+-130.74561245252582
+31
+210.33793490933536
+12
+18.60507931675369
+22
+-128.55580577528391
+32
+210.34219404985816
+13
+18.60507931675369
+23
+-128.55580577528391
+33
+210.34219404985816
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.64917719342698
+20
+-130.4313487268251
+30
+209.04893645261475
+11
+18.60507931675369
+21
+-128.55580577528391
+31
+210.34219404985816
+12
+18.638848216611137
+22
+-128.38574437870415
+32
+209.06475611741362
+13
+18.638848216611137
+23
+-128.38574437870415
+33
+209.06475611741362
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.922993734330507
+20
+-127.19318503238722
+30
+208.54696631959976
+11
+18.638848216611137
+21
+-128.38574437870415
+31
+209.06475611741362
+12
+18.60507931675369
+22
+-128.55580577528391
+32
+210.34219404985816
+13
+18.60507931675369
+23
+-128.55580577528391
+33
+210.34219404985816
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.922993734330507
+20
+-127.19318503238722
+30
+208.54696631959976
+11
+18.60507931675369
+21
+-128.55580577528391
+31
+210.34219404985816
+12
+19.0903171120025
+22
+-127.46516157718538
+32
+209.80006630620167
+13
+19.0903171120025
+23
+-127.46516157718538
+33
+209.80006630620167
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.922993734330507
+20
+-127.19318503238722
+30
+208.54696631959976
+11
+19.0903171120025
+21
+-127.46516157718538
+31
+209.80006630620167
+12
+19.47303131038682
+22
+-125.45545569918288
+32
+208.83871744539556
+13
+19.47303131038682
+23
+-125.45545569918288
+33
+208.83871744539556
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.47303131038682
+20
+-125.45545569918288
+30
+208.83871744539556
+11
+19.0903171120025
+21
+-127.46516157718538
+31
+209.80006630620167
+12
+19.671689793331947
+22
+-125.8579444785651
+32
+209.99598677023982
+13
+19.671689793331947
+23
+-125.8579444785651
+33
+209.99598677023982
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.47303131038682
+20
+-125.45545569918288
+30
+208.83871744539556
+11
+19.671689793331947
+21
+-125.8579444785651
+31
+209.99598677023982
+12
+20.432554825254975
+22
+-124.95318134184429
+32
+210.53811451389694
+13
+20.432554825254975
+23
+-124.95318134184429
+33
+210.53811451389694
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.47303131038682
+20
+-125.45545569918288
+30
+208.83871744539556
+11
+20.432554825254975
+21
+-124.95318134184429
+31
+210.53811451389694
+12
+20.049840626870655
+22
+-124.79072555334058
+32
+209.26219770306759
+13
+20.049840626870655
+23
+-124.79072555334058
+33
+209.26219770306759
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.267954816322813
+20
+-124.15428826954101
+30
+209.95369958933753
+11
+20.049840626870655
+21
+-124.79072555334058
+31
+209.26219770306759
+12
+20.432554825254975
+22
+-124.95318134184429
+32
+210.53811451389694
+13
+20.432554825254975
+23
+-124.95318134184429
+33
+210.53811451389694
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.57978474743881
+20
+-124.34108200388792
+30
+211.26277685137862
+11
+21.267954816322813
+21
+-124.15428826954101
+31
+209.95369958933753
+12
+20.432554825254975
+22
+-124.95318134184429
+32
+210.53811451389694
+13
+20.432554825254975
+23
+-124.95318134184429
+33
+210.53811451389694
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.12431698534537
+20
+-124.21026554498077
+30
+211.2128840624001
+11
+21.267954816322813
+21
+-124.15428826954101
+31
+209.95369958933753
+12
+21.57978474743881
+22
+-124.34108200388792
+32
+211.26277685137862
+13
+21.57978474743881
+23
+-124.34108200388792
+33
+211.26277685137862
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.28373053061833
+20
+-124.03411966194022
+30
+209.94731087855374
+11
+21.267954816322813
+21
+-124.15428826954101
+31
+209.95369958933753
+12
+24.12431698534537
+22
+-124.21026554498077
+32
+211.2128840624001
+13
+24.12431698534537
+23
+-124.21026554498077
+33
+211.2128840624001
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.00074330952104
+20
+-125.3383293348127
+30
+209.9284489705251
+11
+27.46013668747896
+21
+-125.66111134155857
+31
+211.38690037517864
+12
+28.261463554366326
+22
+-127.2652861969482
+32
+210.5667116002625
+13
+28.261463554366326
+23
+-127.2652861969482
+33
+210.5667116002625
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.580594869235277
+20
+-127.06632348967969
+30
+209.06293077147544
+11
+28.00074330952104
+21
+-125.3383293348127
+31
+209.9284489705251
+12
+28.261463554366326
+22
+-127.2652861969482
+32
+210.5667116002625
+13
+28.261463554366326
+23
+-127.2652861969482
+33
+210.5667116002625
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.580594869235277
+20
+-127.06632348967969
+30
+209.06293077147544
+11
+28.261463554366326
+21
+-127.2652861969482
+31
+210.5667116002625
+12
+28.678250876931116
+22
+-128.84421043352563
+32
+209.92297293270946
+13
+28.678250876931116
+23
+-128.84421043352563
+33
+209.92297293270946
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.906114894888088
+20
+-128.41008232454718
+30
+208.06507499190414
+11
+28.580594869235277
+21
+-127.06632348967969
+31
+209.06293077147544
+12
+28.678250876931116
+22
+-128.84421043352563
+32
+209.92297293270946
+13
+28.678250876931116
+23
+-128.84421043352563
+33
+209.92297293270946
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.736504224306973
+20
+-137.6317300045346
+30
+204.3276791833555
+11
+18.438364387727777
+21
+-138.2222294155557
+31
+206.10860837043137
+12
+17.505308388964096
+22
+-137.49908819968988
+32
+207.0793881852522
+13
+17.505308388964096
+23
+-137.49908819968988
+33
+207.0793881852522
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.736504224306973
+20
+-137.6317300045346
+30
+204.3276791833555
+11
+17.505308388964096
+21
+-137.49908819968988
+31
+207.0793881852522
+12
+17.58197291837018
+22
+-136.93749009935757
+32
+205.3739066302899
+13
+17.58197291837018
+23
+-136.93749009935757
+33
+205.3739066302899
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.70482094420825
+20
+-139.14037842249
+30
+204.28630467542132
+11
+18.438364387727777
+21
+-138.2222294155557
+31
+206.10860837043137
+12
+21.59773398249818
+22
+-138.16016765365467
+32
+202.8327208599364
+13
+21.59773398249818
+23
+-138.16016765365467
+33
+202.8327208599364
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.59773398249818
+20
+-138.16016765365467
+30
+202.8327208599364
+11
+18.438364387727777
+21
+-138.2222294155557
+31
+206.10860837043137
+12
+18.736504224306973
+22
+-137.6317300045346
+32
+204.3276791833555
+13
+18.736504224306973
+23
+-137.6317300045346
+33
+204.3276791833555
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.03032631969353
+20
+-133.97373674430142
+30
+203.43903993575654
+11
+23.225638335085197
+21
+-134.4230760694319
+31
+205.01735572368798
+12
+23.54142318240073
+22
+-135.4102839976966
+32
+204.70065820340258
+13
+23.54142318240073
+23
+-135.4102839976966
+33
+204.70065820340258
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.20799332434889
+20
+-134.94360388615286
+30
+202.5500964638334
+11
+23.03032631969353
+21
+-133.97373674430142
+31
+203.43903993575654
+12
+23.54142318240073
+22
+-135.4102839976966
+32
+204.70065820340258
+13
+23.54142318240073
+23
+-135.4102839976966
+33
+204.70065820340258
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.03032631969353
+20
+-133.97373674430142
+30
+203.43903993575654
+11
+21.01666552549177
+21
+-132.77509291152433
+31
+205.1630791744245
+12
+21.08116108197625
+22
+-133.09392000207066
+32
+206.97412656948148
+13
+21.08116108197625
+23
+-133.09392000207066
+33
+206.97412656948148
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.225638335085197
+20
+-134.4230760694319
+30
+205.01735572368798
+11
+23.03032631969353
+21
+-133.97373674430142
+31
+203.43903993575654
+12
+21.08116108197625
+22
+-133.09392000207066
+32
+206.97412656948148
+13
+21.08116108197625
+23
+-133.09392000207066
+33
+206.97412656948148
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.211369092237366
+20
+-133.40453303589504
+30
+209.16271634943135
+11
+19.677774279792757
+21
+-132.7264170198385
+31
+207.63338067750936
+12
+19.788207709056262
+22
+-133.18944643950613
+32
+209.79124380083198
+13
+19.788207709056262
+23
+-133.18944643950613
+33
+209.79124380083198
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.211369092237366
+20
+-133.40453303589504
+30
+209.16271634943135
+11
+21.08116108197625
+21
+-133.09392000207066
+31
+206.97412656948148
+12
+19.677774279792757
+22
+-132.7264170198385
+32
+207.63338067750936
+13
+19.677774279792757
+23
+-132.7264170198385
+33
+207.63338067750936
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.788207709056262
+20
+-133.18944643950613
+30
+209.79124380083198
+11
+18.280167739746986
+21
+-132.71820296311645
+31
+207.7282986662979
+12
+18.680526948867612
+22
+-133.40666260615652
+32
+209.61814016102215
+13
+18.680526948867612
+23
+-133.40666260615652
+33
+209.61814016102215
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.788207709056262
+20
+-133.18944643950613
+30
+209.79124380083198
+11
+19.677774279792757
+21
+-132.7264170198385
+31
+207.63338067750936
+12
+18.280167739746986
+22
+-132.71820296311645
+32
+207.7282986662979
+13
+18.280167739746986
+23
+-132.71820296311645
+33
+207.7282986662979
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.680526948867612
+20
+-133.40666260615652
+30
+209.61814016102215
+11
+17.364148303073545
+21
+-133.10061293717774
+31
+207.7267775446825
+12
+17.85364523884491
+22
+-133.82862174221302
+32
+209.64491190144926
+13
+17.85364523884491
+23
+-133.82862174221302
+33
+209.64491190144926
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.680526948867612
+20
+-133.40666260615652
+30
+209.61814016102215
+11
+18.280167739746986
+21
+-132.71820296311645
+31
+207.7282986662979
+12
+17.364148303073545
+22
+-133.10061293717774
+32
+207.7267775446825
+13
+17.364148303073545
+23
+-133.10061293717774
+33
+207.7267775446825
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.85364523884491
+20
+-133.82862174221302
+30
+209.64491190144926
+11
+16.397627628775467
+21
+-134.5161687122829
+31
+208.0197455677696
+12
+16.656522527682505
+22
+-135.0208768642068
+32
+210.13805952909703
+13
+16.656522527682505
+23
+-135.0208768642068
+33
+210.13805952909703
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.364148303073545
+20
+-133.10061293717774
+30
+207.7267775446825
+11
+16.397627628775467
+21
+-134.5161687122829
+31
+208.0197455677696
+12
+17.85364523884491
+22
+-133.82862174221302
+32
+209.64491190144926
+13
+17.85364523884491
+23
+-133.82862174221302
+33
+209.64491190144926
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.29054066706536
+20
+-135.77504896102243
+30
+208.11496778088045
+11
+16.28993221841932
+21
+-136.06132404900364
+31
+210.31937722562856
+12
+16.656522527682505
+22
+-135.0208768642068
+32
+210.13805952909703
+13
+16.656522527682505
+23
+-135.0208768642068
+33
+210.13805952909703
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.397627628775467
+20
+-134.5161687122829
+30
+208.0197455677696
+11
+16.29054066706536
+21
+-135.77504896102243
+31
+208.11496778088045
+12
+16.656522527682505
+22
+-135.0208768642068
+32
+210.13805952909703
+13
+16.656522527682505
+23
+-135.0208768642068
+33
+210.13805952909703
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.505308388964096
+20
+-137.49908819968988
+30
+207.0793881852522
+11
+17.18891509300251
+21
+-138.06281587028357
+31
+209.2062204276247
+12
+16.28993221841932
+22
+-136.06132404900364
+32
+210.31937722562856
+13
+16.28993221841932
+23
+-136.06132404900364
+33
+210.31937722562856
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.505308388964096
+20
+-137.49908819968988
+30
+207.0793881852522
+11
+16.28993221841932
+21
+-136.06132404900364
+31
+210.31937722562856
+12
+16.29054066706536
+22
+-135.77504896102243
+32
+208.11496778088045
+13
+16.29054066706536
+23
+-135.77504896102243
+33
+208.11496778088045
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.438364387727777
+20
+-138.2222294155557
+30
+206.10860837043137
+11
+18.149047056516743
+21
+-138.86535963446283
+31
+208.13535081052387
+12
+17.18891509300251
+22
+-138.06281587028357
+32
+209.2062204276247
+13
+17.18891509300251
+23
+-138.06281587028357
+33
+209.2062204276247
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.438364387727777
+20
+-138.2222294155557
+30
+206.10860837043137
+11
+17.18891509300251
+21
+-138.06281587028357
+31
+209.2062204276247
+12
+17.505308388964096
+22
+-137.49908819968988
+32
+207.0793881852522
+13
+17.505308388964096
+23
+-137.49908819968988
+33
+207.0793881852522
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.70482094420825
+20
+-139.14037842249
+30
+204.28630467542132
+11
+21.032789414612896
+21
+-140.68827177811843
+31
+207.41494761356446
+12
+18.149047056516743
+22
+-138.86535963446283
+32
+208.13535081052387
+13
+18.149047056516743
+23
+-138.86535963446283
+33
+208.13535081052387
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.70482094420825
+20
+-139.14037842249
+30
+204.28630467542132
+11
+18.149047056516743
+21
+-138.86535963446283
+31
+208.13535081052387
+12
+18.438364387727777
+22
+-138.2222294155557
+32
+206.10860837043137
+13
+18.438364387727777
+23
+-138.2222294155557
+33
+206.10860837043137
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.225638335085197
+20
+-134.4230760694319
+30
+205.01735572368798
+11
+23.16966105964584
+21
+-134.3445861940883
+31
+207.5235556968914
+12
+23.59983425242441
+22
+-135.7570997259629
+32
+207.24732001157068
+13
+23.59983425242441
+23
+-135.7570997259629
+33
+207.24732001157068
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.54142318240073
+20
+-135.4102839976966
+30
+204.70065820340258
+11
+23.225638335085197
+21
+-134.4230760694319
+31
+205.01735572368798
+12
+23.59983425242441
+22
+-135.7570997259629
+32
+207.24732001157068
+13
+23.59983425242441
+23
+-135.7570997259629
+33
+207.24732001157068
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.225638335085197
+20
+-134.4230760694319
+30
+205.01735572368798
+11
+21.08116108197625
+21
+-133.09392000207066
+31
+206.97412656948148
+12
+21.211369092237366
+22
+-133.40453303589504
+32
+209.16271634943135
+13
+21.211369092237366
+23
+-133.40453303589504
+33
+209.16271634943135
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.225638335085197
+20
+-134.4230760694319
+30
+205.01735572368798
+11
+21.211369092237366
+21
+-133.40453303589504
+31
+209.16271634943135
+12
+23.16966105964584
+22
+-134.3445861940883
+32
+207.5235556968914
+13
+23.16966105964584
+23
+-134.3445861940883
+33
+207.5235556968914
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.057112710288575
+20
+-134.1301080463461
+30
+211.7738737140834
+11
+19.788207709056262
+21
+-133.18944643950613
+31
+209.79124380083198
+12
+20.560024816608735
+22
+-133.8821652230687
+32
+212.2627622012084
+13
+20.560024816608735
+23
+-133.8821652230687
+33
+212.2627622012084
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.057112710288575
+20
+-134.1301080463461
+30
+211.7738737140834
+11
+21.211369092237366
+21
+-133.40453303589504
+31
+209.16271634943135
+12
+19.788207709056262
+22
+-133.18944643950613
+32
+209.79124380083198
+13
+19.788207709056262
+23
+-133.18944643950613
+33
+209.79124380083198
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.560024816608735
+20
+-133.8821652230687
+30
+212.2627622012084
+11
+18.680526948867612
+21
+-133.40666260615652
+31
+209.61814016102215
+12
+18.926644426206977
+22
+-134.2618371782223
+32
+211.1645123950343
+13
+18.926644426206977
+23
+-134.2618371782223
+33
+211.1645123950343
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.560024816608735
+20
+-133.8821652230687
+30
+212.2627622012084
+11
+19.788207709056262
+21
+-133.18944643950613
+31
+209.79124380083198
+12
+18.680526948867612
+22
+-133.40666260615652
+32
+209.61814016102215
+13
+18.680526948867612
+23
+-133.40666260615652
+33
+209.61814016102215
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.85364523884491
+20
+-133.82862174221302
+30
+209.64491190144926
+11
+18.44262352825034
+21
+-134.6183880848252
+31
+211.0343043847731
+12
+18.926644426206977
+22
+-134.2618371782223
+32
+211.1645123950343
+13
+18.926644426206977
+23
+-134.2618371782223
+33
+211.1645123950343
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.926644426206977
+20
+-134.2618371782223
+30
+211.1645123950343
+11
+18.680526948867612
+21
+-133.40666260615652
+31
+209.61814016102215
+12
+17.85364523884491
+22
+-133.82862174221302
+32
+209.64491190144926
+13
+17.85364523884491
+23
+-133.82862174221302
+33
+209.64491190144926
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.44262352825034
+20
+-134.6183880848252
+30
+211.0343043847731
+11
+16.656522527682505
+21
+-135.0208768642068
+31
+210.13805952909703
+12
+16.850617645782034
+22
+-135.7939108690518
+32
+211.615068617456
+13
+16.850617645782034
+23
+-135.7939108690518
+33
+211.615068617456
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.44262352825034
+20
+-134.6183880848252
+30
+211.0343043847731
+11
+17.85364523884491
+21
+-133.82862174221302
+31
+209.64491190144926
+12
+16.656522527682505
+22
+-135.0208768642068
+32
+210.13805952909703
+13
+16.656522527682505
+23
+-135.0208768642068
+33
+210.13805952909703
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.28993221841932
+20
+-136.06132404900364
+30
+210.31937722562856
+11
+16.64222398449962
+21
+-136.64421785194864
+31
+211.38203278600713
+12
+16.850617645782034
+22
+-135.7939108690518
+32
+211.615068617456
+13
+16.850617645782034
+23
+-135.7939108690518
+33
+211.615068617456
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.656522527682505
+20
+-135.0208768642068
+30
+210.13805952909703
+11
+16.28993221841932
+21
+-136.06132404900364
+31
+210.31937722562856
+12
+16.850617645782034
+22
+-135.7939108690518
+32
+211.615068617456
+13
+16.850617645782034
+23
+-135.7939108690518
+33
+211.615068617456
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.18891509300251
+20
+-138.06281587028357
+30
+209.2062204276247
+11
+17.195303803786338
+21
+-138.46439197669676
+31
+210.84690220177944
+12
+16.64222398449962
+22
+-136.64421785194864
+32
+211.38203278600713
+13
+16.64222398449962
+23
+-136.64421785194864
+33
+211.38203278600713
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.18891509300251
+20
+-138.06281587028357
+30
+209.2062204276247
+11
+16.64222398449962
+21
+-136.64421785194864
+31
+211.38203278600713
+12
+16.28993221841932
+22
+-136.06132404900364
+32
+210.31937722562856
+13
+16.28993221841932
+23
+-136.06132404900364
+33
+210.31937722562856
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.149047056516743
+20
+-138.86535963446283
+30
+208.13535081052387
+11
+18.500121925304903
+21
+-140.1951241504711
+31
+210.03036411873958
+12
+17.195303803786338
+22
+-138.46439197669676
+32
+210.84690220177944
+13
+17.195303803786338
+23
+-138.46439197669676
+33
+210.84690220177944
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.149047056516743
+20
+-138.86535963446283
+30
+208.13535081052387
+11
+17.195303803786338
+21
+-138.46439197669676
+31
+210.84690220177944
+12
+17.18891509300251
+22
+-138.06281587028357
+32
+209.2062204276247
+13
+17.18891509300251
+23
+-138.06281587028357
+33
+209.2062204276247
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.510450902120734
+20
+-131.8971015152306
+30
+204.16126847865394
+11
+17.5022661457337
+21
+-130.77786023076615
+31
+202.80229842763464
+12
+17.757510352764253
+22
+-131.5919645192215
+32
+204.52207852577948
+13
+17.757510352764253
+23
+-131.5919645192215
+33
+204.52207852577948
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.613582947631294
+20
+-131.14232096976806
+30
+202.37912239428556
+11
+17.5022661457337
+21
+-130.77786023076615
+31
+202.80229842763464
+12
+19.510450902120734
+22
+-131.8971015152306
+32
+204.16126847865394
+13
+19.510450902120734
+23
+-131.8971015152306
+33
+204.16126847865394
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.757510352764253
+20
+-131.5919645192215
+30
+204.52207852577948
+11
+16.445086623169697
+21
+-131.47240436026638
+31
+202.69916638212356
+12
+16.797986837896094
+22
+-132.16329779789072
+32
+204.47066461518568
+13
+16.797986837896094
+23
+-132.16329779789072
+33
+204.47066461518568
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.757510352764253
+20
+-131.5919645192215
+30
+204.52207852577948
+11
+17.5022661457337
+21
+-130.77786023076615
+31
+202.80229842763464
+12
+16.445086623169697
+22
+-131.47240436026638
+32
+202.69916638212356
+13
+16.445086623169697
+23
+-131.47240436026638
+33
+202.69916638212356
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.843939360842672
+20
+-133.15871978287709
+30
+202.7785689304369
+11
+16.141774973098816
+21
+-133.61840273499098
+31
+204.68848923048188
+12
+16.797986837896094
+22
+-132.16329779789072
+32
+204.47066461518568
+13
+16.797986837896094
+23
+-132.16329779789072
+33
+204.47066461518568
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.445086623169697
+20
+-131.47240436026638
+30
+202.69916638212356
+11
+15.843939360842672
+21
+-133.15871978287709
+31
+202.7785689304369
+12
+16.797986837896094
+22
+-132.16329779789072
+32
+204.47066461518568
+13
+16.797986837896094
+23
+-132.16329779789072
+33
+204.47066461518568
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.17189318107979
+20
+-134.55115450943117
+30
+202.7846534168972
+11
+16.254337972623624
+21
+-134.9356940537543
+31
+204.7286468411229
+12
+16.141774973098816
+22
+-133.61840273499098
+32
+204.68848923048188
+13
+16.141774973098816
+23
+-133.61840273499098
+33
+204.68848923048188
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.843939360842672
+20
+-133.15871978287709
+30
+202.7785689304369
+11
+16.17189318107979
+21
+-134.55115450943117
+31
+202.7846534168972
+12
+16.141774973098816
+22
+-133.61840273499098
+32
+204.68848923048188
+13
+16.141774973098816
+23
+-133.61840273499098
+33
+204.68848923048188
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.82291858221786
+20
+-135.95727933052183
+30
+201.91152960977223
+11
+17.774851139177546
+21
+-136.4741564553673
+31
+203.77885850459148
+12
+16.254337972623624
+22
+-134.9356940537543
+32
+204.7286468411229
+13
+16.254337972623624
+23
+-134.9356940537543
+33
+204.7286468411229
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.82291858221786
+20
+-135.95727933052183
+30
+201.91152960977223
+11
+16.254337972623624
+21
+-134.9356940537543
+31
+204.7286468411229
+12
+16.17189318107979
+22
+-134.55115450943117
+32
+202.7846534168972
+13
+16.17189318107979
+23
+-134.55115450943117
+33
+202.7846534168972
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.000570936705696
+20
+-136.501232420117
+30
+201.02988752160215
+11
+18.9564584098649
+21
+-137.06496009071077
+31
+202.90299667855933
+12
+17.774851139177546
+22
+-136.4741564553673
+32
+203.77885850459148
+13
+17.774851139177546
+23
+-136.4741564553673
+33
+203.77885850459148
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.000570936705696
+20
+-136.501232420117
+30
+201.02988752160215
+11
+17.774851139177546
+21
+-136.4741564553673
+31
+203.77885850459148
+12
+17.82291858221786
+22
+-135.95727933052183
+32
+201.91152960977223
+13
+17.82291858221786
+23
+-135.95727933052183
+33
+201.91152960977223
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.692956195609707
+20
+-136.96487028843018
+30
+201.2279375559007
+11
+18.9564584098649
+21
+-137.06496009071077
+31
+202.90299667855933
+12
+20.887978636845848
+22
+-136.15989272966613
+32
+199.74484398108123
+13
+20.887978636845848
+23
+-136.15989272966613
+33
+199.74484398108123
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.887978636845848
+20
+-136.15989272966613
+30
+199.74484398108123
+11
+18.9564584098649
+21
+-137.06496009071077
+31
+202.90299667855933
+12
+19.000570936705696
+22
+-136.501232420117
+32
+201.02988752160215
+13
+19.000570936705696
+23
+-136.501232420117
+33
+201.02988752160215
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.184582701642352
+20
+-133.17606056928963
+30
+199.94198134241157
+11
+22.426441038459135
+21
+-133.43982305736586
+31
+201.88201985043798
+12
+22.52683506506234
+22
+-134.64668094686527
+32
+200.99064258393042
+13
+22.52683506506234
+23
+-134.64668094686527
+33
+200.99064258393042
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.782702370906488
+20
+-134.54294045270822
+30
+199.13578688635562
+11
+22.184582701642352
+21
+-133.17606056928963
+31
+199.94198134241157
+12
+22.52683506506234
+22
+-134.64668094686527
+32
+200.99064258393042
+13
+22.52683506506234
+23
+-134.64668094686527
+33
+200.99064258393042
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.184582701642352
+20
+-133.17606056928963
+30
+199.94198134241157
+11
+20.996586720171134
+21
+-131.82560879931557
+31
+201.65050514060485
+12
+20.9460854825465
+22
+-132.38568577803264
+32
+203.54612689746722
+13
+20.9460854825465
+23
+-132.38568577803264
+33
+203.54612689746722
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.426441038459135
+20
+-133.43982305736586
+30
+201.88201985043798
+11
+22.184582701642352
+21
+-133.17606056928963
+31
+199.94198134241157
+12
+20.9460854825465
+22
+-132.38568577803264
+32
+203.54612689746722
+13
+20.9460854825465
+23
+-132.38568577803264
+33
+203.54612689746722
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.01666552549177
+20
+-132.77509291152433
+30
+205.1630791744245
+11
+19.510450902120734
+21
+-131.8971015152306
+31
+204.16126847865394
+12
+19.586506982880742
+22
+-132.32514513774834
+32
+205.85762330392467
+13
+19.586506982880742
+23
+-132.32514513774834
+33
+205.85762330392467
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.01666552549177
+20
+-132.77509291152433
+30
+205.1630791744245
+11
+20.9460854825465
+21
+-132.38568577803264
+31
+203.54612689746722
+12
+19.510450902120734
+22
+-131.8971015152306
+32
+204.16126847865394
+13
+19.510450902120734
+23
+-131.8971015152306
+33
+204.16126847865394
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.586506982880742
+20
+-132.32514513774834
+30
+205.85762330392467
+11
+17.757510352764253
+21
+-131.5919645192215
+31
+204.52207852577948
+12
+17.954951938417217
+22
+-132.0954557738532
+32
+206.12199424064667
+13
+17.954951938417217
+23
+-132.0954557738532
+33
+206.12199424064667
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.586506982880742
+20
+-132.32514513774834
+30
+205.85762330392467
+11
+19.510450902120734
+21
+-131.8971015152306
+31
+204.16126847865394
+12
+17.757510352764253
+22
+-131.5919645192215
+32
+204.52207852577948
+13
+17.757510352764253
+23
+-131.5919645192215
+33
+204.52207852577948
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.954951938417217
+20
+-132.0954557738532
+30
+206.12199424064667
+11
+16.797986837896094
+21
+-132.16329779789072
+31
+204.47066461518568
+12
+17.068746485401697
+22
+-132.62024273109714
+32
+206.09096335969613
+13
+17.068746485401697
+23
+-132.62024273109714
+33
+206.09096335969613
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.954951938417217
+20
+-132.0954557738532
+30
+206.12199424064667
+11
+17.757510352764253
+21
+-131.5919645192215
+31
+204.52207852577948
+12
+16.797986837896094
+22
+-132.16329779789072
+32
+204.47066461518568
+13
+16.797986837896094
+23
+-132.16329779789072
+33
+204.47066461518568
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.141774973098816
+20
+-133.61840273499098
+30
+204.68848923048188
+11
+16.329177156091465
+21
+-133.8380526962263
+31
+206.32460763979088
+12
+17.068746485401697
+22
+-132.62024273109714
+32
+206.09096335969613
+13
+17.068746485401697
+23
+-132.62024273109714
+33
+206.09096335969613
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.797986837896094
+20
+-132.16329779789072
+30
+204.47066461518568
+11
+16.141774973098816
+21
+-133.61840273499098
+31
+204.68848923048188
+12
+17.068746485401697
+22
+-132.62024273109714
+32
+206.09096335969613
+13
+17.068746485401697
+23
+-132.62024273109714
+33
+206.09096335969613
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.254337972623624
+20
+-134.9356940537543
+30
+204.7286468411229
+11
+16.192276210723463
+21
+-135.21162551475192
+31
+206.35472584777145
+12
+16.329177156091465
+22
+-133.8380526962263
+32
+206.32460763979088
+13
+16.329177156091465
+23
+-133.8380526962263
+33
+206.32460763979088
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.141774973098816
+20
+-133.61840273499098
+30
+204.68848923048188
+11
+16.254337972623624
+21
+-134.9356940537543
+31
+204.7286468411229
+12
+16.329177156091465
+22
+-133.8380526962263
+32
+206.32460763979088
+13
+16.329177156091465
+23
+-133.8380526962263
+33
+206.32460763979088
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.774851139177546
+20
+-136.4741564553673
+30
+203.77885850459148
+11
+17.58197291837018
+21
+-136.93749009935757
+31
+205.3739066302899
+12
+16.192276210723463
+22
+-135.21162551475192
+32
+206.35472584777145
+13
+16.192276210723463
+23
+-135.21162551475192
+33
+206.35472584777145
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.774851139177546
+20
+-136.4741564553673
+30
+203.77885850459148
+11
+16.192276210723463
+21
+-135.21162551475192
+31
+206.35472584777145
+12
+16.254337972623624
+22
+-134.9356940537543
+32
+204.7286468411229
+13
+16.254337972623624
+23
+-134.9356940537543
+33
+204.7286468411229
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.9564584098649
+20
+-137.06496009071077
+30
+202.90299667855933
+11
+18.736504224306973
+21
+-137.6317300045346
+31
+204.3276791833555
+12
+17.58197291837018
+22
+-136.93749009935757
+32
+205.3739066302899
+13
+17.58197291837018
+23
+-136.93749009935757
+33
+205.3739066302899
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.9564584098649
+20
+-137.06496009071077
+30
+202.90299667855933
+11
+17.58197291837018
+21
+-136.93749009935757
+31
+205.3739066302899
+12
+17.774851139177546
+22
+-136.4741564553673
+32
+203.77885850459148
+13
+17.774851139177546
+23
+-136.4741564553673
+33
+203.77885850459148
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.692956195609707
+20
+-136.96487028843018
+30
+201.2279375559007
+11
+21.59773398249818
+21
+-138.16016765365467
+31
+202.8327208599364
+12
+18.736504224306973
+22
+-137.6317300045346
+32
+204.3276791833555
+13
+18.736504224306973
+23
+-137.6317300045346
+33
+204.3276791833555
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.692956195609707
+20
+-136.96487028843018
+30
+201.2279375559007
+11
+18.736504224306973
+21
+-137.6317300045346
+31
+204.3276791833555
+12
+18.9564584098649
+22
+-137.06496009071077
+32
+202.90299667855933
+13
+18.9564584098649
+23
+-137.06496009071077
+33
+202.90299667855933
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.426441038459135
+20
+-133.43982305736586
+30
+201.88201985043798
+11
+23.03032631969353
+21
+-133.97373674430142
+31
+203.43903993575654
+12
+23.20799332434889
+22
+-134.94360388615286
+32
+202.5500964638334
+13
+23.20799332434889
+23
+-134.94360388615286
+33
+202.5500964638334
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.52683506506234
+20
+-134.64668094686527
+30
+200.99064258393042
+11
+22.426441038459135
+21
+-133.43982305736586
+31
+201.88201985043798
+12
+23.20799332434889
+22
+-134.94360388615286
+32
+202.5500964638334
+13
+23.20799332434889
+23
+-134.94360388615286
+33
+202.5500964638334
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.426441038459135
+20
+-133.43982305736586
+30
+201.88201985043798
+11
+20.9460854825465
+21
+-132.38568577803264
+31
+203.54612689746722
+12
+21.01666552549177
+22
+-132.77509291152433
+32
+205.1630791744245
+13
+21.01666552549177
+23
+-132.77509291152433
+33
+205.1630791744245
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.03032631969353
+20
+-133.97373674430142
+30
+203.43903993575654
+11
+22.426441038459135
+21
+-133.43982305736586
+31
+201.88201985043798
+12
+21.01666552549177
+22
+-132.77509291152433
+32
+205.1630791744245
+13
+21.01666552549177
+23
+-132.77509291152433
+33
+205.1630791744245
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.08116108197625
+20
+-133.09392000207066
+30
+206.97412656948148
+11
+19.586506982880742
+21
+-132.32514513774834
+31
+205.85762330392467
+12
+19.677774279792757
+22
+-132.7264170198385
+32
+207.63338067750936
+13
+19.677774279792757
+23
+-132.7264170198385
+33
+207.63338067750936
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.08116108197625
+20
+-133.09392000207066
+30
+206.97412656948148
+11
+21.01666552549177
+21
+-132.77509291152433
+31
+205.1630791744245
+12
+19.586506982880742
+22
+-132.32514513774834
+32
+205.85762330392467
+13
+19.586506982880742
+23
+-132.32514513774834
+33
+205.85762330392467
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.677774279792757
+20
+-132.7264170198385
+30
+207.63338067750936
+11
+17.954951938417217
+21
+-132.0954557738532
+31
+206.12199424064667
+12
+18.280167739746986
+22
+-132.71820296311645
+32
+207.7282986662979
+13
+18.280167739746986
+23
+-132.71820296311645
+33
+207.7282986662979
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.677774279792757
+20
+-132.7264170198385
+30
+207.63338067750936
+11
+19.586506982880742
+21
+-132.32514513774834
+31
+205.85762330392467
+12
+17.954951938417217
+22
+-132.0954557738532
+32
+206.12199424064667
+13
+17.954951938417217
+23
+-132.0954557738532
+33
+206.12199424064667
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.280167739746986
+20
+-132.71820296311645
+30
+207.7282986662979
+11
+17.068746485401697
+21
+-132.62024273109714
+31
+206.09096335969613
+12
+17.364148303073545
+22
+-133.10061293717774
+32
+207.7267775446825
+13
+17.364148303073545
+23
+-133.10061293717774
+33
+207.7267775446825
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.280167739746986
+20
+-132.71820296311645
+30
+207.7282986662979
+11
+17.954951938417217
+21
+-132.0954557738532
+31
+206.12199424064667
+12
+17.068746485401697
+22
+-132.62024273109714
+32
+206.09096335969613
+13
+17.068746485401697
+23
+-132.62024273109714
+33
+206.09096335969613
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.329177156091465
+20
+-133.8380526962263
+30
+206.32460763979088
+11
+16.397627628775467
+21
+-134.5161687122829
+31
+208.0197455677696
+12
+17.364148303073545
+22
+-133.10061293717774
+32
+207.7267775446825
+13
+17.364148303073545
+23
+-133.10061293717774
+33
+207.7267775446825
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.068746485401697
+20
+-132.62024273109714
+30
+206.09096335969613
+11
+16.329177156091465
+21
+-133.8380526962263
+31
+206.32460763979088
+12
+17.364148303073545
+22
+-133.10061293717774
+32
+207.7267775446825
+13
+17.364148303073545
+23
+-133.10061293717774
+33
+207.7267775446825
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.361945481974654
+20
+-136.52374502002218
+30
+201.30216829072293
+11
+21.692956195609707
+21
+-136.96487028843018
+31
+201.2279375559007
+12
+21.354962972712258
+22
+-135.81064320681594
+32
+199.58117129528583
+13
+21.354962972712258
+23
+-135.81064320681594
+33
+199.58117129528583
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.692956195609707
+20
+-136.96487028843018
+30
+201.2279375559007
+11
+20.887978636845848
+21
+-136.15989272966613
+31
+199.74484398108123
+12
+21.354962972712258
+22
+-135.81064320681594
+32
+199.58117129528583
+13
+21.354962972712258
+23
+-135.81064320681594
+33
+199.58117129528583
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.782079272092894
+20
+-135.74614765033195
+30
+201.31190346906038
+11
+23.349457634562494
+21
+-136.4166580583125
+31
+203.001261134901
+12
+22.820411536795934
+22
+-137.7421634337978
+32
+203.11504103171762
+13
+22.820411536795934
+23
+-137.7421634337978
+33
+203.11504103171762
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.361945481974654
+20
+-136.52374502002218
+30
+201.30216829072293
+11
+22.782079272092894
+21
+-135.74614765033195
+31
+201.31190346906038
+12
+22.820411536795934
+22
+-137.7421634337978
+32
+203.11504103171762
+13
+22.820411536795934
+23
+-137.7421634337978
+33
+203.11504103171762
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.820411536795934
+20
+-137.7421634337978
+30
+203.11504103171762
+11
+21.59773398249818
+21
+-138.16016765365467
+31
+202.8327208599364
+12
+22.361945481974654
+22
+-136.52374502002218
+32
+201.30216829072293
+13
+22.361945481974654
+23
+-136.52374502002218
+33
+201.30216829072293
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.367450820124397
+20
+-134.7266919438242
+30
+198.03905820179614
+11
+21.609598731096735
+21
+-135.27672951988066
+31
+199.32166794773286
+12
+21.354962972712258
+22
+-135.81064320681594
+32
+199.58117129528583
+13
+21.354962972712258
+23
+-135.81064320681594
+33
+199.58117129528583
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.609598731096735
+20
+-135.27672951988066
+30
+199.32166794773286
+11
+20.367450820124397
+21
+-134.7266919438242
+31
+198.03905820179614
+12
+20.6144809704329
+22
+-134.29378073213806
+32
+197.85621938364943
+13
+20.6144809704329
+23
+-134.29378073213806
+33
+197.85621938364943
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.058663132238816
+20
+-133.97647476320734
+30
+197.80085055685623
+11
+19.796725990101372
+21
+-134.61108670106887
+31
+198.15375077158248
+12
+17.45328602972427
+22
+-134.24510484045211
+32
+199.4619153606546
+13
+17.45328602972427
+23
+-134.24510484045211
+33
+199.4619153606546
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.091259085306664
+20
+-130.95431033812878
+30
+200.25563661946651
+11
+19.03373138791706
+21
+-131.58253356520595
+31
+199.32957778013287
+12
+16.65317606012906
+22
+-131.3428047986507
+32
+200.3186110543356
+13
+16.65317606012906
+23
+-131.3428047986507
+33
+200.3186110543356
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.091259085306664
+20
+-130.95431033812878
+30
+200.25563661946651
+11
+18.4879529523833
+21
+-131.02854107295022
+31
+199.75914252426554
+12
+19.03373138791706
+22
+-131.58253356520595
+32
+199.32957778013287
+13
+19.03373138791706
+23
+-131.58253356520595
+33
+199.32957778013287
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.65317606012906
+20
+-131.3428047986507
+30
+200.3186110543356
+11
+20.27435817727417
+21
+-132.6199385067721
+31
+198.3524092545279
+12
+16.168546713526318
+22
+-132.3272747080081
+32
+200.21456633585566
+13
+16.168546713526318
+23
+-132.3272747080081
+33
+200.21456633585566
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.65317606012906
+20
+-131.3428047986507
+30
+200.3186110543356
+11
+19.03373138791706
+21
+-131.58253356520595
+31
+199.32957778013287
+12
+20.27435817727417
+22
+-132.6199385067721
+32
+198.3524092545279
+13
+20.27435817727417
+23
+-132.6199385067721
+33
+198.3524092545279
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.168546713526318
+20
+-132.3272747080081
+30
+200.21456633585566
+11
+20.133806540029695
+21
+-133.3996654467235
+31
+197.9356219319631
+12
+16.393672712575935
+22
+-133.4942792111895
+32
+200.13303421728065
+13
+16.393672712575935
+23
+-133.4942792111895
+33
+200.13303421728065
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.168546713526318
+20
+-132.3272747080081
+30
+200.21456633585566
+11
+20.27435817727417
+21
+-132.6199385067721
+31
+198.3524092545279
+12
+20.133806540029695
+22
+-133.3996654467235
+32
+197.9356219319631
+13
+20.133806540029695
+23
+-133.3996654467235
+33
+197.9356219319631
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.133806540029695
+20
+-133.3996654467235
+30
+197.9356219319631
+11
+20.058663132238816
+21
+-133.97647476320734
+31
+197.80085055685623
+12
+16.393672712575935
+22
+-133.4942792111895
+32
+200.13303421728065
+13
+16.393672712575935
+23
+-133.4942792111895
+33
+200.13303421728065
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.393672712575935
+20
+-133.4942792111895
+30
+200.13303421728065
+11
+20.058663132238816
+21
+-133.97647476320734
+31
+197.80085055685623
+12
+17.45328602972427
+22
+-134.24510484045211
+32
+199.4619153606546
+13
+17.45328602972427
+23
+-134.24510484045211
+33
+199.4619153606546
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.45328602972427
+20
+-134.24510484045211
+30
+199.4619153606546
+11
+19.796725990101372
+21
+-134.61108670106887
+31
+198.15375077158248
+12
+18.554882303452096
+22
+-134.76624110581946
+32
+198.9864127437429
+13
+18.554882303452096
+23
+-134.76624110581946
+33
+198.9864127437429
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.16970501014843
+20
+-131.35497377157222
+30
+200.03963735010828
+11
+19.03373138791706
+21
+-131.58253356520595
+31
+199.32957778013287
+12
+18.95493728824971
+22
+-130.75473918221448
+32
+200.67942110146154
+13
+18.95493728824971
+23
+-130.75473918221448
+33
+200.67942110146154
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.03373138791706
+20
+-131.58253356520595
+30
+199.32957778013287
+11
+18.4879529523833
+21
+-131.02854107295022
+31
+199.75914252426554
+12
+18.95493728824971
+22
+-130.75473918221448
+32
+200.67942110146154
+13
+18.95493728824971
+23
+-130.75473918221448
+33
+200.67942110146154
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.95493728824971
+20
+-130.75473918221448
+30
+200.67942110146154
+11
+18.4879529523833
+21
+-131.02854107295022
+31
+199.75914252426554
+12
+17.111946339273377
+22
+-130.44443037271387
+32
+201.10138023751773
+13
+17.111946339273377
+23
+-130.44443037271387
+33
+201.10138023751773
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.4879529523833
+20
+-131.02854107295022
+30
+199.75914252426554
+11
+17.091259085306664
+21
+-130.95431033812878
+31
+200.25563661946651
+12
+17.111946339273377
+22
+-130.44443037271387
+32
+201.10138023751773
+13
+17.111946339273377
+23
+-130.44443037271387
+33
+201.10138023751773
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.111946339273377
+20
+-130.44443037271387
+30
+201.10138023751773
+11
+17.091259085306664
+21
+-130.95431033812878
+31
+200.25563661946651
+12
+16.181019910770985
+22
+-131.0586592809316
+32
+201.01711010003584
+13
+16.181019910770985
+23
+-131.0586592809316
+33
+201.01711010003584
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.091259085306664
+20
+-130.95431033812878
+30
+200.25563661946651
+11
+16.65317606012906
+21
+-131.3428047986507
+31
+200.3186110543356
+12
+16.181019910770985
+22
+-131.0586592809316
+32
+201.01711010003584
+13
+16.181019910770985
+23
+-131.0586592809316
+33
+201.01711010003584
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.65317606012906
+20
+-131.3428047986507
+30
+200.3186110543356
+11
+15.651973813004425
+21
+-132.55087958544274
+31
+201.09985911590235
+12
+16.181019910770985
+22
+-131.0586592809316
+32
+201.01711010003584
+13
+16.181019910770985
+23
+-131.0586592809316
+33
+201.01711010003584
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.168546713526318
+20
+-132.3272747080081
+30
+200.21456633585566
+11
+15.651973813004425
+21
+-132.55087958544274
+31
+201.09985911590235
+12
+16.65317606012906
+22
+-131.3428047986507
+32
+200.3186110543356
+13
+16.65317606012906
+23
+-131.3428047986507
+33
+200.3186110543356
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.168546713526318
+20
+-132.3272747080081
+30
+200.21456633585566
+11
+15.933989760462502
+21
+-133.75560790468117
+31
+201.05057477556954
+12
+15.651973813004425
+22
+-132.55087958544274
+32
+201.09985911590235
+13
+15.651973813004425
+23
+-132.55087958544274
+33
+201.09985911590235
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.393672712575935
+20
+-133.4942792111895
+30
+200.13303421728065
+11
+15.933989760462502
+21
+-133.75560790468117
+31
+201.05057477556954
+12
+16.168546713526318
+22
+-132.3272747080081
+32
+200.21456633585566
+13
+16.168546713526318
+23
+-132.3272747080081
+33
+200.21456633585566
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.323382243786185
+20
+-134.85385771085527
+30
+200.0490683041216
+11
+15.933989760462502
+21
+-133.75560790468117
+31
+201.05057477556954
+12
+16.393672712575935
+22
+-133.4942792111895
+32
+200.13303421728065
+13
+16.393672712575935
+23
+-133.4942792111895
+33
+200.13303421728065
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.45328602972427
+20
+-134.24510484045211
+30
+199.4619153606546
+11
+17.323382243786185
+21
+-134.85385771085527
+31
+200.0490683041216
+12
+16.393672712575935
+22
+-133.4942792111895
+32
+200.13303421728065
+13
+16.393672712575935
+23
+-133.4942792111895
+33
+200.13303421728065
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.380257542027138
+20
+-135.39750657612763
+30
+199.39894092578498
+11
+17.323382243786185
+21
+-134.85385771085527
+31
+200.0490683041216
+12
+17.45328602972427
+22
+-134.24510484045211
+32
+199.4619153606546
+13
+17.45328602972427
+23
+-134.24510484045211
+33
+199.4619153606546
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.45328602972427
+20
+-134.24510484045211
+30
+199.4619153606546
+11
+18.554882303452096
+21
+-134.76624110581946
+31
+198.9864127437429
+12
+18.380257542027138
+22
+-135.39750657612763
+32
+199.39894092578498
+13
+18.380257542027138
+23
+-135.39750657612763
+33
+199.39894092578498
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.554882303452096
+20
+-134.76624110581946
+30
+198.9864127437429
+11
+19.992342229816092
+21
+-135.06133869916806
+31
+198.22646038478877
+12
+18.380257542027138
+22
+-135.39750657612763
+32
+199.39894092578498
+13
+18.380257542027138
+23
+-135.39750657612763
+33
+199.39894092578498
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.796725990101372
+20
+-134.61108670106887
+30
+198.15375077158248
+11
+19.992342229816092
+21
+-135.06133869916806
+31
+198.22646038478877
+12
+18.554882303452096
+22
+-134.76624110581946
+32
+198.9864127437429
+13
+18.554882303452096
+23
+-134.76624110581946
+33
+198.9864127437429
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.24331264615658
+20
+-132.5609189881024
+30
+198.58209861842332
+11
+20.876722336893383
+21
+-133.75621635332638
+31
+197.8540898133883
+12
+20.133806540029695
+22
+-133.3996654467235
+32
+197.9356219319631
+13
+20.133806540029695
+23
+-133.3996654467235
+33
+197.9356219319631
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.24331264615658
+20
+-132.5609189881024
+30
+198.58209861842332
+11
+20.133806540029695
+21
+-133.3996654467235
+31
+197.9356219319631
+12
+20.27435817727417
+22
+-132.6199385067721
+32
+198.3524092545279
+13
+20.27435817727417
+23
+-132.6199385067721
+33
+198.3524092545279
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.24331264615658
+20
+-132.5609189881024
+30
+198.58209861842332
+11
+20.27435817727417
+21
+-132.6199385067721
+31
+198.3524092545279
+12
+19.03373138791706
+22
+-131.58253356520595
+32
+199.32957778013287
+13
+19.03373138791706
+23
+-131.58253356520595
+33
+199.32957778013287
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.24331264615658
+20
+-132.5609189881024
+30
+198.58209861842332
+11
+19.03373138791706
+21
+-131.58253356520595
+31
+199.32957778013287
+12
+20.16970501014843
+22
+-131.35497377157222
+32
+200.03963735010828
+13
+20.16970501014843
+23
+-131.35497377157222
+33
+200.03963735010828
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.133806540029695
+20
+-133.3996654467235
+30
+197.9356219319631
+11
+20.876722336893383
+21
+-133.75621635332638
+31
+197.8540898133883
+12
+20.058663132238816
+22
+-133.97647476320734
+32
+197.80085055685623
+13
+20.058663132238816
+23
+-133.97647476320734
+33
+197.80085055685623
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.876722336893383
+20
+-133.75621635332638
+30
+197.8540898133883
+11
+20.6144809704329
+21
+-134.29378073213806
+31
+197.85621938364943
+12
+20.058663132238816
+22
+-133.97647476320734
+32
+197.80085055685623
+13
+20.058663132238816
+23
+-133.97647476320734
+33
+197.80085055685623
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.796725990101372
+20
+-134.61108670106887
+30
+198.15375077158248
+11
+20.367450820124397
+21
+-134.7266919438242
+31
+198.03905820179614
+12
+19.992342229816092
+22
+-135.06133869916806
+32
+198.22646038478877
+13
+19.992342229816092
+23
+-135.06133869916806
+33
+198.22646038478877
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.058663132238816
+20
+-133.97647476320734
+30
+197.80085055685623
+11
+20.6144809704329
+21
+-134.29378073213806
+31
+197.85621938364943
+12
+19.796725990101372
+22
+-134.61108670106887
+32
+198.15375077158248
+13
+19.796725990101372
+23
+-134.61108670106887
+33
+198.15375077158248
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.6144809704329
+20
+-134.29378073213806
+30
+197.85621938364943
+11
+20.367450820124397
+21
+-134.7266919438242
+31
+198.03905820179614
+12
+19.796725990101372
+22
+-134.61108670106887
+32
+198.15375077158248
+13
+19.796725990101372
+23
+-134.61108670106887
+33
+198.15375077158248
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.50465598981545
+20
+-135.80577561765082
+30
+212.6117074997351
+11
+21.034614760551136
+21
+-136.5751589306188
+31
+212.7206198073833
+12
+20.682018770147778
+22
+-135.35126447902914
+32
+213.20342380804806
+13
+20.682018770147778
+23
+-135.35126447902914
+33
+213.20342380804806
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.682018770147778
+20
+-135.35126447902914
+30
+213.20342380804806
+11
+21.034614760551136
+21
+-136.5751589306188
+31
+212.7206198073833
+12
+21.520765228769047
+22
+-135.72515617204522
+32
+213.33058957507862
+13
+21.520765228769047
+23
+-135.72515617204522
+33
+213.33058957507862
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.5177522858737
+20
+-135.58612565641567
+30
+212.11612607750294
+11
+20.027936475611778
+21
+-135.90130205508513
+31
+212.3646773494262
+12
+20.50465598981545
+22
+-135.80577561765082
+32
+212.6117074997351
+13
+20.50465598981545
+23
+-135.80577561765082
+33
+212.6117074997351
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.682018770147778
+20
+-135.35126447902914
+30
+213.20342380804806
+11
+19.5177522858737
+21
+-135.58612565641567
+31
+212.11612607750294
+12
+20.50465598981545
+22
+-135.80577561765082
+32
+212.6117074997351
+13
+20.50465598981545
+23
+-135.80577561765082
+33
+212.6117074997351
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.027936475611778
+20
+-135.90130205508513
+30
+212.3646773494262
+11
+19.000875161028734
+21
+-135.96640606021577
+31
+212.25698193907033
+12
+19.72888396606346
+22
+-136.43126082582106
+32
+212.35707174135004
+13
+19.72888396606346
+23
+-136.43126082582106
+33
+212.35707174135004
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.5177522858737
+20
+-135.58612565641567
+30
+212.11612607750294
+11
+19.000875161028734
+21
+-135.96640606021577
+31
+212.25698193907033
+12
+20.027936475611778
+22
+-135.90130205508513
+32
+212.3646773494262
+13
+20.027936475611778
+23
+-135.90130205508513
+33
+212.3646773494262
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.72888396606346
+20
+-136.43126082582106
+30
+212.35707174135004
+11
+18.358049166445223
+21
+-136.43491151769737
+31
+212.63787079151595
+12
+19.443825775374986
+22
+-136.87664523475144
+32
+212.58158929175391
+13
+19.443825775374986
+23
+-136.87664523475144
+33
+212.58158929175391
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.000875161028734
+20
+-135.96640606021577
+30
+212.25698193907033
+11
+18.358049166445223
+21
+-136.43491151769737
+31
+212.63787079151595
+12
+19.72888396606346
+22
+-136.43126082582106
+32
+212.35707174135004
+13
+19.72888396606346
+23
+-136.43126082582106
+33
+212.35707174135004
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.443825775374986
+20
+-136.87664523475144
+30
+212.58158929175391
+11
+18.054129067728255
+21
+-137.4686657673872
+31
+212.27584384709812
+12
+18.774228040363937
+22
+-137.51156139693597
+32
+212.44468834638562
+13
+18.774228040363937
+23
+-137.51156139693597
+33
+212.44468834638562
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.358049166445223
+20
+-136.43491151769737
+30
+212.63787079151595
+11
+18.054129067728255
+21
+-137.4686657673872
+31
+212.27584384709812
+12
+19.443825775374986
+22
+-136.87664523475144
+32
+212.58158929175391
+13
+19.443825775374986
+23
+-136.87664523475144
+33
+212.58158929175391
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.774228040363937
+20
+-137.51156139693597
+30
+212.44468834638562
+11
+18.29568318022202
+21
+-138.40080909318186
+31
+211.81190175446218
+12
+19.06567494183625
+22
+-138.22314208852632
+32
+211.954582961968
+13
+19.06567494183625
+23
+-138.22314208852632
+33
+211.954582961968
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.054129067728255
+20
+-137.4686657673872
+30
+212.27584384709812
+11
+18.29568318022202
+21
+-138.40080909318186
+31
+211.81190175446218
+12
+18.774228040363937
+22
+-137.51156139693597
+32
+212.44468834638562
+13
+18.774228040363937
+23
+-137.51156139693597
+33
+212.44468834638562
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.06567494183625
+20
+-138.22314208852632
+30
+211.954582961968
+11
+19.258248938320577
+21
+-139.64569502306128
+31
+211.462956455935
+12
+19.5086255561825
+22
+-138.90460457213587
+32
+211.7610962925144
+13
+19.5086255561825
+23
+-138.90460457213587
+33
+211.7610962925144
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.06567494183625
+20
+-138.22314208852632
+30
+211.954582961968
+11
+18.29568318022202
+21
+-138.40080909318186
+31
+211.81190175446218
+12
+19.258248938320577
+22
+-139.64569502306128
+32
+211.462956455935
+13
+19.258248938320577
+23
+-139.64569502306128
+33
+211.462956455935
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.83839007219034
+20
+-137.16778791190075
+30
+212.6454763995921
+11
+21.520765228769047
+21
+-135.72515617204522
+31
+213.33058957507862
+12
+21.034614760551136
+22
+-136.5751589306188
+32
+212.7206198073833
+13
+21.034614760551136
+23
+-136.5751589306188
+33
+212.7206198073833
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.520765228769047
+20
+-135.72515617204522
+30
+213.33058957507862
+11
+20.83839007219034
+21
+-137.16778791190075
+31
+212.6454763995921
+12
+21.69052240102538
+22
+-136.98525331807687
+32
+212.96704150904543
+13
+21.69052240102538
+23
+-136.98525331807687
+33
+212.96704150904543
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.69052240102538
+20
+-136.98525331807687
+30
+212.96704150904543
+11
+20.83839007219034
+21
+-137.16778791190075
+31
+212.6454763995921
+12
+20.657376599981554
+22
+-137.88271507104474
+32
+212.7379605937961
+13
+20.657376599981554
+23
+-137.88271507104474
+33
+212.7379605937961
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.69052240102538
+20
+-136.98525331807687
+30
+212.96704150904543
+11
+20.657376599981554
+21
+-137.88271507104474
+31
+212.7379605937961
+12
+21.33092925119209
+22
+-138.16047187798037
+32
+212.87516576348722
+13
+21.33092925119209
+23
+-138.16047187798037
+33
+212.87516576348722
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.657376599981554
+20
+-137.88271507104474
+30
+212.7379605937961
+11
+20.2189893504809
+21
+-138.5130678683836
+31
+212.3324295711838
+12
+21.33092925119209
+22
+-138.16047187798037
+32
+212.87516576348722
+13
+21.33092925119209
+23
+-138.16047187798037
+33
+212.87516576348722
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.33092925119209
+20
+-138.16047187798037
+30
+212.87516576348722
+11
+20.2189893504809
+21
+-138.5130678683836
+31
+212.3324295711838
+12
+20.865770261263933
+22
+-139.14311644139948
+32
+212.43495316804768
+13
+20.865770261263933
+23
+-139.14311644139948
+33
+212.43495316804768
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.2189893504809
+20
+-138.5130678683836
+30
+212.3324295711838
+11
+19.898641138319768
+21
+-138.93381010714774
+31
+211.8718339461006
+12
+20.865770261263933
+22
+-139.14311644139948
+32
+212.43495316804768
+13
+20.865770261263933
+23
+-139.14311644139948
+33
+212.43495316804768
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.898641138319768
+20
+-138.93381010714774
+30
+211.8718339461006
+11
+19.9162861490561
+21
+-140.06248234562614
+31
+211.64184035788253
+12
+20.865770261263933
+22
+-139.14311644139948
+32
+212.43495316804768
+13
+20.865770261263933
+23
+-139.14311644139948
+33
+212.43495316804768
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.5086255561825
+20
+-138.90460457213587
+30
+211.7610962925144
+11
+19.9162861490561
+21
+-140.06248234562614
+31
+211.64184035788253
+12
+19.898641138319768
+22
+-138.93381010714774
+32
+211.8718339461006
+13
+19.898641138319768
+23
+-138.93381010714774
+33
+211.8718339461006
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.5086255561825
+20
+-138.90460457213587
+30
+211.7610962925144
+11
+19.258248938320577
+21
+-139.64569502306128
+31
+211.462956455935
+12
+19.9162861490561
+22
+-140.06248234562614
+32
+211.64184035788253
+13
+19.9162861490561
+23
+-140.06248234562614
+33
+211.64184035788253
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.50465598981545
+20
+-135.80577561765082
+30
+212.6117074997351
+11
+20.027936475611778
+21
+-135.90130205508513
+31
+212.3646773494262
+12
+19.72888396606346
+22
+-136.43126082582106
+32
+212.35707174135004
+13
+19.72888396606346
+23
+-136.43126082582106
+33
+212.35707174135004
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.50465598981545
+20
+-135.80577561765082
+30
+212.6117074997351
+11
+19.72888396606346
+21
+-136.43126082582106
+31
+212.35707174135004
+12
+21.034614760551136
+22
+-136.5751589306188
+32
+212.7206198073833
+13
+21.034614760551136
+23
+-136.5751589306188
+33
+212.7206198073833
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.72888396606346
+20
+-136.43126082582106
+30
+212.35707174135004
+11
+19.443825775374986
+21
+-136.87664523475144
+31
+212.58158929175391
+12
+21.034614760551136
+22
+-136.5751589306188
+32
+212.7206198073833
+13
+21.034614760551136
+23
+-136.5751589306188
+33
+212.7206198073833
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.034614760551136
+20
+-136.5751589306188
+30
+212.7206198073833
+11
+19.443825775374986
+21
+-136.87664523475144
+31
+212.58158929175391
+12
+20.83839007219034
+22
+-137.16778791190075
+32
+212.6454763995921
+13
+20.83839007219034
+23
+-137.16778791190075
+33
+212.6454763995921
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.443825775374986
+20
+-136.87664523475144
+30
+212.58158929175391
+11
+18.774228040363937
+21
+-137.51156139693597
+31
+212.44468834638562
+12
+20.657376599981554
+22
+-137.88271507104474
+32
+212.7379605937961
+13
+20.657376599981554
+23
+-137.88271507104474
+33
+212.7379605937961
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.443825775374986
+20
+-136.87664523475144
+30
+212.58158929175391
+11
+20.657376599981554
+21
+-137.88271507104474
+31
+212.7379605937961
+12
+20.83839007219034
+22
+-137.16778791190075
+32
+212.6454763995921
+13
+20.83839007219034
+23
+-137.16778791190075
+33
+212.6454763995921
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.774228040363937
+20
+-137.51156139693597
+30
+212.44468834638562
+11
+19.06567494183625
+21
+-138.22314208852632
+31
+211.954582961968
+12
+20.2189893504809
+22
+-138.5130678683836
+32
+212.3324295711838
+13
+20.2189893504809
+23
+-138.5130678683836
+33
+212.3324295711838
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.774228040363937
+20
+-137.51156139693597
+30
+212.44468834638562
+11
+20.2189893504809
+21
+-138.5130678683836
+31
+212.3324295711838
+12
+20.657376599981554
+22
+-137.88271507104474
+32
+212.7379605937961
+13
+20.657376599981554
+23
+-137.88271507104474
+33
+212.7379605937961
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.06567494183625
+20
+-138.22314208852632
+30
+211.954582961968
+11
+19.5086255561825
+21
+-138.90460457213587
+31
+211.7610962925144
+12
+19.898641138319768
+22
+-138.93381010714774
+32
+211.8718339461006
+13
+19.898641138319768
+23
+-138.93381010714774
+33
+211.8718339461006
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.06567494183625
+20
+-138.22314208852632
+30
+211.954582961968
+11
+19.898641138319768
+21
+-138.93381010714774
+31
+211.8718339461006
+12
+20.2189893504809
+22
+-138.5130678683836
+32
+212.3324295711838
+13
+20.2189893504809
+23
+-138.5130678683836
+33
+212.3324295711838
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.613582947631294
+20
+-131.14232096976806
+30
+202.37912239428556
+11
+20.16970501014843
+21
+-131.35497377157222
+31
+200.03963735010828
+12
+18.95493728824971
+22
+-130.75473918221448
+32
+200.67942110146154
+13
+18.95493728824971
+23
+-130.75473918221448
+33
+200.67942110146154
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.16970501014843
+20
+-131.35497377157222
+30
+200.03963735010828
+11
+19.613582947631294
+21
+-131.14232096976806
+31
+202.37912239428556
+12
+20.996586720171134
+22
+-131.82560879931557
+32
+201.65050514060485
+13
+20.996586720171134
+23
+-131.82560879931557
+33
+201.65050514060485
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.5022661457337
+20
+-130.77786023076615
+30
+202.80229842763464
+11
+18.95493728824971
+21
+-130.75473918221448
+31
+200.67942110146154
+12
+17.111946339273377
+22
+-130.44443037271387
+32
+201.10138023751773
+13
+17.111946339273377
+23
+-130.44443037271387
+33
+201.10138023751773
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.95493728824971
+20
+-130.75473918221448
+30
+200.67942110146154
+11
+17.5022661457337
+21
+-130.77786023076615
+31
+202.80229842763464
+12
+19.613582947631294
+22
+-131.14232096976806
+32
+202.37912239428556
+13
+19.613582947631294
+23
+-131.14232096976806
+33
+202.37912239428556
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.445086623169697
+20
+-131.47240436026638
+30
+202.69916638212356
+11
+17.111946339273377
+21
+-130.44443037271387
+31
+201.10138023751773
+12
+16.181019910770985
+22
+-131.0586592809316
+32
+201.01711010003584
+13
+16.181019910770985
+23
+-131.0586592809316
+33
+201.01711010003584
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.111946339273377
+20
+-130.44443037271387
+30
+201.10138023751773
+11
+16.445086623169697
+21
+-131.47240436026638
+31
+202.69916638212356
+12
+17.5022661457337
+22
+-130.77786023076615
+32
+202.80229842763464
+13
+17.5022661457337
+23
+-130.77786023076615
+33
+202.80229842763464
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.445086623169697
+20
+-131.47240436026638
+30
+202.69916638212356
+11
+15.651973813004425
+21
+-132.55087958544274
+31
+201.09985911590235
+12
+15.843939360842672
+22
+-133.15871978287709
+32
+202.7785689304369
+13
+15.843939360842672
+23
+-133.15871978287709
+33
+202.7785689304369
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.651973813004425
+20
+-132.55087958544274
+30
+201.09985911590235
+11
+16.445086623169697
+21
+-131.47240436026638
+31
+202.69916638212356
+12
+16.181019910770985
+22
+-131.0586592809316
+32
+201.01711010003584
+13
+16.181019910770985
+23
+-131.0586592809316
+33
+201.01711010003584
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.843939360842672
+20
+-133.15871978287709
+30
+202.7785689304369
+11
+15.933989760462502
+21
+-133.75560790468117
+31
+201.05057477556954
+12
+16.17189318107979
+22
+-134.55115450943117
+32
+202.7846534168972
+13
+16.17189318107979
+23
+-134.55115450943117
+33
+202.7846534168972
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.933989760462502
+20
+-133.75560790468117
+30
+201.05057477556954
+11
+15.843939360842672
+21
+-133.15871978287709
+31
+202.7785689304369
+12
+15.651973813004425
+22
+-132.55087958544274
+32
+201.09985911590235
+13
+15.651973813004425
+23
+-132.55087958544274
+33
+201.09985911590235
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+15.933989760462502
+20
+-133.75560790468117
+30
+201.05057477556954
+11
+17.82291858221786
+21
+-135.95727933052183
+31
+201.91152960977223
+12
+16.17189318107979
+22
+-134.55115450943117
+32
+202.7846534168972
+13
+16.17189318107979
+23
+-134.55115450943117
+33
+202.7846534168972
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.82291858221786
+20
+-135.95727933052183
+30
+201.91152960977223
+11
+15.933989760462502
+21
+-133.75560790468117
+31
+201.05057477556954
+12
+17.323382243786185
+22
+-134.85385771085527
+32
+200.0490683041216
+13
+17.323382243786185
+23
+-134.85385771085527
+33
+200.0490683041216
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.380257542027138
+20
+-135.39750657612763
+30
+199.39894092578498
+11
+17.82291858221786
+21
+-135.95727933052183
+31
+201.91152960977223
+12
+17.323382243786185
+22
+-134.85385771085527
+32
+200.0490683041216
+13
+17.323382243786185
+23
+-134.85385771085527
+33
+200.0490683041216
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.82291858221786
+20
+-135.95727933052183
+30
+201.91152960977223
+11
+18.380257542027138
+21
+-135.39750657612763
+31
+199.39894092578498
+12
+19.000570936705696
+22
+-136.501232420117
+32
+201.02988752160215
+13
+19.000570936705696
+23
+-136.501232420117
+33
+201.02988752160215
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.992342229816092
+20
+-135.06133869916806
+30
+198.22646038478877
+11
+19.000570936705696
+21
+-136.501232420117
+31
+201.02988752160215
+12
+18.380257542027138
+22
+-135.39750657612763
+32
+199.39894092578498
+13
+18.380257542027138
+23
+-135.39750657612763
+33
+199.39894092578498
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.000570936705696
+20
+-136.501232420117
+30
+201.02988752160215
+11
+19.992342229816092
+21
+-135.06133869916806
+31
+198.22646038478877
+12
+20.887978636845848
+22
+-136.15989272966613
+32
+199.74484398108123
+13
+20.887978636845848
+23
+-136.15989272966613
+33
+199.74484398108123
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.782702370906488
+20
+-134.54294045270822
+30
+199.13578688635562
+11
+21.24331264615658
+21
+-132.5609189881024
+31
+198.58209861842332
+12
+22.184582701642352
+22
+-133.17606056928963
+32
+199.94198134241157
+13
+22.184582701642352
+23
+-133.17606056928963
+33
+199.94198134241157
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.24331264615658
+20
+-132.5609189881024
+30
+198.58209861842332
+11
+21.782702370906488
+21
+-134.54294045270822
+31
+199.13578688635562
+12
+20.876722336893383
+22
+-133.75621635332638
+32
+197.8540898133883
+13
+20.876722336893383
+23
+-133.75621635332638
+33
+197.8540898133883
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.996586720171134
+20
+-131.82560879931557
+30
+201.65050514060485
+11
+21.24331264615658
+21
+-132.5609189881024
+31
+198.58209861842332
+12
+20.16970501014843
+22
+-131.35497377157222
+32
+200.03963735010828
+13
+20.16970501014843
+23
+-131.35497377157222
+33
+200.03963735010828
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.24331264615658
+20
+-132.5609189881024
+30
+198.58209861842332
+11
+20.996586720171134
+21
+-131.82560879931557
+31
+201.65050514060485
+12
+22.184582701642352
+22
+-133.17606056928963
+32
+199.94198134241157
+13
+22.184582701642352
+23
+-133.17606056928963
+33
+199.94198134241157
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.6144809704329
+20
+-134.29378073213806
+30
+197.85621938364943
+11
+21.782702370906488
+21
+-134.54294045270822
+31
+199.13578688635562
+12
+21.609598731096735
+22
+-135.27672951988066
+32
+199.32166794773286
+13
+21.609598731096735
+23
+-135.27672951988066
+33
+199.32166794773286
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.782702370906488
+20
+-134.54294045270822
+30
+199.13578688635562
+11
+20.6144809704329
+21
+-134.29378073213806
+31
+197.85621938364943
+12
+20.876722336893383
+22
+-133.75621635332638
+32
+197.8540898133883
+13
+20.876722336893383
+23
+-133.75621635332638
+33
+197.8540898133883
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.367450820124397
+20
+-134.7266919438242
+30
+198.03905820179614
+11
+20.887978636845848
+21
+-136.15989272966613
+31
+199.74484398108123
+12
+19.992342229816092
+22
+-135.06133869916806
+32
+198.22646038478877
+13
+19.992342229816092
+23
+-135.06133869916806
+33
+198.22646038478877
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.887978636845848
+20
+-136.15989272966613
+30
+199.74484398108123
+11
+20.367450820124397
+21
+-134.7266919438242
+31
+198.03905820179614
+12
+21.354962972712258
+22
+-135.81064320681594
+32
+199.58117129528583
+13
+21.354962972712258
+23
+-135.81064320681594
+33
+199.58117129528583
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.9460854825465
+20
+-132.38568577803264
+30
+203.54612689746722
+11
+19.613582947631294
+21
+-131.14232096976806
+31
+202.37912239428556
+12
+19.510450902120734
+22
+-131.8971015152306
+32
+204.16126847865394
+13
+19.510450902120734
+23
+-131.8971015152306
+33
+204.16126847865394
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.996586720171134
+20
+-131.82560879931557
+30
+201.65050514060485
+11
+19.613582947631294
+21
+-131.14232096976806
+31
+202.37912239428556
+12
+20.9460854825465
+22
+-132.38568577803264
+32
+203.54612689746722
+13
+20.9460854825465
+23
+-132.38568577803264
+33
+203.54612689746722
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.192276210723463
+20
+-135.21162551475192
+30
+206.35472584777145
+11
+16.29054066706536
+21
+-135.77504896102243
+31
+208.11496778088045
+12
+16.397627628775467
+22
+-134.5161687122829
+32
+208.0197455677696
+13
+16.397627628775467
+23
+-134.5161687122829
+33
+208.0197455677696
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.329177156091465
+20
+-133.8380526962263
+30
+206.32460763979088
+11
+16.192276210723463
+21
+-135.21162551475192
+31
+206.35472584777145
+12
+16.397627628775467
+22
+-134.5161687122829
+32
+208.0197455677696
+13
+16.397627628775467
+23
+-134.5161687122829
+33
+208.0197455677696
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.58197291837018
+20
+-136.93749009935757
+30
+205.3739066302899
+11
+17.505308388964096
+21
+-137.49908819968988
+31
+207.0793881852522
+12
+16.29054066706536
+22
+-135.77504896102243
+32
+208.11496778088045
+13
+16.29054066706536
+23
+-135.77504896102243
+33
+208.11496778088045
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.58197291837018
+20
+-136.93749009935757
+30
+205.3739066302899
+11
+16.29054066706536
+21
+-135.77504896102243
+31
+208.11496778088045
+12
+16.192276210723463
+22
+-135.21162551475192
+32
+206.35472584777145
+13
+16.192276210723463
+23
+-135.21162551475192
+33
+206.35472584777145
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.361945481974654
+20
+-136.52374502002218
+30
+201.30216829072293
+11
+21.59773398249818
+21
+-138.16016765365467
+31
+202.8327208599364
+12
+21.692956195609707
+22
+-136.96487028843018
+32
+201.2279375559007
+13
+21.692956195609707
+23
+-136.96487028843018
+33
+201.2279375559007
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.349457634562494
+20
+-136.4166580583125
+30
+203.001261134901
+11
+23.482403663730988
+21
+-137.03910102325287
+31
+204.81839301641912
+12
+22.777820131570333
+22
+-138.44522584434364
+32
+204.61821341185848
+13
+22.777820131570333
+23
+-138.44522584434364
+33
+204.61821341185848
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.349457634562494
+20
+-136.4166580583125
+30
+203.001261134901
+11
+22.777820131570333
+21
+-138.44522584434364
+31
+204.61821341185848
+12
+22.820411536795934
+22
+-137.7421634337978
+32
+203.11504103171762
+13
+22.820411536795934
+23
+-137.7421634337978
+33
+203.11504103171762
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.820411536795934
+20
+-137.7421634337978
+30
+203.11504103171762
+11
+22.777820131570333
+21
+-138.44522584434364
+31
+204.61821341185848
+12
+21.70482094420825
+22
+-139.14037842249
+32
+204.28630467542132
+13
+21.70482094420825
+23
+-139.14037842249
+33
+204.28630467542132
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.820411536795934
+20
+-137.7421634337978
+30
+203.11504103171762
+11
+21.70482094420825
+21
+-139.14037842249
+31
+204.28630467542132
+12
+21.59773398249818
+22
+-138.16016765365467
+32
+202.8327208599364
+13
+21.59773398249818
+23
+-138.16016765365467
+33
+202.8327208599364
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.482403663730988
+20
+-137.03910102325287
+30
+204.81839301641912
+11
+23.347328064301216
+21
+-137.8440785820174
+31
+207.62638351807803
+12
+22.329697703732418
+22
+-139.69771738230014
+32
+207.62090748026262
+13
+22.329697703732418
+23
+-139.69771738230014
+33
+207.62090748026262
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.777820131570333
+20
+-138.44522584434364
+30
+204.61821341185848
+11
+23.482403663730988
+21
+-137.03910102325287
+31
+204.81839301641912
+12
+22.329697703732418
+22
+-139.69771738230014
+32
+207.62090748026262
+13
+22.329697703732418
+23
+-139.69771738230014
+33
+207.62090748026262
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.777820131570333
+20
+-138.44522584434364
+30
+204.61821341185848
+11
+22.329697703732418
+21
+-139.69771738230014
+31
+207.62090748026262
+12
+21.032789414612896
+22
+-140.68827177811843
+32
+207.41494761356446
+13
+21.032789414612896
+23
+-140.68827177811843
+33
+207.41494761356446
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.777820131570333
+20
+-138.44522584434364
+30
+204.61821341185848
+11
+21.032789414612896
+21
+-140.68827177811843
+31
+207.41494761356446
+12
+21.70482094420825
+22
+-139.14037842249
+32
+204.28630467542132
+13
+21.70482094420825
+23
+-139.14037842249
+33
+204.28630467542132
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.347328064301216
+20
+-137.8440785820174
+30
+207.62638351807803
+11
+23.031238992662644
+21
+-137.8936671466734
+31
+209.68567796073575
+12
+21.742544760265215
+22
+-140.0627865699488
+32
+209.7033229714717
+13
+21.742544760265215
+23
+-140.0627865699488
+33
+209.7033229714717
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.329697703732418
+20
+-139.69771738230014
+30
+207.62090748026262
+11
+23.347328064301216
+21
+-137.8440785820174
+31
+207.62638351807803
+12
+21.742544760265215
+22
+-140.0627865699488
+32
+209.7033229714717
+13
+21.742544760265215
+23
+-140.0627865699488
+33
+209.7033229714717
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.329697703732418
+20
+-139.69771738230014
+30
+207.62090748026262
+11
+21.742544760265215
+21
+-140.0627865699488
+31
+209.7033229714717
+12
+20.230549874756438
+22
+-141.24317694334374
+32
+209.4943208615429
+13
+20.230549874756438
+23
+-141.24317694334374
+33
+209.4943208615429
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.329697703732418
+20
+-139.69771738230014
+30
+207.62090748026262
+11
+20.230549874756438
+21
+-141.24317694334374
+31
+209.4943208615429
+12
+21.032789414612896
+22
+-140.68827177811843
+32
+207.41494761356446
+13
+21.032789414612896
+23
+-140.68827177811843
+33
+207.41494761356446
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.031238992662644
+20
+-137.8936671466734
+30
+209.68567796073575
+11
+22.460209938316567
+21
+-138.45496102268254
+31
+211.01483402809754
+12
+21.542365155704896
+22
+-139.88116464909416
+32
+211.0403888712325
+13
+21.542365155704896
+23
+-139.88116464909416
+33
+211.0403888712325
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.031238992662644
+20
+-137.8936671466734
+30
+209.68567796073575
+11
+21.542365155704896
+21
+-139.88116464909416
+31
+211.0403888712325
+12
+21.742544760265215
+22
+-140.0627865699488
+32
+209.7033229714717
+13
+21.742544760265215
+23
+-140.0627865699488
+33
+209.7033229714717
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.742544760265215
+20
+-140.0627865699488
+30
+209.7033229714717
+11
+21.542365155704896
+21
+-139.88116464909416
+31
+211.0403888712325
+12
+19.723103703925695
+22
+-141.1884165651969
+32
+210.8055276938451
+13
+19.723103703925695
+23
+-141.1884165651969
+33
+210.8055276938451
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.742544760265215
+20
+-140.0627865699488
+30
+209.7033229714717
+11
+19.723103703925695
+21
+-141.1884165651969
+31
+210.8055276938451
+12
+20.230549874756438
+22
+-141.24317694334374
+32
+209.4943208615429
+13
+20.230549874756438
+23
+-141.24317694334374
+33
+209.4943208615429
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.09421342753194
+20
+-136.4692888662006
+30
+210.72703781850205
+11
+22.314486487580417
+21
+-136.66307975997742
+31
+212.9792104819671
+12
+21.93694410268776
+22
+-138.15895075636504
+32
+212.63939191313085
+13
+21.93694410268776
+23
+-138.15895075636504
+33
+212.63939191313085
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.09421342753194
+20
+-136.4692888662006
+30
+210.72703781850205
+11
+21.93694410268776
+21
+-138.15895075636504
+31
+212.63939191313085
+12
+22.460209938316567
+22
+-138.45496102268254
+32
+211.01483402809754
+13
+22.460209938316567
+23
+-138.45496102268254
+33
+211.01483402809754
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.460209938316567
+20
+-138.45496102268254
+30
+211.01483402809754
+11
+21.93694410268776
+21
+-138.15895075636504
+31
+212.63939191313085
+12
+21.337013737652892
+22
+-139.70441031740813
+32
+212.13377108823835
+13
+21.337013737652892
+23
+-139.70441031740813
+33
+212.13377108823835
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.460209938316567
+20
+-138.45496102268254
+30
+211.01483402809754
+11
+21.337013737652892
+21
+-139.70441031740813
+31
+212.13377108823835
+12
+21.542365155704896
+22
+-139.88116464909416
+32
+211.0403888712325
+13
+21.542365155704896
+23
+-139.88116464909416
+33
+211.0403888712325
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.542365155704896
+20
+-139.88116464909416
+30
+211.0403888712325
+11
+21.337013737652892
+21
+-139.70441031740813
+31
+212.13377108823835
+12
+19.723103703925695
+22
+-141.1884165651969
+32
+210.8055276938451
+13
+19.723103703925695
+23
+-141.1884165651969
+33
+210.8055276938451
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.723103703925695
+20
+-141.1884165651969
+30
+210.8055276938451
+11
+21.337013737652892
+21
+-139.70441031740813
+31
+212.13377108823835
+12
+19.94184099219146
+22
+-141.17442224633731
+32
+211.5545279771693
+13
+19.94184099219146
+23
+-141.17442224633731
+33
+211.5545279771693
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.94184099219146
+20
+-141.17442224633731
+30
+211.5545279771693
+11
+19.013956806919452
+21
+-140.5754045542714
+31
+211.1915883597832
+12
+19.723103703925695
+22
+-141.1884165651969
+32
+210.8055276938451
+13
+19.723103703925695
+23
+-141.1884165651969
+33
+210.8055276938451
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.95886290411417
+20
+-134.60956557945778
+30
+213.5368536661001
+11
+20.682018770147778
+21
+-135.35126447902914
+31
+213.20342380804806
+12
+21.520765228769047
+22
+-135.72515617204522
+32
+213.33058957507862
+13
+21.520765228769047
+23
+-135.72515617204522
+33
+213.33058957507862
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.993529826773198
+20
+-135.28859426848294
+30
+213.60712948472218
+11
+21.520765228769047
+21
+-135.72515617204522
+31
+213.33058957507862
+12
+21.69052240102538
+22
+-136.98525331807687
+32
+212.96704150904543
+13
+21.69052240102538
+23
+-136.98525331807687
+33
+212.96704150904543
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.520765228769047
+20
+-135.72515617204522
+30
+213.33058957507862
+11
+21.993529826773198
+21
+-135.28859426848294
+31
+213.60712948472218
+12
+20.95886290411417
+22
+-134.60956557945778
+32
+213.5368536661001
+13
+20.95886290411417
+23
+-134.60956557945778
+33
+213.5368536661001
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.385718929674344
+20
+-134.79696776244995
+30
+212.08661631816838
+11
+19.5177522858737
+21
+-135.58612565641567
+31
+212.11612607750294
+12
+20.682018770147778
+22
+-135.35126447902914
+32
+213.20342380804806
+13
+20.682018770147778
+23
+-135.35126447902914
+33
+213.20342380804806
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.95886290411417
+20
+-134.60956557945778
+30
+213.5368536661001
+11
+19.385718929674344
+21
+-134.79696776244995
+31
+212.08661631816838
+12
+20.682018770147778
+22
+-135.35126447902914
+32
+213.20342380804806
+13
+20.682018770147778
+23
+-135.35126447902914
+33
+213.20342380804806
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.417068685114987
+20
+-135.32327584130903
+30
+211.8672705812564
+11
+19.000875161028734
+21
+-135.96640606021577
+31
+212.25698193907033
+12
+19.5177522858737
+22
+-135.58612565641567
+32
+212.11612607750294
+13
+19.5177522858737
+23
+-135.58612565641567
+33
+212.11612607750294
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.385718929674344
+20
+-134.79696776244995
+30
+212.08661631816838
+11
+18.417068685114987
+21
+-135.32327584130903
+31
+211.8672705812564
+12
+19.5177522858737
+22
+-135.58612565641567
+32
+212.11612607750294
+13
+19.5177522858737
+23
+-135.58612565641567
+33
+212.11612607750294
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.703358423263147
+20
+-135.91560059826804
+30
+212.40696453032874
+11
+18.358049166445223
+21
+-136.43491151769737
+31
+212.63787079151595
+12
+19.000875161028734
+22
+-135.96640606021577
+32
+212.25698193907033
+13
+19.000875161028734
+23
+-135.96640606021577
+33
+212.25698193907033
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.417068685114987
+20
+-135.32327584130903
+30
+211.8672705812564
+11
+17.703358423263147
+21
+-135.91560059826804
+31
+212.40696453032874
+12
+19.000875161028734
+22
+-135.96640606021577
+32
+212.25698193907033
+13
+19.000875161028734
+23
+-135.96640606021577
+33
+212.25698193907033
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.358049166445223
+20
+-136.43491151769737
+30
+212.63787079151595
+11
+17.45298180540122
+21
+-137.41786030543955
+31
+212.0841825235834
+12
+18.054129067728255
+22
+-137.4686657673872
+32
+212.27584384709812
+13
+18.054129067728255
+23
+-137.4686657673872
+33
+212.27584384709812
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.703358423263147
+20
+-135.91560059826804
+30
+212.40696453032874
+11
+17.45298180540122
+21
+-137.41786030543955
+31
+212.0841825235834
+12
+18.358049166445223
+22
+-136.43491151769737
+32
+212.63787079151595
+13
+18.358049166445223
+23
+-136.43491151769737
+33
+212.63787079151595
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.054129067728255
+20
+-137.4686657673872
+30
+212.27584384709812
+11
+17.656507877514983
+21
+-138.79538804016445
+31
+211.53384072320364
+12
+18.29568318022202
+22
+-138.40080909318186
+32
+211.81190175446218
+13
+18.29568318022202
+23
+-138.40080909318186
+33
+211.81190175446218
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.45298180540122
+20
+-137.41786030543955
+30
+212.0841825235834
+11
+17.656507877514983
+21
+-138.79538804016445
+31
+211.53384072320364
+12
+18.054129067728255
+22
+-137.4686657673872
+32
+212.27584384709812
+13
+18.054129067728255
+23
+-137.4686657673872
+33
+212.27584384709812
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.29568318022202
+20
+-138.40080909318186
+30
+211.81190175446218
+11
+19.013956806919452
+21
+-140.5754045542714
+31
+211.1915883597832
+12
+19.258248938320577
+22
+-139.64569502306128
+32
+211.462956455935
+13
+19.258248938320577
+23
+-139.64569502306128
+33
+211.462956455935
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.29568318022202
+20
+-138.40080909318186
+30
+211.81190175446218
+11
+17.656507877514983
+21
+-138.79538804016445
+31
+211.53384072320364
+12
+19.013956806919452
+22
+-140.5754045542714
+32
+211.1915883597832
+13
+19.013956806919452
+23
+-140.5754045542714
+33
+211.1915883597832
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.993529826773198
+20
+-135.28859426848294
+30
+213.60712948472218
+11
+21.69052240102538
+21
+-136.98525331807687
+31
+212.96704150904543
+12
+22.314486487580417
+22
+-136.66307975997742
+32
+212.9792104819671
+13
+22.314486487580417
+23
+-136.66307975997742
+33
+212.9792104819671
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.314486487580417
+20
+-136.66307975997742
+30
+212.9792104819671
+11
+21.69052240102538
+21
+-136.98525331807687
+31
+212.96704150904543
+12
+21.33092925119209
+22
+-138.16047187798037
+32
+212.87516576348722
+13
+21.33092925119209
+23
+-138.16047187798037
+33
+212.87516576348722
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.314486487580417
+20
+-136.66307975997742
+30
+212.9792104819671
+11
+21.33092925119209
+21
+-138.16047187798037
+31
+212.87516576348722
+12
+21.93694410268776
+22
+-138.15895075636504
+32
+212.63939191313085
+13
+21.93694410268776
+23
+-138.15895075636504
+33
+212.63939191313085
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.93694410268776
+20
+-138.15895075636504
+30
+212.63939191313085
+11
+21.33092925119209
+21
+-138.16047187798037
+31
+212.87516576348722
+12
+20.865770261263933
+22
+-139.14311644139948
+32
+212.43495316804768
+13
+20.865770261263933
+23
+-139.14311644139948
+33
+212.43495316804768
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.93694410268776
+20
+-138.15895075636504
+30
+212.63939191313085
+11
+20.865770261263933
+21
+-139.14311644139948
+31
+212.43495316804768
+12
+21.337013737652892
+22
+-139.70441031740813
+32
+212.13377108823835
+13
+21.337013737652892
+23
+-139.70441031740813
+33
+212.13377108823835
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.865770261263933
+20
+-139.14311644139948
+30
+212.43495316804768
+11
+19.9162861490561
+21
+-140.06248234562614
+31
+211.64184035788253
+12
+21.337013737652892
+22
+-139.70441031740813
+32
+212.13377108823835
+13
+21.337013737652892
+23
+-139.70441031740813
+33
+212.13377108823835
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.337013737652892
+20
+-139.70441031740813
+30
+212.13377108823835
+11
+19.9162861490561
+21
+-140.06248234562614
+31
+211.64184035788253
+12
+19.94184099219146
+22
+-141.17442224633731
+32
+211.5545279771693
+13
+19.94184099219146
+23
+-141.17442224633731
+33
+211.5545279771693
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.258248938320577
+20
+-139.64569502306128
+30
+211.462956455935
+11
+19.94184099219146
+21
+-141.17442224633731
+31
+211.5545279771693
+12
+19.9162861490561
+22
+-140.06248234562614
+32
+211.64184035788253
+13
+19.9162861490561
+23
+-140.06248234562614
+33
+211.64184035788253
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.258248938320577
+20
+-139.64569502306128
+30
+211.462956455935
+11
+19.013956806919452
+21
+-140.5754045542714
+31
+211.1915883597832
+12
+19.94184099219146
+22
+-141.17442224633731
+32
+211.5545279771693
+13
+19.94184099219146
+23
+-141.17442224633731
+33
+211.5545279771693
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.032789414612896
+20
+-140.68827177811843
+30
+207.41494761356446
+11
+20.230549874756438
+21
+-141.24317694334374
+31
+209.4943208615429
+12
+18.500121925304903
+22
+-140.1951241504711
+32
+210.03036411873958
+13
+18.500121925304903
+23
+-140.1951241504711
+33
+210.03036411873958
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.032789414612896
+20
+-140.68827177811843
+30
+207.41494761356446
+11
+18.500121925304903
+21
+-140.1951241504711
+31
+210.03036411873958
+12
+18.149047056516743
+22
+-138.86535963446283
+32
+208.13535081052387
+13
+18.149047056516743
+23
+-138.86535963446283
+33
+208.13535081052387
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.16966105964584
+20
+-134.3445861940883
+30
+207.5235556968914
+11
+23.03184744130873
+21
+-134.34914955893453
+31
+210.09729346980978
+12
+23.56119776339833
+22
+-135.51584983779276
+32
+209.29414125698403
+13
+23.56119776339833
+23
+-135.51584983779276
+33
+209.29414125698403
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.59983425242441
+20
+-135.7570997259629
+30
+207.24732001157068
+11
+23.16966105964584
+21
+-134.3445861940883
+31
+207.5235556968914
+12
+23.56119776339833
+22
+-135.51584983779276
+32
+209.29414125698403
+13
+23.56119776339833
+23
+-135.51584983779276
+33
+209.29414125698403
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.16966105964584
+20
+-134.3445861940883
+30
+207.5235556968914
+11
+21.211369092237366
+21
+-133.40453303589504
+31
+209.16271634943135
+12
+22.057112710288575
+22
+-134.1301080463461
+32
+211.7738737140834
+13
+22.057112710288575
+23
+-134.1301080463461
+33
+211.7738737140834
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.16966105964584
+20
+-134.3445861940883
+30
+207.5235556968914
+11
+22.057112710288575
+21
+-134.1301080463461
+31
+211.7738737140834
+12
+23.03184744130873
+22
+-134.34914955893453
+32
+210.09729346980978
+13
+23.03184744130873
+23
+-134.34914955893453
+33
+210.09729346980978
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.993529826773198
+20
+-135.28859426848294
+30
+213.60712948472218
+11
+20.560024816608735
+21
+-133.8821652230687
+31
+212.2627622012084
+12
+20.95886290411417
+22
+-134.60956557945778
+32
+213.5368536661001
+13
+20.95886290411417
+23
+-134.60956557945778
+33
+213.5368536661001
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.057112710288575
+20
+-134.1301080463461
+30
+211.7738737140834
+11
+20.560024816608735
+21
+-133.8821652230687
+31
+212.2627622012084
+12
+21.993529826773198
+22
+-135.28859426848294
+32
+213.60712948472218
+13
+21.993529826773198
+23
+-135.28859426848294
+33
+213.60712948472218
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.926644426206977
+20
+-134.2618371782223
+30
+211.1645123950343
+11
+19.385718929674344
+21
+-134.79696776244995
+31
+212.08661631816838
+12
+20.95886290411417
+22
+-134.60956557945778
+32
+213.5368536661001
+13
+20.95886290411417
+23
+-134.60956557945778
+33
+213.5368536661001
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.95886290411417
+20
+-134.60956557945778
+30
+213.5368536661001
+11
+20.560024816608735
+21
+-133.8821652230687
+31
+212.2627622012084
+12
+18.926644426206977
+22
+-134.2618371782223
+32
+211.1645123950343
+13
+18.926644426206977
+23
+-134.2618371782223
+33
+211.1645123950343
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.385718929674344
+20
+-134.79696776244995
+30
+212.08661631816838
+11
+18.44262352825034
+21
+-134.6183880848252
+31
+211.0343043847731
+12
+18.417068685114987
+22
+-135.32327584130903
+32
+211.8672705812564
+13
+18.417068685114987
+23
+-135.32327584130903
+33
+211.8672705812564
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.926644426206977
+20
+-134.2618371782223
+30
+211.1645123950343
+11
+18.44262352825034
+21
+-134.6183880848252
+31
+211.0343043847731
+12
+19.385718929674344
+22
+-134.79696776244995
+32
+212.08661631816838
+13
+19.385718929674344
+23
+-134.79696776244995
+33
+212.08661631816838
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.417068685114987
+20
+-135.32327584130903
+30
+211.8672705812564
+11
+16.850617645782034
+21
+-135.7939108690518
+31
+211.615068617456
+12
+17.703358423263147
+22
+-135.91560059826804
+32
+212.40696453032874
+13
+17.703358423263147
+23
+-135.91560059826804
+33
+212.40696453032874
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.44262352825034
+20
+-134.6183880848252
+30
+211.0343043847731
+11
+16.850617645782034
+21
+-135.7939108690518
+31
+211.615068617456
+12
+18.417068685114987
+22
+-135.32327584130903
+32
+211.8672705812564
+13
+18.417068685114987
+23
+-135.32327584130903
+33
+211.8672705812564
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.703358423263147
+20
+-135.91560059826804
+30
+212.40696453032874
+11
+16.64222398449962
+21
+-136.64421785194864
+31
+211.38203278600713
+12
+17.45298180540122
+22
+-137.41786030543955
+32
+212.0841825235834
+13
+17.45298180540122
+23
+-137.41786030543955
+33
+212.0841825235834
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+16.850617645782034
+20
+-135.7939108690518
+30
+211.615068617456
+11
+16.64222398449962
+21
+-136.64421785194864
+31
+211.38203278600713
+12
+17.703358423263147
+22
+-135.91560059826804
+32
+212.40696453032874
+13
+17.703358423263147
+23
+-135.91560059826804
+33
+212.40696453032874
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.195303803786338
+20
+-138.46439197669676
+30
+210.84690220177944
+11
+17.656507877514983
+21
+-138.79538804016445
+31
+211.53384072320364
+12
+17.45298180540122
+22
+-137.41786030543955
+32
+212.0841825235834
+13
+17.45298180540122
+23
+-137.41786030543955
+33
+212.0841825235834
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+17.195303803786338
+20
+-138.46439197669676
+30
+210.84690220177944
+11
+17.45298180540122
+21
+-137.41786030543955
+31
+212.0841825235834
+12
+16.64222398449962
+22
+-136.64421785194864
+32
+211.38203278600713
+13
+16.64222398449962
+23
+-136.64421785194864
+33
+211.38203278600713
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.500121925304903
+20
+-140.1951241504711
+30
+210.03036411873958
+11
+19.013956806919452
+21
+-140.5754045542714
+31
+211.1915883597832
+12
+17.656507877514983
+22
+-138.79538804016445
+32
+211.53384072320364
+13
+17.656507877514983
+23
+-138.79538804016445
+33
+211.53384072320364
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.500121925304903
+20
+-140.1951241504711
+30
+210.03036411873958
+11
+17.656507877514983
+21
+-138.79538804016445
+31
+211.53384072320364
+12
+17.195303803786338
+22
+-138.46439197669676
+32
+210.84690220177944
+13
+17.195303803786338
+23
+-138.46439197669676
+33
+210.84690220177944
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.230549874756438
+20
+-141.24317694334374
+30
+209.4943208615429
+11
+19.723103703925695
+21
+-141.1884165651969
+31
+210.8055276938451
+12
+19.013956806919452
+22
+-140.5754045542714
+32
+211.1915883597832
+13
+19.013956806919452
+23
+-140.5754045542714
+33
+211.1915883597832
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.230549874756438
+20
+-141.24317694334374
+30
+209.4943208615429
+11
+19.013956806919452
+21
+-140.5754045542714
+31
+211.1915883597832
+12
+18.500121925304903
+22
+-140.1951241504711
+32
+210.03036411873958
+13
+18.500121925304903
+23
+-140.1951241504711
+33
+210.03036411873958
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.03184744130873
+20
+-134.34914955893453
+30
+210.09729346980978
+11
+23.23628618639161
+21
+-135.16082005280543
+31
+210.96615813641176
+12
+23.09421342753194
+22
+-136.4692888662006
+32
+210.72703781850205
+13
+23.09421342753194
+23
+-136.4692888662006
+33
+210.72703781850205
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.56119776339833
+20
+-135.51584983779276
+30
+209.29414125698403
+11
+23.03184744130873
+21
+-134.34914955893453
+31
+210.09729346980978
+12
+23.09421342753194
+22
+-136.4692888662006
+32
+210.72703781850205
+13
+23.09421342753194
+23
+-136.4692888662006
+33
+210.72703781850205
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.03184744130873
+20
+-134.34914955893453
+30
+210.09729346980978
+11
+22.057112710288575
+21
+-134.1301080463461
+31
+211.7738737140834
+12
+21.993529826773198
+22
+-135.28859426848294
+32
+213.60712948472218
+13
+21.993529826773198
+23
+-135.28859426848294
+33
+213.60712948472218
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.03184744130873
+20
+-134.34914955893453
+30
+210.09729346980978
+11
+21.993529826773198
+21
+-135.28859426848294
+31
+213.60712948472218
+12
+23.23628618639161
+22
+-135.16082005280543
+32
+210.96615813641176
+13
+23.23628618639161
+23
+-135.16082005280543
+33
+210.96615813641176
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.09421342753194
+20
+-136.4692888662006
+30
+210.72703781850205
+11
+21.993529826773198
+21
+-135.28859426848294
+31
+213.60712948472218
+12
+22.314486487580417
+22
+-136.66307975997742
+32
+212.9792104819671
+13
+22.314486487580417
+23
+-136.66307975997742
+33
+212.9792104819671
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.09421342753194
+20
+-136.4692888662006
+30
+210.72703781850205
+11
+23.23628618639161
+21
+-135.16082005280543
+31
+210.96615813641176
+12
+21.993529826773198
+22
+-135.28859426848294
+32
+213.60712948472218
+13
+21.993529826773198
+23
+-135.28859426848294
+33
+213.60712948472218
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.782702370906488
+20
+-134.54294045270822
+30
+199.13578688635562
+11
+22.52683506506234
+21
+-134.64668094686527
+31
+200.99064258393042
+12
+22.782079272092894
+22
+-135.74614765033195
+32
+201.31190346906038
+13
+22.782079272092894
+23
+-135.74614765033195
+33
+201.31190346906038
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.782702370906488
+20
+-134.54294045270822
+30
+199.13578688635562
+11
+22.782079272092894
+21
+-135.74614765033195
+31
+201.31190346906038
+12
+21.609598731096735
+22
+-135.27672951988066
+32
+199.32166794773286
+13
+21.609598731096735
+23
+-135.27672951988066
+33
+199.32166794773286
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.52683506506234
+20
+-134.64668094686527
+30
+200.99064258393042
+11
+23.20799332434889
+21
+-134.94360388615286
+31
+202.5500964638334
+12
+23.349457634562494
+22
+-136.4166580583125
+32
+203.001261134901
+13
+23.349457634562494
+23
+-136.4166580583125
+33
+203.001261134901
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.52683506506234
+20
+-134.64668094686527
+30
+200.99064258393042
+11
+23.349457634562494
+21
+-136.4166580583125
+31
+203.001261134901
+12
+22.782079272092894
+22
+-135.74614765033195
+32
+201.31190346906038
+13
+22.782079272092894
+23
+-135.74614765033195
+33
+201.31190346906038
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.20799332434889
+20
+-134.94360388615286
+30
+202.5500964638334
+11
+23.54142318240073
+21
+-135.4102839976966
+31
+204.70065820340258
+12
+23.482403663730988
+22
+-137.03910102325287
+32
+204.81839301641912
+13
+23.482403663730988
+23
+-137.03910102325287
+33
+204.81839301641912
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.20799332434889
+20
+-134.94360388615286
+30
+202.5500964638334
+11
+23.482403663730988
+21
+-137.03910102325287
+31
+204.81839301641912
+12
+23.349457634562494
+22
+-136.4166580583125
+32
+203.001261134901
+13
+23.349457634562494
+23
+-136.4166580583125
+33
+203.001261134901
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.54142318240073
+20
+-135.4102839976966
+30
+204.70065820340258
+11
+23.59983425242441
+21
+-135.7570997259629
+31
+207.24732001157068
+12
+23.347328064301216
+22
+-137.8440785820174
+32
+207.62638351807803
+13
+23.347328064301216
+23
+-137.8440785820174
+33
+207.62638351807803
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.54142318240073
+20
+-135.4102839976966
+30
+204.70065820340258
+11
+23.347328064301216
+21
+-137.8440785820174
+31
+207.62638351807803
+12
+23.482403663730988
+22
+-137.03910102325287
+32
+204.81839301641912
+13
+23.482403663730988
+23
+-137.03910102325287
+33
+204.81839301641912
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.59983425242441
+20
+-135.7570997259629
+30
+207.24732001157068
+11
+23.56119776339833
+21
+-135.51584983779276
+31
+209.29414125698403
+12
+23.031238992662644
+22
+-137.8936671466734
+32
+209.68567796073575
+13
+23.031238992662644
+23
+-137.8936671466734
+33
+209.68567796073575
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.59983425242441
+20
+-135.7570997259629
+30
+207.24732001157068
+11
+23.031238992662644
+21
+-137.8936671466734
+31
+209.68567796073575
+12
+23.347328064301216
+22
+-137.8440785820174
+32
+207.62638351807803
+13
+23.347328064301216
+23
+-137.8440785820174
+33
+207.62638351807803
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.56119776339833
+20
+-135.51584983779276
+30
+209.29414125698403
+11
+23.09421342753194
+21
+-136.4692888662006
+31
+210.72703781850205
+12
+22.460209938316567
+22
+-138.45496102268254
+32
+211.01483402809754
+13
+22.460209938316567
+23
+-138.45496102268254
+33
+211.01483402809754
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.56119776339833
+20
+-135.51584983779276
+30
+209.29414125698403
+11
+22.460209938316567
+21
+-138.45496102268254
+31
+211.01483402809754
+12
+23.031238992662644
+22
+-137.8936671466734
+32
+209.68567796073575
+13
+23.031238992662644
+23
+-137.8936671466734
+33
+209.68567796073575
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.609598731096735
+20
+-135.27672951988066
+30
+199.32166794773286
+11
+22.782079272092894
+21
+-135.74614765033195
+31
+201.31190346906038
+12
+22.361945481974654
+22
+-136.52374502002218
+32
+201.30216829072293
+13
+22.361945481974654
+23
+-136.52374502002218
+33
+201.30216829072293
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.609598731096735
+20
+-135.27672951988066
+30
+199.32166794773286
+11
+22.361945481974654
+21
+-136.52374502002218
+31
+201.30216829072293
+12
+21.354962972712258
+22
+-135.81064320681594
+32
+199.58117129528583
+13
+21.354962972712258
+23
+-135.81064320681594
+33
+199.58117129528583
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.17896016215239
+20
+-102.9014812862919
+30
+218.42756388329929
+11
+33.31675913032199
+21
+-105.64132553959021
+31
+218.70440801726485
+12
+34.44360602286215
+22
+-105.09493865541016
+32
+217.97092317441562
+13
+34.44360602286215
+23
+-105.09493865541016
+33
+217.97092317441562
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.310659993693676
+20
+-107.40917308077526
+30
+217.31471130961765
+11
+32.85403393497817
+21
+-107.9248333083281
+31
+217.46621502249147
+12
+32.30612592918311
+22
+-110.2168593581113
+32
+216.47322683208833
+13
+32.30612592918311
+23
+-110.2168593581113
+33
+216.47322683208833
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.310659993693676
+20
+-107.40917308077526
+30
+217.31471130961765
+11
+32.30612592918311
+21
+-110.2168593581113
+31
+216.47322683208833
+12
+34.51966210362219
+22
+-110.58892570518927
+32
+216.73759776881013
+13
+34.51966210362219
+23
+-110.58892570518927
+33
+216.73759776881013
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.85403393497817
+20
+-107.9248333083281
+30
+217.46621502249147
+11
+34.44360602286215
+21
+-105.09493865541016
+31
+217.97092317441562
+12
+33.31675913032199
+22
+-105.64132553959021
+32
+218.70440801726485
+13
+33.31675913032199
+23
+-105.64132553959021
+33
+218.70440801726485
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.44360602286215
+20
+-105.09493865541016
+30
+217.97092317441562
+11
+32.85403393497817
+21
+-107.9248333083281
+31
+217.46621502249147
+12
+34.310659993693676
+22
+-107.40917308077526
+32
+217.31471130961765
+13
+34.310659993693676
+23
+-107.40917308077526
+33
+217.31471130961765
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.30612592918311
+20
+-110.2168593581113
+30
+216.47322683208833
+11
+30.686435633318155
+21
+-110.41703896267154
+31
+216.42394249175592
+12
+31.885687914741833
+22
+-111.23935730784858
+32
+215.85139231579433
+13
+31.885687914741833
+23
+-111.23935730784858
+33
+215.85139231579433
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.686435633318155
+20
+-110.41703896267154
+30
+216.42394249175592
+11
+30.26052158106215
+21
+-111.49186349597173
+31
+215.74491380273034
+12
+31.885687914741833
+22
+-111.23935730784858
+32
+215.85139231579433
+13
+31.885687914741833
+23
+-111.23935730784858
+33
+215.85139231579433
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.30612592918311
+20
+-110.2168593581113
+30
+216.47322683208833
+11
+33.97814280861095
+21
+-111.59560399012835
+31
+216.04001139607894
+12
+34.51966210362219
+22
+-110.58892570518927
+32
+216.73759776881013
+13
+34.51966210362219
+23
+-110.58892570518927
+33
+216.73759776881013
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.30612592918311
+20
+-110.2168593581113
+30
+216.47322683208833
+11
+31.885687914741833
+21
+-111.23935730784858
+31
+215.85139231579433
+12
+33.97814280861095
+22
+-111.59560399012835
+32
+216.04001139607894
+13
+33.97814280861095
+23
+-111.59560399012835
+33
+216.04001139607894
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.30563468187721
+20
+-109.73679337635433
+30
+217.3548689202585
+11
+25.17115288092599
+21
+-111.22688411060412
+31
+216.64785159351266
+12
+25.81428309983256
+22
+-110.64551142927485
+32
+217.57451888149282
+13
+25.81428309983256
+23
+-110.64551142927485
+33
+217.57451888149282
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.81428309983256
+20
+-110.64551142927485
+30
+217.57451888149282
+11
+25.478723671519464
+21
+-110.20681995545137
+31
+217.96179644472267
+12
+24.30563468187721
+22
+-109.73679337635433
+32
+217.3548689202585
+13
+24.30563468187721
+23
+-109.73679337635433
+33
+217.3548689202585
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.96235244414791
+20
+-104.71830894348334
+30
+205.10193008550038
+11
+32.91153233203271
+21
+-104.83239306462349
+31
+205.97109897642605
+12
+31.41048952215335
+22
+-105.42471782158219
+32
+204.8901899566644
+13
+31.41048952215335
+23
+-105.42471782158219
+33
+204.8901899566644
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.91153233203271
+20
+-104.83239306462349
+30
+205.97109897642605
+11
+31.823321928518634
+21
+-105.90204578443209
+31
+205.26408164968078
+12
+31.41048952215335
+22
+-105.42471782158219
+32
+204.8901899566644
+13
+31.41048952215335
+23
+-105.42471782158219
+33
+204.8901899566644
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.1929984315148
+20
+-106.47885510091584
+30
+205.22940007685398
+11
+30.313152388948076
+21
+-106.74839785112937
+31
+205.62884661300544
+12
+29.05640171046983
+22
+-106.9750449717942
+32
+205.50746110811252
+13
+29.05640171046983
+23
+-106.9750449717942
+33
+205.50746110811252
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.329580502392233
+20
+-106.14572946718722
+30
+205.20171566345743
+11
+30.313152388948076
+21
+-106.74839785112937
+31
+205.62884661300544
+12
+29.1929984315148
+22
+-106.47885510091584
+32
+205.22940007685398
+13
+29.1929984315148
+23
+-106.47885510091584
+33
+205.22940007685398
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.545623722253204
+20
+-105.86249662243662
+30
+204.58018537148686
+11
+29.05640171046983
+21
+-106.9750449717942
+31
+205.50746110811252
+12
+26.77258971740858
+22
+-106.48159311982319
+32
+205.20688747694902
+13
+26.77258971740858
+23
+-106.48159311982319
+33
+205.20688747694902
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.545623722253204
+20
+-105.86249662243662
+30
+204.58018537148686
+11
+29.1929984315148
+21
+-106.47885510091584
+31
+205.22940007685398
+12
+29.05640171046983
+22
+-106.9750449717942
+32
+205.50746110811252
+13
+29.05640171046983
+23
+-106.9750449717942
+33
+205.50746110811252
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.169312884820243
+20
+-104.33559474509885
+30
+204.4061690587084
+11
+26.77258971740858
+21
+-106.48159311982319
+31
+205.20688747694902
+12
+25.280673637220403
+22
+-104.82144098899381
+32
+204.78675368683105
+13
+25.280673637220403
+23
+-104.82144098899381
+33
+204.78675368683105
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.169312884820243
+20
+-104.33559474509885
+30
+204.4061690587084
+11
+27.545623722253204
+21
+-105.86249662243662
+31
+204.58018537148686
+12
+26.77258971740858
+22
+-106.48159311982319
+32
+205.20688747694902
+13
+26.77258971740858
+23
+-106.48159311982319
+33
+205.20688747694902
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.249338531947302
+20
+-102.85098004866391
+30
+205.37025593842205
+11
+26.32294616795545
+21
+-103.00309221018372
+31
+204.74781297348255
+12
+25.280673637220403
+22
+-104.82144098899381
+32
+204.78675368683105
+13
+25.280673637220403
+23
+-104.82144098899381
+33
+204.78675368683105
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.32294616795545
+20
+-103.00309221018372
+30
+204.74781297348255
+11
+26.169312884820243
+21
+-104.33559474509885
+31
+204.4061690587084
+12
+25.280673637220403
+22
+-104.82144098899381
+32
+204.78675368683105
+13
+25.280673637220403
+23
+-104.82144098899381
+33
+204.78675368683105
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.83831682135272
+20
+-101.08647897503202
+30
+205.92090196312526
+11
+26.971248200353674
+21
+-101.48257904362997
+31
+205.34378842231806
+12
+25.249338531947302
+22
+-102.85098004866391
+32
+205.37025593842205
+13
+25.249338531947302
+23
+-102.85098004866391
+33
+205.37025593842205
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.971248200353674
+20
+-101.48257904362997
+30
+205.34378842231806
+11
+26.32294616795545
+21
+-103.00309221018372
+31
+204.74781297348255
+12
+25.249338531947302
+22
+-102.85098004866391
+32
+205.37025593842205
+13
+25.249338531947302
+23
+-102.85098004866391
+33
+205.37025593842205
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.684654237882487
+20
+-100.92006827032921
+30
+206.1000900893955
+11
+25.83831682135272
+21
+-101.08647897503202
+31
+205.92090196312526
+12
+27.405376309331764
+22
+-100.48624438567433
+32
+206.66990224644965
+13
+27.405376309331764
+23
+-100.48624438567433
+33
+206.66990224644965
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.674585534887132
+20
+-100.60367497436799
+30
+207.51290784559384
+11
+28.843140460018795
+21
+-100.76734766016332
+31
+206.68937260312433
+12
+27.405376309331764
+22
+-100.48624438567433
+32
+206.66990224644965
+13
+27.405376309331764
+23
+-100.48624438567433
+33
+206.66990224644965
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.843140460018795
+20
+-100.76734766016332
+30
+206.68937260312433
+11
+27.684654237882487
+21
+-100.92006827032921
+31
+206.1000900893955
+12
+27.405376309331764
+22
+-100.48624438567433
+32
+206.66990224644965
+13
+27.405376309331764
+23
+-100.48624438567433
+33
+206.66990224644965
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.631052156357363
+20
+-100.92280628923706
+30
+207.89957696017748
+11
+30.802953549042474
+21
+-101.44698479783469
+31
+206.87890435637806
+12
+29.674585534887132
+22
+-100.60367497436799
+32
+207.51290784559384
+13
+29.674585534887132
+23
+-100.60367497436799
+33
+207.51290784559384
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.802953549042474
+20
+-101.44698479783469
+30
+206.87890435637806
+11
+28.843140460018795
+21
+-100.76734766016332
+31
+206.68937260312433
+12
+29.674585534887132
+22
+-100.60367497436799
+32
+207.51290784559384
+13
+29.674585534887132
+23
+-100.60367497436799
+33
+207.51290784559384
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.39161296395736
+20
+-101.29821910386838
+30
+207.64615809908472
+11
+31.64352535360199
+21
+-101.85069047450877
+31
+206.7709047216986
+12
+31.631052156357363
+22
+-100.92280628923706
+32
+207.89957696017748
+13
+31.631052156357363
+23
+-100.92280628923706
+33
+207.89957696017748
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.64352535360199
+20
+-101.85069047450877
+30
+206.7709047216986
+11
+30.802953549042474
+21
+-101.44698479783469
+31
+206.87890435637806
+12
+31.631052156357363
+22
+-100.92280628923706
+32
+207.89957696017748
+13
+31.631052156357363
+23
+-100.92280628923706
+33
+207.89957696017748
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.545623722253204
+20
+-105.86249662243662
+30
+204.58018537148686
+11
+30.329580502392233
+21
+-106.14572946718722
+31
+205.20171566345743
+12
+29.1929984315148
+22
+-106.47885510091584
+32
+205.22940007685398
+13
+29.1929984315148
+23
+-106.47885510091584
+33
+205.22940007685398
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.41048952215335
+20
+-105.42471782158219
+30
+204.8901899566644
+11
+30.329580502392233
+21
+-106.14572946718722
+31
+205.20171566345743
+12
+27.545623722253204
+22
+-105.86249662243662
+32
+204.58018537148686
+13
+27.545623722253204
+23
+-105.86249662243662
+33
+204.58018537148686
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.169312884820243
+20
+-104.33559474509885
+30
+204.4061690587084
+11
+31.41048952215335
+21
+-105.42471782158219
+31
+204.8901899566644
+12
+27.545623722253204
+22
+-105.86249662243662
+32
+204.58018537148686
+13
+27.545623722253204
+23
+-105.86249662243662
+33
+204.58018537148686
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.169312884820243
+20
+-104.33559474509885
+30
+204.4061690587084
+11
+31.96235244414791
+21
+-104.71830894348334
+31
+205.10193008550038
+12
+31.41048952215335
+22
+-105.42471782158219
+32
+204.8901899566644
+13
+31.41048952215335
+23
+-105.42471782158219
+33
+204.8901899566644
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.32294616795545
+20
+-103.00309221018372
+30
+204.74781297348255
+11
+31.96235244414791
+21
+-104.71830894348334
+31
+205.10193008550038
+12
+26.169312884820243
+22
+-104.33559474509885
+32
+204.4061690587084
+13
+26.169312884820243
+23
+-104.33559474509885
+33
+204.4061690587084
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.32294616795545
+20
+-103.00309221018372
+30
+204.74781297348255
+11
+32.32012024804295
+21
+-103.02317101550466
+31
+205.92242308474
+12
+31.96235244414791
+22
+-104.71830894348334
+32
+205.10193008550038
+13
+31.96235244414791
+23
+-104.71830894348334
+33
+205.10193008550038
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.971248200353674
+20
+-101.48257904362997
+30
+205.34378842231806
+11
+32.07187320044231
+21
+-102.24009760799989
+31
+206.3179147046923
+12
+26.32294616795545
+22
+-103.00309221018372
+32
+204.74781297348255
+13
+26.32294616795545
+23
+-103.00309221018372
+33
+204.74781297348255
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.07187320044231
+20
+-102.24009760799989
+30
+206.3179147046923
+11
+26.971248200353674
+21
+-101.48257904362997
+31
+205.34378842231806
+12
+31.64352535360199
+22
+-101.85069047450877
+32
+206.7709047216986
+13
+31.64352535360199
+23
+-101.85069047450877
+33
+206.7709047216986
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.843140460018795
+20
+-100.76734766016332
+30
+206.68937260312433
+11
+30.802953549042474
+21
+-101.44698479783469
+31
+206.87890435637806
+12
+27.684654237882487
+22
+-100.92006827032921
+32
+206.1000900893955
+13
+27.684654237882487
+23
+-100.92006827032921
+33
+206.1000900893955
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.64352535360199
+20
+-101.85069047450877
+30
+206.7709047216986
+11
+27.684654237882487
+21
+-100.92006827032921
+31
+206.1000900893955
+12
+30.802953549042474
+22
+-101.44698479783469
+32
+206.87890435637806
+13
+30.802953549042474
+23
+-101.44698479783469
+33
+206.87890435637806
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.07187320044231
+20
+-102.24009760799989
+30
+206.3179147046923
+11
+32.32012024804295
+21
+-103.02317101550466
+31
+205.92242308474
+12
+26.32294616795545
+22
+-103.00309221018372
+32
+204.74781297348255
+13
+26.32294616795545
+23
+-103.00309221018372
+33
+204.74781297348255
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.49290501336215
+20
+-102.13361909493672
+30
+209.63456827447413
+11
+32.39161296395736
+21
+-101.29821910386838
+31
+207.64615809908472
+12
+32.87441696462183
+22
+-101.13454641807351
+32
+210.3096420473001
+13
+32.87441696462183
+23
+-101.13454641807351
+33
+210.3096420473001
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.39161296395736
+20
+-101.29821910386838
+30
+207.64615809908472
+11
+33.49290501336215
+21
+-102.13361909493672
+31
+209.63456827447413
+12
+32.98515461820841
+22
+-102.16404152724017
+32
+207.3121197923869
+13
+32.98515461820841
+23
+-102.16404152724017
+33
+207.3121197923869
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.82055460927623
+20
+-103.16676489598046
+30
+209.11282356046044
+11
+32.98515461820841
+21
+-102.16404152724017
+31
+207.3121197923869
+12
+33.49290501336215
+22
+-102.13361909493672
+32
+209.63456827447413
+13
+33.49290501336215
+23
+-102.13361909493672
+33
+209.63456827447413
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.98515461820841
+20
+-102.16404152724017
+30
+207.3121197923869
+11
+33.82055460927623
+21
+-103.16676489598046
+31
+209.11282356046044
+12
+33.27447194941943
+22
+-103.07641027203688
+32
+206.85121994298117
+13
+33.27447194941943
+23
+-103.07641027203688
+33
+206.85121994298117
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.823321928518634
+20
+-105.90204578443209
+30
+205.26408164968078
+11
+31.455514721963272
+21
+-107.05018837958579
+31
+208.14843245642257
+12
+31.11812994771191
+22
+-106.36659632571413
+32
+205.45452607590357
+13
+31.11812994771191
+23
+-106.36659632571413
+33
+205.45452607590357
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.455514721963272
+20
+-107.05018837958579
+30
+208.14843245642257
+11
+31.823321928518634
+21
+-105.90204578443209
+31
+205.26408164968078
+12
+32.276007721202156
+22
+-106.49741278462201
+32
+207.8886248845466
+13
+32.276007721202156
+23
+-106.49741278462201
+33
+207.8886248845466
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.11812994771191
+20
+-106.36659632571413
+30
+205.45452607590357
+11
+30.512723544862318
+21
+-107.4992234803928
+31
+208.35834723932024
+12
+30.313152388948076
+22
+-106.74839785112937
+32
+205.62884661300544
+13
+30.313152388948076
+23
+-106.74839785112937
+33
+205.62884661300544
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.512723544862318
+20
+-107.4992234803928
+30
+208.35834723932024
+11
+31.11812994771191
+21
+-106.36659632571413
+31
+205.45452607590357
+12
+31.455514721963272
+22
+-107.05018837958579
+32
+208.14843245642257
+13
+31.455514721963272
+23
+-107.05018837958579
+33
+208.14843245642257
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.40893910020311
+20
+-105.15517507136953
+30
+208.1140551079197
+11
+33.27447194941943
+21
+-103.07641027203688
+31
+206.85121994298117
+12
+33.82055460927623
+22
+-103.16676489598046
+32
+209.11282356046044
+13
+33.82055460927623
+23
+-103.16676489598046
+33
+209.11282356046044
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.27447194941943
+20
+-103.07641027203688
+30
+206.85121994298117
+11
+33.40893910020311
+21
+-105.15517507136953
+31
+208.1140551079197
+12
+32.91153233203271
+22
+-104.83239306462349
+32
+205.97109897642605
+13
+32.91153233203271
+23
+-104.83239306462349
+33
+205.97109897642605
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.276007721202156
+20
+-106.49741278462201
+30
+207.8886248845466
+11
+32.91153233203271
+21
+-104.83239306462349
+31
+205.97109897642605
+12
+33.40893910020311
+22
+-105.15517507136953
+32
+208.1140551079197
+13
+33.40893910020311
+23
+-105.15517507136953
+33
+208.1140551079197
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.91153233203271
+20
+-104.83239306462349
+30
+205.97109897642605
+11
+32.276007721202156
+21
+-106.49741278462201
+31
+207.8886248845466
+12
+31.823321928518634
+22
+-105.90204578443209
+32
+205.26408164968078
+13
+31.823321928518634
+23
+-105.90204578443209
+33
+205.26408164968078
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.05640171046983
+20
+-106.9750449717942
+30
+205.50746110811252
+11
+30.512723544862318
+21
+-107.4992234803928
+31
+208.35834723932024
+12
+29.03906092405656
+22
+-107.76481131440673
+32
+208.21597025613724
+13
+29.03906092405656
+23
+-107.76481131440673
+33
+208.21597025613724
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.512723544862318
+20
+-107.4992234803928
+30
+208.35834723932024
+11
+29.05640171046983
+21
+-106.9750449717942
+31
+205.50746110811252
+12
+30.313152388948076
+22
+-106.74839785112937
+32
+205.62884661300544
+13
+30.313152388948076
+23
+-106.74839785112937
+33
+205.62884661300544
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.77258971740858
+20
+-106.48159311982319
+30
+205.20688747694902
+11
+29.03906092405656
+21
+-107.76481131440673
+31
+208.21597025613724
+12
+26.46532315113817
+22
+-107.00850964732906
+32
+207.192863857754
+13
+26.46532315113817
+23
+-107.00850964732906
+33
+207.192863857754
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.03906092405656
+20
+-107.76481131440673
+30
+208.21597025613724
+11
+26.77258971740858
+21
+-106.48159311982319
+31
+205.20688747694902
+12
+29.05640171046983
+22
+-106.9750449717942
+32
+205.50746110811252
+13
+29.05640171046983
+23
+-106.9750449717942
+33
+205.50746110811252
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.280673637220403
+20
+-104.82144098899381
+30
+204.78675368683105
+11
+26.46532315113817
+21
+-107.00850964732906
+31
+207.192863857754
+12
+24.781137298788728
+22
+-105.13418359307943
+32
+206.71827391381206
+13
+24.781137298788728
+23
+-105.13418359307943
+33
+206.71827391381206
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.46532315113817
+20
+-107.00850964732906
+30
+207.192863857754
+11
+25.280673637220403
+21
+-104.82144098899381
+31
+204.78675368683105
+12
+26.77258971740858
+22
+-106.48159311982319
+32
+205.20688747694902
+13
+26.77258971740858
+23
+-106.48159311982319
+33
+205.20688747694902
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.249338531947302
+20
+-102.85098004866391
+30
+205.37025593842205
+11
+24.781137298788728
+21
+-105.13418359307943
+31
+206.71827391381206
+12
+24.74584727731609
+22
+-102.90969534301111
+32
+207.3772237975174
+13
+24.74584727731609
+23
+-102.90969534301111
+33
+207.3772237975174
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.781137298788728
+20
+-105.13418359307943
+30
+206.71827391381206
+11
+25.249338531947302
+21
+-102.85098004866391
+31
+205.37025593842205
+12
+25.280673637220403
+22
+-104.82144098899381
+32
+204.78675368683105
+13
+25.280673637220403
+23
+-104.82144098899381
+33
+204.78675368683105
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.83831682135272
+20
+-101.08647897503202
+30
+205.92090196312526
+11
+24.74584727731609
+21
+-102.90969534301111
+31
+207.3772237975174
+12
+25.31322563978568
+22
+-100.87960643536552
+32
+208.47121446316964
+13
+25.31322563978568
+23
+-100.87960643536552
+33
+208.47121446316964
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.74584727731609
+20
+-102.90969534301111
+30
+207.3772237975174
+11
+25.83831682135272
+21
+-101.08647897503202
+31
+205.92090196312526
+12
+25.249338531947302
+22
+-102.85098004866391
+32
+205.37025593842205
+13
+25.249338531947302
+23
+-102.85098004866391
+33
+205.37025593842205
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.126402605104083
+20
+-100.18262851128117
+30
+209.35498612160106
+11
+25.83831682135272
+21
+-101.08647897503202
+31
+205.92090196312526
+12
+25.31322563978568
+22
+-100.87960643536552
+32
+208.47121446316964
+13
+25.31322563978568
+23
+-100.87960643536552
+33
+208.47121446316964
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.83831682135272
+20
+-101.08647897503202
+30
+205.92090196312526
+11
+27.126402605104083
+21
+-100.18262851128117
+31
+209.35498612160106
+12
+27.405376309331764
+22
+-100.48624438567433
+32
+206.66990224644965
+13
+27.405376309331764
+23
+-100.48624438567433
+33
+206.66990224644965
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.757942999400075
+20
+-100.31527031612681
+30
+210.36561932273963
+11
+27.405376309331764
+21
+-100.48624438567433
+31
+206.66990224644965
+12
+27.126402605104083
+22
+-100.18262851128117
+32
+209.35498612160106
+13
+27.126402605104083
+23
+-100.18262851128117
+33
+209.35498612160106
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.405376309331764
+20
+-100.48624438567433
+30
+206.66990224644965
+11
+29.757942999400075
+21
+-100.31527031612681
+31
+210.36561932273963
+12
+29.674585534887132
+22
+-100.60367497436799
+32
+207.51290784559384
+13
+29.674585534887132
+23
+-100.60367497436799
+33
+207.51290784559384
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.757942999400075
+20
+-100.31527031612681
+30
+210.36561932273963
+11
+31.631052156357363
+21
+-100.92280628923706
+31
+207.89957696017748
+12
+29.674585534887132
+22
+-100.60367497436799
+32
+207.51290784559384
+13
+29.674585534887132
+23
+-100.60367497436799
+33
+207.51290784559384
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.631052156357363
+20
+-100.92280628923706
+30
+207.89957696017748
+11
+29.757942999400075
+21
+-100.31527031612681
+31
+210.36561932273963
+12
+32.000380484527916
+22
+-100.70315632800285
+32
+210.6007847244497
+13
+32.000380484527916
+23
+-100.70315632800285
+33
+210.6007847244497
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.000380484527916
+20
+-100.70315632800285
+30
+210.6007847244497
+11
+32.39161296395736
+21
+-101.29821910386838
+31
+207.64615809908472
+12
+31.631052156357363
+22
+-100.92280628923706
+32
+207.89957696017748
+13
+31.631052156357363
+23
+-100.92280628923706
+33
+207.89957696017748
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.39161296395736
+20
+-101.29821910386838
+30
+207.64615809908472
+11
+32.000380484527916
+21
+-100.70315632800285
+31
+210.6007847244497
+12
+32.87441696462183
+22
+-101.13454641807351
+32
+210.3096420473001
+13
+32.87441696462183
+23
+-101.13454641807351
+33
+210.3096420473001
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.145843661443593
+20
+-106.56129989246314
+30
+218.39075274021016
+11
+31.794724842152878
+21
+-108.10462988324473
+31
+217.27607482059145
+12
+30.38038596433991
+22
+-106.60206595175059
+32
+218.15376199256235
+13
+30.38038596433991
+23
+-106.60206595175059
+33
+218.15376199256235
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.145843661443593
+20
+-106.56129989246314
+30
+218.39075274021016
+11
+29.63594904586104
+21
+-108.12166644533504
+31
+217.58638363009206
+12
+31.794724842152878
+22
+-108.10462988324473
+32
+217.27607482059145
+13
+31.794724842152878
+23
+-108.10462988324473
+33
+217.27607482059145
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.874068789796254
+20
+-103.9899959141283
+30
+215.3199124234452
+11
+35.705832739155106
+21
+-104.51721666595682
+31
+216.4099481728975
+12
+35.674193409558946
+22
+-106.68633608923193
+32
+216.0573521824936
+13
+35.674193409558946
+23
+-106.68633608923193
+33
+216.0573521824936
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.75268328490326
+20
+-105.56283566424479
+30
+214.42397179209203
+11
+35.874068789796254
+21
+-103.9899959141283
+31
+215.3199124234452
+12
+35.674193409558946
+22
+-106.68633608923193
+32
+216.0573521824936
+13
+35.674193409558946
+23
+-106.68633608923193
+33
+216.0573521824936
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.70432626770743
+20
+-110.46206416248079
+30
+213.03001594392137
+11
+34.58719990333703
+21
+-111.74984572190931
+31
+214.65487805327788
+12
+32.690057024859605
+22
+-111.80430187573363
+32
+214.56726144824233
+13
+32.690057024859605
+23
+-111.80430187573363
+33
+214.56726144824233
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.70432626770743
+20
+-110.46206416248079
+30
+213.03001594392137
+11
+32.690057024859605
+21
+-111.80430187573363
+31
+214.56726144824233
+12
+33.03443895854089
+22
+-111.01636087905956
+32
+213.2149843323297
+13
+33.03443895854089
+23
+-111.01636087905956
+33
+213.2149843323297
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.03443895854089
+20
+-111.01636087905956
+30
+213.2149843323297
+11
+32.690057024859605
+21
+-111.80430187573363
+31
+214.56726144824233
+12
+30.51637423673879
+22
+-112.01269553701584
+32
+214.64027528577176
+13
+30.51637423673879
+23
+-112.01269553701584
+33
+214.64027528577176
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.03443895854089
+20
+-111.01636087905956
+30
+213.2149843323297
+11
+30.51637423673879
+21
+-112.01269553701584
+31
+214.64027528577176
+12
+30.9605417483772
+22
+-111.30081062110186
+32
+213.186083021641
+13
+30.9605417483772
+23
+-111.30081062110186
+33
+213.186083021641
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.75268328490326
+20
+-105.56283566424479
+30
+214.42397179209203
+11
+35.674193409558946
+21
+-106.68633608923193
+31
+216.0573521824936
+12
+35.41499428632888
+22
+-110.06413874794488
+32
+215.38897134477392
+13
+35.41499428632888
+23
+-110.06413874794488
+33
+215.38897134477392
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.85611955473687
+20
+-109.02582113340885
+30
+213.607737933375
+11
+35.75268328490326
+21
+-105.56283566424479
+31
+214.42397179209203
+12
+35.41499428632888
+22
+-110.06413874794488
+32
+215.38897134477392
+13
+35.41499428632888
+23
+-110.06413874794488
+33
+215.38897134477392
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.85611955473687
+20
+-109.02582113340885
+30
+213.607737933375
+11
+35.41499428632888
+21
+-110.06413874794488
+31
+215.38897134477392
+12
+34.58719990333703
+22
+-111.74984572190931
+32
+214.65487805327788
+13
+34.58719990333703
+23
+-111.74984572190931
+33
+214.65487805327788
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.70432626770743
+20
+-110.46206416248079
+30
+213.03001594392137
+11
+35.85611955473687
+21
+-109.02582113340885
+31
+213.607737933375
+12
+34.58719990333703
+22
+-111.74984572190931
+32
+214.65487805327788
+13
+34.58719990333703
+23
+-111.74984572190931
+33
+214.65487805327788
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.9605417483772
+20
+-111.30081062110186
+30
+213.186083021641
+11
+30.51637423673879
+21
+-112.01269553701584
+31
+214.64027528577176
+12
+28.107221822585046
+22
+-111.77053297587612
+32
+214.80486064453652
+13
+28.107221822585046
+23
+-111.77053297587612
+33
+214.80486064453652
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.9605417483772
+20
+-111.30081062110186
+30
+213.186083021641
+11
+28.107221822585046
+21
+-111.77053297587612
+31
+214.80486064453652
+12
+28.93227818666952
+22
+-111.10793240029453
+32
+213.18790836757927
+13
+28.93227818666952
+23
+-111.10793240029453
+33
+213.18790836757927
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.93227818666952
+20
+-111.10793240029453
+30
+213.18790836757927
+11
+28.107221822585046
+21
+-111.77053297587612
+31
+214.80486064453652
+12
+25.517360160545525
+22
+-111.03096364656595
+32
+215.1315975674814
+13
+25.517360160545525
+23
+-111.03096364656595
+33
+215.1315975674814
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.93227818666952
+20
+-111.10793240029453
+30
+213.18790836757927
+11
+25.517360160545525
+21
+-111.03096364656595
+31
+215.1315975674814
+12
+26.174788922634967
+22
+-109.85665775963089
+32
+212.6798537481023
+13
+26.174788922634967
+23
+-109.85665775963089
+33
+212.6798537481023
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.174788922634967
+20
+-109.85665775963089
+30
+212.6798537481023
+11
+25.517360160545525
+21
+-111.03096364656595
+31
+215.1315975674814
+12
+24.267910865820244
+22
+-108.80738806946655
+32
+215.19396355370515
+13
+24.267910865820244
+23
+-108.80738806946655
+33
+215.19396355370515
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.444360973183443
+20
+-107.80375202775693
+30
+212.53869366221272
+11
+26.174788922634967
+21
+-109.85665775963089
+31
+212.6798537481023
+12
+24.267910865820244
+22
+-108.80738806946655
+32
+215.19396355370515
+13
+24.267910865820244
+23
+-108.80738806946655
+33
+215.19396355370515
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.444360973183443
+20
+-107.80375202775693
+30
+212.53869366221272
+11
+24.267910865820244
+21
+-108.80738806946655
+31
+215.19396355370515
+12
+24.728506490902813
+22
+-106.39123849588306
+32
+215.70384351912125
+13
+24.728506490902813
+23
+-106.39123849588306
+33
+215.70384351912125
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.444360973183443
+20
+-107.80375202775693
+30
+212.53869366221272
+11
+24.728506490902813
+21
+-106.39123849588306
+31
+215.70384351912125
+12
+24.769272550190163
+22
+-104.94434761550414
+32
+213.28465170230746
+13
+24.769272550190163
+23
+-104.94434761550414
+33
+213.28465170230746
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.769272550190163
+20
+-104.94434761550414
+30
+213.28465170230746
+11
+24.728506490902813
+21
+-106.39123849588306
+31
+215.70384351912125
+12
+25.60436831693497
+22
+-103.97052555745397
+32
+216.3606638325653
+13
+25.60436831693497
+23
+-103.97052555745397
+33
+216.3606638325653
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.769272550190163
+20
+-104.94434761550414
+30
+213.28465170230746
+11
+25.60436831693497
+21
+-103.97052555745397
+31
+216.3606638325653
+12
+25.389890169191766
+22
+-102.8695377323717
+32
+214.42488446506152
+13
+25.389890169191766
+23
+-102.8695377323717
+33
+214.42488446506152
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.389890169191766
+20
+-102.8695377323717
+30
+214.42488446506152
+11
+25.60436831693497
+21
+-103.97052555745397
+31
+216.3606638325653
+12
+26.87359219265784
+22
+-102.14639651650631
+32
+216.91161408159104
+13
+26.87359219265784
+23
+-102.14639651650631
+33
+216.91161408159104
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.141918045579132
+20
+-101.8427806421119
+30
+215.3025716370327
+11
+25.389890169191766
+21
+-102.8695377323717
+31
+214.42488446506152
+12
+26.87359219265784
+22
+-102.14639651650631
+32
+216.91161408159104
+13
+26.87359219265784
+23
+-102.14639651650631
+33
+216.91161408159104
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.00436470106248
+20
+-101.07552689940549
+30
+217.1002331618761
+11
+27.141918045579132
+21
+-101.8427806421119
+31
+215.3025716370327
+12
+26.87359219265784
+22
+-102.14639651650631
+32
+216.91161408159104
+13
+26.87359219265784
+23
+-102.14639651650631
+33
+216.91161408159104
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.247439935171435
+20
+-100.92797810273073
+30
+215.68802385432448
+11
+27.141918045579132
+21
+-101.8427806421119
+31
+215.3025716370327
+12
+30.00436470106248
+22
+-101.07552689940549
+32
+217.1002331618761
+13
+30.00436470106248
+23
+-101.07552689940549
+33
+217.1002331618761
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.25014865374376
+20
+-100.74240126567642
+30
+216.00046223408626
+11
+30.247439935171435
+21
+-100.92797810273073
+31
+215.68802385432448
+12
+30.00436470106248
+22
+-101.07552689940549
+32
+217.1002331618761
+13
+30.00436470106248
+23
+-101.07552689940549
+33
+217.1002331618761
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.42811988272214
+20
+-100.75031109807523
+30
+215.1830114780781
+11
+30.247439935171435
+21
+-100.92797810273073
+31
+215.68802385432448
+12
+32.25014865374376
+22
+-100.74240126567642
+32
+216.00046223408626
+13
+32.25014865374376
+23
+-100.74240126567642
+33
+216.00046223408626
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.875923436069506
+20
+-102.16708377047301
+30
+217.14799638059276
+11
+32.42811988272214
+21
+-100.75031109807523
+31
+215.1830114780781
+12
+32.25014865374376
+22
+-100.74240126567642
+32
+216.00046223408626
+13
+32.25014865374376
+23
+-100.74240126567642
+33
+216.00046223408626
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.27628264519016
+20
+-101.68701778871534
+30
+214.95758125470542
+11
+32.42811988272214
+21
+-100.75031109807523
+31
+215.1830114780781
+12
+33.875923436069506
+22
+-102.16708377047301
+32
+217.14799638059276
+13
+33.875923436069506
+23
+-102.16708377047301
+33
+217.14799638059276
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.24462866542647
+20
+-102.81386468125503
+30
+213.18091120815137
+11
+35.874068789796254
+21
+-103.9899959141283
+31
+215.3199124234452
+12
+35.75268328490326
+22
+-105.56283566424479
+32
+214.42397179209203
+13
+35.75268328490326
+23
+-105.56283566424479
+33
+214.42397179209203
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.34198044879927
+20
+-104.5643714360271
+30
+212.68076642107317
+11
+35.24462866542647
+21
+-102.81386468125503
+31
+213.18091120815137
+12
+35.75268328490326
+22
+-105.56283566424479
+32
+214.42397179209203
+13
+35.75268328490326
+23
+-105.56283566424479
+33
+214.42397179209203
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.11839022153239
+20
+-101.49779025978413
+30
+213.70630661404192
+11
+34.27628264519016
+21
+-101.68701778871534
+31
+214.95758125470542
+12
+35.874068789796254
+22
+-103.9899959141283
+32
+215.3199124234452
+13
+35.874068789796254
+23
+-103.9899959141283
+33
+215.3199124234452
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.24462866542647
+20
+-102.81386468125503
+30
+213.18091120815137
+11
+34.11839022153239
+21
+-101.49779025978413
+31
+213.70630661404192
+12
+35.874068789796254
+22
+-103.9899959141283
+32
+215.3199124234452
+13
+35.874068789796254
+23
+-103.9899959141283
+33
+215.3199124234452
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.35233872595015
+20
+-102.39038442358273
+30
+210.8818879989383
+11
+35.24462866542647
+21
+-102.81386468125503
+31
+213.18091120815137
+12
+35.34198044879927
+22
+-104.5643714360271
+32
+212.68076642107317
+13
+35.34198044879927
+23
+-104.5643714360271
+33
+212.68076642107317
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.48680587673383
+20
+-103.82571477968533
+30
+210.37079113623065
+11
+34.35233872595015
+21
+-102.39038442358273
+31
+210.8818879989383
+12
+35.34198044879927
+22
+-104.5643714360271
+32
+212.68076642107317
+13
+35.34198044879927
+23
+-104.5643714360271
+33
+212.68076642107317
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.68791280443083
+20
+-101.33746404154147
+30
+211.44683256682353
+11
+34.11839022153239
+21
+-101.49779025978413
+31
+213.70630661404192
+12
+35.24462866542647
+22
+-102.81386468125503
+32
+213.18091120815137
+13
+35.24462866542647
+23
+-102.81386468125503
+33
+213.18091120815137
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.74584727731609
+20
+-102.90969534301111
+30
+207.3772237975174
+11
+24.811559731092725
+21
+-103.49684828647878
+31
+208.94519595846532
+12
+25.38319723408489
+22
+-101.47071429503262
+32
+210.03857817547157
+13
+25.38319723408489
+23
+-101.47071429503262
+33
+210.03857817547157
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.74584727731609
+20
+-102.90969534301111
+30
+207.3772237975174
+11
+25.38319723408489
+21
+-101.47071429503262
+31
+210.03857817547157
+12
+25.31322563978568
+22
+-100.87960643536552
+32
+208.47121446316964
+13
+25.31322563978568
+23
+-100.87960643536552
+33
+208.47121446316964
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.246571212704872
+20
+-100.63561852828826
+30
+210.97680598772692
+11
+25.31322563978568
+21
+-100.87960643536552
+31
+208.47121446316964
+12
+25.38319723408489
+22
+-101.47071429503262
+32
+210.03857817547157
+13
+25.38319723408489
+23
+-101.47071429503262
+33
+210.03857817547157
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.246571212704872
+20
+-100.63561852828826
+30
+210.97680598772692
+11
+27.126402605104083
+21
+-100.18262851128117
+31
+209.35498612160106
+12
+25.31322563978568
+22
+-100.87960643536552
+32
+208.47121446316964
+13
+25.31322563978568
+23
+-100.87960643536552
+33
+208.47121446316964
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.419022453365997
+20
+-100.534311828716
+30
+211.9025606027379
+11
+27.126402605104083
+21
+-100.18262851128117
+31
+209.35498612160106
+12
+27.246571212704872
+22
+-100.63561852828826
+32
+210.97680598772692
+13
+27.246571212704872
+23
+-100.63561852828826
+33
+210.97680598772692
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.419022453365997
+20
+-100.534311828716
+30
+211.9025606027379
+11
+29.757942999400075
+21
+-100.31527031612681
+31
+210.36561932273963
+12
+27.126402605104083
+22
+-100.18262851128117
+32
+209.35498612160106
+13
+27.126402605104083
+23
+-100.18262851128117
+33
+209.35498612160106
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.34354552091703
+20
+-100.55347796106757
+30
+212.17879628805818
+11
+29.757942999400075
+21
+-100.31527031612681
+31
+210.36561932273963
+12
+30.419022453365997
+22
+-100.534311828716
+32
+211.9025606027379
+13
+30.419022453365997
+23
+-100.534311828716
+33
+211.9025606027379
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.34354552091703
+20
+-100.55347796106757
+30
+212.17879628805818
+11
+32.000380484527916
+21
+-100.70315632800285
+31
+210.6007847244497
+12
+29.757942999400075
+22
+-100.31527031612681
+32
+210.36561932273963
+13
+29.757942999400075
+23
+-100.31527031612681
+33
+210.36561932273963
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.68791280443083
+20
+-101.33746404154147
+30
+211.44683256682353
+11
+32.000380484527916
+21
+-100.70315632800285
+31
+210.6007847244497
+12
+32.34354552091703
+22
+-100.55347796106757
+32
+212.17879628805818
+13
+32.34354552091703
+23
+-100.55347796106757
+33
+212.17879628805818
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.68791280443083
+20
+-101.33746404154147
+30
+211.44683256682353
+11
+32.87441696462183
+21
+-101.13454641807351
+31
+210.3096420473001
+12
+32.000380484527916
+22
+-100.70315632800285
+32
+210.6007847244497
+13
+32.000380484527916
+23
+-100.70315632800285
+33
+210.6007847244497
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.497772602530794
+20
+-106.69698394053661
+30
+209.11008554155214
+11
+34.863435588657346
+21
+-107.57193309360007
+31
+210.87124014763046
+12
+33.09619649611799
+22
+-109.28927939716088
+32
+211.1763771436388
+13
+33.09619649611799
+23
+-109.28927939716088
+33
+211.1763771436388
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.497772602530794
+20
+-106.69698394053661
+30
+209.11008554155214
+11
+33.09619649611799
+21
+-109.28927939716088
+31
+211.1763771436388
+12
+32.37944399103575
+22
+-108.02674845654451
+32
+209.65738509870087
+13
+32.37944399103575
+23
+-108.02674845654451
+33
+209.65738509870087
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.37944399103575
+20
+-108.02674845654451
+30
+209.65738509870087
+11
+30.738762216881035
+21
+-108.68235187269582
+31
+209.82044933585018
+12
+31.455514721963272
+22
+-107.05018837958579
+32
+208.14843245642257
+13
+31.455514721963272
+23
+-107.05018837958579
+33
+208.14843245642257
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.455514721963272
+20
+-107.05018837958579
+30
+208.14843245642257
+11
+30.738762216881035
+21
+-108.68235187269582
+31
+209.82044933585018
+12
+30.512723544862318
+22
+-107.4992234803928
+32
+208.35834723932024
+13
+30.512723544862318
+23
+-107.4992234803928
+33
+208.35834723932024
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.497772602530794
+20
+-106.69698394053661
+30
+209.11008554155214
+11
+32.37944399103575
+21
+-108.02674845654451
+31
+209.65738509870087
+12
+32.276007721202156
+22
+-106.49741278462201
+32
+207.8886248845466
+13
+32.276007721202156
+23
+-106.49741278462201
+33
+207.8886248845466
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.37944399103575
+20
+-108.02674845654451
+30
+209.65738509870087
+11
+31.455514721963272
+21
+-107.05018837958579
+31
+208.14843245642257
+12
+32.276007721202156
+22
+-106.49741278462201
+32
+207.8886248845466
+13
+32.276007721202156
+23
+-106.49741278462201
+33
+207.8886248845466
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.34198044879927
+20
+-104.5643714360271
+30
+212.68076642107317
+11
+35.75268328490326
+21
+-105.56283566424479
+31
+214.42397179209203
+12
+35.85611955473687
+22
+-109.02582113340885
+32
+213.607737933375
+13
+35.85611955473687
+23
+-109.02582113340885
+33
+213.607737933375
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.34106777583014
+20
+-106.32430914481318
+30
+211.37229760767767
+11
+35.34198044879927
+21
+-104.5643714360271
+31
+212.68076642107317
+12
+35.85611955473687
+22
+-109.02582113340885
+32
+213.607737933375
+13
+35.85611955473687
+23
+-109.02582113340885
+33
+213.607737933375
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.34106777583014
+20
+-106.32430914481318
+30
+211.37229760767767
+11
+35.85611955473687
+21
+-109.02582113340885
+31
+213.607737933375
+12
+34.70432626770743
+22
+-110.46206416248079
+32
+213.03001594392137
+13
+34.70432626770743
+23
+-110.46206416248079
+33
+213.03001594392137
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.863435588657346
+20
+-107.57193309360007
+30
+210.87124014763046
+11
+35.34106777583014
+21
+-106.32430914481318
+31
+211.37229760767767
+12
+34.70432626770743
+22
+-110.46206416248079
+32
+213.03001594392137
+13
+34.70432626770743
+23
+-110.46206416248079
+33
+213.03001594392137
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.9605417483772
+20
+-111.30081062110186
+30
+213.186083021641
+11
+28.93227818666952
+21
+-111.10793240029453
+31
+213.18790836757927
+12
+30.896350416215753
+22
+-110.22598608780119
+32
+211.5429674529021
+13
+30.896350416215753
+23
+-110.22598608780119
+33
+211.5429674529021
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.896350416215753
+20
+-110.22598608780119
+30
+211.5429674529021
+11
+28.93227818666952
+21
+-111.10793240029453
+31
+213.18790836757927
+12
+29.088953713035117
+22
+-110.23480859316929
+32
+211.51011122601392
+13
+29.088953713035117
+23
+-110.23480859316929
+33
+211.51011122601392
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.088953713035117
+20
+-110.23480859316929
+30
+211.51011122601392
+11
+28.93227818666952
+21
+-111.10793240029453
+31
+213.18790836757927
+12
+26.174788922634967
+22
+-109.85665775963089
+32
+212.6798537481023
+13
+26.174788922634967
+23
+-109.85665775963089
+33
+212.6798537481023
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.088953713035117
+20
+-110.23480859316929
+30
+211.51011122601392
+11
+26.174788922634967
+21
+-109.85665775963089
+31
+212.6798537481023
+12
+26.33998273004569
+22
+-108.96467204447713
+32
+210.8079614884378
+13
+26.33998273004569
+23
+-108.96467204447713
+33
+210.8079614884378
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.33998273004569
+20
+-108.96467204447713
+30
+210.8079614884378
+11
+26.174788922634967
+21
+-109.85665775963089
+31
+212.6798537481023
+12
+24.444360973183443
+22
+-107.80375202775693
+32
+212.53869366221272
+13
+24.444360973183443
+23
+-107.80375202775693
+33
+212.53869366221272
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.753452885392075
+20
+-107.0270673310353
+30
+210.547241243593
+11
+26.33998273004569
+21
+-108.96467204447713
+31
+210.8079614884378
+12
+24.444360973183443
+22
+-107.80375202775693
+32
+212.53869366221272
+13
+24.444360973183443
+23
+-107.80375202775693
+33
+212.53869366221272
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.753452885392075
+20
+-107.0270673310353
+30
+210.547241243593
+11
+24.444360973183443
+21
+-107.80375202775693
+31
+212.53869366221272
+12
+24.769272550190163
+22
+-104.94434761550414
+32
+213.28465170230746
+13
+24.769272550190163
+23
+-104.94434761550414
+33
+213.28465170230746
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.753452885392075
+20
+-107.0270673310353
+30
+210.547241243593
+11
+24.769272550190163
+21
+-104.94434761550414
+31
+213.28465170230746
+12
+24.947548003491605
+22
+-104.27870479669217
+32
+211.3604328590798
+13
+24.947548003491605
+23
+-104.27870479669217
+33
+211.3604328590798
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.947548003491605
+20
+-104.27870479669217
+30
+211.3604328590798
+11
+24.769272550190163
+21
+-104.94434761550414
+31
+213.28465170230746
+12
+25.389890169191766
+22
+-102.8695377323717
+32
+214.42488446506152
+13
+25.389890169191766
+23
+-102.8695377323717
+33
+214.42488446506152
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.947548003491605
+20
+-104.27870479669217
+30
+211.3604328590798
+11
+25.389890169191766
+21
+-102.8695377323717
+31
+214.42488446506152
+12
+25.517055936222484
+22
+-102.30185514557857
+32
+212.44012498154873
+13
+25.517055936222484
+23
+-102.30185514557857
+33
+212.44012498154873
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.141918045579132
+20
+-101.8427806421119
+30
+215.3025716370327
+11
+25.517055936222484
+21
+-102.30185514557857
+31
+212.44012498154873
+12
+25.389890169191766
+22
+-102.8695377323717
+32
+214.42488446506152
+13
+25.389890169191766
+23
+-102.8695377323717
+33
+214.42488446506152
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.20610937774056
+20
+-101.42051728173188
+30
+213.3555359695767
+11
+25.517055936222484
+21
+-102.30185514557857
+31
+212.44012498154873
+12
+27.141918045579132
+22
+-101.8427806421119
+32
+215.3025716370327
+13
+27.141918045579132
+23
+-101.8427806421119
+33
+215.3025716370327
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.247439935171435
+20
+-100.92797810273073
+30
+215.68802385432448
+11
+27.20610937774056
+21
+-101.42051728173188
+31
+213.3555359695767
+12
+27.141918045579132
+22
+-101.8427806421119
+32
+215.3025716370327
+13
+27.141918045579132
+23
+-101.8427806421119
+33
+215.3025716370327
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.458571615361194
+20
+-100.78590534387074
+30
+214.34365657081088
+11
+27.20610937774056
+21
+-101.42051728173188
+31
+213.3555359695767
+12
+30.247439935171435
+22
+-100.92797810273073
+32
+215.68802385432448
+13
+30.247439935171435
+23
+-100.92797810273073
+33
+215.68802385432448
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.42811988272214
+20
+-100.75031109807523
+30
+215.1830114780781
+11
+30.458571615361194
+21
+-100.78590534387074
+31
+214.34365657081088
+12
+30.247439935171435
+22
+-100.92797810273073
+32
+215.68802385432448
+13
+30.247439935171435
+23
+-100.92797810273073
+33
+215.68802385432448
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.83425935398055
+20
+-100.80963484106778
+30
+214.27459764948057
+11
+30.458571615361194
+21
+-100.78590534387074
+31
+214.34365657081088
+12
+32.42811988272214
+22
+-100.75031109807523
+32
+215.1830114780781
+13
+32.42811988272214
+23
+-100.75031109807523
+33
+215.1830114780781
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.27628264519016
+20
+-101.68701778871534
+30
+214.95758125470542
+11
+32.83425935398055
+21
+-100.80963484106778
+31
+214.27459764948057
+12
+32.42811988272214
+22
+-100.75031109807523
+32
+215.1830114780781
+13
+32.42811988272214
+23
+-100.75031109807523
+33
+215.1830114780781
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.27628264519016
+20
+-101.68701778871534
+30
+214.95758125470542
+11
+34.11839022153239
+21
+-101.49779025978413
+31
+213.70630661404192
+12
+32.83425935398055
+22
+-100.80963484106778
+32
+214.27459764948057
+13
+32.83425935398055
+23
+-100.80963484106778
+33
+214.27459764948057
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.48680587673383
+20
+-103.82571477968533
+30
+210.37079113623065
+11
+35.34198044879927
+21
+-104.5643714360271
+31
+212.68076642107317
+12
+35.34106777583014
+22
+-106.32430914481318
+32
+211.37229760767767
+13
+35.34106777583014
+23
+-106.32430914481318
+33
+211.37229760767767
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.29849102077206
+20
+-105.48617113483742
+30
+209.41370141594635
+11
+34.48680587673383
+21
+-103.82571477968533
+31
+210.37079113623065
+12
+35.34106777583014
+22
+-106.32430914481318
+32
+211.37229760767767
+13
+35.34106777583014
+23
+-106.32430914481318
+33
+211.37229760767767
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.29849102077206
+20
+-105.48617113483742
+30
+209.41370141594635
+11
+35.34106777583014
+21
+-106.32430914481318
+31
+211.37229760767767
+12
+34.863435588657346
+22
+-107.57193309360007
+32
+210.87124014763046
+13
+34.863435588657346
+23
+-107.57193309360007
+33
+210.87124014763046
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.497772602530794
+20
+-106.69698394053661
+30
+209.11008554155214
+11
+34.29849102077206
+21
+-105.48617113483742
+31
+209.41370141594635
+12
+34.863435588657346
+22
+-107.57193309360007
+32
+210.87124014763046
+13
+34.863435588657346
+23
+-107.57193309360007
+33
+210.87124014763046
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.896350416215753
+20
+-110.22598608780119
+30
+211.5429674529021
+11
+29.088953713035117
+21
+-110.23480859316929
+31
+211.51011122601392
+12
+30.738762216881035
+22
+-108.68235187269582
+32
+209.82044933585018
+13
+30.738762216881035
+23
+-108.68235187269582
+33
+209.82044933585018
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.738762216881035
+20
+-108.68235187269582
+30
+209.82044933585018
+11
+29.088953713035117
+21
+-110.23480859316929
+31
+211.51011122601392
+12
+29.193606880160882
+22
+-108.66044772143678
+32
+209.51227009661025
+13
+29.193606880160882
+23
+-108.66044772143678
+33
+209.51227009661025
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.193606880160882
+20
+-108.66044772143678
+30
+209.51227009661025
+11
+29.088953713035117
+21
+-110.23480859316929
+31
+211.51011122601392
+12
+26.33998273004569
+22
+-108.96467204447713
+32
+210.8079614884378
+13
+26.33998273004569
+23
+-108.96467204447713
+33
+210.8079614884378
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.193606880160882
+20
+-108.66044772143678
+30
+209.51227009661025
+11
+26.33998273004569
+21
+-108.96467204447713
+31
+210.8079614884378
+12
+26.513086369855444
+22
+-107.83143644115255
+32
+208.63792939219388
+13
+26.513086369855444
+23
+-107.83143644115255
+33
+208.63792939219388
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.513086369855444
+20
+-107.83143644115255
+30
+208.63792939219388
+11
+26.33998273004569
+21
+-108.96467204447713
+31
+210.8079614884378
+12
+24.753452885392075
+22
+-107.0270673310353
+32
+210.547241243593
+13
+24.753452885392075
+23
+-107.0270673310353
+33
+210.547241243593
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.83650612558201
+20
+-105.93642313293635
+30
+208.2308772479665
+11
+26.513086369855444
+21
+-107.83143644115255
+31
+208.63792939219388
+12
+24.753452885392075
+22
+-107.0270673310353
+32
+210.547241243593
+13
+24.753452885392075
+23
+-107.0270673310353
+33
+210.547241243593
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.83650612558201
+20
+-105.93642313293635
+30
+208.2308772479665
+11
+24.753452885392075
+21
+-107.0270673310353
+31
+210.547241243593
+12
+24.947548003491605
+22
+-104.27870479669217
+32
+211.3604328590798
+13
+24.947548003491605
+23
+-104.27870479669217
+33
+211.3604328590798
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.83650612558201
+20
+-105.93642313293635
+30
+208.2308772479665
+11
+24.947548003491605
+21
+-104.27870479669217
+31
+211.3604328590798
+12
+24.811559731092725
+22
+-103.49684828647878
+32
+208.94519595846532
+13
+24.811559731092725
+23
+-103.49684828647878
+33
+208.94519595846532
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.811559731092725
+20
+-103.49684828647878
+30
+208.94519595846532
+11
+24.947548003491605
+21
+-104.27870479669217
+31
+211.3604328590798
+12
+25.517055936222484
+22
+-102.30185514557857
+32
+212.44012498154873
+13
+25.517055936222484
+23
+-102.30185514557857
+33
+212.44012498154873
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.811559731092725
+20
+-103.49684828647878
+30
+208.94519595846532
+11
+25.517055936222484
+21
+-102.30185514557857
+31
+212.44012498154873
+12
+25.38319723408489
+22
+-101.47071429503262
+32
+210.03857817547157
+13
+25.38319723408489
+23
+-101.47071429503262
+33
+210.03857817547157
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.20610937774056
+20
+-101.42051728173188
+30
+213.3555359695767
+11
+25.38319723408489
+21
+-101.47071429503262
+31
+210.03857817547157
+12
+25.517055936222484
+22
+-102.30185514557857
+32
+212.44012498154873
+13
+25.517055936222484
+23
+-102.30185514557857
+33
+212.44012498154873
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.246571212704872
+20
+-100.63561852828826
+30
+210.97680598772692
+11
+25.38319723408489
+21
+-101.47071429503262
+31
+210.03857817547157
+12
+27.20610937774056
+22
+-101.42051728173188
+32
+213.3555359695767
+13
+27.20610937774056
+23
+-101.42051728173188
+33
+213.3555359695767
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.458571615361194
+20
+-100.78590534387074
+30
+214.34365657081088
+11
+27.246571212704872
+21
+-100.63561852828826
+31
+210.97680598772692
+12
+27.20610937774056
+22
+-101.42051728173188
+32
+213.3555359695767
+13
+27.20610937774056
+23
+-101.42051728173188
+33
+213.3555359695767
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.458571615361194
+20
+-100.78590534387074
+30
+214.34365657081088
+11
+30.419022453365997
+21
+-100.534311828716
+31
+211.9025606027379
+12
+27.246571212704872
+22
+-100.63561852828826
+32
+210.97680598772692
+13
+27.246571212704872
+23
+-100.63561852828826
+33
+210.97680598772692
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.83425935398055
+20
+-100.80963484106778
+30
+214.27459764948057
+11
+30.419022453365997
+21
+-100.534311828716
+31
+211.9025606027379
+12
+30.458571615361194
+22
+-100.78590534387074
+32
+214.34365657081088
+13
+30.458571615361194
+23
+-100.78590534387074
+33
+214.34365657081088
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.723855225052077
+20
+-105.18012146586153
+30
+218.59640838258593
+11
+31.794724842152878
+21
+-108.10462988324473
+31
+217.27607482059145
+12
+32.18139395673674
+22
+-105.8880514655757
+32
+218.65360255531687
+13
+32.18139395673674
+23
+-105.8880514655757
+33
+218.65360255531687
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.723855225052077
+20
+-105.18012146586153
+30
+218.59640838258593
+11
+30.38038596433991
+21
+-106.60206595175059
+31
+218.15376199256235
+12
+31.794724842152878
+22
+-108.10462988324473
+32
+217.27607482059145
+13
+31.794724842152878
+23
+-108.10462988324473
+33
+217.27607482059145
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.723855225052077
+20
+-105.18012146586153
+30
+218.59640838258593
+11
+29.50665370856904
+21
+-105.53575969949527
+31
+218.498448150567
+12
+29.145843661443593
+22
+-106.56129989246314
+32
+218.39075274021016
+13
+29.145843661443593
+23
+-106.56129989246314
+33
+218.39075274021016
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.723855225052077
+20
+-105.18012146586153
+30
+218.59640838258593
+11
+29.145843661443593
+21
+-106.56129989246314
+31
+218.39075274021016
+12
+30.38038596433991
+22
+-106.60206595175059
+32
+218.15376199256235
+13
+30.38038596433991
+23
+-106.60206595175059
+33
+218.15376199256235
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.233779140969677
+20
+-106.62397010300947
+30
+218.73422200092253
+11
+27.78687361042392
+21
+-108.50742288694993
+31
+218.34785711066135
+12
+29.63594904586104
+22
+-108.12166644533504
+32
+217.58638363009206
+13
+29.63594904586104
+23
+-108.12166644533504
+33
+217.58638363009206
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.145843661443593
+20
+-106.56129989246314
+30
+218.39075274021016
+11
+28.233779140969677
+21
+-106.62397010300947
+31
+218.73422200092253
+12
+29.63594904586104
+22
+-108.12166644533504
+32
+217.58638363009206
+13
+29.63594904586104
+23
+-108.12166644533504
+33
+217.58638363009206
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.794724842152878
+20
+-108.10462988324473
+30
+217.27607482059145
+11
+29.63594904586104
+21
+-108.12166644533504
+31
+217.58638363009206
+12
+31.17319455018215
+22
+-109.41370714528576
+32
+216.96454911379828
+13
+31.17319455018215
+23
+-109.41370714528576
+33
+216.96454911379828
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.63594904586104
+20
+-108.12166644533504
+30
+217.58638363009206
+11
+28.844965805957038
+21
+-109.75261304115266
+31
+218.03846097412938
+12
+31.17319455018215
+22
+-109.41370714528576
+32
+216.96454911379828
+13
+31.17319455018215
+23
+-109.41370714528576
+33
+216.96454911379828
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.78687361042392
+20
+-108.50742288694993
+30
+218.34785711066135
+11
+27.503032317027614
+21
+-109.55273766091534
+31
+218.2687587866707
+12
+28.844965805957038
+22
+-109.75261304115266
+32
+218.03846097412938
+13
+28.844965805957038
+23
+-109.75261304115266
+33
+218.03846097412938
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.63594904586104
+20
+-108.12166644533504
+30
+217.58638363009206
+11
+27.78687361042392
+21
+-108.50742288694993
+31
+218.34785711066135
+12
+28.844965805957038
+22
+-109.75261304115266
+32
+218.03846097412938
+13
+28.844965805957038
+23
+-109.75261304115266
+33
+218.03846097412938
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.31675913032199
+20
+-105.64132553959021
+30
+218.70440801726485
+11
+32.18139395673674
+21
+-105.8880514655757
+31
+218.65360255531687
+12
+31.794724842152878
+22
+-108.10462988324473
+32
+217.27607482059145
+13
+31.794724842152878
+23
+-108.10462988324473
+33
+217.27607482059145
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.31675913032199
+20
+-105.64132553959021
+30
+218.70440801726485
+11
+31.794724842152878
+21
+-108.10462988324473
+31
+217.27607482059145
+12
+32.85403393497817
+22
+-107.9248333083281
+32
+217.46621502249147
+13
+32.85403393497817
+23
+-107.9248333083281
+33
+217.46621502249147
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.443983498022796
+20
+-104.03319576800088
+30
+219.19451340168254
+11
+28.233779140969677
+21
+-106.62397010300947
+31
+218.73422200092253
+12
+29.145843661443593
+22
+-106.56129989246314
+32
+218.39075274021016
+13
+29.145843661443593
+23
+-106.56129989246314
+33
+218.39075274021016
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.443983498022796
+20
+-104.03319576800088
+30
+219.19451340168254
+11
+29.145843661443593
+21
+-106.56129989246314
+31
+218.39075274021016
+12
+29.50665370856904
+22
+-105.53575969949527
+32
+218.498448150567
+13
+29.50665370856904
+23
+-105.53575969949527
+33
+218.498448150567
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.443983498022796
+20
+-104.03319576800088
+30
+219.19451340168254
+11
+29.50665370856904
+21
+-105.53575969949527
+31
+218.498448150567
+12
+31.639570437402472
+22
+-104.07669984619567
+32
+218.92344952985405
+13
+31.639570437402472
+23
+-104.07669984619567
+33
+218.92344952985405
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.639570437402472
+20
+-104.07669984619567
+30
+218.92344952985405
+11
+29.50665370856904
+21
+-105.53575969949527
+31
+218.498448150567
+12
+30.723855225052077
+22
+-105.18012146586153
+32
+218.59640838258593
+13
+30.723855225052077
+23
+-105.18012146586153
+33
+218.59640838258593
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.639570437402472
+20
+-104.07669984619567
+30
+218.92344952985405
+11
+30.723855225052077
+21
+-105.18012146586153
+31
+218.59640838258593
+12
+33.31675913032199
+22
+-105.64132553959021
+32
+218.70440801726485
+13
+33.31675913032199
+23
+-105.64132553959021
+33
+218.70440801726485
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.723855225052077
+20
+-105.18012146586153
+30
+218.59640838258593
+11
+32.18139395673674
+21
+-105.8880514655757
+31
+218.65360255531687
+12
+33.31675913032199
+22
+-105.64132553959021
+32
+218.70440801726485
+13
+33.31675913032199
+23
+-105.64132553959021
+33
+218.70440801726485
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.85403393497817
+20
+-107.9248333083281
+30
+217.46621502249147
+11
+31.794724842152878
+21
+-108.10462988324473
+31
+217.27607482059145
+12
+31.17319455018215
+22
+-109.41370714528576
+32
+216.96454911379828
+13
+31.17319455018215
+23
+-109.41370714528576
+33
+216.96454911379828
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.85403393497817
+20
+-107.9248333083281
+30
+217.46621502249147
+11
+31.17319455018215
+21
+-109.41370714528576
+31
+216.96454911379828
+12
+32.30612592918311
+22
+-110.2168593581113
+32
+216.47322683208833
+13
+32.30612592918311
+23
+-110.2168593581113
+33
+216.47322683208833
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.17319455018215
+20
+-109.41370714528576
+30
+216.96454911379828
+11
+30.686435633318155
+21
+-110.41703896267154
+31
+216.42394249175592
+12
+32.30612592918311
+22
+-110.2168593581113
+32
+216.47322683208833
+13
+32.30612592918311
+23
+-110.2168593581113
+33
+216.47322683208833
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.17319455018215
+20
+-109.41370714528576
+30
+216.96454911379828
+11
+28.067368436266808
+21
+-110.72704354784955
+31
+217.45617561983042
+12
+30.686435633318155
+22
+-110.41703896267154
+32
+216.42394249175592
+13
+30.686435633318155
+23
+-110.41703896267154
+33
+216.42394249175592
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.17319455018215
+20
+-109.41370714528576
+30
+216.96454911379828
+11
+28.844965805957038
+21
+-109.75261304115266
+31
+218.03846097412938
+12
+28.067368436266808
+22
+-110.72704354784955
+32
+217.45617561983042
+13
+28.067368436266808
+23
+-110.72704354784955
+33
+217.45617561983042
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.844965805957038
+20
+-109.75261304115266
+30
+218.03846097412938
+11
+25.81428309983256
+21
+-110.64551142927485
+31
+217.57451888149282
+12
+28.067368436266808
+22
+-110.72704354784955
+32
+217.45617561983042
+13
+28.067368436266808
+23
+-110.72704354784955
+33
+217.45617561983042
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.503032317027614
+20
+-109.55273766091534
+30
+218.2687587866707
+11
+25.81428309983256
+21
+-110.64551142927485
+31
+217.57451888149282
+12
+28.844965805957038
+22
+-109.75261304115266
+32
+218.03846097412938
+13
+28.844965805957038
+23
+-109.75261304115266
+33
+218.03846097412938
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.503032317027614
+20
+-109.55273766091534
+30
+218.2687587866707
+11
+25.478723671519464
+21
+-110.20681995545137
+31
+217.96179644472267
+12
+25.81428309983256
+22
+-110.64551142927485
+32
+217.57451888149282
+13
+25.81428309983256
+23
+-110.64551142927485
+33
+217.57451888149282
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.78687361042392
+20
+-108.50742288694993
+30
+218.34785711066135
+11
+25.478723671519464
+21
+-110.20681995545137
+31
+217.96179644472267
+12
+27.503032317027614
+22
+-109.55273766091534
+32
+218.2687587866707
+13
+27.503032317027614
+23
+-109.55273766091534
+33
+218.2687587866707
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.78687361042392
+20
+-108.50742288694993
+30
+218.34785711066135
+11
+26.054011866388088
+21
+-108.50894400856517
+31
+218.42300051845228
+12
+25.478723671519464
+22
+-110.20681995545137
+32
+217.96179644472267
+13
+25.478723671519464
+23
+-110.20681995545137
+33
+217.96179644472267
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.233779140969677
+20
+-106.62397010300947
+30
+218.73422200092253
+11
+26.054011866388088
+21
+-108.50894400856517
+31
+218.42300051845228
+12
+27.78687361042392
+22
+-108.50742288694993
+32
+218.34785711066135
+13
+27.78687361042392
+23
+-108.50742288694993
+33
+218.34785711066135
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.233779140969677
+20
+-106.62397010300947
+30
+218.73422200092253
+11
+27.112712510567288
+21
+-106.72193033502835
+31
+219.04240124016204
+12
+26.054011866388088
+22
+-108.50894400856517
+32
+218.42300051845228
+13
+26.054011866388088
+23
+-108.50894400856517
+33
+218.42300051845228
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.443983498022796
+20
+-104.03319576800088
+30
+219.19451340168254
+11
+27.112712510567288
+21
+-106.72193033502835
+31
+219.04240124016204
+12
+28.233779140969677
+22
+-106.62397010300947
+32
+218.73422200092253
+13
+28.233779140969677
+23
+-106.62397010300947
+33
+218.73422200092253
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.789307405008234
+20
+-103.39310779232484
+30
+219.6432442781669
+11
+27.112712510567288
+21
+-106.72193033502835
+31
+219.04240124016204
+12
+29.443983498022796
+22
+-104.03319576800088
+32
+219.19451340168254
+13
+29.443983498022796
+23
+-104.03319576800088
+33
+219.19451340168254
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.24196389735671
+20
+-103.06241595318018
+30
+218.87690320842933
+11
+27.789307405008234
+21
+-103.39310779232484
+31
+219.6432442781669
+12
+29.443983498022796
+22
+-104.03319576800088
+32
+219.19451340168254
+13
+29.443983498022796
+23
+-104.03319576800088
+33
+219.19451340168254
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.17896016215239
+20
+-102.9014812862919
+30
+218.42756388329929
+11
+30.24196389735671
+21
+-103.06241595318018
+31
+218.87690320842933
+12
+29.443983498022796
+22
+-104.03319576800088
+32
+219.19451340168254
+13
+29.443983498022796
+23
+-104.03319576800088
+33
+219.19451340168254
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.17896016215239
+20
+-102.9014812862919
+30
+218.42756388329929
+11
+29.443983498022796
+21
+-104.03319576800088
+31
+219.19451340168254
+12
+31.639570437402472
+22
+-104.07669984619567
+32
+218.92344952985405
+13
+31.639570437402472
+23
+-104.07669984619567
+33
+218.92344952985405
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.17896016215239
+20
+-102.9014812862919
+30
+218.42756388329929
+11
+31.639570437402472
+21
+-104.07669984619567
+31
+218.92344952985405
+12
+33.31675913032199
+22
+-105.64132553959021
+32
+218.70440801726485
+13
+33.31675913032199
+23
+-105.64132553959021
+33
+218.70440801726485
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.35233872595015
+20
+-102.39038442358273
+30
+210.8818879989383
+11
+33.68791280443083
+21
+-101.33746404154147
+31
+211.44683256682353
+12
+35.24462866542647
+22
+-102.81386468125503
+32
+213.18091120815137
+13
+35.24462866542647
+23
+-102.81386468125503
+33
+213.18091120815137
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.49290501336215
+20
+-102.13361909493672
+30
+209.63456827447413
+11
+34.35233872595015
+21
+-102.39038442358273
+31
+210.8818879989383
+12
+34.48680587673383
+22
+-103.82571477968533
+32
+210.37079113623065
+13
+34.48680587673383
+23
+-103.82571477968533
+33
+210.37079113623065
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.82055460927623
+20
+-103.16676489598046
+30
+209.11282356046044
+11
+33.49290501336215
+21
+-102.13361909493672
+31
+209.63456827447413
+12
+34.48680587673383
+22
+-103.82571477968533
+32
+210.37079113623065
+13
+34.48680587673383
+23
+-103.82571477968533
+33
+210.37079113623065
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.87441696462183
+20
+-101.13454641807351
+30
+210.3096420473001
+11
+33.68791280443083
+21
+-101.33746404154147
+31
+211.44683256682353
+12
+34.35233872595015
+22
+-102.39038442358273
+32
+210.8818879989383
+13
+34.35233872595015
+23
+-102.39038442358273
+33
+210.8818879989383
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.49290501336215
+20
+-102.13361909493672
+30
+209.63456827447413
+11
+32.87441696462183
+21
+-101.13454641807351
+31
+210.3096420473001
+12
+34.35233872595015
+22
+-102.39038442358273
+32
+210.8818879989383
+13
+34.35233872595015
+23
+-102.39038442358273
+33
+210.8818879989383
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.09619649611799
+20
+-109.28927939716088
+30
+211.1763771436388
+11
+33.03443895854089
+21
+-111.01636087905956
+31
+213.2149843323297
+12
+30.9605417483772
+22
+-111.30081062110186
+32
+213.186083021641
+13
+30.9605417483772
+23
+-111.30081062110186
+33
+213.186083021641
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.09619649611799
+20
+-109.28927939716088
+30
+211.1763771436388
+11
+30.9605417483772
+21
+-111.30081062110186
+31
+213.186083021641
+12
+30.896350416215753
+22
+-110.22598608780119
+32
+211.5429674529021
+13
+30.896350416215753
+23
+-110.22598608780119
+33
+211.5429674529021
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.863435588657346
+20
+-107.57193309360007
+30
+210.87124014763046
+11
+34.70432626770743
+21
+-110.46206416248079
+31
+213.03001594392137
+12
+33.03443895854089
+22
+-111.01636087905956
+32
+213.2149843323297
+13
+33.03443895854089
+23
+-111.01636087905956
+33
+213.2149843323297
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.863435588657346
+20
+-107.57193309360007
+30
+210.87124014763046
+11
+33.03443895854089
+21
+-111.01636087905956
+31
+213.2149843323297
+12
+33.09619649611799
+22
+-109.28927939716088
+32
+211.1763771436388
+13
+33.09619649611799
+23
+-109.28927939716088
+33
+211.1763771436388
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.09619649611799
+20
+-109.28927939716088
+30
+211.1763771436388
+11
+30.896350416215753
+21
+-110.22598608780119
+31
+211.5429674529021
+12
+32.37944399103575
+22
+-108.02674845654451
+32
+209.65738509870087
+13
+32.37944399103575
+23
+-108.02674845654451
+33
+209.65738509870087
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.37944399103575
+20
+-108.02674845654451
+30
+209.65738509870087
+11
+30.896350416215753
+21
+-110.22598608780119
+31
+211.5429674529021
+12
+30.738762216881035
+22
+-108.68235187269582
+32
+209.82044933585018
+13
+30.738762216881035
+23
+-108.68235187269582
+33
+209.82044933585018
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.067368436266808
+20
+-110.72704354784955
+30
+217.45617561983042
+11
+25.81428309983256
+21
+-110.64551142927485
+31
+217.57451888149282
+12
+27.64875576776376
+22
+-111.63089401160111
+32
+216.19759959541386
+13
+27.64875576776376
+23
+-111.63089401160111
+33
+216.19759959541386
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.64875576776376
+20
+-111.63089401160111
+30
+216.19759959541386
+11
+25.81428309983256
+21
+-110.64551142927485
+31
+217.57451888149282
+12
+25.17115288092599
+22
+-111.22688411060412
+32
+216.64785159351266
+13
+25.17115288092599
+23
+-111.22688411060412
+33
+216.64785159351266
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.686435633318155
+20
+-110.41703896267154
+30
+216.42394249175592
+11
+28.067368436266808
+21
+-110.72704354784955
+31
+217.45617561983042
+12
+30.26052158106215
+22
+-111.49186349597173
+32
+215.74491380273034
+13
+30.26052158106215
+23
+-111.49186349597173
+33
+215.74491380273034
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.26052158106215
+20
+-111.49186349597173
+30
+215.74491380273034
+11
+28.067368436266808
+21
+-110.72704354784955
+31
+217.45617561983042
+12
+27.64875576776376
+22
+-111.63089401160111
+32
+216.19759959541386
+13
+27.64875576776376
+23
+-111.63089401160111
+33
+216.19759959541386
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.789307405008234
+20
+-103.39310779232484
+30
+219.6432442781669
+11
+25.472030736412563
+21
+-105.8229474604453
+31
+219.35788186315474
+12
+27.112712510567288
+22
+-106.72193033502835
+32
+219.04240124016204
+13
+27.112712510567288
+23
+-106.72193033502835
+33
+219.04240124016204
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.584883310092902
+20
+-102.78374647327567
+30
+219.3359777118968
+11
+25.472030736412563
+21
+-105.8229474604453
+31
+219.35788186315474
+12
+27.789307405008234
+22
+-103.39310779232484
+32
+219.6432442781669
+13
+27.789307405008234
+23
+-103.39310779232484
+33
+219.6432442781669
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.112712510567288
+20
+-106.72193033502835
+30
+219.04240124016204
+11
+24.779007728527446
+21
+-108.06051735640416
+31
+218.34694443769226
+12
+26.054011866388088
+22
+-108.50894400856517
+32
+218.42300051845228
+13
+26.054011866388088
+23
+-108.50894400856517
+33
+218.42300051845228
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.472030736412563
+20
+-105.8229474604453
+30
+219.35788186315474
+11
+24.779007728527446
+21
+-108.06051735640416
+31
+218.34694443769226
+12
+27.112712510567288
+22
+-106.72193033502835
+32
+219.04240124016204
+13
+27.112712510567288
+23
+-106.72193033502835
+33
+219.04240124016204
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.054011866388088
+20
+-108.50894400856517
+30
+218.42300051845228
+11
+24.30563468187721
+21
+-109.73679337635433
+31
+217.3548689202585
+12
+25.478723671519464
+22
+-110.20681995545137
+32
+217.96179644472267
+13
+25.478723671519464
+23
+-110.20681995545137
+33
+217.96179644472267
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.779007728527446
+20
+-108.06051735640416
+30
+218.34694443769226
+11
+24.30563468187721
+21
+-109.73679337635433
+31
+217.3548689202585
+12
+26.054011866388088
+22
+-108.50894400856517
+32
+218.42300051845228
+13
+26.054011866388088
+23
+-108.50894400856517
+33
+218.42300051845228
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.373099230754477
+20
+-101.79562587204154
+30
+218.5957999339402
+11
+26.584883310092902
+21
+-102.78374647327567
+31
+219.3359777118968
+12
+27.789307405008234
+22
+-103.39310779232484
+32
+219.6432442781669
+13
+27.789307405008234
+23
+-103.39310779232484
+33
+219.6432442781669
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.373099230754477
+20
+-101.79562587204154
+30
+218.5957999339402
+11
+27.789307405008234
+21
+-103.39310779232484
+31
+219.6432442781669
+12
+30.24196389735671
+22
+-103.06241595318018
+32
+218.87690320842933
+13
+30.24196389735671
+23
+-103.06241595318018
+33
+218.87690320842933
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.944707433411594
+20
+-100.84735865712543
+30
+216.89275217356303
+11
+29.373099230754477
+21
+-101.79562587204154
+31
+218.5957999339402
+12
+30.24196389735671
+22
+-103.06241595318018
+32
+218.87690320842933
+13
+30.24196389735671
+23
+-103.06241595318018
+33
+218.87690320842933
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.944707433411594
+20
+-100.84735865712543
+30
+216.89275217356303
+11
+30.24196389735671
+21
+-103.06241595318018
+31
+218.87690320842933
+12
+32.17896016215239
+22
+-102.9014812862919
+32
+218.42756388329929
+13
+32.17896016215239
+23
+-102.9014812862919
+33
+218.42756388329929
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.875923436069506
+20
+-102.16708377047301
+30
+217.14799638059276
+11
+32.17896016215239
+21
+-102.9014812862919
+31
+218.42756388329929
+12
+34.44360602286215
+22
+-105.09493865541016
+32
+217.97092317441562
+13
+34.44360602286215
+23
+-105.09493865541016
+33
+217.97092317441562
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.705832739155106
+20
+-104.51721666595682
+30
+216.4099481728975
+11
+33.875923436069506
+21
+-102.16708377047301
+31
+217.14799638059276
+12
+34.44360602286215
+22
+-105.09493865541016
+32
+217.97092317441562
+13
+34.44360602286215
+23
+-105.09493865541016
+33
+217.97092317441562
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.705832739155106
+20
+-104.51721666595682
+30
+216.4099481728975
+11
+34.44360602286215
+21
+-105.09493865541016
+31
+217.97092317441562
+12
+34.310659993693676
+22
+-107.40917308077526
+32
+217.31471130961765
+13
+34.310659993693676
+23
+-107.40917308077526
+33
+217.31471130961765
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.674193409558946
+20
+-106.68633608923193
+30
+216.0573521824936
+11
+35.705832739155106
+21
+-104.51721666595682
+31
+216.4099481728975
+12
+34.310659993693676
+22
+-107.40917308077526
+32
+217.31471130961765
+13
+34.310659993693676
+23
+-107.40917308077526
+33
+217.31471130961765
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.58719990333703
+20
+-111.74984572190931
+30
+214.65487805327788
+11
+33.97814280861095
+21
+-111.59560399012835
+31
+216.04001139607894
+12
+31.885687914741833
+22
+-111.23935730784858
+32
+215.85139231579433
+13
+31.885687914741833
+23
+-111.23935730784858
+33
+215.85139231579433
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.58719990333703
+20
+-111.74984572190931
+30
+214.65487805327788
+11
+31.885687914741833
+21
+-111.23935730784858
+31
+215.85139231579433
+12
+32.690057024859605
+22
+-111.80430187573363
+32
+214.56726144824233
+13
+32.690057024859605
+23
+-111.80430187573363
+33
+214.56726144824233
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.690057024859605
+20
+-111.80430187573363
+30
+214.56726144824233
+11
+31.885687914741833
+21
+-111.23935730784858
+31
+215.85139231579433
+12
+30.26052158106215
+22
+-111.49186349597173
+32
+215.74491380273034
+13
+30.26052158106215
+23
+-111.49186349597173
+33
+215.74491380273034
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.690057024859605
+20
+-111.80430187573363
+30
+214.56726144824233
+11
+30.26052158106215
+21
+-111.49186349597173
+31
+215.74491380273034
+12
+30.51637423673879
+22
+-112.01269553701584
+32
+214.64027528577176
+13
+30.51637423673879
+23
+-112.01269553701584
+33
+214.64027528577176
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.674193409558946
+20
+-106.68633608923193
+30
+216.0573521824936
+11
+34.310659993693676
+21
+-107.40917308077526
+31
+217.31471130961765
+12
+34.51966210362219
+22
+-110.58892570518927
+32
+216.73759776881013
+13
+34.51966210362219
+23
+-110.58892570518927
+33
+216.73759776881013
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.41499428632888
+20
+-110.06413874794488
+30
+215.38897134477392
+11
+35.674193409558946
+21
+-106.68633608923193
+31
+216.0573521824936
+12
+34.51966210362219
+22
+-110.58892570518927
+32
+216.73759776881013
+13
+34.51966210362219
+23
+-110.58892570518927
+33
+216.73759776881013
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+35.41499428632888
+20
+-110.06413874794488
+30
+215.38897134477392
+11
+34.51966210362219
+21
+-110.58892570518927
+31
+216.73759776881013
+12
+33.97814280861095
+22
+-111.59560399012835
+32
+216.04001139607894
+13
+33.97814280861095
+23
+-111.59560399012835
+33
+216.04001139607894
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.58719990333703
+20
+-111.74984572190931
+30
+214.65487805327788
+11
+35.41499428632888
+21
+-110.06413874794488
+31
+215.38897134477392
+12
+33.97814280861095
+22
+-111.59560399012835
+32
+216.04001139607894
+13
+33.97814280861095
+23
+-111.59560399012835
+33
+216.04001139607894
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.51637423673879
+20
+-112.01269553701584
+30
+214.64027528577176
+11
+30.26052158106215
+21
+-111.49186349597173
+31
+215.74491380273034
+12
+27.64875576776376
+22
+-111.63089401160111
+32
+216.19759959541386
+13
+27.64875576776376
+23
+-111.63089401160111
+33
+216.19759959541386
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.51637423673879
+20
+-112.01269553701584
+30
+214.64027528577176
+11
+27.64875576776376
+21
+-111.63089401160111
+31
+216.19759959541386
+12
+28.107221822585046
+22
+-111.77053297587612
+32
+214.80486064453652
+13
+28.107221822585046
+23
+-111.77053297587612
+33
+214.80486064453652
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.107221822585046
+20
+-111.77053297587612
+30
+214.80486064453652
+11
+27.64875576776376
+21
+-111.63089401160111
+31
+216.19759959541386
+12
+25.17115288092599
+22
+-111.22688411060412
+32
+216.64785159351266
+13
+25.17115288092599
+23
+-111.22688411060412
+33
+216.64785159351266
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.107221822585046
+20
+-111.77053297587612
+30
+214.80486064453652
+11
+25.17115288092599
+21
+-111.22688411060412
+31
+216.64785159351266
+12
+25.517360160545525
+22
+-111.03096364656595
+32
+215.1315975674814
+13
+25.517360160545525
+23
+-111.03096364656595
+33
+215.1315975674814
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.517360160545525
+20
+-111.03096364656595
+30
+215.1315975674814
+11
+25.17115288092599
+21
+-111.22688411060412
+31
+216.64785159351266
+12
+24.30563468187721
+22
+-109.73679337635433
+32
+217.3548689202585
+13
+24.30563468187721
+23
+-109.73679337635433
+33
+217.3548689202585
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.517360160545525
+20
+-111.03096364656595
+30
+215.1315975674814
+11
+24.30563468187721
+21
+-109.73679337635433
+31
+217.3548689202585
+12
+24.267910865820244
+22
+-108.80738806946655
+32
+215.19396355370515
+13
+24.267910865820244
+23
+-108.80738806946655
+33
+215.19396355370515
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.267910865820244
+20
+-108.80738806946655
+30
+215.19396355370515
+11
+24.30563468187721
+21
+-109.73679337635433
+31
+217.3548689202585
+12
+24.779007728527446
+22
+-108.06051735640416
+32
+218.34694443769226
+13
+24.779007728527446
+23
+-108.06051735640416
+33
+218.34694443769226
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.267910865820244
+20
+-108.80738806946655
+30
+215.19396355370515
+11
+24.779007728527446
+21
+-108.06051735640416
+31
+218.34694443769226
+12
+24.728506490902813
+22
+-106.39123849588306
+32
+215.70384351912125
+13
+24.728506490902813
+23
+-106.39123849588306
+33
+215.70384351912125
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.728506490902813
+20
+-106.39123849588306
+30
+215.70384351912125
+11
+24.779007728527446
+21
+-108.06051735640416
+31
+218.34694443769226
+12
+25.472030736412563
+22
+-105.8229474604453
+32
+219.35788186315474
+13
+25.472030736412563
+23
+-105.8229474604453
+33
+219.35788186315474
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.728506490902813
+20
+-106.39123849588306
+30
+215.70384351912125
+11
+25.472030736412563
+21
+-105.8229474604453
+31
+219.35788186315474
+12
+25.60436831693497
+22
+-103.97052555745397
+32
+216.3606638325653
+13
+25.60436831693497
+23
+-103.97052555745397
+33
+216.3606638325653
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.60436831693497
+20
+-103.97052555745397
+30
+216.3606638325653
+11
+25.472030736412563
+21
+-105.8229474604453
+31
+219.35788186315474
+12
+26.584883310092902
+22
+-102.78374647327567
+32
+219.3359777118968
+13
+26.584883310092902
+23
+-102.78374647327567
+33
+219.3359777118968
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.60436831693497
+20
+-103.97052555745397
+30
+216.3606638325653
+11
+26.584883310092902
+21
+-102.78374647327567
+31
+219.3359777118968
+12
+26.87359219265784
+22
+-102.14639651650631
+32
+216.91161408159104
+13
+26.87359219265784
+23
+-102.14639651650631
+33
+216.91161408159104
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.373099230754477
+20
+-101.79562587204154
+30
+218.5957999339402
+11
+26.87359219265784
+21
+-102.14639651650631
+31
+216.91161408159104
+12
+26.584883310092902
+22
+-102.78374647327567
+32
+219.3359777118968
+13
+26.584883310092902
+23
+-102.78374647327567
+33
+219.3359777118968
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.00436470106248
+20
+-101.07552689940549
+30
+217.1002331618761
+11
+26.87359219265784
+21
+-102.14639651650631
+31
+216.91161408159104
+12
+29.373099230754477
+22
+-101.79562587204154
+32
+218.5957999339402
+13
+29.373099230754477
+23
+-101.79562587204154
+33
+218.5957999339402
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.944707433411594
+20
+-100.84735865712543
+30
+216.89275217356303
+11
+30.00436470106248
+21
+-101.07552689940549
+31
+217.1002331618761
+12
+29.373099230754477
+22
+-101.79562587204154
+32
+218.5957999339402
+13
+29.373099230754477
+23
+-101.79562587204154
+33
+218.5957999339402
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.25014865374376
+20
+-100.74240126567642
+30
+216.00046223408626
+11
+30.00436470106248
+21
+-101.07552689940549
+31
+217.1002331618761
+12
+31.944707433411594
+22
+-100.84735865712543
+32
+216.89275217356303
+13
+31.944707433411594
+23
+-100.84735865712543
+33
+216.89275217356303
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.25014865374376
+20
+-100.74240126567642
+30
+216.00046223408626
+11
+31.944707433411594
+21
+-100.84735865712543
+31
+216.89275217356303
+12
+32.17896016215239
+22
+-102.9014812862919
+32
+218.42756388329929
+13
+32.17896016215239
+23
+-102.9014812862919
+33
+218.42756388329929
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.875923436069506
+20
+-102.16708377047301
+30
+217.14799638059276
+11
+32.25014865374376
+21
+-100.74240126567642
+31
+216.00046223408626
+12
+32.17896016215239
+22
+-102.9014812862919
+32
+218.42756388329929
+13
+32.17896016215239
+23
+-102.9014812862919
+33
+218.42756388329929
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.27628264519016
+20
+-101.68701778871534
+30
+214.95758125470542
+11
+33.875923436069506
+21
+-102.16708377047301
+31
+217.14799638059276
+12
+35.705832739155106
+22
+-104.51721666595682
+32
+216.4099481728975
+13
+35.705832739155106
+23
+-104.51721666595682
+33
+216.4099481728975
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.27628264519016
+20
+-101.68701778871534
+30
+214.95758125470542
+11
+35.705832739155106
+21
+-104.51721666595682
+31
+216.4099481728975
+12
+35.874068789796254
+22
+-103.9899959141283
+32
+215.3199124234452
+13
+35.874068789796254
+23
+-103.9899959141283
+33
+215.3199124234452
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.684654237882487
+20
+-100.92006827032921
+30
+206.1000900893955
+11
+31.64352535360199
+21
+-101.85069047450877
+31
+206.7709047216986
+12
+26.971248200353674
+22
+-101.48257904362997
+32
+205.34378842231806
+13
+26.971248200353674
+23
+-101.48257904362997
+33
+205.34378842231806
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.684654237882487
+20
+-100.92006827032921
+30
+206.1000900893955
+11
+26.971248200353674
+21
+-101.48257904362997
+31
+205.34378842231806
+12
+25.83831682135272
+22
+-101.08647897503202
+32
+205.92090196312526
+13
+25.83831682135272
+23
+-101.08647897503202
+33
+205.92090196312526
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.39161296395736
+20
+-101.29821910386838
+30
+207.64615809908472
+11
+32.07187320044231
+21
+-102.24009760799989
+31
+206.3179147046923
+12
+31.64352535360199
+22
+-101.85069047450877
+32
+206.7709047216986
+13
+31.64352535360199
+23
+-101.85069047450877
+33
+206.7709047216986
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.98515461820841
+20
+-102.16404152724017
+30
+207.3121197923869
+11
+32.07187320044231
+21
+-102.24009760799989
+31
+206.3179147046923
+12
+32.39161296395736
+22
+-101.29821910386838
+32
+207.64615809908472
+13
+32.39161296395736
+23
+-101.29821910386838
+33
+207.64615809908472
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.27447194941943
+20
+-103.07641027203688
+30
+206.85121994298117
+11
+32.07187320044231
+21
+-102.24009760799989
+31
+206.3179147046923
+12
+32.98515461820841
+22
+-102.16404152724017
+32
+207.3121197923869
+13
+32.98515461820841
+23
+-102.16404152724017
+33
+207.3121197923869
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.07187320044231
+20
+-102.24009760799989
+30
+206.3179147046923
+11
+33.27447194941943
+21
+-103.07641027203688
+31
+206.85121994298117
+12
+32.32012024804295
+22
+-103.02317101550466
+32
+205.92242308474
+13
+32.32012024804295
+23
+-103.02317101550466
+33
+205.92242308474
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.823321928518634
+20
+-105.90204578443209
+30
+205.26408164968078
+11
+31.11812994771191
+21
+-106.36659632571413
+31
+205.45452607590357
+12
+30.329580502392233
+22
+-106.14572946718722
+32
+205.20171566345743
+13
+30.329580502392233
+23
+-106.14572946718722
+33
+205.20171566345743
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.41048952215335
+20
+-105.42471782158219
+30
+204.8901899566644
+11
+31.823321928518634
+21
+-105.90204578443209
+31
+205.26408164968078
+12
+30.329580502392233
+22
+-106.14572946718722
+32
+205.20171566345743
+13
+30.329580502392233
+23
+-106.14572946718722
+33
+205.20171566345743
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.329580502392233
+20
+-106.14572946718722
+30
+205.20171566345743
+11
+31.11812994771191
+21
+-106.36659632571413
+31
+205.45452607590357
+12
+30.313152388948076
+22
+-106.74839785112937
+32
+205.62884661300544
+13
+30.313152388948076
+23
+-106.74839785112937
+33
+205.62884661300544
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.27447194941943
+20
+-103.07641027203688
+30
+206.85121994298117
+11
+32.91153233203271
+21
+-104.83239306462349
+31
+205.97109897642605
+12
+31.96235244414791
+22
+-104.71830894348334
+32
+205.10193008550038
+13
+31.96235244414791
+23
+-104.71830894348334
+33
+205.10193008550038
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.32012024804295
+20
+-103.02317101550466
+30
+205.92242308474
+11
+33.27447194941943
+21
+-103.07641027203688
+31
+206.85121994298117
+12
+31.96235244414791
+22
+-104.71830894348334
+32
+205.10193008550038
+13
+31.96235244414791
+23
+-104.71830894348334
+33
+205.10193008550038
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.83425935398055
+20
+-100.80963484106778
+30
+214.27459764948057
+11
+32.34354552091703
+21
+-100.55347796106757
+31
+212.17879628805818
+12
+30.419022453365997
+22
+-100.534311828716
+32
+211.9025606027379
+13
+30.419022453365997
+23
+-100.534311828716
+33
+211.9025606027379
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.11839022153239
+20
+-101.49779025978413
+30
+213.70630661404192
+11
+32.34354552091703
+21
+-100.55347796106757
+31
+212.17879628805818
+12
+32.83425935398055
+22
+-100.80963484106778
+32
+214.27459764948057
+13
+32.83425935398055
+23
+-100.80963484106778
+33
+214.27459764948057
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+34.11839022153239
+20
+-101.49779025978413
+30
+213.70630661404192
+11
+33.68791280443083
+21
+-101.33746404154147
+31
+211.44683256682353
+12
+32.34354552091703
+22
+-100.55347796106757
+32
+212.17879628805818
+13
+32.34354552091703
+23
+-100.55347796106757
+33
+212.17879628805818
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.82055460927623
+20
+-103.16676489598046
+30
+209.11282356046044
+11
+34.48680587673383
+21
+-103.82571477968533
+31
+210.37079113623065
+12
+34.29849102077206
+22
+-105.48617113483742
+32
+209.41370141594635
+13
+34.29849102077206
+23
+-105.48617113483742
+33
+209.41370141594635
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.40893910020311
+20
+-105.15517507136953
+30
+208.1140551079197
+11
+33.82055460927623
+21
+-103.16676489598046
+31
+209.11282356046044
+12
+34.29849102077206
+22
+-105.48617113483742
+32
+209.41370141594635
+13
+34.29849102077206
+23
+-105.48617113483742
+33
+209.41370141594635
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.40893910020311
+20
+-105.15517507136953
+30
+208.1140551079197
+11
+34.29849102077206
+21
+-105.48617113483742
+31
+209.41370141594635
+12
+33.497772602530794
+22
+-106.69698394053661
+32
+209.11008554155214
+13
+33.497772602530794
+23
+-106.69698394053661
+33
+209.11008554155214
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.40893910020311
+20
+-105.15517507136953
+30
+208.1140551079197
+11
+33.497772602530794
+21
+-106.69698394053661
+31
+209.11008554155214
+12
+32.276007721202156
+22
+-106.49741278462201
+32
+207.8886248845466
+13
+32.276007721202156
+23
+-106.49741278462201
+33
+207.8886248845466
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.738762216881035
+20
+-108.68235187269582
+30
+209.82044933585018
+11
+29.193606880160882
+21
+-108.66044772143678
+31
+209.51227009661025
+12
+30.512723544862318
+22
+-107.4992234803928
+32
+208.35834723932024
+13
+30.512723544862318
+23
+-107.4992234803928
+33
+208.35834723932024
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.512723544862318
+20
+-107.4992234803928
+30
+208.35834723932024
+11
+29.193606880160882
+21
+-108.66044772143678
+31
+209.51227009661025
+12
+29.03906092405656
+22
+-107.76481131440673
+32
+208.21597025613724
+13
+29.03906092405656
+23
+-107.76481131440673
+33
+208.21597025613724
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.193606880160882
+20
+-108.66044772143678
+30
+209.51227009661025
+11
+26.513086369855444
+21
+-107.83143644115255
+31
+208.63792939219388
+12
+29.03906092405656
+22
+-107.76481131440673
+32
+208.21597025613724
+13
+29.03906092405656
+23
+-107.76481131440673
+33
+208.21597025613724
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.03906092405656
+20
+-107.76481131440673
+30
+208.21597025613724
+11
+26.513086369855444
+21
+-107.83143644115255
+31
+208.63792939219388
+12
+26.46532315113817
+22
+-107.00850964732906
+32
+207.192863857754
+13
+26.46532315113817
+23
+-107.00850964732906
+33
+207.192863857754
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.46532315113817
+20
+-107.00850964732906
+30
+207.192863857754
+11
+26.513086369855444
+21
+-107.83143644115255
+31
+208.63792939219388
+12
+24.83650612558201
+22
+-105.93642313293635
+32
+208.2308772479665
+13
+24.83650612558201
+23
+-105.93642313293635
+33
+208.2308772479665
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.46532315113817
+20
+-107.00850964732906
+30
+207.192863857754
+11
+24.83650612558201
+21
+-105.93642313293635
+31
+208.2308772479665
+12
+24.781137298788728
+22
+-105.13418359307943
+32
+206.71827391381206
+13
+24.781137298788728
+23
+-105.13418359307943
+33
+206.71827391381206
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.781137298788728
+20
+-105.13418359307943
+30
+206.71827391381206
+11
+24.83650612558201
+21
+-105.93642313293635
+31
+208.2308772479665
+12
+24.811559731092725
+22
+-103.49684828647878
+32
+208.94519595846532
+13
+24.811559731092725
+23
+-103.49684828647878
+33
+208.94519595846532
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.781137298788728
+20
+-105.13418359307943
+30
+206.71827391381206
+11
+24.811559731092725
+21
+-103.49684828647878
+31
+208.94519595846532
+12
+24.74584727731609
+22
+-102.90969534301111
+32
+207.3772237975174
+13
+24.74584727731609
+23
+-102.90969534301111
+33
+207.3772237975174
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.177574321239816
+20
+-144.38338040576173
+30
+206.00699744653457
+11
+2.1273773079382083
+21
+-146.10741964442968
+31
+207.05930937992935
+12
+3.0251432852292552
+22
+-144.43175207312518
+32
+206.132337867627
+13
+3.0251432852292552
+23
+-144.43175207312518
+33
+206.132337867627
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.0251432852292552
+20
+-144.43175207312518
+30
+206.132337867627
+11
+2.1273773079382083
+21
+-146.10741964442968
+31
+207.05930937992935
+12
+3.4446686267014033
+22
+-146.30029786523707
+32
+207.11163596349218
+13
+3.4446686267014033
+23
+-146.30029786523707
+33
+207.11163596349218
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.5414412617631732
+20
+-144.26016955493043
+30
+205.64192825888657
+11
+1.4599091431884523
+21
+-145.9516567910334
+31
+206.81836371608185
+12
+2.177574321239816
+22
+-144.38338040576173
+32
+206.00699744653457
+13
+2.177574321239816
+23
+-144.38338040576173
+33
+206.00699744653457
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.177574321239816
+20
+-144.38338040576173
+30
+206.00699744653457
+11
+1.4599091431884523
+21
+-145.9516567910334
+31
+206.81836371608185
+12
+2.1273773079382083
+22
+-146.10741964442968
+32
+207.05930937992935
+13
+2.1273773079382083
+23
+-146.10741964442968
+33
+207.05930937992935
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.1273773079382083
+20
+-146.10741964442968
+30
+207.05930937992935
+11
+2.27340498299741
+21
+-147.77548160765835
+31
+208.4532652280983
+12
+3.4446686267014033
+22
+-146.30029786523707
+32
+207.11163596349218
+13
+3.4446686267014033
+23
+-146.30029786523707
+33
+207.11163596349218
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.768971755062046
+20
+-147.99969493373894
+30
+208.86853142904772
+11
+3.4446686267014033
+21
+-146.30029786523707
+31
+207.11163596349218
+12
+2.27340498299741
+22
+-147.77548160765835
+32
+208.4532652280983
+13
+2.27340498299741
+23
+-147.77548160765835
+33
+208.4532652280983
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.4599091431884523
+20
+-145.9516567910334
+30
+206.81836371608185
+11
+1.3725967624759676
+21
+-147.52571343844255
+31
+208.32001497460666
+12
+2.1273773079382083
+22
+-146.10741964442968
+32
+207.05930937992935
+13
+2.1273773079382083
+23
+-146.10741964442968
+33
+207.05930937992935
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.1273773079382083
+20
+-146.10741964442968
+30
+207.05930937992935
+11
+1.3725967624759676
+21
+-147.52571343844255
+31
+208.32001497460666
+12
+2.27340498299741
+22
+-147.77548160765835
+32
+208.4532652280983
+13
+2.27340498299741
+23
+-147.77548160765835
+33
+208.4532652280983
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.768971755062046
+20
+-147.99969493373894
+30
+208.86853142904772
+11
+2.27340498299741
+21
+-147.77548160765835
+31
+208.4532652280983
+12
+2.3911397960138925
+22
+-148.92727489468845
+32
+210.22263389089855
+13
+2.3911397960138925
+23
+-148.92727489468845
+33
+210.22263389089855
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.768971755062046
+20
+-147.99969493373894
+30
+208.86853142904772
+11
+2.3911397960138925
+21
+-148.92727489468845
+31
+210.22263389089855
+12
+3.379260397247808
+22
+-148.95222128917771
+32
+210.67319011332089
+13
+3.379260397247808
+23
+-148.95222128917771
+33
+210.67319011332089
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.27340498299741
+20
+-147.77548160765835
+30
+208.4532652280983
+11
+1.3725967624759676
+21
+-147.52571343844255
+31
+208.32001497460666
+12
+1.2709858385806103
+22
+-148.72314037392835
+32
+210.02062894039977
+13
+1.2709858385806103
+23
+-148.72314037392835
+33
+210.02062894039977
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.3911397960138925
+20
+-148.92727489468845
+30
+210.22263389089855
+11
+2.27340498299741
+21
+-147.77548160765835
+31
+208.4532652280983
+12
+1.2709858385806103
+22
+-148.72314037392835
+32
+210.02062894039977
+13
+1.2709858385806103
+23
+-148.72314037392835
+33
+210.02062894039977
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.7939621000538993
+20
+-145.560120087279
+30
+200.10261178497393
+11
+0.7075623923105412
+21
+-146.7712371173017
+31
+202.15277949794012
+12
+0.7319003381537377
+22
+-143.81721894058285
+32
+200.30613785708806
+13
+0.7319003381537377
+23
+-143.81721894058285
+33
+200.30613785708806
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.7319003381537377
+20
+-143.81721894058285
+30
+200.30613785708806
+11
+0.7075623923105412
+21
+-146.7712371173017
+31
+202.15277949794012
+12
+0.6993483355884592
+22
+-144.98239809782658
+32
+202.41928000492325
+13
+0.6993483355884592
+23
+-144.98239809782658
+33
+202.41928000492325
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.2238310685094096
+20
+-142.2027004582095
+30
+200.13151309566348
+11
+0.7319003381537377
+21
+-143.81721894058285
+31
+200.30613785708806
+12
+0.6993483355884592
+22
+-144.98239809782658
+32
+202.41928000492325
+13
+0.6993483355884592
+23
+-144.98239809782658
+33
+202.41928000492325
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.2238310685094096
+20
+-142.2027004582095
+30
+200.13151309566348
+11
+0.6993483355884592
+21
+-144.98239809782658
+31
+202.41928000492325
+12
+0.956113664234215
+22
+-143.4126005909401
+32
+202.2051060815036
+13
+0.956113664234215
+23
+-143.4126005909401
+33
+202.2051060815036
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.2849655072729367
+20
+-141.74666819797247
+30
+199.75579605670927
+11
+1.2238310685094096
+21
+-142.2027004582095
+31
+200.13151309566348
+12
+0.956113664234215
+22
+-143.4126005909401
+32
+202.2051060815036
+13
+0.956113664234215
+23
+-143.4126005909401
+33
+202.2051060815036
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.2849655072729367
+20
+-141.74666819797247
+30
+199.75579605670927
+11
+0.956113664234215
+21
+-143.4126005909401
+31
+202.2051060815036
+12
+1.6491366721193326
+22
+-142.12268946125084
+32
+202.4490939885823
+13
+1.6491366721193326
+23
+-142.12268946125084
+33
+202.4490939885823
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.206750555916611
+20
+-142.81358289887442
+30
+202.17985546269168
+11
+3.431282756487657
+21
+-142.65751582115428
+31
+199.75092846754038
+12
+3.309288802948614
+22
+-142.1835343258585
+32
+201.85159741813166
+13
+3.309288802948614
+23
+-142.1835343258585
+33
+201.85159741813166
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.219527977484292
+20
+-142.6687721211069
+30
+199.89726036692267
+11
+3.431282756487657
+21
+-142.65751582115428
+31
+199.75092846754038
+12
+4.206750555916611
+22
+-142.81358289887442
+32
+202.17985546269168
+13
+4.206750555916611
+23
+-142.81358289887442
+33
+202.17985546269168
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.734883980714045
+20
+-143.50812702837408
+30
+199.94532780996272
+11
+4.82615127762604
+21
+-144.19232753089162
+31
+202.14030630069612
+12
+4.981305682376449
+22
+-146.00550449621002
+32
+201.9236985826909
+13
+4.981305682376449
+23
+-146.00550449621002
+33
+201.9236985826909
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.734883980714045
+20
+-143.50812702837408
+30
+199.94532780996272
+11
+4.981305682376449
+21
+-146.00550449621002
+31
+201.9236985826909
+12
+4.761655721141571
+22
+-144.89052235226796
+32
+200.08709634449903
+13
+4.761655721141571
+23
+-144.89052235226796
+33
+200.08709634449903
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.2937733624735763
+20
+-148.4450793426672
+30
+199.72476517575745
+11
+4.431268106320126
+21
+-147.01765881896355
+31
+200.04237536901124
+12
+4.476901754776124
+22
+-148.5953661582495
+32
+201.98606456891372
+13
+4.476901754776124
+23
+-148.5953661582495
+33
+201.98606456891372
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.476901754776124
+20
+-148.5953661582495
+30
+201.98606456891372
+11
+3.11428101187997
+21
+-149.60174021886576
+31
+201.79409902107528
+12
+3.2937733624735763
+22
+-148.4450793426672
+32
+199.72476517575745
+13
+3.2937733624735763
+23
+-148.4450793426672
+33
+199.72476517575745
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.2937733624735763
+20
+-148.4450793426672
+30
+199.72476517575745
+11
+3.11428101187997
+21
+-149.60174021886576
+31
+201.79409902107528
+12
+2.02820017862717
+22
+-148.22542938143232
+32
+199.48108149300248
+13
+2.02820017862717
+23
+-148.22542938143232
+33
+199.48108149300248
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.11428101187997
+20
+-149.60174021886576
+30
+201.79409902107528
+11
+2.1909601914535624
+21
+-149.32276651463803
+31
+201.53003230867668
+12
+2.02820017862717
+22
+-148.22542938143232
+32
+199.48108149300248
+13
+2.02820017862717
+23
+-148.22542938143232
+33
+199.48108149300248
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.1909601914535624
+20
+-149.32276651463803
+30
+201.53003230867668
+11
+1.3540390787705348
+21
+-147.55796121668243
+31
+199.42692956350155
+12
+2.02820017862717
+22
+-148.22542938143232
+32
+199.48108149300248
+13
+2.02820017862717
+23
+-148.22542938143232
+33
+199.48108149300248
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.1909601914535624
+20
+-149.32276651463803
+30
+201.53003230867668
+11
+1.1696791390083028
+21
+-148.43656106162254
+31
+201.64594177575506
+12
+1.3540390787705348
+22
+-147.55796121668243
+32
+199.42692956350155
+13
+1.3540390787705348
+23
+-147.55796121668243
+33
+199.42692956350155
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.3540390787705348
+20
+-147.55796121668243
+30
+199.42692956350155
+11
+1.1696791390083028
+21
+-148.43656106162254
+31
+201.64594177575506
+12
+0.7939621000538993
+22
+-145.560120087279
+32
+200.10261178497393
+13
+0.7939621000538993
+23
+-145.560120087279
+33
+200.10261178497393
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.7939621000538993
+20
+-145.560120087279
+30
+200.10261178497393
+11
+1.1696791390083028
+21
+-148.43656106162254
+31
+201.64594177575506
+12
+0.7075623923105412
+22
+-146.7712371173017
+32
+202.15277949794012
+13
+0.7075623923105412
+23
+-146.7712371173017
+33
+202.15277949794012
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.7075623923105412
+20
+-146.7712371173017
+30
+202.15277949794012
+11
+0.6193373386289301
+21
+-147.55674431939136
+31
+203.6060590891021
+12
+0.6993483355884592
+22
+-144.98239809782658
+32
+202.41928000492325
+13
+0.6993483355884592
+23
+-144.98239809782658
+33
+202.41928000492325
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.6993483355884592
+20
+-144.98239809782658
+30
+202.41928000492325
+11
+0.6193373386289301
+21
+-147.55674431939136
+31
+203.6060590891021
+12
+0.5694445496503724
+22
+-146.1128956822435
+32
+203.55525362715431
+13
+0.5694445496503724
+23
+-146.1128956822435
+33
+203.55525362715431
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.956113664234215
+20
+-143.4126005909401
+30
+202.2051060815036
+11
+0.6993483355884592
+21
+-144.98239809782658
+31
+202.41928000492325
+12
+0.5694445496503724
+22
+-146.1128956822435
+32
+203.55525362715431
+13
+0.5694445496503724
+23
+-146.1128956822435
+33
+203.55525362715431
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.956113664234215
+20
+-143.4126005909401
+30
+202.2051060815036
+11
+0.5694445496503724
+21
+-146.1128956822435
+31
+203.55525362715431
+12
+0.7334214597689297
+22
+-144.52940808082033
+32
+203.72744459399564
+13
+0.7334214597689297
+23
+-144.52940808082033
+33
+203.72744459399564
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.956113664234215
+20
+-143.4126005909401
+30
+202.2051060815036
+11
+0.7334214597689297
+21
+-144.52940808082033
+31
+203.72744459399564
+12
+1.6491366721193326
+22
+-142.12268946125084
+32
+202.4490939885823
+13
+1.6491366721193326
+23
+-142.12268946125084
+33
+202.4490939885823
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.6491366721193326
+20
+-142.12268946125084
+30
+202.4490939885823
+11
+0.7334214597689297
+21
+-144.52940808082033
+31
+203.72744459399564
+12
+1.5000667538297359
+22
+-142.69006782372048
+32
+203.62005340796316
+13
+1.5000667538297359
+23
+-142.69006782372048
+33
+203.62005340796316
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.966413340714997
+20
+-143.54645929307833
+30
+204.44571822069352
+11
+3.309288802948614
+21
+-142.1835343258585
+31
+201.85159741813166
+12
+2.9077126965358104
+22
+-142.78802805573957
+32
+204.36083963456542
+13
+2.9077126965358104
+23
+-142.78802805573957
+33
+204.36083963456542
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.206750555916611
+20
+-142.81358289887442
+30
+202.17985546269168
+11
+3.309288802948614
+21
+-142.1835343258585
+31
+201.85159741813166
+12
+3.966413340714997
+22
+-143.54645929307833
+32
+204.44571822069352
+13
+3.966413340714997
+23
+-143.54645929307833
+33
+204.44571822069352
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.82615127762604
+20
+-144.19232753089162
+30
+202.14030630069612
+11
+5.270623013587484
+21
+-145.4858893524582
+31
+203.86556243665535
+12
+5.399309902233417
+22
+-147.4335334685601
+32
+203.47067926534928
+13
+5.399309902233417
+23
+-147.4335334685601
+33
+203.47067926534928
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.981305682376449
+20
+-146.00550449621002
+30
+201.9236985826909
+11
+4.82615127762604
+21
+-144.19232753089162
+31
+202.14030630069612
+12
+5.399309902233417
+22
+-147.4335334685601
+32
+203.47067926534928
+13
+5.399309902233417
+23
+-147.4335334685601
+33
+203.47067926534928
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.476901754776124
+20
+-148.5953661582495
+30
+201.98606456891372
+11
+4.096317126653084
+21
+-149.23271611501875
+31
+203.72683614534824
+12
+3.11428101187997
+22
+-149.60174021886576
+32
+201.79409902107528
+13
+3.11428101187997
+23
+-149.60174021886576
+33
+201.79409902107528
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.096317126653084
+20
+-149.23271611501875
+30
+203.72683614534824
+11
+2.553899808840285
+21
+-149.98475864157348
+31
+203.2087421232112
+12
+3.11428101187997
+22
+-149.60174021886576
+32
+201.79409902107528
+13
+3.11428101187997
+23
+-149.60174021886576
+33
+201.79409902107528
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.11428101187997
+20
+-149.60174021886576
+30
+201.79409902107528
+11
+2.553899808840285
+21
+-149.98475864157348
+31
+203.2087421232112
+12
+2.1909601914535624
+22
+-149.32276651463803
+32
+201.53003230867668
+13
+2.1909601914535624
+23
+-149.32276651463803
+33
+201.53003230867668
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.553899808840285
+20
+-149.98475864157348
+30
+203.2087421232112
+11
+1.6546127099340464
+21
+-149.68327233744103
+31
+203.04324409147742
+12
+2.1909601914535624
+22
+-149.32276651463803
+32
+201.53003230867668
+13
+2.1909601914535624
+23
+-149.32276651463803
+33
+201.53003230867668
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.1909601914535624
+20
+-149.32276651463803
+30
+201.53003230867668
+11
+1.6546127099340464
+21
+-149.68327233744103
+31
+203.04324409147742
+12
+1.1696791390083028
+22
+-148.43656106162254
+32
+201.64594177575506
+13
+1.1696791390083028
+23
+-148.43656106162254
+33
+201.64594177575506
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.1696791390083028
+20
+-148.43656106162254
+30
+201.64594177575506
+11
+1.6546127099340464
+21
+-149.68327233744103
+31
+203.04324409147742
+12
+0.9183898481772497
+22
+-148.72526994418794
+32
+203.1597620072017
+13
+0.9183898481772497
+23
+-148.72526994418794
+33
+203.1597620072017
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.1696791390083028
+20
+-148.43656106162254
+30
+201.64594177575506
+11
+0.9183898481772497
+21
+-148.72526994418794
+31
+203.1597620072017
+12
+0.7075623923105412
+22
+-146.7712371173017
+32
+202.15277949794012
+13
+0.7075623923105412
+23
+-146.7712371173017
+33
+202.15277949794012
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.7075623923105412
+20
+-146.7712371173017
+30
+202.15277949794012
+11
+0.9183898481772497
+21
+-148.72526994418794
+31
+203.1597620072017
+12
+0.6193373386289301
+22
+-147.55674431939136
+32
+203.6060590891021
+13
+0.6193373386289301
+23
+-147.55674431939136
+33
+203.6060590891021
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.5694445496503724
+20
+-146.1128956822435
+30
+203.55525362715431
+11
+0.6193373386289301
+21
+-147.55674431939136
+31
+203.6060590891021
+12
+0.5913487009092616
+22
+-148.71066717668248
+32
+205.14239192045363
+13
+0.5913487009092616
+23
+-148.71066717668248
+33
+205.14239192045363
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.5694445496503724
+20
+-146.1128956822435
+30
+203.55525362715431
+11
+0.5913487009092616
+21
+-148.71066717668248
+31
+205.14239192045363
+12
+0.020623870886214313
+22
+-146.99119130286047
+32
+205.32766453318507
+13
+0.020623870886214313
+23
+-146.99119130286047
+33
+205.32766453318507
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.5694445496503724
+20
+-146.1128956822435
+30
+203.55525362715431
+11
+0.020623870886214313
+21
+-146.99119130286047
+31
+205.32766453318507
+12
+0.7334214597689297
+22
+-144.52940808082033
+32
+203.72744459399564
+13
+0.7334214597689297
+23
+-144.52940808082033
+33
+203.72744459399564
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.7334214597689297
+20
+-144.52940808082033
+30
+203.72744459399564
+11
+0.020623870886214313
+21
+-146.99119130286047
+31
+205.32766453318507
+12
+0.6245091521206169
+22
+-145.3213039936939
+32
+205.16733831494355
+13
+0.6245091521206169
+23
+-145.3213039936939
+33
+205.16733831494355
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.5000667538297359
+20
+-142.69006782372048
+30
+203.62005340796316
+11
+0.7334214597689297
+21
+-144.52940808082033
+31
+203.72744459399564
+12
+0.6245091521206169
+22
+-145.3213039936939
+32
+205.16733831494355
+13
+0.6245091521206169
+23
+-145.3213039936939
+33
+205.16733831494355
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.5000667538297359
+20
+-142.69006782372048
+30
+203.62005340796316
+11
+0.6245091521206169
+21
+-145.3213039936939
+31
+205.16733831494355
+12
+1.5414412617631732
+22
+-144.26016955493043
+32
+205.64192825888657
+13
+1.5414412617631732
+23
+-144.26016955493043
+33
+205.64192825888657
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.3409134823772355
+20
+-145.21543392927617
+30
+206.02707625185482
+11
+2.9077126965358104
+21
+-142.78802805573957
+31
+204.36083963456542
+12
+3.0251432852292552
+22
+-144.43175207312518
+32
+206.132337867627
+13
+3.0251432852292552
+23
+-144.43175207312518
+33
+206.132337867627
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.3409134823772355
+20
+-145.21543392927617
+30
+206.02707625185482
+11
+3.966413340714997
+21
+-143.54645929307833
+31
+204.44571822069352
+12
+2.9077126965358104
+22
+-142.78802805573957
+32
+204.36083963456542
+13
+2.9077126965358104
+23
+-142.78802805573957
+33
+204.36083963456542
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.210720122283652
+20
+-142.47224320842236
+30
+197.53891341471663
+11
+3.923821935489383
+21
+-142.90363329849305
+31
+197.56173023894448
+12
+1.9950397274158032
+22
+-142.74695777212742
+32
+197.65786512502515
+13
+1.9950397274158032
+23
+-142.74695777212742
+33
+197.65786512502515
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.9950397274158032
+20
+-142.74695777212742
+30
+197.65786512502515
+11
+3.923821935489383
+21
+-142.90363329849305
+31
+197.56173023894448
+12
+1.9168540763945272
+22
+-142.99429214675894
+32
+197.6724678925309
+13
+1.9168540763945272
+23
+-142.99429214675894
+33
+197.6724678925309
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.923821935489383
+20
+-142.90363329849305
+30
+197.56173023894448
+11
+3.838334900715163
+21
+-143.8211738567817
+31
+197.64204546022665
+12
+1.9168540763945272
+22
+-142.99429214675894
+32
+197.6724678925309
+13
+1.9168540763945272
+23
+-142.99429214675894
+33
+197.6724678925309
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.9168540763945272
+20
+-142.99429214675894
+30
+197.6724678925309
+11
+3.838334900715163
+21
+-143.8211738567817
+31
+197.64204546022665
+12
+1.9427131438529381
+22
+-143.80748376224489
+32
+197.61922863599887
+13
+1.9427131438529381
+23
+-143.80748376224489
+33
+197.61922863599887
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.9804369599098808
+20
+-144.325577784382
+30
+197.53921763903915
+11
+3.59830190983661
+21
+-145.31339416129302
+31
+197.51427124454963
+12
+2.3598046907407677
+22
+-145.53061032794352
+32
+197.2666326455947
+13
+2.3598046907407677
+23
+-145.53061032794352
+33
+197.2666326455947
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.9804369599098808
+20
+-144.325577784382
+30
+197.53921763903915
+11
+3.7495013983874976
+21
+-144.53670946457183
+31
+197.73726767333812
+12
+3.59830190983661
+22
+-145.31339416129302
+32
+197.51427124454963
+13
+3.59830190983661
+23
+-145.31339416129302
+33
+197.51427124454963
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.59830190983661
+20
+-145.31339416129302
+30
+197.51427124454963
+11
+2.5952743167737222
+21
+-145.65625497335887
+31
+197.3177423318657
+12
+2.3598046907407677
+22
+-145.53061032794352
+32
+197.2666326455947
+13
+2.3598046907407677
+23
+-145.53061032794352
+33
+197.2666326455947
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.59830190983661
+20
+-145.31339416129302
+30
+197.51427124454963
+11
+3.092985309267169
+21
+-145.73809131625669
+31
+197.37919564511984
+12
+2.5952743167737222
+22
+-145.65625497335887
+32
+197.3177423318657
+13
+2.5952743167737222
+23
+-145.65625497335887
+33
+197.3177423318657
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.9168540763945272
+20
+-142.99429214675894
+30
+197.6724678925309
+11
+1.9427131438529381
+21
+-143.80748376224489
+31
+197.61922863599887
+12
+1.3601235652313366
+22
+-143.13028041915797
+32
+198.21459563618828
+13
+1.3601235652313366
+23
+-143.13028041915797
+33
+198.21459563618828
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.3601235652313366
+20
+-143.13028041915797
+30
+198.21459563618828
+11
+1.9427131438529381
+21
+-143.80748376224489
+31
+197.61922863599887
+12
+1.4142754947324547
+22
+-144.4229295677549
+32
+198.0369286315323
+13
+1.4142754947324547
+23
+-144.4229295677549
+33
+198.0369286315323
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.7181955934494226
+20
+-141.9261605485656
+30
+198.12758747979916
+11
+2.2156023616198084
+21
+-142.26597911740117
+31
+197.67125099523906
+12
+1.9950397274158032
+22
+-142.74695777212742
+32
+197.65786512502515
+13
+1.9950397274158032
+23
+-142.74695777212742
+33
+197.65786512502515
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.9950397274158032
+20
+-142.74695777212742
+30
+197.65786512502515
+11
+1.3601235652313366
+21
+-143.13028041915797
+31
+198.21459563618828
+12
+1.7181955934494226
+22
+-141.9261605485656
+32
+198.12758747979916
+13
+1.7181955934494226
+23
+-141.9261605485656
+33
+198.12758747979916
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.2156023616198084
+20
+-142.26597911740117
+30
+197.67125099523906
+11
+2.4845366631871793
+21
+-141.63349674980125
+31
+198.2620546305829
+12
+2.490012701001859
+22
+-141.9352872782568
+32
+197.7342254301082
+13
+2.490012701001859
+23
+-141.9352872782568
+33
+197.7342254301082
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.4845366631871793
+20
+-141.63349674980125
+30
+198.2620546305829
+11
+2.2156023616198084
+21
+-142.26597911740117
+31
+197.67125099523906
+12
+1.7181955934494226
+22
+-141.9261605485656
+32
+198.12758747979916
+13
+1.7181955934494226
+23
+-141.9261605485656
+33
+198.12758747979916
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.128869129218374
+20
+-142.46311647873134
+30
+198.24471384416938
+11
+3.210720122283652
+21
+-142.47224320842236
+31
+197.53891341471663
+12
+3.169345614350192
+22
+-142.1178218720809
+32
+198.15222964996534
+13
+3.169345614350192
+23
+-142.1178218720809
+33
+198.15222964996534
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.923821935489383
+20
+-142.90363329849305
+30
+197.56173023894448
+11
+4.497893233065887
+21
+-142.9504838442413
+31
+197.96604436426463
+12
+3.838334900715163
+22
+-143.8211738567817
+32
+197.64204546022665
+13
+3.838334900715163
+23
+-143.8211738567817
+33
+197.64204546022665
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.497893233065887
+20
+-142.9504838442413
+30
+197.96604436426463
+11
+4.392023168647969
+21
+-143.96233394267233
+31
+198.10872557177015
+12
+3.838334900715163
+22
+-143.8211738567817
+32
+197.64204546022665
+13
+3.838334900715163
+23
+-143.8211738567817
+33
+197.64204546022665
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.59830190983661
+20
+-145.31339416129302
+30
+197.51427124454963
+11
+3.280083267936769
+21
+-146.5503702587736
+31
+197.72692404635427
+12
+3.092985309267169
+22
+-145.73809131625669
+32
+197.37919564511984
+13
+3.092985309267169
+23
+-145.73809131625669
+33
+197.37919564511984
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.59830190983661
+20
+-145.31339416129302
+30
+197.51427124454963
+11
+4.128260680572296
+21
+-145.5044470361621
+31
+197.98308092635423
+12
+3.280083267936769
+22
+-146.5503702587736
+32
+197.72692404635427
+13
+3.280083267936769
+23
+-146.5503702587736
+33
+197.72692404635427
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.5952743167737222
+20
+-145.65625497335887
+30
+197.3177423318657
+11
+3.092985309267169
+21
+-145.73809131625669
+31
+197.37919564511984
+12
+2.3400301097431475
+22
+-146.3873060216241
+32
+197.5462147984683
+13
+2.3400301097431475
+23
+-146.3873060216241
+33
+197.5462147984683
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.092985309267169
+20
+-145.73809131625669
+30
+197.37919564511984
+11
+3.280083267936769
+21
+-146.5503702587736
+31
+197.72692404635427
+12
+2.3400301097431475
+22
+-146.3873060216241
+32
+197.5462147984683
+13
+2.3400301097431475
+23
+-146.3873060216241
+33
+197.5462147984683
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.3598046907407677
+20
+-145.53061032794352
+30
+197.2666326455947
+11
+2.5952743167737222
+21
+-145.65625497335887
+31
+197.3177423318657
+12
+1.8325839389124492
+22
+-145.91454142361988
+32
+197.53252470393195
+13
+1.8325839389124492
+23
+-145.91454142361988
+33
+197.53252470393195
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.5952743167737222
+20
+-145.65625497335887
+30
+197.3177423318657
+11
+2.3400301097431475
+21
+-146.3873060216241
+31
+197.5462147984683
+12
+1.8325839389124492
+22
+-145.91454142361988
+32
+197.53252470393195
+13
+1.8325839389124492
+23
+-145.91454142361988
+33
+197.53252470393195
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.4142754947324547
+20
+-144.4229295677549
+30
+198.0369286315323
+11
+2.3598046907407677
+21
+-145.53061032794352
+31
+197.2666326455947
+12
+1.8325839389124492
+22
+-145.91454142361988
+32
+197.53252470393195
+13
+1.8325839389124492
+23
+-145.91454142361988
+33
+197.53252470393195
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.9804369599098808
+20
+-144.325577784382
+30
+197.53921763903915
+11
+2.3598046907407677
+21
+-145.53061032794352
+31
+197.2666326455947
+12
+1.4142754947324547
+22
+-144.4229295677549
+32
+198.0369286315323
+13
+1.4142754947324547
+23
+-144.4229295677549
+33
+198.0369286315323
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.838334900715163
+20
+-143.8211738567817
+30
+197.64204546022665
+11
+4.392023168647969
+21
+-143.96233394267233
+31
+198.10872557177015
+12
+3.7495013983874976
+22
+-144.53670946457183
+32
+197.73726767333812
+13
+3.7495013983874976
+23
+-144.53670946457183
+33
+197.73726767333812
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.392023168647969
+20
+-143.96233394267233
+30
+198.10872557177015
+11
+4.2633362800020365
+21
+-144.84519292813448
+31
+198.15375077157984
+12
+3.7495013983874976
+22
+-144.53670946457183
+32
+197.73726767333812
+13
+3.7495013983874976
+23
+-144.53670946457183
+33
+197.73726767333812
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.2633362800020365
+20
+-144.84519292813448
+30
+198.15375077157984
+11
+4.128260680572296
+21
+-145.5044470361621
+31
+197.98308092635423
+12
+3.59830190983661
+22
+-145.31339416129302
+32
+197.51427124454963
+13
+3.59830190983661
+23
+-145.31339416129302
+33
+197.51427124454963
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.7495013983874976
+20
+-144.53670946457183
+30
+197.73726767333812
+11
+4.2633362800020365
+21
+-144.84519292813448
+31
+198.15375077157984
+12
+3.59830190983661
+22
+-145.31339416129302
+32
+197.51427124454963
+13
+3.59830190983661
+23
+-145.31339416129302
+33
+197.51427124454963
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.128869129218374
+20
+-142.46311647873134
+30
+198.24471384416938
+11
+3.923821935489383
+21
+-142.90363329849305
+31
+197.56173023894448
+12
+3.210720122283652
+22
+-142.47224320842236
+32
+197.53891341471663
+13
+3.210720122283652
+23
+-142.47224320842236
+33
+197.53891341471663
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.497893233065887
+20
+-142.9504838442413
+30
+197.96604436426463
+11
+3.923821935489383
+21
+-142.90363329849305
+31
+197.56173023894448
+12
+4.128869129218374
+22
+-142.46311647873134
+32
+198.24471384416938
+13
+4.128869129218374
+23
+-142.46311647873134
+33
+198.24471384416938
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.169345614350192
+20
+-142.1178218720809
+30
+198.15222964996534
+11
+2.490012701001859
+21
+-141.9352872782568
+31
+197.7342254301082
+12
+2.4845366631871793
+22
+-141.63349674980125
+32
+198.2620546305829
+13
+2.4845366631871793
+23
+-141.63349674980125
+33
+198.2620546305829
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.210720122283652
+20
+-142.47224320842236
+30
+197.53891341471663
+11
+2.490012701001859
+21
+-141.9352872782568
+31
+197.7342254301082
+12
+3.169345614350192
+22
+-142.1178218720809
+32
+198.15222964996534
+13
+3.169345614350192
+23
+-142.1178218720809
+33
+198.15222964996534
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.9427131438529381
+20
+-143.80748376224489
+30
+197.61922863599887
+11
+1.9804369599098808
+21
+-144.325577784382
+31
+197.53921763903915
+12
+1.4142754947324547
+22
+-144.4229295677549
+32
+198.0369286315323
+13
+1.4142754947324547
+23
+-144.4229295677549
+33
+198.0369286315323
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.9950397274158032
+20
+-142.74695777212742
+30
+197.65786512502515
+11
+1.9168540763945272
+21
+-142.99429214675894
+31
+197.6724678925309
+12
+1.3601235652313366
+22
+-143.13028041915797
+32
+198.21459563618828
+13
+1.3601235652313366
+23
+-143.13028041915797
+33
+198.21459563618828
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.6245091521206169
+20
+-145.3213039936939
+30
+205.16733831494355
+11
+0.020623870886214313
+21
+-146.99119130286047
+31
+205.32766453318507
+12
+0.020623870886214313
+22
+-148.53847620984223
+32
+206.6933275193114
+13
+0.020623870886214313
+23
+-148.53847620984223
+33
+206.6933275193114
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.6245091521206169
+20
+-145.3213039936939
+30
+205.16733831494355
+11
+0.020623870886214313
+21
+-148.53847620984223
+31
+206.6933275193114
+12
+0.020623870886214313
+22
+-146.8524650115545
+32
+206.52174500111724
+13
+0.020623870886214313
+23
+-146.8524650115545
+33
+206.52174500111724
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.6245091521206169
+20
+-145.3213039936939
+30
+205.16733831494355
+11
+0.020623870886214313
+21
+-146.8524650115545
+31
+206.52174500111724
+12
+1.5414412617631732
+22
+-144.26016955493043
+32
+205.64192825888657
+13
+1.5414412617631732
+23
+-144.26016955493043
+33
+205.64192825888657
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.5414412617631732
+20
+-144.26016955493043
+30
+205.64192825888657
+11
+0.020623870886214313
+21
+-146.8524650115545
+31
+206.52174500111724
+12
+1.4599091431884523
+22
+-145.9516567910334
+32
+206.81836371608185
+13
+1.4599091431884523
+23
+-145.9516567910334
+33
+206.81836371608185
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.0251432852292552
+20
+-144.43175207312518
+30
+206.132337867627
+11
+3.4446686267014033
+21
+-146.30029786523707
+31
+207.11163596349218
+12
+4.702027753825728
+22
+-146.55432517497565
+32
+207.46453617821862
+13
+4.702027753825728
+23
+-146.55432517497565
+33
+207.46453617821862
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.702027753825728
+20
+-146.55432517497565
+30
+207.46453617821862
+11
+4.3409134823772355
+21
+-145.21543392927617
+31
+206.02707625185482
+12
+3.0251432852292552
+22
+-144.43175207312518
+32
+206.132337867627
+13
+3.0251432852292552
+23
+-144.43175207312518
+33
+206.132337867627
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.632041509359015
+20
+-146.4256382863293
+30
+205.69425484244877
+11
+6.127622931591159
+21
+-147.62397789478413
+31
+207.0151968530882
+12
+5.7601199493588595
+22
+-149.0547448860413
+32
+207.22419896301625
+13
+5.7601199493588595
+23
+-149.0547448860413
+33
+207.22419896301625
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.540165763800931
+20
+-147.98448371758607
+30
+205.41193467066725
+11
+5.632041509359015
+21
+-146.4256382863293
+31
+205.69425484244877
+12
+5.7601199493588595
+22
+-149.0547448860413
+32
+207.22419896301625
+13
+5.7601199493588595
+23
+-149.0547448860413
+33
+207.22419896301625
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.7041719742545274
+20
+-149.69513708603995
+30
+205.17524814734148
+11
+3.388082902615978
+21
+-150.16120874893758
+31
+206.77151317033253
+12
+1.9287188249930813
+22
+-150.08211042494676
+32
+204.90509694848168
+13
+1.9287188249930813
+23
+-150.08211042494676
+33
+204.90509694848168
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.388082902615978
+20
+-150.16120874893758
+30
+206.77151317033253
+11
+1.8766964657532548
+21
+-150.30176038618202
+31
+206.46637617432327
+12
+1.9287188249930813
+22
+-150.08211042494676
+32
+204.90509694848168
+13
+1.9287188249930813
+23
+-150.08211042494676
+33
+204.90509694848168
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.9287188249930813
+20
+-150.08211042494676
+30
+204.90509694848168
+11
+1.8766964657532548
+21
+-150.30176038618202
+31
+206.46637617432327
+12
+1.2043607118348614
+22
+-149.95342353630082
+32
+204.93095601594052
+13
+1.2043607118348614
+23
+-149.95342353630082
+33
+204.93095601594052
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.8766964657532548
+20
+-150.30176038618202
+30
+206.46637617432327
+11
+1.2426929765378922
+21
+-150.26981683226288
+31
+206.47063531484585
+12
+1.2043607118348614
+22
+-149.95342353630082
+32
+204.93095601594052
+13
+1.2043607118348614
+23
+-149.95342353630082
+33
+204.93095601594052
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.2043607118348614
+20
+-149.95342353630082
+30
+204.93095601594052
+11
+1.2426929765378922
+21
+-150.26981683226288
+31
+206.47063531484585
+12
+0.76536501368812
+22
+-149.3325016929762
+32
+205.0082289939926
+13
+0.76536501368812
+23
+-149.3325016929762
+33
+205.0082289939926
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.2426929765378922
+20
+-150.26981683226288
+30
+206.47063531484585
+11
+1.0126993883196627
+21
+-150.17672418941257
+31
+206.5077506822569
+12
+0.76536501368812
+22
+-149.3325016929762
+32
+205.0082289939926
+13
+0.76536501368812
+23
+-149.3325016929762
+33
+205.0082289939926
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.76536501368812
+20
+-149.3325016929762
+30
+205.0082289939926
+11
+1.0126993883196627
+21
+-150.17672418941257
+31
+206.5077506822569
+12
+0.5913487009092616
+22
+-148.71066717668248
+32
+205.14239192045363
+13
+0.5913487009092616
+23
+-148.71066717668248
+33
+205.14239192045363
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.0126993883196627
+20
+-150.17672418941257
+30
+206.5077506822569
+11
+0.7668861353033347
+21
+-149.98658398751266
+31
+206.5664659766037
+12
+0.5913487009092616
+22
+-148.71066717668248
+32
+205.14239192045363
+13
+0.5913487009092616
+23
+-148.71066717668248
+33
+205.14239192045363
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.7601199493588595
+20
+-149.0547448860413
+30
+207.22419896301625
+11
+5.383794461758368
+21
+-149.24762310684855
+31
+207.06265584748198
+12
+5.540165763800931
+22
+-147.98448371758607
+32
+205.41193467066725
+13
+5.540165763800931
+23
+-147.98448371758607
+33
+205.41193467066725
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.216775308409404
+20
+-148.67476870656373
+30
+205.10892724491933
+11
+5.540165763800931
+21
+-147.98448371758607
+31
+205.41193467066725
+12
+5.383794461758368
+22
+-149.24762310684855
+32
+207.06265584748198
+13
+5.383794461758368
+23
+-149.24762310684855
+33
+207.06265584748198
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.383794461758368
+20
+-149.24762310684855
+30
+207.06265584748198
+11
+3.388082902615978
+21
+-150.16120874893758
+31
+206.77151317033253
+12
+5.216775308409404
+22
+-148.67476870656373
+32
+205.10892724491933
+13
+5.216775308409404
+23
+-148.67476870656373
+33
+205.10892724491933
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.216775308409404
+20
+-148.67476870656373
+30
+205.10892724491933
+11
+3.388082902615978
+21
+-150.16120874893758
+31
+206.77151317033253
+12
+3.7041719742545274
+22
+-149.69513708603995
+32
+205.17524814734148
+13
+3.7041719742545274
+23
+-149.69513708603995
+33
+205.17524814734148
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.7668861353033347
+20
+-149.98658398751266
+30
+206.5664659766037
+11
+0.8012634838068549
+21
+-150.47851471786885
+31
+208.85910047503285
+12
+0.020623870886214313
+22
+-148.53847620984223
+32
+206.6933275193114
+13
+0.020623870886214313
+23
+-148.53847620984223
+33
+206.6933275193114
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.020623870886214313
+20
+-148.53847620984223
+30
+206.6933275193114
+11
+0.8012634838068549
+21
+-150.47851471786885
+31
+208.85910047503285
+12
+0.020623870886214313
+22
+-149.1119390587734
+32
+208.99235072852483
+13
+0.020623870886214313
+23
+-149.1119390587734
+33
+208.99235072852483
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.020623870886214313
+20
+-146.8524650115545
+30
+206.52174500111724
+11
+0.020623870886214313
+21
+-148.53847620984223
+31
+206.6933275193114
+12
+0.020623870886214313
+22
+-149.1119390587734
+32
+208.99235072852483
+13
+0.020623870886214313
+23
+-149.1119390587734
+33
+208.99235072852483
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.379260397247808
+20
+-148.95222128917771
+30
+210.67319011332089
+11
+2.3911397960138925
+21
+-148.92727489468845
+31
+210.22263389089855
+12
+2.4376861174390165
+22
+-149.91417859863083
+32
+212.52895848386453
+13
+2.4376861174390165
+23
+-149.91417859863083
+33
+212.52895848386453
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.7342901822354873
+20
+-149.6668442239991
+30
+212.42582643835414
+11
+3.379260397247808
+21
+-148.95222128917771
+31
+210.67319011332089
+12
+2.4376861174390165
+22
+-149.91417859863083
+32
+212.52895848386453
+13
+2.4376861174390165
+23
+-149.91417859863083
+33
+212.52895848386453
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.3911397960138925
+20
+-148.92727489468845
+30
+210.22263389089855
+11
+1.2709858385806103
+21
+-148.72314037392835
+31
+210.02062894039977
+12
+1.640618391074212
+22
+-149.92391377696782
+32
+212.21226096357984
+13
+1.640618391074212
+23
+-149.92391377696782
+33
+212.21226096357984
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.4376861174390165
+20
+-149.91417859863083
+30
+212.52895848386453
+11
+2.3911397960138925
+21
+-148.92727489468845
+31
+210.22263389089855
+12
+1.640618391074212
+22
+-149.92391377696782
+32
+212.21226096357984
+13
+1.640618391074212
+23
+-149.92391377696782
+33
+212.21226096357984
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.219527977484292
+20
+-142.6687721211069
+30
+199.89726036692267
+11
+4.206750555916611
+21
+-142.81358289887442
+31
+202.17985546269168
+12
+4.420620255013715
+22
+-143.17287182438474
+32
+202.02500528226426
+13
+4.420620255013715
+23
+-143.17287182438474
+33
+202.02500528226426
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.206750555916611
+20
+-142.81358289887442
+30
+202.17985546269168
+11
+3.966413340714997
+21
+-143.54645929307833
+31
+204.44571822069352
+12
+4.388676701094524
+22
+-143.93799599683092
+32
+204.34258617518282
+13
+4.388676701094524
+23
+-143.93799599683092
+33
+204.34258617518282
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.206750555916611
+20
+-142.81358289887442
+30
+202.17985546269168
+11
+4.388676701094524
+21
+-143.93799599683092
+31
+204.34258617518282
+12
+4.749182523896929
+22
+-144.27173007920578
+32
+204.2601413836385
+13
+4.749182523896929
+23
+-144.27173007920578
+33
+204.2601413836385
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.420620255013715
+20
+-143.17287182438474
+30
+202.02500528226426
+11
+4.206750555916611
+21
+-142.81358289887442
+31
+202.17985546269168
+12
+4.749182523896929
+22
+-144.27173007920578
+32
+204.2601413836385
+13
+4.749182523896929
+23
+-144.27173007920578
+33
+204.2601413836385
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.966413340714997
+20
+-143.54645929307833
+30
+204.44571822069352
+11
+4.3409134823772355
+21
+-145.21543392927617
+31
+206.02707625185482
+12
+4.868438458528604
+22
+-145.320087096402
+32
+206.14085614867153
+13
+4.868438458528604
+23
+-145.320087096402
+33
+206.14085614867153
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.388676701094524
+20
+-143.93799599683092
+30
+204.34258617518282
+11
+3.966413340714997
+21
+-143.54645929307833
+31
+204.44571822069352
+12
+4.868438458528604
+22
+-145.320087096402
+32
+206.14085614867153
+13
+4.868438458528604
+23
+-145.320087096402
+33
+206.14085614867153
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.368887469929396
+20
+-145.38184463397894
+30
+205.82020371218763
+11
+4.388676701094524
+21
+-143.93799599683092
+31
+204.34258617518282
+12
+4.868438458528604
+22
+-145.320087096402
+32
+206.14085614867153
+13
+4.868438458528604
+23
+-145.320087096402
+33
+206.14085614867153
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.368887469929396
+20
+-145.38184463397894
+30
+205.82020371218763
+11
+4.749182523896929
+21
+-144.27173007920578
+31
+204.2601413836385
+12
+4.388676701094524
+22
+-143.93799599683092
+32
+204.34258617518282
+13
+4.388676701094524
+23
+-143.93799599683092
+33
+204.34258617518282
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.3409134823772355
+20
+-145.21543392927617
+30
+206.02707625185482
+11
+4.702027753825728
+21
+-146.55432517497565
+31
+207.46453617821862
+12
+5.495444788314049
+22
+-146.54154775340805
+32
+208.04712575684025
+13
+5.495444788314049
+23
+-146.54154775340805
+33
+208.04712575684025
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.495444788314049
+20
+-146.54154775340805
+30
+208.04712575684025
+11
+4.868438458528604
+21
+-145.320087096402
+31
+206.14085614867153
+12
+4.3409134823772355
+22
+-145.21543392927617
+32
+206.02707625185482
+13
+4.3409134823772355
+23
+-145.21543392927617
+33
+206.02707625185482
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.913449008171005
+20
+-146.53972240746953
+30
+207.06356852045192
+11
+4.868438458528604
+21
+-145.320087096402
+31
+206.14085614867153
+12
+5.495444788314049
+22
+-146.54154775340805
+32
+208.04712575684025
+13
+5.495444788314049
+23
+-146.54154775340805
+33
+208.04712575684025
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.913449008171005
+20
+-146.53972240746953
+30
+207.06356852045192
+11
+5.368887469929396
+21
+-145.38184463397894
+31
+205.82020371218763
+12
+4.868438458528604
+22
+-145.320087096402
+32
+206.14085614867153
+13
+4.868438458528604
+23
+-145.320087096402
+33
+206.14085614867153
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.702027753825728
+20
+-146.55432517497565
+30
+207.46453617821862
+11
+4.992257758005866
+21
+-147.85488415597203
+31
+209.10917286857205
+12
+5.619264087791334
+22
+-147.7115944998203
+32
+209.85634780595882
+13
+5.619264087791334
+23
+-147.7115944998203
+33
+209.85634780595882
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.619264087791334
+20
+-147.7115944998203
+30
+209.85634780595882
+11
+5.495444788314049
+21
+-146.54154775340805
+31
+208.04712575684025
+12
+4.702027753825728
+22
+-146.55432517497565
+32
+207.46453617821862
+13
+4.702027753825728
+23
+-146.55432517497565
+33
+207.46453617821862
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.940524972921558
+20
+-147.59751037868023
+30
+209.27102020842986
+11
+5.495444788314049
+21
+-146.54154775340805
+31
+208.04712575684025
+12
+5.619264087791334
+22
+-147.7115944998203
+32
+209.85634780595882
+13
+5.619264087791334
+23
+-147.7115944998203
+33
+209.85634780595882
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.913449008171005
+20
+-146.53972240746953
+30
+207.06356852045192
+11
+5.495444788314049
+21
+-146.54154775340805
+31
+208.04712575684025
+12
+5.940524972921558
+22
+-147.59751037868023
+32
+209.27102020842986
+13
+5.940524972921558
+23
+-147.59751037868023
+33
+209.27102020842986
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.992257758005866
+20
+-147.85488415597203
+30
+209.10917286857205
+11
+4.884866571972756
+21
+-148.91297635150562
+31
+210.93543147978124
+12
+5.450723812827178
+22
+-148.8399625139762
+32
+211.93998019445948
+13
+5.450723812827178
+23
+-148.8399625139762
+33
+211.93998019445948
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.619264087791334
+20
+-147.7115944998203
+30
+209.85634780595882
+11
+4.992257758005866
+21
+-147.85488415597203
+31
+209.10917286857205
+12
+5.450723812827178
+22
+-148.8399625139762
+32
+211.93998019445948
+13
+5.450723812827178
+23
+-148.8399625139762
+33
+211.93998019445948
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.619264087791334
+20
+-147.7115944998203
+30
+209.85634780595882
+11
+5.450723812827178
+21
+-148.8399625139762
+31
+211.93998019445948
+12
+5.688323009121401
+22
+-148.78672325744412
+32
+211.39450598324876
+13
+5.688323009121401
+23
+-148.78672325744412
+33
+211.39450598324876
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.940524972921558
+20
+-147.59751037868023
+30
+209.27102020842986
+11
+5.619264087791334
+21
+-147.7115944998203
+31
+209.85634780595882
+12
+5.688323009121401
+22
+-148.78672325744412
+32
+211.39450598324876
+13
+5.688323009121401
+23
+-148.78672325744412
+33
+211.39450598324876
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.26058361092716
+20
+-149.33341436594728
+30
+212.63787079151302
+11
+4.884866571972756
+21
+-148.91297635150562
+31
+210.93543147978124
+12
+4.873001823374214
+22
+-149.4058197548307
+32
+212.14867808006431
+13
+4.873001823374214
+23
+-149.4058197548307
+33
+212.14867808006431
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.450723812827178
+20
+-148.8399625139762
+30
+211.93998019445948
+11
+4.884866571972756
+21
+-148.91297635150562
+31
+210.93543147978124
+12
+5.26058361092716
+22
+-149.33341436594728
+32
+212.63787079151302
+13
+5.26058361092716
+23
+-149.33341436594728
+33
+212.63787079151302
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.450723812827178
+20
+-148.8399625139762
+30
+211.93998019445948
+11
+5.26058361092716
+21
+-149.33341436594728
+31
+212.63787079151302
+12
+5.403569042755966
+22
+-149.3763099954959
+32
+212.71058040471948
+13
+5.403569042755966
+23
+-149.3763099954959
+33
+212.71058040471948
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.688323009121401
+20
+-148.78672325744412
+30
+211.39450598324876
+11
+5.450723812827178
+21
+-148.8399625139762
+31
+211.93998019445948
+12
+5.403569042755966
+22
+-149.3763099954959
+32
+212.71058040471948
+13
+5.403569042755966
+23
+-149.3763099954959
+33
+212.71058040471948
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.26058361092716
+20
+-149.33341436594728
+30
+212.63787079151302
+11
+4.856877934253088
+21
+-149.54941363530563
+31
+212.45685731930413
+12
+5.0068605255118
+22
+-149.7018300211487
+32
+212.64243415635858
+13
+5.0068605255118
+23
+-149.7018300211487
+33
+212.64243415635858
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.26058361092716
+20
+-149.33341436594728
+30
+212.63787079151302
+11
+5.0068605255118
+21
+-149.7018300211487
+31
+212.64243415635858
+12
+5.403569042755966
+22
+-149.3763099954959
+32
+212.71058040471948
+13
+5.403569042755966
+23
+-149.3763099954959
+33
+212.71058040471948
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.26058361092716
+20
+-149.33341436594728
+30
+212.63787079151302
+11
+4.873001823374214
+21
+-149.4058197548307
+31
+212.14867808006431
+12
+4.856877934253088
+22
+-149.54941363530563
+32
+212.45685731930413
+13
+4.856877934253088
+23
+-149.54941363530563
+33
+212.45685731930413
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.403569042755966
+20
+-149.3763099954959
+30
+212.71058040471948
+11
+5.0068605255118
+21
+-149.7018300211487
+31
+212.64243415635858
+12
+5.205823232779965
+22
+-149.59687262969987
+32
+212.3327337955038
+13
+5.205823232779965
+23
+-149.59687262969987
+33
+212.3327337955038
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.0068605255118
+20
+-149.7018300211487
+30
+212.64243415635858
+11
+3.380173070216912
+21
+-150.32609833202702
+31
+212.51800640823498
+12
+3.326629589361893
+22
+-150.42618813430695
+32
+212.0123855833424
+13
+3.326629589361893
+23
+-150.42618813430695
+33
+212.0123855833424
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.205823232779965
+20
+-149.59687262969987
+30
+212.3327337955038
+11
+5.0068605255118
+21
+-149.7018300211487
+31
+212.64243415635858
+12
+3.326629589361893
+22
+-150.42618813430695
+32
+212.0123855833424
+13
+3.326629589361893
+23
+-150.42618813430695
+33
+212.0123855833424
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.873001823374214
+20
+-149.4058197548307
+30
+212.14867808006431
+11
+3.7342901822354873
+21
+-149.6668442239991
+31
+212.42582643835414
+12
+3.5143359966775813
+22
+-149.91752506618434
+32
+212.70084522638174
+13
+3.5143359966775813
+23
+-149.91752506618434
+33
+212.70084522638174
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.884866571972756
+20
+-148.91297635150562
+30
+210.93543147978124
+11
+3.379260397247808
+21
+-148.95222128917771
+31
+210.67319011332089
+12
+4.873001823374214
+22
+-149.4058197548307
+32
+212.14867808006431
+13
+4.873001823374214
+23
+-149.4058197548307
+33
+212.14867808006431
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.688323009121401
+20
+-148.78672325744412
+30
+211.39450598324876
+11
+5.403569042755966
+21
+-149.3763099954959
+31
+212.71058040471948
+12
+5.353372029454358
+22
+-149.5016504165884
+32
+212.57215833773645
+13
+5.353372029454358
+23
+-149.5016504165884
+33
+212.57215833773645
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.4333830264138765
+20
+-149.25583716357175
+30
+211.21501363265492
+11
+5.688323009121401
+21
+-148.78672325744412
+31
+211.39450598324876
+12
+5.353372029454358
+22
+-149.5016504165884
+32
+212.57215833773645
+13
+5.353372029454358
+23
+-149.5016504165884
+33
+212.57215833773645
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.372567462140918
+20
+-150.67595630352236
+30
+210.58922420016128
+11
+3.326629589361893
+21
+-150.42618813430695
+31
+212.0123855833424
+12
+2.18730949957709
+22
+-150.6841703602444
+32
+210.59835092985261
+13
+2.18730949957709
+23
+-150.6841703602444
+33
+210.59835092985261
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.326629589361893
+20
+-150.42618813430695
+30
+212.0123855833424
+11
+2.1398505051828507
+21
+-150.55852571482922
+31
+211.82498340034994
+12
+2.18730949957709
+22
+-150.6841703602444
+32
+210.59835092985261
+13
+2.18730949957709
+23
+-150.6841703602444
+33
+210.59835092985261
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.18730949957709
+20
+-150.6841703602444
+30
+210.59835092985261
+11
+2.1398505051828507
+21
+-150.55852571482922
+31
+211.82498340034994
+12
+1.2043607118348614
+22
+-150.65891974143224
+32
+210.65311130799967
+13
+1.2043607118348614
+23
+-150.65891974143224
+33
+210.65311130799967
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.1398505051828507
+20
+-150.55852571482922
+30
+211.82498340034994
+11
+1.3041462897919658
+21
+-150.54605251758457
+31
+211.9716195240552
+12
+1.2043607118348614
+22
+-150.65891974143224
+32
+210.65311130799967
+13
+1.2043607118348614
+23
+-150.65891974143224
+33
+210.65311130799967
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.3041462897919658
+20
+-150.54605251758457
+30
+211.9716195240552
+11
+0.804914175683327
+21
+-150.67017604138462
+31
+210.77145456966227
+12
+1.2043607118348614
+22
+-150.65891974143224
+32
+210.65311130799967
+13
+1.2043607118348614
+23
+-150.65891974143224
+33
+210.65311130799967
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.3041462897919658
+20
+-150.54605251758457
+30
+211.9716195240552
+11
+0.8295563458495732
+21
+-150.40154596414055
+31
+211.95975477545667
+12
+0.804914175683327
+22
+-150.67017604138462
+32
+210.77145456966227
+13
+0.804914175683327
+23
+-150.67017604138462
+33
+210.77145456966227
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.4333830264138765
+20
+-149.25583716357175
+30
+211.21501363265492
+11
+5.353372029454358
+21
+-149.5016504165884
+31
+212.57215833773645
+12
+5.205823232779965
+22
+-149.59687262969987
+32
+212.3327337955038
+13
+5.205823232779965
+23
+-149.59687262969987
+33
+212.3327337955038
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.031198471355007
+20
+-149.85607175292978
+30
+211.07415777108739
+11
+5.4333830264138765
+21
+-149.25583716357175
+31
+211.21501363265492
+12
+5.205823232779965
+22
+-149.59687262969987
+32
+212.3327337955038
+13
+5.205823232779965
+23
+-149.59687262969987
+33
+212.3327337955038
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.205823232779965
+20
+-149.59687262969987
+30
+212.3327337955038
+11
+3.326629589361893
+21
+-150.42618813430695
+31
+212.0123855833424
+12
+5.031198471355007
+22
+-149.85607175292978
+32
+211.07415777108739
+13
+5.031198471355007
+23
+-149.85607175292978
+33
+211.07415777108739
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.031198471355007
+20
+-149.85607175292978
+30
+211.07415777108739
+11
+3.326629589361893
+21
+-150.42618813430695
+31
+212.0123855833424
+12
+3.372567462140918
+22
+-150.67595630352236
+32
+210.58922420016128
+13
+3.372567462140918
+23
+-150.67595630352236
+33
+210.58922420016128
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.219527977484292
+20
+-142.6687721211069
+30
+199.89726036692267
+11
+4.420620255013715
+21
+-143.17287182438474
+31
+202.02500528226426
+12
+4.82615127762604
+22
+-144.19232753089162
+32
+202.14030630069612
+13
+4.82615127762604
+23
+-144.19232753089162
+33
+202.14030630069612
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.219527977484292
+20
+-142.6687721211069
+30
+199.89726036692267
+11
+4.82615127762604
+21
+-144.19232753089162
+31
+202.14030630069612
+12
+4.734883980714045
+22
+-143.50812702837408
+32
+199.94532780996272
+13
+4.734883980714045
+23
+-143.50812702837408
+33
+199.94532780996272
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.420620255013715
+20
+-143.17287182438474
+30
+202.02500528226426
+11
+4.749182523896929
+21
+-144.27173007920578
+31
+204.2601413836385
+12
+5.270623013587484
+22
+-145.4858893524582
+32
+203.86556243665535
+13
+5.270623013587484
+23
+-145.4858893524582
+33
+203.86556243665535
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.420620255013715
+20
+-143.17287182438474
+30
+202.02500528226426
+11
+5.270623013587484
+21
+-145.4858893524582
+31
+203.86556243665535
+12
+4.82615127762604
+22
+-144.19232753089162
+32
+202.14030630069612
+13
+4.82615127762604
+23
+-144.19232753089162
+33
+202.14030630069612
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.749182523896929
+20
+-144.27173007920578
+30
+204.2601413836385
+11
+5.368887469929396
+21
+-145.38184463397894
+31
+205.82020371218763
+12
+5.632041509359015
+22
+-146.4256382863293
+32
+205.69425484244877
+13
+5.632041509359015
+23
+-146.4256382863293
+33
+205.69425484244877
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.270623013587484
+20
+-145.4858893524582
+30
+203.86556243665535
+11
+4.749182523896929
+21
+-144.27173007920578
+31
+204.2601413836385
+12
+5.632041509359015
+22
+-146.4256382863293
+32
+205.69425484244877
+13
+5.632041509359015
+23
+-146.4256382863293
+33
+205.69425484244877
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.368887469929396
+20
+-145.38184463397894
+30
+205.82020371218763
+11
+5.913449008171005
+21
+-146.53972240746953
+31
+207.06356852045192
+12
+6.127622931591159
+22
+-147.62397789478413
+32
+207.0151968530882
+13
+6.127622931591159
+23
+-147.62397789478413
+33
+207.0151968530882
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.632041509359015
+20
+-146.4256382863293
+30
+205.69425484244877
+11
+5.368887469929396
+21
+-145.38184463397894
+31
+205.82020371218763
+12
+6.127622931591159
+22
+-147.62397789478413
+32
+207.0151968530882
+13
+6.127622931591159
+23
+-147.62397789478413
+33
+207.0151968530882
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.913449008171005
+20
+-146.53972240746953
+30
+207.06356852045192
+11
+5.940524972921558
+21
+-147.59751037868023
+31
+209.27102020842986
+12
+6.043961242755168
+22
+-148.17553659245624
+32
+209.48093499132722
+13
+6.043961242755168
+23
+-148.17553659245624
+33
+209.48093499132722
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.127622931591159
+20
+-147.62397789478413
+30
+207.0151968530882
+11
+5.913449008171005
+21
+-146.53972240746953
+31
+207.06356852045192
+12
+6.043961242755168
+22
+-148.17553659245624
+32
+209.48093499132722
+13
+6.043961242755168
+23
+-148.17553659245624
+33
+209.48093499132722
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.940524972921558
+20
+-147.59751037868023
+30
+209.27102020842986
+11
+5.688323009121401
+21
+-148.78672325744412
+31
+211.39450598324876
+12
+6.043961242755168
+22
+-148.17553659245624
+32
+209.48093499132722
+13
+6.043961242755168
+23
+-148.17553659245624
+33
+209.48093499132722
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.431282756487657
+20
+-142.65751582115428
+30
+199.75092846754038
+11
+2.2849655072729367
+21
+-141.74666819797247
+31
+199.75579605670927
+12
+2.4869704577714975
+22
+-142.09348392623886
+32
+202.84519405718038
+13
+2.4869704577714975
+23
+-142.09348392623886
+33
+202.84519405718038
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.431282756487657
+20
+-142.65751582115428
+30
+199.75092846754038
+11
+2.4869704577714975
+21
+-142.09348392623886
+31
+202.84519405718038
+12
+3.309288802948614
+22
+-142.1835343258585
+32
+201.85159741813166
+13
+3.309288802948614
+23
+-142.1835343258585
+33
+201.85159741813166
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.4869704577714975
+20
+-142.09348392623886
+30
+202.84519405718038
+11
+2.2849655072729367
+21
+-141.74666819797247
+31
+199.75579605670927
+12
+1.6491366721193326
+22
+-142.12268946125084
+32
+202.4490939885823
+13
+1.6491366721193326
+23
+-142.12268946125084
+33
+202.4490939885823
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.309288802948614
+20
+-142.1835343258585
+30
+201.85159741813166
+11
+2.4869704577714975
+21
+-142.09348392623886
+31
+202.84519405718038
+12
+2.2451121209546914
+22
+-142.74269863160657
+32
+204.3255496130927
+13
+2.2451121209546914
+23
+-142.74269863160657
+33
+204.3255496130927
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.309288802948614
+20
+-142.1835343258585
+30
+201.85159741813166
+11
+2.2451121209546914
+21
+-142.74269863160657
+31
+204.3255496130927
+12
+2.9077126965358104
+22
+-142.78802805573957
+32
+204.36083963456542
+13
+2.9077126965358104
+23
+-142.78802805573957
+33
+204.36083963456542
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.4869704577714975
+20
+-142.09348392623886
+30
+202.84519405718038
+11
+1.6491366721193326
+21
+-142.12268946125084
+31
+202.4490939885823
+12
+1.5000667538297359
+22
+-142.69006782372048
+32
+203.62005340796316
+13
+1.5000667538297359
+23
+-142.69006782372048
+33
+203.62005340796316
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.4869704577714975
+20
+-142.09348392623886
+30
+202.84519405718038
+11
+1.5000667538297359
+21
+-142.69006782372048
+31
+203.62005340796316
+12
+2.2451121209546914
+22
+-142.74269863160657
+32
+204.3255496130927
+13
+2.2451121209546914
+23
+-142.74269863160657
+33
+204.3255496130927
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.9077126965358104
+20
+-142.78802805573957
+30
+204.36083963456542
+11
+2.2451121209546914
+21
+-142.74269863160657
+31
+204.3255496130927
+12
+2.177574321239816
+22
+-144.38338040576173
+32
+206.00699744653457
+13
+2.177574321239816
+23
+-144.38338040576173
+33
+206.00699744653457
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.0251432852292552
+20
+-144.43175207312518
+30
+206.132337867627
+11
+2.9077126965358104
+21
+-142.78802805573957
+31
+204.36083963456542
+12
+2.177574321239816
+22
+-144.38338040576173
+32
+206.00699744653457
+13
+2.177574321239816
+23
+-144.38338040576173
+33
+206.00699744653457
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.2451121209546914
+20
+-142.74269863160657
+30
+204.3255496130927
+11
+1.5000667538297359
+21
+-142.69006782372048
+31
+203.62005340796316
+12
+1.5414412617631732
+22
+-144.26016955493043
+32
+205.64192825888657
+13
+1.5414412617631732
+23
+-144.26016955493043
+33
+205.64192825888657
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.2451121209546914
+20
+-142.74269863160657
+30
+204.3255496130927
+11
+1.5414412617631732
+21
+-144.26016955493043
+31
+205.64192825888657
+12
+2.177574321239816
+22
+-144.38338040576173
+32
+206.00699744653457
+13
+2.177574321239816
+23
+-144.38338040576173
+33
+206.00699744653457
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.020623870886214313
+20
+-146.8524650115545
+30
+206.52174500111724
+11
+0.020623870886214313
+21
+-149.1119390587734
+31
+208.99235072852483
+12
+0.6902216058972507
+22
+-147.65500877573453
+32
+208.63458292463005
+13
+0.6902216058972507
+23
+-147.65500877573453
+33
+208.63458292463005
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.4599091431884523
+20
+-145.9516567910334
+30
+206.81836371608185
+11
+0.020623870886214313
+21
+-146.8524650115545
+31
+206.52174500111724
+12
+0.6902216058972507
+22
+-147.65500877573453
+32
+208.63458292463005
+13
+0.6902216058972507
+23
+-147.65500877573453
+33
+208.63458292463005
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.4599091431884523
+20
+-145.9516567910334
+30
+206.81836371608185
+11
+0.6902216058972507
+21
+-147.65500877573453
+31
+208.63458292463005
+12
+1.3725967624759676
+22
+-147.52571343844255
+32
+208.32001497460666
+13
+1.3725967624759676
+23
+-147.52571343844255
+33
+208.32001497460666
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.4446686267014033
+20
+-146.30029786523707
+30
+207.11163596349218
+11
+3.768971755062046
+21
+-147.99969493373894
+31
+208.86853142904772
+12
+4.992257758005866
+22
+-147.85488415597203
+32
+209.10917286857205
+13
+4.992257758005866
+23
+-147.85488415597203
+33
+209.10917286857205
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.992257758005866
+20
+-147.85488415597203
+30
+209.10917286857205
+11
+4.702027753825728
+21
+-146.55432517497565
+31
+207.46453617821862
+12
+3.4446686267014033
+22
+-146.30029786523707
+32
+207.11163596349218
+13
+3.4446686267014033
+23
+-146.30029786523707
+33
+207.11163596349218
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.127622931591159
+20
+-147.62397789478413
+30
+207.0151968530882
+11
+6.043961242755168
+21
+-148.17553659245624
+31
+209.48093499132722
+12
+5.549900942138194
+22
+-149.5095602489866
+32
+209.30022574344088
+13
+5.549900942138194
+23
+-149.5095602489866
+33
+209.30022574344088
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.127622931591159
+20
+-147.62397789478413
+30
+207.0151968530882
+11
+5.549900942138194
+21
+-149.5095602489866
+31
+209.30022574344088
+12
+5.7601199493588595
+22
+-149.0547448860413
+32
+207.22419896301625
+13
+5.7601199493588595
+23
+-149.0547448860413
+33
+207.22419896301625
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.4589671698842874
+20
+-150.48612032594508
+30
+208.75748955113747
+11
+1.8766964657532548
+21
+-150.30176038618202
+31
+206.46637617432327
+12
+3.388082902615978
+22
+-150.16120874893758
+32
+206.77151317033253
+13
+3.388082902615978
+23
+-150.16120874893758
+33
+206.77151317033253
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.4589671698842874
+20
+-150.48612032594508
+30
+208.75748955113747
+11
+2.1915686400996504
+21
+-150.6123734200067
+31
+208.7571853268144
+12
+1.8766964657532548
+22
+-150.30176038618202
+32
+206.46637617432327
+13
+1.8766964657532548
+23
+-150.30176038618202
+33
+206.46637617432327
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.1915686400996504
+20
+-150.6123734200067
+30
+208.7571853268144
+11
+1.2426929765378922
+21
+-150.26981683226288
+31
+206.47063531484585
+12
+1.8766964657532548
+22
+-150.30176038618202
+32
+206.46637617432327
+13
+1.8766964657532548
+23
+-150.30176038618202
+33
+206.46637617432327
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.1915686400996504
+20
+-150.6123734200067
+30
+208.7571853268144
+11
+1.3677291733073307
+21
+-150.5603510607666
+31
+208.7288924647715
+12
+1.2426929765378922
+22
+-150.26981683226288
+32
+206.47063531484585
+13
+1.2426929765378922
+23
+-150.26981683226288
+33
+206.47063531484585
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.3677291733073307
+20
+-150.5603510607666
+30
+208.7288924647715
+11
+1.0126993883196627
+21
+-150.17672418941257
+31
+206.5077506822569
+12
+1.2426929765378922
+22
+-150.26981683226288
+32
+206.47063531484585
+13
+1.2426929765378922
+23
+-150.26981683226288
+33
+206.47063531484585
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.3677291733073307
+20
+-150.5603510607666
+30
+208.7288924647715
+11
+0.9780178154930815
+21
+-150.54392294732264
+31
+208.77057119702832
+12
+1.0126993883196627
+22
+-150.17672418941257
+32
+206.5077506822569
+13
+1.0126993883196627
+23
+-150.17672418941257
+33
+206.5077506822569
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.0126993883196627
+20
+-150.17672418941257
+30
+206.5077506822569
+11
+0.9780178154930815
+21
+-150.54392294732264
+31
+208.77057119702832
+12
+0.7668861353033347
+22
+-149.98658398751266
+32
+206.5664659766037
+13
+0.7668861353033347
+23
+-149.98658398751266
+33
+206.5664659766037
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.9780178154930815
+20
+-150.54392294732264
+30
+208.77057119702832
+11
+0.8012634838068549
+21
+-150.47851471786885
+31
+208.85910047503285
+12
+0.7668861353033347
+22
+-149.98658398751266
+32
+206.5664659766037
+13
+0.7668861353033347
+23
+-149.98658398751266
+33
+206.5664659766037
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.7601199493588595
+20
+-149.0547448860413
+30
+207.22419896301625
+11
+5.549900942138194
+21
+-149.5095602489866
+31
+209.30022574344088
+12
+5.232290748884453
+22
+-149.72951443454474
+32
+209.28683987322728
+13
+5.232290748884453
+23
+-149.72951443454474
+33
+209.28683987322728
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.7601199493588595
+20
+-149.0547448860413
+30
+207.22419896301625
+11
+5.232290748884453
+21
+-149.72951443454474
+31
+209.28683987322728
+12
+5.383794461758368
+22
+-149.24762310684855
+32
+207.06265584748198
+13
+5.383794461758368
+23
+-149.24762310684855
+33
+207.06265584748198
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.383794461758368
+20
+-149.24762310684855
+30
+207.06265584748198
+11
+5.232290748884453
+21
+-149.72951443454474
+31
+209.28683987322728
+12
+3.4589671698842874
+22
+-150.48612032594508
+32
+208.75748955113747
+13
+3.4589671698842874
+23
+-150.48612032594508
+33
+208.75748955113747
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.383794461758368
+20
+-149.24762310684855
+30
+207.06265584748198
+11
+3.4589671698842874
+21
+-150.48612032594508
+31
+208.75748955113747
+12
+3.388082902615978
+22
+-150.16120874893758
+32
+206.77151317033253
+13
+3.388082902615978
+23
+-150.16120874893758
+33
+206.77151317033253
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.8012634838068549
+20
+-150.47851471786885
+30
+208.85910047503285
+11
+0.804914175683327
+21
+-150.67017604138462
+31
+210.77145456966227
+12
+0.020623870886214313
+22
+-149.1119390587734
+32
+208.99235072852483
+13
+0.020623870886214313
+23
+-149.1119390587734
+33
+208.99235072852483
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.020623870886214313
+20
+-149.1119390587734
+30
+208.99235072852483
+11
+0.804914175683327
+21
+-150.67017604138462
+31
+210.77145456966227
+12
+0.020623870886214313
+22
+-149.42285631692067
+32
+211.0197016172632
+13
+0.020623870886214313
+23
+-149.42285631692067
+33
+211.0197016172632
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.6902216058972507
+20
+-147.65500877573453
+30
+208.63458292463005
+11
+0.020623870886214313
+21
+-149.1119390587734
+31
+208.99235072852483
+12
+0.020623870886214313
+22
+-149.42285631692067
+32
+211.0197016172632
+13
+0.020623870886214313
+23
+-149.42285631692067
+33
+211.0197016172632
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.6902216058972507
+20
+-147.65500877573453
+30
+208.63458292463005
+11
+0.020623870886214313
+21
+-149.42285631692067
+31
+211.0197016172632
+12
+0.6823117734982183
+22
+-148.78003032233696
+32
+210.25183942591056
+13
+0.6823117734982183
+23
+-148.78003032233696
+33
+210.25183942591056
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.3725967624759676
+20
+-147.52571343844255
+30
+208.32001497460666
+11
+0.6902216058972507
+21
+-147.65500877573453
+31
+208.63458292463005
+12
+0.6823117734982183
+22
+-148.78003032233696
+32
+210.25183942591056
+13
+0.6823117734982183
+23
+-148.78003032233696
+33
+210.25183942591056
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.3725967624759676
+20
+-147.52571343844255
+30
+208.32001497460666
+11
+0.6823117734982183
+21
+-148.78003032233696
+31
+210.25183942591056
+12
+1.2709858385806103
+22
+-148.72314037392835
+32
+210.02062894039977
+13
+1.2709858385806103
+23
+-148.72314037392835
+33
+210.02062894039977
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.884866571972756
+20
+-148.91297635150562
+30
+210.93543147978124
+11
+3.768971755062046
+21
+-147.99969493373894
+31
+208.86853142904772
+12
+3.379260397247808
+22
+-148.95222128917771
+32
+210.67319011332089
+13
+3.379260397247808
+23
+-148.95222128917771
+33
+210.67319011332089
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.992257758005866
+20
+-147.85488415597203
+30
+209.10917286857205
+11
+3.768971755062046
+21
+-147.99969493373894
+31
+208.86853142904772
+12
+4.884866571972756
+22
+-148.91297635150562
+32
+210.93543147978124
+13
+4.884866571972756
+23
+-148.91297635150562
+33
+210.93543147978124
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.043961242755168
+20
+-148.17553659245624
+30
+209.48093499132722
+11
+5.688323009121401
+21
+-148.78672325744412
+31
+211.39450598324876
+12
+5.4333830264138765
+22
+-149.25583716357175
+32
+211.21501363265492
+13
+5.4333830264138765
+23
+-149.25583716357175
+33
+211.21501363265492
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.549900942138194
+20
+-149.5095602489866
+30
+209.30022574344088
+11
+6.043961242755168
+21
+-148.17553659245624
+31
+209.48093499132722
+12
+5.4333830264138765
+22
+-149.25583716357175
+32
+211.21501363265492
+13
+5.4333830264138765
+23
+-149.25583716357175
+33
+211.21501363265492
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.4589671698842874
+20
+-150.48612032594508
+30
+208.75748955113747
+11
+3.372567462140918
+21
+-150.67595630352236
+31
+210.58922420016128
+12
+2.1915686400996504
+22
+-150.6123734200067
+32
+208.7571853268144
+13
+2.1915686400996504
+23
+-150.6123734200067
+33
+208.7571853268144
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.372567462140918
+20
+-150.67595630352236
+30
+210.58922420016128
+11
+2.18730949957709
+21
+-150.6841703602444
+31
+210.59835092985261
+12
+2.1915686400996504
+22
+-150.6123734200067
+32
+208.7571853268144
+13
+2.1915686400996504
+23
+-150.6123734200067
+33
+208.7571853268144
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.1915686400996504
+20
+-150.6123734200067
+30
+208.7571853268144
+11
+2.18730949957709
+21
+-150.6841703602444
+31
+210.59835092985261
+12
+1.3677291733073307
+22
+-150.5603510607666
+32
+208.7288924647715
+13
+1.3677291733073307
+23
+-150.5603510607666
+33
+208.7288924647715
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.18730949957709
+20
+-150.6841703602444
+30
+210.59835092985261
+11
+1.2043607118348614
+21
+-150.65891974143224
+31
+210.65311130799967
+12
+1.3677291733073307
+22
+-150.5603510607666
+32
+208.7288924647715
+13
+1.3677291733073307
+23
+-150.5603510607666
+33
+208.7288924647715
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.3677291733073307
+20
+-150.5603510607666
+30
+208.7288924647715
+11
+1.2043607118348614
+21
+-150.65891974143224
+31
+210.65311130799967
+12
+0.9780178154930815
+22
+-150.54392294732264
+32
+208.77057119702832
+13
+0.9780178154930815
+23
+-150.54392294732264
+33
+208.77057119702832
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.2043607118348614
+20
+-150.65891974143224
+30
+210.65311130799967
+11
+0.804914175683327
+21
+-150.67017604138462
+31
+210.77145456966227
+12
+0.9780178154930815
+22
+-150.54392294732264
+32
+208.77057119702832
+13
+0.9780178154930815
+23
+-150.54392294732264
+33
+208.77057119702832
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.9780178154930815
+20
+-150.54392294732264
+30
+208.77057119702832
+11
+0.804914175683327
+21
+-150.67017604138462
+31
+210.77145456966227
+12
+0.8012634838068549
+22
+-150.47851471786885
+32
+208.85910047503285
+13
+0.8012634838068549
+23
+-150.47851471786885
+33
+208.85910047503285
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.549900942138194
+20
+-149.5095602489866
+30
+209.30022574344088
+11
+5.4333830264138765
+21
+-149.25583716357175
+31
+211.21501363265492
+12
+5.031198471355007
+22
+-149.85607175292978
+32
+211.07415777108739
+13
+5.031198471355007
+23
+-149.85607175292978
+33
+211.07415777108739
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.549900942138194
+20
+-149.5095602489866
+30
+209.30022574344088
+11
+5.031198471355007
+21
+-149.85607175292978
+31
+211.07415777108739
+12
+5.232290748884453
+22
+-149.72951443454474
+32
+209.28683987322728
+13
+5.232290748884453
+23
+-149.72951443454474
+33
+209.28683987322728
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.232290748884453
+20
+-149.72951443454474
+30
+209.28683987322728
+11
+5.031198471355007
+21
+-149.85607175292978
+31
+211.07415777108739
+12
+3.372567462140918
+22
+-150.67595630352236
+32
+210.58922420016128
+13
+3.372567462140918
+23
+-150.67595630352236
+33
+210.58922420016128
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.232290748884453
+20
+-149.72951443454474
+30
+209.28683987322728
+11
+3.372567462140918
+21
+-150.67595630352236
+31
+210.58922420016128
+12
+3.4589671698842874
+22
+-150.48612032594508
+32
+208.75748955113747
+13
+3.4589671698842874
+23
+-150.48612032594508
+33
+208.75748955113747
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.804914175683327
+20
+-150.67017604138462
+30
+210.77145456966227
+11
+0.8295563458495732
+21
+-150.40154596414055
+31
+211.95975477545667
+12
+0.020623870886214313
+22
+-149.42285631692067
+32
+211.0197016172632
+13
+0.020623870886214313
+23
+-149.42285631692067
+33
+211.0197016172632
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.020623870886214313
+20
+-149.42285631692067
+30
+211.0197016172632
+11
+0.8295563458495732
+21
+-150.40154596414055
+31
+211.95975477545667
+12
+0.795787445992141
+22
+-149.94764327416496
+32
+212.28314523084816
+13
+0.795787445992141
+23
+-149.94764327416496
+33
+212.28314523084816
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.795787445992141
+20
+-149.94764327416496
+30
+212.28314523084816
+11
+0.6823117734982183
+21
+-148.78003032233696
+31
+210.25183942591056
+12
+0.020623870886214313
+22
+-149.42285631692067
+32
+211.0197016172632
+13
+0.020623870886214313
+23
+-149.42285631692067
+33
+211.0197016172632
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.0489020827614133
+20
+-149.8728040906971
+30
+212.00295462932849
+11
+0.6823117734982183
+21
+-148.78003032233696
+31
+210.25183942591056
+12
+0.795787445992141
+22
+-149.94764327416496
+32
+212.28314523084816
+13
+0.795787445992141
+23
+-149.94764327416496
+33
+212.28314523084816
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.2709858385806103
+20
+-148.72314037392835
+30
+210.02062894039977
+11
+0.6823117734982183
+21
+-148.78003032233696
+31
+210.25183942591056
+12
+1.0489020827614133
+22
+-149.8728040906971
+32
+212.00295462932849
+13
+1.0489020827614133
+23
+-149.8728040906971
+33
+212.00295462932849
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.640618391074212
+20
+-149.92391377696782
+30
+212.21226096357984
+11
+1.2709858385806103
+21
+-148.72314037392835
+31
+210.02062894039977
+12
+1.0489020827614133
+22
+-149.8728040906971
+32
+212.00295462932849
+13
+1.0489020827614133
+23
+-149.8728040906971
+33
+212.00295462932849
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.873001823374214
+20
+-149.4058197548307
+30
+212.14867808006431
+11
+3.379260397247808
+21
+-148.95222128917771
+31
+210.67319011332089
+12
+3.7342901822354873
+22
+-149.6668442239991
+32
+212.42582643835414
+13
+3.7342901822354873
+23
+-149.6668442239991
+33
+212.42582643835414
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.270623013587484
+20
+-145.4858893524582
+30
+203.86556243665535
+11
+5.632041509359015
+21
+-146.4256382863293
+31
+205.69425484244877
+12
+5.540165763800931
+22
+-147.98448371758607
+32
+205.41193467066725
+13
+5.540165763800931
+23
+-147.98448371758607
+33
+205.41193467066725
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.399309902233417
+20
+-147.4335334685601
+30
+203.47067926534928
+11
+5.270623013587484
+21
+-145.4858893524582
+31
+203.86556243665535
+12
+5.540165763800931
+22
+-147.98448371758607
+32
+205.41193467066725
+13
+5.540165763800931
+23
+-147.98448371758607
+33
+205.41193467066725
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.096317126653084
+20
+-149.23271611501875
+30
+203.72683614534824
+11
+3.7041719742545274
+21
+-149.69513708603995
+31
+205.17524814734148
+12
+2.553899808840285
+22
+-149.98475864157348
+32
+203.2087421232112
+13
+2.553899808840285
+23
+-149.98475864157348
+33
+203.2087421232112
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.7041719742545274
+20
+-149.69513708603995
+30
+205.17524814734148
+11
+1.9287188249930813
+21
+-150.08211042494676
+31
+204.90509694848168
+12
+2.553899808840285
+22
+-149.98475864157348
+32
+203.2087421232112
+13
+2.553899808840285
+23
+-149.98475864157348
+33
+203.2087421232112
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.553899808840285
+20
+-149.98475864157348
+30
+203.2087421232112
+11
+1.9287188249930813
+21
+-150.08211042494676
+31
+204.90509694848168
+12
+1.6546127099340464
+22
+-149.68327233744103
+32
+203.04324409147742
+13
+1.6546127099340464
+23
+-149.68327233744103
+33
+203.04324409147742
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.9287188249930813
+20
+-150.08211042494676
+30
+204.90509694848168
+11
+1.2043607118348614
+21
+-149.95342353630082
+31
+204.93095601594052
+12
+1.6546127099340464
+22
+-149.68327233744103
+32
+203.04324409147742
+13
+1.6546127099340464
+23
+-149.68327233744103
+33
+203.04324409147742
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.6546127099340464
+20
+-149.68327233744103
+30
+203.04324409147742
+11
+1.2043607118348614
+21
+-149.95342353630082
+31
+204.93095601594052
+12
+0.9183898481772497
+22
+-148.72526994418794
+32
+203.1597620072017
+13
+0.9183898481772497
+23
+-148.72526994418794
+33
+203.1597620072017
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.9183898481772497
+20
+-148.72526994418794
+30
+203.1597620072017
+11
+1.2043607118348614
+21
+-149.95342353630082
+31
+204.93095601594052
+12
+0.76536501368812
+22
+-149.3325016929762
+32
+205.0082289939926
+13
+0.76536501368812
+23
+-149.3325016929762
+33
+205.0082289939926
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.9183898481772497
+20
+-148.72526994418794
+30
+203.1597620072017
+11
+0.76536501368812
+21
+-149.3325016929762
+31
+205.0082289939926
+12
+0.6193373386289301
+22
+-147.55674431939136
+32
+203.6060590891021
+13
+0.6193373386289301
+23
+-147.55674431939136
+33
+203.6060590891021
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.6193373386289301
+20
+-147.55674431939136
+30
+203.6060590891021
+11
+0.76536501368812
+21
+-149.3325016929762
+31
+205.0082289939926
+12
+0.5913487009092616
+22
+-148.71066717668248
+32
+205.14239192045363
+13
+0.5913487009092616
+23
+-148.71066717668248
+33
+205.14239192045363
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.761655721141571
+20
+-144.89052235226796
+30
+200.08709634449903
+11
+4.981305682376449
+21
+-146.00550449621002
+31
+201.9236985826909
+12
+4.900077788124767
+22
+-147.70551001335758
+32
+202.02470105793998
+13
+4.900077788124767
+23
+-147.70551001335758
+33
+202.02470105793998
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.761655721141571
+20
+-144.89052235226796
+30
+200.08709634449903
+11
+4.900077788124767
+21
+-147.70551001335758
+31
+202.02470105793998
+12
+4.608935110975491
+22
+-146.12050129031869
+32
+200.25046480597095
+13
+4.608935110975491
+23
+-146.12050129031869
+33
+200.25046480597095
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.608935110975491
+20
+-146.12050129031869
+30
+200.25046480597095
+11
+4.900077788124767
+21
+-147.70551001335758
+31
+202.02470105793998
+12
+4.476901754776124
+22
+-148.5953661582495
+32
+201.98606456891372
+13
+4.476901754776124
+23
+-148.5953661582495
+33
+201.98606456891372
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.431268106320126
+20
+-147.01765881896355
+30
+200.04237536901124
+11
+4.608935110975491
+21
+-146.12050129031869
+31
+200.25046480597095
+12
+4.476901754776124
+22
+-148.5953661582495
+32
+201.98606456891372
+13
+4.476901754776124
+23
+-148.5953661582495
+33
+201.98606456891372
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.981305682376449
+20
+-146.00550449621002
+30
+201.9236985826909
+11
+5.399309902233417
+21
+-147.4335334685601
+31
+203.47067926534928
+12
+5.075006773872774
+22
+-148.32673608100555
+32
+203.40131611969545
+13
+5.075006773872774
+23
+-148.32673608100555
+33
+203.40131611969545
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.981305682376449
+20
+-146.00550449621002
+30
+201.9236985826909
+11
+5.075006773872774
+21
+-148.32673608100555
+31
+203.40131611969545
+12
+4.900077788124767
+22
+-147.70551001335758
+32
+202.02470105793998
+13
+4.900077788124767
+23
+-147.70551001335758
+33
+202.02470105793998
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.075006773872774
+20
+-148.32673608100555
+30
+203.40131611969545
+11
+4.096317126653084
+21
+-149.23271611501875
+31
+203.72683614534824
+12
+4.900077788124767
+22
+-147.70551001335758
+32
+202.02470105793998
+13
+4.900077788124767
+23
+-147.70551001335758
+33
+202.02470105793998
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.476901754776124
+20
+-148.5953661582495
+30
+201.98606456891372
+11
+4.900077788124767
+21
+-147.70551001335758
+31
+202.02470105793998
+12
+4.096317126653084
+22
+-149.23271611501875
+32
+203.72683614534824
+13
+4.096317126653084
+23
+-149.23271611501875
+33
+203.72683614534824
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.399309902233417
+20
+-147.4335334685601
+30
+203.47067926534928
+11
+5.540165763800931
+21
+-147.98448371758607
+31
+205.41193467066725
+12
+5.216775308409404
+22
+-148.67476870656373
+32
+205.10892724491933
+13
+5.216775308409404
+23
+-148.67476870656373
+33
+205.10892724491933
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.075006773872774
+20
+-148.32673608100555
+30
+203.40131611969545
+11
+5.399309902233417
+21
+-147.4335334685601
+31
+203.47067926534928
+12
+5.216775308409404
+22
+-148.67476870656373
+32
+205.10892724491933
+13
+5.216775308409404
+23
+-148.67476870656373
+33
+205.10892724491933
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.216775308409404
+20
+-148.67476870656373
+30
+205.10892724491933
+11
+3.7041719742545274
+21
+-149.69513708603995
+31
+205.17524814734148
+12
+5.075006773872774
+22
+-148.32673608100555
+32
+203.40131611969545
+13
+5.075006773872774
+23
+-148.32673608100555
+33
+203.40131611969545
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.075006773872774
+20
+-148.32673608100555
+30
+203.40131611969545
+11
+3.7041719742545274
+21
+-149.69513708603995
+31
+205.17524814734148
+12
+4.096317126653084
+22
+-149.23271611501875
+32
+203.72683614534824
+13
+4.096317126653084
+23
+-149.23271611501875
+33
+203.72683614534824
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.5913487009092616
+20
+-148.71066717668248
+30
+205.14239192045363
+11
+0.7668861353033347
+21
+-149.98658398751266
+31
+206.5664659766037
+12
+0.020623870886214313
+22
+-146.99119130286047
+32
+205.32766453318507
+13
+0.020623870886214313
+23
+-146.99119130286047
+33
+205.32766453318507
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.020623870886214313
+20
+-146.99119130286047
+30
+205.32766453318507
+11
+0.7668861353033347
+21
+-149.98658398751266
+31
+206.5664659766037
+12
+0.020623870886214313
+22
+-148.53847620984223
+32
+206.6933275193114
+13
+0.020623870886214313
+23
+-148.53847620984223
+33
+206.6933275193114
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.4845366631871793
+20
+-141.63349674980125
+30
+198.2620546305829
+11
+1.7181955934494226
+21
+-141.9261605485656
+31
+198.12758747979916
+12
+1.2238310685094096
+22
+-142.2027004582095
+32
+200.13151309566348
+13
+1.2238310685094096
+23
+-142.2027004582095
+33
+200.13151309566348
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.219527977484292
+20
+-142.6687721211069
+30
+199.89726036692267
+11
+3.169345614350192
+21
+-142.1178218720809
+31
+198.15222964996534
+12
+3.431282756487657
+22
+-142.65751582115428
+32
+199.75092846754038
+13
+3.431282756487657
+23
+-142.65751582115428
+33
+199.75092846754038
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.497893233065887
+20
+-142.9504838442413
+30
+197.96604436426463
+11
+4.734883980714045
+21
+-143.50812702837408
+31
+199.94532780996272
+12
+4.761655721141571
+22
+-144.89052235226796
+32
+200.08709634449903
+13
+4.761655721141571
+23
+-144.89052235226796
+33
+200.08709634449903
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.219527977484292
+20
+-142.6687721211069
+30
+199.89726036692267
+11
+4.128869129218374
+21
+-142.46311647873134
+31
+198.24471384416938
+12
+3.169345614350192
+22
+-142.1178218720809
+32
+198.15222964996534
+13
+3.169345614350192
+23
+-142.1178218720809
+33
+198.15222964996534
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.4845366631871793
+20
+-141.63349674980125
+30
+198.2620546305829
+11
+1.2238310685094096
+21
+-142.2027004582095
+31
+200.13151309566348
+12
+2.2849655072729367
+22
+-141.74666819797247
+32
+199.75579605670927
+13
+2.2849655072729367
+23
+-141.74666819797247
+33
+199.75579605670927
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.4142754947324547
+20
+-144.4229295677549
+30
+198.0369286315323
+11
+1.3540390787705348
+21
+-147.55796121668243
+31
+199.42692956350155
+12
+0.7939621000538993
+22
+-145.560120087279
+32
+200.10261178497393
+13
+0.7939621000538993
+23
+-145.560120087279
+33
+200.10261178497393
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.3540390787705348
+20
+-147.55796121668243
+30
+199.42692956350155
+11
+1.4142754947324547
+21
+-144.4229295677549
+31
+198.0369286315323
+12
+1.8325839389124492
+22
+-145.91454142361988
+32
+197.53252470393195
+13
+1.8325839389124492
+23
+-145.91454142361988
+33
+197.53252470393195
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.2633362800020365
+20
+-144.84519292813448
+30
+198.15375077157984
+11
+4.761655721141571
+21
+-144.89052235226796
+31
+200.08709634449903
+12
+4.608935110975491
+22
+-146.12050129031869
+32
+200.25046480597095
+13
+4.608935110975491
+23
+-146.12050129031869
+33
+200.25046480597095
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.761655721141571
+20
+-144.89052235226796
+30
+200.08709634449903
+11
+4.2633362800020365
+21
+-144.84519292813448
+31
+198.15375077157984
+12
+4.392023168647969
+22
+-143.96233394267233
+32
+198.10872557177015
+13
+4.392023168647969
+23
+-143.96233394267233
+33
+198.10872557177015
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.431268106320126
+20
+-147.01765881896355
+30
+200.04237536901124
+11
+4.2633362800020365
+21
+-144.84519292813448
+31
+198.15375077157984
+12
+4.608935110975491
+22
+-146.12050129031869
+32
+200.25046480597095
+13
+4.608935110975491
+23
+-146.12050129031869
+33
+200.25046480597095
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.2633362800020365
+20
+-144.84519292813448
+30
+198.15375077157984
+11
+4.431268106320126
+21
+-147.01765881896355
+31
+200.04237536901124
+12
+4.128260680572296
+22
+-145.5044470361621
+32
+197.98308092635423
+13
+4.128260680572296
+23
+-145.5044470361621
+33
+197.98308092635423
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.128869129218374
+20
+-142.46311647873134
+30
+198.24471384416938
+11
+4.219527977484292
+21
+-142.6687721211069
+31
+199.89726036692267
+12
+4.734883980714045
+22
+-143.50812702837408
+32
+199.94532780996272
+13
+4.734883980714045
+23
+-143.50812702837408
+33
+199.94532780996272
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.497893233065887
+20
+-142.9504838442413
+30
+197.96604436426463
+11
+4.128869129218374
+21
+-142.46311647873134
+31
+198.24471384416938
+12
+4.734883980714045
+22
+-143.50812702837408
+32
+199.94532780996272
+13
+4.734883980714045
+23
+-143.50812702837408
+33
+199.94532780996272
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.169345614350192
+20
+-142.1178218720809
+30
+198.15222964996534
+11
+2.4845366631871793
+21
+-141.63349674980125
+31
+198.2620546305829
+12
+2.2849655072729367
+22
+-141.74666819797247
+32
+199.75579605670927
+13
+2.2849655072729367
+23
+-141.74666819797247
+33
+199.75579605670927
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.431282756487657
+20
+-142.65751582115428
+30
+199.75092846754038
+11
+3.169345614350192
+21
+-142.1178218720809
+31
+198.15222964996534
+12
+2.2849655072729367
+22
+-141.74666819797247
+32
+199.75579605670927
+13
+2.2849655072729367
+23
+-141.74666819797247
+33
+199.75579605670927
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.9427131438529381
+20
+-143.80748376224489
+30
+197.61922863599887
+11
+3.7495013983874976
+21
+-144.53670946457183
+31
+197.73726767333812
+12
+1.9804369599098808
+22
+-144.325577784382
+32
+197.53921763903915
+13
+1.9804369599098808
+23
+-144.325577784382
+33
+197.53921763903915
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.9427131438529381
+20
+-143.80748376224489
+30
+197.61922863599887
+11
+3.838334900715163
+21
+-143.8211738567817
+31
+197.64204546022665
+12
+3.7495013983874976
+22
+-144.53670946457183
+32
+197.73726767333812
+13
+3.7495013983874976
+23
+-144.53670946457183
+33
+197.73726767333812
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.490012701001859
+20
+-141.9352872782568
+30
+197.7342254301082
+11
+3.210720122283652
+21
+-142.47224320842236
+31
+197.53891341471663
+12
+2.2156023616198084
+22
+-142.26597911740117
+32
+197.67125099523906
+13
+2.2156023616198084
+23
+-142.26597911740117
+33
+197.67125099523906
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.2156023616198084
+20
+-142.26597911740117
+30
+197.67125099523906
+11
+3.210720122283652
+21
+-142.47224320842236
+31
+197.53891341471663
+12
+1.9950397274158032
+22
+-142.74695777212742
+32
+197.65786512502515
+13
+1.9950397274158032
+23
+-142.74695777212742
+33
+197.65786512502515
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.873001823374214
+20
+-149.4058197548307
+30
+212.14867808006431
+11
+3.5143359966775813
+21
+-149.91752506618434
+31
+212.70084522638174
+12
+4.856877934253088
+22
+-149.54941363530563
+32
+212.45685731930413
+13
+4.856877934253088
+23
+-149.54941363530563
+33
+212.45685731930413
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.856877934253088
+20
+-149.54941363530563
+30
+212.45685731930413
+11
+3.5143359966775813
+21
+-149.91752506618434
+31
+212.70084522638174
+12
+3.380173070216912
+22
+-150.32609833202702
+32
+212.51800640823498
+13
+3.380173070216912
+23
+-150.32609833202702
+33
+212.51800640823498
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.5143359966775813
+20
+-149.91752506618434
+30
+212.70084522638174
+11
+2.1854841536388485
+21
+-150.18341712452107
+31
+212.585239983627
+12
+2.1115576431401326
+22
+-150.50893715017392
+32
+212.5009698461448
+13
+2.1115576431401326
+23
+-150.50893715017392
+33
+212.5009698461448
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.856877934253088
+20
+-149.54941363530563
+30
+212.45685731930413
+11
+3.380173070216912
+21
+-150.32609833202702
+31
+212.51800640823498
+12
+5.0068605255118
+22
+-149.7018300211487
+32
+212.64243415635858
+13
+5.0068605255118
+23
+-149.7018300211487
+33
+212.64243415635858
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.5143359966775813
+20
+-149.91752506618434
+30
+212.70084522638174
+11
+2.1115576431401326
+21
+-150.50893715017392
+31
+212.5009698461448
+12
+3.380173070216912
+22
+-150.32609833202702
+32
+212.51800640823498
+13
+3.380173070216912
+23
+-150.32609833202702
+33
+212.51800640823498
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.7342901822354873
+20
+-149.6668442239991
+30
+212.42582643835414
+11
+2.4376861174390165
+21
+-149.91417859863083
+31
+212.52895848386453
+12
+2.1854841536388485
+22
+-150.18341712452107
+32
+212.585239983627
+13
+2.1854841536388485
+23
+-150.18341712452107
+33
+212.585239983627
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.7342901822354873
+20
+-149.6668442239991
+30
+212.42582643835414
+11
+2.1854841536388485
+21
+-150.18341712452107
+31
+212.585239983627
+12
+3.5143359966775813
+22
+-149.91752506618434
+32
+212.70084522638174
+13
+3.5143359966775813
+23
+-149.91752506618434
+33
+212.70084522638174
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.380173070216912
+20
+-150.32609833202702
+30
+212.51800640823498
+11
+2.1115576431401326
+21
+-150.50893715017392
+31
+212.5009698461448
+12
+2.1398505051828507
+22
+-150.55852571482922
+32
+211.82498340034994
+13
+2.1398505051828507
+23
+-150.55852571482922
+33
+211.82498340034994
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.380173070216912
+20
+-150.32609833202702
+30
+212.51800640823498
+11
+2.1398505051828507
+21
+-150.55852571482922
+31
+211.82498340034994
+12
+3.326629589361893
+22
+-150.42618813430695
+32
+212.0123855833424
+13
+3.326629589361893
+23
+-150.42618813430695
+33
+212.0123855833424
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.1115576431401326
+20
+-150.50893715017392
+30
+212.5009698461448
+11
+1.3321349275116567
+21
+-150.5065033555895
+31
+212.56881187018274
+12
+1.3041462897919658
+22
+-150.54605251758457
+32
+211.9716195240552
+13
+1.3041462897919658
+23
+-150.54605251758457
+33
+211.9716195240552
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.1398505051828507
+20
+-150.55852571482922
+30
+211.82498340034994
+11
+2.1115576431401326
+21
+-150.50893715017392
+31
+212.5009698461448
+12
+1.3041462897919658
+22
+-150.54605251758457
+32
+211.9716195240552
+13
+1.3041462897919658
+23
+-150.54605251758457
+33
+211.9716195240552
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.4376861174390165
+20
+-149.91417859863083
+30
+212.52895848386453
+11
+1.640618391074212
+21
+-149.92391377696782
+31
+212.21226096357984
+12
+1.5119315024283013
+22
+-150.2001494622883
+32
+212.68776358049143
+13
+1.5119315024283013
+23
+-150.2001494622883
+33
+212.68776358049143
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.4376861174390165
+20
+-149.91417859863083
+30
+212.52895848386453
+11
+1.5119315024283013
+21
+-150.2001494622883
+31
+212.68776358049143
+12
+2.1854841536388485
+22
+-150.18341712452107
+32
+212.585239983627
+13
+2.1854841536388485
+23
+-150.18341712452107
+33
+212.585239983627
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.1854841536388485
+20
+-150.18341712452107
+30
+212.585239983627
+11
+1.5119315024283013
+21
+-150.2001494622883
+31
+212.68776358049143
+12
+1.3321349275116567
+22
+-150.5065033555895
+32
+212.56881187018274
+13
+1.3321349275116567
+23
+-150.5065033555895
+33
+212.56881187018274
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+2.1854841536388485
+20
+-150.18341712452107
+30
+212.585239983627
+11
+1.3321349275116567
+21
+-150.5065033555895
+31
+212.56881187018274
+12
+2.1115576431401326
+22
+-150.50893715017392
+32
+212.5009698461448
+13
+2.1115576431401326
+23
+-150.50893715017392
+33
+212.5009698461448
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.3321349275116567
+20
+-150.5065033555895
+30
+212.56881187018274
+11
+0.8295563458495732
+21
+-150.40154596414055
+31
+211.95975477545667
+12
+1.3041462897919658
+22
+-150.54605251758457
+32
+211.9716195240552
+13
+1.3041462897919658
+23
+-150.54605251758457
+33
+211.9716195240552
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.3321349275116567
+20
+-150.5065033555895
+30
+212.56881187018274
+11
+0.9819727316926147
+21
+-150.30419418076787
+31
+212.53960633517076
+12
+0.8295563458495732
+22
+-150.40154596414055
+32
+211.95975477545667
+13
+0.8295563458495732
+23
+-150.40154596414055
+33
+211.95975477545667
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.8295563458495732
+20
+-150.40154596414055
+30
+211.95975477545667
+11
+0.9819727316926147
+21
+-150.30419418076787
+31
+212.53960633517076
+12
+0.795787445992141
+22
+-149.94764327416496
+32
+212.28314523084816
+13
+0.795787445992141
+23
+-149.94764327416496
+33
+212.28314523084816
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.9987050694598059
+20
+-150.14295528955677
+30
+212.52378667037277
+11
+1.3321349275116567
+21
+-150.5065033555895
+31
+212.56881187018274
+12
+1.5119315024283013
+22
+-150.2001494622883
+32
+212.68776358049143
+13
+1.5119315024283013
+23
+-150.2001494622883
+33
+212.68776358049143
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.9987050694598059
+20
+-150.14295528955677
+30
+212.52378667037277
+11
+0.9819727316926147
+21
+-150.30419418076787
+31
+212.53960633517076
+12
+1.3321349275116567
+22
+-150.5065033555895
+32
+212.56881187018274
+13
+1.3321349275116567
+23
+-150.5065033555895
+33
+212.56881187018274
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.0489020827614133
+20
+-149.8728040906971
+30
+212.00295462932849
+11
+0.795787445992141
+21
+-149.94764327416496
+31
+212.28314523084816
+12
+0.9987050694598059
+22
+-150.14295528955677
+32
+212.52378667037277
+13
+0.9987050694598059
+23
+-150.14295528955677
+33
+212.52378667037277
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.640618391074212
+20
+-149.92391377696782
+30
+212.21226096357984
+11
+1.0489020827614133
+21
+-149.8728040906971
+31
+212.00295462932849
+12
+0.9987050694598059
+22
+-150.14295528955677
+32
+212.52378667037277
+13
+0.9987050694598059
+23
+-150.14295528955677
+33
+212.52378667037277
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.640618391074212
+20
+-149.92391377696782
+30
+212.21226096357984
+11
+0.9987050694598059
+21
+-150.14295528955677
+31
+212.52378667037277
+12
+1.5119315024283013
+22
+-150.2001494622883
+32
+212.68776358049143
+13
+1.5119315024283013
+23
+-150.2001494622883
+33
+212.68776358049143
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.3601235652313366
+20
+-143.13028041915797
+30
+198.21459563618828
+11
+0.7939621000538993
+21
+-145.560120087279
+31
+200.10261178497393
+12
+0.7319003381537377
+22
+-143.81721894058285
+32
+200.30613785708806
+13
+0.7319003381537377
+23
+-143.81721894058285
+33
+200.30613785708806
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+0.7939621000538993
+20
+-145.560120087279
+30
+200.10261178497393
+11
+1.3601235652313366
+21
+-143.13028041915797
+31
+198.21459563618828
+12
+1.4142754947324547
+22
+-144.4229295677549
+32
+198.0369286315323
+13
+1.4142754947324547
+23
+-144.4229295677549
+33
+198.0369286315323
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.2238310685094096
+20
+-142.2027004582095
+30
+200.13151309566348
+11
+1.3601235652313366
+21
+-143.13028041915797
+31
+198.21459563618828
+12
+0.7319003381537377
+22
+-143.81721894058285
+32
+200.30613785708806
+13
+0.7319003381537377
+23
+-143.81721894058285
+33
+200.30613785708806
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+1.3601235652313366
+20
+-143.13028041915797
+30
+198.21459563618828
+11
+1.2238310685094096
+21
+-142.2027004582095
+31
+200.13151309566348
+12
+1.7181955934494226
+22
+-141.9261605485656
+32
+198.12758747979916
+13
+1.7181955934494226
+23
+-141.9261605485656
+33
+198.12758747979916
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+3.2937733624735763
+20
+-148.4450793426672
+30
+199.72476517575745
+11
+4.128260680572296
+21
+-145.5044470361621
+31
+197.98308092635423
+12
+4.431268106320126
+22
+-147.01765881896355
+32
+200.04237536901124
+13
+4.431268106320126
+23
+-147.01765881896355
+33
+200.04237536901124
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.128260680572296
+20
+-145.5044470361621
+30
+197.98308092635423
+11
+3.2937733624735763
+21
+-148.4450793426672
+31
+199.72476517575745
+12
+3.280083267936769
+22
+-146.5503702587736
+32
+197.72692404635427
+13
+3.280083267936769
+23
+-146.5503702587736
+33
+197.72692404635427
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+4.497893233065887
+20
+-142.9504838442413
+30
+197.96604436426463
+11
+4.761655721141571
+21
+-144.89052235226796
+31
+200.08709634449903
+12
+4.392023168647969
+22
+-143.96233394267233
+32
+198.10872557177015
+13
+4.392023168647969
+23
+-143.96233394267233
+33
+198.10872557177015
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.424311468197846
+20
+-125.71404637376814
+30
+213.93721287522283
+11
+21.19707054905449
+21
+-126.2309234986131
+31
+213.67040814391646
+12
+21.84537258145274
+22
+-127.24368627001321
+32
+213.84868359721764
+13
+21.84537258145274
+23
+-127.24368627001321
+33
+213.84868359721764
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.424311468197846
+20
+-125.71404637376814
+30
+213.93721287522283
+11
+21.84537258145274
+21
+-127.24368627001321
+31
+213.84868359721764
+12
+22.76960607484825
+22
+-127.0532418437902
+32
+213.66128141422504
+13
+22.76960607484825
+23
+-127.0532418437902
+33
+213.66128141422504
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.424311468197846
+20
+-125.71404637376814
+30
+213.93721287522283
+11
+22.76960607484825
+21
+-127.0532418437902
+31
+213.66128141422504
+12
+23.629039787436245
+22
+-127.06693193832693
+32
+213.40269073964126
+13
+23.629039787436245
+23
+-127.06693193832693
+33
+213.40269073964126
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.424311468197846
+20
+-125.71404637376814
+30
+213.93721287522283
+11
+23.629039787436245
+21
+-127.06693193832693
+31
+213.40269073964126
+12
+23.814008175844563
+22
+-125.88471621899356
+32
+213.8751511133228
+13
+23.814008175844563
+23
+-125.88471621899356
+33
+213.8751511133228
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.766215656792237
+20
+-126.82324825557191
+30
+213.38534995322806
+11
+24.82616249859865
+21
+-127.55521197680595
+31
+212.91258535522365
+12
+25.31596365869303
+22
+-128.26162085490483
+32
+212.93814019835852
+13
+25.31596365869303
+23
+-128.26162085490483
+33
+212.93814019835852
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.766215656792237
+20
+-126.82324825557191
+30
+213.38534995322806
+11
+25.31596365869303
+21
+-128.26162085490483
+31
+212.93814019835852
+12
+26.867811930520084
+22
+-127.84605042963248
+32
+213.12037056786
+13
+26.867811930520084
+23
+-127.84605042963248
+33
+213.12037056786
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.867811930520084
+20
+-127.84605042963248
+30
+213.12037056786
+11
+25.31596365869303
+21
+-128.26162085490483
+31
+212.93814019835852
+12
+25.819150689001212
+22
+-128.985370519417
+32
+213.00324420348937
+13
+25.819150689001212
+23
+-128.985370519417
+33
+213.00324420348937
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.867811930520084
+20
+-127.84605042963248
+30
+213.12037056786
+11
+25.819150689001212
+21
+-128.985370519417
+31
+213.00324420348937
+12
+27.267866915317686
+22
+-130.12408216055567
+32
+212.7553013802113
+13
+27.267866915317686
+23
+-130.12408216055567
+33
+212.7553013802113
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.70296629793498
+20
+-131.9755913905767
+30
+211.26460219731499
+11
+25.695027165200887
+21
+-133.38202043599054
+31
+210.87914998002302
+12
+25.379850766531465
+22
+-132.09241353062404
+32
+211.16633774097292
+13
+25.379850766531465
+23
+-132.09241353062404
+33
+211.16633774097292
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.70296629793498
+20
+-131.9755913905767
+30
+211.26460219731499
+11
+24.33757823579641
+21
+-133.20678722591947
+31
+210.72460402391832
+12
+25.695027165200887
+22
+-133.38202043599054
+32
+210.87914998002302
+13
+25.695027165200887
+23
+-133.38202043599054
+33
+210.87914998002302
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.70296629793498
+20
+-131.9755913905767
+30
+211.26460219731499
+11
+21.70482094420825
+21
+-132.30263253784472
+31
+211.43679316415557
+12
+24.33757823579641
+22
+-133.20678722591947
+32
+210.72460402391832
+13
+24.33757823579641
+23
+-133.20678722591947
+33
+210.72460402391832
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.089301887860724
+20
+-125.05965985490569
+30
+200.6632972123419
+11
+27.179946085959124
+21
+-126.14726180977404
+31
+202.06090375238736
+12
+26.771372820116405
+22
+-127.00121948454728
+32
+201.81569894801697
+13
+26.771372820116405
+23
+-127.00121948454728
+33
+201.81569894801697
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.687421557124882
+20
+-125.5071738340974
+30
+200.09409350393392
+11
+26.089301887860724
+21
+-125.05965985490569
+31
+200.6632972123419
+12
+26.771372820116405
+22
+-127.00121948454728
+32
+201.81569894801697
+13
+26.771372820116405
+23
+-127.00121948454728
+33
+201.81569894801697
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.304707358740586
+20
+-126.04412976426298
+30
+200.20057201699746
+11
+26.771372820116405
+21
+-127.00121948454728
+31
+201.81569894801697
+12
+26.305605381542158
+22
+-127.67294678981962
+32
+201.95777170687637
+13
+26.305605381542158
+23
+-127.67294678981962
+33
+201.95777170687637
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.771372820116405
+20
+-127.00121948454728
+30
+201.81569894801697
+11
+25.304707358740586
+21
+-126.04412976426298
+31
+200.20057201699746
+12
+25.687421557124882
+22
+-125.5071738340974
+32
+200.09409350393392
+13
+25.687421557124882
+23
+-125.5071738340974
+33
+200.09409350393392
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.11579870430025
+20
+-122.60609068958898
+30
+204.16826563808598
+11
+24.743109258408733
+21
+-122.3541929501112
+31
+201.68031912426528
+12
+23.48118676643881
+22
+-121.88325369804535
+32
+201.80839756426488
+13
+23.48118676643881
+23
+-121.88325369804535
+33
+201.80839756426488
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.743109258408733
+20
+-122.3541929501112
+30
+201.68031912426528
+11
+24.11579870430025
+21
+-122.60609068958898
+31
+204.16826563808598
+12
+25.708413035414658
+22
+-123.20267458707045
+32
+204.01615347656627
+13
+25.708413035414658
+23
+-123.20267458707045
+33
+204.01615347656627
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.708413035414658
+20
+-123.20267458707045
+30
+204.01615347656627
+11
+25.71175950296809
+21
+-122.84338566155948
+31
+201.54068015998982
+12
+24.743109258408733
+22
+-122.3541929501112
+32
+201.68031912426528
+13
+24.743109258408733
+23
+-122.3541929501112
+33
+201.68031912426528
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.71175950296809
+20
+-122.84338566155948
+30
+201.54068015998982
+11
+25.708413035414658
+21
+-123.20267458707045
+31
+204.01615347656627
+12
+26.88363159531816
+22
+-123.78252614678463
+32
+203.75421633442866
+13
+26.88363159531816
+23
+-123.78252614678463
+33
+203.75421633442866
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.305982856702816
+20
+-121.72505705006436
+30
+201.251362828779
+11
+22.70936965888634
+21
+-121.9450112356224
+31
+201.5072154844554
+12
+20.327597433806176
+22
+-121.92858312217813
+32
+201.15887863457453
+13
+20.327597433806176
+23
+-121.92858312217813
+33
+201.15887863457453
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.510971449761705
+20
+-123.63680269604762
+30
+200.6760746339096
+11
+25.371332485486345
+21
+-124.55373480569006
+31
+200.3076589787083
+12
+19.620580107061222
+22
+-124.51540254098717
+32
+200.90150485728196
+13
+19.620580107061222
+23
+-124.51540254098717
+33
+200.90150485728196
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.590447248912742
+20
+-125.39004746972716
+30
+200.84796137642707
+11
+23.224117213470006
+21
+-126.0806366830278
+31
+200.30279138953924
+12
+22.03855502658313
+22
+-126.30880492530788
+32
+200.58693690725852
+13
+22.03855502658313
+23
+-126.30880492530788
+33
+200.58693690725852
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.327597433806176
+20
+-121.92858312217813
+30
+201.15887863457453
+11
+24.08781006658056
+21
+-122.4676686226051
+31
+201.3240724419851
+12
+19.78425279285673
+22
+-122.4950488116785
+32
+200.80932488740177
+13
+19.78425279285673
+23
+-122.4950488116785
+33
+200.80932488740177
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.327597433806176
+20
+-121.92858312217813
+30
+201.15887863457453
+11
+22.70936965888634
+21
+-121.9450112356224
+31
+201.5072154844554
+12
+24.08781006658056
+22
+-122.4676686226051
+32
+201.3240724419851
+13
+24.08781006658056
+23
+-122.4676686226051
+33
+201.3240724419851
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.78425279285673
+20
+-122.4950488116785
+30
+200.80932488740177
+11
+25.01082666268393
+21
+-123.01618507704607
+31
+200.76825460379123
+12
+19.50680021024426
+22
+-123.41593583752055
+32
+200.71714491752041
+13
+19.50680021024426
+23
+-123.41593583752055
+33
+200.71714491752041
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.01082666268393
+20
+-123.01618507704607
+30
+200.76825460379123
+11
+19.78425279285673
+21
+-122.4950488116785
+31
+200.80932488740177
+12
+24.08781006658056
+22
+-122.4676686226051
+32
+201.3240724419851
+13
+24.08781006658056
+23
+-122.4676686226051
+33
+201.3240724419851
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.01082666268393
+20
+-123.01618507704607
+30
+200.76825460379123
+11
+25.510971449761705
+21
+-123.63680269604762
+31
+200.6760746339096
+12
+19.50680021024426
+22
+-123.41593583752055
+32
+200.71714491752041
+13
+19.50680021024426
+23
+-123.41593583752055
+33
+200.71714491752041
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.50680021024426
+20
+-123.41593583752055
+30
+200.71714491752041
+11
+25.510971449761705
+21
+-123.63680269604762
+31
+200.6760746339096
+12
+19.620580107061222
+22
+-124.51540254098717
+32
+200.90150485728196
+13
+19.620580107061222
+23
+-124.51540254098717
+33
+200.90150485728196
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.620580107061222
+20
+-124.51540254098717
+30
+200.90150485728196
+11
+24.744021931377826
+21
+-125.0526626954756
+31
+200.10656670117868
+12
+20.590447248912742
+22
+-125.39004746972716
+32
+200.84796137642707
+13
+20.590447248912742
+23
+-125.39004746972716
+33
+200.84796137642707
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.620580107061222
+20
+-124.51540254098717
+30
+200.90150485728196
+11
+25.371332485486345
+21
+-124.55373480569006
+31
+200.3076589787083
+12
+24.744021931377826
+22
+-125.0526626954756
+32
+200.10656670117868
+13
+24.744021931377826
+23
+-125.0526626954756
+33
+200.10656670117868
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.744021931377826
+20
+-125.0526626954756
+30
+200.10656670117868
+11
+23.224117213470006
+21
+-126.0806366830278
+31
+200.30279138953924
+12
+20.590447248912742
+22
+-125.39004746972716
+32
+200.84796137642707
+13
+20.590447248912742
+23
+-125.39004746972716
+33
+200.84796137642707
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.590447248912742
+20
+-125.39004746972716
+30
+200.84796137642707
+11
+22.03855502658313
+21
+-126.30880492530788
+31
+200.58693690725852
+12
+22.043118391428738
+22
+-126.81655532046182
+32
+201.0524001215096
+13
+22.043118391428738
+23
+-126.81655532046182
+33
+201.0524001215096
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.590447248912742
+20
+-125.39004746972716
+30
+200.84796137642707
+11
+22.043118391428738
+21
+-126.81655532046182
+31
+201.0524001215096
+12
+20.055012440362333
+22
+-126.1700786340019
+32
+201.30064716911014
+13
+20.055012440362333
+23
+-126.1700786340019
+33
+201.30064716911014
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.620580107061222
+20
+-124.51540254098717
+30
+200.90150485728196
+11
+20.590447248912742
+21
+-125.39004746972716
+31
+200.84796137642707
+12
+20.055012440362333
+22
+-126.1700786340019
+32
+201.30064716911014
+13
+20.055012440362333
+23
+-126.1700786340019
+33
+201.30064716911014
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.620580107061222
+20
+-124.51540254098717
+30
+200.90150485728196
+11
+20.055012440362333
+21
+-126.1700786340019
+31
+201.30064716911014
+12
+18.92634020188394
+22
+-124.78981288036938
+32
+201.41838198212722
+13
+18.92634020188394
+23
+-124.78981288036938
+33
+201.41838198212722
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.50680021024426
+20
+-123.41593583752055
+30
+200.71714491752041
+11
+19.620580107061222
+21
+-124.51540254098717
+31
+200.90150485728196
+12
+18.909912088439775
+22
+-123.71803059029945
+32
+201.1229801644557
+13
+18.909912088439775
+23
+-123.71803059029945
+33
+201.1229801644557
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.909912088439775
+20
+-123.71803059029945
+30
+201.1229801644557
+11
+19.620580107061222
+21
+-124.51540254098717
+31
+200.90150485728196
+12
+18.92634020188394
+22
+-124.78981288036938
+32
+201.41838198212722
+13
+18.92634020188394
+23
+-124.78981288036938
+33
+201.41838198212722
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.50680021024426
+20
+-123.41593583752055
+30
+200.71714491752041
+11
+19.355904946016413
+21
+-122.28087488825865
+31
+201.35662444455045
+12
+19.78425279285673
+22
+-122.4950488116785
+32
+200.80932488740177
+13
+19.78425279285673
+23
+-122.4950488116785
+33
+200.80932488740177
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.355904946016413
+20
+-122.28087488825865
+30
+201.35662444455045
+11
+19.50680021024426
+21
+-123.41593583752055
+31
+200.71714491752041
+12
+18.909912088439775
+22
+-123.71803059029945
+32
+201.1229801644557
+13
+18.909912088439775
+23
+-123.71803059029945
+33
+201.1229801644557
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.327597433806176
+20
+-121.92858312217813
+30
+201.15887863457453
+11
+19.78425279285673
+21
+-122.4950488116785
+31
+200.80932488740177
+12
+19.355904946016413
+22
+-122.28087488825865
+32
+201.35662444455045
+13
+19.355904946016413
+23
+-122.28087488825865
+33
+201.35662444455045
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.802506252239137
+20
+-121.63166018289128
+30
+201.66936704863605
+11
+20.327597433806176
+21
+-121.92858312217813
+31
+201.15887863457453
+12
+19.355904946016413
+22
+-122.28087488825865
+32
+201.35662444455045
+13
+19.355904946016413
+23
+-122.28087488825865
+33
+201.35662444455045
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.305982856702816
+20
+-121.72505705006436
+30
+201.251362828779
+11
+20.327597433806176
+21
+-121.92858312217813
+31
+201.15887863457453
+12
+20.815269023639296
+22
+-121.48167759163259
+32
+202.03048132008462
+13
+20.815269023639296
+23
+-121.48167759163259
+33
+202.03048132008462
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.815269023639296
+20
+-121.48167759163259
+30
+202.03048132008462
+11
+20.327597433806176
+21
+-121.92858312217813
+31
+201.15887863457453
+12
+19.802506252239137
+22
+-121.63166018289128
+32
+201.66936704863605
+13
+19.802506252239137
+23
+-121.63166018289128
+33
+201.66936704863605
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.70936965888634
+20
+-121.9450112356224
+30
+201.5072154844554
+11
+21.305982856702816
+21
+-121.72505705006436
+31
+201.251362828779
+12
+20.815269023639296
+22
+-121.48167759163259
+32
+202.03048132008462
+13
+20.815269023639296
+23
+-121.48167759163259
+33
+202.03048132008462
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.48118676643881
+20
+-121.88325369804535
+30
+201.80839756426488
+11
+22.70936965888634
+21
+-121.9450112356224
+31
+201.5072154844554
+12
+20.815269023639296
+22
+-121.48167759163259
+32
+202.03048132008462
+13
+20.815269023639296
+23
+-121.48167759163259
+33
+202.03048132008462
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.71175950296809
+20
+-122.84338566155948
+30
+201.54068015998982
+11
+25.510971449761705
+21
+-123.63680269604762
+31
+200.6760746339096
+12
+25.01082666268393
+22
+-123.01618507704607
+32
+200.76825460379123
+13
+25.01082666268393
+23
+-123.01618507704607
+33
+200.76825460379123
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.71175950296809
+20
+-122.84338566155948
+30
+201.54068015998982
+11
+26.30378003560393
+21
+-123.78739373595255
+31
+201.28087258811306
+12
+25.510971449761705
+22
+-123.63680269604762
+32
+200.6760746339096
+13
+25.510971449761705
+23
+-123.63680269604762
+33
+200.6760746339096
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.510971449761705
+20
+-123.63680269604762
+30
+200.6760746339096
+11
+26.30378003560393
+21
+-123.78739373595255
+31
+201.28087258811306
+12
+25.371332485486345
+22
+-124.55373480569006
+32
+200.3076589787083
+13
+25.371332485486345
+23
+-124.55373480569006
+33
+200.3076589787083
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.30378003560393
+20
+-123.78739373595255
+30
+201.28087258811306
+11
+26.089301887860724
+21
+-125.05965985490569
+31
+200.6632972123419
+12
+25.371332485486345
+22
+-124.55373480569006
+32
+200.3076589787083
+13
+25.371332485486345
+23
+-124.55373480569006
+33
+200.3076589787083
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.744021931377826
+20
+-125.0526626954756
+30
+200.10656670117868
+11
+25.304707358740586
+21
+-126.04412976426298
+31
+200.20057201699746
+12
+23.224117213470006
+22
+-126.0806366830278
+32
+200.30279138953924
+13
+23.224117213470006
+23
+-126.0806366830278
+33
+200.30279138953924
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.304707358740586
+20
+-126.04412976426298
+30
+200.20057201699746
+11
+23.665546706201066
+21
+-126.76118649366838
+31
+200.62891986383792
+12
+23.224117213470006
+22
+-126.0806366830278
+32
+200.30279138953924
+13
+23.224117213470006
+23
+-126.0806366830278
+33
+200.30279138953924
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.224117213470006
+20
+-126.0806366830278
+30
+200.30279138953924
+11
+23.665546706201066
+21
+-126.76118649366838
+31
+200.62891986383792
+12
+22.043118391428738
+22
+-126.81655532046182
+32
+201.0524001215096
+13
+22.043118391428738
+23
+-126.81655532046182
+33
+201.0524001215096
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.224117213470006
+20
+-126.0806366830278
+30
+200.30279138953924
+11
+22.043118391428738
+21
+-126.81655532046182
+31
+201.0524001215096
+12
+22.03855502658313
+22
+-126.30880492530788
+32
+200.58693690725852
+13
+22.03855502658313
+23
+-126.30880492530788
+33
+200.58693690725852
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.371332485486345
+20
+-124.55373480569006
+30
+200.3076589787083
+11
+26.089301887860724
+21
+-125.05965985490569
+31
+200.6632972123419
+12
+24.744021931377826
+22
+-125.0526626954756
+32
+200.10656670117868
+13
+24.744021931377826
+23
+-125.0526626954756
+33
+200.10656670117868
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.744021931377826
+20
+-125.0526626954756
+30
+200.10656670117868
+11
+26.089301887860724
+21
+-125.05965985490569
+31
+200.6632972123419
+12
+25.687421557124882
+22
+-125.5071738340974
+32
+200.09409350393392
+13
+25.687421557124882
+23
+-125.5071738340974
+33
+200.09409350393392
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.744021931377826
+20
+-125.0526626954756
+30
+200.10656670117868
+11
+25.687421557124882
+21
+-125.5071738340974
+31
+200.09409350393392
+12
+25.304707358740586
+22
+-126.04412976426298
+32
+200.20057201699746
+13
+25.304707358740586
+23
+-126.04412976426298
+33
+200.20057201699746
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.08781006658056
+20
+-122.4676686226051
+30
+201.3240724419851
+11
+22.70936965888634
+21
+-121.9450112356224
+31
+201.5072154844554
+12
+23.48118676643881
+22
+-121.88325369804535
+32
+201.80839756426488
+13
+23.48118676643881
+23
+-121.88325369804535
+33
+201.80839756426488
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.743109258408733
+20
+-122.3541929501112
+30
+201.68031912426528
+11
+24.08781006658056
+21
+-122.4676686226051
+31
+201.3240724419851
+12
+23.48118676643881
+22
+-121.88325369804535
+32
+201.80839756426488
+13
+23.48118676643881
+23
+-121.88325369804535
+33
+201.80839756426488
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.71175950296809
+20
+-122.84338566155948
+30
+201.54068015998982
+11
+25.01082666268393
+21
+-123.01618507704607
+31
+200.76825460379123
+12
+24.743109258408733
+22
+-122.3541929501112
+32
+201.68031912426528
+13
+24.743109258408733
+23
+-122.3541929501112
+33
+201.68031912426528
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.01082666268393
+20
+-123.01618507704607
+30
+200.76825460379123
+11
+24.08781006658056
+21
+-122.4676686226051
+31
+201.3240724419851
+12
+24.743109258408733
+22
+-122.3541929501112
+32
+201.68031912426528
+13
+24.743109258408733
+23
+-122.3541929501112
+33
+201.68031912426528
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.88363159531816
+20
+-123.78252614678463
+30
+203.75421633442866
+11
+27.61924600842888
+21
+-124.59389241633265
+31
+205.3699517140939
+12
+28.120911917121838
+22
+-125.62582132008411
+32
+204.5938754660183
+13
+28.120911917121838
+23
+-125.62582132008411
+33
+204.5938754660183
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.529804057455127
+20
+-124.87925483134363
+30
+203.2759756986094
+11
+26.88363159531816
+21
+-123.78252614678463
+31
+203.75421633442866
+12
+28.120911917121838
+22
+-125.62582132008411
+32
+204.5938754660183
+13
+28.120911917121838
+23
+-125.62582132008411
+33
+204.5938754660183
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.529804057455127
+20
+-124.87925483134363
+30
+203.2759756986094
+11
+28.120911917121838
+21
+-125.62582132008411
+31
+204.5938754660183
+12
+28.1008331118012
+22
+-126.77609348549811
+32
+203.61305624853733
+13
+28.1008331118012
+23
+-126.77609348549811
+33
+203.61305624853733
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.179946085959124
+20
+-126.14726180977404
+30
+202.06090375238736
+11
+27.529804057455127
+21
+-124.87925483134363
+31
+203.2759756986094
+12
+28.1008331118012
+22
+-126.77609348549811
+32
+203.61305624853733
+13
+28.1008331118012
+23
+-126.77609348549811
+33
+203.61305624853733
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.751902463441844
+20
+-128.7444248555669
+30
+203.1405958748555
+11
+24.925948076555787
+21
+-129.38694662582736
+31
+203.54582267314484
+12
+26.305605381542158
+22
+-127.67294678981962
+32
+201.95777170687637
+13
+26.305605381542158
+23
+-127.67294678981962
+33
+201.95777170687637
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.305605381542158
+20
+-127.67294678981962
+30
+201.95777170687637
+11
+24.925948076555787
+21
+-129.38694662582736
+31
+203.54582267314484
+12
+24.33544866553514
+22
+-128.71248130164741
+32
+202.64562290126958
+13
+24.33544866553514
+23
+-128.71248130164741
+33
+202.64562290126958
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.300187944397532
+20
+-128.78154022297767
+30
+203.1771027936201
+11
+24.925948076555787
+21
+-129.38694662582736
+31
+203.54582267314484
+12
+22.299275271428407
+22
+-129.70972863257307
+32
+204.58596563361849
+13
+22.299275271428407
+23
+-129.70972863257307
+33
+204.58596563361849
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.925948076555787
+20
+-129.38694662582736
+30
+203.54582267314484
+11
+22.300187944397532
+21
+-128.78154022297767
+31
+203.1771027936201
+12
+24.33544866553514
+22
+-128.71248130164741
+32
+202.64562290126958
+13
+24.33544866553514
+23
+-128.71248130164741
+33
+202.64562290126958
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.299275271428407
+20
+-129.70972863257307
+30
+204.58596563361849
+11
+22.206791077224256
+21
+-130.72948856340358
+31
+206.1104337163717
+12
+19.878258108676093
+22
+-129.52232644958102
+32
+206.69728243551612
+13
+19.878258108676093
+23
+-129.52232644958102
+33
+206.69728243551612
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.299275271428407
+20
+-129.70972863257307
+30
+204.58596563361849
+11
+19.878258108676093
+21
+-129.52232644958102
+31
+206.69728243551612
+12
+19.950359273236558
+22
+-128.7352981258761
+32
+204.97598121575558
+13
+19.950359273236558
+23
+-128.7352981258761
+33
+204.97598121575558
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.950359273236558
+20
+-128.7352981258761
+30
+204.97598121575558
+11
+19.878258108676093
+21
+-129.52232644958102
+31
+206.69728243551612
+12
+18.581654043879613
+22
+-127.6254877954266
+32
+206.63430800064737
+13
+18.581654043879613
+23
+-127.6254877954266
+33
+206.63430800064737
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.66379461110042
+20
+-126.96684213604458
+30
+204.82143525965208
+11
+19.950359273236558
+21
+-128.7352981258761
+31
+204.97598121575558
+12
+18.581654043879613
+22
+-127.6254877954266
+32
+206.63430800064737
+13
+18.581654043879613
+23
+-127.6254877954266
+33
+206.63430800064737
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.545147125114813
+20
+-125.7295618142408
+30
+204.36844524264586
+11
+18.66379461110042
+21
+-126.96684213604458
+31
+204.82143525965208
+12
+18.581654043879613
+22
+-127.6254877954266
+32
+206.63430800064737
+13
+18.581654043879613
+23
+-127.6254877954266
+33
+206.63430800064737
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.545147125114813
+20
+-125.7295618142408
+30
+204.36844524264586
+11
+18.581654043879613
+21
+-127.6254877954266
+31
+206.63430800064737
+12
+18.72007611086282
+22
+-126.36082728454916
+32
+206.1855771241633
+13
+18.72007611086282
+23
+-126.36082728454916
+33
+206.1855771241633
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.545147125114813
+20
+-125.7295618142408
+30
+204.36844524264586
+11
+18.72007611086282
+21
+-126.36082728454916
+31
+206.1855771241633
+12
+19.082103055280417
+22
+-123.98300997566815
+32
+204.6586752468262
+13
+19.082103055280417
+23
+-123.98300997566815
+33
+204.6586752468262
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.082103055280417
+20
+-123.98300997566815
+30
+204.6586752468262
+11
+18.72007611086282
+21
+-126.36082728454916
+31
+206.1855771241633
+12
+19.316355784021216
+22
+-124.63161623239012
+32
+206.473677558083
+13
+19.316355784021216
+23
+-124.63161623239012
+33
+206.473677558083
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.082103055280417
+20
+-123.98300997566815
+30
+204.6586752468262
+11
+19.316355784021216
+21
+-124.63161623239012
+31
+206.473677558083
+12
+19.746833201122826
+22
+-123.84854282488509
+32
+207.0328418638306
+13
+19.746833201122826
+23
+-123.84854282488509
+33
+207.0328418638306
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.082103055280417
+20
+-123.98300997566815
+30
+204.6586752468262
+11
+19.746833201122826
+21
+-123.84854282488509
+31
+207.0328418638306
+12
+19.598371731479308
+22
+-123.25226315172625
+32
+205.19897764454555
+13
+19.598371731479308
+23
+-123.25226315172625
+33
+205.19897764454555
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.06169072530169
+20
+-122.88384749652498
+30
+205.76300953946205
+11
+19.598371731479308
+21
+-123.25226315172625
+31
+205.19897764454555
+12
+19.746833201122826
+22
+-123.84854282488509
+32
+207.0328418638306
+13
+19.746833201122826
+23
+-123.84854282488509
+33
+207.0328418638306
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.06169072530169
+20
+-122.88384749652498
+30
+205.76300953946205
+11
+19.746833201122826
+21
+-123.84854282488509
+31
+207.0328418638306
+12
+20.97437834458922
+22
+-123.46369905623966
+32
+207.44567427019564
+13
+20.97437834458922
+23
+-123.46369905623966
+33
+207.44567427019564
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.23414196596281
+20
+-123.64075761224885
+30
+207.4596685890558
+11
+21.06169072530169
+21
+-122.88384749652498
+31
+205.76300953946205
+12
+20.97437834458922
+22
+-123.46369905623966
+32
+207.44567427019564
+13
+20.97437834458922
+23
+-123.46369905623966
+33
+207.44567427019564
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.23414196596281
+20
+-123.64075761224885
+30
+207.4596685890558
+11
+24.190333663445056
+21
+-123.1302691981874
+31
+205.68451966411718
+12
+21.06169072530169
+22
+-122.88384749652498
+32
+205.76300953946205
+13
+21.06169072530169
+23
+-122.88384749652498
+33
+205.76300953946205
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.61924600842888
+20
+-124.59389241633265
+30
+205.3699517140939
+11
+27.737893494414486
+21
+-124.79681003980073
+31
+206.9330562858734
+12
+28.37433077821416
+22
+-126.077594439799
+32
+206.44568892036293
+13
+28.37433077821416
+23
+-126.077594439799
+33
+206.44568892036293
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.120911917121838
+20
+-125.62582132008411
+30
+204.5938754660183
+11
+27.61924600842888
+21
+-124.59389241633265
+31
+205.3699517140939
+12
+28.37433077821416
+22
+-126.077594439799
+32
+206.44568892036293
+13
+28.37433077821416
+23
+-126.077594439799
+33
+206.44568892036293
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.120911917121838
+20
+-125.62582132008411
+30
+204.5938754660183
+11
+28.37433077821416
+21
+-126.077594439799
+31
+206.44568892036293
+12
+28.599456777263757
+22
+-127.57437810915553
+32
+205.36630102221628
+13
+28.599456777263757
+23
+-127.57437810915553
+33
+205.36630102221628
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.1008331118012
+20
+-126.77609348549811
+30
+203.61305624853733
+11
+28.120911917121838
+21
+-125.62582132008411
+31
+204.5938754660183
+12
+28.599456777263757
+22
+-127.57437810915553
+32
+205.36630102221628
+13
+28.599456777263757
+23
+-127.57437810915553
+33
+205.36630102221628
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.18755169403513
+20
+-129.91720962088633
+30
+204.41194932083957
+11
+25.226825932042324
+21
+-130.7002830283915
+31
+205.27868441718016
+12
+26.751902463441844
+22
+-128.7444248555669
+32
+203.1405958748555
+13
+26.751902463441844
+23
+-128.7444248555669
+33
+203.1405958748555
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.751902463441844
+20
+-128.7444248555669
+30
+203.1405958748555
+11
+25.226825932042324
+21
+-130.7002830283915
+31
+205.27868441718016
+12
+24.925948076555787
+22
+-129.38694662582736
+32
+203.54582267314484
+13
+24.925948076555787
+23
+-129.38694662582736
+33
+203.54582267314484
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.226825932042324
+20
+-130.7002830283915
+30
+205.27868441718016
+11
+22.299275271428407
+21
+-129.70972863257307
+31
+204.58596563361849
+12
+24.925948076555787
+22
+-129.38694662582736
+32
+203.54582267314484
+13
+24.925948076555787
+23
+-129.38694662582736
+33
+203.54582267314484
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.226825932042324
+20
+-130.7002830283915
+30
+205.27868441718016
+11
+22.206791077224256
+21
+-130.72948856340358
+31
+206.1104337163717
+12
+22.299275271428407
+22
+-129.70972863257307
+32
+204.58596563361849
+13
+22.299275271428407
+23
+-129.70972863257307
+33
+204.58596563361849
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.206791077224256
+20
+-130.72948856340358
+30
+206.1104337163717
+11
+21.92842582164265
+21
+-131.96585621223872
+31
+208.31666850705705
+12
+19.64917719342698
+22
+-130.4313487268251
+32
+209.04893645261475
+13
+19.64917719342698
+23
+-130.4313487268251
+33
+209.04893645261475
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.206791077224256
+20
+-130.72948856340358
+30
+206.1104337163717
+11
+19.64917719342698
+21
+-130.4313487268251
+31
+209.04893645261475
+12
+19.878258108676093
+22
+-129.52232644958102
+32
+206.69728243551612
+13
+19.878258108676093
+23
+-129.52232644958102
+33
+206.69728243551612
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.878258108676093
+20
+-129.52232644958102
+30
+206.69728243551612
+11
+19.64917719342698
+21
+-130.4313487268251
+31
+209.04893645261475
+12
+18.638848216611137
+22
+-128.38574437870415
+32
+209.06475611741362
+13
+18.638848216611137
+23
+-128.38574437870415
+33
+209.06475611741362
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.581654043879613
+20
+-127.6254877954266
+30
+206.63430800064737
+11
+19.878258108676093
+21
+-129.52232644958102
+31
+206.69728243551612
+12
+18.638848216611137
+22
+-128.38574437870415
+32
+209.06475611741362
+13
+18.638848216611137
+23
+-128.38574437870415
+33
+209.06475611741362
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.72007611086282
+20
+-126.36082728454916
+30
+206.1855771241633
+11
+18.581654043879613
+21
+-127.6254877954266
+31
+206.63430800064737
+12
+18.638848216611137
+22
+-128.38574437870415
+32
+209.06475611741362
+13
+18.638848216611137
+23
+-128.38574437870415
+33
+209.06475611741362
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.72007611086282
+20
+-126.36082728454916
+30
+206.1855771241633
+11
+18.638848216611137
+21
+-128.38574437870415
+31
+209.06475611741362
+12
+18.922993734330507
+22
+-127.19318503238722
+32
+208.54696631959976
+13
+18.922993734330507
+23
+-127.19318503238722
+33
+208.54696631959976
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.72007611086282
+20
+-126.36082728454916
+30
+206.1855771241633
+11
+18.922993734330507
+21
+-127.19318503238722
+31
+208.54696631959976
+12
+19.316355784021216
+22
+-124.63161623239012
+32
+206.473677558083
+13
+19.316355784021216
+23
+-124.63161623239012
+33
+206.473677558083
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.575510956748722
+20
+-131.2275037802217
+30
+211.9847011699507
+11
+21.70482094420825
+21
+-132.30263253784472
+31
+211.43679316415557
+12
+23.70296629793498
+22
+-131.9755913905767
+32
+211.26460219731499
+13
+23.70296629793498
+23
+-131.9755913905767
+33
+211.26460219731499
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.819150689001212
+20
+-128.985370519417
+30
+213.00324420348937
+11
+26.185740998264407
+21
+-131.0644395430722
+31
+212.17453714752776
+12
+27.267866915317686
+22
+-130.12408216055567
+32
+212.7553013802113
+13
+27.267866915317686
+23
+-130.12408216055567
+33
+212.7553013802113
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.267866915317686
+20
+-130.12408216055567
+30
+212.7553013802113
+11
+26.185740998264407
+21
+-131.0644395430722
+31
+212.17453714752776
+12
+27.15347856985465
+22
+-132.01361943095674
+32
+211.4203650507111
+13
+27.15347856985465
+23
+-132.01361943095674
+33
+211.4203650507111
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.185740998264407
+20
+-131.0644395430722
+30
+212.17453714752776
+11
+25.379850766531465
+21
+-132.09241353062404
+31
+211.16633774097292
+12
+27.15347856985465
+22
+-132.01361943095674
+32
+211.4203650507111
+13
+27.15347856985465
+23
+-132.01361943095674
+33
+211.4203650507111
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.15347856985465
+20
+-132.01361943095674
+30
+211.4203650507111
+11
+25.379850766531465
+21
+-132.09241353062404
+31
+211.16633774097292
+12
+25.695027165200887
+22
+-133.38202043599054
+32
+210.87914998002302
+13
+25.695027165200887
+23
+-133.38202043599054
+33
+210.87914998002302
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.814008175844563
+20
+-125.88471621899356
+30
+213.8751511133228
+11
+23.629039787436245
+21
+-127.06693193832693
+31
+213.40269073964126
+12
+24.30137554135465
+22
+-127.30331423732909
+32
+213.04188069251592
+13
+24.30137554135465
+23
+-127.30331423732909
+33
+213.04188069251592
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.814008175844563
+20
+-125.88471621899356
+30
+213.8751511133228
+11
+24.30137554135465
+21
+-127.30331423732909
+31
+213.04188069251592
+12
+24.893396073990495
+22
+-126.42593128968173
+32
+213.6478955440118
+13
+24.893396073990495
+23
+-126.42593128968173
+33
+213.6478955440118
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.893396073990495
+20
+-126.42593128968173
+30
+213.6478955440118
+11
+24.30137554135465
+21
+-127.30331423732909
+31
+213.04188069251592
+12
+24.82616249859865
+22
+-127.55521197680595
+32
+212.91258535522365
+13
+24.82616249859865
+23
+-127.55521197680595
+33
+212.91258535522365
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.893396073990495
+20
+-126.42593128968173
+30
+213.6478955440118
+11
+24.82616249859865
+21
+-127.55521197680595
+31
+212.91258535522365
+12
+25.766215656792237
+22
+-126.82324825557191
+32
+213.38534995322806
+13
+25.766215656792237
+23
+-126.82324825557191
+33
+213.38534995322806
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.819150689001212
+20
+-128.985370519417
+30
+213.00324420348937
+11
+23.7358225248233
+21
+-129.2835103559961
+31
+212.32817043066308
+12
+23.81461662449065
+22
+-129.91447160198112
+32
+212.00903911579445
+13
+23.81461662449065
+23
+-129.91447160198112
+33
+212.00903911579445
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.7358225248233
+20
+-129.2835103559961
+30
+212.32817043066308
+11
+21.56944112045545
+21
+-130.46846409423694
+31
+212.7355267992137
+12
+23.81461662449065
+22
+-129.91447160198112
+32
+212.00903911579445
+13
+23.81461662449065
+23
+-129.91447160198112
+33
+212.00903911579445
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.7358225248233
+20
+-129.2835103559961
+30
+212.32817043066308
+11
+21.185205800455936
+21
+-129.5913853709128
+31
+213.32998112643412
+12
+21.56944112045545
+22
+-130.46846409423694
+32
+212.7355267992137
+13
+21.56944112045545
+23
+-130.46846409423694
+33
+212.7355267992137
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.76960607484825
+20
+-127.0532418437902
+30
+213.66128141422504
+11
+22.95639980919481
+21
+-127.52539799314827
+31
+213.5170790851042
+12
+23.629039787436245
+22
+-127.06693193832693
+32
+213.40269073964126
+13
+23.629039787436245
+23
+-127.06693193832693
+33
+213.40269073964126
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.76960607484825
+20
+-127.0532418437902
+30
+213.66128141422504
+11
+21.84537258145274
+21
+-127.24368627001321
+31
+213.84868359721764
+12
+22.95639980919481
+22
+-127.52539799314827
+32
+213.5170790851042
+13
+22.95639980919481
+23
+-127.52539799314827
+33
+213.5170790851042
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.629039787436245
+20
+-127.06693193832693
+30
+213.40269073964126
+11
+22.95639980919481
+21
+-127.52539799314827
+31
+213.5170790851042
+12
+24.30137554135465
+22
+-127.30331423732909
+32
+213.04188069251592
+13
+24.30137554135465
+23
+-127.30331423732909
+33
+213.04188069251592
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.30137554135465
+20
+-127.30331423732909
+30
+213.04188069251592
+11
+22.95639980919481
+21
+-127.52539799314827
+31
+213.5170790851042
+12
+23.094517651854957
+22
+-128.00911466678176
+32
+213.20768294857254
+13
+23.094517651854957
+23
+-128.00911466678176
+33
+213.20768294857254
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.30137554135465
+20
+-127.30331423732909
+30
+213.04188069251592
+11
+23.094517651854957
+21
+-128.00911466678176
+31
+213.20768294857254
+12
+24.82616249859865
+22
+-127.55521197680595
+32
+212.91258535522365
+13
+24.82616249859865
+23
+-127.55521197680595
+33
+212.91258535522365
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.84537258145274
+20
+-127.24368627001321
+30
+213.84868359721764
+11
+21.417328958935446
+21
+-127.87829820787458
+31
+213.54141703094726
+12
+22.95639980919481
+22
+-127.52539799314827
+32
+213.5170790851042
+13
+22.95639980919481
+23
+-127.52539799314827
+33
+213.5170790851042
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.95639980919481
+20
+-127.52539799314827
+30
+213.5170790851042
+11
+21.417328958935446
+21
+-127.87829820787458
+31
+213.54141703094726
+12
+23.094517651854957
+22
+-128.00911466678176
+32
+213.20768294857254
+13
+23.094517651854957
+23
+-128.00911466678176
+33
+213.20768294857254
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.82616249859865
+20
+-127.55521197680595
+30
+212.91258535522365
+11
+23.094517651854957
+21
+-128.00911466678176
+31
+213.20768294857254
+12
+23.436465790951917
+22
+-128.5983971805101
+32
+212.6868509075274
+13
+23.436465790951917
+23
+-128.5983971805101
+33
+212.6868509075274
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.82616249859865
+20
+-127.55521197680595
+30
+212.91258535522365
+11
+23.436465790951917
+21
+-128.5983971805101
+31
+212.6868509075274
+12
+25.31596365869303
+22
+-128.26162085490483
+32
+212.93814019835852
+13
+25.31596365869303
+23
+-128.26162085490483
+33
+212.93814019835852
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.417328958935446
+20
+-127.87829820787458
+30
+213.54141703094726
+11
+21.007538795800574
+21
+-128.67080256939383
+31
+213.71299954914178
+12
+23.094517651854957
+22
+-128.00911466678176
+32
+213.20768294857254
+13
+23.094517651854957
+23
+-128.00911466678176
+33
+213.20768294857254
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.094517651854957
+20
+-128.00911466678176
+30
+213.20768294857254
+11
+21.007538795800574
+21
+-128.67080256939383
+31
+213.71299954914178
+12
+23.436465790951917
+22
+-128.5983971805101
+32
+212.6868509075274
+13
+23.436465790951917
+23
+-128.5983971805101
+33
+212.6868509075274
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.31596365869303
+20
+-128.26162085490483
+30
+212.93814019835852
+11
+23.436465790951917
+21
+-128.5983971805101
+31
+212.6868509075274
+12
+23.7358225248233
+22
+-129.2835103559961
+32
+212.32817043066308
+13
+23.7358225248233
+23
+-129.2835103559961
+33
+212.32817043066308
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.31596365869303
+20
+-128.26162085490483
+30
+212.93814019835852
+11
+23.7358225248233
+21
+-129.2835103559961
+31
+212.32817043066308
+12
+25.819150689001212
+22
+-128.985370519417
+32
+213.00324420348937
+13
+25.819150689001212
+23
+-128.985370519417
+33
+213.00324420348937
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.436465790951917
+20
+-128.5983971805101
+30
+212.6868509075274
+11
+21.007538795800574
+21
+-128.67080256939383
+31
+213.71299954914178
+12
+21.185205800455936
+22
+-129.5913853709128
+32
+213.32998112643412
+13
+21.185205800455936
+23
+-129.5913853709128
+33
+213.32998112643412
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.436465790951917
+20
+-128.5983971805101
+30
+212.6868509075274
+11
+21.185205800455936
+21
+-129.5913853709128
+31
+213.32998112643412
+12
+23.7358225248233
+22
+-129.2835103559961
+32
+212.32817043066308
+13
+23.7358225248233
+23
+-129.2835103559961
+33
+212.32817043066308
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.819150689001212
+20
+-128.985370519417
+30
+213.00324420348937
+11
+23.81461662449065
+21
+-129.91447160198112
+31
+212.00903911579445
+12
+24.39385973555881
+22
+-130.25216060055533
+32
+212.03581085622156
+13
+24.39385973555881
+23
+-130.25216060055533
+33
+212.03581085622156
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.819150689001212
+20
+-128.985370519417
+30
+213.00324420348937
+11
+24.39385973555881
+21
+-130.25216060055533
+31
+212.03581085622156
+12
+26.185740998264407
+22
+-131.0644395430722
+32
+212.17453714752776
+13
+26.185740998264407
+23
+-131.0644395430722
+33
+212.17453714752776
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.81461662449065
+20
+-129.91447160198112
+30
+212.00903911579445
+11
+21.56944112045545
+21
+-130.46846409423694
+31
+212.7355267992137
+12
+22.575510956748722
+22
+-131.2275037802217
+32
+211.9847011699507
+13
+22.575510956748722
+23
+-131.2275037802217
+33
+211.9847011699507
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.81461662449065
+20
+-129.91447160198112
+30
+212.00903911579445
+11
+22.575510956748722
+21
+-131.2275037802217
+31
+211.9847011699507
+12
+24.39385973555881
+22
+-130.25216060055533
+32
+212.03581085622156
+13
+24.39385973555881
+23
+-130.25216060055533
+33
+212.03581085622156
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.39385973555881
+20
+-130.25216060055533
+30
+212.03581085622156
+11
+23.70296629793498
+21
+-131.9755913905767
+31
+211.26460219731499
+12
+25.379850766531465
+22
+-132.09241353062404
+32
+211.16633774097292
+13
+25.379850766531465
+23
+-132.09241353062404
+33
+211.16633774097292
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.39385973555881
+20
+-130.25216060055533
+30
+212.03581085622156
+11
+25.379850766531465
+21
+-132.09241353062404
+31
+211.16633774097292
+12
+26.185740998264407
+22
+-131.0644395430722
+32
+212.17453714752776
+13
+26.185740998264407
+23
+-131.0644395430722
+33
+212.17453714752776
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.39385973555881
+20
+-130.25216060055533
+30
+212.03581085622156
+11
+22.575510956748722
+21
+-131.2275037802217
+31
+211.9847011699507
+12
+23.70296629793498
+22
+-131.9755913905767
+32
+211.26460219731499
+13
+23.70296629793498
+23
+-131.9755913905767
+33
+211.26460219731499
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.055012440362333
+20
+-126.1700786340019
+30
+201.30064716911014
+11
+22.300187944397532
+21
+-128.78154022297767
+31
+203.1771027936201
+12
+19.80646116843866
+22
+-127.9671317101997
+32
+203.48376091124504
+13
+19.80646116843866
+23
+-127.9671317101997
+33
+203.48376091124504
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.300187944397532
+20
+-128.78154022297767
+30
+203.1771027936201
+11
+20.055012440362333
+21
+-126.1700786340019
+31
+201.30064716911014
+12
+22.043118391428738
+22
+-126.81655532046182
+32
+201.0524001215096
+13
+22.043118391428738
+23
+-126.81655532046182
+33
+201.0524001215096
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.444144649865542
+20
+-126.09310988027333
+30
+203.41257241965405
+11
+20.055012440362333
+21
+-126.1700786340019
+31
+201.30064716911014
+12
+19.80646116843866
+22
+-127.9671317101997
+32
+203.48376091124504
+13
+19.80646116843866
+23
+-127.9671317101997
+33
+203.48376091124504
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.055012440362333
+20
+-126.1700786340019
+30
+201.30064716911014
+11
+18.444144649865542
+21
+-126.09310988027333
+31
+203.41257241965405
+12
+18.92634020188394
+22
+-124.78981288036938
+32
+201.41838198212722
+13
+18.92634020188394
+23
+-124.78981288036938
+33
+201.41838198212722
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.436843266112575
+20
+-124.74904682108242
+30
+203.00004423761223
+11
+18.92634020188394
+21
+-124.78981288036938
+31
+201.41838198212722
+12
+18.444144649865542
+22
+-126.09310988027333
+32
+203.41257241965405
+13
+18.444144649865542
+23
+-126.09310988027333
+33
+203.41257241965405
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.92634020188394
+20
+-124.78981288036938
+30
+201.41838198212722
+11
+18.436843266112575
+21
+-124.74904682108242
+31
+203.00004423761223
+12
+18.909912088439775
+22
+-123.71803059029945
+32
+201.1229801644557
+13
+18.909912088439775
+23
+-123.71803059029945
+33
+201.1229801644557
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.355904946016413
+20
+-122.28087488825865
+30
+201.35662444455045
+11
+18.436843266112575
+21
+-124.74904682108242
+31
+203.00004423761223
+12
+18.980187907062007
+22
+-122.99488937443387
+32
+203.2948376066383
+13
+18.980187907062007
+23
+-122.99488937443387
+33
+203.2948376066383
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.436843266112575
+20
+-124.74904682108242
+30
+203.00004423761223
+11
+19.355904946016413
+21
+-122.28087488825865
+31
+201.35662444455045
+12
+18.909912088439775
+22
+-123.71803059029945
+32
+201.1229801644557
+13
+18.909912088439775
+23
+-123.71803059029945
+33
+201.1229801644557
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.802506252239137
+20
+-121.63166018289128
+30
+201.66936704863605
+11
+18.980187907062007
+21
+-122.99488937443387
+31
+203.2948376066383
+12
+19.504366415659955
+22
+-122.24680176407873
+32
+203.84304983675668
+13
+19.504366415659955
+23
+-122.24680176407873
+33
+203.84304983675668
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.980187907062007
+20
+-122.99488937443387
+30
+203.2948376066383
+11
+19.802506252239137
+21
+-121.63166018289128
+31
+201.66936704863605
+12
+19.355904946016413
+22
+-122.28087488825865
+32
+201.35662444455045
+13
+19.355904946016413
+23
+-122.28087488825865
+33
+201.35662444455045
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.762029767107293
+20
+-122.0651798432239
+30
+204.309121499654
+11
+19.802506252239137
+21
+-121.63166018289128
+31
+201.66936704863605
+12
+19.504366415659955
+22
+-122.24680176407873
+32
+203.84304983675668
+13
+19.504366415659955
+23
+-122.24680176407873
+33
+203.84304983675668
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.802506252239137
+20
+-121.63166018289128
+30
+201.66936704863605
+11
+20.762029767107293
+21
+-122.0651798432239
+31
+204.309121499654
+12
+20.815269023639296
+22
+-121.48167759163259
+32
+202.03048132008462
+13
+20.815269023639296
+23
+-121.48167759163259
+33
+202.03048132008462
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.11579870430025
+20
+-122.60609068958898
+30
+204.16826563808598
+11
+20.815269023639296
+21
+-121.48167759163259
+31
+202.03048132008462
+12
+20.762029767107293
+22
+-122.0651798432239
+32
+204.309121499654
+13
+20.762029767107293
+23
+-122.0651798432239
+33
+204.309121499654
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.815269023639296
+20
+-121.48167759163259
+30
+202.03048132008462
+11
+24.11579870430025
+21
+-122.60609068958898
+31
+204.16826563808598
+12
+23.48118676643881
+22
+-121.88325369804535
+32
+201.80839756426488
+13
+23.48118676643881
+23
+-121.88325369804535
+33
+201.80839756426488
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.529804057455127
+20
+-124.87925483134363
+30
+203.2759756986094
+11
+25.71175950296809
+21
+-122.84338566155948
+31
+201.54068015998982
+12
+26.88363159531816
+22
+-123.78252614678463
+32
+203.75421633442866
+13
+26.88363159531816
+23
+-123.78252614678463
+33
+203.75421633442866
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.71175950296809
+20
+-122.84338566155948
+30
+201.54068015998982
+11
+27.529804057455127
+21
+-124.87925483134363
+31
+203.2759756986094
+12
+26.30378003560393
+22
+-123.78739373595255
+32
+201.28087258811306
+13
+26.30378003560393
+23
+-123.78739373595255
+33
+201.28087258811306
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.30378003560393
+20
+-123.78739373595255
+30
+201.28087258811306
+11
+27.529804057455127
+21
+-124.87925483134363
+31
+203.2759756986094
+12
+27.179946085959124
+22
+-126.14726180977404
+32
+202.06090375238736
+13
+27.179946085959124
+23
+-126.14726180977404
+33
+202.06090375238736
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.089301887860724
+20
+-125.05965985490569
+30
+200.6632972123419
+11
+26.30378003560393
+21
+-123.78739373595255
+31
+201.28087258811306
+12
+27.179946085959124
+22
+-126.14726180977404
+32
+202.06090375238736
+13
+27.179946085959124
+23
+-126.14726180977404
+33
+202.06090375238736
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.665546706201066
+20
+-126.76118649366838
+30
+200.62891986383792
+11
+26.305605381542158
+21
+-127.67294678981962
+31
+201.95777170687637
+12
+24.33544866553514
+22
+-128.71248130164741
+32
+202.64562290126958
+13
+24.33544866553514
+23
+-128.71248130164741
+33
+202.64562290126958
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.305605381542158
+20
+-127.67294678981962
+30
+201.95777170687637
+11
+23.665546706201066
+21
+-126.76118649366838
+31
+200.62891986383792
+12
+25.304707358740586
+22
+-126.04412976426298
+32
+200.20057201699746
+13
+25.304707358740586
+23
+-126.04412976426298
+33
+200.20057201699746
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.665546706201066
+20
+-126.76118649366838
+30
+200.62891986383792
+11
+22.300187944397532
+21
+-128.78154022297767
+31
+203.1771027936201
+12
+22.043118391428738
+22
+-126.81655532046182
+32
+201.0524001215096
+13
+22.043118391428738
+23
+-126.81655532046182
+33
+201.0524001215096
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.300187944397532
+20
+-128.78154022297767
+30
+203.1771027936201
+11
+23.665546706201066
+21
+-126.76118649366838
+31
+200.62891986383792
+12
+24.33544866553514
+22
+-128.71248130164741
+32
+202.64562290126958
+13
+24.33544866553514
+23
+-128.71248130164741
+33
+202.64562290126958
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+18.808301164544417
+20
+-129.03252528948792
+30
+211.85297203807482
+11
+19.658303923118186
+21
+-129.13657000796786
+31
+213.00811179265784
+12
+19.465121477987775
+22
+-128.04349201528512
+32
+212.819492712373
+13
+19.465121477987775
+23
+-128.04349201528512
+33
+212.819492712373
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.465121477987775
+20
+-128.04349201528512
+30
+212.819492712373
+11
+19.658303923118186
+21
+-129.13657000796786
+31
+213.00811179265784
+12
+19.911722784210497
+22
+-128.41799215694763
+32
+213.57244791189686
+13
+19.911722784210497
+23
+-128.41799215694763
+33
+213.57244791189686
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.465121477987775
+20
+-128.04349201528512
+30
+212.819492712373
+11
+19.911722784210497
+21
+-128.41799215694763
+31
+213.57244791189686
+12
+19.838404722357858
+22
+-127.16884708654514
+32
+212.93205571189839
+13
+19.838404722357858
+23
+-127.16884708654514
+33
+212.93205571189839
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.838404722357858
+20
+-127.16884708654514
+30
+212.93205571189839
+11
+19.911722784210497
+21
+-128.41799215694763
+31
+213.57244791189686
+12
+20.327901658129214
+22
+-127.73592122469199
+32
+213.73733749498507
+13
+20.327901658129214
+23
+-127.73592122469199
+33
+213.73733749498507
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.19707054905449
+20
+-126.2309234986131
+30
+213.67040814391646
+11
+19.838404722357858
+21
+-127.16884708654514
+31
+212.93205571189839
+12
+20.327901658129214
+22
+-127.73592122469199
+32
+213.73733749498507
+13
+20.327901658129214
+23
+-127.73592122469199
+33
+213.73733749498507
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.02761760112122
+20
+-125.31672940787789
+30
+212.95395986315782
+11
+19.838404722357858
+21
+-127.16884708654514
+31
+212.93205571189839
+12
+21.19707054905449
+22
+-126.2309234986131
+32
+213.67040814391646
+13
+21.19707054905449
+23
+-126.2309234986131
+33
+213.67040814391646
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.521359027247616
+20
+-124.83544652882863
+30
+213.6071294847245
+11
+21.02761760112122
+21
+-125.31672940787789
+31
+212.95395986315782
+12
+21.19707054905449
+22
+-126.2309234986131
+32
+213.67040814391646
+13
+21.19707054905449
+23
+-126.2309234986131
+33
+213.67040814391646
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.521359027247616
+20
+-124.83544652882863
+30
+213.6071294847245
+11
+21.19707054905449
+21
+-126.2309234986131
+31
+213.67040814391646
+12
+22.424311468197846
+22
+-125.71404637376814
+32
+213.93721287522283
+13
+22.424311468197846
+23
+-125.71404637376814
+33
+213.93721287522283
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.521359027247616
+20
+-124.83544652882863
+30
+213.6071294847245
+11
+22.424311468197846
+21
+-125.71404637376814
+31
+213.93721287522283
+12
+23.814008175844563
+22
+-125.88471621899356
+32
+213.8751511133228
+13
+23.814008175844563
+23
+-125.88471621899356
+33
+213.8751511133228
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.521359027247616
+20
+-124.83544652882863
+30
+213.6071294847245
+11
+23.814008175844563
+21
+-125.88471621899356
+31
+213.8751511133228
+12
+23.816441970428883
+22
+-125.11442023305621
+32
+213.60682526040176
+13
+23.816441970428883
+23
+-125.11442023305621
+33
+213.60682526040176
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.147408733561363
+20
+-126.43779603828018
+30
+213.231716670093
+11
+25.766215656792237
+21
+-126.82324825557191
+31
+213.38534995322806
+12
+26.867811930520084
+22
+-127.84605042963248
+32
+213.12037056786
+13
+26.867811930520084
+23
+-127.84605042963248
+33
+213.12037056786
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.147408733561363
+20
+-126.43779603828018
+30
+213.231716670093
+11
+26.867811930520084
+21
+-127.84605042963248
+31
+213.12037056786
+12
+27.192723507526804
+22
+-127.65621445205525
+32
+212.78815760710043
+13
+27.192723507526804
+23
+-127.65621445205525
+33
+212.78815760710043
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.267866915317686
+20
+-130.12408216055567
+30
+212.7553013802113
+11
+27.192723507526804
+21
+-127.65621445205525
+31
+212.78815760710043
+12
+26.867811930520084
+22
+-127.84605042963248
+32
+213.12037056786
+13
+26.867811930520084
+23
+-127.84605042963248
+33
+213.12037056786
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.192723507526804
+20
+-127.65621445205525
+30
+212.78815760710043
+11
+27.267866915317686
+21
+-130.12408216055567
+31
+212.7553013802113
+12
+27.61955023275193
+22
+-129.74623555133994
+32
+212.62661449156536
+13
+27.61955023275193
+23
+-129.74623555133994
+33
+212.62661449156536
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.142541144392727
+20
+-133.67103354287846
+30
+210.553934178693
+11
+25.695027165200887
+21
+-133.38202043599054
+31
+210.87914998002302
+12
+24.33757823579641
+22
+-133.20678722591947
+32
+210.72460402391832
+13
+24.33757823579641
+23
+-133.20678722591947
+33
+210.72460402391832
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.142541144392727
+20
+-133.67103354287846
+30
+210.553934178693
+11
+24.33757823579641
+21
+-133.20678722591947
+31
+210.72460402391832
+12
+24.353397900594487
+22
+-133.73370375342458
+32
+210.1073328724704
+13
+24.353397900594487
+23
+-133.73370375342458
+33
+210.1073328724704
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.353397900594487
+20
+-133.73370375342458
+30
+210.1073328724704
+11
+24.33757823579641
+21
+-133.20678722591947
+31
+210.72460402391832
+12
+21.481824515419937
+22
+-132.52562896663292
+32
+210.81100373166186
+13
+21.481824515419937
+23
+-132.52562896663292
+33
+210.81100373166186
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.33757823579641
+20
+-133.20678722591947
+30
+210.72460402391832
+11
+21.70482094420825
+21
+-132.30263253784472
+31
+211.43679316415557
+12
+21.481824515419937
+22
+-132.52562896663292
+32
+210.81100373166186
+13
+21.481824515419937
+23
+-132.52562896663292
+33
+210.81100373166186
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.15347856985465
+20
+-132.01361943095674
+30
+211.4203650507111
+11
+27.61955023275193
+21
+-129.74623555133994
+31
+212.62661449156536
+12
+27.267866915317686
+22
+-130.12408216055567
+32
+212.7553013802113
+13
+27.267866915317686
+23
+-130.12408216055567
+33
+212.7553013802113
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.394728458025366
+20
+-132.0695967063961
+30
+211.10883934391842
+11
+27.61955023275193
+21
+-129.74623555133994
+31
+212.62661449156536
+12
+27.15347856985465
+22
+-132.01361943095674
+32
+211.4203650507111
+13
+27.15347856985465
+23
+-132.01361943095674
+33
+211.4203650507111
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.394728458025366
+20
+-132.0695967063961
+30
+211.10883934391842
+11
+27.15347856985465
+21
+-132.01361943095674
+31
+211.4203650507111
+12
+25.695027165200887
+22
+-133.38202043599054
+32
+210.87914998002302
+13
+25.695027165200887
+23
+-133.38202043599054
+33
+210.87914998002302
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.394728458025366
+20
+-132.0695967063961
+30
+211.10883934391842
+11
+25.695027165200887
+21
+-133.38202043599054
+31
+210.87914998002302
+12
+26.142541144392727
+22
+-133.67103354287846
+32
+210.553934178693
+13
+26.142541144392727
+23
+-133.67103354287846
+33
+210.553934178693
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.816441970428883
+20
+-125.11442023305621
+30
+213.60682526040176
+11
+23.814008175844563
+21
+-125.88471621899356
+31
+213.8751511133228
+12
+24.893396073990495
+22
+-126.42593128968173
+32
+213.6478955440118
+13
+24.893396073990495
+23
+-126.42593128968173
+33
+213.6478955440118
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.816441970428883
+20
+-125.11442023305621
+30
+213.60682526040176
+11
+24.893396073990495
+21
+-126.42593128968173
+31
+213.6478955440118
+12
+25.13160371893081
+22
+-125.80227142744958
+32
+213.45349620158927
+13
+25.13160371893081
+23
+-125.80227142744958
+33
+213.45349620158927
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.13160371893081
+20
+-125.80227142744958
+30
+213.45349620158927
+11
+24.893396073990495
+21
+-126.42593128968173
+31
+213.6478955440118
+12
+25.766215656792237
+22
+-126.82324825557191
+32
+213.38534995322806
+13
+25.766215656792237
+23
+-126.82324825557191
+33
+213.38534995322806
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.13160371893081
+20
+-125.80227142744958
+30
+213.45349620158927
+11
+25.766215656792237
+21
+-126.82324825557191
+31
+213.38534995322806
+12
+26.147408733561363
+22
+-126.43779603828018
+32
+213.231716670093
+13
+26.147408733561363
+23
+-126.43779603828018
+33
+213.231716670093
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.56944112045545
+20
+-130.46846409423694
+30
+212.7355267992137
+11
+21.70482094420825
+21
+-132.30263253784472
+31
+211.43679316415557
+12
+22.575510956748722
+22
+-131.2275037802217
+32
+211.9847011699507
+13
+22.575510956748722
+23
+-131.2275037802217
+33
+211.9847011699507
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.56944112045545
+20
+-130.46846409423694
+30
+212.7355267992137
+11
+20.239372380124575
+21
+-130.74682934981848
+31
+212.27249737954676
+12
+21.70482094420825
+22
+-132.30263253784472
+32
+211.43679316415557
+13
+21.70482094420825
+23
+-132.30263253784472
+33
+211.43679316415557
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.185205800455936
+20
+-129.5913853709128
+30
+213.32998112643412
+11
+20.239372380124575
+21
+-130.74682934981848
+31
+212.27249737954676
+12
+21.56944112045545
+22
+-130.46846409423694
+32
+212.7355267992137
+13
+21.56944112045545
+23
+-130.46846409423694
+33
+212.7355267992137
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.658303923118186
+20
+-129.13657000796786
+30
+213.00811179265784
+11
+20.239372380124575
+21
+-130.74682934981848
+31
+212.27249737954676
+12
+21.185205800455936
+22
+-129.5913853709128
+32
+213.32998112643412
+13
+21.185205800455936
+23
+-129.5913853709128
+33
+213.32998112643412
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.911722784210497
+20
+-128.41799215694763
+30
+213.57244791189686
+11
+19.658303923118186
+21
+-129.13657000796786
+31
+213.00811179265784
+12
+21.185205800455936
+22
+-129.5913853709128
+32
+213.32998112643412
+13
+21.185205800455936
+23
+-129.5913853709128
+33
+213.32998112643412
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+19.911722784210497
+20
+-128.41799215694763
+30
+213.57244791189686
+11
+21.185205800455936
+21
+-129.5913853709128
+31
+213.32998112643412
+12
+21.007538795800574
+22
+-128.67080256939383
+32
+213.71299954914178
+13
+21.007538795800574
+23
+-128.67080256939383
+33
+213.71299954914178
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.327901658129214
+20
+-127.73592122469199
+30
+213.73733749498507
+11
+19.911722784210497
+21
+-128.41799215694763
+31
+213.57244791189686
+12
+21.007538795800574
+22
+-128.67080256939383
+32
+213.71299954914178
+13
+21.007538795800574
+23
+-128.67080256939383
+33
+213.71299954914178
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+20.327901658129214
+20
+-127.73592122469199
+30
+213.73733749498507
+11
+21.007538795800574
+21
+-128.67080256939383
+31
+213.71299954914178
+12
+21.417328958935446
+22
+-127.87829820787458
+32
+213.54141703094726
+13
+21.417328958935446
+23
+-127.87829820787458
+33
+213.54141703094726
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.84537258145274
+20
+-127.24368627001321
+30
+213.84868359721764
+11
+20.327901658129214
+21
+-127.73592122469199
+31
+213.73733749498507
+12
+21.417328958935446
+22
+-127.87829820787458
+32
+213.54141703094726
+13
+21.417328958935446
+23
+-127.87829820787458
+33
+213.54141703094726
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+21.19707054905449
+20
+-126.2309234986131
+30
+213.67040814391646
+11
+20.327901658129214
+21
+-127.73592122469199
+31
+213.73733749498507
+12
+21.84537258145274
+22
+-127.24368627001321
+32
+213.84868359721764
+13
+21.84537258145274
+23
+-127.24368627001321
+33
+213.84868359721764
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.550494740616763
+20
+-140.3654897713704
+30
+197.33721268854148
+11
+7.019608646744442
+21
+-140.76828277507516
+31
+197.22099899714027
+12
+6.072558329120925
+22
+-141.08011270619122
+32
+197.20487510801908
+13
+6.072558329120925
+23
+-141.08011270619122
+33
+197.20487510801908
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.437612866601397
+20
+-141.65479245241372
+30
+197.1714104324845
+11
+7.549871641803167
+21
+-142.36606891968114
+31
+196.86870723105955
+12
+6.483565389547964
+22
+-142.56411895398028
+32
+196.98005333329215
+13
+6.483565389547964
+23
+-142.56411895398028
+33
+196.98005333329215
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.437612866601397
+20
+-141.65479245241372
+30
+197.1714104324845
+11
+6.483565389547964
+21
+-142.56411895398028
+31
+196.98005333329215
+12
+6.209155050165891
+22
+-142.07644736414719
+32
+197.11604160569115
+13
+6.209155050165891
+23
+-142.07644736414719
+33
+197.11604160569115
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.549871641803167
+20
+-142.36606891968114
+30
+196.86870723105955
+11
+7.3165315860314815
+21
+-143.0320159628156
+31
+196.61437569699763
+12
+6.483565389547964
+22
+-142.56411895398028
+32
+196.98005333329215
+13
+6.483565389547964
+23
+-142.56411895398028
+33
+196.98005333329215
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.483565389547964
+20
+-142.56411895398028
+30
+196.98005333329215
+11
+7.3165315860314815
+21
+-143.0320159628156
+31
+196.61437569699763
+12
+6.684353442754349
+22
+-142.87777423103438
+32
+196.7880877854538
+13
+6.684353442754349
+23
+-142.87777423103438
+33
+196.7880877854538
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.684353442754349
+20
+-142.87777423103438
+30
+196.7880877854538
+11
+5.969122059287315
+21
+-142.7719041666167
+31
+197.54499790117717
+12
+6.483565389547964
+22
+-142.56411895398028
+32
+196.98005333329215
+13
+6.483565389547964
+23
+-142.56411895398028
+33
+196.98005333329215
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.684353442754349
+20
+-142.87777423103438
+30
+196.7880877854538
+11
+6.328715209120604
+21
+-143.6146055414374
+31
+197.1014388381848
+12
+5.969122059287315
+22
+-142.7719041666167
+32
+197.54499790117717
+13
+5.969122059287315
+23
+-142.7719041666167
+33
+197.54499790117717
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.076513245320436
+20
+-141.641710806523
+30
+197.18205828379092
+11
+5.690148355059654
+21
+-141.71715843863726
+31
+197.86869258089212
+12
+5.650599193064448
+22
+-140.7378603427715
+32
+197.94170641842203
+13
+5.650599193064448
+23
+-140.7378603427715
+33
+197.94170641842203
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.076513245320436
+20
+-141.641710806523
+30
+197.18205828379092
+11
+5.650599193064448
+21
+-140.7378603427715
+31
+197.94170641842203
+12
+6.072558329120925
+22
+-141.08011270619122
+32
+197.20487510801908
+13
+6.072558329120925
+23
+-141.08011270619122
+33
+197.20487510801908
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.072558329120925
+20
+-141.08011270619122
+30
+197.20487510801908
+11
+5.650599193064448
+21
+-140.7378603427715
+31
+197.94170641842203
+12
+5.977640340332435
+22
+-140.1017272832947
+32
+197.80967306222266
+13
+5.977640340332435
+23
+-140.1017272832947
+33
+197.80967306222266
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.072558329120925
+20
+-141.08011270619122
+30
+197.20487510801908
+11
+5.977640340332435
+21
+-140.1017272832947
+31
+197.80967306222266
+12
+6.096592050641084
+22
+-140.48991751949356
+32
+197.25385522402865
+13
+6.096592050641084
+23
+-140.48991751949356
+33
+197.25385522402865
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.760105299191329
+20
+-139.87021257346115
+30
+197.52552754450357
+11
+6.096592050641084
+21
+-140.48991751949356
+31
+197.25385522402865
+12
+5.977640340332435
+22
+-140.1017272832947
+32
+197.80967306222266
+13
+5.977640340332435
+23
+-140.1017272832947
+33
+197.80967306222266
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.760105299191329
+20
+-139.87021257346115
+30
+197.52552754450357
+11
+6.550494740616763
+21
+-140.3654897713704
+31
+197.33721268854148
+12
+6.096592050641084
+22
+-140.48991751949356
+32
+197.25385522402865
+13
+6.096592050641084
+23
+-140.48991751949356
+33
+197.25385522402865
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.760105299191329
+20
+-139.87021257346115
+30
+197.52552754450357
+11
+7.682209222325561
+21
+-140.72447447255755
+31
+197.62926803865977
+12
+6.550494740616763
+22
+-140.3654897713704
+32
+197.33721268854148
+13
+6.550494740616763
+23
+-140.3654897713704
+33
+197.33721268854148
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.550494740616763
+20
+-140.3654897713704
+30
+197.33721268854148
+11
+7.682209222325561
+21
+-140.72447447255755
+31
+197.62926803865977
+12
+7.019608646744442
+22
+-140.76828277507516
+32
+197.22099899714027
+13
+7.019608646744442
+23
+-140.76828277507516
+33
+197.22099899714027
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.682209222325561
+20
+-140.72447447255755
+30
+197.62926803865977
+11
+8.228596106505412
+21
+-142.2151736554534
+31
+197.24077357813746
+12
+7.019608646744442
+22
+-140.76828277507516
+32
+197.22099899714027
+13
+7.019608646744442
+23
+-140.76828277507516
+33
+197.22099899714027
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.019608646744442
+20
+-140.76828277507516
+30
+197.22099899714027
+11
+8.228596106505412
+21
+-142.2151736554534
+31
+197.24077357813746
+12
+7.437612866601397
+22
+-141.65479245241372
+32
+197.1714104324845
+13
+7.437612866601397
+23
+-141.65479245241372
+33
+197.1714104324845
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.437612866601397
+20
+-141.65479245241372
+30
+197.1714104324845
+11
+8.228596106505412
+21
+-142.2151736554534
+31
+197.24077357813746
+12
+8.408392681422022
+22
+-143.12906352186548
+32
+196.98096600626093
+13
+8.408392681422022
+23
+-143.12906352186548
+33
+196.98096600626093
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.437612866601397
+20
+-141.65479245241372
+30
+197.1714104324845
+11
+8.408392681422022
+21
+-143.12906352186548
+31
+196.98096600626093
+12
+7.549871641803167
+22
+-142.36606891968114
+32
+196.86870723105955
+13
+7.549871641803167
+23
+-142.36606891968114
+33
+196.86870723105955
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.549871641803167
+20
+-142.36606891968114
+30
+196.86870723105955
+11
+8.408392681422022
+21
+-143.12906352186548
+31
+196.98096600626093
+12
+7.709589411399164
+22
+-143.99336482362202
+32
+196.53345202706873
+13
+7.709589411399164
+23
+-143.99336482362202
+33
+196.53345202706873
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.549871641803167
+20
+-142.36606891968114
+30
+196.86870723105955
+11
+7.709589411399164
+21
+-143.99336482362202
+31
+196.53345202706873
+12
+7.3165315860314815
+22
+-143.0320159628156
+32
+196.61437569699763
+13
+7.3165315860314815
+23
+-143.0320159628156
+33
+196.61437569699763
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.684353442754349
+20
+-142.87777423103438
+30
+196.7880877854538
+11
+7.3165315860314815
+21
+-143.0320159628156
+31
+196.61437569699763
+12
+7.709589411399164
+22
+-143.99336482362202
+32
+196.53345202706873
+13
+7.709589411399164
+23
+-143.99336482362202
+33
+196.53345202706873
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.684353442754349
+20
+-142.87777423103438
+30
+196.7880877854538
+11
+7.709589411399164
+21
+-143.99336482362202
+31
+196.53345202706873
+12
+6.328715209120604
+22
+-143.6146055414374
+32
+197.1014388381848
+13
+6.328715209120604
+23
+-143.6146055414374
+33
+197.1014388381848
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.80027756000012
+20
+-142.2583735093252
+30
+197.53708806877842
+11
+6.483565389547964
+21
+-142.56411895398028
+31
+196.98005333329215
+12
+5.969122059287315
+22
+-142.7719041666167
+32
+197.54499790117717
+13
+5.969122059287315
+23
+-142.7719041666167
+33
+197.54499790117717
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.209155050165891
+20
+-142.07644736414719
+30
+197.11604160569115
+11
+6.483565389547964
+21
+-142.56411895398028
+31
+196.98005333329215
+12
+5.80027756000012
+22
+-142.2583735093252
+32
+197.53708806877842
+13
+5.80027756000012
+23
+-142.2583735093252
+33
+197.53708806877842
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.209155050165891
+20
+-142.07644736414719
+30
+197.11604160569115
+11
+5.690148355059654
+21
+-141.71715843863726
+31
+197.86869258089212
+12
+6.076513245320436
+22
+-141.641710806523
+32
+197.18205828379092
+13
+6.076513245320436
+23
+-141.641710806523
+33
+197.18205828379092
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.209155050165891
+20
+-142.07644736414719
+30
+197.11604160569115
+11
+5.80027756000012
+21
+-142.2583735093252
+31
+197.53708806877842
+12
+5.690148355059654
+22
+-141.71715843863726
+32
+197.86869258089212
+13
+5.690148355059654
+23
+-141.71715843863726
+33
+197.86869258089212
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.743908159232596
+20
+-146.83177775758907
+30
+211.5040267395433
+11
+11.93465680977868
+21
+-147.17068365345597
+31
+212.2691509119891
+12
+12.055738090348596
+22
+-146.60208839369415
+32
+211.65066286324895
+13
+12.055738090348596
+23
+-146.60208839369415
+33
+211.65066286324895
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.164954622319959
+20
+-147.0219179594891
+30
+211.45687196947205
+11
+12.149743406167948
+21
+-147.0182672676128
+31
+212.29135928757074
+12
+11.983941150111137
+22
+-147.26012560442987
+32
+212.43373627075383
+13
+11.983941150111137
+23
+-147.26012560442987
+33
+212.43373627075383
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.164954622319959
+20
+-147.0219179594891
+30
+211.45687196947205
+11
+12.055738090348596
+21
+-146.60208839369415
+31
+211.65066286324895
+12
+12.149743406167948
+22
+-147.0182672676128
+32
+212.29135928757074
+13
+12.149743406167948
+23
+-147.0182672676128
+33
+212.29135928757074
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.505092065646195
+20
+-147.79038859948838
+30
+212.49306001374646
+11
+10.187192298236914
+21
+-148.4627243534068
+31
+212.73978593973175
+12
+10.471337815956272
+22
+-148.85578217877415
+32
+211.15143074913973
+13
+10.471337815956272
+23
+-148.85578217877415
+33
+211.15143074913973
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.720787110681552
+20
+-147.82993776148328
+30
+211.22140234343917
+11
+11.505092065646195
+21
+-147.79038859948838
+31
+212.49306001374646
+12
+10.471337815956272
+22
+-148.85578217877415
+32
+211.15143074913973
+13
+10.471337815956272
+23
+-148.85578217877415
+33
+211.15143074913973
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.720787110681552
+20
+-147.82993776148328
+30
+211.22140234343917
+11
+11.983941150111137
+21
+-147.26012560442987
+31
+212.43373627075383
+12
+11.505092065646195
+22
+-147.79038859948838
+32
+212.49306001374646
+13
+11.505092065646195
+23
+-147.79038859948838
+33
+212.49306001374646
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.720787110681552
+20
+-147.82993776148328
+30
+211.22140234343917
+11
+12.164954622319959
+21
+-147.0219179594891
+31
+211.45687196947205
+12
+11.983941150111137
+22
+-147.26012560442987
+32
+212.43373627075383
+13
+11.983941150111137
+23
+-147.26012560442987
+33
+212.43373627075383
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.471337815956272
+20
+-148.85578217877415
+30
+211.15143074913973
+11
+9.084379127216922
+21
+-148.98112259986686
+31
+212.2828410065255
+12
+9.101415689307162
+22
+-149.0836461967311
+32
+211.3488723347926
+13
+9.101415689307162
+23
+-149.0836461967311
+33
+211.3488723347926
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.471337815956272
+20
+-148.85578217877415
+30
+211.15143074913973
+11
+10.187192298236914
+21
+-148.4627243534068
+31
+212.73978593973175
+12
+9.084379127216922
+22
+-148.98112259986686
+32
+212.2828410065255
+13
+9.084379127216922
+23
+-148.98112259986686
+33
+212.2828410065255
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.084379127216922
+20
+-148.98112259986686
+30
+212.2828410065255
+11
+8.363671705935163
+21
+-148.95739310266967
+31
+211.974357542963
+12
+8.012292612823966
+22
+-148.9014158272303
+32
+211.4018073670016
+13
+8.012292612823966
+23
+-148.9014158272303
+33
+211.4018073670016
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.101415689307162
+20
+-149.0836461967311
+30
+211.3488723347926
+11
+9.084379127216922
+21
+-148.98112259986686
+31
+212.2828410065255
+12
+8.012292612823966
+22
+-148.9014158272303
+32
+211.4018073670016
+13
+8.012292612823966
+23
+-148.9014158272303
+33
+211.4018073670016
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+8.012292612823966
+20
+-148.9014158272303
+30
+211.4018073670016
+11
+8.247762238856922
+21
+-148.82688086808568
+31
+211.92659432424574
+12
+8.01594330470044
+22
+-148.397924572599
+32
+211.46021843702542
+13
+8.01594330470044
+23
+-148.397924572599
+33
+211.46021843702542
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+8.012292612823966
+20
+-148.9014158272303
+30
+211.4018073670016
+11
+8.363671705935163
+21
+-148.95739310266967
+31
+211.974357542963
+12
+8.247762238856922
+22
+-148.82688086808568
+32
+211.92659432424574
+13
+8.247762238856922
+23
+-148.82688086808568
+33
+211.92659432424574
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+8.01594330470044
+20
+-148.397924572599
+30
+211.46021843702542
+11
+8.247762238856922
+21
+-148.82688086808568
+31
+211.92659432424574
+12
+8.361237911350845
+22
+-148.6975855307935
+32
+211.9777040105164
+13
+8.361237911350845
+23
+-148.6975855307935
+33
+211.9777040105164
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+8.361237911350845
+20
+-148.6975855307935
+30
+211.9777040105164
+11
+8.97272880066124
+21
+-148.90324117316865
+31
+212.41548281137088
+12
+8.907016346884607
+22
+-148.75843039540158
+32
+212.29500997944717
+13
+8.907016346884607
+23
+-148.75843039540158
+33
+212.29500997944717
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+8.361237911350845
+20
+-148.6975855307935
+30
+211.9777040105164
+11
+8.247762238856922
+21
+-148.82688086808568
+31
+211.92659432424574
+12
+8.97272880066124
+22
+-148.90324117316865
+32
+212.41548281137088
+13
+8.97272880066124
+23
+-148.90324117316865
+33
+212.41548281137088
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.084379127216922
+20
+-148.98112259986686
+30
+212.2828410065255
+11
+8.97272880066124
+21
+-148.90324117316865
+31
+212.41548281137088
+12
+8.247762238856922
+22
+-148.82688086808568
+32
+211.92659432424574
+13
+8.247762238856922
+23
+-148.82688086808568
+33
+211.92659432424574
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+8.247762238856922
+20
+-148.82688086808568
+30
+211.92659432424574
+11
+8.363671705935163
+21
+-148.95739310266967
+31
+211.974357542963
+12
+9.084379127216922
+22
+-148.98112259986686
+32
+212.2828410065255
+13
+9.084379127216922
+23
+-148.98112259986686
+33
+212.2828410065255
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.11265733909212
+20
+-148.4073555266135
+30
+212.5855442079505
+11
+9.969976131586353
+21
+-148.39974991853748
+31
+212.460812235504
+12
+8.907016346884607
+22
+-148.75843039540158
+32
+212.29500997944717
+13
+8.907016346884607
+23
+-148.75843039540158
+33
+212.29500997944717
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.11265733909212
+20
+-148.4073555266135
+30
+212.5855442079505
+11
+8.907016346884607
+21
+-148.75843039540158
+31
+212.29500997944717
+12
+8.97272880066124
+22
+-148.90324117316865
+32
+212.41548281137088
+13
+8.97272880066124
+23
+-148.90324117316865
+33
+212.41548281137088
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.187192298236914
+20
+-148.4627243534068
+30
+212.73978593973175
+11
+10.11265733909212
+21
+-148.4073555266135
+31
+212.5855442079505
+12
+8.97272880066124
+22
+-148.90324117316865
+32
+212.41548281137088
+13
+8.97272880066124
+23
+-148.90324117316865
+33
+212.41548281137088
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.187192298236914
+20
+-148.4627243534068
+30
+212.73978593973175
+11
+8.97272880066124
+21
+-148.90324117316865
+31
+212.41548281137088
+12
+9.084379127216922
+22
+-148.98112259986686
+32
+212.2828410065255
+13
+9.084379127216922
+23
+-148.98112259986686
+33
+212.2828410065255
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.597576259850356
+20
+-147.55948233830097
+30
+212.1839681015379
+11
+11.983941150111137
+21
+-147.26012560442987
+31
+212.43373627075383
+12
+12.149743406167948
+22
+-147.0182672676128
+32
+212.29135928757074
+13
+12.149743406167948
+23
+-147.0182672676128
+33
+212.29135928757074
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.93465680977868
+20
+-147.17068365345597
+30
+212.2691509119891
+11
+11.223758397176072
+21
+-147.52472286950308
+31
+211.6723290380678
+12
+11.597576259850356
+22
+-147.55948233830097
+32
+212.1839681015379
+13
+11.597576259850356
+23
+-147.55948233830097
+33
+212.1839681015379
+70
+3
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.223758397176072
+20
+-147.52472286950308
+30
+211.6723290380678
+11
+11.93465680977868
+21
+-147.17068365345597
+31
+212.2691509119891
+12
+11.137284859090824
+22
+-147.5275387843816
+32
+211.5450970231536
+13
+11.137284859090824
+23
+-147.5275387843816
+33
+211.5450970231536
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.597576259850356
+20
+-147.55948233830097
+30
+212.1839681015379
+11
+11.223758397176072
+21
+-147.52472286950308
+31
+211.6723290380678
+12
+11.276577844131246
+22
+-147.53511946412166
+32
+211.74060822576112
+13
+11.276577844131246
+23
+-147.53511946412166
+33
+211.74060822576112
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.088913191727471
+20
+-147.90842763682787
+30
+212.26215375255907
+11
+11.223758397176072
+21
+-147.52472286950308
+31
+211.6723290380678
+12
+11.137284859090824
+22
+-147.5275387843816
+32
+211.5450970231536
+13
+11.137284859090824
+23
+-147.5275387843816
+33
+211.5450970231536
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.223758397176072
+20
+-147.52472286950308
+30
+211.6723290380678
+11
+11.088913191727471
+21
+-147.90842763682787
+31
+212.26215375255907
+12
+11.597576259850356
+22
+-147.55948233830097
+32
+212.1839681015379
+13
+11.597576259850356
+23
+-147.55948233830097
+33
+212.1839681015379
+70
+13
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.223758397176072
+20
+-147.52472286950308
+30
+211.6723290380678
+11
+11.597576259850356
+21
+-147.55948233830097
+31
+212.1839681015379
+12
+11.276577844131246
+22
+-147.53511946412166
+32
+211.74060822576112
+13
+11.276577844131246
+23
+-147.53511946412166
+33
+211.74060822576112
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.983941150111137
+20
+-147.26012560442987
+30
+212.43373627075383
+11
+11.597576259850356
+21
+-147.55948233830097
+31
+212.1839681015379
+12
+11.088913191727471
+22
+-147.90842763682787
+32
+212.26215375255907
+13
+11.088913191727471
+23
+-147.90842763682787
+33
+212.26215375255907
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.983941150111137
+20
+-147.26012560442987
+30
+212.43373627075383
+11
+11.088913191727471
+21
+-147.90842763682787
+31
+212.26215375255907
+12
+11.505092065646195
+22
+-147.79038859948838
+32
+212.49306001374646
+13
+11.505092065646195
+23
+-147.79038859948838
+33
+212.49306001374646
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.137284859090824
+20
+-147.5275387843816
+30
+211.5450970231536
+11
+9.969976131586353
+21
+-148.39974991853748
+31
+212.460812235504
+12
+11.088913191727471
+22
+-147.90842763682787
+32
+212.26215375255907
+13
+11.088913191727471
+23
+-147.90842763682787
+33
+212.26215375255907
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.088913191727471
+20
+-147.90842763682787
+30
+212.26215375255907
+11
+9.969976131586353
+21
+-148.39974991853748
+31
+212.460812235504
+12
+10.11265733909212
+22
+-148.4073555266135
+32
+212.5855442079505
+13
+10.11265733909212
+23
+-148.4073555266135
+33
+212.5855442079505
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.505092065646195
+20
+-147.79038859948838
+30
+212.49306001374646
+11
+11.088913191727471
+21
+-147.90842763682787
+31
+212.26215375255907
+12
+10.11265733909212
+22
+-148.4073555266135
+32
+212.5855442079505
+13
+10.11265733909212
+23
+-148.4073555266135
+33
+212.5855442079505
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.505092065646195
+20
+-147.79038859948838
+30
+212.49306001374646
+11
+10.11265733909212
+21
+-148.4073555266135
+31
+212.5855442079505
+12
+10.187192298236914
+22
+-148.4627243534068
+32
+212.73978593973175
+13
+10.187192298236914
+23
+-148.4627243534068
+33
+212.73978593973175
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.969122059287315
+20
+-142.7719041666167
+30
+197.54499790117717
+11
+6.900048487789717
+21
+-145.97873275578186
+31
+199.627413392385
+12
+6.334799695581406
+22
+-144.66357100728018
+32
+200.35237995418998
+13
+6.334799695581406
+23
+-144.66357100728018
+33
+200.35237995418998
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.900048487789717
+20
+-145.97873275578186
+30
+199.627413392385
+11
+5.969122059287315
+21
+-142.7719041666167
+31
+197.54499790117717
+12
+6.328715209120604
+22
+-143.6146055414374
+32
+197.1014388381848
+13
+6.328715209120604
+23
+-143.6146055414374
+33
+197.1014388381848
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.818835243705565
+20
+-141.39711445079982
+30
+200.79593901718277
+11
+5.690148355059654
+21
+-141.71715843863726
+31
+197.86869258089212
+12
+5.89732511904988
+22
+-143.02228078447965
+32
+200.9370991030733
+13
+5.89732511904988
+23
+-143.02228078447965
+33
+200.9370991030733
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.690148355059654
+20
+-141.71715843863726
+30
+197.86869258089212
+11
+5.818835243705565
+21
+-141.39711445079982
+31
+200.79593901718277
+12
+5.650599193064448
+22
+-140.7378603427715
+32
+197.94170641842203
+13
+5.650599193064448
+23
+-140.7378603427715
+33
+197.94170641842203
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.323543395628918
+20
+-140.4092980738888
+30
+200.57446371001026
+11
+5.650599193064448
+21
+-140.7378603427715
+31
+197.94170641842203
+12
+5.818835243705565
+22
+-141.39711445079982
+32
+200.79593901718277
+13
+5.818835243705565
+23
+-141.39711445079982
+33
+200.79593901718277
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.650599193064448
+20
+-140.7378603427715
+30
+197.94170641842203
+11
+6.323543395628918
+21
+-140.4092980738888
+31
+200.57446371001026
+12
+5.977640340332435
+22
+-140.1017272832947
+32
+197.80967306222266
+13
+5.977640340332435
+23
+-140.1017272832947
+33
+197.80967306222266
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.323543395628918
+20
+-140.4092980738888
+30
+200.57446371001026
+11
+6.760105299191329
+21
+-139.87021257346115
+31
+197.52552754450357
+12
+5.977640340332435
+22
+-140.1017272832947
+32
+197.80967306222266
+13
+5.977640340332435
+23
+-140.1017272832947
+33
+197.80967306222266
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.760105299191329
+20
+-139.87021257346115
+30
+197.52552754450357
+11
+6.323543395628918
+21
+-140.4092980738888
+31
+200.57446371001026
+12
+7.532835079712915
+22
+-140.05122604567063
+32
+200.1333384416024
+13
+7.532835079712915
+23
+-140.05122604567063
+33
+200.1333384416024
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.532835079712915
+20
+-140.05122604567063
+30
+200.1333384416024
+11
+7.682209222325561
+21
+-140.72447447255755
+31
+197.62926803865977
+12
+6.760105299191329
+22
+-139.87021257346115
+32
+197.52552754450357
+13
+6.760105299191329
+23
+-139.87021257346115
+33
+197.52552754450357
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.682209222325561
+20
+-140.72447447255755
+30
+197.62926803865977
+11
+7.532835079712915
+21
+-140.05122604567063
+31
+200.1333384416024
+12
+8.992503381658839
+22
+-141.38920461840058
+32
+200.36576582440424
+13
+8.992503381658839
+23
+-141.38920461840058
+33
+200.36576582440424
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.002528134151632
+20
+-143.86102724310052
+30
+200.00465155295512
+11
+7.682209222325561
+21
+-140.72447447255755
+31
+197.62926803865977
+12
+8.992503381658839
+22
+-141.38920461840058
+32
+200.36576582440424
+13
+8.992503381658839
+23
+-141.38920461840058
+33
+200.36576582440424
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.682209222325561
+20
+-140.72447447255755
+30
+197.62926803865977
+11
+10.002528134151632
+21
+-143.86102724310052
+31
+200.00465155295512
+12
+8.228596106505412
+22
+-142.2151736554534
+32
+197.24077357813746
+13
+8.228596106505412
+23
+-142.2151736554534
+33
+197.24077357813746
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.206358430588446
+20
+-145.2352085102721
+30
+199.46556605252823
+11
+8.228596106505412
+21
+-142.2151736554534
+31
+197.24077357813746
+12
+10.002528134151632
+22
+-143.86102724310052
+32
+200.00465155295512
+13
+10.002528134151632
+23
+-143.86102724310052
+33
+200.00465155295512
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+8.228596106505412
+20
+-142.2151736554534
+30
+197.24077357813746
+11
+10.206358430588446
+21
+-145.2352085102721
+31
+199.46556605252823
+12
+8.408392681422022
+22
+-143.12906352186548
+32
+196.98096600626093
+13
+8.408392681422022
+23
+-143.12906352186548
+33
+196.98096600626093
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.097460773107619
+20
+-146.60695598285923
+30
+198.7558107068755
+11
+8.408392681422022
+21
+-143.12906352186548
+31
+196.98096600626093
+12
+10.206358430588446
+22
+-145.2352085102721
+32
+199.46556605252823
+13
+10.206358430588446
+23
+-145.2352085102721
+33
+199.46556605252823
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+8.408392681422022
+20
+-143.12906352186548
+30
+196.98096600626093
+11
+9.097460773107619
+21
+-146.60695598285923
+31
+198.7558107068755
+12
+7.709589411399164
+22
+-143.99336482362202
+32
+196.53345202706873
+13
+7.709589411399164
+23
+-143.99336482362202
+33
+196.53345202706873
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.709589411399164
+20
+-143.99336482362202
+30
+196.53345202706873
+11
+6.900048487789717
+21
+-145.97873275578186
+31
+199.627413392385
+12
+6.328715209120604
+22
+-143.6146055414374
+32
+197.1014388381848
+13
+6.328715209120604
+23
+-143.6146055414374
+33
+197.1014388381848
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.900048487789717
+20
+-145.97873275578186
+30
+199.627413392385
+11
+7.709589411399164
+21
+-143.99336482362202
+31
+196.53345202706873
+12
+9.097460773107619
+22
+-146.60695598285923
+32
+198.7558107068755
+13
+9.097460773107619
+23
+-146.60695598285923
+33
+198.7558107068755
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.596982461371777
+20
+-148.81532034380916
+30
+208.80068940500965
+11
+11.565936930254193
+21
+-147.42714475777726
+31
+207.24275664672223
+12
+11.802623453579313
+22
+-147.6696115432407
+32
+209.48823637507996
+13
+11.802623453579313
+23
+-147.6696115432407
+33
+209.48823637507996
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.565936930254193
+20
+-147.42714475777726
+30
+207.24275664672223
+11
+10.596982461371777
+21
+-148.81532034380916
+31
+208.80068940500965
+12
+10.386155005505056
+22
+-148.55277475302515
+32
+206.5801560711404
+13
+10.386155005505056
+23
+-148.55277475302515
+33
+206.5801560711404
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.386155005505056
+20
+-148.55277475302515
+30
+206.5801560711404
+11
+8.926486703559155
+21
+-149.19225428005592
+31
+209.60110359892786
+12
+8.029329174914196
+22
+-148.5999295230964
+32
+207.0294953962709
+13
+8.029329174914196
+23
+-148.5999295230964
+33
+207.0294953962709
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.596982461371777
+20
+-148.81532034380916
+30
+208.80068940500965
+11
+8.926486703559155
+21
+-149.19225428005592
+31
+209.60110359892786
+12
+10.386155005505056
+22
+-148.55277475302515
+32
+206.5801560711404
+13
+10.386155005505056
+23
+-148.55277475302515
+33
+206.5801560711404
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.101415689307162
+20
+-149.0836461967311
+30
+211.3488723347926
+11
+8.012292612823966
+21
+-148.9014158272303
+31
+211.4018073670016
+12
+7.29949502394124
+22
+-148.0453285821951
+32
+209.5594248666712
+13
+7.29949502394124
+23
+-148.0453285821951
+33
+209.5594248666712
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.101415689307162
+20
+-149.0836461967311
+30
+211.3488723347926
+11
+7.29949502394124
+21
+-148.0453285821951
+31
+209.5594248666712
+12
+8.926486703559155
+22
+-149.19225428005592
+32
+209.60110359892786
+13
+8.926486703559155
+23
+-149.19225428005592
+33
+209.60110359892786
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.595780214247164
+20
+-147.43201234694672
+30
+210.32211524453314
+11
+8.489924799996755
+21
+-148.26589121639987
+31
+211.48394793422273
+12
+9.189032294342686
+22
+-148.22968852195797
+32
+211.6546177794481
+13
+9.189032294342686
+23
+-148.22968852195797
+33
+211.6546177794481
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.595780214247164
+20
+-147.43201234694672
+30
+210.32211524453314
+11
+7.8035947272185275
+21
+-147.23122429374018
+31
+209.85695625460502
+12
+8.489924799996755
+22
+-148.26589121639987
+32
+211.48394793422273
+13
+8.489924799996755
+23
+-148.26589121639987
+33
+211.48394793422273
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.223758397176072
+20
+-147.52472286950308
+30
+211.6723290380678
+11
+11.027459878473397
+21
+-146.6036095153089
+31
+210.1420144452933
+12
+9.189032294342686
+22
+-148.22968852195797
+32
+211.6546177794481
+13
+9.189032294342686
+23
+-148.22968852195797
+33
+211.6546177794481
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.027459878473397
+20
+-146.6036095153089
+30
+210.1420144452933
+11
+11.223758397176072
+21
+-147.52472286950308
+31
+211.6723290380678
+12
+11.392833290444438
+22
+-147.45513339549825
+32
+211.6768261550298
+13
+11.392833290444438
+23
+-147.45513339549825
+33
+211.6768261550298
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.027459878473397
+20
+-146.6036095153089
+30
+210.1420144452933
+11
+9.595780214247164
+21
+-147.43201234694672
+31
+210.32211524453314
+12
+9.189032294342686
+22
+-148.22968852195797
+32
+211.6546177794481
+13
+9.189032294342686
+23
+-148.22968852195797
+33
+211.6546177794481
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.41625856331852
+20
+-146.06209022029768
+30
+209.8885955842014
+11
+11.392833290444438
+21
+-147.45513339549825
+31
+211.6768261550298
+12
+11.743908159232596
+22
+-146.83177775758907
+32
+211.5040267395433
+13
+11.743908159232596
+23
+-146.83177775758907
+33
+211.5040267395433
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.41625856331852
+20
+-146.06209022029768
+30
+209.8885955842014
+11
+11.027459878473397
+21
+-146.6036095153089
+31
+210.1420144452933
+12
+11.392833290444438
+22
+-147.45513339549825
+32
+211.6768261550298
+13
+11.392833290444438
+23
+-147.45513339549825
+33
+211.6768261550298
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.938915950301228
+20
+-145.67815912462106
+30
+209.96738968386896
+11
+11.743908159232596
+21
+-146.83177775758907
+31
+211.5040267395433
+12
+12.055738090348596
+22
+-146.60208839369415
+32
+211.65066286324895
+13
+12.055738090348596
+23
+-146.60208839369415
+33
+211.65066286324895
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.938915950301228
+20
+-145.67815912462106
+30
+209.96738968386896
+11
+11.41625856331852
+21
+-146.06209022029768
+31
+209.8885955842014
+12
+11.743908159232596
+22
+-146.83177775758907
+32
+211.5040267395433
+13
+11.743908159232596
+23
+-146.83177775758907
+33
+211.5040267395433
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.230971300419641
+20
+-146.50260704005942
+30
+210.02002049175462
+11
+12.055738090348596
+21
+-146.60208839369415
+31
+211.65066286324895
+12
+12.164954622319959
+22
+-147.0219179594891
+32
+211.45687196947205
+13
+12.164954622319959
+23
+-147.0219179594891
+33
+211.45687196947205
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.938915950301228
+20
+-145.67815912462106
+30
+209.96738968386896
+11
+12.055738090348596
+21
+-146.60208839369415
+31
+211.65066286324895
+12
+12.230971300419641
+22
+-146.50260704005942
+32
+210.02002049175462
+13
+12.230971300419641
+23
+-146.50260704005942
+33
+210.02002049175462
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.802623453579313
+20
+-147.6696115432407
+30
+209.48823637507996
+11
+12.164954622319959
+21
+-147.0219179594891
+31
+211.45687196947205
+12
+11.720787110681552
+22
+-147.82993776148328
+32
+211.22140234343917
+13
+11.720787110681552
+23
+-147.82993776148328
+33
+211.22140234343917
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.802623453579313
+20
+-147.6696115432407
+30
+209.48823637507996
+11
+12.230971300419641
+21
+-146.50260704005942
+31
+210.02002049175462
+12
+12.164954622319959
+22
+-147.0219179594891
+32
+211.45687196947205
+13
+12.164954622319959
+23
+-147.0219179594891
+33
+211.45687196947205
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.720787110681552
+20
+-147.82993776148328
+30
+211.22140234343917
+11
+10.471337815956272
+21
+-148.85578217877415
+31
+211.15143074913973
+12
+10.596982461371777
+22
+-148.81532034380916
+32
+208.80068940500965
+13
+10.596982461371777
+23
+-148.81532034380916
+33
+208.80068940500965
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.802623453579313
+20
+-147.6696115432407
+30
+209.48823637507996
+11
+11.720787110681552
+21
+-147.82993776148328
+31
+211.22140234343917
+12
+10.596982461371777
+22
+-148.81532034380916
+32
+208.80068940500965
+13
+10.596982461371777
+23
+-148.81532034380916
+33
+208.80068940500965
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.596982461371777
+20
+-148.81532034380916
+30
+208.80068940500965
+11
+9.101415689307162
+21
+-149.0836461967311
+31
+211.3488723347926
+12
+8.926486703559155
+22
+-149.19225428005592
+32
+209.60110359892786
+13
+8.926486703559155
+23
+-149.19225428005592
+33
+209.60110359892786
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.596982461371777
+20
+-148.81532034380916
+30
+208.80068940500965
+11
+10.471337815956272
+21
+-148.85578217877415
+31
+211.15143074913973
+12
+9.101415689307162
+22
+-149.0836461967311
+32
+211.3488723347926
+13
+9.101415689307162
+23
+-149.0836461967311
+33
+211.3488723347926
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.89732511904988
+20
+-143.02228078447965
+30
+200.9370991030733
+11
+6.364613679239317
+21
+-144.37820859226915
+31
+202.2683847406959
+12
+6.161087607125563
+22
+-143.4965665040993
+32
+202.83819689775012
+13
+6.161087607125563
+23
+-143.4965665040993
+33
+202.83819689775012
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.077730142612612
+20
+-143.9106158077562
+30
+200.44760216730137
+11
+6.364613679239317
+21
+-144.37820859226915
+31
+202.2683847406959
+12
+5.89732511904988
+22
+-143.02228078447965
+32
+200.9370991030733
+13
+5.89732511904988
+23
+-143.02228078447965
+33
+200.9370991030733
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.077730142612612
+20
+-143.9106158077562
+30
+200.44760216730137
+11
+6.578179154013404
+21
+-145.12781732423966
+31
+202.26017068397334
+12
+6.364613679239317
+22
+-144.37820859226915
+32
+202.2683847406959
+13
+6.364613679239317
+23
+-144.37820859226915
+33
+202.2683847406959
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.334799695581406
+20
+-144.66357100728018
+30
+200.35237995418998
+11
+6.578179154013404
+21
+-145.12781732423966
+31
+202.26017068397334
+12
+6.077730142612612
+22
+-143.9106158077562
+32
+200.44760216730137
+13
+6.077730142612612
+23
+-143.9106158077562
+33
+200.44760216730137
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.161087607125563
+20
+-143.4965665040993
+30
+202.83819689775012
+11
+6.419678281709572
+21
+-144.76700727711477
+31
+204.20507678116837
+12
+6.382562914298684
+22
+-143.8680244025317
+32
+204.64407247931547
+13
+6.382562914298684
+23
+-143.8680244025317
+33
+204.64407247931547
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.364613679239317
+20
+-144.37820859226915
+30
+202.2683847406959
+11
+6.419678281709572
+21
+-144.76700727711477
+31
+204.20507678116837
+12
+6.161087607125563
+22
+-143.4965665040993
+32
+202.83819689775012
+13
+6.161087607125563
+23
+-143.4965665040993
+33
+202.83819689775012
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.419678281709572
+20
+-144.76700727711477
+30
+204.20507678116837
+11
+6.593086145842365
+21
+-145.52726386039163
+31
+204.08551662221353
+12
+6.719947688550046
+22
+-146.25253464651956
+32
+206.27714864539348
+13
+6.719947688550046
+23
+-146.25253464651956
+33
+206.27714864539348
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.593086145842365
+20
+-145.52726386039163
+30
+204.08551662221353
+11
+6.419678281709572
+21
+-144.76700727711477
+31
+204.20507678116837
+12
+6.364613679239317
+22
+-144.37820859226915
+32
+202.2683847406959
+13
+6.364613679239317
+23
+-144.37820859226915
+33
+202.2683847406959
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.578179154013404
+20
+-145.12781732423966
+30
+202.26017068397334
+11
+6.593086145842365
+21
+-145.52726386039163
+31
+204.08551662221353
+12
+6.364613679239317
+22
+-144.37820859226915
+32
+202.2683847406959
+13
+6.364613679239317
+23
+-144.37820859226915
+33
+202.2683847406959
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.382562914298684
+20
+-143.8680244025317
+30
+204.64407247931547
+11
+6.631114186222358
+21
+-145.6300916815798
+31
+206.61970523313647
+12
+7.0345156385734136
+22
+-144.8987364089918
+32
+206.54942941451466
+13
+7.0345156385734136
+23
+-144.8987364089918
+33
+206.54942941451466
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.419678281709572
+20
+-144.76700727711477
+30
+204.20507678116837
+11
+6.631114186222358
+21
+-145.6300916815798
+31
+206.61970523313647
+12
+6.382562914298684
+22
+-143.8680244025317
+32
+204.64407247931547
+13
+6.382562914298684
+23
+-143.8680244025317
+33
+204.64407247931547
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.419678281709572
+20
+-144.76700727711477
+30
+204.20507678116837
+11
+6.719947688550046
+21
+-146.25253464651956
+31
+206.27714864539348
+12
+6.631114186222358
+22
+-145.6300916815798
+32
+206.61970523313647
+13
+6.631114186222358
+23
+-145.6300916815798
+33
+206.61970523313647
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.0345156385734136
+20
+-144.8987364089918
+30
+206.54942941451466
+11
+6.803000928739959
+21
+-146.63616151787352
+31
+208.13443813755262
+12
+7.3122724455089205
+22
+-146.01980303939447
+32
+208.1423479699519
+13
+7.3122724455089205
+23
+-146.01980303939447
+33
+208.1423479699519
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.0345156385734136
+20
+-144.8987364089918
+30
+206.54942941451466
+11
+6.631114186222358
+21
+-145.6300916815798
+31
+206.61970523313647
+12
+6.803000928739959
+22
+-146.63616151787352
+32
+208.13443813755262
+13
+6.803000928739959
+23
+-146.63616151787352
+33
+208.13443813755262
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.631114186222358
+20
+-145.6300916815798
+30
+206.61970523313647
+11
+6.952375071352593
+21
+-147.16551183996287
+31
+207.38726320016622
+12
+6.803000928739959
+22
+-146.63616151787352
+32
+208.13443813755262
+13
+6.803000928739959
+23
+-146.63616151787352
+33
+208.13443813755262
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.719947688550046
+20
+-146.25253464651956
+30
+206.27714864539348
+11
+6.952375071352593
+21
+-147.16551183996287
+31
+207.38726320016622
+12
+6.631114186222358
+22
+-145.6300916815798
+32
+206.61970523313647
+13
+6.631114186222358
+23
+-145.6300916815798
+33
+206.61970523313647
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.8035947272185275
+20
+-147.23122429374018
+30
+209.85695625460502
+11
+7.3122724455089205
+21
+-146.01980303939447
+31
+208.1423479699519
+12
+7.303449940140751
+22
+-147.6571383459964
+32
+209.8879871355549
+13
+7.303449940140751
+23
+-147.6571383459964
+33
+209.8879871355549
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.803000928739959
+20
+-146.63616151787352
+30
+208.13443813755262
+11
+7.303449940140751
+21
+-147.6571383459964
+31
+209.8879871355549
+12
+7.3122724455089205
+22
+-146.01980303939447
+32
+208.1423479699519
+13
+7.3122724455089205
+23
+-146.01980303939447
+33
+208.1423479699519
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.803000928739959
+20
+-146.63616151787352
+30
+208.13443813755262
+11
+7.29949502394124
+21
+-148.0453285821951
+31
+209.5594248666712
+12
+7.303449940140751
+22
+-147.6571383459964
+32
+209.8879871355549
+13
+7.303449940140751
+23
+-147.6571383459964
+33
+209.8879871355549
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.952375071352593
+20
+-147.16551183996287
+30
+207.38726320016622
+11
+7.29949502394124
+21
+-148.0453285821951
+31
+209.5594248666712
+12
+6.803000928739959
+22
+-146.63616151787352
+32
+208.13443813755262
+13
+6.803000928739959
+23
+-146.63616151787352
+33
+208.13443813755262
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+8.489924799996755
+20
+-148.26589121639987
+30
+211.48394793422273
+11
+7.8035947272185275
+21
+-147.23122429374018
+31
+209.85695625460502
+12
+8.01594330470044
+22
+-148.397924572599
+32
+211.46021843702542
+13
+8.01594330470044
+23
+-148.397924572599
+33
+211.46021843702542
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+8.01594330470044
+20
+-148.397924572599
+30
+211.46021843702542
+11
+7.8035947272185275
+21
+-147.23122429374018
+31
+209.85695625460502
+12
+7.303449940140751
+22
+-147.6571383459964
+32
+209.8879871355549
+13
+7.303449940140751
+23
+-147.6571383459964
+33
+209.8879871355549
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.303449940140751
+20
+-147.6571383459964
+30
+209.8879871355549
+11
+8.012292612823966
+21
+-148.9014158272303
+31
+211.4018073670016
+12
+8.01594330470044
+22
+-148.397924572599
+32
+211.46021843702542
+13
+8.01594330470044
+23
+-148.397924572599
+33
+211.46021843702542
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.29949502394124
+20
+-148.0453285821951
+30
+209.5594248666712
+11
+8.012292612823966
+21
+-148.9014158272303
+31
+211.4018073670016
+12
+7.303449940140751
+22
+-147.6571383459964
+32
+209.8879871355549
+13
+7.303449940140751
+23
+-147.6571383459964
+33
+209.8879871355549
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+8.907016346884607
+20
+-148.75843039540158
+30
+212.29500997944717
+11
+8.489924799996755
+21
+-148.26589121639987
+31
+211.48394793422273
+12
+8.361237911350845
+22
+-148.6975855307935
+32
+211.9777040105164
+13
+8.361237911350845
+23
+-148.6975855307935
+33
+211.9777040105164
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+8.489924799996755
+20
+-148.26589121639987
+30
+211.48394793422273
+11
+8.01594330470044
+21
+-148.397924572599
+31
+211.46021843702542
+12
+8.361237911350845
+22
+-148.6975855307935
+32
+211.9777040105164
+13
+8.361237911350845
+23
+-148.6975855307935
+33
+211.9777040105164
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.743908159232596
+20
+-146.83177775758907
+30
+211.5040267395433
+11
+11.137284859090824
+21
+-147.5275387843816
+31
+211.5450970231536
+12
+11.93465680977868
+22
+-147.17068365345597
+32
+212.2691509119891
+13
+11.93465680977868
+23
+-147.17068365345597
+33
+212.2691509119891
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.80027756000012
+20
+-142.2583735093252
+30
+197.53708806877842
+11
+6.334799695581406
+21
+-144.66357100728018
+31
+200.35237995418998
+12
+6.077730142612612
+22
+-143.9106158077562
+32
+200.44760216730137
+13
+6.077730142612612
+23
+-143.9106158077562
+33
+200.44760216730137
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.334799695581406
+20
+-144.66357100728018
+30
+200.35237995418998
+11
+5.80027756000012
+21
+-142.2583735093252
+31
+197.53708806877842
+12
+5.969122059287315
+22
+-142.7719041666167
+32
+197.54499790117717
+13
+5.969122059287315
+23
+-142.7719041666167
+33
+197.54499790117717
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.690148355059654
+20
+-141.71715843863726
+30
+197.86869258089212
+11
+6.077730142612612
+21
+-143.9106158077562
+31
+200.44760216730137
+12
+5.89732511904988
+22
+-143.02228078447965
+32
+200.9370991030733
+13
+5.89732511904988
+23
+-143.02228078447965
+33
+200.9370991030733
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.077730142612612
+20
+-143.9106158077562
+30
+200.44760216730137
+11
+5.690148355059654
+21
+-141.71715843863726
+31
+197.86869258089212
+12
+5.80027756000012
+22
+-142.2583735093252
+32
+197.53708806877842
+13
+5.80027756000012
+23
+-142.2583735093252
+33
+197.53708806877842
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.076513245320436
+20
+-141.641710806523
+30
+197.18205828379092
+11
+7.437612866601397
+21
+-141.65479245241372
+31
+197.1714104324845
+12
+6.209155050165891
+22
+-142.07644736414719
+32
+197.11604160569115
+13
+6.209155050165891
+23
+-142.07644736414719
+33
+197.11604160569115
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.019608646744442
+20
+-140.76828277507516
+30
+197.22099899714027
+11
+7.437612866601397
+21
+-141.65479245241372
+31
+197.1714104324845
+12
+6.076513245320436
+22
+-141.641710806523
+32
+197.18205828379092
+13
+6.076513245320436
+23
+-141.641710806523
+33
+197.18205828379092
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.019608646744442
+20
+-140.76828277507516
+30
+197.22099899714027
+11
+6.076513245320436
+21
+-141.641710806523
+31
+197.18205828379092
+12
+6.072558329120925
+22
+-141.08011270619122
+32
+197.20487510801908
+13
+6.072558329120925
+23
+-141.08011270619122
+33
+197.20487510801908
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.550494740616763
+20
+-140.3654897713704
+30
+197.33721268854148
+11
+6.072558329120925
+21
+-141.08011270619122
+31
+197.20487510801908
+12
+6.096592050641084
+22
+-140.48991751949356
+32
+197.25385522402865
+13
+6.096592050641084
+23
+-140.48991751949356
+33
+197.25385522402865
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.893964001328927
+20
+-141.70438101707103
+30
+204.00063803608637
+11
+7.356689196672754
+21
+-143.46127648262754
+31
+205.68330276682016
+12
+7.726017524843317
+22
+-142.69463118856677
+32
+205.43475149489677
+13
+7.726017524843317
+23
+-142.69463118856677
+33
+205.43475149489677
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.893964001328927
+20
+-141.70438101707103
+30
+204.00063803608637
+11
+6.49086677330092
+21
+-142.4758939003005
+31
+204.33619746439933
+12
+7.356689196672754
+22
+-143.46127648262754
+32
+205.68330276682016
+13
+7.356689196672754
+23
+-143.46127648262754
+33
+205.68330276682016
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+8.644166531778039
+20
+-142.5881526755025
+30
+205.3197547007872
+11
+7.755223059855162
+21
+-141.27451204861555
+31
+203.72348967779715
+12
+7.726017524843317
+22
+-142.69463118856677
+32
+205.43475149489677
+13
+7.726017524843317
+23
+-142.69463118856677
+33
+205.43475149489677
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.755223059855162
+20
+-141.27451204861555
+30
+203.72348967779715
+11
+6.893964001328927
+21
+-141.70438101707103
+31
+204.00063803608637
+12
+7.726017524843317
+22
+-142.69463118856677
+32
+205.43475149489677
+13
+7.726017524843317
+23
+-142.69463118856677
+33
+205.43475149489677
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.36029593804668
+20
+-143.21576745393426
+30
+206.0328565139932
+11
+9.332321950494507
+21
+-142.1792751853365
+31
+204.11320103561107
+12
+8.644166531778039
+22
+-142.5881526755025
+32
+205.3197547007872
+13
+8.644166531778039
+23
+-142.5881526755025
+33
+205.3197547007872
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.332321950494507
+20
+-142.1792751853365
+30
+204.11320103561107
+11
+7.755223059855162
+21
+-141.27451204861555
+31
+203.72348967779715
+12
+8.644166531778039
+22
+-142.5881526755025
+32
+205.3197547007872
+13
+8.644166531778039
+23
+-142.5881526755025
+33
+205.3197547007872
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.81389440369931
+20
+-144.43449009203184
+30
+203.62279142687
+11
+10.36029593804668
+21
+-143.21576745393426
+31
+206.0328565139932
+12
+11.617046616524927
+22
+-145.07366539473944
+32
+205.8265924229716
+13
+11.617046616524927
+23
+-145.07366539473944
+33
+205.8265924229716
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.81389440369931
+20
+-144.43449009203184
+30
+203.62279142687
+11
+9.332321950494507
+21
+-142.1792751853365
+31
+204.11320103561107
+12
+10.36029593804668
+22
+-143.21576745393426
+32
+206.0328565139932
+13
+10.36029593804668
+23
+-143.21576745393426
+33
+206.0328565139932
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.1795720399934
+20
+-146.17860813602007
+30
+203.07549186972062
+11
+11.617046616524927
+21
+-145.07366539473944
+31
+205.8265924229716
+12
+11.451852809114193
+22
+-147.10557964832347
+32
+205.40280794097626
+13
+11.451852809114193
+23
+-147.10557964832347
+33
+205.40280794097626
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.1795720399934
+20
+-146.17860813602007
+30
+203.07549186972062
+11
+10.81389440369931
+21
+-144.43449009203184
+31
+203.62279142687
+12
+11.617046616524927
+22
+-145.07366539473944
+32
+205.8265924229716
+13
+11.617046616524927
+23
+-145.07366539473944
+33
+205.8265924229716
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.604298495292285
+20
+-148.12138466295326
+30
+202.34657039171628
+11
+11.451852809114193
+21
+-147.10557964832347
+31
+205.40280794097626
+12
+10.066111017667009
+22
+-148.3562458403409
+32
+204.7392946924256
+13
+10.066111017667009
+23
+-148.3562458403409
+33
+204.7392946924256
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.604298495292285
+20
+-148.12138466295326
+30
+202.34657039171628
+11
+11.1795720399934
+21
+-146.17860813602007
+31
+203.07549186972062
+12
+11.451852809114193
+22
+-147.10557964832347
+32
+205.40280794097626
+13
+11.451852809114193
+23
+-147.10557964832347
+33
+205.40280794097626
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.604298495292285
+20
+-148.12138466295326
+30
+202.34657039171628
+11
+7.515190068976608
+21
+-147.65318342979552
+31
+205.56191726192606
+12
+7.137647684083975
+22
+-146.86311286286008
+32
+203.36115850905506
+13
+7.137647684083975
+23
+-146.86311286286008
+33
+203.36115850905506
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.066111017667009
+20
+-148.3562458403409
+30
+204.7392946924256
+11
+7.515190068976608
+21
+-147.65318342979552
+31
+205.56191726192606
+12
+9.604298495292285
+22
+-148.12138466295326
+32
+202.34657039171628
+13
+9.604298495292285
+23
+-148.12138466295326
+33
+202.34657039171628
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.719947688550046
+20
+-146.25253464651956
+30
+206.27714864539348
+11
+8.029329174914196
+21
+-148.5999295230964
+31
+207.0294953962709
+12
+6.952375071352593
+22
+-147.16551183996287
+32
+207.38726320016622
+13
+6.952375071352593
+23
+-147.16551183996287
+33
+207.38726320016622
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.515190068976608
+20
+-147.65318342979552
+30
+205.56191726192606
+11
+8.029329174914196
+21
+-148.5999295230964
+31
+207.0294953962709
+12
+6.719947688550046
+22
+-146.25253464651956
+32
+206.27714864539348
+13
+6.719947688550046
+23
+-146.25253464651956
+33
+206.27714864539348
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.356689196672754
+20
+-143.46127648262754
+30
+205.68330276682016
+11
+7.3122724455089205
+21
+-146.01980303939447
+31
+208.1423479699519
+12
+8.38953077339355
+22
+-145.59753967901474
+32
+207.46392772957273
+13
+8.38953077339355
+23
+-145.59753967901474
+33
+207.46392772957273
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.356689196672754
+20
+-143.46127648262754
+30
+205.68330276682016
+11
+7.0345156385734136
+21
+-144.8987364089918
+31
+206.54942941451466
+12
+7.3122724455089205
+22
+-146.01980303939447
+32
+208.1423479699519
+13
+7.3122724455089205
+23
+-146.01980303939447
+33
+208.1423479699519
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.726017524843317
+20
+-142.69463118856677
+30
+205.43475149489677
+11
+8.38953077339355
+21
+-145.59753967901474
+31
+207.46392772957273
+12
+9.694653119235165
+22
+-145.04354718675887
+32
+207.29995081945432
+13
+9.694653119235165
+23
+-145.04354718675887
+33
+207.29995081945432
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.726017524843317
+20
+-142.69463118856677
+30
+205.43475149489677
+11
+7.356689196672754
+21
+-143.46127648262754
+31
+205.68330276682016
+12
+8.38953077339355
+22
+-145.59753967901474
+32
+207.46392772957273
+13
+8.38953077339355
+23
+-145.59753967901474
+33
+207.46392772957273
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+8.644166531778039
+20
+-142.5881526755025
+30
+205.3197547007872
+11
+9.694653119235165
+21
+-145.04354718675887
+31
+207.29995081945432
+12
+10.5194052589966
+22
+-144.07824340975304
+32
+207.57709917774372
+13
+10.5194052589966
+23
+-144.07824340975304
+33
+207.57709917774372
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+8.644166531778039
+20
+-142.5881526755025
+30
+205.3197547007872
+11
+7.726017524843317
+21
+-142.69463118856677
+31
+205.43475149489677
+12
+9.694653119235165
+22
+-145.04354718675887
+32
+207.29995081945432
+13
+9.694653119235165
+23
+-145.04354718675887
+33
+207.29995081945432
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.851313995433236
+20
+-143.86650328091721
+30
+207.5256852671503
+11
+10.36029593804668
+21
+-143.21576745393426
+31
+206.0328565139932
+12
+10.5194052589966
+22
+-144.07824340975304
+32
+207.57709917774372
+13
+10.5194052589966
+23
+-144.07824340975304
+33
+207.57709917774372
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.5194052589966
+20
+-144.07824340975304
+30
+207.57709917774372
+11
+10.36029593804668
+21
+-143.21576745393426
+31
+206.0328565139932
+12
+8.644166531778039
+22
+-142.5881526755025
+32
+205.3197547007872
+13
+8.644166531778039
+23
+-142.5881526755025
+33
+205.3197547007872
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.617046616524927
+20
+-145.07366539473944
+30
+205.8265924229716
+11
+10.851313995433236
+21
+-143.86650328091721
+31
+207.5256852671503
+12
+12.160999706120437
+22
+-145.7271392406299
+32
+207.78366749308773
+13
+12.160999706120437
+23
+-145.7271392406299
+33
+207.78366749308773
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.617046616524927
+20
+-145.07366539473944
+30
+205.8265924229716
+11
+10.36029593804668
+21
+-143.21576745393426
+31
+206.0328565139932
+12
+10.851313995433236
+22
+-143.86650328091721
+32
+207.5256852671503
+13
+10.851313995433236
+23
+-143.86650328091721
+33
+207.5256852671503
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.451852809114193
+20
+-147.10557964832347
+30
+205.40280794097626
+11
+12.160999706120437
+21
+-145.7271392406299
+31
+207.78366749308773
+12
+11.565936930254193
+22
+-147.42714475777726
+32
+207.24275664672223
+13
+11.565936930254193
+23
+-147.42714475777726
+33
+207.24275664672223
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.451852809114193
+20
+-147.10557964832347
+30
+205.40280794097626
+11
+11.617046616524927
+21
+-145.07366539473944
+31
+205.8265924229716
+12
+12.160999706120437
+22
+-145.7271392406299
+32
+207.78366749308773
+13
+12.160999706120437
+23
+-145.7271392406299
+33
+207.78366749308773
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.066111017667009
+20
+-148.3562458403409
+30
+204.7392946924256
+11
+11.565936930254193
+21
+-147.42714475777726
+31
+207.24275664672223
+12
+10.386155005505056
+22
+-148.55277475302515
+32
+206.5801560711404
+13
+10.386155005505056
+23
+-148.55277475302515
+33
+206.5801560711404
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.066111017667009
+20
+-148.3562458403409
+30
+204.7392946924256
+11
+11.451852809114193
+21
+-147.10557964832347
+31
+205.40280794097626
+12
+11.565936930254193
+22
+-147.42714475777726
+32
+207.24275664672223
+13
+11.565936930254193
+23
+-147.42714475777726
+33
+207.24275664672223
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.066111017667009
+20
+-148.3562458403409
+30
+204.7392946924256
+11
+8.029329174914196
+21
+-148.5999295230964
+31
+207.0294953962709
+12
+7.515190068976608
+22
+-147.65318342979552
+32
+205.56191726192606
+13
+7.515190068976608
+23
+-147.65318342979552
+33
+205.56191726192606
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.386155005505056
+20
+-148.55277475302515
+30
+206.5801560711404
+11
+8.029329174914196
+21
+-148.5999295230964
+31
+207.0294953962709
+12
+10.066111017667009
+22
+-148.3562458403409
+32
+204.7392946924256
+13
+10.066111017667009
+23
+-148.3562458403409
+33
+204.7392946924256
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+8.926486703559155
+20
+-149.19225428005592
+30
+209.60110359892786
+11
+7.29949502394124
+21
+-148.0453285821951
+31
+209.5594248666712
+12
+6.952375071352593
+22
+-147.16551183996287
+32
+207.38726320016622
+13
+6.952375071352593
+23
+-147.16551183996287
+33
+207.38726320016622
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+8.029329174914196
+20
+-148.5999295230964
+30
+207.0294953962709
+11
+8.926486703559155
+21
+-149.19225428005592
+31
+209.60110359892786
+12
+6.952375071352593
+22
+-147.16551183996287
+32
+207.38726320016622
+13
+6.952375071352593
+23
+-147.16551183996287
+33
+207.38726320016622
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.595780214247164
+20
+-147.43201234694672
+30
+210.32211524453314
+11
+8.38953077339355
+21
+-145.59753967901474
+31
+207.46392772957273
+12
+7.8035947272185275
+22
+-147.23122429374018
+32
+209.85695625460502
+13
+7.8035947272185275
+23
+-147.23122429374018
+33
+209.85695625460502
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+8.38953077339355
+20
+-145.59753967901474
+30
+207.46392772957273
+11
+7.3122724455089205
+21
+-146.01980303939447
+31
+208.1423479699519
+12
+7.8035947272185275
+22
+-147.23122429374018
+32
+209.85695625460502
+13
+7.8035947272185275
+23
+-147.23122429374018
+33
+209.85695625460502
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.027459878473397
+20
+-146.6036095153089
+30
+210.1420144452933
+11
+9.694653119235165
+21
+-145.04354718675887
+31
+207.29995081945432
+12
+9.595780214247164
+22
+-147.43201234694672
+32
+210.32211524453314
+13
+9.595780214247164
+23
+-147.43201234694672
+33
+210.32211524453314
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.694653119235165
+20
+-145.04354718675887
+30
+207.29995081945432
+11
+8.38953077339355
+21
+-145.59753967901474
+31
+207.46392772957273
+12
+9.595780214247164
+22
+-147.43201234694672
+32
+210.32211524453314
+13
+9.595780214247164
+23
+-147.43201234694672
+33
+210.32211524453314
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.5194052589966
+20
+-144.07824340975304
+30
+207.57709917774372
+11
+11.027459878473397
+21
+-146.6036095153089
+31
+210.1420144452933
+12
+11.41625856331852
+22
+-146.06209022029768
+32
+209.8885955842014
+13
+11.41625856331852
+23
+-146.06209022029768
+33
+209.8885955842014
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.694653119235165
+20
+-145.04354718675887
+30
+207.29995081945432
+11
+11.027459878473397
+21
+-146.6036095153089
+31
+210.1420144452933
+12
+10.5194052589966
+22
+-144.07824340975304
+32
+207.57709917774372
+13
+10.5194052589966
+23
+-144.07824340975304
+33
+207.57709917774372
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.851313995433236
+20
+-143.86650328091721
+30
+207.5256852671503
+11
+11.41625856331852
+21
+-146.06209022029768
+31
+209.8885955842014
+12
+11.938915950301228
+22
+-145.67815912462106
+32
+209.96738968386896
+13
+11.938915950301228
+23
+-145.67815912462106
+33
+209.96738968386896
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.851313995433236
+20
+-143.86650328091721
+30
+207.5256852671503
+11
+10.5194052589966
+21
+-144.07824340975304
+31
+207.57709917774372
+12
+11.41625856331852
+22
+-146.06209022029768
+32
+209.8885955842014
+13
+11.41625856331852
+23
+-146.06209022029768
+33
+209.8885955842014
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.160999706120437
+20
+-145.7271392406299
+30
+207.78366749308773
+11
+11.938915950301228
+21
+-145.67815912462106
+31
+209.96738968386896
+12
+12.230971300419641
+22
+-146.50260704005942
+32
+210.02002049175462
+13
+12.230971300419641
+23
+-146.50260704005942
+33
+210.02002049175462
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.851313995433236
+20
+-143.86650328091721
+30
+207.5256852671503
+11
+11.938915950301228
+21
+-145.67815912462106
+31
+209.96738968386896
+12
+12.160999706120437
+22
+-145.7271392406299
+32
+207.78366749308773
+13
+12.160999706120437
+23
+-145.7271392406299
+33
+207.78366749308773
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.565936930254193
+20
+-147.42714475777726
+30
+207.24275664672223
+11
+12.230971300419641
+21
+-146.50260704005942
+31
+210.02002049175462
+12
+11.802623453579313
+22
+-147.6696115432407
+32
+209.48823637507996
+13
+11.802623453579313
+23
+-147.6696115432407
+33
+209.48823637507996
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.565936930254193
+20
+-147.42714475777726
+30
+207.24275664672223
+11
+12.160999706120437
+21
+-145.7271392406299
+31
+207.78366749308773
+12
+12.230971300419641
+22
+-146.50260704005942
+32
+210.02002049175462
+13
+12.230971300419641
+23
+-146.50260704005942
+33
+210.02002049175462
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.900048487789717
+20
+-145.97873275578186
+30
+199.627413392385
+11
+7.081670408644615
+21
+-146.45119312946346
+31
+201.53672524378425
+12
+6.334799695581406
+22
+-144.66357100728018
+32
+200.35237995418998
+13
+6.334799695581406
+23
+-144.66357100728018
+33
+200.35237995418998
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.334799695581406
+20
+-144.66357100728018
+30
+200.35237995418998
+11
+7.081670408644615
+21
+-146.45119312946346
+31
+201.53672524378425
+12
+6.578179154013404
+22
+-145.12781732423966
+32
+202.26017068397334
+13
+6.578179154013404
+23
+-145.12781732423966
+33
+202.26017068397334
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.818835243705565
+20
+-141.39711445079982
+30
+200.79593901718277
+11
+6.161087607125563
+21
+-143.4965665040993
+31
+202.83819689775012
+12
+6.178124169215804
+22
+-141.93194081070456
+32
+202.65809609851084
+13
+6.178124169215804
+23
+-141.93194081070456
+33
+202.65809609851084
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+5.818835243705565
+20
+-141.39711445079982
+30
+200.79593901718277
+11
+5.89732511904988
+21
+-143.02228078447965
+31
+200.9370991030733
+12
+6.161087607125563
+22
+-143.4965665040993
+32
+202.83819689775012
+13
+6.161087607125563
+23
+-143.4965665040993
+33
+202.83819689775012
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.323543395628918
+20
+-140.4092980738888
+30
+200.57446371001026
+11
+6.178124169215804
+21
+-141.93194081070456
+31
+202.65809609851084
+12
+6.583655191828118
+22
+-141.20606157593105
+32
+202.3830773104825
+13
+6.583655191828118
+23
+-141.20606157593105
+33
+202.3830773104825
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.323543395628918
+20
+-140.4092980738888
+30
+200.57446371001026
+11
+5.818835243705565
+21
+-141.39711445079982
+31
+200.79593901718277
+12
+6.178124169215804
+22
+-141.93194081070456
+32
+202.65809609851084
+13
+6.178124169215804
+23
+-141.93194081070456
+33
+202.65809609851084
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.59854753348956
+20
+-140.7609813913234
+30
+201.95868437984217
+11
+7.532835079712915
+21
+-140.05122604567063
+31
+200.1333384416024
+12
+6.583655191828118
+22
+-141.20606157593105
+32
+202.3830773104825
+13
+6.583655191828118
+23
+-141.20606157593105
+33
+202.3830773104825
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.532835079712915
+20
+-140.05122604567063
+30
+200.1333384416024
+11
+6.323543395628918
+21
+-140.4092980738888
+31
+200.57446371001026
+12
+6.583655191828118
+22
+-141.20606157593105
+32
+202.3830773104825
+13
+6.583655191828118
+23
+-141.20606157593105
+33
+202.3830773104825
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.14248597291755
+20
+-141.8698790488043
+30
+202.26382137585094
+11
+8.992503381658839
+21
+-141.38920461840058
+31
+200.36576582440424
+12
+7.59854753348956
+22
+-140.7609813913234
+32
+201.95868437984217
+13
+7.59854753348956
+23
+-140.7609813913234
+33
+201.95868437984217
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+8.992503381658839
+20
+-141.38920461840058
+30
+200.36576582440424
+11
+7.532835079712915
+21
+-140.05122604567063
+31
+200.1333384416024
+12
+7.59854753348956
+22
+-140.7609813913234
+32
+201.95868437984217
+13
+7.59854753348956
+23
+-140.7609813913234
+33
+201.95868437984217
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.002528134151632
+20
+-143.86102724310052
+30
+200.00465155295512
+11
+9.14248597291755
+21
+-141.8698790488043
+31
+202.26382137585094
+12
+10.411101399994353
+22
+-144.21544857944258
+32
+201.85768190459197
+13
+10.411101399994353
+23
+-144.21544857944258
+33
+201.85768190459197
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.002528134151632
+20
+-143.86102724310052
+30
+200.00465155295512
+11
+8.992503381658839
+21
+-141.38920461840058
+31
+200.36576582440424
+12
+9.14248597291755
+22
+-141.8698790488043
+32
+202.26382137585094
+13
+9.14248597291755
+23
+-141.8698790488043
+33
+202.26382137585094
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.206358430588446
+20
+-145.2352085102721
+30
+199.46556605252823
+11
+10.411101399994353
+21
+-144.21544857944258
+31
+201.85768190459197
+12
+10.789860682179151
+22
+-145.65777609497508
+32
+201.28939086915258
+13
+10.789860682179151
+23
+-145.65777609497508
+33
+201.28939086915258
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.206358430588446
+20
+-145.2352085102721
+30
+199.46556605252823
+11
+10.002528134151632
+21
+-143.86102724310052
+31
+200.00465155295512
+12
+10.411101399994353
+22
+-144.21544857944258
+32
+201.85768190459197
+13
+10.411101399994353
+23
+-144.21544857944258
+33
+201.85768190459197
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.097460773107619
+20
+-146.60695598285923
+30
+198.7558107068755
+11
+10.789860682179151
+21
+-145.65777609497508
+31
+201.28939086915258
+12
+9.408378031254525
+22
+-147.56830484366606
+32
+200.4129205944742
+13
+9.408378031254525
+23
+-147.56830484366606
+33
+200.4129205944742
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.097460773107619
+20
+-146.60695598285923
+30
+198.7558107068755
+11
+10.206358430588446
+21
+-145.2352085102721
+31
+199.46556605252823
+12
+10.789860682179151
+22
+-145.65777609497508
+32
+201.28939086915258
+13
+10.789860682179151
+23
+-145.65777609497508
+33
+201.28939086915258
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.408378031254525
+20
+-147.56830484366606
+30
+200.4129205944742
+11
+7.081670408644615
+21
+-146.45119312946346
+31
+201.53672524378425
+12
+9.097460773107619
+22
+-146.60695598285923
+32
+198.7558107068755
+13
+9.097460773107619
+23
+-146.60695598285923
+33
+198.7558107068755
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.097460773107619
+20
+-146.60695598285923
+30
+198.7558107068755
+11
+7.081670408644615
+21
+-146.45119312946346
+31
+201.53672524378425
+12
+6.900048487789717
+22
+-145.97873275578186
+32
+199.627413392385
+13
+6.900048487789717
+23
+-145.97873275578186
+33
+199.627413392385
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.578179154013404
+20
+-145.12781732423966
+30
+202.26017068397334
+11
+7.137647684083975
+21
+-146.86311286286008
+31
+203.36115850905506
+12
+6.593086145842365
+22
+-145.52726386039163
+32
+204.08551662221353
+13
+6.593086145842365
+23
+-145.52726386039163
+33
+204.08551662221353
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.081670408644615
+20
+-146.45119312946346
+30
+201.53672524378425
+11
+7.137647684083975
+21
+-146.86311286286008
+31
+203.36115850905506
+12
+6.578179154013404
+22
+-145.12781732423966
+32
+202.26017068397334
+13
+6.578179154013404
+23
+-145.12781732423966
+33
+202.26017068397334
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.178124169215804
+20
+-141.93194081070456
+30
+202.65809609851084
+11
+6.382562914298684
+21
+-143.8680244025317
+31
+204.64407247931547
+12
+6.49086677330092
+22
+-142.4758939003005
+32
+204.33619746439933
+13
+6.49086677330092
+23
+-142.4758939003005
+33
+204.33619746439933
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.178124169215804
+20
+-141.93194081070456
+30
+202.65809609851084
+11
+6.161087607125563
+21
+-143.4965665040993
+31
+202.83819689775012
+12
+6.382562914298684
+22
+-143.8680244025317
+32
+204.64407247931547
+13
+6.382562914298684
+23
+-143.8680244025317
+33
+204.64407247931547
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.583655191828118
+20
+-141.20606157593105
+30
+202.3830773104825
+11
+6.49086677330092
+21
+-142.4758939003005
+31
+204.33619746439933
+12
+6.893964001328927
+22
+-141.70438101707103
+32
+204.00063803608637
+13
+6.893964001328927
+23
+-141.70438101707103
+33
+204.00063803608637
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.583655191828118
+20
+-141.20606157593105
+30
+202.3830773104825
+11
+6.178124169215804
+21
+-141.93194081070456
+31
+202.65809609851084
+12
+6.49086677330092
+22
+-142.4758939003005
+32
+204.33619746439933
+13
+6.49086677330092
+23
+-142.4758939003005
+33
+204.33619746439933
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.755223059855162
+20
+-141.27451204861555
+30
+203.72348967779715
+11
+7.59854753348956
+21
+-140.7609813913234
+31
+201.95868437984217
+12
+6.893964001328927
+22
+-141.70438101707103
+32
+204.00063803608637
+13
+6.893964001328927
+23
+-141.70438101707103
+33
+204.00063803608637
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.59854753348956
+20
+-140.7609813913234
+30
+201.95868437984217
+11
+6.583655191828118
+21
+-141.20606157593105
+31
+202.3830773104825
+12
+6.893964001328927
+22
+-141.70438101707103
+32
+204.00063803608637
+13
+6.893964001328927
+23
+-141.70438101707103
+33
+204.00063803608637
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.332321950494507
+20
+-142.1792751853365
+30
+204.11320103561107
+11
+9.14248597291755
+21
+-141.8698790488043
+31
+202.26382137585094
+12
+7.755223059855162
+22
+-141.27451204861555
+32
+203.72348967779715
+13
+7.755223059855162
+23
+-141.27451204861555
+33
+203.72348967779715
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.14248597291755
+20
+-141.8698790488043
+30
+202.26382137585094
+11
+7.59854753348956
+21
+-140.7609813913234
+31
+201.95868437984217
+12
+7.755223059855162
+22
+-141.27451204861555
+32
+203.72348967779715
+13
+7.755223059855162
+23
+-141.27451204861555
+33
+203.72348967779715
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.411101399994353
+20
+-144.21544857944258
+30
+201.85768190459197
+11
+9.332321950494507
+21
+-142.1792751853365
+31
+204.11320103561107
+12
+10.81389440369931
+22
+-144.43449009203184
+32
+203.62279142687
+13
+10.81389440369931
+23
+-144.43449009203184
+33
+203.62279142687
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.411101399994353
+20
+-144.21544857944258
+30
+201.85768190459197
+11
+9.14248597291755
+21
+-141.8698790488043
+31
+202.26382137585094
+12
+9.332321950494507
+22
+-142.1792751853365
+32
+204.11320103561107
+13
+9.332321950494507
+23
+-142.1792751853365
+33
+204.11320103561107
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.789860682179151
+20
+-145.65777609497508
+30
+201.28939086915258
+11
+10.81389440369931
+21
+-144.43449009203184
+31
+203.62279142687
+12
+11.1795720399934
+22
+-146.17860813602007
+32
+203.07549186972062
+13
+11.1795720399934
+23
+-146.17860813602007
+33
+203.07549186972062
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+10.789860682179151
+20
+-145.65777609497508
+30
+201.28939086915258
+11
+10.411101399994353
+21
+-144.21544857944258
+31
+201.85768190459197
+12
+10.81389440369931
+22
+-144.43449009203184
+32
+203.62279142687
+13
+10.81389440369931
+23
+-144.43449009203184
+33
+203.62279142687
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.408378031254525
+20
+-147.56830484366606
+30
+200.4129205944742
+11
+11.1795720399934
+21
+-146.17860813602007
+31
+203.07549186972062
+12
+9.604298495292285
+22
+-148.12138466295326
+32
+202.34657039171628
+13
+9.604298495292285
+23
+-148.12138466295326
+33
+202.34657039171628
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.408378031254525
+20
+-147.56830484366606
+30
+200.4129205944742
+11
+10.789860682179151
+21
+-145.65777609497508
+31
+201.28939086915258
+12
+11.1795720399934
+22
+-146.17860813602007
+32
+203.07549186972062
+13
+11.1795720399934
+23
+-146.17860813602007
+33
+203.07549186972062
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.408378031254525
+20
+-147.56830484366606
+30
+200.4129205944742
+11
+7.137647684083975
+21
+-146.86311286286008
+31
+203.36115850905506
+12
+7.081670408644615
+22
+-146.45119312946346
+32
+201.53672524378425
+13
+7.081670408644615
+23
+-146.45119312946346
+33
+201.53672524378425
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.604298495292285
+20
+-148.12138466295326
+30
+202.34657039171628
+11
+7.137647684083975
+21
+-146.86311286286008
+31
+203.36115850905506
+12
+9.408378031254525
+22
+-147.56830484366606
+32
+200.4129205944742
+13
+9.408378031254525
+23
+-147.56830484366606
+33
+200.4129205944742
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.593086145842365
+20
+-145.52726386039163
+30
+204.08551662221353
+11
+7.515190068976608
+21
+-147.65318342979552
+31
+205.56191726192606
+12
+6.719947688550046
+22
+-146.25253464651956
+32
+206.27714864539348
+13
+6.719947688550046
+23
+-146.25253464651956
+33
+206.27714864539348
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+7.137647684083975
+20
+-146.86311286286008
+30
+203.36115850905506
+11
+7.515190068976608
+21
+-147.65318342979552
+31
+205.56191726192606
+12
+6.593086145842365
+22
+-145.52726386039163
+32
+204.08551662221353
+13
+6.593086145842365
+23
+-145.52726386039163
+33
+204.08551662221353
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.49086677330092
+20
+-142.4758939003005
+30
+204.33619746439933
+11
+7.0345156385734136
+21
+-144.8987364089918
+31
+206.54942941451466
+12
+7.356689196672754
+22
+-143.46127648262754
+32
+205.68330276682016
+13
+7.356689196672754
+23
+-143.46127648262754
+33
+205.68330276682016
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+6.49086677330092
+20
+-142.4758939003005
+30
+204.33619746439933
+11
+6.382562914298684
+21
+-143.8680244025317
+31
+204.64407247931547
+12
+7.0345156385734136
+22
+-144.8987364089918
+32
+206.54942941451466
+13
+7.0345156385734136
+23
+-144.8987364089918
+33
+206.54942941451466
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.743908159232596
+20
+-146.83177775758907
+30
+211.5040267395433
+11
+11.392833290444438
+21
+-147.45513339549825
+31
+211.6768261550298
+12
+11.137284859090824
+22
+-147.5275387843816
+32
+211.5450970231536
+13
+11.137284859090824
+23
+-147.5275387843816
+33
+211.5450970231536
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.137284859090824
+20
+-147.5275387843816
+30
+211.5450970231536
+11
+11.276577844131246
+21
+-147.53511946412166
+31
+211.74060822576112
+12
+9.969976131586353
+22
+-148.39974991853748
+32
+212.460812235504
+13
+9.969976131586353
+23
+-148.39974991853748
+33
+212.460812235504
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.276577844131246
+20
+-147.53511946412166
+30
+211.74060822576112
+11
+11.137284859090824
+21
+-147.5275387843816
+31
+211.5450970231536
+12
+11.392833290444438
+22
+-147.45513339549825
+32
+211.6768261550298
+13
+11.392833290444438
+23
+-147.45513339549825
+33
+211.6768261550298
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.969976131586353
+20
+-148.39974991853748
+30
+212.460812235504
+11
+11.223758397176072
+21
+-147.52472286950308
+31
+211.6723290380678
+12
+9.189032294342686
+22
+-148.22968852195797
+32
+211.6546177794481
+13
+9.189032294342686
+23
+-148.22968852195797
+33
+211.6546177794481
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+11.223758397176072
+20
+-147.52472286950308
+30
+211.6723290380678
+11
+9.969976131586353
+21
+-148.39974991853748
+31
+212.460812235504
+12
+11.276577844131246
+22
+-147.53511946412166
+32
+211.74060822576112
+13
+11.276577844131246
+23
+-147.53511946412166
+33
+211.74060822576112
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.969976131586353
+20
+-148.39974991853748
+30
+212.460812235504
+11
+9.189032294342686
+21
+-148.22968852195797
+31
+211.6546177794481
+12
+8.907016346884607
+22
+-148.75843039540158
+32
+212.29500997944717
+13
+8.907016346884607
+23
+-148.75843039540158
+33
+212.29500997944717
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+9.189032294342686
+20
+-148.22968852195797
+30
+211.6546177794481
+11
+8.489924799996755
+21
+-148.26589121639987
+31
+211.48394793422273
+12
+8.907016346884607
+22
+-148.75843039540158
+32
+212.29500997944717
+13
+8.907016346884607
+23
+-148.75843039540158
+33
+212.29500997944717
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+12.149743406167948
+20
+-147.0182672676128
+30
+212.29135928757074
+11
+12.055738090348596
+21
+-146.60208839369415
+31
+211.65066286324895
+12
+11.93465680977868
+22
+-147.17068365345597
+32
+212.2691509119891
+13
+11.93465680977868
+23
+-147.17068365345597
+33
+212.2691509119891
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.07736388842455
+20
+-117.47260946261211
+30
+204.53576862032003
+11
+31.635311296879912
+21
+-118.22708578375165
+31
+205.97140320074553
+12
+30.215192156929195
+22
+-118.69619968987911
+32
+204.72986373841925
+13
+30.215192156929195
+23
+-118.69619968987911
+33
+204.72986373841925
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.215192156929195
+20
+-118.69619968987911
+30
+204.72986373841925
+11
+31.635311296879912
+21
+-118.22708578375165
+31
+205.97140320074553
+12
+30.885094116263275
+22
+-119.24502036864358
+32
+206.0848788732393
+13
+30.885094116263275
+23
+-119.24502036864358
+33
+206.0848788732393
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.07736388842455
+20
+-117.47260946261211
+30
+204.53576862032003
+11
+31.322264468471754
+21
+-115.74187728883761
+31
+204.58687830659125
+12
+32.291523161677226
+22
+-115.60102142727042
+32
+206.00608477357278
+13
+32.291523161677226
+23
+-115.60102142727042
+33
+206.00608477357278
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.07736388842455
+20
+-117.47260946261211
+30
+204.53576862032003
+11
+32.291523161677226
+21
+-115.60102142727042
+31
+206.00608477357278
+12
+31.635311296879912
+22
+-118.22708578375165
+32
+205.97140320074553
+13
+31.635311296879912
+23
+-118.22708578375165
+33
+205.97140320074553
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.635311296879912
+20
+-118.22708578375165
+30
+205.97140320074553
+11
+32.43572549079815
+21
+-119.0265873047013
+31
+207.71825926364107
+12
+30.885094116263275
+22
+-119.24502036864358
+32
+206.0848788732393
+13
+30.885094116263275
+23
+-119.24502036864358
+33
+206.0848788732393
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.885094116263275
+20
+-119.24502036864358
+30
+206.0848788732393
+11
+32.43572549079815
+21
+-119.0265873047013
+31
+207.71825926364107
+12
+31.319526449564396
+22
+-120.41141642317946
+32
+207.6510256882489
+13
+31.319526449564396
+23
+-120.41141642317946
+33
+207.6510256882489
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.635311296879912
+20
+-118.22708578375165
+30
+205.97140320074553
+11
+32.291523161677226
+21
+-115.60102142727042
+31
+206.00608477357278
+12
+33.04447836120119
+22
+-115.95696388522776
+32
+208.10857907010208
+13
+33.04447836120119
+23
+-115.95696388522776
+33
+208.10857907010208
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.635311296879912
+20
+-118.22708578375165
+30
+205.97140320074553
+11
+33.04447836120119
+21
+-115.95696388522776
+31
+208.10857907010208
+12
+32.43572549079815
+22
+-119.0265873047013
+32
+207.71825926364107
+13
+32.43572549079815
+23
+-119.0265873047013
+33
+207.71825926364107
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.319526449564396
+20
+-120.41141642317946
+30
+207.6510256882489
+11
+32.43572549079815
+21
+-119.0265873047013
+31
+207.71825926364107
+12
+32.94530123189018
+22
+-119.3086032521602
+32
+210.85542048282935
+13
+32.94530123189018
+23
+-119.3086032521602
+33
+210.85542048282935
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.319526449564396
+20
+-120.41141642317946
+30
+207.6510256882489
+11
+32.94530123189018
+21
+-119.3086032521602
+31
+210.85542048282935
+12
+31.398320549231755
+22
+-122.14458239153882
+32
+209.89863498686796
+13
+31.398320549231755
+23
+-122.14458239153882
+33
+209.89863498686796
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.102093959595926
+20
+-119.45371825425136
+30
+215.066189338026
+11
+23.653377733279452
+21
+-119.61708671572386
+31
+214.56513187797907
+12
+26.50943567797897
+22
+-120.87505429149412
+32
+214.69351454230159
+13
+26.50943567797897
+23
+-120.87505429149412
+33
+214.69351454230159
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.584289511614323
+20
+-117.70290727515612
+30
+215.00716981935668
+11
+23.653377733279452
+21
+-119.61708671572386
+31
+214.56513187797907
+12
+25.102093959595926
+22
+-119.45371825425136
+32
+215.066189338026
+13
+25.102093959595926
+23
+-119.45371825425136
+33
+215.066189338026
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.799101184015615
+20
+-117.44309970327983
+30
+214.64210063170884
+11
+23.653377733279452
+21
+-119.61708671572386
+31
+214.56513187797907
+12
+25.584289511614323
+22
+-117.70290727515612
+32
+215.00716981935668
+13
+25.584289511614323
+23
+-117.70290727515612
+33
+215.00716981935668
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.544362874458475
+20
+-118.29036444294621
+30
+214.500636321495
+11
+31.536134167568875
+21
+-119.88145765244532
+31
+214.00870559113858
+12
+32.171963002722514
+22
+-118.43639211800526
+32
+213.9518156427307
+13
+32.171963002722514
+23
+-118.43639211800526
+33
+213.9518156427307
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.544362874458475
+20
+-118.29036444294621
+30
+214.500636321495
+11
+30.1467416842452
+21
+-119.4488506650825
+31
+214.351262178882
+12
+31.536134167568875
+22
+-119.88145765244532
+32
+214.00870559113858
+13
+31.536134167568875
+23
+-119.88145765244532
+33
+214.00870559113858
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.1467416842452
+20
+-119.4488506650825
+30
+214.351262178882
+11
+30.62346119844889
+21
+-122.61247940037529
+31
+213.6929207438226
+12
+31.536134167568875
+22
+-119.88145765244532
+32
+214.00870559113858
+13
+31.536134167568875
+23
+-119.88145765244532
+33
+214.00870559113858
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.1467416842452
+20
+-119.4488506650825
+30
+214.351262178882
+11
+29.599746351419277
+21
+-120.76340396493828
+31
+214.0832405502835
+12
+30.62346119844889
+22
+-122.61247940037529
+32
+213.6929207438226
+13
+30.62346119844889
+23
+-122.61247940037529
+33
+213.6929207438226
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.588534001969364
+20
+-115.26850424219012
+30
+215.43947258239706
+11
+26.06648506363272
+21
+-116.87024530299566
+31
+215.2605886804492
+12
+28.1966637735588
+22
+-117.05095455088136
+32
+215.01325430581758
+13
+28.1966637735588
+23
+-117.05095455088136
+33
+215.01325430581758
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.996454868663438
+20
+-115.5964580624273
+30
+215.65151693555595
+11
+28.1966637735588
+21
+-117.05095455088136
+31
+215.01325430581758
+12
+30.105062951988717
+22
+-117.4683503220923
+32
+215.19487622667253
+13
+30.105062951988717
+23
+-117.4683503220923
+33
+215.19487622667253
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.31622393251352
+20
+-118.06371732228142
+30
+213.96520151294462
+11
+28.1966637735588
+21
+-117.05095455088136
+31
+215.01325430581758
+12
+25.584289511614323
+22
+-117.70290727515612
+32
+215.00716981935668
+13
+25.584289511614323
+23
+-117.70290727515612
+33
+215.00716981935668
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.06648506363272
+20
+-116.87024530299566
+30
+215.2605886804492
+11
+25.584289511614323
+21
+-117.70290727515612
+31
+215.00716981935668
+12
+28.1966637735588
+22
+-117.05095455088136
+32
+215.01325430581758
+13
+28.1966637735588
+23
+-117.05095455088136
+33
+215.01325430581758
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.544362874458475
+20
+-118.29036444294621
+30
+214.500636321495
+11
+30.105062951988717
+21
+-117.4683503220923
+31
+215.19487622667253
+12
+28.31622393251352
+22
+-118.06371732228142
+32
+213.96520151294462
+13
+28.31622393251352
+23
+-118.06371732228142
+33
+213.96520151294462
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.105062951988717
+20
+-117.4683503220923
+30
+215.19487622667253
+11
+28.1966637735588
+21
+-117.05095455088136
+31
+215.01325430581758
+12
+28.31622393251352
+22
+-118.06371732228142
+32
+213.96520151294462
+13
+28.31622393251352
+23
+-118.06371732228142
+33
+213.96520151294462
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.31622393251352
+20
+-118.06371732228142
+30
+213.96520151294462
+11
+25.102093959595926
+21
+-119.45371825425136
+31
+215.066189338026
+12
+28.019300993226476
+22
+-119.79505794470197
+32
+214.29102576292
+13
+28.019300993226476
+23
+-119.79505794470197
+33
+214.29102576292
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.584289511614323
+20
+-117.70290727515612
+30
+215.00716981935668
+11
+25.102093959595926
+21
+-119.45371825425136
+31
+215.066189338026
+12
+28.31622393251352
+22
+-118.06371732228142
+32
+213.96520151294462
+13
+28.31622393251352
+23
+-118.06371732228142
+33
+213.96520151294462
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.544362874458475
+20
+-118.29036444294621
+30
+214.500636321495
+11
+28.019300993226476
+21
+-119.79505794470197
+31
+214.29102576292
+12
+30.1467416842452
+22
+-119.4488506650825
+32
+214.351262178882
+13
+30.1467416842452
+23
+-119.4488506650825
+33
+214.351262178882
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.31622393251352
+20
+-118.06371732228142
+30
+213.96520151294462
+11
+28.019300993226476
+21
+-119.79505794470197
+31
+214.29102576292
+12
+30.544362874458475
+22
+-118.29036444294621
+32
+214.500636321495
+13
+30.544362874458475
+23
+-118.29036444294621
+33
+214.500636321495
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.1467416842452
+20
+-119.4488506650825
+30
+214.351262178882
+11
+28.019300993226476
+21
+-119.79505794470197
+31
+214.29102576292
+12
+29.599746351419277
+22
+-120.76340396493828
+32
+214.0832405502835
+13
+29.599746351419277
+23
+-120.76340396493828
+33
+214.0832405502835
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.102093959595926
+20
+-119.45371825425136
+30
+215.066189338026
+11
+26.50943567797897
+21
+-120.87505429149412
+31
+214.69351454230159
+12
+28.019300993226476
+22
+-119.79505794470197
+32
+214.29102576292
+13
+28.019300993226476
+23
+-119.79505794470197
+33
+214.29102576292
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.432437623914794
+20
+-114.16873331440058
+30
+215.6058832871004
+11
+26.588534001969364
+21
+-115.26850424219012
+31
+215.43947258239706
+12
+28.1966637735588
+22
+-117.05095455088136
+32
+215.01325430581758
+13
+28.1966637735588
+23
+-117.05095455088136
+33
+215.01325430581758
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.432437623914794
+20
+-114.16873331440058
+30
+215.6058832871004
+11
+28.1966637735588
+21
+-117.05095455088136
+31
+215.01325430581758
+12
+29.996454868663438
+22
+-115.5964580624273
+32
+215.65151693555595
+13
+29.996454868663438
+23
+-115.5964580624273
+33
+215.65151693555595
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.019300993226476
+20
+-119.79505794470197
+30
+214.29102576292
+11
+27.923470331468888
+21
+-121.67060089624346
+31
+213.6567180493812
+12
+29.599746351419277
+22
+-120.76340396493828
+32
+214.0832405502835
+13
+29.599746351419277
+23
+-120.76340396493828
+33
+214.0832405502835
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.019300993226476
+20
+-119.79505794470197
+30
+214.29102576292
+11
+26.50943567797897
+21
+-120.87505429149412
+31
+214.69351454230159
+12
+27.923470331468888
+22
+-121.67060089624346
+32
+213.6567180493812
+13
+27.923470331468888
+23
+-121.67060089624346
+33
+213.6567180493812
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.941159292707752
+20
+-112.5326149050885
+30
+204.05600686288727
+11
+23.555113276937526
+21
+-115.54139345995476
+31
+205.8624908930979
+12
+24.568180272660726
+22
+-112.76473806356864
+32
+206.28992606696988
+13
+24.568180272660726
+23
+-112.76473806356864
+33
+206.28992606696988
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.555113276937526
+20
+-115.54139345995476
+30
+205.8624908930979
+11
+24.941159292707752
+21
+-112.5326149050885
+31
+204.05600686288727
+12
+24.091156534134015
+22
+-114.86601546280524
+32
+203.68485318877782
+13
+24.091156534134015
+23
+-114.86601546280524
+33
+203.68485318877782
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.02632745299145
+20
+-111.47786917710953
+30
+206.6647304329555
+11
+24.941159292707752
+21
+-112.5326149050885
+31
+204.05600686288727
+12
+24.568180272660726
+22
+-112.76473806356864
+32
+206.28992606696988
+13
+24.568180272660726
+23
+-112.76473806356864
+33
+206.28992606696988
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.941159292707752
+20
+-112.5326149050885
+30
+204.05600686288727
+11
+26.02632745299145
+21
+-111.47786917710953
+31
+206.6647304329555
+12
+26.16809598752809
+22
+-111.44957631506621
+32
+204.37148748587987
+13
+26.16809598752809
+23
+-111.44957631506621
+33
+204.37148748587987
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.182061006052884
+20
+-111.49977332836856
+30
+207.18738781993818
+11
+26.16809598752809
+21
+-111.44957631506621
+31
+204.37148748587987
+12
+26.02632745299145
+22
+-111.47786917710953
+32
+206.6647304329555
+13
+26.02632745299145
+23
+-111.47786917710953
+33
+206.6647304329555
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.16809598752809
+20
+-111.44957631506621
+30
+204.37148748587987
+11
+28.182061006052884
+21
+-111.49977332836856
+31
+207.18738781993818
+12
+27.980360279877363
+22
+-111.46782977444866
+32
+204.78705791115263
+13
+27.980360279877363
+23
+-111.46782977444866
+33
+204.78705791115263
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.182061006052884
+20
+-111.49977332836856
+30
+207.18738781993818
+11
+29.844038482820398
+21
+-112.0148251072746
+31
+204.49530678535697
+12
+27.980360279877363
+22
+-111.46782977444866
+32
+204.78705791115263
+13
+27.980360279877363
+23
+-111.46782977444866
+33
+204.78705791115263
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.844038482820398
+20
+-112.0148251072746
+30
+204.49530678535697
+11
+28.182061006052884
+21
+-111.49977332836856
+31
+207.18738781993818
+12
+30.40046476966056
+22
+-112.1511176039971
+32
+206.83996364302627
+13
+30.40046476966056
+23
+-112.1511176039971
+33
+206.83996364302627
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.368506565573856
+20
+-113.83804147525346
+30
+205.2385268065433
+11
+29.844038482820398
+21
+-112.0148251072746
+31
+204.49530678535697
+12
+30.40046476966056
+22
+-112.1511176039971
+32
+206.83996364302627
+13
+30.40046476966056
+23
+-112.1511176039971
+33
+206.83996364302627
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.844038482820398
+20
+-112.0148251072746
+30
+204.49530678535697
+11
+31.368506565573856
+21
+-113.83804147525346
+31
+205.2385268065433
+12
+30.67031174419705
+22
+-113.43950761207051
+32
+203.18805486925348
+13
+30.67031174419705
+23
+-113.43950761207051
+33
+203.18805486925348
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.322264468471754
+20
+-115.74187728883761
+30
+204.58687830659125
+11
+30.67031174419705
+21
+-113.43950761207051
+31
+203.18805486925348
+12
+31.368506565573856
+22
+-113.83804147525346
+32
+205.2385268065433
+13
+31.368506565573856
+23
+-113.83804147525346
+33
+205.2385268065433
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.67031174419705
+20
+-113.43950761207051
+30
+203.18805486925348
+11
+31.322264468471754
+21
+-115.74187728883761
+31
+204.58687830659125
+12
+30.63106680652487
+22
+-115.04398669178336
+32
+202.63892996616622
+13
+30.63106680652487
+23
+-115.04398669178336
+33
+202.63892996616622
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.665763029518956
+20
+-117.46165738698224
+30
+202.6361919472583
+11
+27.852281839877516
+21
+-119.46041118935558
+31
+205.00701209670842
+12
+27.69651898648105
+22
+-118.09383553025935
+32
+202.86010104901553
+13
+27.69651898648105
+23
+-118.09383553025935
+33
+202.86010104901553
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.852281839877516
+20
+-119.46041118935558
+30
+205.00701209670842
+11
+29.665763029518956
+21
+-117.46165738698224
+31
+202.6361919472583
+12
+30.215192156929195
+22
+-118.69619968987911
+32
+204.72986373841925
+13
+30.215192156929195
+23
+-118.69619968987911
+33
+204.72986373841925
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.273980702113516
+20
+-117.85867012854952
+30
+203.0745791967584
+11
+27.852281839877516
+21
+-119.46041118935558
+31
+205.00701209670842
+12
+24.942071965676877
+22
+-119.1780910175746
+32
+205.26469009832346
+13
+24.942071965676877
+23
+-119.1780910175746
+33
+205.26469009832346
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.852281839877516
+20
+-119.46041118935558
+30
+205.00701209670842
+11
+25.273980702113516
+21
+-117.85867012854952
+31
+203.0745791967584
+12
+27.69651898648105
+22
+-118.09383553025935
+32
+202.86010104901553
+13
+27.69651898648105
+23
+-118.09383553025935
+33
+202.86010104901553
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.056779185630486
+20
+-116.62047713377675
+30
+203.20843789889645
+11
+24.942071965676877
+21
+-119.1780910175746
+31
+205.26469009832346
+12
+23.513130320358
+22
+-117.63019766194702
+32
+205.2996758954734
+13
+23.513130320358
+23
+-117.63019766194702
+33
+205.2996758954734
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.942071965676877
+20
+-119.1780910175746
+30
+205.26469009832346
+11
+24.056779185630486
+21
+-116.62047713377675
+31
+203.20843789889645
+12
+25.273980702113516
+22
+-117.85867012854952
+32
+203.0745791967584
+13
+25.273980702113516
+23
+-117.85867012854952
+33
+203.0745791967584
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.091156534134015
+20
+-114.86601546280524
+30
+203.68485318877782
+11
+23.513130320358
+21
+-117.63019766194702
+31
+205.2996758954734
+12
+23.555113276937526
+22
+-115.54139345995476
+32
+205.8624908930979
+13
+23.555113276937526
+23
+-115.54139345995476
+33
+205.8624908930979
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.513130320358
+20
+-117.63019766194702
+30
+205.2996758954734
+11
+24.091156534134015
+21
+-114.86601546280524
+31
+203.68485318877782
+12
+24.056779185630486
+22
+-116.62047713377675
+32
+203.20843789889645
+13
+24.056779185630486
+23
+-116.62047713377675
+33
+203.20843789889645
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.07736388842455
+20
+-117.47260946261211
+30
+204.53576862032003
+11
+30.63106680652487
+21
+-115.04398669178336
+31
+202.63892996616622
+12
+31.322264468471754
+22
+-115.74187728883761
+32
+204.58687830659125
+13
+31.322264468471754
+23
+-115.74187728883761
+33
+204.58687830659125
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.63106680652487
+20
+-115.04398669178336
+30
+202.63892996616622
+11
+31.07736388842455
+21
+-117.47260946261211
+31
+204.53576862032003
+12
+30.426019612795915
+22
+-116.50456766669835
+32
+202.59938080417032
+13
+30.426019612795915
+23
+-116.50456766669835
+33
+202.59938080417032
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.665763029518956
+20
+-117.46165738698224
+30
+202.6361919472583
+11
+31.07736388842455
+21
+-117.47260946261211
+31
+204.53576862032003
+12
+30.215192156929195
+22
+-118.69619968987911
+32
+204.72986373841925
+13
+30.215192156929195
+23
+-118.69619968987911
+33
+204.72986373841925
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.07736388842455
+20
+-117.47260946261211
+30
+204.53576862032003
+11
+29.665763029518956
+21
+-117.46165738698224
+31
+202.6361919472583
+12
+30.426019612795915
+22
+-116.50456766669835
+32
+202.59938080417032
+13
+30.426019612795915
+23
+-116.50456766669835
+33
+202.59938080417032
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.818194065529514
+20
+-117.04973765358594
+30
+202.3839899834582
+11
+27.620462905721055
+21
+-117.4263673655096
+31
+202.47191081281665
+12
+25.87725753470186
+22
+-117.13431201539139
+32
+202.71224802801834
+13
+25.87725753470186
+23
+-117.13431201539139
+33
+202.71224802801834
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.950256722063934
+20
+-112.02060536941211
+30
+203.7627346154768
+11
+29.14036762362889
+21
+-112.37989429492241
+31
+203.6282674646927
+12
+25.754655132516742
+22
+-112.92628117910209
+32
+203.37728239818492
+13
+25.754655132516742
+23
+-112.92628117910209
+33
+203.37728239818492
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.14036762362889
+20
+-112.37989429492241
+30
+203.6282674646927
+11
+29.72326142657352
+21
+-113.3938739636144
+31
+202.76883375210437
+12
+25.754655132516742
+22
+-112.92628117910209
+32
+203.37728239818492
+13
+25.754655132516742
+23
+-112.92628117910209
+33
+203.37728239818492
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.754655132516742
+20
+-112.92628117910209
+30
+203.37728239818492
+11
+29.9298297419177
+21
+-114.8584098547288
+31
+202.2461763651216
+12
+25.09235878125865
+22
+-114.49486178869623
+32
+203.0977002453107
+13
+25.09235878125865
+23
+-114.49486178869623
+33
+203.0977002453107
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.754655132516742
+20
+-112.92628117910209
+30
+203.37728239818492
+11
+29.72326142657352
+21
+-113.3938739636144
+31
+202.76883375210437
+12
+29.9298297419177
+22
+-114.8584098547288
+32
+202.2461763651216
+13
+29.9298297419177
+23
+-114.8584098547288
+33
+202.2461763651216
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.09235878125865
+20
+-114.49486178869623
+30
+203.0977002453107
+11
+29.481707314079763
+21
+-115.73153366185365
+31
+202.2717312082568
+12
+25.18910211598536
+22
+-116.08960569007179
+32
+202.67513266060772
+13
+25.18910211598536
+23
+-116.08960569007179
+33
+202.67513266060772
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.09235878125865
+20
+-114.49486178869623
+30
+203.0977002453107
+11
+29.9298297419177
+21
+-114.8584098547288
+31
+202.2461763651216
+12
+29.481707314079763
+22
+-115.73153366185365
+32
+202.2717312082568
+13
+29.481707314079763
+23
+-115.73153366185365
+33
+202.2717312082568
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.481707314079763
+20
+-115.73153366185365
+30
+202.2717312082568
+11
+28.818194065529514
+21
+-117.04973765358594
+31
+202.3839899834582
+12
+25.18910211598536
+22
+-116.08960569007179
+32
+202.67513266060772
+13
+25.18910211598536
+23
+-116.08960569007179
+33
+202.67513266060772
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.18910211598536
+20
+-116.08960569007179
+30
+202.67513266060772
+11
+28.818194065529514
+21
+-117.04973765358594
+31
+202.3839899834582
+12
+25.87725753470186
+22
+-117.13431201539139
+32
+202.71224802801834
+13
+25.87725753470186
+23
+-117.13431201539139
+33
+202.71224802801834
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.941159292707752
+20
+-112.5326149050885
+30
+204.05600686288727
+11
+25.754655132516742
+21
+-112.92628117910209
+31
+203.37728239818492
+12
+25.09235878125865
+22
+-114.49486178869623
+32
+203.0977002453107
+13
+25.09235878125865
+23
+-114.49486178869623
+33
+203.0977002453107
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.941159292707752
+20
+-112.5326149050885
+30
+204.05600686288727
+11
+25.09235878125865
+21
+-114.49486178869623
+31
+203.0977002453107
+12
+24.091156534134015
+22
+-114.86601546280524
+32
+203.68485318877782
+13
+24.091156534134015
+23
+-114.86601546280524
+33
+203.68485318877782
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.43572549079815
+20
+-119.0265873047013
+30
+207.71825926364107
+11
+33.04447836120119
+21
+-115.95696388522776
+31
+208.10857907010208
+12
+33.58569343188935
+22
+-116.76133299534632
+32
+211.16816308691523
+13
+33.58569343188935
+23
+-116.76133299534632
+33
+211.16816308691523
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.43572549079815
+20
+-119.0265873047013
+30
+207.71825926364107
+11
+33.58569343188935
+21
+-116.76133299534632
+31
+211.16816308691523
+12
+32.94530123189018
+22
+-119.3086032521602
+32
+210.85542048282935
+13
+32.94530123189018
+23
+-119.3086032521602
+33
+210.85542048282935
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.398320549231755
+20
+-122.14458239153882
+30
+209.89863498686796
+11
+32.94530123189018
+21
+-119.3086032521602
+31
+210.85542048282935
+12
+32.12450400832823
+22
+-120.21610440778906
+32
+213.11215651113997
+13
+32.12450400832823
+23
+-120.21610440778906
+33
+213.11215651113997
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.398320549231755
+20
+-122.14458239153882
+30
+209.89863498686796
+11
+32.12450400832823
+21
+-120.21610440778906
+31
+213.11215651113997
+12
+30.94593898087128
+22
+-123.45518077519561
+32
+211.81038063285098
+13
+30.94593898087128
+23
+-123.45518077519561
+33
+211.81038063285098
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.94530123189018
+20
+-119.3086032521602
+30
+210.85542048282935
+11
+33.58569343188935
+21
+-116.76133299534632
+31
+211.16816308691523
+12
+32.895408442911595
+22
+-118.49480318802875
+32
+213.17087180548677
+13
+32.895408442911595
+23
+-118.49480318802875
+33
+213.17087180548677
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.94530123189018
+20
+-119.3086032521602
+30
+210.85542048282935
+11
+32.895408442911595
+21
+-118.49480318802875
+31
+213.17087180548677
+12
+32.12450400832823
+22
+-120.21610440778906
+32
+213.11215651113997
+13
+32.12450400832823
+23
+-120.21610440778906
+33
+213.11215651113997
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.86663898373049
+20
+-115.63387765416091
+30
+214.42701403531953
+11
+22.887340887864745
+21
+-117.30589453358861
+31
+213.8140020243936
+12
+23.799101184015615
+22
+-117.44309970327983
+32
+214.64210063170884
+13
+23.799101184015615
+23
+-117.44309970327983
+33
+214.64210063170884
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.231345346385364
+20
+-111.88492132133867
+30
+213.1769562919496
+11
+28.055807911991288
+21
+-111.96249852371339
+31
+211.24117692444597
+12
+25.57364166030791
+22
+-112.63148781007868
+32
+212.71392687228249
+13
+25.57364166030791
+23
+-112.63148781007868
+33
+212.71392687228249
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.837026673222947
+20
+-112.15203027696721
+30
+210.76871655076474
+11
+28.055807911991288
+21
+-111.96249852371339
+31
+211.24117692444597
+12
+28.231345346385364
+22
+-111.88492132133867
+32
+213.1769562919496
+13
+28.231345346385364
+23
+-111.88492132133867
+33
+213.1769562919496
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.682770291274153
+20
+-112.42978708390302
+30
+212.09848106677256
+11
+30.837026673222947
+21
+-112.15203027696721
+31
+210.76871655076474
+12
+28.231345346385364
+22
+-111.88492132133867
+32
+213.1769562919496
+13
+28.231345346385364
+23
+-111.88492132133867
+33
+213.1769562919496
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.87441696462183
+20
+-114.20554445748668
+30
+208.9062552451134
+11
+30.837026673222947
+21
+-112.15203027696721
+31
+210.76871655076474
+12
+31.682770291274153
+22
+-112.42978708390302
+32
+212.09848106677256
+13
+31.682770291274153
+23
+-112.42978708390302
+33
+212.09848106677256
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.87441696462183
+20
+-114.20554445748668
+30
+208.9062552451134
+11
+31.682770291274153
+21
+-112.42978708390302
+31
+212.09848106677256
+12
+33.21058484158103
+22
+-115.18301720741489
+32
+211.57278143655887
+13
+33.21058484158103
+23
+-115.18301720741489
+33
+211.57278143655887
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.04447836120119
+20
+-115.95696388522776
+30
+208.10857907010208
+11
+32.87441696462183
+21
+-114.20554445748668
+31
+208.9062552451134
+12
+33.21058484158103
+22
+-115.18301720741489
+32
+211.57278143655887
+13
+33.21058484158103
+23
+-115.18301720741489
+33
+211.57278143655887
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.04447836120119
+20
+-115.95696388522776
+30
+208.10857907010208
+11
+33.21058484158103
+21
+-115.18301720741489
+31
+211.57278143655887
+12
+33.58569343188935
+22
+-116.76133299534632
+32
+211.16816308691523
+13
+33.58569343188935
+23
+-116.76133299534632
+33
+211.16816308691523
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.398320549231755
+20
+-122.14458239153882
+30
+209.89863498686796
+11
+28.24016785175352
+21
+-121.87990723049363
+31
+208.53601424397186
+12
+31.319526449564396
+22
+-120.41141642317946
+32
+207.6510256882489
+13
+31.319526449564396
+23
+-120.41141642317946
+33
+207.6510256882489
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.398320549231755
+20
+-122.14458239153882
+30
+209.89863498686796
+11
+28.366420945815122
+21
+-123.02804982564703
+31
+210.24088735028772
+12
+28.24016785175352
+22
+-121.87990723049363
+32
+208.53601424397186
+13
+28.24016785175352
+23
+-121.87990723049363
+33
+208.53601424397186
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.366420945815122
+20
+-123.02804982564703
+30
+210.24088735028772
+11
+24.448620113706003
+21
+-120.86136419695603
+31
+209.10947709290244
+12
+28.24016785175352
+22
+-121.87990723049363
+32
+208.53601424397186
+13
+28.24016785175352
+23
+-121.87990723049363
+33
+208.53601424397186
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.366420945815122
+20
+-123.02804982564703
+30
+210.24088735028772
+11
+24.63450117508345
+21
+-121.94379433833267
+31
+210.8493359963675
+12
+24.448620113706003
+22
+-120.86136419695603
+32
+209.10947709290244
+13
+24.448620113706003
+23
+-120.86136419695603
+33
+209.10947709290244
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.448620113706003
+20
+-120.86136419695603
+30
+209.10947709290244
+11
+24.63450117508345
+21
+-121.94379433833267
+31
+210.8493359963675
+12
+23.076568416795613
+22
+-119.05761818565175
+32
+209.3050933326174
+13
+23.076568416795613
+23
+-119.05761818565175
+33
+209.3050933326174
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.076568416795613
+20
+-119.05761818565175
+30
+209.3050933326174
+11
+24.63450117508345
+21
+-121.94379433833267
+31
+210.8493359963675
+12
+22.863307166344576
+22
+-119.70957090992698
+32
+211.10610132501398
+13
+22.863307166344576
+23
+-119.70957090992698
+33
+211.10610132501398
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.076568416795613
+20
+-119.05761818565175
+30
+209.3050933326174
+11
+22.863307166344576
+21
+-119.70957090992698
+31
+211.10610132501398
+12
+22.699330256226006
+22
+-117.59612453776823
+32
+211.6384938903349
+13
+22.699330256226006
+23
+-117.59612453776823
+33
+211.6384938903349
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.555113276937526
+20
+-115.54139345995476
+30
+205.8624908930979
+11
+23.17239907855322
+21
+-116.77015550071356
+31
+207.64098628558915
+12
+24.568180272660726
+22
+-112.76473806356864
+32
+206.28992606696988
+13
+24.568180272660726
+23
+-112.76473806356864
+33
+206.28992606696988
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.568180272660726
+20
+-112.76473806356864
+30
+206.28992606696988
+11
+23.17239907855322
+21
+-116.77015550071356
+31
+207.64098628558915
+12
+24.367087995131293
+22
+-113.66737163002882
+32
+208.24456734250157
+13
+24.367087995131293
+23
+-113.66737163002882
+33
+208.24456734250157
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.02632745299145
+20
+-111.47786917710953
+30
+206.6647304329555
+11
+24.568180272660726
+21
+-112.76473806356864
+31
+206.28992606696988
+12
+24.367087995131293
+22
+-113.66737163002882
+32
+208.24456734250157
+13
+24.367087995131293
+23
+-113.66737163002882
+33
+208.24456734250157
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.02632745299145
+20
+-111.47786917710953
+30
+206.6647304329555
+11
+24.367087995131293
+21
+-113.66737163002882
+31
+208.24456734250157
+12
+25.667342751804235
+22
+-112.27159043592133
+32
+208.61785058687204
+13
+25.667342751804235
+23
+-112.27159043592133
+33
+208.61785058687204
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.182061006052884
+20
+-111.49977332836856
+30
+207.18738781993818
+11
+26.02632745299145
+21
+-111.47786917710953
+31
+206.6647304329555
+12
+25.667342751804235
+22
+-112.27159043592133
+32
+208.61785058687204
+13
+25.667342751804235
+23
+-112.27159043592133
+33
+208.61785058687204
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.182061006052884
+20
+-111.49977332836856
+30
+207.18738781993818
+11
+25.667342751804235
+21
+-112.27159043592133
+31
+208.61785058687204
+12
+27.832203034556876
+22
+-111.8897889105063
+32
+209.16940928454375
+13
+27.832203034556876
+23
+-111.8897889105063
+33
+209.16940928454375
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.40046476966056
+20
+-112.1511176039971
+30
+206.83996364302627
+11
+28.182061006052884
+21
+-111.49977332836856
+31
+207.18738781993818
+12
+27.832203034556876
+22
+-111.8897889105063
+32
+209.16940928454375
+13
+27.832203034556876
+23
+-111.8897889105063
+33
+209.16940928454375
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.40046476966056
+20
+-112.1511176039971
+30
+206.83996364302627
+11
+27.832203034556876
+21
+-111.8897889105063
+31
+209.16940928454375
+12
+30.304634107902988
+22
+-112.017563126183
+32
+208.89986653433024
+13
+30.304634107902988
+23
+-112.017563126183
+33
+208.89986653433024
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.368506565573856
+20
+-113.83804147525346
+30
+205.2385268065433
+11
+30.40046476966056
+21
+-112.1511176039971
+31
+206.83996364302627
+12
+30.304634107902988
+22
+-112.017563126183
+32
+208.89986653433024
+13
+30.304634107902988
+23
+-112.017563126183
+33
+208.89986653433024
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.06943940585799
+20
+-114.13800665777123
+30
+206.54456182535404
+11
+31.368506565573856
+21
+-113.83804147525346
+31
+205.2385268065433
+12
+30.304634107902988
+22
+-112.017563126183
+32
+208.89986653433024
+13
+30.304634107902988
+23
+-112.017563126183
+33
+208.89986653433024
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.322264468471754
+20
+-115.74187728883761
+30
+204.58687830659125
+11
+31.368506565573856
+21
+-113.83804147525346
+31
+205.2385268065433
+12
+32.06943940585799
+22
+-114.13800665777123
+32
+206.54456182535404
+13
+32.06943940585799
+23
+-114.13800665777123
+33
+206.54456182535404
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.322264468471754
+20
+-115.74187728883761
+30
+204.58687830659125
+11
+32.06943940585799
+21
+-114.13800665777123
+31
+206.54456182535404
+12
+32.291523161677226
+22
+-115.60102142727042
+32
+206.00608477357278
+13
+32.291523161677226
+23
+-115.60102142727042
+33
+206.00608477357278
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.076568416795613
+20
+-119.05761818565175
+30
+209.3050933326174
+11
+22.699330256226006
+21
+-117.59612453776823
+31
+211.6384938903349
+12
+22.783904618031134
+22
+-117.58000064864655
+32
+209.73861299294998
+13
+22.783904618031134
+23
+-117.58000064864655
+33
+209.73861299294998
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.699330256226006
+20
+-117.59612453776823
+30
+211.6384938903349
+11
+22.887340887864745
+21
+-117.30589453358861
+31
+213.8140020243936
+12
+24.479346770333052
+22
+-114.38929594860377
+32
+212.48910509755524
+13
+24.479346770333052
+23
+-114.38929594860377
+33
+212.48910509755524
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.479346770333052
+20
+-114.38929594860377
+30
+212.48910509755524
+11
+22.887340887864745
+21
+-117.30589453358861
+31
+213.8140020243936
+12
+23.86663898373049
+22
+-115.63387765416091
+32
+214.42701403531953
+13
+23.86663898373049
+23
+-115.63387765416091
+33
+214.42701403531953
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.479346770333052
+20
+-114.38929594860377
+30
+212.48910509755524
+11
+23.86663898373049
+21
+-115.63387765416091
+31
+214.42701403531953
+12
+25.57364166030791
+22
+-112.63148781007868
+32
+212.71392687228249
+13
+25.57364166030791
+23
+-112.63148781007868
+33
+212.71392687228249
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.57364166030791
+20
+-112.63148781007868
+30
+212.71392687228249
+11
+23.86663898373049
+21
+-115.63387765416091
+31
+214.42701403531953
+12
+25.225609034750182
+22
+-113.6348196274653
+32
+215.1434623160798
+13
+25.225609034750182
+23
+-113.6348196274653
+33
+215.1434623160798
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.231345346385364
+20
+-111.88492132133867
+30
+213.1769562919496
+11
+25.57364166030791
+21
+-112.63148781007868
+31
+212.71392687228249
+12
+25.225609034750182
+22
+-113.6348196274653
+32
+215.1434623160798
+13
+25.225609034750182
+23
+-113.6348196274653
+33
+215.1434623160798
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.36794206743032
+20
+-111.94972110214653
+30
+214.46230405679347
+11
+28.231345346385364
+21
+-111.88492132133867
+31
+213.1769562919496
+12
+25.225609034750182
+22
+-113.6348196274653
+32
+215.1434623160798
+13
+25.225609034750182
+23
+-113.6348196274653
+33
+215.1434623160798
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.682770291274153
+20
+-112.42978708390302
+30
+212.09848106677256
+11
+28.231345346385364
+21
+-111.88492132133867
+31
+213.1769562919496
+12
+28.36794206743032
+22
+-111.94972110214653
+32
+214.46230405679347
+13
+28.36794206743032
+23
+-111.94972110214653
+33
+214.46230405679347
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.718972985715915
+20
+-112.86969545501927
+30
+213.47996371769722
+11
+31.682770291274153
+21
+-112.42978708390302
+31
+212.09848106677256
+12
+28.36794206743032
+22
+-111.94972110214653
+32
+214.46230405679347
+13
+28.36794206743032
+23
+-111.94972110214653
+33
+214.46230405679347
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.21058484158103
+20
+-115.18301720741489
+30
+211.57278143655887
+11
+31.682770291274153
+21
+-112.42978708390302
+31
+212.09848106677256
+12
+31.718972985715915
+22
+-112.86969545501927
+32
+213.47996371769722
+13
+31.718972985715915
+23
+-112.86969545501927
+33
+213.47996371769722
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.21058484158103
+20
+-115.18301720741489
+30
+211.57278143655887
+11
+31.718972985715915
+21
+-112.86969545501927
+31
+213.47996371769722
+12
+31.997642465620554
+22
+-116.83891019772236
+32
+214.41332394078282
+13
+31.997642465620554
+23
+-116.83891019772236
+33
+214.41332394078282
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.58569343188935
+20
+-116.76133299534632
+30
+211.16816308691523
+11
+33.21058484158103
+21
+-115.18301720741489
+31
+211.57278143655887
+12
+31.997642465620554
+22
+-116.83891019772236
+32
+214.41332394078282
+13
+31.997642465620554
+23
+-116.83891019772236
+33
+214.41332394078282
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+33.58569343188935
+20
+-116.76133299534632
+30
+211.16816308691523
+11
+31.997642465620554
+21
+-116.83891019772236
+31
+214.41332394078282
+12
+32.895408442911595
+22
+-118.49480318802875
+32
+213.17087180548677
+13
+32.895408442911595
+23
+-118.49480318802875
+33
+213.17087180548677
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.398320549231755
+20
+-122.14458239153882
+30
+209.89863498686796
+11
+30.94593898087128
+21
+-123.45518077519561
+31
+211.81038063285098
+12
+28.366420945815122
+22
+-123.02804982564703
+32
+210.24088735028772
+13
+28.366420945815122
+23
+-123.02804982564703
+33
+210.24088735028772
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.94593898087128
+20
+-123.45518077519561
+30
+211.81038063285098
+11
+28.345125243202315
+21
+-123.93646365424502
+31
+212.39114486553422
+12
+28.366420945815122
+22
+-123.02804982564703
+32
+210.24088735028772
+13
+28.366420945815122
+23
+-123.02804982564703
+33
+210.24088735028772
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.366420945815122
+20
+-123.02804982564703
+30
+210.24088735028772
+11
+28.345125243202315
+21
+-123.93646365424502
+31
+212.39114486553422
+12
+24.63450117508345
+22
+-121.94379433833267
+32
+210.8493359963675
+13
+24.63450117508345
+23
+-121.94379433833267
+33
+210.8493359963675
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.345125243202315
+20
+-123.93646365424502
+30
+212.39114486553422
+11
+24.971885949334812
+21
+-122.26475099914052
+31
+213.49304536358545
+12
+24.63450117508345
+22
+-121.94379433833267
+32
+210.8493359963675
+13
+24.63450117508345
+23
+-121.94379433833267
+33
+210.8493359963675
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.63450117508345
+20
+-121.94379433833267
+30
+210.8493359963675
+11
+24.971885949334812
+21
+-122.26475099914052
+31
+213.49304536358545
+12
+22.863307166344576
+22
+-119.70957090992698
+32
+211.10610132501398
+13
+22.863307166344576
+23
+-119.70957090992698
+33
+211.10610132501398
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.863307166344576
+20
+-119.70957090992698
+30
+211.10610132501398
+11
+24.971885949334812
+21
+-122.26475099914052
+31
+213.49304536358545
+12
+22.671950067152427
+22
+-119.89088860645936
+32
+213.2913446374106
+13
+22.671950067152427
+23
+-119.89088860645936
+33
+213.2913446374106
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.863307166344576
+20
+-119.70957090992698
+30
+211.10610132501398
+11
+22.671950067152427
+21
+-119.89088860645936
+31
+213.2913446374106
+12
+22.887340887864745
+22
+-117.30589453358861
+32
+213.8140020243936
+13
+22.887340887864745
+23
+-117.30589453358861
+33
+213.8140020243936
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.863307166344576
+20
+-119.70957090992698
+30
+211.10610132501398
+11
+22.887340887864745
+21
+-117.30589453358861
+31
+213.8140020243936
+12
+22.699330256226006
+22
+-117.59612453776823
+32
+211.6384938903349
+13
+22.699330256226006
+23
+-117.59612453776823
+33
+211.6384938903349
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.86663898373049
+20
+-115.63387765416091
+30
+214.42701403531953
+11
+23.799101184015615
+21
+-117.44309970327983
+31
+214.64210063170884
+12
+24.65579687769624
+22
+-116.0497523037569
+32
+215.5258722901404
+13
+24.65579687769624
+23
+-116.0497523037569
+33
+215.5258722901404
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.86663898373049
+20
+-115.63387765416091
+30
+214.42701403531953
+11
+24.65579687769624
+21
+-116.0497523037569
+31
+215.5258722901404
+12
+25.225609034750182
+22
+-113.6348196274653
+32
+215.1434623160798
+13
+25.225609034750182
+23
+-113.6348196274653
+33
+215.1434623160798
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.225609034750182
+20
+-113.6348196274653
+30
+215.1434623160798
+11
+24.65579687769624
+21
+-116.0497523037569
+31
+215.5258722901404
+12
+25.74796219740984
+22
+-114.36404532979228
+32
+215.6457366734185
+13
+25.74796219740984
+23
+-114.36404532979228
+33
+215.6457366734185
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.36794206743032
+20
+-111.94972110214653
+30
+214.46230405679347
+11
+25.225609034750182
+21
+-113.6348196274653
+31
+215.1434623160798
+12
+25.74796219740984
+22
+-114.36404532979228
+32
+215.6457366734185
+13
+25.74796219740984
+23
+-114.36404532979228
+33
+215.6457366734185
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.36794206743032
+20
+-111.94972110214653
+30
+214.46230405679347
+11
+25.74796219740984
+21
+-114.36404532979228
+31
+215.6457366734185
+12
+28.401710967287762
+22
+-112.95639938708611
+32
+215.28279705603214
+13
+28.401710967287762
+23
+-112.95639938708611
+33
+215.28279705603214
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.36794206743032
+20
+-111.94972110214653
+30
+214.46230405679347
+11
+28.401710967287762
+21
+-112.95639938708611
+31
+215.28279705603214
+12
+31.718972985715915
+22
+-112.86969545501927
+32
+213.47996371769722
+13
+31.718972985715915
+23
+-112.86969545501927
+33
+213.47996371769722
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.718972985715915
+20
+-112.86969545501927
+30
+213.47996371769722
+11
+28.401710967287762
+21
+-112.95639938708611
+31
+215.28279705603214
+12
+31.20970146894695
+22
+-113.72730382166931
+32
+214.45621957033222
+13
+31.20970146894695
+23
+-113.72730382166931
+33
+214.45621957033222
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.718972985715915
+20
+-112.86969545501927
+30
+213.47996371769722
+11
+31.20970146894695
+21
+-113.72730382166931
+31
+214.45621957033222
+12
+31.997642465620554
+22
+-116.83891019772236
+32
+214.41332394078282
+13
+31.997642465620554
+23
+-116.83891019772236
+33
+214.41332394078282
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.20970146894695
+20
+-113.72730382166931
+30
+214.45621957033222
+11
+31.418399354552395
+21
+-117.04821653197409
+31
+214.97978963028322
+12
+31.997642465620554
+22
+-116.83891019772236
+32
+214.41332394078282
+13
+31.997642465620554
+23
+-116.83891019772236
+33
+214.41332394078282
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.895408442911595
+20
+-118.49480318802875
+30
+213.17087180548677
+11
+31.997642465620554
+21
+-116.83891019772236
+31
+214.41332394078282
+12
+31.418399354552395
+22
+-117.04821653197409
+32
+214.97978963028322
+13
+31.418399354552395
+23
+-117.04821653197409
+33
+214.97978963028322
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.895408442911595
+20
+-118.49480318802875
+30
+213.17087180548677
+11
+31.418399354552395
+21
+-117.04821653197409
+31
+214.97978963028322
+12
+32.171963002722514
+22
+-118.43639211800526
+32
+213.9518156427307
+13
+32.171963002722514
+23
+-118.43639211800526
+33
+213.9518156427307
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.94593898087128
+20
+-123.45518077519561
+30
+211.81038063285098
+11
+30.62346119844889
+21
+-122.61247940037529
+31
+213.6929207438226
+12
+28.345125243202315
+22
+-123.93646365424502
+32
+212.39114486553422
+13
+28.345125243202315
+23
+-123.93646365424502
+33
+212.39114486553422
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.62346119844889
+20
+-122.61247940037529
+30
+213.6929207438226
+11
+28.352730851278327
+21
+-122.9958020474055
+31
+213.23658425926246
+12
+28.345125243202315
+22
+-123.93646365424502
+32
+212.39114486553422
+13
+28.345125243202315
+23
+-123.93646365424502
+33
+212.39114486553422
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.971885949334812
+20
+-122.26475099914052
+30
+213.49304536358545
+11
+28.345125243202315
+21
+-123.93646365424502
+31
+212.39114486553422
+12
+28.352730851278327
+22
+-122.9958020474055
+32
+213.23658425926246
+13
+28.352730851278327
+23
+-122.9958020474055
+33
+213.23658425926246
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.352730851278327
+20
+-122.9958020474055
+30
+213.23658425926246
+11
+25.53348404966665
+21
+-121.59637016142183
+31
+214.24295831987882
+12
+24.971885949334812
+22
+-122.26475099914052
+32
+213.49304536358545
+13
+24.971885949334812
+23
+-122.26475099914052
+33
+213.49304536358545
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.671950067152427
+20
+-119.89088860645936
+30
+213.2913446374106
+11
+24.971885949334812
+21
+-122.26475099914052
+31
+213.49304536358545
+12
+25.53348404966665
+22
+-121.59637016142183
+32
+214.24295831987882
+13
+25.53348404966665
+23
+-121.59637016142183
+33
+214.24295831987882
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.53348404966665
+20
+-121.59637016142183
+30
+214.24295831987882
+11
+23.653377733279452
+21
+-119.61708671572386
+31
+214.56513187797907
+12
+22.671950067152427
+22
+-119.89088860645936
+32
+213.2913446374106
+13
+22.671950067152427
+23
+-119.89088860645936
+33
+213.2913446374106
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.671950067152427
+20
+-119.89088860645936
+30
+213.2913446374106
+11
+23.653377733279452
+21
+-119.61708671572386
+31
+214.56513187797907
+12
+23.799101184015615
+22
+-117.44309970327983
+32
+214.64210063170884
+13
+23.799101184015615
+23
+-117.44309970327983
+33
+214.64210063170884
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.887340887864745
+20
+-117.30589453358861
+30
+213.8140020243936
+11
+22.671950067152427
+21
+-119.89088860645936
+31
+213.2913446374106
+12
+23.799101184015615
+22
+-117.44309970327983
+32
+214.64210063170884
+13
+23.799101184015615
+23
+-117.44309970327983
+33
+214.64210063170884
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.12450400832823
+20
+-120.21610440778906
+30
+213.11215651113997
+11
+32.895408442911595
+21
+-118.49480318802875
+31
+213.17087180548677
+12
+32.171963002722514
+22
+-118.43639211800526
+32
+213.9518156427307
+13
+32.171963002722514
+23
+-118.43639211800526
+33
+213.9518156427307
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.12450400832823
+20
+-120.21610440778906
+30
+213.11215651113997
+11
+32.171963002722514
+21
+-118.43639211800526
+31
+213.9518156427307
+12
+31.536134167568875
+22
+-119.88145765244532
+32
+214.00870559113858
+13
+31.536134167568875
+23
+-119.88145765244532
+33
+214.00870559113858
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.94593898087128
+20
+-123.45518077519561
+30
+211.81038063285098
+11
+32.12450400832823
+21
+-120.21610440778906
+31
+213.11215651113997
+12
+31.536134167568875
+22
+-119.88145765244532
+32
+214.00870559113858
+13
+31.536134167568875
+23
+-119.88145765244532
+33
+214.00870559113858
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.94593898087128
+20
+-123.45518077519561
+30
+211.81038063285098
+11
+31.536134167568875
+21
+-119.88145765244532
+31
+214.00870559113858
+12
+30.62346119844889
+22
+-122.61247940037529
+32
+213.6929207438226
+13
+30.62346119844889
+23
+-122.61247940037529
+33
+213.6929207438226
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.65579687769624
+20
+-116.0497523037569
+30
+215.5258722901404
+11
+23.799101184015615
+21
+-117.44309970327983
+31
+214.64210063170884
+12
+25.584289511614323
+22
+-117.70290727515612
+32
+215.00716981935668
+13
+25.584289511614323
+23
+-117.70290727515612
+33
+215.00716981935668
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.65579687769624
+20
+-116.0497523037569
+30
+215.5258722901404
+11
+25.584289511614323
+21
+-117.70290727515612
+31
+215.00716981935668
+12
+26.06648506363272
+22
+-116.87024530299566
+32
+215.2605886804492
+13
+26.06648506363272
+23
+-116.87024530299566
+33
+215.2605886804492
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.74796219740984
+20
+-114.36404532979228
+30
+215.6457366734185
+11
+24.65579687769624
+21
+-116.0497523037569
+31
+215.5258722901404
+12
+26.06648506363272
+22
+-116.87024530299566
+32
+215.2605886804492
+13
+26.06648506363272
+23
+-116.87024530299566
+33
+215.2605886804492
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.74796219740984
+20
+-114.36404532979228
+30
+215.6457366734185
+11
+26.06648506363272
+21
+-116.87024530299566
+31
+215.2605886804492
+12
+26.588534001969364
+22
+-115.26850424219012
+32
+215.43947258239706
+13
+26.588534001969364
+23
+-115.26850424219012
+33
+215.43947258239706
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.401710967287762
+20
+-112.95639938708611
+30
+215.28279705603214
+11
+25.74796219740984
+21
+-114.36404532979228
+31
+215.6457366734185
+12
+26.588534001969364
+22
+-115.26850424219012
+32
+215.43947258239706
+13
+26.588534001969364
+23
+-115.26850424219012
+33
+215.43947258239706
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.401710967287762
+20
+-112.95639938708611
+30
+215.28279705603214
+11
+26.588534001969364
+21
+-115.26850424219012
+31
+215.43947258239706
+12
+28.432437623914794
+22
+-114.16873331440058
+32
+215.6058832871004
+13
+28.432437623914794
+23
+-114.16873331440058
+33
+215.6058832871004
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.401710967287762
+20
+-112.95639938708611
+30
+215.28279705603214
+11
+28.432437623914794
+21
+-114.16873331440058
+31
+215.6058832871004
+12
+31.20970146894695
+22
+-113.72730382166931
+32
+214.45621957033222
+13
+31.20970146894695
+23
+-113.72730382166931
+33
+214.45621957033222
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.20970146894695
+20
+-113.72730382166931
+30
+214.45621957033222
+11
+28.432437623914794
+21
+-114.16873331440058
+31
+215.6058832871004
+12
+29.996454868663438
+22
+-115.5964580624273
+32
+215.65151693555595
+13
+29.996454868663438
+23
+-115.5964580624273
+33
+215.65151693555595
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.20970146894695
+20
+-113.72730382166931
+30
+214.45621957033222
+11
+29.996454868663438
+21
+-115.5964580624273
+31
+215.65151693555595
+12
+31.418399354552395
+22
+-117.04821653197409
+32
+214.97978963028322
+13
+31.418399354552395
+23
+-117.04821653197409
+33
+214.97978963028322
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.996454868663438
+20
+-115.5964580624273
+30
+215.65151693555595
+11
+30.105062951988717
+21
+-117.4683503220923
+31
+215.19487622667253
+12
+31.418399354552395
+22
+-117.04821653197409
+32
+214.97978963028322
+13
+31.418399354552395
+23
+-117.04821653197409
+33
+214.97978963028322
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+31.418399354552395
+20
+-117.04821653197409
+30
+214.97978963028322
+11
+30.105062951988717
+21
+-117.4683503220923
+31
+215.19487622667253
+12
+32.171963002722514
+22
+-118.43639211800526
+32
+213.9518156427307
+13
+32.171963002722514
+23
+-118.43639211800526
+33
+213.9518156427307
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.105062951988717
+20
+-117.4683503220923
+30
+215.19487622667253
+11
+30.544362874458475
+21
+-118.29036444294621
+31
+214.500636321495
+12
+32.171963002722514
+22
+-118.43639211800526
+32
+213.9518156427307
+13
+32.171963002722514
+23
+-118.43639211800526
+33
+213.9518156427307
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.599746351419277
+20
+-120.76340396493828
+30
+214.0832405502835
+11
+28.352730851278327
+21
+-122.9958020474055
+31
+213.23658425926246
+12
+30.62346119844889
+22
+-122.61247940037529
+32
+213.6929207438226
+13
+30.62346119844889
+23
+-122.61247940037529
+33
+213.6929207438226
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.599746351419277
+20
+-120.76340396493828
+30
+214.0832405502835
+11
+27.923470331468888
+21
+-121.67060089624346
+31
+213.6567180493812
+12
+28.352730851278327
+22
+-122.9958020474055
+32
+213.23658425926246
+13
+28.352730851278327
+23
+-122.9958020474055
+33
+213.23658425926246
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.53348404966665
+20
+-121.59637016142183
+30
+214.24295831987882
+11
+28.352730851278327
+21
+-122.9958020474055
+31
+213.23658425926246
+12
+27.923470331468888
+22
+-121.67060089624346
+32
+213.6567180493812
+13
+27.923470331468888
+23
+-121.67060089624346
+33
+213.6567180493812
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.50943567797897
+20
+-120.87505429149412
+30
+214.69351454230159
+11
+25.53348404966665
+21
+-121.59637016142183
+31
+214.24295831987882
+12
+27.923470331468888
+22
+-121.67060089624346
+32
+213.6567180493812
+13
+27.923470331468888
+23
+-121.67060089624346
+33
+213.6567180493812
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.653377733279452
+20
+-119.61708671572386
+30
+214.56513187797907
+11
+25.53348404966665
+21
+-121.59637016142183
+31
+214.24295831987882
+12
+26.50943567797897
+22
+-120.87505429149412
+32
+214.69351454230159
+13
+26.50943567797897
+23
+-120.87505429149412
+33
+214.69351454230159
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.16809598752809
+20
+-111.44957631506621
+30
+204.37148748587987
+11
+26.950256722063934
+21
+-112.02060536941211
+31
+203.7627346154768
+12
+25.754655132516742
+22
+-112.92628117910209
+32
+203.37728239818492
+13
+25.754655132516742
+23
+-112.92628117910209
+33
+203.37728239818492
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+26.16809598752809
+20
+-111.44957631506621
+30
+204.37148748587987
+11
+25.754655132516742
+21
+-112.92628117910209
+31
+203.37728239818492
+12
+24.941159292707752
+22
+-112.5326149050885
+32
+204.05600686288727
+13
+24.941159292707752
+23
+-112.5326149050885
+33
+204.05600686288727
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.980360279877363
+20
+-111.46782977444866
+30
+204.78705791115263
+11
+26.950256722063934
+21
+-112.02060536941211
+31
+203.7627346154768
+12
+26.16809598752809
+22
+-111.44957631506621
+32
+204.37148748587987
+13
+26.16809598752809
+23
+-111.44957631506621
+33
+204.37148748587987
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.844038482820398
+20
+-112.0148251072746
+30
+204.49530678535697
+11
+29.14036762362889
+21
+-112.37989429492241
+31
+203.6282674646927
+12
+26.950256722063934
+22
+-112.02060536941211
+32
+203.7627346154768
+13
+26.950256722063934
+23
+-112.02060536941211
+33
+203.7627346154768
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.844038482820398
+20
+-112.0148251072746
+30
+204.49530678535697
+11
+26.950256722063934
+21
+-112.02060536941211
+31
+203.7627346154768
+12
+27.980360279877363
+22
+-111.46782977444866
+32
+204.78705791115263
+13
+27.980360279877363
+23
+-111.46782977444866
+33
+204.78705791115263
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.67031174419705
+20
+-113.43950761207051
+30
+203.18805486925348
+11
+29.72326142657352
+21
+-113.3938739636144
+31
+202.76883375210437
+12
+29.14036762362889
+22
+-112.37989429492241
+32
+203.6282674646927
+13
+29.14036762362889
+23
+-112.37989429492241
+33
+203.6282674646927
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.67031174419705
+20
+-113.43950761207051
+30
+203.18805486925348
+11
+29.14036762362889
+21
+-112.37989429492241
+31
+203.6282674646927
+12
+29.844038482820398
+22
+-112.0148251072746
+32
+204.49530678535697
+13
+29.844038482820398
+23
+-112.0148251072746
+33
+204.49530678535697
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.72326142657352
+20
+-113.3938739636144
+30
+202.76883375210437
+11
+30.63106680652487
+21
+-115.04398669178336
+31
+202.63892996616622
+12
+29.9298297419177
+22
+-114.8584098547288
+32
+202.2461763651216
+13
+29.9298297419177
+23
+-114.8584098547288
+33
+202.2461763651216
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.72326142657352
+20
+-113.3938739636144
+30
+202.76883375210437
+11
+30.67031174419705
+21
+-113.43950761207051
+31
+203.18805486925348
+12
+30.63106680652487
+22
+-115.04398669178336
+32
+202.63892996616622
+13
+30.63106680652487
+23
+-115.04398669178336
+33
+202.63892996616622
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.818194065529514
+20
+-117.04973765358594
+30
+202.3839899834582
+11
+27.69651898648105
+21
+-118.09383553025935
+31
+202.86010104901553
+12
+27.620462905721055
+22
+-117.4263673655096
+32
+202.47191081281665
+13
+27.620462905721055
+23
+-117.4263673655096
+33
+202.47191081281665
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.818194065529514
+20
+-117.04973765358594
+30
+202.3839899834582
+11
+29.665763029518956
+21
+-117.46165738698224
+31
+202.6361919472583
+12
+27.69651898648105
+22
+-118.09383553025935
+32
+202.86010104901553
+13
+27.69651898648105
+23
+-118.09383553025935
+33
+202.86010104901553
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.87725753470186
+20
+-117.13431201539139
+30
+202.71224802801834
+11
+27.620462905721055
+21
+-117.4263673655096
+31
+202.47191081281665
+12
+25.273980702113516
+22
+-117.85867012854952
+32
+203.0745791967584
+13
+25.273980702113516
+23
+-117.85867012854952
+33
+203.0745791967584
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.620462905721055
+20
+-117.4263673655096
+30
+202.47191081281665
+11
+27.69651898648105
+21
+-118.09383553025935
+31
+202.86010104901553
+12
+25.273980702113516
+22
+-117.85867012854952
+32
+203.0745791967584
+13
+25.273980702113516
+23
+-117.85867012854952
+33
+203.0745791967584
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.18910211598536
+20
+-116.08960569007179
+30
+202.67513266060772
+11
+25.87725753470186
+21
+-117.13431201539139
+31
+202.71224802801834
+12
+24.056779185630486
+22
+-116.62047713377675
+32
+203.20843789889645
+13
+24.056779185630486
+23
+-116.62047713377675
+33
+203.20843789889645
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.056779185630486
+20
+-116.62047713377675
+30
+203.20843789889645
+11
+25.87725753470186
+21
+-117.13431201539139
+31
+202.71224802801834
+12
+25.273980702113516
+22
+-117.85867012854952
+32
+203.0745791967584
+13
+25.273980702113516
+23
+-117.85867012854952
+33
+203.0745791967584
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.09235878125865
+20
+-114.49486178869623
+30
+203.0977002453107
+11
+24.056779185630486
+21
+-116.62047713377675
+31
+203.20843789889645
+12
+24.091156534134015
+22
+-114.86601546280524
+32
+203.68485318877782
+13
+24.091156534134015
+23
+-114.86601546280524
+33
+203.68485318877782
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.09235878125865
+20
+-114.49486178869623
+30
+203.0977002453107
+11
+25.18910211598536
+21
+-116.08960569007179
+31
+202.67513266060772
+12
+24.056779185630486
+22
+-116.62047713377675
+32
+203.20843789889645
+13
+24.056779185630486
+23
+-116.62047713377675
+33
+203.20843789889645
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.9298297419177
+20
+-114.8584098547288
+30
+202.2461763651216
+11
+30.426019612795915
+21
+-116.50456766669835
+31
+202.59938080417032
+12
+29.481707314079763
+22
+-115.73153366185365
+32
+202.2717312082568
+13
+29.481707314079763
+23
+-115.73153366185365
+33
+202.2717312082568
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.9298297419177
+20
+-114.8584098547288
+30
+202.2461763651216
+11
+30.63106680652487
+21
+-115.04398669178336
+31
+202.63892996616622
+12
+30.426019612795915
+22
+-116.50456766669835
+32
+202.59938080417032
+13
+30.426019612795915
+23
+-116.50456766669835
+33
+202.59938080417032
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.481707314079763
+20
+-115.73153366185365
+30
+202.2717312082568
+11
+30.426019612795915
+21
+-116.50456766669835
+31
+202.59938080417032
+12
+29.665763029518956
+22
+-117.46165738698224
+32
+202.6361919472583
+13
+29.665763029518956
+23
+-117.46165738698224
+33
+202.6361919472583
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+29.481707314079763
+20
+-115.73153366185365
+30
+202.2717312082568
+11
+29.665763029518956
+21
+-117.46165738698224
+31
+202.6361919472583
+12
+28.818194065529514
+22
+-117.04973765358594
+32
+202.3839899834582
+13
+28.818194065529514
+23
+-117.04973765358594
+33
+202.3839899834582
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.885094116263275
+20
+-119.24502036864358
+30
+206.0848788732393
+11
+27.852281839877516
+21
+-119.46041118935558
+31
+205.00701209670842
+12
+30.215192156929195
+22
+-118.69619968987911
+32
+204.72986373841925
+13
+30.215192156929195
+23
+-118.69619968987911
+33
+204.72986373841925
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.885094116263275
+20
+-119.24502036864358
+30
+206.0848788732393
+11
+27.96606173669449
+21
+-120.68248029500779
+31
+206.9768645883921
+12
+27.852281839877516
+22
+-119.46041118935558
+32
+205.00701209670842
+13
+27.852281839877516
+23
+-119.46041118935558
+33
+205.00701209670842
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.96606173669449
+20
+-120.68248029500779
+30
+206.9768645883921
+11
+24.942071965676877
+21
+-119.1780910175746
+31
+205.26469009832346
+12
+27.852281839877516
+22
+-119.46041118935558
+32
+205.00701209670842
+13
+27.852281839877516
+23
+-119.46041118935558
+33
+205.00701209670842
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.96606173669449
+20
+-120.68248029500779
+30
+206.9768645883921
+11
+24.62628711836139
+21
+-119.96603201424867
+31
+207.2430608710523
+12
+24.942071965676877
+22
+-119.1780910175746
+32
+205.26469009832346
+13
+24.942071965676877
+23
+-119.1780910175746
+33
+205.26469009832346
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.942071965676877
+20
+-119.1780910175746
+30
+205.26469009832346
+11
+24.62628711836139
+21
+-119.96603201424867
+31
+207.2430608710523
+12
+23.513130320358
+22
+-117.63019766194702
+32
+205.2996758954734
+13
+23.513130320358
+23
+-117.63019766194702
+33
+205.2996758954734
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.513130320358
+20
+-117.63019766194702
+30
+205.2996758954734
+11
+24.62628711836139
+21
+-119.96603201424867
+31
+207.2430608710523
+12
+23.342764699455604
+22
+-118.41357529377554
+32
+207.3039057356607
+13
+23.342764699455604
+23
+-118.41357529377554
+33
+207.3039057356607
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.513130320358
+20
+-117.63019766194702
+30
+205.2996758954734
+11
+23.342764699455604
+21
+-118.41357529377554
+31
+207.3039057356607
+12
+23.17239907855322
+22
+-116.77015550071356
+32
+207.64098628558915
+13
+23.17239907855322
+23
+-116.77015550071356
+33
+207.64098628558915
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.513130320358
+20
+-117.63019766194702
+30
+205.2996758954734
+11
+23.17239907855322
+21
+-116.77015550071356
+31
+207.64098628558915
+12
+23.555113276937526
+22
+-115.54139345995476
+32
+205.8624908930979
+13
+23.555113276937526
+23
+-115.54139345995476
+33
+205.8624908930979
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.17239907855322
+20
+-116.77015550071356
+30
+207.64098628558915
+11
+22.783904618031134
+21
+-117.58000064864655
+31
+209.73861299294998
+12
+24.367087995131293
+22
+-113.66737163002882
+32
+208.24456734250157
+13
+24.367087995131293
+23
+-113.66737163002882
+33
+208.24456734250157
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.367087995131293
+20
+-113.66737163002882
+30
+208.24456734250157
+11
+22.783904618031134
+21
+-117.58000064864655
+31
+209.73861299294998
+12
+24.211933590380884
+22
+-113.89188918043284
+32
+210.38995726857956
+13
+24.211933590380884
+23
+-113.89188918043284
+33
+210.38995726857956
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.367087995131293
+20
+-113.66737163002882
+30
+208.24456734250157
+11
+24.211933590380884
+21
+-113.89188918043284
+31
+210.38995726857956
+12
+25.667342751804235
+22
+-112.27159043592133
+32
+208.61785058687204
+13
+25.667342751804235
+23
+-112.27159043592133
+33
+208.61785058687204
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.861742094226802
+20
+-112.3245254681309
+30
+210.8119164046364
+11
+25.667342751804235
+21
+-112.27159043592133
+31
+208.61785058687204
+12
+24.211933590380884
+22
+-113.89188918043284
+32
+210.38995726857956
+13
+24.211933590380884
+23
+-113.89188918043284
+33
+210.38995726857956
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+27.832203034556876
+20
+-111.8897889105063
+30
+209.16940928454375
+11
+25.667342751804235
+21
+-112.27159043592133
+31
+208.61785058687204
+12
+25.861742094226802
+22
+-112.3245254681309
+32
+210.8119164046364
+13
+25.861742094226802
+23
+-112.3245254681309
+33
+210.8119164046364
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.055807911991288
+20
+-111.96249852371339
+30
+211.24117692444597
+11
+27.832203034556876
+21
+-111.8897889105063
+31
+209.16940928454375
+12
+25.861742094226802
+22
+-112.3245254681309
+32
+210.8119164046364
+13
+25.861742094226802
+23
+-112.3245254681309
+33
+210.8119164046364
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.304634107902988
+20
+-112.017563126183
+30
+208.89986653433024
+11
+27.832203034556876
+21
+-111.8897889105063
+31
+209.16940928454375
+12
+28.055807911991288
+22
+-111.96249852371339
+32
+211.24117692444597
+13
+28.055807911991288
+23
+-111.96249852371339
+33
+211.24117692444597
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.837026673222947
+20
+-112.15203027696721
+30
+210.76871655076474
+11
+30.304634107902988
+21
+-112.017563126183
+31
+208.89986653433024
+12
+28.055807911991288
+22
+-111.96249852371339
+32
+211.24117692444597
+13
+28.055807911991288
+23
+-111.96249852371339
+33
+211.24117692444597
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.06943940585799
+20
+-114.13800665777123
+30
+206.54456182535404
+11
+30.304634107902988
+21
+-112.017563126183
+31
+208.89986653433024
+12
+30.837026673222947
+22
+-112.15203027696721
+32
+210.76871655076474
+13
+30.837026673222947
+23
+-112.15203027696721
+33
+210.76871655076474
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.87441696462183
+20
+-114.20554445748668
+30
+208.9062552451134
+11
+32.06943940585799
+21
+-114.13800665777123
+31
+206.54456182535404
+12
+30.837026673222947
+22
+-112.15203027696721
+32
+210.76871655076474
+13
+30.837026673222947
+23
+-112.15203027696721
+33
+210.76871655076474
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.291523161677226
+20
+-115.60102142727042
+30
+206.00608477357278
+11
+32.06943940585799
+21
+-114.13800665777123
+31
+206.54456182535404
+12
+32.87441696462183
+22
+-114.20554445748668
+32
+208.9062552451134
+13
+32.87441696462183
+23
+-114.20554445748668
+33
+208.9062552451134
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+32.291523161677226
+20
+-115.60102142727042
+30
+206.00608477357278
+11
+32.87441696462183
+21
+-114.20554445748668
+31
+208.9062552451134
+12
+33.04447836120119
+22
+-115.95696388522776
+32
+208.10857907010208
+13
+33.04447836120119
+23
+-115.95696388522776
+33
+208.10857907010208
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+30.885094116263275
+20
+-119.24502036864358
+30
+206.0848788732393
+11
+28.24016785175352
+21
+-121.87990723049363
+31
+208.53601424397186
+12
+27.96606173669449
+22
+-120.68248029500779
+32
+206.9768645883921
+13
+27.96606173669449
+23
+-120.68248029500779
+33
+206.9768645883921
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.24016785175352
+20
+-121.87990723049363
+30
+208.53601424397186
+11
+30.885094116263275
+21
+-119.24502036864358
+31
+206.0848788732393
+12
+31.319526449564396
+22
+-120.41141642317946
+32
+207.6510256882489
+13
+31.319526449564396
+23
+-120.41141642317946
+33
+207.6510256882489
+70
+1
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.24016785175352
+20
+-121.87990723049363
+30
+208.53601424397186
+11
+24.62628711836139
+21
+-119.96603201424867
+31
+207.2430608710523
+12
+27.96606173669449
+22
+-120.68248029500779
+32
+206.9768645883921
+13
+27.96606173669449
+23
+-120.68248029500779
+33
+206.9768645883921
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.24016785175352
+20
+-121.87990723049363
+30
+208.53601424397186
+11
+24.448620113706003
+21
+-120.86136419695603
+31
+209.10947709290244
+12
+24.62628711836139
+22
+-119.96603201424867
+32
+207.2430608710523
+13
+24.62628711836139
+23
+-119.96603201424867
+33
+207.2430608710523
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.62628711836139
+20
+-119.96603201424867
+30
+207.2430608710523
+11
+24.448620113706003
+21
+-120.86136419695603
+31
+209.10947709290244
+12
+23.342764699455604
+22
+-118.41357529377554
+32
+207.3039057356607
+13
+23.342764699455604
+23
+-118.41357529377554
+33
+207.3039057356607
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.342764699455604
+20
+-118.41357529377554
+30
+207.3039057356607
+11
+24.448620113706003
+21
+-120.86136419695603
+31
+209.10947709290244
+12
+23.076568416795613
+22
+-119.05761818565175
+32
+209.3050933326174
+13
+23.076568416795613
+23
+-119.05761818565175
+33
+209.3050933326174
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.342764699455604
+20
+-118.41357529377554
+30
+207.3039057356607
+11
+23.076568416795613
+21
+-119.05761818565175
+31
+209.3050933326174
+12
+22.783904618031134
+22
+-117.58000064864655
+32
+209.73861299294998
+13
+22.783904618031134
+23
+-117.58000064864655
+33
+209.73861299294998
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+23.342764699455604
+20
+-118.41357529377554
+30
+207.3039057356607
+11
+22.783904618031134
+21
+-117.58000064864655
+31
+209.73861299294998
+12
+23.17239907855322
+22
+-116.77015550071356
+32
+207.64098628558915
+13
+23.17239907855322
+23
+-116.77015550071356
+33
+207.64098628558915
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+22.783904618031134
+20
+-117.58000064864655
+30
+209.73861299294998
+11
+22.699330256226006
+21
+-117.59612453776823
+31
+211.6384938903349
+12
+24.211933590380884
+22
+-113.89188918043284
+32
+210.38995726857956
+13
+24.211933590380884
+23
+-113.89188918043284
+33
+210.38995726857956
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.211933590380884
+20
+-113.89188918043284
+30
+210.38995726857956
+11
+22.699330256226006
+21
+-117.59612453776823
+31
+211.6384938903349
+12
+24.479346770333052
+22
+-114.38929594860377
+32
+212.48910509755524
+13
+24.479346770333052
+23
+-114.38929594860377
+33
+212.48910509755524
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+24.211933590380884
+20
+-113.89188918043284
+30
+210.38995726857956
+11
+24.479346770333052
+21
+-114.38929594860377
+31
+212.48910509755524
+12
+25.861742094226802
+22
+-112.3245254681309
+32
+210.8119164046364
+13
+25.861742094226802
+23
+-112.3245254681309
+33
+210.8119164046364
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+25.861742094226802
+20
+-112.3245254681309
+30
+210.8119164046364
+11
+24.479346770333052
+21
+-114.38929594860377
+31
+212.48910509755524
+12
+25.57364166030791
+22
+-112.63148781007868
+32
+212.71392687228249
+13
+25.57364166030791
+23
+-112.63148781007868
+33
+212.71392687228249
+70
+0
+ 0
+3DFACE
+ 8
+teeth_lower_half
+10
+28.055807911991288
+20
+-111.96249852371339
+30
+211.24117692444597
+11
+25.861742094226802
+21
+-112.3245254681309
+31
+210.8119164046364
+12
+25.57364166030791
+22
+-112.63148781007868
+32
+212.71392687228249
+13
+25.57364166030791
+23
+-112.63148781007868
+33
+212.71392687228249
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.40582703533002
+20
+-156.1182252183881
+30
+223.3009333140633
+11
+16.17980301347882
+21
+-156.41484393335205
+31
+223.1278296742534
+12
+16.121087719132113
+22
+-156.66156985933713
+32
+221.83639742294858
+13
+16.121087719132113
+23
+-156.66156985933713
+33
+221.83639742294858
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.40582703533002
+20
+-156.1182252183881
+30
+223.3009333140633
+11
+16.737750421934177
+21
+-155.47813724271265
+31
+225.56527495045015
+12
+15.988750138609708
+22
+-155.59769740166718
+32
+225.43080779966644
+13
+15.988750138609708
+23
+-155.59769740166718
+33
+225.43080779966644
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.17980301347882
+20
+-156.41484393335205
+30
+223.1278296742534
+11
+14.243415197329224
+21
+-154.4605068821436
+31
+225.26591821657877
+12
+14.001861084835467
+22
+-154.8456548751116
+32
+222.66571292755592
+13
+14.001861084835467
+23
+-154.8456548751116
+33
+222.66571292755592
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.17980301347882
+20
+-156.41484393335205
+30
+223.1278296742534
+11
+15.988750138609708
+21
+-155.59769740166718
+31
+225.43080779966644
+12
+14.243415197329224
+22
+-154.4605068821436
+32
+225.26591821657877
+13
+14.243415197329224
+23
+-154.4605068821436
+33
+225.26591821657877
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.356890869823145
+20
+-147.1530386427221
+30
+222.46857556622814
+11
+12.57778702868524
+21
+-148.36871903759
+31
+222.7484619434243
+12
+14.176790070583463
+22
+-147.56952174096457
+32
+225.1871241169135
+13
+14.176790070583463
+23
+-147.56952174096457
+33
+225.1871241169135
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.176790070583463
+20
+-147.56952174096457
+30
+225.1871241169135
+11
+12.57778702868524
+21
+-148.36871903759
+31
+222.7484619434243
+12
+12.969627956760757
+22
+-148.32643185668815
+32
+225.41894305106948
+13
+12.969627956760757
+23
+-148.32643185668815
+33
+225.41894305106948
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.58471093727754
+20
+-149.11771932091455
+30
+222.80352654589464
+11
+16.328872931768426
+21
+-147.1518217454301
+31
+223.0828044744457
+12
+16.318529304785056
+22
+-149.10402922637854
+32
+225.30850962180608
+13
+16.318529304785056
+23
+-149.10402922637854
+33
+225.30850962180608
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.328872931768426
+20
+-147.1518217454301
+30
+223.0828044744457
+11
+15.48373776236333
+21
+-147.8798305504655
+31
+225.4870892994307
+12
+16.318529304785056
+22
+-149.10402922637854
+32
+225.30850962180608
+13
+16.318529304785056
+23
+-149.10402922637854
+33
+225.30850962180608
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.58471093727754
+20
+-149.11771932091455
+30
+222.80352654589464
+11
+17.467280348584104
+21
+-151.49340705953455
+31
+225.43628383748222
+12
+18.653755208440096
+22
+-151.58497858076893
+32
+222.98454001810254
+13
+18.653755208440096
+23
+-151.58497858076893
+33
+222.98454001810254
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.58471093727754
+20
+-149.11771932091455
+30
+222.80352654589464
+11
+16.318529304785056
+21
+-149.10402922637854
+31
+225.30850962180608
+12
+17.467280348584104
+22
+-151.49340705953455
+32
+225.43628383748222
+13
+17.467280348584104
+23
+-151.49340705953455
+33
+225.43628383748222
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.653755208440096
+20
+-151.58497858076893
+30
+222.98454001810254
+11
+18.032529140792427
+21
+-153.65157440718036
+31
+225.69548296071136
+12
+19.10461565518538
+22
+-153.68260528812982
+32
+223.2376546548716
+13
+19.10461565518538
+23
+-153.68260528812982
+33
+223.2376546548716
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.653755208440096
+20
+-151.58497858076893
+30
+222.98454001810254
+11
+17.467280348584104
+21
+-151.49340705953455
+31
+225.43628383748222
+12
+18.032529140792427
+22
+-153.65157440718036
+32
+225.69548296071136
+13
+18.032529140792427
+23
+-153.65157440718036
+33
+225.69548296071136
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.379649093381072
+20
+-155.42246419159528
+30
+222.1838215998606
+11
+16.418010658419142
+21
+-156.51432528698538
+31
+219.76919314789177
+12
+18.15208929974714
+22
+-155.31902792176135
+32
+220.19814944337824
+13
+18.15208929974714
+23
+-155.31902792176135
+33
+220.19814944337824
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.379649093381072
+20
+-155.42246419159528
+30
+222.1838215998606
+11
+17.49587743494986
+21
+-156.27520496907638
+31
+222.11902181905282
+12
+16.418010658419142
+22
+-156.51432528698538
+32
+219.76919314789177
+13
+16.418010658419142
+23
+-156.51432528698538
+33
+219.76919314789177
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.49587743494986
+20
+-156.27520496907638
+30
+222.11902181905282
+11
+16.121087719132113
+21
+-156.66156985933713
+31
+221.83639742294858
+12
+16.418010658419142
+22
+-156.51432528698538
+32
+219.76919314789177
+13
+16.418010658419142
+23
+-156.51432528698538
+33
+219.76919314789177
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.418010658419142
+20
+-156.51432528698538
+30
+219.76919314789177
+11
+16.121087719132113
+21
+-156.66156985933713
+31
+221.83639742294858
+12
+15.203851385166496
+22
+-156.58764334883782
+32
+219.57023044062367
+13
+15.203851385166496
+23
+-156.58764334883782
+33
+219.57023044062367
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.121087719132113
+20
+-156.66156985933713
+30
+221.83639742294858
+11
+13.513885270679317
+21
+-154.9068039640418
+31
+219.599740199959
+12
+15.203851385166496
+22
+-156.58764334883782
+32
+219.57023044062367
+13
+15.203851385166496
+23
+-156.58764334883782
+33
+219.57023044062367
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.121087719132113
+20
+-156.66156985933713
+30
+221.83639742294858
+11
+14.059055257567003
+21
+-155.1136765037096
+31
+221.87381701468288
+12
+13.513885270679317
+22
+-154.9068039640418
+32
+219.599740199959
+13
+13.513885270679317
+23
+-154.9068039640418
+33
+219.599740199959
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.494096039514188
+20
+-147.31458175825605
+30
+221.35237652499433
+11
+12.752716014433213
+21
+-149.25735828518904
+31
+219.5553234487965
+12
+12.683961317426183
+22
+-148.46515814799346
+32
+221.72626821801023
+13
+12.683961317426183
+23
+-148.46515814799346
+33
+221.72626821801023
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.752716014433213
+20
+-149.25735828518904
+30
+219.5553234487965
+11
+14.494096039514188
+21
+-147.31458175825605
+31
+221.35237652499433
+12
+14.871029975760745
+22
+-147.84271518305295
+32
+219.29825389582783
+13
+14.871029975760745
+23
+-147.84271518305295
+33
+219.29825389582783
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.92421063162266
+20
+-150.33917997791912
+30
+218.9344016054717
+11
+17.09825624473659
+21
+-146.67388533393344
+31
+219.58209518922473
+12
+16.52661874174443
+22
+-146.9616815435298
+32
+221.79958627986318
+13
+16.52661874174443
+23
+-146.9616815435298
+33
+221.79958627986318
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.92421063162266
+20
+-150.33917997791912
+30
+218.9344016054717
+11
+16.52661874174443
+21
+-146.9616815435298
+31
+221.79958627986318
+12
+17.81227073091146
+22
+-149.1527051180639
+32
+221.86712407957756
+13
+17.81227073091146
+23
+-149.1527051180639
+33
+221.86712407957756
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.92421063162266
+20
+-150.33917997791912
+30
+218.9344016054717
+11
+17.81227073091146
+21
+-149.1527051180639
+31
+221.86712407957756
+12
+19.10978746867707
+22
+-152.5441978713132
+32
+219.63533444575523
+13
+19.10978746867707
+23
+-152.5441978713132
+33
+219.63533444575523
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.10978746867707
+20
+-152.5441978713132
+30
+219.63533444575523
+11
+17.81227073091146
+21
+-149.1527051180639
+31
+221.86712407957756
+12
+19.089100214710342
+22
+-152.11767537041146
+32
+220.9857862157296
+13
+19.089100214710342
+23
+-152.11767537041146
+33
+220.9857862157296
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.10978746867707
+20
+-152.5441978713132
+30
+219.63533444575523
+11
+19.089100214710342
+21
+-152.11767537041146
+31
+220.9857862157296
+12
+18.925123304591775
+22
+-153.98135357335454
+32
+220.54101025544492
+13
+18.925123304591775
+23
+-153.98135357335454
+33
+220.54101025544492
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.925123304591775
+20
+-153.98135357335454
+30
+220.54101025544492
+11
+19.089100214710342
+21
+-152.11767537041146
+31
+220.9857862157296
+12
+19.17337035219242
+22
+-153.96583813287978
+32
+221.9821208736854
+13
+19.17337035219242
+23
+-153.96583813287978
+33
+221.9821208736854
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.17337035219242
+20
+-153.96583813287978
+30
+221.9821208736854
+11
+19.10461565518538
+21
+-153.68260528812982
+31
+223.2376546548716
+12
+18.379649093381072
+22
+-155.42246419159528
+32
+222.1838215998606
+13
+18.379649093381072
+23
+-155.42246419159528
+33
+222.1838215998606
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.379649093381072
+20
+-155.42246419159528
+30
+222.1838215998606
+11
+19.10461565518538
+21
+-153.68260528812982
+31
+223.2376546548716
+12
+18.368392793428583
+22
+-155.35644751349597
+32
+223.5942055614737
+13
+18.368392793428583
+23
+-155.35644751349597
+33
+223.5942055614737
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.379649093381072
+20
+-155.42246419159528
+30
+222.1838215998606
+11
+18.368392793428583
+21
+-155.35644751349597
+31
+223.5942055614737
+12
+17.49587743494986
+22
+-156.27520496907638
+32
+222.11902181905282
+13
+17.49587743494986
+23
+-156.27520496907638
+33
+222.11902181905282
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.368392793428583
+20
+-155.35644751349597
+30
+223.5942055614737
+11
+17.40582703533002
+21
+-156.1182252183881
+31
+223.3009333140633
+12
+17.49587743494986
+22
+-156.27520496907638
+32
+222.11902181905282
+13
+17.49587743494986
+23
+-156.27520496907638
+33
+222.11902181905282
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.17980301347882
+20
+-156.41484393335205
+30
+223.1278296742534
+11
+14.059055257567003
+21
+-155.1136765037096
+31
+221.87381701468288
+12
+16.121087719132113
+22
+-156.66156985933713
+32
+221.83639742294858
+13
+16.121087719132113
+23
+-156.66156985933713
+33
+221.83639742294858
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.089100214710342
+20
+-152.11767537041146
+30
+220.9857862157296
+11
+17.81227073091146
+21
+-149.1527051180639
+31
+221.86712407957756
+12
+17.58471093727754
+22
+-149.11771932091455
+32
+222.80352654589464
+13
+17.58471093727754
+23
+-149.11771932091455
+33
+222.80352654589464
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.089100214710342
+20
+-152.11767537041146
+30
+220.9857862157296
+11
+18.653755208440096
+21
+-151.58497858076893
+31
+222.98454001810254
+12
+19.17337035219242
+22
+-153.96583813287978
+32
+221.9821208736854
+13
+19.17337035219242
+23
+-153.96583813287978
+33
+221.9821208736854
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.089100214710342
+20
+-152.11767537041146
+30
+220.9857862157296
+11
+17.58471093727754
+21
+-149.11771932091455
+31
+222.80352654589464
+12
+18.653755208440096
+22
+-151.58497858076893
+32
+222.98454001810254
+13
+18.653755208440096
+23
+-151.58497858076893
+33
+222.98454001810254
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.17980301347882
+20
+-156.41484393335205
+30
+223.1278296742534
+11
+14.001861084835467
+21
+-154.8456548751116
+31
+222.66571292755592
+12
+14.059055257567003
+22
+-155.1136765037096
+32
+221.87381701468288
+13
+14.059055257567003
+23
+-155.1136765037096
+33
+221.87381701468288
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.494096039514188
+20
+-147.31458175825605
+30
+221.35237652499433
+11
+12.683961317426183
+21
+-148.46515814799346
+31
+221.72626821801023
+12
+12.57778702868524
+22
+-148.36871903759
+32
+222.7484619434243
+13
+12.57778702868524
+23
+-148.36871903759
+33
+222.7484619434243
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.494096039514188
+20
+-147.31458175825605
+30
+221.35237652499433
+11
+12.57778702868524
+21
+-148.36871903759
+31
+222.7484619434243
+12
+14.356890869823145
+22
+-147.1530386427221
+32
+222.46857556622814
+13
+14.356890869823145
+23
+-147.1530386427221
+33
+222.46857556622814
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.49587743494986
+20
+-156.27520496907638
+30
+222.11902181905282
+11
+17.40582703533002
+21
+-156.1182252183881
+31
+223.3009333140633
+12
+16.121087719132113
+22
+-156.66156985933713
+32
+221.83639742294858
+13
+16.121087719132113
+23
+-156.66156985933713
+33
+221.83639742294858
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.52661874174443
+20
+-146.9616815435298
+30
+221.79958627986318
+11
+16.328872931768426
+21
+-147.1518217454301
+31
+223.0828044744457
+12
+17.81227073091146
+22
+-149.1527051180639
+32
+221.86712407957756
+13
+17.81227073091146
+23
+-149.1527051180639
+33
+221.86712407957756
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.17337035219242
+20
+-153.96583813287978
+30
+221.9821208736854
+11
+18.653755208440096
+21
+-151.58497858076893
+31
+222.98454001810254
+12
+19.10461565518538
+22
+-153.68260528812982
+32
+223.2376546548716
+13
+19.10461565518538
+23
+-153.68260528812982
+33
+223.2376546548716
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.198085773196263
+20
+-149.6628893077992
+30
+211.11857452225124
+11
+13.336218266023952
+21
+-150.4033713100786
+31
+211.19888974353358
+12
+13.408319430584415
+22
+-150.28046468357098
+32
+213.43007092870894
+13
+13.408319430584415
+23
+-150.28046468357098
+33
+213.43007092870894
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.492241393240906
+20
+-148.02464132822936
+30
+213.30016714277116
+11
+16.105268054334026
+21
+-148.51231291806198
+31
+211.4532212775955
+12
+15.590520499750351
+22
+-148.6324815256634
+32
+213.45319197726045
+13
+15.590520499750351
+23
+-148.6324815256634
+33
+213.45319197726045
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.7645221623617
+20
+-148.10465232518845
+30
+211.64001501194213
+11
+16.492241393240906
+21
+-148.02464132822936
+31
+213.30016714277116
+12
+17.181309484926494
+22
+-147.22179333972696
+32
+213.28221790771232
+13
+17.181309484926494
+23
+-147.22179333972696
+33
+213.28221790771232
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.7645221623617
+20
+-148.10465232518845
+30
+211.64001501194213
+11
+16.105268054334026
+21
+-148.51231291806198
+31
+211.4532212775955
+12
+16.492241393240906
+22
+-148.02464132822936
+32
+213.30016714277116
+13
+16.492241393240906
+23
+-148.02464132822936
+33
+213.30016714277116
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.81227073091146
+20
+-149.1527051180639
+30
+221.86712407957756
+11
+16.328872931768426
+21
+-147.1518217454301
+31
+223.0828044744457
+12
+17.58471093727754
+22
+-149.11771932091455
+32
+222.80352654589464
+13
+17.58471093727754
+23
+-149.11771932091455
+33
+222.80352654589464
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+15.590520499750351
+20
+-148.6324815256634
+30
+213.45319197726045
+11
+13.4652093789929
+21
+-150.05625135749105
+31
+215.61257622219765
+12
+15.54123615941787
+22
+-148.5156593856164
+32
+215.34577149089228
+13
+15.54123615941787
+23
+-148.5156593856164
+33
+215.34577149089228
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.176790070583463
+20
+-147.56952174096457
+30
+225.1871241169135
+11
+12.969627956760757
+21
+-148.32643185668815
+31
+225.41894305106948
+12
+15.48373776236333
+22
+-147.8798305504655
+32
+225.4870892994307
+13
+15.48373776236333
+23
+-147.8798305504655
+33
+225.4870892994307
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.998499967114503
+20
+-147.5260176627699
+30
+225.33619403520296
+11
+14.176790070583463
+21
+-147.56952174096457
+31
+225.1871241169135
+12
+15.48373776236333
+22
+-147.8798305504655
+32
+225.4870892994307
+13
+15.48373776236333
+23
+-147.8798305504655
+33
+225.4870892994307
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.303347388968104
+20
+-153.9825704706451
+30
+214.7963423634803
+11
+13.498978278850345
+21
+-154.81827468603623
+31
+215.8307050618161
+12
+13.317052133672432
+22
+-154.03276748394663
+32
+214.5283207348824
+13
+13.317052133672432
+23
+-154.03276748394663
+33
+214.5283207348824
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.539773638472754
+20
+-151.3032668576315
+30
+213.63298855217639
+11
+11.338985585266348
+21
+-151.35681033848718
+31
+215.49119071730462
+12
+11.75820670241548
+22
+-150.82015863264445
+32
+215.48328088490575
+13
+11.75820670241548
+23
+-150.82015863264445
+33
+215.48328088490575
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+15.590520499750351
+20
+-148.6324815256634
+30
+213.45319197726045
+11
+13.408319430584415
+21
+-150.28046468357098
+31
+213.43007092870894
+12
+13.4652093789929
+22
+-150.05625135749105
+32
+215.61257622219765
+13
+13.4652093789929
+23
+-150.05625135749105
+33
+215.61257622219765
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.53029873395595
+20
+-154.87242661553736
+30
+215.97916653145992
+11
+13.498978278850345
+21
+-154.81827468603623
+31
+215.8307050618161
+12
+14.303347388968104
+22
+-153.9825704706451
+32
+214.7963423634803
+13
+14.303347388968104
+23
+-153.9825704706451
+33
+214.7963423634803
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.88293867486188
+20
+-151.14081106912815
+30
+213.62994630894605
+11
+11.539773638472754
+21
+-151.3032668576315
+31
+213.63298855217639
+12
+11.75820670241548
+22
+-150.82015863264445
+32
+215.48328088490575
+13
+11.75820670241548
+23
+-150.82015863264445
+33
+215.48328088490575
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+13.4652093789929
+20
+-150.05625135749105
+30
+215.61257622219765
+11
+11.88293867486188
+21
+-151.14081106912815
+31
+213.62994630894605
+12
+11.75820670241548
+22
+-150.82015863264445
+32
+215.48328088490575
+13
+11.75820670241548
+23
+-150.82015863264445
+33
+215.48328088490575
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+13.4652093789929
+20
+-150.05625135749105
+30
+215.61257622219765
+11
+13.408319430584415
+21
+-150.28046468357098
+31
+213.43007092870894
+12
+11.88293867486188
+22
+-151.14081106912815
+32
+213.62994630894605
+13
+11.88293867486188
+23
+-151.14081106912815
+33
+213.62994630894605
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.299058948110517
+20
+-147.94219653668603
+30
+215.22377753735339
+11
+15.590520499750351
+21
+-148.6324815256634
+31
+213.45319197726045
+12
+15.54123615941787
+22
+-148.5156593856164
+32
+215.34577149089228
+13
+15.54123615941787
+23
+-148.5156593856164
+33
+215.34577149089228
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.492241393240906
+20
+-148.02464132822936
+30
+213.30016714277116
+11
+15.590520499750351
+21
+-148.6324815256634
+31
+213.45319197726045
+12
+16.299058948110517
+22
+-147.94219653668603
+32
+215.22377753735339
+13
+16.299058948110517
+23
+-147.94219653668603
+33
+215.22377753735339
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+13.498978278850345
+20
+-154.81827468603623
+30
+215.8307050618161
+11
+12.6027334231745
+21
+-153.33153041933917
+31
+213.57275213621398
+12
+13.317052133672432
+22
+-154.03276748394663
+32
+214.5283207348824
+13
+13.317052133672432
+23
+-154.03276748394663
+33
+214.5283207348824
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.492241393240906
+20
+-148.02464132822936
+30
+213.30016714277116
+11
+16.299058948110517
+21
+-147.94219653668603
+31
+215.22377753735339
+12
+16.914808977943462
+22
+-147.08884731055875
+32
+215.11912437022792
+13
+16.914808977943462
+23
+-147.08884731055875
+33
+215.11912437022792
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.181309484926494
+20
+-147.22179333972696
+30
+213.28221790771232
+11
+16.492241393240906
+21
+-148.02464132822936
+31
+213.30016714277116
+12
+16.914808977943462
+22
+-147.08884731055875
+32
+215.11912437022792
+13
+16.914808977943462
+23
+-147.08884731055875
+33
+215.11912437022792
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+13.498978278850345
+20
+-154.81827468603623
+30
+215.8307050618161
+11
+12.486519731773233
+21
+-153.79668940926774
+31
+215.1842283753567
+12
+12.6027334231745
+22
+-153.33153041933917
+32
+213.57275213621398
+13
+12.6027334231745
+23
+-153.33153041933917
+33
+213.57275213621398
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.640992437039934
+20
+-146.8126116252385
+30
+215.36524184756695
+11
+17.181309484926494
+21
+-147.22179333972696
+31
+213.28221790771232
+12
+16.914808977943462
+22
+-147.08884731055875
+32
+215.11912437022792
+13
+16.914808977943462
+23
+-147.08884731055875
+33
+215.11912437022792
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.640992437039934
+20
+-146.8126116252385
+30
+215.36524184756695
+11
+17.469409918845383
+21
+-146.99301664880076
+31
+213.51008192566934
+12
+17.181309484926494
+22
+-147.22179333972696
+32
+213.28221790771232
+13
+17.181309484926494
+23
+-147.22179333972696
+33
+213.28221790771232
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.97960875875096
+20
+-152.41946589886555
+30
+214.62354294799394
+11
+17.5792348994628
+21
+-152.83351520252333
+31
+216.08321124994015
+12
+16.723147654428264
+22
+-154.02272808128686
+32
+216.08716616613935
+13
+16.723147654428264
+23
+-154.02272808128686
+33
+216.08716616613935
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.97960875875096
+20
+-152.41946589886555
+30
+214.62354294799394
+11
+16.723147654428264
+21
+-154.02272808128686
+31
+216.08716616613935
+12
+16.372681234286194
+22
+-153.23113639273626
+32
+214.75192561231702
+13
+16.372681234286194
+23
+-153.23113639273626
+33
+214.75192561231702
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.723147654428264
+20
+-154.02272808128686
+30
+216.08716616613935
+11
+14.303347388968104
+21
+-153.9825704706451
+31
+214.7963423634803
+12
+16.372681234286194
+22
+-153.23113639273626
+32
+214.75192561231702
+13
+16.372681234286194
+23
+-153.23113639273626
+33
+214.75192561231702
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.723147654428264
+20
+-154.02272808128686
+30
+216.08716616613935
+11
+14.53029873395595
+21
+-154.87242661553736
+31
+215.97916653145992
+12
+14.303347388968104
+22
+-153.9825704706451
+32
+214.7963423634803
+13
+14.303347388968104
+23
+-153.9825704706451
+33
+214.7963423634803
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.671110645020907
+20
+-148.94248611084083
+30
+212.5669865242448
+11
+18.142962570055943
+21
+-149.67384138342933
+31
+213.9092242374971
+12
+17.63582062354826
+22
+-149.78579593430786
+32
+213.08416787341258
+13
+17.63582062354826
+23
+-149.78579593430786
+33
+213.08416787341258
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.63582062354826
+20
+-149.78579593430786
+30
+213.08416787341258
+11
+18.142962570055943
+21
+-149.67384138342933
+31
+213.9092242374971
+12
+18.03800517860714
+22
+-150.4876414475615
+32
+214.44039990552469
+13
+18.03800517860714
+23
+-150.4876414475615
+33
+214.44039990552469
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.105268054334026
+20
+-148.51231291806198
+30
+211.4532212775955
+11
+14.198085773196263
+21
+-149.6628893077992
+31
+211.11857452225124
+12
+13.408319430584415
+22
+-150.28046468357098
+32
+213.43007092870894
+13
+13.408319430584415
+23
+-150.28046468357098
+33
+213.43007092870894
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.676297108680103
+20
+-151.63791361297547
+30
+213.40482030989634
+11
+16.97960875875096
+21
+-152.41946589886555
+31
+214.62354294799394
+12
+16.372681234286194
+22
+-153.23113639273626
+32
+214.75192561231702
+13
+16.372681234286194
+23
+-153.23113639273626
+33
+214.75192561231702
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.63582062354826
+20
+-149.78579593430786
+30
+213.08416787341258
+11
+18.03800517860714
+21
+-150.4876414475615
+31
+214.44039990552469
+12
+16.676297108680103
+22
+-151.63791361297547
+32
+213.40482030989634
+13
+16.676297108680103
+23
+-151.63791361297547
+33
+213.40482030989634
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.676297108680103
+20
+-151.63791361297547
+30
+213.40482030989634
+11
+18.03800517860714
+21
+-150.4876414475615
+31
+214.44039990552469
+12
+16.97960875875096
+22
+-152.41946589886555
+32
+214.62354294799394
+13
+16.97960875875096
+23
+-152.41946589886555
+33
+214.62354294799394
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.105268054334026
+20
+-148.51231291806198
+30
+211.4532212775955
+11
+13.408319430584415
+21
+-150.28046468357098
+31
+213.43007092870894
+12
+15.590520499750351
+22
+-148.6324815256634
+32
+213.45319197726045
+13
+15.590520499750351
+23
+-148.6324815256634
+33
+213.45319197726045
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.109222970533537
+20
+-152.27617624271338
+30
+213.3518852776872
+11
+16.676297108680103
+21
+-151.63791361297547
+31
+213.40482030989634
+12
+16.372681234286194
+22
+-153.23113639273626
+32
+214.75192561231702
+13
+16.372681234286194
+23
+-153.23113639273626
+33
+214.75192561231702
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.181309484926494
+20
+-147.22179333972696
+30
+213.28221790771232
+11
+17.0641831205561
+21
+-147.719200107897
+31
+212.02029541574225
+12
+16.7645221623617
+22
+-148.10465232518845
+32
+211.64001501194213
+13
+16.7645221623617
+23
+-148.10465232518845
+33
+211.64001501194213
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.372681234286194
+20
+-153.23113639273626
+30
+214.75192561231702
+11
+14.38609640483499
+21
+-152.71790995976738
+31
+213.26122642942113
+12
+16.109222970533537
+22
+-152.27617624271338
+32
+213.3518852776872
+13
+16.109222970533537
+23
+-152.27617624271338
+33
+213.3518852776872
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.469409918845383
+20
+-146.99301664880076
+30
+213.51008192566934
+11
+17.0641831205561
+21
+-147.719200107897
+31
+212.02029541574225
+12
+17.181309484926494
+22
+-147.22179333972696
+32
+213.28221790771232
+13
+17.181309484926494
+23
+-147.22179333972696
+33
+213.28221790771232
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.372681234286194
+20
+-153.23113639273626
+30
+214.75192561231702
+11
+14.303347388968104
+21
+-153.9825704706451
+31
+214.7963423634803
+12
+14.38609640483499
+22
+-152.71790995976738
+32
+213.26122642942113
+13
+14.38609640483499
+23
+-152.71790995976738
+33
+213.26122642942113
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.469409918845383
+20
+-146.99301664880076
+30
+213.51008192566934
+11
+17.419517129866815
+21
+-147.4496573576835
+31
+212.32604086039754
+12
+17.0641831205561
+22
+-147.719200107897
+32
+212.02029541574225
+13
+17.0641831205561
+23
+-147.719200107897
+33
+212.02029541574225
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.38609640483499
+20
+-152.71790995976738
+30
+213.26122642942113
+11
+14.303347388968104
+21
+-153.9825704706451
+31
+214.7963423634803
+12
+13.317052133672432
+22
+-154.03276748394663
+32
+214.5283207348824
+13
+13.317052133672432
+23
+-154.03276748394663
+33
+214.5283207348824
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.6027334231745
+20
+-153.33153041933917
+30
+213.57275213621398
+11
+12.486519731773233
+21
+-153.79668940926774
+31
+215.1842283753567
+12
+11.805969921132736
+22
+-152.73251272727381
+32
+215.2021776104163
+13
+11.805969921132736
+23
+-152.73251272727381
+33
+215.2021776104163
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.6027334231745
+20
+-153.33153041933917
+30
+213.57275213621398
+11
+11.805969921132736
+21
+-152.73251272727381
+31
+215.2021776104163
+12
+11.826352950776432
+22
+-152.6010878197201
+32
+213.51890443103602
+13
+11.826352950776432
+23
+-152.6010878197201
+33
+213.51890443103602
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.826352950776432
+20
+-152.6010878197201
+30
+213.51890443103602
+11
+11.805969921132736
+21
+-152.73251272727381
+31
+215.2021776104163
+12
+11.338985585266348
+22
+-151.35681033848718
+32
+215.49119071730462
+13
+11.338985585266348
+23
+-151.35681033848718
+33
+215.49119071730462
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.826352950776432
+20
+-152.6010878197201
+30
+213.51890443103602
+11
+11.338985585266348
+21
+-151.35681033848718
+31
+215.49119071730462
+12
+11.539773638472754
+22
+-151.3032668576315
+32
+213.63298855217639
+13
+11.539773638472754
+23
+-151.3032668576315
+33
+213.63298855217639
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.38609640483499
+20
+-152.71790995976738
+30
+213.26122642942113
+11
+13.317052133672432
+21
+-154.03276748394663
+31
+214.5283207348824
+12
+13.220308798945721
+22
+-152.77449568385282
+32
+213.12523815702212
+13
+13.220308798945721
+23
+-152.77449568385282
+33
+213.12523815702212
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.419517129866815
+20
+-147.4496573576835
+30
+212.32604086039754
+11
+17.469409918845383
+21
+-146.99301664880076
+31
+213.51008192566934
+12
+17.671110645020907
+22
+-148.94248611084083
+32
+212.5669865242448
+13
+17.671110645020907
+23
+-148.94248611084083
+33
+212.5669865242448
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.671110645020907
+20
+-148.94248611084083
+30
+212.5669865242448
+11
+17.469409918845383
+21
+-146.99301664880076
+31
+213.51008192566934
+12
+18.142962570055943
+22
+-149.67384138342933
+32
+213.9092242374971
+13
+18.142962570055943
+23
+-149.67384138342933
+33
+213.9092242374971
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+13.317052133672432
+20
+-154.03276748394663
+30
+214.5283207348824
+11
+12.519984407307637
+21
+-152.50495293363926
+31
+212.6755946075692
+12
+13.220308798945721
+22
+-152.77449568385282
+32
+213.12523815702212
+13
+13.220308798945721
+23
+-152.77449568385282
+33
+213.12523815702212
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+13.317052133672432
+20
+-154.03276748394663
+30
+214.5283207348824
+11
+12.6027334231745
+21
+-153.33153041933917
+31
+213.57275213621398
+12
+12.519984407307637
+22
+-152.50495293363926
+32
+212.6755946075692
+13
+12.519984407307637
+23
+-152.50495293363926
+33
+212.6755946075692
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.001861084835467
+20
+-154.8456548751116
+30
+222.66571292755592
+11
+14.243415197329224
+21
+-154.4605068821436
+31
+225.26591821657877
+12
+13.072760002271318
+22
+-152.17243574855968
+32
+224.98846563396717
+13
+13.072760002271318
+23
+-152.17243574855968
+33
+224.98846563396717
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.745110406357242
+20
+-152.4623615284163
+30
+222.394344831405
+11
+14.001861084835467
+21
+-154.8456548751116
+31
+222.66571292755592
+12
+13.072760002271318
+22
+-152.17243574855968
+32
+224.98846563396717
+13
+13.072760002271318
+23
+-152.17243574855968
+33
+224.98846563396717
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+15.020404118373369
+20
+-146.90996340861332
+30
+222.58144279007604
+11
+14.742343087114824
+21
+-147.32644650685552
+31
+224.9191024883152
+12
+14.998499967114503
+22
+-147.5260176627699
+32
+225.33619403520296
+13
+14.998499967114503
+23
+-147.5260176627699
+33
+225.33619403520296
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.745110406357242
+20
+-152.4623615284163
+30
+222.394344831405
+11
+12.348097664790037
+21
+-150.3315743698447
+31
+225.08429629572524
+12
+11.976031317712106
+22
+-150.3668643913167
+32
+222.49534730665488
+13
+11.976031317712106
+23
+-150.3668643913167
+33
+222.49534730665488
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.745110406357242
+20
+-152.4623615284163
+30
+222.394344831405
+11
+13.072760002271318
+21
+-152.17243574855968
+31
+224.98846563396717
+12
+12.348097664790037
+22
+-150.3315743698447
+32
+225.08429629572524
+13
+12.348097664790037
+23
+-150.3315743698447
+33
+225.08429629572524
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.976031317712106
+20
+-150.3668643913167
+30
+222.49534730665488
+11
+12.348097664790037
+21
+-150.3315743698447
+31
+225.08429629572524
+12
+12.286948575859002
+22
+-149.28534692291015
+32
+225.18469032232878
+13
+12.286948575859002
+23
+-149.28534692291015
+33
+225.18469032232878
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+15.020404118373369
+20
+-146.90996340861332
+30
+222.58144279007604
+11
+14.356890869823145
+21
+-147.1530386427221
+31
+222.46857556622814
+12
+14.742343087114824
+22
+-147.32644650685552
+32
+224.9191024883152
+13
+14.742343087114824
+23
+-147.32644650685552
+33
+224.9191024883152
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.976031317712106
+20
+-150.3668643913167
+30
+222.49534730665488
+11
+12.286948575859002
+21
+-149.28534692291015
+31
+225.18469032232878
+12
+11.956256736714508
+22
+-149.40855777374068
+32
+222.6091272034717
+13
+11.956256736714508
+23
+-149.40855777374068
+33
+222.6091272034717
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+15.533326327018838
+20
+-146.65137273402925
+30
+222.77614635682164
+11
+15.020404118373369
+21
+-146.90996340861332
+31
+222.58144279007604
+12
+14.998499967114503
+22
+-147.5260176627699
+32
+225.33619403520296
+13
+14.998499967114503
+23
+-147.5260176627699
+33
+225.33619403520296
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.956256736714508
+20
+-149.40855777374068
+30
+222.6091272034717
+11
+12.969627956760757
+21
+-148.32643185668815
+31
+225.41894305106948
+12
+12.57778702868524
+22
+-148.36871903759
+32
+222.7484619434243
+13
+12.57778702868524
+23
+-148.36871903759
+33
+222.7484619434243
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.328872931768426
+20
+-147.1518217454301
+30
+223.0828044744457
+11
+15.533326327018838
+21
+-146.65137273402925
+31
+222.77614635682164
+12
+14.998499967114503
+22
+-147.5260176627699
+32
+225.33619403520296
+13
+14.998499967114503
+23
+-147.5260176627699
+33
+225.33619403520296
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.10461565518538
+20
+-153.68260528812982
+30
+223.2376546548716
+11
+18.032529140792427
+21
+-153.65157440718036
+31
+225.69548296071136
+12
+17.404001689391777
+22
+-154.75651714846165
+32
+225.8077417359133
+13
+17.404001689391777
+23
+-154.75651714846165
+33
+225.8077417359133
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.10461565518538
+20
+-153.68260528812982
+30
+223.2376546548716
+11
+17.404001689391777
+21
+-154.75651714846165
+31
+225.8077417359133
+12
+18.368392793428583
+22
+-155.35644751349597
+32
+223.5942055614737
+13
+18.368392793428583
+23
+-155.35644751349597
+33
+223.5942055614737
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.956256736714508
+20
+-149.40855777374068
+30
+222.6091272034717
+11
+12.286948575859002
+21
+-149.28534692291015
+31
+225.18469032232878
+12
+12.969627956760757
+22
+-148.32643185668815
+32
+225.41894305106948
+13
+12.969627956760757
+23
+-148.32643185668815
+33
+225.41894305106948
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.368392793428583
+20
+-155.35644751349597
+30
+223.5942055614737
+11
+16.737750421934177
+21
+-155.47813724271265
+31
+225.56527495045015
+12
+17.40582703533002
+22
+-156.1182252183881
+32
+223.3009333140633
+13
+17.40582703533002
+23
+-156.1182252183881
+33
+223.3009333140633
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.368392793428583
+20
+-155.35644751349597
+30
+223.5942055614737
+11
+17.404001689391777
+21
+-154.75651714846165
+31
+225.8077417359133
+12
+16.737750421934177
+22
+-155.47813724271265
+32
+225.56527495045015
+13
+16.737750421934177
+23
+-155.47813724271265
+33
+225.56527495045015
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.742343087114824
+20
+-147.32644650685552
+30
+224.9191024883152
+11
+14.356890869823145
+21
+-147.1530386427221
+31
+222.46857556622814
+12
+14.176790070583463
+22
+-147.56952174096457
+32
+225.1871241169135
+13
+14.176790070583463
+23
+-147.56952174096457
+33
+225.1871241169135
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.40582703533002
+20
+-156.1182252183881
+30
+223.3009333140633
+11
+15.988750138609708
+21
+-155.59769740166718
+31
+225.43080779966644
+12
+16.17980301347882
+22
+-156.41484393335205
+32
+223.1278296742534
+13
+16.17980301347882
+23
+-156.41484393335205
+33
+223.1278296742534
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.328872931768426
+20
+-147.1518217454301
+30
+223.0828044744457
+11
+14.998499967114503
+21
+-147.5260176627699
+31
+225.33619403520296
+12
+15.48373776236333
+22
+-147.8798305504655
+32
+225.4870892994307
+13
+15.48373776236333
+23
+-147.8798305504655
+33
+225.4870892994307
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.469409918845383
+20
+-146.99301664880076
+30
+213.51008192566934
+11
+17.640992437039934
+21
+-146.8126116252385
+31
+215.36524184756695
+12
+18.142962570055943
+22
+-149.67384138342933
+32
+213.9092242374971
+13
+18.142962570055943
+23
+-149.67384138342933
+33
+213.9092242374971
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.142962570055943
+20
+-149.67384138342933
+30
+213.9092242374971
+11
+17.640992437039934
+21
+-146.8126116252385
+31
+215.36524184756695
+12
+18.721597232478032
+22
+-149.8238239746885
+32
+215.60588328709088
+13
+18.721597232478032
+23
+-149.8238239746885
+33
+215.60588328709088
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.142962570055943
+20
+-149.67384138342933
+30
+213.9092242374971
+11
+18.721597232478032
+21
+-149.8238239746885
+31
+215.60588328709088
+12
+18.03800517860714
+22
+-150.4876414475615
+32
+214.44039990552469
+13
+18.03800517860714
+23
+-150.4876414475615
+33
+214.44039990552469
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.03800517860714
+20
+-150.4876414475615
+30
+214.44039990552469
+11
+18.721597232478032
+21
+-149.8238239746885
+31
+215.60588328709088
+12
+18.681439621836738
+22
+-150.79125732195578
+32
+216.03879449877687
+13
+18.681439621836738
+23
+-150.79125732195578
+33
+216.03879449877687
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.03800517860714
+20
+-150.4876414475615
+30
+214.44039990552469
+11
+18.681439621836738
+21
+-150.79125732195578
+31
+216.03879449877687
+12
+16.97960875875096
+22
+-152.41946589886555
+32
+214.62354294799394
+13
+16.97960875875096
+23
+-152.41946589886555
+33
+214.62354294799394
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.97960875875096
+20
+-152.41946589886555
+30
+214.62354294799394
+11
+18.681439621836738
+21
+-150.79125732195578
+31
+216.03879449877687
+12
+17.5792348994628
+22
+-152.83351520252333
+32
+216.08321124994015
+13
+17.5792348994628
+23
+-152.83351520252333
+33
+216.08321124994015
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.486519731773233
+20
+-153.79668940926774
+30
+215.1842283753567
+11
+13.204489134147634
+21
+-154.7032778919275
+31
+217.49268253858392
+12
+11.939524398947317
+22
+-152.72399444622926
+32
+217.28489732594807
+13
+11.939524398947317
+23
+-152.72399444622926
+33
+217.28489732594807
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.486519731773233
+20
+-153.79668940926774
+30
+215.1842283753567
+11
+11.939524398947317
+21
+-152.72399444622926
+31
+217.28489732594807
+12
+11.805969921132736
+22
+-152.73251272727381
+32
+215.2021776104163
+13
+11.805969921132736
+23
+-152.73251272727381
+33
+215.2021776104163
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.805969921132736
+20
+-152.73251272727381
+30
+215.2021776104163
+11
+11.939524398947317
+21
+-152.72399444622926
+31
+217.28489732594807
+12
+11.298523750302037
+22
+-150.79764603273995
+32
+217.35882383644739
+13
+11.298523750302037
+23
+-150.79764603273995
+33
+217.35882383644739
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.805969921132736
+20
+-152.73251272727381
+30
+215.2021776104163
+11
+11.298523750302037
+21
+-150.79764603273995
+31
+217.35882383644739
+12
+11.338985585266348
+22
+-151.35681033848718
+32
+215.49119071730462
+13
+11.338985585266348
+23
+-151.35681033848718
+33
+215.49119071730462
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+13.204489134147634
+20
+-154.7032778919275
+30
+217.49268253858392
+11
+13.513885270679317
+21
+-154.9068039640418
+31
+219.599740199959
+12
+12.305506259564435
+22
+-152.73190427862897
+32
+219.39925637107612
+13
+12.305506259564435
+23
+-152.73190427862897
+33
+219.39925637107612
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.939524398947317
+20
+-152.72399444622926
+30
+217.28489732594807
+11
+13.204489134147634
+21
+-154.7032778919275
+31
+217.49268253858392
+12
+12.305506259564435
+22
+-152.73190427862897
+32
+219.39925637107612
+13
+12.305506259564435
+23
+-152.73190427862897
+33
+219.39925637107612
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.939524398947317
+20
+-152.72399444622926
+30
+217.28489732594807
+11
+12.305506259564435
+21
+-152.73190427862897
+31
+219.39925637107612
+12
+11.518173711536903
+22
+-150.76722360043658
+32
+219.5735769081786
+13
+11.518173711536903
+23
+-150.76722360043658
+33
+219.5735769081786
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.939524398947317
+20
+-152.72399444622926
+30
+217.28489732594807
+11
+11.518173711536903
+21
+-150.76722360043658
+31
+219.5735769081786
+12
+11.298523750302037
+22
+-150.79764603273995
+32
+217.35882383644739
+13
+11.298523750302037
+23
+-150.79764603273995
+33
+217.35882383644739
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.686090887687486
+20
+-152.68140304100476
+30
+221.53065197829443
+11
+13.513885270679317
+21
+-154.9068039640418
+31
+219.599740199959
+12
+14.059055257567003
+22
+-155.1136765037096
+32
+221.87381701468288
+13
+14.059055257567003
+23
+-155.1136765037096
+33
+221.87381701468288
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+13.513885270679317
+20
+-154.9068039640418
+30
+219.599740199959
+11
+12.686090887687486
+21
+-152.68140304100476
+31
+221.53065197829443
+12
+12.305506259564435
+22
+-152.73190427862897
+32
+219.39925637107612
+13
+12.305506259564435
+23
+-152.73190427862897
+33
+219.39925637107612
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.305506259564435
+20
+-152.73190427862897
+30
+219.39925637107612
+11
+12.686090887687486
+21
+-152.68140304100476
+31
+221.53065197829443
+12
+11.862859869541222
+22
+-150.55244122837084
+32
+221.59271374019514
+13
+11.862859869541222
+23
+-150.55244122837084
+33
+221.59271374019514
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.305506259564435
+20
+-152.73190427862897
+30
+219.39925637107612
+11
+11.862859869541222
+21
+-150.55244122837084
+31
+221.59271374019514
+12
+11.518173711536903
+22
+-150.76722360043658
+32
+219.5735769081786
+13
+11.518173711536903
+23
+-150.76722360043658
+33
+219.5735769081786
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.686090887687486
+20
+-152.68140304100476
+30
+221.53065197829443
+11
+14.059055257567003
+21
+-155.1136765037096
+31
+221.87381701468288
+12
+14.001861084835467
+22
+-154.8456548751116
+32
+222.66571292755592
+13
+14.001861084835467
+23
+-154.8456548751116
+33
+222.66571292755592
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.686090887687486
+20
+-152.68140304100476
+30
+221.53065197829443
+11
+14.001861084835467
+21
+-154.8456548751116
+31
+222.66571292755592
+12
+12.745110406357242
+22
+-152.4623615284163
+32
+222.394344831405
+13
+12.745110406357242
+23
+-152.4623615284163
+33
+222.394344831405
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.686090887687486
+20
+-152.68140304100476
+30
+221.53065197829443
+11
+12.745110406357242
+21
+-152.4623615284163
+31
+222.394344831405
+12
+11.862859869541222
+22
+-150.55244122837084
+32
+221.59271374019514
+13
+11.862859869541222
+23
+-150.55244122837084
+33
+221.59271374019514
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.862859869541222
+20
+-150.55244122837084
+30
+221.59271374019514
+11
+12.745110406357242
+21
+-152.4623615284163
+31
+222.394344831405
+12
+11.976031317712106
+22
+-150.3668643913167
+32
+222.49534730665488
+13
+11.976031317712106
+23
+-150.3668643913167
+33
+222.49534730665488
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.338985585266348
+20
+-151.35681033848718
+30
+215.49119071730462
+11
+11.298523750302037
+21
+-150.79764603273995
+31
+217.35882383644739
+12
+11.449419014529875
+22
+-150.30449840509223
+32
+217.61133002457066
+13
+11.449419014529875
+23
+-150.30449840509223
+33
+217.61133002457066
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.75820670241548
+20
+-150.82015863264445
+30
+215.48328088490575
+11
+11.338985585266348
+21
+-151.35681033848718
+31
+215.49119071730462
+12
+11.449419014529875
+22
+-150.30449840509223
+32
+217.61133002457066
+13
+11.449419014529875
+23
+-150.30449840509223
+33
+217.61133002457066
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+13.086450096808102
+20
+-149.7714973911262
+30
+217.5246260925044
+11
+11.75820670241548
+21
+-150.82015863264445
+31
+215.48328088490575
+12
+11.449419014529875
+22
+-150.30449840509223
+32
+217.61133002457066
+13
+11.449419014529875
+23
+-150.30449840509223
+33
+217.61133002457066
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+13.4652093789929
+20
+-150.05625135749105
+30
+215.61257622219765
+11
+11.75820670241548
+21
+-150.82015863264445
+31
+215.48328088490575
+12
+13.086450096808102
+22
+-149.7714973911262
+32
+217.5246260925044
+13
+13.086450096808102
+23
+-149.7714973911262
+33
+217.5246260925044
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.298523750302037
+20
+-150.79764603273995
+30
+217.35882383644739
+11
+11.518173711536903
+21
+-150.76722360043658
+31
+219.5735769081786
+12
+11.693102697284912
+22
+-149.7152158913643
+32
+219.7974860099363
+13
+11.693102697284912
+23
+-149.7152158913643
+33
+219.7974860099363
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+15.607861286163619
+20
+-147.21966376946716
+30
+219.3274594308402
+11
+15.202026039228267
+21
+-148.35472471872882
+31
+217.43548836585404
+12
+14.871029975760745
+22
+-147.84271518305295
+32
+219.29825389582783
+13
+14.871029975760745
+23
+-147.84271518305295
+33
+219.29825389582783
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.00456980340776
+20
+-147.6845185350717
+30
+217.3712970336928
+11
+15.202026039228267
+21
+-148.35472471872882
+31
+217.43548836585404
+12
+15.607861286163619
+22
+-147.21966376946716
+32
+219.3274594308402
+13
+15.607861286163619
+23
+-147.21966376946716
+33
+219.3274594308402
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.00456980340776
+20
+-147.6845185350717
+30
+217.3712970336928
+11
+15.607861286163619
+21
+-147.21966376946716
+31
+219.3274594308402
+12
+16.25525064559274
+22
+-146.47735642124948
+32
+219.35483961991397
+13
+16.25525064559274
+23
+-146.47735642124948
+33
+219.35483961991397
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.638573292623146
+20
+-146.58870252348157
+30
+217.3524351256645
+11
+16.00456980340776
+21
+-147.6845185350717
+31
+217.3712970336928
+12
+16.25525064559274
+22
+-146.47735642124948
+32
+219.35483961991397
+13
+16.25525064559274
+23
+-146.47735642124948
+33
+219.35483961991397
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+15.193203533860109
+20
+-147.05355728908776
+30
+221.40987492204897
+11
+14.871029975760745
+21
+-147.84271518305295
+31
+219.29825389582783
+12
+14.494096039514188
+22
+-147.31458175825605
+32
+221.35237652499433
+13
+14.494096039514188
+23
+-147.31458175825605
+33
+221.35237652499433
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.298523750302037
+20
+-150.79764603273995
+30
+217.35882383644739
+11
+11.693102697284912
+21
+-149.7152158913643
+31
+219.7974860099363
+12
+11.449419014529875
+22
+-150.30449840509223
+32
+217.61133002457066
+13
+11.449419014529875
+23
+-150.30449840509223
+33
+217.61133002457066
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.752716014433213
+20
+-149.25735828518904
+30
+219.5553234487965
+11
+11.449419014529875
+21
+-150.30449840509223
+31
+217.61133002457066
+12
+11.693102697284912
+22
+-149.7152158913643
+32
+219.7974860099363
+13
+11.693102697284912
+23
+-149.7152158913643
+33
+219.7974860099363
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+13.086450096808102
+20
+-149.7714973911262
+30
+217.5246260925044
+11
+11.449419014529875
+21
+-150.30449840509223
+31
+217.61133002457066
+12
+12.752716014433213
+22
+-149.25735828518904
+32
+219.5553234487965
+13
+12.752716014433213
+23
+-149.25735828518904
+33
+219.5553234487965
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.518173711536903
+20
+-150.76722360043658
+30
+219.5735769081786
+11
+11.862859869541222
+21
+-150.55244122837084
+31
+221.59271374019514
+12
+11.893586526168269
+22
+-149.50104196794464
+32
+221.72292175045652
+13
+11.893586526168269
+23
+-149.50104196794464
+33
+221.72292175045652
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.518173711536903
+20
+-150.76722360043658
+30
+219.5735769081786
+11
+11.893586526168269
+21
+-149.50104196794464
+31
+221.72292175045652
+12
+11.693102697284912
+22
+-149.7152158913643
+32
+219.7974860099363
+13
+11.693102697284912
+23
+-149.7152158913643
+33
+219.7974860099363
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.693102697284912
+20
+-149.7152158913643
+30
+219.7974860099363
+11
+11.893586526168269
+21
+-149.50104196794464
+31
+221.72292175045652
+12
+12.683961317426183
+22
+-148.46515814799346
+32
+221.72626821801023
+13
+12.683961317426183
+23
+-148.46515814799346
+33
+221.72626821801023
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.752716014433213
+20
+-149.25735828518904
+30
+219.5553234487965
+11
+11.693102697284912
+21
+-149.7152158913643
+31
+219.7974860099363
+12
+12.683961317426183
+22
+-148.46515814799346
+32
+221.72626821801023
+13
+12.683961317426183
+23
+-148.46515814799346
+33
+221.72626821801023
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.862859869541222
+20
+-150.55244122837084
+30
+221.59271374019514
+11
+11.976031317712106
+21
+-150.3668643913167
+31
+222.49534730665488
+12
+11.893586526168269
+22
+-149.50104196794464
+32
+221.72292175045652
+13
+11.893586526168269
+23
+-149.50104196794464
+33
+221.72292175045652
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.893586526168269
+20
+-149.50104196794464
+30
+221.72292175045652
+11
+11.976031317712106
+21
+-150.3668643913167
+31
+222.49534730665488
+12
+11.956256736714508
+22
+-149.40855777374068
+32
+222.6091272034717
+13
+11.956256736714508
+23
+-149.40855777374068
+33
+222.6091272034717
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.893586526168269
+20
+-149.50104196794464
+30
+221.72292175045652
+11
+11.956256736714508
+21
+-149.40855777374068
+31
+222.6091272034717
+12
+12.683961317426183
+22
+-148.46515814799346
+32
+221.72626821801023
+13
+12.683961317426183
+23
+-148.46515814799346
+33
+221.72626821801023
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.683961317426183
+20
+-148.46515814799346
+30
+221.72626821801023
+11
+11.956256736714508
+21
+-149.40855777374068
+31
+222.6091272034717
+12
+12.57778702868524
+22
+-148.36871903759
+32
+222.7484619434243
+13
+12.57778702868524
+23
+-148.36871903759
+33
+222.7484619434243
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.00456980340776
+20
+-147.6845185350717
+30
+217.3712970336928
+11
+15.54123615941787
+21
+-148.5156593856164
+31
+215.34577149089228
+12
+15.202026039228267
+22
+-148.35472471872882
+32
+217.43548836585404
+13
+15.202026039228267
+23
+-148.35472471872882
+33
+217.43548836585404
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.299058948110517
+20
+-147.94219653668603
+30
+215.22377753735339
+11
+15.54123615941787
+21
+-148.5156593856164
+31
+215.34577149089228
+12
+16.00456980340776
+22
+-147.6845185350717
+32
+217.3712970336928
+13
+16.00456980340776
+23
+-147.6845185350717
+33
+217.3712970336928
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.299058948110517
+20
+-147.94219653668603
+30
+215.22377753735339
+11
+16.00456980340776
+21
+-147.6845185350717
+31
+217.3712970336928
+12
+16.638573292623146
+22
+-146.58870252348157
+32
+217.3524351256645
+13
+16.638573292623146
+23
+-146.58870252348157
+33
+217.3524351256645
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.914808977943462
+20
+-147.08884731055875
+30
+215.11912437022792
+11
+16.299058948110517
+21
+-147.94219653668603
+31
+215.22377753735339
+12
+16.638573292623146
+22
+-146.58870252348157
+32
+217.3524351256645
+13
+16.638573292623146
+23
+-146.58870252348157
+33
+217.3524351256645
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.032529140792427
+20
+-153.65157440718036
+30
+225.69548296071136
+11
+14.243415197329224
+21
+-154.4605068821436
+31
+225.26591821657877
+12
+17.404001689391777
+22
+-154.75651714846165
+32
+225.8077417359133
+13
+17.404001689391777
+23
+-154.75651714846165
+33
+225.8077417359133
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.243415197329224
+20
+-154.4605068821436
+30
+225.26591821657877
+11
+15.988750138609708
+21
+-155.59769740166718
+31
+225.43080779966644
+12
+17.404001689391777
+22
+-154.75651714846165
+32
+225.8077417359133
+13
+17.404001689391777
+23
+-154.75651714846165
+33
+225.8077417359133
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+13.072760002271318
+20
+-152.17243574855968
+30
+224.98846563396717
+11
+14.243415197329224
+21
+-154.4605068821436
+31
+225.26591821657877
+12
+18.032529140792427
+22
+-153.65157440718036
+32
+225.69548296071136
+13
+18.032529140792427
+23
+-153.65157440718036
+33
+225.69548296071136
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.467280348584104
+20
+-151.49340705953455
+30
+225.43628383748222
+11
+13.072760002271318
+21
+-152.17243574855968
+31
+224.98846563396717
+12
+18.032529140792427
+22
+-153.65157440718036
+32
+225.69548296071136
+13
+18.032529140792427
+23
+-153.65157440718036
+33
+225.69548296071136
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.318529304785056
+20
+-149.10402922637854
+30
+225.30850962180608
+11
+12.286948575859002
+21
+-149.28534692291015
+31
+225.18469032232878
+12
+17.467280348584104
+22
+-151.49340705953455
+32
+225.43628383748222
+13
+17.467280348584104
+23
+-151.49340705953455
+33
+225.43628383748222
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.286948575859002
+20
+-149.28534692291015
+30
+225.18469032232878
+11
+12.348097664790037
+21
+-150.3315743698447
+31
+225.08429629572524
+12
+17.467280348584104
+22
+-151.49340705953455
+32
+225.43628383748222
+13
+17.467280348584104
+23
+-151.49340705953455
+33
+225.43628383748222
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+15.48373776236333
+20
+-147.8798305504655
+30
+225.4870892994307
+11
+12.969627956760757
+21
+-148.32643185668815
+31
+225.41894305106948
+12
+16.318529304785056
+22
+-149.10402922637854
+32
+225.30850962180608
+13
+16.318529304785056
+23
+-149.10402922637854
+33
+225.30850962180608
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.969627956760757
+20
+-148.32643185668815
+30
+225.41894305106948
+11
+12.286948575859002
+21
+-149.28534692291015
+31
+225.18469032232878
+12
+16.318529304785056
+22
+-149.10402922637854
+32
+225.30850962180608
+13
+16.318529304785056
+23
+-149.10402922637854
+33
+225.30850962180608
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.998499967114503
+20
+-147.5260176627699
+30
+225.33619403520296
+11
+14.742343087114824
+21
+-147.32644650685552
+31
+224.9191024883152
+12
+14.176790070583463
+22
+-147.56952174096457
+32
+225.1871241169135
+13
+14.176790070583463
+23
+-147.56952174096457
+33
+225.1871241169135
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.404001689391777
+20
+-154.75651714846165
+30
+225.8077417359133
+11
+15.988750138609708
+21
+-155.59769740166718
+31
+225.43080779966644
+12
+16.737750421934177
+22
+-155.47813724271265
+32
+225.56527495045015
+13
+16.737750421934177
+23
+-155.47813724271265
+33
+225.56527495045015
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.348097664790037
+20
+-150.3315743698447
+30
+225.08429629572524
+11
+13.072760002271318
+21
+-152.17243574855968
+31
+224.98846563396717
+12
+17.467280348584104
+22
+-151.49340705953455
+32
+225.43628383748222
+13
+17.467280348584104
+23
+-151.49340705953455
+33
+225.43628383748222
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.201084065924103
+20
+-148.0812270523144
+30
+211.93572105393707
+11
+17.07848166373897
+21
+-148.64495472290756
+31
+211.82620029764254
+12
+16.890471032100255
+22
+-148.2671081136919
+32
+211.65309665783283
+13
+16.890471032100255
+23
+-148.2671081136919
+33
+211.65309665783283
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.0641831205561
+20
+-147.719200107897
+30
+212.02029541574225
+11
+16.890471032100255
+21
+-148.2671081136919
+31
+211.65309665783283
+12
+16.7645221623617
+22
+-148.10465232518845
+32
+211.64001501194213
+13
+16.7645221623617
+23
+-148.10465232518845
+33
+211.64001501194213
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.0641831205561
+20
+-147.719200107897
+30
+212.02029541574225
+11
+17.201084065924103
+21
+-148.0812270523144
+31
+211.93572105393707
+12
+16.890471032100255
+22
+-148.2671081136919
+32
+211.65309665783283
+13
+16.890471032100255
+23
+-148.2671081136919
+33
+211.65309665783283
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.890471032100255
+20
+-148.2671081136919
+30
+211.65309665783283
+11
+16.311532145355137
+21
+-149.51990387597056
+31
+211.7258062710391
+12
+16.12139194345514
+22
+-148.93183825953415
+32
+211.4437903235812
+13
+16.12139194345514
+23
+-148.93183825953415
+33
+211.4437903235812
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.890471032100255
+20
+-148.2671081136919
+30
+211.65309665783283
+11
+17.07848166373897
+21
+-148.64495472290756
+31
+211.82620029764254
+12
+16.311532145355137
+22
+-149.51990387597056
+32
+211.7258062710391
+13
+16.311532145355137
+23
+-149.51990387597056
+33
+211.7258062710391
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.7645221623617
+20
+-148.10465232518845
+30
+211.64001501194213
+11
+16.12139194345514
+21
+-148.93183825953415
+31
+211.4437903235812
+12
+16.105268054334026
+22
+-148.51231291806198
+32
+211.4532212775955
+13
+16.105268054334026
+23
+-148.51231291806198
+33
+211.4532212775955
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.7645221623617
+20
+-148.10465232518845
+30
+211.64001501194213
+11
+16.890471032100255
+21
+-148.2671081136919
+31
+211.65309665783283
+12
+16.12139194345514
+22
+-148.93183825953415
+32
+211.4437903235812
+13
+16.12139194345514
+23
+-148.93183825953415
+33
+211.4437903235812
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.12139194345514
+20
+-148.93183825953415
+30
+211.4437903235812
+11
+15.434149197707788
+21
+-150.3811629344968
+31
+211.6570515740318
+12
+14.91118758640203
+22
+-149.82504087197955
+32
+211.22170656776171
+13
+14.91118758640203
+23
+-149.82504087197955
+33
+211.22170656776171
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.12139194345514
+20
+-148.93183825953415
+30
+211.4437903235812
+11
+16.311532145355137
+21
+-149.51990387597056
+31
+211.7258062710391
+12
+15.434149197707788
+22
+-150.3811629344968
+32
+211.6570515740318
+13
+15.434149197707788
+23
+-150.3811629344968
+33
+211.6570515740318
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.105268054334026
+20
+-148.51231291806198
+30
+211.4532212775955
+11
+14.91118758640203
+21
+-149.82504087197955
+31
+211.22170656776171
+12
+14.198085773196263
+22
+-149.6628893077992
+32
+211.11857452225124
+13
+14.198085773196263
+23
+-149.6628893077992
+33
+211.11857452225124
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.105268054334026
+20
+-148.51231291806198
+30
+211.4532212775955
+11
+16.12139194345514
+21
+-148.93183825953415
+31
+211.4437903235812
+12
+14.91118758640203
+22
+-149.82504087197955
+32
+211.22170656776171
+13
+14.91118758640203
+23
+-149.82504087197955
+33
+211.22170656776171
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.91118758640203
+20
+-149.82504087197955
+30
+211.22170656776171
+11
+15.434149197707788
+21
+-150.3811629344968
+31
+211.6570515740318
+12
+14.226378635238982
+22
+-151.21412913098044
+32
+211.67743460367498
+13
+14.226378635238982
+23
+-151.21412913098044
+33
+211.67743460367498
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.91118758640203
+20
+-149.82504087197955
+30
+211.22170656776171
+11
+14.226378635238982
+21
+-151.21412913098044
+31
+211.67743460367498
+12
+14.139370478849536
+22
+-150.33248704281021
+32
+211.0975830439613
+13
+14.139370478849536
+23
+-150.33248704281021
+33
+211.0975830439613
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.198085773196263
+20
+-149.6628893077992
+30
+211.11857452225124
+11
+14.91118758640203
+21
+-149.82504087197955
+31
+211.22170656776171
+12
+14.139370478849536
+22
+-150.33248704281021
+32
+211.0975830439613
+13
+14.139370478849536
+23
+-150.33248704281021
+33
+211.0975830439613
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+13.516623289586661
+20
+-150.8365867460875
+30
+211.17576869498237
+11
+14.226378635238982
+21
+-151.21412913098044
+31
+211.67743460367498
+12
+13.65930449709243
+22
+-151.29140210903242
+32
+211.62084887958983
+13
+13.65930449709243
+23
+-151.29140210903242
+33
+211.62084887958983
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.139370478849536
+20
+-150.33248704281021
+30
+211.0975830439613
+11
+14.226378635238982
+21
+-151.21412913098044
+31
+211.67743460367498
+12
+13.516623289586661
+22
+-150.8365867460875
+32
+211.17576869498237
+13
+13.516623289586661
+23
+-150.8365867460875
+33
+211.17576869498237
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.139370478849536
+20
+-150.33248704281021
+30
+211.0975830439613
+11
+13.516623289586661
+21
+-150.8365867460875
+31
+211.17576869498237
+12
+13.336218266023952
+22
+-150.4033713100786
+32
+211.19888974353358
+13
+13.336218266023952
+23
+-150.4033713100786
+33
+211.19888974353358
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.198085773196263
+20
+-149.6628893077992
+30
+211.11857452225124
+11
+14.139370478849536
+21
+-150.33248704281021
+31
+211.0975830439613
+12
+13.336218266023952
+22
+-150.4033713100786
+32
+211.19888974353358
+13
+13.336218266023952
+23
+-150.4033713100786
+33
+211.19888974353358
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+13.336218266023952
+20
+-150.4033713100786
+30
+211.19888974353358
+11
+13.516623289586661
+21
+-150.8365867460875
+31
+211.17576869498237
+12
+12.305810483887484
+22
+-151.097611215256
+32
+211.7693103492334
+13
+12.305810483887484
+23
+-151.097611215256
+33
+211.7693103492334
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+13.516623289586661
+20
+-150.8365867460875
+30
+211.17576869498237
+11
+13.65930449709243
+21
+-151.29140210903242
+31
+211.62084887958983
+12
+12.755454033340603
+22
+-151.44412271919853
+32
+211.75592447901923
+13
+12.755454033340603
+23
+-151.44412271919853
+33
+211.75592447901923
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+13.516623289586661
+20
+-150.8365867460875
+30
+211.17576869498237
+11
+12.755454033340603
+21
+-151.44412271919853
+31
+211.75592447901923
+12
+12.305810483887484
+22
+-151.097611215256
+32
+211.7693103492334
+13
+12.305810483887484
+23
+-151.097611215256
+33
+211.7693103492334
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.201084065924103
+20
+-148.0812270523144
+30
+211.93572105393707
+11
+17.419517129866815
+21
+-147.4496573576835
+31
+212.32604086039754
+12
+17.671110645020907
+22
+-148.94248611084083
+32
+212.5669865242448
+13
+17.671110645020907
+23
+-148.94248611084083
+33
+212.5669865242448
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.07848166373897
+20
+-148.64495472290756
+30
+211.82620029764254
+11
+17.201084065924103
+21
+-148.0812270523144
+31
+211.93572105393707
+12
+17.671110645020907
+22
+-148.94248611084083
+32
+212.5669865242448
+13
+17.671110645020907
+23
+-148.94248611084083
+33
+212.5669865242448
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.419517129866815
+20
+-147.4496573576835
+30
+212.32604086039754
+11
+17.201084065924103
+21
+-148.0812270523144
+31
+211.93572105393707
+12
+17.0641831205561
+22
+-147.719200107897
+32
+212.02029541574225
+13
+17.0641831205561
+23
+-147.719200107897
+33
+212.02029541574225
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.305810483887484
+20
+-151.097611215256
+30
+211.7693103492334
+11
+12.755454033340603
+21
+-151.44412271919853
+31
+211.75592447901923
+12
+12.519984407307637
+22
+-152.50495293363926
+32
+212.6755946075692
+13
+12.519984407307637
+23
+-152.50495293363926
+33
+212.6755946075692
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.305810483887484
+20
+-151.097611215256
+30
+211.7693103492334
+11
+12.519984407307637
+21
+-152.50495293363926
+31
+212.6755946075692
+12
+11.926138528733558
+22
+-152.03005876537378
+32
+212.55268798106113
+13
+11.926138528733558
+23
+-152.03005876537378
+33
+212.55268798106113
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+13.336218266023952
+20
+-150.4033713100786
+30
+211.19888974353358
+11
+12.305810483887484
+21
+-151.097611215256
+31
+211.7693103492334
+12
+11.88293867486188
+22
+-151.14081106912815
+32
+213.62994630894605
+13
+11.88293867486188
+23
+-151.14081106912815
+33
+213.62994630894605
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+13.408319430584415
+20
+-150.28046468357098
+30
+213.43007092870894
+11
+13.336218266023952
+21
+-150.4033713100786
+31
+211.19888974353358
+12
+11.88293867486188
+22
+-151.14081106912815
+32
+213.62994630894605
+13
+11.88293867486188
+23
+-151.14081106912815
+33
+213.62994630894605
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.311532145355137
+20
+-149.51990387597056
+30
+211.7258062710391
+11
+17.63582062354826
+21
+-149.78579593430786
+31
+213.08416787341258
+12
+15.434149197707788
+22
+-150.3811629344968
+32
+211.6570515740318
+13
+15.434149197707788
+23
+-150.3811629344968
+33
+211.6570515740318
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.63582062354826
+20
+-149.78579593430786
+30
+213.08416787341258
+11
+16.676297108680103
+21
+-151.63791361297547
+31
+213.40482030989634
+12
+15.434149197707788
+22
+-150.3811629344968
+32
+211.6570515740318
+13
+15.434149197707788
+23
+-150.3811629344968
+33
+211.6570515740318
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.07848166373897
+20
+-148.64495472290756
+30
+211.82620029764254
+11
+17.671110645020907
+21
+-148.94248611084083
+31
+212.5669865242448
+12
+16.311532145355137
+22
+-149.51990387597056
+32
+211.7258062710391
+13
+16.311532145355137
+23
+-149.51990387597056
+33
+211.7258062710391
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.671110645020907
+20
+-148.94248611084083
+30
+212.5669865242448
+11
+17.63582062354826
+21
+-149.78579593430786
+31
+213.08416787341258
+12
+16.311532145355137
+22
+-149.51990387597056
+32
+211.7258062710391
+13
+16.311532145355137
+23
+-149.51990387597056
+33
+211.7258062710391
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+13.65930449709243
+20
+-151.29140210903242
+30
+211.62084887958983
+11
+13.220308798945721
+21
+-152.77449568385282
+31
+213.12523815702212
+12
+12.755454033340603
+22
+-151.44412271919853
+32
+211.75592447901923
+13
+12.755454033340603
+23
+-151.44412271919853
+33
+211.75592447901923
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.755454033340603
+20
+-151.44412271919853
+30
+211.75592447901923
+11
+13.220308798945721
+21
+-152.77449568385282
+31
+213.12523815702212
+12
+12.519984407307637
+22
+-152.50495293363926
+32
+212.6755946075692
+13
+12.519984407307637
+23
+-152.50495293363926
+33
+212.6755946075692
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.38609640483499
+20
+-152.71790995976738
+30
+213.26122642942113
+11
+13.220308798945721
+21
+-152.77449568385282
+31
+213.12523815702212
+12
+14.226378635238982
+22
+-151.21412913098044
+32
+211.67743460367498
+13
+14.226378635238982
+23
+-151.21412913098044
+33
+211.67743460367498
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.226378635238982
+20
+-151.21412913098044
+30
+211.67743460367498
+11
+13.220308798945721
+21
+-152.77449568385282
+31
+213.12523815702212
+12
+13.65930449709243
+22
+-151.29140210903242
+32
+211.62084887958983
+13
+13.65930449709243
+23
+-151.29140210903242
+33
+211.62084887958983
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+15.434149197707788
+20
+-150.3811629344968
+30
+211.6570515740318
+11
+16.109222970533537
+21
+-152.27617624271338
+31
+213.3518852776872
+12
+14.226378635238982
+22
+-151.21412913098044
+32
+211.67743460367498
+13
+14.226378635238982
+23
+-151.21412913098044
+33
+211.67743460367498
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.109222970533537
+20
+-152.27617624271338
+30
+213.3518852776872
+11
+14.38609640483499
+21
+-152.71790995976738
+31
+213.26122642942113
+12
+14.226378635238982
+22
+-151.21412913098044
+32
+211.67743460367498
+13
+14.226378635238982
+23
+-151.21412913098044
+33
+211.67743460367498
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+15.434149197707788
+20
+-150.3811629344968
+30
+211.6570515740318
+11
+16.676297108680103
+21
+-151.63791361297547
+31
+213.40482030989634
+12
+16.109222970533537
+22
+-152.27617624271338
+32
+213.3518852776872
+13
+16.109222970533537
+23
+-152.27617624271338
+33
+213.3518852776872
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.6027334231745
+20
+-153.33153041933917
+30
+213.57275213621398
+11
+11.826352950776432
+21
+-152.6010878197201
+31
+213.51890443103602
+12
+12.519984407307637
+22
+-152.50495293363926
+32
+212.6755946075692
+13
+12.519984407307637
+23
+-152.50495293363926
+33
+212.6755946075692
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.519984407307637
+20
+-152.50495293363926
+30
+212.6755946075692
+11
+11.826352950776432
+21
+-152.6010878197201
+31
+213.51890443103602
+12
+11.926138528733558
+22
+-152.03005876537378
+32
+212.55268798106113
+13
+11.926138528733558
+23
+-152.03005876537378
+33
+212.55268798106113
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.926138528733558
+20
+-152.03005876537378
+30
+212.55268798106113
+11
+11.826352950776432
+21
+-152.6010878197201
+31
+213.51890443103602
+12
+11.539773638472754
+22
+-151.3032668576315
+32
+213.63298855217639
+13
+11.539773638472754
+23
+-151.3032668576315
+33
+213.63298855217639
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.305810483887484
+20
+-151.097611215256
+30
+211.7693103492334
+11
+11.926138528733558
+21
+-152.03005876537378
+31
+212.55268798106113
+12
+11.539773638472754
+22
+-151.3032668576315
+32
+213.63298855217639
+13
+11.539773638472754
+23
+-151.3032668576315
+33
+213.63298855217639
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+12.305810483887484
+20
+-151.097611215256
+30
+211.7693103492334
+11
+11.539773638472754
+21
+-151.3032668576315
+31
+213.63298855217639
+12
+11.88293867486188
+22
+-151.14081106912815
+32
+213.62994630894605
+13
+11.88293867486188
+23
+-151.14081106912815
+33
+213.62994630894605
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+15.607861286163619
+20
+-147.21966376946716
+30
+219.3274594308402
+11
+14.871029975760745
+21
+-147.84271518305295
+31
+219.29825389582783
+12
+15.193203533860109
+22
+-147.05355728908776
+32
+221.40987492204897
+13
+15.193203533860109
+23
+-147.05355728908776
+33
+221.40987492204897
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+15.607861286163619
+20
+-147.21966376946716
+30
+219.3274594308402
+11
+15.74111153965515
+21
+-146.57927156946843
+31
+221.52030835131265
+12
+16.25525064559274
+22
+-146.47735642124948
+32
+219.35483961991397
+13
+16.25525064559274
+23
+-146.47735642124948
+33
+219.35483961991397
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+15.193203533860109
+20
+-147.05355728908776
+30
+221.40987492204897
+11
+14.494096039514188
+21
+-147.31458175825605
+31
+221.35237652499433
+12
+14.356890869823145
+22
+-147.1530386427221
+32
+222.46857556622814
+13
+14.356890869823145
+23
+-147.1530386427221
+33
+222.46857556622814
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+15.193203533860109
+20
+-147.05355728908776
+30
+221.40987492204897
+11
+14.356890869823145
+21
+-147.1530386427221
+31
+222.46857556622814
+12
+15.020404118373369
+22
+-146.90996340861332
+32
+222.58144279007604
+13
+15.020404118373369
+23
+-146.90996340861332
+33
+222.58144279007604
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+15.74111153965515
+20
+-146.57927156946843
+30
+221.52030835131265
+11
+15.193203533860109
+21
+-147.05355728908776
+31
+221.40987492204897
+12
+15.020404118373369
+22
+-146.90996340861332
+32
+222.58144279007604
+13
+15.020404118373369
+23
+-146.90996340861332
+33
+222.58144279007604
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+15.193203533860109
+20
+-147.05355728908776
+30
+221.40987492204897
+11
+15.74111153965515
+21
+-146.57927156946843
+31
+221.52030835131265
+12
+15.607861286163619
+22
+-147.21966376946716
+32
+219.3274594308402
+13
+15.607861286163619
+23
+-147.21966376946716
+33
+219.3274594308402
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+15.74111153965515
+20
+-146.57927156946843
+30
+221.52030835131265
+11
+15.020404118373369
+21
+-146.90996340861332
+31
+222.58144279007604
+12
+15.533326327018838
+22
+-146.65137273402925
+32
+222.77614635682164
+13
+15.533326327018838
+23
+-146.65137273402925
+33
+222.77614635682164
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.502570370056752
+20
+-146.61973340443174
+30
+217.5252345411513
+11
+16.914808977943462
+21
+-147.08884731055875
+31
+215.11912437022792
+12
+16.638573292623146
+22
+-146.58870252348157
+32
+217.3524351256645
+13
+16.638573292623146
+23
+-146.58870252348157
+33
+217.3524351256645
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.640992437039934
+20
+-146.8126116252385
+30
+215.36524184756695
+11
+16.914808977943462
+21
+-147.08884731055875
+31
+215.11912437022792
+12
+17.502570370056752
+22
+-146.61973340443174
+32
+217.5252345411513
+13
+17.502570370056752
+23
+-146.61973340443174
+33
+217.5252345411513
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.09825624473659
+20
+-146.67388533393344
+30
+219.58209518922473
+11
+16.638573292623146
+21
+-146.58870252348157
+31
+217.3524351256645
+12
+16.25525064559274
+22
+-146.47735642124948
+32
+219.35483961991397
+13
+16.25525064559274
+23
+-146.47735642124948
+33
+219.35483961991397
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.502570370056752
+20
+-146.61973340443174
+30
+217.5252345411513
+11
+16.638573292623146
+21
+-146.58870252348157
+31
+217.3524351256645
+12
+17.09825624473659
+22
+-146.67388533393344
+32
+219.58209518922473
+13
+17.09825624473659
+23
+-146.67388533393344
+33
+219.58209518922473
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.52661874174443
+20
+-146.9616815435298
+30
+221.79958627986318
+11
+16.25525064559274
+21
+-146.47735642124948
+31
+219.35483961991397
+12
+15.74111153965515
+22
+-146.57927156946843
+32
+221.52030835131265
+13
+15.74111153965515
+23
+-146.57927156946843
+33
+221.52030835131265
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.09825624473659
+20
+-146.67388533393344
+30
+219.58209518922473
+11
+16.25525064559274
+21
+-146.47735642124948
+31
+219.35483961991397
+12
+16.52661874174443
+22
+-146.9616815435298
+32
+221.79958627986318
+13
+16.52661874174443
+23
+-146.9616815435298
+33
+221.79958627986318
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.52661874174443
+20
+-146.9616815435298
+30
+221.79958627986318
+11
+15.74111153965515
+21
+-146.57927156946843
+31
+221.52030835131265
+12
+15.533326327018838
+22
+-146.65137273402925
+32
+222.77614635682164
+13
+15.533326327018838
+23
+-146.65137273402925
+33
+222.77614635682164
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.52661874174443
+20
+-146.9616815435298
+30
+221.79958627986318
+11
+15.533326327018838
+21
+-146.65137273402925
+31
+222.77614635682164
+12
+16.328872931768426
+22
+-147.1518217454301
+32
+223.0828044744457
+13
+16.328872931768426
+23
+-147.1518217454301
+33
+223.0828044744457
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.5792348994628
+20
+-152.83351520252333
+30
+216.08321124994015
+11
+17.205343206446663
+21
+-155.2487521031385
+31
+218.35272469981794
+12
+16.723147654428264
+22
+-154.02272808128686
+32
+216.08716616613935
+13
+16.723147654428264
+23
+-154.02272808128686
+33
+216.08716616613935
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.205343206446663
+20
+-155.2487521031385
+30
+218.35272469981794
+11
+14.53029873395595
+21
+-154.87242661553736
+31
+215.97916653145992
+12
+16.723147654428264
+22
+-154.02272808128686
+32
+216.08716616613935
+13
+16.723147654428264
+23
+-154.02272808128686
+33
+216.08716616613935
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.205343206446663
+20
+-155.2487521031385
+30
+218.35272469981794
+11
+15.434757646353864
+21
+-155.75984896584563
+31
+217.7731773644266
+12
+14.53029873395595
+22
+-154.87242661553736
+32
+215.97916653145992
+13
+14.53029873395595
+23
+-154.87242661553736
+33
+215.97916653145992
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+15.434757646353864
+20
+-155.75984896584563
+30
+217.7731773644266
+11
+14.349893710393228
+21
+-155.73642369297156
+31
+217.7065522376808
+12
+14.53029873395595
+22
+-154.87242661553736
+32
+215.97916653145992
+13
+14.53029873395595
+23
+-154.87242661553736
+33
+215.97916653145992
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.53029873395595
+20
+-154.87242661553736
+30
+215.97916653145992
+11
+14.349893710393228
+21
+-155.73642369297156
+31
+217.7065522376808
+12
+13.498978278850345
+22
+-154.81827468603623
+32
+215.8307050618161
+13
+13.498978278850345
+23
+-154.81827468603623
+33
+215.8307050618161
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.349893710393228
+20
+-155.73642369297156
+30
+217.7065522376808
+11
+12.486519731773233
+21
+-153.79668940926774
+31
+215.1842283753567
+12
+13.498978278850345
+22
+-154.81827468603623
+32
+215.8307050618161
+13
+13.498978278850345
+23
+-154.81827468603623
+33
+215.8307050618161
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+14.349893710393228
+20
+-155.73642369297156
+30
+217.7065522376808
+11
+13.204489134147634
+21
+-154.7032778919275
+31
+217.49268253858392
+12
+12.486519731773233
+22
+-153.79668940926774
+32
+215.1842283753567
+13
+12.486519731773233
+23
+-153.79668940926774
+33
+215.1842283753567
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+15.54123615941787
+20
+-148.5156593856164
+30
+215.34577149089228
+11
+13.4652093789929
+21
+-150.05625135749105
+31
+215.61257622219765
+12
+13.086450096808102
+22
+-149.7714973911262
+32
+217.5246260925044
+13
+13.086450096808102
+23
+-149.7714973911262
+33
+217.5246260925044
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+15.54123615941787
+20
+-148.5156593856164
+30
+215.34577149089228
+11
+13.086450096808102
+21
+-149.7714973911262
+31
+217.5246260925044
+12
+15.202026039228267
+22
+-148.35472471872882
+32
+217.43548836585404
+13
+15.202026039228267
+23
+-148.35472471872882
+33
+217.43548836585404
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.640992437039934
+20
+-146.8126116252385
+30
+215.36524184756695
+11
+17.502570370056752
+21
+-146.61973340443174
+31
+217.5252345411513
+12
+18.721597232478032
+22
+-149.8238239746885
+32
+215.60588328709088
+13
+18.721597232478032
+23
+-149.8238239746885
+33
+215.60588328709088
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.721597232478032
+20
+-149.8238239746885
+30
+215.60588328709088
+11
+17.502570370056752
+21
+-146.61973340443174
+31
+217.5252345411513
+12
+18.995703347537056
+22
+-149.8709787447603
+32
+217.30223811236215
+13
+18.995703347537056
+23
+-149.8709787447603
+33
+217.30223811236215
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.721597232478032
+20
+-149.8238239746885
+30
+215.60588328709088
+11
+18.995703347537056
+21
+-149.8709787447603
+31
+217.30223811236215
+12
+18.681439621836738
+22
+-150.79125732195578
+32
+216.03879449877687
+13
+18.681439621836738
+23
+-150.79125732195578
+33
+216.03879449877687
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.681439621836738
+20
+-150.79125732195578
+30
+216.03879449877687
+11
+18.995703347537056
+21
+-149.8709787447603
+31
+217.30223811236215
+12
+19.061720025636742
+22
+-151.44047202732375
+32
+217.79143082381006
+13
+19.061720025636742
+23
+-151.44047202732375
+33
+217.79143082381006
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.681439621836738
+20
+-150.79125732195578
+30
+216.03879449877687
+11
+19.061720025636742
+21
+-151.44047202732375
+31
+217.79143082381006
+12
+17.5792348994628
+22
+-152.83351520252333
+32
+216.08321124994015
+13
+17.5792348994628
+23
+-152.83351520252333
+33
+216.08321124994015
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.5792348994628
+20
+-152.83351520252333
+30
+216.08321124994015
+11
+19.061720025636742
+21
+-151.44047202732375
+31
+217.79143082381006
+12
+18.37569417718152
+22
+-153.397242873117
+32
+218.25111377592307
+13
+18.37569417718152
+23
+-153.397242873117
+33
+218.25111377592307
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.37569417718152
+20
+-153.397242873117
+30
+218.25111377592307
+11
+18.925123304591775
+21
+-153.98135357335454
+31
+220.54101025544492
+12
+18.15208929974714
+22
+-155.31902792176135
+32
+220.19814944337824
+13
+18.15208929974714
+23
+-155.31902792176135
+33
+220.19814944337824
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.205343206446663
+20
+-155.2487521031385
+30
+218.35272469981794
+11
+18.37569417718152
+21
+-153.397242873117
+31
+218.25111377592307
+12
+18.15208929974714
+22
+-155.31902792176135
+32
+220.19814944337824
+13
+18.15208929974714
+23
+-155.31902792176135
+33
+220.19814944337824
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.37569417718152
+20
+-153.397242873117
+30
+218.25111377592307
+11
+17.205343206446663
+21
+-155.2487521031385
+31
+218.35272469981794
+12
+17.5792348994628
+22
+-152.83351520252333
+32
+216.08321124994015
+13
+17.5792348994628
+23
+-152.83351520252333
+33
+216.08321124994015
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.15208929974714
+20
+-155.31902792176135
+30
+220.19814944337824
+11
+15.434757646353864
+21
+-155.75984896584563
+31
+217.7731773644266
+12
+17.205343206446663
+22
+-155.2487521031385
+32
+218.35272469981794
+13
+17.205343206446663
+23
+-155.2487521031385
+33
+218.35272469981794
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.15208929974714
+20
+-155.31902792176135
+30
+220.19814944337824
+11
+16.418010658419142
+21
+-156.51432528698538
+31
+219.76919314789177
+12
+15.434757646353864
+22
+-155.75984896584563
+32
+217.7731773644266
+13
+15.434757646353864
+23
+-155.75984896584563
+33
+217.7731773644266
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+16.418010658419142
+20
+-156.51432528698538
+30
+219.76919314789177
+11
+15.203851385166496
+21
+-156.58764334883782
+31
+219.57023044062367
+12
+15.434757646353864
+22
+-155.75984896584563
+32
+217.7731773644266
+13
+15.434757646353864
+23
+-155.75984896584563
+33
+217.7731773644266
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+15.434757646353864
+20
+-155.75984896584563
+30
+217.7731773644266
+11
+15.203851385166496
+21
+-156.58764334883782
+31
+219.57023044062367
+12
+14.349893710393228
+22
+-155.73642369297156
+32
+217.7065522376808
+13
+14.349893710393228
+23
+-155.73642369297156
+33
+217.7065522376808
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+15.203851385166496
+20
+-156.58764334883782
+30
+219.57023044062367
+11
+13.204489134147634
+21
+-154.7032778919275
+31
+217.49268253858392
+12
+14.349893710393228
+22
+-155.73642369297156
+32
+217.7065522376808
+13
+14.349893710393228
+23
+-155.73642369297156
+33
+217.7065522376808
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+15.203851385166496
+20
+-156.58764334883782
+30
+219.57023044062367
+11
+13.513885270679317
+21
+-154.9068039640418
+31
+219.599740199959
+12
+13.204489134147634
+22
+-154.7032778919275
+32
+217.49268253858392
+13
+13.204489134147634
+23
+-154.7032778919275
+33
+217.49268253858392
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+15.202026039228267
+20
+-148.35472471872882
+30
+217.43548836585404
+11
+13.086450096808102
+21
+-149.7714973911262
+31
+217.5246260925044
+12
+12.752716014433213
+22
+-149.25735828518904
+32
+219.5553234487965
+13
+12.752716014433213
+23
+-149.25735828518904
+33
+219.5553234487965
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+15.202026039228267
+20
+-148.35472471872882
+30
+217.43548836585404
+11
+12.752716014433213
+21
+-149.25735828518904
+31
+219.5553234487965
+12
+14.871029975760745
+22
+-147.84271518305295
+32
+219.29825389582783
+13
+14.871029975760745
+23
+-147.84271518305295
+33
+219.29825389582783
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.995703347537056
+20
+-149.8709787447603
+30
+217.30223811236215
+11
+17.502570370056752
+21
+-146.61973340443174
+31
+217.5252345411513
+12
+17.09825624473659
+22
+-146.67388533393344
+32
+219.58209518922473
+13
+17.09825624473659
+23
+-146.67388533393344
+33
+219.58209518922473
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.995703347537056
+20
+-149.8709787447603
+30
+217.30223811236215
+11
+17.09825624473659
+21
+-146.67388533393344
+31
+219.58209518922473
+12
+18.92421063162266
+22
+-150.33917997791912
+32
+218.9344016054717
+13
+18.92421063162266
+23
+-150.33917997791912
+33
+218.9344016054717
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.995703347537056
+20
+-149.8709787447603
+30
+217.30223811236215
+11
+18.92421063162266
+21
+-150.33917997791912
+31
+218.9344016054717
+12
+19.061720025636742
+22
+-151.44047202732375
+32
+217.79143082381006
+13
+19.061720025636742
+23
+-151.44047202732375
+33
+217.79143082381006
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.061720025636742
+20
+-151.44047202732375
+30
+217.79143082381006
+11
+18.92421063162266
+21
+-150.33917997791912
+31
+218.9344016054717
+12
+19.10978746867707
+22
+-152.5441978713132
+32
+219.63533444575523
+13
+19.10978746867707
+23
+-152.5441978713132
+33
+219.63533444575523
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.061720025636742
+20
+-151.44047202732375
+30
+217.79143082381006
+11
+19.10978746867707
+21
+-152.5441978713132
+31
+219.63533444575523
+12
+18.37569417718152
+22
+-153.397242873117
+32
+218.25111377592307
+13
+18.37569417718152
+23
+-153.397242873117
+33
+218.25111377592307
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.37569417718152
+20
+-153.397242873117
+30
+218.25111377592307
+11
+19.10978746867707
+21
+-152.5441978713132
+31
+219.63533444575523
+12
+18.925123304591775
+22
+-153.98135357335454
+32
+220.54101025544492
+13
+18.925123304591775
+23
+-153.98135357335454
+33
+220.54101025544492
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.925123304591775
+20
+-153.98135357335454
+30
+220.54101025544492
+11
+19.17337035219242
+21
+-153.96583813287978
+31
+221.9821208736854
+12
+18.379649093381072
+22
+-155.42246419159528
+32
+222.1838215998606
+13
+18.379649093381072
+23
+-155.42246419159528
+33
+222.1838215998606
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.15208929974714
+20
+-155.31902792176135
+30
+220.19814944337824
+11
+18.925123304591775
+21
+-153.98135357335454
+31
+220.54101025544492
+12
+18.379649093381072
+22
+-155.42246419159528
+32
+222.1838215998606
+13
+18.379649093381072
+23
+-155.42246419159528
+33
+222.1838215998606
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.330320802546012
+20
+-140.95781452833523
+30
+220.60489736328674
+11
+20.40395773888922
+21
+-141.17381379769338
+31
+220.25473516746757
+12
+20.019722418889696
+22
+-141.052428292801
+32
+222.5461527686046
+13
+20.019722418889696
+23
+-141.052428292801
+33
+222.5461527686046
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.330320802546012
+20
+-140.95781452833523
+30
+220.60489736328674
+11
+20.019722418889696
+21
+-141.052428292801
+31
+222.5461527686046
+12
+21.049825976703136
+22
+-141.3034133593091
+32
+222.66297490865222
+13
+21.049825976703136
+23
+-141.3034133593091
+33
+222.66297490865222
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.77173564510953
+20
+-142.31891414961655
+30
+222.54280630105117
+11
+21.049825976703136
+21
+-141.3034133593091
+31
+222.66297490865222
+12
+20.821961958746154
+22
+-141.51059012329955
+32
+223.67147853952974
+13
+20.821961958746154
+23
+-141.51059012329955
+33
+223.67147853952974
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.77173564510953
+20
+-142.31891414961655
+30
+222.54280630105117
+11
+20.821961958746154
+21
+-141.51059012329955
+31
+223.67147853952974
+12
+22.4793760706681
+22
+-142.26232842553145
+32
+223.79955697952937
+13
+22.4793760706681
+23
+-142.26232842553145
+33
+223.79955697952937
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.049825976703136
+20
+-141.3034133593091
+30
+222.66297490865222
+11
+20.019722418889696
+21
+-141.052428292801
+31
+222.5461527686046
+12
+19.64491805290444
+22
+-141.33018509973684
+32
+223.78039084717784
+13
+19.64491805290444
+23
+-141.33018509973684
+33
+223.78039084717784
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.049825976703136
+20
+-141.3034133593091
+30
+222.66297490865222
+11
+19.64491805290444
+21
+-141.33018509973684
+31
+223.78039084717784
+12
+20.821961958746154
+22
+-141.51059012329955
+32
+223.67147853952974
+13
+20.821961958746154
+23
+-141.51059012329955
+33
+223.67147853952974
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.347023839978174
+20
+-146.12597732813614
+30
+211.00783686866544
+11
+24.263955949620733
+21
+-144.25834420899383
+31
+211.9637096916576
+12
+25.064674367861997
+22
+-144.8153789444805
+32
+213.6561096007291
+13
+25.064674367861997
+23
+-144.8153789444805
+33
+213.6561096007291
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.347023839978174
+20
+-146.12597732813614
+30
+211.00783686866544
+11
+25.064674367861997
+21
+-144.8153789444805
+31
+213.6561096007291
+12
+24.47721720007176
+22
+-146.97902232994102
+32
+213.20464070533714
+13
+24.47721720007176
+23
+-146.97902232994102
+33
+213.20464070533714
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.263955949620733
+20
+-144.25834420899383
+30
+211.9637096916576
+11
+24.977970435795612
+21
+-142.3216521685214
+31
+212.9986808386403
+12
+25.708413035414658
+22
+-142.67820307512477
+32
+214.14347696623975
+13
+25.708413035414658
+23
+-142.67820307512477
+33
+214.14347696623975
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.263955949620733
+20
+-144.25834420899383
+30
+211.9637096916576
+11
+25.708413035414658
+21
+-142.67820307512477
+31
+214.14347696623975
+12
+25.064674367861997
+22
+-144.8153789444805
+32
+213.6561096007291
+13
+25.064674367861997
+23
+-144.8153789444805
+33
+213.6561096007291
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.47721720007176
+20
+-146.97902232994102
+30
+213.20464070533714
+11
+25.064674367861997
+21
+-144.8153789444805
+31
+213.6561096007291
+12
+26.124287685010323
+22
+-146.4508889051445
+32
+216.87054379796928
+13
+26.124287685010323
+23
+-146.4508889051445
+33
+216.87054379796928
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.47721720007176
+20
+-146.97902232994102
+30
+213.20464070533714
+11
+26.124287685010323
+21
+-146.4508889051445
+31
+216.87054379796928
+12
+25.536830517220082
+22
+-148.53330439635315
+32
+216.8744987141683
+13
+25.536830517220082
+23
+-148.53330439635315
+33
+216.8744987141683
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.064674367861997
+20
+-144.8153789444805
+30
+213.6561096007291
+11
+25.708413035414658
+21
+-142.67820307512477
+31
+214.14347696623975
+12
+26.548984839974157
+22
+-144.31614683037267
+32
+216.86902267635466
+13
+26.548984839974157
+23
+-144.31614683037267
+33
+216.86902267635466
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.064674367861997
+20
+-144.8153789444805
+30
+213.6561096007291
+11
+26.548984839974157
+21
+-144.31614683037267
+31
+216.86902267635466
+12
+26.124287685010323
+22
+-146.4508889051445
+32
+216.87054379796928
+13
+26.124287685010323
+23
+-146.4508889051445
+33
+216.87054379796928
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.124287685010323
+20
+-146.4508889051445
+30
+216.87054379796928
+11
+26.713265974415762
+21
+-147.9571035285161
+31
+219.4476280384408
+12
+25.536830517220082
+22
+-148.53330439635315
+32
+216.8744987141683
+13
+25.536830517220082
+23
+-148.53330439635315
+33
+216.8744987141683
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.536830517220082
+20
+-148.53330439635315
+30
+216.8744987141683
+11
+26.713265974415762
+21
+-147.9571035285161
+31
+219.4476280384408
+12
+26.346979889475584
+22
+-149.6659315510318
+32
+219.77253961544704
+13
+26.346979889475584
+23
+-149.6659315510318
+33
+219.77253961544704
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.548984839974157
+20
+-144.31614683037267
+30
+216.86902267635466
+11
+26.753727809380084
+21
+-146.16978563065592
+31
+219.1020292074678
+12
+26.124287685010323
+22
+-146.4508889051445
+32
+216.87054379796928
+13
+26.124287685010323
+23
+-146.4508889051445
+33
+216.87054379796928
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.124287685010323
+20
+-146.4508889051445
+30
+216.87054379796928
+11
+26.753727809380084
+21
+-146.16978563065592
+31
+219.1020292074678
+12
+26.713265974415762
+22
+-147.9571035285161
+32
+219.4476280384408
+13
+26.713265974415762
+23
+-147.9571035285161
+33
+219.4476280384408
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.713265974415762
+20
+-147.9571035285161
+30
+219.4476280384408
+11
+26.941129992372737
+21
+-148.47793556956097
+31
+221.14611243397295
+12
+26.346979889475584
+22
+-149.6659315510318
+32
+219.77253961544704
+13
+26.346979889475584
+23
+-149.6659315510318
+33
+219.77253961544704
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.346979889475584
+20
+-149.6659315510318
+30
+219.77253961544704
+11
+26.941129992372737
+21
+-148.47793556956097
+31
+221.14611243397295
+12
+26.55081018591241
+22
+-150.0599020493692
+32
+221.55711949439961
+13
+26.55081018591241
+23
+-150.0599020493692
+33
+221.55711949439961
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.753727809380084
+20
+-146.16978563065592
+30
+219.1020292074678
+11
+26.998932613750327
+21
+-146.82508482248468
+31
+220.7074209601493
+12
+26.713265974415762
+22
+-147.9571035285161
+32
+219.4476280384408
+13
+26.713265974415762
+23
+-147.9571035285161
+33
+219.4476280384408
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.713265974415762
+20
+-147.9571035285161
+30
+219.4476280384408
+11
+26.998932613750327
+21
+-146.82508482248468
+31
+220.7074209601493
+12
+26.941129992372737
+22
+-148.47793556956097
+32
+221.14611243397295
+13
+26.941129992372737
+23
+-148.47793556956097
+33
+221.14611243397295
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.941129992372737
+20
+-148.47793556956097
+30
+221.14611243397295
+11
+26.86659503322792
+21
+-148.2053505761176
+31
+222.85068131596609
+12
+26.55081018591241
+22
+-150.0599020493692
+32
+221.55711949439961
+13
+26.55081018591241
+23
+-150.0599020493692
+33
+221.55711949439961
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.55081018591241
+20
+-150.0599020493692
+30
+221.55711949439961
+11
+26.86659503322792
+21
+-148.2053505761176
+31
+222.85068131596609
+12
+26.685885785342162
+22
+-149.35014670371714
+32
+222.853723559196
+13
+26.685885785342162
+23
+-149.35014670371714
+33
+222.853723559196
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.998932613750327
+20
+-146.82508482248468
+30
+220.7074209601493
+11
+26.861727444059294
+21
+-147.09097688082207
+31
+222.85037709164337
+12
+26.941129992372737
+22
+-148.47793556956097
+32
+221.14611243397295
+13
+26.941129992372737
+23
+-148.47793556956097
+33
+221.14611243397295
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.941129992372737
+20
+-148.47793556956097
+30
+221.14611243397295
+11
+26.861727444059294
+21
+-147.09097688082207
+31
+222.85037709164337
+12
+26.86659503322792
+22
+-148.2053505761176
+32
+222.85068131596609
+13
+26.86659503322792
+23
+-148.2053505761176
+33
+222.85068131596609
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.86659503322792
+20
+-148.2053505761176
+30
+222.85068131596609
+11
+26.72269692843
+21
+-148.176753489752
+31
+223.6687405206207
+12
+26.685885785342162
+22
+-149.35014670371714
+32
+222.853723559196
+13
+26.685885785342162
+23
+-149.35014670371714
+33
+222.853723559196
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.685885785342162
+20
+-149.35014670371714
+30
+222.853723559196
+11
+26.72269692843
+21
+-148.176753489752
+31
+223.6687405206207
+12
+26.459542889000403
+22
+-149.40003949269592
+32
+223.72319667444424
+13
+26.459542889000403
+23
+-149.40003949269592
+33
+223.72319667444424
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.861727444059294
+20
+-147.09097688082207
+30
+222.85037709164337
+11
+26.609829704582165
+21
+-146.90448737079888
+31
+223.6580926693146
+12
+26.86659503322792
+22
+-148.2053505761176
+32
+222.85068131596609
+13
+26.86659503322792
+23
+-148.2053505761176
+33
+222.85068131596609
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.86659503322792
+20
+-148.2053505761176
+30
+222.85068131596609
+11
+26.609829704582165
+21
+-146.90448737079888
+31
+223.6580926693146
+12
+26.72269692843
+22
+-148.176753489752
+32
+223.6687405206207
+13
+26.72269692843
+23
+-148.176753489752
+33
+223.6687405206207
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.566428177560095
+20
+-148.11043258732604
+30
+210.85937539902156
+11
+19.71123895532712
+21
+-148.55034095844192
+31
+211.12678857897325
+12
+19.79946400900875
+22
+-149.07512791568647
+32
+213.12402125973097
+13
+19.79946400900875
+23
+-149.07512791568647
+33
+213.12402125973097
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.79946400900875
+20
+-149.07512791568647
+30
+213.12402125973097
+11
+18.802520902406656
+21
+-148.2333392138348
+31
+213.33789095882838
+12
+19.566428177560095
+22
+-148.11043258732604
+32
+210.85937539902156
+13
+19.566428177560095
+23
+-148.11043258732604
+33
+210.85937539902156
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.233012969675784
+20
+-146.74598649849284
+30
+215.69289144348141
+11
+18.5259809927633
+21
+-148.20535057611593
+31
+215.76620950533334
+12
+18.635501749057703
+22
+-147.95345283663926
+32
+218.19118158428554
+13
+18.635501749057703
+23
+-147.95345283663926
+33
+218.19118158428554
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.233012969675784
+20
+-146.74598649849284
+30
+215.69289144348141
+11
+18.635501749057703
+21
+-147.95345283663926
+31
+218.19118158428554
+12
+17.86611843608954
+22
+-146.94464498143856
+32
+217.99465267160178
+13
+17.86611843608954
+23
+-146.94464498143856
+33
+217.99465267160178
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.468090470380563
+20
+-140.5054329599735
+30
+216.25783601136794
+11
+24.07046928016729
+21
+-141.39468065621998
+31
+218.50727065592574
+12
+26.304084259926977
+22
+-142.60366811598058
+32
+216.3679652163082
+13
+26.304084259926977
+23
+-142.60366811598058
+33
+216.3679652163082
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.304084259926977
+20
+-142.60366811598058
+30
+216.3679652163082
+11
+24.07046928016729
+21
+-141.39468065621998
+31
+218.50727065592574
+12
+26.346979889475584
+22
+-143.95868325080107
+32
+218.41691603198194
+13
+26.346979889475584
+23
+-143.95868325080107
+33
+218.41691603198194
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.304084259926977
+20
+-142.60366811598058
+30
+216.3679652163082
+11
+26.346979889475584
+21
+-143.95868325080107
+31
+218.41691603198194
+12
+26.548984839974157
+22
+-144.31614683037267
+32
+216.86902267635466
+13
+26.548984839974157
+23
+-144.31614683037267
+33
+216.86902267635466
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.548984839974157
+20
+-144.31614683037267
+30
+216.86902267635466
+11
+26.346979889475584
+21
+-143.95868325080107
+31
+218.41691603198194
+12
+26.753727809380084
+22
+-146.16978563065592
+32
+219.1020292074678
+13
+26.753727809380084
+23
+-146.16978563065592
+33
+219.1020292074678
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.55081018591241
+20
+-150.0599020493692
+30
+221.55711949439961
+11
+24.079900234181526
+21
+-151.4270861571101
+31
+218.68889257677782
+12
+26.346979889475584
+22
+-149.6659315510318
+32
+219.77253961544704
+13
+26.346979889475584
+23
+-149.6659315510318
+33
+219.77253961544704
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.079900234181526
+20
+-151.4270861571101
+30
+218.68889257677782
+11
+26.55081018591241
+21
+-150.0599020493692
+31
+221.55711949439961
+12
+25.35094945584265
+22
+-151.2281234498424
+32
+220.43209794779736
+13
+25.35094945584265
+23
+-151.2281234498424
+33
+220.43209794779736
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.35094945584265
+20
+-151.2281234498424
+30
+220.43209794779736
+11
+22.45199588159451
+21
+-151.1322927880841
+31
+217.87813475587657
+12
+24.079900234181526
+22
+-151.4270861571101
+32
+218.68889257677782
+13
+24.079900234181526
+23
+-151.4270861571101
+33
+218.68889257677782
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.35094945584265
+20
+-151.2281234498424
+30
+220.43209794779736
+11
+23.23598196206857
+21
+-151.3467709358279
+31
+220.16012140299955
+12
+22.45199588159451
+22
+-151.1322927880841
+32
+217.87813475587657
+13
+22.45199588159451
+23
+-151.1322927880841
+33
+217.87813475587657
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.86611843608954
+20
+-146.94464498143856
+30
+217.99465267160178
+11
+18.635501749057703
+21
+-147.95345283663926
+31
+218.19118158428554
+12
+18.89439664796474
+22
+-147.9561908555471
+32
+220.035085206231
+13
+18.89439664796474
+23
+-147.9561908555471
+33
+220.035085206231
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.86611843608954
+20
+-146.94464498143856
+30
+217.99465267160178
+11
+18.89439664796474
+21
+-147.9561908555471
+31
+220.035085206231
+12
+17.714310498892598
+22
+-146.3091203706085
+32
+219.78166634513877
+13
+17.714310498892598
+23
+-146.3091203706085
+33
+219.78166634513877
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.346979889475584
+20
+-143.95868325080107
+30
+218.41691603198194
+11
+24.07046928016729
+21
+-141.39468065621998
+31
+218.50727065592574
+12
+23.468105120548092
+22
+-142.10656557213414
+32
+220.58999037145747
+13
+23.468105120548092
+23
+-142.10656557213414
+33
+220.58999037145747
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.346979889475584
+20
+-143.95868325080107
+30
+218.41691603198194
+11
+23.468105120548092
+21
+-142.10656557213414
+31
+220.58999037145747
+12
+26.431554251280712
+22
+-145.33834055578816
+32
+220.85344863520928
+13
+26.431554251280712
+23
+-145.33834055578816
+33
+220.85344863520928
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.346979889475584
+20
+-143.95868325080107
+30
+218.41691603198194
+11
+26.431554251280712
+21
+-145.33834055578816
+31
+220.85344863520928
+12
+26.753727809380084
+22
+-146.16978563065592
+32
+219.1020292074678
+13
+26.753727809380084
+23
+-146.16978563065592
+33
+219.1020292074678
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.753727809380084
+20
+-146.16978563065592
+30
+219.1020292074678
+11
+26.431554251280712
+21
+-145.33834055578816
+31
+220.85344863520928
+12
+26.998932613750327
+22
+-146.82508482248468
+32
+220.7074209601493
+13
+26.998932613750327
+23
+-146.82508482248468
+33
+220.7074209601493
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.685885785342162
+20
+-149.35014670371714
+30
+222.853723559196
+11
+25.35094945584265
+21
+-151.2281234498424
+31
+220.43209794779736
+12
+26.55081018591241
+22
+-150.0599020493692
+32
+221.55711949439961
+13
+26.55081018591241
+23
+-150.0599020493692
+33
+221.55711949439961
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.35094945584265
+20
+-151.2281234498424
+30
+220.43209794779736
+11
+26.685885785342162
+21
+-149.35014670371714
+31
+222.853723559196
+12
+25.135254410807292
+22
+-151.31604427920152
+32
+222.51268809306785
+13
+25.135254410807292
+23
+-151.31604427920152
+33
+222.51268809306785
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.35094945584265
+20
+-151.2281234498424
+30
+220.43209794779736
+11
+25.135254410807292
+21
+-151.31604427920152
+31
+222.51268809306785
+12
+23.23598196206857
+22
+-151.3467709358279
+32
+220.16012140299955
+13
+23.23598196206857
+23
+-151.3467709358279
+33
+220.16012140299955
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.135254410807292
+20
+-151.31604427920152
+30
+222.51268809306785
+11
+23.033368562923933
+21
+-151.28988098742
+31
+222.1028979299329
+12
+23.23598196206857
+22
+-151.3467709358279
+32
+220.16012140299955
+13
+23.23598196206857
+23
+-151.3467709358279
+33
+220.16012140299955
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.714310498892598
+20
+-146.3091203706085
+30
+219.78166634513877
+11
+18.89439664796474
+21
+-147.9561908555471
+31
+220.035085206231
+12
+18.948548577465857
+22
+-147.7852167859991
+32
+222.02592917620478
+13
+18.948548577465857
+23
+-147.7852167859991
+33
+222.02592917620478
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.47721720007176
+20
+-146.97902232994102
+30
+213.20464070533714
+11
+21.125882057463134
+21
+-147.88074322343087
+31
+210.93999484462725
+12
+23.347023839978174
+22
+-146.12597732813614
+32
+211.00783686866544
+13
+23.347023839978174
+23
+-146.12597732813614
+33
+211.00783686866544
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.417068685114987
+20
+-141.42084394800244
+30
+222.3581421369661
+11
+17.445376197325213
+21
+-142.6785072994499
+31
+222.90118255359218
+12
+18.27469170193226
+22
+-141.84371575702835
+32
+223.4764707484607
+13
+18.27469170193226
+23
+-141.84371575702835
+33
+223.4764707484607
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.714310498892598
+20
+-146.3091203706085
+30
+219.78166634513877
+11
+18.948548577465857
+21
+-147.7852167859991
+31
+222.02592917620478
+12
+17.660767018037543
+22
+-145.96869335312724
+32
+221.85160863910332
+13
+17.660767018037543
+23
+-145.96869335312724
+33
+221.85160863910332
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.468105120548092
+20
+-142.10656557213414
+30
+220.58999037145747
+11
+22.77173564510953
+21
+-142.31891414961655
+31
+222.54280630105117
+12
+26.431554251280712
+22
+-145.33834055578816
+32
+220.85344863520928
+13
+26.431554251280712
+23
+-145.33834055578816
+33
+220.85344863520928
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.431554251280712
+20
+-145.33834055578816
+30
+220.85344863520928
+11
+22.77173564510953
+21
+-142.31891414961655
+31
+222.54280630105117
+12
+25.775342386483434
+22
+-145.32495468557502
+32
+222.82664759444643
+13
+25.775342386483434
+23
+-145.32495468557502
+33
+222.82664759444643
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.998932613750327
+20
+-146.82508482248468
+30
+220.7074209601493
+11
+26.431554251280712
+21
+-145.33834055578816
+31
+220.85344863520928
+12
+25.775342386483434
+22
+-145.32495468557502
+32
+222.82664759444643
+13
+25.775342386483434
+23
+-145.32495468557502
+33
+222.82664759444643
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.998932613750327
+20
+-146.82508482248468
+30
+220.7074209601493
+11
+25.775342386483434
+21
+-145.32495468557502
+31
+222.82664759444643
+12
+26.861727444059294
+22
+-147.09097688082207
+32
+222.85037709164337
+13
+26.861727444059294
+23
+-147.09097688082207
+33
+222.85037709164337
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.135254410807292
+20
+-151.31604427920152
+30
+222.51268809306785
+11
+26.685885785342162
+21
+-149.35014670371714
+31
+222.853723559196
+12
+26.459542889000403
+22
+-149.40003949269592
+32
+223.72319667444424
+13
+26.459542889000403
+23
+-149.40003949269592
+33
+223.72319667444424
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.135254410807292
+20
+-151.31604427920152
+30
+222.51268809306785
+11
+26.459542889000403
+21
+-149.40003949269592
+31
+223.72319667444424
+12
+24.85749760387176
+22
+-151.35133430067438
+32
+223.3651246462256
+13
+24.85749760387176
+23
+-151.35133430067438
+33
+223.3651246462256
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.135254410807292
+20
+-151.31604427920152
+30
+222.51268809306785
+11
+24.85749760387176
+21
+-151.35133430067438
+31
+223.3651246462256
+12
+23.033368562923933
+22
+-151.28988098742
+32
+222.1028979299329
+13
+23.033368562923933
+23
+-151.28988098742
+33
+222.1028979299329
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.98689549233642
+20
+-142.81175755294063
+30
+219.6268161647126
+11
+17.421950924451146
+21
+-142.44090810315546
+31
+222.10472327587348
+12
+18.867624907537213
+22
+-141.6651360794029
+32
+219.93469117962943
+13
+18.867624907537213
+23
+-141.6651360794029
+33
+219.93469117962943
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.867624907537213
+20
+-141.6651360794029
+30
+219.93469117962943
+11
+17.421950924451146
+21
+-142.44090810315546
+31
+222.10472327587348
+12
+18.417068685114987
+22
+-141.42084394800244
+32
+222.3581421369661
+13
+18.417068685114987
+23
+-141.42084394800244
+33
+222.3581421369661
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+20.019722418889696
+20
+-141.052428292801
+30
+222.5461527686046
+11
+18.417068685114987
+21
+-141.42084394800244
+31
+222.3581421369661
+12
+18.27469170193226
+22
+-141.84371575702835
+32
+223.4764707484607
+13
+18.27469170193226
+23
+-141.84371575702835
+33
+223.4764707484607
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.85749760387176
+20
+-151.35133430067438
+30
+223.3651246462256
+11
+22.80550454496696
+21
+-151.29170633335838
+31
+222.96263586684407
+12
+23.033368562923933
+22
+-151.28988098742
+32
+222.1028979299329
+13
+23.033368562923933
+23
+-151.28988098742
+33
+222.1028979299329
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+20.019722418889696
+20
+-141.052428292801
+30
+222.5461527686046
+11
+18.27469170193226
+21
+-141.84371575702835
+31
+223.4764707484607
+12
+19.64491805290444
+22
+-141.33018509973684
+32
+223.78039084717784
+13
+19.64491805290444
+23
+-141.33018509973684
+33
+223.78039084717784
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.421950924451146
+20
+-142.44090810315546
+30
+222.10472327587348
+11
+17.445376197325213
+21
+-142.6785072994499
+31
+222.90118255359218
+12
+18.417068685114987
+22
+-141.42084394800244
+32
+222.3581421369661
+13
+18.417068685114987
+23
+-141.42084394800244
+33
+222.3581421369661
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.660767018037543
+20
+-145.96869335312724
+30
+221.85160863910332
+11
+18.948548577465857
+21
+-147.7852167859991
+31
+222.02592917620478
+12
+18.7435013837369
+22
+-147.6197187542656
+32
+222.6687551707884
+13
+18.7435013837369
+23
+-147.6197187542656
+33
+222.6687551707884
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.660767018037543
+20
+-145.96869335312724
+30
+221.85160863910332
+11
+18.7435013837369
+21
+-147.6197187542656
+31
+222.6687551707884
+12
+17.57801800217067
+22
+-145.8984175345052
+32
+222.64198343036128
+13
+17.57801800217067
+23
+-145.8984175345052
+33
+222.64198343036128
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.775342386483434
+20
+-145.32495468557502
+30
+222.82664759444643
+11
+22.77173564510953
+21
+-142.31891414961655
+31
+222.54280630105117
+12
+22.4793760706681
+22
+-142.26232842553145
+32
+223.79955697952937
+13
+22.4793760706681
+23
+-142.26232842553145
+33
+223.79955697952937
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.775342386483434
+20
+-145.32495468557502
+30
+222.82664759444643
+11
+22.4793760706681
+21
+-142.26232842553145
+31
+223.79955697952937
+12
+25.167502189049532
+22
+-144.79712548510065
+32
+223.59420556147657
+13
+25.167502189049532
+23
+-144.79712548510065
+33
+223.59420556147657
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.775342386483434
+20
+-145.32495468557502
+30
+222.82664759444643
+11
+25.167502189049532
+21
+-144.79712548510065
+31
+223.59420556147657
+12
+26.861727444059294
+22
+-147.09097688082207
+32
+222.85037709164337
+13
+26.861727444059294
+23
+-147.09097688082207
+33
+222.85037709164337
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.861727444059294
+20
+-147.09097688082207
+30
+222.85037709164337
+11
+25.167502189049532
+21
+-144.79712548510065
+31
+223.59420556147657
+12
+26.609829704582165
+22
+-146.90448737079888
+32
+223.6580926693146
+13
+26.609829704582165
+23
+-146.90448737079888
+33
+223.6580926693146
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.670414295369692
+20
+-142.24985522828374
+30
+212.03063904272673
+11
+22.64669944834009
+21
+-143.33776140747472
+31
+211.66739520101697
+12
+22.763825812710497
+22
+-142.48836709754764
+32
+214.13495868519462
+13
+22.763825812710497
+23
+-142.48836709754764
+33
+214.13495868519462
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.670414295369692
+20
+-142.24985522828374
+30
+212.03063904272673
+11
+22.763825812710497
+21
+-142.48836709754764
+31
+214.13495868519462
+12
+23.69718603579722
+22
+-140.93256390952112
+32
+214.10940384205966
+13
+23.69718603579722
+23
+-140.93256390952112
+33
+214.10940384205966
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.64669944834009
+20
+-143.33776140747472
+30
+211.66739520101697
+11
+21.707254738792567
+21
+-144.20784297136902
+31
+211.351610353701
+12
+21.3780840212633
+22
+-143.74542200034884
+32
+213.8021372757886
+13
+21.3780840212633
+23
+-143.74542200034884
+33
+213.8021372757886
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.763825812710497
+20
+-142.48836709754764
+30
+214.13495868519462
+11
+22.64669944834009
+21
+-143.33776140747472
+31
+211.66739520101697
+12
+21.3780840212633
+22
+-143.74542200034884
+32
+213.8021372757886
+13
+21.3780840212633
+23
+-143.74542200034884
+33
+213.8021372757886
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.69718603579722
+20
+-140.93256390952112
+30
+214.10940384205966
+11
+22.763825812710497
+21
+-142.48836709754764
+31
+214.13495868519462
+12
+21.454140102023295
+22
+-142.06123614800035
+32
+216.85989594666387
+13
+21.454140102023295
+23
+-142.06123614800035
+33
+216.85989594666387
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.69718603579722
+20
+-140.93256390952112
+30
+214.10940384205966
+11
+21.454140102023295
+21
+-142.06123614800035
+31
+216.85989594666387
+12
+22.899509860786324
+22
+-140.31012094458205
+32
+216.62107985307796
+13
+22.899509860786324
+23
+-140.31012094458205
+33
+216.62107985307796
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.763825812710497
+20
+-142.48836709754764
+30
+214.13495868519462
+11
+21.3780840212633
+21
+-143.74542200034884
+31
+213.8021372757886
+12
+20.002685856799456
+22
+-143.06761020861651
+32
+216.64511357459756
+13
+20.002685856799456
+23
+-143.06761020861651
+33
+216.64511357459756
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.763825812710497
+20
+-142.48836709754764
+30
+214.13495868519462
+11
+20.002685856799456
+21
+-143.06761020861651
+31
+216.64511357459756
+12
+21.454140102023295
+22
+-142.06123614800035
+32
+216.85989594666387
+13
+21.454140102023295
+23
+-142.06123614800035
+33
+216.85989594666387
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.899509860786324
+20
+-140.31012094458205
+30
+216.62107985307796
+11
+21.454140102023295
+21
+-142.06123614800035
+31
+216.85989594666387
+12
+20.788193058888744
+22
+-141.78013287351158
+32
+218.26389119749373
+13
+20.788193058888744
+23
+-141.78013287351158
+33
+218.26389119749373
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.899509860786324
+20
+-140.31012094458205
+30
+216.62107985307796
+11
+20.788193058888744
+21
+-141.78013287351158
+31
+218.26389119749373
+12
+21.369565740218192
+22
+-140.8771950827291
+32
+218.75277968461918
+13
+21.369565740218192
+23
+-140.8771950827291
+33
+218.75277968461918
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.454140102023295
+20
+-142.06123614800035
+30
+216.85989594666387
+11
+20.002685856799456
+21
+-143.06761020861651
+31
+216.64511357459756
+12
+19.36929081623016
+22
+-142.6474764184985
+32
+217.79112659948936
+13
+19.36929081623016
+23
+-142.6474764184985
+33
+217.79112659948936
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.454140102023295
+20
+-142.06123614800035
+30
+216.85989594666387
+11
+19.36929081623016
+21
+-142.6474764184985
+31
+217.79112659948936
+12
+20.788193058888744
+22
+-141.78013287351158
+32
+218.26389119749373
+13
+20.788193058888744
+23
+-141.78013287351158
+33
+218.26389119749373
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.369565740218192
+20
+-140.8771950827291
+30
+218.75277968461918
+11
+20.788193058888744
+21
+-141.78013287351158
+31
+218.26389119749373
+12
+18.867624907537213
+22
+-141.6651360794029
+32
+219.93469117962943
+13
+18.867624907537213
+23
+-141.6651360794029
+33
+219.93469117962943
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.369565740218192
+20
+-140.8771950827291
+30
+218.75277968461918
+11
+18.867624907537213
+21
+-141.6651360794029
+31
+219.93469117962943
+12
+20.40395773888922
+22
+-141.17381379769338
+32
+220.25473516746757
+13
+20.40395773888922
+23
+-141.17381379769338
+33
+220.25473516746757
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+20.788193058888744
+20
+-141.78013287351158
+30
+218.26389119749373
+11
+19.36929081623016
+21
+-142.6474764184985
+31
+217.79112659948936
+12
+17.98689549233642
+22
+-142.81175755294063
+32
+219.6268161647126
+13
+17.98689549233642
+23
+-142.81175755294063
+33
+219.6268161647126
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.867624907537213
+20
+-141.6651360794029
+30
+219.93469117962943
+11
+20.788193058888744
+21
+-141.78013287351158
+31
+218.26389119749373
+12
+17.98689549233642
+22
+-142.81175755294063
+32
+219.6268161647126
+13
+17.98689549233642
+23
+-142.81175755294063
+33
+219.6268161647126
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+20.40395773888922
+20
+-141.17381379769338
+30
+220.25473516746757
+11
+18.867624907537213
+21
+-141.6651360794029
+31
+219.93469117962943
+12
+18.417068685114987
+22
+-141.42084394800244
+32
+222.3581421369661
+13
+18.417068685114987
+23
+-141.42084394800244
+33
+222.3581421369661
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+20.40395773888922
+20
+-141.17381379769338
+30
+220.25473516746757
+11
+18.417068685114987
+21
+-141.42084394800244
+31
+222.3581421369661
+12
+20.019722418889696
+22
+-141.052428292801
+32
+222.5461527686046
+13
+20.019722418889696
+23
+-141.052428292801
+33
+222.5461527686046
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.03952630022233
+20
+-145.94800609916157
+30
+225.6565422473646
+11
+19.179759062976263
+21
+-147.7633126347412
+31
+225.64346060147344
+12
+25.55265018201817
+22
+-147.7550985780193
+32
+226.4578691142515
+13
+25.55265018201817
+23
+-147.7550985780193
+33
+226.4578691142515
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.385110481028256
+20
+-142.60518923759824
+30
+226.14695185610594
+11
+18.27469170193226
+21
+-141.84371575702835
+31
+223.4764707484607
+12
+18.609642681599304
+22
+-142.79472099085208
+32
+226.16429264251914
+13
+18.609642681599304
+23
+-142.79472099085208
+33
+226.16429264251914
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.4793760706681
+20
+-142.26232842553145
+30
+223.79955697952937
+11
+20.821961958746154
+21
+-141.51059012329955
+31
+223.67147853952974
+12
+21.266737919030657
+22
+-143.16374509469964
+32
+226.36234267681817
+13
+21.266737919030657
+23
+-143.16374509469964
+33
+226.36234267681817
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.266737919030657
+20
+-143.16374509469964
+30
+226.36234267681817
+11
+20.821961958746154
+21
+-141.51059012329955
+31
+223.67147853952974
+12
+19.994167575754336
+22
+-142.5315669514225
+32
+226.27898521230532
+13
+19.994167575754336
+23
+-142.5315669514225
+33
+226.27898521230532
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.994167575754336
+20
+-142.5315669514225
+30
+226.27898521230532
+11
+19.64491805290444
+21
+-141.33018509973684
+31
+223.78039084717784
+12
+19.385110481028256
+22
+-142.60518923759824
+32
+226.14695185610594
+13
+19.385110481028256
+23
+-142.60518923759824
+33
+226.14695185610594
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+20.821961958746154
+20
+-141.51059012329955
+30
+223.67147853952974
+11
+19.64491805290444
+21
+-141.33018509973684
+31
+223.78039084717784
+12
+19.994167575754336
+22
+-142.5315669514225
+32
+226.27898521230532
+13
+19.994167575754336
+23
+-142.5315669514225
+33
+226.27898521230532
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.72269692843
+20
+-148.176753489752
+30
+223.6687405206207
+11
+25.056764535462978
+21
+-150.09762586542726
+31
+226.38363837942887
+12
+26.459542889000403
+22
+-149.40003949269592
+32
+223.72319667444424
+13
+26.459542889000403
+23
+-149.40003949269592
+33
+223.72319667444424
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.72269692843
+20
+-148.176753489752
+30
+223.6687405206207
+11
+25.521315076745058
+21
+-148.72344459825558
+31
+226.4043256333962
+12
+25.056764535462978
+22
+-150.09762586542726
+32
+226.38363837942887
+13
+25.056764535462978
+23
+-150.09762586542726
+33
+226.38363837942887
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.609829704582165
+20
+-146.90448737079888
+30
+223.6580926693146
+11
+25.55265018201817
+21
+-147.7550985780193
+31
+226.4578691142515
+12
+25.521315076745058
+22
+-148.72344459825558
+32
+226.4043256333962
+13
+25.521315076745058
+23
+-148.72344459825558
+33
+226.4043256333962
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.609829704582165
+20
+-146.90448737079888
+30
+223.6580926693146
+11
+25.521315076745058
+21
+-148.72344459825558
+31
+226.4043256333962
+12
+26.72269692843
+22
+-148.176753489752
+32
+223.6687405206207
+13
+26.72269692843
+23
+-148.176753489752
+33
+223.6687405206207
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.7435013837369
+20
+-147.6197187542656
+30
+222.6687551707884
+11
+20.260059634091288
+21
+-149.32702565516598
+31
+222.69856915444583
+12
+19.179759062976263
+22
+-147.7633126347412
+32
+225.64346060147344
+13
+19.179759062976263
+23
+-147.7633126347412
+33
+225.64346060147344
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+20.260059634091288
+20
+-149.32702565516598
+30
+222.69856915444583
+11
+20.752903037416097
+21
+-149.5126024922212
+31
+225.69304916612845
+12
+19.179759062976263
+22
+-147.7633126347412
+32
+225.64346060147344
+13
+19.179759062976263
+23
+-147.7633126347412
+33
+225.64346060147344
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.97161102534681
+20
+-150.73801806542636
+30
+226.03195506199444
+11
+20.752903037416097
+21
+-149.5126024922212
+31
+225.69304916612845
+12
+22.80550454496696
+22
+-151.29170633335838
+32
+222.96263586684407
+13
+22.80550454496696
+23
+-151.29170633335838
+33
+222.96263586684407
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.80550454496696
+20
+-151.29170633335838
+30
+222.96263586684407
+11
+20.752903037416097
+21
+-149.5126024922212
+31
+225.69304916612845
+12
+20.260059634091288
+22
+-149.32702565516598
+32
+222.69856915444583
+13
+20.260059634091288
+23
+-149.32702565516598
+33
+222.69856915444583
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.07817743941593
+20
+-144.170423379638
+30
+222.7289915867511
+11
+18.06173467580425
+21
+-143.51360306619551
+31
+225.81717268993037
+12
+17.445376197325213
+22
+-142.6785072994499
+32
+222.90118255359218
+13
+17.445376197325213
+23
+-142.6785072994499
+33
+222.90118255359218
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.07817743941593
+20
+-144.170423379638
+30
+222.7289915867511
+11
+17.73256395827498
+21
+-144.93341798182308
+31
+225.6690154446095
+12
+18.06173467580425
+22
+-143.51360306619551
+32
+225.81717268993037
+13
+18.06173467580425
+23
+-143.51360306619551
+33
+225.81717268993037
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.57801800217067
+20
+-145.8984175345052
+30
+222.64198343036128
+11
+18.03952630022233
+21
+-145.94800609916157
+31
+225.6565422473646
+12
+17.73256395827498
+22
+-144.93341798182308
+32
+225.6690154446095
+13
+17.73256395827498
+23
+-144.93341798182308
+33
+225.6690154446095
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.57801800217067
+20
+-145.8984175345052
+30
+222.64198343036128
+11
+17.73256395827498
+21
+-144.93341798182308
+31
+225.6690154446095
+12
+17.07817743941593
+22
+-144.170423379638
+32
+222.7289915867511
+13
+17.07817743941593
+23
+-144.170423379638
+33
+222.7289915867511
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.64491805290444
+20
+-141.33018509973684
+30
+223.78039084717784
+11
+18.27469170193226
+21
+-141.84371575702835
+31
+223.4764707484607
+12
+19.385110481028256
+22
+-142.60518923759824
+32
+226.14695185610594
+13
+19.385110481028256
+23
+-142.60518923759824
+33
+226.14695185610594
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.445376197325213
+20
+-142.6785072994499
+30
+222.90118255359218
+11
+18.06173467580425
+21
+-143.51360306619551
+31
+225.81717268993037
+12
+18.609642681599304
+22
+-142.79472099085208
+32
+226.16429264251914
+13
+18.609642681599304
+23
+-142.79472099085208
+33
+226.16429264251914
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.445376197325213
+20
+-142.6785072994499
+30
+222.90118255359218
+11
+18.609642681599304
+21
+-142.79472099085208
+31
+226.16429264251914
+12
+18.27469170193226
+22
+-141.84371575702835
+32
+223.4764707484607
+13
+18.27469170193226
+23
+-141.84371575702835
+33
+223.4764707484607
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.459542889000403
+20
+-149.40003949269592
+30
+223.72319667444424
+11
+25.056764535462978
+21
+-150.09762586542726
+31
+226.38363837942887
+12
+23.99775966696073
+22
+-150.96466518609137
+32
+226.1469518561038
+13
+23.99775966696073
+23
+-150.96466518609137
+33
+226.1469518561038
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.85749760387176
+20
+-151.35133430067438
+30
+223.3651246462256
+11
+26.459542889000403
+21
+-149.40003949269592
+31
+223.72319667444424
+12
+23.99775966696073
+22
+-150.96466518609137
+32
+226.1469518561038
+13
+23.99775966696073
+23
+-150.96466518609137
+33
+226.1469518561038
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.85749760387176
+20
+-151.35133430067438
+30
+223.3651246462256
+11
+22.97161102534681
+21
+-150.73801806542636
+31
+226.03195506199444
+12
+22.80550454496696
+22
+-151.29170633335838
+32
+222.96263586684407
+13
+22.80550454496696
+23
+-151.29170633335838
+33
+222.96263586684407
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.85749760387176
+20
+-151.35133430067438
+30
+223.3651246462256
+11
+23.99775966696073
+21
+-150.96466518609137
+31
+226.1469518561038
+12
+22.97161102534681
+22
+-150.73801806542636
+32
+226.03195506199444
+13
+22.97161102534681
+23
+-150.73801806542636
+33
+226.03195506199444
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.57801800217067
+20
+-145.8984175345052
+30
+222.64198343036128
+11
+18.7435013837369
+21
+-147.6197187542656
+31
+222.6687551707884
+12
+18.03952630022233
+22
+-145.94800609916157
+32
+225.6565422473646
+13
+18.03952630022233
+23
+-145.94800609916157
+33
+225.6565422473646
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.7435013837369
+20
+-147.6197187542656
+30
+222.6687551707884
+11
+19.179759062976263
+21
+-147.7633126347412
+31
+225.64346060147344
+12
+18.03952630022233
+22
+-145.94800609916157
+32
+225.6565422473646
+13
+18.03952630022233
+23
+-145.94800609916157
+33
+225.6565422473646
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.167502189049532
+20
+-144.79712548510065
+30
+223.59420556147657
+11
+22.4793760706681
+21
+-142.26232842553145
+31
+223.79955697952937
+12
+24.320237449383132
+22
+-145.64469444909082
+32
+226.44204944945392
+13
+24.320237449383132
+23
+-145.64469444909082
+33
+226.44204944945392
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.320237449383132
+20
+-145.64469444909082
+30
+226.44204944945392
+11
+22.4793760706681
+21
+-142.26232842553145
+31
+223.79955697952937
+12
+21.266737919030657
+22
+-143.16374509469964
+32
+226.36234267681817
+13
+21.266737919030657
+23
+-143.16374509469964
+33
+226.36234267681817
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.167502189049532
+20
+-144.79712548510065
+30
+223.59420556147657
+11
+25.55265018201817
+21
+-147.7550985780193
+31
+226.4578691142515
+12
+26.609829704582165
+22
+-146.90448737079888
+32
+223.6580926693146
+13
+26.609829704582165
+23
+-146.90448737079888
+33
+223.6580926693146
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.167502189049532
+20
+-144.79712548510065
+30
+223.59420556147657
+11
+24.320237449383132
+21
+-145.64469444909082
+31
+226.44204944945392
+12
+25.55265018201817
+22
+-147.7550985780193
+32
+226.4578691142515
+13
+25.55265018201817
+23
+-147.7550985780193
+33
+226.4578691142515
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.10549902781946
+20
+-149.47183643293047
+30
+212.71636066685738
+11
+19.71123895532712
+21
+-148.55034095844192
+31
+211.12678857897325
+12
+20.526255916751303
+22
+-148.63887023644656
+32
+211.2241403623463
+13
+20.526255916751303
+23
+-148.63887023644656
+33
+211.2241403623463
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.10549902781946
+20
+-149.47183643293047
+30
+212.71636066685738
+11
+19.79946400900875
+21
+-149.07512791568647
+31
+213.12402125973097
+12
+19.71123895532712
+22
+-148.55034095844192
+32
+211.12678857897325
+13
+19.71123895532712
+23
+-148.55034095844192
+33
+211.12678857897325
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.91537347608698
+20
+-149.5786191703182
+30
+215.45346690124785
+11
+18.802520902406656
+21
+-148.2333392138348
+31
+213.33789095882838
+12
+19.79946400900875
+22
+-149.07512791568647
+32
+213.12402125973097
+13
+19.79946400900875
+23
+-149.07512791568647
+33
+213.12402125973097
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.802520902406656
+20
+-148.2333392138348
+30
+213.33789095882838
+11
+19.91537347608698
+21
+-149.5786191703182
+31
+215.45346690124785
+12
+18.5259809927633
+22
+-148.20535057611593
+32
+215.76620950533334
+13
+18.5259809927633
+23
+-148.20535057611593
+33
+215.76620950533334
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.77813900606089
+20
+-150.6707844900318
+30
+215.13737782960928
+11
+19.79946400900875
+21
+-149.07512791568647
+31
+213.12402125973097
+12
+21.10549902781946
+22
+-149.47183643293047
+32
+212.71636066685738
+13
+21.10549902781946
+23
+-149.47183643293047
+33
+212.71636066685738
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.77813900606089
+20
+-150.6707844900318
+30
+215.13737782960928
+11
+19.91537347608698
+21
+-149.5786191703182
+31
+215.45346690124785
+12
+19.79946400900875
+22
+-149.07512791568647
+32
+213.12402125973097
+13
+19.79946400900875
+23
+-149.07512791568647
+33
+213.12402125973097
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+20.200735891098493
+20
+-149.48187583559226
+30
+217.80086177782476
+11
+18.5259809927633
+21
+-148.20535057611593
+31
+215.76620950533334
+12
+19.91537347608698
+22
+-149.5786191703182
+32
+215.45346690124785
+13
+19.91537347608698
+23
+-149.5786191703182
+33
+215.45346690124785
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+20.200735891098493
+20
+-149.48187583559226
+30
+217.80086177782476
+11
+18.635501749057703
+21
+-147.95345283663926
+31
+218.19118158428554
+12
+18.5259809927633
+22
+-148.20535057611593
+32
+215.76620950533334
+13
+18.5259809927633
+23
+-148.20535057611593
+33
+215.76620950533334
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.45199588159451
+20
+-151.1322927880841
+30
+217.87813475587657
+11
+19.91537347608698
+21
+-149.5786191703182
+31
+215.45346690124785
+12
+21.77813900606089
+22
+-150.6707844900318
+32
+215.13737782960928
+13
+21.77813900606089
+23
+-150.6707844900318
+33
+215.13737782960928
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.45199588159451
+20
+-151.1322927880841
+30
+217.87813475587657
+11
+20.200735891098493
+21
+-149.48187583559226
+31
+217.80086177782476
+12
+19.91537347608698
+22
+-149.5786191703182
+32
+215.45346690124785
+13
+19.91537347608698
+23
+-149.5786191703182
+33
+215.45346690124785
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+20.572498013853377
+20
+-149.67262448613872
+30
+219.9136997013376
+11
+18.635501749057703
+21
+-147.95345283663926
+31
+218.19118158428554
+12
+20.200735891098493
+22
+-149.48187583559226
+32
+217.80086177782476
+13
+20.200735891098493
+23
+-149.48187583559226
+33
+217.80086177782476
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.635501749057703
+20
+-147.95345283663926
+30
+218.19118158428554
+11
+20.572498013853377
+21
+-149.67262448613872
+31
+219.9136997013376
+12
+18.89439664796474
+22
+-147.9561908555471
+32
+220.035085206231
+13
+18.89439664796474
+23
+-147.9561908555471
+33
+220.035085206231
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.23598196206857
+20
+-151.3467709358279
+30
+220.16012140299955
+11
+20.200735891098493
+21
+-149.48187583559226
+31
+217.80086177782476
+12
+22.45199588159451
+22
+-151.1322927880841
+32
+217.87813475587657
+13
+22.45199588159451
+23
+-151.1322927880841
+33
+217.87813475587657
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.23598196206857
+20
+-151.3467709358279
+30
+220.16012140299955
+11
+20.572498013853377
+21
+-149.67262448613872
+31
+219.9136997013376
+12
+20.200735891098493
+22
+-149.48187583559226
+32
+217.80086177782476
+13
+20.200735891098493
+23
+-149.48187583559226
+33
+217.80086177782476
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+20.572498013853377
+20
+-149.67262448613872
+30
+219.9136997013376
+11
+20.473929333188426
+21
+-149.4158591574935
+31
+221.93496610361507
+12
+18.89439664796474
+22
+-147.9561908555471
+32
+220.035085206231
+13
+18.89439664796474
+23
+-147.9561908555471
+33
+220.035085206231
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.89439664796474
+20
+-147.9561908555471
+30
+220.035085206231
+11
+20.473929333188426
+21
+-149.4158591574935
+31
+221.93496610361507
+12
+18.948548577465857
+22
+-147.7852167859991
+32
+222.02592917620478
+13
+18.948548577465857
+23
+-147.7852167859991
+33
+222.02592917620478
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.23598196206857
+20
+-151.3467709358279
+30
+220.16012140299955
+11
+23.033368562923933
+21
+-151.28988098742
+31
+222.1028979299329
+12
+20.572498013853377
+22
+-149.67262448613872
+32
+219.9136997013376
+13
+20.572498013853377
+23
+-149.67262448613872
+33
+219.9136997013376
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.033368562923933
+20
+-151.28988098742
+30
+222.1028979299329
+11
+20.473929333188426
+21
+-149.4158591574935
+31
+221.93496610361507
+12
+20.572498013853377
+22
+-149.67262448613872
+32
+219.9136997013376
+13
+20.572498013853377
+23
+-149.67262448613872
+33
+219.9136997013376
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+20.473929333188426
+20
+-149.4158591574935
+30
+221.93496610361507
+11
+20.260059634091288
+21
+-149.32702565516598
+31
+222.69856915444583
+12
+18.948548577465857
+22
+-147.7852167859991
+32
+222.02592917620478
+13
+18.948548577465857
+23
+-147.7852167859991
+33
+222.02592917620478
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.948548577465857
+20
+-147.7852167859991
+30
+222.02592917620478
+11
+20.260059634091288
+21
+-149.32702565516598
+31
+222.69856915444583
+12
+18.7435013837369
+22
+-147.6197187542656
+32
+222.6687551707884
+13
+18.7435013837369
+23
+-147.6197187542656
+33
+222.6687551707884
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.033368562923933
+20
+-151.28988098742
+30
+222.1028979299329
+11
+22.80550454496696
+21
+-151.29170633335838
+31
+222.96263586684407
+12
+20.473929333188426
+22
+-149.4158591574935
+32
+221.93496610361507
+13
+20.473929333188426
+23
+-149.4158591574935
+33
+221.93496610361507
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.80550454496696
+20
+-151.29170633335838
+30
+222.96263586684407
+11
+20.260059634091288
+21
+-149.32702565516598
+31
+222.69856915444583
+12
+20.473929333188426
+22
+-149.4158591574935
+32
+221.93496610361507
+13
+20.473929333188426
+23
+-149.4158591574935
+33
+221.93496610361507
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+20.69631731333065
+20
+-146.07973523103408
+30
+211.17120533013804
+11
+20.39756902810538
+21
+-145.61792270866
+31
+213.51008192566954
+12
+21.707254738792567
+22
+-144.20784297136902
+32
+211.351610353701
+13
+21.707254738792567
+23
+-144.20784297136902
+33
+211.351610353701
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.707254738792567
+20
+-144.20784297136902
+30
+211.351610353701
+11
+20.39756902810538
+21
+-145.61792270866
+31
+213.51008192566954
+12
+21.3780840212633
+22
+-143.74542200034884
+32
+213.8021372757886
+13
+21.3780840212633
+23
+-143.74542200034884
+33
+213.8021372757886
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.398192126918975
+20
+-147.77426471036682
+30
+210.9822820255298
+11
+19.06384959589802
+21
+-147.30089166371715
+31
+213.25848841051518
+12
+20.69631731333065
+22
+-146.07973523103408
+32
+211.17120533013804
+13
+20.69631731333065
+23
+-146.07973523103408
+33
+211.17120533013804
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+20.69631731333065
+20
+-146.07973523103408
+30
+211.17120533013804
+11
+19.06384959589802
+21
+-147.30089166371715
+31
+213.25848841051518
+12
+20.39756902810538
+22
+-145.61792270866
+32
+213.51008192566954
+13
+20.39756902810538
+23
+-145.61792270866
+33
+213.51008192566954
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+20.39756902810538
+20
+-145.61792270866
+30
+213.51008192566954
+11
+19.344952870386994
+21
+-145.01890501659489
+31
+216.16109267664044
+12
+21.3780840212633
+22
+-143.74542200034884
+32
+213.8021372757886
+13
+21.3780840212633
+23
+-143.74542200034884
+33
+213.8021372757886
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.3780840212633
+20
+-143.74542200034884
+30
+213.8021372757886
+11
+19.344952870386994
+21
+-145.01890501659489
+31
+216.16109267664044
+12
+20.002685856799456
+22
+-143.06761020861651
+32
+216.64511357459756
+13
+20.002685856799456
+23
+-143.06761020861651
+33
+216.64511357459756
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.06384959589802
+20
+-147.30089166371715
+30
+213.25848841051518
+11
+18.233012969675784
+21
+-146.74598649849284
+31
+215.69289144348141
+12
+20.39756902810538
+22
+-145.61792270866
+32
+213.51008192566954
+13
+20.39756902810538
+23
+-145.61792270866
+33
+213.51008192566954
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+20.39756902810538
+20
+-145.61792270866
+30
+213.51008192566954
+11
+18.233012969675784
+21
+-146.74598649849284
+31
+215.69289144348141
+12
+19.344952870386994
+22
+-145.01890501659489
+32
+216.16109267664044
+13
+19.344952870386994
+23
+-145.01890501659489
+33
+216.16109267664044
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.344952870386994
+20
+-145.01890501659489
+30
+216.16109267664044
+11
+18.432279901266977
+21
+-144.68152024234396
+31
+217.8364560236218
+12
+20.002685856799456
+22
+-143.06761020861651
+32
+216.64511357459756
+13
+20.002685856799456
+23
+-143.06761020861651
+33
+216.64511357459756
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+20.002685856799456
+20
+-143.06761020861651
+30
+216.64511357459756
+11
+18.432279901266977
+21
+-144.68152024234396
+31
+217.8364560236218
+12
+19.36929081623016
+22
+-142.6474764184985
+32
+217.79112659948936
+13
+19.36929081623016
+23
+-142.6474764184985
+33
+217.79112659948936
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.233012969675784
+20
+-146.74598649849284
+30
+215.69289144348141
+11
+17.86611843608954
+21
+-146.94464498143856
+31
+217.99465267160178
+12
+19.344952870386994
+22
+-145.01890501659489
+32
+216.16109267664044
+13
+19.344952870386994
+23
+-145.01890501659489
+33
+216.16109267664044
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.344952870386994
+20
+-145.01890501659489
+30
+216.16109267664044
+11
+17.86611843608954
+21
+-146.94464498143856
+31
+217.99465267160178
+12
+18.432279901266977
+22
+-144.68152024234396
+32
+217.8364560236218
+13
+18.432279901266977
+23
+-144.68152024234396
+33
+217.8364560236218
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.36929081623016
+20
+-142.6474764184985
+30
+217.79112659948936
+11
+18.432279901266977
+21
+-144.68152024234396
+31
+217.8364560236218
+12
+17.470018367491463
+22
+-144.47160545944686
+32
+219.67731740233654
+13
+17.470018367491463
+23
+-144.47160545944686
+33
+219.67731740233654
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.36929081623016
+20
+-142.6474764184985
+30
+217.79112659948936
+11
+17.470018367491463
+21
+-144.47160545944686
+31
+219.67731740233654
+12
+17.98689549233642
+22
+-142.81175755294063
+32
+219.6268161647126
+13
+17.98689549233642
+23
+-142.81175755294063
+33
+219.6268161647126
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.432279901266977
+20
+-144.68152024234396
+30
+217.8364560236218
+11
+17.86611843608954
+21
+-146.94464498143856
+31
+217.99465267160178
+12
+17.714310498892598
+22
+-146.3091203706085
+32
+219.78166634513877
+13
+17.714310498892598
+23
+-146.3091203706085
+33
+219.78166634513877
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.432279901266977
+20
+-144.68152024234396
+30
+217.8364560236218
+11
+17.714310498892598
+21
+-146.3091203706085
+31
+219.78166634513877
+12
+17.470018367491463
+22
+-144.47160545944686
+32
+219.67731740233654
+13
+17.470018367491463
+23
+-144.47160545944686
+33
+219.67731740233654
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.98689549233642
+20
+-142.81175755294063
+30
+219.6268161647126
+11
+17.470018367491463
+21
+-144.47160545944686
+31
+219.67731740233654
+12
+17.004555153240265
+22
+-144.06577021251204
+32
+221.9252309252795
+13
+17.004555153240265
+23
+-144.06577021251204
+33
+221.9252309252795
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.98689549233642
+20
+-142.81175755294063
+30
+219.6268161647126
+11
+17.004555153240265
+21
+-144.06577021251204
+31
+221.9252309252795
+12
+17.421950924451146
+22
+-142.44090810315546
+32
+222.10472327587348
+13
+17.421950924451146
+23
+-142.44090810315546
+33
+222.10472327587348
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.470018367491463
+20
+-144.47160545944686
+30
+219.67731740233654
+11
+17.714310498892598
+21
+-146.3091203706085
+31
+219.78166634513877
+12
+17.660767018037543
+22
+-145.96869335312724
+32
+221.85160863910332
+13
+17.660767018037543
+23
+-145.96869335312724
+33
+221.85160863910332
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.470018367491463
+20
+-144.47160545944686
+30
+219.67731740233654
+11
+17.660767018037543
+21
+-145.96869335312724
+31
+221.85160863910332
+12
+17.004555153240265
+22
+-144.06577021251204
+32
+221.9252309252795
+13
+17.004555153240265
+23
+-144.06577021251204
+33
+221.9252309252795
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.004555153240265
+20
+-144.06577021251204
+30
+221.9252309252795
+11
+17.07817743941593
+21
+-144.170423379638
+31
+222.7289915867511
+12
+17.421950924451146
+22
+-142.44090810315546
+32
+222.10472327587348
+13
+17.421950924451146
+23
+-142.44090810315546
+33
+222.10472327587348
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.421950924451146
+20
+-142.44090810315546
+30
+222.10472327587348
+11
+17.07817743941593
+21
+-144.170423379638
+31
+222.7289915867511
+12
+17.445376197325213
+22
+-142.6785072994499
+32
+222.90118255359218
+13
+17.445376197325213
+23
+-142.6785072994499
+33
+222.90118255359218
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.660767018037543
+20
+-145.96869335312724
+30
+221.85160863910332
+11
+17.57801800217067
+21
+-145.8984175345052
+31
+222.64198343036128
+12
+17.004555153240265
+22
+-144.06577021251204
+32
+221.9252309252795
+13
+17.004555153240265
+23
+-144.06577021251204
+33
+221.9252309252795
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.004555153240265
+20
+-144.06577021251204
+30
+221.9252309252795
+11
+17.57801800217067
+21
+-145.8984175345052
+31
+222.64198343036128
+12
+17.07817743941593
+22
+-144.170423379638
+32
+222.7289915867511
+13
+17.07817743941593
+23
+-144.170423379638
+33
+222.7289915867511
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.241139125392728
+20
+-140.7427279319441
+30
+213.84320755939973
+11
+23.926266951046323
+21
+-140.7056125645333
+31
+214.09632219616887
+12
+23.48575013128441
+22
+-140.16987353166044
+32
+216.58913629915855
+13
+23.48575013128441
+23
+-140.16987353166044
+33
+216.58913629915855
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.468090470380563
+20
+-140.5054329599735
+30
+216.25783601136794
+11
+24.241139125392728
+21
+-140.7427279319441
+31
+213.84320755939973
+12
+23.48575013128441
+22
+-140.16987353166044
+32
+216.58913629915855
+13
+23.48575013128441
+23
+-140.16987353166044
+33
+216.58913629915855
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.926266951046323
+20
+-140.7056125645333
+30
+214.09632219616887
+11
+23.69718603579722
+21
+-140.93256390952112
+31
+214.10940384205966
+12
+22.899509860786324
+22
+-140.31012094458205
+32
+216.62107985307796
+13
+22.899509860786324
+23
+-140.31012094458205
+33
+216.62107985307796
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.926266951046323
+20
+-140.7056125645333
+30
+214.09632219616887
+11
+22.899509860786324
+21
+-140.31012094458205
+31
+216.62107985307796
+12
+23.48575013128441
+22
+-140.16987353166044
+32
+216.58913629915855
+13
+23.48575013128441
+23
+-140.16987353166044
+33
+216.58913629915855
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.468090470380563
+20
+-140.5054329599735
+30
+216.25783601136794
+11
+23.48575013128441
+21
+-140.16987353166044
+31
+216.58913629915855
+12
+22.211658666392896
+22
+-140.5848355082876
+32
+218.8507399166382
+13
+22.211658666392896
+23
+-140.5848355082876
+33
+218.8507399166382
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.468090470380563
+20
+-140.5054329599735
+30
+216.25783601136794
+11
+22.211658666392896
+21
+-140.5848355082876
+31
+218.8507399166382
+12
+24.07046928016729
+22
+-141.39468065621998
+32
+218.50727065592574
+13
+24.07046928016729
+23
+-141.39468065621998
+33
+218.50727065592574
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.48575013128441
+20
+-140.16987353166044
+30
+216.58913629915855
+11
+22.899509860786324
+21
+-140.31012094458205
+31
+216.62107985307796
+12
+21.369565740218192
+22
+-140.8771950827291
+32
+218.75277968461918
+13
+21.369565740218192
+23
+-140.8771950827291
+33
+218.75277968461918
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.48575013128441
+20
+-140.16987353166044
+30
+216.58913629915855
+11
+21.369565740218192
+21
+-140.8771950827291
+31
+218.75277968461918
+12
+22.211658666392896
+22
+-140.5848355082876
+32
+218.8507399166382
+13
+22.211658666392896
+23
+-140.5848355082876
+33
+218.8507399166382
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.07046928016729
+20
+-141.39468065621998
+30
+218.50727065592574
+11
+22.211658666392896
+21
+-140.5848355082876
+31
+218.8507399166382
+12
+21.330320802546012
+22
+-140.95781452833523
+32
+220.60489736328674
+13
+21.330320802546012
+23
+-140.95781452833523
+33
+220.60489736328674
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.07046928016729
+20
+-141.39468065621998
+30
+218.50727065592574
+11
+21.330320802546012
+21
+-140.95781452833523
+31
+220.60489736328674
+12
+23.468105120548092
+22
+-142.10656557213414
+32
+220.58999037145747
+13
+23.468105120548092
+23
+-142.10656557213414
+33
+220.58999037145747
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.211658666392896
+20
+-140.5848355082876
+30
+218.8507399166382
+11
+21.369565740218192
+21
+-140.8771950827291
+31
+218.75277968461918
+12
+20.40395773888922
+22
+-141.17381379769338
+32
+220.25473516746757
+13
+20.40395773888922
+23
+-141.17381379769338
+33
+220.25473516746757
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.211658666392896
+20
+-140.5848355082876
+30
+218.8507399166382
+11
+20.40395773888922
+21
+-141.17381379769338
+31
+220.25473516746757
+12
+21.330320802546012
+22
+-140.95781452833523
+32
+220.60489736328674
+13
+21.330320802546012
+23
+-140.95781452833523
+33
+220.60489736328674
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.468105120548092
+20
+-142.10656557213414
+30
+220.58999037145747
+11
+21.330320802546012
+21
+-140.95781452833523
+31
+220.60489736328674
+12
+21.049825976703136
+22
+-141.3034133593091
+32
+222.66297490865222
+13
+21.049825976703136
+23
+-141.3034133593091
+33
+222.66297490865222
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.468105120548092
+20
+-142.10656557213414
+30
+220.58999037145747
+11
+21.049825976703136
+21
+-141.3034133593091
+31
+222.66297490865222
+12
+22.77173564510953
+22
+-142.31891414961655
+32
+222.54280630105117
+13
+22.77173564510953
+23
+-142.31891414961655
+33
+222.54280630105117
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.47721720007176
+20
+-146.97902232994102
+30
+213.20464070533714
+11
+22.486981678744083
+21
+-149.07086877516392
+31
+213.36314157764014
+12
+21.125882057463134
+22
+-147.88074322343087
+32
+210.93999484462725
+13
+21.125882057463134
+23
+-147.88074322343087
+33
+210.93999484462725
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.486981678744083
+20
+-149.07086877516392
+30
+213.36314157764014
+11
+20.526255916751303
+21
+-148.63887023644656
+31
+211.2241403623463
+12
+21.125882057463134
+22
+-147.88074322343087
+32
+210.93999484462725
+13
+21.125882057463134
+23
+-147.88074322343087
+33
+210.93999484462725
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.486981678744083
+20
+-149.07086877516392
+30
+213.36314157764014
+11
+21.10549902781946
+21
+-149.47183643293047
+31
+212.71636066685738
+12
+20.526255916751303
+22
+-148.63887023644656
+32
+211.2241403623463
+13
+20.526255916751303
+23
+-148.63887023644656
+33
+211.2241403623463
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.566428177560095
+20
+-148.11043258732604
+30
+210.85937539902156
+11
+18.802520902406656
+21
+-148.2333392138348
+31
+213.33789095882838
+12
+19.398192126918975
+22
+-147.77426471036682
+32
+210.9822820255298
+13
+19.398192126918975
+23
+-147.77426471036682
+33
+210.9822820255298
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.398192126918975
+20
+-147.77426471036682
+30
+210.9822820255298
+11
+18.802520902406656
+21
+-148.2333392138348
+31
+213.33789095882838
+12
+19.06384959589802
+22
+-147.30089166371715
+32
+213.25848841051518
+13
+19.06384959589802
+23
+-147.30089166371715
+33
+213.25848841051518
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.260913706390337
+20
+-142.0034335266215
+30
+212.3561590683799
+11
+24.241139125392728
+21
+-140.7427279319441
+31
+213.84320755939973
+12
+24.977970435795612
+22
+-142.3216521685214
+32
+212.9986808386403
+13
+24.977970435795612
+23
+-142.3216521685214
+33
+212.9986808386403
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.241139125392728
+20
+-140.7427279319441
+30
+213.84320755939973
+11
+25.6168415141796
+21
+-141.62802071199062
+31
+214.2773356683776
+12
+24.977970435795612
+22
+-142.3216521685214
+32
+212.9986808386403
+13
+24.977970435795612
+23
+-142.3216521685214
+33
+212.9986808386403
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.977970435795612
+20
+-142.3216521685214
+30
+212.9986808386403
+11
+25.6168415141796
+21
+-141.62802071199062
+31
+214.2773356683776
+12
+25.708413035414658
+22
+-142.67820307512477
+32
+214.14347696623975
+13
+25.708413035414658
+23
+-142.67820307512477
+33
+214.14347696623975
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.536830517220082
+20
+-148.53330439635315
+30
+216.8744987141683
+11
+22.486981678744083
+21
+-149.07086877516392
+31
+213.36314157764014
+12
+24.47721720007176
+22
+-146.97902232994102
+32
+213.20464070533714
+13
+24.47721720007176
+23
+-146.97902232994102
+33
+213.20464070533714
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.486981678744083
+20
+-149.07086877516392
+30
+213.36314157764014
+11
+25.536830517220082
+21
+-148.53330439635315
+31
+216.8744987141683
+12
+23.501265571759458
+22
+-150.8359782974429
+32
+216.7196485337403
+13
+23.501265571759458
+23
+-150.8359782974429
+33
+216.7196485337403
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.501265571759458
+20
+-150.8359782974429
+30
+216.7196485337403
+11
+21.10549902781946
+21
+-149.47183643293047
+31
+212.71636066685738
+12
+22.486981678744083
+22
+-149.07086877516392
+32
+213.36314157764014
+13
+22.486981678744083
+23
+-149.07086877516392
+33
+213.36314157764014
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.501265571759458
+20
+-150.8359782974429
+30
+216.7196485337403
+11
+21.77813900606089
+21
+-150.6707844900318
+31
+215.13737782960928
+12
+21.10549902781946
+22
+-149.47183643293047
+32
+212.71636066685738
+13
+21.10549902781946
+23
+-149.47183643293047
+33
+212.71636066685738
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.06384959589802
+20
+-147.30089166371715
+30
+213.25848841051518
+11
+18.802520902406656
+21
+-148.2333392138348
+31
+213.33789095882838
+12
+18.5259809927633
+22
+-148.20535057611593
+32
+215.76620950533334
+13
+18.5259809927633
+23
+-148.20535057611593
+33
+215.76620950533334
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.06384959589802
+20
+-147.30089166371715
+30
+213.25848841051518
+11
+18.5259809927633
+21
+-148.20535057611593
+31
+215.76620950533334
+12
+18.233012969675784
+22
+-146.74598649849284
+32
+215.69289144348141
+13
+18.233012969675784
+23
+-146.74598649849284
+33
+215.69289144348141
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.6168415141796
+20
+-141.62802071199062
+30
+214.2773356683776
+11
+24.241139125392728
+21
+-140.7427279319441
+31
+213.84320755939973
+12
+24.468090470380563
+22
+-140.5054329599735
+32
+216.25783601136794
+13
+24.468090470380563
+23
+-140.5054329599735
+33
+216.25783601136794
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.6168415141796
+20
+-141.62802071199062
+30
+214.2773356683776
+11
+24.468090470380563
+21
+-140.5054329599735
+31
+216.25783601136794
+12
+26.304084259926977
+22
+-142.60366811598058
+32
+216.3679652163082
+13
+26.304084259926977
+23
+-142.60366811598058
+33
+216.3679652163082
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.708413035414658
+20
+-142.67820307512477
+30
+214.14347696623975
+11
+25.6168415141796
+21
+-141.62802071199062
+31
+214.2773356683776
+12
+26.304084259926977
+22
+-142.60366811598058
+32
+216.3679652163082
+13
+26.304084259926977
+23
+-142.60366811598058
+33
+216.3679652163082
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.708413035414658
+20
+-142.67820307512477
+30
+214.14347696623975
+11
+26.304084259926977
+21
+-142.60366811598058
+31
+216.3679652163082
+12
+26.548984839974157
+22
+-144.31614683037267
+32
+216.86902267635466
+13
+26.548984839974157
+23
+-144.31614683037267
+33
+216.86902267635466
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.501265571759458
+20
+-150.8359782974429
+30
+216.7196485337403
+11
+25.536830517220082
+21
+-148.53330439635315
+31
+216.8744987141683
+12
+26.346979889475584
+22
+-149.6659315510318
+32
+219.77253961544704
+13
+26.346979889475584
+23
+-149.6659315510318
+33
+219.77253961544704
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.501265571759458
+20
+-150.8359782974429
+30
+216.7196485337403
+11
+26.346979889475584
+21
+-149.6659315510318
+31
+219.77253961544704
+12
+24.079900234181526
+22
+-151.4270861571101
+32
+218.68889257677782
+13
+24.079900234181526
+23
+-151.4270861571101
+33
+218.68889257677782
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.079900234181526
+20
+-151.4270861571101
+30
+218.68889257677782
+11
+21.77813900606089
+21
+-150.6707844900318
+31
+215.13737782960928
+12
+23.501265571759458
+22
+-150.8359782974429
+32
+216.7196485337403
+13
+23.501265571759458
+23
+-150.8359782974429
+33
+216.7196485337403
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.079900234181526
+20
+-151.4270861571101
+30
+218.68889257677782
+11
+22.45199588159451
+21
+-151.1322927880841
+31
+217.87813475587657
+12
+21.77813900606089
+22
+-150.6707844900318
+32
+215.13737782960928
+13
+21.77813900606089
+23
+-150.6707844900318
+33
+215.13737782960928
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+20.752903037416097
+20
+-149.5126024922212
+30
+225.69304916612845
+11
+22.97161102534681
+21
+-150.73801806542636
+31
+226.03195506199444
+12
+25.056764535462978
+22
+-150.09762586542726
+32
+226.38363837942887
+13
+25.056764535462978
+23
+-150.09762586542726
+33
+226.38363837942887
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.521315076745058
+20
+-148.72344459825558
+30
+226.4043256333962
+11
+20.752903037416097
+21
+-149.5126024922212
+31
+225.69304916612845
+12
+25.056764535462978
+22
+-150.09762586542726
+32
+226.38363837942887
+13
+25.056764535462978
+23
+-150.09762586542726
+33
+226.38363837942887
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.55265018201817
+20
+-147.7550985780193
+30
+226.4578691142515
+11
+19.179759062976263
+21
+-147.7633126347412
+31
+225.64346060147344
+12
+25.521315076745058
+22
+-148.72344459825558
+32
+226.4043256333962
+13
+25.521315076745058
+23
+-148.72344459825558
+33
+226.4043256333962
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.179759062976263
+20
+-147.7633126347412
+30
+225.64346060147344
+11
+20.752903037416097
+21
+-149.5126024922212
+31
+225.69304916612845
+12
+25.521315076745058
+22
+-148.72344459825558
+32
+226.4043256333962
+13
+25.521315076745058
+23
+-148.72344459825558
+33
+226.4043256333962
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+17.73256395827498
+20
+-144.93341798182308
+30
+225.6690154446095
+11
+18.03952630022233
+21
+-145.94800609916157
+31
+225.6565422473646
+12
+25.55265018201817
+22
+-147.7550985780193
+32
+226.4578691142515
+13
+25.55265018201817
+23
+-147.7550985780193
+33
+226.4578691142515
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.06173467580425
+20
+-143.51360306619551
+30
+225.81717268993037
+11
+17.73256395827498
+21
+-144.93341798182308
+31
+225.6690154446095
+12
+25.55265018201817
+22
+-147.7550985780193
+32
+226.4578691142515
+13
+25.55265018201817
+23
+-147.7550985780193
+33
+226.4578691142515
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.06173467580425
+20
+-143.51360306619551
+30
+225.81717268993037
+11
+25.55265018201817
+21
+-147.7550985780193
+31
+226.4578691142515
+12
+24.320237449383132
+22
+-145.64469444909082
+32
+226.44204944945392
+13
+24.320237449383132
+23
+-145.64469444909082
+33
+226.44204944945392
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.609642681599304
+20
+-142.79472099085208
+30
+226.16429264251914
+11
+18.06173467580425
+21
+-143.51360306619551
+31
+225.81717268993037
+12
+24.320237449383132
+22
+-145.64469444909082
+32
+226.44204944945392
+13
+24.320237449383132
+23
+-145.64469444909082
+33
+226.44204944945392
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+18.609642681599304
+20
+-142.79472099085208
+30
+226.16429264251914
+11
+24.320237449383132
+21
+-145.64469444909082
+31
+226.44204944945392
+12
+21.266737919030657
+22
+-143.16374509469964
+32
+226.36234267681817
+13
+21.266737919030657
+23
+-143.16374509469964
+33
+226.36234267681817
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.056764535462978
+20
+-150.09762586542726
+30
+226.38363837942887
+11
+22.97161102534681
+21
+-150.73801806542636
+31
+226.03195506199444
+12
+23.99775966696073
+22
+-150.96466518609137
+32
+226.1469518561038
+13
+23.99775966696073
+23
+-150.96466518609137
+33
+226.1469518561038
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.385110481028256
+20
+-142.60518923759824
+30
+226.14695185610594
+11
+18.609642681599304
+21
+-142.79472099085208
+31
+226.16429264251914
+12
+21.266737919030657
+22
+-143.16374509469964
+32
+226.36234267681817
+13
+21.266737919030657
+23
+-143.16374509469964
+33
+226.36234267681817
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.994167575754336
+20
+-142.5315669514225
+30
+226.27898521230532
+11
+19.385110481028256
+21
+-142.60518923759824
+31
+226.14695185610594
+12
+21.266737919030657
+22
+-143.16374509469964
+32
+226.36234267681817
+13
+21.266737919030657
+23
+-143.16374509469964
+33
+226.36234267681817
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.260913706390337
+20
+-142.0034335266215
+30
+212.3561590683799
+11
+23.515564114942332
+21
+-143.5863126793982
+31
+210.8481190990702
+12
+23.670414295369692
+22
+-142.24985522828374
+32
+212.03063904272673
+13
+23.670414295369692
+23
+-142.24985522828374
+33
+212.03063904272673
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.670414295369692
+20
+-142.24985522828374
+30
+212.03063904272673
+11
+23.515564114942332
+21
+-143.5863126793982
+31
+210.8481190990702
+12
+22.936929452520253
+22
+-143.2474067835316
+32
+210.89284007455686
+13
+22.936929452520253
+23
+-143.2474067835316
+33
+210.89284007455686
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.936929452520253
+20
+-143.2474067835316
+30
+210.89284007455686
+11
+23.515564114942332
+21
+-143.5863126793982
+31
+210.8481190990702
+12
+22.405145335846345
+22
+-143.8756300106091
+32
+210.231152171945
+13
+22.405145335846345
+23
+-143.8756300106091
+33
+210.231152171945
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.515564114942332
+20
+-143.5863126793982
+30
+210.8481190990702
+11
+21.738589844065693
+21
+-144.75544675284058
+31
+209.5944106638221
+12
+22.405145335846345
+22
+-143.8756300106091
+32
+210.231152171945
+13
+22.405145335846345
+23
+-143.8756300106091
+33
+210.231152171945
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.515564114942332
+20
+-143.5863126793982
+30
+210.8481190990702
+11
+22.260334558079276
+21
+-145.24038032376646
+31
+209.51713768576977
+12
+21.738589844065693
+22
+-144.75544675284058
+32
+209.5944106638221
+13
+21.738589844065693
+23
+-144.75544675284058
+33
+209.5944106638221
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.738589844065693
+20
+-144.75544675284058
+30
+209.5944106638221
+11
+22.260334558079276
+21
+-145.24038032376646
+31
+209.51713768576977
+12
+21.15873828435147
+22
+-145.79072212414565
+32
+209.51622501280053
+13
+21.15873828435147
+23
+-145.79072212414565
+33
+209.51622501280053
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.260334558079276
+20
+-145.24038032376646
+30
+209.51713768576977
+11
+20.878547682831613
+21
+-146.9099634086099
+31
+209.86517031132715
+12
+21.15873828435147
+22
+-145.79072212414565
+32
+209.51622501280053
+13
+21.15873828435147
+23
+-145.79072212414565
+33
+209.51622501280053
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.15873828435147
+20
+-145.79072212414565
+30
+209.51622501280053
+11
+20.878547682831613
+21
+-146.9099634086099
+31
+209.86517031132715
+12
+20.183090880362176
+22
+-147.12048664015362
+32
+210.10094416168278
+13
+20.183090880362176
+23
+-147.12048664015362
+33
+210.10094416168278
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+20.878547682831613
+20
+-146.9099634086099
+30
+209.86517031132715
+11
+20.02519845670441
+21
+-148.00547519587715
+31
+210.51955683018588
+12
+20.183090880362176
+22
+-147.12048664015362
+32
+210.10094416168278
+13
+20.183090880362176
+23
+-147.12048664015362
+33
+210.10094416168278
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.398192126918975
+20
+-147.77426471036682
+30
+210.9822820255298
+11
+20.02519845670441
+21
+-148.00547519587715
+31
+210.51955683018588
+12
+19.566428177560095
+22
+-148.11043258732604
+32
+210.85937539902156
+13
+19.566428177560095
+23
+-148.11043258732604
+33
+210.85937539902156
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+20.183090880362176
+20
+-147.12048664015362
+30
+210.10094416168278
+11
+20.02519845670441
+21
+-148.00547519587715
+31
+210.51955683018588
+12
+19.398192126918975
+22
+-147.77426471036682
+32
+210.9822820255298
+13
+19.398192126918975
+23
+-147.77426471036682
+33
+210.9822820255298
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.936929452520253
+20
+-143.2474067835316
+30
+210.89284007455686
+11
+22.405145335846345
+21
+-143.8756300106091
+31
+210.231152171945
+12
+22.64669944834009
+22
+-143.33776140747472
+32
+211.66739520101697
+13
+22.64669944834009
+23
+-143.33776140747472
+33
+211.66739520101697
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.670414295369692
+20
+-142.24985522828374
+30
+212.03063904272673
+11
+22.936929452520253
+21
+-143.2474067835316
+31
+210.89284007455686
+12
+22.64669944834009
+22
+-143.33776140747472
+32
+211.66739520101697
+13
+22.64669944834009
+23
+-143.33776140747472
+33
+211.66739520101697
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.738589844065693
+20
+-144.75544675284058
+30
+209.5944106638221
+11
+21.707254738792567
+21
+-144.20784297136902
+31
+211.351610353701
+12
+22.405145335846345
+22
+-143.8756300106091
+32
+210.231152171945
+13
+22.405145335846345
+23
+-143.8756300106091
+33
+210.231152171945
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.64669944834009
+20
+-143.33776140747472
+30
+211.66739520101697
+11
+22.405145335846345
+21
+-143.8756300106091
+31
+210.231152171945
+12
+21.707254738792567
+22
+-144.20784297136902
+32
+211.351610353701
+13
+21.707254738792567
+23
+-144.20784297136902
+33
+211.351610353701
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.15873828435147
+20
+-145.79072212414565
+30
+209.51622501280053
+11
+20.69631731333065
+21
+-146.07973523103408
+31
+211.17120533013804
+12
+21.738589844065693
+22
+-144.75544675284058
+32
+209.5944106638221
+13
+21.738589844065693
+23
+-144.75544675284058
+33
+209.5944106638221
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.738589844065693
+20
+-144.75544675284058
+30
+209.5944106638221
+11
+20.69631731333065
+21
+-146.07973523103408
+31
+211.17120533013804
+12
+21.707254738792567
+22
+-144.20784297136902
+32
+211.351610353701
+13
+21.707254738792567
+23
+-144.20784297136902
+33
+211.351610353701
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.15873828435147
+20
+-145.79072212414565
+30
+209.51622501280053
+11
+20.183090880362176
+21
+-147.12048664015362
+31
+210.10094416168278
+12
+19.398192126918975
+22
+-147.77426471036682
+32
+210.9822820255298
+13
+19.398192126918975
+23
+-147.77426471036682
+33
+210.9822820255298
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.15873828435147
+20
+-145.79072212414565
+30
+209.51622501280053
+11
+19.398192126918975
+21
+-147.77426471036682
+31
+210.9822820255298
+12
+20.69631731333065
+22
+-146.07973523103408
+32
+211.17120533013804
+13
+20.69631731333065
+23
+-146.07973523103408
+33
+211.17120533013804
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+19.566428177560095
+20
+-148.11043258732604
+30
+210.85937539902156
+11
+20.526255916751303
+21
+-148.63887023644656
+31
+211.2241403623463
+12
+19.71123895532712
+22
+-148.55034095844192
+32
+211.12678857897325
+13
+19.71123895532712
+23
+-148.55034095844192
+33
+211.12678857897325
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+20.526255916751303
+20
+-148.63887023644656
+30
+211.2241403623463
+11
+19.566428177560095
+21
+-148.11043258732604
+31
+210.85937539902156
+12
+20.02519845670441
+22
+-148.00547519587715
+32
+210.51955683018588
+13
+20.02519845670441
+23
+-148.00547519587715
+33
+210.51955683018588
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+20.878547682831613
+20
+-146.9099634086099
+30
+209.86517031132715
+11
+21.125882057463134
+21
+-147.88074322343087
+31
+210.93999484462725
+12
+20.02519845670441
+22
+-148.00547519587715
+32
+210.51955683018588
+13
+20.02519845670441
+23
+-148.00547519587715
+33
+210.51955683018588
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.125882057463134
+20
+-147.88074322343087
+30
+210.93999484462725
+11
+20.526255916751303
+21
+-148.63887023644656
+31
+211.2241403623463
+12
+20.02519845670441
+22
+-148.00547519587715
+32
+210.51955683018588
+13
+20.02519845670441
+23
+-148.00547519587715
+33
+210.51955683018588
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.260334558079276
+20
+-145.24038032376646
+30
+209.51713768576977
+11
+23.347023839978174
+21
+-146.12597732813614
+31
+211.00783686866544
+12
+20.878547682831613
+22
+-146.9099634086099
+32
+209.86517031132715
+13
+20.878547682831613
+23
+-146.9099634086099
+33
+209.86517031132715
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.347023839978174
+20
+-146.12597732813614
+30
+211.00783686866544
+11
+21.125882057463134
+21
+-147.88074322343087
+31
+210.93999484462725
+12
+20.878547682831613
+22
+-146.9099634086099
+32
+209.86517031132715
+13
+20.878547682831613
+23
+-146.9099634086099
+33
+209.86517031132715
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.260334558079276
+20
+-145.24038032376646
+30
+209.51713768576977
+11
+23.515564114942332
+21
+-143.5863126793982
+31
+210.8481190990702
+12
+24.263955949620733
+22
+-144.25834420899383
+32
+211.9637096916576
+13
+24.263955949620733
+23
+-144.25834420899383
+33
+211.9637096916576
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.260334558079276
+20
+-145.24038032376646
+30
+209.51713768576977
+11
+24.263955949620733
+21
+-144.25834420899383
+31
+211.9637096916576
+12
+23.347023839978174
+22
+-146.12597732813614
+32
+211.00783686866544
+13
+23.347023839978174
+23
+-146.12597732813614
+33
+211.00783686866544
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.515564114942332
+20
+-143.5863126793982
+30
+210.8481190990702
+11
+24.260913706390337
+21
+-142.0034335266215
+31
+212.3561590683799
+12
+24.977970435795612
+22
+-142.3216521685214
+32
+212.9986808386403
+13
+24.977970435795612
+23
+-142.3216521685214
+33
+212.9986808386403
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.515564114942332
+20
+-143.5863126793982
+30
+210.8481190990702
+11
+24.977970435795612
+21
+-142.3216521685214
+31
+212.9986808386403
+12
+24.263955949620733
+22
+-144.25834420899383
+32
+211.9637096916576
+13
+24.263955949620733
+23
+-144.25834420899383
+33
+211.9637096916576
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.260913706390337
+20
+-142.0034335266215
+30
+212.3561590683799
+11
+23.670414295369692
+21
+-142.24985522828374
+31
+212.03063904272673
+12
+23.926266951046323
+22
+-140.7056125645333
+32
+214.09632219616887
+13
+23.926266951046323
+23
+-140.7056125645333
+33
+214.09632219616887
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.260913706390337
+20
+-142.0034335266215
+30
+212.3561590683799
+11
+23.926266951046323
+21
+-140.7056125645333
+31
+214.09632219616887
+12
+24.241139125392728
+22
+-140.7427279319441
+32
+213.84320755939973
+13
+24.241139125392728
+23
+-140.7427279319441
+33
+213.84320755939973
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.670414295369692
+20
+-142.24985522828374
+30
+212.03063904272673
+11
+23.69718603579722
+21
+-140.93256390952112
+31
+214.10940384205966
+12
+23.926266951046323
+22
+-140.7056125645333
+32
+214.09632219616887
+13
+23.926266951046323
+23
+-140.7056125645333
+33
+214.09632219616887
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.41754528225337
+20
+-128.32216149519348
+30
+227.36263225097747
+11
+28.18844971683672
+21
+-129.6129852978526
+31
+228.92877906598707
+12
+28.47198678591001
+22
+-129.40520008521628
+32
+228.93608044974002
+13
+28.47198678591001
+23
+-129.40520008521628
+33
+228.93608044974002
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.82269882970503
+20
+-130.15724261177047
+30
+225.48708929943538
+11
+32.35084690466999
+21
+-130.67655353120017
+31
+227.67172416318564
+12
+32.62829948728247
+22
+-131.50100144663844
+32
+227.37540967254412
+13
+32.62829948728247
+23
+-131.50100144663844
+33
+227.37540967254412
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.776152508279914
+20
+-131.32576823656692
+30
+225.1992930898393
+11
+32.82269882970503
+21
+-130.15724261177047
+31
+225.48708929943538
+12
+32.62829948728247
+22
+-131.50100144663844
+32
+227.37540967254412
+13
+32.62829948728247
+23
+-131.50100144663844
+33
+227.37540967254412
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.55072228490727
+20
+-132.07628964150652
+30
+225.05326541477987
+11
+32.776152508279914
+21
+-131.32576823656692
+31
+225.1992930898393
+12
+31.97452141706951
+22
+-132.31753952967776
+32
+227.25371994332787
+13
+31.97452141706951
+23
+-132.31753952967776
+33
+227.25371994332787
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.776152508279914
+20
+-131.32576823656692
+30
+225.1992930898393
+11
+32.62829948728247
+21
+-131.50100144663844
+31
+227.37540967254412
+12
+31.97452141706951
+22
+-132.31753952967776
+32
+227.25371994332787
+13
+31.97452141706951
+23
+-132.31753952967776
+33
+227.25371994332787
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.55072228490727
+20
+-132.07628964150652
+30
+225.05326541477987
+11
+31.47437662999175
+21
+-132.890089705639
+31
+227.1664075626155
+12
+31.72657859379192
+22
+-132.81981388701632
+32
+225.4067740781522
+13
+31.72657859379192
+23
+-132.81981388701632
+33
+225.4067740781522
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.55072228490727
+20
+-132.07628964150652
+30
+225.05326541477987
+11
+31.97452141706951
+21
+-132.31753952967776
+31
+227.25371994332787
+12
+31.47437662999175
+22
+-132.890089705639
+32
+227.1664075626155
+13
+31.47437662999175
+23
+-132.890089705639
+33
+227.1664075626155
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.72657859379192
+20
+-132.81981388701632
+30
+225.4067740781522
+11
+30.753060760063914
+21
+-133.1279931262563
+31
+227.19317930304297
+12
+30.531889677213865
+22
+-133.06167222383317
+32
+225.5339398451828
+13
+30.531889677213865
+23
+-133.06167222383317
+33
+225.5339398451828
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.72657859379192
+20
+-132.81981388701632
+30
+225.4067740781522
+11
+31.47437662999175
+21
+-132.890089705639
+31
+227.1664075626155
+12
+30.753060760063914
+22
+-133.1279931262563
+32
+227.19317930304297
+13
+30.753060760063914
+23
+-133.1279931262563
+33
+227.19317930304297
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.531889677213865
+20
+-133.06167222383317
+30
+225.5339398451828
+11
+29.72721634277304
+21
+-132.751667638656
+31
+227.58593290408768
+12
+29.019590567382
+22
+-132.7118142523373
+32
+225.98206227302083
+13
+29.019590567382
+23
+-132.7118142523373
+33
+225.98206227302083
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.753060760063914
+20
+-133.1279931262563
+30
+227.19317930304297
+11
+29.72721634277304
+21
+-132.751667638656
+31
+227.58593290408768
+12
+30.531889677213865
+22
+-133.06167222383317
+32
+225.5339398451828
+13
+30.531889677213865
+23
+-133.06167222383317
+33
+225.5339398451828
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.019590567382
+20
+-132.7118142523373
+30
+225.98206227302083
+11
+28.39045466733528
+21
+-132.42158424815761
+31
+227.7572111979593
+12
+27.5958207355548
+22
+-132.07994033338326
+32
+226.23791492869768
+13
+27.5958207355548
+23
+-132.07994033338326
+33
+226.23791492869768
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.72721634277304
+20
+-132.751667638656
+30
+227.58593290408768
+11
+28.39045466733528
+21
+-132.42158424815761
+31
+227.7572111979593
+12
+29.019590567382
+22
+-132.7118142523373
+32
+225.98206227302083
+13
+29.019590567382
+23
+-132.7118142523373
+33
+225.98206227302083
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.792653872561687
+20
+-131.65372205680475
+30
+228.24031942294698
+11
+26.584274861446804
+21
+-131.08360567542735
+31
+226.5944658353008
+12
+27.5958207355548
+22
+-132.07994033338326
+32
+226.23791492869768
+13
+27.5958207355548
+23
+-132.07994033338326
+33
+226.23791492869768
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.5958207355548
+20
+-132.07994033338326
+30
+226.23791492869768
+11
+28.39045466733528
+21
+-132.42158424815761
+31
+227.7572111979593
+12
+27.792653872561687
+22
+-131.65372205680475
+32
+228.24031942294698
+13
+27.792653872561687
+23
+-131.65372205680475
+33
+228.24031942294698
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.584274861446804
+20
+-131.08360567542735
+30
+226.5944658353008
+11
+27.742456859260074
+21
+-130.47181056179443
+31
+228.58348445933615
+12
+26.282484332991114
+22
+-129.9664939612245
+32
+226.75996386703486
+13
+26.282484332991114
+23
+-129.9664939612245
+33
+226.75996386703486
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.584274861446804
+20
+-131.08360567542735
+30
+226.5944658353008
+11
+27.792653872561687
+21
+-131.65372205680475
+31
+228.24031942294698
+12
+27.742456859260074
+22
+-130.47181056179443
+32
+228.58348445933615
+13
+27.742456859260074
+23
+-130.47181056179443
+33
+228.58348445933615
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.282484332991114
+20
+-129.9664939612245
+30
+226.75996386703486
+11
+28.18844971683672
+21
+-129.6129852978526
+31
+228.92877906598707
+12
+27.41754528225337
+22
+-128.32216149519348
+32
+227.36263225097747
+13
+27.41754528225337
+23
+-128.32216149519348
+33
+227.36263225097747
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.282484332991114
+20
+-129.9664939612245
+30
+226.75996386703486
+11
+27.742456859260074
+21
+-130.47181056179443
+31
+228.58348445933615
+12
+28.18844971683672
+22
+-129.6129852978526
+32
+228.92877906598707
+13
+28.18844971683672
+23
+-129.6129852978526
+33
+228.92877906598707
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.143120292703767
+20
+-127.45451372588334
+30
+227.1950046489827
+11
+27.41754528225337
+21
+-128.32216149519348
+31
+227.36263225097747
+12
+28.775298435980876
+22
+-128.83143301196284
+32
+228.85120186361212
+13
+28.775298435980876
+23
+-128.83143301196284
+33
+228.85120186361212
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.41754528225337
+20
+-128.32216149519348
+30
+227.36263225097747
+11
+28.47198678591001
+21
+-129.40520008521628
+31
+228.93608044974002
+12
+28.775298435980876
+22
+-128.83143301196284
+32
+228.85120186361212
+13
+28.775298435980876
+23
+-128.83143301196284
+33
+228.85120186361212
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.575712629899126
+20
+-127.56433870650068
+30
+226.81107355330616
+11
+28.143120292703767
+21
+-127.45451372588334
+31
+227.1950046489827
+12
+29.53798881384216
+22
+-128.61573796692747
+32
+228.72890368575
+13
+29.53798881384216
+23
+-128.61573796692747
+33
+228.72890368575
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.085042747338164
+20
+-129.90564909661651
+30
+226.4119312414771
+11
+26.584274861446804
+21
+-131.08360567542735
+31
+226.5944658353008
+12
+26.282484332991114
+22
+-129.9664939612245
+32
+226.75996386703486
+13
+26.282484332991114
+23
+-129.9664939612245
+33
+226.75996386703486
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.085042747338164
+20
+-129.90564909661651
+30
+226.4119312414771
+11
+26.282484332991114
+21
+-129.9664939612245
+31
+226.75996386703486
+12
+27.104194229522165
+22
+-127.93975152113204
+32
+226.61576153791447
+13
+27.104194229522165
+23
+-127.93975152113204
+33
+226.61576153791447
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.104194229522165
+20
+-127.93975152113204
+30
+226.61576153791447
+11
+26.282484332991114
+21
+-129.9664939612245
+31
+226.75996386703486
+12
+27.41754528225337
+22
+-128.32216149519348
+32
+227.36263225097747
+13
+27.41754528225337
+23
+-128.32216149519348
+33
+227.36263225097747
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.007132020304876
+20
+-127.21752297823505
+30
+226.67356415929225
+11
+27.104194229522165
+21
+-127.93975152113204
+31
+226.61576153791447
+12
+27.41754528225337
+22
+-128.32216149519348
+32
+227.36263225097747
+13
+27.41754528225337
+23
+-128.32216149519348
+33
+227.36263225097747
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.007132020304876
+20
+-127.21752297823505
+30
+226.67356415929225
+11
+27.41754528225337
+21
+-128.32216149519348
+31
+227.36263225097747
+12
+28.143120292703767
+22
+-127.45451372588334
+32
+227.1950046489827
+13
+28.143120292703767
+23
+-127.45451372588334
+33
+227.1950046489827
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.543769075979917
+20
+-127.38667170184517
+30
+226.2339600124993
+11
+28.007132020304876
+21
+-127.21752297823505
+31
+226.67356415929225
+12
+28.143120292703767
+22
+-127.45451372588334
+32
+227.1950046489827
+13
+28.143120292703767
+23
+-127.45451372588334
+33
+227.1950046489827
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.575712629899126
+20
+-127.56433870650068
+30
+226.81107355330616
+11
+29.543769075979917
+21
+-127.38667170184517
+31
+226.2339600124993
+12
+28.143120292703767
+22
+-127.45451372588334
+32
+227.1950046489827
+13
+28.143120292703767
+23
+-127.45451372588334
+33
+227.1950046489827
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.786525435598314
+20
+-128.05261874497964
+30
+225.85246271140701
+11
+29.543769075979917
+21
+-127.38667170184517
+31
+226.2339600124993
+12
+29.575712629899126
+22
+-127.56433870650068
+32
+226.81107355330616
+13
+29.575712629899126
+23
+-127.56433870650068
+33
+226.81107355330616
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.85041254343671
+20
+-128.33585158973014
+30
+226.8244594235197
+11
+30.786525435598314
+21
+-128.05261874497964
+31
+225.85246271140701
+12
+29.575712629899126
+22
+-127.56433870650068
+32
+226.81107355330616
+13
+29.575712629899126
+23
+-127.56433870650068
+33
+226.81107355330616
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.15279687037095
+20
+-128.93973687096434
+30
+225.29816599482788
+11
+30.786525435598314
+21
+-128.05261874497964
+31
+225.85246271140701
+12
+30.85041254343671
+22
+-128.33585158973014
+32
+226.8244594235197
+13
+30.85041254343671
+23
+-128.33585158973014
+33
+226.8244594235197
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.15279687037095
+20
+-128.93973687096434
+30
+225.29816599482788
+11
+30.85041254343671
+21
+-128.33585158973014
+31
+226.8244594235197
+12
+32.115377278637034
+22
+-129.16273329975272
+32
+226.24399941515924
+13
+32.115377278637034
+23
+-129.16273329975272
+33
+226.24399941515924
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.81448477298295
+20
+-129.96101792340932
+30
+224.91727714238124
+11
+32.15279687037095
+21
+-128.93973687096434
+31
+225.29816599482788
+12
+32.115377278637034
+22
+-129.16273329975272
+32
+226.24399941515924
+13
+32.115377278637034
+23
+-129.16273329975272
+33
+226.24399941515924
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.81448477298295
+20
+-129.96101792340932
+30
+224.91727714238124
+11
+32.115377278637034
+21
+-129.16273329975272
+31
+226.24399941515924
+12
+32.82269882970503
+22
+-130.15724261177047
+32
+225.48708929943538
+13
+32.82269882970503
+23
+-130.15724261177047
+33
+225.48708929943538
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.64113550952024
+20
+-126.32401614146343
+30
+214.48725045127907
+11
+30.199676716454153
+21
+-127.01916871961018
+31
+215.81032203217993
+12
+28.433046072560877
+22
+-127.53908808768509
+32
+214.00657602087531
+13
+28.433046072560877
+23
+-127.53908808768509
+33
+214.00657602087531
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.199676716454153
+20
+-127.01916871961018
+30
+215.81032203217993
+11
+30.457963166715118
+21
+-128.5439410266866
+31
+215.4154388608736
+12
+28.433046072560877
+22
+-127.53908808768509
+32
+214.00657602087531
+13
+28.433046072560877
+23
+-127.53908808768509
+33
+214.00657602087531
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.39045466733528
+20
+-132.42158424815761
+30
+227.7572111979593
+11
+29.72721634277304
+21
+-132.751667638656
+31
+227.58593290408768
+12
+31.47437662999175
+22
+-132.890089705639
+32
+227.1664075626155
+13
+31.47437662999175
+23
+-132.890089705639
+33
+227.1664075626155
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.97452141706951
+20
+-132.31753952967776
+30
+227.25371994332787
+11
+28.39045466733528
+21
+-132.42158424815761
+31
+227.7572111979593
+12
+31.47437662999175
+22
+-132.890089705639
+32
+227.1664075626155
+13
+31.47437662999175
+23
+-132.890089705639
+33
+227.1664075626155
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.792653872561687
+20
+-131.65372205680475
+30
+228.24031942294698
+11
+28.39045466733528
+21
+-132.42158424815761
+31
+227.7572111979593
+12
+31.97452141706951
+22
+-132.31753952967776
+32
+227.25371994332787
+13
+31.97452141706951
+23
+-132.31753952967776
+33
+227.25371994332787
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.62829948728247
+20
+-131.50100144663844
+30
+227.37540967254412
+11
+27.792653872561687
+21
+-131.65372205680475
+31
+228.24031942294698
+12
+31.97452141706951
+22
+-132.31753952967776
+32
+227.25371994332787
+13
+31.97452141706951
+23
+-132.31753952967776
+33
+227.25371994332787
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.742456859260074
+20
+-130.47181056179443
+30
+228.58348445933615
+11
+32.62829948728247
+21
+-131.50100144663844
+31
+227.37540967254412
+12
+32.35084690466999
+22
+-130.67655353120017
+32
+227.67172416318564
+13
+32.35084690466999
+23
+-130.67655353120017
+33
+227.67172416318564
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.742456859260074
+20
+-130.47181056179443
+30
+228.58348445933615
+11
+27.792653872561687
+21
+-131.65372205680475
+31
+228.24031942294698
+12
+32.62829948728247
+22
+-131.50100144663844
+32
+227.37540967254412
+13
+32.62829948728247
+23
+-131.50100144663844
+33
+227.37540967254412
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.18844971683672
+20
+-129.6129852978526
+30
+228.92877906598707
+11
+32.35084690466999
+21
+-130.67655353120017
+31
+227.67172416318564
+12
+31.562905907996416
+22
+-129.73923839191397
+32
+228.07816785876705
+13
+31.562905907996416
+23
+-129.73923839191397
+33
+228.07816785876705
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.18844971683672
+20
+-129.6129852978526
+30
+228.92877906598707
+11
+27.742456859260074
+21
+-130.47181056179443
+31
+228.58348445933615
+12
+32.35084690466999
+22
+-130.67655353120017
+32
+227.67172416318564
+13
+32.35084690466999
+23
+-130.67655353120017
+33
+227.67172416318564
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.775298435980876
+20
+-128.83143301196284
+30
+228.85120186361212
+11
+28.47198678591001
+21
+-129.40520008521628
+31
+228.93608044974002
+12
+30.60672886068168
+22
+-128.8895398576634
+32
+228.61177732137924
+13
+30.60672886068168
+23
+-128.8895398576634
+33
+228.61177732137924
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.53798881384216
+20
+-128.61573796692747
+30
+228.72890368575
+11
+28.775298435980876
+21
+-128.83143301196284
+31
+228.85120186361212
+12
+30.60672886068168
+22
+-128.8895398576634
+32
+228.61177732137924
+13
+30.60672886068168
+23
+-128.8895398576634
+33
+228.61177732137924
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.72721634277304
+20
+-132.751667638656
+30
+227.58593290408768
+11
+30.753060760063914
+21
+-133.1279931262563
+31
+227.19317930304297
+12
+31.47437662999175
+22
+-132.890089705639
+32
+227.1664075626155
+13
+31.47437662999175
+23
+-132.890089705639
+33
+227.1664075626155
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.47198678591001
+20
+-129.40520008521628
+30
+228.93608044974002
+11
+28.18844971683672
+21
+-129.6129852978526
+31
+228.92877906598707
+12
+31.562905907996416
+22
+-129.73923839191397
+32
+228.07816785876705
+13
+31.562905907996416
+23
+-129.73923839191397
+33
+228.07816785876705
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.60672886068168
+20
+-128.8895398576634
+30
+228.61177732137924
+11
+28.47198678591001
+21
+-129.40520008521628
+31
+228.93608044974002
+12
+31.562905907996416
+22
+-129.73923839191397
+32
+228.07816785876705
+13
+31.562905907996416
+23
+-129.73923839191397
+33
+228.07816785876705
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.840387790943918
+20
+-125.47948942070487
+30
+216.11363368225125
+11
+31.660866140015273
+21
+-127.15941613253207
+31
+217.65118341089493
+12
+31.841575387901035
+22
+-128.76176564198377
+32
+217.34452529326987
+13
+31.841575387901035
+23
+-128.76176564198377
+33
+217.34452529326987
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.199676716454153
+20
+-127.01916871961018
+30
+215.81032203217993
+11
+29.840387790943918
+21
+-125.47948942070487
+31
+216.11363368225125
+12
+31.841575387901035
+22
+-128.76176564198377
+32
+217.34452529326987
+13
+31.841575387901035
+23
+-128.76176564198377
+33
+217.34452529326987
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.457963166715118
+20
+-128.5439410266866
+30
+215.4154388608736
+11
+30.199676716454153
+21
+-127.01916871961018
+31
+215.81032203217993
+12
+31.841575387901035
+22
+-128.76176564198377
+32
+217.34452529326987
+13
+31.841575387901035
+23
+-128.76176564198377
+33
+217.34452529326987
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.457963166715118
+20
+-128.5439410266866
+30
+215.4154388608736
+11
+31.841575387901035
+21
+-128.76176564198377
+31
+217.34452529326987
+12
+31.740877136974827
+22
+-129.40367896359797
+32
+216.8811916492801
+13
+31.740877136974827
+23
+-129.40367896359797
+33
+216.8811916492801
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.085288370991115
+20
+-129.16516709433412
+30
+214.9268545980713
+11
+30.457963166715118
+21
+-128.5439410266866
+31
+215.4154388608736
+12
+31.740877136974827
+22
+-129.40367896359797
+32
+216.8811916492801
+13
+31.740877136974827
+23
+-129.40367896359797
+33
+216.8811916492801
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.085288370991115
+20
+-129.16516709433412
+30
+214.9268545980713
+11
+31.740877136974827
+21
+-129.40367896359797
+31
+216.8811916492801
+12
+31.478635770514334
+22
+-130.32091529756346
+32
+216.50942952652468
+13
+31.478635770514334
+23
+-130.32091529756346
+33
+216.50942952652468
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.085288370991115
+20
+-129.16516709433412
+30
+214.9268545980713
+11
+31.478635770514334
+21
+-130.32091529756346
+31
+216.50942952652468
+12
+28.230128449093208
+22
+-131.95034077176538
+32
+215.2858392992576
+13
+28.230128449093208
+23
+-131.95034077176538
+33
+215.2858392992576
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.478635770514334
+20
+-130.32091529756346
+30
+216.50942952652468
+11
+29.3983498495668
+21
+-132.52897543418786
+31
+216.63446572329354
+12
+28.230128449093208
+22
+-131.95034077176538
+32
+215.2858392992576
+13
+28.230128449093208
+23
+-131.95034077176538
+33
+215.2858392992576
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.3983498495668
+20
+-132.52897543418786
+30
+216.63446572329354
+11
+26.266360443870013
+21
+-131.5006972223123
+31
+215.47993441735704
+12
+28.230128449093208
+22
+-131.95034077176538
+32
+215.2858392992576
+13
+28.230128449093208
+23
+-131.95034077176538
+33
+215.2858392992576
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.3983498495668
+20
+-132.52897543418786
+30
+216.63446572329354
+11
+27.44340434971175
+21
+-132.3546548970861
+31
+217.47686287379165
+12
+26.266360443870013
+22
+-131.5006972223123
+32
+215.47993441735704
+13
+26.266360443870013
+23
+-131.5006972223123
+33
+215.47993441735704
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.44340434971175
+20
+-132.3546548970861
+30
+217.47686287379165
+11
+24.255741892898662
+21
+-130.56977079381028
+31
+216.80483134419683
+12
+26.266360443870013
+22
+-131.5006972223123
+32
+215.47993441735704
+13
+26.266360443870013
+23
+-131.5006972223123
+33
+215.47993441735704
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.44340434971175
+20
+-132.3546548970861
+30
+217.47686287379165
+11
+25.267287767006646
+21
+-131.42737916046042
+31
+218.1352043088505
+12
+24.255741892898662
+22
+-130.56977079381028
+32
+216.80483134419683
+13
+24.255741892898662
+23
+-130.56977079381028
+33
+216.80483134419683
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.086549218785848
+20
+-123.09650029833269
+30
+216.77623425783295
+11
+24.820382236460883
+21
+-123.32740655952048
+31
+218.45920321289017
+12
+24.90069745774344
+22
+-124.46429285472144
+32
+220.30097726457373
+13
+24.90069745774344
+23
+-124.46429285472144
+33
+220.30097726457373
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.35670041764536
+20
+-123.90817079220425
+30
+220.06946255474077
+11
+27.086549218785848
+21
+-123.09650029833269
+31
+216.77623425783295
+12
+24.90069745774344
+22
+-124.46429285472144
+32
+220.30097726457373
+13
+24.90069745774344
+23
+-124.46429285472144
+33
+220.30097726457373
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.74032728899881
+20
+-123.7298953389018
+30
+216.138580076741
+11
+27.086549218785848
+21
+-123.09650029833269
+31
+216.77623425783295
+12
+27.35670041764536
+22
+-123.90817079220425
+32
+220.06946255474077
+13
+27.35670041764536
+23
+-123.90817079220425
+33
+220.06946255474077
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.03541023218008
+20
+-124.27476110146726
+30
+219.3861747251928
+11
+27.74032728899881
+21
+-123.7298953389018
+31
+216.138580076741
+12
+27.35670041764536
+22
+-123.90817079220425
+32
+220.06946255474077
+13
+27.35670041764536
+23
+-123.90817079220425
+33
+220.06946255474077
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.126677529092078
+20
+-124.06180407533876
+30
+216.78505676320077
+11
+27.74032728899881
+21
+-123.7298953389018
+31
+216.138580076741
+12
+29.03541023218008
+22
+-124.27476110146726
+32
+219.3861747251928
+13
+29.03541023218008
+23
+-124.27476110146726
+33
+219.3861747251928
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.755798778971272
+20
+-125.019806468592
+30
+218.45981166153575
+11
+29.126677529092078
+21
+-124.06180407533876
+31
+216.78505676320077
+12
+29.03541023218008
+22
+-124.27476110146726
+32
+219.3861747251928
+13
+29.03541023218008
+23
+-124.27476110146726
+33
+219.3861747251928
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.847993399019924
+20
+-124.94283771486235
+30
+216.45345225108707
+11
+29.126677529092078
+21
+-124.06180407533876
+31
+216.78505676320077
+12
+30.755798778971272
+22
+-125.019806468592
+32
+218.45981166153575
+13
+30.755798778971272
+23
+-125.019806468592
+33
+218.45981166153575
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.316484206333996
+20
+-125.75998424654816
+30
+217.8352391263345
+11
+29.847993399019924
+21
+-124.94283771486235
+31
+216.45345225108707
+12
+30.755798778971272
+22
+-125.019806468592
+32
+218.45981166153575
+13
+30.755798778971272
+23
+-125.019806468592
+33
+218.45981166153575
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.840387790943918
+20
+-125.47948942070487
+30
+216.11363368225125
+11
+29.847993399019924
+21
+-124.94283771486235
+31
+216.45345225108707
+12
+31.316484206333996
+22
+-125.75998424654816
+32
+217.8352391263345
+13
+31.316484206333996
+23
+-125.75998424654816
+33
+217.8352391263345
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.840387790943918
+20
+-125.47948942070487
+30
+216.11363368225125
+11
+31.316484206333996
+21
+-125.75998424654816
+31
+217.8352391263345
+12
+31.660866140015273
+22
+-127.15941613253207
+32
+217.65118341089493
+13
+31.660866140015273
+23
+-127.15941613253207
+33
+217.65118341089493
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.660866140015273
+20
+-127.15941613253207
+30
+217.65118341089493
+11
+32.41382133953927
+21
+-128.08395385025113
+31
+219.26539766894456
+12
+32.54676736870775
+22
+-129.20897539685288
+32
+218.85378215987154
+13
+32.54676736870775
+23
+-129.20897539685288
+33
+218.85378215987154
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.841575387901035
+20
+-128.76176564198377
+30
+217.34452529326987
+11
+31.660866140015273
+21
+-127.15941613253207
+31
+217.65118341089493
+12
+32.54676736870775
+22
+-129.20897539685288
+32
+218.85378215987154
+13
+32.54676736870775
+23
+-129.20897539685288
+33
+218.85378215987154
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.740877136974827
+20
+-129.40367896359797
+30
+216.8811916492801
+11
+31.841575387901035
+21
+-128.76176564198377
+31
+217.34452529326987
+12
+32.54676736870775
+22
+-129.20897539685288
+32
+218.85378215987154
+13
+32.54676736870775
+23
+-129.20897539685288
+33
+218.85378215987154
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.740877136974827
+20
+-129.40367896359797
+30
+216.8811916492801
+11
+32.54676736870775
+21
+-129.20897539685288
+31
+218.85378215987154
+12
+32.415342461154474
+22
+-130.2774112193692
+32
+218.3530289241474
+13
+32.415342461154474
+23
+-130.2774112193692
+33
+218.3530289241474
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.478635770514334
+20
+-130.32091529756346
+30
+216.50942952652468
+11
+31.740877136974827
+21
+-129.40367896359797
+31
+216.8811916492801
+12
+32.415342461154474
+22
+-130.2774112193692
+32
+218.3530289241474
+13
+32.415342461154474
+23
+-130.2774112193692
+33
+218.3530289241474
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.478635770514334
+20
+-130.32091529756346
+30
+216.50942952652468
+11
+32.415342461154474
+21
+-130.2774112193692
+31
+218.3530289241474
+12
+32.15249264604791
+22
+-131.49826342772897
+32
+218.47350175607087
+13
+32.15249264604791
+23
+-131.49826342772897
+33
+218.47350175607087
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.478635770514334
+20
+-130.32091529756346
+30
+216.50942952652468
+11
+32.15249264604791
+21
+-131.49826342772897
+31
+218.47350175607087
+12
+29.3983498495668
+22
+-132.52897543418786
+32
+216.63446572329354
+13
+29.3983498495668
+23
+-132.52897543418786
+33
+216.63446572329354
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.15249264604791
+20
+-131.49826342772897
+30
+218.47350175607087
+11
+30.886311013555435
+21
+-132.87244469490054
+31
+218.71414319559491
+12
+29.3983498495668
+22
+-132.52897543418786
+32
+216.63446572329354
+13
+29.3983498495668
+23
+-132.52897543418786
+33
+216.63446572329354
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.886311013555435
+20
+-132.87244469490054
+30
+218.71414319559491
+11
+27.44340434971175
+21
+-132.3546548970861
+31
+217.47686287379165
+12
+29.3983498495668
+22
+-132.52897543418786
+32
+216.63446572329354
+13
+29.3983498495668
+23
+-132.52897543418786
+33
+216.63446572329354
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.886311013555435
+20
+-132.87244469490054
+30
+218.71414319559491
+11
+28.543479501824397
+21
+-132.69447346592227
+31
+219.23375833934725
+12
+27.44340434971175
+22
+-132.3546548970861
+32
+217.47686287379165
+13
+27.44340434971175
+23
+-132.3546548970861
+33
+217.47686287379165
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.74032728899881
+20
+-123.7298953389018
+30
+216.138580076741
+11
+27.76709902942634
+21
+-124.90998148797394
+31
+215.33360251797677
+12
+27.29068373954569
+22
+-124.25620341776086
+32
+215.7184462866226
+13
+27.29068373954569
+23
+-124.25620341776086
+33
+215.7184462866226
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.74032728899881
+20
+-123.7298953389018
+30
+216.138580076741
+11
+28.273328302964885
+21
+-124.52148702745174
+31
+215.54564687113574
+12
+27.76709902942634
+22
+-124.90998148797394
+32
+215.33360251797677
+13
+27.76709902942634
+23
+-124.90998148797394
+33
+215.33360251797677
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.76709902942634
+20
+-124.90998148797394
+30
+215.33360251797677
+11
+28.684943812038
+21
+-125.65715642535986
+31
+214.95180099256143
+12
+27.99770106629064
+22
+-126.30971759828056
+32
+214.3953747057211
+13
+27.99770106629064
+23
+-126.30971759828056
+33
+214.3953747057211
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.684943812038
+20
+-125.65715642535986
+30
+214.95180099256143
+11
+28.64113550952024
+21
+-126.32401614146343
+31
+214.48725045127907
+12
+27.99770106629064
+22
+-126.30971759828056
+32
+214.3953747057211
+13
+27.99770106629064
+23
+-126.30971759828056
+33
+214.3953747057211
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.76709902942634
+20
+-124.90998148797394
+30
+215.33360251797677
+11
+28.568121671990646
+21
+-125.170701732819
+31
+215.21465080766805
+12
+28.684943812038
+22
+-125.65715642535986
+32
+214.95180099256143
+13
+28.684943812038
+23
+-125.65715642535986
+33
+214.95180099256143
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.273328302964885
+20
+-124.52148702745174
+30
+215.54564687113574
+11
+28.568121671990646
+21
+-125.170701732819
+31
+215.21465080766805
+12
+27.76709902942634
+22
+-124.90998148797394
+32
+215.33360251797677
+13
+27.76709902942634
+23
+-124.90998148797394
+33
+215.33360251797677
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.99770106629064
+20
+-126.30971759828056
+30
+214.3953747057211
+11
+28.64113550952024
+21
+-126.32401614146343
+31
+214.48725045127907
+12
+27.817904491374
+22
+-127.2655904212721
+32
+213.98862678581642
+13
+27.817904491374
+23
+-127.2655904212721
+33
+213.98862678581642
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.64113550952024
+20
+-126.32401614146343
+30
+214.48725045127907
+11
+28.433046072560877
+21
+-127.53908808768509
+31
+214.00657602087531
+12
+27.817904491374
+22
+-127.2655904212721
+32
+213.98862678581642
+13
+27.817904491374
+23
+-127.2655904212721
+33
+213.98862678581642
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.716612441969207
+20
+-123.72411507676401
+30
+216.12762800111153
+11
+24.779311952850485
+21
+-123.83272316008969
+31
+217.21948909650203
+12
+24.820382236460883
+22
+-123.32740655952048
+32
+218.45920321289017
+13
+24.820382236460883
+23
+-123.32740655952048
+33
+218.45920321289017
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.086549218785848
+20
+-123.09650029833269
+30
+216.77623425783295
+11
+26.716612441969207
+21
+-123.72411507676401
+31
+216.12762800111153
+12
+24.820382236460883
+22
+-123.32740655952048
+32
+218.45920321289017
+13
+24.820382236460883
+23
+-123.32740655952048
+33
+218.45920321289017
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.086549218785848
+20
+-123.09650029833269
+30
+216.77623425783295
+11
+27.29068373954569
+21
+-124.25620341776086
+31
+215.7184462866226
+12
+26.716612441969207
+22
+-123.72411507676401
+32
+216.12762800111153
+13
+26.716612441969207
+23
+-123.72411507676401
+33
+216.12762800111153
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.086549218785848
+20
+-123.09650029833269
+30
+216.77623425783295
+11
+27.74032728899881
+21
+-123.7298953389018
+31
+216.138580076741
+12
+27.29068373954569
+22
+-124.25620341776086
+32
+215.7184462866226
+13
+27.29068373954569
+23
+-124.25620341776086
+33
+215.7184462866226
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.575756580401706
+20
+-131.0069411460182
+30
+214.6579202965034
+11
+26.266360443870013
+21
+-131.5006972223123
+31
+215.47993441735704
+12
+24.255741892898662
+22
+-130.56977079381028
+32
+216.80483134419683
+13
+24.255741892898662
+23
+-130.56977079381028
+33
+216.80483134419683
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.575756580401706
+20
+-131.0069411460182
+30
+214.6579202965034
+11
+24.255741892898662
+21
+-130.56977079381028
+31
+216.80483134419683
+12
+24.98496759522553
+22
+-130.8025024009356
+32
+215.7330490541268
+13
+24.98496759522553
+23
+-130.8025024009356
+33
+215.7330490541268
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.230128449093208
+20
+-131.95034077176538
+30
+215.2858392992576
+11
+26.266360443870013
+21
+-131.5006972223123
+31
+215.47993441735704
+12
+27.53771388985416
+22
+-131.14049562383275
+32
+214.5487037645317
+13
+27.53771388985416
+23
+-131.14049562383275
+33
+214.5487037645317
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.53771388985416
+20
+-131.14049562383275
+30
+214.5487037645317
+11
+26.266360443870013
+21
+-131.5006972223123
+31
+215.47993441735704
+12
+26.575756580401706
+22
+-131.0069411460182
+32
+214.6579202965034
+13
+26.575756580401706
+23
+-131.0069411460182
+33
+214.6579202965034
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.49449938581496
+20
+-128.534814296995
+30
+214.0500800990701
+11
+30.085288370991115
+21
+-129.16516709433412
+31
+214.9268545980713
+12
+27.53771388985416
+22
+-131.14049562383275
+32
+214.5487037645317
+13
+27.53771388985416
+23
+-131.14049562383275
+33
+214.5487037645317
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.085288370991115
+20
+-129.16516709433412
+30
+214.9268545980713
+11
+28.230128449093208
+21
+-131.95034077176538
+31
+215.2858392992576
+12
+27.53771388985416
+22
+-131.14049562383275
+32
+214.5487037645317
+13
+27.53771388985416
+23
+-131.14049562383275
+33
+214.5487037645317
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.820382236460883
+20
+-123.32740655952048
+30
+218.45920321289017
+11
+23.00933484140379
+21
+-124.61488389462582
+31
+218.63534909593002
+12
+23.48787970154569
+22
+-125.30121396740444
+32
+220.20088746229337
+13
+23.48787970154569
+23
+-125.30121396740444
+33
+220.20088746229337
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.90069745774344
+20
+-124.46429285472144
+30
+220.30097726457373
+11
+24.820382236460883
+21
+-123.32740655952048
+31
+218.45920321289017
+12
+23.48787970154569
+22
+-125.30121396740444
+32
+220.20088746229337
+13
+23.48787970154569
+23
+-125.30121396740444
+33
+220.20088746229337
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.00933484140379
+20
+-124.61488389462582
+30
+218.63534909593002
+11
+22.124650510003438
+21
+-126.46395933006299
+31
+218.9350100541239
+12
+22.53930826230697
+22
+-127.31061562108367
+32
+220.33109547255424
+13
+22.53930826230697
+23
+-127.31061562108367
+33
+220.33109547255424
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.00933484140379
+20
+-124.61488389462582
+30
+218.63534909593002
+11
+22.53930826230697
+21
+-127.31061562108367
+31
+220.33109547255424
+12
+23.48787970154569
+22
+-125.30121396740444
+32
+220.20088746229337
+13
+23.48787970154569
+23
+-125.30121396740444
+33
+220.20088746229337
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.90069745774344
+20
+-124.46429285472144
+30
+220.30097726457373
+11
+23.48787970154569
+21
+-125.30121396740444
+31
+220.20088746229337
+12
+24.497904454038483
+22
+-126.29633172806881
+32
+222.26261569953547
+13
+24.497904454038483
+23
+-126.29633172806881
+33
+222.26261569953547
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.90069745774344
+20
+-124.46429285472144
+30
+220.30097726457373
+11
+24.497904454038483
+21
+-126.29633172806881
+31
+222.26261569953547
+12
+25.480853241780725
+22
+-125.44480784787996
+32
+222.56105976043793
+13
+25.480853241780725
+23
+-125.44480784787996
+33
+222.56105976043793
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.48787970154569
+20
+-125.30121396740444
+30
+220.20088746229337
+11
+22.53930826230697
+21
+-127.31061562108367
+31
+220.33109547255424
+12
+23.407868704586186
+22
+-128.0273681261663
+32
+221.85069596613883
+13
+23.407868704586186
+23
+-128.0273681261663
+33
+221.85069596613883
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.48787970154569
+20
+-125.30121396740444
+30
+220.20088746229337
+11
+23.407868704586186
+21
+-128.0273681261663
+31
+221.85069596613883
+12
+24.497904454038483
+22
+-126.29633172806881
+32
+222.26261569953547
+13
+24.497904454038483
+23
+-126.29633172806881
+33
+222.26261569953547
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.497904454038483
+20
+-126.29633172806881
+30
+222.26261569953547
+11
+25.20340065916823
+21
+-127.0143011304436
+31
+223.6885151016235
+12
+25.480853241780725
+22
+-125.44480784787996
+32
+222.56105976043793
+13
+25.480853241780725
+23
+-125.44480784787996
+33
+222.56105976043793
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.480853241780725
+20
+-125.44480784787996
+30
+222.56105976043793
+11
+25.20340065916823
+21
+-127.0143011304436
+31
+223.6885151016235
+12
+25.84774777536697
+22
+-126.34622451704783
+32
+223.94254241136238
+13
+25.84774777536697
+23
+-126.34622451704783
+33
+223.94254241136238
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.407868704586186
+20
+-128.0273681261663
+30
+221.85069596613883
+11
+24.20006884178233
+21
+-128.6619800640282
+31
+223.38246543264515
+12
+24.497904454038483
+22
+-126.29633172806881
+32
+222.26261569953547
+13
+24.497904454038483
+23
+-126.29633172806881
+33
+222.26261569953547
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.497904454038483
+20
+-126.29633172806881
+30
+222.26261569953547
+11
+24.20006884178233
+21
+-128.6619800640282
+31
+223.38246543264515
+12
+25.20340065916823
+22
+-127.0143011304436
+32
+223.6885151016235
+13
+25.20340065916823
+23
+-127.0143011304436
+33
+223.6885151016235
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.20340065916823
+20
+-127.0143011304436
+30
+223.6885151016235
+11
+25.87573641308665
+21
+-127.79372384607237
+31
+224.85856184803538
+12
+25.84774777536697
+22
+-126.34622451704783
+32
+223.94254241136238
+13
+25.84774777536697
+23
+-126.34622451704783
+33
+223.94254241136238
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.84774777536697
+20
+-126.34622451704783
+30
+223.94254241136238
+11
+25.87573641308665
+21
+-127.79372384607237
+31
+224.85856184803538
+12
+26.543813026482482
+22
+-127.10526420303292
+32
+225.16217772242948
+13
+26.543813026482482
+23
+-127.10526420303292
+33
+225.16217772242948
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.20006884178233
+20
+-128.6619800640282
+30
+223.38246543264515
+11
+25.329045304583783
+21
+-129.3601748854054
+31
+225.04870204993503
+12
+25.20340065916823
+22
+-127.0143011304436
+32
+223.6885151016235
+13
+25.20340065916823
+23
+-127.0143011304436
+33
+223.6885151016235
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.53798881384216
+20
+-128.61573796692747
+30
+228.72890368575
+11
+28.143120292703767
+21
+-127.45451372588334
+31
+227.1950046489827
+12
+28.775298435980876
+22
+-128.83143301196284
+32
+228.85120186361212
+13
+28.775298435980876
+23
+-128.83143301196284
+33
+228.85120186361212
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.85041254343671
+20
+-128.33585158973014
+30
+226.8244594235197
+11
+29.575712629899126
+21
+-127.56433870650068
+31
+226.81107355330616
+12
+30.60672886068168
+22
+-128.8895398576634
+32
+228.61177732137924
+13
+30.60672886068168
+23
+-128.8895398576634
+33
+228.61177732137924
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.60672886068168
+20
+-128.8895398576634
+30
+228.61177732137924
+11
+29.575712629899126
+21
+-127.56433870650068
+31
+226.81107355330616
+12
+29.53798881384216
+22
+-128.61573796692747
+32
+228.72890368575
+13
+29.53798881384216
+23
+-128.61573796692747
+33
+228.72890368575
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.115377278637034
+20
+-129.16273329975272
+30
+226.24399941515924
+11
+30.85041254343671
+21
+-128.33585158973014
+31
+226.8244594235197
+12
+31.562905907996416
+22
+-129.73923839191397
+32
+228.07816785876705
+13
+31.562905907996416
+23
+-129.73923839191397
+33
+228.07816785876705
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.85041254343671
+20
+-128.33585158973014
+30
+226.8244594235197
+11
+30.60672886068168
+21
+-128.8895398576634
+31
+228.61177732137924
+12
+31.562905907996416
+22
+-129.73923839191397
+32
+228.07816785876705
+13
+31.562905907996416
+23
+-129.73923839191397
+33
+228.07816785876705
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.82269882970503
+20
+-130.15724261177047
+30
+225.48708929943538
+11
+32.115377278637034
+21
+-129.16273329975272
+31
+226.24399941515924
+12
+32.35084690466999
+22
+-130.67655353120017
+32
+227.67172416318564
+13
+32.35084690466999
+23
+-130.67655353120017
+33
+227.67172416318564
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.115377278637034
+20
+-129.16273329975272
+30
+226.24399941515924
+11
+31.562905907996416
+21
+-129.73923839191397
+31
+228.07816785876705
+12
+32.35084690466999
+22
+-130.67655353120017
+32
+227.67172416318564
+13
+32.35084690466999
+23
+-130.67655353120017
+33
+227.67172416318564
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.255741892898662
+20
+-130.56977079381028
+30
+216.80483134419683
+11
+25.267287767006646
+21
+-131.42737916046042
+31
+218.1352043088505
+12
+22.82345378002633
+22
+-128.85972587400278
+32
+218.06127779835242
+13
+22.82345378002633
+23
+-128.85972587400278
+33
+218.06127779835242
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.82345378002633
+20
+-128.85972587400278
+30
+218.06127779835242
+11
+25.267287767006646
+21
+-131.42737916046042
+31
+218.1352043088505
+12
+23.106382400453533
+22
+-129.34435522060573
+32
+219.06035047521567
+13
+23.106382400453533
+23
+-129.34435522060573
+33
+219.06035047521567
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.82345378002633
+20
+-128.85972587400278
+30
+218.06127779835242
+11
+23.106382400453533
+21
+-129.34435522060573
+31
+219.06035047521567
+12
+22.53930826230697
+22
+-127.31061562108367
+32
+220.33109547255424
+13
+22.53930826230697
+23
+-127.31061562108367
+33
+220.33109547255424
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.82345378002633
+20
+-128.85972587400278
+30
+218.06127779835242
+11
+22.53930826230697
+21
+-127.31061562108367
+31
+220.33109547255424
+12
+22.124650510003438
+22
+-126.46395933006299
+32
+218.9350100541239
+13
+22.124650510003438
+23
+-126.46395933006299
+33
+218.9350100541239
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.801230754276904
+20
+-127.82597162431244
+30
+216.421204472844
+11
+23.146844235417845
+21
+-128.1463198364737
+31
+216.99162507854396
+12
+23.920486688908568
+22
+-126.40889472759216
+32
+216.67857825013627
+13
+23.920486688908568
+23
+-126.40889472759216
+33
+216.67857825013627
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.636964270002807
+20
+-126.3182358793265
+30
+217.58942587331802
+11
+23.920486688908568
+21
+-126.40889472759216
+31
+216.67857825013627
+12
+23.146844235417845
+22
+-128.1463198364737
+32
+216.99162507854396
+13
+23.146844235417845
+23
+-128.1463198364737
+33
+216.99162507854396
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.801230754276904
+20
+-127.82597162431244
+30
+216.421204472844
+11
+25.22834705365753
+21
+-128.5901831237888
+31
+215.99133550438802
+12
+24.486952378409043
+22
+-129.65983584359748
+32
+216.17752079008847
+13
+24.486952378409043
+23
+-129.65983584359748
+33
+216.17752079008847
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.801230754276904
+20
+-127.82597162431244
+30
+216.421204472844
+11
+24.486952378409043
+21
+-129.65983584359748
+31
+216.17752079008847
+12
+23.146844235417845
+22
+-128.1463198364737
+32
+216.99162507854396
+13
+23.146844235417845
+23
+-128.1463198364737
+33
+216.99162507854396
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.146844235417845
+20
+-128.1463198364737
+30
+216.99162507854396
+11
+22.82345378002633
+21
+-128.85972587400278
+31
+218.06127779835242
+12
+22.636964270002807
+22
+-126.3182358793265
+32
+217.58942587331802
+13
+22.636964270002807
+23
+-126.3182358793265
+33
+217.58942587331802
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.636964270002807
+20
+-126.3182358793265
+30
+217.58942587331802
+11
+22.82345378002633
+21
+-128.85972587400278
+31
+218.06127779835242
+12
+22.124650510003438
+22
+-126.46395933006299
+32
+218.9350100541239
+13
+22.124650510003438
+23
+-126.46395933006299
+33
+218.9350100541239
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.486952378409043
+20
+-129.65983584359748
+30
+216.17752079008847
+11
+24.255741892898662
+21
+-130.56977079381028
+31
+216.80483134419683
+12
+23.146844235417845
+22
+-128.1463198364737
+32
+216.99162507854396
+13
+23.146844235417845
+23
+-128.1463198364737
+33
+216.99162507854396
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.255741892898662
+20
+-130.56977079381028
+30
+216.80483134419683
+11
+22.82345378002633
+21
+-128.85972587400278
+31
+218.06127779835242
+12
+23.146844235417845
+22
+-128.1463198364737
+32
+216.99162507854396
+13
+23.146844235417845
+23
+-128.1463198364737
+33
+216.99162507854396
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.22834705365753
+20
+-128.5901831237888
+30
+215.99133550438802
+11
+25.319614350569534
+21
+-129.98018405575868
+31
+215.7689475242454
+12
+24.486952378409043
+22
+-129.65983584359748
+32
+216.17752079008847
+13
+24.486952378409043
+23
+-129.65983584359748
+33
+216.17752079008847
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.22834705365753
+20
+-128.5901831237888
+30
+215.99133550438802
+11
+26.53985811028296
+21
+-128.88801873604473
+31
+215.1720594024415
+12
+26.517041286054965
+22
+-130.10795827143508
+32
+214.8048606445319
+13
+26.517041286054965
+23
+-130.10795827143508
+33
+214.8048606445319
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.22834705365753
+20
+-128.5901831237888
+30
+215.99133550438802
+11
+26.517041286054965
+21
+-130.10795827143508
+31
+214.8048606445319
+12
+25.319614350569534
+22
+-129.98018405575868
+32
+215.7689475242454
+13
+25.319614350569534
+23
+-129.98018405575868
+33
+215.7689475242454
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.86933305213528
+20
+-128.8740244171848
+30
+214.85992524700248
+11
+27.06494929185001
+21
+-130.09913576606678
+31
+214.34426501944938
+12
+26.53985811028296
+22
+-128.88801873604473
+32
+215.1720594024415
+13
+26.53985811028296
+23
+-128.88801873604473
+33
+215.1720594024415
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.53985811028296
+20
+-128.88801873604473
+30
+215.1720594024415
+11
+27.06494929185001
+21
+-130.09913576606678
+31
+214.34426501944938
+12
+26.517041286054965
+22
+-130.10795827143508
+32
+214.8048606445319
+13
+26.517041286054965
+23
+-130.10795827143508
+33
+214.8048606445319
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.817904491374
+20
+-127.2655904212721
+30
+213.98862678581642
+11
+27.820034061635276
+21
+-128.03041036939467
+31
+213.94208046439104
+12
+27.100543537645695
+22
+-127.4429532016045
+32
+214.2624286765523
+13
+27.100543537645695
+23
+-127.4429532016045
+33
+214.2624286765523
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.100543537645695
+20
+-127.4429532016045
+30
+214.2624286765523
+11
+27.820034061635276
+21
+-128.03041036939467
+31
+213.94208046439104
+12
+26.86933305213528
+22
+-128.8740244171848
+32
+214.85992524700248
+13
+26.86933305213528
+23
+-128.8740244171848
+33
+214.85992524700248
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.820034061635276
+20
+-128.03041036939467
+30
+213.94208046439104
+11
+27.06494929185001
+21
+-130.09913576606678
+31
+214.34426501944938
+12
+26.86933305213528
+22
+-128.8740244171848
+32
+214.85992524700248
+13
+26.86933305213528
+23
+-128.8740244171848
+33
+214.85992524700248
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.645757475035925
+20
+-125.63373115248633
+30
+216.9307802139366
+11
+23.920486688908568
+21
+-126.40889472759216
+31
+216.67857825013627
+12
+22.636964270002807
+22
+-126.3182358793265
+32
+217.58942587331802
+13
+22.636964270002807
+23
+-126.3182358793265
+33
+217.58942587331802
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.351891429146825
+20
+-124.85856757738051
+30
+217.37494772557488
+11
+24.645757475035925
+21
+-125.63373115248633
+31
+216.9307802139366
+12
+22.636964270002807
+22
+-126.3182358793265
+32
+217.58942587331802
+13
+22.636964270002807
+23
+-126.3182358793265
+33
+217.58942587331802
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.351891429146825
+20
+-124.85856757738051
+30
+217.37494772557488
+11
+25.27823984263606
+21
+-124.92914762032574
+31
+216.66549660424585
+12
+24.645757475035925
+22
+-125.63373115248633
+32
+216.9307802139366
+13
+24.645757475035925
+23
+-125.63373115248633
+33
+216.9307802139366
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.779311952850485
+20
+-123.83272316008969
+30
+217.21948909650203
+11
+25.27823984263606
+21
+-124.92914762032574
+31
+216.66549660424585
+12
+23.351891429146825
+22
+-124.85856757738051
+32
+217.37494772557488
+13
+23.351891429146825
+23
+-124.85856757738051
+33
+217.37494772557488
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.29068373954569
+20
+-124.25620341776086
+30
+215.7184462866226
+11
+27.200633339925837
+21
+-125.45667259647672
+31
+215.65090848690738
+12
+26.158056584867765
+22
+-124.89629139343737
+32
+216.4501057835336
+13
+26.158056584867765
+23
+-124.89629139343737
+33
+216.4501057835336
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.29068373954569
+20
+-124.25620341776086
+30
+215.7184462866226
+11
+27.76709902942634
+21
+-124.90998148797394
+31
+215.33360251797677
+12
+27.200633339925837
+22
+-125.45667259647672
+32
+215.65090848690738
+13
+27.200633339925837
+23
+-125.45667259647672
+33
+215.65090848690738
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.35670041764536
+20
+-126.4350580193731
+30
+214.75131716367778
+11
+27.200633339925837
+21
+-125.45667259647672
+31
+215.65090848690738
+12
+27.76709902942634
+22
+-124.90998148797394
+32
+215.33360251797677
+13
+27.76709902942634
+23
+-124.90998148797394
+33
+215.33360251797677
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.76709902942634
+20
+-124.90998148797394
+30
+215.33360251797677
+11
+27.99770106629064
+21
+-126.30971759828056
+31
+214.3953747057211
+12
+27.35670041764536
+22
+-126.4350580193731
+32
+214.75131716367778
+13
+27.35670041764536
+23
+-126.4350580193731
+33
+214.75131716367778
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.99770106629064
+20
+-126.30971759828056
+30
+214.3953747057211
+11
+27.100543537645695
+21
+-127.4429532016045
+31
+214.2624286765523
+12
+27.35670041764536
+22
+-126.4350580193731
+32
+214.75131716367778
+13
+27.35670041764536
+23
+-126.4350580193731
+33
+214.75131716367778
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.99770106629064
+20
+-126.30971759828056
+30
+214.3953747057211
+11
+27.817904491374
+21
+-127.2655904212721
+31
+213.98862678581642
+12
+27.100543537645695
+22
+-127.4429532016045
+32
+214.2624286765523
+13
+27.100543537645695
+23
+-127.4429532016045
+33
+214.2624286765523
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.779311952850485
+20
+-123.83272316008969
+30
+217.21948909650203
+11
+26.158056584867765
+21
+-124.89629139343737
+31
+216.4501057835336
+12
+25.27823984263606
+22
+-124.92914762032574
+32
+216.66549660424585
+13
+25.27823984263606
+23
+-124.92914762032574
+33
+216.66549660424585
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.716612441969207
+20
+-123.72411507676401
+30
+216.12762800111153
+11
+26.158056584867765
+21
+-124.89629139343737
+31
+216.4501057835336
+12
+24.779311952850485
+22
+-123.83272316008969
+32
+217.21948909650203
+13
+24.779311952850485
+23
+-123.83272316008969
+33
+217.21948909650203
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.716612441969207
+20
+-123.72411507676401
+30
+216.12762800111153
+11
+27.29068373954569
+21
+-124.25620341776086
+31
+215.7184462866226
+12
+26.158056584867765
+22
+-124.89629139343737
+32
+216.4501057835336
+13
+26.158056584867765
+23
+-124.89629139343737
+33
+216.4501057835336
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.486952378409043
+20
+-129.65983584359748
+30
+216.17752079008847
+11
+25.319614350569534
+21
+-129.98018405575868
+31
+215.7689475242454
+12
+24.98496759522553
+22
+-130.8025024009356
+32
+215.7330490541268
+13
+24.98496759522553
+23
+-130.8025024009356
+33
+215.7330490541268
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.98496759522553
+20
+-130.8025024009356
+30
+215.7330490541268
+11
+24.255741892898662
+21
+-130.56977079381028
+31
+216.80483134419683
+12
+24.486952378409043
+22
+-129.65983584359748
+32
+216.17752079008847
+13
+24.486952378409043
+23
+-129.65983584359748
+33
+216.17752079008847
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.319614350569534
+20
+-129.98018405575868
+30
+215.7689475242454
+11
+26.517041286054965
+21
+-130.10795827143508
+31
+214.8048606445319
+12
+26.575756580401706
+22
+-131.0069411460182
+32
+214.6579202965034
+13
+26.575756580401706
+23
+-131.0069411460182
+33
+214.6579202965034
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.319614350569534
+20
+-129.98018405575868
+30
+215.7689475242454
+11
+26.575756580401706
+21
+-131.0069411460182
+31
+214.6579202965034
+12
+24.98496759522553
+22
+-130.8025024009356
+32
+215.7330490541268
+13
+24.98496759522553
+23
+-130.8025024009356
+33
+215.7330490541268
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.06494929185001
+20
+-130.09913576606678
+30
+214.34426501944938
+11
+27.53771388985416
+21
+-131.14049562383275
+31
+214.5487037645317
+12
+26.517041286054965
+22
+-130.10795827143508
+32
+214.8048606445319
+13
+26.517041286054965
+23
+-130.10795827143508
+33
+214.8048606445319
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.517041286054965
+20
+-130.10795827143508
+30
+214.8048606445319
+11
+27.53771388985416
+21
+-131.14049562383275
+31
+214.5487037645317
+12
+26.575756580401706
+22
+-131.0069411460182
+32
+214.6579202965034
+13
+26.575756580401706
+23
+-131.0069411460182
+33
+214.6579202965034
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.817904491374
+20
+-127.2655904212721
+30
+213.98862678581642
+11
+28.433046072560877
+21
+-127.53908808768509
+31
+214.00657602087531
+12
+27.820034061635276
+22
+-128.03041036939467
+32
+213.94208046439104
+13
+27.820034061635276
+23
+-128.03041036939467
+33
+213.94208046439104
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.433046072560877
+20
+-127.53908808768509
+30
+214.00657602087531
+11
+28.49449938581496
+21
+-128.534814296995
+31
+214.0500800990701
+12
+27.820034061635276
+22
+-128.03041036939467
+32
+213.94208046439104
+13
+27.820034061635276
+23
+-128.03041036939467
+33
+213.94208046439104
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.820034061635276
+20
+-128.03041036939467
+30
+213.94208046439104
+11
+28.49449938581496
+21
+-128.534814296995
+31
+214.0500800990701
+12
+27.06494929185001
+22
+-130.09913576606678
+32
+214.34426501944938
+13
+27.06494929185001
+23
+-130.09913576606678
+33
+214.34426501944938
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.49449938581496
+20
+-128.534814296995
+30
+214.0500800990701
+11
+27.53771388985416
+21
+-131.14049562383275
+31
+214.5487037645317
+12
+27.06494929185001
+22
+-130.09913576606678
+32
+214.34426501944938
+13
+27.06494929185001
+23
+-130.09913576606678
+33
+214.34426501944938
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.351891429146825
+20
+-124.85856757738051
+30
+217.37494772557488
+11
+22.636964270002807
+21
+-126.3182358793265
+31
+217.58942587331802
+12
+22.124650510003438
+22
+-126.46395933006299
+32
+218.9350100541239
+13
+22.124650510003438
+23
+-126.46395933006299
+33
+218.9350100541239
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.351891429146825
+20
+-124.85856757738051
+30
+217.37494772557488
+11
+22.124650510003438
+21
+-126.46395933006299
+31
+218.9350100541239
+12
+23.00933484140379
+22
+-124.61488389462582
+32
+218.63534909593002
+13
+23.00933484140379
+23
+-124.61488389462582
+33
+218.63534909593002
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.779311952850485
+20
+-123.83272316008969
+30
+217.21948909650203
+11
+23.351891429146825
+21
+-124.85856757738051
+31
+217.37494772557488
+12
+23.00933484140379
+22
+-124.61488389462582
+32
+218.63534909593002
+13
+23.00933484140379
+23
+-124.61488389462582
+33
+218.63534909593002
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.820382236460883
+20
+-123.32740655952048
+30
+218.45920321289017
+11
+24.779311952850485
+21
+-123.83272316008969
+31
+217.21948909650203
+12
+23.00933484140379
+22
+-124.61488389462582
+32
+218.63534909593002
+13
+23.00933484140379
+23
+-124.61488389462582
+33
+218.63534909593002
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.83252190904746
+20
+-126.55157593509756
+30
+215.19457200234686
+11
+26.45589219712392
+21
+-127.5987160550012
+31
+215.17875233754881
+12
+25.24690473736297
+22
+-126.98813783866031
+32
+216.3837848811103
+13
+25.24690473736297
+23
+-126.98813783866031
+33
+216.3837848811103
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.83252190904746
+20
+-126.55157593509756
+30
+215.19457200234686
+11
+25.24690473736297
+21
+-126.98813783866031
+31
+216.3837848811103
+12
+26.267577341162156
+22
+-126.61941795913569
+32
+216.0406198447213
+13
+26.267577341162156
+23
+-126.61941795913569
+33
+216.0406198447213
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.970654401875137
+20
+-125.58262146621543
+30
+216.3913904891867
+11
+26.267577341162156
+21
+-126.61941795913569
+31
+216.0406198447213
+12
+25.24690473736297
+22
+-126.98813783866031
+32
+216.3837848811103
+13
+25.24690473736297
+23
+-126.98813783866031
+33
+216.3837848811103
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.24690473736297
+20
+-126.98813783866031
+30
+216.3837848811103
+11
+25.757088927101037
+21
+-125.96716101053805
+31
+216.54076463179922
+12
+25.970654401875137
+22
+-125.58262146621543
+32
+216.3913904891867
+13
+25.970654401875137
+23
+-125.58262146621543
+33
+216.3913904891867
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.83252190904746
+20
+-126.55157593509756
+30
+215.19457200234686
+11
+25.970654401875137
+21
+-125.58262146621543
+31
+216.3913904891867
+12
+26.62351979911896
+22
+-125.93187098906527
+32
+215.99011860709686
+13
+26.62351979911896
+23
+-125.93187098906527
+33
+215.99011860709686
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.83252190904746
+20
+-126.55157593509756
+30
+215.19457200234686
+11
+26.267577341162156
+21
+-126.61941795913569
+31
+216.0406198447213
+12
+25.970654401875137
+22
+-125.58262146621543
+32
+216.3913904891867
+13
+25.970654401875137
+23
+-125.58262146621543
+33
+216.3913904891867
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.27823984263606
+20
+-124.92914762032574
+30
+216.66549660424585
+11
+25.24690473736297
+21
+-126.98813783866031
+31
+216.3837848811103
+12
+24.645757475035925
+22
+-125.63373115248633
+32
+216.9307802139366
+13
+24.645757475035925
+23
+-125.63373115248633
+33
+216.9307802139366
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.27823984263606
+20
+-124.92914762032574
+30
+216.66549660424585
+11
+25.757088927101037
+21
+-125.96716101053805
+31
+216.54076463179922
+12
+25.24690473736297
+22
+-126.98813783866031
+32
+216.3837848811103
+13
+25.24690473736297
+23
+-126.98813783866031
+33
+216.3837848811103
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.158056584867765
+20
+-124.89629139343737
+30
+216.4501057835336
+11
+25.757088927101037
+21
+-125.96716101053805
+31
+216.54076463179922
+12
+25.27823984263606
+22
+-124.92914762032574
+32
+216.66549660424585
+13
+25.27823984263606
+23
+-124.92914762032574
+33
+216.66549660424585
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.970654401875137
+20
+-125.58262146621543
+30
+216.3913904891867
+11
+25.757088927101037
+21
+-125.96716101053805
+31
+216.54076463179922
+12
+26.158056584867765
+22
+-124.89629139343737
+32
+216.4501057835336
+13
+26.158056584867765
+23
+-124.89629139343737
+33
+216.4501057835336
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.35670041764536
+20
+-126.4350580193731
+30
+214.75131716367778
+11
+26.62351979911896
+21
+-125.93187098906527
+31
+215.99011860709686
+12
+27.200633339925837
+22
+-125.45667259647672
+32
+215.65090848690738
+13
+27.200633339925837
+23
+-125.45667259647672
+33
+215.65090848690738
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.35670041764536
+20
+-126.4350580193731
+30
+214.75131716367778
+11
+26.83252190904746
+21
+-126.55157593509756
+31
+215.19457200234686
+12
+26.62351979911896
+22
+-125.93187098906527
+32
+215.99011860709686
+13
+26.62351979911896
+23
+-125.93187098906527
+33
+215.99011860709686
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.158056584867765
+20
+-124.89629139343737
+30
+216.4501057835336
+11
+26.62351979911896
+21
+-125.93187098906527
+31
+215.99011860709686
+12
+25.970654401875137
+22
+-125.58262146621543
+32
+216.3913904891867
+13
+25.970654401875137
+23
+-125.58262146621543
+33
+216.3913904891867
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.158056584867765
+20
+-124.89629139343737
+30
+216.4501057835336
+11
+27.200633339925837
+21
+-125.45667259647672
+31
+215.65090848690738
+12
+26.62351979911896
+22
+-125.93187098906527
+32
+215.99011860709686
+13
+26.62351979911896
+23
+-125.93187098906527
+33
+215.99011860709686
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.100543537645695
+20
+-127.4429532016045
+30
+214.2624286765523
+11
+26.83252190904746
+21
+-126.55157593509756
+31
+215.19457200234686
+12
+27.35670041764536
+22
+-126.4350580193731
+32
+214.75131716367778
+13
+27.35670041764536
+23
+-126.4350580193731
+33
+214.75131716367778
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.100543537645695
+20
+-127.4429532016045
+30
+214.2624286765523
+11
+26.45589219712392
+21
+-127.5987160550012
+31
+215.17875233754881
+12
+26.83252190904746
+22
+-126.55157593509756
+32
+215.19457200234686
+13
+26.83252190904746
+23
+-126.55157593509756
+33
+215.19457200234686
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.100543537645695
+20
+-127.4429532016045
+30
+214.2624286765523
+11
+26.53985811028296
+21
+-128.88801873604473
+31
+215.1720594024415
+12
+26.45589219712392
+22
+-127.5987160550012
+32
+215.17875233754881
+13
+26.45589219712392
+23
+-127.5987160550012
+33
+215.17875233754881
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.100543537645695
+20
+-127.4429532016045
+30
+214.2624286765523
+11
+26.86933305213528
+21
+-128.8740244171848
+31
+214.85992524700248
+12
+26.53985811028296
+22
+-128.88801873604473
+32
+215.1720594024415
+13
+26.53985811028296
+23
+-128.88801873604473
+33
+215.1720594024415
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.53985811028296
+20
+-128.88801873604473
+30
+215.1720594024415
+11
+25.24690473736297
+21
+-126.98813783866031
+31
+216.3837848811103
+12
+26.45589219712392
+22
+-127.5987160550012
+32
+215.17875233754881
+13
+26.45589219712392
+23
+-127.5987160550012
+33
+215.17875233754881
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.24690473736297
+20
+-126.98813783866031
+30
+216.3837848811103
+11
+26.53985811028296
+21
+-128.88801873604473
+31
+215.1720594024415
+12
+25.22834705365753
+22
+-128.5901831237888
+32
+215.99133550438802
+13
+25.22834705365753
+23
+-128.5901831237888
+33
+215.99133550438802
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.645757475035925
+20
+-125.63373115248633
+30
+216.9307802139366
+11
+25.24690473736297
+21
+-126.98813783866031
+31
+216.3837848811103
+12
+23.920486688908568
+22
+-126.40889472759216
+32
+216.67857825013627
+13
+23.920486688908568
+23
+-126.40889472759216
+33
+216.67857825013627
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.920486688908568
+20
+-126.40889472759216
+30
+216.67857825013627
+11
+25.22834705365753
+21
+-128.5901831237888
+31
+215.99133550438802
+12
+23.801230754276904
+22
+-127.82597162431244
+32
+216.421204472844
+13
+23.801230754276904
+23
+-127.82597162431244
+33
+216.421204472844
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.920486688908568
+20
+-126.40889472759216
+30
+216.67857825013627
+11
+25.24690473736297
+21
+-126.98813783866031
+31
+216.3837848811103
+12
+25.22834705365753
+22
+-128.5901831237888
+32
+215.99133550438802
+13
+25.22834705365753
+23
+-128.5901831237888
+33
+215.99133550438802
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.81570167027511
+20
+-131.17426452369276
+30
+224.63708654086136
+11
+32.81448477298295
+21
+-129.96101792340932
+31
+224.91727714238124
+12
+32.82269882970503
+22
+-130.15724261177047
+32
+225.48708929943538
+13
+32.82269882970503
+23
+-130.15724261177047
+33
+225.48708929943538
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.81570167027511
+20
+-131.17426452369276
+30
+224.63708654086136
+11
+32.82269882970503
+21
+-130.15724261177047
+31
+225.48708929943538
+12
+32.776152508279914
+22
+-131.32576823656692
+32
+225.1992930898393
+13
+32.776152508279914
+23
+-131.32576823656692
+33
+225.1992930898393
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.630733281866796
+20
+-131.90196910440437
+30
+224.24585406143174
+11
+32.81570167027511
+21
+-131.17426452369276
+31
+224.63708654086136
+12
+32.776152508279914
+22
+-131.32576823656692
+32
+225.1992930898393
+13
+32.776152508279914
+23
+-131.32576823656692
+33
+225.1992930898393
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.630733281866796
+20
+-131.90196910440437
+30
+224.24585406143174
+11
+32.776152508279914
+21
+-131.32576823656692
+31
+225.1992930898393
+12
+32.55072228490727
+22
+-132.07628964150652
+32
+225.05326541477987
+13
+32.55072228490727
+23
+-132.07628964150652
+33
+225.05326541477987
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.630733281866796
+20
+-131.90196910440437
+30
+224.24585406143174
+11
+32.55072228490727
+21
+-132.07628964150652
+31
+225.05326541477987
+12
+31.972696071131274
+22
+-132.63332437699253
+32
+224.27566804508942
+13
+31.972696071131274
+23
+-132.63332437699253
+33
+224.27566804508942
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.55072228490727
+20
+-132.07628964150652
+30
+225.05326541477987
+11
+31.72657859379192
+21
+-132.81981388701632
+31
+225.4067740781522
+12
+31.972696071131274
+22
+-132.63332437699253
+32
+224.27566804508942
+13
+31.972696071131274
+23
+-132.63332437699253
+33
+224.27566804508942
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.972696071131274
+20
+-132.63332437699253
+30
+224.27566804508942
+11
+31.72657859379192
+21
+-132.81981388701632
+31
+225.4067740781522
+12
+30.437275912748397
+22
+-133.03642160502065
+32
+224.4113520931653
+13
+30.437275912748397
+23
+-133.03642160502065
+33
+224.4113520931653
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.72657859379192
+20
+-132.81981388701632
+30
+225.4067740781522
+11
+30.531889677213865
+21
+-133.06167222383317
+31
+225.5339398451828
+12
+30.437275912748397
+22
+-133.03642160502065
+32
+224.4113520931653
+13
+30.437275912748397
+23
+-133.03642160502065
+33
+224.4113520931653
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.531889677213865
+20
+-133.06167222383317
+30
+225.5339398451828
+11
+29.265708044721354
+21
+-132.76992109803766
+31
+224.77855085107458
+12
+30.437275912748397
+22
+-133.03642160502065
+32
+224.4113520931653
+13
+30.437275912748397
+23
+-133.03642160502065
+33
+224.4113520931653
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.531889677213865
+20
+-133.06167222383317
+30
+225.5339398451828
+11
+29.019590567382
+21
+-132.7118142523373
+31
+225.98206227302083
+12
+29.265708044721354
+22
+-132.76992109803766
+32
+224.77855085107458
+13
+29.265708044721354
+23
+-132.76992109803766
+33
+224.77855085107458
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.265708044721354
+20
+-132.76992109803766
+30
+224.77855085107458
+11
+29.019590567382
+21
+-132.7118142523373
+31
+225.98206227302083
+12
+27.352137052799762
+22
+-132.0811572306752
+32
+225.27778296518343
+13
+27.352137052799762
+23
+-132.0811572306752
+33
+225.27778296518343
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.019590567382
+20
+-132.7118142523373
+30
+225.98206227302083
+11
+27.5958207355548
+21
+-132.07994033338326
+31
+226.23791492869768
+12
+27.352137052799762
+22
+-132.0811572306752
+32
+225.27778296518343
+13
+27.352137052799762
+23
+-132.0811572306752
+33
+225.27778296518343
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.5958207355548
+20
+-132.07994033338326
+30
+226.23791492869768
+11
+26.16900866049718
+21
+-130.8189305143824
+31
+225.97932425411364
+12
+27.352137052799762
+22
+-132.0811572306752
+32
+225.27778296518343
+13
+27.352137052799762
+23
+-132.0811572306752
+33
+225.27778296518343
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.5958207355548
+20
+-132.07994033338326
+30
+226.23791492869768
+11
+26.584274861446804
+21
+-131.08360567542735
+31
+226.5944658353008
+12
+26.16900866049718
+22
+-130.8189305143824
+32
+225.97932425411364
+13
+26.16900866049718
+23
+-130.8189305143824
+33
+225.97932425411364
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.16900866049718
+20
+-130.8189305143824
+30
+225.97932425411364
+11
+26.584274861446804
+21
+-131.08360567542735
+31
+226.5944658353008
+12
+26.085042747338164
+22
+-129.90564909661651
+32
+226.4119312414771
+13
+26.085042747338164
+23
+-129.90564909661651
+33
+226.4119312414771
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.156795737073047
+20
+-125.12233006545709
+30
+220.87504856215003
+11
+27.43336494705146
+21
+-124.90937303932952
+31
+221.88629021193532
+12
+27.625938943535754
+22
+-125.78158417348553
+32
+223.5637831291776
+13
+27.625938943535754
+23
+-125.78158417348553
+33
+223.5637831291776
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.288220644626314
+20
+-126.04869312911448
+30
+222.50325713905988
+11
+29.156795737073047
+21
+-125.12233006545709
+31
+220.87504856215003
+12
+27.625938943535754
+22
+-125.78158417348553
+32
+223.5637831291776
+13
+27.625938943535754
+23
+-125.78158417348553
+33
+223.5637831291776
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.504813712463278
+20
+-125.7925362491141
+30
+220.45886968823137
+11
+29.156795737073047
+21
+-125.12233006545709
+31
+220.87504856215003
+12
+29.288220644626314
+22
+-126.04869312911448
+32
+222.50325713905988
+13
+29.288220644626314
+23
+-126.04869312911448
+33
+222.50325713905988
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.593647214790952
+20
+-126.65440375628688
+30
+222.1409259703193
+11
+30.504813712463278
+21
+-125.7925362491141
+31
+220.45886968823137
+12
+29.288220644626314
+22
+-126.04869312911448
+32
+222.50325713905988
+13
+29.288220644626314
+23
+-126.04869312911448
+33
+222.50325713905988
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.01102833583431
+20
+-127.06145590051375
+30
+219.7171707886596
+11
+30.504813712463278
+21
+-125.7925362491141
+31
+220.45886968823137
+12
+30.593647214790952
+22
+-126.65440375628688
+32
+222.1409259703193
+13
+30.593647214790952
+23
+-126.65440375628688
+33
+222.1409259703193
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.10929279217623
+20
+-127.5947611388033
+30
+221.39861862210128
+11
+32.01102833583431
+21
+-127.06145590051375
+31
+219.7171707886596
+12
+30.593647214790952
+22
+-126.65440375628688
+32
+222.1409259703193
+13
+30.593647214790952
+23
+-126.65440375628688
+33
+222.1409259703193
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.41382133953927
+20
+-128.08395385025113
+30
+219.26539766894456
+11
+32.01102833583431
+21
+-127.06145590051375
+31
+219.7171707886596
+12
+32.10929279217623
+22
+-127.5947611388033
+32
+221.39861862210128
+13
+32.10929279217623
+23
+-127.5947611388033
+33
+221.39861862210128
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.41382133953927
+20
+-128.08395385025113
+30
+219.26539766894456
+11
+32.10929279217623
+21
+-127.5947611388033
+31
+221.39861862210128
+12
+32.7788905271873
+22
+-128.5116932484458
+32
+221.16558279065262
+13
+32.7788905271873
+23
+-128.5116932484458
+33
+221.16558279065262
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.7788905271873
+20
+-128.5116932484458
+30
+221.16558279065262
+11
+32.89175775103511
+21
+-129.10553912702042
+31
+223.1211367391533
+12
+33.14852307968087
+22
+-130.4556866726718
+32
+222.72929581107744
+13
+33.14852307968087
+23
+-130.4556866726718
+33
+222.72929581107744
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.0390023233865
+20
+-129.74258485946555
+30
+220.80112205165042
+11
+32.7788905271873
+21
+-128.5116932484458
+31
+221.16558279065262
+12
+33.14852307968087
+22
+-130.4556866726718
+32
+222.72929581107744
+13
+33.14852307968087
+23
+-130.4556866726718
+33
+222.72929581107744
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.04934595036983
+20
+-130.67472818526005
+30
+220.26234077554636
+11
+33.0390023233865
+21
+-129.74258485946555
+31
+220.80112205165042
+12
+33.14852307968087
+22
+-130.4556866726718
+32
+222.72929581107744
+13
+33.14852307968087
+23
+-130.4556866726718
+33
+222.72929581107744
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.04934595036983
+20
+-130.67472818526005
+30
+220.26234077554636
+11
+33.14852307968087
+21
+-130.4556866726718
+31
+222.72929581107744
+12
+33.05999380167623
+22
+-131.50678170877507
+32
+222.31920142361923
+13
+33.05999380167623
+23
+-131.50678170877507
+33
+222.31920142361923
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.63529664671239
+20
+-131.95551258525836
+30
+220.26142810257662
+11
+33.04934595036983
+21
+-130.67472818526005
+31
+220.26234077554636
+12
+33.05999380167623
+22
+-131.50678170877507
+32
+222.31920142361923
+13
+33.05999380167623
+23
+-131.50678170877507
+33
+222.31920142361923
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.20340065916823
+20
+-127.0143011304436
+30
+223.6885151016235
+11
+25.329045304583783
+21
+-129.3601748854054
+31
+225.04870204993503
+12
+25.87573641308665
+22
+-127.79372384607237
+32
+224.85856184803538
+13
+25.87573641308665
+23
+-127.79372384607237
+33
+224.85856184803538
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.87573641308665
+20
+-127.79372384607237
+30
+224.85856184803538
+11
+25.329045304583783
+21
+-129.3601748854054
+31
+225.04870204993503
+12
+26.085042747338164
+22
+-129.90564909661651
+32
+226.4119312414771
+13
+26.085042747338164
+23
+-129.90564909661651
+33
+226.4119312414771
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.87573641308665
+20
+-127.79372384607237
+30
+224.85856184803538
+11
+27.104194229522165
+21
+-127.93975152113204
+31
+226.61576153791447
+12
+26.543813026482482
+22
+-127.10526420303292
+32
+225.16217772242948
+13
+26.543813026482482
+23
+-127.10526420303292
+33
+225.16217772242948
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.87573641308665
+20
+-127.79372384607237
+30
+224.85856184803538
+11
+26.085042747338164
+21
+-129.90564909661651
+31
+226.4119312414771
+12
+27.104194229522165
+22
+-127.93975152113204
+32
+226.61576153791447
+13
+27.104194229522165
+23
+-127.93975152113204
+33
+226.61576153791447
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.126677529092078
+20
+-124.06180407533876
+30
+216.78505676320077
+11
+28.273328302964885
+21
+-124.52148702745174
+31
+215.54564687113574
+12
+27.74032728899881
+22
+-123.7298953389018
+32
+216.138580076741
+13
+27.74032728899881
+23
+-123.7298953389018
+33
+216.138580076741
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.840387790943918
+20
+-125.47948942070487
+30
+216.11363368225125
+11
+28.64113550952024
+21
+-126.32401614146343
+31
+214.48725045127907
+12
+28.684943812038
+22
+-125.65715642535986
+32
+214.95180099256143
+13
+28.684943812038
+23
+-125.65715642535986
+33
+214.95180099256143
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.64113550952024
+20
+-126.32401614146343
+30
+214.48725045127907
+11
+29.840387790943918
+21
+-125.47948942070487
+31
+216.11363368225125
+12
+30.199676716454153
+22
+-127.01916871961018
+32
+215.81032203217993
+13
+30.199676716454153
+23
+-127.01916871961018
+33
+215.81032203217993
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.847993399019924
+20
+-124.94283771486235
+30
+216.45345225108707
+11
+28.684943812038
+21
+-125.65715642535986
+31
+214.95180099256143
+12
+28.568121671990646
+22
+-125.170701732819
+32
+215.21465080766805
+13
+28.568121671990646
+23
+-125.170701732819
+33
+215.21465080766805
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.847993399019924
+20
+-124.94283771486235
+30
+216.45345225108707
+11
+29.840387790943918
+21
+-125.47948942070487
+31
+216.11363368225125
+12
+28.684943812038
+22
+-125.65715642535986
+32
+214.95180099256143
+13
+28.684943812038
+23
+-125.65715642535986
+33
+214.95180099256143
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.126677529092078
+20
+-124.06180407533876
+30
+216.78505676320077
+11
+28.568121671990646
+21
+-125.170701732819
+31
+215.21465080766805
+12
+28.273328302964885
+22
+-124.52148702745174
+32
+215.54564687113574
+13
+28.273328302964885
+23
+-124.52148702745174
+33
+215.54564687113574
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.847993399019924
+20
+-124.94283771486235
+30
+216.45345225108707
+11
+28.568121671990646
+21
+-125.170701732819
+31
+215.21465080766805
+12
+29.126677529092078
+22
+-124.06180407533876
+32
+216.78505676320077
+13
+29.126677529092078
+23
+-124.06180407533876
+33
+216.78505676320077
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.433046072560877
+20
+-127.53908808768509
+30
+214.00657602087531
+11
+30.457963166715118
+21
+-128.5439410266866
+31
+215.4154388608736
+12
+28.49449938581496
+22
+-128.534814296995
+32
+214.0500800990701
+13
+28.49449938581496
+23
+-128.534814296995
+33
+214.0500800990701
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.49449938581496
+20
+-128.534814296995
+30
+214.0500800990701
+11
+30.457963166715118
+21
+-128.5439410266866
+31
+215.4154388608736
+12
+30.085288370991115
+22
+-129.16516709433412
+32
+214.9268545980713
+13
+30.085288370991115
+23
+-129.16516709433412
+33
+214.9268545980713
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.63529664671239
+20
+-131.95551258525836
+30
+220.26142810257662
+11
+33.05999380167623
+21
+-131.50678170877507
+31
+222.31920142361923
+12
+32.13545608395767
+22
+-132.57034994212273
+32
+222.34171402352425
+13
+32.13545608395767
+23
+-132.57034994212273
+33
+222.34171402352425
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.63529664671239
+20
+-131.95551258525836
+30
+220.26142810257662
+11
+32.13545608395767
+21
+-132.57034994212273
+31
+222.34171402352425
+12
+31.842792285193195
+22
+-132.71698606582748
+32
+220.17989598400197
+13
+31.842792285193195
+23
+-132.71698606582748
+33
+220.17989598400197
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.13545608395767
+20
+-132.57034994212273
+30
+222.34171402352425
+11
+31.04298653992104
+21
+-132.906822043405
+31
+222.42993907720574
+12
+31.842792285193195
+22
+-132.71698606582748
+32
+220.17989598400197
+13
+31.842792285193195
+23
+-132.71698606582748
+33
+220.17989598400197
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.842792285193195
+20
+-132.71698606582748
+30
+220.17989598400197
+11
+31.04298653992104
+21
+-132.906822043405
+31
+222.42993907720574
+12
+29.21946594761928
+22
+-132.77418023855924
+32
+221.06214652081795
+13
+29.21946594761928
+23
+-132.77418023855924
+33
+221.06214652081795
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.04298653992104
+20
+-132.906822043405
+30
+222.42993907720574
+11
+29.344197920065692
+21
+-132.6944734659232
+31
+222.6842706112672
+12
+29.21946594761928
+22
+-132.77418023855924
+32
+221.06214652081795
+13
+29.21946594761928
+23
+-132.77418023855924
+33
+221.06214652081795
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.344197920065692
+20
+-132.6944734659232
+30
+222.6842706112672
+11
+26.67797595294313
+21
+-131.942430939368
+31
+221.57202648623317
+12
+29.21946594761928
+22
+-132.77418023855924
+32
+221.06214652081795
+13
+29.21946594761928
+23
+-132.77418023855924
+33
+221.06214652081795
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.344197920065692
+20
+-132.6944734659232
+30
+222.6842706112672
+11
+27.0451747108524
+21
+-131.9932364013161
+31
+223.26320949801223
+12
+26.67797595294313
+22
+-131.942430939368
+32
+221.57202648623317
+13
+26.67797595294313
+23
+-131.942430939368
+33
+221.57202648623317
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.0451747108524
+20
+-131.9932364013161
+30
+223.26320949801223
+11
+24.594647788765204
+21
+-130.17732141709016
+31
+222.52576973896407
+12
+26.67797595294313
+22
+-131.942430939368
+32
+221.57202648623317
+13
+26.67797595294313
+23
+-131.942430939368
+33
+221.57202648623317
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.0451747108524
+20
+-131.9932364013161
+30
+223.26320949801223
+11
+25.61957953308698
+21
+-130.6957196635508
+31
+224.39218596081432
+12
+24.594647788765204
+22
+-130.17732141709016
+32
+222.52576973896407
+13
+24.594647788765204
+23
+-130.17732141709016
+33
+222.52576973896407
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.594647788765204
+20
+-130.17732141709016
+30
+222.52576973896407
+11
+25.61957953308698
+21
+-130.6957196635508
+31
+224.39218596081432
+12
+24.20006884178233
+22
+-128.6619800640282
+32
+223.38246543264515
+13
+24.20006884178233
+23
+-128.6619800640282
+33
+223.38246543264515
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.20006884178233
+20
+-128.6619800640282
+30
+223.38246543264515
+11
+25.61957953308698
+21
+-130.6957196635508
+31
+224.39218596081432
+12
+25.329045304583783
+22
+-129.3601748854054
+32
+225.04870204993503
+13
+25.329045304583783
+23
+-129.3601748854054
+33
+225.04870204993503
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.625938943535754
+20
+-125.78158417348553
+30
+223.5637831291776
+11
+25.84774777536697
+21
+-126.34622451704783
+31
+223.94254241136238
+12
+26.543813026482482
+22
+-127.10526420303292
+32
+225.16217772242948
+13
+26.543813026482482
+23
+-127.10526420303292
+33
+225.16217772242948
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.830681912941696
+20
+-126.52632531628774
+30
+224.9017617019072
+11
+27.625938943535754
+21
+-125.78158417348553
+31
+223.5637831291776
+12
+26.543813026482482
+22
+-127.10526420303292
+32
+225.16217772242948
+13
+26.543813026482482
+23
+-127.10526420303292
+33
+225.16217772242948
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.288220644626314
+20
+-126.04869312911448
+30
+222.50325713905988
+11
+27.625938943535754
+21
+-125.78158417348553
+31
+223.5637831291776
+12
+27.830681912941696
+22
+-126.52632531628774
+32
+224.9017617019072
+13
+27.830681912941696
+23
+-126.52632531628774
+33
+224.9017617019072
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.377358371277037
+20
+-126.78765400977896
+30
+224.25954415596985
+11
+29.288220644626314
+21
+-126.04869312911448
+31
+222.50325713905988
+12
+27.830681912941696
+22
+-126.52632531628774
+32
+224.9017617019072
+13
+27.830681912941696
+23
+-126.52632531628774
+33
+224.9017617019072
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.377358371277037
+20
+-126.78765400977896
+30
+224.25954415596985
+11
+30.593647214790952
+21
+-126.65440375628688
+31
+222.1409259703193
+12
+29.288220644626314
+22
+-126.04869312911448
+32
+222.50325713905988
+13
+29.288220644626314
+23
+-126.04869312911448
+33
+222.50325713905988
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.593647214790952
+20
+-126.65440375628688
+30
+222.1409259703193
+11
+29.377358371277037
+21
+-126.78765400977896
+31
+224.25954415596985
+12
+30.661793463151913
+22
+-127.38241256132207
+32
+223.90177635207465
+13
+30.661793463151913
+23
+-127.38241256132207
+33
+223.90177635207465
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.10929279217623
+20
+-127.5947611388033
+30
+221.39861862210128
+11
+30.593647214790952
+21
+-126.65440375628688
+31
+222.1409259703193
+12
+30.661793463151913
+22
+-127.38241256132207
+32
+223.90177635207465
+13
+30.661793463151913
+23
+-127.38241256132207
+33
+223.90177635207465
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.10929279217623
+20
+-127.5947611388033
+30
+221.39861862210128
+11
+30.661793463151913
+21
+-127.38241256132207
+31
+223.90177635207465
+12
+32.10777167056103
+22
+-128.2372829090643
+32
+223.28267985468807
+13
+32.10777167056103
+23
+-128.2372829090643
+33
+223.28267985468807
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.7788905271873
+20
+-128.5116932484458
+30
+221.16558279065262
+11
+32.10929279217623
+21
+-127.5947611388033
+31
+221.39861862210128
+12
+32.10777167056103
+22
+-128.2372829090643
+32
+223.28267985468807
+13
+32.10777167056103
+23
+-128.2372829090643
+33
+223.28267985468807
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.7788905271873
+20
+-128.5116932484458
+30
+221.16558279065262
+11
+32.10777167056103
+21
+-128.2372829090643
+31
+223.28267985468807
+12
+32.89175775103511
+22
+-129.10553912702042
+32
+223.1211367391533
+13
+32.89175775103511
+23
+-129.10553912702042
+33
+223.1211367391533
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.89175775103511
+20
+-129.10553912702042
+30
+223.1211367391533
+11
+32.81448477298295
+21
+-129.96101792340932
+31
+224.91727714238124
+12
+32.81570167027511
+22
+-131.17426452369276
+32
+224.63708654086136
+13
+32.81570167027511
+23
+-131.17426452369276
+33
+224.63708654086136
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.14852307968087
+20
+-130.4556866726718
+30
+222.72929581107744
+11
+32.89175775103511
+21
+-129.10553912702042
+31
+223.1211367391533
+12
+32.81570167027511
+22
+-131.17426452369276
+32
+224.63708654086136
+13
+32.81570167027511
+23
+-131.17426452369276
+33
+224.63708654086136
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.05999380167623
+20
+-131.50678170877507
+30
+222.31920142361923
+11
+33.14852307968087
+21
+-130.4556866726718
+31
+222.72929581107744
+12
+32.81570167027511
+22
+-131.17426452369276
+32
+224.63708654086136
+13
+32.81570167027511
+23
+-131.17426452369276
+33
+224.63708654086136
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.05999380167623
+20
+-131.50678170877507
+30
+222.31920142361923
+11
+32.81570167027511
+21
+-131.17426452369276
+31
+224.63708654086136
+12
+32.630733281866796
+22
+-131.90196910440437
+32
+224.24585406143174
+13
+32.630733281866796
+23
+-131.90196910440437
+33
+224.24585406143174
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.05999380167623
+20
+-131.50678170877507
+30
+222.31920142361923
+11
+32.630733281866796
+21
+-131.90196910440437
+31
+224.24585406143174
+12
+32.13545608395767
+22
+-132.57034994212273
+32
+222.34171402352425
+13
+32.13545608395767
+23
+-132.57034994212273
+33
+222.34171402352425
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.13545608395767
+20
+-132.57034994212273
+30
+222.34171402352425
+11
+32.630733281866796
+21
+-131.90196910440437
+31
+224.24585406143174
+12
+31.972696071131274
+22
+-132.63332437699253
+32
+224.27566804508942
+13
+31.972696071131274
+23
+-132.63332437699253
+33
+224.27566804508942
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.13545608395767
+20
+-132.57034994212273
+30
+222.34171402352425
+11
+31.972696071131274
+21
+-132.63332437699253
+31
+224.27566804508942
+12
+31.04298653992104
+22
+-132.906822043405
+32
+222.42993907720574
+13
+31.04298653992104
+23
+-132.906822043405
+33
+222.42993907720574
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.972696071131274
+20
+-132.63332437699253
+30
+224.27566804508942
+11
+30.437275912748397
+21
+-133.03642160502065
+31
+224.4113520931653
+12
+31.04298653992104
+22
+-132.906822043405
+32
+222.42993907720574
+13
+31.04298653992104
+23
+-132.906822043405
+33
+222.42993907720574
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.04298653992104
+20
+-132.906822043405
+30
+222.42993907720574
+11
+30.437275912748397
+21
+-133.03642160502065
+31
+224.4113520931653
+12
+29.344197920065692
+22
+-132.6944734659232
+32
+222.6842706112672
+13
+29.344197920065692
+23
+-132.6944734659232
+33
+222.6842706112672
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.437275912748397
+20
+-133.03642160502065
+30
+224.4113520931653
+11
+29.265708044721354
+21
+-132.76992109803766
+31
+224.77855085107458
+12
+29.344197920065692
+22
+-132.6944734659232
+32
+222.6842706112672
+13
+29.344197920065692
+23
+-132.6944734659232
+33
+222.6842706112672
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.344197920065692
+20
+-132.6944734659232
+30
+222.6842706112672
+11
+29.265708044721354
+21
+-132.76992109803766
+31
+224.77855085107458
+12
+27.0451747108524
+22
+-131.9932364013161
+32
+223.26320949801223
+13
+27.0451747108524
+23
+-131.9932364013161
+33
+223.26320949801223
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.265708044721354
+20
+-132.76992109803766
+30
+224.77855085107458
+11
+27.352137052799762
+21
+-132.0811572306752
+31
+225.27778296518343
+12
+27.0451747108524
+22
+-131.9932364013161
+32
+223.26320949801223
+13
+27.0451747108524
+23
+-131.9932364013161
+33
+223.26320949801223
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.352137052799762
+20
+-132.0811572306752
+30
+225.27778296518343
+11
+25.61957953308698
+21
+-130.6957196635508
+31
+224.39218596081432
+12
+27.0451747108524
+22
+-131.9932364013161
+32
+223.26320949801223
+13
+27.0451747108524
+23
+-131.9932364013161
+33
+223.26320949801223
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.352137052799762
+20
+-132.0811572306752
+30
+225.27778296518343
+11
+26.16900866049718
+21
+-130.8189305143824
+31
+225.97932425411364
+12
+25.61957953308698
+22
+-130.6957196635508
+32
+224.39218596081432
+13
+25.61957953308698
+23
+-130.6957196635508
+33
+224.39218596081432
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.755798778971272
+20
+-125.019806468592
+30
+218.45981166153575
+11
+29.156795737073047
+21
+-125.12233006545709
+31
+220.87504856215003
+12
+30.504813712463278
+22
+-125.7925362491141
+32
+220.45886968823137
+13
+30.504813712463278
+23
+-125.7925362491141
+33
+220.45886968823137
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.415342461154474
+20
+-130.2774112193692
+30
+218.3530289241474
+11
+32.54676736870775
+21
+-129.20897539685288
+31
+218.85378215987154
+12
+33.0390023233865
+22
+-129.74258485946555
+32
+220.80112205165042
+13
+33.0390023233865
+23
+-129.74258485946555
+33
+220.80112205165042
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.316484206333996
+20
+-125.75998424654816
+30
+217.8352391263345
+11
+30.755798778971272
+21
+-125.019806468592
+31
+218.45981166153575
+12
+30.504813712463278
+22
+-125.7925362491141
+32
+220.45886968823137
+13
+30.504813712463278
+23
+-125.7925362491141
+33
+220.45886968823137
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.415342461154474
+20
+-130.2774112193692
+30
+218.3530289241474
+11
+33.0390023233865
+21
+-129.74258485946555
+31
+220.80112205165042
+12
+33.04934595036983
+22
+-130.67472818526005
+32
+220.26234077554636
+13
+33.04934595036983
+23
+-130.67472818526005
+33
+220.26234077554636
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.415342461154474
+20
+-130.2774112193692
+30
+218.3530289241474
+11
+33.04934595036983
+21
+-130.67472818526005
+31
+220.26234077554636
+12
+32.15249264604791
+22
+-131.49826342772897
+32
+218.47350175607087
+13
+32.15249264604791
+23
+-131.49826342772897
+33
+218.47350175607087
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.15249264604791
+20
+-131.49826342772897
+30
+218.47350175607087
+11
+33.04934595036983
+21
+-130.67472818526005
+31
+220.26234077554636
+12
+32.63529664671239
+22
+-131.95551258525836
+32
+220.26142810257662
+13
+32.63529664671239
+23
+-131.95551258525836
+33
+220.26142810257662
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.316484206333996
+20
+-125.75998424654816
+30
+217.8352391263345
+11
+30.504813712463278
+21
+-125.7925362491141
+31
+220.45886968823137
+12
+32.01102833583431
+22
+-127.06145590051375
+32
+219.7171707886596
+13
+32.01102833583431
+23
+-127.06145590051375
+33
+219.7171707886596
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.63529664671239
+20
+-131.95551258525836
+30
+220.26142810257662
+11
+30.886311013555435
+21
+-132.87244469490054
+31
+218.71414319559491
+12
+32.15249264604791
+22
+-131.49826342772897
+32
+218.47350175607087
+13
+32.15249264604791
+23
+-131.49826342772897
+33
+218.47350175607087
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.660866140015273
+20
+-127.15941613253207
+30
+217.65118341089493
+11
+31.316484206333996
+21
+-125.75998424654816
+31
+217.8352391263345
+12
+32.01102833583431
+22
+-127.06145590051375
+32
+219.7171707886596
+13
+32.01102833583431
+23
+-127.06145590051375
+33
+219.7171707886596
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.660866140015273
+20
+-127.15941613253207
+30
+217.65118341089493
+11
+32.01102833583431
+21
+-127.06145590051375
+31
+219.7171707886596
+12
+32.41382133953927
+22
+-128.08395385025113
+32
+219.26539766894456
+13
+32.41382133953927
+23
+-128.08395385025113
+33
+219.26539766894456
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.61957953308698
+20
+-130.6957196635508
+30
+224.39218596081432
+11
+26.16900866049718
+21
+-130.8189305143824
+31
+225.97932425411364
+12
+25.329045304583783
+22
+-129.3601748854054
+32
+225.04870204993503
+13
+25.329045304583783
+23
+-129.3601748854054
+33
+225.04870204993503
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.41382133953927
+20
+-128.08395385025113
+30
+219.26539766894456
+11
+32.7788905271873
+21
+-128.5116932484458
+31
+221.16558279065262
+12
+33.0390023233865
+22
+-129.74258485946555
+32
+220.80112205165042
+13
+33.0390023233865
+23
+-129.74258485946555
+33
+220.80112205165042
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.329045304583783
+20
+-129.3601748854054
+30
+225.04870204993503
+11
+26.16900866049718
+21
+-130.8189305143824
+31
+225.97932425411364
+12
+26.085042747338164
+22
+-129.90564909661651
+32
+226.4119312414771
+13
+26.085042747338164
+23
+-129.90564909661651
+33
+226.4119312414771
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.886311013555435
+20
+-132.87244469490054
+30
+218.71414319559491
+11
+32.63529664671239
+21
+-131.95551258525836
+31
+220.26142810257662
+12
+31.842792285193195
+22
+-132.71698606582748
+32
+220.17989598400197
+13
+31.842792285193195
+23
+-132.71698606582748
+33
+220.17989598400197
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.842792285193195
+20
+-132.71698606582748
+30
+220.17989598400197
+11
+28.543479501824397
+21
+-132.69447346592227
+31
+219.23375833934725
+12
+30.886311013555435
+22
+-132.87244469490054
+32
+218.71414319559491
+13
+30.886311013555435
+23
+-132.87244469490054
+33
+218.71414319559491
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.086593169288406
+20
+-129.97105732606863
+30
+220.95110464290877
+11
+24.594647788765204
+21
+-130.17732141709016
+31
+222.52576973896407
+12
+23.407868704586186
+22
+-128.0273681261663
+32
+221.85069596613883
+13
+23.407868704586186
+23
+-128.0273681261663
+33
+221.85069596613883
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.842792285193195
+20
+-132.71698606582748
+30
+220.17989598400197
+11
+29.21946594761928
+21
+-132.77418023855924
+31
+221.06214652081795
+12
+28.543479501824397
+22
+-132.69447346592227
+32
+219.23375833934725
+13
+28.543479501824397
+23
+-132.69447346592227
+33
+219.23375833934725
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.43336494705146
+20
+-124.90937303932952
+30
+221.88629021193532
+11
+25.480853241780725
+21
+-125.44480784787996
+31
+222.56105976043793
+12
+25.84774777536697
+22
+-126.34622451704783
+32
+223.94254241136238
+13
+25.84774777536697
+23
+-126.34622451704783
+33
+223.94254241136238
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.625938943535754
+20
+-125.78158417348553
+30
+223.5637831291776
+11
+27.43336494705146
+21
+-124.90937303932952
+31
+221.88629021193532
+12
+25.84774777536697
+22
+-126.34622451704783
+32
+223.94254241136238
+13
+25.84774777536697
+23
+-126.34622451704783
+33
+223.94254241136238
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.407868704586186
+20
+-128.0273681261663
+30
+221.85069596613883
+11
+24.594647788765204
+21
+-130.17732141709016
+31
+222.52576973896407
+12
+24.20006884178233
+22
+-128.6619800640282
+32
+223.38246543264515
+13
+24.20006884178233
+23
+-128.6619800640282
+33
+223.38246543264515
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.21946594761928
+20
+-132.77418023855924
+30
+221.06214652081795
+11
+26.67797595294313
+21
+-131.942430939368
+31
+221.57202648623317
+12
+25.927150323680408
+22
+-131.79914128321568
+32
+219.72355949944225
+13
+25.927150323680408
+23
+-131.79914128321568
+33
+219.72355949944225
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.67797595294313
+20
+-131.942430939368
+30
+221.57202648623317
+11
+24.086593169288406
+21
+-129.97105732606863
+31
+220.95110464290877
+12
+25.927150323680408
+22
+-131.79914128321568
+32
+219.72355949944225
+13
+25.927150323680408
+23
+-131.79914128321568
+33
+219.72355949944225
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.67797595294313
+20
+-131.942430939368
+30
+221.57202648623317
+11
+24.594647788765204
+21
+-130.17732141709016
+31
+222.52576973896407
+12
+24.086593169288406
+22
+-129.97105732606863
+32
+220.95110464290877
+13
+24.086593169288406
+23
+-129.97105732606863
+33
+220.95110464290877
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.21946594761928
+20
+-132.77418023855924
+30
+221.06214652081795
+11
+25.927150323680408
+21
+-131.79914128321568
+31
+219.72355949944225
+12
+28.543479501824397
+22
+-132.69447346592227
+32
+219.23375833934725
+13
+28.543479501824397
+23
+-132.69447346592227
+33
+219.23375833934725
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.54676736870775
+20
+-129.20897539685288
+30
+218.85378215987154
+11
+32.41382133953927
+21
+-128.08395385025113
+31
+219.26539766894456
+12
+33.0390023233865
+22
+-129.74258485946555
+32
+220.80112205165042
+13
+33.0390023233865
+23
+-129.74258485946555
+33
+220.80112205165042
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.830681912941696
+20
+-126.52632531628774
+30
+224.9017617019072
+11
+26.543813026482482
+21
+-127.10526420303292
+31
+225.16217772242948
+12
+27.104194229522165
+22
+-127.93975152113204
+32
+226.61576153791447
+13
+27.104194229522165
+23
+-127.93975152113204
+33
+226.61576153791447
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.007132020304876
+20
+-127.21752297823505
+30
+226.67356415929225
+11
+27.830681912941696
+21
+-126.52632531628774
+31
+224.9017617019072
+12
+27.104194229522165
+22
+-127.93975152113204
+32
+226.61576153791447
+13
+27.104194229522165
+23
+-127.93975152113204
+33
+226.61576153791447
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.377358371277037
+20
+-126.78765400977896
+30
+224.25954415596985
+11
+27.830681912941696
+21
+-126.52632531628774
+31
+224.9017617019072
+12
+28.007132020304876
+22
+-127.21752297823505
+32
+226.67356415929225
+13
+28.007132020304876
+23
+-127.21752297823505
+33
+226.67356415929225
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.543769075979917
+20
+-127.38667170184517
+30
+226.2339600124993
+11
+29.377358371277037
+21
+-126.78765400977896
+31
+224.25954415596985
+12
+28.007132020304876
+22
+-127.21752297823505
+32
+226.67356415929225
+13
+28.007132020304876
+23
+-127.21752297823505
+33
+226.67356415929225
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.661793463151913
+20
+-127.38241256132207
+30
+223.90177635207465
+11
+29.377358371277037
+21
+-126.78765400977896
+31
+224.25954415596985
+12
+29.543769075979917
+22
+-127.38667170184517
+32
+226.2339600124993
+13
+29.543769075979917
+23
+-127.38667170184517
+33
+226.2339600124993
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.786525435598314
+20
+-128.05261874497964
+30
+225.85246271140701
+11
+30.661793463151913
+21
+-127.38241256132207
+31
+223.90177635207465
+12
+29.543769075979917
+22
+-127.38667170184517
+32
+226.2339600124993
+13
+29.543769075979917
+23
+-127.38667170184517
+33
+226.2339600124993
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.10777167056103
+20
+-128.2372829090643
+30
+223.28267985468807
+11
+30.661793463151913
+21
+-127.38241256132207
+31
+223.90177635207465
+12
+30.786525435598314
+22
+-128.05261874497964
+32
+225.85246271140701
+13
+30.786525435598314
+23
+-128.05261874497964
+33
+225.85246271140701
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.15279687037095
+20
+-128.93973687096434
+30
+225.29816599482788
+11
+32.10777167056103
+21
+-128.2372829090643
+31
+223.28267985468807
+12
+30.786525435598314
+22
+-128.05261874497964
+32
+225.85246271140701
+13
+30.786525435598314
+23
+-128.05261874497964
+33
+225.85246271140701
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.89175775103511
+20
+-129.10553912702042
+30
+223.1211367391533
+11
+32.10777167056103
+21
+-128.2372829090643
+31
+223.28267985468807
+12
+32.15279687037095
+22
+-128.93973687096434
+32
+225.29816599482788
+13
+32.15279687037095
+23
+-128.93973687096434
+33
+225.29816599482788
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.89175775103511
+20
+-129.10553912702042
+30
+223.1211367391533
+11
+32.15279687037095
+21
+-128.93973687096434
+31
+225.29816599482788
+12
+32.81448477298295
+22
+-129.96101792340932
+32
+224.91727714238124
+13
+32.81448477298295
+23
+-129.96101792340932
+33
+224.91727714238124
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.543479501824397
+20
+-132.69447346592227
+30
+219.23375833934725
+11
+25.267287767006646
+21
+-131.42737916046042
+31
+218.1352043088505
+12
+27.44340434971175
+22
+-132.3546548970861
+32
+217.47686287379165
+13
+27.44340434971175
+23
+-132.3546548970861
+33
+217.47686287379165
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.543479501824397
+20
+-132.69447346592227
+30
+219.23375833934725
+11
+25.927150323680408
+21
+-131.79914128321568
+31
+219.72355949944225
+12
+25.267287767006646
+22
+-131.42737916046042
+32
+218.1352043088505
+13
+25.267287767006646
+23
+-131.42737916046042
+33
+218.1352043088505
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.927150323680408
+20
+-131.79914128321568
+30
+219.72355949944225
+11
+23.106382400453533
+21
+-129.34435522060573
+31
+219.06035047521567
+12
+25.267287767006646
+22
+-131.42737916046042
+32
+218.1352043088505
+13
+25.267287767006646
+23
+-131.42737916046042
+33
+218.1352043088505
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.927150323680408
+20
+-131.79914128321568
+30
+219.72355949944225
+11
+24.086593169288406
+21
+-129.97105732606863
+31
+220.95110464290877
+12
+23.106382400453533
+22
+-129.34435522060573
+32
+219.06035047521567
+13
+23.106382400453533
+23
+-129.34435522060573
+33
+219.06035047521567
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.106382400453533
+20
+-129.34435522060573
+30
+219.06035047521567
+11
+24.086593169288406
+21
+-129.97105732606863
+31
+220.95110464290877
+12
+22.53930826230697
+22
+-127.31061562108367
+32
+220.33109547255424
+13
+22.53930826230697
+23
+-127.31061562108367
+33
+220.33109547255424
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.53930826230697
+20
+-127.31061562108367
+30
+220.33109547255424
+11
+24.086593169288406
+21
+-129.97105732606863
+31
+220.95110464290877
+12
+23.407868704586186
+22
+-128.0273681261663
+32
+221.85069596613883
+13
+23.407868704586186
+23
+-128.0273681261663
+33
+221.85069596613883
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.35670041764536
+20
+-123.90817079220425
+30
+220.06946255474077
+11
+24.90069745774344
+21
+-124.46429285472144
+31
+220.30097726457373
+12
+25.480853241780725
+22
+-125.44480784787996
+32
+222.56105976043793
+13
+25.480853241780725
+23
+-125.44480784787996
+33
+222.56105976043793
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.43336494705146
+20
+-124.90937303932952
+30
+221.88629021193532
+11
+27.35670041764536
+21
+-123.90817079220425
+31
+220.06946255474077
+12
+25.480853241780725
+22
+-125.44480784787996
+32
+222.56105976043793
+13
+25.480853241780725
+23
+-125.44480784787996
+33
+222.56105976043793
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.43336494705146
+20
+-124.90937303932952
+30
+221.88629021193532
+11
+29.03541023218008
+21
+-124.27476110146726
+31
+219.3861747251928
+12
+27.35670041764536
+22
+-123.90817079220425
+32
+220.06946255474077
+13
+27.35670041764536
+23
+-123.90817079220425
+33
+220.06946255474077
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.03541023218008
+20
+-124.27476110146726
+30
+219.3861747251928
+11
+27.43336494705146
+21
+-124.90937303932952
+31
+221.88629021193532
+12
+29.156795737073047
+22
+-125.12233006545709
+32
+220.87504856215003
+13
+29.156795737073047
+23
+-125.12233006545709
+33
+220.87504856215003
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.755798778971272
+20
+-125.019806468592
+30
+218.45981166153575
+11
+29.03541023218008
+21
+-124.27476110146726
+31
+219.3861747251928
+12
+29.156795737073047
+22
+-125.12233006545709
+32
+220.87504856215003
+13
+29.156795737073047
+23
+-125.12233006545709
+33
+220.87504856215003
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.55956286963786
+20
+-151.2993119414318
+30
+212.52926270818728
+11
+9.29976994792923
+21
+-151.41217916527987
+31
+213.76532613269876
+12
+9.365786626028912
+22
+-150.73315047625528
+32
+216.4516269051418
+13
+9.365786626028912
+23
+-150.73315047625528
+33
+216.4516269051418
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+3.545975326273722
+20
+-152.85450668081242
+30
+213.40269073963472
+11
+1.1727213822386982
+21
+-152.68961709772452
+31
+212.72001135873302
+12
+3.373480135110056
+22
+-152.53750493620532
+32
+215.7765531323159
+13
+3.373480135110056
+23
+-152.53750493620532
+33
+215.7765531323159
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.02686607999484
+20
+-151.1402026204816
+30
+211.76200896548045
+11
+9.022013140993721
+21
+-151.50648870542165
+31
+211.4407480803501
+12
+9.29976994792923
+22
+-151.41217916527987
+32
+213.76532613269876
+13
+9.29976994792923
+23
+-151.41217916527987
+33
+213.76532613269876
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+0.9494207291273249
+20
+-154.72092290266264
+30
+212.65764537250928
+11
+1.5320103077489375
+21
+-155.47205275624844
+31
+212.69993255341163
+12
+1.3829403894593297
+22
+-156.337875179621
+32
+215.79328547008183
+13
+1.3829403894593297
+23
+-156.337875179621
+33
+215.79328547008183
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.922502487024595
+20
+-151.19952636347512
+30
+214.56361075635573
+11
+10.55956286963786
+21
+-151.2993119414318
+31
+212.52926270818728
+12
+9.365786626028912
+22
+-150.73315047625528
+32
+216.4516269051418
+13
+9.365786626028912
+23
+-150.73315047625528
+33
+216.4516269051418
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.55956286963786
+20
+-151.2993119414318
+30
+212.52926270818728
+11
+10.02686607999484
+21
+-151.1402026204816
+31
+211.76200896548045
+12
+9.29976994792923
+22
+-151.41217916527987
+32
+213.76532613269876
+13
+9.29976994792923
+23
+-151.41217916527987
+33
+213.76532613269876
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.326527038189225
+20
+-150.80403474352403
+30
+217.4662150224805
+11
+10.582988142511953
+21
+-152.73555497050563
+31
+220.57112846342625
+12
+11.407131833627322
+22
+-152.92660784537406
+32
+218.0195990660894
+13
+11.407131833627322
+23
+-152.92660784537406
+33
+218.0195990660894
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+5.1711416599533955
+20
+-155.09876951187846
+30
+213.3089896481378
+11
+3.055869941856292
+21
+-154.08205182427827
+31
+211.4106298723685
+12
+4.928370650167485
+22
+-153.52653821040718
+32
+211.10245063312908
+13
+4.928370650167485
+23
+-153.52653821040718
+33
+211.10245063312908
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+5.1711416599533955
+20
+-155.09876951187846
+30
+213.3089896481378
+11
+2.449550866037571
+21
+-156.14256316422882
+31
+213.9077031158802
+12
+3.055869941856292
+22
+-154.08205182427827
+32
+211.4106298723685
+13
+3.055869941856292
+23
+-154.08205182427827
+33
+211.4106298723685
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.326527038189225
+20
+-150.80403474352403
+30
+217.4662150224805
+11
+9.730247365030827
+21
+-150.40884734789572
+31
+220.3685150642819
+12
+10.582988142511953
+22
+-152.73555497050563
+32
+220.57112846342625
+13
+10.582988142511953
+23
+-152.73555497050563
+33
+220.57112846342625
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+3.055869941856292
+20
+-154.08205182427827
+30
+211.4106298723685
+11
+2.449550866037571
+21
+-156.14256316422882
+31
+213.9077031158802
+12
+1.7945558985324568
+22
+-154.45533506864842
+32
+211.47238740994518
+13
+1.7945558985324568
+23
+-154.45533506864842
+33
+211.47238740994518
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+5.319298905273888
+20
+-156.2895035122575
+30
+215.26393514799256
+11
+2.449550866037571
+21
+-156.14256316422882
+31
+213.9077031158802
+12
+5.1711416599533955
+22
+-155.09876951187846
+32
+213.3089896481378
+13
+5.1711416599533955
+23
+-155.09876951187846
+33
+213.3089896481378
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+2.905278901951492
+20
+-157.4352123128263
+30
+215.77898692689897
+11
+1.5320103077489375
+21
+-155.47205275624844
+31
+212.69993255341163
+12
+2.449550866037571
+22
+-156.14256316422882
+32
+213.9077031158802
+13
+2.449550866037571
+23
+-156.14256316422882
+33
+213.9077031158802
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+5.319298905273888
+20
+-156.2895035122575
+30
+215.26393514799256
+11
+2.905278901951492
+21
+-157.4352123128263
+31
+215.77898692689897
+12
+2.449550866037571
+22
+-156.14256316422882
+32
+213.9077031158802
+13
+2.449550866037571
+23
+-156.14256316422882
+33
+213.9077031158802
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.7945558985324568
+20
+-154.45533506864842
+30
+211.47238740994518
+11
+1.5320103077489375
+21
+-155.47205275624844
+31
+212.69993255341163
+12
+1.1213074716449372
+22
+-154.33242844214027
+32
+211.74862309526554
+13
+1.1213074716449372
+23
+-154.33242844214027
+33
+211.74862309526554
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+2.449550866037571
+20
+-156.14256316422882
+30
+213.9077031158802
+11
+1.5320103077489375
+21
+-155.47205275624844
+31
+212.69993255341163
+12
+1.7945558985324568
+22
+-154.45533506864842
+32
+211.47238740994518
+13
+1.7945558985324568
+23
+-154.45533506864842
+33
+211.47238740994518
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.1213074716449372
+20
+-154.33242844214027
+30
+211.74862309526554
+11
+1.5320103077489375
+21
+-155.47205275624844
+31
+212.69993255341163
+12
+0.9494207291273249
+22
+-154.72092290266264
+32
+212.65764537250928
+13
+0.9494207291273249
+23
+-154.72092290266264
+33
+212.65764537250928
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+2.905278901951492
+20
+-157.4352123128263
+30
+215.77898692689897
+11
+1.3829403894593297
+21
+-156.337875179621
+31
+215.79328547008183
+12
+1.5320103077489375
+22
+-155.47205275624844
+32
+212.69993255341163
+13
+1.5320103077489375
+23
+-155.47205275624844
+33
+212.69993255341163
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+4.6311434865574075
+20
+-147.1868075425795
+30
+222.25561854009985
+11
+3.2788663706446157
+21
+-150.03951901972496
+31
+219.90578986893811
+12
+2.859341029172456
+22
+-148.24946310295823
+32
+222.3438435937815
+13
+2.859341029172456
+23
+-148.24946310295823
+33
+222.3438435937815
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+5.572717766366199
+20
+-148.602363317684
+30
+219.79231419644486
+11
+3.2788663706446157
+21
+-150.03951901972496
+31
+219.90578986893811
+12
+4.6311434865574075
+22
+-147.1868075425795
+32
+222.25561854009985
+13
+4.6311434865574075
+23
+-147.1868075425795
+33
+222.25561854009985
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+4.6311434865574075
+20
+-147.1868075425795
+30
+222.25561854009985
+11
+3.1431823225687765
+21
+-148.11104103597535
+31
+223.4591299620461
+12
+4.569081724657246
+22
+-147.29085226105946
+32
+223.31340651131023
+13
+4.569081724657246
+23
+-147.29085226105946
+33
+223.31340651131023
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+2.859341029172456
+20
+-148.24946310295823
+30
+222.3438435937815
+11
+1.483030191739495
+21
+-150.26494924309762
+31
+219.98215017402114
+12
+1.844752911834053
+22
+-149.17765151255327
+32
+222.1917314322612
+13
+1.844752911834053
+23
+-149.17765151255327
+33
+222.1917314322612
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+2.859341029172456
+20
+-148.24946310295823
+30
+222.3438435937815
+11
+1.844752911834053
+21
+-149.17765151255327
+31
+222.1917314322612
+12
+2.3506779610495707
+22
+-148.91388902447795
+32
+223.5634789048487
+13
+2.3506779610495707
+23
+-148.91388902447795
+33
+223.5634789048487
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+4.6311434865574075
+20
+-147.1868075425795
+30
+222.25561854009985
+11
+2.859341029172456
+21
+-148.24946310295823
+31
+222.3438435937815
+12
+3.1431823225687765
+22
+-148.11104103597535
+32
+223.4591299620461
+13
+3.1431823225687765
+23
+-148.11104103597535
+33
+223.4591299620461
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.730247365030827
+20
+-150.40884734789572
+30
+220.3685150642819
+11
+6.527677916388758
+21
+-147.64375247578565
+31
+222.46340375273633
+12
+8.378882922087161
+22
+-149.08851378590262
+32
+222.70647898684496
+13
+8.378882922087161
+23
+-149.08851378590262
+33
+222.70647898684496
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+3.2788663706446157
+20
+-150.03951901972496
+30
+219.90578986893811
+11
+1.483030191739495
+21
+-150.26494924309762
+31
+219.98215017402114
+12
+2.859341029172456
+22
+-148.24946310295823
+32
+222.3438435937815
+13
+2.859341029172456
+23
+-148.24946310295823
+33
+222.3438435937815
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+8.378882922087161
+20
+-149.08851378590262
+30
+222.70647898684496
+11
+6.527677916388758
+21
+-147.64375247578565
+31
+222.46340375273633
+12
+6.260568960759652
+22
+-147.7684844482323
+32
+223.52879733202235
+13
+6.260568960759652
+23
+-147.7684844482323
+33
+223.52879733202235
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+3.1431823225687765
+20
+-148.11104103597535
+30
+223.4591299620461
+11
+2.859341029172456
+21
+-148.24946310295823
+31
+222.3438435937815
+12
+2.3506779610495707
+22
+-148.91388902447795
+32
+223.5634789048487
+13
+2.3506779610495707
+23
+-148.91388902447795
+33
+223.5634789048487
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.4649344550049
+20
+-152.420682796158
+30
+215.29770404785066
+11
+11.117510278093238
+21
+-155.01054445819815
+31
+218.21095616528103
+12
+11.44394297671515
+22
+-153.90468904394714
+32
+215.96243419369299
+13
+11.44394297671515
+23
+-153.90468904394714
+33
+215.96243419369299
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.730247365030827
+20
+-150.40884734789572
+30
+220.3685150642819
+11
+7.8178932704014
+21
+-149.07573636433435
+31
+219.98853888480562
+12
+6.527677916388758
+22
+-147.64375247578565
+32
+222.46340375273633
+13
+6.527677916388758
+23
+-147.64375247578565
+33
+222.46340375273633
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.922502487024595
+20
+-151.19952636347512
+30
+214.56361075635573
+11
+11.407131833627322
+21
+-152.92660784537406
+31
+218.0195990660894
+12
+11.4649344550049
+22
+-152.420682796158
+32
+215.29770404785066
+13
+11.4649344550049
+23
+-152.420682796158
+33
+215.29770404785066
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.4649344550049
+20
+-152.420682796158
+30
+215.29770404785066
+11
+11.407131833627322
+21
+-152.92660784537406
+31
+218.0195990660894
+12
+11.117510278093238
+22
+-155.01054445819815
+32
+218.21095616528103
+13
+11.117510278093238
+23
+-155.01054445819815
+33
+218.21095616528103
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+8.378882922087161
+20
+-149.08851378590262
+30
+222.70647898684496
+11
+6.260568960759652
+21
+-147.7684844482323
+31
+223.52879733202235
+12
+8.081959982800122
+22
+-149.27409062295732
+32
+223.65261663149928
+13
+8.081959982800122
+23
+-149.27409062295732
+33
+223.65261663149928
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.922502487024595
+20
+-151.19952636347512
+30
+214.56361075635573
+11
+10.326527038189225
+21
+-150.80403474352403
+31
+217.4662150224805
+12
+11.407131833627322
+22
+-152.92660784537406
+32
+218.0195990660894
+13
+11.407131833627322
+23
+-152.92660784537406
+33
+218.0195990660894
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.407131833627322
+20
+-152.92660784537406
+30
+218.0195990660894
+11
+10.582988142511953
+21
+-152.73555497050563
+31
+220.57112846342625
+12
+10.63744429633612
+22
+-155.31872369743823
+32
+220.56382707967234
+13
+10.63744429633612
+23
+-155.31872369743823
+33
+220.56382707967234
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.407131833627322
+20
+-152.92660784537406
+30
+218.0195990660894
+11
+10.63744429633612
+21
+-155.31872369743823
+31
+220.56382707967234
+12
+11.117510278093238
+22
+-155.01054445819815
+32
+218.21095616528103
+13
+11.117510278093238
+23
+-155.01054445819815
+33
+218.21095616528103
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.29976994792923
+20
+-151.41217916527987
+30
+213.76532613269876
+11
+6.703215350782831
+21
+-152.32150566684598
+31
+211.49155354229757
+12
+6.954504641613885
+22
+-152.3196803209082
+32
+213.8745426646699
+13
+6.954504641613885
+23
+-152.3196803209082
+33
+213.8745426646699
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+0.9494207291273249
+20
+-154.72092290266264
+30
+212.65764537250928
+11
+1.3829403894593297
+21
+-156.337875179621
+31
+215.79328547008183
+12
+0.881578705089411
+22
+-155.03974999320923
+32
+215.312915264002
+13
+0.881578705089411
+23
+-155.03974999320923
+33
+215.312915264002
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.29976994792923
+20
+-151.41217916527987
+30
+213.76532613269876
+11
+9.022013140993721
+21
+-151.50648870542165
+31
+211.4407480803501
+12
+6.703215350782831
+22
+-152.32150566684598
+32
+211.49155354229757
+13
+6.703215350782831
+23
+-152.32150566684598
+33
+211.49155354229757
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.365786626028912
+20
+-150.73315047625528
+30
+216.4516269051418
+11
+6.954504641613885
+21
+-152.3196803209082
+31
+213.8745426646699
+12
+6.995270700901245
+22
+-151.9749941629046
+32
+216.01628189887157
+13
+6.995270700901245
+23
+-151.9749941629046
+33
+216.01628189887157
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+6.954504641613885
+20
+-152.3196803209082
+30
+213.8745426646699
+11
+6.703215350782831
+21
+-152.32150566684598
+31
+211.49155354229757
+12
+3.7123860309766203
+22
+-152.9722414938286
+32
+211.66861209830637
+13
+3.7123860309766203
+23
+-152.9722414938286
+33
+211.66861209830637
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.365786626028912
+20
+-150.73315047625528
+30
+216.4516269051418
+11
+9.29976994792923
+21
+-151.41217916527987
+31
+213.76532613269876
+12
+6.954504641613885
+22
+-152.3196803209082
+32
+213.8745426646699
+13
+6.954504641613885
+23
+-152.3196803209082
+33
+213.8745426646699
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+6.954504641613885
+20
+-152.3196803209082
+30
+213.8745426646699
+11
+3.7123860309766203
+21
+-152.9722414938286
+31
+211.66861209830637
+12
+3.545975326273722
+22
+-152.85450668081242
+32
+213.40269073963472
+13
+3.545975326273722
+23
+-152.85450668081242
+33
+213.40269073963472
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+6.995270700901245
+20
+-151.9749941629046
+30
+216.01628189887157
+11
+6.954504641613885
+21
+-152.3196803209082
+31
+213.8745426646699
+12
+3.545975326273722
+22
+-152.85450668081242
+32
+213.40269073963472
+13
+3.545975326273722
+23
+-152.85450668081242
+33
+213.40269073963472
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+6.995270700901245
+20
+-151.9749941629046
+30
+216.01628189887157
+11
+3.545975326273722
+21
+-152.85450668081242
+31
+213.40269073963472
+12
+3.373480135110056
+22
+-152.53750493620532
+32
+215.7765531323159
+13
+3.373480135110056
+23
+-152.53750493620532
+33
+215.7765531323159
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+3.545975326273722
+20
+-152.85450668081242
+30
+213.40269073963472
+11
+1.6415310640433272
+21
+-153.13043814180938
+31
+211.6482290686629
+12
+1.1727213822386982
+22
+-152.68961709772452
+32
+212.72001135873302
+13
+1.1727213822386982
+23
+-152.68961709772452
+33
+212.72001135873302
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+3.7123860309766203
+20
+-152.9722414938286
+30
+211.66861209830637
+11
+1.6415310640433272
+21
+-153.13043814180938
+31
+211.6482290686629
+12
+3.545975326273722
+22
+-152.85450668081242
+32
+213.40269073963472
+13
+3.545975326273722
+23
+-152.85450668081242
+33
+213.40269073963472
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+3.373480135110056
+20
+-152.53750493620532
+30
+215.7765531323159
+11
+1.1727213822386982
+21
+-152.68961709772452
+31
+212.72001135873302
+12
+0.8061310729755031
+22
+-152.16604703777344
+32
+215.4857146794898
+13
+0.8061310729755031
+23
+-152.16604703777344
+33
+215.4857146794898
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.63744429633612
+20
+-155.31872369743823
+30
+220.56382707967234
+11
+10.582988142511953
+21
+-152.73555497050563
+31
+220.57112846342625
+12
+9.897570742702841
+22
+-152.9606809695558
+32
+222.74998306503863
+13
+9.897570742702841
+23
+-152.9606809695558
+33
+222.74998306503863
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.63744429633612
+20
+-155.31872369743823
+30
+220.56382707967234
+11
+9.897570742702841
+21
+-152.9606809695558
+31
+222.74998306503863
+12
+10.05850540959099
+22
+-155.57153410988496
+32
+222.4570150419505
+13
+10.05850540959099
+23
+-155.57153410988496
+33
+222.4570150419505
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.05850540959099
+20
+-155.57153410988496
+30
+222.4570150419505
+11
+9.897570742702841
+21
+-152.9606809695558
+31
+222.74998306503863
+12
+9.419330106883953
+22
+-152.8286476133568
+32
+224.2452456127803
+13
+9.419330106883953
+23
+-152.8286476133568
+33
+224.2452456127803
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.05850540959099
+20
+-155.57153410988496
+30
+222.4570150419505
+11
+9.419330106883953
+21
+-152.8286476133568
+31
+224.2452456127803
+12
+9.292164339853235
+22
+-156.02421990256903
+32
+224.4372111606177
+13
+9.292164339853235
+23
+-156.02421990256903
+33
+224.4372111606177
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.404423115054993
+20
+-156.67860642142702
+30
+220.4841203070355
+11
+7.736969600472767
+21
+-158.13492825582
+31
+222.4439333960591
+12
+7.592463047028769
+22
+-157.76438303035684
+32
+220.6660464522131
+13
+7.592463047028769
+23
+-157.76438303035684
+33
+220.6660464522131
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.404423115054993
+20
+-156.67860642142702
+30
+220.4841203070355
+11
+9.090463613677723
+21
+-157.18392302199715
+31
+222.5698822657979
+12
+7.736969600472767
+22
+-158.13492825582
+32
+222.4439333960591
+13
+7.736969600472767
+23
+-158.13492825582
+33
+222.4439333960591
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+8.470454443322195
+20
+-157.22621020290012
+30
+224.76638187814666
+11
+7.487505655579967
+21
+-157.9149740702629
+31
+224.975383988075
+12
+7.736969600472767
+22
+-158.13492825582
+32
+222.4439333960591
+13
+7.736969600472767
+23
+-158.13492825582
+33
+222.4439333960591
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.63744429633612
+20
+-155.31872369743823
+30
+220.56382707967234
+11
+10.05850540959099
+21
+-155.57153410988496
+31
+222.4570150419505
+12
+9.090463613677723
+22
+-157.18392302199715
+32
+222.5698822657979
+13
+9.090463613677723
+23
+-157.18392302199715
+33
+222.5698822657979
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.090463613677723
+20
+-157.18392302199715
+30
+222.5698822657979
+11
+8.470454443322195
+21
+-157.22621020290012
+31
+224.76638187814666
+12
+7.736969600472767
+22
+-158.13492825582
+32
+222.4439333960591
+13
+7.736969600472767
+23
+-158.13492825582
+33
+222.4439333960591
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.404423115054993
+20
+-156.67860642142702
+30
+220.4841203070355
+11
+10.63744429633612
+21
+-155.31872369743823
+31
+220.56382707967234
+12
+9.090463613677723
+22
+-157.18392302199715
+32
+222.5698822657979
+13
+9.090463613677723
+23
+-157.18392302199715
+33
+222.5698822657979
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.05850540959099
+20
+-155.57153410988496
+30
+222.4570150419505
+11
+9.292164339853235
+21
+-156.02421990256903
+31
+224.4372111606177
+12
+9.090463613677723
+22
+-157.18392302199715
+32
+222.5698822657979
+13
+9.090463613677723
+23
+-157.18392302199715
+33
+222.5698822657979
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.2277859847089314
+20
+-152.31268316148
+30
+220.03234718732236
+11
+1.4848555376777368
+21
+-151.53478156746715
+31
+222.26717906437455
+12
+1.844752911834053
+22
+-149.17765151255327
+32
+222.1917314322612
+13
+1.844752911834053
+23
+-149.17765151255327
+33
+222.1917314322612
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.090463613677723
+20
+-157.18392302199715
+30
+222.5698822657979
+11
+9.292164339853235
+21
+-156.02421990256903
+31
+224.4372111606177
+12
+8.470454443322195
+22
+-157.22621020290012
+32
+224.76638187814666
+13
+8.470454443322195
+23
+-157.22621020290012
+33
+224.76638187814666
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.483030191739495
+20
+-150.26494924309762
+30
+219.98215017402114
+11
+1.2277859847089314
+21
+-152.31268316148
+31
+220.03234718732236
+12
+1.844752911834053
+22
+-149.17765151255327
+32
+222.1917314322612
+13
+1.844752911834053
+23
+-149.17765151255327
+33
+222.1917314322612
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.897570742702841
+20
+-152.9606809695558
+30
+222.74998306503863
+11
+8.081959982800122
+21
+-149.27409062295732
+31
+223.65261663149928
+12
+9.419330106883953
+22
+-152.8286476133568
+32
+224.2452456127803
+13
+9.419330106883953
+23
+-152.8286476133568
+33
+224.2452456127803
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.582988142511953
+20
+-152.73555497050563
+30
+220.57112846342625
+11
+8.378882922087161
+21
+-149.08851378590262
+31
+222.70647898684496
+12
+9.897570742702841
+22
+-152.9606809695558
+32
+222.74998306503863
+13
+9.897570742702841
+23
+-152.9606809695558
+33
+222.74998306503863
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+8.378882922087161
+20
+-149.08851378590262
+30
+222.70647898684496
+11
+8.081959982800122
+21
+-149.27409062295732
+31
+223.65261663149928
+12
+9.897570742702841
+22
+-152.9606809695558
+32
+222.74998306503863
+13
+9.897570742702841
+23
+-152.9606809695558
+33
+222.74998306503863
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.730247365030827
+20
+-150.40884734789572
+30
+220.3685150642819
+11
+8.378882922087161
+21
+-149.08851378590262
+31
+222.70647898684496
+12
+10.582988142511953
+22
+-152.73555497050563
+32
+220.57112846342625
+13
+10.582988142511953
+23
+-152.73555497050563
+33
+220.57112846342625
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.27512434856807
+20
+-94.22378669590113
+30
+227.01794609298196
+11
+30.69830038191674
+21
+-96.50364377276273
+31
+226.09858018875445
+12
+29.604918164910952
+22
+-95.04123745190955
+32
+226.75783429678253
+13
+29.604918164910952
+23
+-95.04123745190955
+33
+226.75783429678253
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.27512434856807
+20
+-94.22378669590113
+30
+227.01794609298196
+11
+31.54008908376839
+21
+-95.91071056715765
+31
+226.1953235234814
+12
+30.69830038191674
+22
+-96.50364377276273
+32
+226.09858018875445
+13
+30.69830038191674
+23
+-96.50364377276273
+33
+226.09858018875445
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.27512434856807
+20
+-94.22378669590113
+30
+227.01794609298196
+11
+31.378850192557195
+21
+-94.5849009673497
+31
+226.95132096623612
+12
+31.54008908376839
+22
+-95.91071056715765
+32
+226.1953235234814
+13
+31.54008908376839
+23
+-95.91071056715765
+33
+226.1953235234814
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.54008908376839
+20
+-95.91071056715765
+30
+226.1953235234814
+11
+31.378850192557195
+21
+-94.5849009673497
+31
+226.95132096623612
+12
+33.04021922067863
+22
+-96.37952024896272
+32
+227.4782374937409
+13
+33.04021922067863
+23
+-96.37952024896272
+33
+227.4782374937409
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.11846347237
+20
+-92.58462604336242
+30
+229.76235371112622
+11
+26.080175158169528
+21
+-92.86633776649711
+31
+228.69057142105623
+12
+25.899161685960728
+22
+-93.09481023310038
+32
+229.68751452765798
+13
+25.899161685960728
+23
+-93.09481023310038
+33
+229.68751452765798
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.11846347237
+20
+-92.58462604336242
+30
+229.76235371112622
+11
+27.80938621032888
+21
+-92.98194300925235
+31
+228.86215393925048
+12
+26.080175158169528
+22
+-92.86633776649711
+32
+228.69057142105623
+13
+26.080175158169528
+23
+-92.86633776649711
+33
+228.69057142105623
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.378850192557195
+20
+-94.5849009673497
+30
+226.95132096623612
+11
+27.80938621032888
+21
+-92.98194300925235
+31
+228.86215393925048
+12
+29.11846347237
+22
+-92.58462604336242
+32
+229.76235371112622
+13
+29.11846347237
+23
+-92.58462604336242
+33
+229.76235371112622
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.378850192557195
+20
+-94.5849009673497
+30
+226.95132096623612
+11
+30.27512434856807
+21
+-94.22378669590113
+31
+227.01794609298196
+12
+27.80938621032888
+22
+-92.98194300925235
+32
+228.86215393925048
+13
+27.80938621032888
+23
+-92.98194300925235
+33
+228.86215393925048
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.80938621032888
+20
+-92.98194300925235
+30
+228.86215393925048
+11
+29.604918164910952
+21
+-95.04123745190955
+31
+226.75783429678253
+12
+27.634761448903923
+22
+-94.47172951917922
+32
+228.77970914770654
+13
+27.634761448903923
+23
+-94.47172951917922
+33
+228.77970914770654
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.80938621032888
+20
+-92.98194300925235
+30
+228.86215393925048
+11
+30.27512434856807
+21
+-94.22378669590113
+31
+227.01794609298196
+12
+29.604918164910952
+22
+-95.04123745190955
+32
+226.75783429678253
+13
+29.604918164910952
+23
+-95.04123745190955
+33
+226.75783429678253
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.098124393228883
+20
+-93.65275764155531
+30
+227.95556545659133
+11
+26.080175158169528
+21
+-92.86633776649711
+31
+228.69057142105623
+12
+27.634761448903923
+22
+-94.47172951917922
+32
+228.77970914770654
+13
+27.634761448903923
+23
+-94.47172951917922
+33
+228.77970914770654
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.080175158169528
+20
+-92.86633776649711
+30
+228.69057142105623
+11
+27.80938621032888
+21
+-92.98194300925235
+31
+228.86215393925048
+12
+27.634761448903923
+22
+-94.47172951917922
+32
+228.77970914770654
+13
+27.634761448903923
+23
+-94.47172951917922
+33
+228.77970914770654
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.098124393228883
+20
+-93.65275764155531
+30
+227.95556545659133
+11
+25.304707358740586
+21
+-94.61501917533066
+31
+226.9151182717943
+12
+24.324192365582654
+22
+-94.51705894331191
+32
+227.68936917393114
+13
+24.324192365582654
+23
+-94.51705894331191
+33
+227.68936917393114
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.080175158169528
+20
+-92.86633776649711
+30
+228.69057142105623
+11
+26.098124393228883
+21
+-93.65275764155531
+31
+227.95556545659133
+12
+24.324192365582654
+22
+-94.51705894331191
+32
+227.68936917393114
+13
+24.324192365582654
+23
+-94.51705894331191
+33
+227.68936917393114
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.304707358740586
+20
+-94.61501917533066
+30
+226.9151182717943
+11
+25.07532221916842
+21
+-96.55444923471055
+31
+226.87952402599817
+12
+23.46445442867161
+22
+-96.8930509062542
+32
+227.23820450286192
+13
+23.46445442867161
+23
+-96.8930509062542
+33
+227.23820450286192
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.324192365582654
+20
+-94.51705894331191
+30
+227.68936917393114
+11
+25.304707358740586
+21
+-94.61501917533066
+31
+226.9151182717943
+12
+23.46445442867161
+22
+-96.8930509062542
+32
+227.23820450286192
+13
+23.46445442867161
+23
+-96.8930509062542
+33
+227.23820450286192
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.46445442867161
+20
+-96.8930509062542
+30
+227.23820450286192
+11
+25.074409546199284
+21
+-98.45919772126372
+31
+225.9139160246687
+12
+24.112756461069843
+22
+-99.58087280031235
+32
+226.4140608117462
+13
+24.112756461069843
+23
+-99.58087280031235
+33
+226.4140608117462
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.07532221916842
+20
+-96.55444923471055
+30
+226.87952402599817
+11
+25.074409546199284
+21
+-98.45919772126372
+31
+225.9139160246687
+12
+23.46445442867161
+22
+-96.8930509062542
+32
+227.23820450286192
+13
+23.46445442867161
+23
+-96.8930509062542
+33
+227.23820450286192
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.112756461069843
+20
+-99.58087280031235
+30
+226.4140608117462
+11
+24.30289666296985
+21
+-100.34356317817385
+31
+227.34285766998707
+12
+23.194911678458173
+22
+-97.90094608848592
+32
+228.09033683169696
+13
+23.194911678458173
+23
+-97.90094608848592
+33
+228.09033683169696
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.112756461069843
+20
+-99.58087280031235
+30
+226.4140608117462
+11
+23.194911678458173
+21
+-97.90094608848592
+31
+228.09033683169696
+12
+23.46445442867161
+22
+-96.8930509062542
+32
+227.23820450286192
+13
+23.46445442867161
+23
+-96.8930509062542
+33
+227.23820450286192
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.324192365582654
+20
+-94.51705894331191
+30
+227.68936917393114
+11
+24.421848373278486
+21
+-94.78933971243282
+31
+228.24397011483302
+12
+25.899161685960728
+22
+-93.09481023310038
+32
+229.68751452765798
+13
+25.899161685960728
+23
+-93.09481023310038
+33
+229.68751452765798
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.080175158169528
+20
+-92.86633776649711
+30
+228.69057142105623
+11
+24.324192365582654
+21
+-94.51705894331191
+31
+227.68936917393114
+12
+25.899161685960728
+22
+-93.09481023310038
+32
+229.68751452765798
+13
+25.899161685960728
+23
+-93.09481023310038
+33
+229.68751452765798
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.46445442867161
+20
+-96.8930509062542
+30
+227.23820450286192
+11
+23.194911678458173
+21
+-97.90094608848592
+31
+228.09033683169696
+12
+24.421848373278486
+22
+-94.78933971243282
+32
+228.24397011483302
+13
+24.421848373278486
+23
+-94.78933971243282
+33
+228.24397011483302
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.46445442867161
+20
+-96.8930509062542
+30
+227.23820450286192
+11
+24.421848373278486
+21
+-94.78933971243282
+31
+228.24397011483302
+12
+24.324192365582654
+22
+-94.51705894331191
+32
+227.68936917393114
+13
+24.324192365582654
+23
+-94.51705894331191
+33
+227.68936917393114
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.267273116839107
+20
+-101.27935719584497
+30
+227.511702169274
+11
+25.973392420782485
+21
+-101.52577889750776
+31
+229.13291358675417
+12
+24.457138394751134
+22
+-100.6307509391241
+32
+229.13717272727692
+13
+24.457138394751134
+23
+-100.6307509391241
+33
+229.13717272727692
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.267273116839107
+20
+-101.27935719584497
+30
+227.511702169274
+11
+24.457138394751134
+21
+-100.6307509391241
+31
+229.13717272727692
+12
+24.30289666296985
+22
+-100.34356317817385
+32
+227.34285766998707
+13
+24.30289666296985
+23
+-100.34356317817385
+33
+227.34285766998707
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.30289666296985
+20
+-100.34356317817385
+30
+227.34285766998707
+11
+24.457138394751134
+21
+-100.6307509391241
+31
+229.13717272727692
+12
+23.36710264529881
+22
+-98.60431272335471
+32
+229.47607862314402
+13
+23.36710264529881
+23
+-98.60431272335471
+33
+229.47607862314402
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.30289666296985
+20
+-100.34356317817385
+30
+227.34285766998707
+11
+23.36710264529881
+21
+-98.60431272335471
+31
+229.47607862314402
+12
+23.194911678458173
+22
+-97.90094608848592
+32
+228.09033683169696
+13
+23.194911678458173
+23
+-97.90094608848592
+33
+228.09033683169696
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.04021922067863
+20
+-96.37952024896272
+30
+227.4782374937409
+11
+33.31919292490631
+21
+-96.57787450758543
+31
+230.0702287260418
+12
+33.23035942257863
+22
+-99.20059239651316
+32
+229.47486172585172
+13
+33.23035942257863
+23
+-99.20059239651316
+33
+229.47486172585172
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.869564025620715
+20
+-97.86018002919809
+30
+226.28902461497717
+11
+33.04021922067863
+21
+-96.37952024896272
+31
+227.4782374937409
+12
+33.23035942257863
+22
+-99.20059239651316
+32
+229.47486172585172
+13
+33.23035942257863
+23
+-99.20059239651316
+33
+229.47486172585172
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.869564025620715
+20
+-97.86018002919809
+30
+226.28902461497717
+11
+33.23035942257863
+21
+-99.20059239651316
+31
+229.47486172585172
+12
+32.73782024357687
+22
+-100.96752726472944
+32
+229.51136864461597
+13
+32.73782024357687
+23
+-100.96752726472944
+33
+229.51136864461597
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.662691485953516
+20
+-99.90122101247331
+30
+225.7846206873764
+11
+31.869564025620715
+21
+-97.86018002919809
+31
+226.28902461497717
+12
+32.73782024357687
+22
+-100.96752726472944
+32
+229.51136864461597
+13
+32.73782024357687
+23
+-100.96752726472944
+33
+229.51136864461597
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.5264722400692
+20
+-101.96994640914647
+30
+230.342205270838
+11
+24.859322949810014
+21
+-101.10077751822145
+31
+231.09059710551665
+12
+25.973392420782485
+22
+-101.52577889750776
+32
+229.13291358675417
+13
+25.973392420782485
+23
+-101.52577889750776
+33
+229.13291358675417
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.973392420782485
+20
+-101.52577889750776
+30
+229.13291358675417
+11
+24.859322949810014
+21
+-101.10077751822145
+31
+231.09059710551665
+12
+24.457138394751134
+22
+-100.6307509391241
+32
+229.13717272727692
+13
+24.457138394751134
+23
+-100.6307509391241
+33
+229.13717272727692
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.457138394751134
+20
+-100.6307509391241
+30
+229.13717272727692
+11
+24.859322949810014
+21
+-101.10077751822145
+31
+231.09059710551665
+12
+23.610786328053848
+22
+-98.90853704639518
+32
+231.30051188841472
+13
+23.610786328053848
+23
+-98.90853704639518
+33
+231.30051188841472
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.457138394751134
+20
+-100.6307509391241
+30
+229.13717272727692
+11
+23.610786328053848
+21
+-98.90853704639518
+31
+231.30051188841472
+12
+23.36710264529881
+22
+-98.60431272335471
+32
+229.47607862314402
+13
+23.36710264529881
+23
+-98.60431272335471
+33
+229.47607862314402
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.31919292490631
+20
+-96.57787450758543
+30
+230.0702287260418
+11
+33.31128309250727
+21
+-97.53648534948486
+31
+231.49217321193035
+12
+33.08615709345767
+22
+-99.80386922910182
+32
+230.99628756537462
+13
+33.08615709345767
+23
+-99.80386922910182
+33
+230.99628756537462
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.23035942257863
+20
+-99.20059239651316
+30
+229.47486172585172
+11
+33.31919292490631
+21
+-96.57787450758543
+31
+230.0702287260418
+12
+33.08615709345767
+22
+-99.80386922910182
+32
+230.99628756537462
+13
+33.08615709345767
+23
+-99.80386922910182
+33
+230.99628756537462
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.23035942257863
+20
+-99.20059239651316
+30
+229.47486172585172
+11
+33.08615709345767
+21
+-99.80386922910182
+31
+230.99628756537462
+12
+32.424773415168715
+22
+-101.30034867413553
+32
+230.69936462608723
+13
+32.424773415168715
+23
+-101.30034867413553
+33
+230.69936462608723
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.23035942257863
+20
+-99.20059239651316
+30
+229.47486172585172
+11
+32.424773415168715
+21
+-101.30034867413553
+31
+230.69936462608723
+12
+32.73782024357687
+22
+-100.96752726472944
+32
+229.51136864461597
+13
+32.73782024357687
+23
+-100.96752726472944
+33
+229.51136864461597
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.545638372420722
+20
+-96.72238106102876
+30
+227.37206320499985
+11
+27.99770106629064
+21
+-97.00409278416399
+31
+228.08759881278988
+12
+27.704733043203117
+22
+-97.80481120240526
+32
+227.78976320053354
+13
+27.704733043203117
+23
+-97.80481120240526
+33
+227.78976320053354
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.343618771754652
+20
+-96.50060152953272
+30
+227.8533460840492
+11
+27.99770106629064
+21
+-97.00409278416399
+31
+228.08759881278988
+12
+26.545638372420722
+22
+-96.72238106102876
+32
+227.37206320499985
+13
+26.545638372420722
+23
+-96.72238106102876
+33
+227.37206320499985
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.55263553185064
+20
+-95.8410431971819
+30
+227.46272205326596
+11
+27.343618771754652
+21
+-96.50060152953272
+31
+227.8533460840492
+12
+26.545638372420722
+22
+-96.72238106102876
+32
+227.37206320499985
+13
+26.545638372420722
+23
+-96.72238106102876
+33
+227.37206320499985
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.601311423537044
+20
+-95.286746480603
+30
+227.55703159340854
+11
+27.60433901659992
+21
+-95.9417414481083
+31
+227.96895132680459
+12
+26.55263553185064
+22
+-95.8410431971819
+32
+227.46272205326596
+13
+26.55263553185064
+23
+-95.8410431971819
+33
+227.46272205326596
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.55263553185064
+20
+-95.8410431971819
+30
+227.46272205326596
+11
+27.60433901659992
+21
+-95.9417414481083
+31
+227.96895132680459
+12
+27.343618771754652
+22
+-96.50060152953272
+32
+227.8533460840492
+13
+27.343618771754652
+23
+-96.50060152953272
+33
+227.8533460840492
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.60433901659992
+20
+-95.9417414481083
+30
+227.96895132680459
+11
+28.849529170802647
+21
+-96.40598776506721
+31
+227.4688065397267
+12
+27.343618771754652
+22
+-96.50060152953272
+32
+227.8533460840492
+13
+27.343618771754652
+23
+-96.50060152953272
+33
+227.8533460840492
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.849529170802647
+20
+-96.40598776506721
+30
+227.4688065397267
+11
+27.99770106629064
+21
+-97.00409278416399
+31
+228.08759881278988
+12
+27.343618771754652
+22
+-96.50060152953272
+32
+227.8533460840492
+13
+27.343618771754652
+23
+-96.50060152953272
+33
+227.8533460840492
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.849529170802647
+20
+-96.40598776506721
+30
+227.4688065397267
+11
+29.58970694875896
+21
+-97.06706721903295
+31
+226.9680533040024
+12
+27.99770106629064
+22
+-97.00409278416399
+32
+228.08759881278988
+13
+27.99770106629064
+23
+-97.00409278416399
+33
+228.08759881278988
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.99770106629064
+20
+-97.00409278416399
+30
+228.08759881278988
+11
+29.58970694875896
+21
+-97.06706721903295
+31
+226.9680533040024
+12
+27.704733043203117
+22
+-97.80481120240526
+32
+227.78976320053354
+13
+27.704733043203117
+23
+-97.80481120240526
+33
+227.78976320053354
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.58970694875896
+20
+-97.06706721903295
+30
+226.9680533040024
+11
+29.595791435219756
+21
+-98.06096808240461
+31
+226.92637457174567
+12
+27.704733043203117
+22
+-97.80481120240526
+32
+227.78976320053354
+13
+27.704733043203117
+23
+-97.80481120240526
+33
+227.78976320053354
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.704733043203117
+20
+-97.80481120240526
+30
+227.78976320053354
+11
+29.595791435219756
+21
+-98.06096808240461
+31
+226.92637457174567
+12
+27.83037768861864
+22
+-98.86290339793813
+32
+227.18192300309934
+13
+27.83037768861864
+23
+-98.86290339793813
+33
+227.18192300309934
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.545638372420722
+20
+-96.72238106102876
+30
+227.37206320499985
+11
+27.83037768861864
+21
+-98.86290339793813
+31
+227.18192300309934
+12
+25.80424369717224
+22
+-97.501803776657
+32
+226.4250128873761
+13
+25.80424369717224
+23
+-97.501803776657
+33
+226.4250128873761
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.83037768861864
+20
+-98.86290339793813
+30
+227.18192300309934
+11
+26.545638372420722
+21
+-96.72238106102876
+31
+227.37206320499985
+12
+27.704733043203117
+22
+-97.80481120240526
+32
+227.78976320053354
+13
+27.704733043203117
+23
+-97.80481120240526
+33
+227.78976320053354
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.595791435219756
+20
+-98.06096808240461
+30
+226.92637457174567
+11
+28.882385397690964
+21
+-99.8099537155615
+31
+226.50563233298115
+12
+27.71659779180168
+22
+-99.531892684303
+32
+226.8125946749286
+13
+27.71659779180168
+23
+-99.531892684303
+33
+226.8125946749286
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.595791435219756
+20
+-98.06096808240461
+30
+226.92637457174567
+11
+27.71659779180168
+21
+-99.531892684303
+31
+226.8125946749286
+12
+27.83037768861864
+22
+-98.86290339793813
+32
+227.18192300309934
+13
+27.83037768861864
+23
+-98.86290339793813
+33
+227.18192300309934
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.074409546199284
+20
+-98.45919772126372
+30
+225.9139160246687
+11
+27.83037768861864
+21
+-98.86290339793813
+31
+227.18192300309934
+12
+27.71659779180168
+22
+-99.531892684303
+32
+226.8125946749286
+13
+27.71659779180168
+23
+-99.531892684303
+33
+226.8125946749286
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.80424369717224
+20
+-97.501803776657
+30
+226.4250128873761
+11
+27.83037768861864
+21
+-98.86290339793813
+31
+227.18192300309934
+12
+25.074409546199284
+22
+-98.45919772126372
+32
+225.9139160246687
+13
+25.074409546199284
+23
+-98.45919772126372
+33
+225.9139160246687
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.074409546199284
+20
+-98.45919772126372
+30
+225.9139160246687
+11
+26.545638372420722
+21
+-96.72238106102876
+31
+227.37206320499985
+12
+25.80424369717224
+22
+-97.501803776657
+32
+226.4250128873761
+13
+25.80424369717224
+23
+-97.501803776657
+33
+226.4250128873761
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.07532221916842
+20
+-96.55444923471055
+30
+226.87952402599817
+11
+26.545638372420722
+21
+-96.72238106102876
+31
+227.37206320499985
+12
+25.074409546199284
+22
+-98.45919772126372
+32
+225.9139160246687
+13
+25.074409546199284
+23
+-98.45919772126372
+33
+225.9139160246687
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.55263553185064
+20
+-95.8410431971819
+30
+227.46272205326596
+11
+26.545638372420722
+21
+-96.72238106102876
+31
+227.37206320499985
+12
+25.07532221916842
+22
+-96.55444923471055
+32
+226.87952402599817
+13
+25.07532221916842
+23
+-96.55444923471055
+33
+226.87952402599817
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.304707358740586
+20
+-94.61501917533066
+30
+226.9151182717943
+11
+26.55263553185064
+21
+-95.8410431971819
+31
+227.46272205326596
+12
+25.07532221916842
+22
+-96.55444923471055
+32
+226.87952402599817
+13
+25.07532221916842
+23
+-96.55444923471055
+33
+226.87952402599817
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.304707358740586
+20
+-94.61501917533066
+30
+226.9151182717943
+11
+26.601311423537044
+21
+-95.286746480603
+31
+227.55703159340854
+12
+26.55263553185064
+22
+-95.8410431971819
+32
+227.46272205326596
+13
+26.55263553185064
+23
+-95.8410431971819
+33
+227.46272205326596
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.098124393228883
+20
+-93.65275764155531
+30
+227.95556545659133
+11
+26.601311423537044
+21
+-95.286746480603
+31
+227.55703159340854
+12
+25.304707358740586
+22
+-94.61501917533066
+32
+226.9151182717943
+13
+25.304707358740586
+23
+-94.61501917533066
+33
+226.9151182717943
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.098124393228883
+20
+-93.65275764155531
+30
+227.95556545659133
+11
+27.60433901659992
+21
+-95.9417414481083
+31
+227.96895132680459
+12
+26.601311423537044
+22
+-95.286746480603
+32
+227.55703159340854
+13
+26.601311423537044
+23
+-95.286746480603
+33
+227.55703159340854
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.098124393228883
+20
+-93.65275764155531
+30
+227.95556545659133
+11
+27.634761448903923
+21
+-94.47172951917922
+31
+228.77970914770654
+12
+27.60433901659992
+22
+-95.9417414481083
+32
+227.96895132680459
+13
+27.60433901659992
+23
+-95.9417414481083
+33
+227.96895132680459
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.634761448903923
+20
+-94.47172951917922
+30
+228.77970914770654
+11
+28.849529170802647
+21
+-96.40598776506721
+31
+227.4688065397267
+12
+27.60433901659992
+22
+-95.9417414481083
+32
+227.96895132680459
+13
+27.60433901659992
+23
+-95.9417414481083
+33
+227.96895132680459
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.604918164910952
+20
+-95.04123745190955
+30
+226.75783429678253
+11
+28.849529170802647
+21
+-96.40598776506721
+31
+227.4688065397267
+12
+27.634761448903923
+22
+-94.47172951917922
+32
+228.77970914770654
+13
+27.634761448903923
+23
+-94.47172951917922
+33
+228.77970914770654
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.604918164910952
+20
+-95.04123745190955
+30
+226.75783429678253
+11
+29.58970694875896
+21
+-97.06706721903295
+31
+226.9680533040024
+12
+28.849529170802647
+22
+-96.40598776506721
+32
+227.4688065397267
+13
+28.849529170802647
+23
+-96.40598776506721
+33
+227.4688065397267
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.604918164910952
+20
+-95.04123745190955
+30
+226.75783429678253
+11
+30.69830038191674
+21
+-96.50364377276273
+31
+226.09858018875445
+12
+29.58970694875896
+22
+-97.06706721903295
+32
+226.9680533040024
+13
+29.58970694875896
+23
+-97.06706721903295
+33
+226.9680533040024
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.595791435219756
+20
+-98.06096808240461
+30
+226.92637457174567
+11
+30.575393755408555
+21
+-98.25688854644221
+31
+226.14056314533357
+12
+28.882385397690964
+22
+-99.8099537155615
+32
+226.50563233298115
+13
+28.882385397690964
+23
+-99.8099537155615
+33
+226.50563233298115
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.03935049821208
+20
+-98.91310041123944
+30
+225.94464268129562
+11
+28.882385397690964
+21
+-99.8099537155615
+31
+226.50563233298115
+12
+30.575393755408555
+22
+-98.25688854644221
+32
+226.14056314533357
+13
+30.575393755408555
+23
+-98.25688854644221
+33
+226.14056314533357
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.69830038191674
+20
+-96.50364377276273
+30
+226.09858018875445
+11
+30.575393755408555
+21
+-98.25688854644221
+31
+226.14056314533357
+12
+29.58970694875896
+22
+-97.06706721903295
+32
+226.9680533040024
+13
+29.58970694875896
+23
+-97.06706721903295
+33
+226.9680533040024
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.58970694875896
+20
+-97.06706721903295
+30
+226.9680533040024
+11
+30.575393755408555
+21
+-98.25688854644221
+31
+226.14056314533357
+12
+29.595791435219756
+22
+-98.06096808240461
+32
+226.92637457174567
+13
+29.595791435219756
+23
+-98.06096808240461
+33
+226.92637457174567
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.89787153783095
+20
+-99.22401766938609
+30
+225.12780037393318
+11
+29.079522759020882
+21
+-101.4150412439206
+31
+226.58564332994027
+12
+28.92710637317784
+22
+-101.01316091318459
+32
+226.17980808300504
+13
+28.92710637317784
+23
+-101.01316091318459
+33
+226.17980808300504
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.89787153783095
+20
+-99.22401766938609
+30
+225.12780037393318
+11
+31.662691485953516
+21
+-99.90122101247331
+31
+225.7846206873764
+12
+29.079522759020882
+22
+-101.4150412439206
+32
+226.58564332994027
+13
+29.079522759020882
+23
+-101.4150412439206
+33
+226.58564332994027
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.03935049821208
+20
+-98.91310041123944
+30
+225.94464268129562
+11
+28.92710637317784
+21
+-101.01316091318459
+31
+226.17980808300504
+12
+28.882385397690964
+22
+-99.8099537155615
+32
+226.50563233298115
+13
+28.882385397690964
+23
+-99.8099537155615
+33
+226.50563233298115
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.03935049821208
+20
+-98.91310041123944
+30
+225.94464268129562
+11
+30.89787153783095
+21
+-99.22401766938609
+31
+225.12780037393318
+12
+28.92710637317784
+22
+-101.01316091318459
+32
+226.17980808300504
+13
+28.92710637317784
+23
+-101.01316091318459
+33
+226.17980808300504
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.079522759020882
+20
+-101.4150412439206
+30
+226.58564332994027
+11
+27.33814273393993
+21
+-100.69250847670065
+31
+226.50380698704268
+12
+28.92710637317784
+22
+-101.01316091318459
+32
+226.17980808300504
+13
+28.92710637317784
+23
+-101.01316091318459
+33
+226.17980808300504
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.079522759020882
+20
+-101.4150412439206
+30
+226.58564332994027
+11
+26.267273116839107
+21
+-101.27935719584497
+31
+227.511702169274
+12
+27.33814273393993
+22
+-100.69250847670065
+32
+226.50380698704268
+13
+27.33814273393993
+23
+-100.69250847670065
+33
+226.50380698704268
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.71659779180168
+20
+-99.531892684303
+30
+226.8125946749286
+11
+28.92710637317784
+21
+-101.01316091318459
+31
+226.17980808300504
+12
+27.33814273393993
+22
+-100.69250847670065
+32
+226.50380698704268
+13
+27.33814273393993
+23
+-100.69250847670065
+33
+226.50380698704268
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.71659779180168
+20
+-99.531892684303
+30
+226.8125946749286
+11
+28.882385397690964
+21
+-99.8099537155615
+31
+226.50563233298115
+12
+28.92710637317784
+22
+-101.01316091318459
+32
+226.17980808300504
+13
+28.92710637317784
+23
+-101.01316091318459
+33
+226.17980808300504
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.267273116839107
+20
+-101.27935719584497
+30
+227.511702169274
+11
+24.30289666296985
+21
+-100.34356317817385
+31
+227.34285766998707
+12
+24.112756461069843
+22
+-99.58087280031235
+32
+226.4140608117462
+13
+24.112756461069843
+23
+-99.58087280031235
+33
+226.4140608117462
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.33814273393993
+20
+-100.69250847670065
+30
+226.50380698704268
+11
+26.267273116839107
+21
+-101.27935719584497
+31
+227.511702169274
+12
+24.112756461069843
+22
+-99.58087280031235
+32
+226.4140608117462
+13
+24.112756461069843
+23
+-99.58087280031235
+33
+226.4140608117462
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.074409546199284
+20
+-98.45919772126372
+30
+225.9139160246687
+11
+27.33814273393993
+21
+-100.69250847670065
+31
+226.50380698704268
+12
+24.112756461069843
+22
+-99.58087280031235
+32
+226.4140608117462
+13
+24.112756461069843
+23
+-99.58087280031235
+33
+226.4140608117462
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.074409546199284
+20
+-98.45919772126372
+30
+225.9139160246687
+11
+27.71659779180168
+21
+-99.531892684303
+31
+226.8125946749286
+12
+27.33814273393993
+22
+-100.69250847670065
+32
+226.50380698704268
+13
+27.33814273393993
+23
+-100.69250847670065
+33
+226.50380698704268
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.07523431816327
+20
+-98.10508060924502
+30
+225.30059978942032
+11
+30.03935049821208
+21
+-98.91310041123944
+31
+225.94464268129562
+12
+30.575393755408555
+22
+-98.25688854644221
+32
+226.14056314533357
+13
+30.575393755408555
+23
+-98.25688854644221
+33
+226.14056314533357
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.88720903635703
+20
+-95.01629105742171
+30
+232.27250860052837
+11
+31.687942104765835
+21
+-96.13553234188632
+31
+234.3457973620459
+12
+32.82421995132023
+22
+-98.07039903642065
+32
+234.03518432822128
+13
+32.82421995132023
+23
+-98.07039903642065
+33
+234.03518432822128
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.31128309250727
+20
+-97.53648534948486
+30
+231.49217321193035
+11
+31.88720903635703
+21
+-95.01629105742171
+31
+232.27250860052837
+12
+32.82421995132023
+22
+-98.07039903642065
+32
+234.03518432822128
+13
+32.82421995132023
+23
+-98.07039903642065
+33
+234.03518432822128
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.202198412043607
+20
+-100.20179464363882
+30
+233.5134396142074
+11
+24.96397611693577
+21
+-100.98304270520615
+31
+235.4592583843708
+12
+25.301056666864092
+22
+-98.36488818112385
+32
+235.6792125699297
+13
+25.301056666864092
+23
+-98.36488818112385
+33
+235.6792125699297
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.202198412043607
+20
+-100.20179464363882
+30
+233.5134396142074
+11
+25.301056666864092
+21
+-98.36488818112385
+31
+235.6792125699297
+12
+24.850196220118807
+22
+-97.64691877874913
+32
+234.34671003501467
+13
+24.850196220118807
+23
+-97.64691877874913
+33
+234.34671003501467
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.82421995132023
+20
+-98.07039903642065
+30
+234.03518432822128
+11
+31.687942104765835
+21
+-96.13553234188632
+31
+234.3457973620459
+12
+32.087084416594315
+22
+-98.92557360848663
+32
+235.90525124194824
+13
+32.087084416594315
+23
+-98.92557360848663
+33
+235.90525124194824
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.687942104765835
+20
+-96.13553234188632
+30
+234.3457973620459
+11
+31.108698993697672
+21
+-97.29006364782376
+31
+236.24233179187706
+12
+32.087084416594315
+22
+-98.92557360848663
+32
+235.90525124194824
+13
+32.087084416594315
+23
+-98.92557360848663
+33
+235.90525124194824
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.165966417266798
+20
+-102.96475994548928
+30
+238.1413000162912
+11
+25.732446756934817
+21
+-102.1114107193627
+31
+240.52033422246421
+12
+25.55265018201817
+22
+-101.78284845047892
+32
+238.4531299474075
+13
+25.55265018201817
+23
+-101.78284845047892
+33
+238.4531299474075
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.165966417266798
+20
+-102.96475994548928
+30
+238.1413000162912
+11
+26.21494653327625
+21
+-103.25651107128516
+31
+240.20850429134794
+12
+25.732446756934817
+22
+-102.1114107193627
+32
+240.52033422246421
+13
+25.732446756934817
+23
+-102.1114107193627
+33
+240.52033422246421
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.4406663308044
+20
+-103.66386743983581
+30
+240.37674034198892
+11
+26.21494653327625
+21
+-103.25651107128516
+31
+240.20850429134794
+12
+26.994369248904714
+22
+-103.46307938662893
+32
+238.34421763975857
+13
+26.994369248904714
+23
+-103.46307938662893
+33
+238.34421763975857
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.994369248904714
+20
+-103.46307938662893
+30
+238.34421763975857
+11
+26.21494653327625
+21
+-103.25651107128516
+31
+240.20850429134794
+12
+26.165966417266798
+22
+-102.96475994548928
+32
+238.1413000162912
+13
+26.165966417266798
+23
+-102.96475994548928
+33
+238.1413000162912
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.21580060557529
+20
+-103.35812199518062
+30
+240.60855927614548
+11
+31.585418507901355
+21
+-101.7941047504315
+31
+238.7515740083096
+12
+30.712903149422637
+22
+-102.35600707508696
+32
+240.7147335648866
+13
+30.712903149422637
+23
+-102.35600707508696
+33
+240.7147335648866
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.585418507901355
+20
+-101.7941047504315
+30
+238.7515740083096
+11
+30.21580060557529
+21
+-103.35812199518062
+31
+240.60855927614548
+12
+31.025949977830795
+22
+-103.01100204259143
+32
+238.4722960797587
+13
+31.025949977830795
+23
+-103.01100204259143
+33
+238.4722960797587
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.559863664765995
+20
+-100.01804315252409
+30
+239.03206883415308
+11
+30.690694773840715
+21
+-100.75091954672793
+31
+240.97423691243995
+12
+30.712903149422637
+22
+-102.35600707508696
+32
+240.7147335648866
+13
+30.712903149422637
+23
+-102.35600707508696
+33
+240.7147335648866
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.585418507901355
+20
+-101.7941047504315
+30
+238.7515740083096
+11
+31.559863664765995
+21
+-100.01804315252409
+31
+239.03206883415308
+12
+30.712903149422637
+22
+-102.35600707508696
+32
+240.7147335648866
+13
+30.712903149422637
+23
+-102.35600707508696
+33
+240.7147335648866
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.55265018201817
+20
+-101.78284845047892
+30
+238.4531299474075
+11
+26.018417620592405
+21
+-100.432092456182
+31
+240.8777978020366
+12
+25.78264377023641
+22
+-99.94381241770229
+32
+238.85227225923646
+13
+25.78264377023641
+23
+-99.94381241770229
+33
+238.85227225923646
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.55265018201817
+20
+-101.78284845047892
+30
+238.4531299474075
+11
+25.732446756934817
+21
+-102.1114107193627
+31
+240.52033422246421
+12
+26.018417620592405
+22
+-100.432092456182
+32
+240.8777978020366
+13
+26.018417620592405
+23
+-100.432092456182
+33
+240.8777978020366
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.821207008424878
+20
+-98.883286427585
+30
+239.2635835439868
+11
+29.98033097954232
+21
+-99.62528955148
+31
+241.20270937904357
+12
+30.690694773840715
+22
+-100.75091954672793
+32
+240.97423691243995
+13
+30.690694773840715
+23
+-100.75091954672793
+33
+240.97423691243995
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.559863664765995
+20
+-100.01804315252409
+30
+239.03206883415308
+11
+30.821207008424878
+21
+-98.883286427585
+31
+239.2635835439868
+12
+30.690694773840715
+22
+-100.75091954672793
+32
+240.97423691243995
+13
+30.690694773840715
+23
+-100.75091954672793
+33
+240.97423691243995
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.025949977830795
+20
+-103.01100204259143
+30
+238.4722960797587
+11
+30.21580060557529
+21
+-103.35812199518062
+31
+240.60855927614548
+12
+28.976390713510327
+22
+-103.68881383432506
+32
+240.4193317472142
+13
+28.976390713510327
+23
+-103.68881383432506
+33
+240.4193317472142
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.025949977830795
+20
+-103.01100204259143
+30
+238.4722960797587
+11
+28.976390713510327
+21
+-103.68881383432506
+31
+240.4193317472142
+12
+29.42055822514872
+22
+-103.65960829931274
+32
+238.25507991310783
+13
+29.42055822514872
+23
+-103.65960829931274
+33
+238.25507991310783
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.42055822514872
+20
+-103.65960829931274
+30
+238.25507991310783
+11
+27.4406663308044
+21
+-103.66386743983581
+31
+240.37674034198892
+12
+26.994369248904714
+22
+-103.46307938662893
+32
+238.34421763975857
+13
+26.994369248904714
+23
+-103.46307938662893
+33
+238.34421763975857
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.42055822514872
+20
+-103.65960829931274
+30
+238.25507991310783
+11
+28.976390713510327
+21
+-103.68881383432506
+31
+240.4193317472142
+12
+27.4406663308044
+22
+-103.66386743983581
+32
+240.37674034198892
+13
+27.4406663308044
+23
+-103.66386743983581
+33
+240.37674034198892
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.78264377023641
+20
+-99.94381241770229
+30
+238.85227225923646
+11
+27.06829575940342
+21
+-99.18751075062546
+31
+241.18050100346176
+12
+27.143439167194302
+22
+-98.1087313011252
+32
+239.39287888127902
+13
+27.143439167194302
+23
+-98.1087313011252
+33
+239.39287888127902
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.78264377023641
+20
+-99.94381241770229
+30
+238.85227225923646
+11
+26.018417620592405
+21
+-100.432092456182
+31
+240.8777978020366
+12
+27.06829575940342
+22
+-99.18751075062546
+32
+241.18050100346176
+13
+27.06829575940342
+23
+-99.18751075062546
+33
+241.18050100346176
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.317121955315116
+20
+-98.20577886017482
+30
+239.17444581733628
+11
+27.143439167194302
+21
+-98.1087313011252
+31
+239.39287888127902
+12
+28.84831227351048
+22
+-99.26478372867763
+32
+241.35603843785583
+13
+28.84831227351048
+23
+-99.26478372867763
+33
+241.35603843785583
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.84831227351048
+20
+-99.26478372867763
+30
+241.35603843785583
+11
+27.143439167194302
+21
+-98.1087313011252
+31
+239.39287888127902
+12
+27.06829575940342
+22
+-99.18751075062546
+32
+241.18050100346176
+13
+27.06829575940342
+23
+-99.18751075062546
+33
+241.18050100346176
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.821207008424878
+20
+-98.883286427585
+30
+239.2635835439868
+11
+29.317121955315116
+21
+-98.20577886017482
+31
+239.17444581733628
+12
+29.98033097954232
+22
+-99.62528955148
+32
+241.20270937904357
+13
+29.98033097954232
+23
+-99.62528955148
+33
+241.20270937904357
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.98033097954232
+20
+-99.62528955148
+30
+241.20270937904357
+11
+29.317121955315116
+21
+-98.20577886017482
+31
+239.17444581733628
+12
+28.84831227351048
+22
+-99.26478372867763
+32
+241.35603843785583
+13
+28.84831227351048
+23
+-99.26478372867763
+33
+241.35603843785583
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.07523431816327
+20
+-98.10508060924502
+30
+225.30059978942032
+11
+30.89787153783095
+21
+-99.22401766938609
+31
+225.12780037393318
+12
+30.03935049821208
+22
+-98.91310041123944
+32
+225.94464268129562
+13
+30.03935049821208
+23
+-98.91310041123944
+33
+225.94464268129562
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.89787153783095
+20
+-99.22401766938609
+30
+225.12780037393318
+11
+31.07523431816327
+21
+-98.10508060924502
+31
+225.30059978942032
+12
+31.869564025620715
+22
+-97.86018002919809
+32
+226.28902461497717
+13
+31.869564025620715
+23
+-97.86018002919809
+33
+226.28902461497717
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.869564025620715
+20
+-97.86018002919809
+30
+226.28902461497717
+11
+31.662691485953516
+21
+-99.90122101247331
+31
+225.7846206873764
+12
+30.89787153783095
+22
+-99.22401766938609
+32
+225.12780037393318
+13
+30.89787153783095
+23
+-99.22401766938609
+33
+225.12780037393318
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.54008908376839
+20
+-95.91071056715765
+30
+226.1953235234814
+11
+33.04021922067863
+21
+-96.37952024896272
+31
+227.4782374937409
+12
+31.07523431816327
+22
+-98.10508060924502
+32
+225.30059978942032
+13
+31.07523431816327
+23
+-98.10508060924502
+33
+225.30059978942032
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.07523431816327
+20
+-98.10508060924502
+30
+225.30059978942032
+11
+33.04021922067863
+21
+-96.37952024896272
+31
+227.4782374937409
+12
+31.869564025620715
+22
+-97.86018002919809
+32
+226.28902461497717
+13
+31.869564025620715
+23
+-97.86018002919809
+33
+226.28902461497717
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.54008908376839
+20
+-95.91071056715765
+30
+226.1953235234814
+11
+30.575393755408555
+21
+-98.25688854644221
+31
+226.14056314533357
+12
+30.69830038191674
+22
+-96.50364377276273
+32
+226.09858018875445
+13
+30.69830038191674
+23
+-96.50364377276273
+33
+226.09858018875445
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.07523431816327
+20
+-98.10508060924502
+30
+225.30059978942032
+11
+30.575393755408555
+21
+-98.25688854644221
+31
+226.14056314533357
+12
+31.54008908376839
+22
+-95.91071056715765
+32
+226.1953235234814
+13
+31.54008908376839
+23
+-95.91071056715765
+33
+226.1953235234814
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.108698993697672
+20
+-97.29006364782376
+30
+236.24233179187706
+11
+29.77650068310552
+21
+-95.4096531071129
+31
+234.19551054646433
+12
+29.54985356244072
+22
+-96.60555892098368
+32
+236.17448976783925
+13
+29.54985356244072
+23
+-96.60555892098368
+33
+236.17448976783925
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.687942104765835
+20
+-96.13553234188632
+30
+234.3457973620459
+11
+29.77650068310552
+21
+-95.4096531071129
+31
+234.19551054646433
+12
+31.108698993697672
+22
+-97.29006364782376
+32
+236.24233179187706
+13
+31.108698993697672
+23
+-97.29006364782376
+33
+236.24233179187706
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.06829575940342
+20
+-99.18751075062546
+30
+241.18050100346176
+11
+26.018417620592405
+21
+-100.432092456182
+31
+240.8777978020366
+12
+29.98033097954232
+22
+-99.62528955148
+32
+241.20270937904357
+13
+29.98033097954232
+23
+-99.62528955148
+33
+241.20270937904357
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.06829575940342
+20
+-99.18751075062546
+30
+241.18050100346176
+11
+29.98033097954232
+21
+-99.62528955148
+31
+241.20270937904357
+12
+28.84831227351048
+22
+-99.26478372867763
+32
+241.35603843785583
+13
+28.84831227351048
+23
+-99.26478372867763
+33
+241.35603843785583
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.21580060557529
+20
+-103.35812199518062
+30
+240.60855927614548
+11
+27.4406663308044
+21
+-103.66386743983581
+31
+240.37674034198892
+12
+28.976390713510327
+22
+-103.68881383432506
+32
+240.4193317472142
+13
+28.976390713510327
+23
+-103.68881383432506
+33
+240.4193317472142
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.025949977830795
+20
+-103.01100204259143
+30
+238.4722960797587
+11
+29.40382588738152
+21
+-103.65230691555968
+31
+237.5912624402344
+12
+30.80051975445816
+22
+-102.90817422140368
+32
+237.60860322664814
+13
+30.80051975445816
+23
+-102.90817422140368
+33
+237.60860322664814
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.025949977830795
+20
+-103.01100204259143
+30
+238.4722960797587
+11
+29.42055822514872
+21
+-103.65960829931274
+31
+238.25507991310783
+12
+29.40382588738152
+22
+-103.65230691555968
+32
+237.5912624402344
+13
+29.40382588738152
+23
+-103.65230691555968
+33
+237.5912624402344
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.42055822514872
+20
+-103.65960829931274
+30
+238.25507991310783
+11
+27.13796312937961
+21
+-103.4448259272462
+31
+237.42637285714707
+12
+29.40382588738152
+22
+-103.65230691555968
+32
+237.5912624402344
+13
+29.40382588738152
+23
+-103.65230691555968
+33
+237.5912624402344
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.42055822514872
+20
+-103.65960829931274
+30
+238.25507991310783
+11
+26.994369248904714
+21
+-103.46307938662893
+31
+238.34421763975857
+12
+27.13796312937961
+22
+-103.4448259272462
+32
+237.42637285714707
+13
+27.13796312937961
+23
+-103.4448259272462
+33
+237.42637285714707
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.770474797314783
+20
+-99.52398285190688
+30
+238.00896243576966
+11
+25.78264377023641
+21
+-99.94381241770229
+31
+238.85227225923646
+12
+27.16351797251496
+22
+-97.80602809970024
+32
+238.64509549524684
+13
+27.16351797251496
+23
+-97.80602809970024
+33
+238.64509549524684
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.16351797251496
+20
+-97.80602809970024
+30
+238.64509549524684
+11
+25.78264377023641
+21
+-99.94381241770229
+31
+238.85227225923646
+12
+27.143439167194302
+22
+-98.1087313011252
+32
+239.39287888127902
+13
+27.143439167194302
+23
+-98.1087313011252
+33
+239.39287888127902
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.34906550923431
+20
+-97.91402773437935
+30
+238.43426803937973
+11
+27.16351797251496
+21
+-97.80602809970024
+31
+238.64509549524684
+12
+27.143439167194302
+22
+-98.1087313011252
+32
+239.39287888127902
+13
+27.143439167194302
+23
+-98.1087313011252
+33
+239.39287888127902
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.34906550923431
+20
+-97.91402773437935
+30
+238.43426803937973
+11
+27.143439167194302
+21
+-98.1087313011252
+31
+239.39287888127902
+12
+29.317121955315116
+22
+-98.20577886017482
+32
+239.17444581733628
+13
+29.317121955315116
+23
+-98.20577886017482
+33
+239.17444581733628
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.758536797878634
+20
+-98.46589065637387
+30
+238.50393540935602
+11
+29.34906550923431
+21
+-97.91402773437935
+31
+238.43426803937973
+12
+29.317121955315116
+22
+-98.20577886017482
+32
+239.17444581733628
+13
+29.317121955315116
+23
+-98.20577886017482
+33
+239.17444581733628
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.821207008424878
+20
+-98.883286427585
+30
+239.2635835439868
+11
+30.758536797878634
+21
+-98.46589065637387
+31
+238.50393540935602
+12
+29.317121955315116
+22
+-98.20577886017482
+32
+239.17444581733628
+13
+29.317121955315116
+23
+-98.20577886017482
+33
+239.17444581733628
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.566252375549833
+20
+-101.9885040928531
+30
+235.09023428052328
+11
+30.80051975445816
+21
+-102.90817422140368
+31
+237.60860322664814
+12
+29.02962997004232
+22
+-103.03473153978784
+32
+235.62049727558173
+13
+29.02962997004232
+23
+-103.03473153978784
+33
+235.62049727558173
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.80051975445816
+20
+-102.90817422140368
+30
+237.60860322664814
+11
+29.40382588738152
+21
+-103.65230691555968
+31
+237.5912624402344
+12
+29.02962997004232
+22
+-103.03473153978784
+32
+235.62049727558173
+13
+29.02962997004232
+23
+-103.03473153978784
+33
+235.62049727558173
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.40382588738152
+20
+-103.65230691555968
+30
+237.5912624402344
+11
+27.13796312937961
+21
+-103.4448259272462
+31
+237.42637285714707
+12
+26.64299015579352
+22
+-102.717425570857
+32
+234.75284950627182
+13
+26.64299015579352
+23
+-102.717425570857
+33
+234.75284950627182
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.40382588738152
+20
+-103.65230691555968
+30
+237.5912624402344
+11
+26.64299015579352
+21
+-102.717425570857
+31
+234.75284950627182
+12
+29.02962997004232
+22
+-103.03473153978784
+32
+235.62049727558173
+13
+29.02962997004232
+23
+-103.03473153978784
+33
+235.62049727558173
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.465627375461207
+20
+-96.96423939784785
+30
+236.29557104840907
+11
+25.770474797314783
+21
+-99.52398285190688
+31
+238.00896243576966
+12
+27.16351797251496
+22
+-97.80602809970024
+32
+238.64509549524684
+13
+27.16351797251496
+23
+-97.80602809970024
+33
+238.64509549524684
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.301056666864092
+20
+-98.36488818112385
+30
+235.6792125699297
+11
+25.770474797314783
+21
+-99.52398285190688
+31
+238.00896243576966
+12
+26.465627375461207
+22
+-96.96423939784785
+32
+236.29557104840907
+13
+26.465627375461207
+23
+-96.96423939784785
+33
+236.29557104840907
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.54985356244072
+20
+-96.60555892098368
+30
+236.17448976783925
+11
+27.16351797251496
+21
+-97.80602809970024
+31
+238.64509549524684
+12
+29.34906550923431
+22
+-97.91402773437935
+32
+238.43426803937973
+13
+29.34906550923431
+23
+-97.91402773437935
+33
+238.43426803937973
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.54985356244072
+20
+-96.60555892098368
+30
+236.17448976783925
+11
+26.465627375461207
+21
+-96.96423939784785
+31
+236.29557104840907
+12
+27.16351797251496
+22
+-97.80602809970024
+32
+238.64509549524684
+13
+27.16351797251496
+23
+-97.80602809970024
+33
+238.64509549524684
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.108698993697672
+20
+-97.29006364782376
+30
+236.24233179187706
+11
+29.34906550923431
+21
+-97.91402773437935
+31
+238.43426803937973
+12
+30.758536797878634
+22
+-98.46589065637387
+32
+238.50393540935602
+13
+30.758536797878634
+23
+-98.46589065637387
+33
+238.50393540935602
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.108698993697672
+20
+-97.29006364782376
+30
+236.24233179187706
+11
+29.54985356244072
+21
+-96.60555892098368
+31
+236.17448976783925
+12
+29.34906550923431
+22
+-97.91402773437935
+32
+238.43426803937973
+13
+29.34906550923431
+23
+-97.91402773437935
+33
+238.43426803937973
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.018417620592405
+20
+-100.432092456182
+30
+240.8777978020366
+11
+25.732446756934817
+21
+-102.1114107193627
+31
+240.52033422246421
+12
+30.690694773840715
+22
+-100.75091954672793
+32
+240.97423691243995
+13
+30.690694773840715
+23
+-100.75091954672793
+33
+240.97423691243995
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.98033097954232
+20
+-99.62528955148
+30
+241.20270937904357
+11
+26.018417620592405
+21
+-100.432092456182
+31
+240.8777978020366
+12
+30.690694773840715
+22
+-100.75091954672793
+32
+240.97423691243995
+13
+30.690694773840715
+23
+-100.75091954672793
+33
+240.97423691243995
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.770474797314783
+20
+-99.52398285190688
+30
+238.00896243576966
+11
+25.560255790094164
+21
+-101.69279805085891
+31
+238.02113140869074
+12
+25.55265018201817
+22
+-101.78284845047892
+32
+238.4531299474075
+13
+25.55265018201817
+23
+-101.78284845047892
+33
+238.4531299474075
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.770474797314783
+20
+-99.52398285190688
+30
+238.00896243576966
+11
+25.55265018201817
+21
+-101.78284845047892
+31
+238.4531299474075
+12
+25.78264377023641
+22
+-99.94381241770229
+32
+238.85227225923646
+13
+25.78264377023641
+23
+-99.94381241770229
+33
+238.85227225923646
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.66238726163047
+20
+-99.50694628981671
+30
+237.84255173106683
+11
+30.758536797878634
+21
+-98.46589065637387
+31
+238.50393540935602
+12
+30.821207008424878
+22
+-98.883286427585
+32
+239.2635835439868
+13
+30.821207008424878
+23
+-98.883286427585
+33
+239.2635835439868
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.66238726163047
+20
+-99.50694628981671
+30
+237.84255173106683
+11
+30.821207008424878
+21
+-98.883286427585
+31
+239.2635835439868
+12
+31.559863664765995
+22
+-100.01804315252409
+32
+239.03206883415308
+13
+31.559863664765995
+23
+-100.01804315252409
+33
+239.03206883415308
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.96397611693577
+20
+-100.98304270520615
+30
+235.4592583843708
+11
+25.560255790094164
+21
+-101.69279805085891
+31
+238.02113140869074
+12
+25.770474797314783
+22
+-99.52398285190688
+32
+238.00896243576966
+13
+25.770474797314783
+23
+-99.52398285190688
+33
+238.00896243576966
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.96397611693577
+20
+-100.98304270520615
+30
+235.4592583843708
+11
+25.770474797314783
+21
+-99.52398285190688
+31
+238.00896243576966
+12
+25.301056666864092
+22
+-98.36488818112385
+32
+235.6792125699297
+13
+25.301056666864092
+23
+-98.36488818112385
+33
+235.6792125699297
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.087084416594315
+20
+-98.92557360848663
+30
+235.90525124194824
+11
+31.108698993697672
+21
+-97.29006364782376
+31
+236.24233179187706
+12
+31.66238726163047
+22
+-99.50694628981671
+32
+237.84255173106683
+13
+31.66238726163047
+23
+-99.50694628981671
+33
+237.84255173106683
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.108698993697672
+20
+-97.29006364782376
+30
+236.24233179187706
+11
+30.758536797878634
+21
+-98.46589065637387
+31
+238.50393540935602
+12
+31.66238726163047
+22
+-99.50694628981671
+32
+237.84255173106683
+13
+31.66238726163047
+23
+-99.50694628981671
+33
+237.84255173106683
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.73782024357687
+20
+-100.96752726472944
+30
+229.51136864461597
+11
+29.61769558647864
+21
+-102.05512921959732
+31
+228.95433390912956
+12
+31.662691485953516
+22
+-99.90122101247331
+32
+225.7846206873764
+13
+31.662691485953516
+23
+-99.90122101247331
+33
+225.7846206873764
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.662691485953516
+20
+-99.90122101247331
+30
+225.7846206873764
+11
+29.61769558647864
+21
+-102.05512921959732
+31
+228.95433390912956
+12
+29.079522759020882
+22
+-101.4150412439206
+32
+226.58564332994027
+13
+29.079522759020882
+23
+-101.4150412439206
+33
+226.58564332994027
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.61769558647864
+20
+-102.05512921959732
+30
+228.95433390912956
+11
+25.973392420782485
+21
+-101.52577889750776
+31
+229.13291358675417
+12
+29.079522759020882
+22
+-101.4150412439206
+32
+226.58564332994027
+13
+29.079522759020882
+23
+-101.4150412439206
+33
+226.58564332994027
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.079522759020882
+20
+-101.4150412439206
+30
+226.58564332994027
+11
+25.973392420782485
+21
+-101.52577889750776
+31
+229.13291358675417
+12
+26.267273116839107
+22
+-101.27935719584497
+32
+227.511702169274
+13
+26.267273116839107
+23
+-101.27935719584497
+33
+227.511702169274
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.996803043489045
+20
+-93.45105691538069
+30
+231.02610154903414
+11
+24.421848373278486
+21
+-94.78933971243282
+31
+228.24397011483302
+12
+24.439189159691768
+22
+-95.58458209285997
+32
+230.15084817164748
+13
+24.439189159691768
+23
+-95.58458209285997
+33
+230.15084817164748
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.421848373278486
+20
+-94.78933971243282
+30
+228.24397011483302
+11
+26.996803043489045
+21
+-93.45105691538069
+31
+231.02610154903414
+12
+25.899161685960728
+22
+-93.09481023310038
+32
+229.68751452765798
+13
+25.899161685960728
+23
+-93.09481023310038
+33
+229.68751452765798
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.980026755219274
+20
+-92.81005626673517
+30
+230.19313535255077
+11
+25.899161685960728
+21
+-93.09481023310038
+31
+229.68751452765798
+12
+26.996803043489045
+22
+-93.45105691538069
+32
+231.02610154903414
+13
+26.996803043489045
+23
+-93.45105691538069
+33
+231.02610154903414
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.980026755219274
+20
+-92.81005626673517
+30
+230.19313535255077
+11
+29.11846347237
+21
+-92.58462604336242
+31
+229.76235371112622
+12
+25.899161685960728
+22
+-93.09481023310038
+32
+229.68751452765798
+13
+25.899161685960728
+23
+-93.09481023310038
+33
+229.68751452765798
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.05757465725944
+20
+-94.14742639081892
+30
+230.13076936632703
+11
+29.11846347237
+21
+-92.58462604336242
+31
+229.76235371112622
+12
+29.980026755219274
+22
+-92.81005626673517
+32
+230.19313535255077
+13
+29.980026755219274
+23
+-92.81005626673517
+33
+230.19313535255077
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.05757465725944
+20
+-94.14742639081892
+30
+230.13076936632703
+11
+31.378850192557195
+21
+-94.5849009673497
+31
+226.95132096623612
+12
+29.11846347237
+22
+-92.58462604336242
+32
+229.76235371112622
+13
+29.11846347237
+23
+-92.58462604336242
+33
+229.76235371112622
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.73782024357687
+20
+-100.96752726472944
+30
+229.51136864461597
+11
+32.424773415168715
+21
+-101.30034867413553
+31
+230.69936462608723
+12
+29.506045259922953
+22
+-102.27690875109387
+32
+230.37779951663362
+13
+29.506045259922953
+23
+-102.27690875109387
+33
+230.37779951663362
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.73782024357687
+20
+-100.96752726472944
+30
+229.51136864461597
+11
+29.506045259922953
+21
+-102.27690875109387
+31
+230.37779951663362
+12
+29.61769558647864
+22
+-102.05512921959732
+32
+228.95433390912956
+13
+29.61769558647864
+23
+-102.05512921959732
+33
+228.95433390912956
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.61769558647864
+20
+-102.05512921959732
+30
+228.95433390912956
+11
+29.506045259922953
+21
+-102.27690875109387
+31
+230.37779951663362
+12
+26.5264722400692
+22
+-101.96994640914647
+32
+230.342205270838
+13
+26.5264722400692
+23
+-101.96994640914647
+33
+230.342205270838
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.61769558647864
+20
+-102.05512921959732
+30
+228.95433390912956
+11
+26.5264722400692
+21
+-101.96994640914647
+31
+230.342205270838
+12
+25.973392420782485
+22
+-101.52577889750776
+32
+229.13291358675417
+13
+25.973392420782485
+23
+-101.52577889750776
+33
+229.13291358675417
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.484793507812725
+20
+-94.33482857381203
+30
+231.9332984803392
+11
+24.439189159691768
+21
+-95.58458209285997
+31
+230.15084817164748
+12
+24.363741527577858
+22
+-96.20915462806147
+32
+231.59195878988783
+13
+24.363741527577858
+23
+-96.20915462806147
+33
+231.59195878988783
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.996803043489045
+20
+-93.45105691538069
+30
+231.02610154903414
+11
+24.439189159691768
+21
+-95.58458209285997
+31
+230.15084817164748
+12
+26.484793507812725
+22
+-94.33482857381203
+32
+231.9332984803392
+13
+26.484793507812725
+23
+-94.33482857381203
+33
+231.9332984803392
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.825785023437998
+20
+-93.8943117540501
+30
+231.9068309642348
+11
+26.996803043489045
+21
+-93.45105691538069
+31
+231.02610154903414
+12
+26.484793507812725
+22
+-94.33482857381203
+32
+231.9332984803392
+13
+26.484793507812725
+23
+-94.33482857381203
+33
+231.9332984803392
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.980026755219274
+20
+-92.81005626673517
+30
+230.19313535255077
+11
+26.996803043489045
+21
+-93.45105691538069
+31
+231.02610154903414
+12
+29.825785023437998
+22
+-93.8943117540501
+32
+231.9068309642348
+13
+29.825785023437998
+23
+-93.8943117540501
+33
+231.9068309642348
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.88720903635703
+20
+-95.01629105742171
+30
+232.27250860052837
+11
+29.980026755219274
+21
+-92.81005626673517
+31
+230.19313535255077
+12
+29.825785023437998
+22
+-93.8943117540501
+32
+231.9068309642348
+13
+29.825785023437998
+23
+-93.8943117540501
+33
+231.9068309642348
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.05757465725944
+20
+-94.14742639081892
+30
+230.13076936632703
+11
+29.980026755219274
+21
+-92.81005626673517
+31
+230.19313535255077
+12
+31.88720903635703
+22
+-95.01629105742171
+32
+232.27250860052837
+13
+31.88720903635703
+23
+-95.01629105742171
+33
+232.27250860052837
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.424773415168715
+20
+-101.30034867413553
+30
+230.69936462608723
+11
+31.73935601535959
+21
+-101.80262303147518
+31
+233.00781878931454
+12
+29.36701474429368
+22
+-102.4643109340872
+32
+233.21895046950388
+13
+29.36701474429368
+23
+-102.4643109340872
+33
+233.21895046950388
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.424773415168715
+20
+-101.30034867413553
+30
+230.69936462608723
+11
+29.36701474429368
+21
+-102.4643109340872
+31
+233.21895046950388
+12
+29.506045259922953
+22
+-102.27690875109387
+32
+230.37779951663362
+13
+29.506045259922953
+23
+-102.27690875109387
+33
+230.37779951663362
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.506045259922953
+20
+-102.27690875109387
+30
+230.37779951663362
+11
+29.36701474429368
+21
+-102.4643109340872
+31
+233.21895046950388
+12
+26.72482649869129
+22
+-102.39951115327963
+32
+233.0300271648963
+13
+26.72482649869129
+23
+-102.39951115327963
+33
+233.0300271648963
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.506045259922953
+20
+-102.27690875109387
+30
+230.37779951663362
+11
+26.72482649869129
+21
+-102.39951115327963
+31
+233.0300271648963
+12
+26.5264722400692
+22
+-101.96994640914647
+32
+230.342205270838
+13
+26.5264722400692
+23
+-101.96994640914647
+33
+230.342205270838
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.6512042125156
+20
+-95.82126861618599
+30
+234.2910369838988
+11
+24.363741527577858
+21
+-96.20915462806147
+31
+231.59195878988783
+12
+24.850196220118807
+22
+-97.64691877874913
+32
+234.34671003501467
+13
+24.850196220118807
+23
+-97.64691877874913
+33
+234.34671003501467
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.6512042125156
+20
+-95.82126861618599
+30
+234.2910369838988
+11
+26.484793507812725
+21
+-94.33482857381203
+31
+231.9332984803392
+12
+24.363741527577858
+22
+-96.20915462806147
+32
+231.59195878988783
+13
+24.363741527577858
+23
+-96.20915462806147
+33
+231.59195878988783
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.77650068310552
+20
+-95.4096531071129
+30
+234.19551054646433
+11
+26.484793507812725
+21
+-94.33482857381203
+31
+231.9332984803392
+12
+26.6512042125156
+22
+-95.82126861618599
+32
+234.2910369838988
+13
+26.6512042125156
+23
+-95.82126861618599
+33
+234.2910369838988
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.825785023437998
+20
+-93.8943117540501
+30
+231.9068309642348
+11
+26.484793507812725
+21
+-94.33482857381203
+31
+231.9332984803392
+12
+29.77650068310552
+22
+-95.4096531071129
+32
+234.19551054646433
+13
+29.77650068310552
+23
+-95.4096531071129
+33
+234.19551054646433
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.687942104765835
+20
+-96.13553234188632
+30
+234.3457973620459
+11
+29.825785023437998
+21
+-93.8943117540501
+31
+231.9068309642348
+12
+29.77650068310552
+22
+-95.4096531071129
+32
+234.19551054646433
+13
+29.77650068310552
+23
+-95.4096531071129
+33
+234.19551054646433
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.88720903635703
+20
+-95.01629105742171
+30
+232.27250860052837
+11
+29.825785023437998
+21
+-93.8943117540501
+31
+231.9068309642348
+12
+31.687942104765835
+22
+-96.13553234188632
+32
+234.3457973620459
+13
+31.687942104765835
+23
+-96.13553234188632
+33
+234.3457973620459
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.72482649869129
+20
+-102.39951115327963
+30
+233.0300271648963
+11
+25.29040881555769
+21
+-101.64868552401715
+31
+233.5718506842304
+12
+26.5264722400692
+22
+-101.96994640914647
+32
+230.342205270838
+13
+26.5264722400692
+23
+-101.96994640914647
+33
+230.342205270838
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.5264722400692
+20
+-101.96994640914647
+30
+230.342205270838
+11
+25.29040881555769
+21
+-101.64868552401715
+31
+233.5718506842304
+12
+24.859322949810014
+22
+-101.10077751822145
+32
+231.09059710551665
+13
+24.859322949810014
+23
+-101.10077751822145
+33
+231.09059710551665
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.859322949810014
+20
+-101.10077751822145
+30
+231.09059710551665
+11
+25.29040881555769
+21
+-101.64868552401715
+31
+233.5718506842304
+12
+24.202198412043607
+22
+-100.20179464363882
+32
+233.5134396142074
+13
+24.202198412043607
+23
+-100.20179464363882
+33
+233.5134396142074
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.859322949810014
+20
+-101.10077751822145
+30
+231.09059710551665
+11
+24.202198412043607
+21
+-100.20179464363882
+31
+233.5134396142074
+12
+23.610786328053848
+22
+-98.90853704639518
+32
+231.30051188841472
+13
+23.610786328053848
+23
+-98.90853704639518
+33
+231.30051188841472
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.31128309250727
+20
+-97.53648534948486
+30
+231.49217321193035
+11
+32.82421995132023
+21
+-98.07039903642065
+31
+234.03518432822128
+12
+32.75394413269799
+22
+-100.11174424401904
+32
+233.68167566484857
+13
+32.75394413269799
+23
+-100.11174424401904
+33
+233.68167566484857
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.08615709345767
+20
+-99.80386922910182
+30
+230.99628756537462
+11
+33.31128309250727
+21
+-97.53648534948486
+31
+231.49217321193035
+12
+32.75394413269799
+22
+-100.11174424401904
+32
+233.68167566484857
+13
+32.75394413269799
+23
+-100.11174424401904
+33
+233.68167566484857
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.08615709345767
+20
+-99.80386922910182
+30
+230.99628756537462
+11
+32.75394413269799
+21
+-100.11174424401904
+31
+233.68167566484857
+12
+31.73935601535959
+22
+-101.80262303147518
+32
+233.00781878931454
+13
+31.73935601535959
+23
+-101.80262303147518
+33
+233.00781878931454
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.424773415168715
+20
+-101.30034867413553
+30
+230.69936462608723
+11
+33.08615709345767
+21
+-99.80386922910182
+31
+230.99628756537462
+12
+31.73935601535959
+22
+-101.80262303147518
+32
+233.00781878931454
+13
+31.73935601535959
+23
+-101.80262303147518
+33
+233.00781878931454
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.72482649869129
+20
+-102.39951115327963
+30
+233.0300271648963
+11
+26.64299015579352
+21
+-102.717425570857
+31
+234.75284950627182
+12
+25.603759868288893
+22
+-102.12357969228297
+32
+235.4184923250834
+13
+25.603759868288893
+23
+-102.12357969228297
+33
+235.4184923250834
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.72482649869129
+20
+-102.39951115327963
+30
+233.0300271648963
+11
+25.603759868288893
+21
+-102.12357969228297
+31
+235.4184923250834
+12
+25.29040881555769
+22
+-101.64868552401715
+32
+233.5718506842304
+13
+25.29040881555769
+23
+-101.64868552401715
+33
+233.5718506842304
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.29040881555769
+20
+-101.64868552401715
+30
+233.5718506842304
+11
+25.603759868288893
+21
+-102.12357969228297
+31
+235.4184923250834
+12
+24.96397611693577
+22
+-100.98304270520615
+32
+235.4592583843708
+13
+24.96397611693577
+23
+-100.98304270520615
+33
+235.4592583843708
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.202198412043607
+20
+-100.20179464363882
+30
+233.5134396142074
+11
+25.29040881555769
+21
+-101.64868552401715
+31
+233.5718506842304
+12
+24.96397611693577
+22
+-100.98304270520615
+32
+235.4592583843708
+13
+24.96397611693577
+23
+-100.98304270520615
+33
+235.4592583843708
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.82421995132023
+20
+-98.07039903642065
+30
+234.03518432822128
+11
+32.087084416594315
+21
+-98.92557360848663
+31
+235.90525124194824
+12
+32.246802186190315
+22
+-100.92706542976666
+32
+235.34487003890797
+13
+32.246802186190315
+23
+-100.92706542976666
+33
+235.34487003890797
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.75394413269799
+20
+-100.11174424401904
+30
+233.68167566484857
+11
+32.82421995132023
+21
+-98.07039903642065
+31
+234.03518432822128
+12
+32.246802186190315
+22
+-100.92706542976666
+32
+235.34487003890797
+13
+32.246802186190315
+23
+-100.92706542976666
+33
+235.34487003890797
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.75394413269799
+20
+-100.11174424401904
+30
+233.68167566484857
+11
+32.246802186190315
+21
+-100.92706542976666
+31
+235.34487003890797
+12
+31.566252375549833
+22
+-101.9885040928531
+32
+235.09023428052328
+13
+31.566252375549833
+23
+-101.9885040928531
+33
+235.09023428052328
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.73935601535959
+20
+-101.80262303147518
+30
+233.00781878931454
+11
+32.75394413269799
+21
+-100.11174424401904
+31
+233.68167566484857
+12
+31.566252375549833
+22
+-101.9885040928531
+32
+235.09023428052328
+13
+31.566252375549833
+23
+-101.9885040928531
+33
+235.09023428052328
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.21494653327625
+20
+-103.25651107128516
+30
+240.20850429134794
+11
+27.4406663308044
+21
+-103.66386743983581
+31
+240.37674034198892
+12
+30.21580060557529
+22
+-103.35812199518062
+32
+240.60855927614548
+13
+30.21580060557529
+23
+-103.35812199518062
+33
+240.60855927614548
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.712903149422637
+20
+-102.35600707508696
+30
+240.7147335648866
+11
+26.21494653327625
+21
+-103.25651107128516
+31
+240.20850429134794
+12
+30.21580060557529
+22
+-103.35812199518062
+32
+240.60855927614548
+13
+30.21580060557529
+23
+-103.35812199518062
+33
+240.60855927614548
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.732446756934817
+20
+-102.1114107193627
+30
+240.52033422246421
+11
+26.21494653327625
+21
+-103.25651107128516
+31
+240.20850429134794
+12
+30.712903149422637
+22
+-102.35600707508696
+32
+240.7147335648866
+13
+30.712903149422637
+23
+-102.35600707508696
+33
+240.7147335648866
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.690694773840715
+20
+-100.75091954672793
+30
+240.97423691243995
+11
+25.732446756934817
+21
+-102.1114107193627
+31
+240.52033422246421
+12
+30.712903149422637
+22
+-102.35600707508696
+32
+240.7147335648866
+13
+30.712903149422637
+23
+-102.35600707508696
+33
+240.7147335648866
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.560255790094164
+20
+-101.69279805085891
+30
+238.02113140869074
+11
+26.1954761766017
+21
+-102.95776278605932
+31
+238.04181866265714
+12
+26.165966417266798
+22
+-102.96475994548928
+32
+238.1413000162912
+13
+26.165966417266798
+23
+-102.96475994548928
+33
+238.1413000162912
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.560255790094164
+20
+-101.69279805085891
+30
+238.02113140869074
+11
+26.165966417266798
+21
+-102.96475994548928
+31
+238.1413000162912
+12
+25.55265018201817
+22
+-101.78284845047892
+32
+238.4531299474075
+13
+25.55265018201817
+23
+-101.78284845047892
+33
+238.4531299474075
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.13796312937961
+20
+-103.4448259272462
+30
+237.42637285714707
+11
+26.994369248904714
+21
+-103.46307938662893
+31
+238.34421763975857
+12
+26.1954761766017
+22
+-102.95776278605932
+32
+238.04181866265714
+13
+26.1954761766017
+23
+-102.95776278605932
+33
+238.04181866265714
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.994369248904714
+20
+-103.46307938662893
+30
+238.34421763975857
+11
+26.165966417266798
+21
+-102.96475994548928
+31
+238.1413000162912
+12
+26.1954761766017
+22
+-102.95776278605932
+32
+238.04181866265714
+13
+26.1954761766017
+23
+-102.95776278605932
+33
+238.04181866265714
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.80051975445816
+20
+-102.90817422140368
+30
+237.60860322664814
+11
+31.607931107806316
+21
+-101.54129433798506
+31
+237.73303097477188
+12
+31.585418507901355
+22
+-101.7941047504315
+32
+238.7515740083096
+13
+31.585418507901355
+23
+-101.7941047504315
+33
+238.7515740083096
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.80051975445816
+20
+-102.90817422140368
+30
+237.60860322664814
+11
+31.585418507901355
+21
+-101.7941047504315
+31
+238.7515740083096
+12
+31.025949977830795
+22
+-103.01100204259143
+32
+238.4722960797587
+13
+31.025949977830795
+23
+-103.01100204259143
+33
+238.4722960797587
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.607931107806316
+20
+-101.54129433798506
+30
+237.73303097477188
+11
+31.66238726163047
+21
+-99.50694628981671
+31
+237.84255173106683
+12
+31.559863664765995
+22
+-100.01804315252409
+32
+239.03206883415308
+13
+31.559863664765995
+23
+-100.01804315252409
+33
+239.03206883415308
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.607931107806316
+20
+-101.54129433798506
+30
+237.73303097477188
+11
+31.559863664765995
+21
+-100.01804315252409
+31
+239.03206883415308
+12
+31.585418507901355
+22
+-101.7941047504315
+32
+238.7515740083096
+13
+31.585418507901355
+23
+-101.7941047504315
+33
+238.7515740083096
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.13796312937961
+20
+-103.4448259272462
+30
+237.42637285714707
+11
+26.1954761766017
+21
+-102.95776278605932
+31
+238.04181866265714
+12
+26.64299015579352
+22
+-102.717425570857
+32
+234.75284950627182
+13
+26.64299015579352
+23
+-102.717425570857
+33
+234.75284950627182
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.64299015579352
+20
+-102.717425570857
+30
+234.75284950627182
+11
+26.1954761766017
+21
+-102.95776278605932
+31
+238.04181866265714
+12
+25.603759868288893
+22
+-102.12357969228297
+32
+235.4184923250834
+13
+25.603759868288893
+23
+-102.12357969228297
+33
+235.4184923250834
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.603759868288893
+20
+-102.12357969228297
+30
+235.4184923250834
+11
+26.1954761766017
+21
+-102.95776278605932
+31
+238.04181866265714
+12
+25.560255790094164
+22
+-101.69279805085891
+32
+238.02113140869074
+13
+25.560255790094164
+23
+-101.69279805085891
+33
+238.02113140869074
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.603759868288893
+20
+-102.12357969228297
+30
+235.4184923250834
+11
+25.560255790094164
+21
+-101.69279805085891
+31
+238.02113140869074
+12
+24.96397611693577
+22
+-100.98304270520615
+32
+235.4592583843708
+13
+24.96397611693577
+23
+-100.98304270520615
+33
+235.4592583843708
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.087084416594315
+20
+-98.92557360848663
+30
+235.90525124194824
+11
+31.66238726163047
+21
+-99.50694628981671
+31
+237.84255173106683
+12
+31.607931107806316
+22
+-101.54129433798506
+32
+237.73303097477188
+13
+31.607931107806316
+23
+-101.54129433798506
+33
+237.73303097477188
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.246802186190315
+20
+-100.92706542976666
+30
+235.34487003890797
+11
+32.087084416594315
+21
+-98.92557360848663
+31
+235.90525124194824
+12
+31.607931107806316
+22
+-101.54129433798506
+32
+237.73303097477188
+13
+31.607931107806316
+23
+-101.54129433798506
+33
+237.73303097477188
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.246802186190315
+20
+-100.92706542976666
+30
+235.34487003890797
+11
+31.607931107806316
+21
+-101.54129433798506
+31
+237.73303097477188
+12
+30.80051975445816
+22
+-102.90817422140368
+32
+237.60860322664814
+13
+30.80051975445816
+23
+-102.90817422140368
+33
+237.60860322664814
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.566252375549833
+20
+-101.9885040928531
+30
+235.09023428052328
+11
+32.246802186190315
+21
+-100.92706542976666
+31
+235.34487003890797
+12
+30.80051975445816
+22
+-102.90817422140368
+32
+237.60860322664814
+13
+30.80051975445816
+23
+-102.90817422140368
+33
+237.60860322664814
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.194911678458173
+20
+-97.90094608848592
+30
+228.09033683169696
+11
+23.36710264529881
+21
+-98.60431272335471
+31
+229.47607862314402
+12
+24.439189159691768
+22
+-95.58458209285997
+32
+230.15084817164748
+13
+24.439189159691768
+23
+-95.58458209285997
+33
+230.15084817164748
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.194911678458173
+20
+-97.90094608848592
+30
+228.09033683169696
+11
+24.439189159691768
+21
+-95.58458209285997
+31
+230.15084817164748
+12
+24.421848373278486
+22
+-94.78933971243282
+32
+228.24397011483302
+13
+24.421848373278486
+23
+-94.78933971243282
+33
+228.24397011483302
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.378850192557195
+20
+-94.5849009673497
+30
+226.95132096623612
+11
+32.05757465725944
+21
+-94.14742639081892
+31
+230.13076936632703
+12
+33.31919292490631
+22
+-96.57787450758543
+32
+230.0702287260418
+13
+33.31919292490631
+23
+-96.57787450758543
+33
+230.0702287260418
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.378850192557195
+20
+-94.5849009673497
+30
+226.95132096623612
+11
+33.31919292490631
+21
+-96.57787450758543
+31
+230.0702287260418
+12
+33.04021922067863
+22
+-96.37952024896272
+32
+227.4782374937409
+13
+33.04021922067863
+23
+-96.37952024896272
+33
+227.4782374937409
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.36710264529881
+20
+-98.60431272335471
+30
+229.47607862314402
+11
+23.610786328053848
+21
+-98.90853704639518
+31
+231.30051188841472
+12
+24.363741527577858
+22
+-96.20915462806147
+32
+231.59195878988783
+13
+24.363741527577858
+23
+-96.20915462806147
+33
+231.59195878988783
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.36710264529881
+20
+-98.60431272335471
+30
+229.47607862314402
+11
+24.363741527577858
+21
+-96.20915462806147
+31
+231.59195878988783
+12
+24.439189159691768
+22
+-95.58458209285997
+32
+230.15084817164748
+13
+24.439189159691768
+23
+-95.58458209285997
+33
+230.15084817164748
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.05757465725944
+20
+-94.14742639081892
+30
+230.13076936632703
+11
+31.88720903635703
+21
+-95.01629105742171
+31
+232.27250860052837
+12
+33.31128309250727
+22
+-97.53648534948486
+32
+231.49217321193035
+13
+33.31128309250727
+23
+-97.53648534948486
+33
+231.49217321193035
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.31919292490631
+20
+-96.57787450758543
+30
+230.0702287260418
+11
+32.05757465725944
+21
+-94.14742639081892
+31
+230.13076936632703
+12
+33.31128309250727
+22
+-97.53648534948486
+32
+231.49217321193035
+13
+33.31128309250727
+23
+-97.53648534948486
+33
+231.49217321193035
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.610786328053848
+20
+-98.90853704639518
+30
+231.30051188841472
+11
+24.202198412043607
+21
+-100.20179464363882
+31
+233.5134396142074
+12
+24.850196220118807
+22
+-97.64691877874913
+32
+234.34671003501467
+13
+24.850196220118807
+23
+-97.64691877874913
+33
+234.34671003501467
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.610786328053848
+20
+-98.90853704639518
+30
+231.30051188841472
+11
+24.850196220118807
+21
+-97.64691877874913
+31
+234.34671003501467
+12
+24.363741527577858
+22
+-96.20915462806147
+32
+231.59195878988783
+13
+24.363741527577858
+23
+-96.20915462806147
+33
+231.59195878988783
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.73935601535959
+20
+-101.80262303147518
+30
+233.00781878931454
+11
+31.566252375549833
+21
+-101.9885040928531
+31
+235.09023428052328
+12
+29.02962997004232
+22
+-103.03473153978784
+32
+235.62049727558173
+13
+29.02962997004232
+23
+-103.03473153978784
+33
+235.62049727558173
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.73935601535959
+20
+-101.80262303147518
+30
+233.00781878931454
+11
+29.02962997004232
+21
+-103.03473153978784
+31
+235.62049727558173
+12
+29.36701474429368
+22
+-102.4643109340872
+32
+233.21895046950388
+13
+29.36701474429368
+23
+-102.4643109340872
+33
+233.21895046950388
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.36701474429368
+20
+-102.4643109340872
+30
+233.21895046950388
+11
+29.02962997004232
+21
+-103.03473153978784
+31
+235.62049727558173
+12
+26.64299015579352
+22
+-102.717425570857
+32
+234.75284950627182
+13
+26.64299015579352
+23
+-102.717425570857
+33
+234.75284950627182
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.36701474429368
+20
+-102.4643109340872
+30
+233.21895046950388
+11
+26.64299015579352
+21
+-102.717425570857
+31
+234.75284950627182
+12
+26.72482649869129
+22
+-102.39951115327963
+32
+233.0300271648963
+13
+26.72482649869129
+23
+-102.39951115327963
+33
+233.0300271648963
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.850196220118807
+20
+-97.64691877874913
+30
+234.34671003501467
+11
+25.301056666864092
+21
+-98.36488818112385
+31
+235.6792125699297
+12
+26.465627375461207
+22
+-96.96423939784785
+32
+236.29557104840907
+13
+26.465627375461207
+23
+-96.96423939784785
+33
+236.29557104840907
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.6512042125156
+20
+-95.82126861618599
+30
+234.2910369838988
+11
+24.850196220118807
+21
+-97.64691877874913
+31
+234.34671003501467
+12
+26.465627375461207
+22
+-96.96423939784785
+32
+236.29557104840907
+13
+26.465627375461207
+23
+-96.96423939784785
+33
+236.29557104840907
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.54985356244072
+20
+-96.60555892098368
+30
+236.17448976783925
+11
+26.6512042125156
+21
+-95.82126861618599
+31
+234.2910369838988
+12
+26.465627375461207
+22
+-96.96423939784785
+32
+236.29557104840907
+13
+26.465627375461207
+23
+-96.96423939784785
+33
+236.29557104840907
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.77650068310552
+20
+-95.4096531071129
+30
+234.19551054646433
+11
+26.6512042125156
+21
+-95.82126861618599
+31
+234.2910369838988
+12
+29.54985356244072
+22
+-96.60555892098368
+32
+236.17448976783925
+13
+29.54985356244072
+23
+-96.60555892098368
+33
+236.17448976783925
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.478448747531456
+20
+-118.45920894223468
+30
+219.62742461336492
+11
+23.805489894799454
+21
+-119.54681089710292
+31
+220.32409831312611
+12
+23.5070458338972
+22
+-116.52342957473135
+32
+220.29245898353088
+13
+23.5070458338972
+23
+-116.52342957473135
+33
+220.29245898353088
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.690346599015136
+20
+-115.04003177558864
+30
+221.50357601355356
+11
+32.74998921649847
+21
+-114.46291823478126
+31
+219.57053466495756
+12
+31.798375534029354
+22
+-114.41028742689635
+32
+223.45426237288592
+13
+31.798375534029354
+23
+-114.41028742689635
+33
+223.45426237288592
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.504219913984716
+20
+-122.59726818422429
+30
+217.83888981821173
+11
+26.667632325959765
+21
+-121.78073010118489
+31
+217.46013053602712
+12
+28.538307688332722
+22
+-122.04023344873775
+32
+216.5903531964557
+13
+28.538307688332722
+23
+-122.04023344873775
+33
+216.5903531964557
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.748570646055917
+20
+-121.61614474242073
+30
+219.30616372823377
+11
+23.805489894799454
+21
+-119.54681089710292
+31
+220.32409831312611
+12
+23.478448747531456
+22
+-118.45920894223468
+32
+219.62742461336492
+13
+23.478448747531456
+23
+-118.45920894223468
+33
+219.62742461336492
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.60651253736377
+20
+-114.72485537691887
+30
+220.28546182410142
+11
+23.5070458338972
+21
+-116.52342957473135
+31
+220.29245898353088
+12
+23.805794119122503
+22
+-116.47536213169124
+32
+221.07066480186728
+13
+23.805794119122503
+23
+-116.47536213169124
+33
+221.07066480186728
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.74998921649847
+20
+-114.46291823478126
+30
+219.57053466495756
+11
+31.362726303436077
+21
+-112.84383638756279
+31
+220.78378126524143
+12
+31.798375534029354
+22
+-114.41028742689635
+32
+223.45426237288592
+13
+31.798375534029354
+23
+-114.41028742689635
+33
+223.45426237288592
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.504219913984716
+20
+-122.59726818422429
+30
+217.83888981821173
+11
+27.110887164629034
+21
+-122.32863810698028
+31
+218.54742826657198
+12
+26.667632325959765
+22
+-121.78073010118489
+32
+217.46013053602712
+13
+26.667632325959765
+23
+-121.78073010118489
+33
+217.46013053602712
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.5070458338972
+20
+-116.52342957473135
+30
+220.29245898353088
+11
+23.805489894799454
+21
+-119.54681089710292
+31
+220.32409831312611
+12
+23.805794119122503
+22
+-116.47536213169124
+32
+221.07066480186728
+13
+23.805794119122503
+23
+-116.47536213169124
+33
+221.07066480186728
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.601296773369537
+20
+-112.90163900894
+30
+219.64598229707187
+11
+24.60651253736377
+21
+-114.72485537691887
+31
+220.28546182410142
+12
+25.015390027529538
+22
+-114.86084364931794
+32
+220.83975854068032
+13
+25.015390027529538
+23
+-114.86084364931794
+33
+220.83975854068032
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.430960452802164
+20
+-121.08892399059212
+30
+218.3451190917506
+11
+23.478448747531456
+21
+-118.45920894223468
+31
+219.62742461336492
+12
+24.162649250048414
+22
+-118.04394274128478
+32
+218.4476426886157
+13
+24.162649250048414
+23
+-118.04394274128478
+33
+218.4476426886157
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.110887164629034
+20
+-122.32863810698028
+30
+218.54742826657198
+11
+25.430960452802164
+21
+-121.08892399059212
+31
+218.3451190917506
+12
+26.667632325959765
+22
+-121.78073010118489
+32
+217.46013053602712
+13
+26.667632325959765
+23
+-121.78073010118489
+33
+217.46013053602712
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.60651253736377
+20
+-114.72485537691887
+30
+220.28546182410142
+11
+23.805794119122503
+21
+-116.47536213169124
+31
+221.07066480186728
+12
+25.015390027529538
+22
+-114.86084364931794
+32
+220.83975854068032
+13
+25.015390027529538
+23
+-114.86084364931794
+33
+220.83975854068032
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.052736368425837
+20
+-114.24996120865283
+30
+217.93624160158632
+11
+27.601296773369537
+21
+-112.90163900894
+31
+219.64598229707187
+12
+27.91738584500808
+22
+-112.31600718708822
+32
+220.59546640927982
+13
+27.91738584500808
+23
+-112.31600718708822
+33
+220.59546640927982
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.162649250048414
+20
+-118.04394274128478
+30
+218.4476426886157
+11
+23.478448747531456
+21
+-118.45920894223468
+31
+219.62742461336492
+12
+24.033353912756414
+22
+-116.70535571990895
+32
+218.95813110267736
+13
+24.033353912756414
+23
+-116.70535571990895
+33
+218.95813110267736
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.430960452802164
+20
+-121.08892399059212
+30
+218.3451190917506
+11
+25.748570646055917
+21
+-121.61614474242073
+31
+219.30616372823377
+12
+23.478448747531456
+22
+-118.45920894223468
+32
+219.62742461336492
+13
+23.478448747531456
+23
+-118.45920894223468
+33
+219.62742461336492
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.91738584500808
+20
+-112.31600718708822
+30
+220.59546640927982
+11
+27.601296773369537
+21
+-112.90163900894
+31
+219.64598229707187
+12
+25.015390027529538
+22
+-114.86084364931794
+32
+220.83975854068032
+13
+25.015390027529538
+23
+-114.86084364931794
+33
+220.83975854068032
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.765838181631594
+20
+-113.419428806754
+30
+219.26813568785593
+11
+30.052736368425837
+21
+-114.24996120865283
+31
+217.93624160158632
+12
+27.91738584500808
+22
+-112.31600718708822
+32
+220.59546640927982
+13
+27.91738584500808
+23
+-112.31600718708822
+33
+220.59546640927982
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.870579249762468
+20
+-119.46679990014292
+30
+217.97974567978008
+11
+26.648466193608243
+21
+-120.49416543904861
+31
+217.1814610561229
+12
+26.667632325959765
+22
+-121.78073010118489
+32
+217.46013053602712
+13
+26.667632325959765
+23
+-121.78073010118489
+33
+217.46013053602712
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.667632325959765
+20
+-121.78073010118489
+30
+217.46013053602712
+11
+25.430960452802164
+21
+-121.08892399059212
+31
+218.3451190917506
+12
+24.870579249762468
+22
+-119.46679990014292
+32
+217.97974567978008
+13
+24.870579249762468
+23
+-119.46679990014292
+33
+217.97974567978008
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.110887164629034
+20
+-122.32863810698028
+30
+218.54742826657198
+11
+25.748570646055917
+21
+-121.61614474242073
+31
+219.30616372823377
+12
+25.430960452802164
+22
+-121.08892399059212
+32
+218.3451190917506
+13
+25.430960452802164
+23
+-121.08892399059212
+33
+218.3451190917506
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.033353912756414
+20
+-116.70535571990895
+30
+218.95813110267736
+11
+23.478448747531456
+21
+-118.45920894223468
+31
+219.62742461336492
+12
+23.5070458338972
+22
+-116.52342957473135
+32
+220.29245898353088
+13
+23.5070458338972
+23
+-116.52342957473135
+33
+220.29245898353088
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.033353912756414
+20
+-116.70535571990895
+30
+218.95813110267736
+11
+23.5070458338972
+21
+-116.52342957473135
+31
+220.29245898353088
+12
+25.18697254572409
+22
+-115.1748031506947
+32
+219.10689679664446
+13
+25.18697254572409
+23
+-115.1748031506947
+33
+219.10689679664446
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.037569102776406
+20
+-114.37347628380728
+30
+219.0238435564547
+11
+25.18697254572409
+21
+-115.1748031506947
+31
+219.10689679664446
+12
+24.60651253736377
+22
+-114.72485537691887
+32
+220.28546182410142
+13
+24.60651253736377
+23
+-114.72485537691887
+33
+220.28546182410142
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.601296773369537
+20
+-112.90163900894
+30
+219.64598229707187
+11
+27.037569102776406
+21
+-114.37347628380728
+31
+219.0238435564547
+12
+24.60651253736377
+22
+-114.72485537691887
+32
+220.28546182410142
+13
+24.60651253736377
+23
+-114.72485537691887
+33
+220.28546182410142
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.648466193608243
+20
+-120.49416543904861
+30
+217.1814610561229
+11
+28.538307688332722
+21
+-122.04023344873775
+31
+216.5903531964557
+12
+26.667632325959765
+22
+-121.78073010118489
+32
+217.46013053602712
+13
+26.667632325959765
+23
+-121.78073010118489
+33
+217.46013053602712
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.601296773369537
+20
+-112.90163900894
+30
+219.64598229707187
+11
+30.052736368425837
+21
+-114.24996120865283
+31
+217.93624160158632
+12
+29.002858229614798
+22
+-115.14498916703647
+32
+217.73727889431802
+13
+29.002858229614798
+23
+-115.14498916703647
+33
+217.73727889431802
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.94011476823095
+20
+-116.75524850888756
+30
+219.28851871749887
+11
+32.74998921649847
+21
+-114.46291823478126
+31
+219.57053466495756
+12
+33.690346599015136
+22
+-115.04003177558864
+32
+221.50357601355356
+13
+33.690346599015136
+23
+-115.04003177558864
+33
+221.50357601355356
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.052736368425837
+20
+-114.24996120865283
+30
+217.93624160158632
+11
+29.716568491466667
+21
+-116.10055776570492
+31
+216.89792398705058
+12
+29.002858229614798
+22
+-115.14498916703647
+32
+217.73727889431802
+13
+29.002858229614798
+23
+-115.14498916703647
+33
+217.73727889431802
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.94011476823095
+20
+-116.75524850888756
+30
+219.28851871749887
+11
+33.690346599015136
+21
+-115.04003177558864
+31
+221.50357601355356
+12
+34.557081695356075
+22
+-117.11484165872126
+32
+220.7363222708459
+13
+34.557081695356075
+23
+-117.11484165872126
+33
+220.7363222708459
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.052736368425837
+20
+-114.24996120865283
+30
+217.93624160158632
+11
+30.939854494410483
+21
+-115.61106082993356
+31
+216.94416608415295
+12
+29.716568491466667
+22
+-116.10055776570492
+32
+216.89792398705058
+13
+29.716568491466667
+23
+-116.10055776570492
+33
+216.89792398705058
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.579608945428554
+20
+-119.03753938033354
+30
+218.71536009289062
+11
+33.94011476823095
+21
+-116.75524850888756
+31
+219.28851871749887
+12
+34.557081695356075
+22
+-117.11484165872126
+32
+220.7363222708459
+13
+34.557081695356075
+23
+-117.11484165872126
+33
+220.7363222708459
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.939854494410483
+20
+-115.61106082993356
+30
+216.94416608415295
+11
+30.485647580111753
+21
+-117.28916219582217
+31
+216.90218312757298
+12
+29.716568491466667
+22
+-116.10055776570492
+32
+216.89792398705058
+13
+29.716568491466667
+23
+-116.10055776570492
+33
+216.89792398705058
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.579608945428554
+20
+-119.03753938033354
+30
+218.71536009289062
+11
+34.557081695356075
+21
+-117.11484165872126
+31
+220.7363222708459
+12
+34.205094153598786
+22
+-119.5203433809984
+32
+220.2827238051929
+13
+34.205094153598786
+23
+-119.5203433809984
+33
+220.2827238051929
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.939854494410483
+20
+-115.61106082993356
+30
+216.94416608415295
+11
+31.574466432271915
+21
+-116.93808732703395
+31
+216.63781219085132
+12
+30.485647580111753
+22
+-117.28916219582217
+32
+216.90218312757298
+13
+30.485647580111753
+23
+-117.28916219582217
+33
+216.90218312757298
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.205094153598786
+20
+-119.5203433809984
+30
+220.2827238051929
+11
+34.51083959825398
+21
+-120.10901744608125
+31
+222.02045313839727
+12
+33.11079926362391
+22
+-122.75637750517525
+32
+221.71987950723297
+13
+33.11079926362391
+23
+-122.75637750517525
+33
+221.71987950723297
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.574466432271915
+20
+-116.93808732703395
+30
+216.63781219085132
+11
+29.938956471608876
+21
+-118.26511382413432
+31
+216.14496878752612
+12
+30.485647580111753
+22
+-117.28916219582217
+32
+216.90218312757298
+13
+30.485647580111753
+23
+-117.28916219582217
+33
+216.90218312757298
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.864377561961504
+20
+-122.58175274374982
+30
+219.94533903094043
+11
+34.205094153598786
+21
+-119.5203433809984
+31
+220.2827238051929
+12
+33.11079926362391
+22
+-122.75637750517525
+32
+221.71987950723297
+13
+33.11079926362391
+23
+-122.75637750517525
+33
+221.71987950723297
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.574466432271915
+20
+-116.93808732703395
+30
+216.63781219085132
+11
+31.438173935549994
+21
+-118.57937754983463
+31
+216.17447854686097
+12
+29.938956471608876
+22
+-118.26511382413432
+32
+216.14496878752612
+13
+29.938956471608876
+23
+-118.26511382413432
+33
+216.14496878752612
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.648466193608243
+20
+-120.49416543904861
+30
+217.1814610561229
+11
+28.043638939069695
+21
+-120.5732637630389
+31
+216.54745756690727
+12
+28.538307688332722
+22
+-122.04023344873775
+32
+216.5903531964557
+13
+28.538307688332722
+23
+-122.04023344873775
+33
+216.5903531964557
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.870579249762468
+20
+-119.46679990014292
+30
+217.97974567978008
+11
+25.430960452802164
+21
+-121.08892399059212
+31
+218.3451190917506
+12
+24.162649250048414
+22
+-118.04394274128478
+32
+218.4476426886157
+13
+24.162649250048414
+23
+-118.04394274128478
+33
+218.4476426886157
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.438173935549994
+20
+-118.57937754983463
+30
+216.17447854686097
+11
+32.97967858039367
+21
+-118.76586705985858
+31
+217.77713228063564
+12
+32.12906737317383
+22
+-121.27267548170794
+32
+216.90218312757162
+13
+32.12906737317383
+23
+-121.27267548170794
+33
+216.90218312757162
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.438173935549994
+20
+-118.57937754983463
+30
+216.17447854686097
+11
+32.12906737317383
+21
+-121.27267548170794
+31
+216.90218312757162
+12
+30.709252457546153
+22
+-120.8714035996179
+32
+215.76377571075633
+13
+30.709252457546153
+23
+-120.8714035996179
+33
+215.76377571075633
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.12906737317383
+20
+-121.27267548170794
+30
+216.90218312757162
+11
+28.538307688332722
+21
+-122.04023344873775
+31
+216.5903531964557
+12
+30.709252457546153
+22
+-120.8714035996179
+32
+215.76377571075633
+13
+30.709252457546153
+23
+-120.8714035996179
+33
+215.76377571075633
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.18697254572409
+20
+-115.1748031506947
+30
+219.10689679664446
+11
+23.5070458338972
+21
+-116.52342957473135
+31
+220.29245898353088
+12
+24.60651253736377
+22
+-114.72485537691887
+32
+220.28546182410142
+13
+24.60651253736377
+23
+-114.72485537691887
+33
+220.28546182410142
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.12906737317383
+20
+-121.27267548170794
+30
+216.90218312757162
+11
+29.504219913984716
+21
+-122.59726818422429
+31
+217.83888981821173
+12
+28.538307688332722
+22
+-122.04023344873775
+32
+216.5903531964557
+13
+28.538307688332722
+23
+-122.04023344873775
+33
+216.5903531964557
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.601296773369537
+20
+-112.90163900894
+30
+219.64598229707187
+11
+29.002858229614798
+21
+-115.14498916703647
+31
+217.73727889431802
+12
+27.037569102776406
+22
+-114.37347628380728
+32
+219.0238435564547
+13
+27.037569102776406
+23
+-114.37347628380728
+33
+219.0238435564547
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.85555505659335
+20
+-116.43885521292563
+30
+217.944759882631
+11
+31.438173935549994
+21
+-118.57937754983463
+31
+216.17447854686097
+12
+31.574466432271915
+22
+-116.93808732703395
+32
+216.63781219085132
+13
+31.574466432271915
+23
+-116.93808732703395
+33
+216.63781219085132
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.12906737317383
+20
+-121.27267548170794
+30
+216.90218312757162
+11
+32.97967858039367
+21
+-118.76586705985858
+31
+217.77713228063564
+12
+32.69827108158167
+22
+-122.0012927353891
+32
+218.36428522410202
+13
+32.69827108158167
+23
+-122.0012927353891
+33
+218.36428522410202
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.97967858039367
+20
+-118.76586705985858
+30
+217.77713228063564
+11
+33.579608945428554
+21
+-119.03753938033354
+31
+218.71536009289062
+12
+32.69827108158167
+22
+-122.0012927353891
+32
+218.36428522410202
+13
+32.69827108158167
+23
+-122.0012927353891
+33
+218.36428522410202
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.438173935549994
+20
+-118.57937754983463
+30
+216.17447854686097
+11
+32.85555505659335
+21
+-116.43885521292563
+31
+217.944759882631
+12
+32.97967858039367
+22
+-118.76586705985858
+32
+217.77713228063564
+13
+32.97967858039367
+23
+-118.76586705985858
+33
+217.77713228063564
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.62283809963527
+20
+-114.48847307791642
+30
+218.4643750263841
+11
+32.85555505659335
+21
+-116.43885521292563
+31
+217.944759882631
+12
+31.574466432271915
+22
+-116.93808732703395
+32
+216.63781219085132
+13
+31.574466432271915
+23
+-116.93808732703395
+33
+216.63781219085132
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.939854494410483
+20
+-115.61106082993356
+30
+216.94416608415295
+11
+30.052736368425837
+21
+-114.24996120865283
+31
+217.93624160158632
+12
+30.765838181631594
+22
+-113.419428806754
+32
+219.26813568785593
+13
+30.765838181631594
+23
+-113.419428806754
+33
+219.26813568785593
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.62283809963527
+20
+-114.48847307791642
+30
+218.4643750263841
+11
+30.939854494410483
+21
+-115.61106082993356
+31
+216.94416608415295
+12
+30.765838181631594
+22
+-113.419428806754
+32
+219.26813568785593
+13
+30.765838181631594
+23
+-113.419428806754
+33
+219.26813568785593
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.69827108158167
+20
+-122.0012927353891
+30
+218.36428522410202
+11
+29.504219913984716
+21
+-122.59726818422429
+31
+217.83888981821173
+12
+32.12906737317383
+22
+-121.27267548170794
+32
+216.90218312757162
+13
+32.12906737317383
+23
+-121.27267548170794
+33
+216.90218312757162
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.574466432271915
+20
+-116.93808732703395
+30
+216.63781219085132
+11
+30.939854494410483
+21
+-115.61106082993356
+31
+216.94416608415295
+12
+31.62283809963527
+22
+-114.48847307791642
+32
+218.4643750263841
+13
+31.62283809963527
+23
+-114.48847307791642
+33
+218.4643750263841
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.86175674439432
+20
+-116.91344515686808
+30
+218.09078755769036
+11
+25.5331798253436
+21
+-117.48356153824484
+31
+217.3789026417766
+12
+24.162649250048414
+22
+-118.04394274128478
+32
+218.4476426886157
+13
+24.162649250048414
+23
+-118.04394274128478
+33
+218.4476426886157
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.037569102776406
+20
+-114.37347628380728
+30
+219.0238435564547
+11
+28.292190210993358
+21
+-116.12063657102576
+31
+217.72632681868834
+12
+27.119101221351137
+22
+-115.50184429796255
+32
+218.33264589450755
+13
+27.119101221351137
+23
+-115.50184429796255
+33
+218.33264589450755
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.59822522980408
+20
+-117.63323990518039
+30
+216.72238655265627
+11
+29.10386070486408
+21
+-116.86142279762812
+31
+217.62289054885483
+12
+29.716568491466667
+22
+-116.10055776570492
+32
+216.89792398705058
+13
+29.716568491466667
+23
+-116.10055776570492
+33
+216.89792398705058
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.938956471608876
+20
+-118.26511382413432
+30
+216.14496878752612
+11
+31.438173935549994
+21
+-118.57937754983463
+31
+216.17447854686097
+12
+30.709252457546153
+22
+-120.8714035996179
+32
+215.76377571075633
+13
+30.709252457546153
+23
+-120.8714035996179
+33
+215.76377571075633
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.296130477025358
+20
+-119.7682862042749
+30
+215.98038342876117
+11
+30.709252457546153
+21
+-120.8714035996179
+31
+215.76377571075633
+12
+28.043638939069695
+22
+-120.5732637630389
+32
+216.54745756690727
+13
+28.043638939069695
+23
+-120.5732637630389
+33
+216.54745756690727
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.56804842115303
+20
+-123.42019497804984
+30
+226.8183749370602
+11
+34.60545336271943
+21
+-121.25290090071312
+31
+227.1758385166327
+12
+34.23095322105719
+22
+-121.79533286869373
+32
+229.09032218152302
+13
+34.23095322105719
+23
+-121.79533286869373
+33
+229.09032218152302
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.938956471608876
+20
+-118.26511382413432
+30
+216.14496878752612
+11
+30.709252457546153
+21
+-120.8714035996179
+31
+215.76377571075633
+12
+29.296130477025358
+22
+-119.7682862042749
+32
+215.98038342876117
+13
+29.296130477025358
+23
+-119.7682862042749
+33
+215.98038342876117
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.898465336309513
+20
+-124.04750553215841
+30
+227.2108243137816
+11
+31.72140678030024
+21
+-124.06210829966484
+31
+229.13230513810217
+12
+30.243180794648875
+22
+-124.28571317709928
+32
+229.52749253373116
+13
+30.243180794648875
+23
+-124.28571317709928
+33
+229.52749253373116
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.56804842115303
+20
+-123.42019497804984
+30
+226.8183749370602
+11
+31.72140678030024
+21
+-124.06210829966484
+31
+229.13230513810217
+12
+31.898465336309513
+22
+-124.04750553215841
+32
+227.2108243137816
+13
+31.898465336309513
+23
+-124.04750553215841
+33
+227.2108243137816
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.243180794648875
+20
+-124.28571317709928
+30
+229.52749253373116
+11
+29.530991654412237
+21
+-123.59177749624526
+31
+230.11069056099902
+12
+29.867159531371435
+22
+-124.0420294943439
+32
+228.00119910503952
+13
+29.867159531371435
+23
+-124.0420294943439
+33
+228.00119910503952
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.485647580111753
+20
+-117.28916219582217
+30
+216.90218312757298
+11
+29.938956471608876
+21
+-118.26511382413432
+31
+216.14496878752612
+12
+29.374924576692713
+22
+-118.38649932902732
+32
+216.4008214432025
+13
+29.374924576692713
+23
+-118.38649932902732
+33
+216.4008214432025
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.716568491466667
+20
+-116.10055776570492
+30
+216.89792398705058
+11
+30.485647580111753
+21
+-117.28916219582217
+31
+216.90218312757298
+12
+29.59822522980408
+22
+-117.63323990518039
+32
+216.72238655265627
+13
+29.59822522980408
+23
+-117.63323990518039
+33
+216.72238655265627
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.126692179259596
+20
+-120.31163084522785
+30
+229.57586420109547
+11
+29.220378620588395
+21
+-120.89847956437232
+31
+231.01697481933584
+12
+29.71200512662105
+22
+-119.68006115059724
+32
+231.3248498342526
+13
+29.71200512662105
+23
+-119.68006115059724
+33
+231.3248498342526
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.126692179259596
+20
+-120.31163084522785
+30
+229.57586420109547
+11
+29.168964709994636
+21
+-121.06732406365954
+31
+230.98198902218618
+12
+29.220378620588395
+22
+-120.89847956437232
+32
+231.01697481933584
+13
+29.220378620588395
+23
+-120.89847956437232
+33
+231.01697481933584
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.04998369935096
+20
+-118.92193413758147
+30
+230.94882857097542
+11
+30.777094481584072
+21
+-117.65088491591997
+31
+229.42466471254534
+12
+29.119984593985198
+22
+-118.44521462337751
+32
+229.89925465648753
+13
+29.119984593985198
+23
+-118.44521462337751
+33
+229.89925465648753
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.56804842115303
+20
+-123.42019497804984
+30
+226.8183749370602
+11
+34.23095322105719
+21
+-121.79533286869373
+31
+229.09032218152302
+12
+33.43753618656888
+22
+-123.55709592341843
+32
+229.0449927573899
+13
+33.43753618656888
+23
+-123.55709592341843
+33
+229.0449927573899
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.04998369935096
+20
+-118.92193413758147
+30
+230.94882857097542
+11
+29.119984593985198
+21
+-118.44521462337751
+31
+229.89925465648753
+12
+29.71200512662105
+22
+-119.68006115059724
+32
+231.3248498342526
+13
+29.71200512662105
+23
+-119.68006115059724
+33
+231.3248498342526
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.043638939069695
+20
+-120.5732637630389
+30
+216.54745756690727
+11
+30.709252457546153
+21
+-120.8714035996179
+31
+215.76377571075633
+12
+28.538307688332722
+22
+-122.04023344873775
+32
+216.5903531964557
+13
+28.538307688332722
+23
+-122.04023344873775
+33
+216.5903531964557
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.6299085099028
+20
+-117.83859132323246
+30
+217.0844134970735
+11
+27.569048995127297
+21
+-118.32048265092777
+31
+217.0892810862423
+12
+26.648466193608243
+22
+-120.49416543904861
+32
+217.1814610561229
+13
+26.648466193608243
+23
+-120.49416543904861
+33
+217.1814610561229
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.56804842115303
+20
+-123.42019497804984
+30
+226.8183749370602
+11
+33.43753618656888
+21
+-123.55709592341843
+31
+229.0449927573899
+12
+31.72140678030024
+22
+-124.06210829966484
+32
+229.13230513810217
+13
+31.72140678030024
+23
+-124.06210829966484
+33
+229.13230513810217
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.6299085099028
+20
+-117.83859132323246
+30
+217.0844134970735
+11
+26.648466193608243
+21
+-120.49416543904861
+31
+217.1814610561229
+12
+24.870579249762468
+22
+-119.46679990014292
+32
+217.97974567978008
+13
+24.870579249762468
+23
+-119.46679990014292
+33
+217.97974567978008
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.867159531371435
+20
+-124.0420294943439
+30
+228.00119910503952
+11
+29.530991654412237
+21
+-123.59177749624526
+31
+230.11069056099902
+12
+28.499671199306636
+22
+-123.48195251562744
+32
+228.63216035102434
+13
+28.499671199306636
+23
+-123.48195251562744
+33
+228.63216035102434
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.5331798253436
+20
+-117.48356153824484
+30
+217.3789026417766
+11
+26.6299085099028
+21
+-117.83859132323246
+31
+217.0844134970735
+12
+24.870579249762468
+22
+-119.46679990014292
+32
+217.97974567978008
+13
+24.870579249762468
+23
+-119.46679990014292
+33
+217.97974567978008
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.758580748381203
+20
+-122.09651494850343
+30
+229.157555756915
+11
+29.168964709994636
+21
+-121.06732406365954
+31
+230.98198902218618
+12
+28.126692179259596
+22
+-120.31163084522785
+32
+229.57586420109547
+13
+28.126692179259596
+23
+-120.31163084522785
+33
+229.57586420109547
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.5331798253436
+20
+-117.48356153824484
+30
+217.3789026417766
+11
+24.870579249762468
+21
+-119.46679990014292
+31
+217.97974567978008
+12
+24.162649250048414
+22
+-118.04394274128478
+32
+218.4476426886157
+13
+24.162649250048414
+23
+-118.04394274128478
+33
+218.4476426886157
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.758580748381203
+20
+-122.09651494850343
+30
+229.157555756915
+11
+28.81667294391432
+21
+-122.79410132123449
+31
+230.5691566158202
+12
+29.168964709994636
+22
+-121.06732406365954
+32
+230.98198902218618
+13
+29.168964709994636
+23
+-121.06732406365954
+33
+230.98198902218618
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.033353912756414
+20
+-116.70535571990895
+30
+218.95813110267736
+11
+24.86175674439432
+21
+-116.91344515686808
+31
+218.09078755769036
+12
+24.162649250048414
+22
+-118.04394274128478
+32
+218.4476426886157
+13
+24.162649250048414
+23
+-118.04394274128478
+33
+218.4476426886157
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.126692179259596
+20
+-120.31163084522785
+30
+229.57586420109547
+11
+29.71200512662105
+21
+-119.68006115059724
+31
+231.3248498342526
+12
+29.119984593985198
+22
+-118.44521462337751
+32
+229.89925465648753
+13
+29.119984593985198
+23
+-118.44521462337751
+33
+229.89925465648753
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.747657973086802
+20
+-116.00989891743943
+30
+218.5690281935095
+11
+24.86175674439432
+21
+-116.91344515686808
+31
+218.09078755769036
+12
+24.033353912756414
+22
+-116.70535571990895
+32
+218.95813110267736
+13
+24.033353912756414
+23
+-116.70535571990895
+33
+218.95813110267736
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.499671199306636
+20
+-123.48195251562744
+30
+228.63216035102434
+11
+28.81667294391432
+21
+-122.79410132123449
+31
+230.5691566158202
+12
+27.758580748381203
+22
+-122.09651494850343
+32
+229.157555756915
+13
+27.758580748381203
+23
+-122.09651494850343
+33
+229.157555756915
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.898465336309513
+20
+-124.04750553215841
+30
+227.2108243137816
+11
+30.243180794648875
+21
+-124.28571317709928
+31
+229.52749253373116
+12
+29.867159531371435
+22
+-124.0420294943439
+32
+228.00119910503952
+13
+29.867159531371435
+23
+-124.0420294943439
+33
+228.00119910503952
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.18697254572409
+20
+-115.1748031506947
+30
+219.10689679664446
+11
+25.747657973086802
+21
+-116.00989891743943
+31
+218.5690281935095
+12
+24.033353912756414
+22
+-116.70535571990895
+32
+218.95813110267736
+13
+24.033353912756414
+23
+-116.70535571990895
+33
+218.95813110267736
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.530991654412237
+20
+-123.59177749624526
+30
+230.11069056099902
+11
+28.81667294391432
+21
+-122.79410132123449
+31
+230.5691566158202
+12
+28.499671199306636
+22
+-123.48195251562744
+32
+228.63216035102434
+13
+28.499671199306636
+23
+-123.48195251562744
+33
+228.63216035102434
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.037569102776406
+20
+-114.37347628380728
+30
+219.0238435564547
+11
+29.002858229614798
+21
+-115.14498916703647
+31
+217.73727889431802
+12
+28.292190210993358
+22
+-116.12063657102576
+32
+217.72632681868834
+13
+28.292190210993358
+23
+-116.12063657102576
+33
+217.72632681868834
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.002858229614798
+20
+-115.14498916703647
+30
+217.73727889431802
+11
+29.10386070486408
+21
+-116.86142279762812
+31
+217.62289054885483
+12
+28.292190210993358
+22
+-116.12063657102576
+32
+217.72632681868834
+13
+28.292190210993358
+23
+-116.12063657102576
+33
+217.72632681868834
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.485647580111753
+20
+-117.28916219582217
+30
+216.90218312757298
+11
+29.374924576692713
+21
+-118.38649932902732
+31
+216.4008214432025
+12
+29.59822522980408
+22
+-117.63323990518039
+32
+216.72238655265627
+13
+29.59822522980408
+23
+-117.63323990518039
+33
+216.72238655265627
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.716568491466667
+20
+-116.10055776570492
+30
+216.89792398705058
+11
+29.10386070486408
+21
+-116.86142279762812
+31
+217.62289054885483
+12
+29.002858229614798
+22
+-115.14498916703647
+32
+217.73727889431802
+13
+29.002858229614798
+23
+-115.14498916703647
+33
+217.73727889431802
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.430249452983425
+20
+-119.18235015810374
+30
+230.51561313496634
+11
+32.376401747805346
+21
+-118.13521003819953
+31
+229.0830207977713
+12
+30.777094481584072
+22
+-117.65088491591997
+32
+229.42466471254534
+13
+30.777094481584072
+23
+-117.65088491591997
+33
+229.42466471254534
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.430249452983425
+20
+-119.18235015810374
+30
+230.51561313496634
+11
+30.777094481584072
+21
+-117.65088491591997
+31
+229.42466471254534
+12
+31.04998369935096
+22
+-118.92193413758147
+32
+230.94882857097542
+13
+31.04998369935096
+23
+-118.92193413758147
+33
+230.94882857097542
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.53549641858775
+20
+-118.68616028722502
+30
+228.55214935406633
+11
+32.376401747805346
+21
+-118.13521003819953
+31
+229.0830207977713
+12
+33.0338305098948
+22
+-119.40047899772321
+32
+230.1754903418073
+13
+33.0338305098948
+23
+-119.40047899772321
+33
+230.1754903418073
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.0338305098948
+20
+-119.40047899772321
+30
+230.1754903418073
+11
+32.376401747805346
+21
+-118.13521003819953
+31
+229.0830207977713
+12
+32.430249452983425
+22
+-119.18235015810374
+32
+230.51561313496634
+13
+32.430249452983425
+23
+-119.18235015810374
+33
+230.51561313496634
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.322828966615305
+20
+-119.45280558128545
+30
+227.83478840033786
+11
+33.53549641858775
+21
+-118.68616028722502
+31
+228.55214935406633
+12
+33.91516837374171
+22
+-120.22705648342273
+32
+229.6774751249906
+13
+33.91516837374171
+23
+-120.22705648342273
+33
+229.6774751249906
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.60545336271943
+20
+-121.25290090071312
+30
+227.1758385166327
+11
+34.322828966615305
+21
+-119.45280558128545
+31
+227.83478840033786
+12
+34.23095322105719
+22
+-121.79533286869373
+32
+229.09032218152302
+13
+34.23095322105719
+23
+-121.79533286869373
+33
+229.09032218152302
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.81667294391432
+20
+-122.79410132123449
+30
+230.5691566158202
+11
+29.530991654412237
+21
+-123.59177749624526
+31
+230.11069056099902
+12
+31.72140678030024
+22
+-124.06210829966484
+32
+229.13230513810217
+13
+31.72140678030024
+23
+-124.06210829966484
+33
+229.13230513810217
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.322828966615305
+20
+-119.45280558128545
+30
+227.83478840033786
+11
+33.91516837374171
+21
+-120.22705648342273
+31
+229.6774751249906
+12
+34.23095322105719
+22
+-121.79533286869373
+32
+229.09032218152302
+13
+34.23095322105719
+23
+-121.79533286869373
+33
+229.09032218152302
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.81667294391432
+20
+-122.79410132123449
+30
+230.5691566158202
+11
+31.72140678030024
+21
+-124.06210829966484
+31
+229.13230513810217
+12
+33.43753618656888
+22
+-123.55709592341843
+32
+229.0449927573899
+13
+33.43753618656888
+23
+-123.55709592341843
+33
+229.0449927573899
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.53549641858775
+20
+-118.68616028722502
+30
+228.55214935406633
+11
+33.0338305098948
+21
+-119.40047899772321
+31
+230.1754903418073
+12
+33.91516837374171
+22
+-120.22705648342273
+32
+229.6774751249906
+13
+33.91516837374171
+23
+-120.22705648342273
+33
+229.6774751249906
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.362726303436077
+20
+-112.84383638756279
+30
+220.78378126524143
+11
+29.35058663084952
+21
+-113.5834057168735
+31
+222.9763259613903
+12
+29.787756983058
+22
+-114.30137511924823
+32
+223.94558465459585
+13
+29.787756983058
+23
+-114.30137511924823
+33
+223.94558465459585
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.03210771512922
+20
+-115.18088763715645
+30
+222.54219785241207
+11
+25.474464530996894
+21
+-117.81668717197535
+31
+223.96657613288463
+12
+26.490269545627452
+22
+-115.47020496836781
+32
+223.9550156086094
+13
+26.490269545627452
+23
+-115.47020496836781
+33
+223.9550156086094
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.798375534029354
+20
+-114.41028742689635
+30
+223.45426237288592
+11
+31.362726303436077
+21
+-112.84383638756279
+31
+220.78378126524143
+12
+29.787756983058
+22
+-114.30137511924823
+32
+223.94558465459585
+13
+29.787756983058
+23
+-114.30137511924823
+33
+223.94558465459585
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.35058663084952
+20
+-113.5834057168735
+30
+222.9763259613903
+11
+26.03210771512922
+21
+-115.18088763715645
+31
+222.54219785241207
+12
+26.490269545627452
+22
+-115.47020496836781
+32
+223.9550156086094
+13
+26.490269545627452
+23
+-115.47020496836781
+33
+223.9550156086094
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.80238905089896
+20
+-122.80109848066161
+30
+219.64780764300738
+11
+25.748570646055917
+21
+-121.61614474242073
+31
+219.30616372823377
+12
+27.110887164629034
+22
+-122.32863810698028
+32
+218.54742826657198
+13
+27.110887164629034
+23
+-122.32863810698028
+33
+218.54742826657198
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.787756983058
+20
+-114.30137511924823
+30
+223.94558465459585
+11
+29.35058663084952
+21
+-113.5834057168735
+31
+222.9763259613903
+12
+26.490269545627452
+22
+-115.47020496836781
+32
+223.9550156086094
+13
+26.490269545627452
+23
+-115.47020496836781
+33
+223.9550156086094
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.283397005960243
+20
+-122.08191218099516
+30
+220.26964215930153
+11
+24.46048486230457
+21
+-120.05942888142565
+31
+221.74665124766116
+12
+23.805489894799454
+22
+-119.54681089710292
+32
+220.32409831312611
+13
+23.805489894799454
+23
+-119.54681089710292
+33
+220.32409831312611
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.748570646055917
+20
+-121.61614474242073
+30
+219.30616372823377
+11
+26.283397005960243
+21
+-122.08191218099516
+31
+220.26964215930153
+12
+23.805489894799454
+22
+-119.54681089710292
+32
+220.32409831312611
+13
+23.805489894799454
+23
+-119.54681089710292
+33
+220.32409831312611
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.805794119122503
+20
+-116.47536213169124
+30
+221.07066480186728
+11
+24.46048486230457
+21
+-120.05942888142565
+31
+221.74665124766116
+12
+24.86236519304041
+22
+-117.48873335173796
+32
+222.90939661032075
+13
+24.86236519304041
+23
+-117.48873335173796
+33
+222.90939661032075
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.805489894799454
+20
+-119.54681089710292
+30
+220.32409831312611
+11
+24.46048486230457
+21
+-120.05942888142565
+31
+221.74665124766116
+12
+23.805794119122503
+22
+-116.47536213169124
+32
+221.07066480186728
+13
+23.805794119122503
+23
+-116.47536213169124
+33
+221.07066480186728
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.91738584500808
+20
+-112.31600718708822
+30
+220.59546640927982
+11
+25.015390027529538
+21
+-114.86084364931794
+31
+220.83975854068032
+12
+26.03210771512922
+22
+-115.18088763715645
+32
+222.54219785241207
+13
+26.03210771512922
+23
+-115.18088763715645
+33
+222.54219785241207
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.015390027529538
+20
+-114.86084364931794
+30
+220.83975854068032
+11
+24.86236519304041
+21
+-117.48873335173796
+31
+222.90939661032075
+12
+26.03210771512922
+22
+-115.18088763715645
+32
+222.54219785241207
+13
+26.03210771512922
+23
+-115.18088763715645
+33
+222.54219785241207
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.362726303436077
+20
+-112.84383638756279
+30
+220.78378126524143
+11
+30.765838181631594
+21
+-113.419428806754
+31
+219.26813568785593
+12
+29.35058663084952
+22
+-113.5834057168735
+32
+222.9763259613903
+13
+29.35058663084952
+23
+-113.5834057168735
+33
+222.9763259613903
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.765838181631594
+20
+-113.419428806754
+30
+219.26813568785593
+11
+27.91738584500808
+21
+-112.31600718708822
+31
+220.59546640927982
+12
+29.35058663084952
+22
+-113.5834057168735
+32
+222.9763259613903
+13
+29.35058663084952
+23
+-113.5834057168735
+33
+222.9763259613903
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.74998921649847
+20
+-114.46291823478126
+30
+219.57053466495756
+11
+32.85555505659335
+21
+-116.43885521292563
+31
+217.944759882631
+12
+31.62283809963527
+22
+-114.48847307791642
+32
+218.4643750263841
+13
+31.62283809963527
+23
+-114.48847307791642
+33
+218.4643750263841
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.74998921649847
+20
+-114.46291823478126
+30
+219.57053466495756
+11
+31.62283809963527
+21
+-114.48847307791642
+31
+218.4643750263841
+12
+31.362726303436077
+22
+-112.84383638756279
+32
+220.78378126524143
+13
+31.362726303436077
+23
+-112.84383638756279
+33
+220.78378126524143
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.97967858039367
+20
+-118.76586705985858
+30
+217.77713228063564
+11
+33.94011476823095
+21
+-116.75524850888756
+31
+219.28851871749887
+12
+33.579608945428554
+22
+-119.03753938033354
+32
+218.71536009289062
+13
+33.579608945428554
+23
+-119.03753938033354
+33
+218.71536009289062
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.579608945428554
+20
+-119.03753938033354
+30
+218.71536009289062
+11
+34.205094153598786
+21
+-119.5203433809984
+31
+220.2827238051929
+12
+32.864377561961504
+22
+-122.58175274374982
+32
+219.94533903094043
+13
+32.864377561961504
+23
+-122.58175274374982
+33
+219.94533903094043
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.864377561961504
+20
+-122.58175274374982
+30
+219.94533903094043
+11
+30.166516265242816
+21
+-122.91001078830972
+31
+218.88146657326973
+12
+32.69827108158167
+22
+-122.0012927353891
+32
+218.36428522410202
+13
+32.69827108158167
+23
+-122.0012927353891
+33
+218.36428522410202
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.733894627712388
+20
+-123.2051083816589
+30
+220.37581644804217
+11
+27.80238905089896
+21
+-122.80109848066161
+31
+219.64780764300738
+12
+30.166516265242816
+22
+-122.91001078830972
+32
+218.88146657326973
+13
+30.166516265242816
+23
+-122.91001078830972
+33
+218.88146657326973
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.733894627712388
+20
+-123.2051083816589
+30
+220.37581644804217
+11
+28.302229613653687
+21
+-123.14882688189664
+31
+220.98913268329076
+12
+27.80238905089896
+22
+-122.80109848066161
+32
+219.64780764300738
+13
+27.80238905089896
+23
+-122.80109848066161
+33
+219.64780764300738
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.302229613653687
+20
+-123.14882688189664
+30
+220.98913268329076
+11
+26.66915344757498
+21
+-122.54828806821585
+31
+221.59423486181757
+12
+26.283397005960243
+22
+-122.08191218099516
+32
+220.26964215930153
+13
+26.283397005960243
+23
+-122.08191218099516
+33
+220.26964215930153
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.283397005960243
+20
+-122.08191218099516
+30
+220.26964215930153
+11
+26.66915344757498
+21
+-122.54828806821585
+31
+221.59423486181757
+12
+24.46048486230457
+22
+-120.05942888142565
+32
+221.74665124766116
+13
+24.46048486230457
+23
+-120.05942888142565
+33
+221.74665124766116
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.46048486230457
+20
+-120.05942888142565
+30
+221.74665124766116
+11
+24.915300225249364
+21
+-120.51120200114036
+31
+222.9991427856168
+12
+24.86236519304041
+22
+-117.48873335173796
+32
+222.90939661032075
+13
+24.86236519304041
+23
+-117.48873335173796
+33
+222.90939661032075
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.86236519304041
+20
+-117.48873335173796
+30
+222.90939661032075
+11
+24.915300225249364
+21
+-120.51120200114036
+31
+222.9991427856168
+12
+25.474464530996894
+22
+-117.81668717197535
+32
+223.96657613288463
+13
+25.474464530996894
+23
+-117.81668717197535
+33
+223.96657613288463
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.97967858039367
+20
+-118.76586705985858
+30
+217.77713228063564
+11
+32.85555505659335
+21
+-116.43885521292563
+31
+217.944759882631
+12
+33.94011476823095
+22
+-116.75524850888756
+32
+219.28851871749887
+13
+33.94011476823095
+23
+-116.75524850888756
+33
+219.28851871749887
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.80238905089896
+20
+-122.80109848066161
+30
+219.64780764300738
+11
+26.283397005960243
+21
+-122.08191218099516
+31
+220.26964215930153
+12
+25.748570646055917
+22
+-121.61614474242073
+32
+219.30616372823377
+13
+25.748570646055917
+23
+-121.61614474242073
+33
+219.30616372823377
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.03210771512922
+20
+-115.18088763715645
+30
+222.54219785241207
+11
+24.86236519304041
+21
+-117.48873335173796
+31
+222.90939661032075
+12
+25.474464530996894
+22
+-117.81668717197535
+32
+223.96657613288463
+13
+25.474464530996894
+23
+-117.81668717197535
+33
+223.96657613288463
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.015390027529538
+20
+-114.86084364931794
+30
+220.83975854068032
+11
+23.805794119122503
+21
+-116.47536213169124
+31
+221.07066480186728
+12
+24.86236519304041
+22
+-117.48873335173796
+32
+222.90939661032075
+13
+24.86236519304041
+23
+-117.48873335173796
+33
+222.90939661032075
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.69827108158167
+20
+-122.0012927353891
+30
+218.36428522410202
+11
+33.579608945428554
+21
+-119.03753938033354
+31
+218.71536009289062
+12
+32.864377561961504
+22
+-122.58175274374982
+32
+219.94533903094043
+13
+32.864377561961504
+23
+-122.58175274374982
+33
+219.94533903094043
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.35058663084952
+20
+-113.5834057168735
+30
+222.9763259613903
+11
+27.91738584500808
+21
+-112.31600718708822
+31
+220.59546640927982
+12
+26.03210771512922
+22
+-115.18088763715645
+32
+222.54219785241207
+13
+26.03210771512922
+23
+-115.18088763715645
+33
+222.54219785241207
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.864377561961504
+20
+-122.58175274374982
+30
+219.94533903094043
+11
+30.733894627712388
+21
+-123.2051083816589
+31
+220.37581644804217
+12
+30.166516265242816
+22
+-122.91001078830972
+32
+218.88146657326973
+13
+30.166516265242816
+23
+-122.91001078830972
+33
+218.88146657326973
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.62283809963527
+20
+-114.48847307791642
+30
+218.4643750263841
+11
+30.765838181631594
+21
+-113.419428806754
+31
+219.26813568785593
+12
+31.362726303436077
+22
+-112.84383638756279
+32
+220.78378126524143
+13
+31.362726303436077
+23
+-112.84383638756279
+33
+220.78378126524143
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.302229613653687
+20
+-123.14882688189664
+30
+220.98913268329076
+11
+26.283397005960243
+21
+-122.08191218099516
+31
+220.26964215930153
+12
+27.80238905089896
+22
+-122.80109848066161
+32
+219.64780764300738
+13
+27.80238905089896
+23
+-122.80109848066161
+33
+219.64780764300738
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.85555505659335
+20
+-116.43885521292563
+30
+217.944759882631
+11
+32.74998921649847
+21
+-114.46291823478126
+31
+219.57053466495756
+12
+33.94011476823095
+22
+-116.75524850888756
+32
+219.28851871749887
+13
+33.94011476823095
+23
+-116.75524850888756
+33
+219.28851871749887
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.66915344757498
+20
+-122.54828806821585
+30
+221.59423486181757
+11
+24.915300225249364
+21
+-120.51120200114036
+31
+222.9991427856168
+12
+24.46048486230457
+22
+-120.05942888142565
+32
+221.74665124766116
+13
+24.46048486230457
+23
+-120.05942888142565
+33
+221.74665124766116
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.168964709994636
+20
+-121.06732406365954
+30
+230.98198902218618
+11
+28.81667294391432
+21
+-122.79410132123449
+31
+230.5691566158202
+12
+33.43753618656888
+22
+-123.55709592341843
+32
+229.0449927573899
+13
+33.43753618656888
+23
+-123.55709592341843
+33
+229.0449927573899
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.168964709994636
+20
+-121.06732406365954
+30
+230.98198902218618
+11
+33.43753618656888
+21
+-123.55709592341843
+31
+229.0449927573899
+12
+34.23095322105719
+22
+-121.79533286869373
+32
+229.09032218152302
+13
+34.23095322105719
+23
+-121.79533286869373
+33
+229.09032218152302
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.71200512662105
+20
+-119.68006115059724
+30
+231.3248498342526
+11
+29.220378620588395
+21
+-120.89847956437232
+31
+231.01697481933584
+12
+33.91516837374171
+22
+-120.22705648342273
+32
+229.6774751249906
+13
+33.91516837374171
+23
+-120.22705648342273
+33
+229.6774751249906
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.0338305098948
+20
+-119.40047899772321
+30
+230.1754903418073
+11
+29.71200512662105
+21
+-119.68006115059724
+31
+231.3248498342526
+12
+33.91516837374171
+22
+-120.22705648342273
+32
+229.6774751249906
+13
+33.91516837374171
+23
+-120.22705648342273
+33
+229.6774751249906
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.04998369935096
+20
+-118.92193413758147
+30
+230.94882857097542
+11
+29.71200512662105
+21
+-119.68006115059724
+31
+231.3248498342526
+12
+33.0338305098948
+22
+-119.40047899772321
+32
+230.1754903418073
+13
+33.0338305098948
+23
+-119.40047899772321
+33
+230.1754903418073
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.0338305098948
+20
+-119.40047899772321
+30
+230.1754903418073
+11
+32.430249452983425
+21
+-119.18235015810374
+31
+230.51561313496634
+12
+31.04998369935096
+22
+-118.92193413758147
+32
+230.94882857097542
+13
+31.04998369935096
+23
+-118.92193413758147
+33
+230.94882857097542
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.530991654412237
+20
+-123.59177749624526
+30
+230.11069056099902
+11
+30.243180794648875
+21
+-124.28571317709928
+31
+229.52749253373116
+12
+31.72140678030024
+22
+-124.06210829966484
+32
+229.13230513810217
+13
+31.72140678030024
+23
+-124.06210829966484
+33
+229.13230513810217
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.91516837374171
+20
+-120.22705648342273
+30
+229.6774751249906
+11
+29.168964709994636
+21
+-121.06732406365954
+31
+230.98198902218618
+12
+34.23095322105719
+22
+-121.79533286869373
+32
+229.09032218152302
+13
+34.23095322105719
+23
+-121.79533286869373
+33
+229.09032218152302
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.168964709994636
+20
+-121.06732406365954
+30
+230.98198902218618
+11
+33.91516837374171
+21
+-120.22705648342273
+31
+229.6774751249906
+12
+29.220378620588395
+22
+-120.89847956437232
+32
+231.01697481933584
+13
+29.220378620588395
+23
+-120.89847956437232
+33
+231.01697481933584
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.69827108158167
+20
+-122.0012927353891
+30
+218.36428522410202
+11
+30.166516265242816
+21
+-122.91001078830972
+31
+218.88146657326973
+12
+29.504219913984716
+22
+-122.59726818422429
+32
+217.83888981821173
+13
+29.504219913984716
+23
+-122.59726818422429
+33
+217.83888981821173
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.166516265242816
+20
+-122.91001078830972
+30
+218.88146657326973
+11
+27.110887164629034
+21
+-122.32863810698028
+31
+218.54742826657198
+12
+29.504219913984716
+22
+-122.59726818422429
+32
+217.83888981821173
+13
+29.504219913984716
+23
+-122.59726818422429
+33
+217.83888981821173
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.166516265242816
+20
+-122.91001078830972
+30
+218.88146657326973
+11
+27.80238905089896
+21
+-122.80109848066161
+31
+219.64780764300738
+12
+27.110887164629034
+22
+-122.32863810698028
+32
+218.54742826657198
+13
+27.110887164629034
+23
+-122.32863810698028
+33
+218.54742826657198
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.103530609400913
+20
+-151.77481455834305
+30
+211.66587407939932
+11
+10.76004669852124
+21
+-152.93664724803313
+31
+213.06804398429065
+12
+9.39894707724028
+22
+-153.97709443282997
+32
+213.31081499407603
+13
+9.39894707724028
+23
+-153.97709443282997
+33
+213.31081499407603
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.103530609400913
+20
+-151.77481455834305
+30
+211.66587407939932
+11
+9.39894707724028
+21
+-153.97709443282997
+31
+213.31081499407603
+12
+8.676414310020267
+22
+-152.46053618247507
+32
+211.2192727731764
+13
+8.676414310020267
+23
+-152.46053618247507
+33
+211.2192727731764
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.44394297671515
+20
+-153.90468904394714
+30
+215.96243419369299
+11
+10.05485471771452
+21
+-155.18121430342296
+31
+215.83709377260016
+12
+10.76004669852124
+22
+-152.93664724803313
+32
+213.06804398429065
+13
+10.76004669852124
+23
+-152.93664724803313
+33
+213.06804398429065
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.76004669852124
+20
+-152.93664724803313
+30
+213.06804398429065
+11
+10.05485471771452
+21
+-155.18121430342296
+31
+215.83709377260016
+12
+9.39894707724028
+22
+-153.97709443282997
+32
+213.31081499407603
+13
+9.39894707724028
+23
+-153.97709443282997
+33
+213.31081499407603
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+0.8277309999113314
+20
+-153.60259429116735
+30
+211.83623970030155
+11
+0.6552358087476536
+21
+-153.53475226712953
+31
+212.295922652415
+12
+1.1727213822386982
+22
+-152.68961709772452
+32
+212.72001135873302
+13
+1.1727213822386982
+23
+-152.68961709772452
+33
+212.72001135873302
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.6415310640433272
+20
+-153.13043814180938
+30
+211.6482290686629
+11
+0.8277309999113314
+21
+-153.60259429116735
+31
+211.83623970030155
+12
+1.1727213822386982
+22
+-152.68961709772452
+32
+212.72001135873302
+13
+1.1727213822386982
+23
+-152.68961709772452
+33
+212.72001135873302
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+0.6552358087476536
+20
+-153.53475226712953
+30
+212.295922652415
+11
+0.6677090059922959
+21
+-153.5128481158715
+31
+215.4531626769241
+12
+0.8061310729755031
+22
+-152.16604703777344
+32
+215.4857146794898
+13
+0.8061310729755031
+23
+-152.16604703777344
+33
+215.4857146794898
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+0.6552358087476536
+20
+-153.53475226712953
+30
+212.295922652415
+11
+0.8061310729755031
+21
+-152.16604703777344
+31
+215.4857146794898
+12
+1.1727213822386982
+22
+-152.68961709772452
+32
+212.72001135873302
+13
+1.1727213822386982
+23
+-152.68961709772452
+33
+212.72001135873302
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.1213074716449372
+20
+-154.33242844214027
+30
+211.74862309526554
+11
+0.9494207291273249
+21
+-154.72092290266264
+31
+212.65764537250928
+12
+0.6552358087476536
+22
+-153.53475226712953
+32
+212.295922652415
+13
+0.6552358087476536
+23
+-153.53475226712953
+33
+212.295922652415
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+8.676414310020267
+20
+-152.46053618247507
+30
+211.2192727731764
+11
+7.316227361708442
+21
+-154.49458000632112
+31
+213.28008833744886
+12
+6.845896558288599
+22
+-152.9348219020943
+32
+210.91869914201294
+13
+6.845896558288599
+23
+-152.9348219020943
+33
+210.91869914201294
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.05485471771452
+20
+-155.18121430342296
+30
+215.83709377260016
+11
+7.7126316546295595
+21
+-155.7117815228047
+31
+215.77564045934568
+12
+9.39894707724028
+22
+-153.97709443282997
+32
+213.31081499407603
+13
+9.39894707724028
+23
+-153.97709443282997
+33
+213.31081499407603
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.1213074716449372
+20
+-154.33242844214027
+30
+211.74862309526554
+11
+0.6552358087476536
+21
+-153.53475226712953
+31
+212.295922652415
+12
+0.8277309999113314
+22
+-153.60259429116735
+32
+211.83623970030155
+13
+0.8277309999113314
+23
+-153.60259429116735
+33
+211.83623970030155
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.39894707724028
+20
+-153.97709443282997
+30
+213.31081499407603
+11
+7.7126316546295595
+21
+-155.7117815228047
+31
+215.77564045934568
+12
+7.316227361708442
+22
+-154.49458000632112
+32
+213.28008833744886
+13
+7.316227361708442
+23
+-154.49458000632112
+33
+213.28008833744886
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+0.9494207291273249
+20
+-154.72092290266264
+30
+212.65764537250928
+11
+0.881578705089411
+21
+-155.03974999320923
+31
+215.312915264002
+12
+0.6677090059922959
+22
+-153.5128481158715
+32
+215.4531626769241
+13
+0.6677090059922959
+23
+-153.5128481158715
+33
+215.4531626769241
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.922502487024595
+20
+-151.19952636347512
+30
+214.56361075635573
+11
+9.365786626028912
+21
+-150.73315047625528
+31
+216.4516269051418
+12
+8.883286849687476
+22
+-150.15786228138714
+32
+218.06827495777688
+13
+8.883286849687476
+23
+-150.15786228138714
+33
+218.06827495777688
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.922502487024595
+20
+-151.19952636347512
+30
+214.56361075635573
+11
+8.883286849687476
+21
+-150.15786228138714
+31
+218.06827495777688
+12
+10.326527038189225
+22
+-150.80403474352403
+32
+217.4662150224805
+13
+10.326527038189225
+23
+-150.80403474352403
+33
+217.4662150224805
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.057896960944914
+20
+-151.42404391387785
+30
+211.62693336605042
+11
+10.02686607999484
+21
+-151.1402026204816
+31
+211.76200896548045
+12
+10.230696376431641
+22
+-151.39301303292785
+32
+211.8611860947912
+13
+10.230696376431641
+23
+-151.39301303292785
+33
+211.8611860947912
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+8.88906711182524
+20
+-151.78181171777274
+30
+210.96798348234552
+11
+6.845896558288599
+21
+-152.9348219020943
+31
+210.91869914201294
+12
+6.735158904702044
+22
+-152.53081200109713
+32
+210.5804016947927
+13
+6.735158904702044
+23
+-152.53081200109713
+33
+210.5804016947927
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+8.88906711182524
+20
+-151.78181171777274
+30
+210.96798348234552
+11
+8.676414310020267
+21
+-152.46053618247507
+31
+211.2192727731764
+12
+6.845896558288599
+22
+-152.9348219020943
+32
+210.91869914201294
+13
+6.845896558288599
+23
+-152.9348219020943
+33
+210.91869914201294
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.022013140993721
+20
+-151.50648870542165
+30
+211.4407480803501
+11
+8.88906711182524
+21
+-151.78181171777274
+31
+210.96798348234552
+12
+6.735158904702044
+22
+-152.53081200109713
+32
+210.5804016947927
+13
+6.735158904702044
+23
+-152.53081200109713
+33
+210.5804016947927
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+6.735158904702044
+20
+-152.53081200109713
+30
+210.5804016947927
+11
+4.52314385187821
+21
+-153.1578183308826
+31
+210.69479004025527
+12
+6.703215350782831
+22
+-152.32150566684598
+32
+211.49155354229757
+13
+6.703215350782831
+23
+-152.32150566684598
+33
+211.49155354229757
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+6.735158904702044
+20
+-152.53081200109713
+30
+210.5804016947927
+11
+6.845896558288599
+21
+-152.9348219020943
+31
+210.91869914201294
+12
+4.928370650167485
+22
+-153.52653821040718
+32
+211.10245063312908
+13
+4.928370650167485
+23
+-153.52653821040718
+33
+211.10245063312908
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+4.52314385187821
+20
+-153.1578183308826
+30
+210.69479004025527
+11
+4.928370650167485
+21
+-153.52653821040718
+31
+211.10245063312908
+12
+3.055869941856292
+22
+-154.08205182427827
+32
+211.4106298723685
+13
+3.055869941856292
+23
+-154.08205182427827
+33
+211.4106298723685
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+4.52314385187821
+20
+-153.1578183308826
+30
+210.69479004025527
+11
+3.3412323568678155
+21
+-153.47816654304376
+31
+210.85542048282065
+12
+3.7123860309766203
+22
+-152.9722414938286
+32
+211.66861209830637
+13
+3.7123860309766203
+23
+-152.9722414938286
+33
+211.66861209830637
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+3.3412323568678155
+20
+-153.47816654304376
+30
+210.85542048282065
+11
+1.7945558985324568
+21
+-154.45533506864842
+31
+211.47238740994518
+12
+1.6832097962998256
+22
+-153.70907280423108
+32
+210.87489083949515
+13
+1.6832097962998256
+23
+-153.70907280423108
+33
+210.87489083949515
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+3.7123860309766203
+20
+-152.9722414938286
+30
+211.66861209830637
+11
+1.6832097962998256
+21
+-153.70907280423108
+31
+210.87489083949515
+12
+1.6415310640433272
+22
+-153.13043814180938
+32
+211.6482290686629
+13
+1.6415310640433272
+23
+-153.13043814180938
+33
+211.6482290686629
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+3.7123860309766203
+20
+-152.9722414938286
+30
+211.66861209830637
+11
+3.3412323568678155
+21
+-153.47816654304376
+31
+210.85542048282065
+12
+1.6832097962998256
+22
+-153.70907280423108
+32
+210.87489083949515
+13
+1.6832097962998256
+23
+-153.70907280423108
+33
+210.87489083949515
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.6832097962998256
+20
+-153.70907280423108
+30
+210.87489083949515
+11
+1.7945558985324568
+21
+-154.45533506864842
+31
+211.47238740994518
+12
+1.1213074716449372
+22
+-154.33242844214027
+32
+211.74862309526554
+13
+1.1213074716449372
+23
+-154.33242844214027
+33
+211.74862309526554
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.6832097962998256
+20
+-153.70907280423108
+30
+210.87489083949515
+11
+1.1213074716449372
+21
+-154.33242844214027
+31
+211.74862309526554
+12
+0.8277309999113314
+22
+-153.60259429116735
+32
+211.83623970030155
+13
+0.8277309999113314
+23
+-153.60259429116735
+33
+211.83623970030155
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.02686607999484
+20
+-151.1402026204816
+30
+211.76200896548045
+11
+10.55956286963786
+21
+-151.2993119414318
+31
+212.52926270818728
+12
+10.230696376431641
+22
+-151.39301303292785
+32
+211.8611860947912
+13
+10.230696376431641
+23
+-151.39301303292785
+33
+211.8611860947912
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.230696376431641
+20
+-151.39301303292785
+30
+211.8611860947912
+11
+10.55956286963786
+21
+-151.2993119414318
+31
+212.52926270818728
+12
+10.828497171205232
+22
+-151.95826182513642
+32
+212.82740254476633
+13
+10.828497171205232
+23
+-151.95826182513642
+33
+212.82740254476633
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.55956286963786
+20
+-151.2993119414318
+30
+212.52926270818728
+11
+10.922502487024595
+21
+-151.19952636347512
+31
+214.56361075635573
+12
+10.828497171205232
+22
+-151.95826182513642
+32
+212.82740254476633
+13
+10.828497171205232
+23
+-151.95826182513642
+33
+212.82740254476633
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.828497171205232
+20
+-151.95826182513642
+30
+212.82740254476633
+11
+10.922502487024595
+21
+-151.19952636347512
+31
+214.56361075635573
+12
+11.4649344550049
+22
+-152.420682796158
+32
+215.29770404785066
+13
+11.4649344550049
+23
+-152.420682796158
+33
+215.29770404785066
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.326527038189225
+20
+-150.80403474352403
+30
+217.4662150224805
+11
+8.883286849687476
+21
+-150.15786228138714
+31
+218.06827495777688
+12
+7.8178932704014
+22
+-149.07573636433435
+32
+219.98853888480562
+13
+7.8178932704014
+23
+-149.07573636433435
+33
+219.98853888480562
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.103530609400913
+20
+-151.77481455834305
+30
+211.66587407939932
+11
+10.230696376431641
+21
+-151.39301303292785
+31
+211.8611860947912
+12
+10.828497171205232
+22
+-151.95826182513642
+32
+212.82740254476633
+13
+10.828497171205232
+23
+-151.95826182513642
+33
+212.82740254476633
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.022013140993721
+20
+-151.50648870542165
+30
+211.4407480803501
+11
+6.735158904702044
+21
+-152.53081200109713
+31
+210.5804016947927
+12
+6.703215350782831
+22
+-152.32150566684598
+32
+211.49155354229757
+13
+6.703215350782831
+23
+-152.32150566684598
+33
+211.49155354229757
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.103530609400913
+20
+-151.77481455834305
+30
+211.66587407939932
+11
+10.828497171205232
+21
+-151.95826182513642
+31
+212.82740254476633
+12
+10.76004669852124
+22
+-152.93664724803313
+32
+213.06804398429065
+13
+10.76004669852124
+23
+-152.93664724803313
+33
+213.06804398429065
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+6.703215350782831
+20
+-152.32150566684598
+30
+211.49155354229757
+11
+4.52314385187821
+21
+-153.1578183308826
+31
+210.69479004025527
+12
+3.7123860309766203
+22
+-152.9722414938286
+32
+211.66861209830637
+13
+3.7123860309766203
+23
+-152.9722414938286
+33
+211.66861209830637
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.828497171205232
+20
+-151.95826182513642
+30
+212.82740254476633
+11
+11.4649344550049
+21
+-152.420682796158
+31
+215.29770404785066
+12
+10.76004669852124
+22
+-152.93664724803313
+32
+213.06804398429065
+13
+10.76004669852124
+23
+-152.93664724803313
+33
+213.06804398429065
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+6.735158904702044
+20
+-152.53081200109713
+30
+210.5804016947927
+11
+4.928370650167485
+21
+-153.52653821040718
+31
+211.10245063312908
+12
+4.52314385187821
+22
+-153.1578183308826
+32
+210.69479004025527
+13
+4.52314385187821
+23
+-153.1578183308826
+33
+210.69479004025527
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.76004669852124
+20
+-152.93664724803313
+30
+213.06804398429065
+11
+11.4649344550049
+21
+-152.420682796158
+31
+215.29770404785066
+12
+11.44394297671515
+22
+-153.90468904394714
+32
+215.96243419369299
+13
+11.44394297671515
+23
+-153.90468904394714
+33
+215.96243419369299
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+4.52314385187821
+20
+-153.1578183308826
+30
+210.69479004025527
+11
+3.055869941856292
+21
+-154.08205182427827
+31
+211.4106298723685
+12
+3.3412323568678155
+22
+-153.47816654304376
+32
+210.85542048282065
+13
+3.3412323568678155
+23
+-153.47816654304376
+33
+210.85542048282065
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.39894707724028
+20
+-153.97709443282997
+30
+213.31081499407603
+11
+7.316227361708442
+21
+-154.49458000632112
+31
+213.28008833744886
+12
+8.676414310020267
+22
+-152.46053618247507
+32
+211.2192727731764
+13
+8.676414310020267
+23
+-152.46053618247507
+33
+211.2192727731764
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+3.3412323568678155
+20
+-153.47816654304376
+30
+210.85542048282065
+11
+3.055869941856292
+21
+-154.08205182427827
+31
+211.4106298723685
+12
+1.7945558985324568
+22
+-154.45533506864842
+32
+211.47238740994518
+13
+1.7945558985324568
+23
+-154.45533506864842
+33
+211.47238740994518
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+0.6552358087476536
+20
+-153.53475226712953
+30
+212.295922652415
+11
+0.9494207291273249
+21
+-154.72092290266264
+31
+212.65764537250928
+12
+0.6677090059922959
+22
+-153.5128481158715
+32
+215.4531626769241
+13
+0.6677090059922959
+23
+-153.5128481158715
+33
+215.4531626769241
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.6832097962998256
+20
+-153.70907280423108
+30
+210.87489083949515
+11
+0.8277309999113314
+21
+-153.60259429116735
+31
+211.83623970030155
+12
+1.6415310640433272
+22
+-153.13043814180938
+32
+211.6482290686629
+13
+1.6415310640433272
+23
+-153.13043814180938
+33
+211.6482290686629
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+7.316227361708442
+20
+-154.49458000632112
+30
+213.28008833744886
+11
+4.928370650167485
+21
+-153.52653821040718
+31
+211.10245063312908
+12
+6.845896558288599
+22
+-152.9348219020943
+32
+210.91869914201294
+13
+6.845896558288599
+23
+-152.9348219020943
+33
+210.91869914201294
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+7.736969600472767
+20
+-158.13492825582
+30
+222.4439333960591
+11
+6.638111345652286
+21
+-158.8522892095483
+31
+222.36939843691408
+12
+6.0363556346791745
+22
+-158.64572089420358
+32
+220.1838509001948
+13
+6.0363556346791745
+23
+-158.64572089420358
+33
+220.1838509001948
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+7.316227361708442
+20
+-154.49458000632112
+30
+213.28008833744886
+11
+5.1711416599533955
+21
+-155.09876951187846
+31
+213.3089896481378
+12
+4.928370650167485
+22
+-153.52653821040718
+32
+211.10245063312908
+13
+4.928370650167485
+23
+-153.52653821040718
+33
+211.10245063312908
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+6.638111345652286
+20
+-158.8522892095483
+30
+222.36939843691408
+11
+4.438265265750055
+21
+-158.99192817382308
+31
+220.0429950386272
+12
+6.0363556346791745
+22
+-158.64572089420358
+32
+220.1838509001948
+13
+6.0363556346791745
+23
+-158.64572089420358
+33
+220.1838509001948
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+7.7126316546295595
+20
+-155.7117815228047
+30
+215.77564045934568
+11
+5.319298905273888
+21
+-156.2895035122575
+31
+215.26393514799256
+12
+5.1711416599533955
+22
+-155.09876951187846
+32
+213.3089896481378
+13
+5.1711416599533955
+23
+-155.09876951187846
+33
+213.3089896481378
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.3004955979154935
+20
+-154.4714589577717
+30
+219.97758680917477
+11
+3.0047602555855804
+21
+-157.532564096201
+31
+222.6742312086005
+12
+1.651570466703651
+22
+-154.11095313496983
+32
+222.13149501629806
+13
+1.651570466703651
+23
+-154.11095313496983
+33
+222.13149501629806
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+6.638111345652286
+20
+-158.8522892095483
+30
+222.36939843691408
+11
+4.7662190859871805
+21
+-158.77714580175748
+31
+222.58174701439603
+12
+4.438265265750055
+22
+-158.99192817382308
+32
+220.0429950386272
+13
+4.438265265750055
+23
+-158.99192817382308
+33
+220.0429950386272
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+8.750340820518995
+20
+-154.73065808100367
+30
+227.14632875728924
+11
+3.3941673890767574
+21
+-155.74980956318754
+31
+226.90325352317998
+12
+8.227379209213236
+22
+-156.00992135938682
+32
+227.19074550845275
+13
+8.227379209213236
+23
+-156.00992135938682
+33
+227.19074550845275
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+6.639632467267478
+20
+-158.24384056346898
+30
+224.8786406533482
+11
+4.906466498908618
+21
+-158.33845432793441
+31
+224.9340094801414
+12
+4.7662190859871805
+22
+-158.77714580175748
+32
+222.58174701439603
+13
+4.7662190859871805
+23
+-158.77714580175748
+33
+222.58174701439603
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+8.653901710115312
+20
+-152.16239634589982
+30
+226.73836394009328
+11
+2.64334175981405
+21
+-152.8837122158276
+31
+226.37937923890587
+12
+8.750340820518995
+22
+-154.73065808100367
+32
+227.14632875728924
+13
+8.750340820518995
+23
+-154.73065808100367
+33
+227.14632875728924
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.651570466703651
+20
+-154.11095313496983
+30
+222.13149501629806
+11
+2.70996688655981
+21
+-156.75679207244946
+31
+224.3745409500713
+12
+1.8045953011927807
+22
+-153.78391198770225
+32
+223.7876922309279
+13
+1.8045953011927807
+23
+-153.78391198770225
+33
+223.7876922309279
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+6.527677916388758
+20
+-147.64375247578565
+30
+222.46340375273633
+11
+5.572717766366199
+21
+-148.602363317684
+31
+219.79231419644486
+12
+4.6311434865574075
+22
+-147.1868075425795
+32
+222.25561854009985
+13
+4.6311434865574075
+23
+-147.1868075425795
+33
+222.25561854009985
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+7.487505655579967
+20
+-157.9149740702629
+30
+224.975383988075
+11
+6.639632467267478
+21
+-158.24384056346898
+31
+224.8786406533482
+12
+6.638111345652286
+22
+-158.8522892095483
+32
+222.36939843691408
+13
+6.638111345652286
+23
+-158.8522892095483
+33
+222.36939843691408
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+6.527677916388758
+20
+-147.64375247578565
+30
+222.46340375273633
+11
+4.6311434865574075
+21
+-147.1868075425795
+31
+222.25561854009985
+12
+4.569081724657246
+22
+-147.29085226105946
+32
+223.31340651131023
+13
+4.569081724657246
+23
+-147.29085226105946
+33
+223.31340651131023
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+7.736969600472767
+20
+-158.13492825582
+30
+222.4439333960591
+11
+7.487505655579967
+21
+-157.9149740702629
+31
+224.975383988075
+12
+6.638111345652286
+22
+-158.8522892095483
+32
+222.36939843691408
+13
+6.638111345652286
+23
+-158.8522892095483
+33
+222.36939843691408
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+4.906466498908618
+20
+-158.33845432793441
+30
+224.9340094801414
+11
+3.0047602555855804
+21
+-157.532564096201
+31
+222.6742312086005
+12
+4.7662190859871805
+22
+-158.77714580175748
+32
+222.58174701439603
+13
+4.7662190859871805
+23
+-158.77714580175748
+33
+222.58174701439603
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+2.6977979136382175
+20
+-150.29172098352677
+30
+226.26590356641262
+11
+2.64334175981405
+21
+-152.8837122158276
+31
+226.37937923890587
+12
+8.653901710115312
+22
+-152.16239634589982
+32
+226.73836394009328
+13
+8.653901710115312
+23
+-152.16239634589982
+33
+226.73836394009328
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+3.3941673890767574
+20
+-155.74980956318754
+30
+226.90325352317998
+11
+5.065575819858528
+21
+-156.7759582048016
+31
+227.2430720920154
+12
+8.227379209213236
+22
+-156.00992135938682
+32
+227.19074550845275
+13
+8.227379209213236
+23
+-156.00992135938682
+33
+227.19074550845275
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+3.307463457010372
+20
+-148.59293236367137
+30
+226.1192674427078
+11
+2.6977979136382175
+21
+-150.29172098352677
+31
+226.26590356641262
+12
+7.351517383181078
+22
+-148.89867780832662
+32
+226.1898474856528
+13
+7.351517383181078
+23
+-148.89867780832662
+33
+226.1898474856528
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+7.351517383181078
+20
+-148.89867780832662
+30
+226.1898474856528
+11
+2.6977979136382175
+21
+-150.29172098352677
+31
+226.26590356641262
+12
+8.653901710115312
+22
+-152.16239634589982
+32
+226.73836394009328
+13
+8.653901710115312
+23
+-152.16239634589982
+33
+226.73836394009328
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+8.227379209213236
+20
+-156.00992135938682
+30
+227.19074550845275
+11
+5.065575819858528
+21
+-156.7759582048016
+31
+227.2430720920154
+12
+7.31683581035452
+22
+-156.65791916746204
+32
+227.25463261629073
+13
+7.31683581035452
+23
+-156.65791916746204
+33
+227.25463261629073
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+4.7662190859871805
+20
+-158.77714580175748
+30
+222.58174701439603
+11
+3.0047602555855804
+21
+-157.532564096201
+31
+222.6742312086005
+12
+2.5055281414769306
+22
+-157.55659781772042
+32
+220.2425661945418
+13
+2.5055281414769306
+23
+-157.55659781772042
+33
+220.2425661945418
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+7.31683581035452
+20
+-156.65791916746204
+30
+227.25463261629073
+11
+5.065575819858528
+21
+-156.7759582048016
+31
+227.2430720920154
+12
+6.371915062992283
+22
+-156.99226169848316
+32
+227.27592831890365
+13
+6.371915062992283
+23
+-156.99226169848316
+33
+227.27592831890365
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+4.7662190859871805
+20
+-158.77714580175748
+30
+222.58174701439603
+11
+2.5055281414769306
+21
+-157.55659781772042
+31
+220.2425661945418
+12
+4.438265265750055
+22
+-158.99192817382308
+32
+220.0429950386272
+13
+4.438265265750055
+23
+-158.99192817382308
+33
+220.0429950386272
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.3004955979154935
+20
+-154.4714589577717
+30
+219.97758680917477
+11
+2.5055281414769306
+21
+-157.55659781772042
+31
+220.2425661945418
+12
+3.0047602555855804
+22
+-157.532564096201
+32
+222.6742312086005
+13
+3.0047602555855804
+23
+-157.532564096201
+33
+222.6742312086005
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+6.527677916388758
+20
+-147.64375247578565
+30
+222.46340375273633
+11
+4.569081724657246
+21
+-147.29085226105946
+31
+223.31340651131023
+12
+6.260568960759652
+22
+-147.7684844482323
+32
+223.52879733202235
+13
+6.260568960759652
+23
+-147.7684844482323
+33
+223.52879733202235
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+6.639632467267478
+20
+-158.24384056346898
+30
+224.8786406533482
+11
+4.7662190859871805
+21
+-158.77714580175748
+31
+222.58174701439603
+12
+6.638111345652286
+22
+-158.8522892095483
+32
+222.36939843691408
+13
+6.638111345652286
+23
+-158.8522892095483
+33
+222.36939843691408
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+3.769275979385084
+20
+-147.82081103179584
+30
+226.00061995672206
+11
+3.307463457010372
+21
+-148.59293236367137
+31
+226.1192674427078
+12
+5.846519657102206
+22
+-147.94402188262708
+32
+226.1886305883611
+13
+5.846519657102206
+23
+-147.94402188262708
+33
+226.1886305883611
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.057896960944914
+20
+-151.42404391387785
+30
+211.62693336605042
+11
+10.103530609400913
+21
+-151.77481455834305
+31
+211.66587407939932
+12
+8.676414310020267
+22
+-152.46053618247507
+32
+211.2192727731764
+13
+8.676414310020267
+23
+-152.46053618247507
+33
+211.2192727731764
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.057896960944914
+20
+-151.42404391387785
+30
+211.62693336605042
+11
+8.676414310020267
+21
+-152.46053618247507
+31
+211.2192727731764
+12
+8.88906711182524
+22
+-151.78181171777274
+32
+210.96798348234552
+13
+8.88906711182524
+23
+-151.78181171777274
+33
+210.96798348234552
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+2.64334175981405
+20
+-152.8837122158276
+30
+226.37937923890587
+11
+3.3941673890767574
+21
+-155.74980956318754
+31
+226.90325352317998
+12
+8.750340820518995
+22
+-154.73065808100367
+32
+227.14632875728924
+13
+8.750340820518995
+23
+-154.73065808100367
+33
+227.14632875728924
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+7.7126316546295595
+20
+-155.7117815228047
+30
+215.77564045934568
+11
+5.1711416599533955
+21
+-155.09876951187846
+31
+213.3089896481378
+12
+7.316227361708442
+22
+-154.49458000632112
+32
+213.28008833744886
+13
+7.316227361708442
+23
+-154.49458000632112
+33
+213.28008833744886
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+4.706286894348288
+20
+-147.37603507151135
+30
+226.02617479985787
+11
+3.769275979385084
+21
+-147.82081103179584
+31
+226.00061995672206
+12
+5.846519657102206
+22
+-147.94402188262708
+32
+226.1886305883611
+13
+5.846519657102206
+23
+-147.94402188262708
+33
+226.1886305883611
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+4.906466498908618
+20
+-158.33845432793441
+30
+224.9340094801414
+11
+2.70996688655981
+21
+-156.75679207244946
+31
+224.3745409500713
+12
+3.0047602555855804
+22
+-157.532564096201
+32
+222.6742312086005
+13
+3.0047602555855804
+23
+-157.532564096201
+33
+222.6742312086005
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+5.846519657102206
+20
+-147.94402188262708
+30
+226.1886305883611
+11
+3.307463457010372
+21
+-148.59293236367137
+31
+226.1192674427078
+12
+7.351517383181078
+22
+-148.89867780832662
+32
+226.1898474856528
+13
+7.351517383181078
+23
+-148.89867780832662
+33
+226.1898474856528
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+7.8178932704014
+20
+-149.07573636433435
+30
+219.98853888480562
+11
+5.572717766366199
+21
+-148.602363317684
+31
+219.79231419644486
+12
+6.527677916388758
+22
+-147.64375247578565
+32
+222.46340375273633
+13
+6.527677916388758
+23
+-147.64375247578565
+33
+222.46340375273633
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.651570466703651
+20
+-154.11095313496983
+30
+222.13149501629806
+11
+3.0047602555855804
+21
+-157.532564096201
+31
+222.6742312086005
+12
+2.70996688655981
+22
+-156.75679207244946
+32
+224.3745409500713
+13
+2.70996688655981
+23
+-156.75679207244946
+33
+224.3745409500713
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.02686607999484
+20
+-151.1402026204816
+30
+211.76200896548045
+11
+8.88906711182524
+21
+-151.78181171777274
+31
+210.96798348234552
+12
+9.022013140993721
+22
+-151.50648870542165
+32
+211.4407480803501
+13
+9.022013140993721
+23
+-151.50648870542165
+33
+211.4407480803501
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.02686607999484
+20
+-151.1402026204816
+30
+211.76200896548045
+11
+10.057896960944914
+21
+-151.42404391387785
+31
+211.62693336605042
+12
+8.88906711182524
+22
+-151.78181171777274
+32
+210.96798348234552
+13
+8.88906711182524
+23
+-151.78181171777274
+33
+210.96798348234552
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.057896960944914
+20
+-151.42404391387785
+30
+211.62693336605042
+11
+10.230696376431641
+21
+-151.39301303292785
+31
+211.8611860947912
+12
+10.103530609400913
+22
+-151.77481455834305
+32
+211.66587407939932
+13
+10.103530609400913
+23
+-151.77481455834305
+33
+211.66587407939932
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.844752911834053
+20
+-149.17765151255327
+30
+222.1917314322612
+11
+1.4848555376777368
+21
+-151.53478156746715
+31
+222.26717906437455
+12
+1.7826911499338802
+22
+-151.29201055768166
+32
+223.72836848793574
+13
+1.7826911499338802
+23
+-151.29201055768166
+33
+223.72836848793574
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.844752911834053
+20
+-149.17765151255327
+30
+222.1917314322612
+11
+1.7826911499338802
+21
+-151.29201055768166
+31
+223.72836848793574
+12
+2.3506779610495707
+22
+-148.91388902447795
+32
+223.5634789048487
+13
+2.3506779610495707
+23
+-148.91388902447795
+33
+223.5634789048487
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.3004955979154935
+20
+-154.4714589577717
+30
+219.97758680917477
+11
+1.651570466703651
+21
+-154.11095313496983
+31
+222.13149501629806
+12
+1.4848555376777368
+22
+-151.53478156746715
+32
+222.26717906437455
+13
+1.4848555376777368
+23
+-151.53478156746715
+33
+222.26717906437455
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.3004955979154935
+20
+-154.4714589577717
+30
+219.97758680917477
+11
+1.4848555376777368
+21
+-151.53478156746715
+31
+222.26717906437455
+12
+1.2277859847089314
+22
+-152.31268316148
+32
+220.03234718732236
+13
+1.2277859847089314
+23
+-152.31268316148
+33
+220.03234718732236
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.651570466703651
+20
+-154.11095313496983
+30
+222.13149501629806
+11
+1.8045953011927807
+21
+-153.78391198770225
+31
+223.7876922309279
+12
+1.4848555376777368
+22
+-151.53478156746715
+32
+222.26717906437455
+13
+1.4848555376777368
+23
+-151.53478156746715
+33
+222.26717906437455
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.4848555376777368
+20
+-151.53478156746715
+30
+222.26717906437455
+11
+1.8045953011927807
+21
+-153.78391198770225
+31
+223.7876922309279
+12
+1.7826911499338802
+22
+-151.29201055768166
+32
+223.72836848793574
+13
+1.7826911499338802
+23
+-151.29201055768166
+33
+223.72836848793574
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+7.736969600472767
+20
+-158.13492825582
+30
+222.4439333960591
+11
+6.0363556346791745
+21
+-158.64572089420358
+31
+220.1838509001948
+12
+7.592463047028769
+22
+-157.76438303035684
+32
+220.6660464522131
+13
+7.592463047028769
+23
+-157.76438303035684
+33
+220.6660464522131
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.7826911499338802
+20
+-151.29201055768166
+30
+223.72836848793574
+11
+2.6977979136382175
+21
+-150.29172098352677
+31
+226.26590356641262
+12
+3.307463457010372
+22
+-148.59293236367137
+32
+226.1192674427078
+13
+3.307463457010372
+23
+-148.59293236367137
+33
+226.1192674427078
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+2.3506779610495707
+20
+-148.91388902447795
+30
+223.5634789048487
+11
+1.7826911499338802
+21
+-151.29201055768166
+31
+223.72836848793574
+12
+3.307463457010372
+22
+-148.59293236367137
+32
+226.1192674427078
+13
+3.307463457010372
+23
+-148.59293236367137
+33
+226.1192674427078
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+4.906466498908618
+20
+-158.33845432793441
+30
+224.9340094801414
+11
+3.3941673890767574
+21
+-155.74980956318754
+31
+226.90325352317998
+12
+2.70996688655981
+22
+-156.75679207244946
+32
+224.3745409500713
+13
+2.70996688655981
+23
+-156.75679207244946
+33
+224.3745409500713
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.292164339853235
+20
+-156.02421990256903
+30
+224.4372111606177
+11
+8.227379209213236
+21
+-156.00992135938682
+31
+227.19074550845275
+12
+8.470454443322195
+22
+-157.22621020290012
+32
+224.76638187814666
+13
+8.470454443322195
+23
+-157.22621020290012
+33
+224.76638187814666
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.292164339853235
+20
+-156.02421990256903
+30
+224.4372111606177
+11
+8.750340820518995
+21
+-154.73065808100367
+31
+227.14632875728924
+12
+8.227379209213236
+22
+-156.00992135938682
+32
+227.19074550845275
+13
+8.227379209213236
+23
+-156.00992135938682
+33
+227.19074550845275
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+5.065575819858528
+20
+-156.7759582048016
+30
+227.2430720920154
+11
+3.3941673890767574
+21
+-155.74980956318754
+31
+226.90325352317998
+12
+4.906466498908618
+22
+-158.33845432793441
+32
+224.9340094801414
+13
+4.906466498908618
+23
+-158.33845432793441
+33
+224.9340094801414
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+8.470454443322195
+20
+-157.22621020290012
+30
+224.76638187814666
+11
+8.227379209213236
+21
+-156.00992135938682
+31
+227.19074550845275
+12
+7.31683581035452
+22
+-156.65791916746204
+32
+227.25463261629073
+13
+7.31683581035452
+23
+-156.65791916746204
+33
+227.25463261629073
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+8.470454443322195
+20
+-157.22621020290012
+30
+224.76638187814666
+11
+7.31683581035452
+21
+-156.65791916746204
+31
+227.25463261629073
+12
+7.487505655579967
+22
+-157.9149740702629
+32
+224.975383988075
+13
+7.487505655579967
+23
+-157.9149740702629
+33
+224.975383988075
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+2.70996688655981
+20
+-156.75679207244946
+30
+224.3745409500713
+11
+3.3941673890767574
+21
+-155.74980956318754
+31
+226.90325352317998
+12
+2.64334175981405
+22
+-152.8837122158276
+32
+226.37937923890587
+13
+2.64334175981405
+23
+-152.8837122158276
+33
+226.37937923890587
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.8045953011927807
+20
+-153.78391198770225
+30
+223.7876922309279
+11
+2.64334175981405
+21
+-152.8837122158276
+31
+226.37937923890587
+12
+2.6977979136382175
+22
+-150.29172098352677
+32
+226.26590356641262
+13
+2.6977979136382175
+23
+-150.29172098352677
+33
+226.26590356641262
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.8045953011927807
+20
+-153.78391198770225
+30
+223.7876922309279
+11
+2.70996688655981
+21
+-156.75679207244946
+31
+224.3745409500713
+12
+2.64334175981405
+22
+-152.8837122158276
+32
+226.37937923890587
+13
+2.64334175981405
+23
+-152.8837122158276
+33
+226.37937923890587
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.419330106883953
+20
+-152.8286476133568
+30
+224.2452456127803
+11
+8.653901710115312
+21
+-152.16239634589982
+31
+226.73836394009328
+12
+8.750340820518995
+22
+-154.73065808100367
+32
+227.14632875728924
+13
+8.750340820518995
+23
+-154.73065808100367
+33
+227.14632875728924
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+5.846519657102206
+20
+-147.94402188262708
+30
+226.1886305883611
+11
+4.569081724657246
+21
+-147.29085226105946
+31
+223.31340651131023
+12
+4.706286894348288
+22
+-147.37603507151135
+32
+226.02617479985787
+13
+4.706286894348288
+23
+-147.37603507151135
+33
+226.02617479985787
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.419330106883953
+20
+-152.8286476133568
+30
+224.2452456127803
+11
+8.750340820518995
+21
+-154.73065808100367
+31
+227.14632875728924
+12
+9.292164339853235
+22
+-156.02421990256903
+32
+224.4372111606177
+13
+9.292164339853235
+23
+-156.02421990256903
+33
+224.4372111606177
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+8.081959982800122
+20
+-149.27409062295732
+30
+223.65261663149928
+11
+8.653901710115312
+21
+-152.16239634589982
+31
+226.73836394009328
+12
+9.419330106883953
+22
+-152.8286476133568
+32
+224.2452456127803
+13
+9.419330106883953
+23
+-152.8286476133568
+33
+224.2452456127803
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+6.260568960759652
+20
+-147.7684844482323
+30
+223.52879733202235
+11
+4.569081724657246
+21
+-147.29085226105946
+31
+223.31340651131023
+12
+5.846519657102206
+22
+-147.94402188262708
+32
+226.1886305883611
+13
+5.846519657102206
+23
+-147.94402188262708
+33
+226.1886305883611
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+8.081959982800122
+20
+-149.27409062295732
+30
+223.65261663149928
+11
+7.351517383181078
+21
+-148.89867780832662
+31
+226.1898474856528
+12
+8.653901710115312
+22
+-152.16239634589982
+32
+226.73836394009328
+13
+8.653901710115312
+23
+-152.16239634589982
+33
+226.73836394009328
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+7.351517383181078
+20
+-148.89867780832662
+30
+226.1898474856528
+11
+6.260568960759652
+21
+-147.7684844482323
+31
+223.52879733202235
+12
+5.846519657102206
+22
+-147.94402188262708
+32
+226.1886305883611
+13
+5.846519657102206
+23
+-147.94402188262708
+33
+226.1886305883611
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+6.371915062992283
+20
+-156.99226169848316
+30
+227.27592831890365
+11
+5.065575819858528
+21
+-156.7759582048016
+31
+227.2430720920154
+12
+4.906466498908618
+22
+-158.33845432793441
+32
+224.9340094801414
+13
+4.906466498908618
+23
+-158.33845432793441
+33
+224.9340094801414
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.7826911499338802
+20
+-151.29201055768166
+30
+223.72836848793574
+11
+1.8045953011927807
+21
+-153.78391198770225
+31
+223.7876922309279
+12
+2.6977979136382175
+22
+-150.29172098352677
+32
+226.26590356641262
+13
+2.6977979136382175
+23
+-150.29172098352677
+33
+226.26590356641262
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+6.639632467267478
+20
+-158.24384056346898
+30
+224.8786406533482
+11
+6.371915062992283
+21
+-156.99226169848316
+31
+227.27592831890365
+12
+4.906466498908618
+22
+-158.33845432793441
+32
+224.9340094801414
+13
+4.906466498908618
+23
+-158.33845432793441
+33
+224.9340094801414
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+7.487505655579967
+20
+-157.9149740702629
+30
+224.975383988075
+11
+6.371915062992283
+21
+-156.99226169848316
+31
+227.27592831890365
+12
+6.639632467267478
+22
+-158.24384056346898
+32
+224.8786406533482
+13
+6.639632467267478
+23
+-158.24384056346898
+33
+224.8786406533482
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+3.769275979385084
+20
+-147.82081103179584
+30
+226.00061995672206
+11
+3.1431823225687765
+21
+-148.11104103597535
+31
+223.4591299620461
+12
+2.3506779610495707
+22
+-148.91388902447795
+32
+223.5634789048487
+13
+2.3506779610495707
+23
+-148.91388902447795
+33
+223.5634789048487
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+2.3506779610495707
+20
+-148.91388902447795
+30
+223.5634789048487
+11
+3.307463457010372
+21
+-148.59293236367137
+31
+226.1192674427078
+12
+3.769275979385084
+22
+-147.82081103179584
+32
+226.00061995672206
+13
+3.769275979385084
+23
+-147.82081103179584
+33
+226.00061995672206
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+4.706286894348288
+20
+-147.37603507151135
+30
+226.02617479985787
+11
+4.569081724657246
+21
+-147.29085226105946
+31
+223.31340651131023
+12
+3.1431823225687765
+22
+-148.11104103597535
+32
+223.4591299620461
+13
+3.1431823225687765
+23
+-148.11104103597535
+33
+223.4591299620461
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+7.487505655579967
+20
+-157.9149740702629
+30
+224.975383988075
+11
+7.31683581035452
+21
+-156.65791916746204
+31
+227.25463261629073
+12
+6.371915062992283
+22
+-156.99226169848316
+32
+227.27592831890365
+13
+6.371915062992283
+23
+-156.99226169848316
+33
+227.27592831890365
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+4.706286894348288
+20
+-147.37603507151135
+30
+226.02617479985787
+11
+3.1431823225687765
+21
+-148.11104103597535
+31
+223.4591299620461
+12
+3.769275979385084
+22
+-147.82081103179584
+32
+226.00061995672206
+13
+3.769275979385084
+23
+-147.82081103179584
+33
+226.00061995672206
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+0.881578705089411
+20
+-155.03974999320923
+30
+215.312915264002
+11
+1.8182853957295766
+21
+-156.9959123903571
+31
+217.91677124490116
+12
+1.0498147557305397
+22
+-154.96977839891076
+32
+217.64023133525833
+13
+1.0498147557305397
+23
+-154.96977839891076
+33
+217.64023133525833
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+8.081959982800122
+20
+-149.27409062295732
+30
+223.65261663149928
+11
+6.260568960759652
+21
+-147.7684844482323
+31
+223.52879733202235
+12
+7.351517383181078
+22
+-148.89867780832662
+32
+226.1898474856528
+13
+7.351517383181078
+23
+-148.89867780832662
+33
+226.1898474856528
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.326527038189225
+20
+-150.80403474352403
+30
+217.4662150224805
+11
+7.8178932704014
+21
+-149.07573636433435
+31
+219.98853888480562
+12
+9.730247365030827
+22
+-150.40884734789572
+32
+220.3685150642819
+13
+9.730247365030827
+23
+-150.40884734789572
+33
+220.3685150642819
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+8.883286849687476
+20
+-150.15786228138714
+30
+218.06827495777688
+11
+6.995270700901245
+21
+-151.9749941629046
+31
+216.01628189887157
+12
+6.816082574630689
+22
+-151.18218557706274
+32
+217.4735164062334
+13
+6.816082574630689
+23
+-151.18218557706274
+33
+217.4735164062334
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.117510278093238
+20
+-155.01054445819815
+30
+218.21095616528103
+11
+9.596084438570204
+21
+-156.1735940451801
+31
+218.22312513820262
+12
+10.05485471771452
+22
+-155.18121430342296
+32
+215.83709377260016
+13
+10.05485471771452
+23
+-155.18121430342296
+33
+215.83709377260016
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.365786626028912
+20
+-150.73315047625528
+30
+216.4516269051418
+11
+6.995270700901245
+21
+-151.9749941629046
+31
+216.01628189887157
+12
+8.883286849687476
+22
+-150.15786228138714
+32
+218.06827495777688
+13
+8.883286849687476
+23
+-150.15786228138714
+33
+218.06827495777688
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.44394297671515
+20
+-153.90468904394714
+30
+215.96243419369299
+11
+11.117510278093238
+21
+-155.01054445819815
+31
+218.21095616528103
+12
+10.05485471771452
+22
+-155.18121430342296
+32
+215.83709377260016
+13
+10.05485471771452
+23
+-155.18121430342296
+33
+215.83709377260016
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+7.8178932704014
+20
+-149.07573636433435
+30
+219.98853888480562
+11
+6.816082574630689
+21
+-151.18218557706274
+31
+217.4735164062334
+12
+5.572717766366199
+22
+-148.602363317684
+32
+219.79231419644486
+13
+5.572717766366199
+23
+-148.602363317684
+33
+219.79231419644486
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.596084438570204
+20
+-156.1735940451801
+30
+218.22312513820262
+11
+7.4631677097367595
+21
+-157.11760211957326
+31
+218.59975485012592
+12
+7.7126316546295595
+22
+-155.7117815228047
+32
+215.77564045934568
+13
+7.7126316546295595
+23
+-155.7117815228047
+33
+215.77564045934568
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+8.883286849687476
+20
+-150.15786228138714
+30
+218.06827495777688
+11
+6.816082574630689
+21
+-151.18218557706274
+31
+217.4735164062334
+12
+7.8178932704014
+22
+-149.07573636433435
+32
+219.98853888480562
+13
+7.8178932704014
+23
+-149.07573636433435
+33
+219.98853888480562
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+10.05485471771452
+20
+-155.18121430342296
+30
+215.83709377260016
+11
+9.596084438570204
+21
+-156.1735940451801
+31
+218.22312513820262
+12
+7.7126316546295595
+22
+-155.7117815228047
+32
+215.77564045934568
+13
+7.7126316546295595
+23
+-155.7117815228047
+33
+215.77564045934568
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+6.816082574630689
+20
+-151.18218557706274
+30
+217.4735164062334
+11
+3.373480135110056
+21
+-152.53750493620532
+31
+215.7765531323159
+12
+3.839856022330366
+22
+-151.915366195589
+32
+217.50911065202888
+13
+3.839856022330366
+23
+-151.915366195589
+33
+217.50911065202888
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.596084438570204
+20
+-156.1735940451801
+30
+218.22312513820262
+11
+10.63744429633612
+21
+-155.31872369743823
+31
+220.56382707967234
+12
+9.404423115054993
+22
+-156.67860642142702
+32
+220.4841203070355
+13
+9.404423115054993
+23
+-156.67860642142702
+33
+220.4841203070355
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+6.995270700901245
+20
+-151.9749941629046
+30
+216.01628189887157
+11
+3.373480135110056
+21
+-152.53750493620532
+31
+215.7765531323159
+12
+6.816082574630689
+22
+-151.18218557706274
+32
+217.4735164062334
+13
+6.816082574630689
+23
+-151.18218557706274
+33
+217.4735164062334
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+11.117510278093238
+20
+-155.01054445819815
+30
+218.21095616528103
+11
+10.63744429633612
+21
+-155.31872369743823
+31
+220.56382707967234
+12
+9.596084438570204
+22
+-156.1735940451801
+32
+218.22312513820262
+13
+9.596084438570204
+23
+-156.1735940451801
+33
+218.22312513820262
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+5.572717766366199
+20
+-148.602363317684
+30
+219.79231419644486
+11
+3.839856022330366
+21
+-151.915366195589
+31
+217.50911065202888
+12
+3.2788663706446157
+22
+-150.03951901972496
+32
+219.90578986893811
+13
+3.2788663706446157
+23
+-150.03951901972496
+33
+219.90578986893811
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+0.881578705089411
+20
+-155.03974999320923
+30
+215.312915264002
+11
+1.3829403894593297
+21
+-156.337875179621
+31
+215.79328547008183
+12
+1.8182853957295766
+22
+-156.9959123903571
+32
+217.91677124490116
+13
+1.8182853957295766
+23
+-156.9959123903571
+33
+217.91677124490116
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+5.572717766366199
+20
+-148.602363317684
+30
+219.79231419644486
+11
+6.816082574630689
+21
+-151.18218557706274
+31
+217.4735164062334
+12
+3.839856022330366
+22
+-151.915366195589
+32
+217.50911065202888
+13
+3.839856022330366
+23
+-151.915366195589
+33
+217.50911065202888
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.0498147557305397
+20
+-154.96977839891076
+30
+217.64023133525833
+11
+1.8182853957295766
+21
+-156.9959123903571
+31
+217.91677124490116
+12
+2.5055281414769306
+22
+-157.55659781772042
+32
+220.2425661945418
+13
+2.5055281414769306
+23
+-157.55659781772042
+33
+220.2425661945418
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+3.839856022330366
+20
+-151.915366195589
+30
+217.50911065202888
+11
+0.8061310729755031
+21
+-152.16604703777344
+31
+215.4857146794898
+12
+1.376247454352451
+22
+-151.36867508708613
+32
+217.63049615692196
+13
+1.376247454352451
+23
+-151.36867508708613
+33
+217.63049615692196
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+3.839856022330366
+20
+-151.915366195589
+30
+217.50911065202888
+11
+3.373480135110056
+21
+-152.53750493620532
+31
+215.7765531323159
+12
+0.8061310729755031
+22
+-152.16604703777344
+32
+215.4857146794898
+13
+0.8061310729755031
+23
+-152.16604703777344
+33
+215.4857146794898
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.0498147557305397
+20
+-154.96977839891076
+30
+217.64023133525833
+11
+2.5055281414769306
+21
+-157.55659781772042
+31
+220.2425661945418
+12
+1.3004955979154935
+22
+-154.4714589577717
+32
+219.97758680917477
+13
+1.3004955979154935
+23
+-154.4714589577717
+33
+219.97758680917477
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+3.2788663706446157
+20
+-150.03951901972496
+30
+219.90578986893811
+11
+1.376247454352451
+21
+-151.36867508708613
+31
+217.63049615692196
+12
+1.483030191739495
+22
+-150.26494924309762
+32
+219.98215017402114
+13
+1.483030191739495
+23
+-150.26494924309762
+33
+219.98215017402114
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+3.839856022330366
+20
+-151.915366195589
+30
+217.50911065202888
+11
+1.376247454352451
+21
+-151.36867508708613
+31
+217.63049615692196
+12
+3.2788663706446157
+22
+-150.03951901972496
+32
+219.90578986893811
+13
+3.2788663706446157
+23
+-150.03951901972496
+33
+219.90578986893811
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.404423115054993
+20
+-156.67860642142702
+30
+220.4841203070355
+11
+7.592463047028769
+21
+-157.76438303035684
+31
+220.6660464522131
+12
+7.4631677097367595
+22
+-157.11760211957326
+32
+218.59975485012592
+13
+7.4631677097367595
+23
+-157.11760211957326
+33
+218.59975485012592
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+0.6677090059922959
+20
+-153.5128481158715
+30
+215.4531626769241
+11
+1.0498147557305397
+21
+-154.96977839891076
+31
+217.64023133525833
+12
+0.789094510885251
+22
+-153.27281512499368
+32
+217.7932561697477
+13
+0.789094510885251
+23
+-153.27281512499368
+33
+217.7932561697477
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+9.596084438570204
+20
+-156.1735940451801
+30
+218.22312513820262
+11
+9.404423115054993
+21
+-156.67860642142702
+31
+220.4841203070355
+12
+7.4631677097367595
+22
+-157.11760211957326
+32
+218.59975485012592
+13
+7.4631677097367595
+23
+-157.11760211957326
+33
+218.59975485012592
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+0.8061310729755031
+20
+-152.16604703777344
+30
+215.4857146794898
+11
+0.789094510885251
+21
+-153.27281512499368
+31
+217.7932561697477
+12
+1.376247454352451
+22
+-151.36867508708613
+32
+217.63049615692196
+13
+1.376247454352451
+23
+-151.36867508708613
+33
+217.63049615692196
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+0.6677090059922959
+20
+-153.5128481158715
+30
+215.4531626769241
+11
+0.789094510885251
+21
+-153.27281512499368
+31
+217.7932561697477
+12
+0.8061310729755031
+22
+-152.16604703777344
+32
+215.4857146794898
+13
+0.8061310729755031
+23
+-152.16604703777344
+33
+215.4857146794898
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.376247454352451
+20
+-151.36867508708613
+30
+217.63049615692196
+11
+1.2277859847089314
+21
+-152.31268316148
+31
+220.03234718732236
+12
+1.483030191739495
+22
+-150.26494924309762
+32
+219.98215017402114
+13
+1.483030191739495
+23
+-150.26494924309762
+33
+219.98215017402114
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.0498147557305397
+20
+-154.96977839891076
+30
+217.64023133525833
+11
+1.3004955979154935
+21
+-154.4714589577717
+31
+219.97758680917477
+12
+0.789094510885251
+22
+-153.27281512499368
+32
+217.7932561697477
+13
+0.789094510885251
+23
+-153.27281512499368
+33
+217.7932561697477
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+7.7126316546295595
+20
+-155.7117815228047
+30
+215.77564045934568
+11
+7.4631677097367595
+21
+-157.11760211957326
+31
+218.59975485012592
+12
+5.319298905273888
+22
+-156.2895035122575
+32
+215.26393514799256
+13
+5.319298905273888
+23
+-156.2895035122575
+33
+215.26393514799256
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+1.376247454352451
+20
+-151.36867508708613
+30
+217.63049615692196
+11
+0.789094510885251
+21
+-153.27281512499368
+31
+217.7932561697477
+12
+1.2277859847089314
+22
+-152.31268316148
+32
+220.03234718732236
+13
+1.2277859847089314
+23
+-152.31268316148
+33
+220.03234718732236
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+7.592463047028769
+20
+-157.76438303035684
+30
+220.6660464522131
+11
+5.563286812351974
+21
+-157.9934639456053
+31
+218.18296752756092
+12
+7.4631677097367595
+22
+-157.11760211957326
+32
+218.59975485012592
+13
+7.4631677097367595
+23
+-157.11760211957326
+33
+218.59975485012592
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+7.4631677097367595
+20
+-157.11760211957326
+30
+218.59975485012592
+11
+5.563286812351974
+21
+-157.9934639456053
+31
+218.18296752756092
+12
+5.319298905273888
+22
+-156.2895035122575
+32
+215.26393514799256
+13
+5.319298905273888
+23
+-156.2895035122575
+33
+215.26393514799256
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+5.563286812351974
+20
+-157.9934639456053
+30
+218.18296752756092
+11
+2.905278901951492
+21
+-157.4352123128263
+31
+215.77898692689897
+12
+5.319298905273888
+22
+-156.2895035122575
+32
+215.26393514799256
+13
+5.319298905273888
+23
+-156.2895035122575
+33
+215.26393514799256
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+7.592463047028769
+20
+-157.76438303035684
+30
+220.6660464522131
+11
+6.0363556346791745
+21
+-158.64572089420358
+31
+220.1838509001948
+12
+5.563286812351974
+22
+-157.9934639456053
+32
+218.18296752756092
+13
+5.563286812351974
+23
+-157.9934639456053
+33
+218.18296752756092
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+5.563286812351974
+20
+-157.9934639456053
+30
+218.18296752756092
+11
+3.694132571594192
+21
+-158.41511885733874
+31
+218.03602717953248
+12
+2.905278901951492
+22
+-157.4352123128263
+32
+215.77898692689897
+13
+2.905278901951492
+23
+-157.4352123128263
+33
+215.77898692689897
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+6.0363556346791745
+20
+-158.64572089420358
+30
+220.1838509001948
+11
+3.694132571594192
+21
+-158.41511885733874
+31
+218.03602717953248
+12
+5.563286812351974
+22
+-157.9934639456053
+32
+218.18296752756092
+13
+5.563286812351974
+23
+-157.9934639456053
+33
+218.18296752756092
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+6.0363556346791745
+20
+-158.64572089420358
+30
+220.1838509001948
+11
+4.438265265750055
+21
+-158.99192817382308
+31
+220.0429950386272
+12
+3.694132571594192
+22
+-158.41511885733874
+32
+218.03602717953248
+13
+3.694132571594192
+23
+-158.41511885733874
+33
+218.03602717953248
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+3.694132571594192
+20
+-158.41511885733874
+30
+218.03602717953248
+11
+1.3829403894593297
+21
+-156.337875179621
+31
+215.79328547008183
+12
+2.905278901951492
+22
+-157.4352123128263
+32
+215.77898692689897
+13
+2.905278901951492
+23
+-157.4352123128263
+33
+215.77898692689897
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+3.694132571594192
+20
+-158.41511885733874
+30
+218.03602717953248
+11
+1.8182853957295766
+21
+-156.9959123903571
+31
+217.91677124490116
+12
+1.3829403894593297
+22
+-156.337875179621
+32
+215.79328547008183
+13
+1.3829403894593297
+23
+-156.337875179621
+33
+215.79328547008183
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+0.881578705089411
+20
+-155.03974999320923
+30
+215.312915264002
+11
+1.0498147557305397
+21
+-154.96977839891076
+31
+217.64023133525833
+12
+0.6677090059922959
+22
+-153.5128481158715
+32
+215.4531626769241
+13
+0.6677090059922959
+23
+-153.5128481158715
+33
+215.4531626769241
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+4.438265265750055
+20
+-158.99192817382308
+30
+220.0429950386272
+11
+1.8182853957295766
+21
+-156.9959123903571
+31
+217.91677124490116
+12
+3.694132571594192
+22
+-158.41511885733874
+32
+218.03602717953248
+13
+3.694132571594192
+23
+-158.41511885733874
+33
+218.03602717953248
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+0.789094510885251
+20
+-153.27281512499368
+30
+217.7932561697477
+11
+1.3004955979154935
+21
+-154.4714589577717
+31
+219.97758680917477
+12
+1.2277859847089314
+22
+-152.31268316148
+32
+220.03234718732236
+13
+1.2277859847089314
+23
+-152.31268316148
+33
+220.03234718732236
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+4.438265265750055
+20
+-158.99192817382308
+30
+220.0429950386272
+11
+2.5055281414769306
+21
+-157.55659781772042
+31
+220.2425661945418
+12
+1.8182853957295766
+22
+-156.9959123903571
+32
+217.91677124490116
+13
+1.8182853957295766
+23
+-156.9959123903571
+33
+217.91677124490116
+70
+0
+ 0
+LINE
+ 8
+teeth_upper_half
+10
+33.60303421830263
+20
+-108.1819028613013
+30
+234.54597696660318
+11
+32.331072323672394
+21
+-107.96438247032782
+31
+234.96367696213687
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.318918000918313
+20
+-138.17537886981205
+30
+223.65839689363992
+11
+30.696475035978477
+21
+-138.29646015038256
+31
+226.04412403491963
+12
+30.736632646619757
+22
+-139.26815263817235
+32
+226.03165083767468
+13
+30.736632646619757
+23
+-139.26815263817235
+33
+226.03165083767468
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.318918000918313
+20
+-138.17537886981205
+30
+223.65839689363992
+11
+30.736632646619757
+21
+-139.26815263817235
+31
+226.03165083767468
+12
+31.012868331940076
+22
+-139.61040500159174
+32
+223.87682995758226
+13
+31.012868331940076
+23
+-139.61040500159174
+33
+223.87682995758226
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.012868331940076
+20
+-139.61040500159174
+30
+223.87682995758226
+11
+30.21701750286744
+21
+-139.80906348453752
+31
+226.1700729046577
+12
+30.275428572891116
+22
+-140.25809858534407
+32
+224.33772980698768
+13
+30.275428572891116
+23
+-140.25809858534407
+33
+224.33772980698768
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.012868331940076
+20
+-139.61040500159174
+30
+223.87682995758226
+11
+30.736632646619757
+21
+-139.26815263817235
+31
+226.03165083767468
+12
+30.21701750286744
+22
+-139.80906348453752
+32
+226.1700729046577
+13
+30.21701750286744
+23
+-139.80906348453752
+33
+226.1700729046577
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.195751100589682
+20
+-140.25566479075994
+30
+225.03318660945712
+11
+27.177208067051765
+21
+-139.46376887788745
+31
+227.01490384973968
+12
+26.417559932420865
+22
+-139.3253468109037
+32
+225.28538857325756
+13
+26.417559932420865
+23
+-139.3253468109037
+33
+225.28538857325756
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.485068431800716
+20
+-139.89911388415752
+30
+226.71585134019145
+11
+27.177208067051765
+21
+-139.46376887788745
+31
+227.01490384973968
+12
+28.195751100589682
+22
+-140.25566479075994
+32
+225.03318660945712
+13
+28.195751100589682
+23
+-140.25566479075994
+33
+225.03318660945712
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.84101088975752
+20
+-135.47660490012444
+30
+224.51904750352082
+11
+27.388339747241524
+21
+-135.03182893984015
+31
+225.12384545772443
+12
+28.736357722631762
+22
+-136.26758814002915
+32
+226.74292730494298
+13
+28.736357722631762
+23
+-136.26758814002915
+33
+226.74292730494298
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.736357722631762
+20
+-136.26758814002915
+30
+226.74292730494298
+11
+27.388339747241524
+21
+-135.03182893984015
+31
+225.12384545772443
+12
+27.630502308381363
+22
+-136.05767335713148
+32
+227.07635716299487
+13
+27.630502308381363
+23
+-136.05767335713148
+33
+227.07635716299487
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.5285432096604
+20
+-136.66460088159562
+30
+224.25741458570604
+11
+28.84101088975752
+21
+-135.47660490012444
+31
+224.51904750352082
+12
+29.3755330253388
+22
+-136.76682025413754
+32
+226.41649460632058
+13
+29.3755330253388
+23
+-136.76682025413754
+33
+226.41649460632058
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.3755330253388
+20
+-136.76682025413754
+30
+226.41649460632058
+11
+28.84101088975752
+21
+-135.47660490012444
+31
+224.51904750352082
+12
+28.736357722631762
+22
+-136.26758814002915
+32
+226.74292730494298
+13
+28.736357722631762
+23
+-136.26758814002915
+33
+226.74292730494298
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.318918000918313
+20
+-138.17537886981205
+30
+223.65839689363992
+11
+30.5285432096604
+21
+-136.66460088159562
+31
+224.25741458570604
+12
+30.696475035978477
+22
+-138.29646015038256
+32
+226.04412403491963
+13
+30.696475035978477
+23
+-138.29646015038256
+33
+226.04412403491963
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.5285432096604
+20
+-136.66460088159562
+30
+224.25741458570604
+11
+30.251699075693995
+21
+-137.4771840484359
+31
+226.17433204518056
+12
+30.696475035978477
+22
+-138.29646015038256
+32
+226.04412403491963
+13
+30.696475035978477
+23
+-138.29646015038256
+33
+226.04412403491963
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.871462622396546
+20
+-136.350337155896
+30
+227.22238483805398
+11
+26.556286223727135
+21
+-136.75556395418533
+31
+227.22116794076152
+12
+30.251699075693995
+22
+-137.4771840484359
+32
+226.17433204518056
+13
+30.251699075693995
+23
+-137.4771840484359
+33
+226.17433204518056
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.5285432096604
+20
+-136.66460088159562
+30
+224.25741458570604
+11
+29.3755330253388
+21
+-136.76682025413754
+31
+226.41649460632058
+12
+30.251699075693995
+22
+-137.4771840484359
+32
+226.17433204518056
+13
+30.251699075693995
+23
+-137.4771840484359
+33
+226.17433204518056
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.630502308381363
+20
+-136.05767335713148
+30
+227.07635716299487
+11
+27.388339747241524
+21
+-135.03182893984015
+31
+225.12384545772443
+12
+26.75251091208793
+22
+-135.46899929204866
+32
+225.30303358399487
+13
+26.75251091208793
+23
+-135.46899929204866
+33
+225.30303358399487
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.630502308381363
+20
+-136.05767335713148
+30
+227.07635716299487
+11
+26.75251091208793
+21
+-135.46899929204866
+31
+225.30303358399487
+12
+27.56053071408214
+22
+-136.03120584102697
+32
+227.1146894276979
+13
+27.56053071408214
+23
+-136.03120584102697
+33
+227.1146894276979
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.56053071408214
+20
+-136.03120584102697
+30
+227.1146894276979
+11
+26.190304363110005
+21
+-136.05797758145408
+31
+225.50503853449328
+12
+26.871462622396546
+22
+-136.350337155896
+32
+227.22238483805398
+13
+26.871462622396546
+23
+-136.350337155896
+33
+227.22238483805398
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.56053071408214
+20
+-136.03120584102697
+30
+227.1146894276979
+11
+26.75251091208793
+21
+-135.46899929204866
+31
+225.30303358399487
+12
+26.190304363110005
+22
+-136.05797758145408
+32
+225.50503853449328
+13
+26.190304363110005
+23
+-136.05797758145408
+33
+225.50503853449328
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.190304363110005
+20
+-136.05797758145408
+30
+225.50503853449328
+11
+26.002902180117367
+21
+-136.49088879314007
+31
+225.5491510613339
+12
+26.871462622396546
+22
+-136.350337155896
+32
+227.22238483805398
+13
+26.871462622396546
+23
+-136.350337155896
+33
+227.22238483805398
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.002902180117367
+20
+-136.49088879314007
+30
+225.5491510613339
+11
+26.556286223727135
+21
+-136.75556395418533
+31
+227.22116794076152
+12
+26.871462622396546
+22
+-136.350337155896
+32
+227.22238483805398
+13
+26.871462622396546
+23
+-136.350337155896
+33
+227.22238483805398
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.555388200925517
+20
+-137.10663882297317
+30
+225.47917946703458
+11
+26.399306473038482
+21
+-137.25570874126302
+31
+227.20747784622455
+12
+26.556286223727135
+22
+-136.75556395418533
+32
+227.22116794076152
+13
+26.556286223727135
+23
+-136.75556395418533
+33
+227.22116794076152
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.555388200925517
+20
+-137.10663882297317
+30
+225.47917946703458
+11
+26.556286223727135
+21
+-136.75556395418533
+31
+227.22116794076152
+12
+26.002902180117367
+22
+-136.49088879314007
+32
+225.5491510613339
+13
+26.002902180117367
+23
+-136.49088879314007
+33
+225.5491510613339
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.274226325766474
+20
+-140.3457151903798
+30
+224.62370067064526
+11
+28.485068431800716
+21
+-139.89911388415752
+31
+226.71585134019145
+12
+28.195751100589682
+22
+-140.25566479075994
+32
+225.03318660945712
+13
+28.195751100589682
+23
+-140.25566479075994
+33
+225.03318660945712
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.40382588738152
+20
+-140.38252633346792
+30
+226.24095717192594
+11
+28.485068431800716
+21
+-139.89911388415752
+31
+226.71585134019145
+12
+29.274226325766474
+22
+-140.3457151903798
+32
+224.62370067064526
+13
+29.274226325766474
+23
+-140.3457151903798
+33
+224.62370067064526
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.275428572891116
+20
+-140.25809858534407
+30
+224.33772980698768
+11
+30.21701750286744
+21
+-139.80906348453752
+31
+226.1700729046577
+12
+29.40382588738152
+22
+-140.38252633346792
+32
+226.24095717192594
+13
+29.40382588738152
+23
+-140.38252633346792
+33
+226.24095717192594
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.275428572891116
+20
+-140.25809858534407
+30
+224.33772980698768
+11
+29.40382588738152
+21
+-140.38252633346792
+31
+226.24095717192594
+12
+29.274226325766474
+22
+-140.3457151903798
+32
+224.62370067064526
+13
+29.274226325766474
+23
+-140.3457151903798
+33
+224.62370067064526
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.966395261352567
+20
+-139.84891687085454
+30
+220.95749335369013
+11
+24.635413848052586
+21
+-138.97122969888406
+31
+221.1753179689872
+12
+24.026356753326496
+22
+-138.95297623950123
+32
+219.33901995511783
+13
+24.026356753326496
+23
+-138.95297623950123
+33
+219.33901995511783
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.635413848052586
+20
+-138.97122969888406
+30
+221.1753179689872
+11
+25.18727677004713
+21
+-138.88209197223378
+31
+222.9294754156359
+12
+23.631169357697534
+22
+-137.58670480472904
+32
+221.42052277335787
+13
+23.631169357697534
+23
+-137.58670480472904
+33
+221.42052277335787
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.631169357697534
+20
+-137.58670480472904
+30
+221.42052277335787
+11
+25.18727677004713
+21
+-138.88209197223378
+31
+222.9294754156359
+12
+24.451053908290334
+22
+-137.81974063617818
+32
+223.11505225269048
+13
+24.451053908290334
+23
+-137.81974063617818
+33
+223.11505225269048
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.098124393228883
+20
+-139.620444404252
+30
+222.66966784375956
+11
+24.635413848052586
+21
+-138.97122969888406
+31
+221.1753179689872
+12
+25.966395261352567
+22
+-139.84891687085454
+32
+220.95749335369013
+13
+25.966395261352567
+23
+-139.84891687085454
+33
+220.95749335369013
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.098124393228883
+20
+-139.620444404252
+30
+222.66966784375956
+11
+25.18727677004713
+21
+-138.88209197223378
+31
+222.9294754156359
+12
+24.635413848052586
+22
+-138.97122969888406
+32
+221.1753179689872
+13
+24.635413848052586
+23
+-138.97122969888406
+33
+221.1753179689872
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.18727677004713
+20
+-138.88209197223378
+30
+222.9294754156359
+11
+25.421833723110968
+21
+-138.61285344634385
+31
+224.4177408039477
+12
+24.451053908290334
+22
+-137.81974063617818
+32
+223.11505225269048
+13
+24.451053908290334
+23
+-137.81974063617818
+33
+223.11505225269048
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.451053908290334
+20
+-137.81974063617818
+30
+223.11505225269048
+11
+25.421833723110968
+21
+-138.61285344634385
+31
+224.4177408039477
+12
+25.00169993299271
+22
+-137.53011908064448
+32
+224.58628107891207
+13
+25.00169993299271
+23
+-137.53011908064448
+33
+224.58628107891207
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.199126868478164
+20
+-139.4001859943714
+30
+224.28479477477896
+11
+25.18727677004713
+21
+-138.88209197223378
+31
+222.9294754156359
+12
+26.098124393228883
+22
+-139.620444404252
+32
+222.66966784375956
+13
+26.098124393228883
+23
+-139.620444404252
+33
+222.66966784375956
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.199126868478164
+20
+-139.4001859943714
+30
+224.28479477477896
+11
+25.421833723110968
+21
+-138.61285344634385
+31
+224.4177408039477
+12
+25.18727677004713
+22
+-138.88209197223378
+32
+222.9294754156359
+13
+25.18727677004713
+23
+-138.88209197223378
+33
+222.9294754156359
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.421833723110968
+20
+-138.61285344634385
+30
+224.4177408039477
+11
+25.797246537742332
+21
+-138.59368731399252
+31
+225.40312338627422
+12
+25.00169993299271
+22
+-137.53011908064448
+32
+224.58628107891207
+13
+25.00169993299271
+23
+-137.53011908064448
+33
+224.58628107891207
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.00169993299271
+20
+-137.53011908064448
+30
+224.58628107891207
+11
+25.797246537742332
+21
+-138.59368731399252
+31
+225.40312338627422
+12
+25.411490096127608
+22
+-137.6536341557989
+32
+225.21328740869717
+13
+25.411490096127608
+23
+-137.6536341557989
+33
+225.21328740869717
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.417559932420865
+20
+-139.3253468109037
+30
+225.28538857325756
+11
+25.421833723110968
+21
+-138.61285344634385
+31
+224.4177408039477
+12
+26.199126868478164
+22
+-139.4001859943714
+32
+224.28479477477896
+13
+26.199126868478164
+23
+-139.4001859943714
+33
+224.28479477477896
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.421833723110968
+20
+-138.61285344634385
+30
+224.4177408039477
+11
+26.417559932420865
+21
+-139.3253468109037
+31
+225.28538857325756
+12
+25.797246537742332
+22
+-138.59368731399252
+32
+225.40312338627422
+13
+25.797246537742332
+23
+-138.59368731399252
+33
+225.40312338627422
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.580393196084913
+20
+-136.3174809290049
+30
+216.40690592965893
+11
+22.00752414563304
+21
+-136.47385223104794
+31
+218.33933882960903
+12
+21.517114536892574
+22
+-134.42094649917388
+32
+217.2009314127939
+13
+21.517114536892574
+23
+-134.42094649917388
+33
+217.2009314127939
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.517114536892574
+20
+-134.42094649917388
+30
+217.2009314127939
+11
+22.00752414563304
+21
+-136.47385223104794
+31
+218.33933882960903
+12
+21.990487583542812
+22
+-135.18515799865062
+32
+218.84283008424035
+13
+21.990487583542812
+23
+-135.18515799865062
+33
+218.84283008424035
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.00752414563304
+20
+-136.47385223104794
+30
+218.33933882960903
+11
+22.84292413670089
+21
+-136.96395761546586
+31
+219.96085447141206
+12
+21.990487583542812
+22
+-135.18515799865062
+32
+218.84283008424035
+13
+21.990487583542812
+23
+-135.18515799865062
+33
+218.84283008424035
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.990487583542812
+20
+-135.18515799865062
+30
+218.84283008424035
+11
+22.84292413670089
+21
+-136.96395761546586
+31
+219.96085447141206
+12
+22.81919463950377
+22
+-136.12490693252164
+32
+220.54526939597213
+13
+22.81919463950377
+23
+-136.12490693252164
+33
+220.54526939597213
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.84292413670089
+20
+-136.96395761546586
+30
+219.96085447141206
+11
+23.631169357697534
+21
+-137.58670480472904
+31
+221.42052277335787
+12
+22.81919463950377
+22
+-136.12490693252164
+32
+220.54526939597213
+13
+22.81919463950377
+23
+-136.12490693252164
+33
+220.54526939597213
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.81919463950377
+20
+-136.12490693252164
+30
+220.54526939597213
+11
+23.631169357697534
+21
+-137.58670480472904
+31
+221.42052277335787
+12
+23.681366370999132
+22
+-136.5267872632579
+32
+222.1311907919796
+13
+23.681366370999132
+23
+-136.5267872632579
+33
+222.1311907919796
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.631169357697534
+20
+-137.58670480472904
+30
+221.42052277335787
+11
+24.451053908290334
+21
+-137.81974063617818
+31
+223.11505225269048
+12
+23.681366370999132
+22
+-136.5267872632579
+32
+222.1311907919796
+13
+23.681366370999132
+23
+-136.5267872632579
+33
+222.1311907919796
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.681366370999132
+20
+-136.5267872632579
+30
+222.1311907919796
+11
+24.451053908290334
+21
+-137.81974063617818
+31
+223.11505225269048
+12
+24.777182382589196
+22
+-136.6922852949919
+32
+223.15368874171696
+13
+24.777182382589196
+23
+-136.6922852949919
+33
+223.15368874171696
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.451053908290334
+20
+-137.81974063617818
+30
+223.11505225269048
+11
+25.00169993299271
+21
+-137.53011908064448
+31
+224.58628107891207
+12
+24.777182382589196
+22
+-136.6922852949919
+32
+223.15368874171696
+13
+24.777182382589196
+23
+-136.6922852949919
+33
+223.15368874171696
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.777182382589196
+20
+-136.6922852949919
+30
+223.15368874171696
+11
+25.00169993299271
+21
+-137.53011908064448
+31
+224.58628107891207
+12
+25.32874108026073
+22
+-136.7281837651111
+32
+224.54551501962496
+13
+25.32874108026073
+23
+-136.7281837651111
+33
+224.54551501962496
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.32874108026073
+20
+-136.7281837651111
+30
+224.54551501962496
+11
+25.00169993299271
+21
+-137.53011908064448
+31
+224.58628107891207
+12
+25.411490096127608
+22
+-137.6536341557989
+32
+225.21328740869717
+13
+25.411490096127608
+23
+-137.6536341557989
+33
+225.21328740869717
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.32874108026073
+20
+-136.7281837651111
+30
+224.54551501962496
+11
+25.411490096127608
+21
+-137.6536341557989
+31
+225.21328740869717
+12
+25.555388200925517
+22
+-137.10663882297317
+32
+225.47917946703458
+13
+25.555388200925517
+23
+-137.10663882297317
+33
+225.47917946703458
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.13184934258376
+20
+-135.74797299627343
+30
+214.00444645061194
+11
+30.34874663474376
+21
+-135.90647386857762
+31
+215.5444299738407
+12
+30.255653991893528
+22
+-138.82428935085423
+32
+215.45590069583506
+13
+30.255653991893528
+23
+-138.82428935085423
+33
+215.45590069583506
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.31651350666904
+20
+-138.22375053717286
+30
+213.8867116375951
+11
+29.13184934258376
+21
+-135.74797299627343
+31
+214.00444645061194
+12
+30.255653991893528
+22
+-138.82428935085423
+32
+215.45590069583506
+13
+30.255653991893528
+23
+-138.82428935085423
+33
+215.45590069583506
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.612538423154483
+20
+-139.00864929061603
+30
+213.76836837593206
+11
+29.31651350666904
+21
+-138.22375053717286
+31
+213.8867116375951
+12
+30.255653991893528
+22
+-138.82428935085423
+32
+215.45590069583506
+13
+30.255653991893528
+23
+-138.82428935085423
+33
+215.45590069583506
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.612538423154483
+20
+-139.00864929061603
+30
+213.76836837593206
+11
+30.255653991893528
+21
+-138.82428935085423
+31
+215.45590069583506
+12
+29.671543291656718
+22
+-139.80024097916657
+32
+215.32782225583517
+13
+29.671543291656718
+23
+-139.80024097916657
+33
+215.32782225583517
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.38560172833417
+20
+-141.0308283658635
+30
+215.83861489421903
+11
+24.269431987435457
+21
+-139.9995079107578
+31
+214.91864054134638
+12
+25.822801380877685
+22
+-140.51851460586374
+32
+214.1246150582118
+13
+25.822801380877685
+23
+-140.51851460586374
+33
+214.1246150582118
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.38560172833417
+20
+-141.0308283658635
+30
+215.83861489421903
+11
+25.217699202351127
+21
+-140.3408476012091
+31
+216.6870965311776
+12
+24.269431987435457
+22
+-139.9995079107578
+32
+214.91864054134638
+13
+24.269431987435457
+23
+-139.9995079107578
+33
+214.91864054134638
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.666994576978656
+20
+-133.39601475485128
+30
+214.25877798467437
+11
+27.18907281565032
+21
+-131.83169328577975
+31
+214.74249465830835
+12
+27.879053580305037
+22
+-132.60624841224043
+32
+217.7217634538388
+13
+27.879053580305037
+23
+-132.60624841224043
+33
+217.7217634538388
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.578450648806495
+20
+-133.1766690179401
+30
+216.27000498429152
+11
+28.666994576978656
+21
+-133.39601475485128
+31
+214.25877798467437
+12
+27.879053580305037
+22
+-132.60624841224043
+32
+217.7217634538388
+13
+27.879053580305037
+23
+-132.60624841224043
+33
+217.7217634538388
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.666994576978656
+20
+-133.39601475485128
+30
+214.25877798467437
+11
+29.578450648806495
+21
+-133.1766690179401
+31
+216.27000498429152
+12
+29.22768000434136
+22
+-134.4994363745173
+32
+214.312017241206
+13
+29.22768000434136
+23
+-134.4994363745173
+33
+214.312017241206
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.22768000434136
+20
+-134.4994363745173
+30
+214.312017241206
+11
+29.578450648806495
+21
+-133.1766690179401
+31
+216.27000498429152
+12
+30.422673145242477
+22
+-134.23445698915012
+32
+216.83860024405328
+13
+30.422673145242477
+23
+-134.23445698915012
+33
+216.83860024405328
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.13184934258376
+20
+-135.74797299627343
+30
+214.00444645061194
+11
+29.22768000434136
+21
+-134.4994363745173
+31
+214.312017241206
+12
+30.422673145242477
+22
+-134.23445698915012
+32
+216.83860024405328
+13
+30.422673145242477
+23
+-134.23445698915012
+33
+216.83860024405328
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.13184934258376
+20
+-135.74797299627343
+30
+214.00444645061194
+11
+30.422673145242477
+21
+-134.23445698915012
+31
+216.83860024405328
+12
+30.34874663474376
+22
+-135.90647386857762
+32
+215.5444299738407
+13
+30.34874663474376
+23
+-135.90647386857762
+33
+215.5444299738407
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.34874663474376
+20
+-135.90647386857762
+30
+215.5444299738407
+11
+31.083448374885354
+21
+-136.82188485660564
+31
+217.47169106029884
+12
+30.926164399873674
+22
+-139.05093647151955
+32
+217.23743833155748
+13
+30.926164399873674
+23
+-139.05093647151955
+33
+217.23743833155748
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.255653991893528
+20
+-138.82428935085423
+30
+215.45590069583506
+11
+30.34874663474376
+21
+-135.90647386857762
+31
+215.5444299738407
+12
+30.926164399873674
+22
+-139.05093647151955
+32
+217.23743833155748
+13
+30.926164399873674
+23
+-139.05093647151955
+33
+217.23743833155748
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.671543291656718
+20
+-139.80024097916657
+30
+215.32782225583517
+11
+30.255653991893528
+21
+-138.82428935085423
+31
+215.45590069583506
+12
+30.926164399873674
+22
+-139.05093647151955
+32
+217.23743833155748
+13
+30.926164399873674
+23
+-139.05093647151955
+33
+217.23743833155748
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.671543291656718
+20
+-139.80024097916657
+30
+215.32782225583517
+11
+30.926164399873674
+21
+-139.05093647151955
+31
+217.23743833155748
+12
+30.420239350658157
+22
+-140.10507375085308
+32
+217.18419907502513
+13
+30.420239350658157
+23
+-140.10507375085308
+33
+217.18419907502513
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.69651898648105
+20
+-140.89544854211132
+30
+218.3755415240497
+11
+25.217699202351127
+21
+-140.3408476012091
+31
+216.6870965311776
+12
+27.38560172833417
+22
+-141.0308283658635
+32
+215.83861489421903
+13
+27.38560172833417
+23
+-141.0308283658635
+33
+215.83861489421903
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.69651898648105
+20
+-140.89544854211132
+30
+218.3755415240497
+11
+25.508233430854304
+21
+-140.10598642382269
+31
+219.05882935359767
+12
+25.217699202351127
+22
+-140.3408476012091
+32
+216.6870965311776
+13
+25.217699202351127
+23
+-140.3408476012091
+33
+216.6870965311776
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.578450648806495
+20
+-133.1766690179401
+30
+216.27000498429152
+11
+27.879053580305037
+21
+-132.60624841224043
+31
+217.7217634538388
+12
+27.77561731047144
+22
+-133.35646559285735
+32
+219.35331849830183
+13
+27.77561731047144
+23
+-133.35646559285735
+33
+219.35331849830183
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.578450648806495
+20
+-133.1766690179401
+30
+216.27000498429152
+11
+27.77561731047144
+21
+-133.35646559285735
+31
+219.35331849830183
+12
+29.420254000825675
+22
+-133.99411977394897
+32
+218.60097174742404
+13
+29.420254000825675
+23
+-133.99411977394897
+33
+218.60097174742404
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.422673145242477
+20
+-134.23445698915012
+30
+216.83860024405328
+11
+29.578450648806495
+21
+-133.1766690179401
+31
+216.27000498429152
+12
+29.420254000825675
+22
+-133.99411977394897
+32
+218.60097174742404
+13
+29.420254000825675
+23
+-133.99411977394897
+33
+218.60097174742404
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.422673145242477
+20
+-134.23445698915012
+30
+216.83860024405328
+11
+29.420254000825675
+21
+-133.99411977394897
+31
+218.60097174742404
+12
+30.761274816785996
+22
+-135.06285982078828
+32
+217.71385362143914
+13
+30.761274816785996
+23
+-135.06285982078828
+33
+217.71385362143914
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.13129949460777
+20
+-134.10637854915157
+30
+221.94135481440327
+11
+24.461093310950655
+21
+-135.33635748720235
+31
+222.1260189784882
+12
+25.02755900045112
+22
+-135.84136986344905
+32
+223.25895035748908
+13
+25.02755900045112
+23
+-135.84136986344905
+33
+223.25895035748908
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.13129949460777
+20
+-134.10637854915157
+30
+221.94135481440327
+11
+25.02755900045112
+21
+-135.84136986344905
+31
+223.25895035748908
+12
+25.535005171281853
+22
+-134.97250519684684
+32
+223.21362093335614
+13
+25.535005171281853
+23
+-134.97250519684684
+33
+223.21362093335614
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.461093310950655
+20
+-135.33635748720235
+30
+222.1260189784882
+11
+23.681366370999132
+21
+-136.5267872632579
+31
+222.1311907919796
+12
+24.777182382589196
+22
+-136.6922852949919
+32
+223.15368874171696
+13
+24.777182382589196
+23
+-136.6922852949919
+33
+223.15368874171696
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.461093310950655
+20
+-135.33635748720235
+30
+222.1260189784882
+11
+24.777182382589196
+21
+-136.6922852949919
+31
+223.15368874171696
+12
+25.02755900045112
+22
+-135.84136986344905
+32
+223.25895035748908
+13
+25.02755900045112
+23
+-135.84136986344905
+33
+223.25895035748908
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.535005171281853
+20
+-134.97250519684684
+30
+223.21362093335614
+11
+25.02755900045112
+21
+-135.84136986344905
+31
+223.25895035748908
+12
+25.66886387341944
+22
+-136.0780563867746
+32
+224.5947993599576
+13
+25.66886387341944
+23
+-136.0780563867746
+33
+224.5947993599576
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.535005171281853
+20
+-134.97250519684684
+30
+223.21362093335614
+11
+25.66886387341944
+21
+-136.0780563867746
+31
+224.5947993599576
+12
+26.102687758074495
+22
+-135.3686052654452
+32
+224.5342587196727
+13
+26.102687758074495
+23
+-135.3686052654452
+33
+224.5342587196727
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.777182382589196
+20
+-136.6922852949919
+30
+223.15368874171696
+11
+25.32874108026073
+21
+-136.7281837651111
+31
+224.54551501962496
+12
+25.02755900045112
+22
+-135.84136986344905
+32
+223.25895035748908
+13
+25.02755900045112
+23
+-135.84136986344905
+33
+223.25895035748908
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.02755900045112
+20
+-135.84136986344905
+30
+223.25895035748908
+11
+25.32874108026073
+21
+-136.7281837651111
+31
+224.54551501962496
+12
+25.66886387341944
+22
+-136.0780563867746
+32
+224.5947993599576
+13
+25.66886387341944
+23
+-136.0780563867746
+33
+224.5947993599576
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.102687758074495
+20
+-135.3686052654452
+30
+224.5342587196727
+11
+25.66886387341944
+21
+-136.0780563867746
+31
+224.5947993599576
+12
+26.002902180117367
+22
+-136.49088879314007
+32
+225.5491510613339
+13
+26.002902180117367
+23
+-136.49088879314007
+33
+225.5491510613339
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.102687758074495
+20
+-135.3686052654452
+30
+224.5342587196727
+11
+26.002902180117367
+21
+-136.49088879314007
+31
+225.5491510613339
+12
+26.190304363110005
+22
+-136.05797758145408
+32
+225.50503853449328
+13
+26.190304363110005
+23
+-136.05797758145408
+33
+225.50503853449328
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.32874108026073
+20
+-136.7281837651111
+30
+224.54551501962496
+11
+25.555388200925517
+21
+-137.10663882297317
+31
+225.47917946703458
+12
+25.66886387341944
+22
+-136.0780563867746
+32
+224.5947993599576
+13
+25.66886387341944
+23
+-136.0780563867746
+33
+224.5947993599576
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.66886387341944
+20
+-136.0780563867746
+30
+224.5947993599576
+11
+25.555388200925517
+21
+-137.10663882297317
+31
+225.47917946703458
+12
+26.002902180117367
+22
+-136.49088879314007
+32
+225.5491510613339
+13
+26.002902180117367
+23
+-136.49088879314007
+33
+225.5491510613339
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.778644903534325
+20
+-140.83004031265696
+30
+215.4668527714642
+11
+25.822801380877685
+21
+-140.51851460586374
+31
+214.1246150582118
+12
+27.04365358923721
+22
+-140.51638503560227
+32
+213.7753655353618
+13
+27.04365358923721
+23
+-140.51638503560227
+33
+213.7753655353618
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.778644903534325
+20
+-140.83004031265696
+30
+215.4668527714642
+11
+27.38560172833417
+21
+-141.0308283658635
+31
+215.83861489421903
+12
+25.822801380877685
+22
+-140.51851460586374
+32
+214.1246150582118
+13
+25.822801380877685
+23
+-140.51851460586374
+33
+214.1246150582118
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.612538423154483
+20
+-139.00864929061603
+30
+213.76836837593206
+11
+29.671543291656718
+21
+-139.80024097916657
+31
+215.32782225583517
+12
+27.04365358923721
+22
+-140.51638503560227
+32
+213.7753655353618
+13
+27.04365358923721
+23
+-140.51638503560227
+33
+213.7753655353618
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.671543291656718
+20
+-139.80024097916657
+30
+215.32782225583517
+11
+28.778644903534325
+21
+-140.83004031265696
+31
+215.4668527714642
+12
+27.04365358923721
+22
+-140.51638503560227
+32
+213.7753655353618
+13
+27.04365358923721
+23
+-140.51638503560227
+33
+213.7753655353618
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.631081456692396
+20
+-141.0183551686193
+30
+217.5002881466635
+11
+27.38560172833417
+21
+-141.0308283658635
+31
+215.83861489421903
+12
+28.778644903534325
+22
+-140.83004031265696
+32
+215.4668527714642
+13
+28.778644903534325
+23
+-140.83004031265696
+33
+215.4668527714642
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.631081456692396
+20
+-141.0183551686193
+30
+217.5002881466635
+11
+27.69651898648105
+21
+-140.89544854211132
+31
+218.3755415240497
+12
+27.38560172833417
+22
+-141.0308283658635
+32
+215.83861489421903
+13
+27.38560172833417
+23
+-141.0308283658635
+33
+215.83861489421903
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.671543291656718
+20
+-139.80024097916657
+30
+215.32782225583517
+11
+30.420239350658157
+21
+-140.10507375085308
+31
+217.18419907502513
+12
+28.778644903534325
+22
+-140.83004031265696
+32
+215.4668527714642
+13
+28.778644903534325
+23
+-140.83004031265696
+33
+215.4668527714642
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.420239350658157
+20
+-140.10507375085308
+30
+217.18419907502513
+11
+29.631081456692396
+21
+-141.0183551686193
+31
+217.5002881466635
+12
+28.778644903534325
+22
+-140.83004031265696
+32
+215.4668527714642
+13
+28.778644903534325
+23
+-140.83004031265696
+33
+215.4668527714642
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.631081456692396
+20
+-141.0183551686193
+30
+217.5002881466635
+11
+29.3487612849113
+21
+-140.7013534240122
+31
+219.88206037174365
+12
+27.69651898648105
+22
+-140.89544854211132
+32
+218.3755415240497
+13
+27.69651898648105
+23
+-140.89544854211132
+33
+218.3755415240497
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.411490096127608
+20
+-137.6536341557989
+30
+225.21328740869717
+11
+25.797246537742332
+21
+-138.59368731399252
+31
+225.40312338627422
+12
+26.39535155683896
+22
+-137.9034023250152
+32
+227.24763545686588
+13
+26.39535155683896
+23
+-137.9034023250152
+33
+227.24763545686588
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.797246537742332
+20
+-138.59368731399252
+30
+225.40312338627422
+11
+26.560241139926646
+21
+-138.77865570240132
+31
+227.23455381097497
+12
+26.39535155683896
+22
+-137.9034023250152
+32
+227.24763545686588
+13
+26.39535155683896
+23
+-137.9034023250152
+33
+227.24763545686588
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.177208067051765
+20
+-139.46376887788745
+30
+227.01490384973968
+11
+26.560241139926646
+21
+-138.77865570240132
+31
+227.23455381097497
+12
+26.417559932420865
+22
+-139.3253468109037
+32
+225.28538857325756
+13
+26.417559932420865
+23
+-139.3253468109037
+33
+225.28538857325756
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.417559932420865
+20
+-139.3253468109037
+30
+225.28538857325756
+11
+26.560241139926646
+21
+-138.77865570240132
+31
+227.23455381097497
+12
+25.797246537742332
+22
+-138.59368731399252
+32
+225.40312338627422
+13
+25.797246537742332
+23
+-138.59368731399252
+33
+225.40312338627422
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.411490096127608
+20
+-137.6536341557989
+30
+225.21328740869717
+11
+26.39535155683896
+21
+-137.9034023250152
+31
+227.24763545686588
+12
+26.399306473038482
+22
+-137.25570874126302
+32
+227.20747784622455
+13
+26.399306473038482
+23
+-137.25570874126302
+33
+227.20747784622455
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.411490096127608
+20
+-137.6536341557989
+30
+225.21328740869717
+11
+26.399306473038482
+21
+-137.25570874126302
+31
+227.20747784622455
+12
+25.555388200925517
+22
+-137.10663882297317
+32
+225.47917946703458
+13
+25.555388200925517
+23
+-137.10663882297317
+33
+225.47917946703458
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.684698188385045
+20
+-132.28742132169364
+30
+215.00625714638352
+11
+26.32051237337113
+21
+-133.23416741499415
+31
+214.39963384624184
+12
+25.852615364535605
+22
+-134.30138634021836
+32
+214.35034950590907
+13
+25.852615364535605
+23
+-134.30138634021836
+33
+214.35034950590907
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.41244671959929
+20
+-134.45806186658413
+30
+215.14011584852088
+11
+24.087201617934504
+21
+-134.85963797299678
+31
+214.769266398735
+12
+23.774154789526328
+22
+-135.29376608197487
+32
+214.7732213149345
+13
+23.774154789526328
+23
+-135.29376608197487
+33
+214.7732213149345
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.41275094392233
+20
+-133.77355713974413
+30
+215.1425496431054
+11
+24.087201617934504
+21
+-134.85963797299678
+31
+214.769266398735
+12
+22.41244671959929
+22
+-134.45806186658413
+32
+215.14011584852088
+13
+22.41244671959929
+23
+-134.45806186658413
+33
+215.14011584852088
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.399306473038482
+20
+-137.25570874126302
+30
+227.20747784622455
+11
+30.696475035978477
+21
+-138.29646015038256
+31
+226.04412403491963
+12
+30.251699075693995
+22
+-137.4771840484359
+32
+226.17433204518056
+13
+30.251699075693995
+23
+-137.4771840484359
+33
+226.17433204518056
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.41275094392233
+20
+-133.77355713974413
+30
+215.1425496431054
+11
+24.40815827874168
+21
+-134.6269063658712
+31
+214.91042648462565
+12
+24.087201617934504
+22
+-134.85963797299678
+32
+214.769266398735
+13
+24.087201617934504
+23
+-134.85963797299678
+33
+214.769266398735
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.630502308381363
+20
+-136.05767335713148
+30
+227.07635716299487
+11
+26.871462622396546
+21
+-136.350337155896
+31
+227.22238483805398
+12
+29.3755330253388
+22
+-136.76682025413754
+32
+226.41649460632058
+13
+29.3755330253388
+23
+-136.76682025413754
+33
+226.41649460632058
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.871462622396546
+20
+-136.350337155896
+30
+227.22238483805398
+11
+27.630502308381363
+21
+-136.05767335713148
+31
+227.07635716299487
+12
+27.56053071408214
+22
+-136.03120584102697
+32
+227.1146894276979
+13
+27.56053071408214
+23
+-136.03120584102697
+33
+227.1146894276979
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.871462622396546
+20
+-136.350337155896
+30
+227.22238483805398
+11
+30.251699075693995
+21
+-137.4771840484359
+31
+226.17433204518056
+12
+29.3755330253388
+22
+-136.76682025413754
+32
+226.41649460632058
+13
+29.3755330253388
+23
+-136.76682025413754
+33
+226.41649460632058
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.13163301926586
+20
+-133.2822348580346
+30
+215.3144363856231
+11
+24.40815827874168
+21
+-134.6269063658712
+31
+214.91042648462565
+12
+22.41275094392233
+22
+-133.77355713974413
+32
+215.1425496431054
+13
+22.41275094392233
+23
+-133.77355713974413
+33
+215.1425496431054
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.630502308381363
+20
+-136.05767335713148
+30
+227.07635716299487
+11
+29.3755330253388
+21
+-136.76682025413754
+31
+226.41649460632058
+12
+28.736357722631762
+22
+-136.26758814002915
+32
+226.74292730494298
+13
+28.736357722631762
+23
+-136.26758814002915
+33
+226.74292730494298
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.21701750286744
+20
+-139.80906348453752
+30
+226.1700729046577
+11
+28.485068431800716
+21
+-139.89911388415752
+31
+226.71585134019145
+12
+29.40382588738152
+22
+-140.38252633346792
+32
+226.24095717192594
+13
+29.40382588738152
+23
+-140.38252633346792
+33
+226.24095717192594
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.90707151835976
+20
+-136.4321734987902
+30
+213.2959080022516
+11
+26.61439306942774
+21
+-137.14497108767296
+31
+212.7686872504234
+12
+25.6280978141321
+22
+-137.17417662268485
+32
+213.7361205976906
+13
+25.6280978141321
+23
+-137.17417662268485
+33
+213.7361205976906
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.560241139926646
+20
+-138.77865570240132
+30
+227.23455381097497
+11
+27.177208067051765
+21
+-139.46376887788745
+31
+227.01490384973968
+12
+30.736632646619757
+22
+-139.26815263817235
+32
+226.03165083767468
+13
+30.736632646619757
+23
+-139.26815263817235
+33
+226.03165083767468
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.556286223727135
+20
+-136.75556395418533
+30
+227.22116794076152
+11
+26.399306473038482
+21
+-137.25570874126302
+31
+227.20747784622455
+12
+30.251699075693995
+22
+-137.4771840484359
+32
+226.17433204518056
+13
+30.251699075693995
+23
+-137.4771840484359
+33
+226.17433204518056
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.61439306942774
+20
+-137.14497108767296
+30
+212.7686872504234
+11
+26.091735682445044
+21
+-138.5228030467211
+31
+213.30168826438913
+12
+25.6280978141321
+22
+-137.17417662268485
+32
+213.7361205976906
+13
+25.6280978141321
+23
+-137.17417662268485
+33
+213.7361205976906
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.093575678550803
+20
+-136.24081639959832
+30
+214.3844226300891
+11
+24.85354268767224
+21
+-137.1443626390271
+31
+214.40906480025507
+12
+24.224102563302488
+22
+-136.56177306040553
+32
+214.57821352386534
+13
+24.224102563302488
+23
+-136.56177306040553
+33
+214.57821352386534
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.6280978141321
+20
+-137.17417662268485
+30
+213.7361205976906
+11
+26.091735682445044
+21
+-138.5228030467211
+31
+213.30168826438913
+12
+25.29223416149591
+22
+-137.2474946845376
+32
+214.00322955331976
+13
+25.29223416149591
+23
+-137.2474946845376
+33
+214.00322955331976
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.279760964251288
+20
+-136.8739072158444
+30
+213.98923523445998
+11
+24.85354268767224
+21
+-137.1443626390271
+31
+214.40906480025507
+12
+25.093575678550803
+22
+-136.24081639959832
+32
+214.3844226300891
+13
+25.093575678550803
+23
+-136.24081639959832
+33
+214.3844226300891
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.29223416149591
+20
+-137.2474946845376
+30
+214.00322955331976
+11
+26.091735682445044
+21
+-138.5228030467211
+31
+213.30168826438913
+12
+25.39171551513
+22
+-138.4841665576951
+32
+213.85811455122933
+13
+25.39171551513
+23
+-138.4841665576951
+33
+213.85811455122933
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.224102563302488
+20
+-136.56177306040553
+30
+214.57821352386534
+11
+24.85354268767224
+21
+-137.1443626390271
+31
+214.40906480025507
+12
+24.291031914371285
+22
+-138.74397412957143
+32
+214.41301971645413
+13
+24.291031914371285
+23
+-138.74397412957143
+33
+214.41301971645413
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.224102563302488
+20
+-136.56177306040553
+30
+214.57821352386534
+11
+24.291031914371285
+21
+-138.74397412957143
+31
+214.41301971645413
+12
+23.249672056605366
+22
+-137.38196183532145
+32
+214.77535088519522
+13
+23.249672056605366
+23
+-137.38196183532145
+33
+214.77535088519522
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.795146267816094
+20
+-135.7647053340408
+30
+214.727891890801
+11
+24.224102563302488
+21
+-136.56177306040553
+31
+214.57821352386534
+12
+23.249672056605366
+22
+-137.38196183532145
+32
+214.77535088519522
+13
+23.249672056605366
+23
+-137.38196183532145
+33
+214.77535088519522
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.795146267816094
+20
+-135.7647053340408
+30
+214.727891890801
+11
+23.249672056605366
+21
+-137.38196183532145
+31
+214.77535088519522
+12
+22.677426104967118
+22
+-135.81277277708122
+32
+215.05675838400762
+13
+22.677426104967118
+23
+-135.81277277708122
+33
+215.05675838400762
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.774154789526328
+20
+-135.29376608197487
+30
+214.7732213149345
+11
+23.795146267816094
+21
+-135.7647053340408
+31
+214.727891890801
+12
+22.677426104967118
+22
+-135.81277277708122
+32
+215.05675838400762
+13
+22.677426104967118
+23
+-135.81277277708122
+33
+215.05675838400762
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.41244671959929
+20
+-134.45806186658413
+30
+215.14011584852088
+11
+23.774154789526328
+21
+-135.29376608197487
+31
+214.7732213149345
+12
+22.677426104967118
+22
+-135.81277277708122
+32
+215.05675838400762
+13
+22.677426104967118
+23
+-135.81277277708122
+33
+215.05675838400762
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.97185664899976
+20
+-135.17876928786526
+30
+212.98316539816713
+11
+26.872679519688724
+21
+-136.51705208491833
+31
+212.53230495142154
+12
+26.16900866049718
+22
+-135.36343345195073
+32
+213.48726510144436
+13
+26.16900866049718
+23
+-135.36343345195073
+33
+213.48726510144436
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.16900866049718
+20
+-135.36343345195073
+30
+213.48726510144436
+11
+26.872679519688724
+21
+-136.51705208491833
+31
+212.53230495142154
+12
+26.057358333941522
+22
+-136.07957750838676
+32
+213.16661266495998
+13
+26.057358333941522
+23
+-136.07957750838676
+33
+213.16661266495998
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.057358333941522
+20
+-136.07957750838676
+30
+213.16661266495998
+11
+26.872679519688724
+21
+-136.51705208491833
+31
+212.53230495142154
+12
+25.90707151835976
+22
+-136.4321734987902
+32
+213.2959080022516
+13
+25.90707151835976
+23
+-136.4321734987902
+33
+213.2959080022516
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.90707151835976
+20
+-136.4321734987902
+30
+213.2959080022516
+11
+26.872679519688724
+21
+-136.51705208491833
+31
+212.53230495142154
+12
+26.61439306942774
+22
+-137.14497108767296
+32
+212.7686872504234
+13
+26.61439306942774
+23
+-137.14497108767296
+33
+212.7686872504234
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.85354268767224
+20
+-137.1443626390271
+30
+214.40906480025507
+11
+25.29223416149591
+21
+-137.2474946845376
+31
+214.00322955331976
+12
+25.39171551513
+22
+-138.4841665576951
+32
+213.85811455122933
+13
+25.39171551513
+23
+-138.4841665576951
+33
+213.85811455122933
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.85354268767224
+20
+-137.1443626390271
+30
+214.40906480025507
+11
+25.39171551513
+21
+-138.4841665576951
+31
+213.85811455122933
+12
+24.291031914371285
+22
+-138.74397412957143
+32
+214.41301971645413
+13
+24.291031914371285
+23
+-138.74397412957143
+33
+214.41301971645413
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.32051237337113
+20
+-133.23416741499415
+30
+214.39963384624184
+11
+26.19821419550904
+21
+-134.70509201689228
+31
+213.89888061051764
+12
+25.852615364535605
+22
+-134.30138634021836
+32
+214.35034950590907
+13
+25.852615364535605
+23
+-134.30138634021836
+33
+214.35034950590907
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.32051237337113
+20
+-133.23416741499415
+30
+214.39963384624184
+11
+26.975811565199283
+21
+-133.98073390373398
+31
+213.6548927034397
+12
+26.19821419550904
+22
+-134.70509201689228
+32
+213.89888061051764
+13
+26.19821419550904
+23
+-134.70509201689228
+33
+213.89888061051764
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.975811565199283
+20
+-133.98073390373398
+30
+213.6548927034397
+11
+26.26605621954696
+21
+-134.98102347788952
+31
+213.6910953978813
+12
+26.19821419550904
+22
+-134.70509201689228
+32
+213.89888061051764
+13
+26.19821419550904
+23
+-134.70509201689228
+33
+213.89888061051764
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.975811565199283
+20
+-133.98073390373398
+30
+213.6548927034397
+11
+27.095067499830968
+21
+-134.46749282059787
+31
+213.28708549688432
+12
+26.26605621954696
+22
+-134.98102347788952
+32
+213.6910953978813
+13
+26.26605621954696
+23
+-134.98102347788952
+33
+213.6910953978813
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.095067499830968
+20
+-134.46749282059787
+30
+213.28708549688432
+11
+26.16900866049718
+21
+-135.36343345195073
+31
+213.48726510144436
+12
+26.26605621954696
+22
+-134.98102347788952
+32
+213.6910953978813
+13
+26.26605621954696
+23
+-134.98102347788952
+33
+213.6910953978813
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.095067499830968
+20
+-134.46749282059787
+30
+213.28708549688432
+11
+26.97185664899976
+21
+-135.17876928786526
+31
+212.98316539816713
+12
+26.16900866049718
+22
+-135.36343345195073
+32
+213.48726510144436
+13
+26.16900866049718
+23
+-135.36343345195073
+33
+213.48726510144436
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.684698188385045
+20
+-132.28742132169364
+30
+215.00625714638352
+11
+23.13163301926586
+21
+-133.2822348580346
+31
+215.3144363856231
+12
+22.82132420976505
+22
+-132.81220827893785
+32
+215.6865027327011
+13
+22.82132420976505
+23
+-132.81220827893785
+33
+215.6865027327011
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.60225339684121
+20
+-131.7565498779889
+30
+215.17601431864026
+11
+24.684698188385045
+21
+-132.28742132169364
+31
+215.00625714638352
+12
+22.82132420976505
+22
+-132.81220827893785
+32
+215.6865027327011
+13
+22.82132420976505
+23
+-132.81220827893785
+33
+215.6865027327011
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.177208067051765
+20
+-139.46376887788745
+30
+227.01490384973968
+11
+28.485068431800716
+21
+-139.89911388415752
+31
+226.71585134019145
+12
+30.21701750286744
+22
+-139.80906348453752
+32
+226.1700729046577
+13
+30.21701750286744
+23
+-139.80906348453752
+33
+226.1700729046577
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.736632646619757
+20
+-139.26815263817235
+30
+226.03165083767468
+11
+27.177208067051765
+21
+-139.46376887788745
+31
+227.01490384973968
+12
+30.21701750286744
+22
+-139.80906348453752
+32
+226.1700729046577
+13
+30.21701750286744
+23
+-139.80906348453752
+33
+226.1700729046577
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.39535155683896
+20
+-137.9034023250152
+30
+227.24763545686588
+11
+30.736632646619757
+21
+-139.26815263817235
+31
+226.03165083767468
+12
+30.696475035978477
+22
+-138.29646015038256
+32
+226.04412403491963
+13
+30.696475035978477
+23
+-138.29646015038256
+33
+226.04412403491963
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.39535155683896
+20
+-137.9034023250152
+30
+227.24763545686588
+11
+26.560241139926646
+21
+-138.77865570240132
+31
+227.23455381097497
+12
+30.736632646619757
+22
+-139.26815263817235
+32
+226.03165083767468
+13
+30.736632646619757
+23
+-139.26815263817235
+33
+226.03165083767468
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.399306473038482
+20
+-137.25570874126302
+30
+227.20747784622455
+11
+26.39535155683896
+21
+-137.9034023250152
+31
+227.24763545686588
+12
+30.696475035978477
+22
+-138.29646015038256
+32
+226.04412403491963
+13
+30.696475035978477
+23
+-138.29646015038256
+33
+226.04412403491963
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.90707151835976
+20
+-136.4321734987902
+30
+213.2959080022516
+11
+25.279760964251288
+21
+-136.8739072158444
+31
+213.98923523445998
+12
+25.093575678550803
+22
+-136.24081639959832
+32
+214.3844226300891
+13
+25.093575678550803
+23
+-136.24081639959832
+33
+214.3844226300891
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.90707151835976
+20
+-136.4321734987902
+30
+213.2959080022516
+11
+25.6280978141321
+21
+-137.17417662268485
+31
+213.7361205976906
+12
+25.279760964251288
+22
+-136.8739072158444
+32
+213.98923523445998
+13
+25.279760964251288
+23
+-136.8739072158444
+33
+213.98923523445998
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.215873856412887
+20
+-135.51159069727143
+30
+214.46321672975662
+11
+24.224102563302488
+21
+-136.56177306040553
+31
+214.57821352386534
+12
+23.795146267816094
+22
+-135.7647053340408
+32
+214.727891890801
+13
+23.795146267816094
+23
+-135.7647053340408
+33
+214.727891890801
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.215873856412887
+20
+-135.51159069727143
+30
+214.46321672975662
+11
+25.093575678550803
+21
+-136.24081639959832
+31
+214.3844226300891
+12
+24.224102563302488
+22
+-136.56177306040553
+32
+214.57821352386534
+13
+24.224102563302488
+23
+-136.56177306040553
+33
+214.57821352386534
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.16900866049718
+20
+-135.36343345195073
+30
+213.48726510144436
+11
+25.093575678550803
+21
+-136.24081639959832
+31
+214.3844226300891
+12
+25.215873856412887
+22
+-135.51159069727143
+32
+214.46321672975662
+13
+25.215873856412887
+23
+-135.51159069727143
+33
+214.46321672975662
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.78991585365432
+20
+-135.1224877881028
+30
+212.7583436234406
+11
+29.31651350666904
+21
+-138.22375053717286
+31
+213.8867116375951
+12
+28.094140176694317
+22
+-137.33571973821887
+32
+212.92414587949676
+13
+28.094140176694317
+23
+-137.33571973821887
+33
+212.92414587949676
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.094140176694317
+20
+-137.33571973821887
+30
+212.92414587949676
+11
+29.31651350666904
+21
+-138.22375053717286
+31
+213.8867116375951
+12
+27.416632609284232
+22
+-137.9265233735625
+32
+212.67468193460383
+13
+27.416632609284232
+23
+-137.9265233735625
+33
+212.67468193460383
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.416632609284232
+20
+-137.9265233735625
+30
+212.67468193460383
+11
+29.31651350666904
+21
+-138.22375053717286
+31
+213.8867116375951
+12
+28.612538423154483
+22
+-139.00864929061603
+32
+213.76836837593206
+13
+28.612538423154483
+23
+-139.00864929061603
+33
+213.76836837593206
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.822801380877685
+20
+-140.51851460586374
+30
+214.1246150582118
+11
+24.067427036936895
+21
+-139.22890770049713
+31
+214.29802292234493
+12
+25.318093228954332
+22
+-139.41448453755132
+32
+213.42733290980442
+13
+25.318093228954332
+23
+-139.41448453755132
+33
+213.42733290980442
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.822801380877685
+20
+-140.51851460586374
+30
+214.1246150582118
+11
+24.269431987435457
+21
+-139.9995079107578
+31
+214.91864054134638
+12
+24.067427036936895
+22
+-139.22890770049713
+32
+214.29802292234493
+13
+24.067427036936895
+23
+-139.22890770049713
+33
+214.29802292234493
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.18907281565032
+20
+-131.83169328577975
+30
+214.74249465830835
+11
+27.71933581070904
+21
+-133.4109217466801
+31
+213.54598039579162
+12
+26.57088899123306
+22
+-132.1748583221686
+32
+214.12856997441318
+13
+26.57088899123306
+23
+-132.1748583221686
+33
+214.12856997441318
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.666994576978656
+20
+-133.39601475485128
+30
+214.25877798467437
+11
+27.71933581070904
+21
+-133.4109217466801
+31
+213.54598039579162
+12
+27.18907281565032
+22
+-131.83169328577975
+32
+214.74249465830835
+13
+27.18907281565032
+23
+-131.83169328577975
+33
+214.74249465830835
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.666994576978656
+20
+-133.39601475485128
+30
+214.25877798467437
+11
+28.0415093688084
+21
+-134.21407395950558
+31
+213.32237551835695
+12
+27.71933581070904
+22
+-133.4109217466801
+32
+213.54598039579162
+13
+27.71933581070904
+23
+-133.4109217466801
+33
+213.54598039579162
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.666994576978656
+20
+-133.39601475485128
+30
+214.25877798467437
+11
+29.22768000434136
+21
+-134.4994363745173
+31
+214.312017241206
+12
+28.0415093688084
+22
+-134.21407395950558
+32
+213.32237551835695
+13
+28.0415093688084
+23
+-134.21407395950558
+33
+213.32237551835695
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.0415093688084
+20
+-134.21407395950558
+30
+213.32237551835695
+11
+29.22768000434136
+21
+-134.4994363745173
+31
+214.312017241206
+12
+27.78991585365432
+22
+-135.1224877881028
+32
+212.7583436234406
+13
+27.78991585365432
+23
+-135.1224877881028
+33
+212.7583436234406
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.78991585365432
+20
+-135.1224877881028
+30
+212.7583436234406
+11
+29.22768000434136
+21
+-134.4994363745173
+31
+214.312017241206
+12
+29.13184934258376
+22
+-135.74797299627343
+32
+214.00444645061194
+13
+29.13184934258376
+23
+-135.74797299627343
+33
+214.00444645061194
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.18907281565032
+20
+-131.83169328577975
+30
+214.74249465830835
+11
+24.590388648242644
+21
+-131.46662409813186
+31
+215.4175684311342
+12
+25.022691411282484
+22
+-131.56519277879744
+32
+217.6825185161669
+13
+25.022691411282484
+23
+-131.56519277879744
+33
+217.6825185161669
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.879053580305037
+20
+-132.60624841224043
+30
+217.7217634538388
+11
+27.18907281565032
+21
+-131.83169328577975
+31
+214.74249465830835
+12
+25.022691411282484
+22
+-131.56519277879744
+32
+217.6825185161669
+13
+25.022691411282484
+23
+-131.56519277879744
+33
+217.6825185161669
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.590388648242644
+20
+-131.46662409813186
+30
+215.4175684311342
+11
+22.917154871522644
+21
+-132.73523952520907
+31
+216.90157467892294
+12
+23.99958501289896
+22
+-133.08722706696685
+32
+218.47684822362402
+13
+23.99958501289896
+23
+-133.08722706696685
+33
+218.47684822362402
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.590388648242644
+20
+-131.46662409813186
+30
+215.4175684311342
+11
+23.99958501289896
+21
+-133.08722706696685
+31
+218.47684822362402
+12
+25.022691411282484
+22
+-131.56519277879744
+32
+217.6825185161669
+13
+25.022691411282484
+23
+-131.56519277879744
+33
+217.6825185161669
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.879053580305037
+20
+-132.60624841224043
+30
+217.7217634538388
+11
+25.022691411282484
+21
+-131.56519277879744
+31
+217.6825185161669
+12
+25.62779358980904
+22
+-132.53323457471114
+32
+219.4400224303688
+13
+25.62779358980904
+23
+-132.53323457471114
+33
+219.4400224303688
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.879053580305037
+20
+-132.60624841224043
+30
+217.7217634538388
+11
+25.62779358980904
+21
+-132.53323457471114
+31
+219.4400224303688
+12
+27.77561731047144
+22
+-133.35646559285735
+32
+219.35331849830183
+13
+27.77561731047144
+23
+-133.35646559285735
+33
+219.35331849830183
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.022691411282484
+20
+-131.56519277879744
+30
+217.6825185161669
+11
+23.99958501289896
+21
+-133.08722706696685
+31
+218.47684822362402
+12
+24.434930019169208
+22
+-133.4751130788431
+32
+220.07798083578336
+13
+24.434930019169208
+23
+-133.4751130788431
+33
+220.07798083578336
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.62779358980904
+20
+-132.53323457471114
+30
+219.4400224303688
+11
+25.022691411282484
+21
+-131.56519277879744
+31
+217.6825185161669
+12
+24.434930019169208
+22
+-133.4751130788431
+32
+220.07798083578336
+13
+24.434930019169208
+23
+-133.4751130788431
+33
+220.07798083578336
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.77561731047144
+20
+-133.35646559285735
+30
+219.35331849830183
+11
+25.62779358980904
+21
+-132.53323457471114
+31
+219.4400224303688
+12
+26.05766255826456
+22
+-133.4300878790336
+32
+221.27571199559185
+13
+26.05766255826456
+23
+-133.4300878790336
+33
+221.27571199559185
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.77561731047144
+20
+-133.35646559285735
+30
+219.35331849830183
+11
+26.05766255826456
+21
+-133.4300878790336
+31
+221.27571199559185
+12
+27.732721680922797
+22
+-134.01085211171687
+32
+220.95475533478447
+13
+27.732721680922797
+23
+-134.01085211171687
+33
+220.95475533478447
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.75251091208793
+20
+-135.46899929204866
+30
+225.30303358399487
+11
+26.71022373118537
+21
+-135.12492158269018
+31
+224.5409516547798
+12
+26.190304363110005
+22
+-136.05797758145408
+32
+225.50503853449328
+13
+26.190304363110005
+23
+-136.05797758145408
+33
+225.50503853449328
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.917154871522644
+20
+-132.73523952520907
+30
+216.90157467892294
+11
+22.037338129290966
+21
+-133.52774388672827
+31
+216.972458946191
+12
+22.849617071807778
+22
+-134.14136434630055
+32
+218.74334873060673
+13
+22.849617071807778
+23
+-134.14136434630055
+33
+218.74334873060673
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.99958501289896
+20
+-133.08722706696685
+30
+218.47684822362402
+11
+22.917154871522644
+21
+-132.73523952520907
+31
+216.90157467892294
+12
+22.849617071807778
+22
+-134.14136434630055
+32
+218.74334873060673
+13
+22.849617071807778
+23
+-134.14136434630055
+33
+218.74334873060673
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.037338129290966
+20
+-133.52774388672827
+30
+216.972458946191
+11
+21.517114536892574
+21
+-134.42094649917388
+31
+217.2009314127939
+12
+21.990487583542812
+22
+-135.18515799865062
+32
+218.84283008424035
+13
+21.990487583542812
+23
+-135.18515799865062
+33
+218.84283008424035
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.037338129290966
+20
+-133.52774388672827
+30
+216.972458946191
+11
+21.990487583542812
+21
+-135.18515799865062
+31
+218.84283008424035
+12
+22.849617071807778
+22
+-134.14136434630055
+32
+218.74334873060673
+13
+22.849617071807778
+23
+-134.14136434630055
+33
+218.74334873060673
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.99958501289896
+20
+-133.08722706696685
+30
+218.47684822362402
+11
+22.849617071807778
+21
+-134.14136434630055
+31
+218.74334873060673
+12
+23.60835253346953
+22
+-134.75833127342597
+32
+220.38707274799174
+13
+23.60835253346953
+23
+-134.75833127342597
+33
+220.38707274799174
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.62779358980904
+20
+-132.53323457471114
+30
+219.4400224303688
+11
+24.434930019169208
+21
+-133.4751130788431
+31
+220.07798083578336
+12
+25.13129949460777
+22
+-134.10637854915157
+32
+221.94135481440327
+13
+25.13129949460777
+23
+-134.10637854915157
+33
+221.94135481440327
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.05766255826456
+20
+-133.4300878790336
+30
+221.27571199559185
+11
+25.62779358980904
+21
+-132.53323457471114
+31
+219.4400224303688
+12
+25.13129949460777
+22
+-134.10637854915157
+32
+221.94135481440327
+13
+25.13129949460777
+23
+-134.10637854915157
+33
+221.94135481440327
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.732721680922797
+20
+-134.01085211171687
+30
+220.95475533478447
+11
+26.05766255826456
+21
+-133.4300878790336
+31
+221.27571199559185
+12
+26.03241193945225
+22
+-134.27157235656256
+32
+222.90544169411697
+13
+26.03241193945225
+23
+-134.27157235656256
+33
+222.90544169411697
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.732721680922797
+20
+-134.01085211171687
+30
+220.95475533478447
+11
+26.03241193945225
+21
+-134.27157235656256
+31
+222.90544169411697
+12
+27.416024160638155
+22
+-134.47418575570723
+32
+222.77888437573222
+13
+27.416024160638155
+23
+-134.47418575570723
+33
+222.77888437573222
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.05766255826456
+20
+-133.4300878790336
+30
+221.27571199559185
+11
+25.13129949460777
+21
+-134.10637854915157
+31
+221.94135481440327
+12
+25.535005171281853
+22
+-134.97250519684684
+32
+223.21362093335614
+13
+25.535005171281853
+23
+-134.97250519684684
+33
+223.21362093335614
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.05766255826456
+20
+-133.4300878790336
+30
+221.27571199559185
+11
+25.535005171281853
+21
+-134.97250519684684
+31
+223.21362093335614
+12
+26.03241193945225
+22
+-134.27157235656256
+32
+222.90544169411697
+13
+26.03241193945225
+23
+-134.27157235656256
+33
+222.90544169411697
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.416024160638155
+20
+-134.47418575570723
+30
+222.77888437573222
+11
+26.03241193945225
+21
+-134.27157235656256
+31
+222.90544169411697
+12
+26.71022373118537
+22
+-135.12492158269018
+32
+224.5409516547798
+13
+26.71022373118537
+23
+-135.12492158269018
+33
+224.5409516547798
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.416024160638155
+20
+-134.47418575570723
+30
+222.77888437573222
+11
+26.71022373118537
+21
+-135.12492158269018
+31
+224.5409516547798
+12
+27.358221539260576
+22
+-134.78053964900886
+32
+224.32890730162103
+13
+27.358221539260576
+23
+-134.78053964900886
+33
+224.32890730162103
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.102687758074495
+20
+-135.3686052654452
+30
+224.5342587196727
+11
+26.03241193945225
+21
+-134.27157235656256
+31
+222.90544169411697
+12
+25.535005171281853
+22
+-134.97250519684684
+32
+223.21362093335614
+13
+25.535005171281853
+23
+-134.97250519684684
+33
+223.21362093335614
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.71022373118537
+20
+-135.12492158269018
+30
+224.5409516547798
+11
+26.03241193945225
+21
+-134.27157235656256
+31
+222.90544169411697
+12
+26.102687758074495
+22
+-135.3686052654452
+32
+224.5342587196727
+13
+26.102687758074495
+23
+-135.3686052654452
+33
+224.5342587196727
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.358221539260576
+20
+-134.78053964900886
+30
+224.32890730162103
+11
+26.71022373118537
+21
+-135.12492158269018
+31
+224.5409516547798
+12
+26.75251091208793
+22
+-135.46899929204866
+32
+225.30303358399487
+13
+26.75251091208793
+23
+-135.46899929204866
+33
+225.30303358399487
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.388339747241524
+20
+-135.03182893984015
+30
+225.12384545772443
+11
+27.358221539260576
+21
+-134.78053964900886
+31
+224.32890730162103
+12
+26.75251091208793
+22
+-135.46899929204866
+32
+225.30303358399487
+13
+26.75251091208793
+23
+-135.46899929204866
+33
+225.30303358399487
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.71022373118537
+20
+-135.12492158269018
+30
+224.5409516547798
+11
+26.102687758074495
+21
+-135.3686052654452
+31
+224.5342587196727
+12
+26.190304363110005
+22
+-136.05797758145408
+32
+225.50503853449328
+13
+26.190304363110005
+23
+-136.05797758145408
+33
+225.50503853449328
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.3487612849113
+20
+-140.7013534240122
+30
+219.88206037174365
+11
+27.93746465032872
+21
+-140.65724089717148
+31
+220.28272380518746
+12
+27.69651898648105
+22
+-140.89544854211132
+32
+218.3755415240497
+13
+27.69651898648105
+23
+-140.89544854211132
+33
+218.3755415240497
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.420239350658157
+20
+-140.10507375085308
+30
+217.18419907502513
+11
+30.738153768234984
+21
+-140.49508933299103
+31
+219.60795425668445
+12
+29.631081456692396
+22
+-141.0183551686193
+32
+217.5002881466635
+13
+29.631081456692396
+23
+-141.0183551686193
+33
+217.5002881466635
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.738153768234984
+20
+-140.49508933299103
+30
+219.60795425668445
+11
+29.3487612849113
+21
+-140.7013534240122
+31
+219.88206037174365
+12
+29.631081456692396
+22
+-141.0183551686193
+32
+217.5002881466635
+13
+29.631081456692396
+23
+-141.0183551686193
+33
+217.5002881466635
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.3487612849113
+20
+-140.7013534240122
+30
+219.88206037174365
+11
+29.161054877595603
+21
+-140.5398103084784
+31
+221.64899523995982
+12
+27.93746465032872
+22
+-140.65724089717148
+32
+220.28272380518746
+13
+27.93746465032872
+23
+-140.65724089717148
+33
+220.28272380518746
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.161054877595603
+20
+-140.5398103084784
+30
+221.64899523995982
+11
+27.948416725958165
+21
+-140.4032135874335
+31
+222.03414323292884
+12
+27.93746465032872
+22
+-140.65724089717148
+32
+220.28272380518746
+13
+27.93746465032872
+23
+-140.65724089717148
+33
+220.28272380518746
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.738153768234984
+20
+-140.49508933299103
+30
+219.60795425668445
+11
+30.624982320064074
+21
+-140.36062218220792
+31
+221.27936268746637
+12
+29.3487612849113
+22
+-140.7013534240122
+32
+219.88206037174365
+13
+29.3487612849113
+23
+-140.7013534240122
+33
+219.88206037174365
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.624982320064074
+20
+-140.36062218220792
+30
+221.27936268746637
+11
+29.161054877595603
+21
+-140.5398103084784
+31
+221.64899523995982
+12
+29.3487612849113
+22
+-140.7013534240122
+32
+219.88206037174365
+13
+29.3487612849113
+23
+-140.7013534240122
+33
+219.88206037174365
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.161054877595603
+20
+-140.5398103084784
+30
+221.64899523995982
+11
+29.143105642536234
+21
+-140.4242050657236
+31
+223.245260262951
+12
+27.948416725958165
+22
+-140.4032135874335
+32
+222.03414323292884
+13
+27.948416725958165
+23
+-140.4032135874335
+33
+222.03414323292884
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.143105642536234
+20
+-140.4242050657236
+30
+223.245260262951
+11
+27.98979123389161
+21
+-140.3095124959376
+31
+223.65839689363938
+12
+27.948416725958165
+22
+-140.4032135874335
+32
+222.03414323292884
+13
+27.948416725958165
+23
+-140.4032135874335
+33
+222.03414323292884
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.624982320064074
+20
+-140.36062218220792
+30
+221.27936268746637
+11
+30.36152405631143
+21
+-140.30403645812268
+31
+222.7299042597213
+12
+29.161054877595603
+22
+-140.5398103084784
+32
+221.64899523995982
+13
+29.161054877595603
+23
+-140.5398103084784
+33
+221.64899523995982
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.36152405631143
+20
+-140.30403645812268
+30
+222.7299042597213
+11
+29.143105642536234
+21
+-140.4242050657236
+31
+223.245260262951
+12
+29.161054877595603
+22
+-140.5398103084784
+32
+221.64899523995982
+13
+29.161054877595603
+23
+-140.5398103084784
+33
+221.64899523995982
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.274226325766474
+20
+-140.3457151903798
+30
+224.62370067064526
+11
+27.98979123389161
+21
+-140.3095124959376
+31
+223.65839689363938
+12
+29.143105642536234
+22
+-140.4242050657236
+32
+223.245260262951
+13
+29.143105642536234
+23
+-140.4242050657236
+33
+223.245260262951
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.274226325766474
+20
+-140.3457151903798
+30
+224.62370067064526
+11
+28.195751100589682
+21
+-140.25566479075994
+31
+225.03318660945712
+12
+27.98979123389161
+22
+-140.3095124959376
+32
+223.65839689363938
+13
+27.98979123389161
+23
+-140.3095124959376
+33
+223.65839689363938
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.36152405631143
+20
+-140.30403645812268
+30
+222.7299042597213
+11
+30.275428572891116
+21
+-140.25809858534407
+31
+224.33772980698768
+12
+29.143105642536234
+22
+-140.4242050657236
+32
+223.245260262951
+13
+29.143105642536234
+23
+-140.4242050657236
+33
+223.245260262951
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.275428572891116
+20
+-140.25809858534407
+30
+224.33772980698768
+11
+29.274226325766474
+21
+-140.3457151903798
+31
+224.62370067064526
+12
+29.143105642536234
+22
+-140.4242050657236
+32
+223.245260262951
+13
+29.143105642536234
+23
+-140.4242050657236
+33
+223.245260262951
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.74192166145162
+20
+-138.56083108710172
+30
+215.90219777773504
+11
+23.231114372899935
+21
+-138.91707776938193
+31
+217.013225005477
+12
+21.580393196084913
+22
+-136.3174809290049
+32
+216.40690592965893
+13
+21.580393196084913
+23
+-136.3174809290049
+33
+216.40690592965893
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.580393196084913
+20
+-136.3174809290049
+30
+216.40690592965893
+11
+23.231114372899935
+21
+-138.91707776938193
+31
+217.013225005477
+12
+22.00752414563304
+22
+-136.47385223104794
+32
+218.33933882960903
+13
+22.00752414563304
+23
+-136.47385223104794
+33
+218.33933882960903
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.217699202351127
+20
+-140.3408476012091
+30
+216.6870965311776
+11
+22.74192166145162
+21
+-138.56083108710172
+31
+215.90219777773504
+12
+24.269431987435457
+22
+-139.9995079107578
+32
+214.91864054134638
+13
+24.269431987435457
+23
+-139.9995079107578
+33
+214.91864054134638
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.217699202351127
+20
+-140.3408476012091
+30
+216.6870965311776
+11
+23.231114372899935
+21
+-138.91707776938193
+31
+217.013225005477
+12
+22.74192166145162
+22
+-138.56083108710172
+32
+215.90219777773504
+13
+22.74192166145162
+23
+-138.56083108710172
+33
+215.90219777773504
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.231114372899935
+20
+-138.91707776938193
+30
+217.013225005477
+11
+24.026356753326496
+21
+-138.95297623950123
+31
+219.33901995511783
+12
+22.00752414563304
+22
+-136.47385223104794
+32
+218.33933882960903
+13
+22.00752414563304
+23
+-136.47385223104794
+33
+218.33933882960903
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.00752414563304
+20
+-136.47385223104794
+30
+218.33933882960903
+11
+24.026356753326496
+21
+-138.95297623950123
+31
+219.33901995511783
+12
+22.84292413670089
+22
+-136.96395761546586
+32
+219.96085447141206
+13
+22.84292413670089
+23
+-136.96395761546586
+33
+219.96085447141206
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.508233430854304
+20
+-140.10598642382269
+30
+219.05882935359767
+11
+23.231114372899935
+21
+-138.91707776938193
+31
+217.013225005477
+12
+25.217699202351127
+22
+-140.3408476012091
+32
+216.6870965311776
+13
+25.217699202351127
+23
+-140.3408476012091
+33
+216.6870965311776
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.508233430854304
+20
+-140.10598642382269
+30
+219.05882935359767
+11
+24.026356753326496
+21
+-138.95297623950123
+31
+219.33901995511783
+12
+23.231114372899935
+22
+-138.91707776938193
+32
+217.013225005477
+13
+23.231114372899935
+23
+-138.91707776938193
+33
+217.013225005477
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.026356753326496
+20
+-138.95297623950123
+30
+219.33901995511783
+11
+24.635413848052586
+21
+-138.97122969888406
+31
+221.1753179689872
+12
+22.84292413670089
+22
+-136.96395761546586
+32
+219.96085447141206
+13
+22.84292413670089
+23
+-136.96395761546586
+33
+219.96085447141206
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.84292413670089
+20
+-136.96395761546586
+30
+219.96085447141206
+11
+24.635413848052586
+21
+-138.97122969888406
+31
+221.1753179689872
+12
+23.631169357697534
+22
+-137.58670480472904
+32
+221.42052277335787
+13
+23.631169357697534
+23
+-137.58670480472904
+33
+221.42052277335787
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.966395261352567
+20
+-139.84891687085454
+30
+220.95749335369013
+11
+24.026356753326496
+21
+-138.95297623950123
+31
+219.33901995511783
+12
+25.508233430854304
+22
+-140.10598642382269
+32
+219.05882935359767
+13
+25.508233430854304
+23
+-140.10598642382269
+33
+219.05882935359767
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.5285432096604
+20
+-136.66460088159562
+30
+224.25741458570604
+11
+30.511810871893196
+21
+-136.44860161223687
+31
+223.09345232575478
+12
+28.84101088975752
+22
+-135.47660490012444
+32
+224.51904750352082
+13
+28.84101088975752
+23
+-135.47660490012444
+33
+224.51904750352082
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.34173482514631
+20
+-138.10479882686653
+30
+222.89357694551745
+11
+30.511810871893196
+21
+-136.44860161223687
+31
+223.09345232575478
+12
+30.5285432096604
+22
+-136.66460088159562
+32
+224.25741458570604
+13
+30.5285432096604
+23
+-136.66460088159562
+33
+224.25741458570604
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.34173482514631
+20
+-138.10479882686653
+30
+222.89357694551745
+11
+30.5285432096604
+21
+-136.66460088159562
+31
+224.25741458570604
+12
+31.318918000918313
+22
+-138.17537886981205
+32
+223.65839689363992
+13
+31.318918000918313
+23
+-138.17537886981205
+33
+223.65839689363992
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.34874663474376
+20
+-135.90647386857762
+30
+215.5444299738407
+11
+30.422673145242477
+21
+-134.23445698915012
+31
+216.83860024405328
+12
+30.761274816785996
+22
+-135.06285982078828
+32
+217.71385362143914
+13
+30.761274816785996
+23
+-135.06285982078828
+33
+217.71385362143914
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.34874663474376
+20
+-135.90647386857762
+30
+215.5444299738407
+11
+30.761274816785996
+21
+-135.06285982078828
+31
+217.71385362143914
+12
+31.083448374885354
+22
+-136.82188485660564
+32
+217.47169106029884
+13
+31.083448374885354
+23
+-136.82188485660564
+33
+217.47169106029884
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.083448374885354
+20
+-136.82188485660564
+30
+217.47169106029884
+11
+31.427830308566634
+21
+-137.1461879849666
+31
+219.3706592847144
+12
+31.426309186951435
+22
+-139.2581132355102
+32
+219.19542607464285
+13
+31.426309186951435
+23
+-139.2581132355102
+33
+219.19542607464285
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.926164399873674
+20
+-139.05093647151955
+30
+217.23743833155748
+11
+31.083448374885354
+21
+-136.82188485660564
+31
+217.47169106029884
+12
+31.426309186951435
+22
+-139.2581132355102
+32
+219.19542607464285
+13
+31.426309186951435
+23
+-139.2581132355102
+33
+219.19542607464285
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.420239350658157
+20
+-140.10507375085308
+30
+217.18419907502513
+11
+30.926164399873674
+21
+-139.05093647151955
+31
+217.23743833155748
+12
+31.426309186951435
+22
+-139.2581132355102
+32
+219.19542607464285
+13
+31.426309186951435
+23
+-139.2581132355102
+33
+219.19542607464285
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.420239350658157
+20
+-140.10507375085308
+30
+217.18419907502513
+11
+31.426309186951435
+21
+-139.2581132355102
+31
+219.19542607464285
+12
+30.738153768234984
+22
+-140.49508933299103
+32
+219.60795425668445
+13
+30.738153768234984
+23
+-140.49508933299103
+33
+219.60795425668445
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.93746465032872
+20
+-140.65724089717148
+30
+220.28272380518746
+11
+25.508233430854304
+21
+-140.10598642382269
+31
+219.05882935359767
+12
+27.69651898648105
+22
+-140.89544854211132
+32
+218.3755415240497
+13
+27.69651898648105
+23
+-140.89544854211132
+33
+218.3755415240497
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.93746465032872
+20
+-140.65724089717148
+30
+220.28272380518746
+11
+25.966395261352567
+21
+-139.84891687085454
+31
+220.95749335369013
+12
+25.508233430854304
+22
+-140.10598642382269
+32
+219.05882935359767
+13
+25.508233430854304
+23
+-140.10598642382269
+33
+219.05882935359767
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.420254000825675
+20
+-133.99411977394897
+30
+218.60097174742404
+11
+27.77561731047144
+21
+-133.35646559285735
+31
+219.35331849830183
+12
+27.732721680922797
+22
+-134.01085211171687
+32
+220.95475533478447
+13
+27.732721680922797
+23
+-134.01085211171687
+33
+220.95475533478447
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.420254000825675
+20
+-133.99411977394897
+30
+218.60097174742404
+11
+27.732721680922797
+21
+-134.01085211171687
+31
+220.95475533478447
+12
+29.125764856122963
+22
+-134.60013462544512
+32
+220.36821083996333
+13
+29.125764856122963
+23
+-134.60013462544512
+33
+220.36821083996333
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.761274816785996
+20
+-135.06285982078828
+30
+217.71385362143914
+11
+29.420254000825675
+21
+-133.99411977394897
+31
+218.60097174742404
+12
+29.125764856122963
+22
+-134.60013462544512
+32
+220.36821083996333
+13
+29.125764856122963
+23
+-134.60013462544512
+33
+220.36821083996333
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.083448374885354
+20
+-136.82188485660564
+30
+217.47169106029884
+11
+30.761274816785996
+21
+-135.06285982078828
+31
+217.71385362143914
+12
+30.896350416215753
+22
+-135.8529303877237
+32
+219.62559926742213
+13
+30.896350416215753
+23
+-135.8529303877237
+33
+219.62559926742213
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.083448374885354
+20
+-136.82188485660564
+30
+217.47169106029884
+11
+30.896350416215753
+21
+-135.8529303877237
+31
+219.62559926742213
+12
+31.427830308566634
+22
+-137.1461879849666
+32
+219.3706592847144
+13
+31.427830308566634
+23
+-137.1461879849666
+33
+219.3706592847144
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.427830308566634
+20
+-137.1461879849666
+30
+219.3706592847144
+11
+31.564427029611593
+21
+-137.64329052881456
+31
+221.3517680763508
+12
+31.32926162790167
+22
+-139.62805001232746
+32
+221.27723311720544
+13
+31.32926162790167
+23
+-139.62805001232746
+33
+221.27723311720544
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.426309186951435
+20
+-139.2581132355102
+30
+219.19542607464285
+11
+31.427830308566634
+21
+-137.1461879849666
+31
+219.3706592847144
+12
+31.32926162790167
+22
+-139.62805001232746
+32
+221.27723311720544
+13
+31.32926162790167
+23
+-139.62805001232746
+33
+221.27723311720544
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.426309186951435
+20
+-139.2581132355102
+30
+219.19542607464285
+11
+31.32926162790167
+21
+-139.62805001232746
+31
+221.27723311720544
+12
+30.738153768234984
+22
+-140.49508933299103
+32
+219.60795425668445
+13
+30.738153768234984
+23
+-140.49508933299103
+33
+219.60795425668445
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.738153768234984
+20
+-140.49508933299103
+30
+219.60795425668445
+11
+31.32926162790167
+21
+-139.62805001232746
+31
+221.27723311720544
+12
+30.624982320064074
+22
+-140.36062218220792
+32
+221.27936268746637
+13
+30.624982320064074
+23
+-140.36062218220792
+33
+221.27936268746637
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.948416725958165
+20
+-140.4032135874335
+30
+222.03414323292884
+11
+25.966395261352567
+21
+-139.84891687085454
+31
+220.95749335369013
+12
+27.93746465032872
+22
+-140.65724089717148
+32
+220.28272380518746
+13
+27.93746465032872
+23
+-140.65724089717148
+33
+220.28272380518746
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.948416725958165
+20
+-140.4032135874335
+30
+222.03414323292884
+11
+26.098124393228883
+21
+-139.620444404252
+31
+222.66966784375956
+12
+25.966395261352567
+22
+-139.84891687085454
+32
+220.95749335369013
+13
+25.966395261352567
+23
+-139.84891687085454
+33
+220.95749335369013
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.125764856122963
+20
+-134.60013462544512
+30
+220.36821083996333
+11
+27.732721680922797
+21
+-134.01085211171687
+31
+220.95475533478447
+12
+27.416024160638155
+22
+-134.47418575570723
+32
+222.77888437573222
+13
+27.416024160638155
+23
+-134.47418575570723
+33
+222.77888437573222
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.125764856122963
+20
+-134.60013462544512
+30
+220.36821083996333
+11
+27.416024160638155
+21
+-134.47418575570723
+31
+222.77888437573222
+12
+28.914328951610155
+22
+-135.0558626613595
+32
+222.1676977107447
+13
+28.914328951610155
+23
+-135.0558626613595
+33
+222.1676977107447
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.896350416215753
+20
+-135.8529303877237
+30
+219.62559926742213
+11
+29.125764856122963
+21
+-134.60013462544512
+31
+220.36821083996333
+12
+28.914328951610155
+22
+-135.0558626613595
+32
+222.1676977107447
+13
+28.914328951610155
+23
+-135.0558626613595
+33
+222.1676977107447
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.125764856122963
+20
+-134.60013462544512
+30
+220.36821083996333
+11
+30.896350416215753
+21
+-135.8529303877237
+31
+219.62559926742213
+12
+30.761274816785996
+22
+-135.06285982078828
+32
+217.71385362143914
+13
+30.761274816785996
+23
+-135.06285982078828
+33
+217.71385362143914
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.896350416215753
+20
+-135.8529303877237
+30
+219.62559926742213
+11
+28.914328951610155
+21
+-135.0558626613595
+31
+222.1676977107447
+12
+30.673353987427436
+22
+-136.1507659999803
+32
+221.60609961041266
+13
+30.673353987427436
+23
+-136.1507659999803
+33
+221.60609961041266
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.427830308566634
+20
+-137.1461879849666
+30
+219.3706592847144
+11
+30.896350416215753
+21
+-135.8529303877237
+31
+219.62559926742213
+12
+30.673353987427436
+22
+-136.1507659999803
+32
+221.60609961041266
+13
+30.673353987427436
+23
+-136.1507659999803
+33
+221.60609961041266
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.427830308566634
+20
+-137.1461879849666
+30
+219.3706592847144
+11
+30.673353987427436
+21
+-136.1507659999803
+31
+221.60609961041266
+12
+31.564427029611593
+22
+-137.64329052881456
+32
+221.3517680763508
+13
+31.564427029611593
+23
+-137.64329052881456
+33
+221.3517680763508
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.564427029611593
+20
+-137.64329052881456
+30
+221.3517680763508
+11
+31.34173482514631
+21
+-138.10479882686653
+31
+222.89357694551745
+12
+31.060935774980393
+22
+-139.5772445503802
+32
+222.8534193348757
+13
+31.060935774980393
+23
+-139.5772445503802
+33
+222.8534193348757
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.32926162790167
+20
+-139.62805001232746
+30
+221.27723311720544
+11
+31.564427029611593
+21
+-137.64329052881456
+31
+221.3517680763508
+12
+31.060935774980393
+22
+-139.5772445503802
+32
+222.8534193348757
+13
+31.060935774980393
+23
+-139.5772445503802
+33
+222.8534193348757
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.32926162790167
+20
+-139.62805001232746
+30
+221.27723311720544
+11
+31.060935774980393
+21
+-139.5772445503802
+31
+222.8534193348757
+12
+30.624982320064074
+22
+-140.36062218220792
+32
+221.27936268746637
+13
+30.624982320064074
+23
+-140.36062218220792
+33
+221.27936268746637
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.624982320064074
+20
+-140.36062218220792
+30
+221.27936268746637
+11
+31.060935774980393
+21
+-139.5772445503802
+31
+222.8534193348757
+12
+30.36152405631143
+22
+-140.30403645812268
+32
+222.7299042597213
+13
+30.36152405631143
+23
+-140.30403645812268
+33
+222.7299042597213
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.98979123389161
+20
+-140.3095124959376
+30
+223.65839689363938
+11
+26.098124393228883
+21
+-139.620444404252
+31
+222.66966784375956
+12
+27.948416725958165
+22
+-140.4032135874335
+32
+222.03414323292884
+13
+27.948416725958165
+23
+-140.4032135874335
+33
+222.03414323292884
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.98979123389161
+20
+-140.3095124959376
+30
+223.65839689363938
+11
+26.199126868478164
+21
+-139.4001859943714
+31
+224.28479477477896
+12
+26.098124393228883
+22
+-139.620444404252
+32
+222.66966784375956
+13
+26.098124393228883
+23
+-139.620444404252
+33
+222.66966784375956
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.914328951610155
+20
+-135.0558626613595
+30
+222.1676977107447
+11
+27.416024160638155
+21
+-134.47418575570723
+31
+222.77888437573222
+12
+27.358221539260576
+22
+-134.78053964900886
+32
+224.32890730162103
+13
+27.358221539260576
+23
+-134.78053964900886
+33
+224.32890730162103
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.914328951610155
+20
+-135.0558626613595
+30
+222.1676977107447
+11
+27.358221539260576
+21
+-134.78053964900886
+31
+224.32890730162103
+12
+28.810588457453516
+22
+-135.32936032777278
+32
+223.70646433668102
+13
+28.810588457453516
+23
+-135.32936032777278
+33
+223.70646433668102
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.673353987427436
+20
+-136.1507659999803
+30
+221.60609961041266
+11
+28.914328951610155
+21
+-135.0558626613595
+31
+222.1676977107447
+12
+28.810588457453516
+22
+-135.32936032777278
+32
+223.70646433668102
+13
+28.810588457453516
+23
+-135.32936032777278
+33
+223.70646433668102
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.673353987427436
+20
+-136.1507659999803
+30
+221.60609961041266
+11
+28.810588457453516
+21
+-135.32936032777278
+31
+223.70646433668102
+12
+30.511810871893196
+22
+-136.44860161223687
+32
+223.09345232575478
+13
+30.511810871893196
+23
+-136.44860161223687
+33
+223.09345232575478
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.564427029611593
+20
+-137.64329052881456
+30
+221.3517680763508
+11
+30.673353987427436
+21
+-136.1507659999803
+31
+221.60609961041266
+12
+30.511810871893196
+22
+-136.44860161223687
+32
+223.09345232575478
+13
+30.511810871893196
+23
+-136.44860161223687
+33
+223.09345232575478
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.564427029611593
+20
+-137.64329052881456
+30
+221.3517680763508
+11
+30.511810871893196
+21
+-136.44860161223687
+31
+223.09345232575478
+12
+31.34173482514631
+22
+-138.10479882686653
+32
+222.89357694551745
+13
+31.34173482514631
+23
+-138.10479882686653
+33
+222.89357694551745
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.060935774980393
+20
+-139.5772445503802
+30
+222.8534193348757
+11
+31.34173482514631
+21
+-138.10479882686653
+31
+222.89357694551745
+12
+31.318918000918313
+22
+-138.17537886981205
+32
+223.65839689363992
+13
+31.318918000918313
+23
+-138.17537886981205
+33
+223.65839689363992
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.060935774980393
+20
+-139.5772445503802
+30
+222.8534193348757
+11
+31.318918000918313
+21
+-138.17537886981205
+31
+223.65839689363992
+12
+31.012868331940076
+22
+-139.61040500159174
+32
+223.87682995758226
+13
+31.012868331940076
+23
+-139.61040500159174
+33
+223.87682995758226
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.36152405631143
+20
+-140.30403645812268
+30
+222.7299042597213
+11
+31.060935774980393
+21
+-139.5772445503802
+31
+222.8534193348757
+12
+31.012868331940076
+22
+-139.61040500159174
+32
+223.87682995758226
+13
+31.012868331940076
+23
+-139.61040500159174
+33
+223.87682995758226
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.012868331940076
+20
+-139.61040500159174
+30
+223.87682995758226
+11
+30.275428572891116
+21
+-140.25809858534407
+31
+224.33772980698768
+12
+30.36152405631143
+22
+-140.30403645812268
+32
+222.7299042597213
+13
+30.36152405631143
+23
+-140.30403645812268
+33
+222.7299042597213
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.195751100589682
+20
+-140.25566479075994
+30
+225.03318660945712
+11
+26.199126868478164
+21
+-139.4001859943714
+31
+224.28479477477896
+12
+27.98979123389161
+22
+-140.3095124959376
+32
+223.65839689363938
+13
+27.98979123389161
+23
+-140.3095124959376
+33
+223.65839689363938
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.195751100589682
+20
+-140.25566479075994
+30
+225.03318660945712
+11
+26.417559932420865
+21
+-139.3253468109037
+31
+225.28538857325756
+12
+26.199126868478164
+22
+-139.4001859943714
+32
+224.28479477477896
+13
+26.199126868478164
+23
+-139.4001859943714
+33
+224.28479477477896
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.810588457453516
+20
+-135.32936032777278
+30
+223.70646433668102
+11
+27.358221539260576
+21
+-134.78053964900886
+31
+224.32890730162103
+12
+27.388339747241524
+22
+-135.03182893984015
+32
+225.12384545772443
+13
+27.388339747241524
+23
+-135.03182893984015
+33
+225.12384545772443
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.84101088975752
+20
+-135.47660490012444
+30
+224.51904750352082
+11
+28.810588457453516
+21
+-135.32936032777278
+31
+223.70646433668102
+12
+27.388339747241524
+22
+-135.03182893984015
+32
+225.12384545772443
+13
+27.388339747241524
+23
+-135.03182893984015
+33
+225.12384545772443
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.511810871893196
+20
+-136.44860161223687
+30
+223.09345232575478
+11
+28.810588457453516
+21
+-135.32936032777278
+31
+223.70646433668102
+12
+28.84101088975752
+22
+-135.47660490012444
+32
+224.51904750352082
+13
+28.84101088975752
+23
+-135.47660490012444
+33
+224.51904750352082
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.057358333941522
+20
+-136.07957750838676
+30
+213.16661266495998
+11
+25.093575678550803
+21
+-136.24081639959832
+31
+214.3844226300891
+12
+26.16900866049718
+22
+-135.36343345195073
+32
+213.48726510144436
+13
+26.16900866049718
+23
+-135.36343345195073
+33
+213.48726510144436
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.774154789526328
+20
+-135.29376608197487
+30
+214.7732213149345
+11
+25.215873856412887
+21
+-135.51159069727143
+31
+214.46321672975662
+12
+23.795146267816094
+22
+-135.7647053340408
+32
+214.727891890801
+13
+23.795146267816094
+23
+-135.7647053340408
+33
+214.727891890801
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.16900866049718
+20
+-135.36343345195073
+30
+213.48726510144436
+11
+25.215873856412887
+21
+-135.51159069727143
+31
+214.46321672975662
+12
+26.26605621954696
+22
+-134.98102347788952
+32
+213.6910953978813
+13
+26.26605621954696
+23
+-134.98102347788952
+33
+213.6910953978813
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.087201617934504
+20
+-134.85963797299678
+30
+214.769266398735
+11
+25.215873856412887
+21
+-135.51159069727143
+31
+214.46321672975662
+12
+23.774154789526328
+22
+-135.29376608197487
+32
+214.7732213149345
+13
+23.774154789526328
+23
+-135.29376608197487
+33
+214.7732213149345
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.19821419550904
+20
+-134.70509201689228
+30
+213.89888061051764
+11
+26.26605621954696
+21
+-134.98102347788952
+31
+213.6910953978813
+12
+25.215873856412887
+22
+-135.51159069727143
+32
+214.46321672975662
+13
+25.215873856412887
+23
+-135.51159069727143
+33
+214.46321672975662
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.40815827874168
+20
+-134.6269063658712
+30
+214.91042648462565
+11
+25.306228480355756
+21
+-134.82891131636978
+31
+214.71146377735744
+12
+24.087201617934504
+22
+-134.85963797299678
+32
+214.769266398735
+13
+24.087201617934504
+23
+-134.85963797299678
+33
+214.769266398735
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.306228480355756
+20
+-134.82891131636978
+30
+214.71146377735744
+11
+25.215873856412887
+21
+-135.51159069727143
+31
+214.46321672975662
+12
+24.087201617934504
+22
+-134.85963797299678
+32
+214.769266398735
+13
+24.087201617934504
+23
+-134.85963797299678
+33
+214.769266398735
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.852615364535605
+20
+-134.30138634021836
+30
+214.35034950590907
+11
+25.215873856412887
+21
+-135.51159069727143
+31
+214.46321672975662
+12
+25.306228480355756
+22
+-134.82891131636978
+32
+214.71146377735744
+13
+25.306228480355756
+23
+-134.82891131636978
+33
+214.71146377735744
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.852615364535605
+20
+-134.30138634021836
+30
+214.35034950590907
+11
+26.19821419550904
+21
+-134.70509201689228
+31
+213.89888061051764
+12
+25.215873856412887
+22
+-135.51159069727143
+32
+214.46321672975662
+13
+25.215873856412887
+23
+-135.51159069727143
+33
+214.46321672975662
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.279760964251288
+20
+-136.8739072158444
+30
+213.98923523445998
+11
+25.29223416149591
+21
+-137.2474946845376
+31
+214.00322955331976
+12
+24.85354268767224
+22
+-137.1443626390271
+32
+214.40906480025507
+13
+24.85354268767224
+23
+-137.1443626390271
+33
+214.40906480025507
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.279760964251288
+20
+-136.8739072158444
+30
+213.98923523445998
+11
+25.6280978141321
+21
+-137.17417662268485
+31
+213.7361205976906
+12
+25.29223416149591
+22
+-137.2474946845376
+32
+214.00322955331976
+13
+25.29223416149591
+23
+-137.2474946845376
+33
+214.00322955331976
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.057358333941522
+20
+-136.07957750838676
+30
+213.16661266495998
+11
+25.90707151835976
+21
+-136.4321734987902
+31
+213.2959080022516
+12
+25.093575678550803
+22
+-136.24081639959832
+32
+214.3844226300891
+13
+25.093575678550803
+23
+-136.24081639959832
+33
+214.3844226300891
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.099355940688568
+20
+-134.28587089974332
+30
+214.76196501498225
+11
+25.852615364535605
+21
+-134.30138634021836
+31
+214.35034950590907
+12
+25.306228480355756
+22
+-134.82891131636978
+32
+214.71146377735744
+13
+25.306228480355756
+23
+-134.82891131636978
+33
+214.71146377735744
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.099355940688568
+20
+-134.28587089974332
+30
+214.76196501498225
+11
+25.306228480355756
+21
+-134.82891131636978
+31
+214.71146377735744
+12
+24.40815827874168
+22
+-134.6269063658712
+32
+214.91042648462565
+13
+24.40815827874168
+23
+-134.6269063658712
+33
+214.91042648462565
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.13163301926586
+20
+-133.2822348580346
+30
+215.3144363856231
+11
+25.099355940688568
+21
+-134.28587089974332
+31
+214.76196501498225
+12
+24.40815827874168
+22
+-134.6269063658712
+32
+214.91042648462565
+13
+24.40815827874168
+23
+-134.6269063658712
+33
+214.91042648462565
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.684698188385045
+20
+-132.28742132169364
+30
+215.00625714638352
+11
+25.099355940688568
+21
+-134.28587089974332
+31
+214.76196501498225
+12
+23.13163301926586
+22
+-133.2822348580346
+32
+215.3144363856231
+13
+23.13163301926586
+23
+-133.2822348580346
+33
+215.3144363856231
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.684698188385045
+20
+-132.28742132169364
+30
+215.00625714638352
+11
+25.852615364535605
+21
+-134.30138634021836
+31
+214.35034950590907
+12
+25.099355940688568
+22
+-134.28587089974332
+32
+214.76196501498225
+13
+25.099355940688568
+23
+-134.28587089974332
+33
+214.76196501498225
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.99958501289896
+20
+-133.08722706696685
+30
+218.47684822362402
+11
+23.60835253346953
+21
+-134.75833127342597
+31
+220.38707274799174
+12
+24.434930019169208
+22
+-133.4751130788431
+32
+220.07798083578336
+13
+24.434930019169208
+23
+-133.4751130788431
+33
+220.07798083578336
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.849617071807778
+20
+-134.14136434630055
+30
+218.74334873060673
+11
+21.990487583542812
+21
+-135.18515799865062
+31
+218.84283008424035
+12
+22.81919463950377
+22
+-136.12490693252164
+32
+220.54526939597213
+13
+22.81919463950377
+23
+-136.12490693252164
+33
+220.54526939597213
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.849617071807778
+20
+-134.14136434630055
+30
+218.74334873060673
+11
+22.81919463950377
+21
+-136.12490693252164
+31
+220.54526939597213
+12
+23.60835253346953
+22
+-134.75833127342597
+32
+220.38707274799174
+13
+23.60835253346953
+23
+-134.75833127342597
+33
+220.38707274799174
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.434930019169208
+20
+-133.4751130788431
+30
+220.07798083578336
+11
+23.60835253346953
+21
+-134.75833127342597
+31
+220.38707274799174
+12
+24.461093310950655
+22
+-135.33635748720235
+32
+222.1260189784882
+13
+24.461093310950655
+23
+-135.33635748720235
+33
+222.1260189784882
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.434930019169208
+20
+-133.4751130788431
+30
+220.07798083578336
+11
+24.461093310950655
+21
+-135.33635748720235
+31
+222.1260189784882
+12
+25.13129949460777
+22
+-134.10637854915157
+32
+221.94135481440327
+13
+25.13129949460777
+23
+-134.10637854915157
+33
+221.94135481440327
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.461093310950655
+20
+-135.33635748720235
+30
+222.1260189784882
+11
+22.81919463950377
+21
+-136.12490693252164
+31
+220.54526939597213
+12
+23.681366370999132
+22
+-136.5267872632579
+32
+222.1311907919796
+13
+23.681366370999132
+23
+-136.5267872632579
+33
+222.1311907919796
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.81919463950377
+20
+-136.12490693252164
+30
+220.54526939597213
+11
+24.461093310950655
+21
+-135.33635748720235
+31
+222.1260189784882
+12
+23.60835253346953
+22
+-134.75833127342597
+32
+220.38707274799174
+13
+23.60835253346953
+23
+-134.75833127342597
+33
+220.38707274799174
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.60225339684121
+20
+-131.7565498779889
+30
+215.17601431864026
+11
+26.32051237337113
+21
+-133.23416741499415
+31
+214.39963384624184
+12
+24.684698188385045
+22
+-132.28742132169364
+32
+215.00625714638352
+13
+24.684698188385045
+23
+-132.28742132169364
+33
+215.00625714638352
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.60225339684121
+20
+-131.7565498779889
+30
+215.17601431864026
+11
+26.57088899123306
+21
+-132.1748583221686
+31
+214.12856997441318
+12
+26.32051237337113
+22
+-133.23416741499415
+32
+214.39963384624184
+13
+26.32051237337113
+23
+-133.23416741499415
+33
+214.39963384624184
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.41244671959929
+20
+-134.45806186658413
+30
+215.14011584852088
+11
+21.69204352264057
+21
+-134.27704839437556
+31
+216.03027621773597
+12
+22.41275094392233
+22
+-133.77355713974413
+32
+215.1425496431054
+13
+22.41275094392233
+23
+-133.77355713974413
+33
+215.1425496431054
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.41275094392233
+20
+-133.77355713974413
+30
+215.1425496431054
+11
+21.69204352264057
+21
+-134.27704839437556
+31
+216.03027621773597
+12
+22.038859250906178
+22
+-133.44590754383034
+32
+215.67402953545633
+13
+22.038859250906178
+23
+-133.44590754383034
+33
+215.67402953545633
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.13163301926586
+20
+-133.2822348580346
+30
+215.3144363856231
+11
+22.41275094392233
+21
+-133.77355713974413
+31
+215.1425496431054
+12
+22.038859250906178
+22
+-133.44590754383034
+32
+215.67402953545633
+13
+22.038859250906178
+23
+-133.44590754383034
+33
+215.67402953545633
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.82132420976505
+20
+-132.81220827893785
+30
+215.6865027327011
+11
+23.13163301926586
+21
+-133.2822348580346
+31
+215.3144363856231
+12
+22.038859250906178
+22
+-133.44590754383034
+32
+215.67402953545633
+13
+22.038859250906178
+23
+-133.44590754383034
+33
+215.67402953545633
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.61439306942774
+20
+-137.14497108767296
+30
+212.7686872504234
+11
+27.416632609284232
+21
+-137.9265233735625
+31
+212.67468193460383
+12
+26.091735682445044
+22
+-138.5228030467211
+32
+213.30168826438913
+13
+26.091735682445044
+23
+-138.5228030467211
+33
+213.30168826438913
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.416632609284232
+20
+-137.9265233735625
+30
+212.67468193460383
+11
+26.234416889950786
+21
+-139.3171327541784
+31
+212.93144726324928
+12
+26.091735682445044
+22
+-138.5228030467211
+32
+213.30168826438913
+13
+26.091735682445044
+23
+-138.5228030467211
+33
+213.30168826438913
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.39171551513
+20
+-138.4841665576951
+30
+213.85811455122933
+11
+26.091735682445044
+21
+-138.5228030467211
+31
+213.30168826438913
+12
+26.234416889950786
+22
+-139.3171327541784
+32
+212.93144726324928
+13
+26.234416889950786
+23
+-139.3171327541784
+33
+212.93144726324928
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.39171551513
+20
+-138.4841665576951
+30
+213.85811455122933
+11
+26.234416889950786
+21
+-139.3171327541784
+31
+212.93144726324928
+12
+25.318093228954332
+22
+-139.41448453755132
+32
+213.42733290980442
+13
+25.318093228954332
+23
+-139.41448453755132
+33
+213.42733290980442
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.249672056605366
+20
+-137.38196183532145
+30
+214.77535088519522
+11
+24.291031914371285
+21
+-138.74397412957143
+31
+214.41301971645413
+12
+24.067427036936895
+22
+-139.22890770049713
+32
+214.29802292234493
+13
+24.067427036936895
+23
+-139.22890770049713
+33
+214.29802292234493
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.249672056605366
+20
+-137.38196183532145
+30
+214.77535088519522
+11
+24.067427036936895
+21
+-139.22890770049713
+31
+214.29802292234493
+12
+22.785729963969377
+22
+-137.81913218753002
+32
+215.04398096243935
+13
+22.785729963969377
+23
+-137.81913218753002
+33
+215.04398096243935
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.416632609284232
+20
+-137.9265233735625
+30
+212.67468193460383
+11
+28.612538423154483
+21
+-139.00864929061603
+31
+213.76836837593206
+12
+26.234416889950786
+22
+-139.3171327541784
+32
+212.93144726324928
+13
+26.234416889950786
+23
+-139.3171327541784
+33
+212.93144726324928
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.612538423154483
+20
+-139.00864929061603
+30
+213.76836837593206
+11
+27.04365358923721
+21
+-140.51638503560227
+31
+213.7753655353618
+12
+26.234416889950786
+22
+-139.3171327541784
+32
+212.93144726324928
+13
+26.234416889950786
+23
+-139.3171327541784
+33
+212.93144726324928
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.677426104967118
+20
+-135.81277277708122
+30
+215.05675838400762
+11
+23.249672056605366
+21
+-137.38196183532145
+31
+214.77535088519522
+12
+22.785729963969377
+22
+-137.81913218753002
+32
+215.04398096243935
+13
+22.785729963969377
+23
+-137.81913218753002
+33
+215.04398096243935
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.234416889950786
+20
+-139.3171327541784
+30
+212.93144726324928
+11
+27.04365358923721
+21
+-140.51638503560227
+31
+213.7753655353618
+12
+25.318093228954332
+22
+-139.41448453755132
+32
+213.42733290980442
+13
+25.318093228954332
+23
+-139.41448453755132
+33
+213.42733290980442
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.318093228954332
+20
+-139.41448453755132
+30
+213.42733290980442
+11
+27.04365358923721
+21
+-140.51638503560227
+31
+213.7753655353618
+12
+25.822801380877685
+22
+-140.51851460586374
+32
+214.1246150582118
+13
+25.822801380877685
+23
+-140.51851460586374
+33
+214.1246150582118
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.677426104967118
+20
+-135.81277277708122
+30
+215.05675838400762
+11
+22.785729963969377
+21
+-137.81913218753002
+31
+215.04398096243935
+12
+21.92416668112009
+22
+-136.02755514914764
+32
+215.67950557327043
+13
+21.92416668112009
+23
+-136.02755514914764
+33
+215.67950557327043
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.41244671959929
+20
+-134.45806186658413
+30
+215.14011584852088
+11
+22.677426104967118
+21
+-135.81277277708122
+31
+215.05675838400762
+12
+21.92416668112009
+22
+-136.02755514914764
+32
+215.67950557327043
+13
+21.92416668112009
+23
+-136.02755514914764
+33
+215.67950557327043
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.41244671959929
+20
+-134.45806186658413
+30
+215.14011584852088
+11
+21.92416668112009
+21
+-136.02755514914764
+31
+215.67950557327043
+12
+21.69204352264057
+22
+-134.27704839437556
+32
+216.03027621773597
+13
+21.69204352264057
+23
+-134.27704839437556
+33
+216.03027621773597
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.78991585365432
+20
+-135.1224877881028
+30
+212.7583436234406
+11
+28.094140176694317
+21
+-137.33571973821887
+31
+212.92414587949676
+12
+26.97185664899976
+22
+-135.17876928786526
+32
+212.98316539816713
+13
+26.97185664899976
+23
+-135.17876928786526
+33
+212.98316539816713
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.97185664899976
+20
+-135.17876928786526
+30
+212.98316539816713
+11
+28.094140176694317
+21
+-137.33571973821887
+31
+212.92414587949676
+12
+26.872679519688724
+22
+-136.51705208491833
+32
+212.53230495142154
+13
+26.872679519688724
+23
+-136.51705208491833
+33
+212.53230495142154
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.872679519688724
+20
+-136.51705208491833
+30
+212.53230495142154
+11
+28.094140176694317
+21
+-137.33571973821887
+31
+212.92414587949676
+12
+26.61439306942774
+22
+-137.14497108767296
+32
+212.7686872504234
+13
+26.61439306942774
+23
+-137.14497108767296
+33
+212.7686872504234
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.61439306942774
+20
+-137.14497108767296
+30
+212.7686872504234
+11
+28.094140176694317
+21
+-137.33571973821887
+31
+212.92414587949676
+12
+27.416632609284232
+22
+-137.9265233735625
+32
+212.67468193460383
+13
+27.416632609284232
+23
+-137.9265233735625
+33
+212.67468193460383
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.39171551513
+20
+-138.4841665576951
+30
+213.85811455122933
+11
+25.318093228954332
+21
+-139.41448453755132
+31
+213.42733290980442
+12
+24.291031914371285
+22
+-138.74397412957143
+32
+214.41301971645413
+13
+24.291031914371285
+23
+-138.74397412957143
+33
+214.41301971645413
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.291031914371285
+20
+-138.74397412957143
+30
+214.41301971645413
+11
+25.318093228954332
+21
+-139.41448453755132
+31
+213.42733290980442
+12
+24.067427036936895
+22
+-139.22890770049713
+32
+214.29802292234493
+13
+24.067427036936895
+23
+-139.22890770049713
+33
+214.29802292234493
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.975811565199283
+20
+-133.98073390373398
+30
+213.6548927034397
+11
+26.32051237337113
+21
+-133.23416741499415
+31
+214.39963384624184
+12
+26.57088899123306
+22
+-132.1748583221686
+32
+214.12856997441318
+13
+26.57088899123306
+23
+-132.1748583221686
+33
+214.12856997441318
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.57088899123306
+20
+-132.1748583221686
+30
+214.12856997441318
+11
+27.71933581070904
+21
+-133.4109217466801
+31
+213.54598039579162
+12
+26.975811565199283
+22
+-133.98073390373398
+32
+213.6548927034397
+13
+26.975811565199283
+23
+-133.98073390373398
+33
+213.6548927034397
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.71933581070904
+20
+-133.4109217466801
+30
+213.54598039579162
+11
+27.095067499830968
+21
+-134.46749282059787
+31
+213.28708549688432
+12
+26.975811565199283
+22
+-133.98073390373398
+32
+213.6548927034397
+13
+26.975811565199283
+23
+-133.98073390373398
+33
+213.6548927034397
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.71933581070904
+20
+-133.4109217466801
+30
+213.54598039579162
+11
+28.0415093688084
+21
+-134.21407395950558
+31
+213.32237551835695
+12
+27.095067499830968
+22
+-134.46749282059787
+32
+213.28708549688432
+13
+27.095067499830968
+23
+-134.46749282059787
+33
+213.28708549688432
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.0415093688084
+20
+-134.21407395950558
+30
+213.32237551835695
+11
+26.97185664899976
+21
+-135.17876928786526
+31
+212.98316539816713
+12
+27.095067499830968
+22
+-134.46749282059787
+32
+213.28708549688432
+13
+27.095067499830968
+23
+-134.46749282059787
+33
+213.28708549688432
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.0415093688084
+20
+-134.21407395950558
+30
+213.32237551835695
+11
+27.78991585365432
+21
+-135.1224877881028
+31
+212.7583436234406
+12
+26.97185664899976
+22
+-135.17876928786526
+32
+212.98316539816713
+13
+26.97185664899976
+23
+-135.17876928786526
+33
+212.98316539816713
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.60225339684121
+20
+-131.7565498779889
+30
+215.17601431864026
+11
+22.82132420976505
+21
+-132.81220827893785
+31
+215.6865027327011
+12
+22.917154871522644
+22
+-132.73523952520907
+32
+216.90157467892294
+13
+22.917154871522644
+23
+-132.73523952520907
+33
+216.90157467892294
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.60225339684121
+20
+-131.7565498779889
+30
+215.17601431864026
+11
+22.917154871522644
+21
+-132.73523952520907
+31
+216.90157467892294
+12
+24.590388648242644
+22
+-131.46662409813186
+32
+215.4175684311342
+13
+24.590388648242644
+23
+-131.46662409813186
+33
+215.4175684311342
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.590388648242644
+20
+-131.46662409813186
+30
+215.4175684311342
+11
+26.57088899123306
+21
+-132.1748583221686
+31
+214.12856997441318
+12
+24.60225339684121
+22
+-131.7565498779889
+32
+215.17601431864026
+13
+24.60225339684121
+23
+-131.7565498779889
+33
+215.17601431864026
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.18907281565032
+20
+-131.83169328577975
+30
+214.74249465830835
+11
+26.57088899123306
+21
+-132.1748583221686
+31
+214.12856997441318
+12
+24.590388648242644
+22
+-131.46662409813186
+32
+215.4175684311342
+13
+24.590388648242644
+23
+-131.46662409813186
+33
+215.4175684311342
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.038859250906178
+20
+-133.44590754383034
+30
+215.67402953545633
+11
+21.69204352264057
+21
+-134.27704839437556
+31
+216.03027621773597
+12
+21.517114536892574
+22
+-134.42094649917388
+32
+217.2009314127939
+13
+21.517114536892574
+23
+-134.42094649917388
+33
+217.2009314127939
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.038859250906178
+20
+-133.44590754383034
+30
+215.67402953545633
+11
+21.517114536892574
+21
+-134.42094649917388
+31
+217.2009314127939
+12
+22.037338129290966
+22
+-133.52774388672827
+32
+216.972458946191
+13
+22.037338129290966
+23
+-133.52774388672827
+33
+216.972458946191
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.82132420976505
+20
+-132.81220827893785
+30
+215.6865027327011
+11
+22.038859250906178
+21
+-133.44590754383034
+31
+215.67402953545633
+12
+22.037338129290966
+22
+-133.52774388672827
+32
+216.972458946191
+13
+22.037338129290966
+23
+-133.52774388672827
+33
+216.972458946191
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.917154871522644
+20
+-132.73523952520907
+30
+216.90157467892294
+11
+22.82132420976505
+21
+-132.81220827893785
+31
+215.6865027327011
+12
+22.037338129290966
+22
+-133.52774388672827
+32
+216.972458946191
+13
+22.037338129290966
+23
+-133.52774388672827
+33
+216.972458946191
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.067427036936895
+20
+-139.22890770049713
+30
+214.29802292234493
+11
+24.269431987435457
+21
+-139.9995079107578
+31
+214.91864054134638
+12
+22.785729963969377
+22
+-137.81913218753002
+32
+215.04398096243935
+13
+22.785729963969377
+23
+-137.81913218753002
+33
+215.04398096243935
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.269431987435457
+20
+-139.9995079107578
+30
+214.91864054134638
+11
+22.74192166145162
+21
+-138.56083108710172
+31
+215.90219777773504
+12
+22.785729963969377
+22
+-137.81913218753002
+32
+215.04398096243935
+13
+22.785729963969377
+23
+-137.81913218753002
+33
+215.04398096243935
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.785729963969377
+20
+-137.81913218753002
+30
+215.04398096243935
+11
+22.74192166145162
+21
+-138.56083108710172
+31
+215.90219777773504
+12
+21.92416668112009
+22
+-136.02755514914764
+32
+215.67950557327043
+13
+21.92416668112009
+23
+-136.02755514914764
+33
+215.67950557327043
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.92416668112009
+20
+-136.02755514914764
+30
+215.67950557327043
+11
+22.74192166145162
+21
+-138.56083108710172
+31
+215.90219777773504
+12
+21.580393196084913
+22
+-136.3174809290049
+32
+216.40690592965893
+13
+21.580393196084913
+23
+-136.3174809290049
+33
+216.40690592965893
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.92416668112009
+20
+-136.02755514914764
+30
+215.67950557327043
+11
+21.580393196084913
+21
+-136.3174809290049
+31
+216.40690592965893
+12
+21.69204352264057
+22
+-134.27704839437556
+32
+216.03027621773597
+13
+21.69204352264057
+23
+-134.27704839437556
+33
+216.03027621773597
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+21.69204352264057
+20
+-134.27704839437556
+30
+216.03027621773597
+11
+21.580393196084913
+21
+-136.3174809290049
+31
+216.40690592965893
+12
+21.517114536892574
+22
+-134.42094649917388
+32
+217.2009314127939
+13
+21.517114536892574
+23
+-134.42094649917388
+33
+217.2009314127939
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.78991585365432
+20
+-135.1224877881028
+30
+212.7583436234406
+11
+29.13184934258376
+21
+-135.74797299627343
+31
+214.00444645061194
+12
+29.31651350666904
+22
+-138.22375053717286
+32
+213.8867116375951
+13
+29.31651350666904
+23
+-138.22375053717286
+33
+213.8867116375951
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.77125561877622
+20
+-113.02150339222067
+30
+230.86820912537135
+11
+33.86953472528566
+21
+-113.84290906442916
+31
+232.74861966608137
+12
+33.95684710599815
+22
+-113.57671278176869
+32
+230.90167380090566
+13
+33.95684710599815
+23
+-113.57671278176869
+33
+230.90167380090566
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.77125561877622
+20
+-113.02150339222067
+30
+230.86820912537135
+11
+34.52087900091431
+21
+-113.36679799887153
+31
+232.77174071463241
+12
+33.86953472528566
+22
+-113.84290906442916
+32
+232.74861966608137
+13
+33.86953472528566
+23
+-113.84290906442916
+33
+232.74861966608137
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.75481285516455
+20
+-112.30383821416928
+30
+230.72035610437402
+11
+35.65107236100791
+21
+-112.62783711820744
+31
+232.75470415254253
+12
+34.52087900091431
+22
+-113.36679799887153
+32
+232.77174071463241
+13
+34.52087900091431
+23
+-113.36679799887153
+33
+232.77174071463241
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.75481285516455
+20
+-112.30383821416928
+30
+230.72035610437402
+11
+34.52087900091431
+21
+-113.36679799887153
+31
+232.77174071463241
+12
+34.77125561877622
+22
+-113.02150339222067
+32
+230.86820912537135
+13
+34.77125561877622
+23
+-113.02150339222067
+33
+230.86820912537135
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.80298284937752
+20
+-112.75774090414544
+30
+232.5822089613788
+11
+29.54711554353336
+21
+-112.08023333673596
+31
+234.59313173667303
+12
+28.24533966524521
+22
+-111.26369525369613
+32
+233.06288339178235
+13
+28.24533966524521
+23
+-111.26369525369613
+33
+233.06288339178235
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.80298284937752
+20
+-112.75774090414544
+30
+232.5822089613788
+11
+29.851644090896396
+21
+-113.20099574281508
+31
+234.10485169819384
+12
+29.54711554353336
+22
+-112.08023333673596
+32
+234.59313173667303
+13
+29.54711554353336
+23
+-112.08023333673596
+33
+234.59313173667303
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.655404752368074
+20
+-113.71209260552217
+30
+233.65034055957193
+11
+29.851644090896396
+21
+-113.20099574281508
+31
+234.10485169819384
+12
+29.49418051132441
+22
+-113.35949661511845
+32
+232.14077946864757
+13
+29.49418051132441
+23
+-113.35949661511845
+33
+232.14077946864757
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.851644090896396
+20
+-113.20099574281508
+30
+234.10485169819384
+11
+28.80298284937752
+21
+-112.75774090414544
+31
+232.5822089613788
+12
+29.49418051132441
+22
+-113.35949661511845
+32
+232.14077946864757
+13
+29.49418051132441
+23
+-113.35949661511845
+33
+232.14077946864757
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+36.14574111027098
+20
+-109.68477101711805
+30
+231.1906869077943
+11
+35.87498146276534
+21
+-110.19799745008706
+31
+233.26671368821914
+12
+35.65107236100791
+22
+-112.62783711820744
+32
+232.75470415254253
+13
+35.65107236100791
+23
+-112.62783711820744
+33
+232.75470415254253
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.75481285516455
+20
+-112.30383821416928
+30
+230.72035610437402
+11
+36.14574111027098
+21
+-109.68477101711805
+31
+231.1906869077943
+12
+35.65107236100791
+22
+-112.62783711820744
+32
+232.75470415254253
+13
+35.65107236100791
+23
+-112.62783711820744
+33
+232.75470415254253
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.95684710599815
+20
+-113.57671278176869
+30
+230.90167380090566
+11
+31.959614425240556
+21
+-113.87333149673309
+31
+233.16175629676968
+12
+31.478635770514334
+22
+-113.8161373240013
+32
+231.44501844185496
+13
+31.478635770514334
+23
+-113.8161373240013
+33
+231.44501844185496
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.95684710599815
+20
+-113.57671278176869
+30
+230.90167380090566
+11
+33.86953472528566
+21
+-113.84290906442916
+31
+232.74861966608137
+12
+31.959614425240556
+22
+-113.87333149673309
+32
+233.16175629676968
+13
+31.959614425240556
+23
+-113.87333149673309
+33
+233.16175629676968
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.478635770514334
+20
+-113.8161373240013
+30
+231.44501844185496
+11
+30.655404752368074
+21
+-113.71209260552217
+31
+233.65034055957193
+12
+29.49418051132441
+22
+-113.35949661511845
+32
+232.14077946864757
+13
+29.49418051132441
+23
+-113.35949661511845
+33
+232.14077946864757
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.959614425240556
+20
+-113.87333149673309
+30
+233.16175629676968
+11
+30.655404752368074
+21
+-113.71209260552217
+31
+233.65034055957193
+12
+31.478635770514334
+22
+-113.8161373240013
+32
+231.44501844185496
+13
+31.478635770514334
+23
+-113.8161373240013
+33
+231.44501844185496
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.24533966524521
+20
+-111.26369525369613
+30
+233.06288339178235
+11
+30.005885822677673
+21
+-109.93758142956543
+31
+235.00535569439307
+12
+28.68524803636104
+22
+-109.36046788875794
+32
+233.4054399795259
+13
+28.68524803636104
+23
+-109.36046788875794
+33
+233.4054399795259
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.24533966524521
+20
+-111.26369525369613
+30
+233.06288339178235
+11
+29.54711554353336
+21
+-112.08023333673596
+31
+234.59313173667303
+12
+30.005885822677673
+22
+-109.93758142956543
+32
+235.00535569439307
+13
+30.005885822677673
+23
+-109.93758142956543
+33
+235.00535569439307
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.68524803636104
+20
+-109.36046788875794
+30
+233.4054399795259
+11
+30.893916621631433
+21
+-108.11588618320185
+31
+235.4361373358182
+12
+29.604005491941837
+22
+-107.49009675070818
+32
+233.87120741810062
+13
+29.604005491941837
+23
+-107.49009675070818
+33
+233.87120741810062
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.68524803636104
+20
+-109.36046788875794
+30
+233.4054399795259
+11
+30.005885822677673
+21
+-109.93758142956543
+31
+235.00535569439307
+12
+30.893916621631433
+22
+-108.11588618320185
+32
+235.4361373358182
+13
+30.893916621631433
+23
+-108.11588618320185
+33
+235.4361373358182
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.331072323672394
+20
+-107.96438247032782
+30
+234.96367696213687
+11
+31.863783763482957
+21
+-106.58289981940287
+31
+233.39083721202056
+12
+29.604005491941837
+22
+-107.49009675070818
+32
+233.87120741810062
+13
+29.604005491941837
+23
+-107.49009675070818
+33
+233.87120741810062
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.331072323672394
+20
+-107.96438247032782
+30
+234.96367696213687
+11
+29.604005491941837
+21
+-107.49009675070818
+31
+233.87120741810062
+12
+30.893916621631433
+22
+-108.11588618320185
+32
+235.4361373358182
+13
+30.893916621631433
+23
+-108.11588618320185
+33
+235.4361373358182
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.54599240678655
+20
+-108.13111757065796
+30
+234.5075291724416
+11
+33.40163771645015
+21
+-106.82567082918851
+31
+232.76687312546557
+12
+31.863783763482957
+22
+-106.58289981940287
+32
+233.39083721202056
+13
+31.863783763482957
+23
+-106.58289981940287
+33
+233.39083721202056
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.40163771645015
+20
+-106.82567082918851
+30
+232.76687312546557
+11
+33.54599240678655
+21
+-108.13111757065796
+31
+234.5075291724416
+12
+33.59627712494252
+22
+-108.13868944379226
+32
+234.4880501046378
+13
+33.59627712494252
+23
+-108.13868944379226
+33
+234.4880501046378
+70
+3
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.59627712494252
+20
+-108.13868944379226
+30
+234.4880501046378
+11
+33.54599240678655
+21
+-108.13111757065796
+31
+234.5075291724416
+12
+33.60303421830263
+22
+-108.1819028613013
+32
+234.54597696660318
+13
+33.60303421830263
+23
+-108.1819028613013
+33
+234.54597696660318
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.54599240678655
+20
+-108.13111757065796
+30
+234.5075291724416
+11
+31.863783763482957
+21
+-106.58289981940287
+31
+233.39083721202056
+12
+32.331072323672394
+22
+-107.96438247032782
+32
+234.96367696213687
+13
+32.331072323672394
+23
+-107.96438247032782
+33
+234.96367696213687
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.43841955920296
+20
+-107.79249572780938
+30
+231.80187357278214
+11
+33.40163771645015
+21
+-106.82567082918851
+31
+232.76687312546557
+12
+35.06574476347897
+22
+-108.34253330386625
+32
+233.93448607729277
+13
+35.06574476347897
+23
+-108.34253330386625
+33
+233.93448607729277
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.06574476347897
+20
+-108.34253330386625
+30
+233.93448607729277
+11
+33.40163771645015
+21
+-106.82567082918851
+31
+232.76687312546557
+12
+33.59627712494252
+22
+-108.13868944379226
+32
+234.4880501046378
+13
+33.59627712494252
+23
+-108.13868944379226
+33
+234.4880501046378
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+36.14574111027098
+20
+-109.68477101711805
+30
+231.1906869077943
+11
+35.43841955920296
+21
+-107.79249572780938
+31
+231.80187357278214
+12
+35.87498146276534
+22
+-110.19799745008706
+32
+233.26671368821914
+13
+35.87498146276534
+23
+-110.19799745008706
+33
+233.26671368821914
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.43841955920296
+20
+-107.79249572780938
+30
+231.80187357278214
+11
+35.06574476347897
+21
+-108.34253330386625
+31
+233.93448607729277
+12
+35.87498146276534
+22
+-110.19799745008706
+32
+233.26671368821914
+13
+35.87498146276534
+23
+-110.19799745008706
+33
+233.26671368821914
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.73545969983016
+20
+-110.65555083193892
+30
+232.23813125202108
+11
+28.24533966524521
+21
+-111.26369525369613
+31
+233.06288339178235
+12
+28.17202160339256
+22
+-109.08088573588395
+32
+232.50858667520404
+13
+28.17202160339256
+23
+-109.08088573588395
+33
+232.50858667520404
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.17202160339256
+20
+-109.08088573588395
+30
+232.50858667520404
+11
+28.24533966524521
+21
+-111.26369525369613
+31
+233.06288339178235
+12
+28.68524803636104
+22
+-109.36046788875794
+32
+233.4054399795259
+13
+28.68524803636104
+23
+-109.36046788875794
+33
+233.4054399795259
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.17202160339256
+20
+-109.08088573588395
+30
+232.50858667520404
+11
+28.68524803636104
+21
+-109.36046788875794
+31
+233.4054399795259
+12
+29.114508556170495
+22
+-107.11559660904567
+32
+232.87761077905208
+13
+29.114508556170495
+23
+-107.11559660904567
+33
+232.87761077905208
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.114508556170495
+20
+-107.11559660904567
+30
+232.87761077905208
+11
+28.68524803636104
+21
+-109.36046788875794
+31
+233.4054399795259
+12
+29.604005491941837
+22
+-107.49009675070818
+32
+233.87120741810062
+13
+29.604005491941837
+23
+-107.49009675070818
+33
+233.87120741810062
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.641700007663754
+20
+-106.01430455964078
+30
+232.42827145392226
+11
+29.114508556170495
+21
+-107.11559660904567
+31
+232.87761077905208
+12
+29.604005491941837
+22
+-107.49009675070818
+32
+233.87120741810062
+13
+29.604005491941837
+23
+-107.49009675070818
+33
+233.87120741810062
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.863783763482957
+20
+-106.58289981940287
+30
+233.39083721202056
+11
+31.641700007663754
+21
+-106.01430455964078
+31
+232.42827145392226
+12
+29.604005491941837
+22
+-107.49009675070818
+32
+233.87120741810062
+13
+29.604005491941837
+23
+-107.49009675070818
+33
+233.87120741810062
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.282077557495434
+20
+-106.28658532876156
+30
+231.7948764133529
+11
+31.641700007663754
+21
+-106.01430455964078
+31
+232.42827145392226
+12
+31.863783763482957
+22
+-106.58289981940287
+32
+233.39083721202056
+13
+31.863783763482957
+23
+-106.58289981940287
+33
+233.39083721202056
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.40163771645015
+20
+-106.82567082918851
+30
+232.76687312546557
+11
+33.282077557495434
+21
+-106.28658532876156
+31
+231.7948764133529
+12
+31.863783763482957
+22
+-106.58289981940287
+32
+233.39083721202056
+13
+31.863783763482957
+23
+-106.58289981940287
+33
+233.39083721202056
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.39674082694646
+20
+-107.40917308077869
+30
+230.6753309045654
+11
+33.282077557495434
+21
+-106.28658532876156
+31
+231.7948764133529
+12
+33.40163771645015
+22
+-106.82567082918851
+32
+232.76687312546557
+13
+33.40163771645015
+23
+-106.82567082918851
+33
+232.76687312546557
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.238632079970824
+20
+-112.17606399848992
+30
+221.0326367614881
+11
+27.22162481821561
+21
+-111.25761076723234
+31
+221.50053377032413
+12
+28.9830836486172
+22
+-111.4723931392983
+32
+220.44852606125175
+13
+28.9830836486172
+23
+-111.4723931392983
+33
+220.44852606125175
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.43841955920296
+20
+-107.79249572780938
+30
+231.80187357278214
+11
+35.39674082694646
+21
+-107.40917308077869
+31
+230.6753309045654
+12
+33.40163771645015
+22
+-106.82567082918851
+32
+232.76687312546557
+13
+33.40163771645015
+23
+-106.82567082918851
+33
+232.76687312546557
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.22162481821561
+20
+-111.25761076723234
+30
+221.50053377032413
+11
+29.238632079970824
+21
+-112.17606399848992
+31
+221.0326367614881
+12
+27.2064136020636
+22
+-111.95306756970187
+32
+221.9161041955966
+13
+27.2064136020636
+23
+-111.95306756970187
+33
+221.9161041955966
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+36.05599493497415
+20
+-109.3781128994934
+30
+230.0221612829981
+11
+35.43841955920296
+21
+-107.79249572780938
+31
+231.80187357278214
+12
+36.14574111027098
+22
+-109.68477101711805
+32
+231.1906869077943
+13
+36.14574111027098
+23
+-109.68477101711805
+33
+231.1906869077943
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+36.05599493497415
+20
+-109.3781128994934
+30
+230.0221612829981
+11
+35.39674082694646
+21
+-107.40917308077869
+31
+230.6753309045654
+12
+35.43841955920296
+22
+-107.79249572780938
+32
+231.80187357278214
+13
+35.43841955920296
+23
+-107.79249572780938
+33
+231.80187357278214
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.031513916650653
+20
+-110.0130290616776
+30
+228.83872866637225
+11
+27.616203765198485
+21
+-112.3363902167342
+31
+229.42131824499324
+12
+26.486010405104903
+22
+-110.4684528732689
+32
+230.54846936185695
+13
+26.486010405104903
+23
+-110.4684528732689
+33
+230.54846936185695
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.689811401206637
+20
+-112.9433177411988
+30
+228.61056042409152
+11
+26.703835020401527
+21
+-112.03034054775547
+31
+227.4441643695564
+12
+28.117869673891438
+22
+-112.75500288523654
+32
+226.7225442753053
+13
+28.117869673891438
+23
+-112.75500288523654
+33
+226.7225442753053
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.689811401206637
+20
+-112.9433177411988
+30
+228.61056042409152
+11
+27.616203765198485
+21
+-112.3363902167342
+31
+229.42131824499324
+12
+26.703835020401527
+22
+-112.03034054775547
+32
+227.4441643695564
+13
+26.703835020401527
+23
+-112.03034054775547
+33
+227.4441643695564
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.486501652410794
+20
+-112.96795991136543
+30
+229.40184788831857
+11
+33.32771120595143
+21
+-112.82314913359772
+31
+227.41130814266785
+12
+34.29088541269607
+22
+-112.52713886727973
+32
+227.3748012239029
+13
+34.29088541269607
+23
+-112.52713886727973
+33
+227.3748012239029
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.486501652410794
+20
+-112.96795991136543
+30
+229.40184788831857
+11
+33.638020015452234
+21
+-113.31690520989213
+31
+229.40336900993364
+12
+33.32771120595143
+22
+-112.82314913359772
+32
+227.41130814266785
+13
+33.32771120595143
+23
+-112.82314913359772
+33
+227.41130814266785
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.51903900480855
+20
+-112.06958548542812
+30
+229.39941409373412
+11
+34.29088541269607
+21
+-112.52713886727973
+31
+227.3748012239029
+12
+35.44267869972551
+22
+-111.58039277397928
+32
+227.3671956158274
+13
+35.44267869972551
+23
+-111.58039277397928
+33
+227.3671956158274
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.51903900480855
+20
+-112.06958548542812
+30
+229.39941409373412
+11
+34.486501652410794
+21
+-112.96795991136543
+31
+229.40184788831857
+12
+34.29088541269607
+22
+-112.52713886727973
+32
+227.3748012239029
+13
+34.29088541269607
+23
+-112.52713886727973
+33
+227.3748012239029
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.616203765198485
+20
+-112.3363902167342
+30
+229.42131824499324
+11
+28.280325462394806
+21
+-112.61080055611679
+31
+231.34675398551335
+12
+26.486010405104903
+22
+-110.4684528732689
+32
+230.54846936185695
+13
+26.486010405104903
+23
+-110.4684528732689
+33
+230.54846936185695
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.486010405104903
+20
+-110.4684528732689
+30
+230.54846936185695
+11
+28.280325462394806
+21
+-112.61080055611679
+31
+231.34675398551335
+12
+27.73545969983016
+22
+-110.65555083193892
+32
+232.23813125202108
+13
+27.73545969983016
+23
+-110.65555083193892
+33
+232.23813125202108
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.02962997004232
+20
+-113.23567731564076
+30
+230.6990604017608
+11
+27.616203765198485
+21
+-112.3363902167342
+31
+229.42131824499324
+12
+28.689811401206637
+22
+-112.9433177411988
+32
+228.61056042409152
+13
+28.689811401206637
+23
+-112.9433177411988
+33
+228.61056042409152
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.02962997004232
+20
+-113.23567731564076
+30
+230.6990604017608
+11
+28.280325462394806
+21
+-112.61080055611679
+31
+231.34675398551335
+12
+27.616203765198485
+22
+-112.3363902167342
+32
+229.42131824499324
+13
+27.616203765198485
+23
+-112.3363902167342
+33
+229.42131824499324
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.77125561877622
+20
+-113.02150339222067
+30
+230.86820912537135
+11
+33.638020015452234
+21
+-113.31690520989213
+31
+229.40336900993364
+12
+34.486501652410794
+22
+-112.96795991136543
+32
+229.40184788831857
+13
+34.486501652410794
+23
+-112.96795991136543
+33
+229.40184788831857
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.77125561877622
+20
+-113.02150339222067
+30
+230.86820912537135
+11
+33.95684710599815
+21
+-113.57671278176869
+31
+230.90167380090566
+12
+33.638020015452234
+22
+-113.31690520989213
+32
+229.40336900993364
+13
+33.638020015452234
+23
+-113.31690520989213
+33
+229.40336900993364
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.75481285516455
+20
+-112.30383821416928
+30
+230.72035610437402
+11
+34.486501652410794
+21
+-112.96795991136543
+31
+229.40184788831857
+12
+35.51903900480855
+22
+-112.06958548542812
+32
+229.39941409373412
+13
+35.51903900480855
+23
+-112.06958548542812
+33
+229.39941409373412
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.75481285516455
+20
+-112.30383821416928
+30
+230.72035610437402
+11
+34.77125561877622
+21
+-113.02150339222067
+31
+230.86820912537135
+12
+34.486501652410794
+22
+-112.96795991136543
+32
+229.40184788831857
+13
+34.486501652410794
+23
+-112.96795991136543
+33
+229.40184788831857
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.280325462394806
+20
+-112.61080055611679
+30
+231.34675398551335
+11
+28.80298284937752
+21
+-112.75774090414544
+31
+232.5822089613788
+12
+27.73545969983016
+22
+-110.65555083193892
+32
+232.23813125202108
+13
+27.73545969983016
+23
+-110.65555083193892
+33
+232.23813125202108
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.73545969983016
+20
+-110.65555083193892
+30
+232.23813125202108
+11
+28.80298284937752
+21
+-112.75774090414544
+31
+232.5822089613788
+12
+28.24533966524521
+22
+-111.26369525369613
+32
+233.06288339178235
+13
+28.24533966524521
+23
+-111.26369525369613
+33
+233.06288339178235
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.49418051132441
+20
+-113.35949661511845
+30
+232.14077946864757
+11
+28.280325462394806
+21
+-112.61080055611679
+31
+231.34675398551335
+12
+29.02962997004232
+22
+-113.23567731564076
+32
+230.6990604017608
+13
+29.02962997004232
+23
+-113.23567731564076
+33
+230.6990604017608
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.49418051132441
+20
+-113.35949661511845
+30
+232.14077946864757
+11
+28.80298284937752
+21
+-112.75774090414544
+31
+232.5822089613788
+12
+28.280325462394806
+22
+-112.61080055611679
+32
+231.34675398551335
+13
+28.280325462394806
+23
+-112.61080055611679
+33
+231.34675398551335
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.005885822677673
+20
+-109.93758142956543
+30
+235.00535569439307
+11
+35.65107236100791
+21
+-112.62783711820744
+31
+232.75470415254253
+12
+35.87498146276534
+22
+-110.19799745008706
+32
+233.26671368821914
+13
+35.87498146276534
+23
+-110.19799745008706
+33
+233.26671368821914
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.005885822677673
+20
+-109.93758142956543
+30
+235.00535569439307
+11
+29.54711554353336
+21
+-112.08023333673596
+31
+234.59313173667303
+12
+35.65107236100791
+22
+-112.62783711820744
+32
+232.75470415254253
+13
+35.65107236100791
+23
+-112.62783711820744
+33
+232.75470415254253
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.893916621631433
+20
+-108.11588618320185
+30
+235.4361373358182
+11
+35.87498146276534
+21
+-110.19799745008706
+31
+233.26671368821914
+12
+35.06574476347897
+22
+-108.34253330386625
+32
+233.93448607729277
+13
+35.06574476347897
+23
+-108.34253330386625
+33
+233.93448607729277
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.893916621631433
+20
+-108.11588618320185
+30
+235.4361373358182
+11
+30.005885822677673
+21
+-109.93758142956543
+31
+235.00535569439307
+12
+35.87498146276534
+22
+-110.19799745008706
+32
+233.26671368821914
+13
+35.87498146276534
+23
+-110.19799745008706
+33
+233.26671368821914
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.59627712494252
+20
+-108.13868944379226
+30
+234.4880501046378
+11
+30.893916621631433
+21
+-108.11588618320185
+31
+235.4361373358182
+12
+35.06574476347897
+22
+-108.34253330386625
+32
+233.93448607729277
+13
+35.06574476347897
+23
+-108.34253330386625
+33
+233.93448607729277
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.893916621631433
+20
+-108.11588618320185
+30
+235.4361373358182
+11
+33.59627712494252
+21
+-108.13868944379226
+31
+234.4880501046378
+12
+33.54599240678655
+22
+-108.13111757065796
+32
+234.5075291724416
+13
+33.54599240678655
+23
+-108.13111757065796
+33
+234.5075291724416
+70
+13
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.893916621631433
+20
+-108.11588618320185
+30
+235.4361373358182
+11
+33.54599240678655
+21
+-108.13111757065796
+31
+234.5075291724416
+12
+32.331072323672394
+22
+-107.96438247032782
+32
+234.96367696213687
+13
+32.331072323672394
+23
+-107.96438247032782
+33
+234.96367696213687
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.59627712494252
+20
+-108.13868944379226
+30
+234.4880501046378
+11
+33.60303421830263
+21
+-108.1819028613013
+31
+234.54597696660318
+12
+33.54599240678655
+22
+-108.13111757065796
+32
+234.5075291724416
+13
+33.54599240678655
+23
+-108.13111757065796
+33
+234.5075291724416
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.60303421830263
+20
+-108.1819028613013
+30
+234.54597696660318
+11
+33.59627712494252
+21
+-108.13868944379226
+31
+234.4880501046378
+12
+35.06574476347897
+22
+-108.34253330386625
+32
+233.93448607729277
+13
+35.06574476347897
+23
+-108.34253330386625
+33
+233.93448607729277
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.86953472528566
+20
+-113.84290906442916
+30
+232.74861966608137
+11
+30.655404752368074
+21
+-113.71209260552217
+31
+233.65034055957193
+12
+31.959614425240556
+22
+-113.87333149673309
+32
+233.16175629676968
+13
+31.959614425240556
+23
+-113.87333149673309
+33
+233.16175629676968
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.49897484965543
+20
+-106.17676034814116
+30
+220.9298089403024
+11
+34.14820420519031
+21
+-109.88860131355207
+31
+220.71776458714263
+12
+33.487124751224385
+22
+-106.40949195526656
+32
+220.21670712709636
+13
+33.487124751224385
+23
+-106.40949195526656
+33
+220.21670712709636
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.487124751224385
+20
+-106.40949195526656
+30
+220.21670712709636
+11
+34.14820420519031
+21
+-109.88860131355207
+31
+220.71776458714263
+12
+32.18899956481271
+22
+-109.8079818679462
+32
+219.32046227141953
+13
+32.18899956481271
+23
+-109.8079818679462
+33
+219.32046227141953
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.913068103815437
+20
+-112.13134302300291
+30
+220.0004036334137
+11
+28.9830836486172
+21
+-111.4723931392983
+31
+220.44852606125175
+12
+31.22765070400632
+22
+-110.9609920522677
+32
+219.03388295911583
+13
+31.22765070400632
+23
+-110.9609920522677
+33
+219.03388295911583
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.9830836486172
+20
+-111.4723931392983
+30
+220.44852606125175
+11
+31.913068103815437
+21
+-112.13134302300291
+31
+220.0004036334137
+12
+29.238632079970824
+22
+-112.17606399848992
+32
+221.0326367614881
+13
+29.238632079970824
+23
+-112.17606399848992
+33
+221.0326367614881
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.308574373934952
+20
+-105.13783428496201
+30
+230.43955705421004
+11
+28.517316210042956
+21
+-105.97171315441481
+31
+231.16969542950582
+12
+29.114508556170495
+22
+-107.11559660904567
+32
+232.87761077905208
+13
+29.114508556170495
+23
+-107.11559660904567
+33
+232.87761077905208
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.641700007663754
+20
+-106.01430455964078
+30
+232.42827145392226
+11
+31.308574373934952
+21
+-105.13783428496201
+31
+230.43955705421004
+12
+29.114508556170495
+22
+-107.11559660904567
+32
+232.87761077905208
+13
+29.114508556170495
+23
+-107.11559660904567
+33
+232.87761077905208
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.96842228044119
+20
+-105.29785627888108
+30
+229.98869660746468
+11
+31.308574373934952
+21
+-105.13783428496201
+31
+230.43955705421004
+12
+31.641700007663754
+22
+-106.01430455964078
+32
+232.42827145392226
+13
+31.641700007663754
+23
+-106.01430455964078
+33
+232.42827145392226
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.282077557495434
+20
+-106.28658532876156
+30
+231.7948764133529
+11
+32.96842228044119
+21
+-105.29785627888108
+31
+229.98869660746468
+12
+31.641700007663754
+22
+-106.01430455964078
+32
+232.42827145392226
+13
+31.641700007663754
+23
+-106.01430455964078
+33
+232.42827145392226
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.27718066799174
+20
+-106.5153620196868
+30
+229.24060899710904
+11
+32.96842228044119
+21
+-105.29785627888108
+31
+229.98869660746468
+12
+33.282077557495434
+22
+-106.28658532876156
+32
+231.7948764133529
+13
+33.282077557495434
+23
+-106.28658532876156
+33
+231.7948764133529
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.39674082694646
+20
+-107.40917308077869
+30
+230.6753309045654
+11
+35.27718066799174
+21
+-106.5153620196868
+31
+229.24060899710904
+12
+33.282077557495434
+22
+-106.28658532876156
+32
+231.7948764133529
+13
+33.282077557495434
+23
+-106.28658532876156
+33
+231.7948764133529
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+36.246743585520235
+20
+-108.63884779450575
+30
+228.24275321753728
+11
+35.27718066799174
+21
+-106.5153620196868
+31
+229.24060899710904
+12
+35.39674082694646
+22
+-107.40917308077869
+32
+230.6753309045654
+13
+35.39674082694646
+23
+-107.40917308077869
+33
+230.6753309045654
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+36.246743585520235
+20
+-108.63884779450575
+30
+228.24275321753728
+11
+35.39674082694646
+21
+-107.40917308077869
+31
+230.6753309045654
+12
+36.05599493497415
+22
+-109.3781128994934
+32
+230.0221612829981
+13
+36.05599493497415
+23
+-109.3781128994934
+33
+230.0221612829981
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.51903900480855
+20
+-112.06958548542812
+30
+229.39941409373412
+11
+36.14574111027098
+21
+-109.68477101711805
+31
+231.1906869077943
+12
+35.75481285516455
+22
+-112.30383821416928
+32
+230.72035610437402
+13
+35.75481285516455
+23
+-112.30383821416928
+33
+230.72035610437402
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.51903900480855
+20
+-112.06958548542812
+30
+229.39941409373412
+11
+36.05599493497415
+21
+-109.3781128994934
+31
+230.0221612829981
+12
+36.14574111027098
+22
+-109.68477101711805
+32
+231.1906869077943
+13
+36.14574111027098
+23
+-109.68477101711805
+33
+231.1906869077943
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.95684710599815
+20
+-113.57671278176869
+30
+230.90167380090566
+11
+31.133341163863918
+21
+-113.62690979507005
+31
+229.95401503463597
+12
+33.638020015452234
+22
+-113.31690520989213
+32
+229.40336900993364
+13
+33.638020015452234
+23
+-113.31690520989213
+33
+229.40336900993364
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.95684710599815
+20
+-113.57671278176869
+30
+230.90167380090566
+11
+31.478635770514334
+21
+-113.8161373240013
+31
+231.44501844185496
+12
+31.133341163863918
+22
+-113.62690979507005
+32
+229.95401503463597
+13
+31.133341163863918
+23
+-113.62690979507005
+33
+229.95401503463597
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.478635770514334
+20
+-113.8161373240013
+30
+231.44501844185496
+11
+29.02962997004232
+21
+-113.23567731564076
+31
+230.6990604017608
+12
+31.133341163863918
+22
+-113.62690979507005
+32
+229.95401503463597
+13
+31.133341163863918
+23
+-113.62690979507005
+33
+229.95401503463597
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.478635770514334
+20
+-113.8161373240013
+30
+231.44501844185496
+11
+29.49418051132441
+21
+-113.35949661511845
+31
+232.14077946864757
+12
+29.02962997004232
+22
+-113.23567731564076
+32
+230.6990604017608
+13
+29.02962997004232
+23
+-113.23567731564076
+33
+230.6990604017608
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.629820608897674
+20
+-112.37046334091293
+30
+222.06182764633272
+11
+29.238632079970824
+21
+-112.17606399848992
+31
+221.0326367614881
+12
+31.913068103815437
+22
+-112.13134302300291
+32
+220.0004036334137
+13
+31.913068103815437
+23
+-112.13134302300291
+33
+220.0004036334137
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.629820608897674
+20
+-112.37046334091293
+30
+222.06182764633272
+11
+29.802968199209996
+21
+-112.68655241255148
+31
+222.5075162795862
+12
+29.238632079970824
+22
+-112.17606399848992
+32
+221.0326367614881
+13
+29.238632079970824
+23
+-112.17606399848992
+33
+221.0326367614881
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.802968199209996
+20
+-112.68655241255148
+30
+222.5075162795862
+11
+27.2064136020636
+21
+-111.95306756970187
+31
+221.9161041955966
+12
+29.238632079970824
+22
+-112.17606399848992
+32
+221.0326367614881
+13
+29.238632079970824
+23
+-112.17606399848992
+33
+221.0326367614881
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.802968199209996
+20
+-112.68655241255148
+30
+222.5075162795862
+11
+27.388035522918475
+21
+-112.24542714414362
+31
+223.21727162523828
+12
+27.2064136020636
+22
+-111.95306756970187
+32
+221.9161041955966
+13
+27.2064136020636
+23
+-111.95306756970187
+33
+221.9161041955966
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+22.688682404919618
+20
+-108.93120736894615
+30
+224.2218203399175
+11
+23.209210221641058
+21
+-109.13138697350698
+31
+225.4797879156879
+12
+23.731867608623766
+22
+-106.32522181778593
+32
+225.81838958723208
+13
+23.731867608623766
+23
+-106.32522181778593
+33
+225.81838958723208
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.209210221641058
+20
+-109.13138697350698
+30
+225.4797879156879
+11
+24.22136454439513
+21
+-106.90233535859315
+31
+226.82415519920193
+12
+23.731867608623766
+22
+-106.32522181778593
+32
+225.81838958723208
+13
+23.731867608623766
+23
+-106.32522181778593
+33
+225.81838958723208
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.645075775552236
+20
+-101.71378952914574
+30
+226.31670902837283
+11
+26.91831316814471
+21
+-104.08552235156613
+31
+228.40977237088742
+12
+30.81512252196408
+22
+-103.09709752600902
+32
+227.73926196290753
+13
+30.81512252196408
+23
+-103.09709752600902
+33
+227.73926196290753
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.37974821535879
+20
+-101.80596949902659
+30
+225.21602542761406
+11
+29.645075775552236
+21
+-101.71378952914574
+31
+226.31670902837283
+12
+30.81512252196408
+22
+-103.09709752600902
+32
+227.73926196290753
+13
+30.81512252196408
+23
+-103.09709752600902
+33
+227.73926196290753
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.45408150135321
+20
+-102.04265602235168
+30
+225.0946399227211
+11
+23.731867608623766
+21
+-106.32522181778593
+31
+225.81838958723208
+12
+24.22136454439513
+22
+-106.90233535859315
+32
+226.82415519920193
+13
+24.22136454439513
+23
+-106.90233535859315
+33
+226.82415519920193
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.12783582571415
+20
+-103.27750254957135
+30
+226.94493225545
+11
+32.37974821535879
+21
+-101.80596949902659
+31
+225.21602542761406
+12
+30.81512252196408
+22
+-103.09709752600902
+32
+227.73926196290753
+13
+30.81512252196408
+23
+-103.09709752600902
+33
+227.73926196290753
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.37211330694778
+20
+-103.54734952410712
+30
+223.62188997488406
+11
+32.37974821535879
+21
+-101.80596949902659
+31
+225.21602542761406
+12
+33.12783582571415
+22
+-103.27750254957135
+32
+226.94493225545
+13
+33.12783582571415
+23
+-103.27750254957135
+33
+226.94493225545
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.45408150135321
+20
+-102.04265602235168
+30
+225.0946399227211
+11
+24.22136454439513
+21
+-106.90233535859315
+31
+226.82415519920193
+12
+26.12520035797945
+22
+-102.3243677454871
+32
+226.5229731193938
+13
+26.12520035797945
+23
+-102.3243677454871
+33
+226.5229731193938
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.07913063369271
+20
+-104.50261389845315
+30
+225.31946169744697
+11
+34.37211330694778
+21
+-103.54734952410712
+31
+223.62188997488406
+12
+33.12783582571415
+22
+-103.27750254957135
+32
+226.94493225545
+13
+33.12783582571415
+23
+-103.27750254957135
+33
+226.94493225545
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.109032518355757
+20
+-101.2814867661057
+30
+225.50321318856368
+11
+25.45408150135321
+21
+-102.04265602235168
+31
+225.0946399227211
+12
+26.12520035797945
+22
+-102.3243677454871
+32
+226.5229731193938
+13
+26.12520035797945
+23
+-102.3243677454871
+33
+226.5229731193938
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.645075775552236
+20
+-101.71378952914574
+30
+226.31670902837283
+11
+29.109032518355757
+21
+-101.2814867661057
+31
+225.50321318856368
+12
+26.12520035797945
+22
+-102.3243677454871
+32
+226.5229731193938
+13
+26.12520035797945
+23
+-102.3243677454871
+33
+226.5229731193938
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.633485950941672
+20
+-101.76368231812381
+30
+224.34168472319712
+11
+29.109032518355757
+21
+-101.2814867661057
+31
+225.50321318856368
+12
+29.645075775552236
+22
+-101.71378952914574
+32
+226.31670902837283
+13
+29.645075775552236
+23
+-101.71378952914574
+33
+226.31670902837283
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.37974821535879
+20
+-101.80596949902659
+30
+225.21602542761406
+11
+31.633485950941672
+21
+-101.76368231812381
+31
+224.34168472319712
+12
+29.645075775552236
+22
+-101.71378952914574
+32
+226.31670902837283
+13
+29.645075775552236
+23
+-101.71378952914574
+33
+226.31670902837283
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.634065099252744
+20
+-103.70767574234884
+30
+222.25866078334178
+11
+31.633485950941672
+21
+-101.76368231812381
+31
+224.34168472319712
+12
+32.37974821535879
+22
+-101.80596949902659
+32
+225.21602542761406
+13
+32.37974821535879
+23
+-101.80596949902659
+33
+225.21602542761406
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.37211330694778
+20
+-103.54734952410712
+30
+223.62188997488406
+11
+33.634065099252744
+21
+-103.70767574234884
+31
+222.25866078334178
+12
+32.37974821535879
+22
+-101.80596949902659
+32
+225.21602542761406
+13
+32.37974821535879
+23
+-101.80596949902659
+33
+225.21602542761406
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.49897484965543
+20
+-106.17676034814116
+30
+220.9298089403024
+11
+33.634065099252744
+21
+-103.70767574234884
+31
+222.25866078334178
+12
+34.37211330694778
+22
+-103.54734952410712
+32
+223.62188997488406
+13
+34.37211330694778
+23
+-103.54734952410712
+33
+223.62188997488406
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.22059494390631
+20
+-107.35745494585977
+30
+222.41472786106036
+11
+35.63221045297943
+21
+-107.81287875745102
+31
+224.0067337435285
+12
+35.26136100319367
+22
+-110.51834566224561
+32
+223.48042566466867
+13
+35.26136100319367
+23
+-110.51834566224561
+33
+223.48042566466867
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.81932306181655
+20
+-110.1006456667113
+30
+221.9091070361672
+11
+35.22059494390631
+21
+-107.35745494585977
+31
+222.41472786106036
+12
+35.26136100319367
+22
+-110.51834566224561
+32
+223.48042566466867
+13
+35.26136100319367
+23
+-110.51834566224561
+33
+223.48042566466867
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.01557705051242
+20
+-112.40453646509364
+30
+223.65809266932345
+11
+29.802968199209996
+21
+-112.68655241255148
+31
+222.5075162795862
+12
+32.629820608897674
+22
+-112.37046334091293
+32
+222.06182764633272
+13
+32.629820608897674
+23
+-112.37046334091293
+33
+222.06182764633272
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.01557705051242
+20
+-112.40453646509364
+30
+223.65809266932345
+11
+30.271169432368556
+21
+-112.91593755212403
+31
+224.15762900775476
+12
+29.802968199209996
+22
+-112.68655241255148
+32
+222.5075162795862
+13
+29.802968199209996
+23
+-112.68655241255148
+33
+222.5075162795862
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.271169432368556
+20
+-112.91593755212403
+30
+224.15762900775476
+11
+27.388035522918475
+21
+-112.24542714414362
+31
+223.21727162523828
+12
+29.802968199209996
+22
+-112.68655241255148
+32
+222.5075162795862
+13
+29.802968199209996
+23
+-112.68655241255148
+33
+222.5075162795862
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.271169432368556
+20
+-112.91593755212403
+30
+224.15762900775476
+11
+27.670051470376563
+21
+-112.48880660257609
+31
+224.9178855910321
+12
+27.388035522918475
+22
+-112.24542714414362
+32
+223.21727162523828
+13
+27.388035522918475
+23
+-112.24542714414362
+33
+223.21727162523828
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.209210221641058
+20
+-109.13138697350698
+30
+225.4797879156879
+11
+24.203415309335774
+21
+-109.66560488476543
+31
+226.99421659578087
+12
+24.22136454439513
+22
+-106.90233535859315
+32
+226.82415519920193
+13
+24.22136454439513
+23
+-106.90233535859315
+33
+226.82415519920193
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.22136454439513
+20
+-106.90233535859315
+30
+226.82415519920193
+11
+24.203415309335774
+21
+-109.66560488476543
+31
+226.99421659578087
+12
+24.61472659408585
+22
+-107.17644147365235
+32
+227.75964499255014
+13
+24.61472659408585
+23
+-107.17644147365235
+33
+227.75964499255014
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.12520035797945
+20
+-102.3243677454871
+30
+226.5229731193938
+11
+24.22136454439513
+21
+-106.90233535859315
+31
+226.82415519920193
+12
+24.61472659408585
+22
+-107.17644147365235
+32
+227.75964499255014
+13
+24.61472659408585
+23
+-107.17644147365235
+33
+227.75964499255014
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.12520035797945
+20
+-102.3243677454871
+30
+226.5229731193938
+11
+24.61472659408585
+21
+-107.17644147365235
+31
+227.75964499255014
+12
+26.91831316814471
+22
+-104.08552235156613
+32
+228.40977237088742
+13
+26.91831316814471
+23
+-104.08552235156613
+33
+228.40977237088742
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.645075775552236
+20
+-101.71378952914574
+30
+226.31670902837283
+11
+26.12520035797945
+21
+-102.3243677454871
+31
+226.5229731193938
+12
+26.91831316814471
+22
+-104.08552235156613
+32
+228.40977237088742
+13
+26.91831316814471
+23
+-104.08552235156613
+33
+228.40977237088742
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.22059494390631
+20
+-107.35745494585977
+30
+222.41472786106036
+11
+34.37211330694778
+21
+-103.54734952410712
+31
+223.62188997488406
+12
+35.07913063369271
+22
+-104.50261389845315
+32
+225.31946169744697
+13
+35.07913063369271
+23
+-104.50261389845315
+33
+225.31946169744697
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.37211330694778
+20
+-103.54734952410712
+30
+223.62188997488406
+11
+35.22059494390631
+21
+-107.35745494585977
+31
+222.41472786106036
+12
+34.49897484965543
+22
+-106.17676034814116
+32
+220.9298089403024
+13
+34.49897484965543
+23
+-106.17676034814116
+33
+220.9298089403024
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.22059494390631
+20
+-107.35745494585977
+30
+222.41472786106036
+11
+35.07913063369271
+21
+-104.50261389845315
+31
+225.31946169744697
+12
+35.63221045297943
+22
+-107.81287875745102
+32
+224.0067337435285
+13
+35.63221045297943
+23
+-107.81287875745102
+33
+224.0067337435285
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.63221045297943
+20
+-107.81287875745102
+30
+224.0067337435285
+11
+36.06846813221882
+21
+-108.40946265493298
+31
+225.87832177887046
+12
+35.429292829511745
+22
+-110.96312162253061
+32
+225.4365880618158
+13
+35.429292829511745
+23
+-110.96312162253061
+33
+225.4365880618158
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.26136100319367
+20
+-110.51834566224561
+30
+223.48042566466867
+11
+35.63221045297943
+21
+-107.81287875745102
+31
+224.0067337435285
+12
+35.429292829511745
+22
+-110.96312162253061
+32
+225.4365880618158
+13
+35.429292829511745
+23
+-110.96312162253061
+33
+225.4365880618158
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.189897587614304
+20
+-112.53048533483275
+30
+225.47674567245633
+11
+30.271169432368556
+21
+-112.91593755212403
+31
+224.15762900775476
+12
+33.01557705051242
+22
+-112.40453646509364
+32
+223.65809266932345
+13
+33.01557705051242
+23
+-112.40453646509364
+33
+223.65809266932345
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.189897587614304
+20
+-112.53048533483275
+30
+225.47674567245633
+11
+30.53097700424471
+21
+-113.02089494357335
+31
+226.05203386732512
+12
+30.271169432368556
+22
+-112.91593755212403
+32
+224.15762900775476
+13
+30.271169432368556
+23
+-112.91593755212403
+33
+224.15762900775476
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.53097700424471
+20
+-113.02089494357335
+30
+226.05203386732512
+11
+27.670051470376563
+21
+-112.48880660257609
+31
+224.9178855910321
+12
+30.271169432368556
+22
+-112.91593755212403
+32
+224.15762900775476
+13
+30.271169432368556
+23
+-112.91593755212403
+33
+224.15762900775476
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.53097700424471
+20
+-113.02089494357335
+30
+226.05203386732512
+11
+28.117869673891438
+21
+-112.75500288523654
+31
+226.7225442753053
+12
+27.670051470376563
+22
+-112.48880660257609
+32
+224.9178855910321
+13
+27.670051470376563
+23
+-112.48880660257609
+33
+224.9178855910321
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.203415309335774
+20
+-109.66560488476543
+30
+226.99421659578087
+11
+25.031513916650653
+21
+-110.0130290616776
+31
+228.83872866637225
+12
+24.61472659408585
+22
+-107.17644147365235
+32
+227.75964499255014
+13
+24.61472659408585
+23
+-107.17644147365235
+33
+227.75964499255014
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.61472659408585
+20
+-107.17644147365235
+30
+227.75964499255014
+11
+25.031513916650653
+21
+-110.0130290616776
+31
+228.83872866637225
+12
+25.671601892326805
+22
+-107.85516593835511
+32
+229.76570017867576
+13
+25.671601892326805
+23
+-107.85516593835511
+33
+229.76570017867576
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.61472659408585
+20
+-107.17644147365235
+30
+227.75964499255014
+11
+25.671601892326805
+21
+-107.85516593835511
+31
+229.76570017867576
+12
+26.91831316814471
+22
+-104.08552235156613
+32
+228.40977237088742
+13
+26.91831316814471
+23
+-104.08552235156613
+33
+228.40977237088742
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.91831316814471
+20
+-104.08552235156613
+30
+228.40977237088742
+11
+25.671601892326805
+21
+-107.85516593835511
+31
+229.76570017867576
+12
+27.70503726752617
+22
+-104.71161600838279
+32
+229.84175625943652
+13
+27.70503726752617
+23
+-104.71161600838279
+33
+229.84175625943652
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.81512252196408
+20
+-103.09709752600902
+30
+227.73926196290753
+11
+26.91831316814471
+21
+-104.08552235156613
+31
+228.40977237088742
+12
+27.70503726752617
+22
+-104.71161600838279
+32
+229.84175625943652
+13
+27.70503726752617
+23
+-104.71161600838279
+33
+229.84175625943652
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.101093385621677
+20
+-104.11868280277763
+30
+228.98871125763256
+11
+30.81512252196408
+21
+-103.09709752600902
+31
+227.73926196290753
+12
+27.70503726752617
+22
+-104.71161600838279
+32
+229.84175625943652
+13
+27.70503726752617
+23
+-104.71161600838279
+33
+229.84175625943652
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.12783582571415
+20
+-103.27750254957135
+30
+226.94493225545
+11
+30.81512252196408
+21
+-103.09709752600902
+31
+227.73926196290753
+12
+31.101093385621677
+22
+-104.11868280277763
+32
+228.98871125763256
+13
+31.101093385621677
+23
+-104.11868280277763
+33
+228.98871125763256
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.12783582571415
+20
+-103.27750254957135
+30
+226.94493225545
+11
+31.101093385621677
+21
+-104.11868280277763
+31
+228.98871125763256
+12
+32.89662534020375
+22
+-104.13480669189859
+32
+228.269524957966
+13
+32.89662534020375
+23
+-104.13480669189859
+33
+228.269524957966
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.181423257071753
+20
+-105.31915198149154
+30
+221.53886603502863
+11
+29.55958874077803
+21
+-107.8067942709898
+31
+222.42963485288922
+12
+29.071004477975755
+22
+-106.54517600334322
+32
+223.28572209792404
+13
+29.071004477975755
+23
+-106.54517600334322
+33
+223.28572209792404
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.081927253270155
+20
+-106.75296121597883
+30
+220.64657609555172
+11
+29.55958874077803
+21
+-107.8067942709898
+31
+222.42963485288922
+12
+30.181423257071753
+22
+-105.31915198149154
+32
+221.53886603502863
+13
+30.181423257071753
+23
+-105.31915198149154
+33
+221.53886603502863
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.304634107902988
+20
+-109.03251406851749
+30
+220.3484362589723
+11
+29.165009793795118
+21
+-109.74926657359998
+31
+221.34112022505164
+12
+29.514259316645035
+22
+-108.81712324780555
+32
+221.80232429878012
+13
+29.514259316645035
+23
+-108.81712324780555
+33
+221.80232429878012
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.287641496315295
+20
+-107.71309317949373
+30
+222.88323331854187
+11
+27.15256589688552
+21
+-109.27041748913518
+31
+222.0371854761672
+12
+25.594937362920724
+22
+-108.08637642386381
+32
+222.3976912989699
+13
+25.594937362920724
+23
+-108.08637642386381
+33
+222.3976912989699
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.287641496315295
+20
+-107.71309317949373
+30
+222.88323331854187
+11
+28.19118773574408
+21
+-109.13169119782896
+31
+222.10746129478915
+12
+27.15256589688552
+22
+-109.27041748913518
+32
+222.0371854761672
+13
+27.15256589688552
+23
+-109.27041748913518
+33
+222.0371854761672
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.791741199592558
+20
+-106.42105247954292
+30
+223.4423976242897
+11
+25.594937362920724
+21
+-108.08637642386381
+31
+222.3976912989699
+12
+25.559951565771115
+22
+-106.46820724961398
+32
+222.96719923170122
+13
+25.559951565771115
+23
+-106.46820724961398
+33
+222.96719923170122
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.791741199592558
+20
+-106.42105247954292
+30
+223.4423976242897
+11
+27.287641496315295
+21
+-107.71309317949373
+31
+222.88323331854187
+12
+25.594937362920724
+22
+-108.08637642386381
+32
+222.3976912989699
+13
+25.594937362920724
+23
+-108.08637642386381
+33
+222.3976912989699
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.03574375683815
+20
+-104.83117616733591
+30
+223.6221941992068
+11
+27.791741199592558
+21
+-106.42105247954292
+31
+223.4423976242897
+12
+25.559951565771115
+22
+-106.46820724961398
+32
+222.96719923170122
+13
+25.559951565771115
+23
+-106.46820724961398
+33
+222.96719923170122
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.19118773574408
+20
+-109.13169119782896
+30
+222.10746129478915
+11
+28.471682561586956
+21
+-109.58437699051235
+31
+221.58084899160716
+12
+27.15256589688552
+22
+-109.27041748913518
+32
+222.0371854761672
+13
+27.15256589688552
+23
+-109.27041748913518
+33
+222.0371854761672
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.471682561586956
+20
+-109.58437699051235
+30
+221.58084899160716
+11
+28.19118773574408
+21
+-109.13169119782896
+31
+222.10746129478915
+12
+29.165009793795118
+22
+-109.74926657359998
+32
+221.34112022505164
+13
+29.165009793795118
+23
+-109.74926657359998
+33
+221.34112022505164
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.594937362920724
+20
+-108.08637642386381
+30
+222.3976912989699
+11
+27.15256589688552
+21
+-109.27041748913518
+31
+222.0371854761672
+12
+25.84683510239784
+22
+-109.98199818072575
+32
+221.98729268718822
+13
+25.84683510239784
+23
+-109.98199818072575
+33
+221.98729268718822
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.594937362920724
+20
+-108.08637642386381
+30
+222.3976912989699
+11
+25.84683510239784
+21
+-109.98199818072575
+31
+221.98729268718822
+12
+23.908317715986975
+22
+-108.32853898500342
+32
+222.43298132044222
+13
+23.908317715986975
+23
+-108.32853898500342
+33
+222.43298132044222
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.17896016215239
+20
+-106.44904111726173
+30
+220.1333496625833
+11
+31.00100358334151
+21
+-109.19131916514407
+31
+219.20333590704968
+12
+31.081927253270155
+22
+-106.75296121597883
+32
+220.64657609555172
+13
+31.081927253270155
+23
+-106.75296121597883
+33
+220.64657609555172
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.00100358334151
+20
+-109.19131916514407
+30
+219.20333590704968
+11
+30.304634107902988
+21
+-109.03251406851749
+31
+220.3484362589723
+12
+31.081927253270155
+22
+-106.75296121597883
+32
+220.64657609555172
+13
+31.081927253270155
+23
+-106.75296121597883
+33
+220.64657609555172
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.534627696121195
+20
+-110.19860589872971
+30
+219.33719460918667
+11
+29.165009793795118
+21
+-109.74926657359998
+31
+221.34112022505164
+12
+30.304634107902988
+22
+-109.03251406851749
+32
+220.3484362589723
+13
+30.304634107902988
+23
+-109.03251406851749
+33
+220.3484362589723
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.534627696121195
+20
+-110.19860589872971
+30
+219.33719460918667
+11
+28.977303386479438
+21
+-110.71700414519005
+31
+220.72476174657194
+12
+29.165009793795118
+22
+-109.74926657359998
+32
+221.34112022505164
+13
+29.165009793795118
+23
+-109.74926657359998
+33
+221.34112022505164
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.559951565771115
+20
+-106.46820724961398
+30
+222.96719923170122
+11
+25.594937362920724
+21
+-108.08637642386381
+31
+222.3976912989699
+12
+23.908317715986975
+22
+-108.32853898500342
+32
+222.43298132044222
+13
+23.908317715986975
+23
+-108.32853898500342
+33
+222.43298132044222
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.17846891484649
+20
+-106.05476639460278
+30
+223.60911255331573
+11
+25.559951565771115
+21
+-106.46820724961398
+31
+222.96719923170122
+12
+23.908317715986975
+22
+-108.32853898500342
+32
+222.43298132044222
+13
+23.908317715986975
+23
+-108.32853898500342
+33
+222.43298132044222
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.03574375683815
+20
+-104.83117616733591
+30
+223.6221941992068
+11
+25.559951565771115
+21
+-106.46820724961398
+31
+222.96719923170122
+12
+24.17846891484649
+22
+-106.05476639460278
+32
+223.60911255331573
+13
+24.17846891484649
+23
+-106.05476639460278
+33
+223.60911255331573
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.393845085391288
+20
+-103.86039635251531
+30
+223.56317468053692
+11
+27.03574375683815
+21
+-104.83117616733591
+31
+223.6221941992068
+12
+24.17846891484649
+22
+-106.05476639460278
+32
+223.60911255331573
+13
+24.17846891484649
+23
+-106.05476639460278
+33
+223.60911255331573
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.393845085391288
+20
+-103.86039635251531
+30
+223.56317468053692
+11
+28.831579935743274
+21
+-104.86372816990126
+31
+223.66995741792368
+12
+27.03574375683815
+22
+-104.83117616733591
+32
+223.6221941992068
+13
+27.03574375683815
+23
+-104.83117616733591
+33
+223.6221941992068
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.831579935743274
+20
+-104.86372816990126
+30
+223.66995741792368
+11
+25.393845085391288
+21
+-103.86039635251531
+31
+223.56317468053692
+12
+27.9182985179772
+22
+-103.8643512687152
+32
+224.5470361412483
+13
+27.9182985179772
+23
+-103.8643512687152
+33
+224.5470361412483
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.65724474847384
+20
+-104.70644419488926
+30
+222.58813572519384
+11
+28.831579935743274
+21
+-104.86372816990126
+31
+223.66995741792368
+12
+27.9182985179772
+22
+-103.8643512687152
+32
+224.5470361412483
+13
+27.9182985179772
+23
+-103.8643512687152
+33
+224.5470361412483
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.328074030944556
+20
+-103.49958630538994
+30
+223.9468015518907
+11
+29.65724474847384
+21
+-104.70644419488926
+31
+222.58813572519384
+12
+27.9182985179772
+22
+-103.8643512687152
+32
+224.5470361412483
+13
+27.9182985179772
+23
+-103.8643512687152
+33
+224.5470361412483
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.181423257071753
+20
+-105.31915198149154
+30
+221.53886603502863
+11
+29.65724474847384
+21
+-104.70644419488926
+31
+222.58813572519384
+12
+29.328074030944556
+22
+-103.49958630538994
+32
+223.9468015518907
+13
+29.328074030944556
+23
+-103.49958630538994
+33
+223.9468015518907
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.226433806714155
+20
+-104.34441725047121
+30
+220.8920851242459
+11
+30.181423257071753
+21
+-105.31915198149154
+31
+221.53886603502863
+12
+29.328074030944556
+22
+-103.49958630538994
+32
+223.9468015518907
+13
+29.328074030944556
+23
+-103.49958630538994
+33
+223.9468015518907
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.226433806714155
+20
+-104.34441725047121
+30
+220.8920851242459
+11
+31.081927253270155
+21
+-106.75296121597883
+31
+220.64657609555172
+12
+30.181423257071753
+22
+-105.31915198149154
+32
+221.53886603502863
+13
+30.181423257071753
+23
+-105.31915198149154
+33
+221.53886603502863
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.226433806714155
+20
+-104.34441725047121
+30
+220.8920851242459
+11
+32.17896016215239
+21
+-106.44904111726173
+31
+220.1333496625833
+12
+31.081927253270155
+22
+-106.75296121597883
+32
+220.64657609555172
+13
+31.081927253270155
+23
+-106.75296121597883
+33
+220.64657609555172
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.00100358334151
+20
+-109.19131916514407
+30
+219.20333590704968
+11
+32.18899956481271
+21
+-109.8079818679462
+31
+219.32046227141953
+12
+31.628009913126952
+22
+-110.40334886813544
+32
+219.2532286960279
+13
+31.628009913126952
+23
+-110.40334886813544
+33
+219.2532286960279
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.00100358334151
+20
+-109.19131916514407
+30
+219.20333590704968
+11
+31.628009913126952
+21
+-110.40334886813544
+31
+219.2532286960279
+12
+30.534627696121195
+22
+-110.19860589872971
+32
+219.33719460918667
+13
+30.534627696121195
+23
+-110.19860589872971
+33
+219.33719460918667
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.534627696121195
+20
+-110.19860589872971
+30
+219.33719460918667
+11
+31.628009913126952
+21
+-110.40334886813544
+31
+219.2532286960279
+12
+31.22765070400632
+22
+-110.9609920522677
+32
+219.03388295911583
+13
+31.22765070400632
+23
+-110.9609920522677
+33
+219.03388295911583
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.84683510239784
+20
+-109.98199818072575
+30
+221.98729268718822
+11
+27.569048995127297
+21
+-110.54815964590307
+31
+221.58389123483695
+12
+27.22162481821561
+22
+-111.25761076723234
+32
+221.50053377032413
+13
+27.22162481821561
+23
+-111.25761076723234
+33
+221.50053377032413
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.84683510239784
+20
+-109.98199818072575
+30
+221.98729268718822
+11
+27.22162481821561
+21
+-111.25761076723234
+31
+221.50053377032413
+12
+25.34547341802792
+22
+-110.67897610481045
+32
+222.22732567806653
+13
+25.34547341802792
+23
+-110.67897610481045
+33
+222.22732567806653
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.174528648814487
+20
+-108.73741647516935
+30
+222.98606113972906
+11
+22.688682404919618
+21
+-108.93120736894615
+31
+224.2218203399175
+12
+23.146540011094807
+22
+-105.7520631931783
+32
+224.10986578903933
+13
+23.146540011094807
+23
+-105.7520631931783
+33
+224.10986578903933
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.146540011094807
+20
+-105.7520631931783
+30
+224.10986578903933
+11
+22.688682404919618
+21
+-108.93120736894615
+31
+224.2218203399175
+12
+23.731867608623766
+22
+-106.32522181778593
+32
+225.81838958723208
+13
+23.731867608623766
+23
+-106.32522181778593
+33
+225.81838958723208
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.146540011094807
+20
+-105.7520631931783
+30
+224.10986578903933
+11
+23.731867608623766
+21
+-106.32522181778593
+31
+225.81838958723208
+12
+25.004133727577052
+22
+-102.56987677417979
+32
+224.29087926124927
+13
+25.004133727577052
+23
+-102.56987677417979
+33
+224.29087926124927
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.004133727577052
+20
+-102.56987677417979
+30
+224.29087926124927
+11
+23.731867608623766
+21
+-106.32522181778593
+31
+225.81838958723208
+12
+25.45408150135321
+22
+-102.04265602235168
+32
+225.0946399227211
+13
+25.45408150135321
+23
+-102.04265602235168
+33
+225.0946399227211
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.686769157976236
+20
+-101.84886512857516
+30
+224.958955874645
+11
+25.004133727577052
+21
+-102.56987677417979
+31
+224.29087926124927
+12
+25.45408150135321
+22
+-102.04265602235168
+32
+225.0946399227211
+13
+25.45408150135321
+23
+-102.04265602235168
+33
+225.0946399227211
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.109032518355757
+20
+-101.2814867661057
+30
+225.50321318856368
+11
+28.686769157976236
+21
+-101.84886512857516
+31
+224.958955874645
+12
+25.45408150135321
+22
+-102.04265602235168
+32
+225.0946399227211
+13
+25.45408150135321
+23
+-102.04265602235168
+33
+225.0946399227211
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.241051224387597
+20
+-102.39464356410872
+30
+224.21482318048933
+11
+28.686769157976236
+21
+-101.84886512857516
+31
+224.958955874645
+12
+29.109032518355757
+22
+-101.2814867661057
+32
+225.50321318856368
+13
+29.109032518355757
+23
+-101.2814867661057
+33
+225.50321318856368
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.109032518355757
+20
+-101.2814867661057
+30
+225.50321318856368
+11
+31.633485950941672
+21
+-101.76368231812381
+31
+224.34168472319712
+12
+30.241051224387597
+22
+-102.39464356410872
+32
+224.21482318048933
+13
+30.241051224387597
+23
+-102.39464356410872
+33
+224.21482318048933
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.55984901459848
+20
+-103.9029877577403
+30
+221.41504673555178
+11
+30.241051224387597
+21
+-102.39464356410872
+31
+224.21482318048933
+12
+31.633485950941672
+22
+-101.76368231812381
+32
+224.34168472319712
+13
+31.633485950941672
+23
+-101.76368231812381
+33
+224.34168472319712
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.634065099252744
+20
+-103.70767574234884
+30
+222.25866078334178
+11
+32.55984901459848
+21
+-103.9029877577403
+31
+221.41504673555178
+12
+31.633485950941672
+22
+-101.76368231812381
+32
+224.34168472319712
+13
+31.633485950941672
+23
+-101.76368231812381
+33
+224.34168472319712
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.634065099252744
+20
+-103.70767574234884
+30
+222.25866078334178
+11
+33.487124751224385
+21
+-106.40949195526656
+31
+220.21670712709636
+12
+32.55984901459848
+22
+-103.9029877577403
+32
+221.41504673555178
+13
+32.55984901459848
+23
+-103.9029877577403
+33
+221.41504673555178
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.634065099252744
+20
+-103.70767574234884
+30
+222.25866078334178
+11
+34.49897484965543
+21
+-106.17676034814116
+31
+220.9298089403024
+12
+33.487124751224385
+22
+-106.40949195526656
+32
+220.21670712709636
+13
+33.487124751224385
+23
+-106.40949195526656
+33
+220.21670712709636
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.49897484965543
+20
+-106.17676034814116
+30
+220.9298089403024
+11
+35.22059494390631
+21
+-107.35745494585977
+31
+222.41472786106036
+12
+34.81932306181655
+22
+-110.1006456667113
+32
+221.9091070361672
+13
+34.81932306181655
+23
+-110.1006456667113
+33
+221.9091070361672
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.14820420519031
+20
+-109.88860131355207
+30
+220.71776458714263
+11
+34.49897484965543
+21
+-106.17676034814116
+31
+220.9298089403024
+12
+34.81932306181655
+22
+-110.1006456667113
+32
+221.9091070361672
+13
+34.81932306181655
+23
+-110.1006456667113
+33
+221.9091070361672
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.686769157976236
+20
+-101.84886512857516
+30
+224.958955874645
+11
+29.328074030944556
+21
+-103.49958630538994
+31
+223.9468015518907
+12
+27.9182985179772
+22
+-103.8643512687152
+32
+224.5470361412483
+13
+27.9182985179772
+23
+-103.8643512687152
+33
+224.5470361412483
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.686769157976236
+20
+-101.84886512857516
+30
+224.958955874645
+11
+30.241051224387597
+21
+-102.39464356410872
+31
+224.21482318048933
+12
+29.328074030944556
+22
+-103.49958630538994
+32
+223.9468015518907
+13
+29.328074030944556
+23
+-103.49958630538994
+33
+223.9468015518907
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.226433806714155
+20
+-104.34441725047121
+30
+220.8920851242459
+11
+29.328074030944556
+21
+-103.49958630538994
+31
+223.9468015518907
+12
+30.241051224387597
+22
+-102.39464356410872
+32
+224.21482318048933
+13
+30.241051224387597
+23
+-102.39464356410872
+33
+224.21482318048933
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.55984901459848
+20
+-103.9029877577403
+30
+221.41504673555178
+11
+31.226433806714155
+21
+-104.34441725047121
+31
+220.8920851242459
+12
+30.241051224387597
+22
+-102.39464356410872
+32
+224.21482318048933
+13
+30.241051224387597
+23
+-102.39464356410872
+33
+224.21482318048933
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.55984901459848
+20
+-103.9029877577403
+30
+221.41504673555178
+11
+32.17896016215239
+21
+-106.44904111726173
+31
+220.1333496625833
+12
+31.226433806714155
+22
+-104.34441725047121
+32
+220.8920851242459
+13
+31.226433806714155
+23
+-104.34441725047121
+33
+220.8920851242459
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.55984901459848
+20
+-103.9029877577403
+30
+221.41504673555178
+11
+33.487124751224385
+21
+-106.40949195526656
+31
+220.21670712709636
+12
+32.17896016215239
+22
+-106.44904111726173
+32
+220.1333496625833
+13
+32.17896016215239
+23
+-106.44904111726173
+33
+220.1333496625833
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.851644090896396
+20
+-113.20099574281508
+30
+234.10485169819384
+11
+30.655404752368074
+21
+-113.71209260552217
+31
+233.65034055957193
+12
+33.86953472528566
+22
+-113.84290906442916
+32
+232.74861966608137
+13
+33.86953472528566
+23
+-113.84290906442916
+33
+232.74861966608137
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.851644090896396
+20
+-113.20099574281508
+30
+234.10485169819384
+11
+33.86953472528566
+21
+-113.84290906442916
+31
+232.74861966608137
+12
+34.52087900091431
+22
+-113.36679799887153
+32
+232.77174071463241
+13
+34.52087900091431
+23
+-113.36679799887153
+33
+232.77174071463241
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.54711554353336
+20
+-112.08023333673596
+30
+234.59313173667303
+11
+29.851644090896396
+21
+-113.20099574281508
+31
+234.10485169819384
+12
+34.52087900091431
+22
+-113.36679799887153
+32
+232.77174071463241
+13
+34.52087900091431
+23
+-113.36679799887153
+33
+232.77174071463241
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.54711554353336
+20
+-112.08023333673596
+30
+234.59313173667303
+11
+34.52087900091431
+21
+-113.36679799887153
+31
+232.77174071463241
+12
+35.65107236100791
+22
+-112.62783711820744
+32
+232.75470415254253
+13
+35.65107236100791
+23
+-112.62783711820744
+33
+232.75470415254253
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.628009913126952
+20
+-110.40334886813544
+30
+219.2532286960279
+11
+32.91183655635575
+21
+-111.86149604846638
+31
+220.18902271369828
+12
+31.22765070400632
+22
+-110.9609920522677
+32
+219.03388295911583
+13
+31.22765070400632
+23
+-110.9609920522677
+33
+219.03388295911583
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.22765070400632
+20
+-110.9609920522677
+30
+219.03388295911583
+11
+32.91183655635575
+21
+-111.86149604846638
+31
+220.18902271369828
+12
+31.913068103815437
+22
+-112.13134302300291
+32
+220.0004036334137
+13
+31.913068103815437
+23
+-112.13134302300291
+33
+220.0004036334137
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.18899956481271
+20
+-109.8079818679462
+30
+219.32046227141953
+11
+34.14820420519031
+21
+-109.88860131355207
+31
+220.71776458714263
+12
+31.628009913126952
+22
+-110.40334886813544
+32
+219.2532286960279
+13
+31.628009913126952
+23
+-110.40334886813544
+33
+219.2532286960279
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.14820420519031
+20
+-109.88860131355207
+30
+220.71776458714263
+11
+32.91183655635575
+21
+-111.86149604846638
+31
+220.18902271369828
+12
+31.628009913126952
+22
+-110.40334886813544
+32
+219.2532286960279
+13
+31.628009913126952
+23
+-110.40334886813544
+33
+219.2532286960279
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.34547341802792
+20
+-110.67897610481045
+30
+222.22732567806653
+11
+25.043378665249207
+21
+-111.04404529245863
+31
+222.86315451322002
+12
+23.174528648814487
+22
+-108.73741647516935
+32
+222.98606113972906
+13
+23.174528648814487
+23
+-108.73741647516935
+33
+222.98606113972906
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.043378665249207
+20
+-111.04404529245863
+30
+222.86315451322002
+11
+22.688682404919618
+21
+-108.93120736894615
+31
+224.2218203399175
+12
+23.174528648814487
+22
+-108.73741647516935
+32
+222.98606113972906
+13
+23.174528648814487
+23
+-108.73741647516935
+33
+222.98606113972906
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.34547341802792
+20
+-110.67897610481045
+30
+222.22732567806653
+11
+27.22162481821561
+21
+-111.25761076723234
+31
+221.50053377032413
+12
+27.2064136020636
+22
+-111.95306756970187
+32
+221.9161041955966
+13
+27.2064136020636
+23
+-111.95306756970187
+33
+221.9161041955966
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.2064136020636
+20
+-111.95306756970187
+30
+221.9161041955966
+11
+25.043378665249207
+21
+-111.04404529245863
+31
+222.86315451322002
+12
+25.34547341802792
+22
+-110.67897610481045
+32
+222.22732567806653
+13
+25.34547341802792
+23
+-110.67897610481045
+33
+222.22732567806653
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.60972715340951
+20
+-112.00265613435738
+30
+221.84065656348272
+11
+31.913068103815437
+21
+-112.13134302300291
+31
+220.0004036334137
+12
+32.91183655635575
+22
+-111.86149604846638
+32
+220.18902271369828
+13
+32.91183655635575
+23
+-111.86149604846638
+33
+220.18902271369828
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.60972715340951
+20
+-112.00265613435738
+30
+221.84065656348272
+11
+32.629820608897674
+21
+-112.37046334091293
+31
+222.06182764633272
+12
+31.913068103815437
+22
+-112.13134302300291
+32
+220.0004036334137
+13
+31.913068103815437
+23
+-112.13134302300291
+33
+220.0004036334137
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.91183655635575
+20
+-111.86149604846638
+30
+220.18902271369828
+11
+34.14820420519031
+21
+-109.88860131355207
+31
+220.71776458714263
+12
+34.81932306181655
+22
+-110.1006456667113
+32
+221.9091070361672
+13
+34.81932306181655
+23
+-110.1006456667113
+33
+221.9091070361672
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.91183655635575
+20
+-111.86149604846638
+30
+220.18902271369828
+11
+34.81932306181655
+21
+-110.1006456667113
+31
+221.9091070361672
+12
+33.60972715340951
+22
+-112.00265613435738
+32
+221.84065656348272
+13
+33.60972715340951
+23
+-112.00265613435738
+33
+221.84065656348272
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.369202915225042
+20
+-111.45566080153202
+30
+224.06301524329
+11
+22.688682404919618
+21
+-108.93120736894615
+31
+224.2218203399175
+12
+25.043378665249207
+22
+-111.04404529245863
+32
+222.86315451322002
+13
+25.043378665249207
+23
+-111.04404529245863
+33
+222.86315451322002
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.369202915225042
+20
+-111.45566080153202
+30
+224.06301524329
+11
+23.209210221641058
+21
+-109.13138697350698
+31
+225.4797879156879
+12
+22.688682404919618
+22
+-108.93120736894615
+32
+224.2218203399175
+13
+22.688682404919618
+23
+-108.93120736894615
+33
+224.2218203399175
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.388035522918475
+20
+-112.24542714414362
+30
+223.21727162523828
+11
+25.043378665249207
+21
+-111.04404529245863
+31
+222.86315451322002
+12
+27.2064136020636
+22
+-111.95306756970187
+32
+221.9161041955966
+13
+27.2064136020636
+23
+-111.95306756970187
+33
+221.9161041955966
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.388035522918475
+20
+-112.24542714414362
+30
+223.21727162523828
+11
+25.369202915225042
+21
+-111.45566080153202
+31
+224.06301524329
+12
+25.043378665249207
+22
+-111.04404529245863
+32
+222.86315451322002
+13
+25.043378665249207
+23
+-111.04404529245863
+33
+222.86315451322002
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.032598962435124
+20
+-112.03459968827696
+30
+223.4816425619604
+11
+32.629820608897674
+21
+-112.37046334091293
+31
+222.06182764633272
+12
+33.60972715340951
+22
+-112.00265613435738
+32
+221.84065656348272
+13
+33.60972715340951
+23
+-112.00265613435738
+33
+221.84065656348272
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.032598962435124
+20
+-112.03459968827696
+30
+223.4816425619604
+11
+33.01557705051242
+21
+-112.40453646509364
+31
+223.65809266932345
+12
+32.629820608897674
+22
+-112.37046334091293
+32
+222.06182764633272
+13
+32.629820608897674
+23
+-112.37046334091293
+33
+222.06182764633272
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.60972715340951
+20
+-112.00265613435738
+30
+221.84065656348272
+11
+34.81932306181655
+21
+-110.1006456667113
+31
+221.9091070361672
+12
+35.26136100319367
+22
+-110.51834566224561
+32
+223.48042566466867
+13
+35.26136100319367
+23
+-110.51834566224561
+33
+223.48042566466867
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.60972715340951
+20
+-112.00265613435738
+30
+221.84065656348272
+11
+35.26136100319367
+21
+-110.51834566224561
+31
+223.48042566466867
+12
+34.032598962435124
+22
+-112.03459968827696
+32
+223.4816425619604
+13
+34.032598962435124
+23
+-112.03459968827696
+33
+223.4816425619604
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.949662923585365
+20
+-111.66496713578398
+30
+225.77062636851355
+11
+23.209210221641058
+21
+-109.13138697350698
+31
+225.4797879156879
+12
+25.369202915225042
+22
+-111.45566080153202
+32
+224.06301524329
+13
+25.369202915225042
+23
+-111.45566080153202
+33
+224.06301524329
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.949662923585365
+20
+-111.66496713578398
+30
+225.77062636851355
+11
+24.203415309335774
+21
+-109.66560488476543
+31
+226.99421659578087
+12
+23.209210221641058
+22
+-109.13138697350698
+32
+225.4797879156879
+13
+23.209210221641058
+23
+-109.13138697350698
+33
+225.4797879156879
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.670051470376563
+20
+-112.48880660257609
+30
+224.9178855910321
+11
+25.369202915225042
+21
+-111.45566080153202
+31
+224.06301524329
+12
+27.388035522918475
+22
+-112.24542714414362
+32
+223.21727162523828
+13
+27.388035522918475
+23
+-112.24542714414362
+33
+223.21727162523828
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.670051470376563
+20
+-112.48880660257609
+30
+224.9178855910321
+11
+25.949662923585365
+21
+-111.66496713578398
+31
+225.77062636851355
+12
+25.369202915225042
+22
+-111.45566080153202
+32
+224.06301524329
+13
+25.369202915225042
+23
+-111.45566080153202
+33
+224.06301524329
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.209657518444395
+20
+-112.19310056058129
+30
+225.40646985383447
+11
+33.01557705051242
+21
+-112.40453646509364
+31
+223.65809266932345
+12
+34.032598962435124
+22
+-112.03459968827696
+32
+223.4816425619604
+13
+34.032598962435124
+23
+-112.03459968827696
+33
+223.4816425619604
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.209657518444395
+20
+-112.19310056058129
+30
+225.40646985383447
+11
+33.189897587614304
+21
+-112.53048533483275
+31
+225.47674567245633
+12
+33.01557705051242
+22
+-112.40453646509364
+32
+223.65809266932345
+13
+33.01557705051242
+23
+-112.40453646509364
+33
+223.65809266932345
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.26136100319367
+20
+-110.51834566224561
+30
+223.48042566466867
+11
+35.429292829511745
+21
+-110.96312162253061
+31
+225.4365880618158
+12
+34.032598962435124
+22
+-112.03459968827696
+32
+223.4816425619604
+13
+34.032598962435124
+23
+-112.03459968827696
+33
+223.4816425619604
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.032598962435124
+20
+-112.03459968827696
+30
+223.4816425619604
+11
+35.429292829511745
+21
+-110.96312162253061
+31
+225.4365880618158
+12
+34.209657518444395
+22
+-112.19310056058129
+32
+225.40646985383447
+13
+34.209657518444395
+23
+-112.19310056058129
+33
+225.40646985383447
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.703835020401527
+20
+-112.03034054775547
+30
+227.4441643695564
+11
+24.203415309335774
+21
+-109.66560488476543
+31
+226.99421659578087
+12
+25.949662923585365
+22
+-111.66496713578398
+32
+225.77062636851355
+13
+25.949662923585365
+23
+-111.66496713578398
+33
+225.77062636851355
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.703835020401527
+20
+-112.03034054775547
+30
+227.4441643695564
+11
+25.031513916650653
+21
+-110.0130290616776
+31
+228.83872866637225
+12
+24.203415309335774
+22
+-109.66560488476543
+32
+226.99421659578087
+13
+24.203415309335774
+23
+-109.66560488476543
+33
+226.99421659578087
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.117869673891438
+20
+-112.75500288523654
+30
+226.7225442753053
+11
+25.949662923585365
+21
+-111.66496713578398
+31
+225.77062636851355
+12
+27.670051470376563
+22
+-112.48880660257609
+32
+224.9178855910321
+13
+27.670051470376563
+23
+-112.48880660257609
+33
+224.9178855910321
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.117869673891438
+20
+-112.75500288523654
+30
+226.7225442753053
+11
+26.703835020401527
+21
+-112.03034054775547
+31
+227.4441643695564
+12
+25.949662923585365
+22
+-111.66496713578398
+32
+225.77062636851355
+13
+25.949662923585365
+23
+-111.66496713578398
+33
+225.77062636851355
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.29088541269607
+20
+-112.52713886727973
+30
+227.3748012239029
+11
+33.189897587614304
+21
+-112.53048533483275
+31
+225.47674567245633
+12
+34.209657518444395
+22
+-112.19310056058129
+32
+225.40646985383447
+13
+34.209657518444395
+23
+-112.19310056058129
+33
+225.40646985383447
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.29088541269607
+20
+-112.52713886727973
+30
+227.3748012239029
+11
+33.32771120595143
+21
+-112.82314913359772
+31
+227.41130814266785
+12
+33.189897587614304
+22
+-112.53048533483275
+32
+225.47674567245633
+13
+33.189897587614304
+23
+-112.53048533483275
+33
+225.47674567245633
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.209657518444395
+20
+-112.19310056058129
+30
+225.40646985383447
+11
+35.429292829511745
+21
+-110.96312162253061
+31
+225.4365880618158
+12
+35.44267869972551
+22
+-111.58039277397928
+32
+227.3671956158274
+13
+35.44267869972551
+23
+-111.58039277397928
+33
+227.3671956158274
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.44267869972551
+20
+-111.58039277397928
+30
+227.3671956158274
+11
+34.29088541269607
+21
+-112.52713886727973
+31
+227.3748012239029
+12
+34.209657518444395
+22
+-112.19310056058129
+32
+225.40646985383447
+13
+34.209657518444395
+23
+-112.19310056058129
+33
+225.40646985383447
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.616203765198485
+20
+-112.3363902167342
+30
+229.42131824499324
+11
+25.031513916650653
+21
+-110.0130290616776
+31
+228.83872866637225
+12
+26.703835020401527
+22
+-112.03034054775547
+32
+227.4441643695564
+13
+26.703835020401527
+23
+-112.03034054775547
+33
+227.4441643695564
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.07913063369271
+20
+-104.50261389845315
+30
+225.31946169744697
+11
+33.12783582571415
+21
+-103.27750254957135
+31
+226.94493225545
+12
+32.89662534020375
+22
+-104.13480669189859
+32
+228.269524957966
+13
+32.89662534020375
+23
+-104.13480669189859
+33
+228.269524957966
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.21603157906071
+20
+-105.06877536363125
+30
+227.1922666300811
+11
+35.07913063369271
+21
+-104.50261389845315
+31
+225.31946169744697
+12
+32.89662534020375
+22
+-104.13480669189859
+32
+228.269524957966
+13
+32.89662534020375
+23
+-104.13480669189859
+33
+228.269524957966
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.63221045297943
+20
+-107.81287875745102
+30
+224.0067337435285
+11
+35.07913063369271
+21
+-104.50261389845315
+31
+225.31946169744697
+12
+35.21603157906071
+22
+-105.06877536363125
+32
+227.1922666300811
+13
+35.21603157906071
+23
+-105.06877536363125
+33
+227.1922666300811
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.63221045297943
+20
+-107.81287875745102
+30
+224.0067337435285
+11
+35.21603157906071
+21
+-105.06877536363125
+31
+227.1922666300811
+12
+36.06846813221882
+22
+-108.40946265493298
+32
+225.87832177887046
+13
+36.06846813221882
+23
+-108.40946265493298
+33
+225.87832177887046
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+36.06846813221882
+20
+-108.40946265493298
+30
+225.87832177887046
+11
+36.246743585520235
+21
+-108.63884779450575
+31
+228.24275321753728
+12
+35.44267869972551
+22
+-111.58039277397928
+32
+227.3671956158274
+13
+35.44267869972551
+23
+-111.58039277397928
+33
+227.3671956158274
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.429292829511745
+20
+-110.96312162253061
+30
+225.4365880618158
+11
+36.06846813221882
+21
+-108.40946265493298
+31
+225.87832177887046
+12
+35.44267869972551
+22
+-111.58039277397928
+32
+227.3671956158274
+13
+35.44267869972551
+23
+-111.58039277397928
+33
+227.3671956158274
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.32771120595143
+20
+-112.82314913359772
+30
+227.41130814266785
+11
+30.53097700424471
+21
+-113.02089494357335
+31
+226.05203386732512
+12
+33.189897587614304
+22
+-112.53048533483275
+32
+225.47674567245633
+13
+33.189897587614304
+23
+-112.53048533483275
+33
+225.47674567245633
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.32771120595143
+20
+-112.82314913359772
+30
+227.41130814266785
+11
+30.8555843569284
+21
+-113.15019028086577
+31
+227.88528963796412
+12
+30.53097700424471
+22
+-113.02089494357335
+32
+226.05203386732512
+13
+30.53097700424471
+23
+-113.02089494357335
+33
+226.05203386732512
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.8555843569284
+20
+-113.15019028086577
+30
+227.88528963796412
+11
+28.117869673891438
+21
+-112.75500288523654
+31
+226.7225442753053
+12
+30.53097700424471
+22
+-113.02089494357335
+32
+226.05203386732512
+13
+30.53097700424471
+23
+-113.02089494357335
+33
+226.05203386732512
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.8555843569284
+20
+-113.15019028086577
+30
+227.88528963796412
+11
+28.689811401206637
+21
+-112.9433177411988
+31
+228.61056042409152
+12
+28.117869673891438
+22
+-112.75500288523654
+32
+226.7225442753053
+13
+28.117869673891438
+23
+-112.75500288523654
+33
+226.7225442753053
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.031513916650653
+20
+-110.0130290616776
+30
+228.83872866637225
+11
+26.486010405104903
+21
+-110.4684528732689
+31
+230.54846936185695
+12
+25.671601892326805
+22
+-107.85516593835511
+32
+229.76570017867576
+13
+25.671601892326805
+23
+-107.85516593835511
+33
+229.76570017867576
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.671601892326805
+20
+-107.85516593835511
+30
+229.76570017867576
+11
+26.486010405104903
+21
+-110.4684528732689
+31
+230.54846936185695
+12
+26.95056094638696
+22
+-108.44962026557559
+32
+231.02731844632245
+13
+26.95056094638696
+23
+-108.44962026557559
+33
+231.02731844632245
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.70503726752617
+20
+-104.71161600838279
+30
+229.84175625943652
+11
+25.671601892326805
+21
+-107.85516593835511
+31
+229.76570017867576
+12
+26.95056094638696
+22
+-108.44962026557559
+32
+231.02731844632245
+13
+26.95056094638696
+23
+-108.44962026557559
+33
+231.02731844632245
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.70503726752617
+20
+-104.71161600838279
+30
+229.84175625943652
+11
+26.95056094638696
+21
+-108.44962026557559
+31
+231.02731844632245
+12
+28.517316210042956
+22
+-105.97171315441481
+32
+231.16969542950582
+13
+28.517316210042956
+23
+-105.97171315441481
+33
+231.16969542950582
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.101093385621677
+20
+-104.11868280277763
+30
+228.98871125763256
+11
+27.70503726752617
+21
+-104.71161600838279
+31
+229.84175625943652
+12
+28.517316210042956
+22
+-105.97171315441481
+32
+231.16969542950582
+13
+28.517316210042956
+23
+-105.97171315441481
+33
+231.16969542950582
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.308574373934952
+20
+-105.13783428496201
+30
+230.43955705421004
+11
+31.101093385621677
+21
+-104.11868280277763
+31
+228.98871125763256
+12
+28.517316210042956
+22
+-105.97171315441481
+32
+231.16969542950582
+13
+28.517316210042956
+23
+-105.97171315441481
+33
+231.16969542950582
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.89662534020375
+20
+-104.13480669189859
+30
+228.269524957966
+11
+31.101093385621677
+21
+-104.11868280277763
+31
+228.98871125763256
+12
+31.308574373934952
+22
+-105.13783428496201
+32
+230.43955705421004
+13
+31.308574373934952
+23
+-105.13783428496201
+33
+230.43955705421004
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.96842228044119
+20
+-105.29785627888108
+30
+229.98869660746468
+11
+32.89662534020375
+21
+-104.13480669189859
+31
+228.269524957966
+12
+31.308574373934952
+22
+-105.13783428496201
+32
+230.43955705421004
+13
+31.308574373934952
+23
+-105.13783428496201
+33
+230.43955705421004
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.21603157906071
+20
+-105.06877536363125
+30
+227.1922666300811
+11
+32.89662534020375
+21
+-104.13480669189859
+31
+228.269524957966
+12
+32.96842228044119
+22
+-105.29785627888108
+32
+229.98869660746468
+13
+32.96842228044119
+23
+-105.29785627888108
+33
+229.98869660746468
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.27718066799174
+20
+-106.5153620196868
+30
+229.24060899710904
+11
+35.21603157906071
+21
+-105.06877536363125
+31
+227.1922666300811
+12
+32.96842228044119
+22
+-105.29785627888108
+32
+229.98869660746468
+13
+32.96842228044119
+23
+-105.29785627888108
+33
+229.98869660746468
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+36.06846813221882
+20
+-108.40946265493298
+30
+225.87832177887046
+11
+35.21603157906071
+21
+-105.06877536363125
+31
+227.1922666300811
+12
+35.27718066799174
+22
+-106.5153620196868
+32
+229.24060899710904
+13
+35.27718066799174
+23
+-106.5153620196868
+33
+229.24060899710904
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+36.06846813221882
+20
+-108.40946265493298
+30
+225.87832177887046
+11
+35.27718066799174
+21
+-106.5153620196868
+31
+229.24060899710904
+12
+36.246743585520235
+22
+-108.63884779450575
+32
+228.24275321753728
+13
+36.246743585520235
+23
+-108.63884779450575
+33
+228.24275321753728
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+35.44267869972551
+20
+-111.58039277397928
+30
+227.3671956158274
+11
+36.246743585520235
+21
+-108.63884779450575
+31
+228.24275321753728
+12
+35.51903900480855
+22
+-112.06958548542812
+32
+229.39941409373412
+13
+35.51903900480855
+23
+-112.06958548542812
+33
+229.39941409373412
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+36.246743585520235
+20
+-108.63884779450575
+30
+228.24275321753728
+11
+36.05599493497415
+21
+-109.3781128994934
+31
+230.0221612829981
+12
+35.51903900480855
+22
+-112.06958548542812
+32
+229.39941409373412
+13
+35.51903900480855
+23
+-112.06958548542812
+33
+229.39941409373412
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.638020015452234
+20
+-113.31690520989213
+30
+229.40336900993364
+11
+30.8555843569284
+21
+-113.15019028086577
+31
+227.88528963796412
+12
+33.32771120595143
+22
+-112.82314913359772
+32
+227.41130814266785
+13
+33.32771120595143
+23
+-112.82314913359772
+33
+227.41130814266785
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.638020015452234
+20
+-113.31690520989213
+30
+229.40336900993364
+11
+31.133341163863918
+21
+-113.62690979507005
+31
+229.95401503463597
+12
+30.8555843569284
+22
+-113.15019028086577
+32
+227.88528963796412
+13
+30.8555843569284
+23
+-113.15019028086577
+33
+227.88528963796412
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.133341163863918
+20
+-113.62690979507005
+30
+229.95401503463597
+11
+28.689811401206637
+21
+-112.9433177411988
+31
+228.61056042409152
+12
+30.8555843569284
+22
+-113.15019028086577
+32
+227.88528963796412
+13
+30.8555843569284
+23
+-113.15019028086577
+33
+227.88528963796412
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.133341163863918
+20
+-113.62690979507005
+30
+229.95401503463597
+11
+29.02962997004232
+21
+-113.23567731564076
+31
+230.6990604017608
+12
+28.689811401206637
+22
+-112.9433177411988
+32
+228.61056042409152
+13
+28.689811401206637
+23
+-112.9433177411988
+33
+228.61056042409152
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.486010405104903
+20
+-110.4684528732689
+30
+230.54846936185695
+11
+27.73545969983016
+21
+-110.65555083193892
+31
+232.23813125202108
+12
+26.95056094638696
+22
+-108.44962026557559
+32
+231.02731844632245
+13
+26.95056094638696
+23
+-108.44962026557559
+33
+231.02731844632245
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.95056094638696
+20
+-108.44962026557559
+30
+231.02731844632245
+11
+27.73545969983016
+21
+-110.65555083193892
+31
+232.23813125202108
+12
+28.17202160339256
+22
+-109.08088573588395
+32
+232.50858667520404
+13
+28.17202160339256
+23
+-109.08088573588395
+33
+232.50858667520404
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.517316210042956
+20
+-105.97171315441481
+30
+231.16969542950582
+11
+26.95056094638696
+21
+-108.44962026557559
+31
+231.02731844632245
+12
+28.17202160339256
+22
+-109.08088573588395
+32
+232.50858667520404
+13
+28.17202160339256
+23
+-109.08088573588395
+33
+232.50858667520404
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.517316210042956
+20
+-105.97171315441481
+30
+231.16969542950582
+11
+28.17202160339256
+21
+-109.08088573588395
+31
+232.50858667520404
+12
+29.114508556170495
+22
+-107.11559660904567
+32
+232.87761077905208
+13
+29.114508556170495
+23
+-107.11559660904567
+33
+232.87761077905208
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.908317715986975
+20
+-108.32853898500342
+30
+222.43298132044222
+11
+25.84683510239784
+21
+-109.98199818072575
+31
+221.98729268718822
+12
+25.34547341802792
+22
+-110.67897610481045
+32
+222.22732567806653
+13
+25.34547341802792
+23
+-110.67897610481045
+33
+222.22732567806653
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.908317715986975
+20
+-108.32853898500342
+30
+222.43298132044222
+11
+25.34547341802792
+21
+-110.67897610481045
+31
+222.22732567806653
+12
+23.174528648814487
+22
+-108.73741647516935
+32
+222.98606113972906
+13
+23.174528648814487
+23
+-108.73741647516935
+33
+222.98606113972906
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.487124751224385
+20
+-106.40949195526656
+30
+220.21670712709636
+11
+32.18899956481271
+21
+-109.8079818679462
+31
+219.32046227141953
+12
+32.17896016215239
+22
+-106.44904111726173
+32
+220.1333496625833
+13
+32.17896016215239
+23
+-106.44904111726173
+33
+220.1333496625833
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.17896016215239
+20
+-106.44904111726173
+30
+220.1333496625833
+11
+32.18899956481271
+21
+-109.8079818679462
+31
+219.32046227141953
+12
+31.00100358334151
+22
+-109.19131916514407
+32
+219.20333590704968
+13
+31.00100358334151
+23
+-109.19131916514407
+33
+219.20333590704968
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.534627696121195
+20
+-110.19860589872971
+30
+219.33719460918667
+11
+31.22765070400632
+21
+-110.9609920522677
+31
+219.03388295911583
+12
+28.977303386479438
+22
+-110.71700414519005
+32
+220.72476174657194
+13
+28.977303386479438
+23
+-110.71700414519005
+33
+220.72476174657194
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.977303386479438
+20
+-110.71700414519005
+30
+220.72476174657194
+11
+31.22765070400632
+21
+-110.9609920522677
+31
+219.03388295911583
+12
+28.9830836486172
+22
+-111.4723931392983
+32
+220.44852606125175
+13
+28.9830836486172
+23
+-111.4723931392983
+33
+220.44852606125175
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.569048995127297
+20
+-110.54815964590307
+30
+221.58389123483695
+11
+28.977303386479438
+21
+-110.71700414519005
+31
+220.72476174657194
+12
+28.9830836486172
+22
+-111.4723931392983
+32
+220.44852606125175
+13
+28.9830836486172
+23
+-111.4723931392983
+33
+220.44852606125175
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.569048995127297
+20
+-110.54815964590307
+30
+221.58389123483695
+11
+28.9830836486172
+21
+-111.4723931392983
+31
+220.44852606125175
+12
+27.22162481821561
+22
+-111.25761076723234
+32
+221.50053377032413
+13
+27.22162481821561
+23
+-111.25761076723234
+33
+221.50053377032413
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.908317715986975
+20
+-108.32853898500342
+30
+222.43298132044222
+11
+23.174528648814487
+21
+-108.73741647516935
+31
+222.98606113972906
+12
+24.17846891484649
+22
+-106.05476639460278
+32
+223.60911255331573
+13
+24.17846891484649
+23
+-106.05476639460278
+33
+223.60911255331573
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+23.146540011094807
+20
+-105.7520631931783
+30
+224.10986578903933
+11
+24.17846891484649
+21
+-106.05476639460278
+31
+223.60911255331573
+12
+23.174528648814487
+22
+-108.73741647516935
+32
+222.98606113972906
+13
+23.174528648814487
+23
+-108.73741647516935
+33
+222.98606113972906
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.393845085391288
+20
+-103.86039635251531
+30
+223.56317468053692
+11
+24.17846891484649
+21
+-106.05476639460278
+31
+223.60911255331573
+12
+23.146540011094807
+22
+-105.7520631931783
+32
+224.10986578903933
+13
+23.146540011094807
+23
+-105.7520631931783
+33
+224.10986578903933
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.004133727577052
+20
+-102.56987677417979
+30
+224.29087926124927
+11
+25.393845085391288
+21
+-103.86039635251531
+31
+223.56317468053692
+12
+23.146540011094807
+22
+-105.7520631931783
+32
+224.10986578903933
+13
+23.146540011094807
+23
+-105.7520631931783
+33
+224.10986578903933
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.004133727577052
+20
+-102.56987677417979
+30
+224.29087926124927
+11
+27.9182985179772
+21
+-103.8643512687152
+31
+224.5470361412483
+12
+25.393845085391288
+22
+-103.86039635251531
+32
+223.56317468053692
+13
+25.393845085391288
+23
+-103.86039635251531
+33
+223.56317468053692
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.686769157976236
+20
+-101.84886512857516
+30
+224.958955874645
+11
+27.9182985179772
+21
+-103.8643512687152
+31
+224.5470361412483
+12
+25.004133727577052
+22
+-102.56987677417979
+32
+224.29087926124927
+13
+25.004133727577052
+23
+-102.56987677417979
+33
+224.29087926124927
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.03574375683815
+20
+-104.83117616733591
+30
+223.6221941992068
+11
+29.071004477975755
+21
+-106.54517600334322
+31
+223.28572209792404
+12
+27.791741199592558
+22
+-106.42105247954292
+32
+223.4423976242897
+13
+27.791741199592558
+23
+-106.42105247954292
+33
+223.4423976242897
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.03574375683815
+20
+-104.83117616733591
+30
+223.6221941992068
+11
+28.831579935743274
+21
+-104.86372816990126
+31
+223.66995741792368
+12
+29.071004477975755
+22
+-106.54517600334322
+32
+223.28572209792404
+13
+29.071004477975755
+23
+-106.54517600334322
+33
+223.28572209792404
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.165009793795118
+20
+-109.74926657359998
+30
+221.34112022505164
+11
+28.977303386479438
+21
+-110.71700414519005
+31
+220.72476174657194
+12
+27.569048995127297
+22
+-110.54815964590307
+32
+221.58389123483695
+13
+27.569048995127297
+23
+-110.54815964590307
+33
+221.58389123483695
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.471682561586956
+20
+-109.58437699051235
+30
+221.58084899160716
+11
+29.165009793795118
+21
+-109.74926657359998
+31
+221.34112022505164
+12
+27.569048995127297
+22
+-110.54815964590307
+32
+221.58389123483695
+13
+27.569048995127297
+23
+-110.54815964590307
+33
+221.58389123483695
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.471682561586956
+20
+-109.58437699051235
+30
+221.58084899160716
+11
+27.569048995127297
+21
+-110.54815964590307
+31
+221.58389123483695
+12
+25.84683510239784
+22
+-109.98199818072575
+32
+221.98729268718822
+13
+25.84683510239784
+23
+-109.98199818072575
+33
+221.98729268718822
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.15256589688552
+20
+-109.27041748913518
+30
+222.0371854761672
+11
+28.471682561586956
+21
+-109.58437699051235
+31
+221.58084899160716
+12
+25.84683510239784
+22
+-109.98199818072575
+32
+221.98729268718822
+13
+25.84683510239784
+23
+-109.98199818072575
+33
+221.98729268718822
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.00100358334151
+20
+-109.19131916514407
+30
+219.20333590704968
+11
+30.534627696121195
+21
+-110.19860589872971
+31
+219.33719460918667
+12
+30.304634107902988
+22
+-109.03251406851749
+32
+220.3484362589723
+13
+30.304634107902988
+23
+-109.03251406851749
+33
+220.3484362589723
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.65724474847384
+20
+-104.70644419488926
+30
+222.58813572519384
+11
+29.071004477975755
+21
+-106.54517600334322
+31
+223.28572209792404
+12
+28.831579935743274
+22
+-104.86372816990126
+32
+223.66995741792368
+13
+28.831579935743274
+23
+-104.86372816990126
+33
+223.66995741792368
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.181423257071753
+20
+-105.31915198149154
+30
+221.53886603502863
+11
+29.071004477975755
+21
+-106.54517600334322
+31
+223.28572209792404
+12
+29.65724474847384
+22
+-104.70644419488926
+32
+222.58813572519384
+13
+29.65724474847384
+23
+-104.70644419488926
+33
+222.58813572519384
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.287641496315295
+20
+-107.71309317949373
+30
+222.88323331854187
+11
+29.55958874077803
+21
+-107.8067942709898
+31
+222.42963485288922
+12
+28.19118773574408
+22
+-109.13169119782896
+32
+222.10746129478915
+13
+28.19118773574408
+23
+-109.13169119782896
+33
+222.10746129478915
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.19118773574408
+20
+-109.13169119782896
+30
+222.10746129478915
+11
+29.514259316645035
+21
+-108.81712324780555
+31
+221.80232429878012
+12
+29.165009793795118
+22
+-109.74926657359998
+32
+221.34112022505164
+13
+29.165009793795118
+23
+-109.74926657359998
+33
+221.34112022505164
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.514259316645035
+20
+-108.81712324780555
+30
+221.80232429878012
+11
+28.19118773574408
+21
+-109.13169119782896
+31
+222.10746129478915
+12
+29.55958874077803
+22
+-107.8067942709898
+32
+222.42963485288922
+13
+29.55958874077803
+23
+-107.8067942709898
+33
+222.42963485288922
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.081927253270155
+20
+-106.75296121597883
+30
+220.64657609555172
+11
+29.514259316645035
+21
+-108.81712324780555
+31
+221.80232429878012
+12
+29.55958874077803
+22
+-107.8067942709898
+32
+222.42963485288922
+13
+29.55958874077803
+23
+-107.8067942709898
+33
+222.42963485288922
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.514259316645035
+20
+-108.81712324780555
+30
+221.80232429878012
+11
+31.081927253270155
+21
+-106.75296121597883
+31
+220.64657609555172
+12
+30.304634107902988
+22
+-109.03251406851749
+32
+220.3484362589723
+13
+30.304634107902988
+23
+-109.03251406851749
+33
+220.3484362589723
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.791741199592558
+20
+-106.42105247954292
+30
+223.4423976242897
+11
+29.071004477975755
+21
+-106.54517600334322
+31
+223.28572209792404
+12
+27.287641496315295
+22
+-107.71309317949373
+32
+222.88323331854187
+13
+27.287641496315295
+23
+-107.71309317949373
+33
+222.88323331854187
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.071004477975755
+20
+-106.54517600334322
+30
+223.28572209792404
+11
+29.55958874077803
+21
+-107.8067942709898
+31
+222.42963485288922
+12
+27.287641496315295
+22
+-107.71309317949373
+32
+222.88323331854187
+13
+27.287641496315295
+23
+-107.71309317949373
+33
+222.88323331854187
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.014041278729664
+20
+-115.95635543658574
+30
+223.9632296653314
+11
+32.26718521583399
+21
+-116.17996031402075
+31
+226.16824755872554
+12
+33.92034018723335
+22
+-117.20763007724966
+32
+225.52511733981868
+13
+33.92034018723335
+23
+-117.20763007724966
+33
+225.52511733981868
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.51083959825398
+20
+-120.10901744608125
+30
+222.02045313839727
+11
+34.93644942618695
+21
+-117.87023065283006
+31
+222.73325072728048
+12
+34.753914832362995
+22
+-118.65512940627382
+32
+224.70036520005695
+13
+34.753914832362995
+23
+-118.65512940627382
+33
+224.70036520005695
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.014041278729664
+20
+-115.95635543658574
+30
+223.9632296653314
+11
+31.795637515121992
+21
+-115.29801400152746
+31
+225.0140204771118
+12
+32.26718521583399
+22
+-116.17996031402075
+32
+226.16824755872554
+13
+32.26718521583399
+23
+-116.17996031402075
+33
+226.16824755872554
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.51083959825398
+20
+-120.10901744608125
+30
+222.02045313839727
+11
+34.753914832362995
+21
+-118.65512940627382
+31
+224.70036520005695
+12
+34.41713850675766
+22
+-120.88326834821848
+32
+223.7031178691312
+13
+34.41713850675766
+23
+-120.88326834821848
+33
+223.7031178691312
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.26718521583399
+20
+-116.17996031402075
+30
+226.16824755872554
+11
+31.795637515121992
+21
+-115.29801400152746
+31
+225.0140204771118
+12
+30.24196389735671
+22
+-115.80059258319007
+32
+226.56039271112385
+13
+30.24196389735671
+23
+-115.80059258319007
+33
+226.56039271112385
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.41713850675766
+20
+-120.88326834821848
+30
+223.7031178691312
+11
+34.4128793662351
+21
+-121.1801912875059
+31
+225.18286497639775
+12
+33.28511980072585
+22
+-123.2483082355317
+32
+224.8892885046636
+13
+33.28511980072585
+23
+-123.2483082355317
+33
+224.8892885046636
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.93644942618695
+20
+-117.87023065283006
+30
+222.73325072728048
+11
+33.92034018723335
+21
+-117.20763007724966
+31
+225.52511733981868
+12
+34.753914832362995
+22
+-118.65512940627382
+32
+224.70036520005695
+13
+34.753914832362995
+23
+-118.65512940627382
+33
+224.70036520005695
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.93644942618695
+20
+-117.87023065283006
+30
+222.73325072728048
+11
+34.014041278729664
+21
+-115.95635543658574
+31
+223.9632296653314
+12
+33.92034018723335
+22
+-117.20763007724966
+32
+225.52511733981868
+13
+33.92034018723335
+23
+-117.20763007724966
+33
+225.52511733981868
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.50811622951415
+20
+-123.35356985130397
+30
+226.27168382855731
+11
+34.544000049465346
+21
+-121.2717628087412
+31
+226.33435403910406
+12
+33.56804842115303
+22
+-123.42019497804984
+32
+226.8183749370602
+13
+33.56804842115303
+23
+-123.42019497804984
+33
+226.8183749370602
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.544000049465346
+20
+-121.2717628087412
+30
+226.33435403910406
+11
+34.60545336271943
+21
+-121.25290090071312
+31
+227.1758385166327
+12
+33.56804842115303
+22
+-123.42019497804984
+32
+226.8183749370602
+13
+33.56804842115303
+23
+-123.42019497804984
+33
+226.8183749370602
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.192027157875586
+20
+-123.01618507705197
+30
+223.32587970856108
+11
+34.41713850675766
+21
+-120.88326834821848
+31
+223.7031178691312
+12
+33.28511980072585
+22
+-123.2483082355317
+32
+224.8892885046636
+13
+33.28511980072585
+23
+-123.2483082355317
+33
+224.8892885046636
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.616493339354005
+20
+-123.45274698061407
+30
+222.6623664600108
+11
+27.20610937774056
+21
+-123.04052302289502
+31
+223.27933338713598
+12
+26.66915344757498
+22
+-122.54828806821585
+32
+221.59423486181757
+13
+26.66915344757498
+23
+-122.54828806821585
+33
+221.59423486181757
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.915300225249364
+20
+-120.51120200114036
+30
+222.9991427856168
+11
+27.20610937774056
+21
+-123.04052302289502
+31
+223.27933338713598
+12
+25.54991216311079
+22
+-121.09957184190016
+32
+224.67693992718193
+13
+25.54991216311079
+23
+-121.09957184190016
+33
+224.67693992718193
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.490269545627452
+20
+-115.47020496836781
+30
+223.9550156086094
+11
+25.474464530996894
+21
+-117.81668717197535
+31
+223.96657613288463
+12
+26.448895037694015
+22
+-119.0588350829483
+32
+226.52662381126564
+13
+26.448895037694015
+23
+-119.0588350829483
+33
+226.52662381126564
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.787756983058
+20
+-114.30137511924823
+30
+223.94558465459585
+11
+26.490269545627452
+21
+-115.47020496836781
+31
+223.9550156086094
+12
+27.123664586196735
+22
+-116.4683649722625
+32
+225.71677866333414
+13
+27.123664586196735
+23
+-116.4683649722625
+33
+225.71677866333414
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.06338421973226
+20
+-115.09965974290547
+30
+225.31489833259832
+11
+29.787756983058
+21
+-114.30137511924823
+31
+223.94558465459585
+12
+27.123664586196735
+22
+-116.4683649722625
+32
+225.71677866333414
+13
+27.123664586196735
+23
+-116.4683649722625
+33
+225.71677866333414
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.798375534029354
+20
+-114.41028742689635
+30
+223.45426237288592
+11
+30.06338421973226
+21
+-115.09965974290547
+31
+225.31489833259832
+12
+31.795637515121992
+22
+-115.29801400152746
+32
+225.0140204771118
+13
+31.795637515121992
+23
+-115.29801400152746
+33
+225.0140204771118
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.690346599015136
+20
+-115.04003177558864
+30
+221.50357601355356
+11
+31.798375534029354
+21
+-114.41028742689635
+31
+223.45426237288592
+12
+31.795637515121992
+22
+-115.29801400152746
+32
+225.0140204771118
+13
+31.795637515121992
+23
+-115.29801400152746
+33
+225.0140204771118
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.66915344757498
+20
+-122.54828806821585
+30
+221.59423486181757
+11
+27.20610937774056
+21
+-123.04052302289502
+31
+223.27933338713598
+12
+24.915300225249364
+22
+-120.51120200114036
+32
+222.9991427856168
+13
+24.915300225249364
+23
+-120.51120200114036
+33
+222.9991427856168
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.474464530996894
+20
+-117.81668717197535
+30
+223.96657613288463
+11
+25.54991216311079
+21
+-121.09957184190016
+31
+224.67693992718193
+12
+26.448895037694015
+22
+-119.0588350829483
+32
+226.52662381126564
+13
+26.448895037694015
+23
+-119.0588350829483
+33
+226.52662381126564
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.557081695356075
+20
+-117.11484165872126
+30
+220.7363222708459
+11
+33.690346599015136
+21
+-115.04003177558864
+31
+221.50357601355356
+12
+34.014041278729664
+22
+-115.95635543658574
+32
+223.9632296653314
+13
+34.014041278729664
+23
+-115.95635543658574
+33
+223.9632296653314
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.205094153598786
+20
+-119.5203433809984
+30
+220.2827238051929
+11
+34.557081695356075
+21
+-117.11484165872126
+31
+220.7363222708459
+12
+34.93644942618695
+22
+-117.87023065283006
+32
+222.73325072728048
+13
+34.93644942618695
+23
+-117.87023065283006
+33
+222.73325072728048
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.205094153598786
+20
+-119.5203433809984
+30
+220.2827238051929
+11
+34.93644942618695
+21
+-117.87023065283006
+31
+222.73325072728048
+12
+34.51083959825398
+22
+-120.10901744608125
+32
+222.02045313839727
+13
+34.51083959825398
+23
+-120.10901744608125
+33
+222.02045313839727
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.11079926362391
+20
+-122.75637750517525
+30
+221.71987950723297
+11
+34.51083959825398
+21
+-120.10901744608125
+31
+222.02045313839727
+12
+33.192027157875586
+22
+-123.01618507705197
+32
+223.32587970856108
+13
+33.192027157875586
+23
+-123.01618507705197
+33
+223.32587970856108
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.11079926362391
+20
+-122.75637750517525
+30
+221.71987950723297
+11
+30.969364253745354
+21
+-123.4366230914928
+31
+222.0648698895602
+12
+30.733894627712388
+22
+-123.2051083816589
+32
+220.37581644804217
+13
+30.733894627712388
+23
+-123.2051083816589
+33
+220.37581644804217
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.969364253745354
+20
+-123.4366230914928
+30
+222.0648698895602
+11
+33.11079926362391
+21
+-122.75637750517525
+31
+221.71987950723297
+12
+31.186276196072875
+22
+-123.6565772770511
+32
+223.66539405307358
+13
+31.186276196072875
+23
+-123.6565772770511
+33
+223.66539405307358
+70
+3
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.186276196072875
+20
+-123.6565772770511
+30
+223.66539405307358
+11
+33.11079926362391
+21
+-122.75637750517525
+31
+221.71987950723297
+12
+33.192027157875586
+22
+-123.01618507705197
+32
+223.32587970856108
+13
+33.192027157875586
+23
+-123.01618507705197
+33
+223.32587970856108
+70
+1
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.186276196072875
+20
+-123.6565772770511
+30
+223.66539405307358
+11
+28.616493339354005
+21
+-123.45274698061407
+31
+222.6623664600108
+12
+30.969364253745354
+22
+-123.4366230914928
+32
+222.0648698895602
+13
+30.969364253745354
+23
+-123.4366230914928
+33
+222.0648698895602
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.186276196072875
+20
+-123.6565772770511
+30
+223.66539405307358
+11
+28.910678259733693
+21
+-123.73932629291814
+31
+224.24798363169515
+12
+28.616493339354005
+22
+-123.45274698061407
+32
+222.6623664600108
+13
+28.616493339354005
+23
+-123.45274698061407
+33
+222.6623664600108
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.910678259733693
+20
+-123.73932629291814
+30
+224.24798363169515
+11
+27.20610937774056
+21
+-123.04052302289502
+31
+223.27933338713598
+12
+28.616493339354005
+22
+-123.45274698061407
+32
+222.6623664600108
+13
+28.616493339354005
+23
+-123.45274698061407
+33
+222.6623664600108
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.910678259733693
+20
+-123.73932629291814
+30
+224.24798363169515
+11
+27.24505009108968
+21
+-123.15217334945113
+31
+225.0058064203879
+12
+27.20610937774056
+22
+-123.04052302289502
+32
+223.27933338713598
+13
+27.20610937774056
+23
+-123.04052302289502
+33
+223.27933338713598
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.20610937774056
+20
+-123.04052302289502
+30
+223.27933338713598
+11
+27.24505009108968
+21
+-123.15217334945113
+31
+225.0058064203879
+12
+25.54991216311079
+22
+-121.09957184190016
+32
+224.67693992718193
+13
+25.54991216311079
+23
+-121.09957184190016
+33
+224.67693992718193
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.54991216311079
+20
+-121.09957184190016
+30
+224.67693992718193
+11
+27.24505009108968
+21
+-123.15217334945113
+31
+225.0058064203879
+12
+26.230766198074328
+22
+-121.51727183743442
+32
+226.02404522960325
+13
+26.230766198074328
+23
+-121.51727183743442
+33
+226.02404522960325
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.490269545627452
+20
+-115.47020496836781
+30
+223.9550156086094
+11
+26.448895037694015
+21
+-119.0588350829483
+31
+226.52662381126564
+12
+27.123664586196735
+22
+-116.4683649722625
+32
+225.71677866333414
+13
+27.123664586196735
+23
+-116.4683649722625
+33
+225.71677866333414
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.54991216311079
+20
+-121.09957184190016
+30
+224.67693992718193
+11
+26.230766198074328
+21
+-121.51727183743442
+31
+226.02404522960325
+12
+26.448895037694015
+22
+-119.0588350829483
+32
+226.52662381126564
+13
+26.448895037694015
+23
+-119.0588350829483
+33
+226.52662381126564
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.448895037694015
+20
+-119.0588350829483
+30
+226.52662381126564
+11
+26.230766198074328
+21
+-121.51727183743442
+31
+226.02404522960325
+12
+26.80635861726599
+22
+-119.24228234974143
+32
+226.51049992214448
+13
+26.80635861726599
+23
+-119.24228234974143
+33
+226.51049992214448
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.123664586196735
+20
+-116.4683649722625
+30
+225.71677866333414
+11
+26.448895037694015
+21
+-119.0588350829483
+31
+226.52662381126564
+12
+26.80635861726599
+22
+-119.24228234974143
+32
+226.51049992214448
+13
+26.80635861726599
+23
+-119.24228234974143
+33
+226.51049992214448
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.798375534029354
+20
+-114.41028742689635
+30
+223.45426237288592
+11
+29.787756983058
+21
+-114.30137511924823
+31
+223.94558465459585
+12
+30.06338421973226
+22
+-115.09965974290547
+32
+225.31489833259832
+13
+30.06338421973226
+23
+-115.09965974290547
+33
+225.31489833259832
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.014041278729664
+20
+-115.95635543658574
+30
+223.9632296653314
+11
+33.690346599015136
+21
+-115.04003177558864
+31
+221.50357601355356
+12
+31.795637515121992
+22
+-115.29801400152746
+32
+225.0140204771118
+13
+31.795637515121992
+23
+-115.29801400152746
+33
+225.0140204771118
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.123664586196735
+20
+-116.4683649722625
+30
+225.71677866333414
+11
+26.80635861726599
+21
+-119.24228234974143
+31
+226.51049992214448
+12
+27.797217237407285
+22
+-117.02631238071814
+32
+226.85214383691894
+13
+27.797217237407285
+23
+-117.02631238071814
+33
+226.85214383691894
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.557081695356075
+20
+-117.11484165872126
+30
+220.7363222708459
+11
+34.014041278729664
+21
+-115.95635543658574
+31
+223.9632296653314
+12
+34.93644942618695
+22
+-117.87023065283006
+32
+222.73325072728048
+13
+34.93644942618695
+23
+-117.87023065283006
+33
+222.73325072728048
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.24196389735671
+20
+-115.80059258319007
+30
+226.56039271112385
+11
+30.06338421973226
+21
+-115.09965974290547
+31
+225.31489833259832
+12
+27.797217237407285
+22
+-117.02631238071814
+32
+226.85214383691894
+13
+27.797217237407285
+23
+-117.02631238071814
+33
+226.85214383691894
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.915300225249364
+20
+-120.51120200114036
+30
+222.9991427856168
+11
+25.54991216311079
+21
+-121.09957184190016
+31
+224.67693992718193
+12
+25.474464530996894
+22
+-117.81668717197535
+32
+223.96657613288463
+13
+25.474464530996894
+23
+-117.81668717197535
+33
+223.96657613288463
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.06338421973226
+20
+-115.09965974290547
+30
+225.31489833259832
+11
+27.123664586196735
+21
+-116.4683649722625
+31
+225.71677866333414
+12
+27.797217237407285
+22
+-117.02631238071814
+32
+226.85214383691894
+13
+27.797217237407285
+23
+-117.02631238071814
+33
+226.85214383691894
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.51083959825398
+20
+-120.10901744608125
+30
+222.02045313839727
+11
+34.41713850675766
+21
+-120.88326834821848
+31
+223.7031178691312
+12
+33.192027157875586
+22
+-123.01618507705197
+32
+223.32587970856108
+13
+33.192027157875586
+23
+-123.01618507705197
+33
+223.32587970856108
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.56804842115303
+20
+-123.42019497804984
+30
+226.8183749370602
+11
+31.898465336309513
+21
+-124.04750553215841
+31
+227.2108243137816
+12
+31.744223604528237
+22
+-123.99609162156449
+32
+226.59994187311733
+13
+31.744223604528237
+23
+-123.99609162156449
+33
+226.59994187311733
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.795637515121992
+20
+-115.29801400152746
+30
+225.0140204771118
+11
+30.06338421973226
+21
+-115.09965974290547
+31
+225.31489833259832
+12
+30.24196389735671
+22
+-115.80059258319007
+32
+226.56039271112385
+13
+30.24196389735671
+23
+-115.80059258319007
+33
+226.56039271112385
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.56804842115303
+20
+-123.42019497804984
+30
+226.8183749370602
+11
+31.744223604528237
+21
+-123.99609162156449
+31
+226.59994187311733
+12
+33.50811622951415
+22
+-123.35356985130397
+32
+226.27168382855731
+13
+33.50811622951415
+23
+-123.35356985130397
+33
+226.27168382855731
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.569048995127297
+20
+-118.32048265092777
+30
+217.0892810862423
+11
+28.043638939069695
+21
+-120.5732637630389
+31
+216.54745756690727
+12
+26.648466193608243
+22
+-120.49416543904861
+32
+217.1814610561229
+13
+26.648466193608243
+23
+-120.49416543904861
+33
+217.1814610561229
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.569048995127297
+20
+-118.32048265092777
+30
+217.0892810862423
+11
+28.922847232655275
+21
+-119.28335263334925
+31
+216.37770039465153
+12
+28.043638939069695
+22
+-120.5732637630389
+32
+216.54745756690727
+13
+28.043638939069695
+23
+-120.5732637630389
+33
+216.54745756690727
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.498989499822954
+20
+-118.23317027021815
+30
+227.87707558124072
+11
+32.30004144272231
+21
+-117.92042766613314
+31
+228.51290441639435
+12
+32.376401747805346
+22
+-118.13521003819953
+32
+229.0830207977713
+13
+32.376401747805346
+23
+-118.13521003819953
+33
+229.0830207977713
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.53549641858775
+20
+-118.68616028722502
+30
+228.55214935406633
+11
+33.498989499822954
+21
+-118.23317027021815
+31
+227.87707558124072
+12
+32.376401747805346
+22
+-118.13521003819953
+32
+229.0830207977713
+13
+32.376401747805346
+23
+-118.13521003819953
+33
+229.0830207977713
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.544000049465346
+20
+-121.2717628087412
+30
+226.33435403910406
+11
+34.322828966615305
+21
+-119.45280558128545
+31
+227.83478840033786
+12
+34.60545336271943
+22
+-121.25290090071312
+32
+227.1758385166327
+13
+34.60545336271943
+23
+-121.25290090071312
+33
+227.1758385166327
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.32252474229223
+20
+-119.18478395268698
+30
+227.07240224679967
+11
+33.498989499822954
+21
+-118.23317027021815
+31
+227.87707558124072
+12
+33.53549641858775
+22
+-118.68616028722502
+32
+228.55214935406633
+13
+33.53549641858775
+23
+-118.68616028722502
+33
+228.55214935406633
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.420877099639295
+20
+-118.27058986194919
+30
+216.79448771721653
+11
+28.922847232655275
+21
+-119.28335263334925
+31
+216.37770039465153
+12
+27.569048995127297
+22
+-118.32048265092777
+32
+217.0892810862423
+13
+27.569048995127297
+23
+-118.32048265092777
+33
+217.0892810862423
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.544000049465346
+20
+-121.2717628087412
+30
+226.33435403910406
+11
+34.32252474229223
+21
+-119.18478395268698
+31
+227.07240224679967
+12
+34.322828966615305
+22
+-119.45280558128545
+32
+227.83478840033786
+13
+34.322828966615305
+23
+-119.45280558128545
+33
+227.83478840033786
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.91799429365416
+20
+-117.44249125463443
+30
+217.53101480329659
+11
+27.569048995127297
+21
+-118.32048265092777
+31
+217.0892810862423
+12
+26.6299085099028
+22
+-117.83859132323246
+32
+217.0844134970735
+13
+26.6299085099028
+23
+-117.83859132323246
+33
+217.0844134970735
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.59822522980408
+20
+-117.63323990518039
+30
+216.72238655265627
+11
+28.922847232655275
+21
+-119.28335263334925
+31
+216.37770039465153
+12
+28.420877099639295
+22
+-118.27058986194919
+32
+216.79448771721653
+13
+28.420877099639295
+23
+-118.27058986194919
+33
+216.79448771721653
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.10386070486408
+20
+-116.86142279762812
+30
+217.62289054885483
+11
+29.59822522980408
+21
+-117.63323990518039
+31
+216.72238655265627
+12
+28.420877099639295
+22
+-118.27058986194919
+32
+216.79448771721653
+13
+28.420877099639295
+23
+-118.27058986194919
+33
+216.79448771721653
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.91799429365416
+20
+-117.44249125463443
+30
+217.53101480329659
+11
+28.420877099639295
+21
+-118.27058986194919
+31
+216.79448771721653
+12
+27.569048995127297
+22
+-118.32048265092777
+32
+217.0892810862423
+13
+27.569048995127297
+23
+-118.32048265092777
+33
+217.0892810862423
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.292190210993358
+20
+-116.12063657102576
+30
+217.72632681868834
+11
+27.91799429365416
+21
+-117.44249125463443
+31
+217.53101480329659
+12
+27.35457084738407
+22
+-116.99558572408887
+32
+217.9511485934149
+13
+27.35457084738407
+23
+-116.99558572408887
+33
+217.9511485934149
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.35457084738407
+20
+-116.99558572408887
+30
+217.9511485934149
+11
+26.6299085099028
+21
+-117.83859132323246
+31
+217.0844134970735
+12
+25.5331798253436
+22
+-117.48356153824484
+32
+217.3789026417766
+13
+25.5331798253436
+23
+-117.48356153824484
+33
+217.3789026417766
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.35457084738407
+20
+-116.99558572408887
+30
+217.9511485934149
+11
+27.91799429365416
+21
+-117.44249125463443
+31
+217.53101480329659
+12
+26.6299085099028
+22
+-117.83859132323246
+32
+217.0844134970735
+13
+26.6299085099028
+23
+-117.83859132323246
+33
+217.0844134970735
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.119101221351137
+20
+-115.50184429796255
+30
+218.33264589450755
+11
+27.35457084738407
+21
+-116.99558572408887
+31
+217.9511485934149
+12
+26.773502390377672
+22
+-116.25175725425613
+32
+218.3390346052912
+13
+26.773502390377672
+23
+-116.25175725425613
+33
+218.3390346052912
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.773502390377672
+20
+-116.25175725425613
+30
+218.3390346052912
+11
+25.5331798253436
+21
+-117.48356153824484
+31
+217.3789026417766
+12
+24.86175674439432
+22
+-116.91344515686808
+32
+218.09078755769036
+13
+24.86175674439432
+23
+-116.91344515686808
+33
+218.09078755769036
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.23472111427384
+20
+-115.27245915839043
+30
+218.60796890685864
+11
+26.773502390377672
+21
+-116.25175725425613
+31
+218.3390346052912
+12
+24.86175674439432
+22
+-116.91344515686808
+32
+218.09078755769036
+13
+24.86175674439432
+23
+-116.91344515686808
+33
+218.09078755769036
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.119101221351137
+20
+-115.50184429796255
+30
+218.33264589450755
+11
+28.292190210993358
+21
+-116.12063657102576
+31
+217.72632681868834
+12
+27.35457084738407
+22
+-116.99558572408887
+32
+217.9511485934149
+13
+27.35457084738407
+23
+-116.99558572408887
+33
+217.9511485934149
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.32252474229223
+20
+-119.18478395268698
+30
+227.07240224679967
+11
+33.53549641858775
+21
+-118.68616028722502
+31
+228.55214935406633
+12
+34.322828966615305
+22
+-119.45280558128545
+32
+227.83478840033786
+13
+34.322828966615305
+23
+-119.45280558128545
+33
+227.83478840033786
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.23472111427384
+20
+-115.27245915839043
+30
+218.60796890685864
+11
+27.119101221351137
+21
+-115.50184429796255
+31
+218.33264589450755
+12
+26.773502390377672
+22
+-116.25175725425613
+32
+218.3390346052912
+13
+26.773502390377672
+23
+-116.25175725425613
+33
+218.3390346052912
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.922847232655275
+20
+-119.28335263334925
+30
+216.37770039465153
+11
+29.59822522980408
+21
+-117.63323990518039
+31
+216.72238655265627
+12
+29.374924576692713
+22
+-118.38649932902732
+32
+216.4008214432025
+13
+29.374924576692713
+23
+-118.38649932902732
+33
+216.4008214432025
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.922847232655275
+20
+-119.28335263334925
+30
+216.37770039465153
+11
+29.296130477025358
+21
+-119.7682862042749
+31
+215.98038342876117
+12
+28.043638939069695
+22
+-120.5732637630389
+32
+216.54745756690727
+13
+28.043638939069695
+23
+-120.5732637630389
+33
+216.54745756690727
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.10386070486408
+20
+-116.86142279762812
+30
+217.62289054885483
+11
+28.420877099639295
+21
+-118.27058986194919
+31
+216.79448771721653
+12
+27.91799429365416
+22
+-117.44249125463443
+32
+217.53101480329659
+13
+27.91799429365416
+23
+-117.44249125463443
+33
+217.53101480329659
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+25.18697254572409
+20
+-115.1748031506947
+30
+219.10689679664446
+11
+26.23472111427384
+21
+-115.27245915839043
+31
+218.60796890685864
+12
+25.747657973086802
+22
+-116.00989891743943
+32
+218.5690281935095
+13
+25.747657973086802
+23
+-116.00989891743943
+33
+218.5690281935095
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.292190210993358
+20
+-116.12063657102576
+30
+217.72632681868834
+11
+29.10386070486408
+21
+-116.86142279762812
+31
+217.62289054885483
+12
+27.91799429365416
+22
+-117.44249125463443
+32
+217.53101480329659
+13
+27.91799429365416
+23
+-117.44249125463443
+33
+217.53101480329659
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.037569102776406
+20
+-114.37347628380728
+30
+219.0238435564547
+11
+26.23472111427384
+21
+-115.27245915839043
+31
+218.60796890685864
+12
+25.18697254572409
+22
+-115.1748031506947
+32
+219.10689679664446
+13
+25.18697254572409
+23
+-115.1748031506947
+33
+219.10689679664446
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.773502390377672
+20
+-116.25175725425613
+30
+218.3390346052912
+11
+27.35457084738407
+21
+-116.99558572408887
+31
+217.9511485934149
+12
+25.5331798253436
+22
+-117.48356153824484
+32
+217.3789026417766
+13
+25.5331798253436
+23
+-117.48356153824484
+33
+217.3789026417766
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+24.86175674439432
+20
+-116.91344515686808
+30
+218.09078755769036
+11
+25.747657973086802
+21
+-116.00989891743943
+31
+218.5690281935095
+12
+26.23472111427384
+22
+-115.27245915839043
+32
+218.60796890685864
+13
+26.23472111427384
+23
+-115.27245915839043
+33
+218.60796890685864
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.037569102776406
+20
+-114.37347628380728
+30
+219.0238435564547
+11
+27.119101221351137
+21
+-115.50184429796255
+31
+218.33264589450755
+12
+26.23472111427384
+22
+-115.27245915839043
+32
+218.60796890685864
+13
+26.23472111427384
+23
+-115.27245915839043
+33
+218.60796890685864
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.938956471608876
+20
+-118.26511382413432
+30
+216.14496878752612
+11
+29.296130477025358
+21
+-119.7682862042749
+31
+215.98038342876117
+12
+29.374924576692713
+22
+-118.38649932902732
+32
+216.4008214432025
+13
+29.374924576692713
+23
+-118.38649932902732
+33
+216.4008214432025
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.374924576692713
+20
+-118.38649932902732
+30
+216.4008214432025
+11
+29.296130477025358
+21
+-119.7682862042749
+31
+215.98038342876117
+12
+28.922847232655275
+22
+-119.28335263334925
+32
+216.37770039465153
+13
+28.922847232655275
+23
+-119.28335263334925
+33
+216.37770039465153
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.898465336309513
+20
+-124.04750553215841
+30
+227.2108243137816
+11
+29.679453124055758
+21
+-123.91121303543648
+31
+227.2096074164895
+12
+31.744223604528237
+22
+-123.99609162156449
+32
+226.59994187311733
+13
+31.744223604528237
+23
+-123.99609162156449
+33
+226.59994187311733
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.867159531371435
+20
+-124.0420294943439
+30
+228.00119910503952
+11
+28.229520000447117
+21
+-123.45305120493855
+31
+227.8496953921655
+12
+29.679453124055758
+22
+-123.91121303543648
+32
+227.2096074164895
+13
+29.679453124055758
+23
+-123.91121303543648
+33
+227.2096074164895
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.229520000447117
+20
+-123.45305120493855
+30
+227.8496953921655
+11
+28.499671199306636
+21
+-123.48195251562744
+31
+228.63216035102434
+12
+27.502423868381534
+22
+-122.02258843800455
+32
+228.7021319453242
+13
+27.502423868381534
+23
+-122.02258843800455
+33
+228.7021319453242
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.898465336309513
+20
+-124.04750553215841
+30
+227.2108243137816
+11
+29.867159531371435
+21
+-124.0420294943439
+31
+228.00119910503952
+12
+29.679453124055758
+22
+-123.91121303543648
+32
+227.2096074164895
+13
+29.679453124055758
+23
+-123.91121303543648
+33
+227.2096074164895
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.867159531371435
+20
+-124.0420294943439
+30
+228.00119910503952
+11
+28.499671199306636
+21
+-123.48195251562744
+31
+228.63216035102434
+12
+28.229520000447117
+22
+-123.45305120493855
+32
+227.8496953921655
+13
+28.229520000447117
+23
+-123.45305120493855
+33
+227.8496953921655
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.499671199306636
+20
+-123.48195251562744
+30
+228.63216035102434
+11
+27.758580748381203
+21
+-122.09651494850343
+31
+229.157555756915
+12
+27.502423868381534
+22
+-122.02258843800455
+32
+228.7021319453242
+13
+27.502423868381534
+23
+-122.02258843800455
+33
+228.7021319453242
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.502423868381534
+20
+-122.02258843800455
+30
+228.7021319453242
+11
+27.758580748381203
+21
+-122.09651494850343
+31
+229.157555756915
+12
+27.879357804628086
+22
+-120.13487651354149
+32
+229.10979253819826
+13
+27.879357804628086
+23
+-120.13487651354149
+33
+229.10979253819826
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.879357804628086
+20
+-120.13487651354149
+30
+229.10979253819826
+11
+27.758580748381203
+21
+-122.09651494850343
+31
+229.157555756915
+12
+28.126692179259596
+22
+-120.31163084522785
+32
+229.57586420109547
+13
+28.126692179259596
+23
+-120.31163084522785
+33
+229.57586420109547
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.879357804628086
+20
+-120.13487651354149
+30
+229.10979253819826
+11
+28.126692179259596
+21
+-120.31163084522785
+31
+229.57586420109547
+12
+28.882081173367915
+22
+-118.07923276276026
+32
+229.37477192356664
+13
+28.882081173367915
+23
+-118.07923276276026
+33
+229.37477192356664
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.882081173367915
+20
+-118.07923276276026
+30
+229.37477192356664
+11
+28.126692179259596
+21
+-120.31163084522785
+31
+229.57586420109547
+12
+29.119984593985198
+22
+-118.44521462337751
+32
+229.89925465648753
+13
+29.119984593985198
+23
+-118.44521462337751
+33
+229.89925465648753
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.729331262866797
+20
+-117.4145026169178
+30
+229.11374745439852
+11
+28.882081173367915
+21
+-118.07923276276026
+31
+229.37477192356664
+12
+29.119984593985198
+22
+-118.44521462337751
+32
+229.89925465648753
+13
+29.119984593985198
+23
+-118.44521462337751
+33
+229.89925465648753
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.777094481584072
+20
+-117.65088491591997
+30
+229.42466471254534
+11
+30.729331262866797
+21
+-117.4145026169178
+31
+229.11374745439852
+12
+29.119984593985198
+22
+-118.44521462337751
+32
+229.89925465648753
+13
+29.119984593985198
+23
+-118.44521462337751
+33
+229.89925465648753
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.30004144272231
+20
+-117.92042766613314
+30
+228.51290441639435
+11
+30.729331262866797
+21
+-117.4145026169178
+31
+229.11374745439852
+12
+30.777094481584072
+22
+-117.65088491591997
+32
+229.42466471254534
+13
+30.777094481584072
+23
+-117.65088491591997
+33
+229.42466471254534
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.376401747805346
+20
+-118.13521003819953
+30
+229.0830207977713
+11
+32.30004144272231
+21
+-117.92042766613314
+31
+228.51290441639435
+12
+30.777094481584072
+22
+-117.65088491591997
+32
+229.42466471254534
+13
+30.777094481584072
+23
+-117.65088491591997
+33
+229.42466471254534
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.28511980072585
+20
+-123.2483082355317
+30
+224.8892885046636
+11
+31.186276196072875
+21
+-123.6565772770511
+31
+223.66539405307358
+12
+33.192027157875586
+22
+-123.01618507705197
+32
+223.32587970856108
+13
+33.192027157875586
+23
+-123.01618507705197
+33
+223.32587970856108
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.28511980072585
+20
+-123.2483082355317
+30
+224.8892885046636
+11
+31.410793746476404
+21
+-123.86923007885649
+31
+225.21998034380786
+12
+31.186276196072875
+22
+-123.6565772770511
+32
+223.66539405307358
+13
+31.186276196072875
+23
+-123.6565772770511
+33
+223.66539405307358
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.410793746476404
+20
+-123.86923007885649
+30
+225.21998034380786
+11
+28.910678259733693
+21
+-123.73932629291814
+31
+224.24798363169515
+12
+31.186276196072875
+22
+-123.6565772770511
+32
+223.66539405307358
+13
+31.186276196072875
+23
+-123.6565772770511
+33
+223.66539405307358
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.38522425317355
+20
+-117.14861055858049
+30
+227.6160511120727
+11
+30.51850380700007
+21
+-116.61135040409195
+31
+228.1709562772978
+12
+30.729331262866797
+22
+-117.4145026169178
+32
+229.11374745439852
+13
+30.729331262866797
+23
+-117.4145026169178
+33
+229.11374745439852
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.260536231229676
+20
+-123.9510664217544
+30
+225.89931325715588
+11
+27.737893494414486
+21
+-123.36665149719471
+31
+226.58442643264246
+12
+27.24505009108968
+22
+-123.15217334945113
+32
+225.0058064203879
+13
+27.24505009108968
+23
+-123.15217334945113
+33
+225.0058064203879
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.260536231229676
+20
+-123.9510664217544
+30
+225.89931325715588
+11
+27.24505009108968
+21
+-123.15217334945113
+31
+225.0058064203879
+12
+28.910678259733693
+22
+-123.73932629291814
+32
+224.24798363169515
+13
+28.910678259733693
+23
+-123.73932629291814
+33
+224.24798363169515
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.38522425317355
+20
+-117.14861055858049
+30
+227.6160511120727
+11
+30.729331262866797
+21
+-117.4145026169178
+31
+229.11374745439852
+12
+32.30004144272231
+22
+-117.92042766613314
+32
+228.51290441639435
+13
+32.30004144272231
+23
+-117.92042766613314
+33
+228.51290441639435
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.410793746476404
+20
+-123.86923007885649
+30
+225.21998034380786
+11
+29.260536231229676
+21
+-123.9510664217544
+31
+225.89931325715588
+12
+28.910678259733693
+22
+-123.73932629291814
+32
+224.24798363169515
+13
+28.910678259733693
+23
+-123.73932629291814
+33
+224.24798363169515
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.575958253552066
+20
+-117.69165097520688
+30
+227.09978243587335
+11
+32.38522425317355
+21
+-117.14861055858049
+31
+227.6160511120727
+12
+32.30004144272231
+22
+-117.92042766613314
+32
+228.51290441639435
+13
+32.30004144272231
+23
+-117.92042766613314
+33
+228.51290441639435
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.230766198074328
+20
+-121.51727183743442
+30
+226.02404522960325
+11
+26.859597873798002
+21
+-121.76004284722072
+31
+227.48310508290297
+12
+26.80635861726599
+22
+-119.24228234974143
+32
+226.51049992214448
+13
+26.80635861726599
+23
+-119.24228234974143
+33
+226.51049992214448
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.575958253552066
+20
+-117.69165097520688
+30
+227.09978243587335
+11
+32.30004144272231
+21
+-117.92042766613314
+31
+228.51290441639435
+12
+33.498989499822954
+22
+-118.23317027021815
+32
+227.87707558124072
+13
+33.498989499822954
+23
+-118.23317027021815
+33
+227.87707558124072
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.230766198074328
+20
+-121.51727183743442
+30
+226.02404522960325
+11
+27.737893494414486
+21
+-123.36665149719471
+31
+226.58442643264246
+12
+26.859597873798002
+22
+-121.76004284722072
+32
+227.48310508290297
+13
+26.859597873798002
+23
+-121.76004284722072
+33
+227.48310508290297
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.534569095451104
+20
+-119.05913930727122
+30
+225.97415244062532
+11
+33.575958253552066
+21
+-117.69165097520688
+31
+227.09978243587335
+12
+33.498989499822954
+22
+-118.23317027021815
+32
+227.87707558124072
+13
+33.498989499822954
+23
+-118.23317027021815
+33
+227.87707558124072
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.24505009108968
+20
+-123.15217334945113
+30
+225.0058064203879
+11
+27.737893494414486
+21
+-123.36665149719471
+31
+226.58442643264246
+12
+26.230766198074328
+22
+-121.51727183743442
+32
+226.02404522960325
+13
+26.230766198074328
+23
+-121.51727183743442
+33
+226.02404522960325
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.4128793662351
+20
+-121.1801912875059
+30
+225.18286497639775
+11
+34.534569095451104
+21
+-119.05913930727122
+31
+225.97415244062532
+12
+34.32252474229223
+22
+-119.18478395268698
+32
+227.07240224679967
+13
+34.32252474229223
+23
+-119.18478395268698
+33
+227.07240224679967
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.534569095451104
+20
+-119.05913930727122
+30
+225.97415244062532
+11
+33.498989499822954
+21
+-118.23317027021815
+31
+227.87707558124072
+12
+34.32252474229223
+22
+-119.18478395268698
+32
+227.07240224679967
+13
+34.32252474229223
+23
+-119.18478395268698
+33
+227.07240224679967
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.80635861726599
+20
+-119.24228234974143
+30
+226.51049992214448
+11
+26.859597873798002
+21
+-121.76004284722072
+31
+227.48310508290297
+12
+27.308937198928085
+22
+-119.81939589054866
+32
+227.85608410295055
+13
+27.308937198928085
+23
+-119.81939589054866
+33
+227.85608410295055
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.4128793662351
+20
+-121.1801912875059
+30
+225.18286497639775
+11
+34.32252474229223
+21
+-119.18478395268698
+31
+227.07240224679967
+12
+34.544000049465346
+22
+-121.2717628087412
+32
+226.33435403910406
+13
+34.544000049465346
+23
+-121.2717628087412
+33
+226.33435403910406
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.80635861726599
+20
+-119.24228234974143
+30
+226.51049992214448
+11
+27.308937198928085
+21
+-119.81939589054866
+31
+227.85608410295055
+12
+27.797217237407285
+22
+-117.02631238071814
+32
+226.85214383691894
+13
+27.797217237407285
+23
+-117.02631238071814
+33
+226.85214383691894
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.797217237407285
+20
+-117.02631238071814
+30
+226.85214383691894
+11
+27.308937198928085
+21
+-119.81939589054866
+31
+227.85608410295055
+12
+28.311356343344883
+22
+-117.66761725368684
+32
+228.18342947454184
+13
+28.311356343344883
+23
+-117.66761725368684
+33
+228.18342947454184
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.11079926362391
+20
+-122.75637750517525
+30
+221.71987950723297
+11
+30.733894627712388
+21
+-123.2051083816589
+31
+220.37581644804217
+12
+32.864377561961504
+22
+-122.58175274374982
+32
+219.94533903094043
+13
+32.864377561961504
+23
+-122.58175274374982
+33
+219.94533903094043
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.311356343344883
+20
+-117.66761725368684
+30
+228.18342947454184
+11
+27.879357804628086
+21
+-120.13487651354149
+31
+229.10979253819826
+12
+28.882081173367915
+22
+-118.07923276276026
+32
+229.37477192356664
+13
+28.882081173367915
+23
+-118.07923276276026
+33
+229.37477192356664
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.969364253745354
+20
+-123.4366230914928
+30
+222.0648698895602
+11
+28.302229613653687
+21
+-123.14882688189664
+31
+220.98913268329076
+12
+30.733894627712388
+22
+-123.2051083816589
+32
+220.37581644804217
+13
+30.733894627712388
+23
+-123.2051083816589
+33
+220.37581644804217
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.729331262866797
+20
+-117.4145026169178
+30
+229.11374745439852
+11
+30.51850380700007
+21
+-116.61135040409195
+31
+228.1709562772978
+12
+28.882081173367915
+22
+-118.07923276276026
+32
+229.37477192356664
+13
+28.882081173367915
+23
+-118.07923276276026
+33
+229.37477192356664
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.969364253745354
+20
+-123.4366230914928
+30
+222.0648698895602
+11
+28.616493339354005
+21
+-123.45274698061407
+31
+222.6623664600108
+12
+28.302229613653687
+22
+-123.14882688189664
+32
+220.98913268329076
+13
+28.302229613653687
+23
+-123.14882688189664
+33
+220.98913268329076
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.51850380700007
+20
+-116.61135040409195
+30
+228.1709562772978
+11
+28.311356343344883
+21
+-117.66761725368684
+31
+228.18342947454184
+12
+28.882081173367915
+22
+-118.07923276276026
+32
+229.37477192356664
+13
+28.882081173367915
+23
+-118.07923276276026
+33
+229.37477192356664
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+28.616493339354005
+20
+-123.45274698061407
+30
+222.6623664600108
+11
+26.66915344757498
+21
+-122.54828806821585
+31
+221.59423486181757
+12
+28.302229613653687
+22
+-123.14882688189664
+32
+220.98913268329076
+13
+28.302229613653687
+23
+-123.14882688189664
+33
+220.98913268329076
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.24196389735671
+20
+-115.80059258319007
+30
+226.56039271112385
+11
+27.797217237407285
+21
+-117.02631238071814
+31
+226.85214383691894
+12
+28.311356343344883
+22
+-117.66761725368684
+32
+228.18342947454184
+13
+28.311356343344883
+23
+-117.66761725368684
+33
+228.18342947454184
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+30.51850380700007
+20
+-116.61135040409195
+30
+228.1709562772978
+11
+30.24196389735671
+21
+-115.80059258319007
+31
+226.56039271112385
+12
+28.311356343344883
+22
+-117.66761725368684
+32
+228.18342947454184
+13
+28.311356343344883
+23
+-117.66761725368684
+33
+228.18342947454184
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.26718521583399
+20
+-116.17996031402075
+30
+226.16824755872554
+11
+30.24196389735671
+21
+-115.80059258319007
+31
+226.56039271112385
+12
+30.51850380700007
+22
+-116.61135040409195
+32
+228.1709562772978
+13
+30.51850380700007
+23
+-116.61135040409195
+33
+228.1709562772978
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+32.38522425317355
+20
+-117.14861055858049
+30
+227.6160511120727
+11
+32.26718521583399
+21
+-116.17996031402075
+31
+226.16824755872554
+12
+30.51850380700007
+22
+-116.61135040409195
+32
+228.1709562772978
+13
+30.51850380700007
+23
+-116.61135040409195
+33
+228.1709562772978
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.92034018723335
+20
+-117.20763007724966
+30
+225.52511733981868
+11
+32.26718521583399
+21
+-116.17996031402075
+31
+226.16824755872554
+12
+32.38522425317355
+22
+-117.14861055858049
+32
+227.6160511120727
+13
+32.38522425317355
+23
+-117.14861055858049
+33
+227.6160511120727
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.92034018723335
+20
+-117.20763007724966
+30
+225.52511733981868
+11
+32.38522425317355
+21
+-117.14861055858049
+31
+227.6160511120727
+12
+33.575958253552066
+22
+-117.69165097520688
+32
+227.09978243587335
+13
+33.575958253552066
+23
+-117.69165097520688
+33
+227.09978243587335
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.753914832362995
+20
+-118.65512940627382
+30
+224.70036520005695
+11
+33.92034018723335
+21
+-117.20763007724966
+31
+225.52511733981868
+12
+33.575958253552066
+22
+-117.69165097520688
+32
+227.09978243587335
+13
+33.575958253552066
+23
+-117.69165097520688
+33
+227.09978243587335
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.753914832362995
+20
+-118.65512940627382
+30
+224.70036520005695
+11
+33.575958253552066
+21
+-117.69165097520688
+31
+227.09978243587335
+12
+34.534569095451104
+22
+-119.05913930727122
+32
+225.97415244062532
+13
+34.534569095451104
+23
+-119.05913930727122
+33
+225.97415244062532
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.41713850675766
+20
+-120.88326834821848
+30
+223.7031178691312
+11
+34.753914832362995
+21
+-118.65512940627382
+31
+224.70036520005695
+12
+34.534569095451104
+22
+-119.05913930727122
+32
+225.97415244062532
+13
+34.534569095451104
+23
+-119.05913930727122
+33
+225.97415244062532
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.41713850675766
+20
+-120.88326834821848
+30
+223.7031178691312
+11
+34.534569095451104
+21
+-119.05913930727122
+31
+225.97415244062532
+12
+34.4128793662351
+22
+-121.1801912875059
+32
+225.18286497639775
+13
+34.4128793662351
+23
+-121.1801912875059
+33
+225.18286497639775
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.28511980072585
+20
+-123.2483082355317
+30
+224.8892885046636
+11
+34.4128793662351
+21
+-121.1801912875059
+31
+225.18286497639775
+12
+33.50811622951415
+22
+-123.35356985130397
+32
+226.27168382855731
+13
+33.50811622951415
+23
+-123.35356985130397
+33
+226.27168382855731
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+34.4128793662351
+20
+-121.1801912875059
+30
+225.18286497639775
+11
+34.544000049465346
+21
+-121.2717628087412
+31
+226.33435403910406
+12
+33.50811622951415
+22
+-123.35356985130397
+32
+226.27168382855731
+13
+33.50811622951415
+23
+-123.35356985130397
+33
+226.27168382855731
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.50811622951415
+20
+-123.35356985130397
+30
+226.27168382855731
+11
+31.410793746476404
+21
+-123.86923007885649
+31
+225.21998034380786
+12
+33.28511980072585
+22
+-123.2483082355317
+32
+224.8892885046636
+13
+33.28511980072585
+23
+-123.2483082355317
+33
+224.8892885046636
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+33.50811622951415
+20
+-123.35356985130397
+30
+226.27168382855731
+11
+31.744223604528237
+21
+-123.99609162156449
+31
+226.59994187311733
+12
+31.410793746476404
+22
+-123.86923007885649
+32
+225.21998034380786
+13
+31.410793746476404
+23
+-123.86923007885649
+33
+225.21998034380786
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.744223604528237
+20
+-123.99609162156449
+30
+226.59994187311733
+11
+29.260536231229676
+21
+-123.9510664217544
+31
+225.89931325715588
+12
+31.410793746476404
+22
+-123.86923007885649
+32
+225.21998034380786
+13
+31.410793746476404
+23
+-123.86923007885649
+33
+225.21998034380786
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+31.744223604528237
+20
+-123.99609162156449
+30
+226.59994187311733
+11
+29.679453124055758
+21
+-123.91121303543648
+31
+227.2096074164895
+12
+29.260536231229676
+22
+-123.9510664217544
+32
+225.89931325715588
+13
+29.260536231229676
+23
+-123.9510664217544
+33
+225.89931325715588
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.679453124055758
+20
+-123.91121303543648
+30
+227.2096074164895
+11
+27.737893494414486
+21
+-123.36665149719471
+31
+226.58442643264246
+12
+29.260536231229676
+22
+-123.9510664217544
+32
+225.89931325715588
+13
+29.260536231229676
+23
+-123.9510664217544
+33
+225.89931325715588
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+29.679453124055758
+20
+-123.91121303543648
+30
+227.2096074164895
+11
+28.229520000447117
+21
+-123.45305120493855
+31
+227.8496953921655
+12
+27.737893494414486
+22
+-123.36665149719471
+32
+226.58442643264246
+13
+27.737893494414486
+23
+-123.36665149719471
+33
+226.58442643264246
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.737893494414486
+20
+-123.36665149719471
+30
+226.58442643264246
+11
+28.229520000447117
+21
+-123.45305120493855
+31
+227.8496953921655
+12
+26.859597873798002
+22
+-121.76004284722072
+32
+227.48310508290297
+13
+26.859597873798002
+23
+-121.76004284722072
+33
+227.48310508290297
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.859597873798002
+20
+-121.76004284722072
+30
+227.48310508290297
+11
+28.229520000447117
+21
+-123.45305120493855
+31
+227.8496953921655
+12
+27.502423868381534
+22
+-122.02258843800455
+32
+228.7021319453242
+13
+27.502423868381534
+23
+-122.02258843800455
+33
+228.7021319453242
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+26.859597873798002
+20
+-121.76004284722072
+30
+227.48310508290297
+11
+27.502423868381534
+21
+-122.02258843800455
+31
+228.7021319453242
+12
+27.308937198928085
+22
+-119.81939589054866
+32
+227.85608410295055
+13
+27.308937198928085
+23
+-119.81939589054866
+33
+227.85608410295055
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.308937198928085
+20
+-119.81939589054866
+30
+227.85608410295055
+11
+27.502423868381534
+21
+-122.02258843800455
+31
+228.7021319453242
+12
+27.879357804628086
+22
+-120.13487651354149
+32
+229.10979253819826
+13
+27.879357804628086
+23
+-120.13487651354149
+33
+229.10979253819826
+70
+0
+ 0
+3DFACE
+ 8
+teeth_upper_half
+10
+27.308937198928085
+20
+-119.81939589054866
+30
+227.85608410295055
+11
+27.879357804628086
+21
+-120.13487651354149
+31
+229.10979253819826
+12
+28.311356343344883
+22
+-117.66761725368684
+32
+228.18342947454184
+13
+28.311356343344883
+23
+-117.66761725368684
+33
+228.18342947454184
+70
+0
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+56.198202555708534
+20
+-21.125779316483033
+30
+202.95359733730962
+11
+63.80709753300991
+21
+0.3967294145689564
+31
+208.44774996679917
+12
+-0.0013769588954903322
+22
+-10.37067736637421
+32
+205.94498812603302
+13
+-0.0013769588954903322
+23
+-10.37067736637421
+33
+205.94498812603302
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+63.80709753300991
+20
+0.3967294145689564
+30
+208.44774996679917
+11
+56.198202555708534
+21
+-21.125779316483033
+31
+202.95359733730962
+12
+63.043071399763726
+22
+-2.039126643707891
+32
+207.82553940120246
+13
+63.043071399763726
+23
+-2.039126643707891
+33
+207.82553940120246
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+-0.0013769588954903322
+20
+-10.37067736637421
+30
+205.94498812603302
+11
+54.98470353811467
+21
+-22.713124155909085
+31
+202.55106178959218
+12
+56.198202555708534
+22
+-21.125779316483033
+32
+202.95359733730962
+13
+56.198202555708534
+23
+-21.125779316483033
+33
+202.95359733730962
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+54.98470353811467
+20
+-22.713124155909085
+30
+202.55106178959218
+11
+-0.0013769588954903322
+21
+-10.37067736637421
+31
+205.94498812603302
+12
+47.0600345477703
+22
+-33.78990832494305
+32
+199.73986785004863
+13
+47.0600345477703
+23
+-33.78990832494305
+33
+199.73986785004863
+70
+15
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+47.0600345477703
+20
+-33.78990832494305
+30
+199.73986785004863
+11
+-0.0013769588954903322
+21
+-10.37067736637421
+31
+205.94498812603302
+12
+45.287166848560766
+22
+-36.65726365180847
+32
+199.011015859523
+13
+45.287166848560766
+23
+-36.65726365180847
+33
+199.011015859523
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+54.98470353811467
+20
+-22.713124155909085
+30
+202.55106178959218
+11
+47.0600345477703
+21
+-33.78990832494305
+31
+199.73986785004863
+12
+52.70715149513834
+22
+-26.116842817892337
+32
+201.6865810477682
+13
+52.70715149513834
+23
+-26.116842817892337
+33
+201.6865810477682
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+30.499225696507917
+20
+54.59008386008739
+30
+222.4969747984698
+11
+15.710543987340952
+21
+58.556117756360216
+31
+223.57575950128367
+12
+-0.0013769588954903322
+22
+-10.37067736637421
+32
+205.94498812603302
+13
+-0.0013769588954903322
+23
+-10.37067736637421
+33
+205.94498812603302
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+15.710543987340952
+20
+58.556117756360216
+30
+223.57575950128367
+11
+30.499225696507917
+21
+54.59008386008739
+31
+222.4969747984698
+12
+20.227250714800768
+22
+58.26040378165336
+32
+223.4813314361167
+13
+20.227250714800768
+23
+58.26040378165336
+33
+223.4813314361167
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+0.02064222602082667
+20
+-78.9613642520874
+30
+188.33601962039913
+11
+21.922793997827174
+21
+-64.83968768814368
+31
+191.87167780828494
+12
+-0.0013769588954903322
+22
+-10.37067736637421
+32
+205.94498812603302
+13
+-0.0013769588954903322
+23
+-10.37067736637421
+33
+205.94498812603302
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+21.922793997827174
+20
+-64.83968768814368
+30
+191.87167780828494
+11
+0.02064222602082667
+21
+-78.9613642520874
+31
+188.33601962039913
+12
+3.386200322442161
+22
+-78.12239892356456
+32
+188.5376621922188
+13
+3.386200322442161
+23
+-78.12239892356456
+33
+188.5376621922188
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+21.922793997827174
+20
+-64.83968768814368
+30
+191.87167780828494
+11
+3.386200322442161
+21
+-78.12239892356456
+31
+188.5376621922188
+12
+7.369323474766764
+22
+-76.32630914311012
+32
+188.98243646061863
+13
+7.369323474766764
+23
+-76.32630914311012
+33
+188.98243646061863
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+21.922793997827174
+20
+-64.83968768814368
+30
+191.87167780828494
+11
+31.964185822500113
+21
+-47.787145941420704
+31
+196.20831484727591
+12
+-0.0013769588954903322
+22
+-10.37067736637421
+32
+205.94498812603302
+13
+-0.0013769588954903322
+23
+-10.37067736637421
+33
+205.94498812603302
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+31.964185822500113
+20
+-47.787145941420704
+30
+196.20831484727591
+11
+21.922793997827174
+21
+-64.83968768814368
+31
+191.87167780828494
+12
+28.090564547544098
+22
+-54.73572811263838
+32
+194.44032515073545
+13
+28.090564547544098
+23
+-54.73572811263838
+33
+194.44032515073545
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+61.819061512907055
+20
+36.49703758177096
+30
+217.72370056627622
+11
+30.499225696507917
+21
+54.59008386008739
+31
+222.4969747984698
+12
+-0.0013769588954903322
+22
+-10.37067736637421
+32
+205.94498812603302
+13
+-0.0013769588954903322
+23
+-10.37067736637421
+33
+205.94498812603302
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+30.499225696507917
+20
+54.59008386008739
+30
+222.4969747984698
+11
+61.819061512907055
+21
+36.49703758177096
+31
+217.72370056627622
+12
+43.021055375034486
+22
+50.71338129873699
+32
+221.45041404020174
+13
+43.021055375034486
+23
+50.71338129873699
+33
+221.45041404020174
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+43.021055375034486
+20
+50.71338129873699
+30
+221.45041404020174
+11
+61.819061512907055
+21
+36.49703758177096
+31
+217.72370056627622
+12
+46.890490131114554
+22
+47.93730154381203
+32
+220.72187020535787
+13
+46.890490131114554
+23
+47.93730154381203
+33
+220.72187020535787
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+-0.0013769588954903322
+20
+-10.37067736637421
+30
+205.94498812603302
+11
+1.9080775878522782
+21
+58.22184637741549
+31
+223.546512234448
+12
+-0.023396143811807334
+22
+58.22000951933899
+32
+223.55395663166695
+13
+-0.023396143811807334
+23
+58.22000951933899
+33
+223.55395663166695
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+1.9080775878522782
+20
+58.22184637741549
+30
+223.546512234448
+11
+-0.0013769588954903322
+21
+-10.37067736637421
+31
+205.94498812603302
+12
+5.1018704468384195
+22
+58.22504085923823
+32
+223.53424287596778
+13
+5.1018704468384195
+23
+58.22504085923823
+33
+223.53424287596778
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+5.1018704468384195
+20
+58.22504085923823
+30
+223.53424287596778
+11
+-0.0013769588954903322
+21
+-10.37067736637421
+31
+205.94498812603302
+12
+15.710543987340952
+22
+58.556117756360216
+32
+223.57575950128367
+13
+15.710543987340952
+23
+58.556117756360216
+33
+223.57575950128367
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+63.80709753300991
+20
+0.3967294145689564
+30
+208.44774996679917
+11
+61.819061512907055
+21
+36.49703758177096
+31
+217.72370056627622
+12
+-0.0013769588954903322
+22
+-10.37067736637421
+32
+205.94498812603302
+13
+-0.0013769588954903322
+23
+-10.37067736637421
+33
+205.94498812603302
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+61.819061512907055
+20
+36.49703758177096
+30
+217.72370056627622
+11
+63.80709753300991
+21
+0.3967294145689564
+31
+208.44774996679917
+12
+62.19674852216449
+22
+35.58307560258467
+32
+217.48751699802014
+13
+62.19674852216449
+23
+35.58307560258467
+33
+217.48751699802014
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+62.19674852216449
+20
+35.58307560258467
+30
+217.48751699802014
+11
+63.80709753300991
+21
+0.3967294145689564
+31
+208.44774996679917
+12
+64.06148232849918
+22
+28.753929694133294
+32
+215.72667130986372
+13
+64.06148232849918
+23
+28.753929694133294
+33
+215.72667130986372
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+64.06148232849918
+20
+28.753929694133294
+30
+215.72667130986372
+11
+63.80709753300991
+21
+0.3967294145689564
+31
+208.44774996679917
+12
+66.77527673892673
+22
+14.510687365473165
+32
+212.05897194443241
+13
+66.77527673892673
+23
+14.510687365473165
+33
+212.05897194443241
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+64.06148232849918
+20
+28.753929694133294
+30
+215.72667130986372
+11
+66.77527673892673
+21
+14.510687365473165
+31
+212.05897194443241
+12
+67.14280040847146
+22
+18.304340453609445
+32
+213.0313861451527
+13
+67.14280040847146
+23
+18.304340453609445
+33
+213.0313861451527
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+67.14280040847146
+20
+18.304340453609445
+30
+213.0313861451527
+11
+66.77527673892673
+21
+14.510687365473165
+31
+212.05897194443241
+12
+67.51870662388943
+22
+15.943362132954196
+32
+212.42372656079127
+13
+67.51870662388943
+23
+15.943362132954196
+33
+212.42372656079127
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+-0.0013769588954903322
+20
+-10.37067736637421
+30
+205.94498812603302
+11
+36.96438339542795
+21
+-40.73555360935117
+31
+197.9981325218902
+12
+45.287166848560766
+22
+-36.65726365180847
+32
+199.011015859523
+13
+45.287166848560766
+23
+-36.65726365180847
+33
+199.011015859523
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+36.96438339542795
+20
+-40.73555360935117
+30
+197.9981325218902
+11
+-0.0013769588954903322
+21
+-10.37067736637421
+31
+205.94498812603302
+12
+33.92205897056724
+22
+-43.53251049850932
+32
+197.2925562232804
+13
+33.92205897056724
+23
+-43.53251049850932
+33
+197.2925562232804
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+33.92205897056724
+20
+-43.53251049850932
+30
+197.2925562232804
+11
+-0.0013769588954903322
+21
+-10.37067736637421
+31
+205.94498812603302
+12
+31.964185822500113
+22
+-47.787145941420704
+32
+196.20831484727591
+13
+31.964185822500113
+23
+-47.787145941420704
+33
+196.20831484727591
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+150.2071194138168
+20
+63.11528778381575
+30
+0.0
+11
+150.92122536252472
+21
+9.11157778802062
+31
+0.0
+12
+150.00253581613148
+22
+62.97630942057115
+32
+0.0
+13
+150.00253581613148
+23
+62.97630942057115
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+150.92122536252472
+20
+9.11157778802062
+30
+0.0
+11
+150.2071194138168
+21
+63.11528778381575
+31
+0.0
+12
+153.45831230291537
+22
+65.32389820728869
+32
+0.0
+13
+153.45831230291537
+23
+65.32389820728869
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+150.92122536252472
+20
+9.11157778802062
+30
+0.0
+11
+153.45831230291537
+21
+65.32389820728869
+31
+0.0
+12
+207.56317105018422
+22
+51.15553040137684
+32
+0.0
+13
+207.56317105018422
+23
+51.15553040137684
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+207.56317105018422
+20
+51.15553040137684
+30
+0.0
+11
+153.45831230291537
+21
+65.32389820728869
+31
+0.0
+12
+161.93324325498824
+22
+65.15680277813927
+32
+0.0
+13
+161.93324325498824
+23
+65.15680277813927
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+207.56317105018422
+20
+51.15553040137684
+30
+0.0
+11
+161.93324325498824
+21
+65.15680277813927
+31
+0.0
+12
+165.2231583967426
+22
+64.53610516473599
+32
+0.0
+13
+165.2231583967426
+23
+64.53610516473599
+33
+0.0
+70
+15
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+165.2231583967426
+20
+64.53610516473599
+30
+0.0
+11
+161.93324325498824
+21
+65.15680277813927
+31
+0.0
+12
+163.0676707146204
+22
+65.53557203523478
+32
+0.0
+13
+163.0676707146204
+23
+65.53557203523478
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+207.56317105018422
+20
+51.15553040137684
+30
+0.0
+11
+165.2231583967426
+21
+64.53610516473599
+31
+0.0
+12
+165.6747606034369
+22
+64.45795795272956
+32
+0.0
+13
+165.6747606034369
+23
+64.45795795272956
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+207.56317105018422
+20
+51.15553040137684
+30
+0.0
+11
+165.6747606034369
+21
+64.45795795272956
+31
+0.0
+12
+178.772471908505
+22
+64.0519796591585
+32
+0.0
+13
+178.772471908505
+23
+64.0519796591585
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+207.56317105018422
+20
+51.15553040137684
+30
+0.0
+11
+178.772471908505
+21
+64.0519796591585
+31
+0.0
+12
+188.03455346346396
+22
+63.19172801481241
+32
+0.0
+13
+188.03455346346396
+23
+63.19172801481241
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+207.56317105018422
+20
+51.15553040137684
+30
+0.0
+11
+188.03455346346396
+21
+63.19172801481241
+31
+0.0
+12
+204.7823481204203
+22
+52.89650128096435
+32
+0.0
+13
+204.7823481204203
+23
+52.89650128096435
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+75.4856334751608
+20
+-57.707072484678555
+30
+0.0
+11
+0.5870153282377297
+21
+-124.52170526188353
+31
+0.0
+12
+0.0500415877968566
+22
+-124.52572275737772
+32
+0.0
+13
+0.0500415877968566
+23
+-124.52572275737772
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+0.5870153282377297
+20
+-124.52170526188353
+30
+0.0
+11
+75.4856334751608
+21
+-57.707072484678555
+31
+0.0
+12
+1.2293774996949274
+22
+-124.7327474863056
+32
+0.0
+13
+1.2293774996949274
+23
+-124.7327474863056
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+1.2293774996949274
+20
+-124.7327474863056
+30
+0.0
+11
+75.4856334751608
+21
+-57.707072484678555
+31
+0.0
+12
+4.066515687136385
+22
+-125.65397467599094
+32
+0.0
+13
+4.066515687136385
+23
+-125.65397467599094
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+4.066515687136385
+20
+-125.65397467599094
+30
+0.0
+11
+75.4856334751608
+21
+-57.707072484678555
+31
+0.0
+12
+5.694128103007171
+22
+-126.29568034232395
+32
+0.0
+13
+5.694128103007171
+23
+-126.29568034232395
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+5.694128103007171
+20
+-126.29568034232395
+30
+0.0
+11
+75.4856334751608
+21
+-57.707072484678555
+31
+0.0
+12
+12.050245852555303
+22
+-129.01603569433578
+32
+0.0
+13
+12.050245852555303
+23
+-129.01603569433578
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+12.050245852555303
+20
+-129.01603569433578
+30
+0.0
+11
+75.4856334751608
+21
+-57.707072484678555
+31
+0.0
+12
+19.646401772745083
+22
+-131.1426020310535
+32
+0.0
+13
+19.646401772745083
+23
+-131.1426020310535
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+19.646401772745083
+20
+-131.1426020310535
+30
+0.0
+11
+75.4856334751608
+21
+-57.707072484678555
+31
+0.0
+12
+23.97241709557398
+22
+-132.2513945559714
+32
+0.0
+13
+23.97241709557398
+23
+-132.2513945559714
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+23.97241709557398
+20
+-132.2513945559714
+30
+0.0
+11
+75.4856334751608
+21
+-57.707072484678555
+31
+0.0
+12
+29.452586355276292
+22
+-132.5583955320613
+32
+0.0
+13
+29.452586355276292
+23
+-132.5583955320613
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+29.452586355276292
+20
+-132.5583955320613
+30
+0.0
+11
+75.4856334751608
+21
+-57.707072484678555
+31
+0.0
+12
+39.71140082925173
+22
+-133.49337109749126
+32
+0.0
+13
+39.71140082925173
+23
+-133.49337109749126
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+39.71140082925173
+20
+-133.49337109749126
+30
+0.0
+11
+75.4856334751608
+21
+-57.707072484678555
+31
+0.0
+12
+45.74266097181742
+22
+-133.89022958965745
+32
+0.0
+13
+45.74266097181742
+23
+-133.89022958965745
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+45.74266097181742
+20
+-133.89022958965745
+30
+0.0
+11
+75.4856334751608
+21
+-57.707072484678555
+31
+0.0
+12
+57.45734569729303
+22
+-133.9571306344953
+32
+0.0
+13
+57.45734569729303
+23
+-133.9571306344953
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+155.4506474646076
+20
+93.98739594944335
+30
+0.0
+11
+150.00253581613148
+21
+62.97630942057115
+31
+0.0
+12
+75.43559188736393
+22
+66.81865027269914
+32
+0.0
+13
+75.43559188736393
+23
+66.81865027269914
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+150.00253581613148
+20
+62.97630942057115
+30
+0.0
+11
+155.4506474646076
+21
+93.98739594944335
+31
+0.0
+12
+150.20473256970118
+22
+63.2729714349116
+32
+0.0
+13
+150.20473256970118
+23
+63.2729714349116
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+150.20473256970118
+20
+63.2729714349116
+30
+0.0
+11
+155.4506474646076
+21
+93.98739594944335
+31
+0.0
+12
+151.34232555055112
+22
+68.24278612394096
+32
+0.0
+13
+151.34232555055112
+23
+68.24278612394096
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+151.34232555055112
+20
+68.24278612394096
+30
+0.0
+11
+155.4506474646076
+21
+93.98739594944335
+31
+0.0
+12
+154.36488865751897
+22
+86.41977245781482
+32
+0.0
+13
+154.36488865751897
+23
+86.41977245781482
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+154.36488865751897
+20
+86.41977245781482
+30
+0.0
+11
+155.4506474646076
+21
+93.98739594944335
+31
+0.0
+12
+155.65543564267765
+22
+92.47526870173299
+32
+0.0
+13
+155.65543564267765
+23
+92.47526870173299
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+150.92122536252472
+20
+9.11157778802062
+30
+0.0
+11
+75.43559188736393
+21
+66.81865027269914
+31
+0.0
+12
+150.00253581613148
+22
+62.97630942057115
+32
+0.0
+13
+150.00253581613148
+23
+62.97630942057115
+33
+0.0
+70
+2
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+150.92122536252472
+20
+9.11157778802062
+30
+0.0
+11
+75.4856334751608
+21
+-57.707072484678555
+31
+0.0
+12
+75.43559188736393
+22
+66.81865027269914
+32
+0.0
+13
+75.43559188736393
+23
+66.81865027269914
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+150.92122536252472
+20
+9.11157778802062
+30
+0.0
+11
+131.46387231459195
+21
+-111.87433149397688
+31
+0.0
+12
+75.4856334751608
+22
+-57.707072484678555
+32
+0.0
+13
+75.4856334751608
+23
+-57.707072484678555
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+131.46387231459195
+20
+-111.87433149397688
+30
+0.0
+11
+150.92122536252472
+21
+9.11157778802062
+31
+0.0
+12
+138.13389095592626
+22
+-105.23847877066429
+32
+0.0
+13
+138.13389095592626
+23
+-105.23847877066429
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+138.13389095592626
+20
+-105.23847877066429
+30
+0.0
+11
+150.92122536252472
+21
+9.11157778802062
+31
+0.0
+12
+140.21847266616777
+22
+-102.54417750642781
+32
+0.0
+13
+140.21847266616777
+23
+-102.54417750642781
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+140.21847266616777
+20
+-102.54417750642781
+30
+0.0
+11
+150.92122536252472
+21
+9.11157778802062
+31
+0.0
+12
+141.8252948219265
+22
+-99.89843631624419
+32
+0.0
+13
+141.8252948219265
+23
+-99.89843631624419
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+141.8252948219265
+20
+-99.89843631624419
+30
+0.0
+11
+150.92122536252472
+21
+9.11157778802062
+31
+0.0
+12
+148.0122511163535
+22
+-86.3805018985429
+32
+0.0
+13
+148.0122511163535
+23
+-86.3805018985429
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+148.0122511163535
+20
+-86.3805018985429
+30
+0.0
+11
+150.92122536252472
+21
+9.11157778802062
+31
+0.0
+12
+148.6803146089252
+22
+-83.90327798788724
+32
+0.0
+13
+148.6803146089252
+23
+-83.90327798788724
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+148.6803146089252
+20
+-83.90327798788724
+30
+0.0
+11
+150.92122536252472
+21
+9.11157778802062
+31
+0.0
+12
+149.2194982662778
+22
+-80.52087012938733
+32
+0.0
+13
+149.2194982662778
+23
+-80.52087012938733
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+149.2194982662778
+20
+-80.52087012938733
+30
+0.0
+11
+150.92122536252472
+21
+9.11157778802062
+31
+0.0
+12
+151.13017123133824
+22
+-69.12290573060724
+32
+0.0
+13
+151.13017123133824
+23
+-69.12290573060724
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+151.13017123133824
+20
+-69.12290573060724
+30
+0.0
+11
+150.92122536252472
+21
+9.11157778802062
+31
+0.0
+12
+151.1370952980997
+22
+-66.28102452333562
+32
+0.0
+13
+151.1370952980997
+23
+-66.28102452333562
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+151.1370952980997
+20
+-66.28102452333562
+30
+0.0
+11
+150.92122536252472
+21
+9.11157778802062
+31
+0.0
+12
+151.83991490891796
+22
+-44.753153844529905
+32
+0.0
+13
+151.83991490891796
+23
+-44.753153844529905
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+151.1370952980997
+20
+-66.28102452333562
+30
+0.0
+11
+151.83991490891796
+21
+-44.753153844529905
+31
+0.0
+12
+151.82398169739437
+22
+-46.71373450373342
+32
+0.0
+13
+151.82398169739437
+23
+-46.71373450373342
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+151.82398169739437
+20
+-46.71373450373342
+30
+0.0
+11
+152.1215005230635
+21
+-58.81014504875605
+31
+0.0
+12
+151.1370952980997
+22
+-66.28102452333562
+32
+0.0
+13
+151.1370952980997
+23
+-66.28102452333562
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+152.1215005230635
+20
+-58.81014504875605
+30
+0.0
+11
+151.82398169739437
+21
+-46.71373450373342
+31
+0.0
+12
+152.128744448052
+22
+-51.298572089357805
+32
+0.0
+13
+152.128744448052
+23
+-51.298572089357805
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+152.1215005230635
+20
+-58.81014504875605
+30
+0.0
+11
+152.128744448052
+21
+-51.298572089357805
+31
+0.0
+12
+152.39520845532402
+22
+-55.30836606889562
+32
+0.0
+13
+152.39520845532402
+23
+-55.30836606889562
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+152.39520845532402
+20
+-55.30836606889562
+30
+0.0
+11
+152.128744448052
+21
+-51.298572089357805
+31
+0.0
+12
+152.15906739988134
+22
+-51.737680245277545
+32
+0.0
+13
+152.15906739988134
+23
+-51.737680245277545
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+152.39520845532402
+20
+-55.30836606889562
+30
+0.0
+11
+152.15906739988134
+21
+-51.737680245277545
+31
+0.0
+12
+152.20734470302705
+22
+-52.36434908727282
+32
+0.0
+13
+152.20734470302705
+23
+-52.36434908727282
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+77.22319314549554
+20
+135.2290095283172
+30
+0.0
+11
+75.43559188736393
+21
+66.81865027269914
+31
+0.0
+12
+67.45071519615227
+22
+133.35320891176647
+32
+0.0
+13
+67.45071519615227
+23
+133.35320891176647
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+75.43559188736393
+20
+66.81865027269914
+30
+0.0
+11
+77.22319314549554
+21
+135.2290095283172
+31
+0.0
+12
+155.4506474646076
+22
+93.98739594944335
+32
+0.0
+13
+155.4506474646076
+23
+93.98739594944335
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+155.4506474646076
+20
+93.98739594944335
+30
+0.0
+11
+77.22319314549554
+21
+135.2290095283172
+31
+0.0
+12
+79.58909068583961
+22
+135.3354473439336
+32
+0.0
+13
+79.58909068583961
+23
+135.3354473439336
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+155.4506474646076
+20
+93.98739594944335
+30
+0.0
+11
+79.58909068583961
+21
+135.3354473439336
+31
+0.0
+12
+81.7134066446291
+22
+135.0917010489897
+32
+0.0
+13
+81.7134066446291
+23
+135.0917010489897
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+155.4506474646076
+20
+93.98739594944335
+30
+0.0
+11
+81.7134066446291
+21
+135.0917010489897
+31
+0.0
+12
+103.12958334716033
+22
+125.47251047399183
+32
+0.0
+13
+103.12958334716033
+23
+125.47251047399183
+33
+0.0
+70
+15
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+103.12958334716033
+20
+125.47251047399183
+30
+0.0
+11
+81.7134066446291
+21
+135.0917010489897
+31
+0.0
+12
+90.43395657931623
+22
+134.78762726965974
+32
+0.0
+13
+90.43395657931623
+23
+134.78762726965974
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+155.4506474646076
+20
+93.98739594944335
+30
+0.0
+11
+103.12958334716033
+21
+125.47251047399183
+31
+0.0
+12
+127.8380798450767
+22
+113.04186127667909
+32
+0.0
+13
+127.8380798450767
+23
+113.04186127667909
+33
+0.0
+70
+15
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+127.8380798450767
+20
+113.04186127667909
+30
+0.0
+11
+103.12958334716033
+21
+125.47251047399183
+31
+0.0
+12
+112.42160365107954
+22
+124.11047730445505
+32
+0.0
+13
+112.42160365107954
+23
+124.11047730445505
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+155.4506474646076
+20
+93.98739594944335
+30
+0.0
+11
+127.8380798450767
+21
+113.04186127667909
+31
+0.0
+12
+130.7898412057679
+22
+111.07727073990137
+32
+0.0
+13
+130.7898412057679
+23
+111.07727073990137
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+155.4506474646076
+20
+93.98739594944335
+30
+0.0
+11
+130.7898412057679
+21
+111.07727073990137
+31
+0.0
+12
+131.94476460424062
+22
+110.51746569288046
+32
+0.0
+13
+131.94476460424062
+23
+110.51746569288046
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+155.4506474646076
+20
+93.98739594944335
+30
+0.0
+11
+131.94476460424062
+21
+110.51746569288046
+31
+0.0
+12
+135.09251970882826
+22
+108.6654777961255
+32
+0.0
+13
+135.09251970882826
+23
+108.6654777961255
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+155.4506474646076
+20
+93.98739594944335
+30
+0.0
+11
+135.09251970882826
+21
+108.6654777961255
+31
+0.0
+12
+154.2773776960589
+22
+94.9881733748572
+32
+0.0
+13
+154.2773776960589
+23
+94.9881733748572
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+1.4961295113643602
+20
+124.53245820934018
+30
+0.0
+11
+75.43559188736393
+21
+66.81865027269914
+31
+0.0
+12
+-0.0500415877968566
+22
+124.52572275737768
+32
+0.0
+13
+-0.0500415877968566
+23
+124.52572275737768
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+75.43559188736393
+20
+66.81865027269914
+30
+0.0
+11
+1.4961295113643602
+21
+124.53245820934018
+31
+0.0
+12
+3.111652033778774
+22
+125.72820287703352
+32
+0.0
+13
+3.111652033778774
+23
+125.72820287703352
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+75.43559188736393
+20
+66.81865027269914
+30
+0.0
+11
+3.111652033778774
+21
+125.72820287703352
+31
+0.0
+12
+14.638328578457244
+22
+133.41831150318043
+32
+0.0
+13
+14.638328578457244
+23
+133.41831150318043
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+75.43559188736393
+20
+66.81865027269914
+30
+0.0
+11
+14.638328578457244
+21
+133.41831150318043
+31
+0.0
+12
+15.527347551586262
+22
+133.93917071254708
+32
+0.0
+13
+15.527347551586262
+23
+133.93917071254708
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+75.43559188736393
+20
+66.81865027269914
+30
+0.0
+11
+15.527347551586262
+21
+133.93917071254708
+31
+0.0
+12
+20.575701115493853
+22
+136.42040759421332
+32
+0.0
+13
+20.575701115493853
+23
+136.42040759421332
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+75.43559188736393
+20
+66.81865027269914
+30
+0.0
+11
+20.575701115493853
+21
+136.42040759421332
+31
+0.0
+12
+39.19917507961585
+22
+145.5245815926033
+32
+0.0
+13
+39.19917507961585
+23
+145.5245815926033
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+75.43559188736393
+20
+66.81865027269914
+30
+0.0
+11
+39.19917507961585
+21
+145.5245815926033
+31
+0.0
+12
+43.42479622420087
+22
+144.46311338420125
+32
+0.0
+13
+43.42479622420087
+23
+144.46311338420125
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+75.43559188736393
+20
+66.81865027269914
+30
+0.0
+11
+43.42479622420087
+21
+144.46311338420125
+31
+0.0
+12
+67.45071519615227
+22
+133.35320891176647
+32
+0.0
+13
+67.45071519615227
+23
+133.35320891176647
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+75.4856334751608
+20
+-57.707072484678555
+30
+0.0
+11
+71.96375782213057
+21
+-132.6846066182198
+31
+0.0
+12
+57.45734569729303
+22
+-133.9571306344953
+32
+0.0
+13
+57.45734569729303
+23
+-133.9571306344953
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+71.96375782213057
+20
+-132.6846066182198
+30
+0.0
+11
+75.4856334751608
+21
+-57.707072484678555
+31
+0.0
+12
+75.38273873789217
+22
+-132.41127337391185
+32
+0.0
+13
+75.38273873789217
+23
+-132.41127337391185
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+75.38273873789217
+20
+-132.41127337391185
+30
+0.0
+11
+75.4856334751608
+21
+-57.707072484678555
+31
+0.0
+12
+77.45312482155377
+22
+-132.02853997457515
+32
+0.0
+13
+77.45312482155377
+23
+-132.02853997457515
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+77.45312482155377
+20
+-132.02853997457515
+30
+0.0
+11
+75.4856334751608
+21
+-57.707072484678555
+31
+0.0
+12
+131.46387231459195
+22
+-111.87433149397688
+32
+0.0
+13
+131.46387231459195
+23
+-111.87433149397688
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+77.45312482155377
+20
+-132.02853997457515
+30
+0.0
+11
+131.46387231459195
+21
+-111.87433149397688
+31
+0.0
+12
+87.43983444241641
+22
+-130.11991335792678
+32
+0.0
+13
+87.43983444241641
+23
+-130.11991335792678
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+87.43983444241641
+20
+-130.11991335792678
+30
+0.0
+11
+131.46387231459195
+21
+-111.87433149397688
+31
+0.0
+12
+91.58702021531865
+22
+-129.0839076201277
+32
+0.0
+13
+91.58702021531865
+23
+-129.0839076201277
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+91.58702021531865
+20
+-129.0839076201277
+30
+0.0
+11
+131.46387231459195
+21
+-111.87433149397688
+31
+0.0
+12
+92.5402225237455
+22
+-128.81529586719765
+32
+0.0
+13
+92.5402225237455
+23
+-128.81529586719765
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+92.5402225237455
+20
+-128.81529586719765
+30
+0.0
+11
+131.46387231459195
+21
+-111.87433149397688
+31
+0.0
+12
+94.3402234909714
+22
+-128.25324160305613
+32
+0.0
+13
+94.3402234909714
+23
+-128.25324160305613
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+94.3402234909714
+20
+-128.25324160305613
+30
+0.0
+11
+131.46387231459195
+21
+-111.87433149397688
+31
+0.0
+12
+103.75203731527698
+22
+-125.32052411763623
+32
+0.0
+13
+103.75203731527698
+23
+-125.32052411763623
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+103.75203731527698
+20
+-125.32052411763623
+30
+0.0
+11
+131.46387231459195
+21
+-111.87433149397688
+31
+0.0
+12
+108.88662792181431
+22
+-123.62229896536476
+32
+0.0
+13
+108.88662792181431
+23
+-123.62229896536476
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+108.88662792181431
+20
+-123.62229896536476
+30
+0.0
+11
+131.46387231459195
+21
+-111.87433149397688
+31
+0.0
+12
+111.03369727135565
+22
+-122.83041635292801
+32
+0.0
+13
+111.03369727135565
+23
+-122.83041635292801
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+111.03369727135565
+20
+-122.83041635292801
+30
+0.0
+11
+131.46387231459195
+21
+-111.87433149397688
+31
+0.0
+12
+114.96693914464883
+22
+-121.1924332316236
+32
+0.0
+13
+114.96693914464883
+23
+-121.1924332316236
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+114.96693914464883
+20
+-121.1924332316236
+30
+0.0
+11
+131.46387231459195
+21
+-111.87433149397688
+31
+0.0
+12
+116.84343596887011
+22
+-120.37714652373425
+32
+0.0
+13
+116.84343596887011
+23
+-120.37714652373425
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+116.84343596887011
+20
+-120.37714652373425
+30
+0.0
+11
+131.46387231459195
+21
+-111.87433149397688
+31
+0.0
+12
+123.01289177328475
+22
+-117.284316113146
+32
+0.0
+13
+123.01289177328475
+23
+-117.284316113146
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+123.01289177328475
+20
+-117.284316113146
+30
+0.0
+11
+131.46387231459195
+21
+-111.87433149397688
+31
+0.0
+12
+124.59032561713084
+22
+-116.50933980329062
+32
+0.0
+13
+124.59032561713084
+23
+-116.50933980329062
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+124.59032561713084
+20
+-116.50933980329062
+30
+0.0
+11
+131.46387231459195
+21
+-111.87433149397688
+31
+0.0
+12
+125.75512640643448
+22
+-115.86941167332861
+32
+0.0
+13
+125.75512640643448
+23
+-115.86941167332861
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+224.0704983034566
+20
+-51.20458580847195
+30
+0.0
+11
+151.83991490891796
+21
+-44.753153844529905
+31
+0.0
+12
+150.92122536252472
+22
+9.11157778802062
+32
+0.0
+13
+150.92122536252472
+23
+9.11157778802062
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+151.83991490891796
+20
+-44.753153844529905
+30
+0.0
+11
+224.0704983034566
+21
+-51.20458580847195
+31
+0.0
+12
+153.34938233885683
+22
+-53.25682195518751
+32
+0.0
+13
+153.34938233885683
+23
+-53.25682195518751
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+153.34938233885683
+20
+-53.25682195518751
+30
+0.0
+11
+224.0704983034566
+21
+-51.20458580847195
+31
+0.0
+12
+157.33717382266084
+22
+-56.943471056583014
+32
+0.0
+13
+157.33717382266084
+23
+-56.943471056583014
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+157.33717382266084
+20
+-56.943471056583014
+30
+0.0
+11
+224.0704983034566
+21
+-51.20458580847195
+31
+0.0
+12
+167.50483309564154
+22
+-61.303847657600755
+32
+0.0
+13
+167.50483309564154
+23
+-61.303847657600755
+33
+0.0
+70
+15
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+157.33717382266084
+20
+-56.943471056583014
+30
+0.0
+11
+167.50483309564154
+21
+-61.303847657600755
+31
+0.0
+12
+165.28900544160132
+22
+-61.760633255050024
+32
+0.0
+13
+165.28900544160132
+23
+-61.760633255050024
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+167.50483309564154
+20
+-61.303847657600755
+30
+0.0
+11
+224.0704983034566
+21
+-51.20458580847195
+31
+0.0
+12
+170.69633316787034
+22
+-62.611042677899285
+32
+0.0
+13
+170.69633316787034
+23
+-62.611042677899285
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+170.69633316787034
+20
+-62.611042677899285
+30
+0.0
+11
+224.0704983034566
+21
+-51.20458580847195
+31
+0.0
+12
+192.07830358887924
+22
+-59.66898804374048
+32
+0.0
+13
+192.07830358887924
+23
+-59.66898804374048
+33
+0.0
+70
+15
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+170.69633316787034
+20
+-62.611042677899285
+30
+0.0
+11
+192.07830358887924
+21
+-59.66898804374048
+31
+0.0
+12
+186.85150751151173
+22
+-61.73100454253733
+32
+0.0
+13
+186.85150751151173
+23
+-61.73100454253733
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+192.07830358887924
+20
+-59.66898804374048
+30
+0.0
+11
+224.0704983034566
+21
+-51.20458580847195
+31
+0.0
+12
+210.1935398476185
+22
+-57.76069933737556
+32
+0.0
+13
+210.1935398476185
+23
+-57.76069933737556
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+210.1935398476185
+20
+-57.76069933737556
+30
+0.0
+11
+224.0704983034566
+21
+-51.20458580847195
+31
+0.0
+12
+219.2931652251469
+22
+-55.43566949142061
+32
+0.0
+13
+219.2931652251469
+23
+-55.43566949142061
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+219.2931652251469
+20
+-55.43566949142061
+30
+0.0
+11
+224.0704983034566
+21
+-51.20458580847195
+31
+0.0
+12
+220.1168090085038
+22
+-55.19014345471434
+32
+0.0
+13
+220.1168090085038
+23
+-55.19014345471434
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+207.56317105018422
+20
+51.15553040137684
+30
+0.0
+11
+246.30976685797765
+21
+-12.139517811236814
+31
+0.0
+12
+150.92122536252472
+22
+9.11157778802062
+32
+0.0
+13
+150.92122536252472
+23
+9.11157778802062
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+246.30976685797765
+20
+-12.139517811236814
+30
+0.0
+11
+207.56317105018422
+21
+51.15553040137684
+31
+0.0
+12
+208.16678966221795
+22
+50.255220013725044
+32
+0.0
+13
+208.16678966221795
+23
+50.255220013725044
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+246.30976685797765
+20
+-12.139517811236814
+30
+0.0
+11
+208.16678966221795
+21
+50.255220013725044
+31
+0.0
+12
+216.0182466963588
+22
+40.94664106271533
+32
+0.0
+13
+216.0182466963588
+23
+40.94664106271533
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+246.30976685797765
+20
+-12.139517811236814
+30
+0.0
+11
+216.0182466963588
+21
+40.94664106271533
+31
+0.0
+12
+216.92884973224034
+22
+39.56057013270216
+32
+0.0
+13
+216.92884973224034
+23
+39.56057013270216
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+246.30976685797765
+20
+-12.139517811236814
+30
+0.0
+11
+216.92884973224034
+21
+39.56057013270216
+31
+0.0
+12
+219.17149969811135
+22
+36.68411922973808
+32
+0.0
+13
+219.17149969811135
+23
+36.68411922973808
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+246.30976685797765
+20
+-12.139517811236814
+30
+0.0
+11
+219.17149969811135
+21
+36.68411922973808
+31
+0.0
+12
+223.28382965094985
+22
+30.550361260574945
+32
+0.0
+13
+223.28382965094985
+23
+30.550361260574945
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+246.30976685797765
+20
+-12.139517811236814
+30
+0.0
+11
+223.28382965094985
+21
+30.550361260574945
+31
+0.0
+12
+229.66566169349895
+22
+22.76477452233004
+32
+0.0
+13
+229.66566169349895
+23
+22.76477452233004
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+246.30976685797765
+20
+-12.139517811236814
+30
+0.0
+11
+229.66566169349895
+21
+22.76477452233004
+31
+0.0
+12
+241.23675739763246
+22
+-1.1406180253132014
+32
+0.0
+13
+241.23675739763246
+23
+-1.1406180253132014
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+241.23675739763246
+20
+-1.1406180253132014
+30
+0.0
+11
+229.66566169349895
+21
+22.76477452233004
+31
+0.0
+12
+231.72620663197017
+22
+20.186471407656384
+32
+0.0
+13
+231.72620663197017
+23
+20.186471407656384
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+241.23675739763246
+20
+-1.1406180253132014
+30
+0.0
+11
+231.72620663197017
+21
+20.186471407656384
+31
+0.0
+12
+232.39956797250116
+22
+19.415701648959864
+32
+0.0
+13
+232.39956797250116
+23
+19.415701648959864
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+246.30976685797765
+20
+-12.139517811236814
+30
+0.0
+11
+224.0704983034566
+21
+-51.20458580847195
+31
+0.0
+12
+150.92122536252472
+22
+9.11157778802062
+32
+0.0
+13
+150.92122536252472
+23
+9.11157778802062
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+224.0704983034566
+20
+-51.20458580847195
+30
+0.0
+11
+246.30976685797765
+21
+-12.139517811236814
+31
+0.0
+12
+236.7712918935554
+22
+-40.02417113138695
+32
+0.0
+13
+236.7712918935554
+23
+-40.02417113138695
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+236.7712918935554
+20
+-40.02417113138695
+30
+0.0
+11
+246.30976685797765
+21
+-12.139517811236814
+31
+0.0
+12
+242.01092478312665
+22
+-26.520453991183174
+32
+0.0
+13
+242.01092478312665
+23
+-26.520453991183174
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+75.43559188736393
+20
+66.81865027269914
+30
+0.0
+11
+0.0
+21
+-2.255973186038318e-14
+31
+0.0
+12
+-0.0500415877968566
+22
+124.52572275737768
+32
+0.0
+13
+-0.0500415877968566
+23
+124.52572275737768
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+75.4856334751608
+20
+-57.707072484678555
+30
+0.0
+11
+0.0500415877968566
+21
+-124.52572275737772
+31
+0.0
+12
+0.0
+22
+-2.255973186038318e-14
+32
+0.0
+13
+0.0
+23
+-2.255973186038318e-14
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_cap_half
+10
+75.4856334751608
+20
+-57.707072484678555
+30
+0.0
+11
+0.0
+21
+-2.255973186038318e-14
+31
+0.0
+12
+75.43559188736393
+22
+66.81865027269914
+32
+0.0
+13
+75.43559188736393
+23
+66.81865027269914
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+45.92320662845352
+20
+-96.19029272002136
+30
+186.71795846851884
+11
+46.921366632347755
+21
+-91.55908585038726
+31
+201.60730528674364
+12
+43.82375457515449
+22
+-99.22766836125562
+32
+198.33689381406157
+13
+43.82375457515449
+23
+-99.22766836125562
+33
+198.33689381406157
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+45.92320662845352
+20
+-96.19029272002136
+30
+186.71795846851884
+11
+49.09736152532362
+21
+-87.92299674141044
+31
+191.15081107953677
+12
+46.921366632347755
+22
+-91.55908585038726
+32
+201.60730528674364
+13
+46.921366632347755
+23
+-91.55908585038726
+33
+201.60730528674364
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+45.92320662845352
+20
+-96.19029272002136
+30
+186.71795846851884
+11
+43.82375457515449
+21
+-99.22766836125562
+31
+198.33689381406157
+12
+39.7596218436631
+22
+-107.10859944960573
+32
+193.82098796285382
+13
+39.7596218436631
+23
+-107.10859944960573
+33
+193.82098796285382
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+40.819539385134455
+20
+-105.06573312038904
+30
+181.84793550529218
+11
+45.92320662845352
+21
+-96.19029272002136
+31
+186.71795846851884
+12
+39.7596218436631
+22
+-107.10859944960573
+32
+193.82098796285382
+13
+39.7596218436631
+23
+-107.10859944960573
+33
+193.82098796285382
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+49.09736152532362
+20
+-87.92299674141044
+30
+191.15081107953677
+11
+51.59665560639413
+21
+-78.96146085762227
+31
+195.0722626035245
+12
+49.999234530975706
+22
+-82.11565863890347
+32
+204.80348602460438
+13
+49.999234530975706
+23
+-82.11565863890347
+33
+204.80348602460438
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+49.09736152532362
+20
+-87.92299674141044
+30
+191.15081107953677
+11
+49.999234530975706
+21
+-82.11565863890347
+31
+204.80348602460438
+12
+46.921366632347755
+22
+-91.55908585038726
+32
+201.60730528674364
+13
+46.921366632347755
+23
+-91.55908585038726
+33
+201.60730528674364
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+51.59665560639413
+20
+-78.96146085762227
+30
+195.0722626035245
+11
+54.7525874663142
+21
+-67.73923402932417
+31
+200.62435649900746
+12
+53.31740922237298
+22
+-73.37985720281127
+32
+210.1827805045999
+13
+53.31740922237298
+23
+-73.37985720281127
+33
+210.1827805045999
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+51.59665560639413
+20
+-78.96146085762227
+30
+195.0722626035245
+11
+53.31740922237298
+21
+-73.37985720281127
+31
+210.1827805045999
+12
+49.999234530975706
+22
+-82.11565863890347
+32
+204.80348602460438
+13
+49.999234530975706
+23
+-82.11565863890347
+33
+204.80348602460438
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+40.819539385134455
+20
+-105.06573312038904
+30
+181.84793550529218
+11
+39.7596218436631
+21
+-107.10859944960573
+31
+193.82098796285382
+12
+33.98361884642567
+22
+-116.35184705652853
+32
+188.19892247307232
+13
+33.98361884642567
+23
+-116.35184705652853
+33
+188.19892247307232
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+33.814470122815464
+20
+-115.57151166792774
+30
+175.60607380218084
+11
+40.819539385134455
+21
+-105.06573312038904
+31
+181.84793550529218
+12
+33.98361884642567
+22
+-116.35184705652853
+32
+188.19892247307232
+13
+33.98361884642567
+23
+-116.35184705652853
+33
+188.19892247307232
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+33.814470122815464
+20
+-115.57151166792774
+30
+175.60607380218084
+11
+33.98361884642567
+21
+-116.35184705652853
+31
+188.19892247307232
+12
+27.737589270091433
+22
+-125.4828358882498
+32
+183.14849448628274
+13
+27.737589270091433
+23
+-125.4828358882498
+33
+183.14849448628274
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+27.93168438819096
+20
+-123.31706293252525
+30
+172.39355621817344
+11
+33.814470122815464
+21
+-115.57151166792774
+31
+175.60607380218084
+12
+27.737589270091433
+22
+-125.4828358882498
+32
+183.14849448628274
+13
+27.737589270091433
+23
+-125.4828358882498
+33
+183.14849448628274
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.7525874663142
+20
+-67.73923402932417
+30
+200.62435649900746
+11
+56.83850153723793
+21
+-59.948657564917134
+31
+205.49194566764947
+12
+55.57746129580484
+22
+-67.91872637992103
+32
+213.96915642915695
+13
+55.57746129580484
+23
+-67.91872637992103
+33
+213.96915642915695
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.7525874663142
+20
+-67.73923402932417
+30
+200.62435649900746
+11
+55.57746129580484
+21
+-67.91872637992103
+31
+213.96915642915695
+12
+53.31740922237298
+22
+-73.37985720281127
+32
+210.1827805045999
+13
+53.31740922237298
+23
+-73.37985720281127
+33
+210.1827805045999
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+56.83850153723793
+20
+-59.948657564917134
+30
+205.49194566764947
+11
+59.217261941519986
+21
+-54.031190257468666
+31
+215.62839588702082
+12
+57.475638536980604
+22
+-63.38395862068895
+32
+221.72322597480178
+13
+57.475638536980604
+23
+-63.38395862068895
+33
+221.72322597480178
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+56.83850153723793
+20
+-59.948657564917134
+30
+205.49194566764947
+11
+57.475638536980604
+21
+-63.38395862068895
+31
+221.72322597480178
+12
+55.57746129580484
+22
+-67.91872637992103
+32
+213.96915642915695
+13
+55.57746129580484
+23
+-67.91872637992103
+33
+213.96915642915695
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+59.217261941519986
+20
+-54.031190257468666
+30
+215.62839588702082
+11
+61.36542030893773
+21
+-51.066220005125395
+31
+233.3543302932702
+12
+58.5047077320957
+22
+-63.28052235085805
+32
+232.2649029924607
+13
+58.5047077320957
+23
+-63.28052235085805
+33
+232.2649029924607
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+59.217261941519986
+20
+-54.031190257468666
+30
+215.62839588702082
+11
+58.5047077320957
+21
+-63.28052235085805
+31
+232.2649029924607
+12
+57.475638536980604
+22
+-63.38395862068895
+32
+221.72322597480178
+13
+57.475638536980604
+23
+-63.38395862068895
+33
+221.72322597480178
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+61.36542030893773
+20
+-51.066220005125395
+30
+233.3543302932702
+11
+61.62781378755973
+21
+-54.45010715030213
+31
+244.19566826912273
+12
+59.404846659106454
+22
+-60.82391094231216
+32
+240.29642512071734
+13
+59.404846659106454
+23
+-60.82391094231216
+33
+240.29642512071734
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+58.5047077320957
+20
+-63.28052235085805
+30
+232.2649029924607
+11
+61.36542030893773
+21
+-51.066220005125395
+31
+233.3543302932702
+12
+59.404846659106454
+22
+-60.82391094231216
+32
+240.29642512071734
+13
+59.404846659106454
+23
+-60.82391094231216
+33
+240.29642512071734
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+61.62781378755973
+20
+-54.45010715030213
+30
+244.19566826912273
+11
+60.80628642562252
+21
+-56.46559329044347
+31
+249.40003376336736
+12
+59.016260931287455
+22
+-61.04051866031837
+32
+246.3778693382867
+13
+59.016260931287455
+23
+-61.04051866031837
+33
+246.3778693382867
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+59.404846659106454
+20
+-60.82391094231216
+30
+240.29642512071734
+11
+61.62781378755973
+21
+-54.45010715030213
+31
+244.19566826912273
+12
+59.016260931287455
+22
+-61.04051866031837
+32
+246.3778693382867
+13
+59.016260931287455
+23
+-61.04051866031837
+33
+246.3778693382867
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+61.62781378755973
+20
+-54.45010715030213
+30
+244.19566826912273
+11
+64.65907451989797
+21
+-46.011837102142586
+31
+248.28931075995115
+12
+66.0562247234592
+22
+-48.34158696798483
+32
+255.44892597837378
+13
+66.0562247234592
+23
+-48.34158696798483
+33
+255.44892597837378
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+61.62781378755973
+20
+-54.45010715030213
+30
+244.19566826912273
+11
+66.0562247234592
+21
+-48.34158696798483
+31
+255.44892597837378
+12
+60.80628642562252
+22
+-56.46559329044347
+32
+249.40003376336736
+13
+60.80628642562252
+23
+-56.46559329044347
+33
+249.40003376336736
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+64.65907451989797
+20
+-46.011837102142586
+30
+248.28931075995115
+11
+64.60464878850613
+21
+-41.75543459849045
+31
+249.93303477733724
+12
+68.06361849660631
+22
+-42.11654886994176
+32
+260.68553925086303
+13
+68.06361849660631
+23
+-42.11654886994176
+33
+260.68553925086303
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+64.65907451989797
+20
+-46.011837102142586
+30
+248.28931075995115
+11
+68.06361849660631
+21
+-42.11654886994176
+31
+260.68553925086303
+12
+66.0562247234592
+22
+-48.34158696798483
+32
+255.44892597837378
+13
+66.0562247234592
+23
+-48.34158696798483
+33
+255.44892597837378
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.931639252687994
+20
+-80.39679121374046
+30
+255.24174921437523
+11
+55.27071191088361
+21
+-86.12716056252286
+31
+258.9046100637755
+12
+55.220484475149696
+22
+-86.95586761848307
+32
+256.3393905719021
+13
+55.220484475149696
+23
+-86.95586761848307
+33
+256.3393905719021
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.615550181049436
+20
+-82.1171797605311
+30
+253.27706853618264
+11
+55.931639252687994
+21
+-80.39679121374046
+31
+255.24174921437523
+12
+55.220484475149696
+22
+-86.95586761848307
+32
+256.3393905719021
+13
+55.220484475149696
+23
+-86.95586761848307
+33
+256.3393905719021
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.59213955834287
+20
+-89.06657597173445
+30
+255.4875624673892
+11
+55.27071191088361
+21
+-86.12716056252286
+31
+258.9046100637755
+12
+54.11429441414395
+22
+-91.44500172926185
+32
+258.3551809363636
+13
+54.11429441414395
+23
+-91.44500172926185
+33
+258.3551809363636
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.59213955834287
+20
+-89.06657597173445
+30
+255.4875624673892
+11
+55.220484475149696
+21
+-86.95586761848307
+31
+256.3393905719021
+12
+55.27071191088361
+22
+-86.12716056252286
+32
+258.9046100637755
+13
+55.27071191088361
+23
+-86.12716056252286
+33
+258.9046100637755
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.221472643150946
+20
+-90.07812184584198
+30
+253.72732053427922
+11
+54.11429441414395
+21
+-91.44500172926185
+31
+258.3551809363636
+12
+53.237367802981154
+22
+-92.79788729381957
+32
+253.764740126013
+13
+53.237367802981154
+23
+-92.79788729381957
+33
+253.764740126013
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.221472643150946
+20
+-90.07812184584198
+30
+253.72732053427922
+11
+54.59213955834287
+21
+-89.06657597173445
+31
+255.4875624673892
+12
+54.11429441414395
+22
+-91.44500172926185
+32
+258.3551809363636
+13
+54.11429441414395
+23
+-91.44500172926185
+33
+258.3551809363636
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+52.139361376265185
+20
+-89.21199519814428
+30
+242.79532371016052
+11
+53.432497283779
+21
+-86.25736857278027
+31
+244.18410774483908
+12
+53.237367802981154
+22
+-92.79788729381957
+32
+253.764740126013
+13
+53.237367802981154
+23
+-92.79788729381957
+33
+253.764740126013
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+53.432497283779
+20
+-86.25736857278027
+30
+244.18410774483908
+11
+54.221472643150946
+21
+-90.07812184584198
+31
+253.72732053427922
+12
+53.237367802981154
+22
+-92.79788729381957
+32
+253.764740126013
+13
+53.237367802981154
+23
+-92.79788729381957
+33
+253.764740126013
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.060537976262786
+20
+-75.35305616205275
+30
+226.00579177023258
+11
+53.432497283779
+21
+-86.25736857278027
+31
+244.18410774483908
+12
+52.139361376265185
+22
+-89.21199519814428
+32
+242.79532371016052
+13
+52.139361376265185
+23
+-89.21199519814428
+33
+242.79532371016052
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.060537976262786
+20
+-75.35305616205275
+30
+226.00579177023258
+11
+52.139361376265185
+21
+-89.21199519814428
+31
+242.79532371016052
+12
+51.64155911647484
+22
+-85.98022021448836
+32
+234.9521164378673
+13
+51.64155911647484
+23
+-85.98022021448836
+33
+234.9521164378673
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.615550181049436
+20
+-82.1171797605311
+30
+253.27706853618264
+11
+55.220484475149696
+21
+-86.95586761848307
+31
+256.3393905719021
+12
+54.59213955834287
+22
+-89.06657597173445
+32
+255.4875624673892
+13
+54.59213955834287
+23
+-89.06657597173445
+33
+255.4875624673892
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.615550181049436
+20
+-82.1171797605311
+30
+253.27706853618264
+11
+54.59213955834287
+21
+-89.06657597173445
+31
+255.4875624673892
+12
+54.221472643150946
+22
+-90.07812184584198
+32
+253.72732053427922
+13
+54.221472643150946
+23
+-90.07812184584198
+33
+253.72732053427922
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.79203071084494
+20
+-72.12432342163089
+30
+232.24117349526117
+11
+59.404846659106454
+21
+-60.82391094231216
+31
+240.29642512071734
+12
+57.2451581898455
+22
+-68.52808769897692
+32
+239.54499104280652
+13
+57.2451581898455
+23
+-68.52808769897692
+33
+239.54499104280652
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.79203071084494
+20
+-72.12432342163089
+30
+232.24117349526117
+11
+58.5047077320957
+21
+-63.28052235085805
+31
+232.2649029924607
+12
+59.404846659106454
+22
+-60.82391094231216
+32
+240.29642512071734
+13
+59.404846659106454
+23
+-60.82391094231216
+33
+240.29642512071734
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+59.404846659106454
+20
+-60.82391094231216
+30
+240.29642512071734
+11
+59.016260931287455
+21
+-61.04051866031837
+31
+246.3778693382867
+12
+56.8321128264541
+22
+-69.85602686904838
+32
+246.76727647177592
+13
+56.8321128264541
+23
+-69.85602686904838
+33
+246.76727647177592
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.2451581898455
+20
+-68.52808769897692
+30
+239.54499104280652
+11
+59.404846659106454
+21
+-60.82391094231216
+31
+240.29642512071734
+12
+56.8321128264541
+22
+-69.85602686904838
+32
+246.76727647177592
+13
+56.8321128264541
+23
+-69.85602686904838
+33
+246.76727647177592
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.060537976262786
+20
+-75.35305616205275
+30
+226.00579177023258
+11
+58.5047077320957
+21
+-63.28052235085805
+31
+232.2649029924607
+12
+55.79203071084494
+22
+-72.12432342163089
+32
+232.24117349526117
+13
+55.79203071084494
+23
+-72.12432342163089
+33
+232.24117349526117
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.475638536980604
+20
+-63.38395862068895
+30
+221.72322597480178
+11
+58.5047077320957
+21
+-63.28052235085805
+31
+232.2649029924607
+12
+54.060537976262786
+22
+-75.35305616205275
+32
+226.00579177023258
+13
+54.060537976262786
+23
+-75.35305616205275
+33
+226.00579177023258
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+53.432497283779
+20
+-86.25736857278027
+30
+244.18410774483908
+11
+55.615550181049436
+21
+-82.1171797605311
+31
+253.27706853618264
+12
+54.221472643150946
+22
+-90.07812184584198
+32
+253.72732053427922
+13
+54.221472643150946
+23
+-90.07812184584198
+33
+253.72732053427922
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+53.432497283779
+20
+-86.25736857278027
+30
+244.18410774483908
+11
+54.95301045033293
+21
+-81.74876410532804
+31
+246.21936846597782
+12
+55.615550181049436
+22
+-82.1171797605311
+32
+253.27706853618264
+13
+55.615550181049436
+23
+-82.1171797605311
+33
+253.27706853618264
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+56.8321128264541
+20
+-69.85602686904838
+30
+246.76727647177592
+11
+56.997702125484764
+21
+-69.43954377080735
+31
+249.5643148978057
+12
+56.370148191917856
+22
+-76.34361055787785
+32
+252.56822586350094
+13
+56.370148191917856
+23
+-76.34361055787785
+33
+252.56822586350094
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+56.8321128264541
+20
+-69.85602686904838
+30
+246.76727647177592
+11
+56.370148191917856
+21
+-76.34361055787785
+31
+252.56822586350094
+12
+56.28344425985145
+22
+-77.11968680595221
+32
+249.83264075072495
+13
+56.28344425985145
+23
+-77.11968680595221
+33
+249.83264075072495
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+56.28344425985145
+20
+-77.11968680595221
+30
+249.83264075072495
+11
+56.370148191917856
+21
+-76.34361055787785
+31
+252.56822586350094
+12
+55.931639252687994
+22
+-80.39679121374046
+32
+255.24174921437523
+13
+55.931639252687994
+23
+-80.39679121374046
+33
+255.24174921437523
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+56.28344425985145
+20
+-77.11968680595221
+30
+249.83264075072495
+11
+55.931639252687994
+21
+-80.39679121374046
+31
+255.24174921437523
+12
+55.615550181049436
+22
+-82.1171797605311
+32
+253.27706853618264
+13
+55.615550181049436
+23
+-82.1171797605311
+33
+253.27706853618264
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.2451581898455
+20
+-68.52808769897692
+30
+239.54499104280652
+11
+56.8321128264541
+21
+-69.85602686904838
+31
+246.76727647177592
+12
+56.28344425985145
+22
+-77.11968680595221
+32
+249.83264075072495
+13
+56.28344425985145
+23
+-77.11968680595221
+33
+249.83264075072495
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.2451581898455
+20
+-68.52808769897692
+30
+239.54499104280652
+11
+56.28344425985145
+21
+-77.11968680595221
+31
+249.83264075072495
+12
+56.078123264231756
+22
+-76.64266306742432
+32
+245.31764757248857
+13
+56.078123264231756
+23
+-76.64266306742432
+33
+245.31764757248857
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+56.078123264231756
+20
+-76.64266306742432
+30
+245.31764757248857
+11
+56.28344425985145
+21
+-77.11968680595221
+31
+249.83264075072495
+12
+55.615550181049436
+22
+-82.1171797605311
+32
+253.27706853618264
+13
+55.615550181049436
+23
+-82.1171797605311
+33
+253.27706853618264
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+56.078123264231756
+20
+-76.64266306742432
+30
+245.31764757248857
+11
+55.615550181049436
+21
+-82.1171797605311
+31
+253.27706853618264
+12
+54.95301045033293
+22
+-81.74876410532804
+32
+246.21936846597782
+13
+54.95301045033293
+23
+-81.74876410532804
+33
+246.21936846597782
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.79203071084494
+20
+-72.12432342163089
+30
+232.24117349526117
+11
+57.2451581898455
+21
+-68.52808769897692
+31
+239.54499104280652
+12
+56.078123264231756
+22
+-76.64266306742432
+32
+245.31764757248857
+13
+56.078123264231756
+23
+-76.64266306742432
+33
+245.31764757248857
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.79203071084494
+20
+-72.12432342163089
+30
+232.24117349526117
+11
+56.078123264231756
+21
+-76.64266306742432
+31
+245.31764757248857
+12
+55.24786466422329
+22
+-76.9380648850942
+32
+237.85472070399385
+13
+55.24786466422329
+23
+-76.9380648850942
+33
+237.85472070399385
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.24786466422329
+20
+-76.9380648850942
+30
+237.85472070399385
+11
+56.078123264231756
+21
+-76.64266306742432
+31
+245.31764757248857
+12
+53.432497283779
+22
+-86.25736857278027
+32
+244.18410774483908
+13
+53.432497283779
+23
+-86.25736857278027
+33
+244.18410774483908
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+53.432497283779
+20
+-86.25736857278027
+30
+244.18410774483908
+11
+56.078123264231756
+21
+-76.64266306742432
+31
+245.31764757248857
+12
+54.95301045033293
+22
+-81.74876410532804
+32
+246.21936846597782
+13
+54.95301045033293
+23
+-81.74876410532804
+33
+246.21936846597782
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.060537976262786
+20
+-75.35305616205275
+30
+226.00579177023258
+11
+55.79203071084494
+21
+-72.12432342163089
+31
+232.24117349526117
+12
+55.24786466422329
+22
+-76.9380648850942
+32
+237.85472070399385
+13
+55.24786466422329
+23
+-76.9380648850942
+33
+237.85472070399385
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.060537976262786
+20
+-75.35305616205275
+30
+226.00579177023258
+11
+55.24786466422329
+21
+-76.9380648850942
+31
+237.85472070399385
+12
+53.432497283779
+22
+-86.25736857278027
+32
+244.18410774483908
+13
+53.432497283779
+23
+-86.25736857278027
+33
+244.18410774483908
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+47.68466545885508
+20
+-89.14871653894465
+30
+214.62415139665677
+11
+41.85481475643957
+21
+-95.14193570283135
+31
+209.42221969699415
+12
+45.037305399761046
+22
+-94.40358327081286
+32
+207.8162194956663
+13
+45.037305399761046
+23
+-94.40358327081286
+33
+207.8162194956663
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+45.037305399761046
+20
+-94.40358327081286
+30
+207.8162194956663
+11
+48.50619282079229
+21
+-87.18646965533587
+31
+211.59711938240898
+12
+47.68466545885508
+22
+-89.14871653894465
+32
+214.62415139665677
+13
+47.68466545885508
+23
+-89.14871653894465
+33
+214.62415139665677
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+45.037305399761046
+20
+-94.40358327081286
+30
+207.8162194956663
+11
+41.85481475643957
+21
+-95.14193570283135
+31
+209.42221969699415
+12
+38.02980234285768
+22
+-102.41350547213284
+32
+207.1472302092993
+13
+38.02980234285768
+23
+-102.41350547213284
+33
+207.1472302092993
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+41.31725037762789
+20
+-101.2954810849599
+30
+203.5662057027956
+11
+45.037305399761046
+21
+-94.40358327081286
+31
+207.8162194956663
+12
+38.02980234285768
+22
+-102.41350547213284
+32
+207.1472302092993
+13
+38.02980234285768
+23
+-102.41350547213284
+33
+207.1472302092993
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+41.31725037762789
+20
+-101.2954810849599
+30
+203.5662057027956
+11
+38.02980234285768
+21
+-102.41350547213284
+31
+207.1472302092993
+12
+36.094935648323265
+22
+-108.78943883440427
+32
+203.87621028797145
+13
+36.094935648323265
+23
+-108.78943883440427
+33
+203.87621028797145
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+37.718580860387746
+20
+-108.40733308466513
+30
+200.3475123650306
+11
+41.31725037762789
+21
+-101.2954810849599
+31
+203.5662057027956
+12
+36.094935648323265
+22
+-108.78943883440427
+32
+203.87621028797145
+13
+36.094935648323265
+23
+-108.78943883440427
+33
+203.87621028797145
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+32.70131332481207
+20
+-118.28306305918852
+30
+196.19059121500956
+11
+32.38461580452743
+21
+-118.32139532389283
+31
+200.64595642593028
+12
+26.883023146672084
+22
+-129.81012265917437
+32
+197.18357940540918
+13
+26.883023146672084
+23
+-129.81012265917437
+33
+197.18357940540918
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+26.859293649474964
+20
+-128.5734507860156
+30
+192.62508214897804
+11
+32.70131332481207
+21
+-118.28306305918852
+31
+196.19059121500956
+12
+26.883023146672084
+22
+-129.81012265917437
+32
+197.18357940540918
+13
+26.883023146672084
+23
+-129.81012265917437
+33
+197.18357940540918
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+26.859293649474964
+20
+-128.5734507860156
+30
+192.62508214897804
+11
+26.883023146672084
+21
+-129.81012265917437
+31
+197.18357940540918
+12
+22.13864482886328
+22
+-138.383772531087
+32
+195.03149654422202
+13
+22.13864482886328
+23
+-138.383772531087
+33
+195.03149654422202
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+22.047681756274336
+20
+-135.79817000956913
+30
+191.14959418223214
+11
+26.859293649474964
+21
+-128.5734507860156
+31
+192.62508214897804
+12
+22.13864482886328
+22
+-138.383772531087
+32
+195.03149654422202
+13
+22.13864482886328
+23
+-138.383772531087
+33
+195.03149654422202
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+32.70131332481207
+20
+-118.28306305918852
+30
+196.19059121500956
+11
+37.718580860387746
+21
+-108.40733308466513
+31
+200.3475123650306
+12
+36.094935648323265
+22
+-108.78943883440427
+32
+203.87621028797145
+13
+36.094935648323265
+23
+-108.78943883440427
+33
+203.87621028797145
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+32.70131332481207
+20
+-118.28306305918852
+30
+196.19059121500956
+11
+36.094935648323265
+21
+-108.78943883440427
+31
+203.87621028797145
+12
+32.38461580452743
+22
+-118.32139532389283
+32
+200.64595642593028
+13
+32.38461580452743
+23
+-118.32139532389283
+33
+200.64595642593028
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+64.60075471717121
+20
+-50.61353421244834
+30
+258.41359200639806
+11
+68.06361849660631
+21
+-42.11654886994176
+31
+260.68553925086303
+12
+69.20716730448137
+22
+-46.924205846944304
+32
+266.1737460385031
+13
+69.20716730448137
+23
+-46.924205846944304
+33
+266.1737460385031
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+66.0562247234592
+20
+-48.34158696798483
+30
+255.44892597837378
+11
+68.06361849660631
+21
+-42.11654886994176
+31
+260.68553925086303
+12
+64.60075471717121
+22
+-50.61353421244834
+32
+258.41359200639806
+13
+64.60075471717121
+23
+-50.61353421244834
+33
+258.41359200639806
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+60.10504936101532
+20
+-57.223111854813496
+30
+250.92511029476685
+11
+66.0562247234592
+21
+-48.34158696798483
+31
+255.44892597837378
+12
+64.60075471717121
+22
+-50.61353421244834
+32
+258.41359200639806
+13
+64.60075471717121
+23
+-50.61353421244834
+33
+258.41359200639806
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+60.80628642562252
+20
+-56.46559329044347
+30
+249.40003376336736
+11
+66.0562247234592
+21
+-48.34158696798483
+31
+255.44892597837378
+12
+60.10504936101532
+22
+-57.223111854813496
+32
+250.92511029476685
+13
+60.10504936101532
+23
+-57.223111854813496
+33
+250.92511029476685
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+59.217261941519986
+20
+-54.031190257468666
+30
+215.62839588702082
+11
+60.66372690784597
+21
+-46.04560600199198
+31
+216.56327723172453
+12
+61.756957012690215
+22
+-45.20107928123712
+32
+232.65096365840293
+13
+61.756957012690215
+23
+-45.20107928123712
+33
+232.65096365840293
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+59.217261941519986
+20
+-54.031190257468666
+30
+215.62839588702082
+11
+61.756957012690215
+21
+-45.20107928123712
+31
+232.65096365840293
+12
+61.36542030893773
+22
+-51.066220005125395
+32
+233.3543302932702
+13
+61.36542030893773
+23
+-51.066220005125395
+33
+233.3543302932702
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+20.91140390971993
+20
+-131.6710628432026
+30
+168.38345372645168
+11
+27.737589270091433
+21
+-125.4828358882498
+31
+183.14849448628274
+12
+20.658289272950658
+22
+-133.2505955284293
+32
+180.0673105425317
+13
+20.658289272950658
+23
+-133.2505955284293
+33
+180.0673105425317
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+20.91140390971993
+20
+-131.6710628432026
+30
+168.38345372645168
+11
+27.93168438819096
+21
+-123.31706293252525
+31
+172.39355621817344
+12
+27.737589270091433
+22
+-125.4828358882498
+32
+183.14849448628274
+13
+27.737589270091433
+23
+-125.4828358882498
+33
+183.14849448628274
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+7.385286283038533
+20
+-141.97818290779992
+30
+176.6073673165957
+11
+0.020623870886214313
+21
+-143.83151748375957
+31
+176.454646706429
+12
+0.020623870886214313
+22
+-142.56472740261827
+32
+165.9472861924093
+13
+0.020623870886214313
+23
+-142.56472740261827
+33
+165.9472861924093
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+7.8763043404250785
+20
+-141.25565014057725
+30
+166.21080530102685
+11
+7.385286283038533
+21
+-141.97818290779992
+31
+176.6073673165957
+12
+0.020623870886214313
+22
+-142.56472740261827
+32
+165.9472861924093
+13
+0.020623870886214313
+23
+-142.56472740261827
+33
+165.9472861924093
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+8.860774249782521
+20
+-144.30823699796642
+30
+188.86304417026128
+11
+0.020623870886214313
+21
+-146.38213420813025
+31
+189.44411262726717
+12
+7.385286283038533
+22
+-141.97818290779992
+32
+176.6073673165957
+13
+7.385286283038533
+23
+-141.97818290779992
+33
+176.6073673165957
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+7.385286283038533
+20
+-141.97818290779992
+30
+176.6073673165957
+11
+0.020623870886214313
+21
+-146.38213420813025
+31
+189.44411262726717
+12
+0.020623870886214313
+22
+-143.83151748375957
+32
+176.454646706429
+13
+0.020623870886214313
+23
+-143.83151748375957
+33
+176.454646706429
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+27.737589270091433
+20
+-125.4828358882498
+30
+183.14849448628274
+11
+26.859293649474964
+21
+-128.5734507860156
+31
+192.62508214897804
+12
+22.047681756274336
+22
+-135.79817000956913
+32
+191.14959418223214
+13
+22.047681756274336
+23
+-135.79817000956913
+33
+191.14959418223214
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+20.658289272950658
+20
+-133.2505955284293
+30
+180.0673105425317
+11
+27.737589270091433
+21
+-125.4828358882498
+31
+183.14849448628274
+12
+22.047681756274336
+22
+-135.79817000956913
+32
+191.14959418223214
+13
+22.047681756274336
+23
+-135.79817000956913
+33
+191.14959418223214
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+39.7596218436631
+20
+-107.10859944960573
+30
+193.82098796285382
+11
+37.718580860387746
+21
+-108.40733308466513
+31
+200.3475123650306
+12
+32.70131332481207
+22
+-118.28306305918852
+32
+196.19059121500956
+13
+32.70131332481207
+23
+-118.28306305918852
+33
+196.19059121500956
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+33.98361884642567
+20
+-116.35184705652853
+30
+188.19892247307232
+11
+39.7596218436631
+21
+-107.10859944960573
+31
+193.82098796285382
+12
+32.70131332481207
+22
+-118.28306305918852
+32
+196.19059121500956
+13
+32.70131332481207
+23
+-118.28306305918852
+33
+196.19059121500956
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+33.98361884642567
+20
+-116.35184705652853
+30
+188.19892247307232
+11
+32.70131332481207
+21
+-118.28306305918852
+31
+196.19059121500956
+12
+26.859293649474964
+22
+-128.5734507860156
+32
+192.62508214897804
+13
+26.859293649474964
+23
+-128.5734507860156
+33
+192.62508214897804
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+27.737589270091433
+20
+-125.4828358882498
+30
+183.14849448628274
+11
+33.98361884642567
+21
+-116.35184705652853
+31
+188.19892247307232
+12
+26.859293649474964
+22
+-128.5734507860156
+32
+192.62508214897804
+13
+26.859293649474964
+23
+-128.5734507860156
+33
+192.62508214897804
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+53.31740922237298
+20
+-73.37985720281127
+30
+210.1827805045999
+11
+51.13006676214767
+21
+-80.85191080099831
+31
+216.7658906308602
+12
+48.50619282079229
+22
+-87.18646965533587
+32
+211.59711938240898
+13
+48.50619282079229
+23
+-87.18646965533587
+33
+211.59711938240898
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+49.999234530975706
+20
+-82.11565863890347
+30
+204.80348602460438
+11
+53.31740922237298
+21
+-73.37985720281127
+31
+210.1827805045999
+12
+48.50619282079229
+22
+-87.18646965533587
+32
+211.59711938240898
+13
+48.50619282079229
+23
+-87.18646965533587
+33
+211.59711938240898
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+49.999234530975706
+20
+-82.11565863890347
+30
+204.80348602460438
+11
+48.50619282079229
+21
+-87.18646965533587
+31
+211.59711938240898
+12
+45.037305399761046
+22
+-94.40358327081286
+32
+207.8162194956663
+13
+45.037305399761046
+23
+-94.40358327081286
+33
+207.8162194956663
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+46.921366632347755
+20
+-91.55908585038726
+30
+201.60730528674364
+11
+49.999234530975706
+21
+-82.11565863890347
+31
+204.80348602460438
+12
+45.037305399761046
+22
+-94.40358327081286
+32
+207.8162194956663
+13
+45.037305399761046
+23
+-94.40358327081286
+33
+207.8162194956663
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+43.82375457515449
+20
+-99.22766836125562
+30
+198.33689381406157
+11
+46.921366632347755
+21
+-91.55908585038726
+31
+201.60730528674364
+12
+41.31725037762789
+22
+-101.2954810849599
+32
+203.5662057027956
+13
+41.31725037762789
+23
+-101.2954810849599
+33
+203.5662057027956
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+46.921366632347755
+20
+-91.55908585038726
+30
+201.60730528674364
+11
+45.037305399761046
+21
+-94.40358327081286
+31
+207.8162194956663
+12
+41.31725037762789
+22
+-101.2954810849599
+32
+203.5662057027956
+13
+41.31725037762789
+23
+-101.2954810849599
+33
+203.5662057027956
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+43.82375457515449
+20
+-99.22766836125562
+30
+198.33689381406157
+11
+41.31725037762789
+21
+-101.2954810849599
+31
+203.5662057027956
+12
+37.718580860387746
+22
+-108.40733308466513
+32
+200.3475123650306
+13
+37.718580860387746
+23
+-108.40733308466513
+33
+200.3475123650306
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+39.7596218436631
+20
+-107.10859944960573
+30
+193.82098796285382
+11
+43.82375457515449
+21
+-99.22766836125562
+31
+198.33689381406157
+12
+37.718580860387746
+22
+-108.40733308466513
+32
+200.3475123650306
+13
+37.718580860387746
+23
+-108.40733308466513
+33
+200.3475123650306
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.475638536980604
+20
+-63.38395862068895
+30
+221.72322597480178
+11
+54.060537976262786
+21
+-75.35305616205275
+31
+226.00579177023258
+12
+53.06721513910488
+22
+-76.83036947473403
+32
+222.177128664774
+13
+53.06721513910488
+23
+-76.83036947473403
+33
+222.177128664774
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.57746129580484
+20
+-67.91872637992103
+30
+213.96915642915695
+11
+57.475638536980604
+21
+-63.38395862068895
+31
+221.72322597480178
+12
+53.06721513910488
+22
+-76.83036947473403
+32
+222.177128664774
+13
+53.06721513910488
+23
+-76.83036947473403
+33
+222.177128664774
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+53.31740922237298
+20
+-73.37985720281127
+30
+210.1827805045999
+11
+55.57746129580484
+21
+-67.91872637992103
+31
+213.96915642915695
+12
+53.06721513910488
+22
+-76.83036947473403
+32
+222.177128664774
+13
+53.06721513910488
+23
+-76.83036947473403
+33
+222.177128664774
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+53.31740922237298
+20
+-73.37985720281127
+30
+210.1827805045999
+11
+53.06721513910488
+21
+-76.83036947473403
+31
+222.177128664774
+12
+51.13006676214767
+22
+-80.85191080099831
+32
+216.7658906308602
+13
+51.13006676214767
+23
+-80.85191080099831
+33
+216.7658906308602
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+47.68466545885508
+20
+-89.14871653894465
+30
+214.62415139665677
+11
+51.13006676214767
+21
+-80.85191080099831
+31
+216.7658906308602
+12
+49.46160930729941
+22
+-85.67569166712195
+32
+221.82970448785994
+13
+49.46160930729941
+23
+-85.67569166712195
+33
+221.82970448785994
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+48.50619282079229
+20
+-87.18646965533587
+30
+211.59711938240898
+11
+51.13006676214767
+21
+-80.85191080099831
+31
+216.7658906308602
+12
+47.68466545885508
+22
+-89.14871653894465
+32
+214.62415139665677
+13
+47.68466545885508
+23
+-89.14871653894465
+33
+214.62415139665677
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+49.46160930729941
+20
+-85.67569166712195
+30
+221.82970448785994
+11
+53.06721513910488
+21
+-76.83036947473403
+31
+222.177128664774
+12
+50.71002423932636
+22
+-84.41894098864486
+32
+226.44995928186844
+13
+50.71002423932636
+23
+-84.41894098864486
+33
+226.44995928186844
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+51.13006676214767
+20
+-80.85191080099831
+30
+216.7658906308602
+11
+53.06721513910488
+21
+-76.83036947473403
+31
+222.177128664774
+12
+49.46160930729941
+22
+-85.67569166712195
+32
+221.82970448785994
+13
+49.46160930729941
+23
+-85.67569166712195
+33
+221.82970448785994
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.060537976262786
+20
+-75.35305616205275
+30
+226.00579177023258
+11
+51.64155911647484
+21
+-85.98022021448836
+31
+234.9521164378673
+12
+50.71002423932636
+22
+-84.41894098864486
+32
+226.44995928186844
+13
+50.71002423932636
+23
+-84.41894098864486
+33
+226.44995928186844
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+53.06721513910488
+20
+-76.83036947473403
+30
+222.177128664774
+11
+54.060537976262786
+21
+-75.35305616205275
+31
+226.00579177023258
+12
+50.71002423932636
+22
+-84.41894098864486
+32
+226.44995928186844
+13
+50.71002423932636
+23
+-84.41894098864486
+33
+226.44995928186844
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+61.756957012690215
+20
+-45.20107928123712
+30
+232.65096365840293
+11
+64.65907451989797
+21
+-46.011837102142586
+31
+248.28931075995115
+12
+61.36542030893773
+22
+-51.066220005125395
+32
+233.3543302932702
+13
+61.36542030893773
+23
+-51.066220005125395
+33
+233.3543302932702
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+61.36542030893773
+20
+-51.066220005125395
+30
+233.3543302932702
+11
+64.65907451989797
+21
+-46.011837102142586
+31
+248.28931075995115
+12
+61.62781378755973
+22
+-54.45010715030213
+32
+244.19566826912273
+13
+61.62781378755973
+23
+-54.45010715030213
+33
+244.19566826912273
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+61.756957012690215
+20
+-45.20107928123712
+30
+232.65096365840293
+11
+61.60371922117496
+21
+-42.34562978518406
+31
+234.13557835483905
+12
+64.60464878850613
+22
+-41.75543459849045
+32
+249.93303477733724
+13
+64.60464878850613
+23
+-41.75543459849045
+33
+249.93303477733724
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+61.756957012690215
+20
+-45.20107928123712
+30
+232.65096365840293
+11
+64.60464878850613
+21
+-41.75543459849045
+31
+249.93303477733724
+12
+64.65907451989797
+22
+-46.011837102142586
+32
+248.28931075995115
+13
+64.65907451989797
+23
+-46.011837102142586
+33
+248.28931075995115
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+60.66372690784597
+20
+-46.04560600199198
+30
+216.56327723172453
+11
+60.90251257900006
+21
+-42.67662584864736
+31
+217.79082237519182
+12
+61.60371922117496
+22
+-42.34562978518406
+32
+234.13557835483905
+13
+61.60371922117496
+23
+-42.34562978518406
+33
+234.13557835483905
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+60.66372690784597
+20
+-46.04560600199198
+30
+216.56327723172453
+11
+61.60371922117496
+21
+-42.34562978518406
+31
+234.13557835483905
+12
+61.756957012690215
+22
+-45.20107928123712
+32
+232.65096365840293
+13
+61.756957012690215
+23
+-45.20107928123712
+33
+232.65096365840293
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+59.016260931287455
+20
+-61.04051866031837
+30
+246.3778693382867
+11
+60.10504936101532
+21
+-57.223111854813496
+31
+250.92511029476685
+12
+58.13464926554985
+22
+-62.97203888729987
+32
+249.144789556335
+13
+58.13464926554985
+23
+-62.97203888729987
+33
+249.144789556335
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+59.016260931287455
+20
+-61.04051866031837
+30
+246.3778693382867
+11
+60.80628642562252
+21
+-56.46559329044347
+31
+249.40003376336736
+12
+60.10504936101532
+22
+-57.223111854813496
+32
+250.92511029476685
+13
+60.10504936101532
+23
+-57.223111854813496
+33
+250.92511029476685
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+56.8321128264541
+20
+-69.85602686904838
+30
+246.76727647177592
+11
+58.13464926554985
+21
+-62.97203888729987
+31
+249.144789556335
+12
+56.997702125484764
+22
+-69.43954377080735
+32
+249.5643148978057
+13
+56.997702125484764
+23
+-69.43954377080735
+33
+249.5643148978057
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+59.016260931287455
+20
+-61.04051866031837
+30
+246.3778693382867
+11
+58.13464926554985
+21
+-62.97203888729987
+31
+249.144789556335
+12
+56.8321128264541
+22
+-69.85602686904838
+32
+246.76727647177592
+13
+56.8321128264541
+23
+-69.85602686904838
+33
+246.76727647177592
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+48.63892589293468
+20
+-65.90019799654594
+30
+195.13249901948998
+11
+44.63603351767125
+21
+-70.43435730713483
+31
+198.00620197492452
+12
+44.627211012303086
+22
+-68.53995244756646
+32
+204.58048959581942
+13
+44.627211012303086
+23
+-68.53995244756646
+33
+204.58048959581942
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+48.63892589293468
+20
+-65.90019799654594
+30
+195.13249901948998
+11
+44.627211012303086
+21
+-68.53995244756646
+31
+204.58048959581942
+12
+48.07641511963372
+22
+-63.43476408263112
+32
+201.00615802442366
+13
+48.07641511963372
+23
+-63.43476408263112
+33
+201.00615802442366
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+44.63603351767125
+20
+-70.43435730713483
+30
+198.00620197492452
+11
+39.88526648907865
+21
+-76.08714945354195
+31
+201.42294534698513
+12
+44.627211012303086
+22
+-68.53995244756646
+32
+204.58048959581942
+13
+44.627211012303086
+23
+-68.53995244756646
+33
+204.58048959581942
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+36.05234424309768
+20
+-83.11990312925657
+30
+197.50818675810464
+11
+39.88526648907865
+21
+-76.08714945354195
+31
+201.42294534698513
+12
+44.63603351767125
+22
+-70.43435730713483
+32
+198.00620197492452
+13
+44.63603351767125
+23
+-70.43435730713483
+33
+198.00620197492452
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+40.19740064451766
+20
+-78.89848642275263
+30
+193.9003905111746
+11
+36.05234424309768
+21
+-83.11990312925657
+31
+197.50818675810464
+12
+44.63603351767125
+22
+-70.43435730713483
+32
+198.00620197492452
+13
+44.63603351767125
+23
+-70.43435730713483
+33
+198.00620197492452
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.81224585606232
+20
+-45.734384519520646
+30
+210.97406796883365
+11
+55.01589361790529
+21
+-46.23179128769331
+31
+219.90457297167282
+12
+55.64207854201852
+22
+-44.29783726612669
+32
+214.49972364854494
+13
+55.64207854201852
+23
+-44.29783726612669
+33
+214.49972364854494
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.81224585606232
+20
+-45.734384519520646
+30
+210.97406796883365
+11
+52.82891622686765
+21
+-49.93055060721156
+31
+211.1827658544384
+12
+55.01589361790529
+22
+-46.23179128769331
+32
+219.90457297167282
+13
+55.01589361790529
+23
+-46.23179128769331
+33
+219.90457297167282
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.17708631441941
+20
+-51.05435525651876
+30
+201.82604257501956
+11
+52.82891622686765
+21
+-49.93055060721156
+31
+211.1827658544384
+12
+54.81224585606232
+22
+-45.734384519520646
+32
+210.97406796883365
+13
+54.81224585606232
+23
+-45.734384519520646
+33
+210.97406796883365
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.17708631441941
+20
+-51.05435525651876
+30
+201.82604257501956
+11
+54.81224585606232
+21
+-45.734384519520646
+31
+210.97406796883365
+12
+56.18390206135277
+22
+-44.8737339096399
+32
+208.73528117558263
+13
+56.18390206135277
+23
+-44.8737339096399
+33
+208.73528117558263
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.134116311935905
+20
+-42.98845577976231
+30
+213.64546174944854
+11
+54.81224585606232
+21
+-45.734384519520646
+31
+210.97406796883365
+12
+55.64207854201852
+22
+-44.29783726612669
+32
+214.49972364854494
+13
+55.64207854201852
+23
+-44.29783726612669
+33
+214.49972364854494
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.134116311935905
+20
+-42.98845577976231
+30
+213.64546174944854
+11
+56.18390206135277
+21
+-44.8737339096399
+31
+208.73528117558263
+12
+54.81224585606232
+22
+-45.734384519520646
+32
+210.97406796883365
+13
+54.81224585606232
+23
+-45.734384519520646
+33
+210.97406796883365
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.134116311935905
+20
+-42.98845577976231
+30
+213.64546174944854
+11
+55.01589361790529
+21
+-46.23179128769331
+31
+219.90457297167282
+12
+57.224623048040314
+22
+-42.47309977653388
+32
+218.80206402497686
+13
+57.224623048040314
+23
+-42.47309977653388
+33
+218.80206402497686
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.134116311935905
+20
+-42.98845577976231
+30
+213.64546174944854
+11
+55.64207854201852
+21
+-44.29783726612669
+31
+214.49972364854494
+12
+55.01589361790529
+22
+-46.23179128769331
+32
+219.90457297167282
+13
+55.01589361790529
+23
+-46.23179128769331
+33
+219.90457297167282
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+60.90251257900006
+20
+-42.67662584864736
+30
+217.79082237519182
+11
+60.77702004574606
+21
+-43.38972766185175
+31
+212.43251937348842
+12
+58.92143420979589
+22
+-42.59113881387185
+32
+212.85356583657583
+13
+58.92143420979589
+23
+-42.59113881387185
+33
+212.85356583657583
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+60.90251257900006
+20
+-42.67662584864736
+30
+217.79082237519182
+11
+58.92143420979589
+21
+-42.59113881387185
+31
+212.85356583657583
+12
+59.084620136674545
+22
+-41.76273598223528
+32
+218.21917022203252
+13
+59.084620136674545
+23
+-41.76273598223528
+33
+218.21917022203252
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+59.084620136674545
+20
+-41.76273598223528
+30
+218.21917022203252
+11
+58.92143420979589
+21
+-42.59113881387185
+31
+212.85356583657583
+12
+57.134116311935905
+22
+-42.98845577976231
+32
+213.64546174944854
+13
+57.134116311935905
+23
+-42.98845577976231
+33
+213.64546174944854
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+59.084620136674545
+20
+-41.76273598223528
+30
+218.21917022203252
+11
+57.134116311935905
+21
+-42.98845577976231
+31
+213.64546174944854
+12
+57.224623048040314
+22
+-42.47309977653388
+32
+218.80206402497686
+13
+57.224623048040314
+23
+-42.47309977653388
+33
+218.80206402497686
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+58.92143420979589
+20
+-42.59113881387185
+30
+212.85356583657583
+11
+58.29652702783943
+21
+-44.43960580066162
+31
+207.75872109862465
+12
+56.18390206135277
+22
+-44.8737339096399
+32
+208.73528117558263
+13
+56.18390206135277
+23
+-44.8737339096399
+33
+208.73528117558263
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+58.92143420979589
+20
+-42.59113881387185
+30
+212.85356583657583
+11
+56.18390206135277
+21
+-44.8737339096399
+31
+208.73528117558263
+12
+57.134116311935905
+22
+-42.98845577976231
+32
+213.64546174944854
+13
+57.134116311935905
+23
+-42.98845577976231
+33
+213.64546174944854
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+60.77702004574606
+20
+-43.38972766185175
+30
+212.43251937348842
+11
+60.10848709586566
+21
+-45.06022341966321
+31
+207.92939094384963
+12
+58.29652702783943
+22
+-44.43960580066162
+32
+207.75872109862465
+13
+58.29652702783943
+23
+-44.43960580066162
+33
+207.75872109862465
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+60.77702004574606
+20
+-43.38972766185175
+30
+212.43251937348842
+11
+58.29652702783943
+21
+-44.43960580066162
+31
+207.75872109862465
+12
+58.92143420979589
+22
+-42.59113881387185
+32
+212.85356583657583
+13
+58.92143420979589
+23
+-42.59113881387185
+33
+212.85356583657583
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+56.18390206135277
+20
+-44.8737339096399
+30
+208.73528117558263
+11
+56.040156068716364
+21
+-51.07291294022359
+31
+199.52914893606777
+12
+54.17708631441941
+22
+-51.05435525651876
+32
+201.82604257501956
+13
+54.17708631441941
+23
+-51.05435525651876
+33
+201.82604257501956
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+58.29652702783943
+20
+-44.43960580066162
+30
+207.75872109862465
+11
+56.040156068716364
+21
+-51.07291294022359
+31
+199.52914893606777
+12
+56.18390206135277
+22
+-44.8737339096399
+32
+208.73528117558263
+13
+56.18390206135277
+23
+-44.8737339096399
+33
+208.73528117558263
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+58.573736230993475
+20
+-51.24236588815695
+30
+199.65692315174462
+11
+56.040156068716364
+21
+-51.07291294022359
+31
+199.52914893606777
+12
+58.29652702783943
+22
+-44.43960580066162
+32
+207.75872109862465
+13
+58.29652702783943
+23
+-44.43960580066162
+33
+207.75872109862465
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+60.10848709586566
+20
+-45.06022341966321
+30
+207.92939094384963
+11
+58.573736230993475
+21
+-51.24236588815695
+31
+199.65692315174462
+12
+58.29652702783943
+22
+-44.43960580066162
+32
+207.75872109862465
+13
+58.29652702783943
+23
+-44.43960580066162
+33
+207.75872109862465
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+59.36429355684522
+20
+-49.332445588113856
+30
+207.7015269258918
+11
+60.77702004574606
+21
+-43.38972766185175
+31
+212.43251937348842
+12
+59.96753996700124
+22
+-48.09638216360338
+32
+211.69873030631467
+13
+59.96753996700124
+23
+-48.09638216360338
+33
+211.69873030631467
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+59.36429355684522
+20
+-49.332445588113856
+30
+207.7015269258918
+11
+60.10848709586566
+21
+-45.06022341966321
+31
+207.92939094384963
+12
+60.77702004574606
+22
+-43.38972766185175
+32
+212.43251937348842
+13
+60.77702004574606
+23
+-43.38972766185175
+33
+212.43251937348842
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+58.573736230993475
+20
+-51.24236588815695
+30
+199.65692315174462
+11
+60.10848709586566
+21
+-45.06022341966321
+31
+207.92939094384963
+12
+59.36429355684522
+22
+-49.332445588113856
+32
+207.7015269258918
+13
+59.36429355684522
+23
+-49.332445588113856
+33
+207.7015269258918
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+58.573736230993475
+20
+-51.24236588815695
+30
+199.65692315174462
+11
+59.36429355684522
+21
+-49.332445588113856
+31
+207.7015269258918
+12
+57.636025600087294
+22
+-56.31865294240304
+32
+202.3928124888417
+13
+57.636025600087294
+23
+-56.31865294240304
+33
+202.3928124888417
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+59.96753996700124
+20
+-48.09638216360338
+30
+211.69873030631467
+11
+60.77702004574606
+21
+-43.38972766185175
+31
+212.43251937348842
+12
+60.66372690784597
+22
+-46.04560600199198
+32
+216.56327723172453
+13
+60.66372690784597
+23
+-46.04560600199198
+33
+216.56327723172453
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+60.77702004574606
+20
+-43.38972766185175
+30
+212.43251937348842
+11
+60.90251257900006
+21
+-42.67662584864736
+31
+217.79082237519182
+12
+60.66372690784597
+22
+-46.04560600199198
+32
+216.56327723172453
+13
+60.66372690784597
+23
+-46.04560600199198
+33
+216.56327723172453
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+56.83850153723793
+20
+-59.948657564917134
+30
+205.49194566764947
+11
+58.56573513129753
+21
+-53.34333906307333
+31
+208.13626348351497
+12
+59.217261941519986
+22
+-54.031190257468666
+32
+215.62839588702082
+13
+59.217261941519986
+23
+-54.031190257468666
+33
+215.62839588702082
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+58.56573513129753
+20
+-53.34333906307333
+30
+208.13626348351497
+11
+59.12608591190491
+21
+-52.38077330497576
+31
+212.1255570315387
+12
+59.217261941519986
+22
+-54.031190257468666
+32
+215.62839588702082
+13
+59.217261941519986
+23
+-54.031190257468666
+33
+215.62839588702082
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+59.96753996700124
+20
+-48.09638216360338
+30
+211.69873030631467
+11
+59.217261941519986
+21
+-54.031190257468666
+31
+215.62839588702082
+12
+59.12608591190491
+22
+-52.38077330497576
+32
+212.1255570315387
+13
+59.12608591190491
+23
+-52.38077330497576
+33
+212.1255570315387
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+59.96753996700124
+20
+-48.09638216360338
+30
+211.69873030631467
+11
+60.66372690784597
+21
+-46.04560600199198
+31
+216.56327723172453
+12
+59.217261941519986
+22
+-54.031190257468666
+32
+215.62839588702082
+13
+59.217261941519986
+23
+-54.031190257468666
+33
+215.62839588702082
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+59.36429355684522
+20
+-49.332445588113856
+30
+207.7015269258918
+11
+59.96753996700124
+21
+-48.09638216360338
+31
+211.69873030631467
+12
+59.12608591190491
+22
+-52.38077330497576
+32
+212.1255570315387
+13
+59.12608591190491
+23
+-52.38077330497576
+33
+212.1255570315387
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+59.36429355684522
+20
+-49.332445588113856
+30
+207.7015269258918
+11
+59.12608591190491
+21
+-52.38077330497576
+31
+212.1255570315387
+12
+58.56573513129753
+22
+-53.34333906307333
+32
+208.13626348351497
+13
+58.56573513129753
+23
+-53.34333906307333
+33
+208.13626348351497
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.636025600087294
+20
+-56.31865294240304
+30
+202.3928124888417
+11
+59.36429355684522
+21
+-49.332445588113856
+31
+207.7015269258918
+12
+58.56573513129753
+22
+-53.34333906307333
+32
+208.13626348351497
+13
+58.56573513129753
+23
+-53.34333906307333
+33
+208.13626348351497
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.636025600087294
+20
+-56.31865294240304
+30
+202.3928124888417
+11
+58.56573513129753
+21
+-53.34333906307333
+31
+208.13626348351497
+12
+56.83850153723793
+22
+-59.948657564917134
+32
+205.49194566764947
+13
+56.83850153723793
+23
+-59.948657564917134
+33
+205.49194566764947
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+60.09093335242627
+20
+-42.65076678120392
+30
+275.91713843250653
+11
+59.97584529102023
+21
+-44.3407328956913
+31
+276.59373332694685
+12
+64.1253129451243
+22
+-44.70549785901618
+32
+276.2965061633368
+13
+64.1253129451243
+23
+-44.70549785901618
+33
+276.2965061633368
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.98621709624138
+20
+-40.87531363194195
+30
+274.28223692048994
+11
+52.83232353928571
+21
+-41.64713073949456
+31
+274.2083104099911
+12
+54.824384406551616
+22
+-42.21237953170309
+32
+275.16509590595166
+13
+54.824384406551616
+23
+-42.21237953170309
+33
+275.16509590595166
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.98621709624138
+20
+-40.87531363194195
+30
+274.28223692048994
+11
+54.40345963319348
+21
+-40.5473598117047
+31
+273.3671301567857
+12
+52.83232353928571
+22
+-41.64713073949456
+32
+274.2083104099911
+13
+52.83232353928571
+23
+-41.64713073949456
+33
+274.2083104099911
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.98621709624138
+20
+-40.87531363194195
+30
+274.28223692048994
+11
+54.824384406551616
+21
+-42.21237953170309
+31
+275.16509590595166
+12
+62.160875646390416
+22
+-41.51144669141887
+32
+274.9046798854296
+13
+62.160875646390416
+23
+-41.51144669141887
+33
+274.9046798854296
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+62.160875646390416
+20
+-41.51144669141887
+30
+274.9046798854296
+11
+54.824384406551616
+21
+-42.21237953170309
+31
+275.16509590595166
+12
+60.09093335242627
+22
+-42.65076678120392
+32
+275.91713843250653
+13
+60.09093335242627
+23
+-42.65076678120392
+33
+275.91713843250653
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.121459458000174
+20
+-39.627689683154216
+30
+271.02064795317835
+11
+52.495425523951205
+21
+-41.09648471479178
+31
+272.73556046215464
+12
+52.83232353928571
+22
+-41.64713073949456
+32
+274.2083104099911
+13
+52.83232353928571
+23
+-41.64713073949456
+33
+274.2083104099911
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.121459458000174
+20
+-39.627689683154216
+30
+271.02064795317835
+11
+52.83232353928571
+21
+-41.64713073949456
+31
+274.2083104099911
+12
+54.40345963319348
+22
+-40.5473598117047
+32
+273.3671301567857
+13
+54.40345963319348
+23
+-40.5473598117047
+33
+273.3671301567857
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+62.160875646390416
+20
+-41.51144669141887
+30
+274.9046798854296
+11
+55.121459458000174
+21
+-39.627689683154216
+31
+271.02064795317835
+12
+54.40345963319348
+22
+-40.5473598117047
+32
+273.3671301567857
+13
+54.40345963319348
+23
+-40.5473598117047
+33
+273.3671301567857
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+62.160875646390416
+20
+-41.51144669141887
+30
+274.9046798854296
+11
+54.40345963319348
+21
+-40.5473598117047
+31
+273.3671301567857
+12
+55.98621709624138
+22
+-40.87531363194195
+32
+274.28223692048994
+13
+55.98621709624138
+23
+-40.87531363194195
+33
+274.28223692048994
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+20.310256647392894
+20
+-111.18125046213856
+30
+179.97817281588664
+11
+14.179528089490832
+21
+-121.09805072027484
+31
+185.36050953910777
+12
+19.813762552191623
+22
+-111.26156568342263
+32
+185.693026724193
+13
+19.813762552191623
+23
+-111.26156568342263
+33
+185.693026724193
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+14.23976450545275
+20
+-119.52095182963338
+30
+177.18265551147002
+11
+14.179528089490832
+21
+-121.09805072027484
+31
+185.36050953910777
+12
+20.310256647392894
+22
+-111.18125046213856
+32
+179.97817281588664
+13
+20.310256647392894
+23
+-111.18125046213856
+33
+179.97817281588664
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+19.813762552191623
+20
+-111.26156568342263
+30
+185.693026724193
+11
+15.177383869062021
+21
+-123.03595965804155
+31
+192.71665367021444
+12
+19.93241003817721
+22
+-111.10276058679754
+32
+192.66523975962366
+13
+19.93241003817721
+23
+-111.10276058679754
+33
+192.66523975962366
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+14.179528089490832
+20
+-121.09805072027484
+30
+185.36050953910777
+11
+15.177383869062021
+21
+-123.03595965804155
+31
+192.71665367021444
+12
+19.813762552191623
+22
+-111.26156568342263
+32
+185.693026724193
+13
+19.813762552191623
+23
+-111.26156568342263
+33
+185.693026724193
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+19.93241003817721
+20
+-111.10276058679754
+30
+192.66523975962366
+11
+16.432917650248104
+21
+-124.47129001414518
+31
+196.1513462773357
+12
+20.506177111430652
+22
+-111.68960930594324
+32
+198.04027509909426
+13
+20.506177111430652
+23
+-111.68960930594324
+33
+198.04027509909426
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+19.93241003817721
+20
+-111.10276058679754
+30
+192.66523975962366
+11
+15.177383869062021
+21
+-123.03595965804155
+31
+192.71665367021444
+12
+16.432917650248104
+22
+-124.47129001414518
+32
+196.1513462773357
+13
+16.432917650248104
+23
+-124.47129001414518
+33
+196.1513462773357
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+20.506177111430652
+20
+-111.68960930594324
+30
+198.04027509909426
+11
+24.254829219929537
+21
+-102.1765147244836
+31
+203.07944678593134
+12
+24.439797608337845
+22
+-100.61888619051764
+32
+198.45402017843145
+13
+24.439797608337845
+23
+-100.61888619051764
+33
+198.45402017843145
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+19.93241003817721
+20
+-111.10276058679754
+30
+192.66523975962366
+11
+20.506177111430652
+21
+-111.68960930594324
+31
+198.04027509909426
+12
+24.439797608337845
+22
+-100.61888619051764
+32
+198.45402017843145
+13
+24.439797608337845
+23
+-100.61888619051764
+33
+198.45402017843145
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+25.438870285201208
+20
+-99.9489842311818
+30
+191.81067363620747
+11
+19.93241003817721
+21
+-111.10276058679754
+31
+192.66523975962366
+12
+24.439797608337845
+22
+-100.61888619051764
+32
+198.45402017843145
+13
+24.439797608337845
+23
+-100.61888619051764
+33
+198.45402017843145
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+19.813762552191623
+20
+-111.26156568342263
+30
+185.693026724193
+11
+19.93241003817721
+21
+-111.10276058679754
+31
+192.66523975962366
+12
+25.438870285201208
+22
+-99.9489842311818
+32
+191.81067363620747
+13
+25.438870285201208
+23
+-99.9489842311818
+33
+191.81067363620747
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+27.188160142681205
+20
+-100.95262027288871
+30
+183.6760194624404
+11
+19.813762552191623
+21
+-111.26156568342263
+31
+185.693026724193
+12
+25.438870285201208
+22
+-99.9489842311818
+32
+191.81067363620747
+13
+25.438870285201208
+23
+-99.9489842311818
+33
+191.81067363620747
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+20.310256647392894
+20
+-111.18125046213856
+30
+179.97817281588664
+11
+19.813762552191623
+21
+-111.26156568342263
+31
+185.693026724193
+12
+27.188160142681205
+22
+-100.95262027288871
+32
+183.6760194624404
+13
+27.188160142681205
+23
+-100.95262027288871
+33
+183.6760194624404
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+30.829725289470005
+20
+-94.57334044306415
+30
+188.1265170841944
+11
+25.438870285201208
+21
+-99.9489842311818
+31
+191.81067363620747
+12
+27.43671141460488
+22
+-94.72758217484763
+32
+196.57330541339994
+13
+27.43671141460488
+23
+-94.72758217484763
+33
+196.57330541339994
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+27.188160142681205
+20
+-100.95262027288871
+30
+183.6760194624404
+11
+25.438870285201208
+21
+-99.9489842311818
+31
+191.81067363620747
+12
+30.829725289470005
+22
+-94.57334044306415
+32
+188.1265170841944
+13
+30.829725289470005
+23
+-94.57334044306415
+33
+188.1265170841944
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+27.43671141460488
+20
+-94.72758217484763
+30
+196.57330541339994
+11
+24.439797608337845
+21
+-100.61888619051764
+31
+198.45402017843145
+12
+26.369188265057534
+22
+-94.95118705228343
+32
+202.45700382099344
+13
+26.369188265057534
+23
+-94.95118705228343
+33
+202.45700382099344
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+25.438870285201208
+20
+-99.9489842311818
+30
+191.81067363620747
+11
+24.439797608337845
+21
+-100.61888619051764
+31
+198.45402017843145
+12
+27.43671141460488
+22
+-94.72758217484763
+32
+196.57330541339994
+13
+27.43671141460488
+23
+-94.72758217484763
+33
+196.57330541339994
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+26.369188265057534
+20
+-94.95118705228343
+30
+202.45700382099344
+11
+24.254829219929537
+21
+-102.1765147244836
+31
+203.07944678593134
+12
+26.370709386672726
+22
+-97.0792361919495
+32
+207.03314608816052
+13
+26.370709386672726
+23
+-97.0792361919495
+33
+207.03314608816052
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+24.439797608337845
+20
+-100.61888619051764
+30
+198.45402017843145
+11
+24.254829219929537
+21
+-102.1765147244836
+31
+203.07944678593134
+12
+26.369188265057534
+22
+-94.95118705228343
+32
+202.45700382099344
+13
+26.369188265057534
+23
+-94.95118705228343
+33
+202.45700382099344
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+28.153159695364078
+20
+-89.28744283024886
+30
+206.54151958213
+11
+26.370709386672726
+21
+-97.0792361919495
+31
+207.03314608816052
+12
+28.454037550850632
+22
+-92.7072284455425
+32
+210.63607474592436
+13
+28.454037550850632
+23
+-92.7072284455425
+33
+210.63607474592436
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+26.369188265057534
+20
+-94.95118705228343
+30
+202.45700382099344
+11
+26.370709386672726
+21
+-97.0792361919495
+31
+207.03314608816052
+12
+28.153159695364078
+22
+-89.28744283024886
+32
+206.54151958213
+13
+28.153159695364078
+23
+-89.28744283024886
+33
+206.54151958213
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+29.929221293271603
+20
+-89.21229942245625
+30
+200.04906830413313
+11
+26.369188265057534
+21
+-94.95118705228343
+31
+202.45700382099344
+12
+28.153159695364078
+22
+-89.28744283024886
+32
+206.54151958213
+13
+28.153159695364078
+23
+-89.28744283024886
+33
+206.54151958213
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+27.43671141460488
+20
+-94.72758217484763
+30
+196.57330541339994
+11
+26.369188265057534
+21
+-94.95118705228343
+31
+202.45700382099344
+12
+29.929221293271603
+22
+-89.21229942245625
+32
+200.04906830413313
+13
+29.929221293271603
+23
+-89.21229942245625
+33
+200.04906830413313
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+33.483169835024874
+20
+-89.26918937086285
+30
+192.5289472629075
+11
+27.43671141460488
+21
+-94.72758217484763
+31
+196.57330541339994
+12
+29.929221293271603
+22
+-89.21229942245625
+32
+200.04906830413313
+13
+29.929221293271603
+23
+-89.21229942245625
+33
+200.04906830413313
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+30.829725289470005
+20
+-94.57334044306415
+30
+188.1265170841944
+11
+27.43671141460488
+21
+-94.72758217484763
+31
+196.57330541339994
+12
+33.483169835024874
+22
+-89.26918937086285
+32
+192.5289472629075
+13
+33.483169835024874
+23
+-89.26918937086285
+33
+192.5289472629075
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+36.05234424309768
+20
+-83.11990312925657
+30
+197.50818675810464
+11
+29.929221293271603
+21
+-89.21229942245625
+31
+200.04906830413313
+12
+33.610031377732554
+22
+-82.77552119557667
+32
+202.6498820418039
+13
+33.610031377732554
+23
+-82.77552119557667
+33
+202.6498820418039
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+33.483169835024874
+20
+-89.26918937086285
+30
+192.5289472629075
+11
+29.929221293271603
+21
+-89.21229942245625
+31
+200.04906830413313
+12
+36.05234424309768
+22
+-83.11990312925657
+32
+197.50818675810464
+13
+36.05234424309768
+23
+-83.11990312925657
+33
+197.50818675810464
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+33.610031377732554
+20
+-82.77552119557667
+30
+202.6498820418039
+11
+28.153159695364078
+21
+-89.28744283024886
+31
+206.54151958213
+12
+30.866232208234795
+22
+-82.3809422485955
+32
+209.16788816293598
+13
+30.866232208234795
+23
+-82.3809422485955
+33
+209.16788816293598
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+29.929221293271603
+20
+-89.21229942245625
+30
+200.04906830413313
+11
+28.153159695364078
+21
+-89.28744283024886
+31
+206.54151958213
+12
+33.610031377732554
+22
+-82.77552119557667
+32
+202.6498820418039
+13
+33.610031377732554
+23
+-82.77552119557667
+33
+202.6498820418039
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+30.866232208234795
+20
+-82.3809422485955
+30
+209.16788816293598
+11
+28.454037550850632
+21
+-92.7072284455425
+31
+210.63607474592436
+12
+29.702878396929833
+22
+-84.33436662683623
+32
+212.96278236853658
+13
+29.702878396929833
+23
+-84.33436662683623
+33
+212.96278236853658
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+28.153159695364078
+20
+-89.28744283024886
+30
+206.54151958213
+11
+28.454037550850632
+21
+-92.7072284455425
+31
+210.63607474592436
+12
+30.866232208234795
+22
+-82.3809422485955
+32
+209.16788816293598
+13
+30.866232208234795
+23
+-82.3809422485955
+33
+209.16788816293598
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+29.702878396929833
+20
+-84.33436662683623
+30
+212.96278236853658
+11
+33.30124368984699
+21
+-78.99492553316206
+31
+216.11910972007792
+12
+33.94011476823095
+22
+-77.45707158019418
+32
+213.36040355875144
+13
+33.94011476823095
+23
+-77.45707158019418
+33
+213.36040355875144
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+30.866232208234795
+20
+-82.3809422485955
+30
+209.16788816293598
+11
+29.702878396929833
+21
+-84.33436662683623
+31
+212.96278236853658
+12
+33.94011476823095
+22
+-77.45707158019418
+32
+213.36040355875144
+13
+33.94011476823095
+23
+-77.45707158019418
+33
+213.36040355875144
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+37.33556243768038
+20
+-77.3256466726387
+30
+204.7831029949619
+11
+30.866232208234795
+21
+-82.3809422485955
+31
+209.16788816293598
+12
+33.94011476823095
+22
+-77.45707158019418
+32
+213.36040355875144
+13
+33.94011476823095
+23
+-77.45707158019418
+33
+213.36040355875144
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+33.610031377732554
+20
+-82.77552119557667
+30
+202.6498820418039
+11
+30.866232208234795
+21
+-82.3809422485955
+31
+209.16788816293598
+12
+37.33556243768038
+22
+-77.3256466726387
+32
+204.7831029949619
+13
+37.33556243768038
+23
+-77.3256466726387
+33
+204.7831029949619
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+39.88526648907865
+20
+-76.08714945354195
+30
+201.42294534698513
+11
+33.610031377732554
+21
+-82.77552119557667
+31
+202.6498820418039
+12
+37.33556243768038
+22
+-77.3256466726387
+32
+204.7831029949619
+13
+37.33556243768038
+23
+-77.3256466726387
+33
+204.7831029949619
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+36.05234424309768
+20
+-83.11990312925657
+30
+197.50818675810464
+11
+33.610031377732554
+21
+-82.77552119557667
+31
+202.6498820418039
+12
+39.88526648907865
+22
+-76.08714945354195
+32
+201.42294534698513
+13
+39.88526648907865
+23
+-76.08714945354195
+33
+201.42294534698513
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+44.627211012303086
+20
+-68.53995244756646
+30
+204.58048959581942
+11
+37.33556243768038
+21
+-77.3256466726387
+31
+204.7831029949619
+12
+40.916891168507256
+22
+-69.90226896614156
+32
+212.38962374393267
+13
+40.916891168507256
+23
+-69.90226896614156
+33
+212.38962374393267
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+39.88526648907865
+20
+-76.08714945354195
+30
+201.42294534698513
+11
+37.33556243768038
+21
+-77.3256466726387
+31
+204.7831029949619
+12
+44.627211012303086
+22
+-68.53995244756646
+32
+204.58048959581942
+13
+44.627211012303086
+23
+-68.53995244756646
+33
+204.58048959581942
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+60.894389789574895
+20
+-46.9254227442386
+30
+274.40849001455007
+11
+55.11866059422821
+21
+-44.74900193721024
+31
+273.536583104718
+12
+55.91210805114883
+22
+-43.919077983956576
+32
+271.62787970196536
+13
+55.91210805114883
+23
+-43.919077983956576
+33
+271.62787970196536
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+61.111879758116196
+20
+-46.79947387449948
+30
+272.35558428267603
+11
+60.894389789574895
+21
+-46.9254227442386
+31
+274.40849001455007
+12
+55.91210805114883
+22
+-43.919077983956576
+32
+271.62787970196536
+13
+55.91210805114883
+23
+-43.919077983956576
+33
+271.62787970196536
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+61.111879758116196
+20
+-46.79947387449948
+30
+272.35558428267603
+11
+55.91210805114883
+21
+-43.919077983956576
+31
+271.62787970196536
+12
+58.628374919411456
+22
+-43.072725917258346
+32
+267.8621910313764
+13
+58.628374919411456
+23
+-43.072725917258346
+33
+267.8621910313764
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+62.34919050235217
+20
+-45.49313463136459
+30
+267.84332912334725
+11
+61.111879758116196
+21
+-46.79947387449948
+31
+272.35558428267603
+12
+58.628374919411456
+22
+-43.072725917258346
+32
+267.8621910313764
+13
+58.628374919411456
+23
+-43.072725917258346
+33
+267.8621910313764
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.91210805114883
+20
+-43.919077983956576
+30
+271.62787970196536
+11
+53.02276796550874
+21
+-41.389756962201496
+31
+269.51595445142215
+12
+55.831062691490985
+22
+-41.10804523906525
+32
+264.8491533359887
+13
+55.831062691490985
+23
+-41.10804523906525
+33
+264.8491533359887
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+58.628374919411456
+20
+-43.072725917258346
+30
+267.8621910313764
+11
+55.91210805114883
+21
+-43.919077983956576
+31
+271.62787970196536
+12
+55.831062691490985
+22
+-41.10804523906525
+32
+264.8491533359887
+13
+55.831062691490985
+23
+-41.10804523906525
+33
+264.8491533359887
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.11866059422821
+20
+-44.74900193721024
+30
+273.536583104718
+11
+52.17413421638866
+21
+-42.577448719350194
+31
+271.61723185065904
+12
+53.02276796550874
+22
+-41.389756962201496
+32
+269.51595445142215
+13
+53.02276796550874
+23
+-41.389756962201496
+33
+269.51595445142215
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.91210805114883
+20
+-43.919077983956576
+30
+271.62787970196536
+11
+55.11866059422821
+21
+-44.74900193721024
+31
+273.536583104718
+12
+53.02276796550874
+22
+-41.389756962201496
+32
+269.51595445142215
+13
+53.02276796550874
+23
+-41.389756962201496
+33
+269.51595445142215
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.49198891119811
+20
+-43.793129114219035
+30
+275.5186045693237
+11
+51.145247555867385
+21
+-42.621561246191575
+31
+273.9369423138391
+12
+52.17413421638866
+22
+-42.577448719350194
+32
+271.61723185065904
+13
+52.17413421638866
+23
+-42.577448719350194
+33
+271.61723185065904
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.11866059422821
+20
+-44.74900193721024
+30
+273.536583104718
+11
+54.49198891119811
+21
+-43.793129114219035
+31
+275.5186045693237
+12
+52.17413421638866
+22
+-42.577448719350194
+32
+271.61723185065904
+13
+52.17413421638866
+23
+-42.577448719350194
+33
+271.61723185065904
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+66.09318797870854
+20
+-47.9226700751621
+30
+268.0876212547477
+11
+62.34919050235217
+21
+-45.49313463136459
+31
+267.84332912334725
+12
+62.053666994951136
+22
+-49.30202315582314
+32
+259.17749928155166
+13
+62.053666994951136
+23
+-49.30202315582314
+33
+259.17749928155166
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+60.47316079189371
+20
+-46.23757154984119
+30
+259.0053083147117
+11
+62.053666994951136
+21
+-49.30202315582314
+31
+259.17749928155166
+12
+62.34919050235217
+22
+-45.49313463136459
+32
+267.84332912334725
+13
+62.34919050235217
+23
+-45.49313463136459
+33
+267.84332912334725
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+62.34919050235217
+20
+-45.49313463136459
+30
+267.84332912334725
+11
+58.628374919411456
+21
+-43.072725917258346
+31
+267.8621910313764
+12
+55.831062691490985
+22
+-41.10804523906525
+32
+264.8491533359887
+13
+55.831062691490985
+23
+-41.10804523906525
+33
+264.8491533359887
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+62.34919050235217
+20
+-45.49313463136459
+30
+267.84332912334725
+11
+55.831062691490985
+21
+-41.10804523906525
+31
+264.8491533359887
+12
+60.47316079189371
+22
+-46.23757154984119
+32
+259.0053083147117
+13
+60.47316079189371
+23
+-46.23757154984119
+33
+259.0053083147117
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.74219988882828
+20
+-55.050645963984216
+30
+248.58805904517396
+11
+62.053666994951136
+21
+-49.30202315582314
+31
+259.17749928155166
+12
+60.47316079189371
+22
+-46.23757154984119
+32
+259.0053083147117
+13
+60.47316079189371
+23
+-46.23757154984119
+33
+259.0053083147117
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.74219988882828
+20
+-55.050645963984216
+30
+248.58805904517396
+11
+60.47316079189371
+21
+-46.23757154984119
+31
+259.0053083147117
+12
+58.64130445314066
+22
+-50.246031230214385
+32
+251.9022788203731
+13
+58.64130445314066
+23
+-50.246031230214385
+33
+251.9022788203731
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.74219988882828
+20
+-55.050645963984216
+30
+248.58805904517396
+11
+58.64130445314066
+21
+-50.246031230214385
+31
+251.9022788203731
+12
+57.827899880628614
+22
+-48.57523124807817
+32
+249.83872523719313
+13
+57.827899880628614
+23
+-48.57523124807817
+33
+249.83872523719313
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.93936655049322
+20
+-54.56479972008862
+30
+245.14849884888397
+11
+57.74219988882828
+21
+-55.050645963984216
+31
+248.58805904517396
+12
+57.827899880628614
+22
+-48.57523124807817
+32
+249.83872523719313
+13
+57.827899880628614
+23
+-48.57523124807817
+33
+249.83872523719313
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+56.880362804088236
+20
+-51.01298074859614
+30
+243.88627213259153
+11
+55.93936655049322
+21
+-54.56479972008862
+31
+245.14849884888397
+12
+60.09716995104859
+22
+-41.32465295706602
+32
+250.62849157980665
+13
+60.09716995104859
+23
+-41.32465295706602
+33
+250.62849157980665
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.93936655049322
+20
+-54.56479972008862
+30
+245.14849884888397
+11
+57.827899880628614
+21
+-48.57523124807817
+31
+249.83872523719313
+12
+60.09716995104859
+22
+-41.32465295706602
+32
+250.62849157980665
+13
+60.09716995104859
+23
+-41.32465295706602
+33
+250.62849157980665
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.827899880628614
+20
+-48.57523124807817
+30
+249.83872523719313
+11
+60.47316079189371
+21
+-46.23757154984119
+31
+259.0053083147117
+12
+57.756985190928
+22
+-45.44476296399801
+32
+255.31780529514438
+13
+57.756985190928
+23
+-45.44476296399801
+33
+255.31780529514438
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.827899880628614
+20
+-48.57523124807817
+30
+249.83872523719313
+11
+58.64130445314066
+21
+-50.246031230214385
+31
+251.9022788203731
+12
+60.47316079189371
+22
+-46.23757154984119
+32
+259.0053083147117
+13
+60.47316079189371
+23
+-46.23757154984119
+33
+259.0053083147117
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.756985190928
+20
+-45.44476296399801
+30
+255.31780529514438
+11
+55.831062691490985
+21
+-41.10804523906525
+31
+264.8491533359887
+12
+56.4656137844878
+22
+-40.78313366205802
+32
+262.69433245589653
+13
+56.4656137844878
+23
+-40.78313366205802
+33
+262.69433245589653
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+60.47316079189371
+20
+-46.23757154984119
+30
+259.0053083147117
+11
+55.831062691490985
+21
+-41.10804523906525
+31
+264.8491533359887
+12
+57.756985190928
+22
+-45.44476296399801
+32
+255.31780529514438
+13
+57.756985190928
+23
+-45.44476296399801
+33
+255.31780529514438
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.827899880628614
+20
+-48.57523124807817
+30
+249.83872523719313
+11
+57.756985190928
+21
+-45.44476296399801
+31
+255.31780529514438
+12
+60.09716995104859
+22
+-41.32465295706602
+32
+250.62849157980665
+13
+60.09716995104859
+23
+-41.32465295706602
+33
+250.62849157980665
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+60.09716995104859
+20
+-41.32465295706602
+30
+250.62849157980665
+11
+57.756985190928
+21
+-45.44476296399801
+31
+255.31780529514438
+12
+58.46485434577747
+22
+-41.882904589845985
+32
+256.5137111090154
+13
+58.46485434577747
+23
+-41.882904589845985
+33
+256.5137111090154
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+62.01186657296544
+20
+-37.91673209037488
+30
+261.7001273682025
+11
+60.09716995104859
+21
+-41.32465295706602
+31
+250.62849157980665
+12
+58.46485434577747
+22
+-41.882904589845985
+32
+256.5137111090154
+13
+58.46485434577747
+23
+-41.882904589845985
+33
+256.5137111090154
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+62.01186657296544
+20
+-37.91673209037488
+30
+261.7001273682025
+11
+58.46485434577747
+21
+-41.882904589845985
+31
+256.5137111090154
+12
+58.09741220840976
+22
+-38.54678066339089
+32
+262.55591038891373
+13
+58.09741220840976
+23
+-38.54678066339089
+33
+262.55591038891373
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.756985190928
+20
+-45.44476296399801
+30
+255.31780529514438
+11
+56.4656137844878
+21
+-40.78313366205802
+31
+262.69433245589653
+12
+58.09741220840976
+22
+-38.54678066339089
+32
+262.55591038891373
+13
+58.09741220840976
+23
+-38.54678066339089
+33
+262.55591038891373
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.756985190928
+20
+-45.44476296399801
+30
+255.31780529514438
+11
+58.09741220840976
+21
+-38.54678066339089
+31
+262.55591038891373
+12
+58.46485434577747
+22
+-41.882904589845985
+32
+256.5137111090154
+13
+58.46485434577747
+23
+-41.882904589845985
+33
+256.5137111090154
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+62.01186657296544
+20
+-37.91673209037488
+30
+261.7001273682025
+11
+58.09741220840976
+21
+-38.54678066339089
+31
+262.55591038891373
+12
+61.28367523333688
+22
+-38.52244271754989
+32
+271.0741914340338
+13
+61.28367523333688
+23
+-38.52244271754989
+33
+271.0741914340338
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+61.28367523333688
+20
+-38.52244271754989
+30
+271.0741914340338
+11
+58.09741220840976
+21
+-38.54678066339089
+31
+262.55591038891373
+12
+56.898616263470636
+22
+-38.66481970073164
+32
+267.2151058962714
+13
+56.898616263470636
+23
+-38.66481970073164
+33
+267.2151058962714
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+58.09741220840976
+20
+-38.54678066339089
+30
+262.55591038891373
+11
+55.831062691490985
+21
+-41.10804523906525
+31
+264.8491533359887
+12
+56.898616263470636
+22
+-38.66481970073164
+32
+267.2151058962714
+13
+56.898616263470636
+23
+-38.66481970073164
+33
+267.2151058962714
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+58.09741220840976
+20
+-38.54678066339089
+30
+262.55591038891373
+11
+56.4656137844878
+21
+-40.78313366205802
+31
+262.69433245589653
+12
+55.831062691490985
+22
+-41.10804523906525
+32
+264.8491533359887
+13
+55.831062691490985
+23
+-41.10804523906525
+33
+264.8491533359887
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+56.898616263470636
+20
+-38.66481970073164
+30
+267.2151058962714
+11
+53.02276796550874
+21
+-41.389756962201496
+31
+269.51595445142215
+12
+55.121459458000174
+22
+-39.627689683154216
+32
+271.02064795317835
+13
+55.121459458000174
+23
+-39.627689683154216
+33
+271.02064795317835
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.831062691490985
+20
+-41.10804523906525
+30
+264.8491533359887
+11
+53.02276796550874
+21
+-41.389756962201496
+31
+269.51595445142215
+12
+56.898616263470636
+22
+-38.66481970073164
+32
+267.2151058962714
+13
+56.898616263470636
+23
+-38.66481970073164
+33
+267.2151058962714
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+62.160875646390416
+20
+-41.51144669141887
+30
+274.9046798854296
+11
+61.28367523333688
+21
+-38.52244271754989
+31
+271.0741914340338
+12
+56.898616263470636
+22
+-38.66481970073164
+32
+267.2151058962714
+13
+56.898616263470636
+23
+-38.66481970073164
+33
+267.2151058962714
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+62.160875646390416
+20
+-41.51144669141887
+30
+274.9046798854296
+11
+56.898616263470636
+21
+-38.66481970073164
+31
+267.2151058962714
+12
+55.121459458000174
+22
+-39.627689683154216
+32
+271.02064795317835
+13
+55.121459458000174
+23
+-39.627689683154216
+33
+271.02064795317835
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+53.02276796550874
+20
+-41.389756962201496
+30
+269.51595445142215
+11
+52.17413421638866
+21
+-42.577448719350194
+31
+271.61723185065904
+12
+52.495425523951205
+22
+-41.09648471479178
+32
+272.73556046215464
+13
+52.495425523951205
+23
+-41.09648471479178
+33
+272.73556046215464
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.121459458000174
+20
+-39.627689683154216
+30
+271.02064795317835
+11
+53.02276796550874
+21
+-41.389756962201496
+31
+269.51595445142215
+12
+52.495425523951205
+22
+-41.09648471479178
+32
+272.73556046215464
+13
+52.495425523951205
+23
+-41.09648471479178
+33
+272.73556046215464
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+52.83232353928571
+20
+-41.64713073949456
+30
+274.2083104099911
+11
+52.495425523951205
+21
+-41.09648471479178
+31
+272.73556046215464
+12
+51.145247555867385
+22
+-42.621561246191575
+32
+273.9369423138391
+13
+51.145247555867385
+23
+-42.621561246191575
+33
+273.9369423138391
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+52.17413421638866
+20
+-42.577448719350194
+30
+271.61723185065904
+11
+51.145247555867385
+21
+-42.621561246191575
+31
+273.9369423138391
+12
+52.495425523951205
+22
+-41.09648471479178
+32
+272.73556046215464
+13
+52.495425523951205
+23
+-41.09648471479178
+33
+272.73556046215464
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+52.83232353928571
+20
+-41.64713073949456
+30
+274.2083104099911
+11
+54.49198891119811
+21
+-43.793129114219035
+31
+275.5186045693237
+12
+54.824384406551616
+22
+-42.21237953170309
+32
+275.16509590595166
+13
+54.824384406551616
+23
+-42.21237953170309
+33
+275.16509590595166
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+52.83232353928571
+20
+-41.64713073949456
+30
+274.2083104099911
+11
+51.145247555867385
+21
+-42.621561246191575
+31
+273.9369423138391
+12
+54.49198891119811
+22
+-43.793129114219035
+32
+275.5186045693237
+13
+54.49198891119811
+23
+-43.793129114219035
+33
+275.5186045693237
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.824384406551616
+20
+-42.21237953170309
+30
+275.16509590595166
+11
+59.97584529102023
+21
+-44.3407328956913
+31
+276.59373332694685
+12
+60.09093335242627
+22
+-42.65076678120392
+32
+275.91713843250653
+13
+60.09093335242627
+23
+-42.65076678120392
+33
+275.91713843250653
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.824384406551616
+20
+-42.21237953170309
+30
+275.16509590595166
+11
+54.49198891119811
+21
+-43.793129114219035
+31
+275.5186045693237
+12
+59.97584529102023
+22
+-44.3407328956913
+32
+276.59373332694685
+13
+59.97584529102023
+23
+-44.3407328956913
+33
+276.59373332694685
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+62.160875646390416
+20
+-41.51144669141887
+30
+274.9046798854296
+11
+60.09093335242627
+21
+-42.65076678120392
+31
+275.91713843250653
+12
+64.1253129451243
+22
+-44.70549785901618
+32
+276.2965061633368
+13
+64.1253129451243
+23
+-44.70549785901618
+33
+276.2965061633368
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.7525874663142
+20
+-67.73923402932417
+30
+200.62435649900746
+11
+57.636025600087294
+21
+-56.31865294240304
+31
+202.3928124888417
+12
+56.83850153723793
+22
+-59.948657564917134
+32
+205.49194566764947
+13
+56.83850153723793
+23
+-59.948657564917134
+33
+205.49194566764947
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.49236975265053
+20
+-64.76635394457617
+30
+196.1668617178263
+11
+57.636025600087294
+21
+-56.31865294240304
+31
+202.3928124888417
+12
+54.7525874663142
+22
+-67.73923402932417
+32
+200.62435649900746
+13
+54.7525874663142
+23
+-67.73923402932417
+33
+200.62435649900746
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.49236975265053
+20
+-64.76635394457617
+30
+196.1668617178263
+11
+58.573736230993475
+21
+-51.24236588815695
+31
+199.65692315174462
+12
+57.636025600087294
+22
+-56.31865294240304
+32
+202.3928124888417
+13
+57.636025600087294
+23
+-56.31865294240304
+33
+202.3928124888417
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.49236975265053
+20
+-64.76635394457617
+30
+196.1668617178263
+11
+56.75240605381761
+21
+-58.17137906971514
+31
+196.5754349836705
+12
+58.573736230993475
+22
+-51.24236588815695
+32
+199.65692315174462
+13
+58.573736230993475
+23
+-51.24236588815695
+33
+199.65692315174462
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+53.14543121255847
+20
+-64.40250165421945
+30
+192.84899125075214
+11
+54.10604993498957
+21
+-58.371254449952154
+31
+195.43003040742508
+12
+55.49236975265053
+22
+-64.76635394457617
+32
+196.1668617178263
+13
+55.49236975265053
+23
+-64.76635394457617
+33
+196.1668617178263
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+56.75240605381761
+20
+-58.17137906971514
+30
+196.5754349836705
+11
+55.49236975265053
+21
+-64.76635394457617
+31
+196.1668617178263
+12
+54.10604993498957
+22
+-58.371254449952154
+32
+195.43003040742508
+13
+54.10604993498957
+23
+-58.371254449952154
+33
+195.43003040742508
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+58.573736230993475
+20
+-51.24236588815695
+30
+199.65692315174462
+11
+56.75240605381761
+21
+-58.17137906971514
+31
+196.5754349836705
+12
+54.10604993498957
+22
+-58.371254449952154
+32
+195.43003040742508
+13
+54.10604993498957
+23
+-58.371254449952154
+33
+195.43003040742508
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+56.040156068716364
+20
+-51.07291294022359
+30
+199.52914893606777
+11
+58.573736230993475
+21
+-51.24236588815695
+31
+199.65692315174462
+12
+54.10604993498957
+22
+-58.371254449952154
+32
+195.43003040742508
+13
+54.10604993498957
+23
+-58.371254449952154
+33
+195.43003040742508
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+52.00090888684969
+20
+-57.80205074154516
+30
+198.22372236590118
+11
+51.213059157473
+21
+-56.304050174897554
+31
+203.83818224760503
+12
+54.17708631441941
+22
+-51.05435525651876
+32
+201.82604257501956
+13
+54.17708631441941
+23
+-51.05435525651876
+33
+201.82604257501956
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.17708631441941
+20
+-51.05435525651876
+30
+201.82604257501956
+11
+51.213059157473
+21
+-56.304050174897554
+31
+203.83818224760503
+12
+52.82891622686765
+22
+-49.93055060721156
+32
+211.1827658544384
+13
+52.82891622686765
+23
+-49.93055060721156
+33
+211.1827658544384
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.10604993498957
+20
+-58.371254449952154
+30
+195.43003040742508
+11
+52.00090888684969
+21
+-57.80205074154516
+31
+198.22372236590118
+12
+56.040156068716364
+22
+-51.07291294022359
+32
+199.52914893606777
+13
+56.040156068716364
+23
+-51.07291294022359
+33
+199.52914893606777
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+52.00090888684969
+20
+-57.80205074154516
+30
+198.22372236590118
+11
+54.17708631441941
+21
+-51.05435525651876
+31
+201.82604257501956
+12
+56.040156068716364
+22
+-51.07291294022359
+32
+199.52914893606777
+13
+56.040156068716364
+23
+-51.07291294022359
+33
+199.52914893606777
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+28.937450000161196
+20
+-100.34934344029934
+30
+179.60701914178063
+11
+20.310256647392894
+21
+-111.18125046213856
+31
+179.97817281588664
+12
+27.188160142681205
+22
+-100.95262027288871
+32
+183.6760194624404
+13
+27.188160142681205
+23
+-100.95262027288871
+33
+183.6760194624404
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+22.69598378867257
+20
+-109.31726803487116
+30
+174.71065035217887
+11
+20.310256647392894
+21
+-111.18125046213856
+31
+179.97817281588664
+12
+28.937450000161196
+22
+-100.34934344029934
+32
+179.60701914178063
+13
+28.937450000161196
+23
+-100.34934344029934
+33
+179.60701914178063
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+32.484401382484556
+20
+-98.75094884704656
+30
+177.32868318653462
+11
+22.69598378867257
+21
+-109.31726803487116
+31
+174.71065035217887
+12
+28.937450000161196
+22
+-100.34934344029934
+32
+179.60701914178063
+13
+28.937450000161196
+23
+-100.34934344029934
+33
+179.60701914178063
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+32.484401382484556
+20
+-98.75094884704656
+30
+177.32868318653462
+11
+26.175093146958005
+21
+-108.38573315772197
+31
+171.9434563322396
+12
+22.69598378867257
+22
+-109.31726803487116
+32
+174.71065035217887
+13
+22.69598378867257
+23
+-109.31726803487116
+33
+174.71065035217887
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+32.484401382484556
+20
+-98.75094884704656
+30
+177.32868318653462
+11
+37.55612507188438
+21
+-99.97180105540576
+31
+175.94659208696348
+12
+26.175093146958005
+22
+-108.38573315772197
+32
+171.9434563322396
+13
+26.175093146958005
+23
+-108.38573315772197
+33
+171.9434563322396
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+37.55612507188438
+20
+-99.97180105540576
+30
+175.94659208696348
+11
+30.32836360510008
+21
+-110.68627748854989
+31
+169.69691181875012
+12
+26.175093146958005
+22
+-108.38573315772197
+32
+171.9434563322396
+13
+26.175093146958005
+23
+-108.38573315772197
+33
+171.9434563322396
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+37.46911691549494
+20
+-90.03492199195188
+30
+182.28632275479666
+11
+43.10791474304133
+21
+-90.25852686938603
+31
+181.48682123384745
+12
+32.484401382484556
+22
+-98.75094884704656
+32
+177.32868318653462
+13
+32.484401382484556
+23
+-98.75094884704656
+33
+177.32868318653462
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+43.10791474304133
+20
+-90.25852686938603
+30
+181.48682123384745
+11
+37.55612507188438
+21
+-99.97180105540576
+31
+175.94659208696348
+12
+32.484401382484556
+22
+-98.75094884704656
+32
+177.32868318653462
+13
+32.484401382484556
+23
+-98.75094884704656
+33
+177.32868318653462
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+37.46911691549494
+20
+-90.03492199195188
+30
+182.28632275479666
+11
+28.937450000161196
+21
+-100.34934344029934
+31
+179.60701914178063
+12
+33.73689292044023
+22
+-92.40087455223444
+32
+184.28416388419956
+13
+33.73689292044023
+23
+-92.40087455223444
+33
+184.28416388419956
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+37.46911691549494
+20
+-90.03492199195188
+30
+182.28632275479666
+11
+32.484401382484556
+21
+-98.75094884704656
+31
+177.32868318653462
+12
+28.937450000161196
+22
+-100.34934344029934
+32
+179.60701914178063
+13
+28.937450000161196
+23
+-100.34934344029934
+33
+179.60701914178063
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+27.188160142681205
+20
+-100.95262027288871
+30
+183.6760194624404
+11
+30.829725289470005
+21
+-94.57334044306415
+31
+188.1265170841944
+12
+33.73689292044023
+22
+-92.40087455223444
+32
+184.28416388419956
+13
+33.73689292044023
+23
+-92.40087455223444
+33
+184.28416388419956
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+28.937450000161196
+20
+-100.34934344029934
+30
+179.60701914178063
+11
+27.188160142681205
+21
+-100.95262027288871
+31
+183.6760194624404
+12
+33.73689292044023
+22
+-92.40087455223444
+32
+184.28416388419956
+13
+33.73689292044023
+23
+-92.40087455223444
+33
+184.28416388419956
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+36.72437577269302
+20
+-86.69910228981966
+30
+187.7860900667145
+11
+30.829725289470005
+21
+-94.57334044306415
+31
+188.1265170841944
+12
+33.483169835024874
+22
+-89.26918937086285
+32
+192.5289472629075
+13
+33.483169835024874
+23
+-89.26918937086285
+33
+192.5289472629075
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+33.73689292044023
+20
+-92.40087455223444
+30
+184.28416388419956
+11
+30.829725289470005
+21
+-94.57334044306415
+31
+188.1265170841944
+12
+36.72437577269302
+22
+-86.69910228981966
+32
+187.7860900667145
+13
+36.72437577269302
+23
+-86.69910228981966
+33
+187.7860900667145
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+33.73689292044023
+20
+-92.40087455223444
+30
+184.28416388419956
+11
+36.72437577269302
+21
+-86.69910228981966
+31
+187.7860900667145
+12
+41.64277040328071
+22
+-82.30944953267506
+32
+186.47518745873631
+13
+41.64277040328071
+23
+-82.30944953267506
+33
+186.47518745873631
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+37.46911691549494
+20
+-90.03492199195188
+30
+182.28632275479666
+11
+33.73689292044023
+21
+-92.40087455223444
+31
+184.28416388419956
+12
+41.64277040328071
+22
+-82.30944953267506
+32
+186.47518745873631
+13
+41.64277040328071
+23
+-82.30944953267506
+33
+186.47518745873631
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+47.1455799584282
+20
+-82.10257699300779
+30
+185.7690828049607
+11
+37.46911691549494
+21
+-90.03492199195188
+31
+182.28632275479666
+12
+41.64277040328071
+22
+-82.30944953267506
+32
+186.47518745873631
+13
+41.64277040328071
+23
+-82.30944953267506
+33
+186.47518745873631
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+47.1455799584282
+20
+-82.10257699300779
+30
+185.7690828049607
+11
+43.10791474304133
+21
+-90.25852686938603
+31
+181.48682123384745
+12
+37.46911691549494
+22
+-90.03492199195188
+32
+182.28632275479666
+13
+37.46911691549494
+23
+-90.03492199195188
+33
+182.28632275479666
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+50.05423828858134
+20
+-74.44220853886146
+30
+188.86121882434105
+11
+41.64277040328071
+21
+-82.30944953267506
+31
+186.47518745873631
+12
+44.375617497149
+22
+-75.49665004251852
+32
+190.6619225924145
+13
+44.375617497149
+23
+-75.49665004251852
+33
+190.6619225924145
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+50.05423828858134
+20
+-74.44220853886146
+30
+188.86121882434105
+11
+47.1455799584282
+21
+-82.10257699300779
+31
+185.7690828049607
+12
+41.64277040328071
+22
+-82.30944953267506
+32
+186.47518745873631
+13
+41.64277040328071
+23
+-82.30944953267506
+33
+186.47518745873631
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+53.14543121255847
+20
+-64.40250165421945
+30
+192.84899125075214
+11
+44.375617497149
+21
+-75.49665004251852
+31
+190.6619225924145
+12
+48.63892589293468
+22
+-65.90019799654594
+32
+195.13249901948998
+13
+48.63892589293468
+23
+-65.90019799654594
+33
+195.13249901948998
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+53.14543121255847
+20
+-64.40250165421945
+30
+192.84899125075214
+11
+50.05423828858134
+21
+-74.44220853886146
+31
+188.86121882434105
+12
+44.375617497149
+22
+-75.49665004251852
+32
+190.6619225924145
+13
+44.375617497149
+23
+-75.49665004251852
+33
+190.6619225924145
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+52.00090888684969
+20
+-57.80205074154516
+30
+198.22372236590118
+11
+53.14543121255847
+21
+-64.40250165421945
+31
+192.84899125075214
+12
+48.63892589293468
+22
+-65.90019799654594
+32
+195.13249901948998
+13
+48.63892589293468
+23
+-65.90019799654594
+33
+195.13249901948998
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+53.14543121255847
+20
+-64.40250165421945
+30
+192.84899125075214
+11
+52.00090888684969
+21
+-57.80205074154516
+31
+198.22372236590118
+12
+54.10604993498957
+22
+-58.371254449952154
+32
+195.43003040742508
+13
+54.10604993498957
+23
+-58.371254449952154
+33
+195.43003040742508
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+36.72437577269302
+20
+-86.69910228981966
+30
+187.7860900667145
+11
+36.05234424309768
+21
+-83.11990312925657
+31
+197.50818675810464
+12
+40.19740064451766
+22
+-78.89848642275263
+32
+193.9003905111746
+13
+40.19740064451766
+23
+-78.89848642275263
+33
+193.9003905111746
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+36.72437577269302
+20
+-86.69910228981966
+30
+187.7860900667145
+11
+33.483169835024874
+21
+-89.26918937086285
+31
+192.5289472629075
+12
+36.05234424309768
+22
+-83.11990312925657
+32
+197.50818675810464
+13
+36.05234424309768
+23
+-83.11990312925657
+33
+197.50818675810464
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+36.72437577269302
+20
+-86.69910228981966
+30
+187.7860900667145
+11
+40.19740064451766
+21
+-78.89848642275263
+31
+193.9003905111746
+12
+44.375617497149
+22
+-75.49665004251852
+32
+190.6619225924145
+13
+44.375617497149
+23
+-75.49665004251852
+33
+190.6619225924145
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+41.64277040328071
+20
+-82.30944953267506
+30
+186.47518745873631
+11
+36.72437577269302
+21
+-86.69910228981966
+31
+187.7860900667145
+12
+44.375617497149
+22
+-75.49665004251852
+32
+190.6619225924145
+13
+44.375617497149
+23
+-75.49665004251852
+33
+190.6619225924145
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+44.375617497149
+20
+-75.49665004251852
+30
+190.6619225924145
+11
+40.19740064451766
+21
+-78.89848642275263
+31
+193.9003905111746
+12
+44.63603351767125
+22
+-70.43435730713483
+32
+198.00620197492452
+13
+44.63603351767125
+23
+-70.43435730713483
+33
+198.00620197492452
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+44.375617497149
+20
+-75.49665004251852
+30
+190.6619225924145
+11
+44.63603351767125
+21
+-70.43435730713483
+31
+198.00620197492452
+12
+48.63892589293468
+22
+-65.90019799654594
+32
+195.13249901948998
+13
+48.63892589293468
+23
+-65.90019799654594
+33
+195.13249901948998
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+48.63892589293468
+20
+-65.90019799654594
+30
+195.13249901948998
+11
+51.213059157473
+21
+-56.304050174897554
+31
+203.83818224760503
+12
+52.00090888684969
+22
+-57.80205074154516
+32
+198.22372236590118
+13
+52.00090888684969
+23
+-57.80205074154516
+33
+198.22372236590118
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+48.63892589293468
+20
+-65.90019799654594
+30
+195.13249901948998
+11
+48.07641511963372
+21
+-63.43476408263112
+31
+201.00615802442366
+12
+51.213059157473
+22
+-56.304050174897554
+32
+203.83818224760503
+13
+51.213059157473
+23
+-56.304050174897554
+33
+203.83818224760503
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+51.213059157473
+20
+-56.304050174897554
+30
+203.83818224760503
+11
+44.627211012303086
+21
+-68.53995244756646
+31
+204.58048959581942
+12
+48.36722315002764
+22
+-60.68122973479795
+32
+207.66593268009322
+13
+48.36722315002764
+23
+-60.68122973479795
+33
+207.66593268009322
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+48.07641511963372
+20
+-63.43476408263112
+30
+201.00615802442366
+11
+44.627211012303086
+21
+-68.53995244756646
+31
+204.58048959581942
+12
+51.213059157473
+22
+-56.304050174897554
+32
+203.83818224760503
+13
+51.213059157473
+23
+-56.304050174897554
+33
+203.83818224760503
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+40.916891168507256
+20
+-69.90226896614156
+30
+212.38962374393267
+11
+33.94011476823095
+21
+-77.45707158019418
+31
+213.36040355875144
+12
+38.8667234555407
+22
+-71.93631278998868
+32
+218.73696001983896
+13
+38.8667234555407
+23
+-71.93631278998868
+33
+218.73696001983896
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+37.33556243768038
+20
+-77.3256466726387
+30
+204.7831029949619
+11
+33.94011476823095
+21
+-77.45707158019418
+31
+213.36040355875144
+12
+40.916891168507256
+22
+-69.90226896614156
+32
+212.38962374393267
+13
+40.916891168507256
+23
+-69.90226896614156
+33
+212.38962374393267
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+33.30124368984699
+20
+-78.99492553316206
+30
+216.11910972007792
+11
+37.872214143522946
+21
+-74.26514998286021
+31
+220.17928753537106
+12
+38.8667234555407
+22
+-71.93631278998868
+32
+218.73696001983896
+13
+38.8667234555407
+23
+-71.93631278998868
+33
+218.73696001983896
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+33.94011476823095
+20
+-77.45707158019418
+30
+213.36040355875144
+11
+33.30124368984699
+21
+-78.99492553316206
+31
+216.11910972007792
+12
+38.8667234555407
+22
+-71.93631278998868
+32
+218.73696001983896
+13
+38.8667234555407
+23
+-71.93631278998868
+33
+218.73696001983896
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+38.8667234555407
+20
+-71.93631278998868
+30
+218.73696001983896
+11
+41.02489080318645
+21
+-72.15383318096379
+31
+224.50566163332334
+12
+42.064121090691124
+22
+-69.72064704529011
+32
+225.29451530296657
+13
+42.064121090691124
+23
+-69.72064704529011
+33
+225.29451530296657
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+38.8667234555407
+20
+-71.93631278998868
+30
+218.73696001983896
+11
+37.872214143522946
+21
+-74.26514998286021
+31
+220.17928753537106
+12
+41.02489080318645
+22
+-72.15383318096379
+32
+224.50566163332334
+13
+41.02489080318645
+23
+-72.15383318096379
+33
+224.50566163332334
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+40.916891168507256
+20
+-69.90226896614156
+30
+212.38962374393267
+11
+42.064121090691124
+21
+-69.72064704529011
+31
+225.29451530296657
+12
+44.79118792242165
+22
+-65.30483099636383
+32
+223.59298866420505
+13
+44.79118792242165
+23
+-65.30483099636383
+33
+223.59298866420505
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+42.064121090691124
+20
+-69.72064704529011
+30
+225.29451530296657
+11
+40.916891168507256
+21
+-69.90226896614156
+31
+212.38962374393267
+12
+38.8667234555407
+22
+-71.93631278998868
+32
+218.73696001983896
+13
+38.8667234555407
+23
+-71.93631278998868
+33
+218.73696001983896
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+46.1483326275031
+20
+-64.3529130895688
+30
+212.47115586250925
+11
+44.79118792242165
+21
+-65.30483099636383
+31
+223.59298866420505
+12
+47.21828957163477
+22
+-62.21847523912291
+32
+222.4262883853474
+13
+47.21828957163477
+23
+-62.21847523912291
+33
+222.4262883853474
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+40.916891168507256
+20
+-69.90226896614156
+30
+212.38962374393267
+11
+44.79118792242165
+21
+-65.30483099636383
+31
+223.59298866420505
+12
+46.1483326275031
+22
+-64.3529130895688
+32
+212.47115586250925
+13
+46.1483326275031
+23
+-64.3529130895688
+33
+212.47115586250925
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+44.627211012303086
+20
+-68.53995244756646
+30
+204.58048959581942
+11
+40.916891168507256
+21
+-69.90226896614156
+31
+212.38962374393267
+12
+46.1483326275031
+22
+-64.3529130895688
+32
+212.47115586250925
+13
+46.1483326275031
+23
+-64.3529130895688
+33
+212.47115586250925
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+44.627211012303086
+20
+-68.53995244756646
+30
+204.58048959581942
+11
+46.1483326275031
+21
+-64.3529130895688
+31
+212.47115586250925
+12
+48.36722315002764
+22
+-60.68122973479795
+32
+207.66593268009322
+13
+48.36722315002764
+23
+-60.68122973479795
+33
+207.66593268009322
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+48.36722315002764
+20
+-60.68122973479795
+30
+207.66593268009322
+11
+47.21828957163477
+21
+-62.21847523912291
+31
+222.4262883853474
+12
+50.189253043146486
+22
+-56.70684317860679
+32
+220.19906211637309
+13
+50.189253043146486
+23
+-56.70684317860679
+33
+220.19906211637309
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+48.36722315002764
+20
+-60.68122973479795
+30
+207.66593268009322
+11
+46.1483326275031
+21
+-64.3529130895688
+31
+212.47115586250925
+12
+47.21828957163477
+22
+-62.21847523912291
+32
+222.4262883853474
+13
+47.21828957163477
+23
+-62.21847523912291
+33
+222.4262883853474
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+51.213059157473
+20
+-56.304050174897554
+30
+203.83818224760503
+11
+48.36722315002764
+21
+-60.68122973479795
+31
+207.66593268009322
+12
+52.82891622686765
+22
+-49.93055060721156
+32
+211.1827658544384
+13
+52.82891622686765
+23
+-49.93055060721156
+33
+211.1827658544384
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+48.36722315002764
+20
+-60.68122973479795
+30
+207.66593268009322
+11
+50.189253043146486
+21
+-56.70684317860679
+31
+220.19906211637309
+12
+52.82891622686765
+22
+-49.93055060721156
+32
+211.1827658544384
+13
+52.82891622686765
+23
+-49.93055060721156
+33
+211.1827658544384
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+26.889411857455926
+20
+-123.75301638744043
+30
+167.43424341613664
+11
+34.09526917298135
+21
+-113.19217323743102
+31
+172.23949702098844
+12
+33.814470122815464
+22
+-115.57151166792774
+32
+175.60607380218084
+13
+33.814470122815464
+23
+-115.57151166792774
+33
+175.60607380218084
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+26.889411857455926
+20
+-123.75301638744043
+30
+167.43424341613664
+11
+33.814470122815464
+21
+-115.57151166792774
+31
+175.60607380218084
+12
+27.93168438819096
+22
+-123.31706293252525
+32
+172.39355621817344
+13
+27.93168438819096
+23
+-123.31706293252525
+33
+172.39355621817344
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+30.32836360510008
+20
+-110.68627748854989
+30
+169.69691181875012
+11
+34.09526917298135
+21
+-113.19217323743102
+31
+172.23949702098844
+12
+22.13955750183241
+22
+-120.67700425718222
+32
+164.867807026972
+13
+22.13955750183241
+23
+-120.67700425718222
+33
+164.867807026972
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+34.09526917298135
+20
+-113.19217323743102
+30
+172.23949702098844
+11
+26.889411857455926
+21
+-123.75301638744043
+31
+167.43424341613664
+12
+22.13955750183241
+22
+-120.67700425718222
+32
+164.867807026972
+13
+22.13955750183241
+23
+-120.67700425718222
+33
+164.867807026972
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+26.175093146958005
+20
+-108.38573315772197
+30
+171.9434563322396
+11
+30.32836360510008
+21
+-110.68627748854989
+31
+169.69691181875012
+12
+18.68782833262058
+22
+-120.29641962905949
+32
+166.08552572480428
+13
+18.68782833262058
+23
+-120.29641962905949
+33
+166.08552572480428
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+30.32836360510008
+20
+-110.68627748854989
+30
+169.69691181875012
+11
+22.13955750183241
+21
+-120.67700425718222
+31
+164.867807026972
+12
+18.68782833262058
+22
+-120.29641962905949
+32
+166.08552572480428
+13
+18.68782833262058
+23
+-120.29641962905949
+33
+166.08552572480428
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+26.175093146958005
+20
+-108.38573315772197
+30
+171.9434563322396
+11
+15.910260263265394
+21
+-119.0171563506772
+31
+169.66810177535595
+12
+22.69598378867257
+22
+-109.31726803487116
+32
+174.71065035217887
+13
+22.69598378867257
+23
+-109.31726803487116
+33
+174.71065035217887
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+26.175093146958005
+20
+-108.38573315772197
+30
+171.9434563322396
+11
+18.68782833262058
+21
+-120.29641962905949
+31
+166.08552572480428
+12
+15.910260263265394
+22
+-119.0171563506772
+32
+169.66810177535595
+13
+15.910260263265394
+23
+-119.0171563506772
+33
+169.66810177535595
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+22.69598378867257
+20
+-109.31726803487116
+30
+174.71065035217887
+11
+14.23976450545275
+21
+-119.52095182963338
+31
+177.18265551147002
+12
+20.310256647392894
+22
+-111.18125046213856
+32
+179.97817281588664
+13
+20.310256647392894
+23
+-111.18125046213856
+33
+179.97817281588664
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+15.910260263265394
+20
+-119.0171563506772
+30
+169.66810177535595
+11
+14.23976450545275
+21
+-119.52095182963338
+31
+177.18265551147002
+12
+22.69598378867257
+22
+-109.31726803487116
+32
+174.71065035217887
+13
+22.69598378867257
+23
+-109.31726803487116
+33
+174.71065035217887
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+34.09526917298135
+20
+-113.19217323743102
+30
+172.23949702098844
+11
+40.75048046380437
+21
+-102.83485615953579
+31
+177.74820852800568
+12
+40.819539385134455
+22
+-105.06573312038904
+32
+181.84793550529218
+13
+40.819539385134455
+23
+-105.06573312038904
+33
+181.84793550529218
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+34.09526917298135
+20
+-113.19217323743102
+30
+172.23949702098844
+11
+40.819539385134455
+21
+-105.06573312038904
+31
+181.84793550529218
+12
+33.814470122815464
+22
+-115.57151166792774
+32
+175.60607380218084
+13
+33.814470122815464
+23
+-115.57151166792774
+33
+175.60607380218084
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+37.55612507188438
+20
+-99.97180105540576
+30
+175.94659208696348
+11
+34.09526917298135
+21
+-113.19217323743102
+31
+172.23949702098844
+12
+30.32836360510008
+22
+-110.68627748854989
+32
+169.69691181875012
+13
+30.32836360510008
+23
+-110.68627748854989
+33
+169.69691181875012
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+37.55612507188438
+20
+-99.97180105540576
+30
+175.94659208696348
+11
+40.75048046380437
+21
+-102.83485615953579
+31
+177.74820852800568
+12
+34.09526917298135
+22
+-113.19217323743102
+32
+172.23949702098844
+13
+34.09526917298135
+23
+-113.19217323743102
+33
+172.23949702098844
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+43.10791474304133
+20
+-90.25852686938603
+30
+181.48682123384745
+11
+45.98253037144628
+21
+-93.5274172204514
+31
+183.51903971175375
+12
+37.55612507188438
+22
+-99.97180105540576
+32
+175.94659208696348
+13
+37.55612507188438
+23
+-99.97180105540576
+33
+175.94659208696348
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+45.98253037144628
+20
+-93.5274172204514
+30
+183.51903971175375
+11
+40.75048046380437
+21
+-102.83485615953579
+31
+177.74820852800568
+12
+37.55612507188438
+22
+-99.97180105540576
+32
+175.94659208696348
+13
+37.55612507188438
+23
+-99.97180105540576
+33
+175.94659208696348
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+40.75048046380437
+20
+-102.83485615953579
+30
+177.74820852800568
+11
+45.98253037144628
+21
+-93.5274172204514
+31
+183.51903971175375
+12
+45.92320662845352
+22
+-96.19029272002136
+32
+186.71795846851884
+13
+45.92320662845352
+23
+-96.19029272002136
+33
+186.71795846851884
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+40.75048046380437
+20
+-102.83485615953579
+30
+177.74820852800568
+11
+45.92320662845352
+21
+-96.19029272002136
+31
+186.71795846851884
+12
+40.819539385134455
+22
+-105.06573312038904
+32
+181.84793550529218
+13
+40.819539385134455
+23
+-105.06573312038904
+33
+181.84793550529218
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+45.98253037144628
+20
+-93.5274172204514
+30
+183.51903971175375
+11
+49.71679266946537
+21
+-84.3504905159511
+31
+188.52292137711808
+12
+49.09736152532362
+22
+-87.92299674141044
+32
+191.15081107953677
+13
+49.09736152532362
+23
+-87.92299674141044
+33
+191.15081107953677
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+45.98253037144628
+20
+-93.5274172204514
+30
+183.51903971175375
+11
+49.09736152532362
+21
+-87.92299674141044
+31
+191.15081107953677
+12
+45.92320662845352
+22
+-96.19029272002136
+32
+186.71795846851884
+13
+45.92320662845352
+23
+-96.19029272002136
+33
+186.71795846851884
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+43.10791474304133
+20
+-90.25852686938603
+30
+181.48682123384745
+11
+47.1455799584282
+21
+-82.10257699300779
+31
+185.7690828049607
+12
+49.71679266946537
+22
+-84.3504905159511
+32
+188.52292137711808
+13
+49.71679266946537
+23
+-84.3504905159511
+33
+188.52292137711808
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+49.71679266946537
+20
+-84.3504905159511
+30
+188.52292137711808
+11
+45.98253037144628
+21
+-93.5274172204514
+31
+183.51903971175375
+12
+43.10791474304133
+22
+-90.25852686938603
+32
+181.48682123384745
+13
+43.10791474304133
+23
+-90.25852686938603
+33
+181.48682123384745
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+47.1455799584282
+20
+-82.10257699300779
+30
+185.7690828049607
+11
+50.05423828858134
+21
+-74.44220853886146
+31
+188.86121882434105
+12
+51.968022237529055
+22
+-76.8571412151538
+32
+192.13315141863578
+13
+51.968022237529055
+23
+-76.8571412151538
+33
+192.13315141863578
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+47.1455799584282
+20
+-82.10257699300779
+30
+185.7690828049607
+11
+51.968022237529055
+21
+-76.8571412151538
+31
+192.13315141863578
+12
+49.71679266946537
+22
+-84.3504905159511
+32
+188.52292137711808
+13
+49.71679266946537
+23
+-84.3504905159511
+33
+188.52292137711808
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+49.71679266946537
+20
+-84.3504905159511
+30
+188.52292137711808
+11
+51.968022237529055
+21
+-76.8571412151538
+31
+192.13315141863578
+12
+51.59665560639413
+22
+-78.96146085762227
+32
+195.0722626035245
+13
+51.59665560639413
+23
+-78.96146085762227
+33
+195.0722626035245
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+49.71679266946537
+20
+-84.3504905159511
+30
+188.52292137711808
+11
+51.59665560639413
+21
+-78.96146085762227
+31
+195.0722626035245
+12
+49.09736152532362
+22
+-87.92299674141044
+32
+191.15081107953677
+13
+49.09736152532362
+23
+-87.92299674141044
+33
+191.15081107953677
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+51.968022237529055
+20
+-76.8571412151538
+30
+192.13315141863578
+11
+55.49236975265053
+21
+-64.76635394457617
+31
+196.1668617178263
+12
+54.7525874663142
+22
+-67.73923402932417
+32
+200.62435649900746
+13
+54.7525874663142
+23
+-67.73923402932417
+33
+200.62435649900746
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+51.968022237529055
+20
+-76.8571412151538
+30
+192.13315141863578
+11
+54.7525874663142
+21
+-67.73923402932417
+31
+200.62435649900746
+12
+51.59665560639413
+22
+-78.96146085762227
+32
+195.0722626035245
+13
+51.59665560639413
+23
+-78.96146085762227
+33
+195.0722626035245
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+50.05423828858134
+20
+-74.44220853886146
+30
+188.86121882434105
+11
+53.14543121255847
+21
+-64.40250165421945
+31
+192.84899125075214
+12
+55.49236975265053
+22
+-64.76635394457617
+32
+196.1668617178263
+13
+55.49236975265053
+23
+-64.76635394457617
+33
+196.1668617178263
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+50.05423828858134
+20
+-74.44220853886146
+30
+188.86121882434105
+11
+55.49236975265053
+21
+-64.76635394457617
+31
+196.1668617178263
+12
+51.968022237529055
+22
+-76.8571412151538
+32
+192.13315141863578
+13
+51.968022237529055
+23
+-76.8571412151538
+33
+192.13315141863578
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.56276726100199
+20
+-75.92560633802064
+30
+251.70118654283704
+11
+54.20194144161178
+21
+-81.38947517981939
+31
+252.91169512421178
+12
+55.32939678279802
+22
+-80.78924059046203
+32
+255.331191165349
+13
+55.32939678279802
+23
+-80.78924059046203
+33
+255.331191165349
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.20194144161178
+20
+-81.38947517981939
+30
+252.91169512421178
+11
+53.60015530820635
+21
+-86.36019639397051
+31
+255.29194622767537
+12
+55.32939678279802
+22
+-80.78924059046203
+32
+255.331191165349
+13
+55.32939678279802
+23
+-80.78924059046203
+33
+255.331191165349
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+53.60015530820635
+20
+-86.36019639397051
+30
+255.29194622767537
+11
+54.56609795629067
+21
+-86.13872108679816
+31
+258.25265733950056
+12
+55.32939678279802
+22
+-80.78924059046203
+32
+255.331191165349
+13
+55.32939678279802
+23
+-80.78924059046203
+33
+255.331191165349
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+56.02753075931022
+20
+-69.42980859247005
+30
+249.3902985850266
+11
+56.296982242226726
+21
+-76.21279409897075
+31
+253.01543561836965
+12
+56.799469556591895
+22
+-69.57644471617537
+32
+249.94611642322084
+13
+56.799469556591895
+23
+-69.57644471617537
+33
+249.94611642322084
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+56.02753075931022
+20
+-69.42980859247005
+30
+249.3902985850266
+11
+55.56276726100199
+21
+-75.92560633802064
+31
+251.70118654283704
+12
+56.296982242226726
+22
+-76.21279409897075
+32
+253.01543561836965
+13
+56.296982242226726
+23
+-76.21279409897075
+33
+253.01543561836965
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+56.997702125484764
+20
+-69.43954377080735
+30
+249.5643148978057
+11
+56.799469556591895
+21
+-69.57644471617537
+31
+249.94611642322084
+12
+56.370148191917856
+22
+-76.34361055787785
+32
+252.56822586350094
+13
+56.370148191917856
+23
+-76.34361055787785
+33
+252.56822586350094
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+56.799469556591895
+20
+-69.57644471617537
+30
+249.94611642322084
+11
+56.296982242226726
+21
+-76.21279409897075
+31
+253.01543561836965
+12
+56.370148191917856
+22
+-76.34361055787785
+32
+252.56822586350094
+13
+56.370148191917856
+23
+-76.34361055787785
+33
+252.56822586350094
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+53.95223411726054
+20
+-70.11948513280119
+30
+247.37420399624048
+11
+53.78287243662418
+21
+-76.40506387113098
+31
+249.0255336217
+12
+56.02753075931022
+22
+-69.42980859247005
+32
+249.3902985850266
+13
+56.02753075931022
+23
+-69.42980859247005
+33
+249.3902985850266
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+53.78287243662418
+20
+-76.40506387113098
+30
+249.0255336217
+11
+55.56276726100199
+21
+-75.92560633802064
+31
+251.70118654283704
+12
+56.02753075931022
+22
+-69.42980859247005
+32
+249.3902985850266
+13
+56.02753075931022
+23
+-69.42980859247005
+33
+249.3902985850266
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.76557784490799
+20
+-62.115647417941595
+30
+246.37817356260976
+11
+56.02753075931022
+21
+-69.42980859247005
+31
+249.3902985850266
+12
+57.517925717883166
+22
+-62.76394945034043
+32
+248.9537366814658
+13
+57.517925717883166
+23
+-62.76394945034043
+33
+248.9537366814658
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.76557784490799
+20
+-62.115647417941595
+30
+246.37817356260976
+11
+53.95223411726054
+21
+-70.11948513280119
+31
+247.37420399624048
+12
+56.02753075931022
+22
+-69.42980859247005
+32
+249.3902985850266
+13
+56.02753075931022
+23
+-69.42980859247005
+33
+249.3902985850266
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.517925717883166
+20
+-62.76394945034043
+30
+248.9537366814658
+11
+56.799469556591895
+21
+-69.57644471617537
+31
+249.94611642322084
+12
+58.13464926554985
+22
+-62.97203888729987
+32
+249.144789556335
+13
+58.13464926554985
+23
+-62.97203888729987
+33
+249.144789556335
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.517925717883166
+20
+-62.76394945034043
+30
+248.9537366814658
+11
+56.02753075931022
+21
+-69.42980859247005
+31
+249.3902985850266
+12
+56.799469556591895
+22
+-69.57644471617537
+32
+249.94611642322084
+13
+56.799469556591895
+23
+-69.57644471617537
+33
+249.94611642322084
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+59.455682543486446
+20
+-56.88238061300871
+30
+251.2214247854079
+11
+58.13464926554985
+21
+-62.97203888729987
+31
+249.144789556335
+12
+60.10504936101532
+22
+-57.223111854813496
+32
+250.92511029476685
+13
+60.10504936101532
+23
+-57.223111854813496
+33
+250.92511029476685
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+59.455682543486446
+20
+-56.88238061300871
+30
+251.2214247854079
+11
+57.517925717883166
+21
+-62.76394945034043
+31
+248.9537366814658
+12
+58.13464926554985
+22
+-62.97203888729987
+32
+249.144789556335
+13
+58.13464926554985
+23
+-62.97203888729987
+33
+249.144789556335
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.74219988882828
+20
+-55.050645963984216
+30
+248.58805904517396
+11
+57.517925717883166
+21
+-62.76394945034043
+31
+248.9537366814658
+12
+59.455682543486446
+22
+-56.88238061300871
+32
+251.2214247854079
+13
+59.455682543486446
+23
+-56.88238061300871
+33
+251.2214247854079
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.74219988882828
+20
+-55.050645963984216
+30
+248.58805904517396
+11
+54.76557784490799
+21
+-62.115647417941595
+31
+246.37817356260976
+12
+57.517925717883166
+22
+-62.76394945034043
+32
+248.9537366814658
+13
+57.517925717883166
+23
+-62.76394945034043
+33
+248.9537366814658
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+59.455682543486446
+20
+-56.88238061300871
+30
+251.2214247854079
+11
+63.33274773874052
+21
+-51.51008329244746
+31
+259.1735443653517
+12
+62.053666994951136
+22
+-49.30202315582314
+32
+259.17749928155166
+13
+62.053666994951136
+23
+-49.30202315582314
+33
+259.17749928155166
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.74219988882828
+20
+-55.050645963984216
+30
+248.58805904517396
+11
+59.455682543486446
+21
+-56.88238061300871
+31
+251.2214247854079
+12
+62.053666994951136
+22
+-49.30202315582314
+32
+259.17749928155166
+13
+62.053666994951136
+23
+-49.30202315582314
+33
+259.17749928155166
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+64.60075471717121
+20
+-50.61353421244834
+30
+258.41359200639806
+11
+63.33274773874052
+21
+-51.51008329244746
+31
+259.1735443653517
+12
+60.10504936101532
+22
+-57.223111854813496
+32
+250.92511029476685
+13
+60.10504936101532
+23
+-57.223111854813496
+33
+250.92511029476685
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+63.33274773874052
+20
+-51.51008329244746
+30
+259.1735443653517
+11
+59.455682543486446
+21
+-56.88238061300871
+31
+251.2214247854079
+12
+60.10504936101532
+22
+-57.223111854813496
+32
+250.92511029476685
+13
+60.10504936101532
+23
+-57.223111854813496
+33
+250.92511029476685
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+69.20716730448137
+20
+-46.924205846944304
+30
+266.1737460385031
+11
+67.16974659065018
+21
+-48.09607793929456
+31
+266.99849817826447
+12
+64.60075471717121
+22
+-50.61353421244834
+32
+258.41359200639806
+13
+64.60075471717121
+23
+-50.61353421244834
+33
+258.41359200639806
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+67.16974659065018
+20
+-48.09607793929456
+30
+266.99849817826447
+11
+63.33274773874052
+21
+-51.51008329244746
+31
+259.1735443653517
+12
+64.60075471717121
+22
+-50.61353421244834
+32
+258.41359200639806
+13
+64.60075471717121
+23
+-50.61353421244834
+33
+258.41359200639806
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+67.16974659065018
+20
+-48.09607793929456
+30
+266.99849817826447
+11
+66.09318797870854
+21
+-47.9226700751621
+31
+268.0876212547477
+12
+63.33274773874052
+22
+-51.51008329244746
+32
+259.1735443653517
+13
+63.33274773874052
+23
+-51.51008329244746
+33
+259.1735443653517
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+63.33274773874052
+20
+-51.51008329244746
+30
+259.1735443653517
+11
+66.09318797870854
+21
+-47.9226700751621
+31
+268.0876212547477
+12
+62.053666994951136
+22
+-49.30202315582314
+32
+259.17749928155166
+13
+62.053666994951136
+23
+-49.30202315582314
+33
+259.17749928155166
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+71.62045716942848
+20
+-44.065409883339626
+30
+274.77295075355255
+11
+68.33605137788864
+21
+-44.80619610994218
+31
+275.37470646452573
+12
+70.21996049831382
+22
+-46.668657415592676
+32
+273.258826297782
+13
+70.21996049831382
+23
+-46.668657415592676
+33
+273.258826297782
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+68.33605137788864
+20
+-44.80619610994218
+30
+275.37470646452573
+11
+67.92811698312428
+21
+-47.443212542052315
+31
+273.14930554148737
+12
+70.21996049831382
+22
+-46.668657415592676
+32
+273.258826297782
+13
+70.21996049831382
+23
+-46.668657415592676
+33
+273.258826297782
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+64.1253129451243
+20
+-44.70549785901618
+30
+276.2965061633368
+11
+67.92811698312428
+21
+-47.443212542052315
+31
+273.14930554148737
+12
+68.33605137788864
+22
+-44.80619610994218
+32
+275.37470646452573
+13
+68.33605137788864
+23
+-44.80619610994218
+33
+275.37470646452573
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+64.1253129451243
+20
+-44.70549785901618
+30
+276.2965061633368
+11
+65.96690446221464
+21
+-47.44838435554419
+31
+273.7915230874248
+12
+67.92811698312428
+22
+-47.443212542052315
+32
+273.14930554148737
+13
+67.92811698312428
+23
+-47.443212542052315
+33
+273.14930554148737
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+66.23772495458483
+20
+-41.50749177521926
+30
+274.3951041443376
+11
+62.160875646390416
+21
+-41.51144669141887
+31
+274.9046798854296
+12
+68.33605137788864
+22
+-44.80619610994218
+32
+275.37470646452573
+13
+68.33605137788864
+23
+-44.80619610994218
+33
+275.37470646452573
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+62.160875646390416
+20
+-41.51144669141887
+30
+274.9046798854296
+11
+64.1253129451243
+21
+-44.70549785901618
+31
+276.2965061633368
+12
+68.33605137788864
+22
+-44.80619610994218
+32
+275.37470646452573
+13
+68.33605137788864
+23
+-44.80619610994218
+33
+275.37470646452573
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+71.62045716942848
+20
+-44.065409883339626
+30
+274.77295075355255
+11
+68.6690248994559
+21
+-41.355075389375884
+31
+273.2427024086621
+12
+66.23772495458483
+22
+-41.50749177521926
+32
+274.3951041443376
+13
+66.23772495458483
+23
+-41.50749177521926
+33
+274.3951041443376
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+66.23772495458483
+20
+-41.50749177521926
+30
+274.3951041443376
+11
+68.33605137788864
+21
+-44.80619610994218
+31
+275.37470646452573
+12
+71.62045716942848
+22
+-44.065409883339626
+32
+274.77295075355255
+13
+71.62045716942848
+23
+-44.065409883339626
+33
+274.77295075355255
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+68.06361849660631
+20
+-42.11654886994176
+30
+260.68553925086303
+11
+71.69319720506732
+21
+-43.746887017116094
+31
+272.22142135621635
+12
+69.20716730448137
+22
+-46.924205846944304
+32
+266.1737460385031
+13
+69.20716730448137
+23
+-46.924205846944304
+33
+266.1737460385031
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+69.20716730448137
+20
+-46.924205846944304
+30
+266.1737460385031
+11
+71.69319720506732
+21
+-43.746887017116094
+31
+272.22142135621635
+12
+70.73349115560535
+22
+-46.65466309673226
+32
+271.61145158852025
+13
+70.73349115560535
+23
+-46.65466309673226
+33
+271.61145158852025
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+70.73349115560535
+20
+-46.65466309673226
+30
+271.61145158852025
+11
+71.69319720506732
+21
+-43.746887017116094
+31
+272.22142135621635
+12
+71.62045716942848
+22
+-44.065409883339626
+32
+274.77295075355255
+13
+71.62045716942848
+23
+-44.065409883339626
+33
+274.77295075355255
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+70.73349115560535
+20
+-46.65466309673226
+30
+271.61145158852025
+11
+71.62045716942848
+21
+-44.065409883339626
+31
+274.77295075355255
+12
+70.21996049831382
+22
+-46.668657415592676
+32
+273.258826297782
+13
+70.21996049831382
+23
+-46.668657415592676
+33
+273.258826297782
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+68.06361849660631
+20
+-42.11654886994176
+30
+260.68553925086303
+11
+66.3324908312118
+21
+-39.515126683627
+31
+261.69891047090994
+12
+68.79488250189755
+22
+-40.670266438212444
+32
+271.612364261491
+13
+68.79488250189755
+23
+-40.670266438212444
+33
+271.612364261491
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+68.06361849660631
+20
+-42.11654886994176
+30
+260.68553925086303
+11
+68.79488250189755
+21
+-40.670266438212444
+31
+271.612364261491
+12
+71.69319720506732
+22
+-43.746887017116094
+32
+272.22142135621635
+13
+71.69319720506732
+23
+-43.746887017116094
+33
+272.22142135621635
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+71.69319720506732
+20
+-43.746887017116094
+30
+272.22142135621635
+11
+68.79488250189755
+21
+-40.670266438212444
+31
+271.612364261491
+12
+68.6690248994559
+22
+-41.355075389375884
+32
+273.2427024086621
+13
+68.6690248994559
+23
+-41.355075389375884
+33
+273.2427024086621
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+71.69319720506732
+20
+-43.746887017116094
+30
+272.22142135621635
+11
+68.6690248994559
+21
+-41.355075389375884
+31
+273.2427024086621
+12
+71.62045716942848
+22
+-44.065409883339626
+32
+274.77295075355255
+13
+71.62045716942848
+23
+-44.065409883339626
+33
+274.77295075355255
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+68.1290267260599
+20
+-48.00359374509165
+30
+271.7614341797787
+11
+66.09318797870854
+21
+-47.9226700751621
+31
+268.0876212547477
+12
+67.16974659065018
+22
+-48.09607793929456
+32
+266.99849817826447
+13
+67.16974659065018
+23
+-48.09607793929456
+33
+266.99849817826447
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+68.1290267260599
+20
+-48.00359374509165
+30
+271.7614341797787
+11
+66.25968995070832
+21
+-48.53263984285825
+31
+271.9689151680918
+12
+66.09318797870854
+22
+-47.9226700751621
+32
+268.0876212547477
+13
+66.09318797870854
+23
+-47.9226700751621
+33
+268.0876212547477
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+68.1290267260599
+20
+-48.00359374509165
+30
+271.7614341797787
+11
+67.92811698312428
+21
+-47.443212542052315
+31
+273.14930554148737
+12
+66.25968995070832
+22
+-48.53263984285825
+32
+271.9689151680918
+13
+66.25968995070832
+23
+-48.53263984285825
+33
+271.9689151680918
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+67.92811698312428
+20
+-47.443212542052315
+30
+273.14930554148737
+11
+65.96690446221464
+21
+-47.44838435554419
+31
+273.7915230874248
+12
+66.25968995070832
+22
+-48.53263984285825
+32
+271.9689151680918
+13
+66.25968995070832
+23
+-48.53263984285825
+33
+271.9689151680918
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+70.73349115560535
+20
+-46.65466309673226
+30
+271.61145158852025
+11
+67.16974659065018
+21
+-48.09607793929456
+31
+266.99849817826447
+12
+69.20716730448137
+22
+-46.924205846944304
+32
+266.1737460385031
+13
+69.20716730448137
+23
+-46.924205846944304
+33
+266.1737460385031
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+70.73349115560535
+20
+-46.65466309673226
+30
+271.61145158852025
+11
+68.1290267260599
+21
+-48.00359374509165
+31
+271.7614341797787
+12
+67.16974659065018
+22
+-48.09607793929456
+32
+266.99849817826447
+13
+67.16974659065018
+23
+-48.09607793929456
+33
+266.99849817826447
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+5.509743331496922
+20
+-134.86998159996617
+30
+160.539181669026
+11
+7.389241199238043
+21
+-139.7111032525021
+31
+162.1693372816024
+12
+0.020623870886214313
+22
+-141.1729011247095
+32
+162.86750168054644
+13
+0.020623870886214313
+23
+-141.1729011247095
+33
+162.86750168054644
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+5.509743331496922
+20
+-134.86998159996617
+30
+160.539181669026
+11
+0.020623870886214313
+21
+-141.1729011247095
+31
+162.86750168054644
+12
+0.020623870886214313
+22
+-135.82524597431177
+32
+160.4884066295105
+13
+0.020623870886214313
+23
+-135.82524597431177
+33
+160.4884066295105
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+11.549508816810029
+20
+-130.8651726114679
+30
+161.52416875973364
+11
+14.017376525310505
+21
+-135.95149906837372
+31
+161.9434811441785
+12
+7.389241199238043
+22
+-139.7111032525021
+32
+162.1693372816024
+13
+7.389241199238043
+23
+-139.7111032525021
+33
+162.1693372816024
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+11.549508816810029
+20
+-130.8651726114679
+30
+161.52416875973364
+11
+7.389241199238043
+21
+-139.7111032525021
+31
+162.1693372816024
+12
+5.509743331496922
+22
+-134.86998159996617
+32
+160.539181669026
+13
+5.509743331496922
+23
+-134.86998159996617
+33
+160.539181669026
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+22.13955750183241
+20
+-120.67700425718222
+30
+164.867807026972
+11
+26.889411857455926
+21
+-123.75301638744043
+31
+167.43424341613664
+12
+19.901683381550185
+22
+-131.77389066438886
+32
+163.41261082257205
+13
+19.901683381550185
+23
+-131.77389066438886
+33
+163.41261082257205
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+22.13955750183241
+20
+-120.67700425718222
+30
+164.867807026972
+11
+19.901683381550185
+21
+-131.77389066438886
+31
+163.41261082257205
+12
+15.77944380435818
+22
+-127.91632624824135
+32
+162.18342286776223
+13
+15.77944380435818
+23
+-127.91632624824135
+33
+162.18342286776223
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+15.77944380435818
+20
+-127.91632624824135
+30
+162.18342286776223
+11
+19.901683381550185
+21
+-131.77389066438886
+31
+163.41261082257205
+12
+14.017376525310505
+22
+-135.95149906837372
+32
+161.9434811441785
+13
+14.017376525310505
+23
+-135.95149906837372
+33
+161.9434811441785
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+15.77944380435818
+20
+-127.91632624824135
+30
+162.18342286776223
+11
+14.017376525310505
+21
+-135.95149906837372
+31
+161.9434811441785
+12
+11.549508816810029
+22
+-130.8651726114679
+32
+161.52416875973364
+13
+11.549508816810029
+23
+-130.8651726114679
+33
+161.52416875973364
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+7.8763043404250785
+20
+-141.25565014057725
+30
+166.21080530102685
+11
+0.020623870886214313
+21
+-142.56472740261827
+31
+165.9472861924093
+12
+0.020623870886214313
+22
+-141.1729011247095
+32
+162.86750168054644
+13
+0.020623870886214313
+23
+-141.1729011247095
+33
+162.86750168054644
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+7.8763043404250785
+20
+-141.25565014057725
+30
+166.21080530102685
+11
+0.020623870886214313
+21
+-141.1729011247095
+31
+162.86750168054644
+12
+7.389241199238043
+22
+-139.7111032525021
+32
+162.1693372816024
+13
+7.389241199238043
+23
+-139.7111032525021
+33
+162.1693372816024
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+19.901683381550185
+20
+-131.77389066438886
+30
+163.41261082257205
+11
+27.93168438819096
+21
+-123.31706293252525
+31
+172.39355621817344
+12
+20.91140390971993
+22
+-131.6710628432026
+32
+168.38345372645168
+13
+20.91140390971993
+23
+-131.6710628432026
+33
+168.38345372645168
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+19.901683381550185
+20
+-131.77389066438886
+30
+163.41261082257205
+11
+26.889411857455926
+21
+-123.75301638744043
+31
+167.43424341613664
+12
+27.93168438819096
+22
+-123.31706293252525
+32
+172.39355621817344
+13
+27.93168438819096
+23
+-123.31706293252525
+33
+172.39355621817344
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+14.017376525310505
+20
+-135.95149906837372
+30
+161.9434811441785
+11
+20.91140390971993
+21
+-131.6710628432026
+31
+168.38345372645168
+12
+15.550667113432105
+22
+-136.67372761127191
+32
+166.23712070497103
+13
+15.550667113432105
+23
+-136.67372761127191
+33
+166.23712070497103
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+20.91140390971993
+20
+-131.6710628432026
+30
+168.38345372645168
+11
+14.017376525310505
+21
+-135.95149906837372
+31
+161.9434811441785
+12
+19.901683381550185
+22
+-131.77389066438886
+32
+163.41261082257205
+13
+19.901683381550185
+23
+-131.77389066438886
+33
+163.41261082257205
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+14.017376525310505
+20
+-135.95149906837372
+30
+161.9434811441785
+11
+7.8763043404250785
+21
+-141.25565014057725
+31
+166.21080530102685
+12
+7.389241199238043
+22
+-139.7111032525021
+32
+162.1693372816024
+13
+7.389241199238043
+23
+-139.7111032525021
+33
+162.1693372816024
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+15.550667113432105
+20
+-136.67372761127191
+30
+166.23712070497103
+11
+7.8763043404250785
+21
+-141.25565014057725
+31
+166.21080530102685
+12
+14.017376525310505
+22
+-135.95149906837372
+32
+161.9434811441785
+13
+14.017376525310505
+23
+-135.95149906837372
+33
+161.9434811441785
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+37.872214143522946
+20
+-74.26514998286021
+30
+220.17928753537106
+11
+37.01491000119623
+21
+-82.01769840688767
+31
+216.84590162781944
+12
+40.813454898673655
+22
+-78.1704776177246
+32
+219.8196943855366
+13
+40.813454898673655
+23
+-78.1704776177246
+33
+219.8196943855366
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+37.872214143522946
+20
+-74.26514998286021
+30
+220.17928753537106
+11
+33.30124368984699
+21
+-78.99492553316206
+31
+216.11910972007792
+12
+37.01491000119623
+22
+-82.01769840688767
+32
+216.84590162781944
+13
+37.01491000119623
+23
+-82.01769840688767
+33
+216.84590162781944
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+40.813454898673655
+20
+-78.1704776177246
+30
+219.8196943855366
+11
+43.25181284783925
+21
+-86.89045938901923
+31
+216.45588604568107
+12
+44.19369135197109
+22
+-82.88504195187559
+32
+219.6660611024001
+13
+44.19369135197109
+23
+-82.88504195187559
+33
+219.6660611024001
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+40.813454898673655
+20
+-78.1704776177246
+30
+219.8196943855366
+11
+37.01491000119623
+21
+-82.01769840688767
+31
+216.84590162781944
+12
+43.25181284783925
+22
+-86.89045938901923
+32
+216.45588604568107
+13
+43.25181284783925
+23
+-86.89045938901923
+33
+216.45588604568107
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+44.19369135197109
+20
+-82.88504195187559
+30
+219.6660611024001
+11
+47.110594161278605
+21
+-85.36447018465192
+31
+222.0241038302827
+12
+46.62505214170677
+22
+-83.39157544973789
+32
+222.9529006885239
+13
+46.62505214170677
+23
+-83.39157544973789
+33
+222.9529006885239
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+43.25181284783925
+20
+-86.89045938901923
+30
+216.45588604568107
+11
+47.110594161278605
+21
+-85.36447018465192
+31
+222.0241038302827
+12
+44.19369135197109
+22
+-82.88504195187559
+32
+219.6660611024001
+13
+44.19369135197109
+23
+-82.88504195187559
+33
+219.6660611024001
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+47.110594161278605
+20
+-85.36447018465192
+30
+222.0241038302827
+11
+48.570292885656826
+21
+-85.31062247947516
+31
+226.62032490277062
+12
+47.90370697144388
+22
+-83.52391303026144
+32
+226.87191841792557
+13
+47.90370697144388
+23
+-83.52391303026144
+33
+226.87191841792557
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+47.110594161278605
+20
+-85.36447018465192
+30
+222.0241038302827
+11
+47.90370697144388
+21
+-83.52391303026144
+31
+226.87191841792557
+12
+46.62505214170677
+22
+-83.39157544973789
+32
+222.9529006885239
+13
+46.62505214170677
+23
+-83.39157544973789
+33
+222.9529006885239
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+48.570292885656826
+20
+-85.31062247947516
+30
+226.62032490277062
+11
+49.78217047648666
+21
+-87.03770396137548
+31
+235.49759064907778
+12
+49.35975500394562
+22
+-85.34226180907366
+32
+235.6919899915006
+13
+49.35975500394562
+23
+-85.34226180907366
+33
+235.6919899915006
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+48.570292885656826
+20
+-85.31062247947516
+30
+226.62032490277062
+11
+49.35975500394562
+21
+-85.34226180907366
+31
+235.6919899915006
+12
+47.90370697144388
+22
+-83.52391303026144
+32
+226.87191841792557
+13
+47.90370697144388
+23
+-83.52391303026144
+33
+226.87191841792557
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+49.78217047648666
+20
+-87.03770396137548
+30
+235.49759064907778
+11
+50.60302854491319
+21
+-90.10458936194372
+31
+243.20055050844974
+12
+50.52718542117932
+22
+-88.53418340641151
+32
+244.11596149647752
+13
+50.52718542117932
+23
+-88.53418340641151
+33
+244.11596149647752
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+49.78217047648666
+20
+-87.03770396137548
+30
+235.49759064907778
+11
+50.52718542117932
+21
+-88.53418340641151
+31
+244.11596149647752
+12
+49.35975500394562
+22
+-85.34226180907366
+32
+235.6919899915006
+13
+49.35975500394562
+23
+-85.34226180907366
+33
+235.6919899915006
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+50.60302854491319
+20
+-90.10458936194372
+30
+243.20055050844974
+11
+52.03236568185201
+21
+-92.4647616600907
+31
+253.44743415708209
+12
+52.06826415197074
+22
+-90.44957974427355
+32
+252.763842103212
+13
+52.06826415197074
+23
+-90.44957974427355
+33
+252.763842103212
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+50.60302854491319
+20
+-90.10458936194372
+30
+243.20055050844974
+11
+52.06826415197074
+21
+-90.44957974427355
+31
+252.763842103212
+12
+50.52718542117932
+22
+-88.53418340641151
+32
+244.11596149647752
+13
+50.52718542117932
+23
+-88.53418340641151
+33
+244.11596149647752
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+52.50409591715784
+20
+-93.1517001815152
+30
+254.23811317266293
+11
+53.79987857628211
+21
+-91.56547456118574
+31
+258.52493810862023
+12
+53.114491598905296
+22
+-91.13165067653043
+32
+257.44555021047427
+13
+53.114491598905296
+23
+-91.13165067653043
+33
+257.44555021047427
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+52.03236568185201
+20
+-92.4647616600907
+30
+253.44743415708209
+11
+52.50409591715784
+21
+-93.1517001815152
+31
+254.23811317266293
+12
+53.114491598905296
+22
+-91.13165067653043
+32
+257.44555021047427
+13
+53.114491598905296
+23
+-91.13165067653043
+33
+257.44555021047427
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+52.03236568185201
+20
+-92.4647616600907
+30
+253.44743415708209
+11
+53.114491598905296
+21
+-91.13165067653043
+31
+257.44555021047427
+12
+52.86204625564672
+22
+-89.34068208679341
+32
+255.21497747394545
+13
+52.86204625564672
+23
+-89.34068208679341
+33
+255.21497747394545
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+52.06826415197074
+20
+-90.44957974427355
+30
+252.763842103212
+11
+52.03236568185201
+21
+-92.4647616600907
+31
+253.44743415708209
+12
+52.86204625564672
+22
+-89.34068208679341
+32
+255.21497747394545
+13
+52.86204625564672
+23
+-89.34068208679341
+33
+255.21497747394545
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+53.114491598905296
+20
+-91.13165067653043
+30
+257.44555021047427
+11
+55.1270267631118
+21
+-86.13872108679843
+31
+259.2572060541786
+12
+54.56609795629067
+22
+-86.13872108679816
+32
+258.25265733950056
+13
+54.56609795629067
+23
+-86.13872108679816
+33
+258.25265733950056
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+53.114491598905296
+20
+-91.13165067653043
+30
+257.44555021047427
+11
+53.79987857628211
+21
+-91.56547456118574
+31
+258.52493810862023
+12
+55.1270267631118
+22
+-86.13872108679843
+32
+259.2572060541786
+13
+55.1270267631118
+23
+-86.13872108679843
+33
+259.2572060541786
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+52.86204625564672
+20
+-89.34068208679341
+30
+255.21497747394545
+11
+54.56609795629067
+21
+-86.13872108679816
+31
+258.25265733950056
+12
+53.60015530820635
+22
+-86.36019639397051
+32
+255.29194622767537
+13
+53.60015530820635
+23
+-86.36019639397051
+33
+255.29194622767537
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+52.86204625564672
+20
+-89.34068208679341
+30
+255.21497747394545
+11
+53.114491598905296
+21
+-91.13165067653043
+31
+257.44555021047427
+12
+54.56609795629067
+22
+-86.13872108679816
+32
+258.25265733950056
+13
+54.56609795629067
+23
+-86.13872108679816
+33
+258.25265733950056
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+56.370148191917856
+20
+-76.34361055787785
+30
+252.56822586350094
+11
+56.296982242226726
+21
+-76.21279409897075
+31
+253.01543561836965
+12
+55.97821599654543
+22
+-80.30491546818251
+32
+255.7409813284841
+13
+55.97821599654543
+23
+-80.30491546818251
+33
+255.7409813284841
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+56.370148191917856
+20
+-76.34361055787785
+30
+252.56822586350094
+11
+55.97821599654543
+21
+-80.30491546818251
+31
+255.7409813284841
+12
+55.931639252687994
+22
+-80.39679121374046
+32
+255.24174921437523
+13
+55.931639252687994
+23
+-80.39679121374046
+33
+255.24174921437523
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.931639252687994
+20
+-80.39679121374046
+30
+255.24174921437523
+11
+55.97821599654543
+21
+-80.30491546818251
+31
+255.7409813284841
+12
+55.1270267631118
+22
+-86.13872108679843
+32
+259.2572060541786
+13
+55.1270267631118
+23
+-86.13872108679843
+33
+259.2572060541786
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.931639252687994
+20
+-80.39679121374046
+30
+255.24174921437523
+11
+55.1270267631118
+21
+-86.13872108679843
+31
+259.2572060541786
+12
+55.27071191088361
+22
+-86.12716056252286
+32
+258.9046100637755
+13
+55.27071191088361
+23
+-86.12716056252286
+33
+258.9046100637755
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.32939678279802
+20
+-80.78924059046203
+30
+255.331191165349
+11
+54.56609795629067
+21
+-86.13872108679816
+31
+258.25265733950056
+12
+55.97821599654543
+22
+-80.30491546818251
+32
+255.7409813284841
+13
+55.97821599654543
+23
+-80.30491546818251
+33
+255.7409813284841
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.97821599654543
+20
+-80.30491546818251
+30
+255.7409813284841
+11
+54.56609795629067
+21
+-86.13872108679816
+31
+258.25265733950056
+12
+55.1270267631118
+22
+-86.13872108679843
+32
+259.2572060541786
+13
+55.1270267631118
+23
+-86.13872108679843
+33
+259.2572060541786
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.56276726100199
+20
+-75.92560633802064
+30
+251.70118654283704
+11
+55.32939678279802
+21
+-80.78924059046203
+31
+255.331191165349
+12
+56.296982242226726
+22
+-76.21279409897075
+32
+253.01543561836965
+13
+56.296982242226726
+23
+-76.21279409897075
+33
+253.01543561836965
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+56.296982242226726
+20
+-76.21279409897075
+30
+253.01543561836965
+11
+55.32939678279802
+21
+-80.78924059046203
+31
+255.331191165349
+12
+55.97821599654543
+22
+-80.30491546818251
+32
+255.7409813284841
+13
+55.97821599654543
+23
+-80.30491546818251
+33
+255.7409813284841
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+53.78287243662418
+20
+-76.40506387113098
+30
+249.0255336217
+11
+54.20194144161178
+21
+-81.38947517981939
+31
+252.91169512421178
+12
+55.56276726100199
+22
+-75.92560633802064
+32
+251.70118654283704
+13
+55.56276726100199
+23
+-75.92560633802064
+33
+251.70118654283704
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+40.813454898673655
+20
+-78.1704776177246
+30
+219.8196943855366
+11
+42.780873595773336
+21
+-77.9277066079393
+31
+222.34810273432214
+12
+41.02489080318645
+22
+-72.15383318096379
+32
+224.50566163332334
+13
+41.02489080318645
+23
+-72.15383318096379
+33
+224.50566163332334
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+41.02489080318645
+20
+-72.15383318096379
+30
+224.50566163332334
+11
+37.872214143522946
+21
+-74.26514998286021
+31
+220.17928753537106
+12
+40.813454898673655
+22
+-78.1704776177246
+32
+219.8196943855366
+13
+40.813454898673655
+23
+-78.1704776177246
+33
+219.8196943855366
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+42.780873595773336
+20
+-77.9277066079393
+30
+222.34810273432214
+11
+44.87515383558069
+21
+-77.70562285212102
+31
+225.8570260762656
+12
+44.42307649154324
+22
+-72.35918459901694
+32
+228.97106624690431
+13
+44.42307649154324
+23
+-72.35918459901694
+33
+228.97106624690431
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+42.780873595773336
+20
+-77.9277066079393
+30
+222.34810273432214
+11
+44.42307649154324
+21
+-72.35918459901694
+31
+228.97106624690431
+12
+41.02489080318645
+22
+-72.15383318096379
+32
+224.50566163332334
+13
+41.02489080318645
+23
+-72.15383318096379
+33
+224.50566163332334
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+44.87515383558069
+20
+-77.70562285212102
+30
+225.8570260762656
+11
+48.40141796393732
+21
+-79.6471824817644
+31
+234.10393902523313
+12
+48.71720281125284
+22
+-73.5118905590175
+32
+237.16017657449487
+13
+48.71720281125284
+23
+-73.5118905590175
+33
+237.16017657449487
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+44.87515383558069
+20
+-77.70562285212102
+30
+225.8570260762656
+11
+48.71720281125284
+21
+-73.5118905590175
+31
+237.16017657449487
+12
+44.42307649154324
+22
+-72.35918459901694
+32
+228.97106624690431
+13
+44.42307649154324
+23
+-72.35918459901694
+33
+228.97106624690431
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+48.71720281125284
+20
+-73.5118905590175
+30
+237.16017657449487
+11
+50.32460244446698
+21
+-82.52301500746384
+31
+242.6931043376206
+12
+51.32729539077451
+22
+-75.75006890362467
+32
+244.26411874180098
+13
+51.32729539077451
+23
+-75.75006890362467
+33
+244.26411874180098
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+48.40141796393732
+20
+-79.6471824817644
+30
+234.10393902523313
+11
+50.32460244446698
+21
+-82.52301500746384
+31
+242.6931043376206
+12
+48.71720281125284
+22
+-73.5118905590175
+32
+237.16017657449487
+13
+48.71720281125284
+23
+-73.5118905590175
+33
+237.16017657449487
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+41.02489080318645
+20
+-72.15383318096379
+30
+224.50566163332334
+11
+44.42307649154324
+21
+-72.35918459901694
+31
+228.97106624690431
+12
+45.34670153629273
+22
+-68.57615514201476
+32
+229.82624081897083
+13
+45.34670153629273
+23
+-68.57615514201476
+33
+229.82624081897083
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+41.02489080318645
+20
+-72.15383318096379
+30
+224.50566163332334
+11
+45.34670153629273
+21
+-68.57615514201476
+31
+229.82624081897083
+12
+42.064121090691124
+22
+-69.72064704529011
+32
+225.29451530296657
+13
+42.064121090691124
+23
+-69.72064704529011
+33
+225.29451530296657
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+49.00831506596982
+20
+-69.61051784035284
+30
+237.9773231061813
+11
+51.32729539077451
+21
+-75.75006890362467
+31
+244.26411874180098
+12
+52.06704725467858
+22
+-70.84658126486609
+32
+244.5522191757214
+13
+52.06704725467858
+23
+-70.84658126486609
+33
+244.5522191757214
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+48.71720281125284
+20
+-73.5118905590175
+30
+237.16017657449487
+11
+51.32729539077451
+21
+-75.75006890362467
+31
+244.26411874180098
+12
+49.00831506596982
+22
+-69.61051784035284
+32
+237.9773231061813
+13
+49.00831506596982
+23
+-69.61051784035284
+33
+237.9773231061813
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+44.42307649154324
+20
+-72.35918459901694
+30
+228.97106624690431
+11
+48.71720281125284
+21
+-73.5118905590175
+31
+237.16017657449487
+12
+49.00831506596982
+22
+-69.61051784035284
+32
+237.9773231061813
+13
+49.00831506596982
+23
+-69.61051784035284
+33
+237.9773231061813
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+44.42307649154324
+20
+-72.35918459901694
+30
+228.97106624690431
+11
+49.00831506596982
+21
+-69.61051784035284
+31
+237.9773231061813
+12
+45.34670153629273
+22
+-68.57615514201476
+32
+229.82624081897083
+13
+45.34670153629273
+23
+-68.57615514201476
+33
+229.82624081897083
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+47.2867400443188
+20
+-63.0471822950856
+30
+228.6939178886174
+11
+49.00831506596982
+21
+-69.61051784035284
+31
+237.9773231061813
+12
+49.3146993817034
+22
+-62.40161828159674
+32
+237.072255745139
+13
+49.3146993817034
+23
+-62.40161828159674
+33
+237.072255745139
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+47.2867400443188
+20
+-63.0471822950856
+30
+228.6939178886174
+11
+45.34670153629273
+21
+-68.57615514201476
+31
+229.82624081897083
+12
+49.00831506596982
+22
+-69.61051784035284
+32
+237.9773231061813
+13
+49.00831506596982
+23
+-69.61051784035284
+33
+237.9773231061813
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+49.3146993817034
+20
+-62.40161828159674
+30
+237.072255745139
+11
+52.06704725467858
+21
+-70.84658126486609
+31
+244.5522191757214
+12
+52.57023428498674
+22
+-62.04263358041116
+32
+243.18686041392004
+13
+52.57023428498674
+23
+-62.04263358041116
+33
+243.18686041392004
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+49.3146993817034
+20
+-62.40161828159674
+30
+237.072255745139
+11
+49.00831506596982
+21
+-69.61051784035284
+31
+237.9773231061813
+12
+52.06704725467858
+22
+-70.84658126486609
+32
+244.5522191757214
+13
+52.06704725467858
+23
+-70.84658126486609
+33
+244.5522191757214
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+44.79118792242165
+20
+-65.30483099636383
+30
+223.59298866420505
+11
+45.34670153629273
+21
+-68.57615514201476
+31
+229.82624081897083
+12
+47.2867400443188
+22
+-63.0471822950856
+32
+228.6939178886174
+13
+47.2867400443188
+23
+-63.0471822950856
+33
+228.6939178886174
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+44.79118792242165
+20
+-65.30483099636383
+30
+223.59298866420505
+11
+42.064121090691124
+21
+-69.72064704529011
+31
+225.29451530296657
+12
+45.34670153629273
+22
+-68.57615514201476
+32
+229.82624081897083
+13
+45.34670153629273
+23
+-68.57615514201476
+33
+229.82624081897083
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+47.21828957163477
+20
+-62.21847523912291
+30
+222.4262883853474
+11
+47.2867400443188
+21
+-63.0471822950856
+31
+228.6939178886174
+12
+48.67622379493939
+22
+-59.91914780558837
+32
+229.4173633288069
+13
+48.67622379493939
+23
+-59.91914780558837
+33
+229.4173633288069
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+47.21828957163477
+20
+-62.21847523912291
+30
+222.4262883853474
+11
+44.79118792242165
+21
+-65.30483099636383
+31
+223.59298866420505
+12
+47.2867400443188
+22
+-63.0471822950856
+32
+228.6939178886174
+13
+47.2867400443188
+23
+-63.0471822950856
+33
+228.6939178886174
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+51.4853399265938
+20
+-59.441211394094125
+30
+235.47781606808715
+11
+52.57023428498674
+21
+-62.04263358041116
+31
+243.18686041392004
+12
+55.93936655049322
+22
+-54.56479972008862
+32
+245.14849884888397
+13
+55.93936655049322
+23
+-54.56479972008862
+33
+245.14849884888397
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+51.4853399265938
+20
+-59.441211394094125
+30
+235.47781606808715
+11
+49.3146993817034
+21
+-62.40161828159674
+31
+237.072255745139
+12
+52.57023428498674
+22
+-62.04263358041116
+32
+243.18686041392004
+13
+52.57023428498674
+23
+-62.04263358041116
+33
+243.18686041392004
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+48.67622379493939
+20
+-59.91914780558837
+30
+229.4173633288069
+11
+49.3146993817034
+21
+-62.40161828159674
+31
+237.072255745139
+12
+51.4853399265938
+22
+-59.441211394094125
+32
+235.47781606808715
+13
+51.4853399265938
+23
+-59.441211394094125
+33
+235.47781606808715
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+47.2867400443188
+20
+-63.0471822950856
+30
+228.6939178886174
+11
+49.3146993817034
+21
+-62.40161828159674
+31
+237.072255745139
+12
+48.67622379493939
+22
+-59.91914780558837
+32
+229.4173633288069
+13
+48.67622379493939
+23
+-59.91914780558837
+33
+229.4173633288069
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+51.55996615303551
+20
+-56.6107082925276
+30
+226.24065294762437
+11
+51.4853399265938
+21
+-59.441211394094125
+31
+235.47781606808715
+12
+54.192662599759075
+22
+-55.64327494526256
+32
+234.69291731464506
+13
+54.192662599759075
+23
+-55.64327494526256
+33
+234.69291731464506
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+51.55996615303551
+20
+-56.6107082925276
+30
+226.24065294762437
+11
+48.67622379493939
+21
+-59.91914780558837
+31
+229.4173633288069
+12
+51.4853399265938
+22
+-59.441211394094125
+32
+235.47781606808715
+13
+51.4853399265938
+23
+-59.441211394094125
+33
+235.47781606808715
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+51.55996615303551
+20
+-56.6107082925276
+30
+226.24065294762437
+11
+50.189253043146486
+21
+-56.70684317860679
+31
+220.19906211637309
+12
+48.67622379493939
+22
+-59.91914780558837
+32
+229.4173633288069
+13
+48.67622379493939
+23
+-59.91914780558837
+33
+229.4173633288069
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+50.189253043146486
+20
+-56.70684317860679
+30
+220.19906211637309
+11
+47.21828957163477
+21
+-62.21847523912291
+31
+222.4262883853474
+12
+48.67622379493939
+22
+-59.91914780558837
+32
+229.4173633288069
+13
+48.67622379493939
+23
+-59.91914780558837
+33
+229.4173633288069
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+52.82891622686765
+20
+-49.93055060721156
+30
+211.1827658544384
+11
+50.189253043146486
+21
+-56.70684317860679
+31
+220.19906211637309
+12
+55.01589361790529
+22
+-46.23179128769331
+32
+219.90457297167282
+13
+55.01589361790529
+23
+-46.23179128769331
+33
+219.90457297167282
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.01589361790529
+20
+-46.23179128769331
+30
+219.90457297167282
+11
+50.189253043146486
+21
+-56.70684317860679
+31
+220.19906211637309
+12
+51.55996615303551
+22
+-56.6107082925276
+32
+226.24065294762437
+13
+51.55996615303551
+23
+-56.6107082925276
+33
+226.24065294762437
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.01589361790529
+20
+-46.23179128769331
+30
+219.90457297167282
+11
+51.55996615303551
+21
+-56.6107082925276
+31
+226.24065294762437
+12
+57.13986615164136
+22
+-43.986007335015955
+32
+235.05220624015817
+13
+57.13986615164136
+23
+-43.986007335015955
+33
+235.05220624015817
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+51.55996615303551
+20
+-56.6107082925276
+30
+226.24065294762437
+11
+54.192662599759075
+21
+-55.64327494526256
+31
+234.69291731464506
+12
+57.13986615164136
+22
+-43.986007335015955
+32
+235.05220624015817
+13
+57.13986615164136
+23
+-43.986007335015955
+33
+235.05220624015817
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.192662599759075
+20
+-55.64327494526256
+30
+234.69291731464506
+11
+55.93936655049322
+21
+-54.56479972008862
+31
+245.14849884888397
+12
+56.880362804088236
+22
+-51.01298074859614
+32
+243.88627213259153
+13
+56.880362804088236
+23
+-51.01298074859614
+33
+243.88627213259153
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.192662599759075
+20
+-55.64327494526256
+30
+234.69291731464506
+11
+51.4853399265938
+21
+-59.441211394094125
+31
+235.47781606808715
+12
+55.93936655049322
+22
+-54.56479972008862
+32
+245.14849884888397
+13
+55.93936655049322
+23
+-54.56479972008862
+33
+245.14849884888397
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.192662599759075
+20
+-55.64327494526256
+30
+234.69291731464506
+11
+60.09716995104859
+21
+-41.32465295706602
+31
+250.62849157980665
+12
+57.13986615164136
+22
+-43.986007335015955
+32
+235.05220624015817
+13
+57.13986615164136
+23
+-43.986007335015955
+33
+235.05220624015817
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.192662599759075
+20
+-55.64327494526256
+30
+234.69291731464506
+11
+56.880362804088236
+21
+-51.01298074859614
+31
+243.88627213259153
+12
+60.09716995104859
+22
+-41.32465295706602
+32
+250.62849157980665
+13
+60.09716995104859
+23
+-41.32465295706602
+33
+250.62849157980665
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+66.25968995070832
+20
+-48.53263984285825
+30
+271.9689151680918
+11
+61.111879758116196
+21
+-46.79947387449948
+31
+272.35558428267603
+12
+62.34919050235217
+22
+-45.49313463136459
+32
+267.84332912334725
+13
+62.34919050235217
+23
+-45.49313463136459
+33
+267.84332912334725
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+66.25968995070832
+20
+-48.53263984285825
+30
+271.9689151680918
+11
+62.34919050235217
+21
+-45.49313463136459
+31
+267.84332912334725
+12
+66.09318797870854
+22
+-47.9226700751621
+32
+268.0876212547477
+13
+66.09318797870854
+23
+-47.9226700751621
+33
+268.0876212547477
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+65.96690446221464
+20
+-47.44838435554419
+30
+273.7915230874248
+11
+60.894389789574895
+21
+-46.9254227442386
+31
+274.40849001455007
+12
+61.111879758116196
+22
+-46.79947387449948
+32
+272.35558428267603
+13
+61.111879758116196
+23
+-46.79947387449948
+33
+272.35558428267603
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+66.25968995070832
+20
+-48.53263984285825
+30
+271.9689151680918
+11
+65.96690446221464
+21
+-47.44838435554419
+31
+273.7915230874248
+12
+61.111879758116196
+22
+-46.79947387449948
+32
+272.35558428267603
+13
+61.111879758116196
+23
+-46.79947387449948
+33
+272.35558428267603
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+59.97584529102023
+20
+-44.3407328956913
+30
+276.59373332694685
+11
+60.894389789574895
+21
+-46.9254227442386
+31
+274.40849001455007
+12
+64.1253129451243
+22
+-44.70549785901618
+32
+276.2965061633368
+13
+64.1253129451243
+23
+-44.70549785901618
+33
+276.2965061633368
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+64.1253129451243
+20
+-44.70549785901618
+30
+276.2965061633368
+11
+60.894389789574895
+21
+-46.9254227442386
+31
+274.40849001455007
+12
+65.96690446221464
+22
+-47.44838435554419
+32
+273.7915230874248
+13
+65.96690446221464
+23
+-47.44838435554419
+33
+273.7915230874248
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+59.97584529102023
+20
+-44.3407328956913
+30
+276.59373332694685
+11
+54.49198891119811
+21
+-43.793129114219035
+31
+275.5186045693237
+12
+55.11866059422821
+22
+-44.74900193721024
+32
+273.536583104718
+13
+55.11866059422821
+23
+-44.74900193721024
+33
+273.536583104718
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+60.894389789574895
+20
+-46.9254227442386
+30
+274.40849001455007
+11
+59.97584529102023
+21
+-44.3407328956913
+31
+276.59373332694685
+12
+55.11866059422821
+22
+-44.74900193721024
+32
+273.536583104718
+13
+55.11866059422821
+23
+-44.74900193721024
+33
+273.536583104718
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+70.73349115560535
+20
+-46.65466309673226
+30
+271.61145158852025
+11
+70.21996049831382
+21
+-46.668657415592676
+31
+273.258826297782
+12
+68.1290267260599
+22
+-48.00359374509165
+32
+271.7614341797787
+13
+68.1290267260599
+23
+-48.00359374509165
+33
+271.7614341797787
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+70.21996049831382
+20
+-46.668657415592676
+30
+273.258826297782
+11
+67.92811698312428
+21
+-47.443212542052315
+31
+273.14930554148737
+12
+68.1290267260599
+22
+-48.00359374509165
+32
+271.7614341797787
+13
+68.1290267260599
+23
+-48.00359374509165
+33
+271.7614341797787
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+68.79488250189755
+20
+-40.670266438212444
+30
+271.612364261491
+11
+65.97831287432865
+21
+-39.732647074603115
+31
+271.4435197622041
+12
+68.6690248994559
+22
+-41.355075389375884
+32
+273.2427024086621
+13
+68.6690248994559
+23
+-41.355075389375884
+33
+273.2427024086621
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+68.6690248994559
+20
+-41.355075389375884
+30
+273.2427024086621
+11
+65.97831287432865
+21
+-39.732647074603115
+31
+271.4435197622041
+12
+66.23772495458483
+22
+-41.50749177521926
+32
+274.3951041443376
+13
+66.23772495458483
+23
+-41.50749177521926
+33
+274.3951041443376
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+66.23772495458483
+20
+-41.50749177521926
+30
+274.3951041443376
+11
+65.97831287432865
+21
+-39.732647074603115
+31
+271.4435197622041
+12
+61.28367523333688
+22
+-38.52244271754989
+32
+271.0741914340338
+13
+61.28367523333688
+23
+-38.52244271754989
+33
+271.0741914340338
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+66.23772495458483
+20
+-41.50749177521926
+30
+274.3951041443376
+11
+61.28367523333688
+21
+-38.52244271754989
+31
+271.0741914340338
+12
+62.160875646390416
+22
+-41.51144669141887
+32
+274.9046798854296
+13
+62.160875646390416
+23
+-41.51144669141887
+33
+274.9046798854296
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+65.97831287432865
+20
+-39.732647074603115
+30
+271.4435197622041
+11
+64.35360287713351
+21
+-38.41292196125305
+31
+261.5388884769911
+12
+62.01186657296544
+22
+-37.91673209037488
+32
+261.7001273682025
+13
+62.01186657296544
+23
+-37.91673209037488
+33
+261.7001273682025
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+65.97831287432865
+20
+-39.732647074603115
+30
+271.4435197622041
+11
+62.01186657296544
+21
+-37.91673209037488
+31
+261.7001273682025
+12
+61.28367523333688
+22
+-38.52244271754989
+32
+271.0741914340338
+13
+61.28367523333688
+23
+-38.52244271754989
+33
+271.0741914340338
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+68.79488250189755
+20
+-40.670266438212444
+30
+271.612364261491
+11
+66.3324908312118
+21
+-39.515126683627
+31
+261.69891047090994
+12
+64.35360287713351
+22
+-38.41292196125305
+32
+261.5388884769911
+13
+64.35360287713351
+23
+-38.41292196125305
+33
+261.5388884769911
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+68.79488250189755
+20
+-40.670266438212444
+30
+271.612364261491
+11
+64.35360287713351
+21
+-38.41292196125305
+31
+261.5388884769911
+12
+65.97831287432865
+22
+-39.732647074603115
+32
+271.4435197622041
+13
+65.97831287432865
+23
+-39.732647074603115
+33
+271.4435197622041
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+66.3324908312118
+20
+-39.515126683627
+30
+261.69891047090994
+11
+63.32845817578563
+21
+-40.1217499837656
+31
+250.03464570123302
+12
+62.03413579341195
+22
+-39.539160405144194
+32
+250.18858320869163
+13
+62.03413579341195
+23
+-39.539160405144194
+33
+250.18858320869163
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+66.3324908312118
+20
+-39.515126683627
+30
+261.69891047090994
+11
+62.03413579341195
+21
+-39.539160405144194
+31
+250.18858320869163
+12
+64.35360287713351
+22
+-38.41292196125305
+32
+261.5388884769911
+13
+64.35360287713351
+23
+-38.41292196125305
+33
+261.5388884769911
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+64.35360287713351
+20
+-38.41292196125305
+30
+261.5388884769911
+11
+62.03413579341195
+21
+-39.539160405144194
+31
+250.18858320869163
+12
+60.09716995104859
+22
+-41.32465295706602
+32
+250.62849157980665
+13
+60.09716995104859
+23
+-41.32465295706602
+33
+250.62849157980665
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+64.35360287713351
+20
+-38.41292196125305
+30
+261.5388884769911
+11
+60.09716995104859
+21
+-41.32465295706602
+31
+250.62849157980665
+12
+62.01186657296544
+22
+-37.91673209037488
+32
+261.7001273682025
+13
+62.01186657296544
+23
+-37.91673209037488
+33
+261.7001273682025
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+62.03413579341195
+20
+-39.539160405144194
+30
+250.18858320869163
+11
+60.40124216192706
+21
+-40.94832746946149
+31
+234.7148214659077
+12
+59.077197063192365
+22
+-41.004608969223845
+32
+234.67953144443493
+13
+59.077197063192365
+23
+-41.004608969223845
+33
+234.67953144443493
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+63.32845817578563
+20
+-40.1217499837656
+30
+250.03464570123302
+11
+60.40124216192706
+21
+-40.94832746946149
+31
+234.7148214659077
+12
+62.03413579341195
+22
+-39.539160405144194
+32
+250.18858320869163
+13
+62.03413579341195
+23
+-39.539160405144194
+33
+250.18858320869163
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+59.077197063192365
+20
+-41.004608969223845
+30
+234.67953144443493
+11
+57.13986615164136
+21
+-43.986007335015955
+31
+235.05220624015817
+12
+62.03413579341195
+22
+-39.539160405144194
+32
+250.18858320869163
+13
+62.03413579341195
+23
+-39.539160405144194
+33
+250.18858320869163
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+62.03413579341195
+20
+-39.539160405144194
+30
+250.18858320869163
+11
+57.13986615164136
+21
+-43.986007335015955
+31
+235.05220624015817
+12
+60.09716995104859
+22
+-41.32465295706602
+32
+250.62849157980665
+13
+60.09716995104859
+23
+-41.32465295706602
+33
+250.62849157980665
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+60.40124216192706
+20
+-40.94832746946149
+30
+234.7148214659077
+11
+59.084620136674545
+21
+-41.76273598223528
+31
+218.21917022203252
+12
+57.224623048040314
+22
+-42.47309977653388
+32
+218.80206402497686
+13
+57.224623048040314
+23
+-42.47309977653388
+33
+218.80206402497686
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+60.40124216192706
+20
+-40.94832746946149
+30
+234.7148214659077
+11
+57.224623048040314
+21
+-42.47309977653388
+31
+218.80206402497686
+12
+59.077197063192365
+22
+-41.004608969223845
+32
+234.67953144443493
+13
+59.077197063192365
+23
+-41.004608969223845
+33
+234.67953144443493
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+57.224623048040314
+20
+-42.47309977653388
+30
+218.80206402497686
+11
+55.01589361790529
+21
+-46.23179128769331
+31
+219.90457297167282
+12
+59.077197063192365
+22
+-41.004608969223845
+32
+234.67953144443493
+13
+59.077197063192365
+23
+-41.004608969223845
+33
+234.67953144443493
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.01589361790529
+20
+-46.23179128769331
+30
+219.90457297167282
+11
+57.13986615164136
+21
+-43.986007335015955
+31
+235.05220624015817
+12
+59.077197063192365
+22
+-41.004608969223845
+32
+234.67953144443493
+13
+59.077197063192365
+23
+-41.004608969223845
+33
+234.67953144443493
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+48.40141796393732
+20
+-79.6471824817644
+30
+234.10393902523313
+11
+50.52718542117932
+21
+-88.53418340641151
+31
+244.11596149647752
+12
+50.32460244446698
+22
+-82.52301500746384
+32
+242.6931043376206
+13
+50.32460244446698
+23
+-82.52301500746384
+33
+242.6931043376206
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+48.40141796393732
+20
+-79.6471824817644
+30
+234.10393902523313
+11
+49.35975500394562
+21
+-85.34226180907366
+31
+235.6919899915006
+12
+50.52718542117932
+22
+-88.53418340641151
+32
+244.11596149647752
+13
+50.52718542117932
+23
+-88.53418340641151
+33
+244.11596149647752
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+44.87515383558069
+20
+-77.70562285212102
+30
+225.8570260762656
+11
+49.35975500394562
+21
+-85.34226180907366
+31
+235.6919899915006
+12
+48.40141796393732
+22
+-79.6471824817644
+32
+234.10393902523313
+13
+48.40141796393732
+23
+-79.6471824817644
+33
+234.10393902523313
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+44.87515383558069
+20
+-77.70562285212102
+30
+225.8570260762656
+11
+47.90370697144388
+21
+-83.52391303026144
+31
+226.87191841792557
+12
+49.35975500394562
+22
+-85.34226180907366
+32
+235.6919899915006
+13
+49.35975500394562
+23
+-85.34226180907366
+33
+235.6919899915006
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+42.780873595773336
+20
+-77.9277066079393
+30
+222.34810273432214
+11
+47.90370697144388
+21
+-83.52391303026144
+31
+226.87191841792557
+12
+44.87515383558069
+22
+-77.70562285212102
+32
+225.8570260762656
+13
+44.87515383558069
+23
+-77.70562285212102
+33
+225.8570260762656
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+42.780873595773336
+20
+-77.9277066079393
+30
+222.34810273432214
+11
+46.62505214170677
+21
+-83.39157544973789
+31
+222.9529006885239
+12
+47.90370697144388
+22
+-83.52391303026144
+32
+226.87191841792557
+13
+47.90370697144388
+23
+-83.52391303026144
+33
+226.87191841792557
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+40.813454898673655
+20
+-78.1704776177246
+30
+219.8196943855366
+11
+46.62505214170677
+21
+-83.39157544973789
+31
+222.9529006885239
+12
+42.780873595773336
+22
+-77.9277066079393
+32
+222.34810273432214
+13
+42.780873595773336
+23
+-77.9277066079393
+33
+222.34810273432214
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+44.19369135197109
+20
+-82.88504195187559
+30
+219.6660611024001
+11
+46.62505214170677
+21
+-83.39157544973789
+31
+222.9529006885239
+12
+40.813454898673655
+22
+-78.1704776177246
+32
+219.8196943855366
+13
+40.813454898673655
+23
+-78.1704776177246
+33
+219.8196943855366
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+50.32460244446698
+20
+-82.52301500746384
+30
+242.6931043376206
+11
+52.06826415197074
+21
+-90.44957974427355
+31
+252.763842103212
+12
+52.23513119315818
+22
+-85.10770485601354
+32
+249.61694570568733
+13
+52.23513119315818
+23
+-85.10770485601354
+33
+249.61694570568733
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+50.32460244446698
+20
+-82.52301500746384
+30
+242.6931043376206
+11
+50.52718542117932
+21
+-88.53418340641151
+31
+244.11596149647752
+12
+52.06826415197074
+22
+-90.44957974427355
+32
+252.763842103212
+13
+52.06826415197074
+23
+-90.44957974427355
+33
+252.763842103212
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+52.93998852720955
+20
+-84.25739787311703
+30
+251.3978748927639
+11
+52.06826415197074
+21
+-90.44957974427355
+31
+252.763842103212
+12
+52.86204625564672
+22
+-89.34068208679341
+32
+255.21497747394545
+13
+52.86204625564672
+23
+-89.34068208679341
+33
+255.21497747394545
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+52.23513119315818
+20
+-85.10770485601354
+30
+249.61694570568733
+11
+52.06826415197074
+21
+-90.44957974427355
+31
+252.763842103212
+12
+52.93998852720955
+22
+-84.25739787311703
+32
+251.3978748927639
+13
+52.93998852720955
+23
+-84.25739787311703
+33
+251.3978748927639
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.20194144161178
+20
+-81.38947517981939
+30
+252.91169512421178
+11
+52.86204625564672
+21
+-89.34068208679341
+31
+255.21497747394545
+12
+53.60015530820635
+22
+-86.36019639397051
+32
+255.29194622767537
+13
+53.60015530820635
+23
+-86.36019639397051
+33
+255.29194622767537
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+52.93998852720955
+20
+-84.25739787311703
+30
+251.3978748927639
+11
+52.86204625564672
+21
+-89.34068208679341
+31
+255.21497747394545
+12
+54.20194144161178
+22
+-81.38947517981939
+32
+252.91169512421178
+13
+54.20194144161178
+23
+-81.38947517981939
+33
+252.91169512421178
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+53.78287243662418
+20
+-76.40506387113098
+30
+249.0255336217
+11
+52.23513119315818
+21
+-85.10770485601354
+31
+249.61694570568733
+12
+54.20194144161178
+22
+-81.38947517981939
+32
+252.91169512421178
+13
+54.20194144161178
+23
+-81.38947517981939
+33
+252.91169512421178
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+52.23513119315818
+20
+-85.10770485601354
+30
+249.61694570568733
+11
+52.93998852720955
+21
+-84.25739787311703
+31
+251.3978748927639
+12
+54.20194144161178
+22
+-81.38947517981939
+32
+252.91169512421178
+13
+54.20194144161178
+23
+-81.38947517981939
+33
+252.91169512421178
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+50.32460244446698
+20
+-82.52301500746384
+30
+242.6931043376206
+11
+53.78287243662418
+21
+-76.40506387113098
+31
+249.0255336217
+12
+51.32729539077451
+22
+-75.75006890362467
+32
+244.26411874180098
+13
+51.32729539077451
+23
+-75.75006890362467
+33
+244.26411874180098
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+50.32460244446698
+20
+-82.52301500746384
+30
+242.6931043376206
+11
+52.23513119315818
+21
+-85.10770485601354
+31
+249.61694570568733
+12
+53.78287243662418
+22
+-76.40506387113098
+32
+249.0255336217
+13
+53.78287243662418
+23
+-76.40506387113098
+33
+249.0255336217
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.93936655049322
+20
+-54.56479972008862
+30
+245.14849884888397
+11
+54.76557784490799
+21
+-62.115647417941595
+31
+246.37817356260976
+12
+57.74219988882828
+22
+-55.050645963984216
+32
+248.58805904517396
+13
+57.74219988882828
+23
+-55.050645963984216
+33
+248.58805904517396
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+52.57023428498674
+20
+-62.04263358041116
+30
+243.18686041392004
+11
+54.76557784490799
+21
+-62.115647417941595
+31
+246.37817356260976
+12
+55.93936655049322
+22
+-54.56479972008862
+32
+245.14849884888397
+13
+55.93936655049322
+23
+-54.56479972008862
+33
+245.14849884888397
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+52.57023428498674
+20
+-62.04263358041116
+30
+243.18686041392004
+11
+53.95223411726054
+21
+-70.11948513280119
+31
+247.37420399624048
+12
+54.76557784490799
+22
+-62.115647417941595
+32
+246.37817356260976
+13
+54.76557784490799
+23
+-62.115647417941595
+33
+246.37817356260976
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+52.57023428498674
+20
+-62.04263358041116
+30
+243.18686041392004
+11
+52.06704725467858
+21
+-70.84658126486609
+31
+244.5522191757214
+12
+53.95223411726054
+22
+-70.11948513280119
+32
+247.37420399624048
+13
+53.95223411726054
+23
+-70.11948513280119
+33
+247.37420399624048
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+51.32729539077451
+20
+-75.75006890362467
+30
+244.26411874180098
+11
+53.95223411726054
+21
+-70.11948513280119
+31
+247.37420399624048
+12
+52.06704725467858
+22
+-70.84658126486609
+32
+244.5522191757214
+13
+52.06704725467858
+23
+-70.84658126486609
+33
+244.5522191757214
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+51.32729539077451
+20
+-75.75006890362467
+30
+244.26411874180098
+11
+53.78287243662418
+21
+-76.40506387113098
+31
+249.0255336217
+12
+53.95223411726054
+22
+-70.11948513280119
+32
+247.37420399624048
+13
+53.95223411726054
+23
+-70.11948513280119
+33
+247.37420399624048
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+38.71582819131286
+20
+-89.78484959842109
+30
+213.722126278843
+11
+30.889657481108873
+21
+-94.36007919261924
+31
+211.95427873765638
+12
+35.620649928703905
+22
+-94.28250199024403
+32
+212.06592906421187
+13
+35.620649928703905
+23
+-94.28250199024403
+33
+212.06592906421187
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+37.01491000119623
+20
+-82.01769840688767
+30
+216.84590162781944
+11
+34.4332623958788
+21
+-86.18252938930472
+31
+214.74553690155037
+12
+43.25181284783925
+22
+-86.89045938901923
+32
+216.45588604568107
+13
+43.25181284783925
+23
+-86.89045938901923
+33
+216.45588604568107
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+34.4332623958788
+20
+-86.18252938930472
+30
+214.74553690155037
+11
+38.71582819131286
+21
+-89.78484959842109
+31
+213.722126278843
+12
+43.25181284783925
+22
+-86.89045938901923
+32
+216.45588604568107
+13
+43.25181284783925
+23
+-86.89045938901923
+33
+216.45588604568107
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+33.30124368984699
+20
+-78.99492553316206
+30
+216.11910972007792
+11
+29.702878396929833
+21
+-84.33436662683623
+31
+212.96278236853658
+12
+37.01491000119623
+22
+-82.01769840688767
+32
+216.84590162781944
+13
+37.01491000119623
+23
+-82.01769840688767
+33
+216.84590162781944
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+37.01491000119623
+20
+-82.01769840688767
+30
+216.84590162781944
+11
+29.702878396929833
+21
+-84.33436662683623
+31
+212.96278236853658
+12
+34.4332623958788
+22
+-86.18252938930472
+32
+214.74553690155037
+13
+34.4332623958788
+23
+-86.18252938930472
+33
+214.74553690155037
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+29.702878396929833
+20
+-84.33436662683623
+30
+212.96278236853658
+11
+28.454037550850632
+21
+-92.7072284455425
+31
+210.63607474592436
+12
+34.4332623958788
+22
+-86.18252938930472
+32
+214.74553690155037
+13
+34.4332623958788
+23
+-86.18252938930472
+33
+214.74553690155037
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+34.4332623958788
+20
+-86.18252938930472
+30
+214.74553690155037
+11
+28.454037550850632
+21
+-92.7072284455425
+31
+210.63607474592436
+12
+30.889657481108873
+22
+-94.36007919261924
+32
+211.95427873765638
+13
+30.889657481108873
+23
+-94.36007919261924
+33
+211.95427873765638
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+26.370709386672726
+20
+-97.0792361919495
+30
+207.03314608816052
+11
+28.809980008807447
+21
+-98.16470857655708
+31
+210.60352274335784
+12
+28.454037550850632
+22
+-92.7072284455425
+32
+210.63607474592436
+13
+28.454037550850632
+23
+-92.7072284455425
+33
+210.63607474592436
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+28.454037550850632
+20
+-92.7072284455425
+30
+210.63607474592436
+11
+28.809980008807447
+21
+-98.16470857655708
+31
+210.60352274335784
+12
+30.889657481108873
+22
+-94.36007919261924
+32
+211.95427873765638
+13
+30.889657481108873
+23
+-94.36007919261924
+33
+211.95427873765638
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+24.254829219929537
+20
+-102.1765147244836
+30
+203.07944678593134
+11
+25.066195489477224
+21
+-104.29604558310436
+31
+206.64191360872937
+12
+26.370709386672726
+22
+-97.0792361919495
+32
+207.03314608816052
+13
+26.370709386672726
+23
+-97.0792361919495
+33
+207.03314608816052
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+25.066195489477224
+20
+-104.29604558310436
+30
+206.64191360872937
+11
+28.809980008807447
+21
+-98.16470857655708
+31
+210.60352274335784
+12
+26.370709386672726
+22
+-97.0792361919495
+32
+207.03314608816052
+13
+26.370709386672726
+23
+-97.0792361919495
+33
+207.03314608816052
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+20.506177111430652
+20
+-111.68960930594324
+30
+198.04027509909426
+11
+21.25487317043209
+21
+-114.80699594413521
+31
+202.78769566013284
+12
+24.254829219929537
+22
+-102.1765147244836
+32
+203.07944678593134
+13
+24.254829219929537
+23
+-102.1765147244836
+33
+203.07944678593134
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+21.25487317043209
+20
+-114.80699594413521
+30
+202.78769566013284
+11
+25.066195489477224
+21
+-104.29604558310436
+31
+206.64191360872937
+12
+24.254829219929537
+22
+-102.1765147244836
+32
+203.07944678593134
+13
+24.254829219929537
+23
+-102.1765147244836
+33
+203.07944678593134
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+16.432917650248104
+20
+-124.47129001414518
+30
+196.1513462773357
+11
+18.249441083119926
+21
+-126.61576726725555
+31
+201.1929517587541
+12
+20.506177111430652
+22
+-111.68960930594324
+32
+198.04027509909426
+13
+20.506177111430652
+23
+-111.68960930594324
+33
+198.04027509909426
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+20.506177111430652
+20
+-111.68960930594324
+30
+198.04027509909426
+11
+18.249441083119926
+21
+-126.61576726725555
+31
+201.1929517587541
+12
+21.25487317043209
+22
+-114.80699594413521
+32
+202.78769566013284
+13
+21.25487317043209
+23
+-114.80699594413521
+33
+202.78769566013284
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+35.620649928703905
+20
+-94.28250199024403
+30
+212.06592906421187
+11
+32.82787064319672
+21
+-99.2842540853445
+31
+211.45869731542274
+12
+34.80958788347927
+22
+-101.93252681740731
+32
+210.34858276064935
+13
+34.80958788347927
+23
+-101.93252681740731
+33
+210.34858276064935
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+35.620649928703905
+20
+-94.28250199024403
+30
+212.06592906421187
+11
+34.80958788347927
+21
+-101.93252681740731
+31
+210.34858276064935
+12
+37.58563483121926
+22
+-95.42303897732074
+32
+211.15508144103
+13
+37.58563483121926
+23
+-95.42303897732074
+33
+211.15508144103
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+35.620649928703905
+20
+-94.28250199024403
+30
+212.06592906421187
+11
+30.889657481108873
+21
+-94.36007919261924
+31
+211.95427873765638
+12
+28.809980008807447
+22
+-98.16470857655708
+32
+210.60352274335784
+13
+28.809980008807447
+23
+-98.16470857655708
+33
+210.60352274335784
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+35.620649928703905
+20
+-94.28250199024403
+30
+212.06592906421187
+11
+28.809980008807447
+21
+-98.16470857655708
+31
+210.60352274335784
+12
+32.82787064319672
+22
+-99.2842540853445
+32
+211.45869731542274
+13
+32.82787064319672
+23
+-99.2842540853445
+33
+211.45869731542274
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+34.80958788347927
+20
+-101.93252681740731
+30
+210.34858276064935
+11
+35.51630098590118
+21
+-103.91211448742837
+31
+209.07205750117285
+12
+38.02980234285768
+22
+-102.41350547213284
+32
+207.1472302092993
+13
+38.02980234285768
+23
+-102.41350547213284
+33
+207.1472302092993
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+37.58563483121926
+20
+-95.42303897732074
+30
+211.15508144103
+11
+34.80958788347927
+21
+-101.93252681740731
+31
+210.34858276064935
+12
+38.02980234285768
+22
+-102.41350547213284
+32
+207.1472302092993
+13
+38.02980234285768
+23
+-102.41350547213284
+33
+207.1472302092993
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+17.87463671713465
+20
+-145.28053793440458
+30
+197.7345296544303
+11
+10.240431554768916
+21
+-149.43198304660808
+31
+196.86444809053506
+12
+17.442942402740908
+22
+-143.77797400290896
+32
+193.9843564243169
+13
+17.442942402740908
+23
+-143.77797400290896
+33
+193.9843564243169
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+17.442942402740908
+20
+-143.77797400290896
+30
+193.9843564243169
+11
+10.240431554768916
+21
+-149.43198304660808
+31
+196.86444809053506
+12
+9.214282913154985
+22
+-146.7551132281784
+32
+193.24296174906766
+13
+9.214282913154985
+23
+-146.7551132281784
+33
+193.24296174906766
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+10.240431554768916
+20
+-149.43198304660808
+30
+196.86444809053506
+11
+0.020623870886214313
+21
+-151.73344005040593
+31
+197.52248530126994
+12
+9.214282913154985
+22
+-146.7551132281784
+32
+193.24296174906766
+13
+9.214282913154985
+23
+-146.7551132281784
+33
+193.24296174906766
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+9.214282913154985
+20
+-146.7551132281784
+30
+193.24296174906766
+11
+0.020623870886214313
+21
+-151.73344005040593
+31
+197.52248530126994
+12
+0.020623870886214313
+22
+-148.17492814380608
+32
+193.2609109841266
+13
+0.020623870886214313
+23
+-148.17492814380608
+33
+193.2609109841266
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+22.13864482886328
+20
+-138.383772531087
+30
+195.03149654422202
+11
+22.434350870858168
+21
+-139.43669291312938
+31
+198.40929920293482
+12
+17.87463671713465
+22
+-145.28053793440458
+32
+197.7345296544303
+13
+17.87463671713465
+23
+-145.28053793440458
+33
+197.7345296544303
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+17.442942402740908
+20
+-143.77797400290896
+30
+193.9843564243169
+11
+22.13864482886328
+21
+-138.383772531087
+31
+195.03149654422202
+12
+17.87463671713465
+22
+-145.28053793440458
+32
+197.7345296544303
+13
+17.87463671713465
+23
+-145.28053793440458
+33
+197.7345296544303
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+26.883023146672084
+20
+-129.81012265917437
+30
+197.18357940540918
+11
+26.643902828762645
+21
+-130.1061329254934
+31
+201.09894644293362
+12
+22.434350870858168
+22
+-139.43669291312938
+32
+198.40929920293482
+13
+22.434350870858168
+23
+-139.43669291312938
+33
+198.40929920293482
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+22.13864482886328
+20
+-138.383772531087
+30
+195.03149654422202
+11
+26.883023146672084
+21
+-129.81012265917437
+31
+197.18357940540918
+12
+22.434350870858168
+22
+-139.43669291312938
+32
+198.40929920293482
+13
+22.434350870858168
+23
+-139.43669291312938
+33
+198.40929920293482
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+32.38461580452743
+20
+-118.32139532389283
+30
+200.64595642593028
+11
+31.224000012129835
+21
+-118.6575632008527
+31
+203.71679674269603
+12
+26.643902828762645
+22
+-130.1061329254934
+32
+201.09894644293362
+13
+26.643902828762645
+23
+-130.1061329254934
+33
+201.09894644293362
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+26.883023146672084
+20
+-129.81012265917437
+30
+197.18357940540918
+11
+32.38461580452743
+21
+-118.32139532389283
+31
+200.64595642593028
+12
+26.643902828762645
+22
+-130.1061329254934
+32
+201.09894644293362
+13
+26.643902828762645
+23
+-130.1061329254934
+33
+201.09894644293362
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+31.224000012129835
+20
+-118.6575632008527
+30
+203.71679674269603
+11
+36.094935648323265
+21
+-108.78943883440427
+31
+203.87621028797145
+12
+33.35296182476378
+22
+-110.50495979202749
+32
+206.40218484217198
+13
+33.35296182476378
+23
+-110.50495979202749
+33
+206.40218484217198
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+32.38461580452743
+20
+-118.32139532389283
+30
+200.64595642593028
+11
+36.094935648323265
+21
+-108.78943883440427
+31
+203.87621028797145
+12
+31.224000012129835
+22
+-118.6575632008527
+32
+203.71679674269603
+13
+31.224000012129835
+23
+-118.6575632008527
+33
+203.71679674269603
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+36.094935648323265
+20
+-108.78943883440427
+30
+203.87621028797145
+11
+38.02980234285768
+21
+-102.41350547213284
+31
+207.1472302092993
+12
+35.51630098590118
+22
+-103.91211448742837
+32
+209.07205750117285
+13
+35.51630098590118
+23
+-103.91211448742837
+33
+209.07205750117285
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+36.094935648323265
+20
+-108.78943883440427
+30
+203.87621028797145
+11
+35.51630098590118
+21
+-103.91211448742837
+31
+209.07205750117285
+12
+33.35296182476378
+22
+-110.50495979202749
+32
+206.40218484217198
+13
+33.35296182476378
+23
+-110.50495979202749
+33
+206.40218484217198
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+64.60464878850613
+20
+-41.75543459849045
+30
+249.93303477733724
+11
+63.32845817578563
+21
+-40.1217499837656
+31
+250.03464570123302
+12
+66.3324908312118
+22
+-39.515126683627
+32
+261.69891047090994
+13
+66.3324908312118
+23
+-39.515126683627
+33
+261.69891047090994
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+64.60464878850613
+20
+-41.75543459849045
+30
+249.93303477733724
+11
+66.3324908312118
+21
+-39.515126683627
+31
+261.69891047090994
+12
+68.06361849660631
+22
+-42.11654886994176
+32
+260.68553925086303
+13
+68.06361849660631
+23
+-42.11654886994176
+33
+260.68553925086303
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+61.60371922117496
+20
+-42.34562978518406
+30
+234.13557835483905
+11
+60.40124216192706
+21
+-40.94832746946149
+31
+234.7148214659077
+12
+63.32845817578563
+22
+-40.1217499837656
+32
+250.03464570123302
+13
+63.32845817578563
+23
+-40.1217499837656
+33
+250.03464570123302
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+61.60371922117496
+20
+-42.34562978518406
+30
+234.13557835483905
+11
+63.32845817578563
+21
+-40.1217499837656
+31
+250.03464570123302
+12
+64.60464878850613
+22
+-41.75543459849045
+32
+249.93303477733724
+13
+64.60464878850613
+23
+-41.75543459849045
+33
+249.93303477733724
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+60.90251257900006
+20
+-42.67662584864736
+30
+217.79082237519182
+11
+59.084620136674545
+21
+-41.76273598223528
+31
+218.21917022203252
+12
+60.40124216192706
+22
+-40.94832746946149
+32
+234.7148214659077
+13
+60.40124216192706
+23
+-40.94832746946149
+33
+234.7148214659077
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+60.90251257900006
+20
+-42.67662584864736
+30
+217.79082237519182
+11
+60.40124216192706
+21
+-40.94832746946149
+31
+234.7148214659077
+12
+61.60371922117496
+22
+-42.34562978518406
+32
+234.13557835483905
+13
+61.60371922117496
+23
+-42.34562978518406
+33
+234.13557835483905
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+34.80958788347927
+20
+-101.93252681740731
+30
+210.34858276064935
+11
+31.911242757877194
+21
+-109.21261486775394
+31
+207.76389291209964
+12
+35.51630098590118
+22
+-103.91211448742837
+32
+209.07205750117285
+13
+35.51630098590118
+23
+-103.91211448742837
+33
+209.07205750117285
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+35.51630098590118
+20
+-103.91211448742837
+30
+209.07205750117285
+11
+31.911242757877194
+21
+-109.21261486775394
+31
+207.76389291209964
+12
+33.35296182476378
+22
+-110.50495979202749
+32
+206.40218484217198
+13
+33.35296182476378
+23
+-110.50495979202749
+33
+206.40218484217198
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+32.82787064319672
+20
+-99.2842540853445
+30
+211.45869731542274
+11
+28.2651142462428
+21
+-106.94583943678283
+31
+207.53633311846602
+12
+31.911242757877194
+22
+-109.21261486775394
+32
+207.76389291209964
+13
+31.911242757877194
+23
+-109.21261486775394
+33
+207.76389291209964
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+32.82787064319672
+20
+-99.2842540853445
+30
+211.45869731542274
+11
+31.911242757877194
+21
+-109.21261486775394
+31
+207.76389291209964
+12
+34.80958788347927
+22
+-101.93252681740731
+32
+210.34858276064935
+13
+34.80958788347927
+23
+-101.93252681740731
+33
+210.34858276064935
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+28.809980008807447
+20
+-98.16470857655708
+30
+210.60352274335784
+11
+25.066195489477224
+21
+-104.29604558310436
+31
+206.64191360872937
+12
+28.2651142462428
+22
+-106.94583943678283
+32
+207.53633311846602
+13
+28.2651142462428
+23
+-106.94583943678283
+33
+207.53633311846602
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+28.809980008807447
+20
+-98.16470857655708
+30
+210.60352274335784
+11
+28.2651142462428
+21
+-106.94583943678283
+31
+207.53633311846602
+12
+32.82787064319672
+22
+-99.2842540853445
+32
+211.45869731542274
+13
+32.82787064319672
+23
+-99.2842540853445
+33
+211.45869731542274
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+9.214282913154985
+20
+-146.7551132281784
+30
+193.24296174906766
+11
+0.020623870886214313
+21
+-148.17492814380608
+31
+193.2609109841266
+12
+8.860774249782521
+22
+-144.30823699796642
+32
+188.86304417026128
+13
+8.860774249782521
+23
+-144.30823699796642
+33
+188.86304417026128
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+8.860774249782521
+20
+-144.30823699796642
+30
+188.86304417026128
+11
+0.020623870886214313
+21
+-148.17492814380608
+31
+193.2609109841266
+12
+0.020623870886214313
+22
+-146.38213420813025
+32
+189.44411262726717
+13
+0.020623870886214313
+23
+-146.38213420813025
+33
+189.44411262726717
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.11429441414395
+20
+-91.44500172926185
+30
+258.3551809363636
+11
+53.79987857628211
+21
+-91.56547456118574
+31
+258.52493810862023
+12
+52.50409591715784
+22
+-93.1517001815152
+32
+254.23811317266293
+13
+52.50409591715784
+23
+-93.1517001815152
+33
+254.23811317266293
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+54.11429441414395
+20
+-91.44500172926185
+30
+258.3551809363636
+11
+52.50409591715784
+21
+-93.1517001815152
+31
+254.23811317266293
+12
+53.237367802981154
+22
+-92.79788729381957
+32
+253.764740126013
+13
+53.237367802981154
+23
+-92.79788729381957
+33
+253.764740126013
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+53.79987857628211
+20
+-91.56547456118574
+30
+258.52493810862023
+11
+55.27071191088361
+21
+-86.12716056252286
+31
+258.9046100637755
+12
+55.1270267631118
+22
+-86.13872108679843
+32
+259.2572060541786
+13
+55.1270267631118
+23
+-86.13872108679843
+33
+259.2572060541786
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+55.27071191088361
+20
+-86.12716056252286
+30
+258.9046100637755
+11
+53.79987857628211
+21
+-91.56547456118574
+31
+258.52493810862023
+12
+54.11429441414395
+22
+-91.44500172926185
+32
+258.3551809363636
+13
+54.11429441414395
+23
+-91.44500172926185
+33
+258.3551809363636
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+53.237367802981154
+20
+-92.79788729381957
+30
+253.764740126013
+11
+52.50409591715784
+21
+-93.1517001815152
+31
+254.23811317266293
+12
+51.14269207155384
+22
+-90.66679591092165
+32
+243.17895058151373
+13
+51.14269207155384
+23
+-90.66679591092165
+33
+243.17895058151373
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+52.139361376265185
+20
+-89.21199519814428
+30
+242.79532371016052
+11
+53.237367802981154
+21
+-92.79788729381957
+31
+253.764740126013
+12
+51.14269207155384
+22
+-90.66679591092165
+32
+243.17895058151373
+13
+51.14269207155384
+23
+-90.66679591092165
+33
+243.17895058151373
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+50.38203999665694
+20
+-87.2412300334892
+30
+234.74828614143004
+11
+52.139361376265185
+21
+-89.21199519814428
+31
+242.79532371016052
+12
+51.14269207155384
+22
+-90.66679591092165
+32
+243.17895058151373
+13
+51.14269207155384
+23
+-90.66679591092165
+33
+243.17895058151373
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+50.38203999665694
+20
+-87.2412300334892
+30
+234.74828614143004
+11
+51.64155911647484
+21
+-85.98022021448836
+31
+234.9521164378673
+12
+52.139361376265185
+22
+-89.21199519814428
+32
+242.79532371016052
+13
+52.139361376265185
+23
+-89.21199519814428
+33
+242.79532371016052
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+49.58053059517576
+20
+-85.96592167130343
+30
+226.31731747702273
+11
+51.64155911647484
+21
+-85.98022021448836
+31
+234.9521164378673
+12
+50.38203999665694
+22
+-87.2412300334892
+32
+234.74828614143004
+13
+50.38203999665694
+23
+-87.2412300334892
+33
+234.74828614143004
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+49.58053059517576
+20
+-85.96592167130343
+30
+226.31731747702273
+11
+50.71002423932636
+21
+-84.41894098864486
+31
+226.44995928186844
+12
+51.64155911647484
+22
+-85.98022021448836
+32
+234.9521164378673
+13
+51.64155911647484
+23
+-85.98022021448836
+33
+234.9521164378673
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+49.78217047648666
+20
+-87.03770396137548
+30
+235.49759064907778
+11
+51.14269207155384
+21
+-90.66679591092165
+31
+243.17895058151373
+12
+50.60302854491319
+22
+-90.10458936194372
+32
+243.20055050844974
+13
+50.60302854491319
+23
+-90.10458936194372
+33
+243.20055050844974
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+51.14269207155384
+20
+-90.66679591092165
+30
+243.17895058151373
+11
+49.78217047648666
+21
+-87.03770396137548
+31
+235.49759064907778
+12
+50.38203999665694
+22
+-87.2412300334892
+32
+234.74828614143004
+13
+50.38203999665694
+23
+-87.2412300334892
+33
+234.74828614143004
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+50.38203999665694
+20
+-87.2412300334892
+30
+234.74828614143004
+11
+49.78217047648666
+21
+-87.03770396137548
+31
+235.49759064907778
+12
+48.570292885656826
+22
+-85.31062247947516
+32
+226.62032490277062
+13
+48.570292885656826
+23
+-85.31062247947516
+33
+226.62032490277062
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+50.38203999665694
+20
+-87.2412300334892
+30
+234.74828614143004
+11
+48.570292885656826
+21
+-85.31062247947516
+31
+226.62032490277062
+12
+49.58053059517576
+22
+-85.96592167130343
+32
+226.31731747702273
+13
+49.58053059517576
+23
+-85.96592167130343
+33
+226.31731747702273
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+50.60302854491319
+20
+-90.10458936194372
+30
+243.20055050844974
+11
+52.50409591715784
+21
+-93.1517001815152
+31
+254.23811317266293
+12
+52.03236568185201
+22
+-92.4647616600907
+32
+253.44743415708209
+13
+52.03236568185201
+23
+-92.4647616600907
+33
+253.44743415708209
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+51.14269207155384
+20
+-90.66679591092165
+30
+243.17895058151373
+11
+52.50409591715784
+21
+-93.1517001815152
+31
+254.23811317266293
+12
+50.60302854491319
+22
+-90.10458936194372
+32
+243.20055050844974
+13
+50.60302854491319
+23
+-90.10458936194372
+33
+243.20055050844974
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+48.570292885656826
+20
+-85.31062247947516
+30
+226.62032490277062
+11
+47.110594161278605
+21
+-85.36447018465192
+31
+222.0241038302827
+12
+48.198348228308156
+22
+-86.23181372963903
+32
+222.4545812473839
+13
+48.198348228308156
+23
+-86.23181372963903
+33
+222.4545812473839
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+49.58053059517576
+20
+-85.96592167130343
+30
+226.31731747702273
+11
+48.570292885656826
+21
+-85.31062247947516
+31
+226.62032490277062
+12
+48.198348228308156
+22
+-86.23181372963903
+32
+222.4545812473839
+13
+48.198348228308156
+23
+-86.23181372963903
+33
+222.4545812473839
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+49.58053059517576
+20
+-85.96592167130343
+30
+226.31731747702273
+11
+48.198348228308156
+21
+-86.23181372963903
+31
+222.4545812473839
+12
+49.46160930729941
+22
+-85.67569166712195
+32
+221.82970448785994
+13
+49.46160930729941
+23
+-85.67569166712195
+33
+221.82970448785994
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+49.46160930729941
+20
+-85.67569166712195
+30
+221.82970448785994
+11
+50.71002423932636
+21
+-84.41894098864486
+31
+226.44995928186844
+12
+49.58053059517576
+22
+-85.96592167130343
+32
+226.31731747702273
+13
+49.58053059517576
+23
+-85.96592167130343
+33
+226.31731747702273
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+48.198348228308156
+20
+-86.23181372963903
+30
+222.4545812473839
+11
+46.49180188821524
+21
+-89.21990503053627
+31
+215.40266143931598
+12
+47.68466545885508
+22
+-89.14871653894465
+32
+214.62415139665677
+13
+47.68466545885508
+23
+-89.14871653894465
+33
+214.62415139665677
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+49.46160930729941
+20
+-85.67569166712195
+30
+221.82970448785994
+11
+48.198348228308156
+21
+-86.23181372963903
+31
+222.4545812473839
+12
+47.68466545885508
+22
+-89.14871653894465
+32
+214.62415139665677
+13
+47.68466545885508
+23
+-89.14871653894465
+33
+214.62415139665677
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+47.110594161278605
+20
+-85.36447018465192
+30
+222.0241038302827
+11
+43.25181284783925
+21
+-86.89045938901923
+31
+216.45588604568107
+12
+46.49180188821524
+22
+-89.21990503053627
+32
+215.40266143931598
+13
+46.49180188821524
+23
+-89.21990503053627
+33
+215.40266143931598
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+46.49180188821524
+20
+-89.21990503053627
+30
+215.40266143931598
+11
+48.198348228308156
+21
+-86.23181372963903
+31
+222.4545812473839
+12
+47.110594161278605
+22
+-85.36447018465192
+32
+222.0241038302827
+13
+47.110594161278605
+23
+-85.36447018465192
+33
+222.0241038302827
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+47.68466545885508
+20
+-89.14871653894465
+30
+214.62415139665677
+11
+46.49180188821524
+21
+-89.21990503053627
+31
+215.40266143931598
+12
+41.32668133164213
+22
+-91.72488810644684
+32
+212.41548281138571
+13
+41.32668133164213
+23
+-91.72488810644684
+33
+212.41548281138571
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+47.68466545885508
+20
+-89.14871653894465
+30
+214.62415139665677
+11
+41.32668133164213
+21
+-91.72488810644684
+31
+212.41548281138571
+12
+41.85481475643957
+22
+-95.14193570283135
+32
+209.42221969699415
+13
+41.85481475643957
+23
+-95.14193570283135
+33
+209.42221969699415
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+43.25181284783925
+20
+-86.89045938901923
+30
+216.45588604568107
+11
+38.71582819131286
+21
+-89.78484959842109
+31
+213.722126278843
+12
+46.49180188821524
+22
+-89.21990503053627
+32
+215.40266143931598
+13
+46.49180188821524
+23
+-89.21990503053627
+33
+215.40266143931598
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+46.49180188821524
+20
+-89.21990503053627
+30
+215.40266143931598
+11
+38.71582819131286
+21
+-89.78484959842109
+31
+213.722126278843
+12
+41.32668133164213
+22
+-91.72488810644684
+32
+212.41548281138571
+13
+41.32668133164213
+23
+-91.72488810644684
+33
+212.41548281138571
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+38.71582819131286
+20
+-89.78484959842109
+30
+213.722126278843
+11
+35.620649928703905
+21
+-94.28250199024403
+31
+212.06592906421187
+12
+37.58563483121926
+22
+-95.42303897732074
+32
+211.15508144103
+13
+37.58563483121926
+23
+-95.42303897732074
+33
+211.15508144103
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+38.71582819131286
+20
+-89.78484959842109
+30
+213.722126278843
+11
+37.58563483121926
+21
+-95.42303897732074
+31
+211.15508144103
+12
+41.32668133164213
+22
+-91.72488810644684
+32
+212.41548281138571
+13
+41.32668133164213
+23
+-91.72488810644684
+33
+212.41548281138571
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+41.32668133164213
+20
+-91.72488810644684
+30
+212.41548281138571
+11
+37.58563483121926
+21
+-95.42303897732074
+31
+211.15508144103
+12
+38.02980234285768
+22
+-102.41350547213284
+32
+207.1472302092993
+13
+38.02980234285768
+23
+-102.41350547213284
+33
+207.1472302092993
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+41.32668133164213
+20
+-91.72488810644684
+30
+212.41548281138571
+11
+38.02980234285768
+21
+-102.41350547213284
+31
+207.1472302092993
+12
+41.85481475643957
+22
+-95.14193570283135
+32
+209.42221969699415
+13
+41.85481475643957
+23
+-95.14193570283135
+33
+209.42221969699415
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+20.91140390971993
+20
+-131.6710628432026
+30
+168.38345372645168
+11
+20.658289272950658
+21
+-133.2505955284293
+31
+180.0673105425317
+12
+14.878331359513712
+22
+-137.63963983692673
+32
+177.58849075840064
+13
+14.878331359513712
+23
+-137.63963983692673
+33
+177.58849075840064
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+20.91140390971993
+20
+-131.6710628432026
+30
+168.38345372645168
+11
+14.878331359513712
+21
+-137.63963983692673
+31
+177.58849075840064
+12
+15.550667113432105
+22
+-136.67372761127191
+32
+166.23712070497103
+13
+15.550667113432105
+23
+-136.67372761127191
+33
+166.23712070497103
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+15.550667113432105
+20
+-136.67372761127191
+30
+166.23712070497103
+11
+14.878331359513712
+21
+-137.63963983692673
+31
+177.58849075840064
+12
+7.385286283038533
+22
+-141.97818290779992
+32
+176.6073673165957
+13
+7.385286283038533
+23
+-141.97818290779992
+33
+176.6073673165957
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+15.550667113432105
+20
+-136.67372761127191
+30
+166.23712070497103
+11
+7.385286283038533
+21
+-141.97818290779992
+31
+176.6073673165957
+12
+7.8763043404250785
+22
+-141.25565014057725
+32
+166.21080530102685
+13
+7.8763043404250785
+23
+-141.25565014057725
+33
+166.21080530102685
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+20.658289272950658
+20
+-133.2505955284293
+30
+180.0673105425317
+11
+22.047681756274336
+21
+-135.79817000956913
+31
+191.14959418223214
+12
+16.17584809727931
+22
+-141.0259607766879
+32
+189.16453047439498
+13
+16.17584809727931
+23
+-141.0259607766879
+33
+189.16453047439498
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+20.658289272950658
+20
+-133.2505955284293
+30
+180.0673105425317
+11
+16.17584809727931
+21
+-141.0259607766879
+31
+189.16453047439498
+12
+14.878331359513712
+22
+-137.63963983692673
+32
+177.58849075840064
+13
+14.878331359513712
+23
+-137.63963983692673
+33
+177.58849075840064
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+16.17584809727931
+20
+-141.0259607766879
+30
+189.16453047439498
+11
+8.860774249782521
+21
+-144.30823699796642
+31
+188.86304417026128
+12
+14.878331359513712
+22
+-137.63963983692673
+32
+177.58849075840064
+13
+14.878331359513712
+23
+-137.63963983692673
+33
+177.58849075840064
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+14.878331359513712
+20
+-137.63963983692673
+30
+177.58849075840064
+11
+8.860774249782521
+21
+-144.30823699796642
+31
+188.86304417026128
+12
+7.385286283038533
+22
+-141.97818290779992
+32
+176.6073673165957
+13
+7.385286283038533
+23
+-141.97818290779992
+33
+176.6073673165957
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+22.047681756274336
+20
+-135.79817000956913
+30
+191.14959418223214
+11
+22.13864482886328
+21
+-138.383772531087
+31
+195.03149654422202
+12
+17.442942402740908
+22
+-143.77797400290896
+32
+193.9843564243169
+13
+17.442942402740908
+23
+-143.77797400290896
+33
+193.9843564243169
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+16.17584809727931
+20
+-141.0259607766879
+30
+189.16453047439498
+11
+22.047681756274336
+21
+-135.79817000956913
+31
+191.14959418223214
+12
+17.442942402740908
+22
+-143.77797400290896
+32
+193.9843564243169
+13
+17.442942402740908
+23
+-143.77797400290896
+33
+193.9843564243169
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+17.442942402740908
+20
+-143.77797400290896
+30
+193.9843564243169
+11
+9.214282913154985
+21
+-146.7551132281784
+31
+193.24296174906766
+12
+16.17584809727931
+22
+-141.0259607766879
+32
+189.16453047439498
+13
+16.17584809727931
+23
+-141.0259607766879
+33
+189.16453047439498
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+16.17584809727931
+20
+-141.0259607766879
+30
+189.16453047439498
+11
+9.214282913154985
+21
+-146.7551132281784
+31
+193.24296174906766
+12
+8.860774249782521
+22
+-144.30823699796642
+32
+188.86304417026128
+13
+8.860774249782521
+23
+-144.30823699796642
+33
+188.86304417026128
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+34.4332623958788
+20
+-86.18252938930472
+30
+214.74553690155037
+11
+30.889657481108873
+21
+-94.36007919261924
+31
+211.95427873765638
+12
+38.71582819131286
+22
+-89.78484959842109
+32
+213.722126278843
+13
+38.71582819131286
+23
+-89.78484959842109
+33
+213.722126278843
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+7.584248990306675
+20
+-140.88571336376913
+30
+199.2763385235982
+11
+5.020550620048584
+21
+-135.9761412385478
+31
+192.25301580189816
+12
+0.020623870886214313
+22
+-137.63507647208488
+32
+192.17939351572218
+13
+0.020623870886214313
+23
+-137.63507647208488
+33
+192.17939351572218
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+7.584248990306675
+20
+-140.88571336376913
+30
+199.2763385235982
+11
+0.020623870886214313
+21
+-137.63507647208488
+31
+192.17939351572218
+12
+0.020623870886214313
+22
+-143.56167050922897
+32
+199.26721179390637
+13
+0.020623870886214313
+23
+-143.56167050922897
+33
+199.26721179390637
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+8.429384159711796
+20
+-133.70723623731567
+30
+192.91744172341822
+11
+5.020550620048584
+21
+-135.9761412385478
+31
+192.25301580189816
+12
+11.302782890824597
+22
+-138.52128192510213
+32
+198.7777148581365
+13
+11.302782890824597
+23
+-138.52128192510213
+33
+198.7777148581365
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+11.302782890824597
+20
+-138.52128192510213
+30
+198.7777148581365
+11
+5.020550620048584
+21
+-135.9761412385478
+31
+192.25301580189816
+12
+7.584248990306675
+22
+-140.88571336376913
+32
+199.2763385235982
+13
+7.584248990306675
+23
+-140.88571336376913
+33
+199.2763385235982
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+11.429948657855315
+20
+-129.97714181252212
+30
+192.55936969520104
+11
+16.432917650248104
+21
+-124.47129001414518
+31
+196.1513462773357
+12
+15.177383869062021
+22
+-123.03595965804155
+32
+192.71665367021444
+13
+15.177383869062021
+23
+-123.03595965804155
+33
+192.71665367021444
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+11.429948657855315
+20
+-129.97714181252212
+30
+192.55936969520104
+11
+14.202953362364912
+21
+-133.59010987294656
+31
+198.19177881196273
+12
+16.432917650248104
+22
+-124.47129001414518
+32
+196.1513462773357
+13
+16.432917650248104
+23
+-124.47129001414518
+33
+196.1513462773357
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+11.429948657855315
+20
+-129.97714181252212
+30
+192.55936969520104
+11
+9.99005493690699
+21
+-126.08398315057711
+31
+183.72195733521303
+12
+7.805420073156758
+22
+-127.93366703466012
+32
+183.40860628248134
+13
+7.805420073156758
+23
+-127.93366703466012
+33
+183.40860628248134
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+7.805420073156758
+20
+-127.93366703466012
+30
+183.40860628248134
+11
+8.429384159711796
+21
+-133.70723623731567
+31
+192.91744172341822
+12
+11.429948657855315
+22
+-129.97714181252212
+32
+192.55936969520104
+13
+11.429948657855315
+23
+-129.97714181252212
+33
+192.55936969520104
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+9.99005493690699
+20
+-126.08398315057711
+30
+183.72195733521303
+11
+15.177383869062021
+21
+-123.03595965804155
+31
+192.71665367021444
+12
+14.179528089490832
+22
+-121.09805072027484
+32
+185.36050953910777
+13
+14.179528089490832
+23
+-121.09805072027484
+33
+185.36050953910777
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+9.99005493690699
+20
+-126.08398315057711
+30
+183.72195733521303
+11
+11.429948657855315
+21
+-129.97714181252212
+31
+192.55936969520104
+12
+15.177383869062021
+22
+-123.03595965804155
+32
+192.71665367021444
+13
+15.177383869062021
+23
+-123.03595965804155
+33
+192.71665367021444
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+8.429384159711796
+20
+-133.70723623731567
+30
+192.91744172341822
+11
+7.805420073156758
+21
+-127.93366703466012
+31
+183.40860628248134
+12
+3.077165644469093
+22
+-130.85513320881313
+32
+183.21359849141206
+13
+3.077165644469093
+23
+-130.85513320881313
+33
+183.21359849141206
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+8.429384159711796
+20
+-133.70723623731567
+30
+192.91744172341822
+11
+3.077165644469093
+21
+-130.85513320881313
+31
+183.21359849141206
+12
+5.020550620048584
+22
+-135.9761412385478
+32
+192.25301580189816
+13
+5.020550620048584
+23
+-135.9761412385478
+33
+192.25301580189816
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+5.020550620048584
+20
+-135.9761412385478
+30
+192.25301580189816
+11
+3.077165644469093
+21
+-130.85513320881313
+31
+183.21359849141206
+12
+0.020623870886214313
+22
+-131.46358185489316
+32
+183.2364153156398
+13
+0.020623870886214313
+23
+-131.46358185489316
+33
+183.2364153156398
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+5.020550620048584
+20
+-135.9761412385478
+30
+192.25301580189816
+11
+0.020623870886214313
+21
+-131.46358185489316
+31
+183.2364153156398
+12
+0.020623870886214313
+22
+-137.63507647208488
+32
+192.17939351572218
+13
+0.020623870886214313
+23
+-137.63507647208488
+33
+192.17939351572218
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+3.077165644469093
+20
+-130.85513320881313
+30
+183.21359849141206
+11
+1.4489570675590133
+21
+-126.09523945052679
+31
+173.34185385552053
+12
+0.020623870886214313
+22
+-126.0115777616908
+32
+173.35317100033768
+13
+0.020623870886214313
+23
+-126.0115777616908
+33
+173.35317100033768
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+3.077165644469093
+20
+-130.85513320881313
+30
+183.21359849141206
+11
+0.020623870886214313
+21
+-126.0115777616908
+31
+173.35317100033768
+12
+0.020623870886214313
+22
+-131.46358185489316
+32
+183.2364153156398
+13
+0.020623870886214313
+23
+-131.46358185489316
+33
+183.2364153156398
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+7.805420073156758
+20
+-127.93366703466012
+30
+183.40860628248134
+11
+7.277590872682362
+21
+-124.83970566934076
+31
+173.59694595038994
+12
+1.4489570675590133
+22
+-126.09523945052679
+32
+173.34185385552053
+13
+1.4489570675590133
+23
+-126.09523945052679
+33
+173.34185385552053
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+7.805420073156758
+20
+-127.93366703466012
+30
+183.40860628248134
+11
+1.4489570675590133
+21
+-126.09523945052679
+31
+173.34185385552053
+12
+3.077165644469093
+22
+-130.85513320881313
+32
+183.21359849141206
+13
+3.077165644469093
+23
+-130.85513320881313
+33
+183.21359849141206
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+9.821514661942834
+20
+-123.65961952026906
+30
+174.68762057092107
+11
+14.179528089490832
+21
+-121.09805072027484
+31
+185.36050953910777
+12
+14.23976450545275
+22
+-119.52095182963338
+32
+177.18265551147002
+13
+14.23976450545275
+23
+-119.52095182963338
+33
+177.18265551147002
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+9.821514661942834
+20
+-123.65961952026906
+30
+174.68762057092107
+11
+9.99005493690699
+21
+-126.08398315057711
+31
+183.72195733521303
+12
+14.179528089490832
+22
+-121.09805072027484
+32
+185.36050953910777
+13
+14.179528089490832
+23
+-121.09805072027484
+33
+185.36050953910777
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+9.99005493690699
+20
+-126.08398315057711
+30
+183.72195733521303
+11
+9.821514661942834
+21
+-123.65961952026906
+31
+174.68762057092107
+12
+7.277590872682362
+22
+-124.83970566934076
+32
+173.59694595038994
+13
+7.277590872682362
+23
+-124.83970566934076
+33
+173.59694595038994
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+9.99005493690699
+20
+-126.08398315057711
+30
+183.72195733521303
+11
+7.277590872682362
+21
+-124.83970566934076
+31
+173.59694595038994
+12
+7.805420073156758
+22
+-127.93366703466012
+32
+183.40860628248134
+13
+7.805420073156758
+23
+-127.93366703466012
+33
+183.40860628248134
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+11.676978808163787
+20
+-124.29575257974366
+30
+166.9181876969637
+11
+9.100807240661085
+21
+-126.43810026259096
+31
+165.9333831408504
+12
+9.821514661942834
+22
+-123.65961952026906
+32
+174.68762057092107
+13
+9.821514661942834
+23
+-123.65961952026906
+33
+174.68762057092107
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+9.821514661942834
+20
+-123.65961952026906
+30
+174.68762057092107
+11
+9.100807240661085
+21
+-126.43810026259096
+31
+165.9333831408504
+12
+7.277590872682362
+22
+-124.83970566934076
+32
+173.59694595038994
+13
+7.277590872682362
+23
+-124.83970566934076
+33
+173.59694595038994
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+11.676978808163787
+20
+-124.29575257974366
+30
+166.9181876969637
+11
+14.23976450545275
+21
+-119.52095182963338
+31
+177.18265551147002
+12
+15.910260263265394
+22
+-119.0171563506772
+32
+169.66810177535595
+13
+15.910260263265394
+23
+-119.0171563506772
+33
+169.66810177535595
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+14.23976450545275
+20
+-119.52095182963338
+30
+177.18265551147002
+11
+11.676978808163787
+21
+-124.29575257974366
+31
+166.9181876969637
+12
+9.821514661942834
+22
+-123.65961952026906
+32
+174.68762057092107
+13
+9.821514661942834
+23
+-123.65961952026906
+33
+174.68762057092107
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+9.100807240661085
+20
+-126.43810026259096
+30
+165.9333831408504
+11
+3.571834393732133
+21
+-128.80314014990353
+31
+164.46543993731734
+12
+7.277590872682362
+22
+-124.83970566934076
+32
+173.59694595038994
+13
+7.277590872682362
+23
+-124.83970566934076
+33
+173.59694595038994
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+7.277590872682362
+20
+-124.83970566934076
+30
+173.59694595038994
+11
+3.571834393732133
+21
+-128.80314014990353
+31
+164.46543993731734
+12
+1.4489570675590133
+22
+-126.09523945052679
+32
+173.34185385552053
+13
+1.4489570675590133
+23
+-126.09523945052679
+33
+173.34185385552053
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+3.571834393732133
+20
+-128.80314014990353
+30
+164.46543993731734
+11
+0.020623870886214313
+21
+-128.29113061422737
+31
+164.5330690043292
+12
+1.4489570675590133
+22
+-126.09523945052679
+32
+173.34185385552053
+13
+1.4489570675590133
+23
+-126.09523945052679
+33
+173.34185385552053
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+1.4489570675590133
+20
+-126.09523945052679
+30
+173.34185385552053
+11
+0.020623870886214313
+21
+-128.29113061422737
+31
+164.5330690043292
+12
+0.020623870886214313
+22
+-126.0115777616908
+32
+173.35317100033768
+13
+0.020623870886214313
+23
+-126.0115777616908
+33
+173.35317100033768
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+3.571834393732133
+20
+-128.80314014990353
+30
+164.46543993731734
+11
+5.239592132637409
+21
+-131.55606604909187
+31
+162.03809490864495
+12
+0.020623870886214313
+22
+-132.4459221939837
+32
+161.3526775088357
+13
+0.020623870886214313
+23
+-132.4459221939837
+33
+161.3526775088357
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+0.020623870886214313
+20
+-128.29113061422737
+30
+164.5330690043292
+11
+3.571834393732133
+21
+-128.80314014990353
+31
+164.46543993731734
+12
+0.020623870886214313
+22
+-132.4459221939837
+32
+161.3526775088357
+13
+0.020623870886214313
+23
+-132.4459221939837
+33
+161.3526775088357
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+9.100807240661085
+20
+-126.43810026259096
+30
+165.9333831408504
+11
+10.4889828266926
+21
+-129.15543191598343
+31
+162.8574927003215
+12
+5.239592132637409
+22
+-131.55606604909187
+32
+162.03809490864495
+13
+5.239592132637409
+23
+-131.55606604909187
+33
+162.03809490864495
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+9.100807240661085
+20
+-126.43810026259096
+30
+165.9333831408504
+11
+5.239592132637409
+21
+-131.55606604909187
+31
+162.03809490864495
+12
+3.571834393732133
+22
+-128.80314014990353
+32
+164.46543993731734
+13
+3.571834393732133
+23
+-128.80314014990353
+33
+164.46543993731734
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+15.910260263265394
+20
+-119.0171563506772
+30
+169.66810177535595
+11
+18.68782833262058
+21
+-120.29641962905949
+31
+166.08552572480428
+12
+14.23550536493019
+22
+-126.56922094582075
+32
+163.52036707779402
+13
+14.23550536493019
+23
+-126.56922094582075
+33
+163.52036707779402
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+15.910260263265394
+20
+-119.0171563506772
+30
+169.66810177535595
+11
+14.23550536493019
+21
+-126.56922094582075
+31
+163.52036707779402
+12
+11.676978808163787
+22
+-124.29575257974366
+32
+166.9181876969637
+13
+11.676978808163787
+23
+-124.29575257974366
+33
+166.9181876969637
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+11.676978808163787
+20
+-124.29575257974366
+30
+166.9181876969637
+11
+14.23550536493019
+21
+-126.56922094582075
+31
+163.52036707779402
+12
+10.4889828266926
+22
+-129.15543191598343
+32
+162.8574927003215
+13
+10.4889828266926
+23
+-129.15543191598343
+33
+162.8574927003215
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+11.676978808163787
+20
+-124.29575257974366
+30
+166.9181876969637
+11
+10.4889828266926
+21
+-129.15543191598343
+31
+162.8574927003215
+12
+9.100807240661085
+22
+-126.43810026259096
+32
+165.9333831408504
+13
+9.100807240661085
+23
+-126.43810026259096
+33
+165.9333831408504
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+14.23550536493019
+20
+-126.56922094582075
+30
+163.52036707779402
+11
+15.77944380435818
+21
+-127.91632624824135
+31
+162.18342286776223
+12
+11.549508816810029
+22
+-130.8651726114679
+32
+161.52416875973364
+13
+11.549508816810029
+23
+-130.8651726114679
+33
+161.52416875973364
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+14.23550536493019
+20
+-126.56922094582075
+30
+163.52036707779402
+11
+11.549508816810029
+21
+-130.8651726114679
+31
+161.52416875973364
+12
+10.4889828266926
+22
+-129.15543191598343
+32
+162.8574927003215
+13
+10.4889828266926
+23
+-129.15543191598343
+33
+162.8574927003215
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+18.68782833262058
+20
+-120.29641962905949
+30
+166.08552572480428
+11
+22.13955750183241
+21
+-120.67700425718222
+31
+164.867807026972
+12
+15.77944380435818
+22
+-127.91632624824135
+32
+162.18342286776223
+13
+15.77944380435818
+23
+-127.91632624824135
+33
+162.18342286776223
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+18.68782833262058
+20
+-120.29641962905949
+30
+166.08552572480428
+11
+15.77944380435818
+21
+-127.91632624824135
+31
+162.18342286776223
+12
+14.23550536493019
+22
+-126.56922094582075
+32
+163.52036707779402
+13
+14.23550536493019
+23
+-126.56922094582075
+33
+163.52036707779402
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+10.4889828266926
+20
+-129.15543191598343
+30
+162.8574927003215
+11
+11.549508816810029
+21
+-130.8651726114679
+31
+161.52416875973364
+12
+5.509743331496922
+22
+-134.86998159996617
+32
+160.539181669026
+13
+5.509743331496922
+23
+-134.86998159996617
+33
+160.539181669026
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+10.4889828266926
+20
+-129.15543191598343
+30
+162.8574927003215
+11
+5.509743331496922
+21
+-134.86998159996617
+31
+160.539181669026
+12
+5.239592132637409
+22
+-131.55606604909187
+32
+162.03809490864495
+13
+5.239592132637409
+23
+-131.55606604909187
+33
+162.03809490864495
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+5.239592132637409
+20
+-131.55606604909187
+30
+162.03809490864495
+11
+5.509743331496922
+21
+-134.86998159996617
+31
+160.539181669026
+12
+0.020623870886214313
+22
+-135.82524597431177
+32
+160.4884066295105
+13
+0.020623870886214313
+23
+-135.82524597431177
+33
+160.4884066295105
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+5.239592132637409
+20
+-131.55606604909187
+30
+162.03809490864495
+11
+0.020623870886214313
+21
+-135.82524597431177
+31
+160.4884066295105
+12
+0.020623870886214313
+22
+-132.4459221939837
+32
+161.3526775088357
+13
+0.020623870886214313
+23
+-132.4459221939837
+33
+161.3526775088357
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+25.066195489477224
+20
+-104.29604558310436
+30
+206.64191360872937
+11
+21.25487317043209
+21
+-114.80699594413521
+31
+202.78769566013284
+12
+24.361916181639607
+22
+-115.96882863382584
+32
+205.60602978877503
+13
+24.361916181639607
+23
+-115.96882863382584
+33
+205.60602978877503
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+25.066195489477224
+20
+-104.29604558310436
+30
+206.64191360872937
+11
+24.361916181639607
+21
+-115.96882863382584
+31
+205.60602978877503
+12
+28.2651142462428
+22
+-106.94583943678283
+32
+207.53633311846602
+13
+28.2651142462428
+23
+-106.94583943678283
+33
+207.53633311846602
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+31.911242757877194
+20
+-109.21261486775394
+30
+207.76389291209964
+11
+31.224000012129835
+21
+-118.6575632008527
+31
+203.71679674269603
+12
+33.35296182476378
+22
+-110.50495979202749
+32
+206.40218484217198
+13
+33.35296182476378
+23
+-110.50495979202749
+33
+206.40218484217198
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+31.911242757877194
+20
+-109.21261486775394
+30
+207.76389291209964
+11
+28.281846584009994
+21
+-117.39807450346764
+31
+205.73562935038967
+12
+31.224000012129835
+22
+-118.6575632008527
+32
+203.71679674269603
+13
+31.224000012129835
+23
+-118.6575632008527
+33
+203.71679674269603
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+28.2651142462428
+20
+-106.94583943678283
+30
+207.53633311846602
+11
+24.361916181639607
+21
+-115.96882863382584
+31
+205.60602978877503
+12
+31.911242757877194
+22
+-109.21261486775394
+32
+207.76389291209964
+13
+31.911242757877194
+23
+-109.21261486775394
+33
+207.76389291209964
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+31.911242757877194
+20
+-109.21261486775394
+30
+207.76389291209964
+11
+24.361916181639607
+21
+-115.96882863382584
+31
+205.60602978877503
+12
+28.281846584009994
+22
+-117.39807450346764
+32
+205.73562935038967
+13
+28.281846584009994
+23
+-117.39807450346764
+33
+205.73562935038967
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+28.281846584009994
+20
+-117.39807450346764
+30
+205.73562935038967
+11
+26.643902828762645
+21
+-130.1061329254934
+31
+201.09894644293362
+12
+31.224000012129835
+22
+-118.6575632008527
+32
+203.71679674269603
+13
+31.224000012129835
+23
+-118.6575632008527
+33
+203.71679674269603
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+28.281846584009994
+20
+-117.39807450346764
+30
+205.73562935038967
+11
+24.078683336889352
+21
+-128.97593956540015
+31
+202.84671517879895
+12
+26.643902828762645
+22
+-130.1061329254934
+32
+201.09894644293362
+13
+26.643902828762645
+23
+-130.1061329254934
+33
+201.09894644293362
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+24.361916181639607
+20
+-115.96882863382584
+30
+205.60602978877503
+11
+20.74651432663226
+21
+-127.69393826810965
+31
+203.07092850487953
+12
+24.078683336889352
+22
+-128.97593956540015
+32
+202.84671517879895
+13
+24.078683336889352
+23
+-128.97593956540015
+33
+202.84671517879895
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+24.361916181639607
+20
+-115.96882863382584
+30
+205.60602978877503
+11
+24.078683336889352
+21
+-128.97593956540015
+31
+202.84671517879895
+12
+28.281846584009994
+22
+-117.39807450346764
+32
+205.73562935038967
+13
+28.281846584009994
+23
+-117.39807450346764
+33
+205.73562935038967
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+21.25487317043209
+20
+-114.80699594413521
+30
+202.78769566013284
+11
+18.249441083119926
+21
+-126.61576726725555
+31
+201.1929517587541
+12
+20.74651432663226
+22
+-127.69393826810965
+32
+203.07092850487953
+13
+20.74651432663226
+23
+-127.69393826810965
+33
+203.07092850487953
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+21.25487317043209
+20
+-114.80699594413521
+30
+202.78769566013284
+11
+20.74651432663226
+21
+-127.69393826810965
+31
+203.07092850487953
+12
+24.361916181639607
+22
+-115.96882863382584
+32
+205.60602978877503
+13
+24.361916181639607
+23
+-115.96882863382584
+33
+205.60602978877503
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+11.328337733959959
+20
+-149.81530569363937
+30
+200.01316983399903
+11
+0.020623870886214313
+21
+-151.22873189848332
+31
+200.34812081366556
+12
+10.240431554768916
+22
+-149.43198304660808
+32
+196.86444809053506
+13
+10.240431554768916
+23
+-149.43198304660808
+33
+196.86444809053506
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+10.240431554768916
+20
+-149.43198304660808
+30
+196.86444809053506
+11
+0.020623870886214313
+21
+-151.22873189848332
+31
+200.34812081366556
+12
+0.020623870886214313
+22
+-151.73344005040593
+32
+197.52248530126994
+13
+0.020623870886214313
+23
+-151.73344005040593
+33
+197.52248530126994
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+24.078683336889352
+20
+-128.97593956540015
+30
+202.84671517879895
+11
+20.74529742934009
+21
+-138.67856590011425
+31
+200.39071221889455
+12
+26.643902828762645
+22
+-130.1061329254934
+32
+201.09894644293362
+13
+26.643902828762645
+23
+-130.1061329254934
+33
+201.09894644293362
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+26.643902828762645
+20
+-130.1061329254934
+30
+201.09894644293362
+11
+20.74529742934009
+21
+-138.67856590011425
+31
+200.39071221889455
+12
+22.434350870858168
+22
+-139.43669291312938
+32
+198.40929920293482
+13
+22.434350870858168
+23
+-139.43669291312938
+33
+198.40929920293482
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+20.74529742934009
+20
+-138.67856590011425
+30
+200.39071221889455
+11
+17.20595165509274
+21
+-144.915468746757
+31
+199.67335126516434
+12
+22.434350870858168
+22
+-139.43669291312938
+32
+198.40929920293482
+13
+22.434350870858168
+23
+-139.43669291312938
+33
+198.40929920293482
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+17.87463671713465
+20
+-145.28053793440458
+30
+197.7345296544303
+11
+22.434350870858168
+21
+-139.43669291312938
+31
+198.40929920293482
+12
+17.20595165509274
+22
+-144.915468746757
+32
+199.67335126516434
+13
+17.20595165509274
+23
+-144.915468746757
+33
+199.67335126516434
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+17.87463671713465
+20
+-145.28053793440458
+30
+197.7345296544303
+11
+17.20595165509274
+21
+-144.915468746757
+31
+199.67335126516434
+12
+10.240431554768916
+22
+-149.43198304660808
+32
+196.86444809053506
+13
+10.240431554768916
+23
+-149.43198304660808
+33
+196.86444809053506
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+17.20595165509274
+20
+-144.915468746757
+30
+199.67335126516434
+11
+11.328337733959959
+21
+-149.81530569363937
+31
+200.01316983399903
+12
+10.240431554768916
+22
+-149.43198304660808
+32
+196.86444809053506
+13
+10.240431554768916
+23
+-149.43198304660808
+33
+196.86444809053506
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+15.601472575379768
+20
+-143.91974253744763
+30
+201.42568336587502
+11
+11.944391988115953
+21
+-148.4928425613849
+31
+201.5017394466341
+12
+17.20595165509274
+22
+-144.915468746757
+32
+199.67335126516434
+13
+17.20595165509274
+23
+-144.915468746757
+33
+199.67335126516434
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+17.20595165509274
+20
+-144.915468746757
+30
+199.67335126516434
+11
+11.944391988115953
+21
+-148.4928425613849
+31
+201.5017394466341
+12
+11.328337733959959
+22
+-149.81530569363937
+32
+200.01316983399903
+13
+11.328337733959959
+23
+-149.81530569363937
+33
+200.01316983399903
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+11.944391988115953
+20
+-148.4928425613849
+30
+201.5017394466341
+11
+0.020623870886214313
+21
+-148.9260579973937
+31
+201.15796596159876
+12
+11.328337733959959
+22
+-149.81530569363937
+32
+200.01316983399903
+13
+11.328337733959959
+23
+-149.81530569363937
+33
+200.01316983399903
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+0.020623870886214313
+20
+-148.9260579973937
+30
+201.15796596159876
+11
+0.020623870886214313
+21
+-151.22873189848332
+31
+200.34812081366556
+12
+11.328337733959959
+22
+-149.81530569363937
+32
+200.01316983399903
+13
+11.328337733959959
+23
+-149.81530569363937
+33
+200.01316983399903
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+18.581958268202637
+20
+-138.3134967124666
+30
+201.65658962706385
+11
+15.601472575379768
+21
+-143.91974253744763
+31
+201.42568336587502
+12
+20.74529742934009
+22
+-138.67856590011425
+32
+200.39071221889455
+13
+20.74529742934009
+23
+-138.67856590011425
+33
+200.39071221889455
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+20.74529742934009
+20
+-138.67856590011425
+30
+200.39071221889455
+11
+15.601472575379768
+21
+-143.91974253744763
+31
+201.42568336587502
+12
+17.20595165509274
+22
+-144.915468746757
+32
+199.67335126516434
+13
+17.20595165509274
+23
+-144.915468746757
+33
+199.67335126516434
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+20.74651432663226
+20
+-127.69393826810965
+30
+203.07092850487953
+11
+18.581958268202637
+21
+-138.3134967124666
+31
+201.65658962706385
+12
+24.078683336889352
+22
+-128.97593956540015
+32
+202.84671517879895
+13
+24.078683336889352
+23
+-128.97593956540015
+33
+202.84671517879895
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+24.078683336889352
+20
+-128.97593956540015
+30
+202.84671517879895
+11
+18.581958268202637
+21
+-138.3134967124666
+31
+201.65658962706385
+12
+20.74529742934009
+22
+-138.67856590011425
+32
+200.39071221889455
+13
+20.74529742934009
+23
+-138.67856590011425
+33
+200.39071221889455
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+18.249441083119926
+20
+-126.61576726725555
+30
+201.1929517587541
+11
+16.703068849107606
+21
+-136.36737371797994
+31
+202.04234606867934
+12
+20.74651432663226
+22
+-127.69393826810965
+32
+203.07092850487953
+13
+20.74651432663226
+23
+-127.69393826810965
+33
+203.07092850487953
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+20.74651432663226
+20
+-127.69393826810965
+30
+203.07092850487953
+11
+16.703068849107606
+21
+-136.36737371797994
+31
+202.04234606867934
+12
+18.581958268202637
+22
+-138.3134967124666
+32
+201.65658962706385
+13
+18.581958268202637
+23
+-138.3134967124666
+33
+201.65658962706385
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+16.703068849107606
+20
+-136.36737371797994
+30
+202.04234606867934
+11
+14.000339963220263
+21
+-140.97637221203564
+31
+201.53520412217017
+12
+18.581958268202637
+22
+-138.3134967124666
+32
+201.65658962706385
+13
+18.581958268202637
+23
+-138.3134967124666
+33
+201.65658962706385
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+18.581958268202637
+20
+-138.3134967124666
+30
+201.65658962706385
+11
+14.000339963220263
+21
+-140.97637221203564
+31
+201.53520412217017
+12
+15.601472575379768
+22
+-143.91974253744763
+32
+201.42568336587502
+13
+15.601472575379768
+23
+-143.91974253744763
+33
+201.42568336587502
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+14.000339963220263
+20
+-140.97637221203564
+30
+201.53520412217017
+11
+9.727509346123481
+21
+-144.56591499958478
+31
+202.31310571618278
+12
+15.601472575379768
+22
+-143.91974253744763
+32
+201.42568336587502
+13
+15.601472575379768
+23
+-143.91974253744763
+33
+201.42568336587502
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+15.601472575379768
+20
+-143.91974253744763
+30
+201.42568336587502
+11
+9.727509346123481
+21
+-144.56591499958478
+31
+202.31310571618278
+12
+11.944391988115953
+22
+-148.4928425613849
+32
+201.5017394466341
+13
+11.944391988115953
+23
+-148.4928425613849
+33
+201.5017394466341
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+9.727509346123481
+20
+-144.56591499958478
+30
+202.31310571618278
+11
+0.020623870886214313
+21
+-146.33497943806225
+31
+201.8722846720973
+12
+11.944391988115953
+22
+-148.4928425613849
+32
+201.5017394466341
+13
+11.944391988115953
+23
+-148.4928425613849
+33
+201.5017394466341
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+0.020623870886214313
+20
+-146.33497943806225
+30
+201.8722846720973
+11
+0.020623870886214313
+21
+-148.9260579973937
+31
+201.15796596159876
+12
+11.944391988115953
+22
+-148.4928425613849
+32
+201.5017394466341
+13
+11.944391988115953
+23
+-148.4928425613849
+33
+201.5017394466341
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+11.302782890824597
+20
+-138.52128192510213
+30
+198.7777148581365
+11
+7.584248990306675
+21
+-140.88571336376913
+31
+199.2763385235982
+12
+14.000339963220263
+22
+-140.97637221203564
+32
+201.53520412217017
+13
+14.000339963220263
+23
+-140.97637221203564
+33
+201.53520412217017
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+7.584248990306675
+20
+-140.88571336376913
+30
+199.2763385235982
+11
+9.727509346123481
+21
+-144.56591499958478
+31
+202.31310571618278
+12
+14.000339963220263
+22
+-140.97637221203564
+32
+201.53520412217017
+13
+14.000339963220263
+23
+-140.97637221203564
+33
+201.53520412217017
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+7.584248990306675
+20
+-140.88571336376913
+30
+199.2763385235982
+11
+0.020623870886214313
+21
+-143.56167050922897
+31
+199.26721179390637
+12
+9.727509346123481
+22
+-144.56591499958478
+32
+202.31310571618278
+13
+9.727509346123481
+23
+-144.56591499958478
+33
+202.31310571618278
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+0.020623870886214313
+20
+-143.56167050922897
+30
+199.26721179390637
+11
+0.020623870886214313
+21
+-146.33497943806225
+31
+201.8722846720973
+12
+9.727509346123481
+22
+-144.56591499958478
+32
+202.31310571618278
+13
+9.727509346123481
+23
+-144.56591499958478
+33
+202.31310571618278
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+14.202953362364912
+20
+-133.59010987294656
+30
+198.19177881196273
+11
+11.302782890824597
+21
+-138.52128192510213
+31
+198.7777148581365
+12
+16.703068849107606
+22
+-136.36737371797994
+32
+202.04234606867934
+13
+16.703068849107606
+23
+-136.36737371797994
+33
+202.04234606867934
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+16.703068849107606
+20
+-136.36737371797994
+30
+202.04234606867934
+11
+11.302782890824597
+21
+-138.52128192510213
+31
+198.7777148581365
+12
+14.000339963220263
+22
+-140.97637221203564
+32
+201.53520412217017
+13
+14.000339963220263
+23
+-140.97637221203564
+33
+201.53520412217017
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+16.432917650248104
+20
+-124.47129001414518
+30
+196.1513462773357
+11
+14.202953362364912
+21
+-133.59010987294656
+31
+198.19177881196273
+12
+18.249441083119926
+22
+-126.61576726725555
+32
+201.1929517587541
+13
+18.249441083119926
+23
+-126.61576726725555
+33
+201.1929517587541
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+14.202953362364912
+20
+-133.59010987294656
+30
+198.19177881196273
+11
+16.703068849107606
+21
+-136.36737371797994
+31
+202.04234606867934
+12
+18.249441083119926
+22
+-126.61576726725555
+32
+201.1929517587541
+13
+18.249441083119926
+23
+-126.61576726725555
+33
+201.1929517587541
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+11.429948657855315
+20
+-129.97714181252212
+30
+192.55936969520104
+11
+8.429384159711796
+21
+-133.70723623731567
+31
+192.91744172341822
+12
+14.202953362364912
+22
+-133.59010987294656
+32
+198.19177881196273
+13
+14.202953362364912
+23
+-133.59010987294656
+33
+198.19177881196273
+70
+0
+ 0
+3DFACE
+ 8
+jaw_half
+10
+14.202953362364912
+20
+-133.59010987294656
+30
+198.19177881196273
+11
+8.429384159711796
+21
+-133.70723623731567
+31
+192.91744172341822
+12
+11.302782890824597
+22
+-138.52128192510213
+32
+198.7777148581365
+13
+11.302782890824597
+23
+-138.52128192510213
+33
+198.7777148581365
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+43.459056918258014
+20
+-106.62524398251513
+30
+53.74337844848866
+11
+36.139489387443064
+21
+-111.1176281919382
+31
+45.64590759277577
+12
+50.55326107597861
+22
+-117.7466263876579
+32
+34.38709869384999
+13
+50.55326107597861
+23
+-117.7466263876579
+33
+34.38709869384999
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+149.05891423768966
+20
+107.43604409159036
+30
+25.579787445070696
+11
+149.84195139908925
+21
+74.64484730505322
+31
+8.71037139892812
+12
+152.70269307998663
+22
+94.70888173708776
+32
+14.83305969238515
+13
+152.70269307998663
+23
+94.70888173708776
+33
+14.83305969238515
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+136.91684205469312
+20
+116.01010142603424
+30
+59.96547927856679
+11
+163.68895116860156
+21
+95.7997915609867
+31
+51.1734771728539
+12
+162.52073906272327
+22
+84.04583053447682
+32
+29.084806060793355
+13
+162.52073906272327
+23
+84.04583053447682
+33
+29.084806060793355
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+128.8358048898519
+20
+130.40407786806043
+30
+66.76361083984608
+11
+136.91684205469312
+21
+116.01010142603424
+31
+59.96547927856679
+12
+149.05891423768966
+22
+107.43604409159036
+32
+25.579787445070696
+13
+149.05891423768966
+23
+107.43604409159036
+33
+25.579787445070696
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+66.28549279693662
+20
+142.6737698444664
+30
+36.184275817873434
+11
+69.81874575557137
+21
+140.72638469938852
+31
+22.699052429201558
+12
+40.879848516804095
+22
+147.6847047742757
+32
+20.258600616457414
+13
+40.879848516804095
+23
+147.6847047742757
+33
+20.258600616457414
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+25.971264578278895
+20
+-126.93007467404382
+30
+12.041272735598042
+11
+14.772368319333834
+21
+-125.86523022887934
+31
+10.28013992309804
+12
+22.036768218700455
+22
+-130.48219224049564
+32
+4.197274780275777
+13
+22.036768218700455
+23
+-130.48219224049564
+33
+4.197274780275777
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+177.1695251881023
+20
+16.252384509584317
+30
+130.34005966186757
+11
+158.7523056700532
+21
+10.39219245211727
+31
+139.12789535522694
+12
+169.2437445983676
+22
+3.1643723432239965
+32
+130.26525802612537
+13
+169.2437445983676
+23
+3.1643723432239965
+33
+130.26525802612537
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+148.0122511163535
+20
+-86.3805018985429
+30
+0.0
+11
+146.1497399372302
+21
+-92.59506898664439
+31
+9.398895263674214
+12
+141.8252948219265
+22
+-99.89843631624419
+32
+0.0
+13
+141.8252948219265
+23
+-99.89843631624419
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+155.86160142743745
+20
+100.5012077696673
+30
+93.72233352661367
+11
+165.4320775192345
+21
+94.2337211122594
+31
+50.25599441528554
+12
+142.77472455368599
+22
+103.1423655103349
+32
+87.52552185058828
+13
+142.77472455368599
+23
+103.1423655103349
+33
+87.52552185058828
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+104.29440029120694
+20
+-110.5122961912216
+30
+35.424632263185934
+11
+105.03443755955936
+21
+-122.74550505359352
+31
+8.50292282104726
+12
+116.6678811827417
+22
+-115.94492071125762
+32
+17.154235839846088
+13
+116.6678811827417
+23
+-115.94492071125762
+33
+17.154235839846088
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+142.77472455368599
+20
+103.1423655103349
+30
+87.52552185058828
+11
+165.4320775192345
+21
+94.2337211122594
+31
+50.25599441528554
+12
+163.68895116860156
+22
+95.7997915609867
+32
+51.1734771728539
+13
+163.68895116860156
+23
+95.7997915609867
+33
+51.1734771728539
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+65.84112982936476
+20
+-126.49859746656867
+30
+17.50547409057851
+11
+71.96375782213057
+21
+-132.6846066182198
+31
+0.0
+12
+75.38273873789217
+22
+-132.41127337391185
+32
+0.0
+13
+75.38273873789217
+23
+-132.41127337391185
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+71.96375782213057
+20
+-132.6846066182198
+30
+0.0
+11
+65.84112982936476
+21
+-126.49859746656867
+31
+17.50547409057851
+12
+48.40894733941087
+22
+-128.93939980687477
+32
+14.759420776369526
+13
+48.40894733941087
+23
+-128.93939980687477
+33
+14.759420776369526
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.54538361797512
+20
+98.52634993866302
+30
+39.72717971801991
+11
+149.82163298209082
+21
+100.87125763980181
+31
+32.81616744995351
+12
+147.9990534681572
+22
+102.40031360274811
+32
+34.89947052002187
+13
+147.9990534681572
+23
+102.40031360274811
+33
+34.89947052002187
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+155.86160142743745
+20
+100.5012077696673
+30
+93.72233352661367
+11
+181.80640547135968
+21
+84.44499116506961
+31
+44.30190048218007
+12
+165.4320775192345
+22
+94.2337211122594
+32
+50.25599441528554
+13
+165.4320775192345
+23
+94.2337211122594
+33
+50.25599441528554
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+125.54659463817633
+20
+110.00771531739322
+30
+102.28334197998281
+11
+142.77472455368599
+21
+103.1423655103349
+31
+87.52552185058828
+12
+140.7533405280837
+22
+104.2011442692092
+32
+86.52461395263906
+13
+140.7533405280837
+23
+104.2011442692092
+33
+86.52461395263906
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+170.4736803674982
+20
+68.64791972018268
+30
+9.755365753176166
+11
+178.772471908505
+21
+64.0519796591585
+31
+0.0
+12
+165.6747606034369
+22
+64.45795795272956
+32
+0.0
+13
+165.6747606034369
+23
+64.45795795272956
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+116.50178522879474
+20
+135.29668358544225
+30
+74.76031265259023
+11
+124.04344368630343
+21
+129.5907370521475
+31
+46.779074859621474
+12
+103.76048879519851
+22
+136.48234801755024
+32
+58.15231475830312
+13
+103.76048879519851
+23
+136.48234801755024
+33
+58.15231475830312
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+163.68895116860156
+20
+95.7997915609867
+30
+51.1734771728539
+11
+165.4320775192345
+21
+94.2337211122594
+31
+50.25599441528554
+12
+162.52073906272327
+22
+84.04583053447682
+32
+29.084806060793355
+13
+162.52073906272327
+23
+84.04583053447682
+33
+29.084806060793355
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+162.52073906272327
+20
+84.04583053447682
+30
+29.084806060793355
+11
+164.57315473233012
+21
+83.09039435795488
+31
+28.698007965090227
+12
+167.94206812840088
+22
+69.344496128591
+32
+10.257660675051167
+13
+167.94206812840088
+23
+69.344496128591
+33
+10.257660675051167
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+92.80332265180812
+20
+128.9520069214947
+30
+84.23550949096914
+11
+97.51366972732319
+21
+133.2224075207094
+31
+79.49422912597889
+12
+92.50636447374413
+22
+136.2549702313652
+32
+73.33927536010975
+13
+92.50636447374413
+23
+136.2549702313652
+33
+73.33927536010975
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+106.41944734345599
+20
+-85.05347040964502
+30
+77.157646942141
+11
+86.5439364674942
+21
+-91.4777750066287
+31
+70.90744705200429
+12
+102.48349968612156
+22
+-97.59497354638158
+32
+58.4178993225121
+13
+102.48349968612156
+23
+-97.59497354638158
+33
+58.4178993225121
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+20.07048807198763
+20
+-110.79623693436594
+30
+45.4297386169457
+11
+15.031408032972237
+21
+-112.72951831903971
+31
+39.629511260988664
+12
+26.52422657620338
+22
+-113.76011428459759
+32
+39.985206604006244
+13
+26.52422657620338
+23
+-113.76011428459759
+33
+39.985206604006244
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+138.13389095592626
+20
+-105.23847877066429
+30
+0.0
+11
+143.2440491556461
+21
+-97.11740736894173
+31
+22.868325042726948
+12
+135.2334332656079
+22
+-108.3308499386207
+32
+9.900608825685932
+13
+135.2334332656079
+23
+-108.3308499386207
+33
+9.900608825685932
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+143.2440491556461
+20
+-97.11740736894173
+30
+22.868325042726948
+11
+138.13389095592626
+21
+-105.23847877066429
+31
+0.0
+12
+140.21847266616777
+22
+-102.54417750642781
+32
+0.0
+13
+140.21847266616777
+23
+-102.54417750642781
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+162.52073906272327
+20
+84.04583053447682
+30
+29.084806060793355
+11
+167.94206812840088
+21
+69.344496128591
+31
+10.257660675051167
+12
+154.21711265481727
+22
+76.04300361825611
+32
+10.822936248781636
+13
+154.21711265481727
+23
+76.04300361825611
+33
+10.822936248781636
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+149.84195139908925
+20
+74.64484730505322
+30
+8.71037139892812
+11
+147.9990534681572
+21
+102.40031360274811
+31
+34.89947052002187
+12
+149.82163298209082
+22
+100.87125763980181
+32
+32.81616744995351
+13
+149.82163298209082
+23
+100.87125763980181
+33
+32.81616744995351
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+149.05891423768966
+20
+107.43604409159036
+30
+25.579787445070696
+11
+147.9990534681572
+21
+102.40031360274811
+31
+34.89947052002187
+12
+149.84195139908925
+22
+74.64484730505322
+32
+8.71037139892812
+13
+149.84195139908925
+23
+74.64484730505322
+33
+8.71037139892812
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+128.8358048898519
+20
+130.40407786806043
+30
+66.76361083984608
+11
+149.05891423768966
+21
+107.43604409159036
+31
+25.579787445070696
+12
+145.50744714167047
+22
+107.53670413376163
+32
+16.211463928224994
+13
+145.50744714167047
+23
+107.53670413376163
+33
+16.211463928224994
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+104.72919069896854
+20
+128.40165995503256
+30
+87.60904388427967
+11
+116.50178522879474
+21
+135.29668358544225
+31
+74.76031265259023
+12
+97.51366972732319
+22
+133.2224075207094
+32
+79.49422912597889
+13
+97.51366972732319
+23
+133.2224075207094
+33
+79.49422912597889
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+136.91684205469312
+20
+116.01010142603424
+30
+59.96547927856679
+11
+151.54538361797512
+21
+98.52634993866302
+31
+39.72717971801991
+12
+147.9990534681572
+22
+102.40031360274811
+32
+34.89947052002187
+13
+147.9990534681572
+23
+102.40031360274811
+33
+34.89947052002187
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+22.036768218700455
+20
+-130.48219224049564
+30
+4.197274780275777
+11
+12.050245852555303
+21
+-129.01603569433578
+31
+0.0
+12
+19.646401772745083
+22
+-131.1426020310535
+32
+0.0
+13
+19.646401772745083
+23
+-131.1426020310535
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+12.050245852555303
+20
+-129.01603569433578
+30
+0.0
+11
+22.036768218700455
+21
+-130.48219224049564
+31
+4.197274780275777
+12
+11.425038937320098
+22
+-128.08028181377028
+32
+2.401454162599995
+13
+11.425038937320098
+23
+-128.08028181377028
+33
+2.401454162599995
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+99.81399386175806
+20
+137.20697006426357
+30
+22.83160247802968
+11
+127.8380798450767
+21
+113.04186127667909
+31
+0.0
+12
+112.42160365107954
+22
+124.11047730445505
+32
+0.0
+13
+112.42160365107954
+23
+124.11047730445505
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+43.459056918258014
+20
+-106.62524398251513
+30
+53.74337844848866
+11
+62.838750673037524
+21
+-113.53807036048772
+31
+39.909242248537495
+12
+75.7057737846483
+22
+-108.47625498485674
+32
+45.636896514894914
+13
+75.7057737846483
+23
+-108.47625498485674
+33
+45.636896514894914
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+129.70283150728324
+20
+-95.55606676878932
+30
+52.52562332153554
+11
+127.4816729267906
+21
+-107.99558325301427
+31
+26.678751373293352
+12
+138.9529725482961
+22
+-97.86572867711725
+32
+38.147334289553115
+13
+138.9529725482961
+23
+-97.86572867711725
+33
+38.147334289553115
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+183.42379086336052
+20
+9.84540546391183
+30
+123.99170684814686
+11
+177.1695251881023
+21
+16.252384509584317
+31
+130.34005966186757
+12
+169.2437445983676
+22
+3.1643723432239965
+32
+130.26525802612537
+13
+169.2437445983676
+23
+3.1643723432239965
+33
+130.26525802612537
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+43.10536633646605
+20
+146.08214031643485
+30
+43.049651336672255
+11
+66.28549279693662
+21
+142.6737698444664
+31
+36.184275817873434
+12
+40.879848516804095
+22
+147.6847047742757
+32
+20.258600616457414
+13
+40.879848516804095
+23
+147.6847047742757
+33
+20.258600616457414
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+136.91684205469312
+20
+116.01010142603424
+30
+59.96547927856679
+11
+162.52073906272327
+21
+84.04583053447682
+31
+29.084806060793355
+12
+151.54538361797512
+22
+98.52634993866302
+32
+39.72717971801991
+13
+151.54538361797512
+23
+98.52634993866302
+33
+39.72717971801991
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+194.04204400752366
+20
+-29.31000193363566
+30
+111.22407531738514
+11
+192.24675941868443
+21
+-31.464257637280877
+31
+108.46978607177968
+12
+212.79099835266834
+22
+-43.18861000652798
+32
+72.74522247314687
+13
+212.79099835266834
+23
+-43.18861000652798
+33
+72.74522247314687
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+167.94206812840088
+20
+69.344496128591
+30
+10.257660675051167
+11
+165.6747606034369
+21
+64.45795795272956
+31
+0.0
+12
+165.2231583967426
+22
+64.53610516473599
+32
+0.0
+13
+165.2231583967426
+23
+64.53610516473599
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+165.6747606034369
+20
+64.45795795272956
+30
+0.0
+11
+167.94206812840088
+21
+69.344496128591
+31
+10.257660675051167
+12
+170.4736803674982
+22
+68.64791972018268
+32
+9.755365753176166
+13
+170.4736803674982
+23
+68.64791972018268
+33
+9.755365753176166
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+203.26135317129248
+20
+-59.96100273169112
+30
+32.90947570801015
+11
+195.68184683529105
+21
+-60.61467623209514
+31
+10.407845306398823
+12
+217.27927294666756
+22
+-54.026390900238226
+32
+23.449491119387105
+13
+217.27927294666756
+23
+-54.026390900238226
+33
+23.449491119387105
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+181.4744931903291
+20
+-68.48595559873871
+30
+51.26387863159413
+11
+178.4838918318595
+21
+-69.9756787612536
+31
+30.28424835205312
+12
+203.26135317129248
+22
+-59.96100273169112
+32
+32.90947570801015
+13
+203.26135317129248
+23
+-59.96100273169112
+33
+32.90947570801015
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+81.65900918452202
+20
+-49.753905305996085
+30
+127.85261459350819
+11
+73.30992256174021
+21
+-64.91956124198337
+31
+113.15273666382069
+12
+96.95989103267041
+22
+-55.539495505447455
+32
+119.62908554077381
+13
+96.95989103267041
+23
+-55.539495505447455
+33
+119.62908554077381
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+192.24675941868443
+20
+-31.464257637280877
+30
+108.46978607177968
+11
+175.97500274414864
+21
+-44.51732744019134
+31
+121.51366043091053
+12
+204.92696625684476
+22
+-54.8285987402056
+32
+79.67357864380116
+13
+204.92696625684476
+23
+-54.8285987402056
+33
+79.67357864380116
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+26.084822147336347
+20
+-124.7654486834366
+30
+14.77230758667226
+11
+25.971264578278895
+21
+-126.93007467404382
+31
+12.041272735598042
+12
+48.40894733941087
+22
+-128.93939980687477
+32
+14.759420776369526
+13
+48.40894733941087
+23
+-128.93939980687477
+33
+14.759420776369526
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+69.32230868953137
+20
+-96.9760356735265
+30
+66.93278656006093
+11
+59.210725004631314
+21
+-102.79888199127868
+31
+58.6892974853539
+12
+75.7057737846483
+22
+-108.47625498485674
+32
+45.636896514894914
+13
+75.7057737846483
+23
+-108.47625498485674
+33
+45.636896514894914
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+171.5991877387955
+20
+61.74787757767486
+30
+116.39614334106679
+11
+185.70556463529354
+21
+38.12799421867215
+31
+112.66933593750234
+12
+206.90302237282341
+22
+41.525801589094264
+32
+73.3891754150414
+13
+206.90302237282341
+23
+41.525801589094264
+33
+73.3891754150414
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+16.23002819403411
+20
+-108.85591227392446
+30
+49.2525672912621
+11
+15.031408032972237
+21
+-112.72951831903971
+31
+39.629511260988664
+12
+20.07048807198763
+22
+-110.79623693436594
+32
+45.4297386169457
+13
+20.07048807198763
+23
+-110.79623693436594
+33
+45.4297386169457
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+17.15698235956875
+20
+126.44660787160322
+30
+96.0854644775414
+11
+42.65015426787918
+21
+145.1170334507596
+31
+62.55756912231679
+12
+15.812821693331113
+22
+129.80722943027345
+32
+77.80402221679921
+13
+15.812821693331113
+23
+129.80722943027345
+33
+77.80402221679921
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+42.65015426787918
+20
+145.1170334507596
+30
+62.55756912231679
+11
+43.10536633646605
+21
+146.08214031643485
+31
+43.049651336672255
+12
+14.479430842981428
+22
+131.47894521043864
+32
+61.095739746096086
+13
+14.479430842981428
+23
+131.47894521043864
+33
+61.095739746096086
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+62.838750673037524
+20
+-113.53807036048772
+30
+39.909242248537495
+11
+50.55326107597861
+21
+-117.7466263876579
+31
+34.38709869384999
+12
+79.48342859322611
+22
+-121.90001834562811
+32
+22.241037750246477
+13
+79.48342859322611
+23
+-121.90001834562811
+33
+22.241037750246477
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+125.54659463817633
+20
+110.00771531739322
+30
+102.28334197998281
+11
+116.50178522879474
+21
+135.29668358544225
+31
+74.76031265259023
+12
+104.72919069896854
+22
+128.40165995503256
+32
+87.60904388427967
+13
+104.72919069896854
+23
+128.40165995503256
+33
+87.60904388427967
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+26.560487562687555
+20
+-102.0287785956587
+30
+65.98361968994374
+11
+27.15749465289185
+21
+-105.80300186201474
+31
+57.46921691894765
+12
+34.94790747236479
+22
+-103.92792391087916
+32
+60.97675476074453
+13
+34.94790747236479
+23
+-103.92792391087916
+33
+60.97675476074453
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+86.87753689957422
+20
+123.24066942718915
+30
+120.82242355346914
+11
+117.40105656268344
+21
+108.74435399057943
+31
+120.14184494018788
+12
+118.52139172890983
+22
+112.44507824166051
+32
+104.34513473510975
+13
+118.52139172890983
+23
+112.44507824166051
+33
+104.34513473510975
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+102.48349968612156
+20
+-97.59497354638158
+30
+58.4178993225121
+11
+88.93517068591554
+21
+-103.2111608482157
+31
+51.775087738039446
+12
+104.29440029120694
+22
+-110.5122961912216
+32
+35.424632263185934
+13
+104.29440029120694
+23
+-110.5122961912216
+33
+35.424632263185934
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+69.81845974147731
+20
+-87.62951670969532
+30
+80.83707351684804
+11
+69.32230868953137
+21
+-96.9760356735265
+31
+66.93278656006093
+12
+86.5439364674942
+22
+-91.4777750066287
+32
+70.90744705200429
+13
+86.5439364674942
+23
+-91.4777750066287
+33
+70.90744705200429
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+97.51366972732319
+20
+133.2224075207094
+30
+79.49422912597889
+11
+103.76048879519851
+21
+136.48234801755024
+31
+58.15231475830312
+12
+92.50636447374413
+22
+136.2549702313652
+32
+73.33927536010975
+13
+92.50636447374413
+23
+136.2549702313652
+33
+73.33927536010975
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+26.560487562687555
+20
+-102.0287785956587
+30
+65.98361968994374
+11
+18.608729393985758
+21
+-105.70742393838809
+31
+57.805824279787494
+12
+27.15749465289185
+22
+-105.80300186201474
+32
+57.46921691894765
+13
+27.15749465289185
+23
+-105.80300186201474
+33
+57.46921691894765
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+67.75847079221415
+20
+-79.75431990006238
+30
+93.67640609741444
+11
+69.81845974147731
+21
+-87.62951670969532
+31
+80.83707351684804
+12
+85.8715986664545
+22
+-82.864958784201
+32
+84.20305023193593
+13
+85.8715986664545
+23
+-82.864958784201
+33
+84.20305023193593
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+118.52139172890983
+20
+112.44507824166051
+30
+104.34513473510975
+11
+99.05089376025111
+21
+124.37416933837898
+31
+91.57227096557851
+12
+84.3550820718996
+22
+133.34903899754426
+32
+95.55749282837148
+13
+84.3550820718996
+23
+133.34903899754426
+33
+95.55749282837148
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+66.28549279693662
+20
+142.6737698444664
+30
+36.184275817873434
+11
+68.90056083146783
+21
+139.929915936223
+31
+35.54371414184804
+12
+69.81874575557137
+22
+140.72638469938852
+32
+22.699052429201558
+13
+69.81874575557137
+23
+140.72638469938852
+33
+22.699052429201558
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+18.608729393985758
+20
+-105.70742393838809
+30
+57.805824279787494
+11
+16.23002819403411
+21
+-108.85591227392446
+31
+49.2525672912621
+12
+27.15749465289185
+22
+-105.80300186201474
+32
+57.46921691894765
+13
+27.15749465289185
+23
+-105.80300186201474
+33
+57.46921691894765
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+206.90302237282341
+20
+41.525801589094264
+30
+73.3891754150414
+11
+207.42111896467648
+21
+39.80247149799231
+31
+73.9782867431664
+12
+216.55940293656835
+22
+38.63954366082398
+32
+39.57912673950429
+13
+216.55940293656835
+23
+38.63954366082398
+33
+39.57912673950429
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+68.90056083146783
+20
+139.929915936223
+30
+35.54371414184804
+11
+74.20944273647525
+21
+140.9556222801298
+31
+22.822494506838275
+12
+69.81874575557137
+22
+140.72638469938852
+32
+22.699052429201558
+13
+69.81874575557137
+23
+140.72638469938852
+33
+22.699052429201558
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+188.6310264567061
+20
+7.319584772449233
+30
+109.88568801880116
+11
+179.06865360224572
+21
+-1.9585758608936479
+31
+119.31311645508046
+12
+190.7825693092046
+22
+6.585408168874486
+32
+107.58137130737538
+13
+190.7825693092046
+23
+6.585408168874486
+33
+107.58137130737538
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+43.459056918258014
+20
+-106.62524398251513
+30
+53.74337844848866
+11
+50.55326107597861
+21
+-117.7466263876579
+31
+34.38709869384999
+12
+62.838750673037524
+22
+-113.53807036048772
+32
+39.909242248537495
+13
+62.838750673037524
+23
+-113.53807036048772
+33
+39.909242248537495
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.54538361797512
+20
+98.52634993866302
+30
+39.72717971801991
+11
+162.52073906272327
+21
+84.04583053447682
+31
+29.084806060793355
+12
+154.21711265481727
+22
+76.04300361825611
+32
+10.822936248781636
+13
+154.21711265481727
+23
+76.04300361825611
+33
+10.822936248781636
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+103.76048879519851
+20
+136.48234801755024
+30
+58.15231475830312
+11
+124.04344368630343
+21
+129.5907370521475
+31
+46.779074859621474
+12
+115.51295084007931
+22
+129.15121504102106
+32
+32.74126892090077
+13
+115.51295084007931
+23
+129.15121504102106
+33
+32.74126892090077
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+5.021595132014847
+20
+60.16540380598943
+30
+218.79938888550038
+11
+22.093585791120258
+21
+67.83927265790055
+31
+203.62473373413317
+12
+4.833565831436057
+22
+65.39217625737167
+32
+204.37294387817616
+13
+4.833565831436057
+23
+65.39217625737167
+33
+204.37294387817616
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+165.4320775192345
+20
+94.2337211122594
+30
+50.25599441528554
+11
+164.57315473233012
+21
+83.09039435795488
+31
+28.698007965090227
+12
+162.52073906272327
+22
+84.04583053447682
+32
+29.084806060793355
+13
+162.52073906272327
+23
+84.04583053447682
+33
+29.084806060793355
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+179.06865360224572
+20
+-1.9585758608936479
+30
+119.31311645508046
+11
+169.2437445983676
+21
+3.1643723432239965
+31
+130.26525802612537
+12
+145.93044157318866
+22
+-7.139309396805324
+32
+138.02621841430897
+13
+145.93044157318866
+23
+-7.139309396805324
+33
+138.02621841430897
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+116.50178522879474
+20
+135.29668358544225
+30
+74.76031265259023
+11
+128.8358048898519
+21
+130.40407786806043
+31
+66.76361083984608
+12
+124.04344368630343
+22
+129.5907370521475
+32
+46.779074859621474
+13
+124.04344368630343
+23
+129.5907370521475
+33
+46.779074859621474
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+128.8358048898519
+20
+130.40407786806043
+30
+66.76361083984608
+11
+145.50744714167047
+21
+107.53670413376163
+31
+16.211463928224994
+12
+124.04344368630343
+22
+129.5907370521475
+32
+46.779074859621474
+13
+124.04344368630343
+23
+129.5907370521475
+33
+46.779074859621474
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+102.48349968612156
+20
+-97.59497354638158
+30
+58.4178993225121
+11
+104.29440029120694
+21
+-110.5122961912216
+31
+35.424632263185934
+12
+116.52465528889452
+22
+-103.78036283040525
+32
+43.432864379885146
+13
+116.52465528889452
+23
+-103.78036283040525
+33
+43.432864379885146
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+149.82163298209082
+20
+100.87125763980181
+30
+32.81616744995351
+11
+147.2665788027299
+21
+73.40702723991632
+31
+10.569463348391011
+12
+149.84195139908925
+22
+74.64484730505322
+32
+8.71037139892812
+13
+149.84195139908925
+23
+74.64484730505322
+33
+8.71037139892812
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+80.57553070940972
+20
+147.50468839360968
+30
+59.22618331909413
+11
+99.81399386175806
+21
+137.20697006426357
+31
+22.83160247802968
+12
+74.20944273647525
+22
+140.9556222801298
+32
+22.822494506838275
+13
+74.20944273647525
+23
+140.9556222801298
+33
+22.822494506838275
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+34.94790747236479
+20
+-103.92792391087916
+30
+60.97675476074453
+11
+27.15749465289185
+21
+-105.80300186201474
+31
+57.46921691894765
+12
+43.459056918258014
+22
+-106.62524398251513
+32
+53.74337844848866
+13
+43.459056918258014
+23
+-106.62524398251513
+33
+53.74337844848866
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+74.20944273647525
+20
+140.9556222801298
+30
+22.822494506838275
+11
+112.42160365107954
+21
+124.11047730445505
+31
+0.0
+12
+103.12958334716033
+22
+125.47251047399183
+32
+0.0
+13
+103.12958334716033
+23
+125.47251047399183
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+112.42160365107954
+20
+124.11047730445505
+30
+0.0
+11
+74.20944273647525
+21
+140.9556222801298
+31
+22.822494506838275
+12
+99.81399386175806
+22
+137.20697006426357
+32
+22.83160247802968
+13
+99.81399386175806
+23
+137.20697006426357
+33
+22.83160247802968
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+142.77472455368599
+20
+103.1423655103349
+30
+87.52552185058828
+11
+163.68895116860156
+21
+95.7997915609867
+31
+51.1734771728539
+12
+140.7533405280837
+22
+104.2011442692092
+32
+86.52461395263906
+13
+140.7533405280837
+23
+104.2011442692092
+33
+86.52461395263906
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+80.57553070940972
+20
+147.50468839360968
+30
+59.22618331909413
+11
+74.20944273647525
+21
+140.9556222801298
+31
+22.822494506838275
+12
+68.90056083146783
+22
+139.929915936223
+32
+35.54371414184804
+13
+68.90056083146783
+23
+139.929915936223
+33
+35.54371414184804
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+46.8103967308179
+20
+-99.04532219628572
+30
+68.26613540649647
+11
+26.560487562687555
+21
+-102.0287785956587
+31
+65.98361968994374
+12
+46.211175362445296
+22
+-101.46793608642935
+32
+63.95254211426015
+13
+46.211175362445296
+23
+-101.46793608642935
+33
+63.95254211426015
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+190.7825693092046
+20
+6.585408168874486
+30
+107.58137130737538
+11
+179.06865360224572
+21
+-1.9585758608936479
+31
+119.31311645508046
+12
+181.84796302336758
+22
+-2.7564647629286942
+32
+117.17845993042225
+13
+181.84796302336758
+23
+-2.7564647629286942
+33
+117.17845993042225
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+188.6310264567061
+20
+7.319584772449233
+30
+109.88568801880116
+11
+169.2437445983676
+21
+3.1643723432239965
+31
+130.26525802612537
+12
+179.06865360224572
+22
+-1.9585758608936479
+32
+119.31311645508046
+13
+179.06865360224572
+23
+-1.9585758608936479
+33
+119.31311645508046
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+99.05089376025111
+20
+124.37416933837898
+30
+91.57227096557851
+11
+97.51366972732319
+21
+133.2224075207094
+31
+79.49422912597889
+12
+92.80332265180812
+22
+128.9520069214947
+32
+84.23550949096914
+13
+92.80332265180812
+23
+128.9520069214947
+33
+84.23550949096914
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+127.47606739636832
+20
+107.38791201849969
+30
+103.94302749634022
+11
+142.77472455368599
+21
+103.1423655103349
+31
+87.52552185058828
+12
+125.54659463817633
+22
+110.00771531739322
+32
+102.28334197998281
+13
+125.54659463817633
+23
+110.00771531739322
+33
+102.28334197998281
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+117.8541167606565
+20
+-39.13168745878485
+30
+124.1381126403832
+11
+81.65900918452202
+21
+-49.753905305996085
+31
+127.85261459350819
+12
+96.95989103267041
+22
+-55.539495505447455
+32
+119.62908554077381
+13
+96.95989103267041
+23
+-55.539495505447455
+33
+119.62908554077381
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+169.2437445983676
+20
+3.1643723432239965
+30
+130.26525802612537
+11
+188.6310264567061
+21
+7.319584772449233
+31
+109.88568801880116
+12
+183.42379086336052
+22
+9.84540546391183
+32
+123.99170684814686
+13
+183.42379086336052
+23
+9.84540546391183
+33
+123.99170684814686
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+79.48342859322611
+20
+-121.90001834562811
+30
+22.241037750246477
+11
+75.38273873789217
+21
+-132.41127337391185
+31
+0.0
+12
+77.45312482155377
+22
+-132.02853997457515
+32
+0.0
+13
+77.45312482155377
+23
+-132.02853997457515
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+75.38273873789217
+20
+-132.41127337391185
+30
+0.0
+11
+79.48342859322611
+21
+-121.90001834562811
+31
+22.241037750246477
+12
+65.84112982936476
+22
+-126.49859746656867
+32
+17.50547409057851
+13
+65.84112982936476
+23
+-126.49859746656867
+33
+17.50547409057851
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+110.39769380652112
+20
+-31.863111968658878
+30
+134.80296554565663
+11
+117.8541167606565
+21
+-39.13168745878485
+31
+124.1381126403832
+12
+155.13917668891582
+22
+-30.981157736293618
+32
+129.95035476684802
+13
+155.13917668891582
+23
+-30.981157736293618
+33
+129.95035476684802
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+142.02470427217827
+20
+-58.6224044304387
+30
+104.65141448974843
+11
+155.76732410166483
+21
+-69.69922117375971
+31
+74.86641082763906
+12
+181.4744931903291
+22
+-68.48595559873871
+32
+51.26387863159413
+13
+181.4744931903291
+23
+-68.48595559873871
+33
+51.26387863159413
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+129.70283150728324
+20
+-95.55606676878932
+30
+52.52562332153554
+11
+116.52465528889452
+21
+-103.78036283040525
+31
+43.432864379885146
+12
+127.4816729267906
+22
+-107.99558325301427
+32
+26.678751373293352
+13
+127.4816729267906
+23
+-107.99558325301427
+33
+26.678751373293352
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+138.9529725482961
+20
+-97.86572867711725
+30
+38.147334289553115
+11
+127.4816729267906
+21
+-107.99558325301427
+31
+26.678751373293352
+12
+143.2440491556461
+22
+-97.11740736894173
+32
+22.868325042726948
+13
+143.2440491556461
+23
+-97.11740736894173
+33
+22.868325042726948
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+43.48705246360705
+20
+-38.097247188751844
+30
+192.79961929321522
+11
+21.013271463404344
+21
+-47.65891868098439
+31
+167.59166183471913
+12
+35.20395226122179
+22
+-44.177943717035
+32
+170.79204788208241
+13
+35.20395226122179
+23
+-44.177943717035
+33
+170.79204788208241
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+66.87398344742765
+20
+15.726958497125281
+30
+190.68734512329334
+11
+56.866376229840064
+21
+-3.606717867156979
+31
+186.77653732300038
+12
+59.704893179039445
+22
+-3.212464677028903
+32
+170.29110946655507
+13
+59.704893179039445
+23
+-3.212464677028903
+33
+170.29110946655507
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+142.02470427217827
+20
+-58.6224044304387
+30
+104.65141448974843
+11
+181.4744931903291
+21
+-68.48595559873871
+31
+51.26387863159413
+12
+177.90722108584777
+22
+-60.58682893572308
+32
+94.6358436584496
+13
+177.90722108584777
+23
+-60.58682893572308
+33
+94.6358436584496
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+192.24675941868443
+20
+-31.464257637280877
+30
+108.46978607177968
+11
+204.92696625684476
+21
+-54.8285987402056
+31
+79.67357864380116
+12
+212.79099835266834
+22
+-43.18861000652798
+32
+72.74522247314687
+13
+212.79099835266834
+23
+-43.18861000652798
+33
+72.74522247314687
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+175.97500274414864
+20
+-44.51732744019134
+30
+121.51366043091053
+11
+177.90722108584777
+21
+-60.58682893572308
+31
+94.6358436584496
+12
+204.92696625684476
+22
+-54.8285987402056
+32
+79.67357864380116
+13
+204.92696625684476
+23
+-54.8285987402056
+33
+79.67357864380116
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+195.68184683529105
+20
+-60.61467623209514
+30
+10.407845306398823
+11
+192.07830358887924
+21
+-59.66898804374048
+31
+0.0
+12
+210.1935398476185
+22
+-57.76069933737556
+32
+0.0
+13
+210.1935398476185
+23
+-57.76069933737556
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+25.817439762173446
+20
+-65.92217639948196
+30
+119.06177520752186
+11
+7.283370867188594
+21
+-67.12465406874308
+31
+109.8533256530785
+12
+41.240996513155515
+22
+-72.46491864615655
+32
+105.22860794067616
+13
+41.240996513155515
+23
+-72.46491864615655
+33
+105.22860794067616
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+73.30992256174021
+20
+-64.91956124198337
+30
+113.15273666382069
+11
+67.75847079221415
+21
+-79.75431990006238
+31
+93.67640609741444
+12
+90.83398772969562
+22
+-65.80716423991764
+32
+104.28903350830312
+13
+90.83398772969562
+23
+-65.80716423991764
+33
+104.28903350830312
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+22.036768218700455
+20
+-130.48219224049564
+30
+4.197274780275777
+11
+19.646401772745083
+21
+-131.1426020310535
+31
+0.0
+12
+23.97241709557398
+22
+-132.2513945559714
+32
+0.0
+13
+23.97241709557398
+23
+-132.2513945559714
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+194.04204400752366
+20
+-29.31000193363566
+30
+111.22407531738514
+11
+212.79099835266834
+21
+-43.18861000652798
+31
+72.74522247314687
+12
+215.77580174640133
+22
+-40.78711231556601
+32
+73.87683944702383
+13
+215.77580174640133
+23
+-40.78711231556601
+33
+73.87683944702383
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+177.44058171764792
+20
+-25.20296687479118
+30
+122.59876861572499
+11
+155.13917668891582
+21
+-30.981157736293618
+31
+129.95035476684802
+12
+157.38086347444437
+22
+-32.99521923234534
+32
+128.583965301516
+13
+157.38086347444437
+23
+-32.99521923234534
+33
+128.583965301516
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+177.44058171764792
+20
+-25.20296687479118
+30
+122.59876861572499
+11
+174.23282962956503
+21
+-24.11531981420713
+31
+125.01528778076406
+12
+155.13917668891582
+22
+-30.981157736293618
+32
+129.95035476684802
+13
+155.13917668891582
+23
+-30.981157736293618
+33
+129.95035476684802
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+230.12333639944836
+20
+-25.312636344470338
+30
+80.34165802002187
+11
+215.77580174640133
+21
+-40.78711231556601
+31
+73.87683944702383
+12
+220.90651394503544
+22
+-52.87544335174036
+32
+24.26252288818593
+13
+220.90651394503544
+23
+-52.87544335174036
+33
+24.26252288818593
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+199.91219448828042
+20
+-15.002223562990654
+30
+116.19082641601796
+11
+215.77580174640133
+21
+-40.78711231556601
+31
+73.87683944702383
+12
+230.12333639944836
+22
+-25.312636344470338
+32
+80.34165802002187
+13
+230.12333639944836
+23
+-25.312636344470338
+33
+80.34165802002187
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+175.52766629968895
+20
+-12.841986541751243
+30
+125.19405593872304
+11
+192.24675941868443
+21
+-31.464257637280877
+31
+108.46978607177968
+12
+194.04204400752366
+22
+-29.31000193363566
+32
+111.22407531738514
+13
+194.04204400752366
+23
+-29.31000193363566
+33
+111.22407531738514
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+175.52766629968895
+20
+-12.841986541751243
+30
+125.19405593872304
+11
+172.14884901916346
+21
+-11.959810673170432
+31
+127.29993515014881
+12
+174.23282962956503
+22
+-24.11531981420713
+32
+125.01528778076406
+13
+174.23282962956503
+23
+-24.11531981420713
+33
+125.01528778076406
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+164.57315473233012
+20
+83.09039435795488
+30
+28.698007965090227
+11
+170.4736803674982
+21
+68.64791972018268
+31
+9.755365753176166
+12
+167.94206812840088
+22
+69.344496128591
+32
+10.257660675051167
+13
+167.94206812840088
+23
+69.344496128591
+33
+10.257660675051167
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+97.51366972732319
+20
+133.2224075207094
+30
+79.49422912597889
+11
+116.50178522879474
+21
+135.29668358544225
+31
+74.76031265259023
+12
+103.76048879519851
+22
+136.48234801755024
+32
+58.15231475830312
+13
+103.76048879519851
+23
+136.48234801755024
+33
+58.15231475830312
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+81.65900918452202
+20
+-49.753905305996085
+30
+127.85261459350819
+11
+57.3835020093576
+21
+-60.402598263590335
+31
+125.02236099243397
+12
+73.30992256174021
+22
+-64.91956124198337
+32
+113.15273666382069
+13
+73.30992256174021
+23
+-64.91956124198337
+33
+113.15273666382069
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+200.44433780671957
+20
+7.735200596684099
+30
+110.80937194824452
+11
+181.84796302336758
+21
+-2.7564647629286942
+31
+117.17845993042225
+12
+199.91219448828042
+22
+-15.002223562990654
+32
+116.19082641601796
+13
+199.91219448828042
+23
+-15.002223562990654
+33
+116.19082641601796
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+116.76651604955993
+20
+-91.57911387107508
+30
+64.5214996337914
+11
+116.52465528889452
+21
+-103.78036283040525
+31
+43.432864379885146
+12
+129.70283150728324
+22
+-95.55606676878932
+32
+52.52562332153554
+13
+129.70283150728324
+23
+-95.55606676878932
+33
+52.52562332153554
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+75.7057737846483
+20
+-108.47625498485674
+30
+45.636896514894914
+11
+92.15249443976691
+21
+-116.43319658662354
+31
+28.22700958252187
+12
+104.29440029120694
+22
+-110.5122961912216
+32
+35.424632263185934
+13
+104.29440029120694
+23
+-110.5122961912216
+33
+35.424632263185934
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+48.40894733941087
+20
+-128.93939980687477
+30
+14.759420776369526
+11
+45.74266097181742
+21
+-133.89022958965745
+31
+0.0
+12
+57.45734569729303
+22
+-133.9571306344953
+32
+0.0
+13
+57.45734569729303
+23
+-133.9571306344953
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+42.63913312726797
+20
+141.27697085673032
+30
+88.5086982727074
+11
+63.31394560770165
+21
+139.55192662667835
+31
+66.15037307739492
+12
+62.25607557757863
+22
+142.76034947971638
+32
+55.64859161377187
+13
+62.25607557757863
+23
+142.76034947971638
+33
+55.64859161377187
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+57.3835020093576
+20
+-60.402598263590335
+30
+125.02236099243397
+11
+41.240996513155515
+21
+-72.46491864615655
+31
+105.22860794067616
+12
+73.30992256174021
+22
+-64.91956124198337
+32
+113.15273666382069
+13
+73.30992256174021
+23
+-64.91956124198337
+33
+113.15273666382069
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+142.02470427217827
+20
+-58.6224044304387
+30
+104.65141448974843
+11
+147.24384931574625
+21
+-73.59370543322612
+31
+72.06997299194569
+12
+155.76732410166483
+22
+-69.69922117375971
+32
+74.86641082763906
+13
+155.76732410166483
+23
+-69.69922117375971
+33
+74.86641082763906
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+21.013271463404344
+20
+-47.65891868098439
+30
+167.59166183471913
+11
+15.073935543367746
+21
+-57.97883311479523
+31
+161.18546371460195
+12
+11.141953614717861
+22
+-52.17836390704888
+32
+146.17203903198475
+13
+11.141953614717861
+23
+-52.17836390704888
+33
+146.17203903198475
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+56.866376229840064
+20
+-3.606717867156979
+30
+186.77653732300038
+11
+47.82451221182149
+21
+-15.83145324597668
+31
+152.48676986694568
+12
+59.704893179039445
+22
+-3.212464677028903
+32
+170.29110946655507
+13
+59.704893179039445
+23
+-3.212464677028903
+33
+170.29110946655507
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+41.27965510873387
+20
+-78.87249693076602
+30
+96.07810058593984
+11
+27.875893683307226
+21
+-83.27461953190422
+31
+91.34263381958242
+12
+38.25772079362193
+22
+-89.2245185184614
+32
+83.51103820801015
+13
+38.25772079362193
+23
+-89.2245185184614
+33
+83.51103820801015
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+48.40894733941087
+20
+-128.93939980687477
+30
+14.759420776369526
+11
+57.45734569729303
+21
+-133.9571306344953
+31
+0.0
+12
+71.96375782213057
+22
+-132.6846066182198
+32
+0.0
+13
+71.96375782213057
+23
+-132.6846066182198
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+48.40894733941087
+20
+-128.93939980687477
+30
+14.759420776369526
+11
+39.71140082925173
+21
+-133.49337109749126
+31
+0.0
+12
+45.74266097181742
+22
+-133.89022958965745
+32
+0.0
+13
+45.74266097181742
+23
+-133.89022958965745
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+39.71140082925173
+20
+-133.49337109749126
+30
+0.0
+11
+48.40894733941087
+21
+-128.93939980687477
+31
+14.759420776369526
+12
+36.14720892522894
+22
+-130.96802308450057
+32
+6.595674896242573
+13
+36.14720892522894
+23
+-130.96802308450057
+33
+6.595674896242573
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+115.89121807283227
+20
+-66.26669706012112
+30
+99.34117660522695
+11
+67.75847079221415
+21
+-79.75431990006238
+31
+93.67640609741444
+12
+107.5861609794709
+22
+-74.35214677537962
+32
+91.62604675293203
+13
+107.5861609794709
+23
+-74.35214677537962
+33
+91.62604675293203
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+26.52422657620338
+20
+-113.76011428459759
+30
+39.985206604006244
+11
+27.836824299429516
+21
+-119.65623113768095
+31
+28.03225402832265
+12
+38.929793738139786
+22
+-120.10695540468434
+32
+30.042790222170307
+13
+38.929793738139786
+23
+-120.10695540468434
+33
+30.042790222170307
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+27.426427515545345
+20
+-122.12878952286687
+30
+21.99570388794179
+11
+21.3484940456724
+21
+-122.33706697923658
+31
+18.353678131105855
+12
+26.084822147336347
+22
+-124.7654486834366
+32
+14.77230758667226
+13
+26.084822147336347
+23
+-124.7654486834366
+33
+14.77230758667226
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+152.128744448052
+20
+-51.298572089357805
+30
+0.0
+11
+151.86293395995477
+21
+-50.52395270772306
+31
+1.3367230930671865
+12
+152.15906739988134
+22
+-51.737680245277545
+32
+0.0
+13
+152.15906739988134
+23
+-51.737680245277545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.86293395995477
+20
+-50.52395270772306
+30
+1.3367230930671865
+11
+152.128744448052
+21
+-51.298572089357805
+31
+0.0
+12
+151.83105470665396
+22
+-49.7244210622198
+32
+1.1898221896253005
+13
+151.83105470665396
+23
+-49.7244210622198
+33
+1.1898221896253005
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.82398169739437
+20
+-46.71373450373342
+30
+0.0
+11
+151.83105470665396
+21
+-49.7244210622198
+31
+1.1898221896253005
+12
+152.128744448052
+22
+-51.298572089357805
+32
+0.0
+13
+152.128744448052
+23
+-51.298572089357805
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.83105470665396
+20
+-49.7244210622198
+30
+1.1898221896253005
+11
+151.82398169739437
+21
+-46.71373450373342
+31
+0.0
+12
+151.7059043983753
+22
+-46.225900788401866
+32
+0.5278777213003935
+13
+151.7059043983753
+23
+-46.225900788401866
+33
+0.5278777213003935
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+27.426427515545345
+20
+-122.12878952286687
+30
+21.99570388794179
+11
+26.084822147336347
+21
+-124.7654486834366
+31
+14.77230758667226
+12
+48.40894733941087
+22
+-128.93939980687477
+32
+14.759420776369526
+13
+48.40894733941087
+23
+-128.93939980687477
+33
+14.759420776369526
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+152.39520845532402
+20
+-55.30836606889562
+30
+0.0
+11
+152.39706333724124
+21
+-58.07542692235853
+31
+1.1216873168968704
+12
+152.1215005230635
+22
+-58.81014504875605
+32
+0.0
+13
+152.1215005230635
+23
+-58.81014504875605
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+31.038943919519323
+20
+-96.19312892619786
+30
+74.74606933593984
+11
+26.560487562687555
+21
+-102.0287785956587
+31
+65.98361968994374
+12
+45.068002981338275
+22
+-96.01101638976473
+32
+73.36068878174062
+13
+45.068002981338275
+23
+-96.01101638976473
+33
+73.36068878174062
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+43.459056918258014
+20
+-106.62524398251513
+30
+53.74337844848866
+11
+28.208062084038428
+21
+-107.28267169965386
+31
+53.25455169677968
+12
+27.16720389118873
+22
+-109.03501391067739
+32
+49.50885009765859
+13
+27.16720389118873
+23
+-109.03501391067739
+33
+49.50885009765859
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+14.772368319333834
+20
+-125.86523022887934
+30
+10.28013992309804
+11
+8.697919079694389
+21
+-125.02888176130455
+31
+8.063802337648823
+12
+11.425038937320098
+22
+-128.08028181377028
+32
+2.401454162599995
+13
+11.425038937320098
+23
+-128.08028181377028
+33
+2.401454162599995
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+45.068002981338275
+20
+-96.01101638976473
+30
+73.36068878174062
+11
+26.560487562687555
+21
+-102.0287785956587
+31
+65.98361968994374
+12
+46.8103967308179
+22
+-99.04532219628572
+32
+68.26613540649647
+13
+46.8103967308179
+23
+-99.04532219628572
+33
+68.26613540649647
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+43.459056918258014
+20
+-106.62524398251513
+30
+53.74337844848866
+11
+27.16720389118873
+21
+-109.03501391067739
+31
+49.50885009765859
+12
+36.139489387443064
+22
+-111.1176281919382
+32
+45.64590759277577
+13
+36.139489387443064
+23
+-111.1176281919382
+33
+45.64590759277577
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+38.25772079362193
+20
+-89.2245185184614
+30
+83.51103820801015
+11
+31.038943919519323
+21
+-96.19312892619786
+31
+74.74606933593984
+12
+45.068002981338275
+22
+-96.01101638976473
+32
+73.36068878174062
+13
+45.068002981338275
+23
+-96.01101638976473
+33
+73.36068878174062
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+38.25772079362193
+20
+-89.2245185184614
+30
+83.51103820801015
+11
+45.068002981338275
+21
+-96.01101638976473
+31
+73.36068878174062
+12
+56.59145931336226
+22
+-92.05718658181614
+32
+76.87791595459218
+13
+56.59145931336226
+23
+-92.05718658181614
+33
+76.87791595459218
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+86.5439364674942
+20
+-91.4777750066287
+30
+70.90744705200429
+11
+69.32230868953137
+21
+-96.9760356735265
+31
+66.93278656006093
+12
+102.48349968612156
+22
+-97.59497354638158
+32
+58.4178993225121
+13
+102.48349968612156
+23
+-97.59497354638158
+33
+58.4178993225121
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+14.774208697011588
+20
+133.66629357036655
+30
+1.2406723022484327
+11
+20.575701115493853
+21
+136.42040759421332
+31
+0.0
+12
+15.527347551586262
+22
+133.93917071254708
+32
+0.0
+13
+15.527347551586262
+23
+133.93917071254708
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+180.965843781971
+20
+37.978046827702755
+30
+117.69906768799062
+11
+177.1695251881023
+21
+16.252384509584317
+31
+130.34005966186757
+12
+188.47690987917392
+22
+22.19452590733552
+32
+115.46267318725819
+13
+188.47690987917392
+23
+22.19452590733552
+33
+115.46267318725819
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+150.70614040521917
+20
+-64.76392910432827
+30
+16.117283757091627
+11
+153.34938233885683
+21
+-53.25682195518751
+31
+0.0
+12
+157.33717382266084
+22
+-56.943471056583014
+32
+0.0
+13
+157.33717382266084
+23
+-56.943471056583014
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+153.34938233885683
+20
+-53.25682195518751
+30
+0.0
+11
+150.70614040521917
+21
+-64.76392910432827
+31
+16.117283757091627
+12
+151.99282971390107
+22
+-53.6510444314634
+32
+1.9043187908133887
+13
+151.99282971390107
+23
+-53.6510444314634
+33
+1.9043187908133887
+70
+3
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.99282971390107
+20
+-53.6510444314634
+30
+1.9043187908133887
+11
+150.70614040521917
+21
+-64.76392910432827
+31
+16.117283757091627
+12
+151.73969782888256
+22
+-55.4679838928378
+32
+4.273786833903068
+13
+151.73969782888256
+23
+-55.4679838928378
+33
+4.273786833903068
+70
+3
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.73969782888256
+20
+-55.4679838928378
+30
+4.273786833903068
+11
+150.70614040521917
+21
+-64.76392910432827
+31
+16.117283757091627
+12
+150.99607242735328
+22
+-60.62180226091683
+32
+11.022223510894767
+13
+150.99607242735328
+23
+-60.62180226091683
+33
+11.022223510894767
+70
+13
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.73969782888256
+20
+-55.4679838928378
+30
+4.273786833903068
+11
+150.99607242735328
+21
+-60.62180226091683
+31
+11.022223510894767
+12
+151.12401289416775
+22
+-58.333602270866876
+32
+8.242019868940874
+13
+151.12401289416775
+23
+-58.333602270866876
+33
+8.242019868940874
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+204.92696625684476
+20
+-54.8285987402056
+30
+79.67357864380116
+11
+181.4744931903291
+21
+-68.48595559873871
+31
+51.26387863159413
+12
+203.26135317129248
+22
+-59.96100273169112
+32
+32.90947570801015
+13
+203.26135317129248
+23
+-59.96100273169112
+33
+32.90947570801015
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+177.44058171764792
+20
+-25.20296687479118
+30
+122.59876861572499
+11
+157.38086347444437
+21
+-32.99521923234534
+31
+128.583965301516
+12
+175.97500274414864
+22
+-44.51732744019134
+32
+121.51366043091053
+13
+175.97500274414864
+23
+-44.51732744019134
+33
+121.51366043091053
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+217.27927294666756
+20
+-54.026390900238226
+30
+23.449491119387105
+11
+210.1935398476185
+21
+-57.76069933737556
+31
+0.0
+12
+219.2931652251469
+22
+-55.43566949142061
+32
+0.0
+13
+219.2931652251469
+23
+-55.43566949142061
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+210.1935398476185
+20
+-57.76069933737556
+30
+0.0
+11
+217.27927294666756
+21
+-54.026390900238226
+31
+23.449491119387105
+12
+195.68184683529105
+22
+-60.61467623209514
+32
+10.407845306398823
+13
+195.68184683529105
+23
+-60.61467623209514
+33
+10.407845306398823
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+43.17729952139854
+20
+51.476876083977146
+30
+218.74144668579333
+11
+61.88632852366842
+21
+36.69060276970931
+31
+216.74738235473865
+12
+63.57122586152329
+22
+38.00335722457329
+32
+204.2099693298363
+13
+63.57122586152329
+23
+38.00335722457329
+33
+204.2099693298363
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+155.13917668891582
+20
+-30.981157736293618
+30
+129.95035476684802
+11
+145.93044157318866
+21
+-7.139309396805324
+31
+138.02621841430897
+12
+110.39769380652112
+22
+-31.863111968658878
+32
+134.80296554565663
+13
+110.39769380652112
+23
+-31.863111968658878
+33
+134.80296554565663
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+180.965843781971
+20
+37.978046827702755
+30
+117.69906768799062
+11
+142.1847572847631
+21
+40.136738826247395
+31
+150.753154754641
+12
+177.1695251881023
+22
+16.252384509584317
+32
+130.34005966186757
+13
+177.1695251881023
+23
+16.252384509584317
+33
+130.34005966186757
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+20.215178337996353
+20
+59.061841770943715
+30
+219.07999191284412
+11
+45.59512079689039
+21
+55.00301251378399
+31
+207.69754714966052
+12
+22.093585791120258
+22
+67.83927265790055
+32
+203.62473373413317
+13
+22.093585791120258
+23
+67.83927265790055
+33
+203.62473373413317
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+187.79550715156142
+20
+78.67726546390548
+30
+89.17464599609609
+11
+155.86160142743745
+21
+100.5012077696673
+31
+93.72233352661367
+12
+136.8857172785656
+22
+92.0750762436121
+32
+113.61249542236561
+13
+136.8857172785656
+23
+92.0750762436121
+33
+113.61249542236561
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+69.32230868953137
+20
+-96.9760356735265
+30
+66.93278656006093
+11
+88.93517068591554
+21
+-103.2111608482157
+31
+51.775087738039446
+12
+102.48349968612156
+22
+-97.59497354638158
+32
+58.4178993225121
+13
+102.48349968612156
+23
+-97.59497354638158
+33
+58.4178993225121
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+42.63913312726797
+20
+141.27697085673032
+30
+88.5086982727074
+11
+66.46316783675442
+21
+138.20167265170429
+31
+76.33250350952382
+12
+63.31394560770165
+22
+139.55192662667835
+32
+66.15037307739492
+13
+63.31394560770165
+23
+139.55192662667835
+33
+66.15037307739492
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+178.4838918318595
+20
+-69.9756787612536
+30
+30.28424835205312
+11
+175.4888346369488
+21
+-69.69151204847134
+31
+15.290202331545308
+12
+195.68184683529105
+22
+-60.61467623209514
+32
+10.407845306398823
+13
+195.68184683529105
+23
+-60.61467623209514
+33
+10.407845306398823
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+127.09106678978468
+20
+-61.97292208427616
+30
+105.03201141357656
+11
+115.89121807283227
+21
+-66.26669706012112
+31
+99.34117660522695
+12
+147.24384931574625
+22
+-73.59370543322612
+32
+72.06997299194569
+13
+147.24384931574625
+23
+-73.59370543322612
+33
+72.06997299194569
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+7.283370867188594
+20
+-67.12465406874308
+30
+109.8533256530785
+11
+16.455430776891372
+21
+-77.79196741958572
+31
+98.03563613891835
+12
+41.240996513155515
+22
+-72.46491864615655
+32
+105.22860794067616
+13
+41.240996513155515
+23
+-72.46491864615655
+33
+105.22860794067616
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+163.68895116860156
+20
+95.7997915609867
+30
+51.1734771728539
+11
+136.91684205469312
+21
+116.01010142603424
+31
+59.96547927856679
+12
+128.8358048898519
+22
+130.40407786806043
+32
+66.76361083984608
+13
+128.8358048898519
+23
+130.40407786806043
+33
+66.76361083984608
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+155.76732410166483
+20
+-69.69922117375971
+30
+74.86641082763906
+11
+151.3061315778026
+21
+-73.13826370527374
+31
+55.18243789673085
+12
+181.4744931903291
+22
+-68.48595559873871
+32
+51.26387863159413
+13
+181.4744931903291
+23
+-68.48595559873871
+33
+51.26387863159413
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+116.52465528889452
+20
+-103.78036283040525
+30
+43.432864379885146
+11
+104.29440029120694
+21
+-110.5122961912216
+31
+35.424632263185934
+12
+127.4816729267906
+22
+-107.99558325301427
+32
+26.678751373293352
+13
+127.4816729267906
+23
+-107.99558325301427
+33
+26.678751373293352
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+118.52139172890983
+20
+112.44507824166051
+30
+104.34513473510975
+11
+127.47606739636832
+21
+107.38791201849969
+31
+103.94302749634022
+12
+125.54659463817633
+22
+110.00771531739322
+32
+102.28334197998281
+13
+125.54659463817633
+23
+110.00771531739322
+33
+102.28334197998281
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+88.93517068591554
+20
+-103.2111608482157
+30
+51.775087738039446
+11
+75.7057737846483
+21
+-108.47625498485674
+31
+45.636896514894914
+12
+104.29440029120694
+22
+-110.5122961912216
+32
+35.424632263185934
+13
+104.29440029120694
+23
+-110.5122961912216
+33
+35.424632263185934
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.3061315778026
+20
+-73.13826370527374
+30
+55.18243789673085
+11
+178.4838918318595
+21
+-69.9756787612536
+31
+30.28424835205312
+12
+181.4744931903291
+22
+-68.48595559873871
+32
+51.26387863159413
+13
+181.4744931903291
+23
+-68.48595559873871
+33
+51.26387863159413
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+69.81874575557137
+20
+140.72638469938852
+30
+22.699052429201558
+11
+67.45071519615227
+21
+133.35320891176647
+31
+0.0
+12
+43.42479622420087
+22
+144.46311338420125
+32
+0.0
+13
+43.42479622420087
+23
+144.46311338420125
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+104.29440029120694
+20
+-110.5122961912216
+30
+35.424632263185934
+11
+116.6678811827417
+21
+-115.94492071125762
+31
+17.154235839846088
+12
+127.4816729267906
+22
+-107.99558325301427
+32
+26.678751373293352
+13
+127.4816729267906
+23
+-107.99558325301427
+33
+26.678751373293352
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+91.94904520730577
+20
+-128.63334174911296
+30
+1.426610565187886
+11
+77.45312482155377
+21
+-132.02853997457515
+31
+0.0
+12
+87.43983444241641
+22
+-130.11991335792678
+32
+0.0
+13
+87.43983444241641
+23
+-130.11991335792678
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+77.45312482155377
+20
+-132.02853997457515
+30
+0.0
+11
+91.94904520730577
+21
+-128.63334174911296
+31
+1.426610565187886
+12
+79.48342859322611
+22
+-121.90001834562811
+32
+22.241037750246477
+13
+79.48342859322611
+23
+-121.90001834562811
+33
+22.241037750246477
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+40.879848516804095
+20
+147.6847047742757
+30
+20.258600616457414
+11
+43.42479622420087
+21
+144.46311338420125
+31
+0.0
+12
+39.19917507961585
+22
+145.5245815926033
+32
+0.0
+13
+39.19917507961585
+23
+145.5245815926033
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+43.42479622420087
+20
+144.46311338420125
+30
+0.0
+11
+40.879848516804095
+21
+147.6847047742757
+31
+20.258600616457414
+12
+69.81874575557137
+22
+140.72638469938852
+32
+22.699052429201558
+13
+69.81874575557137
+23
+140.72638469938852
+33
+22.699052429201558
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+174.23282962956503
+20
+-24.11531981420713
+30
+125.01528778076406
+11
+145.93044157318866
+21
+-7.139309396805324
+31
+138.02621841430897
+12
+155.13917668891582
+22
+-30.981157736293618
+32
+129.95035476684802
+13
+155.13917668891582
+23
+-30.981157736293618
+33
+129.95035476684802
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+174.23282962956503
+20
+-24.11531981420713
+30
+125.01528778076406
+11
+172.14884901916346
+21
+-11.959810673170432
+31
+127.29993515014881
+12
+145.93044157318866
+22
+-7.139309396805324
+32
+138.02621841430897
+13
+145.93044157318866
+23
+-7.139309396805324
+33
+138.02621841430897
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+195.68184683529105
+20
+-60.61467623209514
+30
+10.407845306398823
+11
+186.85150751151173
+21
+-61.73100454253733
+31
+0.0
+12
+192.07830358887924
+22
+-59.66898804374048
+32
+0.0
+13
+192.07830358887924
+23
+-59.66898804374048
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+186.85150751151173
+20
+-61.73100454253733
+30
+0.0
+11
+195.68184683529105
+21
+-60.61467623209514
+31
+10.407845306398823
+12
+175.4888346369488
+22
+-69.69151204847134
+32
+15.290202331545308
+13
+175.4888346369488
+23
+-69.69151204847134
+33
+15.290202331545308
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+199.91219448828042
+20
+-15.002223562990654
+30
+116.19082641601796
+11
+181.84796302336758
+21
+-2.7564647629286942
+31
+117.17845993042225
+12
+175.52766629968895
+22
+-12.841986541751243
+32
+125.19405593872304
+13
+175.52766629968895
+23
+-12.841986541751243
+33
+125.19405593872304
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+192.24675941868443
+20
+-31.464257637280877
+30
+108.46978607177968
+11
+177.44058171764792
+21
+-25.20296687479118
+31
+122.59876861572499
+12
+175.97500274414864
+22
+-44.51732744019134
+32
+121.51366043091053
+13
+175.97500274414864
+23
+-44.51732744019134
+33
+121.51366043091053
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+59.210725004631314
+20
+-102.79888199127868
+30
+58.6892974853539
+11
+43.459056918258014
+21
+-106.62524398251513
+31
+53.74337844848866
+12
+75.7057737846483
+22
+-108.47625498485674
+32
+45.636896514894914
+13
+75.7057737846483
+23
+-108.47625498485674
+33
+45.636896514894914
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+175.4888346369488
+20
+-69.69151204847134
+30
+15.290202331545308
+11
+170.69633316787034
+21
+-62.611042677899285
+31
+0.0
+12
+186.85150751151173
+22
+-61.73100454253733
+32
+0.0
+13
+186.85150751151173
+23
+-61.73100454253733
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+215.77580174640133
+20
+-40.78711231556601
+30
+73.87683944702383
+11
+217.27927294666756
+21
+-54.026390900238226
+31
+23.449491119387105
+12
+220.90651394503544
+22
+-52.87544335174036
+32
+24.26252288818593
+13
+220.90651394503544
+23
+-52.87544335174036
+33
+24.26252288818593
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+224.0704983034566
+20
+-51.20458580847195
+30
+0.0
+11
+220.90651394503544
+21
+-52.87544335174036
+31
+24.26252288818593
+12
+220.1168090085038
+22
+-55.19014345471434
+32
+0.0
+13
+220.1168090085038
+23
+-55.19014345471434
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+220.90651394503544
+20
+-52.87544335174036
+30
+24.26252288818593
+11
+224.0704983034566
+21
+-51.20458580847195
+31
+0.0
+12
+236.07976970600353
+22
+-37.84789037714662
+32
+19.98071060180898
+13
+236.07976970600353
+23
+-37.84789037714662
+33
+19.98071060180898
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+215.77580174640133
+20
+-40.78711231556601
+30
+73.87683944702383
+11
+212.79099835266834
+21
+-43.18861000652798
+31
+72.74522247314687
+12
+217.27927294666756
+22
+-54.026390900238226
+32
+23.449491119387105
+13
+217.27927294666756
+23
+-54.026390900238226
+33
+23.449491119387105
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+57.3835020093576
+20
+-60.402598263590335
+30
+125.02236099243397
+11
+25.817439762173446
+21
+-65.92217639948196
+31
+119.06177520752186
+12
+41.240996513155515
+22
+-72.46491864615655
+32
+105.22860794067616
+13
+41.240996513155515
+23
+-72.46491864615655
+33
+105.22860794067616
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+203.26135317129248
+20
+-59.96100273169112
+30
+32.90947570801015
+11
+178.4838918318595
+21
+-69.9756787612536
+31
+30.28424835205312
+12
+195.68184683529105
+22
+-60.61467623209514
+32
+10.407845306398823
+13
+195.68184683529105
+23
+-60.61467623209514
+33
+10.407845306398823
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+236.07976970600353
+20
+-37.84789037714662
+30
+19.98071060180898
+11
+224.0704983034566
+21
+-51.20458580847195
+31
+0.0
+12
+236.7712918935554
+22
+-40.02417113138695
+32
+0.0
+13
+236.7712918935554
+23
+-40.02417113138695
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+149.06284587784322
+20
+-68.59937853389094
+30
+22.694836617139387
+11
+157.33717382266084
+21
+-56.943471056583014
+31
+0.0
+12
+165.28900544160132
+22
+-61.760633255050024
+32
+0.0
+13
+165.28900544160132
+23
+-61.760633255050024
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+157.33717382266084
+20
+-56.943471056583014
+30
+0.0
+11
+149.06284587784322
+21
+-68.59937853389094
+31
+22.694836617139387
+12
+150.58698481467096
+22
+-65.5049674350578
+32
+17.22452256429279
+13
+150.58698481467096
+23
+-65.5049674350578
+33
+17.22452256429279
+70
+15
+ 0
+3DFACE
+ 8
+torso_half
+10
+157.33717382266084
+20
+-56.943471056583014
+30
+0.0
+11
+150.58698481467096
+21
+-65.5049674350578
+31
+17.22452256429279
+12
+150.63756799288075
+22
+-65.23488744582545
+32
+16.815074578698514
+13
+150.63756799288075
+23
+-65.23488744582545
+33
+16.815074578698514
+70
+13
+ 0
+3DFACE
+ 8
+torso_half
+10
+157.33717382266084
+20
+-56.943471056583014
+30
+0.0
+11
+150.63756799288075
+21
+-65.23488744582545
+31
+16.815074578698514
+12
+150.69305653174226
+22
+-64.90515487943217
+32
+16.320360871166475
+13
+150.69305653174226
+23
+-64.90515487943217
+33
+16.320360871166475
+70
+13
+ 0
+3DFACE
+ 8
+torso_half
+10
+157.33717382266084
+20
+-56.943471056583014
+30
+0.0
+11
+150.69305653174226
+21
+-64.90515487943217
+31
+16.320360871166475
+12
+150.70614040521917
+22
+-64.76392910432827
+32
+16.117283757091627
+13
+150.70614040521917
+23
+-64.76392910432827
+33
+16.117283757091627
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+150.58698481467096
+20
+-65.5049674350578
+30
+17.22452256429279
+11
+149.06284587784322
+21
+-68.59937853389094
+31
+22.694836617139387
+12
+149.1887315596308
+22
+-67.97226854186266
+32
+21.73716537086142
+13
+149.1887315596308
+23
+-67.97226854186266
+33
+21.73716537086142
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+177.90722108584777
+20
+-60.58682893572308
+30
+94.6358436584496
+11
+181.4744931903291
+21
+-68.48595559873871
+31
+51.26387863159413
+12
+204.92696625684476
+22
+-54.8285987402056
+32
+79.67357864380116
+13
+204.92696625684476
+23
+-54.8285987402056
+33
+79.67357864380116
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+30.914353013644988
+20
+-44.46661185357005
+30
+189.0295005798363
+11
+15.073935543367746
+21
+-57.97883311479523
+31
+161.18546371460195
+12
+21.013271463404344
+22
+-47.65891868098439
+32
+167.59166183471913
+13
+21.013271463404344
+23
+-47.65891868098439
+33
+167.59166183471913
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+217.37512607438003
+20
+32.53172468447505
+30
+77.1826454162621
+11
+200.44433780671957
+21
+7.735200596684099
+31
+110.80937194824452
+12
+230.86234524196817
+22
+1.9526077427172908
+32
+80.8289344787621
+13
+230.86234524196817
+23
+1.9526077427172908
+33
+80.8289344787621
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+115.89121807283227
+20
+-66.26669706012112
+30
+99.34117660522695
+11
+107.5861609794709
+21
+-74.35214677537962
+31
+91.62604675293203
+12
+147.24384931574625
+22
+-73.59370543322612
+32
+72.06997299194569
+13
+147.24384931574625
+23
+-73.59370543322612
+33
+72.06997299194569
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+138.51341932409755
+20
+64.81766127479665
+30
+143.18268661499258
+11
+171.5991877387955
+21
+61.74787757767486
+31
+116.39614334106679
+12
+115.1803133245149
+22
+91.20113208160397
+32
+137.0138771057152
+13
+115.1803133245149
+23
+91.20113208160397
+33
+137.0138771057152
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+145.93044157318866
+20
+-7.139309396805324
+30
+138.02621841430897
+11
+122.49228585932734
+21
+-3.0641840966889538
+31
+141.18649063110584
+12
+110.39769380652112
+22
+-31.863111968658878
+32
+134.80296554565663
+13
+110.39769380652112
+23
+-31.863111968658878
+33
+134.80296554565663
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+200.44433780671957
+20
+7.735200596684099
+30
+110.80937194824452
+11
+199.91219448828042
+21
+-15.002223562990654
+31
+116.19082641601796
+12
+230.86234524196817
+22
+1.9526077427172908
+32
+80.8289344787621
+13
+230.86234524196817
+23
+1.9526077427172908
+33
+80.8289344787621
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+242.01092478312665
+20
+-26.520453991183174
+30
+0.0
+11
+236.07976970600353
+21
+-37.84789037714662
+31
+19.98071060180898
+12
+236.7712918935554
+22
+-40.02417113138695
+32
+0.0
+13
+236.7712918935554
+23
+-40.02417113138695
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+187.89936404881297
+20
+64.72587162397546
+30
+3.880530548098042
+11
+207.56317105018422
+21
+51.15553040137684
+31
+0.0
+12
+204.7823481204203
+22
+52.89650128096435
+32
+0.0
+13
+204.7823481204203
+23
+52.89650128096435
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+207.56317105018422
+20
+51.15553040137684
+30
+0.0
+11
+187.89936404881297
+21
+64.72587162397546
+31
+3.880530548098042
+12
+204.7939746080962
+22
+58.26079605075201
+32
+16.549137115480853
+13
+204.7939746080962
+23
+58.26079605075201
+33
+16.549137115480853
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+242.01092478312665
+20
+-26.520453991183174
+30
+0.0
+11
+244.6718856778938
+21
+-9.207369090537865
+31
+19.739640045168354
+12
+236.07976970600353
+22
+-37.84789037714662
+32
+19.98071060180898
+13
+236.07976970600353
+23
+-37.84789037714662
+33
+19.98071060180898
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+244.6718856778938
+20
+-9.207369090537865
+30
+19.739640045168354
+11
+242.01092478312665
+21
+-26.520453991183174
+31
+0.0
+12
+246.30976685797765
+22
+-12.139517811236814
+32
+0.0
+13
+246.30976685797765
+23
+-12.139517811236814
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+149.82163298209082
+20
+100.87125763980181
+30
+32.81616744995351
+11
+151.54538361797512
+21
+98.52634993866302
+31
+39.72717971801991
+12
+154.21711265481727
+22
+76.04300361825611
+32
+10.822936248781636
+13
+154.21711265481727
+23
+76.04300361825611
+33
+10.822936248781636
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+165.4320775192345
+20
+94.2337211122594
+30
+50.25599441528554
+11
+181.80640547135968
+21
+84.44499116506961
+31
+44.30190048218007
+12
+185.36461455247257
+22
+73.47830449768324
+32
+19.59924163818593
+13
+185.36461455247257
+23
+73.47830449768324
+33
+19.59924163818593
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+14.479430842981428
+20
+131.47894521043864
+30
+61.095739746096086
+11
+43.10536633646605
+21
+146.08214031643485
+31
+43.049651336672255
+12
+15.11313916305249
+22
+135.61150121858162
+32
+20.885597229006244
+13
+15.11313916305249
+23
+135.61150121858162
+33
+20.885597229006244
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+149.84195139908925
+20
+74.64484730505322
+30
+8.71037139892812
+11
+150.20473256970118
+21
+63.2729714349116
+31
+0.0
+12
+151.34232555055112
+22
+68.24278612394096
+32
+0.0
+13
+151.34232555055112
+23
+68.24278612394096
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+241.23675739763246
+20
+-1.1406180253132014
+30
+0.0
+11
+244.6718856778938
+21
+-9.207369090537865
+31
+19.739640045168354
+12
+246.30976685797765
+22
+-12.139517811236814
+32
+0.0
+13
+246.30976685797765
+23
+-12.139517811236814
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+244.6718856778938
+20
+-9.207369090537865
+30
+19.739640045168354
+11
+241.23675739763246
+21
+-1.1406180253132014
+31
+0.0
+12
+229.00145417766717
+22
+24.242968678134183
+32
+36.48416061401601
+13
+229.00145417766717
+23
+24.242968678134183
+33
+36.48416061401601
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+147.2665788027299
+20
+73.40702723991632
+30
+10.569463348391011
+11
+150.2071194138168
+21
+63.11528778381575
+31
+0.0
+12
+150.00253581613148
+22
+62.97630942057115
+32
+0.0
+13
+150.00253581613148
+23
+62.97630942057115
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+150.2071194138168
+20
+63.11528778381575
+30
+0.0
+11
+147.2665788027299
+21
+73.40702723991632
+31
+10.569463348391011
+12
+153.45831230291537
+22
+65.32389820728869
+32
+0.0
+13
+153.45831230291537
+23
+65.32389820728869
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+187.79550715156142
+20
+78.67726546390548
+30
+89.17464599609609
+11
+203.4144811861246
+21
+66.42320112385349
+31
+42.889486694338274
+12
+181.80640547135968
+22
+84.44499116506961
+32
+44.30190048218007
+13
+181.80640547135968
+23
+84.44499116506961
+33
+44.30190048218007
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+154.21711265481727
+20
+76.04300361825611
+30
+10.822936248781636
+11
+147.2665788027299
+21
+73.40702723991632
+31
+10.569463348391011
+12
+149.82163298209082
+22
+100.87125763980181
+32
+32.81616744995351
+13
+149.82163298209082
+23
+100.87125763980181
+33
+32.81616744995351
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+231.72620663197017
+20
+20.186471407656384
+30
+0.0
+11
+229.00145417766717
+21
+24.242968678134183
+31
+36.48416061401601
+12
+232.39956797250116
+22
+19.415701648959864
+32
+0.0
+13
+232.39956797250116
+23
+19.415701648959864
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+229.00145417766717
+20
+24.242968678134183
+30
+36.48416061401601
+11
+231.72620663197017
+21
+20.186471407656384
+31
+0.0
+12
+218.9548167376422
+22
+35.801564231111755
+32
+38.7649322509789
+13
+218.9548167376422
+23
+35.801564231111755
+33
+38.7649322509789
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+115.40787520384355
+20
+-120.34336660335758
+30
+3.2336708068871047
+11
+114.96693914464883
+21
+-121.1924332316236
+31
+0.0
+12
+116.84343596887011
+22
+-120.37714652373425
+32
+0.0
+13
+116.84343596887011
+23
+-120.37714652373425
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+216.45830837827927
+20
+39.90047722260013
+30
+11.193746948244526
+11
+216.55940293656835
+21
+38.63954366082398
+31
+39.57912673950429
+12
+218.9548167376422
+22
+35.801564231111755
+32
+38.7649322509789
+13
+218.9548167376422
+23
+35.801564231111755
+33
+38.7649322509789
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+135.2334332656079
+20
+-108.3308499386207
+30
+9.900608825685932
+11
+131.46387231459195
+21
+-111.87433149397688
+31
+0.0
+12
+138.13389095592626
+22
+-105.23847877066429
+32
+0.0
+13
+138.13389095592626
+23
+-105.23847877066429
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+208.16678966221795
+20
+50.255220013725044
+30
+0.0
+11
+204.7939746080962
+21
+58.26079605075201
+31
+16.549137115480853
+12
+216.45830837827927
+22
+39.90047722260013
+32
+11.193746948244526
+13
+216.45830837827927
+23
+39.90047722260013
+33
+11.193746948244526
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+204.7939746080962
+20
+58.26079605075201
+30
+16.549137115480853
+11
+208.16678966221795
+21
+50.255220013725044
+31
+0.0
+12
+207.56317105018422
+22
+51.15553040137684
+32
+0.0
+13
+207.56317105018422
+23
+51.15553040137684
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+22.036768218700455
+20
+-130.48219224049564
+30
+4.197274780275777
+11
+23.97241709557398
+21
+-132.2513945559714
+31
+0.0
+12
+29.452586355276292
+22
+-132.5583955320613
+32
+0.0
+13
+29.452586355276292
+23
+-132.5583955320613
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+91.94904520730577
+20
+-128.63334174911296
+30
+1.426610565187886
+11
+92.5402225237455
+21
+-128.81529586719765
+31
+0.0
+12
+94.3402234909714
+22
+-128.25324160305613
+32
+0.0
+13
+94.3402234909714
+23
+-128.25324160305613
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+181.80640547135968
+20
+84.44499116506961
+30
+44.30190048218007
+11
+203.4144811861246
+21
+66.42320112385349
+31
+42.889486694338274
+12
+185.36461455247257
+22
+73.47830449768324
+32
+19.59924163818593
+13
+185.36461455247257
+23
+73.47830449768324
+33
+19.59924163818593
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+53.91845576706572
+20
+-84.62691278378351
+30
+87.98566818237538
+11
+38.25772079362193
+21
+-89.2245185184614
+31
+83.51103820801015
+12
+69.81845974147731
+22
+-87.62951670969532
+32
+80.83707351684804
+13
+69.81845974147731
+23
+-87.62951670969532
+33
+80.83707351684804
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+208.16678966221795
+20
+50.255220013725044
+30
+0.0
+11
+216.45830837827927
+21
+39.90047722260013
+31
+11.193746948244526
+12
+216.0182466963588
+22
+40.94664106271533
+32
+0.0
+13
+216.0182466963588
+23
+40.94664106271533
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+80.57553070940972
+20
+147.50468839360968
+30
+59.22618331909413
+11
+68.90056083146783
+21
+139.929915936223
+31
+35.54371414184804
+12
+62.25607557757863
+22
+142.76034947971638
+32
+55.64859161377187
+13
+62.25607557757863
+23
+142.76034947971638
+33
+55.64859161377187
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+219.21143502113335
+20
+35.752244739321284
+30
+9.931711578371479
+11
+229.66566169349895
+21
+22.76477452233004
+31
+0.0
+12
+223.28382965094985
+22
+30.550361260574945
+32
+0.0
+13
+223.28382965094985
+23
+30.550361260574945
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+155.4506474646076
+20
+93.98739594944335
+30
+0.0
+11
+152.70269307998663
+21
+94.70888173708776
+31
+14.83305969238515
+12
+155.65543564267765
+22
+92.47526870173299
+32
+0.0
+13
+155.65543564267765
+23
+92.47526870173299
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+152.70269307998663
+20
+94.70888173708776
+30
+14.83305969238515
+11
+155.4506474646076
+21
+93.98739594944335
+31
+0.0
+12
+149.05891423768966
+22
+107.43604409159036
+32
+25.579787445070696
+13
+149.05891423768966
+23
+107.43604409159036
+33
+25.579787445070696
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+187.79550715156142
+20
+78.67726546390548
+30
+89.17464599609609
+11
+171.5991877387955
+21
+61.74787757767486
+31
+116.39614334106679
+12
+206.90302237282341
+22
+41.525801589094264
+32
+73.3891754150414
+13
+206.90302237282341
+23
+41.525801589094264
+33
+73.3891754150414
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+145.50744714167047
+20
+107.53670413376163
+30
+16.211463928224994
+11
+155.4506474646076
+21
+93.98739594944335
+31
+0.0
+12
+154.2773776960589
+22
+94.9881733748572
+32
+0.0
+13
+154.2773776960589
+23
+94.9881733748572
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+155.4506474646076
+20
+93.98739594944335
+30
+0.0
+11
+145.50744714167047
+21
+107.53670413376163
+31
+16.211463928224994
+12
+149.05891423768966
+22
+107.43604409159036
+32
+25.579787445070696
+13
+149.05891423768966
+23
+107.43604409159036
+33
+25.579787445070696
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+127.47606739636832
+20
+107.38791201849969
+30
+103.94302749634022
+11
+155.86160142743745
+21
+100.5012077696673
+31
+93.72233352661367
+12
+142.77472455368599
+22
+103.1423655103349
+32
+87.52552185058828
+13
+142.77472455368599
+23
+103.1423655103349
+33
+87.52552185058828
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+118.52139172890983
+20
+112.44507824166051
+30
+104.34513473510975
+11
+125.54659463817633
+21
+110.00771531739322
+31
+102.28334197998281
+12
+104.72919069896854
+22
+128.40165995503256
+32
+87.60904388427967
+13
+104.72919069896854
+23
+128.40165995503256
+33
+87.60904388427967
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+244.6718856778938
+20
+-9.207369090537865
+30
+19.739640045168354
+11
+230.12333639944836
+21
+-25.312636344470338
+31
+80.34165802002187
+12
+236.07976970600353
+22
+-37.84789037714662
+32
+19.98071060180898
+13
+236.07976970600353
+23
+-37.84789037714662
+33
+19.98071060180898
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+14.774208697011588
+20
+133.66629357036655
+30
+1.2406723022484327
+11
+39.19917507961585
+21
+145.5245815926033
+31
+0.0
+12
+20.575701115493853
+22
+136.42040759421332
+32
+0.0
+13
+20.575701115493853
+23
+136.42040759421332
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+39.19917507961585
+20
+145.5245815926033
+30
+0.0
+11
+14.774208697011588
+21
+133.66629357036655
+31
+1.2406723022484327
+12
+40.879848516804095
+22
+147.6847047742757
+32
+20.258600616457414
+13
+40.879848516804095
+23
+147.6847047742757
+33
+20.258600616457414
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+230.86234524196817
+20
+1.9526077427172908
+30
+80.8289344787621
+11
+199.91219448828042
+21
+-15.002223562990654
+31
+116.19082641601796
+12
+230.12333639944836
+22
+-25.312636344470338
+32
+80.34165802002187
+13
+230.12333639944836
+23
+-25.312636344470338
+33
+80.34165802002187
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+62.25607557757863
+20
+142.76034947971638
+30
+55.64859161377187
+11
+66.28549279693662
+21
+142.6737698444664
+31
+36.184275817873434
+12
+43.10536633646605
+22
+146.08214031643485
+32
+43.049651336672255
+13
+43.10536633646605
+23
+146.08214031643485
+33
+43.049651336672255
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+158.7523056700532
+20
+10.39219245211727
+30
+139.12789535522694
+11
+142.1847572847631
+21
+40.136738826247395
+31
+150.753154754641
+12
+134.63333399528074
+22
+13.30445350255567
+32
+152.02788314819568
+13
+134.63333399528074
+23
+13.30445350255567
+33
+152.02788314819568
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+57.3835020093576
+20
+-60.402598263590335
+30
+125.02236099243397
+11
+41.22377045123538
+21
+-49.557017386783514
+31
+121.93204574585194
+12
+25.817439762173446
+22
+-65.92217639948196
+32
+119.06177520752186
+13
+25.817439762173446
+23
+-65.92217639948196
+33
+119.06177520752186
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+46.8103967308179
+20
+-99.04532219628572
+30
+68.26613540649647
+11
+46.211175362445296
+21
+-101.46793608642935
+31
+63.95254211426015
+12
+69.32230868953137
+22
+-96.9760356735265
+32
+66.93278656006093
+13
+69.32230868953137
+23
+-96.9760356735265
+33
+66.93278656006093
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+69.81845974147731
+20
+-87.62951670969532
+30
+80.83707351684804
+11
+86.5439364674942
+21
+-91.4777750066287
+31
+70.90744705200429
+12
+106.41944734345599
+22
+-85.05347040964502
+32
+77.157646942141
+13
+106.41944734345599
+23
+-85.05347040964502
+33
+77.157646942141
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+181.84796302336758
+20
+-2.7564647629286942
+30
+117.17845993042225
+11
+179.06865360224572
+21
+-1.9585758608936479
+31
+119.31311645508046
+12
+172.14884901916346
+22
+-11.959810673170432
+32
+127.29993515014881
+13
+172.14884901916346
+23
+-11.959810673170432
+33
+127.29993515014881
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+52.40052851339469
+20
+109.46549365939855
+30
+150.09931869507068
+11
+86.87753689957422
+21
+123.24066942718915
+31
+120.82242355346914
+12
+55.150208871203944
+22
+132.6944441872318
+32
+114.67192687988515
+13
+55.150208871203944
+23
+132.6944441872318
+33
+114.67192687988515
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+117.40105656268344
+20
+108.74435399057943
+30
+120.14184494018788
+11
+171.5991877387955
+21
+61.74787757767486
+31
+116.39614334106679
+12
+136.8857172785656
+22
+92.0750762436121
+32
+113.61249542236561
+13
+136.8857172785656
+23
+92.0750762436121
+33
+113.61249542236561
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+163.68895116860156
+20
+95.7997915609867
+30
+51.1734771728539
+11
+128.8358048898519
+21
+130.40407786806043
+31
+66.76361083984608
+12
+116.50178522879474
+22
+135.29668358544225
+32
+74.76031265259023
+13
+116.50178522879474
+23
+135.29668358544225
+33
+74.76031265259023
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+217.37512607438003
+20
+32.53172468447505
+30
+77.1826454162621
+11
+190.7419070878849
+21
+22.38819599131207
+31
+113.19692001343007
+12
+200.44433780671957
+22
+7.735200596684099
+32
+110.80937194824452
+13
+200.44433780671957
+23
+7.735200596684099
+33
+110.80937194824452
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+42.65015426787918
+20
+145.1170334507596
+30
+62.55756912231679
+11
+62.25607557757863
+21
+142.76034947971638
+31
+55.64859161377187
+12
+43.10536633646605
+22
+146.08214031643485
+32
+43.049651336672255
+13
+43.10536633646605
+23
+146.08214031643485
+33
+43.049651336672255
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+116.50178522879474
+20
+135.29668358544225
+30
+74.76031265259023
+11
+140.7533405280837
+21
+104.2011442692092
+31
+86.52461395263906
+12
+163.68895116860156
+22
+95.7997915609867
+32
+51.1734771728539
+13
+163.68895116860156
+23
+95.7997915609867
+33
+51.1734771728539
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+177.1695251881023
+20
+16.252384509584317
+30
+130.34005966186757
+11
+142.1847572847631
+21
+40.136738826247395
+31
+150.753154754641
+12
+158.7523056700532
+22
+10.39219245211727
+32
+139.12789535522694
+13
+158.7523056700532
+23
+10.39219245211727
+33
+139.12789535522694
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+110.39769380652112
+20
+-31.863111968658878
+30
+134.80296554565663
+11
+94.56830830613356
+21
+-19.202409459016916
+31
+132.91044540405505
+12
+69.95140161686146
+22
+-30.45388967754856
+32
+126.64367675781483
+13
+69.95140161686146
+23
+-30.45388967754856
+33
+126.64367675781483
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+155.76732410166483
+20
+-69.69922117375971
+30
+74.86641082763906
+11
+148.99943834894273
+21
+-74.19374852631539
+31
+61.62264556884999
+12
+151.3061315778026
+22
+-73.13826370527374
+32
+55.18243789673085
+13
+151.3061315778026
+23
+-73.13826370527374
+33
+55.18243789673085
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+179.06865360224572
+20
+-1.9585758608936479
+30
+119.31311645508046
+11
+145.93044157318866
+21
+-7.139309396805324
+31
+138.02621841430897
+12
+172.14884901916346
+22
+-11.959810673170432
+32
+127.29993515014881
+13
+172.14884901916346
+23
+-11.959810673170432
+33
+127.29993515014881
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+84.1775180445552
+20
+92.9158681993883
+30
+154.44343338012928
+11
+115.29005476676613
+21
+79.66885175450253
+31
+148.78079452514882
+12
+115.1803133245149
+22
+91.20113208160397
+32
+137.0138771057152
+13
+115.1803133245149
+23
+91.20113208160397
+33
+137.0138771057152
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+122.49228585932734
+20
+-3.0641840966889538
+30
+141.18649063110584
+11
+94.56830830613356
+21
+-19.202409459016916
+31
+132.91044540405505
+12
+110.39769380652112
+22
+-31.863111968658878
+32
+134.80296554565663
+13
+110.39769380652112
+23
+-31.863111968658878
+33
+134.80296554565663
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+230.86234524196817
+20
+1.9526077427172908
+30
+80.8289344787621
+11
+230.12333639944836
+21
+-25.312636344470338
+31
+80.34165802002187
+12
+244.6718856778938
+22
+-9.207369090537865
+32
+19.739640045168354
+13
+244.6718856778938
+23
+-9.207369090537865
+33
+19.739640045168354
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+115.29005476676613
+20
+79.66885175450253
+30
+148.78079452514882
+11
+138.51341932409755
+21
+64.81766127479665
+31
+143.18268661499258
+12
+115.1803133245149
+22
+91.20113208160397
+32
+137.0138771057152
+13
+115.1803133245149
+23
+91.20113208160397
+33
+137.0138771057152
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+155.76732410166483
+20
+-69.69922117375971
+30
+74.86641082763906
+11
+147.24384931574625
+21
+-73.59370543322612
+31
+72.06997299194569
+12
+148.99943834894273
+22
+-74.19374852631539
+32
+61.62264556884999
+13
+148.99943834894273
+23
+-74.19374852631539
+33
+61.62264556884999
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+81.65900918452202
+20
+-49.753905305996085
+30
+127.85261459350819
+11
+41.22377045123538
+21
+-49.557017386783514
+31
+121.93204574585194
+12
+57.3835020093576
+22
+-60.402598263590335
+32
+125.02236099243397
+13
+57.3835020093576
+23
+-60.402598263590335
+33
+125.02236099243397
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+41.22377045123538
+20
+-49.557017386783514
+30
+121.93204574585194
+11
+25.14798290055617
+21
+-54.28496737296365
+31
+118.9119781494164
+12
+25.817439762173446
+22
+-65.92217639948196
+32
+119.06177520752186
+13
+25.817439762173446
+23
+-65.92217639948196
+33
+119.06177520752186
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+169.2437445983676
+20
+3.1643723432239965
+30
+130.26525802612537
+11
+122.49228585932734
+21
+-3.0641840966889538
+31
+141.18649063110584
+12
+145.93044157318866
+22
+-7.139309396805324
+32
+138.02621841430897
+13
+145.93044157318866
+23
+-7.139309396805324
+33
+138.02621841430897
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+128.2972524404454
+20
+-78.70082308002429
+30
+85.38776473999256
+11
+106.41944734345599
+21
+-85.05347040964502
+31
+77.157646942141
+12
+137.47782316111585
+22
+-80.4502514409713
+32
+74.59607849121328
+13
+137.47782316111585
+23
+-80.4502514409713
+33
+74.59607849121328
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+181.84796302336758
+20
+-2.7564647629286942
+30
+117.17845993042225
+11
+172.14884901916346
+21
+-11.959810673170432
+31
+127.29993515014881
+12
+175.52766629968895
+22
+-12.841986541751243
+32
+125.19405593872304
+13
+175.52766629968895
+23
+-12.841986541751243
+33
+125.19405593872304
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+81.65900918452202
+20
+-49.753905305996085
+30
+127.85261459350819
+11
+69.95140161686146
+21
+-30.45388967754856
+31
+126.64367675781483
+12
+41.22377045123538
+22
+-49.557017386783514
+32
+121.93204574585194
+13
+41.22377045123538
+23
+-49.557017386783514
+33
+121.93204574585194
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+118.52139172890983
+20
+112.44507824166051
+30
+104.34513473510975
+11
+104.72919069896854
+21
+128.40165995503256
+31
+87.60904388427967
+12
+99.05089376025111
+22
+124.37416933837898
+32
+91.57227096557851
+13
+99.05089376025111
+23
+124.37416933837898
+33
+91.57227096557851
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+187.89936404881297
+20
+64.72587162397546
+30
+3.880530548098042
+11
+204.7823481204203
+21
+52.89650128096435
+31
+0.0
+12
+188.03455346346396
+22
+63.19172801481241
+32
+0.0
+13
+188.03455346346396
+23
+63.19172801481241
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+105.03443755955936
+20
+-122.74550505359352
+30
+8.50292282104726
+11
+94.3402234909714
+21
+-128.25324160305613
+31
+0.0
+12
+103.75203731527698
+22
+-125.32052411763623
+32
+0.0
+13
+103.75203731527698
+23
+-125.32052411763623
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+94.3402234909714
+20
+-128.25324160305613
+30
+0.0
+11
+105.03443755955936
+21
+-122.74550505359352
+31
+8.50292282104726
+12
+91.94904520730577
+22
+-128.63334174911296
+32
+1.426610565187886
+13
+91.94904520730577
+23
+-128.63334174911296
+33
+1.426610565187886
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+190.7825693092046
+20
+6.585408168874486
+30
+107.58137130737538
+11
+188.47690987917392
+21
+22.19452590733552
+31
+115.46267318725819
+12
+188.6310264567061
+22
+7.319584772449233
+32
+109.88568801880116
+13
+188.6310264567061
+23
+7.319584772449233
+33
+109.88568801880116
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+91.94904520730577
+20
+-128.63334174911296
+30
+1.426610565187886
+11
+87.43983444241641
+21
+-130.11991335792678
+31
+0.0
+12
+91.58702021531865
+22
+-129.0839076201277
+32
+0.0
+13
+91.58702021531865
+23
+-129.0839076201277
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+91.94904520730577
+20
+-128.63334174911296
+30
+1.426610565187886
+11
+91.58702021531865
+21
+-129.0839076201277
+31
+0.0
+12
+92.5402225237455
+22
+-128.81529586719765
+32
+0.0
+13
+92.5402225237455
+23
+-128.81529586719765
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+15.031408032972237
+20
+-112.72951831903971
+30
+39.629511260988664
+11
+10.853295282084991
+21
+-117.02825844932259
+31
+27.598268890383196
+12
+18.2200026283554
+22
+-115.48358531336832
+32
+34.190502166750385
+13
+18.2200026283554
+23
+-115.48358531336832
+33
+34.190502166750385
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+92.80332265180812
+20
+128.9520069214947
+30
+84.23550949096914
+11
+80.57553070940972
+21
+147.50468839360968
+31
+59.22618331909413
+12
+62.25607557757863
+22
+142.76034947971638
+32
+55.64859161377187
+13
+62.25607557757863
+23
+142.76034947971638
+33
+55.64859161377187
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+84.3550820718996
+20
+133.34903899754426
+30
+95.55749282837148
+11
+99.05089376025111
+21
+124.37416933837898
+31
+91.57227096557851
+12
+66.46316783675442
+22
+138.20167265170429
+32
+76.33250350952382
+13
+66.46316783675442
+23
+138.20167265170429
+33
+76.33250350952382
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+26.084822147336347
+20
+-124.7654486834366
+30
+14.77230758667226
+11
+7.777562142666184
+21
+-121.65989554273425
+31
+13.434695434572651
+12
+25.971264578278895
+22
+-126.93007467404382
+32
+12.041272735598042
+13
+25.971264578278895
+23
+-126.93007467404382
+33
+12.041272735598042
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+188.47690987917392
+20
+22.19452590733552
+30
+115.46267318725819
+11
+185.70556463529354
+21
+38.12799421867215
+31
+112.66933593750234
+12
+182.98549615279813
+22
+38.083946484664395
+32
+115.34843597412343
+13
+182.98549615279813
+23
+38.083946484664395
+33
+115.34843597412343
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+203.4144811861246
+20
+66.42320112385349
+30
+42.889486694338274
+11
+216.55940293656835
+21
+38.63954366082398
+31
+39.57912673950429
+12
+204.7939746080962
+22
+58.26079605075201
+32
+16.549137115480853
+13
+204.7939746080962
+23
+58.26079605075201
+33
+16.549137115480853
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+164.57315473233012
+20
+83.09039435795488
+30
+28.698007965090227
+11
+185.36461455247257
+21
+73.47830449768324
+31
+19.59924163818593
+12
+170.4736803674982
+22
+68.64791972018268
+32
+9.755365753176166
+13
+170.4736803674982
+23
+68.64791972018268
+33
+9.755365753176166
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+135.2334332656079
+20
+-108.3308499386207
+30
+9.900608825685932
+11
+124.59032561713084
+21
+-116.50933980329062
+31
+0.0
+12
+125.75512640643448
+22
+-115.86941167332861
+32
+0.0
+13
+125.75512640643448
+23
+-115.86941167332861
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+124.59032561713084
+20
+-116.50933980329062
+30
+0.0
+11
+135.2334332656079
+21
+-108.3308499386207
+31
+9.900608825685932
+12
+120.9808431767533
+22
+-116.59633083472264
+32
+8.052078247072652
+13
+120.9808431767533
+23
+-116.59633083472264
+33
+8.052078247072652
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+190.7419070878849
+20
+22.38819599131207
+30
+113.19692001343007
+11
+188.47690987917392
+21
+22.19452590733552
+31
+115.46267318725819
+12
+190.7825693092046
+22
+6.585408168874486
+32
+107.58137130737538
+13
+190.7825693092046
+23
+6.585408168874486
+33
+107.58137130737538
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+185.36461455247257
+20
+73.47830449768324
+30
+19.59924163818593
+11
+187.89936404881297
+21
+64.72587162397546
+31
+3.880530548098042
+12
+170.4736803674982
+22
+68.64791972018268
+32
+9.755365753176166
+13
+170.4736803674982
+23
+68.64791972018268
+33
+9.755365753176166
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+115.40787520384355
+20
+-120.34336660335758
+30
+3.2336708068871047
+11
+116.84343596887011
+21
+-120.37714652373425
+31
+0.0
+12
+123.01289177328475
+22
+-117.284316113146
+32
+0.0
+13
+123.01289177328475
+23
+-117.284316113146
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+42.63913312726797
+20
+141.27697085673032
+30
+88.5086982727074
+11
+62.25607557757863
+21
+142.76034947971638
+31
+55.64859161377187
+12
+42.65015426787918
+22
+145.1170334507596
+32
+62.55756912231679
+13
+42.65015426787918
+23
+145.1170334507596
+33
+62.55756912231679
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+26.52422657620338
+20
+-113.76011428459759
+30
+39.985206604006244
+11
+15.031408032972237
+21
+-112.72951831903971
+31
+39.629511260988664
+12
+18.2200026283554
+22
+-115.48358531336832
+32
+34.190502166750385
+13
+18.2200026283554
+23
+-115.48358531336832
+33
+34.190502166750385
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+27.15749465289185
+20
+-105.80300186201474
+30
+57.46921691894765
+11
+28.208062084038428
+21
+-107.28267169965386
+31
+53.25455169677968
+12
+43.459056918258014
+22
+-106.62524398251513
+32
+53.74337844848866
+13
+43.459056918258014
+23
+-106.62524398251513
+33
+53.74337844848866
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+25.971264578278895
+20
+-126.93007467404382
+30
+12.041272735598042
+11
+22.036768218700455
+21
+-130.48219224049564
+31
+4.197274780275777
+12
+36.14720892522894
+22
+-130.96802308450057
+32
+6.595674896242573
+13
+36.14720892522894
+23
+-130.96802308450057
+33
+6.595674896242573
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+115.40787520384355
+20
+-120.34336660335758
+30
+3.2336708068871047
+11
+111.03369727135565
+21
+-122.83041635292801
+31
+0.0
+12
+114.96693914464883
+22
+-121.1924332316236
+32
+0.0
+13
+114.96693914464883
+23
+-121.1924332316236
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+106.41944734345599
+20
+-85.05347040964502
+30
+77.157646942141
+11
+102.48349968612156
+21
+-97.59497354638158
+31
+58.4178993225121
+12
+116.76651604955993
+22
+-91.57911387107508
+32
+64.5214996337914
+13
+116.76651604955993
+23
+-91.57911387107508
+33
+64.5214996337914
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+50.55326107597861
+20
+-117.7466263876579
+30
+34.38709869384999
+11
+38.929793738139786
+21
+-120.10695540468434
+31
+30.042790222170307
+12
+48.40894733941087
+22
+-128.93939980687477
+32
+14.759420776369526
+13
+48.40894733941087
+23
+-128.93939980687477
+33
+14.759420776369526
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+207.42111896467648
+20
+39.80247149799231
+30
+73.9782867431664
+11
+218.9548167376422
+21
+35.801564231111755
+31
+38.7649322509789
+12
+216.55940293656835
+22
+38.63954366082398
+32
+39.57912673950429
+13
+216.55940293656835
+23
+38.63954366082398
+33
+39.57912673950429
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+180.965843781971
+20
+37.978046827702755
+30
+117.69906768799062
+11
+138.51341932409755
+21
+64.81766127479665
+31
+143.18268661499258
+12
+142.1847572847631
+22
+40.136738826247395
+32
+150.753154754641
+13
+142.1847572847631
+23
+40.136738826247395
+33
+150.753154754641
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+69.32230868953137
+20
+-96.9760356735265
+30
+66.93278656006093
+11
+75.7057737846483
+21
+-108.47625498485674
+31
+45.636896514894914
+12
+88.93517068591554
+22
+-103.2111608482157
+32
+51.775087738039446
+13
+88.93517068591554
+23
+-103.2111608482157
+33
+51.775087738039446
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+79.48342859322611
+20
+-121.90001834562811
+30
+22.241037750246477
+11
+91.94904520730577
+21
+-128.63334174911296
+31
+1.426610565187886
+12
+105.03443755955936
+22
+-122.74550505359352
+32
+8.50292282104726
+13
+105.03443755955936
+23
+-122.74550505359352
+33
+8.50292282104726
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+124.04344368630343
+20
+129.5907370521475
+30
+46.779074859621474
+11
+135.09251970882826
+21
+108.6654777961255
+31
+0.0
+12
+131.94476460424062
+22
+110.51746569288046
+32
+0.0
+13
+131.94476460424062
+23
+110.51746569288046
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+135.09251970882826
+20
+108.6654777961255
+30
+0.0
+11
+124.04344368630343
+21
+129.5907370521475
+31
+46.779074859621474
+12
+145.50744714167047
+22
+107.53670413376163
+32
+16.211463928224994
+13
+145.50744714167047
+23
+107.53670413376163
+33
+16.211463928224994
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+115.51295084007931
+20
+129.15121504102106
+30
+32.74126892090077
+11
+131.94476460424062
+21
+110.51746569288046
+31
+0.0
+12
+130.7898412057679
+22
+111.07727073990137
+32
+0.0
+13
+130.7898412057679
+23
+111.07727073990137
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+131.94476460424062
+20
+110.51746569288046
+30
+0.0
+11
+115.51295084007931
+21
+129.15121504102106
+31
+32.74126892090077
+12
+124.04344368630343
+22
+129.5907370521475
+32
+46.779074859621474
+13
+124.04344368630343
+23
+129.5907370521475
+33
+46.779074859621474
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+117.40105656268344
+20
+108.74435399057943
+30
+120.14184494018788
+11
+136.8857172785656
+21
+92.0750762436121
+31
+113.61249542236561
+12
+118.52139172890983
+22
+112.44507824166051
+32
+104.34513473510975
+13
+118.52139172890983
+23
+112.44507824166051
+33
+104.34513473510975
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+17.15698235956875
+20
+126.44660787160322
+30
+96.0854644775414
+11
+42.63913312726797
+21
+141.27697085673032
+31
+88.5086982727074
+12
+42.65015426787918
+22
+145.1170334507596
+32
+62.55756912231679
+13
+42.65015426787918
+23
+145.1170334507596
+33
+62.55756912231679
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+82.9141493203411
+20
+103.2558529241941
+30
+144.6205833435082
+11
+117.40105656268344
+21
+108.74435399057943
+31
+120.14184494018788
+12
+86.87753689957422
+22
+123.24066942718915
+32
+120.82242355346914
+13
+86.87753689957422
+23
+123.24066942718915
+33
+120.82242355346914
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+48.40894733941087
+20
+-128.93939980687477
+30
+14.759420776369526
+11
+25.971264578278895
+21
+-126.93007467404382
+31
+12.041272735598042
+12
+36.14720892522894
+22
+-130.96802308450057
+32
+6.595674896242573
+13
+36.14720892522894
+23
+-130.96802308450057
+33
+6.595674896242573
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+73.30992256174021
+20
+-64.91956124198337
+30
+113.15273666382069
+11
+41.240996513155515
+21
+-72.46491864615655
+31
+105.22860794067616
+12
+67.75847079221415
+22
+-79.75431990006238
+32
+93.67640609741444
+13
+67.75847079221415
+23
+-79.75431990006238
+33
+93.67640609741444
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+117.40105656268344
+20
+108.74435399057943
+30
+120.14184494018788
+11
+82.9141493203411
+21
+103.2558529241941
+31
+144.6205833435082
+12
+115.1803133245149
+22
+91.20113208160397
+32
+137.0138771057152
+13
+115.1803133245149
+23
+91.20113208160397
+33
+137.0138771057152
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+216.92884973224034
+20
+39.56057013270216
+30
+0.0
+11
+216.45830837827927
+21
+39.90047722260013
+31
+11.193746948244526
+12
+219.21143502113335
+22
+35.752244739321284
+32
+9.931711578371479
+13
+219.21143502113335
+23
+35.752244739321284
+33
+9.931711578371479
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+216.45830837827927
+20
+39.90047722260013
+30
+11.193746948244526
+11
+216.92884973224034
+21
+39.56057013270216
+31
+0.0
+12
+216.0182466963588
+22
+40.94664106271533
+32
+0.0
+13
+216.0182466963588
+23
+40.94664106271533
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+136.8857172785656
+20
+92.0750762436121
+30
+113.61249542236561
+11
+127.47606739636832
+21
+107.38791201849969
+31
+103.94302749634022
+12
+118.52139172890983
+22
+112.44507824166051
+32
+104.34513473510975
+13
+118.52139172890983
+23
+112.44507824166051
+33
+104.34513473510975
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+138.51341932409755
+20
+64.81766127479665
+30
+143.18268661499258
+11
+180.965843781971
+21
+37.978046827702755
+31
+117.69906768799062
+12
+182.98549615279813
+22
+38.083946484664395
+32
+115.34843597412343
+13
+182.98549615279813
+23
+38.083946484664395
+33
+115.34843597412343
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+99.05089376025111
+20
+124.37416933837898
+30
+91.57227096557851
+11
+92.80332265180812
+21
+128.9520069214947
+31
+84.23550949096914
+12
+66.46316783675442
+22
+138.20167265170429
+32
+76.33250350952382
+13
+66.46316783675442
+23
+138.20167265170429
+33
+76.33250350952382
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+92.80332265180812
+20
+128.9520069214947
+30
+84.23550949096914
+11
+63.31394560770165
+21
+139.55192662667835
+31
+66.15037307739492
+12
+66.46316783675442
+22
+138.20167265170429
+32
+76.33250350952382
+13
+66.46316783675442
+23
+138.20167265170429
+33
+76.33250350952382
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+38.25772079362193
+20
+-89.2245185184614
+30
+83.51103820801015
+11
+56.59145931336226
+21
+-92.05718658181614
+31
+76.87791595459218
+12
+69.81845974147731
+22
+-87.62951670969532
+32
+80.83707351684804
+13
+69.81845974147731
+23
+-87.62951670969532
+33
+80.83707351684804
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+190.7419070878849
+20
+22.38819599131207
+30
+113.19692001343007
+11
+185.70556463529354
+21
+38.12799421867215
+31
+112.66933593750234
+12
+188.47690987917392
+22
+22.19452590733552
+32
+115.46267318725819
+13
+188.47690987917392
+23
+22.19452590733552
+33
+115.46267318725819
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+15.812821693331113
+20
+129.80722943027345
+30
+77.80402221679921
+11
+42.65015426787918
+21
+145.1170334507596
+31
+62.55756912231679
+12
+14.479430842981428
+22
+131.47894521043864
+32
+61.095739746096086
+13
+14.479430842981428
+23
+131.47894521043864
+33
+61.095739746096086
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+43.10536633646605
+20
+146.08214031643485
+30
+43.049651336672255
+11
+40.879848516804095
+21
+147.6847047742757
+31
+20.258600616457414
+12
+15.11313916305249
+22
+135.61150121858162
+32
+20.885597229006244
+13
+15.11313916305249
+23
+135.61150121858162
+33
+20.885597229006244
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+165.4320775192345
+20
+94.2337211122594
+30
+50.25599441528554
+11
+185.36461455247257
+21
+73.47830449768324
+31
+19.59924163818593
+12
+164.57315473233012
+22
+83.09039435795488
+32
+28.698007965090227
+13
+164.57315473233012
+23
+83.09039435795488
+33
+28.698007965090227
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+69.81874575557137
+20
+140.72638469938852
+30
+22.699052429201558
+11
+79.58909068583961
+21
+135.3354473439336
+31
+0.0
+12
+77.22319314549554
+22
+135.2290095283172
+32
+0.0
+13
+77.22319314549554
+23
+135.2290095283172
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+79.58909068583961
+20
+135.3354473439336
+30
+0.0
+11
+69.81874575557137
+21
+140.72638469938852
+31
+22.699052429201558
+12
+74.20944273647525
+22
+140.9556222801298
+32
+22.822494506838275
+13
+74.20944273647525
+23
+140.9556222801298
+33
+22.822494506838275
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+185.36461455247257
+20
+73.47830449768324
+30
+19.59924163818593
+11
+204.7939746080962
+21
+58.26079605075201
+31
+16.549137115480853
+12
+187.89936404881297
+22
+64.72587162397546
+32
+3.880530548098042
+13
+187.89936404881297
+23
+64.72587162397546
+33
+3.880530548098042
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+154.21711265481727
+20
+76.04300361825611
+30
+10.822936248781636
+11
+161.93324325498824
+21
+65.15680277813927
+31
+0.0
+12
+147.2665788027299
+22
+73.40702723991632
+32
+10.569463348391011
+13
+147.2665788027299
+23
+73.40702723991632
+33
+10.569463348391011
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+161.93324325498824
+20
+65.15680277813927
+30
+0.0
+11
+154.21711265481727
+21
+76.04300361825611
+31
+10.822936248781636
+12
+163.0676707146204
+22
+65.53557203523478
+32
+0.0
+13
+163.0676707146204
+23
+65.53557203523478
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+187.79550715156142
+20
+78.67726546390548
+30
+89.17464599609609
+11
+136.8857172785656
+21
+92.0750762436121
+31
+113.61249542236561
+12
+171.5991877387955
+22
+61.74787757767486
+32
+116.39614334106679
+13
+171.5991877387955
+23
+61.74787757767486
+33
+116.39614334106679
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+150.20473256970118
+20
+63.2729714349116
+30
+0.0
+11
+147.2665788027299
+21
+73.40702723991632
+31
+10.569463348391011
+12
+150.00253581613148
+22
+62.97630942057115
+32
+0.0
+13
+150.00253581613148
+23
+62.97630942057115
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+147.2665788027299
+20
+73.40702723991632
+30
+10.569463348391011
+11
+150.20473256970118
+21
+63.2729714349116
+31
+0.0
+12
+149.84195139908925
+22
+74.64484730505322
+32
+8.71037139892812
+13
+149.84195139908925
+23
+74.64484730505322
+33
+8.71037139892812
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+147.2665788027299
+20
+73.40702723991632
+30
+10.569463348391011
+11
+161.93324325498824
+21
+65.15680277813927
+31
+0.0
+12
+153.45831230291537
+22
+65.32389820728869
+32
+0.0
+13
+153.45831230291537
+23
+65.32389820728869
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+229.00145417766717
+20
+24.242968678134183
+30
+36.48416061401601
+11
+241.23675739763246
+21
+-1.1406180253132014
+31
+0.0
+12
+232.39956797250116
+22
+19.415701648959864
+32
+0.0
+13
+232.39956797250116
+23
+19.415701648959864
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+74.20944273647525
+20
+140.9556222801298
+30
+22.822494506838275
+11
+81.7134066446291
+21
+135.0917010489897
+31
+0.0
+12
+79.58909068583961
+22
+135.3354473439336
+32
+0.0
+13
+79.58909068583961
+23
+135.3354473439336
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+85.8715986664545
+20
+-82.864958784201
+30
+84.20305023193593
+11
+69.81845974147731
+21
+-87.62951670969532
+31
+80.83707351684804
+12
+106.41944734345599
+22
+-85.05347040964502
+32
+77.157646942141
+13
+106.41944734345599
+23
+-85.05347040964502
+33
+77.157646942141
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+229.66566169349895
+20
+22.76477452233004
+30
+0.0
+11
+218.9548167376422
+21
+35.801564231111755
+31
+38.7649322509789
+12
+231.72620663197017
+22
+20.186471407656384
+32
+0.0
+13
+231.72620663197017
+23
+20.186471407656384
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+218.9548167376422
+20
+35.801564231111755
+30
+38.7649322509789
+11
+229.66566169349895
+21
+22.76477452233004
+31
+0.0
+12
+219.21143502113335
+22
+35.752244739321284
+32
+9.931711578371479
+13
+219.21143502113335
+23
+35.752244739321284
+33
+9.931711578371479
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+203.4144811861246
+20
+66.42320112385349
+30
+42.889486694338274
+11
+204.7939746080962
+21
+58.26079605075201
+31
+16.549137115480853
+12
+185.36461455247257
+22
+73.47830449768324
+32
+19.59924163818593
+13
+185.36461455247257
+23
+73.47830449768324
+33
+19.59924163818593
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+216.45830837827927
+20
+39.90047722260013
+30
+11.193746948244526
+11
+218.9548167376422
+21
+35.801564231111755
+31
+38.7649322509789
+12
+219.21143502113335
+22
+35.752244739321284
+32
+9.931711578371479
+13
+219.21143502113335
+23
+35.752244739321284
+33
+9.931711578371479
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+80.57553070940972
+20
+147.50468839360968
+30
+59.22618331909413
+11
+100.94052338838935
+21
+135.92532829482312
+31
+54.41940307617421
+12
+99.81399386175806
+22
+137.20697006426357
+32
+22.83160247802968
+13
+99.81399386175806
+23
+137.20697006426357
+33
+22.83160247802968
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+26.52422657620338
+20
+-113.76011428459759
+30
+39.985206604006244
+11
+38.929793738139786
+21
+-120.10695540468434
+31
+30.042790222170307
+12
+50.55326107597861
+22
+-117.7466263876579
+32
+34.38709869384999
+13
+50.55326107597861
+23
+-117.7466263876579
+33
+34.38709869384999
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+100.94052338838935
+20
+135.92532829482312
+30
+54.41940307617421
+11
+115.51295084007931
+21
+129.15121504102106
+31
+32.74126892090077
+12
+99.81399386175806
+22
+137.20697006426357
+32
+22.83160247802968
+13
+99.81399386175806
+23
+137.20697006426357
+33
+22.83160247802968
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+187.79550715156142
+20
+78.67726546390548
+30
+89.17464599609609
+11
+206.90302237282341
+21
+41.525801589094264
+31
+73.3891754150414
+12
+203.4144811861246
+22
+66.42320112385349
+32
+42.889486694338274
+13
+203.4144811861246
+23
+66.42320112385349
+33
+42.889486694338274
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+86.87753689957422
+20
+123.24066942718915
+30
+120.82242355346914
+11
+84.3550820718996
+21
+133.34903899754426
+31
+95.55749282837148
+12
+55.150208871203944
+22
+132.6944441872318
+32
+114.67192687988515
+13
+55.150208871203944
+23
+132.6944441872318
+33
+114.67192687988515
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+141.8252948219265
+20
+-99.89843631624419
+30
+0.0
+11
+143.2440491556461
+21
+-97.11740736894173
+31
+22.868325042726948
+12
+140.21847266616777
+22
+-102.54417750642781
+32
+0.0
+13
+140.21847266616777
+23
+-102.54417750642781
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+143.2440491556461
+20
+-97.11740736894173
+30
+22.868325042726948
+11
+141.8252948219265
+21
+-99.89843631624419
+31
+0.0
+12
+146.1497399372302
+22
+-92.59506898664439
+32
+9.398895263674214
+13
+146.1497399372302
+23
+-92.59506898664439
+33
+9.398895263674214
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+62.25607557757863
+20
+142.76034947971638
+30
+55.64859161377187
+11
+68.90056083146783
+21
+139.929915936223
+31
+35.54371414184804
+12
+66.28549279693662
+22
+142.6737698444664
+32
+36.184275817873434
+13
+66.28549279693662
+23
+142.6737698444664
+33
+36.184275817873434
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+219.17149969811135
+20
+36.68411922973808
+30
+0.0
+11
+219.21143502113335
+21
+35.752244739321284
+31
+9.931711578371479
+12
+223.28382965094985
+22
+30.550361260574945
+32
+0.0
+13
+223.28382965094985
+23
+30.550361260574945
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+120.9808431767533
+20
+-116.59633083472264
+30
+8.052078247072652
+11
+123.01289177328475
+21
+-117.284316113146
+31
+0.0
+12
+124.59032561713084
+22
+-116.50933980329062
+32
+0.0
+13
+124.59032561713084
+23
+-116.50933980329062
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+123.01289177328475
+20
+-117.284316113146
+30
+0.0
+11
+120.9808431767533
+21
+-116.59633083472264
+31
+8.052078247072652
+12
+115.40787520384355
+22
+-120.34336660335758
+32
+3.2336708068871047
+13
+115.40787520384355
+23
+-120.34336660335758
+33
+3.2336708068871047
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+136.8857172785656
+20
+92.0750762436121
+30
+113.61249542236561
+11
+155.86160142743745
+21
+100.5012077696673
+31
+93.72233352661367
+12
+127.47606739636832
+22
+107.38791201849969
+32
+103.94302749634022
+13
+127.47606739636832
+23
+107.38791201849969
+33
+103.94302749634022
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+203.4144811861246
+20
+66.42320112385349
+30
+42.889486694338274
+11
+206.90302237282341
+21
+41.525801589094264
+31
+73.3891754150414
+12
+216.55940293656835
+22
+38.63954366082398
+32
+39.57912673950429
+13
+216.55940293656835
+23
+38.63954366082398
+33
+39.57912673950429
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+155.86160142743745
+20
+100.5012077696673
+30
+93.72233352661367
+11
+187.79550715156142
+21
+78.67726546390548
+31
+89.17464599609609
+12
+181.80640547135968
+22
+84.44499116506961
+32
+44.30190048218007
+13
+181.80640547135968
+23
+84.44499116506961
+33
+44.30190048218007
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+217.37512607438003
+20
+32.53172468447505
+30
+77.1826454162621
+11
+218.9548167376422
+21
+35.801564231111755
+31
+38.7649322509789
+12
+207.42111896467648
+22
+39.80247149799231
+32
+73.9782867431664
+13
+207.42111896467648
+23
+39.80247149799231
+33
+73.9782867431664
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+182.98549615279813
+20
+38.083946484664395
+30
+115.34843597412343
+11
+171.5991877387955
+21
+61.74787757767486
+31
+116.39614334106679
+12
+138.51341932409755
+22
+64.81766127479665
+32
+143.18268661499258
+13
+138.51341932409755
+23
+64.81766127479665
+33
+143.18268661499258
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+92.50636447374413
+20
+136.2549702313652
+30
+73.33927536010975
+11
+103.76048879519851
+21
+136.48234801755024
+31
+58.15231475830312
+12
+100.94052338838935
+22
+135.92532829482312
+32
+54.41940307617421
+13
+100.94052338838935
+23
+135.92532829482312
+33
+54.41940307617421
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+204.7939746080962
+20
+58.26079605075201
+30
+16.549137115480853
+11
+216.55940293656835
+21
+38.63954366082398
+31
+39.57912673950429
+12
+216.45830837827927
+22
+39.90047722260013
+32
+11.193746948244526
+13
+216.45830837827927
+23
+39.90047722260013
+33
+11.193746948244526
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+86.87753689957422
+20
+123.24066942718915
+30
+120.82242355346914
+11
+118.52139172890983
+21
+112.44507824166051
+31
+104.34513473510975
+12
+84.3550820718996
+22
+133.34903899754426
+32
+95.55749282837148
+13
+84.3550820718996
+23
+133.34903899754426
+33
+95.55749282837148
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+92.80332265180812
+20
+128.9520069214947
+30
+84.23550949096914
+11
+62.25607557757863
+21
+142.76034947971638
+31
+55.64859161377187
+12
+63.31394560770165
+22
+139.55192662667835
+32
+66.15037307739492
+13
+63.31394560770165
+23
+139.55192662667835
+33
+66.15037307739492
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+154.36488865751897
+20
+86.41977245781482
+30
+0.0
+11
+149.84195139908925
+21
+74.64484730505322
+31
+8.71037139892812
+12
+151.34232555055112
+22
+68.24278612394096
+32
+0.0
+13
+151.34232555055112
+23
+68.24278612394096
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+7.777562142666184
+20
+-121.65989554273425
+30
+13.434695434572651
+11
+14.772368319333834
+21
+-125.86523022887934
+31
+10.28013992309804
+12
+25.971264578278895
+22
+-126.93007467404382
+32
+12.041272735598042
+13
+25.971264578278895
+23
+-126.93007467404382
+33
+12.041272735598042
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+216.92884973224034
+20
+39.56057013270216
+30
+0.0
+11
+219.21143502113335
+21
+35.752244739321284
+31
+9.931711578371479
+12
+219.17149969811135
+22
+36.68411922973808
+32
+0.0
+13
+219.17149969811135
+23
+36.68411922973808
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+115.40787520384355
+20
+-120.34336660335758
+30
+3.2336708068871047
+11
+108.88662792181431
+21
+-123.62229896536476
+31
+0.0
+12
+111.03369727135565
+22
+-122.83041635292801
+32
+0.0
+13
+111.03369727135565
+23
+-122.83041635292801
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+108.88662792181431
+20
+-123.62229896536476
+30
+0.0
+11
+115.40787520384355
+21
+-120.34336660335758
+31
+3.2336708068871047
+12
+105.03443755955936
+22
+-122.74550505359352
+32
+8.50292282104726
+13
+105.03443755955936
+23
+-122.74550505359352
+33
+8.50292282104726
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+116.6678811827417
+20
+-115.94492071125762
+30
+17.154235839846088
+11
+105.03443755955936
+21
+-122.74550505359352
+31
+8.50292282104726
+12
+115.40787520384355
+22
+-120.34336660335758
+32
+3.2336708068871047
+13
+115.40787520384355
+23
+-120.34336660335758
+33
+3.2336708068871047
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+127.4816729267906
+20
+-107.99558325301427
+30
+26.678751373293352
+11
+120.9808431767533
+21
+-116.59633083472264
+31
+8.052078247072652
+12
+135.2334332656079
+22
+-108.3308499386207
+32
+9.900608825685932
+13
+135.2334332656079
+23
+-108.3308499386207
+33
+9.900608825685932
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+55.150208871203944
+20
+132.6944441872318
+30
+114.67192687988515
+11
+84.3550820718996
+21
+133.34903899754426
+31
+95.55749282837148
+12
+42.63913312726797
+22
+141.27697085673032
+32
+88.5086982727074
+13
+42.63913312726797
+23
+141.27697085673032
+33
+88.5086982727074
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+206.90302237282341
+20
+41.525801589094264
+30
+73.3891754150414
+11
+185.70556463529354
+21
+38.12799421867215
+31
+112.66933593750234
+12
+207.42111896467648
+22
+39.80247149799231
+32
+73.9782867431664
+13
+207.42111896467648
+23
+39.80247149799231
+33
+73.9782867431664
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+74.20944273647525
+20
+140.9556222801298
+30
+22.822494506838275
+11
+103.12958334716033
+21
+125.47251047399183
+31
+0.0
+12
+90.43395657931623
+22
+134.78762726965974
+32
+0.0
+13
+90.43395657931623
+23
+134.78762726965974
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+-0.026272960169515313
+20
+65.37880787012395
+30
+204.40318631739342
+11
+5.021595132014847
+21
+60.16540380598943
+31
+218.79938888550038
+12
+4.833565831436057
+22
+65.39217625737167
+32
+204.37294387817616
+13
+4.833565831436057
+23
+65.39217625737167
+33
+204.37294387817616
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+5.021595132014847
+20
+60.16540380598943
+30
+218.79938888550038
+11
+-0.026272960169515313
+21
+65.37880787012395
+31
+204.40318631739342
+12
+-0.026186689250404113
+22
+65.16412746059433
+32
+204.99571650519437
+13
+-0.026186689250404113
+23
+65.16412746059433
+33
+204.99571650519437
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+170.4736803674982
+20
+68.64791972018268
+30
+9.755365753176166
+11
+188.03455346346396
+21
+63.19172801481241
+31
+0.0
+12
+178.772471908505
+22
+64.0519796591585
+32
+0.0
+13
+178.772471908505
+23
+64.0519796591585
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+188.03455346346396
+20
+63.19172801481241
+30
+0.0
+11
+170.4736803674982
+21
+68.64791972018268
+31
+9.755365753176166
+12
+187.89936404881297
+22
+64.72587162397546
+32
+3.880530548098042
+13
+187.89936404881297
+23
+64.72587162397546
+33
+3.880530548098042
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+200.44433780671957
+20
+7.735200596684099
+30
+110.80937194824452
+11
+190.7419070878849
+21
+22.38819599131207
+31
+113.19692001343007
+12
+190.7825693092046
+22
+6.585408168874486
+32
+107.58137130737538
+13
+190.7825693092046
+23
+6.585408168874486
+33
+107.58137130737538
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+36.14720892522894
+20
+-130.96802308450057
+30
+6.595674896242573
+11
+29.452586355276292
+21
+-132.5583955320613
+31
+0.0
+12
+39.71140082925173
+22
+-133.49337109749126
+32
+0.0
+13
+39.71140082925173
+23
+-133.49337109749126
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+29.452586355276292
+20
+-132.5583955320613
+30
+0.0
+11
+36.14720892522894
+21
+-130.96802308450057
+31
+6.595674896242573
+12
+22.036768218700455
+22
+-130.48219224049564
+32
+4.197274780275777
+13
+22.036768218700455
+23
+-130.48219224049564
+33
+4.197274780275777
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+110.39769380652112
+20
+-31.863111968658878
+30
+134.80296554565663
+11
+81.65900918452202
+21
+-49.753905305996085
+31
+127.85261459350819
+12
+117.8541167606565
+22
+-39.13168745878485
+32
+124.1381126403832
+13
+117.8541167606565
+23
+-39.13168745878485
+33
+124.1381126403832
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+185.70556463529354
+20
+38.12799421867215
+30
+112.66933593750234
+11
+217.37512607438003
+21
+32.53172468447505
+31
+77.1826454162621
+12
+207.42111896467648
+22
+39.80247149799231
+32
+73.9782867431664
+13
+207.42111896467648
+23
+39.80247149799231
+33
+73.9782867431664
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+99.81399386175806
+20
+137.20697006426357
+30
+22.83160247802968
+11
+130.7898412057679
+21
+111.07727073990137
+31
+0.0
+12
+127.8380798450767
+22
+113.04186127667909
+32
+0.0
+13
+127.8380798450767
+23
+113.04186127667909
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+130.7898412057679
+20
+111.07727073990137
+30
+0.0
+11
+99.81399386175806
+21
+137.20697006426357
+31
+22.83160247802968
+12
+115.51295084007931
+22
+129.15121504102106
+32
+32.74126892090077
+13
+115.51295084007931
+23
+129.15121504102106
+33
+32.74126892090077
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+136.91684205469312
+20
+116.01010142603424
+30
+59.96547927856679
+11
+147.9990534681572
+21
+102.40031360274811
+31
+34.89947052002187
+12
+149.05891423768966
+22
+107.43604409159036
+32
+25.579787445070696
+13
+149.05891423768966
+23
+107.43604409159036
+33
+25.579787445070696
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+121.74597301396997
+20
+65.8264346825095
+30
+157.56087875366444
+11
+138.51341932409755
+21
+64.81766127479665
+31
+143.18268661499258
+12
+115.29005476676613
+22
+79.66885175450253
+32
+148.78079452514882
+13
+115.29005476676613
+23
+79.66885175450253
+33
+148.78079452514882
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+25.817439762173446
+20
+-65.92217639948196
+30
+119.06177520752186
+11
+25.14798290055617
+21
+-54.28496737296365
+31
+118.9119781494164
+12
+7.283370867188594
+22
+-67.12465406874308
+32
+109.8533256530785
+13
+7.283370867188594
+23
+-67.12465406874308
+33
+109.8533256530785
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+103.76048879519851
+20
+136.48234801755024
+30
+58.15231475830312
+11
+115.51295084007931
+21
+129.15121504102106
+31
+32.74126892090077
+12
+100.94052338838935
+22
+135.92532829482312
+32
+54.41940307617421
+13
+100.94052338838935
+23
+135.92532829482312
+33
+54.41940307617421
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+185.70556463529354
+20
+38.12799421867215
+30
+112.66933593750234
+11
+190.7419070878849
+21
+22.38819599131207
+31
+113.19692001343007
+12
+217.37512607438003
+22
+32.53172468447505
+32
+77.1826454162621
+13
+217.37512607438003
+23
+32.53172468447505
+33
+77.1826454162621
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+145.50744714167047
+20
+107.53670413376163
+30
+16.211463928224994
+11
+154.2773776960589
+21
+94.9881733748572
+31
+0.0
+12
+135.09251970882826
+22
+108.6654777961255
+32
+0.0
+13
+135.09251970882826
+23
+108.6654777961255
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+84.3550820718996
+20
+133.34903899754426
+30
+95.55749282837148
+11
+66.46316783675442
+21
+138.20167265170429
+31
+76.33250350952382
+12
+42.63913312726797
+22
+141.27697085673032
+32
+88.5086982727074
+13
+42.63913312726797
+23
+141.27697085673032
+33
+88.5086982727074
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.6071905943340685
+20
+-124.02204353602654
+30
+1.6173934936546828
+11
+0.5870153282377297
+21
+-124.52170526188353
+31
+0.0
+12
+1.2293774996949274
+22
+-124.7327474863056
+32
+0.0
+13
+1.2293774996949274
+23
+-124.7327474863056
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+19.02238711711249
+20
+-59.83480352459098
+30
+175.92351760864491
+11
+0.01446138307444743
+21
+-78.0452778863315
+31
+186.11960067749257
+12
+0.025193857765572668
+22
+-62.69352123761148
+32
+173.698844776774
+13
+0.025193857765572668
+23
+-62.69352123761148
+33
+173.698844776774
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.9323663041737
+20
+-51.87086758562435
+30
+1.5632014827099083
+11
+153.34938233885683
+21
+-53.25682195518751
+31
+0.0
+12
+151.99282971390107
+22
+-53.6510444314634
+32
+1.9043187908133887
+13
+151.99282971390107
+23
+-53.6510444314634
+33
+1.9043187908133887
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+153.34938233885683
+20
+-53.25682195518751
+30
+0.0
+11
+151.9323663041737
+21
+-51.87086758562435
+31
+1.5632014827099083
+12
+151.83991490891796
+22
+-44.753153844529905
+32
+0.0
+13
+151.83991490891796
+23
+-44.753153844529905
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.83991490891796
+20
+-44.753153844529905
+30
+0.0
+11
+151.9323663041737
+21
+-51.87086758562435
+31
+1.5632014827099083
+12
+151.86293395995477
+22
+-50.52395270772306
+32
+1.3367230930671865
+13
+151.86293395995477
+23
+-50.52395270772306
+33
+1.3367230930671865
+70
+13
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.83991490891796
+20
+-44.753153844529905
+30
+0.0
+11
+151.86293395995477
+21
+-50.52395270772306
+31
+1.3367230930671865
+12
+151.83105470665396
+22
+-49.7244210622198
+32
+1.1898221896253005
+13
+151.83105470665396
+23
+-49.7244210622198
+33
+1.1898221896253005
+70
+13
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.83991490891796
+20
+-44.753153844529905
+30
+0.0
+11
+151.83105470665396
+21
+-49.7244210622198
+31
+1.1898221896253005
+12
+151.7059043983753
+22
+-46.225900788401866
+32
+0.5278777213003935
+13
+151.7059043983753
+23
+-46.225900788401866
+33
+0.5278777213003935
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+175.4888346369488
+20
+-69.69151204847134
+30
+15.290202331545308
+11
+167.50483309564154
+21
+-61.303847657600755
+31
+0.0
+12
+170.69633316787034
+22
+-62.611042677899285
+32
+0.0
+13
+170.69633316787034
+23
+-62.611042677899285
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+167.50483309564154
+20
+-61.303847657600755
+30
+0.0
+11
+175.4888346369488
+21
+-69.69151204847134
+31
+15.290202331545308
+12
+151.3061315778026
+22
+-73.13826370527374
+32
+55.18243789673085
+13
+151.3061315778026
+23
+-73.13826370527374
+33
+55.18243789673085
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+116.6678811827417
+20
+-115.94492071125762
+30
+17.154235839846088
+11
+115.40787520384355
+21
+-120.34336660335758
+31
+3.2336708068871047
+12
+120.9808431767533
+22
+-116.59633083472264
+32
+8.052078247072652
+13
+120.9808431767533
+23
+-116.59633083472264
+33
+8.052078247072652
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+125.54659463817633
+20
+110.00771531739322
+30
+102.28334197998281
+11
+140.7533405280837
+21
+104.2011442692092
+31
+86.52461395263906
+12
+116.50178522879474
+22
+135.29668358544225
+32
+74.76031265259023
+13
+116.50178522879474
+23
+135.29668358544225
+33
+74.76031265259023
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+26.560487562687555
+20
+-102.0287785956587
+30
+65.98361968994374
+11
+34.94790747236479
+21
+-103.92792391087916
+31
+60.97675476074453
+12
+46.211175362445296
+22
+-101.46793608642935
+32
+63.95254211426015
+13
+46.211175362445296
+23
+-101.46793608642935
+33
+63.95254211426015
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+177.44058171764792
+20
+-25.20296687479118
+30
+122.59876861572499
+11
+175.52766629968895
+21
+-12.841986541751243
+31
+125.19405593872304
+12
+174.23282962956503
+22
+-24.11531981420713
+32
+125.01528778076406
+13
+174.23282962956503
+23
+-24.11531981420713
+33
+125.01528778076406
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+199.91219448828042
+20
+-15.002223562990654
+30
+116.19082641601796
+11
+194.04204400752366
+21
+-29.31000193363566
+31
+111.22407531738514
+12
+215.77580174640133
+22
+-40.78711231556601
+32
+73.87683944702383
+13
+215.77580174640133
+23
+-40.78711231556601
+33
+73.87683944702383
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+46.211175362445296
+20
+-101.46793608642935
+30
+63.95254211426015
+11
+34.94790747236479
+21
+-103.92792391087916
+31
+60.97675476074453
+12
+43.459056918258014
+22
+-106.62524398251513
+32
+53.74337844848866
+13
+43.459056918258014
+23
+-106.62524398251513
+33
+53.74337844848866
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+192.24675941868443
+20
+-31.464257637280877
+30
+108.46978607177968
+11
+175.52766629968895
+21
+-12.841986541751243
+31
+125.19405593872304
+12
+177.44058171764792
+22
+-25.20296687479118
+32
+122.59876861572499
+13
+177.44058171764792
+23
+-25.20296687479118
+33
+122.59876861572499
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+46.211175362445296
+20
+-101.46793608642935
+30
+63.95254211426015
+11
+43.459056918258014
+21
+-106.62524398251513
+31
+53.74337844848866
+12
+59.210725004631314
+22
+-102.79888199127868
+32
+58.6892974853539
+13
+59.210725004631314
+23
+-102.79888199127868
+33
+58.6892974853539
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+220.90651394503544
+20
+-52.87544335174036
+30
+24.26252288818593
+11
+219.2931652251469
+21
+-55.43566949142061
+31
+0.0
+12
+220.1168090085038
+22
+-55.19014345471434
+32
+0.0
+13
+220.1168090085038
+23
+-55.19014345471434
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+219.2931652251469
+20
+-55.43566949142061
+30
+0.0
+11
+220.90651394503544
+21
+-52.87544335174036
+31
+24.26252288818593
+12
+217.27927294666756
+22
+-54.026390900238226
+32
+23.449491119387105
+13
+217.27927294666756
+23
+-54.026390900238226
+33
+23.449491119387105
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+69.81845974147731
+20
+-87.62951670969532
+30
+80.83707351684804
+11
+56.59145931336226
+21
+-92.05718658181614
+31
+76.87791595459218
+12
+69.32230868953137
+22
+-96.9760356735265
+32
+66.93278656006093
+13
+69.32230868953137
+23
+-96.9760356735265
+33
+66.93278656006093
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+15.11313916305249
+20
+135.61150121858162
+30
+20.885597229006244
+11
+40.879848516804095
+21
+147.6847047742757
+31
+20.258600616457414
+12
+14.774208697011588
+22
+133.66629357036655
+32
+1.2406723022484327
+13
+14.774208697011588
+23
+133.66629357036655
+33
+1.2406723022484327
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+217.37512607438003
+20
+32.53172468447505
+30
+77.1826454162621
+11
+244.6718856778938
+21
+-9.207369090537865
+31
+19.739640045168354
+12
+229.00145417766717
+22
+24.242968678134183
+32
+36.48416061401601
+13
+229.00145417766717
+23
+24.242968678134183
+33
+36.48416061401601
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+67.75847079221415
+20
+-79.75431990006238
+30
+93.67640609741444
+11
+53.91845576706572
+21
+-84.62691278378351
+31
+87.98566818237538
+12
+69.81845974147731
+22
+-87.62951670969532
+32
+80.83707351684804
+13
+69.81845974147731
+23
+-87.62951670969532
+33
+80.83707351684804
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+169.2437445983676
+20
+3.1643723432239965
+30
+130.26525802612537
+11
+158.7523056700532
+21
+10.39219245211727
+31
+139.12789535522694
+12
+122.49228585932734
+22
+-3.0641840966889538
+32
+141.18649063110584
+13
+122.49228585932734
+23
+-3.0641840966889538
+33
+141.18649063110584
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+230.12333639944836
+20
+-25.312636344470338
+30
+80.34165802002187
+11
+220.90651394503544
+21
+-52.87544335174036
+31
+24.26252288818593
+12
+236.07976970600353
+22
+-37.84789037714662
+32
+19.98071060180898
+13
+236.07976970600353
+23
+-37.84789037714662
+33
+19.98071060180898
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+218.9548167376422
+20
+35.801564231111755
+30
+38.7649322509789
+11
+217.37512607438003
+21
+32.53172468447505
+31
+77.1826454162621
+12
+229.00145417766717
+22
+24.242968678134183
+32
+36.48416061401601
+13
+229.00145417766717
+23
+24.242968678134183
+33
+36.48416061401601
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+50.55326107597861
+20
+-117.7466263876579
+30
+34.38709869384999
+11
+48.40894733941087
+21
+-128.93939980687477
+31
+14.759420776369526
+12
+65.84112982936476
+22
+-126.49859746656867
+32
+17.50547409057851
+13
+65.84112982936476
+23
+-126.49859746656867
+33
+17.50547409057851
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+217.37512607438003
+20
+32.53172468447505
+30
+77.1826454162621
+11
+230.86234524196817
+21
+1.9526077427172908
+31
+80.8289344787621
+12
+244.6718856778938
+22
+-9.207369090537865
+32
+19.739640045168354
+13
+244.6718856778938
+23
+-9.207369090537865
+33
+19.739640045168354
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+27.15749465289185
+20
+-105.80300186201474
+30
+57.46921691894765
+11
+16.23002819403411
+21
+-108.85591227392446
+31
+49.2525672912621
+12
+28.208062084038428
+22
+-107.28267169965386
+32
+53.25455169677968
+13
+28.208062084038428
+23
+-107.28267169965386
+33
+53.25455169677968
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+50.55326107597861
+20
+-117.7466263876579
+30
+34.38709869384999
+11
+65.84112982936476
+21
+-126.49859746656867
+31
+17.50547409057851
+12
+79.48342859322611
+22
+-121.90001834562811
+32
+22.241037750246477
+13
+79.48342859322611
+23
+-121.90001834562811
+33
+22.241037750246477
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+110.39769380652112
+20
+-31.863111968658878
+30
+134.80296554565663
+11
+69.95140161686146
+21
+-30.45388967754856
+31
+126.64367675781483
+12
+81.65900918452202
+22
+-49.753905305996085
+32
+127.85261459350819
+13
+81.65900918452202
+23
+-49.753905305996085
+33
+127.85261459350819
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+84.1775180445552
+20
+92.9158681993883
+30
+154.44343338012928
+11
+115.1803133245149
+21
+91.20113208160397
+31
+137.0138771057152
+12
+82.9141493203411
+22
+103.2558529241941
+32
+144.6205833435082
+13
+82.9141493203411
+23
+103.2558529241941
+33
+144.6205833435082
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+36.139489387443064
+20
+-111.1176281919382
+30
+45.64590759277577
+11
+26.52422657620338
+21
+-113.76011428459759
+31
+39.985206604006244
+12
+50.55326107597861
+22
+-117.7466263876579
+32
+34.38709869384999
+13
+50.55326107597861
+23
+-117.7466263876579
+33
+34.38709869384999
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+171.5991877387955
+20
+61.74787757767486
+30
+116.39614334106679
+11
+117.40105656268344
+21
+108.74435399057943
+31
+120.14184494018788
+12
+115.1803133245149
+22
+91.20113208160397
+32
+137.0138771057152
+13
+115.1803133245149
+23
+91.20113208160397
+33
+137.0138771057152
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+69.32230868953137
+20
+-96.9760356735265
+30
+66.93278656006093
+11
+46.211175362445296
+21
+-101.46793608642935
+31
+63.95254211426015
+12
+59.210725004631314
+22
+-102.79888199127868
+32
+58.6892974853539
+13
+59.210725004631314
+23
+-102.79888199127868
+33
+58.6892974853539
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+154.21711265481727
+20
+76.04300361825611
+30
+10.822936248781636
+11
+165.2231583967426
+21
+64.53610516473599
+31
+0.0
+12
+163.0676707146204
+22
+65.53557203523478
+32
+0.0
+13
+163.0676707146204
+23
+65.53557203523478
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+165.2231583967426
+20
+64.53610516473599
+30
+0.0
+11
+154.21711265481727
+21
+76.04300361825611
+31
+10.822936248781636
+12
+167.94206812840088
+22
+69.344496128591
+32
+10.257660675051167
+13
+167.94206812840088
+23
+69.344496128591
+33
+10.257660675051167
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+181.84796302336758
+20
+-2.7564647629286942
+30
+117.17845993042225
+11
+200.44433780671957
+21
+7.735200596684099
+31
+110.80937194824452
+12
+190.7825693092046
+22
+6.585408168874486
+32
+107.58137130737538
+13
+190.7825693092046
+23
+6.585408168874486
+33
+107.58137130737538
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+185.70556463529354
+20
+38.12799421867215
+30
+112.66933593750234
+11
+171.5991877387955
+21
+61.74787757767486
+31
+116.39614334106679
+12
+182.98549615279813
+22
+38.083946484664395
+32
+115.34843597412343
+13
+182.98549615279813
+23
+38.083946484664395
+33
+115.34843597412343
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+99.05089376025111
+20
+124.37416933837898
+30
+91.57227096557851
+11
+104.72919069896854
+21
+128.40165995503256
+31
+87.60904388427967
+12
+97.51366972732319
+22
+133.2224075207094
+32
+79.49422912597889
+13
+97.51366972732319
+23
+133.2224075207094
+33
+79.49422912597889
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+154.36488865751897
+20
+86.41977245781482
+30
+0.0
+11
+152.70269307998663
+21
+94.70888173708776
+31
+14.83305969238515
+12
+149.84195139908925
+22
+74.64484730505322
+32
+8.71037139892812
+13
+149.84195139908925
+23
+74.64484730505322
+33
+8.71037139892812
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+152.70269307998663
+20
+94.70888173708776
+30
+14.83305969238515
+11
+154.36488865751897
+21
+86.41977245781482
+31
+0.0
+12
+155.65543564267765
+22
+92.47526870173299
+32
+0.0
+13
+155.65543564267765
+23
+92.47526870173299
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+74.20944273647525
+20
+140.9556222801298
+30
+22.822494506838275
+11
+90.43395657931623
+21
+134.78762726965974
+31
+0.0
+12
+81.7134066446291
+22
+135.0917010489897
+32
+0.0
+13
+81.7134066446291
+23
+135.0917010489897
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+92.50636447374413
+20
+136.2549702313652
+30
+73.33927536010975
+11
+100.94052338838935
+21
+135.92532829482312
+31
+54.41940307617421
+12
+80.57553070940972
+22
+147.50468839360968
+32
+59.22618331909413
+13
+80.57553070940972
+23
+147.50468839360968
+33
+59.22618331909413
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+158.7523056700532
+20
+10.39219245211727
+30
+139.12789535522694
+11
+134.63333399528074
+21
+13.30445350255567
+31
+152.02788314819568
+12
+122.49228585932734
+22
+-3.0641840966889538
+32
+141.18649063110584
+13
+122.49228585932734
+23
+-3.0641840966889538
+33
+141.18649063110584
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+55.150208871203944
+20
+132.6944441872318
+30
+114.67192687988515
+11
+42.63913312726797
+21
+141.27697085673032
+31
+88.5086982727074
+12
+17.15698235956875
+22
+126.44660787160322
+32
+96.0854644775414
+13
+17.15698235956875
+23
+126.44660787160322
+33
+96.0854644775414
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+92.80332265180812
+20
+128.9520069214947
+30
+84.23550949096914
+11
+92.50636447374413
+21
+136.2549702313652
+31
+73.33927536010975
+12
+80.57553070940972
+22
+147.50468839360968
+32
+59.22618331909413
+13
+80.57553070940972
+23
+147.50468839360968
+33
+59.22618331909413
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+52.40052851339469
+20
+109.46549365939855
+30
+150.09931869507068
+11
+82.9141493203411
+21
+103.2558529241941
+31
+144.6205833435082
+12
+86.87753689957422
+22
+123.24066942718915
+32
+120.82242355346914
+13
+86.87753689957422
+23
+123.24066942718915
+33
+120.82242355346914
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+105.03443755955936
+20
+-122.74550505359352
+30
+8.50292282104726
+11
+103.75203731527698
+21
+-125.32052411763623
+31
+0.0
+12
+108.88662792181431
+22
+-123.62229896536476
+32
+0.0
+13
+108.88662792181431
+23
+-123.62229896536476
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+142.1847572847631
+20
+40.136738826247395
+30
+150.753154754641
+11
+138.51341932409755
+21
+64.81766127479665
+31
+143.18268661499258
+12
+121.74597301396997
+22
+65.8264346825095
+32
+157.56087875366444
+13
+121.74597301396997
+23
+65.8264346825095
+33
+157.56087875366444
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+188.47690987917392
+20
+22.19452590733552
+30
+115.46267318725819
+11
+183.42379086336052
+21
+9.84540546391183
+31
+123.99170684814686
+12
+188.6310264567061
+22
+7.319584772449233
+32
+109.88568801880116
+13
+188.6310264567061
+23
+7.319584772449233
+33
+109.88568801880116
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+96.95989103267041
+20
+-55.539495505447455
+30
+119.62908554077381
+11
+73.30992256174021
+21
+-64.91956124198337
+31
+113.15273666382069
+12
+90.83398772969562
+22
+-65.80716423991764
+32
+104.28903350830312
+13
+90.83398772969562
+23
+-65.80716423991764
+33
+104.28903350830312
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+199.91219448828042
+20
+-15.002223562990654
+30
+116.19082641601796
+11
+175.52766629968895
+21
+-12.841986541751243
+31
+125.19405593872304
+12
+194.04204400752366
+22
+-29.31000193363566
+32
+111.22407531738514
+13
+194.04204400752366
+23
+-29.31000193363566
+33
+111.22407531738514
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+127.4816729267906
+20
+-107.99558325301427
+30
+26.678751373293352
+11
+116.6678811827417
+21
+-115.94492071125762
+31
+17.154235839846088
+12
+120.9808431767533
+22
+-116.59633083472264
+32
+8.052078247072652
+13
+120.9808431767533
+23
+-116.59633083472264
+33
+8.052078247072652
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+212.79099835266834
+20
+-43.18861000652798
+30
+72.74522247314687
+11
+203.26135317129248
+21
+-59.96100273169112
+31
+32.90947570801015
+12
+217.27927294666756
+22
+-54.026390900238226
+32
+23.449491119387105
+13
+217.27927294666756
+23
+-54.026390900238226
+33
+23.449491119387105
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+188.47690987917392
+20
+22.19452590733552
+30
+115.46267318725819
+11
+177.1695251881023
+21
+16.252384509584317
+31
+130.34005966186757
+12
+183.42379086336052
+22
+9.84540546391183
+32
+123.99170684814686
+13
+183.42379086336052
+23
+9.84540546391183
+33
+123.99170684814686
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+182.98549615279813
+20
+38.083946484664395
+30
+115.34843597412343
+11
+180.965843781971
+21
+37.978046827702755
+31
+117.69906768799062
+12
+188.47690987917392
+22
+22.19452590733552
+32
+115.46267318725819
+13
+188.47690987917392
+23
+22.19452590733552
+33
+115.46267318725819
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+212.79099835266834
+20
+-43.18861000652798
+30
+72.74522247314687
+11
+204.92696625684476
+21
+-54.8285987402056
+31
+79.67357864380116
+12
+203.26135317129248
+22
+-59.96100273169112
+32
+32.90947570801015
+13
+203.26135317129248
+23
+-59.96100273169112
+33
+32.90947570801015
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+69.81874575557137
+20
+140.72638469938852
+30
+22.699052429201558
+11
+77.22319314549554
+21
+135.2290095283172
+31
+0.0
+12
+67.45071519615227
+22
+133.35320891176647
+32
+0.0
+13
+67.45071519615227
+23
+133.35320891176647
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.3061315778026
+20
+-73.13826370527374
+30
+55.18243789673085
+11
+175.4888346369488
+21
+-69.69151204847134
+31
+15.290202331545308
+12
+178.4838918318595
+22
+-69.9756787612536
+32
+30.28424835205312
+13
+178.4838918318595
+23
+-69.9756787612536
+33
+30.28424835205312
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+135.2334332656079
+20
+-108.3308499386207
+30
+9.900608825685932
+11
+125.75512640643448
+21
+-115.86941167332861
+31
+0.0
+12
+131.46387231459195
+22
+-111.87433149397688
+32
+0.0
+13
+131.46387231459195
+23
+-111.87433149397688
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+5.632285215677397
+20
+83.12698528573927
+30
+172.18227310180896
+11
+14.583399960279245
+21
+83.57618995356563
+31
+171.3879417419457
+12
+15.643772469218579
+22
+92.96280484629457
+32
+160.49926528930897
+13
+15.643772469218579
+23
+92.96280484629457
+33
+160.49926528930897
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+5.365449429434058
+20
+93.63519039605828
+30
+161.4753684997582
+11
+16.78467292994558
+21
+99.67821082340613
+31
+149.5966361999535
+12
+5.180551221005454
+22
+101.01578950761697
+32
+149.70321884155507
+13
+5.180551221005454
+23
+101.01578950761697
+33
+149.70321884155507
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+15.643772469218579
+20
+92.96280484629457
+30
+160.49926528930897
+11
+42.83637871076835
+21
+91.29773246584627
+31
+158.93172531128164
+12
+16.78467292994558
+22
+99.67821082340613
+32
+149.5966361999535
+13
+16.78467292994558
+23
+99.67821082340613
+33
+149.5966361999535
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+5.365449429434058
+20
+93.63519039605828
+30
+161.4753684997582
+11
+15.643772469218579
+21
+92.96280484629457
+31
+160.49926528930897
+12
+16.78467292994558
+22
+99.67821082340613
+32
+149.5966361999535
+13
+16.78467292994558
+23
+99.67821082340613
+33
+149.5966361999535
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+5.632285215677397
+20
+83.12698528573927
+30
+172.18227310180896
+11
+15.643772469218579
+21
+92.96280484629457
+31
+160.49926528930897
+12
+5.365449429434058
+22
+93.63519039605828
+32
+161.4753684997582
+13
+5.365449429434058
+23
+93.63519039605828
+33
+161.4753684997582
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+-0.04086295198269787
+20
+101.6851953277741
+30
+150.22026565573748
+11
+5.365449429434058
+21
+93.63519039605828
+31
+161.4753684997582
+12
+5.180551221005454
+22
+101.01578950761697
+32
+149.70321884155507
+13
+5.180551221005454
+23
+101.01578950761697
+33
+149.70321884155507
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+5.365449429434058
+20
+93.63519039605828
+30
+161.4753684997582
+11
+-0.04086295198269787
+21
+101.6851953277741
+31
+150.22026565573748
+12
+-0.0405086917093023
+22
+100.80363823653525
+32
+151.63297713602995
+13
+-0.0405086917093023
+23
+100.80363823653525
+33
+151.63297713602995
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+-0.05020972633658705
+20
+124.944126211433
+30
+3.540302515017828
+11
+1.4961295113643602
+21
+124.53245820934018
+31
+0.0
+12
+-0.0500415877968566
+22
+124.52572275737768
+32
+0.0
+13
+-0.0500415877968566
+23
+124.52572275737768
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+1.4961295113643602
+20
+124.53245820934018
+30
+0.0
+11
+-0.05020972633658705
+21
+124.944126211433
+31
+3.540302515017828
+12
+1.2722054435333228
+22
+124.94908956324593
+32
+3.533555603029683
+13
+1.2722054435333228
+23
+124.94908956324593
+33
+3.533555603029683
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+21.013271463404344
+20
+-47.65891868098439
+30
+167.59166183471913
+11
+11.141953614717861
+21
+-52.17836390704888
+31
+146.17203903198475
+12
+26.9468247467991
+22
+-49.765563307927465
+32
+148.71781387329335
+13
+26.9468247467991
+23
+-49.765563307927465
+33
+148.71781387329335
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+15.073935543367746
+20
+-57.97883311479523
+30
+161.18546371460195
+11
+0.02453688617904326
+21
+-61.05868379050047
+31
+160.0664995552436
+12
+0.024525390752426
+22
+-61.03007805733403
+32
+159.91138387582086
+13
+0.024525390752426
+23
+-61.03007805733403
+33
+159.91138387582086
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.02453688617904326
+20
+-61.05868379050047
+30
+160.0664995552436
+11
+15.073935543367746
+21
+-57.97883311479523
+31
+161.18546371460195
+12
+19.02238711711249
+22
+-59.83480352459098
+32
+175.92351760864491
+13
+19.02238711711249
+23
+-59.83480352459098
+33
+175.92351760864491
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+3.7096038563558142
+20
+-122.6878859384345
+30
+8.341983032228901
+11
+3.9603229688590167
+21
+-125.04834507679071
+31
+1.8160247802757765
+12
+8.697919079694389
+22
+-125.02888176130455
+32
+8.063802337648823
+13
+8.697919079694389
+23
+-125.02888176130455
+33
+8.063802337648823
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+15.073935543367746
+20
+-57.97883311479523
+30
+161.18546371460195
+11
+0.024476987326960974
+21
+-60.90962881081268
+31
+159.6433451772179
+12
+11.141953614717861
+22
+-52.17836390704888
+32
+146.17203903198475
+13
+11.141953614717861
+23
+-52.17836390704888
+33
+146.17203903198475
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.024476987326960974
+20
+-60.90962881081268
+30
+159.6433451772179
+11
+15.073935543367746
+21
+-57.97883311479523
+31
+161.18546371460195
+12
+0.024525390752426
+22
+-61.03007805733403
+32
+159.91138387582086
+13
+0.024525390752426
+23
+-61.03007805733403
+33
+159.91138387582086
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+1.5395736768139905
+20
+-120.17932471354824
+30
+13.948520660402728
+11
+3.7096038563558142
+21
+-122.6878859384345
+31
+8.341983032228901
+12
+7.777562142666184
+22
+-121.65989554273425
+32
+13.434695434572651
+13
+7.777562142666184
+23
+-121.65989554273425
+33
+13.434695434572651
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+3.495138650567074
+20
+-115.44933195030296
+30
+28.07042999267812
+11
+2.3217162041567367
+21
+-118.13358811619385
+31
+20.205309295656633
+12
+10.853295282084991
+22
+-117.02825844932259
+32
+27.598268890383196
+13
+10.853295282084991
+23
+-117.02825844932259
+33
+27.598268890383196
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+30.914353013644988
+20
+-44.46661185357005
+30
+189.0295005798363
+11
+19.02238711711249
+21
+-59.83480352459098
+31
+175.92351760864491
+12
+15.073935543367746
+22
+-57.97883311479523
+32
+161.18546371460195
+13
+15.073935543367746
+23
+-57.97883311479523
+33
+161.18546371460195
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+5.242444526304533
+20
+-111.88602841398722
+30
+38.0486968994164
+11
+0.046248137040899195
+21
+-115.085930418112
+31
+28.20300842683369
+12
+3.495138650567074
+22
+-115.44933195030296
+32
+28.07042999267812
+13
+3.495138650567074
+23
+-115.44933195030296
+33
+28.07042999267812
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.046248137040899195
+20
+-115.085930418112
+30
+28.20300842683369
+11
+5.242444526304533
+21
+-111.88602841398722
+31
+38.0486968994164
+12
+0.04608372890606319
+22
+-114.67680987009162
+32
+29.299669888532996
+13
+0.04608372890606319
+23
+-114.67680987009162
+33
+29.299669888532996
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+56.866376229840064
+20
+-3.606717867156979
+30
+186.77653732300038
+11
+49.28241357964126
+21
+-26.45582422833583
+31
+179.42485427856678
+12
+47.82451221182149
+22
+-15.83145324597668
+32
+152.48676986694568
+13
+47.82451221182149
+23
+-15.83145324597668
+33
+152.48676986694568
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+16.23002819403411
+20
+-108.85591227392446
+30
+49.2525672912621
+11
+5.242444526304533
+21
+-111.88602841398722
+31
+38.0486968994164
+12
+10.585426621271441
+22
+-112.50768260530661
+32
+38.496925354006244
+13
+10.585426621271441
+23
+-112.50768260530661
+33
+38.496925354006244
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+11.829675628140505
+20
+-101.56674537310413
+30
+65.71096191406484
+11
+0.04066786013916875
+21
+-101.19972006845038
+31
+65.57063398307184
+12
+0.04072980174330136
+22
+-101.35385832356576
+32
+65.29615931767584
+13
+0.04072980174330136
+23
+-101.35385832356576
+33
+65.29615931767584
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.04066786013916875
+20
+-101.19972006845038
+30
+65.57063398307184
+11
+11.829675628140505
+21
+-101.56674537310413
+31
+65.71096191406484
+12
+15.565032628677455
+22
+-96.62433991611047
+32
+74.76360702514881
+13
+15.565032628677455
+23
+-96.62433991611047
+33
+74.76360702514881
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+18.608729393985758
+20
+-105.70742393838809
+30
+57.805824279787494
+11
+9.262109099231695
+21
+-105.19397078777912
+31
+57.304498291017964
+12
+16.23002819403411
+22
+-108.85591227392446
+32
+49.2525672912621
+13
+16.23002819403411
+23
+-108.85591227392446
+33
+49.2525672912621
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+2.3217162041567367
+20
+-118.13358811619385
+30
+20.205309295656633
+11
+1.5395736768139905
+21
+-120.17932471354824
+31
+13.948520660402728
+12
+7.777562142666184
+22
+-121.65989554273425
+32
+13.434695434572651
+13
+7.777562142666184
+23
+-121.65989554273425
+33
+13.434695434572651
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.9646214097758469
+20
+-121.9219033414709
+30
+8.435581970217182
+11
+0.6071905943340685
+21
+-124.02204353602654
+31
+1.6173934936546828
+12
+3.9603229688590167
+22
+-125.04834507679071
+32
+1.8160247802757765
+13
+3.9603229688590167
+23
+-125.04834507679071
+33
+1.8160247802757765
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+2.3217162041567367
+20
+-118.13358811619385
+30
+20.205309295656633
+11
+0.048280804305569254
+21
+-120.14411045168643
+31
+13.980740264943023
+12
+1.5395736768139905
+22
+-120.17932471354824
+32
+13.948520660402728
+13
+1.5395736768139905
+23
+-120.17932471354824
+33
+13.948520660402728
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.048280804305569254
+20
+-120.14411045168643
+30
+13.980740264943023
+11
+2.3217162041567367
+21
+-118.13358811619385
+31
+20.205309295656633
+12
+0.04808711914789884
+22
+-119.66213565242029
+32
+15.445584206409052
+13
+0.04808711914789884
+23
+-119.66213565242029
+33
+15.445584206409052
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+26.560487562687555
+20
+-102.0287785956587
+30
+65.98361968994374
+11
+11.829675628140505
+21
+-101.56674537310413
+31
+65.71096191406484
+12
+9.262109099231695
+22
+-105.19397078777912
+32
+57.304498291017964
+13
+9.262109099231695
+23
+-105.19397078777912
+33
+57.304498291017964
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+11.829675628140505
+20
+-101.56674537310413
+30
+65.71096191406484
+11
+0.04080471266578682
+21
+-101.54027000980318
+31
+64.87417402588753
+12
+9.262109099231695
+22
+-105.19397078777912
+32
+57.304498291017964
+13
+9.262109099231695
+23
+-105.19397078777912
+33
+57.304498291017964
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.04080471266578682
+20
+-101.54027000980318
+30
+64.87417402588753
+11
+11.829675628140505
+21
+-101.56674537310413
+31
+65.71096191406484
+12
+0.04072980174330136
+22
+-101.35385832356576
+32
+65.29615931767584
+13
+0.04072980174330136
+23
+-101.35385832356576
+33
+65.29615931767584
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+10.853295282084991
+20
+-117.02825844932259
+30
+27.598268890383196
+11
+2.3217162041567367
+21
+-118.13358811619385
+31
+20.205309295656633
+12
+8.548231890868513
+22
+-119.46915319964964
+32
+19.605539703371477
+13
+8.548231890868513
+23
+-119.46915319964964
+33
+19.605539703371477
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+38.25772079362193
+20
+-89.2245185184614
+30
+83.51103820801015
+11
+17.323411371753323
+21
+-90.82087929668435
+31
+83.42044296264882
+12
+15.565032628677455
+22
+-96.62433991611047
+32
+74.76360702514881
+13
+15.565032628677455
+23
+-96.62433991611047
+33
+74.76360702514881
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+38.25772079362193
+20
+-89.2245185184614
+30
+83.51103820801015
+11
+15.565032628677455
+21
+-96.62433991611047
+31
+74.76360702514881
+12
+31.038943919519323
+22
+-96.19312892619786
+32
+74.74606933593984
+13
+31.038943919519323
+23
+-96.19312892619786
+33
+74.74606933593984
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+15.565032628677455
+20
+-96.62433991611047
+30
+74.76360702514881
+11
+26.560487562687555
+21
+-102.0287785956587
+31
+65.98361968994374
+12
+31.038943919519323
+22
+-96.19312892619786
+32
+74.74606933593984
+13
+31.038943919519323
+23
+-96.19312892619786
+33
+74.74606933593984
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+15.565032628677455
+20
+-96.62433991611047
+30
+74.76360702514881
+11
+11.829675628140505
+21
+-101.56674537310413
+31
+65.71096191406484
+12
+26.560487562687555
+22
+-102.0287785956587
+32
+65.98361968994374
+13
+26.560487562687555
+23
+-102.0287785956587
+33
+65.98361968994374
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+27.875893683307226
+20
+-83.27461953190422
+30
+91.34263381958242
+11
+17.323411371753323
+21
+-90.82087929668435
+31
+83.42044296264882
+12
+38.25772079362193
+22
+-89.2245185184614
+32
+83.51103820801015
+13
+38.25772079362193
+23
+-89.2245185184614
+33
+83.51103820801015
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+27.875893683307226
+20
+-83.27461953190422
+30
+91.34263381958242
+11
+13.960595699493846
+21
+-84.59611330969865
+31
+90.75914230346913
+12
+17.323411371753323
+22
+-90.82087929668435
+32
+83.42044296264882
+13
+17.323411371753323
+23
+-90.82087929668435
+33
+83.42044296264882
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+17.323411371753323
+20
+-90.82087929668435
+30
+83.42044296264882
+11
+0.036684195441880486
+21
+-91.2865908594376
+31
+83.56779892151812
+12
+0.03676121252740223
+22
+-91.47824361595349
+32
+83.34595771097877
+13
+0.03676121252740223
+23
+-91.47824361595349
+33
+83.34595771097877
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.036684195441880486
+20
+-91.2865908594376
+30
+83.56779892151812
+11
+17.323411371753323
+21
+-90.82087929668435
+31
+83.42044296264882
+12
+13.960595699493846
+22
+-84.59611330969865
+32
+90.75914230346913
+13
+13.960595699493846
+23
+-84.59611330969865
+33
+90.75914230346913
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+16.455430776891372
+20
+-77.79196741958572
+30
+98.03563613891835
+11
+0.0316278350720932
+21
+-78.7041178146146
+31
+96.58526062189101
+12
+13.960595699493846
+22
+-84.59611330969865
+32
+90.75914230346913
+13
+13.960595699493846
+23
+-84.59611330969865
+33
+90.75914230346913
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.0316278350720932
+20
+-78.7041178146146
+30
+96.58526062189101
+11
+16.455430776891372
+21
+-77.79196741958572
+31
+98.03563613891835
+12
+0.03155129823310684
+22
+-78.51366012507965
+32
+96.78687647882344
+13
+0.03155129823310684
+23
+-78.51366012507965
+33
+96.78687647882344
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+7.283370867188594
+20
+-67.12465406874308
+30
+109.8533256530785
+11
+0.026788218259782004
+21
+-66.66099912197765
+31
+108.79852359147976
+12
+16.455430776891372
+22
+-77.79196741958572
+32
+98.03563613891835
+13
+16.455430776891372
+23
+-77.79196741958572
+33
+98.03563613891835
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.026788218259782004
+20
+-66.66099912197765
+30
+108.79852359147976
+11
+7.283370867188594
+21
+-67.12465406874308
+31
+109.8533256530785
+12
+0.026697956681255797
+22
+-66.43638817714991
+32
+109.09150579864367
+13
+0.026697956681255797
+23
+-66.43638817714991
+33
+109.09150579864367
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+42.83637871076835
+20
+91.29773246584627
+30
+158.93172531128164
+11
+43.30262173526841
+21
+93.04861747890598
+31
+155.91117324829335
+12
+16.78467292994558
+22
+99.67821082340613
+32
+149.5966361999535
+13
+16.78467292994558
+23
+99.67821082340613
+33
+149.5966361999535
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+28.090564547544098
+20
+-54.73572811263838
+30
+194.44032515073545
+11
+21.922793997827174
+21
+-64.83968768814368
+31
+191.87167780828494
+12
+19.02238711711249
+22
+-59.83480352459098
+32
+175.92351760864491
+13
+19.02238711711249
+23
+-59.83480352459098
+33
+175.92351760864491
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+7.369323474766764
+20
+-76.32630914311012
+30
+188.98243646061863
+11
+0.01446138307444743
+21
+-78.0452778863315
+31
+186.11960067749257
+12
+19.02238711711249
+22
+-59.83480352459098
+32
+175.92351760864491
+13
+19.02238711711249
+23
+-59.83480352459098
+33
+175.92351760864491
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.01446138307444743
+20
+-78.0452778863315
+30
+186.11960067749257
+11
+7.369323474766764
+21
+-76.32630914311012
+31
+188.98243646061863
+12
+3.386200322442161
+22
+-78.12239892356456
+32
+188.5376621922188
+13
+3.386200322442161
+23
+-78.12239892356456
+33
+188.5376621922188
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+21.922793997827174
+20
+-64.83968768814368
+30
+191.87167780828494
+11
+7.369323474766764
+21
+-76.32630914311012
+31
+188.98243646061863
+12
+19.02238711711249
+22
+-59.83480352459098
+32
+175.92351760864491
+13
+19.02238711711249
+23
+-59.83480352459098
+33
+175.92351760864491
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+30.914353013644988
+20
+-44.46661185357005
+30
+189.0295005798363
+11
+28.090564547544098
+21
+-54.73572811263838
+31
+194.44032515073545
+12
+19.02238711711249
+22
+-59.83480352459098
+32
+175.92351760864491
+13
+19.02238711711249
+23
+-59.83480352459098
+33
+175.92351760864491
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+28.090564547544098
+20
+-54.73572811263838
+30
+194.44032515073545
+11
+30.914353013644988
+21
+-44.46661185357005
+31
+189.0295005798363
+12
+31.964185822500113
+22
+-47.787145941420704
+32
+196.20831484727591
+13
+31.964185822500113
+23
+-47.787145941420704
+33
+196.20831484727591
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+33.92205897056724
+20
+-43.53251049850932
+30
+197.2925562232804
+11
+31.964185822500113
+21
+-47.787145941420704
+31
+196.20831484727591
+12
+30.914353013644988
+22
+-44.46661185357005
+32
+189.0295005798363
+13
+30.914353013644988
+23
+-44.46661185357005
+33
+189.0295005798363
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+36.96438339542795
+20
+-40.73555360935117
+30
+197.9981325218902
+11
+33.92205897056724
+21
+-43.53251049850932
+31
+197.2925562232804
+12
+30.914353013644988
+22
+-44.46661185357005
+32
+189.0295005798363
+13
+30.914353013644988
+23
+-44.46661185357005
+33
+189.0295005798363
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+43.48705246360705
+20
+-38.097247188751844
+30
+192.79961929321522
+11
+36.96438339542795
+21
+-40.73555360935117
+31
+197.9981325218902
+12
+30.914353013644988
+22
+-44.46661185357005
+32
+189.0295005798363
+13
+30.914353013644988
+23
+-44.46661185357005
+33
+189.0295005798363
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+36.96438339542795
+20
+-40.73555360935117
+30
+197.9981325218902
+11
+43.48705246360705
+21
+-38.097247188751844
+31
+192.79961929321522
+12
+45.287166848560766
+22
+-36.65726365180847
+32
+199.011015859523
+13
+45.287166848560766
+23
+-36.65726365180847
+33
+199.011015859523
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+54.98470353811467
+20
+-22.713124155909085
+30
+202.55106178959218
+11
+43.48705246360705
+21
+-38.097247188751844
+31
+192.79961929321522
+12
+35.20395226122179
+22
+-44.177943717035
+32
+170.79204788208241
+13
+35.20395226122179
+23
+-44.177943717035
+33
+170.79204788208241
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+43.48705246360705
+20
+-38.097247188751844
+30
+192.79961929321522
+11
+54.98470353811467
+21
+-22.713124155909085
+31
+202.55106178959218
+12
+52.70715149513834
+22
+-26.116842817892337
+32
+201.6865810477682
+13
+52.70715149513834
+23
+-26.116842817892337
+33
+201.6865810477682
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+49.28241357964126
+20
+-26.45582422833583
+30
+179.42485427856678
+11
+54.98470353811467
+21
+-22.713124155909085
+31
+202.55106178959218
+12
+35.20395226122179
+22
+-44.177943717035
+32
+170.79204788208241
+13
+35.20395226122179
+23
+-44.177943717035
+33
+170.79204788208241
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+54.98470353811467
+20
+-22.713124155909085
+30
+202.55106178959218
+11
+49.28241357964126
+21
+-26.45582422833583
+31
+179.42485427856678
+12
+56.198202555708534
+22
+-21.125779316483033
+32
+202.95359733730962
+13
+56.198202555708534
+23
+-21.125779316483033
+33
+202.95359733730962
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+63.043071399763726
+20
+-2.039126643707891
+30
+207.82553940120246
+11
+56.198202555708534
+21
+-21.125779316483033
+31
+202.95359733730962
+12
+49.28241357964126
+22
+-26.45582422833583
+32
+179.42485427856678
+13
+49.28241357964126
+23
+-26.45582422833583
+33
+179.42485427856678
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+66.87398344742765
+20
+15.726958497125281
+30
+190.68734512329334
+11
+66.77527673892673
+21
+14.510687365473165
+31
+212.05897194443241
+12
+56.866376229840064
+22
+-3.606717867156979
+32
+186.77653732300038
+13
+56.866376229840064
+23
+-3.606717867156979
+33
+186.77653732300038
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+66.77527673892673
+20
+14.510687365473165
+30
+212.05897194443241
+11
+66.87398344742765
+21
+15.726958497125281
+31
+190.68734512329334
+12
+67.51870662388943
+22
+15.943362132954196
+32
+212.42372656079127
+13
+67.51870662388943
+23
+15.943362132954196
+33
+212.42372656079127
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+63.57122586152329
+20
+38.00335722457329
+30
+204.2099693298363
+11
+67.51870662388943
+21
+15.943362132954196
+31
+212.42372656079127
+12
+66.87398344742765
+22
+15.726958497125281
+32
+190.68734512329334
+13
+66.87398344742765
+23
+15.726958497125281
+33
+190.68734512329334
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+67.51870662388943
+20
+15.943362132954196
+30
+212.42372656079127
+11
+63.57122586152329
+21
+38.00335722457329
+31
+204.2099693298363
+12
+67.14280040847146
+22
+18.304340453609445
+32
+213.0313861451527
+13
+67.14280040847146
+23
+18.304340453609445
+33
+213.0313861451527
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+20.215178337996353
+20
+59.061841770943715
+30
+219.07999191284412
+11
+43.021055375034486
+21
+50.71338129873699
+31
+221.45041404020174
+12
+43.17729952139854
+22
+51.476876083977146
+32
+218.74144668579333
+13
+43.17729952139854
+23
+51.476876083977146
+33
+218.74144668579333
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+43.021055375034486
+20
+50.71338129873699
+30
+221.45041404020174
+11
+20.215178337996353
+21
+59.061841770943715
+31
+219.07999191284412
+12
+30.499225696507917
+22
+54.59008386008739
+32
+222.4969747984698
+13
+30.499225696507917
+23
+54.59008386008739
+33
+222.4969747984698
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+56.866376229840064
+20
+-3.606717867156979
+30
+186.77653732300038
+11
+63.043071399763726
+21
+-2.039126643707891
+31
+207.82553940120246
+12
+49.28241357964126
+22
+-26.45582422833583
+32
+179.42485427856678
+13
+49.28241357964126
+23
+-26.45582422833583
+33
+179.42485427856678
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+63.043071399763726
+20
+-2.039126643707891
+30
+207.82553940120246
+11
+56.866376229840064
+21
+-3.606717867156979
+31
+186.77653732300038
+12
+63.80709753300991
+22
+0.3967294145689564
+32
+208.44774996679917
+13
+63.80709753300991
+23
+0.3967294145689564
+33
+208.44774996679917
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+63.57122586152329
+20
+38.00335722457329
+30
+204.2099693298363
+11
+64.06148232849918
+21
+28.753929694133294
+31
+215.72667130986372
+12
+67.14280040847146
+22
+18.304340453609445
+32
+213.0313861451527
+13
+67.14280040847146
+23
+18.304340453609445
+33
+213.0313861451527
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+64.06148232849918
+20
+28.753929694133294
+30
+215.72667130986372
+11
+63.57122586152329
+21
+38.00335722457329
+31
+204.2099693298363
+12
+61.88632852366842
+22
+36.69060276970931
+32
+216.74738235473865
+13
+61.88632852366842
+23
+36.69060276970931
+33
+216.74738235473865
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+61.88632852366842
+20
+36.69060276970931
+30
+216.74738235473865
+11
+62.19674852216449
+21
+35.58307560258467
+31
+217.48751699802014
+12
+64.06148232849918
+22
+28.753929694133294
+32
+215.72667130986372
+13
+64.06148232849918
+23
+28.753929694133294
+33
+215.72667130986372
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+15.710543987340952
+20
+58.556117756360216
+30
+223.57575950128367
+11
+20.215178337996353
+21
+59.061841770943715
+31
+219.07999191284412
+12
+5.021595132014847
+22
+60.16540380598943
+32
+218.79938888550038
+13
+5.021595132014847
+23
+60.16540380598943
+33
+218.79938888550038
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+20.215178337996353
+20
+59.061841770943715
+30
+219.07999191284412
+11
+15.710543987340952
+21
+58.556117756360216
+31
+223.57575950128367
+12
+20.227250714800768
+22
+58.26040378165336
+32
+223.4813314361167
+13
+20.227250714800768
+23
+58.26040378165336
+33
+223.4813314361167
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+15.710543987340952
+20
+58.556117756360216
+30
+223.57575950128367
+11
+5.021595132014847
+21
+60.16540380598943
+31
+218.79938888550038
+12
+5.1018704468384195
+22
+58.22504085923823
+32
+223.53424287596778
+13
+5.1018704468384195
+23
+58.22504085923823
+33
+223.53424287596778
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+66.77527673892673
+20
+14.510687365473165
+30
+212.05897194443241
+11
+63.80709753300991
+21
+0.3967294145689564
+31
+208.44774996679917
+12
+56.866376229840064
+22
+-3.606717867156979
+32
+186.77653732300038
+13
+56.866376229840064
+23
+-3.606717867156979
+33
+186.77653732300038
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+3.386200322442161
+20
+-78.12239892356456
+30
+188.5376621922188
+11
+0.01446138307444743
+21
+-78.0452778863315
+31
+186.11960067749257
+12
+0.02064222602082667
+22
+-78.9613642520874
+32
+188.33601962039913
+13
+0.02064222602082667
+23
+-78.9613642520874
+33
+188.33601962039913
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+-0.02417342141253521
+20
+60.15422182707264
+30
+218.83441225603903
+11
+1.9080775878522782
+21
+58.22184637741549
+31
+223.546512234448
+12
+5.021595132014847
+22
+60.16540380598943
+32
+218.79938888550038
+13
+5.021595132014847
+23
+60.16540380598943
+33
+218.79938888550038
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+1.9080775878522782
+20
+58.22184637741549
+30
+223.546512234448
+11
+-0.02417342141253521
+21
+60.15422182707264
+31
+218.83441225603903
+12
+-0.023396143811807334
+22
+58.22000951933899
+32
+223.55395663166695
+13
+-0.023396143811807334
+23
+58.22000951933899
+33
+223.55395663166695
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+1.9080775878522782
+20
+58.22184637741549
+30
+223.546512234448
+11
+5.1018704468384195
+21
+58.22504085923823
+31
+223.53424287596778
+12
+5.021595132014847
+22
+60.16540380598943
+32
+218.79938888550038
+13
+5.021595132014847
+23
+60.16540380598943
+33
+218.79938888550038
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+20.227250714800768
+20
+58.26040378165336
+30
+223.4813314361167
+11
+30.499225696507917
+21
+54.59008386008739
+31
+222.4969747984698
+12
+20.215178337996353
+22
+59.061841770943715
+32
+219.07999191284412
+13
+20.215178337996353
+23
+59.061841770943715
+33
+219.07999191284412
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+43.021055375034486
+20
+50.71338129873699
+30
+221.45041404020174
+11
+46.890490131114554
+21
+47.93730154381203
+31
+220.72187020535787
+12
+43.17729952139854
+22
+51.476876083977146
+32
+218.74144668579333
+13
+43.17729952139854
+23
+51.476876083977146
+33
+218.74144668579333
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+43.17729952139854
+20
+51.476876083977146
+30
+218.74144668579333
+11
+61.819061512907055
+21
+36.49703758177096
+31
+217.72370056627622
+12
+61.88632852366842
+22
+36.69060276970931
+32
+216.74738235473865
+13
+61.88632852366842
+23
+36.69060276970931
+33
+216.74738235473865
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+61.819061512907055
+20
+36.49703758177096
+30
+217.72370056627622
+11
+43.17729952139854
+21
+51.476876083977146
+31
+218.74144668579333
+12
+46.890490131114554
+22
+47.93730154381203
+32
+220.72187020535787
+13
+46.890490131114554
+23
+47.93730154381203
+33
+220.72187020535787
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+52.70715149513834
+20
+-26.116842817892337
+30
+201.6865810477682
+11
+47.0600345477703
+21
+-33.78990832494305
+31
+199.73986785004863
+12
+43.48705246360705
+22
+-38.097247188751844
+32
+192.79961929321522
+13
+43.48705246360705
+23
+-38.097247188751844
+33
+192.79961929321522
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+47.0600345477703
+20
+-33.78990832494305
+30
+199.73986785004863
+11
+45.287166848560766
+21
+-36.65726365180847
+31
+199.011015859523
+12
+43.48705246360705
+22
+-38.097247188751844
+32
+192.79961929321522
+13
+43.48705246360705
+23
+-38.097247188751844
+33
+192.79961929321522
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+14.583399960279245
+20
+83.57618995356563
+30
+171.3879417419457
+11
+42.83637871076835
+21
+91.29773246584627
+31
+158.93172531128164
+12
+15.643772469218579
+22
+92.96280484629457
+32
+160.49926528930897
+13
+15.643772469218579
+23
+92.96280484629457
+33
+160.49926528930897
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+110.08723389973933
+20
+14.508254382437944
+30
+168.11294784546132
+11
+122.49228585932734
+21
+-3.0641840966889538
+31
+141.18649063110584
+12
+134.63333399528074
+22
+13.30445350255567
+32
+152.02788314819568
+13
+134.63333399528074
+23
+13.30445350255567
+33
+152.02788314819568
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+4.833565831436057
+20
+65.39217625737167
+30
+204.37294387817616
+11
+26.69145705458768
+21
+77.52075510315164
+31
+189.97401657104726
+12
+4.959503182982011
+22
+70.92146737960998
+32
+190.53948593139881
+13
+4.959503182982011
+23
+70.92146737960998
+33
+190.53948593139881
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+47.82451221182149
+20
+-15.83145324597668
+30
+152.48676986694568
+11
+40.763423708493264
+21
+-34.08326688259705
+31
+153.07878799438708
+12
+37.76750744953299
+22
+-28.25217352449391
+32
+135.59652175903554
+13
+37.76750744953299
+23
+-28.25217352449391
+33
+135.59652175903554
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+81.20284152095478
+20
+-19.484521810901388
+30
+137.17026290893787
+11
+69.95140161686146
+21
+-30.45388967754856
+31
+126.64367675781483
+12
+94.56830830613356
+22
+-19.202409459016916
+32
+132.91044540405505
+13
+94.56830830613356
+23
+-19.202409459016916
+33
+132.91044540405505
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.3061315778026
+20
+-73.13826370527374
+30
+55.18243789673085
+11
+165.28900544160132
+21
+-61.760633255050024
+31
+0.0
+12
+167.50483309564154
+22
+-61.303847657600755
+32
+0.0
+13
+167.50483309564154
+23
+-61.303847657600755
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+165.28900544160132
+20
+-61.760633255050024
+30
+0.0
+11
+151.3061315778026
+21
+-73.13826370527374
+31
+55.18243789673085
+12
+149.06284587784322
+22
+-68.59937853389094
+32
+22.694836617139387
+13
+149.06284587784322
+23
+-68.59937853389094
+33
+22.694836617139387
+70
+3
+ 0
+3DFACE
+ 8
+torso_half
+10
+149.06284587784322
+20
+-68.59937853389094
+30
+22.694836617139387
+11
+151.3061315778026
+21
+-73.13826370527374
+31
+55.18243789673085
+12
+148.7397482932298
+22
+-68.96881249446406
+32
+24.661946925831174
+13
+148.7397482932298
+23
+-68.96881249446406
+33
+24.661946925831174
+70
+3
+ 0
+3DFACE
+ 8
+torso_half
+10
+148.7397482932298
+20
+-68.96881249446406
+30
+24.661946925831174
+11
+151.3061315778026
+21
+-73.13826370527374
+31
+55.18243789673085
+12
+147.4537426161958
+22
+-69.71307111898673
+32
+27.774423152763674
+13
+147.4537426161958
+23
+-69.71307111898673
+33
+27.774423152763674
+70
+3
+ 0
+3DFACE
+ 8
+torso_half
+10
+147.4537426161958
+20
+-69.71307111898673
+30
+27.774423152763674
+11
+151.3061315778026
+21
+-73.13826370527374
+31
+55.18243789673085
+12
+147.06913874415895
+22
+-70.02861910381449
+32
+29.30913922556432
+13
+147.06913874415895
+23
+-70.02861910381449
+33
+29.30913922556432
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+54.95624599533022
+20
+-16.5366242311039
+30
+148.8026924133324
+11
+69.95140161686146
+21
+-30.45388967754856
+31
+126.64367675781483
+12
+81.20284152095478
+22
+-19.484521810901388
+32
+137.17026290893787
+13
+81.20284152095478
+23
+-19.484521810901388
+33
+137.17026290893787
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.3061315778026
+20
+-73.13826370527374
+30
+55.18243789673085
+11
+145.56738855405317
+21
+-70.27986901496179
+31
+34.715732974421584
+12
+147.06913874415895
+22
+-70.02861910381449
+32
+29.30913922556432
+13
+147.06913874415895
+23
+-70.02861910381449
+33
+29.30913922556432
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+145.56738855405317
+20
+-70.27986901496179
+30
+34.715732974421584
+11
+151.3061315778026
+21
+-73.13826370527374
+31
+55.18243789673085
+12
+145.4279175928123
+22
+-70.3163740748702
+32
+35.359712918751136
+13
+145.4279175928123
+23
+-70.3163740748702
+33
+35.359712918751136
+70
+3
+ 0
+3DFACE
+ 8
+torso_half
+10
+145.4279175928123
+20
+-70.3163740748702
+30
+35.359712918751136
+11
+151.3061315778026
+21
+-73.13826370527374
+31
+55.18243789673085
+12
+145.04524835330304
+22
+-70.4213062228107
+32
+37.178015573182954
+13
+145.04524835330304
+23
+-70.4213062228107
+33
+37.178015573182954
+70
+3
+ 0
+3DFACE
+ 8
+torso_half
+10
+145.04524835330304
+20
+-70.4213062228107
+30
+37.178015573182954
+11
+151.3061315778026
+21
+-73.13826370527374
+31
+55.18243789673085
+12
+144.3525574585535
+22
+-70.56668853926593
+32
+39.98947996964454
+13
+144.3525574585535
+23
+-70.56668853926593
+33
+39.98947996964454
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+41.74540863465434
+20
+-29.081109774375584
+30
+133.54722824096913
+11
+28.889074159341522
+21
+-43.06673890812219
+31
+125.54035263061756
+12
+35.226848255524466
+22
+-43.61904730491942
+32
+124.1346244812035
+13
+35.226848255524466
+23
+-43.61904730491942
+33
+124.1346244812035
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+69.95140161686146
+20
+-30.45388967754856
+30
+126.64367675781483
+11
+35.226848255524466
+21
+-43.61904730491942
+31
+124.1346244812035
+12
+41.22377045123538
+22
+-49.557017386783514
+32
+121.93204574585194
+13
+41.22377045123538
+23
+-49.557017386783514
+33
+121.93204574585194
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+52.66480067639882
+20
+96.41854956622466
+30
+158.58465347290272
+11
+84.1775180445552
+21
+92.9158681993883
+31
+154.44343338012928
+12
+51.98318434026864
+22
+97.6299330522167
+32
+156.97758102417225
+13
+51.98318434026864
+23
+97.6299330522167
+33
+156.97758102417225
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+143.93246864657587
+20
+-70.89052189215528
+30
+41.96917448941026
+11
+148.99943834894273
+21
+-74.19374852631539
+31
+61.62264556884999
+12
+143.87274694648693
+22
+-71.32379313115182
+32
+42.70191851936068
+13
+143.87274694648693
+23
+-71.32379313115182
+33
+42.70191851936068
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.024476987326960974
+20
+-60.90962881081268
+30
+159.6433451772179
+11
+0.02275031334409848
+21
+-56.612896130095905
+31
+145.88822364271186
+12
+11.141953614717861
+22
+-52.17836390704888
+32
+146.17203903198475
+13
+11.141953614717861
+23
+-52.17836390704888
+33
+146.17203903198475
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.6071905943340685
+20
+-124.02204353602654
+30
+1.6173934936546828
+11
+0.0500415877968566
+21
+-124.52572275737772
+31
+0.0
+12
+0.5870153282377297
+22
+-124.52170526188353
+32
+0.0
+13
+0.5870153282377297
+23
+-124.52170526188353
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.0500415877968566
+20
+-124.52572275737772
+30
+0.0
+11
+0.6071905943340685
+21
+-124.02204353602654
+31
+1.6173934936546828
+12
+0.04984048004837481
+22
+-124.02527725116096
+32
+1.6204249676247826
+13
+0.04984048004837481
+23
+-124.02527725116096
+33
+1.6204249676247826
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+-0.02417342141253521
+20
+60.15422182707264
+30
+218.83441225603903
+11
+5.021595132014847
+21
+60.16540380598943
+31
+218.79938888550038
+12
+-0.026186689250404113
+22
+65.16412746059433
+32
+204.99571650519437
+13
+-0.026186689250404113
+23
+65.16412746059433
+33
+204.99571650519437
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+66.87398344742765
+20
+15.726958497125281
+30
+190.68734512329334
+11
+67.96307514056734
+21
+-3.106046893056986
+31
+165.78130722046131
+12
+76.80296119854148
+22
+15.141951142449502
+32
+184.49237442016835
+13
+76.80296119854148
+23
+15.141951142449502
+33
+184.49237442016835
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+19.02238711711249
+20
+-59.83480352459098
+30
+175.92351760864491
+11
+0.025193857765572668
+21
+-62.69352123761148
+31
+173.698844776774
+12
+0.02453688617904326
+22
+-61.05868379050047
+32
+160.0664995552436
+13
+0.02453688617904326
+23
+-61.05868379050047
+33
+160.0664995552436
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+85.43358715270438
+20
+88.7220082222989
+30
+158.47942733764881
+11
+115.29005476676613
+21
+79.66885175450253
+31
+148.78079452514882
+12
+84.1775180445552
+22
+92.9158681993883
+32
+154.44343338012928
+13
+84.1775180445552
+23
+92.9158681993883
+33
+154.44343338012928
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+-0.04920074579808781
+20
+122.43333396160737
+30
+85.56432480797397
+11
+2.3180255292953205
+21
+121.35497152581453
+31
+96.59027862549061
+12
+0.5037101952462838
+22
+122.9944320011509
+32
+79.88596878051992
+13
+0.5037101952462838
+23
+122.9944320011509
+33
+79.88596878051992
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+2.3180255292953205
+20
+121.35497152581453
+30
+96.59027862549061
+11
+-0.04920074579808781
+21
+122.43333396160737
+31
+85.56432480797397
+12
+-0.04876384370772539
+22
+121.34612728067461
+32
+96.60220280874043
+13
+-0.04876384370772539
+23
+121.34612728067461
+33
+96.60220280874043
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+37.76750744953299
+20
+-28.25217352449391
+30
+135.59652175903554
+11
+40.763423708493264
+21
+-34.08326688259705
+31
+153.07878799438708
+12
+28.889074159341522
+22
+-43.06673890812219
+32
+125.54035263061756
+13
+28.889074159341522
+23
+-43.06673890812219
+33
+125.54035263061756
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+-0.04395125325689385
+20
+109.37026219313816
+30
+126.62232527415556
+11
+2.3180255292953205
+21
+121.35497152581453
+31
+96.59027862549061
+12
+-0.04876384370772539
+22
+121.34612728067461
+32
+96.60220280874043
+13
+-0.04876384370772539
+23
+121.34612728067461
+33
+96.60220280874043
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+1.5395736768139905
+20
+-120.17932471354824
+30
+13.948520660402728
+11
+0.9646214097758469
+21
+-121.9219033414709
+31
+8.435581970217182
+12
+3.7096038563558142
+22
+-122.6878859384345
+32
+8.341983032228901
+13
+3.7096038563558142
+23
+-122.6878859384345
+33
+8.341983032228901
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+4.959503182982011
+20
+70.92146737960998
+30
+190.53948593139881
+11
+14.583399960279245
+21
+83.57618995356563
+31
+171.3879417419457
+12
+5.632285215677397
+22
+83.12698528573927
+32
+172.18227310180896
+13
+5.632285215677397
+23
+83.12698528573927
+33
+172.18227310180896
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+-0.04920074579808781
+20
+122.43333396160737
+30
+85.56432480797397
+11
+0.5037101952462838
+21
+122.9944320011509
+31
+79.88596878051992
+12
+-0.049425394755240756
+22
+122.99236046318872
+32
+79.88889789899372
+13
+-0.049425394755240756
+23
+122.99236046318872
+33
+79.88889789899372
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+-0.04395125325689385
+20
+109.37026219313816
+30
+126.62232527415556
+11
+4.999660170436129
+21
+105.26361989576408
+31
+136.93810653686756
+12
+2.3180255292953205
+22
+121.35497152581453
+32
+96.59027862549061
+13
+2.3180255292953205
+23
+121.35497152581453
+33
+96.59027862549061
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+4.999660170436129
+20
+105.26361989576408
+30
+136.93810653686756
+11
+-0.04395125325689385
+21
+109.37026219313816
+31
+126.62232527415556
+12
+-0.04229338450645109
+22
+105.24474752660048
+32
+136.96379554795922
+13
+-0.04229338450645109
+23
+105.24474752660048
+33
+136.96379554795922
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+5.365449429434058
+20
+93.63519039605828
+30
+161.4753684997582
+11
+-0.0379008504613372
+21
+94.31416956571985
+31
+162.0028962238252
+12
+-0.03374788300828926
+22
+83.97973981550714
+32
+171.3295366055891
+13
+-0.03374788300828926
+23
+83.97973981550714
+33
+171.3295366055891
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+-0.0500196061847005
+20
+124.4710227315635
+30
+73.28280933748445
+11
+0.5037101952462838
+21
+122.9944320011509
+31
+79.88596878051992
+12
+1.6041105319870184
+22
+126.5745054079634
+32
+63.90419235229726
+13
+1.6041105319870184
+23
+126.5745054079634
+33
+63.90419235229726
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.5037101952462838
+20
+122.9944320011509
+30
+79.88596878051992
+11
+-0.0500196061847005
+21
+124.4710227315635
+31
+73.28280933748445
+12
+-0.049425394755240756
+22
+122.99236046318872
+32
+79.88889789899372
+13
+-0.049425394755240756
+23
+122.99236046318872
+33
+79.88889789899372
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+-0.0500196061847005
+20
+124.4710227315635
+30
+73.28280933748445
+11
+1.6041105319870184
+21
+126.5745054079634
+31
+63.90419235229726
+12
+-0.05086242380247118
+22
+126.56832774580303
+32
+63.912607431955635
+13
+-0.05086242380247118
+23
+126.56832774580303
+33
+63.912607431955635
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+7.283370867188594
+20
+-67.12465406874308
+30
+109.8533256530785
+11
+0.024218744090870346
+21
+-60.26700480461702
+31
+112.1472478237803
+12
+0.026697956681255797
+22
+-66.43638817714991
+32
+109.09150579864367
+13
+0.026697956681255797
+23
+-66.43638817714991
+33
+109.09150579864367
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+-0.026272960169515313
+20
+65.37880787012395
+30
+204.40318631739342
+11
+4.833565831436057
+21
+65.39217625737167
+31
+204.37294387817616
+12
+-0.02835458688378508
+22
+70.55882078569773
+32
+191.44112297953473
+13
+-0.02835458688378508
+23
+70.55882078569773
+33
+191.44112297953473
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+-0.028494472832693383
+20
+70.9069192305219
+30
+190.57022367018925
+11
+4.959503182982011
+21
+70.92146737960998
+31
+190.53948593139881
+12
+-0.03296123921933186
+22
+82.02222026646369
+32
+173.85146324357788
+13
+-0.03296123921933186
+23
+82.02222026646369
+33
+173.85146324357788
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+11.141953614717861
+20
+-52.17836390704888
+30
+146.17203903198475
+11
+0.02275031334409848
+21
+-56.612896130095905
+31
+145.88822364271186
+12
+0.01989455840447757
+22
+-49.506507953199396
+32
+115.88177981989102
+13
+0.01989455840447757
+23
+-49.506507953199396
+33
+115.88177981989102
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.9646214097758469
+20
+-121.9219033414709
+30
+8.435581970217182
+11
+0.04984048004837481
+21
+-124.02527725116096
+31
+1.6204249676247826
+12
+0.6071905943340685
+22
+-124.02204353602654
+32
+1.6173934936546828
+13
+0.6071905943340685
+23
+-124.02204353602654
+33
+1.6173934936546828
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.04984048004837481
+20
+-124.02527725116096
+30
+1.6204249676247826
+11
+0.9646214097758469
+21
+-121.9219033414709
+31
+8.435581970217182
+12
+0.049462768164520804
+22
+-123.08536212449364
+32
+4.6757930085300154
+13
+0.049462768164520804
+23
+-123.08536212449364
+33
+4.6757930085300154
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+2.772456951801402
+20
+-51.74916085842998
+30
+115.35444335937733
+11
+0.01997747577170428
+21
+-49.712843234194736
+31
+114.83519656983125
+12
+0.023663386923974572
+22
+-58.88502921913593
+32
+112.65401604949842
+13
+0.023663386923974572
+23
+-58.88502921913593
+33
+112.65401604949842
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.048997790642201965
+20
+-121.92829128436198
+30
+8.440423729117631
+11
+0.049462768164520804
+21
+-123.08536212449364
+31
+4.6757930085300154
+12
+0.9646214097758469
+22
+-121.9219033414709
+32
+8.435581970217182
+13
+0.9646214097758469
+23
+-121.9219033414709
+33
+8.435581970217182
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.0485847761337353
+20
+-120.90052752949953
+30
+11.600854246036596
+11
+0.048997790642201965
+21
+-121.92829128436198
+31
+8.440423729117631
+12
+0.9646214097758469
+22
+-121.9219033414709
+32
+8.435581970217182
+13
+0.9646214097758469
+23
+-121.9219033414709
+33
+8.435581970217182
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.04739230686455204
+20
+-117.93313372476237
+30
+20.329723816089942
+11
+0.04808711914789884
+21
+-119.66213565242029
+31
+15.445584206409052
+12
+2.3217162041567367
+22
+-118.13358811619385
+32
+20.205309295656633
+13
+2.3217162041567367
+23
+-118.13358811619385
+33
+20.205309295656633
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+1.5395736768139905
+20
+-120.17932471354824
+30
+13.948520660402728
+11
+0.0485847761337353
+21
+-120.90052752949953
+31
+11.600854246036596
+12
+0.9646214097758469
+22
+-121.9219033414709
+32
+8.435581970217182
+13
+0.9646214097758469
+23
+-121.9219033414709
+33
+8.435581970217182
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.0485847761337353
+20
+-120.90052752949953
+30
+11.600854246036596
+11
+1.5395736768139905
+21
+-120.17932471354824
+31
+13.948520660402728
+12
+0.048280804305569254
+22
+-120.14411045168643
+32
+13.980740264943023
+13
+0.048280804305569254
+23
+-120.14411045168643
+33
+13.980740264943023
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.043542227885701834
+20
+-108.35242518540431
+30
+47.183045836490436
+11
+0.04481612678398404
+21
+-111.52245211736637
+31
+38.017331092312006
+12
+5.242444526304533
+22
+-111.88602841398722
+32
+38.0486968994164
+13
+5.242444526304533
+23
+-111.88602841398722
+33
+38.0486968994164
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.04080471266578682
+20
+-101.54027000980318
+30
+64.87417402588753
+11
+0.04214107745992182
+21
+-104.8657398675438
+31
+56.838408804291255
+12
+9.262109099231695
+22
+-105.19397078777912
+32
+57.304498291017964
+13
+9.262109099231695
+23
+-105.19397078777912
+33
+57.304498291017964
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+15.565032628677455
+20
+-96.62433991611047
+30
+74.76360702514881
+11
+0.038933578130450536
+21
+-96.88405523614496
+31
+74.50501420716492
+12
+0.04066786013916875
+22
+-101.19972006845038
+32
+65.57063398307184
+13
+0.04066786013916875
+23
+-101.19972006845038
+33
+65.57063398307184
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+9.262109099231695
+20
+-105.19397078777912
+30
+57.304498291017964
+11
+0.04214107745992182
+21
+-104.8657398675438
+31
+56.838408804291255
+12
+0.04332590792128059
+22
+-107.81412492179047
+32
+48.686293542429894
+13
+0.04332590792128059
+23
+-107.81412492179047
+33
+48.686293542429894
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+92.9345976300489
+20
+63.88532763645663
+30
+175.40746383667226
+11
+58.883322492070945
+21
+90.53384490364621
+31
+167.79630050659412
+12
+56.12752770092658
+22
+57.72487311980166
+32
+200.32377243042225
+13
+56.12752770092658
+23
+57.72487311980166
+33
+200.32377243042225
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+2.3180255292953205
+20
+121.35497152581453
+30
+96.59027862549061
+11
+17.15698235956875
+21
+126.44660787160322
+31
+96.0854644775414
+12
+0.5037101952462838
+22
+122.9944320011509
+32
+79.88596878051992
+13
+0.5037101952462838
+23
+122.9944320011509
+33
+79.88596878051992
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+110.99795181341419
+20
+39.94990116240525
+30
+172.49388198852773
+11
+92.9345976300489
+21
+63.88532763645663
+31
+175.40746383667226
+12
+76.50971521236598
+22
+37.52853375965934
+32
+196.39901199341054
+13
+76.50971521236598
+23
+37.52853375965934
+33
+196.39901199341054
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+5.242444526304533
+20
+-111.88602841398722
+30
+38.0486968994164
+11
+0.04481612678398404
+21
+-111.52245211736637
+31
+38.017331092312006
+12
+0.04608372890606319
+22
+-114.67680987009162
+32
+29.299669888532996
+13
+0.04608372890606319
+23
+-114.67680987009162
+33
+29.299669888532996
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.0368237900653516
+20
+-91.63396435713938
+30
+83.11116890475803
+11
+0.038933578130450536
+21
+-96.88405523614496
+31
+74.50501420716492
+12
+15.565032628677455
+22
+-96.62433991611047
+32
+74.76360702514881
+13
+15.565032628677455
+23
+-96.62433991611047
+33
+74.76360702514881
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+13.960595699493846
+20
+-84.59611330969865
+30
+90.75914230346913
+11
+0.03421662817275529
+21
+-85.14618622469439
+31
+90.62254443662349
+12
+0.036684195441880486
+22
+-91.2865908594376
+32
+83.56779892151812
+13
+0.036684195441880486
+23
+-91.2865908594376
+33
+83.56779892151812
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.046495025687697755
+20
+-115.70029915691822
+30
+26.472311813480452
+11
+0.04739230686455204
+21
+-117.93313372476237
+31
+20.329723816089942
+12
+2.3217162041567367
+22
+-118.13358811619385
+32
+20.205309295656633
+13
+2.3217162041567367
+23
+-118.13358811619385
+33
+20.205309295656633
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+13.960595699493846
+20
+-84.59611330969865
+30
+90.75914230346913
+11
+0.0316278350720932
+21
+-78.7041178146146
+31
+96.58526062189101
+12
+0.03421662817275529
+22
+-85.14618622469439
+32
+90.62254443662349
+13
+0.03421662817275529
+23
+-85.14618622469439
+33
+90.62254443662349
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+-0.04229338450645109
+20
+105.24474752660048
+30
+136.96379554795922
+11
+5.180551221005454
+21
+101.01578950761697
+31
+149.70321884155507
+12
+4.999660170436129
+22
+105.26361989576408
+32
+136.93810653686756
+13
+4.999660170436129
+23
+105.26361989576408
+33
+136.93810653686756
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+5.180551221005454
+20
+101.01578950761697
+30
+149.70321884155507
+11
+-0.04229338450645109
+21
+105.24474752660048
+31
+136.96379554795922
+12
+-0.04206278596706385
+22
+104.67091581885995
+32
+138.68806251335377
+13
+-0.04206278596706385
+23
+104.67091581885995
+33
+138.68806251335377
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.026788218259782004
+20
+-66.66099912197765
+30
+108.79852359147976
+11
+0.03155129823310684
+21
+-78.51366012507965
+31
+96.78687647882344
+12
+16.455430776891372
+22
+-77.79196741958572
+32
+98.03563613891835
+13
+16.455430776891372
+23
+-77.79196741958572
+33
+98.03563613891835
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+-0.05097405010534099
+20
+126.84610362505916
+30
+44.265881490923256
+11
+1.6041105319870184
+21
+126.5745054079634
+31
+63.90419235229726
+12
+1.4229419640300527
+22
+127.17642561461079
+32
+21.284313201906635
+13
+1.4229419640300527
+23
+127.17642561461079
+33
+21.284313201906635
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+1.6041105319870184
+20
+126.5745054079634
+30
+63.90419235229726
+11
+-0.05097405010534099
+21
+126.84610362505916
+31
+44.265881490923256
+12
+-0.05086242380247118
+22
+126.56832774580303
+32
+63.912607431955635
+13
+-0.05086242380247118
+23
+126.56832774580303
+33
+63.912607431955635
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+43.30262173526841
+20
+93.04861747890598
+30
+155.91117324829335
+11
+17.951409936212034
+21
+105.12994342231109
+31
+138.84516067505115
+12
+16.78467292994558
+22
+99.67821082340613
+32
+149.5966361999535
+13
+16.78467292994558
+23
+99.67821082340613
+33
+149.5966361999535
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+28.889074159341522
+20
+-43.06673890812219
+30
+125.54035263061756
+11
+12.290396963915049
+21
+-56.76475045121493
+31
+117.91378326416249
+12
+25.14798290055617
+22
+-54.28496737296365
+32
+118.9119781494164
+13
+25.14798290055617
+23
+-54.28496737296365
+33
+118.9119781494164
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+-0.050631873836649875
+20
+125.99461691064027
+30
+11.914563400203619
+11
+1.4229419640300527
+21
+127.17642561461079
+31
+21.284313201906635
+12
+1.2722054435333228
+22
+124.94908956324593
+32
+3.533555603029683
+13
+1.2722054435333228
+23
+124.94908956324593
+33
+3.533555603029683
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+1.4229419640300527
+20
+127.17642561461079
+30
+21.284313201906635
+11
+-0.050631873836649875
+21
+125.99461691064027
+31
+11.914563400203619
+12
+-0.05110457716267177
+22
+127.17091298581485
+32
+21.291853578709972
+13
+-0.05110457716267177
+23
+127.17091298581485
+33
+21.291853578709972
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+-0.050631873836649875
+20
+125.99461691064027
+30
+11.914563400203619
+11
+1.2722054435333228
+21
+124.94908956324593
+31
+3.533555603029683
+12
+-0.05020972633658705
+22
+124.944126211433
+32
+3.540302515017828
+13
+-0.05020972633658705
+23
+124.944126211433
+33
+3.540302515017828
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+-0.04086295198269787
+20
+101.6851953277741
+30
+150.22026565573748
+11
+5.180551221005454
+21
+101.01578950761697
+31
+149.70321884155507
+12
+-0.04206278596706385
+22
+104.67091581885995
+32
+138.68806251335377
+13
+-0.04206278596706385
+23
+104.67091581885995
+33
+138.68806251335377
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+-0.05097405010534099
+20
+126.84610362505916
+30
+44.265881490923256
+11
+1.4229419640300527
+21
+127.17642561461079
+31
+21.284313201906635
+12
+-0.05110457716267177
+22
+127.17091298581485
+32
+21.291853578709972
+13
+-0.05110457716267177
+23
+127.17091298581485
+33
+21.291853578709972
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+61.88632852366842
+20
+36.69060276970931
+30
+216.74738235473865
+11
+61.819061512907055
+21
+36.49703758177096
+31
+217.72370056627622
+12
+62.19674852216449
+22
+35.58307560258467
+32
+217.48751699802014
+13
+62.19674852216449
+23
+35.58307560258467
+33
+217.48751699802014
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+-0.0379008504613372
+20
+94.31416956571985
+30
+162.0028962238252
+11
+5.365449429434058
+21
+93.63519039605828
+31
+161.4753684997582
+12
+-0.0405086917093023
+22
+100.80363823653525
+32
+151.63297713602995
+13
+-0.0405086917093023
+23
+100.80363823653525
+33
+151.63297713602995
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+7.264642884119402
+20
+-108.3142300430484
+30
+48.46414642334218
+11
+0.04332590792128059
+21
+-107.81412492179047
+31
+48.686293542429894
+12
+0.043399523045771465
+22
+-107.9973120864482
+32
+48.185875731523026
+13
+0.043399523045771465
+23
+-107.9973120864482
+33
+48.185875731523026
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.04332590792128059
+20
+-107.81412492179047
+30
+48.686293542429894
+11
+7.264642884119402
+21
+-108.3142300430484
+31
+48.46414642334218
+12
+9.262109099231695
+22
+-105.19397078777912
+32
+57.304498291017964
+13
+9.262109099231695
+23
+-105.19397078777912
+33
+57.304498291017964
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+84.1775180445552
+20
+92.9158681993883
+30
+154.44343338012928
+11
+52.40052851339469
+21
+109.46549365939855
+31
+150.09931869507068
+12
+51.98318434026864
+22
+97.6299330522167
+32
+156.97758102417225
+13
+51.98318434026864
+23
+97.6299330522167
+33
+156.97758102417225
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+40.763423708493264
+20
+-34.08326688259705
+30
+153.07878799438708
+11
+12.290396963915049
+21
+-56.76475045121493
+31
+117.91378326416249
+12
+28.889074159341522
+22
+-43.06673890812219
+32
+125.54035263061756
+13
+28.889074159341522
+23
+-43.06673890812219
+33
+125.54035263061756
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+2.3217162041567367
+20
+-118.13358811619385
+30
+20.205309295656633
+11
+7.777562142666184
+21
+-121.65989554273425
+31
+13.434695434572651
+12
+8.548231890868513
+22
+-119.46915319964964
+32
+19.605539703371477
+13
+8.548231890868513
+23
+-119.46915319964964
+33
+19.605539703371477
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+66.87398344742765
+20
+15.726958497125281
+30
+190.68734512329334
+11
+59.704893179039445
+21
+-3.212464677028903
+31
+170.29110946655507
+12
+67.96307514056734
+22
+-3.106046893056986
+32
+165.78130722046131
+13
+67.96307514056734
+23
+-3.106046893056986
+33
+165.78130722046131
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+56.59145931336226
+20
+-92.05718658181614
+30
+76.87791595459218
+11
+45.068002981338275
+21
+-96.01101638976473
+31
+73.36068878174062
+12
+69.32230868953137
+22
+-96.9760356735265
+32
+66.93278656006093
+13
+69.32230868953137
+23
+-96.9760356735265
+33
+66.93278656006093
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+27.16720389118873
+20
+-109.03501391067739
+30
+49.50885009765859
+11
+16.23002819403411
+21
+-108.85591227392446
+31
+49.2525672912621
+12
+20.07048807198763
+22
+-110.79623693436594
+32
+45.4297386169457
+13
+20.07048807198763
+23
+-110.79623693436594
+33
+45.4297386169457
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+45.068002981338275
+20
+-96.01101638976473
+30
+73.36068878174062
+11
+46.8103967308179
+21
+-99.04532219628572
+31
+68.26613540649647
+12
+69.32230868953137
+22
+-96.9760356735265
+32
+66.93278656006093
+13
+69.32230868953137
+23
+-96.9760356735265
+33
+66.93278656006093
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+143.47506370988805
+20
+-73.91065315953712
+30
+47.233601379396866
+11
+136.03586205173426
+21
+-85.59971378392372
+31
+69.1973770141625
+12
+142.54075647282102
+22
+-84.63792578320334
+32
+56.89744949341054
+13
+142.54075647282102
+23
+-84.63792578320334
+33
+56.89744949341054
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+150.58698481467096
+20
+-65.5049674350578
+30
+17.22452256429279
+11
+149.1887315596308
+21
+-67.97226854186266
+31
+21.73716537086142
+12
+150.16397181960468
+22
+-78.17160139590462
+32
+20.27797927856679
+13
+150.16397181960468
+23
+-78.17160139590462
+33
+20.27797927856679
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+27.16720389118873
+20
+-109.03501391067739
+30
+49.50885009765859
+11
+20.07048807198763
+21
+-110.79623693436594
+31
+45.4297386169457
+12
+26.52422657620338
+22
+-113.76011428459759
+32
+39.985206604006244
+13
+26.52422657620338
+23
+-113.76011428459759
+33
+39.985206604006244
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+38.929793738139786
+20
+-120.10695540468434
+30
+30.042790222170307
+11
+27.836824299429516
+21
+-119.65623113768095
+31
+28.03225402832265
+12
+48.40894733941087
+22
+-128.93939980687477
+32
+14.759420776369526
+13
+48.40894733941087
+23
+-128.93939980687477
+33
+14.759420776369526
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+143.87274694648693
+20
+-71.32379313115182
+30
+42.70191851936068
+11
+148.99943834894273
+21
+-74.19374852631539
+31
+61.62264556884999
+12
+143.47506370988805
+22
+-73.91065315953712
+32
+47.233601379396866
+13
+143.47506370988805
+23
+-73.91065315953712
+33
+47.233601379396866
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+152.1215005230635
+20
+-58.81014504875605
+30
+0.0
+11
+151.9919916013273
+21
+-65.6164598254417
+31
+4.815066528322651
+12
+151.1370952980997
+22
+-66.28102452333562
+32
+0.0
+13
+151.1370952980997
+23
+-66.28102452333562
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.9919916013273
+20
+-65.6164598254417
+30
+4.815066528322651
+11
+152.1215005230635
+21
+-58.81014504875605
+31
+0.0
+12
+152.39706333724124
+22
+-58.07542692235853
+32
+1.1216873168968704
+13
+152.39706333724124
+23
+-58.07542692235853
+33
+1.1216873168968704
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.9919916013273
+20
+-65.6164598254417
+30
+4.815066528322651
+11
+150.70614040521917
+21
+-64.76392910432827
+31
+16.117283757091627
+12
+150.69305653174226
+22
+-64.90515487943217
+32
+16.320360871166475
+13
+150.69305653174226
+23
+-64.90515487943217
+33
+16.320360871166475
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+150.70614040521917
+20
+-64.76392910432827
+30
+16.117283757091627
+11
+151.9919916013273
+21
+-65.6164598254417
+31
+4.815066528322651
+12
+150.99607242735328
+22
+-60.62180226091683
+32
+11.022223510894767
+13
+150.99607242735328
+23
+-60.62180226091683
+33
+11.022223510894767
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+136.03586205173426
+20
+-85.59971378392372
+30
+69.1973770141625
+11
+129.70283150728324
+21
+-95.55606676878932
+31
+52.52562332153554
+12
+142.54075647282102
+22
+-84.63792578320334
+32
+56.89744949341054
+13
+142.54075647282102
+23
+-84.63792578320334
+33
+56.89744949341054
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+67.75847079221415
+20
+-79.75431990006238
+30
+93.67640609741444
+11
+85.8715986664545
+21
+-82.864958784201
+31
+84.20305023193593
+12
+107.18305749098995
+22
+-78.26131805234044
+32
+87.30334548950428
+13
+107.18305749098995
+23
+-78.26131805234044
+33
+87.30334548950428
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+27.836824299429516
+20
+-119.65623113768095
+30
+28.03225402832265
+11
+27.426427515545345
+21
+-122.12878952286687
+31
+21.99570388794179
+12
+48.40894733941087
+22
+-128.93939980687477
+32
+14.759420776369526
+13
+48.40894733941087
+23
+-128.93939980687477
+33
+14.759420776369526
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+146.06779216485324
+20
+-83.07542067148339
+30
+43.29110946655507
+11
+129.70283150728324
+21
+-95.55606676878932
+31
+52.52562332153554
+12
+138.9529725482961
+22
+-97.86572867711725
+32
+38.147334289553115
+13
+138.9529725482961
+23
+-97.86572867711725
+33
+38.147334289553115
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+146.06779216485324
+20
+-83.07542067148339
+30
+43.29110946655507
+11
+138.9529725482961
+21
+-97.86572867711725
+31
+38.147334289553115
+12
+143.2440491556461
+22
+-97.11740736894173
+32
+22.868325042726948
+13
+143.2440491556461
+23
+-97.11740736894173
+33
+22.868325042726948
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+41.240996513155515
+20
+-72.46491864615655
+30
+105.22860794067616
+11
+16.455430776891372
+21
+-77.79196741958572
+31
+98.03563613891835
+12
+41.27965510873387
+22
+-78.87249693076602
+32
+96.07810058593984
+13
+41.27965510873387
+23
+-78.87249693076602
+33
+96.07810058593984
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+107.18305749098995
+20
+-78.26131805234044
+30
+87.30334548950428
+11
+85.8715986664545
+21
+-82.864958784201
+31
+84.20305023193593
+12
+106.41944734345599
+22
+-85.05347040964502
+32
+77.157646942141
+13
+106.41944734345599
+23
+-85.05347040964502
+33
+77.157646942141
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+49.28241357964126
+20
+-26.45582422833583
+30
+179.42485427856678
+11
+35.20395226122179
+21
+-44.177943717035
+31
+170.79204788208241
+12
+40.763423708493264
+22
+-34.08326688259705
+32
+153.07878799438708
+13
+40.763423708493264
+23
+-34.08326688259705
+33
+153.07878799438708
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+152.39706333724124
+20
+-58.07542692235853
+30
+1.1216873168968704
+11
+151.12401289416775
+21
+-58.333602270866876
+31
+8.242019868940874
+12
+151.9919916013273
+22
+-65.6164598254417
+32
+4.815066528322651
+13
+151.9919916013273
+23
+-65.6164598254417
+33
+4.815066528322651
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.12401289416775
+20
+-58.333602270866876
+30
+8.242019868940874
+11
+152.39706333724124
+21
+-58.07542692235853
+31
+1.1216873168968704
+12
+151.73969782888256
+22
+-55.4679838928378
+32
+4.273786833903068
+13
+151.73969782888256
+23
+-55.4679838928378
+33
+4.273786833903068
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+148.0122511163535
+20
+-86.3805018985429
+30
+0.0
+11
+151.27232287907492
+21
+-73.4629710281333
+31
+11.263316345217183
+12
+146.1497399372302
+22
+-92.59506898664439
+32
+9.398895263674214
+13
+146.1497399372302
+23
+-92.59506898664439
+33
+9.398895263674214
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.27232287907492
+20
+-73.4629710281333
+30
+11.263316345217183
+11
+148.0122511163535
+21
+-86.3805018985429
+31
+0.0
+12
+148.6803146089252
+22
+-83.90327798788724
+32
+0.0
+13
+148.6803146089252
+23
+-83.90327798788724
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+7.777562142666184
+20
+-121.65989554273425
+30
+13.434695434572651
+11
+3.7096038563558142
+21
+-122.6878859384345
+31
+8.341983032228901
+12
+8.697919079694389
+22
+-125.02888176130455
+32
+8.063802337648823
+13
+8.697919079694389
+23
+-125.02888176130455
+33
+8.063802337648823
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+47.82451221182149
+20
+-15.83145324597668
+30
+152.48676986694568
+11
+49.28241357964126
+21
+-26.45582422833583
+31
+179.42485427856678
+12
+40.763423708493264
+22
+-34.08326688259705
+32
+153.07878799438708
+13
+40.763423708493264
+23
+-34.08326688259705
+33
+153.07878799438708
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+14.772368319333834
+20
+-125.86523022887934
+30
+10.28013992309804
+11
+11.425038937320098
+21
+-128.08028181377028
+31
+2.401454162599995
+12
+22.036768218700455
+22
+-130.48219224049564
+32
+4.197274780275777
+13
+22.036768218700455
+23
+-130.48219224049564
+33
+4.197274780275777
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+150.16397181960468
+20
+-78.17160139590462
+30
+20.27797927856679
+11
+148.47053090773846
+21
+-80.91591901017391
+31
+30.907950592043353
+12
+143.2440491556461
+22
+-97.11740736894173
+32
+22.868325042726948
+13
+143.2440491556461
+23
+-97.11740736894173
+33
+22.868325042726948
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+143.47506370988805
+20
+-73.91065315953712
+30
+47.233601379396866
+11
+142.54075647282102
+21
+-84.63792578320334
+31
+56.89744949341054
+12
+146.06779216485324
+22
+-83.07542067148339
+32
+43.29110946655507
+13
+146.06779216485324
+23
+-83.07542067148339
+33
+43.29110946655507
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+148.47053090773846
+20
+-80.91591901017391
+30
+30.907950592043353
+11
+146.06779216485324
+21
+-83.07542067148339
+31
+43.29110946655507
+12
+143.2440491556461
+22
+-97.11740736894173
+32
+22.868325042726948
+13
+143.2440491556461
+23
+-97.11740736894173
+33
+22.868325042726948
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+127.4816729267906
+20
+-107.99558325301427
+30
+26.678751373293352
+11
+135.2334332656079
+21
+-108.3308499386207
+31
+9.900608825685932
+12
+143.2440491556461
+22
+-97.11740736894173
+32
+22.868325042726948
+13
+143.2440491556461
+23
+-97.11740736894173
+33
+22.868325042726948
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+7.777562142666184
+20
+-121.65989554273425
+30
+13.434695434572651
+11
+8.697919079694389
+21
+-125.02888176130455
+31
+8.063802337648823
+12
+14.772368319333834
+22
+-125.86523022887934
+32
+10.28013992309804
+13
+14.772368319333834
+23
+-125.86523022887934
+33
+10.28013992309804
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+75.7057737846483
+20
+-108.47625498485674
+30
+45.636896514894914
+11
+62.838750673037524
+21
+-113.53807036048772
+31
+39.909242248537495
+12
+79.48342859322611
+22
+-121.90001834562811
+32
+22.241037750246477
+13
+79.48342859322611
+23
+-121.90001834562811
+33
+22.241037750246477
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+92.15249443976691
+20
+-116.43319658662354
+30
+28.22700958252187
+11
+79.48342859322611
+21
+-121.90001834562811
+31
+22.241037750246477
+12
+105.03443755955936
+22
+-122.74550505359352
+32
+8.50292282104726
+13
+105.03443755955936
+23
+-122.74550505359352
+33
+8.50292282104726
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+16.455430776891372
+20
+-77.79196741958572
+30
+98.03563613891835
+11
+27.875893683307226
+21
+-83.27461953190422
+31
+91.34263381958242
+12
+41.27965510873387
+22
+-78.87249693076602
+32
+96.07810058593984
+13
+41.27965510873387
+23
+-78.87249693076602
+33
+96.07810058593984
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+43.48705246360705
+20
+-38.097247188751844
+30
+192.79961929321522
+11
+30.914353013644988
+21
+-44.46661185357005
+31
+189.0295005798363
+12
+21.013271463404344
+22
+-47.65891868098439
+32
+167.59166183471913
+13
+21.013271463404344
+23
+-47.65891868098439
+33
+167.59166183471913
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+3.9603229688590167
+20
+-125.04834507679071
+30
+1.8160247802757765
+11
+4.066515687136385
+21
+-125.65397467599094
+31
+0.0
+12
+5.694128103007171
+22
+-126.29568034232395
+32
+0.0
+13
+5.694128103007171
+23
+-126.29568034232395
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+20.215178337996353
+20
+59.061841770943715
+30
+219.07999191284412
+11
+43.17729952139854
+21
+51.476876083977146
+31
+218.74144668579333
+12
+45.59512079689039
+22
+55.00301251378399
+32
+207.69754714966052
+13
+45.59512079689039
+23
+55.00301251378399
+33
+207.69754714966052
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+15.031408032972237
+20
+-112.72951831903971
+30
+39.629511260988664
+11
+10.585426621271441
+21
+-112.50768260530661
+31
+38.496925354006244
+12
+10.853295282084991
+22
+-117.02825844932259
+32
+27.598268890383196
+13
+10.853295282084991
+23
+-117.02825844932259
+33
+27.598268890383196
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+45.59512079689039
+20
+55.00301251378399
+30
+207.69754714966052
+11
+43.17729952139854
+21
+51.476876083977146
+31
+218.74144668579333
+12
+63.57122586152329
+22
+38.00335722457329
+32
+204.2099693298363
+13
+63.57122586152329
+23
+38.00335722457329
+33
+204.2099693298363
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+104.29440029120694
+20
+-110.5122961912216
+30
+35.424632263185934
+11
+92.15249443976691
+21
+-116.43319658662354
+31
+28.22700958252187
+12
+105.03443755955936
+22
+-122.74550505359352
+32
+8.50292282104726
+13
+105.03443755955936
+23
+-122.74550505359352
+33
+8.50292282104726
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+41.27965510873387
+20
+-78.87249693076602
+30
+96.07810058593984
+11
+38.25772079362193
+21
+-89.2245185184614
+31
+83.51103820801015
+12
+53.91845576706572
+22
+-84.62691278378351
+32
+87.98566818237538
+13
+53.91845576706572
+23
+-84.62691278378351
+33
+87.98566818237538
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+11.425038937320098
+20
+-128.08028181377028
+30
+2.401454162599995
+11
+5.694128103007171
+21
+-126.29568034232395
+31
+0.0
+12
+12.050245852555303
+22
+-129.01603569433578
+32
+0.0
+13
+12.050245852555303
+23
+-129.01603569433578
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+5.694128103007171
+20
+-126.29568034232395
+30
+0.0
+11
+11.425038937320098
+21
+-128.08028181377028
+31
+2.401454162599995
+12
+3.9603229688590167
+22
+-125.04834507679071
+32
+1.8160247802757765
+13
+3.9603229688590167
+23
+-125.04834507679071
+33
+1.8160247802757765
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+115.29005476676613
+20
+79.66885175450253
+30
+148.78079452514882
+11
+85.43358715270438
+21
+88.7220082222989
+31
+158.47942733764881
+12
+92.9345976300489
+22
+63.88532763645663
+32
+175.40746383667226
+13
+92.9345976300489
+23
+63.88532763645663
+33
+175.40746383667226
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+4.959503182982011
+20
+70.92146737960998
+30
+190.53948593139881
+11
+42.83637871076835
+21
+91.29773246584627
+31
+158.93172531128164
+12
+14.583399960279245
+22
+83.57618995356563
+32
+171.3879417419457
+13
+14.583399960279245
+23
+83.57618995356563
+33
+171.3879417419457
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+142.1847572847631
+20
+40.136738826247395
+30
+150.753154754641
+11
+110.08723389973933
+21
+14.508254382437944
+31
+168.11294784546132
+12
+134.63333399528074
+22
+13.30445350255567
+32
+152.02788314819568
+13
+134.63333399528074
+23
+13.30445350255567
+33
+152.02788314819568
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+58.883322492070945
+20
+90.53384490364621
+30
+167.79630050659412
+11
+85.43358715270438
+21
+88.7220082222989
+31
+158.47942733764881
+12
+52.66480067639882
+22
+96.41854956622466
+32
+158.58465347290272
+13
+52.66480067639882
+23
+96.41854956622466
+33
+158.58465347290272
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+92.9345976300489
+20
+63.88532763645663
+30
+175.40746383667226
+11
+56.12752770092658
+21
+57.72487311980166
+31
+200.32377243042225
+12
+76.50971521236598
+22
+37.52853375965934
+32
+196.39901199341054
+13
+76.50971521236598
+23
+37.52853375965934
+33
+196.39901199341054
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+-0.03339814780747937
+20
+83.10944311674993
+30
+172.21635193522067
+11
+4.959503182982011
+21
+70.92146737960998
+31
+190.53948593139881
+12
+5.632285215677397
+22
+83.12698528573927
+32
+172.18227310180896
+13
+5.632285215677397
+23
+83.12698528573927
+33
+172.18227310180896
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+4.959503182982011
+20
+70.92146737960998
+30
+190.53948593139881
+11
+-0.03339814780747937
+21
+83.10944311674993
+31
+172.21635193522067
+12
+-0.03296123921933186
+22
+82.02222026646369
+32
+173.85146324357788
+13
+-0.03296123921933186
+23
+82.02222026646369
+33
+173.85146324357788
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+52.66480067639882
+20
+96.41854956622466
+30
+158.58465347290272
+11
+85.43358715270438
+21
+88.7220082222989
+31
+158.47942733764881
+12
+84.1775180445552
+22
+92.9158681993883
+32
+154.44343338012928
+13
+84.1775180445552
+23
+92.9158681993883
+33
+154.44343338012928
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+110.99795181341419
+20
+39.94990116240525
+30
+172.49388198852773
+11
+76.50971521236598
+21
+37.52853375965934
+31
+196.39901199341054
+12
+76.80296119854148
+22
+15.141951142449502
+32
+184.49237442016835
+13
+76.80296119854148
+23
+15.141951142449502
+33
+184.49237442016835
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+1.6041105319870184
+20
+126.5745054079634
+30
+63.90419235229726
+11
+14.479430842981428
+21
+131.47894521043864
+31
+61.095739746096086
+12
+15.11313916305249
+22
+135.61150121858162
+32
+20.885597229006244
+13
+15.11313916305249
+23
+135.61150121858162
+33
+20.885597229006244
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+5.180551221005454
+20
+101.01578950761697
+30
+149.70321884155507
+11
+16.78467292994558
+21
+99.67821082340613
+31
+149.5966361999535
+12
+17.951409936212034
+22
+105.12994342231109
+32
+138.84516067505115
+13
+17.951409936212034
+23
+105.12994342231109
+33
+138.84516067505115
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+58.883322492070945
+20
+90.53384490364621
+30
+167.79630050659412
+11
+26.69145705458768
+21
+77.52075510315164
+31
+189.97401657104726
+12
+56.12752770092658
+22
+57.72487311980166
+32
+200.32377243042225
+13
+56.12752770092658
+23
+57.72487311980166
+33
+200.32377243042225
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+4.959503182982011
+20
+70.92146737960998
+30
+190.53948593139881
+11
+52.66480067639882
+21
+96.41854956622466
+31
+158.58465347290272
+12
+42.83637871076835
+22
+91.29773246584627
+32
+158.93172531128164
+13
+42.83637871076835
+23
+91.29773246584627
+33
+158.93172531128164
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+52.40052851339469
+20
+109.46549365939855
+30
+150.09931869507068
+11
+17.951409936212034
+21
+105.12994342231109
+31
+138.84516067505115
+12
+43.30262173526841
+22
+93.04861747890598
+32
+155.91117324829335
+13
+43.30262173526841
+23
+93.04861747890598
+33
+155.91117324829335
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+84.1775180445552
+20
+92.9158681993883
+30
+154.44343338012928
+11
+82.9141493203411
+21
+103.2558529241941
+31
+144.6205833435082
+12
+52.40052851339469
+22
+109.46549365939855
+32
+150.09931869507068
+13
+52.40052851339469
+23
+109.46549365939855
+33
+150.09931869507068
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+5.180551221005454
+20
+101.01578950761697
+30
+149.70321884155507
+11
+17.951409936212034
+21
+105.12994342231109
+31
+138.84516067505115
+12
+4.999660170436129
+22
+105.26361989576408
+32
+136.93810653686756
+13
+4.999660170436129
+23
+105.26361989576408
+33
+136.93810653686756
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.5037101952462838
+20
+122.9944320011509
+30
+79.88596878051992
+11
+15.812821693331113
+21
+129.80722943027345
+31
+77.80402221679921
+12
+1.6041105319870184
+22
+126.5745054079634
+32
+63.90419235229726
+13
+1.6041105319870184
+23
+126.5745054079634
+33
+63.90419235229726
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+1.4229419640300527
+20
+127.17642561461079
+30
+21.284313201906635
+11
+15.11313916305249
+21
+135.61150121858162
+31
+20.885597229006244
+12
+14.774208697011588
+22
+133.66629357036655
+32
+1.2406723022484327
+13
+14.774208697011588
+23
+133.66629357036655
+33
+1.2406723022484327
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+1.4229419640300527
+20
+127.17642561461079
+30
+21.284313201906635
+11
+14.774208697011588
+21
+133.66629357036655
+31
+1.2406723022484327
+12
+1.2722054435333228
+22
+124.94908956324593
+32
+3.533555603029683
+13
+1.2722054435333228
+23
+124.94908956324593
+33
+3.533555603029683
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+-0.03374788300828926
+20
+83.97973981550714
+30
+171.3295366055891
+11
+5.632285215677397
+21
+83.12698528573927
+31
+172.18227310180896
+12
+5.365449429434058
+22
+93.63519039605828
+32
+161.4753684997582
+13
+5.365449429434058
+23
+93.63519039605828
+33
+161.4753684997582
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+5.632285215677397
+20
+83.12698528573927
+30
+172.18227310180896
+11
+-0.03374788300828926
+21
+83.97973981550714
+31
+171.3295366055891
+12
+-0.03339814780747937
+22
+83.10944311674993
+32
+172.21635193522067
+13
+-0.03339814780747937
+23
+83.10944311674993
+33
+172.21635193522067
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+76.50971521236598
+20
+37.52853375965934
+30
+196.39901199341054
+11
+45.59512079689039
+21
+55.00301251378399
+31
+207.69754714966052
+12
+63.57122586152329
+22
+38.00335722457329
+32
+204.2099693298363
+13
+63.57122586152329
+23
+38.00335722457329
+33
+204.2099693298363
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+41.74540863465434
+20
+-29.081109774375584
+30
+133.54722824096913
+11
+37.76750744953299
+21
+-28.25217352449391
+31
+135.59652175903554
+12
+28.889074159341522
+22
+-43.06673890812219
+32
+125.54035263061756
+13
+28.889074159341522
+23
+-43.06673890812219
+33
+125.54035263061756
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+110.08723389973933
+20
+14.508254382437944
+30
+168.11294784546132
+11
+67.96307514056734
+21
+-3.106046893056986
+31
+165.78130722046131
+12
+98.29734531885626
+22
+-4.054980023355125
+32
+154.23918228149648
+13
+98.29734531885626
+23
+-4.054980023355125
+33
+154.23918228149648
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+9.262109099231695
+20
+-105.19397078777912
+30
+57.304498291017964
+11
+7.264642884119402
+21
+-108.3142300430484
+31
+48.46414642334218
+12
+16.23002819403411
+22
+-108.85591227392446
+32
+49.2525672912621
+13
+16.23002819403411
+23
+-108.85591227392446
+33
+49.2525672912621
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+67.96307514056734
+20
+-3.106046893056986
+30
+165.78130722046131
+11
+54.95624599533022
+21
+-16.5366242311039
+31
+148.8026924133324
+12
+81.20284152095478
+22
+-19.484521810901388
+32
+137.17026290893787
+13
+81.20284152095478
+23
+-19.484521810901388
+33
+137.17026290893787
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+10.585426621271441
+20
+-112.50768260530661
+30
+38.496925354006244
+11
+5.242444526304533
+21
+-111.88602841398722
+31
+38.0486968994164
+12
+10.853295282084991
+22
+-117.02825844932259
+32
+27.598268890383196
+13
+10.853295282084991
+23
+-117.02825844932259
+33
+27.598268890383196
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+45.59512079689039
+20
+55.00301251378399
+30
+207.69754714966052
+11
+56.12752770092658
+21
+57.72487311980166
+31
+200.32377243042225
+12
+22.093585791120258
+22
+67.83927265790055
+32
+203.62473373413317
+13
+22.093585791120258
+23
+67.83927265790055
+33
+203.62473373413317
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+3.9603229688590167
+20
+-125.04834507679071
+30
+1.8160247802757765
+11
+1.2293774996949274
+21
+-124.7327474863056
+31
+0.0
+12
+4.066515687136385
+22
+-125.65397467599094
+32
+0.0
+13
+4.066515687136385
+23
+-125.65397467599094
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+1.2293774996949274
+20
+-124.7327474863056
+30
+0.0
+11
+3.9603229688590167
+21
+-125.04834507679071
+31
+1.8160247802757765
+12
+0.6071905943340685
+22
+-124.02204353602654
+32
+1.6173934936546828
+13
+0.6071905943340685
+23
+-124.02204353602654
+33
+1.6173934936546828
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+16.23002819403411
+20
+-108.85591227392446
+30
+49.2525672912621
+11
+7.264642884119402
+21
+-108.3142300430484
+31
+48.46414642334218
+12
+5.242444526304533
+22
+-111.88602841398722
+32
+38.0486968994164
+13
+5.242444526304533
+23
+-111.88602841398722
+33
+38.0486968994164
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+76.80296119854148
+20
+15.141951142449502
+30
+184.49237442016835
+11
+76.50971521236598
+21
+37.52853375965934
+31
+196.39901199341054
+12
+63.57122586152329
+22
+38.00335722457329
+32
+204.2099693298363
+13
+63.57122586152329
+23
+38.00335722457329
+33
+204.2099693298363
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+92.9345976300489
+20
+63.88532763645663
+30
+175.40746383667226
+11
+85.43358715270438
+21
+88.7220082222989
+31
+158.47942733764881
+12
+58.883322492070945
+22
+90.53384490364621
+32
+167.79630050659412
+13
+58.883322492070945
+23
+90.53384490364621
+33
+167.79630050659412
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+4.833565831436057
+20
+65.39217625737167
+30
+204.37294387817616
+11
+22.093585791120258
+21
+67.83927265790055
+31
+203.62473373413317
+12
+26.69145705458768
+22
+77.52075510315164
+32
+189.97401657104726
+13
+26.69145705458768
+23
+77.52075510315164
+33
+189.97401657104726
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+1.2722054435333228
+20
+124.94908956324593
+30
+3.533555603029683
+11
+3.111652033778774
+21
+125.72820287703352
+31
+0.0
+12
+1.4961295113643602
+22
+124.53245820934018
+32
+0.0
+13
+1.4961295113643602
+23
+124.53245820934018
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+47.82451221182149
+20
+-15.83145324597668
+30
+152.48676986694568
+11
+41.74540863465434
+21
+-29.081109774375584
+31
+133.54722824096913
+12
+54.95624599533022
+22
+-16.5366242311039
+32
+148.8026924133324
+13
+54.95624599533022
+23
+-16.5366242311039
+33
+148.8026924133324
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+67.96307514056734
+20
+-3.106046893056986
+30
+165.78130722046131
+11
+81.20284152095478
+21
+-19.484521810901388
+31
+137.17026290893787
+12
+98.29734531885626
+22
+-4.054980023355125
+32
+154.23918228149648
+13
+98.29734531885626
+23
+-4.054980023355125
+33
+154.23918228149648
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+41.22377045123538
+20
+-49.557017386783514
+30
+121.93204574585194
+11
+35.226848255524466
+21
+-43.61904730491942
+31
+124.1346244812035
+12
+28.889074159341522
+22
+-43.06673890812219
+32
+125.54035263061756
+13
+28.889074159341522
+23
+-43.06673890812219
+33
+125.54035263061756
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+54.95624599533022
+20
+-16.5366242311039
+30
+148.8026924133324
+11
+41.74540863465434
+21
+-29.081109774375584
+31
+133.54722824096913
+12
+69.95140161686146
+22
+-30.45388967754856
+32
+126.64367675781483
+13
+69.95140161686146
+23
+-30.45388967754856
+33
+126.64367675781483
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+98.29734531885626
+20
+-4.054980023355125
+30
+154.23918228149648
+11
+94.56830830613356
+21
+-19.202409459016916
+31
+132.91044540405505
+12
+122.49228585932734
+22
+-3.0641840966889538
+32
+141.18649063110584
+13
+122.49228585932734
+23
+-3.0641840966889538
+33
+141.18649063110584
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+26.560487562687555
+20
+-102.0287785956587
+30
+65.98361968994374
+11
+9.262109099231695
+21
+-105.19397078777912
+31
+57.304498291017964
+12
+18.608729393985758
+22
+-105.70742393838809
+32
+57.805824279787494
+13
+18.608729393985758
+23
+-105.70742393838809
+33
+57.805824279787494
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+69.95140161686146
+20
+-30.45388967754856
+30
+126.64367675781483
+11
+41.74540863465434
+21
+-29.081109774375584
+31
+133.54722824096913
+12
+35.226848255524466
+22
+-43.61904730491942
+32
+124.1346244812035
+13
+35.226848255524466
+23
+-43.61904730491942
+33
+124.1346244812035
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+4.959503182982011
+20
+70.92146737960998
+30
+190.53948593139881
+11
+26.69145705458768
+21
+77.52075510315164
+31
+189.97401657104726
+12
+52.66480067639882
+22
+96.41854956622466
+32
+158.58465347290272
+13
+52.66480067639882
+23
+96.41854956622466
+33
+158.58465347290272
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.024031565659494613
+20
+-59.801221633518566
+30
+112.44483541157491
+11
+2.772456951801402
+21
+-51.74916085842998
+31
+115.35444335937733
+12
+0.023663386923974572
+22
+-58.88502921913593
+32
+112.65401604949842
+13
+0.023663386923974572
+23
+-58.88502921913593
+33
+112.65401604949842
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+2.772456951801402
+20
+-51.74916085842998
+30
+115.35444335937733
+11
+0.024031565659494613
+21
+-59.801221633518566
+31
+112.44483541157491
+12
+12.290396963915049
+22
+-56.76475045121493
+32
+117.91378326416249
+13
+12.290396963915049
+23
+-56.76475045121493
+33
+117.91378326416249
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+110.99795181341419
+20
+39.94990116240525
+30
+172.49388198852773
+11
+76.80296119854148
+21
+15.141951142449502
+31
+184.49237442016835
+12
+110.08723389973933
+22
+14.508254382437944
+32
+168.11294784546132
+13
+110.08723389973933
+23
+14.508254382437944
+33
+168.11294784546132
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+1.2722054435333228
+20
+124.94908956324593
+30
+3.533555603029683
+11
+14.638328578457244
+21
+133.41831150318043
+31
+0.0
+12
+3.111652033778774
+22
+125.72820287703352
+32
+0.0
+13
+3.111652033778774
+23
+125.72820287703352
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+14.638328578457244
+20
+133.41831150318043
+30
+0.0
+11
+1.2722054435333228
+21
+124.94908956324593
+31
+3.533555603029683
+12
+14.774208697011588
+22
+133.66629357036655
+32
+1.2406723022484327
+13
+14.774208697011588
+23
+133.66629357036655
+33
+1.2406723022484327
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+142.1847572847631
+20
+40.136738826247395
+30
+150.753154754641
+11
+121.74597301396997
+21
+65.8264346825095
+31
+157.56087875366444
+12
+110.99795181341419
+22
+39.94990116240525
+32
+172.49388198852773
+13
+110.99795181341419
+23
+39.94990116240525
+33
+172.49388198852773
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+17.951409936212034
+20
+105.12994342231109
+30
+138.84516067505115
+11
+2.3180255292953205
+21
+121.35497152581453
+31
+96.59027862549061
+12
+4.999660170436129
+22
+105.26361989576408
+32
+136.93810653686756
+13
+4.999660170436129
+23
+105.26361989576408
+33
+136.93810653686756
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+41.22377045123538
+20
+-49.557017386783514
+30
+121.93204574585194
+11
+28.889074159341522
+21
+-43.06673890812219
+31
+125.54035263061756
+12
+25.14798290055617
+22
+-54.28496737296365
+32
+118.9119781494164
+13
+25.14798290055617
+23
+-54.28496737296365
+33
+118.9119781494164
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+15.812821693331113
+20
+129.80722943027345
+30
+77.80402221679921
+11
+14.479430842981428
+21
+131.47894521043864
+31
+61.095739746096086
+12
+1.6041105319870184
+22
+126.5745054079634
+32
+63.90419235229726
+13
+1.6041105319870184
+23
+126.5745054079634
+33
+63.90419235229726
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+17.15698235956875
+20
+126.44660787160322
+30
+96.0854644775414
+11
+15.812821693331113
+21
+129.80722943027345
+31
+77.80402221679921
+12
+0.5037101952462838
+22
+122.9944320011509
+32
+79.88596878051992
+13
+0.5037101952462838
+23
+122.9944320011509
+33
+79.88596878051992
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+52.40052851339469
+20
+109.46549365939855
+30
+150.09931869507068
+11
+43.30262173526841
+21
+93.04861747890598
+31
+155.91117324829335
+12
+51.98318434026864
+22
+97.6299330522167
+32
+156.97758102417225
+13
+51.98318434026864
+23
+97.6299330522167
+33
+156.97758102417225
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+26.69145705458768
+20
+77.52075510315164
+30
+189.97401657104726
+11
+58.883322492070945
+21
+90.53384490364621
+31
+167.79630050659412
+12
+52.66480067639882
+22
+96.41854956622466
+32
+158.58465347290272
+13
+52.66480067639882
+23
+96.41854956622466
+33
+158.58465347290272
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+52.40052851339469
+20
+109.46549365939855
+30
+150.09931869507068
+11
+55.150208871203944
+21
+132.6944441872318
+31
+114.67192687988515
+12
+17.951409936212034
+22
+105.12994342231109
+32
+138.84516067505115
+13
+17.951409936212034
+23
+105.12994342231109
+33
+138.84516067505115
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+142.1847572847631
+20
+40.136738826247395
+30
+150.753154754641
+11
+110.99795181341419
+21
+39.94990116240525
+31
+172.49388198852773
+12
+110.08723389973933
+22
+14.508254382437944
+32
+168.11294784546132
+13
+110.08723389973933
+23
+14.508254382437944
+33
+168.11294784546132
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+17.951409936212034
+20
+105.12994342231109
+30
+138.84516067505115
+11
+17.15698235956875
+21
+126.44660787160322
+31
+96.0854644775414
+12
+2.3180255292953205
+22
+121.35497152581453
+32
+96.59027862549061
+13
+2.3180255292953205
+23
+121.35497152581453
+33
+96.59027862549061
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+76.50971521236598
+20
+37.52853375965934
+30
+196.39901199341054
+11
+56.12752770092658
+21
+57.72487311980166
+31
+200.32377243042225
+12
+45.59512079689039
+22
+55.00301251378399
+32
+207.69754714966052
+13
+45.59512079689039
+23
+55.00301251378399
+33
+207.69754714966052
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+121.74597301396997
+20
+65.8264346825095
+30
+157.56087875366444
+11
+115.29005476676613
+21
+79.66885175450253
+31
+148.78079452514882
+12
+92.9345976300489
+22
+63.88532763645663
+32
+175.40746383667226
+13
+92.9345976300489
+23
+63.88532763645663
+33
+175.40746383667226
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+121.74597301396997
+20
+65.8264346825095
+30
+157.56087875366444
+11
+92.9345976300489
+21
+63.88532763645663
+31
+175.40746383667226
+12
+110.99795181341419
+22
+39.94990116240525
+32
+172.49388198852773
+13
+110.99795181341419
+23
+39.94990116240525
+33
+172.49388198852773
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+1.6041105319870184
+20
+126.5745054079634
+30
+63.90419235229726
+11
+15.11313916305249
+21
+135.61150121858162
+31
+20.885597229006244
+12
+1.4229419640300527
+22
+127.17642561461079
+32
+21.284313201906635
+13
+1.4229419640300527
+23
+127.17642561461079
+33
+21.284313201906635
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+17.951409936212034
+20
+105.12994342231109
+30
+138.84516067505115
+11
+55.150208871203944
+21
+132.6944441872318
+31
+114.67192687988515
+12
+17.15698235956875
+22
+126.44660787160322
+32
+96.0854644775414
+13
+17.15698235956875
+23
+126.44660787160322
+33
+96.0854644775414
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+59.704893179039445
+20
+-3.212464677028903
+30
+170.29110946655507
+11
+54.95624599533022
+21
+-16.5366242311039
+31
+148.8026924133324
+12
+67.96307514056734
+22
+-3.106046893056986
+32
+165.78130722046131
+13
+67.96307514056734
+23
+-3.106046893056986
+33
+165.78130722046131
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+110.08723389973933
+20
+14.508254382437944
+30
+168.11294784546132
+11
+98.29734531885626
+21
+-4.054980023355125
+31
+154.23918228149648
+12
+122.49228585932734
+22
+-3.0641840966889538
+32
+141.18649063110584
+13
+122.49228585932734
+23
+-3.0641840966889538
+33
+141.18649063110584
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+26.9468247467991
+20
+-49.765563307927465
+30
+148.71781387329335
+11
+11.141953614717861
+21
+-52.17836390704888
+31
+146.17203903198475
+12
+2.772456951801402
+22
+-51.74916085842998
+32
+115.35444335937733
+13
+2.772456951801402
+23
+-51.74916085842998
+33
+115.35444335937733
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+17.323411371753323
+20
+-90.82087929668435
+30
+83.42044296264882
+11
+0.0368237900653516
+21
+-91.63396435713938
+31
+83.11116890475803
+12
+15.565032628677455
+22
+-96.62433991611047
+32
+74.76360702514881
+13
+15.565032628677455
+23
+-96.62433991611047
+33
+74.76360702514881
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.0368237900653516
+20
+-91.63396435713938
+30
+83.11116890475803
+11
+17.323411371753323
+21
+-90.82087929668435
+31
+83.42044296264882
+12
+0.03676121252740223
+22
+-91.47824361595349
+32
+83.34595771097877
+13
+0.03676121252740223
+23
+-91.47824361595349
+33
+83.34595771097877
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+76.80296119854148
+20
+15.141951142449502
+30
+184.49237442016835
+11
+67.96307514056734
+21
+-3.106046893056986
+31
+165.78130722046131
+12
+110.08723389973933
+22
+14.508254382437944
+32
+168.11294784546132
+13
+110.08723389973933
+23
+14.508254382437944
+33
+168.11294784546132
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+3.495138650567074
+20
+-115.44933195030296
+30
+28.07042999267812
+11
+0.046495025687697755
+21
+-115.70029915691822
+31
+26.472311813480452
+12
+2.3217162041567367
+22
+-118.13358811619385
+32
+20.205309295656633
+13
+2.3217162041567367
+23
+-118.13358811619385
+33
+20.205309295656633
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.046495025687697755
+20
+-115.70029915691822
+30
+26.472311813480452
+11
+3.495138650567074
+21
+-115.44933195030296
+31
+28.07042999267812
+12
+0.046248137040899195
+22
+-115.085930418112
+32
+28.20300842683369
+13
+0.046248137040899195
+23
+-115.085930418112
+33
+28.20300842683369
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+7.264642884119402
+20
+-108.3142300430484
+30
+48.46414642334218
+11
+0.043542227885701834
+21
+-108.35242518540431
+31
+47.183045836490436
+12
+5.242444526304533
+22
+-111.88602841398722
+32
+38.0486968994164
+13
+5.242444526304533
+23
+-111.88602841398722
+33
+38.0486968994164
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.043542227885701834
+20
+-108.35242518540431
+30
+47.183045836490436
+11
+7.264642884119402
+21
+-108.3142300430484
+31
+48.46414642334218
+12
+0.043399523045771465
+22
+-107.9973120864482
+32
+48.185875731523026
+13
+0.043399523045771465
+23
+-107.9973120864482
+33
+48.185875731523026
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.9646214097758469
+20
+-121.9219033414709
+30
+8.435581970217182
+11
+3.9603229688590167
+21
+-125.04834507679071
+31
+1.8160247802757765
+12
+3.7096038563558142
+22
+-122.6878859384345
+32
+8.341983032228901
+13
+3.7096038563558142
+23
+-122.6878859384345
+33
+8.341983032228901
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+5.242444526304533
+20
+-111.88602841398722
+30
+38.0486968994164
+11
+3.495138650567074
+21
+-115.44933195030296
+31
+28.07042999267812
+12
+10.853295282084991
+22
+-117.02825844932259
+32
+27.598268890383196
+13
+10.853295282084991
+23
+-117.02825844932259
+33
+27.598268890383196
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+59.704893179039445
+20
+-3.212464677028903
+30
+170.29110946655507
+11
+47.82451221182149
+21
+-15.83145324597668
+31
+152.48676986694568
+12
+54.95624599533022
+22
+-16.5366242311039
+32
+148.8026924133324
+13
+54.95624599533022
+23
+-16.5366242311039
+33
+148.8026924133324
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+16.455430776891372
+20
+-77.79196741958572
+30
+98.03563613891835
+11
+13.960595699493846
+21
+-84.59611330969865
+31
+90.75914230346913
+12
+27.875893683307226
+22
+-83.27461953190422
+32
+91.34263381958242
+13
+27.875893683307226
+23
+-83.27461953190422
+33
+91.34263381958242
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+25.14798290055617
+20
+-54.28496737296365
+30
+118.9119781494164
+11
+12.290396963915049
+21
+-56.76475045121493
+31
+117.91378326416249
+12
+7.283370867188594
+22
+-67.12465406874308
+32
+109.8533256530785
+13
+7.283370867188594
+23
+-67.12465406874308
+33
+109.8533256530785
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+42.83637871076835
+20
+91.29773246584627
+30
+158.93172531128164
+11
+51.98318434026864
+21
+97.6299330522167
+31
+156.97758102417225
+12
+43.30262173526841
+22
+93.04861747890598
+32
+155.91117324829335
+13
+43.30262173526841
+23
+93.04861747890598
+33
+155.91117324829335
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+47.82451221182149
+20
+-15.83145324597668
+30
+152.48676986694568
+11
+37.76750744953299
+21
+-28.25217352449391
+31
+135.59652175903554
+12
+41.74540863465434
+22
+-29.081109774375584
+32
+133.54722824096913
+13
+41.74540863465434
+23
+-29.081109774375584
+33
+133.54722824096913
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+-0.028494472832693383
+20
+70.9069192305219
+30
+190.57022367018925
+11
+4.833565831436057
+21
+65.39217625737167
+31
+204.37294387817616
+12
+4.959503182982011
+22
+70.92146737960998
+32
+190.53948593139881
+13
+4.959503182982011
+23
+70.92146737960998
+33
+190.53948593139881
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+4.833565831436057
+20
+65.39217625737167
+30
+204.37294387817616
+11
+-0.028494472832693383
+21
+70.9069192305219
+31
+190.57022367018925
+12
+-0.02835458688378508
+22
+70.55882078569773
+32
+191.44112297953473
+13
+-0.02835458688378508
+23
+70.55882078569773
+33
+191.44112297953473
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+22.093585791120258
+20
+67.83927265790055
+30
+203.62473373413317
+11
+56.12752770092658
+21
+57.72487311980166
+31
+200.32377243042225
+12
+26.69145705458768
+22
+77.52075510315164
+32
+189.97401657104726
+13
+26.69145705458768
+23
+77.52075510315164
+33
+189.97401657104726
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+26.9468247467991
+20
+-49.765563307927465
+30
+148.71781387329335
+11
+2.772456951801402
+21
+-51.74916085842998
+31
+115.35444335937733
+12
+12.290396963915049
+22
+-56.76475045121493
+32
+117.91378326416249
+13
+12.290396963915049
+23
+-56.76475045121493
+33
+117.91378326416249
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+42.83637871076835
+20
+91.29773246584627
+30
+158.93172531128164
+11
+52.66480067639882
+21
+96.41854956622466
+31
+158.58465347290272
+12
+51.98318434026864
+22
+97.6299330522167
+32
+156.97758102417225
+13
+51.98318434026864
+23
+97.6299330522167
+33
+156.97758102417225
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+40.763423708493264
+20
+-34.08326688259705
+30
+153.07878799438708
+11
+26.9468247467991
+21
+-49.765563307927465
+31
+148.71781387329335
+12
+12.290396963915049
+22
+-56.76475045121493
+32
+117.91378326416249
+13
+12.290396963915049
+23
+-56.76475045121493
+33
+117.91378326416249
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+76.80296119854148
+20
+15.141951142449502
+30
+184.49237442016835
+11
+63.57122586152329
+21
+38.00335722457329
+31
+204.2099693298363
+12
+66.87398344742765
+22
+15.726958497125281
+32
+190.68734512329334
+13
+66.87398344742765
+23
+15.726958497125281
+33
+190.68734512329334
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.024218744090870346
+20
+-60.26700480461702
+30
+112.1472478237803
+11
+12.290396963915049
+21
+-56.76475045121493
+31
+117.91378326416249
+12
+0.024031565659494613
+22
+-59.801221633518566
+32
+112.44483541157491
+13
+0.024031565659494613
+23
+-59.801221633518566
+33
+112.44483541157491
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+12.290396963915049
+20
+-56.76475045121493
+30
+117.91378326416249
+11
+0.024218744090870346
+21
+-60.26700480461702
+31
+112.1472478237803
+12
+7.283370867188594
+22
+-67.12465406874308
+32
+109.8533256530785
+13
+7.283370867188594
+23
+-67.12465406874308
+33
+109.8533256530785
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+2.772456951801402
+20
+-51.74916085842998
+30
+115.35444335937733
+11
+0.01989455840447757
+21
+-49.506507953199396
+31
+115.88177981989102
+12
+0.01997747577170428
+22
+-49.712843234194736
+32
+114.83519656983125
+13
+0.01997747577170428
+23
+-49.712843234194736
+33
+114.83519656983125
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+0.01989455840447757
+20
+-49.506507953199396
+30
+115.88177981989102
+11
+2.772456951801402
+21
+-51.74916085842998
+31
+115.35444335937733
+12
+11.141953614717861
+22
+-52.17836390704888
+32
+146.17203903198475
+13
+11.141953614717861
+23
+-52.17836390704888
+33
+146.17203903198475
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+98.29734531885626
+20
+-4.054980023355125
+30
+154.23918228149648
+11
+81.20284152095478
+21
+-19.484521810901388
+31
+137.17026290893787
+12
+94.56830830613356
+22
+-19.202409459016916
+32
+132.91044540405505
+13
+94.56830830613356
+23
+-19.202409459016916
+33
+132.91044540405505
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+16.23002819403411
+20
+-108.85591227392446
+30
+49.2525672912621
+11
+10.585426621271441
+21
+-112.50768260530661
+31
+38.496925354006244
+12
+15.031408032972237
+22
+-112.72951831903971
+32
+39.629511260988664
+13
+15.031408032972237
+23
+-112.72951831903971
+33
+39.629511260988664
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+20.215178337996353
+20
+59.061841770943715
+30
+219.07999191284412
+11
+22.093585791120258
+21
+67.83927265790055
+31
+203.62473373413317
+12
+5.021595132014847
+22
+60.16540380598943
+32
+218.79938888550038
+13
+5.021595132014847
+23
+60.16540380598943
+33
+218.79938888550038
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+75.7057737846483
+20
+-108.47625498485674
+30
+45.636896514894914
+11
+79.48342859322611
+21
+-121.90001834562811
+31
+22.241037750246477
+12
+92.15249443976691
+22
+-116.43319658662354
+32
+28.22700958252187
+13
+92.15249443976691
+23
+-116.43319658662354
+33
+28.22700958252187
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+10.853295282084991
+20
+-117.02825844932259
+30
+27.598268890383196
+11
+21.3484940456724
+21
+-122.33706697923658
+31
+18.353678131105855
+12
+27.426427515545345
+22
+-122.12878952286687
+32
+21.99570388794179
+13
+27.426427515545345
+23
+-122.12878952286687
+33
+21.99570388794179
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+8.548231890868513
+20
+-119.46915319964964
+30
+19.605539703371477
+11
+7.777562142666184
+21
+-121.65989554273425
+31
+13.434695434572651
+12
+21.3484940456724
+22
+-122.33706697923658
+32
+18.353678131105855
+13
+21.3484940456724
+23
+-122.33706697923658
+33
+18.353678131105855
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+152.15906739988134
+20
+-51.737680245277545
+30
+0.0
+11
+151.9323663041737
+21
+-51.87086758562435
+31
+1.5632014827099083
+12
+152.20734470302705
+22
+-52.36434908727282
+32
+0.0
+13
+152.20734470302705
+23
+-52.36434908727282
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.9323663041737
+20
+-51.87086758562435
+30
+1.5632014827099083
+11
+152.15906739988134
+21
+-51.737680245277545
+31
+0.0
+12
+151.86293395995477
+22
+-50.52395270772306
+32
+1.3367230930671865
+13
+151.86293395995477
+23
+-50.52395270772306
+33
+1.3367230930671865
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+107.5861609794709
+20
+-74.35214677537962
+30
+91.62604675293203
+11
+107.18305749098995
+21
+-78.26131805234044
+31
+87.30334548950428
+12
+147.24384931574625
+22
+-73.59370543322612
+32
+72.06997299194569
+13
+147.24384931574625
+23
+-73.59370543322612
+33
+72.06997299194569
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+107.18305749098995
+20
+-78.26131805234044
+30
+87.30334548950428
+11
+128.2972524404454
+21
+-78.70082308002429
+31
+85.38776473999256
+12
+147.24384931574625
+22
+-73.59370543322612
+32
+72.06997299194569
+13
+147.24384931574625
+23
+-73.59370543322612
+33
+72.06997299194569
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+28.208062084038428
+20
+-107.28267169965386
+30
+53.25455169677968
+11
+16.23002819403411
+21
+-108.85591227392446
+31
+49.2525672912621
+12
+27.16720389118873
+22
+-109.03501391067739
+32
+49.50885009765859
+13
+27.16720389118873
+23
+-109.03501391067739
+33
+49.50885009765859
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+128.2972524404454
+20
+-78.70082308002429
+30
+85.38776473999256
+11
+137.47782316111585
+21
+-80.4502514409713
+31
+74.59607849121328
+12
+147.24384931574625
+22
+-73.59370543322612
+32
+72.06997299194569
+13
+147.24384931574625
+23
+-73.59370543322612
+33
+72.06997299194569
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+90.83398772969562
+20
+-65.80716423991764
+30
+104.28903350830312
+11
+67.75847079221415
+21
+-79.75431990006238
+31
+93.67640609741444
+12
+115.89121807283227
+22
+-66.26669706012112
+32
+99.34117660522695
+13
+115.89121807283227
+23
+-66.26669706012112
+33
+99.34117660522695
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.27232287907492
+20
+-73.4629710281333
+30
+11.263316345217183
+11
+150.58698481467096
+21
+-65.5049674350578
+31
+17.22452256429279
+12
+150.16397181960468
+22
+-78.17160139590462
+32
+20.27797927856679
+13
+150.16397181960468
+23
+-78.17160139590462
+33
+20.27797927856679
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+150.58698481467096
+20
+-65.5049674350578
+30
+17.22452256429279
+11
+151.27232287907492
+21
+-73.4629710281333
+31
+11.263316345217183
+12
+150.63756799288075
+22
+-65.23488744582545
+32
+16.815074578698514
+13
+150.63756799288075
+23
+-65.23488744582545
+33
+16.815074578698514
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+150.16397181960468
+20
+-78.17160139590462
+30
+20.27797927856679
+11
+143.2440491556461
+21
+-97.11740736894173
+31
+22.868325042726948
+12
+146.1497399372302
+22
+-92.59506898664439
+32
+9.398895263674214
+13
+146.1497399372302
+23
+-92.59506898664439
+33
+9.398895263674214
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+143.47506370988805
+20
+-73.91065315953712
+30
+47.233601379396866
+11
+137.47782316111585
+21
+-80.4502514409713
+31
+74.59607849121328
+12
+136.03586205173426
+22
+-85.59971378392372
+32
+69.1973770141625
+13
+136.03586205173426
+23
+-85.59971378392372
+33
+69.1973770141625
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+96.95989103267041
+20
+-55.539495505447455
+30
+119.62908554077381
+11
+90.83398772969562
+21
+-65.80716423991764
+31
+104.28903350830312
+12
+115.89121807283227
+22
+-66.26669706012112
+32
+99.34117660522695
+13
+115.89121807283227
+23
+-66.26669706012112
+33
+99.34117660522695
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+21.3484940456724
+20
+-122.33706697923658
+30
+18.353678131105855
+11
+7.777562142666184
+21
+-121.65989554273425
+31
+13.434695434572651
+12
+26.084822147336347
+22
+-124.7654486834366
+32
+14.77230758667226
+13
+26.084822147336347
+23
+-124.7654486834366
+33
+14.77230758667226
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.9919916013273
+20
+-65.6164598254417
+30
+4.815066528322651
+11
+151.13017123133824
+21
+-69.12290573060724
+31
+0.0
+12
+151.1370952980997
+22
+-66.28102452333562
+32
+0.0
+13
+151.1370952980997
+23
+-66.28102452333562
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.12401289416775
+20
+-58.333602270866876
+30
+8.242019868940874
+11
+150.99607242735328
+21
+-60.62180226091683
+31
+11.022223510894767
+12
+151.9919916013273
+22
+-65.6164598254417
+32
+4.815066528322651
+13
+151.9919916013273
+23
+-65.6164598254417
+33
+4.815066528322651
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+150.16397181960468
+20
+-78.17160139590462
+30
+20.27797927856679
+11
+148.7397482932298
+21
+-68.96881249446406
+31
+24.661946925831174
+12
+148.47053090773846
+22
+-80.91591901017391
+32
+30.907950592043353
+13
+148.47053090773846
+23
+-80.91591901017391
+33
+30.907950592043353
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+148.7397482932298
+20
+-68.96881249446406
+30
+24.661946925831174
+11
+150.16397181960468
+21
+-78.17160139590462
+31
+20.27797927856679
+12
+149.06284587784322
+22
+-68.59937853389094
+32
+22.694836617139387
+13
+149.06284587784322
+23
+-68.59937853389094
+33
+22.694836617139387
+70
+3
+ 0
+3DFACE
+ 8
+torso_half
+10
+149.06284587784322
+20
+-68.59937853389094
+30
+22.694836617139387
+11
+150.16397181960468
+21
+-78.17160139590462
+31
+20.27797927856679
+12
+149.1887315596308
+22
+-67.97226854186266
+32
+21.73716537086142
+13
+149.1887315596308
+23
+-67.97226854186266
+33
+21.73716537086142
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+127.09106678978468
+20
+-61.97292208427616
+30
+105.03201141357656
+11
+147.24384931574625
+21
+-73.59370543322612
+31
+72.06997299194569
+12
+142.02470427217827
+22
+-58.6224044304387
+32
+104.65141448974843
+13
+142.02470427217827
+23
+-58.6224044304387
+33
+104.65141448974843
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+152.39520845532402
+20
+-55.30836606889562
+30
+0.0
+11
+151.73969782888256
+21
+-55.4679838928378
+31
+4.273786833903068
+12
+152.39706333724124
+22
+-58.07542692235853
+32
+1.1216873168968704
+13
+152.39706333724124
+23
+-58.07542692235853
+33
+1.1216873168968704
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.73969782888256
+20
+-55.4679838928378
+30
+4.273786833903068
+11
+152.39520845532402
+21
+-55.30836606889562
+31
+0.0
+12
+151.99282971390107
+22
+-53.6510444314634
+32
+1.9043187908133887
+13
+151.99282971390107
+23
+-53.6510444314634
+33
+1.9043187908133887
+70
+3
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.99282971390107
+20
+-53.6510444314634
+30
+1.9043187908133887
+11
+152.39520845532402
+21
+-55.30836606889562
+31
+0.0
+12
+152.20734470302705
+22
+-52.36434908727282
+32
+0.0
+13
+152.20734470302705
+23
+-52.36434908727282
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.99282971390107
+20
+-53.6510444314634
+30
+1.9043187908133887
+11
+152.20734470302705
+21
+-52.36434908727282
+31
+0.0
+12
+151.9323663041737
+22
+-51.87086758562435
+32
+1.5632014827099083
+13
+151.9323663041737
+23
+-51.87086758562435
+33
+1.5632014827099083
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+149.2194982662778
+20
+-80.52087012938733
+30
+0.0
+11
+151.27232287907492
+21
+-73.4629710281333
+31
+11.263316345217183
+12
+148.6803146089252
+22
+-83.90327798788724
+32
+0.0
+13
+148.6803146089252
+23
+-83.90327798788724
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.27232287907492
+20
+-73.4629710281333
+30
+11.263316345217183
+11
+149.2194982662778
+21
+-80.52087012938733
+31
+0.0
+12
+151.9919916013273
+22
+-65.6164598254417
+32
+4.815066528322651
+13
+151.9919916013273
+23
+-65.6164598254417
+33
+4.815066528322651
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.9919916013273
+20
+-65.6164598254417
+30
+4.815066528322651
+11
+150.63756799288075
+21
+-65.23488744582545
+31
+16.815074578698514
+12
+151.27232287907492
+22
+-73.4629710281333
+32
+11.263316345217183
+13
+151.27232287907492
+23
+-73.4629710281333
+33
+11.263316345217183
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+150.63756799288075
+20
+-65.23488744582545
+30
+16.815074578698514
+11
+151.9919916013273
+21
+-65.6164598254417
+31
+4.815066528322651
+12
+150.69305653174226
+22
+-64.90515487943217
+32
+16.320360871166475
+13
+150.69305653174226
+23
+-64.90515487943217
+33
+16.320360871166475
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+26.52422657620338
+20
+-113.76011428459759
+30
+39.985206604006244
+11
+18.2200026283554
+21
+-115.48358531336832
+31
+34.190502166750385
+12
+27.836824299429516
+22
+-119.65623113768095
+32
+28.03225402832265
+13
+27.836824299429516
+23
+-119.65623113768095
+33
+28.03225402832265
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+67.75847079221415
+20
+-79.75431990006238
+30
+93.67640609741444
+11
+107.18305749098995
+21
+-78.26131805234044
+31
+87.30334548950428
+12
+107.5861609794709
+22
+-74.35214677537962
+32
+91.62604675293203
+13
+107.5861609794709
+23
+-74.35214677537962
+33
+91.62604675293203
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+18.2200026283554
+20
+-115.48358531336832
+30
+34.190502166750385
+11
+10.853295282084991
+21
+-117.02825844932259
+31
+27.598268890383196
+12
+27.426427515545345
+22
+-122.12878952286687
+32
+21.99570388794179
+13
+27.426427515545345
+23
+-122.12878952286687
+33
+21.99570388794179
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+147.24384931574625
+20
+-73.59370543322612
+30
+72.06997299194569
+11
+143.47506370988805
+21
+-73.91065315953712
+31
+47.233601379396866
+12
+148.99943834894273
+22
+-74.19374852631539
+32
+61.62264556884999
+13
+148.99943834894273
+23
+-74.19374852631539
+33
+61.62264556884999
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.27232287907492
+20
+-73.4629710281333
+30
+11.263316345217183
+11
+150.16397181960468
+21
+-78.17160139590462
+31
+20.27797927856679
+12
+146.1497399372302
+22
+-92.59506898664439
+32
+9.398895263674214
+13
+146.1497399372302
+23
+-92.59506898664439
+33
+9.398895263674214
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+116.76651604955993
+20
+-91.57911387107508
+30
+64.5214996337914
+11
+102.48349968612156
+21
+-97.59497354638158
+31
+58.4178993225121
+12
+116.52465528889452
+22
+-103.78036283040525
+32
+43.432864379885146
+13
+116.52465528889452
+23
+-103.78036283040525
+33
+43.432864379885146
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+41.27965510873387
+20
+-78.87249693076602
+30
+96.07810058593984
+11
+53.91845576706572
+21
+-84.62691278378351
+31
+87.98566818237538
+12
+67.75847079221415
+22
+-79.75431990006238
+32
+93.67640609741444
+13
+67.75847079221415
+23
+-79.75431990006238
+33
+93.67640609741444
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+106.41944734345599
+20
+-85.05347040964502
+30
+77.157646942141
+11
+116.76651604955993
+21
+-91.57911387107508
+31
+64.5214996337914
+12
+137.47782316111585
+22
+-80.4502514409713
+32
+74.59607849121328
+13
+137.47782316111585
+23
+-80.4502514409713
+33
+74.59607849121328
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+18.2200026283554
+20
+-115.48358531336832
+30
+34.190502166750385
+11
+27.426427515545345
+21
+-122.12878952286687
+31
+21.99570388794179
+12
+27.836824299429516
+22
+-119.65623113768095
+32
+28.03225402832265
+13
+27.836824299429516
+23
+-119.65623113768095
+33
+28.03225402832265
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+136.03586205173426
+20
+-85.59971378392372
+30
+69.1973770141625
+11
+116.76651604955993
+21
+-91.57911387107508
+31
+64.5214996337914
+12
+129.70283150728324
+22
+-95.55606676878932
+32
+52.52562332153554
+13
+129.70283150728324
+23
+-95.55606676878932
+33
+52.52562332153554
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+35.20395226122179
+20
+-44.177943717035
+30
+170.79204788208241
+11
+21.013271463404344
+21
+-47.65891868098439
+31
+167.59166183471913
+12
+26.9468247467991
+22
+-49.765563307927465
+32
+148.71781387329335
+13
+26.9468247467991
+23
+-49.765563307927465
+33
+148.71781387329335
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+41.240996513155515
+20
+-72.46491864615655
+30
+105.22860794067616
+11
+41.27965510873387
+21
+-78.87249693076602
+31
+96.07810058593984
+12
+67.75847079221415
+22
+-79.75431990006238
+32
+93.67640609741444
+13
+67.75847079221415
+23
+-79.75431990006238
+33
+93.67640609741444
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+148.47053090773846
+20
+-80.91591901017391
+30
+30.907950592043353
+11
+147.06913874415895
+21
+-70.02861910381449
+31
+29.30913922556432
+12
+145.56738855405317
+22
+-70.27986901496179
+32
+34.715732974421584
+13
+145.56738855405317
+23
+-70.27986901496179
+33
+34.715732974421584
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+147.06913874415895
+20
+-70.02861910381449
+30
+29.30913922556432
+11
+148.47053090773846
+21
+-80.91591901017391
+31
+30.907950592043353
+12
+147.4537426161958
+22
+-69.71307111898673
+32
+27.774423152763674
+13
+147.4537426161958
+23
+-69.71307111898673
+33
+27.774423152763674
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+10.853295282084991
+20
+-117.02825844932259
+30
+27.598268890383196
+11
+8.548231890868513
+21
+-119.46915319964964
+31
+19.605539703371477
+12
+21.3484940456724
+22
+-122.33706697923658
+32
+18.353678131105855
+13
+21.3484940456724
+23
+-122.33706697923658
+33
+18.353678131105855
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+137.47782316111585
+20
+-80.4502514409713
+30
+74.59607849121328
+11
+143.47506370988805
+21
+-73.91065315953712
+31
+47.233601379396866
+12
+147.24384931574625
+22
+-73.59370543322612
+32
+72.06997299194569
+13
+147.24384931574625
+23
+-73.59370543322612
+33
+72.06997299194569
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+148.7397482932298
+20
+-68.96881249446406
+30
+24.661946925831174
+11
+147.4537426161958
+21
+-69.71307111898673
+31
+27.774423152763674
+12
+148.47053090773846
+22
+-80.91591901017391
+32
+30.907950592043353
+13
+148.47053090773846
+23
+-80.91591901017391
+33
+30.907950592043353
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+8.697919079694389
+20
+-125.02888176130455
+30
+8.063802337648823
+11
+3.9603229688590167
+21
+-125.04834507679071
+31
+1.8160247802757765
+12
+11.425038937320098
+22
+-128.08028181377028
+32
+2.401454162599995
+13
+11.425038937320098
+23
+-128.08028181377028
+33
+2.401454162599995
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+145.04524835330304
+20
+-70.4213062228107
+30
+37.178015573182954
+11
+143.87274694648693
+21
+-71.32379313115182
+31
+42.70191851936068
+12
+143.47506370988805
+22
+-73.91065315953712
+32
+47.233601379396866
+13
+143.47506370988805
+23
+-73.91065315953712
+33
+47.233601379396866
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+143.87274694648693
+20
+-71.32379313115182
+30
+42.70191851936068
+11
+145.04524835330304
+21
+-70.4213062228107
+31
+37.178015573182954
+12
+143.93246864657587
+22
+-70.89052189215528
+32
+41.96917448941026
+13
+143.93246864657587
+23
+-70.89052189215528
+33
+41.96917448941026
+70
+3
+ 0
+3DFACE
+ 8
+torso_half
+10
+143.93246864657587
+20
+-70.89052189215528
+30
+41.96917448941026
+11
+145.04524835330304
+21
+-70.4213062228107
+31
+37.178015573182954
+12
+144.3525574585535
+22
+-70.56668853926593
+32
+39.98947996964454
+13
+144.3525574585535
+23
+-70.56668853926593
+33
+39.98947996964454
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+148.47053090773846
+20
+-80.91591901017391
+30
+30.907950592043353
+11
+145.4279175928123
+21
+-70.3163740748702
+31
+35.359712918751136
+12
+146.06779216485324
+22
+-83.07542067148339
+32
+43.29110946655507
+13
+146.06779216485324
+23
+-83.07542067148339
+33
+43.29110946655507
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+145.4279175928123
+20
+-70.3163740748702
+30
+35.359712918751136
+11
+148.47053090773846
+21
+-80.91591901017391
+31
+30.907950592043353
+12
+145.56738855405317
+22
+-70.27986901496179
+32
+34.715732974421584
+13
+145.56738855405317
+23
+-70.27986901496179
+33
+34.715732974421584
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+107.18305749098995
+20
+-78.26131805234044
+30
+87.30334548950428
+11
+106.41944734345599
+21
+-85.05347040964502
+31
+77.157646942141
+12
+128.2972524404454
+22
+-78.70082308002429
+32
+85.38776473999256
+13
+128.2972524404454
+23
+-78.70082308002429
+33
+85.38776473999256
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+27.16720389118873
+20
+-109.03501391067739
+30
+49.50885009765859
+11
+26.52422657620338
+21
+-113.76011428459759
+31
+39.985206604006244
+12
+36.139489387443064
+22
+-111.1176281919382
+32
+45.64590759277577
+13
+36.139489387443064
+23
+-111.1176281919382
+33
+45.64590759277577
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.9919916013273
+20
+-65.6164598254417
+30
+4.815066528322651
+11
+149.2194982662778
+21
+-80.52087012938733
+31
+0.0
+12
+151.13017123133824
+22
+-69.12290573060724
+32
+0.0
+13
+151.13017123133824
+23
+-69.12290573060724
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+145.4279175928123
+20
+-70.3163740748702
+30
+35.359712918751136
+11
+143.47506370988805
+21
+-73.91065315953712
+31
+47.233601379396866
+12
+146.06779216485324
+22
+-83.07542067148339
+32
+43.29110946655507
+13
+146.06779216485324
+23
+-83.07542067148339
+33
+43.29110946655507
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+143.47506370988805
+20
+-73.91065315953712
+30
+47.233601379396866
+11
+145.4279175928123
+21
+-70.3163740748702
+31
+35.359712918751136
+12
+145.04524835330304
+22
+-70.4213062228107
+32
+37.178015573182954
+13
+145.04524835330304
+23
+-70.4213062228107
+33
+37.178015573182954
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+40.763423708493264
+20
+-34.08326688259705
+30
+153.07878799438708
+11
+35.20395226122179
+21
+-44.177943717035
+31
+170.79204788208241
+12
+26.9468247467991
+22
+-49.765563307927465
+32
+148.71781387329335
+13
+26.9468247467991
+23
+-49.765563307927465
+33
+148.71781387329335
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+96.95989103267041
+20
+-55.539495505447455
+30
+119.62908554077381
+11
+115.89121807283227
+21
+-66.26669706012112
+31
+99.34117660522695
+12
+127.09106678978468
+22
+-61.97292208427616
+32
+105.03201141357656
+13
+127.09106678978468
+23
+-61.97292208427616
+33
+105.03201141357656
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+137.47782316111585
+20
+-80.4502514409713
+30
+74.59607849121328
+11
+116.76651604955993
+21
+-91.57911387107508
+31
+64.5214996337914
+12
+136.03586205173426
+22
+-85.59971378392372
+32
+69.1973770141625
+13
+136.03586205173426
+23
+-85.59971378392372
+33
+69.1973770141625
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+151.3061315778026
+20
+-73.13826370527374
+30
+55.18243789673085
+11
+143.93246864657587
+21
+-70.89052189215528
+31
+41.96917448941026
+12
+144.3525574585535
+22
+-70.56668853926593
+32
+39.98947996964454
+13
+144.3525574585535
+23
+-70.56668853926593
+33
+39.98947996964454
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+143.93246864657587
+20
+-70.89052189215528
+30
+41.96917448941026
+11
+151.3061315778026
+21
+-73.13826370527374
+31
+55.18243789673085
+12
+148.99943834894273
+22
+-74.19374852631539
+32
+61.62264556884999
+13
+148.99943834894273
+23
+-74.19374852631539
+33
+61.62264556884999
+70
+1
+ 0
+3DFACE
+ 8
+torso_half
+10
+142.54075647282102
+20
+-84.63792578320334
+30
+56.89744949341054
+11
+129.70283150728324
+21
+-95.55606676878932
+31
+52.52562332153554
+12
+146.06779216485324
+22
+-83.07542067148339
+32
+43.29110946655507
+13
+146.06779216485324
+23
+-83.07542067148339
+33
+43.29110946655507
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+150.2071194138168
+20
+63.11528778381575
+30
+0.0
+11
+150.00253581613148
+21
+62.97630942057115
+31
+0.0
+12
+150.20473256970118
+22
+63.2729714349116
+32
+0.0
+13
+150.20473256970118
+23
+63.2729714349116
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+175.97500274414864
+20
+-44.51732744019134
+30
+121.51366043091053
+11
+156.43324600827174
+21
+-51.17295385476525
+31
+114.814120128055
+12
+177.90722108584777
+22
+-60.58682893572308
+32
+94.6358436584496
+13
+177.90722108584777
+23
+-60.58682893572308
+33
+94.6358436584496
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+175.97500274414864
+20
+-44.51732744019134
+30
+121.51366043091053
+11
+157.38086347444437
+21
+-32.99521923234534
+31
+128.583965301516
+12
+156.43324600827174
+22
+-51.17295385476525
+32
+114.814120128055
+13
+156.43324600827174
+23
+-51.17295385476525
+33
+114.814120128055
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+127.09106678978468
+20
+-61.97292208427616
+30
+105.03201141357656
+11
+117.8541167606565
+21
+-39.13168745878485
+31
+124.1381126403832
+12
+96.95989103267041
+22
+-55.539495505447455
+32
+119.62908554077381
+13
+96.95989103267041
+23
+-55.539495505447455
+33
+119.62908554077381
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+142.02470427217827
+20
+-58.6224044304387
+30
+104.65141448974843
+11
+117.8541167606565
+21
+-39.13168745878485
+31
+124.1381126403832
+12
+127.09106678978468
+22
+-61.97292208427616
+32
+105.03201141357656
+13
+127.09106678978468
+23
+-61.97292208427616
+33
+105.03201141357656
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+156.43324600827174
+20
+-51.17295385476525
+30
+114.814120128055
+11
+142.02470427217827
+21
+-58.6224044304387
+31
+104.65141448974843
+12
+177.90722108584777
+22
+-60.58682893572308
+32
+94.6358436584496
+13
+177.90722108584777
+23
+-60.58682893572308
+33
+94.6358436584496
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+117.8541167606565
+20
+-39.13168745878485
+30
+124.1381126403832
+11
+142.02470427217827
+21
+-58.6224044304387
+31
+104.65141448974843
+12
+156.43324600827174
+22
+-51.17295385476525
+32
+114.814120128055
+13
+156.43324600827174
+23
+-51.17295385476525
+33
+114.814120128055
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+157.38086347444437
+20
+-32.99521923234534
+30
+128.583965301516
+11
+155.13917668891582
+21
+-30.981157736293618
+31
+129.95035476684802
+12
+117.8541167606565
+22
+-39.13168745878485
+32
+124.1381126403832
+13
+117.8541167606565
+23
+-39.13168745878485
+33
+124.1381126403832
+70
+0
+ 0
+3DFACE
+ 8
+torso_half
+10
+157.38086347444437
+20
+-32.99521923234534
+30
+128.583965301516
+11
+117.8541167606565
+21
+-39.13168745878485
+31
+124.1381126403832
+12
+156.43324600827174
+22
+-51.17295385476525
+32
+114.814120128055
+13
+156.43324600827174
+23
+-51.17295385476525
+33
+114.814120128055
+70
+0
+ 0
+ENDSEC
+ 0
+EOF
diff --git a/hacks/glx/headroom.man b/hacks/glx/headroom.man
new file mode 100644
index 0000000..ced3f94
--- /dev/null
+++ b/hacks/glx/headroom.man
@@ -0,0 +1,72 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+headroom \- a twitchy head.
+.SH SYNOPSIS
+.B headroom
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-spin \fI[XYZ]\fP]
+[\-no-wander]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+"Back in my day, we used to say 'No future'. Well. This is it."
+-- Blank Reg
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-spin 0
+Don't rotate.
+.TP 8
+.B \-spin \fI[XYZ]\fP
+Around which axes should the object spin?
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2020 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/headroom_model.c b/hacks/glx/headroom_model.c
new file mode 100644
index 0000000..92d0663
--- /dev/null
+++ b/hacks/glx/headroom_model.c
@@ -0,0 +1,26005 @@
+/* Generated from "headroom.dxf" on 29-Nov-2020.
+ Faceted face normals.
+ Components: jaw_half, skull_half, teeth_lower_half, teeth_upper_half,
+ torso_cap_half, torso_half.
+ */
+
+#include "gllist.h"
+
+static const float headroom_model_jaw_half_data[] = {
+ 0.915992,-0.396395,0.061889,45.923207,-96.190293,186.717958,
+ 0.915992,-0.396395,0.061889,46.921367,-91.559086,201.607305,
+ 0.915992,-0.396395,0.061889,43.823755,-99.227668,198.336894,
+ 0.921205,-0.384742,0.057914,45.923207,-96.190293,186.717958,
+ 0.921205,-0.384742,0.057914,49.097362,-87.922997,191.150811,
+ 0.921205,-0.384742,0.057914,46.921367,-91.559086,201.607305,
+ 0.879893,-0.473873,0.035112,45.923207,-96.190293,186.717958,
+ 0.879893,-0.473873,0.035112,43.823755,-99.227668,198.336894,
+ 0.879893,-0.473873,0.035112,39.759622,-107.108599,193.820988,
+ 0.868669,-0.495334,-0.007616,40.819539,-105.065733,181.847936,
+ 0.868669,-0.495334,-0.007616,45.923207,-96.190293,186.717958,
+ 0.868669,-0.495334,-0.007616,39.759622,-107.108599,193.820988,
+ 0.954106,-0.29306,0.06163,49.097362,-87.922997,191.150811,
+ 0.954106,-0.29306,0.06163,51.596656,-78.961461,195.072263,
+ 0.954106,-0.29306,0.06163,49.999235,-82.115659,204.803486,
+ 0.939497,-0.333167,0.079655,49.097362,-87.922997,191.150811,
+ 0.939497,-0.333167,0.079655,49.999235,-82.115659,204.803486,
+ 0.939497,-0.333167,0.079655,46.921367,-91.559086,201.607305,
+ 0.964097,-0.265289,-0.011795,51.596656,-78.961461,195.072263,
+ 0.964097,-0.265289,-0.011795,54.752587,-67.739234,200.624356,
+ 0.964097,-0.265289,-0.011795,53.317409,-73.379857,210.182781,
+ 0.92772,-0.371925,0.031737,51.596656,-78.961461,195.072263,
+ 0.92772,-0.371925,0.031737,53.317409,-73.379857,210.182781,
+ 0.92772,-0.371925,0.031737,49.999235,-82.115659,204.803486,
+ 0.851753,-0.523758,-0.013963,40.819539,-105.065733,181.847936,
+ 0.851753,-0.523758,-0.013963,39.759622,-107.108599,193.820988,
+ 0.851753,-0.523758,-0.013963,33.983619,-116.351847,188.198922,
+ 0.843189,-0.53577,-0.044526,33.81447,-115.571512,175.606074,
+ 0.843189,-0.53577,-0.044526,40.819539,-105.065733,181.847936,
+ 0.843189,-0.53577,-0.044526,33.983619,-116.351847,188.198922,
+ 0.835983,-0.546897,-0.045118,33.81447,-115.571512,175.606074,
+ 0.835983,-0.546897,-0.045118,33.983619,-116.351847,188.198922,
+ 0.835983,-0.546897,-0.045118,27.737589,-125.482836,183.148494,
+ 0.812022,-0.574804,-0.101096,27.931684,-123.317063,172.393556,
+ 0.812022,-0.574804,-0.101096,33.81447,-115.571512,175.606074,
+ 0.812022,-0.574804,-0.101096,27.737589,-125.482836,183.148494,
+ 0.973199,-0.221129,-0.06313,54.752587,-67.739234,200.624356,
+ 0.973199,-0.221129,-0.06313,56.838502,-59.948658,205.491946,
+ 0.973199,-0.221129,-0.06313,55.577461,-67.918726,213.969156,
+ 0.936768,-0.344318,-0.062535,54.752587,-67.739234,200.624356,
+ 0.936768,-0.344318,-0.062535,55.577461,-67.918726,213.969156,
+ 0.936768,-0.344318,-0.062535,53.317409,-73.379857,210.182781,
+ 0.967331,-0.237653,-0.08827,56.838502,-59.948658,205.491946,
+ 0.967331,-0.237653,-0.08827,59.217262,-54.03119,215.628396,
+ 0.967331,-0.237653,-0.08827,57.475639,-63.383959,221.723226,
+ 0.964301,-0.248855,-0.090522,56.838502,-59.948658,205.491946,
+ 0.964301,-0.248855,-0.090522,57.475639,-63.383959,221.723226,
+ 0.964301,-0.248855,-0.090522,55.577461,-67.918726,213.969156,
+ 0.972037,-0.220443,-0.080926,59.217262,-54.03119,215.628396,
+ 0.972037,-0.220443,-0.080926,61.36542,-51.06622,233.35433,
+ 0.972037,-0.220443,-0.080926,58.504708,-63.280522,232.264903,
+ 0.966428,-0.239908,-0.091988,59.217262,-54.03119,215.628396,
+ 0.966428,-0.239908,-0.091988,58.504708,-63.280522,232.264903,
+ 0.966428,-0.239908,-0.091988,57.475639,-63.383959,221.723226,
+ 0.957336,-0.268452,-0.106962,61.36542,-51.06622,233.35433,
+ 0.957336,-0.268452,-0.106962,61.627814,-54.450107,244.195668,
+ 0.957336,-0.268452,-0.106962,59.404847,-60.823911,240.296425,
+ 0.97365,-0.224428,-0.040476,58.504708,-63.280522,232.264903,
+ 0.97365,-0.224428,-0.040476,61.36542,-51.06622,233.35433,
+ 0.97365,-0.224428,-0.040476,59.404847,-60.823911,240.296425,
+ 0.930189,-0.36705,0.004687,61.627814,-54.450107,244.195668,
+ 0.930189,-0.36705,0.004687,60.806286,-56.465593,249.400034,
+ 0.930189,-0.36705,0.004687,59.016261,-61.040519,246.377869,
+ 0.933877,-0.354486,0.047046,59.404847,-60.823911,240.296425,
+ 0.933877,-0.354486,0.047046,61.627814,-54.450107,244.195668,
+ 0.933877,-0.354486,0.047046,59.016261,-61.040519,246.377869,
+ 0.942879,-0.215437,-0.2541,61.627814,-54.450107,244.195668,
+ 0.942879,-0.215437,-0.2541,64.659075,-46.011837,248.289311,
+ 0.942879,-0.215437,-0.2541,66.056225,-48.341587,255.448926,
+ 0.858573,-0.508979,-0.061583,61.627814,-54.450107,244.195668,
+ 0.858573,-0.508979,-0.061583,66.056225,-48.341587,255.448926,
+ 0.858573,-0.508979,-0.061583,60.806286,-56.465593,249.400034,
+ 0.945385,0.127874,-0.299826,64.659075,-46.011837,248.289311,
+ 0.945385,0.127874,-0.299826,64.604649,-41.755435,249.933035,
+ 0.945385,0.127874,-0.299826,68.063618,-42.116549,260.685539,
+ 0.966308,-0.120103,-0.22765,64.659075,-46.011837,248.289311,
+ 0.966308,-0.120103,-0.22765,68.063618,-42.116549,260.685539,
+ 0.966308,-0.120103,-0.22765,66.056225,-48.341587,255.448926,
+ 0.994326,-0.105369,0.014571,55.931639,-80.396791,255.241749,
+ 0.994326,-0.105369,0.014571,55.270712,-86.127161,258.90461,
+ 0.994326,-0.105369,0.014571,55.220484,-86.955868,256.339391,
+ 0.991488,-0.117043,-0.057026,55.61555,-82.11718,253.277069,
+ 0.991488,-0.117043,-0.057026,55.931639,-80.396791,255.241749,
+ 0.991488,-0.117043,-0.057026,55.220484,-86.955868,256.339391,
+ 0.977352,-0.211258,-0.012358,54.59214,-89.066576,255.487562,
+ 0.977352,-0.211258,-0.012358,55.270712,-86.127161,258.90461,
+ 0.977352,-0.211258,-0.012358,54.114294,-91.445002,258.355181,
+ 0.945416,-0.315049,0.083267,54.59214,-89.066576,255.487562,
+ 0.945416,-0.315049,0.083267,55.220484,-86.955868,256.339391,
+ 0.945416,-0.315049,0.083267,55.270712,-86.127161,258.90461,
+ 0.937068,-0.340147,-0.078764,54.221473,-90.078122,253.727321,
+ 0.937068,-0.340147,-0.078764,54.114294,-91.445002,258.355181,
+ 0.937068,-0.340147,-0.078764,53.237368,-92.797887,253.76474,
+ 0.964336,-0.259075,-0.054187,54.221473,-90.078122,253.727321,
+ 0.964336,-0.259075,-0.054187,54.59214,-89.066576,255.487562,
+ 0.964336,-0.259075,-0.054187,54.114294,-91.445002,258.355181,
+ 0.928848,-0.314498,-0.195784,52.139361,-89.211995,242.795324,
+ 0.928848,-0.314498,-0.195784,53.432497,-86.257369,244.184108,
+ 0.928848,-0.314498,-0.195784,53.237368,-92.797887,253.76474,
+ 0.918413,-0.335205,-0.210132,53.432497,-86.257369,244.184108,
+ 0.918413,-0.335205,-0.210132,54.221473,-90.078122,253.727321,
+ 0.918413,-0.335205,-0.210132,53.237368,-92.797887,253.76474,
+ 0.929682,-0.329174,-0.165337,54.060538,-75.353056,226.005792,
+ 0.929682,-0.329174,-0.165337,53.432497,-86.257369,244.184108,
+ 0.929682,-0.329174,-0.165337,52.139361,-89.211995,242.795324,
+ 0.896887,-0.38595,-0.215954,54.060538,-75.353056,226.005792,
+ 0.896887,-0.38595,-0.215954,52.139361,-89.211995,242.795324,
+ 0.896887,-0.38595,-0.215954,51.641559,-85.98022,234.952116,
+ 0.958239,-0.204651,-0.199742,55.61555,-82.11718,253.277069,
+ 0.958239,-0.204651,-0.199742,55.220484,-86.955868,256.339391,
+ 0.958239,-0.204651,-0.199742,54.59214,-89.066576,255.487562,
+ 0.97863,-0.177266,-0.104209,55.61555,-82.11718,253.277069,
+ 0.97863,-0.177266,-0.104209,54.59214,-89.066576,255.487562,
+ 0.97863,-0.177266,-0.104209,54.221473,-90.078122,253.727321,
+ 0.962599,-0.263833,-0.061608,55.792031,-72.124323,232.241173,
+ 0.962599,-0.263833,-0.061608,59.404847,-60.823911,240.296425,
+ 0.962599,-0.263833,-0.061608,57.245158,-68.528088,239.544991,
+ 0.955904,-0.29316,-0.017465,55.792031,-72.124323,232.241173,
+ 0.955904,-0.29316,-0.017465,58.504708,-63.280522,232.264903,
+ 0.955904,-0.29316,-0.017465,59.404847,-60.823911,240.296425,
+ 0.969811,-0.237919,0.053494,59.404847,-60.823911,240.296425,
+ 0.969811,-0.237919,0.053494,59.016261,-61.040519,246.377869,
+ 0.969811,-0.237919,0.053494,56.832113,-69.856027,246.767276,
+ 0.962733,-0.270401,0.005341,57.245158,-68.528088,239.544991,
+ 0.962733,-0.270401,0.005341,59.404847,-60.823911,240.296425,
+ 0.962733,-0.270401,0.005341,56.832113,-69.856027,246.767276,
+ 0.94999,-0.291089,-0.113073,54.060538,-75.353056,226.005792,
+ 0.94999,-0.291089,-0.113073,58.504708,-63.280522,232.264903,
+ 0.94999,-0.291089,-0.113073,55.792031,-72.124323,232.241173,
+ 0.948827,-0.302803,-0.089653,57.475639,-63.383959,221.723226,
+ 0.948827,-0.302803,-0.089653,58.504708,-63.280522,232.264903,
+ 0.948827,-0.302803,-0.089653,54.060538,-75.353056,226.005792,
+ 0.972076,-0.178819,-0.151958,53.432497,-86.257369,244.184108,
+ 0.972076,-0.178819,-0.151958,55.61555,-82.11718,253.277069,
+ 0.972076,-0.178819,-0.151958,54.221473,-90.078122,253.727321,
+ 0.955701,-0.27532,-0.104088,53.432497,-86.257369,244.184108,
+ 0.955701,-0.27532,-0.104088,54.95301,-81.748764,246.219368,
+ 0.955701,-0.27532,-0.104088,55.61555,-82.11718,253.277069,
+ 0.99315,-0.108806,-0.042595,56.832113,-69.856027,246.767276,
+ 0.99315,-0.108806,-0.042595,56.997702,-69.439544,249.564315,
+ 0.99315,-0.108806,-0.042595,56.370148,-76.343611,252.568226,
+ 0.996821,-0.079153,-0.009139,56.832113,-69.856027,246.767276,
+ 0.996821,-0.079153,-0.009139,56.370148,-76.343611,252.568226,
+ 0.996821,-0.079153,-0.009139,56.283444,-77.119687,249.832641,
+ 0.994139,-0.108108,-0.000839,56.283444,-77.119687,249.832641,
+ 0.994139,-0.108108,-0.000839,56.370148,-76.343611,252.568226,
+ 0.994139,-0.108108,-0.000839,55.931639,-80.396791,255.241749,
+ 0.98821,-0.150699,-0.027028,56.283444,-77.119687,249.832641,
+ 0.98821,-0.150699,-0.027028,55.931639,-80.396791,255.241749,
+ 0.98821,-0.150699,-0.027028,55.61555,-82.11718,253.277069,
+ 0.997356,-0.055578,0.04682,57.245158,-68.528088,239.544991,
+ 0.997356,-0.055578,0.04682,56.832113,-69.856027,246.767276,
+ 0.997356,-0.055578,0.04682,56.283444,-77.119687,249.832641,
+ 0.980303,-0.186736,-0.064309,57.245158,-68.528088,239.544991,
+ 0.980303,-0.186736,-0.064309,56.283444,-77.119687,249.832641,
+ 0.980303,-0.186736,-0.064309,56.078123,-76.642663,245.317648,
+ 0.982568,-0.174845,-0.063156,56.078123,-76.642663,245.317648,
+ 0.982568,-0.174845,-0.063156,56.283444,-77.119687,249.832641,
+ 0.982568,-0.174845,-0.063156,55.61555,-82.11718,253.277069,
+ 0.967417,-0.231338,-0.102892,56.078123,-76.642663,245.317648,
+ 0.967417,-0.231338,-0.102892,55.61555,-82.11718,253.277069,
+ 0.967417,-0.231338,-0.102892,54.95301,-81.748764,246.219368,
+ 0.974201,-0.205879,-0.092452,55.792031,-72.124323,232.241173,
+ 0.974201,-0.205879,-0.092452,57.245158,-68.528088,239.544991,
+ 0.974201,-0.205879,-0.092452,56.078123,-76.642663,245.317648,
+ 0.969334,-0.224951,-0.098935,55.792031,-72.124323,232.241173,
+ 0.969334,-0.224951,-0.098935,56.078123,-76.642663,245.317648,
+ 0.969334,-0.224951,-0.098935,55.247865,-76.938065,237.854721,
+ 0.962482,-0.253399,-0.097047,55.247865,-76.938065,237.854721,
+ 0.962482,-0.253399,-0.097047,56.078123,-76.642663,245.317648,
+ 0.962482,-0.253399,-0.097047,53.432497,-86.257369,244.184108,
+ 0.953997,-0.24157,-0.17758,53.432497,-86.257369,244.184108,
+ 0.953997,-0.24157,-0.17758,56.078123,-76.642663,245.317648,
+ 0.953997,-0.24157,-0.17758,54.95301,-81.748764,246.219368,
+ 0.956569,-0.26056,-0.130708,54.060538,-75.353056,226.005792,
+ 0.956569,-0.26056,-0.130708,55.792031,-72.124323,232.241173,
+ 0.956569,-0.26056,-0.130708,55.247865,-76.938065,237.854721,
+ 0.952218,-0.275305,-0.132244,54.060538,-75.353056,226.005792,
+ 0.952218,-0.275305,-0.132244,55.247865,-76.938065,237.854721,
+ 0.952218,-0.275305,-0.132244,53.432497,-86.257369,244.184108,
+ 0.411439,-0.791893,0.451248,47.684665,-89.148717,214.624151,
+ 0.411439,-0.791893,0.451248,41.854815,-95.141936,209.42222,
+ 0.411439,-0.791893,0.451248,45.037305,-94.403583,207.816219,
+ 0.906449,-0.42144,-0.027187,45.037305,-94.403583,207.816219,
+ 0.906449,-0.42144,-0.027187,48.506193,-87.18647,211.597119,
+ 0.906449,-0.42144,-0.027187,47.684665,-89.148717,214.624151,
+ 0.481278,-0.482187,0.73203,45.037305,-94.403583,207.816219,
+ 0.481278,-0.482187,0.73203,41.854815,-95.141936,209.42222,
+ 0.481278,-0.482187,0.73203,38.029802,-102.413505,207.14723,
+ 0.665931,-0.617548,0.418534,41.31725,-101.295481,203.566206,
+ 0.665931,-0.617548,0.418534,45.037305,-94.403583,207.816219,
+ 0.665931,-0.617548,0.418534,38.029802,-102.413505,207.14723,
+ 0.716275,-0.478124,0.508279,41.31725,-101.295481,203.566206,
+ 0.716275,-0.478124,0.508279,38.029802,-102.413505,207.14723,
+ 0.716275,-0.478124,0.508279,36.094936,-108.789439,203.87621,
+ 0.7874,-0.536129,0.304248,37.718581,-108.407333,200.347512,
+ 0.7874,-0.536129,0.304248,41.31725,-101.295481,203.566206,
+ 0.7874,-0.536129,0.304248,36.094936,-108.789439,203.87621,
+ 0.893192,-0.4457,0.059656,32.701313,-118.283063,196.190591,
+ 0.893192,-0.4457,0.059656,32.384616,-118.321395,200.645956,
+ 0.893192,-0.4457,0.059656,26.883023,-129.810123,197.183579,
+ 0.880871,-0.455664,-0.128202,26.859294,-128.573451,192.625082,
+ 0.880871,-0.455664,-0.128202,32.701313,-118.283063,196.190591,
+ 0.880871,-0.455664,-0.128202,26.883023,-129.810123,197.183579,
+ 0.881033,-0.455374,-0.128124,26.859294,-128.573451,192.625082,
+ 0.881033,-0.455374,-0.128124,26.883023,-129.810123,197.183579,
+ 0.881033,-0.455374,-0.128124,22.138645,-138.383773,195.031497,
+ 0.81439,-0.474002,-0.3348,22.047682,-135.79817,191.149594,
+ 0.81439,-0.474002,-0.3348,26.859294,-128.573451,192.625082,
+ 0.81439,-0.474002,-0.3348,22.138645,-138.383773,195.031497,
+ 0.790438,-0.530485,0.306257,32.701313,-118.283063,196.190591,
+ 0.790438,-0.530485,0.306257,37.718581,-108.407333,200.347512,
+ 0.790438,-0.530485,0.306257,36.094936,-108.789439,203.87621,
+ 0.922759,-0.380304,0.06232,32.701313,-118.283063,196.190591,
+ 0.922759,-0.380304,0.06232,36.094936,-108.789439,203.87621,
+ 0.922759,-0.380304,0.06232,32.384616,-118.321395,200.645956,
+ 0.880079,-0.250874,-0.403143,64.600755,-50.613534,258.413592,
+ 0.880079,-0.250874,-0.403143,68.063618,-42.116549,260.685539,
+ 0.880079,-0.250874,-0.403143,69.207167,-46.924206,266.173746,
+ 0.904636,-0.404534,0.13411,66.056225,-48.341587,255.448926,
+ 0.904636,-0.404534,0.13411,68.063618,-42.116549,260.685539,
+ 0.904636,-0.404534,0.13411,64.600755,-50.613534,258.413592,
+ 0.833843,-0.551836,-0.013529,60.105049,-57.223112,250.92511,
+ 0.833843,-0.551836,-0.013529,66.056225,-48.341587,255.448926,
+ 0.833843,-0.551836,-0.013529,64.600755,-50.613534,258.413592,
+ 0.808164,-0.583236,0.081899,60.806286,-56.465593,249.400034,
+ 0.808164,-0.583236,0.081899,66.056225,-48.341587,255.448926,
+ 0.808164,-0.583236,0.081899,60.105049,-57.223112,250.92511,
+ 0.983507,-0.171376,-0.057837,59.217262,-54.03119,215.628396,
+ 0.983507,-0.171376,-0.057837,60.663727,-46.045606,216.563277,
+ 0.983507,-0.171376,-0.057837,61.756957,-45.201079,232.650964,
+ 0.991128,-0.078984,-0.106901,59.217262,-54.03119,215.628396,
+ 0.991128,-0.078984,-0.106901,61.756957,-45.201079,232.650964,
+ 0.991128,-0.078984,-0.106901,61.36542,-51.06622,233.35433,
+ 0.751293,-0.655985,-0.072406,20.911404,-131.671063,168.383454,
+ 0.751293,-0.655985,-0.072406,27.737589,-125.482836,183.148494,
+ 0.751293,-0.655985,-0.072406,20.658289,-133.250596,180.067311,
+ 0.786074,-0.60856,-0.108362,20.911404,-131.671063,168.383454,
+ 0.786074,-0.60856,-0.108362,27.931684,-123.317063,172.393556,
+ 0.786074,-0.60856,-0.108362,27.737589,-125.482836,183.148494,
+ 0.244657,-0.962639,-0.116058,7.385286,-141.978183,176.607367,
+ 0.244657,-0.962639,-0.116058,0.020624,-143.831517,176.454647,
+ 0.244657,-0.962639,-0.116058,0.020624,-142.564727,165.947286,
+ 0.166049,-0.984256,-0.060561,7.876304,-141.25565,166.210805,
+ 0.166049,-0.984256,-0.060561,7.385286,-141.978183,176.607367,
+ 0.166049,-0.984256,-0.060561,0.020624,-142.564727,165.947286,
+ 0.210536,-0.955421,-0.206992,8.860774,-144.308237,188.863044,
+ 0.210536,-0.955421,-0.206992,0.020624,-146.382134,189.444113,
+ 0.210536,-0.955421,-0.206992,7.385286,-141.978183,176.607367,
+ 0.243387,-0.951754,-0.186887,7.385286,-141.978183,176.607367,
+ 0.243387,-0.951754,-0.186887,0.020624,-146.382134,189.444113,
+ 0.243387,-0.951754,-0.186887,0.020624,-143.831517,176.454647,
+ 0.837418,-0.537748,-0.097764,27.737589,-125.482836,183.148494,
+ 0.837418,-0.537748,-0.097764,26.859294,-128.573451,192.625082,
+ 0.837418,-0.537748,-0.097764,22.047682,-135.79817,191.149594,
+ 0.763001,-0.602494,-0.234158,20.658289,-133.250596,180.067311,
+ 0.763001,-0.602494,-0.234158,27.737589,-125.482836,183.148494,
+ 0.763001,-0.602494,-0.234158,22.047682,-135.79817,191.149594,
+ 0.849255,-0.501262,0.16584,39.759622,-107.108599,193.820988,
+ 0.849255,-0.501262,0.16584,37.718581,-108.407333,200.347512,
+ 0.849255,-0.501262,0.16584,32.701313,-118.283063,196.190591,
+ 0.846109,-0.532964,0.00697,33.983619,-116.351847,188.198922,
+ 0.846109,-0.532964,0.00697,39.759622,-107.108599,193.820988,
+ 0.846109,-0.532964,0.00697,32.701313,-118.283063,196.190591,
+ 0.866698,-0.498485,0.018606,33.983619,-116.351847,188.198922,
+ 0.866698,-0.498485,0.018606,32.701313,-118.283063,196.190591,
+ 0.866698,-0.498485,0.018606,26.859294,-128.573451,192.625082,
+ 0.845076,-0.526432,-0.093364,27.737589,-125.482836,183.148494,
+ 0.845076,-0.526432,-0.093364,33.983619,-116.351847,188.198922,
+ 0.845076,-0.526432,-0.093364,26.859294,-128.573451,192.625082,
+ 0.940005,-0.334459,-0.06729,53.317409,-73.379857,210.182781,
+ 0.940005,-0.334459,-0.06729,51.130067,-80.851911,216.765891,
+ 0.940005,-0.334459,-0.06729,48.506193,-87.18647,211.597119,
+ 0.942191,-0.332542,-0.041145,49.999235,-82.115659,204.803486,
+ 0.942191,-0.332542,-0.041145,53.317409,-73.379857,210.182781,
+ 0.942191,-0.332542,-0.041145,48.506193,-87.18647,211.597119,
+ 0.915381,-0.39206,-0.091462,49.999235,-82.115659,204.803486,
+ 0.915381,-0.39206,-0.091462,48.506193,-87.18647,211.597119,
+ 0.915381,-0.39206,-0.091462,45.037305,-94.403583,207.816219,
+ 0.930278,-0.345216,0.124133,46.921367,-91.559086,201.607305,
+ 0.930278,-0.345216,0.124133,49.999235,-82.115659,204.803486,
+ 0.930278,-0.345216,0.124133,45.037305,-94.403583,207.816219,
+ 0.862013,-0.448732,0.235738,43.823755,-99.227668,198.336894,
+ 0.862013,-0.448732,0.235738,46.921367,-91.559086,201.607305,
+ 0.862013,-0.448732,0.235738,41.31725,-101.295481,203.566206,
+ 0.869351,-0.492726,0.038067,46.921367,-91.559086,201.607305,
+ 0.869351,-0.492726,0.038067,45.037305,-94.403583,207.816219,
+ 0.869351,-0.492726,0.038067,41.31725,-101.295481,203.566206,
+ 0.835626,-0.512406,0.197911,43.823755,-99.227668,198.336894,
+ 0.835626,-0.512406,0.197911,41.31725,-101.295481,203.566206,
+ 0.835626,-0.512406,0.197911,37.718581,-108.407333,200.347512,
+ 0.837809,-0.522597,0.158015,39.759622,-107.108599,193.820988,
+ 0.837809,-0.522597,0.158015,43.823755,-99.227668,198.336894,
+ 0.837809,-0.522597,0.158015,37.718581,-108.407333,200.347512,
+ 0.941708,-0.312912,-0.123581,57.475639,-63.383959,221.723226,
+ 0.941708,-0.312912,-0.123581,54.060538,-75.353056,226.005792,
+ 0.941708,-0.312912,-0.123581,53.067215,-76.830369,222.177129,
+ 0.948582,-0.31266,-0.049359,55.577461,-67.918726,213.969156,
+ 0.948582,-0.31266,-0.049359,57.475639,-63.383959,221.723226,
+ 0.948582,-0.31266,-0.049359,53.067215,-76.830369,222.177129,
+ 0.938973,-0.335292,-0.07687,53.317409,-73.379857,210.182781,
+ 0.938973,-0.335292,-0.07687,55.577461,-67.918726,213.969156,
+ 0.938973,-0.335292,-0.07687,53.067215,-76.830369,222.177129,
+ 0.935658,-0.343858,-0.079403,53.317409,-73.379857,210.182781,
+ 0.935658,-0.343858,-0.079403,53.067215,-76.830369,222.177129,
+ 0.935658,-0.343858,-0.079403,51.130067,-80.851911,216.765891,
+ 0.92685,-0.372198,-0.049171,47.684665,-89.148717,214.624151,
+ 0.92685,-0.372198,-0.049171,51.130067,-80.851911,216.765891,
+ 0.92685,-0.372198,-0.049171,49.461609,-85.675692,221.829704,
+ 0.923374,-0.383898,0.001743,48.506193,-87.18647,211.597119,
+ 0.923374,-0.383898,0.001743,51.130067,-80.851911,216.765891,
+ 0.923374,-0.383898,0.001743,47.684665,-89.148717,214.624151,
+ 0.917864,-0.368342,-0.147819,49.461609,-85.675692,221.829704,
+ 0.917864,-0.368342,-0.147819,53.067215,-76.830369,222.177129,
+ 0.917864,-0.368342,-0.147819,50.710024,-84.418941,226.449959,
+ 0.925464,-0.375184,-0.052472,51.130067,-80.851911,216.765891,
+ 0.925464,-0.375184,-0.052472,53.067215,-76.830369,222.177129,
+ 0.925464,-0.375184,-0.052472,49.461609,-85.675692,221.829704,
+ 0.922452,-0.349006,-0.165157,54.060538,-75.353056,226.005792,
+ 0.922452,-0.349006,-0.165157,51.641559,-85.98022,234.952116,
+ 0.922452,-0.349006,-0.165157,50.710024,-84.418941,226.449959,
+ 0.93092,-0.349274,-0.106752,53.067215,-76.830369,222.177129,
+ 0.93092,-0.349274,-0.106752,54.060538,-75.353056,226.005792,
+ 0.93092,-0.349274,-0.106752,50.710024,-84.418941,226.449959,
+ 0.978604,-0.087652,-0.186151,61.756957,-45.201079,232.650964,
+ 0.978604,-0.087652,-0.186151,64.659075,-46.011837,248.289311,
+ 0.978604,-0.087652,-0.186151,61.36542,-51.06622,233.35433,
+ 0.951262,-0.28708,-0.112629,61.36542,-51.06622,233.35433,
+ 0.951262,-0.28708,-0.112629,64.659075,-46.011837,248.289311,
+ 0.951262,-0.28708,-0.112629,61.627814,-54.450107,244.195668,
+ 0.970147,0.15081,-0.189926,61.756957,-45.201079,232.650964,
+ 0.970147,0.15081,-0.189926,61.603719,-42.34563,234.135578,
+ 0.970147,0.15081,-0.189926,64.604649,-41.755435,249.933035,
+ 0.980713,0.081198,-0.177788,61.756957,-45.201079,232.650964,
+ 0.980713,0.081198,-0.177788,64.604649,-41.755435,249.933035,
+ 0.980713,0.081198,-0.177788,64.659075,-46.011837,248.289311,
+ 0.997587,-0.055522,-0.041673,60.663727,-46.045606,216.563277,
+ 0.997587,-0.055522,-0.041673,60.902513,-42.676626,217.790822,
+ 0.997587,-0.055522,-0.041673,61.603719,-42.34563,234.135578,
+ 0.993237,0.090875,-0.072265,60.663727,-46.045606,216.563277,
+ 0.993237,0.090875,-0.072265,61.603719,-42.34563,234.135578,
+ 0.993237,0.090875,-0.072265,61.756957,-45.201079,232.650964,
+ 0.938236,-0.340534,0.061228,59.016261,-61.040519,246.377869,
+ 0.938236,-0.340534,0.061228,60.105049,-57.223112,250.92511,
+ 0.938236,-0.340534,0.061228,58.134649,-62.972039,249.14479,
+ 0.87244,-0.456552,0.174379,59.016261,-61.040519,246.377869,
+ 0.87244,-0.456552,0.174379,60.806286,-56.465593,249.400034,
+ 0.87244,-0.456552,0.174379,60.105049,-57.223112,250.92511,
+ 0.984029,-0.175074,-0.032187,56.832113,-69.856027,246.767276,
+ 0.984029,-0.175074,-0.032187,58.134649,-62.972039,249.14479,
+ 0.984029,-0.175074,-0.032187,56.997702,-69.439544,249.564315,
+ 0.961925,-0.231942,0.144581,59.016261,-61.040519,246.377869,
+ 0.961925,-0.231942,0.144581,58.134649,-62.972039,249.14479,
+ 0.961925,-0.231942,0.144581,56.832113,-69.856027,246.767276,
+ -0.789843,0.589048,-0.170796,48.638926,-65.900198,195.132499,
+ -0.789843,0.589048,-0.170796,44.636034,-70.434357,198.006202,
+ -0.789843,0.589048,-0.170796,44.627211,-68.539952,204.58049,
+ -0.874642,0.411388,-0.256441,48.638926,-65.900198,195.132499,
+ -0.874642,0.411388,-0.256441,44.627211,-68.539952,204.58049,
+ -0.874642,0.411388,-0.256441,48.076415,-63.434764,201.006158,
+ -0.802097,0.573558,-0.166349,44.636034,-70.434357,198.006202,
+ -0.802097,0.573558,-0.166349,39.885266,-76.087149,201.422945,
+ -0.802097,0.573558,-0.166349,44.627211,-68.539952,204.58049,
+ -0.806816,0.553992,-0.205281,36.052344,-83.119903,197.508187,
+ -0.806816,0.553992,-0.205281,39.885266,-76.087149,201.422945,
+ -0.806816,0.553992,-0.205281,44.636034,-70.434357,198.006202,
+ -0.792355,0.546771,-0.270583,40.197401,-78.898486,193.900391,
+ -0.792355,0.546771,-0.270583,36.052344,-83.119903,197.508187,
+ -0.792355,0.546771,-0.270583,44.636034,-70.434357,198.006202,
+ -0.907974,0.416719,0.043915,54.812246,-45.734385,210.974068,
+ -0.907974,0.416719,0.043915,55.015894,-46.231791,219.904573,
+ -0.907974,0.416719,0.043915,55.642079,-44.297837,214.499724,
+ -0.902348,0.428709,0.044455,54.812246,-45.734385,210.974068,
+ -0.902348,0.428709,0.044455,52.828916,-49.930551,211.182766,
+ -0.902348,0.428709,0.044455,55.015894,-46.231791,219.904573,
+ -0.893008,0.413215,-0.178299,54.177086,-51.054355,201.826043,
+ -0.893008,0.413215,-0.178299,52.828916,-49.930551,211.182766,
+ -0.893008,0.413215,-0.178299,54.812246,-45.734385,210.974068,
+ -0.786874,0.555643,-0.268496,54.177086,-51.054355,201.826043,
+ -0.786874,0.555643,-0.268496,54.812246,-45.734385,210.974068,
+ -0.786874,0.555643,-0.268496,56.183902,-44.873734,208.735281,
+ -0.694012,0.708939,-0.125512,57.134116,-42.988456,213.645462,
+ -0.694012,0.708939,-0.125512,54.812246,-45.734385,210.974068,
+ -0.694012,0.708939,-0.125512,55.642079,-44.297837,214.499724,
+ -0.68284,0.716448,-0.142939,57.134116,-42.988456,213.645462,
+ -0.68284,0.716448,-0.142939,56.183902,-44.873734,208.735281,
+ -0.68284,0.716448,-0.142939,54.812246,-45.734385,210.974068,
+ -0.866049,0.498756,-0.034646,57.134116,-42.988456,213.645462,
+ -0.866049,0.498756,-0.034646,55.015894,-46.231791,219.904573,
+ -0.866049,0.498756,-0.034646,57.224623,-42.4731,218.802064,
+ -0.57061,0.791959,0.217269,57.134116,-42.988456,213.645462,
+ -0.57061,0.791959,0.217269,55.642079,-44.297837,214.499724,
+ -0.57061,0.791959,0.217269,55.015894,-46.231791,219.904573,
+ 0.366639,0.921071,-0.131166,60.902513,-42.676626,217.790822,
+ 0.366639,0.921071,-0.131166,60.77702,-43.389728,212.432519,
+ 0.366639,0.921071,-0.131166,58.921434,-42.591139,212.853566,
+ 0.415342,0.897024,-0.151125,60.902513,-42.676626,217.790822,
+ 0.415342,0.897024,-0.151125,58.921434,-42.591139,212.853566,
+ 0.415342,0.897024,-0.151125,59.08462,-41.762736,218.21917,
+ -0.273056,0.951951,-0.138669,59.08462,-41.762736,218.21917,
+ -0.273056,0.951951,-0.138669,58.921434,-42.591139,212.853566,
+ -0.273056,0.951951,-0.138669,57.134116,-42.988456,213.645462,
+ -0.378736,0.921551,-0.085453,59.08462,-41.762736,218.21917,
+ -0.378736,0.921551,-0.085453,57.134116,-42.988456,213.645462,
+ -0.378736,0.921551,-0.085453,57.224623,-42.4731,218.802064,
+ -0.318863,0.902841,-0.288451,58.921434,-42.591139,212.853566,
+ -0.318863,0.902841,-0.288451,58.296527,-44.439606,207.758721,
+ -0.318863,0.902841,-0.288451,56.183902,-44.873734,208.735281,
+ -0.325988,0.901952,-0.283222,58.921434,-42.591139,212.853566,
+ -0.325988,0.901952,-0.283222,56.183902,-44.873734,208.735281,
+ -0.325988,0.901952,-0.283222,57.134116,-42.988456,213.645462,
+ 0.331991,0.867257,-0.371008,60.77702,-43.389728,212.432519,
+ 0.331991,0.867257,-0.371008,60.108487,-45.060223,207.929391,
+ 0.331991,0.867257,-0.371008,58.296527,-44.439606,207.758721,
+ 0.299517,0.88452,-0.357651,60.77702,-43.389728,212.432519,
+ 0.299517,0.88452,-0.357651,58.296527,-44.439606,207.758721,
+ 0.299517,0.88452,-0.357651,58.921434,-42.591139,212.853566,
+ -0.557405,0.692669,-0.457722,56.183902,-44.873734,208.735281,
+ -0.557405,0.692669,-0.457722,56.040156,-51.072913,199.529149,
+ -0.557405,0.692669,-0.457722,54.177086,-51.054355,201.826043,
+ -0.392811,0.765629,-0.509422,58.296527,-44.439606,207.758721,
+ -0.392811,0.765629,-0.509422,56.040156,-51.072913,199.529149,
+ -0.392811,0.765629,-0.509422,56.183902,-44.873734,208.735281,
+ 0.083369,0.76457,-0.639127,58.573736,-51.242366,199.656923,
+ 0.083369,0.76457,-0.639127,56.040156,-51.072913,199.529149,
+ 0.083369,0.76457,-0.639127,58.296527,-44.439606,207.758721,
+ 0.30833,0.73369,-0.605501,60.108487,-45.060223,207.929391,
+ 0.30833,0.73369,-0.605501,58.573736,-51.242366,199.656923,
+ 0.30833,0.73369,-0.605501,58.296527,-44.439606,207.758721,
+ 0.983007,-0.153327,-0.100939,59.364294,-49.332446,207.701527,
+ 0.983007,-0.153327,-0.100939,60.77702,-43.389728,212.432519,
+ 0.983007,-0.153327,-0.100939,59.96754,-48.096382,211.69873,
+ 0.982429,-0.166651,-0.08403,59.364294,-49.332446,207.701527,
+ 0.982429,-0.166651,-0.08403,60.108487,-45.060223,207.929391,
+ 0.982429,-0.166651,-0.08403,60.77702,-43.389728,212.432519,
+ 0.984086,-0.168396,-0.056728,58.573736,-51.242366,199.656923,
+ 0.984086,-0.168396,-0.056728,60.108487,-45.060223,207.929391,
+ 0.984086,-0.168396,-0.056728,59.364294,-49.332446,207.701527,
+ 0.977422,-0.205967,-0.047153,58.573736,-51.242366,199.656923,
+ 0.977422,-0.205967,-0.047153,59.364294,-49.332446,207.701527,
+ 0.977422,-0.205967,-0.047153,57.636026,-56.318653,202.392812,
+ 0.984671,-0.157748,-0.074418,59.96754,-48.096382,211.69873,
+ 0.984671,-0.157748,-0.074418,60.77702,-43.389728,212.432519,
+ 0.984671,-0.157748,-0.074418,60.663727,-46.045606,216.563277,
+ 0.997753,-0.065374,-0.014667,60.77702,-43.389728,212.432519,
+ 0.997753,-0.065374,-0.014667,60.902513,-42.676626,217.790822,
+ 0.997753,-0.065374,-0.014667,60.663727,-46.045606,216.563277,
+ 0.971625,-0.212438,-0.103998,56.838502,-59.948658,205.491946,
+ 0.971625,-0.212438,-0.103998,58.565735,-53.343339,208.136263,
+ 0.971625,-0.212438,-0.103998,59.217262,-54.03119,215.628396,
+ 0.982404,-0.157794,-0.099918,58.565735,-53.343339,208.136263,
+ 0.982404,-0.157794,-0.099918,59.126086,-52.380773,212.125557,
+ 0.982404,-0.157794,-0.099918,59.217262,-54.03119,215.628396,
+ 0.971712,-0.202887,-0.120886,59.96754,-48.096382,211.69873,
+ 0.971712,-0.202887,-0.120886,59.217262,-54.03119,215.628396,
+ 0.971712,-0.202887,-0.120886,59.126086,-52.380773,212.125557,
+ 0.983027,-0.169979,-0.069026,59.96754,-48.096382,211.69873,
+ 0.983027,-0.169979,-0.069026,60.663727,-46.045606,216.563277,
+ 0.983027,-0.169979,-0.069026,59.217262,-54.03119,215.628396,
+ 0.976027,-0.200199,-0.085391,59.364294,-49.332446,207.701527,
+ 0.976027,-0.200199,-0.085391,59.96754,-48.096382,211.69873,
+ 0.976027,-0.200199,-0.085391,59.126086,-52.380773,212.125557,
+ 0.975095,-0.203658,-0.087825,59.364294,-49.332446,207.701527,
+ 0.975095,-0.203658,-0.087825,59.126086,-52.380773,212.125557,
+ 0.975095,-0.203658,-0.087825,58.565735,-53.343339,208.136263,
+ 0.978153,-0.200644,-0.054396,57.636026,-56.318653,202.392812,
+ 0.978153,-0.200644,-0.054396,59.364294,-49.332446,207.701527,
+ 0.978153,-0.200644,-0.054396,58.565735,-53.343339,208.136263,
+ 0.970056,-0.240721,-0.032324,57.636026,-56.318653,202.392812,
+ 0.970056,-0.240721,-0.032324,58.565735,-53.343339,208.136263,
+ 0.970056,-0.240721,-0.032324,56.838502,-59.948658,205.491946,
+ 0.098347,0.364097,0.926154,60.090933,-42.650767,275.917138,
+ 0.098347,0.364097,0.926154,59.975845,-44.340733,276.593733,
+ 0.098347,0.364097,0.926154,64.125313,-44.705498,276.296506,
+ -0.175032,0.643896,0.744823,55.986217,-40.875314,274.282237,
+ -0.175032,0.643896,0.744823,52.832324,-41.647131,274.20831,
+ -0.175032,0.643896,0.744823,54.824384,-42.21238,275.165096,
+ -0.200384,0.759566,0.618794,55.986217,-40.875314,274.282237,
+ -0.200384,0.759566,0.618794,54.40346,-40.54736,273.36713,
+ -0.200384,0.759566,0.618794,52.832324,-41.647131,274.20831,
+ -0.024797,0.565761,0.824196,55.986217,-40.875314,274.282237,
+ -0.024797,0.565761,0.824196,54.824384,-42.21238,275.165096,
+ -0.024797,0.565761,0.824196,62.160876,-41.511447,274.90468,
+ -0.042293,0.705507,0.70744,62.160876,-41.511447,274.90468,
+ -0.042293,0.705507,0.70744,54.824384,-42.21238,275.165096,
+ -0.042293,0.705507,0.70744,60.090933,-42.650767,275.917138,
+ -0.24371,0.888823,0.388071,55.121459,-39.62769,271.020648,
+ -0.24371,0.888823,0.388071,52.495426,-41.096485,272.73556,
+ -0.24371,0.888823,0.388071,52.832324,-41.647131,274.20831,
+ -0.497403,0.848559,0.18038,55.121459,-39.62769,271.020648,
+ -0.497403,0.848559,0.18038,52.832324,-41.647131,274.20831,
+ -0.497403,0.848559,0.18038,54.40346,-40.54736,273.36713,
+ 0.04068,0.925981,0.375373,62.160876,-41.511447,274.90468,
+ 0.04068,0.925981,0.375373,55.121459,-39.62769,271.020648,
+ 0.04068,0.925981,0.375373,54.40346,-40.54736,273.36713,
+ 0.078913,0.973957,0.212557,62.160876,-41.511447,274.90468,
+ 0.078913,0.973957,0.212557,54.40346,-40.54736,273.36713,
+ 0.078913,0.973957,0.212557,55.986217,-40.875314,274.282237,
+ -0.864723,0.497607,-0.068132,20.310257,-111.18125,179.978173,
+ -0.864723,0.497607,-0.068132,14.179528,-121.098051,185.36051,
+ -0.864723,0.497607,-0.068132,19.813763,-111.261566,185.693027,
+ -0.820268,0.562724,0.102479,14.239765,-119.520952,177.182656,
+ -0.820268,0.562724,0.102479,14.179528,-121.098051,185.36051,
+ -0.820268,0.562724,0.102479,20.310257,-111.18125,179.978173,
+ -0.92893,0.370183,0.007376,19.813763,-111.261566,185.693027,
+ -0.92893,0.370183,0.007376,15.177384,-123.03596,192.716654,
+ -0.92893,0.370183,0.007376,19.93241,-111.102761,192.66524,
+ -0.845805,0.476348,0.240222,14.179528,-121.098051,185.36051,
+ -0.845805,0.476348,0.240222,15.177384,-123.03596,192.716654,
+ -0.845805,0.476348,0.240222,19.813763,-111.261566,185.693027,
+ -0.949902,0.28316,0.132314,19.93241,-111.102761,192.66524,
+ -0.949902,0.28316,0.132314,16.432918,-124.47129,196.151346,
+ -0.949902,0.28316,0.132314,20.506177,-111.689609,198.040275,
+ -0.831969,0.333426,0.443458,19.93241,-111.102761,192.66524,
+ -0.831969,0.333426,0.443458,15.177384,-123.03596,192.716654,
+ -0.831969,0.333426,0.443458,16.432918,-124.47129,196.151346,
+ -0.940571,0.331436,0.073999,20.506177,-111.689609,198.040275,
+ -0.940571,0.331436,0.073999,24.254829,-102.176515,203.079447,
+ -0.940571,0.331436,0.073999,24.439798,-100.618886,198.45402,
+ -0.935176,0.327218,0.135553,19.93241,-111.102761,192.66524,
+ -0.935176,0.327218,0.135553,20.506177,-111.689609,198.040275,
+ -0.935176,0.327218,0.135553,24.439798,-100.618886,198.45402,
+ -0.89572,0.435246,-0.090815,25.43887,-99.948984,191.810674,
+ -0.89572,0.435246,-0.090815,19.93241,-111.102761,192.66524,
+ -0.89572,0.435246,-0.090815,24.439798,-100.618886,198.45402,
+ -0.896511,0.442991,0.005166,19.813763,-111.261566,185.693027,
+ -0.896511,0.442991,0.005166,19.93241,-111.102761,192.66524,
+ -0.896511,0.442991,0.005166,25.43887,-99.948984,191.810674,
+ -0.811141,0.533241,-0.240219,27.18816,-100.95262,183.676019,
+ -0.811141,0.533241,-0.240219,19.813763,-111.261566,185.693027,
+ -0.811141,0.533241,-0.240219,25.43887,-99.948984,191.810674,
+ -0.817503,0.57247,-0.062978,20.310257,-111.18125,179.978173,
+ -0.817503,0.57247,-0.062978,19.813763,-111.261566,185.693027,
+ -0.817503,0.57247,-0.062978,27.18816,-100.95262,183.676019,
+ -0.768428,0.566141,-0.298334,30.829725,-94.57334,188.126517,
+ -0.768428,0.566141,-0.298334,25.43887,-99.948984,191.810674,
+ -0.768428,0.566141,-0.298334,27.436711,-94.727582,196.573305,
+ -0.762558,0.601474,-0.23819,27.18816,-100.95262,183.676019,
+ -0.762558,0.601474,-0.23819,25.43887,-99.948984,191.810674,
+ -0.762558,0.601474,-0.23819,30.829725,-94.57334,188.126517,
+ -0.899787,0.410587,-0.147651,27.436711,-94.727582,196.573305,
+ -0.899787,0.410587,-0.147651,24.439798,-100.618886,198.45402,
+ -0.899787,0.410587,-0.147651,26.369188,-94.951187,202.457004,
+ -0.899088,0.42798,-0.092054,25.43887,-99.948984,191.810674,
+ -0.899088,0.42798,-0.092054,24.439798,-100.618886,198.45402,
+ -0.899088,0.42798,-0.092054,27.436711,-94.727582,196.573305,
+ -0.947817,0.288965,0.134693,26.369188,-94.951187,202.457004,
+ -0.947817,0.288965,0.134693,24.254829,-102.176515,203.079447,
+ -0.947817,0.288965,0.134693,26.370709,-97.079236,207.033146,
+ -0.956801,0.284961,0.0577,24.439798,-100.618886,198.45402,
+ -0.956801,0.284961,0.0577,24.254829,-102.176515,203.079447,
+ -0.956801,0.284961,0.0577,26.369188,-94.951187,202.457004,
+ -0.937125,0.230889,0.261701,28.15316,-89.287443,206.54152,
+ -0.937125,0.230889,0.261701,26.370709,-97.079236,207.033146,
+ -0.937125,0.230889,0.261701,28.454038,-92.707228,210.636075,
+ -0.967805,0.228108,0.106399,26.369188,-94.951187,202.457004,
+ -0.967805,0.228108,0.106399,26.370709,-97.079236,207.033146,
+ -0.967805,0.228108,0.106399,28.15316,-89.287443,206.54152,
+ -0.867195,0.440554,-0.232129,29.929221,-89.212299,200.049068,
+ -0.867195,0.440554,-0.232129,26.369188,-94.951187,202.457004,
+ -0.867195,0.440554,-0.232129,28.15316,-89.287443,206.54152,
+ -0.866598,0.479251,-0.13902,27.436711,-94.727582,196.573305,
+ -0.866598,0.479251,-0.13902,26.369188,-94.951187,202.457004,
+ -0.866598,0.479251,-0.13902,29.929221,-89.212299,200.049068,
+ -0.746124,0.562092,-0.356864,33.48317,-89.269189,192.528947,
+ -0.746124,0.562092,-0.356864,27.436711,-94.727582,196.573305,
+ -0.746124,0.562092,-0.356864,29.929221,-89.212299,200.049068,
+ -0.74045,0.608069,-0.28633,30.829725,-94.57334,188.126517,
+ -0.74045,0.608069,-0.28633,27.436711,-94.727582,196.573305,
+ -0.74045,0.608069,-0.28633,33.48317,-89.269189,192.528947,
+ -0.726512,0.570321,-0.383294,36.052344,-83.119903,197.508187,
+ -0.726512,0.570321,-0.383294,29.929221,-89.212299,200.049068,
+ -0.726512,0.570321,-0.383294,33.610031,-82.775521,202.649882,
+ -0.729749,0.587743,-0.34932,33.48317,-89.269189,192.528947,
+ -0.729749,0.587743,-0.34932,29.929221,-89.212299,200.049068,
+ -0.729749,0.587743,-0.34932,36.052344,-83.119903,197.508187,
+ -0.809112,0.457906,-0.368321,33.610031,-82.775521,202.649882,
+ -0.809112,0.457906,-0.368321,28.15316,-89.287443,206.54152,
+ -0.809112,0.457906,-0.368321,30.866232,-82.380942,209.167888,
+ -0.80795,0.548757,-0.21467,29.929221,-89.212299,200.049068,
+ -0.80795,0.548757,-0.21467,28.15316,-89.287443,206.54152,
+ -0.80795,0.548757,-0.21467,33.610031,-82.775521,202.649882,
+ -0.961164,0.197054,-0.193219,30.866232,-82.380942,209.167888,
+ -0.961164,0.197054,-0.193219,28.454038,-92.707228,210.636075,
+ -0.961164,0.197054,-0.193219,29.702878,-84.334367,212.962782,
+ -0.924667,0.256068,0.281816,28.15316,-89.287443,206.54152,
+ -0.924667,0.256068,0.281816,28.454038,-92.707228,210.636075,
+ -0.924667,0.256068,0.281816,30.866232,-82.380942,209.167888,
+ -0.850128,0.518453,0.092139,29.702878,-84.334367,212.962782,
+ -0.850128,0.518453,0.092139,33.301244,-78.994926,216.11911,
+ -0.850128,0.518453,0.092139,33.940115,-77.457072,213.360404,
+ -0.851572,0.524164,0.008758,30.866232,-82.380942,209.167888,
+ -0.851572,0.524164,0.008758,29.702878,-84.334367,212.962782,
+ -0.851572,0.524164,0.008758,33.940115,-77.457072,213.360404,
+ -0.699122,0.663443,-0.266592,37.335562,-77.325647,204.783103,
+ -0.699122,0.663443,-0.266592,30.866232,-82.380942,209.167888,
+ -0.699122,0.663443,-0.266592,33.940115,-77.457072,213.360404,
+ -0.710784,0.617646,-0.3366,33.610031,-82.775521,202.649882,
+ -0.710784,0.617646,-0.3366,30.866232,-82.380942,209.167888,
+ -0.710784,0.617646,-0.3366,37.335562,-77.325647,204.783103,
+ -0.719703,0.616769,-0.318784,39.885266,-76.087149,201.422945,
+ -0.719703,0.616769,-0.318784,33.610031,-82.775521,202.649882,
+ -0.719703,0.616769,-0.318784,37.335562,-77.325647,204.783103,
+ -0.709027,0.596125,-0.376716,36.052344,-83.119903,197.508187,
+ -0.709027,0.596125,-0.376716,33.610031,-82.775521,202.649882,
+ -0.709027,0.596125,-0.376716,39.885266,-76.087149,201.422945,
+ -0.748234,0.61527,-0.24817,44.627211,-68.539952,204.58049,
+ -0.748234,0.61527,-0.24817,37.335562,-77.325647,204.783103,
+ -0.748234,0.61527,-0.24817,40.916891,-69.902269,212.389624,
+ -0.729308,0.597603,-0.333136,39.885266,-76.087149,201.422945,
+ -0.729308,0.597603,-0.333136,37.335562,-77.325647,204.783103,
+ -0.729308,0.597603,-0.333136,44.627211,-68.539952,204.58049,
+ -0.24787,-0.846527,-0.471118,60.89439,-46.925423,274.40849,
+ -0.24787,-0.846527,-0.471118,55.118661,-44.749002,273.536583,
+ -0.24787,-0.846527,-0.471118,55.912108,-43.919078,271.62788,
+ -0.470821,-0.876121,-0.103631,61.11188,-46.799474,272.355584,
+ -0.470821,-0.876121,-0.103631,60.89439,-46.925423,274.40849,
+ -0.470821,-0.876121,-0.103631,55.912108,-43.919078,271.62788,
+ -0.381588,-0.804047,-0.455959,61.11188,-46.799474,272.355584,
+ -0.381588,-0.804047,-0.455959,55.912108,-43.919078,271.62788,
+ -0.381588,-0.804047,-0.455959,58.628375,-43.072726,267.862191,
+ -0.508918,-0.779497,-0.365222,62.349191,-45.493135,267.843329,
+ -0.508918,-0.779497,-0.365222,61.11188,-46.799474,272.355584,
+ -0.508918,-0.779497,-0.365222,58.628375,-43.072726,267.862191,
+ -0.471454,-0.816605,-0.332997,55.912108,-43.919078,271.62788,
+ -0.471454,-0.816605,-0.332997,53.022768,-41.389757,269.515954,
+ -0.471454,-0.816605,-0.332997,55.831063,-41.108045,264.849153,
+ -0.232934,-0.899299,-0.37014,58.628375,-43.072726,267.862191,
+ -0.232934,-0.899299,-0.37014,55.912108,-43.919078,271.62788,
+ -0.232934,-0.899299,-0.37014,55.831063,-41.108045,264.849153,
+ -0.234496,-0.802669,-0.548392,55.118661,-44.749002,273.536583,
+ -0.234496,-0.802669,-0.548392,52.174134,-42.577449,271.617232,
+ -0.234496,-0.802669,-0.548392,53.022768,-41.389757,269.515954,
+ -0.342591,-0.801121,-0.490751,55.912108,-43.919078,271.62788,
+ -0.342591,-0.801121,-0.490751,55.118661,-44.749002,273.536583,
+ -0.342591,-0.801121,-0.490751,53.022768,-41.389757,269.515954,
+ -0.268815,-0.953347,-0.13736,54.491989,-43.793129,275.518605,
+ -0.268815,-0.953347,-0.13736,51.145248,-42.621561,273.936942,
+ -0.268815,-0.953347,-0.13736,52.174134,-42.577449,271.617232,
+ -0.649451,-0.744688,0.1538,55.118661,-44.749002,273.536583,
+ -0.649451,-0.744688,0.1538,54.491989,-43.793129,275.518605,
+ -0.649451,-0.744688,0.1538,52.174134,-42.577449,271.617232,
+ -0.524681,-0.772607,0.357476,66.093188,-47.92267,268.087621,
+ -0.524681,-0.772607,0.357476,62.349191,-45.493135,267.843329,
+ -0.524681,-0.772607,0.357476,62.053667,-49.302023,259.177499,
+ -0.871634,-0.437085,0.221836,60.473161,-46.237572,259.005308,
+ -0.871634,-0.437085,0.221836,62.053667,-49.302023,259.177499,
+ -0.871634,-0.437085,0.221836,62.349191,-45.493135,267.843329,
+ -0.54499,-0.837482,-0.040119,62.349191,-45.493135,267.843329,
+ -0.54499,-0.837482,-0.040119,58.628375,-43.072726,267.862191,
+ -0.54499,-0.837482,-0.040119,55.831063,-41.108045,264.849153,
+ -0.607343,-0.770435,0.193814,62.349191,-45.493135,267.843329,
+ -0.607343,-0.770435,0.193814,55.831063,-41.108045,264.849153,
+ -0.607343,-0.770435,0.193814,60.473161,-46.237572,259.005308,
+ -0.773043,-0.369737,0.51546,57.7422,-55.050646,248.588059,
+ -0.773043,-0.369737,0.51546,62.053667,-49.302023,259.177499,
+ -0.773043,-0.369737,0.51546,60.473161,-46.237572,259.005308,
+ -0.970183,0.014672,0.241928,57.7422,-55.050646,248.588059,
+ -0.970183,0.014672,0.241928,60.473161,-46.237572,259.005308,
+ -0.970183,0.014672,0.241928,58.641304,-50.246031,251.902279,
+ -0.942577,-0.051268,0.330032,57.7422,-55.050646,248.588059,
+ -0.942577,-0.051268,0.330032,58.641304,-50.246031,251.902279,
+ -0.942577,-0.051268,0.330032,57.8279,-48.575231,249.838725,
+ -0.887521,-0.076027,0.454452,55.939367,-54.5648,245.148499,
+ -0.887521,-0.076027,0.454452,57.7422,-55.050646,248.588059,
+ -0.887521,-0.076027,0.454452,57.8279,-48.575231,249.838725,
+ -0.959237,0.275891,0.061221,56.880363,-51.012981,243.886272,
+ -0.959237,0.275891,0.061221,55.939367,-54.5648,245.148499,
+ -0.959237,0.275891,0.061221,60.09717,-41.324653,250.628492,
+ -0.954447,0.298362,0.003293,55.939367,-54.5648,245.148499,
+ -0.954447,0.298362,0.003293,57.8279,-48.575231,249.838725,
+ -0.954447,0.298362,0.003293,60.09717,-41.324653,250.628492,
+ -0.67555,-0.643922,0.359161,57.8279,-48.575231,249.838725,
+ -0.67555,-0.643922,0.359161,60.473161,-46.237572,259.005308,
+ -0.67555,-0.643922,0.359161,57.756985,-45.444763,255.317805,
+ -0.949863,-0.094211,0.298134,57.8279,-48.575231,249.838725,
+ -0.949863,-0.094211,0.298134,58.641304,-50.246031,251.902279,
+ -0.949863,-0.094211,0.298134,60.473161,-46.237572,259.005308,
+ -0.954777,0.145661,-0.259199,57.756985,-45.444763,255.317805,
+ -0.954777,0.145661,-0.259199,55.831063,-41.108045,264.849153,
+ -0.954777,0.145661,-0.259199,56.465614,-40.783134,262.694332,
+ -0.563229,-0.789076,0.245218,60.473161,-46.237572,259.005308,
+ -0.563229,-0.789076,0.245218,55.831063,-41.108045,264.849153,
+ -0.563229,-0.789076,0.245218,57.756985,-45.444763,255.317805,
+ -0.930803,0.312053,-0.190339,57.8279,-48.575231,249.838725,
+ -0.930803,0.312053,-0.190339,57.756985,-45.444763,255.317805,
+ -0.930803,0.312053,-0.190339,60.09717,-41.324653,250.628492,
+ -0.93545,0.264594,-0.234357,60.09717,-41.324653,250.628492,
+ -0.93545,0.264594,-0.234357,57.756985,-45.444763,255.317805,
+ -0.93545,0.264594,-0.234357,58.464854,-41.882905,256.513711,
+ -0.662278,0.740621,-0.113436,62.011867,-37.916732,261.700127,
+ -0.662278,0.740621,-0.113436,60.09717,-41.324653,250.628492,
+ -0.662278,0.740621,-0.113436,58.464854,-41.882905,256.513711,
+ -0.240757,0.843405,-0.480317,62.011867,-37.916732,261.700127,
+ -0.240757,0.843405,-0.480317,58.464854,-41.882905,256.513711,
+ -0.240757,0.843405,-0.480317,58.097412,-38.546781,262.55591,
+ -0.734543,0.508138,-0.449713,57.756985,-45.444763,255.317805,
+ -0.734543,0.508138,-0.449713,56.465614,-40.783134,262.694332,
+ -0.734543,0.508138,-0.449713,58.097412,-38.546781,262.55591,
+ -0.946517,0.254638,-0.198155,57.756985,-45.444763,255.317805,
+ -0.946517,0.254638,-0.198155,58.097412,-38.546781,262.55591,
+ -0.946517,0.254638,-0.198155,58.464854,-41.882905,256.513711,
+ -0.147523,0.987672,0.052359,62.011867,-37.916732,261.700127,
+ -0.147523,0.987672,0.052359,58.097412,-38.546781,262.55591,
+ -0.147523,0.987672,0.052359,61.283675,-38.522443,271.074191,
+ -0.044605,0.998909,0.01383,61.283675,-38.522443,271.074191,
+ -0.044605,0.998909,0.01383,58.097412,-38.546781,262.55591,
+ -0.044605,0.998909,0.01383,56.898616,-38.66482,267.215106,
+ -0.814808,0.545656,-0.195824,58.097412,-38.546781,262.55591,
+ -0.814808,0.545656,-0.195824,55.831063,-41.108045,264.849153,
+ -0.814808,0.545656,-0.195824,56.898616,-38.66482,267.215106,
+ -0.803116,0.576753,-0.149536,58.097412,-38.546781,262.55591,
+ -0.803116,0.576753,-0.149536,56.465614,-40.783134,262.694332,
+ -0.803116,0.576753,-0.149536,55.831063,-41.108045,264.849153,
+ -0.60548,0.791576,-0.082471,56.898616,-38.66482,267.215106,
+ -0.60548,0.791576,-0.082471,53.022768,-41.389757,269.515954,
+ -0.60548,0.791576,-0.082471,55.121459,-39.62769,271.020648,
+ -0.670617,0.646045,-0.364552,55.831063,-41.108045,264.849153,
+ -0.670617,0.646045,-0.364552,53.022768,-41.389757,269.515954,
+ -0.670617,0.646045,-0.364552,56.898616,-38.66482,267.215106,
+ -0.539764,0.599259,0.591222,62.160876,-41.511447,274.90468,
+ -0.539764,0.599259,0.591222,61.283675,-38.522443,271.074191,
+ -0.539764,0.599259,0.591222,56.898616,-38.66482,267.215106,
+ 0.097007,0.953166,0.28647,62.160876,-41.511447,274.90468,
+ 0.097007,0.953166,0.28647,56.898616,-38.66482,267.215106,
+ 0.097007,0.953166,0.28647,55.121459,-39.62769,271.020648,
+ -0.923452,0.337792,-0.182022,53.022768,-41.389757,269.515954,
+ -0.923452,0.337792,-0.182022,52.174134,-42.577449,271.617232,
+ -0.923452,0.337792,-0.182022,52.495426,-41.096485,272.73556,
+ -0.561666,0.810575,-0.165831,55.121459,-39.62769,271.020648,
+ -0.561666,0.810575,-0.165831,53.022768,-41.389757,269.515954,
+ -0.561666,0.810575,-0.165831,52.495426,-41.096485,272.73556,
+ -0.505669,0.763749,0.401232,52.832324,-41.647131,274.20831,
+ -0.505669,0.763749,0.401232,52.495426,-41.096485,272.73556,
+ -0.505669,0.763749,0.401232,51.145248,-42.621561,273.936942,
+ -0.820978,0.446668,-0.355643,52.174134,-42.577449,271.617232,
+ -0.820978,0.446668,-0.355643,51.145248,-42.621561,273.936942,
+ -0.820978,0.446668,-0.355643,52.495426,-41.096485,272.73556,
+ -0.352041,0.274163,0.894931,52.832324,-41.647131,274.20831,
+ -0.352041,0.274163,0.894931,54.491989,-43.793129,275.518605,
+ -0.352041,0.274163,0.894931,54.824384,-42.21238,275.165096,
+ -0.318897,0.301922,0.898414,52.832324,-41.647131,274.20831,
+ -0.318897,0.301922,0.898414,51.145248,-42.621561,273.936942,
+ -0.318897,0.301922,0.898414,54.491989,-43.793129,275.518605,
+ -0.100287,0.375684,0.921306,54.824384,-42.21238,275.165096,
+ -0.100287,0.375684,0.921306,59.975845,-44.340733,276.593733,
+ -0.100287,0.375684,0.921306,60.090933,-42.650767,275.917138,
+ -0.162508,0.247763,0.955094,54.824384,-42.21238,275.165096,
+ -0.162508,0.247763,0.955094,54.491989,-43.793129,275.518605,
+ -0.162508,0.247763,0.955094,59.975845,-44.340733,276.593733,
+ 0.161032,0.475826,0.864673,62.160876,-41.511447,274.90468,
+ 0.161032,0.475826,0.864673,60.090933,-42.650767,275.917138,
+ 0.161032,0.475826,0.864673,64.125313,-44.705498,276.296506,
+ 0.970241,-0.240082,-0.031527,54.752587,-67.739234,200.624356,
+ 0.970241,-0.240082,-0.031527,57.636026,-56.318653,202.392812,
+ 0.970241,-0.240082,-0.031527,56.838502,-59.948658,205.491946,
+ 0.969651,-0.244485,-0.00213,55.49237,-64.766354,196.166862,
+ 0.969651,-0.244485,-0.00213,57.636026,-56.318653,202.392812,
+ 0.969651,-0.244485,-0.00213,54.752587,-67.739234,200.624356,
+ 0.976517,-0.20886,-0.052832,55.49237,-64.766354,196.166862,
+ 0.976517,-0.20886,-0.052832,58.573736,-51.242366,199.656923,
+ 0.976517,-0.20886,-0.052832,57.636026,-56.318653,202.392812,
+ 0.967922,-0.173684,-0.181551,55.49237,-64.766354,196.166862,
+ 0.967922,-0.173684,-0.181551,56.752406,-58.171379,196.575435,
+ 0.967922,-0.173684,-0.181551,58.573736,-51.242366,199.656923,
+ 0.817013,0.111938,-0.565649,53.145431,-64.402502,192.848991,
+ 0.817013,0.111938,-0.565649,54.10605,-58.371254,195.43003,
+ 0.817013,0.111938,-0.565649,55.49237,-64.766354,196.166862,
+ 0.398367,-0.0193,-0.917023,56.752406,-58.171379,196.575435,
+ 0.398367,-0.0193,-0.917023,55.49237,-64.766354,196.166862,
+ 0.398367,-0.0193,-0.917023,54.10605,-58.371254,195.43003,
+ 0.360035,0.298458,-0.883911,58.573736,-51.242366,199.656923,
+ 0.360035,0.298458,-0.883911,56.752406,-58.171379,196.575435,
+ 0.360035,0.298458,-0.883911,54.10605,-58.371254,195.43003,
+ 0.075901,0.47292,-0.87783,56.040156,-51.072913,199.529149,
+ 0.075901,0.47292,-0.87783,58.573736,-51.242366,199.656923,
+ 0.075901,0.47292,-0.87783,54.10605,-58.371254,195.43003,
+ -0.882351,0.408909,-0.232918,52.000909,-57.802051,198.223722,
+ -0.882351,0.408909,-0.232918,51.213059,-56.30405,203.838182,
+ -0.882351,0.408909,-0.232918,54.177086,-51.054355,201.826043,
+ -0.884515,0.430729,-0.179179,54.177086,-51.054355,201.826043,
+ -0.884515,0.430729,-0.179179,51.213059,-56.30405,203.838182,
+ -0.884515,0.430729,-0.179179,52.828916,-49.930551,211.182766,
+ -0.640775,0.497987,-0.584309,54.10605,-58.371254,195.43003,
+ -0.640775,0.497987,-0.584309,52.000909,-57.802051,198.223722,
+ -0.640775,0.497987,-0.584309,56.040156,-51.072913,199.529149,
+ -0.667603,0.506581,-0.545603,52.000909,-57.802051,198.223722,
+ -0.667603,0.506581,-0.545603,54.177086,-51.054355,201.826043,
+ -0.667603,0.506581,-0.545603,56.040156,-51.072913,199.529149,
+ -0.763473,0.599877,-0.239283,28.93745,-100.349343,179.607019,
+ -0.763473,0.599877,-0.239283,20.310257,-111.18125,179.978173,
+ -0.763473,0.599877,-0.239283,27.18816,-100.95262,183.676019,
+ -0.77734,0.614509,-0.134615,22.695984,-109.317268,174.71065,
+ -0.77734,0.614509,-0.134615,20.310257,-111.18125,179.978173,
+ -0.77734,0.614509,-0.134615,28.93745,-100.349343,179.607019,
+ -0.592722,0.66255,-0.45794,32.484401,-98.750949,177.328683,
+ -0.592722,0.66255,-0.45794,22.695984,-109.317268,174.71065,
+ -0.592722,0.66255,-0.45794,28.93745,-100.349343,179.607019,
+ -0.571009,0.65243,-0.498281,32.484401,-98.750949,177.328683,
+ -0.571009,0.65243,-0.498281,26.175093,-108.385733,171.943456,
+ -0.571009,0.65243,-0.498281,22.695984,-109.317268,174.71065,
+ -0.100013,0.534551,-0.839198,32.484401,-98.750949,177.328683,
+ -0.100013,0.534551,-0.839198,37.556125,-99.971801,175.946592,
+ -0.100013,0.534551,-0.839198,26.175093,-108.385733,171.943456,
+ -0.129401,0.563294,-0.816061,37.556125,-99.971801,175.946592,
+ -0.129401,0.563294,-0.816061,30.328364,-110.686277,169.696912,
+ -0.129401,0.563294,-0.816061,26.175093,-108.385733,171.943456,
+ -0.097926,0.533762,-0.839946,37.469117,-90.034922,182.286323,
+ -0.097926,0.533762,-0.839946,43.107915,-90.258527,181.486821,
+ -0.097926,0.533762,-0.839946,32.484401,-98.750949,177.328683,
+ -0.099687,0.535364,-0.838718,43.107915,-90.258527,181.486821,
+ -0.099687,0.535364,-0.838718,37.556125,-99.971801,175.946592,
+ -0.099687,0.535364,-0.838718,32.484401,-98.750949,177.328683,
+ -0.636399,0.638737,-0.432448,37.469117,-90.034922,182.286323,
+ -0.636399,0.638737,-0.432448,28.93745,-100.349343,179.607019,
+ -0.636399,0.638737,-0.432448,33.736893,-92.400875,184.284164,
+ -0.601121,0.626199,-0.496517,37.469117,-90.034922,182.286323,
+ -0.601121,0.626199,-0.496517,32.484401,-98.750949,177.328683,
+ -0.601121,0.626199,-0.496517,28.93745,-100.349343,179.607019,
+ -0.763027,0.601191,-0.237401,27.18816,-100.95262,183.676019,
+ -0.763027,0.601191,-0.237401,30.829725,-94.57334,188.126517,
+ -0.763027,0.601191,-0.237401,33.736893,-92.400875,184.284164,
+ -0.76271,0.601047,-0.238782,28.93745,-100.349343,179.607019,
+ -0.76271,0.601047,-0.238782,27.18816,-100.95262,183.676019,
+ -0.76271,0.601047,-0.238782,33.736893,-92.400875,184.284164,
+ -0.784942,0.577956,-0.223233,36.724376,-86.699102,187.78609,
+ -0.784942,0.577956,-0.223233,30.829725,-94.57334,188.126517,
+ -0.784942,0.577956,-0.223233,33.48317,-89.269189,192.528947,
+ -0.77726,0.570374,-0.265594,33.736893,-92.400875,184.284164,
+ -0.77726,0.570374,-0.265594,30.829725,-94.57334,188.126517,
+ -0.77726,0.570374,-0.265594,36.724376,-86.699102,187.78609,
+ -0.661801,0.612367,-0.432465,33.736893,-92.400875,184.284164,
+ -0.661801,0.612367,-0.432465,36.724376,-86.699102,187.78609,
+ -0.661801,0.612367,-0.432465,41.64277,-82.30945,186.475187,
+ -0.638338,0.603761,-0.47749,37.469117,-90.034922,182.286323,
+ -0.638338,0.603761,-0.47749,33.736893,-92.400875,184.284164,
+ -0.638338,0.603761,-0.47749,41.64277,-82.30945,186.475187,
+ -0.127704,0.525185,-0.841352,47.14558,-82.102577,185.769083,
+ -0.127704,0.525185,-0.841352,37.469117,-90.034922,182.286323,
+ -0.127704,0.525185,-0.841352,41.64277,-82.30945,186.475187,
+ -0.101922,0.501533,-0.859114,47.14558,-82.102577,185.769083,
+ -0.101922,0.501533,-0.859114,43.107915,-90.258527,181.486821,
+ -0.101922,0.501533,-0.859114,37.469117,-90.034922,182.286323,
+ -0.341685,0.587739,-0.733358,50.054238,-74.442209,188.861219,
+ -0.341685,0.587739,-0.733358,41.64277,-82.30945,186.475187,
+ -0.341685,0.587739,-0.733358,44.375617,-75.49665,190.661923,
+ -0.13116,0.413497,-0.901009,50.054238,-74.442209,188.861219,
+ -0.13116,0.413497,-0.901009,47.14558,-82.102577,185.769083,
+ -0.13116,0.413497,-0.901009,41.64277,-82.30945,186.475187,
+ -0.516325,0.539297,-0.665257,53.145431,-64.402502,192.848991,
+ -0.516325,0.539297,-0.665257,44.375617,-75.49665,190.661923,
+ -0.516325,0.539297,-0.665257,48.638926,-65.900198,195.132499,
+ -0.344591,0.436261,-0.831224,53.145431,-64.402502,192.848991,
+ -0.344591,0.436261,-0.831224,50.054238,-74.442209,188.861219,
+ -0.344591,0.436261,-0.831224,44.375617,-75.49665,190.661923,
+ -0.518164,0.484231,-0.705001,52.000909,-57.802051,198.223722,
+ -0.518164,0.484231,-0.705001,53.145431,-64.402502,192.848991,
+ -0.518164,0.484231,-0.705001,48.638926,-65.900198,195.132499,
+ -0.703604,0.371335,-0.605848,53.145431,-64.402502,192.848991,
+ -0.703604,0.371335,-0.605848,52.000909,-57.802051,198.223722,
+ -0.703604,0.371335,-0.605848,54.10605,-58.371254,195.43003,
+ -0.790556,0.554946,-0.258951,36.724376,-86.699102,187.78609,
+ -0.790556,0.554946,-0.258951,36.052344,-83.119903,197.508187,
+ -0.790556,0.554946,-0.258951,40.197401,-78.898486,193.900391,
+ -0.801543,0.541031,-0.254587,36.724376,-86.699102,187.78609,
+ -0.801543,0.541031,-0.254587,33.48317,-89.269189,192.528947,
+ -0.801543,0.541031,-0.254587,36.052344,-83.119903,197.508187,
+ -0.736898,0.588632,-0.332406,36.724376,-86.699102,187.78609,
+ -0.736898,0.588632,-0.332406,40.197401,-78.898486,193.900391,
+ -0.736898,0.588632,-0.332406,44.375617,-75.49665,190.661923,
+ -0.644948,0.570917,-0.508032,41.64277,-82.30945,186.475187,
+ -0.644948,0.570917,-0.508032,36.724376,-86.699102,187.78609,
+ -0.644948,0.570917,-0.508032,44.375617,-75.49665,190.661923,
+ -0.741151,0.564743,-0.362988,44.375617,-75.49665,190.661923,
+ -0.741151,0.564743,-0.362988,40.197401,-78.898486,193.900391,
+ -0.741151,0.564743,-0.362988,44.636034,-70.434357,198.006202,
+ -0.80166,0.505091,-0.319725,44.375617,-75.49665,190.661923,
+ -0.80166,0.505091,-0.319725,44.636034,-70.434357,198.006202,
+ -0.80166,0.505091,-0.319725,48.638926,-65.900198,195.132499,
+ -0.860502,0.44907,-0.240567,48.638926,-65.900198,195.132499,
+ -0.860502,0.44907,-0.240567,51.213059,-56.30405,203.838182,
+ -0.860502,0.44907,-0.240567,52.000909,-57.802051,198.223722,
+ -0.832709,0.477577,-0.280207,48.638926,-65.900198,195.132499,
+ -0.832709,0.477577,-0.280207,48.076415,-63.434764,201.006158,
+ -0.832709,0.477577,-0.280207,51.213059,-56.30405,203.838182,
+ -0.877159,0.464804,-0.120624,51.213059,-56.30405,203.838182,
+ -0.877159,0.464804,-0.120624,44.627211,-68.539952,204.58049,
+ -0.877159,0.464804,-0.120624,48.367223,-60.68123,207.665933,
+ -0.86973,0.456787,-0.186858,48.076415,-63.434764,201.006158,
+ -0.86973,0.456787,-0.186858,44.627211,-68.539952,204.58049,
+ -0.86973,0.456787,-0.186858,51.213059,-56.30405,203.838182,
+ -0.735823,0.676856,-0.020766,40.916891,-69.902269,212.389624,
+ -0.735823,0.676856,-0.020766,33.940115,-77.457072,213.360404,
+ -0.735823,0.676856,-0.020766,38.866723,-71.936313,218.73696,
+ -0.723431,0.632527,-0.276689,37.335562,-77.325647,204.783103,
+ -0.723431,0.632527,-0.276689,33.940115,-77.457072,213.360404,
+ -0.723431,0.632527,-0.276689,40.916891,-69.902269,212.389624,
+ -0.800702,0.522937,0.292256,33.301244,-78.994926,216.11911,
+ -0.800702,0.522937,0.292256,37.872214,-74.26515,220.179288,
+ -0.800702,0.522937,0.292256,38.866723,-71.936313,218.73696,
+ -0.80201,0.581101,0.138205,33.940115,-77.457072,213.360404,
+ -0.80201,0.581101,0.138205,33.301244,-78.994926,216.11911,
+ -0.80201,0.581101,0.138205,38.866723,-71.936313,218.73696,
+ -0.898065,0.271325,0.346212,38.866723,-71.936313,218.73696,
+ -0.898065,0.271325,0.346212,41.024891,-72.153833,224.505662,
+ -0.898065,0.271325,0.346212,42.064121,-69.720647,225.294515,
+ -0.786991,0.530822,0.314442,38.866723,-71.936313,218.73696,
+ -0.786991,0.530822,0.314442,37.872214,-74.26515,220.179288,
+ -0.786991,0.530822,0.314442,41.024891,-72.153833,224.505662,
+ -0.837218,0.542775,0.066789,40.916891,-69.902269,212.389624,
+ -0.837218,0.542775,0.066789,42.064121,-69.720647,225.294515,
+ -0.837218,0.542775,0.066789,44.791188,-65.304831,223.592989,
+ -0.629799,0.775449,0.045075,42.064121,-69.720647,225.294515,
+ -0.629799,0.775449,0.045075,40.916891,-69.902269,212.389624,
+ -0.629799,0.775449,0.045075,38.866723,-71.936313,218.73696,
+ -0.793437,0.606996,-0.044867,46.148333,-64.352913,212.471156,
+ -0.793437,0.606996,-0.044867,44.791188,-65.304831,223.592989,
+ -0.793437,0.606996,-0.044867,47.21829,-62.218475,222.426288,
+ -0.727094,0.685881,-0.030019,40.916891,-69.902269,212.389624,
+ -0.727094,0.685881,-0.030019,44.791188,-65.304831,223.592989,
+ -0.727094,0.685881,-0.030019,46.148333,-64.352913,212.471156,
+ -0.708289,0.670936,-0.21948,44.627211,-68.539952,204.58049,
+ -0.708289,0.670936,-0.21948,40.916891,-69.902269,212.389624,
+ -0.708289,0.670936,-0.21948,46.148333,-64.352913,212.471156,
+ -0.890423,0.450145,-0.06721,44.627211,-68.539952,204.58049,
+ -0.890423,0.450145,-0.06721,46.148333,-64.352913,212.471156,
+ -0.890423,0.450145,-0.06721,48.367223,-60.68123,207.665933,
+ -0.883439,0.468118,-0.020013,48.367223,-60.68123,207.665933,
+ -0.883439,0.468118,-0.020013,47.21829,-62.218475,222.426288,
+ -0.883439,0.468118,-0.020013,50.189253,-56.706843,220.199062,
+ -0.864279,0.502792,-0.014911,48.367223,-60.68123,207.665933,
+ -0.864279,0.502792,-0.014911,46.148333,-64.352913,212.471156,
+ -0.864279,0.502792,-0.014911,47.21829,-62.218475,222.426288,
+ -0.888139,0.425445,-0.173797,51.213059,-56.30405,203.838182,
+ -0.888139,0.425445,-0.173797,48.367223,-60.68123,207.665933,
+ -0.888139,0.425445,-0.173797,52.828916,-49.930551,211.182766,
+ -0.925162,0.379306,0.014216,48.367223,-60.68123,207.665933,
+ -0.925162,0.379306,0.014216,50.189253,-56.706843,220.199062,
+ -0.925162,0.379306,0.014216,52.828916,-49.930551,211.182766,
+ 0.848768,-0.462585,-0.256139,26.889412,-123.753016,167.434243,
+ 0.848768,-0.462585,-0.256139,34.095269,-113.192173,172.239497,
+ 0.848768,-0.462585,-0.256139,33.81447,-115.571512,175.606074,
+ 0.814046,-0.568024,-0.121151,26.889412,-123.753016,167.434243,
+ 0.814046,-0.568024,-0.121151,33.81447,-115.571512,175.606074,
+ 0.814046,-0.568024,-0.121151,27.931684,-123.317063,172.393556,
+ 0.541578,-0.037978,-0.839792,30.328364,-110.686277,169.696912,
+ 0.541578,-0.037978,-0.839792,34.095269,-113.192173,172.239497,
+ 0.541578,-0.037978,-0.839792,22.139558,-120.677004,164.867807,
+ 0.500461,0.051748,-0.864211,34.095269,-113.192173,172.239497,
+ 0.500461,0.051748,-0.864211,26.889412,-123.753016,167.434243,
+ 0.500461,0.051748,-0.864211,22.139558,-120.677004,164.867807,
+ -0.167096,0.517715,-0.839077,26.175093,-108.385733,171.943456,
+ -0.167096,0.517715,-0.839077,30.328364,-110.686277,169.696912,
+ -0.167096,0.517715,-0.839077,18.687828,-120.29642,166.085526,
+ -0.218694,0.564107,-0.796213,30.328364,-110.686277,169.696912,
+ -0.218694,0.564107,-0.796213,22.139558,-120.677004,164.867807,
+ -0.218694,0.564107,-0.796213,18.687828,-120.29642,166.085526,
+ -0.569577,0.655942,-0.495299,26.175093,-108.385733,171.943456,
+ -0.569577,0.655942,-0.495299,15.91026,-119.017156,169.668102,
+ -0.569577,0.655942,-0.495299,22.695984,-109.317268,174.71065,
+ -0.501787,0.614726,-0.608541,26.175093,-108.385733,171.943456,
+ -0.501787,0.614726,-0.608541,18.687828,-120.29642,166.085526,
+ -0.501787,0.614726,-0.608541,15.91026,-119.017156,169.668102,
+ -0.778741,0.61243,-0.135985,22.695984,-109.317268,174.71065,
+ -0.778741,0.61243,-0.135985,14.239765,-119.520952,177.182656,
+ -0.778741,0.61243,-0.135985,20.310257,-111.18125,179.978173,
+ -0.778696,0.613362,-0.131984,15.91026,-119.017156,169.668102,
+ -0.778696,0.613362,-0.131984,14.239765,-119.520952,177.182656,
+ -0.778696,0.613362,-0.131984,22.695984,-109.317268,174.71065,
+ 0.869647,-0.427333,-0.247183,34.095269,-113.192173,172.239497,
+ 0.869647,-0.427333,-0.247183,40.75048,-102.834856,177.748209,
+ 0.869647,-0.427333,-0.247183,40.819539,-105.065733,181.847936,
+ 0.867395,-0.437598,-0.236926,34.095269,-113.192173,172.239497,
+ 0.867395,-0.437598,-0.236926,40.819539,-105.065733,181.847936,
+ 0.867395,-0.437598,-0.236926,33.81447,-115.571512,175.606074,
+ 0.590082,0.071034,-0.804212,37.556125,-99.971801,175.946592,
+ 0.590082,0.071034,-0.804212,34.095269,-113.192173,172.239497,
+ 0.590082,0.071034,-0.804212,30.328364,-110.686277,169.696912,
+ 0.548858,0.089373,-0.831124,37.556125,-99.971801,175.946592,
+ 0.548858,0.089373,-0.831124,40.75048,-102.834856,177.748209,
+ 0.548858,0.089373,-0.831124,34.095269,-113.192173,172.239497,
+ 0.632889,0.077645,-0.770339,43.107915,-90.258527,181.486821,
+ 0.632889,0.077645,-0.770339,45.98253,-93.527417,183.51904,
+ 0.632889,0.077645,-0.770339,37.556125,-99.971801,175.946592,
+ 0.589564,0.159527,-0.791812,45.98253,-93.527417,183.51904,
+ 0.589564,0.159527,-0.791812,40.75048,-102.834856,177.748209,
+ 0.589564,0.159527,-0.791812,37.556125,-99.971801,175.946592,
+ 0.901299,-0.341011,-0.267154,40.75048,-102.834856,177.748209,
+ 0.901299,-0.341011,-0.267154,45.98253,-93.527417,183.51904,
+ 0.901299,-0.341011,-0.267154,45.923207,-96.190293,186.717958,
+ 0.892888,-0.38903,-0.226732,40.75048,-102.834856,177.748209,
+ 0.892888,-0.38903,-0.226732,45.923207,-96.190293,186.717958,
+ 0.892888,-0.38903,-0.226732,40.819539,-105.065733,181.847936,
+ 0.941638,-0.289557,-0.171683,45.98253,-93.527417,183.51904,
+ 0.941638,-0.289557,-0.171683,49.716793,-84.350491,188.522921,
+ 0.941638,-0.289557,-0.171683,49.097362,-87.922997,191.150811,
+ 0.945971,-0.257618,-0.196906,45.98253,-93.527417,183.51904,
+ 0.945971,-0.257618,-0.196906,49.097362,-87.922997,191.150811,
+ 0.945971,-0.257618,-0.196906,45.923207,-96.190293,186.717958,
+ 0.72992,-0.002468,-0.683528,43.107915,-90.258527,181.486821,
+ 0.72992,-0.002468,-0.683528,47.14558,-82.102577,185.769083,
+ 0.72992,-0.002468,-0.683528,49.716793,-84.350491,188.522921,
+ 0.666268,0.129334,-0.734411,49.716793,-84.350491,188.522921,
+ 0.666268,0.129334,-0.734411,45.98253,-93.527417,183.51904,
+ 0.666268,0.129334,-0.734411,43.107915,-90.258527,181.486821,
+ 0.828584,-0.091674,-0.552309,47.14558,-82.102577,185.769083,
+ 0.828584,-0.091674,-0.552309,50.054238,-74.442209,188.861219,
+ 0.828584,-0.091674,-0.552309,51.968022,-76.857141,192.133151,
+ 0.760843,0.08159,-0.643786,47.14558,-82.102577,185.769083,
+ 0.760843,0.08159,-0.643786,51.968022,-76.857141,192.133151,
+ 0.760843,0.08159,-0.643786,49.716793,-84.350491,188.522921,
+ 0.963804,-0.258916,-0.063596,49.716793,-84.350491,188.522921,
+ 0.963804,-0.258916,-0.063596,51.968022,-76.857141,192.133151,
+ 0.963804,-0.258916,-0.063596,51.596656,-78.961461,195.072263,
+ 0.968791,-0.232064,-0.087123,49.716793,-84.350491,188.522921,
+ 0.968791,-0.232064,-0.087123,51.596656,-78.961461,195.072263,
+ 0.968791,-0.232064,-0.087123,49.097362,-87.922997,191.150811,
+ 0.961786,-0.272886,-0.022377,51.968022,-76.857141,192.133151,
+ 0.961786,-0.272886,-0.022377,55.49237,-64.766354,196.166862,
+ 0.961786,-0.272886,-0.022377,54.752587,-67.739234,200.624356,
+ 0.967871,-0.245669,-0.053598,51.968022,-76.857141,192.133151,
+ 0.967871,-0.245669,-0.053598,54.752587,-67.739234,200.624356,
+ 0.967871,-0.245669,-0.053598,51.596656,-78.961461,195.072263,
+ 0.815128,-0.021037,-0.578898,50.054238,-74.442209,188.861219,
+ 0.815128,-0.021037,-0.578898,53.145431,-64.402502,192.848991,
+ 0.815128,-0.021037,-0.578898,55.49237,-64.766354,196.166862,
+ 0.839741,-0.064925,-0.539092,50.054238,-74.442209,188.861219,
+ 0.839741,-0.064925,-0.539092,55.49237,-64.766354,196.166862,
+ 0.839741,-0.064925,-0.539092,51.968022,-76.857141,192.133151,
+ -0.891467,0.297699,0.341558,55.562767,-75.925606,251.701187,
+ -0.891467,0.297699,0.341558,54.201941,-81.389475,252.911695,
+ -0.891467,0.297699,0.341558,55.329397,-80.789241,255.331191,
+ -0.895685,0.275565,0.349016,54.201941,-81.389475,252.911695,
+ -0.895685,0.275565,0.349016,53.600155,-86.360196,255.291946,
+ -0.895685,0.275565,0.349016,55.329397,-80.789241,255.331191,
+ -0.917874,0.28295,0.278294,53.600155,-86.360196,255.291946,
+ -0.917874,0.28295,0.278294,54.566098,-86.138721,258.252657,
+ -0.917874,0.28295,0.278294,55.329397,-80.789241,255.331191,
+ -0.485436,0.397012,0.778931,56.027531,-69.429809,249.390299,
+ -0.485436,0.397012,0.778931,56.296982,-76.212794,253.015436,
+ -0.485436,0.397012,0.778931,56.79947,-69.576445,249.946116,
+ -0.823765,0.241424,0.512958,56.027531,-69.429809,249.390299,
+ -0.823765,0.241424,0.512958,55.562767,-75.925606,251.701187,
+ -0.823765,0.241424,0.512958,56.296982,-76.212794,253.015436,
+ 0.858121,0.137266,0.494758,56.997702,-69.439544,249.564315,
+ 0.858121,0.137266,0.494758,56.79947,-69.576445,249.946116,
+ 0.858121,0.137266,0.494758,56.370148,-76.343611,252.568226,
+ 0.986877,-0.000043,0.161471,56.79947,-69.576445,249.946116,
+ 0.986877,-0.000043,0.161471,56.296982,-76.212794,253.015436,
+ 0.986877,-0.000043,0.161471,56.370148,-76.343611,252.568226,
+ -0.716006,0.195365,0.6702,53.952234,-70.119485,247.374204,
+ -0.716006,0.195365,0.6702,53.782872,-76.405064,249.025534,
+ -0.716006,0.195365,0.6702,56.027531,-69.429809,249.390299,
+ -0.827583,0.239776,0.507557,53.782872,-76.405064,249.025534,
+ -0.827583,0.239776,0.507557,55.562767,-75.925606,251.701187,
+ -0.827583,0.239776,0.507557,56.027531,-69.429809,249.390299,
+ -0.645858,0.192785,0.738716,54.765578,-62.115647,246.378174,
+ -0.645858,0.192785,0.738716,56.027531,-69.429809,249.390299,
+ -0.645858,0.192785,0.738716,57.517926,-62.763949,248.953737,
+ -0.714532,0.157438,0.681657,54.765578,-62.115647,246.378174,
+ -0.714532,0.157438,0.681657,53.952234,-70.119485,247.374204,
+ -0.714532,0.157438,0.681657,56.027531,-69.429809,249.390299,
+ -0.240735,0.164724,0.956511,57.517926,-62.763949,248.953737,
+ -0.240735,0.164724,0.956511,56.79947,-69.576445,249.946116,
+ -0.240735,0.164724,0.956511,58.134649,-62.972039,249.14479,
+ -0.552749,0.176921,0.814351,57.517926,-62.763949,248.953737,
+ -0.552749,0.176921,0.814351,56.027531,-69.429809,249.390299,
+ -0.552749,0.176921,0.814351,56.79947,-69.576445,249.946116,
+ 0.225643,-0.35793,0.906075,59.455683,-56.882381,251.221425,
+ 0.225643,-0.35793,0.906075,58.134649,-62.972039,249.14479,
+ 0.225643,-0.35793,0.906075,60.105049,-57.223112,250.92511,
+ -0.35814,-0.230816,0.904688,59.455683,-56.882381,251.221425,
+ -0.35814,-0.230816,0.904688,57.517926,-62.763949,248.953737,
+ -0.35814,-0.230816,0.904688,58.134649,-62.972039,249.14479,
+ -0.820561,0.050848,0.569293,57.7422,-55.050646,248.588059,
+ -0.820561,0.050848,0.569293,57.517926,-62.763949,248.953737,
+ -0.820561,0.050848,0.569293,59.455683,-56.882381,251.221425,
+ -0.675378,0.054504,0.735455,57.7422,-55.050646,248.588059,
+ -0.675378,0.054504,0.735455,54.765578,-62.115647,246.378174,
+ -0.675378,0.054504,0.735455,57.517926,-62.763949,248.953737,
+ -0.688146,-0.399713,0.605545,59.455683,-56.882381,251.221425,
+ -0.688146,-0.399713,0.605545,63.332748,-51.510083,259.173544,
+ -0.688146,-0.399713,0.605545,62.053667,-49.302023,259.177499,
+ -0.876128,-0.172285,0.450241,57.7422,-55.050646,248.588059,
+ -0.876128,-0.172285,0.450241,59.455683,-56.882381,251.221425,
+ -0.876128,-0.172285,0.450241,62.053667,-49.302023,259.177499,
+ 0.65265,-0.718001,0.241913,64.600755,-50.613534,258.413592,
+ 0.65265,-0.718001,0.241913,63.332748,-51.510083,259.173544,
+ 0.65265,-0.718001,0.241913,60.105049,-57.223112,250.92511,
+ -0.139454,-0.787661,0.600119,63.332748,-51.510083,259.173544,
+ -0.139454,-0.787661,0.600119,59.455683,-56.882381,251.221425,
+ -0.139454,-0.787661,0.600119,60.105049,-57.223112,250.92511,
+ 0.524062,-0.846753,0.091481,69.207167,-46.924206,266.173746,
+ 0.524062,-0.846753,0.091481,67.169747,-48.096078,266.998498,
+ 0.524062,-0.846753,0.091481,64.600755,-50.613534,258.413592,
+ 0.598339,-0.799329,0.055347,67.169747,-48.096078,266.998498,
+ 0.598339,-0.799329,0.055347,63.332748,-51.510083,259.173544,
+ 0.598339,-0.799329,0.055347,64.600755,-50.613534,258.413592,
+ 0.174436,-0.930995,0.320655,67.169747,-48.096078,266.998498,
+ 0.174436,-0.930995,0.320655,66.093188,-47.92267,268.087621,
+ 0.174436,-0.930995,0.320655,63.332748,-51.510083,259.173544,
+ -0.782841,-0.454244,0.425232,63.332748,-51.510083,259.173544,
+ -0.782841,-0.454244,0.425232,66.093188,-47.92267,268.087621,
+ -0.782841,-0.454244,0.425232,62.053667,-49.302023,259.177499,
+ 0.272256,-0.589017,0.760878,71.620457,-44.06541,274.772951,
+ 0.272256,-0.589017,0.760878,68.336051,-44.806196,275.374706,
+ 0.272256,-0.589017,0.760878,70.21996,-46.668657,273.258826,
+ 0.184592,-0.65038,0.736839,68.336051,-44.806196,275.374706,
+ 0.184592,-0.65038,0.736839,67.928117,-47.443213,273.149306,
+ 0.184592,-0.65038,0.736839,70.21996,-46.668657,273.258826,
+ 0.147417,-0.651115,0.744525,64.125313,-44.705498,276.296506,
+ 0.147417,-0.651115,0.744525,67.928117,-47.443213,273.149306,
+ 0.147417,-0.651115,0.744525,68.336051,-44.806196,275.374706,
+ 0.261342,-0.54936,0.793665,64.125313,-44.705498,276.296506,
+ 0.261342,-0.54936,0.793665,65.966904,-47.448384,273.791523,
+ 0.261342,-0.54936,0.793665,67.928117,-47.443213,273.149306,
+ 0.115859,0.349771,0.929643,66.237725,-41.507492,274.395104,
+ 0.115859,0.349771,0.929643,62.160876,-41.511447,274.90468,
+ 0.115859,0.349771,0.929643,68.336051,-44.806196,275.374706,
+ 0.197474,0.491147,0.848398,62.160876,-41.511447,274.90468,
+ 0.197474,0.491147,0.848398,64.125313,-44.705498,276.296506,
+ 0.197474,0.491147,0.848398,68.336051,-44.806196,275.374706,
+ 0.277303,0.68331,0.675419,71.620457,-44.06541,274.772951,
+ 0.277303,0.68331,0.675419,68.669025,-41.355075,273.242702,
+ 0.277303,0.68331,0.675419,66.237725,-41.507492,274.395104,
+ 0.09516,0.338531,0.936131,66.237725,-41.507492,274.395104,
+ 0.09516,0.338531,0.936131,68.336051,-44.806196,275.374706,
+ 0.09516,0.338531,0.936131,71.620457,-44.06541,274.772951,
+ 0.939392,-0.135882,-0.314768,68.063618,-42.116549,260.685539,
+ 0.939392,-0.135882,-0.314768,71.693197,-43.746887,272.221421,
+ 0.939392,-0.135882,-0.314768,69.207167,-46.924206,266.173746,
+ 0.933955,-0.255918,-0.249468,69.207167,-46.924206,266.173746,
+ 0.933955,-0.255918,-0.249468,71.693197,-43.746887,272.221421,
+ 0.933955,-0.255918,-0.249468,70.733491,-46.654663,271.611452,
+ 0.950281,-0.311173,-0.011755,70.733491,-46.654663,271.611452,
+ 0.950281,-0.311173,-0.011755,71.693197,-43.746887,272.221421,
+ 0.950281,-0.311173,-0.011755,71.620457,-44.06541,274.772951,
+ 0.789159,-0.564844,0.241204,70.733491,-46.654663,271.611452,
+ 0.789159,-0.564844,0.241204,71.620457,-44.06541,274.772951,
+ 0.789159,-0.564844,0.241204,70.21996,-46.668657,273.258826,
+ 0.801072,0.584076,-0.130919,68.063618,-42.116549,260.685539,
+ 0.801072,0.584076,-0.130919,66.332491,-39.515127,261.69891,
+ 0.801072,0.584076,-0.130919,68.794883,-40.670266,271.612364,
+ 0.734414,0.664704,-0.13713,68.063618,-42.116549,260.685539,
+ 0.734414,0.664704,-0.13713,68.794883,-40.670266,271.612364,
+ 0.734414,0.664704,-0.13713,71.693197,-43.746887,272.221421,
+ 0.651458,0.68022,0.336011,71.693197,-43.746887,272.221421,
+ 0.651458,0.68022,0.336011,68.794883,-40.670266,271.612364,
+ 0.651458,0.68022,0.336011,68.669025,-41.355075,273.242702,
+ 0.639576,0.760355,0.113153,71.693197,-43.746887,272.221421,
+ 0.639576,0.760355,0.113153,68.669025,-41.355075,273.242702,
+ 0.639576,0.760355,0.113153,71.620457,-44.06541,274.772951,
+ -0.116583,-0.992261,0.042748,68.129027,-48.003594,271.761434,
+ -0.116583,-0.992261,0.042748,66.093188,-47.92267,268.087621,
+ -0.116583,-0.992261,0.042748,67.169747,-48.096078,266.998498,
+ 0.252211,-0.954222,-0.160781,68.129027,-48.003594,271.761434,
+ 0.252211,-0.954222,-0.160781,66.25969,-48.53264,271.968915,
+ 0.252211,-0.954222,-0.160781,66.093188,-47.92267,268.087621,
+ 0.290513,-0.871937,0.394117,68.129027,-48.003594,271.761434,
+ 0.290513,-0.871937,0.394117,67.928117,-47.443213,273.149306,
+ 0.290513,-0.871937,0.394117,66.25969,-48.53264,271.968915,
+ 0.173773,-0.833831,0.523955,67.928117,-47.443213,273.149306,
+ 0.173773,-0.833831,0.523955,65.966904,-47.448384,273.791523,
+ 0.173773,-0.833831,0.523955,66.25969,-48.53264,271.968915,
+ 0.469554,-0.878482,-0.088255,70.733491,-46.654663,271.611452,
+ 0.469554,-0.878482,-0.088255,67.169747,-48.096078,266.998498,
+ 0.469554,-0.878482,-0.088255,69.207167,-46.924206,266.173746,
+ 0.455244,-0.887248,-0.07446,70.733491,-46.654663,271.611452,
+ 0.455244,-0.887248,-0.07446,68.129027,-48.003594,271.761434,
+ 0.455244,-0.887248,-0.07446,67.169747,-48.096078,266.998498,
+ -0.024509,-0.327562,-0.944512,5.509743,-134.869982,160.539182,
+ -0.024509,-0.327562,-0.944512,7.389241,-139.711103,162.169337,
+ -0.024509,-0.327562,-0.944512,0.020624,-141.172901,162.867502,
+ 0.078943,-0.405207,-0.91081,5.509743,-134.869982,160.539182,
+ 0.078943,-0.405207,-0.91081,0.020624,-141.172901,162.867502,
+ 0.078943,-0.405207,-0.91081,0.020624,-135.825246,160.488407,
+ 0.009918,-0.077376,-0.996953,11.549509,-130.865173,161.524169,
+ 0.009918,-0.077376,-0.996953,14.017377,-135.951499,161.943481,
+ 0.009918,-0.077376,-0.996953,7.389241,-139.711103,162.169337,
+ 0.287565,-0.203501,-0.935892,11.549509,-130.865173,161.524169,
+ 0.287565,-0.203501,-0.935892,7.389241,-139.711103,162.169337,
+ 0.287565,-0.203501,-0.935892,5.509743,-134.869982,160.539182,
+ 0.483874,0.017158,-0.874969,22.139558,-120.677004,164.867807,
+ 0.483874,0.017158,-0.874969,26.889412,-123.753016,167.434243,
+ 0.483874,0.017158,-0.874969,19.901683,-131.773891,163.412611,
+ 0.333246,0.056215,-0.941163,22.139558,-120.677004,164.867807,
+ 0.333246,0.056215,-0.941163,19.901683,-131.773891,163.412611,
+ 0.333246,0.056215,-0.941163,15.779444,-127.916326,162.183423,
+ 0.261098,-0.028444,-0.964893,15.779444,-127.916326,162.183423,
+ 0.261098,-0.028444,-0.964893,19.901683,-131.773891,163.412611,
+ 0.261098,-0.028444,-0.964893,14.017377,-135.951499,161.943481,
+ 0.157417,-0.005032,-0.987519,15.779444,-127.916326,162.183423,
+ 0.157417,-0.005032,-0.987519,14.017377,-135.951499,161.943481,
+ 0.157417,-0.005032,-0.987519,11.549509,-130.865173,161.524169,
+ 0.163441,-0.899011,-0.406284,7.876304,-141.25565,166.210805,
+ 0.163441,-0.899011,-0.406284,0.020624,-142.564727,165.947286,
+ 0.163441,-0.899011,-0.406284,0.020624,-141.172901,162.867502,
+ 0.147175,-0.917891,-0.368532,7.876304,-141.25565,166.210805,
+ 0.147175,-0.917891,-0.368532,0.020624,-141.172901,162.867502,
+ 0.147175,-0.917891,-0.368532,7.389241,-139.711103,162.169337,
+ 0.79103,-0.593505,-0.148403,19.901683,-131.773891,163.412611,
+ 0.79103,-0.593505,-0.148403,27.931684,-123.317063,172.393556,
+ 0.79103,-0.593505,-0.148403,20.911404,-131.671063,168.383454,
+ 0.775839,-0.621546,-0.108416,19.901683,-131.773891,163.412611,
+ 0.775839,-0.621546,-0.108416,26.889412,-123.753016,167.434243,
+ 0.775839,-0.621546,-0.108416,27.931684,-123.317063,172.393556,
+ 0.709798,-0.607976,-0.355741,14.017377,-135.951499,161.943481,
+ 0.709798,-0.607976,-0.355741,20.911404,-131.671063,168.383454,
+ 0.709798,-0.607976,-0.355741,15.550667,-136.673728,166.237121,
+ 0.592884,-0.798555,-0.103913,20.911404,-131.671063,168.383454,
+ 0.592884,-0.798555,-0.103913,14.017377,-135.951499,161.943481,
+ 0.592884,-0.798555,-0.103913,19.901683,-131.773891,163.412611,
+ 0.449758,-0.814882,-0.36563,14.017377,-135.951499,161.943481,
+ 0.449758,-0.814882,-0.36563,7.876304,-141.25565,166.210805,
+ 0.449758,-0.814882,-0.36563,7.389241,-139.711103,162.169337,
+ 0.487925,-0.815448,-0.311407,15.550667,-136.673728,166.237121,
+ 0.487925,-0.815448,-0.311407,7.876304,-141.25565,166.210805,
+ 0.487925,-0.815448,-0.311407,14.017377,-135.951499,161.943481,
+ -0.342772,-0.338831,0.876185,37.872214,-74.26515,220.179288,
+ -0.342772,-0.338831,0.876185,37.01491,-82.017698,216.845902,
+ -0.342772,-0.338831,0.876185,40.813455,-78.170478,219.819694,
+ -0.424479,-0.317632,0.847896,37.872214,-74.26515,220.179288,
+ -0.424479,-0.317632,0.847896,33.301244,-78.994926,216.11911,
+ -0.424479,-0.317632,0.847896,37.01491,-82.017698,216.845902,
+ -0.567317,-0.429647,0.702535,40.813455,-78.170478,219.819694,
+ -0.567317,-0.429647,0.702535,43.251813,-86.890459,216.455886,
+ -0.567317,-0.429647,0.702535,44.193691,-82.885042,219.666061,
+ -0.266467,-0.410852,0.871892,40.813455,-78.170478,219.819694,
+ -0.266467,-0.410852,0.871892,37.01491,-82.017698,216.845902,
+ -0.266467,-0.410852,0.871892,43.251813,-86.890459,216.455886,
+ -0.759141,-0.420677,0.496726,44.193691,-82.885042,219.666061,
+ -0.759141,-0.420677,0.496726,47.110594,-85.36447,222.024104,
+ -0.759141,-0.420677,0.496726,46.625052,-83.391575,222.952901,
+ -0.741817,-0.304443,0.597514,43.251813,-86.890459,216.455886,
+ -0.741817,-0.304443,0.597514,47.110594,-85.36447,222.024104,
+ -0.741817,-0.304443,0.597514,44.193691,-82.885042,219.666061,
+ -0.884182,-0.370023,0.28514,47.110594,-85.36447,222.024104,
+ -0.884182,-0.370023,0.28514,48.570293,-85.310622,226.620325,
+ -0.884182,-0.370023,0.28514,47.903707,-83.523913,226.871918,
+ -0.89344,-0.351526,0.279632,47.110594,-85.36447,222.024104,
+ -0.89344,-0.351526,0.279632,47.903707,-83.523913,226.871918,
+ -0.89344,-0.351526,0.279632,46.625052,-83.391575,222.952901,
+ -0.964706,-0.24988,0.083082,48.570293,-85.310622,226.620325,
+ -0.964706,-0.24988,0.083082,49.78217,-87.037704,235.497591,
+ -0.964706,-0.24988,0.083082,49.359755,-85.342262,235.69199,
+ -0.930211,-0.358267,0.079702,48.570293,-85.310622,226.620325,
+ -0.930211,-0.358267,0.079702,49.359755,-85.342262,235.69199,
+ -0.930211,-0.358267,0.079702,47.903707,-83.523913,226.871918,
+ -0.993536,-0.089035,0.070426,49.78217,-87.037704,235.497591,
+ -0.993536,-0.089035,0.070426,50.603029,-90.104589,243.200551,
+ -0.993536,-0.089035,0.070426,50.527185,-88.534183,244.115961,
+ -0.968408,-0.245978,0.041003,49.78217,-87.037704,235.497591,
+ -0.968408,-0.245978,0.041003,50.527185,-88.534183,244.115961,
+ -0.968408,-0.245978,0.041003,49.359755,-85.342262,235.69199,
+ -0.985686,0.069641,0.153534,50.603029,-90.104589,243.200551,
+ -0.985686,0.069641,0.153534,52.032366,-92.464762,253.447434,
+ -0.985686,0.069641,0.153534,52.068264,-90.44958,252.763842,
+ -0.9805,-0.132144,0.14546,50.603029,-90.104589,243.200551,
+ -0.9805,-0.132144,0.14546,52.068264,-90.44958,252.763842,
+ -0.9805,-0.132144,0.14546,50.527185,-88.534183,244.115961,
+ -0.845464,-0.364395,0.390394,52.504096,-93.1517,254.238113,
+ -0.845464,-0.364395,0.390394,53.799879,-91.565475,258.524938,
+ -0.845464,-0.364395,0.390394,53.114492,-91.131651,257.44555,
+ -0.911401,-0.247104,0.329072,52.032366,-92.464762,253.447434,
+ -0.911401,-0.247104,0.329072,52.504096,-93.1517,254.238113,
+ -0.911401,-0.247104,0.329072,53.114492,-91.131651,257.44555,
+ -0.966925,0.134003,0.217025,52.032366,-92.464762,253.447434,
+ -0.966925,0.134003,0.217025,53.114492,-91.131651,257.44555,
+ -0.966925,0.134003,0.217025,52.862046,-89.340682,255.214977,
+ -0.959059,0.106151,0.262561,52.068264,-90.44958,252.763842,
+ -0.959059,0.106151,0.262561,52.032366,-92.464762,253.447434,
+ -0.959059,0.106151,0.262561,52.862046,-89.340682,255.214977,
+ -0.860031,0.172409,0.480232,53.114492,-91.131651,257.44555,
+ -0.860031,0.172409,0.480232,55.127027,-86.138721,259.257206,
+ -0.860031,0.172409,0.480232,54.566098,-86.138721,258.252657,
+ -0.814734,0.122782,0.566686,53.114492,-91.131651,257.44555,
+ -0.814734,0.122782,0.566686,53.799879,-91.565475,258.524938,
+ -0.814734,0.122782,0.566686,55.127027,-86.138721,259.257206,
+ -0.931488,0.223264,0.2872,52.862046,-89.340682,255.214977,
+ -0.931488,0.223264,0.2872,54.566098,-86.138721,258.252657,
+ -0.931488,0.223264,0.2872,53.600155,-86.360196,255.291946,
+ -0.931586,0.224642,0.285802,52.862046,-89.340682,255.214977,
+ -0.931586,0.224642,0.285802,53.114492,-91.131651,257.44555,
+ -0.931586,0.224642,0.285802,54.566098,-86.138721,258.252657,
+ 0.987724,0.025686,0.154084,56.370148,-76.343611,252.568226,
+ 0.987724,0.025686,0.154084,56.296982,-76.212794,253.015436,
+ 0.987724,0.025686,0.154084,55.978216,-80.304915,255.740981,
+ 0.986676,-0.149339,-0.06457,56.370148,-76.343611,252.568226,
+ 0.986676,-0.149339,-0.06457,55.978216,-80.304915,255.740981,
+ 0.986676,-0.149339,-0.06457,55.931639,-80.396791,255.241749,
+ 0.982147,-0.178708,-0.058743,55.931639,-80.396791,255.241749,
+ 0.982147,-0.178708,-0.058743,55.978216,-80.304915,255.740981,
+ 0.982147,-0.178708,-0.058743,55.127027,-86.138721,259.257206,
+ 0.91592,0.135783,0.377695,55.931639,-80.396791,255.241749,
+ 0.91592,0.135783,0.377695,55.127027,-86.138721,259.257206,
+ 0.91592,0.135783,0.377695,55.270712,-86.127161,258.90461,
+ -0.687786,0.421067,0.591315,55.329397,-80.789241,255.331191,
+ -0.687786,0.421067,0.591315,54.566098,-86.138721,258.252657,
+ -0.687786,0.421067,0.591315,55.978216,-80.304915,255.740981,
+ -0.80463,0.388206,0.449296,55.978216,-80.304915,255.740981,
+ -0.80463,0.388206,0.449296,54.566098,-86.138721,258.252657,
+ -0.80463,0.388206,0.449296,55.127027,-86.138721,259.257206,
+ -0.751411,0.417443,0.511001,55.562767,-75.925606,251.701187,
+ -0.751411,0.417443,0.511001,55.329397,-80.789241,255.331191,
+ -0.751411,0.417443,0.511001,56.296982,-76.212794,253.015436,
+ -0.690439,0.437494,0.576101,56.296982,-76.212794,253.015436,
+ -0.690439,0.437494,0.576101,55.329397,-80.789241,255.331191,
+ -0.690439,0.437494,0.576101,55.978216,-80.304915,255.740981,
+ -0.816042,0.311156,0.48709,53.782872,-76.405064,249.025534,
+ -0.816042,0.311156,0.48709,54.201941,-81.389475,252.911695,
+ -0.816042,0.311156,0.48709,55.562767,-75.925606,251.701187,
+ -0.693056,-0.427637,0.580345,40.813455,-78.170478,219.819694,
+ -0.693056,-0.427637,0.580345,42.780874,-77.927707,222.348103,
+ -0.693056,-0.427637,0.580345,41.024891,-72.153833,224.505662,
+ -0.572122,-0.491352,0.656696,41.024891,-72.153833,224.505662,
+ -0.572122,-0.491352,0.656696,37.872214,-74.26515,220.179288,
+ -0.572122,-0.491352,0.656696,40.813455,-78.170478,219.819694,
+ -0.792481,-0.355611,0.495495,42.780874,-77.927707,222.348103,
+ -0.792481,-0.355611,0.495495,44.875154,-77.705623,225.857026,
+ -0.792481,-0.355611,0.495495,44.423076,-72.359185,228.971066,
+ -0.73048,-0.422621,0.536462,42.780874,-77.927707,222.348103,
+ -0.73048,-0.422621,0.536462,44.423076,-72.359185,228.971066,
+ -0.73048,-0.422621,0.536462,41.024891,-72.153833,224.505662,
+ -0.922224,-0.133328,0.362941,44.875154,-77.705623,225.857026,
+ -0.922224,-0.133328,0.362941,48.401418,-79.647182,234.103939,
+ -0.922224,-0.133328,0.362941,48.717203,-73.511891,237.160177,
+ -0.859315,-0.30972,0.407003,44.875154,-77.705623,225.857026,
+ -0.859315,-0.30972,0.407003,48.717203,-73.511891,237.160177,
+ -0.859315,-0.30972,0.407003,44.423076,-72.359185,228.971066,
+ -0.931568,0.054536,0.359454,48.717203,-73.511891,237.160177,
+ -0.931568,0.054536,0.359454,50.324602,-82.523015,242.693104,
+ -0.931568,0.054536,0.359454,51.327295,-75.750069,244.264119,
+ -0.978062,-0.050352,0.202137,48.401418,-79.647182,234.103939,
+ -0.978062,-0.050352,0.202137,50.324602,-82.523015,242.693104,
+ -0.978062,-0.050352,0.202137,48.717203,-73.511891,237.160177,
+ -0.793244,0.056621,0.606265,41.024891,-72.153833,224.505662,
+ -0.793244,0.056621,0.606265,44.423076,-72.359185,228.971066,
+ -0.793244,0.056621,0.606265,45.346702,-68.576155,229.826241,
+ -0.817937,0.171286,0.549218,41.024891,-72.153833,224.505662,
+ -0.817937,0.171286,0.549218,45.346702,-68.576155,229.826241,
+ -0.817937,0.171286,0.549218,42.064121,-69.720647,225.294515,
+ -0.893266,0.109139,0.436078,49.008315,-69.610518,237.977323,
+ -0.893266,0.109139,0.436078,51.327295,-75.750069,244.264119,
+ -0.893266,0.109139,0.436078,52.067047,-70.846581,244.552219,
+ -0.938857,-0.002059,0.344301,48.717203,-73.511891,237.160177,
+ -0.938857,-0.002059,0.344301,51.327295,-75.750069,244.264119,
+ -0.938857,-0.002059,0.344301,49.008315,-69.610518,237.977323,
+ -0.88697,-0.030338,0.46083,44.423076,-72.359185,228.971066,
+ -0.88697,-0.030338,0.46083,48.717203,-73.511891,237.160177,
+ -0.88697,-0.030338,0.46083,49.008315,-69.610518,237.977323,
+ -0.899068,0.124633,0.419694,44.423076,-72.359185,228.971066,
+ -0.899068,0.124633,0.419694,49.008315,-69.610518,237.977323,
+ -0.899068,0.124633,0.419694,45.346702,-68.576155,229.826241,
+ -0.970765,0.070081,0.229572,47.28674,-63.047182,228.693918,
+ -0.970765,0.070081,0.229572,49.008315,-69.610518,237.977323,
+ -0.970765,0.070081,0.229572,49.314699,-62.401618,237.072256,
+ -0.826553,0.375835,0.418996,47.28674,-63.047182,228.693918,
+ -0.826553,0.375835,0.418996,45.346702,-68.576155,229.826241,
+ -0.826553,0.375835,0.418996,49.008315,-69.610518,237.977323,
+ -0.879071,0.12172,0.460889,49.314699,-62.401618,237.072256,
+ -0.879071,0.12172,0.460889,52.067047,-70.846581,244.552219,
+ -0.879071,0.12172,0.460889,52.570234,-62.042634,243.18686,
+ -0.89602,0.092601,0.43425,49.314699,-62.401618,237.072256,
+ -0.89602,0.092601,0.43425,49.008315,-69.610518,237.977323,
+ -0.89602,0.092601,0.43425,52.067047,-70.846581,244.552219,
+ -0.889177,0.367756,0.272249,44.791188,-65.304831,223.592989,
+ -0.889177,0.367756,0.272249,45.346702,-68.576155,229.826241,
+ -0.889177,0.367756,0.272249,47.28674,-63.047182,228.693918,
+ -0.718689,0.587284,0.372268,44.791188,-65.304831,223.592989,
+ -0.718689,0.587284,0.372268,42.064121,-69.720647,225.294515,
+ -0.718689,0.587284,0.372268,45.346702,-68.576155,229.826241,
+ -0.917376,0.393162,0.062003,47.21829,-62.218475,222.426288,
+ -0.917376,0.393162,0.062003,47.28674,-63.047182,228.693918,
+ -0.917376,0.393162,0.062003,48.676224,-59.919148,229.417363,
+ -0.765381,0.636886,0.092568,47.21829,-62.218475,222.426288,
+ -0.765381,0.636886,0.092568,44.791188,-65.304831,223.592989,
+ -0.765381,0.636886,0.092568,47.28674,-63.047182,228.693918,
+ -0.906572,0.344492,0.243831,51.48534,-59.441211,235.477816,
+ -0.906572,0.344492,0.243831,52.570234,-62.042634,243.18686,
+ -0.906572,0.344492,0.243831,55.939367,-54.5648,245.148499,
+ -0.673804,0.6662,0.319634,51.48534,-59.441211,235.477816,
+ -0.673804,0.6662,0.319634,49.314699,-62.401618,237.072256,
+ -0.673804,0.6662,0.319634,52.570234,-62.042634,243.18686,
+ -0.700078,0.660049,0.272445,48.676224,-59.919148,229.417363,
+ -0.700078,0.660049,0.272445,49.314699,-62.401618,237.072256,
+ -0.700078,0.660049,0.272445,51.48534,-59.441211,235.477816,
+ -0.912488,0.360676,0.193075,47.28674,-63.047182,228.693918,
+ -0.912488,0.360676,0.193075,49.314699,-62.401618,237.072256,
+ -0.912488,0.360676,0.193075,48.676224,-59.919148,229.417363,
+ -0.784007,0.595259,0.176069,51.559966,-56.610708,226.240653,
+ -0.784007,0.595259,0.176069,51.48534,-59.441211,235.477816,
+ -0.784007,0.595259,0.176069,54.192663,-55.643275,234.692917,
+ -0.616289,0.754344,0.226171,51.559966,-56.610708,226.240653,
+ -0.616289,0.754344,0.226171,48.676224,-59.919148,229.417363,
+ -0.616289,0.754344,0.226171,51.48534,-59.441211,235.477816,
+ -0.674887,0.724209,0.141594,51.559966,-56.610708,226.240653,
+ -0.674887,0.724209,0.141594,50.189253,-56.706843,220.199062,
+ -0.674887,0.724209,0.141594,48.676224,-59.919148,229.417363,
+ -0.875892,0.481902,0.024166,50.189253,-56.706843,220.199062,
+ -0.875892,0.481902,0.024166,47.21829,-62.218475,222.426288,
+ -0.875892,0.481902,0.024166,48.676224,-59.919148,229.417363,
+ -0.906576,0.419121,0.049581,52.828916,-49.930551,211.182766,
+ -0.906576,0.419121,0.049581,50.189253,-56.706843,220.199062,
+ -0.906576,0.419121,0.049581,55.015894,-46.231791,219.904573,
+ -0.888689,0.414968,0.195022,55.015894,-46.231791,219.904573,
+ -0.888689,0.414968,0.195022,50.189253,-56.706843,220.199062,
+ -0.888689,0.414968,0.195022,51.559966,-56.610708,226.240653,
+ -0.930778,0.357265,0.077544,55.015894,-46.231791,219.904573,
+ -0.930778,0.357265,0.077544,51.559966,-56.610708,226.240653,
+ -0.930778,0.357265,0.077544,57.139866,-43.986007,235.052206,
+ -0.936597,0.228607,0.265564,51.559966,-56.610708,226.240653,
+ -0.936597,0.228607,0.265564,54.192663,-55.643275,234.692917,
+ -0.936597,0.228607,0.265564,57.139866,-43.986007,235.052206,
+ -0.946588,0.296126,0.127592,54.192663,-55.643275,234.692917,
+ -0.946588,0.296126,0.127592,55.939367,-54.5648,245.148499,
+ -0.946588,0.296126,0.127592,56.880363,-51.012981,243.886272,
+ -0.804813,0.588935,0.073704,54.192663,-55.643275,234.692917,
+ -0.804813,0.588935,0.073704,51.48534,-59.441211,235.477816,
+ -0.804813,0.588935,0.073704,55.939367,-54.5648,245.148499,
+ -0.960748,0.238532,0.141652,54.192663,-55.643275,234.692917,
+ -0.960748,0.238532,0.141652,60.09717,-41.324653,250.628492,
+ -0.960748,0.238532,0.141652,57.139866,-43.986007,235.052206,
+ -0.963902,0.190818,0.185692,54.192663,-55.643275,234.692917,
+ -0.963902,0.190818,0.185692,56.880363,-51.012981,243.886272,
+ -0.963902,0.190818,0.185692,60.09717,-41.324653,250.628492,
+ -0.322724,-0.881846,-0.343797,66.25969,-48.53264,271.968915,
+ -0.322724,-0.881846,-0.343797,61.11188,-46.799474,272.355584,
+ -0.322724,-0.881846,-0.343797,62.349191,-45.493135,267.843329,
+ -0.536137,-0.837121,-0.108559,66.25969,-48.53264,271.968915,
+ -0.536137,-0.837121,-0.108559,62.349191,-45.493135,267.843329,
+ -0.536137,-0.837121,-0.108559,66.093188,-47.92267,268.087621,
+ -0.111013,-0.991166,-0.072571,65.966904,-47.448384,273.791523,
+ -0.111013,-0.991166,-0.072571,60.89439,-46.925423,274.40849,
+ -0.111013,-0.991166,-0.072571,61.11188,-46.799474,272.355584,
+ -0.250962,-0.8491,0.464808,66.25969,-48.53264,271.968915,
+ -0.250962,-0.8491,0.464808,65.966904,-47.448384,273.791523,
+ -0.250962,-0.8491,0.464808,61.11188,-46.799474,272.355584,
+ -0.00212,-0.64607,0.763275,59.975845,-44.340733,276.593733,
+ -0.00212,-0.64607,0.763275,60.89439,-46.925423,274.40849,
+ -0.00212,-0.64607,0.763275,64.125313,-44.705498,276.296506,
+ 0.022007,-0.666099,0.745538,64.125313,-44.705498,276.296506,
+ 0.022007,-0.666099,0.745538,60.89439,-46.925423,274.40849,
+ 0.022007,-0.666099,0.745538,65.966904,-47.448384,273.791523,
+ -0.166171,-0.907734,0.385235,59.975845,-44.340733,276.593733,
+ -0.166171,-0.907734,0.385235,54.491989,-43.793129,275.518605,
+ -0.166171,-0.907734,0.385235,55.118661,-44.749002,273.536583,
+ -0.352042,-0.674103,0.649347,60.89439,-46.925423,274.40849,
+ -0.352042,-0.674103,0.649347,59.975845,-44.340733,276.593733,
+ -0.352042,-0.674103,0.649347,55.118661,-44.749002,273.536583,
+ 0.461787,-0.876424,0.136506,70.733491,-46.654663,271.611452,
+ 0.461787,-0.876424,0.136506,70.21996,-46.668657,273.258826,
+ 0.461787,-0.876424,0.136506,68.129027,-48.003594,271.761434,
+ 0.277325,-0.876289,0.393965,70.21996,-46.668657,273.258826,
+ 0.277325,-0.876289,0.393965,67.928117,-47.443213,273.149306,
+ 0.277325,-0.876289,0.393965,68.129027,-48.003594,271.761434,
+ 0.269608,0.880221,0.390542,68.794883,-40.670266,271.612364,
+ 0.269608,0.880221,0.390542,65.978313,-39.732647,271.44352,
+ 0.269608,0.880221,0.390542,68.669025,-41.355075,273.242702,
+ 0.181365,0.849739,0.495025,68.669025,-41.355075,273.242702,
+ 0.181365,0.849739,0.495025,65.978313,-39.732647,271.44352,
+ 0.181365,0.849739,0.495025,66.237725,-41.507492,274.395104,
+ 0.180128,0.849887,0.495222,66.237725,-41.507492,274.395104,
+ 0.180128,0.849887,0.495222,65.978313,-39.732647,271.44352,
+ 0.180128,0.849887,0.495222,61.283675,-38.522443,271.074191,
+ 0.074575,0.794396,0.602804,66.237725,-41.507492,274.395104,
+ 0.074575,0.794396,0.602804,61.283675,-38.522443,271.074191,
+ 0.074575,0.794396,0.602804,62.160876,-41.511447,274.90468,
+ 0.212593,0.97254,0.094712,65.978313,-39.732647,271.44352,
+ 0.212593,0.97254,0.094712,64.353603,-38.412922,261.538888,
+ 0.212593,0.97254,0.094712,62.011867,-37.916732,261.700127,
+ 0.242793,0.966663,0.081322,65.978313,-39.732647,271.44352,
+ 0.242793,0.966663,0.081322,62.011867,-37.916732,261.700127,
+ 0.242793,0.966663,0.081322,61.283675,-38.522443,271.074191,
+ 0.487702,0.872794,-0.01944,68.794883,-40.670266,271.612364,
+ 0.487702,0.872794,-0.01944,66.332491,-39.515127,261.69891,
+ 0.487702,0.872794,-0.01944,64.353603,-38.412922,261.538888,
+ 0.310894,0.947462,0.075245,68.794883,-40.670266,271.612364,
+ 0.310894,0.947462,0.075245,64.353603,-38.412922,261.538888,
+ 0.310894,0.947462,0.075245,65.978313,-39.732647,271.44352,
+ 0.391239,0.908311,-0.147999,66.332491,-39.515127,261.69891,
+ 0.391239,0.908311,-0.147999,63.328458,-40.12175,250.034646,
+ 0.391239,0.908311,-0.147999,62.034136,-39.53916,250.188583,
+ 0.489583,0.852191,-0.184607,66.332491,-39.515127,261.69891,
+ 0.489583,0.852191,-0.184607,62.034136,-39.53916,250.188583,
+ 0.489583,0.852191,-0.184607,64.353603,-38.412922,261.538888,
+ -0.668633,0.740909,0.06312,64.353603,-38.412922,261.538888,
+ -0.668633,0.740909,0.06312,62.034136,-39.53916,250.188583,
+ -0.668633,0.740909,0.06312,60.09717,-41.324653,250.628492,
+ 0.175627,0.931944,-0.317231,64.353603,-38.412922,261.538888,
+ 0.175627,0.931944,-0.317231,60.09717,-41.324653,250.628492,
+ 0.175627,0.931944,-0.317231,62.011867,-37.916732,261.700127,
+ -0.04001,0.995454,-0.086432,62.034136,-39.53916,250.188583,
+ -0.04001,0.995454,-0.086432,60.401242,-40.948327,234.714821,
+ -0.04001,0.995454,-0.086432,59.077197,-41.004609,234.679531,
+ 0.394896,0.910242,-0.124566,63.328458,-40.12175,250.034646,
+ 0.394896,0.910242,-0.124566,60.401242,-40.948327,234.714821,
+ 0.394896,0.910242,-0.124566,62.034136,-39.53916,250.188583,
+ -0.827726,0.551079,0.105742,59.077197,-41.004609,234.679531,
+ -0.827726,0.551079,0.105742,57.139866,-43.986007,235.052206,
+ -0.827726,0.551079,0.105742,62.034136,-39.53916,250.188583,
+ -0.67741,0.7356,0.002928,62.034136,-39.53916,250.188583,
+ -0.67741,0.7356,0.002928,57.139866,-43.986007,235.052206,
+ -0.67741,0.7356,0.002928,60.09717,-41.324653,250.628492,
+ -0.361423,0.932244,-0.017178,60.401242,-40.948327,234.714821,
+ -0.361423,0.932244,-0.017178,59.08462,-41.762736,218.21917,
+ -0.361423,0.932244,-0.017178,57.224623,-42.4731,218.802064,
+ -0.039981,0.995371,-0.087396,60.401242,-40.948327,234.714821,
+ -0.039981,0.995371,-0.087396,57.224623,-42.4731,218.802064,
+ -0.039981,0.995371,-0.087396,59.077197,-41.004609,234.679531,
+ -0.854286,0.517212,0.051841,57.224623,-42.4731,218.802064,
+ -0.854286,0.517212,0.051841,55.015894,-46.231791,219.904573,
+ -0.854286,0.517212,0.051841,59.077197,-41.004609,234.679531,
+ -0.835911,0.547682,0.036011,55.015894,-46.231791,219.904573,
+ -0.835911,0.547682,0.036011,57.139866,-43.986007,235.052206,
+ -0.835911,0.547682,0.036011,59.077197,-41.004609,234.679531,
+ -0.974155,0.020418,0.224958,48.401418,-79.647182,234.103939,
+ -0.974155,0.020418,0.224958,50.527185,-88.534183,244.115961,
+ -0.974155,0.020418,0.224958,50.324602,-82.523015,242.693104,
+ -0.986283,-0.142957,0.082516,48.401418,-79.647182,234.103939,
+ -0.986283,-0.142957,0.082516,49.359755,-85.342262,235.69199,
+ -0.986283,-0.142957,0.082516,50.527185,-88.534183,244.115961,
+ -0.922465,-0.04842,0.383033,44.875154,-77.705623,225.857026,
+ -0.922465,-0.04842,0.383033,49.359755,-85.342262,235.69199,
+ -0.922465,-0.04842,0.383033,48.401418,-79.647182,234.103939,
+ -0.889544,-0.453729,0.053308,44.875154,-77.705623,225.857026,
+ -0.889544,-0.453729,0.053308,47.903707,-83.523913,226.871918,
+ -0.889544,-0.453729,0.053308,49.359755,-85.342262,235.69199,
+ -0.801244,-0.330006,0.499104,42.780874,-77.927707,222.348103,
+ -0.801244,-0.330006,0.499104,47.903707,-83.523913,226.871918,
+ -0.801244,-0.330006,0.499104,44.875154,-77.705623,225.857026,
+ -0.805552,-0.539682,0.244603,42.780874,-77.927707,222.348103,
+ -0.805552,-0.539682,0.244603,46.625052,-83.391575,222.952901,
+ -0.805552,-0.539682,0.244603,47.903707,-83.523913,226.871918,
+ -0.694468,-0.424278,0.581121,40.813455,-78.170478,219.819694,
+ -0.694468,-0.424278,0.581121,46.625052,-83.391575,222.952901,
+ -0.694468,-0.424278,0.581121,42.780874,-77.927707,222.348103,
+ -0.718752,-0.529993,0.450003,44.193691,-82.885042,219.666061,
+ -0.718752,-0.529993,0.450003,46.625052,-83.391575,222.952901,
+ -0.718752,-0.529993,0.450003,40.813455,-78.170478,219.819694,
+ -0.913773,0.227001,0.336882,50.324602,-82.523015,242.693104,
+ -0.913773,0.227001,0.336882,52.068264,-90.44958,252.763842,
+ -0.913773,0.227001,0.336882,52.235131,-85.107705,249.616946,
+ -0.984113,0.008807,0.177323,50.324602,-82.523015,242.693104,
+ -0.984113,0.008807,0.177323,50.527185,-88.534183,244.115961,
+ -0.984113,0.008807,0.177323,52.068264,-90.44958,252.763842,
+ -0.956429,0.184552,0.226241,52.939989,-84.257398,251.397875,
+ -0.956429,0.184552,0.226241,52.068264,-90.44958,252.763842,
+ -0.956429,0.184552,0.226241,52.862046,-89.340682,255.214977,
+ -0.940328,0.194039,0.27952,52.235131,-85.107705,249.616946,
+ -0.940328,0.194039,0.27952,52.068264,-90.44958,252.763842,
+ -0.940328,0.194039,0.27952,52.939989,-84.257398,251.397875,
+ -0.94446,0.227775,0.236885,54.201941,-81.389475,252.911695,
+ -0.94446,0.227775,0.236885,52.862046,-89.340682,255.214977,
+ -0.94446,0.227775,0.236885,53.600155,-86.360196,255.291946,
+ -0.920429,0.243656,0.305685,52.939989,-84.257398,251.397875,
+ -0.920429,0.243656,0.305685,52.862046,-89.340682,255.214977,
+ -0.920429,0.243656,0.305685,54.201941,-81.389475,252.911695,
+ -0.921907,0.187016,0.339282,53.782872,-76.405064,249.025534,
+ -0.921907,0.187016,0.339282,52.235131,-85.107705,249.616946,
+ -0.921907,0.187016,0.339282,54.201941,-81.389475,252.911695,
+ -0.929639,0.287242,0.230789,52.235131,-85.107705,249.616946,
+ -0.929639,0.287242,0.230789,52.939989,-84.257398,251.397875,
+ -0.929639,0.287242,0.230789,54.201941,-81.389475,252.911695,
+ -0.887129,0.024432,0.460875,50.324602,-82.523015,242.693104,
+ -0.887129,0.024432,0.460875,53.782872,-76.405064,249.025534,
+ -0.887129,0.024432,0.460875,51.327295,-75.750069,244.264119,
+ -0.926858,0.186962,0.325546,50.324602,-82.523015,242.693104,
+ -0.926858,0.186962,0.325546,52.235131,-85.107705,249.616946,
+ -0.926858,0.186962,0.325546,53.782872,-76.405064,249.025534,
+ -0.853364,0.210337,0.476999,55.939367,-54.5648,245.148499,
+ -0.853364,0.210337,0.476999,54.765578,-62.115647,246.378174,
+ -0.853364,0.210337,0.476999,57.7422,-55.050646,248.588059,
+ -0.802238,0.215385,0.556797,52.570234,-62.042634,243.18686,
+ -0.802238,0.215385,0.556797,54.765578,-62.115647,246.378174,
+ -0.802238,0.215385,0.556797,55.939367,-54.5648,245.148499,
+ -0.812604,0.152575,0.562491,52.570234,-62.042634,243.18686,
+ -0.812604,0.152575,0.562491,53.952234,-70.119485,247.374204,
+ -0.812604,0.152575,0.562491,54.765578,-62.115647,246.378174,
+ -0.839613,0.129788,0.527451,52.570234,-62.042634,243.18686,
+ -0.839613,0.129788,0.527451,52.067047,-70.846581,244.552219,
+ -0.839613,0.129788,0.527451,53.952234,-70.119485,247.374204,
+ -0.838899,0.095071,0.535919,51.327295,-75.750069,244.264119,
+ -0.838899,0.095071,0.535919,53.952234,-70.119485,247.374204,
+ -0.838899,0.095071,0.535919,52.067047,-70.846581,244.552219,
+ -0.870777,0.146747,0.469268,51.327295,-75.750069,244.264119,
+ -0.870777,0.146747,0.469268,53.782872,-76.405064,249.025534,
+ -0.870777,0.146747,0.469268,53.952234,-70.119485,247.374204,
+ -0.016731,-0.335345,0.941947,38.715828,-89.78485,213.722126,
+ -0.016731,-0.335345,0.941947,30.889657,-94.360079,211.954279,
+ -0.016731,-0.335345,0.941947,35.62065,-94.282502,212.065929,
+ -0.205258,-0.336287,0.919119,37.01491,-82.017698,216.845902,
+ -0.205258,-0.336287,0.919119,34.433262,-86.182529,214.745537,
+ -0.205258,-0.336287,0.919119,43.251813,-86.890459,216.455886,
+ -0.203897,-0.484139,0.850902,34.433262,-86.182529,214.745537,
+ -0.203897,-0.484139,0.850902,38.715828,-89.78485,213.722126,
+ -0.203897,-0.484139,0.850902,43.251813,-86.890459,216.455886,
+ -0.386494,-0.26223,0.884227,33.301244,-78.994926,216.11911,
+ -0.386494,-0.26223,0.884227,29.702878,-84.334367,212.962782,
+ -0.386494,-0.26223,0.884227,37.01491,-82.017698,216.845902,
+ -0.411441,-0.194067,0.890536,37.01491,-82.017698,216.845902,
+ -0.411441,-0.194067,0.890536,29.702878,-84.334367,212.962782,
+ -0.411441,-0.194067,0.890536,34.433262,-86.182529,214.745537,
+ -0.409582,-0.187033,0.892895,29.702878,-84.334367,212.962782,
+ -0.409582,-0.187033,0.892895,28.454038,-92.707228,210.636075,
+ -0.409582,-0.187033,0.892895,34.433262,-86.182529,214.745537,
+ -0.511462,-0.070681,0.856394,34.433262,-86.182529,214.745537,
+ -0.511462,-0.070681,0.856394,28.454038,-92.707228,210.636075,
+ -0.511462,-0.070681,0.856394,30.889657,-94.360079,211.954279,
+ -0.832394,-0.057577,0.551185,26.370709,-97.079236,207.033146,
+ -0.832394,-0.057577,0.551185,28.80998,-98.164709,210.603523,
+ -0.832394,-0.057577,0.551185,28.454038,-92.707228,210.636075,
+ -0.495194,-0.037474,0.867974,28.454038,-92.707228,210.636075,
+ -0.495194,-0.037474,0.867974,28.80998,-98.164709,210.603523,
+ -0.495194,-0.037474,0.867974,30.889657,-94.360079,211.954279,
+ -0.939836,0.153336,0.30528,24.254829,-102.176515,203.079447,
+ -0.939836,0.153336,0.30528,25.066195,-104.296046,206.641914,
+ -0.939836,0.153336,0.30528,26.370709,-97.079236,207.033146,
+ -0.803911,0.113667,0.583787,25.066195,-104.296046,206.641914,
+ -0.803911,0.113667,0.583787,28.80998,-98.164709,210.603523,
+ -0.803911,0.113667,0.583787,26.370709,-97.079236,207.033146,
+ -0.933095,0.214966,0.288312,20.506177,-111.689609,198.040275,
+ -0.933095,0.214966,0.288312,21.254873,-114.806996,202.787696,
+ -0.933095,0.214966,0.288312,24.254829,-102.176515,203.079447,
+ -0.918618,0.210462,0.334436,21.254873,-114.806996,202.787696,
+ -0.918618,0.210462,0.334436,25.066195,-104.296046,206.641914,
+ -0.918618,0.210462,0.334436,24.254829,-102.176515,203.079447,
+ -0.883877,0.220734,0.412357,16.432918,-124.47129,196.151346,
+ -0.883877,0.220734,0.412357,18.249441,-126.615767,201.192952,
+ -0.883877,0.220734,0.412357,20.506177,-111.689609,198.040275,
+ -0.938683,0.201079,0.280074,20.506177,-111.689609,198.040275,
+ -0.938683,0.201079,0.280074,18.249441,-126.615767,201.192952,
+ -0.938683,0.201079,0.280074,21.254873,-114.806996,202.787696,
+ 0.215941,-0.23561,0.947553,35.62065,-94.282502,212.065929,
+ 0.215941,-0.23561,0.947553,32.827871,-99.284254,211.458697,
+ 0.215941,-0.23561,0.947553,34.809588,-101.932527,210.348583,
+ 0.290843,-0.238821,0.926485,35.62065,-94.282502,212.065929,
+ 0.290843,-0.238821,0.926485,34.809588,-101.932527,210.348583,
+ 0.290843,-0.238821,0.926485,37.585635,-95.423039,211.155081,
+ -0.016954,-0.326279,0.945122,35.62065,-94.282502,212.065929,
+ -0.016954,-0.326279,0.945122,30.889657,-94.360079,211.954279,
+ -0.016954,-0.326279,0.945122,28.80998,-98.164709,210.603523,
+ -0.208756,-0.002168,0.977965,35.62065,-94.282502,212.065929,
+ -0.208756,-0.002168,0.977965,28.80998,-98.164709,210.603523,
+ -0.208756,-0.002168,0.977965,32.827871,-99.284254,211.458697,
+ 0.671752,-0.216929,0.708302,34.809588,-101.932527,210.348583,
+ 0.671752,-0.216929,0.708302,35.516301,-103.912114,209.072058,
+ 0.671752,-0.216929,0.708302,38.029802,-102.413505,207.14723,
+ 0.631951,-0.354866,0.68899,37.585635,-95.423039,211.155081,
+ 0.631951,-0.354866,0.68899,34.809588,-101.932527,210.348583,
+ 0.631951,-0.354866,0.68899,38.029802,-102.413505,207.14723,
+ 0.475617,-0.796283,-0.373793,17.874637,-145.280538,197.73453,
+ 0.475617,-0.796283,-0.373793,10.240432,-149.431983,196.864448,
+ 0.475617,-0.796283,-0.373793,17.442942,-143.777974,193.984356,
+ 0.315688,-0.718088,-0.620234,17.442942,-143.777974,193.984356,
+ 0.315688,-0.718088,-0.620234,10.240432,-149.431983,196.864448,
+ 0.315688,-0.718088,-0.620234,9.214283,-146.755113,193.242962,
+ 0.135692,-0.77796,-0.613487,10.240432,-149.431983,196.864448,
+ 0.135692,-0.77796,-0.613487,0.020624,-151.73344,197.522485,
+ 0.135692,-0.77796,-0.613487,9.214283,-146.755113,193.242962,
+ 0.116491,-0.762357,-0.636586,9.214283,-146.755113,193.242962,
+ 0.116491,-0.762357,-0.636586,0.020624,-151.73344,197.522485,
+ 0.116491,-0.762357,-0.636586,0.020624,-148.174928,193.260911,
+ 0.777423,-0.577932,-0.24821,22.138645,-138.383773,195.031497,
+ 0.777423,-0.577932,-0.24821,22.434351,-139.436693,198.409299,
+ 0.777423,-0.577932,-0.24821,17.874637,-145.280538,197.73453,
+ 0.744414,-0.58582,-0.32041,17.442942,-143.777974,193.984356,
+ 0.744414,-0.58582,-0.32041,22.138645,-138.383773,195.031497,
+ 0.744414,-0.58582,-0.32041,17.874637,-145.280538,197.73453,
+ 0.908655,-0.416859,0.023978,26.883023,-129.810123,197.183579,
+ 0.908655,-0.416859,0.023978,26.643903,-130.106133,201.098946,
+ 0.908655,-0.416859,0.023978,22.434351,-139.436693,198.409299,
+ 0.876706,-0.432068,-0.211433,22.138645,-138.383773,195.031497,
+ 0.876706,-0.432068,-0.211433,26.883023,-129.810123,197.183579,
+ 0.876706,-0.432068,-0.211433,22.434351,-139.436693,198.409299,
+ 0.866616,-0.411296,0.28251,32.384616,-118.321395,200.645956,
+ 0.866616,-0.411296,0.28251,31.224,-118.657563,203.716797,
+ 0.866616,-0.411296,0.28251,26.643903,-130.106133,201.098946,
+ 0.899123,-0.43715,0.021862,26.883023,-129.810123,197.183579,
+ 0.899123,-0.43715,0.021862,32.384616,-118.321395,200.645956,
+ 0.899123,-0.43715,0.021862,26.643903,-130.106133,201.098946,
+ 0.744036,-0.376179,0.552177,31.224,-118.657563,203.716797,
+ 0.744036,-0.376179,0.552177,36.094936,-108.789439,203.87621,
+ 0.744036,-0.376179,0.552177,33.352962,-110.50496,206.402185,
+ 0.859589,-0.428785,0.27794,32.384616,-118.321395,200.645956,
+ 0.859589,-0.428785,0.27794,36.094936,-108.789439,203.87621,
+ 0.859589,-0.428785,0.27794,31.224,-118.657563,203.716797,
+ 0.695393,-0.48369,0.531481,36.094936,-108.789439,203.87621,
+ 0.695393,-0.48369,0.531481,38.029802,-102.413505,207.14723,
+ 0.695393,-0.48369,0.531481,35.516301,-103.912114,209.072058,
+ 0.741186,-0.446286,0.50147,36.094936,-108.789439,203.87621,
+ 0.741186,-0.446286,0.50147,35.516301,-103.912114,209.072058,
+ 0.741186,-0.446286,0.50147,33.352962,-110.50496,206.402185,
+ 0.760478,0.608214,-0.227486,64.604649,-41.755435,249.933035,
+ 0.760478,0.608214,-0.227486,63.328458,-40.12175,250.034646,
+ 0.760478,0.608214,-0.227486,66.332491,-39.515127,261.69891,
+ 0.767739,0.599263,-0.226848,64.604649,-41.755435,249.933035,
+ 0.767739,0.599263,-0.226848,66.332491,-39.515127,261.69891,
+ 0.767739,0.599263,-0.226848,68.063618,-42.116549,260.685539,
+ 0.710117,0.682621,-0.172515,61.603719,-42.34563,234.135578,
+ 0.710117,0.682621,-0.172515,60.401242,-40.948327,234.714821,
+ 0.710117,0.682621,-0.172515,63.328458,-40.12175,250.034646,
+ 0.771514,0.613226,-0.169469,61.603719,-42.34563,234.135578,
+ 0.771514,0.613226,-0.169469,63.328458,-40.12175,250.034646,
+ 0.771514,0.613226,-0.169469,64.604649,-41.755435,249.933035,
+ 0.432857,0.898005,-0.078885,60.902513,-42.676626,217.790822,
+ 0.432857,0.898005,-0.078885,59.08462,-41.762736,218.21917,
+ 0.432857,0.898005,-0.078885,60.401242,-40.948327,234.714821,
+ 0.747785,0.662381,-0.045495,60.902513,-42.676626,217.790822,
+ 0.747785,0.662381,-0.045495,60.401242,-40.948327,234.714821,
+ 0.747785,0.662381,-0.045495,61.603719,-42.34563,234.135578,
+ 0.323764,-0.428402,0.843593,34.809588,-101.932527,210.348583,
+ 0.323764,-0.428402,0.843593,31.911243,-109.212615,207.763893,
+ 0.323764,-0.428402,0.843593,35.516301,-103.912114,209.072058,
+ 0.366018,-0.449981,0.814584,35.516301,-103.912114,209.072058,
+ 0.366018,-0.449981,0.814584,31.911243,-109.212615,207.763893,
+ 0.366018,-0.449981,0.814584,33.352962,-110.50496,206.402185,
+ -0.253911,-0.31667,0.91392,32.827871,-99.284254,211.458697,
+ -0.253911,-0.31667,0.91392,28.265114,-106.945839,207.536333,
+ -0.253911,-0.31667,0.91392,31.911243,-109.212615,207.763893,
+ 0.052281,-0.352537,0.934336,32.827871,-99.284254,211.458697,
+ 0.052281,-0.352537,0.934336,31.911243,-109.212615,207.763893,
+ 0.052281,-0.352537,0.934336,34.809588,-101.932527,210.348583,
+ -0.458563,-0.267548,0.84743,28.80998,-98.164709,210.603523,
+ -0.458563,-0.267548,0.84743,25.066195,-104.296046,206.641914,
+ -0.458563,-0.267548,0.84743,28.265114,-106.945839,207.536333,
+ -0.278088,-0.301325,0.91207,28.80998,-98.164709,210.603523,
+ -0.278088,-0.301325,0.91207,28.265114,-106.945839,207.536333,
+ -0.278088,-0.301325,0.91207,32.827871,-99.284254,211.458697,
+ 0.131977,-0.860795,-0.491542,9.214283,-146.755113,193.242962,
+ 0.131977,-0.860795,-0.491542,0.020624,-148.174928,193.260911,
+ 0.131977,-0.860795,-0.491542,8.860774,-144.308237,188.863044,
+ 0.18134,-0.890118,-0.418099,8.860774,-144.308237,188.863044,
+ 0.18134,-0.890118,-0.418099,0.020624,-148.174928,193.260911,
+ 0.18134,-0.890118,-0.418099,0.020624,-146.382134,189.444113,
+ 0.439726,-0.877424,0.191751,54.114294,-91.445002,258.355181,
+ 0.439726,-0.877424,0.191751,53.799879,-91.565475,258.524938,
+ 0.439726,-0.877424,0.191751,52.504096,-93.1517,254.238113,
+ 0.50777,-0.847821,0.152867,54.114294,-91.445002,258.355181,
+ 0.50777,-0.847821,0.152867,52.504096,-93.1517,254.238113,
+ 0.50777,-0.847821,0.152867,53.237368,-92.797887,253.76474,
+ 0.895457,-0.267047,0.356149,53.799879,-91.565475,258.524938,
+ 0.895457,-0.267047,0.356149,55.270712,-86.127161,258.90461,
+ 0.895457,-0.267047,0.356149,55.127027,-86.138721,259.257206,
+ 0.523618,-0.199442,0.82828,55.270712,-86.127161,258.90461,
+ 0.523618,-0.199442,0.82828,53.799879,-91.565475,258.524938,
+ 0.523618,-0.199442,0.82828,54.114294,-91.445002,258.355181,
+ 0.289386,-0.925692,-0.243619,53.237368,-92.797887,253.76474,
+ 0.289386,-0.925692,-0.243619,52.504096,-93.1517,254.238113,
+ 0.289386,-0.925692,-0.243619,51.142692,-90.666796,243.178951,
+ 0.759852,-0.591622,-0.26946,52.139361,-89.211995,242.795324,
+ 0.759852,-0.591622,-0.26946,53.237368,-92.797887,253.76474,
+ 0.759852,-0.591622,-0.26946,51.142692,-90.666796,243.178951,
+ 0.745194,-0.591647,-0.307634,50.38204,-87.24123,234.748286,
+ 0.745194,-0.591647,-0.307634,52.139361,-89.211995,242.795324,
+ 0.745194,-0.591647,-0.307634,51.142692,-90.666796,243.178951,
+ 0.697179,-0.646166,-0.310501,50.38204,-87.24123,234.748286,
+ 0.697179,-0.646166,-0.310501,51.641559,-85.98022,234.952116,
+ 0.697179,-0.646166,-0.310501,52.139361,-89.211995,242.795324,
+ 0.710796,-0.682349,-0.170789,49.580531,-85.965922,226.317317,
+ 0.710796,-0.682349,-0.170789,51.641559,-85.98022,234.952116,
+ 0.710796,-0.682349,-0.170789,50.38204,-87.24123,234.748286,
+ 0.800381,-0.56792,-0.191982,49.580531,-85.965922,226.317317,
+ 0.800381,-0.56792,-0.191982,50.710024,-84.418941,226.449959,
+ 0.800381,-0.56792,-0.191982,51.641559,-85.98022,234.952116,
+ -0.711534,-0.675582,-0.193155,49.78217,-87.037704,235.497591,
+ -0.711534,-0.675582,-0.193155,51.142692,-90.666796,243.178951,
+ -0.711534,-0.675582,-0.193155,50.603029,-90.104589,243.200551,
+ -0.58487,-0.7685,-0.259489,51.142692,-90.666796,243.178951,
+ -0.58487,-0.7685,-0.259489,49.78217,-87.037704,235.497591,
+ -0.58487,-0.7685,-0.259489,50.38204,-87.24123,234.748286,
+ -0.442565,-0.889631,-0.112662,50.38204,-87.24123,234.748286,
+ -0.442565,-0.889631,-0.112662,49.78217,-87.037704,235.497591,
+ -0.442565,-0.889631,-0.112662,48.570293,-85.310622,226.620325,
+ -0.557899,-0.826778,-0.072024,50.38204,-87.24123,234.748286,
+ -0.557899,-0.826778,-0.072024,48.570293,-85.310622,226.620325,
+ -0.557899,-0.826778,-0.072024,49.580531,-85.965922,226.317317,
+ -0.81291,-0.582022,-0.020665,50.603029,-90.104589,243.200551,
+ -0.81291,-0.582022,-0.020665,52.504096,-93.1517,254.238113,
+ -0.81291,-0.582022,-0.020665,52.032366,-92.464762,253.447434,
+ -0.72111,-0.689652,-0.066189,51.142692,-90.666796,243.178951,
+ -0.72111,-0.689652,-0.066189,52.504096,-93.1517,254.238113,
+ -0.72111,-0.689652,-0.066189,50.603029,-90.104589,243.200551,
+ -0.659727,-0.719207,0.217947,48.570293,-85.310622,226.620325,
+ -0.659727,-0.719207,0.217947,47.110594,-85.36447,222.024104,
+ -0.659727,-0.719207,0.217947,48.198348,-86.231814,222.454581,
+ -0.480094,-0.846512,0.230059,49.580531,-85.965922,226.317317,
+ -0.480094,-0.846512,0.230059,48.570293,-85.310622,226.620325,
+ -0.480094,-0.846512,0.230059,48.198348,-86.231814,222.454581,
+ 0.372842,-0.925272,-0.069721,49.580531,-85.965922,226.317317,
+ 0.372842,-0.925272,-0.069721,48.198348,-86.231814,222.454581,
+ 0.372842,-0.925272,-0.069721,49.461609,-85.675692,221.829704,
+ 0.808631,-0.585321,-0.059283,49.461609,-85.675692,221.829704,
+ 0.808631,-0.585321,-0.059283,50.710024,-84.418941,226.449959,
+ 0.808631,-0.585321,-0.059283,49.580531,-85.965922,226.317317,
+ 0.264047,-0.909375,0.321428,48.198348,-86.231814,222.454581,
+ 0.264047,-0.909375,0.321428,46.491802,-89.219905,215.402661,
+ 0.264047,-0.909375,0.321428,47.684665,-89.148717,214.624151,
+ 0.49776,-0.822931,0.273896,49.461609,-85.675692,221.829704,
+ 0.49776,-0.822931,0.273896,48.198348,-86.231814,222.454581,
+ 0.49776,-0.822931,0.273896,47.684665,-89.148717,214.624151,
+ -0.398811,-0.775787,0.488983,47.110594,-85.36447,222.024104,
+ -0.398811,-0.775787,0.488983,43.251813,-86.890459,216.455886,
+ -0.398811,-0.775787,0.488983,46.491802,-89.219905,215.402661,
+ -0.661361,-0.619673,0.42262,46.491802,-89.219905,215.402661,
+ -0.661361,-0.619673,0.42262,48.198348,-86.231814,222.454581,
+ -0.661361,-0.619673,0.42262,47.110594,-85.36447,222.024104,
+ 0.260244,-0.912609,0.315306,47.684665,-89.148717,214.624151,
+ 0.260244,-0.912609,0.315306,46.491802,-89.219905,215.402661,
+ 0.260244,-0.912609,0.315306,41.326681,-91.724888,212.415483,
+ 0.005348,-0.658445,0.75261,47.684665,-89.148717,214.624151,
+ 0.005348,-0.658445,0.75261,41.326681,-91.724888,212.415483,
+ 0.005348,-0.658445,0.75261,41.854815,-95.141936,209.42222,
+ -0.136129,-0.559114,0.817839,43.251813,-86.890459,216.455886,
+ -0.136129,-0.559114,0.817839,38.715828,-89.78485,213.722126,
+ -0.136129,-0.559114,0.817839,46.491802,-89.219905,215.402661,
+ -0.113676,-0.655702,0.746413,46.491802,-89.219905,215.402661,
+ -0.113676,-0.655702,0.746413,38.715828,-89.78485,213.722126,
+ -0.113676,-0.655702,0.746413,41.326681,-91.724888,212.415483,
+ 0.158208,-0.435244,0.886303,38.715828,-89.78485,213.722126,
+ 0.158208,-0.435244,0.886303,35.62065,-94.282502,212.065929,
+ 0.158208,-0.435244,0.886303,37.585635,-95.423039,211.155081,
+ 0.12604,-0.431881,0.89308,38.715828,-89.78485,213.722126,
+ 0.12604,-0.431881,0.89308,37.585635,-95.423039,211.155081,
+ 0.12604,-0.431881,0.89308,41.326681,-91.724888,212.415483,
+ 0.185449,-0.47986,0.857521,41.326681,-91.724888,212.415483,
+ 0.185449,-0.47986,0.857521,37.585635,-95.423039,211.155081,
+ 0.185449,-0.47986,0.857521,38.029802,-102.413505,207.14723,
+ 0.552311,-0.499369,0.66752,41.326681,-91.724888,212.415483,
+ 0.552311,-0.499369,0.66752,38.029802,-102.413505,207.14723,
+ 0.552311,-0.499369,0.66752,41.854815,-95.141936,209.42222,
+ 0.626719,-0.773908,-0.091047,20.911404,-131.671063,168.383454,
+ 0.626719,-0.773908,-0.091047,20.658289,-133.250596,180.067311,
+ 0.626719,-0.773908,-0.091047,14.878331,-137.63964,177.588491,
+ 0.686632,-0.726697,-0.021167,20.911404,-131.671063,168.383454,
+ 0.686632,-0.726697,-0.021167,14.878331,-137.63964,177.588491,
+ 0.686632,-0.726697,-0.021167,15.550667,-136.673728,166.237121,
+ 0.504858,-0.862108,-0.043456,15.550667,-136.673728,166.237121,
+ 0.504858,-0.862108,-0.043456,14.878331,-137.63964,177.588491,
+ 0.504858,-0.862108,-0.043456,7.385286,-141.978183,176.607367,
+ 0.512395,-0.858019,-0.03543,15.550667,-136.673728,166.237121,
+ 0.512395,-0.858019,-0.03543,7.385286,-141.978183,176.607367,
+ 0.512395,-0.858019,-0.03543,7.876304,-141.25565,166.210805,
+ 0.689565,-0.682147,-0.243262,20.658289,-133.250596,180.067311,
+ 0.689565,-0.682147,-0.243262,22.047682,-135.79817,191.149594,
+ 0.689565,-0.682147,-0.243262,16.175848,-141.025961,189.16453,
+ 0.653772,-0.703365,-0.279033,20.658289,-133.250596,180.067311,
+ 0.653772,-0.703365,-0.279033,16.175848,-141.025961,189.16453,
+ 0.653772,-0.703365,-0.279033,14.878331,-137.63964,177.588491,
+ 0.400945,-0.866169,-0.29832,16.175848,-141.025961,189.16453,
+ 0.400945,-0.866169,-0.29832,8.860774,-144.308237,188.863044,
+ 0.400945,-0.866169,-0.29832,14.878331,-137.63964,177.588491,
+ 0.510222,-0.831555,-0.219522,14.878331,-137.63964,177.588491,
+ 0.510222,-0.831555,-0.219522,8.860774,-144.308237,188.863044,
+ 0.510222,-0.831555,-0.219522,7.385286,-141.978183,176.607367,
+ 0.730618,-0.560247,-0.390282,22.047682,-135.79817,191.149594,
+ 0.730618,-0.560247,-0.390282,22.138645,-138.383773,195.031497,
+ 0.730618,-0.560247,-0.390282,17.442942,-143.777974,193.984356,
+ 0.665259,-0.559503,-0.494355,16.175848,-141.025961,189.16453,
+ 0.665259,-0.559503,-0.494355,22.047682,-135.79817,191.149594,
+ 0.665259,-0.559503,-0.494355,17.442942,-143.777974,193.984356,
+ 0.330054,-0.77977,-0.532,17.442942,-143.777974,193.984356,
+ 0.330054,-0.77977,-0.532,9.214283,-146.755113,193.242962,
+ 0.330054,-0.77977,-0.532,16.175848,-141.025961,189.16453,
+ 0.376507,-0.795494,-0.474797,16.175848,-141.025961,189.16453,
+ 0.376507,-0.795494,-0.474797,9.214283,-146.755113,193.242962,
+ 0.376507,-0.795494,-0.474797,8.860774,-144.308237,188.863044,
+ -0.033526,-0.309808,0.950208,34.433262,-86.182529,214.745537,
+ -0.033526,-0.309808,0.950208,30.889657,-94.360079,211.954279,
+ -0.033526,-0.309808,0.950208,38.715828,-89.78485,213.722126,
+ -0.256479,0.745723,0.614911,7.584249,-140.885713,199.276339,
+ -0.256479,0.745723,0.614911,5.020551,-135.976141,192.253016,
+ -0.256479,0.745723,0.614911,0.020624,-137.635076,192.179394,
+ -0.262632,0.740221,0.618948,7.584249,-140.885713,199.276339,
+ -0.262632,0.740221,0.618948,0.020624,-137.635076,192.179394,
+ -0.262632,0.740221,0.618948,0.020624,-143.561671,199.267212,
+ -0.49194,0.538839,0.683848,8.429384,-133.707236,192.917442,
+ -0.49194,0.538839,0.683848,5.020551,-135.976141,192.253016,
+ -0.49194,0.538839,0.683848,11.302783,-138.521282,198.777715,
+ -0.360514,0.697564,0.619221,11.302783,-138.521282,198.777715,
+ -0.360514,0.697564,0.619221,5.020551,-135.976141,192.253016,
+ -0.360514,0.697564,0.619221,7.584249,-140.885713,199.276339,
+ -0.78561,0.413714,0.460063,11.429949,-129.977142,192.55937,
+ -0.78561,0.413714,0.460063,16.432918,-124.47129,196.151346,
+ -0.78561,0.413714,0.460063,15.177384,-123.03596,192.716654,
+ -0.756777,0.313423,0.573633,11.429949,-129.977142,192.55937,
+ -0.756777,0.313423,0.573633,14.202953,-133.59011,198.191779,
+ -0.756777,0.313423,0.573633,16.432918,-124.47129,196.151346,
+ -0.625444,0.671338,0.39765,11.429949,-129.977142,192.55937,
+ -0.625444,0.671338,0.39765,9.990055,-126.083983,183.721957,
+ -0.625444,0.671338,0.39765,7.80542,-127.933667,183.408606,
+ -0.692164,0.595882,0.407227,7.80542,-127.933667,183.408606,
+ -0.692164,0.595882,0.407227,8.429384,-133.707236,192.917442,
+ -0.692164,0.595882,0.407227,11.429949,-129.977142,192.55937,
+ -0.779873,0.571087,0.256237,9.990055,-126.083983,183.721957,
+ -0.779873,0.571087,0.256237,15.177384,-123.03596,192.716654,
+ -0.779873,0.571087,0.256237,14.179528,-121.098051,185.36051,
+ -0.833535,0.442518,0.330752,9.990055,-126.083983,183.721957,
+ -0.833535,0.442518,0.330752,11.429949,-129.977142,192.55937,
+ -0.833535,0.442518,0.330752,15.177384,-123.03596,192.716654,
+ -0.475585,0.737728,0.479141,8.429384,-133.707236,192.917442,
+ -0.475585,0.737728,0.479141,7.80542,-127.933667,183.408606,
+ -0.475585,0.737728,0.479141,3.077166,-130.855133,183.213598,
+ -0.545504,0.673496,0.498827,8.429384,-133.707236,192.917442,
+ -0.545504,0.673496,0.498827,3.077166,-130.855133,183.213598,
+ -0.545504,0.673496,0.498827,5.020551,-135.976141,192.253016,
+ -0.163939,0.842775,0.512694,5.020551,-135.976141,192.253016,
+ -0.163939,0.842775,0.512694,3.077166,-130.855133,183.213598,
+ -0.163939,0.842775,0.512694,0.020624,-131.463582,183.236415,
+ -0.270917,0.792264,0.546737,5.020551,-135.976141,192.253016,
+ -0.270917,0.792264,0.546737,0.020624,-131.463582,183.236415,
+ -0.270917,0.792264,0.546737,0.020624,-137.635076,192.179394,
+ 0.056263,0.90293,0.426089,3.077166,-130.855133,183.213598,
+ 0.056263,0.90293,0.426089,1.448957,-126.095239,173.341854,
+ 0.056263,0.90293,0.426089,0.020624,-126.011578,173.353171,
+ -0.168263,0.863124,0.476135,3.077166,-130.855133,183.213598,
+ -0.168263,0.863124,0.476135,0.020624,-126.011578,173.353171,
+ -0.168263,0.863124,0.476135,0.020624,-131.463582,183.236415,
+ -0.213302,0.928409,0.304235,7.80542,-127.933667,183.408606,
+ -0.213302,0.928409,0.304235,7.277591,-124.839706,173.596946,
+ -0.213302,0.928409,0.304235,1.448957,-126.095239,173.341854,
+ -0.484274,0.75417,0.443515,7.80542,-127.933667,183.408606,
+ -0.484274,0.75417,0.443515,1.448957,-126.095239,173.341854,
+ -0.484274,0.75417,0.443515,3.077166,-130.855133,183.213598,
+ -0.715403,0.687032,0.127225,9.821515,-123.65962,174.687621,
+ -0.715403,0.687032,0.127225,14.179528,-121.098051,185.36051,
+ -0.715403,0.687032,0.127225,14.239765,-119.520952,177.182656,
+ -0.781369,0.598942,0.175303,9.821515,-123.65962,174.687621,
+ -0.781369,0.598942,0.175303,9.990055,-126.083983,183.721957,
+ -0.781369,0.598942,0.175303,14.179528,-121.098051,185.36051,
+ -0.489997,0.839605,0.234449,9.990055,-126.083983,183.721957,
+ -0.489997,0.839605,0.234449,9.821515,-123.65962,174.687621,
+ -0.489997,0.839605,0.234449,7.277591,-124.839706,173.596946,
+ -0.645301,0.717923,0.261101,9.990055,-126.083983,183.721957,
+ -0.645301,0.717923,0.261101,7.277591,-124.839706,173.596946,
+ -0.645301,0.717923,0.261101,7.80542,-127.933667,183.408606,
+ -0.579067,0.789617,-0.202942,11.676979,-124.295753,166.918188,
+ -0.579067,0.789617,-0.202942,9.100807,-126.4381,165.933383,
+ -0.579067,0.789617,-0.202942,9.821515,-123.65962,174.687621,
+ -0.310296,0.913166,-0.264281,9.821515,-123.65962,174.687621,
+ -0.310296,0.913166,-0.264281,9.100807,-126.4381,165.933383,
+ -0.310296,0.913166,-0.264281,7.277591,-124.839706,173.596946,
+ -0.74269,0.658623,-0.120945,11.676979,-124.295753,166.918188,
+ -0.74269,0.658623,-0.120945,14.239765,-119.520952,177.182656,
+ -0.74269,0.658623,-0.120945,15.91026,-119.017156,169.668102,
+ -0.603909,0.769641,-0.207238,14.239765,-119.520952,177.182656,
+ -0.603909,0.769641,-0.207238,11.676979,-124.295753,166.918188,
+ -0.603909,0.769641,-0.207238,9.821515,-123.65962,174.687621,
+ -0.318692,0.909887,-0.265595,9.100807,-126.4381,165.933383,
+ -0.318692,0.909887,-0.265595,3.571834,-128.80314,164.46544,
+ -0.318692,0.909887,-0.265595,7.277591,-124.839706,173.596946,
+ -0.185301,0.926674,-0.327014,7.277591,-124.839706,173.596946,
+ -0.185301,0.926674,-0.327014,3.571834,-128.80314,164.46544,
+ -0.185301,0.926674,-0.327014,1.448957,-126.095239,173.341854,
+ 0.132944,0.956419,-0.259977,3.571834,-128.80314,164.46544,
+ 0.132944,0.956419,-0.259977,0.020624,-128.291131,164.533069,
+ 0.132944,0.956419,-0.259977,1.448957,-126.095239,173.341854,
+ 0.054645,0.96674,-0.249854,1.448957,-126.095239,173.341854,
+ 0.054645,0.96674,-0.249854,0.020624,-128.291131,164.533069,
+ 0.054645,0.96674,-0.249854,0.020624,-126.011578,173.353171,
+ -0.012988,0.656866,-0.753895,3.571834,-128.80314,164.46544,
+ -0.012988,0.656866,-0.753895,5.239592,-131.556066,162.038095,
+ -0.012988,0.656866,-0.753895,0.020624,-132.445922,161.352678,
+ 0.072325,0.606244,-0.791983,0.020624,-128.291131,164.533069,
+ 0.072325,0.606244,-0.791983,3.571834,-128.80314,164.46544,
+ 0.072325,0.606244,-0.791983,0.020624,-132.445922,161.352678,
+ -0.204672,0.685903,-0.698317,9.100807,-126.4381,165.933383,
+ -0.204672,0.685903,-0.698317,10.488983,-129.155432,162.857493,
+ -0.204672,0.685903,-0.698317,5.239592,-131.556066,162.038095,
+ -0.068148,0.636278,-0.768444,9.100807,-126.4381,165.933383,
+ -0.068148,0.636278,-0.768444,5.239592,-131.556066,162.038095,
+ -0.068148,0.636278,-0.768444,3.571834,-128.80314,164.46544,
+ -0.506567,0.609098,-0.610237,15.91026,-119.017156,169.668102,
+ -0.506567,0.609098,-0.610237,18.687828,-120.29642,166.085526,
+ -0.506567,0.609098,-0.610237,14.235505,-126.569221,163.520367,
+ -0.347529,0.637113,-0.687976,15.91026,-119.017156,169.668102,
+ -0.347529,0.637113,-0.687976,14.235505,-126.569221,163.520367,
+ -0.347529,0.637113,-0.687976,11.676979,-124.295753,166.918188,
+ -0.328841,0.651589,-0.68359,11.676979,-124.295753,166.918188,
+ -0.328841,0.651589,-0.68359,14.235505,-126.569221,163.520367,
+ -0.328841,0.651589,-0.68359,10.488983,-129.155432,162.857493,
+ -0.275956,0.655137,-0.703309,11.676979,-124.295753,166.918188,
+ -0.275956,0.655137,-0.703309,10.488983,-129.155432,162.857493,
+ -0.275956,0.655137,-0.703309,9.100807,-126.4381,165.933383,
+ -0.242271,0.529303,-0.813107,14.235505,-126.569221,163.520367,
+ -0.242271,0.529303,-0.813107,15.779444,-127.916326,162.183423,
+ -0.242271,0.529303,-0.813107,11.549509,-130.865173,161.524169,
+ -0.209995,0.516917,-0.829879,14.235505,-126.569221,163.520367,
+ -0.209995,0.516917,-0.829879,11.549509,-130.865173,161.524169,
+ -0.209995,0.516917,-0.829879,10.488983,-129.155432,162.857493,
+ -0.234849,0.512576,-0.825901,18.687828,-120.29642,166.085526,
+ -0.234849,0.512576,-0.825901,22.139558,-120.677004,164.867807,
+ -0.234849,0.512576,-0.825901,15.779444,-127.916326,162.183423,
+ -0.256856,0.516382,-0.81693,18.687828,-120.29642,166.085526,
+ -0.256856,0.516382,-0.81693,15.779444,-127.916326,162.183423,
+ -0.256856,0.516382,-0.81693,14.235505,-126.569221,163.520367,
+ -0.208123,0.517945,-0.82971,10.488983,-129.155432,162.857493,
+ -0.208123,0.517945,-0.82971,11.549509,-130.865173,161.524169,
+ -0.208123,0.517945,-0.82971,5.509743,-134.869982,160.539182,
+ -0.044604,0.408682,-0.911586,10.488983,-129.155432,162.857493,
+ -0.044604,0.408682,-0.911586,5.509743,-134.869982,160.539182,
+ -0.044604,0.408682,-0.911586,5.239592,-131.556066,162.038095,
+ -0.062415,0.407081,-0.911257,5.239592,-131.556066,162.038095,
+ -0.062415,0.407081,-0.911257,5.509743,-134.869982,160.539182,
+ -0.062415,0.407081,-0.911257,0.020624,-135.825246,160.488407,
+ 0.084684,0.246887,-0.965337,5.239592,-131.556066,162.038095,
+ 0.084684,0.246887,-0.965337,0.020624,-135.825246,160.488407,
+ 0.084684,0.246887,-0.965337,0.020624,-132.445922,161.352678,
+ -0.676661,-0.024479,0.735887,25.066195,-104.296046,206.641914,
+ -0.676661,-0.024479,0.735887,21.254873,-114.806996,202.787696,
+ -0.676661,-0.024479,0.735887,24.361916,-115.968829,205.60603,
+ -0.318091,-0.064746,0.945847,25.066195,-104.296046,206.641914,
+ -0.318091,-0.064746,0.945847,24.361916,-115.968829,205.60603,
+ -0.318091,-0.064746,0.945847,28.265114,-106.945839,207.536333,
+ 0.43032,-0.3818,0.817957,31.911243,-109.212615,207.763893,
+ 0.43032,-0.3818,0.817957,31.224,-118.657563,203.716797,
+ 0.43032,-0.3818,0.817957,33.352962,-110.50496,206.402185,
+ 0.404479,-0.38491,0.829603,31.911243,-109.212615,207.763893,
+ 0.404479,-0.38491,0.829603,28.281847,-117.398075,205.735629,
+ 0.404479,-0.38491,0.829603,31.224,-118.657563,203.716797,
+ -0.150614,-0.14408,0.978037,28.265114,-106.945839,207.536333,
+ -0.150614,-0.14408,0.978037,24.361916,-115.968829,205.60603,
+ -0.150614,-0.14408,0.978037,31.911243,-109.212615,207.763893,
+ -0.103596,-0.195703,0.975176,31.911243,-109.212615,207.763893,
+ -0.103596,-0.195703,0.975176,24.361916,-115.968829,205.60603,
+ -0.103596,-0.195703,0.975176,28.281847,-117.398075,205.735629,
+ 0.41902,-0.358394,0.834252,28.281847,-117.398075,205.735629,
+ 0.41902,-0.358394,0.834252,26.643903,-130.106133,201.098946,
+ 0.41902,-0.358394,0.834252,31.224,-118.657563,203.716797,
+ 0.412495,-0.358691,0.83737,28.281847,-117.398075,205.735629,
+ 0.412495,-0.358691,0.83737,24.078683,-128.97594,202.846715,
+ 0.412495,-0.358691,0.83737,26.643903,-130.106133,201.098946,
+ -0.013901,-0.207211,0.978197,24.361916,-115.968829,205.60603,
+ -0.013901,-0.207211,0.978197,20.746514,-127.693938,203.070929,
+ -0.013901,-0.207211,0.978197,24.078683,-128.97594,202.846715,
+ -0.106596,-0.204117,0.973126,24.361916,-115.968829,205.60603,
+ -0.106596,-0.204117,0.973126,24.078683,-128.97594,202.846715,
+ -0.106596,-0.204117,0.973126,28.281847,-117.398075,205.735629,
+ -0.589193,0.040978,0.806953,21.254873,-114.806996,202.787696,
+ -0.589193,0.040978,0.806953,18.249441,-126.615767,201.192952,
+ -0.589193,0.040978,0.806953,20.746514,-127.693938,203.070929,
+ -0.662468,0.04257,0.74788,21.254873,-114.806996,202.787696,
+ -0.662468,0.04257,0.74788,20.746514,-127.693938,203.070929,
+ -0.662468,0.04257,0.74788,24.361916,-115.968829,205.60603,
+ 0.117766,-0.980067,-0.160001,11.328338,-149.815306,200.01317,
+ 0.117766,-0.980067,-0.160001,0.020624,-151.228732,200.348121,
+ 0.117766,-0.980067,-0.160001,10.240432,-149.431983,196.864448,
+ 0.22693,-0.958737,0.171247,10.240432,-149.431983,196.864448,
+ 0.22693,-0.958737,0.171247,0.020624,-151.228732,200.348121,
+ 0.22693,-0.958737,0.171247,0.020624,-151.73344,197.522485,
+ 0.414729,-0.354605,0.838007,24.078683,-128.97594,202.846715,
+ 0.414729,-0.354605,0.838007,20.745297,-138.678566,200.390712,
+ 0.414729,-0.354605,0.838007,26.643903,-130.106133,201.098946,
+ 0.583116,-0.456742,0.671835,26.643903,-130.106133,201.098946,
+ 0.583116,-0.456742,0.671835,20.745297,-138.678566,200.390712,
+ 0.583116,-0.456742,0.671835,22.434351,-139.436693,198.409299,
+ 0.604519,-0.420848,0.676346,20.745297,-138.678566,200.390712,
+ 0.604519,-0.420848,0.676346,17.205952,-144.915469,199.673351,
+ 0.604519,-0.420848,0.676346,22.434351,-139.436693,198.409299,
+ 0.715105,-0.599479,0.359513,17.874637,-145.280538,197.73453,
+ 0.715105,-0.599479,0.359513,22.434351,-139.436693,198.409299,
+ 0.715105,-0.599479,0.359513,17.205952,-144.915469,199.673351,
+ 0.427304,-0.850221,0.307466,17.874637,-145.280538,197.73453,
+ 0.427304,-0.850221,0.307466,17.205952,-144.915469,199.673351,
+ 0.427304,-0.850221,0.307466,10.240432,-149.431983,196.864448,
+ 0.601023,-0.741622,-0.297942,17.205952,-144.915469,199.673351,
+ 0.601023,-0.741622,-0.297942,11.328338,-149.815306,200.01317,
+ 0.601023,-0.741622,-0.297942,10.240432,-149.431983,196.864448,
+ 0.538699,-0.418635,0.731127,15.601473,-143.919743,201.425683,
+ 0.538699,-0.418635,0.731127,11.944392,-148.492843,201.501739,
+ 0.538699,-0.418635,0.731127,17.205952,-144.915469,199.673351,
+ 0.606832,-0.702086,0.3726,17.205952,-144.915469,199.673351,
+ 0.606832,-0.702086,0.3726,11.944392,-148.492843,201.501739,
+ 0.606832,-0.702086,0.3726,11.328338,-149.815306,200.01317,
+ 0.008127,-0.749229,0.662261,11.944392,-148.492843,201.501739,
+ 0.008127,-0.749229,0.662261,0.020624,-148.926058,201.157966,
+ 0.008127,-0.749229,0.662261,11.328338,-149.815306,200.01317,
+ 0.069248,-0.33098,0.941093,0.020624,-148.926058,201.157966,
+ 0.069248,-0.33098,0.941093,0.020624,-151.228732,200.348121,
+ 0.069248,-0.33098,0.941093,11.328338,-149.815306,200.01317,
+ 0.450689,-0.274587,0.8494,18.581958,-138.313497,201.65659,
+ 0.450689,-0.274587,0.8494,15.601473,-143.919743,201.425683,
+ 0.450689,-0.274587,0.8494,20.745297,-138.678566,200.390712,
+ 0.552756,-0.397899,0.732214,20.745297,-138.678566,200.390712,
+ 0.552756,-0.397899,0.732214,15.601473,-143.919743,201.425683,
+ 0.552756,-0.397899,0.732214,17.205952,-144.915469,199.673351,
+ 0.014743,-0.134954,0.990742,20.746514,-127.693938,203.070929,
+ 0.014743,-0.134954,0.990742,18.581958,-138.313497,201.65659,
+ 0.014743,-0.134954,0.990742,24.078683,-128.97594,202.846715,
+ 0.426202,-0.356842,0.831274,24.078683,-128.97594,202.846715,
+ 0.426202,-0.356842,0.831274,18.581958,-138.313497,201.65659,
+ 0.426202,-0.356842,0.831274,20.745297,-138.678566,200.390712,
+ -0.548829,0.158522,0.820766,18.249441,-126.615767,201.192952,
+ -0.548829,0.158522,0.820766,16.703069,-136.367374,202.042346,
+ -0.548829,0.158522,0.820766,20.746514,-127.693938,203.070929,
+ 0.054965,-0.142817,0.988222,20.746514,-127.693938,203.070929,
+ 0.054965,-0.142817,0.988222,16.703069,-136.367374,202.042346,
+ 0.054965,-0.142817,0.988222,18.581958,-138.313497,201.65659,
+ 0.056162,-0.141681,0.988318,16.703069,-136.367374,202.042346,
+ 0.056162,-0.141681,0.988318,14.00034,-140.976372,201.535204,
+ 0.056162,-0.141681,0.988318,18.581958,-138.313497,201.65659,
+ -0.003695,-0.039191,0.999225,18.581958,-138.313497,201.65659,
+ -0.003695,-0.039191,0.999225,14.00034,-140.976372,201.535204,
+ -0.003695,-0.039191,0.999225,15.601473,-143.919743,201.425683,
+ 0.144737,0.04195,0.98858,14.00034,-140.976372,201.535204,
+ 0.144737,0.04195,0.98858,9.727509,-144.565915,202.313106,
+ 0.144737,0.04195,0.98858,15.601473,-143.919743,201.425683,
+ 0.160479,-0.112025,0.980661,15.601473,-143.919743,201.425683,
+ 0.160479,-0.112025,0.980661,9.727509,-144.565915,202.313106,
+ 0.160479,-0.112025,0.980661,11.944392,-148.492843,201.501739,
+ -0.006883,-0.206062,0.978515,9.727509,-144.565915,202.313106,
+ -0.006883,-0.206062,0.978515,0.020624,-146.334979,201.872285,
+ -0.006883,-0.206062,0.978515,11.944392,-148.492843,201.501739,
+ -0.018135,-0.265726,0.963878,0.020624,-146.334979,201.872285,
+ -0.018135,-0.265726,0.963878,0.020624,-148.926058,201.157966,
+ -0.018135,-0.265726,0.963878,11.944392,-148.492843,201.501739,
+ -0.263779,0.577737,0.772425,11.302783,-138.521282,198.777715,
+ -0.263779,0.577737,0.772425,7.584249,-140.885713,199.276339,
+ -0.263779,0.577737,0.772425,14.00034,-140.976372,201.535204,
+ -0.279428,0.509049,0.814119,7.584249,-140.885713,199.276339,
+ -0.279428,0.509049,0.814119,9.727509,-144.565915,202.313106,
+ -0.279428,0.509049,0.814119,14.00034,-140.976372,201.535204,
+ -0.196736,0.553317,0.809405,7.584249,-140.885713,199.276339,
+ -0.196736,0.553317,0.809405,0.020624,-143.561671,199.267212,
+ -0.196736,0.553317,0.809405,9.727509,-144.565915,202.313106,
+ -0.155946,0.676277,0.719951,0.020624,-143.561671,199.267212,
+ -0.155946,0.676277,0.719951,0.020624,-146.334979,201.872285,
+ -0.155946,0.676277,0.719951,9.727509,-144.565915,202.313106,
+ -0.586414,0.426699,0.688511,14.202953,-133.59011,198.191779,
+ -0.586414,0.426699,0.688511,11.302783,-138.521282,198.777715,
+ -0.586414,0.426699,0.688511,16.703069,-136.367374,202.042346,
+ -0.571902,0.249374,0.781499,16.703069,-136.367374,202.042346,
+ -0.571902,0.249374,0.781499,11.302783,-138.521282,198.777715,
+ -0.571902,0.249374,0.781499,14.00034,-140.976372,201.535204,
+ -0.84743,0.304543,0.434874,16.432918,-124.47129,196.151346,
+ -0.84743,0.304543,0.434874,14.202953,-133.59011,198.191779,
+ -0.84743,0.304543,0.434874,18.249441,-126.615767,201.192952,
+ -0.76323,0.175201,0.62192,14.202953,-133.59011,198.191779,
+ -0.76323,0.175201,0.62192,16.703069,-136.367374,202.042346,
+ -0.76323,0.175201,0.62192,18.249441,-126.615767,201.192952,
+ -0.579457,0.525896,0.622626,11.429949,-129.977142,192.55937,
+ -0.579457,0.525896,0.622626,8.429384,-133.707236,192.917442,
+ -0.579457,0.525896,0.622626,14.202953,-133.59011,198.191779,
+ -0.611213,0.437818,0.659344,14.202953,-133.59011,198.191779,
+ -0.611213,0.437818,0.659344,8.429384,-133.707236,192.917442,
+ -0.611213,0.437818,0.659344,11.302783,-138.521282,198.777715
+};
+static const struct gllist headroom_model_jaw_half_frame = {
+ GL_N3F_V3F, GL_TRIANGLES, 2145, headroom_model_jaw_half_data, 0
+};
+const struct gllist *headroom_model_jaw_half = &headroom_model_jaw_half_frame;
+
+static const float headroom_model_skull_half_data[] = {
+ -0.29775,-0.573094,-0.763484,34.281759,4.152928,254.09239,
+ -0.29775,-0.573094,-0.763484,36.635846,3.198577,253.890689,
+ -0.29775,-0.573094,-0.763484,33.313108,1.485185,256.472641,
+ -0.710565,-0.05409,-0.70155,39.137179,-3.226945,252.879447,
+ -0.710565,-0.05409,-0.70155,35.773371,-1.111673,256.123391,
+ -0.710565,-0.05409,-0.70155,37.578029,0.868218,254.142891,
+ -0.490856,-0.287466,-0.82245,36.635846,3.198577,253.890689,
+ -0.490856,-0.287466,-0.82245,37.578029,0.868218,254.142891,
+ -0.490856,-0.287466,-0.82245,33.313108,1.485185,256.472641,
+ -0.487255,-0.354281,-0.798165,33.313108,1.485185,256.472641,
+ -0.487255,-0.354281,-0.798165,37.578029,0.868218,254.142891,
+ -0.487255,-0.354281,-0.798165,35.773371,-1.111673,256.123391,
+ 0.927061,0.00756,-0.374833,10.610368,-58.662093,275.66737,
+ 0.927061,0.00756,-0.374833,10.548915,-48.260663,275.725173,
+ 0.927061,0.00756,-0.374833,12.014059,-50.164803,279.310457,
+ 0.988493,-0.130482,-0.076526,10.610368,-58.662093,275.66737,
+ 0.988493,-0.130482,-0.076526,12.014059,-50.164803,279.310457,
+ 0.988493,-0.130482,-0.076526,11.304608,-55.337225,278.96577,
+ 0.288169,0.643403,-0.709219,11.304608,-55.337225,278.96577,
+ 0.288169,0.643403,-0.709219,14.805926,-59.056976,277.013867,
+ 0.288169,0.643403,-0.709219,10.610368,-58.662093,275.66737,
+ 0.376157,0.682755,-0.62638,15.285688,-56.673987,279.899435,
+ 0.376157,0.682755,-0.62638,14.805926,-59.056976,277.013867,
+ 0.376157,0.682755,-0.62638,11.304608,-55.337225,278.96577,
+ -0.195566,0.771887,-0.604933,22.373506,-55.554137,279.036959,
+ -0.195566,0.771887,-0.604933,14.805926,-59.056976,277.013867,
+ -0.195566,0.771887,-0.604933,15.285688,-56.673987,279.899435,
+ -0.184988,0.536897,-0.823117,18.426195,-54.532248,280.590632,
+ -0.184988,0.536897,-0.823117,22.373506,-55.554137,279.036959,
+ -0.184988,0.536897,-0.823117,15.285688,-56.673987,279.899435,
+ -0.38837,-0.10896,-0.915039,20.593794,-50.028207,279.134311,
+ -0.38837,-0.10896,-0.915039,22.373506,-55.554137,279.036959,
+ -0.38837,-0.10896,-0.915039,18.426195,-54.532248,280.590632,
+ -0.601198,0.031148,-0.798493,20.593794,-50.028207,279.134311,
+ -0.601198,0.031148,-0.798493,18.426195,-54.532248,280.590632,
+ -0.601198,0.031148,-0.798493,17.229377,-51.482703,281.610697,
+ -0.219108,-0.681686,-0.698066,16.71615,-46.575565,276.979794,
+ -0.219108,-0.681686,-0.698066,20.593794,-50.028207,279.134311,
+ -0.219108,-0.681686,-0.698066,17.229377,-51.482703,281.610697,
+ -0.805125,-0.449436,-0.387016,16.71615,-46.575565,276.979794,
+ -0.805125,-0.449436,-0.387016,17.229377,-51.482703,281.610697,
+ -0.805125,-0.449436,-0.387016,15.628549,-49.263082,282.363348,
+ 0.314351,-0.87321,-0.372408,16.71615,-46.575565,276.979794,
+ 0.314351,-0.87321,-0.372408,15.628549,-49.263082,282.363348,
+ 0.314351,-0.87321,-0.372408,10.548915,-48.260663,275.725173,
+ 0.608306,-0.570647,-0.551657,10.548915,-48.260663,275.725173,
+ 0.608306,-0.570647,-0.551657,15.628549,-49.263082,282.363348,
+ 0.608306,-0.570647,-0.551657,12.014059,-50.164803,279.310457,
+ 0.448707,0.559826,-0.696603,15.628549,-49.263082,282.363348,
+ 0.448707,0.559826,-0.696603,17.229377,-51.482703,281.610697,
+ 0.448707,0.559826,-0.696603,12.014059,-50.164803,279.310457,
+ -0.006009,0.315093,-0.949042,17.229377,-51.482703,281.610697,
+ -0.006009,0.315093,-0.949042,18.426195,-54.532248,280.590632,
+ -0.006009,0.315093,-0.949042,15.285688,-56.673987,279.899435,
+ 0.404689,0.00543,-0.914438,12.014059,-50.164803,279.310457,
+ 0.404689,0.00543,-0.914438,17.229377,-51.482703,281.610697,
+ 0.404689,0.00543,-0.914438,11.304608,-55.337225,278.96577,
+ 0.287188,0.201184,-0.936508,17.229377,-51.482703,281.610697,
+ 0.287188,0.201184,-0.936508,15.285688,-56.673987,279.899435,
+ 0.287188,0.201184,-0.936508,11.304608,-55.337225,278.96577,
+ -0.767797,0.292829,-0.569859,44.333026,-32.472334,262.905464,
+ -0.767797,0.292829,-0.569859,42.423106,-32.716626,265.353253,
+ -0.767797,0.292829,-0.569859,40.688419,-28.405767,269.905666,
+ -0.94707,-0.045509,-0.317784,42.423106,-32.716626,265.353253,
+ -0.94707,-0.045509,-0.317784,40.057457,-29.276761,271.910808,
+ -0.94707,-0.045509,-0.317784,40.688419,-28.405767,269.905666,
+ 0.602388,0.472617,-0.643243,33.268083,-34.082897,272.614175,
+ 0.602388,0.472617,-0.643243,36.141178,-38.281497,272.2199,
+ 0.602388,0.472617,-0.643243,31.803547,-35.917066,269.895018,
+ -0.707035,-0.431187,-0.560517,36.868882,-37.211844,270.479129,
+ -0.707035,-0.431187,-0.560517,36.141178,-38.281497,272.2199,
+ -0.707035,-0.431187,-0.560517,33.268083,-34.082897,272.614175,
+ -0.712984,-0.423907,-0.558531,38.955253,-39.644726,269.662286,
+ -0.712984,-0.423907,-0.558531,36.141178,-38.281497,272.2199,
+ -0.712984,-0.423907,-0.558531,36.868882,-37.211844,270.479129,
+ -0.616172,-0.281428,-0.735615,36.868882,-37.211844,270.479129,
+ -0.616172,-0.281428,-0.735615,38.830521,-37.770096,269.049579,
+ -0.616172,-0.281428,-0.735615,38.955253,-39.644726,269.662286,
+ -0.47019,-0.302296,-0.829179,38.830521,-37.770096,269.049579,
+ -0.47019,-0.302296,-0.829179,41.896493,-39.767633,268.03925,
+ -0.47019,-0.302296,-0.829179,38.955253,-39.644726,269.662286,
+ -0.31553,-0.004355,-0.948906,40.707889,-37.171991,268.422572,
+ -0.31553,-0.004355,-0.948906,41.896493,-39.767633,268.03925,
+ -0.31553,-0.004355,-0.948906,38.830521,-37.770096,269.049579,
+ -0.712848,-0.228511,-0.663046,44.333026,-32.472334,262.905464,
+ -0.712848,-0.228511,-0.663046,41.896493,-39.767633,268.03925,
+ -0.712848,-0.228511,-0.663046,40.707889,-37.171991,268.422572,
+ -0.775818,-0.127088,-0.618026,44.333026,-32.472334,262.905464,
+ -0.775818,-0.127088,-0.618026,40.707889,-37.171991,268.422572,
+ -0.775818,-0.127088,-0.618026,42.423106,-32.716626,265.353253,
+ 0.602571,-0.731049,-0.320118,35.943736,-29.902855,272.374142,
+ 0.602571,-0.731049,-0.320118,31.147031,-32.13647,268.445998,
+ 0.602571,-0.731049,-0.320118,35.724695,-29.067759,270.054736,
+ 0.378602,-0.923429,0.062763,35.943736,-29.902855,272.374142,
+ 0.378602,-0.923429,0.062763,32.15158,-31.421543,272.905013,
+ 0.378602,-0.923429,0.062763,31.147031,-32.13647,268.445998,
+ 0.969625,0.079754,-0.231229,31.147031,-32.13647,268.445998,
+ 0.969625,0.079754,-0.231229,32.15158,-31.421543,272.905013,
+ 0.969625,0.079754,-0.231229,31.803547,-35.917066,269.895018,
+ 0.697846,0.360405,-0.618966,31.803547,-35.917066,269.895018,
+ 0.697846,0.360405,-0.618966,32.15158,-31.421543,272.905013,
+ 0.697846,0.360405,-0.618966,33.268083,-34.082897,272.614175,
+ -0.185141,-0.878726,-0.439959,40.688419,-28.405767,269.905666,
+ -0.185141,-0.878726,-0.439959,40.057457,-29.276761,271.910808,
+ -0.185141,-0.878726,-0.439959,38.583795,-27.977723,269.936392,
+ 0.120522,-0.785628,-0.606847,40.057457,-29.276761,271.910808,
+ 0.120522,-0.785628,-0.606847,38.28961,-29.441042,271.772386,
+ 0.120522,-0.785628,-0.606847,38.583795,-27.977723,269.936392,
+ 0.271149,-0.773416,-0.572979,38.583795,-27.977723,269.936392,
+ 0.271149,-0.773416,-0.572979,38.28961,-29.441042,271.772386,
+ 0.271149,-0.773416,-0.572979,35.724695,-29.067759,270.054736,
+ 0.095266,-0.933693,-0.34517,38.28961,-29.441042,271.772386,
+ 0.095266,-0.933693,-0.34517,35.943736,-29.902855,272.374142,
+ 0.095266,-0.933693,-0.34517,35.724695,-29.067759,270.054736,
+ -0.878567,0.21184,-0.428069,42.423106,-32.716626,265.353253,
+ -0.878567,0.21184,-0.428069,38.5914,-32.600412,273.27495,
+ -0.878567,0.21184,-0.428069,40.057457,-29.276761,271.910808,
+ -0.750965,0.061396,-0.657482,40.057457,-29.276761,271.910808,
+ -0.750965,0.061396,-0.657482,38.5914,-32.600412,273.27495,
+ -0.750965,0.061396,-0.657482,38.235154,-31.419413,273.792132,
+ 0.443269,0.793996,-0.416033,36.868882,-37.211844,270.479129,
+ 0.443269,0.793996,-0.416033,33.268083,-34.082897,272.614175,
+ 0.443269,0.793996,-0.416033,35.110466,-34.496946,273.78696,
+ -0.207403,0.699232,-0.684148,36.868882,-37.211844,270.479129,
+ -0.207403,0.699232,-0.684148,35.110466,-34.496946,273.78696,
+ -0.207403,0.699232,-0.684148,36.069685,-35.009564,272.972247,
+ -0.309824,0.661125,-0.683318,36.069685,-35.009564,272.972247,
+ -0.309824,0.661125,-0.683318,38.830521,-37.770096,269.049579,
+ -0.309824,0.661125,-0.683318,36.868882,-37.211844,270.479129,
+ -0.273246,0.685573,-0.674779,38.830521,-37.770096,269.049579,
+ -0.273246,0.685573,-0.674779,36.069685,-35.009564,272.972247,
+ -0.273246,0.685573,-0.674779,36.997873,-34.506073,273.107931,
+ -0.418907,0.605805,-0.6764,36.997873,-34.506073,273.107931,
+ -0.418907,0.605805,-0.6764,40.707889,-37.171991,268.422572,
+ -0.418907,0.605805,-0.6764,38.830521,-37.770096,269.049579,
+ -0.534354,0.479615,-0.696014,37.75235,-33.552026,273.186117,
+ -0.534354,0.479615,-0.696014,40.707889,-37.171991,268.422572,
+ -0.534354,0.479615,-0.696014,36.997873,-34.506073,273.107931,
+ -0.238631,0.752489,-0.613853,51.126781,-24.703966,261.471351,
+ -0.238631,0.752489,-0.613853,50.172429,-29.650957,255.778097,
+ -0.238631,0.752489,-0.613853,48.486783,-25.057474,262.064284,
+ -0.243863,0.818391,-0.520352,48.804515,-23.715541,264.025922,
+ -0.243863,0.818391,-0.520352,48.486783,-25.057474,262.064284,
+ -0.243863,0.818391,-0.520352,47.518863,-23.376939,265.160983,
+ -0.306146,0.793328,-0.526218,48.486783,-25.057474,262.064284,
+ -0.306146,0.793328,-0.526218,46.336952,-24.186784,264.627678,
+ -0.306146,0.793328,-0.526218,47.518863,-23.376939,265.160983,
+ -0.224395,0.967304,0.118192,53.572866,-19.352964,265.745398,
+ -0.224395,0.967304,0.118192,49.804227,-19.650191,261.022924,
+ -0.224395,0.967304,0.118192,50.027558,-20.481332,268.249164,
+ -0.220998,0.968088,0.118177,50.027558,-20.481332,268.249164,
+ -0.220998,0.968088,0.118177,49.804227,-19.650191,261.022924,
+ -0.220998,0.968088,0.118177,47.100251,-20.514797,263.049058,
+ 0.662949,0.442475,-0.603916,50.708655,-22.4019,260.367321,
+ 0.662949,0.442475,-0.603916,53.572866,-19.352964,265.745398,
+ 0.662949,0.442475,-0.603916,53.686038,-22.490125,263.571107,
+ 0.712784,0.375429,-0.592446,50.708655,-22.4019,260.367321,
+ 0.712784,0.375429,-0.592446,49.804227,-19.650191,261.022924,
+ 0.712784,0.375429,-0.592446,53.572866,-19.352964,265.745398,
+ 0.440038,-0.843535,-0.307922,53.686038,-22.490125,263.571107,
+ 0.440038,-0.843535,-0.307922,51.691878,-23.439001,263.32073,
+ 0.440038,-0.843535,-0.307922,49.423186,-23.55704,260.402002,
+ 0.556717,-0.635588,-0.534878,53.686038,-22.490125,263.571107,
+ 0.556717,-0.635588,-0.534878,49.423186,-23.55704,260.402002,
+ 0.556717,-0.635588,-0.534878,50.708655,-22.4019,260.367321,
+ -0.830722,-0.299015,0.469565,47.100251,-20.514797,263.049058,
+ -0.830722,-0.299015,0.469565,48.804515,-23.715541,264.025922,
+ -0.830722,-0.299015,0.469565,50.027558,-20.481332,268.249164,
+ -0.833693,-0.303004,0.461676,47.242628,-24.174919,260.903972,
+ -0.833693,-0.303004,0.461676,48.804515,-23.715541,264.025922,
+ -0.833693,-0.303004,0.461676,47.100251,-20.514797,263.049058,
+ 0.116125,-0.989374,0.087485,51.691878,-23.439001,263.32073,
+ 0.116125,-0.989374,0.087485,48.804515,-23.715541,264.025922,
+ 0.116125,-0.989374,0.087485,47.242628,-24.174919,260.903972,
+ 0.238338,-0.96008,-0.14643,51.691878,-23.439001,263.32073,
+ 0.238338,-0.96008,-0.14643,47.242628,-24.174919,260.903972,
+ 0.238338,-0.96008,-0.14643,49.423186,-23.55704,260.402002,
+ -0.447121,0.86504,-0.22757,49.804227,-19.650191,261.022924,
+ -0.447121,0.86504,-0.22757,47.570886,-22.554012,254.372885,
+ -0.447121,0.86504,-0.22757,47.100251,-20.514797,263.049058,
+ -0.431997,0.872451,-0.228491,47.570886,-22.554012,254.372885,
+ -0.431997,0.872451,-0.228491,45.701427,-23.086405,255.874536,
+ -0.431997,0.872451,-0.228491,47.100251,-20.514797,263.049058,
+ 0.843356,0.370029,-0.389653,48.962986,-23.896554,255.169648,
+ 0.843356,0.370029,-0.389653,49.804227,-19.650191,261.022924,
+ 0.843356,0.370029,-0.389653,50.708655,-22.4019,260.367321,
+ 0.738258,0.4911,-0.46238,47.570886,-22.554012,254.372885,
+ 0.738258,0.4911,-0.46238,49.804227,-19.650191,261.022924,
+ 0.738258,0.4911,-0.46238,48.962986,-23.896554,255.169648,
+ 0.66787,-0.74119,0.067721,50.708655,-22.4019,260.367321,
+ 0.66787,-0.74119,0.067721,49.423186,-23.55704,260.402002,
+ 0.66787,-0.74119,0.067721,48.441576,-24.873418,255.675269,
+ 0.843782,-0.519704,-0.133942,48.962986,-23.896554,255.169648,
+ 0.843782,-0.519704,-0.133942,50.708655,-22.4019,260.367321,
+ 0.843782,-0.519704,-0.133942,48.441576,-24.873418,255.675269,
+ -0.950211,-0.184244,0.251303,45.701427,-23.086405,255.874536,
+ -0.950211,-0.184244,0.251303,47.242628,-24.174919,260.903972,
+ -0.950211,-0.184244,0.251303,47.100251,-20.514797,263.049058,
+ -0.873036,-0.457625,0.168487,45.701427,-23.086405,255.874536,
+ -0.873036,-0.457625,0.168487,47.131586,-25.689348,256.215267,
+ -0.873036,-0.457625,0.168487,47.242628,-24.174919,260.903972,
+ 0.321375,-0.903313,0.284155,49.423186,-23.55704,260.402002,
+ 0.321375,-0.903313,0.284155,47.242628,-24.174919,260.903972,
+ 0.321375,-0.903313,0.284155,47.131586,-25.689348,256.215267,
+ 0.558425,-0.821835,0.112909,49.423186,-23.55704,260.402002,
+ 0.558425,-0.821835,0.112909,47.131586,-25.689348,256.215267,
+ 0.558425,-0.821835,0.112909,48.441576,-24.873418,255.675269,
+ -0.539032,0.735529,-0.410415,45.701427,-23.086405,255.874536,
+ -0.539032,0.735529,-0.410415,45.856277,-29.059241,244.966877,
+ -0.539032,0.735529,-0.410415,44.543245,-29.433133,246.021318,
+ -0.539106,0.735488,-0.410393,45.856277,-29.059241,244.966877,
+ -0.539106,0.735488,-0.410393,45.701427,-23.086405,255.874536,
+ -0.539106,0.735488,-0.410393,47.570886,-22.554012,254.372885,
+ 0.737166,0.485398,-0.470079,46.834054,-30.002336,245.526345,
+ 0.737166,0.485398,-0.470079,47.570886,-22.554012,254.372885,
+ 0.737166,0.485398,-0.470079,48.962986,-23.896554,255.169648,
+ 0.73716,0.485404,-0.470083,47.570886,-22.554012,254.372885,
+ 0.73716,0.485404,-0.470083,46.834054,-30.002336,245.526345,
+ 0.73716,0.485404,-0.470083,45.856277,-29.059241,244.966877,
+ 0.895858,-0.437249,0.079065,46.467768,-30.688362,245.881679,
+ 0.895858,-0.437249,0.079065,48.962986,-23.896554,255.169648,
+ 0.895858,-0.437249,0.079065,48.441576,-24.873418,255.675269,
+ 0.89582,-0.437317,0.079125,48.962986,-23.896554,255.169648,
+ 0.89582,-0.437317,0.079125,46.467768,-30.688362,245.881679,
+ 0.89582,-0.437317,0.079125,46.834054,-30.002336,245.526345,
+ -0.835766,-0.411634,0.36339,45.701427,-23.086405,255.874536,
+ -0.835766,-0.411634,0.36339,45.547794,-31.261521,246.260743,
+ -0.835766,-0.411634,0.36339,47.131586,-25.689348,256.215267,
+ -0.835785,-0.411612,0.363372,45.547794,-31.261521,246.260743,
+ -0.835785,-0.411612,0.363372,45.701427,-23.086405,255.874536,
+ -0.835785,-0.411612,0.363372,44.543245,-29.433133,246.021318,
+ 0.592429,-0.739483,0.319678,46.467768,-30.688362,245.881679,
+ 0.592429,-0.739483,0.319678,47.131586,-25.689348,256.215267,
+ 0.592429,-0.739483,0.319678,45.547794,-31.261521,246.260743,
+ 0.592387,-0.739509,0.319693,47.131586,-25.689348,256.215267,
+ 0.592387,-0.739509,0.319693,46.467768,-30.688362,245.881679,
+ 0.592387,-0.739509,0.319693,48.441576,-24.873418,255.675269,
+ -0.597079,0.60207,-0.530102,44.543245,-29.433133,246.021318,
+ -0.597079,0.60207,-0.530102,44.501262,-34.823379,239.946567,
+ -0.597079,0.60207,-0.530102,44.036407,-34.955717,240.31985,
+ -0.597121,0.602047,-0.530081,44.501262,-34.823379,239.946567,
+ -0.597121,0.602047,-0.530081,44.543245,-29.433133,246.021318,
+ -0.597121,0.602047,-0.530081,45.856277,-29.059241,244.966877,
+ 0.702476,0.366329,-0.610189,44.847469,-35.157113,240.144617,
+ 0.702476,0.366329,-0.610189,45.856277,-29.059241,244.966877,
+ 0.702476,0.366329,-0.610189,46.834054,-30.002336,245.526345,
+ 0.702342,0.366427,-0.610285,45.856277,-29.059241,244.966877,
+ 0.702342,0.366427,-0.610285,44.847469,-35.157113,240.144617,
+ 0.702342,0.366427,-0.610285,44.501262,-34.823379,239.946567,
+ 0.896599,-0.434562,0.085246,44.717566,-35.400188,240.270262,
+ 0.896599,-0.434562,0.085246,46.834054,-30.002336,245.526345,
+ 0.896599,-0.434562,0.085246,46.467768,-30.688362,245.881679,
+ 0.896435,-0.434831,0.085588,46.834054,-30.002336,245.526345,
+ 0.896435,-0.434831,0.085588,44.717566,-35.400188,240.270262,
+ 0.896435,-0.434831,0.085588,44.847469,-35.157113,240.144617,
+ -0.808053,-0.385641,0.445345,44.543245,-29.433133,246.021318,
+ -0.808053,-0.385641,0.445345,44.392046,-35.602802,240.404425,
+ -0.808053,-0.385641,0.445345,45.547794,-31.261521,246.260743,
+ -0.807893,-0.385791,0.445505,44.392046,-35.602802,240.404425,
+ -0.807893,-0.385791,0.445505,44.543245,-29.433133,246.021318,
+ -0.807893,-0.385791,0.445505,44.036407,-34.955717,240.31985,
+ 0.597391,-0.696134,0.398148,44.717566,-35.400188,240.270262,
+ 0.597391,-0.696134,0.398148,45.547794,-31.261521,246.260743,
+ 0.597391,-0.696134,0.398148,44.392046,-35.602802,240.404425,
+ 0.597623,-0.696004,0.398026,45.547794,-31.261521,246.260743,
+ 0.597623,-0.696004,0.398026,44.717566,-35.400188,240.270262,
+ 0.597623,-0.696004,0.398026,46.467768,-30.688362,245.881679,
+ 0.042757,-0.476698,-0.878026,44.501262,-34.823379,239.946567,
+ 0.042757,-0.476698,-0.878026,44.847469,-35.157113,240.144617,
+ 0.042757,-0.476698,-0.878026,44.717566,-35.400188,240.270262,
+ -0.510412,-0.381265,-0.77079,44.501262,-34.823379,239.946567,
+ -0.510412,-0.381265,-0.77079,44.392046,-35.602802,240.404425,
+ -0.510412,-0.381265,-0.77079,44.036407,-34.955717,240.31985,
+ -0.044033,-0.50142,-0.864083,44.501262,-34.823379,239.946567,
+ -0.044033,-0.50142,-0.864083,44.717566,-35.400188,240.270262,
+ -0.044033,-0.50142,-0.864083,44.392046,-35.602802,240.404425,
+ -0.121549,0.63645,-0.761681,35.773371,-1.111673,256.123391,
+ -0.121549,0.63645,-0.761681,40.582244,-6.289876,251.029155,
+ -0.121549,0.63645,-0.761681,34.738095,-8.703591,249.9449,
+ -0.630815,0.160929,-0.759061,35.773371,-1.111673,256.123391,
+ -0.630815,0.160929,-0.759061,39.137179,-3.226945,252.879447,
+ -0.630815,0.160929,-0.759061,40.582244,-6.289876,251.029155,
+ -0.560526,0.21815,-0.798887,44.355843,0.278936,250.175197,
+ -0.560526,0.21815,-0.798887,40.582244,-6.289876,251.029155,
+ -0.560526,0.21815,-0.798887,39.137179,-3.226945,252.879447,
+ -0.498758,0.076473,-0.863361,37.578029,0.868218,254.142891,
+ -0.498758,0.076473,-0.863361,44.355843,0.278936,250.175197,
+ -0.498758,0.076473,-0.863361,39.137179,-3.226945,252.879447,
+ -0.500962,-0.302689,-0.810812,39.872489,4.790583,251.260974,
+ -0.500962,-0.302689,-0.810812,44.355843,0.278936,250.175197,
+ -0.500962,-0.302689,-0.810812,37.578029,0.868218,254.142891,
+ -0.511368,-0.294137,-0.807457,39.872489,4.790583,251.260974,
+ -0.511368,-0.294137,-0.807457,37.578029,0.868218,254.142891,
+ -0.511368,-0.294137,-0.807457,36.635846,3.198577,253.890689,
+ -0.217337,-0.693226,-0.68717,39.872489,4.790583,251.260974,
+ -0.217337,-0.693226,-0.68717,36.635846,3.198577,253.890689,
+ -0.217337,-0.693226,-0.68717,32.266881,8.102673,250.32518,
+ -0.347534,-0.733916,-0.583599,36.635846,3.198577,253.890689,
+ -0.347534,-0.733916,-0.583599,34.281759,4.152928,254.09239,
+ -0.347534,-0.733916,-0.583599,32.266881,8.102673,250.32518,
+ 0.451975,0.525174,-0.721049,33.313108,1.485185,256.472641,
+ 0.451975,0.525174,-0.721049,35.773371,-1.111673,256.123391,
+ 0.451975,0.525174,-0.721049,34.738095,-8.703591,249.9449,
+ 0.05186,-0.675279,-0.735736,32.266881,8.102673,250.32518,
+ 0.05186,-0.675279,-0.735736,34.281759,4.152928,254.09239,
+ 0.05186,-0.675279,-0.735736,33.313108,1.485185,256.472641,
+ 0.735048,0.489931,-0.468692,75.537236,29.979444,266.946172,
+ 0.735048,0.489931,-0.468692,60.474499,55.661453,270.169124,
+ 0.735048,0.489931,-0.468692,75.572651,38.636147,276.050693,
+ 0.734895,0.489878,-0.468987,57.157998,50.890607,259.988866,
+ 0.734895,0.489878,-0.468987,60.474499,55.661453,270.169124,
+ 0.734895,0.489878,-0.468987,75.537236,29.979444,266.946172,
+ 0.708336,0.438544,-0.553117,60.630962,39.403097,255.328453,
+ 0.708336,0.438544,-0.553117,57.157998,50.890607,259.988866,
+ 0.708336,0.438544,-0.553117,75.537236,29.979444,266.946172,
+ 0.66938,0.674262,-0.311933,75.537236,29.979444,266.946172,
+ 0.66938,0.674262,-0.311933,68.868109,32.97362,259.106919,
+ 0.66938,0.674262,-0.311933,60.630962,39.403097,255.328453,
+ 0.916692,0.351881,-0.189355,76.142049,45.244812,289.336169,
+ 0.916692,0.351881,-0.189355,77.959732,47.606505,302.524598,
+ 0.916692,0.351881,-0.189355,87.550981,27.796026,312.142954,
+ 0.924875,0.301025,-0.232357,76.142049,45.244812,289.336169,
+ 0.924875,0.301025,-0.232357,87.550981,27.796026,312.142954,
+ 0.924875,0.301025,-0.232357,85.735705,21.969217,297.368604,
+ 0.89612,0.432805,-0.098228,77.959732,47.606505,302.524598,
+ 0.89612,0.432805,-0.098228,76.707833,53.667262,317.808219,
+ 0.89612,0.432805,-0.098228,88.418355,32.110231,329.658669,
+ 0.916078,0.376474,-0.138091,77.959732,47.606505,302.524598,
+ 0.916078,0.376474,-0.138091,88.418355,32.110231,329.658669,
+ 0.916078,0.376474,-0.138091,87.550981,27.796026,312.142954,
+ 0.80117,0.532953,-0.272191,61.755162,61.847854,282.712597,
+ 0.80117,0.532953,-0.272191,62.269727,66.901325,294.121922,
+ 0.80117,0.532953,-0.272191,77.959732,47.606505,302.524598,
+ 0.778858,0.589929,-0.212986,61.755162,61.847854,282.712597,
+ 0.778858,0.589929,-0.212986,77.959732,47.606505,302.524598,
+ 0.778858,0.589929,-0.212986,76.142049,45.244812,289.336169,
+ 0.789628,0.59529,-0.14872,62.269727,66.901325,294.121922,
+ 0.789628,0.59529,-0.14872,61.054108,72.039065,308.232759,
+ 0.789628,0.59529,-0.14872,76.707833,53.667262,317.808219,
+ 0.7991,0.578421,-0.163919,62.269727,66.901325,294.121922,
+ 0.7991,0.578421,-0.163919,76.707833,53.667262,317.808219,
+ 0.7991,0.578421,-0.163919,77.959732,47.606505,302.524598,
+ 0.663507,0.685053,-0.300767,62.269727,66.901325,294.121922,
+ 0.663507,0.685053,-0.300767,38.224202,81.984462,275.430988,
+ 0.663507,0.685053,-0.300767,38.454499,86.81159,286.93371,
+ 0.670908,0.666334,-0.325394,38.224202,81.984462,275.430988,
+ 0.670908,0.666334,-0.325394,62.269727,66.901325,294.121922,
+ 0.670908,0.666334,-0.325394,61.755162,61.847854,282.712597,
+ 0.670013,0.709324,-0.218955,61.054108,72.039065,308.232759,
+ 0.670013,0.709324,-0.218955,38.454499,86.81159,286.93371,
+ 0.670013,0.709324,-0.218955,37.350774,91.887877,300.001361,
+ 0.663459,0.719622,-0.204858,62.269727,66.901325,294.121922,
+ 0.663459,0.719622,-0.204858,38.454499,86.81159,286.93371,
+ 0.663459,0.719622,-0.204858,61.054108,72.039065,308.232759,
+ 0.343315,0.865281,-0.365273,38.454499,86.81159,286.93371,
+ 0.343315,0.865281,-0.365273,14.294221,89.856571,271.438956,
+ 0.343315,0.865281,-0.365273,13.930064,94.99492,283.268719,
+ 0.345408,0.862857,-0.369014,38.454499,86.81159,286.93371,
+ 0.345408,0.862857,-0.369014,38.224202,81.984462,275.430988,
+ 0.345408,0.862857,-0.369014,14.294221,89.856571,271.438956,
+ 0.363128,0.864408,-0.34776,37.350774,91.887877,300.001361,
+ 0.363128,0.864408,-0.34776,13.930064,94.99492,283.268719,
+ 0.363128,0.864408,-0.34776,14.647425,98.812935,293.507997,
+ 0.342434,0.885185,-0.314938,38.454499,86.81159,286.93371,
+ 0.342434,0.885185,-0.314938,13.930064,94.99492,283.268719,
+ 0.342434,0.885185,-0.314938,37.350774,91.887877,300.001361,
+ 0.990207,-0.040631,-0.133563,90.633413,2.857541,307.534564,
+ 0.990207,-0.040631,-0.133563,92.637369,7.527993,320.970631,
+ 0.990207,-0.040631,-0.133563,93.169122,-16.457053,332.209286,
+ 0.99641,0.029377,-0.079401,90.633413,2.857541,307.534564,
+ 0.99641,0.029377,-0.079401,93.169122,-16.457053,332.209286,
+ 0.99641,0.029377,-0.079401,92.42721,-21.132068,321.16929,
+ 0.999722,-0.021425,-0.009827,92.637369,7.527993,320.970631,
+ 0.999722,-0.021425,-0.009827,92.924891,12.684291,338.979798,
+ 0.999722,-0.021425,-0.009827,92.555684,-8.988954,348.671777,
+ 0.999215,0.032658,0.022419,92.637369,7.527993,320.970631,
+ 0.999215,0.032658,0.022419,92.555684,-8.988954,348.671777,
+ 0.999215,0.032658,0.022419,93.169122,-16.457053,332.209286,
+ 0.969352,0.163334,-0.183518,85.735705,21.969217,297.368604,
+ 0.969352,0.163334,-0.183518,87.550981,27.796026,312.142954,
+ 0.969352,0.163334,-0.183518,92.637369,7.527993,320.970631,
+ 0.970042,0.14485,-0.19503,85.735705,21.969217,297.368604,
+ 0.970042,0.14485,-0.19503,92.637369,7.527993,320.970631,
+ 0.970042,0.14485,-0.19503,90.633413,2.857541,307.534564,
+ 0.978806,0.18227,-0.093364,87.550981,27.796026,312.142954,
+ 0.978806,0.18227,-0.093364,88.418355,32.110231,329.658669,
+ 0.978806,0.18227,-0.093364,92.924891,12.684291,338.979798,
+ 0.974433,0.211402,-0.076085,87.550981,27.796026,312.142954,
+ 0.974433,0.211402,-0.076085,92.924891,12.684291,338.979798,
+ 0.974433,0.211402,-0.076085,92.637369,7.527993,320.970631,
+ 0.076927,0.927797,-0.365068,13.930064,94.99492,283.268719,
+ 0.076927,0.927797,-0.365068,0.020624,92.570556,274.176367,
+ 0.076927,0.927797,-0.365068,0.020624,96.509348,284.186564,
+ 0.098217,0.913879,-0.393927,14.294221,89.856571,271.438956,
+ 0.098217,0.913879,-0.393927,0.020624,92.570556,274.176367,
+ 0.098217,0.913879,-0.393927,13.930064,94.99492,283.268719,
+ 0.032943,0.957005,-0.288195,14.647425,98.812935,293.507997,
+ 0.032943,0.957005,-0.288195,0.020624,96.509348,284.186564,
+ 0.032943,0.957005,-0.288195,0.020624,99.098297,292.783639,
+ 0.078206,0.932305,-0.353116,14.647425,98.812935,293.507997,
+ 0.078206,0.932305,-0.353116,13.930064,94.99492,283.268719,
+ 0.078206,0.932305,-0.353116,0.020624,96.509348,284.186564,
+ 0.109595,-0.393553,0.912746,15.957111,-99.865931,400.096031,
+ 0.109595,-0.393553,0.912746,0.020624,-101.250152,401.412714,
+ 0.109595,-0.393553,0.912746,16.49285,-110.7815,395.325185,
+ 0.064127,-0.456085,0.887623,0.020624,-101.250152,401.412714,
+ 0.064127,-0.456085,0.887623,0.020624,-114.340316,394.686618,
+ 0.064127,-0.456085,0.887623,16.49285,-110.7815,395.325185,
+ 0.07031,-0.396606,0.915292,0.020624,-89.428603,405.842829,
+ 0.07031,-0.396606,0.915292,15.957111,-99.865931,400.096031,
+ 0.07031,-0.396606,0.915292,15.452403,-89.586191,404.58912,
+ 0.107225,-0.348894,0.931008,0.020624,-89.428603,405.842829,
+ 0.107225,-0.348894,0.931008,0.020624,-101.250152,401.412714,
+ 0.107225,-0.348894,0.931008,15.957111,-99.865931,400.096031,
+ 0.980248,-0.189387,0.056976,88.248598,-43.555834,331.686629,
+ 0.980248,-0.189387,0.056976,89.039521,-36.280918,342.260858,
+ 0.980248,-0.189387,0.056976,85.818333,-49.822247,352.66898,
+ 0.990075,-0.115404,0.080209,88.248598,-43.555834,331.686629,
+ 0.990075,-0.115404,0.080209,85.818333,-49.822247,352.66898,
+ 0.990075,-0.115404,0.080209,85.931626,-55.624109,342.92285,
+ 0.964103,-0.228101,0.135928,89.039521,-36.280918,342.260858,
+ 0.964103,-0.228101,0.135928,89.362394,-25.811646,357.539307,
+ 0.964103,-0.228101,0.135928,84.014678,-42.674192,367.172266,
+ 0.979943,-0.101128,0.171709,89.039521,-36.280918,342.260858,
+ 0.979943,-0.101128,0.171709,84.014678,-42.674192,367.172266,
+ 0.979943,-0.101128,0.171709,85.818333,-49.822247,352.66898,
+ 0.980525,-0.195658,0.01696,92.42721,-21.132068,321.16929,
+ 0.980525,-0.195658,0.01696,93.169122,-16.457053,332.209286,
+ 0.980525,-0.195658,0.01696,89.039521,-36.280918,342.260858,
+ 0.985494,-0.164981,0.039792,92.42721,-21.132068,321.16929,
+ 0.985494,-0.164981,0.039792,89.039521,-36.280918,342.260858,
+ 0.985494,-0.164981,0.039792,88.248598,-43.555834,331.686629,
+ 0.985916,-0.135404,0.098163,93.169122,-16.457053,332.209286,
+ 0.985916,-0.135404,0.098163,92.555684,-8.988954,348.671777,
+ 0.985916,-0.135404,0.098163,89.362394,-25.811646,357.539307,
+ 0.983151,-0.159813,0.088733,93.169122,-16.457053,332.209286,
+ 0.983151,-0.159813,0.088733,89.362394,-25.811646,357.539307,
+ 0.983151,-0.159813,0.088733,89.039521,-36.280918,342.260858,
+ 0.66795,-0.339575,0.662218,70.601214,-88.864267,370.015851,
+ 0.66795,-0.339575,0.662218,68.753234,-79.762179,376.547243,
+ 0.66795,-0.339575,0.662218,51.402834,-90.618728,388.480746,
+ 0.681448,-0.261094,0.683709,70.601214,-88.864267,370.015851,
+ 0.681448,-0.261094,0.683709,51.402834,-90.618728,388.480746,
+ 0.681448,-0.261094,0.683709,53.764071,-101.363323,382.024194,
+ -0.857523,-0.023895,-0.513891,42.423106,-32.716626,265.353253,
+ -0.857523,-0.023895,-0.513891,40.707889,-37.171991,268.422572,
+ -0.857523,-0.023895,-0.513891,37.75235,-33.552026,273.186117,
+ -0.688631,0.639144,-0.342465,42.423106,-32.716626,265.353253,
+ -0.688631,0.639144,-0.342465,37.75235,-33.552026,273.186117,
+ -0.688631,0.639144,-0.342465,38.5914,-32.600412,273.27495,
+ 0.226438,-0.772705,-0.593003,36.574393,-31.347921,274.497932,
+ 0.226438,-0.772705,-0.593003,32.15158,-31.421543,272.905013,
+ 0.226438,-0.772705,-0.593003,35.943736,-29.902855,272.374142,
+ 0.33434,-0.210834,-0.918567,36.574393,-31.347921,274.497932,
+ 0.33434,-0.210834,-0.918567,34.434175,-32.761651,274.043421,
+ 0.33434,-0.210834,-0.918567,32.15158,-31.421543,272.905013,
+ 0.566772,0.320708,-0.758891,32.15158,-31.421543,272.905013,
+ 0.566772,0.320708,-0.758891,34.434175,-32.761651,274.043421,
+ 0.566772,0.320708,-0.758891,33.268083,-34.082897,272.614175,
+ 0.558568,0.330147,-0.760924,34.434175,-32.761651,274.043421,
+ 0.558568,0.330147,-0.760924,35.110466,-34.496946,273.78696,
+ 0.558568,0.330147,-0.760924,33.268083,-34.082897,272.614175,
+ 0.120317,-0.710816,-0.693011,40.057457,-29.276761,271.910808,
+ 0.120317,-0.710816,-0.693011,38.235154,-31.419413,273.792132,
+ 0.120317,-0.710816,-0.693011,38.28961,-29.441042,271.772386,
+ -0.887437,-0.317094,-0.334525,38.28961,-29.441042,271.772386,
+ -0.887437,-0.317094,-0.334525,38.235154,-31.419413,273.792132,
+ -0.887437,-0.317094,-0.334525,37.917544,-30.856294,274.100919,
+ 0.036579,-0.856555,-0.514758,38.28961,-29.441042,271.772386,
+ 0.036579,-0.856555,-0.514758,37.917544,-30.856294,274.100919,
+ 0.036579,-0.856555,-0.514758,35.943736,-29.902855,272.374142,
+ 0.121797,-0.803417,-0.582827,37.917544,-30.856294,274.100919,
+ 0.121797,-0.803417,-0.582827,36.574393,-31.347921,274.497932,
+ 0.121797,-0.803417,-0.582827,35.943736,-29.902855,272.374142,
+ -0.365133,0.280778,-0.887605,37.917544,-30.856294,274.100919,
+ -0.365133,0.280778,-0.887605,38.235154,-31.419413,273.792132,
+ -0.365133,0.280778,-0.887605,36.574393,-31.347921,274.497932,
+ 0.089396,0.179626,-0.979665,36.574393,-31.347921,274.497932,
+ 0.089396,0.179626,-0.979665,35.110466,-34.496946,273.78696,
+ 0.089396,0.179626,-0.979665,34.434175,-32.761651,274.043421,
+ -0.324858,0.349441,-0.878839,36.574393,-31.347921,274.497932,
+ -0.324858,0.349441,-0.878839,37.75235,-33.552026,273.186117,
+ -0.324858,0.349441,-0.878839,35.110466,-34.496946,273.78696,
+ 0.175093,-0.05792,-0.982847,37.75235,-33.552026,273.186117,
+ 0.175093,-0.05792,-0.982847,36.997873,-34.506073,273.107931,
+ 0.175093,-0.05792,-0.982847,36.069685,-35.009564,272.972247,
+ -0.364247,0.532608,-0.763972,37.75235,-33.552026,273.186117,
+ -0.364247,0.532608,-0.763972,36.069685,-35.009564,272.972247,
+ -0.364247,0.532608,-0.763972,35.110466,-34.496946,273.78696,
+ -0.365447,0.278693,-0.888132,36.574393,-31.347921,274.497932,
+ -0.365447,0.278693,-0.888132,38.235154,-31.419413,273.792132,
+ -0.365447,0.278693,-0.888132,38.5914,-32.600412,273.27495,
+ -0.311963,0.357245,-0.880372,36.574393,-31.347921,274.497932,
+ -0.311963,0.357245,-0.880372,38.5914,-32.600412,273.27495,
+ -0.311963,0.357245,-0.880372,37.75235,-33.552026,273.186117,
+ 0.985474,-0.019401,-0.168715,88.836268,1.038584,293.615693,
+ 0.985474,-0.019401,-0.168715,91.537567,-26.135949,312.518975,
+ 0.985474,-0.019401,-0.168715,90.347928,-28.78118,305.874412,
+ 0.979521,0.117012,0.163848,88.836268,1.038584,293.615693,
+ 0.979521,0.117012,0.163848,90.347928,-28.78118,305.874412,
+ 0.979521,0.117012,0.163848,90.220611,-17.706198,298.726357,
+ 0.94895,-0.186721,-0.254223,88.152524,-24.892585,294.823463,
+ 0.94895,-0.186721,-0.254223,90.347928,-28.78118,305.874412,
+ 0.94895,-0.186721,-0.254223,88.089823,-30.730954,298.877557,
+ 0.959494,-0.144907,-0.241605,88.152524,-24.892585,294.823463,
+ 0.959494,-0.144907,-0.241605,90.220611,-17.706198,298.726357,
+ 0.959494,-0.144907,-0.241605,90.347928,-28.78118,305.874412,
+ 0.914946,-0.259019,-0.309489,85.62947,-27.633342,289.658343,
+ 0.914946,-0.259019,-0.309489,88.152524,-24.892585,294.823463,
+ 0.914946,-0.259019,-0.309489,83.916383,-35.397755,291.092152,
+ 0.907976,-0.245531,-0.339551,83.916383,-35.397755,291.092152,
+ 0.907976,-0.245531,-0.339551,88.152524,-24.892585,294.823463,
+ 0.907976,-0.245531,-0.339551,88.089823,-30.730954,298.877557,
+ 0.944309,-0.193823,-0.265918,87.158136,-14.88908,285.797736,
+ 0.944309,-0.193823,-0.265918,90.220611,-17.706198,298.726357,
+ 0.944309,-0.193823,-0.265918,85.62947,-27.633342,289.658343,
+ 0.904056,-0.028561,-0.426458,85.62947,-27.633342,289.658343,
+ 0.904056,-0.028561,-0.426458,90.220611,-17.706198,298.726357,
+ 0.904056,-0.028561,-0.426458,88.152524,-24.892585,294.823463,
+ 0.973495,0.009594,-0.228507,87.158136,-14.88908,285.797736,
+ 0.973495,0.009594,-0.228507,88.836268,1.038584,293.615693,
+ 0.973495,0.009594,-0.228507,90.220611,-17.706198,298.726357,
+ 0.961899,0.031935,-0.271534,86.048965,-1.755108,283.413226,
+ 0.961899,0.031935,-0.271534,88.836268,1.038584,293.615693,
+ 0.961899,0.031935,-0.271534,87.158136,-14.88908,285.797736,
+ 0.947671,0.125896,-0.293376,86.048965,-1.755108,283.413226,
+ 0.947671,0.125896,-0.293376,83.502273,18.033772,283.678814,
+ 0.947671,0.125896,-0.293376,88.836268,1.038584,293.615693,
+ 0.97211,0.127743,-0.196684,81.886781,16.045666,274.403014,
+ 0.97211,0.127743,-0.196684,83.502273,18.033772,283.678814,
+ 0.97211,0.127743,-0.196684,86.048965,-1.755108,283.413226,
+ 0.934677,0.277456,-0.222253,81.886781,16.045666,274.403014,
+ 0.934677,0.277456,-0.222253,75.572651,38.636147,276.050693,
+ 0.934677,0.277456,-0.222253,83.502273,18.033772,283.678814,
+ 0.922794,0.277426,-0.26737,75.537236,29.979444,266.946172,
+ 0.922794,0.277426,-0.26737,75.572651,38.636147,276.050693,
+ 0.922794,0.277426,-0.26737,81.886781,16.045666,274.403014,
+ 0.636624,0.597582,-0.487447,57.157998,50.890607,259.988866,
+ 0.636624,0.597582,-0.487447,38.111334,75.809013,265.661737,
+ 0.636624,0.597582,-0.487447,60.474499,55.661453,270.169124,
+ 0.507626,0.540717,-0.670776,38.111334,75.809013,265.661737,
+ 0.507626,0.540717,-0.670776,57.157998,50.890607,259.988866,
+ 0.507626,0.540717,-0.670776,34.017996,65.099708,253.931151,
+ 0.333675,0.635319,-0.696442,16.876477,84.093041,263.044799,
+ 0.333675,0.635319,-0.696442,38.111334,75.809013,265.661737,
+ 0.333675,0.635319,-0.696442,34.017996,65.099708,253.931151,
+ 0.11208,0.510291,-0.852667,16.876477,84.093041,263.044799,
+ 0.11208,0.510291,-0.852667,34.017996,65.099708,253.931151,
+ 0.11208,0.510291,-0.852667,17.153929,71.748531,255.693522,
+ 0.028644,0.511921,-0.858555,0.020624,86.684728,264.027748,
+ 0.028644,0.511921,-0.858555,16.876477,84.093041,263.044799,
+ 0.028644,0.511921,-0.858555,17.153929,71.748531,255.693522,
+ 0.128745,0.591726,-0.795792,0.020624,86.684728,264.027748,
+ 0.128745,0.591726,-0.795792,17.153929,71.748531,255.693522,
+ 0.128745,0.591726,-0.795792,0.020624,74.753354,255.155958,
+ -0.068541,0.241175,-0.968058,0.020624,74.753354,255.155958,
+ -0.068541,0.241175,-0.968058,11.977248,55.136666,249.422242,
+ -0.068541,0.241175,-0.968058,0.020624,60.987508,251.726437,
+ 0.087037,0.327994,-0.940662,0.020624,74.753354,255.155958,
+ 0.087037,0.327994,-0.940662,17.153929,71.748531,255.693522,
+ 0.087037,0.327994,-0.940662,11.977248,55.136666,249.422242,
+ -0.05896,0.368603,-0.927715,17.153929,71.748531,255.693522,
+ -0.05896,0.368603,-0.927715,28.684335,51.227992,246.807434,
+ -0.05896,0.368603,-0.927715,11.977248,55.136666,249.422242,
+ 0.076442,0.432074,-0.898593,17.153929,71.748531,255.693522,
+ 0.076442,0.432074,-0.898593,34.017996,65.099708,253.931151,
+ 0.076442,0.432074,-0.898593,28.684335,51.227992,246.807434,
+ 0.069078,0.434589,-0.897976,34.017996,65.099708,253.931151,
+ 0.069078,0.434589,-0.897976,41.486399,51.448554,247.898991,
+ 0.069078,0.434589,-0.897976,28.684335,51.227992,246.807434,
+ 0.077966,0.250379,-0.965003,41.486399,51.448554,247.898991,
+ 0.077966,0.250379,-0.965003,43.781467,37.200512,244.387634,
+ 0.077966,0.250379,-0.965003,28.684335,51.227992,246.807434,
+ 0.372134,0.537854,-0.756459,34.017996,65.099708,253.931151,
+ 0.372134,0.537854,-0.756459,51.108284,50.166249,251.720657,
+ 0.372134,0.537854,-0.756459,41.486399,51.448554,247.898991,
+ 0.548715,0.696425,-0.462498,57.157998,50.890607,259.988866,
+ 0.548715,0.696425,-0.462498,51.108284,50.166249,251.720657,
+ 0.548715,0.696425,-0.462498,34.017996,65.099708,253.931151,
+ 0.706416,0.438857,-0.55532,51.108284,50.166249,251.720657,
+ 0.706416,0.438857,-0.55532,57.157998,50.890607,259.988866,
+ 0.706416,0.438857,-0.55532,60.630962,39.403097,255.328453,
+ -0.056065,0.08443,-0.994851,68.395953,-4.49404,242.728699,
+ -0.056065,0.08443,-0.994851,68.236753,-14.608281,241.879304,
+ -0.056065,0.08443,-0.994851,65.354805,-12.944479,242.18292,
+ -0.145669,-0.674399,-0.723855,65.354805,-12.944479,242.18292,
+ -0.145669,-0.674399,-0.723855,69.066159,-19.641369,247.675386,
+ -0.145669,-0.674399,-0.723855,65.784066,-19.040526,247.776084,
+ -0.462059,-0.701292,-0.542854,69.066159,-19.641369,247.675386,
+ -0.462059,-0.701292,-0.542854,65.354805,-12.944479,242.18292,
+ -0.462059,-0.701292,-0.542854,68.236753,-14.608281,241.879304,
+ -0.637544,-0.759113,-0.131473,66.900751,-21.398568,255.976147,
+ -0.637544,-0.759113,-0.131473,65.588814,-19.943768,253.938148,
+ -0.637544,-0.759113,-0.131473,65.784066,-19.040526,247.776084,
+ -0.181792,-0.951338,-0.248814,69.066159,-19.641369,247.675386,
+ -0.181792,-0.951338,-0.248814,66.900751,-21.398568,255.976147,
+ -0.181792,-0.951338,-0.248814,65.784066,-19.040526,247.776084,
+ -0.601347,0.265093,-0.753729,59.818835,-1.99727,250.449912,
+ -0.601347,0.265093,-0.753729,68.395953,-4.49404,242.728699,
+ -0.601347,0.265093,-0.753729,65.354805,-12.944479,242.18292,
+ -0.766454,0.092405,-0.635618,65.354805,-12.944479,242.18292,
+ -0.766454,0.092405,-0.635618,59.875877,-5.364121,249.89166,
+ -0.766454,0.092405,-0.635618,59.818835,-1.99727,250.449912,
+ -0.037791,0.162835,-0.985929,59.818835,-1.99727,250.449912,
+ -0.037791,0.162835,-0.985929,59.875877,-5.364121,249.89166,
+ -0.037791,0.162835,-0.985929,50.697977,-2.537269,250.710328,
+ -0.305321,-0.918284,-0.252058,59.875877,-5.364121,249.89166,
+ -0.305321,-0.918284,-0.252058,56.511004,-4.972584,252.54115,
+ -0.305321,-0.918284,-0.252058,50.697977,-2.537269,250.710328,
+ 0.210744,-0.214026,-0.953824,50.697977,-2.537269,250.710328,
+ 0.210744,-0.214026,-0.953824,56.511004,-4.972584,252.54115,
+ 0.210744,-0.214026,-0.953824,46.590371,-8.934194,251.238157,
+ 0.381333,-0.806079,-0.452572,56.511004,-4.972584,252.54115,
+ 0.381333,-0.806079,-0.452572,50.298926,-7.84507,252.423111,
+ 0.381333,-0.806079,-0.452572,46.590371,-8.934194,251.238157,
+ 0.312134,-0.586949,-0.747037,66.900751,-21.398568,255.976147,
+ 0.312134,-0.586949,-0.747037,58.229202,-26.936972,256.70446,
+ 0.312134,-0.586949,-0.747037,58.100394,-25.606903,255.605602,
+ 0.338938,-0.648789,-0.681318,65.588814,-19.943768,253.938148,
+ 0.338938,-0.648789,-0.681318,66.900751,-21.398568,255.976147,
+ 0.338938,-0.648789,-0.681318,58.100394,-25.606903,255.605602,
+ -0.587971,0.627015,-0.511021,65.588814,-19.943768,253.938148,
+ -0.587971,0.627015,-0.511021,58.100394,-25.606903,255.605602,
+ -0.587971,0.627015,-0.511021,57.707245,-24.372361,257.572716,
+ -0.252832,-0.30389,-0.918546,63.12119,-18.354195,254.091477,
+ -0.252832,-0.30389,-0.918546,65.588814,-19.943768,253.938148,
+ -0.252832,-0.30389,-0.918546,57.707245,-24.372361,257.572716,
+ -0.542383,-0.828612,-0.138645,65.784066,-19.040526,247.776084,
+ -0.542383,-0.828612,-0.138645,65.588814,-19.943768,253.938148,
+ -0.542383,-0.828612,-0.138645,63.12119,-18.354195,254.091477,
+ -0.730158,-0.640386,-0.238275,65.784066,-19.040526,247.776084,
+ -0.730158,-0.640386,-0.238275,63.12119,-18.354195,254.091477,
+ -0.730158,-0.640386,-0.238275,63.232171,-16.844939,249.695131,
+ -0.752109,-0.473523,-0.458375,65.354805,-12.944479,242.18292,
+ -0.752109,-0.473523,-0.458375,65.784066,-19.040526,247.776084,
+ -0.752109,-0.473523,-0.458375,63.232171,-16.844939,249.695131,
+ -0.888563,-0.253213,-0.382543,65.354805,-12.944479,242.18292,
+ -0.888563,-0.253213,-0.382543,63.232171,-16.844939,249.695131,
+ -0.888563,-0.253213,-0.382543,59.875877,-5.364121,249.89166,
+ -0.551738,-0.501473,-0.666416,56.511004,-4.972584,252.54115,
+ -0.551738,-0.501473,-0.666416,59.60095,-10.005976,253.77052,
+ -0.551738,-0.501473,-0.666416,54.750762,-9.445899,257.364627,
+ 0.355828,-0.746409,-0.56237,56.511004,-4.972584,252.54115,
+ 0.355828,-0.746409,-0.56237,54.750762,-9.445899,257.364627,
+ 0.355828,-0.746409,-0.56237,50.298926,-7.84507,252.423111,
+ -0.893942,-0.255025,-0.368552,63.232171,-16.844939,249.695131,
+ -0.893942,-0.255025,-0.368552,59.60095,-10.005976,253.77052,
+ -0.893942,-0.255025,-0.368552,59.875877,-5.364121,249.89166,
+ -0.56879,-0.507297,-0.647401,56.511004,-4.972584,252.54115,
+ -0.56879,-0.507297,-0.647401,59.875877,-5.364121,249.89166,
+ -0.56879,-0.507297,-0.647401,59.60095,-10.005976,253.77052,
+ -0.424651,0.726213,-0.540635,58.100394,-25.606903,255.605602,
+ -0.424651,0.726213,-0.540635,50.931165,-30.68532,254.415172,
+ -0.424651,0.726213,-0.540635,57.707245,-24.372361,257.572716,
+ -0.306669,0.6682,-0.677837,57.707245,-24.372361,257.572716,
+ -0.306669,0.6682,-0.677837,50.931165,-30.68532,254.415172,
+ -0.306669,0.6682,-0.677837,50.172429,-29.650957,255.778097,
+ 0.046444,0.453244,-0.890176,58.229202,-26.936972,256.70446,
+ 0.046444,0.453244,-0.890176,50.544891,-32.818845,253.308708,
+ 0.046444,0.453244,-0.890176,50.931165,-30.68532,254.415172,
+ 0.488772,-0.527036,-0.695223,58.100394,-25.606903,255.605602,
+ 0.488772,-0.527036,-0.695223,58.229202,-26.936972,256.70446,
+ 0.488772,-0.527036,-0.695223,50.931165,-30.68532,254.415172,
+ -0.395221,0.535383,-0.746435,50.172429,-29.650957,255.778097,
+ -0.395221,0.535383,-0.746435,50.544891,-32.818845,253.308708,
+ -0.395221,0.535383,-0.746435,46.908893,-29.995339,257.259061,
+ -0.586192,0.454092,-0.670954,50.172429,-29.650957,255.778097,
+ -0.586192,0.454092,-0.670954,50.931165,-30.68532,254.415172,
+ -0.586192,0.454092,-0.670954,50.544891,-32.818845,253.308708,
+ 0.394968,-0.708162,-0.585241,54.750762,-9.445899,257.364627,
+ 0.394968,-0.708162,-0.585241,46.590371,-8.934194,251.238157,
+ 0.394968,-0.708162,-0.585241,50.298926,-7.84507,252.423111,
+ 0.594564,-0.087564,-0.799266,46.590371,-8.934194,251.238157,
+ 0.594564,-0.087564,-0.799266,54.750762,-9.445899,257.364627,
+ 0.594564,-0.087564,-0.799266,50.326367,-11.89095,254.341245,
+ -0.194352,-0.360765,-0.912182,54.750762,-9.445899,257.364627,
+ -0.194352,-0.360765,-0.912182,58.295493,-14.4224,258.577569,
+ -0.194352,-0.360765,-0.912182,55.544118,-15.633213,259.642658,
+ 0.625214,-0.197797,-0.754973,54.750762,-9.445899,257.364627,
+ 0.625214,-0.197797,-0.754973,55.544118,-15.633213,259.642658,
+ 0.625214,-0.197797,-0.754973,50.326367,-11.89095,254.341245,
+ -0.756622,-0.60145,-0.25648,63.232171,-16.844939,249.695131,
+ -0.756622,-0.60145,-0.25648,58.295493,-14.4224,258.577569,
+ -0.756622,-0.60145,-0.25648,54.750762,-9.445899,257.364627,
+ -0.573475,0.172716,-0.80081,54.750762,-9.445899,257.364627,
+ -0.573475,0.172716,-0.80081,59.60095,-10.005976,253.77052,
+ -0.573475,0.172716,-0.80081,63.232171,-16.844939,249.695131,
+ -0.713598,-0.678977,-0.172536,63.12119,-18.354195,254.091477,
+ -0.713598,-0.678977,-0.172536,59.501347,-15.970598,259.682816,
+ -0.713598,-0.678977,-0.172536,58.295493,-14.4224,258.577569,
+ -0.736277,-0.634093,-0.236269,63.232171,-16.844939,249.695131,
+ -0.736277,-0.634093,-0.236269,63.12119,-18.354195,254.091477,
+ -0.736277,-0.634093,-0.236269,58.295493,-14.4224,258.577569,
+ 0.582029,-0.11013,-0.805676,46.590371,-8.934194,251.238157,
+ 0.582029,-0.11013,-0.805676,50.326367,-11.89095,254.341245,
+ 0.582029,-0.11013,-0.805676,43.444995,-16.548016,250.006657,
+ 0.262891,0.420009,-0.868609,50.326367,-11.89095,254.341245,
+ 0.262891,0.420009,-0.868609,49.385219,-15.630475,252.248182,
+ 0.262891,0.420009,-0.868609,43.444995,-16.548016,250.006657,
+ 0.737359,0.077459,-0.671045,50.326367,-11.89095,254.341245,
+ 0.737359,0.077459,-0.671045,55.544118,-15.633213,259.642658,
+ 0.737359,0.077459,-0.671045,53.520327,-16.335059,257.337855,
+ 0.777585,0.146545,-0.611463,49.385219,-15.630475,252.248182,
+ 0.777585,0.146545,-0.611463,50.326367,-11.89095,254.341245,
+ 0.777585,0.146545,-0.611463,53.520327,-16.335059,257.337855,
+ -0.244241,-0.967568,0.06449,53.520327,-16.335059,257.337855,
+ -0.244241,-0.967568,0.06449,52.589553,-15.786846,262.037816,
+ -0.244241,-0.967568,0.06449,49.385219,-15.630475,252.248182,
+ 0.065029,-0.997189,-0.037214,52.589553,-15.786846,262.037816,
+ 0.065029,-0.997189,-0.037214,48.017183,-15.896367,256.982521,
+ 0.065029,-0.997189,-0.037214,49.385219,-15.630475,252.248182,
+ 0.156427,-0.987636,-0.010267,49.385219,-15.630475,252.248182,
+ 0.156427,-0.987636,-0.010267,48.017183,-15.896367,256.982521,
+ 0.156427,-0.987636,-0.010267,43.444995,-16.548016,250.006657,
+ 0.808249,-0.309697,-0.50082,43.444995,-16.548016,250.006657,
+ 0.808249,-0.309697,-0.50082,48.017183,-15.896367,256.982521,
+ 0.808249,-0.309697,-0.50082,43.984993,-19.090723,252.450491,
+ -0.04329,-0.602597,-0.79687,58.295493,-14.4224,258.577569,
+ -0.04329,-0.602597,-0.79687,59.501347,-15.970598,259.682816,
+ -0.04329,-0.602597,-0.79687,55.544118,-15.633213,259.642658,
+ -0.084403,-0.995392,-0.045497,59.501347,-15.970598,259.682816,
+ -0.084403,-0.995392,-0.045497,55.179901,-15.725393,262.335044,
+ -0.084403,-0.995392,-0.045497,55.544118,-15.633213,259.642658,
+ -0.384628,-0.626587,-0.677827,38.955253,-39.644726,269.662286,
+ -0.384628,-0.626587,-0.677827,36.448749,-46.651925,277.562079,
+ -0.384628,-0.626587,-0.677827,34.378198,-44.780641,277.007174,
+ -0.398957,-0.619483,-0.676072,38.955253,-39.644726,269.662286,
+ -0.398957,-0.619483,-0.676072,41.896493,-39.767633,268.03925,
+ -0.398957,-0.619483,-0.676072,36.448749,-46.651925,277.562079,
+ 0.687588,-0.470376,-0.553144,6.60343,-34.282468,255.793308,
+ 0.687588,-0.470376,-0.553144,20.190696,-28.88918,268.096748,
+ 0.687588,-0.470376,-0.553144,15.335276,-34.097804,266.490444,
+ 0.564609,-0.775039,-0.283781,20.190696,-28.88918,268.096748,
+ 0.564609,-0.775039,-0.283781,6.60343,-34.282468,255.793308,
+ 0.564609,-0.775039,-0.283781,11.777069,-29.59498,253.284674,
+ 0.610152,-0.719037,-0.332717,28.354556,-18.998847,259.555042,
+ 0.610152,-0.719037,-0.332717,22.418531,-28.132878,268.408882,
+ 0.610152,-0.719037,-0.332717,17.039237,-24.388485,250.452041,
+ 0.642168,-0.642796,-0.417653,28.354556,-18.998847,259.555042,
+ 0.642168,-0.642796,-0.417653,17.039237,-24.388485,250.452041,
+ 0.642168,-0.642796,-0.417653,19.281674,-20.402234,247.764828,
+ 0.336353,-0.930235,-0.146731,22.418531,-28.132878,268.408882,
+ 0.336353,-0.930235,-0.146731,20.190696,-28.88918,268.096748,
+ 0.336353,-0.930235,-0.146731,11.777069,-29.59498,253.284674,
+ 0.569437,-0.753858,-0.327781,22.418531,-28.132878,268.408882,
+ 0.569437,-0.753858,-0.327781,11.777069,-29.59498,253.284674,
+ 0.569437,-0.753858,-0.327781,17.039237,-24.388485,250.452041,
+ 0.561094,-0.283175,-0.777808,20.190696,-28.88918,268.096748,
+ 0.561094,-0.283175,-0.777808,25.440391,-36.35454,274.601672,
+ 0.561094,-0.283175,-0.777808,15.335276,-34.097804,266.490444,
+ 0.347365,-0.697462,-0.626804,25.440391,-36.35454,274.601672,
+ 0.347365,-0.697462,-0.626804,19.789425,-40.364825,275.93235,
+ 0.347365,-0.697462,-0.626804,15.335276,-34.097804,266.490444,
+ 0.286084,-0.507197,-0.812962,22.418531,-28.132878,268.408882,
+ 0.286084,-0.507197,-0.812962,25.440391,-36.35454,274.601672,
+ 0.286084,-0.507197,-0.812962,20.190696,-28.88918,268.096748,
+ 0.384487,-0.46107,-0.79974,22.418531,-28.132878,268.408882,
+ 0.384487,-0.46107,-0.79974,25.797855,-31.934161,272.225072,
+ 0.384487,-0.46107,-0.79974,25.440391,-36.35454,274.601672,
+ 0.425215,-0.16807,-0.889351,35.006725,-26.777559,269.278659,
+ 0.425215,-0.16807,-0.889351,35.724695,-29.067759,270.054736,
+ 0.425215,-0.16807,-0.889351,31.147031,-32.13647,268.445998,
+ 0.123678,0.06478,-0.990206,35.006725,-26.777559,269.278659,
+ 0.123678,0.06478,-0.990206,31.147031,-32.13647,268.445998,
+ 0.123678,0.06478,-0.990206,29.733605,-30.107598,268.402189,
+ -0.540531,-0.392631,-0.744088,29.733605,-30.107598,268.402189,
+ -0.540531,-0.392631,-0.744088,31.147031,-32.13647,268.445998,
+ -0.540531,-0.392631,-0.744088,25.797855,-31.934161,272.225072,
+ -0.543037,-0.38109,-0.748252,25.797855,-31.934161,272.225072,
+ -0.543037,-0.38109,-0.748252,31.147031,-32.13647,268.445998,
+ -0.543037,-0.38109,-0.748252,31.803547,-35.917066,269.895018,
+ -0.289184,-0.600971,-0.745122,28.354556,-18.998847,259.555042,
+ -0.289184,-0.600971,-0.745122,34.047506,-22.654102,260.293698,
+ -0.289184,-0.600971,-0.745122,25.293451,-28.185813,268.152725,
+ -0.078288,-0.667175,-0.740776,28.354556,-18.998847,259.555042,
+ -0.078288,-0.667175,-0.740776,25.293451,-28.185813,268.152725,
+ -0.078288,-0.667175,-0.740776,22.418531,-28.132878,268.408882,
+ -0.458574,-0.514697,-0.724429,34.738095,-8.703591,249.9449,
+ -0.458574,-0.514697,-0.724429,43.444995,-16.548016,250.006657,
+ -0.458574,-0.514697,-0.724429,34.047506,-22.654102,260.293698,
+ -0.262376,-0.566504,-0.781174,34.738095,-8.703591,249.9449,
+ -0.262376,-0.566504,-0.781174,34.047506,-22.654102,260.293698,
+ -0.262376,-0.566504,-0.781174,28.354556,-18.998847,259.555042,
+ 0.110161,0.172937,-0.978753,40.582244,-6.289876,251.029155,
+ 0.110161,0.172937,-0.978753,46.590371,-8.934194,251.238157,
+ 0.110161,0.172937,-0.978753,34.738095,-8.703591,249.9449,
+ 0.109957,0.114274,-0.987345,34.738095,-8.703591,249.9449,
+ 0.109957,0.114274,-0.987345,46.590371,-8.934194,251.238157,
+ 0.109957,0.114274,-0.987345,43.444995,-16.548016,250.006657,
+ 0.021017,-0.140753,-0.989822,44.355843,0.278936,250.175197,
+ 0.021017,-0.140753,-0.989822,50.697977,-2.537269,250.710328,
+ 0.021017,-0.140753,-0.989822,40.582244,-6.289876,251.029155,
+ -0.001188,-0.081475,-0.996675,50.697977,-2.537269,250.710328,
+ -0.001188,-0.081475,-0.996675,46.590371,-8.934194,251.238157,
+ -0.001188,-0.081475,-0.996675,40.582244,-6.289876,251.029155,
+ -0.32673,-0.098466,-0.939974,47.956034,5.760754,248.349547,
+ -0.32673,-0.098466,-0.939974,44.355843,0.278936,250.175197,
+ -0.32673,-0.098466,-0.939974,39.872489,4.790583,251.260974,
+ -0.047033,-0.287685,-0.95657,47.956034,5.760754,248.349547,
+ -0.047033,-0.287685,-0.95657,50.697977,-2.537269,250.710328,
+ -0.047033,-0.287685,-0.95657,44.355843,0.278936,250.175197,
+ -0.121815,0.021052,-0.99233,50.726696,9.646611,248.091869,
+ -0.121815,0.021052,-0.99233,47.956034,5.760754,248.349547,
+ -0.121815,0.021052,-0.99233,32.266881,8.102673,250.32518,
+ -0.18948,-0.644417,-0.740826,32.266881,8.102673,250.32518,
+ -0.18948,-0.644417,-0.740826,47.956034,5.760754,248.349547,
+ -0.18948,-0.644417,-0.740826,39.872489,4.790583,251.260974,
+ 0.694314,-0.229307,-0.682163,24.298029,-1.622466,245.48345,
+ 0.694314,-0.229307,-0.682163,32.266881,8.102673,250.32518,
+ 0.694314,-0.229307,-0.682163,31.946229,-0.16371,252.777532,
+ 0.562087,-0.049551,-0.825592,32.266881,8.102673,250.32518,
+ 0.562087,-0.049551,-0.825592,24.298029,-1.622466,245.48345,
+ 0.562087,-0.049551,-0.825592,22.608063,6.502757,243.845202,
+ 0.662787,0.170677,-0.729098,31.946229,-0.16371,252.777532,
+ 0.662787,0.170677,-0.729098,24.292249,-8.708763,243.819343,
+ 0.662787,0.170677,-0.729098,24.298029,-1.622466,245.48345,
+ 0.14678,0.223191,-0.96366,64.133557,9.801766,251.749558,
+ 0.14678,0.223191,-0.96366,63.107743,3.59346,250.155423,
+ 0.14678,0.223191,-0.96366,47.956034,5.760754,248.349547,
+ 0.257776,-0.245761,-0.934426,64.133557,9.801766,251.749558,
+ 0.257776,-0.245761,-0.934426,47.956034,5.760754,248.349547,
+ 0.257776,-0.245761,-0.934426,50.726696,9.646611,248.091869,
+ -0.026324,-0.037134,-0.998964,63.107743,3.59346,250.155423,
+ -0.026324,-0.037134,-0.998964,59.818835,-1.99727,250.449912,
+ -0.026324,-0.037134,-0.998964,50.697977,-2.537269,250.710328,
+ 0.079535,-0.248373,-0.965394,47.956034,5.760754,248.349547,
+ 0.079535,-0.248373,-0.965394,63.107743,3.59346,250.155423,
+ 0.079535,-0.248373,-0.965394,50.697977,-2.537269,250.710328,
+ -0.475633,0.532136,-0.700432,69.936971,1.658593,246.356574,
+ -0.475633,0.532136,-0.700432,68.395953,-4.49404,242.728699,
+ -0.475633,0.532136,-0.700432,59.818835,-1.99727,250.449912,
+ -0.430211,0.206798,-0.878723,63.107743,3.59346,250.155423,
+ -0.430211,0.206798,-0.878723,69.936971,1.658593,246.356574,
+ -0.430211,0.206798,-0.878723,59.818835,-1.99727,250.449912,
+ 0.052702,0.656011,-0.752909,75.266677,-0.350504,246.819907,
+ 0.052702,0.656011,-0.752909,72.334046,-6.469976,241.28272,
+ 0.052702,0.656011,-0.752909,68.395953,-4.49404,242.728699,
+ 0.24325,0.446737,-0.860962,69.936971,1.658593,246.356574,
+ 0.24325,0.446737,-0.860962,75.266677,-0.350504,246.819907,
+ 0.24325,0.446737,-0.860962,68.395953,-4.49404,242.728699,
+ 0.854205,-0.319769,-0.409978,72.334046,-6.469976,241.28272,
+ 0.854205,-0.319769,-0.409978,77.383534,-8.556955,253.43131,
+ 0.854205,-0.319769,-0.409978,73.631015,-11.626579,248.006991,
+ 0.915273,-0.081698,-0.394462,72.334046,-6.469976,241.28272,
+ 0.915273,-0.081698,-0.394462,75.266677,-0.350504,246.819907,
+ 0.915273,-0.081698,-0.394462,77.383534,-8.556955,253.43131,
+ 0.779584,-0.622185,0.071658,69.066159,-19.641369,247.675386,
+ 0.779584,-0.622185,0.071658,77.383534,-8.556955,253.43131,
+ 0.779584,-0.622185,0.071658,66.900751,-21.398568,255.976147,
+ 0.830469,-0.459997,-0.314202,69.066159,-19.641369,247.675386,
+ 0.830469,-0.459997,-0.314202,73.631015,-11.626579,248.006991,
+ 0.830469,-0.459997,-0.314202,77.383534,-8.556955,253.43131,
+ 0.774121,-0.421357,-0.472435,72.334046,-6.469976,241.28272,
+ 0.774121,-0.421357,-0.472435,73.631015,-11.626579,248.006991,
+ 0.774121,-0.421357,-0.472435,69.066159,-19.641369,247.675386,
+ 0.770293,-0.422804,-0.477374,72.334046,-6.469976,241.28272,
+ 0.770293,-0.422804,-0.477374,69.066159,-19.641369,247.675386,
+ 0.770293,-0.422804,-0.477374,68.236753,-14.608281,241.879304,
+ -0.305831,0.084455,-0.948333,68.395953,-4.49404,242.728699,
+ -0.305831,0.084455,-0.948333,72.334046,-6.469976,241.28272,
+ -0.305831,0.084455,-0.948333,68.236753,-14.608281,241.879304,
+ 0.542536,-0.83421,0.098737,48.017183,-15.896367,256.982521,
+ 0.542536,-0.83421,0.098737,47.081997,-16.024446,261.039048,
+ 0.542536,-0.83421,0.098737,39.391206,-20.635574,264.339578,
+ 0.450301,-0.891669,-0.04642,48.017183,-15.896367,256.982521,
+ 0.450301,-0.891669,-0.04642,39.391206,-20.635574,264.339578,
+ 0.450301,-0.891669,-0.04642,38.26588,-21.160969,263.515434,
+ 0.541287,-0.835576,0.093917,47.755246,-15.261451,263.947128,
+ 0.541287,-0.835576,0.093917,39.391206,-20.635574,264.339578,
+ 0.541287,-0.835576,0.093917,47.081997,-16.024446,261.039048,
+ -0.319433,-0.895818,0.308988,47.755246,-15.261451,263.947128,
+ -0.319433,-0.895818,0.308988,47.081997,-16.024446,261.039048,
+ -0.319433,-0.895818,0.308988,47.661849,-15.899409,262.001005,
+ 0.021817,-0.993019,0.115922,52.589553,-15.786846,262.037816,
+ 0.021817,-0.993019,0.115922,47.661849,-15.899409,262.001005,
+ 0.021817,-0.993019,0.115922,47.081997,-16.024446,261.039048,
+ 0.046844,-0.998687,-0.020733,52.589553,-15.786846,262.037816,
+ 0.046844,-0.998687,-0.020733,47.081997,-16.024446,261.039048,
+ 0.046844,-0.998687,-0.020733,48.017183,-15.896367,256.982521,
+ 0.089294,-0.782315,-0.61645,55.179901,-15.725393,262.335044,
+ 0.089294,-0.782315,-0.61645,52.057951,-17.264768,263.836391,
+ 0.089294,-0.782315,-0.61645,52.589553,-15.786846,262.037816,
+ 0.02243,-0.775664,-0.630748,52.589553,-15.786846,262.037816,
+ 0.02243,-0.775664,-0.630748,52.057951,-17.264768,263.836391,
+ 0.02243,-0.775664,-0.630748,47.661849,-15.899409,262.001005,
+ 0.390826,-0.918983,0.052203,39.391206,-20.635574,264.339578,
+ 0.390826,-0.918983,0.052203,27.621071,-25.251265,271.203791,
+ 0.390826,-0.918983,0.052203,38.26588,-21.160969,263.515434,
+ 0.547044,-0.689897,0.474116,39.391206,-20.635574,264.339578,
+ 0.547044,-0.689897,0.474116,28.629879,-24.211122,271.553345,
+ 0.547044,-0.689897,0.474116,27.621071,-25.251265,271.203791,
+ 0.115119,0.721902,-0.682353,28.265723,-27.239979,274.354642,
+ 0.115119,0.721902,-0.682353,26.149538,-30.496701,270.552142,
+ 0.115119,0.721902,-0.682353,26.43916,-28.022444,273.218669,
+ -0.44155,0.78796,-0.42913,28.315311,-29.993514,269.247629,
+ -0.44155,0.78796,-0.42913,26.149538,-30.496701,270.552142,
+ -0.44155,0.78796,-0.42913,28.265723,-27.239979,274.354642,
+ 0.970214,-0.109917,-0.215878,25.293451,-28.185813,268.152725,
+ 0.970214,-0.109917,-0.215878,26.036975,-26.641874,270.70821,
+ 0.970214,-0.109917,-0.215878,26.43916,-28.022444,273.218669,
+ 0.966599,0.126857,-0.222696,25.293451,-28.185813,268.152725,
+ 0.966599,0.126857,-0.222696,26.43916,-28.022444,273.218669,
+ 0.966599,0.126857,-0.222696,26.149538,-30.496701,270.552142,
+ -0.116422,-0.213091,0.970071,28.629879,-24.211122,271.553345,
+ -0.116422,-0.213091,0.970071,26.036975,-26.641874,270.70821,
+ -0.116422,-0.213091,0.970071,27.621071,-25.251265,271.203791,
+ -0.111684,-0.966959,0.229166,42.405765,-19.694608,269.779108,
+ -0.111684,-0.966959,0.229166,39.046216,-18.900582,271.492196,
+ -0.111684,-0.966959,0.229166,39.391206,-20.635574,264.339578,
+ 0.430012,-0.861829,-0.268961,51.956705,-17.551652,268.07819,
+ 0.430012,-0.861829,-0.268961,49.447919,-19.156131,269.208384,
+ 0.430012,-0.861829,-0.268961,50.415809,-17.159811,264.359048,
+ 0.529566,-0.835075,-0.149026,47.755246,-15.261451,263.947128,
+ 0.529566,-0.835075,-0.149026,42.405765,-19.694608,269.779108,
+ 0.529566,-0.835075,-0.149026,39.391206,-20.635574,264.339578,
+ -0.067874,-0.763295,-0.642474,47.755246,-15.261451,263.947128,
+ -0.067874,-0.763295,-0.642474,45.741889,-19.865278,269.62943,
+ -0.067874,-0.763295,-0.642474,42.405765,-19.694608,269.779108,
+ 0.436187,-0.640758,-0.631799,35.423208,-21.001556,272.969205,
+ 0.436187,-0.640758,-0.631799,32.668761,-23.978999,274.087229,
+ 0.436187,-0.640758,-0.631799,28.265723,-27.239979,274.354642,
+ 0.434278,-0.639207,-0.634678,35.423208,-21.001556,272.969205,
+ 0.434278,-0.639207,-0.634678,28.265723,-27.239979,274.354642,
+ 0.434278,-0.639207,-0.634678,28.629879,-24.211122,271.553345,
+ 0.442948,-0.866153,0.231465,39.391206,-20.635574,264.339578,
+ 0.442948,-0.866153,0.231465,39.046216,-18.900582,271.492196,
+ 0.442948,-0.866153,0.231465,28.629879,-24.211122,271.553345,
+ 0.4481,-0.880692,-0.153582,39.046216,-18.900582,271.492196,
+ 0.4481,-0.880692,-0.153582,35.423208,-21.001556,272.969205,
+ 0.4481,-0.880692,-0.153582,28.629879,-24.211122,271.553345,
+ 0.594233,-0.583451,-0.553599,28.629879,-24.211122,271.553345,
+ 0.594233,-0.583451,-0.553599,28.265723,-27.239979,274.354642,
+ 0.594233,-0.583451,-0.553599,26.43916,-28.022444,273.218669,
+ 0.687874,-0.58382,-0.431258,26.036975,-26.641874,270.70821,
+ 0.687874,-0.58382,-0.431258,28.629879,-24.211122,271.553345,
+ 0.687874,-0.58382,-0.431258,26.43916,-28.022444,273.218669,
+ -0.365515,-0.655638,-0.66071,47.755246,-15.261451,263.947128,
+ -0.365515,-0.655638,-0.66071,50.415809,-17.159811,264.359048,
+ -0.365515,-0.655638,-0.66071,45.741889,-19.865278,269.62943,
+ 0.136887,-0.925324,-0.353606,50.415809,-17.159811,264.359048,
+ 0.136887,-0.925324,-0.353606,49.447919,-19.156131,269.208384,
+ 0.136887,-0.925324,-0.353606,45.741889,-19.865278,269.62943,
+ -0.375267,0.729906,-0.571325,57.707245,-24.372361,257.572716,
+ -0.375267,0.729906,-0.571325,50.172429,-29.650957,255.778097,
+ -0.375267,0.729906,-0.571325,51.126781,-24.703966,261.471351,
+ -0.307856,0.839226,-0.448246,57.707245,-24.372361,257.572716,
+ -0.307856,0.839226,-0.448246,51.126781,-24.703966,261.471351,
+ -0.307856,0.839226,-0.448246,55.295293,-23.160027,261.499035,
+ -0.748248,0.345523,-0.566339,63.12119,-18.354195,254.091477,
+ -0.748248,0.345523,-0.566339,57.707245,-24.372361,257.572716,
+ -0.748248,0.345523,-0.566339,55.295293,-23.160027,261.499035,
+ -0.745303,0.283592,-0.603406,63.12119,-18.354195,254.091477,
+ -0.745303,0.283592,-0.603406,55.295293,-23.160027,261.499035,
+ -0.745303,0.283592,-0.603406,59.501347,-15.970598,259.682816,
+ -0.234477,-0.6087,-0.757961,55.179901,-15.725393,262.335044,
+ -0.234477,-0.6087,-0.757961,56.006813,-18.163447,264.037179,
+ -0.234477,-0.6087,-0.757961,53.572866,-19.352964,265.745398,
+ -0.016246,-0.681036,-0.732069,55.179901,-15.725393,262.335044,
+ -0.016246,-0.681036,-0.732069,53.572866,-19.352964,265.745398,
+ -0.016246,-0.681036,-0.732069,52.057951,-17.264768,263.836391,
+ -0.808313,0.354056,-0.470398,59.501347,-15.970598,259.682816,
+ -0.808313,0.354056,-0.470398,55.295293,-23.160027,261.499035,
+ -0.808313,0.354056,-0.470398,56.006813,-18.163447,264.037179,
+ -0.439476,-0.609632,-0.659705,55.179901,-15.725393,262.335044,
+ -0.439476,-0.609632,-0.659705,59.501347,-15.970598,259.682816,
+ -0.439476,-0.609632,-0.659705,56.006813,-18.163447,264.037179,
+ -0.649788,0.415769,-0.636326,55.295293,-23.160027,261.499035,
+ -0.649788,0.415769,-0.636326,53.572866,-19.352964,265.745398,
+ -0.649788,0.415769,-0.636326,56.006813,-18.163447,264.037179,
+ -0.646729,0.418576,-0.637602,55.295293,-23.160027,261.499035,
+ -0.646729,0.418576,-0.637602,53.686038,-22.490125,263.571107,
+ -0.646729,0.418576,-0.637602,53.572866,-19.352964,265.745398,
+ -0.303225,0.827168,-0.473125,55.295293,-23.160027,261.499035,
+ -0.303225,0.827168,-0.473125,51.126781,-24.703966,261.471351,
+ -0.303225,0.827168,-0.473125,51.691878,-23.439001,263.32073,
+ -0.317936,0.801723,-0.506119,55.295293,-23.160027,261.499035,
+ -0.317936,0.801723,-0.506119,51.691878,-23.439001,263.32073,
+ -0.317936,0.801723,-0.506119,53.686038,-22.490125,263.571107,
+ -0.437674,0.770552,-0.463348,50.027558,-20.481332,268.249164,
+ -0.437674,0.770552,-0.463348,48.804515,-23.715541,264.025922,
+ -0.437674,0.770552,-0.463348,46.989209,-21.5233,269.386355,
+ -0.125785,0.902586,-0.411725,48.804515,-23.715541,264.025922,
+ -0.125785,0.902586,-0.411725,47.518863,-23.376939,265.160983,
+ -0.125785,0.902586,-0.411725,46.989209,-21.5233,269.386355,
+ -0.145488,0.871694,-0.467955,46.989209,-21.5233,269.386355,
+ -0.145488,0.871694,-0.467955,46.336952,-24.186784,264.627678,
+ -0.145488,0.871694,-0.467955,44.951818,-22.347748,268.484026,
+ -0.381771,0.827836,-0.411021,47.518863,-23.376939,265.160983,
+ -0.381771,0.827836,-0.411021,46.336952,-24.186784,264.627678,
+ -0.381771,0.827836,-0.411021,46.989209,-21.5233,269.386355,
+ -0.227645,0.820474,-0.524404,51.126781,-24.703966,261.471351,
+ -0.227645,0.820474,-0.524404,48.486783,-25.057474,262.064284,
+ -0.227645,0.820474,-0.524404,48.804515,-23.715541,264.025922,
+ -0.204454,0.835945,-0.509308,51.691878,-23.439001,263.32073,
+ -0.204454,0.835945,-0.509308,51.126781,-24.703966,261.471351,
+ -0.204454,0.835945,-0.509308,48.804515,-23.715541,264.025922,
+ -0.451367,0.658491,-0.602211,50.172429,-29.650957,255.778097,
+ -0.451367,0.658491,-0.602211,46.336952,-24.186784,264.627678,
+ -0.451367,0.658491,-0.602211,48.486783,-25.057474,262.064284,
+ 0.027207,-0.999164,-0.030528,55.544118,-15.633213,259.642658,
+ 0.027207,-0.999164,-0.030528,55.179901,-15.725393,262.335044,
+ 0.027207,-0.999164,-0.030528,52.589553,-15.786846,262.037816,
+ 0.170106,-0.974349,0.147337,55.544118,-15.633213,259.642658,
+ 0.170106,-0.974349,0.147337,52.589553,-15.786846,262.037816,
+ 0.170106,-0.974349,0.147337,53.520327,-16.335059,257.337855,
+ -0.274173,-0.696029,-0.663606,43.984993,-19.090723,252.450491,
+ -0.274173,-0.696029,-0.663606,34.047506,-22.654102,260.293698,
+ -0.274173,-0.696029,-0.663606,43.444995,-16.548016,250.006657,
+ 0.481556,-0.846949,0.225348,43.984993,-19.090723,252.450491,
+ 0.481556,-0.846949,0.225348,36.758145,-20.259248,263.502048,
+ 0.481556,-0.846949,0.225348,34.047506,-22.654102,260.293698,
+ 0.592275,-0.799913,0.096694,36.758145,-20.259248,263.502048,
+ 0.592275,-0.799913,0.096694,25.293451,-28.185813,268.152725,
+ 0.592275,-0.799913,0.096694,34.047506,-22.654102,260.293698,
+ 0.618922,-0.738913,0.26635,36.758145,-20.259248,263.502048,
+ 0.618922,-0.738913,0.26635,26.036975,-26.641874,270.70821,
+ 0.618922,-0.738913,0.26635,25.293451,-28.185813,268.152725,
+ -0.232808,-0.712898,-0.661496,28.315311,-29.993514,269.247629,
+ -0.232808,-0.712898,-0.661496,25.797855,-31.934161,272.225072,
+ -0.232808,-0.712898,-0.661496,26.149538,-30.496701,270.552142,
+ -0.472751,-0.500001,-0.725607,28.315311,-29.993514,269.247629,
+ -0.472751,-0.500001,-0.725607,29.733605,-30.107598,268.402189,
+ -0.472751,-0.500001,-0.725607,25.797855,-31.934161,272.225072,
+ -0.073334,-0.738298,-0.670476,25.797855,-31.934161,272.225072,
+ -0.073334,-0.738298,-0.670476,22.418531,-28.132878,268.408882,
+ -0.073334,-0.738298,-0.670476,25.293451,-28.185813,268.152725,
+ -0.13505,-0.737308,-0.66192,26.149538,-30.496701,270.552142,
+ -0.13505,-0.737308,-0.66192,25.797855,-31.934161,272.225072,
+ -0.13505,-0.737308,-0.66192,25.293451,-28.185813,268.152725,
+ -0.328735,0.690217,-0.644619,35.006725,-26.777559,269.278659,
+ -0.328735,0.690217,-0.644619,29.733605,-30.107598,268.402189,
+ -0.328735,0.690217,-0.644619,28.315311,-29.993514,269.247629,
+ -0.384357,0.804105,-0.453525,35.006725,-26.777559,269.278659,
+ -0.384357,0.804105,-0.453525,28.315311,-29.993514,269.247629,
+ -0.384357,0.804105,-0.453525,34.158548,-26.513796,270.465134,
+ -0.02467,-0.049623,-0.998463,38.904143,-25.731331,269.816832,
+ -0.02467,-0.049623,-0.998463,40.688419,-28.405767,269.905666,
+ -0.02467,-0.049623,-0.998463,38.583795,-27.977723,269.936392,
+ -0.532787,-0.38056,-0.755851,43.875168,-24.972291,265.930671,
+ -0.532787,-0.38056,-0.755851,40.688419,-28.405767,269.905666,
+ -0.532787,-0.38056,-0.755851,38.904143,-25.731331,269.816832,
+ 0.074612,-0.298987,-0.951336,35.006725,-26.777559,269.278659,
+ 0.074612,-0.298987,-0.951336,38.583795,-27.977723,269.936392,
+ 0.074612,-0.298987,-0.951336,35.724695,-29.067759,270.054736,
+ 0.156048,-0.074674,-0.984923,38.904143,-25.731331,269.816832,
+ 0.156048,-0.074674,-0.984923,38.583795,-27.977723,269.936392,
+ 0.156048,-0.074674,-0.984923,35.006725,-26.777559,269.278659,
+ -0.620592,0.236292,-0.747685,38.382398,-24.415865,270.665618,
+ -0.620592,0.236292,-0.747685,43.875168,-24.972291,265.930671,
+ -0.620592,0.236292,-0.747685,38.904143,-25.731331,269.816832,
+ -0.572438,0.406884,-0.711871,43.220782,-23.689377,267.19016,
+ -0.572438,0.406884,-0.711871,43.875168,-24.972291,265.930671,
+ -0.572438,0.406884,-0.711871,38.382398,-24.415865,270.665618,
+ -0.198447,0.917104,-0.345743,38.904143,-25.731331,269.816832,
+ -0.198447,0.917104,-0.345743,35.006725,-26.777559,269.278659,
+ -0.198447,0.917104,-0.345743,34.158548,-26.513796,270.465134,
+ -0.195595,0.475749,-0.857558,38.382398,-24.415865,270.665618,
+ -0.195595,0.475749,-0.857558,38.904143,-25.731331,269.816832,
+ -0.195595,0.475749,-0.857558,34.158548,-26.513796,270.465134,
+ -0.586684,0.037311,-0.808956,35.423208,-21.001556,272.969205,
+ -0.586684,0.037311,-0.808956,43.220782,-23.689377,267.19016,
+ -0.586684,0.037311,-0.808956,38.382398,-24.415865,270.665618,
+ -0.50187,0.293444,-0.813645,39.046216,-18.900582,271.492196,
+ -0.50187,0.293444,-0.813645,43.220782,-23.689377,267.19016,
+ -0.50187,0.293444,-0.813645,35.423208,-21.001556,272.969205,
+ -0.322007,0.708337,-0.628148,38.382398,-24.415865,270.665618,
+ -0.322007,0.708337,-0.628148,34.158548,-26.513796,270.465134,
+ -0.322007,0.708337,-0.628148,32.668761,-23.978999,274.087229,
+ -0.500503,0.142361,-0.85395,35.423208,-21.001556,272.969205,
+ -0.500503,0.142361,-0.85395,38.382398,-24.415865,270.665618,
+ -0.500503,0.142361,-0.85395,32.668761,-23.978999,274.087229,
+ -0.561736,0.725923,-0.396848,32.668761,-23.978999,274.087229,
+ -0.561736,0.725923,-0.396848,28.315311,-29.993514,269.247629,
+ -0.561736,0.725923,-0.396848,28.265723,-27.239979,274.354642,
+ -0.298243,0.720045,-0.626567,34.158548,-26.513796,270.465134,
+ -0.298243,0.720045,-0.626567,28.315311,-29.993514,269.247629,
+ -0.298243,0.720045,-0.626567,32.668761,-23.978999,274.087229,
+ -0.277381,-0.476187,-0.834449,36.758145,-20.259248,263.502048,
+ -0.277381,-0.476187,-0.834449,38.26588,-21.160969,263.515434,
+ -0.277381,-0.476187,-0.834449,26.036975,-26.641874,270.70821,
+ 0.549513,-0.75413,0.359615,38.26588,-21.160969,263.515434,
+ 0.549513,-0.75413,0.359615,27.621071,-25.251265,271.203791,
+ 0.549513,-0.75413,0.359615,26.036975,-26.641874,270.70821,
+ -0.286265,-0.490868,-0.822861,48.017183,-15.896367,256.982521,
+ -0.286265,-0.490868,-0.822861,38.26588,-21.160969,263.515434,
+ -0.286265,-0.490868,-0.822861,36.758145,-20.259248,263.502048,
+ 0.454948,-0.866389,0.205894,48.017183,-15.896367,256.982521,
+ 0.454948,-0.866389,0.205894,36.758145,-20.259248,263.502048,
+ 0.454948,-0.866389,0.205894,43.984993,-19.090723,252.450491,
+ -0.505375,0.658165,-0.558046,46.908893,-29.995339,257.259061,
+ -0.505375,0.658165,-0.558046,43.875168,-24.972291,265.930671,
+ -0.505375,0.658165,-0.558046,46.336952,-24.186784,264.627678,
+ -0.347237,0.723181,-0.597023,50.172429,-29.650957,255.778097,
+ -0.347237,0.723181,-0.597023,46.908893,-29.995339,257.259061,
+ -0.347237,0.723181,-0.597023,46.336952,-24.186784,264.627678,
+ -0.309434,0.471905,-0.825564,39.046216,-18.900582,271.492196,
+ -0.309434,0.471905,-0.825564,42.405765,-19.694608,269.779108,
+ -0.309434,0.471905,-0.825564,43.220782,-23.689377,267.19016,
+ 0.171549,0.560205,-0.810396,42.405765,-19.694608,269.779108,
+ 0.171549,0.560205,-0.810396,44.951818,-22.347748,268.484026,
+ 0.171549,0.560205,-0.810396,43.220782,-23.689377,267.19016,
+ -0.00689,0.698753,-0.715329,44.951818,-22.347748,268.484026,
+ -0.00689,0.698753,-0.715329,43.875168,-24.972291,265.930671,
+ -0.00689,0.698753,-0.715329,43.220782,-23.689377,267.19016,
+ -0.495101,0.701634,-0.512431,46.336952,-24.186784,264.627678,
+ -0.495101,0.701634,-0.512431,43.875168,-24.972291,265.930671,
+ -0.495101,0.701634,-0.512431,44.951818,-22.347748,268.484026,
+ -0.038568,0.116483,-0.992444,42.405765,-19.694608,269.779108,
+ -0.038568,0.116483,-0.992444,45.741889,-19.865278,269.62943,
+ -0.038568,0.116483,-0.992444,46.989209,-21.5233,269.386355,
+ 0.14607,0.543625,-0.82652,42.405765,-19.694608,269.779108,
+ 0.14607,0.543625,-0.82652,46.989209,-21.5233,269.386355,
+ 0.14607,0.543625,-0.82652,44.951818,-22.347748,268.484026,
+ -0.193796,0.518196,-0.833016,49.447919,-19.156131,269.208384,
+ -0.193796,0.518196,-0.833016,50.027558,-20.481332,268.249164,
+ -0.193796,0.518196,-0.833016,45.741889,-19.865278,269.62943,
+ -0.318128,-0.10113,-0.942638,45.741889,-19.865278,269.62943,
+ -0.318128,-0.10113,-0.942638,50.027558,-20.481332,268.249164,
+ -0.318128,-0.10113,-0.942638,46.989209,-21.5233,269.386355,
+ -0.57734,0.402218,-0.710563,51.956705,-17.551652,268.07819,
+ -0.57734,0.402218,-0.710563,53.572866,-19.352964,265.745398,
+ -0.57734,0.402218,-0.710563,49.447919,-19.156131,269.208384,
+ -0.611334,0.270834,-0.743586,49.447919,-19.156131,269.208384,
+ -0.611334,0.270834,-0.743586,53.572866,-19.352964,265.745398,
+ -0.611334,0.270834,-0.743586,50.027558,-20.481332,268.249164,
+ -0.085572,-0.993922,-0.069264,52.057951,-17.264768,263.836391,
+ -0.085572,-0.993922,-0.069264,51.956705,-17.551652,268.07819,
+ -0.085572,-0.993922,-0.069264,50.415809,-17.159811,264.359048,
+ -0.780747,-0.621893,-0.060695,52.057951,-17.264768,263.836391,
+ -0.780747,-0.621893,-0.060695,53.572866,-19.352964,265.745398,
+ -0.780747,-0.621893,-0.060695,51.956705,-17.551652,268.07819,
+ -0.586102,-0.76118,0.27765,50.415809,-17.159811,264.359048,
+ -0.586102,-0.76118,0.27765,47.755246,-15.261451,263.947128,
+ -0.586102,-0.76118,0.27765,47.661849,-15.899409,262.001005,
+ -0.159692,-0.93597,-0.313782,52.057951,-17.264768,263.836391,
+ -0.159692,-0.93597,-0.313782,50.415809,-17.159811,264.359048,
+ -0.159692,-0.93597,-0.313782,47.661849,-15.899409,262.001005,
+ -0.981187,-0.162852,-0.103692,16.006091,-83.423519,263.258669,
+ -0.981187,-0.162852,-0.103692,16.082451,-89.188266,271.589852,
+ -0.981187,-0.162852,-0.103692,14.929137,-86.016423,277.521618,
+ -0.996349,-0.028626,-0.080435,16.006091,-83.423519,263.258669,
+ -0.996349,-0.028626,-0.080435,14.929137,-86.016423,277.521618,
+ -0.996349,-0.028626,-0.080435,15.540323,-79.63623,267.680265,
+ -0.966341,-0.14581,0.211953,15.320065,-87.584395,257.268492,
+ -0.966341,-0.14581,0.211953,18.180382,-94.295584,265.692463,
+ -0.966341,-0.14581,0.211953,16.006091,-83.423519,263.258669,
+ -0.963037,-0.225559,-0.147249,16.006091,-83.423519,263.258669,
+ -0.963037,-0.225559,-0.147249,18.180382,-94.295584,265.692463,
+ -0.963037,-0.225559,-0.147249,16.082451,-89.188266,271.589852,
+ -0.946172,-0.216598,0.240507,15.110455,-89.312085,254.887936,
+ -0.946172,-0.216598,0.240507,18.869754,-98.231638,261.644454,
+ -0.946172,-0.216598,0.240507,15.320065,-87.584395,257.268492,
+ -0.955572,-0.275402,0.105053,15.320065,-87.584395,257.268492,
+ -0.955572,-0.275402,0.105053,18.869754,-98.231638,261.644454,
+ -0.955572,-0.275402,0.105053,18.180382,-94.295584,265.692463,
+ -0.960422,-0.047022,-0.274553,18.180382,-94.295584,265.692463,
+ -0.960422,-0.047022,-0.274553,18.376303,-109.031601,267.530891,
+ -0.960422,-0.047022,-0.274553,17.158188,-109.417966,271.858178,
+ -0.989834,-0.030491,-0.13892,18.869754,-98.231638,261.644454,
+ -0.989834,-0.030491,-0.13892,18.376303,-109.031601,267.530891,
+ -0.989834,-0.030491,-0.13892,18.180382,-94.295584,265.692463,
+ -0.936673,-0.054397,-0.345954,16.082451,-89.188266,271.589852,
+ -0.936673,-0.054397,-0.345954,17.158188,-109.417966,271.858178,
+ -0.936673,-0.054397,-0.345954,14.954692,-102.296988,276.704471,
+ -0.954758,-0.054648,-0.292318,18.180382,-94.295584,265.692463,
+ -0.954758,-0.054648,-0.292318,17.158188,-109.417966,271.858178,
+ -0.954758,-0.054648,-0.292318,16.082451,-89.188266,271.589852,
+ -0.938662,-0.130562,-0.319168,14.954692,-102.296988,276.704471,
+ -0.938662,-0.130562,-0.319168,12.505686,-98.507265,282.356655,
+ -0.938662,-0.130562,-0.319168,12.765493,-92.536559,279.15013,
+ -0.896162,-0.092248,-0.434032,16.082451,-89.188266,271.589852,
+ -0.896162,-0.092248,-0.434032,14.954692,-102.296988,276.704471,
+ -0.896162,-0.092248,-0.434032,12.765493,-92.536559,279.15013,
+ -0.924471,0.231027,-0.30328,16.082451,-89.188266,271.589852,
+ -0.924471,0.231027,-0.30328,12.765493,-92.536559,279.15013,
+ -0.924471,0.231027,-0.30328,14.929137,-86.016423,277.521618,
+ -0.400244,0.860674,0.314715,13.459733,-87.564925,251.785761,
+ -0.400244,0.860674,0.314715,6.178428,-89.47302,247.743837,
+ -0.400244,0.860674,0.314715,5.639647,-90.396036,249.582873,
+ -0.510053,0.555805,0.656451,14.293004,-85.696075,250.85088,
+ -0.510053,0.555805,0.656451,6.178428,-89.47302,247.743837,
+ -0.510053,0.555805,0.656451,13.459733,-87.564925,251.785761,
+ 0.272694,0.737209,0.618191,5.639647,-90.396036,249.582873,
+ 0.272694,0.737209,0.618191,0.020624,-85.926677,246.731682,
+ 0.272694,0.737209,0.618191,0.020624,-87.742287,248.896847,
+ 0.368606,0.783029,0.500994,6.178428,-89.47302,247.743837,
+ 0.368606,0.783029,0.500994,0.020624,-85.926677,246.731682,
+ 0.368606,0.783029,0.500994,5.639647,-90.396036,249.582873,
+ -0.406597,-0.221951,0.886237,5.639647,-90.396036,249.582873,
+ -0.406597,-0.221951,0.886237,7.047902,-95.387141,248.978987,
+ -0.406597,-0.221951,0.886237,14.035022,-93.348838,252.695087,
+ -0.308511,0.117713,0.943909,13.459733,-87.564925,251.785761,
+ -0.308511,0.117713,0.943909,5.639647,-90.396036,249.582873,
+ -0.308511,0.117713,0.943909,14.035022,-93.348838,252.695087,
+ 0.266994,0.25541,0.929236,0.020624,-87.742287,248.896847,
+ 0.266994,0.25541,0.929236,0.020624,-91.878521,250.033733,
+ 0.266994,0.25541,0.929236,7.047902,-95.387141,248.978987,
+ -0.199451,-0.172975,0.96452,0.020624,-87.742287,248.896847,
+ -0.199451,-0.172975,0.96452,7.047902,-95.387141,248.978987,
+ -0.199451,-0.172975,0.96452,5.639647,-90.396036,249.582873,
+ -0.903877,-0.130788,0.407308,13.459733,-87.564925,251.785761,
+ -0.903877,-0.130788,0.407308,15.110455,-89.312085,254.887936,
+ -0.903877,-0.130788,0.407308,14.000036,-86.506833,253.324528,
+ -0.886258,-0.015369,0.462937,13.459733,-87.564925,251.785761,
+ -0.886258,-0.015369,0.462937,14.035022,-93.348838,252.695087,
+ -0.886258,-0.015369,0.462937,15.110455,-89.312085,254.887936,
+ -0.907234,0.41955,0.030062,14.293004,-85.696075,250.85088,
+ -0.907234,0.41955,0.030062,13.459733,-87.564925,251.785761,
+ -0.907234,0.41955,0.030062,14.000036,-86.506833,253.324528,
+ -0.792316,0.601311,0.103246,14.293004,-85.696075,250.85088,
+ -0.792316,0.601311,0.103246,14.000036,-86.506833,253.324528,
+ -0.792316,0.601311,0.103246,16.160333,-83.837873,254.358586,
+ -0.605582,0.190848,0.772559,16.160333,-83.837873,254.358586,
+ -0.605582,0.190848,0.772559,14.000036,-86.506833,253.324528,
+ -0.605582,0.190848,0.772559,15.110455,-89.312085,254.887936,
+ -0.981849,0.183768,-0.046917,16.160333,-83.837873,254.358586,
+ -0.981849,0.183768,-0.046917,15.110455,-89.312085,254.887936,
+ -0.981849,0.183768,-0.046917,15.320065,-87.584395,257.268492,
+ 0.992157,0.07126,0.102692,0.020624,-96.776837,251.863947,
+ 0.992157,0.07126,0.102692,0.632115,-113.08965,257.275793,
+ 0.992157,0.07126,0.102692,0.944249,-112.04038,253.532009,
+ 0.953416,0.126579,0.273818,0.020624,-96.776837,251.863947,
+ 0.953416,0.126579,0.273818,0.020624,-108.010625,257.057056,
+ 0.953416,0.126579,0.273818,0.632115,-113.08965,257.275793,
+ 0.968453,0.206992,0.138757,0.944249,-112.04038,253.532009,
+ 0.968453,0.206992,0.138757,0.632115,-113.08965,257.275793,
+ 0.968453,0.206992,0.138757,2.658857,-122.438767,257.07683,
+ 0.971418,0.083083,0.222359,0.020624,-91.878521,250.033733,
+ 0.971418,0.083083,0.222359,0.020624,-96.776837,251.863947,
+ 0.971418,0.083083,0.222359,0.944249,-112.04038,253.532009,
+ 0.54211,0.167703,0.823403,0.020624,-91.878521,250.033733,
+ 0.54211,0.167703,0.823403,0.944249,-112.04038,253.532009,
+ 0.54211,0.167703,0.823403,3.771101,-109.606585,251.175183,
+ 0.198562,0.10475,0.974474,0.020624,-91.878521,250.033733,
+ 0.198562,0.10475,0.974474,3.771101,-109.606585,251.175183,
+ 0.198562,0.10475,0.974474,7.047902,-95.387141,248.978987,
+ 0.403482,0.048144,0.91372,7.047902,-95.387141,248.978987,
+ 0.403482,0.048144,0.91372,3.771101,-109.606585,251.175183,
+ 0.403482,0.048144,0.91372,11.295482,-105.845764,247.654395,
+ -0.474034,-0.29748,0.828733,7.047902,-95.387141,248.978987,
+ -0.474034,-0.29748,0.828733,11.295482,-105.845764,247.654395,
+ -0.474034,-0.29748,0.828733,15.355659,-103.731101,250.735883,
+ -0.407559,-0.21913,0.886498,14.035022,-93.348838,252.695087,
+ -0.407559,-0.21913,0.886498,7.047902,-95.387141,248.978987,
+ -0.407559,-0.21913,0.886498,15.355659,-103.731101,250.735883,
+ -0.652868,-0.219834,0.72487,15.110455,-89.312085,254.887936,
+ -0.652868,-0.219834,0.72487,14.035022,-93.348838,252.695087,
+ -0.652868,-0.219834,0.72487,15.355659,-103.731101,250.735883,
+ -0.92602,-0.11891,0.358256,15.355659,-103.731101,250.735883,
+ -0.92602,-0.11891,0.358256,18.869754,-98.231638,261.644454,
+ -0.92602,-0.11891,0.358256,15.110455,-89.312085,254.887936,
+ -0.980197,0.049193,0.191817,15.355659,-103.731101,250.735883,
+ -0.980197,0.049193,0.191817,17.783369,-110.691754,264.926731,
+ -0.980197,0.049193,0.191817,18.376303,-109.031601,267.530891,
+ -0.95995,0.166624,0.225237,15.355659,-103.731101,250.735883,
+ -0.95995,0.166624,0.225237,18.376303,-109.031601,267.530891,
+ -0.95995,0.166624,0.225237,18.869754,-98.231638,261.644454,
+ 0.329644,0.203537,0.921904,11.295482,-105.845764,247.654395,
+ 0.329644,0.203537,0.921904,3.771101,-109.606585,251.175183,
+ 0.329644,0.203537,0.921904,14.550682,-116.81153,248.91145,
+ 0.631376,0.017419,0.775281,3.771101,-109.606585,251.175183,
+ 0.631376,0.017419,0.775281,0.944249,-112.04038,253.532009,
+ 0.631376,0.017419,0.775281,5.239288,-121.781947,250.253079,
+ 0.161966,-0.067004,0.984519,3.771101,-109.606585,251.175183,
+ 0.161966,-0.067004,0.984519,10.105964,-122.280875,249.270434,
+ 0.161966,-0.067004,0.984519,14.550682,-116.81153,248.91145,
+ 0.192636,-0.050987,0.979945,3.771101,-109.606585,251.175183,
+ 0.192636,-0.050987,0.979945,5.239288,-121.781947,250.253079,
+ 0.192636,-0.050987,0.979945,10.105964,-122.280875,249.270434,
+ -0.981472,0.072015,0.177559,17.783369,-110.691754,264.926731,
+ -0.981472,0.072015,0.177559,18.252788,-118.560211,270.712773,
+ -0.981472,0.072015,0.177559,18.376303,-109.031601,267.530891,
+ -0.979448,0.078264,0.185894,17.783369,-110.691754,264.926731,
+ -0.979448,0.078264,0.185894,17.572238,-120.320758,267.868276,
+ -0.979448,0.078264,0.185894,18.252788,-118.560211,270.712773,
+ -0.329589,0.072519,-0.941335,17.158188,-109.417966,271.858178,
+ -0.329589,0.072519,-0.941335,12.244053,-119.798404,272.779065,
+ -0.329589,0.072519,-0.941335,11.769159,-114.57609,273.34766,
+ -0.423668,0.120927,-0.897709,17.158188,-109.417966,271.858178,
+ -0.423668,0.120927,-0.897709,16.33587,-119.907621,270.833246,
+ -0.423668,0.120927,-0.897709,12.244053,-119.798404,272.779065,
+ -0.980294,0.085951,-0.177864,11.111122,-109.17124,279.121533,
+ -0.980294,0.085951,-0.177864,10.248341,-111.601688,282.702254,
+ -0.980294,0.085951,-0.177864,10.916114,-101.895411,283.712278,
+ -0.977516,0.042823,-0.206467,10.885996,-114.357048,279.111798,
+ -0.977516,0.042823,-0.206467,10.248341,-111.601688,282.702254,
+ -0.977516,0.042823,-0.206467,11.111122,-109.17124,279.121533,
+ -0.987298,0.043148,-0.15291,11.769159,-114.57609,273.34766,
+ -0.987298,0.043148,-0.15291,10.885996,-114.357048,279.111798,
+ -0.987298,0.043148,-0.15291,11.111122,-109.17124,279.121533,
+ -0.986204,-0.073533,-0.148309,12.244053,-119.798404,272.779065,
+ -0.986204,-0.073533,-0.148309,10.885996,-114.357048,279.111798,
+ -0.986204,-0.073533,-0.148309,11.769159,-114.57609,273.34766,
+ 0.107523,-0.290456,-0.950828,10.916114,-101.895411,283.712278,
+ 0.107523,-0.290456,-0.950828,9.85285,-107.990546,285.453963,
+ 0.107523,-0.290456,-0.950828,9.628636,-104.098908,284.239803,
+ -0.960978,0.093215,-0.260446,10.248341,-111.601688,282.702254,
+ -0.960978,0.093215,-0.260446,9.85285,-107.990546,285.453963,
+ -0.960978,0.093215,-0.260446,10.916114,-101.895411,283.712278,
+ 0.7768,-0.237378,-0.583295,6.471701,-109.296277,282.150695,
+ 0.7768,-0.237378,-0.583295,9.628636,-104.098908,284.239803,
+ 0.7768,-0.237378,-0.583295,5.818227,-115.24873,283.702847,
+ 0.657562,-0.189605,-0.729152,9.628636,-104.098908,284.239803,
+ 0.657562,-0.189605,-0.729152,9.85285,-107.990546,285.453963,
+ 0.657562,-0.189605,-0.729152,5.818227,-115.24873,283.702847,
+ 0.902324,-0.198795,-0.382482,3.689873,-117.104498,279.64632,
+ 0.902324,-0.198795,-0.382482,6.471701,-109.296277,282.150695,
+ 0.902324,-0.198795,-0.382482,5.818227,-115.24873,283.702847,
+ 0.790796,-0.202443,-0.577632,5.306217,-102.936771,277.91498,
+ 0.790796,-0.202443,-0.577632,8.172619,-97.179022,279.821249,
+ 0.790796,-0.202443,-0.577632,9.628636,-104.098908,284.239803,
+ 0.820581,-0.045618,-0.569707,0.020624,-88.181283,272.034628,
+ 0.820581,-0.045618,-0.569707,3.739462,-92.995329,277.776557,
+ 0.820581,-0.045618,-0.569707,0.020624,-95.639342,272.63182,
+ 0.713018,0.262334,-0.65022,0.020624,-95.639342,272.63182,
+ 0.713018,0.262334,-0.65022,3.739462,-92.995329,277.776557,
+ 0.713018,0.262334,-0.65022,3.257571,-99.95446,274.440434,
+ 0.62023,0.303755,-0.72322,3.739462,-92.995329,277.776557,
+ 0.62023,0.303755,-0.72322,8.172619,-97.179022,279.821249,
+ 0.62023,0.303755,-0.72322,3.257571,-99.95446,274.440434,
+ 0.770916,-0.181671,-0.610478,3.257571,-99.95446,274.440434,
+ 0.770916,-0.181671,-0.610478,8.172619,-97.179022,279.821249,
+ 0.770916,-0.181671,-0.610478,5.306217,-102.936771,277.91498,
+ -0.649105,0.51704,-0.557972,17.158188,-109.417966,271.858178,
+ -0.649105,0.51704,-0.557972,11.769159,-114.57609,273.34766,
+ -0.649105,0.51704,-0.557972,11.111122,-109.17124,279.121533,
+ -0.75008,0.197458,-0.631182,17.158188,-109.417966,271.858178,
+ -0.75008,0.197458,-0.631182,11.111122,-109.17124,279.121533,
+ -0.75008,0.197458,-0.631182,14.954692,-102.296988,276.704471,
+ -0.874392,0.241943,-0.420596,11.111122,-109.17124,279.121533,
+ -0.874392,0.241943,-0.420596,10.916114,-101.895411,283.712278,
+ -0.874392,0.241943,-0.420596,12.505686,-98.507265,282.356655,
+ -0.806855,0.265596,-0.527677,14.954692,-102.296988,276.704471,
+ -0.806855,0.265596,-0.527677,11.111122,-109.17124,279.121533,
+ -0.806855,0.265596,-0.527677,12.505686,-98.507265,282.356655,
+ 0.405217,-0.42992,-0.806826,8.172619,-97.179022,279.821249,
+ 0.405217,-0.42992,-0.806826,10.916114,-101.895411,283.712278,
+ 0.405217,-0.42992,-0.806826,9.628636,-104.098908,284.239803,
+ 0.328894,-0.47976,-0.813424,8.172619,-97.179022,279.821249,
+ 0.328894,-0.47976,-0.813424,12.505686,-98.507265,282.356655,
+ 0.328894,-0.47976,-0.813424,10.916114,-101.895411,283.712278,
+ 0.796461,-0.096695,-0.596908,0.020624,-79.198756,270.579523,
+ 0.796461,-0.096695,-0.596908,3.739462,-92.995329,277.776557,
+ 0.796461,-0.096695,-0.596908,0.020624,-88.181283,272.034628,
+ 0.698538,-0.173812,-0.694142,0.020624,-79.198756,270.579523,
+ 0.698538,-0.173812,-0.694142,5.766509,-85.411321,277.917413,
+ 0.698538,-0.173812,-0.694142,3.739462,-92.995329,277.776557,
+ 0.477345,-0.111396,-0.871626,5.766509,-85.411321,277.917413,
+ 0.477345,-0.111396,-0.871626,10.3606,-93.37135,281.450675,
+ 0.477345,-0.111396,-0.871626,3.739462,-92.995329,277.776557,
+ 0.487142,0.091732,-0.868492,3.739462,-92.995329,277.776557,
+ 0.487142,0.091732,-0.868492,10.3606,-93.37135,281.450675,
+ 0.487142,0.091732,-0.868492,8.172619,-97.179022,279.821249,
+ -0.658347,0.582376,-0.476883,12.765493,-92.536559,279.15013,
+ -0.658347,0.582376,-0.476883,8.172619,-97.179022,279.821249,
+ -0.658347,0.582376,-0.476883,10.3606,-93.37135,281.450675,
+ 0.341065,-0.456237,-0.821901,12.765493,-92.536559,279.15013,
+ 0.341065,-0.456237,-0.821901,12.505686,-98.507265,282.356655,
+ 0.341065,-0.456237,-0.821901,8.172619,-97.179022,279.821249,
+ 0.742393,-0.164711,-0.649402,0.020624,-72.797268,268.955877,
+ 0.742393,-0.164711,-0.649402,6.285515,-76.99678,277.183016,
+ 0.742393,-0.164711,-0.649402,0.020624,-79.198756,270.579523,
+ 0.738586,-0.103694,-0.666137,0.020624,-79.198756,270.579523,
+ 0.738586,-0.103694,-0.666137,6.285515,-76.99678,277.183016,
+ 0.738586,-0.103694,-0.666137,5.766509,-85.411321,277.917413,
+ 0.517536,-0.535453,-0.667418,12.199332,-68.547558,274.990167,
+ 0.517536,-0.535453,-0.667418,6.285515,-76.99678,277.183016,
+ 0.517536,-0.535453,-0.667418,0.020624,-72.797268,268.955877,
+ 0.357624,0.251974,-0.89923,7.636576,-63.208421,274.671644,
+ 0.357624,0.251974,-0.89923,12.199332,-68.547558,274.990167,
+ 0.357624,0.251974,-0.89923,0.020624,-72.797268,268.955877,
+ 0.705004,-0.146297,-0.69395,0.020624,-67.408846,267.819904,
+ 0.705004,-0.146297,-0.69395,7.636576,-63.208421,274.671644,
+ 0.705004,-0.146297,-0.69395,0.020624,-72.797268,268.955877,
+ 0.665454,0.010901,-0.746359,0.020624,-56.702584,267.976275,
+ 0.665454,0.010901,-0.746359,7.636576,-63.208421,274.671644,
+ 0.665454,0.010901,-0.746359,0.020624,-67.408846,267.819904,
+ 0.484684,-0.105676,-0.868282,6.285515,-76.99678,277.183016,
+ 0.484684,-0.105676,-0.868282,10.3606,-93.37135,281.450675,
+ 0.484684,-0.105676,-0.868282,5.766509,-85.411321,277.917413,
+ 0.181422,-0.205494,-0.961695,6.285515,-76.99678,277.183016,
+ 0.181422,-0.205494,-0.961695,11.432991,-82.656265,279.363392,
+ 0.181422,-0.205494,-0.961695,10.3606,-93.37135,281.450675,
+ -0.542604,-0.107966,-0.833021,11.432991,-82.656265,279.363392,
+ -0.542604,-0.107966,-0.833021,14.929137,-86.016423,277.521618,
+ -0.542604,-0.107966,-0.833021,10.3606,-93.37135,281.450675,
+ -0.700036,0.05446,-0.712027,14.929137,-86.016423,277.521618,
+ -0.700036,0.05446,-0.712027,12.765493,-92.536559,279.15013,
+ -0.700036,0.05446,-0.712027,10.3606,-93.37135,281.450675,
+ -0.186427,-0.496237,-0.847935,14.092216,-73.441006,273.385688,
+ -0.186427,-0.496237,-0.847935,11.432991,-82.656265,279.363392,
+ -0.186427,-0.496237,-0.847935,6.285515,-76.99678,277.183016,
+ -0.472933,0.10394,-0.874946,12.199332,-68.547558,274.990167,
+ -0.472933,0.10394,-0.874946,14.092216,-73.441006,273.385688,
+ -0.472933,0.10394,-0.874946,6.285515,-76.99678,277.183016,
+ -0.735851,-0.546415,-0.399942,15.540323,-79.63623,267.680265,
+ -0.735851,-0.546415,-0.399942,14.929137,-86.016423,277.521618,
+ -0.735851,-0.546415,-0.399942,11.432991,-82.656265,279.363392,
+ -0.946595,0.068828,-0.314994,15.540323,-79.63623,267.680265,
+ -0.946595,0.068828,-0.314994,11.432991,-82.656265,279.363392,
+ -0.946595,0.068828,-0.314994,14.092216,-73.441006,273.385688,
+ 0.91619,-0.391962,-0.083432,42.625111,-55.430014,276.478737,
+ 0.91619,-0.391962,-0.083432,42.290768,-56.389537,277.315049,
+ 0.91619,-0.391962,-0.083432,41.912922,-57.391044,277.870867,
+ -0.660748,-0.259922,-0.704168,41.493396,-54.517949,277.204007,
+ -0.660748,-0.259922,-0.704168,42.625111,-55.430014,276.478737,
+ -0.660748,-0.259922,-0.704168,41.912922,-57.391044,277.870867,
+ -0.09822,-0.238588,-0.966141,41.493396,-54.517949,277.204007,
+ -0.09822,-0.238588,-0.966141,41.912922,-57.391044,277.870867,
+ -0.09822,-0.238588,-0.966141,40.363811,-57.931042,278.161705,
+ -0.004158,-0.268883,-0.963164,41.493396,-54.517949,277.204007,
+ -0.004158,-0.268883,-0.963164,40.363811,-57.931042,278.161705,
+ -0.004158,-0.268883,-0.963164,39.449617,-56.270281,277.702023,
+ 0.705306,-0.423614,-0.568414,6.60343,-34.282468,255.793308,
+ 0.705306,-0.423614,-0.568414,15.335276,-34.097804,266.490444,
+ 0.705306,-0.423614,-0.568414,9.840681,-42.233371,265.735663,
+ 0.07071,-0.767672,-0.63693,9.840681,-42.233371,265.735663,
+ 0.07071,-0.767672,-0.63693,0.020624,-36.4525,257.677978,
+ 0.07071,-0.767672,-0.63693,6.60343,-34.282468,255.793308,
+ 0.368696,-0.481758,-0.794967,0.020624,-36.4525,257.677978,
+ 0.368696,-0.481758,-0.794967,9.840681,-42.233371,265.735663,
+ 0.368696,-0.481758,-0.794967,8.608268,-48.226286,268.795855,
+ 0.384686,-0.469735,-0.794585,0.020624,-36.4525,257.677978,
+ 0.384686,-0.469735,-0.794585,8.608268,-48.226286,268.795855,
+ 0.384686,-0.469735,-0.794585,0.020624,-48.703918,264.920646,
+ 0.458828,-0.317083,-0.830021,0.020624,-48.703918,264.920646,
+ 0.458828,-0.317083,-0.830021,7.636576,-63.208421,274.671644,
+ 0.458828,-0.317083,-0.830021,0.020624,-56.702584,267.976275,
+ 0.400643,-0.356931,-0.843851,8.608268,-48.226286,268.795855,
+ 0.400643,-0.356931,-0.843851,7.636576,-63.208421,274.671644,
+ 0.400643,-0.356931,-0.843851,0.020624,-48.703918,264.920646,
+ 0.949346,-0.166168,-0.266701,8.608268,-48.226286,268.795855,
+ 0.949346,-0.166168,-0.266701,10.548915,-48.260663,275.725173,
+ 0.949346,-0.166168,-0.266701,7.636576,-63.208421,274.671644,
+ 0.307715,0.007105,-0.951452,10.548915,-48.260663,275.725173,
+ 0.307715,0.007105,-0.951452,10.610368,-58.662093,275.66737,
+ 0.307715,0.007105,-0.951452,7.636576,-63.208421,274.671644,
+ 0.345311,-0.020374,-0.938267,10.610368,-58.662093,275.66737,
+ 0.345311,-0.020374,-0.938267,15.021621,-61.682128,277.356424,
+ 0.345311,-0.020374,-0.938267,7.636576,-63.208421,274.671644,
+ 0.29554,-0.099698,-0.950114,10.610368,-58.662093,275.66737,
+ 0.29554,-0.099698,-0.950114,14.805926,-59.056976,277.013867,
+ 0.29554,-0.099698,-0.950114,15.021621,-61.682128,277.356424,
+ -0.231385,-0.144552,-0.962063,26.07257,-58.398939,274.205268,
+ -0.231385,-0.144552,-0.962063,15.021621,-61.682128,277.356424,
+ -0.231385,-0.144552,-0.962063,14.805926,-59.056976,277.013867,
+ -0.195796,0.772149,-0.604524,26.07257,-58.398939,274.205268,
+ -0.195796,0.772149,-0.604524,14.805926,-59.056976,277.013867,
+ -0.195796,0.772149,-0.604524,22.373506,-55.554137,279.036959,
+ 0.321608,-0.800474,-0.505777,16.71615,-46.575565,276.979794,
+ 0.321608,-0.800474,-0.505777,10.548915,-48.260663,275.725173,
+ 0.321608,-0.800474,-0.505777,9.840681,-42.233371,265.735663,
+ 0.912267,-0.318874,-0.257075,9.840681,-42.233371,265.735663,
+ 0.912267,-0.318874,-0.257075,10.548915,-48.260663,275.725173,
+ 0.912267,-0.318874,-0.257075,8.608268,-48.226286,268.795855,
+ 0.669614,-0.433103,-0.603356,15.335276,-34.097804,266.490444,
+ 0.669614,-0.433103,-0.603356,19.789425,-40.364825,275.93235,
+ 0.669614,-0.433103,-0.603356,16.71615,-46.575565,276.979794,
+ 0.695743,-0.415534,-0.585896,9.840681,-42.233371,265.735663,
+ 0.695743,-0.415534,-0.585896,15.335276,-34.097804,266.490444,
+ 0.695743,-0.415534,-0.585896,16.71615,-46.575565,276.979794,
+ -0.528407,0.490211,-0.693166,22.373506,-55.554137,279.036959,
+ -0.528407,0.490211,-0.693166,28.165024,-57.196949,273.460223,
+ -0.528407,0.490211,-0.693166,26.07257,-58.398939,274.205268,
+ -0.38501,0.69685,-0.605118,28.165024,-57.196949,273.460223,
+ -0.38501,0.69685,-0.605118,22.373506,-55.554137,279.036959,
+ -0.38501,0.69685,-0.605118,26.453763,-52.926248,279.467132,
+ -0.057525,-0.000939,-0.998344,25.899466,-45.786711,278.82461,
+ -0.057525,-0.000939,-0.998344,22.373506,-55.554137,279.036959,
+ -0.057525,-0.000939,-0.998344,20.593794,-50.028207,279.134311,
+ 0.153304,-0.07676,-0.985193,25.899466,-45.786711,278.82461,
+ 0.153304,-0.07676,-0.985193,26.453763,-52.926248,279.467132,
+ 0.153304,-0.07676,-0.985193,22.373506,-55.554137,279.036959,
+ 0.259756,-0.284185,-0.922912,19.789425,-40.364825,275.93235,
+ 0.259756,-0.284185,-0.922912,20.593794,-50.028207,279.134311,
+ 0.259756,-0.284185,-0.922912,16.71615,-46.575565,276.979794,
+ 0.181604,-0.295649,-0.937876,19.789425,-40.364825,275.93235,
+ 0.181604,-0.295649,-0.937876,25.899466,-45.786711,278.82461,
+ 0.181604,-0.295649,-0.937876,20.593794,-50.028207,279.134311,
+ -0.160211,0.782358,-0.60187,30.046348,-55.479298,275.192172,
+ -0.160211,0.782358,-0.60187,28.165024,-57.196949,273.460223,
+ -0.160211,0.782358,-0.60187,26.453763,-52.926248,279.467132,
+ -0.304543,0.683046,-0.663854,30.046348,-55.479298,275.192172,
+ -0.304543,0.683046,-0.663854,26.453763,-52.926248,279.467132,
+ -0.304543,0.683046,-0.663854,29.60431,-51.223504,279.77379,
+ -0.57219,0.572626,-0.587109,36.448749,-46.651925,277.562079,
+ -0.57219,0.572626,-0.587109,30.046348,-55.479298,275.192172,
+ -0.57219,0.572626,-0.587109,29.60431,-51.223504,279.77379,
+ -0.067165,-0.351245,-0.933871,34.378198,-44.780641,277.007174,
+ -0.067165,-0.351245,-0.933871,36.448749,-46.651925,277.562079,
+ -0.067165,-0.351245,-0.933871,29.60431,-51.223504,279.77379,
+ 0.655392,0.327815,-0.68044,25.899466,-45.786711,278.82461,
+ 0.655392,0.327815,-0.68044,29.186305,-47.809499,281.015938,
+ 0.655392,0.327815,-0.68044,29.60431,-51.223504,279.77379,
+ 0.138316,-0.078114,-0.987303,25.899466,-45.786711,278.82461,
+ 0.138316,-0.078114,-0.987303,29.60431,-51.223504,279.77379,
+ 0.138316,-0.078114,-0.987303,26.453763,-52.926248,279.467132,
+ -0.153811,0.321158,-0.934452,33.561051,-42.531207,282.109929,
+ -0.153811,0.321158,-0.934452,29.60431,-51.223504,279.77379,
+ -0.153811,0.321158,-0.934452,29.186305,-47.809499,281.015938,
+ -0.820064,0.463503,-0.335648,34.378198,-44.780641,277.007174,
+ -0.820064,0.463503,-0.335648,29.60431,-51.223504,279.77379,
+ -0.820064,0.463503,-0.335648,33.561051,-42.531207,282.109929,
+ 0.51425,-0.67019,-0.535157,33.561051,-42.531207,282.109929,
+ 0.51425,-0.67019,-0.535157,25.899466,-45.786711,278.82461,
+ 0.51425,-0.67019,-0.535157,30.37278,-40.414718,276.395683,
+ 0.456256,-0.198362,-0.867458,33.561051,-42.531207,282.109929,
+ 0.456256,-0.198362,-0.867458,29.186305,-47.809499,281.015938,
+ 0.456256,-0.198362,-0.867458,25.899466,-45.786711,278.82461,
+ 0.039029,-0.363803,-0.930658,25.440391,-36.35454,274.601672,
+ 0.039029,-0.363803,-0.930658,30.37278,-40.414718,276.395683,
+ 0.039029,-0.363803,-0.930658,19.789425,-40.364825,275.93235,
+ 0.037276,-0.437311,-0.898538,19.789425,-40.364825,275.93235,
+ 0.037276,-0.437311,-0.898538,30.37278,-40.414718,276.395683,
+ 0.037276,-0.437311,-0.898538,25.899466,-45.786711,278.82461,
+ -0.065139,-0.468446,-0.881088,25.797855,-31.934161,272.225072,
+ -0.065139,-0.468446,-0.881088,30.37278,-40.414718,276.395683,
+ -0.065139,-0.468446,-0.881088,25.440391,-36.35454,274.601672,
+ -0.600557,-0.589592,-0.540104,31.803547,-35.917066,269.895018,
+ -0.600557,-0.589592,-0.540104,30.37278,-40.414718,276.395683,
+ -0.600557,-0.589592,-0.540104,25.797855,-31.934161,272.225072,
+ 0.333849,-0.807963,-0.485531,33.561051,-42.531207,282.109929,
+ 0.333849,-0.807963,-0.485531,30.37278,-40.414718,276.395683,
+ 0.333849,-0.807963,-0.485531,31.803547,-35.917066,269.895018,
+ -0.23965,-0.867756,-0.435392,36.141178,-38.281497,272.2199,
+ -0.23965,-0.867756,-0.435392,33.561051,-42.531207,282.109929,
+ -0.23965,-0.867756,-0.435392,31.803547,-35.917066,269.895018,
+ -0.972213,0.112512,-0.205287,36.141178,-38.281497,272.2199,
+ -0.972213,0.112512,-0.205287,34.378198,-44.780641,277.007174,
+ -0.972213,0.112512,-0.205287,33.561051,-42.531207,282.109929,
+ -0.716304,-0.277342,-0.640305,38.955253,-39.644726,269.662286,
+ -0.716304,-0.277342,-0.640305,34.378198,-44.780641,277.007174,
+ -0.716304,-0.277342,-0.640305,36.141178,-38.281497,272.2199,
+ -0.878374,0.411748,-0.24274,18.273779,-112.183061,249.781835,
+ -0.878374,0.411748,-0.24274,15.197463,-115.223783,255.755888,
+ -0.878374,0.411748,-0.24274,17.211123,-111.226884,255.249051,
+ -0.941775,-0.310627,-0.128725,18.273779,-112.183061,249.781835,
+ -0.941775,-0.310627,-0.128725,17.211123,-111.226884,255.249051,
+ -0.941775,-0.310627,-0.128725,15.355659,-103.731101,250.735883,
+ -0.891307,0.452555,0.027679,17.211123,-111.226884,255.249051,
+ -0.891307,0.452555,0.027679,15.197463,-115.223783,255.755888,
+ -0.891307,0.452555,0.027679,17.783369,-110.691754,264.926731,
+ -0.977281,-0.200444,0.068871,15.355659,-103.731101,250.735883,
+ -0.977281,-0.200444,0.068871,17.211123,-111.226884,255.249051,
+ -0.977281,-0.200444,0.068871,17.783369,-110.691754,264.926731,
+ -0.326759,-0.432554,-0.840313,44.635425,-56.328084,273.493079,
+ -0.326759,-0.432554,-0.840313,43.796374,-58.62802,275.003249,
+ -0.326759,-0.432554,-0.840313,41.757159,-58.236483,275.594661,
+ -0.39819,-0.338368,-0.852615,43.361942,-56.149504,274.016953,
+ -0.39819,-0.338368,-0.852615,44.635425,-56.328084,273.493079,
+ -0.39819,-0.338368,-0.852615,41.757159,-58.236483,275.594661,
+ -0.391711,-0.465982,-0.793362,45.281902,-53.509446,271.518359,
+ -0.391711,-0.465982,-0.793362,44.635425,-56.328084,273.493079,
+ -0.391711,-0.465982,-0.793362,43.361942,-56.149504,274.016953,
+ 0.162527,-0.738018,-0.654915,45.281902,-53.509446,271.518359,
+ 0.162527,-0.738018,-0.654915,43.361942,-56.149504,274.016953,
+ 0.162527,-0.738018,-0.654915,44.034278,-54.369488,272.177917,
+ -0.204435,-0.108493,-0.972849,43.796374,-58.62802,275.003249,
+ -0.204435,-0.108493,-0.972849,37.200183,-63.545806,276.937811,
+ -0.204435,-0.108493,-0.972849,37.273805,-60.056353,276.533193,
+ -0.253209,0.129368,-0.958723,41.757159,-58.236483,275.594661,
+ -0.253209,0.129368,-0.958723,43.796374,-58.62802,275.003249,
+ -0.253209,0.129368,-0.958723,37.273805,-60.056353,276.533193,
+ 0.626698,0.039157,-0.778278,35.496222,-58.88296,275.800316,
+ 0.626698,0.039157,-0.778278,37.200183,-63.545806,276.937811,
+ 0.626698,0.039157,-0.778278,32.05362,-60.92035,272.925701,
+ 0.312229,-0.115922,-0.942908,35.496222,-58.88296,275.800316,
+ 0.312229,-0.115922,-0.942908,37.273805,-60.056353,276.533193,
+ 0.312229,-0.115922,-0.942908,37.200183,-63.545806,276.937811,
+ 0.034895,-0.639556,-0.767952,43.737963,-51.232022,269.551549,
+ 0.034895,-0.639556,-0.767952,45.281902,-53.509446,271.518359,
+ 0.034895,-0.639556,-0.767952,44.034278,-54.369488,272.177917,
+ -0.691945,-0.500717,-0.520091,43.737963,-51.232022,269.551549,
+ -0.691945,-0.500717,-0.520091,44.034278,-54.369488,272.177917,
+ -0.691945,-0.500717,-0.520091,40.255507,-51.750116,274.683509,
+ -0.501883,-0.75774,-0.417066,43.737963,-51.232022,269.551549,
+ -0.501883,-0.75774,-0.417066,40.255507,-51.750116,274.683509,
+ -0.501883,-0.75774,-0.417066,37.734096,-50.197964,274.897683,
+ -0.408122,-0.563912,-0.717941,37.734096,-50.197964,274.897683,
+ -0.408122,-0.563912,-0.717941,40.255507,-51.750116,274.683509,
+ -0.408122,-0.563912,-0.717941,38.102512,-51.662195,275.838344,
+ 0.020211,-0.536786,-0.843476,37.734096,-50.197964,274.897683,
+ 0.020211,-0.536786,-0.843476,38.102512,-51.662195,275.838344,
+ 0.020211,-0.536786,-0.843476,33.307937,-54.108159,277.280063,
+ -0.395548,0.255337,-0.882238,38.102512,-51.662195,275.838344,
+ -0.395548,0.255337,-0.882238,36.058429,-55.580301,275.620824,
+ -0.395548,0.255337,-0.882238,33.307937,-54.108159,277.280063,
+ -0.192619,0.553425,-0.81032,33.307937,-54.108159,277.280063,
+ -0.192619,0.553425,-0.81032,36.058429,-55.580301,275.620824,
+ -0.192619,0.553425,-0.81032,32.05362,-60.92035,272.925701,
+ 0.685721,-0.155375,-0.711088,36.058429,-55.580301,275.620824,
+ 0.685721,-0.155375,-0.711088,35.496222,-58.88296,275.800316,
+ 0.685721,-0.155375,-0.711088,32.05362,-60.92035,272.925701,
+ -0.849205,0.467983,-0.244629,42.810992,-56.270281,275.697793,
+ -0.849205,0.467983,-0.244629,41.757159,-58.236483,275.594661,
+ -0.849205,0.467983,-0.244629,41.648246,-57.78258,276.841068,
+ -0.849182,0.467976,-0.244721,41.757159,-58.236483,275.594661,
+ -0.849182,0.467976,-0.244721,42.810992,-56.270281,275.697793,
+ -0.849182,0.467976,-0.244721,43.361942,-56.149504,274.016953,
+ -0.95034,0.040033,-0.308628,43.298055,-54.980674,274.36529,
+ -0.95034,0.040033,-0.308628,43.361942,-56.149504,274.016953,
+ -0.95034,0.040033,-0.308628,42.810992,-56.270281,275.697793,
+ -0.950326,0.040046,-0.30867,43.361942,-56.149504,274.016953,
+ -0.950326,0.040046,-0.30867,43.298055,-54.980674,274.36529,
+ -0.950326,0.040046,-0.30867,44.034278,-54.369488,272.177917,
+ -0.414064,0.843031,-0.343291,38.399739,-59.101089,277.521009,
+ -0.414064,0.843031,-0.343291,41.757159,-58.236483,275.594661,
+ -0.414064,0.843031,-0.343291,37.273805,-60.056353,276.533193,
+ -0.414028,0.843085,-0.343204,41.757159,-58.236483,275.594661,
+ -0.414028,0.843085,-0.343204,38.399739,-59.101089,277.521009,
+ -0.414028,0.843085,-0.343204,41.648246,-57.78258,276.841068,
+ 0.507161,0.253897,-0.823604,35.496222,-58.88296,275.800316,
+ 0.507161,0.253897,-0.823604,38.399739,-59.101089,277.521009,
+ 0.507161,0.253897,-0.823604,37.273805,-60.056353,276.533193,
+ 0.507171,0.253772,-0.823636,38.399739,-59.101089,277.521009,
+ 0.507171,0.253772,-0.823636,35.496222,-58.88296,275.800316,
+ 0.507171,0.253772,-0.823636,37.111653,-58.250782,276.989833,
+ -0.686387,-0.606985,-0.400553,40.255507,-51.750116,274.683509,
+ -0.686387,-0.606985,-0.400553,43.298055,-54.980674,274.36529,
+ -0.686387,-0.606985,-0.400553,40.560036,-53.082619,276.180901,
+ -0.68637,-0.606964,-0.400613,43.298055,-54.980674,274.36529,
+ -0.68637,-0.606964,-0.400613,40.255507,-51.750116,274.683509,
+ -0.68637,-0.606964,-0.400613,44.034278,-54.369488,272.177917,
+ -0.343511,-0.735131,-0.58445,40.255507,-51.750116,274.683509,
+ -0.343511,-0.735131,-0.58445,38.999974,-53.019036,277.017518,
+ -0.343511,-0.735131,-0.58445,38.102512,-51.662195,275.838344,
+ -0.343374,-0.735217,-0.584423,38.999974,-53.019036,277.017518,
+ -0.343374,-0.735217,-0.584423,40.255507,-51.750116,274.683509,
+ -0.343374,-0.735217,-0.584423,40.560036,-53.082619,276.180901,
+ 0.593329,-0.267392,-0.759252,36.058429,-55.580301,275.620824,
+ 0.593329,-0.267392,-0.759252,38.999974,-53.019036,277.017518,
+ 0.593329,-0.267392,-0.759252,37.51901,-55.857753,276.85993,
+ 0.593327,-0.267389,-0.759254,38.999974,-53.019036,277.017518,
+ 0.593327,-0.267389,-0.759254,36.058429,-55.580301,275.620824,
+ 0.593327,-0.267389,-0.759254,38.102512,-51.662195,275.838344,
+ 0.623287,-0.147835,-0.767892,36.058429,-55.580301,275.620824,
+ 0.623287,-0.147835,-0.767892,37.111653,-58.250782,276.989833,
+ 0.623287,-0.147835,-0.767892,35.496222,-58.88296,275.800316,
+ 0.623345,-0.147792,-0.767853,37.111653,-58.250782,276.989833,
+ 0.623345,-0.147792,-0.767853,36.058429,-55.580301,275.620824,
+ 0.623345,-0.147792,-0.767853,37.51901,-55.857753,276.85993,
+ -0.800527,0.598895,-0.021955,42.810992,-56.270281,275.697793,
+ -0.800527,0.598895,-0.021955,41.648246,-57.78258,276.841068,
+ -0.800527,0.598895,-0.021955,41.912922,-57.391044,277.870867,
+ -0.937894,0.194367,-0.28736,42.810992,-56.270281,275.697793,
+ -0.937894,0.194367,-0.28736,41.912922,-57.391044,277.870867,
+ -0.937894,0.194367,-0.28736,42.290768,-56.389537,277.315049,
+ -0.951922,0.046692,-0.302762,43.298055,-54.980674,274.36529,
+ -0.951922,0.046692,-0.302762,42.810992,-56.270281,275.697793,
+ -0.951922,0.046692,-0.302762,42.290768,-56.389537,277.315049,
+ -0.954539,0.083097,-0.286269,43.298055,-54.980674,274.36529,
+ -0.954539,0.083097,-0.286269,42.290768,-56.389537,277.315049,
+ -0.954539,0.083097,-0.286269,42.625111,-55.430014,276.478737,
+ -0.412251,0.858708,-0.304417,41.648246,-57.78258,276.841068,
+ -0.412251,0.858708,-0.304417,38.399739,-59.101089,277.521009,
+ -0.412251,0.858708,-0.304417,40.363811,-57.931042,278.161705,
+ -0.360164,0.898981,-0.249231,41.912922,-57.391044,277.870867,
+ -0.360164,0.898981,-0.249231,41.648246,-57.78258,276.841068,
+ -0.360164,0.898981,-0.249231,40.363811,-57.931042,278.161705,
+ 0.358681,-0.039258,-0.932634,39.364739,-57.526119,277.825842,
+ 0.358681,-0.039258,-0.932634,38.399739,-59.101089,277.521009,
+ 0.358681,-0.039258,-0.932634,37.111653,-58.250782,276.989833,
+ 0.315194,-0.009449,-0.94898,39.364739,-57.526119,277.825842,
+ 0.315194,-0.009449,-0.94898,40.363811,-57.931042,278.161705,
+ 0.315194,-0.009449,-0.94898,38.399739,-59.101089,277.521009,
+ -0.679773,-0.64282,-0.353117,43.298055,-54.980674,274.36529,
+ -0.679773,-0.64282,-0.353117,42.625111,-55.430014,276.478737,
+ -0.679773,-0.64282,-0.353117,40.560036,-53.082619,276.180901,
+ -0.704089,-0.654393,-0.27573,40.560036,-53.082619,276.180901,
+ -0.704089,-0.654393,-0.27573,42.625111,-55.430014,276.478737,
+ -0.704089,-0.654393,-0.27573,41.493396,-54.517949,277.204007,
+ -0.365362,-0.686053,-0.62916,41.493396,-54.517949,277.204007,
+ -0.365362,-0.686053,-0.62916,38.999974,-53.019036,277.017518,
+ -0.365362,-0.686053,-0.62916,40.560036,-53.082619,276.180901,
+ -0.388855,-0.718589,-0.57656,41.493396,-54.517949,277.204007,
+ -0.388855,-0.718589,-0.57656,40.437738,-54.418772,277.792377,
+ -0.388855,-0.718589,-0.57656,38.999974,-53.019036,277.017518,
+ 0.362469,-0.137932,-0.921733,38.999974,-53.019036,277.017518,
+ 0.362469,-0.137932,-0.921733,40.437738,-54.418772,277.792377,
+ 0.362469,-0.137932,-0.921733,37.51901,-55.857753,276.85993,
+ 0.367808,-0.15152,-0.917474,40.437738,-54.418772,277.792377,
+ 0.367808,-0.15152,-0.917474,39.449617,-56.270281,277.702023,
+ 0.367808,-0.15152,-0.917474,37.51901,-55.857753,276.85993,
+ 0.376627,-0.114017,-0.919322,37.51901,-55.857753,276.85993,
+ 0.376627,-0.114017,-0.919322,39.449617,-56.270281,277.702023,
+ 0.376627,-0.114017,-0.919322,37.111653,-58.250782,276.989833,
+ 0.378133,-0.116111,-0.918441,39.449617,-56.270281,277.702023,
+ 0.378133,-0.116111,-0.918441,39.364739,-57.526119,277.825842,
+ 0.378133,-0.116111,-0.918441,37.111653,-58.250782,276.989833,
+ -0.447142,0.280088,-0.849479,40.437738,-54.418772,277.792377,
+ -0.447142,0.280088,-0.849479,41.493396,-54.517949,277.204007,
+ -0.447142,0.280088,-0.849479,39.449617,-56.270281,277.702023,
+ 0.275266,-0.112737,-0.954735,39.449617,-56.270281,277.702023,
+ 0.275266,-0.112737,-0.954735,40.363811,-57.931042,278.161705,
+ 0.275266,-0.112737,-0.954735,39.364739,-57.526119,277.825842,
+ 0.690973,-0.284555,0.664518,4.326615,-152.695702,254.083871,
+ 0.690973,-0.284555,0.664518,2.497923,-149.882539,257.190002,
+ 0.690973,-0.284555,0.664518,3.005977,-154.302614,254.768985,
+ 0.939127,-0.075624,0.335144,3.005977,-154.302614,254.768985,
+ 0.939127,-0.075624,0.335144,2.497923,-149.882539,257.190002,
+ 0.939127,-0.075624,0.335144,2.224729,-155.621123,256.660651,
+ 0.846628,-0.035919,0.530972,4.326615,-152.695702,254.083871,
+ 0.846628,-0.035919,0.530972,2.361022,-145.657472,257.694101,
+ 0.846628,-0.035919,0.530972,2.497923,-149.882539,257.190002,
+ -0.037902,0.20101,0.978856,6.7525,-146.922741,252.992315,
+ -0.037902,0.20101,0.978856,4.326615,-152.695702,254.083871,
+ -0.037902,0.20101,0.978856,7.175372,-151.525959,253.953968,
+ 0.146785,0.123879,0.981381,6.7525,-146.922741,252.992315,
+ 0.146785,0.123879,0.981381,3.428545,-147.862186,253.608065,
+ 0.146785,0.123879,0.981381,4.326615,-152.695702,254.083871,
+ 0.130321,0.178167,0.975332,4.676777,-135.138916,251.117076,
+ 0.130321,0.178167,0.975332,3.428545,-147.862186,253.608065,
+ 0.130321,0.178167,0.975332,6.7525,-146.922741,252.992315,
+ 0.892736,0.000632,0.450579,4.676777,-135.138916,251.117076,
+ 0.892736,0.000632,0.450579,3.035183,-136.192141,254.371059,
+ 0.892736,0.000632,0.450579,3.428545,-147.862186,253.608065,
+ -0.220956,0.215278,0.951227,9.473482,-134.296823,250.766914,
+ -0.220956,0.215278,0.951227,6.7525,-146.922741,252.992315,
+ -0.220956,0.215278,0.951227,11.375493,-144.319189,253.476944,
+ 0.043075,0.164409,0.985451,9.473482,-134.296823,250.766914,
+ 0.043075,0.164409,0.985451,4.676777,-135.138916,251.117076,
+ 0.043075,0.164409,0.985451,6.7525,-146.922741,252.992315,
+ -0.293796,0.232593,0.927138,11.375493,-144.319189,253.476944,
+ -0.293796,0.232593,0.927138,7.175372,-151.525959,253.953968,
+ -0.293796,0.232593,0.927138,12.297292,-149.321245,255.023925,
+ -0.203492,0.182269,0.961961,11.375493,-144.319189,253.476944,
+ -0.203492,0.182269,0.961961,6.7525,-146.922741,252.992315,
+ -0.203492,0.182269,0.961961,7.175372,-151.525959,253.953968,
+ -0.636448,0.333295,0.695592,15.719512,-133.131948,252.091202,
+ -0.636448,0.333295,0.695592,11.375493,-144.319189,253.476944,
+ -0.636448,0.333295,0.695592,17.459979,-143.858593,258.823382,
+ -0.240195,0.210645,0.947595,15.719512,-133.131948,252.091202,
+ -0.240195,0.210645,0.947595,9.473482,-134.296823,250.766914,
+ -0.240195,0.210645,0.947595,11.375493,-144.319189,253.476944,
+ -0.660378,0.121078,0.741108,17.459979,-143.858593,258.823382,
+ -0.660378,0.121078,0.741108,11.375493,-144.319189,253.476944,
+ -0.660378,0.121078,0.741108,16.52601,-147.501984,258.586391,
+ -0.666811,0.105281,0.737753,11.375493,-144.319189,253.476944,
+ -0.666811,0.105281,0.737753,12.297292,-149.321245,255.023925,
+ -0.666811,0.105281,0.737753,16.52601,-147.501984,258.586391,
+ 0.995848,0.08676,-0.027556,0.632115,-113.08965,257.275793,
+ 0.995848,0.08676,-0.027556,0.7103,-112.119782,263.154928,
+ 0.995848,0.08676,-0.027556,1.966138,-126.468523,263.362713,
+ 0.992466,0.118081,-0.032678,0.020624,-108.010625,257.057056,
+ 0.992466,0.118081,-0.032678,0.7103,-112.119782,263.154928,
+ 0.992466,0.118081,-0.032678,0.632115,-113.08965,257.275793,
+ 0.989172,0.146148,-0.013392,0.020624,-108.010625,257.057056,
+ 0.989172,0.146148,-0.013392,0.020624,-107.439291,263.291829,
+ 0.989172,0.146148,-0.013392,0.7103,-112.119782,263.154928,
+ 0.985269,0.147702,-0.086195,0.7103,-112.119782,263.154928,
+ 0.985269,0.147702,-0.086195,0.020624,-107.439291,263.291829,
+ 0.985269,0.147702,-0.086195,1.137127,-112.100312,268.067238,
+ 0.983056,0.172792,-0.061188,0.020624,-107.439291,263.291829,
+ 0.983056,0.172792,-0.061188,0.020624,-105.884097,267.683611,
+ 0.983056,0.172792,-0.061188,1.137127,-112.100312,268.067238,
+ 0.629583,0.153014,-0.761717,0.020624,-95.639342,272.63182,
+ 0.629583,0.153014,-0.761717,3.257571,-99.95446,274.440434,
+ 0.629583,0.153014,-0.761717,0.020624,-102.478609,271.257943,
+ 0.679215,0.052017,-0.732094,3.257571,-99.95446,274.440434,
+ 0.679215,0.052017,-0.732094,2.172098,-104.633126,273.100934,
+ 0.679215,0.052017,-0.732094,0.020624,-102.478609,271.257943,
+ 0.796191,0.438053,-0.41736,0.020624,-105.884097,267.683611,
+ 0.796191,0.438053,-0.41736,0.020624,-102.478609,271.257943,
+ 0.796191,0.438053,-0.41736,2.172098,-104.633126,273.100934,
+ 0.908938,0.138997,-0.393079,0.020624,-105.884097,267.683611,
+ 0.908938,0.138997,-0.393079,2.172098,-104.633126,273.100934,
+ 0.908938,0.138997,-0.393079,1.137127,-112.100312,268.067238,
+ 0.975863,-0.115374,-0.185421,2.05558,-123.827551,275.228375,
+ 0.975863,-0.115374,-0.185421,3.689873,-117.104498,279.64632,
+ 0.975863,-0.115374,-0.185421,2.422171,-132.650361,282.647493,
+ 0.84411,-0.042823,-0.534457,2.172098,-104.633126,273.100934,
+ 0.84411,-0.042823,-0.534457,3.257571,-99.95446,274.440434,
+ 0.84411,-0.042823,-0.534457,5.306217,-102.936771,277.91498,
+ 0.852055,-0.158185,-0.498978,2.172098,-104.633126,273.100934,
+ 0.852055,-0.158185,-0.498978,5.306217,-102.936771,277.91498,
+ 0.852055,-0.158185,-0.498978,3.689873,-117.104498,279.64632,
+ 0.476624,-0.477344,-0.738222,2.422171,-132.650361,282.647493,
+ 0.476624,-0.477344,-0.738222,7.688598,-141.959625,292.067191,
+ 0.476624,-0.477344,-0.738222,2.840175,-146.74051,292.02825,
+ 0.85445,-0.040703,-0.517937,2.422171,-132.650361,282.647493,
+ 0.85445,-0.040703,-0.517937,5.921967,-125.073046,287.825695,
+ 0.85445,-0.040703,-0.517937,7.688598,-141.959625,292.067191,
+ 0.902123,-0.151555,-0.403987,3.689873,-117.104498,279.64632,
+ 0.902123,-0.151555,-0.403987,5.818227,-115.24873,283.702847,
+ 0.902123,-0.151555,-0.403987,2.422171,-132.650361,282.647493,
+ 0.908315,-0.153671,-0.389036,2.422171,-132.650361,282.647493,
+ 0.908315,-0.153671,-0.389036,5.818227,-115.24873,283.702847,
+ 0.908315,-0.153671,-0.389036,5.921967,-125.073046,287.825695,
+ 0.733949,-0.256224,-0.629022,5.818227,-115.24873,283.702847,
+ 0.733949,-0.256224,-0.629022,9.85285,-107.990546,285.453963,
+ 0.733949,-0.256224,-0.629022,5.921967,-125.073046,287.825695,
+ -0.290365,-0.065728,-0.954656,9.85285,-107.990546,285.453963,
+ -0.290365,-0.065728,-0.954656,9.94868,-125.549461,286.633744,
+ -0.290365,-0.065728,-0.954656,5.921967,-125.073046,287.825695,
+ -0.302288,-0.261839,-0.916549,5.921967,-125.073046,287.825695,
+ -0.302288,-0.261839,-0.916549,9.94868,-125.549461,286.633744,
+ -0.302288,-0.261839,-0.916549,7.688598,-141.959625,292.067191,
+ -0.586298,-0.180718,-0.789681,9.94868,-125.549461,286.633744,
+ -0.586298,-0.180718,-0.789681,10.355428,-140.790187,289.819582,
+ -0.586298,-0.180718,-0.789681,7.688598,-141.959625,292.067191,
+ 0.596754,-0.064735,0.799809,0.887359,-147.460609,259.065241,
+ 0.596754,-0.064735,0.799809,0.020624,-152.665279,259.290671,
+ 0.596754,-0.064735,0.799809,1.254862,-151.999941,258.423631,
+ 0.733986,-0.093092,0.672755,0.887359,-147.460609,259.065241,
+ 0.733986,-0.093092,0.672755,0.020624,-147.740496,259.972133,
+ 0.733986,-0.093092,0.672755,0.020624,-152.665279,259.290671,
+ 0.942265,-0.099639,0.319701,3.005977,-154.302614,254.768985,
+ 0.942265,-0.099639,0.319701,2.224729,-155.621123,256.660651,
+ 0.942265,-0.099639,0.319701,2.193394,-157.414829,256.193971,
+ 0.802218,-0.163416,0.574231,2.193394,-157.414829,256.193971,
+ 0.802218,-0.163416,0.574231,2.224729,-155.621123,256.660651,
+ 0.802218,-0.163416,0.574231,1.012091,-159.116356,257.360063,
+ 0.350884,0.108198,0.930147,4.326615,-152.695702,254.083871,
+ 0.350884,0.108198,0.930147,3.005977,-154.302614,254.768985,
+ 0.350884,0.108198,0.930147,3.035183,-156.07898,254.964601,
+ 0.779008,0.081273,0.621724,3.005977,-154.302614,254.768985,
+ 0.779008,0.081273,0.621724,2.193394,-157.414829,256.193971,
+ 0.779008,0.081273,0.621724,3.035183,-156.07898,254.964601,
+ 0.695293,-0.09877,0.711907,2.497923,-149.882539,257.190002,
+ 0.695293,-0.09877,0.711907,1.012091,-159.116356,257.360063,
+ 0.695293,-0.09877,0.711907,2.224729,-155.621123,256.660651,
+ 0.792519,-0.116501,0.598616,2.497923,-149.882539,257.190002,
+ 0.792519,-0.116501,0.598616,1.254862,-151.999941,258.423631,
+ 0.792519,-0.116501,0.598616,1.012091,-159.116356,257.360063,
+ 0.746934,-0.112086,0.655383,2.361022,-145.657472,257.694101,
+ 0.746934,-0.112086,0.655383,2.068966,-136.133729,259.65574,
+ 0.746934,-0.112086,0.655383,0.887359,-147.460609,259.065241,
+ 0.778233,-0.113384,0.617655,0.887359,-147.460609,259.065241,
+ 0.778233,-0.113384,0.617655,2.068966,-136.133729,259.65574,
+ 0.778233,-0.113384,0.617655,0.596521,-137.446762,261.269954,
+ 0.800779,-0.207043,0.562038,2.068966,-136.133729,259.65574,
+ 0.800779,-0.207043,0.562038,1.966138,-126.468523,263.362713,
+ 0.800779,-0.207043,0.562038,0.596521,-137.446762,261.269954,
+ 0.890844,-0.189822,0.412753,0.596521,-137.446762,261.269954,
+ 0.890844,-0.189822,0.412753,1.966138,-126.468523,263.362713,
+ 0.890844,-0.189822,0.412753,0.692047,-129.916297,264.52698,
+ 0.748655,-0.054572,0.66071,2.497923,-149.882539,257.190002,
+ 0.748655,-0.054572,0.66071,2.361022,-145.657472,257.694101,
+ 0.748655,-0.054572,0.66071,1.254862,-151.999941,258.423631,
+ 0.707855,-0.042352,0.705087,2.361022,-145.657472,257.694101,
+ 0.707855,-0.042352,0.705087,0.887359,-147.460609,259.065241,
+ 0.707855,-0.042352,0.705087,1.254862,-151.999941,258.423631,
+ -0.212655,0.019928,0.976924,12.297292,-149.321245,255.023925,
+ -0.212655,0.019928,0.976924,7.175372,-151.525959,253.953968,
+ -0.212655,0.019928,0.976924,13.888081,-150.391507,255.392036,
+ -0.174542,-0.191542,0.96584,13.888081,-150.391507,255.392036,
+ -0.174542,-0.191542,0.96584,7.175372,-151.525959,253.953968,
+ -0.174542,-0.191542,0.96584,7.904597,-152.506474,253.891297,
+ 0.05494,-0.022943,0.998226,7.175372,-151.525959,253.953968,
+ 0.05494,-0.022943,0.998226,4.326615,-152.695702,254.083871,
+ 0.05494,-0.022943,0.998226,7.904597,-152.506474,253.891297,
+ 0.039677,0.237513,0.970574,7.904597,-152.506474,253.891297,
+ 0.039677,0.237513,0.970574,4.326615,-152.695702,254.083871,
+ 0.039677,0.237513,0.970574,3.035183,-156.07898,254.964601,
+ -0.681715,0.215495,0.699161,16.52601,-147.501984,258.586391,
+ -0.681715,0.215495,0.699161,12.297292,-149.321245,255.023925,
+ -0.681715,0.215495,0.699161,17.161839,-149.498912,259.821846,
+ -0.55291,-0.637124,0.536995,17.161839,-149.498912,259.821846,
+ -0.55291,-0.637124,0.536995,12.297292,-149.321245,255.023925,
+ -0.55291,-0.637124,0.536995,13.888081,-150.391507,255.392036,
+ -0.903336,-0.099537,0.417226,16.52601,-147.501984,258.586391,
+ -0.903336,-0.099537,0.417226,18.39121,-150.283507,261.961152,
+ -0.903336,-0.099537,0.417226,18.143267,-148.36233,261.882662,
+ -0.85968,0.041283,0.509163,16.52601,-147.501984,258.586391,
+ -0.85968,0.041283,0.509163,17.161839,-149.498912,259.821846,
+ -0.85968,0.041283,0.509163,18.39121,-150.283507,261.961152,
+ -0.971899,-0.234651,-0.018732,18.143267,-148.36233,261.882662,
+ -0.971899,-0.234651,-0.018732,18.867016,-151.772381,267.048087,
+ -0.971899,-0.234651,-0.018732,18.536629,-150.414323,267.177991,
+ -0.990511,-0.125549,0.055901,18.143267,-148.36233,261.882662,
+ -0.990511,-0.125549,0.055901,18.39121,-150.283507,261.961152,
+ -0.990511,-0.125549,0.055901,18.867016,-151.772381,267.048087,
+ -0.984157,0.088562,-0.153594,18.867016,-151.772381,267.048087,
+ -0.984157,0.088562,-0.153594,17.334639,-154.861475,275.085693,
+ -0.984157,0.088562,-0.153594,17.691189,-152.352841,274.247555,
+ -0.960477,-0.216986,-0.174361,18.867016,-151.772381,267.048087,
+ -0.960477,-0.216986,-0.174361,17.691189,-152.352841,274.247555,
+ -0.960477,-0.216986,-0.174361,18.536629,-150.414323,267.177991,
+ -0.943776,-0.179672,-0.277498,17.334639,-154.861475,275.085693,
+ -0.943776,-0.179672,-0.277498,16.338304,-156.303802,279.408113,
+ -0.943776,-0.179672,-0.277498,16.188017,-154.192181,278.552025,
+ -0.947398,0.028135,-0.31882,17.691189,-152.352841,274.247555,
+ -0.947398,0.028135,-0.31882,17.334639,-154.861475,275.085693,
+ -0.947398,0.028135,-0.31882,16.188017,-154.192181,278.552025,
+ -0.834418,-0.154684,-0.52898,16.338304,-156.303802,279.408113,
+ -0.834418,-0.154684,-0.52898,13.125391,-158.616515,285.152476,
+ -0.834418,-0.154684,-0.52898,13.836972,-156.503069,283.412009,
+ -0.810897,-0.268509,-0.519951,16.188017,-154.192181,278.552025,
+ -0.810897,-0.268509,-0.519951,16.338304,-156.303802,279.408113,
+ -0.810897,-0.268509,-0.519951,13.836972,-156.503069,283.412009,
+ -0.967915,-0.077808,-0.238926,13.125391,-158.616515,285.152476,
+ -0.967915,-0.077808,-0.238926,12.087682,-157.783853,289.085184,
+ -0.967915,-0.077808,-0.238926,12.293033,-156.152298,287.721955,
+ -0.939831,0.036716,-0.339661,13.836972,-156.503069,283.412009,
+ -0.939831,0.036716,-0.339661,13.125391,-158.616515,285.152476,
+ -0.939831,0.036716,-0.339661,12.293033,-156.152298,287.721955,
+ -0.75564,-0.271783,-0.595939,12.293033,-156.152298,287.721955,
+ -0.75564,-0.271783,-0.595939,7.546829,-163.614313,297.143174,
+ -0.75564,-0.271783,-0.595939,6.729683,-161.232997,297.093281,
+ -0.560018,-0.488567,-0.669091,12.293033,-156.152298,287.721955,
+ -0.560018,-0.488567,-0.669091,12.087682,-157.783853,289.085184,
+ -0.560018,-0.488567,-0.669091,7.546829,-163.614313,297.143174,
+ 0.007776,0.000259,-0.99997,7.688598,-141.959625,292.067191,
+ 0.007776,0.000259,-0.99997,10.031429,-151.210174,292.083011,
+ 0.007776,0.000259,-0.99997,2.840175,-146.74051,292.02825,
+ -0.306126,-0.502433,-0.808609,2.840175,-146.74051,292.02825,
+ -0.306126,-0.502433,-0.808609,10.031429,-151.210174,292.083011,
+ -0.306126,-0.502433,-0.808609,4.687121,-154.242074,295.990163,
+ -0.464402,-0.268837,-0.843835,10.031429,-151.210174,292.083011,
+ -0.464402,-0.268837,-0.843835,6.729683,-161.232997,297.093281,
+ -0.464402,-0.268837,-0.843835,4.687121,-154.242074,295.990163,
+ -0.868356,0.038907,-0.494412,12.293033,-156.152298,287.721955,
+ -0.868356,0.038907,-0.494412,6.729683,-161.232997,297.093281,
+ -0.868356,0.038907,-0.494412,10.031429,-151.210174,292.083011,
+ 0.92441,-0.242082,0.294725,1.966138,-126.468523,263.362713,
+ 0.92441,-0.242082,0.294725,1.745576,-120.529455,268.932756,
+ 0.92441,-0.242082,0.294725,0.692047,-129.916297,264.52698,
+ 0.985188,-0.149767,0.083508,0.692047,-129.916297,264.52698,
+ 0.985188,-0.149767,0.083508,1.745576,-120.529455,268.932756,
+ 0.985188,-0.149767,0.083508,0.824385,-126.569829,268.967438,
+ 0.980457,-0.150254,-0.126993,1.745576,-120.529455,268.932756,
+ 0.980457,-0.150254,-0.126993,2.05558,-123.827551,275.228375,
+ 0.980457,-0.150254,-0.126993,0.824385,-126.569829,268.967438,
+ 0.97318,-0.206783,-0.100803,0.824385,-126.569829,268.967438,
+ 0.97318,-0.206783,-0.100803,2.05558,-123.827551,275.228375,
+ 0.97318,-0.206783,-0.100803,0.890401,-129.105235,274.805807,
+ 0.944775,-0.187036,-0.269106,0.890401,-129.105235,274.805807,
+ 0.944775,-0.187036,-0.269106,2.05558,-123.827551,275.228375,
+ 0.944775,-0.187036,-0.269106,2.422171,-132.650361,282.647493,
+ 0.918422,-0.260919,-0.297359,0.890401,-129.105235,274.805807,
+ 0.918422,-0.260919,-0.297359,2.422171,-132.650361,282.647493,
+ 0.918422,-0.260919,-0.297359,1.023956,-137.20034,282.321365,
+ 0.882447,-0.242275,-0.403225,1.023956,-137.20034,282.321365,
+ 0.882447,-0.242275,-0.403225,2.422171,-132.650361,282.647493,
+ 0.882447,-0.242275,-0.403225,2.840175,-146.74051,292.02825,
+ 0.880373,-0.245369,-0.405878,1.023956,-137.20034,282.321365,
+ 0.880373,-0.245369,-0.405878,2.840175,-146.74051,292.02825,
+ 0.880373,-0.245369,-0.405878,1.247865,-150.954017,291.121662,
+ -0.953987,-0.1381,-0.266153,18.599299,-146.844555,269.309386,
+ -0.953987,-0.1381,-0.266153,17.686322,-149.840252,274.136209,
+ -0.953987,-0.1381,-0.266153,17.991155,-143.957466,269.991153,
+ -0.976969,0.038574,0.209866,17.572238,-120.320758,267.868276,
+ -0.976969,0.038574,0.209866,17.292047,-132.799735,268.857613,
+ -0.976969,0.038574,0.209866,18.252788,-118.560211,270.712773,
+ -0.969036,0.033509,0.244634,17.292047,-132.799735,268.857613,
+ -0.969036,0.033509,0.244634,18.198636,-128.779106,271.898031,
+ -0.969036,0.033509,0.244634,18.252788,-118.560211,270.712773,
+ -0.953661,0.089426,0.287289,14.716484,-121.258377,258.680397,
+ -0.953661,0.089426,0.287289,14.633431,-133.704194,262.278762,
+ -0.953661,0.089426,0.287289,17.572238,-120.320758,267.868276,
+ -0.928364,0.050042,0.368287,14.633431,-133.704194,262.278762,
+ -0.928364,0.050042,0.368287,17.292047,-132.799735,268.857613,
+ -0.928364,0.050042,0.368287,17.572238,-120.320758,267.868276,
+ -0.900083,-0.250089,0.3568,15.089159,-139.389234,263.369406,
+ -0.900083,-0.250089,0.3568,15.968063,-142.0442,263.725653,
+ -0.900083,-0.250089,0.3568,17.217208,-138.346657,269.468495,
+ -0.95527,-0.106052,0.276066,15.968063,-142.0442,263.725653,
+ -0.95527,-0.106052,0.276066,17.991155,-143.957466,269.991153,
+ -0.95527,-0.106052,0.276066,17.217208,-138.346657,269.468495,
+ -0.927039,-0.00238,0.374958,14.633431,-133.704194,262.278762,
+ -0.927039,-0.00238,0.374958,15.089159,-139.389234,263.369406,
+ -0.927039,-0.00238,0.374958,17.292047,-132.799735,268.857613,
+ -0.945615,0.048187,0.3217,15.089159,-139.389234,263.369406,
+ -0.945615,0.048187,0.3217,17.217208,-138.346657,269.468495,
+ -0.945615,0.048187,0.3217,17.292047,-132.799735,268.857613,
+ -0.341662,-0.923981,-0.171831,19.517752,-143.174089,262.743313,
+ -0.341662,-0.923981,-0.171831,17.991155,-143.957466,269.991153,
+ -0.341662,-0.923981,-0.171831,15.968063,-142.0442,263.725653,
+ -0.963852,-0.151228,-0.21936,19.517752,-143.174089,262.743313,
+ -0.963852,-0.151228,-0.21936,18.599299,-146.844555,269.309386,
+ -0.963852,-0.151228,-0.21936,17.991155,-143.957466,269.991153,
+ -0.997604,-0.02171,0.065694,18.143267,-148.36233,261.882662,
+ -0.997604,-0.02171,0.065694,18.536629,-150.414323,267.177991,
+ -0.997604,-0.02171,0.065694,18.599299,-146.844555,269.309386,
+ -0.966926,0.254955,0.007269,18.143267,-148.36233,261.882662,
+ -0.966926,0.254955,0.007269,18.599299,-146.844555,269.309386,
+ -0.966926,0.254955,0.007269,19.517752,-143.174089,262.743313,
+ -0.870774,0.153185,0.467212,16.52601,-147.501984,258.586391,
+ -0.870774,0.153185,0.467212,18.143267,-148.36233,261.882662,
+ -0.870774,0.153185,0.467212,19.517752,-143.174089,262.743313,
+ -0.881674,0.198158,0.428233,16.52601,-147.501984,258.586391,
+ -0.881674,0.198158,0.428233,19.517752,-143.174089,262.743313,
+ -0.881674,0.198158,0.428233,17.459979,-143.858593,258.823382,
+ -0.876536,0.172692,0.44929,18.054738,-129.670179,254.530169,
+ -0.876536,0.172692,0.44929,17.459979,-143.858593,258.823382,
+ -0.876536,0.172692,0.44929,18.126534,-136.10787,257.144672,
+ -0.830904,0.192767,0.521957,15.719512,-133.131948,252.091202,
+ -0.830904,0.192767,0.521957,17.459979,-143.858593,258.823382,
+ -0.830904,0.192767,0.521957,18.054738,-129.670179,254.530169,
+ -0.220343,-0.934703,0.278889,19.517752,-143.174089,262.743313,
+ -0.220343,-0.934703,0.278889,15.968063,-142.0442,263.725653,
+ -0.220343,-0.934703,0.278889,17.459979,-143.858593,258.823382,
+ -0.94483,-0.267992,-0.188354,17.459979,-143.858593,258.823382,
+ -0.94483,-0.267992,-0.188354,15.968063,-142.0442,263.725653,
+ -0.94483,-0.267992,-0.188354,15.951026,-140.47136,261.573266,
+ -0.912998,-0.333726,-0.234653,15.250398,-138.391378,261.322889,
+ -0.912998,-0.333726,-0.234653,15.968063,-142.0442,263.725653,
+ -0.912998,-0.333726,-0.234653,15.089159,-139.389234,263.369406,
+ -0.911405,-0.335658,-0.238065,15.250398,-138.391378,261.322889,
+ -0.911405,-0.335658,-0.238065,15.951026,-140.47136,261.573266,
+ -0.911405,-0.335658,-0.238065,15.968063,-142.0442,263.725653,
+ -0.937948,-0.329099,-0.109307,17.459979,-143.858593,258.823382,
+ -0.937948,-0.329099,-0.109307,15.951026,-140.47136,261.573266,
+ -0.937948,-0.329099,-0.109307,15.250398,-138.391378,261.322889,
+ -0.807307,-0.057773,-0.587296,18.126534,-136.10787,257.144672,
+ -0.807307,-0.057773,-0.587296,17.459979,-143.858593,258.823382,
+ -0.807307,-0.057773,-0.587296,15.250398,-138.391378,261.322889,
+ -0.844155,-0.133048,-0.519326,18.054738,-129.670179,254.530169,
+ -0.844155,-0.133048,-0.519326,15.250398,-138.391378,261.322889,
+ -0.844155,-0.133048,-0.519326,15.097981,-133.031858,260.197563,
+ -0.718644,-0.26852,-0.641442,18.054738,-129.670179,254.530169,
+ -0.718644,-0.26852,-0.641442,18.126534,-136.10787,257.144672,
+ -0.718644,-0.26852,-0.641442,15.250398,-138.391378,261.322889,
+ -0.958831,-0.125713,-0.254635,15.097981,-133.031858,260.197563,
+ -0.958831,-0.125713,-0.254635,15.089159,-139.389234,263.369406,
+ -0.958831,-0.125713,-0.254635,14.633431,-133.704194,262.278762,
+ -0.993481,-0.049785,-0.102548,15.097981,-133.031858,260.197563,
+ -0.993481,-0.049785,-0.102548,15.250398,-138.391378,261.322889,
+ -0.993481,-0.049785,-0.102548,15.089159,-139.389234,263.369406,
+ -0.810121,-0.157837,-0.564616,18.609034,-117.731809,252.109456,
+ -0.810121,-0.157837,-0.564616,14.633431,-133.704194,262.278762,
+ -0.810121,-0.157837,-0.564616,14.716484,-121.258377,258.680397,
+ -0.975716,0.131177,-0.175416,18.609034,-117.731809,252.109456,
+ -0.975716,0.131177,-0.175416,15.097981,-133.031858,260.197563,
+ -0.975716,0.131177,-0.175416,14.633431,-133.704194,262.278762,
+ -0.820309,0.402849,0.405962,14.762422,-123.280556,249.842984,
+ -0.820309,0.402849,0.405962,15.097981,-133.031858,260.197563,
+ -0.820309,0.402849,0.405962,18.609034,-117.731809,252.109456,
+ -0.419879,-0.667466,-0.614972,18.054738,-129.670179,254.530169,
+ -0.419879,-0.667466,-0.614972,15.097981,-133.031858,260.197563,
+ -0.419879,-0.667466,-0.614972,14.762422,-123.280556,249.842984,
+ -0.077366,-0.538823,0.838859,18.054738,-129.670179,254.530169,
+ -0.077366,-0.538823,0.838859,9.473482,-134.296823,250.766914,
+ -0.077366,-0.538823,0.838859,15.719512,-133.131948,252.091202,
+ -0.518645,0.315645,0.794591,14.762422,-123.280556,249.842984,
+ -0.518645,0.315645,0.794591,9.473482,-134.296823,250.766914,
+ -0.518645,0.315645,0.794591,18.054738,-129.670179,254.530169,
+ 0.893909,-0.008656,0.448164,5.239288,-121.781947,250.253079,
+ 0.893909,-0.008656,0.448164,3.035183,-136.192141,254.371059,
+ 0.893909,-0.008656,0.448164,4.676777,-135.138916,251.117076,
+ 0.051168,0.120772,0.991361,10.105964,-122.280875,249.270434,
+ 0.051168,0.120772,0.991361,4.676777,-135.138916,251.117076,
+ 0.051168,0.120772,0.991361,9.473482,-134.296823,250.766914,
+ 0.203007,0.05469,0.977649,5.239288,-121.781947,250.253079,
+ 0.203007,0.05469,0.977649,4.676777,-135.138916,251.117076,
+ 0.203007,0.05469,0.977649,10.105964,-122.280875,249.270434,
+ -0.11534,0.137878,0.98371,14.550682,-116.81153,248.91145,
+ -0.11534,0.137878,0.98371,9.473482,-134.296823,250.766914,
+ -0.11534,0.137878,0.98371,14.762422,-123.280556,249.842984,
+ -0.076645,0.127195,0.988912,14.550682,-116.81153,248.91145,
+ -0.076645,0.127195,0.988912,10.105964,-122.280875,249.270434,
+ -0.076645,0.127195,0.988912,9.473482,-134.296823,250.766914,
+ -0.71946,0.231253,0.654904,18.273779,-112.183061,249.781835,
+ -0.71946,0.231253,0.654904,14.762422,-123.280556,249.842984,
+ -0.71946,0.231253,0.654904,18.609034,-117.731809,252.109456,
+ -0.366005,0.120892,0.922727,18.273779,-112.183061,249.781835,
+ -0.366005,0.120892,0.922727,14.550682,-116.81153,248.91145,
+ -0.366005,0.120892,0.922727,14.762422,-123.280556,249.842984,
+ -0.83121,-0.187411,-0.523418,18.273779,-112.183061,249.781835,
+ -0.83121,-0.187411,-0.523418,14.716484,-121.258377,258.680397,
+ -0.83121,-0.187411,-0.523418,15.197463,-115.223783,255.755888,
+ -0.743469,-0.296402,-0.599499,18.273779,-112.183061,249.781835,
+ -0.743469,-0.296402,-0.599499,18.609034,-117.731809,252.109456,
+ -0.743469,-0.296402,-0.599499,14.716484,-121.258377,258.680397,
+ -0.969317,0.09101,0.228344,15.197463,-115.223783,255.755888,
+ -0.969317,0.09101,0.228344,17.572238,-120.320758,267.868276,
+ -0.969317,0.09101,0.228344,17.783369,-110.691754,264.926731,
+ -0.940157,0.206344,0.27116,15.197463,-115.223783,255.755888,
+ -0.940157,0.206344,0.27116,14.716484,-121.258377,258.680397,
+ -0.940157,0.206344,0.27116,17.572238,-120.320758,267.868276,
+ -0.959999,0.100783,-0.261237,18.376303,-109.031601,267.530891,
+ -0.959999,0.100783,-0.261237,16.33587,-119.907621,270.833246,
+ -0.959999,0.100783,-0.261237,17.158188,-109.417966,271.858178,
+ 0.162234,-0.314432,-0.935314,18.376303,-109.031601,267.530891,
+ 0.162234,-0.314432,-0.935314,18.252788,-118.560211,270.712773,
+ 0.162234,-0.314432,-0.935314,16.33587,-119.907621,270.833246,
+ -0.987166,-0.1374,0.081391,10.162246,-128.987804,283.419614,
+ -0.987166,-0.1374,0.081391,11.950172,-139.166237,287.922134,
+ -0.987166,-0.1374,0.081391,9.94868,-125.549461,286.633744,
+ -0.679437,-0.167461,-0.714368,9.94868,-125.549461,286.633744,
+ -0.679437,-0.167461,-0.714368,11.950172,-139.166237,287.922134,
+ -0.679437,-0.167461,-0.714368,10.355428,-140.790187,289.819582,
+ -0.989997,-0.000919,-0.141083,10.248341,-111.601688,282.702254,
+ -0.989997,-0.000919,-0.141083,10.162246,-128.987804,283.419614,
+ -0.989997,-0.000919,-0.141083,9.85285,-107.990546,285.453963,
+ -0.998363,-0.009242,-0.056451,10.162246,-128.987804,283.419614,
+ -0.998363,-0.009242,-0.056451,9.94868,-125.549461,286.633744,
+ -0.998363,-0.009242,-0.056451,9.85285,-107.990546,285.453963,
+ -0.954247,-0.298802,0.01144,10.527924,-130.309963,279.388338,
+ -0.954247,-0.298802,0.01144,13.150946,-138.491468,284.49018,
+ -0.954247,-0.298802,0.01144,10.162246,-128.987804,283.419614,
+ -0.874289,-0.316412,-0.368107,10.162246,-128.987804,283.419614,
+ -0.874289,-0.316412,-0.368107,13.150946,-138.491468,284.49018,
+ -0.874289,-0.316412,-0.368107,11.950172,-139.166237,287.922134,
+ -0.984889,-0.002268,-0.173173,10.885996,-114.357048,279.111798,
+ -0.984889,-0.002268,-0.173173,10.162246,-128.987804,283.419614,
+ -0.984889,-0.002268,-0.173173,10.248341,-111.601688,282.702254,
+ -0.995067,0.020653,-0.097036,10.885996,-114.357048,279.111798,
+ -0.995067,0.020653,-0.097036,10.527924,-130.309963,279.388338,
+ -0.995067,0.020653,-0.097036,10.162246,-128.987804,283.419614,
+ -0.86852,0.0386,-0.494149,12.293033,-156.152298,287.721955,
+ -0.86852,0.0386,-0.494149,10.031429,-151.210174,292.083011,
+ -0.86852,0.0386,-0.494149,11.921879,-147.160644,289.076666,
+ -0.957893,0.003716,-0.2871,12.846113,-150.378121,285.951369,
+ -0.957893,0.003716,-0.2871,12.293033,-156.152298,287.721955,
+ -0.957893,0.003716,-0.2871,11.921879,-147.160644,289.076666,
+ -0.596945,-0.152532,-0.787649,10.355428,-140.790187,289.819582,
+ -0.596945,-0.152532,-0.787649,10.031429,-151.210174,292.083011,
+ -0.596945,-0.152532,-0.787649,7.688598,-141.959625,292.067191,
+ -0.764574,-0.114024,-0.634369,11.921879,-147.160644,289.076666,
+ -0.764574,-0.114024,-0.634369,10.031429,-151.210174,292.083011,
+ -0.764574,-0.114024,-0.634369,10.355428,-140.790187,289.819582,
+ -0.783839,0.046211,-0.619242,12.846113,-150.378121,285.951369,
+ -0.783839,0.046211,-0.619242,10.355428,-140.790187,289.819582,
+ -0.783839,0.046211,-0.619242,11.950172,-139.166237,287.922134,
+ -0.971258,-0.233344,-0.047,12.846113,-150.378121,285.951369,
+ -0.971258,-0.233344,-0.047,11.921879,-147.160644,289.076666,
+ -0.971258,-0.233344,-0.047,10.355428,-140.790187,289.819582,
+ -0.943735,-0.002538,-0.330693,13.620972,-145.948615,283.206049,
+ -0.943735,-0.002538,-0.330693,11.950172,-139.166237,287.922134,
+ -0.943735,-0.002538,-0.330693,13.150946,-138.491468,284.49018,
+ -0.952092,-0.022473,-0.304985,13.620972,-145.948615,283.206049,
+ -0.952092,-0.022473,-0.304985,12.846113,-150.378121,285.951369,
+ -0.952092,-0.022473,-0.304985,11.950172,-139.166237,287.922134,
+ -0.941673,-0.012919,-0.336281,13.836972,-156.503069,283.412009,
+ -0.941673,-0.012919,-0.336281,12.293033,-156.152298,287.721955,
+ -0.941673,-0.012919,-0.336281,12.846113,-150.378121,285.951369,
+ -0.943478,-0.015368,-0.331077,14.051145,-152.047704,282.594862,
+ -0.943478,-0.015368,-0.331077,13.836972,-156.503069,283.412009,
+ -0.943478,-0.015368,-0.331077,12.846113,-150.378121,285.951369,
+ -0.934601,-0.054372,-0.351517,14.387009,-147.828417,281.460106,
+ -0.934601,-0.054372,-0.351517,12.846113,-150.378121,285.951369,
+ -0.934601,-0.054372,-0.351517,13.620972,-145.948615,283.206049,
+ -0.9433,-0.014105,-0.331642,14.387009,-147.828417,281.460106,
+ -0.9433,-0.014105,-0.331642,14.051145,-152.047704,282.594862,
+ -0.9433,-0.014105,-0.331642,12.846113,-150.378121,285.951369,
+ -0.891954,-0.039725,-0.450377,16.188017,-154.192181,278.552025,
+ -0.891954,-0.039725,-0.450377,13.836972,-156.503069,283.412009,
+ -0.891954,-0.039725,-0.450377,14.051145,-152.047704,282.594862,
+ -0.892086,-0.040475,-0.450049,16.188017,-154.192181,278.552025,
+ -0.892086,-0.040475,-0.450049,14.051145,-152.047704,282.594862,
+ -0.892086,-0.040475,-0.450049,16.046857,-151.500404,278.589749,
+ -0.89963,-0.069709,-0.431054,16.682686,-147.611809,276.633891,
+ -0.89963,-0.069709,-0.431054,16.046857,-151.500404,278.589749,
+ -0.89963,-0.069709,-0.431054,14.387009,-147.828417,281.460106,
+ -0.891141,-0.050338,-0.450926,16.046857,-151.500404,278.589749,
+ -0.891141,-0.050338,-0.450926,14.051145,-152.047704,282.594862,
+ -0.891141,-0.050338,-0.450926,14.387009,-147.828417,281.460106,
+ -0.541216,-0.494049,-0.680442,13.157334,-125.268358,273.636369,
+ -0.541216,-0.494049,-0.680442,15.593563,-127.382413,273.233576,
+ -0.541216,-0.494049,-0.680442,10.527924,-130.309963,279.388338,
+ -0.480633,-0.569771,-0.666598,15.593563,-127.382413,273.233576,
+ -0.480633,-0.569771,-0.666598,13.150946,-138.491468,284.49018,
+ -0.480633,-0.569771,-0.666598,10.527924,-130.309963,279.388338,
+ -0.424517,-0.208954,-0.880979,12.244053,-119.798404,272.779065,
+ -0.424517,-0.208954,-0.880979,16.33587,-119.907621,270.833246,
+ -0.424517,-0.208954,-0.880979,13.157334,-125.268358,273.636369,
+ -0.366229,-0.251337,-0.895938,16.33587,-119.907621,270.833246,
+ -0.366229,-0.251337,-0.895938,15.593563,-127.382413,273.233576,
+ -0.366229,-0.251337,-0.895938,13.157334,-125.268358,273.636369,
+ -0.974332,0.01798,-0.224395,12.244053,-119.798404,272.779065,
+ -0.974332,0.01798,-0.224395,10.527924,-130.309963,279.388338,
+ -0.974332,0.01798,-0.224395,10.885996,-114.357048,279.111798,
+ -0.799125,-0.221045,-0.559052,12.244053,-119.798404,272.779065,
+ -0.799125,-0.221045,-0.559052,13.157334,-125.268358,273.636369,
+ -0.799125,-0.221045,-0.559052,10.527924,-130.309963,279.388338,
+ 0.018622,-0.115292,-0.993157,18.252788,-118.560211,270.712773,
+ 0.018622,-0.115292,-0.993157,18.198636,-128.779106,271.898031,
+ 0.018622,-0.115292,-0.993157,16.33587,-119.907621,270.833246,
+ -0.53293,-0.210274,-0.819616,16.33587,-119.907621,270.833246,
+ -0.53293,-0.210274,-0.819616,18.198636,-128.779106,271.898031,
+ -0.53293,-0.210274,-0.819616,15.593563,-127.382413,273.233576,
+ -0.567398,-0.342049,-0.749041,15.593563,-127.382413,273.233576,
+ -0.567398,-0.342049,-0.749041,18.198636,-128.779106,271.898031,
+ -0.567398,-0.342049,-0.749041,13.620972,-145.948615,283.206049,
+ -0.972465,-0.021332,-0.232071,15.593563,-127.382413,273.233576,
+ -0.972465,-0.021332,-0.232071,13.620972,-145.948615,283.206049,
+ -0.972465,-0.021332,-0.232071,13.150946,-138.491468,284.49018,
+ -0.970332,0.240127,-0.02821,17.292047,-132.799735,268.857613,
+ -0.970332,0.240127,-0.02821,13.620972,-145.948615,283.206049,
+ -0.970332,0.240127,-0.02821,18.198636,-128.779106,271.898031,
+ -0.943234,-0.086559,-0.320651,17.292047,-132.799735,268.857613,
+ -0.943234,-0.086559,-0.320651,14.387009,-147.828417,281.460106,
+ -0.943234,-0.086559,-0.320651,13.620972,-145.948615,283.206049,
+ -0.970774,-0.013292,-0.239627,17.292047,-132.799735,268.857613,
+ -0.970774,-0.013292,-0.239627,17.217208,-138.346657,269.468495,
+ -0.970774,-0.013292,-0.239627,14.387009,-147.828417,281.460106,
+ -0.862761,-0.277231,-0.422831,17.217208,-138.346657,269.468495,
+ -0.862761,-0.277231,-0.422831,16.682686,-147.611809,276.633891,
+ -0.862761,-0.277231,-0.422831,14.387009,-147.828417,281.460106,
+ -0.936174,-0.017373,-0.351107,17.686322,-149.840252,274.136209,
+ -0.936174,-0.017373,-0.351107,17.691189,-152.352841,274.247555,
+ -0.936174,-0.017373,-0.351107,16.046857,-151.500404,278.589749,
+ -0.937122,-0.044292,-0.346181,17.691189,-152.352841,274.247555,
+ -0.937122,-0.044292,-0.346181,16.188017,-154.192181,278.552025,
+ -0.937122,-0.044292,-0.346181,16.046857,-151.500404,278.589749,
+ -0.925661,0.007098,-0.378288,17.80071,-146.304557,273.922644,
+ -0.925661,0.007098,-0.378288,17.686322,-149.840252,274.136209,
+ -0.925661,0.007098,-0.378288,16.682686,-147.611809,276.633891,
+ -0.935095,-0.024912,-0.35352,17.686322,-149.840252,274.136209,
+ -0.935095,-0.024912,-0.35352,16.046857,-151.500404,278.589749,
+ -0.935095,-0.024912,-0.35352,16.682686,-147.611809,276.633891,
+ -0.949223,-0.156364,-0.272995,17.217208,-138.346657,269.468495,
+ -0.949223,-0.156364,-0.272995,17.991155,-143.957466,269.991153,
+ -0.949223,-0.156364,-0.272995,16.682686,-147.611809,276.633891,
+ -0.259872,-0.823536,-0.504237,17.991155,-143.957466,269.991153,
+ -0.259872,-0.823536,-0.504237,17.80071,-146.304557,273.922644,
+ -0.259872,-0.823536,-0.504237,16.682686,-147.611809,276.633891,
+ -0.992662,-0.007272,-0.120705,18.536629,-150.414323,267.177991,
+ -0.992662,-0.007272,-0.120705,17.691189,-152.352841,274.247555,
+ -0.992662,-0.007272,-0.120705,17.686322,-149.840252,274.136209,
+ -0.987258,0.093995,-0.1284,18.536629,-150.414323,267.177991,
+ -0.987258,0.093995,-0.1284,17.686322,-149.840252,274.136209,
+ -0.987258,0.093995,-0.1284,18.599299,-146.844555,269.309386,
+ -0.999079,0.030499,-0.030188,17.991155,-143.957466,269.991153,
+ -0.999079,0.030499,-0.030188,17.686322,-149.840252,274.136209,
+ -0.999079,0.030499,-0.030188,17.80071,-146.304557,273.922644,
+ -0.615018,0.299778,-0.729305,13.650786,-130.553343,235.814288,
+ -0.615018,0.299778,-0.729305,19.588637,-130.922367,230.655252,
+ -0.615018,0.299778,-0.729305,18.795524,-133.788464,230.145981,
+ -0.580831,0.41814,-0.698423,14.360542,-127.621229,236.979467,
+ -0.580831,0.41814,-0.698423,19.588637,-130.922367,230.655252,
+ -0.580831,0.41814,-0.698423,13.650786,-130.553343,235.814288,
+ -0.679758,0.246683,-0.690707,14.360542,-127.621229,236.979467,
+ -0.679758,0.246683,-0.690707,19.745616,-127.832969,231.604128,
+ -0.679758,0.246683,-0.690707,19.588637,-130.922367,230.655252,
+ 0.07056,-0.997507,-0.000824,0.950638,-157.546863,240.529157,
+ 0.07056,-0.997507,-0.000824,0.730988,-157.567246,246.392168,
+ 0.07056,-0.997507,-0.000824,0.020624,-157.612879,240.808739,
+ 0.590608,-0.80404,-0.06857,0.730988,-157.567246,246.392168,
+ 0.590608,-0.80404,-0.06857,0.020624,-158.097813,246.494996,
+ 0.590608,-0.80404,-0.06857,0.020624,-157.612879,240.808739,
+ 0.17651,-0.982197,0.064286,3.064997,-157.170537,240.473484,
+ 0.17651,-0.982197,0.064286,1.314186,-157.099044,246.373002,
+ 0.17651,-0.982197,0.064286,0.950638,-157.546863,240.529157,
+ 0.626313,-0.779295,0.020755,1.314186,-157.099044,246.373002,
+ 0.626313,-0.779295,0.020755,0.730988,-157.567246,246.392168,
+ 0.626313,-0.779295,0.020755,0.950638,-157.546863,240.529157,
+ 0.535856,-0.780057,-0.323062,0.730988,-157.567246,246.392168,
+ 0.535856,-0.780057,-0.323062,0.020624,-161.640292,255.048567,
+ 0.535856,-0.780057,-0.323062,0.020624,-158.097813,246.494996,
+ 0.457082,-0.818651,-0.347686,0.996575,-161.033882,254.903756,
+ 0.457082,-0.818651,-0.347686,0.020624,-161.640292,255.048567,
+ 0.457082,-0.818651,-0.347686,0.730988,-157.567246,246.392168,
+ 0.586429,-0.743611,-0.32116,1.314186,-157.099044,246.373002,
+ 0.586429,-0.743611,-0.32116,0.996575,-161.033882,254.903756,
+ 0.586429,-0.743611,-0.32116,0.730988,-157.567246,246.392168,
+ 0.697979,-0.659807,-0.278351,1.314186,-157.099044,246.373002,
+ 0.697979,-0.659807,-0.278351,2.874552,-158.653631,253.9707,
+ 0.697979,-0.659807,-0.278351,0.996575,-161.033882,254.903756,
+ -0.05628,0.056509,0.996815,48.443218,-131.355886,279.722985,
+ -0.05628,0.056509,0.996815,41.901361,-132.091501,279.395335,
+ -0.05628,0.056509,0.996815,51.802737,-135.802125,280.164718,
+ -0.073833,0.009755,0.997223,41.901361,-132.091501,279.395335,
+ -0.073833,0.009755,0.997223,45.230792,-138.147086,279.701081,
+ -0.073833,0.009755,0.997223,51.802737,-135.802125,280.164718,
+ 0.199938,0.034429,0.979204,39.058993,-122.022588,279.621678,
+ 0.199938,0.034429,0.979204,41.901361,-132.091501,279.395335,
+ 0.199938,0.034429,0.979204,45.403287,-124.402535,278.409953,
+ -0.066982,0.156786,0.985359,45.403287,-124.402535,278.409953,
+ -0.066982,0.156786,0.985359,41.901361,-132.091501,279.395335,
+ -0.066982,0.156786,0.985359,48.443218,-131.355886,279.722985,
+ -0.170306,-0.03083,0.984909,48.443218,-131.355886,279.722985,
+ -0.170306,-0.03083,0.984909,51.802737,-135.802125,280.164718,
+ -0.170306,-0.03083,0.984909,55.720416,-133.943314,280.900333,
+ 0.020988,0.194366,0.980704,49.549074,-123.522414,278.146798,
+ 0.020988,0.194366,0.980704,45.403287,-124.402535,278.409953,
+ 0.020988,0.194366,0.980704,48.443218,-131.355886,279.722985,
+ -0.083745,0.207914,0.974556,49.549074,-123.522414,278.146798,
+ -0.083745,0.207914,0.974556,48.443218,-131.355886,279.722985,
+ -0.083745,0.207914,0.974556,55.720416,-133.943314,280.900333,
+ -0.65026,0.31108,-0.693103,18.902002,-121.852831,234.624771,
+ -0.65026,0.31108,-0.693103,19.66165,-123.854019,233.013903,
+ -0.65026,0.31108,-0.693103,13.753006,-122.302779,239.253544,
+ -0.629142,0.4107,-0.659928,18.561879,-115.535005,238.880869,
+ -0.629142,0.4107,-0.659928,18.902002,-121.852831,234.624771,
+ -0.629142,0.4107,-0.659928,13.753006,-122.302779,239.253544,
+ -0.438161,0.264022,-0.859248,18.561879,-115.535005,238.880869,
+ -0.438161,0.264022,-0.859248,13.753006,-122.302779,239.253544,
+ -0.438161,0.264022,-0.859248,13.07489,-116.894583,241.26112,
+ 0.050981,0.325296,-0.944237,7.422097,-117.039698,241.655699,
+ 0.050981,0.325296,-0.944237,8.263278,-128.619693,237.711735,
+ 0.050981,0.325296,-0.944237,4.870264,-128.388178,237.608299,
+ 0.023467,0.345657,-0.938068,0.020624,-117.073163,241.656308,
+ 0.023467,0.345657,-0.938068,4.870264,-128.388178,237.608299,
+ 0.023467,0.345657,-0.938068,0.020624,-128.430465,237.471398,
+ -0.001598,0.33624,-0.941775,7.422097,-117.039698,241.655699,
+ -0.001598,0.33624,-0.941775,4.870264,-128.388178,237.608299,
+ -0.001598,0.33624,-0.941775,0.020624,-117.073163,241.656308,
+ -0.000492,0.090778,-0.995871,4.712371,-109.094576,242.381274,
+ -0.000492,0.090778,-0.995871,7.422097,-117.039698,241.655699,
+ -0.000492,0.090778,-0.995871,0.020624,-117.073163,241.656308,
+ 0.160573,-0.00474,-0.987013,4.712371,-109.094576,242.381274,
+ 0.160573,-0.00474,-0.987013,0.020624,-117.073163,241.656308,
+ 0.160573,-0.00474,-0.987013,0.020624,-109.91446,241.62193,
+ -0.806123,0.145222,-0.573652,25.618058,-114.315674,231.726426,
+ -0.806123,0.145222,-0.573652,19.139906,-108.36748,242.335641,
+ -0.806123,0.145222,-0.573652,24.645453,-107.017028,234.94086,
+ -0.694769,0.356986,-0.624385,25.618058,-114.315674,231.726426,
+ -0.694769,0.356986,-0.624385,18.561879,-115.535005,238.880869,
+ -0.694769,0.356986,-0.624385,19.139906,-108.36748,242.335641,
+ -0.674497,0.387164,-0.628616,25.53105,-118.890903,229.336135,
+ -0.674497,0.387164,-0.628616,18.902002,-121.852831,234.624771,
+ -0.674497,0.387164,-0.628616,18.561879,-115.535005,238.880869,
+ -0.6975,0.342194,-0.6296,25.53105,-118.890903,229.336135,
+ -0.6975,0.342194,-0.6296,18.561879,-115.535005,238.880869,
+ -0.6975,0.342194,-0.6296,25.618058,-114.315674,231.726426,
+ -0.186849,0.544942,-0.817389,8.242286,-140.121806,227.856388,
+ -0.186849,0.544942,-0.817389,16.425008,-143.420815,223.786475,
+ -0.186849,0.544942,-0.817389,9.015016,-146.030451,223.740537,
+ -0.058965,0.714191,-0.697463,16.425008,-143.420815,223.786475,
+ -0.058965,0.714191,-0.697463,8.242286,-140.121806,227.856388,
+ -0.058965,0.714191,-0.697463,13.320094,-138.915557,228.662279,
+ -0.343437,0.570618,-0.745953,13.320094,-138.915557,228.662279,
+ -0.343437,0.570618,-0.745953,20.074787,-139.683419,224.96504,
+ -0.343437,0.570618,-0.745953,16.425008,-143.420815,223.786475,
+ -0.328024,0.605559,-0.725051,16.85366,-135.81764,229.651008,
+ -0.328024,0.605559,-0.725051,20.074787,-139.683419,224.96504,
+ -0.328024,0.605559,-0.725051,13.320094,-138.915557,228.662279,
+ -0.379605,0.568458,-0.729901,22.34065,-134.739469,227.637043,
+ -0.379605,0.568458,-0.729901,20.074787,-139.683419,224.96504,
+ -0.379605,0.568458,-0.729901,16.85366,-135.81764,229.651008,
+ -0.381093,0.546583,-0.745664,18.795524,-133.788464,230.145981,
+ -0.381093,0.546583,-0.745664,22.34065,-134.739469,227.637043,
+ -0.381093,0.546583,-0.745664,16.85366,-135.81764,229.651008,
+ -0.511728,0.256019,-0.820115,23.87029,-131.422816,227.717966,
+ -0.511728,0.256019,-0.820115,22.34065,-134.739469,227.637043,
+ -0.511728,0.256019,-0.820115,18.795524,-133.788464,230.145981,
+ -0.51894,0.286694,-0.8053,19.588637,-130.922367,230.655252,
+ -0.51894,0.286694,-0.8053,23.87029,-131.422816,227.717966,
+ -0.51894,0.286694,-0.8053,18.795524,-133.788464,230.145981,
+ -0.523495,0.268055,-0.808764,25.094488,-127.674468,228.167914,
+ -0.523495,0.268055,-0.808764,23.87029,-131.422816,227.717966,
+ -0.523495,0.268055,-0.808764,19.588637,-130.922367,230.655252,
+ -0.525535,0.274078,-0.805415,25.094488,-127.674468,228.167914,
+ -0.525535,0.274078,-0.805415,19.588637,-130.922367,230.655252,
+ -0.525535,0.274078,-0.805415,19.745616,-127.832969,231.604128,
+ -0.537776,0.145792,-0.830387,25.608932,-123.461874,228.574358,
+ -0.537776,0.145792,-0.830387,25.094488,-127.674468,228.167914,
+ -0.537776,0.145792,-0.830387,19.745616,-127.832969,231.604128,
+ -0.588704,0.258895,-0.765768,25.608932,-123.461874,228.574358,
+ -0.588704,0.258895,-0.765768,19.745616,-127.832969,231.604128,
+ -0.588704,0.258895,-0.765768,19.66165,-123.854019,233.013903,
+ -0.598889,0.121709,-0.79153,25.53105,-118.890903,229.336135,
+ -0.598889,0.121709,-0.79153,25.608932,-123.461874,228.574358,
+ -0.598889,0.121709,-0.79153,19.66165,-123.854019,233.013903,
+ -0.672781,0.291856,-0.679842,25.53105,-118.890903,229.336135,
+ -0.672781,0.291856,-0.679842,19.66165,-123.854019,233.013903,
+ -0.672781,0.291856,-0.679842,18.902002,-121.852831,234.624771,
+ -0.093872,0.674985,-0.731836,4.576079,-134.95486,232.778434,
+ -0.093872,0.674985,-0.731836,0.020624,-140.348757,228.387868,
+ -0.093872,0.674985,-0.731836,0.020624,-135.476909,232.881261,
+ -0.124783,0.687612,-0.715276,4.576079,-134.95486,232.778434,
+ -0.124783,0.687612,-0.715276,4.856269,-139.939271,227.93792,
+ -0.124783,0.687612,-0.715276,0.020624,-140.348757,228.387868,
+ 0.018891,0.545722,-0.837753,4.870264,-128.388178,237.608299,
+ 0.018891,0.545722,-0.837753,0.020624,-135.476909,232.881261,
+ 0.018891,0.545722,-0.837753,0.020624,-128.430465,237.471398,
+ -0.086009,0.592806,-0.80074,4.870264,-128.388178,237.608299,
+ -0.086009,0.592806,-0.80074,4.576079,-134.95486,232.778434,
+ -0.086009,0.592806,-0.80074,0.020624,-135.476909,232.881261,
+ 0.059461,0.697161,-0.714444,8.09778,-134.660067,233.359198,
+ 0.059461,0.697161,-0.714444,4.856269,-139.939271,227.93792,
+ 0.059461,0.697161,-0.714444,4.576079,-134.95486,232.778434,
+ 0.021316,0.709869,-0.704011,8.242286,-140.121806,227.856388,
+ 0.021316,0.709869,-0.704011,4.856269,-139.939271,227.93792,
+ 0.021316,0.709869,-0.704011,8.09778,-134.660067,233.359198,
+ 0.064763,0.589375,-0.805259,4.870264,-128.388178,237.608299,
+ 0.064763,0.589375,-0.805259,8.263278,-128.619693,237.711735,
+ 0.064763,0.589375,-0.805259,4.576079,-134.95486,232.778434,
+ -0.009781,0.131862,-0.99122,19.139906,-108.36748,242.335641,
+ -0.009781,0.131862,-0.99122,13.07489,-116.894583,241.26112,
+ -0.009781,0.131862,-0.99122,4.712371,-109.094576,242.381274,
+ -0.44671,0.417445,-0.791322,19.139906,-108.36748,242.335641,
+ -0.44671,0.417445,-0.791322,18.561879,-115.535005,238.880869,
+ -0.44671,0.417445,-0.791322,13.07489,-116.894583,241.26112,
+ -0.07118,0.066612,-0.995237,4.712371,-109.094576,242.381274,
+ -0.07118,0.066612,-0.995237,13.07489,-116.894583,241.26112,
+ -0.07118,0.066612,-0.995237,7.422097,-117.039698,241.655699,
+ -0.074167,0.338861,-0.937908,13.07489,-116.894583,241.26112,
+ -0.074167,0.338861,-0.937908,13.753006,-122.302779,239.253544,
+ -0.074167,0.338861,-0.937908,7.422097,-117.039698,241.655699,
+ -0.096774,0.314579,-0.944285,7.422097,-117.039698,241.655699,
+ -0.096774,0.314579,-0.944285,13.753006,-122.302779,239.253544,
+ -0.096774,0.314579,-0.944285,8.263278,-128.619693,237.711735,
+ -0.685014,0.218867,-0.694876,13.753006,-122.302779,239.253544,
+ -0.685014,0.218867,-0.694876,19.745616,-127.832969,231.604128,
+ -0.685014,0.218867,-0.694876,14.360542,-127.621229,236.979467,
+ -0.676467,0.233233,-0.698566,13.753006,-122.302779,239.253544,
+ -0.676467,0.233233,-0.698566,19.66165,-123.854019,233.013903,
+ -0.676467,0.233233,-0.698566,19.745616,-127.832969,231.604128,
+ -0.056416,0.707879,-0.704077,13.320094,-138.915557,228.662279,
+ -0.056416,0.707879,-0.704077,8.242286,-140.121806,227.856388,
+ -0.056416,0.707879,-0.704077,8.09778,-134.660067,233.359198,
+ -0.047407,0.713446,-0.699104,13.320094,-138.915557,228.662279,
+ -0.047407,0.713446,-0.699104,8.09778,-134.660067,233.359198,
+ -0.047407,0.713446,-0.699104,12.23736,-133.374415,234.390518,
+ -0.364815,0.633803,-0.682058,12.23736,-133.374415,234.390518,
+ -0.364815,0.633803,-0.682058,16.85366,-135.81764,229.651008,
+ -0.364815,0.633803,-0.682058,13.320094,-138.915557,228.662279,
+ -0.419446,0.57312,-0.703987,12.23736,-133.374415,234.390518,
+ -0.419446,0.57312,-0.703987,18.795524,-133.788464,230.145981,
+ -0.419446,0.57312,-0.703987,16.85366,-135.81764,229.651008,
+ -0.421622,0.567982,-0.706846,13.650786,-130.553343,235.814288,
+ -0.421622,0.567982,-0.706846,18.795524,-133.788464,230.145981,
+ -0.421622,0.567982,-0.706846,12.23736,-133.374415,234.390518,
+ 0.947075,-0.106682,0.302768,19.244255,-135.240223,291.20654,
+ 0.947075,-0.106682,0.302768,17.88133,-127.319134,298.260894,
+ 0.947075,-0.106682,0.302768,16.913592,-136.221954,298.151069,
+ 0.989032,0.044842,0.140733,19.007872,-129.822292,291.141436,
+ 0.989032,0.044842,0.140733,17.88133,-127.319134,298.260894,
+ 0.989032,0.044842,0.140733,19.244255,-135.240223,291.20654,
+ 0.908982,-0.326813,0.258738,21.694477,-122.386745,291.09489,
+ 0.908982,-0.326813,0.258738,17.88133,-127.319134,298.260894,
+ 0.908982,-0.326813,0.258738,19.007872,-129.822292,291.141436,
+ 0.90887,-0.124145,0.398175,22.63088,-116.42121,290.817437,
+ 0.90887,-0.124145,0.398175,17.88133,-127.319134,298.260894,
+ 0.90887,-0.124145,0.398175,21.694477,-122.386745,291.09489,
+ 0.909771,-0.126443,0.395385,22.63088,-116.42121,290.817437,
+ 0.909771,-0.126443,0.395385,18.702431,-119.864421,298.755563,
+ 0.909771,-0.126443,0.395385,17.88133,-127.319134,298.260894,
+ 0.76031,-0.068248,0.645965,24.988923,-102.927645,290.882846,
+ 0.76031,-0.068248,0.645965,20.393614,-96.799654,296.939039,
+ 0.76031,-0.068248,0.645965,20.407608,-108.2537,295.712407,
+ 0.791282,-0.141163,0.594934,22.63088,-116.42121,290.817437,
+ 0.791282,-0.141163,0.594934,24.988923,-102.927645,290.882846,
+ 0.791282,-0.141163,0.594934,20.407608,-108.2537,295.712407,
+ 0.693986,-0.124713,0.709105,24.988923,-102.927645,290.882846,
+ 0.693986,-0.124713,0.709105,22.63088,-116.42121,290.817437,
+ 0.693986,-0.124713,0.709105,27.090504,-105.778835,288.324623,
+ 0.899098,-0.017401,0.437401,22.63088,-116.42121,290.817437,
+ 0.899098,-0.017401,0.437401,20.407608,-108.2537,295.712407,
+ 0.899098,-0.017401,0.437401,18.702431,-119.864421,298.755563,
+ 0.960124,-0.070069,0.270651,20.407608,-108.2537,295.712407,
+ 0.960124,-0.070069,0.270651,19.11648,-112.991081,299.066176,
+ 0.960124,-0.070069,0.270651,18.702431,-119.864421,298.755563,
+ 0.559121,-0.040325,0.828105,27.090504,-105.778835,288.324623,
+ 0.559121,-0.040325,0.828105,22.63088,-116.42121,290.817437,
+ 0.559121,-0.040325,0.828105,33.268692,-111.68535,283.865607,
+ 0.619952,-0.415652,0.665503,33.268692,-111.68535,283.865607,
+ 0.619952,-0.415652,0.665503,22.63088,-116.42121,290.817437,
+ 0.619952,-0.415652,0.665503,27.607381,-116.500917,286.131774,
+ -0.01455,-0.997188,0.073519,25.581551,-90.487608,303.293373,
+ -0.01455,-0.997188,0.073519,22.114611,-90.640633,300.531624,
+ -0.01455,-0.997188,0.073519,24.4976,-90.980755,296.389914,
+ 0.397953,-0.79637,-0.455442,25.581551,-90.487608,303.293373,
+ 0.397953,-0.79637,-0.455442,24.537758,-91.141082,303.523975,
+ 0.397953,-0.79637,-0.455442,22.114611,-90.640633,300.531624,
+ 0.534578,-0.673928,0.509948,27.554446,-85.720108,307.525741,
+ 0.534578,-0.673928,0.509948,24.537758,-91.141082,303.523975,
+ 0.534578,-0.673928,0.509948,25.581551,-90.487608,303.293373,
+ 0.556619,-0.671171,0.489597,27.554446,-85.720108,307.525741,
+ 0.556619,-0.671171,0.489597,26.259363,-86.501661,307.926709,
+ 0.556619,-0.671171,0.489597,24.537758,-91.141082,303.523975,
+ 0.557595,-0.678896,0.477691,27.554446,-85.720108,307.525741,
+ 0.557595,-0.678896,0.477691,26.81944,-84.901137,309.547616,
+ 0.557595,-0.678896,0.477691,26.259363,-86.501661,307.926709,
+ -0.40137,-0.890385,0.214747,35.309733,-88.00392,312.551527,
+ -0.40137,-0.890385,0.214747,26.81944,-84.901137,309.547616,
+ -0.40137,-0.890385,0.214747,27.554446,-85.720108,307.525741,
+ -0.431672,-0.281332,0.857037,30.335969,-85.041992,297.299849,
+ -0.431672,-0.281332,0.857037,28.014129,-88.185542,295.098482,
+ -0.431672,-0.281332,0.857037,30.858322,-88.9315,296.286174,
+ -0.300272,-0.388324,0.87123,30.335969,-85.041992,297.299849,
+ -0.300272,-0.388324,0.87123,28.117261,-85.653179,296.262748,
+ -0.300272,-0.388324,0.87123,28.014129,-88.185542,295.098482,
+ -0.877009,-0.32187,0.356727,30.858322,-88.9315,296.286174,
+ -0.877009,-0.32187,0.356727,32.359974,-89.102474,299.823694,
+ -0.877009,-0.32187,0.356727,30.87688,-84.933993,299.938691,
+ -0.961688,-0.182474,0.204595,30.858322,-88.9315,296.286174,
+ -0.961688,-0.182474,0.204595,30.87688,-84.933993,299.938691,
+ -0.961688,-0.182474,0.204595,30.335969,-85.041992,297.299849,
+ -0.692505,-0.558878,0.456171,32.359974,-89.102474,299.823694,
+ -0.692505,-0.558878,0.456171,32.300346,-85.488594,304.160716,
+ -0.692505,-0.558878,0.456171,30.904869,-83.734132,304.191747,
+ -0.936451,-0.335962,0.100943,32.359974,-89.102474,299.823694,
+ -0.936451,-0.335962,0.100943,30.904869,-83.734132,304.191747,
+ -0.936451,-0.335962,0.100943,30.87688,-84.933993,299.938691,
+ 0.5622,-0.364248,0.742465,28.117261,-85.653179,296.262748,
+ 0.5622,-0.364248,0.742465,24.4976,-90.980755,296.389914,
+ 0.5622,-0.364248,0.742465,28.014129,-88.185542,295.098482,
+ 0.456631,-0.29017,0.841005,28.117261,-85.653179,296.262748,
+ 0.456631,-0.29017,0.841005,25.701416,-86.35472,297.332401,
+ 0.456631,-0.29017,0.841005,24.4976,-90.980755,296.389914,
+ -0.887913,-0.417416,0.193323,32.300346,-85.488594,304.160716,
+ -0.887913,-0.417416,0.193323,35.309733,-88.00392,312.551527,
+ -0.887913,-0.417416,0.193323,32.965076,-84.556755,309.225747,
+ -0.762925,-0.610579,0.212457,32.300346,-85.488594,304.160716,
+ -0.762925,-0.610579,0.212457,32.965076,-84.556755,309.225747,
+ -0.762925,-0.610579,0.212457,30.904869,-83.734132,304.191747,
+ 0.965216,-0.223551,-0.135585,24.4976,-90.980755,296.389914,
+ 0.965216,-0.223551,-0.135585,25.701416,-86.35472,297.332401,
+ 0.965216,-0.223551,-0.135585,25.581551,-90.487608,303.293373,
+ 0.921317,-0.327956,-0.208854,25.701416,-86.35472,297.332401,
+ 0.921317,-0.327956,-0.208854,26.794494,-86.496185,302.37644,
+ 0.921317,-0.327956,-0.208854,25.581551,-90.487608,303.293373,
+ 0.946488,-0.309016,-0.093113,26.794494,-86.496185,302.37644,
+ 0.946488,-0.309016,-0.093113,27.554446,-85.720108,307.525741,
+ 0.946488,-0.309016,-0.093113,25.581551,-90.487608,303.293373,
+ 0.8856,-0.460384,-0.061313,26.794494,-86.496185,302.37644,
+ 0.8856,-0.460384,-0.061313,28.502105,-83.727135,306.248912,
+ 0.8856,-0.460384,-0.061313,27.554446,-85.720108,307.525741,
+ 0.295855,-0.611065,-0.734214,28.502105,-83.727135,306.248912,
+ 0.295855,-0.611065,-0.734214,35.309733,-88.00392,312.551527,
+ 0.295855,-0.611065,-0.734214,27.554446,-85.720108,307.525741,
+ 0.434073,-0.454942,-0.777566,28.502105,-83.727135,306.248912,
+ 0.434073,-0.454942,-0.777566,32.965076,-84.556755,309.225747,
+ 0.434073,-0.454942,-0.777566,35.309733,-88.00392,312.551527,
+ -0.104433,-0.987433,-0.118619,32.965076,-84.556755,309.225747,
+ -0.104433,-0.987433,-0.118619,28.502105,-83.727135,306.248912,
+ -0.104433,-0.987433,-0.118619,30.904869,-83.734132,304.191747,
+ 0.365301,-0.825894,0.42948,30.904869,-83.734132,304.191747,
+ 0.365301,-0.825894,0.42948,28.502105,-83.727135,306.248912,
+ 0.365301,-0.825894,0.42948,26.794494,-86.496185,302.37644,
+ 0.467497,-0.851585,0.23717,30.904869,-83.734132,304.191747,
+ 0.467497,-0.851585,0.23717,26.794494,-86.496185,302.37644,
+ 0.467497,-0.851585,0.23717,30.87688,-84.933993,299.938691,
+ 0.306882,-0.947186,-0.093068,30.87688,-84.933993,299.938691,
+ 0.306882,-0.947186,-0.093068,26.794494,-86.496185,302.37644,
+ 0.306882,-0.947186,-0.093068,25.701416,-86.35472,297.332401,
+ 0.272236,-0.962095,-0.016144,28.117261,-85.653179,296.262748,
+ 0.272236,-0.962095,-0.016144,30.87688,-84.933993,299.938691,
+ 0.272236,-0.962095,-0.016144,25.701416,-86.35472,297.332401,
+ 0.272716,-0.961952,-0.016532,30.87688,-84.933993,299.938691,
+ 0.272716,-0.961952,-0.016532,28.117261,-85.653179,296.262748,
+ 0.272716,-0.961952,-0.016532,30.335969,-85.041992,297.299849,
+ 0.817348,-0.550301,0.170622,22.114611,-90.640633,300.531624,
+ 0.817348,-0.550301,0.170622,22.387196,-89.920534,301.548342,
+ 0.817348,-0.550301,0.170622,21.224451,-90.158133,306.352044,
+ 0.833786,-0.523304,0.175936,22.387196,-89.920534,301.548342,
+ 0.833786,-0.523304,0.175936,21.965237,-89.252761,305.534289,
+ 0.833786,-0.523304,0.175936,21.224451,-90.158133,306.352044,
+ 0.80389,-0.590034,0.074975,21.965237,-89.252761,305.534289,
+ 0.80389,-0.590034,0.074975,23.379272,-86.819879,309.519019,
+ 0.80389,-0.590034,0.074975,21.224451,-90.158133,306.352044,
+ 0.799479,-0.59537,0.079798,21.965237,-89.252761,305.534289,
+ 0.799479,-0.59537,0.079798,23.859946,-86.283532,308.704915,
+ 0.799479,-0.59537,0.079798,23.379272,-86.819879,309.519019,
+ 0.470066,-0.838695,-0.275006,26.81944,-84.901137,309.547616,
+ 0.470066,-0.838695,-0.275006,23.379272,-86.819879,309.519019,
+ 0.470066,-0.838695,-0.275006,23.859946,-86.283532,308.704915,
+ 0.472424,-0.64566,-0.599949,26.81944,-84.901137,309.547616,
+ 0.472424,-0.64566,-0.599949,23.859946,-86.283532,308.704915,
+ 0.472424,-0.64566,-0.599949,25.408144,-84.864934,308.397344,
+ -0.699403,-0.5319,0.477407,22.114611,-90.640633,300.531624,
+ -0.699403,-0.5319,0.477407,24.537758,-91.141082,303.523975,
+ -0.699403,-0.5319,0.477407,23.805186,-89.763858,303.985179,
+ -0.787256,-0.383619,0.482767,22.114611,-90.640633,300.531624,
+ -0.787256,-0.383619,0.482767,23.805186,-89.763858,303.985179,
+ -0.787256,-0.383619,0.482767,22.387196,-89.920534,301.548342,
+ -0.299972,-0.353358,0.88609,53.914693,-116.926527,282.255044,
+ -0.299972,-0.353358,0.88609,47.518255,-117.683437,279.787784,
+ -0.299972,-0.353358,0.88609,49.549074,-123.522414,278.146798,
+ -0.436656,-0.249368,0.864377,53.914693,-116.926527,282.255044,
+ -0.436656,-0.249368,0.864377,49.549074,-123.522414,278.146798,
+ -0.436656,-0.249368,0.864377,56.400236,-123.413198,281.639294,
+ -0.026885,-0.80576,0.591632,67.349939,-126.15578,289.764821,
+ -0.026885,-0.80576,0.591632,63.891243,-124.372417,292.036464,
+ -0.026885,-0.80576,0.591632,62.306234,-128.24428,286.691243,
+ -0.017311,-0.81356,0.581223,67.349939,-126.15578,289.764821,
+ -0.017311,-0.81356,0.581223,62.306234,-128.24428,286.691243,
+ -0.017311,-0.81356,0.581223,64.837411,-131.042535,282.849802,
+ -0.85616,-0.366201,0.364536,62.306234,-128.24428,286.691243,
+ -0.85616,-0.366201,0.364536,60.417944,-117.469263,293.080562,
+ -0.85616,-0.366201,0.364536,58.602607,-119.368535,286.909067,
+ -0.719858,-0.443016,0.534361,62.306234,-128.24428,286.691243,
+ -0.719858,-0.443016,0.534361,63.891243,-124.372417,292.036464,
+ -0.719858,-0.443016,0.534361,60.417944,-117.469263,293.080562,
+ 0.130192,-0.75862,0.638393,64.837411,-131.042535,282.849802,
+ 0.130192,-0.75862,0.638393,62.306234,-128.24428,286.691243,
+ 0.130192,-0.75862,0.638393,60.529686,-131.431334,283.266285,
+ 0.131092,-0.692053,0.709844,64.837411,-131.042535,282.849802,
+ 0.131092,-0.692053,0.709844,60.529686,-131.431334,283.266285,
+ 0.131092,-0.692053,0.709844,63.541841,-132.784828,281.390438,
+ -0.782385,-0.291233,0.550506,56.400236,-123.413198,281.639294,
+ -0.782385,-0.291233,0.550506,60.529686,-131.431334,283.266285,
+ -0.782385,-0.291233,0.550506,58.602607,-119.368535,286.909067,
+ -0.697547,-0.306959,0.647459,60.529686,-131.431334,283.266285,
+ -0.697547,-0.306959,0.647459,62.306234,-128.24428,286.691243,
+ -0.697547,-0.306959,0.647459,58.602607,-119.368535,286.909067,
+ 0.070305,-0.751954,0.655456,63.541841,-132.784828,281.390438,
+ 0.070305,-0.751954,0.655456,60.529686,-131.431334,283.266285,
+ 0.070305,-0.751954,0.655456,55.720416,-133.943314,280.900333,
+ 0.036213,-0.586728,0.808974,63.541841,-132.784828,281.390438,
+ 0.036213,-0.586728,0.808974,55.720416,-133.943314,280.900333,
+ 0.036213,-0.586728,0.808974,58.389255,-136.19427,279.148305,
+ -0.45349,-0.033225,0.890642,56.400236,-123.413198,281.639294,
+ -0.45349,-0.033225,0.890642,49.549074,-123.522414,278.146798,
+ -0.45349,-0.033225,0.890642,55.720416,-133.943314,280.900333,
+ -0.425968,-0.03594,0.904024,56.400236,-123.413198,281.639294,
+ -0.425968,-0.03594,0.904024,55.720416,-133.943314,280.900333,
+ -0.425968,-0.03594,0.904024,60.529686,-131.431334,283.266285,
+ 0.183602,-0.696973,0.693195,45.230792,-138.147086,279.701081,
+ 0.183602,-0.696973,0.693195,34.027427,-140.205164,280.599151,
+ 0.183602,-0.696973,0.693195,45.036393,-140.226155,277.662169,
+ 0.139638,-0.357129,0.923558,34.509014,-137.456801,281.589097,
+ 0.139638,-0.357129,0.923558,34.027427,-140.205164,280.599151,
+ 0.139638,-0.357129,0.923558,45.230792,-138.147086,279.701081,
+ 0.13453,-0.635725,0.760102,51.802737,-135.802125,280.164718,
+ 0.13453,-0.635725,0.760102,45.036393,-140.226155,277.662169,
+ 0.13453,-0.635725,0.760102,53.299004,-138.208844,277.886991,
+ 0.199487,-0.695549,0.690229,51.802737,-135.802125,280.164718,
+ 0.199487,-0.695549,0.690229,45.230792,-138.147086,279.701081,
+ 0.199487,-0.695549,0.690229,45.036393,-140.226155,277.662169,
+ 0.033112,-0.589142,0.807351,55.720416,-133.943314,280.900333,
+ 0.033112,-0.589142,0.807351,53.299004,-138.208844,277.886991,
+ 0.033112,-0.589142,0.807351,58.389255,-136.19427,279.148305,
+ 0.154075,-0.626951,0.763671,55.720416,-133.943314,280.900333,
+ 0.154075,-0.626951,0.763671,51.802737,-135.802125,280.164718,
+ 0.154075,-0.626951,0.763671,53.299004,-138.208844,277.886991,
+ 0.894798,0.020098,0.44602,19.244255,-135.240223,291.20654,
+ 0.894798,0.020098,0.44602,16.074846,-141.671525,297.854754,
+ 0.894798,0.020098,0.44602,19.081495,-140.49083,291.769659,
+ 0.942309,-0.160989,0.293491,19.244255,-135.240223,291.20654,
+ 0.942309,-0.160989,0.293491,16.913592,-136.221954,298.151069,
+ 0.942309,-0.160989,0.293491,16.074846,-141.671525,297.854754,
+ 0.674874,-0.479229,0.561147,27.398988,-136.149853,285.473737,
+ 0.674874,-0.479229,0.561147,19.081495,-140.49083,291.769659,
+ 0.674874,-0.479229,0.561147,23.638167,-139.837661,286.84731,
+ 0.578886,0.069191,0.812468,19.244255,-135.240223,291.20654,
+ 0.578886,0.069191,0.812468,19.081495,-140.49083,291.769659,
+ 0.578886,0.069191,0.812468,27.398988,-136.149853,285.473737,
+ 0.468951,-0.370896,0.801574,34.509014,-137.456801,281.589097,
+ 0.468951,-0.370896,0.801574,23.638167,-139.837661,286.84731,
+ 0.468951,-0.370896,0.801574,34.027427,-140.205164,280.599151,
+ 0.455466,-0.136838,0.879674,27.398988,-136.149853,285.473737,
+ 0.455466,-0.136838,0.879674,23.638167,-139.837661,286.84731,
+ 0.455466,-0.136838,0.879674,34.509014,-137.456801,281.589097,
+ -0.009052,-0.273464,0.96184,40.645827,-117.192723,279.862624,
+ -0.009052,-0.273464,0.96184,49.549074,-123.522414,278.146798,
+ -0.009052,-0.273464,0.96184,47.518255,-117.683437,279.787784,
+ 0.091903,-0.138052,0.986152,40.645827,-117.192723,279.862624,
+ 0.091903,-0.138052,0.986152,45.403287,-124.402535,278.409953,
+ 0.091903,-0.138052,0.986152,49.549074,-123.522414,278.146798,
+ 0.150865,-0.098636,0.983621,40.645827,-117.192723,279.862624,
+ 0.150865,-0.098636,0.983621,39.058993,-122.022588,279.621678,
+ 0.150865,-0.098636,0.983621,45.403287,-124.402535,278.409953,
+ 0.370743,-0.167379,0.913528,33.268692,-111.68535,283.865607,
+ 0.370743,-0.167379,0.913528,39.058993,-122.022588,279.621678,
+ 0.370743,-0.167379,0.913528,40.645827,-117.192723,279.862624,
+ 0.381398,-0.160141,0.910434,33.268692,-111.68535,283.865607,
+ 0.381398,-0.160141,0.910434,33.960194,-121.239211,281.895451,
+ 0.381398,-0.160141,0.910434,39.058993,-122.022588,279.621678,
+ 0.242337,0.181361,0.95309,35.166139,-131.432551,280.982473,
+ 0.242337,0.181361,0.95309,45.230792,-138.147086,279.701081,
+ 0.242337,0.181361,0.95309,41.901361,-132.091501,279.395335,
+ 0.17783,0.079371,0.980855,35.166139,-131.432551,280.982473,
+ 0.17783,0.079371,0.980855,34.509014,-137.456801,281.589097,
+ 0.17783,0.079371,0.980855,45.230792,-138.147086,279.701081,
+ 0.417809,0.097639,0.903273,33.960194,-121.239211,281.895451,
+ 0.417809,0.097639,0.903273,41.901361,-132.091501,279.395335,
+ 0.417809,0.097639,0.903273,39.058993,-122.022588,279.621678,
+ 0.223311,-0.060715,0.972855,33.960194,-121.239211,281.895451,
+ 0.223311,-0.060715,0.972855,35.166139,-131.432551,280.982473,
+ 0.223311,-0.060715,0.972855,41.901361,-132.091501,279.395335,
+ 0.443414,-0.027782,0.895886,33.960194,-121.239211,281.895451,
+ 0.443414,-0.027782,0.895886,27.704429,-122.86316,284.941345,
+ 0.443414,-0.027782,0.895886,35.166139,-131.432551,280.982473,
+ 0.531341,0.072736,0.84403,27.704429,-122.86316,284.941345,
+ 0.531341,0.072736,0.84403,27.528891,-131.973766,285.836981,
+ 0.531341,0.072736,0.84403,35.166139,-131.432551,280.982473,
+ 0.534899,0.026691,0.844494,35.166139,-131.432551,280.982473,
+ 0.534899,0.026691,0.844494,27.528891,-131.973766,285.836981,
+ 0.534899,0.026691,0.844494,34.509014,-137.456801,281.589097,
+ 0.464529,-0.091069,0.880863,27.528891,-131.973766,285.836981,
+ 0.464529,-0.091069,0.880863,27.398988,-136.149853,285.473737,
+ 0.464529,-0.091069,0.880863,34.509014,-137.456801,281.589097,
+ 0.471668,-0.145214,0.869737,33.268692,-111.68535,283.865607,
+ 0.471668,-0.145214,0.869737,27.607381,-116.500917,286.131774,
+ 0.471668,-0.145214,0.869737,33.960194,-121.239211,281.895451,
+ 0.464842,-0.155983,0.871545,27.607381,-116.500917,286.131774,
+ 0.464842,-0.155983,0.871545,27.704429,-122.86316,284.941345,
+ 0.464842,-0.155983,0.871545,33.960194,-121.239211,281.895451,
+ 0.679074,-0.124987,0.723351,22.63088,-116.42121,290.817437,
+ 0.679074,-0.124987,0.723351,27.704429,-122.86316,284.941345,
+ 0.679074,-0.124987,0.723351,27.607381,-116.500917,286.131774,
+ 0.710112,-0.078925,0.699652,27.704429,-122.86316,284.941345,
+ 0.710112,-0.078925,0.699652,22.63088,-116.42121,290.817437,
+ 0.710112,-0.078925,0.699652,21.694477,-122.386745,291.09489,
+ 0.509796,-0.090275,0.855546,19.007872,-129.822292,291.141436,
+ 0.509796,-0.090275,0.855546,27.398988,-136.149853,285.473737,
+ 0.509796,-0.090275,0.855546,27.528891,-131.973766,285.836981,
+ 0.577367,0.034993,0.815734,19.007872,-129.822292,291.141436,
+ 0.577367,0.034993,0.815734,19.244255,-135.240223,291.20654,
+ 0.577367,0.034993,0.815734,27.398988,-136.149853,285.473737,
+ 0.716447,0.054569,0.695504,27.704429,-122.86316,284.941345,
+ 0.716447,0.054569,0.695504,21.694477,-122.386745,291.09489,
+ 0.716447,0.054569,0.695504,27.528891,-131.973766,285.836981,
+ 0.489115,-0.171373,0.855218,21.694477,-122.386745,291.09489,
+ 0.489115,-0.171373,0.855218,19.007872,-129.822292,291.141436,
+ 0.489115,-0.171373,0.855218,27.528891,-131.973766,285.836981,
+ -0.144097,0.249936,-0.95748,23.87029,-131.422816,227.717966,
+ -0.144097,0.249936,-0.95748,29.307387,-131.873068,226.782172,
+ -0.144097,0.249936,-0.95748,26.720872,-136.732443,225.902964,
+ -0.299137,0.160911,-0.940545,23.87029,-131.422816,227.717966,
+ -0.299137,0.160911,-0.940545,26.720872,-136.732443,225.902964,
+ -0.299137,0.160911,-0.940545,22.34065,-134.739469,227.637043,
+ -0.26854,0.224789,-0.936673,22.34065,-134.739469,227.637043,
+ -0.26854,0.224789,-0.936673,26.720872,-136.732443,225.902964,
+ -0.26854,0.224789,-0.936673,24.913475,-143.423553,224.815362,
+ 0.255549,0.366413,-0.894671,22.34065,-134.739469,227.637043,
+ 0.255549,0.366413,-0.894671,24.913475,-143.423553,224.815362,
+ 0.255549,0.366413,-0.894671,20.074787,-139.683419,224.96504,
+ -0.253259,0.093192,-0.962899,26.720872,-136.732443,225.902964,
+ -0.253259,0.093192,-0.962899,33.3125,-139.106305,223.9395,
+ -0.253259,0.093192,-0.962899,28.652088,-147.307889,224.371499,
+ 0.038691,0.150128,-0.987909,26.720872,-136.732443,225.902964,
+ 0.038691,0.150128,-0.987909,28.652088,-147.307889,224.371499,
+ 0.038691,0.150128,-0.987909,24.913475,-143.423553,224.815362,
+ 0.839049,-0.442371,-0.31671,33.3125,-139.106305,223.9395,
+ 0.839049,-0.442371,-0.31671,34.485285,-139.175364,227.142982,
+ 0.839049,-0.442371,-0.31671,29.461629,-148.313046,226.597204,
+ 0.752527,-0.452799,-0.478201,33.3125,-139.106305,223.9395,
+ 0.752527,-0.452799,-0.478201,29.461629,-148.313046,226.597204,
+ 0.752527,-0.452799,-0.478201,28.652088,-147.307889,224.371499,
+ 0.5927,-0.630999,-0.500546,29.461629,-148.313046,226.597204,
+ 0.5927,-0.630999,-0.500546,22.299884,-155.030927,226.585643,
+ 0.5927,-0.630999,-0.500546,28.652088,-147.307889,224.371499,
+ 0.73474,-0.654956,-0.176606,22.072628,-154.3808,223.229136,
+ 0.73474,-0.654956,-0.176606,28.652088,-147.307889,224.371499,
+ 0.73474,-0.654956,-0.176606,22.299884,-155.030927,226.585643,
+ 0.024717,0.136948,-0.99027,24.913475,-143.423553,224.815362,
+ 0.024717,0.136948,-0.99027,28.652088,-147.307889,224.371499,
+ 0.024717,0.136948,-0.99027,22.072628,-154.3808,223.229136,
+ 0.10269,0.116387,-0.987881,24.913475,-143.423553,224.815362,
+ 0.10269,0.116387,-0.987881,22.072628,-154.3808,223.229136,
+ 0.10269,0.116387,-0.987881,19.471814,-148.460595,223.656267,
+ 0.079011,0.141707,-0.98675,20.074787,-139.683419,224.96504,
+ 0.079011,0.141707,-0.98675,24.913475,-143.423553,224.815362,
+ 0.079011,0.141707,-0.98675,19.471814,-148.460595,223.656267,
+ 0.178507,0.133104,-0.974894,20.074787,-139.683419,224.96504,
+ 0.178507,0.133104,-0.974894,19.471814,-148.460595,223.656267,
+ 0.178507,0.133104,-0.974894,16.425008,-143.420815,223.786475,
+ -0.035649,0.004268,-0.999355,16.425008,-143.420815,223.786475,
+ -0.035649,0.004268,-0.999355,19.471814,-148.460595,223.656267,
+ -0.035649,0.004268,-0.999355,9.635329,-151.692978,223.993348,
+ 0.021085,-0.042287,-0.998883,16.425008,-143.420815,223.786475,
+ 0.021085,-0.042287,-0.998883,9.635329,-151.692978,223.993348,
+ 0.021085,-0.042287,-0.998883,9.015016,-146.030451,223.740537,
+ -0.058587,0.046209,-0.997212,19.471814,-148.460595,223.656267,
+ -0.058587,0.046209,-0.997212,22.072628,-154.3808,223.229136,
+ -0.058587,0.046209,-0.997212,13.11018,-157.957565,223.589946,
+ -0.046798,0.038318,-0.998169,19.471814,-148.460595,223.656267,
+ -0.046798,0.038318,-0.998169,13.11018,-157.957565,223.589946,
+ -0.046798,0.038318,-0.998169,9.635329,-151.692978,223.993348,
+ 0.441492,-0.874842,-0.199341,22.299884,-155.030927,226.585643,
+ 0.441492,-0.874842,-0.199341,12.612773,-159.843452,226.251605,
+ 0.441492,-0.874842,-0.199341,22.072628,-154.3808,223.229136,
+ 0.300146,-0.803888,-0.513494,22.072628,-154.3808,223.229136,
+ 0.300146,-0.803888,-0.513494,12.612773,-159.843452,226.251605,
+ 0.300146,-0.803888,-0.513494,13.11018,-157.957565,223.589946,
+ 0.145823,-0.819875,-0.553661,13.11018,-157.957565,223.589946,
+ 0.145823,-0.819875,-0.553661,12.612773,-159.843452,226.251605,
+ 0.145823,-0.819875,-0.553661,6.940206,-160.600088,225.878018,
+ -0.091097,-0.521747,-0.848222,13.11018,-157.957565,223.589946,
+ -0.091097,-0.521747,-0.848222,6.940206,-160.600088,225.878018,
+ -0.091097,-0.521747,-0.848222,7.106008,-158.263919,224.423217,
+ -0.136847,-0.012123,-0.990518,9.635329,-151.692978,223.993348,
+ -0.136847,-0.012123,-0.990518,13.11018,-157.957565,223.589946,
+ -0.136847,-0.012123,-0.990518,7.106008,-158.263919,224.423217,
+ -0.121919,-0.017991,-0.992377,5.321124,-151.538432,224.520569,
+ -0.121919,-0.017991,-0.992377,9.635329,-151.692978,223.993348,
+ -0.121919,-0.017991,-0.992377,7.106008,-158.263919,224.423217,
+ -0.123138,-0.057721,-0.990709,9.015016,-146.030451,223.740537,
+ -0.123138,-0.057721,-0.990709,9.635329,-151.692978,223.993348,
+ -0.123138,-0.057721,-0.990709,5.321124,-151.538432,224.520569,
+ 0.025125,-0.156674,-0.987331,9.015016,-146.030451,223.740537,
+ 0.025125,-0.156674,-0.987331,5.321124,-151.538432,224.520569,
+ 0.025125,-0.156674,-0.987331,4.799684,-146.58566,223.721371,
+ 0.060372,-0.478394,-0.876067,0.020624,-157.713882,224.673593,
+ 0.060372,-0.478394,-0.876067,2.091175,-158.020844,224.983902,
+ 0.060372,-0.478394,-0.876067,0.020624,-160.183575,226.02222,
+ 0.113617,-0.516298,-0.848839,2.091175,-158.020844,224.983902,
+ 0.113617,-0.516298,-0.848839,1.782691,-160.210955,226.274726,
+ 0.113617,-0.516298,-0.848839,0.020624,-160.183575,226.02222,
+ -0.114368,-0.492421,-0.86281,4.684079,-157.884247,224.562247,
+ -0.114368,-0.492421,-0.86281,1.782691,-160.210955,226.274726,
+ -0.114368,-0.492421,-0.86281,2.091175,-158.020844,224.983902,
+ -0.117564,-0.489388,-0.864105,4.684079,-157.884247,224.562247,
+ -0.117564,-0.489388,-0.864105,4.38533,-160.403225,226.029521,
+ -0.117564,-0.489388,-0.864105,1.782691,-160.210955,226.274726,
+ -0.090508,-0.521806,-0.848249,7.106008,-158.263919,224.423217,
+ -0.090508,-0.521806,-0.848249,6.940206,-160.600088,225.878018,
+ -0.090508,-0.521806,-0.848249,4.38533,-160.403225,226.029521,
+ -0.126093,-0.4881,-0.863631,4.684079,-157.884247,224.562247,
+ -0.126093,-0.4881,-0.863631,7.106008,-158.263919,224.423217,
+ -0.126093,-0.4881,-0.863631,4.38533,-160.403225,226.029521,
+ 0.138946,-0.06191,-0.988363,0.020624,-152.099422,224.32191,
+ 0.138946,-0.06191,-0.988363,2.091175,-158.020844,224.983902,
+ 0.138946,-0.06191,-0.988363,0.020624,-157.713882,224.673593,
+ 0.031939,-0.10001,-0.994474,0.020624,-152.099422,224.32191,
+ 0.031939,-0.10001,-0.994474,1.139561,-152.247275,224.372716,
+ 0.031939,-0.10001,-0.994474,2.091175,-158.020844,224.983902,
+ -0.152554,-0.128871,-0.979857,1.139561,-152.247275,224.372716,
+ -0.152554,-0.128871,-0.979857,4.684079,-157.884247,224.562247,
+ -0.152554,-0.128871,-0.979857,2.091175,-158.020844,224.983902,
+ 0.033257,-0.01269,-0.999366,1.139561,-152.247275,224.372716,
+ 0.033257,-0.01269,-0.999366,3.146529,-152.330328,224.440558,
+ 0.033257,-0.01269,-0.999366,4.684079,-157.884247,224.562247,
+ -0.063422,-0.039407,-0.997208,3.146529,-152.330328,224.440558,
+ -0.063422,-0.039407,-0.997208,7.106008,-158.263919,224.423217,
+ -0.063422,-0.039407,-0.997208,4.684079,-157.884247,224.562247,
+ 0.028725,0.022089,-0.999343,5.321124,-151.538432,224.520569,
+ 0.028725,0.022089,-0.999343,7.106008,-158.263919,224.423217,
+ 0.028725,0.022089,-0.999343,3.146529,-152.330328,224.440558,
+ 0.060774,-0.152769,-0.986391,4.799684,-146.58566,223.721371,
+ 0.060774,-0.152769,-0.986391,5.321124,-151.538432,224.520569,
+ 0.060774,-0.152769,-0.986391,1.139561,-152.247275,224.372716,
+ 0.034088,0.007369,-0.999392,5.321124,-151.538432,224.520569,
+ 0.034088,0.007369,-0.999392,3.146529,-152.330328,224.440558,
+ 0.034088,0.007369,-0.999392,1.139561,-152.247275,224.372716,
+ 0.032702,-0.094413,-0.994996,0.020624,-146.767586,223.815985,
+ 0.032702,-0.094413,-0.994996,1.139561,-152.247275,224.372716,
+ 0.032702,-0.094413,-0.994996,0.020624,-152.099422,224.32191,
+ -0.015719,-0.104243,-0.994428,4.799684,-146.58566,223.721371,
+ -0.015719,-0.104243,-0.994428,1.139561,-152.247275,224.372716,
+ -0.015719,-0.104243,-0.994428,0.020624,-146.767586,223.815985,
+ -0.066625,0.534916,-0.842274,4.856269,-139.939271,227.93792,
+ -0.066625,0.534916,-0.842274,9.015016,-146.030451,223.740537,
+ -0.066625,0.534916,-0.842274,4.799684,-146.58566,223.721371,
+ 0.011123,0.572522,-0.819814,4.856269,-139.939271,227.93792,
+ 0.011123,0.572522,-0.819814,8.242286,-140.121806,227.856388,
+ 0.011123,0.572522,-0.819814,9.015016,-146.030451,223.740537,
+ -0.038182,0.579723,-0.813919,0.020624,-140.348757,228.387868,
+ -0.038182,0.579723,-0.813919,4.799684,-146.58566,223.721371,
+ -0.038182,0.579723,-0.813919,0.020624,-146.767586,223.815985,
+ -0.123012,0.53238,-0.83752,4.856269,-139.939271,227.93792,
+ -0.123012,0.53238,-0.83752,4.799684,-146.58566,223.721371,
+ -0.123012,0.53238,-0.83752,0.020624,-140.348757,228.387868,
+ -0.756722,-0.279858,0.590805,24.537758,-91.141082,303.523975,
+ -0.756722,-0.279858,0.590805,26.259363,-86.501661,307.926709,
+ -0.756722,-0.279858,0.590805,25.557214,-86.249155,307.146982,
+ -0.421237,-0.481456,0.768609,25.557214,-86.249155,307.146982,
+ -0.421237,-0.481456,0.768609,23.805186,-89.763858,303.985179,
+ -0.421237,-0.481456,0.768609,24.537758,-91.141082,303.523975,
+ -0.560105,-0.484515,0.671957,25.408144,-84.864934,308.397344,
+ -0.560105,-0.484515,0.671957,26.259363,-86.501661,307.926709,
+ -0.560105,-0.484515,0.671957,26.81944,-84.901137,309.547616,
+ -0.714943,-0.509504,0.478813,25.557214,-86.249155,307.146982,
+ -0.714943,-0.509504,0.478813,26.259363,-86.501661,307.926709,
+ -0.714943,-0.509504,0.478813,25.408144,-84.864934,308.397344,
+ -0.7379,-0.494433,0.459391,23.763507,-84.847289,305.774626,
+ -0.7379,-0.494433,0.459391,25.557214,-86.249155,307.146982,
+ -0.7379,-0.494433,0.459391,25.408144,-84.864934,308.397344,
+ -0.703528,-0.248317,0.665873,23.805186,-89.763858,303.985179,
+ -0.703528,-0.248317,0.665873,25.557214,-86.249155,307.146982,
+ -0.703528,-0.248317,0.665873,23.763507,-84.847289,305.774626,
+ -0.689426,-0.252894,0.678776,23.805186,-89.763858,303.985179,
+ -0.689426,-0.252894,0.678776,23.763507,-84.847289,305.774626,
+ -0.689426,-0.252894,0.678776,22.812502,-86.278664,304.275409,
+ -0.822991,-0.275768,0.496627,22.387196,-89.920534,301.548342,
+ -0.822991,-0.275768,0.496627,23.805186,-89.763858,303.985179,
+ -0.822991,-0.275768,0.496627,22.812502,-86.278664,304.275409,
+ 0.585771,-0.719976,-0.372165,25.408144,-84.864934,308.397344,
+ 0.585771,-0.719976,-0.372165,23.859946,-86.283532,308.704915,
+ 0.585771,-0.719976,-0.372165,23.763507,-84.847289,305.774626,
+ 0.911179,-0.350944,-0.215852,22.812502,-86.278664,304.275409,
+ 0.911179,-0.350944,-0.215852,23.859946,-86.283532,308.704915,
+ 0.911179,-0.350944,-0.215852,21.965237,-89.252761,305.534289,
+ 0.901892,-0.375406,-0.213683,22.812502,-86.278664,304.275409,
+ 0.901892,-0.375406,-0.213683,23.763507,-84.847289,305.774626,
+ 0.901892,-0.375406,-0.213683,23.859946,-86.283532,308.704915,
+ 0.966365,-0.216635,0.138594,22.387196,-89.920534,301.548342,
+ 0.966365,-0.216635,0.138594,22.812502,-86.278664,304.275409,
+ 0.966365,-0.216635,0.138594,21.965237,-89.252761,305.534289,
+ -0.382681,0.144382,-0.912529,29.10812,-105.977493,233.233857,
+ -0.382681,0.144382,-0.912529,30.22584,-113.401784,231.590438,
+ -0.382681,0.144382,-0.912529,24.645453,-107.017028,234.94086,
+ -0.104204,0.3892,-0.91524,24.645453,-107.017028,234.94086,
+ -0.104204,0.3892,-0.91524,30.22584,-113.401784,231.590438,
+ -0.104204,0.3892,-0.91524,25.618058,-114.315674,231.726426,
+ 0.008364,0.540771,-0.841128,35.960468,-104.244632,234.416073,
+ 0.008364,0.540771,-0.841128,38.279875,-110.710311,230.282273,
+ 0.008364,0.540771,-0.841128,29.10812,-105.977493,233.233857,
+ -0.215997,0.179913,-0.959675,29.10812,-105.977493,233.233857,
+ -0.215997,0.179913,-0.959675,38.279875,-110.710311,230.282273,
+ -0.215997,0.179913,-0.959675,30.22584,-113.401784,231.590438,
+ 0.473894,0.499415,-0.725265,37.306965,-103.823585,235.585816,
+ 0.473894,0.499415,-0.725265,39.820467,-110.835652,232.399674,
+ 0.473894,0.499415,-0.725265,35.960468,-104.244632,234.416073,
+ 0.691149,0.548675,-0.470391,38.279875,-110.710311,230.282273,
+ 0.691149,0.548675,-0.470391,35.960468,-104.244632,234.416073,
+ 0.691149,0.548675,-0.470391,39.820467,-110.835652,232.399674,
+ 0.803036,0.156505,-0.575013,38.279875,-110.710311,230.282273,
+ 0.803036,0.156505,-0.575013,39.820467,-110.835652,232.399674,
+ 0.803036,0.156505,-0.575013,40.230865,-117.440362,231.175171,
+ 0.901501,0.211223,-0.377731,38.605395,-116.562979,227.786417,
+ 0.901501,0.211223,-0.377731,38.279875,-110.710311,230.282273,
+ 0.901501,0.211223,-0.377731,40.230865,-117.440362,231.175171,
+ -0.266958,0.365431,-0.891736,38.279875,-110.710311,230.282273,
+ -0.266958,0.365431,-0.891736,38.605395,-116.562979,227.786417,
+ -0.266958,0.365431,-0.891736,30.22584,-113.401784,231.590438,
+ -0.34755,0.184906,-0.919249,30.22584,-113.401784,231.590438,
+ -0.34755,0.184906,-0.919249,38.605395,-116.562979,227.786417,
+ -0.34755,0.184906,-0.919249,30.845241,-118.440043,230.342814,
+ -0.074459,0.231068,-0.970084,30.22584,-113.401784,231.590438,
+ -0.074459,0.231068,-0.970084,30.845241,-118.440043,230.342814,
+ -0.074459,0.231068,-0.970084,25.618058,-114.315674,231.726426,
+ 0.127908,0.45734,-0.880045,25.618058,-114.315674,231.726426,
+ 0.127908,0.45734,-0.880045,30.845241,-118.440043,230.342814,
+ 0.127908,0.45734,-0.880045,25.53105,-118.890903,229.336135,
+ 0.150337,0.318065,-0.936073,30.845241,-118.440043,230.342814,
+ 0.150337,0.318065,-0.936073,30.80843,-123.605772,228.581659,
+ 0.150337,0.318065,-0.936073,25.53105,-118.890903,229.336135,
+ 0.005937,0.164484,-0.986362,25.53105,-118.890903,229.336135,
+ 0.005937,0.164484,-0.986362,30.80843,-123.605772,228.581659,
+ 0.005937,0.164484,-0.986362,25.608932,-123.461874,228.574358,
+ -0.358778,0.263869,-0.89535,38.605395,-116.562979,227.786417,
+ -0.358778,0.263869,-0.89535,37.935493,-122.097428,226.423796,
+ -0.358778,0.263869,-0.89535,30.845241,-118.440043,230.342814,
+ -0.334638,0.306223,-0.891204,30.845241,-118.440043,230.342814,
+ -0.334638,0.306223,-0.891204,37.935493,-122.097428,226.423796,
+ -0.334638,0.306223,-0.891204,30.80843,-123.605772,228.581659,
+ 0.904227,0.029795,-0.426013,38.605395,-116.562979,227.786417,
+ 0.904227,0.029795,-0.426013,40.230865,-117.440362,231.175171,
+ 0.904227,0.029795,-0.426013,39.761447,-122.342328,229.835976,
+ 0.881934,0.009282,-0.471282,37.935493,-122.097428,226.423796,
+ 0.881934,0.009282,-0.471282,38.605395,-116.562979,227.786417,
+ 0.881934,0.009282,-0.471282,39.761447,-122.342328,229.835976,
+ 0.880172,-0.033936,-0.473441,37.935493,-122.097428,226.423796,
+ 0.880172,-0.033936,-0.473441,39.761447,-122.342328,229.835976,
+ 0.880172,-0.033936,-0.473441,38.964075,-128.558848,228.79918,
+ 0.912189,-0.005419,-0.409734,37.233343,-127.578637,224.933097,
+ 0.912189,-0.005419,-0.409734,37.935493,-122.097428,226.423796,
+ 0.912189,-0.005419,-0.409734,38.964075,-128.558848,228.79918,
+ -0.332709,0.286932,-0.898318,37.935493,-122.097428,226.423796,
+ -0.332709,0.286932,-0.898318,37.233343,-127.578637,224.933097,
+ -0.332709,0.286932,-0.898318,30.80843,-123.605772,228.581659,
+ -0.336662,0.280929,-0.898742,30.80843,-123.605772,228.581659,
+ -0.336662,0.280929,-0.898742,37.233343,-127.578637,224.933097,
+ -0.336662,0.280929,-0.898742,31.139121,-127.405229,227.270148,
+ 0.010379,0.327081,-0.944939,25.608932,-123.461874,228.574358,
+ 0.010379,0.327081,-0.944939,30.80843,-123.605772,228.581659,
+ 0.010379,0.327081,-0.944939,31.139121,-127.405229,227.270148,
+ -0.150898,0.113179,-0.982049,25.608932,-123.461874,228.574358,
+ -0.150898,0.113179,-0.982049,31.139121,-127.405229,227.270148,
+ -0.150898,0.113179,-0.982049,25.094488,-127.674468,228.167914,
+ -0.152154,0.168744,-0.973845,31.139121,-127.405229,227.270148,
+ -0.152154,0.168744,-0.973845,29.307387,-131.873068,226.782172,
+ -0.152154,0.168744,-0.973845,25.094488,-127.674468,228.167914,
+ -0.153776,0.167125,-0.97387,25.094488,-127.674468,228.167914,
+ -0.153776,0.167125,-0.97387,29.307387,-131.873068,226.782172,
+ -0.153776,0.167125,-0.97387,23.87029,-131.422816,227.717966,
+ -0.347338,0.184445,-0.919422,31.139121,-127.405229,227.270148,
+ -0.347338,0.184445,-0.919422,37.233343,-127.578637,224.933097,
+ -0.347338,0.184445,-0.919422,35.164922,-132.623285,224.702495,
+ -0.300397,0.224409,-0.92704,31.139121,-127.405229,227.270148,
+ -0.300397,0.224409,-0.92704,35.164922,-132.623285,224.702495,
+ -0.300397,0.224409,-0.92704,29.307387,-131.873068,226.782172,
+ 0.846205,-0.284047,-0.450839,37.233343,-127.578637,224.933097,
+ 0.846205,-0.284047,-0.450839,38.964075,-128.558848,228.79918,
+ 0.846205,-0.284047,-0.450839,36.946764,-133.649738,228.220241,
+ 0.80909,-0.308891,-0.49996,35.164922,-132.623285,224.702495,
+ 0.80909,-0.308891,-0.49996,37.233343,-127.578637,224.933097,
+ 0.80909,-0.308891,-0.49996,36.946764,-133.649738,228.220241,
+ 0.824694,-0.270543,-0.496675,35.164922,-132.623285,224.702495,
+ 0.824694,-0.270543,-0.496675,36.946764,-133.649738,228.220241,
+ 0.824694,-0.270543,-0.496675,34.485285,-139.175364,227.142982,
+ 0.914222,-0.221273,-0.339464,33.3125,-139.106305,223.9395,
+ 0.914222,-0.221273,-0.339464,35.164922,-132.623285,224.702495,
+ 0.914222,-0.221273,-0.339464,34.485285,-139.175364,227.142982,
+ -0.305532,0.196941,-0.931592,29.307387,-131.873068,226.782172,
+ -0.305532,0.196941,-0.931592,35.164922,-132.623285,224.702495,
+ -0.305532,0.196941,-0.931592,33.3125,-139.106305,223.9395,
+ -0.184581,0.269265,-0.945212,29.307387,-131.873068,226.782172,
+ -0.184581,0.269265,-0.945212,33.3125,-139.106305,223.9395,
+ -0.184581,0.269265,-0.945212,26.720872,-136.732443,225.902964,
+ 0.653237,0.441628,0.615017,40.286234,-104.226378,279.801779,
+ 0.653237,0.441628,0.615017,35.324335,-100.267811,282.229489,
+ 0.653237,0.441628,0.615017,35.093733,-102.060301,283.761563,
+ 0.622256,0.621447,0.476027,40.286234,-104.226378,279.801779,
+ 0.622256,0.621447,0.476027,35.093733,-102.060301,283.761563,
+ 0.622256,0.621447,0.476027,40.585895,-106.088231,281.84069,
+ 0.299263,-0.046442,0.95304,35.093733,-102.060301,283.761563,
+ 0.299263,-0.046442,0.95304,33.268692,-111.68535,283.865607,
+ 0.299263,-0.046442,0.95304,40.585895,-106.088231,281.84069,
+ 0.375441,-0.160578,0.91283,40.585895,-106.088231,281.84069,
+ 0.375441,-0.160578,0.91283,33.268692,-111.68535,283.865607,
+ 0.375441,-0.160578,0.91283,40.645827,-117.192723,279.862624,
+ 0.773249,-0.556098,-0.304697,27.357309,-92.166926,288.295418,
+ 0.773249,-0.556098,-0.304697,28.928323,-90.852069,289.882556,
+ 0.773249,-0.556098,-0.304697,25.92928,-95.778981,291.263734,
+ 0.588103,0.361891,0.723305,27.357309,-92.166926,288.295418,
+ 0.588103,0.361891,0.723305,25.92928,-95.778981,291.263734,
+ 0.588103,0.361891,0.723305,30.577828,-97.007743,288.098889,
+ 0.803221,0.522777,0.285552,30.756711,-95.433078,284.712872,
+ 0.803221,0.522777,0.285552,27.357309,-92.166926,288.295418,
+ 0.803221,0.522777,0.285552,30.577828,-97.007743,288.098889,
+ 0.703752,0.629252,0.329812,30.756711,-95.433078,284.712872,
+ 0.703752,0.629252,0.329812,30.577828,-97.007743,288.098889,
+ 0.703752,0.629252,0.329812,33.017098,-98.752774,286.223346,
+ 0.762059,0.613335,0.207575,35.324335,-100.267811,282.229489,
+ 0.762059,0.613335,0.207575,30.756711,-95.433078,284.712872,
+ 0.762059,0.613335,0.207575,33.017098,-98.752774,286.223346,
+ 0.877109,0.241838,0.414964,35.324335,-100.267811,282.229489,
+ 0.877109,0.241838,0.414964,33.017098,-98.752774,286.223346,
+ 0.877109,0.241838,0.414964,35.093733,-102.060301,283.761563,
+ 0.561959,-0.237015,0.792481,33.017098,-98.752774,286.223346,
+ 0.561959,-0.237015,0.792481,27.090504,-105.778835,288.324623,
+ 0.561959,-0.237015,0.792481,35.093733,-102.060301,283.761563,
+ 0.524619,-0.090324,0.846532,35.093733,-102.060301,283.761563,
+ 0.524619,-0.090324,0.846532,27.090504,-105.778835,288.324623,
+ 0.524619,-0.090324,0.846532,33.268692,-111.68535,283.865607,
+ 0.546278,-0.12634,0.828021,30.577828,-97.007743,288.098889,
+ 0.546278,-0.12634,0.828021,24.988923,-102.927645,290.882846,
+ 0.546278,-0.12634,0.828021,33.017098,-98.752774,286.223346,
+ 0.58255,-0.261203,0.769681,33.017098,-98.752774,286.223346,
+ 0.58255,-0.261203,0.769681,24.988923,-102.927645,290.882846,
+ 0.58255,-0.261203,0.769681,27.090504,-105.778835,288.324623,
+ 0.574025,0.498559,0.649564,25.92928,-95.778981,291.263734,
+ 0.574025,0.498559,0.649564,20.393614,-96.799654,296.939039,
+ 0.574025,0.498559,0.649564,30.577828,-97.007743,288.098889,
+ 0.631547,-0.2513,0.733483,20.393614,-96.799654,296.939039,
+ 0.631547,-0.2513,0.733483,24.988923,-102.927645,290.882846,
+ 0.631547,-0.2513,0.733483,30.577828,-97.007743,288.098889,
+ -0.822941,-0.568081,-0.007228,60.417944,-117.469263,293.080562,
+ -0.822941,-0.568081,-0.007228,55.152369,-109.955835,302.076475,
+ -0.822941,-0.568081,-0.007228,57.043092,-112.607758,295.235687,
+ -0.677509,-0.709025,0.195614,61.723523,-116.257233,301.995552,
+ -0.677509,-0.709025,0.195614,55.152369,-109.955835,302.076475,
+ -0.677509,-0.709025,0.195614,60.417944,-117.469263,293.080562,
+ -0.813143,-0.567048,-0.131356,62.293031,-115.076843,308.449671,
+ -0.813143,-0.567048,-0.131356,56.551801,-108.104021,313.889202,
+ -0.813143,-0.567048,-0.131356,55.773017,-106.07089,309.933373,
+ -0.821528,-0.544521,-0.169084,62.293031,-115.076843,308.449671,
+ -0.821528,-0.544521,-0.169084,62.124338,-116.245673,313.033419,
+ -0.821528,-0.544521,-0.169084,56.551801,-108.104021,313.889202,
+ -0.790137,-0.50417,-0.348564,62.124338,-116.245673,313.033419,
+ -0.790137,-0.50417,-0.348564,57.786586,-113.298652,318.603766,
+ -0.790137,-0.50417,-0.348564,56.551801,-108.104021,313.889202,
+ -0.793618,-0.492244,-0.357584,62.124338,-116.245673,313.033419,
+ -0.793618,-0.492244,-0.357584,60.93473,-117.979751,318.060725,
+ -0.793618,-0.492244,-0.357584,57.786586,-113.298652,318.603766,
+ -0.637363,-0.669546,0.381414,61.723523,-116.257233,301.995552,
+ -0.637363,-0.669546,0.381414,55.773017,-106.07089,309.933373,
+ -0.637363,-0.669546,0.381414,55.152369,-109.955835,302.076475,
+ -0.782886,-0.596127,0.178107,61.723523,-116.257233,301.995552,
+ -0.782886,-0.596127,0.178107,62.293031,-115.076843,308.449671,
+ -0.782886,-0.596127,0.178107,55.773017,-106.07089,309.933373,
+ -0.843037,-0.510995,0.167845,64.854052,-122.58662,298.449817,
+ -0.843037,-0.510995,0.167845,62.293031,-115.076843,308.449671,
+ -0.843037,-0.510995,0.167845,61.723523,-116.257233,301.995552,
+ -0.922188,-0.383277,0.051659,64.854052,-122.58662,298.449817,
+ -0.922188,-0.383277,0.051659,65.004491,-121.833969,306.719547,
+ -0.922188,-0.383277,0.051659,62.293031,-115.076843,308.449671,
+ -0.893376,-0.315259,-0.320142,65.160771,-122.761549,310.976558,
+ -0.893376,-0.315259,-0.320142,60.93473,-117.979751,318.060725,
+ -0.893376,-0.315259,-0.320142,62.124338,-116.245673,313.033419,
+ -0.882034,-0.096154,-0.461271,65.160771,-122.761549,310.976558,
+ -0.882034,-0.096154,-0.461271,62.996032,-126.557052,315.907121,
+ -0.882034,-0.096154,-0.461271,60.93473,-117.979751,318.060725,
+ -0.93155,-0.342657,-0.121659,65.004491,-121.833969,306.719547,
+ -0.93155,-0.342657,-0.121659,62.124338,-116.245673,313.033419,
+ -0.93155,-0.342657,-0.121659,62.293031,-115.076843,308.449671,
+ -0.911595,-0.407353,-0.055294,65.004491,-121.833969,306.719547,
+ -0.911595,-0.407353,-0.055294,65.160771,-122.761549,310.976558,
+ -0.911595,-0.407353,-0.055294,62.124338,-116.245673,313.033419,
+ -0.865237,-0.464048,0.189801,63.891243,-124.372417,292.036464,
+ -0.865237,-0.464048,0.189801,61.723523,-116.257233,301.995552,
+ -0.865237,-0.464048,0.189801,60.417944,-117.469263,293.080562,
+ -0.793941,-0.544372,0.270771,63.891243,-124.372417,292.036464,
+ -0.793941,-0.544372,0.270771,64.854052,-122.58662,298.449817,
+ -0.793941,-0.544372,0.270771,61.723523,-116.257233,301.995552,
+ -0.644082,0.037055,-0.764058,60.93473,-117.979751,318.060725,
+ -0.644082,0.037055,-0.764058,62.996032,-126.557052,315.907121,
+ -0.644082,0.037055,-0.764058,56.506015,-133.314178,321.050338,
+ -0.703878,0.065389,-0.707305,60.93473,-117.979751,318.060725,
+ -0.703878,0.065389,-0.707305,56.506015,-133.314178,321.050338,
+ -0.703878,0.065389,-0.707305,54.445534,-121.977867,324.148863,
+ -0.557072,-0.284117,-0.780351,57.786586,-113.298652,318.603766,
+ -0.557072,-0.284117,-0.780351,60.93473,-117.979751,318.060725,
+ -0.557072,-0.284117,-0.780351,54.445534,-121.977867,324.148863,
+ -0.514945,-0.311907,-0.798465,57.786586,-113.298652,318.603766,
+ -0.514945,-0.311907,-0.798465,54.445534,-121.977867,324.148863,
+ -0.514945,-0.311907,-0.798465,52.247757,-116.229549,323.320764,
+ -0.426649,-0.45328,-0.782628,50.993105,-107.189523,318.76896,
+ -0.426649,-0.45328,-0.782628,57.786586,-113.298652,318.603766,
+ -0.426649,-0.45328,-0.782628,52.247757,-116.229549,323.320764,
+ -0.32464,-0.460925,-0.825928,50.993105,-107.189523,318.76896,
+ -0.32464,-0.460925,-0.825928,52.247757,-116.229549,323.320764,
+ -0.32464,-0.460925,-0.825928,48.114443,-112.052549,322.614355,
+ -0.349395,-0.445133,-0.824488,40.706672,-98.971207,318.691078,
+ -0.349395,-0.445133,-0.824488,50.993105,-107.189523,318.76896,
+ -0.349395,-0.445133,-0.824488,48.114443,-112.052549,322.614355,
+ -0.115445,-0.344764,-0.931563,40.706672,-98.971207,318.691078,
+ -0.115445,-0.344764,-0.931563,48.114443,-112.052549,322.614355,
+ -0.115445,-0.344764,-0.931563,37.729837,-105.308504,321.405368,
+ -0.465337,-0.207929,-0.860365,62.996032,-126.557052,315.907121,
+ -0.465337,-0.207929,-0.860365,58.788336,-135.79604,320.415726,
+ -0.465337,-0.207929,-0.860365,56.506015,-133.314178,321.050338,
+ -0.521719,-0.170331,-0.83594,62.996032,-126.557052,315.907121,
+ -0.521719,-0.170331,-0.83594,65.854707,-130.078449,314.840511,
+ -0.521719,-0.170331,-0.83594,58.788336,-135.79604,320.415726,
+ -0.69887,-0.384705,-0.602978,65.160771,-122.761549,310.976558,
+ -0.69887,-0.384705,-0.602978,65.854707,-130.078449,314.840511,
+ -0.69887,-0.384705,-0.602978,62.996032,-126.557052,315.907121,
+ -0.661156,-0.398417,-0.635717,68.62692,-126.023747,309.416191,
+ -0.661156,-0.398417,-0.635717,65.854707,-130.078449,314.840511,
+ -0.661156,-0.398417,-0.635717,65.160771,-122.761549,310.976558,
+ -0.70926,-0.693753,-0.125127,65.004491,-121.833969,306.719547,
+ -0.70926,-0.693753,-0.125127,68.62692,-126.023747,309.416191,
+ -0.70926,-0.693753,-0.125127,65.160771,-122.761549,310.976558,
+ -0.675566,-0.71061,-0.196581,68.730387,-124.093443,302.082864,
+ -0.675566,-0.71061,-0.196581,68.62692,-126.023747,309.416191,
+ -0.675566,-0.71061,-0.196581,65.004491,-121.833969,306.719547,
+ 0.908128,-0.081063,-0.41077,19.337651,-97.266334,305.34354,
+ 0.908128,-0.081063,-0.41077,19.734056,-93.012061,305.380351,
+ 0.908128,-0.081063,-0.41077,22.478768,-92.664029,311.379655,
+ 0.921552,-0.173292,-0.347436,19.337651,-97.266334,305.34354,
+ 0.921552,-0.173292,-0.347436,22.478768,-92.664029,311.379655,
+ 0.921552,-0.173292,-0.347436,22.074149,-96.325368,312.13261,
+ 0.895687,-0.405945,-0.18153,19.734056,-93.012061,305.380351,
+ 0.895687,-0.405945,-0.18153,21.224451,-90.158133,306.352044,
+ 0.895687,-0.405945,-0.18153,23.379272,-86.819879,309.519019,
+ 0.883677,-0.260074,-0.389199,19.734056,-93.012061,305.380351,
+ 0.883677,-0.260074,-0.389199,23.379272,-86.819879,309.519019,
+ 0.883677,-0.260074,-0.389199,22.478768,-92.664029,311.379655,
+ 0.188521,-0.324189,-0.927018,26.81944,-84.901137,309.547616,
+ 0.188521,-0.324189,-0.927018,22.478768,-92.664029,311.379655,
+ 0.188521,-0.324189,-0.927018,23.379272,-86.819879,309.519019,
+ 0.456713,-0.438099,-0.774262,26.81944,-84.901137,309.547616,
+ 0.456713,-0.438099,-0.774262,27.559618,-89.526563,312.60142,
+ 0.456713,-0.438099,-0.774262,22.478768,-92.664029,311.379655,
+ 0.357389,-0.225863,-0.906234,27.559618,-89.526563,312.60142,
+ 0.357389,-0.225863,-0.906234,22.074149,-96.325368,312.13261,
+ 0.357389,-0.225863,-0.906234,22.478768,-92.664029,311.379655,
+ 0.549933,-0.392879,-0.737034,27.559618,-89.526563,312.60142,
+ 0.549933,-0.392879,-0.737034,27.611032,-94.50489,315.293501,
+ 0.549933,-0.392879,-0.737034,22.074149,-96.325368,312.13261,
+ 0.132009,-0.470449,-0.872497,27.559618,-89.526563,312.60142,
+ 0.132009,-0.470449,-0.872497,36.797694,-91.852054,315.253039,
+ 0.132009,-0.470449,-0.872497,27.611032,-94.50489,315.293501,
+ 0.125722,-0.448863,-0.884712,36.797694,-91.852054,315.253039,
+ 0.125722,-0.448863,-0.884712,35.91879,-96.527677,317.500344,
+ 0.125722,-0.448863,-0.884712,27.611032,-94.50489,315.293501,
+ 0.10011,-0.536997,-0.837623,26.81944,-84.901137,309.547616,
+ 0.10011,-0.536997,-0.837623,35.309733,-88.00392,312.551527,
+ 0.10011,-0.536997,-0.837623,27.559618,-89.526563,312.60142,
+ 0.101708,-0.544955,-0.832274,35.309733,-88.00392,312.551527,
+ 0.101708,-0.544955,-0.832274,36.797694,-91.852054,315.253039,
+ 0.101708,-0.544955,-0.832274,27.559618,-89.526563,312.60142,
+ -0.452675,-0.546465,-0.7046,47.125501,-94.706895,311.633987,
+ -0.452675,-0.546465,-0.7046,49.675266,-102.477393,316.022422,
+ -0.452675,-0.546465,-0.7046,41.896189,-96.34058,316.26063,
+ -0.419909,-0.595498,-0.684879,40.05837,-91.309622,313.013035,
+ -0.419909,-0.595498,-0.684879,47.125501,-94.706895,311.633987,
+ -0.419909,-0.595498,-0.684879,41.896189,-96.34058,316.26063,
+ -0.343333,-0.594688,-0.726958,35.309733,-88.00392,312.551527,
+ -0.343333,-0.594688,-0.726958,40.05837,-91.309622,313.013035,
+ -0.343333,-0.594688,-0.726958,41.896189,-96.34058,316.26063,
+ -0.419746,-0.624616,-0.658535,35.309733,-88.00392,312.551527,
+ -0.419746,-0.624616,-0.658535,41.896189,-96.34058,316.26063,
+ -0.419746,-0.624616,-0.658535,36.797694,-91.852054,315.253039,
+ -0.448128,-0.540408,-0.712138,41.896189,-96.34058,316.26063,
+ -0.448128,-0.540408,-0.712138,49.675266,-102.477393,316.022422,
+ -0.448128,-0.540408,-0.712138,50.993105,-107.189523,318.76896,
+ -0.405456,-0.514648,-0.755475,41.896189,-96.34058,316.26063,
+ -0.405456,-0.514648,-0.755475,50.993105,-107.189523,318.76896,
+ -0.405456,-0.514648,-0.755475,40.706672,-98.971207,318.691078,
+ -0.335893,-0.552742,-0.762661,36.797694,-91.852054,315.253039,
+ -0.335893,-0.552742,-0.762661,41.896189,-96.34058,316.26063,
+ -0.335893,-0.552742,-0.762661,40.706672,-98.971207,318.691078,
+ 0.002794,-0.433627,-0.901088,36.797694,-91.852054,315.253039,
+ 0.002794,-0.433627,-0.901088,40.706672,-98.971207,318.691078,
+ 0.002794,-0.433627,-0.901088,35.91879,-96.527677,317.500344,
+ 0.165949,0.476076,-0.863605,41.418861,-97.706547,291.061729,
+ 0.165949,0.476076,-0.863605,49.026173,-104.252237,288.915123,
+ 0.165949,0.476076,-0.863605,48.537589,-104.563155,288.649839,
+ -0.689807,-0.723679,0.021327,48.537589,-104.563155,288.649839,
+ -0.689807,-0.723679,0.021327,47.225287,-103.012827,298.810931,
+ -0.689807,-0.723679,0.021327,41.418861,-97.706547,291.061729,
+ -0.692484,-0.607954,0.388404,47.225287,-103.012827,298.810931,
+ -0.692484,-0.607954,0.388404,55.152369,-109.955835,302.076475,
+ -0.692484,-0.607954,0.388404,47.125501,-94.706895,311.633987,
+ -0.718301,-0.599444,0.353144,55.152369,-109.955835,302.076475,
+ -0.718301,-0.599444,0.353144,55.773017,-106.07089,309.933373,
+ -0.718301,-0.599444,0.353144,47.125501,-94.706895,311.633987,
+ -0.829906,-0.557464,-0.022127,51.955336,-109.513797,285.187766,
+ -0.829906,-0.557464,-0.022127,47.225287,-103.012827,298.810931,
+ -0.829906,-0.557464,-0.022127,48.537589,-104.563155,288.649839,
+ -0.680095,-0.72486,0.10977,55.152369,-109.955835,302.076475,
+ -0.680095,-0.72486,0.10977,47.225287,-103.012827,298.810931,
+ -0.680095,-0.72486,0.10977,51.955336,-109.513797,285.187766,
+ -0.610446,-0.51931,-0.598057,56.551801,-108.104021,313.889202,
+ -0.610446,-0.51931,-0.598057,50.993105,-107.189523,318.76896,
+ -0.610446,-0.51931,-0.598057,49.675266,-102.477393,316.022422,
+ -0.572028,-0.621638,-0.535117,57.786586,-113.298652,318.603766,
+ -0.572028,-0.621638,-0.535117,50.993105,-107.189523,318.76896,
+ -0.572028,-0.621638,-0.535117,56.551801,-108.104021,313.889202,
+ -0.741994,-0.497353,-0.449538,55.773017,-106.07089,309.933373,
+ -0.741994,-0.497353,-0.449538,49.675266,-102.477393,316.022422,
+ -0.741994,-0.497353,-0.449538,47.125501,-94.706895,311.633987,
+ -0.658215,-0.714362,-0.23757,56.551801,-108.104021,313.889202,
+ -0.658215,-0.714362,-0.23757,49.675266,-102.477393,316.022422,
+ -0.658215,-0.714362,-0.23757,55.773017,-106.07089,309.933373,
+ -0.817264,-0.048175,-0.574246,53.319235,-110.353152,283.317091,
+ -0.817264,-0.048175,-0.574246,51.955336,-109.513797,285.187766,
+ -0.817264,-0.048175,-0.574246,49.026173,-104.252237,288.915123,
+ 0.054454,0.597211,-0.800234,49.026173,-104.252237,288.915123,
+ 0.054454,0.597211,-0.800234,51.955336,-109.513797,285.187766,
+ 0.054454,0.597211,-0.800234,48.537589,-104.563155,288.649839,
+ -0.79583,0.60301,-0.055069,51.112909,-113.604093,279.603729,
+ -0.79583,0.60301,-0.055069,50.810814,-113.839563,281.391047,
+ -0.79583,0.60301,-0.055069,53.319235,-110.353152,283.317091,
+ -0.439267,0.655445,-0.614359,53.319235,-110.353152,283.317091,
+ -0.439267,0.655445,-0.614359,50.810814,-113.839563,281.391047,
+ -0.439267,0.655445,-0.614359,51.955336,-109.513797,285.187766,
+ -0.609537,-0.4257,0.668763,51.955336,-109.513797,285.187766,
+ -0.609537,-0.4257,0.668763,50.810814,-113.839563,281.391047,
+ -0.609537,-0.4257,0.668763,53.914693,-116.926527,282.255044,
+ -0.760244,-0.402647,0.509808,53.914693,-116.926527,282.255044,
+ -0.760244,-0.402647,0.509808,55.442447,-113.696577,287.084301,
+ -0.760244,-0.402647,0.509808,51.955336,-109.513797,285.187766,
+ -0.790193,-0.598044,0.133931,51.955336,-109.513797,285.187766,
+ -0.790193,-0.598044,0.133931,55.442447,-113.696577,287.084301,
+ -0.790193,-0.598044,0.133931,55.152369,-109.955835,302.076475,
+ -0.463255,-0.861927,0.206099,57.043092,-112.607758,295.235687,
+ -0.463255,-0.861927,0.206099,55.152369,-109.955835,302.076475,
+ -0.463255,-0.861927,0.206099,55.442447,-113.696577,287.084301,
+ 0.614908,0.625247,0.480577,48.154875,-111.181555,278.782627,
+ 0.614908,0.625247,0.480577,40.286234,-104.226378,279.801779,
+ 0.614908,0.625247,0.480577,40.585895,-106.088231,281.84069,
+ 0.611435,0.596354,0.520105,48.154875,-111.181555,278.782627,
+ 0.611435,0.596354,0.520105,40.585895,-106.088231,281.84069,
+ 0.611435,0.596354,0.520105,47.76924,-112.801853,281.09382,
+ -0.061733,-0.17536,0.982567,40.585895,-106.088231,281.84069,
+ -0.061733,-0.17536,0.982567,40.645827,-117.192723,279.862624,
+ -0.061733,-0.17536,0.982567,47.76924,-112.801853,281.09382,
+ -0.007906,-0.258066,0.966095,47.76924,-112.801853,281.09382,
+ -0.007906,-0.258066,0.966095,40.645827,-117.192723,279.862624,
+ -0.007906,-0.258066,0.966095,47.518255,-117.683437,279.787784,
+ 0.422256,0.707621,0.566545,51.112909,-113.604093,279.603729,
+ 0.422256,0.707621,0.566545,48.154875,-111.181555,278.782627,
+ 0.422256,0.707621,0.566545,47.76924,-112.801853,281.09382,
+ 0.302615,0.936986,0.174591,51.112909,-113.604093,279.603729,
+ 0.302615,0.936986,0.174591,47.76924,-112.801853,281.09382,
+ 0.302615,0.936986,0.174591,50.810814,-113.839563,281.391047,
+ -0.177013,-0.245869,0.953003,47.76924,-112.801853,281.09382,
+ -0.177013,-0.245869,0.953003,47.518255,-117.683437,279.787784,
+ -0.177013,-0.245869,0.953003,50.810814,-113.839563,281.391047,
+ -0.349133,-0.089985,0.932743,50.810814,-113.839563,281.391047,
+ -0.349133,-0.089985,0.932743,47.518255,-117.683437,279.787784,
+ -0.349133,-0.089985,0.932743,53.914693,-116.926527,282.255044,
+ 0.992929,-0.108525,0.048101,16.913592,-136.221954,298.151069,
+ 0.992929,-0.108525,0.048101,17.88133,-127.319134,298.260894,
+ 0.992929,-0.108525,0.048101,17.188611,-130.141119,306.193543,
+ 0.995767,-0.066714,0.063222,17.88133,-127.319134,298.260894,
+ 0.995767,-0.066714,0.063222,17.769984,-121.30614,306.35965,
+ 0.995767,-0.066714,0.063222,17.188611,-130.141119,306.193543,
+ 0.988337,-0.11545,0.099305,17.88133,-127.319134,298.260894,
+ 0.988337,-0.11545,0.099305,18.702431,-119.864421,298.755563,
+ 0.988337,-0.11545,0.099305,17.769984,-121.30614,306.35965,
+ 0.865786,-0.480237,0.140665,16.074846,-141.671525,297.854754,
+ 0.865786,-0.480237,0.140665,16.816849,-137.813352,306.459739,
+ 0.865786,-0.480237,0.140665,14.767289,-141.627412,306.053296,
+ 0.988354,-0.151169,-0.017446,16.074846,-141.671525,297.854754,
+ 0.988354,-0.151169,-0.017446,16.913592,-136.221954,298.151069,
+ 0.988354,-0.151169,-0.017446,16.816849,-137.813352,306.459739,
+ 0.983277,-0.140611,0.115734,20.393614,-96.799654,296.939039,
+ 0.983277,-0.140611,0.115734,19.337651,-97.266334,305.34354,
+ 0.983277,-0.140611,0.115734,18.236968,-106.935192,302.947774,
+ 0.955866,-0.03013,0.292254,20.407608,-108.2537,295.712407,
+ 0.955866,-0.03013,0.292254,20.393614,-96.799654,296.939039,
+ 0.955866,-0.03013,0.292254,18.236968,-106.935192,302.947774,
+ 0.093762,-0.532605,-0.841155,27.611032,-94.50489,315.293501,
+ 0.093762,-0.532605,-0.841155,35.91879,-96.527677,317.500344,
+ 0.093762,-0.532605,-0.841155,30.71625,-102.167996,320.491782,
+ 0.504508,-0.335292,-0.795645,27.611032,-94.50489,315.293501,
+ 0.504508,-0.335292,-0.795645,30.71625,-102.167996,320.491782,
+ 0.504508,-0.335292,-0.795645,23.648206,-104.400699,316.950915,
+ 0.022227,-0.402419,-0.915186,35.91879,-96.527677,317.500344,
+ 0.022227,-0.402419,-0.915186,40.706672,-98.971207,318.691078,
+ 0.022227,-0.402419,-0.915186,37.729837,-105.308504,321.405368,
+ -0.068767,-0.417195,-0.906212,35.91879,-96.527677,317.500344,
+ -0.068767,-0.417195,-0.906212,37.729837,-105.308504,321.405368,
+ -0.068767,-0.417195,-0.906212,30.71625,-102.167996,320.491782,
+ 0.548421,-0.34704,-0.760787,27.611032,-94.50489,315.293501,
+ 0.548421,-0.34704,-0.760787,23.648206,-104.400699,316.950915,
+ 0.548421,-0.34704,-0.760787,22.074149,-96.325368,312.13261,
+ 0.782879,-0.19911,-0.589454,22.074149,-96.325368,312.13261,
+ 0.782879,-0.19911,-0.589454,23.648206,-104.400699,316.950915,
+ 0.782879,-0.19911,-0.589454,20.045277,-105.141181,312.415843,
+ 0.914732,-0.221376,-0.338022,19.337651,-97.266334,305.34354,
+ 0.914732,-0.221376,-0.338022,22.074149,-96.325368,312.13261,
+ 0.914732,-0.221376,-0.338022,20.045277,-105.141181,312.415843,
+ 0.982248,-0.068552,-0.174611,18.236968,-106.935192,302.947774,
+ 0.982248,-0.068552,-0.174611,19.337651,-97.266334,305.34354,
+ 0.982248,-0.068552,-0.174611,20.045277,-105.141181,312.415843,
+ -0.113052,-0.27769,-0.953996,45.017531,-115.236256,323.888447,
+ -0.113052,-0.27769,-0.953996,52.247757,-116.229549,323.320764,
+ -0.113052,-0.27769,-0.953996,45.587343,-119.518214,325.067316,
+ -0.11251,-0.272915,-0.955437,48.114443,-112.052549,322.614355,
+ -0.11251,-0.272915,-0.955437,52.247757,-116.229549,323.320764,
+ -0.11251,-0.272915,-0.955437,45.017531,-115.236256,323.888447,
+ 0.992613,-0.06444,0.102795,18.702431,-119.864421,298.755563,
+ 0.992613,-0.06444,0.102795,19.11648,-112.991081,299.066176,
+ 0.992613,-0.06444,0.102795,18.393948,-113.983765,305.420813,
+ 0.991617,-0.070625,0.108206,18.702431,-119.864421,298.755563,
+ 0.991617,-0.070625,0.108206,18.393948,-113.983765,305.420813,
+ 0.991617,-0.070625,0.108206,17.769984,-121.30614,306.35965,
+ 0.954,-0.050831,0.295467,20.407608,-108.2537,295.712407,
+ 0.954,-0.050831,0.295467,18.236968,-106.935192,302.947774,
+ 0.954,-0.050831,0.295467,19.11648,-112.991081,299.066176,
+ 0.990295,0.065131,0.122773,19.11648,-112.991081,299.066176,
+ 0.990295,0.065131,0.122773,18.236968,-106.935192,302.947774,
+ 0.990295,0.065131,0.122773,18.393948,-113.983765,305.420813,
+ 0.954598,-0.116497,-0.274172,18.393948,-113.983765,305.420813,
+ 0.954598,-0.116497,-0.274172,20.572802,-115.279456,313.557597,
+ 0.954598,-0.116497,-0.274172,17.769984,-121.30614,306.35965,
+ 0.938591,-0.025553,-0.344084,17.769984,-121.30614,306.35965,
+ 0.938591,-0.025553,-0.344084,20.572802,-115.279456,313.557597,
+ 0.938591,-0.025553,-0.344084,20.528994,-124.495932,314.122542,
+ 0.982821,-0.04123,-0.179897,18.236968,-106.935192,302.947774,
+ 0.982821,-0.04123,-0.179897,20.045277,-105.141181,312.415843,
+ 0.982821,-0.04123,-0.179897,18.393948,-113.983765,305.420813,
+ 0.966595,0.021532,-0.255404,18.393948,-113.983765,305.420813,
+ 0.966595,0.021532,-0.255404,20.045277,-105.141181,312.415843,
+ 0.966595,0.021532,-0.255404,20.572802,-115.279456,313.557597,
+ 0.825121,-0.038472,-0.563644,20.572802,-115.279456,313.557597,
+ 0.825121,-0.038472,-0.563644,24.014796,-115.263332,318.595248,
+ 0.825121,-0.038472,-0.563644,20.528994,-124.495932,314.122542,
+ 0.842164,-0.058268,-0.536063,20.528994,-124.495932,314.122542,
+ 0.842164,-0.058268,-0.536063,24.014796,-115.263332,318.595248,
+ 0.842164,-0.058268,-0.536063,24.105151,-125.793753,319.881812,
+ 0.784944,-0.028856,-0.618894,20.045277,-105.141181,312.415843,
+ 0.784944,-0.028856,-0.618894,23.648206,-104.400699,316.950915,
+ 0.784944,-0.028856,-0.618894,20.572802,-115.279456,313.557597,
+ 0.824399,-0.057416,-0.56309,20.572802,-115.279456,313.557597,
+ 0.824399,-0.057416,-0.56309,23.648206,-104.400699,316.950915,
+ 0.824399,-0.057416,-0.56309,24.014796,-115.263332,318.595248,
+ 0.548573,-0.096758,-0.830485,24.014796,-115.263332,318.595248,
+ 0.548573,-0.096758,-0.830485,29.566586,-117.664879,322.542254,
+ 0.548573,-0.096758,-0.830485,24.105151,-125.793753,319.881812,
+ 0.67885,-0.22761,-0.69811,29.566586,-117.664879,322.542254,
+ 0.67885,-0.22761,-0.69811,27.324757,-126.90691,323.375524,
+ 0.67885,-0.22761,-0.69811,24.105151,-125.793753,319.881812,
+ 0.473958,-0.116134,-0.872855,30.71625,-102.167996,320.491782,
+ 0.473958,-0.116134,-0.872855,24.014796,-115.263332,318.595248,
+ 0.473958,-0.116134,-0.872855,23.648206,-104.400699,316.950915,
+ 0.529046,-0.149767,-0.835272,30.71625,-102.167996,320.491782,
+ 0.529046,-0.149767,-0.835272,29.566586,-117.664879,322.542254,
+ 0.529046,-0.149767,-0.835272,24.014796,-115.263332,318.595248,
+ 0.019086,-0.239741,-0.970649,30.71625,-102.167996,320.491782,
+ 0.019086,-0.239741,-0.970649,37.729837,-105.308504,321.405368,
+ 0.019086,-0.239741,-0.970649,38.822915,-116.217076,324.121178,
+ 0.188054,-0.14253,-0.971762,30.71625,-102.167996,320.491782,
+ 0.188054,-0.14253,-0.971762,38.822915,-116.217076,324.121178,
+ 0.188054,-0.14253,-0.971762,29.566586,-117.664879,322.542254,
+ 0.028001,-0.394756,-0.918359,48.114443,-112.052549,322.614355,
+ 0.028001,-0.394756,-0.918359,45.017531,-115.236256,323.888447,
+ 0.028001,-0.394756,-0.918359,38.822915,-116.217076,324.121178,
+ -0.046872,-0.245741,-0.968202,37.729837,-105.308504,321.405368,
+ -0.046872,-0.245741,-0.968202,48.114443,-112.052549,322.614355,
+ -0.046872,-0.245741,-0.968202,38.822915,-116.217076,324.121178,
+ -0.038655,-0.347707,-0.936806,38.822915,-116.217076,324.121178,
+ -0.038655,-0.347707,-0.936806,45.587343,-119.518214,325.067316,
+ -0.038655,-0.347707,-0.936806,39.759926,-123.442403,326.764279,
+ 0.005686,-0.264727,-0.964307,45.017531,-115.236256,323.888447,
+ 0.005686,-0.264727,-0.964307,45.587343,-119.518214,325.067316,
+ 0.005686,-0.264727,-0.964307,38.822915,-116.217076,324.121178,
+ 0.442007,-0.186328,-0.877446,29.566586,-117.664879,322.542254,
+ 0.442007,-0.186328,-0.877446,33.542798,-125.488616,326.206636,
+ 0.442007,-0.186328,-0.877446,27.324757,-126.90691,323.375524,
+ 0.207002,-0.312317,-0.927151,38.822915,-116.217076,324.121178,
+ 0.207002,-0.312317,-0.927151,39.759926,-123.442403,326.764279,
+ 0.207002,-0.312317,-0.927151,29.566586,-117.664879,322.542254,
+ 0.192734,-0.334163,-0.922599,29.566586,-117.664879,322.542254,
+ 0.192734,-0.334163,-0.922599,39.759926,-123.442403,326.764279,
+ 0.192734,-0.334163,-0.922599,33.542798,-125.488616,326.206636,
+ -0.803792,-0.45951,0.377848,58.602607,-119.368535,286.909067,
+ -0.803792,-0.45951,0.377848,60.417944,-117.469263,293.080562,
+ -0.803792,-0.45951,0.377848,55.442447,-113.696577,287.084301,
+ -0.748686,-0.621724,0.230062,55.442447,-113.696577,287.084301,
+ -0.748686,-0.621724,0.230062,60.417944,-117.469263,293.080562,
+ -0.748686,-0.621724,0.230062,57.043092,-112.607758,295.235687,
+ -0.798455,-0.352294,0.488219,56.400236,-123.413198,281.639294,
+ -0.798455,-0.352294,0.488219,55.442447,-113.696577,287.084301,
+ -0.798455,-0.352294,0.488219,53.914693,-116.926527,282.255044,
+ -0.691538,-0.403798,0.598934,56.400236,-123.413198,281.639294,
+ -0.691538,-0.403798,0.598934,58.602607,-119.368535,286.909067,
+ -0.691538,-0.403798,0.598934,55.442447,-113.696577,287.084301,
+ -0.432631,-0.897116,0.089519,68.730387,-124.093443,302.082864,
+ -0.432631,-0.897116,0.089519,65.004491,-121.833969,306.719547,
+ -0.432631,-0.897116,0.089519,64.854052,-122.58662,298.449817,
+ -0.410672,-0.90975,0.06085,68.730387,-124.093443,302.082864,
+ -0.410672,-0.90975,0.06085,64.854052,-122.58662,298.449817,
+ -0.410672,-0.90975,0.06085,68.710947,-124.410141,297.216796,
+ -0.328161,-0.896122,0.29879,68.710947,-124.410141,297.216796,
+ -0.328161,-0.896122,0.29879,64.854052,-122.58662,298.449817,
+ -0.328161,-0.896122,0.29879,63.891243,-124.372417,292.036464,
+ -0.296066,-0.916571,0.268781,68.710947,-124.410141,297.216796,
+ -0.296066,-0.916571,0.268781,63.891243,-124.372417,292.036464,
+ -0.296066,-0.916571,0.268781,67.349939,-126.15578,289.764821,
+ -0.151305,-0.197382,-0.96858,52.247757,-116.229549,323.320764,
+ -0.151305,-0.197382,-0.96858,54.445534,-121.977867,324.148863,
+ -0.151305,-0.197382,-0.96858,46.614404,-126.629457,326.320112,
+ -0.158382,-0.193451,-0.968242,52.247757,-116.229549,323.320764,
+ -0.158382,-0.193451,-0.968242,46.614404,-126.629457,326.320112,
+ -0.158382,-0.193451,-0.968242,45.587343,-119.518214,325.067316,
+ -0.410652,0.170198,-0.895767,54.445534,-121.977867,324.148863,
+ -0.410652,0.170198,-0.895767,56.506015,-133.314178,321.050338,
+ -0.410652,0.170198,-0.895767,47.852597,-138.644189,324.00466,
+ -0.342705,0.143602,-0.928403,54.445534,-121.977867,324.148863,
+ -0.342705,0.143602,-0.928403,47.852597,-138.644189,324.00466,
+ -0.342705,0.143602,-0.928403,46.614404,-126.629457,326.320112,
+ -0.258899,0.156991,-0.953061,46.614404,-126.629457,326.320112,
+ -0.258899,0.156991,-0.953061,47.852597,-138.644189,324.00466,
+ -0.258899,0.156991,-0.953061,40.738007,-142.324694,325.331078,
+ -0.255012,0.155615,-0.954334,46.614404,-126.629457,326.320112,
+ -0.255012,0.155615,-0.954334,40.738007,-142.324694,325.331078,
+ -0.255012,0.155615,-0.954334,39.206238,-130.797331,327.620062,
+ -0.06926,-0.182776,-0.980712,45.587343,-119.518214,325.067316,
+ -0.06926,-0.182776,-0.980712,46.614404,-126.629457,326.320112,
+ -0.06926,-0.182776,-0.980712,39.206238,-130.797331,327.620062,
+ -0.217761,-0.096612,-0.971209,45.587343,-119.518214,325.067316,
+ -0.217761,-0.096612,-0.971209,39.206238,-130.797331,327.620062,
+ -0.217761,-0.096612,-0.971209,39.759926,-123.442403,326.764279,
+ 0.151803,-0.125504,-0.98041,39.759926,-123.442403,326.764279,
+ 0.151803,-0.125504,-0.98041,39.206238,-130.797331,327.620062,
+ 0.151803,-0.125504,-0.98041,32.550114,-132.897391,326.858284,
+ 0.122513,-0.103235,-0.987083,39.759926,-123.442403,326.764279,
+ 0.122513,-0.103235,-0.987083,32.550114,-132.897391,326.858284,
+ 0.122513,-0.103235,-0.987083,33.542798,-125.488616,326.206636,
+ -0.199904,0.165212,-0.965786,39.206238,-130.797331,327.620062,
+ -0.199904,0.165212,-0.965786,40.738007,-142.324694,325.331078,
+ -0.199904,0.165212,-0.965786,34.154289,-143.468882,326.498083,
+ 0.098361,0.048793,-0.993954,39.206238,-130.797331,327.620062,
+ 0.098361,0.048793,-0.993954,34.154289,-143.468882,326.498083,
+ 0.098361,0.048793,-0.993954,32.550114,-132.897391,326.858284,
+ 0.298782,0.077747,-0.951149,32.550114,-132.897391,326.858284,
+ 0.298782,0.077747,-0.951149,34.154289,-143.468882,326.498083,
+ 0.298782,0.077747,-0.951149,26.61774,-143.889929,324.096232,
+ 0.498805,-0.051805,-0.865165,32.550114,-132.897391,326.858284,
+ 0.498805,-0.051805,-0.865165,26.61774,-143.889929,324.096232,
+ 0.498805,-0.051805,-0.865165,27.106324,-135.446182,323.872323,
+ 0.526956,-0.144274,-0.837557,33.542798,-125.488616,326.206636,
+ 0.526956,-0.144274,-0.837557,32.550114,-132.897391,326.858284,
+ 0.526956,-0.144274,-0.837557,27.106324,-135.446182,323.872323,
+ 0.425486,-0.063404,-0.902741,33.542798,-125.488616,326.206636,
+ 0.425486,-0.063404,-0.902741,27.106324,-135.446182,323.872323,
+ 0.425486,-0.063404,-0.902741,27.324757,-126.90691,323.375524,
+ -0.148501,-0.283957,-0.947268,56.506015,-133.314178,321.050338,
+ -0.148501,-0.283957,-0.947268,49.56967,-139.793852,324.080108,
+ -0.148501,-0.283957,-0.947268,47.852597,-138.644189,324.00466,
+ -0.340656,-0.0736,-0.937303,56.506015,-133.314178,321.050338,
+ -0.340656,-0.0736,-0.937303,58.788336,-135.79604,320.415726,
+ -0.340656,-0.0736,-0.937303,49.56967,-139.793852,324.080108,
+ 0.287129,-0.763506,-0.57846,47.852597,-138.644189,324.00466,
+ 0.287129,-0.763506,-0.57846,40.643698,-143.610346,326.981191,
+ 0.287129,-0.763506,-0.57846,40.738007,-142.324694,325.331078,
+ -0.169293,-0.314152,-0.934157,47.852597,-138.644189,324.00466,
+ -0.169293,-0.314152,-0.934157,49.56967,-139.793852,324.080108,
+ -0.169293,-0.314152,-0.934157,40.643698,-143.610346,326.981191,
+ -0.069514,-0.487642,-0.870272,40.738007,-142.324694,325.331078,
+ -0.069514,-0.487642,-0.870272,33.950458,-145.813539,327.828152,
+ -0.069514,-0.487642,-0.870272,34.154289,-143.468882,326.498083,
+ 0.181335,-0.780755,-0.597946,40.738007,-142.324694,325.331078,
+ 0.181335,-0.780755,-0.597946,40.643698,-143.610346,326.981191,
+ 0.181335,-0.780755,-0.597946,33.950458,-145.813539,327.828152,
+ 0.29631,-0.425184,-0.85523,34.154289,-143.468882,326.498083,
+ 0.29631,-0.425184,-0.85523,26.087781,-145.864953,324.894516,
+ 0.29631,-0.425184,-0.85523,26.61774,-143.889929,324.096232,
+ 0.307619,-0.48958,-0.815894,34.154289,-143.468882,326.498083,
+ 0.307619,-0.48958,-0.815894,33.950458,-145.813539,327.828152,
+ 0.307619,-0.48958,-0.815894,26.087781,-145.864953,324.894516,
+ 0.570205,-0.43474,-0.697042,26.61774,-143.889929,324.096232,
+ 0.570205,-0.43474,-0.697042,26.087781,-145.864953,324.894516,
+ 0.570205,-0.43474,-0.697042,22.657956,-145.419873,321.811203,
+ 0.563104,-0.318583,-0.762508,24.071382,-142.819667,321.768612,
+ 0.563104,-0.318583,-0.762508,26.61774,-143.889929,324.096232,
+ 0.563104,-0.318583,-0.762508,22.657956,-145.419873,321.811203,
+ 0.661505,-0.060409,-0.747503,27.324757,-126.90691,323.375524,
+ 0.661505,-0.060409,-0.747503,27.106324,-135.446182,323.872323,
+ 0.661505,-0.060409,-0.747503,23.524082,-134.118548,320.594914,
+ 0.713414,-0.10909,-0.692199,24.105151,-125.793753,319.881812,
+ 0.713414,-0.10909,-0.692199,27.324757,-126.90691,323.375524,
+ 0.713414,-0.10909,-0.692199,23.524082,-134.118548,320.594914,
+ 0.660152,-0.058057,-0.748885,27.106324,-135.446182,323.872323,
+ 0.660152,-0.058057,-0.748885,26.61774,-143.889929,324.096232,
+ 0.660152,-0.058057,-0.748885,24.071382,-142.819667,321.768612,
+ 0.661807,-0.059181,-0.747335,23.524082,-134.118548,320.594914,
+ 0.661807,-0.059181,-0.747335,27.106324,-135.446182,323.872323,
+ 0.661807,-0.059181,-0.747335,24.071382,-142.819667,321.768612,
+ 0.776825,-0.035942,-0.62869,18.376911,-139.363071,314.534766,
+ 0.776825,-0.035942,-0.62869,23.524082,-134.118548,320.594914,
+ 0.776825,-0.035942,-0.62869,24.071382,-142.819667,321.768612,
+ 0.821721,-0.18271,-0.539807,19.547566,-132.242092,313.906542,
+ 0.821721,-0.18271,-0.539807,23.524082,-134.118548,320.594914,
+ 0.821721,-0.18271,-0.539807,18.376911,-139.363071,314.534766,
+ 0.841778,-0.104129,-0.529686,19.547566,-132.242092,313.906542,
+ 0.841778,-0.104129,-0.529686,24.105151,-125.793753,319.881812,
+ 0.841778,-0.104129,-0.529686,23.524082,-134.118548,320.594914,
+ 0.83671,-0.090951,-0.540041,19.547566,-132.242092,313.906542,
+ 0.83671,-0.090951,-0.540041,20.528994,-124.495932,314.122542,
+ 0.83671,-0.090951,-0.540041,24.105151,-125.793753,319.881812,
+ 0.647131,-0.362753,-0.670546,17.61057,-142.804152,315.525016,
+ 0.647131,-0.362753,-0.670546,24.071382,-142.819667,321.768612,
+ 0.647131,-0.362753,-0.670546,22.657956,-145.419873,321.811203,
+ 0.653056,-0.340151,-0.676621,18.376911,-139.363071,314.534766,
+ 0.653056,-0.340151,-0.676621,24.071382,-142.819667,321.768612,
+ 0.653056,-0.340151,-0.676621,17.61057,-142.804152,315.525016,
+ 0.905967,-0.290407,-0.308038,14.767289,-141.627412,306.053296,
+ 0.905967,-0.290407,-0.308038,18.376911,-139.363071,314.534766,
+ 0.905967,-0.290407,-0.308038,17.61057,-142.804152,315.525016,
+ 0.863614,-0.437355,-0.250782,14.767289,-141.627412,306.053296,
+ 0.863614,-0.437355,-0.250782,16.816849,-137.813352,306.459739,
+ 0.863614,-0.437355,-0.250782,18.376911,-139.363071,314.534766,
+ 0.941615,-0.110432,-0.318066,17.188611,-130.141119,306.193543,
+ 0.941615,-0.110432,-0.318066,20.528994,-124.495932,314.122542,
+ 0.941615,-0.110432,-0.318066,19.547566,-132.242092,313.906542,
+ 0.93353,-0.054769,-0.354291,17.188611,-130.141119,306.193543,
+ 0.93353,-0.054769,-0.354291,17.769984,-121.30614,306.35965,
+ 0.93353,-0.054769,-0.354291,20.528994,-124.495932,314.122542,
+ 0.959443,-0.177079,-0.219345,16.816849,-137.813352,306.459739,
+ 0.959443,-0.177079,-0.219345,19.547566,-132.242092,313.906542,
+ 0.959443,-0.177079,-0.219345,18.376911,-139.363071,314.534766,
+ 0.950317,-0.056668,-0.306082,17.188611,-130.141119,306.193543,
+ 0.950317,-0.056668,-0.306082,19.547566,-132.242092,313.906542,
+ 0.950317,-0.056668,-0.306082,16.816849,-137.813352,306.459739,
+ 0.998829,-0.048316,0.002376,16.913592,-136.221954,298.151069,
+ 0.998829,-0.048316,0.002376,17.188611,-130.141119,306.193543,
+ 0.998829,-0.048316,0.002376,16.816849,-137.813352,306.459739,
+ 0.045332,0.290498,0.955801,0.020624,22.350715,403.947207,
+ 0.045332,0.290498,0.955801,0.020624,-4.192857,412.014627,
+ 0.045332,0.290498,0.955801,12.48439,-3.001819,411.061493,
+ 0.486437,0.090316,0.869035,65.169046,-0.23642,390.231253,
+ 0.486437,0.090316,0.869035,48.474949,-1.420461,399.698714,
+ 0.486437,0.090316,0.869035,57.751631,-21.461238,396.588933,
+ 0.466378,0.079169,0.881036,48.474949,-1.420461,399.698714,
+ 0.466378,0.079169,0.881036,46.389887,-21.686364,402.623527,
+ 0.466378,0.079169,0.881036,57.751631,-21.461238,396.588933,
+ 0.161051,0.433796,0.886501,14.942827,44.498854,391.360534,
+ 0.161051,0.433796,0.886501,36.944938,21.200443,398.764137,
+ 0.161051,0.433796,0.886501,37.774558,37.301211,390.734744,
+ 0.201609,0.464426,0.862359,14.942827,44.498854,391.360534,
+ 0.201609,0.464426,0.862359,13.95714,23.883397,402.693498,
+ 0.201609,0.464426,0.862359,36.944938,21.200443,398.764137,
+ 0.064892,0.57678,0.814318,17.904451,62.637317,374.372648,
+ 0.064892,0.57678,0.814318,37.774558,37.301211,390.734744,
+ 0.064892,0.57678,0.814318,36.149392,50.759486,381.331779,
+ 0.223805,0.646523,0.729329,17.904451,62.637317,374.372648,
+ 0.223805,0.646523,0.729329,14.942827,44.498854,391.360534,
+ 0.223805,0.646523,0.729329,37.774558,37.301211,390.734744,
+ -0.000766,0.481766,0.8763,0.020624,48.454379,389.172857,
+ -0.000766,0.481766,0.8763,13.95714,23.883397,402.693498,
+ -0.000766,0.481766,0.8763,14.942827,44.498854,391.360534,
+ 0.024111,0.492422,0.870023,0.020624,48.454379,389.172857,
+ 0.024111,0.492422,0.870023,0.020624,22.350715,403.947207,
+ 0.024111,0.492422,0.870023,13.95714,23.883397,402.693498,
+ 0.026308,0.68105,0.731764,0.020624,64.505558,373.276832,
+ 0.026308,0.68105,0.731764,14.942827,44.498854,391.360534,
+ 0.026308,0.68105,0.731764,17.904451,62.637317,374.372648,
+ 0.082079,0.70129,0.708135,0.020624,64.505558,373.276832,
+ 0.082079,0.70129,0.708135,0.020624,48.454379,389.172857,
+ 0.082079,0.70129,0.708135,14.942827,44.498854,391.360534,
+ 0.335294,0.565581,0.753456,36.149392,50.759486,381.331779,
+ 0.335294,0.565581,0.753456,55.014677,35.666613,384.266023,
+ 0.335294,0.565581,0.753456,51.46517,49.055526,375.795201,
+ 0.336058,0.566357,0.752532,36.149392,50.759486,381.331779,
+ 0.336058,0.566357,0.752532,37.774558,37.301211,390.734744,
+ 0.336058,0.566357,0.752532,55.014677,35.666613,384.266023,
+ 0.359727,0.220809,0.906554,36.944938,21.200443,398.764137,
+ 0.359727,0.220809,0.906554,32.892366,-0.225468,405.590931,
+ 0.359727,0.220809,0.906554,48.474949,-1.420461,399.698714,
+ 0.328201,0.205379,0.922011,36.944938,21.200443,398.764137,
+ 0.328201,0.205379,0.922011,48.474949,-1.420461,399.698714,
+ 0.328201,0.205379,0.922011,52.583559,16.544289,394.234541,
+ 0.534143,0.131829,0.835052,70.207579,17.629762,382.789926,
+ 0.534143,0.131829,0.835052,52.583559,16.544289,394.234541,
+ 0.534143,0.131829,0.835052,48.474949,-1.420461,399.698714,
+ 0.468749,0.223721,0.854531,70.207579,17.629762,382.789926,
+ 0.468749,0.223721,0.854531,48.474949,-1.420461,399.698714,
+ 0.468749,0.223721,0.854531,65.169046,-0.23642,390.231253,
+ 0.362045,0.394296,0.844662,55.014677,35.666613,384.266023,
+ 0.362045,0.394296,0.844662,36.944938,21.200443,398.764137,
+ 0.362045,0.394296,0.844662,52.583559,16.544289,394.234541,
+ 0.35479,0.402544,0.84385,37.774558,37.301211,390.734744,
+ 0.35479,0.402544,0.84385,36.944938,21.200443,398.764137,
+ 0.35479,0.402544,0.84385,55.014677,35.666613,384.266023,
+ 0.519049,0.3423,0.78321,55.014677,35.666613,384.266023,
+ 0.519049,0.3423,0.78321,52.583559,16.544289,394.234541,
+ 0.519049,0.3423,0.78321,68.405567,34.874717,375.737702,
+ 0.488923,0.373475,0.788334,68.405567,34.874717,375.737702,
+ 0.488923,0.373475,0.788334,52.583559,16.544289,394.234541,
+ 0.488923,0.373475,0.788334,70.207579,17.629762,382.789926,
+ 0.467971,0.043127,0.882691,57.751631,-21.461238,396.588933,
+ 0.467971,0.043127,0.882691,46.389887,-21.686364,402.623527,
+ 0.467971,0.043127,0.882691,57.090095,-36.910662,397.694484,
+ 0.476967,0.051152,0.877431,46.389887,-21.686364,402.623527,
+ 0.476967,0.051152,0.877431,47.260577,-42.099817,403.340279,
+ 0.476967,0.051152,0.877431,57.090095,-36.910662,397.694484,
+ 0.731626,0.322141,0.60079,79.590109,35.425972,361.821873,
+ 0.731626,0.322141,0.60079,68.405567,34.874717,375.737702,
+ 0.731626,0.322141,0.60079,70.207579,17.629762,382.789926,
+ 0.643492,0.417022,0.641881,79.590109,35.425972,361.821873,
+ 0.643492,0.417022,0.641881,70.207579,17.629762,382.789926,
+ 0.643492,0.417022,0.641881,82.521697,18.705499,369.746004,
+ 0.70035,0.219365,0.679256,82.521697,18.705499,369.746004,
+ 0.70035,0.219365,0.679256,70.207579,17.629762,382.789926,
+ 0.70035,0.219365,0.679256,80.02985,1.524126,377.863926,
+ 0.622771,0.144628,0.768921,70.207579,17.629762,382.789926,
+ 0.622771,0.144628,0.768921,65.169046,-0.23642,390.231253,
+ 0.622771,0.144628,0.768921,80.02985,1.524126,377.863926,
+ 0.63917,0.006986,0.769033,80.02985,1.524126,377.863926,
+ 0.63917,0.006986,0.769033,65.169046,-0.23642,390.231253,
+ 0.63917,0.006986,0.769033,57.751631,-21.461238,396.588933,
+ 0.614662,0.045754,0.787463,80.02985,1.524126,377.863926,
+ 0.614662,0.045754,0.787463,57.751631,-21.461238,396.588933,
+ 0.614662,0.045754,0.787463,73.651094,-18.674848,384.016559,
+ 0.651376,-0.047989,0.757236,57.090095,-36.910662,397.694484,
+ 0.651376,-0.047989,0.757236,61.876821,-54.079258,392.488902,
+ 0.651376,-0.047989,0.757236,72.866803,-45.522644,383.577563,
+ 0.65059,-0.050292,0.757762,65.459519,-26.680511,391.187734,
+ 0.65059,-0.050292,0.757762,57.090095,-36.910662,397.694484,
+ 0.65059,-0.050292,0.757762,72.866803,-45.522644,383.577563,
+ 0.616753,0.029879,0.786589,73.651094,-18.674848,384.016559,
+ 0.616753,0.029879,0.786589,57.751631,-21.461238,396.588933,
+ 0.616753,0.029879,0.786589,57.090095,-36.910662,397.694484,
+ -0.761742,0.240579,-0.601557,73.651094,-18.674848,384.016559,
+ -0.761742,0.240579,-0.601557,57.090095,-36.910662,397.694484,
+ -0.761742,0.240579,-0.601557,65.459519,-26.680511,391.187734,
+ 0.780696,-0.009121,0.624845,85.8138,-17.878084,368.83181,
+ 0.780696,-0.009121,0.624845,73.651094,-18.674848,384.016559,
+ 0.780696,-0.009121,0.624845,79.836577,-34.488428,376.057442,
+ 0.675761,-0.031782,0.736435,73.651094,-18.674848,384.016559,
+ 0.675761,-0.031782,0.736435,65.459519,-26.680511,391.187734,
+ 0.675761,-0.031782,0.736435,72.866803,-45.522644,383.577563,
+ 0.756564,-0.03278,0.653098,79.836577,-34.488428,376.057442,
+ 0.756564,-0.03278,0.653098,73.651094,-18.674848,384.016559,
+ 0.756564,-0.03278,0.653098,72.866803,-45.522644,383.577563,
+ 0.859675,-0.313289,-0.403496,68.252177,-120.956586,257.059185,
+ 0.859675,-0.313289,-0.403496,73.137411,-118.532527,265.585376,
+ 0.859675,-0.313289,-0.403496,69.933047,-124.016475,263.016202,
+ 0.802936,-0.505132,-0.316444,68.252177,-120.956586,257.059185,
+ 0.802936,-0.505132,-0.316444,72.775414,-115.932626,260.516695,
+ 0.802936,-0.505132,-0.316444,73.137411,-118.532527,265.585376,
+ -0.737454,0.586957,0.334132,67.098984,-118.006827,256.271853,
+ -0.737454,0.586957,0.334132,67.502051,-120.112364,260.860164,
+ -0.737454,0.586957,0.334132,71.360741,-114.810038,260.062184,
+ -0.72123,0.58151,0.376395,71.360741,-114.810038,260.062184,
+ -0.72123,0.58151,0.376395,67.502051,-120.112364,260.860164,
+ -0.72123,0.58151,0.376395,70.777512,-117.913126,263.738735,
+ -0.543878,0.838875,-0.022036,70.777512,-117.913126,263.738735,
+ -0.543878,0.838875,-0.022036,67.502051,-120.112364,260.860164,
+ -0.543878,0.838875,-0.022036,68.732638,-119.114204,268.485851,
+ -0.66235,0.749142,0.008828,68.732638,-119.114204,268.485851,
+ -0.66235,0.749142,0.008828,67.502051,-120.112364,260.860164,
+ -0.66235,0.749142,0.008828,65.656231,-121.81602,266.943434,
+ -0.075663,-0.984502,0.158214,8.996763,14.621287,239.831875,
+ -0.075663,-0.984502,0.158214,0.020624,16.302735,246.002152,
+ -0.075663,-0.984502,0.158214,0.020624,15.154593,238.857748,
+ -0.009013,-0.968027,0.250683,8.996763,14.621287,239.831875,
+ -0.009013,-0.968027,0.250683,8.110557,16.307299,246.310636,
+ -0.009013,-0.968027,0.250683,0.020624,16.302735,246.002152,
+ 0.007055,-0.543983,-0.839067,8.423604,17.853367,237.178734,
+ 0.007055,-0.543983,-0.839067,0.020624,15.154593,238.857748,
+ 0.007055,-0.543983,-0.839067,0.020624,17.796477,237.144965,
+ 0.046871,-0.628809,-0.776146,8.423604,17.853367,237.178734,
+ 0.046871,-0.628809,-0.776146,8.996763,14.621287,239.831875,
+ 0.046871,-0.628809,-0.776146,0.020624,15.154593,238.857748,
+ 0.631838,-0.355279,0.688881,64.283723,-67.173985,387.138813,
+ 0.631838,-0.355279,0.688881,50.861498,-75.975195,394.910527,
+ 0.631838,-0.355279,0.688881,68.753234,-79.762179,376.547243,
+ 0.657304,-0.282482,0.698681,50.861498,-75.975195,394.910527,
+ 0.657304,-0.282482,0.698681,51.402834,-90.618728,388.480746,
+ 0.657304,-0.282482,0.698681,68.753234,-79.762179,376.547243,
+ 0.860433,-0.289754,0.419164,82.402806,-73.350956,352.960123,
+ 0.860433,-0.289754,0.419164,80.256677,-65.158499,363.028731,
+ 0.860433,-0.289754,0.419164,68.753234,-79.762179,376.547243,
+ 0.872745,-0.154986,0.46292,82.402806,-73.350956,352.960123,
+ 0.872745,-0.154986,0.46292,68.753234,-79.762179,376.547243,
+ 0.872745,-0.154986,0.46292,70.601214,-88.864267,370.015851,
+ 0.767764,-0.4328,0.472464,80.256677,-65.158499,363.028731,
+ 0.767764,-0.4328,0.472464,75.80202,-57.017152,377.725504,
+ 0.767764,-0.4328,0.472464,64.283723,-67.173985,387.138813,
+ 0.829323,-0.156798,0.53632,80.256677,-65.158499,363.028731,
+ 0.829323,-0.156798,0.53632,64.283723,-67.173985,387.138813,
+ 0.829323,-0.156798,0.53632,68.753234,-79.762179,376.547243,
+ 0.957669,-0.242329,0.155391,85.931626,-55.624109,342.92285,
+ 0.957669,-0.242329,0.155391,85.818333,-49.822247,352.66898,
+ 0.957669,-0.242329,0.155391,80.256677,-65.158499,363.028731,
+ 0.967266,-0.0519,0.248402,85.931626,-55.624109,342.92285,
+ 0.967266,-0.0519,0.248402,80.256677,-65.158499,363.028731,
+ 0.967266,-0.0519,0.248402,82.402806,-73.350956,352.960123,
+ 0.907714,-0.320476,0.270834,85.818333,-49.822247,352.66898,
+ 0.907714,-0.320476,0.270834,84.014678,-42.674192,367.172266,
+ 0.907714,-0.320476,0.270834,75.80202,-57.017152,377.725504,
+ 0.933434,-0.107253,0.342341,85.818333,-49.822247,352.66898,
+ 0.933434,-0.107253,0.342341,75.80202,-57.017152,377.725504,
+ 0.933434,-0.107253,0.342341,80.256677,-65.158499,363.028731,
+ 0.452457,-0.384177,0.804792,51.402834,-90.618728,388.480746,
+ 0.452457,-0.384177,0.804792,33.044174,-98.290353,395.139913,
+ 0.452457,-0.384177,0.804792,53.764071,-101.363323,382.024194,
+ 0.458344,-0.366122,0.809861,33.044174,-98.290353,395.139913,
+ 0.458344,-0.366122,0.809861,34.044464,-109.155116,389.662049,
+ 0.458344,-0.366122,0.809861,53.764071,-101.363323,382.024194,
+ 0.43733,-0.34795,0.829261,50.861498,-75.975195,394.910527,
+ 0.43733,-0.34795,0.829261,32.169529,-83.437818,401.636927,
+ 0.43733,-0.34795,0.829261,51.402834,-90.618728,388.480746,
+ 0.442397,-0.337422,0.830922,32.169529,-83.437818,401.636927,
+ 0.442397,-0.337422,0.830922,33.044174,-98.290353,395.139913,
+ 0.442397,-0.337422,0.830922,51.402834,-90.618728,388.480746,
+ 0.288762,-0.409694,0.865314,33.044174,-98.290353,395.139913,
+ 0.288762,-0.409694,0.865314,15.957111,-99.865931,400.096031,
+ 0.288762,-0.409694,0.865314,34.044464,-109.155116,389.662049,
+ 0.316274,-0.366853,0.874865,15.957111,-99.865931,400.096031,
+ 0.316274,-0.366853,0.874865,16.49285,-110.7815,395.325185,
+ 0.316274,-0.366853,0.874865,34.044464,-109.155116,389.662049,
+ 0.291535,-0.368897,0.882566,32.169529,-83.437818,401.636927,
+ 0.291535,-0.368897,0.882566,15.452403,-89.586191,404.58912,
+ 0.291535,-0.368897,0.882566,33.044174,-98.290353,395.139913,
+ 0.290074,-0.371284,0.882046,15.452403,-89.586191,404.58912,
+ 0.290074,-0.371284,0.882046,15.957111,-99.865931,400.096031,
+ 0.290074,-0.371284,0.882046,33.044174,-98.290353,395.139913,
+ 0.129264,0.842951,0.522231,29.631386,80.115612,345.945623,
+ 0.129264,0.842951,0.522231,9.658755,84.98959,343.022027,
+ 0.129264,0.842951,0.522231,24.657926,72.167143,360.006567,
+ 0.126826,0.842293,0.523887,24.657926,72.167143,360.006567,
+ 0.126826,0.842293,0.523887,9.658755,84.98959,343.022027,
+ 0.126826,0.842293,0.523887,9.959633,74.583901,359.679221,
+ 0.155686,0.881801,0.445184,30.845241,87.030631,331.824138,
+ 0.155686,0.881801,0.445184,10.339913,91.81608,329.516292,
+ 0.155686,0.881801,0.445184,29.631386,80.115612,345.945623,
+ 0.148466,0.879547,0.452056,29.631386,80.115612,345.945623,
+ 0.148466,0.879547,0.452056,10.339913,91.81608,329.516292,
+ 0.148466,0.879547,0.452056,9.658755,84.98959,343.022027,
+ 0.318185,0.840339,0.438849,47.176002,70.124581,352.356542,
+ 0.318185,0.840339,0.438849,30.845241,87.030631,331.824138,
+ 0.318185,0.840339,0.438849,29.631386,80.115612,345.945623,
+ 0.328422,0.840532,0.430865,53.588656,73.958112,339.990127,
+ 0.328422,0.840532,0.430865,30.845241,87.030631,331.824138,
+ 0.328422,0.840532,0.430865,47.176002,70.124581,352.356542,
+ 0.233557,0.808752,0.539788,39.006971,64.476657,365.320453,
+ 0.233557,0.808752,0.539788,29.631386,80.115612,345.945623,
+ 0.233557,0.808752,0.539788,24.657926,72.167143,360.006567,
+ 0.269757,0.808908,0.522397,47.176002,70.124581,352.356542,
+ 0.269757,0.808908,0.522397,29.631386,80.115612,345.945623,
+ 0.269757,0.808908,0.522397,39.006971,64.476657,365.320453,
+ 0.475041,0.740234,0.475804,63.853002,51.05002,365.381602,
+ 0.475041,0.740234,0.475804,53.588656,73.958112,339.990127,
+ 0.475041,0.740234,0.475804,47.176002,70.124581,352.356542,
+ 0.506696,0.731949,0.455533,70.750893,55.245274,350.968062,
+ 0.506696,0.731949,0.455533,53.588656,73.958112,339.990127,
+ 0.506696,0.731949,0.455533,63.853002,51.05002,365.381602,
+ 0.407338,0.715012,0.568184,51.46517,49.055526,375.795201,
+ 0.407338,0.715012,0.568184,47.176002,70.124581,352.356542,
+ 0.407338,0.715012,0.568184,39.006971,64.476657,365.320453,
+ 0.372613,0.723013,0.581731,63.853002,51.05002,365.381602,
+ 0.372613,0.723013,0.581731,47.176002,70.124581,352.356542,
+ 0.372613,0.723013,0.581731,51.46517,49.055526,375.795201,
+ 0.466299,0.566336,0.67958,63.853002,51.05002,365.381602,
+ 0.466299,0.566336,0.67958,55.014677,35.666613,384.266023,
+ 0.466299,0.566336,0.67958,68.405567,34.874717,375.737702,
+ 0.480398,0.556327,0.678025,63.853002,51.05002,365.381602,
+ 0.480398,0.556327,0.678025,51.46517,49.055526,375.795201,
+ 0.480398,0.556327,0.678025,55.014677,35.666613,384.266023,
+ 0.629266,0.569985,0.528338,70.750893,55.245274,350.968062,
+ 0.629266,0.569985,0.528338,68.405567,34.874717,375.737702,
+ 0.629266,0.569985,0.528338,79.590109,35.425972,361.821873,
+ 0.707723,0.511322,0.487522,70.750893,55.245274,350.968062,
+ 0.707723,0.511322,0.487522,63.853002,51.05002,365.381602,
+ 0.707723,0.511322,0.487522,68.405567,34.874717,375.737702,
+ 0.00161,0.848126,0.529792,9.959633,74.583901,359.679221,
+ 0.00161,0.848126,0.529792,9.658755,84.98959,343.022027,
+ 0.00161,0.848126,0.529792,0.020624,86.213485,341.092028,
+ 0.02707,0.853874,0.519775,9.959633,74.583901,359.679221,
+ 0.02707,0.853874,0.519775,0.020624,86.213485,341.092028,
+ 0.02707,0.853874,0.519775,0.020624,74.908813,359.663097,
+ -0.013233,0.892663,0.45053,10.339913,91.81608,329.516292,
+ -0.013233,0.892663,0.45053,0.020624,92.571773,327.715893,
+ -0.013233,0.892663,0.45053,9.658755,84.98959,343.022027,
+ 0.028707,0.902784,0.429135,9.658755,84.98959,343.022027,
+ 0.028707,0.902784,0.429135,0.020624,92.571773,327.715893,
+ 0.028707,0.902784,0.429135,0.020624,86.213485,341.092028,
+ 0.212898,0.279722,0.936178,13.95714,23.883397,402.693498,
+ 0.212898,0.279722,0.936178,12.48439,-3.001819,411.061493,
+ 0.212898,0.279722,0.936178,32.892366,-0.225468,405.590931,
+ 0.192414,0.264687,0.944943,13.95714,23.883397,402.693498,
+ 0.192414,0.264687,0.944943,32.892366,-0.225468,405.590931,
+ 0.192414,0.264687,0.944943,36.944938,21.200443,398.764137,
+ 0.281223,0.176359,0.943298,12.48439,-3.001819,411.061493,
+ 0.281223,0.176359,0.943298,16.069065,-24.589881,414.028897,
+ 0.281223,0.176359,0.943298,31.863175,-22.322498,408.896328,
+ 0.239748,0.132694,0.961724,32.892366,-0.225468,405.590931,
+ 0.239748,0.132694,0.961724,12.48439,-3.001819,411.061493,
+ 0.239748,0.132694,0.961724,31.863175,-22.322498,408.896328,
+ 0.358523,0.09711,0.928456,32.892366,-0.225468,405.590931,
+ 0.358523,0.09711,0.928456,46.389887,-21.686364,402.623527,
+ 0.358523,0.09711,0.928456,48.474949,-1.420461,399.698714,
+ 0.389258,0.118512,0.913473,32.892366,-0.225468,405.590931,
+ 0.389258,0.118512,0.913473,31.863175,-22.322498,408.896328,
+ 0.389258,0.118512,0.913473,46.389887,-21.686364,402.623527,
+ 0.061561,0.145943,0.987376,12.48439,-3.001819,411.061493,
+ 0.061561,0.145943,0.987376,0.020624,-4.192857,412.014627,
+ 0.061561,0.145943,0.987376,16.069065,-24.589881,414.028897,
+ 0.088505,0.166615,0.982042,0.020624,-4.192857,412.014627,
+ 0.088505,0.166615,0.982042,0.020624,-23.083363,415.219631,
+ 0.088505,0.166615,0.982042,16.069065,-24.589881,414.028897,
+ 0.053503,0.294088,0.95428,13.95714,23.883397,402.693498,
+ 0.053503,0.294088,0.95428,0.020624,22.350715,403.947207,
+ 0.053503,0.294088,0.95428,12.48439,-3.001819,411.061493,
+ 0.954528,-0.20842,-0.213162,20.500093,1.130156,253.294105,
+ 0.954528,-0.20842,-0.213162,21.566703,-7.275867,266.289351,
+ 0.954528,-0.20842,-0.213162,20.874289,-3.750211,259.741531,
+ 0.103158,-0.565232,-0.818457,8.110557,16.307299,246.310636,
+ 0.103158,-0.565232,-0.818457,7.931977,7.801795,252.162086,
+ 0.103158,-0.565232,-0.818457,0.020624,7.191825,251.58619,
+ 0.032788,-0.522276,-0.852146,8.110557,16.307299,246.310636,
+ 0.032788,-0.522276,-0.852146,0.020624,7.191825,251.58619,
+ 0.032788,-0.522276,-0.852146,0.020624,16.302735,246.002152,
+ 0.17635,-0.560424,-0.809213,7.931977,7.801795,252.162086,
+ 0.17635,-0.560424,-0.809213,7.753093,-0.704013,258.013841,
+ 0.17635,-0.560424,-0.809213,0.020624,-1.919085,257.170227,
+ 0.101822,-0.519841,-0.848173,7.931977,7.801795,252.162086,
+ 0.101822,-0.519841,-0.848173,0.020624,-1.919085,257.170227,
+ 0.101822,-0.519841,-0.848173,0.020624,7.191825,251.58619,
+ 0.250075,-0.552336,-0.795228,7.753093,-0.704013,258.013841,
+ 0.250075,-0.552336,-0.795228,7.574514,-9.209517,263.865292,
+ 0.250075,-0.552336,-0.795228,0.020624,-11.029995,262.754265,
+ 0.172508,-0.514723,-0.839822,7.753093,-0.704013,258.013841,
+ 0.172508,-0.514723,-0.839822,0.020624,-11.029995,262.754265,
+ 0.172508,-0.514723,-0.839822,0.020624,-1.919085,257.170227,
+ 0.323067,-0.540975,-0.776514,7.574514,-9.209517,263.865292,
+ 0.323067,-0.540975,-0.776514,7.395934,-17.715324,269.716743,
+ 0.323067,-0.540975,-0.776514,0.020624,-20.141209,268.338302,
+ 0.243754,-0.506783,-0.826895,7.574514,-9.209517,263.865292,
+ 0.243754,-0.506783,-0.826895,0.020624,-20.141209,268.338302,
+ 0.243754,-0.506783,-0.826895,0.020624,-11.029995,262.754265,
+ 0.218131,-0.59032,-0.777137,7.395934,-17.715324,269.716743,
+ 0.218131,-0.59032,-0.777137,7.310447,-25.34162,275.485748,
+ 0.218131,-0.59032,-0.777137,0.020624,-26.046812,273.975275,
+ 0.340636,-0.64917,-0.680107,7.395934,-17.715324,269.716743,
+ 0.340636,-0.64917,-0.680107,0.020624,-26.046812,273.975275,
+ 0.340636,-0.64917,-0.680107,0.020624,-20.141209,268.338302,
+ -0.106244,-0.795778,-0.596196,20.874289,-3.750211,259.741531,
+ -0.106244,-0.795778,-0.596196,7.753093,-0.704013,258.013841,
+ -0.106244,-0.795778,-0.596196,20.500093,1.130156,253.294105,
+ 0.211317,-0.426798,-0.879311,21.566703,-7.275867,266.289351,
+ 0.211317,-0.426798,-0.879311,18.513812,-14.440958,269.033455,
+ 0.211317,-0.426798,-0.879311,7.574514,-9.209517,263.865292,
+ 0.541231,0.212433,-0.813598,8.110557,16.307299,246.310636,
+ 0.541231,0.212433,-0.813598,13.53366,13.15158,249.094288,
+ 0.541231,0.212433,-0.813598,18.576786,8.245658,251.168186,
+ -0.053295,-0.565221,-0.823216,8.110557,16.307299,246.310636,
+ -0.053295,-0.565221,-0.823216,18.576786,8.245658,251.168186,
+ -0.053295,-0.565221,-0.823216,7.931977,7.801795,252.162086,
+ -0.143523,-0.877617,-0.457373,21.566703,-7.275867,266.289351,
+ -0.143523,-0.877617,-0.457373,7.753093,-0.704013,258.013841,
+ -0.143523,-0.877617,-0.457373,20.874289,-3.750211,259.741531,
+ 0.2159,-0.556492,-0.802312,7.753093,-0.704013,258.013841,
+ 0.2159,-0.556492,-0.802312,21.566703,-7.275867,266.289351,
+ 0.2159,-0.556492,-0.802312,7.574514,-9.209517,263.865292,
+ 0.213953,-0.422639,-0.880682,7.574514,-9.209517,263.865292,
+ 0.213953,-0.422639,-0.880682,18.513812,-14.440958,269.033455,
+ 0.213953,-0.422639,-0.880682,15.597518,-19.09772,270.559748,
+ -0.010811,-0.566585,-0.823932,7.574514,-9.209517,263.865292,
+ -0.010811,-0.566585,-0.823932,15.597518,-19.09772,270.559748,
+ -0.010811,-0.566585,-0.823932,7.395934,-17.715324,269.716743,
+ -0.075974,-0.304239,-0.949561,18.576786,8.245658,251.168186,
+ -0.075974,-0.304239,-0.949561,20.500093,1.130156,253.294105,
+ -0.075974,-0.304239,-0.949561,7.931977,7.801795,252.162086,
+ -0.219295,-0.549862,-0.805954,7.931977,7.801795,252.162086,
+ -0.219295,-0.549862,-0.805954,20.500093,1.130156,253.294105,
+ -0.219295,-0.549862,-0.805954,7.753093,-0.704013,258.013841,
+ -0.019675,-0.603036,-0.797471,7.395934,-17.715324,269.716743,
+ -0.019675,-0.603036,-0.797471,15.597518,-19.09772,270.559748,
+ -0.019675,-0.603036,-0.797471,7.310447,-25.34162,275.485748,
+ 0.313074,-0.808566,-0.498202,15.597518,-19.09772,270.559748,
+ 0.313074,-0.808566,-0.498202,11.713182,-23.591721,275.41243,
+ 0.313074,-0.808566,-0.498202,7.310447,-25.34162,275.485748,
+ -0.358439,-0.87346,-0.329528,47.225287,-103.012827,298.810931,
+ -0.358439,-0.87346,-0.329528,35.773979,-96.666708,294.445617,
+ -0.358439,-0.87346,-0.329528,41.418861,-97.706547,291.061729,
+ -0.557791,-0.663665,0.498415,47.225287,-103.012827,298.810931,
+ -0.557791,-0.663665,0.498415,37.453906,-91.974048,302.574186,
+ -0.557791,-0.663665,0.498415,35.773979,-96.666708,294.445617,
+ -0.596574,-0.675707,0.433036,47.225287,-103.012827,298.810931,
+ -0.596574,-0.675707,0.433036,47.125501,-94.706895,311.633987,
+ -0.596574,-0.675707,0.433036,37.453906,-91.974048,302.574186,
+ -0.402634,-0.901649,0.157846,47.125501,-94.706895,311.633987,
+ -0.402634,-0.901649,0.157846,40.05837,-91.309622,313.013035,
+ -0.402634,-0.901649,0.157846,37.453906,-91.974048,302.574186,
+ -0.117449,-0.92739,0.355181,31.949879,-90.152048,293.460234,
+ -0.117449,-0.92739,0.355181,30.858322,-88.9315,296.286174,
+ -0.117449,-0.92739,0.355181,28.273937,-89.845086,293.046185,
+ -0.417017,-0.731837,0.538992,30.858322,-88.9315,296.286174,
+ -0.417017,-0.731837,0.538992,28.014129,-88.185542,295.098482,
+ -0.417017,-0.731837,0.538992,28.273937,-89.845086,293.046185,
+ -0.86324,-0.486178,0.135821,31.949879,-90.152048,293.460234,
+ -0.86324,-0.486178,0.135821,35.773979,-96.666708,294.445617,
+ -0.86324,-0.486178,0.135821,32.359974,-89.102474,299.823694,
+ -0.502031,-0.847544,0.172145,32.359974,-89.102474,299.823694,
+ -0.502031,-0.847544,0.172145,30.858322,-88.9315,296.286174,
+ -0.502031,-0.847544,0.172145,31.949879,-90.152048,293.460234,
+ -0.573124,-0.796253,0.193674,40.05837,-91.309622,313.013035,
+ -0.573124,-0.796253,0.193674,35.309733,-88.00392,312.551527,
+ -0.573124,-0.796253,0.193674,37.453906,-91.974048,302.574186,
+ -0.769592,-0.63267,0.08636,37.453906,-91.974048,302.574186,
+ -0.769592,-0.63267,0.08636,35.309733,-88.00392,312.551527,
+ -0.769592,-0.63267,0.08636,32.300346,-85.488594,304.160716,
+ -0.614179,-0.610408,0.500186,32.359974,-89.102474,299.823694,
+ -0.614179,-0.610408,0.500186,37.453906,-91.974048,302.574186,
+ -0.614179,-0.610408,0.500186,32.300346,-85.488594,304.160716,
+ -0.613378,-0.622462,0.486116,37.453906,-91.974048,302.574186,
+ -0.613378,-0.622462,0.486116,32.359974,-89.102474,299.823694,
+ -0.613378,-0.622462,0.486116,35.773979,-96.666708,294.445617,
+ 0.638075,-0.557232,0.531369,28.273937,-89.845086,293.046185,
+ 0.638075,-0.557232,0.531369,28.014129,-88.185542,295.098482,
+ 0.638075,-0.557232,0.531369,24.4976,-90.980755,296.389914,
+ 0.622934,-0.602558,0.498875,28.273937,-89.845086,293.046185,
+ 0.622934,-0.602558,0.498875,24.4976,-90.980755,296.389914,
+ 0.622934,-0.602558,0.498875,24.044306,-92.740997,294.829852,
+ 0.625265,-0.696938,0.35117,28.928323,-90.852069,289.882556,
+ 0.625265,-0.696938,0.35117,28.273937,-89.845086,293.046185,
+ 0.625265,-0.696938,0.35117,24.044306,-92.740997,294.829852,
+ 0.734682,-0.273117,0.621006,28.928323,-90.852069,289.882556,
+ 0.734682,-0.273117,0.621006,24.044306,-92.740997,294.829852,
+ 0.734682,-0.273117,0.621006,25.92928,-95.778981,291.263734,
+ 0.513167,-0.500261,0.697423,19.885864,-92.611094,297.982833,
+ 0.513167,-0.500261,0.697423,25.92928,-95.778981,291.263734,
+ 0.513167,-0.500261,0.697423,24.044306,-92.740997,294.829852,
+ 0.72084,-0.084064,0.687985,25.92928,-95.778981,291.263734,
+ 0.72084,-0.084064,0.687985,19.885864,-92.611094,297.982833,
+ 0.72084,-0.084064,0.687985,20.393614,-96.799654,296.939039,
+ 0.690238,-0.571304,0.444054,24.044306,-92.740997,294.829852,
+ 0.690238,-0.571304,0.444054,24.4976,-90.980755,296.389914,
+ 0.690238,-0.571304,0.444054,22.114611,-90.640633,300.531624,
+ 0.287944,-0.862902,0.415318,24.044306,-92.740997,294.829852,
+ 0.287944,-0.862902,0.415318,22.114611,-90.640633,300.531624,
+ 0.287944,-0.862902,0.415318,19.885864,-92.611094,297.982833,
+ 0.551147,-0.820391,0.1523,22.114611,-90.640633,300.531624,
+ 0.551147,-0.820391,0.1523,21.224451,-90.158133,306.352044,
+ 0.551147,-0.820391,0.1523,19.885864,-92.611094,297.982833,
+ 0.887333,-0.461079,-0.006782,19.885864,-92.611094,297.982833,
+ 0.887333,-0.461079,-0.006782,21.224451,-90.158133,306.352044,
+ 0.887333,-0.461079,-0.006782,19.734056,-93.012061,305.380351,
+ 0.993152,0.113777,0.026548,20.393614,-96.799654,296.939039,
+ 0.993152,0.113777,0.026548,19.885864,-92.611094,297.982833,
+ 0.993152,0.113777,0.026548,19.734056,-93.012061,305.380351,
+ 0.988513,-0.093137,0.119028,20.393614,-96.799654,296.939039,
+ 0.988513,-0.093137,0.119028,19.734056,-93.012061,305.380351,
+ 0.988513,-0.093137,0.119028,19.337651,-97.266334,305.34354,
+ -0.080956,-0.64094,-0.76331,8.423604,17.853367,237.178734,
+ -0.080956,-0.64094,-0.76331,18.217802,12.897552,240.301293,
+ -0.080956,-0.64094,-0.76331,8.996763,14.621287,239.831875,
+ -0.060905,-0.552235,-0.831461,8.996763,14.621287,239.831875,
+ -0.060905,-0.552235,-0.831461,18.217802,12.897552,240.301293,
+ -0.060905,-0.552235,-0.831461,14.793757,10.567194,242.099867,
+ -0.60069,-0.789902,0.123395,14.793757,10.567194,242.099867,
+ -0.60069,-0.789902,0.123395,8.110557,16.307299,246.310636,
+ -0.60069,-0.789902,0.123395,8.996763,14.621287,239.831875,
+ -0.565911,-0.801288,0.194117,14.793757,10.567194,242.099867,
+ -0.565911,-0.801288,0.194117,13.53366,13.15158,249.094288,
+ -0.565911,-0.801288,0.194117,8.110557,16.307299,246.310636,
+ -0.793163,-0.60371,0.080172,14.793757,10.567194,242.099867,
+ -0.793163,-0.60371,0.080172,19.256728,5.072294,244.87561,
+ -0.793163,-0.60371,0.080172,13.53366,13.15158,249.094288,
+ -0.725935,-0.642438,0.245543,19.256728,5.072294,244.87561,
+ -0.725935,-0.642438,0.245543,18.576786,8.245658,251.168186,
+ -0.725935,-0.642438,0.245543,13.53366,13.15158,249.094288,
+ -0.085344,-0.527145,-0.845479,18.217802,12.897552,240.301293,
+ -0.085344,-0.527145,-0.845479,22.608063,6.502757,243.845202,
+ -0.085344,-0.527145,-0.845479,14.793757,10.567194,242.099867,
+ -0.059389,-0.488101,-0.870764,14.793757,10.567194,242.099867,
+ -0.059389,-0.488101,-0.870764,22.608063,6.502757,243.845202,
+ -0.059389,-0.488101,-0.870764,19.256728,5.072294,244.87561,
+ -0.193811,-0.232479,-0.953096,22.608063,6.502757,243.845202,
+ -0.193811,-0.232479,-0.953096,24.298029,-1.622466,245.48345,
+ -0.193811,-0.232479,-0.953096,19.256728,5.072294,244.87561,
+ 0.245618,0.097389,-0.964462,19.256728,5.072294,244.87561,
+ 0.245618,0.097389,-0.964462,24.298029,-1.622466,245.48345,
+ 0.245618,0.097389,-0.964462,22.608063,-3.307565,244.882911,
+ -0.92504,-0.369873,0.086573,19.256728,5.072294,244.87561,
+ -0.92504,-0.369873,0.086573,22.608063,-3.307565,244.882911,
+ -0.92504,-0.369873,0.086573,18.576786,8.245658,251.168186,
+ -0.954499,-0.284606,-0.089054,22.608063,-3.307565,244.882911,
+ -0.954499,-0.284606,-0.089054,20.500093,1.130156,253.294105,
+ -0.954499,-0.284606,-0.089054,18.576786,8.245658,251.168186,
+ -0.940091,0.141414,-0.31021,22.167546,-9.003557,243.621293,
+ -0.940091,0.141414,-0.31021,20.500093,1.130156,253.294105,
+ -0.940091,0.141414,-0.31021,22.608063,-3.307565,244.882911,
+ -0.988,-0.154207,-0.008762,22.167546,-9.003557,243.621293,
+ -0.988,-0.154207,-0.008762,21.938161,-7.895267,249.981102,
+ -0.988,-0.154207,-0.008762,20.500093,1.130156,253.294105,
+ 0.117272,0.226947,-0.966821,24.298029,-1.622466,245.48345,
+ 0.117272,0.226947,-0.966821,24.292249,-8.708763,243.819343,
+ 0.117272,0.226947,-0.966821,22.608063,-3.307565,244.882911,
+ 0.061611,0.211296,-0.975478,22.608063,-3.307565,244.882911,
+ 0.061611,0.211296,-0.975478,24.292249,-8.708763,243.819343,
+ 0.061611,0.211296,-0.975478,22.167546,-9.003557,243.621293,
+ 0.136872,-0.368848,-0.919357,24.292249,-8.708763,243.819343,
+ 0.136872,-0.368848,-0.919357,19.281674,-20.402234,247.764828,
+ 0.136872,-0.368848,-0.919357,22.167546,-9.003557,243.621293,
+ 0.628523,-0.401319,-0.66626,22.167546,-9.003557,243.621293,
+ 0.628523,-0.401319,-0.66626,19.281674,-20.402234,247.764828,
+ 0.628523,-0.401319,-0.66626,17.382706,-20.176195,245.837263,
+ -0.921695,0.375168,-0.098622,22.167546,-9.003557,243.621293,
+ -0.921695,0.375168,-0.098622,17.382706,-20.176195,245.837263,
+ -0.921695,0.375168,-0.098622,21.938161,-7.895267,249.981102,
+ -0.933066,0.357981,-0.035186,17.382706,-20.176195,245.837263,
+ -0.933066,0.357981,-0.035186,18.070253,-17.600936,253.805506,
+ -0.933066,0.357981,-0.035186,21.938161,-7.895267,249.981102,
+ -0.80221,0.584897,-0.119814,17.382706,-20.176195,245.837263,
+ -0.80221,0.584897,-0.119814,13.358731,-24.692405,250.732841,
+ -0.80221,0.584897,-0.119814,18.070253,-17.600936,253.805506,
+ -0.846129,0.526632,0.082002,13.358731,-24.692405,250.732841,
+ -0.846129,0.526632,0.082002,16.170676,-21.318557,258.080162,
+ -0.846129,0.526632,0.082002,18.070253,-17.600936,253.805506,
+ 0.495268,-0.659675,-0.565278,19.281674,-20.402234,247.764828,
+ 0.495268,-0.659675,-0.565278,17.039237,-24.388485,250.452041,
+ 0.495268,-0.659675,-0.565278,17.382706,-20.176195,245.837263,
+ 0.009613,-0.738903,-0.673743,17.382706,-20.176195,245.837263,
+ 0.009613,-0.738903,-0.673743,17.039237,-24.388485,250.452041,
+ 0.009613,-0.738903,-0.673743,13.358731,-24.692405,250.732841,
+ -0.03048,-0.453739,-0.890613,17.039237,-24.388485,250.452041,
+ -0.03048,-0.453739,-0.890613,11.777069,-29.59498,253.284674,
+ -0.03048,-0.453739,-0.890613,13.358731,-24.692405,250.732841,
+ 0.694968,-0.495449,-0.521104,13.358731,-24.692405,250.732841,
+ 0.694968,-0.495449,-0.521104,11.777069,-29.59498,253.284674,
+ 0.694968,-0.495449,-0.521104,11.422343,-27.88311,251.184005,
+ -0.846725,0.525561,0.082722,13.358731,-24.692405,250.732841,
+ -0.846725,0.525561,0.082722,11.422343,-27.88311,251.184005,
+ -0.846725,0.525561,0.082722,16.170676,-21.318557,258.080162,
+ -0.655301,0.718589,-0.23283,16.170676,-21.318557,258.080162,
+ -0.655301,0.718589,-0.23283,11.422343,-27.88311,251.184005,
+ -0.655301,0.718589,-0.23283,11.2176,-26.156941,257.087782,
+ -0.726773,0.652078,-0.215861,11.422343,-27.88311,251.184005,
+ -0.726773,0.652078,-0.215861,6.243228,-33.060399,252.981667,
+ -0.726773,0.652078,-0.215861,11.2176,-26.156941,257.087782,
+ -0.550699,0.682574,-0.480441,11.2176,-26.156941,257.087782,
+ -0.550699,0.682574,-0.480441,6.243228,-33.060399,252.981667,
+ -0.550699,0.682574,-0.480441,5.516132,-30.824959,256.991039,
+ 0.331976,-0.703005,-0.628949,11.777069,-29.59498,253.284674,
+ 0.331976,-0.703005,-0.628949,6.60343,-34.282468,255.793308,
+ 0.331976,-0.703005,-0.628949,11.422343,-27.88311,251.184005,
+ 0.581851,-0.715995,-0.385746,11.422343,-27.88311,251.184005,
+ 0.581851,-0.715995,-0.385746,6.60343,-34.282468,255.793308,
+ 0.581851,-0.715995,-0.385746,6.243228,-33.060399,252.981667,
+ 0.176997,-0.894145,-0.411312,6.60343,-34.282468,255.793308,
+ 0.176997,-0.894145,-0.411312,0.020624,-36.4525,257.677978,
+ 0.176997,-0.894145,-0.411312,6.243228,-33.060399,252.981667,
+ 0.33067,-0.916769,-0.224036,6.243228,-33.060399,252.981667,
+ 0.33067,-0.916769,-0.224036,0.020624,-36.4525,257.677978,
+ 0.33067,-0.916769,-0.224036,0.020624,-35.329,253.08054,
+ -0.30263,0.808063,-0.50542,6.243228,-33.060399,252.981667,
+ -0.30263,0.808063,-0.50542,0.020624,-35.329,253.08054,
+ -0.30263,0.808063,-0.50542,5.516132,-30.824959,256.991039,
+ -0.46155,0.831521,-0.309104,5.516132,-30.824959,256.991039,
+ -0.46155,0.831521,-0.309104,0.020624,-35.329,253.08054,
+ -0.46155,0.831521,-0.309104,0.020624,-33.217379,258.761016,
+ -0.469056,0.798886,-0.37652,5.516132,-30.824959,256.991039,
+ -0.469056,0.798886,-0.37652,0.020624,-33.217379,258.761016,
+ -0.469056,0.798886,-0.37652,0.020624,-26.046812,273.975275,
+ -0.034555,0.959086,-0.280999,7.310447,-25.34162,275.485748,
+ -0.034555,0.959086,-0.280999,5.516132,-30.824959,256.991039,
+ -0.034555,0.959086,-0.280999,0.020624,-26.046812,273.975275,
+ -0.622998,0.764368,-0.166179,11.2176,-26.156941,257.087782,
+ -0.622998,0.764368,-0.166179,5.516132,-30.824959,256.991039,
+ -0.622998,0.764368,-0.166179,7.310447,-25.34162,275.485748,
+ -0.368436,0.921992,-0.119103,11.713182,-23.591721,275.41243,
+ -0.368436,0.921992,-0.119103,11.2176,-26.156941,257.087782,
+ -0.368436,0.921992,-0.119103,7.310447,-25.34162,275.485748,
+ -0.687912,0.721108,-0.082342,16.170676,-21.318557,258.080162,
+ -0.687912,0.721108,-0.082342,11.2176,-26.156941,257.087782,
+ -0.687912,0.721108,-0.082342,11.713182,-23.591721,275.41243,
+ -0.817825,0.558916,-0.137024,16.170676,-21.318557,258.080162,
+ -0.817825,0.558916,-0.137024,11.713182,-23.591721,275.41243,
+ -0.817825,0.558916,-0.137024,15.597518,-19.09772,270.559748,
+ -0.929455,0.353501,-0.105596,18.070253,-17.600936,253.805506,
+ -0.929455,0.353501,-0.105596,16.170676,-21.318557,258.080162,
+ -0.929455,0.353501,-0.105596,15.597518,-19.09772,270.559748,
+ -0.856453,0.509853,-0.080854,18.070253,-17.600936,253.805506,
+ -0.856453,0.509853,-0.080854,15.597518,-19.09772,270.559748,
+ -0.856453,0.509853,-0.080854,18.513812,-14.440958,269.033455,
+ -0.93409,0.354027,-0.046257,21.938161,-7.895267,249.981102,
+ -0.93409,0.354027,-0.046257,18.070253,-17.600936,253.805506,
+ -0.93409,0.354027,-0.046257,18.513812,-14.440958,269.033455,
+ -0.924223,0.380199,-0.035492,21.938161,-7.895267,249.981102,
+ -0.924223,0.380199,-0.035492,18.513812,-14.440958,269.033455,
+ -0.924223,0.380199,-0.035492,21.566703,-7.275867,266.289351,
+ -0.988342,-0.151324,-0.016764,21.938161,-7.895267,249.981102,
+ -0.988342,-0.151324,-0.016764,21.566703,-7.275867,266.289351,
+ -0.988342,-0.151324,-0.016764,20.500093,1.130156,253.294105,
+ 0.173592,-0.905436,-0.387364,14.811706,-149.682055,320.125496,
+ 0.173592,-0.905436,-0.387364,12.850676,-154.782072,331.167622,
+ 0.173592,-0.905436,-0.387364,7.004702,-152.189472,322.487798,
+ 0.226115,-0.898999,-0.375063,18.935771,-150.864271,325.445467,
+ 0.226115,-0.898999,-0.375063,12.850676,-154.782072,331.167622,
+ 0.226115,-0.898999,-0.375063,14.811706,-149.682055,320.125496,
+ 0.274215,-0.633124,-0.723851,33.950458,-145.813539,327.828152,
+ 0.274215,-0.633124,-0.723851,24.877576,-150.488858,328.480409,
+ 0.274215,-0.633124,-0.723851,26.087781,-145.864953,324.894516,
+ 0.303469,-0.681774,-0.665651,34.34595,-148.028292,330.276853,
+ 0.303469,-0.681774,-0.665651,24.877576,-150.488858,328.480409,
+ 0.303469,-0.681774,-0.665651,33.950458,-145.813539,327.828152,
+ 0.368229,-0.677072,-0.637167,24.877576,-150.488858,328.480409,
+ 0.368229,-0.677072,-0.637167,18.935771,-150.864271,325.445467,
+ 0.368229,-0.677072,-0.637167,22.657956,-145.419873,321.811203,
+ 0.48334,-0.611972,-0.625998,22.657956,-145.419873,321.811203,
+ 0.48334,-0.611972,-0.625998,26.087781,-145.864953,324.894516,
+ 0.48334,-0.611972,-0.625998,24.877576,-150.488858,328.480409,
+ 0.557673,-0.606206,-0.567023,18.935771,-150.864271,325.445467,
+ 0.557673,-0.606206,-0.567023,14.811706,-149.682055,320.125496,
+ 0.557673,-0.606206,-0.567023,17.61057,-142.804152,315.525016,
+ 0.404273,-0.682697,-0.608678,22.657956,-145.419873,321.811203,
+ 0.404273,-0.682697,-0.608678,18.935771,-150.864271,325.445467,
+ 0.404273,-0.682697,-0.608678,17.61057,-142.804152,315.525016,
+ 0.82366,-0.538883,-0.176606,72.680618,-121.573249,304.075838,
+ 0.82366,-0.538883,-0.176606,75.196645,-118.401102,306.130873,
+ 0.82366,-0.538883,-0.176606,71.719756,-125.344414,311.101594,
+ 0.816288,-0.545266,-0.190678,75.196645,-118.401102,306.130873,
+ 0.816288,-0.545266,-0.190678,73.811876,-122.585403,312.168205,
+ 0.816288,-0.545266,-0.190678,71.719756,-125.344414,311.101594,
+ 0.984758,-0.012472,0.173483,75.530217,-114.441014,279.957846,
+ 0.984758,-0.012472,0.173483,73.95687,-115.657303,288.801343,
+ 0.984758,-0.012472,0.173483,73.951454,-116.757682,288.752971,
+ 0.96875,-0.201501,0.144637,75.530217,-114.441014,279.957846,
+ 0.96875,-0.201501,0.144637,75.725459,-113.35037,280.169586,
+ 0.96875,-0.201501,0.144637,73.95687,-115.657303,288.801343,
+ 0.973,-0.095073,-0.210316,73.951454,-116.757682,288.752971,
+ 0.973,-0.095073,-0.210316,75.911754,-115.139513,297.090543,
+ 0.973,-0.095073,-0.210316,75.828257,-116.18787,297.178159,
+ 0.973212,0.005315,-0.229849,73.951454,-116.757682,288.752971,
+ 0.973212,0.005315,-0.229849,73.95687,-115.657303,288.801343,
+ 0.973212,0.005315,-0.229849,75.911754,-115.139513,297.090543,
+ 0.997055,-0.05027,0.057915,75.828257,-116.18787,297.178159,
+ 0.997055,-0.05027,0.057915,75.264578,-116.71935,306.421103,
+ 0.997055,-0.05027,0.057915,75.196645,-118.401102,306.130873,
+ 0.995617,-0.074581,0.056429,75.911754,-115.139513,297.090543,
+ 0.995617,-0.074581,0.056429,75.264578,-116.71935,306.421103,
+ 0.995617,-0.074581,0.056429,75.828257,-116.18787,297.178159,
+ 0.920871,-0.384625,0.063718,72.474841,-121.837316,279.430929,
+ 0.920871,-0.384625,0.063718,73.951454,-116.757682,288.752971,
+ 0.920871,-0.384625,0.063718,72.412749,-120.420543,288.880441,
+ 0.920742,-0.384906,0.063892,73.951454,-116.757682,288.752971,
+ 0.920742,-0.384906,0.063892,72.474841,-121.837316,279.430929,
+ 0.920742,-0.384906,0.063892,75.530217,-114.441014,279.957846,
+ 0.812072,-0.582371,-0.037197,72.412749,-120.420543,288.880441,
+ 0.812072,-0.582371,-0.037197,75.828257,-116.18787,297.178159,
+ 0.812072,-0.582371,-0.037197,72.953051,-120.186595,297.01327,
+ 0.905439,-0.386469,-0.175559,73.951454,-116.757682,288.752971,
+ 0.905439,-0.386469,-0.175559,75.828257,-116.18787,297.178159,
+ 0.905439,-0.386469,-0.175559,72.412749,-120.420543,288.880441,
+ 0.810748,-0.57955,-0.082514,72.953051,-120.186595,297.01327,
+ 0.810748,-0.57955,-0.082514,75.828257,-116.18787,297.178159,
+ 0.810748,-0.57955,-0.082514,72.680618,-121.573249,304.075838,
+ 0.807258,-0.5837,-0.087347,75.828257,-116.18787,297.178159,
+ 0.807258,-0.5837,-0.087347,75.196645,-118.401102,306.130873,
+ 0.807258,-0.5837,-0.087347,72.680618,-121.573249,304.075838,
+ 0.423941,-0.882773,-0.20245,43.044332,-144.891739,334.814967,
+ 0.423941,-0.882773,-0.20245,34.208136,-150.002099,338.594955,
+ 0.423941,-0.882773,-0.20245,34.34595,-148.028292,330.276853,
+ 0.357636,-0.932975,-0.040662,43.044332,-144.891739,334.814967,
+ 0.357636,-0.932975,-0.040662,34.34595,-148.028292,330.276853,
+ 0.357636,-0.932975,-0.040662,41.902274,-145.162499,330.982654,
+ 0.151659,-0.720759,-0.676392,40.643698,-143.610346,326.981191,
+ 0.151659,-0.720759,-0.676392,34.34595,-148.028292,330.276853,
+ 0.151659,-0.720759,-0.676392,33.950458,-145.813539,327.828152,
+ 0.354721,-0.828661,-0.433005,41.902274,-145.162499,330.982654,
+ 0.354721,-0.828661,-0.433005,34.34595,-148.028292,330.276853,
+ 0.354721,-0.828661,-0.433005,40.643698,-143.610346,326.981191,
+ 0.297494,-0.911549,-0.283859,50.371696,-140.535551,327.302452,
+ 0.297494,-0.911549,-0.283859,40.643698,-143.610346,326.981191,
+ 0.297494,-0.911549,-0.283859,49.56967,-139.793852,324.080108,
+ 0.285722,-0.85973,-0.423354,50.371696,-140.535551,327.302452,
+ 0.285722,-0.85973,-0.423354,41.902274,-145.162499,330.982654,
+ 0.285722,-0.85973,-0.423354,40.643698,-143.610346,326.981191,
+ 0.305873,-0.922201,-0.236614,59.433839,-136.145898,322.613747,
+ 0.305873,-0.922201,-0.236614,49.56967,-139.793852,324.080108,
+ 0.305873,-0.922201,-0.236614,58.788336,-135.79604,320.415726,
+ 0.295273,-0.912383,-0.283499,59.433839,-136.145898,322.613747,
+ 0.295273,-0.912383,-0.283499,50.371696,-140.535551,327.302452,
+ 0.295273,-0.912383,-0.283499,49.56967,-139.793852,324.080108,
+ 0.510639,-0.854883,-0.091775,50.766945,-139.76921,330.067547,
+ 0.510639,-0.854883,-0.091775,43.044332,-144.891739,334.814967,
+ 0.510639,-0.854883,-0.091775,41.902274,-145.162499,330.982654,
+ 0.525099,-0.836478,0.15677,50.766945,-139.76921,330.067547,
+ 0.525099,-0.836478,0.15677,41.902274,-145.162499,330.982654,
+ 0.525099,-0.836478,0.15677,50.371696,-140.535551,327.302452,
+ 0.558945,-0.816195,0.14631,58.917753,-134.892798,326.132405,
+ 0.558945,-0.816195,0.14631,50.766945,-139.76921,330.067547,
+ 0.558945,-0.816195,0.14631,50.371696,-140.535551,327.302452,
+ 0.54897,-0.758703,0.350715,59.433839,-136.145898,322.613747,
+ 0.54897,-0.758703,0.350715,58.917753,-134.892798,326.132405,
+ 0.54897,-0.758703,0.350715,50.371696,-140.535551,327.302452,
+ 0.664894,-0.667484,0.335232,68.127536,-128.90536,319.787503,
+ 0.664894,-0.667484,0.335232,58.917753,-134.892798,326.132405,
+ 0.664894,-0.667484,0.335232,59.433839,-136.145898,322.613747,
+ 0.66398,-0.723479,0.188966,68.127536,-128.90536,319.787503,
+ 0.66398,-0.723479,0.188966,59.433839,-136.145898,322.613747,
+ 0.66398,-0.723479,0.188966,67.177748,-130.522616,316.932966,
+ 0.467069,-0.841627,-0.271128,65.854707,-130.078449,314.840511,
+ 0.467069,-0.841627,-0.271128,59.433839,-136.145898,322.613747,
+ 0.467069,-0.841627,-0.271128,58.788336,-135.79604,320.415726,
+ 0.33388,-0.856791,-0.392981,67.177748,-130.522616,316.932966,
+ 0.33388,-0.856791,-0.392981,59.433839,-136.145898,322.613747,
+ 0.33388,-0.856791,-0.392981,65.854707,-130.078449,314.840511,
+ 0.255797,-0.832447,-0.491528,70.590445,-126.33436,310.964085,
+ 0.255797,-0.832447,-0.491528,65.854707,-130.078449,314.840511,
+ 0.255797,-0.832447,-0.491528,68.62692,-126.023747,309.416191,
+ 0.345333,-0.849582,-0.398693,70.590445,-126.33436,310.964085,
+ 0.345333,-0.849582,-0.398693,67.177748,-130.522616,316.932966,
+ 0.345333,-0.849582,-0.398693,65.854707,-130.078449,314.840511,
+ 0.454876,-0.862778,-0.220685,70.818157,-123.16921,302.772845,
+ 0.454876,-0.862778,-0.220685,68.62692,-126.023747,309.416191,
+ 0.454876,-0.862778,-0.220685,68.730387,-124.093443,302.082864,
+ 0.132647,-0.925776,-0.354039,70.818157,-123.16921,302.772845,
+ 0.132647,-0.925776,-0.354039,70.590445,-126.33436,310.964085,
+ 0.132647,-0.925776,-0.354039,68.62692,-126.023747,309.416191,
+ 0.639316,-0.767482,0.047396,70.703008,-122.742383,297.352176,
+ 0.639316,-0.767482,0.047396,68.730387,-124.093443,302.082864,
+ 0.639316,-0.767482,0.047396,68.710947,-124.410141,297.216796,
+ 0.425492,-0.901418,-0.080017,70.818157,-123.16921,302.772845,
+ 0.425492,-0.901418,-0.080017,68.730387,-124.093443,302.082864,
+ 0.425492,-0.901418,-0.080017,70.703008,-122.742383,297.352176,
+ 0.667539,-0.742751,0.052073,70.252178,-123.62007,288.728633,
+ 0.667539,-0.742751,0.052073,68.710947,-124.410141,297.216796,
+ 0.667539,-0.742751,0.052073,67.349939,-126.15578,289.764821,
+ 0.639505,-0.767487,0.044681,70.703008,-122.742383,297.352176,
+ 0.639505,-0.767487,0.044681,68.710947,-124.410141,297.216796,
+ 0.639505,-0.767487,0.044681,70.252178,-123.62007,288.728633,
+ 0.696801,-0.680221,0.227526,68.885572,-127.644045,280.612537,
+ 0.696801,-0.680221,0.227526,67.349939,-126.15578,289.764821,
+ 0.696801,-0.680221,0.227526,64.837411,-131.042535,282.849802,
+ 0.685497,-0.691625,0.227483,70.252178,-123.62007,288.728633,
+ 0.685497,-0.691625,0.227483,67.349939,-126.15578,289.764821,
+ 0.685497,-0.691625,0.227483,68.885572,-127.644045,280.612537,
+ 0.372938,-0.4907,-0.787483,57.687257,-82.77613,288.020703,
+ 0.372938,-0.4907,-0.787483,52.023939,-88.551828,288.937635,
+ 0.372938,-0.4907,-0.787483,47.60648,-87.033749,285.899651,
+ 0.362588,-0.45267,-0.814629,49.81168,-78.950509,282.389511,
+ 0.362588,-0.45267,-0.814629,57.687257,-82.77613,288.020703,
+ 0.362588,-0.45267,-0.814629,47.60648,-87.033749,285.899651,
+ 0.581968,-0.702794,-0.409138,52.023939,-88.551828,288.937635,
+ 0.581968,-0.702794,-0.409138,47.908879,-94.311403,292.977734,
+ 0.581968,-0.702794,-0.409138,45.241744,-95.038499,290.432898,
+ 0.344516,-0.537614,-0.769597,47.60648,-87.033749,285.899651,
+ 0.344516,-0.537614,-0.769597,52.023939,-88.551828,288.937635,
+ 0.344516,-0.537614,-0.769597,45.241744,-95.038499,290.432898,
+ 0.32523,-0.506194,-0.798745,60.28661,-71.973124,282.232835,
+ 0.32523,-0.506194,-0.798745,57.687257,-82.77613,288.020703,
+ 0.32523,-0.506194,-0.798745,49.81168,-78.950509,282.389511,
+ 0.404253,-0.621951,-0.670639,56.070609,-71.421869,279.180249,
+ 0.404253,-0.621951,-0.670639,60.28661,-71.973124,282.232835,
+ 0.404253,-0.621951,-0.670639,49.81168,-78.950509,282.389511,
+ 0.220685,-0.860005,-0.460098,64.325036,-67.987481,276.719986,
+ 0.220685,-0.860005,-0.460098,60.28661,-71.973124,282.232835,
+ 0.220685,-0.860005,-0.460098,56.070609,-71.421869,279.180249,
+ 0.427277,-0.880805,0.204002,64.325036,-67.987481,276.719986,
+ 0.427277,-0.880805,0.204002,56.070609,-71.421869,279.180249,
+ 0.427277,-0.880805,0.204002,60.571669,-69.959159,276.068338,
+ 0.904089,-0.171412,-0.39146,80.072372,-44.53209,284.223679,
+ 0.904089,-0.171412,-0.39146,83.006691,-31.566354,285.323146,
+ 0.904089,-0.171412,-0.39146,85.62947,-27.633342,289.658343,
+ 0.947732,-0.24651,-0.202576,80.072372,-44.53209,284.223679,
+ 0.947732,-0.24651,-0.202576,85.62947,-27.633342,289.658343,
+ 0.947732,-0.24651,-0.202576,83.916383,-35.397755,291.092152,
+ 0.917796,-0.032136,-0.395749,80.369733,-47.746524,280.521574,
+ 0.917796,-0.032136,-0.395749,81.554477,-35.010781,282.234965,
+ 0.917796,-0.032136,-0.395749,83.006691,-31.566354,285.323146,
+ 0.931442,-0.2344,0.278339,80.369733,-47.746524,280.521574,
+ 0.931442,-0.2344,0.278339,83.006691,-31.566354,285.323146,
+ 0.931442,-0.2344,0.278339,80.072372,-44.53209,284.223679,
+ 0.880623,-0.216551,-0.421436,83.928217,-19.84094,279.400203,
+ 0.880623,-0.216551,-0.421436,85.812674,-19.028357,282.920382,
+ 0.880623,-0.216551,-0.421436,81.554477,-35.010781,282.234965,
+ 0.953491,-0.246605,-0.173325,81.554477,-35.010781,282.234965,
+ 0.953491,-0.246605,-0.173325,85.812674,-19.028357,282.920382,
+ 0.953491,-0.246605,-0.173325,83.006691,-31.566354,285.323146,
+ 0.965207,-0.237131,-0.110205,85.812674,-19.028357,282.920382,
+ 0.965207,-0.237131,-0.110205,87.158136,-14.88908,285.797736,
+ 0.965207,-0.237131,-0.110205,83.006691,-31.566354,285.323146,
+ 0.909821,-0.216403,-0.354112,83.006691,-31.566354,285.323146,
+ 0.909821,-0.216403,-0.354112,87.158136,-14.88908,285.797736,
+ 0.909821,-0.216403,-0.354112,85.62947,-27.633342,289.658343,
+ 0.991017,-0.009751,-0.13338,85.130177,-4.794917,276.80882,
+ 0.991017,-0.009751,-0.13338,86.048965,-1.755108,283.413226,
+ 0.991017,-0.009751,-0.13338,85.812674,-19.028357,282.920382,
+ 0.906034,-0.000319,-0.423206,85.812674,-19.028357,282.920382,
+ 0.906034,-0.000319,-0.423206,86.048965,-1.755108,283.413226,
+ 0.906034,-0.000319,-0.423206,87.158136,-14.88908,285.797736,
+ 0.925549,-0.134872,-0.353791,82.871038,-8.883084,272.457195,
+ 0.925549,-0.134872,-0.353791,85.130177,-4.794917,276.80882,
+ 0.925549,-0.134872,-0.353791,83.928217,-19.84094,279.400203,
+ 0.88578,-0.146602,-0.440343,85.130177,-4.794917,276.80882,
+ 0.88578,-0.146602,-0.440343,85.812674,-19.028357,282.920382,
+ 0.88578,-0.146602,-0.440343,83.928217,-19.84094,279.400203,
+ 0.869605,0.289406,0.400039,75.196645,-118.401102,306.130873,
+ 0.869605,0.289406,0.400039,72.674929,-120.87475,313.402138,
+ 0.869605,0.289406,0.400039,73.811876,-122.585403,312.168205,
+ 0.950042,-0.089955,0.298878,75.196645,-118.401102,306.130873,
+ 0.950042,-0.089955,0.298878,75.264578,-116.71935,306.421103,
+ 0.950042,-0.089955,0.298878,72.674929,-120.87475,313.402138,
+ 0.861174,0.25531,0.43954,73.811876,-122.585403,312.168205,
+ 0.861174,0.25531,0.43954,72.674929,-120.87475,313.402138,
+ 0.861174,0.25531,0.43954,68.677452,-126.200501,324.327747,
+ 0.946397,-0.058795,0.317609,72.674929,-120.87475,313.402138,
+ 0.946397,-0.058795,0.317609,69.597396,-121.663908,322.426344,
+ 0.946397,-0.058795,0.317609,68.677452,-126.200501,324.327747,
+ 0.870087,-0.46258,0.170198,71.719756,-125.344414,311.101594,
+ 0.870087,-0.46258,0.170198,68.677452,-126.200501,324.327747,
+ 0.870087,-0.46258,0.170198,68.127536,-128.90536,319.787503,
+ 0.763757,-0.631267,0.134821,71.719756,-125.344414,311.101594,
+ 0.763757,-0.631267,0.134821,73.811876,-122.585403,312.168205,
+ 0.763757,-0.631267,0.134821,68.677452,-126.200501,324.327747,
+ 0.006989,-0.99262,0.121063,21.924471,-153.683518,337.63178,
+ 0.006989,-0.99262,0.121063,0.020624,-153.181548,343.011988,
+ 0.006989,-0.99262,0.121063,0.020624,-154.097871,335.498864,
+ 0.024317,-0.981374,0.190562,21.924471,-153.683518,337.63178,
+ 0.024317,-0.981374,0.190562,18.944594,-152.10429,346.14489,
+ 0.024317,-0.981374,0.190562,0.020624,-153.181548,343.011988,
+ 0.25803,-0.929712,0.262786,34.208136,-150.002099,338.594955,
+ 0.25803,-0.929712,0.262786,18.944594,-152.10429,346.14489,
+ 0.25803,-0.929712,0.262786,21.924471,-153.683518,337.63178,
+ 0.242739,-0.942867,0.22821,34.208136,-150.002099,338.594955,
+ 0.242739,-0.942867,0.22821,33.923991,-149.034362,342.89547,
+ 0.242739,-0.942867,0.22821,18.944594,-152.10429,346.14489,
+ 0.556661,-0.801839,0.217216,43.044332,-144.891739,334.814967,
+ 0.556661,-0.801839,0.217216,33.923991,-149.034362,342.89547,
+ 0.556661,-0.801839,0.217216,34.208136,-150.002099,338.594955,
+ 0.5632,-0.794078,0.228576,44.246322,-142.732051,339.356124,
+ 0.5632,-0.794078,0.228576,33.923991,-149.034362,342.89547,
+ 0.5632,-0.794078,0.228576,43.044332,-144.891739,334.814967,
+ 0.622722,-0.757629,0.195487,50.766945,-139.76921,330.067547,
+ 0.622722,-0.757629,0.195487,44.246322,-142.732051,339.356124,
+ 0.622722,-0.757629,0.195487,43.044332,-144.891739,334.814967,
+ 0.65924,-0.714284,0.234949,50.766945,-139.76921,330.067547,
+ 0.65924,-0.714284,0.234949,50.518667,-138.344223,335.096375,
+ 0.65924,-0.714284,0.234949,44.246322,-142.732051,339.356124,
+ 0.582746,-0.77387,0.248057,58.917753,-134.892798,326.132405,
+ 0.582746,-0.77387,0.248057,50.518667,-138.344223,335.096375,
+ 0.582746,-0.77387,0.248057,50.766945,-139.76921,330.067547,
+ 0.63846,-0.695025,0.330619,58.917753,-134.892798,326.132405,
+ 0.63846,-0.695025,0.330619,58.298565,-133.738876,329.753892,
+ 0.63846,-0.695025,0.330619,50.518667,-138.344223,335.096375,
+ 0.663229,-0.672821,0.327779,68.127536,-128.90536,319.787503,
+ 0.663229,-0.672821,0.327779,58.298565,-133.738876,329.753892,
+ 0.663229,-0.672821,0.327779,58.917753,-134.892798,326.132405,
+ 0.660929,-0.677195,0.323388,68.677452,-126.200501,324.327747,
+ 0.660929,-0.677195,0.323388,58.298565,-133.738876,329.753892,
+ 0.660929,-0.677195,0.323388,68.127536,-128.90536,319.787503,
+ 0.00673,-0.992302,0.123659,21.924471,-153.683518,337.63178,
+ 0.00673,-0.992302,0.123659,0.020624,-154.097871,335.498864,
+ 0.00673,-0.992302,0.123659,0.020624,-154.928708,328.831788,
+ -0.025658,-0.978969,0.202387,21.924471,-153.683518,337.63178,
+ -0.025658,-0.978969,0.202387,0.020624,-154.928708,328.831788,
+ -0.025658,-0.978969,0.202387,12.850676,-154.782072,331.167622,
+ 0.075063,-0.932315,-0.353772,12.850676,-154.782072,331.167622,
+ 0.075063,-0.932315,-0.353772,0.020624,-154.928708,328.831788,
+ 0.075063,-0.932315,-0.353772,0.020624,-151.984425,321.072546,
+ 0.034326,-0.951031,-0.307185,12.850676,-154.782072,331.167622,
+ 0.034326,-0.951031,-0.307185,0.020624,-151.984425,321.072546,
+ 0.034326,-0.951031,-0.307185,7.004702,-152.189472,322.487798,
+ 0.295885,-0.927537,-0.228314,34.208136,-150.002099,338.594955,
+ 0.295885,-0.927537,-0.228314,21.924471,-153.683518,337.63178,
+ 0.295885,-0.927537,-0.228314,24.877576,-150.488858,328.480409,
+ 0.283878,-0.934,-0.216926,34.34595,-148.028292,330.276853,
+ 0.283878,-0.934,-0.216926,34.208136,-150.002099,338.594955,
+ 0.283878,-0.934,-0.216926,24.877576,-150.488858,328.480409,
+ 0.313611,-0.905343,-0.28636,21.924471,-153.683518,337.63178,
+ 0.313611,-0.905343,-0.28636,12.850676,-154.782072,331.167622,
+ 0.313611,-0.905343,-0.28636,18.935771,-150.864271,325.445467,
+ 0.195669,-0.943811,-0.266334,24.877576,-150.488858,328.480409,
+ 0.195669,-0.943811,-0.266334,21.924471,-153.683518,337.63178,
+ 0.195669,-0.943811,-0.266334,18.935771,-150.864271,325.445467,
+ 0.904383,-0.425608,0.03082,71.124267,-125.048099,274.723058,
+ 0.904383,-0.425608,0.03082,74.719286,-117.388035,275.012071,
+ 0.904383,-0.425608,0.03082,72.474841,-121.837316,279.430929,
+ 0.919366,-0.385407,0.078908,74.719286,-117.388035,275.012071,
+ 0.919366,-0.385407,0.078908,75.530217,-114.441014,279.957846,
+ 0.919366,-0.385407,0.078908,72.474841,-121.837316,279.430929,
+ -0.267205,0.224737,0.937067,82.270043,-97.303754,273.945461,
+ -0.267205,0.224737,0.937067,78.317672,-106.365379,274.991688,
+ -0.267205,0.224737,0.937067,79.79899,-105.301811,275.159011,
+ -0.71595,0.379901,0.58574,81.400652,-97.774693,273.188246,
+ -0.71595,0.379901,0.58574,78.317672,-106.365379,274.991688,
+ -0.71595,0.379901,0.58574,82.270043,-97.303754,273.945461,
+ 0.91439,-0.385141,0.12473,76.52699,-113.115813,275.017851,
+ 0.91439,-0.385141,0.12473,79.79899,-105.301811,275.159011,
+ 0.91439,-0.385141,0.12473,75.725459,-113.35037,280.169586,
+ -0.515284,0.625511,0.585848,79.79899,-105.301811,275.159011,
+ -0.515284,0.625511,0.585848,78.317672,-106.365379,274.991688,
+ -0.515284,0.625511,0.585848,75.725459,-113.35037,280.169586,
+ 0.984422,-0.163844,-0.063781,74.719286,-117.388035,275.012071,
+ 0.984422,-0.163844,-0.063781,75.725459,-113.35037,280.169586,
+ 0.984422,-0.163844,-0.063781,75.530217,-114.441014,279.957846,
+ 0.913718,-0.38679,0.12455,74.719286,-117.388035,275.012071,
+ 0.913718,-0.38679,0.12455,76.52699,-113.115813,275.017851,
+ 0.913718,-0.38679,0.12455,75.725459,-113.35037,280.169586,
+ -0.104045,-0.054292,0.99309,84.719991,-75.970632,275.893713,
+ -0.104045,-0.054292,0.99309,84.008928,-76.271814,275.80275,
+ -0.104045,-0.054292,0.99309,84.270865,-88.470905,275.163271,
+ -0.658139,-0.053499,0.750993,84.008928,-76.271814,275.80275,
+ -0.658139,-0.053499,0.750993,83.248063,-88.516538,274.263679,
+ -0.658139,-0.053499,0.750993,84.270865,-88.470905,275.163271,
+ -0.131089,0.048918,0.990163,83.505315,-65.450554,275.213163,
+ -0.131089,0.048918,0.990163,82.671984,-66.014891,275.130719,
+ -0.131089,0.048918,0.990163,84.719991,-75.970632,275.893713,
+ -0.145799,0.045746,0.988256,82.671984,-66.014891,275.130719,
+ -0.145799,0.045746,0.988256,84.008928,-76.271814,275.80275,
+ -0.145799,0.045746,0.988256,84.719991,-75.970632,275.893713,
+ 0.612554,0.00352,0.790421,81.831777,-56.286709,276.469306,
+ 0.612554,0.00352,0.790421,81.224679,-57.003766,276.942983,
+ 0.612554,0.00352,0.790421,83.505315,-65.450554,275.213163,
+ 0.032963,-0.191968,0.980847,81.224679,-57.003766,276.942983,
+ 0.032963,-0.191968,0.980847,82.671984,-66.014891,275.130719,
+ 0.032963,-0.191968,0.980847,83.505315,-65.450554,275.213163,
+ 0.983555,0.179172,-0.022744,81.831777,-56.286709,276.469306,
+ 0.983555,0.179172,-0.022744,80.244198,-47.229951,279.162299,
+ 0.983555,0.179172,-0.022744,80.369733,-47.746524,280.521574,
+ 0.731513,-0.186018,0.655962,81.831777,-56.286709,276.469306,
+ 0.731513,-0.186018,0.655962,80.369733,-47.746524,280.521574,
+ 0.731513,-0.186018,0.655962,81.224679,-57.003766,276.942983,
+ 0.747911,0.085336,-0.658291,80.244198,-47.229951,279.162299,
+ 0.747911,0.085336,-0.658291,79.029056,-34.998308,279.367346,
+ 0.747911,0.085336,-0.658291,81.554477,-35.010781,282.234965,
+ 0.989837,-0.0759,-0.120261,80.244198,-47.229951,279.162299,
+ 0.989837,-0.0759,-0.120261,81.554477,-35.010781,282.234965,
+ 0.989837,-0.0759,-0.120261,80.369733,-47.746524,280.521574,
+ 0.573788,-0.18373,-0.798129,83.928217,-19.84094,279.400203,
+ 0.573788,-0.18373,-0.798129,79.029056,-34.998308,279.367346,
+ 0.573788,-0.18373,-0.798129,80.019154,-20.612148,276.767445,
+ 0.729077,-0.234258,-0.643094,79.029056,-34.998308,279.367346,
+ 0.729077,-0.234258,-0.643094,83.928217,-19.84094,279.400203,
+ 0.729077,-0.234258,-0.643094,81.554477,-35.010781,282.234965,
+ 0.773495,-0.375664,-0.510473,78.895495,-12.224988,268.892599,
+ 0.773495,-0.375664,-0.510473,82.871038,-8.883084,272.457195,
+ 0.773495,-0.375664,-0.510473,80.019154,-20.612148,276.767445,
+ 0.564715,-0.402146,-0.720677,82.871038,-8.883084,272.457195,
+ 0.564715,-0.402146,-0.720677,83.928217,-19.84094,279.400203,
+ 0.564715,-0.402146,-0.720677,80.019154,-20.612148,276.767445,
+ 0.666566,-0.740054,-0.089495,66.202526,-131.704832,276.221059,
+ 0.666566,-0.740054,-0.089495,61.301412,-135.90617,274.458991,
+ 0.666566,-0.740054,-0.089495,61.25523,-135.547489,271.149031,
+ 0.633732,-0.772865,-0.032611,67.16926,-130.709106,271.409447,
+ 0.633732,-0.772865,-0.032611,66.202526,-131.704832,276.221059,
+ 0.633732,-0.772865,-0.032611,61.25523,-135.547489,271.149031,
+ 0.827827,-0.558687,0.050708,70.969904,-125.142105,270.69817,
+ 0.827827,-0.558687,0.050708,66.202526,-131.704832,276.221059,
+ 0.827827,-0.558687,0.050708,67.16926,-130.709106,271.409447,
+ 0.802159,-0.596873,-0.016824,70.969904,-125.142105,270.69817,
+ 0.802159,-0.596873,-0.016824,71.124267,-125.048099,274.723058,
+ 0.802159,-0.596873,-0.016824,66.202526,-131.704832,276.221059,
+ 0.901291,-0.427746,-0.068608,73.608654,-119.089866,271.032208,
+ 0.901291,-0.427746,-0.068608,76.654205,-112.963701,272.846602,
+ 0.901291,-0.427746,-0.068608,74.719286,-117.388035,275.012071,
+ 0.92061,-0.389573,0.026646,76.654205,-112.963701,272.846602,
+ 0.92061,-0.389573,0.026646,76.52699,-113.115813,275.017851,
+ 0.92061,-0.389573,0.026646,74.719286,-117.388035,275.012071,
+ 0.924721,-0.379645,0.027583,76.654205,-112.963701,272.846602,
+ 0.924721,-0.379645,0.027583,79.603072,-105.755105,273.202849,
+ 0.924721,-0.379645,0.027583,76.52699,-113.115813,275.017851,
+ 0.922413,-0.386195,-0.002892,79.603072,-105.755105,273.202849,
+ 0.922413,-0.386195,-0.002892,79.79899,-105.301811,275.159011,
+ 0.922413,-0.386195,-0.002892,76.52699,-113.115813,275.017851,
+ 0.916878,-0.398328,-0.025861,70.969904,-125.142105,270.69817,
+ 0.916878,-0.398328,-0.025861,73.608654,-119.089866,271.032208,
+ 0.916878,-0.398328,-0.025861,71.124267,-125.048099,274.723058,
+ 0.903953,-0.421526,-0.072011,73.608654,-119.089866,271.032208,
+ 0.903953,-0.421526,-0.072011,74.719286,-117.388035,275.012071,
+ 0.903953,-0.421526,-0.072011,71.124267,-125.048099,274.723058,
+ 0.952951,-0.302055,-0.025448,82.286288,-97.204577,272.190695,
+ 0.952951,-0.302055,-0.025448,79.79899,-105.301811,275.159011,
+ 0.952951,-0.302055,-0.025448,79.603072,-105.755105,273.202849,
+ 0.95507,-0.296274,-0.007903,82.286288,-97.204577,272.190695,
+ 0.95507,-0.296274,-0.007903,82.270043,-97.303754,273.945461,
+ 0.95507,-0.296274,-0.007903,79.79899,-105.301811,275.159011,
+ 0.999002,-0.034773,0.028043,84.327694,-88.822892,273.932379,
+ 0.999002,-0.034773,0.028043,84.770979,-75.410859,274.77143,
+ 0.999002,-0.034773,0.028043,84.719991,-75.970632,275.893713,
+ 0.99759,-0.039189,0.057264,84.327694,-88.822892,273.932379,
+ 0.99759,-0.039189,0.057264,84.719991,-75.970632,275.893713,
+ 0.99759,-0.039189,0.057264,84.270865,-88.470905,275.163271,
+ 0.967605,0.132486,-0.214915,83.149281,-65.010342,273.881573,
+ 0.967605,0.132486,-0.214915,83.505315,-65.450554,275.213163,
+ 0.967605,0.132486,-0.214915,84.770979,-75.410859,274.77143,
+ 0.987103,0.120772,0.105085,84.770979,-75.410859,274.77143,
+ 0.987103,0.120772,0.105085,83.505315,-65.450554,275.213163,
+ 0.987103,0.120772,0.105085,84.719991,-75.970632,275.893713,
+ 0.963747,0.198455,-0.178346,83.149281,-65.010342,273.881573,
+ 0.963747,0.198455,-0.178346,81.426197,-55.746711,274.878517,
+ 0.963747,0.198455,-0.178346,81.831777,-56.286709,276.469306,
+ 0.96082,0.20155,-0.190268,83.149281,-65.010342,273.881573,
+ 0.96082,0.20155,-0.190268,81.831777,-56.286709,276.469306,
+ 0.96082,0.20155,-0.190268,83.505315,-65.450554,275.213163,
+ 0.878629,0.306225,-0.366383,81.426197,-55.746711,274.878517,
+ 0.878629,0.306225,-0.366383,79.169732,-46.629108,277.087794,
+ 0.878629,0.306225,-0.366383,80.244198,-47.229951,279.162299,
+ 0.960678,0.219112,-0.170551,81.426197,-55.746711,274.878517,
+ 0.960678,0.219112,-0.170551,80.244198,-47.229951,279.162299,
+ 0.960678,0.219112,-0.170551,81.831777,-56.286709,276.469306,
+ 0.349308,0.184285,-0.918707,79.029056,-34.998308,279.367346,
+ 0.349308,0.184285,-0.918707,79.169732,-46.629108,277.087794,
+ 0.349308,0.184285,-0.918707,75.834554,-35.379805,278.076218,
+ 0.894953,0.096212,-0.435664,79.169732,-46.629108,277.087794,
+ 0.894953,0.096212,-0.435664,79.029056,-34.998308,279.367346,
+ 0.894953,0.096212,-0.435664,80.244198,-47.229951,279.162299,
+ 0.039526,-0.099317,-0.994271,80.019154,-20.612148,276.767445,
+ 0.039526,-0.099317,-0.994271,75.834554,-35.379805,278.076218,
+ 0.039526,-0.099317,-0.994271,75.573101,-20.959268,276.625373,
+ 0.387308,-0.189707,-0.902221,80.019154,-20.612148,276.767445,
+ 0.387308,-0.189707,-0.902221,79.029056,-34.998308,279.367346,
+ 0.387308,-0.189707,-0.902221,75.834554,-35.379805,278.076218,
+ 0.812791,-0.579663,0.057973,70.590445,-126.33436,310.964085,
+ 0.812791,-0.579663,0.057973,68.127536,-128.90536,319.787503,
+ 0.812791,-0.579663,0.057973,67.177748,-130.522616,316.932966,
+ 0.661132,-0.749505,-0.03385,71.719756,-125.344414,311.101594,
+ 0.661132,-0.749505,-0.03385,68.127536,-128.90536,319.787503,
+ 0.661132,-0.749505,-0.03385,70.590445,-126.33436,310.964085,
+ 0.654594,-0.711108,-0.256579,71.719756,-125.344414,311.101594,
+ 0.654594,-0.711108,-0.256579,70.590445,-126.33436,310.964085,
+ 0.654594,-0.711108,-0.256579,70.818157,-123.16921,302.772845,
+ 0.724279,-0.643912,-0.246573,70.818157,-123.16921,302.772845,
+ 0.724279,-0.643912,-0.246573,72.680618,-121.573249,304.075838,
+ 0.724279,-0.643912,-0.246573,71.719756,-125.344414,311.101594,
+ 0.677576,-0.731917,-0.072025,72.680618,-121.573249,304.075838,
+ 0.677576,-0.731917,-0.072025,70.818157,-123.16921,302.772845,
+ 0.677576,-0.731917,-0.072025,70.703008,-122.742383,297.352176,
+ 0.739912,-0.664924,-0.102009,72.953051,-120.186595,297.01327,
+ 0.739912,-0.664924,-0.102009,72.680618,-121.573249,304.075838,
+ 0.739912,-0.664924,-0.102009,70.703008,-122.742383,297.352176,
+ 0.752106,-0.65846,0.027697,70.252178,-123.62007,288.728633,
+ 0.752106,-0.65846,0.027697,72.953051,-120.186595,297.01327,
+ 0.752106,-0.65846,0.027697,70.703008,-122.742383,297.352176,
+ 0.828968,-0.557933,-0.039023,70.252178,-123.62007,288.728633,
+ 0.828968,-0.557933,-0.039023,72.412749,-120.420543,288.880441,
+ 0.828968,-0.557933,-0.039023,72.953051,-120.186595,297.01327,
+ 0.817578,-0.558704,0.139341,68.885572,-127.644045,280.612537,
+ 0.817578,-0.558704,0.139341,72.412749,-120.420543,288.880441,
+ 0.817578,-0.558704,0.139341,70.252178,-123.62007,288.728633,
+ 0.855136,-0.51182,0.082357,72.474841,-121.837316,279.430929,
+ 0.855136,-0.51182,0.082357,72.412749,-120.420543,288.880441,
+ 0.855136,-0.51182,0.082357,68.885572,-127.644045,280.612537,
+ 0.620351,0.760234,-0.192895,63.048237,-121.702544,277.674338,
+ 0.620351,0.760234,-0.192895,57.681933,-116.287352,281.75855,
+ 0.620351,0.760234,-0.192895,63.036403,-120.270256,283.281192,
+ 0.615915,0.668908,-0.416186,63.036403,-120.270256,283.281192,
+ 0.615915,0.668908,-0.416186,57.681933,-116.287352,281.75855,
+ 0.615915,0.668908,-0.416186,58.544592,-114.050086,286.631006,
+ -0.601435,0.760342,0.245266,72.935497,-114.146829,278.496352,
+ -0.601435,0.760342,0.245266,69.192808,-115.392019,273.178815,
+ -0.601435,0.760342,0.245266,63.048237,-121.702544,277.674338,
+ -0.584003,0.786199,-0.20207,72.935497,-114.146829,278.496352,
+ -0.584003,0.786199,-0.20207,63.048237,-121.702544,277.674338,
+ -0.584003,0.786199,-0.20207,63.036403,-120.270256,283.281192,
+ -0.803321,0.541804,0.247233,72.253518,-110.994153,269.371448,
+ -0.803321,0.541804,0.247233,72.935497,-114.146829,278.496352,
+ -0.803321,0.541804,0.247233,74.665286,-108.62242,272.01029,
+ -0.648196,0.703471,0.291496,72.935497,-114.146829,278.496352,
+ -0.648196,0.703471,0.291496,72.253518,-110.994153,269.371448,
+ -0.648196,0.703471,0.291496,69.192808,-115.392019,273.178815,
+ -0.930326,0.354072,0.09553,77.047378,-100.575078,265.38185,
+ -0.930326,0.354072,0.09553,74.665286,-108.62242,272.01029,
+ -0.930326,0.354072,0.09553,78.572452,-97.245343,267.892613,
+ -0.816007,0.491775,0.303793,77.047378,-100.575078,265.38185,
+ -0.816007,0.491775,0.303793,72.253518,-110.994153,269.371448,
+ -0.816007,0.491775,0.303793,74.665286,-108.62242,272.01029,
+ -0.46297,-0.170342,0.869852,76.729923,-73.255125,269.137195,
+ -0.46297,-0.170342,0.869852,79.475255,-85.030736,268.292364,
+ -0.46297,-0.170342,0.869852,79.272809,-73.883957,270.367478,
+ -0.790811,-0.225199,0.569125,77.890329,-84.524811,266.290264,
+ -0.790811,-0.225199,0.569125,79.475255,-85.030736,268.292364,
+ -0.790811,-0.225199,0.569125,76.729923,-73.255125,269.137195,
+ 0.264923,-0.127327,0.955826,72.280107,-66.909919,271.087577,
+ 0.264923,-0.127327,0.955826,70.307851,-68.955827,271.361683,
+ 0.264923,-0.127327,0.955826,74.241137,-71.939659,269.874026,
+ 0.2052,-0.153224,0.966652,72.280107,-66.909919,271.087577,
+ 0.2052,-0.153224,0.966652,74.241137,-71.939659,269.874026,
+ 0.2052,-0.153224,0.966652,76.729923,-73.255125,269.137195,
+ 0.443571,-0.886946,0.128729,64.381013,-68.62118,272.160881,
+ 0.443571,-0.886946,0.128729,64.325036,-67.987481,276.719986,
+ 0.443571,-0.886946,0.128729,60.571669,-69.959159,276.068338,
+ 0.060885,-0.961015,-0.269711,64.381013,-68.62118,272.160881,
+ 0.060885,-0.961015,-0.269711,60.571669,-69.959159,276.068338,
+ 0.060885,-0.961015,-0.269711,62.540122,-69.192209,273.779963,
+ 0.367989,-0.249207,-0.895813,44.583403,-76.711418,281.786234,
+ 0.367989,-0.249207,-0.895813,47.60648,-87.033749,285.899651,
+ 0.367989,-0.249207,-0.895813,42.180639,-85.198059,283.160111,
+ -0.058235,-0.38423,-0.921399,44.583403,-76.711418,281.786234,
+ -0.058235,-0.38423,-0.921399,49.81168,-78.950509,282.389511,
+ -0.058235,-0.38423,-0.921399,47.60648,-87.033749,285.899651,
+ -0.136443,-0.615902,-0.775917,42.180639,-85.198059,283.160111,
+ -0.136443,-0.615902,-0.775917,45.241744,-95.038499,290.432898,
+ -0.136443,-0.615902,-0.775917,40.763562,-93.195204,289.757216,
+ 0.232242,-0.530354,-0.815346,42.180639,-85.198059,283.160111,
+ 0.232242,-0.530354,-0.815346,47.60648,-87.033749,285.899651,
+ 0.232242,-0.530354,-0.815346,45.241744,-95.038499,290.432898,
+ -0.024452,-0.31291,-0.949468,50.579512,-68.538736,278.93839,
+ -0.024452,-0.31291,-0.949468,49.81168,-78.950509,282.389511,
+ -0.024452,-0.31291,-0.949468,44.583403,-76.711418,281.786234,
+ -0.118278,-0.304551,-0.945124,50.579512,-68.538736,278.93839,
+ -0.118278,-0.304551,-0.945124,56.070609,-71.421869,279.180249,
+ -0.118278,-0.304551,-0.945124,49.81168,-78.950509,282.389511,
+ -0.493733,-0.306988,-0.813625,40.763562,-93.195204,289.757216,
+ -0.493733,-0.306988,-0.813625,49.026173,-104.252237,288.915123,
+ -0.493733,-0.306988,-0.813625,41.418861,-97.706547,291.061729,
+ 0.246095,0.255114,-0.935069,40.763562,-93.195204,289.757216,
+ 0.246095,0.255114,-0.935069,45.241744,-95.038499,290.432898,
+ 0.246095,0.255114,-0.935069,49.026173,-104.252237,288.915123,
+ -0.524166,-0.401556,-0.751001,35.757247,-91.57308,291.733761,
+ -0.524166,-0.401556,-0.751001,41.418861,-97.706547,291.061729,
+ -0.524166,-0.401556,-0.751001,35.773979,-96.666708,294.445617,
+ -0.434026,-0.307869,-0.846663,35.757247,-91.57308,291.733761,
+ -0.434026,-0.307869,-0.846663,40.763562,-93.195204,289.757216,
+ -0.434026,-0.307869,-0.846663,41.418861,-97.706547,291.061729,
+ -0.348462,-0.608142,-0.713258,38.333114,-84.022841,284.037798,
+ -0.348462,-0.608142,-0.713258,42.180639,-85.198059,283.160111,
+ -0.348462,-0.608142,-0.713258,35.757247,-91.57308,291.733761,
+ -0.454039,-0.517726,-0.725127,42.180639,-85.198059,283.160111,
+ -0.454039,-0.517726,-0.725127,40.763562,-93.195204,289.757216,
+ -0.454039,-0.517726,-0.725127,35.757247,-91.57308,291.733761,
+ -0.023185,-0.276077,-0.960856,40.322133,-75.417552,281.5173,
+ -0.023185,-0.276077,-0.960856,44.583403,-76.711418,281.786234,
+ -0.023185,-0.276077,-0.960856,38.333114,-84.022841,284.037798,
+ -0.246596,-0.086445,-0.965255,44.583403,-76.711418,281.786234,
+ -0.246596,-0.086445,-0.965255,42.180639,-85.198059,283.160111,
+ -0.246596,-0.086445,-0.965255,38.333114,-84.022841,284.037798,
+ -0.080663,-0.242204,-0.966867,46.884555,-65.362634,278.451023,
+ -0.080663,-0.242204,-0.966867,50.579512,-68.538736,278.93839,
+ -0.080663,-0.242204,-0.966867,40.322133,-75.417552,281.5173,
+ -0.033208,-0.307059,-0.951111,50.579512,-68.538736,278.93839,
+ -0.033208,-0.307059,-0.951111,44.583403,-76.711418,281.786234,
+ -0.033208,-0.307059,-0.951111,40.322133,-75.417552,281.5173,
+ 0.691208,-0.691046,0.211391,66.202526,-131.704832,276.221059,
+ 0.691208,-0.691046,0.211391,64.837411,-131.042535,282.849802,
+ 0.691208,-0.691046,0.211391,63.541841,-132.784828,281.390438,
+ 0.694386,-0.687753,0.211716,66.202526,-131.704832,276.221059,
+ 0.694386,-0.687753,0.211716,68.885572,-127.644045,280.612537,
+ 0.694386,-0.687753,0.211716,64.837411,-131.042535,282.849802,
+ 0.463133,-0.854535,0.235114,63.541841,-132.784828,281.390438,
+ 0.463133,-0.854535,0.235114,58.389255,-136.19427,279.148305,
+ 0.463133,-0.854535,0.235114,61.301412,-135.90617,274.458991,
+ 0.611114,-0.77676,0.152259,66.202526,-131.704832,276.221059,
+ 0.611114,-0.77676,0.152259,63.541841,-132.784828,281.390438,
+ 0.611114,-0.77676,0.152259,61.301412,-135.90617,274.458991,
+ 0.808338,-0.586705,0.048657,71.124267,-125.048099,274.723058,
+ 0.808338,-0.586705,0.048657,68.885572,-127.644045,280.612537,
+ 0.808338,-0.586705,0.048657,66.202526,-131.704832,276.221059,
+ 0.855329,-0.508113,0.101161,71.124267,-125.048099,274.723058,
+ 0.855329,-0.508113,0.101161,72.474841,-121.837316,279.430929,
+ 0.855329,-0.508113,0.101161,68.885572,-127.644045,280.612537,
+ 0.763083,-0.531402,0.367853,64.04442,-119.317122,350.634632,
+ 0.763083,-0.531402,0.367853,64.674499,-111.108541,361.18574,
+ 0.763083,-0.531402,0.367853,48.93448,-130.283496,366.136991,
+ 0.771874,-0.492134,0.40251,69.212887,-100.775257,363.328696,
+ 0.771874,-0.492134,0.40251,55.423098,-113.615349,374.073595,
+ 0.771874,-0.492134,0.40251,48.93448,-130.283496,366.136991,
+ 0.699614,-0.426204,0.573491,64.674499,-111.108541,361.18574,
+ 0.699614,-0.426204,0.573491,69.212887,-100.775257,363.328696,
+ 0.699614,-0.426204,0.573491,48.93448,-130.283496,366.136991,
+ 0.876813,-0.429802,0.215566,78.826327,-88.998125,347.70769,
+ 0.876813,-0.429802,0.215566,69.212887,-100.775257,363.328696,
+ 0.876813,-0.429802,0.215566,64.674499,-111.108541,361.18574,
+ 0.872744,-0.353129,0.337073,74.005515,-101.240416,347.364221,
+ 0.872744,-0.353129,0.337073,78.826327,-88.998125,347.70769,
+ 0.872744,-0.353129,0.337073,64.674499,-111.108541,361.18574,
+ 0.864842,-0.40798,0.292577,70.481198,-112.433742,342.173545,
+ 0.864842,-0.40798,0.292577,74.005515,-101.240416,347.364221,
+ 0.864842,-0.40798,0.292577,64.674499,-111.108541,361.18574,
+ 0.850551,-0.438481,0.290339,70.481198,-112.433742,342.173545,
+ 0.850551,-0.438481,0.290339,64.674499,-111.108541,361.18574,
+ 0.850551,-0.438481,0.290339,64.04442,-119.317122,350.634632,
+ 0.968127,-0.237784,-0.07867,90.347928,-28.78118,305.874412,
+ 0.968127,-0.237784,-0.07867,91.537567,-26.135949,312.518975,
+ 0.968127,-0.237784,-0.07867,86.900063,-48.320291,322.502401,
+ 0.962541,-0.252944,-0.097642,90.347928,-28.78118,305.874412,
+ 0.962541,-0.252944,-0.097642,86.900063,-48.320291,322.502401,
+ 0.962541,-0.252944,-0.097642,85.148644,-51.646072,313.852695,
+ 0.972931,-0.20837,-0.099934,88.089823,-30.730954,298.877557,
+ 0.972931,-0.20837,-0.099934,85.148644,-51.646072,313.852695,
+ 0.972931,-0.20837,-0.099934,84.197091,-51.819479,304.950178,
+ 0.931737,-0.28872,-0.220245,88.089823,-30.730954,298.877557,
+ 0.931737,-0.28872,-0.220245,90.347928,-28.78118,305.874412,
+ 0.931737,-0.28872,-0.220245,85.148644,-51.646072,313.852695,
+ 0.909502,-0.357013,-0.21295,78.336972,-67.639144,311.572838,
+ 0.909502,-0.357013,-0.21295,85.148644,-51.646072,313.852695,
+ 0.909502,-0.357013,-0.21295,80.575811,-66.935473,319.95513,
+ 0.92082,-0.379213,-0.091036,84.197091,-51.819479,304.950178,
+ 0.92082,-0.379213,-0.091036,85.148644,-51.646072,313.852695,
+ 0.92082,-0.379213,-0.091036,78.336972,-67.639144,311.572838,
+ 0.842501,-0.419727,-0.337671,80.575811,-66.935473,319.95513,
+ 0.842501,-0.419727,-0.337671,77.936839,-82.270205,332.431978,
+ 0.842501,-0.419727,-0.337671,73.65158,-84.524507,324.542225,
+ 0.89157,-0.404235,-0.204196,78.336972,-67.639144,311.572838,
+ 0.89157,-0.404235,-0.204196,80.575811,-66.935473,319.95513,
+ 0.89157,-0.404235,-0.204196,73.65158,-84.524507,324.542225,
+ 0.944574,-0.303917,-0.124153,80.575811,-66.935473,319.95513,
+ 0.944574,-0.303917,-0.124153,86.900063,-48.320291,322.502401,
+ 0.944574,-0.303917,-0.124153,83.339695,-64.255866,334.423735,
+ 0.947355,-0.312019,-0.071853,85.148644,-51.646072,313.852695,
+ 0.947355,-0.312019,-0.071853,86.900063,-48.320291,322.502401,
+ 0.947355,-0.312019,-0.071853,80.575811,-66.935473,319.95513,
+ 0.948622,-0.265475,-0.172161,77.936839,-82.270205,332.431978,
+ 0.948622,-0.265475,-0.172161,83.339695,-64.255866,334.423735,
+ 0.948622,-0.265475,-0.172161,78.826327,-88.998125,347.70769,
+ 0.953401,-0.271364,-0.131868,80.575811,-66.935473,319.95513,
+ 0.953401,-0.271364,-0.131868,83.339695,-64.255866,334.423735,
+ 0.953401,-0.271364,-0.131868,77.936839,-82.270205,332.431978,
+ 0.925918,-0.361543,-0.109375,74.721933,-96.650584,338.257266,
+ 0.925918,-0.361543,-0.109375,78.826327,-88.998125,347.70769,
+ 0.925918,-0.361543,-0.109375,74.005515,-101.240416,347.364221,
+ 0.942028,-0.283381,-0.179663,77.936839,-82.270205,332.431978,
+ 0.942028,-0.283381,-0.179663,78.826327,-88.998125,347.70769,
+ 0.942028,-0.283381,-0.179663,74.721933,-96.650584,338.257266,
+ 0.920837,-0.304528,-0.243562,72.725765,-95.775635,329.616382,
+ 0.920837,-0.304528,-0.243562,77.936839,-82.270205,332.431978,
+ 0.920837,-0.304528,-0.243562,74.721933,-96.650584,338.257266,
+ 0.878437,-0.254645,-0.404357,73.65158,-84.524507,324.542225,
+ 0.878437,-0.254645,-0.404357,77.936839,-82.270205,332.431978,
+ 0.878437,-0.254645,-0.404357,72.725765,-95.775635,329.616382,
+ 0.982505,-0.181189,0.043056,69.597396,-121.663908,322.426344,
+ 0.982505,-0.181189,0.043056,70.433648,-114.816427,332.159393,
+ 0.982505,-0.181189,0.043056,68.677452,-126.200501,324.327747,
+ 0.896937,-0.336053,0.287353,68.677452,-126.200501,324.327747,
+ 0.896937,-0.336053,0.287353,70.433648,-114.816427,332.159393,
+ 0.896937,-0.336053,0.287353,67.495145,-120.41598,334.783024,
+ 0.902207,-0.368261,0.224513,70.433648,-114.816427,332.159393,
+ 0.902207,-0.368261,0.224513,71.894685,-108.331581,336.925067,
+ 0.902207,-0.368261,0.224513,67.495145,-120.41598,334.783024,
+ 0.940304,-0.340104,-0.012585,67.495145,-120.41598,334.783024,
+ 0.940304,-0.340104,-0.012585,71.894685,-108.331581,336.925067,
+ 0.940304,-0.340104,-0.012585,70.481198,-112.433742,342.173545,
+ 0.967583,-0.242312,0.071195,71.894685,-108.331581,336.925067,
+ 0.967583,-0.242312,0.071195,74.721933,-96.650584,338.257266,
+ 0.967583,-0.242312,0.071195,70.481198,-112.433742,342.173545,
+ 0.959895,-0.27336,-0.062259,74.721933,-96.650584,338.257266,
+ 0.959895,-0.27336,-0.062259,74.005515,-101.240416,347.364221,
+ 0.959895,-0.27336,-0.062259,70.481198,-112.433742,342.173545,
+ 0.980759,0.109732,-0.161465,68.595281,-117.575437,319.117905,
+ 0.980759,0.109732,-0.161465,70.433648,-114.816427,332.159393,
+ 0.980759,0.109732,-0.161465,69.597396,-121.663908,322.426344,
+ 0.968603,0.177487,-0.174086,68.595281,-117.575437,319.117905,
+ 0.968603,0.177487,-0.174086,69.114288,-110.989893,328.719833,
+ 0.968603,0.177487,-0.174086,70.433648,-114.816427,332.159393,
+ 0.943761,0.029386,-0.32932,69.114288,-110.989893,328.719833,
+ 0.943761,0.029386,-0.32932,71.894685,-108.331581,336.925067,
+ 0.943761,0.029386,-0.32932,70.433648,-114.816427,332.159393,
+ 0.938944,-0.248936,-0.237518,69.114288,-110.989893,328.719833,
+ 0.938944,-0.248936,-0.237518,71.19074,-106.54183,332.26648,
+ 0.938944,-0.248936,-0.237518,71.894685,-108.331581,336.925067,
+ 0.953,-0.205246,-0.222857,71.19074,-106.54183,332.26648,
+ 0.953,-0.205246,-0.222857,74.721933,-96.650584,338.257266,
+ 0.953,-0.205246,-0.222857,71.894685,-108.331581,336.925067,
+ 0.951216,-0.194562,-0.239445,72.725765,-95.775635,329.616382,
+ 0.951216,-0.194562,-0.239445,74.721933,-96.650584,338.257266,
+ 0.951216,-0.194562,-0.239445,71.19074,-106.54183,332.26648,
+ 0.749984,0.585894,0.307004,72.674929,-120.87475,313.402138,
+ 0.749984,0.585894,0.307004,70.333436,-118.396843,314.393301,
+ 0.749984,0.585894,0.307004,69.597396,-121.663908,322.426344,
+ 0.874451,0.41612,0.24936,70.333436,-118.396843,314.393301,
+ 0.874451,0.41612,0.24936,68.595281,-117.575437,319.117905,
+ 0.874451,0.41612,0.24936,69.597396,-121.663908,322.426344,
+ 0.271288,0.779491,0.564621,75.264578,-116.71935,306.421103,
+ 0.271288,0.779491,0.564621,71.98577,-115.752525,306.661744,
+ 0.271288,0.779491,0.564621,72.674929,-120.87475,313.402138,
+ 0.746468,0.564354,0.352548,71.98577,-115.752525,306.661744,
+ 0.746468,0.564354,0.352548,70.333436,-118.396843,314.393301,
+ 0.746468,0.564354,0.352548,72.674929,-120.87475,313.402138,
+ -0.018389,0.986009,0.165674,75.911754,-115.139513,297.090543,
+ -0.018389,0.986009,0.165674,72.153367,-115.313529,297.709031,
+ -0.018389,0.986009,0.165674,75.264578,-116.71935,306.421103,
+ 0.285972,0.956811,0.052271,75.264578,-116.71935,306.421103,
+ 0.285972,0.956811,0.052271,72.153367,-115.313529,297.709031,
+ 0.285972,0.956811,0.052271,71.98577,-115.752525,306.661744,
+ -0.097588,0.994458,-0.039105,75.911754,-115.139513,297.090543,
+ -0.097588,0.994458,-0.039105,73.95687,-115.657303,288.801343,
+ -0.097588,0.994458,-0.039105,71.194513,-115.934756,288.639191,
+ -0.056388,0.996464,-0.06229,75.911754,-115.139513,297.090543,
+ -0.056388,0.996464,-0.06229,71.194513,-115.934756,288.639191,
+ -0.056388,0.996464,-0.06229,72.153367,-115.313529,297.709031,
+ -0.363579,0.915868,0.170281,75.725459,-113.35037,280.169586,
+ -0.363579,0.915868,0.170281,72.935497,-114.146829,278.496352,
+ -0.363579,0.915868,0.170281,73.95687,-115.657303,288.801343,
+ -0.107718,0.982083,0.154627,73.95687,-115.657303,288.801343,
+ -0.107718,0.982083,0.154627,72.935497,-114.146829,278.496352,
+ -0.107718,0.982083,0.154627,71.194513,-115.934756,288.639191,
+ -0.700634,0.574099,0.423701,74.665286,-108.62242,272.01029,
+ -0.700634,0.574099,0.423701,75.725459,-113.35037,280.169586,
+ -0.700634,0.574099,0.423701,78.317672,-106.365379,274.991688,
+ -0.495641,0.721996,0.482765,75.725459,-113.35037,280.169586,
+ -0.495641,0.721996,0.482765,74.665286,-108.62242,272.01029,
+ -0.495641,0.721996,0.482765,72.935497,-114.146829,278.496352,
+ 0.238035,-0.115245,0.964395,31.50054,-43.516589,409.892054,
+ 0.238035,-0.115245,0.964395,15.964108,-66.691181,410.957448,
+ 0.238035,-0.115245,0.964395,33.140613,-63.960464,407.04421,
+ 0.283638,-0.146587,0.947661,31.50054,-43.516589,409.892054,
+ 0.283638,-0.146587,0.947661,14.87103,-47.814975,414.204434,
+ 0.283638,-0.146587,0.947661,15.964108,-66.691181,410.957448,
+ 0.262953,-0.270238,0.92619,33.140613,-63.960464,407.04421,
+ 0.262953,-0.270238,0.92619,15.452403,-89.586191,404.58912,
+ 0.262953,-0.270238,0.92619,32.169529,-83.437818,401.636927,
+ 0.254,-0.264456,0.930348,33.140613,-63.960464,407.04421,
+ 0.254,-0.264456,0.930348,15.964108,-66.691181,410.957448,
+ 0.254,-0.264456,0.930348,15.452403,-89.586191,404.58912,
+ 0.436358,-0.233856,0.868852,48.586417,-58.465564,400.765933,
+ 0.436358,-0.233856,0.868852,33.140613,-63.960464,407.04421,
+ 0.436358,-0.233856,0.868852,50.861498,-75.975195,394.910527,
+ 0.417755,-0.26232,0.869867,33.140613,-63.960464,407.04421,
+ 0.417755,-0.26232,0.869867,32.169529,-83.437818,401.636927,
+ 0.417755,-0.26232,0.869867,50.861498,-75.975195,394.910527,
+ 0.389458,-0.096354,0.91599,47.260577,-42.099817,403.340279,
+ 0.389458,-0.096354,0.91599,31.50054,-43.516589,409.892054,
+ 0.389458,-0.096354,0.91599,33.140613,-63.960464,407.04421,
+ 0.407499,-0.109597,0.906605,47.260577,-42.099817,403.340279,
+ 0.407499,-0.109597,0.906605,33.140613,-63.960464,407.04421,
+ 0.407499,-0.109597,0.906605,48.586417,-58.465564,400.765933,
+ 0.53117,-0.089498,0.842525,57.090095,-36.910662,397.694484,
+ 0.53117,-0.089498,0.842525,47.260577,-42.099817,403.340279,
+ 0.53117,-0.089498,0.842525,48.586417,-58.465564,400.765933,
+ 0.549287,-0.098457,0.829813,57.090095,-36.910662,397.694484,
+ 0.549287,-0.098457,0.829813,48.586417,-58.465564,400.765933,
+ 0.549287,-0.098457,0.829813,61.876821,-54.079258,392.488902,
+ 0.589487,-0.2103,0.779922,61.876821,-54.079258,392.488902,
+ 0.589487,-0.2103,0.779922,50.861498,-75.975195,394.910527,
+ 0.589487,-0.2103,0.779922,64.283723,-67.173985,387.138813,
+ 0.564067,-0.195029,0.802367,61.876821,-54.079258,392.488902,
+ 0.564067,-0.195029,0.802367,48.586417,-58.465564,400.765933,
+ 0.564067,-0.195029,0.802367,50.861498,-75.975195,394.910527,
+ 0.708425,-0.168087,0.685478,75.80202,-57.017152,377.725504,
+ 0.708425,-0.168087,0.685478,72.866803,-45.522644,383.577563,
+ 0.708425,-0.168087,0.685478,64.283723,-67.173985,387.138813,
+ 0.693699,-0.159468,0.70239,72.866803,-45.522644,383.577563,
+ 0.693699,-0.159468,0.70239,61.876821,-54.079258,392.488902,
+ 0.693699,-0.159468,0.70239,64.283723,-67.173985,387.138813,
+ 0.853779,-0.115308,0.507706,84.014678,-42.674192,367.172266,
+ 0.853779,-0.115308,0.507706,79.836577,-34.488428,376.057442,
+ 0.853779,-0.115308,0.507706,75.80202,-57.017152,377.725504,
+ 0.797997,-0.098892,0.594493,79.836577,-34.488428,376.057442,
+ 0.797997,-0.098892,0.594493,72.866803,-45.522644,383.577563,
+ 0.797997,-0.098892,0.594493,75.80202,-57.017152,377.725504,
+ 0.02052,-0.731635,0.681388,17.986591,-143.412296,371.144828,
+ 0.02052,-0.731635,0.681388,0.020624,-132.807341,383.072855,
+ 0.02052,-0.731635,0.681388,0.020624,-143.58327,371.502291,
+ 0.08957,-0.673519,0.733723,17.3751,-128.428032,384.974257,
+ 0.08957,-0.673519,0.733723,0.020624,-132.807341,383.072855,
+ 0.08957,-0.673519,0.733723,17.986591,-143.412296,371.144828,
+ 0.061321,-0.883028,0.465297,18.63824,-151.13929,354.709109,
+ 0.061321,-0.883028,0.465297,0.020624,-143.58327,371.502291,
+ 0.061321,-0.883028,0.465297,0.020624,-152.097292,355.344633,
+ 0.017084,-0.904584,0.425953,18.63824,-151.13929,354.709109,
+ 0.017084,-0.904584,0.425953,17.986591,-143.412296,371.144828,
+ 0.017084,-0.904584,0.425953,0.020624,-143.58327,371.502291,
+ 0.04217,-0.995271,0.087502,18.944594,-152.10429,346.14489,
+ 0.04217,-0.995271,0.087502,0.020624,-152.097292,355.344633,
+ 0.04217,-0.995271,0.087502,0.020624,-153.181548,343.011988,
+ 0.054927,-0.991991,0.11374,18.944594,-152.10429,346.14489,
+ 0.054927,-0.991991,0.11374,18.63824,-151.13929,354.709109,
+ 0.054927,-0.991991,0.11374,0.020624,-152.097292,355.344633,
+ 0.241075,-0.945748,0.217815,33.923991,-149.034362,342.89547,
+ 0.241075,-0.945748,0.217815,32.864682,-146.738989,354.034339,
+ 0.241075,-0.945748,0.217815,18.944594,-152.10429,346.14489,
+ 0.298527,-0.947153,0.117402,32.864682,-146.738989,354.034339,
+ 0.298527,-0.947153,0.117402,18.63824,-151.13929,354.709109,
+ 0.298527,-0.947153,0.117402,18.944594,-152.10429,346.14489,
+ 0.553503,-0.817666,0.158292,46.367678,-139.314699,349.590839,
+ 0.553503,-0.817666,0.158292,33.923991,-149.034362,342.89547,
+ 0.553503,-0.817666,0.158292,44.246322,-142.732051,339.356124,
+ 0.524513,-0.822647,0.219403,46.367678,-139.314699,349.590839,
+ 0.524513,-0.822647,0.219403,32.864682,-146.738989,354.034339,
+ 0.524513,-0.822647,0.219403,33.923991,-149.034362,342.89547,
+ 0.518159,-0.539947,0.663301,55.423098,-113.615349,374.073595,
+ 0.518159,-0.539947,0.663301,34.43813,-123.708904,382.250232,
+ 0.518159,-0.539947,0.663301,34.194142,-138.712335,370.227591,
+ 0.49216,-0.522952,0.695916,55.423098,-113.615349,374.073595,
+ 0.49216,-0.522952,0.695916,34.194142,-138.712335,370.227591,
+ 0.49216,-0.522952,0.695916,48.93448,-130.283496,366.136991,
+ 0.290869,-0.642461,0.708971,34.43813,-123.708904,382.250232,
+ 0.290869,-0.642461,0.708971,17.3751,-128.428032,384.974257,
+ 0.290869,-0.642461,0.708971,17.986591,-143.412296,371.144828,
+ 0.220483,-0.612118,0.759407,34.43813,-123.708904,382.250232,
+ 0.220483,-0.612118,0.759407,17.986591,-143.412296,371.144828,
+ 0.220483,-0.612118,0.759407,34.194142,-138.712335,370.227591,
+ 0.286578,-0.862595,0.416898,32.864682,-146.738989,354.034339,
+ 0.286578,-0.862595,0.416898,17.986591,-143.412296,371.144828,
+ 0.286578,-0.862595,0.416898,18.63824,-151.13929,354.709109,
+ 0.27545,-0.870117,0.408684,34.194142,-138.712335,370.227591,
+ 0.27545,-0.870117,0.408684,17.986591,-143.412296,371.144828,
+ 0.27545,-0.870117,0.408684,32.864682,-146.738989,354.034339,
+ 0.536459,-0.772983,0.338688,48.93448,-130.283496,366.136991,
+ 0.536459,-0.772983,0.338688,32.864682,-146.738989,354.034339,
+ 0.536459,-0.772983,0.338688,46.367678,-139.314699,349.590839,
+ 0.536137,-0.773005,0.339146,48.93448,-130.283496,366.136991,
+ 0.536137,-0.773005,0.339146,34.194142,-138.712335,370.227591,
+ 0.536137,-0.773005,0.339146,32.864682,-146.738989,354.034339,
+ 0.644144,-0.742539,0.183616,54.025309,-133.092399,344.032964,
+ 0.644144,-0.742539,0.183616,44.246322,-142.732051,339.356124,
+ 0.644144,-0.742539,0.183616,50.518667,-138.344223,335.096375,
+ 0.672076,-0.732939,0.105425,54.025309,-133.092399,344.032964,
+ 0.672076,-0.732939,0.105425,46.367678,-139.314699,349.590839,
+ 0.672076,-0.732939,0.105425,44.246322,-142.732051,339.356124,
+ 0.637655,-0.697207,0.327564,60.118131,-127.477331,339.539267,
+ 0.637655,-0.697207,0.327564,50.518667,-138.344223,335.096375,
+ 0.637655,-0.697207,0.327564,58.298565,-133.738876,329.753892,
+ 0.719197,-0.684369,0.119981,50.518667,-138.344223,335.096375,
+ 0.719197,-0.684369,0.119981,60.118131,-127.477331,339.539267,
+ 0.719197,-0.684369,0.119981,54.025309,-133.092399,344.032964,
+ 0.666701,-0.61767,0.417126,68.677452,-126.200501,324.327747,
+ 0.666701,-0.61767,0.417126,67.495145,-120.41598,334.783024,
+ 0.666701,-0.61767,0.417126,58.298565,-133.738876,329.753892,
+ 0.749083,-0.61243,0.252597,58.298565,-133.738876,329.753892,
+ 0.749083,-0.61243,0.252597,67.495145,-120.41598,334.783024,
+ 0.749083,-0.61243,0.252597,60.118131,-127.477331,339.539267,
+ 0.831561,-0.51151,0.216481,67.495145,-120.41598,334.783024,
+ 0.831561,-0.51151,0.216481,70.481198,-112.433742,342.173545,
+ 0.831561,-0.51151,0.216481,64.04442,-119.317122,350.634632,
+ 0.742677,-0.637227,0.205846,67.495145,-120.41598,334.783024,
+ 0.742677,-0.637227,0.205846,64.04442,-119.317122,350.634632,
+ 0.742677,-0.637227,0.205846,60.118131,-127.477331,339.539267,
+ 0.741239,-0.638445,0.207251,60.118131,-127.477331,339.539267,
+ 0.741239,-0.638445,0.207251,64.04442,-119.317122,350.634632,
+ 0.741239,-0.638445,0.207251,54.025309,-133.092399,344.032964,
+ 0.802322,-0.596298,0.026603,54.025309,-133.092399,344.032964,
+ 0.802322,-0.596298,0.026603,64.04442,-119.317122,350.634632,
+ 0.802322,-0.596298,0.026603,57.316894,-128.242455,353.471828,
+ 0.681186,-0.720034,0.132425,57.316894,-128.242455,353.471828,
+ 0.681186,-0.720034,0.132425,46.367678,-139.314699,349.590839,
+ 0.681186,-0.720034,0.132425,54.025309,-133.092399,344.032964,
+ 0.624802,-0.722021,0.297167,57.316894,-128.242455,353.471828,
+ 0.624802,-0.722021,0.297167,48.93448,-130.283496,366.136991,
+ 0.624802,-0.722021,0.297167,46.367678,-139.314699,349.590839,
+ 0.777937,-0.445529,0.443078,64.04442,-119.317122,350.634632,
+ 0.777937,-0.445529,0.443078,48.93448,-130.283496,366.136991,
+ 0.777937,-0.445529,0.443078,57.316894,-128.242455,353.471828,
+ 0.601964,-0.695239,-0.392788,67.233999,-80.307349,297.654879,
+ 0.601964,-0.695239,-0.392788,58.638536,-91.028519,303.458566,
+ 0.601964,-0.695239,-0.392788,52.023939,-88.551828,288.937635,
+ 0.608509,-0.665331,-0.432494,67.233999,-80.307349,297.654879,
+ 0.608509,-0.665331,-0.432494,52.023939,-88.551828,288.937635,
+ 0.608509,-0.665331,-0.432494,57.687257,-82.77613,288.020703,
+ 0.710345,-0.31964,-0.627089,47.908879,-94.311403,292.977734,
+ 0.710345,-0.31964,-0.627089,58.638536,-91.028519,303.458566,
+ 0.710345,-0.31964,-0.627089,56.616266,-96.578483,303.996739,
+ 0.596588,-0.700706,-0.391271,58.638536,-91.028519,303.458566,
+ 0.596588,-0.700706,-0.391271,47.908879,-94.311403,292.977734,
+ 0.596588,-0.700706,-0.391271,52.023939,-88.551828,288.937635,
+ 0.798172,0.224275,-0.559126,50.624081,-103.71954,292.578288,
+ 0.798172,0.224275,-0.559126,56.616266,-96.578483,303.996739,
+ 0.798172,0.224275,-0.559126,58.033525,-105.270476,302.53342,
+ 0.784005,0.250382,-0.568019,50.624081,-103.71954,292.578288,
+ 0.784005,0.250382,-0.568019,47.908879,-94.311403,292.977734,
+ 0.784005,0.250382,-0.568019,56.616266,-96.578483,303.996739,
+ 0.814751,0.518796,-0.258903,59.625501,-113.109424,291.835372,
+ 0.814751,0.518796,-0.258903,58.033525,-105.270476,302.53342,
+ 0.814751,0.518796,-0.258903,61.686833,-111.816775,300.912513,
+ 0.651544,0.654884,-0.382907,59.625501,-113.109424,291.835372,
+ 0.651544,0.654884,-0.382907,50.624081,-103.71954,292.578288,
+ 0.651544,0.654884,-0.382907,58.033525,-105.270476,302.53342,
+ 0.642775,0.728243,-0.237703,66.257712,-116.248411,299.695616,
+ 0.642775,0.728243,-0.237703,64.320169,-117.467133,290.722519,
+ 0.642775,0.728243,-0.237703,61.686833,-111.816775,300.912513,
+ 0.626963,0.738666,-0.247569,64.320169,-117.467133,290.722519,
+ 0.626963,0.738666,-0.247569,59.625501,-113.109424,291.835372,
+ 0.626963,0.738666,-0.247569,61.686833,-111.816775,300.912513,
+ -0.229582,0.972368,-0.04233,72.153367,-115.313529,297.709031,
+ -0.229582,0.972368,-0.04233,71.194513,-115.934756,288.639191,
+ -0.229582,0.972368,-0.04233,64.320169,-117.467133,290.722519,
+ -0.186309,0.978116,-0.092618,72.153367,-115.313529,297.709031,
+ -0.186309,0.978116,-0.092618,64.320169,-117.467133,290.722519,
+ -0.186309,0.978116,-0.092618,66.257712,-116.248411,299.695616,
+ -0.045411,0.948145,0.314576,71.98577,-115.752525,306.661744,
+ -0.045411,0.948145,0.314576,65.823676,-115.642396,305.440284,
+ -0.045411,0.948145,0.314576,70.333436,-118.396843,314.393301,
+ 0.649021,0.754856,-0.094685,70.333436,-118.396843,314.393301,
+ 0.649021,0.754856,-0.094685,65.823676,-115.642396,305.440284,
+ 0.649021,0.754856,-0.094685,65.558027,-114.724855,310.934271,
+ 0.575642,0.814689,0.070136,70.333436,-118.396843,314.393301,
+ 0.575642,0.814689,0.070136,65.558027,-114.724855,310.934271,
+ 0.575642,0.814689,0.070136,68.595281,-117.575437,319.117905,
+ 0.904512,0.373641,-0.205549,65.558027,-114.724855,310.934271,
+ 0.904512,0.373641,-0.205549,65.32344,-111.272822,316.176968,
+ 0.904512,0.373641,-0.205549,68.595281,-117.575437,319.117905,
+ -0.141363,0.988896,0.045844,72.153367,-115.313529,297.709031,
+ -0.141363,0.988896,0.045844,66.257712,-116.248411,299.695616,
+ -0.141363,0.988896,0.045844,71.98577,-115.752525,306.661744,
+ 0.037984,0.994059,-0.101995,71.98577,-115.752525,306.661744,
+ 0.037984,0.994059,-0.101995,66.257712,-116.248411,299.695616,
+ 0.037984,0.994059,-0.101995,65.823676,-115.642396,305.440284,
+ 0.761849,0.625765,-0.167347,61.686833,-111.816775,300.912513,
+ 0.761849,0.625765,-0.167347,62.645383,-110.895888,308.719822,
+ 0.761849,0.625765,-0.167347,65.823676,-115.642396,305.440284,
+ 0.692629,0.720904,-0.023718,66.257712,-116.248411,299.695616,
+ 0.692629,0.720904,-0.023718,61.686833,-111.816775,300.912513,
+ 0.692629,0.720904,-0.023718,65.823676,-115.642396,305.440284,
+ 0.875456,0.340091,-0.343386,58.033525,-105.270476,302.53342,
+ 0.875456,0.340091,-0.343386,61.425809,-104.661115,311.78549,
+ 0.875456,0.340091,-0.343386,62.645383,-110.895888,308.719822,
+ 0.843591,0.511365,-0.163889,61.686833,-111.816775,300.912513,
+ 0.843591,0.511365,-0.163889,58.033525,-105.270476,302.53342,
+ 0.843591,0.511365,-0.163889,62.645383,-110.895888,308.719822,
+ 0.998746,-0.007331,0.049516,65.823676,-115.642396,305.440284,
+ 0.998746,-0.007331,0.049516,65.32344,-111.272822,316.176968,
+ 0.998746,-0.007331,0.049516,65.558027,-114.724855,310.934271,
+ 0.728329,0.64586,-0.228916,65.823676,-115.642396,305.440284,
+ 0.728329,0.64586,-0.228916,62.645383,-110.895888,308.719822,
+ 0.728329,0.64586,-0.228916,65.32344,-111.272822,316.176968,
+ 0.895139,0.325084,-0.305036,62.645383,-110.895888,308.719822,
+ 0.895139,0.325084,-0.305036,61.425809,-104.661115,311.78549,
+ 0.895139,0.325084,-0.305036,65.32344,-111.272822,316.176968,
+ 0.881335,0.255613,-0.39738,61.425809,-104.661115,311.78549,
+ 0.881335,0.255613,-0.39738,66.478184,-107.800101,320.971848,
+ 0.881335,0.255613,-0.39738,65.32344,-111.272822,316.176968,
+ 0.868039,-0.048815,-0.49409,61.425809,-104.661115,311.78549,
+ 0.868039,-0.048815,-0.49409,62.620985,-99.00163,313.326082,
+ 0.868039,-0.048815,-0.49409,66.478184,-107.800101,320.971848,
+ 0.885312,-0.015731,-0.464732,62.620985,-99.00163,313.326082,
+ 0.885312,-0.015731,-0.464732,67.75474,-103.526054,323.259006,
+ 0.885312,-0.015731,-0.464732,66.478184,-107.800101,320.971848,
+ 0.837206,-0.028129,-0.546164,56.616266,-96.578483,303.996739,
+ 0.837206,-0.028129,-0.546164,62.620985,-99.00163,313.326082,
+ 0.837206,-0.028129,-0.546164,61.425809,-104.661115,311.78549,
+ 0.913899,0.20773,-0.348764,58.033525,-105.270476,302.53342,
+ 0.913899,0.20773,-0.348764,56.616266,-96.578483,303.996739,
+ 0.913899,0.20773,-0.348764,61.425809,-104.661115,311.78549,
+ 0.850975,-0.143552,-0.505207,62.620985,-99.00163,313.326082,
+ 0.850975,-0.143552,-0.505207,68.655031,-97.675212,323.112979,
+ 0.850975,-0.143552,-0.505207,67.75474,-103.526054,323.259006,
+ 0.959049,-0.238703,-0.152467,69.358336,-63.891709,285.317062,
+ 0.959049,-0.238703,-0.152467,68.602978,-87.891357,318.13952,
+ 0.959049,-0.238703,-0.152467,67.233999,-80.307349,297.654879,
+ 0.680043,-0.599205,-0.422486,69.358336,-63.891709,285.317062,
+ 0.680043,-0.599205,-0.422486,75.550786,-67.903819,300.974879,
+ 0.680043,-0.599205,-0.422486,68.602978,-87.891357,318.13952,
+ 0.832567,-0.152701,-0.53246,58.638536,-91.028519,303.458566,
+ 0.832567,-0.152701,-0.53246,68.602978,-87.891357,318.13952,
+ 0.832567,-0.152701,-0.53246,64.035962,-91.136518,311.929084,
+ 0.658666,-0.690233,-0.299563,68.602978,-87.891357,318.13952,
+ 0.658666,-0.690233,-0.299563,58.638536,-91.028519,303.458566,
+ 0.658666,-0.690233,-0.299563,67.233999,-80.307349,297.654879,
+ 0.840891,-0.237646,-0.486237,64.035962,-91.136518,311.929084,
+ 0.840891,-0.237646,-0.486237,68.655031,-97.675212,323.112979,
+ 0.840891,-0.237646,-0.486237,62.620985,-99.00163,313.326082,
+ 0.837726,-0.243911,-0.488593,64.035962,-91.136518,311.929084,
+ 0.837726,-0.243911,-0.488593,68.602978,-87.891357,318.13952,
+ 0.837726,-0.243911,-0.488593,68.655031,-97.675212,323.112979,
+ 0.817286,-0.240078,-0.523837,58.638536,-91.028519,303.458566,
+ 0.817286,-0.240078,-0.523837,64.035962,-91.136518,311.929084,
+ 0.817286,-0.240078,-0.523837,62.620985,-99.00163,313.326082,
+ 0.752653,-0.329523,-0.570024,58.638536,-91.028519,303.458566,
+ 0.752653,-0.329523,-0.570024,62.620985,-99.00163,313.326082,
+ 0.752653,-0.329523,-0.570024,56.616266,-96.578483,303.996739,
+ -0.501683,0.862536,0.065931,72.935497,-114.146829,278.496352,
+ -0.501683,0.862536,0.065931,63.036403,-120.270256,283.281192,
+ -0.501683,0.862536,0.065931,71.194513,-115.934756,288.639191,
+ -0.291697,0.910624,-0.292706,71.194513,-115.934756,288.639191,
+ -0.291697,0.910624,-0.292706,63.036403,-120.270256,283.281192,
+ -0.291697,0.910624,-0.292706,64.320169,-117.467133,290.722519,
+ 0.58233,0.72252,-0.372634,64.320169,-117.467133,290.722519,
+ 0.58233,0.72252,-0.372634,63.036403,-120.270256,283.281192,
+ 0.58233,0.72252,-0.372634,59.625501,-113.109424,291.835372,
+ 0.708167,0.654289,-0.26534,63.036403,-120.270256,283.281192,
+ 0.708167,0.654289,-0.26534,58.544592,-114.050086,286.631006,
+ 0.708167,0.654289,-0.26534,59.625501,-113.109424,291.835372,
+ 0.685526,0.678128,-0.264947,58.544592,-114.050086,286.631006,
+ 0.685526,0.678128,-0.264947,50.624081,-103.71954,292.578288,
+ 0.685526,0.678128,-0.264947,59.625501,-113.109424,291.835372,
+ 0.621221,0.69007,-0.371332,58.544592,-114.050086,286.631006,
+ 0.621221,0.69007,-0.371332,49.026173,-104.252237,288.915123,
+ 0.621221,0.69007,-0.371332,50.624081,-103.71954,292.578288,
+ 0.868088,0.268265,-0.41768,49.026173,-104.252237,288.915123,
+ 0.868088,0.268265,-0.41768,47.908879,-94.311403,292.977734,
+ 0.868088,0.268265,-0.41768,50.624081,-103.71954,292.578288,
+ 0.590236,0.361341,-0.721841,47.908879,-94.311403,292.977734,
+ 0.590236,0.361341,-0.721841,49.026173,-104.252237,288.915123,
+ 0.590236,0.361341,-0.721841,45.241744,-95.038499,290.432898,
+ -0.797999,0.383906,0.464557,78.572452,-97.245343,267.892613,
+ -0.797999,0.383906,0.464557,78.317672,-106.365379,274.991688,
+ -0.797999,0.383906,0.464557,81.400652,-97.774693,273.188246,
+ -0.715153,0.441672,0.54174,78.572452,-97.245343,267.892613,
+ -0.715153,0.441672,0.54174,74.665286,-108.62242,272.01029,
+ -0.715153,0.441672,0.54174,78.317672,-106.365379,274.991688,
+ -0.760879,-0.034168,0.647994,79.272809,-73.883957,270.367478,
+ -0.760879,-0.034168,0.647994,83.248063,-88.516538,274.263679,
+ -0.760879,-0.034168,0.647994,84.008928,-76.271814,275.80275,
+ -0.867447,-0.10624,0.486054,79.475255,-85.030736,268.292364,
+ -0.867447,-0.10624,0.486054,83.248063,-88.516538,274.263679,
+ -0.867447,-0.10624,0.486054,79.272809,-73.883957,270.367478,
+ -0.411417,0.00609,0.911427,78.620711,-64.24613,273.290161,
+ -0.411417,0.00609,0.911427,84.008928,-76.271814,275.80275,
+ -0.411417,0.00609,0.911427,82.671984,-66.014891,275.130719,
+ -0.781494,-0.228887,0.580412,79.272809,-73.883957,270.367478,
+ -0.781494,-0.228887,0.580412,84.008928,-76.271814,275.80275,
+ -0.781494,-0.228887,0.580412,78.620711,-64.24613,273.290161,
+ -0.406945,-0.242478,0.880682,81.224679,-57.003766,276.942983,
+ -0.406945,-0.242478,0.880682,76.867019,-58.021701,274.649131,
+ -0.406945,-0.242478,0.880682,82.671984,-66.014891,275.130719,
+ -0.503606,-0.317325,0.803546,76.867019,-58.021701,274.649131,
+ -0.503606,-0.317325,0.803546,78.620711,-64.24613,273.290161,
+ -0.503606,-0.317325,0.803546,82.671984,-66.014891,275.130719,
+ -0.159166,-0.368726,0.91581,80.369733,-47.746524,280.521574,
+ -0.159166,-0.368726,0.91581,75.343129,-55.004404,276.725767,
+ -0.159166,-0.368726,0.91581,81.224679,-57.003766,276.942983,
+ -0.241407,-0.629956,0.738158,75.343129,-55.004404,276.725767,
+ -0.241407,-0.629956,0.738158,76.867019,-58.021701,274.649131,
+ -0.241407,-0.629956,0.738158,81.224679,-57.003766,276.942983,
+ 0.624508,-0.564212,0.540051,80.369733,-47.746524,280.521574,
+ 0.624508,-0.564212,0.540051,80.072372,-44.53209,284.223679,
+ 0.624508,-0.564212,0.540051,74.199336,-52.440705,282.752755,
+ 0.642138,-0.653938,0.40003,80.369733,-47.746524,280.521574,
+ 0.642138,-0.653938,0.40003,74.199336,-52.440705,282.752755,
+ 0.642138,-0.653938,0.40003,75.343129,-55.004404,276.725767,
+ 0.931628,-0.36107,-0.04121,80.072372,-44.53209,284.223679,
+ 0.931628,-0.36107,-0.04121,83.916383,-35.397755,291.092152,
+ 0.931628,-0.36107,-0.04121,77.565296,-51.853248,291.692386,
+ 0.797146,-0.542781,-0.264474,74.199336,-52.440705,282.752755,
+ 0.797146,-0.542781,-0.264474,80.072372,-44.53209,284.223679,
+ 0.797146,-0.542781,-0.264474,77.565296,-51.853248,291.692386,
+ 0.907155,-0.262221,-0.329106,83.916383,-35.397755,291.092152,
+ 0.907155,-0.262221,-0.329106,88.089823,-30.730954,298.877557,
+ 0.907155,-0.262221,-0.329106,84.197091,-51.819479,304.950178,
+ 0.841395,-0.340062,-0.420015,83.916383,-35.397755,291.092152,
+ 0.841395,-0.340062,-0.420015,84.197091,-51.819479,304.950178,
+ 0.841395,-0.340062,-0.420015,77.565296,-51.853248,291.692386,
+ 0.906177,-0.149312,-0.395662,68.655031,-97.675212,323.112979,
+ 0.906177,-0.149312,-0.395662,71.19074,-106.54183,332.26648,
+ 0.906177,-0.149312,-0.395662,67.75474,-103.526054,323.259006,
+ 0.853197,-0.236127,-0.465079,68.655031,-97.675212,323.112979,
+ 0.853197,-0.236127,-0.465079,72.725765,-95.775635,329.616382,
+ 0.853197,-0.236127,-0.465079,71.19074,-106.54183,332.26648,
+ 0.875393,0.266127,-0.403563,65.32344,-111.272822,316.176968,
+ 0.875393,0.266127,-0.403563,66.478184,-107.800101,320.971848,
+ 0.875393,0.266127,-0.403563,68.595281,-117.575437,319.117905,
+ 0.943975,0.246135,-0.219837,68.595281,-117.575437,319.117905,
+ 0.943975,0.246135,-0.219837,66.478184,-107.800101,320.971848,
+ 0.943975,0.246135,-0.219837,69.114288,-110.989893,328.719833,
+ 0.931208,-0.088984,-0.35346,66.478184,-107.800101,320.971848,
+ 0.931208,-0.088984,-0.35346,67.75474,-103.526054,323.259006,
+ 0.931208,-0.088984,-0.35346,69.114288,-110.989893,328.719833,
+ 0.914152,-0.117368,-0.388009,67.75474,-103.526054,323.259006,
+ 0.914152,-0.117368,-0.388009,71.19074,-106.54183,332.26648,
+ 0.914152,-0.117368,-0.388009,69.114288,-110.989893,328.719833,
+ 0.880748,-0.418813,-0.221088,75.550786,-67.903819,300.974879,
+ 0.880748,-0.418813,-0.221088,84.197091,-51.819479,304.950178,
+ 0.880748,-0.418813,-0.221088,78.336972,-67.639144,311.572838,
+ 0.838969,-0.347493,-0.418783,77.565296,-51.853248,291.692386,
+ 0.838969,-0.347493,-0.418783,84.197091,-51.819479,304.950178,
+ 0.838969,-0.347493,-0.418783,75.550786,-67.903819,300.974879,
+ 0.789283,-0.496501,-0.361274,78.336972,-67.639144,311.572838,
+ 0.789283,-0.496501,-0.361274,73.65158,-84.524507,324.542225,
+ 0.789283,-0.496501,-0.361274,68.602978,-87.891357,318.13952,
+ 0.852171,-0.478355,-0.212088,75.550786,-67.903819,300.974879,
+ 0.852171,-0.478355,-0.212088,78.336972,-67.639144,311.572838,
+ 0.852171,-0.478355,-0.212088,68.602978,-87.891357,318.13952,
+ 0.853508,-0.23251,-0.46633,68.602978,-87.891357,318.13952,
+ 0.853508,-0.23251,-0.46633,72.725765,-95.775635,329.616382,
+ 0.853508,-0.23251,-0.46633,68.655031,-97.675212,323.112979,
+ 0.819741,-0.290152,-0.493798,68.602978,-87.891357,318.13952,
+ 0.819741,-0.290152,-0.493798,73.65158,-84.524507,324.542225,
+ 0.819741,-0.290152,-0.493798,72.725765,-95.775635,329.616382,
+ 0.899757,-0.297545,-0.319225,74.199336,-52.440705,282.752755,
+ 0.899757,-0.297545,-0.319225,77.565296,-51.853248,291.692386,
+ 0.899757,-0.297545,-0.319225,75.550786,-67.903819,300.974879,
+ 0.795577,-0.431559,-0.425221,74.199336,-52.440705,282.752755,
+ 0.795577,-0.431559,-0.425221,75.550786,-67.903819,300.974879,
+ 0.795577,-0.431559,-0.425221,69.358336,-63.891709,285.317062,
+ 0.900054,-0.312488,0.303734,75.343129,-55.004404,276.725767,
+ 0.900054,-0.312488,0.303734,74.199336,-52.440705,282.752755,
+ 0.900054,-0.312488,0.303734,69.358336,-63.891709,285.317062,
+ 0.672816,-0.695873,-0.251158,75.343129,-55.004404,276.725767,
+ 0.672816,-0.695873,-0.251158,69.358336,-63.891709,285.317062,
+ 0.672816,-0.695873,-0.251158,66.868443,-63.3149,277.048853,
+ 0.39911,-0.374457,0.836954,75.343129,-55.004404,276.725767,
+ 0.39911,-0.374457,0.836954,66.868443,-63.3149,277.048853,
+ 0.39911,-0.374457,0.836954,76.867019,-58.021701,274.649131,
+ 0.501787,-0.808728,0.306868,76.867019,-58.021701,274.649131,
+ 0.501787,-0.808728,0.306868,66.868443,-63.3149,277.048853,
+ 0.501787,-0.808728,0.306868,68.196869,-64.037737,272.971639,
+ -0.199747,-0.296705,0.933846,78.620711,-64.24613,273.290161,
+ -0.199747,-0.296705,0.933846,72.280107,-66.909919,271.087577,
+ -0.199747,-0.296705,0.933846,79.272809,-73.883957,270.367478,
+ -0.470654,-0.543667,0.694918,72.280107,-66.909919,271.087577,
+ -0.470654,-0.543667,0.694918,76.729923,-73.255125,269.137195,
+ -0.470654,-0.543667,0.694918,79.272809,-73.883957,270.367478,
+ -0.034219,-0.222372,0.974361,76.867019,-58.021701,274.649131,
+ -0.034219,-0.222372,0.974361,68.196869,-64.037737,272.971639,
+ -0.034219,-0.222372,0.974361,78.620711,-64.24613,273.290161,
+ -0.036455,-0.583847,0.811045,68.196869,-64.037737,272.971639,
+ -0.036455,-0.583847,0.811045,72.280107,-66.909919,271.087577,
+ -0.036455,-0.583847,0.811045,78.620711,-64.24613,273.290161,
+ 0.114196,-0.264462,0.957611,68.196869,-64.037737,272.971639,
+ 0.114196,-0.264462,0.957611,64.381013,-68.62118,272.160881,
+ 0.114196,-0.264462,0.957611,70.307851,-68.955827,271.361683,
+ 0.30959,-0.17318,0.934967,68.196869,-64.037737,272.971639,
+ 0.30959,-0.17318,0.934967,70.307851,-68.955827,271.361683,
+ 0.30959,-0.17318,0.934967,72.280107,-66.909919,271.087577,
+ 0.873364,-0.480853,0.07756,64.381013,-68.62118,272.160881,
+ 0.873364,-0.480853,0.07756,66.868443,-63.3149,277.048853,
+ 0.873364,-0.480853,0.07756,64.325036,-67.987481,276.719986,
+ 0.69281,-0.63668,0.338604,64.381013,-68.62118,272.160881,
+ 0.69281,-0.63668,0.338604,68.196869,-64.037737,272.971639,
+ 0.69281,-0.63668,0.338604,66.868443,-63.3149,277.048853,
+ 0.690079,-0.6773,-0.255061,66.868443,-63.3149,277.048853,
+ 0.690079,-0.6773,-0.255061,69.358336,-63.891709,285.317062,
+ 0.690079,-0.6773,-0.255061,60.28661,-71.973124,282.232835,
+ 0.837533,-0.474907,0.270188,64.325036,-67.987481,276.719986,
+ 0.837533,-0.474907,0.270188,66.868443,-63.3149,277.048853,
+ 0.837533,-0.474907,0.270188,60.28661,-71.973124,282.232835,
+ 0.676936,-0.496197,-0.543641,69.358336,-63.891709,285.317062,
+ 0.676936,-0.496197,-0.543641,67.233999,-80.307349,297.654879,
+ 0.676936,-0.496197,-0.543641,57.687257,-82.77613,288.020703,
+ 0.633068,-0.478383,-0.608584,60.28661,-71.973124,282.232835,
+ 0.633068,-0.478383,-0.608584,69.358336,-63.891709,285.317062,
+ 0.633068,-0.478383,-0.608584,57.687257,-82.77613,288.020703,
+ -0.021247,0.956198,0.291949,11.728088,97.912431,309.650444,
+ -0.021247,0.956198,0.291949,0.020624,98.073061,308.272308,
+ -0.021247,0.956198,0.291949,10.339913,91.81608,329.516292,
+ 0.02296,0.961973,0.272177,10.339913,91.81608,329.516292,
+ 0.02296,0.961973,0.272177,0.020624,98.073061,308.272308,
+ 0.02296,0.961973,0.272177,0.020624,92.571773,327.715893,
+ 0.024558,0.782127,0.622635,17.904451,62.637317,374.372648,
+ 0.024558,0.782127,0.622635,9.959633,74.583901,359.679221,
+ 0.024558,0.782127,0.622635,0.020624,74.908813,359.663097,
+ 0.045752,0.79373,0.606547,17.904451,62.637317,374.372648,
+ 0.045752,0.79373,0.606547,0.020624,74.908813,359.663097,
+ 0.045752,0.79373,0.606547,0.020624,64.505558,373.276832,
+ 0.103196,0.860427,-0.499016,16.876477,84.093041,263.044799,
+ 0.103196,0.860427,-0.499016,0.020624,86.684728,264.027748,
+ 0.103196,0.860427,-0.499016,0.020624,92.570556,274.176367,
+ 0.051603,0.830622,-0.554441,16.876477,84.093041,263.044799,
+ 0.051603,0.830622,-0.554441,0.020624,92.570556,274.176367,
+ 0.051603,0.830622,-0.554441,14.294221,89.856571,271.438956,
+ 0.372563,0.814538,-0.444662,38.111334,75.809013,265.661737,
+ 0.372563,0.814538,-0.444662,16.876477,84.093041,263.044799,
+ 0.372563,0.814538,-0.444662,14.294221,89.856571,271.438956,
+ 0.344594,0.791703,-0.504442,38.224202,81.984462,275.430988,
+ 0.344594,0.791703,-0.504442,38.111334,75.809013,265.661737,
+ 0.344594,0.791703,-0.504442,14.294221,89.856571,271.438956,
+ 0.654887,0.635359,-0.409197,38.111334,75.809013,265.661737,
+ 0.654887,0.635359,-0.409197,38.224202,81.984462,275.430988,
+ 0.654887,0.635359,-0.409197,60.474499,55.661453,270.169124,
+ 0.666105,0.639707,-0.383509,60.474499,55.661453,270.169124,
+ 0.666105,0.639707,-0.383509,38.224202,81.984462,275.430988,
+ 0.666105,0.639707,-0.383509,61.755162,61.847854,282.712597,
+ 0.757702,0.551282,-0.349251,60.474499,55.661453,270.169124,
+ 0.757702,0.551282,-0.349251,61.755162,61.847854,282.712597,
+ 0.757702,0.551282,-0.349251,75.572651,38.636147,276.050693,
+ 0.77645,0.550325,-0.307029,75.572651,38.636147,276.050693,
+ 0.77645,0.550325,-0.307029,61.755162,61.847854,282.712597,
+ 0.77645,0.550325,-0.307029,76.142049,45.244812,289.336169,
+ 0.938124,0.292344,-0.185629,75.572651,38.636147,276.050693,
+ 0.938124,0.292344,-0.185629,76.142049,45.244812,289.336169,
+ 0.938124,0.292344,-0.185629,83.502273,18.033772,283.678814,
+ 0.924317,0.299253,-0.236826,83.502273,18.033772,283.678814,
+ 0.924317,0.299253,-0.236826,76.142049,45.244812,289.336169,
+ 0.924317,0.299253,-0.236826,85.735705,21.969217,297.368604,
+ 0.961347,0.179799,-0.208527,83.502273,18.033772,283.678814,
+ 0.961347,0.179799,-0.208527,85.735705,21.969217,297.368604,
+ 0.961347,0.179799,-0.208527,88.836268,1.038584,293.615693,
+ 0.974102,0.170853,-0.148099,88.836268,1.038584,293.615693,
+ 0.974102,0.170853,-0.148099,85.735705,21.969217,297.368604,
+ 0.974102,0.170853,-0.148099,90.633413,2.857541,307.534564,
+ 0.991584,0.008716,-0.129168,88.836268,1.038584,293.615693,
+ 0.991584,0.008716,-0.129168,90.633413,2.857541,307.534564,
+ 0.991584,0.008716,-0.129168,91.537567,-26.135949,312.518975,
+ 0.993936,0.012208,-0.109283,90.633413,2.857541,307.534564,
+ 0.993936,0.012208,-0.109283,92.42721,-21.132068,321.16929,
+ 0.993936,0.012208,-0.109283,91.537567,-26.135949,312.518975,
+ 0.979993,-0.198535,0.014058,91.537567,-26.135949,312.518975,
+ 0.979993,-0.198535,0.014058,92.42721,-21.132068,321.16929,
+ 0.979993,-0.198535,0.014058,86.900063,-48.320291,322.502401,
+ 0.978811,-0.200921,-0.03949,92.42721,-21.132068,321.16929,
+ 0.978811,-0.200921,-0.03949,88.248598,-43.555834,331.686629,
+ 0.978811,-0.200921,-0.03949,86.900063,-48.320291,322.502401,
+ 0.969899,-0.237256,-0.054826,88.248598,-43.555834,331.686629,
+ 0.969899,-0.237256,-0.054826,85.931626,-55.624109,342.92285,
+ 0.969899,-0.237256,-0.054826,83.339695,-64.255866,334.423735,
+ 0.972139,-0.233402,-0.02166,86.900063,-48.320291,322.502401,
+ 0.972139,-0.233402,-0.02166,88.248598,-43.555834,331.686629,
+ 0.972139,-0.233402,-0.02166,83.339695,-64.255866,334.423735,
+ 0.976637,-0.212506,-0.031949,85.931626,-55.624109,342.92285,
+ 0.976637,-0.212506,-0.031949,82.402806,-73.350956,352.960123,
+ 0.976637,-0.212506,-0.031949,78.826327,-88.998125,347.70769,
+ 0.973041,-0.217966,-0.075375,83.339695,-64.255866,334.423735,
+ 0.973041,-0.217966,-0.075375,85.931626,-55.624109,342.92285,
+ 0.973041,-0.217966,-0.075375,78.826327,-88.998125,347.70769,
+ 0.890093,-0.297571,0.345233,82.402806,-73.350956,352.960123,
+ 0.890093,-0.297571,0.345233,70.601214,-88.864267,370.015851,
+ 0.890093,-0.297571,0.345233,69.212887,-100.775257,363.328696,
+ 0.895995,-0.31115,0.316826,78.826327,-88.998125,347.70769,
+ 0.895995,-0.31115,0.316826,82.402806,-73.350956,352.960123,
+ 0.895995,-0.31115,0.316826,69.212887,-100.775257,363.328696,
+ 0.696414,-0.321911,0.64139,70.601214,-88.864267,370.015851,
+ 0.696414,-0.321911,0.64139,53.764071,-101.363323,382.024194,
+ 0.696414,-0.321911,0.64139,55.423098,-113.615349,374.073595,
+ 0.762534,-0.382012,0.522119,69.212887,-100.775257,363.328696,
+ 0.762534,-0.382012,0.522119,70.601214,-88.864267,370.015851,
+ 0.762534,-0.382012,0.522119,55.423098,-113.615349,374.073595,
+ 0.462884,-0.392292,0.794887,53.764071,-101.363323,382.024194,
+ 0.462884,-0.392292,0.794887,34.044464,-109.155116,389.662049,
+ 0.462884,-0.392292,0.794887,34.43813,-123.708904,382.250232,
+ 0.498424,-0.423418,0.756499,53.764071,-101.363323,382.024194,
+ 0.498424,-0.423418,0.756499,34.43813,-123.708904,382.250232,
+ 0.498424,-0.423418,0.756499,55.423098,-113.615349,374.073595,
+ 0.310233,-0.469402,0.826691,34.044464,-109.155116,389.662049,
+ 0.310233,-0.469402,0.826691,16.49285,-110.7815,395.325185,
+ 0.310233,-0.469402,0.826691,17.3751,-128.428032,384.974257,
+ 0.257644,-0.432947,0.863815,34.044464,-109.155116,389.662049,
+ 0.257644,-0.432947,0.863815,17.3751,-128.428032,384.974257,
+ 0.257644,-0.432947,0.863815,34.43813,-123.708904,382.250232,
+ 0.081925,-0.530576,0.843669,16.49285,-110.7815,395.325185,
+ 0.081925,-0.530576,0.843669,0.020624,-114.340316,394.686618,
+ 0.081925,-0.530576,0.843669,0.020624,-132.807341,383.072855,
+ 0.032766,-0.504462,0.862812,16.49285,-110.7815,395.325185,
+ 0.032766,-0.504462,0.862812,0.020624,-132.807341,383.072855,
+ 0.032766,-0.504462,0.862812,17.3751,-128.428032,384.974257,
+ 0.077682,-0.268781,0.960064,0.020624,-64.758444,412.788574,
+ 0.077682,-0.268781,0.960064,15.452403,-89.586191,404.58912,
+ 0.077682,-0.268781,0.960064,15.964108,-66.691181,410.957448,
+ 0.07522,-0.27024,0.95985,0.020624,-64.758444,412.788574,
+ 0.07522,-0.27024,0.95985,0.020624,-89.428603,405.842829,
+ 0.07522,-0.27024,0.95985,15.452403,-89.586191,404.58912,
+ 0.078142,-0.16461,0.983259,14.87103,-47.814975,414.204434,
+ 0.078142,-0.16461,0.983259,0.020624,-51.435548,414.778505,
+ 0.078142,-0.16461,0.983259,15.964108,-66.691181,410.957448,
+ 0.095248,-0.147051,0.984532,0.020624,-51.435548,414.778505,
+ 0.095248,-0.147051,0.984532,0.020624,-64.758444,412.788574,
+ 0.095248,-0.147051,0.984532,15.964108,-66.691181,410.957448,
+ 0.074338,0.003703,0.997226,0.020624,-23.083363,415.219631,
+ 0.074338,0.003703,0.997226,14.87103,-47.814975,414.204434,
+ 0.074338,0.003703,0.997226,16.069065,-24.589881,414.028897,
+ 0.042407,-0.015543,0.99898,0.020624,-23.083363,415.219631,
+ 0.042407,-0.015543,0.99898,0.020624,-51.435548,414.778505,
+ 0.042407,-0.015543,0.99898,14.87103,-47.814975,414.204434,
+ 0.906157,-0.154877,0.393563,89.362394,-25.811646,357.539307,
+ 0.906157,-0.154877,0.393563,85.8138,-17.878084,368.83181,
+ 0.906157,-0.154877,0.393563,79.836577,-34.488428,376.057442,
+ 0.89424,-0.028421,0.446685,89.362394,-25.811646,357.539307,
+ 0.89424,-0.028421,0.446685,79.836577,-34.488428,376.057442,
+ 0.89424,-0.028421,0.446685,84.014678,-42.674192,367.172266,
+ 0.394826,0.036375,0.918036,46.389887,-21.686364,402.623527,
+ 0.394826,0.036375,0.918036,31.863175,-22.322498,408.896328,
+ 0.394826,0.036375,0.918036,31.50054,-43.516589,409.892054,
+ 0.379686,0.048632,0.923836,46.389887,-21.686364,402.623527,
+ 0.379686,0.048632,0.923836,31.50054,-43.516589,409.892054,
+ 0.379686,0.048632,0.923836,47.260577,-42.099817,403.340279,
+ 0.240753,0.041439,0.969701,31.863175,-22.322498,408.896328,
+ 0.240753,0.041439,0.969701,14.87103,-47.814975,414.204434,
+ 0.240753,0.041439,0.969701,31.50054,-43.516589,409.892054,
+ 0.31019,-0.008816,0.950634,31.863175,-22.322498,408.896328,
+ 0.31019,-0.008816,0.950634,16.069065,-24.589881,414.028897,
+ 0.31019,-0.008816,0.950634,14.87103,-47.814975,414.204434,
+ 0.889814,0.313261,0.33181,84.857805,36.43843,346.739648,
+ 0.889814,0.313261,0.33181,79.590109,35.425972,361.821873,
+ 0.889814,0.313261,0.33181,82.521697,18.705499,369.746004,
+ 0.833863,0.392998,0.387588,84.857805,36.43843,346.739648,
+ 0.833863,0.392998,0.387588,82.521697,18.705499,369.746004,
+ 0.833863,0.392998,0.387588,89.880244,17.371779,355.267056,
+ 0.891531,0.081245,0.445614,89.880244,17.371779,355.267056,
+ 0.891531,0.081245,0.445614,82.521697,18.705499,369.746004,
+ 0.891531,0.081245,0.445614,80.02985,1.524126,377.863926,
+ 0.855311,0.167477,0.490301,89.880244,17.371779,355.267056,
+ 0.855311,0.167477,0.490301,80.02985,1.524126,377.863926,
+ 0.855311,0.167477,0.490301,89.34843,-1.927907,362.787177,
+ 0.836032,-0.099668,0.539552,89.34843,-1.927907,362.787177,
+ 0.836032,-0.099668,0.539552,80.02985,1.524126,377.863926,
+ 0.836032,-0.099668,0.539552,73.651094,-18.674848,384.016559,
+ 0.777179,0.064977,0.625916,89.34843,-1.927907,362.787177,
+ 0.777179,0.064977,0.625916,73.651094,-18.674848,384.016559,
+ 0.777179,0.064977,0.625916,85.8138,-17.878084,368.83181,
+ 0.956187,-0.108913,0.271744,92.555684,-8.988954,348.671777,
+ 0.956187,-0.108913,0.271744,89.34843,-1.927907,362.787177,
+ 0.956187,-0.108913,0.271744,85.8138,-17.878084,368.83181,
+ 0.950441,-0.016769,0.310451,92.555684,-8.988954,348.671777,
+ 0.950441,-0.016769,0.310451,85.8138,-17.878084,368.83181,
+ 0.950441,-0.016769,0.310451,89.362394,-25.811646,357.539307,
+ 0.984203,0.040074,0.172448,92.924891,12.684291,338.979798,
+ 0.984203,0.040074,0.172448,89.880244,17.371779,355.267056,
+ 0.984203,0.040074,0.172448,89.34843,-1.927907,362.787177,
+ 0.979692,0.067709,0.188732,92.924891,12.684291,338.979798,
+ 0.979692,0.067709,0.188732,89.34843,-1.927907,362.787177,
+ 0.979692,0.067709,0.188732,92.555684,-8.988954,348.671777,
+ 0.94541,0.302852,0.120331,88.418355,32.110231,329.658669,
+ 0.94541,0.302852,0.120331,84.857805,36.43843,346.739648,
+ 0.94541,0.302852,0.120331,89.880244,17.371779,355.267056,
+ 0.95737,0.2706,0.101086,88.418355,32.110231,329.658669,
+ 0.95737,0.2706,0.101086,89.880244,17.371779,355.267056,
+ 0.95737,0.2706,0.101086,92.924891,12.684291,338.979798,
+ 0.289533,0.774365,0.562609,51.46517,49.055526,375.795201,
+ 0.289533,0.774365,0.562609,17.904451,62.637317,374.372648,
+ 0.289533,0.774365,0.562609,36.149392,50.759486,381.331779,
+ 0.24199,0.671333,0.700538,39.006971,64.476657,365.320453,
+ 0.24199,0.671333,0.700538,17.904451,62.637317,374.372648,
+ 0.24199,0.671333,0.700538,51.46517,49.055526,375.795201,
+ 0.191393,0.77408,0.603464,39.006971,64.476657,365.320453,
+ 0.191393,0.77408,0.603464,24.657926,72.167143,360.006567,
+ 0.191393,0.77408,0.603464,17.904451,62.637317,374.372648,
+ 0.118606,0.800849,0.587004,24.657926,72.167143,360.006567,
+ 0.118606,0.800849,0.587004,9.959633,74.583901,359.679221,
+ 0.118606,0.800849,0.587004,17.904451,62.637317,374.372648,
+ 0.177216,0.923469,0.340295,34.029557,92.402624,315.587686,
+ 0.177216,0.923469,0.340295,10.339913,91.81608,329.516292,
+ 0.177216,0.923469,0.340295,30.845241,87.030631,331.824138,
+ 0.152879,0.941714,0.299672,34.029557,92.402624,315.587686,
+ 0.152879,0.941714,0.299672,11.728088,97.912431,309.650444,
+ 0.152879,0.941714,0.299672,10.339913,91.81608,329.516292,
+ 0.76726,0.563726,0.30582,74.46891,55.917001,336.8986,
+ 0.76726,0.563726,0.30582,79.590109,35.425972,361.821873,
+ 0.76726,0.563726,0.30582,84.857805,36.43843,346.739648,
+ 0.829339,0.503052,0.24318,74.46891,55.917001,336.8986,
+ 0.829339,0.503052,0.24318,70.750893,55.245274,350.968062,
+ 0.829339,0.503052,0.24318,79.590109,35.425972,361.821873,
+ 0.644826,0.727997,0.232852,70.750893,55.245274,350.968062,
+ 0.644826,0.727997,0.232852,58.207024,74.989128,323.97728,
+ 0.644826,0.727997,0.232852,53.588656,73.958112,339.990127,
+ 0.668742,0.712996,0.210764,74.46891,55.917001,336.8986,
+ 0.668742,0.712996,0.210764,58.207024,74.989128,323.97728,
+ 0.668742,0.712996,0.210764,70.750893,55.245274,350.968062,
+ 0.366201,0.859645,0.356242,53.588656,73.958112,339.990127,
+ 0.366201,0.859645,0.356242,34.029557,92.402624,315.587686,
+ 0.366201,0.859645,0.356242,30.845241,87.030631,331.824138,
+ 0.52438,0.826572,0.20446,58.207024,74.989128,323.97728,
+ 0.52438,0.826572,0.20446,34.029557,92.402624,315.587686,
+ 0.52438,0.826572,0.20446,53.588656,73.958112,339.990127,
+ 0.215357,0.97208,0.093174,34.029557,92.402624,315.587686,
+ 0.215357,0.97208,0.093174,14.647425,98.812935,293.507997,
+ 0.215357,0.97208,0.093174,11.728088,97.912431,309.650444,
+ 0.284066,0.95837,0.028879,37.350774,91.887877,300.001361,
+ 0.284066,0.95837,0.028879,14.647425,98.812935,293.507997,
+ 0.284066,0.95837,0.028879,34.029557,92.402624,315.587686,
+ 0.560652,0.822892,0.09229,58.207024,74.989128,323.97728,
+ 0.560652,0.822892,0.09229,37.350774,91.887877,300.001361,
+ 0.560652,0.822892,0.09229,34.029557,92.402624,315.587686,
+ 0.647048,0.762013,-0.025773,61.054108,72.039065,308.232759,
+ 0.647048,0.762013,-0.025773,37.350774,91.887877,300.001361,
+ 0.647048,0.762013,-0.025773,58.207024,74.989128,323.97728,
+ 0.756118,0.654282,0.014136,61.054108,72.039065,308.232759,
+ 0.756118,0.654282,0.014136,58.207024,74.989128,323.97728,
+ 0.756118,0.654282,0.014136,74.46891,55.917001,336.8986,
+ 0.758005,0.652138,0.012047,61.054108,72.039065,308.232759,
+ 0.758005,0.652138,0.012047,74.46891,55.917001,336.8986,
+ 0.758005,0.652138,0.012047,76.707833,53.667262,317.808219,
+ 0.87189,0.48765,0.044787,76.707833,53.667262,317.808219,
+ 0.87189,0.48765,0.044787,74.46891,55.917001,336.8986,
+ 0.87189,0.48765,0.044787,84.857805,36.43843,346.739648,
+ 0.864757,0.499307,0.053739,76.707833,53.667262,317.808219,
+ 0.864757,0.499307,0.053739,84.857805,36.43843,346.739648,
+ 0.864757,0.499307,0.053739,88.418355,32.110231,329.658669,
+ 0.016567,0.99814,0.058677,14.647425,98.812935,293.507997,
+ 0.016567,0.99814,0.058677,0.020624,99.098297,292.783639,
+ 0.016567,0.99814,0.058677,11.728088,97.912431,309.650444,
+ 0.005915,0.997799,0.066047,11.728088,97.912431,309.650444,
+ 0.005915,0.997799,0.066047,0.020624,99.098297,292.783639,
+ 0.005915,0.997799,0.066047,0.020624,98.073061,308.272308,
+ 0.389641,0.627286,-0.674308,31.267808,-93.5262,241.675474,
+ 0.389641,0.627286,-0.674308,37.306965,-103.823585,235.585816,
+ 0.389641,0.627286,-0.674308,35.960468,-104.244632,234.416073,
+ 0.845657,0.530517,-0.058441,37.306965,-103.823585,235.585816,
+ 0.845657,0.530517,-0.058441,31.267808,-93.5262,241.675474,
+ 0.845657,0.530517,-0.058441,31.987907,-94.207359,245.912102,
+ 0.01084,0.533934,-0.845457,26.697446,-94.535312,240.429067,
+ 0.01084,0.533934,-0.845457,35.960468,-104.244632,234.416073,
+ 0.01084,0.533934,-0.845457,29.10812,-105.977493,233.233857,
+ 0.090498,0.585328,-0.80573,31.267808,-93.5262,241.675474,
+ 0.090498,0.585328,-0.80573,35.960468,-104.244632,234.416073,
+ 0.090498,0.585328,-0.80573,26.697446,-94.535312,240.429067,
+ -0.408157,0.519428,-0.750734,23.44255,-96.388951,242.948349,
+ -0.408157,0.519428,-0.750734,29.10812,-105.977493,233.233857,
+ -0.408157,0.519428,-0.750734,24.645453,-107.017028,234.94086,
+ -0.682321,0.280714,-0.67501,29.10812,-105.977493,233.233857,
+ -0.682321,0.280714,-0.67501,23.44255,-96.388951,242.948349,
+ -0.682321,0.280714,-0.67501,26.697446,-94.535312,240.429067,
+ -0.800213,0.230384,-0.553699,24.645453,-107.017028,234.94086,
+ -0.800213,0.230384,-0.553699,19.139906,-108.36748,242.335641,
+ -0.800213,0.230384,-0.553699,17.173704,-99.00741,249.071776,
+ -0.724462,0.360615,-0.587463,24.645453,-107.017028,234.94086,
+ -0.724462,0.360615,-0.587463,17.173704,-99.00741,249.071776,
+ -0.724462,0.360615,-0.587463,23.44255,-96.388951,242.948349,
+ -0.020403,0.345987,-0.938017,6.064344,-98.424516,246.287515,
+ -0.020403,0.345987,-0.938017,19.139906,-108.36748,242.335641,
+ -0.020403,0.345987,-0.938017,4.712371,-109.094576,242.381274,
+ 0.223983,0.599845,-0.768126,6.064344,-98.424516,246.287515,
+ 0.223983,0.599845,-0.768126,17.173704,-99.00741,249.071776,
+ 0.223983,0.599845,-0.768126,19.139906,-108.36748,242.335641,
+ 0.102274,0.294691,-0.950104,0.020624,-97.592158,245.443901,
+ 0.102274,0.294691,-0.950104,4.712371,-109.094576,242.381274,
+ 0.102274,0.294691,-0.950104,0.020624,-109.91446,241.62193,
+ 0.17398,0.319023,-0.931641,0.020624,-97.592158,245.443901,
+ 0.17398,0.319023,-0.931641,6.064344,-98.424516,246.287515,
+ 0.17398,0.319023,-0.931641,4.712371,-109.094576,242.381274,
+ 0.024335,0.337421,-0.941039,6.554145,-93.138923,247.209619,
+ 0.024335,0.337421,-0.941039,0.020624,-97.592158,245.443901,
+ 0.024335,0.337421,-0.941039,0.020624,-93.580656,246.882273,
+ 0.157542,0.155529,-0.975188,6.554145,-93.138923,247.209619,
+ 0.157542,0.155529,-0.975188,6.064344,-98.424516,246.287515,
+ 0.157542,0.155529,-0.975188,0.020624,-97.592158,245.443901,
+ 0.410711,0.119629,-0.903884,14.105602,-92.64182,250.706677,
+ 0.410711,0.119629,-0.903884,6.064344,-98.424516,246.287515,
+ 0.410711,0.119629,-0.903884,6.554145,-93.138923,247.209619,
+ 0.244955,0.350256,-0.904056,14.105602,-92.64182,250.706677,
+ 0.244955,0.350256,-0.904056,17.173704,-99.00741,249.071776,
+ 0.244955,0.350256,-0.904056,6.064344,-98.424516,246.287515,
+ -0.394615,0.045504,-0.917719,21.008451,-90.662537,247.836625,
+ -0.394615,0.045504,-0.917719,17.173704,-99.00741,249.071776,
+ -0.394615,0.045504,-0.917719,14.105602,-92.64182,250.706677,
+ -0.727767,0.239302,-0.642721,23.44255,-96.388951,242.948349,
+ -0.727767,0.239302,-0.642721,17.173704,-99.00741,249.071776,
+ -0.727767,0.239302,-0.642721,21.008451,-90.662537,247.836625,
+ -0.123859,0.613273,-0.780099,26.883327,-89.412175,247.886822,
+ -0.123859,0.613273,-0.780099,23.44255,-96.388951,242.948349,
+ -0.123859,0.613273,-0.780099,21.008451,-90.662537,247.836625,
+ -0.669646,0.61984,-0.409112,26.697446,-94.535312,240.429067,
+ -0.669646,0.61984,-0.409112,23.44255,-96.388951,242.948349,
+ -0.669646,0.61984,-0.409112,26.883327,-89.412175,247.886822,
+ -0.044722,0.823947,-0.564899,30.460093,-88.790036,248.51109,
+ -0.044722,0.823947,-0.564899,26.697446,-94.535312,240.429067,
+ -0.044722,0.823947,-0.564899,26.883327,-89.412175,247.886822,
+ -0.025303,0.820312,-0.571356,31.267808,-93.5262,241.675474,
+ -0.025303,0.820312,-0.571356,26.697446,-94.535312,240.429067,
+ -0.025303,0.820312,-0.571356,30.460093,-88.790036,248.51109,
+ 0.988659,0.149598,0.013171,31.267808,-93.5262,241.675474,
+ 0.988659,0.149598,0.013171,30.460093,-88.790036,248.51109,
+ 0.988659,0.149598,0.013171,30.787134,-91.208619,251.432861,
+ 0.873837,0.480979,-0.071195,31.267808,-93.5262,241.675474,
+ 0.873837,0.480979,-0.071195,30.787134,-91.208619,251.432861,
+ 0.873837,0.480979,-0.071195,31.987907,-94.207359,245.912102,
+ 0.894565,-0.054248,-0.443632,30.539191,-81.2112,247.743837,
+ 0.894565,-0.054248,-0.443632,31.298839,-81.71104,249.336755,
+ 0.894565,-0.054248,-0.443632,30.460093,-88.790036,248.51109,
+ 0.9778,-0.094011,-0.187268,30.460093,-88.790036,248.51109,
+ 0.9778,-0.094011,-0.187268,31.298839,-81.71104,249.336755,
+ 0.9778,-0.094011,-0.187268,30.787134,-91.208619,251.432861,
+ 0.165922,0.034985,-0.985518,29.572366,-81.554669,248.618481,
+ 0.165922,0.034985,-0.985518,30.460093,-88.790036,248.51109,
+ 0.165922,0.034985,-0.985518,26.883327,-89.412175,247.886822,
+ -0.655612,-0.069278,-0.751913,30.539191,-81.2112,247.743837,
+ -0.655612,-0.069278,-0.751913,30.460093,-88.790036,248.51109,
+ -0.655612,-0.069278,-0.751913,29.572366,-81.554669,248.618481,
+ -0.747628,0.484975,-0.453708,29.572366,-81.554669,248.618481,
+ -0.747628,0.484975,-0.453708,27.950242,-80.566548,252.347663,
+ -0.747628,0.484975,-0.453708,29.832174,-78.81665,251.117076,
+ -0.662494,0.538255,-0.520945,30.539191,-81.2112,247.743837,
+ -0.662494,0.538255,-0.520945,29.572366,-81.554669,248.618481,
+ -0.662494,0.538255,-0.520945,29.832174,-78.81665,251.117076,
+ 0.901427,0.419097,-0.108567,30.539191,-81.2112,247.743837,
+ 0.901427,0.419097,-0.108567,29.832174,-78.81665,251.117076,
+ 0.901427,0.419097,-0.108567,30.588171,-80.084049,252.501601,
+ 0.753261,0.638225,-0.158955,30.539191,-81.2112,247.743837,
+ 0.753261,0.638225,-0.158955,30.588171,-80.084049,252.501601,
+ 0.753261,0.638225,-0.158955,31.298839,-81.71104,249.336755,
+ 0.788982,0.566805,-0.23715,29.832174,-78.81665,251.117076,
+ 0.788982,0.566805,-0.23715,28.581203,-74.47689,257.327511,
+ 0.788982,0.566805,-0.23715,29.458586,-75.589743,257.58671,
+ 0.910457,0.388716,-0.141309,29.832174,-78.81665,251.117076,
+ 0.910457,0.388716,-0.141309,29.458586,-75.589743,257.58671,
+ 0.910457,0.388716,-0.141309,30.588171,-80.084049,252.501601,
+ 0.180829,0.611308,-0.770456,28.581203,-74.47689,257.327511,
+ 0.180829,0.611308,-0.770456,27.950242,-80.566548,252.347663,
+ 0.180829,0.611308,-0.770456,27.799651,-75.086556,256.660347,
+ -0.745297,0.466644,-0.47621,29.832174,-78.81665,251.117076,
+ -0.745297,0.466644,-0.47621,27.950242,-80.566548,252.347663,
+ -0.745297,0.466644,-0.47621,28.581203,-74.47689,257.327511,
+ 0.049355,0.656006,-0.75314,29.215207,-68.486713,262.501758,
+ 0.049355,0.656006,-0.75314,27.799651,-75.086556,256.660347,
+ 0.049355,0.656006,-0.75314,26.696838,-68.714273,262.138515,
+ 0.148204,0.637437,-0.756115,29.215207,-68.486713,262.501758,
+ 0.148204,0.637437,-0.756115,28.581203,-74.47689,257.327511,
+ 0.148204,0.637437,-0.756115,27.799651,-75.086556,256.660347,
+ 0.968025,0.097274,-0.231225,28.581203,-74.47689,257.327511,
+ 0.968025,0.097274,-0.231225,29.215207,-68.486713,262.501758,
+ 0.968025,0.097274,-0.231225,29.736952,-71.028507,263.616741,
+ 0.759064,0.501871,-0.414666,28.581203,-74.47689,257.327511,
+ 0.759064,0.501871,-0.414666,29.736952,-71.028507,263.616741,
+ 0.759064,0.501871,-0.414666,29.458586,-75.589743,257.58671,
+ 0.965056,0.040869,-0.258837,29.215207,-68.486713,262.501758,
+ 0.965056,0.040869,-0.258837,30.216409,-63.560409,267.012492,
+ 0.965056,0.040869,-0.258837,30.33171,-68.076923,266.72926,
+ 0.961553,0.08247,-0.261945,29.215207,-68.486713,262.501758,
+ 0.961553,0.08247,-0.261945,30.33171,-68.076923,266.72926,
+ 0.961553,0.08247,-0.261945,29.736952,-71.028507,263.616741,
+ 0.277753,0.553111,-0.785443,30.216409,-63.560409,267.012492,
+ 0.277753,0.553111,-0.785443,26.696838,-68.714273,262.138515,
+ 0.277753,0.553111,-0.785443,27.566007,-63.57562,266.06453,
+ 0.04645,0.669434,-0.741418,30.216409,-63.560409,267.012492,
+ 0.04645,0.669434,-0.741418,29.215207,-68.486713,262.501758,
+ 0.04645,0.669434,-0.741418,26.696838,-68.714273,262.138515,
+ 0.175799,0.844983,-0.505073,30.216409,-63.560409,267.012492,
+ 0.175799,0.844983,-0.505073,27.566007,-63.57562,266.06453,
+ 0.175799,0.844983,-0.505073,26.07257,-58.398939,274.205268,
+ -0.533505,0.510955,-0.674015,28.165024,-57.196949,273.460223,
+ -0.533505,0.510955,-0.674015,30.216409,-63.560409,267.012492,
+ -0.533505,0.510955,-0.674015,26.07257,-58.398939,274.205268,
+ -0.057204,-0.053817,-0.996911,75.573101,-20.959268,276.625373,
+ -0.057204,-0.053817,-0.996911,72.047284,-30.556329,277.345776,
+ -0.057204,-0.053817,-0.996911,65.619419,-26.665604,277.504581,
+ 0.453301,-0.837652,-0.304724,75.573101,-20.959268,276.625373,
+ 0.453301,-0.837652,-0.304724,65.619419,-26.665604,277.504581,
+ 0.453301,-0.837652,-0.304724,70.272318,-23.369638,275.365884,
+ 0.131693,0.625719,-0.768852,64.16036,-29.199184,277.099354,
+ 0.131693,0.625719,-0.768852,72.047284,-30.556329,277.345776,
+ 0.131693,0.625719,-0.768852,66.956546,-33.00138,274.483938,
+ 0.052953,0.127907,-0.990371,65.619419,-26.665604,277.504581,
+ 0.052953,0.127907,-0.990371,72.047284,-30.556329,277.345776,
+ 0.052953,0.127907,-0.990371,64.16036,-29.199184,277.099354,
+ 0.506915,-0.860485,0.051013,75.804707,-16.119059,265.471901,
+ 0.506915,-0.860485,0.051013,67.493685,-20.598154,272.505263,
+ 0.506915,-0.860485,0.051013,63.568552,-23.022213,270.620289,
+ 0.57546,-0.6652,0.475768,75.804707,-16.119059,265.471901,
+ 0.57546,-0.6652,0.475768,63.568552,-23.022213,270.620289,
+ 0.57546,-0.6652,0.475768,68.465408,-25.331276,261.468917,
+ 0.843332,-0.195469,0.500583,68.465408,-25.331276,261.468917,
+ 0.843332,-0.195469,0.500583,63.568552,-23.022213,270.620289,
+ 0.843332,-0.195469,0.500583,61.071479,-28.187638,272.810095,
+ 0.841711,-0.041349,0.538343,68.465408,-25.331276,261.468917,
+ 0.841711,-0.041349,0.538343,61.071479,-28.187638,272.810095,
+ 0.841711,-0.041349,0.538343,63.8673,-33.103903,268.061154,
+ 0.652446,0.68473,-0.324745,66.956546,-33.00138,274.483938,
+ 0.652446,0.68473,-0.324745,63.8673,-33.103903,268.061154,
+ 0.652446,0.68473,-0.324745,61.071479,-28.187638,272.810095,
+ 0.715612,0.60226,-0.35381,63.8673,-33.103903,268.061154,
+ 0.715612,0.60226,-0.35381,66.956546,-33.00138,274.483938,
+ 0.715612,0.60226,-0.35381,68.528747,-35.878733,272.765983,
+ 0.729816,-0.32401,-0.601984,61.071479,-28.187638,272.810095,
+ 0.729816,-0.32401,-0.601984,65.619419,-26.665604,277.504581,
+ 0.729816,-0.32401,-0.601984,64.16036,-29.199184,277.099354,
+ 0.653339,0.691878,-0.307331,66.956546,-33.00138,274.483938,
+ 0.653339,0.691878,-0.307331,61.071479,-28.187638,272.810095,
+ 0.653339,0.691878,-0.307331,64.16036,-29.199184,277.099354,
+ 0.685574,-0.538915,-0.489447,63.568552,-23.022213,270.620289,
+ 0.685574,-0.538915,-0.489447,65.619419,-26.665604,277.504581,
+ 0.685574,-0.538915,-0.489447,61.071479,-28.187638,272.810095,
+ 0.615955,-0.605504,-0.503949,63.568552,-23.022213,270.620289,
+ 0.615955,-0.605504,-0.503949,67.493685,-20.598154,272.505263,
+ 0.615955,-0.605504,-0.503949,65.619419,-26.665604,277.504581,
+ 0.118748,-0.652997,-0.747994,67.493685,-20.598154,272.505263,
+ 0.118748,-0.652997,-0.747994,70.272318,-23.369638,275.365884,
+ 0.118748,-0.652997,-0.747994,65.619419,-26.665604,277.504581,
+ 0.834296,0.258141,-0.487148,82.115801,-66.120152,271.523531,
+ 0.834296,0.258141,-0.487148,80.129356,-59.12999,271.825626,
+ 0.834296,0.258141,-0.487148,83.149281,-65.010342,273.881573,
+ 0.794954,0.209152,-0.569476,80.129356,-59.12999,271.825626,
+ 0.794954,0.209152,-0.569476,81.426197,-55.746711,274.878517,
+ 0.794954,0.209152,-0.569476,83.149281,-65.010342,273.881573,
+ 0.385394,0.22107,-0.895879,80.129356,-59.12999,271.825626,
+ 0.385394,0.22107,-0.895879,79.841949,-68.2625,269.448417,
+ 0.385394,0.22107,-0.895879,77.30258,-63.094641,269.631255,
+ 0.556017,0.192947,-0.808466,80.129356,-59.12999,271.825626,
+ 0.556017,0.192947,-0.808466,82.115801,-66.120152,271.523531,
+ 0.556017,0.192947,-0.808466,79.841949,-68.2625,269.448417,
+ 0.920503,0.134869,-0.36672,83.420558,-75.098116,271.496759,
+ 0.920503,0.134869,-0.36672,82.115801,-66.120152,271.523531,
+ 0.920503,0.134869,-0.36672,84.770979,-75.410859,274.77143,
+ 0.892685,0.101625,-0.439075,82.115801,-66.120152,271.523531,
+ 0.892685,0.101625,-0.439075,83.149281,-65.010342,273.881573,
+ 0.892685,0.101625,-0.439075,84.770979,-75.410859,274.77143,
+ 0.58112,0.15673,-0.798583,82.115801,-66.120152,271.523531,
+ 0.58112,0.15673,-0.798583,80.826583,-73.858706,269.066615,
+ 0.58112,0.15673,-0.798583,79.841949,-68.2625,269.448417,
+ 0.706113,0.104707,-0.700315,80.826583,-73.858706,269.066615,
+ 0.706113,0.104707,-0.700315,82.115801,-66.120152,271.523531,
+ 0.706113,0.104707,-0.700315,83.420558,-75.098116,271.496759,
+ 0.702008,0.082205,-0.707409,80.826583,-73.858706,269.066615,
+ 0.702008,0.082205,-0.707409,83.420558,-75.098116,271.496759,
+ 0.702008,0.082205,-0.707409,79.876053,-85.549134,266.764854,
+ 0.690933,0.090413,-0.717243,83.420558,-75.098116,271.496759,
+ 0.690933,0.090413,-0.717243,82.869243,-87.520508,269.399741,
+ 0.690933,0.090413,-0.717243,79.876053,-85.549134,266.764854,
+ 0.952649,0.009028,-0.303937,82.869243,-87.520508,269.399741,
+ 0.952649,0.009028,-0.303937,83.420558,-75.098116,271.496759,
+ 0.952649,0.009028,-0.303937,84.327694,-88.822892,273.932379,
+ 0.924231,-0.006663,-0.381775,83.420558,-75.098116,271.496759,
+ 0.924231,-0.006663,-0.381775,84.770979,-75.410859,274.77143,
+ 0.924231,-0.006663,-0.381775,84.327694,-88.822892,273.932379,
+ -0.142721,0.408904,-0.901348,75.227067,-51.870285,275.051924,
+ -0.142721,0.408904,-0.901348,77.30258,-63.094641,269.631255,
+ -0.142721,0.408904,-0.901348,70.335292,-55.874485,274.009956,
+ 0.07017,0.4443,-0.893126,75.227067,-51.870285,275.051924,
+ 0.07017,0.4443,-0.893126,80.129356,-59.12999,271.825626,
+ 0.07017,0.4443,-0.893126,77.30258,-63.094641,269.631255,
+ 0.328931,0.560036,-0.760371,75.227067,-51.870285,275.051924,
+ 0.328931,0.560036,-0.760371,81.426197,-55.746711,274.878517,
+ 0.328931,0.560036,-0.760371,80.129356,-59.12999,271.825626,
+ 0.139434,0.265654,-0.953932,79.169732,-46.629108,277.087794,
+ 0.139434,0.265654,-0.953932,81.426197,-55.746711,274.878517,
+ 0.139434,0.265654,-0.953932,75.227067,-51.870285,275.051924,
+ 0.330204,0.115499,-0.936817,73.86399,-42.981459,275.66737,
+ 0.330204,0.115499,-0.936817,79.169732,-46.629108,277.087794,
+ 0.330204,0.115499,-0.936817,75.227067,-51.870285,275.051924,
+ -0.53896,-0.024351,-0.841979,73.86399,-42.981459,275.66737,
+ -0.53896,-0.024351,-0.841979,75.227067,-51.870285,275.051924,
+ -0.53896,-0.024351,-0.841979,70.549222,-48.319683,277.943577,
+ 0.297211,-0.524699,-0.79772,69.03525,-40.322234,272.119202,
+ 0.297211,-0.524699,-0.79772,73.86399,-42.981459,275.66737,
+ 0.297211,-0.524699,-0.79772,70.549222,-48.319683,277.943577,
+ -0.158527,-0.600693,-0.783605,69.03525,-40.322234,272.119202,
+ -0.158527,-0.600693,-0.783605,70.549222,-48.319683,277.943577,
+ -0.158527,-0.600693,-0.783605,66.167601,-44.425003,275.844429,
+ -0.460993,-0.397964,-0.793165,61.128916,-38.717451,275.909229,
+ -0.460993,-0.397964,-0.793165,69.03525,-40.322234,272.119202,
+ -0.460993,-0.397964,-0.793165,66.167601,-44.425003,275.844429,
+ -0.222599,-0.185646,-0.957071,61.128916,-38.717451,275.909229,
+ -0.222599,-0.185646,-0.957071,66.167601,-44.425003,275.844429,
+ -0.222599,-0.185646,-0.957071,62.33045,-42.877718,276.436754,
+ -0.2671,0.450987,-0.851627,70.549222,-48.319683,277.943577,
+ -0.2671,0.450987,-0.851627,70.335292,-55.874485,274.009956,
+ -0.2671,0.450987,-0.851627,67.06056,-53.039419,276.538365,
+ -0.189597,0.457668,-0.868673,70.549222,-48.319683,277.943577,
+ -0.189597,0.457668,-0.868673,75.227067,-51.870285,275.051924,
+ -0.189597,0.457668,-0.868673,70.335292,-55.874485,274.009956,
+ -0.23147,0.299459,-0.925606,61.727113,-49.535667,278.213424,
+ -0.23147,0.299459,-0.925606,70.335292,-55.874485,274.009956,
+ -0.23147,0.299459,-0.925606,63.510993,-56.186315,275.615652,
+ 0.423492,0.82429,-0.375767,70.335292,-55.874485,274.009956,
+ 0.423492,0.82429,-0.375767,61.727113,-49.535667,278.213424,
+ 0.423492,0.82429,-0.375767,67.06056,-53.039419,276.538365,
+ -0.074904,0.335006,-0.939234,70.549222,-48.319683,277.943577,
+ -0.074904,0.335006,-0.939234,67.06056,-53.039419,276.538365,
+ -0.074904,0.335006,-0.939234,61.727113,-49.535667,278.213424,
+ 0.03387,-0.444386,-0.895195,66.167601,-44.425003,275.844429,
+ 0.03387,-0.444386,-0.895195,70.549222,-48.319683,277.943577,
+ 0.03387,-0.444386,-0.895195,61.727113,-49.535667,278.213424,
+ -0.100171,0.129247,-0.98654,62.33045,-42.877718,276.436754,
+ -0.100171,0.129247,-0.98654,66.167601,-44.425003,275.844429,
+ -0.100171,0.129247,-0.98654,56.2522,-48.510431,276.315977,
+ 0.183497,-0.540149,-0.821321,66.167601,-44.425003,275.844429,
+ 0.183497,-0.540149,-0.821321,61.727113,-49.535667,278.213424,
+ 0.183497,-0.540149,-0.821321,56.2522,-48.510431,276.315977,
+ 0.366419,0.42216,-0.829167,56.2522,-48.510431,276.315977,
+ 0.366419,0.42216,-0.829167,61.727113,-49.535667,278.213424,
+ 0.366419,0.42216,-0.829167,63.510993,-56.186315,275.615652,
+ 0.617021,-0.667878,-0.416203,0.824385,-126.569829,268.967438,
+ 0.617021,-0.667878,-0.416203,0.020624,-130.871257,274.678337,
+ 0.617021,-0.667878,-0.416203,0.020624,-127.721318,269.62365,
+ 0.829019,-0.37308,-0.416581,0.890401,-129.105235,274.805807,
+ 0.829019,-0.37308,-0.416581,1.023956,-137.20034,282.321365,
+ 0.829019,-0.37308,-0.416581,0.020624,-139.37311,282.270559,
+ 0.651317,-0.401418,-0.643934,1.023956,-137.20034,282.321365,
+ 0.651317,-0.401418,-0.643934,1.247865,-150.954017,291.121662,
+ 0.651317,-0.401418,-0.643934,0.020624,-152.271309,290.701528,
+ 0.775227,-0.345617,-0.528746,0.020624,-139.37311,282.270559,
+ 0.775227,-0.345617,-0.528746,1.023956,-137.20034,282.321365,
+ 0.775227,-0.345617,-0.528746,0.020624,-152.271309,290.701528,
+ -0.122478,-0.598493,-0.79171,1.97344,-161.884858,299.304992,
+ -0.122478,-0.598493,-0.79171,2.106994,-164.267269,301.085312,
+ -0.122478,-0.598493,-0.79171,0.020624,-165.33175,302.212768,
+ 0.78615,-0.592813,-0.174758,1.97344,-161.884858,299.304992,
+ 0.78615,-0.592813,-0.174758,0.020624,-165.33175,302.212768,
+ 0.78615,-0.592813,-0.174758,0.020624,-164.558229,299.588833,
+ 0.587246,-0.414899,0.694982,0.020624,-163.754043,303.154646,
+ 0.587246,-0.414899,0.694982,0.020624,-165.33175,302.212768,
+ 0.587246,-0.414899,0.694982,2.106994,-164.267269,301.085312,
+ 0.070825,-0.949133,0.306807,4.421837,-163.723103,302.234368,
+ 0.070825,-0.949133,0.306807,0.020624,-163.754043,303.154646,
+ 0.070825,-0.949133,0.306807,2.106994,-164.267269,301.085312,
+ 0.184269,-0.978542,0.092195,7.546829,-163.614313,297.143174,
+ 0.184269,-0.978542,0.092195,4.421837,-163.723103,302.234368,
+ 0.184269,-0.978542,0.092195,2.106994,-164.267269,301.085312,
+ 0.4136,-0.879588,0.235074,9.084075,-162.756096,297.649707,
+ 0.4136,-0.879588,0.235074,4.421837,-163.723103,302.234368,
+ 0.4136,-0.879588,0.235074,7.546829,-163.614313,297.143174,
+ -0.398867,-0.155804,-0.903676,6.729683,-161.232997,297.093281,
+ -0.398867,-0.155804,-0.903676,7.546829,-163.614313,297.143174,
+ -0.398867,-0.155804,-0.903676,1.97344,-161.884858,299.304992,
+ -0.44485,-0.55198,-0.705284,1.97344,-161.884858,299.304992,
+ -0.44485,-0.55198,-0.705284,7.546829,-163.614313,297.143174,
+ -0.44485,-0.55198,-0.705284,2.106994,-164.267269,301.085312,
+ 0.658062,-0.412086,-0.63019,0.020624,-152.271309,290.701528,
+ 0.658062,-0.412086,-0.63019,1.247865,-150.954017,291.121662,
+ 0.658062,-0.412086,-0.63019,1.962792,-156.556004,295.531393,
+ 0.633958,-0.434111,-0.640035,0.020624,-152.271309,290.701528,
+ 0.633958,-0.434111,-0.640035,1.962792,-156.556004,295.531393,
+ 0.633958,-0.434111,-0.640035,0.020624,-157.860518,294.492467,
+ 0.636111,-0.445071,-0.630298,0.020624,-157.860518,294.492467,
+ 0.636111,-0.445071,-0.630298,1.962792,-156.556004,295.531393,
+ 0.636111,-0.445071,-0.630298,1.97344,-161.884858,299.304992,
+ 0.58071,-0.492979,-0.647879,0.020624,-157.860518,294.492467,
+ 0.58071,-0.492979,-0.647879,1.97344,-161.884858,299.304992,
+ 0.58071,-0.492979,-0.647879,0.020624,-164.558229,299.588833,
+ 0.757248,-0.149364,-0.635819,1.247865,-150.954017,291.121662,
+ 0.757248,-0.149364,-0.635819,2.840175,-146.74051,292.02825,
+ 0.757248,-0.149364,-0.635819,4.687121,-154.242074,295.990163,
+ 0.52774,-0.482779,-0.698867,1.247865,-150.954017,291.121662,
+ 0.52774,-0.482779,-0.698867,4.687121,-154.242074,295.990163,
+ 0.52774,-0.482779,-0.698867,1.962792,-156.556004,295.531393,
+ 0.234642,-0.084254,-0.968424,4.687121,-154.242074,295.990163,
+ 0.234642,-0.084254,-0.968424,6.729683,-161.232997,297.093281,
+ 0.234642,-0.084254,-0.968424,1.962792,-156.556004,295.531393,
+ -0.287439,-0.553909,-0.781386,1.962792,-156.556004,295.531393,
+ -0.287439,-0.553909,-0.781386,6.729683,-161.232997,297.093281,
+ -0.287439,-0.553909,-0.781386,1.97344,-161.884858,299.304992,
+ 0.356839,-0.84073,-0.407234,13.10227,-157.489973,289.367504,
+ 0.356839,-0.84073,-0.407234,7.546829,-163.614313,297.143174,
+ 0.356839,-0.84073,-0.407234,12.087682,-157.783853,289.085184,
+ 0.533912,-0.80655,-0.253801,13.10227,-157.489973,289.367504,
+ 0.533912,-0.80655,-0.253801,9.084075,-162.756096,297.649707,
+ 0.533912,-0.80655,-0.253801,7.546829,-163.614313,297.143174,
+ 0.687911,-0.65169,0.319497,13.125391,-158.616515,285.152476,
+ 0.687911,-0.65169,0.319497,14.260148,-156.855057,286.30214,
+ 0.687911,-0.65169,0.319497,12.087682,-157.783853,289.085184,
+ 0.298743,-0.950625,-0.084055,14.260148,-156.855057,286.30214,
+ 0.298743,-0.950625,-0.084055,13.10227,-157.489973,289.367504,
+ 0.298743,-0.950625,-0.084055,12.087682,-157.783853,289.085184,
+ 0.711012,-0.6931,0.118634,16.338304,-156.303802,279.408113,
+ 0.711012,-0.6931,0.118634,17.969859,-154.608056,279.536799,
+ 0.711012,-0.6931,0.118634,13.125391,-158.616515,285.152476,
+ 0.755112,-0.621889,0.207508,17.969859,-154.608056,279.536799,
+ 0.755112,-0.621889,0.207508,14.260148,-156.855057,286.30214,
+ 0.755112,-0.621889,0.207508,13.125391,-158.616515,285.152476,
+ 0.563074,-0.814137,-0.141875,19.031298,-153.713636,275.232634,
+ 0.563074,-0.814137,-0.141875,16.338304,-156.303802,279.408113,
+ 0.563074,-0.814137,-0.141875,17.334639,-154.861475,275.085693,
+ 0.718967,-0.694258,0.033034,19.031298,-153.713636,275.232634,
+ 0.718967,-0.694258,0.033034,17.969859,-154.608056,279.536799,
+ 0.718967,-0.694258,0.033034,16.338304,-156.303802,279.408113,
+ 0.616152,-0.767376,-0.177456,19.940928,-151.052282,267.662924,
+ 0.616152,-0.767376,-0.177456,17.334639,-154.861475,275.085693,
+ 0.616152,-0.767376,-0.177456,18.867016,-151.772381,267.048087,
+ 0.560002,-0.800351,-0.214093,19.940928,-151.052282,267.662924,
+ 0.560002,-0.800351,-0.214093,19.031298,-153.713636,275.232634,
+ 0.560002,-0.800351,-0.214093,17.334639,-154.861475,275.085693,
+ 0.483572,-0.826834,-0.287234,19.901683,-149.308164,261.696477,
+ 0.483572,-0.826834,-0.287234,18.867016,-151.772381,267.048087,
+ 0.483572,-0.826834,-0.287234,18.39121,-150.283507,261.961152,
+ 0.627572,-0.746163,-0.222247,19.940928,-151.052282,267.662924,
+ 0.627572,-0.746163,-0.222247,18.867016,-151.772381,267.048087,
+ 0.627572,-0.746163,-0.222247,19.901683,-149.308164,261.696477,
+ -0.270853,-0.943599,-0.190419,18.39121,-150.283507,261.961152,
+ -0.270853,-0.943599,-0.190419,17.161839,-149.498912,259.821846,
+ -0.270853,-0.943599,-0.190419,17.759336,-149.406124,258.512161,
+ 0.480454,-0.824889,-0.297864,19.901683,-149.308164,261.696477,
+ 0.480454,-0.824889,-0.297864,18.39121,-150.283507,261.961152,
+ 0.480454,-0.824889,-0.297864,17.759336,-149.406124,258.512161,
+ -0.249481,-0.896918,0.3651,17.161839,-149.498912,259.821846,
+ -0.249481,-0.896918,0.3651,13.888081,-150.391507,255.392036,
+ -0.249481,-0.896918,0.3651,14.603008,-151.038287,254.291657,
+ 0.353614,-0.930514,0.095399,17.759336,-149.406124,258.512161,
+ 0.353614,-0.930514,0.095399,17.161839,-149.498912,259.821846,
+ 0.353614,-0.930514,0.095399,14.603008,-151.038287,254.291657,
+ 0.153365,-0.822511,0.547682,13.888081,-150.391507,255.392036,
+ 0.153365,-0.822511,0.547682,7.904597,-152.506474,253.891297,
+ 0.153365,-0.822511,0.547682,8.069487,-153.135306,252.900743,
+ 0.139587,-0.811382,0.567605,14.603008,-151.038287,254.291657,
+ 0.139587,-0.811382,0.567605,13.888081,-150.391507,255.392036,
+ 0.139587,-0.811382,0.567605,8.069487,-153.135306,252.900743,
+ 0.852963,-0.298934,0.427893,2.874552,-158.653631,253.9707,
+ 0.852963,-0.298934,0.427893,2.193394,-157.414829,256.193971,
+ 0.852963,-0.298934,0.427893,1.012091,-159.116356,257.360063,
+ 0.794271,-0.481336,0.37074,2.874552,-158.653631,253.9707,
+ 0.794271,-0.481336,0.37074,1.012091,-159.116356,257.360063,
+ 0.794271,-0.481336,0.37074,0.996575,-161.033882,254.903756,
+ 0.901163,-0.229358,0.367832,3.258483,-157.564508,253.491242,
+ 0.901163,-0.229358,0.367832,3.035183,-156.07898,254.964601,
+ 0.901163,-0.229358,0.367832,2.193394,-157.414829,256.193971,
+ 0.915328,-0.159972,0.369571,3.258483,-157.564508,253.491242,
+ 0.915328,-0.159972,0.369571,2.193394,-157.414829,256.193971,
+ 0.915328,-0.159972,0.369571,2.874552,-158.653631,253.9707,
+ 0.621947,-0.61012,0.490852,8.069487,-153.135306,252.900743,
+ 0.621947,-0.61012,0.490852,7.904597,-152.506474,253.891297,
+ 0.621947,-0.61012,0.490852,3.258483,-157.564508,253.491242,
+ 0.542808,-0.54888,0.635681,7.904597,-152.506474,253.891297,
+ 0.542808,-0.54888,0.635681,3.035183,-156.07898,254.964601,
+ 0.542808,-0.54888,0.635681,3.258483,-157.564508,253.491242,
+ 0.707168,-0.128047,0.695354,1.012091,-159.116356,257.360063,
+ 0.707168,-0.128047,0.695354,1.254862,-151.999941,258.423631,
+ 0.707168,-0.128047,0.695354,0.020624,-160.233772,258.162607,
+ 0.612217,-0.116563,0.78205,1.254862,-151.999941,258.423631,
+ 0.612217,-0.116563,0.78205,0.020624,-152.665279,259.290671,
+ 0.612217,-0.116563,0.78205,0.020624,-160.233772,258.162607,
+ 0.802258,0.456304,-0.384926,30.887832,-59.492017,272.189174,
+ 0.802258,0.456304,-0.384926,30.046348,-55.479298,275.192172,
+ 0.802258,0.456304,-0.384926,32.05362,-60.92035,272.925701,
+ 0.330776,0.464269,-0.821609,33.307937,-54.108159,277.280063,
+ 0.330776,0.464269,-0.821609,32.05362,-60.92035,272.925701,
+ 0.330776,0.464269,-0.821609,30.046348,-55.479298,275.192172,
+ 0.948325,0.043916,-0.314248,30.33171,-68.076923,266.72926,
+ 0.948325,0.043916,-0.314248,30.216409,-63.560409,267.012492,
+ 0.948325,0.043916,-0.314248,32.05362,-60.92035,272.925701,
+ 0.794187,0.423474,-0.435818,30.216409,-63.560409,267.012492,
+ 0.794187,0.423474,-0.435818,30.887832,-59.492017,272.189174,
+ 0.794187,0.423474,-0.435818,32.05362,-60.92035,272.925701,
+ 0.695693,0.518191,-0.497482,30.216409,-63.560409,267.012492,
+ 0.695693,0.518191,-0.497482,30.046348,-55.479298,275.192172,
+ 0.695693,0.518191,-0.497482,30.887832,-59.492017,272.189174,
+ -0.002438,0.711353,-0.702831,30.216409,-63.560409,267.012492,
+ -0.002438,0.711353,-0.702831,28.165024,-57.196949,273.460223,
+ -0.002438,0.711353,-0.702831,30.046348,-55.479298,275.192172,
+ -0.609943,0.309517,-0.729499,15.021621,-61.682128,277.356424,
+ -0.609943,0.309517,-0.729499,27.566007,-63.57562,266.06453,
+ -0.609943,0.309517,-0.729499,16.681165,-67.138695,273.653709,
+ -0.377794,0.74836,-0.545188,27.566007,-63.57562,266.06453,
+ -0.377794,0.74836,-0.545188,15.021621,-61.682128,277.356424,
+ -0.377794,0.74836,-0.545188,26.07257,-58.398939,274.205268,
+ -0.595902,0.542101,-0.592476,26.696838,-68.714273,262.138515,
+ -0.595902,0.542101,-0.592476,17.870378,-70.482729,269.397915,
+ -0.595902,0.542101,-0.592476,16.681165,-67.138695,273.653709,
+ -0.591201,0.550403,-0.589523,26.696838,-68.714273,262.138515,
+ -0.591201,0.550403,-0.589523,16.681165,-67.138695,273.653709,
+ -0.591201,0.550403,-0.589523,27.566007,-63.57562,266.06453,
+ -0.468743,0.648489,-0.599785,27.799651,-75.086556,256.660347,
+ -0.468743,0.648489,-0.599785,17.386661,-78.004371,261.643542,
+ -0.468743,0.648489,-0.599785,17.870378,-70.482729,269.397915,
+ -0.619928,0.447072,-0.644838,26.696838,-68.714273,262.138515,
+ -0.619928,0.447072,-0.644838,27.799651,-75.086556,256.660347,
+ -0.619928,0.447072,-0.644838,17.870378,-70.482729,269.397915,
+ -0.419155,0.63306,-0.650803,17.386661,-78.004371,261.643542,
+ -0.419155,0.63306,-0.650803,27.950242,-80.566548,252.347663,
+ -0.419155,0.63306,-0.650803,17.010944,-82.016786,257.982506,
+ -0.482066,0.533618,-0.694885,27.799651,-75.086556,256.660347,
+ -0.482066,0.533618,-0.694885,27.950242,-80.566548,252.347663,
+ -0.482066,0.533618,-0.694885,17.386661,-78.004371,261.643542,
+ -0.983076,0.074497,-0.167366,17.010944,-82.016786,257.982506,
+ -0.983076,0.074497,-0.167366,16.006091,-83.423519,263.258669,
+ -0.983076,0.074497,-0.167366,15.540323,-79.63623,267.680265,
+ -0.936577,0.280004,-0.210762,17.010944,-82.016786,257.982506,
+ -0.936577,0.280004,-0.210762,15.540323,-79.63623,267.680265,
+ -0.936577,0.280004,-0.210762,17.386661,-78.004371,261.643542,
+ -0.958363,0.036774,-0.283175,17.386661,-78.004371,261.643542,
+ -0.958363,0.036774,-0.283175,15.540323,-79.63623,267.680265,
+ -0.958363,0.036774,-0.283175,14.092216,-73.441006,273.385688,
+ -0.788623,0.465214,-0.402057,17.386661,-78.004371,261.643542,
+ -0.788623,0.465214,-0.402057,14.092216,-73.441006,273.385688,
+ -0.788623,0.465214,-0.402057,17.870378,-70.482729,269.397915,
+ -0.708956,-0.043437,-0.703914,17.870378,-70.482729,269.397915,
+ -0.708956,-0.043437,-0.703914,14.092216,-73.441006,273.385688,
+ -0.708956,-0.043437,-0.703914,12.199332,-68.547558,274.990167,
+ -0.397569,0.66424,-0.633028,17.870378,-70.482729,269.397915,
+ -0.397569,0.66424,-0.633028,12.199332,-68.547558,274.990167,
+ -0.397569,0.66424,-0.633028,16.681165,-67.138695,273.653709,
+ -0.209072,-0.235296,-0.949171,7.636576,-63.208421,274.671644,
+ -0.209072,-0.235296,-0.949171,16.681165,-67.138695,273.653709,
+ -0.209072,-0.235296,-0.949171,12.199332,-68.547558,274.990167,
+ 0.166331,0.587823,-0.791706,15.021621,-61.682128,277.356424,
+ 0.166331,0.587823,-0.791706,16.681165,-67.138695,273.653709,
+ 0.166331,0.587823,-0.791706,7.636576,-63.208421,274.671644,
+ -0.348874,0.02886,-0.936725,20.327597,-85.392763,248.612701,
+ -0.348874,0.02886,-0.936725,14.105602,-92.64182,250.706677,
+ -0.348874,0.02886,-0.936725,14.293004,-85.696075,250.85088,
+ -0.40263,0.08224,-0.911661,20.327597,-85.392763,248.612701,
+ -0.40263,0.08224,-0.911661,21.008451,-90.662537,247.836625,
+ -0.40263,0.08224,-0.911661,14.105602,-92.64182,250.706677,
+ 0.151249,-0.019445,-0.988304,0.020624,-85.926677,246.731682,
+ 0.151249,-0.019445,-0.988304,6.178428,-89.47302,247.743837,
+ 0.151249,-0.019445,-0.988304,0.020624,-93.580656,246.882273,
+ 0.039501,0.148054,-0.98819,6.178428,-89.47302,247.743837,
+ 0.039501,0.148054,-0.98819,6.554145,-93.138923,247.209619,
+ 0.039501,0.148054,-0.98819,0.020624,-93.580656,246.882273,
+ 0.283953,0.166702,-0.944236,14.293004,-85.696075,250.85088,
+ 0.283953,0.166702,-0.944236,6.554145,-93.138923,247.209619,
+ 0.283953,0.166702,-0.944236,6.178428,-89.47302,247.743837,
+ 0.419805,0.007516,-0.907583,14.293004,-85.696075,250.85088,
+ 0.419805,0.007516,-0.907583,14.105602,-92.64182,250.706677,
+ 0.419805,0.007516,-0.907583,6.554145,-93.138923,247.209619,
+ -0.05679,0.138277,-0.988764,29.572366,-81.554669,248.618481,
+ -0.05679,0.138277,-0.988764,21.008451,-90.662537,247.836625,
+ -0.05679,0.138277,-0.988764,20.327597,-85.392763,248.612701,
+ -0.012101,0.096813,-0.995229,29.572366,-81.554669,248.618481,
+ -0.012101,0.096813,-0.995229,26.883327,-89.412175,247.886822,
+ -0.012101,0.096813,-0.995229,21.008451,-90.662537,247.836625,
+ -0.115843,0.280466,-0.952848,29.572366,-81.554669,248.618481,
+ -0.115843,0.280466,-0.952848,20.327597,-85.392763,248.612701,
+ -0.115843,0.280466,-0.952848,20.503439,-82.663871,249.394558,
+ -0.141543,0.939935,-0.310623,29.572366,-81.554669,248.618481,
+ -0.141543,0.939935,-0.310623,20.503439,-82.663871,249.394558,
+ -0.141543,0.939935,-0.310623,27.950242,-80.566548,252.347663,
+ -0.268482,0.963259,-0.007087,27.950242,-80.566548,252.347663,
+ -0.268482,0.963259,-0.007087,20.503439,-82.663871,249.394558,
+ -0.268482,0.963259,-0.007087,16.160333,-83.837873,254.358586,
+ -0.306409,0.877461,-0.36902,27.950242,-80.566548,252.347663,
+ -0.306409,0.877461,-0.36902,16.160333,-83.837873,254.358586,
+ -0.306409,0.877461,-0.36902,17.010944,-82.016786,257.982506,
+ -0.956412,0.279697,0.083937,16.160333,-83.837873,254.358586,
+ -0.956412,0.279697,0.083937,15.320065,-87.584395,257.268492,
+ -0.956412,0.279697,0.083937,17.010944,-82.016786,257.982506,
+ -0.94836,0.300891,-0.100393,15.320065,-87.584395,257.268492,
+ -0.94836,0.300891,-0.100393,16.006091,-83.423519,263.258669,
+ -0.94836,0.300891,-0.100393,17.010944,-82.016786,257.982506,
+ -0.186639,0.905764,-0.38047,20.327597,-85.392763,248.612701,
+ -0.186639,0.905764,-0.38047,14.293004,-85.696075,250.85088,
+ -0.186639,0.905764,-0.38047,16.160333,-83.837873,254.358586,
+ -0.759121,0.224026,-0.611185,20.327597,-85.392763,248.612701,
+ -0.759121,0.224026,-0.611185,16.160333,-83.837873,254.358586,
+ -0.759121,0.224026,-0.611185,20.503439,-82.663871,249.394558,
+ 0.811124,-0.463503,0.356712,0.996575,-161.033882,254.903756,
+ 0.811124,-0.463503,0.356712,1.012091,-159.116356,257.360063,
+ 0.811124,-0.463503,0.356712,0.020624,-160.233772,258.162607,
+ 0.531428,-0.772008,0.348693,0.996575,-161.033882,254.903756,
+ 0.531428,-0.772008,0.348693,0.020624,-160.233772,258.162607,
+ 0.531428,-0.772008,0.348693,0.020624,-161.640292,255.048567,
+ 0.749766,-0.121435,0.650465,0.887359,-147.460609,259.065241,
+ 0.749766,-0.121435,0.650465,0.596521,-137.446762,261.269954,
+ 0.749766,-0.121435,0.650465,0.020624,-138.576042,261.722944,
+ 0.73636,-0.126962,0.664571,0.887359,-147.460609,259.065241,
+ 0.73636,-0.126962,0.664571,0.020624,-138.576042,261.722944,
+ 0.73636,-0.126962,0.664571,0.020624,-147.740496,259.972133,
+ 0.735298,-0.276883,0.618605,0.596521,-137.446762,261.269954,
+ 0.735298,-0.276883,0.618605,0.692047,-129.916297,264.52698,
+ 0.735298,-0.276883,0.618605,0.020624,-130.108871,265.238865,
+ 0.828315,-0.214857,0.517427,0.596521,-137.446762,261.269954,
+ 0.828315,-0.214857,0.517427,0.020624,-130.108871,265.238865,
+ 0.828315,-0.214857,0.517427,0.020624,-138.576042,261.722944,
+ 0.85414,-0.427227,0.296516,0.692047,-129.916297,264.52698,
+ 0.85414,-0.427227,0.296516,0.824385,-126.569829,268.967438,
+ 0.85414,-0.427227,0.296516,0.020624,-127.721318,269.62365,
+ 0.60454,-0.699588,0.380931,0.692047,-129.916297,264.52698,
+ 0.60454,-0.699588,0.380931,0.020624,-127.721318,269.62365,
+ 0.60454,-0.699588,0.380931,0.020624,-130.108871,265.238865,
+ 0.76319,-0.55275,-0.334676,43.767169,-124.782511,245.082482,
+ 0.76319,-0.55275,-0.334676,42.333664,-131.071132,252.19981,
+ 0.76319,-0.55275,-0.334676,40.66621,-130.39545,247.281416,
+ 0.434667,-0.716538,-0.545562,45.58643,-126.940983,249.366873,
+ 0.434667,-0.716538,-0.545562,42.333664,-131.071132,252.19981,
+ 0.434667,-0.716538,-0.545562,43.767169,-124.782511,245.082482,
+ 0.812361,-0.448308,-0.372947,41.466016,-123.431451,240.652368,
+ 0.812361,-0.448308,-0.372947,40.66621,-130.39545,247.281416,
+ 0.812361,-0.448308,-0.372947,38.863073,-129.238181,241.962662,
+ 0.652682,-0.56035,-0.509916,41.466016,-123.431451,240.652368,
+ 0.652682,-0.56035,-0.509916,43.767169,-124.782511,245.082482,
+ 0.652682,-0.56035,-0.509916,40.66621,-130.39545,247.281416,
+ 0.852686,0.34666,-0.390837,40.016083,-114.803649,242.674242,
+ 0.852686,0.34666,-0.390837,38.004856,-106.557345,245.600576,
+ 0.852686,0.34666,-0.390837,43.396015,-117.243224,247.884388,
+ 0.896564,0.427852,-0.114519,38.004856,-106.557345,245.600576,
+ 0.896564,0.427852,-0.114519,41.002074,-111.234185,251.592578,
+ 0.896564,0.427852,-0.114519,43.396015,-117.243224,247.884388,
+ 0.839854,0.372349,-0.394971,40.847832,-119.485966,240.028708,
+ 0.839854,0.372349,-0.394971,40.016083,-114.803649,242.674242,
+ 0.839854,0.372349,-0.394971,43.302314,-120.046043,244.719847,
+ 0.845764,0.386742,-0.367579,40.016083,-114.803649,242.674242,
+ 0.845764,0.386742,-0.367579,43.396015,-117.243224,247.884388,
+ 0.845764,0.386742,-0.367579,43.302314,-120.046043,244.719847,
+ 0.89382,0.070032,-0.442923,40.847832,-119.485966,240.028708,
+ 0.89382,0.070032,-0.442923,43.767169,-124.782511,245.082482,
+ 0.89382,0.070032,-0.442923,41.466016,-123.431451,240.652368,
+ 0.887385,0.052019,-0.458084,40.847832,-119.485966,240.028708,
+ 0.887385,0.052019,-0.458084,43.302314,-120.046043,244.719847,
+ 0.887385,0.052019,-0.458084,43.767169,-124.782511,245.082482,
+ 0.938754,0.084963,-0.333948,39.936376,-122.478316,236.594928,
+ 0.938754,0.084963,-0.333948,39.883137,-118.869608,237.363398,
+ 0.938754,0.084963,-0.333948,41.466016,-123.431451,240.652368,
+ 0.94283,0.09734,-0.318742,39.883137,-118.869608,237.363398,
+ 0.94283,0.09734,-0.318742,40.847832,-119.485966,240.028708,
+ 0.94283,0.09734,-0.318742,41.466016,-123.431451,240.652368,
+ 0.942041,0.120571,-0.313085,39.883137,-118.869608,237.363398,
+ 0.942041,0.120571,-0.313085,39.407634,-112.760783,238.285198,
+ 0.942041,0.120571,-0.313085,40.847832,-119.485966,240.028708,
+ 0.979153,0.19844,-0.043375,39.407634,-112.760783,238.285198,
+ 0.979153,0.19844,-0.043375,40.016083,-114.803649,242.674242,
+ 0.979153,0.19844,-0.043375,40.847832,-119.485966,240.028708,
+ 0.970982,0.23796,-0.023848,39.407634,-112.760783,238.285198,
+ 0.970982,0.23796,-0.023848,37.626705,-105.338622,239.8337,
+ 0.970982,0.23796,-0.023848,40.016083,-114.803649,242.674242,
+ 0.9704,0.24117,-0.012665,37.626705,-105.338622,239.8337,
+ 0.9704,0.24117,-0.012665,38.004856,-106.557345,245.600576,
+ 0.9704,0.24117,-0.012665,40.016083,-114.803649,242.674242,
+ 0.938271,-0.293862,-0.182464,39.936376,-122.478316,236.594928,
+ 0.938271,-0.293862,-0.182464,38.863073,-129.238181,241.962662,
+ 0.938271,-0.293862,-0.182464,37.755088,-129.700602,237.00989,
+ 0.796425,-0.448535,-0.405615,39.936376,-122.478316,236.594928,
+ 0.796425,-0.448535,-0.405615,41.466016,-123.431451,240.652368,
+ 0.796425,-0.448535,-0.405615,38.863073,-129.238181,241.962662,
+ 0.981381,-0.146579,0.124121,38.964075,-128.558848,228.79918,
+ 0.981381,-0.146579,0.124121,39.761447,-122.342328,229.835976,
+ 0.981381,-0.146579,0.124121,37.755088,-129.700602,237.00989,
+ 0.956356,-0.290598,-0.030598,39.761447,-122.342328,229.835976,
+ 0.956356,-0.290598,-0.030598,39.936376,-122.478316,236.594928,
+ 0.956356,-0.290598,-0.030598,37.755088,-129.700602,237.00989,
+ 0.950247,0.270178,0.155028,39.820467,-110.835652,232.399674,
+ 0.950247,0.270178,0.155028,37.306965,-103.823585,235.585816,
+ 0.950247,0.270178,0.155028,39.407634,-112.760783,238.285198,
+ 0.972797,0.231473,0.009334,37.306965,-103.823585,235.585816,
+ 0.972797,0.231473,0.009334,37.626705,-105.338622,239.8337,
+ 0.972797,0.231473,0.009334,39.407634,-112.760783,238.285198,
+ 0.996501,0.049422,0.06741,40.230865,-117.440362,231.175171,
+ 0.996501,0.049422,0.06741,39.820467,-110.835652,232.399674,
+ 0.996501,0.049422,0.06741,39.883137,-118.869608,237.363398,
+ 0.993853,0.063697,0.090548,39.820467,-110.835652,232.399674,
+ 0.993853,0.063697,0.090548,39.407634,-112.760783,238.285198,
+ 0.993853,0.063697,0.090548,39.883137,-118.869608,237.363398,
+ 0.995755,-0.087831,-0.027538,39.761447,-122.342328,229.835976,
+ 0.995755,-0.087831,-0.027538,40.230865,-117.440362,231.175171,
+ 0.995755,-0.087831,-0.027538,39.936376,-122.478316,236.594928,
+ 0.998387,0.002652,0.056714,40.230865,-117.440362,231.175171,
+ 0.998387,0.002652,0.056714,39.883137,-118.869608,237.363398,
+ 0.998387,0.002652,0.056714,39.936376,-122.478316,236.594928,
+ 0.735435,0.641406,-0.21848,37.306965,-103.823585,235.585816,
+ 0.735435,0.641406,-0.21848,31.987907,-94.207359,245.912102,
+ 0.735435,0.641406,-0.21848,34.578986,-96.303464,248.480364,
+ 0.955958,0.291744,0.032097,37.306965,-103.823585,235.585816,
+ 0.955958,0.291744,0.032097,34.578986,-96.303464,248.480364,
+ 0.955958,0.291744,0.032097,37.626705,-105.338622,239.8337,
+ 0.931789,0.359866,-0.047604,37.626705,-105.338622,239.8337,
+ 0.931789,0.359866,-0.047604,34.578986,-96.303464,248.480364,
+ 0.931789,0.359866,-0.047604,36.21267,-99.885706,253.377463,
+ 0.963723,0.266817,-0.006807,37.626705,-105.338622,239.8337,
+ 0.963723,0.266817,-0.006807,36.21267,-99.885706,253.377463,
+ 0.963723,0.266817,-0.006807,38.004856,-106.557345,245.600576,
+ 0.925701,0.36488,-0.099696,38.004856,-106.557345,245.600576,
+ 0.925701,0.36488,-0.099696,36.21267,-99.885706,253.377463,
+ 0.925701,0.36488,-0.099696,38.394263,-103.927934,258.83981,
+ 0.895575,0.430618,-0.111866,38.004856,-106.557345,245.600576,
+ 0.895575,0.430618,-0.111866,38.394263,-103.927934,258.83981,
+ 0.895575,0.430618,-0.111866,41.002074,-111.234185,251.592578,
+ 0.829702,0.513429,-0.219054,41.002074,-111.234185,251.592578,
+ 0.829702,0.513429,-0.219054,38.394263,-103.927934,258.83981,
+ 0.829702,0.513429,-0.219054,41.458715,-106.948577,263.366972,
+ 0.832689,0.509184,-0.217625,41.002074,-111.234185,251.592578,
+ 0.832689,0.509184,-0.217625,41.458715,-106.948577,263.366972,
+ 0.832689,0.509184,-0.217625,44.635729,-115.060415,256.543525,
+ 0.827737,0.51383,-0.225454,44.635729,-115.060415,256.543525,
+ 0.827737,0.51383,-0.225454,41.458715,-106.948577,263.366972,
+ 0.827737,0.51383,-0.225454,44.775672,-110.862423,266.624911,
+ 0.481641,0.806636,-0.342577,50.763263,-117.57635,259.234389,
+ 0.481641,0.806636,-0.342577,44.635729,-115.060415,256.543525,
+ 0.481641,0.806636,-0.342577,44.775672,-110.862423,266.624911,
+ 0.742682,0.666048,0.069311,33.686087,-97.684338,274.957615,
+ 0.742682,0.666048,0.069311,30.756711,-95.433078,284.712872,
+ 0.742682,0.666048,0.069311,35.324335,-100.267811,282.229489,
+ 0.612691,0.790321,0.001597,33.686087,-97.684338,274.957615,
+ 0.612691,0.790321,0.001597,26.585188,-92.192481,281.421773,
+ 0.612691,0.790321,0.001597,30.756711,-95.433078,284.712872,
+ 0.607592,0.792634,-0.050618,40.806458,-105.058432,273.016968,
+ 0.607592,0.792634,-0.050618,35.324335,-100.267811,282.229489,
+ 0.607592,0.792634,-0.050618,40.286234,-104.226378,279.801779,
+ 0.727386,0.681743,0.078333,40.806458,-105.058432,273.016968,
+ 0.727386,0.681743,0.078333,33.686087,-97.684338,274.957615,
+ 0.727386,0.681743,0.078333,35.324335,-100.267811,282.229489,
+ 0.55308,0.693395,-0.46185,48.160046,-114.657622,273.570048,
+ 0.55308,0.693395,-0.46185,40.286234,-104.226378,279.801779,
+ 0.55308,0.693395,-0.46185,48.154875,-111.181555,278.782627,
+ 0.794143,0.607579,-0.01362,40.806458,-105.058432,273.016968,
+ 0.794143,0.607579,-0.01362,40.286234,-104.226378,279.801779,
+ 0.794143,0.607579,-0.01362,48.160046,-114.657622,273.570048,
+ 0.555217,0.729678,-0.399129,56.015909,-118.299491,277.84014,
+ 0.555217,0.729678,-0.399129,48.160046,-114.657622,273.570048,
+ 0.555217,0.729678,-0.399129,51.112909,-113.604093,279.603729,
+ 0.641175,0.638747,-0.425319,48.160046,-114.657622,273.570048,
+ 0.641175,0.638747,-0.425319,48.154875,-111.181555,278.782627,
+ 0.641175,0.638747,-0.425319,51.112909,-113.604093,279.603729,
+ 0.451754,0.879771,-0.148056,62.580401,-122.475274,273.056821,
+ 0.451754,0.879771,-0.148056,53.72367,-118.594589,269.092474,
+ 0.451754,0.879771,-0.148056,56.015909,-118.299491,277.84014,
+ 0.48392,0.861121,-0.155856,56.015909,-118.299491,277.84014,
+ 0.48392,0.861121,-0.155856,53.72367,-118.594589,269.092474,
+ 0.48392,0.861121,-0.155856,48.160046,-114.657622,273.570048,
+ 0.508398,-0.802255,-0.312919,66.47143,-129.334924,263.696143,
+ 0.508398,-0.802255,-0.312919,61.25523,-135.547489,271.149031,
+ 0.508398,-0.802255,-0.312919,59.38419,-134.000508,264.143049,
+ 0.626548,-0.755543,-0.19129,67.16926,-130.709106,271.409447,
+ 0.626548,-0.755543,-0.19129,61.25523,-135.547489,271.149031,
+ 0.626548,-0.755543,-0.19129,66.47143,-129.334924,263.696143,
+ 0.308034,-0.815975,-0.489184,64.061426,-127.834794,256.803637,
+ 0.308034,-0.815975,-0.489184,59.38419,-134.000508,264.143049,
+ 0.308034,-0.815975,-0.489184,56.361052,-130.812846,256.922284,
+ 0.5002,-0.793115,-0.347517,66.47143,-129.334924,263.696143,
+ 0.5002,-0.793115,-0.347517,59.38419,-134.000508,264.143049,
+ 0.5002,-0.793115,-0.347517,64.061426,-127.834794,256.803637,
+ 0.795875,-0.470764,-0.380742,64.061426,-127.834794,256.803637,
+ 0.795875,-0.470764,-0.380742,68.252177,-120.956586,257.059185,
+ 0.795875,-0.470764,-0.380742,66.47143,-129.334924,263.696143,
+ 0.711402,-0.523041,-0.469399,68.252177,-120.956586,257.059185,
+ 0.711402,-0.523041,-0.469399,69.933047,-124.016475,263.016202,
+ 0.711402,-0.523041,-0.469399,66.47143,-129.334924,263.696143,
+ 0.136226,-0.918763,-0.370562,56.361052,-130.812846,256.922284,
+ 0.136226,-0.918763,-0.370562,48.720275,-134.574276,263.439378,
+ 0.136226,-0.918763,-0.370562,45.482386,-132.52928,257.178745,
+ 0.07675,-0.899856,-0.429381,59.38419,-134.000508,264.143049,
+ 0.07675,-0.899856,-0.429381,48.720275,-134.574276,263.439378,
+ 0.07675,-0.899856,-0.429381,56.361052,-130.812846,256.922284,
+ 0.596499,-0.355098,-0.719788,67.452584,-118.935928,255.2238,
+ 0.596499,-0.355098,-0.719788,64.061426,-127.834794,256.803637,
+ 0.596499,-0.355098,-0.719788,62.235897,-124.077928,253.437395,
+ 0.638286,-0.363687,-0.678471,67.452584,-118.935928,255.2238,
+ 0.638286,-0.363687,-0.678471,68.252177,-120.956586,257.059185,
+ 0.638286,-0.363687,-0.678471,64.061426,-127.834794,256.803637,
+ 0.241302,-0.830378,-0.502241,55.796868,-127.672034,254.103646,
+ 0.241302,-0.830378,-0.502241,45.482386,-132.52928,257.178745,
+ 0.241302,-0.830378,-0.502241,47.473534,-130.105829,254.128592,
+ 0.085975,-0.656833,-0.749119,55.796868,-127.672034,254.103646,
+ 0.085975,-0.656833,-0.749119,56.361052,-130.812846,256.922284,
+ 0.085975,-0.656833,-0.749119,45.482386,-132.52928,257.178745,
+ 0.267497,-0.616507,-0.740517,62.235897,-124.077928,253.437395,
+ 0.267497,-0.616507,-0.740517,56.361052,-130.812846,256.922284,
+ 0.267497,-0.616507,-0.740517,55.796868,-127.672034,254.103646,
+ 0.216593,-0.591005,-0.777046,62.235897,-124.077928,253.437395,
+ 0.216593,-0.591005,-0.777046,64.061426,-127.834794,256.803637,
+ 0.216593,-0.591005,-0.777046,56.361052,-130.812846,256.922284,
+ 0.36159,-0.704027,-0.611227,47.473534,-130.105829,254.128592,
+ 0.36159,-0.704027,-0.611227,42.333664,-131.071132,252.19981,
+ 0.36159,-0.704027,-0.611227,45.58643,-126.940983,249.366873,
+ 0.324871,-0.832276,-0.449195,47.473534,-130.105829,254.128592,
+ 0.324871,-0.832276,-0.449195,45.482386,-132.52928,257.178745,
+ 0.324871,-0.832276,-0.449195,42.333664,-131.071132,252.19981,
+ 0.078609,-0.360199,-0.929557,60.809329,-122.79471,252.637589,
+ 0.078609,-0.360199,-0.929557,55.796868,-127.672034,254.103646,
+ 0.078609,-0.360199,-0.929557,54.344896,-124.518749,252.758975,
+ 0.135984,-0.410746,-0.901552,60.809329,-122.79471,252.637589,
+ 0.135984,-0.410746,-0.901552,62.235897,-124.077928,253.437395,
+ 0.135984,-0.410746,-0.901552,55.796868,-127.672034,254.103646,
+ 0.417749,-0.098534,-0.903204,66.880916,-117.784135,254.899193,
+ 0.417749,-0.098534,-0.903204,62.235897,-124.077928,253.437395,
+ 0.417749,-0.098534,-0.903204,60.809329,-122.79471,252.637589,
+ 0.383549,-0.069176,-0.920926,66.880916,-117.784135,254.899193,
+ 0.383549,-0.069176,-0.920926,67.452584,-118.935928,255.2238,
+ 0.383549,-0.069176,-0.920926,62.235897,-124.077928,253.437395,
+ 0.421988,-0.668983,-0.611872,54.344896,-124.518749,252.758975,
+ 0.421988,-0.668983,-0.611872,47.473534,-130.105829,254.128592,
+ 0.421988,-0.668983,-0.611872,45.58643,-126.940983,249.366873,
+ 0.099856,-0.35104,-0.931021,54.344896,-124.518749,252.758975,
+ 0.099856,-0.35104,-0.931021,55.796868,-127.672034,254.103646,
+ 0.099856,-0.35104,-0.931021,47.473534,-130.105829,254.128592,
+ 0.514673,-0.310503,-0.799187,45.400245,-121.232822,247.029214,
+ 0.514673,-0.310503,-0.799187,53.428968,-122.60031,252.730986,
+ 0.514673,-0.310503,-0.799187,45.58643,-126.940983,249.366873,
+ 0.323461,0.14078,-0.93571,53.428968,-122.60031,252.730986,
+ 0.323461,0.14078,-0.93571,54.344896,-124.518749,252.758975,
+ 0.323461,0.14078,-0.93571,45.58643,-126.940983,249.366873,
+ 0.29895,0.128934,-0.945518,53.428968,-122.60031,252.730986,
+ 0.29895,0.128934,-0.945518,60.087222,-123.023791,254.778416,
+ 0.29895,0.128934,-0.945518,54.344896,-124.518749,252.758975,
+ -0.257363,0.966173,0.016577,60.809329,-122.79471,252.637589,
+ -0.257363,0.966173,0.016577,54.344896,-124.518749,252.758975,
+ -0.257363,0.966173,0.016577,60.087222,-123.023791,254.778416,
+ -0.668437,0.710056,0.221387,67.098984,-118.006827,256.271853,
+ -0.668437,0.710056,0.221387,66.880916,-117.784135,254.899193,
+ -0.668437,0.710056,0.221387,60.809329,-122.79471,252.637589,
+ -0.564265,0.819185,-0.10267,67.098984,-118.006827,256.271853,
+ -0.564265,0.819185,-0.10267,60.809329,-122.79471,252.637589,
+ -0.564265,0.819185,-0.10267,60.087222,-123.023791,254.778416,
+ -0.415771,0.895216,-0.160385,67.502051,-120.112364,260.860164,
+ -0.415771,0.895216,-0.160385,59.833195,-123.989094,259.101747,
+ -0.415771,0.895216,-0.160385,57.547223,-124.1047,264.382473,
+ -0.316002,0.93417,0.165737,67.502051,-120.112364,260.860164,
+ -0.316002,0.93417,0.165737,57.547223,-124.1047,264.382473,
+ -0.316002,0.93417,0.165737,65.656231,-121.81602,266.943434,
+ -0.590532,0.712556,0.378862,67.502051,-120.112364,260.860164,
+ -0.590532,0.712556,0.378862,67.098984,-118.006827,256.271853,
+ -0.590532,0.712556,0.378862,60.087222,-123.023791,254.778416,
+ -0.474848,0.864441,0.16511,67.502051,-120.112364,260.860164,
+ -0.474848,0.864441,0.16511,60.087222,-123.023791,254.778416,
+ -0.474848,0.864441,0.16511,59.833195,-123.989094,259.101747,
+ 0.576883,0.695538,-0.428291,59.833195,-123.989094,259.101747,
+ 0.576883,0.695538,-0.428291,53.428968,-122.60031,252.730986,
+ 0.576883,0.695538,-0.428291,53.029552,-120.659663,255.344577,
+ -0.004847,0.976017,0.217638,60.087222,-123.023791,254.778416,
+ -0.004847,0.976017,0.217638,53.428968,-122.60031,252.730986,
+ -0.004847,0.976017,0.217638,59.833195,-123.989094,259.101747,
+ 0.730803,0.673924,-0.108414,53.029552,-120.659663,255.344577,
+ 0.730803,0.673924,-0.108414,50.763263,-117.57635,259.234389,
+ 0.730803,0.673924,-0.108414,57.547223,-124.1047,264.382473,
+ 0.354003,0.919036,0.173364,59.833195,-123.989094,259.101747,
+ 0.354003,0.919036,0.173364,53.029552,-120.659663,255.344577,
+ 0.354003,0.919036,0.173364,57.547223,-124.1047,264.382473,
+ 0.467493,0.787017,-0.40256,53.029552,-120.659663,255.344577,
+ 0.467493,0.787017,-0.40256,45.505507,-118.712628,250.413405,
+ 0.467493,0.787017,-0.40256,44.635729,-115.060415,256.543525,
+ 0.483813,0.800854,-0.352928,53.029552,-120.659663,255.344577,
+ 0.483813,0.800854,-0.352928,44.635729,-115.060415,256.543525,
+ 0.483813,0.800854,-0.352928,50.763263,-117.57635,259.234389,
+ 0.493455,0.690167,-0.529313,53.428968,-122.60031,252.730986,
+ 0.493455,0.690167,-0.529313,45.400245,-121.232822,247.029214,
+ 0.493455,0.690167,-0.529313,45.505507,-118.712628,250.413405,
+ 0.495825,0.731788,-0.467595,53.428968,-122.60031,252.730986,
+ 0.495825,0.731788,-0.467595,45.505507,-118.712628,250.413405,
+ 0.495825,0.731788,-0.467595,53.029552,-120.659663,255.344577,
+ 0.929703,0.063468,-0.362801,43.302314,-120.046043,244.719847,
+ 0.929703,0.063468,-0.362801,45.58643,-126.940983,249.366873,
+ 0.929703,0.063468,-0.362801,43.767169,-124.782511,245.082482,
+ 0.637542,-0.274073,-0.720017,43.302314,-120.046043,244.719847,
+ 0.637542,-0.274073,-0.720017,45.400245,-121.232822,247.029214,
+ 0.637542,-0.274073,-0.720017,45.58643,-126.940983,249.366873,
+ 0.758666,0.476383,-0.444394,43.302314,-120.046043,244.719847,
+ 0.758666,0.476383,-0.444394,43.396015,-117.243224,247.884388,
+ 0.758666,0.476383,-0.444394,45.400245,-121.232822,247.029214,
+ 0.790719,0.478954,-0.38127,45.400245,-121.232822,247.029214,
+ 0.790719,0.478954,-0.38127,43.396015,-117.243224,247.884388,
+ 0.790719,0.478954,-0.38127,45.505507,-118.712628,250.413405,
+ 0.778844,0.523487,-0.345491,43.396015,-117.243224,247.884388,
+ 0.778844,0.523487,-0.345491,41.002074,-111.234185,251.592578,
+ 0.778844,0.523487,-0.345491,45.505507,-118.712628,250.413405,
+ 0.825682,0.52838,-0.197647,45.505507,-118.712628,250.413405,
+ 0.825682,0.52838,-0.197647,41.002074,-111.234185,251.592578,
+ 0.825682,0.52838,-0.197647,44.635729,-115.060415,256.543525,
+ 0.758993,-0.338823,-0.555994,27.313805,-77.939267,272.213207,
+ 0.758993,-0.338823,-0.555994,37.200183,-63.545806,276.937811,
+ 0.758993,-0.338823,-0.555994,27.560531,-84.026187,276.259391,
+ 0.821146,-0.447928,-0.353665,30.33171,-68.076923,266.72926,
+ 0.821146,-0.447928,-0.353665,37.200183,-63.545806,276.937811,
+ 0.821146,-0.447928,-0.353665,27.313805,-77.939267,272.213207,
+ 0.681423,0.37845,-0.626449,30.33171,-68.076923,266.72926,
+ 0.681423,0.37845,-0.626449,32.05362,-60.92035,272.925701,
+ 0.681423,0.37845,-0.626449,37.200183,-63.545806,276.937811,
+ 0.138013,-0.592105,-0.793954,45.853539,-48.28926,267.724682,
+ 0.138013,-0.592105,-0.793954,45.281902,-53.509446,271.518359,
+ 0.138013,-0.592105,-0.793954,43.737963,-51.232022,269.551549,
+ 0.376726,-0.571215,-0.729239,45.853539,-48.28926,267.724682,
+ 0.376726,-0.571215,-0.729239,47.861724,-50.841702,270.761449,
+ 0.376726,-0.571215,-0.729239,45.281902,-53.509446,271.518359,
+ -0.593923,0.334491,-0.731691,36.448749,-46.651925,277.562079,
+ -0.593923,0.334491,-0.731691,43.737963,-51.232022,269.551549,
+ -0.593923,0.334491,-0.731691,37.734096,-50.197964,274.897683,
+ -0.713661,0.081117,-0.695779,45.853539,-48.28926,267.724682,
+ -0.713661,0.081117,-0.695779,43.737963,-51.232022,269.551549,
+ -0.713661,0.081117,-0.695779,36.448749,-46.651925,277.562079,
+ 0.530231,-0.789118,-0.310076,37.734096,-50.197964,274.897683,
+ 0.530231,-0.789118,-0.310076,33.307937,-54.108159,277.280063,
+ 0.530231,-0.789118,-0.310076,30.046348,-55.479298,275.192172,
+ -0.357073,0.474922,-0.804331,36.448749,-46.651925,277.562079,
+ -0.357073,0.474922,-0.804331,37.734096,-50.197964,274.897683,
+ -0.357073,0.474922,-0.804331,30.046348,-55.479298,275.192172,
+ 0.769472,-0.394922,-0.501946,66.900751,-21.398568,255.976147,
+ 0.769472,-0.394922,-0.501946,75.804707,-16.119059,265.471901,
+ 0.769472,-0.394922,-0.501946,68.465408,-25.331276,261.468917,
+ 0.706269,-0.637533,-0.307793,77.383534,-8.556955,253.43131,
+ 0.706269,-0.637533,-0.307793,75.804707,-16.119059,265.471901,
+ 0.706269,-0.637533,-0.307793,66.900751,-21.398568,255.976147,
+ 0.321259,-0.857853,-0.4011,68.465408,-25.331276,261.468917,
+ 0.321259,-0.857853,-0.4011,57.841468,-31.185769,265.481027,
+ 0.321259,-0.857853,-0.4011,58.229202,-26.936972,256.70446,
+ 0.391004,-0.692,-0.606838,68.465408,-25.331276,261.468917,
+ 0.391004,-0.692,-0.606838,58.229202,-26.936972,256.70446,
+ 0.391004,-0.692,-0.606838,66.900751,-21.398568,255.976147,
+ 0.28506,-0.957571,-0.042406,57.841468,-31.185769,265.481027,
+ 0.28506,-0.957571,-0.042406,47.603742,-34.189376,264.485909,
+ 0.28506,-0.957571,-0.042406,50.544891,-32.818845,253.308708,
+ 0.660088,-0.687151,-0.303493,58.229202,-26.936972,256.70446,
+ 0.660088,-0.687151,-0.303493,57.841468,-31.185769,265.481027,
+ 0.660088,-0.687151,-0.303493,50.544891,-32.818845,253.308708,
+ -0.218747,-0.852941,-0.473964,47.603742,-34.189376,264.485909,
+ -0.218747,-0.852941,-0.473964,44.333026,-32.472334,262.905464,
+ -0.218747,-0.852941,-0.473964,46.908893,-29.995339,257.259061,
+ -0.756947,-0.594161,-0.272037,50.544891,-32.818845,253.308708,
+ -0.756947,-0.594161,-0.272037,47.603742,-34.189376,264.485909,
+ -0.756947,-0.594161,-0.272037,46.908893,-29.995339,257.259061,
+ -0.833516,0.162156,-0.528164,44.333026,-32.472334,262.905464,
+ -0.833516,0.162156,-0.528164,40.688419,-28.405767,269.905666,
+ -0.833516,0.162156,-0.528164,43.875168,-24.972291,265.930671,
+ -0.920842,0.096206,-0.37788,46.908893,-29.995339,257.259061,
+ -0.920842,0.096206,-0.37788,44.333026,-32.472334,262.905464,
+ -0.920842,0.096206,-0.37788,43.875168,-24.972291,265.930671,
+ 0.482659,-0.765203,-0.426034,47.603742,-34.189376,264.485909,
+ 0.482659,-0.765203,-0.426034,46.178755,-38.740876,271.046507,
+ 0.482659,-0.765203,-0.426034,41.896493,-39.767633,268.03925,
+ 0.077729,-0.590989,-0.802926,44.333026,-32.472334,262.905464,
+ 0.077729,-0.590989,-0.802926,47.603742,-34.189376,264.485909,
+ 0.077729,-0.590989,-0.802926,41.896493,-39.767633,268.03925,
+ -0.712808,-0.30773,-0.630243,45.853539,-48.28926,267.724682,
+ -0.712808,-0.30773,-0.630243,36.448749,-46.651925,277.562079,
+ -0.712808,-0.30773,-0.630243,41.896493,-39.767633,268.03925,
+ 0.510126,0.267059,-0.817588,46.178755,-38.740876,271.046507,
+ 0.510126,0.267059,-0.817588,45.853539,-48.28926,267.724682,
+ 0.510126,0.267059,-0.817588,41.896493,-39.767633,268.03925,
+ 0.581096,-0.391606,-0.713423,45.853539,-48.28926,267.724682,
+ 0.581096,-0.391606,-0.713423,56.2522,-48.510431,276.315977,
+ 0.581096,-0.391606,-0.713423,47.861724,-50.841702,270.761449,
+ 0.61994,0.24947,-0.743935,52.841785,-42.377878,275.530469,
+ 0.61994,0.24947,-0.743935,56.2522,-48.510431,276.315977,
+ 0.61994,0.24947,-0.743935,45.853539,-48.28926,267.724682,
+ 0.555815,0.256198,-0.790843,52.324269,-36.613131,276.054952,
+ 0.555815,0.256198,-0.790843,45.853539,-48.28926,267.724682,
+ 0.555815,0.256198,-0.790843,46.178755,-38.740876,271.046507,
+ 0.689398,0.126777,-0.713203,52.324269,-36.613131,276.054952,
+ 0.689398,0.126777,-0.713203,52.841785,-42.377878,275.530469,
+ 0.689398,0.126777,-0.713203,45.853539,-48.28926,267.724682,
+ 0.46302,-0.863153,-0.201445,57.841468,-31.185769,265.481027,
+ 0.46302,-0.863153,-0.201445,52.324269,-36.613131,276.054952,
+ 0.46302,-0.863153,-0.201445,46.178755,-38.740876,271.046507,
+ 0.287984,-0.814986,-0.502856,57.841468,-31.185769,265.481027,
+ 0.287984,-0.814986,-0.502856,46.178755,-38.740876,271.046507,
+ 0.287984,-0.814986,-0.502856,47.603742,-34.189376,264.485909,
+ 0.081561,-0.081872,-0.9933,61.128916,-38.717451,275.909229,
+ 0.081561,-0.081872,-0.9933,56.2522,-48.510431,276.315977,
+ 0.081561,-0.081872,-0.9933,52.841785,-42.377878,275.530469,
+ 0.107259,-0.094521,-0.989728,61.128916,-38.717451,275.909229,
+ 0.107259,-0.094521,-0.989728,62.33045,-42.877718,276.436754,
+ 0.107259,-0.094521,-0.989728,56.2522,-48.510431,276.315977,
+ -0.573887,0.022959,-0.818613,63.8673,-33.103903,268.061154,
+ -0.573887,0.022959,-0.818613,52.841785,-42.377878,275.530469,
+ -0.573887,0.022959,-0.818613,52.324269,-36.613131,276.054952,
+ 0.378353,-0.810274,-0.447554,63.8673,-33.103903,268.061154,
+ 0.378353,-0.810274,-0.447554,61.128916,-38.717451,275.909229,
+ 0.378353,-0.810274,-0.447554,52.841785,-42.377878,275.530469,
+ -0.423429,-0.427108,-0.798928,68.465408,-25.331276,261.468917,
+ -0.423429,-0.427108,-0.798928,63.8673,-33.103903,268.061154,
+ -0.423429,-0.427108,-0.798928,52.324269,-36.613131,276.054952,
+ 0.393699,-0.884931,-0.248794,68.465408,-25.331276,261.468917,
+ 0.393699,-0.884931,-0.248794,52.324269,-36.613131,276.054952,
+ 0.393699,-0.884931,-0.248794,57.841468,-31.185769,265.481027,
+ 0.749541,0.178232,-0.637512,63.8673,-33.103903,268.061154,
+ 0.749541,0.178232,-0.637512,68.528747,-35.878733,272.765983,
+ 0.749541,0.178232,-0.637512,69.03525,-40.322234,272.119202,
+ -0.430278,-0.656419,-0.619656,69.03525,-40.322234,272.119202,
+ -0.430278,-0.656419,-0.619656,61.128916,-38.717451,275.909229,
+ -0.430278,-0.656419,-0.619656,63.8673,-33.103903,268.061154,
+ 0.723505,0.287002,-0.62783,68.528747,-35.878733,272.765983,
+ 0.723505,0.287002,-0.62783,72.349196,-35.983691,277.12065,
+ 0.723505,0.287002,-0.62783,73.86399,-42.981459,275.66737,
+ 0.645264,0.181565,-0.74207,68.528747,-35.878733,272.765983,
+ 0.645264,0.181565,-0.74207,73.86399,-42.981459,275.66737,
+ 0.645264,0.181565,-0.74207,69.03525,-40.322234,272.119202,
+ 0.236279,0.154345,-0.959349,75.834554,-35.379805,278.076218,
+ 0.236279,0.154345,-0.959349,79.169732,-46.629108,277.087794,
+ 0.236279,0.154345,-0.959349,72.349196,-35.983691,277.12065,
+ 0.418179,0.270604,-0.867122,72.349196,-35.983691,277.12065,
+ 0.418179,0.270604,-0.867122,79.169732,-46.629108,277.087794,
+ 0.418179,0.270604,-0.867122,73.86399,-42.981459,275.66737,
+ 0.277969,-0.091169,-0.956254,75.573101,-20.959268,276.625373,
+ 0.277969,-0.091169,-0.956254,75.834554,-35.379805,278.076218,
+ 0.277969,-0.091169,-0.956254,72.349196,-35.983691,277.12065,
+ -0.26553,0.025206,-0.963773,75.573101,-20.959268,276.625373,
+ -0.26553,0.025206,-0.963773,72.349196,-35.983691,277.12065,
+ -0.26553,0.025206,-0.963773,72.047284,-30.556329,277.345776,
+ 0.174626,0.573353,-0.800482,72.047284,-30.556329,277.345776,
+ 0.174626,0.573353,-0.800482,68.528747,-35.878733,272.765983,
+ 0.174626,0.573353,-0.800482,66.956546,-33.00138,274.483938,
+ 0.750742,0.069014,-0.65698,68.528747,-35.878733,272.765983,
+ 0.750742,0.069014,-0.65698,72.047284,-30.556329,277.345776,
+ 0.750742,0.069014,-0.65698,72.349196,-35.983691,277.12065,
+ 0.39216,-0.440419,-0.807615,67.493685,-20.598154,272.505263,
+ 0.39216,-0.440419,-0.807615,75.573101,-20.959268,276.625373,
+ 0.39216,-0.440419,-0.807615,70.272318,-23.369638,275.365884,
+ 0.158493,-0.906947,-0.390291,75.804707,-16.119059,265.471901,
+ 0.158493,-0.906947,-0.390291,75.573101,-20.959268,276.625373,
+ 0.158493,-0.906947,-0.390291,67.493685,-20.598154,272.505263,
+ 0.046339,0.667448,-0.743213,53.72367,-118.594589,269.092474,
+ 0.046339,0.667448,-0.743213,65.656231,-121.81602,266.943434,
+ 0.046339,0.667448,-0.743213,57.547223,-124.1047,264.382473,
+ 0.293816,0.923292,0.247394,65.656231,-121.81602,266.943434,
+ 0.293816,0.923292,0.247394,53.72367,-118.594589,269.092474,
+ 0.293816,0.923292,0.247394,62.580401,-122.475274,273.056821,
+ 0.71394,0.69799,-0.055675,50.763263,-117.57635,259.234389,
+ 0.71394,0.69799,-0.055675,44.775672,-110.862423,266.624911,
+ 0.71394,0.69799,-0.055675,57.547223,-124.1047,264.382473,
+ 0.671257,0.69226,-0.264934,57.547223,-124.1047,264.382473,
+ 0.671257,0.69226,-0.264934,44.775672,-110.862423,266.624911,
+ 0.671257,0.69226,-0.264934,53.72367,-118.594589,269.092474,
+ 0.794141,0.605118,-0.056317,44.775672,-110.862423,266.624911,
+ 0.794141,0.605118,-0.056317,40.806458,-105.058432,273.016968,
+ 0.794141,0.605118,-0.056317,48.160046,-114.657622,273.570048,
+ 0.632073,0.766908,0.11107,53.72367,-118.594589,269.092474,
+ 0.632073,0.766908,0.11107,44.775672,-110.862423,266.624911,
+ 0.632073,0.766908,0.11107,48.160046,-114.657622,273.570048,
+ 0.70446,0.703979,-0.090273,41.458715,-106.948577,263.366972,
+ 0.70446,0.703979,-0.090273,33.686087,-97.684338,274.957615,
+ 0.70446,0.703979,-0.090273,40.806458,-105.058432,273.016968,
+ 0.78787,0.612223,-0.066663,41.458715,-106.948577,263.366972,
+ 0.78787,0.612223,-0.066663,40.806458,-105.058432,273.016968,
+ 0.78787,0.612223,-0.066663,44.775672,-110.862423,266.624911,
+ 0.885092,0.458312,0.081007,38.394263,-103.927934,258.83981,
+ 0.885092,0.458312,0.081007,34.071844,-97.131259,267.61364,
+ 0.885092,0.458312,0.081007,33.686087,-97.684338,274.957615,
+ 0.735543,0.67585,-0.046946,38.394263,-103.927934,258.83981,
+ 0.735543,0.67585,-0.046946,33.686087,-97.684338,274.957615,
+ 0.735543,0.67585,-0.046946,41.458715,-106.948577,263.366972,
+ 0.753122,0.657732,-0.014005,36.21267,-99.885706,253.377463,
+ 0.753122,0.657732,-0.014005,32.364841,-95.296786,261.973625,
+ 0.753122,0.657732,-0.014005,34.071844,-97.131259,267.61364,
+ 0.861248,0.507216,0.031377,36.21267,-99.885706,253.377463,
+ 0.861248,0.507216,0.031377,34.071844,-97.131259,267.61364,
+ 0.861248,0.507216,0.031377,38.394263,-103.927934,258.83981,
+ 0.631422,0.774082,0.04586,34.578986,-96.303464,248.480364,
+ 0.631422,0.774082,0.04586,29.353629,-92.493663,256.118828,
+ 0.631422,0.774082,0.04586,32.364841,-95.296786,261.973625,
+ 0.846631,0.522714,0.099928,34.578986,-96.303464,248.480364,
+ 0.846631,0.522714,0.099928,32.364841,-95.296786,261.973625,
+ 0.846631,0.522714,0.099928,36.21267,-99.885706,253.377463,
+ 0.9587,-0.103695,0.264843,31.987907,-94.207359,245.912102,
+ 0.9587,-0.103695,0.264843,30.787134,-91.208619,251.432861,
+ 0.9587,-0.103695,0.264843,29.353629,-92.493663,256.118828,
+ 0.613206,0.789505,0.025707,34.578986,-96.303464,248.480364,
+ 0.613206,0.789505,0.025707,31.987907,-94.207359,245.912102,
+ 0.613206,0.789505,0.025707,29.353629,-92.493663,256.118828,
+ 0.955094,0.013864,0.295979,31.298839,-81.71104,249.336755,
+ 0.955094,0.013864,0.295979,29.353629,-92.493663,256.118828,
+ 0.955094,0.013864,0.295979,30.787134,-91.208619,251.432861,
+ 0.972037,-0.028767,0.23306,31.298839,-81.71104,249.336755,
+ 0.972037,-0.028767,0.23306,30.588171,-80.084049,252.501601,
+ 0.972037,-0.028767,0.23306,29.353629,-92.493663,256.118828,
+ 0.935346,-0.1349,0.327,30.588171,-80.084049,252.501601,
+ 0.935346,-0.1349,0.327,29.458586,-75.589743,257.58671,
+ 0.935346,-0.1349,0.327,26.714483,-88.598071,260.069485,
+ 0.85762,0.063443,0.510355,30.588171,-80.084049,252.501601,
+ 0.85762,0.063443,0.510355,26.714483,-88.598071,260.069485,
+ 0.85762,0.063443,0.510355,29.353629,-92.493663,256.118828,
+ 0.951631,-0.264576,0.1562,29.458586,-75.589743,257.58671,
+ 0.951631,-0.264576,0.1562,29.736952,-71.028507,263.616741,
+ 0.951631,-0.264576,0.1562,25.75648,-82.951363,267.672051,
+ 0.958663,-0.156928,0.237357,29.458586,-75.589743,257.58671,
+ 0.958663,-0.156928,0.237357,25.75648,-82.951363,267.672051,
+ 0.958663,-0.156928,0.237357,26.714483,-88.598071,260.069485,
+ 0.896196,-0.294593,0.331735,26.714483,-88.598071,260.069485,
+ 0.896196,-0.294593,0.331735,25.75648,-82.951363,267.672051,
+ 0.896196,-0.294593,0.331735,22.702372,-87.318503,272.044667,
+ 0.924806,0.254662,0.282632,26.714483,-88.598071,260.069485,
+ 0.924806,0.254662,0.282632,22.702372,-87.318503,272.044667,
+ 0.924806,0.254662,0.282632,25.781731,-91.052248,265.33287,
+ 0.774323,0.624995,-0.099015,29.353629,-92.493663,256.118828,
+ 0.774323,0.624995,-0.099015,26.714483,-88.598071,260.069485,
+ 0.774323,0.624995,-0.099015,32.364841,-95.296786,261.973625,
+ 0.633168,0.652447,0.416426,32.364841,-95.296786,261.973625,
+ 0.633168,0.652447,0.416426,26.714483,-88.598071,260.069485,
+ 0.633168,0.652447,0.416426,25.781731,-91.052248,265.33287,
+ 0.850432,0.515864,0.103203,25.781731,-91.052248,265.33287,
+ 0.850432,0.515864,0.103203,22.702372,-87.318503,272.044667,
+ 0.850432,0.515864,0.103203,22.949403,-88.924503,278.036669,
+ 0.635968,0.771613,0.012553,25.781731,-91.052248,265.33287,
+ 0.635968,0.771613,0.012553,22.949403,-88.924503,278.036669,
+ 0.635968,0.771613,0.012553,25.683162,-91.129521,275.076262,
+ 0.546228,0.837548,0.012168,32.364841,-95.296786,261.973625,
+ 0.546228,0.837548,0.012168,25.781731,-91.052248,265.33287,
+ 0.546228,0.837548,0.012168,25.683162,-91.129521,275.076262,
+ 0.619304,0.782287,0.067009,34.071844,-97.131259,267.61364,
+ 0.619304,0.782287,0.067009,32.364841,-95.296786,261.973625,
+ 0.619304,0.782287,0.067009,25.683162,-91.129521,275.076262,
+ 0.659679,0.746038,0.090836,34.071844,-97.131259,267.61364,
+ 0.659679,0.746038,0.090836,26.585188,-92.192481,281.421773,
+ 0.659679,0.746038,0.090836,33.686087,-97.684338,274.957615,
+ 0.60816,0.792463,0.046298,34.071844,-97.131259,267.61364,
+ 0.60816,0.792463,0.046298,25.683162,-91.129521,275.076262,
+ 0.60816,0.792463,0.046298,26.585188,-92.192481,281.421773,
+ 0.742524,-0.636927,-0.207322,31.805677,-84.777621,281.526122,
+ 0.742524,-0.636927,-0.207322,28.928323,-90.852069,289.882556,
+ 0.742524,-0.636927,-0.207322,27.357309,-92.166926,288.295418,
+ 0.326202,-0.73778,-0.590994,31.805677,-84.777621,281.526122,
+ 0.326202,-0.73778,-0.590994,27.357309,-92.166926,288.295418,
+ 0.326202,-0.73778,-0.590994,26.291915,-87.601736,282.008318,
+ 0.797386,0.544476,0.260232,26.291915,-87.601736,282.008318,
+ 0.797386,0.544476,0.260232,27.357309,-92.166926,288.295418,
+ 0.797386,0.544476,0.260232,30.756711,-95.433078,284.712872,
+ 0.676488,0.135699,-0.723843,26.291915,-87.601736,282.008318,
+ 0.676488,0.135699,-0.723843,30.756711,-95.433078,284.712872,
+ 0.676488,0.135699,-0.723843,26.585188,-92.192481,281.421773,
+ 0.649981,0.759155,0.034773,26.585188,-92.192481,281.421773,
+ 0.649981,0.759155,0.034773,25.683162,-91.129521,275.076262,
+ 0.649981,0.759155,0.034773,22.949403,-88.924503,278.036669,
+ 0.73636,0.13183,-0.663622,22.949403,-88.924503,278.036669,
+ 0.73636,0.13183,-0.663622,26.291915,-87.601736,282.008318,
+ 0.73636,0.13183,-0.663622,26.585188,-92.192481,281.421773,
+ 0.688651,-0.674043,-0.267257,22.702372,-87.318503,272.044667,
+ 0.688651,-0.674043,-0.267257,27.560531,-84.026187,276.259391,
+ 0.688651,-0.674043,-0.267257,26.291915,-87.601736,282.008318,
+ 0.584053,-0.777699,-0.232521,26.291915,-87.601736,282.008318,
+ 0.584053,-0.777699,-0.232521,22.949403,-88.924503,278.036669,
+ 0.584053,-0.777699,-0.232521,22.702372,-87.318503,272.044667,
+ 0.970512,-0.104922,-0.21702,25.75648,-82.951363,267.672051,
+ 0.970512,-0.104922,-0.21702,27.313805,-77.939267,272.213207,
+ 0.970512,-0.104922,-0.21702,27.560531,-84.026187,276.259391,
+ 0.674596,-0.701594,-0.229535,27.560531,-84.026187,276.259391,
+ 0.674596,-0.701594,-0.229535,22.702372,-87.318503,272.044667,
+ 0.674596,-0.701594,-0.229535,25.75648,-82.951363,267.672051,
+ 0.963559,-0.260089,0.062518,29.736952,-71.028507,263.616741,
+ 0.963559,-0.260089,0.062518,30.33171,-68.076923,266.72926,
+ 0.963559,-0.260089,0.062518,27.313805,-77.939267,272.213207,
+ 0.950175,-0.311217,0.017643,29.736952,-71.028507,263.616741,
+ 0.950175,-0.311217,0.017643,27.313805,-77.939267,272.213207,
+ 0.950175,-0.311217,0.017643,25.75648,-82.951363,267.672051,
+ -0.030898,-0.109312,-0.993527,30.73359,-77.949002,280.808153,
+ -0.030898,-0.109312,-0.993527,31.805677,-84.777621,281.526122,
+ -0.030898,-0.109312,-0.993527,26.291915,-87.601736,282.008318,
+ 0.903515,-0.423727,-0.064158,27.560531,-84.026187,276.259391,
+ 0.903515,-0.423727,-0.064158,30.73359,-77.949002,280.808153,
+ 0.903515,-0.423727,-0.064158,26.291915,-87.601736,282.008318,
+ 0.903702,-0.423199,-0.064994,27.560531,-84.026187,276.259391,
+ 0.903702,-0.423199,-0.064994,37.200183,-63.545806,276.937811,
+ 0.903702,-0.423199,-0.064994,30.73359,-77.949002,280.808153,
+ 0.909784,-0.32013,-0.264215,76.126123,-110.430729,263.907883,
+ 0.909784,-0.32013,-0.264215,79.302103,-105.035311,268.306663,
+ 0.909784,-0.32013,-0.264215,76.774498,-111.561227,267.510203,
+ 0.900444,-0.228076,-0.370382,76.126123,-110.430729,263.907883,
+ 0.900444,-0.228076,-0.370382,78.315769,-104.576845,265.626446,
+ 0.900444,-0.228076,-0.370382,79.302103,-105.035311,268.306663,
+ 0.887598,-0.381021,-0.25883,72.775414,-115.932626,260.516695,
+ 0.887598,-0.381021,-0.25883,76.126123,-110.430729,263.907883,
+ 0.887598,-0.381021,-0.25883,73.137411,-118.532527,265.585376,
+ 0.88088,-0.382643,-0.278631,76.126123,-110.430729,263.907883,
+ 0.88088,-0.382643,-0.278631,76.774498,-111.561227,267.510203,
+ 0.88088,-0.382643,-0.278631,73.137411,-118.532527,265.585376,
+ 0.730054,-0.110082,-0.674465,77.853901,-100.732058,264.498991,
+ 0.730054,-0.110082,-0.674465,79.375199,-99.811779,265.995471,
+ 0.730054,-0.110082,-0.674465,78.315769,-104.576845,265.626446,
+ 0.860227,-0.045591,-0.507869,77.312251,-103.896295,263.865596,
+ 0.860227,-0.045591,-0.507869,77.853901,-100.732058,264.498991,
+ 0.860227,-0.045591,-0.507869,78.315769,-104.576845,265.626446,
+ 0.824996,-0.148509,-0.545277,74.649284,-108.599603,261.174732,
+ 0.824996,-0.148509,-0.545277,78.315769,-104.576845,265.626446,
+ 0.824996,-0.148509,-0.545277,76.126123,-110.430729,263.907883,
+ 0.828779,-0.162981,-0.535316,74.649284,-108.599603,261.174732,
+ 0.828779,-0.162981,-0.535316,77.312251,-103.896295,263.865596,
+ 0.828779,-0.162981,-0.535316,78.315769,-104.576845,265.626446,
+ 0.788188,-0.147802,-0.597423,71.591373,-113.795146,258.425761,
+ 0.788188,-0.147802,-0.597423,74.649284,-108.599603,261.174732,
+ 0.788188,-0.147802,-0.597423,72.775414,-115.932626,260.516695,
+ 0.819604,-0.160075,-0.550113,72.775414,-115.932626,260.516695,
+ 0.819604,-0.160075,-0.550113,74.649284,-108.599603,261.174732,
+ 0.819604,-0.160075,-0.550113,76.126123,-110.430729,263.907883,
+ -0.691245,0.253763,-0.676598,77.312251,-103.896295,263.865596,
+ -0.691245,0.253763,-0.676598,77.047378,-100.575078,265.38185,
+ -0.691245,0.253763,-0.676598,77.853901,-100.732058,264.498991,
+ -0.653564,0.270581,-0.706853,77.047378,-100.575078,265.38185,
+ -0.653564,0.270581,-0.706853,77.312251,-103.896295,263.865596,
+ -0.653564,0.270581,-0.706853,76.437992,-103.509321,264.822077,
+ -0.125711,0.545321,-0.828747,77.312251,-103.896295,263.865596,
+ -0.125711,0.545321,-0.828747,74.649284,-108.599603,261.174732,
+ -0.125711,0.545321,-0.828747,74.224344,-108.194072,261.506032,
+ -0.41311,0.648075,-0.639796,77.312251,-103.896295,263.865596,
+ -0.41311,0.648075,-0.639796,74.224344,-108.194072,261.506032,
+ -0.41311,0.648075,-0.639796,76.437992,-103.509321,264.822077,
+ 0.198348,0.399074,-0.895209,74.224344,-108.194072,261.506032,
+ 0.198348,0.399074,-0.895209,71.591373,-113.795146,258.425761,
+ 0.198348,0.399074,-0.895209,71.068442,-113.40148,258.485389,
+ -0.147038,0.528818,-0.835902,74.224344,-108.194072,261.506032,
+ -0.147038,0.528818,-0.835902,74.649284,-108.599603,261.174732,
+ -0.147038,0.528818,-0.835902,71.591373,-113.795146,258.425761,
+ -0.928369,0.174619,0.328085,71.068442,-113.40148,258.485389,
+ -0.928369,0.174619,0.328085,71.360741,-114.810038,260.062184,
+ -0.928369,0.174619,0.328085,73.599071,-109.462079,263.549507,
+ -0.865612,0.498724,0.044602,71.068442,-113.40148,258.485389,
+ -0.865612,0.498724,0.044602,73.599071,-109.462079,263.549507,
+ -0.865612,0.498724,0.044602,74.224344,-108.194072,261.506032,
+ -0.901914,0.431842,-0.008007,74.224344,-108.194072,261.506032,
+ -0.901914,0.431842,-0.008007,73.599071,-109.462079,263.549507,
+ -0.901914,0.431842,-0.008007,76.437992,-103.509321,264.822077,
+ -0.906135,0.409443,0.106189,73.599071,-109.462079,263.549507,
+ -0.906135,0.409443,0.106189,74.160578,-108.927861,266.281137,
+ -0.906135,0.409443,0.106189,76.437992,-103.509321,264.822077,
+ -0.884351,0.257896,-0.389118,76.437992,-103.509321,264.822077,
+ -0.884351,0.257896,-0.389118,72.253518,-110.994153,269.371448,
+ -0.884351,0.257896,-0.389118,77.047378,-100.575078,265.38185,
+ -0.88944,0.275666,-0.364562,76.437992,-103.509321,264.822077,
+ -0.88944,0.275666,-0.364562,74.160578,-108.927861,266.281137,
+ -0.88944,0.275666,-0.364562,72.253518,-110.994153,269.371448,
+ -0.872367,0.236955,-0.427584,71.908984,-114.046739,268.382719,
+ -0.872367,0.236955,-0.427584,69.192808,-115.392019,273.178815,
+ -0.872367,0.236955,-0.427584,72.253518,-110.994153,269.371448,
+ -0.819339,0.466583,-0.333143,71.908984,-114.046739,268.382719,
+ -0.819339,0.466583,-0.333143,69.910777,-116.368579,270.045305,
+ -0.819339,0.466583,-0.333143,69.192808,-115.392019,273.178815,
+ -0.971517,0.233105,0.042629,71.360741,-114.810038,260.062184,
+ -0.971517,0.233105,0.042629,70.777512,-117.913126,263.738735,
+ -0.971517,0.233105,0.042629,71.908984,-114.046739,268.382719,
+ -0.928304,0.370829,0.027148,71.360741,-114.810038,260.062184,
+ -0.928304,0.370829,0.027148,71.908984,-114.046739,268.382719,
+ -0.928304,0.370829,0.027148,73.599071,-109.462079,263.549507,
+ -0.817232,0.506661,-0.27464,71.908984,-114.046739,268.382719,
+ -0.817232,0.506661,-0.27464,68.732638,-119.114204,268.485851,
+ -0.817232,0.506661,-0.27464,69.910777,-116.368579,270.045305,
+ -0.827382,0.514006,-0.226355,70.777512,-117.913126,263.738735,
+ -0.827382,0.514006,-0.226355,68.732638,-119.114204,268.485851,
+ -0.827382,0.514006,-0.226355,71.908984,-114.046739,268.382719,
+ -0.895234,0.434447,0.099058,73.599071,-109.462079,263.549507,
+ -0.895234,0.434447,0.099058,71.908984,-114.046739,268.382719,
+ -0.895234,0.434447,0.099058,74.160578,-108.927861,266.281137,
+ -0.889351,0.228628,-0.395958,74.160578,-108.927861,266.281137,
+ -0.889351,0.228628,-0.395958,71.908984,-114.046739,268.382719,
+ -0.889351,0.228628,-0.395958,72.253518,-110.994153,269.371448,
+ -0.606622,0.779599,-0.155675,68.732638,-119.114204,268.485851,
+ -0.606622,0.779599,-0.155675,65.656231,-121.81602,266.943434,
+ -0.606622,0.779599,-0.155675,63.048237,-121.702544,277.674338,
+ -0.411848,0.90463,-0.10966,65.656231,-121.81602,266.943434,
+ -0.411848,0.90463,-0.10966,62.580401,-122.475274,273.056821,
+ -0.411848,0.90463,-0.10966,63.048237,-121.702544,277.674338,
+ -0.788639,0.574713,0.218525,66.880916,-117.784135,254.899193,
+ -0.788639,0.574713,0.218525,67.098984,-118.006827,256.271853,
+ -0.788639,0.574713,0.218525,71.068442,-113.40148,258.485389,
+ -0.758306,0.409999,0.506826,67.098984,-118.006827,256.271853,
+ -0.758306,0.409999,0.506826,71.360741,-114.810038,260.062184,
+ -0.758306,0.409999,0.506826,71.068442,-113.40148,258.485389,
+ 0.684781,0.608682,-0.400725,57.681933,-116.287352,281.75855,
+ 0.684781,0.608682,-0.400725,53.319235,-110.353152,283.317091,
+ 0.684781,0.608682,-0.400725,58.544592,-114.050086,286.631006,
+ 0.661916,0.703415,-0.258989,58.544592,-114.050086,286.631006,
+ 0.661916,0.703415,-0.258989,53.319235,-110.353152,283.317091,
+ 0.661916,0.703415,-0.258989,49.026173,-104.252237,288.915123,
+ 0.464055,0.692185,-0.55275,57.681933,-116.287352,281.75855,
+ 0.464055,0.692185,-0.55275,56.015909,-118.299491,277.84014,
+ 0.464055,0.692185,-0.55275,51.112909,-113.604093,279.603729,
+ 0.450694,0.521604,-0.724433,53.319235,-110.353152,283.317091,
+ 0.450694,0.521604,-0.724433,57.681933,-116.287352,281.75855,
+ 0.450694,0.521604,-0.724433,51.112909,-113.604093,279.603729,
+ 0.423911,0.885313,-0.191105,63.048237,-121.702544,277.674338,
+ 0.423911,0.885313,-0.191105,62.580401,-122.475274,273.056821,
+ 0.423911,0.885313,-0.191105,56.015909,-118.299491,277.84014,
+ 0.35563,0.761316,-0.542149,63.048237,-121.702544,277.674338,
+ 0.35563,0.761316,-0.542149,56.015909,-118.299491,277.84014,
+ 0.35563,0.761316,-0.542149,57.681933,-116.287352,281.75855,
+ -0.86319,0.16425,0.477416,78.572452,-97.245343,267.892613,
+ -0.86319,0.16425,0.477416,81.400652,-97.774693,273.188246,
+ -0.86319,0.16425,0.477416,82.509376,-92.784501,273.476042,
+ -0.861671,0.156086,0.482868,79.341695,-92.503702,267.732591,
+ -0.861671,0.156086,0.482868,78.572452,-97.245343,267.892613,
+ -0.861671,0.156086,0.482868,82.509376,-92.784501,273.476042,
+ -0.872706,0.061663,0.484337,79.341695,-92.503702,267.732591,
+ -0.872706,0.061663,0.484337,82.509376,-92.784501,273.476042,
+ -0.872706,0.061663,0.484337,83.248063,-88.516538,274.263679,
+ -0.851426,-0.024028,0.523923,79.341695,-92.503702,267.732591,
+ -0.851426,-0.024028,0.523923,83.248063,-88.516538,274.263679,
+ -0.851426,-0.024028,0.523923,79.475255,-85.030736,268.292364,
+ -0.923884,0.16159,0.346883,77.047378,-100.575078,265.38185,
+ -0.923884,0.16159,0.346883,78.572452,-97.245343,267.892613,
+ -0.923884,0.16159,0.346883,79.341695,-92.503702,267.732591,
+ -0.748021,0.019419,0.663391,77.047378,-100.575078,265.38185,
+ -0.748021,0.019419,0.663391,79.341695,-92.503702,267.732591,
+ -0.748021,0.019419,0.663391,77.619828,-92.908016,265.802897,
+ 0.654314,-0.730561,-0.195332,28.698634,-140.65359,260.13611,
+ 0.654314,-0.730561,-0.195332,24.483302,-146.584443,268.19775,
+ 0.654314,-0.730561,-0.195332,23.733693,-145.517224,261.69526,
+ 0.60881,-0.756669,-0.238333,30.166516,-141.117837,265.359642,
+ 0.60881,-0.756669,-0.238333,24.483302,-146.584443,268.19775,
+ 0.60881,-0.756669,-0.238333,28.698634,-140.65359,260.13611,
+ 0.603022,-0.784367,-0.145371,36.212366,-135.092978,261.301289,
+ 0.603022,-0.784367,-0.145371,28.698634,-140.65359,260.13611,
+ 0.603022,-0.784367,-0.145371,34.449386,-135.805471,257.832524,
+ 0.601414,-0.763032,-0.236821,36.212366,-135.092978,261.301289,
+ 0.601414,-0.763032,-0.236821,30.166516,-141.117837,265.359642,
+ 0.601414,-0.763032,-0.236821,28.698634,-140.65359,260.13611,
+ 0.352432,-0.739761,-0.573189,41.118288,-136.257853,265.82115,
+ 0.352432,-0.739761,-0.573189,30.166516,-141.117837,265.359642,
+ 0.352432,-0.739761,-0.573189,36.212366,-135.092978,261.301289,
+ 0.402733,-0.885557,-0.231505,41.118288,-136.257853,265.82115,
+ 0.402733,-0.885557,-0.231505,30.756407,-142.474069,271.573728,
+ 0.402733,-0.885557,-0.231505,30.166516,-141.117837,265.359642,
+ 0.203107,-0.825653,-0.52635,43.652781,-138.971534,271.055938,
+ 0.203107,-0.825653,-0.52635,30.756407,-142.474069,271.573728,
+ 0.203107,-0.825653,-0.52635,41.118288,-136.257853,265.82115,
+ 0.228864,-0.898173,-0.375376,43.652781,-138.971534,271.055938,
+ 0.228864,-0.898173,-0.375376,33.919732,-143.07552,274.941491,
+ 0.228864,-0.898173,-0.375376,30.756407,-142.474069,271.573728,
+ 0.605752,-0.773915,-0.184715,34.449386,-135.805471,257.832524,
+ 0.605752,-0.773915,-0.184715,25.761652,-141.519413,253.28224,
+ 0.605752,-0.773915,-0.184715,32.814181,-135.213451,249.989621,
+ 0.598891,-0.785202,-0.157442,34.449386,-135.805471,257.832524,
+ 0.598891,-0.785202,-0.157442,28.698634,-140.65359,260.13611,
+ 0.598891,-0.785202,-0.157442,25.761652,-141.519413,253.28224,
+ 0.435882,-0.859829,-0.265896,42.333664,-131.071132,252.19981,
+ 0.435882,-0.859829,-0.265896,32.814181,-135.213451,249.989621,
+ 0.435882,-0.859829,-0.265896,40.66621,-130.39545,247.281416,
+ 0.424322,-0.892007,-0.155802,42.333664,-131.071132,252.19981,
+ 0.424322,-0.892007,-0.155802,34.449386,-135.805471,257.832524,
+ 0.424322,-0.892007,-0.155802,32.814181,-135.213451,249.989621,
+ 0.077912,-0.914255,-0.397576,53.667784,-136.958786,269.89228,
+ 0.077912,-0.914255,-0.397576,41.118288,-136.257853,265.82115,
+ 0.077912,-0.914255,-0.397576,48.720275,-134.574276,263.439378,
+ 0.11436,-0.858272,-0.500292,53.667784,-136.958786,269.89228,
+ 0.11436,-0.858272,-0.500292,43.652781,-138.971534,271.055938,
+ 0.11436,-0.858272,-0.500292,41.118288,-136.257853,265.82115,
+ 0.099228,-0.929598,-0.354966,48.720275,-134.574276,263.439378,
+ 0.099228,-0.929598,-0.354966,36.212366,-135.092978,261.301289,
+ 0.099228,-0.929598,-0.354966,45.482386,-132.52928,257.178745,
+ 0.097955,-0.932834,-0.346735,48.720275,-134.574276,263.439378,
+ 0.097955,-0.932834,-0.346735,41.118288,-136.257853,265.82115,
+ 0.097955,-0.932834,-0.346735,36.212366,-135.092978,261.301289,
+ 0.237526,-0.881386,-0.408339,45.482386,-132.52928,257.178745,
+ 0.237526,-0.881386,-0.408339,34.449386,-135.805471,257.832524,
+ 0.237526,-0.881386,-0.408339,42.333664,-131.071132,252.19981,
+ 0.287049,-0.956579,0.050593,45.482386,-132.52928,257.178745,
+ 0.287049,-0.956579,0.050593,36.212366,-135.092978,261.301289,
+ 0.287049,-0.956579,0.050593,34.449386,-135.805471,257.832524,
+ 0.901192,-0.421296,0.101796,34.485285,-139.175364,227.142982,
+ 0.901192,-0.421296,0.101796,36.946764,-133.649738,228.220241,
+ 0.901192,-0.421296,0.101796,35.592053,-134.716653,235.79786,
+ 0.830898,-0.530723,0.167158,34.485285,-139.175364,227.142982,
+ 0.830898,-0.530723,0.167158,35.592053,-134.716653,235.79786,
+ 0.830898,-0.530723,0.167158,31.526095,-141.20667,235.402977,
+ 0.825387,-0.529086,0.196989,31.526095,-141.20667,235.402977,
+ 0.825387,-0.529086,0.196989,35.592053,-134.716653,235.79786,
+ 0.825387,-0.529086,0.196989,33.299418,-135.899172,242.227945,
+ 0.699747,-0.640547,0.316313,31.526095,-141.20667,235.402977,
+ 0.699747,-0.640547,0.316313,33.299418,-135.899172,242.227945,
+ 0.699747,-0.640547,0.316313,26.826437,-141.899389,244.396761,
+ 0.694886,-0.711223,0.106277,33.299418,-135.899172,242.227945,
+ 0.694886,-0.711223,0.106277,32.814181,-135.213451,249.989621,
+ 0.694886,-0.711223,0.106277,26.826437,-141.899389,244.396761,
+ 0.691138,-0.713779,0.113346,32.814181,-135.213451,249.989621,
+ 0.691138,-0.713779,0.113346,25.761652,-141.519413,253.28224,
+ 0.691138,-0.713779,0.113346,26.826437,-141.899389,244.396761,
+ 0.705523,-0.604055,-0.370615,38.863073,-129.238181,241.962662,
+ 0.705523,-0.604055,-0.370615,40.66621,-130.39545,247.281416,
+ 0.705523,-0.604055,-0.370615,33.299418,-135.899172,242.227945,
+ 0.546643,-0.830431,0.107541,40.66621,-130.39545,247.281416,
+ 0.546643,-0.830431,0.107541,32.814181,-135.213451,249.989621,
+ 0.546643,-0.830431,0.107541,33.299418,-135.899172,242.227945,
+ 0.918971,-0.354606,-0.172475,35.592053,-134.716653,235.79786,
+ 0.918971,-0.354606,-0.172475,37.755088,-129.700602,237.00989,
+ 0.918971,-0.354606,-0.172475,38.863073,-129.238181,241.962662,
+ 0.761185,-0.629589,0.155615,35.592053,-134.716653,235.79786,
+ 0.761185,-0.629589,0.155615,38.863073,-129.238181,241.962662,
+ 0.761185,-0.629589,0.155615,33.299418,-135.899172,242.227945,
+ 0.923108,-0.375312,0.083734,36.946764,-133.649738,228.220241,
+ 0.923108,-0.375312,0.083734,38.964075,-128.558848,228.79918,
+ 0.923108,-0.375312,0.083734,37.755088,-129.700602,237.00989,
+ 0.904045,-0.414786,0.103222,36.946764,-133.649738,228.220241,
+ 0.904045,-0.414786,0.103222,37.755088,-129.700602,237.00989,
+ 0.904045,-0.414786,0.103222,35.592053,-134.716653,235.79786,
+ 0.883754,-0.430928,-0.182426,69.933047,-124.016475,263.016202,
+ 0.883754,-0.430928,-0.182426,73.137411,-118.532527,265.585376,
+ 0.883754,-0.430928,-0.182426,70.969904,-125.142105,270.69817,
+ 0.91254,-0.391296,-0.118989,73.137411,-118.532527,265.585376,
+ 0.91254,-0.391296,-0.118989,73.608654,-119.089866,271.032208,
+ 0.91254,-0.391296,-0.118989,70.969904,-125.142105,270.69817,
+ 0.763541,-0.241755,-0.598798,67.452584,-118.935928,255.2238,
+ 0.763541,-0.241755,-0.598798,71.591373,-113.795146,258.425761,
+ 0.763541,-0.241755,-0.598798,68.252177,-120.956586,257.059185,
+ 0.73493,-0.220291,-0.641366,68.252177,-120.956586,257.059185,
+ 0.73493,-0.220291,-0.641366,71.591373,-113.795146,258.425761,
+ 0.73493,-0.220291,-0.641366,72.775414,-115.932626,260.516695,
+ 0.602246,0.074919,-0.794787,71.068442,-113.40148,258.485389,
+ 0.602246,0.074919,-0.794787,67.452584,-118.935928,255.2238,
+ 0.602246,0.074919,-0.794787,66.880916,-117.784135,254.899193,
+ 0.197876,0.398501,-0.895568,71.068442,-113.40148,258.485389,
+ 0.197876,0.398501,-0.895568,71.591373,-113.795146,258.425761,
+ 0.197876,0.398501,-0.895568,67.452584,-118.935928,255.2238,
+ -0.783305,0.519511,-0.341382,69.910777,-116.368579,270.045305,
+ -0.783305,0.519511,-0.341382,63.048237,-121.702544,277.674338,
+ -0.783305,0.519511,-0.341382,69.192808,-115.392019,273.178815,
+ -0.781624,0.525896,-0.335406,68.732638,-119.114204,268.485851,
+ -0.781624,0.525896,-0.335406,63.048237,-121.702544,277.674338,
+ -0.781624,0.525896,-0.335406,69.910777,-116.368579,270.045305,
+ 0.964044,-0.24791,-0.095705,79.302103,-105.035311,268.306663,
+ 0.964044,-0.24791,-0.095705,81.246574,-97.620451,268.686335,
+ 0.964044,-0.24791,-0.095705,79.603072,-105.755105,273.202849,
+ 0.919071,-0.316247,-0.235151,81.246574,-97.620451,268.686335,
+ 0.919071,-0.316247,-0.235151,82.286288,-97.204577,272.190695,
+ 0.919071,-0.316247,-0.235151,79.603072,-105.755105,273.202849,
+ 0.874104,-0.206718,-0.439558,79.375199,-99.811779,265.995471,
+ 0.874104,-0.206718,-0.439558,81.246574,-97.620451,268.686335,
+ 0.874104,-0.206718,-0.439558,79.302103,-105.035311,268.306663,
+ 0.913946,-0.174837,-0.366244,78.315769,-104.576845,265.626446,
+ 0.913946,-0.174837,-0.366244,79.375199,-99.811779,265.995471,
+ 0.913946,-0.174837,-0.366244,79.302103,-105.035311,268.306663,
+ 0.90269,-0.413112,-0.120369,73.137411,-118.532527,265.585376,
+ 0.90269,-0.413112,-0.120369,76.654205,-112.963701,272.846602,
+ 0.90269,-0.413112,-0.120369,73.608654,-119.089866,271.032208,
+ 0.893106,-0.439612,-0.095403,73.137411,-118.532527,265.585376,
+ 0.893106,-0.439612,-0.095403,76.774498,-111.561227,267.510203,
+ 0.893106,-0.439612,-0.095403,76.654205,-112.963701,272.846602,
+ 0.933016,-0.35263,-0.071644,76.774498,-111.561227,267.510203,
+ 0.933016,-0.35263,-0.071644,79.302103,-105.035311,268.306663,
+ 0.933016,-0.35263,-0.071644,76.654205,-112.963701,272.846602,
+ 0.921718,-0.371554,-0.111281,79.302103,-105.035311,268.306663,
+ 0.921718,-0.371554,-0.111281,79.603072,-105.755105,273.202849,
+ 0.921718,-0.371554,-0.111281,76.654205,-112.963701,272.846602,
+ -0.317926,-0.373258,-0.871551,62.087801,-67.302976,272.432857,
+ -0.317926,-0.373258,-0.871551,64.381013,-68.62118,272.160881,
+ -0.317926,-0.373258,-0.871551,61.030713,-67.956146,273.098196,
+ -0.48359,-0.689227,-0.539543,61.030713,-67.956146,273.098196,
+ -0.48359,-0.689227,-0.539543,60.571669,-69.959159,276.068338,
+ -0.48359,-0.689227,-0.539543,57.699061,-68.135334,276.313239,
+ -0.359159,-0.747093,-0.559336,62.540122,-69.192209,273.779963,
+ -0.359159,-0.747093,-0.559336,60.571669,-69.959159,276.068338,
+ -0.359159,-0.747093,-0.559336,61.030713,-67.956146,273.098196,
+ -0.544174,-0.589689,-0.596777,53.3412,-64.212666,276.410895,
+ -0.544174,-0.589689,-0.596777,61.030713,-67.956146,273.098196,
+ -0.544174,-0.589689,-0.596777,57.699061,-68.135334,276.313239,
+ -0.540142,-0.533663,-0.650731,55.989168,-64.079415,274.103657,
+ -0.540142,-0.533663,-0.650731,61.030713,-67.956146,273.098196,
+ -0.540142,-0.533663,-0.650731,53.3412,-64.212666,276.410895,
+ -0.485871,-0.09833,-0.868482,59.469221,-61.715592,273.265215,
+ -0.485871,-0.09833,-0.868482,62.087801,-67.302976,272.432857,
+ -0.485871,-0.09833,-0.868482,61.030713,-67.956146,273.098196,
+ -0.216143,-0.027962,-0.975961,59.469221,-61.715592,273.265215,
+ -0.216143,-0.027962,-0.975961,61.030713,-67.956146,273.098196,
+ -0.216143,-0.027962,-0.975961,55.989168,-64.079415,274.103657,
+ -0.258796,-0.558975,-0.787764,57.699061,-68.135334,276.313239,
+ -0.258796,-0.558975,-0.787764,56.070609,-71.421869,279.180249,
+ -0.258796,-0.558975,-0.787764,50.579512,-68.538736,278.93839,
+ -0.380202,-0.493824,-0.782038,57.699061,-68.135334,276.313239,
+ -0.380202,-0.493824,-0.782038,60.571669,-69.959159,276.068338,
+ -0.380202,-0.493824,-0.782038,56.070609,-71.421869,279.180249,
+ -0.249899,-0.254365,-0.934264,53.3412,-64.212666,276.410895,
+ -0.249899,-0.254365,-0.934264,57.699061,-68.135334,276.313239,
+ -0.249899,-0.254365,-0.934264,46.884555,-65.362634,278.451023,
+ -0.284185,-0.459716,-0.841368,46.884555,-65.362634,278.451023,
+ -0.284185,-0.459716,-0.841368,57.699061,-68.135334,276.313239,
+ -0.284185,-0.459716,-0.841368,50.579512,-68.538736,278.93839,
+ -0.121782,-0.476658,-0.870613,49.159728,-59.611577,274.984082,
+ -0.121782,-0.476658,-0.870613,46.884555,-65.362634,278.451023,
+ -0.121782,-0.476658,-0.870613,41.781192,-63.485874,278.137368,
+ -0.19573,-0.448342,-0.872169,49.159728,-59.611577,274.984082,
+ -0.19573,-0.448342,-0.872169,53.3412,-64.212666,276.410895,
+ -0.19573,-0.448342,-0.872169,46.884555,-65.362634,278.451023,
+ -0.188016,-0.179352,-0.965652,52.372093,-55.801167,273.270387,
+ -0.188016,-0.179352,-0.965652,55.989168,-64.079415,274.103657,
+ -0.188016,-0.179352,-0.965652,51.178591,-57.827606,273.87914,
+ -0.130297,-0.155496,-0.979206,52.372093,-55.801167,273.270387,
+ -0.130297,-0.155496,-0.979206,59.469221,-61.715592,273.265215,
+ -0.130297,-0.155496,-0.979206,55.989168,-64.079415,274.103657,
+ -0.137024,-0.404875,-0.904047,51.178591,-57.827606,273.87914,
+ -0.137024,-0.404875,-0.904047,53.3412,-64.212666,276.410895,
+ -0.137024,-0.404875,-0.904047,49.159728,-59.611577,274.984082,
+ -0.569156,-0.462365,-0.679912,51.178591,-57.827606,273.87914,
+ -0.569156,-0.462365,-0.679912,55.989168,-64.079415,274.103657,
+ -0.569156,-0.462365,-0.679912,53.3412,-64.212666,276.410895,
+ 0.225217,0.271072,-0.93584,56.2522,-48.510431,276.315977,
+ 0.225217,0.271072,-0.93584,59.469221,-61.715592,273.265215,
+ 0.225217,0.271072,-0.93584,52.372093,-55.801167,273.270387,
+ 0.188337,0.264399,-0.945845,56.2522,-48.510431,276.315977,
+ 0.188337,0.264399,-0.945845,63.510993,-56.186315,275.615652,
+ 0.188337,0.264399,-0.945845,59.469221,-61.715592,273.265215,
+ 0.109333,-0.367745,-0.923477,47.861724,-50.841702,270.761449,
+ 0.109333,-0.367745,-0.923477,52.372093,-55.801167,273.270387,
+ 0.109333,-0.367745,-0.923477,45.281902,-53.509446,271.518359,
+ 0.538332,0.064506,-0.84026,56.2522,-48.510431,276.315977,
+ 0.538332,0.064506,-0.84026,52.372093,-55.801167,273.270387,
+ 0.538332,0.064506,-0.84026,47.861724,-50.841702,270.761449,
+ -0.098542,-0.520829,-0.847954,44.635425,-56.328084,273.493079,
+ -0.098542,-0.520829,-0.847954,49.159728,-59.611577,274.984082,
+ -0.098542,-0.520829,-0.847954,43.796374,-58.62802,275.003249,
+ -0.057737,-0.477638,-0.876658,44.635425,-56.328084,273.493079,
+ -0.057737,-0.477638,-0.876658,51.178591,-57.827606,273.87914,
+ -0.057737,-0.477638,-0.876658,49.159728,-59.611577,274.984082,
+ -0.079589,-0.55966,-0.824892,45.281902,-53.509446,271.518359,
+ -0.079589,-0.55966,-0.824892,51.178591,-57.827606,273.87914,
+ -0.079589,-0.55966,-0.824892,44.635425,-56.328084,273.493079,
+ 0.117195,-0.348398,-0.929991,45.281902,-53.509446,271.518359,
+ 0.117195,-0.348398,-0.929991,52.372093,-55.801167,273.270387,
+ 0.117195,-0.348398,-0.929991,51.178591,-57.827606,273.87914,
+ 0.211683,-0.590335,-0.778906,43.796374,-58.62802,275.003249,
+ 0.211683,-0.590335,-0.778906,41.781192,-63.485874,278.137368,
+ 0.211683,-0.590335,-0.778906,37.200183,-63.545806,276.937811,
+ -0.09675,-0.510937,-0.854156,43.796374,-58.62802,275.003249,
+ -0.09675,-0.510937,-0.854156,49.159728,-59.611577,274.984082,
+ -0.09675,-0.510937,-0.854156,41.781192,-63.485874,278.137368,
+ 0.257553,-0.362156,-0.895829,41.781192,-63.485874,278.137368,
+ 0.257553,-0.362156,-0.895829,36.859756,-74.75343,281.277571,
+ 0.257553,-0.362156,-0.895829,30.73359,-77.949002,280.808153,
+ 0.241453,-0.351465,-0.904529,41.781192,-63.485874,278.137368,
+ 0.241453,-0.351465,-0.904529,30.73359,-77.949002,280.808153,
+ 0.241453,-0.351465,-0.904529,37.200183,-63.545806,276.937811,
+ 0.009118,-0.297119,-0.954797,46.884555,-65.362634,278.451023,
+ 0.009118,-0.297119,-0.954797,40.322133,-75.417552,281.5173,
+ 0.009118,-0.297119,-0.954797,36.859756,-74.75343,281.277571,
+ -0.034166,-0.254431,-0.966487,41.781192,-63.485874,278.137368,
+ -0.034166,-0.254431,-0.966487,46.884555,-65.362634,278.451023,
+ -0.034166,-0.254431,-0.966487,36.859756,-74.75343,281.277571,
+ 0.106815,-0.302142,-0.94726,40.322133,-75.417552,281.5173,
+ 0.106815,-0.302142,-0.94726,38.333114,-84.022841,284.037798,
+ 0.106815,-0.302142,-0.94726,34.636788,-83.125379,283.334736,
+ 0.020396,-0.243677,-0.969642,36.859756,-74.75343,281.277571,
+ 0.020396,-0.243677,-0.969642,40.322133,-75.417552,281.5173,
+ 0.020396,-0.243677,-0.969642,34.636788,-83.125379,283.334736,
+ 0.639014,-0.3393,-0.690316,36.859756,-74.75343,281.277571,
+ 0.639014,-0.3393,-0.690316,34.636788,-83.125379,283.334736,
+ 0.639014,-0.3393,-0.690316,31.805677,-84.777621,281.526122,
+ 0.120193,-0.085124,-0.989094,36.859756,-74.75343,281.277571,
+ 0.120193,-0.085124,-0.989094,31.805677,-84.777621,281.526122,
+ 0.120193,-0.085124,-0.989094,30.73359,-77.949002,280.808153,
+ 0.174533,-0.70845,-0.68384,34.636788,-83.125379,283.334736,
+ 0.174533,-0.70845,-0.68384,32.513607,-90.371698,290.299952,
+ 0.174533,-0.70845,-0.68384,28.928323,-90.852069,289.882556,
+ 0.619335,-0.720975,-0.310836,34.636788,-83.125379,283.334736,
+ 0.619335,-0.720975,-0.310836,28.928323,-90.852069,289.882556,
+ 0.619335,-0.720975,-0.310836,31.805677,-84.777621,281.526122,
+ 0.039687,-0.719879,-0.692964,38.333114,-84.022841,284.037798,
+ 0.039687,-0.719879,-0.692964,35.757247,-91.57308,291.733761,
+ 0.039687,-0.719879,-0.692964,32.513607,-90.371698,290.299952,
+ -0.029218,-0.688226,-0.724908,34.636788,-83.125379,283.334736,
+ -0.029218,-0.688226,-0.724908,38.333114,-84.022841,284.037798,
+ -0.029218,-0.688226,-0.724908,32.513607,-90.371698,290.299952,
+ -0.499028,-0.408527,-0.764249,31.949879,-90.152048,293.460234,
+ -0.499028,-0.408527,-0.764249,35.757247,-91.57308,291.733761,
+ -0.499028,-0.408527,-0.764249,35.773979,-96.666708,294.445617,
+ -0.348481,-0.937311,0.002984,35.757247,-91.57308,291.733761,
+ -0.348481,-0.937311,0.002984,31.949879,-90.152048,293.460234,
+ -0.348481,-0.937311,0.002984,32.513607,-90.371698,290.299952,
+ -0.089052,-0.994603,0.053243,32.513607,-90.371698,290.299952,
+ -0.089052,-0.994603,0.053243,31.949879,-90.152048,293.460234,
+ -0.089052,-0.994603,0.053243,28.273937,-89.845086,293.046185,
+ 0.08931,-0.943598,0.318821,32.513607,-90.371698,290.299952,
+ 0.08931,-0.943598,0.318821,28.273937,-89.845086,293.046185,
+ 0.08931,-0.943598,0.318821,28.928323,-90.852069,289.882556,
+ 0.075368,-0.915168,-0.395963,59.38419,-134.000508,264.143049,
+ 0.075368,-0.915168,-0.395963,53.667784,-136.958786,269.89228,
+ 0.075368,-0.915168,-0.395963,48.720275,-134.574276,263.439378,
+ 0.218657,-0.938927,-0.265718,61.25523,-135.547489,271.149031,
+ 0.218657,-0.938927,-0.265718,53.667784,-136.958786,269.89228,
+ 0.218657,-0.938927,-0.265718,59.38419,-134.000508,264.143049,
+ 0.815373,-0.552721,-0.172239,69.933047,-124.016475,263.016202,
+ 0.815373,-0.552721,-0.172239,67.16926,-130.709106,271.409447,
+ 0.815373,-0.552721,-0.172239,66.47143,-129.334924,263.696143,
+ 0.799063,-0.569979,-0.19137,69.933047,-124.016475,263.016202,
+ 0.799063,-0.569979,-0.19137,70.969904,-125.142105,270.69817,
+ 0.799063,-0.569979,-0.19137,67.16926,-130.709106,271.409447,
+ -0.741783,-0.036902,0.669624,77.619828,-92.908016,265.802897,
+ -0.741783,-0.036902,0.669624,79.341695,-92.503702,267.732591,
+ -0.741783,-0.036902,0.669624,79.475255,-85.030736,268.292364,
+ -0.785322,-0.010646,0.618996,77.619828,-92.908016,265.802897,
+ -0.785322,-0.010646,0.618996,79.475255,-85.030736,268.292364,
+ -0.785322,-0.010646,0.618996,77.890329,-84.524811,266.290264,
+ -0.679927,0.083918,0.728462,83.329808,-92.866034,274.423397,
+ -0.679927,0.083918,0.728462,81.400652,-97.774693,273.188246,
+ -0.679927,0.083918,0.728462,82.270043,-97.303754,273.945461,
+ -0.744295,0.127561,0.655556,81.400652,-97.774693,273.188246,
+ -0.744295,0.127561,0.655556,83.329808,-92.866034,274.423397,
+ -0.744295,0.127561,0.655556,82.509376,-92.784501,273.476042,
+ -0.752794,0.050702,0.656301,82.509376,-92.784501,273.476042,
+ -0.752794,0.050702,0.656301,83.329808,-92.866034,274.423397,
+ -0.752794,0.050702,0.656301,84.270865,-88.470905,275.163271,
+ -0.659618,-0.024467,0.751203,84.270865,-88.470905,275.163271,
+ -0.659618,-0.024467,0.751203,83.248063,-88.516538,274.263679,
+ -0.659618,-0.024467,0.751203,82.509376,-92.784501,273.476042,
+ 0.961665,-0.274149,-0.006591,82.286288,-97.204577,272.190695,
+ 0.961665,-0.274149,-0.006591,83.472854,-93.057391,272.817701,
+ 0.961665,-0.274149,-0.006591,82.270043,-97.303754,273.945461,
+ 0.963367,-0.242415,0.114713,83.472854,-93.057391,272.817701,
+ 0.963367,-0.242415,0.114713,83.329808,-92.866034,274.423397,
+ 0.963367,-0.242415,0.114713,82.270043,-97.303754,273.945461,
+ 0.967751,-0.225122,0.113042,83.472854,-93.057391,272.817701,
+ 0.967751,-0.225122,0.113042,84.327694,-88.822892,273.932379,
+ 0.967751,-0.225122,0.113042,83.329808,-92.866034,274.423397,
+ 0.968063,-0.225662,0.109225,84.327694,-88.822892,273.932379,
+ 0.968063,-0.225662,0.109225,84.270865,-88.470905,275.163271,
+ 0.968063,-0.225662,0.109225,83.329808,-92.866034,274.423397,
+ -0.747921,0.167172,-0.642392,77.719915,-91.976482,264.549492,
+ -0.747921,0.167172,-0.642392,77.890329,-84.524811,266.290264,
+ -0.747921,0.167172,-0.642392,78.600898,-84.930038,265.357512,
+ -0.997946,0.035308,-0.053447,77.719915,-91.976482,264.549492,
+ -0.997946,0.035308,-0.053447,77.619828,-92.908016,265.802897,
+ -0.997946,0.035308,-0.053447,77.890329,-84.524811,266.290264,
+ -0.995792,-0.014717,-0.090454,77.853901,-100.732058,264.498991,
+ -0.995792,-0.014717,-0.090454,77.619828,-92.908016,265.802897,
+ -0.995792,-0.014717,-0.090454,77.719915,-91.976482,264.549492,
+ -0.727029,0.091651,-0.680463,77.853901,-100.732058,264.498991,
+ -0.727029,0.091651,-0.680463,77.047378,-100.575078,265.38185,
+ -0.727029,0.091651,-0.680463,77.619828,-92.908016,265.802897,
+ 0.75172,0.054253,-0.657247,78.600898,-84.930038,265.357512,
+ 0.75172,0.054253,-0.657247,79.876053,-85.549134,266.764854,
+ 0.75172,0.054253,-0.657247,79.838374,-93.304725,266.081566,
+ 0.593342,0.018098,-0.804747,78.600898,-84.930038,265.357512,
+ 0.593342,0.018098,-0.804747,79.838374,-93.304725,266.081566,
+ 0.593342,0.018098,-0.804747,77.719915,-91.976482,264.549492,
+ 0.57334,-0.029977,-0.818769,77.719915,-91.976482,264.549492,
+ 0.57334,-0.029977,-0.818769,79.838374,-93.304725,266.081566,
+ 0.57334,-0.029977,-0.818769,79.375199,-99.811779,265.995471,
+ 0.696627,0.014798,-0.717281,77.719915,-91.976482,264.549492,
+ 0.696627,0.014798,-0.717281,79.375199,-99.811779,265.995471,
+ 0.696627,0.014798,-0.717281,77.853901,-100.732058,264.498991,
+ 0.654872,-0.015578,-0.755579,79.876053,-85.549134,266.764854,
+ 0.654872,-0.015578,-0.755579,82.869243,-87.520508,269.399741,
+ 0.654872,-0.015578,-0.755579,82.147258,-92.831048,268.883472,
+ 0.766274,0.052694,-0.640349,79.838374,-93.304725,266.081566,
+ 0.766274,0.052694,-0.640349,79.876053,-85.549134,266.764854,
+ 0.766274,0.052694,-0.640349,82.147258,-92.831048,268.883472,
+ 0.776016,-0.120453,-0.619105,79.838374,-93.304725,266.081566,
+ 0.776016,-0.120453,-0.619105,82.147258,-92.831048,268.883472,
+ 0.776016,-0.120453,-0.619105,81.246574,-97.620451,268.686335,
+ 0.839412,-0.052593,-0.540944,79.375199,-99.811779,265.995471,
+ 0.839412,-0.052593,-0.540944,79.838374,-93.304725,266.081566,
+ 0.839412,-0.052593,-0.540944,81.246574,-97.620451,268.686335,
+ 0.950337,-0.167933,-0.262028,81.246574,-97.620451,268.686335,
+ 0.950337,-0.167933,-0.262028,82.147258,-92.831048,268.883472,
+ 0.950337,-0.167933,-0.262028,82.286288,-97.204577,272.190695,
+ 0.921707,-0.214891,-0.322922,82.147258,-92.831048,268.883472,
+ 0.921707,-0.214891,-0.322922,83.472854,-93.057391,272.817701,
+ 0.921707,-0.214891,-0.322922,82.286288,-97.204577,272.190695,
+ 0.941524,-0.096622,-0.322795,82.147258,-92.831048,268.883472,
+ 0.941524,-0.096622,-0.322795,82.869243,-87.520508,269.399741,
+ 0.941524,-0.096622,-0.322795,83.472854,-93.057391,272.817701,
+ 0.938017,-0.102183,-0.331183,82.869243,-87.520508,269.399741,
+ 0.938017,-0.102183,-0.331183,84.327694,-88.822892,273.932379,
+ 0.938017,-0.102183,-0.331183,83.472854,-93.057391,272.817701,
+ -0.32205,0.20057,-0.925232,78.514402,-72.952422,268.581682,
+ -0.32205,0.20057,-0.925232,77.890329,-84.524811,266.290264,
+ -0.32205,0.20057,-0.925232,76.729923,-73.255125,269.137195,
+ -0.74779,0.167536,-0.64245,78.600898,-84.930038,265.357512,
+ -0.74779,0.167536,-0.64245,77.890329,-84.524811,266.290264,
+ -0.74779,0.167536,-0.64245,78.514402,-72.952422,268.581682,
+ -0.284982,0.02041,-0.958316,75.395851,-70.043733,269.571019,
+ -0.284982,0.02041,-0.958316,78.514402,-72.952422,268.581682,
+ -0.284982,0.02041,-0.958316,74.241137,-71.939659,269.874026,
+ -0.293941,-0.020862,-0.955596,74.241137,-71.939659,269.874026,
+ -0.293941,-0.020862,-0.955596,78.514402,-72.952422,268.581682,
+ -0.293941,-0.020862,-0.955596,76.729923,-73.255125,269.137195,
+ -0.300907,0.144309,-0.942672,71.824379,-66.858809,271.198619,
+ -0.300907,0.144309,-0.942672,75.395851,-70.043733,269.571019,
+ -0.300907,0.144309,-0.942672,70.307851,-68.955827,271.361683,
+ -0.322943,0.045607,-0.945319,70.307851,-68.955827,271.361683,
+ -0.322943,0.045607,-0.945319,75.395851,-70.043733,269.571019,
+ -0.322943,0.045607,-0.945319,74.241137,-71.939659,269.874026,
+ -0.131824,0.031452,-0.990774,65.827083,-63.240669,272.139281,
+ -0.131824,0.031452,-0.990774,70.307851,-68.955827,271.361683,
+ -0.131824,0.031452,-0.990774,64.381013,-68.62118,272.160881,
+ -0.140416,0.024581,-0.989787,65.827083,-63.240669,272.139281,
+ -0.140416,0.024581,-0.989787,71.824379,-66.858809,271.198619,
+ -0.140416,0.024581,-0.989787,70.307851,-68.955827,271.361683,
+ 0.291813,0.250581,-0.923068,78.514402,-72.952422,268.581682,
+ 0.291813,0.250581,-0.923068,80.826583,-73.858706,269.066615,
+ 0.291813,0.250581,-0.923068,78.600898,-84.930038,265.357512,
+ 0.753935,0.067365,-0.653486,78.600898,-84.930038,265.357512,
+ 0.753935,0.067365,-0.653486,80.826583,-73.858706,269.066615,
+ 0.753935,0.067365,-0.653486,79.876053,-85.549134,266.764854,
+ -0.111303,0.210979,-0.971133,79.841949,-68.2625,269.448417,
+ -0.111303,0.210979,-0.971133,78.514402,-72.952422,268.581682,
+ -0.111303,0.210979,-0.971133,75.395851,-70.043733,269.571019,
+ 0.24471,0.108789,-0.963474,79.841949,-68.2625,269.448417,
+ 0.24471,0.108789,-0.963474,80.826583,-73.858706,269.066615,
+ 0.24471,0.108789,-0.963474,78.514402,-72.952422,268.581682,
+ -0.336939,0.100566,-0.93614,77.30258,-63.094641,269.631255,
+ -0.336939,0.100566,-0.93614,75.395851,-70.043733,269.571019,
+ -0.336939,0.100566,-0.93614,71.824379,-66.858809,271.198619,
+ -0.034856,0.018225,-0.999226,77.30258,-63.094641,269.631255,
+ -0.034856,0.018225,-0.999226,79.841949,-68.2625,269.448417,
+ -0.034856,0.018225,-0.999226,75.395851,-70.043733,269.571019,
+ -0.203826,0.356316,-0.911863,70.335292,-55.874485,274.009956,
+ -0.203826,0.356316,-0.911863,77.30258,-63.094641,269.631255,
+ -0.203826,0.356316,-0.911863,65.827083,-63.240669,272.139281,
+ -0.211316,-0.097421,-0.972551,77.30258,-63.094641,269.631255,
+ -0.211316,-0.097421,-0.972551,71.824379,-66.858809,271.198619,
+ -0.211316,-0.097421,-0.972551,65.827083,-63.240669,272.139281,
+ -0.057711,0.425992,-0.902884,63.510993,-56.186315,275.615652,
+ -0.057711,0.425992,-0.902884,65.827083,-63.240669,272.139281,
+ -0.057711,0.425992,-0.902884,59.469221,-61.715592,273.265215,
+ -0.228825,0.368829,-0.900891,70.335292,-55.874485,274.009956,
+ -0.228825,0.368829,-0.900891,65.827083,-63.240669,272.139281,
+ -0.228825,0.368829,-0.900891,63.510993,-56.186315,275.615652,
+ -0.044715,0.126665,-0.990937,59.469221,-61.715592,273.265215,
+ -0.044715,0.126665,-0.990937,64.381013,-68.62118,272.160881,
+ -0.044715,0.126665,-0.990937,62.087801,-67.302976,272.432857,
+ -0.164846,0.040348,-0.985494,59.469221,-61.715592,273.265215,
+ -0.164846,0.040348,-0.985494,65.827083,-63.240669,272.139281,
+ -0.164846,0.040348,-0.985494,64.381013,-68.62118,272.160881,
+ -0.315387,-0.723699,-0.613833,64.381013,-68.62118,272.160881,
+ -0.315387,-0.723699,-0.613833,62.540122,-69.192209,273.779963,
+ -0.315387,-0.723699,-0.613833,61.030713,-67.956146,273.098196,
+ 0.598182,0.087404,-0.796579,23.175746,20.341922,244.841232,
+ 0.598182,0.087404,-0.796579,32.266881,8.102673,250.32518,
+ 0.598182,0.087404,-0.796579,18.217802,12.897552,240.301293,
+ 0.465792,0.435018,-0.770582,11.011944,26.396594,243.566228,
+ 0.465792,0.435018,-0.770582,18.217802,12.897552,240.301293,
+ 0.465792,0.435018,-0.770582,8.423604,17.853367,237.178734,
+ 0.273389,0.361529,-0.891378,11.011944,26.396594,243.566228,
+ 0.273389,0.361529,-0.891378,23.175746,20.341922,244.841232,
+ 0.273389,0.361529,-0.891378,18.217802,12.897552,240.301293,
+ 0.049794,0.58834,-0.807079,11.011944,26.396594,243.566228,
+ 0.049794,0.58834,-0.807079,8.423604,17.853367,237.178734,
+ 0.049794,0.58834,-0.807079,0.020624,22.554241,240.087119,
+ 0.297798,0.417491,-0.858497,11.309172,35.146694,247.924546,
+ 0.297798,0.417491,-0.858497,23.175746,20.341922,244.841232,
+ 0.297798,0.417491,-0.858497,11.011944,26.396594,243.566228,
+ -0.263913,-0.010667,-0.964487,11.309172,35.146694,247.924546,
+ -0.263913,-0.010667,-0.964487,27.604947,31.597917,243.504775,
+ -0.263913,-0.010667,-0.964487,23.175746,20.341922,244.841232,
+ -0.244533,0.080569,-0.966288,11.977248,55.136666,249.422242,
+ -0.244533,0.080569,-0.966288,27.604947,31.597917,243.504775,
+ -0.244533,0.080569,-0.966288,11.309172,35.146694,247.924546,
+ -0.113204,0.170897,-0.978764,11.977248,55.136666,249.422242,
+ -0.113204,0.170897,-0.978764,28.684335,51.227992,246.807434,
+ -0.113204,0.170897,-0.978764,27.604947,31.597917,243.504775,
+ -0.016051,0.138675,-0.990208,0.020624,60.987508,251.726437,
+ -0.016051,0.138675,-0.990208,11.309172,35.146694,247.924546,
+ -0.016051,0.138675,-0.990208,0.020624,38.134785,248.525997,
+ -0.151288,0.07888,-0.985337,0.020624,60.987508,251.726437,
+ -0.151288,0.07888,-0.985337,11.977248,55.136666,249.422242,
+ -0.151288,0.07888,-0.985337,11.309172,35.146694,247.924546,
+ 0.111145,0.473307,-0.873858,0.020624,38.134785,248.525997,
+ 0.111145,0.473307,-0.873858,11.011944,26.396594,243.566228,
+ 0.111145,0.473307,-0.873858,0.020624,22.554241,240.087119,
+ 0.069602,0.442867,-0.893882,0.020624,38.134785,248.525997,
+ 0.069602,0.442867,-0.893882,11.309172,35.146694,247.924546,
+ 0.069602,0.442867,-0.893882,11.011944,26.396594,243.566228,
+ 0.612317,0.187659,-0.768018,51.108284,50.166249,251.720657,
+ 0.612317,0.187659,-0.768018,61.414553,28.215247,254.573977,
+ 0.612317,0.187659,-0.768018,52.060081,31.67519,247.961357,
+ 0.441213,0.091108,-0.892766,51.108284,50.166249,251.720657,
+ 0.441213,0.091108,-0.892766,60.630962,39.403097,255.328453,
+ 0.441213,0.091108,-0.892766,61.414553,28.215247,254.573977,
+ 0.532842,0.282418,-0.797696,41.486399,51.448554,247.898991,
+ 0.532842,0.282418,-0.797696,52.060081,31.67519,247.961357,
+ 0.532842,0.282418,-0.797696,43.781467,37.200512,244.387634,
+ 0.384692,0.202871,-0.900475,41.486399,51.448554,247.898991,
+ 0.384692,0.202871,-0.900475,51.108284,50.166249,251.720657,
+ 0.384692,0.202871,-0.900475,52.060081,31.67519,247.961357,
+ 0.05318,-0.932927,-0.356116,4.228655,-149.976849,316.441644,
+ 0.05318,-0.932927,-0.356116,0.020624,-151.984425,321.072546,
+ 0.05318,-0.932927,-0.356116,0.020624,-150.167597,316.312957,
+ 0.04599,-0.931099,-0.361857,7.004702,-152.189472,322.487798,
+ 0.04599,-0.931099,-0.361857,0.020624,-151.984425,321.072546,
+ 0.04599,-0.931099,-0.361857,4.228655,-149.976849,316.441644,
+ 0.016618,-0.91758,0.397204,3.466269,-151.518658,313.047717,
+ 0.016618,-0.91758,0.397204,0.020624,-150.167597,316.312957,
+ 0.016618,-0.91758,0.397204,0.020624,-151.140811,314.064739,
+ 0.028885,-0.912503,0.408048,4.228655,-149.976849,316.441644,
+ 0.028885,-0.912503,0.408048,0.020624,-150.167597,316.312957,
+ 0.028885,-0.912503,0.408048,3.466269,-151.518658,313.047717,
+ 0.050801,-0.795795,0.603431,3.445886,-154.336992,309.561306,
+ 0.050801,-0.795795,0.603431,0.020624,-151.140811,314.064739,
+ 0.050801,-0.795795,0.603431,0.020624,-154.312045,309.882567,
+ 0.099642,-0.774095,0.625178,3.466269,-151.518658,313.047717,
+ 0.099642,-0.774095,0.625178,0.020624,-151.140811,314.064739,
+ 0.099642,-0.774095,0.625178,3.445886,-154.336992,309.561306,
+ 0.150416,-0.562566,0.812954,0.020624,-154.312045,309.882567,
+ 0.150416,-0.562566,0.812954,0.020624,-159.059162,306.597553,
+ 0.150416,-0.562566,0.812954,3.640285,-158.481744,306.327402,
+ 0.069461,-0.611637,0.788083,0.020624,-154.312045,309.882567,
+ 0.069461,-0.611637,0.788083,3.640285,-158.481744,306.327402,
+ 0.069461,-0.611637,0.788083,3.445886,-154.336992,309.561306,
+ 0.170251,-0.582729,0.794633,0.020624,-159.059162,306.597553,
+ 0.170251,-0.582729,0.794633,0.020624,-163.754043,303.154646,
+ 0.170251,-0.582729,0.794633,4.421837,-163.723103,302.234368,
+ 0.153674,-0.593831,0.789778,3.640285,-158.481744,306.327402,
+ 0.153674,-0.593831,0.789778,0.020624,-159.059162,306.597553,
+ 0.153674,-0.593831,0.789778,4.421837,-163.723103,302.234368,
+ 0.670602,-0.454841,0.586014,9.084075,-162.756096,297.649707,
+ 0.670602,-0.454841,0.586014,8.977901,-157.498491,301.851958,
+ 0.670602,-0.454841,0.586014,4.421837,-163.723103,302.234368,
+ 0.627477,-0.418957,0.656313,8.977901,-157.498491,301.851958,
+ 0.627477,-0.418957,0.656313,3.640285,-158.481744,306.327402,
+ 0.627477,-0.418957,0.656313,4.421837,-163.723103,302.234368,
+ 0.629089,-0.410526,0.660087,8.880549,-152.822563,304.852826,
+ 0.629089,-0.410526,0.660087,3.640285,-158.481744,306.327402,
+ 0.629089,-0.410526,0.660087,8.977901,-157.498491,301.851958,
+ 0.653801,-0.446165,0.611132,8.880549,-152.822563,304.852826,
+ 0.653801,-0.446165,0.611132,3.445886,-154.336992,309.561306,
+ 0.653801,-0.446165,0.611132,3.640285,-158.481744,306.327402,
+ 0.658094,-0.421159,0.624129,8.880549,-152.822563,304.852826,
+ 0.658094,-0.421159,0.624129,8.753383,-148.745957,307.737786,
+ 0.658094,-0.421159,0.624129,3.445886,-154.336992,309.561306,
+ 0.719855,-0.541859,0.433818,8.753383,-148.745957,307.737786,
+ 0.719855,-0.541859,0.433818,3.466269,-151.518658,313.047717,
+ 0.719855,-0.541859,0.433818,3.445886,-154.336992,309.561306,
+ 0.579427,-0.799247,0.159592,10.001615,-146.834212,312.78,
+ 0.579427,-0.799247,0.159592,3.466269,-151.518658,313.047717,
+ 0.579427,-0.799247,0.159592,8.753383,-148.745957,307.737786,
+ 0.573321,-0.786783,0.228637,10.001615,-146.834212,312.78,
+ 0.573321,-0.786783,0.228637,4.228655,-149.976849,316.441644,
+ 0.573321,-0.786783,0.228637,3.466269,-151.518658,313.047717,
+ 0.766735,-0.585412,0.263459,13.590854,-145.025598,301.926188,
+ 0.766735,-0.585412,0.263459,14.767289,-141.627412,306.053296,
+ 0.766735,-0.585412,0.263459,8.753383,-148.745957,307.737786,
+ 0.768836,-0.637383,0.051332,14.767289,-141.627412,306.053296,
+ 0.768836,-0.637383,0.051332,10.001615,-146.834212,312.78,
+ 0.768836,-0.637383,0.051332,8.753383,-148.745957,307.737786,
+ 0.85896,-0.397985,0.322174,13.160377,-148.788549,298.425479,
+ 0.85896,-0.397985,0.322174,13.590854,-145.025598,301.926188,
+ 0.85896,-0.397985,0.322174,8.880549,-152.822563,304.852826,
+ 0.818818,-0.314374,0.48032,13.590854,-145.025598,301.926188,
+ 0.818818,-0.314374,0.48032,8.753383,-148.745957,307.737786,
+ 0.818818,-0.314374,0.48032,8.880549,-152.822563,304.852826,
+ 0.895275,-0.300521,0.328892,13.781907,-151.892854,293.8971,
+ 0.895275,-0.300521,0.328892,13.160377,-148.788549,298.425479,
+ 0.895275,-0.300521,0.328892,8.977901,-157.498491,301.851958,
+ 0.870972,-0.252402,0.421546,13.160377,-148.788549,298.425479,
+ 0.870972,-0.252402,0.421546,8.880549,-152.822563,304.852826,
+ 0.870972,-0.252402,0.421546,8.977901,-157.498491,301.851958,
+ 0.917567,-0.311428,0.24715,13.10227,-157.489973,289.367504,
+ 0.917567,-0.311428,0.24715,13.781907,-151.892854,293.8971,
+ 0.917567,-0.311428,0.24715,9.084075,-162.756096,297.649707,
+ 0.896621,-0.265271,0.354545,13.781907,-151.892854,293.8971,
+ 0.896621,-0.265271,0.354545,8.977901,-157.498491,301.851958,
+ 0.896621,-0.265271,0.354545,9.084075,-162.756096,297.649707,
+ 0.238747,-0.842464,-0.482963,14.811706,-149.682055,320.125496,
+ 0.238747,-0.842464,-0.482963,10.001615,-146.834212,312.78,
+ 0.238747,-0.842464,-0.482963,14.767289,-141.627412,306.053296,
+ 0.794142,-0.526359,-0.303784,14.767289,-141.627412,306.053296,
+ 0.794142,-0.526359,-0.303784,17.61057,-142.804152,315.525016,
+ 0.794142,-0.526359,-0.303784,14.811706,-149.682055,320.125496,
+ 0.21325,-0.881819,-0.420619,10.001615,-146.834212,312.78,
+ 0.21325,-0.881819,-0.420619,7.004702,-152.189472,322.487798,
+ 0.21325,-0.881819,-0.420619,4.228655,-149.976849,316.441644,
+ 0.150505,-0.884551,-0.441496,14.811706,-149.682055,320.125496,
+ 0.150505,-0.884551,-0.441496,7.004702,-152.189472,322.487798,
+ 0.150505,-0.884551,-0.441496,10.001615,-146.834212,312.78,
+ 0.845005,-0.496744,-0.198022,75.804707,-16.119059,265.471901,
+ 0.845005,-0.496744,-0.198022,78.895495,-12.224988,268.892599,
+ 0.845005,-0.496744,-0.198022,75.573101,-20.959268,276.625373,
+ 0.07625,-0.67705,-0.731977,78.895495,-12.224988,268.892599,
+ 0.07625,-0.67705,-0.731977,80.019154,-20.612148,276.767445,
+ 0.07625,-0.67705,-0.731977,75.573101,-20.959268,276.625373,
+ 0.953158,-0.282356,-0.10847,80.393271,-2.853662,257.659724,
+ 0.953158,-0.282356,-0.10847,82.603594,2.972538,261.916431,
+ 0.953158,-0.282356,-0.10847,78.895495,-12.224988,268.892599,
+ 0.775341,-0.40977,-0.480557,82.603594,2.972538,261.916431,
+ 0.775341,-0.40977,-0.480557,82.871038,-8.883084,272.457195,
+ 0.775341,-0.40977,-0.480557,78.895495,-12.224988,268.892599,
+ 0.912685,-0.389161,-0.124737,77.383534,-8.556955,253.43131,
+ 0.912685,-0.389161,-0.124737,80.393271,-2.853662,257.659724,
+ 0.912685,-0.389161,-0.124737,75.804707,-16.119059,265.471901,
+ 0.854537,-0.449172,-0.260791,80.393271,-2.853662,257.659724,
+ 0.854537,-0.449172,-0.260791,78.895495,-12.224988,268.892599,
+ 0.854537,-0.449172,-0.260791,75.804707,-16.119059,265.471901,
+ 0.997051,0.062316,0.044792,82.603594,2.972538,261.916431,
+ 0.997051,0.062316,0.044792,81.959764,9.282759,267.468829,
+ 0.997051,0.062316,0.044792,82.871038,-8.883084,272.457195,
+ 0.909833,-0.066825,-0.409559,81.959764,9.282759,267.468829,
+ 0.909833,-0.066825,-0.409559,85.130177,-4.794917,276.80882,
+ 0.909833,-0.066825,-0.409559,82.871038,-8.883084,272.457195,
+ 0.982475,0.138502,-0.12474,81.959764,9.282759,267.468829,
+ 0.982475,0.138502,-0.12474,81.886781,16.045666,274.403014,
+ 0.982475,0.138502,-0.12474,85.130177,-4.794917,276.80882,
+ 0.972383,0.128868,-0.194589,81.886781,16.045666,274.403014,
+ 0.972383,0.128868,-0.194589,86.048965,-1.755108,283.413226,
+ 0.972383,0.128868,-0.194589,85.130177,-4.794917,276.80882,
+ 0.924339,0.2803,-0.258901,77.161051,18.401883,260.209124,
+ 0.924339,0.2803,-0.258901,75.537236,29.979444,266.946172,
+ 0.924339,0.2803,-0.258901,81.959764,9.282759,267.468829,
+ 0.923253,0.279854,-0.263224,75.537236,29.979444,266.946172,
+ 0.923253,0.279854,-0.263224,81.886781,16.045666,274.403014,
+ 0.923253,0.279854,-0.263224,81.959764,9.282759,267.468829,
+ 0.902105,0.282074,-0.326559,77.643712,11.587562,255.656407,
+ 0.902105,0.282074,-0.326559,77.161051,18.401883,260.209124,
+ 0.902105,0.282074,-0.326559,82.603594,2.972538,261.916431,
+ 0.924694,0.300279,-0.23404,77.161051,18.401883,260.209124,
+ 0.924694,0.300279,-0.23404,81.959764,9.282759,267.468829,
+ 0.924694,0.300279,-0.23404,82.603594,2.972538,261.916431,
+ 0.947558,-0.012837,-0.319326,75.266677,-0.350504,246.819907,
+ 0.947558,-0.012837,-0.319326,76.799761,5.685002,251.126507,
+ 0.947558,-0.012837,-0.319326,77.383534,-8.556955,253.43131,
+ 0.845108,-0.051472,-0.532112,76.799761,5.685002,251.126507,
+ 0.845108,-0.051472,-0.532112,80.393271,-2.853662,257.659724,
+ 0.845108,-0.051472,-0.532112,77.383534,-8.556955,253.43131,
+ 0.930577,0.129686,-0.342357,76.799761,5.685002,251.126507,
+ 0.930577,0.129686,-0.342357,77.643712,11.587562,255.656407,
+ 0.930577,0.129686,-0.342357,80.393271,-2.853662,257.659724,
+ 0.83349,0.082913,-0.546279,77.643712,11.587562,255.656407,
+ 0.83349,0.082913,-0.546279,82.603594,2.972538,261.916431,
+ 0.83349,0.082913,-0.546279,80.393271,-2.853662,257.659724,
+ 0.289937,0.513154,-0.807843,69.340691,13.899972,253.667693,
+ 0.289937,0.513154,-0.807843,76.799761,5.685002,251.126507,
+ 0.289937,0.513154,-0.807843,70.060973,7.258755,249.707605,
+ 0.335582,0.542851,-0.769868,69.340691,13.899972,253.667693,
+ 0.335582,0.542851,-0.769868,77.643712,11.587562,255.656407,
+ 0.335582,0.542851,-0.769868,76.799761,5.685002,251.126507,
+ 0.257731,0.491919,-0.831619,70.060973,7.258755,249.707605,
+ 0.257731,0.491919,-0.831619,75.266677,-0.350504,246.819907,
+ 0.257731,0.491919,-0.831619,69.936971,1.658593,246.356574,
+ 0.289286,0.506226,-0.812434,70.060973,7.258755,249.707605,
+ 0.289286,0.506226,-0.812434,76.799761,5.685002,251.126507,
+ 0.289286,0.506226,-0.812434,75.266677,-0.350504,246.819907,
+ 0.325186,0.454388,-0.829328,68.729322,20.968928,257.301044,
+ 0.325186,0.454388,-0.829328,77.643712,11.587562,255.656407,
+ 0.325186,0.454388,-0.829328,69.340691,13.899972,253.667693,
+ 0.415957,0.525378,-0.742266,68.729322,20.968928,257.301044,
+ 0.415957,0.525378,-0.742266,77.161051,18.401883,260.209124,
+ 0.415957,0.525378,-0.742266,77.643712,11.587562,255.656407,
+ 0.359491,0.134747,-0.923369,68.868109,32.97362,259.106919,
+ 0.359491,0.134747,-0.923369,77.161051,18.401883,260.209124,
+ 0.359491,0.134747,-0.923369,68.729322,20.968928,257.301044,
+ 0.767972,0.399175,-0.500877,68.868109,32.97362,259.106919,
+ 0.767972,0.399175,-0.500877,75.537236,29.979444,266.946172,
+ 0.767972,0.399175,-0.500877,77.161051,18.401883,260.209124,
+ 0.425384,0.090519,-0.900475,60.630962,39.403097,255.328453,
+ 0.425384,0.090519,-0.900475,68.729322,20.968928,257.301044,
+ 0.425384,0.090519,-0.900475,61.414553,28.215247,254.573977,
+ 0.49202,0.12394,-0.861717,60.630962,39.403097,255.328453,
+ 0.49202,0.12394,-0.861717,68.868109,32.97362,259.106919,
+ 0.49202,0.12394,-0.861717,68.729322,20.968928,257.301044,
+ 0.086832,0.110756,-0.990047,61.414553,28.215247,254.573977,
+ 0.086832,0.110756,-0.990047,69.340691,13.899972,253.667693,
+ 0.086832,0.110756,-0.990047,63.349085,14.920644,253.256381,
+ 0.63781,0.395004,-0.661189,61.414553,28.215247,254.573977,
+ 0.63781,0.395004,-0.661189,68.729322,20.968928,257.301044,
+ 0.63781,0.395004,-0.661189,69.340691,13.899972,253.667693,
+ -0.401372,0.289451,-0.868976,64.133557,9.801766,251.749558,
+ -0.401372,0.289451,-0.868976,69.936971,1.658593,246.356574,
+ -0.401372,0.289451,-0.868976,63.107743,3.59346,250.155423,
+ -0.07434,0.513265,-0.855005,64.133557,9.801766,251.749558,
+ -0.07434,0.513265,-0.855005,70.060973,7.258755,249.707605,
+ -0.07434,0.513265,-0.855005,69.936971,1.658593,246.356574,
+ -0.220554,0.244175,-0.944317,63.349085,14.920644,253.256381,
+ -0.220554,0.244175,-0.944317,70.060973,7.258755,249.707605,
+ -0.220554,0.244175,-0.944317,64.133557,9.801766,251.749558,
+ 0.146136,0.518296,-0.842623,63.349085,14.920644,253.256381,
+ 0.146136,0.518296,-0.842623,69.340691,13.899972,253.667693,
+ 0.146136,0.518296,-0.842623,70.060973,7.258755,249.707605,
+ 0.26283,-0.107762,-0.958805,52.093241,19.860334,247.318531,
+ 0.26283,-0.107762,-0.958805,64.133557,9.801766,251.749558,
+ 0.26283,-0.107762,-0.958805,50.726696,9.646611,248.091869,
+ 0.546872,0.312451,-0.776728,52.093241,19.860334,247.318531,
+ 0.546872,0.312451,-0.776728,63.349085,14.920644,253.256381,
+ 0.546872,0.312451,-0.776728,64.133557,9.801766,251.749558,
+ 0.482746,0.048929,-0.874393,52.060081,31.67519,247.961357,
+ 0.482746,0.048929,-0.874393,63.349085,14.920644,253.256381,
+ 0.482746,0.048929,-0.874393,52.093241,19.860334,247.318531,
+ 0.609363,0.16552,-0.775423,52.060081,31.67519,247.961357,
+ 0.609363,0.16552,-0.775423,61.414553,28.215247,254.573977,
+ 0.609363,0.16552,-0.775423,63.349085,14.920644,253.256381,
+ -0.078589,-0.388428,-0.918121,40.959787,21.846007,243.766712,
+ -0.078589,-0.388428,-0.918121,50.726696,9.646611,248.091869,
+ -0.078589,-0.388428,-0.918121,32.266881,8.102673,250.32518,
+ 0.284199,-0.110137,-0.952418,40.959787,21.846007,243.766712,
+ 0.284199,-0.110137,-0.952418,52.093241,19.860334,247.318531,
+ 0.284199,-0.110137,-0.952418,50.726696,9.646611,248.091869,
+ 0.301169,-0.01679,-0.953423,43.781467,37.200512,244.387634,
+ 0.301169,-0.01679,-0.953423,52.093241,19.860334,247.318531,
+ 0.301169,-0.01679,-0.953423,40.959787,21.846007,243.766712,
+ 0.423986,0.05039,-0.904266,43.781467,37.200512,244.387634,
+ 0.423986,0.05039,-0.904266,52.060081,31.67519,247.961357,
+ 0.423986,0.05039,-0.904266,52.093241,19.860334,247.318531,
+ 0.134014,0.157246,-0.978424,28.684335,51.227992,246.807434,
+ 0.134014,0.157246,-0.978424,40.959787,21.846007,243.766712,
+ 0.134014,0.157246,-0.978424,27.604947,31.597917,243.504775,
+ -0.104057,0.059271,-0.992804,28.684335,51.227992,246.807434,
+ -0.104057,0.059271,-0.992804,43.781467,37.200512,244.387634,
+ -0.104057,0.059271,-0.992804,40.959787,21.846007,243.766712,
+ 0.271667,-0.218192,-0.937331,27.604947,31.597917,243.504775,
+ 0.271667,-0.218192,-0.937331,32.266881,8.102673,250.32518,
+ 0.271667,-0.218192,-0.937331,23.175746,20.341922,244.841232,
+ -0.208614,-0.310597,-0.927367,27.604947,31.597917,243.504775,
+ -0.208614,-0.310597,-0.927367,40.959787,21.846007,243.766712,
+ -0.208614,-0.310597,-0.927367,32.266881,8.102673,250.32518,
+ 0.563666,-0.069174,-0.823101,18.217802,12.897552,240.301293,
+ 0.563666,-0.069174,-0.823101,32.266881,8.102673,250.32518,
+ 0.563666,-0.069174,-0.823101,22.608063,6.502757,243.845202,
+ 0.450246,-0.892792,-0.014155,8.069487,-153.135306,252.900743,
+ 0.450246,-0.892792,-0.014155,2.681978,-155.746159,246.206591,
+ 0.450246,-0.892792,-0.014155,7.799031,-153.1709,246.543063,
+ 0.867125,-0.422091,-0.26445,1.314186,-157.099044,246.373002,
+ 0.867125,-0.422091,-0.26445,3.258483,-157.564508,253.491242,
+ 0.867125,-0.422091,-0.26445,2.874552,-158.653631,253.9707,
+ 0.670257,-0.705839,-0.229231,3.258483,-157.564508,253.491242,
+ 0.670257,-0.705839,-0.229231,1.314186,-157.099044,246.373002,
+ 0.670257,-0.705839,-0.229231,2.681978,-155.746159,246.206591,
+ 0.216414,-0.973338,0.076021,5.466239,-156.612286,240.785314,
+ 0.216414,-0.973338,0.076021,1.314186,-157.099044,246.373002,
+ 0.216414,-0.973338,0.076021,3.064997,-157.170537,240.473484,
+ 0.659025,-0.612615,0.436336,5.466239,-156.612286,240.785314,
+ 0.659025,-0.612615,0.436336,2.681978,-155.746159,246.206591,
+ 0.659025,-0.612615,0.436336,1.314186,-157.099044,246.373002,
+ 0.096334,-0.95749,0.271906,6.359442,-159.343611,231.654021,
+ 0.096334,-0.95749,0.271906,3.064997,-157.170537,240.473484,
+ 0.096334,-0.95749,0.271906,3.463835,-159.402631,232.47208,
+ 0.179277,-0.937585,0.297984,6.359442,-159.343611,231.654021,
+ 0.179277,-0.937585,0.297984,5.466239,-156.612286,240.785314,
+ 0.179277,-0.937585,0.297984,3.064997,-157.170537,240.473484,
+ 0.06487,-0.967817,0.24315,3.463835,-159.402631,232.47208,
+ 0.06487,-0.967817,0.24315,0.950638,-157.546863,240.529157,
+ 0.06487,-0.967817,0.24315,1.380202,-159.476253,232.73493,
+ 0.175547,-0.945966,0.27264,3.463835,-159.402631,232.47208,
+ 0.175547,-0.945966,0.27264,3.064997,-157.170537,240.473484,
+ 0.175547,-0.945966,0.27264,0.950638,-157.546863,240.529157,
+ 0.030997,-0.972762,0.229726,1.380202,-159.476253,232.73493,
+ 0.030997,-0.972762,0.229726,0.020624,-157.612879,240.808739,
+ 0.030997,-0.972762,0.229726,0.020624,-159.534664,232.671042,
+ 0.141795,-0.959043,0.245217,1.380202,-159.476253,232.73493,
+ 0.141795,-0.959043,0.245217,0.950638,-157.546863,240.529157,
+ 0.141795,-0.959043,0.245217,0.020624,-157.612879,240.808739,
+ -0.029372,-0.994842,0.097094,1.782691,-160.210955,226.274726,
+ -0.029372,-0.994842,0.097094,0.020624,-159.534664,232.671042,
+ -0.029372,-0.994842,0.097094,0.020624,-160.183575,226.02222,
+ 0.037233,-0.992643,0.11521,1.782691,-160.210955,226.274726,
+ 0.037233,-0.992643,0.11521,1.380202,-159.476253,232.73493,
+ 0.037233,-0.992643,0.11521,0.020624,-159.534664,232.671042,
+ -0.063028,-0.992053,0.108897,4.38533,-160.403225,226.029521,
+ -0.063028,-0.992053,0.108897,1.380202,-159.476253,232.73493,
+ -0.063028,-0.992053,0.108897,1.782691,-160.210955,226.274726,
+ 0.05512,-0.985425,0.16093,4.38533,-160.403225,226.029521,
+ 0.05512,-0.985425,0.16093,3.463835,-159.402631,232.47208,
+ 0.05512,-0.985425,0.16093,1.380202,-159.476253,232.73493,
+ -0.067557,-0.987316,0.143677,6.940206,-160.600088,225.878018,
+ -0.067557,-0.987316,0.143677,3.463835,-159.402631,232.47208,
+ -0.067557,-0.987316,0.143677,4.38533,-160.403225,226.029521,
+ 0.081884,-0.972124,0.219703,6.940206,-160.600088,225.878018,
+ 0.081884,-0.972124,0.219703,6.359442,-159.343611,231.654021,
+ 0.081884,-0.972124,0.219703,3.463835,-159.402631,232.47208,
+ 0.115245,-0.969904,0.214485,13.070935,-158.424246,232.4231,
+ 0.115245,-0.969904,0.214485,6.940206,-160.600088,225.878018,
+ 0.115245,-0.969904,0.214485,12.612773,-159.843452,226.251605,
+ 0.107368,-0.969202,0.22163,13.070935,-158.424246,232.4231,
+ 0.107368,-0.969202,0.22163,6.359442,-159.343611,231.654021,
+ 0.107368,-0.969202,0.22163,6.940206,-160.600088,225.878018,
+ 0.083355,-0.922921,0.375859,13.070935,-158.424246,232.4231,
+ 0.083355,-0.922921,0.375859,10.387676,-155.043401,241.319836,
+ 0.083355,-0.922921,0.375859,6.359442,-159.343611,231.654021,
+ 0.260011,-0.91783,0.299972,10.387676,-155.043401,241.319836,
+ 0.260011,-0.91783,0.299972,5.466239,-156.612286,240.785314,
+ 0.260011,-0.91783,0.299972,6.359442,-159.343611,231.654021,
+ 0.231953,-0.873463,0.428089,10.387676,-155.043401,241.319836,
+ 0.231953,-0.873463,0.428089,7.799031,-153.1709,246.543063,
+ 0.231953,-0.873463,0.428089,5.466239,-156.612286,240.785314,
+ 0.404175,-0.847918,0.343043,7.799031,-153.1709,246.543063,
+ 0.404175,-0.847918,0.343043,2.681978,-155.746159,246.206591,
+ 0.404175,-0.847918,0.343043,5.466239,-156.612286,240.785314,
+ 0.397123,-0.894375,0.20588,18.455401,-151.052586,243.09468,
+ 0.397123,-0.894375,0.20588,16.854268,-150.364735,249.171257,
+ 0.397123,-0.894375,0.20588,10.387676,-155.043401,241.319836,
+ 0.162078,-0.900643,0.403203,16.854268,-150.364735,249.171257,
+ 0.162078,-0.900643,0.403203,7.799031,-153.1709,246.543063,
+ 0.162078,-0.900643,0.403203,10.387676,-155.043401,241.319836,
+ 0.341114,-0.845092,0.411656,20.28531,-154.891897,233.696583,
+ 0.341114,-0.845092,0.411656,18.455401,-151.052586,243.09468,
+ 0.341114,-0.845092,0.411656,13.070935,-158.424246,232.4231,
+ 0.326393,-0.846702,0.420195,18.455401,-151.052586,243.09468,
+ 0.326393,-0.846702,0.420195,10.387676,-155.043401,241.319836,
+ 0.326393,-0.846702,0.420195,13.070935,-158.424246,232.4231,
+ 0.436563,-0.888547,0.141054,22.299884,-155.030927,226.585643,
+ 0.436563,-0.888547,0.141054,20.28531,-154.891897,233.696583,
+ 0.436563,-0.888547,0.141054,12.612773,-159.843452,226.251605,
+ 0.407694,-0.896038,0.175788,20.28531,-154.891897,233.696583,
+ 0.407694,-0.896038,0.175788,13.070935,-158.424246,232.4231,
+ 0.407694,-0.896038,0.175788,12.612773,-159.843452,226.251605,
+ 0.671006,-0.715674,0.19381,29.461629,-148.313046,226.597204,
+ 0.671006,-0.715674,0.19381,26.702922,-148.8643,234.112762,
+ 0.671006,-0.715674,0.19381,22.299884,-155.030927,226.585643,
+ 0.663496,-0.720379,0.202057,26.702922,-148.8643,234.112762,
+ 0.663496,-0.720379,0.202057,20.28531,-154.891897,233.696583,
+ 0.663496,-0.720379,0.202057,22.299884,-155.030927,226.585643,
+ 0.610047,-0.677851,0.410318,26.702922,-148.8643,234.112762,
+ 0.610047,-0.677851,0.410318,21.565182,-146.909051,244.98148,
+ 0.610047,-0.677851,0.410318,20.28531,-154.891897,233.696583,
+ 0.639898,-0.659709,0.394099,21.565182,-146.909051,244.98148,
+ 0.639898,-0.659709,0.394099,18.455401,-151.052586,243.09468,
+ 0.639898,-0.659709,0.394099,20.28531,-154.891897,233.696583,
+ 0.764097,-0.632114,0.128796,18.455401,-151.052586,243.09468,
+ 0.764097,-0.632114,0.128796,21.565182,-146.909051,244.98148,
+ 0.764097,-0.632114,0.128796,21.027009,-145.62492,254.476625,
+ 0.578884,-0.779068,0.24072,21.027009,-145.62492,254.476625,
+ 0.578884,-0.779068,0.24072,16.854268,-150.364735,249.171257,
+ 0.578884,-0.779068,0.24072,18.455401,-151.052586,243.09468,
+ 0.607837,-0.763973,-0.216516,25.761652,-141.519413,253.28224,
+ 0.607837,-0.763973,-0.216516,23.733693,-145.517224,261.69526,
+ 0.607837,-0.763973,-0.216516,21.027009,-145.62492,254.476625,
+ 0.65626,-0.730497,-0.188936,28.698634,-140.65359,260.13611,
+ 0.65626,-0.730497,-0.188936,23.733693,-145.517224,261.69526,
+ 0.65626,-0.730497,-0.188936,25.761652,-141.519413,253.28224,
+ 0.691712,-0.713216,0.113391,26.826437,-141.899389,244.396761,
+ 0.691712,-0.713216,0.113391,25.761652,-141.519413,253.28224,
+ 0.691712,-0.713216,0.113391,21.565182,-146.909051,244.98148,
+ 0.668439,-0.731086,0.136759,25.761652,-141.519413,253.28224,
+ 0.668439,-0.731086,0.136759,21.027009,-145.62492,254.476625,
+ 0.668439,-0.731086,0.136759,21.565182,-146.909051,244.98148,
+ 0.762219,-0.540182,0.356688,26.702922,-148.8643,234.112762,
+ 0.762219,-0.540182,0.356688,31.526095,-141.20667,235.402977,
+ 0.762219,-0.540182,0.356688,26.826437,-141.899389,244.396761,
+ 0.649602,-0.633092,0.420964,26.702922,-148.8643,234.112762,
+ 0.649602,-0.633092,0.420964,26.826437,-141.899389,244.396761,
+ 0.649602,-0.633092,0.420964,21.565182,-146.909051,244.98148,
+ 0.855863,-0.481768,0.188141,29.461629,-148.313046,226.597204,
+ 0.855863,-0.481768,0.188141,34.485285,-139.175364,227.142982,
+ 0.855863,-0.481768,0.188141,31.526095,-141.20667,235.402977,
+ 0.798776,-0.545767,0.253172,29.461629,-148.313046,226.597204,
+ 0.798776,-0.545767,0.253172,31.526095,-141.20667,235.402977,
+ 0.798776,-0.545767,0.253172,26.702922,-148.8643,234.112762,
+ 0.520494,-0.846326,-0.113218,33.919732,-143.07552,274.941491,
+ 0.520494,-0.846326,-0.113218,24.826771,-148.839354,276.224405,
+ 0.520494,-0.846326,-0.113218,24.319629,-148.6842,272.733127,
+ 0.504776,-0.632816,-0.587149,33.919732,-143.07552,274.941491,
+ 0.504776,-0.632816,-0.587149,24.319629,-148.6842,272.733127,
+ 0.504776,-0.632816,-0.587149,30.756407,-142.474069,271.573728,
+ 0.563469,-0.757255,-0.330254,30.166516,-141.117837,265.359642,
+ 0.563469,-0.757255,-0.330254,24.319629,-148.6842,272.733127,
+ 0.563469,-0.757255,-0.330254,24.483302,-146.584443,268.19775,
+ 0.656549,-0.721547,-0.219803,30.756407,-142.474069,271.573728,
+ 0.656549,-0.721547,-0.219803,24.319629,-148.6842,272.733127,
+ 0.656549,-0.721547,-0.219803,30.166516,-141.117837,265.359642,
+ 0.36418,-0.832866,-0.416782,61.301412,-135.90617,274.458991,
+ 0.36418,-0.832866,-0.416782,54.073863,-138.473214,273.273429,
+ 0.36418,-0.832866,-0.416782,53.667784,-136.958786,269.89228,
+ 0.199105,-0.973973,-0.108322,61.301412,-135.90617,274.458991,
+ 0.199105,-0.973973,-0.108322,53.667784,-136.958786,269.89228,
+ 0.199105,-0.973973,-0.108322,61.25523,-135.547489,271.149031,
+ 0.341852,-0.933189,0.110889,58.389255,-136.19427,279.148305,
+ 0.341852,-0.933189,0.110889,53.299004,-138.208844,277.886991,
+ 0.341852,-0.933189,0.110889,54.073863,-138.473214,273.273429,
+ 0.311733,-0.940413,0.135816,61.301412,-135.90617,274.458991,
+ 0.311733,-0.940413,0.135816,58.389255,-136.19427,279.148305,
+ 0.311733,-0.940413,0.135816,54.073863,-138.473214,273.273429,
+ 0.230285,-0.960573,0.155781,53.299004,-138.208844,277.886991,
+ 0.230285,-0.960573,0.155781,45.036393,-140.226155,277.662169,
+ 0.230285,-0.960573,0.155781,45.202195,-140.649635,274.805807,
+ 0.252996,-0.962527,0.097647,54.073863,-138.473214,273.273429,
+ 0.252996,-0.962527,0.097647,53.299004,-138.208844,277.886991,
+ 0.252996,-0.962527,0.097647,45.202195,-140.649635,274.805807,
+ 0.138241,-0.881456,-0.45158,54.073863,-138.473214,273.273429,
+ 0.138241,-0.881456,-0.45158,45.202195,-140.649635,274.805807,
+ 0.138241,-0.881456,-0.45158,43.652781,-138.971534,271.055938,
+ 0.131993,-0.898641,-0.418357,54.073863,-138.473214,273.273429,
+ 0.131993,-0.898641,-0.418357,43.652781,-138.971534,271.055938,
+ 0.131993,-0.898641,-0.418357,53.667784,-136.958786,269.89228,
+ 0.199743,-0.90844,0.367205,45.202195,-140.649635,274.805807,
+ 0.199743,-0.90844,0.367205,33.750887,-141.845541,278.076218,
+ 0.199743,-0.90844,0.367205,33.919732,-143.07552,274.941491,
+ 0.180988,-0.867649,-0.463064,45.202195,-140.649635,274.805807,
+ 0.180988,-0.867649,-0.463064,33.919732,-143.07552,274.941491,
+ 0.180988,-0.867649,-0.463064,43.652781,-138.971534,271.055938,
+ 0.139524,-0.837091,0.528972,45.036393,-140.226155,277.662169,
+ 0.139524,-0.837091,0.528972,34.027427,-140.205164,280.599151,
+ 0.139524,-0.837091,0.528972,33.750887,-141.845541,278.076218,
+ 0.145868,-0.977344,0.153367,45.202195,-140.649635,274.805807,
+ 0.145868,-0.977344,0.153367,45.036393,-140.226155,277.662169,
+ 0.145868,-0.977344,0.153367,33.750887,-141.845541,278.076218,
+ 0.391501,-0.612192,0.686985,23.638167,-139.837661,286.84731,
+ 0.391501,-0.612192,0.686985,23.138022,-144.23066,283.21761,
+ 0.391501,-0.612192,0.686985,34.027427,-140.205164,280.599151,
+ 0.403222,-0.786765,0.467347,34.027427,-140.205164,280.599151,
+ 0.403222,-0.786765,0.467347,23.138022,-144.23066,283.21761,
+ 0.403222,-0.786765,0.467347,33.750887,-141.845541,278.076218,
+ 0.450157,-0.622036,0.640648,33.750887,-141.845541,278.076218,
+ 0.450157,-0.622036,0.640648,23.138022,-144.23066,283.21761,
+ 0.450157,-0.622036,0.640648,22.020302,-146.895056,281.415993,
+ 0.452404,-0.821639,0.346756,33.919732,-143.07552,274.941491,
+ 0.452404,-0.821639,0.346756,33.750887,-141.845541,278.076218,
+ 0.452404,-0.821639,0.346756,22.020302,-146.895056,281.415993,
+ 0.749935,-0.222832,0.622851,23.138022,-144.23066,283.21761,
+ 0.749935,-0.222832,0.622851,17.818659,-145.482847,289.174322,
+ 0.749935,-0.222832,0.622851,16.251904,-150.154516,289.389408,
+ 0.768366,-0.547004,0.332267,22.020302,-146.895056,281.415993,
+ 0.768366,-0.547004,0.332267,23.138022,-144.23066,283.21761,
+ 0.768366,-0.547004,0.332267,16.251904,-150.154516,289.389408,
+ 0.679113,-0.466456,0.566766,23.638167,-139.837661,286.84731,
+ 0.679113,-0.466456,0.566766,19.081495,-140.49083,291.769659,
+ 0.679113,-0.466456,0.566766,17.818659,-145.482847,289.174322,
+ 0.694235,-0.503774,0.514053,23.138022,-144.23066,283.21761,
+ 0.694235,-0.503774,0.514053,23.638167,-139.837661,286.84731,
+ 0.694235,-0.503774,0.514053,17.818659,-145.482847,289.174322,
+ 0.765503,-0.586471,0.264683,15.286296,-145.980254,294.907429,
+ 0.765503,-0.586471,0.264683,14.767289,-141.627412,306.053296,
+ 0.765503,-0.586471,0.264683,13.590854,-145.025598,301.926188,
+ 0.948347,-0.278042,0.152744,15.286296,-145.980254,294.907429,
+ 0.948347,-0.278042,0.152744,16.074846,-141.671525,297.854754,
+ 0.948347,-0.278042,0.152744,14.767289,-141.627412,306.053296,
+ 0.853944,-0.391087,0.343264,17.818659,-145.482847,289.174322,
+ 0.853944,-0.391087,0.343264,16.074846,-141.671525,297.854754,
+ 0.853944,-0.391087,0.343264,15.286296,-145.980254,294.907429,
+ 0.851905,-0.394546,0.344373,17.818659,-145.482847,289.174322,
+ 0.851905,-0.394546,0.344373,19.081495,-140.49083,291.769659,
+ 0.851905,-0.394546,0.344373,16.074846,-141.671525,297.854754,
+ 0.745135,-0.497959,0.443634,13.781907,-151.892854,293.8971,
+ 0.745135,-0.497959,0.443634,13.590854,-145.025598,301.926188,
+ 0.745135,-0.497959,0.443634,13.160377,-148.788549,298.425479,
+ 0.923869,-0.279703,0.261212,13.781907,-151.892854,293.8971,
+ 0.923869,-0.279703,0.261212,15.286296,-145.980254,294.907429,
+ 0.923869,-0.279703,0.261212,13.590854,-145.025598,301.926188,
+ 0.883423,-0.278943,0.376502,17.818659,-145.482847,289.174322,
+ 0.883423,-0.278943,0.376502,13.781907,-151.892854,293.8971,
+ 0.883423,-0.278943,0.376502,16.251904,-150.154516,289.389408,
+ 0.885035,-0.287721,0.365965,17.818659,-145.482847,289.174322,
+ 0.885035,-0.287721,0.365965,15.286296,-145.980254,294.907429,
+ 0.885035,-0.287721,0.365965,13.781907,-151.892854,293.8971,
+ 0.806307,-0.427857,0.408421,22.020302,-146.895056,281.415993,
+ 0.806307,-0.427857,0.408421,16.251904,-150.154516,289.389408,
+ 0.806307,-0.427857,0.408421,14.260148,-156.855057,286.30214,
+ 0.818938,-0.499083,0.283295,17.969859,-154.608056,279.536799,
+ 0.818938,-0.499083,0.283295,22.020302,-146.895056,281.415993,
+ 0.818938,-0.499083,0.283295,14.260148,-156.855057,286.30214,
+ 0.887916,-0.382011,0.256268,14.260148,-156.855057,286.30214,
+ 0.887916,-0.382011,0.256268,16.251904,-150.154516,289.389408,
+ 0.887916,-0.382011,0.256268,13.10227,-157.489973,289.367504,
+ 0.866716,-0.373131,0.331025,13.10227,-157.489973,289.367504,
+ 0.866716,-0.373131,0.331025,16.251904,-150.154516,289.389408,
+ 0.866716,-0.373131,0.331025,13.781907,-151.892854,293.8971,
+ 0.533862,-0.454135,0.713269,33.919732,-143.07552,274.941491,
+ 0.533862,-0.454135,0.713269,22.020302,-146.895056,281.415993,
+ 0.533862,-0.454135,0.713269,17.969859,-154.608056,279.536799,
+ 0.424483,-0.774171,-0.469545,33.919732,-143.07552,274.941491,
+ 0.424483,-0.774171,-0.469545,17.969859,-154.608056,279.536799,
+ 0.424483,-0.774171,-0.469545,24.826771,-148.839354,276.224405,
+ 0.694366,-0.719293,0.021764,24.319629,-148.6842,272.733127,
+ 0.694366,-0.719293,0.021764,17.969859,-154.608056,279.536799,
+ 0.694366,-0.719293,0.021764,19.031298,-153.713636,275.232634,
+ 0.603541,-0.787837,-0.122682,24.826771,-148.839354,276.224405,
+ 0.603541,-0.787837,-0.122682,17.969859,-154.608056,279.536799,
+ 0.603541,-0.787837,-0.122682,24.319629,-148.6842,272.733127,
+ 0.701723,-0.694303,-0.159779,19.940928,-151.052282,267.662924,
+ 0.701723,-0.694303,-0.159779,24.483302,-146.584443,268.19775,
+ 0.701723,-0.694303,-0.159779,19.031298,-153.713636,275.232634,
+ 0.563904,-0.756991,-0.330116,24.483302,-146.584443,268.19775,
+ 0.563904,-0.756991,-0.330116,24.319629,-148.6842,272.733127,
+ 0.563904,-0.756991,-0.330116,19.031298,-153.713636,275.232634,
+ 0.6879,-0.695419,-0.20781,23.733693,-145.517224,261.69526,
+ 0.6879,-0.695419,-0.20781,19.940928,-151.052282,267.662924,
+ 0.6879,-0.695419,-0.20781,19.901683,-149.308164,261.696477,
+ 0.699462,-0.687963,-0.193546,23.733693,-145.517224,261.69526,
+ 0.699462,-0.687963,-0.193546,24.483302,-146.584443,268.19775,
+ 0.699462,-0.687963,-0.193546,19.940928,-151.052282,267.662924,
+ 0.51721,-0.792326,-0.323594,21.027009,-145.62492,254.476625,
+ 0.51721,-0.792326,-0.323594,19.901683,-149.308164,261.696477,
+ 0.51721,-0.792326,-0.323594,17.759336,-149.406124,258.512161,
+ 0.681752,-0.689217,-0.245346,23.733693,-145.517224,261.69526,
+ 0.681752,-0.689217,-0.245346,19.901683,-149.308164,261.696477,
+ 0.681752,-0.689217,-0.245346,21.027009,-145.62492,254.476625,
+ 0.399383,-0.91512,0.055217,17.759336,-149.406124,258.512161,
+ 0.399383,-0.91512,0.055217,14.603008,-151.038287,254.291657,
+ 0.399383,-0.91512,0.055217,16.854268,-150.364735,249.171257,
+ 0.753654,-0.657248,-0.005574,16.854268,-150.364735,249.171257,
+ 0.753654,-0.657248,-0.005574,21.027009,-145.62492,254.476625,
+ 0.753654,-0.657248,-0.005574,17.759336,-149.406124,258.512161,
+ 0.307091,-0.951649,-0.007736,14.603008,-151.038287,254.291657,
+ 0.307091,-0.951649,-0.007736,8.069487,-153.135306,252.900743,
+ 0.307091,-0.951649,-0.007736,7.799031,-153.1709,246.543063,
+ 0.294948,-0.955505,0.003988,16.854268,-150.364735,249.171257,
+ 0.294948,-0.955505,0.003988,14.603008,-151.038287,254.291657,
+ 0.294948,-0.955505,0.003988,7.799031,-153.1709,246.543063,
+ 0.643039,-0.729532,-0.232991,8.069487,-153.135306,252.900743,
+ 0.643039,-0.729532,-0.232991,3.258483,-157.564508,253.491242,
+ 0.643039,-0.729532,-0.232991,2.681978,-155.746159,246.206591,
+ -0.170374,0.370885,-0.912917,13.753006,-122.302779,239.253544,
+ -0.170374,0.370885,-0.912917,14.360542,-127.621229,236.979467,
+ -0.170374,0.370885,-0.912917,8.263278,-128.619693,237.711735,
+ 0.969588,0.194742,0.148238,3.428545,-147.862186,253.608065,
+ 0.969588,0.194742,0.148238,2.361022,-145.657472,257.694101,
+ 0.969588,0.194742,0.148238,4.326615,-152.695702,254.083871,
+ 0.969558,0.016709,0.244292,3.428545,-147.862186,253.608065,
+ 0.969558,0.016709,0.244292,3.035183,-136.192141,254.371059,
+ 0.969558,0.016709,0.244292,2.361022,-145.657472,257.694101,
+ 0.981885,-0.058656,0.18017,3.035183,-136.192141,254.371059,
+ 0.981885,-0.058656,0.18017,1.966138,-126.468523,263.362713,
+ 0.981885,-0.058656,0.18017,2.068966,-136.133729,259.65574,
+ 0.983657,-0.006894,0.179922,3.035183,-136.192141,254.371059,
+ 0.983657,-0.006894,0.179922,2.068966,-136.133729,259.65574,
+ 0.983657,-0.006894,0.179922,2.361022,-145.657472,257.694101,
+ 0.935851,-0.043199,0.349738,5.239288,-121.781947,250.253079,
+ 0.935851,-0.043199,0.349738,2.658857,-122.438767,257.07683,
+ 0.935851,-0.043199,0.349738,3.035183,-136.192141,254.371059,
+ 0.993615,0.005013,0.112713,3.035183,-136.192141,254.371059,
+ 0.993615,0.005013,0.112713,2.658857,-122.438767,257.07683,
+ 0.993615,0.005013,0.112713,1.966138,-126.468523,263.362713,
+ 0.951224,0.201234,0.233834,2.658857,-122.438767,257.07683,
+ 0.951224,0.201234,0.233834,0.632115,-113.08965,257.275793,
+ 0.951224,0.201234,0.233834,1.966138,-126.468523,263.362713,
+ 0.979718,-0.153584,-0.128701,1.745576,-120.529455,268.932756,
+ 0.979718,-0.153584,-0.128701,3.689873,-117.104498,279.64632,
+ 0.979718,-0.153584,-0.128701,2.05558,-123.827551,275.228375,
+ 0.994254,0.062873,-0.086639,0.7103,-112.119782,263.154928,
+ 0.994254,0.062873,-0.086639,1.137127,-112.100312,268.067238,
+ 0.994254,0.062873,-0.086639,1.745576,-120.529455,268.932756,
+ 0.964217,0.042735,-0.261646,1.137127,-112.100312,268.067238,
+ 0.964217,0.042735,-0.261646,2.172098,-104.633126,273.100934,
+ 0.964217,0.042735,-0.261646,1.745576,-120.529455,268.932756,
+ 0.994877,0.086312,-0.052635,0.7103,-112.119782,263.154928,
+ 0.994877,0.086312,-0.052635,1.745576,-120.529455,268.932756,
+ 0.994877,0.086312,-0.052635,1.966138,-126.468523,263.362713,
+ 0.337364,-0.745612,-0.574673,34.738095,-8.703591,249.9449,
+ 0.337364,-0.745612,-0.574673,28.354556,-18.998847,259.555042,
+ 0.337364,-0.745612,-0.574673,24.292249,-8.708763,243.819343,
+ 0.866564,-0.156764,-0.473806,5.306217,-102.936771,277.91498,
+ 0.866564,-0.156764,-0.473806,6.471701,-109.296277,282.150695,
+ 0.866564,-0.156764,-0.473806,3.689873,-117.104498,279.64632,
+ -0.124581,0.496092,-0.859286,8.263278,-128.619693,237.711735,
+ -0.124581,0.496092,-0.859286,13.650786,-130.553343,235.814288,
+ -0.124581,0.496092,-0.859286,12.23736,-133.374415,234.390518,
+ 0.779676,0.41146,-0.472023,34.738095,-8.703591,249.9449,
+ 0.779676,0.41146,-0.472023,31.946229,-0.16371,252.777532,
+ 0.779676,0.41146,-0.472023,33.313108,1.485185,256.472641,
+ 0.460889,0.411485,-0.786296,31.946229,-0.16371,252.777532,
+ 0.460889,0.411485,-0.786296,34.738095,-8.703591,249.9449,
+ 0.460889,0.411485,-0.786296,24.292249,-8.708763,243.819343,
+ 0.779897,-0.241635,-0.577385,5.306217,-102.936771,277.91498,
+ 0.779897,-0.241635,-0.577385,9.628636,-104.098908,284.239803,
+ 0.779897,-0.241635,-0.577385,6.471701,-109.296277,282.150695,
+ 0.982411,0.022255,-0.185402,1.745576,-120.529455,268.932756,
+ 0.982411,0.022255,-0.185402,2.172098,-104.633126,273.100934,
+ 0.982411,0.022255,-0.185402,3.689873,-117.104498,279.64632,
+ 0.722658,-0.478088,-0.499197,24.292249,-8.708763,243.819343,
+ 0.722658,-0.478088,-0.499197,28.354556,-18.998847,259.555042,
+ 0.722658,-0.478088,-0.499197,19.281674,-20.402234,247.764828,
+ -0.173548,0.399686,-0.900074,14.360542,-127.621229,236.979467,
+ -0.173548,0.399686,-0.900074,13.650786,-130.553343,235.814288,
+ -0.173548,0.399686,-0.900074,8.263278,-128.619693,237.711735,
+ 0.947382,-0.124265,-0.295,32.266881,8.102673,250.32518,
+ 0.947382,-0.124265,-0.295,33.313108,1.485185,256.472641,
+ 0.947382,-0.124265,-0.295,31.946229,-0.16371,252.777532,
+ -0.064659,-0.133947,0.988877,15.355659,-103.731101,250.735883,
+ -0.064659,-0.133947,0.988877,14.550682,-116.81153,248.91145,
+ -0.064659,-0.133947,0.988877,18.273779,-112.183061,249.781835,
+ -0.576639,-0.077947,0.813272,15.355659,-103.731101,250.735883,
+ -0.576639,-0.077947,0.813272,11.295482,-105.845764,247.654395,
+ -0.576639,-0.077947,0.813272,14.550682,-116.81153,248.91145,
+ 0.891491,0.270811,0.363188,5.239288,-121.781947,250.253079,
+ 0.891491,0.270811,0.363188,0.944249,-112.04038,253.532009,
+ 0.891491,0.270811,0.363188,2.658857,-122.438767,257.07683,
+ 0.084861,0.580971,-0.809488,8.263278,-128.619693,237.711735,
+ 0.084861,0.580971,-0.809488,8.09778,-134.660067,233.359198,
+ 0.084861,0.580971,-0.809488,4.576079,-134.95486,232.778434,
+ 0.020741,0.584112,-0.811408,8.263278,-128.619693,237.711735,
+ 0.020741,0.584112,-0.811408,12.23736,-133.374415,234.390518,
+ 0.020741,0.584112,-0.811408,8.09778,-134.660067,233.359198
+};
+static const struct gllist headroom_model_skull_half_frame = {
+ GL_N3F_V3F, GL_TRIANGLES, 7752, headroom_model_skull_half_data, 0
+};
+const struct gllist *headroom_model_skull_half = &headroom_model_skull_half_frame;
+
+static const float headroom_model_teeth_lower_half_data[] = {
+ 0.006589,-0.725514,-0.688176,2.34003,-146.387306,197.546215,
+ 0.006589,-0.725514,-0.688176,3.293773,-148.445079,199.724765,
+ 0.006589,-0.725514,-0.688176,2.0282,-148.225429,199.481081,
+ 0.006427,-0.72555,-0.68814,3.293773,-148.445079,199.724765,
+ 0.006427,-0.72555,-0.68814,2.34003,-146.387306,197.546215,
+ 0.006427,-0.72555,-0.68814,3.280083,-146.55037,197.726924,
+ -0.519641,-0.576044,-0.630989,1.354039,-147.557961,199.42693,
+ -0.519641,-0.576044,-0.630989,2.34003,-146.387306,197.546215,
+ -0.519641,-0.576044,-0.630989,2.0282,-148.225429,199.481081,
+ -0.519646,-0.576039,-0.630989,2.34003,-146.387306,197.546215,
+ -0.519646,-0.576039,-0.630989,1.354039,-147.557961,199.42693,
+ -0.519646,-0.576039,-0.630989,1.832584,-145.914541,197.532525,
+ -0.911774,-0.325295,-0.250701,11.691886,-138.01992,198.983066,
+ -0.911774,-0.325295,-0.250701,12.098329,-139.83979,199.866229,
+ -0.911774,-0.325295,-0.250701,11.663289,-140.070088,201.747248,
+ -0.911841,-0.325232,-0.25054,12.098329,-139.83979,199.866229,
+ -0.911841,-0.325232,-0.25054,11.691886,-138.01992,198.983066,
+ -0.911841,-0.325232,-0.25054,12.049349,-138.26117,197.99525,
+ 0.929596,0.1319,-0.344171,15.334668,-140.532813,199.057905,
+ 0.929596,0.1319,-0.344171,15.983274,-140.988845,200.635004,
+ 0.929596,0.1319,-0.344171,15.949201,-142.225213,200.069147,
+ 0.929891,0.132658,-0.343081,15.286296,-141.394376,198.593659,
+ 0.929891,0.132658,-0.343081,15.334668,-140.532813,199.057905,
+ 0.929891,0.132658,-0.343081,15.949201,-142.225213,200.069147,
+ 0.89485,0.359998,-0.263904,15.983274,-140.988845,200.635004,
+ 0.89485,0.359998,-0.263904,14.969903,-139.857739,198.741816,
+ 0.89485,0.359998,-0.263904,15.475219,-139.220389,201.324681,
+ 0.894862,0.359936,-0.263947,14.969903,-139.857739,198.741816,
+ 0.894862,0.359936,-0.263947,15.983274,-140.988845,200.635004,
+ 0.894862,0.359936,-0.263947,15.334668,-140.532813,199.057905,
+ -0.730449,-0.629876,-0.264007,12.793178,-140.953251,200.216696,
+ -0.730449,-0.629876,-0.264007,13.532443,-142.467376,201.783755,
+ -0.730449,-0.629876,-0.264007,12.586001,-141.583908,202.294548,
+ -0.73047,-0.629862,-0.263984,13.532443,-142.467376,201.783755,
+ -0.73047,-0.629862,-0.263984,12.793178,-140.953251,200.216696,
+ -0.73047,-0.629862,-0.263984,13.493198,-141.606725,199.838849,
+ -0.616877,-0.724269,-0.308053,14.377274,-141.953541,198.883889,
+ -0.616877,-0.724269,-0.308053,13.532443,-142.467376,201.783755,
+ -0.616877,-0.724269,-0.308053,13.493198,-141.606725,199.838849,
+ -0.61701,-0.724149,-0.30807,13.532443,-142.467376,201.783755,
+ -0.61701,-0.724149,-0.30807,14.377274,-141.953541,198.883889,
+ -0.61701,-0.724149,-0.30807,14.777329,-143.076128,200.721404,
+ -0.187069,-0.337068,-0.922708,14.511437,-140.067958,198.341457,
+ -0.187069,-0.337068,-0.922708,14.522389,-140.603697,198.534944,
+ -0.187069,-0.337068,-0.922708,13.730797,-141.20454,198.91492,
+ -0.333244,-0.232179,-0.913806,14.511437,-140.067958,198.341457,
+ -0.333244,-0.232179,-0.913806,13.730797,-141.20454,198.91492,
+ -0.333244,-0.232179,-0.913806,13.280241,-140.88115,198.997061,
+ -0.244912,-0.160342,-0.956195,14.684236,-141.078287,198.311643,
+ -0.244912,-0.160342,-0.956195,14.714963,-141.486252,198.372184,
+ -0.244912,-0.160342,-0.956195,14.221815,-141.429666,198.489006,
+ 0.875818,0.326031,-0.355874,14.115337,-137.953295,198.38344,
+ 0.875818,0.326031,-0.355874,14.419257,-138.150737,198.950514,
+ 0.875818,0.326031,-0.355874,14.969903,-139.857739,198.741816,
+ 0.874791,0.32601,-0.358411,14.969903,-139.857739,198.741816,
+ 0.874791,0.32601,-0.358411,14.419257,-138.150737,198.950514,
+ 0.874791,0.32601,-0.358411,14.839999,-139.138249,199.079201,
+ -0.7674,-0.522961,-0.370957,12.61186,-139.266023,197.980039,
+ -0.7674,-0.522961,-0.370957,13.010698,-140.621038,199.065207,
+ -0.7674,-0.522961,-0.370957,12.65719,-139.952962,198.854684,
+ -0.671834,-0.573327,-0.468973,12.61186,-139.266023,197.980039,
+ -0.671834,-0.573327,-0.468973,13.280241,-140.88115,198.997061,
+ -0.671834,-0.573327,-0.468973,13.010698,-140.621038,199.065207,
+ -0.537219,0.311313,-0.783888,14.684236,-141.078287,198.311643,
+ -0.537219,0.311313,-0.783888,14.221815,-141.429666,198.489006,
+ -0.537219,0.311313,-0.783888,13.730797,-141.20454,198.91492,
+ -0.542683,0.198893,-0.81605,14.522389,-140.603697,198.534944,
+ -0.542683,0.198893,-0.81605,14.684236,-141.078287,198.311643,
+ -0.542683,0.198893,-0.81605,13.730797,-141.20454,198.91492,
+ -0.117925,0.049427,-0.991792,12.993357,-138.085024,197.704107,
+ -0.117925,0.049427,-0.991792,13.592375,-138.20641,197.626834,
+ -0.117925,0.049427,-0.991792,12.749065,-138.869315,197.694068,
+ 0.151244,-0.288301,-0.94552,13.592375,-138.20641,197.626834,
+ 0.151244,-0.288301,-0.94552,14.511437,-140.067958,198.341457,
+ 0.151244,-0.288301,-0.94552,12.749065,-138.869315,197.694068,
+ -0.742984,-0.572689,-0.346412,12.65719,-139.952962,198.854684,
+ -0.742984,-0.572689,-0.346412,12.793178,-140.953251,200.216696,
+ -0.742984,-0.572689,-0.346412,12.098329,-139.83979,199.866229,
+ -0.800518,-0.518369,-0.300774,12.65719,-139.952962,198.854684,
+ -0.800518,-0.518369,-0.300774,13.010698,-140.621038,199.065207,
+ -0.800518,-0.518369,-0.300774,12.793178,-140.953251,200.216696,
+ -0.212061,-0.627588,-0.749109,14.221815,-141.429666,198.489006,
+ -0.212061,-0.627588,-0.749109,15.126578,-141.992481,198.704397,
+ -0.212061,-0.627588,-0.749109,14.377274,-141.953541,198.883889,
+ -0.24377,-0.662824,-0.707984,14.221815,-141.429666,198.489006,
+ -0.24377,-0.662824,-0.707984,14.714963,-141.486252,198.372184,
+ -0.24377,-0.662824,-0.707984,15.126578,-141.992481,198.704397,
+ 0.385325,-0.266469,-0.88347,15.286296,-141.394376,198.593659,
+ 0.385325,-0.266469,-0.88347,15.126578,-141.992481,198.704397,
+ 0.385325,-0.266469,-0.88347,14.714963,-141.486252,198.372184,
+ 0.374422,-0.108457,-0.920894,14.684236,-141.078287,198.311643,
+ 0.374422,-0.108457,-0.920894,15.286296,-141.394376,198.593659,
+ 0.374422,-0.108457,-0.920894,14.714963,-141.486252,198.372184,
+ 0.729739,0.311553,-0.608618,13.592375,-138.20641,197.626834,
+ 0.729739,0.311553,-0.608618,13.932194,-137.319292,198.488398,
+ 0.729739,0.311553,-0.608618,14.115337,-137.953295,198.38344,
+ 0.406165,0.551811,-0.728378,12.838811,-137.294345,197.897594,
+ 0.406165,0.551811,-0.728378,13.932194,-137.319292,198.488398,
+ 0.406165,0.551811,-0.728378,13.592375,-138.20641,197.626834,
+ -0.080347,0.222082,-0.971712,12.838811,-137.294345,197.897594,
+ -0.080347,0.222082,-0.971712,13.592375,-138.20641,197.626834,
+ -0.080347,0.222082,-0.971712,12.993357,-138.085024,197.704107,
+ -0.318783,0.166046,-0.93317,12.838811,-137.294345,197.897594,
+ -0.318783,0.166046,-0.93317,12.993357,-138.085024,197.704107,
+ -0.318783,0.166046,-0.93317,12.049349,-138.26117,197.99525,
+ -0.311488,0.109106,-0.943966,12.993357,-138.085024,197.704107,
+ -0.311488,0.109106,-0.943966,12.749065,-138.869315,197.694068,
+ -0.311488,0.109106,-0.943966,12.049349,-138.26117,197.99525,
+ -0.829367,-0.459463,-0.317875,12.61186,-139.266023,197.980039,
+ -0.829367,-0.459463,-0.317875,12.65719,-139.952962,198.854684,
+ -0.829367,-0.459463,-0.317875,12.049349,-138.26117,197.99525,
+ -0.790165,-0.478472,-0.38302,12.049349,-138.26117,197.99525,
+ -0.790165,-0.478472,-0.38302,12.65719,-139.952962,198.854684,
+ -0.790165,-0.478472,-0.38302,12.098329,-139.83979,199.866229,
+ 0.546937,0.373116,-0.749429,15.334668,-140.532813,199.057905,
+ 0.546937,0.373116,-0.749429,15.286296,-141.394376,198.593659,
+ 0.546937,0.373116,-0.749429,14.684236,-141.078287,198.311643,
+ 0.437297,0.500641,-0.747081,15.334668,-140.532813,199.057905,
+ 0.437297,0.500641,-0.747081,14.684236,-141.078287,198.311643,
+ 0.437297,0.500641,-0.747081,14.522389,-140.603697,198.534944,
+ -0.732866,-0.604224,-0.312764,13.010698,-140.621038,199.065207,
+ -0.732866,-0.604224,-0.312764,13.493198,-141.606725,199.838849,
+ -0.732866,-0.604224,-0.312764,12.793178,-140.953251,200.216696,
+ -0.693085,-0.62338,-0.361981,13.280241,-140.88115,198.997061,
+ -0.693085,-0.62338,-0.361981,13.493198,-141.606725,199.838849,
+ -0.693085,-0.62338,-0.361981,13.010698,-140.621038,199.065207,
+ -0.673865,-0.561742,-0.47995,14.221815,-141.429666,198.489006,
+ -0.673865,-0.561742,-0.47995,14.377274,-141.953541,198.883889,
+ -0.673865,-0.561742,-0.47995,13.730797,-141.20454,198.91492,
+ -0.692104,-0.579543,-0.430257,14.377274,-141.953541,198.883889,
+ -0.692104,-0.579543,-0.430257,13.493198,-141.606725,199.838849,
+ -0.692104,-0.579543,-0.430257,13.730797,-141.20454,198.91492,
+ 0.649834,0.029262,-0.759513,13.592375,-138.20641,197.626834,
+ 0.649834,0.029262,-0.759513,14.969903,-139.857739,198.741816,
+ 0.649834,0.029262,-0.759513,14.511437,-140.067958,198.341457,
+ 0.763311,0.228827,-0.604148,13.592375,-138.20641,197.626834,
+ 0.763311,0.228827,-0.604148,14.115337,-137.953295,198.38344,
+ 0.763311,0.228827,-0.604148,14.969903,-139.857739,198.741816,
+ -0.596866,-0.323004,-0.734451,12.049349,-138.26117,197.99525,
+ -0.596866,-0.323004,-0.734451,12.749065,-138.869315,197.694068,
+ -0.596866,-0.323004,-0.734451,12.61186,-139.266023,197.980039,
+ 0.697878,-0.230624,-0.67807,14.511437,-140.067958,198.341457,
+ 0.697878,-0.230624,-0.67807,14.969903,-139.857739,198.741816,
+ 0.697878,-0.230624,-0.67807,14.522389,-140.603697,198.534944,
+ 0.544737,-0.095752,-0.833122,14.969903,-139.857739,198.741816,
+ 0.544737,-0.095752,-0.833122,15.334668,-140.532813,199.057905,
+ 0.544737,-0.095752,-0.833122,14.522389,-140.603697,198.534944,
+ -0.574064,-0.686411,-0.44642,13.730797,-141.20454,198.91492,
+ -0.574064,-0.686411,-0.44642,13.493198,-141.606725,199.838849,
+ -0.574064,-0.686411,-0.44642,13.280241,-140.88115,198.997061,
+ 0.925056,0.284844,-0.251268,14.969903,-139.857739,198.741816,
+ 0.925056,0.284844,-0.251268,14.839999,-139.138249,199.079201,
+ 0.925056,0.284844,-0.251268,15.475219,-139.220389,201.324681,
+ -0.098788,-0.559194,-0.82313,12.749065,-138.869315,197.694068,
+ -0.098788,-0.559194,-0.82313,13.280241,-140.88115,198.997061,
+ -0.098788,-0.559194,-0.82313,12.61186,-139.266023,197.980039,
+ -0.073835,-0.555786,-0.82804,12.749065,-138.869315,197.694068,
+ -0.073835,-0.555786,-0.82804,14.511437,-140.067958,198.341457,
+ -0.073835,-0.555786,-0.82804,13.280241,-140.88115,198.997061,
+ 0.952008,-0.21299,0.219811,17.213861,-141.348439,209.620574,
+ 0.952008,-0.21299,0.219811,16.57712,-141.291244,212.433736,
+ 0.952008,-0.21299,0.219811,16.589897,-142.260807,211.438923,
+ 0.927472,0.313627,0.203551,17.213861,-141.348439,209.620574,
+ 0.927472,0.313627,0.203551,16.658044,-139.877514,209.88677,
+ 0.927472,0.313627,0.203551,16.57712,-141.291244,212.433736,
+ 0.84172,-0.51313,0.167941,16.574686,-143.076433,209.023077,
+ 0.84172,-0.51313,0.167941,16.589897,-142.260807,211.438923,
+ 0.84172,-0.51313,0.167941,15.888052,-143.472229,211.255171,
+ 0.916181,-0.381422,0.123005,16.574686,-143.076433,209.023077,
+ 0.916181,-0.381422,0.123005,17.213861,-141.348439,209.620574,
+ 0.916181,-0.381422,0.123005,16.589897,-142.260807,211.438923,
+ 0.929022,-0.364888,0.061449,16.836623,-142.703454,207.277742,
+ 0.929022,-0.364888,0.061449,17.213861,-141.348439,209.620574,
+ 0.929022,-0.364888,0.061449,16.574686,-143.076433,209.023077,
+ 0.989537,-0.105704,-0.098198,16.836623,-142.703454,207.277742,
+ 0.989537,-0.105704,-0.098198,17.108904,-140.463146,207.609955,
+ 0.989537,-0.105704,-0.098198,17.213861,-141.348439,209.620574,
+ 0.063083,-0.997669,-0.026009,14.902365,-145.096482,206.865518,
+ 0.063083,-0.997669,-0.026009,14.438119,-145.174668,208.738628,
+ 0.063083,-0.997669,-0.026009,13.330742,-145.233687,208.316669,
+ 0.003986,-0.995947,-0.089849,14.902365,-145.096482,206.865518,
+ 0.003986,-0.995947,-0.089849,13.330742,-145.233687,208.316669,
+ 0.003986,-0.995947,-0.089849,14.13937,-145.083096,206.683288,
+ 0.881892,-0.470376,0.031833,16.836623,-142.703454,207.277742,
+ 0.881892,-0.470376,0.031833,16.574686,-143.076433,209.023077,
+ 0.881892,-0.470376,0.031833,15.787354,-144.56987,208.767529,
+ 0.896167,-0.435349,0.08577,16.056896,-144.347482,207.079997,
+ 0.896167,-0.435349,0.08577,16.836623,-142.703454,207.277742,
+ 0.896167,-0.435349,0.08577,15.787354,-144.56987,208.767529,
+ 0.409402,-0.910718,-0.054625,16.056896,-144.347482,207.079997,
+ 0.409402,-0.910718,-0.054625,15.787354,-144.56987,208.767529,
+ 0.409402,-0.910718,-0.054625,14.438119,-145.174668,208.738628,
+ 0.529132,-0.843097,0.095953,16.056896,-144.347482,207.079997,
+ 0.529132,-0.843097,0.095953,14.438119,-145.174668,208.738628,
+ 0.529132,-0.843097,0.095953,14.902365,-145.096482,206.865518,
+ 0.362973,-0.916602,0.167607,15.787354,-144.56987,208.767529,
+ 0.362973,-0.916602,0.167607,15.115018,-144.423842,211.022135,
+ 0.362973,-0.916602,0.167607,13.864352,-145.014342,210.501303,
+ 0.396142,-0.893795,0.210244,15.787354,-144.56987,208.767529,
+ 0.396142,-0.893795,0.210244,13.864352,-145.014342,210.501303,
+ 0.396142,-0.893795,0.210244,14.438119,-145.174668,208.738628,
+ 0.756293,-0.643401,0.118562,16.574686,-143.076433,209.023077,
+ 0.756293,-0.643401,0.118562,15.888052,-143.472229,211.255171,
+ 0.756293,-0.643401,0.118562,15.115018,-144.423842,211.022135,
+ 0.829077,-0.484763,0.278633,15.787354,-144.56987,208.767529,
+ 0.829077,-0.484763,0.278633,16.574686,-143.076433,209.023077,
+ 0.829077,-0.484763,0.278633,15.115018,-144.423842,211.022135,
+ 0.213838,-0.964122,0.157299,14.438119,-145.174668,208.738628,
+ 0.213838,-0.964122,0.157299,13.864352,-145.014342,210.501303,
+ 0.213838,-0.964122,0.157299,12.722294,-145.361157,209.928145,
+ 0.072654,-0.996034,-0.051356,14.438119,-145.174668,208.738628,
+ 0.072654,-0.996034,-0.051356,12.722294,-145.361157,209.928145,
+ 0.072654,-0.996034,-0.051356,13.330742,-145.233687,208.316669,
+ 0.703832,-0.637931,0.312515,16.589897,-142.260807,211.438923,
+ 0.703832,-0.637931,0.312515,16.236997,-142.198137,212.361635,
+ 0.703832,-0.637931,0.312515,15.497124,-142.995813,212.399663,
+ 0.737053,-0.496557,0.458459,15.888052,-143.472229,211.255171,
+ 0.737053,-0.496557,0.458459,16.589897,-142.260807,211.438923,
+ 0.737053,-0.496557,0.458459,15.497124,-142.995813,212.399663,
+ 0.567845,-0.67291,0.474072,15.888052,-143.472229,211.255171,
+ 0.567845,-0.67291,0.474072,15.497124,-142.995813,212.399663,
+ 0.567845,-0.67291,0.474072,14.555245,-143.747552,212.460812,
+ 0.596431,-0.611757,0.519638,15.888052,-143.472229,211.255171,
+ 0.596431,-0.611757,0.519638,14.555245,-143.747552,212.460812,
+ 0.596431,-0.611757,0.519638,15.115018,-144.423842,211.022135,
+ 0.893115,-0.269839,0.359908,16.589897,-142.260807,211.438923,
+ 0.893115,-0.269839,0.359908,16.384546,-141.643232,212.411528,
+ 0.893115,-0.269839,0.359908,16.236997,-142.198137,212.361635,
+ 0.771659,-0.450507,0.448983,16.589897,-142.260807,211.438923,
+ 0.771659,-0.450507,0.448983,16.57712,-141.291244,212.433736,
+ 0.771659,-0.450507,0.448983,16.384546,-141.643232,212.411528,
+ -0.221671,0.351719,0.909481,15.497124,-142.995813,212.399663,
+ -0.221671,0.351719,0.909481,14.474321,-143.435113,212.320261,
+ -0.221671,0.351719,0.909481,14.555245,-143.747552,212.460812,
+ -0.247939,0.419421,0.873277,15.56527,-142.441821,212.152937,
+ -0.247939,0.419421,0.873277,14.474321,-143.435113,212.320261,
+ -0.247939,0.419421,0.873277,15.497124,-142.995813,212.399663,
+ 0.202976,-0.853388,0.480135,15.115018,-144.423842,211.022135,
+ 0.202976,-0.853388,0.480135,14.555245,-143.747552,212.460812,
+ 0.202976,-0.853388,0.480135,13.864352,-145.014342,210.501303,
+ 0.569775,-0.767035,0.294981,14.555245,-143.747552,212.460812,
+ 0.569775,-0.767035,0.294981,13.583553,-144.62098,212.066538,
+ 0.569775,-0.767035,0.294981,13.864352,-145.014342,210.501303,
+ -0.115004,-0.299594,0.94711,14.555245,-143.747552,212.460812,
+ -0.115004,-0.299594,0.94711,13.243734,-144.620371,212.025467,
+ -0.115004,-0.299594,0.94711,13.583553,-144.62098,212.066538,
+ -0.457356,0.263609,0.849315,14.474321,-143.435113,212.320261,
+ -0.457356,0.263609,0.849315,13.243734,-144.620371,212.025467,
+ -0.457356,0.263609,0.849315,14.555245,-143.747552,212.460812,
+ -0.734203,-0.205934,0.646944,12.350531,-145.120212,210.852682,
+ -0.734203,-0.205934,0.646944,13.243734,-144.620371,212.025467,
+ -0.734203,-0.205934,0.646944,12.308549,-144.666613,210.949426,
+ -0.053035,-0.903433,0.425435,13.583553,-144.62098,212.066538,
+ -0.053035,-0.903433,0.425435,13.243734,-144.620371,212.025467,
+ -0.053035,-0.903433,0.425435,12.350531,-145.120212,210.852682,
+ 0.127979,-0.956198,0.263263,13.864352,-145.014342,210.501303,
+ 0.127979,-0.956198,0.263263,13.583553,-144.62098,212.066538,
+ 0.127979,-0.956198,0.263263,12.350531,-145.120212,210.852682,
+ 0.135801,-0.944023,0.30063,13.864352,-145.014342,210.501303,
+ 0.135801,-0.944023,0.30063,12.350531,-145.120212,210.852682,
+ 0.135801,-0.944023,0.30063,12.722294,-145.361157,209.928145,
+ -0.783716,-0.568307,-0.250631,11.663289,-140.070088,201.747248,
+ -0.783716,-0.568307,-0.250631,12.793178,-140.953251,200.216696,
+ -0.783716,-0.568307,-0.250631,12.586001,-141.583908,202.294548,
+ -0.783814,-0.568084,-0.250832,12.793178,-140.953251,200.216696,
+ -0.783814,-0.568084,-0.250832,11.663289,-140.070088,201.747248,
+ -0.783814,-0.568084,-0.250832,12.098329,-139.83979,199.866229,
+ -0.604465,-0.653412,-0.455713,15.36509,-143.013458,199.851931,
+ -0.604465,-0.653412,-0.455713,14.777329,-143.076128,200.721404,
+ -0.604465,-0.653412,-0.455713,15.126578,-141.992481,198.704397,
+ -0.161606,-0.857398,-0.488623,15.126578,-141.992481,198.704397,
+ -0.161606,-0.857398,-0.488623,14.777329,-143.076128,200.721404,
+ -0.161606,-0.857398,-0.488623,14.377274,-141.953541,198.883889,
+ 0.735572,-0.393023,-0.551785,15.286296,-141.394376,198.593659,
+ 0.735572,-0.393023,-0.551785,15.949201,-142.225213,200.069147,
+ 0.735572,-0.393023,-0.551785,15.36509,-143.013458,199.851931,
+ 0.839719,-0.307149,-0.447808,15.286296,-141.394376,198.593659,
+ 0.839719,-0.307149,-0.447808,15.36509,-143.013458,199.851931,
+ 0.839719,-0.307149,-0.447808,15.126578,-141.992481,198.704397,
+ 0.903483,0.353319,-0.24266,14.419257,-138.150737,198.950514,
+ 0.903483,0.353319,-0.24266,15.475219,-139.220389,201.324681,
+ 0.903483,0.353319,-0.24266,14.839999,-139.138249,199.079201,
+ 0.896566,0.379971,-0.227576,14.419257,-138.150737,198.950514,
+ 0.896566,0.379971,-0.227576,14.873768,-137.892146,201.172873,
+ 0.896566,0.379971,-0.227576,15.475219,-139.220389,201.324681,
+ 0.792628,0.565508,-0.227908,14.115337,-137.953295,198.38344,
+ 0.792628,0.565508,-0.227908,14.873768,-137.892146,201.172873,
+ 0.792628,0.565508,-0.227908,14.419257,-138.150737,198.950514,
+ 0.916667,0.306926,-0.255965,14.115337,-137.953295,198.38344,
+ 0.916667,0.306926,-0.255965,14.083089,-136.813975,199.634106,
+ 0.916667,0.306926,-0.255965,14.873768,-137.892146,201.172873,
+ 0.916525,0.307165,-0.256186,14.083089,-136.813975,199.634106,
+ 0.916525,0.307165,-0.256186,14.115337,-137.953295,198.38344,
+ 0.916525,0.307165,-0.256186,13.932194,-137.319292,198.488398,
+ 0.234785,0.880506,-0.411807,14.083089,-136.813975,199.634106,
+ 0.234785,0.880506,-0.411807,12.838811,-137.294345,197.897594,
+ 0.234785,0.880506,-0.411807,12.644716,-136.935969,198.553197,
+ -0.441515,0.461915,0.76922,13.762132,-138.706555,205.373298,
+ -0.441515,0.461915,0.76922,11.725655,-139.934708,204.941908,
+ -0.441515,0.461915,0.76922,13.711327,-140.206076,206.244597,
+ -0.499219,0.612515,0.612867,12.803826,-137.712654,203.599366,
+ -0.499219,0.612515,0.612867,11.725655,-139.934708,204.941908,
+ -0.499219,0.612515,0.612867,13.762132,-138.706555,205.373298,
+ -0.885309,-0.407924,-0.223217,12.586001,-141.583908,202.294548,
+ -0.885309,-0.407924,-0.223217,12.591781,-142.509054,203.962306,
+ -0.885309,-0.407924,-0.223217,11.467977,-140.563844,204.864635,
+ -0.822499,-0.551548,-0.13889,11.663289,-140.070088,201.747248,
+ -0.822499,-0.551548,-0.13889,12.586001,-141.583908,202.294548,
+ -0.822499,-0.551548,-0.13889,11.467977,-140.563844,204.864635,
+ -0.424939,-0.83347,-0.353205,15.498645,-143.795011,201.535508,
+ -0.424939,-0.83347,-0.353205,14.696709,-143.610346,202.064554,
+ -0.424939,-0.83347,-0.353205,15.36509,-143.013458,199.851931,
+ -0.436952,-0.826488,-0.35495,15.36509,-143.013458,199.851931,
+ -0.436952,-0.826488,-0.35495,14.696709,-143.610346,202.064554,
+ -0.436952,-0.826488,-0.35495,14.777329,-143.076128,200.721404,
+ 0.804805,-0.511788,-0.300604,15.949201,-142.225213,200.069147,
+ 0.804805,-0.511788,-0.300604,16.342867,-142.594846,201.75242,
+ 0.804805,-0.511788,-0.300604,15.498645,-143.795011,201.535508,
+ 0.803895,-0.512564,-0.301714,15.36509,-143.013458,199.851931,
+ 0.803895,-0.512564,-0.301714,15.949201,-142.225213,200.069147,
+ 0.803895,-0.512564,-0.301714,15.498645,-143.795011,201.535508,
+ 0.869809,0.493375,0.003703,14.873768,-137.892146,201.172873,
+ 0.869809,0.493375,0.003703,14.993937,-138.120923,203.427479,
+ 0.869809,0.493375,0.003703,16.028604,-139.946877,203.675422,
+ 0.91108,0.402248,-0.090163,14.873768,-137.892146,201.172873,
+ 0.91108,0.402248,-0.090163,16.028604,-139.946877,203.675422,
+ 0.91108,0.402248,-0.090163,15.475219,-139.220389,201.324681,
+ 0.277268,0.926942,0.252787,14.993937,-138.120923,203.427479,
+ 0.277268,0.926942,0.252787,14.083089,-136.813975,199.634106,
+ 0.277268,0.926942,0.252787,13.918808,-137.329331,201.704049,
+ 0.792718,0.609275,0.019572,14.083089,-136.813975,199.634106,
+ 0.792718,0.609275,0.019572,14.993937,-138.120923,203.427479,
+ 0.792718,0.609275,0.019572,14.873768,-137.892146,201.172873,
+ -0.116811,0.9786,0.169405,13.918808,-137.329331,201.704049,
+ -0.116811,0.9786,0.169405,12.644716,-136.935969,198.553197,
+ -0.116811,0.9786,0.169405,12.758801,-137.368576,201.13089,
+ -0.242676,0.945711,0.216195,14.083089,-136.813975,199.634106,
+ -0.242676,0.945711,0.216195,12.644716,-136.935969,198.553197,
+ -0.242676,0.945711,0.216195,13.918808,-137.329331,201.704049,
+ -0.698289,0.703236,0.133608,12.758801,-137.368576,201.13089,
+ -0.698289,0.703236,0.133608,11.691886,-138.01992,198.983066,
+ -0.698289,0.703236,0.133608,11.631954,-138.604944,201.749074,
+ -0.713412,0.685243,0.146577,12.644716,-136.935969,198.553197,
+ -0.713412,0.685243,0.146577,11.691886,-138.01992,198.983066,
+ -0.713412,0.685243,0.146577,12.758801,-137.368576,201.13089,
+ -0.993098,-0.089055,-0.076325,11.691886,-138.01992,198.983066,
+ -0.993098,-0.089055,-0.076325,11.663289,-140.070088,201.747248,
+ -0.993098,-0.089055,-0.076325,11.467977,-140.563844,204.864635,
+ -0.99724,0.074007,-0.005955,11.691886,-138.01992,198.983066,
+ -0.99724,0.074007,-0.005955,11.467977,-140.563844,204.864635,
+ -0.99724,0.074007,-0.005955,11.631954,-138.604944,201.749074,
+ -0.95155,-0.241249,-0.19066,12.591781,-142.509054,203.962306,
+ -0.95155,-0.241249,-0.19066,12.4491,-143.427812,205.836936,
+ -0.95155,-0.241249,-0.19066,11.872899,-141.848279,206.714015,
+ -0.882859,-0.453589,-0.121725,12.591781,-142.509054,203.962306,
+ -0.882859,-0.453589,-0.121725,11.872899,-141.848279,206.714015,
+ -0.882859,-0.453589,-0.121725,11.467977,-140.563844,204.864635,
+ -0.466661,-0.817173,-0.338312,15.498645,-143.795011,201.535508,
+ -0.466661,-0.817173,-0.338312,15.437191,-144.531233,203.398578,
+ -0.466661,-0.817173,-0.338312,14.720135,-144.373645,204.007027,
+ -0.412558,-0.849506,-0.32884,15.498645,-143.795011,201.535508,
+ -0.412558,-0.849506,-0.32884,14.720135,-144.373645,204.007027,
+ -0.412558,-0.849506,-0.32884,14.696709,-143.610346,202.064554,
+ 0.794058,-0.564026,-0.226596,16.342867,-142.594846,201.75242,
+ 0.794058,-0.564026,-0.226596,16.370552,-143.556499,204.243105,
+ 0.794058,-0.564026,-0.226596,15.437191,-144.531233,203.398578,
+ 0.819052,-0.542291,-0.187279,15.498645,-143.795011,201.535508,
+ 0.819052,-0.542291,-0.187279,16.342867,-142.594846,201.75242,
+ 0.819052,-0.542291,-0.187279,15.437191,-144.531233,203.398578,
+ 0.844242,0.516702,-0.142388,14.993937,-138.120923,203.427479,
+ 0.844242,0.516702,-0.142388,15.487693,-138.353654,205.510503,
+ 0.844242,0.516702,-0.142388,16.498934,-139.925277,205.803167,
+ 0.864361,0.463202,-0.195766,14.993937,-138.120923,203.427479,
+ 0.864361,0.463202,-0.195766,16.498934,-139.925277,205.803167,
+ 0.864361,0.463202,-0.195766,16.028604,-139.946877,203.675422,
+ 0.233627,0.958784,0.161718,15.487693,-138.353654,205.510503,
+ 0.233627,0.958784,0.161718,13.918808,-137.329331,201.704049,
+ 0.233627,0.958784,0.161718,14.04354,-137.737904,203.946182,
+ 0.666514,0.741698,-0.075121,15.487693,-138.353654,205.510503,
+ 0.666514,0.741698,-0.075121,14.993937,-138.120923,203.427479,
+ 0.666514,0.741698,-0.075121,13.918808,-137.329331,201.704049,
+ -0.40353,0.413206,0.816348,16.236997,-142.198137,212.361635,
+ -0.40353,0.413206,0.816348,15.56527,-142.441821,212.152937,
+ -0.40353,0.413206,0.816348,15.497124,-142.995813,212.399663,
+ -0.294134,-0.007722,0.955733,16.384546,-141.643232,212.411528,
+ -0.294134,-0.007722,0.955733,15.56527,-142.441821,212.152937,
+ -0.294134,-0.007722,0.955733,16.236997,-142.198137,212.361635,
+ 0.245862,0.874505,-0.418083,14.083089,-136.813975,199.634106,
+ 0.245862,0.874505,-0.418083,13.932194,-137.319292,198.488398,
+ 0.245862,0.874505,-0.418083,12.838811,-137.294345,197.897594,
+ -0.761172,0.510424,-0.400106,12.049349,-138.26117,197.99525,
+ -0.761172,0.510424,-0.400106,11.691886,-138.01992,198.983066,
+ -0.761172,0.510424,-0.400106,12.644716,-136.935969,198.553197,
+ -0.698302,0.520575,-0.491301,12.838811,-137.294345,197.897594,
+ -0.698302,0.520575,-0.491301,12.049349,-138.26117,197.99525,
+ -0.698302,0.520575,-0.491301,12.644716,-136.935969,198.553197,
+ -0.733137,-0.595783,-0.327954,13.532443,-142.467376,201.783755,
+ -0.733137,-0.595783,-0.327954,12.591781,-142.509054,203.962306,
+ -0.733137,-0.595783,-0.327954,12.586001,-141.583908,202.294548,
+ -0.521722,-0.796136,-0.306552,14.720135,-144.373645,204.007027,
+ -0.521722,-0.796136,-0.306552,13.469164,-143.921568,204.961987,
+ -0.521722,-0.796136,-0.306552,14.696709,-143.610346,202.064554,
+ -0.636783,-0.690097,-0.343909,14.696709,-143.610346,202.064554,
+ -0.636783,-0.690097,-0.343909,13.469164,-143.921568,204.961987,
+ -0.636783,-0.690097,-0.343909,13.55891,-143.059396,203.065757,
+ -0.63202,-0.693749,-0.345344,13.55891,-143.059396,203.065757,
+ -0.63202,-0.693749,-0.345344,13.469164,-143.921568,204.961987,
+ -0.63202,-0.693749,-0.345344,12.4491,-143.427812,205.836936,
+ -0.690638,-0.627244,-0.359978,13.55891,-143.059396,203.065757,
+ -0.690638,-0.627244,-0.359978,12.4491,-143.427812,205.836936,
+ -0.690638,-0.627244,-0.359978,12.591781,-142.509054,203.962306,
+ -0.523328,-0.78869,-0.322639,14.720135,-144.373645,204.007027,
+ -0.523328,-0.78869,-0.322639,14.13937,-145.083096,206.683288,
+ -0.523328,-0.78869,-0.322639,13.263813,-144.642884,207.027366,
+ -0.531373,-0.781935,-0.325916,14.720135,-144.373645,204.007027,
+ -0.531373,-0.781935,-0.325916,13.263813,-144.642884,207.027366,
+ -0.531373,-0.781935,-0.325916,13.469164,-143.921568,204.961987,
+ -0.576321,-0.751997,-0.319929,13.469164,-143.921568,204.961987,
+ -0.576321,-0.751997,-0.319929,13.263813,-144.642884,207.027366,
+ -0.576321,-0.751997,-0.319929,12.483782,-144.197804,207.386351,
+ -0.627611,-0.70269,-0.335158,13.469164,-143.921568,204.961987,
+ -0.627611,-0.70269,-0.335158,12.483782,-144.197804,207.386351,
+ -0.627611,-0.70269,-0.335158,12.4491,-143.427812,205.836936,
+ -0.264329,0.762175,0.590948,12.811127,-142.629527,208.208365,
+ -0.264329,0.762175,0.590948,11.91397,-143.033841,208.328533,
+ -0.264329,0.762175,0.590948,11.930398,-144.174987,209.807672,
+ -0.526233,0.737652,0.423022,13.128737,-143.506606,210.132888,
+ -0.526233,0.737652,0.423022,12.811127,-142.629527,208.208365,
+ -0.526233,0.737652,0.423022,11.930398,-144.174987,209.807672,
+ -0.673242,0.653583,0.345796,15.11015,-140.506954,207.927261,
+ -0.673242,0.653583,0.345796,15.339535,-141.472866,210.199513,
+ -0.673242,0.653583,0.345796,16.404929,-140.582097,210.590137,
+ -0.856105,0.294643,0.424581,15.11015,-140.506954,207.927261,
+ -0.856105,0.294643,0.424581,16.404929,-140.582097,210.590137,
+ -0.856105,0.294643,0.424581,15.718903,-139.213392,208.257041,
+ -0.593549,0.756734,0.27396,15.339535,-141.472866,210.199513,
+ -0.593549,0.756734,0.27396,14.393398,-141.353915,207.821087,
+ -0.593549,0.756734,0.27396,14.512045,-142.121473,210.198296,
+ -0.741724,0.587026,0.324417,14.393398,-141.353915,207.821087,
+ -0.741724,0.587026,0.324417,15.339535,-141.472866,210.199513,
+ -0.741724,0.587026,0.324417,15.11015,-140.506954,207.927261,
+ -0.502414,0.752484,0.425851,14.393398,-141.353915,207.821087,
+ -0.502414,0.752484,0.425851,12.811127,-142.629527,208.208365,
+ -0.502414,0.752484,0.425851,13.128737,-143.506606,210.132888,
+ -0.690461,0.677592,0.253244,14.393398,-141.353915,207.821087,
+ -0.690461,0.677592,0.253244,13.128737,-143.506606,210.132888,
+ -0.690461,0.677592,0.253244,14.512045,-142.121473,210.198296,
+ -0.654163,0.633811,0.41274,13.128737,-143.506606,210.132888,
+ -0.654163,0.633811,0.41274,13.243734,-144.620371,212.025467,
+ -0.654163,0.633811,0.41274,14.512045,-142.121473,210.198296,
+ -0.688477,0.62207,0.372864,14.512045,-142.121473,210.198296,
+ -0.688477,0.62207,0.372864,13.243734,-144.620371,212.025467,
+ -0.688477,0.62207,0.372864,14.474321,-143.435113,212.320261,
+ -0.573367,0.701138,0.423859,15.56527,-142.441821,212.152937,
+ -0.573367,0.701138,0.423859,14.512045,-142.121473,210.198296,
+ -0.573367,0.701138,0.423859,14.474321,-143.435113,212.320261,
+ -0.560496,0.714294,0.41908,15.56527,-142.441821,212.152937,
+ -0.560496,0.714294,0.41908,15.339535,-141.472866,210.199513,
+ -0.560496,0.714294,0.41908,14.512045,-142.121473,210.198296,
+ -0.704498,0.600013,0.379034,15.339535,-141.472866,210.199513,
+ -0.704498,0.600013,0.379034,15.56527,-142.441821,212.152937,
+ -0.704498,0.600013,0.379034,16.384546,-141.643232,212.411528,
+ -0.672182,0.642983,0.367077,15.339535,-141.472866,210.199513,
+ -0.672182,0.642983,0.367077,16.384546,-141.643232,212.411528,
+ -0.672182,0.642983,0.367077,16.404929,-140.582097,210.590137,
+ -0.523281,0.705955,0.477288,13.128737,-143.506606,210.132888,
+ -0.523281,0.705955,0.477288,11.930398,-144.174987,209.807672,
+ -0.523281,0.705955,0.477288,12.308549,-144.666613,210.949426,
+ -0.550366,0.704522,0.448046,13.243734,-144.620371,212.025467,
+ -0.550366,0.704522,0.448046,13.128737,-143.506606,210.132888,
+ -0.550366,0.704522,0.448046,12.308549,-144.666613,210.949426,
+ -0.834516,0.302314,0.46064,11.613396,-143.711045,208.228443,
+ -0.834516,0.302314,0.46064,11.984854,-144.51298,209.427696,
+ -0.834516,0.302314,0.46064,11.91397,-143.033841,208.328533,
+ -0.993897,-0.092401,-0.060248,11.91397,-143.033841,208.328533,
+ -0.993897,-0.092401,-0.060248,11.984854,-144.51298,209.427696,
+ -0.993897,-0.092401,-0.060248,11.930398,-144.174987,209.807672,
+ -0.949776,-0.288716,0.120699,11.984854,-144.51298,209.427696,
+ -0.949776,-0.288716,0.120699,12.350531,-145.120212,210.852682,
+ -0.949776,-0.288716,0.120699,11.930398,-144.174987,209.807672,
+ -0.956272,-0.142932,0.255174,11.930398,-144.174987,209.807672,
+ -0.956272,-0.142932,0.255174,12.350531,-145.120212,210.852682,
+ -0.956272,-0.142932,0.255174,12.308549,-144.666613,210.949426,
+ -0.674539,-0.670047,-0.309892,12.483782,-144.197804,207.386351,
+ -0.674539,-0.670047,-0.309892,12.40012,-144.498681,208.219012,
+ -0.674539,-0.670047,-0.309892,11.613396,-143.711045,208.228443,
+ -0.54109,0.352975,-0.763302,11.91397,-143.033841,208.328533,
+ -0.54109,0.352975,-0.763302,12.483782,-144.197804,207.386351,
+ -0.54109,0.352975,-0.763302,11.613396,-143.711045,208.228443,
+ -0.702802,-0.69649,-0.144815,12.423241,-144.926117,209.287144,
+ -0.702802,-0.69649,-0.144815,12.722294,-145.361157,209.928145,
+ -0.702802,-0.69649,-0.144815,11.984854,-144.51298,209.427696,
+ -0.717366,-0.688097,-0.109131,11.984854,-144.51298,209.427696,
+ -0.717366,-0.688097,-0.109131,12.722294,-145.361157,209.928145,
+ -0.717366,-0.688097,-0.109131,12.350531,-145.120212,210.852682,
+ -0.685145,-0.681264,-0.257791,12.40012,-144.498681,208.219012,
+ -0.685145,-0.681264,-0.257791,12.423241,-144.926117,209.287144,
+ -0.685145,-0.681264,-0.257791,11.613396,-143.711045,208.228443,
+ -0.70549,-0.670431,-0.229795,11.613396,-143.711045,208.228443,
+ -0.70549,-0.670431,-0.229795,12.423241,-144.926117,209.287144,
+ -0.70549,-0.670431,-0.229795,11.984854,-144.51298,209.427696,
+ -0.575681,-0.754254,-0.315741,13.330742,-145.233687,208.316669,
+ -0.575681,-0.754254,-0.315741,12.483782,-144.197804,207.386351,
+ -0.575681,-0.754254,-0.315741,13.263813,-144.642884,207.027366,
+ -0.563442,-0.757277,-0.33025,13.330742,-145.233687,208.316669,
+ -0.563442,-0.757277,-0.33025,12.40012,-144.498681,208.219012,
+ -0.563442,-0.757277,-0.33025,12.483782,-144.197804,207.386351,
+ -0.577084,-0.767689,-0.278616,13.330742,-145.233687,208.316669,
+ -0.577084,-0.767689,-0.278616,12.722294,-145.361157,209.928145,
+ -0.577084,-0.767689,-0.278616,12.40012,-144.498681,208.219012,
+ -0.504245,-0.805458,-0.311406,12.722294,-145.361157,209.928145,
+ -0.504245,-0.805458,-0.311406,12.423241,-144.926117,209.287144,
+ -0.504245,-0.805458,-0.311406,12.40012,-144.498681,208.219012,
+ -0.524616,-0.783938,-0.331994,14.13937,-145.083096,206.683288,
+ -0.524616,-0.783938,-0.331994,13.330742,-145.233687,208.316669,
+ -0.524616,-0.783938,-0.331994,13.263813,-144.642884,207.027366,
+ -0.860511,0.456527,0.226061,16.658044,-139.877514,209.88677,
+ -0.860511,0.456527,0.226061,16.384546,-141.643232,212.411528,
+ -0.860511,0.456527,0.226061,16.57712,-141.291244,212.433736,
+ -0.722404,0.600956,0.34203,16.658044,-139.877514,209.88677,
+ -0.722404,0.600956,0.34203,16.404929,-140.582097,210.590137,
+ -0.722404,0.600956,0.34203,16.384546,-141.643232,212.411528,
+ -0.565653,0.675457,0.473069,16.658044,-139.877514,209.88677,
+ -0.565653,0.675457,0.473069,16.331915,-138.801473,207.960422,
+ -0.565653,0.675457,0.473069,16.404929,-140.582097,210.590137,
+ -0.269719,0.793854,0.545021,16.404929,-140.582097,210.590137,
+ -0.269719,0.793854,0.545021,16.331915,-138.801473,207.960422,
+ -0.269719,0.793854,0.545021,15.718903,-139.213392,208.257041,
+ 0.936639,0.336002,0.099051,17.108904,-140.463146,207.609955,
+ 0.936639,0.336002,0.099051,16.658044,-139.877514,209.88677,
+ 0.936639,0.336002,0.099051,17.213861,-141.348439,209.620574,
+ 0.909283,0.40941,0.074752,17.108904,-140.463146,207.609955,
+ 0.909283,0.40941,0.074752,16.331915,-138.801473,207.960422,
+ 0.909283,0.40941,0.074752,16.658044,-139.877514,209.88677,
+ -0.132282,0.667997,0.732313,11.725655,-139.934708,204.941908,
+ -0.132282,0.667997,0.732313,11.872899,-141.848279,206.714015,
+ -0.132282,0.667997,0.732313,12.712558,-141.829417,206.848482,
+ -0.112443,0.79955,0.58998,12.712558,-141.829417,206.848482,
+ -0.112443,0.79955,0.58998,11.872899,-141.848279,206.714015,
+ -0.112443,0.79955,0.58998,11.91397,-143.033841,208.328533,
+ -0.413409,0.529828,0.740524,11.725655,-139.934708,204.941908,
+ -0.413409,0.529828,0.740524,12.712558,-141.829417,206.848482,
+ -0.413409,0.529828,0.740524,13.711327,-140.206076,206.244597,
+ -0.709712,0.583504,0.394756,13.711327,-140.206076,206.244597,
+ -0.709712,0.583504,0.394756,12.712558,-141.829417,206.848482,
+ -0.709712,0.583504,0.394756,12.811127,-142.629527,208.208365,
+ -0.376837,0.663622,0.64622,14.393398,-141.353915,207.821087,
+ -0.376837,0.663622,0.64622,13.711327,-140.206076,206.244597,
+ -0.376837,0.663622,0.64622,12.811127,-142.629527,208.208365,
+ -0.638817,0.463642,0.613962,13.711327,-140.206076,206.244597,
+ -0.638817,0.463642,0.613962,14.393398,-141.353915,207.821087,
+ -0.638817,0.463642,0.613962,15.11015,-140.506954,207.927261,
+ -0.673286,0.388386,0.62916,13.762132,-138.706555,205.373298,
+ -0.673286,0.388386,0.62916,13.711327,-140.206076,206.244597,
+ -0.673286,0.388386,0.62916,15.11015,-140.506954,207.927261,
+ -0.787616,0.224352,0.57387,13.762132,-138.706555,205.373298,
+ -0.787616,0.224352,0.57387,15.11015,-140.506954,207.927261,
+ -0.787616,0.224352,0.57387,15.718903,-139.213392,208.257041,
+ -0.339866,0.859538,0.381687,15.718903,-139.213392,208.257041,
+ -0.339866,0.859538,0.381687,14.537296,-138.538927,205.686041,
+ -0.339866,0.859538,0.381687,13.762132,-138.706555,205.373298,
+ -0.299311,0.812732,0.49988,12.811127,-142.629527,208.208365,
+ -0.299311,0.812732,0.49988,12.712558,-141.829417,206.848482,
+ -0.299311,0.812732,0.49988,11.91397,-143.033841,208.328533,
+ -0.374545,0.840032,0.392508,16.331915,-138.801473,207.960422,
+ -0.374545,0.840032,0.392508,14.537296,-138.538927,205.686041,
+ -0.374545,0.840032,0.392508,15.718903,-139.213392,208.257041,
+ 0.949155,0.284087,-0.135643,15.475219,-139.220389,201.324681,
+ 0.949155,0.284087,-0.135643,16.028604,-139.946877,203.675422,
+ 0.949155,0.284087,-0.135643,16.354428,-141.488686,202.726242,
+ 0.946496,0.308657,-0.09421,15.983274,-140.988845,200.635004,
+ 0.946496,0.308657,-0.09421,15.475219,-139.220389,201.324681,
+ 0.946496,0.308657,-0.09421,16.354428,-141.488686,202.726242,
+ 0.982179,0.118304,-0.146041,15.983274,-140.988845,200.635004,
+ 0.982179,0.118304,-0.146041,16.354428,-141.488686,202.726242,
+ 0.982179,0.118304,-0.146041,16.342867,-142.594846,201.75242,
+ 0.974627,0.070387,-0.212479,15.949201,-142.225213,200.069147,
+ 0.974627,0.070387,-0.212479,15.983274,-140.988845,200.635004,
+ 0.974627,0.070387,-0.212479,16.342867,-142.594846,201.75242,
+ 0.957327,0.194689,-0.21359,16.028604,-139.946877,203.675422,
+ 0.957327,0.194689,-0.21359,16.498934,-139.925277,205.803167,
+ 0.957327,0.194689,-0.21359,16.731362,-142.035073,204.921829,
+ 0.959485,0.263763,-0.099083,16.354428,-141.488686,202.726242,
+ 0.959485,0.263763,-0.099083,16.028604,-139.946877,203.675422,
+ 0.959485,0.263763,-0.099083,16.731362,-142.035073,204.921829,
+ 0.969458,-0.140107,-0.201301,16.354428,-141.488686,202.726242,
+ 0.969458,-0.140107,-0.201301,16.731362,-142.035073,204.921829,
+ 0.969458,-0.140107,-0.201301,16.370552,-143.556499,204.243105,
+ 0.999936,-0.000497,-0.011306,16.342867,-142.594846,201.75242,
+ 0.999936,-0.000497,-0.011306,16.354428,-141.488686,202.726242,
+ 0.999936,-0.000497,-0.011306,16.370552,-143.556499,204.243105,
+ 0.939544,-0.064315,-0.336335,16.498934,-139.925277,205.803167,
+ 0.939544,-0.064315,-0.336335,17.108904,-140.463146,207.609955,
+ 0.939544,-0.064315,-0.336335,16.836623,-142.703454,207.277742,
+ 0.993361,0.114415,-0.011923,16.731362,-142.035073,204.921829,
+ 0.993361,0.114415,-0.011923,16.498934,-139.925277,205.803167,
+ 0.993361,0.114415,-0.011923,16.836623,-142.703454,207.277742,
+ 0.89961,-0.407911,-0.15592,16.731362,-142.035073,204.921829,
+ 0.89961,-0.407911,-0.15592,16.836623,-142.703454,207.277742,
+ 0.89961,-0.407911,-0.15592,16.056896,-144.347482,207.079997,
+ 0.968332,-0.246716,0.038272,16.370552,-143.556499,204.243105,
+ 0.968332,-0.246716,0.038272,16.731362,-142.035073,204.921829,
+ 0.968332,-0.246716,0.038272,16.056896,-144.347482,207.079997,
+ -0.626108,-0.710899,-0.32033,14.777329,-143.076128,200.721404,
+ -0.626108,-0.710899,-0.32033,14.696709,-143.610346,202.064554,
+ -0.626108,-0.710899,-0.32033,13.55891,-143.059396,203.065757,
+ -0.621426,-0.716097,-0.31786,14.777329,-143.076128,200.721404,
+ -0.621426,-0.716097,-0.31786,13.55891,-143.059396,203.065757,
+ -0.621426,-0.716097,-0.31786,13.532443,-142.467376,201.783755,
+ -0.666916,-0.68163,-0.301004,13.55891,-143.059396,203.065757,
+ -0.666916,-0.68163,-0.301004,12.591781,-142.509054,203.962306,
+ -0.666916,-0.68163,-0.301004,13.532443,-142.467376,201.783755,
+ -0.018539,0.990208,0.138362,14.04354,-137.737904,203.946182,
+ -0.018539,0.990208,0.138362,12.758801,-137.368576,201.13089,
+ -0.018539,0.990208,0.138362,12.803826,-137.712654,203.599366,
+ -0.124179,0.974943,0.184567,14.04354,-137.737904,203.946182,
+ -0.124179,0.974943,0.184567,13.918808,-137.329331,201.704049,
+ -0.124179,0.974943,0.184567,12.758801,-137.368576,201.13089,
+ -0.80392,0.540282,0.248612,11.631954,-138.604944,201.749074,
+ -0.80392,0.540282,0.248612,11.725655,-139.934708,204.941908,
+ -0.80392,0.540282,0.248612,12.803826,-137.712654,203.599366,
+ -0.706489,0.699071,0.110329,12.758801,-137.368576,201.13089,
+ -0.706489,0.699071,0.110329,11.631954,-138.604944,201.749074,
+ -0.706489,0.699071,0.110329,12.803826,-137.712654,203.599366,
+ 0.199745,0.824738,0.529065,11.872899,-141.848279,206.714015,
+ 0.199745,0.824738,0.529065,11.631954,-138.604944,201.749074,
+ 0.199745,0.824738,0.529065,11.467977,-140.563844,204.864635,
+ -0.996725,-0.080753,-0.004381,11.631954,-138.604944,201.749074,
+ -0.996725,-0.080753,-0.004381,11.872899,-141.848279,206.714015,
+ -0.996725,-0.080753,-0.004381,11.725655,-139.934708,204.941908,
+ -0.930129,-0.336735,-0.146523,12.4491,-143.427812,205.836936,
+ -0.930129,-0.336735,-0.146523,12.483782,-144.197804,207.386351,
+ -0.930129,-0.336735,-0.146523,11.91397,-143.033841,208.328533,
+ -0.95255,-0.256394,-0.164042,12.4491,-143.427812,205.836936,
+ -0.95255,-0.256394,-0.164042,11.91397,-143.033841,208.328533,
+ -0.95255,-0.256394,-0.164042,11.872899,-141.848279,206.714015,
+ 0.020373,-0.987258,-0.157819,15.437191,-144.531233,203.398578,
+ 0.020373,-0.987258,-0.157819,14.902365,-145.096482,206.865518,
+ 0.020373,-0.987258,-0.157819,14.13937,-145.083096,206.683288,
+ -0.453589,-0.832153,-0.319027,15.437191,-144.531233,203.398578,
+ -0.453589,-0.832153,-0.319027,14.13937,-145.083096,206.683288,
+ -0.453589,-0.832153,-0.319027,14.720135,-144.373645,204.007027,
+ 0.558181,-0.813146,-0.165008,16.370552,-143.556499,204.243105,
+ 0.558181,-0.813146,-0.165008,16.056896,-144.347482,207.079997,
+ 0.558181,-0.813146,-0.165008,14.902365,-145.096482,206.865518,
+ 0.722777,-0.69108,-0.001174,15.437191,-144.531233,203.398578,
+ 0.722777,-0.69108,-0.001174,16.370552,-143.556499,204.243105,
+ 0.722777,-0.69108,-0.001174,14.902365,-145.096482,206.865518,
+ 0.866174,0.450598,-0.216112,15.487693,-138.353654,205.510503,
+ 0.866174,0.450598,-0.216112,16.331915,-138.801473,207.960422,
+ 0.866174,0.450598,-0.216112,17.108904,-140.463146,207.609955,
+ 0.844643,0.519155,-0.130602,15.487693,-138.353654,205.510503,
+ 0.844643,0.519155,-0.130602,17.108904,-140.463146,207.609955,
+ 0.844643,0.519155,-0.130602,16.498934,-139.925277,205.803167,
+ -0.496082,0.72662,0.475316,16.331915,-138.801473,207.960422,
+ -0.496082,0.72662,0.475316,14.04354,-137.737904,203.946182,
+ -0.496082,0.72662,0.475316,14.537296,-138.538927,205.686041,
+ 0.341874,0.938211,0.053687,16.331915,-138.801473,207.960422,
+ 0.341874,0.938211,0.053687,15.487693,-138.353654,205.510503,
+ 0.341874,0.938211,0.053687,14.04354,-137.737904,203.946182,
+ -0.393141,0.695135,0.601853,14.537296,-138.538927,205.686041,
+ -0.393141,0.695135,0.601853,12.803826,-137.712654,203.599366,
+ -0.393141,0.695135,0.601853,13.762132,-138.706555,205.373298,
+ -0.105022,0.891674,0.440327,14.537296,-138.538927,205.686041,
+ -0.105022,0.891674,0.440327,14.04354,-137.737904,203.946182,
+ -0.105022,0.891674,0.440327,12.803826,-137.712654,203.599366,
+ -0.469283,0.879376,0.080442,30.293682,-91.84962,218.403834,
+ -0.469283,0.879376,0.080442,27.696215,-93.223193,218.266325,
+ -0.469283,0.879376,0.080442,30.219147,-91.995648,219.565363,
+ -0.998761,0.047402,-0.015118,26.860206,-96.305898,216.566319,
+ -0.998761,0.047402,-0.015118,26.774719,-97.518232,218.412657,
+ -0.998761,0.047402,-0.015118,26.838302,-96.093549,218.679157,
+ -0.999125,0.039301,-0.014308,26.860206,-96.305898,216.566319,
+ -0.999125,0.039301,-0.014308,26.838302,-96.093549,218.679157,
+ -0.999125,0.039301,-0.014308,26.908578,-94.878477,217.10936,
+ -0.977455,0.107066,-0.181985,27.059777,-98.521564,216.291301,
+ -0.977455,0.107066,-0.181985,26.718742,-99.089855,217.788693,
+ -0.977455,0.107066,-0.181985,26.774719,-97.518232,218.412657,
+ -0.992297,-0.07737,-0.096747,27.059777,-98.521564,216.291301,
+ -0.992297,-0.07737,-0.096747,26.774719,-97.518232,218.412657,
+ -0.992297,-0.07737,-0.096747,26.860206,-96.305898,216.566319,
+ 0.607605,0.563639,0.559578,35.24402,-93.265784,217.88574,
+ 0.607605,0.563639,0.559578,33.211802,-91.658871,218.473806,
+ 0.607605,0.563639,0.559578,32.610046,-91.836234,219.30586,
+ 0.603439,0.64199,0.472979,35.24402,-93.265784,217.88574,
+ 0.603439,0.64199,0.472979,32.610046,-91.836234,219.30586,
+ 0.603439,0.64199,0.472979,34.937058,-93.912565,219.155268,
+ 0.858857,0.341581,0.381689,35.24402,-93.265784,217.88574,
+ 0.858857,0.341581,0.381689,34.937058,-93.912565,219.155268,
+ 0.858857,0.341581,0.381689,35.456369,-95.229857,219.165612,
+ 0.944735,0.244475,0.218423,35.611523,-94.558738,217.743363,
+ 0.944735,0.244475,0.218423,35.24402,-93.265784,217.88574,
+ 0.944735,0.244475,0.218423,35.456369,-95.229857,219.165612,
+ -0.152634,0.974496,0.164499,32.72626,-91.244518,215.632047,
+ -0.152634,0.974496,0.164499,30.060646,-91.440743,214.321144,
+ -0.152634,0.974496,0.164499,30.019272,-91.676212,215.67768,
+ -0.02543,0.994938,-0.09722,32.72626,-91.244518,215.632047,
+ -0.02543,0.994938,-0.09722,32.572322,-91.398455,214.096931,
+ -0.02543,0.994938,-0.09722,30.060646,-91.440743,214.321144,
+ -0.436277,0.887527,0.148187,30.212758,-91.778127,216.899445,
+ -0.436277,0.887527,0.148187,28.076799,-92.527432,215.098741,
+ -0.436277,0.887527,0.148187,27.71173,-92.897064,216.237757,
+ -0.432645,0.890188,0.142773,30.212758,-91.778127,216.899445,
+ -0.432645,0.890188,0.142773,30.019272,-91.676212,215.67768,
+ -0.432645,0.890188,0.142773,28.076799,-92.527432,215.098741,
+ -0.996373,-0.074234,-0.041601,27.073163,-97.276374,214.233832,
+ -0.996373,-0.074234,-0.041601,27.083811,-98.091695,215.433692,
+ -0.996373,-0.074234,-0.041601,26.90584,-95.791455,215.591585,
+ 0.007067,-0.814677,-0.579872,32.229766,-99.598214,215.75039,
+ 0.007067,-0.814677,-0.579872,29.183263,-99.292468,215.28371,
+ 0.007067,-0.814677,-0.579872,32.106251,-98.705619,214.494856,
+ 0.037853,-0.863826,-0.502366,32.106251,-98.705619,214.494856,
+ 0.037853,-0.863826,-0.502366,29.183263,-99.292468,215.28371,
+ 0.037853,-0.863826,-0.502366,29.137325,-98.600054,214.089629,
+ 0.269872,-0.67618,-0.685529,34.499583,-97.3935,214.469301,
+ 0.269872,-0.67618,-0.685529,34.815672,-98.241677,215.430346,
+ 0.269872,-0.67618,-0.685529,32.229766,-99.598214,215.75039,
+ 0.39437,-0.730204,-0.557919,34.499583,-97.3935,214.469301,
+ 0.39437,-0.730204,-0.557919,32.229766,-99.598214,215.75039,
+ 0.39437,-0.730204,-0.557919,32.106251,-98.705619,214.494856,
+ 0.536663,0.842797,-0.041073,34.655042,-92.422779,216.65637,
+ 0.536663,0.842797,-0.041073,32.72626,-91.244518,215.632047,
+ 0.536663,0.842797,-0.041073,33.199024,-91.482117,216.933822,
+ 0.51291,0.858177,0.021345,34.655042,-92.422779,216.65637,
+ 0.51291,0.858177,0.021345,34.289364,-92.172706,215.389276,
+ 0.51291,0.858177,0.021345,32.72626,-91.244518,215.632047,
+ -0.099283,0.99019,0.098321,33.199024,-91.482117,216.933822,
+ -0.099283,0.99019,0.098321,30.019272,-91.676212,215.67768,
+ -0.099283,0.99019,0.098321,30.212758,-91.778127,216.899445,
+ -0.14949,0.961685,0.229816,33.199024,-91.482117,216.933822,
+ -0.14949,0.961685,0.229816,32.72626,-91.244518,215.632047,
+ -0.14949,0.961685,0.229816,30.019272,-91.676212,215.67768,
+ -0.468731,0.872697,0.136717,30.293682,-91.84962,218.403834,
+ -0.468731,0.872697,0.136717,27.71173,-92.897064,216.237757,
+ -0.468731,0.872697,0.136717,27.696215,-93.223193,218.266325,
+ -0.421926,0.904249,0.065669,30.293682,-91.84962,218.403834,
+ -0.421926,0.904249,0.065669,30.212758,-91.778127,216.899445,
+ -0.421926,0.904249,0.065669,27.71173,-92.897064,216.237757,
+ -0.994353,-0.081062,-0.068497,27.083811,-98.091695,215.433692,
+ -0.994353,-0.081062,-0.068497,27.059777,-98.521564,216.291301,
+ -0.994353,-0.081062,-0.068497,26.860206,-96.305898,216.566319,
+ -0.993918,-0.071129,-0.084072,27.083811,-98.091695,215.433692,
+ -0.993918,-0.071129,-0.084072,26.860206,-96.305898,216.566319,
+ -0.993918,-0.071129,-0.084072,26.90584,-95.791455,215.591585,
+ -0.026091,-0.839895,-0.542121,32.229766,-99.598214,215.75039,
+ -0.026091,-0.839895,-0.542121,31.922499,-100.106877,216.553238,
+ -0.026091,-0.839895,-0.542121,29.10812,-99.805999,216.222546,
+ -0.014351,-0.876756,-0.480722,32.229766,-99.598214,215.75039,
+ -0.014351,-0.876756,-0.480722,29.10812,-99.805999,216.222546,
+ -0.014351,-0.876756,-0.480722,29.183263,-99.292468,215.28371,
+ 0.196282,-0.710982,-0.675262,34.815672,-98.241677,215.430346,
+ 0.196282,-0.710982,-0.675262,34.582637,-99.171387,216.341498,
+ 0.196282,-0.710982,-0.675262,31.922499,-100.106877,216.553238,
+ 0.392242,-0.837482,-0.380487,34.815672,-98.241677,215.430346,
+ 0.392242,-0.837482,-0.380487,31.922499,-100.106877,216.553238,
+ 0.392242,-0.837482,-0.380487,32.229766,-99.598214,215.75039,
+ 0.632787,0.769853,0.083111,35.24402,-93.265784,217.88574,
+ 0.632787,0.769853,0.083111,33.199024,-91.482117,216.933822,
+ 0.632787,0.769853,0.083111,33.211802,-91.658871,218.473806,
+ 0.558265,0.784364,0.270396,35.24402,-93.265784,217.88574,
+ 0.558265,0.784364,0.270396,34.655042,-92.422779,216.65637,
+ 0.558265,0.784364,0.270396,33.199024,-91.482117,216.933822,
+ -0.066359,0.996495,0.050926,33.211802,-91.658871,218.473806,
+ -0.066359,0.996495,0.050926,30.212758,-91.778127,216.899445,
+ -0.066359,0.996495,0.050926,30.293682,-91.84962,218.403834,
+ -0.099297,0.988474,0.114278,33.211802,-91.658871,218.473806,
+ -0.099297,0.988474,0.114278,33.199024,-91.482117,216.933822,
+ -0.099297,0.988474,0.114278,30.212758,-91.778127,216.899445,
+ 0.842017,0.052229,-0.536916,34.000655,-93.955765,212.543561,
+ 0.842017,0.052229,-0.536916,34.704935,-94.235651,213.62082,
+ 0.842017,0.052229,-0.536916,34.754219,-95.480537,213.577011,
+ 0.883019,0.130923,-0.450707,34.000655,-93.955765,212.543561,
+ 0.883019,0.130923,-0.450707,34.754219,-95.480537,213.577011,
+ 0.883019,0.130923,-0.450707,34.158244,-94.967311,212.558468,
+ 0.71642,-0.3573,-0.599233,34.158244,-94.967311,212.558468,
+ 0.71642,-0.3573,-0.599233,34.754219,-95.480537,213.577011,
+ 0.71642,-0.3573,-0.599233,34.130255,-96.563272,213.476617,
+ 0.776117,-0.324623,-0.540612,33.720769,-95.889111,212.483933,
+ 0.776117,-0.324623,-0.540612,34.158244,-94.967311,212.558468,
+ 0.776117,-0.324623,-0.540612,34.130255,-96.563272,213.476617,
+ 0.92723,0.208364,-0.311175,34.704935,-94.235651,213.62082,
+ 0.92723,0.208364,-0.311175,35.241891,-94.715109,214.899779,
+ 0.92723,0.208364,-0.311175,35.490746,-96.21098,214.639667,
+ 0.837235,0.052301,-0.544337,34.754219,-95.480537,213.577011,
+ 0.837235,0.052301,-0.544337,34.704935,-94.235651,213.62082,
+ 0.837235,0.052301,-0.544337,35.490746,-96.21098,214.639667,
+ 0.599216,-0.402551,-0.692021,34.754219,-95.480537,213.577011,
+ 0.599216,-0.402551,-0.692021,35.490746,-96.21098,214.639667,
+ 0.599216,-0.402551,-0.692021,34.499583,-97.3935,214.469301,
+ 0.729139,-0.366609,-0.577888,34.130255,-96.563272,213.476617,
+ 0.729139,-0.366609,-0.577888,34.754219,-95.480537,213.577011,
+ 0.729139,-0.366609,-0.577888,34.499583,-97.3935,214.469301,
+ 0.956555,0.161826,-0.242517,35.241891,-94.715109,214.899779,
+ 0.956555,0.161826,-0.242517,35.686362,-95.342724,216.234107,
+ 0.956555,0.161826,-0.242517,35.841517,-96.959676,215.767122,
+ 0.966098,0.190939,-0.173775,35.490746,-96.21098,214.639667,
+ 0.966098,0.190939,-0.173775,35.241891,-94.715109,214.899779,
+ 0.966098,0.190939,-0.173775,35.841517,-96.959676,215.767122,
+ 0.727619,-0.445117,-0.521959,35.490746,-96.21098,214.639667,
+ 0.727619,-0.445117,-0.521959,35.841517,-96.959676,215.767122,
+ 0.727619,-0.445117,-0.521959,34.815672,-98.241677,215.430346,
+ 0.646697,-0.453714,-0.613129,34.499583,-97.3935,214.469301,
+ 0.646697,-0.453714,-0.613129,35.490746,-96.21098,214.639667,
+ 0.646697,-0.453714,-0.613129,34.815672,-98.241677,215.430346,
+ 0.994336,0.106054,0.007024,35.686362,-95.342724,216.234107,
+ 0.994336,0.106054,0.007024,35.795579,-96.461357,217.663048,
+ 0.994336,0.106054,0.007024,35.966249,-98.008641,216.864764,
+ 0.994801,0.100395,-0.017102,35.841517,-96.959676,215.767122,
+ 0.994801,0.100395,-0.017102,35.686362,-95.342724,216.234107,
+ 0.994801,0.100395,-0.017102,35.966249,-98.008641,216.864764,
+ 0.645608,-0.51412,-0.564686,35.841517,-96.959676,215.767122,
+ 0.645608,-0.51412,-0.564686,35.966249,-98.008641,216.864764,
+ 0.645608,-0.51412,-0.564686,34.582637,-99.171387,216.341498,
+ 0.77535,-0.530359,-0.342858,34.815672,-98.241677,215.430346,
+ 0.77535,-0.530359,-0.342858,35.841517,-96.959676,215.767122,
+ 0.77535,-0.530359,-0.342858,34.582637,-99.171387,216.341498,
+ 0.769068,0.399556,-0.498889,33.385514,-92.336683,212.830749,
+ 0.769068,0.399556,-0.498889,34.077624,-92.423691,213.827996,
+ 0.769068,0.399556,-0.498889,34.489848,-93.180297,213.857506,
+ 0.708825,0.673778,-0.208784,33.385514,-92.336683,212.830749,
+ 0.708825,0.673778,-0.208784,34.489848,-93.180297,213.857506,
+ 0.708825,0.673778,-0.208784,33.99305,-92.964602,212.866952,
+ 0.792922,0.575545,-0.200058,34.077624,-92.423691,213.827996,
+ 0.792922,0.575545,-0.200058,34.289364,-92.172706,215.389276,
+ 0.792922,0.575545,-0.200058,35.011289,-93.185165,215.337862,
+ 0.843655,0.448118,-0.295696,34.077624,-92.423691,213.827996,
+ 0.843655,0.448118,-0.295696,35.011289,-93.185165,215.337862,
+ 0.843655,0.448118,-0.295696,34.489848,-93.180297,213.857506,
+ 0.839843,0.524783,-0.138804,34.289364,-92.172706,215.389276,
+ 0.839843,0.524783,-0.138804,34.655042,-92.422779,216.65637,
+ 0.839843,0.524783,-0.138804,35.383659,-93.596476,216.627469,
+ 0.204587,-0.257163,0.944463,29.719307,-98.172618,219.624687,
+ 0.204587,-0.257163,0.944463,28.193317,-98.292787,219.922522,
+ 0.204587,-0.257163,0.944463,28.28428,-98.821529,219.75885,
+ 0.30124,-0.650292,0.697405,32.431771,-98.629868,218.784115,
+ 0.30124,-0.650292,0.697405,29.565065,-98.876593,219.792314,
+ 0.30124,-0.650292,0.697405,31.12969,-99.410203,218.618921,
+ 0.316034,0.153685,0.936218,29.719307,-98.172618,219.624687,
+ 0.316034,0.153685,0.936218,29.565065,-98.876593,219.792314,
+ 0.316034,0.153685,0.936218,32.431771,-98.629868,218.784115,
+ 0.295473,-0.657578,0.693028,29.565065,-98.876593,219.792314,
+ 0.295473,-0.657578,0.693028,28.873867,-99.598214,219.402299,
+ 0.295473,-0.657578,0.693028,31.12969,-99.410203,218.618921,
+ -0.042452,-0.443267,0.895384,28.28428,-98.821529,219.75885,
+ -0.042452,-0.443267,0.895384,28.873867,-99.598214,219.402299,
+ -0.042452,-0.443267,0.895384,29.565065,-98.876593,219.792314,
+ 0.89769,0.069125,-0.435171,33.99305,-92.964602,212.866952,
+ 0.89769,0.069125,-0.435171,34.489848,-93.180297,213.857506,
+ 0.89769,0.069125,-0.435171,34.458817,-93.68896,213.712695,
+ 0.835406,-0.094925,-0.541375,33.817512,-93.527417,212.694761,
+ 0.835406,-0.094925,-0.541375,33.99305,-92.964602,212.866952,
+ 0.835406,-0.094925,-0.541375,34.458817,-93.68896,213.712695,
+ 0.793213,0.429626,-0.431549,33.817512,-93.527417,212.694761,
+ 0.793213,0.429626,-0.431549,34.458817,-93.68896,213.712695,
+ 0.793213,0.429626,-0.431549,34.704935,-94.235651,213.62082,
+ 0.787929,0.47514,-0.391677,34.000655,-93.955765,212.543561,
+ 0.787929,0.47514,-0.391677,33.817512,-93.527417,212.694761,
+ 0.787929,0.47514,-0.391677,34.704935,-94.235651,213.62082,
+ 0.941286,0.064729,-0.331346,34.489848,-93.180297,213.857506,
+ 0.941286,0.064729,-0.331346,35.011289,-93.185165,215.337862,
+ 0.941286,0.064729,-0.331346,34.96748,-93.896746,215.074403,
+ 0.93802,0.040759,-0.344176,34.458817,-93.68896,213.712695,
+ 0.93802,0.040759,-0.344176,34.489848,-93.180297,213.857506,
+ 0.93802,0.040759,-0.344176,34.96748,-93.896746,215.074403,
+ 0.891213,0.358212,-0.278251,34.458817,-93.68896,213.712695,
+ 0.891213,0.358212,-0.278251,34.96748,-93.896746,215.074403,
+ 0.891213,0.358212,-0.278251,35.241891,-94.715109,214.899779,
+ 0.878487,0.43036,-0.207488,34.704935,-94.235651,213.62082,
+ 0.878487,0.43036,-0.207488,34.458817,-93.68896,213.712695,
+ 0.878487,0.43036,-0.207488,35.241891,-94.715109,214.899779,
+ 0.961498,0.009328,-0.274655,35.011289,-93.185165,215.337862,
+ 0.961498,0.009328,-0.274655,35.383659,-93.596476,216.627469,
+ 0.961498,0.009328,-0.274655,35.302127,-94.463515,216.312596,
+ 0.968453,0.031883,-0.24715,34.96748,-93.896746,215.074403,
+ 0.968453,0.031883,-0.24715,35.011289,-93.185165,215.337862,
+ 0.968453,0.031883,-0.24715,35.302127,-94.463515,216.312596,
+ 0.91255,0.404303,-0.06157,34.96748,-93.896746,215.074403,
+ 0.91255,0.404303,-0.06157,35.302127,-94.463515,216.312596,
+ 0.91255,0.404303,-0.06157,35.686362,-95.342724,216.234107,
+ 0.927754,0.342645,-0.147874,35.241891,-94.715109,214.899779,
+ 0.927754,0.342645,-0.147874,34.96748,-93.896746,215.074403,
+ 0.927754,0.342645,-0.147874,35.686362,-95.342724,216.234107,
+ 0.913857,-0.195981,-0.355607,35.383659,-93.596476,216.627469,
+ 0.913857,-0.195981,-0.355607,35.611523,-94.558738,217.743363,
+ 0.913857,-0.195981,-0.355607,35.444808,-95.3698,217.761921,
+ 0.99079,-0.04706,-0.126967,35.302127,-94.463515,216.312596,
+ 0.99079,-0.04706,-0.126967,35.383659,-93.596476,216.627469,
+ 0.99079,-0.04706,-0.126967,35.444808,-95.3698,217.761921,
+ 0.950398,0.297059,0.092192,35.302127,-94.463515,216.312596,
+ 0.950398,0.297059,0.092192,35.444808,-95.3698,217.761921,
+ 0.950398,0.297059,0.092192,35.795579,-96.461357,217.663048,
+ 0.90029,0.373489,0.223572,35.686362,-95.342724,216.234107,
+ 0.90029,0.373489,0.223572,35.302127,-94.463515,216.312596,
+ 0.90029,0.373489,0.223572,35.795579,-96.461357,217.663048,
+ 0.859652,0.235167,0.453535,35.795579,-96.461357,217.663048,
+ 0.859652,0.235167,0.453535,35.444808,-95.3698,217.761921,
+ 0.859652,0.235167,0.453535,35.404042,-97.176892,218.776205,
+ 0.881532,0.215804,0.419917,35.444808,-95.3698,217.761921,
+ 0.881532,0.215804,0.419917,35.147885,-96.136445,218.779247,
+ 0.881532,0.215804,0.419917,35.404042,-97.176892,218.776205,
+ 0.971115,-0.196517,0.135342,35.611523,-94.558738,217.743363,
+ 0.971115,-0.196517,0.135342,35.147885,-96.136445,218.779247,
+ 0.971115,-0.196517,0.135342,35.444808,-95.3698,217.761921,
+ 0.951078,-0.306252,-0.040758,35.611523,-94.558738,217.743363,
+ 0.951078,-0.306252,-0.040758,35.456369,-95.229857,219.165612,
+ 0.951078,-0.306252,-0.040758,35.147885,-96.136445,218.779247,
+ 0.704086,0.107887,0.701871,35.147885,-96.136445,218.779247,
+ 0.704086,0.107887,0.701871,34.139077,-95.971251,219.765847,
+ 0.704086,0.107887,0.701871,34.774906,-97.421184,219.350885,
+ 0.572637,-0.478534,0.665652,35.456369,-95.229857,219.165612,
+ 0.572637,-0.478534,0.665652,34.139077,-95.971251,219.765847,
+ 0.572637,-0.478534,0.665652,35.147885,-96.136445,218.779247,
+ 0.633225,0.153681,0.758557,35.147885,-96.136445,218.779247,
+ 0.633225,0.153681,0.758557,34.774906,-97.421184,219.350885,
+ 0.633225,0.153681,0.758557,35.404042,-97.176892,218.776205,
+ -0.261674,0.964908,-0.021909,29.839779,-91.205273,213.05192,
+ -0.261674,0.964908,-0.021909,27.926817,-91.766871,211.166034,
+ -0.261674,0.964908,-0.021909,27.772271,-91.777215,212.556339,
+ -0.261762,0.964886,-0.021813,27.926817,-91.766871,211.166034,
+ -0.261762,0.964886,-0.021813,29.839779,-91.205273,213.05192,
+ -0.261762,0.964886,-0.021813,29.680974,-91.281937,211.566393,
+ -0.965035,-0.111381,-0.237279,27.264216,-93.793918,210.548458,
+ -0.965035,-0.111381,-0.237279,27.205501,-96.011105,211.828026,
+ -0.965035,-0.111381,-0.237279,26.990719,-94.165071,211.835023,
+ -0.965122,-0.111218,-0.237002,27.205501,-96.011105,211.828026,
+ -0.965122,-0.111218,-0.237002,27.264216,-93.793918,210.548458,
+ -0.965122,-0.111218,-0.237002,27.445534,-95.362803,210.546329,
+ 0.165983,-0.824966,-0.54026,31.09866,-96.282168,211.013009,
+ 0.165983,-0.824966,-0.54026,28.860481,-97.204272,211.733412,
+ 0.165983,-0.824966,-0.54026,28.85105,-96.358833,210.439546,
+ 0.166012,-0.824995,-0.540207,28.860481,-97.204272,211.733412,
+ 0.166012,-0.824995,-0.540207,31.09866,-96.282168,211.013009,
+ 0.166012,-0.824995,-0.540207,31.527616,-97.134909,212.447122,
+ 0.418389,-0.720214,-0.553392,33.070337,-95.336639,211.27312,
+ 0.418389,-0.720214,-0.553392,31.527616,-97.134909,212.447122,
+ 0.418389,-0.720214,-0.553392,31.09866,-96.282168,211.013009,
+ 0.4184,-0.720217,-0.55338,31.527616,-97.134909,212.447122,
+ 0.4184,-0.720217,-0.55338,33.070337,-95.336639,211.27312,
+ 0.4184,-0.720217,-0.55338,33.720769,-95.889111,212.483933,
+ 0.606447,0.757254,-0.242463,32.234937,-91.350084,213.034275,
+ 0.606447,0.757254,-0.242463,32.68884,-92.241157,211.386596,
+ 0.606447,0.757254,-0.242463,31.704066,-91.405453,211.533536,
+ 0.606444,0.757256,-0.242464,32.68884,-92.241157,211.386596,
+ 0.606444,0.757256,-0.242464,32.234937,-91.350084,213.034275,
+ 0.606444,0.757256,-0.242464,33.385514,-92.336683,212.830749,
+ -0.34071,0.900535,0.270097,30.060646,-91.440743,214.321144,
+ -0.34071,0.900535,0.270097,27.772271,-91.777215,212.556339,
+ -0.34071,0.900535,0.270097,27.823989,-92.120076,213.764718,
+ -0.309552,0.923817,0.225256,30.060646,-91.440743,214.321144,
+ -0.309552,0.923817,0.225256,29.839779,-91.205273,213.05192,
+ -0.309552,0.923817,0.225256,27.772271,-91.777215,212.556339,
+ -0.995569,-0.084517,-0.041218,27.205501,-96.011105,211.828026,
+ -0.995569,-0.084517,-0.041218,27.210369,-96.622291,212.963695,
+ -0.995569,-0.084517,-0.041218,27.04122,-94.667042,213.040055,
+ -0.993281,-0.115542,-0.006503,27.205501,-96.011105,211.828026,
+ -0.993281,-0.115542,-0.006503,27.04122,-94.667042,213.040055,
+ -0.993281,-0.115542,-0.006503,26.990719,-94.165071,211.835023,
+ 0.126283,-0.794571,-0.593894,31.864696,-97.827628,213.445586,
+ 0.126283,-0.794571,-0.593894,29.078914,-97.834929,212.862997,
+ 0.126283,-0.794571,-0.593894,31.527616,-97.134909,212.447122,
+ 0.157058,-0.849061,-0.504409,31.527616,-97.134909,212.447122,
+ 0.157058,-0.849061,-0.504409,29.078914,-97.834929,212.862997,
+ 0.157058,-0.849061,-0.504409,28.860481,-97.204272,211.733412,
+ 0.388075,-0.680114,-0.621968,34.130255,-96.563272,213.476617,
+ 0.388075,-0.680114,-0.621968,31.864696,-97.827628,213.445586,
+ 0.388075,-0.680114,-0.621968,33.720769,-95.889111,212.483933,
+ 0.399172,-0.6847,-0.609794,33.720769,-95.889111,212.483933,
+ 0.399172,-0.6847,-0.609794,31.864696,-97.827628,213.445586,
+ 0.399172,-0.6847,-0.609794,31.527616,-97.134909,212.447122,
+ 0.541361,0.830028,-0.134095,34.077624,-92.423691,213.827996,
+ 0.541361,0.830028,-0.134095,32.234937,-91.350084,213.034275,
+ 0.541361,0.830028,-0.134095,32.572322,-91.398455,214.096931,
+ 0.578038,0.743487,-0.336303,34.077624,-92.423691,213.827996,
+ 0.578038,0.743487,-0.336303,33.385514,-92.336683,212.830749,
+ 0.578038,0.743487,-0.336303,32.234937,-91.350084,213.034275,
+ -0.000266,0.983214,0.182455,32.572322,-91.398455,214.096931,
+ -0.000266,0.983214,0.182455,29.839779,-91.205273,213.05192,
+ -0.000266,0.983214,0.182455,30.060646,-91.440743,214.321144,
+ 0.060521,0.997823,0.026205,32.572322,-91.398455,214.096931,
+ 0.060521,0.997823,0.026205,32.234937,-91.350084,213.034275,
+ 0.060521,0.997823,0.026205,29.839779,-91.205273,213.05192,
+ -0.460428,0.820865,0.337914,30.019272,-91.676212,215.67768,
+ -0.460428,0.820865,0.337914,27.823989,-92.120076,213.764718,
+ -0.460428,0.820865,0.337914,28.076799,-92.527432,215.098741,
+ -0.32174,0.934483,0.152396,30.060646,-91.440743,214.321144,
+ -0.32174,0.934483,0.152396,27.823989,-92.120076,213.764718,
+ -0.32174,0.934483,0.152396,30.019272,-91.676212,215.67768,
+ -0.993698,-0.009875,-0.111658,27.040611,-95.208257,214.340614,
+ -0.993698,-0.009875,-0.111658,27.073163,-97.276374,214.233832,
+ -0.993698,-0.009875,-0.111658,26.90584,-95.791455,215.591585,
+ -0.993614,-0.009836,-0.112399,27.073163,-97.276374,214.233832,
+ -0.993614,-0.009836,-0.112399,27.040611,-95.208257,214.340614,
+ -0.993614,-0.009836,-0.112399,27.210369,-96.622291,212.963695,
+ -0.995761,-0.084748,-0.035733,27.210369,-96.622291,212.963695,
+ -0.995761,-0.084748,-0.035733,27.040611,-95.208257,214.340614,
+ -0.995761,-0.084748,-0.035733,27.04122,-94.667042,213.040055,
+ 0.061589,-0.758446,-0.648819,32.106251,-98.705619,214.494856,
+ 0.061589,-0.758446,-0.648819,29.137325,-98.600054,214.089629,
+ 0.061589,-0.758446,-0.648819,31.864696,-97.827628,213.445586,
+ 0.112984,-0.840613,-0.529721,31.864696,-97.827628,213.445586,
+ 0.112984,-0.840613,-0.529721,29.137325,-98.600054,214.089629,
+ 0.112984,-0.840613,-0.529721,29.078914,-97.834929,212.862997,
+ 0.349503,-0.650631,-0.674186,34.130255,-96.563272,213.476617,
+ 0.349503,-0.650631,-0.674186,34.499583,-97.3935,214.469301,
+ 0.349503,-0.650631,-0.674186,32.106251,-98.705619,214.494856,
+ 0.379712,-0.664599,-0.643527,34.130255,-96.563272,213.476617,
+ 0.379712,-0.664599,-0.643527,32.106251,-98.705619,214.494856,
+ 0.379712,-0.664599,-0.643527,31.864696,-97.827628,213.445586,
+ 0.490226,0.860999,-0.135497,34.289364,-92.172706,215.389276,
+ 0.490226,0.860999,-0.135497,32.572322,-91.398455,214.096931,
+ 0.490226,0.860999,-0.135497,32.72626,-91.244518,215.632047,
+ 0.525912,0.825697,-0.20406,34.289364,-92.172706,215.389276,
+ 0.525912,0.825697,-0.20406,34.077624,-92.423691,213.827996,
+ 0.525912,0.825697,-0.20406,32.572322,-91.398455,214.096931,
+ 0.812056,0.581518,-0.049008,35.011289,-93.185165,215.337862,
+ 0.812056,0.581518,-0.049008,34.289364,-92.172706,215.389276,
+ 0.812056,0.581518,-0.049008,35.383659,-93.596476,216.627469,
+ 0.925294,0.289924,-0.244491,34.655042,-92.422779,216.65637,
+ 0.925294,0.289924,-0.244491,35.24402,-93.265784,217.88574,
+ 0.925294,0.289924,-0.244491,35.611523,-94.558738,217.743363,
+ 0.821812,0.50361,0.266461,35.383659,-93.596476,216.627469,
+ 0.821812,0.50361,0.266461,34.655042,-92.422779,216.65637,
+ 0.821812,0.50361,0.266461,35.611523,-94.558738,217.743363,
+ -0.342965,-0.846846,-0.406481,29.078914,-97.834929,212.862997,
+ -0.342965,-0.846846,-0.406481,27.964845,-97.426965,212.953047,
+ -0.342965,-0.846846,-0.406481,28.860481,-97.204272,211.733412,
+ -0.361773,-0.833387,-0.417835,28.860481,-97.204272,211.733412,
+ -0.361773,-0.833387,-0.417835,27.964845,-97.426965,212.953047,
+ -0.361773,-0.833387,-0.417835,27.855933,-96.812431,211.821637,
+ -0.700632,-0.653124,-0.287304,27.855933,-96.812431,211.821637,
+ -0.700632,-0.653124,-0.287304,27.964845,-97.426965,212.953047,
+ -0.700632,-0.653124,-0.287304,27.210369,-96.622291,212.963695,
+ -0.737454,-0.596054,-0.317619,27.855933,-96.812431,211.821637,
+ -0.737454,-0.596054,-0.317619,27.210369,-96.622291,212.963695,
+ -0.737454,-0.596054,-0.317619,27.205501,-96.011105,211.828026,
+ -0.344117,-0.803923,-0.485068,29.137325,-98.600054,214.089629,
+ -0.344117,-0.803923,-0.485068,27.837983,-98.130331,214.232919,
+ -0.344117,-0.803923,-0.485068,29.078914,-97.834929,212.862997,
+ -0.335727,-0.811071,-0.47901,29.078914,-97.834929,212.862997,
+ -0.335727,-0.811071,-0.47901,27.837983,-98.130331,214.232919,
+ -0.335727,-0.811071,-0.47901,27.964845,-97.426965,212.953047,
+ -0.681955,-0.610341,-0.403015,27.964845,-97.426965,212.953047,
+ -0.681955,-0.610341,-0.403015,27.837983,-98.130331,214.232919,
+ -0.681955,-0.610341,-0.403015,27.073163,-97.276374,214.233832,
+ -0.672819,-0.625622,-0.394857,27.964845,-97.426965,212.953047,
+ -0.672819,-0.625622,-0.394857,27.073163,-97.276374,214.233832,
+ -0.672819,-0.625622,-0.394857,27.210369,-96.622291,212.963695,
+ -0.357751,-0.813733,-0.458098,29.183263,-99.292468,215.28371,
+ -0.357751,-0.813733,-0.458098,27.998918,-98.827613,215.382887,
+ -0.357751,-0.813733,-0.458098,29.137325,-98.600054,214.089629,
+ -0.347062,-0.822685,-0.450264,29.137325,-98.600054,214.089629,
+ -0.347062,-0.822685,-0.450264,27.998918,-98.827613,215.382887,
+ -0.347062,-0.822685,-0.450264,27.837983,-98.130331,214.232919,
+ -0.598246,-0.719571,-0.352589,27.998918,-98.827613,215.382887,
+ -0.598246,-0.719571,-0.352589,27.083811,-98.091695,215.433692,
+ -0.598246,-0.719571,-0.352589,27.837983,-98.130331,214.232919,
+ -0.680396,-0.608939,-0.407744,27.837983,-98.130331,214.232919,
+ -0.680396,-0.608939,-0.407744,27.083811,-98.091695,215.433692,
+ -0.680396,-0.608939,-0.407744,27.073163,-97.276374,214.233832,
+ -0.330639,-0.816594,-0.47313,29.183263,-99.292468,215.28371,
+ -0.330639,-0.816594,-0.47313,29.10812,-99.805999,216.222546,
+ -0.330639,-0.816594,-0.47313,27.898828,-99.358485,216.295256,
+ -0.352482,-0.791533,-0.499231,29.183263,-99.292468,215.28371,
+ -0.352482,-0.791533,-0.499231,27.898828,-99.358485,216.295256,
+ -0.352482,-0.791533,-0.499231,27.998918,-98.827613,215.382887,
+ -0.633133,-0.636823,-0.439999,27.998918,-98.827613,215.382887,
+ -0.633133,-0.636823,-0.439999,27.898828,-99.358485,216.295256,
+ -0.633133,-0.636823,-0.439999,27.059777,-98.521564,216.291301,
+ -0.59377,-0.712541,-0.373795,27.998918,-98.827613,215.382887,
+ -0.59377,-0.712541,-0.373795,27.059777,-98.521564,216.291301,
+ -0.59377,-0.712541,-0.373795,27.083811,-98.091695,215.433692,
+ -0.998561,0.019474,0.04996,26.990719,-94.165071,211.835023,
+ -0.998561,0.019474,0.04996,27.04122,-94.667042,213.040055,
+ -0.998561,0.019474,0.04996,27.086853,-93.299553,213.419119,
+ -0.998346,0.006313,0.057138,26.990719,-94.165071,211.835023,
+ -0.998346,0.006313,0.057138,27.086853,-93.299553,213.419119,
+ -0.998346,0.006313,0.057138,27.018403,-92.876377,212.176362,
+ -0.85567,0.473694,0.208429,27.018403,-92.876377,212.176362,
+ -0.85567,0.473694,0.208429,27.086853,-93.299553,213.419119,
+ -0.85567,0.473694,0.208429,27.823989,-92.120076,213.764718,
+ -0.83912,0.512802,0.181414,27.018403,-92.876377,212.176362,
+ -0.83912,0.512802,0.181414,27.823989,-92.120076,213.764718,
+ -0.83912,0.512802,0.181414,27.772271,-91.777215,212.556339,
+ -0.999136,0.038537,0.01557,27.04122,-94.667042,213.040055,
+ -0.999136,0.038537,0.01557,27.040611,-95.208257,214.340614,
+ -0.999136,0.038537,0.01557,27.100239,-93.826774,214.747666,
+ -0.9994,0.027531,0.020995,27.04122,-94.667042,213.040055,
+ -0.9994,0.027531,0.020995,27.100239,-93.826774,214.747666,
+ -0.9994,0.027531,0.020995,27.086853,-93.299553,213.419119,
+ -0.807139,0.545899,0.224767,27.086853,-93.299553,213.419119,
+ -0.807139,0.545899,0.224767,27.100239,-93.826774,214.747666,
+ -0.807139,0.545899,0.224767,28.076799,-92.527432,215.098741,
+ -0.846647,0.44252,0.295575,27.086853,-93.299553,213.419119,
+ -0.846647,0.44252,0.295575,28.076799,-92.527432,215.098741,
+ -0.846647,0.44252,0.295575,27.823989,-92.120076,213.764718,
+ -0.99511,0.057143,-0.080567,27.040611,-95.208257,214.340614,
+ -0.99511,0.057143,-0.080567,26.90584,-95.791455,215.591585,
+ -0.99511,0.057143,-0.080567,26.958775,-94.162333,216.093251,
+ -0.993809,0.068637,-0.087365,27.040611,-95.208257,214.340614,
+ -0.993809,0.068637,-0.087365,26.958775,-94.162333,216.093251,
+ -0.993809,0.068637,-0.087365,27.100239,-93.826774,214.747666,
+ -0.860595,0.508001,0.036208,27.100239,-93.826774,214.747666,
+ -0.860595,0.508001,0.036208,26.958775,-94.162333,216.093251,
+ -0.860595,0.508001,0.036208,27.71173,-92.897064,216.237757,
+ -0.790865,0.60945,-0.055704,27.100239,-93.826774,214.747666,
+ -0.790865,0.60945,-0.055704,27.71173,-92.897064,216.237757,
+ -0.790865,0.60945,-0.055704,28.076799,-92.527432,215.098741,
+ -0.998785,0.043001,-0.024064,26.90584,-95.791455,215.591585,
+ -0.998785,0.043001,-0.024064,26.860206,-96.305898,216.566319,
+ -0.998785,0.043001,-0.024064,26.908578,-94.878477,217.10936,
+ -0.998996,0.039159,-0.021753,26.90584,-95.791455,215.591585,
+ -0.998996,0.039159,-0.021753,26.908578,-94.878477,217.10936,
+ -0.998996,0.039159,-0.021753,26.958775,-94.162333,216.093251,
+ -0.931042,0.318346,0.178372,26.958775,-94.162333,216.093251,
+ -0.931042,0.318346,0.178372,26.908578,-94.878477,217.10936,
+ -0.931042,0.318346,0.178372,27.696215,-93.223193,218.266325,
+ -0.860677,0.503688,0.074394,26.958775,-94.162333,216.093251,
+ -0.860677,0.503688,0.074394,27.696215,-93.223193,218.266325,
+ -0.860677,0.503688,0.074394,27.71173,-92.897064,216.237757,
+ -0.052932,0.991213,0.121219,32.610046,-91.836234,219.30586,
+ -0.052932,0.991213,0.121219,30.293682,-91.84962,218.403834,
+ -0.052932,0.991213,0.121219,30.219147,-91.995648,219.565363,
+ -0.068215,0.984666,0.16056,33.211802,-91.658871,218.473806,
+ -0.068215,0.984666,0.16056,30.293682,-91.84962,218.403834,
+ -0.068215,0.984666,0.16056,32.610046,-91.836234,219.30586,
+ -0.475249,0.874532,0.096606,30.219147,-91.995648,219.565363,
+ -0.475249,0.874532,0.096606,27.696215,-93.223193,218.266325,
+ -0.475249,0.874532,0.096606,27.5943,-93.425806,219.599132,
+ -0.999179,0.022115,0.033935,26.718742,-99.089855,217.788693,
+ -0.999179,0.022115,0.033935,26.793277,-98.082568,219.326851,
+ -0.999179,0.022115,0.033935,26.774719,-97.518232,218.412657,
+ -0.999048,0.02503,0.035731,26.774719,-97.518232,218.412657,
+ -0.999048,0.02503,0.035731,26.793277,-98.082568,219.326851,
+ -0.999048,0.02503,0.035731,26.848037,-97.245343,220.271468,
+ -0.998697,0.038253,0.033776,26.774719,-97.518232,218.412657,
+ -0.998697,0.038253,0.033776,26.848037,-97.245343,220.271468,
+ -0.998697,0.038253,0.033776,26.838302,-96.093549,218.679157,
+ -0.931515,0.287967,0.222158,26.908578,-94.878477,217.10936,
+ -0.931515,0.287967,0.222158,27.272735,-95.108471,218.934402,
+ -0.931515,0.287967,0.222158,27.696215,-93.223193,218.266325,
+ -0.977957,0.204173,-0.043743,27.696215,-93.223193,218.266325,
+ -0.977957,0.204173,-0.043743,27.272735,-95.108471,218.934402,
+ -0.977957,0.204173,-0.043743,27.5943,-93.425806,219.599132,
+ -0.911671,0.343701,0.225222,26.908578,-94.878477,217.10936,
+ -0.911671,0.343701,0.225222,26.838302,-96.093549,218.679157,
+ -0.911671,0.343701,0.225222,27.272735,-95.108471,218.934402,
+ -0.967678,0.201488,0.151662,26.838302,-96.093549,218.679157,
+ -0.967678,0.201488,0.151662,26.848037,-97.245343,220.271468,
+ -0.967678,0.201488,0.151662,27.148307,-95.653033,220.071896,
+ -0.919582,0.38398,0.083235,26.838302,-96.093549,218.679157,
+ -0.919582,0.38398,0.083235,27.148307,-95.653033,220.071896,
+ -0.919582,0.38398,0.083235,27.272735,-95.108471,218.934402,
+ -0.981433,0.191151,-0.015845,27.272735,-95.108471,218.934402,
+ -0.981433,0.191151,-0.015845,27.148307,-95.653033,220.071896,
+ -0.981433,0.191151,-0.015845,27.491776,-93.841985,220.645663,
+ -0.980673,0.194766,-0.018618,27.272735,-95.108471,218.934402,
+ -0.980673,0.194766,-0.018618,27.491776,-93.841985,220.645663,
+ -0.980673,0.194766,-0.018618,27.5943,-93.425806,219.599132,
+ -0.553297,0.791221,0.260445,28.389238,-93.184252,220.554092,
+ -0.553297,0.791221,0.260445,27.5943,-93.425806,219.599132,
+ -0.553297,0.791221,0.260445,27.491776,-93.841985,220.645663,
+ -0.469619,0.865976,0.17188,30.219147,-91.995648,219.565363,
+ -0.469619,0.865976,0.17188,27.5943,-93.425806,219.599132,
+ -0.469619,0.865976,0.17188,28.389238,-93.184252,220.554092,
+ 0.133051,0.51653,0.845869,30.219147,-91.995648,219.565363,
+ 0.133051,0.51653,0.845869,30.143091,-93.6774,220.604289,
+ 0.133051,0.51653,0.845869,32.226115,-94.157162,220.569607,
+ 0.064337,0.468986,0.880859,32.610046,-91.836234,219.30586,
+ 0.064337,0.468986,0.880859,30.219147,-91.995648,219.565363,
+ 0.064337,0.468986,0.880859,32.226115,-94.157162,220.569607,
+ 0.320921,0.411416,0.85308,32.610046,-91.836234,219.30586,
+ 0.320921,0.411416,0.85308,32.226115,-94.157162,220.569607,
+ 0.320921,0.411416,0.85308,33.999743,-94.745836,220.186285,
+ 0.450287,0.448662,0.771974,32.610046,-91.836234,219.30586,
+ 0.450287,0.448662,0.771974,33.999743,-94.745836,220.186285,
+ 0.450287,0.448662,0.771974,34.937058,-93.912565,219.155268,
+ 0.781282,-0.121241,0.61229,34.937058,-93.912565,219.155268,
+ 0.781282,-0.121241,0.61229,33.999743,-94.745836,220.186285,
+ 0.781282,-0.121241,0.61229,34.139077,-95.971251,219.765847,
+ 0.342897,0.14247,0.928506,34.937058,-93.912565,219.155268,
+ 0.342897,0.14247,0.928506,34.139077,-95.971251,219.765847,
+ 0.342897,0.14247,0.928506,35.456369,-95.229857,219.165612,
+ 0.703339,-0.22537,0.674183,34.758782,-99.324412,218.731484,
+ 0.703339,-0.22537,0.674183,35.404042,-97.176892,218.776205,
+ 0.703339,-0.22537,0.674183,34.774906,-97.421184,219.350885,
+ 0.698678,-0.224079,0.67944,35.385485,-99.352705,218.077706,
+ 0.698678,-0.224079,0.67944,35.404042,-97.176892,218.776205,
+ 0.698678,-0.224079,0.67944,34.758782,-99.324412,218.731484,
+ 0.258386,-0.922239,0.287596,35.385485,-99.352705,218.077706,
+ 0.258386,-0.922239,0.287596,34.758782,-99.324412,218.731484,
+ 0.258386,-0.922239,0.287596,33.271125,-99.928297,218.131554,
+ 0.263028,-0.950986,0.16261,35.385485,-99.352705,218.077706,
+ 0.263028,-0.950986,0.16261,33.271125,-99.928297,218.131554,
+ 0.263028,-0.950986,0.16261,33.690955,-99.964804,217.238959,
+ -0.028471,-0.995023,0.095489,29.128807,-100.318313,218.44095,
+ -0.028471,-0.995023,0.095489,28.049115,-100.261727,218.708667,
+ -0.028471,-0.995023,0.095489,28.96483,-100.397411,217.567826,
+ -0.124768,-0.992026,0.017838,28.96483,-100.397411,217.567826,
+ -0.124768,-0.992026,0.017838,28.049115,-100.261727,218.708667,
+ -0.124768,-0.992026,0.017838,27.736372,-100.240735,217.688603,
+ 0.138823,-0.924652,0.354608,31.968133,-100.345997,217.257213,
+ 0.138823,-0.924652,0.354608,31.766128,-100.133648,217.89,
+ 0.138823,-0.924652,0.354608,29.128807,-100.318313,218.44095,
+ 0.02588,-0.996013,0.085371,31.968133,-100.345997,217.257213,
+ 0.02588,-0.996013,0.085371,29.128807,-100.318313,218.44095,
+ 0.02588,-0.996013,0.085371,28.96483,-100.397411,217.567826,
+ 0.119334,-0.988149,0.096544,33.690955,-99.964804,217.238959,
+ 0.119334,-0.988149,0.096544,33.271125,-99.928297,218.131554,
+ 0.119334,-0.988149,0.096544,31.766128,-100.133648,217.89,
+ 0.20448,-0.906467,0.369466,33.690955,-99.964804,217.238959,
+ 0.20448,-0.906467,0.369466,31.766128,-100.133648,217.89,
+ 0.20448,-0.906467,0.369466,31.968133,-100.345997,217.257213,
+ -0.60529,-0.777733,0.169572,28.049115,-100.261727,218.708667,
+ -0.60529,-0.777733,0.169572,27.169298,-99.427544,219.394085,
+ -0.60529,-0.777733,0.169572,27.736372,-100.240735,217.688603,
+ -0.744355,-0.66419,0.069194,27.736372,-100.240735,217.688603,
+ -0.744355,-0.66419,0.069194,27.169298,-99.427544,219.394085,
+ -0.744355,-0.66419,0.069194,26.718742,-99.089855,217.788693,
+ -0.767704,-0.183946,0.613835,26.793277,-98.082568,219.326851,
+ -0.767704,-0.183946,0.613835,27.169298,-99.427544,219.394085,
+ -0.767704,-0.183946,0.613835,27.228318,-98.213993,219.831559,
+ -0.756831,-0.322903,0.568279,26.793277,-98.082568,219.326851,
+ -0.756831,-0.322903,0.568279,27.228318,-98.213993,219.831559,
+ -0.756831,-0.322903,0.568279,27.281253,-97.347562,220.394374,
+ -0.343371,-0.692896,0.634028,27.281253,-97.347562,220.394374,
+ -0.343371,-0.692896,0.634028,26.848037,-97.245343,220.271468,
+ -0.343371,-0.692896,0.634028,26.793277,-98.082568,219.326851,
+ 0.059901,0.996528,-0.057832,29.839779,-91.205273,213.05192,
+ 0.059901,0.996528,-0.057832,31.704066,-91.405453,211.533536,
+ 0.059901,0.996528,-0.057832,29.680974,-91.281937,211.566393,
+ 0.059823,0.996527,-0.057928,31.704066,-91.405453,211.533536,
+ 0.059823,0.996527,-0.057928,29.839779,-91.205273,213.05192,
+ 0.059823,0.996527,-0.057928,32.234937,-91.350084,213.034275,
+ 0.766672,-0.31879,-0.557303,33.720769,-95.889111,212.483933,
+ 0.766672,-0.31879,-0.557303,33.450009,-94.536834,211.33792,
+ 0.766672,-0.31879,-0.557303,34.158244,-94.967311,212.558468,
+ 0.766672,-0.318791,-0.557303,33.450009,-94.536834,211.33792,
+ 0.766672,-0.318791,-0.557303,33.720769,-95.889111,212.483933,
+ 0.766672,-0.318791,-0.557303,33.070337,-95.336639,211.27312,
+ 0.876805,0.129774,-0.463004,33.450009,-94.536834,211.33792,
+ 0.876805,0.129774,-0.463004,34.000655,-93.955765,212.543561,
+ 0.876805,0.129774,-0.463004,34.158244,-94.967311,212.558468,
+ 0.876862,0.129598,-0.462945,34.000655,-93.955765,212.543561,
+ 0.876862,0.129598,-0.462945,33.450009,-94.536834,211.33792,
+ 0.876862,0.129598,-0.462945,33.185334,-93.603473,211.097887,
+ 0.69568,0.656253,-0.292166,33.199329,-92.772637,211.408196,
+ 0.69568,0.656253,-0.292166,33.385514,-92.336683,212.830749,
+ 0.69568,0.656253,-0.292166,33.99305,-92.964602,212.866952,
+ 0.695641,0.656292,-0.292172,33.385514,-92.336683,212.830749,
+ 0.695641,0.656292,-0.292172,33.199329,-92.772637,211.408196,
+ 0.695641,0.656292,-0.292172,32.68884,-92.241157,211.386596,
+ -0.706099,-0.569784,-0.420442,27.445534,-95.362803,210.546329,
+ -0.706099,-0.569784,-0.420442,27.855933,-96.812431,211.821637,
+ -0.706099,-0.569784,-0.420442,27.205501,-96.011105,211.828026,
+ -0.70608,-0.569794,-0.42046,27.855933,-96.812431,211.821637,
+ -0.70608,-0.569794,-0.42046,27.445534,-95.362803,210.546329,
+ -0.70608,-0.569794,-0.42046,28.000135,-96.032096,210.521991,
+ -0.351049,-0.78507,-0.510323,28.000135,-96.032096,210.521991,
+ -0.351049,-0.78507,-0.510323,28.860481,-97.204272,211.733412,
+ -0.351049,-0.78507,-0.510323,27.855933,-96.812431,211.821637,
+ -0.350907,-0.785069,-0.510423,28.860481,-97.204272,211.733412,
+ -0.350907,-0.785069,-0.510423,28.000135,-96.032096,210.521991,
+ -0.350907,-0.785069,-0.510423,28.85105,-96.358833,210.439546,
+ -0.807637,0.583458,-0.085436,27.926817,-91.766871,211.166034,
+ -0.807637,0.583458,-0.085436,27.018403,-92.876377,212.176362,
+ -0.807637,0.583458,-0.085436,27.772271,-91.777215,212.556339,
+ -0.807665,0.583408,-0.085516,27.018403,-92.876377,212.176362,
+ -0.807665,0.583408,-0.085516,27.926817,-91.766871,211.166034,
+ -0.807665,0.583408,-0.085516,27.269388,-92.711792,210.928739,
+ -0.979665,0.070774,-0.187743,27.269388,-92.711792,210.928739,
+ -0.979665,0.070774,-0.187743,26.990719,-94.165071,211.835023,
+ -0.979665,0.070774,-0.187743,27.018403,-92.876377,212.176362,
+ -0.979648,0.070699,-0.187858,26.990719,-94.165071,211.835023,
+ -0.979648,0.070699,-0.187858,27.269388,-92.711792,210.928739,
+ -0.979648,0.070699,-0.187858,27.264216,-93.793918,210.548458,
+ 0.849842,0.456394,-0.263578,33.192027,-93.211328,211.225357,
+ 0.849842,0.456394,-0.263578,33.817512,-93.527417,212.694761,
+ 0.849842,0.456394,-0.263578,34.000655,-93.955765,212.543561,
+ 0.876767,0.135069,-0.461558,33.185334,-93.603473,211.097887,
+ 0.876767,0.135069,-0.461558,33.192027,-93.211328,211.225357,
+ 0.876767,0.135069,-0.461558,34.000655,-93.955765,212.543561,
+ 0.865175,-0.120948,-0.486665,33.199329,-92.772637,211.408196,
+ 0.865175,-0.120948,-0.486665,33.99305,-92.964602,212.866952,
+ 0.865175,-0.120948,-0.486665,33.817512,-93.527417,212.694761,
+ 0.921765,0.135999,-0.363115,33.192027,-93.211328,211.225357,
+ 0.921765,0.135999,-0.363115,33.199329,-92.772637,211.408196,
+ 0.921765,0.135999,-0.363115,33.817512,-93.527417,212.694761,
+ 0.060493,0.45267,-0.889624,29.697098,-91.598635,210.986237,
+ 0.060493,0.45267,-0.889624,31.156462,-91.932369,210.915657,
+ 0.060493,0.45267,-0.889624,28.491761,-91.911682,210.744987,
+ 0.095887,0.118311,-0.988336,31.852527,-92.224729,210.982586,
+ 0.095887,0.118311,-0.988336,32.11629,-92.72822,210.947905,
+ 0.095887,0.118311,-0.988336,27.802085,-92.660074,210.537506,
+ 0.093298,0.332399,-0.938513,32.284526,-93.242663,210.868198,
+ 0.093298,0.332399,-0.938513,32.37701,-93.659451,210.729776,
+ 0.093298,0.332399,-0.938513,27.685871,-93.665535,210.26127,
+ 0.152152,0.079792,-0.985131,27.872361,-95.138893,210.249406,
+ 0.152152,0.079792,-0.985131,30.874446,-95.64634,210.671973,
+ 0.152152,0.079792,-0.985131,28.534049,-95.886068,210.291084,
+ 0.063126,-0.077488,-0.994993,28.491761,-91.911682,210.744987,
+ 0.063126,-0.077488,-0.994993,31.156462,-91.932369,210.915657,
+ 0.063126,-0.077488,-0.994993,31.852527,-92.224729,210.982586,
+ 0.086913,0.190971,-0.97774,28.491761,-91.911682,210.744987,
+ 0.086913,0.190971,-0.97774,31.852527,-92.224729,210.982586,
+ 0.086913,0.190971,-0.97774,27.802085,-92.660074,210.537506,
+ 0.10377,0.252319,-0.962064,27.802085,-92.660074,210.537506,
+ 0.10377,0.252319,-0.962064,32.284526,-93.242663,210.868198,
+ 0.10377,0.252319,-0.962064,27.685871,-93.665535,210.26127,
+ 0.095965,0.182978,-0.978422,27.802085,-92.660074,210.537506,
+ 0.095965,0.182978,-0.978422,32.11629,-92.72822,210.947905,
+ 0.095965,0.182978,-0.978422,32.284526,-93.242663,210.868198,
+ 0.099356,0.010794,-0.994993,32.37701,-93.659451,210.729776,
+ 0.099356,0.010794,-0.994993,32.368492,-94.310186,210.721866,
+ 0.099356,0.010794,-0.994993,27.685871,-93.665535,210.26127,
+ 0.100699,0.020756,-0.9947,27.685871,-93.665535,210.26127,
+ 0.100699,0.020756,-0.9947,32.368492,-94.310186,210.721866,
+ 0.100699,0.020756,-0.9947,27.872361,-95.138893,210.249406,
+ 0.11566,-0.062336,-0.991331,32.368492,-94.310186,210.721866,
+ 0.11566,-0.062336,-0.991331,32.006161,-94.972787,210.721258,
+ 0.11566,-0.062336,-0.991331,27.872361,-95.138893,210.249406,
+ 0.117484,-0.125315,-0.985136,32.006161,-94.972787,210.721258,
+ 0.117484,-0.125315,-0.985136,30.874446,-95.64634,210.671973,
+ 0.117484,-0.125315,-0.985136,27.872361,-95.138893,210.249406,
+ -0.131077,0.868628,-0.477813,29.697098,-91.598635,210.986237,
+ -0.131077,0.868628,-0.477813,27.926817,-91.766871,211.166034,
+ -0.131077,0.868628,-0.477813,29.680974,-91.281937,211.566393,
+ -0.130939,0.870202,-0.474978,29.697098,-91.598635,210.986237,
+ -0.130939,0.870202,-0.474978,28.491761,-91.911682,210.744987,
+ -0.130939,0.870202,-0.474978,27.926817,-91.766871,211.166034,
+ -0.54881,-0.062295,-0.833623,27.685871,-93.665535,210.26127,
+ -0.54881,-0.062295,-0.833623,27.445534,-95.362803,210.546329,
+ -0.54881,-0.062295,-0.833623,27.264216,-93.793918,210.548458,
+ -0.547609,-0.062594,-0.83439,27.685871,-93.665535,210.26127,
+ -0.547609,-0.062594,-0.83439,27.872361,-95.138893,210.249406,
+ -0.547609,-0.062594,-0.83439,27.445534,-95.362803,210.546329,
+ 0.249283,-0.134037,-0.95911,28.534049,-95.886068,210.291084,
+ 0.249283,-0.134037,-0.95911,31.09866,-96.282168,211.013009,
+ 0.249283,-0.134037,-0.95911,28.85105,-96.358833,210.439546,
+ 0.293477,-0.369423,-0.881702,33.070337,-95.336639,211.27312,
+ 0.293477,-0.369423,-0.881702,31.09866,-96.282168,211.013009,
+ 0.293477,-0.369423,-0.881702,30.874446,-95.64634,210.671973,
+ 0.294309,-0.432129,-0.852436,32.006161,-94.972787,210.721258,
+ 0.294309,-0.432129,-0.852436,33.070337,-95.336639,211.27312,
+ 0.294309,-0.432129,-0.852436,30.874446,-95.64634,210.671973,
+ 0.368198,0.563857,-0.739253,31.704066,-91.405453,211.533536,
+ 0.368198,0.563857,-0.739253,32.68884,-92.241157,211.386596,
+ 0.368198,0.563857,-0.739253,31.852527,-92.224729,210.982586,
+ 0.311965,0.568469,-0.761263,31.704066,-91.405453,211.533536,
+ 0.311965,0.568469,-0.761263,31.852527,-92.224729,210.982586,
+ 0.311965,0.568469,-0.761263,31.156462,-91.932369,210.915657,
+ 0.175447,0.866165,-0.467949,31.156462,-91.932369,210.915657,
+ 0.175447,0.866165,-0.467949,29.697098,-91.598635,210.986237,
+ 0.175447,0.866165,-0.467949,29.680974,-91.281937,211.566393,
+ 0.03467,0.745058,-0.666098,31.704066,-91.405453,211.533536,
+ 0.03467,0.745058,-0.666098,31.156462,-91.932369,210.915657,
+ 0.03467,0.745058,-0.666098,29.680974,-91.281937,211.566393,
+ 0.421887,-0.127546,-0.897632,33.450009,-94.536834,211.33792,
+ 0.421887,-0.127546,-0.897632,33.070337,-95.336639,211.27312,
+ 0.421887,-0.127546,-0.897632,32.006161,-94.972787,210.721258,
+ 0.4418,-0.240797,-0.864193,32.368492,-94.310186,210.721866,
+ 0.4418,-0.240797,-0.864193,33.450009,-94.536834,211.33792,
+ 0.4418,-0.240797,-0.864193,32.006161,-94.972787,210.721258,
+ 0.478881,-0.088809,-0.873376,33.185334,-93.603473,211.097887,
+ 0.478881,-0.088809,-0.873376,33.450009,-94.536834,211.33792,
+ 0.478881,-0.088809,-0.873376,32.368492,-94.310186,210.721866,
+ 0.414118,0.005643,-0.910206,33.185334,-93.603473,211.097887,
+ 0.414118,0.005643,-0.910206,32.368492,-94.310186,210.721866,
+ 0.414118,0.005643,-0.910206,32.37701,-93.659451,210.729776,
+ 0.421991,0.280453,-0.862131,31.852527,-92.224729,210.982586,
+ 0.421991,0.280453,-0.862131,32.68884,-92.241157,211.386596,
+ 0.421991,0.280453,-0.862131,32.11629,-92.72822,210.947905,
+ 0.380611,0.330478,-0.863666,32.68884,-92.241157,211.386596,
+ 0.380611,0.330478,-0.863666,33.199329,-92.772637,211.408196,
+ 0.380611,0.330478,-0.863666,32.11629,-92.72822,210.947905,
+ -0.422563,-0.319307,-0.848224,27.872361,-95.138893,210.249406,
+ -0.422563,-0.319307,-0.848224,28.000135,-96.032096,210.521991,
+ -0.422563,-0.319307,-0.848224,27.445534,-95.362803,210.546329,
+ -0.301916,-0.317515,-0.898906,27.872361,-95.138893,210.249406,
+ -0.301916,-0.317515,-0.898906,28.534049,-95.886068,210.291084,
+ -0.301916,-0.317515,-0.898906,28.000135,-96.032096,210.521991,
+ -0.252416,-0.439896,-0.861845,28.534049,-95.886068,210.291084,
+ -0.252416,-0.439896,-0.861845,28.85105,-96.358833,210.439546,
+ -0.252416,-0.439896,-0.861845,28.000135,-96.032096,210.521991,
+ -0.43551,0.49227,-0.753658,27.926817,-91.766871,211.166034,
+ -0.43551,0.49227,-0.753658,28.491761,-91.911682,210.744987,
+ -0.43551,0.49227,-0.753658,27.269388,-92.711792,210.928739,
+ -0.499967,0.626509,-0.597929,28.491761,-91.911682,210.744987,
+ -0.499967,0.626509,-0.597929,27.802085,-92.660074,210.537506,
+ -0.499967,0.626509,-0.597929,27.269388,-92.711792,210.928739,
+ 0.151652,-0.98355,0.098141,33.980272,-98.949912,218.82701,
+ 0.151652,-0.98355,0.098141,31.12969,-99.410203,218.618921,
+ 0.151652,-0.98355,0.098141,32.540379,-99.210328,218.442167,
+ -0.05266,-0.12195,0.991138,32.431771,-98.629868,218.784115,
+ -0.05266,-0.12195,0.991138,31.12969,-99.410203,218.618921,
+ -0.05266,-0.12195,0.991138,33.980272,-98.949912,218.82701,
+ -0.001491,-0.308009,0.951382,29.506045,-95.030285,220.409281,
+ -0.001491,-0.308009,0.951382,30.015013,-96.629288,219.892404,
+ -0.001491,-0.308009,0.951382,30.991573,-95.813663,220.157992,
+ 0.326186,-0.195161,0.92494,29.506045,-95.030285,220.409281,
+ 0.326186,-0.195161,0.92494,28.554432,-96.527069,220.429056,
+ 0.326186,-0.195161,0.92494,30.015013,-96.629288,219.892404,
+ 0.180617,-0.493325,0.850886,30.991573,-95.813663,220.157992,
+ 0.180617,-0.493325,0.850886,30.015013,-96.629288,219.892404,
+ 0.180617,-0.493325,0.850886,32.265056,-96.610427,219.425724,
+ 0.196165,-0.299614,0.933676,32.265056,-96.610427,219.425724,
+ 0.196165,-0.299614,0.933676,30.015013,-96.629288,219.892404,
+ 0.196165,-0.299614,0.933676,29.819396,-97.3935,219.688269,
+ 0.152497,-0.14869,0.977055,32.265056,-96.610427,219.425724,
+ 0.152497,-0.14869,0.977055,29.819396,-97.3935,219.688269,
+ 0.152497,-0.14869,0.977055,32.325901,-97.535573,219.275437,
+ 0.297548,-0.369666,0.880234,28.554432,-96.527069,220.429056,
+ 0.297548,-0.369666,0.880234,28.280021,-97.141298,220.263862,
+ 0.297548,-0.369666,0.880234,30.015013,-96.629288,219.892404,
+ 0.286678,-0.315054,0.904741,30.015013,-96.629288,219.892404,
+ 0.286678,-0.315054,0.904741,28.280021,-97.141298,220.263862,
+ 0.286678,-0.315054,0.904741,29.819396,-97.3935,219.688269,
+ 0.198462,-0.10502,0.974466,29.819396,-97.3935,219.688269,
+ 0.198462,-0.10502,0.974466,28.193317,-98.292787,219.922522,
+ 0.198462,-0.10502,0.974466,29.719307,-98.172618,219.624687,
+ 0.292639,-0.291956,0.910563,28.280021,-97.141298,220.263862,
+ 0.292639,-0.291956,0.910563,28.193317,-98.292787,219.922522,
+ 0.292639,-0.291956,0.910563,29.819396,-97.3935,219.688269,
+ 0.213972,-0.382805,0.898708,32.325901,-97.535573,219.275437,
+ 0.213972,-0.382805,0.898708,29.719307,-98.172618,219.624687,
+ 0.213972,-0.382805,0.898708,32.431771,-98.629868,218.784115,
+ 0.156161,-0.100253,0.982631,29.819396,-97.3935,219.688269,
+ 0.156161,-0.100253,0.982631,29.719307,-98.172618,219.624687,
+ 0.156161,-0.100253,0.982631,32.325901,-97.535573,219.275437,
+ -0.015301,0.234784,0.971927,29.719307,-98.172618,219.624687,
+ -0.015301,0.234784,0.971927,28.28428,-98.821529,219.75885,
+ -0.015301,0.234784,0.971927,29.565065,-98.876593,219.792314,
+ -0.597053,0.275952,-0.753245,27.802085,-92.660074,210.537506,
+ -0.597053,0.275952,-0.753245,27.685871,-93.665535,210.26127,
+ -0.597053,0.275952,-0.753245,27.264216,-93.793918,210.548458,
+ -0.586748,0.270968,-0.763088,27.802085,-92.660074,210.537506,
+ -0.586748,0.270968,-0.763088,27.264216,-93.793918,210.548458,
+ -0.586748,0.270968,-0.763088,27.269388,-92.711792,210.928739,
+ 0.381775,0.279821,-0.880879,33.192027,-93.211328,211.225357,
+ 0.381775,0.279821,-0.880879,33.185334,-93.603473,211.097887,
+ 0.381775,0.279821,-0.880879,32.37701,-93.659451,210.729776,
+ 0.330412,0.362711,-0.87136,33.192027,-93.211328,211.225357,
+ 0.330412,0.362711,-0.87136,32.37701,-93.659451,210.729776,
+ 0.330412,0.362711,-0.87136,32.284526,-93.242663,210.868198,
+ 0.386463,0.263335,-0.883913,32.11629,-92.72822,210.947905,
+ 0.386463,0.263335,-0.883913,33.199329,-92.772637,211.408196,
+ 0.386463,0.263335,-0.883913,32.284526,-93.242663,210.868198,
+ 0.331169,0.358296,-0.872898,33.199329,-92.772637,211.408196,
+ 0.331169,0.358296,-0.872898,33.192027,-93.211328,211.225357,
+ 0.331169,0.358296,-0.872898,32.284526,-93.242663,210.868198,
+ 0.18733,-0.412182,-0.891635,30.874446,-95.64634,210.671973,
+ 0.18733,-0.412182,-0.891635,31.09866,-96.282168,211.013009,
+ 0.18733,-0.412182,-0.891635,28.534049,-95.886068,210.291084,
+ -0.784653,0.226094,0.577236,27.148307,-95.653033,220.071896,
+ -0.784653,0.226094,0.577236,27.533151,-96.258439,220.832153,
+ -0.784653,0.226094,0.577236,28.164112,-94.387155,220.956885,
+ -0.521948,-0.166076,0.836654,27.491776,-93.841985,220.645663,
+ -0.521948,-0.166076,0.836654,27.148307,-95.653033,220.071896,
+ -0.521948,-0.166076,0.836654,28.164112,-94.387155,220.956885,
+ -0.32359,-0.287505,0.90146,27.533151,-96.258439,220.832153,
+ -0.32359,-0.287505,0.90146,26.848037,-97.245343,220.271468,
+ -0.32359,-0.287505,0.90146,27.281253,-97.347562,220.394374,
+ -0.788104,0.220639,0.574639,27.148307,-95.653033,220.071896,
+ -0.788104,0.220639,0.574639,26.848037,-97.245343,220.271468,
+ -0.788104,0.220639,0.574639,27.533151,-96.258439,220.832153,
+ 0.065049,0.554021,0.829957,27.491776,-93.841985,220.645663,
+ 0.065049,0.554021,0.829957,28.164112,-94.387155,220.956885,
+ 0.065049,0.554021,0.829957,29.359105,-94.221657,220.75275,
+ -0.022405,0.167785,0.985569,28.389238,-93.184252,220.554092,
+ -0.022405,0.167785,0.985569,27.491776,-93.841985,220.645663,
+ -0.022405,0.167785,0.985569,29.359105,-94.221657,220.75275,
+ 0.033376,0.217985,0.975381,28.389238,-93.184252,220.554092,
+ 0.033376,0.217985,0.975381,29.359105,-94.221657,220.75275,
+ 0.033376,0.217985,0.975381,30.143091,-93.6774,220.604289,
+ 0.121329,0.517705,0.846912,30.219147,-91.995648,219.565363,
+ 0.121329,0.517705,0.846912,28.389238,-93.184252,220.554092,
+ 0.121329,0.517705,0.846912,30.143091,-93.6774,220.604289,
+ -0.179425,-0.28123,0.942717,30.143091,-93.6774,220.604289,
+ -0.179425,-0.28123,0.942717,30.358786,-94.755267,220.323794,
+ -0.179425,-0.28123,0.942717,31.534917,-94.536834,220.612807,
+ 0.030129,0.058683,0.997822,30.143091,-93.6774,220.604289,
+ 0.030129,0.058683,0.997822,31.534917,-94.536834,220.612807,
+ 0.030129,0.058683,0.997822,32.226115,-94.157162,220.569607,
+ 0.141267,-0.145764,0.979182,32.226115,-94.157162,220.569607,
+ 0.141267,-0.145764,0.979182,31.534917,-94.536834,220.612807,
+ 0.141267,-0.145764,0.979182,32.664502,-95.493923,220.307366,
+ 0.165492,-0.137314,0.976605,32.226115,-94.157162,220.569607,
+ 0.165492,-0.137314,0.976605,32.664502,-95.493923,220.307366,
+ 0.165492,-0.137314,0.976605,33.999743,-94.745836,220.186285,
+ 0.337535,-0.470497,0.815293,33.999743,-94.745836,220.186285,
+ 0.337535,-0.470497,0.815293,32.664502,-95.493923,220.307366,
+ 0.337535,-0.470497,0.815293,33.316759,-96.320197,219.560495,
+ -0.093224,-0.332582,0.938455,33.999743,-94.745836,220.186285,
+ -0.093224,-0.332582,0.938455,33.316759,-96.320197,219.560495,
+ -0.093224,-0.332582,0.938455,34.139077,-95.971251,219.765847,
+ 0.196854,-0.407855,0.891573,34.774906,-97.421184,219.350885,
+ 0.196854,-0.407855,0.891573,34.068802,-97.621668,219.415076,
+ 0.196854,-0.407855,0.891573,33.980272,-98.949912,218.82701,
+ -0.032045,-0.309067,0.9505,34.774906,-97.421184,219.350885,
+ -0.032045,-0.309067,0.9505,33.980272,-98.949912,218.82701,
+ -0.032045,-0.309067,0.9505,34.758782,-99.324412,218.731484,
+ -0.137161,-0.502823,0.853438,33.980272,-98.949912,218.82701,
+ -0.137161,-0.502823,0.853438,32.540379,-99.210328,218.442167,
+ -0.137161,-0.502823,0.853438,34.758782,-99.324412,218.731484,
+ -0.137042,-0.507508,0.850679,32.540379,-99.210328,218.442167,
+ -0.137042,-0.507508,0.850679,33.271125,-99.928297,218.131554,
+ -0.137042,-0.507508,0.850679,34.758782,-99.324412,218.731484,
+ -0.157164,-0.1989,0.967336,34.139077,-95.971251,219.765847,
+ -0.157164,-0.1989,0.967336,33.316759,-96.320197,219.560495,
+ -0.157164,-0.1989,0.967336,34.068802,-97.621668,219.415076,
+ 0.147914,-0.211626,0.966093,34.139077,-95.971251,219.765847,
+ 0.147914,-0.211626,0.966093,34.068802,-97.621668,219.415076,
+ 0.147914,-0.211626,0.966093,34.774906,-97.421184,219.350885,
+ 0.11145,-0.780971,0.614543,29.128807,-100.318313,218.44095,
+ 0.11145,-0.780971,0.614543,28.873867,-99.598214,219.402299,
+ 0.11145,-0.780971,0.614543,28.049115,-100.261727,218.708667,
+ 0.318708,-0.518857,0.79323,31.12969,-99.410203,218.618921,
+ 0.318708,-0.518857,0.79323,28.873867,-99.598214,219.402299,
+ 0.318708,-0.518857,0.79323,31.766128,-100.133648,217.89,
+ 0.182947,-0.762964,0.620014,31.766128,-100.133648,217.89,
+ 0.182947,-0.762964,0.620014,28.873867,-99.598214,219.402299,
+ 0.182947,-0.762964,0.620014,29.128807,-100.318313,218.44095,
+ 0.155651,-0.254506,0.954463,32.540379,-99.210328,218.442167,
+ 0.155651,-0.254506,0.954463,31.12969,-99.410203,218.618921,
+ 0.155651,-0.254506,0.954463,33.271125,-99.928297,218.131554,
+ -0.014348,-0.71593,0.698024,33.271125,-99.928297,218.131554,
+ -0.014348,-0.71593,0.698024,31.12969,-99.410203,218.618921,
+ -0.014348,-0.71593,0.698024,31.766128,-100.133648,217.89,
+ -0.235222,-0.547287,0.803211,28.28428,-98.821529,219.75885,
+ -0.235222,-0.547287,0.803211,28.049115,-100.261727,218.708667,
+ -0.235222,-0.547287,0.803211,28.873867,-99.598214,219.402299,
+ 0.060868,-0.594563,0.801742,28.28428,-98.821529,219.75885,
+ 0.060868,-0.594563,0.801742,27.169298,-99.427544,219.394085,
+ 0.060868,-0.594563,0.801742,28.049115,-100.261727,218.708667,
+ -0.136516,-0.314296,0.939458,28.193317,-98.292787,219.922522,
+ -0.136516,-0.314296,0.939458,27.169298,-99.427544,219.394085,
+ -0.136516,-0.314296,0.939458,28.28428,-98.821529,219.75885,
+ -0.115352,-0.331895,0.936237,27.228318,-98.213993,219.831559,
+ -0.115352,-0.331895,0.936237,27.169298,-99.427544,219.394085,
+ -0.115352,-0.331895,0.936237,28.193317,-98.292787,219.922522,
+ -0.112439,-0.274615,0.954958,28.280021,-97.141298,220.263862,
+ -0.112439,-0.274615,0.954958,27.228318,-98.213993,219.831559,
+ -0.112439,-0.274615,0.954958,28.193317,-98.292787,219.922522,
+ 0.217871,-0.54098,0.812325,28.280021,-97.141298,220.263862,
+ 0.217871,-0.54098,0.812325,27.281253,-97.347562,220.394374,
+ 0.217871,-0.54098,0.812325,27.228318,-98.213993,219.831559,
+ 0.317022,-0.189276,0.929339,29.506045,-95.030285,220.409281,
+ 0.317022,-0.189276,0.929339,27.533151,-96.258439,220.832153,
+ 0.317022,-0.189276,0.929339,28.554432,-96.527069,220.429056,
+ 0.303832,-0.164992,0.93833,28.164112,-94.387155,220.956885,
+ 0.303832,-0.164992,0.93833,27.533151,-96.258439,220.832153,
+ 0.303832,-0.164992,0.93833,29.506045,-95.030285,220.409281,
+ 0.189483,-0.333069,0.923667,28.554432,-96.527069,220.429056,
+ 0.189483,-0.333069,0.923667,27.281253,-97.347562,220.394374,
+ 0.189483,-0.333069,0.923667,28.280021,-97.141298,220.263862,
+ 0.239798,-0.409311,0.880319,27.533151,-96.258439,220.832153,
+ 0.239798,-0.409311,0.880319,27.281253,-97.347562,220.394374,
+ 0.239798,-0.409311,0.880319,28.554432,-96.527069,220.429056,
+ 0.204752,-0.350826,0.913782,30.358786,-94.755267,220.323794,
+ 0.204752,-0.350826,0.913782,28.164112,-94.387155,220.956885,
+ 0.204752,-0.350826,0.913782,29.506045,-95.030285,220.409281,
+ 0.2047,-0.351025,0.913717,28.164112,-94.387155,220.956885,
+ 0.2047,-0.351025,0.913717,30.358786,-94.755267,220.323794,
+ 0.2047,-0.351025,0.913717,29.359105,-94.221657,220.75275,
+ 0.3038,-0.182544,0.935085,30.143091,-93.6774,220.604289,
+ 0.3038,-0.182544,0.935085,29.359105,-94.221657,220.75275,
+ 0.3038,-0.182544,0.935085,30.358786,-94.755267,220.323794,
+ -0.135549,-0.442829,0.886301,31.534917,-94.536834,220.612807,
+ -0.135549,-0.442829,0.886301,30.358786,-94.755267,220.323794,
+ -0.135549,-0.442829,0.886301,32.664502,-95.493923,220.307366,
+ -0.052269,-0.184983,0.981351,30.358786,-94.755267,220.323794,
+ -0.052269,-0.184983,0.981351,30.991573,-95.813663,220.157992,
+ -0.052269,-0.184983,0.981351,32.664502,-95.493923,220.307366,
+ 0.124998,-0.080184,0.988911,30.358786,-94.755267,220.323794,
+ 0.124998,-0.080184,0.988911,29.506045,-95.030285,220.409281,
+ 0.124998,-0.080184,0.988911,30.991573,-95.813663,220.157992,
+ 0.076592,-0.634641,0.769002,32.664502,-95.493923,220.307366,
+ 0.076592,-0.634641,0.769002,32.265056,-96.610427,219.425724,
+ 0.076592,-0.634641,0.769002,33.316759,-96.320197,219.560495,
+ 0.051257,-0.630144,0.774785,32.664502,-95.493923,220.307366,
+ 0.051257,-0.630144,0.774785,30.991573,-95.813663,220.157992,
+ 0.051257,-0.630144,0.774785,32.265056,-96.610427,219.425724,
+ -0.080441,-0.164977,0.983012,33.316759,-96.320197,219.560495,
+ -0.080441,-0.164977,0.983012,32.265056,-96.610427,219.425724,
+ -0.080441,-0.164977,0.983012,32.325901,-97.535573,219.275437,
+ -0.086683,-0.159959,0.98331,33.316759,-96.320197,219.560495,
+ -0.086683,-0.159959,0.98331,32.325901,-97.535573,219.275437,
+ -0.086683,-0.159959,0.98331,34.068802,-97.621668,219.415076,
+ -0.107209,-0.39652,0.911745,34.068802,-97.621668,219.415076,
+ -0.107209,-0.39652,0.911745,32.431771,-98.629868,218.784115,
+ -0.107209,-0.39652,0.911745,33.980272,-98.949912,218.82701,
+ -0.093016,-0.415294,0.904919,32.325901,-97.535573,219.275437,
+ -0.093016,-0.415294,0.904919,32.431771,-98.629868,218.784115,
+ -0.093016,-0.415294,0.904919,34.068802,-97.621668,219.415076,
+ 0.956722,-0.096315,0.274602,35.795579,-96.461357,217.663048,
+ 0.956722,-0.096315,0.274602,35.404042,-97.176892,218.776205,
+ 0.956722,-0.096315,0.274602,35.385485,-99.352705,218.077706,
+ 0.930966,-0.080987,0.35601,35.966249,-98.008641,216.864764,
+ 0.930966,-0.080987,0.35601,35.795579,-96.461357,217.663048,
+ 0.930966,-0.080987,0.35601,35.385485,-99.352705,218.077706,
+ 0.505998,-0.688047,-0.520151,35.966249,-98.008641,216.864764,
+ 0.505998,-0.688047,-0.520151,35.385485,-99.352705,218.077706,
+ 0.505998,-0.688047,-0.520151,33.690955,-99.964804,217.238959,
+ 0.649116,-0.760205,-0.027137,35.966249,-98.008641,216.864764,
+ 0.649116,-0.760205,-0.027137,33.690955,-99.964804,217.238959,
+ 0.649116,-0.760205,-0.027137,34.582637,-99.171387,216.341498,
+ 0.255403,-0.836132,-0.48544,34.582637,-99.171387,216.341498,
+ 0.255403,-0.836132,-0.48544,33.690955,-99.964804,217.238959,
+ 0.255403,-0.836132,-0.48544,31.922499,-100.106877,216.553238,
+ 0.200879,-0.923528,-0.326718,33.690955,-99.964804,217.238959,
+ 0.200879,-0.923528,-0.326718,31.968133,-100.345997,217.257213,
+ 0.200879,-0.923528,-0.326718,31.922499,-100.106877,216.553238,
+ -0.154998,-0.898192,-0.411372,29.10812,-99.805999,216.222546,
+ -0.154998,-0.898192,-0.411372,28.96483,-100.397411,217.567826,
+ -0.154998,-0.898192,-0.411372,27.736372,-100.240735,217.688603,
+ -0.321651,-0.782578,-0.533021,29.10812,-99.805999,216.222546,
+ -0.321651,-0.782578,-0.533021,27.736372,-100.240735,217.688603,
+ -0.321651,-0.782578,-0.533021,27.898828,-99.358485,216.295256,
+ -0.016944,-0.947066,-0.320593,31.968133,-100.345997,217.257213,
+ -0.016944,-0.947066,-0.320593,28.96483,-100.397411,217.567826,
+ -0.016944,-0.947066,-0.320593,31.922499,-100.106877,216.553238,
+ -0.049785,-0.912344,-0.406387,31.922499,-100.106877,216.553238,
+ -0.049785,-0.912344,-0.406387,28.96483,-100.397411,217.567826,
+ -0.049785,-0.912344,-0.406387,29.10812,-99.805999,216.222546,
+ -0.622545,-0.626346,-0.469179,27.898828,-99.358485,216.295256,
+ -0.622545,-0.626346,-0.469179,27.736372,-100.240735,217.688603,
+ -0.622545,-0.626346,-0.469179,27.059777,-98.521564,216.291301,
+ -0.70753,-0.592056,-0.385839,27.059777,-98.521564,216.291301,
+ -0.70753,-0.592056,-0.385839,27.736372,-100.240735,217.688603,
+ -0.70753,-0.592056,-0.385839,26.718742,-99.089855,217.788693,
+ -0.943948,-0.253325,0.211635,26.718742,-99.089855,217.788693,
+ -0.943948,-0.253325,0.211635,27.169298,-99.427544,219.394085,
+ -0.943948,-0.253325,0.211635,26.793277,-98.082568,219.326851,
+ -0.080259,-0.7988,-0.596219,26.950865,-131.479402,206.208394,
+ -0.080259,-0.7988,-0.596219,26.747339,-133.082055,208.382989,
+ -0.080259,-0.7988,-0.596219,24.714512,-133.46842,209.174277,
+ -0.003107,-0.829438,-0.558591,26.950865,-131.479402,206.208394,
+ -0.003107,-0.829438,-0.558591,24.714512,-133.46842,209.174277,
+ -0.003107,-0.829438,-0.558591,24.83103,-132.188548,207.273179,
+ -0.258742,-0.793861,-0.550307,24.83103,-132.188548,207.273179,
+ -0.258742,-0.793861,-0.550307,24.714512,-133.46842,209.174277,
+ -0.258742,-0.793861,-0.550307,21.928426,-131.965856,208.316669,
+ -0.315952,-0.838854,-0.443281,24.714512,-133.46842,209.174277,
+ -0.315952,-0.838854,-0.443281,21.789091,-132.58617,209.589847,
+ -0.315952,-0.838854,-0.443281,21.928426,-131.965856,208.316669,
+ -0.678401,-0.722202,-0.134895,21.789091,-132.58617,209.589847,
+ -0.678401,-0.722202,-0.134895,21.481825,-132.525629,210.811004,
+ -0.678401,-0.722202,-0.134895,19.536918,-130.811021,211.412455,
+ -0.631735,-0.774746,-0.026055,21.789091,-132.58617,209.589847,
+ -0.631735,-0.774746,-0.026055,19.536918,-130.811021,211.412455,
+ -0.631735,-0.774746,-0.026055,19.50102,-130.745612,210.337935,
+ -0.924656,-0.380726,0.007716,19.50102,-130.745612,210.337935,
+ -0.924656,-0.380726,0.007716,19.536918,-130.811021,211.412455,
+ -0.924656,-0.380726,0.007716,18.808301,-129.032525,211.852972,
+ -0.925516,-0.378676,0.005006,19.50102,-130.745612,210.337935,
+ -0.925516,-0.378676,0.005006,18.808301,-129.032525,211.852972,
+ -0.925516,-0.378676,0.005006,18.605079,-128.555806,210.342194,
+ -0.823464,0.499823,0.268485,19.090317,-127.465162,209.800066,
+ -0.823464,0.499823,0.268485,18.605079,-128.555806,210.342194,
+ -0.823464,0.499823,0.268485,18.808301,-129.032525,211.852972,
+ -0.893047,0.408317,0.189062,19.090317,-127.465162,209.800066,
+ -0.893047,0.408317,0.189062,18.808301,-129.032525,211.852972,
+ -0.893047,0.408317,0.189062,19.465121,-128.043492,212.819493,
+ -0.93233,0.315768,0.176212,19.090317,-127.465162,209.800066,
+ -0.93233,0.315768,0.176212,19.465121,-128.043492,212.819493,
+ -0.93233,0.315768,0.176212,19.67169,-125.857944,209.995987,
+ -0.908317,0.360313,0.212449,19.67169,-125.857944,209.995987,
+ -0.908317,0.360313,0.212449,19.465121,-128.043492,212.819493,
+ -0.908317,0.360313,0.212449,19.838405,-127.168847,212.932056,
+ -0.810088,0.51687,0.276772,19.67169,-125.857944,209.995987,
+ -0.810088,0.51687,0.276772,19.838405,-127.168847,212.932056,
+ -0.810088,0.51687,0.276772,21.027618,-125.316729,212.95396,
+ -0.810708,0.515622,0.277284,19.67169,-125.857944,209.995987,
+ -0.810708,0.515622,0.277284,21.027618,-125.316729,212.95396,
+ -0.810708,0.515622,0.277284,20.432555,-124.953181,210.538115,
+ -0.57681,0.774839,0.258679,21.579785,-124.341082,211.262777,
+ -0.57681,0.774839,0.258679,20.432555,-124.953181,210.538115,
+ -0.57681,0.774839,0.258679,21.027618,-125.316729,212.95396,
+ -0.421394,0.838272,0.346017,22.521359,-124.835447,213.607129,
+ -0.421394,0.838272,0.346017,21.579785,-124.341082,211.262777,
+ -0.421394,0.838272,0.346017,21.027618,-125.316729,212.95396,
+ 0.209068,0.970427,0.120669,23.816442,-125.11442,213.606825,
+ 0.209068,0.970427,0.120669,21.579785,-124.341082,211.262777,
+ 0.209068,0.970427,0.120669,22.521359,-124.835447,213.607129,
+ -0.041313,0.936447,0.348368,24.124317,-124.210266,211.212884,
+ -0.041313,0.936447,0.348368,21.579785,-124.341082,211.262777,
+ -0.041313,0.936447,0.348368,23.816442,-125.11442,213.606825,
+ 0.684395,0.355401,0.636627,27.460137,-125.661111,211.3869,
+ 0.684395,0.355401,0.636627,26.147409,-126.437796,213.231717,
+ 0.684395,0.355401,0.636627,27.192724,-127.656214,212.788158,
+ 0.86821,0.20196,0.453237,28.261464,-127.265286,210.566712,
+ 0.86821,0.20196,0.453237,27.460137,-125.661111,211.3869,
+ 0.86821,0.20196,0.453237,27.192724,-127.656214,212.788158,
+ 0.881353,0.145242,0.449579,28.261464,-127.265286,210.566712,
+ 0.881353,0.145242,0.449579,27.192724,-127.656214,212.788158,
+ 0.881353,0.145242,0.449579,27.61955,-129.746236,212.626614,
+ 0.917972,0.084295,0.387586,28.678251,-128.84421,209.922973,
+ 0.917972,0.084295,0.387586,28.261464,-127.265286,210.566712,
+ 0.917972,0.084295,0.387586,27.61955,-129.746236,212.626614,
+ 0.092915,-0.967176,-0.23651,26.747339,-133.082055,208.382989,
+ 0.092915,-0.967176,-0.23651,26.142541,-133.671034,210.553934,
+ 0.092915,-0.967176,-0.23651,24.353398,-133.733704,210.107333,
+ 0.090351,-0.966596,-0.239852,26.747339,-133.082055,208.382989,
+ 0.090351,-0.966596,-0.239852,24.353398,-133.733704,210.107333,
+ 0.090351,-0.966596,-0.239852,24.714512,-133.46842,209.174277,
+ -0.948707,0.27373,0.1582,19.316356,-124.631616,206.473678,
+ -0.948707,0.27373,0.1582,18.922994,-127.193185,208.546966,
+ -0.948707,0.27373,0.1582,19.473031,-125.455456,208.838717,
+ -0.803896,0.543114,0.242444,19.316356,-124.631616,206.473678,
+ -0.803896,0.543114,0.242444,19.473031,-125.455456,208.838717,
+ -0.803896,0.543114,0.242444,20.049841,-124.790726,209.262198,
+ -0.912514,0.317313,0.258131,19.316356,-124.631616,206.473678,
+ -0.912514,0.317313,0.258131,20.049841,-124.790726,209.262198,
+ -0.912514,0.317313,0.258131,19.746833,-123.848543,207.032842,
+ -0.39439,0.82601,0.402697,20.974378,-123.463699,207.445674,
+ -0.39439,0.82601,0.402697,19.746833,-123.848543,207.032842,
+ -0.39439,0.82601,0.402697,20.049841,-124.790726,209.262198,
+ -0.564579,0.776474,0.27989,21.267955,-124.154288,209.9537,
+ -0.564579,0.776474,0.27989,20.974378,-123.463699,207.445674,
+ -0.564579,0.776474,0.27989,20.049841,-124.790726,209.262198,
+ -0.037773,0.96229,0.26939,24.283731,-124.03412,209.947311,
+ -0.037773,0.96229,0.26939,20.974378,-123.463699,207.445674,
+ -0.037773,0.96229,0.26939,21.267955,-124.154288,209.9537,
+ 0.052918,0.986506,0.154938,24.283731,-124.03412,209.947311,
+ 0.052918,0.986506,0.154938,24.234142,-123.640758,207.459669,
+ 0.052918,0.986506,0.154938,20.974378,-123.463699,207.445674,
+ 0.944185,0.32858,-0.023451,27.737893,-124.79681,206.933056,
+ 0.944185,0.32858,-0.023451,28.000743,-125.338329,209.928449,
+ 0.944185,0.32858,-0.023451,28.580595,-127.066323,209.062931,
+ 0.904879,0.416857,0.086165,28.374331,-126.077594,206.445689,
+ 0.904879,0.416857,0.086165,27.737893,-124.79681,206.933056,
+ 0.904879,0.416857,0.086165,28.580595,-127.066323,209.062931,
+ 0.973462,0.228645,0.009658,28.374331,-126.077594,206.445689,
+ 0.973462,0.228645,0.009658,28.580595,-127.066323,209.062931,
+ 0.973462,0.228645,0.009658,28.906115,-128.410082,208.065075,
+ 0.981015,0.186329,-0.053773,28.599457,-127.574378,205.366301,
+ 0.981015,0.186329,-0.053773,28.374331,-126.077594,206.445689,
+ 0.981015,0.186329,-0.053773,28.906115,-128.410082,208.065075,
+ -0.401008,-0.764859,-0.504165,22.300188,-128.78154,203.177103,
+ -0.401008,-0.764859,-0.504165,22.299275,-129.709729,204.585966,
+ -0.401008,-0.764859,-0.504165,19.950359,-128.735298,204.975981,
+ -0.328409,-0.852309,-0.407083,22.300188,-128.78154,203.177103,
+ -0.328409,-0.852309,-0.407083,19.950359,-128.735298,204.975981,
+ -0.328409,-0.852309,-0.407083,19.806461,-127.967132,203.483761,
+ -0.778093,-0.585868,-0.22656,19.806461,-127.967132,203.483761,
+ -0.778093,-0.585868,-0.22656,19.950359,-128.735298,204.975981,
+ -0.778093,-0.585868,-0.22656,18.663795,-126.966842,204.821435,
+ -0.781705,-0.577228,-0.236106,18.444145,-126.09311,203.412572,
+ -0.781705,-0.577228,-0.236106,19.806461,-127.967132,203.483761,
+ -0.781705,-0.577228,-0.236106,18.663795,-126.966842,204.821435,
+ -0.981412,0.051418,0.184896,18.436843,-124.749047,203.000044,
+ -0.981412,0.051418,0.184896,18.444145,-126.09311,203.412572,
+ -0.981412,0.051418,0.184896,18.663795,-126.966842,204.821435,
+ -0.995812,-0.090335,0.014086,18.436843,-124.749047,203.000044,
+ -0.995812,-0.090335,0.014086,18.663795,-126.966842,204.821435,
+ -0.995812,-0.090335,0.014086,18.545147,-125.729562,204.368445,
+ -0.935674,0.247566,0.251446,18.436843,-124.749047,203.000044,
+ -0.935674,0.247566,0.251446,18.545147,-125.729562,204.368445,
+ -0.935674,0.247566,0.251446,18.980188,-122.994889,203.294838,
+ -0.936656,0.246638,0.248686,18.980188,-122.994889,203.294838,
+ -0.936656,0.246638,0.248686,18.545147,-125.729562,204.368445,
+ -0.936656,0.246638,0.248686,19.082103,-123.98301,204.658675,
+ -0.868502,0.368306,0.331744,18.980188,-122.994889,203.294838,
+ -0.868502,0.368306,0.331744,19.082103,-123.98301,204.658675,
+ -0.868502,0.368306,0.331744,19.598372,-123.252263,205.198978,
+ -0.869435,0.366095,0.331748,18.980188,-122.994889,203.294838,
+ -0.869435,0.366095,0.331748,19.598372,-123.252263,205.198978,
+ -0.869435,0.366095,0.331748,19.504366,-122.246802,203.84305,
+ -0.322487,0.749505,0.578138,20.76203,-122.06518,204.309121,
+ -0.322487,0.749505,0.578138,19.504366,-122.246802,203.84305,
+ -0.322487,0.749505,0.578138,19.598372,-123.252263,205.198978,
+ -0.389942,0.765694,0.511525,21.061691,-122.883847,205.76301,
+ -0.389942,0.765694,0.511525,20.76203,-122.06518,204.309121,
+ -0.389942,0.765694,0.511525,19.598372,-123.252263,205.198978,
+ 0.08091,0.875537,0.476328,24.190334,-123.130269,205.68452,
+ 0.08091,0.875537,0.476328,20.76203,-122.06518,204.309121,
+ 0.08091,0.875537,0.476328,21.061691,-122.883847,205.76301,
+ 0.164,0.934782,0.315098,24.190334,-123.130269,205.68452,
+ 0.164,0.934782,0.315098,24.115799,-122.606091,204.168266,
+ 0.164,0.934782,0.315098,20.76203,-122.06518,204.309121,
+ -0.316038,-0.87336,-0.370625,24.714512,-133.46842,209.174277,
+ -0.316038,-0.87336,-0.370625,24.353398,-133.733704,210.107333,
+ -0.316038,-0.87336,-0.370625,21.789091,-132.58617,209.589847,
+ -0.398599,-0.91548,-0.054909,24.353398,-133.733704,210.107333,
+ -0.398599,-0.91548,-0.054909,21.481825,-132.525629,210.811004,
+ -0.398599,-0.91548,-0.054909,21.789091,-132.58617,209.589847,
+ 0.846335,-0.065393,-0.528621,27.179946,-126.147262,202.060904,
+ 0.846335,-0.065393,-0.528621,28.100833,-126.776093,203.613056,
+ 0.846335,-0.065393,-0.528621,27.67644,-127.908416,203.073667,
+ 0.739534,-0.166559,-0.652187,26.771373,-127.001219,201.815699,
+ 0.739534,-0.166559,-0.652187,27.179946,-126.147262,202.060904,
+ 0.739534,-0.166559,-0.652187,27.67644,-127.908416,203.073667,
+ 0.442088,-0.545883,-0.711737,26.771373,-127.001219,201.815699,
+ 0.442088,-0.545883,-0.711737,27.67644,-127.908416,203.073667,
+ 0.442088,-0.545883,-0.711737,26.751902,-128.744425,203.140596,
+ 0.537478,-0.514065,-0.668472,26.771373,-127.001219,201.815699,
+ 0.537478,-0.514065,-0.668472,26.751902,-128.744425,203.140596,
+ 0.537478,-0.514065,-0.668472,26.305605,-127.672947,201.957772,
+ 0.943805,-0.10137,-0.314574,28.100833,-126.776093,203.613056,
+ 0.943805,-0.10137,-0.314574,28.599457,-127.574378,205.366301,
+ 0.943805,-0.10137,-0.314574,28.1921,-128.900188,204.571363,
+ 0.902202,-0.14457,-0.406364,27.67644,-127.908416,203.073667,
+ 0.902202,-0.14457,-0.406364,28.100833,-126.776093,203.613056,
+ 0.902202,-0.14457,-0.406364,28.1921,-128.900188,204.571363,
+ 0.628228,-0.531456,-0.568229,27.67644,-127.908416,203.073667,
+ 0.628228,-0.531456,-0.568229,28.1921,-128.900188,204.571363,
+ 0.628228,-0.531456,-0.568229,27.187552,-129.91721,204.411949,
+ 0.463105,-0.566702,-0.681456,27.67644,-127.908416,203.073667,
+ 0.463105,-0.566702,-0.681456,27.187552,-129.91721,204.411949,
+ 0.463105,-0.566702,-0.681456,26.751902,-128.744425,203.140596,
+ 0.981596,-0.119877,-0.148659,28.599457,-127.574378,205.366301,
+ 0.981596,-0.119877,-0.148659,28.906115,-128.410082,208.065075,
+ 0.981596,-0.119877,-0.148659,28.485981,-130.160893,206.702758,
+ 0.960849,-0.159293,-0.226704,28.1921,-128.900188,204.571363,
+ 0.960849,-0.159293,-0.226704,28.599457,-127.574378,205.366301,
+ 0.960849,-0.159293,-0.226704,28.485981,-130.160893,206.702758,
+ 0.661264,-0.602166,-0.447354,28.1921,-128.900188,204.571363,
+ 0.661264,-0.602166,-0.447354,28.485981,-130.160893,206.702758,
+ 0.661264,-0.602166,-0.447354,26.950865,-131.479402,206.208394,
+ 0.67465,-0.598702,-0.431745,27.187552,-129.91721,204.411949,
+ 0.67465,-0.598702,-0.431745,28.1921,-128.900188,204.571363,
+ 0.67465,-0.598702,-0.431745,26.950865,-131.479402,206.208394,
+ 0.97784,-0.195768,0.074184,28.906115,-128.410082,208.065075,
+ 0.97784,-0.195768,0.074184,28.678251,-128.84421,209.922973,
+ 0.97784,-0.195768,0.074184,28.307706,-131.1624,208.689648,
+ 0.975893,-0.217147,-0.021891,28.485981,-130.160893,206.702758,
+ 0.975893,-0.217147,-0.021891,28.906115,-128.410082,208.065075,
+ 0.975893,-0.217147,-0.021891,28.307706,-131.1624,208.689648,
+ 0.772959,-0.591722,-0.228908,28.485981,-130.160893,206.702758,
+ 0.772959,-0.591722,-0.228908,28.307706,-131.1624,208.689648,
+ 0.772959,-0.591722,-0.228908,26.747339,-133.082055,208.382989,
+ 0.667884,-0.627615,-0.400037,26.950865,-131.479402,206.208394,
+ 0.667884,-0.627615,-0.400037,28.485981,-130.160893,206.702758,
+ 0.667884,-0.627615,-0.400037,26.747339,-133.082055,208.382989,
+ 0.924174,-0.267531,0.272634,28.678251,-128.84421,209.922973,
+ 0.924174,-0.267531,0.272634,27.61955,-129.746236,212.626614,
+ 0.924174,-0.267531,0.272634,27.394728,-132.069597,211.108839,
+ 0.928307,-0.279087,0.245675,28.307706,-131.1624,208.689648,
+ 0.928307,-0.279087,0.245675,28.678251,-128.84421,209.922973,
+ 0.928307,-0.279087,0.245675,27.394728,-132.069597,211.108839,
+ 0.776625,-0.627301,0.057852,28.307706,-131.1624,208.689648,
+ 0.776625,-0.627301,0.057852,27.394728,-132.069597,211.108839,
+ 0.776625,-0.627301,0.057852,26.142541,-133.671034,210.553934,
+ 0.7719,-0.634291,0.042958,26.747339,-133.082055,208.382989,
+ 0.7719,-0.634291,0.042958,28.307706,-131.1624,208.689648,
+ 0.7719,-0.634291,0.042958,26.142541,-133.671034,210.553934,
+ 0.278339,0.911911,0.301571,26.259972,-123.715597,205.544272,
+ 0.278339,0.911911,0.301571,24.115799,-122.606091,204.168266,
+ 0.278339,0.911911,0.301571,24.190334,-123.130269,205.68452,
+ 0.360041,0.9159,0.177474,26.259972,-123.715597,205.544272,
+ 0.360041,0.9159,0.177474,25.708413,-123.202675,204.016153,
+ 0.360041,0.9159,0.177474,24.115799,-122.606091,204.168266,
+ 0.54826,0.832329,0.081487,27.619246,-124.593892,205.369952,
+ 0.54826,0.832329,0.081487,25.708413,-123.202675,204.016153,
+ 0.54826,0.832329,0.081487,26.259972,-123.715597,205.544272,
+ 0.470292,0.855765,0.21562,27.619246,-124.593892,205.369952,
+ 0.470292,0.855765,0.21562,26.883632,-123.782526,203.754216,
+ 0.470292,0.855765,0.21562,25.708413,-123.202675,204.016153,
+ 0.198064,0.943298,0.266381,26.373447,-124.014345,207.191951,
+ 0.198064,0.943298,0.266381,24.190334,-123.130269,205.68452,
+ 0.198064,0.943298,0.266381,24.234142,-123.640758,207.459669,
+ 0.278519,0.948207,0.152742,26.373447,-124.014345,207.191951,
+ 0.278519,0.948207,0.152742,26.259972,-123.715597,205.544272,
+ 0.278519,0.948207,0.152742,24.190334,-123.130269,205.68452,
+ 0.510847,0.85137,0.119184,27.737893,-124.79681,206.933056,
+ 0.510847,0.85137,0.119184,26.259972,-123.715597,205.544272,
+ 0.510847,0.85137,0.119184,26.373447,-124.014345,207.191951,
+ 0.547526,0.834124,0.066723,27.737893,-124.79681,206.933056,
+ 0.547526,0.834124,0.066723,27.619246,-124.593892,205.369952,
+ 0.547526,0.834124,0.066723,26.259972,-123.715597,205.544272,
+ 0.162044,0.975167,0.150969,26.589447,-124.416225,209.940618,
+ 0.162044,0.975167,0.150969,24.234142,-123.640758,207.459669,
+ 0.162044,0.975167,0.150969,24.283731,-124.03412,209.947311,
+ 0.186115,0.97418,0.127808,26.589447,-124.416225,209.940618,
+ 0.186115,0.97418,0.127808,26.373447,-124.014345,207.191951,
+ 0.186115,0.97418,0.127808,24.234142,-123.640758,207.459669,
+ 0.545737,0.834216,0.079084,28.000743,-125.338329,209.928449,
+ 0.545737,0.834216,0.079084,26.373447,-124.014345,207.191951,
+ 0.545737,0.834216,0.079084,26.589447,-124.416225,209.940618,
+ 0.510032,0.853159,0.109482,28.000743,-125.338329,209.928449,
+ 0.510032,0.853159,0.109482,27.737893,-124.79681,206.933056,
+ 0.510032,0.853159,0.109482,26.373447,-124.014345,207.191951,
+ 0.175135,0.971892,0.157331,26.263014,-124.609104,211.295937,
+ 0.175135,0.971892,0.157331,24.283731,-124.03412,209.947311,
+ 0.175135,0.971892,0.157331,24.124317,-124.210266,211.212884,
+ 0.161409,0.970877,0.177043,26.589447,-124.416225,209.940618,
+ 0.161409,0.970877,0.177043,24.283731,-124.03412,209.947311,
+ 0.161409,0.970877,0.177043,26.263014,-124.609104,211.295937,
+ 0.62712,0.73574,0.255748,27.460137,-125.661111,211.3869,
+ 0.62712,0.73574,0.255748,26.589447,-124.416225,209.940618,
+ 0.62712,0.73574,0.255748,26.263014,-124.609104,211.295937,
+ 0.512025,0.778884,0.362174,28.000743,-125.338329,209.928449,
+ 0.512025,0.778884,0.362174,26.589447,-124.416225,209.940618,
+ 0.512025,0.778884,0.362174,27.460137,-125.661111,211.3869,
+ 0.464582,0.807014,0.364545,25.131604,-125.802271,213.453496,
+ 0.464582,0.807014,0.364545,24.124317,-124.210266,211.212884,
+ 0.464582,0.807014,0.364545,23.816442,-125.11442,213.606825,
+ 0.135095,0.835375,0.53282,26.263014,-124.609104,211.295937,
+ 0.135095,0.835375,0.53282,24.124317,-124.210266,211.212884,
+ 0.135095,0.835375,0.53282,25.131604,-125.802271,213.453496,
+ 0.512911,0.608524,0.605492,26.263014,-124.609104,211.295937,
+ 0.512911,0.608524,0.605492,25.131604,-125.802271,213.453496,
+ 0.512911,0.608524,0.605492,26.147409,-126.437796,213.231717,
+ 0.495299,0.616539,0.612012,27.460137,-125.661111,211.3869,
+ 0.495299,0.616539,0.612012,26.263014,-124.609104,211.295937,
+ 0.495299,0.616539,0.612012,26.147409,-126.437796,213.231717,
+ -0.52009,-0.72897,0.445095,21.704821,-132.302633,211.436793,
+ -0.52009,-0.72897,0.445095,20.239372,-130.746829,212.272497,
+ -0.52009,-0.72897,0.445095,21.481825,-132.525629,210.811004,
+ -0.500903,-0.730827,0.463668,21.481825,-132.525629,210.811004,
+ -0.500903,-0.730827,0.463668,20.239372,-130.746829,212.272497,
+ -0.500903,-0.730827,0.463668,19.536918,-130.811021,211.412455,
+ -0.653665,-0.496711,0.570965,19.536918,-130.811021,211.412455,
+ -0.653665,-0.496711,0.570965,20.239372,-130.746829,212.272497,
+ -0.653665,-0.496711,0.570965,19.658304,-129.13657,213.008112,
+ -0.744797,-0.431256,0.509211,19.536918,-130.811021,211.412455,
+ -0.744797,-0.431256,0.509211,19.658304,-129.13657,213.008112,
+ -0.744797,-0.431256,0.509211,18.808301,-129.032525,211.852972,
+ -0.081776,-0.746704,-0.66011,27.187552,-129.91721,204.411949,
+ -0.081776,-0.746704,-0.66011,26.950865,-131.479402,206.208394,
+ -0.081776,-0.746704,-0.66011,24.83103,-132.188548,207.273179,
+ 0.06141,-0.805755,-0.589057,27.187552,-129.91721,204.411949,
+ 0.06141,-0.805755,-0.589057,24.83103,-132.188548,207.273179,
+ 0.06141,-0.805755,-0.589057,25.226826,-130.700283,205.278684,
+ -0.160654,-0.775508,-0.610555,25.226826,-130.700283,205.278684,
+ -0.160654,-0.775508,-0.610555,24.83103,-132.188548,207.273179,
+ -0.160654,-0.775508,-0.610555,22.206791,-130.729489,206.110434,
+ -0.242707,-0.832894,-0.497374,24.83103,-132.188548,207.273179,
+ -0.242707,-0.832894,-0.497374,21.928426,-131.965856,208.316669,
+ -0.242707,-0.832894,-0.497374,22.206791,-130.729489,206.110434,
+ -0.651309,-0.651653,-0.388774,21.928426,-131.965856,208.316669,
+ -0.651309,-0.651653,-0.388774,21.789091,-132.58617,209.589847,
+ -0.651309,-0.651653,-0.388774,19.50102,-130.745612,210.337935,
+ -0.595005,-0.762438,-0.254276,21.928426,-131.965856,208.316669,
+ -0.595005,-0.762438,-0.254276,19.50102,-130.745612,210.337935,
+ -0.595005,-0.762438,-0.254276,19.649177,-130.431349,209.048936,
+ -0.907927,-0.371092,-0.194831,19.649177,-130.431349,209.048936,
+ -0.907927,-0.371092,-0.194831,19.50102,-130.745612,210.337935,
+ -0.907927,-0.371092,-0.194831,18.605079,-128.555806,210.342194,
+ -0.893813,-0.44082,-0.082313,19.649177,-130.431349,209.048936,
+ -0.893813,-0.44082,-0.082313,18.605079,-128.555806,210.342194,
+ -0.893813,-0.44082,-0.082313,18.638848,-128.385744,209.064756,
+ -0.972218,0.234013,0.005453,18.922994,-127.193185,208.546966,
+ -0.972218,0.234013,0.005453,18.638848,-128.385744,209.064756,
+ -0.972218,0.234013,0.005453,18.605079,-128.555806,210.342194,
+ -0.846674,0.485239,0.218372,18.922994,-127.193185,208.546966,
+ -0.846674,0.485239,0.218372,18.605079,-128.555806,210.342194,
+ -0.846674,0.485239,0.218372,19.090317,-127.465162,209.800066,
+ -0.945504,0.268304,0.184484,18.922994,-127.193185,208.546966,
+ -0.945504,0.268304,0.184484,19.090317,-127.465162,209.800066,
+ -0.945504,0.268304,0.184484,19.473031,-125.455456,208.838717,
+ -0.917344,0.299916,0.261781,19.473031,-125.455456,208.838717,
+ -0.917344,0.299916,0.261781,19.090317,-127.465162,209.800066,
+ -0.917344,0.299916,0.261781,19.67169,-125.857944,209.995987,
+ -0.810943,0.49533,0.311479,19.473031,-125.455456,208.838717,
+ -0.810943,0.49533,0.311479,19.67169,-125.857944,209.995987,
+ -0.810943,0.49533,0.311479,20.432555,-124.953181,210.538115,
+ -0.806911,0.505026,0.306337,19.473031,-125.455456,208.838717,
+ -0.806911,0.505026,0.306337,20.432555,-124.953181,210.538115,
+ -0.806911,0.505026,0.306337,20.049841,-124.790726,209.262198,
+ -0.561278,0.783016,0.268054,21.267955,-124.154288,209.9537,
+ -0.561278,0.783016,0.268054,20.049841,-124.790726,209.262198,
+ -0.561278,0.783016,0.268054,20.432555,-124.953181,210.538115,
+ -0.573301,0.780913,0.247993,21.579785,-124.341082,211.262777,
+ -0.573301,0.780913,0.247993,21.267955,-124.154288,209.9537,
+ -0.573301,0.780913,0.247993,20.432555,-124.953181,210.538115,
+ -0.047767,0.987188,0.152241,24.124317,-124.210266,211.212884,
+ -0.047767,0.987188,0.152241,21.267955,-124.154288,209.9537,
+ -0.047767,0.987188,0.152241,21.579785,-124.341082,211.262777,
+ -0.039181,0.990354,0.132905,24.283731,-124.03412,209.947311,
+ -0.039181,0.990354,0.132905,21.267955,-124.154288,209.9537,
+ -0.039181,0.990354,0.132905,24.124317,-124.210266,211.212884,
+ 0.889302,0.247665,0.384452,28.000743,-125.338329,209.928449,
+ 0.889302,0.247665,0.384452,27.460137,-125.661111,211.3869,
+ 0.889302,0.247665,0.384452,28.261464,-127.265286,210.566712,
+ 0.951668,0.204625,0.229036,28.580595,-127.066323,209.062931,
+ 0.951668,0.204625,0.229036,28.000743,-125.338329,209.928449,
+ 0.951668,0.204625,0.229036,28.261464,-127.265286,210.566712,
+ 0.960768,0.161759,0.225296,28.580595,-127.066323,209.062931,
+ 0.960768,0.161759,0.225296,28.261464,-127.265286,210.566712,
+ 0.960768,0.161759,0.225296,28.678251,-128.84421,209.922973,
+ 0.980616,0.126321,0.149786,28.906115,-128.410082,208.065075,
+ 0.980616,0.126321,0.149786,28.580595,-127.066323,209.062931,
+ 0.980616,0.126321,0.149786,28.678251,-128.84421,209.922973,
+ -0.763976,-0.563314,-0.314672,18.736504,-137.63173,204.327679,
+ -0.763976,-0.563314,-0.314672,18.438364,-138.222229,206.108608,
+ -0.763976,-0.563314,-0.314672,17.505308,-137.499088,207.079388,
+ -0.660301,-0.704002,-0.261503,18.736504,-137.63173,204.327679,
+ -0.660301,-0.704002,-0.261503,17.505308,-137.499088,207.079388,
+ -0.660301,-0.704002,-0.261503,17.581973,-136.93749,205.373907,
+ -0.471522,-0.74686,-0.4689,21.704821,-139.140378,204.286305,
+ -0.471522,-0.74686,-0.4689,18.438364,-138.222229,206.108608,
+ -0.471522,-0.74686,-0.4689,21.597734,-138.160168,202.832721,
+ -0.342485,-0.873157,-0.346845,21.597734,-138.160168,202.832721,
+ -0.342485,-0.873157,-0.346845,18.438364,-138.222229,206.108608,
+ -0.342485,-0.873157,-0.346845,18.736504,-137.63173,204.327679,
+ 0.949391,0.312808,-0.028429,23.030326,-133.973737,203.43904,
+ 0.949391,0.312808,-0.028429,23.225638,-134.423076,205.017356,
+ 0.949391,0.312808,-0.028429,23.541423,-135.410284,204.700658,
+ 0.960976,0.260739,-0.092411,23.207993,-134.943604,202.550096,
+ 0.960976,0.260739,-0.092411,23.030326,-133.973737,203.43904,
+ 0.960976,0.260739,-0.092411,23.541423,-135.410284,204.700658,
+ 0.582092,0.804095,0.120828,23.030326,-133.973737,203.43904,
+ 0.582092,0.804095,0.120828,21.016666,-132.775093,205.163079,
+ 0.582092,0.804095,0.120828,21.081161,-133.09392,206.974127,
+ 0.613502,0.776252,0.145076,23.225638,-134.423076,205.017356,
+ 0.613502,0.776252,0.145076,23.030326,-133.973737,203.43904,
+ 0.613502,0.776252,0.145076,21.081161,-133.09392,206.974127,
+ 0.229406,0.95401,0.192969,21.211369,-133.404533,209.162716,
+ 0.229406,0.95401,0.192969,19.677774,-132.726417,207.633381,
+ 0.229406,0.95401,0.192969,19.788208,-133.189446,209.791244,
+ 0.30237,0.946071,0.116281,21.211369,-133.404533,209.162716,
+ 0.30237,0.946071,0.116281,21.081161,-133.09392,206.974127,
+ 0.30237,0.946071,0.116281,19.677774,-132.726417,207.633381,
+ -0.234568,0.896344,0.376226,19.788208,-133.189446,209.791244,
+ -0.234568,0.896344,0.376226,18.280168,-132.718203,207.728299,
+ -0.234568,0.896344,0.376226,18.680527,-133.406663,209.61814,
+ 0.019926,0.977758,0.208785,19.788208,-133.189446,209.791244,
+ 0.019926,0.977758,0.208785,19.677774,-132.726417,207.633381,
+ 0.019926,0.977758,0.208785,18.280168,-132.718203,207.728299,
+ -0.403349,0.816608,0.412868,18.680527,-133.406663,209.61814,
+ -0.403349,0.816608,0.412868,17.364148,-133.100613,207.726778,
+ -0.403349,0.816608,0.412868,17.853645,-133.828622,209.644912,
+ -0.356011,0.85125,0.385526,18.680527,-133.406663,209.61814,
+ -0.356011,0.85125,0.385526,18.280168,-132.718203,207.728299,
+ -0.356011,0.85125,0.385526,17.364148,-133.100613,207.726778,
+ -0.628755,0.735601,0.252109,17.853645,-133.828622,209.644912,
+ -0.628755,0.735601,0.252109,16.397628,-134.516169,208.019746,
+ -0.628755,0.735601,0.252109,16.656523,-135.020877,210.13806,
+ -0.716323,0.571847,0.39984,17.364148,-133.100613,207.726778,
+ -0.716323,0.571847,0.39984,16.397628,-134.516169,208.019746,
+ -0.716323,0.571847,0.39984,17.853645,-133.828622,209.644912,
+ -0.939853,0.338769,0.043735,16.290541,-135.775049,208.114968,
+ -0.939853,0.338769,0.043735,16.289932,-136.061324,210.319377,
+ -0.939853,0.338769,0.043735,16.656523,-135.020877,210.13806,
+ -0.985196,0.094619,0.142952,16.397628,-134.516169,208.019746,
+ -0.985196,0.094619,0.142952,16.290541,-135.775049,208.114968,
+ -0.985196,0.094619,0.142952,16.656523,-135.020877,210.13806,
+ -0.929897,-0.296957,-0.217044,17.505308,-137.499088,207.079388,
+ -0.929897,-0.296957,-0.217044,17.188915,-138.062816,209.20622,
+ -0.929897,-0.296957,-0.217044,16.289932,-136.061324,210.319377,
+ -0.834997,-0.545642,-0.07109,17.505308,-137.499088,207.079388,
+ -0.834997,-0.545642,-0.07109,16.289932,-136.061324,210.319377,
+ -0.834997,-0.545642,-0.07109,16.290541,-135.775049,208.114968,
+ -0.782286,-0.552817,-0.287092,18.438364,-138.222229,206.108608,
+ -0.782286,-0.552817,-0.287092,18.149047,-138.86536,208.135351,
+ -0.782286,-0.552817,-0.287092,17.188915,-138.062816,209.20622,
+ -0.749949,-0.603232,-0.271454,18.438364,-138.222229,206.108608,
+ -0.749949,-0.603232,-0.271454,17.188915,-138.062816,209.20622,
+ -0.749949,-0.603232,-0.271454,17.505308,-137.499088,207.079388,
+ -0.553495,-0.693097,-0.4618,21.704821,-139.140378,204.286305,
+ -0.553495,-0.693097,-0.4618,21.032789,-140.688272,207.414948,
+ -0.553495,-0.693097,-0.4618,18.149047,-138.86536,208.135351,
+ -0.420889,-0.845579,-0.328403,21.704821,-139.140378,204.286305,
+ -0.420889,-0.845579,-0.328403,18.149047,-138.86536,208.135351,
+ -0.420889,-0.845579,-0.328403,18.438364,-138.222229,206.108608,
+ 0.957218,0.289105,0.012326,23.225638,-134.423076,205.017356,
+ 0.957218,0.289105,0.012326,23.169661,-134.344586,207.523556,
+ 0.957218,0.289105,0.012326,23.599834,-135.7571,207.24732,
+ 0.954028,0.299123,0.018854,23.541423,-135.410284,204.700658,
+ 0.954028,0.299123,0.018854,23.225638,-134.423076,205.017356,
+ 0.954028,0.299123,0.018854,23.599834,-135.7571,207.24732,
+ 0.577412,0.81243,0.080951,23.225638,-134.423076,205.017356,
+ 0.577412,0.81243,0.080951,21.081161,-133.09392,206.974127,
+ 0.577412,0.81243,0.080951,21.211369,-133.404533,209.162716,
+ 0.419678,0.907473,-0.019047,23.225638,-134.423076,205.017356,
+ 0.419678,0.907473,-0.019047,21.211369,-133.404533,209.162716,
+ 0.419678,0.907473,-0.019047,23.169661,-134.344586,207.523556,
+ 0.222745,0.954561,0.197985,22.057113,-134.130108,211.773874,
+ 0.222745,0.954561,0.197985,19.788208,-133.189446,209.791244,
+ 0.222745,0.954561,0.197985,20.560025,-133.882165,212.262762,
+ 0.228692,0.954544,0.191171,22.057113,-134.130108,211.773874,
+ 0.228692,0.954544,0.191171,21.211369,-133.404533,209.162716,
+ 0.228692,0.954544,0.191171,19.788208,-133.189446,209.791244,
+ -0.491645,0.726533,0.480036,20.560025,-133.882165,212.262762,
+ -0.491645,0.726533,0.480036,18.680527,-133.406663,209.61814,
+ -0.491645,0.726533,0.480036,18.926644,-134.261837,211.164512,
+ -0.230956,0.915729,0.328785,20.560025,-133.882165,212.262762,
+ -0.230956,0.915729,0.328785,19.788208,-133.189446,209.791244,
+ -0.230956,0.915729,0.328785,18.680527,-133.406663,209.61814,
+ -0.580053,0.577708,0.574275,17.853645,-133.828622,209.644912,
+ -0.580053,0.577708,0.574275,18.442624,-134.618388,211.034304,
+ -0.580053,0.577708,0.574275,18.926644,-134.261837,211.164512,
+ -0.382746,0.781317,0.493001,18.926644,-134.261837,211.164512,
+ -0.382746,0.781317,0.493001,18.680527,-133.406663,209.61814,
+ -0.382746,0.781317,0.493001,17.853645,-133.828622,209.644912,
+ -0.410018,0.784846,0.464652,18.442624,-134.618388,211.034304,
+ -0.410018,0.784846,0.464652,16.656523,-135.020877,210.13806,
+ -0.410018,0.784846,0.464652,16.850618,-135.793911,211.615069,
+ -0.444173,0.684898,0.577603,18.442624,-134.618388,211.034304,
+ -0.444173,0.684898,0.577603,17.853645,-133.828622,209.644912,
+ -0.444173,0.684898,0.577603,16.656523,-135.020877,210.13806,
+ -0.919777,0.123314,0.372565,16.289932,-136.061324,210.319377,
+ -0.919777,0.123314,0.372565,16.642224,-136.644218,211.382033,
+ -0.919777,0.123314,0.372565,16.850618,-135.793911,211.615069,
+ -0.880024,0.363362,0.30582,16.656523,-135.020877,210.13806,
+ -0.880024,0.363362,0.30582,16.289932,-136.061324,210.319377,
+ -0.880024,0.363362,0.30582,16.850618,-135.793911,211.615069,
+ -0.959907,-0.273123,-0.063112,17.188915,-138.062816,209.20622,
+ -0.959907,-0.273123,-0.063112,17.195304,-138.464392,210.846902,
+ -0.959907,-0.273123,-0.063112,16.642224,-136.644218,211.382033,
+ -0.898059,-0.435956,0.058592,17.188915,-138.062816,209.20622,
+ -0.898059,-0.435956,0.058592,16.642224,-136.644218,211.382033,
+ -0.898059,-0.435956,0.058592,16.289932,-136.061324,210.319377,
+ -0.825852,-0.521991,-0.213291,18.149047,-138.86536,208.135351,
+ -0.825852,-0.521991,-0.213291,18.500122,-140.195124,210.030364,
+ -0.825852,-0.521991,-0.213291,17.195304,-138.464392,210.846902,
+ -0.731701,-0.662734,-0.159363,18.149047,-138.86536,208.135351,
+ -0.731701,-0.662734,-0.159363,17.195304,-138.464392,210.846902,
+ -0.731701,-0.662734,-0.159363,17.188915,-138.062816,209.20622,
+ 0.234894,0.891577,0.38719,19.510451,-131.897102,204.161268,
+ 0.234894,0.891577,0.38719,17.502266,-130.77786,202.802298,
+ 0.234894,0.891577,0.38719,17.75751,-131.591965,204.522079,
+ 0.232078,0.890783,0.390698,19.613583,-131.142321,202.379122,
+ 0.232078,0.890783,0.390698,17.502266,-130.77786,202.802298,
+ 0.232078,0.890783,0.390698,19.510451,-131.897102,204.161268,
+ -0.484636,0.77793,0.399941,17.75751,-131.591965,204.522079,
+ -0.484636,0.77793,0.399941,16.445087,-131.472404,202.699166,
+ -0.484636,0.77793,0.399941,16.797987,-132.163298,204.470665,
+ -0.525332,0.736286,0.426509,17.75751,-131.591965,204.522079,
+ -0.525332,0.736286,0.426509,17.502266,-130.77786,202.802298,
+ -0.525332,0.736286,0.426509,16.445087,-131.472404,202.699166,
+ -0.871252,0.428694,0.239043,15.843939,-133.15872,202.778569,
+ -0.871252,0.428694,0.239043,16.141775,-133.618403,204.688489,
+ -0.871252,0.428694,0.239043,16.797987,-132.163298,204.470665,
+ -0.891706,0.332348,0.307254,16.445087,-131.472404,202.699166,
+ -0.891706,0.332348,0.307254,15.843939,-133.15872,202.778569,
+ -0.891706,0.332348,0.307254,16.797987,-132.163298,204.470665,
+ -0.996109,-0.084339,0.025562,16.171893,-134.551155,202.784653,
+ -0.996109,-0.084339,0.025562,16.254338,-134.935694,204.728647,
+ -0.996109,-0.084339,0.025562,16.141775,-133.618403,204.688489,
+ -0.968939,-0.227789,0.096273,15.843939,-133.15872,202.778569,
+ -0.968939,-0.227789,0.096273,16.171893,-134.551155,202.784653,
+ -0.968939,-0.227789,0.096273,16.141775,-133.618403,204.688489,
+ -0.754829,-0.626898,-0.192956,17.822919,-135.957279,201.91153,
+ -0.754829,-0.626898,-0.192956,17.774851,-136.474156,203.778859,
+ -0.754829,-0.626898,-0.192956,16.254338,-134.935694,204.728647,
+ -0.678574,-0.725516,-0.114735,17.822919,-135.957279,201.91153,
+ -0.678574,-0.725516,-0.114735,16.254338,-134.935694,204.728647,
+ -0.678574,-0.725516,-0.114735,16.171893,-134.551155,202.784653,
+ -0.574158,-0.780179,-0.248323,19.000571,-136.501232,201.029888,
+ -0.574158,-0.780179,-0.248323,18.956458,-137.06496,202.902997,
+ -0.574158,-0.780179,-0.248323,17.774851,-136.474156,203.778859,
+ -0.547634,-0.802665,-0.236275,19.000571,-136.501232,201.029888,
+ -0.547634,-0.802665,-0.236275,17.774851,-136.474156,203.778859,
+ -0.547634,-0.802665,-0.236275,17.822919,-135.957279,201.91153,
+ -0.200302,-0.90255,-0.381159,21.692956,-136.96487,201.227938,
+ -0.200302,-0.90255,-0.381159,18.956458,-137.06496,202.902997,
+ -0.200302,-0.90255,-0.381159,20.887979,-136.159893,199.744844,
+ -0.023401,-0.957159,-0.288616,20.887979,-136.159893,199.744844,
+ -0.023401,-0.957159,-0.288616,18.956458,-137.06496,202.902997,
+ -0.023401,-0.957159,-0.288616,19.000571,-136.501232,201.029888,
+ 0.982482,0.156481,-0.101208,22.184583,-133.176061,199.941981,
+ 0.982482,0.156481,-0.101208,22.426441,-133.439823,201.88202,
+ 0.982482,0.156481,-0.101208,22.526835,-134.646681,200.990643,
+ 0.925872,-0.051442,-0.374319,21.782702,-134.54294,199.135787,
+ 0.925872,-0.051442,-0.374319,22.184583,-133.176061,199.941981,
+ 0.925872,-0.051442,-0.374319,22.526835,-134.646681,200.990643,
+ 0.838376,0.51628,0.174874,22.184583,-133.176061,199.941981,
+ 0.838376,0.51628,0.174874,20.996587,-131.825609,201.650505,
+ 0.838376,0.51628,0.174874,20.946085,-132.385686,203.546127,
+ 0.60405,0.796265,0.032953,22.426441,-133.439823,201.88202,
+ 0.60405,0.796265,0.032953,22.184583,-133.176061,199.941981,
+ 0.60405,0.796265,0.032953,20.946085,-132.385686,203.546127,
+ 0.384615,0.898967,0.209593,21.016666,-132.775093,205.163079,
+ 0.384615,0.898967,0.209593,19.510451,-131.897102,204.161268,
+ 0.384615,0.898967,0.209593,19.586507,-132.325145,205.857623,
+ 0.391173,0.898477,0.199304,21.016666,-132.775093,205.163079,
+ 0.391173,0.898477,0.199304,20.946085,-132.385686,203.546127,
+ 0.391173,0.898477,0.199304,19.510451,-131.897102,204.161268,
+ 0.17763,0.944777,0.275399,19.586507,-132.325145,205.857623,
+ 0.17763,0.944777,0.275399,17.75751,-131.591965,204.522079,
+ 0.17763,0.944777,0.275399,17.954952,-132.095456,206.121994,
+ 0.212667,0.949648,0.230091,19.586507,-132.325145,205.857623,
+ 0.212667,0.949648,0.230091,19.510451,-131.897102,204.161268,
+ 0.212667,0.949648,0.230091,17.75751,-131.591965,204.522079,
+ -0.492238,0.812823,0.311482,17.954952,-132.095456,206.121994,
+ -0.492238,0.812823,0.311482,16.797987,-132.163298,204.470665,
+ -0.492238,0.812823,0.311482,17.068746,-132.620243,206.090963,
+ -0.497883,0.807763,0.315644,17.954952,-132.095456,206.121994,
+ -0.497883,0.807763,0.315644,17.75751,-131.591965,204.522079,
+ -0.497883,0.807763,0.315644,16.797987,-132.163298,204.470665,
+ -0.828259,0.534978,0.166691,16.141775,-133.618403,204.688489,
+ -0.828259,0.534978,0.166691,16.329177,-133.838053,206.324608,
+ -0.828259,0.534978,0.166691,17.068746,-132.620243,206.090963,
+ -0.863423,0.429093,0.265292,16.797987,-132.163298,204.470665,
+ -0.863423,0.429093,0.265292,16.141775,-133.618403,204.688489,
+ -0.863423,0.429093,0.265292,17.068746,-132.620243,206.090963,
+ -0.994892,0.098693,-0.021224,16.254338,-134.935694,204.728647,
+ -0.994892,0.098693,-0.021224,16.192276,-135.211626,206.354726,
+ -0.994892,0.098693,-0.021224,16.329177,-133.838053,206.324608,
+ -0.991371,-0.081585,0.1026,16.141775,-133.618403,204.688489,
+ -0.991371,-0.081585,0.1026,16.254338,-134.935694,204.728647,
+ -0.991371,-0.081585,0.1026,16.329177,-133.838053,206.324608,
+ -0.818586,-0.517462,-0.2493,17.774851,-136.474156,203.778859,
+ -0.818586,-0.517462,-0.2493,17.581973,-136.93749,205.373907,
+ -0.818586,-0.517462,-0.2493,16.192276,-135.211626,206.354726,
+ -0.745904,-0.651387,-0.139003,17.774851,-136.474156,203.778859,
+ -0.745904,-0.651387,-0.139003,16.192276,-135.211626,206.354726,
+ -0.745904,-0.651387,-0.139003,16.254338,-134.935694,204.728647,
+ -0.696751,-0.623059,-0.355437,18.956458,-137.06496,202.902997,
+ -0.696751,-0.623059,-0.355437,18.736504,-137.63173,204.327679,
+ -0.696751,-0.623059,-0.355437,17.581973,-136.93749,205.373907,
+ -0.591272,-0.752495,-0.290085,18.956458,-137.06496,202.902997,
+ -0.591272,-0.752495,-0.290085,17.581973,-136.93749,205.373907,
+ -0.591272,-0.752495,-0.290085,17.774851,-136.474156,203.778859,
+ -0.423111,-0.714453,-0.557255,21.692956,-136.96487,201.227938,
+ -0.423111,-0.714453,-0.557255,21.597734,-138.160168,202.832721,
+ -0.423111,-0.714453,-0.557255,18.736504,-137.63173,204.327679,
+ -0.205247,-0.898096,-0.38897,21.692956,-136.96487,201.227938,
+ -0.205247,-0.898096,-0.38897,18.736504,-137.63173,204.327679,
+ -0.205247,-0.898096,-0.38897,18.956458,-137.06496,202.902997,
+ 0.901984,0.369684,-0.223064,22.426441,-133.439823,201.88202,
+ 0.901984,0.369684,-0.223064,23.030326,-133.973737,203.43904,
+ 0.901984,0.369684,-0.223064,23.207993,-134.943604,202.550096,
+ 0.889893,0.316595,-0.328419,22.526835,-134.646681,200.990643,
+ 0.889893,0.316595,-0.328419,22.426441,-133.439823,201.88202,
+ 0.889893,0.316595,-0.328419,23.207993,-134.943604,202.550096,
+ 0.67652,0.722133,0.14438,22.426441,-133.439823,201.88202,
+ 0.67652,0.722133,0.14438,20.946085,-132.385686,203.546127,
+ 0.67652,0.722133,0.14438,21.016666,-132.775093,205.163079,
+ 0.553693,0.829791,0.069793,23.030326,-133.973737,203.43904,
+ 0.553693,0.829791,0.069793,22.426441,-133.439823,201.88202,
+ 0.553693,0.829791,0.069793,21.016666,-132.775093,205.163079,
+ 0.331905,0.923638,0.191658,21.081161,-133.09392,206.974127,
+ 0.331905,0.923638,0.191658,19.586507,-132.325145,205.857623,
+ 0.331905,0.923638,0.191658,19.677774,-132.726417,207.633381,
+ 0.361923,0.920205,0.149109,21.081161,-133.09392,206.974127,
+ 0.361923,0.920205,0.149109,21.016666,-132.775093,205.163079,
+ 0.361923,0.920205,0.149109,19.586507,-132.325145,205.857623,
+ 0.029673,0.933982,0.356087,19.677774,-132.726417,207.633381,
+ 0.029673,0.933982,0.356087,17.954952,-132.095456,206.121994,
+ 0.029673,0.933982,0.356087,18.280168,-132.718203,207.728299,
+ 0.169445,0.963138,0.208934,19.677774,-132.726417,207.633381,
+ 0.169445,0.963138,0.208934,19.586507,-132.325145,205.857623,
+ 0.169445,0.963138,0.208934,17.954952,-132.095456,206.121994,
+ -0.365131,0.873348,0.322402,18.280168,-132.718203,207.728299,
+ -0.365131,0.873348,0.322402,17.068746,-132.620243,206.090963,
+ -0.365131,0.873348,0.322402,17.364148,-133.100613,207.726778,
+ -0.477331,0.782416,0.399976,18.280168,-132.718203,207.728299,
+ -0.477331,0.782416,0.399976,17.954952,-132.095456,206.121994,
+ -0.477331,0.782416,0.399976,17.068746,-132.620243,206.090963,
+ -0.770452,0.580558,0.263355,16.329177,-133.838053,206.324608,
+ -0.770452,0.580558,0.263355,16.397628,-134.516169,208.019746,
+ -0.770452,0.580558,0.263355,17.364148,-133.100613,207.726778,
+ -0.78874,0.536554,0.299997,17.068746,-132.620243,206.090963,
+ -0.78874,0.536554,0.299997,16.329177,-133.838053,206.324608,
+ -0.78874,0.536554,0.299997,17.364148,-133.100613,207.726778,
+ 0.497257,-0.659193,-0.564092,22.361945,-136.523745,201.302168,
+ 0.497257,-0.659193,-0.564092,21.692956,-136.96487,201.227938,
+ 0.497257,-0.659193,-0.564092,21.354963,-135.810643,199.581171,
+ 0.344014,-0.734257,-0.585253,21.692956,-136.96487,201.227938,
+ 0.344014,-0.734257,-0.585253,20.887979,-136.159893,199.744844,
+ 0.344014,-0.734257,-0.585253,21.354963,-135.810643,199.581171,
+ 0.828135,-0.366907,-0.423759,22.782079,-135.746148,201.311903,
+ 0.828135,-0.366907,-0.423759,23.349458,-136.416658,203.001261,
+ 0.828135,-0.366907,-0.423759,22.820412,-137.742163,203.115041,
+ 0.776877,-0.413803,-0.474582,22.361945,-136.523745,201.302168,
+ 0.776877,-0.413803,-0.474582,22.782079,-135.746148,201.311903,
+ 0.776877,-0.413803,-0.474582,22.820412,-137.742163,203.115041,
+ 0.380215,-0.720255,-0.580232,22.820412,-137.742163,203.115041,
+ 0.380215,-0.720255,-0.580232,21.597734,-138.160168,202.832721,
+ 0.380215,-0.720255,-0.580232,22.361945,-136.523745,201.302168,
+ 0.464787,-0.556424,-0.688742,20.367451,-134.726692,198.039058,
+ 0.464787,-0.556424,-0.688742,21.609599,-135.27673,199.321668,
+ 0.464787,-0.556424,-0.688742,21.354963,-135.810643,199.581171,
+ 0.46494,-0.55622,-0.688803,21.609599,-135.27673,199.321668,
+ 0.46494,-0.55622,-0.688803,20.367451,-134.726692,198.039058,
+ 0.46494,-0.55622,-0.688803,20.614481,-134.293781,197.856219,
+ -0.501388,-0.253139,-0.827364,20.058663,-133.976475,197.800851,
+ -0.501388,-0.253139,-0.827364,19.796726,-134.611087,198.153751,
+ -0.501388,-0.253139,-0.827364,17.453286,-134.245105,199.461915,
+ -0.350188,0.248493,-0.903117,17.091259,-130.95431,200.255637,
+ -0.350188,0.248493,-0.903117,19.033731,-131.582534,199.329578,
+ -0.350188,0.248493,-0.903117,16.653176,-131.342805,200.318611,
+ -0.289605,0.391823,-0.873272,17.091259,-130.95431,200.255637,
+ -0.289605,0.391823,-0.873272,18.487953,-131.028541,199.759143,
+ -0.289605,0.391823,-0.873272,19.033731,-131.582534,199.329578,
+ -0.379868,0.280171,-0.881592,16.653176,-131.342805,200.318611,
+ -0.379868,0.280171,-0.881592,20.274358,-132.619939,198.352409,
+ -0.379868,0.280171,-0.881592,16.168547,-132.327275,200.214566,
+ -0.309289,0.429372,-0.848517,16.653176,-131.342805,200.318611,
+ -0.309289,0.429372,-0.848517,19.033731,-131.582534,199.329578,
+ -0.309289,0.429372,-0.848517,20.274358,-132.619939,198.352409,
+ -0.50551,-0.037293,-0.862015,16.168547,-132.327275,200.214566,
+ -0.50551,-0.037293,-0.862015,20.133807,-133.399665,197.935622,
+ -0.50551,-0.037293,-0.862015,16.393673,-133.494279,200.133034,
+ -0.330689,0.49056,-0.806223,16.168547,-132.327275,200.214566,
+ -0.330689,0.49056,-0.806223,20.274358,-132.619939,198.352409,
+ -0.330689,0.49056,-0.806223,20.133807,-133.399665,197.935622,
+ -0.494219,0.258329,-0.830069,20.133807,-133.399665,197.935622,
+ -0.494219,0.258329,-0.830069,20.058663,-133.976475,197.800851,
+ -0.494219,0.258329,-0.830069,16.393673,-133.494279,200.133034,
+ -0.537265,-0.004354,-0.843403,16.393673,-133.494279,200.133034,
+ -0.537265,-0.004354,-0.843403,20.058663,-133.976475,197.800851,
+ -0.537265,-0.004354,-0.843403,17.453286,-134.245105,199.461915,
+ -0.499337,-0.321371,-0.804601,17.453286,-134.245105,199.461915,
+ -0.499337,-0.321371,-0.804601,19.796726,-134.611087,198.153751,
+ -0.499337,-0.321371,-0.804601,18.554882,-134.766241,198.986413,
+ 0.149503,0.846753,-0.510546,20.169705,-131.354974,200.039637,
+ 0.149503,0.846753,-0.510546,19.033731,-131.582534,199.329578,
+ 0.149503,0.846753,-0.510546,18.954937,-130.754739,200.679421,
+ 0.434603,0.778836,-0.452254,19.033731,-131.582534,199.329578,
+ 0.434603,0.778836,-0.452254,18.487953,-131.028541,199.759143,
+ 0.434603,0.778836,-0.452254,18.954937,-130.754739,200.679421,
+ 0.084653,0.942481,-0.323363,18.954937,-130.754739,200.679421,
+ 0.084653,0.942481,-0.323363,18.487953,-131.028541,199.759143,
+ 0.084653,0.942481,-0.323363,17.111946,-130.44443,201.10138,
+ -0.135797,0.849936,-0.509086,18.487953,-131.028541,199.759143,
+ -0.135797,0.849936,-0.509086,17.091259,-130.95431,200.255637,
+ -0.135797,0.849936,-0.509086,17.111946,-130.44443,201.10138,
+ -0.463354,0.763888,-0.449197,17.111946,-130.44443,201.10138,
+ -0.463354,0.763888,-0.449197,17.091259,-130.95431,200.255637,
+ -0.463354,0.763888,-0.449197,16.18102,-131.058659,201.01711,
+ -0.573038,0.547303,-0.609989,17.091259,-130.95431,200.255637,
+ -0.573038,0.547303,-0.609989,16.653176,-131.342805,200.318611,
+ -0.573038,0.547303,-0.609989,16.18102,-131.058659,201.01711,
+ -0.758211,0.235089,-0.608152,16.653176,-131.342805,200.318611,
+ -0.758211,0.235089,-0.608152,15.651974,-132.55088,201.099859,
+ -0.758211,0.235089,-0.608152,16.18102,-131.058659,201.01711,
+ -0.818925,0.441843,-0.366247,16.168547,-132.327275,200.214566,
+ -0.818925,0.441843,-0.366247,15.651974,-132.55088,201.099859,
+ -0.818925,0.441843,-0.366247,16.653176,-131.342805,200.318611,
+ -0.831067,-0.17292,-0.528608,16.168547,-132.327275,200.214566,
+ -0.831067,-0.17292,-0.528608,15.93399,-133.755608,201.050575,
+ -0.831067,-0.17292,-0.528608,15.651974,-132.55088,201.099859,
+ -0.870027,-0.134703,-0.474244,16.393673,-133.494279,200.133034,
+ -0.870027,-0.134703,-0.474244,15.93399,-133.755608,201.050575,
+ -0.870027,-0.134703,-0.474244,16.168547,-132.327275,200.214566,
+ -0.729493,-0.46804,-0.498777,17.323382,-134.853858,200.049068,
+ -0.729493,-0.46804,-0.498777,15.93399,-133.755608,201.050575,
+ -0.729493,-0.46804,-0.498777,16.393673,-133.494279,200.133034,
+ -0.680258,-0.428447,-0.594711,17.453286,-134.245105,199.461915,
+ -0.680258,-0.428447,-0.594711,17.323382,-134.853858,200.049068,
+ -0.680258,-0.428447,-0.594711,16.393673,-133.494279,200.133034,
+ -0.625062,-0.468678,-0.62421,18.380258,-135.397507,199.398941,
+ -0.625062,-0.468678,-0.62421,17.323382,-134.853858,200.049068,
+ -0.625062,-0.468678,-0.62421,17.453286,-134.245105,199.461915,
+ -0.509639,-0.36743,-0.777987,17.453286,-134.245105,199.461915,
+ -0.509639,-0.36743,-0.777987,18.554882,-134.766241,198.986413,
+ -0.509639,-0.36743,-0.777987,18.380258,-135.397507,199.398941,
+ -0.492211,-0.376675,-0.784757,18.554882,-134.766241,198.986413,
+ -0.492211,-0.376675,-0.784757,19.992342,-135.061339,198.22646,
+ -0.492211,-0.376675,-0.784757,18.380258,-135.397507,199.398941,
+ -0.49309,-0.343315,-0.799373,19.796726,-134.611087,198.153751,
+ -0.49309,-0.343315,-0.799373,19.992342,-135.061339,198.22646,
+ -0.49309,-0.343315,-0.799373,18.554882,-134.766241,198.986413,
+ 0.137516,0.484128,-0.864123,21.243313,-132.560919,198.582099,
+ 0.137516,0.484128,-0.864123,20.876722,-133.756216,197.85409,
+ 0.137516,0.484128,-0.864123,20.133807,-133.399665,197.935622,
+ 0.182041,0.43781,-0.880445,21.243313,-132.560919,198.582099,
+ 0.182041,0.43781,-0.880445,20.133807,-133.399665,197.935622,
+ 0.182041,0.43781,-0.880445,20.274358,-132.619939,198.352409,
+ 0.109653,0.747857,-0.654741,21.243313,-132.560919,198.582099,
+ 0.109653,0.747857,-0.654741,20.274358,-132.619939,198.352409,
+ 0.109653,0.747857,-0.654741,19.033731,-131.582534,199.329578,
+ 0.177577,0.818483,-0.546399,21.243313,-132.560919,198.582099,
+ 0.177577,0.818483,-0.546399,19.033731,-131.582534,199.329578,
+ 0.177577,0.818483,-0.546399,20.169705,-131.354974,200.039637,
+ 0.002191,0.227251,-0.973834,20.133807,-133.399665,197.935622,
+ 0.002191,0.227251,-0.973834,20.876722,-133.756216,197.85409,
+ 0.002191,0.227251,-0.973834,20.058663,-133.976475,197.800851,
+ 0.075865,-0.040956,-0.996277,20.876722,-133.756216,197.85409,
+ 0.075865,-0.040956,-0.996277,20.614481,-134.293781,197.856219,
+ 0.075865,-0.040956,-0.996277,20.058663,-133.976475,197.800851,
+ -0.239963,-0.255496,-0.936557,19.796726,-134.611087,198.153751,
+ -0.239963,-0.255496,-0.936557,20.367451,-134.726692,198.039058,
+ -0.239963,-0.255496,-0.936557,19.992342,-135.061339,198.22646,
+ -0.156771,-0.429778,-0.889221,20.058663,-133.976475,197.800851,
+ -0.156771,-0.429778,-0.889221,20.614481,-134.293781,197.856219,
+ -0.156771,-0.429778,-0.889221,19.796726,-134.611087,198.153751,
+ -0.240325,-0.258078,-0.935756,20.614481,-134.293781,197.856219,
+ -0.240325,-0.258078,-0.935756,20.367451,-134.726692,198.039058,
+ -0.240325,-0.258078,-0.935756,19.796726,-134.611087,198.153751,
+ -0.725723,-0.423088,0.542514,20.504656,-135.805776,212.611707,
+ -0.725723,-0.423088,0.542514,21.034615,-136.575159,212.72062,
+ -0.725723,-0.423088,0.542514,20.682019,-135.351264,213.203424,
+ -0.318232,-0.425808,0.847004,20.682019,-135.351264,213.203424,
+ -0.318232,-0.425808,0.847004,21.034615,-136.575159,212.72062,
+ -0.318232,-0.425808,0.847004,21.520765,-135.725156,213.33059,
+ -0.454486,-0.033736,0.890115,19.517752,-135.586126,212.116126,
+ -0.454486,-0.033736,0.890115,20.027936,-135.901302,212.364677,
+ -0.454486,-0.033736,0.890115,20.504656,-135.805776,212.611707,
+ -0.454833,-0.635185,0.624233,20.682019,-135.351264,213.203424,
+ -0.454833,-0.635185,0.624233,19.517752,-135.586126,212.116126,
+ -0.454833,-0.635185,0.624233,20.504656,-135.805776,212.611707,
+ -0.107069,0.046165,0.993179,20.027936,-135.901302,212.364677,
+ -0.107069,0.046165,0.993179,19.000875,-135.966406,212.256982,
+ -0.107069,0.046165,0.993179,19.728884,-136.431261,212.357072,
+ -0.121557,0.485824,0.865563,19.517752,-135.586126,212.116126,
+ -0.121557,0.485824,0.865563,19.000875,-135.966406,212.256982,
+ -0.121557,0.485824,0.865563,20.027936,-135.901302,212.364677,
+ 0.187561,0.343789,0.920125,19.728884,-136.431261,212.357072,
+ 0.187561,0.343789,0.920125,18.358049,-136.434912,212.637871,
+ 0.187561,0.343789,0.920125,19.443826,-136.876645,212.581589,
+ 0.176623,0.463562,0.868282,19.000875,-135.966406,212.256982,
+ 0.176623,0.463562,0.868282,18.358049,-136.434912,212.637871,
+ 0.176623,0.463562,0.868282,19.728884,-136.431261,212.357072,
+ -0.226549,0.029002,0.973568,19.443826,-136.876645,212.581589,
+ -0.226549,0.029002,0.973568,18.054129,-137.468666,212.275844,
+ -0.226549,0.029002,0.973568,18.774228,-137.511561,212.444688,
+ -0.076735,-0.309379,0.947838,18.358049,-136.434912,212.637871,
+ -0.076735,-0.309379,0.947838,18.054129,-137.468666,212.275844,
+ -0.076735,-0.309379,0.947838,19.443826,-136.876645,212.581589,
+ -0.019754,-0.572595,0.8196,18.774228,-137.511561,212.444688,
+ -0.019754,-0.572595,0.8196,18.295683,-138.400809,211.811902,
+ -0.019754,-0.572595,0.8196,19.065675,-138.223142,211.954583,
+ -0.227234,-0.480478,0.847057,18.054129,-137.468666,212.275844,
+ -0.227234,-0.480478,0.847057,18.295683,-138.400809,211.811902,
+ -0.227234,-0.480478,0.847057,18.774228,-137.511561,212.444688,
+ -0.111969,-0.338091,0.934429,19.065675,-138.223142,211.954583,
+ -0.111969,-0.338091,0.934429,19.258249,-139.645695,211.462956,
+ -0.111969,-0.338091,0.934429,19.508626,-138.904605,211.761096,
+ -0.095885,-0.336704,0.936716,19.065675,-138.223142,211.954583,
+ -0.095885,-0.336704,0.936716,18.295683,-138.400809,211.811902,
+ -0.095885,-0.336704,0.936716,19.258249,-139.645695,211.462956,
+ -0.896496,0.250502,0.365436,20.83839,-137.167788,212.645476,
+ -0.896496,0.250502,0.365436,21.520765,-135.725156,213.33059,
+ -0.896496,0.250502,0.365436,21.034615,-136.575159,212.72062,
+ -0.279657,-0.300732,0.911785,21.520765,-135.725156,213.33059,
+ -0.279657,-0.300732,0.911785,20.83839,-137.167788,212.645476,
+ -0.279657,-0.300732,0.911785,21.690522,-136.985253,212.967042,
+ -0.38463,0.213555,0.898028,21.690522,-136.985253,212.967042,
+ -0.38463,0.213555,0.898028,20.83839,-137.167788,212.645476,
+ -0.38463,0.213555,0.898028,20.657377,-137.882715,212.737961,
+ -0.205036,-0.013772,0.978658,21.690522,-136.985253,212.967042,
+ -0.205036,-0.013772,0.978658,20.657377,-137.882715,212.737961,
+ -0.205036,-0.013772,0.978658,21.330929,-138.160472,212.875166,
+ -0.321545,-0.343944,0.882219,20.657377,-137.882715,212.737961,
+ -0.321545,-0.343944,0.882219,20.218989,-138.513068,212.33243,
+ -0.321545,-0.343944,0.882219,21.330929,-138.160472,212.875166,
+ -0.366984,-0.230063,0.901329,21.330929,-138.160472,212.875166,
+ -0.366984,-0.230063,0.901329,20.218989,-138.513068,212.33243,
+ -0.366984,-0.230063,0.901329,20.86577,-139.143116,212.434953,
+ -0.523132,-0.415985,0.743834,20.218989,-138.513068,212.33243,
+ -0.523132,-0.415985,0.743834,19.898641,-138.93381,211.871834,
+ -0.523132,-0.415985,0.743834,20.86577,-139.143116,212.434953,
+ -0.523626,-0.177961,0.833154,19.898641,-138.93381,211.871834,
+ -0.523626,-0.177961,0.833154,19.916286,-140.062482,211.64184,
+ -0.523626,-0.177961,0.833154,20.86577,-139.143116,212.434953,
+ -0.281389,-0.195824,0.9394,19.508626,-138.904605,211.761096,
+ -0.281389,-0.195824,0.9394,19.916286,-140.062482,211.64184,
+ -0.281389,-0.195824,0.9394,19.898641,-138.93381,211.871834,
+ -0.387464,-0.228406,0.893142,19.508626,-138.904605,211.761096,
+ -0.387464,-0.228406,0.893142,19.258249,-139.645695,211.462956,
+ -0.387464,-0.228406,0.893142,19.916286,-140.062482,211.64184,
+ -0.484872,0.261634,0.834534,20.504656,-135.805776,212.611707,
+ -0.484872,0.261634,0.834534,20.027936,-135.901302,212.364677,
+ -0.484872,0.261634,0.834534,19.728884,-136.431261,212.357072,
+ -0.273192,-0.052205,0.960542,20.504656,-135.805776,212.611707,
+ -0.273192,-0.052205,0.960542,19.728884,-136.431261,212.357072,
+ -0.273192,-0.052205,0.960542,21.034615,-136.575159,212.72062,
+ -0.172916,0.529367,0.830584,19.728884,-136.431261,212.357072,
+ -0.172916,0.529367,0.830584,19.443826,-136.876645,212.581589,
+ -0.172916,0.529367,0.830584,21.034615,-136.575159,212.72062,
+ -0.067092,-0.103612,0.992352,21.034615,-136.575159,212.72062,
+ -0.067092,-0.103612,0.992352,19.443826,-136.876645,212.581589,
+ -0.067092,-0.103612,0.992352,20.83839,-137.167788,212.645476,
+ -0.16181,-0.041938,0.98593,19.443826,-136.876645,212.581589,
+ -0.16181,-0.041938,0.98593,18.774228,-137.511561,212.444688,
+ -0.16181,-0.041938,0.98593,20.657377,-137.882715,212.737961,
+ -0.0177,0.132679,0.991001,19.443826,-136.876645,212.581589,
+ -0.0177,0.132679,0.991001,20.657377,-137.882715,212.737961,
+ -0.0177,0.132679,0.991001,20.83839,-137.167788,212.645476,
+ -0.380428,-0.625188,0.68148,18.774228,-137.511561,212.444688,
+ -0.380428,-0.625188,0.68148,19.065675,-138.223142,211.954583,
+ -0.380428,-0.625188,0.68148,20.218989,-138.513068,212.33243,
+ -0.219353,-0.415389,0.8828,18.774228,-137.511561,212.444688,
+ -0.219353,-0.415389,0.8828,20.218989,-138.513068,212.33243,
+ -0.219353,-0.415389,0.8828,20.657377,-137.882715,212.737961,
+ -0.276576,-0.424556,0.862124,19.065675,-138.223142,211.954583,
+ -0.276576,-0.424556,0.862124,19.508626,-138.904605,211.761096,
+ -0.276576,-0.424556,0.862124,19.898641,-138.93381,211.871834,
+ -0.381458,-0.534887,0.753913,19.065675,-138.223142,211.954583,
+ -0.381458,-0.534887,0.753913,19.898641,-138.93381,211.871834,
+ -0.381458,-0.534887,0.753913,20.218989,-138.513068,212.33243,
+ 0.454234,0.890472,0.027035,19.613583,-131.142321,202.379122,
+ 0.454234,0.890472,0.027035,20.169705,-131.354974,200.039637,
+ 0.454234,0.890472,0.027035,18.954937,-130.754739,200.679421,
+ 0.454195,0.890493,0.027024,20.169705,-131.354974,200.039637,
+ 0.454195,0.890493,0.027024,19.613583,-131.142321,202.379122,
+ 0.454195,0.890493,0.027024,20.996587,-131.825609,201.650505,
+ 0.196475,0.969727,0.145009,17.502266,-130.77786,202.802298,
+ 0.196475,0.969727,0.145009,18.954937,-130.754739,200.679421,
+ 0.196475,0.969727,0.145009,17.111946,-130.44443,201.10138,
+ 0.19646,0.969732,0.144998,18.954937,-130.754739,200.679421,
+ 0.19646,0.969732,0.144998,17.502266,-130.77786,202.802298,
+ 0.19646,0.969732,0.144998,19.613583,-131.142321,202.379122,
+ -0.546235,0.789467,0.279944,16.445087,-131.472404,202.699166,
+ -0.546235,0.789467,0.279944,17.111946,-130.44443,201.10138,
+ -0.546235,0.789467,0.279944,16.18102,-131.058659,201.01711,
+ -0.546042,0.789553,0.280079,17.111946,-130.44443,201.10138,
+ -0.546042,0.789553,0.280079,16.445087,-131.472404,202.699166,
+ -0.546042,0.789553,0.280079,17.502266,-130.77786,202.802298,
+ -0.914066,0.33651,0.226372,16.445087,-131.472404,202.699166,
+ -0.914066,0.33651,0.226372,15.651974,-132.55088,201.099859,
+ -0.914066,0.33651,0.226372,15.843939,-133.15872,202.778569,
+ -0.914048,0.336612,0.226295,15.651974,-132.55088,201.099859,
+ -0.914048,0.336612,0.226295,16.445087,-131.472404,202.699166,
+ -0.914048,0.336612,0.226295,16.18102,-131.058659,201.01711,
+ -0.973002,-0.229043,0.028411,15.843939,-133.15872,202.778569,
+ -0.973002,-0.229043,0.028411,15.93399,-133.755608,201.050575,
+ -0.973002,-0.229043,0.028411,16.171893,-134.551155,202.784653,
+ -0.973028,-0.228938,0.028373,15.93399,-133.755608,201.050575,
+ -0.973028,-0.228938,0.028373,15.843939,-133.15872,202.778569,
+ -0.973028,-0.228938,0.028373,15.651974,-132.55088,201.099859,
+ -0.697018,-0.683177,-0.217796,15.93399,-133.755608,201.050575,
+ -0.697018,-0.683177,-0.217796,17.822919,-135.957279,201.91153,
+ -0.697018,-0.683177,-0.217796,16.171893,-134.551155,202.784653,
+ -0.697016,-0.683177,-0.217802,17.822919,-135.957279,201.91153,
+ -0.697016,-0.683177,-0.217802,15.93399,-133.755608,201.050575,
+ -0.697016,-0.683177,-0.217802,17.323382,-134.853858,200.049068,
+ -0.574991,-0.762211,-0.297355,18.380258,-135.397507,199.398941,
+ -0.574991,-0.762211,-0.297355,17.822919,-135.957279,201.91153,
+ -0.574991,-0.762211,-0.297355,17.323382,-134.853858,200.049068,
+ -0.574752,-0.762396,-0.297343,17.822919,-135.957279,201.91153,
+ -0.574752,-0.762396,-0.297343,18.380258,-135.397507,199.398941,
+ -0.574752,-0.762396,-0.297343,19.000571,-136.501232,201.029888,
+ -0.187787,-0.845122,-0.500504,19.992342,-135.061339,198.22646,
+ -0.187787,-0.845122,-0.500504,19.000571,-136.501232,201.029888,
+ -0.187787,-0.845122,-0.500504,18.380258,-135.397507,199.398941,
+ -0.18796,-0.845065,-0.500536,19.000571,-136.501232,201.029888,
+ -0.18796,-0.845065,-0.500536,19.992342,-135.061339,198.22646,
+ -0.18796,-0.845065,-0.500536,20.887979,-136.159893,199.744844,
+ 0.835533,0.075344,-0.544249,21.782702,-134.54294,199.135787,
+ 0.835533,0.075344,-0.544249,21.243313,-132.560919,198.582099,
+ 0.835533,0.075344,-0.544249,22.184583,-133.176061,199.941981,
+ 0.835476,0.075302,-0.544343,21.243313,-132.560919,198.582099,
+ 0.835476,0.075302,-0.544343,21.782702,-134.54294,199.135787,
+ 0.835476,0.075302,-0.544343,20.876722,-133.756216,197.85409,
+ 0.662056,0.739143,-0.123893,20.996587,-131.825609,201.650505,
+ 0.662056,0.739143,-0.123893,21.243313,-132.560919,198.582099,
+ 0.662056,0.739143,-0.123893,20.169705,-131.354974,200.039637,
+ 0.662047,0.739151,-0.123895,21.243313,-132.560919,198.582099,
+ 0.662047,0.739151,-0.123895,20.996587,-131.825609,201.650505,
+ 0.662047,0.739151,-0.123895,22.184583,-133.176061,199.941981,
+ 0.665351,-0.326965,-0.67112,20.614481,-134.293781,197.856219,
+ 0.665351,-0.326965,-0.67112,21.782702,-134.54294,199.135787,
+ 0.665351,-0.326965,-0.67112,21.609599,-135.27673,199.321668,
+ 0.665267,-0.327198,-0.671089,21.782702,-134.54294,199.135787,
+ 0.665267,-0.327198,-0.671089,20.614481,-134.293781,197.856219,
+ 0.665267,-0.327198,-0.671089,20.876722,-133.756216,197.85409,
+ 0.282863,-0.690104,-0.666142,20.367451,-134.726692,198.039058,
+ 0.282863,-0.690104,-0.666142,20.887979,-136.159893,199.744844,
+ 0.282863,-0.690104,-0.666142,19.992342,-135.061339,198.22646,
+ 0.28269,-0.690171,-0.666146,20.887979,-136.159893,199.744844,
+ 0.28269,-0.690171,-0.666146,20.367451,-134.726692,198.039058,
+ 0.28269,-0.690171,-0.666146,21.354963,-135.810643,199.581171,
+ 0.437923,0.818449,0.371975,20.946085,-132.385686,203.546127,
+ 0.437923,0.818449,0.371975,19.613583,-131.142321,202.379122,
+ 0.437923,0.818449,0.371975,19.510451,-131.897102,204.161268,
+ 0.532359,0.807867,0.252874,20.996587,-131.825609,201.650505,
+ 0.532359,0.807867,0.252874,19.613583,-131.142321,202.379122,
+ 0.532359,0.807867,0.252874,20.946085,-132.385686,203.546127,
+ -0.992282,0.090797,0.084456,16.192276,-135.211626,206.354726,
+ -0.992282,0.090797,0.084456,16.290541,-135.775049,208.114968,
+ -0.992282,0.090797,0.084456,16.397628,-134.516169,208.019746,
+ -0.991682,0.100599,0.080288,16.329177,-133.838053,206.324608,
+ -0.991682,0.100599,0.080288,16.192276,-135.211626,206.354726,
+ -0.991682,0.100599,0.080288,16.397628,-134.516169,208.019746,
+ -0.853269,-0.482703,-0.197305,17.581973,-136.93749,205.373907,
+ -0.853269,-0.482703,-0.197305,17.505308,-137.499088,207.079388,
+ -0.853269,-0.482703,-0.197305,16.290541,-135.775049,208.114968,
+ -0.808285,-0.572371,-0.138084,17.581973,-136.93749,205.373907,
+ -0.808285,-0.572371,-0.138084,16.290541,-135.775049,208.114968,
+ -0.808285,-0.572371,-0.138084,16.192276,-135.211626,206.354726,
+ 0.516769,-0.701005,-0.491469,22.361945,-136.523745,201.302168,
+ 0.516769,-0.701005,-0.491469,21.597734,-138.160168,202.832721,
+ 0.516769,-0.701005,-0.491469,21.692956,-136.96487,201.227938,
+ 0.886181,-0.414601,-0.206853,23.349458,-136.416658,203.001261,
+ 0.886181,-0.414601,-0.206853,23.482404,-137.039101,204.818393,
+ 0.886181,-0.414601,-0.206853,22.77782,-138.445226,204.618213,
+ 0.913624,-0.37759,-0.150719,23.349458,-136.416658,203.001261,
+ 0.913624,-0.37759,-0.150719,22.77782,-138.445226,204.618213,
+ 0.913624,-0.37759,-0.150719,22.820412,-137.742163,203.115041,
+ 0.583056,-0.74213,-0.330588,22.820412,-137.742163,203.115041,
+ 0.583056,-0.74213,-0.330588,22.77782,-138.445226,204.618213,
+ 0.583056,-0.74213,-0.330588,21.704821,-139.140378,204.286305,
+ 0.381271,-0.753211,-0.536009,22.820412,-137.742163,203.115041,
+ 0.381271,-0.753211,-0.536009,21.704821,-139.140378,204.286305,
+ 0.381271,-0.753211,-0.536009,21.597734,-138.160168,202.832721,
+ 0.872719,-0.478833,-0.095288,23.482404,-137.039101,204.818393,
+ 0.872719,-0.478833,-0.095288,23.347328,-137.844079,207.626384,
+ 0.872719,-0.478833,-0.095288,22.329698,-139.697717,207.620907,
+ 0.895761,-0.441654,-0.050541,22.77782,-138.445226,204.618213,
+ 0.895761,-0.441654,-0.050541,23.482404,-137.039101,204.818393,
+ 0.895761,-0.441654,-0.050541,22.329698,-139.697717,207.620907,
+ 0.613774,-0.756991,-0.224158,22.77782,-138.445226,204.618213,
+ 0.613774,-0.756991,-0.224158,22.329698,-139.697717,207.620907,
+ 0.613774,-0.756991,-0.224158,21.032789,-140.688272,207.414948,
+ 0.580242,-0.772626,-0.25762,22.77782,-138.445226,204.618213,
+ 0.580242,-0.772626,-0.25762,21.032789,-140.688272,207.414948,
+ 0.580242,-0.772626,-0.25762,21.704821,-139.140378,204.286305,
+ 0.854045,-0.506429,0.118896,23.347328,-137.844079,207.626384,
+ 0.854045,-0.506429,0.118896,23.031239,-137.893667,209.685678,
+ 0.854045,-0.506429,0.118896,21.742545,-140.062787,209.703323,
+ 0.865016,-0.47536,0.160562,22.329698,-139.697717,207.620907,
+ 0.865016,-0.47536,0.160562,23.347328,-137.844079,207.626384,
+ 0.865016,-0.47536,0.160562,21.742545,-140.062787,209.703323,
+ 0.612079,-0.790062,0.034074,22.329698,-139.697717,207.620907,
+ 0.612079,-0.790062,0.034074,21.742545,-140.062787,209.703323,
+ 0.612079,-0.790062,0.034074,20.23055,-141.243177,209.494321,
+ 0.60476,-0.796135,0.020863,22.329698,-139.697717,207.620907,
+ 0.60476,-0.796135,0.020863,20.23055,-141.243177,209.494321,
+ 0.60476,-0.796135,0.020863,21.032789,-140.688272,207.414948,
+ 0.83455,-0.534703,0.132736,23.031239,-137.893667,209.685678,
+ 0.83455,-0.534703,0.132736,22.46021,-138.454961,211.014834,
+ 0.83455,-0.534703,0.132736,21.542365,-139.881165,211.040389,
+ 0.844034,-0.499868,0.194265,23.031239,-137.893667,209.685678,
+ 0.844034,-0.499868,0.194265,21.542365,-139.881165,211.040389,
+ 0.844034,-0.499868,0.194265,21.742545,-140.062787,209.703323,
+ 0.555999,-0.808451,0.193059,21.742545,-140.062787,209.703323,
+ 0.555999,-0.808451,0.193059,21.542365,-139.881165,211.040389,
+ 0.555999,-0.808451,0.193059,19.723104,-141.188417,210.805528,
+ 0.57305,-0.779064,0.25431,21.742545,-140.062787,209.703323,
+ 0.57305,-0.779064,0.25431,19.723104,-141.188417,210.805528,
+ 0.57305,-0.779064,0.25431,20.23055,-141.243177,209.494321,
+ 0.910325,-0.295575,0.289731,23.094213,-136.469289,210.727038,
+ 0.910325,-0.295575,0.289731,22.314486,-136.66308,212.97921,
+ 0.910325,-0.295575,0.289731,21.936944,-138.158951,212.639392,
+ 0.909918,-0.241666,0.337116,23.094213,-136.469289,210.727038,
+ 0.909918,-0.241666,0.337116,21.936944,-138.158951,212.639392,
+ 0.909918,-0.241666,0.337116,22.46021,-138.454961,211.014834,
+ 0.830462,-0.435873,0.34691,22.46021,-138.454961,211.014834,
+ 0.830462,-0.435873,0.34691,21.936944,-138.158951,212.639392,
+ 0.830462,-0.435873,0.34691,21.337014,-139.70441,212.133771,
+ 0.818637,-0.522572,0.238229,22.46021,-138.454961,211.014834,
+ 0.818637,-0.522572,0.238229,21.337014,-139.70441,212.133771,
+ 0.818637,-0.522572,0.238229,21.542365,-139.881165,211.040389,
+ 0.547511,-0.803773,0.232766,21.542365,-139.881165,211.040389,
+ 0.547511,-0.803773,0.232766,21.337014,-139.70441,212.133771,
+ 0.547511,-0.803773,0.232766,19.723104,-141.188417,210.805528,
+ 0.749048,-0.62935,-0.206992,19.723104,-141.188417,210.805528,
+ 0.749048,-0.62935,-0.206992,21.337014,-139.70441,212.133771,
+ 0.749048,-0.62935,-0.206992,19.941841,-141.174422,211.554528,
+ -0.583074,-0.791061,0.185061,19.941841,-141.174422,211.554528,
+ -0.583074,-0.791061,0.185061,19.013957,-140.575405,211.191588,
+ -0.583074,-0.791061,0.185061,19.723104,-141.188417,210.805528,
+ -0.274976,-0.306962,0.911133,20.958863,-134.609566,213.536854,
+ -0.274976,-0.306962,0.911133,20.682019,-135.351264,213.203424,
+ -0.274976,-0.306962,0.911133,21.520765,-135.725156,213.33059,
+ -0.26002,-0.299842,0.91787,21.99353,-135.288594,213.607129,
+ -0.26002,-0.299842,0.91787,21.520765,-135.725156,213.33059,
+ -0.26002,-0.299842,0.91787,21.690522,-136.985253,212.967042,
+ -0.259486,-0.3004,0.917838,21.520765,-135.725156,213.33059,
+ -0.259486,-0.3004,0.917838,21.99353,-135.288594,213.607129,
+ -0.259486,-0.3004,0.917838,20.958863,-134.609566,213.536854,
+ -0.670903,-0.0847,0.736692,19.385719,-134.796968,212.086616,
+ -0.670903,-0.0847,0.736692,19.517752,-135.586126,212.116126,
+ -0.670903,-0.0847,0.736692,20.682019,-135.351264,213.203424,
+ -0.670293,-0.081404,0.737619,20.958863,-134.609566,213.536854,
+ -0.670293,-0.081404,0.737619,19.385719,-134.796968,212.086616,
+ -0.670293,-0.081404,0.737619,20.682019,-135.351264,213.203424,
+ -0.092112,0.453544,0.886461,18.417069,-135.323276,211.867271,
+ -0.092112,0.453544,0.886461,19.000875,-135.966406,212.256982,
+ -0.092112,0.453544,0.886461,19.517752,-135.586126,212.116126,
+ -0.220626,-0.00044,0.975358,19.385719,-134.796968,212.086616,
+ -0.220626,-0.00044,0.975358,18.417069,-135.323276,211.867271,
+ -0.220626,-0.00044,0.975358,19.517752,-135.586126,212.116126,
+ 0.118024,0.523879,0.843576,17.703358,-135.915601,212.406965,
+ 0.118024,0.523879,0.843576,18.358049,-136.434912,212.637871,
+ 0.118024,0.523879,0.843576,19.000875,-135.966406,212.256982,
+ 0.115501,0.589357,0.799574,18.417069,-135.323276,211.867271,
+ 0.115501,0.589357,0.799574,17.703358,-135.915601,212.406965,
+ 0.115501,0.589357,0.799574,19.000875,-135.966406,212.256982,
+ -0.313211,-0.230553,0.921273,18.358049,-136.434912,212.637871,
+ -0.313211,-0.230553,0.921273,17.452982,-137.41786,212.084183,
+ -0.313211,-0.230553,0.921273,18.054129,-137.468666,212.275844,
+ -0.416191,-0.124176,0.900758,17.703358,-135.915601,212.406965,
+ -0.416191,-0.124176,0.900758,17.452982,-137.41786,212.084183,
+ -0.416191,-0.124176,0.900758,18.358049,-136.434912,212.637871,
+ -0.097022,-0.463512,0.880763,18.054129,-137.468666,212.275844,
+ -0.097022,-0.463512,0.880763,17.656508,-138.795388,211.533841,
+ -0.097022,-0.463512,0.880763,18.295683,-138.400809,211.811902,
+ -0.309365,-0.391866,0.866449,17.452982,-137.41786,212.084183,
+ -0.309365,-0.391866,0.866449,17.656508,-138.795388,211.533841,
+ -0.309365,-0.391866,0.866449,18.054129,-137.468666,212.275844,
+ -0.01074,-0.277575,0.960644,18.295683,-138.400809,211.811902,
+ -0.01074,-0.277575,0.960644,19.013957,-140.575405,211.191588,
+ -0.01074,-0.277575,0.960644,19.258249,-139.645695,211.462956,
+ -0.19857,-0.328945,0.923236,18.295683,-138.400809,211.811902,
+ -0.19857,-0.328945,0.923236,17.656508,-138.795388,211.533841,
+ -0.19857,-0.328945,0.923236,19.013957,-140.575405,211.191588,
+ 0.175774,-0.37481,0.910286,21.99353,-135.288594,213.607129,
+ 0.175774,-0.37481,0.910286,21.690522,-136.985253,212.967042,
+ 0.175774,-0.37481,0.910286,22.314486,-136.66308,212.97921,
+ 0.024679,-0.085419,0.996039,22.314486,-136.66308,212.97921,
+ 0.024679,-0.085419,0.996039,21.690522,-136.985253,212.967042,
+ 0.024679,-0.085419,0.996039,21.330929,-138.160472,212.875166,
+ 0.347603,-0.290272,0.891579,22.314486,-136.66308,212.97921,
+ 0.347603,-0.290272,0.891579,21.330929,-138.160472,212.875166,
+ 0.347603,-0.290272,0.891579,21.936944,-138.158951,212.639392,
+ 0.313452,-0.507844,0.802397,21.936944,-138.158951,212.639392,
+ 0.313452,-0.507844,0.802397,21.330929,-138.160472,212.875166,
+ 0.313452,-0.507844,0.802397,20.86577,-139.143116,212.434953,
+ 0.156769,-0.361547,0.91908,21.936944,-138.158951,212.639392,
+ 0.156769,-0.361547,0.91908,20.86577,-139.143116,212.434953,
+ 0.156769,-0.361547,0.91908,21.337014,-139.70441,212.133771,
+ -0.142366,-0.55815,0.817435,20.86577,-139.143116,212.434953,
+ -0.142366,-0.55815,0.817435,19.916286,-140.062482,211.64184,
+ -0.142366,-0.55815,0.817435,21.337014,-139.70441,212.133771,
+ -0.307699,-0.08151,0.947986,21.337014,-139.70441,212.133771,
+ -0.307699,-0.08151,0.947986,19.916286,-140.062482,211.64184,
+ -0.307699,-0.08151,0.947986,19.941841,-141.174422,211.554528,
+ -0.309197,-0.081506,0.947499,19.258249,-139.645695,211.462956,
+ -0.309197,-0.081506,0.947499,19.941841,-141.174422,211.554528,
+ -0.309197,-0.081506,0.947499,19.916286,-140.062482,211.64184,
+ -0.439415,-0.143373,0.886769,19.258249,-139.645695,211.462956,
+ -0.439415,-0.143373,0.886769,19.013957,-140.575405,211.191588,
+ -0.439415,-0.143373,0.886769,19.941841,-141.174422,211.554528,
+ -0.562096,-0.719014,-0.408739,21.032789,-140.688272,207.414948,
+ -0.562096,-0.719014,-0.408739,20.23055,-141.243177,209.494321,
+ -0.562096,-0.719014,-0.408739,18.500122,-140.195124,210.030364,
+ -0.558725,-0.724002,-0.404534,21.032789,-140.688272,207.414948,
+ -0.558725,-0.724002,-0.404534,18.500122,-140.195124,210.030364,
+ -0.558725,-0.724002,-0.404534,18.149047,-138.86536,208.135351,
+ 0.922025,0.383882,0.050051,23.169661,-134.344586,207.523556,
+ 0.922025,0.383882,0.050051,23.031847,-134.34915,210.097293,
+ 0.922025,0.383882,0.050051,23.561198,-135.51585,209.294141,
+ 0.955577,0.294271,-0.016647,23.599834,-135.7571,207.24732,
+ 0.955577,0.294271,-0.016647,23.169661,-134.344586,207.523556,
+ 0.955577,0.294271,-0.016647,23.561198,-135.51585,209.294141,
+ 0.487308,0.86921,0.083694,23.169661,-134.344586,207.523556,
+ 0.487308,0.86921,0.083694,21.211369,-133.404533,209.162716,
+ 0.487308,0.86921,0.083694,22.057113,-134.130108,211.773874,
+ 0.243308,0.969837,0.014748,23.169661,-134.344586,207.523556,
+ 0.243308,0.969837,0.014748,22.057113,-134.130108,211.773874,
+ 0.243308,0.969837,0.014748,23.031847,-134.34915,210.097293,
+ 0.50882,0.80648,0.301153,21.99353,-135.288594,213.607129,
+ 0.50882,0.80648,0.301153,20.560025,-133.882165,212.262762,
+ 0.50882,0.80648,0.301153,20.958863,-134.609566,213.536854,
+ 0.30147,0.80127,0.516801,22.057113,-134.130108,211.773874,
+ 0.30147,0.80127,0.516801,20.560025,-133.882165,212.262762,
+ 0.30147,0.80127,0.516801,21.99353,-135.288594,213.607129,
+ -0.615415,0.509026,0.601794,18.926644,-134.261837,211.164512,
+ -0.615415,0.509026,0.601794,19.385719,-134.796968,212.086616,
+ -0.615415,0.509026,0.601794,20.958863,-134.609566,213.536854,
+ -0.517655,0.663131,0.540638,20.958863,-134.609566,213.536854,
+ -0.517655,0.663131,0.540638,20.560025,-133.882165,212.262762,
+ -0.517655,0.663131,0.540638,18.926644,-134.261837,211.164512,
+ -0.490819,0.672449,0.553994,19.385719,-134.796968,212.086616,
+ -0.490819,0.672449,0.553994,18.442624,-134.618388,211.034304,
+ -0.490819,0.672449,0.553994,18.417069,-135.323276,211.867271,
+ -0.571057,0.553984,0.605801,18.926644,-134.261837,211.164512,
+ -0.571057,0.553984,0.605801,18.442624,-134.618388,211.034304,
+ -0.571057,0.553984,0.605801,19.385719,-134.796968,212.086616,
+ -0.322493,0.819778,0.473246,18.417069,-135.323276,211.867271,
+ -0.322493,0.819778,0.473246,16.850618,-135.793911,211.615069,
+ -0.322493,0.819778,0.473246,17.703358,-135.915601,212.406965,
+ -0.31671,0.728828,0.607046,18.442624,-134.618388,211.034304,
+ -0.31671,0.728828,0.607046,16.850618,-135.793911,211.615069,
+ -0.31671,0.728828,0.607046,18.417069,-135.323276,211.867271,
+ -0.67801,-0.044643,0.733696,17.703358,-135.915601,212.406965,
+ -0.67801,-0.044643,0.733696,16.642224,-136.644218,211.382033,
+ -0.67801,-0.044643,0.733696,17.452982,-137.41786,212.084183,
+ -0.682623,-0.032776,0.730035,16.850618,-135.793911,211.615069,
+ -0.682623,-0.032776,0.730035,16.642224,-136.644218,211.382033,
+ -0.682623,-0.032776,0.730035,17.703358,-135.915601,212.406965,
+ -0.852802,-0.297481,0.429225,17.195304,-138.464392,210.846902,
+ -0.852802,-0.297481,0.429225,17.656508,-138.795388,211.533841,
+ -0.852802,-0.297481,0.429225,17.452982,-137.41786,212.084183,
+ -0.785765,-0.381825,0.486604,17.195304,-138.464392,210.846902,
+ -0.785765,-0.381825,0.486604,17.452982,-137.41786,212.084183,
+ -0.785765,-0.381825,0.486604,16.642224,-136.644218,211.382033,
+ -0.774091,-0.617316,0.140371,18.500122,-140.195124,210.030364,
+ -0.774091,-0.617316,0.140371,19.013957,-140.575405,211.191588,
+ -0.774091,-0.617316,0.140371,17.656508,-138.795388,211.533841,
+ -0.74043,-0.645918,0.185887,18.500122,-140.195124,210.030364,
+ -0.74043,-0.645918,0.185887,17.656508,-138.795388,211.533841,
+ -0.74043,-0.645918,0.185887,17.195304,-138.464392,210.846902,
+ -0.707038,-0.663032,-0.245938,20.23055,-141.243177,209.494321,
+ -0.707038,-0.663032,-0.245938,19.723104,-141.188417,210.805528,
+ -0.707038,-0.663032,-0.245938,19.013957,-140.575405,211.191588,
+ -0.527563,-0.848356,-0.044378,20.23055,-141.243177,209.494321,
+ -0.527563,-0.848356,-0.044378,19.013957,-140.575405,211.191588,
+ -0.527563,-0.848356,-0.044378,18.500122,-140.195124,210.030364,
+ 0.959648,-0.053756,-0.276017,23.031847,-134.34915,210.097293,
+ 0.959648,-0.053756,-0.276017,23.236286,-135.16082,210.966158,
+ 0.959648,-0.053756,-0.276017,23.094213,-136.469289,210.727038,
+ 0.909038,0.143,0.391409,23.561198,-135.51585,209.294141,
+ 0.909038,0.143,0.391409,23.031847,-134.34915,210.097293,
+ 0.909038,0.143,0.391409,23.094213,-136.469289,210.727038,
+ 0.755533,0.541651,0.368489,23.031847,-134.34915,210.097293,
+ 0.755533,0.541651,0.368489,22.057113,-134.130108,211.773874,
+ 0.755533,0.541651,0.368489,21.99353,-135.288594,213.607129,
+ 0.726585,0.578994,0.36992,23.031847,-134.34915,210.097293,
+ 0.726585,0.578994,0.36992,21.99353,-135.288594,213.607129,
+ 0.726585,0.578994,0.36992,23.236286,-135.16082,210.966158,
+ 0.940939,0.068216,0.331633,23.094213,-136.469289,210.727038,
+ 0.940939,0.068216,0.331633,21.99353,-135.288594,213.607129,
+ 0.940939,0.068216,0.331633,22.314486,-136.66308,212.97921,
+ 0.894449,-0.172512,0.412553,23.094213,-136.469289,210.727038,
+ 0.894449,-0.172512,0.412553,23.236286,-135.16082,210.966158,
+ 0.894449,-0.172512,0.412553,21.99353,-135.288594,213.607129,
+ 0.924739,0.108045,-0.364945,21.782702,-134.54294,199.135787,
+ 0.924739,0.108045,-0.364945,22.526835,-134.646681,200.990643,
+ 0.924739,0.108045,-0.364945,22.782079,-135.746148,201.311903,
+ 0.781345,-0.320047,-0.53579,21.782702,-134.54294,199.135787,
+ 0.781345,-0.320047,-0.53579,22.782079,-135.746148,201.311903,
+ 0.781345,-0.320047,-0.53579,21.609599,-135.27673,199.321668,
+ 0.913206,-0.036604,-0.405851,22.526835,-134.646681,200.990643,
+ 0.913206,-0.036604,-0.405851,23.207993,-134.943604,202.550096,
+ 0.913206,-0.036604,-0.405851,23.349458,-136.416658,203.001261,
+ 0.953903,0.14461,-0.262976,22.526835,-134.646681,200.990643,
+ 0.953903,0.14461,-0.262976,23.349458,-136.416658,203.001261,
+ 0.953903,0.14461,-0.262976,22.782079,-135.746148,201.311903,
+ 0.985466,-0.047497,-0.163097,23.207993,-134.943604,202.550096,
+ 0.985466,-0.047497,-0.163097,23.541423,-135.410284,204.700658,
+ 0.985466,-0.047497,-0.163097,23.482404,-137.039101,204.818393,
+ 0.995634,0.081897,-0.04479,23.207993,-134.943604,202.550096,
+ 0.995634,0.081897,-0.04479,23.482404,-137.039101,204.818393,
+ 0.995634,0.081897,-0.04479,23.349458,-136.416658,203.001261,
+ 0.99107,-0.127186,-0.040052,23.541423,-135.410284,204.700658,
+ 0.99107,-0.127186,-0.040052,23.599834,-135.7571,207.24732,
+ 0.99107,-0.127186,-0.040052,23.347328,-137.844079,207.626384,
+ 0.998701,-0.033407,0.038465,23.541423,-135.410284,204.700658,
+ 0.998701,-0.033407,0.038465,23.347328,-137.844079,207.626384,
+ 0.998701,-0.033407,0.038465,23.482404,-137.039101,204.818393,
+ 0.976627,-0.210545,0.043251,23.599834,-135.7571,207.24732,
+ 0.976627,-0.210545,0.043251,23.561198,-135.51585,209.294141,
+ 0.976627,-0.210545,0.043251,23.031239,-137.893667,209.685678,
+ 0.984555,-0.092076,0.148906,23.599834,-135.7571,207.24732,
+ 0.984555,-0.092076,0.148906,23.031239,-137.893667,209.685678,
+ 0.984555,-0.092076,0.148906,23.347328,-137.844079,207.626384,
+ 0.950692,-0.286245,0.119367,23.561198,-135.51585,209.294141,
+ 0.950692,-0.286245,0.119367,23.094213,-136.469289,210.727038,
+ 0.950692,-0.286245,0.119367,22.46021,-138.454961,211.014834,
+ 0.929782,-0.152023,0.335253,23.561198,-135.51585,209.294141,
+ 0.929782,-0.152023,0.335253,22.46021,-138.454961,211.014834,
+ 0.929782,-0.152023,0.335253,23.031239,-137.893667,209.685678,
+ 0.746859,-0.396846,-0.533587,21.609599,-135.27673,199.321668,
+ 0.746859,-0.396846,-0.533587,22.782079,-135.746148,201.311903,
+ 0.746859,-0.396846,-0.533587,22.361945,-136.523745,201.302168,
+ 0.590341,-0.562773,-0.578605,21.609599,-135.27673,199.321668,
+ 0.590341,-0.562773,-0.578605,22.361945,-136.523745,201.302168,
+ 0.590341,-0.562773,-0.578605,21.354963,-135.810643,199.581171,
+ 0.431768,0.266379,0.861753,32.17896,-102.901481,218.427564,
+ 0.431768,0.266379,0.861753,33.316759,-105.641326,218.704408,
+ 0.431768,0.266379,0.861753,34.443606,-105.094939,217.970923,
+ 0.243854,-0.434026,0.86727,34.31066,-107.409173,217.314711,
+ 0.243854,-0.434026,0.86727,32.854034,-107.924833,217.466215,
+ 0.243854,-0.434026,0.86727,32.306126,-110.216859,216.473227,
+ -0.147287,-0.185995,0.971449,34.31066,-107.409173,217.314711,
+ -0.147287,-0.185995,0.971449,32.306126,-110.216859,216.473227,
+ -0.147287,-0.185995,0.971449,34.519662,-110.588926,216.737598,
+ 0.630203,-0.464898,0.621864,32.854034,-107.924833,217.466215,
+ 0.630203,-0.464898,0.621864,34.443606,-105.094939,217.970923,
+ 0.630203,-0.464898,0.621864,33.316759,-105.641326,218.704408,
+ 0.196191,-0.277913,0.940358,34.443606,-105.094939,217.970923,
+ 0.196191,-0.277913,0.940358,32.854034,-107.924833,217.466215,
+ 0.196191,-0.277913,0.940358,34.31066,-107.409173,217.314711,
+ 0.039888,-0.531117,0.846359,32.306126,-110.216859,216.473227,
+ 0.039888,-0.531117,0.846359,30.686436,-110.417039,216.423942,
+ 0.039888,-0.531117,0.846359,31.885688,-111.239357,215.851392,
+ 0.029209,-0.54212,0.839793,30.686436,-110.417039,216.423942,
+ 0.029209,-0.54212,0.839793,30.260522,-111.491863,215.744914,
+ 0.029209,-0.54212,0.839793,31.885688,-111.239357,215.851392,
+ -0.184219,-0.49095,0.851488,32.306126,-110.216859,216.473227,
+ -0.184219,-0.49095,0.851488,33.978143,-111.595604,216.040011,
+ -0.184219,-0.49095,0.851488,34.519662,-110.588926,216.737598,
+ -0.157691,-0.464965,0.871172,32.306126,-110.216859,216.473227,
+ -0.157691,-0.464965,0.871172,31.885688,-111.239357,215.851392,
+ -0.157691,-0.464965,0.871172,33.978143,-111.595604,216.040011,
+ -0.449438,-0.582435,0.677329,24.305635,-109.736793,217.354869,
+ -0.449438,-0.582435,0.677329,25.171153,-111.226884,216.647852,
+ -0.449438,-0.582435,0.677329,25.814283,-110.645511,217.574519,
+ -0.513791,-0.754118,0.409055,25.814283,-110.645511,217.574519,
+ -0.513791,-0.754118,0.409055,25.478724,-110.20682,217.961796,
+ -0.513791,-0.754118,0.409055,24.305635,-109.736793,217.354869,
+ 0.630971,-0.27555,-0.725223,31.962352,-104.718309,205.10193,
+ 0.630971,-0.27555,-0.725223,32.911532,-104.832393,205.971099,
+ 0.630971,-0.27555,-0.725223,31.41049,-105.424718,204.89019,
+ 0.606035,-0.094506,-0.789804,32.911532,-104.832393,205.971099,
+ 0.606035,-0.094506,-0.789804,31.823322,-105.902046,205.264082,
+ 0.606035,-0.094506,-0.789804,31.41049,-105.424718,204.89019,
+ 0.174238,-0.517454,-0.837784,29.192998,-106.478855,205.2294,
+ 0.174238,-0.517454,-0.837784,30.313152,-106.748398,205.628847,
+ 0.174238,-0.517454,-0.837784,29.056402,-106.975045,205.507461,
+ 0.148777,-0.574495,-0.804873,30.329581,-106.145729,205.201716,
+ 0.148777,-0.574495,-0.804873,30.313152,-106.748398,205.628847,
+ 0.148777,-0.574495,-0.804873,29.192998,-106.478855,205.2294,
+ -0.050256,-0.678826,-0.732578,27.545624,-105.862497,204.580185,
+ -0.050256,-0.678826,-0.732578,29.056402,-106.975045,205.507461,
+ -0.050256,-0.678826,-0.732578,26.77259,-106.481593,205.206887,
+ 0.141528,-0.513308,-0.846454,27.545624,-105.862497,204.580185,
+ 0.141528,-0.513308,-0.846454,29.192998,-106.478855,205.2294,
+ 0.141528,-0.513308,-0.846454,29.056402,-106.975045,205.507461,
+ -0.175947,-0.387162,-0.905068,26.169313,-104.335595,204.406169,
+ -0.175947,-0.387162,-0.905068,26.77259,-106.481593,205.206887,
+ -0.175947,-0.387162,-0.905068,25.280674,-104.821441,204.786754,
+ -0.351214,-0.412375,-0.840592,26.169313,-104.335595,204.406169,
+ -0.351214,-0.412375,-0.840592,27.545624,-105.862497,204.580185,
+ -0.351214,-0.412375,-0.840592,26.77259,-106.481593,205.206887,
+ -0.459978,0.245383,-0.85335,25.249339,-102.85098,205.370256,
+ -0.459978,0.245383,-0.85335,26.322946,-103.003092,204.747813,
+ -0.459978,0.245383,-0.85335,25.280674,-104.821441,204.786754,
+ -0.499619,0.268745,-0.823503,26.322946,-103.003092,204.747813,
+ -0.499619,0.268745,-0.823503,26.169313,-104.335595,204.406169,
+ -0.499619,0.268745,-0.823503,25.280674,-104.821441,204.786754,
+ -0.312606,0.376496,-0.872083,25.838317,-101.086479,205.920902,
+ -0.312606,0.376496,-0.872083,26.971248,-101.482579,205.343788,
+ -0.312606,0.376496,-0.872083,25.249339,-102.85098,205.370256,
+ -0.389896,0.475367,-0.788674,26.971248,-101.482579,205.343788,
+ -0.389896,0.475367,-0.788674,26.322946,-103.003092,204.747813,
+ -0.389896,0.475367,-0.788674,25.249339,-102.85098,205.370256,
+ -0.012289,0.792674,-0.609522,27.684654,-100.920068,206.10009,
+ -0.012289,0.792674,-0.609522,25.838317,-101.086479,205.920902,
+ -0.012289,0.792674,-0.609522,27.405376,-100.486244,206.669902,
+ 0.183315,0.91223,-0.366376,29.674586,-100.603675,207.512908,
+ 0.183315,0.91223,-0.366376,28.84314,-100.767348,206.689373,
+ 0.183315,0.91223,-0.366376,27.405376,-100.486244,206.669902,
+ 0.168133,0.8223,-0.543648,28.84314,-100.767348,206.689373,
+ 0.168133,0.8223,-0.543648,27.684654,-100.920068,206.10009,
+ 0.168133,0.8223,-0.543648,27.405376,-100.486244,206.669902,
+ 0.242345,0.768989,-0.591544,31.631052,-100.922806,207.899577,
+ 0.242345,0.768989,-0.591544,30.802954,-101.446985,206.878904,
+ 0.242345,0.768989,-0.591544,29.674586,-100.603675,207.512908,
+ 0.327436,0.807269,-0.491021,30.802954,-101.446985,206.878904,
+ 0.327436,0.807269,-0.491021,28.84314,-100.767348,206.689373,
+ 0.327436,0.807269,-0.491021,29.674586,-100.603675,207.512908,
+ 0.168097,0.762389,-0.624905,32.391613,-101.298219,207.646158,
+ 0.168097,0.762389,-0.624905,31.643525,-101.85069,206.770905,
+ 0.168097,0.762389,-0.624905,31.631052,-100.922806,207.899577,
+ 0.278884,0.743332,-0.608013,31.643525,-101.85069,206.770905,
+ 0.278884,0.743332,-0.608013,30.802954,-101.446985,206.878904,
+ 0.278884,0.743332,-0.608013,31.631052,-100.922806,207.899577,
+ 0.133869,-0.526515,-0.83956,27.545624,-105.862497,204.580185,
+ 0.133869,-0.526515,-0.83956,30.329581,-106.145729,205.201716,
+ 0.133869,-0.526515,-0.83956,29.192998,-106.478855,205.2294,
+ 0.128451,-0.549318,-0.825682,31.41049,-105.424718,204.89019,
+ 0.128451,-0.549318,-0.825682,30.329581,-106.145729,205.201716,
+ 0.128451,-0.549318,-0.825682,27.545624,-105.862497,204.580185,
+ 0.084134,-0.037646,-0.995743,26.169313,-104.335595,204.406169,
+ 0.084134,-0.037646,-0.995743,31.41049,-105.424718,204.89019,
+ 0.084134,-0.037646,-0.995743,27.545624,-105.862497,204.580185,
+ 0.129461,0.190542,-0.973105,26.169313,-104.335595,204.406169,
+ 0.129461,0.190542,-0.973105,31.962352,-104.718309,205.10193,
+ 0.129461,0.190542,-0.973105,31.41049,-105.424718,204.89019,
+ 0.131088,0.232008,-0.96384,26.322946,-103.003092,204.747813,
+ 0.131088,0.232008,-0.96384,31.962352,-104.718309,205.10193,
+ 0.131088,0.232008,-0.96384,26.169313,-104.335595,204.406169,
+ 0.177602,0.398128,-0.899973,26.322946,-103.003092,204.747813,
+ 0.177602,0.398128,-0.899973,32.32012,-103.023171,205.922423,
+ 0.177602,0.398128,-0.899973,31.962352,-104.718309,205.10193,
+ 0.219472,0.273491,-0.936501,26.971248,-101.482579,205.343788,
+ 0.219472,0.273491,-0.936501,32.071873,-102.240098,206.317915,
+ 0.219472,0.273491,-0.936501,26.322946,-103.003092,204.747813,
+ 0.220619,0.832969,-0.507434,32.071873,-102.240098,206.317915,
+ 0.220619,0.832969,-0.507434,26.971248,-101.482579,205.343788,
+ 0.220619,0.832969,-0.507434,31.643525,-101.85069,206.770905,
+ 0.286931,0.624926,-0.726043,28.84314,-100.767348,206.689373,
+ 0.286931,0.624926,-0.726043,30.802954,-101.446985,206.878904,
+ 0.286931,0.624926,-0.726043,27.684654,-100.920068,206.10009,
+ 0.277801,0.741731,-0.610461,31.643525,-101.85069,206.770905,
+ 0.277801,0.741731,-0.610461,27.684654,-100.920068,206.10009,
+ 0.277801,0.741731,-0.610461,30.802954,-101.446985,206.878904,
+ 0.169489,0.486578,-0.857038,32.071873,-102.240098,206.317915,
+ 0.169489,0.486578,-0.857038,32.32012,-103.023171,205.922423,
+ 0.169489,0.486578,-0.857038,26.322946,-103.003092,204.747813,
+ 0.778282,0.602133,-0.178079,33.492905,-102.133619,209.634568,
+ 0.778282,0.602133,-0.178079,32.391613,-101.298219,207.646158,
+ 0.778282,0.602133,-0.178079,32.874417,-101.134546,210.309642,
+ 0.778247,0.602193,-0.178034,32.391613,-101.298219,207.646158,
+ 0.778247,0.602193,-0.178034,33.492905,-102.133619,209.634568,
+ 0.778247,0.602193,-0.178034,32.985155,-102.164042,207.31212,
+ 0.899648,0.387202,-0.20176,33.820555,-103.166765,209.112824,
+ 0.899648,0.387202,-0.20176,32.985155,-102.164042,207.31212,
+ 0.899648,0.387202,-0.20176,33.492905,-102.133619,209.634568,
+ 0.899648,0.387205,-0.201758,32.985155,-102.164042,207.31212,
+ 0.899648,0.387205,-0.201758,33.820555,-103.166765,209.112824,
+ 0.899648,0.387205,-0.201758,33.274472,-103.07641,206.85122,
+ 0.477136,-0.835734,-0.271828,31.823322,-105.902046,205.264082,
+ 0.477136,-0.835734,-0.271828,31.455515,-107.050188,208.148432,
+ 0.477136,-0.835734,-0.271828,31.11813,-106.366596,205.454526,
+ 0.476999,-0.835798,-0.271871,31.455515,-107.050188,208.148432,
+ 0.476999,-0.835798,-0.271871,31.823322,-105.902046,205.264082,
+ 0.476999,-0.835798,-0.271871,32.276008,-106.497413,207.888625,
+ 0.363762,-0.89099,-0.271689,31.11813,-106.366596,205.454526,
+ 0.363762,-0.89099,-0.271689,30.512724,-107.499223,208.358347,
+ 0.363762,-0.89099,-0.271689,30.313152,-106.748398,205.628847,
+ 0.363863,-0.890958,-0.271655,30.512724,-107.499223,208.358347,
+ 0.363863,-0.890958,-0.271655,31.11813,-106.366596,205.454526,
+ 0.363863,-0.890958,-0.271655,31.455515,-107.050188,208.148432,
+ 0.968096,-0.081357,-0.237005,33.408939,-105.155175,208.114055,
+ 0.968096,-0.081357,-0.237005,33.274472,-103.07641,206.85122,
+ 0.968096,-0.081357,-0.237005,33.820555,-103.166765,209.112824,
+ 0.968109,-0.081329,-0.23696,33.274472,-103.07641,206.85122,
+ 0.968109,-0.081329,-0.23696,33.408939,-105.155175,208.114055,
+ 0.968109,-0.081329,-0.23696,32.911532,-104.832393,205.971099,
+ 0.758244,-0.595384,-0.265677,32.276008,-106.497413,207.888625,
+ 0.758244,-0.595384,-0.265677,32.911532,-104.832393,205.971099,
+ 0.758244,-0.595384,-0.265677,33.408939,-105.155175,208.114055,
+ 0.758081,-0.595515,-0.265845,32.911532,-104.832393,205.971099,
+ 0.758081,-0.595515,-0.265845,32.276008,-106.497413,207.888625,
+ 0.758081,-0.595515,-0.265845,31.823322,-105.902046,205.264082,
+ 0.196126,-0.941712,-0.273336,29.056402,-106.975045,205.507461,
+ 0.196126,-0.941712,-0.273336,30.512724,-107.499223,208.358347,
+ 0.196126,-0.941712,-0.273336,29.039061,-107.764811,208.21597,
+ 0.196231,-0.941677,-0.273382,30.512724,-107.499223,208.358347,
+ 0.196231,-0.941677,-0.273382,29.056402,-106.975045,205.507461,
+ 0.196231,-0.941677,-0.273382,30.313152,-106.748398,205.628847,
+ -0.167902,-0.946089,-0.276992,26.77259,-106.481593,205.206887,
+ -0.167902,-0.946089,-0.276992,29.039061,-107.764811,208.21597,
+ -0.167902,-0.946089,-0.276992,26.465323,-107.00851,207.192864,
+ -0.167969,-0.946091,-0.276943,29.039061,-107.764811,208.21597,
+ -0.167969,-0.946091,-0.276943,26.77259,-106.481593,205.206887,
+ -0.167969,-0.946091,-0.276943,29.056402,-106.975045,205.507461,
+ -0.67603,-0.679582,-0.284872,25.280674,-104.821441,204.786754,
+ -0.67603,-0.679582,-0.284872,26.465323,-107.00851,207.192864,
+ -0.67603,-0.679582,-0.284872,24.781137,-105.134184,206.718274,
+ -0.676003,-0.679597,-0.2849,26.465323,-107.00851,207.192864,
+ -0.676003,-0.679597,-0.2849,25.280674,-104.821441,204.786754,
+ -0.676003,-0.679597,-0.2849,26.77259,-106.481593,205.206887,
+ -0.9688,0.05614,-0.241402,25.249339,-102.85098,205.370256,
+ -0.9688,0.05614,-0.241402,24.781137,-105.134184,206.718274,
+ -0.9688,0.05614,-0.241402,24.745847,-102.909695,207.377224,
+ -0.968786,0.056098,-0.241468,24.781137,-105.134184,206.718274,
+ -0.968786,0.056098,-0.241468,25.249339,-102.85098,205.370256,
+ -0.968786,0.056098,-0.241468,25.280674,-104.821441,204.786754,
+ -0.903942,0.369066,-0.216053,25.838317,-101.086479,205.920902,
+ -0.903942,0.369066,-0.216053,24.745847,-102.909695,207.377224,
+ -0.903942,0.369066,-0.216053,25.313226,-100.879606,208.471214,
+ -0.903937,0.369126,-0.215973,24.745847,-102.909695,207.377224,
+ -0.903937,0.369126,-0.215973,25.838317,-101.086479,205.920902,
+ -0.903937,0.369126,-0.215973,25.249339,-102.85098,205.370256,
+ -0.296216,0.945149,-0.137656,27.126403,-100.182629,209.354986,
+ -0.296216,0.945149,-0.137656,25.838317,-101.086479,205.920902,
+ -0.296216,0.945149,-0.137656,25.313226,-100.879606,208.471214,
+ -0.29623,0.945146,-0.13765,25.838317,-101.086479,205.920902,
+ -0.29623,0.945146,-0.13765,27.126403,-100.182629,209.354986,
+ -0.29623,0.945146,-0.13765,27.405376,-100.486244,206.669902,
+ 0.08939,0.990684,-0.102734,29.757943,-100.31527,210.365619,
+ 0.08939,0.990684,-0.102734,27.405376,-100.486244,206.669902,
+ 0.08939,0.990684,-0.102734,27.126403,-100.182629,209.354986,
+ 0.089446,0.990675,-0.102769,27.405376,-100.486244,206.669902,
+ 0.089446,0.990675,-0.102769,29.757943,-100.31527,210.365619,
+ 0.089446,0.990675,-0.102769,29.674586,-100.603675,207.512908,
+ 0.18013,0.978114,-0.104149,29.757943,-100.31527,210.365619,
+ 0.18013,0.978114,-0.104149,31.631052,-100.922806,207.899577,
+ 0.18013,0.978114,-0.104149,29.674586,-100.603675,207.512908,
+ 0.180113,0.978115,-0.104162,31.631052,-100.922806,207.899577,
+ 0.180113,0.978115,-0.104162,29.757943,-100.31527,210.365619,
+ 0.180113,0.978115,-0.104162,32.00038,-100.703156,210.600785,
+ 0.404062,0.905606,-0.128886,32.00038,-100.703156,210.600785,
+ 0.404062,0.905606,-0.128886,32.391613,-101.298219,207.646158,
+ 0.404062,0.905606,-0.128886,31.631052,-100.922806,207.899577,
+ 0.404042,0.905614,-0.12889,32.391613,-101.298219,207.646158,
+ 0.404042,0.905614,-0.12889,32.00038,-100.703156,210.600785,
+ 0.404042,0.905614,-0.12889,32.874417,-101.134546,210.309642,
+ 0.162343,-0.379285,0.910927,29.145844,-106.5613,218.390753,
+ 0.162343,-0.379285,0.910927,31.794725,-108.10463,217.276075,
+ 0.162343,-0.379285,0.910927,30.380386,-106.602066,218.153762,
+ 0.13231,-0.421025,0.897347,29.145844,-106.5613,218.390753,
+ 0.13231,-0.421025,0.897347,29.635949,-108.121666,217.586384,
+ 0.13231,-0.421025,0.897347,31.794725,-108.10463,217.276075,
+ 0.990148,-0.03642,0.135204,35.874069,-103.989996,215.319912,
+ 0.990148,-0.03642,0.135204,35.705833,-104.517217,216.409948,
+ 0.990148,-0.03642,0.135204,35.674193,-106.686336,216.057352,
+ 0.997184,-0.074905,-0.003604,35.752683,-105.562836,214.423972,
+ 0.997184,-0.074905,-0.003604,35.874069,-103.989996,215.319912,
+ 0.997184,-0.074905,-0.003604,35.674193,-106.686336,216.057352,
+ 0.051062,-0.784476,-0.618054,34.704326,-110.462064,213.030016,
+ 0.051062,-0.784476,-0.618054,34.5872,-111.749846,214.654878,
+ 0.051062,-0.784476,-0.618054,32.690057,-111.804302,214.567261,
+ 0.237835,-0.864361,-0.443074,34.704326,-110.462064,213.030016,
+ 0.237835,-0.864361,-0.443074,32.690057,-111.804302,214.567261,
+ 0.237835,-0.864361,-0.443074,33.034439,-111.016361,213.214984,
+ 0.066907,-0.869407,-0.489545,33.034439,-111.016361,213.214984,
+ 0.066907,-0.869407,-0.489545,32.690057,-111.804302,214.567261,
+ 0.066907,-0.869407,-0.489545,30.516374,-112.012696,214.640275,
+ 0.12984,-0.905637,-0.403687,33.034439,-111.016361,213.214984,
+ 0.12984,-0.905637,-0.403687,30.516374,-112.012696,214.640275,
+ 0.12984,-0.905637,-0.403687,30.960542,-111.300811,213.186083,
+ 0.997122,-0.075694,-0.00415,35.752683,-105.562836,214.423972,
+ 0.997122,-0.075694,-0.00415,35.674193,-106.686336,216.057352,
+ 0.997122,-0.075694,-0.00415,35.414994,-110.064139,215.388971,
+ 0.973614,-0.024399,0.226895,35.85612,-109.025821,213.607738,
+ 0.973614,-0.024399,0.226895,35.752683,-105.562836,214.423972,
+ 0.973614,-0.024399,0.226895,35.414994,-110.064139,215.388971,
+ 0.901997,-0.430848,-0.027769,35.85612,-109.025821,213.607738,
+ 0.901997,-0.430848,-0.027769,35.414994,-110.064139,215.388971,
+ 0.901997,-0.430848,-0.027769,34.5872,-111.749846,214.654878,
+ 0.795666,-0.501331,-0.339974,34.704326,-110.462064,213.030016,
+ 0.795666,-0.501331,-0.339974,35.85612,-109.025821,213.607738,
+ 0.795666,-0.501331,-0.339974,34.5872,-111.749846,214.654878,
+ -0.119948,-0.876711,-0.465822,30.960542,-111.300811,213.186083,
+ -0.119948,-0.876711,-0.465822,30.516374,-112.012696,214.640275,
+ -0.119948,-0.876711,-0.465822,28.107222,-111.770533,214.804861,
+ -0.086491,-0.905595,-0.415231,30.960542,-111.300811,213.186083,
+ -0.086491,-0.905595,-0.415231,28.107222,-111.770533,214.804861,
+ -0.086491,-0.905595,-0.415231,28.932278,-111.107932,213.187908,
+ -0.296058,-0.821321,-0.487629,28.932278,-111.107932,213.187908,
+ -0.296058,-0.821321,-0.487629,28.107222,-111.770533,214.804861,
+ -0.296058,-0.821321,-0.487629,25.51736,-111.030964,215.131598,
+ -0.289368,-0.830761,-0.475501,28.932278,-111.107932,213.187908,
+ -0.289368,-0.830761,-0.475501,25.51736,-111.030964,215.131598,
+ -0.289368,-0.830761,-0.475501,26.174789,-109.856658,212.679854,
+ -0.795476,-0.435157,-0.421731,26.174789,-109.856658,212.679854,
+ -0.795476,-0.435157,-0.421731,25.51736,-111.030964,215.131598,
+ -0.795476,-0.435157,-0.421731,24.267911,-108.807388,215.193964,
+ -0.722939,-0.629029,-0.285801,24.444361,-107.803752,212.538694,
+ -0.722939,-0.629029,-0.285801,26.174789,-109.856658,212.679854,
+ -0.722939,-0.629029,-0.285801,24.267911,-108.807388,215.193964,
+ -0.982495,0.186219,0.005097,24.444361,-107.803752,212.538694,
+ -0.982495,0.186219,0.005097,24.267911,-108.807388,215.193964,
+ -0.982495,0.186219,0.005097,24.728506,-106.391238,215.703844,
+ -0.993868,0.101469,0.04394,24.444361,-107.803752,212.538694,
+ -0.993868,0.101469,0.04394,24.728506,-106.391238,215.703844,
+ -0.993868,0.101469,0.04394,24.769273,-104.944348,213.284652,
+ -0.9412,0.296699,0.161592,24.769273,-104.944348,213.284652,
+ -0.9412,0.296699,0.161592,24.728506,-106.391238,215.703844,
+ -0.9412,0.296699,0.161592,25.604368,-103.970526,216.360664,
+ -0.962808,0.17475,0.206066,24.769273,-104.944348,213.284652,
+ -0.962808,0.17475,0.206066,25.604368,-103.970526,216.360664,
+ -0.962808,0.17475,0.206066,25.38989,-102.869538,214.424884,
+ -0.814773,0.460538,0.352208,25.38989,-102.869538,214.424884,
+ -0.814773,0.460538,0.352208,25.604368,-103.970526,216.360664,
+ -0.814773,0.460538,0.352208,26.873592,-102.146397,216.911614,
+ -0.530543,0.844686,0.070913,27.141918,-101.842781,215.302572,
+ -0.530543,0.844686,0.070913,25.38989,-102.869538,214.424884,
+ -0.530543,0.844686,0.070913,26.873592,-102.146397,216.911614,
+ -0.327794,0.936825,0.122109,30.004365,-101.075527,217.100233,
+ -0.327794,0.936825,0.122109,27.141918,-101.842781,215.302572,
+ -0.327794,0.936825,0.122109,26.873592,-102.146397,216.911614,
+ -0.287955,0.956319,0.050353,30.24744,-100.927978,215.688024,
+ -0.287955,0.956319,0.050353,27.141918,-101.842781,215.302572,
+ -0.287955,0.956319,0.050353,30.004365,-101.075527,217.100233,
+ -0.105135,0.990782,0.085421,32.250149,-100.742401,216.000462,
+ -0.105135,0.990782,0.085421,30.24744,-100.927978,215.688024,
+ -0.105135,0.990782,0.085421,30.004365,-101.075527,217.100233,
+ -0.087782,0.995725,-0.028746,32.42812,-100.750311,215.183011,
+ -0.087782,0.995725,-0.028746,30.24744,-100.927978,215.688024,
+ -0.087782,0.995725,-0.028746,32.250149,-100.742401,216.000462,
+ 0.603181,0.787954,0.123697,33.875923,-102.167084,217.147996,
+ 0.603181,0.787954,0.123697,32.42812,-100.750311,215.183011,
+ 0.603181,0.787954,0.123697,32.250149,-100.742401,216.000462,
+ 0.461305,0.845297,0.269577,34.276283,-101.687018,214.957581,
+ 0.461305,0.845297,0.269577,32.42812,-100.750311,215.183011,
+ 0.461305,0.845297,0.269577,33.875923,-102.167084,217.147996,
+ 0.966518,0.06657,-0.247812,35.244629,-102.813865,213.180911,
+ 0.966518,0.06657,-0.247812,35.874069,-103.989996,215.319912,
+ 0.966518,0.06657,-0.247812,35.752683,-105.562836,214.423972,
+ 0.979725,0.103498,-0.171544,35.34198,-104.564371,212.680766,
+ 0.979725,0.103498,-0.171544,35.244629,-102.813865,213.180911,
+ 0.979725,0.103498,-0.171544,35.752683,-105.562836,214.423972,
+ 0.822808,0.568037,-0.017923,34.11839,-101.49779,213.706307,
+ 0.822808,0.568037,-0.017923,34.276283,-101.687018,214.957581,
+ 0.822808,0.568037,-0.017923,35.874069,-103.989996,215.319912,
+ 0.77667,0.619824,0.112261,35.244629,-102.813865,213.180911,
+ 0.77667,0.619824,0.112261,34.11839,-101.49779,213.706307,
+ 0.77667,0.619824,0.112261,35.874069,-103.989996,215.319912,
+ 0.930933,0.147254,-0.334187,34.352339,-102.390384,210.881888,
+ 0.930933,0.147254,-0.334187,35.244629,-102.813865,213.180911,
+ 0.930933,0.147254,-0.334187,35.34198,-104.564371,212.680766,
+ 0.938936,0.190094,-0.286817,34.486806,-103.825715,210.370791,
+ 0.938936,0.190094,-0.286817,34.352339,-102.390384,210.881888,
+ 0.938936,0.190094,-0.286817,35.34198,-104.564371,212.680766,
+ 0.737805,0.668559,-0.093128,33.687913,-101.337464,211.446833,
+ 0.737805,0.668559,-0.093128,34.11839,-101.49779,213.706307,
+ 0.737805,0.668559,-0.093128,35.244629,-102.813865,213.180911,
+ -0.970519,0.209525,0.119134,24.745847,-102.909695,207.377224,
+ -0.970519,0.209525,0.119134,24.81156,-103.496848,208.945196,
+ -0.970519,0.209525,0.119134,25.383197,-101.470714,210.038578,
+ -0.971004,0.206128,0.121087,24.745847,-102.909695,207.377224,
+ -0.971004,0.206128,0.121087,25.383197,-101.470714,210.038578,
+ -0.971004,0.206128,0.121087,25.313226,-100.879606,208.471214,
+ -0.517465,0.792775,0.322084,27.246571,-100.635619,210.976806,
+ -0.517465,0.792775,0.322084,25.313226,-100.879606,208.471214,
+ -0.517465,0.792775,0.322084,25.383197,-101.470714,210.038578,
+ -0.457462,0.847089,0.270496,27.246571,-100.635619,210.976806,
+ -0.457462,0.847089,0.270496,27.126403,-100.182629,209.354986,
+ -0.457462,0.847089,0.270496,25.313226,-100.879606,208.471214,
+ -0.110735,0.955057,0.274962,30.419022,-100.534312,211.902561,
+ -0.110735,0.955057,0.274962,27.126403,-100.182629,209.354986,
+ -0.110735,0.955057,0.274962,27.246571,-100.635619,210.976806,
+ -0.005132,0.989673,0.143253,30.419022,-100.534312,211.902561,
+ -0.005132,0.989673,0.143253,29.757943,-100.31527,210.365619,
+ -0.005132,0.989673,0.143253,27.126403,-100.182629,209.354986,
+ -0.011068,0.98926,0.145748,32.343546,-100.553478,212.178796,
+ -0.011068,0.98926,0.145748,29.757943,-100.31527,210.365619,
+ -0.011068,0.98926,0.145748,30.419022,-100.534312,211.902561,
+ 0.182384,0.974316,-0.132079,32.343546,-100.553478,212.178796,
+ 0.182384,0.974316,-0.132079,32.00038,-100.703156,210.600785,
+ 0.182384,0.974316,-0.132079,29.757943,-100.31527,210.365619,
+ 0.422523,0.889057,-0.176214,33.687913,-101.337464,211.446833,
+ 0.422523,0.889057,-0.176214,32.00038,-100.703156,210.600785,
+ 0.422523,0.889057,-0.176214,32.343546,-100.553478,212.178796,
+ 0.40443,0.905608,-0.127717,33.687913,-101.337464,211.446833,
+ 0.40443,0.905608,-0.127717,32.874417,-101.134546,210.309642,
+ 0.40443,0.905608,-0.127717,32.00038,-100.703156,210.600785,
+ 0.464764,-0.594806,-0.655897,33.497773,-106.696984,209.110086,
+ 0.464764,-0.594806,-0.655897,34.863436,-107.571933,210.87124,
+ 0.464764,-0.594806,-0.655897,33.096196,-109.289279,211.176377,
+ 0.387987,-0.610485,-0.690489,33.497773,-106.696984,209.110086,
+ 0.387987,-0.610485,-0.690489,33.096196,-109.289279,211.176377,
+ 0.387987,-0.610485,-0.690489,32.379444,-108.026748,209.657385,
+ 0.235128,-0.743986,-0.625459,32.379444,-108.026748,209.657385,
+ 0.235128,-0.743986,-0.625459,30.738762,-108.682352,209.820449,
+ 0.235128,-0.743986,-0.625459,31.455515,-107.050188,208.148432,
+ 0.212756,-0.743227,-0.634309,31.455515,-107.050188,208.148432,
+ 0.212756,-0.743227,-0.634309,30.738762,-108.682352,209.820449,
+ 0.212756,-0.743227,-0.634309,30.512724,-107.499223,208.358347,
+ 0.482736,-0.648308,-0.588781,33.497773,-106.696984,209.110086,
+ 0.482736,-0.648308,-0.588781,32.379444,-108.026748,209.657385,
+ 0.482736,-0.648308,-0.588781,32.276008,-106.497413,207.888625,
+ 0.281764,-0.717586,-0.636929,32.379444,-108.026748,209.657385,
+ 0.281764,-0.717586,-0.636929,31.455515,-107.050188,208.148432,
+ 0.281764,-0.717586,-0.636929,32.276008,-106.497413,207.888625,
+ 0.979301,0.073685,-0.18852,35.34198,-104.564371,212.680766,
+ 0.979301,0.073685,-0.18852,35.752683,-105.562836,214.423972,
+ 0.979301,0.073685,-0.18852,35.85612,-109.025821,213.607738,
+ 0.988743,0.088943,-0.120322,35.341068,-106.324309,211.372298,
+ 0.988743,0.088943,-0.120322,35.34198,-104.564371,212.680766,
+ 0.988743,0.088943,-0.120322,35.85612,-109.025821,213.607738,
+ 0.729458,-0.348146,-0.5888,35.341068,-106.324309,211.372298,
+ 0.729458,-0.348146,-0.5888,35.85612,-109.025821,213.607738,
+ 0.729458,-0.348146,-0.5888,34.704326,-110.462064,213.030016,
+ 0.931135,-0.249749,-0.265732,34.863436,-107.571933,210.87124,
+ 0.931135,-0.249749,-0.265732,35.341068,-106.324309,211.372298,
+ 0.931135,-0.249749,-0.265732,34.704326,-110.462064,213.030016,
+ -0.079951,-0.835607,-0.543479,30.960542,-111.300811,213.186083,
+ -0.079951,-0.835607,-0.543479,28.932278,-111.107932,213.187908,
+ -0.079951,-0.835607,-0.543479,30.89635,-110.225986,211.542967,
+ 0.012706,-0.887486,-0.46066,30.89635,-110.225986,211.542967,
+ 0.012706,-0.887486,-0.46066,28.932278,-111.107932,213.187908,
+ 0.012706,-0.887486,-0.46066,29.088954,-110.234809,211.510111,
+ -0.294235,-0.836277,-0.462674,29.088954,-110.234809,211.510111,
+ -0.294235,-0.836277,-0.462674,28.932278,-111.107932,213.187908,
+ -0.294235,-0.836277,-0.462674,26.174789,-109.856658,212.679854,
+ -0.284696,-0.85539,-0.432731,29.088954,-110.234809,211.510111,
+ -0.284696,-0.85539,-0.432731,26.174789,-109.856658,212.679854,
+ -0.284696,-0.85539,-0.432731,26.339983,-108.964672,210.807961,
+ -0.702384,-0.616514,-0.355763,26.339983,-108.964672,210.807961,
+ -0.702384,-0.616514,-0.355763,26.174789,-109.856658,212.679854,
+ -0.702384,-0.616514,-0.355763,24.444361,-107.803752,212.538694,
+ -0.700795,-0.621045,-0.350983,24.753453,-107.027067,210.547241,
+ -0.700795,-0.621045,-0.350983,26.339983,-108.964672,210.807961,
+ -0.700795,-0.621045,-0.350983,24.444361,-107.803752,212.538694,
+ -0.985473,0.137855,-0.09919,24.753453,-107.027067,210.547241,
+ -0.985473,0.137855,-0.09919,24.444361,-107.803752,212.538694,
+ -0.985473,0.137855,-0.09919,24.769273,-104.944348,213.284652,
+ -0.994182,0.088415,-0.061524,24.753453,-107.027067,210.547241,
+ -0.994182,0.088415,-0.061524,24.769273,-104.944348,213.284652,
+ -0.994182,0.088415,-0.061524,24.947548,-104.278705,211.360433,
+ -0.959328,0.282159,0.008727,24.947548,-104.278705,211.360433,
+ -0.959328,0.282159,0.008727,24.769273,-104.944348,213.284652,
+ -0.959328,0.282159,0.008727,25.38989,-102.869538,214.424884,
+ -0.962994,0.26909,0.015265,24.947548,-104.278705,211.360433,
+ -0.962994,0.26909,0.015265,25.38989,-102.869538,214.424884,
+ -0.962994,0.26909,0.015265,25.517056,-102.301855,212.440125,
+ -0.566256,0.801334,0.192918,27.141918,-101.842781,215.302572,
+ -0.566256,0.801334,0.192918,25.517056,-102.301855,212.440125,
+ -0.566256,0.801334,0.192918,25.38989,-102.869538,214.424884,
+ -0.524701,0.835365,0.163871,27.206109,-101.420517,213.355536,
+ -0.524701,0.835365,0.163871,25.517056,-102.301855,212.440125,
+ -0.524701,0.835365,0.163871,27.141918,-101.842781,215.302572,
+ -0.29921,0.934505,0.192806,30.24744,-100.927978,215.688024,
+ -0.29921,0.934505,0.192806,27.206109,-101.420517,213.355536,
+ -0.29921,0.934505,0.192806,27.141918,-101.842781,215.302572,
+ -0.211431,0.974896,0.069822,30.458572,-100.785905,214.343657,
+ -0.211431,0.974896,0.069822,27.206109,-101.420517,213.355536,
+ -0.211431,0.974896,0.069822,30.24744,-100.927978,215.688024,
+ -0.058776,0.993666,0.09578,32.42812,-100.750311,215.183011,
+ -0.058776,0.993666,0.09578,30.458572,-100.785905,214.343657,
+ -0.058776,0.993666,0.09578,30.24744,-100.927978,215.688024,
+ 0.008181,0.998072,-0.061521,32.834259,-100.809635,214.274598,
+ 0.008181,0.998072,-0.061521,30.458572,-100.785905,214.343657,
+ 0.008181,0.998072,-0.061521,32.42812,-100.750311,215.183011,
+ 0.46144,0.874537,0.149192,34.276283,-101.687018,214.957581,
+ 0.46144,0.874537,0.149192,32.834259,-100.809635,214.274598,
+ 0.46144,0.874537,0.149192,32.42812,-100.750311,215.183011,
+ 0.494648,0.866382,0.068604,34.276283,-101.687018,214.957581,
+ 0.494648,0.866382,0.068604,34.11839,-101.49779,213.706307,
+ 0.494648,0.866382,0.068604,32.834259,-100.809635,214.274598,
+ 0.937077,0.207989,-0.280406,34.486806,-103.825715,210.370791,
+ 0.937077,0.207989,-0.280406,35.34198,-104.564371,212.680766,
+ 0.937077,0.207989,-0.280406,35.341068,-106.324309,211.372298,
+ 0.897611,0.139259,-0.418213,34.298491,-105.486171,209.413701,
+ 0.897611,0.139259,-0.418213,34.486806,-103.825715,210.370791,
+ 0.897611,0.139259,-0.418213,35.341068,-106.324309,211.372298,
+ 0.853207,-0.123084,-0.506841,34.298491,-105.486171,209.413701,
+ 0.853207,-0.123084,-0.506841,35.341068,-106.324309,211.372298,
+ 0.853207,-0.123084,-0.506841,34.863436,-107.571933,210.87124,
+ 0.684218,-0.28405,-0.671685,33.497773,-106.696984,209.110086,
+ 0.684218,-0.28405,-0.671685,34.298491,-105.486171,209.413701,
+ 0.684218,-0.28405,-0.671685,34.863436,-107.571933,210.87124,
+ 0.015776,-0.743908,-0.668096,30.89635,-110.225986,211.542967,
+ 0.015776,-0.743908,-0.668096,29.088954,-110.234809,211.510111,
+ 0.015776,-0.743908,-0.668096,30.738762,-108.682352,209.820449,
+ 0.110866,-0.783407,-0.611541,30.738762,-108.682352,209.820449,
+ 0.110866,-0.783407,-0.611541,29.088954,-110.234809,211.510111,
+ 0.110866,-0.783407,-0.611541,29.193607,-108.660448,209.51227,
+ -0.196854,-0.765026,-0.613176,29.193607,-108.660448,209.51227,
+ -0.196854,-0.765026,-0.613176,29.088954,-110.234809,211.510111,
+ -0.196854,-0.765026,-0.613176,26.339983,-108.964672,210.807961,
+ -0.11865,-0.876233,-0.467052,29.193607,-108.660448,209.51227,
+ -0.11865,-0.876233,-0.467052,26.339983,-108.964672,210.807961,
+ -0.11865,-0.876233,-0.467052,26.513086,-107.831436,208.637929,
+ -0.69107,-0.616601,-0.377128,26.513086,-107.831436,208.637929,
+ -0.69107,-0.616601,-0.377128,26.339983,-108.964672,210.807961,
+ -0.69107,-0.616601,-0.377128,24.753453,-107.027067,210.547241,
+ -0.668289,-0.66351,-0.336371,24.836506,-105.936423,208.230877,
+ -0.668289,-0.66351,-0.336371,26.513086,-107.831436,208.637929,
+ -0.668289,-0.66351,-0.336371,24.753453,-107.027067,210.547241,
+ -0.997465,0.071117,-0.002279,24.836506,-105.936423,208.230877,
+ -0.997465,0.071117,-0.002279,24.753453,-107.027067,210.547241,
+ -0.997465,0.071117,-0.002279,24.947548,-104.278705,211.360433,
+ -0.998534,-0.024363,0.048335,24.836506,-105.936423,208.230877,
+ -0.998534,-0.024363,0.048335,24.947548,-104.278705,211.360433,
+ -0.998534,-0.024363,0.048335,24.81156,-103.496848,208.945196,
+ -0.969472,0.211999,0.123213,24.81156,-103.496848,208.945196,
+ -0.969472,0.211999,0.123213,24.947548,-104.278705,211.360433,
+ -0.969472,0.211999,0.123213,25.517056,-102.301855,212.440125,
+ -0.970457,0.206113,0.125425,24.81156,-103.496848,208.945196,
+ -0.970457,0.206113,0.125425,25.517056,-102.301855,212.440125,
+ -0.970457,0.206113,0.125425,25.383197,-101.470714,210.038578,
+ -0.563546,0.770443,0.29805,27.206109,-101.420517,213.355536,
+ -0.563546,0.770443,0.29805,25.383197,-101.470714,210.038578,
+ -0.563546,0.770443,0.29805,25.517056,-102.301855,212.440125,
+ -0.501832,0.823908,0.263325,27.246571,-100.635619,210.976806,
+ -0.501832,0.823908,0.263325,25.383197,-101.470714,210.038578,
+ -0.501832,0.823908,0.263325,27.206109,-101.420517,213.355536,
+ -0.269147,0.915949,0.297653,30.458572,-100.785905,214.343657,
+ -0.269147,0.915949,0.297653,27.246571,-100.635619,210.976806,
+ -0.269147,0.915949,0.297653,27.206109,-101.420517,213.355536,
+ -0.06185,0.992724,0.103318,30.458572,-100.785905,214.343657,
+ -0.06185,0.992724,0.103318,30.419022,-100.534312,211.902561,
+ -0.06185,0.992724,0.103318,27.246571,-100.635619,210.976806,
+ 0.012909,0.994669,0.102307,32.834259,-100.809635,214.274598,
+ 0.012909,0.994669,0.102307,30.419022,-100.534312,211.902561,
+ 0.012909,0.994669,0.102307,30.458572,-100.785905,214.343657,
+ -0.263884,-0.475503,0.839203,30.723855,-105.180121,218.596408,
+ -0.263884,-0.475503,0.839203,31.794725,-108.10463,217.276075,
+ -0.263884,-0.475503,0.839203,32.181394,-105.888051,218.653603,
+ 0.211631,-0.336736,0.917508,30.723855,-105.180121,218.596408,
+ 0.211631,-0.336736,0.917508,30.380386,-106.602066,218.153762,
+ 0.211631,-0.336736,0.917508,31.794725,-108.10463,217.276075,
+ -0.055217,-0.085046,0.994846,30.723855,-105.180121,218.596408,
+ -0.055217,-0.085046,0.994846,29.506654,-105.53576,218.498448,
+ -0.055217,-0.085046,0.994846,29.145844,-106.5613,218.390753,
+ 0.167473,-0.329684,0.929118,30.723855,-105.180121,218.596408,
+ 0.167473,-0.329684,0.929118,29.145844,-106.5613,218.390753,
+ 0.167473,-0.329684,0.929118,30.380386,-106.602066,218.153762,
+ 0.414682,-0.276253,0.86702,28.233779,-106.62397,218.734222,
+ 0.414682,-0.276253,0.86702,27.786874,-108.507423,218.347857,
+ 0.414682,-0.276253,0.86702,29.635949,-108.121666,217.586384,
+ 0.351851,-0.339221,0.872427,29.145844,-106.5613,218.390753,
+ 0.351851,-0.339221,0.872427,28.233779,-106.62397,218.734222,
+ 0.351851,-0.339221,0.872427,29.635949,-108.121666,217.586384,
+ 0.138373,-0.29098,0.94667,31.794725,-108.10463,217.276075,
+ 0.138373,-0.29098,0.94667,29.635949,-108.121666,217.586384,
+ 0.138373,-0.29098,0.94667,31.173195,-109.413707,216.964549,
+ 0.41198,0.05235,0.909688,29.635949,-108.121666,217.586384,
+ 0.41198,0.05235,0.909688,28.844966,-109.752613,218.038461,
+ 0.41198,0.05235,0.909688,31.173195,-109.413707,216.964549,
+ 0.151298,-0.11537,0.981733,27.786874,-108.507423,218.347857,
+ 0.151298,-0.11537,0.981733,27.503032,-109.552738,218.268759,
+ 0.151298,-0.11537,0.981733,28.844966,-109.752613,218.038461,
+ 0.365267,0.079933,0.927465,29.635949,-108.121666,217.586384,
+ 0.365267,0.079933,0.927465,27.786874,-108.507423,218.347857,
+ 0.365267,0.079933,0.927465,28.844966,-109.752613,218.038461,
+ 0.078887,-0.536085,0.84047,33.316759,-105.641326,218.704408,
+ 0.078887,-0.536085,0.84047,32.181394,-105.888051,218.653603,
+ 0.078887,-0.536085,0.84047,31.794725,-108.10463,217.276075,
+ -0.079976,-0.462569,0.882969,33.316759,-105.641326,218.704408,
+ -0.079976,-0.462569,0.882969,31.794725,-108.10463,217.276075,
+ -0.079976,-0.462569,0.882969,32.854034,-107.924833,217.466215,
+ 0.353008,-0.321033,0.878819,29.443983,-104.033196,219.194513,
+ 0.353008,-0.321033,0.878819,28.233779,-106.62397,218.734222,
+ 0.353008,-0.321033,0.878819,29.145844,-106.5613,218.390753,
+ 0.642159,-0.300007,0.705427,29.443983,-104.033196,219.194513,
+ 0.642159,-0.300007,0.705427,29.145844,-106.5613,218.390753,
+ 0.642159,-0.300007,0.705427,29.506654,-105.53576,218.498448,
+ 0.10341,-0.414531,0.90414,29.443983,-104.033196,219.194513,
+ 0.10341,-0.414531,0.90414,29.506654,-105.53576,218.498448,
+ 0.10341,-0.414531,0.90414,31.63957,-104.0767,218.92345,
+ 0.007729,-0.290052,0.95698,31.63957,-104.0767,218.92345,
+ 0.007729,-0.290052,0.95698,29.506654,-105.53576,218.498448,
+ 0.007729,-0.290052,0.95698,30.723855,-105.180121,218.596408,
+ -0.079916,-0.221718,0.971831,31.63957,-104.0767,218.92345,
+ -0.079916,-0.221718,0.971831,30.723855,-105.180121,218.596408,
+ -0.079916,-0.221718,0.971831,33.316759,-105.641326,218.704408,
+ -0.043004,-0.007827,0.999044,30.723855,-105.180121,218.596408,
+ -0.043004,-0.007827,0.999044,32.181394,-105.888051,218.653603,
+ -0.043004,-0.007827,0.999044,33.316759,-105.641326,218.704408,
+ -0.147615,-0.162099,0.975671,32.854034,-107.924833,217.466215,
+ -0.147615,-0.162099,0.975671,31.794725,-108.10463,217.276075,
+ -0.147615,-0.162099,0.975671,31.173195,-109.413707,216.964549,
+ 0.097868,-0.41523,0.904437,32.854034,-107.924833,217.466215,
+ 0.097868,-0.41523,0.904437,31.173195,-109.413707,216.964549,
+ 0.097868,-0.41523,0.904437,32.306126,-110.216859,216.473227,
+ 0.033583,-0.486649,0.872952,31.173195,-109.413707,216.964549,
+ 0.033583,-0.486649,0.872952,30.686436,-110.417039,216.423942,
+ 0.033583,-0.486649,0.872952,32.306126,-110.216859,216.473227,
+ 0.358539,-0.57161,0.738046,31.173195,-109.413707,216.964549,
+ 0.358539,-0.57161,0.738046,28.067368,-110.727044,217.456176,
+ 0.358539,-0.57161,0.738046,30.686436,-110.417039,216.423942,
+ 0.386294,-0.680403,0.622759,31.173195,-109.413707,216.964549,
+ 0.386294,-0.680403,0.622759,28.844966,-109.752613,218.038461,
+ 0.386294,-0.680403,0.622759,28.067368,-110.727044,217.456176,
+ 0.0255,-0.527707,0.849043,28.844966,-109.752613,218.038461,
+ 0.0255,-0.527707,0.849043,25.814283,-110.645511,217.574519,
+ 0.0255,-0.527707,0.849043,28.067368,-110.727044,217.456176,
+ 0.050436,-0.589922,0.805884,27.503032,-109.552738,218.268759,
+ 0.050436,-0.589922,0.805884,25.814283,-110.645511,217.574519,
+ 0.050436,-0.589922,0.805884,28.844966,-109.752613,218.038461,
+ 0.083329,-0.622929,0.777828,27.503032,-109.552738,218.268759,
+ 0.083329,-0.622929,0.777828,25.478724,-110.20682,217.961796,
+ 0.083329,-0.622929,0.777828,25.814283,-110.645511,217.574519,
+ -0.137988,-0.037423,0.989727,27.786874,-108.507423,218.347857,
+ -0.137988,-0.037423,0.989727,25.478724,-110.20682,217.961796,
+ -0.137988,-0.037423,0.989727,27.503032,-109.552738,218.268759,
+ 0.041892,-0.275101,0.960502,27.786874,-108.507423,218.347857,
+ 0.041892,-0.275101,0.960502,26.054012,-108.508944,218.423001,
+ 0.041892,-0.275101,0.960502,25.478724,-110.20682,217.961796,
+ 0.042537,-0.210446,0.97668,28.233779,-106.62397,218.734222,
+ 0.042537,-0.210446,0.97668,26.054012,-108.508944,218.423001,
+ 0.042537,-0.210446,0.97668,27.786874,-108.507423,218.347857,
+ 0.272765,-0.455351,0.847499,28.233779,-106.62397,218.734222,
+ 0.272765,-0.455351,0.847499,27.112713,-106.72193,219.042401,
+ 0.272765,-0.455351,0.847499,26.054012,-108.508944,218.423001,
+ 0.277152,-0.29209,0.915352,29.443983,-104.033196,219.194513,
+ 0.277152,-0.29209,0.915352,27.112713,-106.72193,219.042401,
+ 0.277152,-0.29209,0.915352,28.233779,-106.62397,218.734222,
+ 0.179428,-0.209947,0.961108,27.789307,-103.393108,219.643244,
+ 0.179428,-0.209947,0.961108,27.112713,-106.72193,219.042401,
+ 0.179428,-0.209947,0.961108,29.443983,-104.033196,219.194513,
+ 0.288093,0.075511,0.954621,30.241964,-103.062416,218.876903,
+ 0.288093,0.075511,0.954621,27.789307,-103.393108,219.643244,
+ 0.288093,0.075511,0.954621,29.443983,-104.033196,219.194513,
+ 0.212517,0.141632,0.966839,32.17896,-102.901481,218.427564,
+ 0.212517,0.141632,0.966839,30.241964,-103.062416,218.876903,
+ 0.212517,0.141632,0.966839,29.443983,-104.033196,219.194513,
+ 0.121915,0.337841,0.933274,32.17896,-102.901481,218.427564,
+ 0.121915,0.337841,0.933274,29.443983,-104.033196,219.194513,
+ 0.121915,0.337841,0.933274,31.63957,-104.0767,218.92345,
+ 0.335226,0.231491,0.913255,32.17896,-102.901481,218.427564,
+ 0.335226,0.231491,0.913255,31.63957,-104.0767,218.92345,
+ 0.335226,0.231491,0.913255,33.316759,-105.641326,218.704408,
+ 0.779778,0.595585,-0.192938,34.352339,-102.390384,210.881888,
+ 0.779778,0.595585,-0.192938,33.687913,-101.337464,211.446833,
+ 0.779778,0.595585,-0.192938,35.244629,-102.813865,213.180911,
+ 0.819464,0.258852,-0.511345,33.492905,-102.133619,209.634568,
+ 0.819464,0.258852,-0.511345,34.352339,-102.390384,210.881888,
+ 0.819464,0.258852,-0.511345,34.486806,-103.825715,210.370791,
+ 0.878288,0.406038,-0.252472,33.820555,-103.166765,209.112824,
+ 0.878288,0.406038,-0.252472,33.492905,-102.133619,209.634568,
+ 0.878288,0.406038,-0.252472,34.486806,-103.825715,210.370791,
+ 0.680349,0.630127,-0.374253,32.874417,-101.134546,210.309642,
+ 0.680349,0.630127,-0.374253,33.687913,-101.337464,211.446833,
+ 0.680349,0.630127,-0.374253,34.352339,-102.390384,210.881888,
+ 0.682037,0.64943,-0.336253,33.492905,-102.133619,209.634568,
+ 0.682037,0.64943,-0.336253,32.874417,-101.134546,210.309642,
+ 0.682037,0.64943,-0.336253,34.352339,-102.390384,210.881888,
+ 0.113133,-0.759787,-0.640254,33.096196,-109.289279,211.176377,
+ 0.113133,-0.759787,-0.640254,33.034439,-111.016361,213.214984,
+ 0.113133,-0.759787,-0.640254,30.960542,-111.300811,213.186083,
+ 0.253368,-0.804987,-0.536471,33.096196,-109.289279,211.176377,
+ 0.253368,-0.804987,-0.536471,30.960542,-111.300811,213.186083,
+ 0.253368,-0.804987,-0.536471,30.89635,-110.225986,211.542967,
+ 0.110844,-0.598656,-0.7933,34.863436,-107.571933,210.87124,
+ 0.110844,-0.598656,-0.7933,34.704326,-110.462064,213.030016,
+ 0.110844,-0.598656,-0.7933,33.034439,-111.016361,213.214984,
+ 0.539673,-0.650341,-0.534612,34.863436,-107.571933,210.87124,
+ 0.539673,-0.650341,-0.534612,33.034439,-111.016361,213.214984,
+ 0.539673,-0.650341,-0.534612,33.096196,-109.289279,211.176377,
+ 0.188979,-0.709506,-0.678887,33.096196,-109.289279,211.176377,
+ 0.188979,-0.709506,-0.678887,30.89635,-110.225986,211.542967,
+ 0.188979,-0.709506,-0.678887,32.379444,-108.026748,209.657385,
+ 0.220423,-0.716293,-0.662071,32.379444,-108.026748,209.657385,
+ 0.220423,-0.716293,-0.662071,30.89635,-110.225986,211.542967,
+ 0.220423,-0.716293,-0.662071,30.738762,-108.682352,209.820449,
+ 0.001225,-0.812437,0.583047,28.067368,-110.727044,217.456176,
+ 0.001225,-0.812437,0.583047,25.814283,-110.645511,217.574519,
+ 0.001225,-0.812437,0.583047,27.648756,-111.630894,216.1976,
+ -0.03637,-0.834973,0.549087,27.648756,-111.630894,216.1976,
+ -0.03637,-0.834973,0.549087,25.814283,-110.645511,217.574519,
+ -0.03637,-0.834973,0.549087,25.171153,-111.226884,216.647852,
+ 0.354546,-0.595775,0.720658,30.686436,-110.417039,216.423942,
+ 0.354546,-0.595775,0.720658,28.067368,-110.727044,217.456176,
+ 0.354546,-0.595775,0.720658,30.260522,-111.491863,215.744914,
+ 0.138731,-0.825677,0.54682,30.260522,-111.491863,215.744914,
+ 0.138731,-0.825677,0.54682,28.067368,-110.727044,217.456176,
+ 0.138731,-0.825677,0.54682,27.648756,-111.630894,216.1976,
+ 0.082156,-0.193174,0.977719,27.789307,-103.393108,219.643244,
+ 0.082156,-0.193174,0.977719,25.472031,-105.822947,219.357882,
+ 0.082156,-0.193174,0.977719,27.112713,-106.72193,219.042401,
+ -0.206832,0.082761,0.97487,26.584883,-102.783746,219.335978,
+ -0.206832,0.082761,0.97487,25.472031,-105.822947,219.357882,
+ -0.206832,0.082761,0.97487,27.789307,-103.393108,219.643244,
+ -0.143984,-0.246855,0.958296,27.112713,-106.72193,219.042401,
+ -0.143984,-0.246855,0.958296,24.779008,-108.060517,218.346944,
+ -0.143984,-0.246855,0.958296,26.054012,-108.508944,218.423001,
+ -0.043255,-0.400188,0.915412,25.472031,-105.822947,219.357882,
+ -0.043255,-0.400188,0.915412,24.779008,-108.060517,218.346944,
+ -0.043255,-0.400188,0.915412,27.112713,-106.72193,219.042401,
+ -0.481507,-0.074073,0.873307,26.054012,-108.508944,218.423001,
+ -0.481507,-0.074073,0.873307,24.305635,-109.736793,217.354869,
+ -0.481507,-0.074073,0.873307,25.478724,-110.20682,217.961796,
+ -0.211004,-0.453036,0.866161,24.779008,-108.060517,218.346944,
+ -0.211004,-0.453036,0.866161,24.305635,-109.736793,217.354869,
+ -0.211004,-0.453036,0.866161,26.054012,-108.508944,218.423001,
+ 0.043614,0.517206,0.854749,29.373099,-101.795626,218.5958,
+ 0.043614,0.517206,0.854749,26.584883,-102.783746,219.335978,
+ 0.043614,0.517206,0.854749,27.789307,-103.393108,219.643244,
+ 0.233539,0.360562,0.903025,29.373099,-101.795626,218.5958,
+ 0.233539,0.360562,0.903025,27.789307,-103.393108,219.643244,
+ 0.233539,0.360562,0.903025,30.241964,-103.062416,218.876903,
+ 0.377518,0.439763,0.814916,31.944707,-100.847359,216.892752,
+ 0.377518,0.439763,0.814916,29.373099,-101.795626,218.5958,
+ 0.377518,0.439763,0.814916,30.241964,-103.062416,218.876903,
+ 0.132409,0.602932,0.786728,31.944707,-100.847359,216.892752,
+ 0.132409,0.602932,0.786728,30.241964,-103.062416,218.876903,
+ 0.132409,0.602932,0.786728,32.17896,-102.901481,218.427564,
+ 0.477046,0.322309,0.817645,33.875923,-102.167084,217.147996,
+ 0.477046,0.322309,0.817645,32.17896,-102.901481,218.427564,
+ 0.477046,0.322309,0.817645,34.443606,-105.094939,217.970923,
+ 0.676288,0.317899,0.664511,35.705833,-104.517217,216.409948,
+ 0.676288,0.317899,0.664511,33.875923,-102.167084,217.147996,
+ 0.676288,0.317899,0.664511,34.443606,-105.094939,217.970923,
+ 0.796794,-0.206768,0.567773,35.705833,-104.517217,216.409948,
+ 0.796794,-0.206768,0.567773,34.443606,-105.094939,217.970923,
+ 0.796794,-0.206768,0.567773,34.31066,-107.409173,217.314711,
+ 0.7073,-0.123461,0.696049,35.674193,-106.686336,216.057352,
+ 0.7073,-0.123461,0.696049,35.705833,-104.517217,216.409948,
+ 0.7073,-0.123461,0.696049,34.31066,-107.409173,217.314711,
+ -0.170765,-0.984705,0.034565,34.5872,-111.749846,214.654878,
+ -0.170765,-0.984705,0.034565,33.978143,-111.595604,216.040011,
+ -0.170765,-0.984705,0.034565,31.885688,-111.239357,215.851392,
+ 0.007446,-0.913581,0.406588,34.5872,-111.749846,214.654878,
+ 0.007446,-0.913581,0.406588,31.885688,-111.239357,215.851392,
+ 0.007446,-0.913581,0.406588,32.690057,-111.804302,214.567261,
+ 0.107397,-0.883496,0.455961,32.690057,-111.804302,214.567261,
+ 0.107397,-0.883496,0.455961,31.885688,-111.239357,215.851392,
+ 0.107397,-0.883496,0.455961,30.260522,-111.491863,215.744914,
+ 0.100288,-0.890781,0.443228,32.690057,-111.804302,214.567261,
+ 0.100288,-0.890781,0.443228,30.260522,-111.491863,215.744914,
+ 0.100288,-0.890781,0.443228,30.516374,-112.012696,214.640275,
+ 0.698984,-0.082975,0.710307,35.674193,-106.686336,216.057352,
+ 0.698984,-0.082975,0.710307,34.31066,-107.409173,217.314711,
+ 0.698984,-0.082975,0.710307,34.519662,-110.588926,216.737598,
+ 0.850057,-0.164251,0.500425,35.414994,-110.064139,215.388971,
+ 0.850057,-0.164251,0.500425,35.674193,-106.686336,216.057352,
+ 0.850057,-0.164251,0.500425,34.519662,-110.588926,216.737598,
+ 0.756792,-0.594855,0.270949,35.414994,-110.064139,215.388971,
+ 0.756792,-0.594855,0.270949,34.519662,-110.588926,216.737598,
+ 0.756792,-0.594855,0.270949,33.978143,-111.595604,216.040011,
+ 0.748576,-0.536982,0.388952,34.5872,-111.749846,214.654878,
+ 0.748576,-0.536982,0.388952,35.414994,-110.064139,215.388971,
+ 0.748576,-0.536982,0.388952,33.978143,-111.595604,216.040011,
+ 0.124573,-0.886016,0.446606,30.516374,-112.012696,214.640275,
+ 0.124573,-0.886016,0.446606,30.260522,-111.491863,215.744914,
+ 0.124573,-0.886016,0.446606,27.648756,-111.630894,216.1976,
+ -0.095164,-0.99312,0.068246,30.516374,-112.012696,214.640275,
+ -0.095164,-0.99312,0.068246,27.648756,-111.630894,216.1976,
+ -0.095164,-0.99312,0.068246,28.107222,-111.770533,214.804861,
+ -0.152082,-0.987157,0.048912,28.107222,-111.770533,214.804861,
+ -0.152082,-0.987157,0.048912,27.648756,-111.630894,216.1976,
+ -0.152082,-0.987157,0.048912,25.171153,-111.226884,216.647852,
+ -0.291533,-0.937952,-0.187762,28.107222,-111.770533,214.804861,
+ -0.291533,-0.937952,-0.187762,25.171153,-111.226884,216.647852,
+ -0.291533,-0.937952,-0.187762,25.51736,-111.030964,215.131598,
+ -0.883907,-0.393529,-0.252672,25.51736,-111.030964,215.131598,
+ -0.883907,-0.393529,-0.252672,25.171153,-111.226884,216.647852,
+ -0.883907,-0.393529,-0.252672,24.305635,-109.736793,217.354869,
+ -0.858162,-0.476877,-0.190124,25.51736,-111.030964,215.131598,
+ -0.858162,-0.476877,-0.190124,24.305635,-109.736793,217.354869,
+ -0.858162,-0.476877,-0.190124,24.267911,-108.807388,215.193964,
+ -0.971611,0.210706,0.107586,24.267911,-108.807388,215.193964,
+ -0.971611,0.210706,0.107586,24.305635,-109.736793,217.354869,
+ -0.971611,0.210706,0.107586,24.779008,-108.060517,218.346944,
+ -0.979515,0.161282,0.120575,24.267911,-108.807388,215.193964,
+ -0.979515,0.161282,0.120575,24.779008,-108.060517,218.346944,
+ -0.979515,0.161282,0.120575,24.728506,-106.391238,215.703844,
+ -0.961015,0.225116,0.160537,24.728506,-106.391238,215.703844,
+ -0.961015,0.225116,0.160537,24.779008,-108.060517,218.346944,
+ -0.961015,0.225116,0.160537,25.472031,-105.822947,219.357882,
+ -0.94235,0.301663,0.144834,24.728506,-106.391238,215.703844,
+ -0.94235,0.301663,0.144834,25.472031,-105.822947,219.357882,
+ -0.94235,0.301663,0.144834,25.604368,-103.970526,216.360664,
+ -0.925084,0.339955,0.169262,25.604368,-103.970526,216.360664,
+ -0.925084,0.339955,0.169262,25.472031,-105.822947,219.357882,
+ -0.925084,0.339955,0.169262,26.584883,-102.783746,219.335978,
+ -0.82673,0.56047,0.048892,25.604368,-103.970526,216.360664,
+ -0.82673,0.56047,0.048892,26.584883,-102.783746,219.335978,
+ -0.82673,0.56047,0.048892,26.873592,-102.146397,216.911614,
+ -0.275461,0.937281,0.213602,29.373099,-101.795626,218.5958,
+ -0.275461,0.937281,0.213602,26.873592,-102.146397,216.911614,
+ -0.275461,0.937281,0.213602,26.584883,-102.783746,219.335978,
+ -0.325082,0.898383,0.295347,30.004365,-101.075527,217.100233,
+ -0.325082,0.898383,0.295347,26.873592,-102.146397,216.911614,
+ -0.325082,0.898383,0.295347,29.373099,-101.795626,218.5958,
+ -0.062954,0.909339,0.411265,31.944707,-100.847359,216.892752,
+ -0.062954,0.909339,0.411265,30.004365,-101.075527,217.100233,
+ -0.062954,0.909339,0.411265,29.373099,-101.795626,218.5958,
+ -0.108018,0.990958,0.079588,32.250149,-100.742401,216.000462,
+ -0.108018,0.990958,0.079588,30.004365,-101.075527,217.100233,
+ -0.108018,0.990958,0.079588,31.944707,-100.847359,216.892752,
+ 0.871549,0.353365,0.339906,32.250149,-100.742401,216.000462,
+ 0.871549,0.353365,0.339906,31.944707,-100.847359,216.892752,
+ 0.871549,0.353365,0.339906,32.17896,-102.901481,218.427564,
+ 0.178294,0.732582,0.656913,33.875923,-102.167084,217.147996,
+ 0.178294,0.732582,0.656913,32.250149,-100.742401,216.000462,
+ 0.178294,0.732582,0.656913,32.17896,-102.901481,218.427564,
+ 0.79944,0.539458,0.264351,34.276283,-101.687018,214.957581,
+ 0.79944,0.539458,0.264351,33.875923,-102.167084,217.147996,
+ 0.79944,0.539458,0.264351,35.705833,-104.517217,216.409948,
+ 0.72831,0.566056,0.386193,34.276283,-101.687018,214.957581,
+ 0.72831,0.566056,0.386193,35.705833,-104.517217,216.409948,
+ 0.72831,0.566056,0.386193,35.874069,-103.989996,215.319912,
+ 0.271537,0.63178,-0.726032,27.684654,-100.920068,206.10009,
+ 0.271537,0.63178,-0.726032,31.643525,-101.85069,206.770905,
+ 0.271537,0.63178,-0.726032,26.971248,-101.482579,205.343788,
+ -0.015992,0.809457,-0.586961,27.684654,-100.920068,206.10009,
+ -0.015992,0.809457,-0.586961,26.971248,-101.482579,205.343788,
+ -0.015992,0.809457,-0.586961,25.838317,-101.086479,205.920902,
+ 0.101482,0.799822,-0.591596,32.391613,-101.298219,207.646158,
+ 0.101482,0.799822,-0.591596,32.071873,-102.240098,206.317915,
+ 0.101482,0.799822,-0.591596,31.643525,-101.85069,206.770905,
+ 0.563492,0.60381,-0.563817,32.985155,-102.164042,207.31212,
+ 0.563492,0.60381,-0.563817,32.071873,-102.240098,206.317915,
+ 0.563492,0.60381,-0.563817,32.391613,-101.298219,207.646158,
+ 0.617549,0.501794,-0.60567,33.274472,-103.07641,206.85122,
+ 0.617549,0.501794,-0.60567,32.071873,-102.240098,206.317915,
+ 0.617549,0.501794,-0.60567,32.985155,-102.164042,207.31212,
+ 0.617529,0.501707,-0.605762,32.071873,-102.240098,206.317915,
+ 0.617529,0.501707,-0.605762,33.274472,-103.07641,206.85122,
+ 0.617529,0.501707,-0.605762,32.32012,-103.023171,205.922423,
+ 0.121309,-0.52858,-0.840171,31.823322,-105.902046,205.264082,
+ 0.121309,-0.52858,-0.840171,31.11813,-106.366596,205.454526,
+ 0.121309,-0.52858,-0.840171,30.329581,-106.145729,205.201716,
+ 0.123348,-0.543626,-0.830214,31.41049,-105.424718,204.89019,
+ 0.123348,-0.543626,-0.830214,31.823322,-105.902046,205.264082,
+ 0.123348,-0.543626,-0.830214,30.329581,-106.145729,205.201716,
+ 0.098224,-0.577219,-0.81066,30.329581,-106.145729,205.201716,
+ 0.098224,-0.577219,-0.81066,31.11813,-106.366596,205.454526,
+ 0.098224,-0.577219,-0.81066,30.313152,-106.748398,205.628847,
+ 0.673454,0.21526,-0.707194,33.274472,-103.07641,206.85122,
+ 0.673454,0.21526,-0.707194,32.911532,-104.832393,205.971099,
+ 0.673454,0.21526,-0.707194,31.962352,-104.718309,205.10193,
+ 0.68993,0.192188,-0.697897,32.32012,-103.023171,205.922423,
+ 0.68993,0.192188,-0.697897,33.274472,-103.07641,206.85122,
+ 0.68993,0.192188,-0.697897,31.962352,-104.718309,205.10193,
+ -0.007788,0.992362,0.123114,32.834259,-100.809635,214.274598,
+ -0.007788,0.992362,0.123114,32.343546,-100.553478,212.178796,
+ -0.007788,0.992362,0.123114,30.419022,-100.534312,211.902561,
+ 0.471448,0.88189,-0.002598,34.11839,-101.49779,213.706307,
+ 0.471448,0.88189,-0.002598,32.343546,-100.553478,212.178796,
+ 0.471448,0.88189,-0.002598,32.834259,-100.809635,214.274598,
+ 0.490583,0.870818,-0.031676,34.11839,-101.49779,213.706307,
+ 0.490583,0.870818,-0.031676,33.687913,-101.337464,211.446833,
+ 0.490583,0.870818,-0.031676,32.343546,-100.553478,212.178796,
+ 0.902988,0.133073,-0.408539,33.820555,-103.166765,209.112824,
+ 0.902988,0.133073,-0.408539,34.486806,-103.825715,210.370791,
+ 0.902988,0.133073,-0.408539,34.298491,-105.486171,209.413701,
+ 0.832795,0.100999,-0.54429,33.408939,-105.155175,208.114055,
+ 0.832795,0.100999,-0.54429,33.820555,-103.166765,209.112824,
+ 0.832795,0.100999,-0.54429,34.298491,-105.486171,209.413701,
+ 0.734311,-0.33799,-0.588684,33.408939,-105.155175,208.114055,
+ 0.734311,-0.33799,-0.588684,34.298491,-105.486171,209.413701,
+ 0.734311,-0.33799,-0.588684,33.497773,-106.696984,209.110086,
+ 0.613126,-0.403445,-0.679197,33.408939,-105.155175,208.114055,
+ 0.613126,-0.403445,-0.679197,33.497773,-106.696984,209.110086,
+ 0.613126,-0.403445,-0.679197,32.276008,-106.497413,207.888625,
+ 0.115944,-0.763285,-0.635573,30.738762,-108.682352,209.820449,
+ 0.115944,-0.763285,-0.635573,29.193607,-108.660448,209.51227,
+ 0.115944,-0.763285,-0.635573,30.512724,-107.499223,208.358347,
+ 0.198657,-0.795094,-0.573028,30.512724,-107.499223,208.358347,
+ 0.198657,-0.795094,-0.573028,29.193607,-108.660448,209.51227,
+ 0.198657,-0.795094,-0.573028,29.039061,-107.764811,208.21597,
+ -0.071988,-0.824586,-0.561138,29.193607,-108.660448,209.51227,
+ -0.071988,-0.824586,-0.561138,26.513086,-107.831436,208.637929,
+ -0.071988,-0.824586,-0.561138,29.039061,-107.764811,208.21597,
+ -0.05937,-0.868284,-0.492502,29.039061,-107.764811,208.21597,
+ -0.05937,-0.868284,-0.492502,26.513086,-107.831436,208.637929,
+ -0.05937,-0.868284,-0.492502,26.465323,-107.00851,207.192864,
+ -0.661162,-0.66113,-0.354643,26.465323,-107.00851,207.192864,
+ -0.661162,-0.66113,-0.354643,26.513086,-107.831436,208.637929,
+ -0.661162,-0.66113,-0.354643,24.836506,-105.936423,208.230877,
+ -0.657455,-0.675362,-0.334126,26.465323,-107.00851,207.192864,
+ -0.657455,-0.675362,-0.334126,24.836506,-105.936423,208.230877,
+ -0.657455,-0.675362,-0.334126,24.781137,-105.134184,206.718274,
+ -0.999472,-0.018119,0.026976,24.781137,-105.134184,206.718274,
+ -0.999472,-0.018119,0.026976,24.836506,-105.936423,208.230877,
+ -0.999472,-0.018119,0.026976,24.81156,-103.496848,208.945196,
+ -0.999153,-0.025434,0.03235,24.781137,-105.134184,206.718274,
+ -0.999153,-0.025434,0.03235,24.81156,-103.496848,208.945196,
+ -0.999153,-0.025434,0.03235,24.745847,-102.909695,207.377224,
+ -0.09575,0.520629,0.848397,2.177574,-144.38338,206.006997,
+ -0.09575,0.520629,0.848397,2.127377,-146.10742,207.059309,
+ -0.09575,0.520629,0.848397,3.025143,-144.431752,206.132338,
+ 0.033761,0.469878,0.882086,3.025143,-144.431752,206.132338,
+ 0.033761,0.469878,0.882086,2.127377,-146.10742,207.059309,
+ 0.033761,0.469878,0.882086,3.444669,-146.300298,207.111636,
+ -0.333457,0.549082,0.766365,1.541441,-144.26017,205.641928,
+ -0.333457,0.549082,0.766365,1.459909,-145.951657,206.818364,
+ -0.333457,0.549082,0.766365,2.177574,-144.38338,206.006997,
+ -0.181686,0.516171,0.836993,2.177574,-144.38338,206.006997,
+ -0.181686,0.516171,0.836993,1.459909,-145.951657,206.818364,
+ -0.181686,0.516171,0.836993,2.127377,-146.10742,207.059309,
+ 0.063872,0.643221,0.763012,2.127377,-146.10742,207.059309,
+ 0.063872,0.643221,0.763012,2.273405,-147.775482,208.453265,
+ 0.063872,0.643221,0.763012,3.444669,-146.300298,207.111636,
+ -0.088516,0.707735,0.700911,3.768972,-147.999695,208.868531,
+ -0.088516,0.707735,0.700911,3.444669,-146.300298,207.111636,
+ -0.088516,0.707735,0.700911,2.273405,-147.775482,208.453265,
+ -0.097981,0.689788,0.717351,1.459909,-145.951657,206.818364,
+ -0.097981,0.689788,0.717351,1.372597,-147.525713,208.320015,
+ -0.097981,0.689788,0.717351,2.127377,-146.10742,207.059309,
+ 0.065507,0.643237,0.76286,2.127377,-146.10742,207.059309,
+ 0.065507,0.643237,0.76286,1.372597,-147.525713,208.320015,
+ 0.065507,0.643237,0.76286,2.273405,-147.775482,208.453265,
+ -0.026291,0.836984,0.546595,3.768972,-147.999695,208.868531,
+ -0.026291,0.836984,0.546595,2.273405,-147.775482,208.453265,
+ -0.026291,0.836984,0.546595,2.39114,-148.927275,210.222634,
+ -0.173739,0.885915,0.430081,3.768972,-147.999695,208.868531,
+ -0.173739,0.885915,0.430081,2.39114,-148.927275,210.222634,
+ -0.173739,0.885915,0.430081,3.37926,-148.952221,210.67319,
+ 0.13829,0.805884,0.575697,2.273405,-147.775482,208.453265,
+ 0.13829,0.805884,0.575697,1.372597,-147.525713,208.320015,
+ 0.13829,0.805884,0.575697,1.270986,-148.72314,210.020629,
+ 0.055032,0.838475,0.542154,2.39114,-148.927275,210.222634,
+ 0.055032,0.838475,0.542154,2.273405,-147.775482,208.453265,
+ 0.055032,0.838475,0.542154,1.270986,-148.72314,210.020629,
+ -0.997848,-0.028645,-0.058974,0.793962,-145.56012,200.102612,
+ -0.997848,-0.028645,-0.058974,0.707562,-146.771237,202.152779,
+ -0.997848,-0.028645,-0.058974,0.7319,-143.817219,200.306138,
+ -0.99986,-0.002122,-0.016573,0.7319,-143.817219,200.306138,
+ -0.99986,-0.002122,-0.016573,0.707562,-146.771237,202.152779,
+ -0.99986,-0.002122,-0.016573,0.699348,-144.982398,202.41928,
+ -0.940648,0.303118,0.152648,1.223831,-142.2027,200.131513,
+ -0.940648,0.303118,0.152648,0.7319,-143.817219,200.306138,
+ -0.940648,0.303118,0.152648,0.699348,-144.982398,202.41928,
+ -0.987015,0.156516,-0.036108,1.223831,-142.2027,200.131513,
+ -0.987015,0.156516,-0.036108,0.699348,-144.982398,202.41928,
+ -0.987015,0.156516,-0.036108,0.956114,-143.412601,202.205106,
+ -0.20047,0.857236,0.474298,2.284966,-141.746668,199.755796,
+ -0.20047,0.857236,0.474298,1.223831,-142.2027,200.131513,
+ -0.20047,0.857236,0.474298,0.956114,-143.412601,202.205106,
+ -0.861924,0.488665,-0.135257,2.284966,-141.746668,199.755796,
+ -0.861924,0.488665,-0.135257,0.956114,-143.412601,202.205106,
+ -0.861924,0.488665,-0.135257,1.649137,-142.122689,202.449094,
+ 0.603037,0.784956,-0.142092,4.206751,-142.813583,202.179855,
+ 0.603037,0.784956,-0.142092,3.431283,-142.657516,199.750928,
+ 0.603037,0.784956,-0.142092,3.309289,-142.183534,201.851597,
+ 0.002495,0.99799,0.063328,4.219528,-142.668772,199.89726,
+ 0.002495,0.99799,0.063328,3.431283,-142.657516,199.750928,
+ 0.002495,0.99799,0.063328,4.206751,-142.813583,202.179855,
+ 0.99611,0.086948,-0.014316,4.734884,-143.508127,199.945328,
+ 0.99611,0.086948,-0.014316,4.826151,-144.192328,202.140306,
+ 0.99611,0.086948,-0.014316,4.981306,-146.005504,201.923699,
+ 0.993424,0.007523,-0.114242,4.734884,-143.508127,199.945328,
+ 0.993424,0.007523,-0.114242,4.981306,-146.005504,201.923699,
+ 0.993424,0.007523,-0.114242,4.761656,-144.890522,200.087096,
+ 0.75122,-0.503734,-0.426522,3.293773,-148.445079,199.724765,
+ 0.75122,-0.503734,-0.426522,4.431268,-147.017659,200.042375,
+ 0.75122,-0.503734,-0.426522,4.476902,-148.595366,201.986065,
+ 0.587169,-0.727202,-0.355541,4.476902,-148.595366,201.986065,
+ 0.587169,-0.727202,-0.355541,3.114281,-149.60174,201.794099,
+ 0.587169,-0.727202,-0.355541,3.293773,-148.445079,199.724765,
+ -0.056381,-0.869416,-0.490853,3.293773,-148.445079,199.724765,
+ -0.056381,-0.869416,-0.490853,3.114281,-149.60174,201.794099,
+ -0.056381,-0.869416,-0.490853,2.0282,-148.225429,199.481081,
+ -0.133838,-0.877991,-0.459586,3.114281,-149.60174,201.794099,
+ -0.133838,-0.877991,-0.459586,2.19096,-149.322767,201.530032,
+ -0.133838,-0.877991,-0.459586,2.0282,-148.225429,199.481081,
+ -0.654627,-0.686815,-0.31583,2.19096,-149.322767,201.530032,
+ -0.654627,-0.686815,-0.31583,1.354039,-147.557961,199.42693,
+ -0.654627,-0.686815,-0.31583,2.0282,-148.225429,199.481081,
+ -0.640059,-0.694686,-0.328233,2.19096,-149.322767,201.530032,
+ -0.640059,-0.694686,-0.328233,1.169679,-148.436561,201.645942,
+ -0.640059,-0.694686,-0.328233,1.354039,-147.557961,199.42693,
+ -0.962794,-0.214177,-0.164792,1.354039,-147.557961,199.42693,
+ -0.962794,-0.214177,-0.164792,1.169679,-148.436561,201.645942,
+ -0.962794,-0.214177,-0.164792,0.793962,-145.56012,200.102612,
+ -0.961879,-0.215783,-0.168008,0.793962,-145.56012,200.102612,
+ -0.961879,-0.215783,-0.168008,1.169679,-148.436561,201.645942,
+ -0.961879,-0.215783,-0.168008,0.707562,-146.771237,202.152779,
+ -0.998286,0.004113,-0.05838,0.707562,-146.771237,202.152779,
+ -0.998286,0.004113,-0.05838,0.619337,-147.556744,203.606059,
+ -0.998286,0.004113,-0.05838,0.699348,-144.982398,202.41928,
+ -0.987557,-0.039482,-0.152223,0.699348,-144.982398,202.41928,
+ -0.987557,-0.039482,-0.152223,0.619337,-147.556744,203.606059,
+ -0.987557,-0.039482,-0.152223,0.569445,-146.112896,203.555254,
+ -0.984158,0.168498,0.055143,0.956114,-143.412601,202.205106,
+ -0.984158,0.168498,0.055143,0.699348,-144.982398,202.41928,
+ -0.984158,0.168498,0.055143,0.569445,-146.112896,203.555254,
+ -0.99186,0.109735,-0.064589,0.956114,-143.412601,202.205106,
+ -0.99186,0.109735,-0.064589,0.569445,-146.112896,203.555254,
+ -0.99186,0.109735,-0.064589,0.733421,-144.529408,203.727445,
+ -0.879264,0.436198,0.191379,0.956114,-143.412601,202.205106,
+ -0.879264,0.436198,0.191379,0.733421,-144.529408,203.727445,
+ -0.879264,0.436198,0.191379,1.649137,-142.122689,202.449094,
+ -0.919256,0.387273,0.070623,1.649137,-142.122689,202.449094,
+ -0.919256,0.387273,0.070623,0.733421,-144.529408,203.727445,
+ -0.919256,0.387273,0.070623,1.500067,-142.690068,203.620053,
+ 0.544624,0.791335,0.277799,3.966413,-143.546459,204.445718,
+ 0.544624,0.791335,0.277799,3.309289,-142.183534,201.851597,
+ 0.544624,0.791335,0.277799,2.907713,-142.788028,204.36084,
+ 0.464661,0.826901,0.316741,4.206751,-142.813583,202.179855,
+ 0.464661,0.826901,0.316741,3.309289,-142.183534,201.851597,
+ 0.464661,0.826901,0.316741,3.966413,-143.546459,204.445718,
+ 0.979088,0.100548,-0.176851,4.826151,-144.192328,202.140306,
+ 0.979088,0.100548,-0.176851,5.270623,-145.485889,203.865562,
+ 0.979088,0.100548,-0.176851,5.39931,-147.433533,203.470679,
+ 0.980144,0.104037,-0.168804,4.981306,-146.005504,201.923699,
+ 0.980144,0.104037,-0.168804,4.826151,-144.192328,202.140306,
+ 0.980144,0.104037,-0.168804,5.39931,-147.433533,203.470679,
+ 0.600947,-0.783986,-0.155656,4.476902,-148.595366,201.986065,
+ 0.600947,-0.783986,-0.155656,4.096317,-149.232716,203.726836,
+ 0.600947,-0.783986,-0.155656,3.114281,-149.60174,201.794099,
+ 0.453893,-0.888973,-0.060891,4.096317,-149.232716,203.726836,
+ 0.453893,-0.888973,-0.060891,2.5539,-149.984759,203.208742,
+ 0.453893,-0.888973,-0.060891,3.114281,-149.60174,201.794099,
+ -0.187103,-0.926985,-0.325101,3.114281,-149.60174,201.794099,
+ -0.187103,-0.926985,-0.325101,2.5539,-149.984759,203.208742,
+ -0.187103,-0.926985,-0.325101,2.19096,-149.322767,201.530032,
+ -0.25107,-0.91778,-0.307641,2.5539,-149.984759,203.208742,
+ -0.25107,-0.91778,-0.307641,1.654613,-149.683272,203.043244,
+ -0.25107,-0.91778,-0.307641,2.19096,-149.322767,201.530032,
+ -0.629611,-0.675345,-0.384055,2.19096,-149.322767,201.530032,
+ -0.629611,-0.675345,-0.384055,1.654613,-149.683272,203.043244,
+ -0.629611,-0.675345,-0.384055,1.169679,-148.436561,201.645942,
+ -0.783698,-0.573153,-0.239401,1.169679,-148.436561,201.645942,
+ -0.783698,-0.573153,-0.239401,1.654613,-149.683272,203.043244,
+ -0.783698,-0.573153,-0.239401,0.91839,-148.72527,203.159762,
+ -0.95834,-0.205584,-0.19829,1.169679,-148.436561,201.645942,
+ -0.95834,-0.205584,-0.19829,0.91839,-148.72527,203.159762,
+ -0.95834,-0.205584,-0.19829,0.707562,-146.771237,202.152779,
+ -0.969261,-0.186983,-0.159907,0.707562,-146.771237,202.152779,
+ -0.969261,-0.186983,-0.159907,0.91839,-148.72527,203.159762,
+ -0.969261,-0.186983,-0.159907,0.619337,-147.556744,203.606059,
+ -0.998321,-0.036091,-0.045295,0.569445,-146.112896,203.555254,
+ -0.998321,-0.036091,-0.045295,0.619337,-147.556744,203.606059,
+ -0.998321,-0.036091,-0.045295,0.591349,-148.710667,205.142392,
+ -0.88288,-0.250227,-0.397377,0.569445,-146.112896,203.555254,
+ -0.88288,-0.250227,-0.397377,0.591349,-148.710667,205.142392,
+ -0.88288,-0.250227,-0.397377,0.020624,-146.991191,205.327665,
+ -0.963572,0.125466,-0.236193,0.569445,-146.112896,203.555254,
+ -0.963572,0.125466,-0.236193,0.020624,-146.991191,205.327665,
+ -0.963572,0.125466,-0.236193,0.733421,-144.529408,203.727445,
+ -0.92972,0.347831,0.120973,0.733421,-144.529408,203.727445,
+ -0.92972,0.347831,0.120973,0.020624,-146.991191,205.327665,
+ -0.92972,0.347831,0.120973,0.624509,-145.321304,205.167338,
+ -0.910327,0.387863,0.144456,1.500067,-142.690068,203.620053,
+ -0.910327,0.387863,0.144456,0.733421,-144.529408,203.727445,
+ -0.910327,0.387863,0.144456,0.624509,-145.321304,205.167338,
+ -0.774733,0.491616,0.397621,1.500067,-142.690068,203.620053,
+ -0.774733,0.491616,0.397621,0.624509,-145.321304,205.167338,
+ -0.774733,0.491616,0.397621,1.541441,-144.26017,205.641928,
+ 0.446702,0.670418,0.592451,4.340913,-145.215434,206.027076,
+ 0.446702,0.670418,0.592451,2.907713,-142.788028,204.36084,
+ 0.446702,0.670418,0.592451,3.025143,-144.431752,206.132338,
+ 0.431254,0.669658,0.60463,4.340913,-145.215434,206.027076,
+ 0.431254,0.669658,0.60463,3.966413,-143.546459,204.445718,
+ 0.431254,0.669658,0.60463,2.907713,-142.788028,204.36084,
+ -0.061668,-0.154097,-0.986129,3.21072,-142.472243,197.538913,
+ -0.061668,-0.154097,-0.986129,3.923822,-142.903633,197.56173,
+ -0.061668,-0.154097,-0.986129,1.99504,-142.746958,197.657865,
+ -0.053148,-0.042104,-0.997699,1.99504,-142.746958,197.657865,
+ -0.053148,-0.042104,-0.997699,3.923822,-142.903633,197.56173,
+ -0.053148,-0.042104,-0.997699,1.916854,-142.994292,197.672468,
+ -0.051197,-0.082351,-0.995288,3.923822,-142.903633,197.56173,
+ -0.051197,-0.082351,-0.995288,3.838335,-143.821174,197.642045,
+ -0.051197,-0.082351,-0.995288,1.916854,-142.994292,197.672468,
+ 0.012484,0.06572,-0.99776,1.916854,-142.994292,197.672468,
+ 0.012484,0.06572,-0.99776,3.838335,-143.821174,197.642045,
+ 0.012484,0.06572,-0.99776,1.942713,-143.807484,197.619229,
+ 0.144943,0.26149,-0.954261,1.980437,-144.325578,197.539218,
+ 0.144943,0.26149,-0.954261,3.598302,-145.313394,197.514271,
+ 0.144943,0.26149,-0.954261,2.359805,-145.53061,197.266633,
+ 0.137019,0.248627,-0.958859,1.980437,-144.325578,197.539218,
+ 0.137019,0.248627,-0.958859,3.749501,-144.536709,197.737268,
+ 0.137019,0.248627,-0.958859,3.598302,-145.313394,197.514271,
+ 0.199998,-0.02363,-0.979511,3.598302,-145.313394,197.514271,
+ 0.199998,-0.02363,-0.979511,2.595274,-145.656255,197.317742,
+ 0.199998,-0.02363,-0.979511,2.359805,-145.53061,197.266633,
+ 0.144007,0.140217,-0.979592,3.598302,-145.313394,197.514271,
+ 0.144007,0.140217,-0.979592,3.092985,-145.738091,197.379196,
+ 0.144007,0.140217,-0.979592,2.595274,-145.656255,197.317742,
+ -0.700496,0.02442,-0.713239,1.916854,-142.994292,197.672468,
+ -0.700496,0.02442,-0.713239,1.942713,-143.807484,197.619229,
+ -0.700496,0.02442,-0.713239,1.360124,-143.13028,198.214596,
+ -0.669723,0.07351,-0.738964,1.360124,-143.13028,198.214596,
+ -0.669723,0.07351,-0.738964,1.942713,-143.807484,197.619229,
+ -0.669723,0.07351,-0.738964,1.414275,-144.42293,198.036929,
+ -0.543443,0.271315,-0.794392,1.718196,-141.926161,198.127587,
+ -0.543443,0.271315,-0.794392,2.215602,-142.265979,197.671251,
+ -0.543443,0.271315,-0.794392,1.99504,-142.746958,197.657865,
+ -0.703464,0.159138,-0.692686,1.99504,-142.746958,197.657865,
+ -0.703464,0.159138,-0.692686,1.360124,-143.13028,198.214596,
+ -0.703464,0.159138,-0.692686,1.718196,-141.926161,198.127587,
+ -0.679273,0.634042,-0.369566,2.215602,-142.265979,197.671251,
+ -0.679273,0.634042,-0.369566,2.484537,-141.633497,198.262055,
+ -0.679273,0.634042,-0.369566,2.490013,-141.935287,197.734225,
+ -0.149343,0.708132,-0.690106,2.484537,-141.633497,198.262055,
+ -0.149343,0.708132,-0.690106,2.215602,-142.265979,197.671251,
+ -0.149343,0.708132,-0.690106,1.718196,-141.926161,198.127587,
+ 0.340187,0.823948,-0.453191,4.128869,-142.463116,198.244714,
+ 0.340187,0.823948,-0.453191,3.21072,-142.472243,197.538913,
+ 0.340187,0.823948,-0.453191,3.169346,-142.117822,198.15223,
+ 0.564583,-0.124029,-0.816004,3.923822,-142.903633,197.56173,
+ 0.564583,-0.124029,-0.816004,4.497893,-142.950484,197.966044,
+ 0.564583,-0.124029,-0.816004,3.838335,-143.821174,197.642045,
+ 0.608628,-0.172878,-0.774393,4.497893,-142.950484,197.966044,
+ 0.608628,-0.172878,-0.774393,4.392023,-143.962334,198.108726,
+ 0.608628,-0.172878,-0.774393,3.838335,-143.821174,197.642045,
+ 0.448818,-0.262319,-0.854255,3.598302,-145.313394,197.514271,
+ 0.448818,-0.262319,-0.854255,3.280083,-146.55037,197.726924,
+ 0.448818,-0.262319,-0.854255,3.092985,-145.738091,197.379196,
+ 0.577322,-0.280356,-0.766877,3.598302,-145.313394,197.514271,
+ 0.577322,-0.280356,-0.766877,4.128261,-145.504447,197.983081,
+ 0.577322,-0.280356,-0.766877,3.280083,-146.55037,197.726924,
+ 0.06448,-0.318118,-0.945856,2.595274,-145.656255,197.317742,
+ 0.06448,-0.318118,-0.945856,3.092985,-145.738091,197.379196,
+ 0.06448,-0.318118,-0.945856,2.34003,-146.387306,197.546215,
+ 0.113369,-0.368825,-0.922559,3.092985,-145.738091,197.379196,
+ 0.113369,-0.368825,-0.922559,3.280083,-146.55037,197.726924,
+ 0.113369,-0.368825,-0.922559,2.34003,-146.387306,197.546215,
+ -0.076177,-0.494878,-0.865617,2.359805,-145.53061,197.266633,
+ -0.076177,-0.494878,-0.865617,2.595274,-145.656255,197.317742,
+ -0.076177,-0.494878,-0.865617,1.832584,-145.914541,197.532525,
+ -0.190175,-0.231752,-0.954004,2.595274,-145.656255,197.317742,
+ -0.190175,-0.231752,-0.954004,2.34003,-146.387306,197.546215,
+ -0.190175,-0.231752,-0.954004,1.832584,-145.914541,197.532525,
+ -0.523945,0.137325,-0.840609,1.414275,-144.42293,198.036929,
+ -0.523945,0.137325,-0.840609,2.359805,-145.53061,197.266633,
+ -0.523945,0.137325,-0.840609,1.832584,-145.914541,197.532525,
+ -0.656302,-0.036141,-0.753632,1.980437,-144.325578,197.539218,
+ -0.656302,-0.036141,-0.753632,2.359805,-145.53061,197.266633,
+ -0.656302,-0.036141,-0.753632,1.414275,-144.42293,198.036929,
+ 0.607141,-0.178419,-0.774304,3.838335,-143.821174,197.642045,
+ 0.607141,-0.178419,-0.774304,4.392023,-143.962334,198.108726,
+ 0.607141,-0.178419,-0.774304,3.749501,-144.536709,197.737268,
+ 0.578186,-0.125393,-0.806212,4.392023,-143.962334,198.108726,
+ 0.578186,-0.125393,-0.806212,4.263336,-144.845193,198.153751,
+ 0.578186,-0.125393,-0.806212,3.749501,-144.536709,197.737268,
+ 0.672355,0.053374,-0.738302,4.263336,-144.845193,198.153751,
+ 0.672355,0.053374,-0.738302,4.128261,-145.504447,197.983081,
+ 0.672355,0.053374,-0.738302,3.598302,-145.313394,197.514271,
+ 0.658169,0.086597,-0.747873,3.749501,-144.536709,197.737268,
+ 0.658169,0.086597,-0.747873,4.263336,-144.845193,198.153751,
+ 0.658169,0.086597,-0.747873,3.598302,-145.313394,197.514271,
+ 0.436341,0.690792,-0.576553,4.128869,-142.463116,198.244714,
+ 0.436341,0.690792,-0.576553,3.923822,-142.903633,197.56173,
+ 0.436341,0.690792,-0.576553,3.21072,-142.472243,197.538913,
+ 0.459981,0.676879,-0.574676,4.497893,-142.950484,197.966044,
+ 0.459981,0.676879,-0.574676,3.923822,-142.903633,197.56173,
+ 0.459981,0.676879,-0.574676,4.128869,-142.463116,198.244714,
+ 0.472918,0.767011,-0.433638,3.169346,-142.117822,198.15223,
+ 0.472918,0.767011,-0.433638,2.490013,-141.935287,197.734225,
+ 0.472918,0.767011,-0.433638,2.484537,-141.633497,198.262055,
+ 0.466894,0.778944,-0.418637,3.21072,-142.472243,197.538913,
+ 0.466894,0.778944,-0.418637,2.490013,-141.935287,197.734225,
+ 0.466894,0.778944,-0.418637,3.169346,-142.117822,198.15223,
+ -0.665205,0.066417,-0.743701,1.942713,-143.807484,197.619229,
+ -0.665205,0.066417,-0.743701,1.980437,-144.325578,197.539218,
+ -0.665205,0.066417,-0.743701,1.414275,-144.42293,198.036929,
+ -0.708441,0.183715,-0.68144,1.99504,-142.746958,197.657865,
+ -0.708441,0.183715,-0.68144,1.916854,-142.994292,197.672468,
+ -0.708441,0.183715,-0.68144,1.360124,-143.13028,198.214596,
+ -0.85249,0.345917,0.391921,0.624509,-145.321304,205.167338,
+ -0.85249,0.345917,0.391921,0.020624,-146.991191,205.327665,
+ -0.85249,0.345917,0.391921,0.020624,-148.538476,206.693328,
+ -0.892119,-0.045743,-0.449479,0.624509,-145.321304,205.167338,
+ -0.892119,-0.045743,-0.449479,0.020624,-148.538476,206.693328,
+ -0.892119,-0.045743,-0.449479,0.020624,-146.852465,206.521745,
+ -0.784865,0.554404,0.27681,0.624509,-145.321304,205.167338,
+ -0.784865,0.554404,0.27681,0.020624,-146.852465,206.521745,
+ -0.784865,0.554404,0.27681,1.541441,-144.26017,205.641928,
+ -0.471607,0.518705,0.713114,1.541441,-144.26017,205.641928,
+ -0.471607,0.518705,0.713114,0.020624,-146.852465,206.521745,
+ -0.471607,0.518705,0.713114,1.459909,-145.951657,206.818364,
+ -0.16267,0.429125,0.888477,3.025143,-144.431752,206.132338,
+ -0.16267,0.429125,0.888477,3.444669,-146.300298,207.111636,
+ -0.16267,0.429125,0.888477,4.702028,-146.554325,207.464536,
+ 0.462331,0.703787,0.539382,4.702028,-146.554325,207.464536,
+ 0.462331,0.703787,0.539382,4.340913,-145.215434,206.027076,
+ 0.462331,0.703787,0.539382,3.025143,-144.431752,206.132338,
+ 0.785525,-0.282217,-0.550731,5.632042,-146.425638,205.694255,
+ 0.785525,-0.282217,-0.550731,6.127623,-147.623978,207.015197,
+ 0.785525,-0.282217,-0.550731,5.76012,-149.054745,207.224199,
+ 0.989653,-0.033041,-0.139627,5.540166,-147.984484,205.411935,
+ 0.989653,-0.033041,-0.139627,5.632042,-146.425638,205.694255,
+ 0.989653,-0.033041,-0.139627,5.76012,-149.054745,207.224199,
+ 0.240333,-0.943556,-0.227906,3.704172,-149.695137,205.175248,
+ 0.240333,-0.943556,-0.227906,3.388083,-150.161209,206.771513,
+ 0.240333,-0.943556,-0.227906,1.928719,-150.08211,204.905097,
+ 0.118633,-0.983793,-0.134453,3.388083,-150.161209,206.771513,
+ 0.118633,-0.983793,-0.134453,1.876696,-150.30176,206.466376,
+ 0.118633,-0.983793,-0.134453,1.928719,-150.08211,204.905097,
+ -0.178066,-0.973587,-0.142903,1.928719,-150.08211,204.905097,
+ -0.178066,-0.973587,-0.142903,1.876696,-150.30176,206.466376,
+ -0.178066,-0.973587,-0.142903,1.204361,-149.953424,204.930956,
+ -0.050644,-0.978523,-0.199819,1.876696,-150.30176,206.466376,
+ -0.050644,-0.978523,-0.199819,1.242693,-150.269817,206.470635,
+ -0.050644,-0.978523,-0.199819,1.204361,-149.953424,204.930956,
+ -0.818355,-0.566627,-0.096064,1.204361,-149.953424,204.930956,
+ -0.818355,-0.566627,-0.096064,1.242693,-150.269817,206.470635,
+ -0.818355,-0.566627,-0.096064,0.765365,-149.332502,205.008229,
+ -0.398625,-0.825712,-0.399121,1.242693,-150.269817,206.470635,
+ -0.398625,-0.825712,-0.399121,1.012699,-150.176724,206.507751,
+ -0.398625,-0.825712,-0.399121,0.765365,-149.332502,205.008229,
+ -0.962628,-0.270754,0.006345,0.765365,-149.332502,205.008229,
+ -0.962628,-0.270754,0.006345,1.012699,-150.176724,206.507751,
+ -0.962628,-0.270754,0.006345,0.591349,-148.710667,205.142392,
+ -0.603684,-0.629309,-0.489424,1.012699,-150.176724,206.507751,
+ -0.603684,-0.629309,-0.489424,0.766886,-149.986584,206.566466,
+ -0.603684,-0.629309,-0.489424,0.591349,-148.710667,205.142392,
+ 0.554077,-0.685618,-0.472151,5.76012,-149.054745,207.224199,
+ 0.554077,-0.685618,-0.472151,5.383794,-149.247623,207.062656,
+ 0.554077,-0.685618,-0.472151,5.540166,-147.984484,205.411935,
+ 0.91872,-0.350785,-0.181393,5.216775,-148.674769,205.108927,
+ 0.91872,-0.350785,-0.181393,5.540166,-147.984484,205.411935,
+ 0.91872,-0.350785,-0.181393,5.383794,-149.247623,207.062656,
+ 0.433021,-0.854302,-0.287508,5.383794,-149.247623,207.062656,
+ 0.433021,-0.854302,-0.287508,3.388083,-150.161209,206.771513,
+ 0.433021,-0.854302,-0.287508,5.216775,-148.674769,205.108927,
+ 0.550382,-0.824454,-0.131736,5.216775,-148.674769,205.108927,
+ 0.550382,-0.824454,-0.131736,3.388083,-150.161209,206.771513,
+ 0.550382,-0.824454,-0.131736,3.704172,-149.695137,205.175248,
+ -0.888768,-0.45071,-0.083382,0.766886,-149.986584,206.566466,
+ -0.888768,-0.45071,-0.083382,0.801263,-150.478515,208.8591,
+ -0.888768,-0.45071,-0.083382,0.020624,-148.538476,206.693328,
+ -0.866996,-0.483501,-0.120603,0.020624,-148.538476,206.693328,
+ -0.866996,-0.483501,-0.120603,0.801263,-150.478515,208.8591,
+ -0.866996,-0.483501,-0.120603,0.020624,-149.111939,208.992351,
+ -1,0,0,0.020624,-146.852465,206.521745,
+ -1,0,0,0.020624,-148.538476,206.693328,
+ -1,0,0,0.020624,-149.111939,208.992351,
+ -0.15551,0.907041,0.391272,3.37926,-148.952221,210.67319,
+ -0.15551,0.907041,0.391272,2.39114,-148.927275,210.222634,
+ -0.15551,0.907041,0.391272,2.437686,-149.914179,212.528958,
+ -0.141225,0.906374,0.398174,3.73429,-149.666844,212.425826,
+ -0.141225,0.906374,0.398174,3.37926,-148.952221,210.67319,
+ -0.141225,0.906374,0.398174,2.437686,-149.914179,212.528958,
+ 0.075708,0.879805,0.469268,2.39114,-148.927275,210.222634,
+ 0.075708,0.879805,0.469268,1.270986,-148.72314,210.020629,
+ 0.075708,0.879805,0.469268,1.640618,-149.923914,212.212261,
+ -0.166319,0.905341,0.390763,2.437686,-149.914179,212.528958,
+ -0.166319,0.905341,0.390763,2.39114,-148.927275,210.222634,
+ -0.166319,0.905341,0.390763,1.640618,-149.923914,212.212261,
+ 0.865553,0.499482,0.036533,4.219528,-142.668772,199.89726,
+ 0.865553,0.499482,0.036533,4.206751,-142.813583,202.179855,
+ 0.865553,0.499482,0.036533,4.42062,-143.172872,202.025005,
+ 0.687962,0.665991,0.288381,4.206751,-142.813583,202.179855,
+ 0.687962,0.665991,0.288381,3.966413,-143.546459,204.445718,
+ 0.687962,0.665991,0.288381,4.388677,-143.937996,204.342586,
+ 0.685026,0.66837,0.289865,4.206751,-142.813583,202.179855,
+ 0.685026,0.66837,0.289865,4.388677,-143.937996,204.342586,
+ 0.685026,0.66837,0.289865,4.749183,-144.27173,204.260141,
+ 0.873773,0.474861,0.105012,4.42062,-143.172872,202.025005,
+ 0.873773,0.474861,0.105012,4.206751,-142.813583,202.179855,
+ 0.873773,0.474861,0.105012,4.749183,-144.27173,204.260141,
+ -0.02112,0.685141,0.728104,3.966413,-143.546459,204.445718,
+ -0.02112,0.685141,0.728104,4.340913,-145.215434,206.027076,
+ -0.02112,0.685141,0.728104,4.868438,-145.320087,206.140856,
+ 0.684995,0.654408,0.320206,4.388677,-143.937996,204.342586,
+ 0.684995,0.654408,0.320206,3.966413,-143.546459,204.445718,
+ 0.684995,0.654408,0.320206,4.868438,-145.320087,206.140856,
+ 0.406827,0.773519,0.485964,5.368887,-145.381845,205.820204,
+ 0.406827,0.773519,0.485964,4.388677,-143.937996,204.342586,
+ 0.406827,0.773519,0.485964,4.868438,-145.320087,206.140856,
+ 0.689384,0.690886,0.217778,5.368887,-145.381845,205.820204,
+ 0.689384,0.690886,0.217778,4.749183,-144.27173,204.260141,
+ 0.689384,0.690886,0.217778,4.388677,-143.937996,204.342586,
+ -0.491296,0.572358,0.656532,4.340913,-145.215434,206.027076,
+ -0.491296,0.572358,0.656532,4.702028,-146.554325,207.464536,
+ -0.491296,0.572358,0.656532,5.495445,-146.541548,208.047126,
+ 0.054985,0.848825,0.525807,5.495445,-146.541548,208.047126,
+ 0.054985,0.848825,0.525807,4.868438,-145.320087,206.140856,
+ 0.054985,0.848825,0.525807,4.340913,-145.215434,206.027076,
+ 0.623189,0.735367,0.266215,5.913449,-146.539722,207.063569,
+ 0.623189,0.735367,0.266215,4.868438,-145.320087,206.140856,
+ 0.623189,0.735367,0.266215,5.495445,-146.541548,208.047126,
+ 0.42082,0.748405,0.51264,5.913449,-146.539722,207.063569,
+ 0.42082,0.748405,0.51264,5.368887,-145.381845,205.820204,
+ 0.42082,0.748405,0.51264,4.868438,-145.320087,206.140856,
+ -0.714514,0.481911,0.50718,4.702028,-146.554325,207.464536,
+ -0.714514,0.481911,0.50718,4.992258,-147.854884,209.109173,
+ -0.714514,0.481911,0.50718,5.619264,-147.711594,209.856348,
+ -0.392748,0.75974,0.518212,5.619264,-147.711594,209.856348,
+ -0.392748,0.75974,0.518212,5.495445,-146.541548,208.047126,
+ -0.392748,0.75974,0.518212,4.702028,-146.554325,207.464536,
+ 0.532156,0.727075,0.433789,5.940525,-147.59751,209.27102,
+ 0.532156,0.727075,0.433789,5.495445,-146.541548,208.047126,
+ 0.532156,0.727075,0.433789,5.619264,-147.711594,209.856348,
+ 0.703389,0.644334,0.300131,5.913449,-146.539722,207.063569,
+ 0.703389,0.644334,0.300131,5.495445,-146.541548,208.047126,
+ 0.703389,0.644334,0.300131,5.940525,-147.59751,209.27102,
+ -0.681329,0.650023,0.336543,4.992258,-147.854884,209.109173,
+ -0.681329,0.650023,0.336543,4.884867,-148.912976,210.935431,
+ -0.681329,0.650023,0.336543,5.450724,-148.839963,211.93998,
+ -0.583964,0.732674,0.349536,5.619264,-147.711594,209.856348,
+ -0.583964,0.732674,0.349536,4.992258,-147.854884,209.109173,
+ -0.583964,0.732674,0.349536,5.450724,-148.839963,211.93998,
+ 0.725074,0.579316,0.372372,5.619264,-147.711594,209.856348,
+ 0.725074,0.579316,0.372372,5.450724,-148.839963,211.93998,
+ 0.725074,0.579316,0.372372,5.688323,-148.786723,211.394506,
+ 0.577977,0.680817,0.449922,5.940525,-147.59751,209.27102,
+ 0.577977,0.680817,0.449922,5.619264,-147.711594,209.856348,
+ 0.577977,0.680817,0.449922,5.688323,-148.786723,211.394506,
+ -0.540066,0.781572,0.312208,5.260584,-149.333414,212.637871,
+ -0.540066,0.781572,0.312208,4.884867,-148.912976,210.935431,
+ -0.540066,0.781572,0.312208,4.873002,-149.40582,212.148678,
+ -0.647606,0.694115,0.314342,5.450724,-148.839963,211.93998,
+ -0.647606,0.694115,0.314342,4.884867,-148.912976,210.935431,
+ -0.647606,0.694115,0.314342,5.260584,-149.333414,212.637871,
+ -0.042953,0.821239,0.568965,5.450724,-148.839963,211.93998,
+ -0.042953,0.821239,0.568965,5.260584,-149.333414,212.637871,
+ -0.042953,0.821239,0.568965,5.403569,-149.37631,212.71058,
+ 0.781325,0.488829,0.388042,5.688323,-148.786723,211.394506,
+ 0.781325,0.488829,0.388042,5.450724,-148.839963,211.93998,
+ 0.781325,0.488829,0.388042,5.403569,-149.37631,212.71058,
+ -0.540371,0.381436,0.750004,5.260584,-149.333414,212.637871,
+ -0.540371,0.381436,0.750004,4.856878,-149.549414,212.456857,
+ -0.540371,0.381436,0.750004,5.006861,-149.70183,212.642434,
+ -0.371918,0.267147,0.888993,5.260584,-149.333414,212.637871,
+ -0.371918,0.267147,0.888993,5.006861,-149.70183,212.642434,
+ -0.371918,0.267147,0.888993,5.403569,-149.37631,212.71058,
+ -0.555636,0.764383,0.327088,5.260584,-149.333414,212.637871,
+ -0.555636,0.764383,0.327088,4.873002,-149.40582,212.148678,
+ -0.555636,0.764383,0.327088,4.856878,-149.549414,212.456857,
+ 0.615175,-0.777298,0.131785,5.403569,-149.37631,212.71058,
+ 0.615175,-0.777298,0.131785,5.006861,-149.70183,212.642434,
+ 0.615175,-0.777298,0.131785,5.205823,-149.596873,212.332734,
+ 0.34457,-0.927172,0.147049,5.006861,-149.70183,212.642434,
+ 0.34457,-0.927172,0.147049,3.380173,-150.326098,212.518006,
+ 0.34457,-0.927172,0.147049,3.32663,-150.426188,212.012386,
+ 0.409807,-0.911038,-0.045476,5.205823,-149.596873,212.332734,
+ 0.409807,-0.911038,-0.045476,5.006861,-149.70183,212.642434,
+ 0.409807,-0.911038,-0.045476,3.32663,-150.426188,212.012386,
+ -0.006796,0.741735,0.670659,4.873002,-149.40582,212.148678,
+ -0.006796,0.741735,0.670659,3.73429,-149.666844,212.425826,
+ -0.006796,0.741735,0.670659,3.514336,-149.917525,212.700845,
+ -0.089221,0.923086,0.374102,4.884867,-148.912976,210.935431,
+ -0.089221,0.923086,0.374102,3.37926,-148.952221,210.67319,
+ -0.089221,0.923086,0.374102,4.873002,-149.40582,212.148678,
+ 0.919168,-0.393209,0.022724,5.688323,-148.786723,211.394506,
+ 0.919168,-0.393209,0.022724,5.403569,-149.37631,212.71058,
+ 0.919168,-0.393209,0.022724,5.353372,-149.50165,212.572158,
+ 0.88335,-0.467578,-0.032612,5.433383,-149.255837,211.215014,
+ 0.88335,-0.467578,-0.032612,5.688323,-148.786723,211.394506,
+ 0.88335,-0.467578,-0.032612,5.353372,-149.50165,212.572158,
+ 0.008158,-0.984869,0.17311,3.372567,-150.675956,210.589224,
+ 0.008158,-0.984869,0.17311,3.32663,-150.426188,212.012386,
+ 0.008158,-0.984869,0.17311,2.187309,-150.68417,210.598351,
+ 0.093812,-0.990033,0.105039,3.32663,-150.426188,212.012386,
+ 0.093812,-0.990033,0.105039,2.139851,-150.558526,211.824983,
+ 0.093812,-0.990033,0.105039,2.187309,-150.68417,210.598351,
+ -0.019919,-0.994675,0.101114,2.187309,-150.68417,210.598351,
+ -0.019919,-0.994675,0.101114,2.139851,-150.558526,211.824983,
+ -0.019919,-0.994675,0.101114,1.204361,-150.65892,210.653111,
+ 0.000093,-0.996357,0.085283,2.139851,-150.558526,211.824983,
+ 0.000093,-0.996357,0.085283,1.304146,-150.546053,211.97162,
+ 0.000093,-0.996357,0.085283,1.204361,-150.65892,210.653111,
+ 0.052122,-0.995329,0.081258,1.304146,-150.546053,211.97162,
+ 0.052122,-0.995329,0.081258,0.804914,-150.670176,210.771455,
+ 0.052122,-0.995329,0.081258,1.204361,-150.65892,210.653111,
+ -0.289313,-0.932367,0.216773,1.304146,-150.546053,211.97162,
+ -0.289313,-0.932367,0.216773,0.829556,-150.401546,211.959755,
+ -0.289313,-0.932367,0.216773,0.804914,-150.670176,210.771455,
+ 0.647667,-0.755509,-0.098658,5.433383,-149.255837,211.215014,
+ 0.647667,-0.755509,-0.098658,5.353372,-149.50165,212.572158,
+ 0.647667,-0.755509,-0.098658,5.205823,-149.596873,212.332734,
+ 0.830824,-0.556535,-0.000659,5.031198,-149.856072,211.074158,
+ 0.830824,-0.556535,-0.000659,5.433383,-149.255837,211.215014,
+ 0.830824,-0.556535,-0.000659,5.205823,-149.596873,212.332734,
+ 0.380581,-0.914754,0.135585,5.205823,-149.596873,212.332734,
+ 0.380581,-0.914754,0.135585,3.32663,-150.426188,212.012386,
+ 0.380581,-0.914754,0.135585,5.031198,-149.856072,211.074158,
+ 0.395937,-0.902193,0.171117,5.031198,-149.856072,211.074158,
+ 0.395937,-0.902193,0.171117,3.32663,-150.426188,212.012386,
+ 0.395937,-0.902193,0.171117,3.372567,-150.675956,210.589224,
+ 0.929192,0.369596,-0.000254,4.219528,-142.668772,199.89726,
+ 0.929192,0.369596,-0.000254,4.42062,-143.172872,202.025005,
+ 0.929192,0.369596,-0.000254,4.826151,-144.192328,202.140306,
+ 0.841838,0.524234,0.128406,4.219528,-142.668772,199.89726,
+ 0.841838,0.524234,0.128406,4.826151,-144.192328,202.140306,
+ 0.841838,0.524234,0.128406,4.734884,-143.508127,199.945328,
+ 0.923559,0.380039,0.051076,4.42062,-143.172872,202.025005,
+ 0.923559,0.380039,0.051076,4.749183,-144.27173,204.260141,
+ 0.923559,0.380039,0.051076,5.270623,-145.485889,203.865562,
+ 0.926789,0.373322,0.041144,4.42062,-143.172872,202.025005,
+ 0.926789,0.373322,0.041144,5.270623,-145.485889,203.865562,
+ 0.926789,0.373322,0.041144,4.826151,-144.192328,202.140306,
+ 0.946351,0.261495,-0.189844,4.749183,-144.27173,204.260141,
+ 0.946351,0.261495,-0.189844,5.368887,-145.381845,205.820204,
+ 0.946351,0.261495,-0.189844,5.632042,-146.425638,205.694255,
+ 0.920826,0.38955,0.018197,5.270623,-145.485889,203.865562,
+ 0.920826,0.38955,0.018197,4.749183,-144.27173,204.260141,
+ 0.920826,0.38955,0.018197,5.632042,-146.425638,205.694255,
+ 0.9522,0.19845,-0.232234,5.368887,-145.381845,205.820204,
+ 0.9522,0.19845,-0.232234,5.913449,-146.539722,207.063569,
+ 0.9522,0.19845,-0.232234,6.127623,-147.623978,207.015197,
+ 0.958146,0.256823,-0.126484,5.632042,-146.425638,205.694255,
+ 0.958146,0.256823,-0.126484,5.368887,-145.381845,205.820204,
+ 0.958146,0.256823,-0.126484,6.127623,-147.623978,207.015197,
+ 0.97472,0.205916,0.086717,5.913449,-146.539722,207.063569,
+ 0.97472,0.205916,0.086717,5.940525,-147.59751,209.27102,
+ 0.97472,0.205916,0.086717,6.043961,-148.175537,209.480935,
+ 0.978865,0.189978,0.075709,6.127623,-147.623978,207.015197,
+ 0.978865,0.189978,0.075709,5.913449,-146.539722,207.063569,
+ 0.978865,0.189978,0.075709,6.043961,-148.175537,209.480935,
+ 0.931177,0.25959,0.255972,5.940525,-147.59751,209.27102,
+ 0.931177,0.25959,0.255972,5.688323,-148.786723,211.394506,
+ 0.931177,0.25959,0.255972,6.043961,-148.175537,209.480935,
+ 0.621538,0.781964,0.047143,3.431283,-142.657516,199.750928,
+ 0.621538,0.781964,0.047143,2.284966,-141.746668,199.755796,
+ 0.621538,0.781964,0.047143,2.48697,-142.093484,202.845194,
+ -0.168313,0.959417,-0.226251,3.431283,-142.657516,199.750928,
+ -0.168313,0.959417,-0.226251,2.48697,-142.093484,202.845194,
+ -0.168313,0.959417,-0.226251,3.309289,-142.183534,201.851597,
+ -0.089745,0.98908,0.116902,2.48697,-142.093484,202.845194,
+ -0.089745,0.98908,0.116902,2.284966,-141.746668,199.755796,
+ -0.089745,0.98908,0.116902,1.649137,-142.122689,202.449094,
+ 0.569327,0.714627,0.406418,3.309289,-142.183534,201.851597,
+ 0.569327,0.714627,0.406418,2.48697,-142.093484,202.845194,
+ 0.569327,0.714627,0.406418,2.245112,-142.742699,204.32555,
+ 0.053393,0.968821,0.241941,3.309289,-142.183534,201.851597,
+ 0.053393,0.968821,0.241941,2.245112,-142.742699,204.32555,
+ 0.053393,0.968821,0.241941,2.907713,-142.788028,204.36084,
+ -0.221165,0.88839,0.402306,2.48697,-142.093484,202.845194,
+ -0.221165,0.88839,0.402306,1.649137,-142.122689,202.449094,
+ -0.221165,0.88839,0.402306,1.500067,-142.690068,203.620053,
+ -0.267915,0.897659,0.3499,2.48697,-142.093484,202.845194,
+ -0.267915,0.897659,0.3499,1.500067,-142.690068,203.620053,
+ -0.267915,0.897659,0.3499,2.245112,-142.742699,204.32555,
+ 0.011739,0.715445,0.698571,2.907713,-142.788028,204.36084,
+ 0.011739,0.715445,0.698571,2.245112,-142.742699,204.32555,
+ 0.011739,0.715445,0.698571,2.177574,-144.38338,206.006997,
+ -0.05907,0.729814,0.681089,3.025143,-144.431752,206.132338,
+ -0.05907,0.729814,0.681089,2.907713,-142.788028,204.36084,
+ -0.05907,0.729814,0.681089,2.177574,-144.38338,206.006997,
+ -0.469513,0.692672,0.547507,2.245112,-142.742699,204.32555,
+ -0.469513,0.692672,0.547507,1.500067,-142.690068,203.620053,
+ -0.469513,0.692672,0.547507,1.541441,-144.26017,205.641928,
+ -0.249914,0.698017,0.671056,2.245112,-142.742699,204.32555,
+ -0.249914,0.698017,0.671056,1.541441,-144.26017,205.641928,
+ -0.249914,0.698017,0.671056,2.177574,-144.38338,206.006997,
+ -0.779654,0.462103,0.422613,0.020624,-146.852465,206.521745,
+ -0.779654,0.462103,0.422613,0.020624,-149.111939,208.992351,
+ -0.779654,0.462103,0.422613,0.690222,-147.655009,208.634583,
+ -0.539461,0.716077,0.442961,1.459909,-145.951657,206.818364,
+ -0.539461,0.716077,0.442961,0.020624,-146.852465,206.521745,
+ -0.539461,0.716077,0.442961,0.690222,-147.655009,208.634583,
+ 0.202258,0.670106,0.714177,1.459909,-145.951657,206.818364,
+ 0.202258,0.670106,0.714177,0.690222,-147.655009,208.634583,
+ 0.202258,0.670106,0.714177,1.372597,-147.525713,208.320015,
+ -0.218127,0.681034,0.699009,3.444669,-146.300298,207.111636,
+ -0.218127,0.681034,0.699009,3.768972,-147.999695,208.868531,
+ -0.218127,0.681034,0.699009,4.992258,-147.854884,209.109173,
+ -0.016404,0.782865,0.621975,4.992258,-147.854884,209.109173,
+ -0.016404,0.782865,0.621975,4.702028,-146.554325,207.464536,
+ -0.016404,0.782865,0.621975,3.444669,-146.300298,207.111636,
+ 0.938773,-0.341641,-0.044569,6.127623,-147.623978,207.015197,
+ 0.938773,-0.341641,-0.044569,6.043961,-148.175537,209.480935,
+ 0.938773,-0.341641,-0.044569,5.549901,-149.50956,209.300226,
+ 0.969142,-0.242352,0.045041,6.127623,-147.623978,207.015197,
+ 0.969142,-0.242352,0.045041,5.549901,-149.50956,209.300226,
+ 0.969142,-0.242352,0.045041,5.76012,-149.054745,207.224199,
+ 0.124214,-0.978521,-0.164522,3.458967,-150.48612,208.75749,
+ 0.124214,-0.978521,-0.164522,1.876696,-150.30176,206.466376,
+ 0.124214,-0.978521,-0.164522,3.388083,-150.161209,206.771513,
+ 0.098084,-0.98427,-0.14694,3.458967,-150.48612,208.75749,
+ 0.098084,-0.98427,-0.14694,2.191569,-150.612373,208.757185,
+ 0.098084,-0.98427,-0.14694,1.876696,-150.30176,206.466376,
+ -0.050764,-0.99056,-0.127334,2.191569,-150.612373,208.757185,
+ -0.050764,-0.99056,-0.127334,1.242693,-150.269817,206.470635,
+ -0.050764,-0.99056,-0.127334,1.876696,-150.30176,206.466376,
+ -0.058283,-0.990543,-0.12421,2.191569,-150.612373,208.757185,
+ -0.058283,-0.990543,-0.12421,1.367729,-150.560351,208.728892,
+ -0.058283,-0.990543,-0.12421,1.242693,-150.269817,206.470635,
+ -0.38679,-0.917097,-0.096572,1.367729,-150.560351,208.728892,
+ -0.38679,-0.917097,-0.096572,1.012699,-150.176724,206.507751,
+ -0.38679,-0.917097,-0.096572,1.242693,-150.269817,206.470635,
+ -0.058727,-0.985242,-0.16078,1.367729,-150.560351,208.728892,
+ -0.058727,-0.985242,-0.16078,0.978018,-150.543923,208.770571,
+ -0.058727,-0.985242,-0.16078,1.012699,-150.176724,206.507751,
+ -0.626162,-0.768051,-0.134232,1.012699,-150.176724,206.507751,
+ -0.626162,-0.768051,-0.134232,0.978018,-150.543923,208.770571,
+ -0.626162,-0.768051,-0.134232,0.766886,-149.986584,206.566466,
+ -0.420958,-0.888168,-0.184262,0.978018,-150.543923,208.770571,
+ -0.420958,-0.888168,-0.184262,0.801263,-150.478515,208.8591,
+ -0.420958,-0.888168,-0.184262,0.766886,-149.986584,206.566466,
+ 0.568604,-0.81371,-0.12069,5.76012,-149.054745,207.224199,
+ 0.568604,-0.81371,-0.12069,5.549901,-149.50956,209.300226,
+ 0.568604,-0.81371,-0.12069,5.232291,-149.729514,209.28684,
+ 0.501309,-0.852085,-0.150465,5.76012,-149.054745,207.224199,
+ 0.501309,-0.852085,-0.150465,5.232291,-149.729514,209.28684,
+ 0.501309,-0.852085,-0.150465,5.383794,-149.247623,207.062656,
+ 0.428028,-0.888867,-0.163426,5.383794,-149.247623,207.062656,
+ 0.428028,-0.888867,-0.163426,5.232291,-149.729514,209.28684,
+ 0.428028,-0.888867,-0.163426,3.458967,-150.48612,208.75749,
+ 0.430111,-0.88836,-0.16069,5.383794,-149.247623,207.062656,
+ 0.430111,-0.88836,-0.16069,3.458967,-150.48612,208.75749,
+ 0.430111,-0.88836,-0.16069,3.388083,-150.161209,206.771513,
+ -0.869322,-0.491944,-0.047644,0.801263,-150.478515,208.8591,
+ -0.869322,-0.491944,-0.047644,0.804914,-150.670176,210.771455,
+ -0.869322,-0.491944,-0.047644,0.020624,-149.111939,208.992351,
+ -0.850934,-0.519203,-0.079626,0.020624,-149.111939,208.992351,
+ -0.850934,-0.519203,-0.079626,0.804914,-150.670176,210.771455,
+ -0.850934,-0.519203,-0.079626,0.020624,-149.422856,211.019702,
+ -0.900409,0.430018,0.065948,0.690222,-147.655009,208.634583,
+ -0.900409,0.430018,0.065948,0.020624,-149.111939,208.992351,
+ -0.900409,0.430018,0.065948,0.020624,-149.422856,211.019702,
+ -0.134414,0.81377,0.56543,0.690222,-147.655009,208.634583,
+ -0.134414,0.81377,0.56543,0.020624,-149.422856,211.019702,
+ -0.134414,0.81377,0.56543,0.682312,-148.78003,210.251839,
+ 0.107294,0.815927,0.568113,1.372597,-147.525713,208.320015,
+ 0.107294,0.815927,0.568113,0.690222,-147.655009,208.634583,
+ 0.107294,0.815927,0.568113,0.682312,-148.78003,210.251839,
+ 0.148203,0.804429,0.575265,1.372597,-147.525713,208.320015,
+ 0.148203,0.804429,0.575265,0.682312,-148.78003,210.251839,
+ 0.148203,0.804429,0.575265,1.270986,-148.72314,210.020629,
+ -0.101063,0.888687,0.447238,4.884867,-148.912976,210.935431,
+ -0.101063,0.888687,0.447238,3.768972,-147.999695,208.868531,
+ -0.101063,0.888687,0.447238,3.37926,-148.952221,210.67319,
+ -0.196029,0.853434,0.482932,4.992258,-147.854884,209.109173,
+ -0.196029,0.853434,0.482932,3.768972,-147.999695,208.868531,
+ -0.196029,0.853434,0.482932,4.884867,-148.912976,210.935431,
+ 0.87705,-0.480303,0.009593,6.043961,-148.175537,209.480935,
+ 0.87705,-0.480303,0.009593,5.688323,-148.786723,211.394506,
+ 0.87705,-0.480303,0.009593,5.433383,-149.255837,211.215014,
+ 0.928016,-0.357765,0.103878,5.549901,-149.50956,209.300226,
+ 0.928016,-0.357765,0.103878,6.043961,-148.175537,209.480935,
+ 0.928016,-0.357765,0.103878,5.433383,-149.255837,211.215014,
+ 0.098672,-0.990285,-0.097976,3.458967,-150.48612,208.75749,
+ 0.098672,-0.990285,-0.097976,3.372567,-150.675956,210.589224,
+ 0.098672,-0.990285,-0.097976,2.191569,-150.612373,208.757185,
+ 0.006625,-0.999219,-0.03895,3.372567,-150.675956,210.589224,
+ 0.006625,-0.999219,-0.03895,2.187309,-150.68417,210.598351,
+ 0.006625,-0.999219,-0.03895,2.191569,-150.612373,208.757185,
+ -0.061637,-0.997335,-0.039034,2.191569,-150.612373,208.757185,
+ -0.061637,-0.997335,-0.039034,2.187309,-150.68417,210.598351,
+ -0.061637,-0.997335,-0.039034,1.367729,-150.560351,208.728892,
+ -0.028625,-0.998154,-0.053561,2.187309,-150.68417,210.598351,
+ -0.028625,-0.998154,-0.053561,1.204361,-150.65892,210.653111,
+ -0.028625,-0.998154,-0.053561,1.367729,-150.560351,208.728892,
+ -0.047941,-0.997326,-0.055159,1.367729,-150.560351,208.728892,
+ -0.047941,-0.997326,-0.055159,1.204361,-150.65892,210.653111,
+ -0.047941,-0.997326,-0.055159,0.978018,-150.543923,208.770571,
+ 0.009716,-0.998021,-0.062133,1.204361,-150.65892,210.653111,
+ 0.009716,-0.998021,-0.062133,0.804914,-150.670176,210.771455,
+ 0.009716,-0.998021,-0.062133,0.978018,-150.543923,208.770571,
+ -0.385497,-0.918182,-0.091287,0.978018,-150.543923,208.770571,
+ -0.385497,-0.918182,-0.091287,0.804914,-150.670176,210.771455,
+ -0.385497,-0.918182,-0.091287,0.801263,-150.478515,208.8591,
+ 0.810389,-0.572368,0.125156,5.549901,-149.50956,209.300226,
+ 0.810389,-0.572368,0.125156,5.433383,-149.255837,211.215014,
+ 0.810389,-0.572368,0.125156,5.031198,-149.856072,211.074158,
+ 0.569157,-0.822208,0.005817,5.549901,-149.50956,209.300226,
+ 0.569157,-0.822208,0.005817,5.031198,-149.856072,211.074158,
+ 0.569157,-0.822208,0.005817,5.232291,-149.729514,209.28684,
+ 0.446183,-0.894845,-0.013162,5.232291,-149.729514,209.28684,
+ 0.446183,-0.894845,-0.013162,5.031198,-149.856072,211.074158,
+ 0.446183,-0.894845,-0.013162,3.372567,-150.675956,210.589224,
+ 0.410153,-0.90894,-0.074854,5.232291,-149.729514,209.28684,
+ 0.410153,-0.90894,-0.074854,3.372567,-150.675956,210.589224,
+ 0.410153,-0.90894,-0.074854,3.458967,-150.48612,208.75749,
+ -0.825265,-0.546924,0.140753,0.804914,-150.670176,210.771455,
+ -0.825265,-0.546924,0.140753,0.829556,-150.401546,211.959755,
+ -0.825265,-0.546924,0.140753,0.020624,-149.422856,211.019702,
+ -0.858149,-0.33872,0.38581,0.020624,-149.422856,211.019702,
+ -0.858149,-0.33872,0.38581,0.829556,-150.401546,211.959755,
+ -0.858149,-0.33872,0.38581,0.795787,-149.947643,212.283145,
+ -0.239031,0.836017,0.493903,0.795787,-149.947643,212.283145,
+ -0.239031,0.836017,0.493903,0.682312,-148.78003,210.251839,
+ -0.239031,0.836017,0.493903,0.020624,-149.422856,211.019702,
+ 0.269861,0.841249,0.468482,1.048902,-149.872804,212.002955,
+ 0.269861,0.841249,0.468482,0.682312,-148.78003,210.251839,
+ 0.269861,0.841249,0.468482,0.795787,-149.947643,212.283145,
+ 0.117065,0.853352,0.508022,1.270986,-148.72314,210.020629,
+ 0.117065,0.853352,0.508022,0.682312,-148.78003,210.251839,
+ 0.117065,0.853352,0.508022,1.048902,-149.872804,212.002955,
+ -0.098887,0.865575,0.490918,1.640618,-149.923914,212.212261,
+ -0.098887,0.865575,0.490918,1.270986,-148.72314,210.020629,
+ -0.098887,0.865575,0.490918,1.048902,-149.872804,212.002955,
+ -0.112961,0.911848,0.394681,4.873002,-149.40582,212.148678,
+ -0.112961,0.911848,0.394681,3.37926,-148.952221,210.67319,
+ -0.112961,0.911848,0.394681,3.73429,-149.666844,212.425826,
+ 0.978734,-0.020724,-0.204084,5.270623,-145.485889,203.865562,
+ 0.978734,-0.020724,-0.204084,5.632042,-146.425638,205.694255,
+ 0.978734,-0.020724,-0.204084,5.540166,-147.984484,205.411935,
+ 0.995814,0.076069,-0.050666,5.39931,-147.433533,203.470679,
+ 0.995814,0.076069,-0.050666,5.270623,-145.485889,203.865562,
+ 0.995814,0.076069,-0.050666,5.540166,-147.984484,205.411935,
+ 0.473355,-0.868176,-0.149018,4.096317,-149.232716,203.726836,
+ 0.473355,-0.868176,-0.149018,3.704172,-149.695137,205.175248,
+ 0.473355,-0.868176,-0.149018,2.5539,-149.984759,203.208742,
+ 0.209825,-0.977508,0.021232,3.704172,-149.695137,205.175248,
+ 0.209825,-0.977508,0.021232,1.928719,-150.08211,204.905097,
+ 0.209825,-0.977508,0.021232,2.5539,-149.984759,203.208742,
+ -0.287165,-0.944418,-0.160032,2.5539,-149.984759,203.208742,
+ -0.287165,-0.944418,-0.160032,1.928719,-150.08211,204.905097,
+ -0.287165,-0.944418,-0.160032,1.654613,-149.683272,203.043244,
+ -0.178289,-0.967199,-0.180941,1.928719,-150.08211,204.905097,
+ -0.178289,-0.967199,-0.180941,1.204361,-149.953424,204.930956,
+ -0.178289,-0.967199,-0.180941,1.654613,-149.683272,203.043244,
+ -0.779534,-0.566594,-0.267018,1.654613,-149.683272,203.043244,
+ -0.779534,-0.566594,-0.267018,1.204361,-149.953424,204.930956,
+ -0.779534,-0.566594,-0.267018,0.91839,-148.72527,203.159762,
+ -0.805922,-0.539435,-0.243926,0.91839,-148.72527,203.159762,
+ -0.805922,-0.539435,-0.243926,1.204361,-149.953424,204.930956,
+ -0.805922,-0.539435,-0.243926,0.765365,-149.332502,205.008229,
+ -0.970508,-0.193422,-0.143883,0.91839,-148.72527,203.159762,
+ -0.970508,-0.193422,-0.143883,0.765365,-149.332502,205.008229,
+ -0.970508,-0.193422,-0.143883,0.619337,-147.556744,203.606059,
+ -0.955633,-0.226902,-0.187833,0.619337,-147.556744,203.606059,
+ -0.955633,-0.226902,-0.187833,0.765365,-149.332502,205.008229,
+ -0.955633,-0.226902,-0.187833,0.591349,-148.710667,205.142392,
+ 0.986763,-0.056187,-0.152123,4.761656,-144.890522,200.087096,
+ 0.986763,-0.056187,-0.152123,4.981306,-146.005504,201.923699,
+ 0.986763,-0.056187,-0.152123,4.900078,-147.70551,202.024701,
+ 0.942894,-0.156154,-0.294224,4.761656,-144.890522,200.087096,
+ 0.942894,-0.156154,-0.294224,4.900078,-147.70551,202.024701,
+ 0.942894,-0.156154,-0.294224,4.608935,-146.120501,200.250465,
+ 0.809838,-0.365188,-0.45913,4.608935,-146.120501,200.250465,
+ 0.809838,-0.365188,-0.45913,4.900078,-147.70551,202.024701,
+ 0.809838,-0.365188,-0.45913,4.476902,-148.595366,201.986065,
+ 0.975759,-0.158145,-0.151276,4.431268,-147.017659,200.042375,
+ 0.975759,-0.158145,-0.151276,4.608935,-146.120501,200.250465,
+ 0.975759,-0.158145,-0.151276,4.476902,-148.595366,201.986065,
+ 0.838892,-0.267785,-0.473868,4.981306,-146.005504,201.923699,
+ 0.838892,-0.267785,-0.473868,5.39931,-147.433533,203.470679,
+ 0.838892,-0.267785,-0.473868,5.075007,-148.326736,203.401316,
+ 0.986979,-0.056115,-0.15074,4.981306,-146.005504,201.923699,
+ 0.986979,-0.056115,-0.15074,5.075007,-148.326736,203.401316,
+ 0.986979,-0.056115,-0.15074,4.900078,-147.70551,202.024701,
+ 0.546865,-0.734876,-0.401119,5.075007,-148.326736,203.401316,
+ 0.546865,-0.734876,-0.401119,4.096317,-149.232716,203.726836,
+ 0.546865,-0.734876,-0.401119,4.900078,-147.70551,202.024701,
+ 0.901711,-0.430529,0.039511,4.476902,-148.595366,201.986065,
+ 0.901711,-0.430529,0.039511,4.900078,-147.70551,202.024701,
+ 0.901711,-0.430529,0.039511,4.096317,-149.232716,203.726836,
+ 0.91896,-0.356802,-0.167943,5.39931,-147.433533,203.470679,
+ 0.91896,-0.356802,-0.167943,5.540166,-147.984484,205.411935,
+ 0.91896,-0.356802,-0.167943,5.216775,-148.674769,205.108927,
+ 0.933664,-0.327786,-0.144321,5.075007,-148.326736,203.401316,
+ 0.933664,-0.327786,-0.144321,5.39931,-147.433533,203.470679,
+ 0.933664,-0.327786,-0.144321,5.216775,-148.674769,205.108927,
+ 0.540284,-0.814629,-0.210887,5.216775,-148.674769,205.108927,
+ 0.540284,-0.814629,-0.210887,3.704172,-149.695137,205.175248,
+ 0.540284,-0.814629,-0.210887,5.075007,-148.326736,203.401316,
+ 0.668171,-0.741901,-0.055958,5.075007,-148.326736,203.401316,
+ 0.668171,-0.741901,-0.055958,3.704172,-149.695137,205.175248,
+ 0.668171,-0.741901,-0.055958,4.096317,-149.232716,203.726836,
+ -0.943094,-0.296894,-0.149756,0.591349,-148.710667,205.142392,
+ -0.943094,-0.296894,-0.149756,0.766886,-149.986584,206.566466,
+ -0.943094,-0.296894,-0.149756,0.020624,-146.991191,205.327665,
+ -0.81598,-0.382535,-0.433409,0.020624,-146.991191,205.327665,
+ -0.81598,-0.382535,-0.433409,0.766886,-149.986584,206.566466,
+ -0.81598,-0.382535,-0.433409,0.020624,-148.538476,206.693328,
+ -0.362471,0.931175,0.03908,2.484537,-141.633497,198.262055,
+ -0.362471,0.931175,0.03908,1.718196,-141.926161,198.127587,
+ -0.362471,0.931175,0.03908,1.223831,-142.2027,200.131513,
+ -0.047115,0.944051,0.326416,4.219528,-142.668772,199.89726,
+ -0.047115,0.944051,0.326416,3.169346,-142.117822,198.15223,
+ -0.047115,0.944051,0.326416,3.431283,-142.657516,199.750928,
+ 0.993121,0.007248,-0.11687,4.497893,-142.950484,197.966044,
+ 0.993121,0.007248,-0.11687,4.734884,-143.508127,199.945328,
+ 0.993121,0.007248,-0.11687,4.761656,-144.890522,200.087096,
+ 0.328493,0.939317,0.098875,4.219528,-142.668772,199.89726,
+ 0.328493,0.939317,0.098875,4.128869,-142.463116,198.244714,
+ 0.328493,0.939317,0.098875,3.169346,-142.117822,198.15223,
+ -0.389472,0.920867,0.017733,2.484537,-141.633497,198.262055,
+ -0.389472,0.920867,0.017733,1.223831,-142.2027,200.131513,
+ -0.389472,0.920867,0.017733,2.284966,-141.746668,199.755796,
+ -0.924655,-0.139362,-0.35439,1.414275,-144.42293,198.036929,
+ -0.924655,-0.139362,-0.35439,1.354039,-147.557961,199.42693,
+ -0.924655,-0.139362,-0.35439,0.793962,-145.56012,200.102612,
+ -0.924601,-0.139415,-0.354508,1.354039,-147.557961,199.42693,
+ -0.924601,-0.139415,-0.354508,1.414275,-144.42293,198.036929,
+ -0.924601,-0.139415,-0.354508,1.832584,-145.914541,197.532525,
+ 0.956241,-0.151942,-0.250033,4.263336,-144.845193,198.153751,
+ 0.956241,-0.151942,-0.250033,4.761656,-144.890522,200.087096,
+ 0.956241,-0.151942,-0.250033,4.608935,-146.120501,200.250465,
+ 0.956212,-0.15213,-0.25003,4.761656,-144.890522,200.087096,
+ 0.956212,-0.15213,-0.25003,4.263336,-144.845193,198.153751,
+ 0.956212,-0.15213,-0.25003,4.392023,-143.962334,198.108726,
+ 0.961308,-0.134627,-0.240337,4.431268,-147.017659,200.042375,
+ 0.961308,-0.134627,-0.240337,4.263336,-144.845193,198.153751,
+ 0.961308,-0.134627,-0.240337,4.608935,-146.120501,200.250465,
+ 0.961272,-0.134713,-0.240433,4.263336,-144.845193,198.153751,
+ 0.961272,-0.134713,-0.240433,4.431268,-147.017659,200.042375,
+ 0.961272,-0.134713,-0.240433,4.128261,-145.504447,197.983081,
+ 0.85157,0.523915,0.018483,4.128869,-142.463116,198.244714,
+ 0.85157,0.523915,0.018483,4.219528,-142.668772,199.89726,
+ 0.85157,0.523915,0.018483,4.734884,-143.508127,199.945328,
+ 0.813211,0.578265,0.06555,4.497893,-142.950484,197.966044,
+ 0.813211,0.578265,0.06555,4.128869,-142.463116,198.244714,
+ 0.813211,0.578265,0.06555,4.734884,-143.508127,199.945328,
+ 0.586576,0.797908,0.138822,3.169346,-142.117822,198.15223,
+ 0.586576,0.797908,0.138822,2.484537,-141.633497,198.262055,
+ 0.586576,0.797908,0.138822,2.284966,-141.746668,199.755796,
+ 0.614499,0.772502,0.160102,3.431283,-142.657516,199.750928,
+ 0.614499,0.772502,0.160102,3.169346,-142.117822,198.15223,
+ 0.614499,0.772502,0.160102,2.284966,-141.746668,199.755796,
+ 0.128712,0.160502,-0.978607,1.942713,-143.807484,197.619229,
+ 0.128712,0.160502,-0.978607,3.749501,-144.536709,197.737268,
+ 0.128712,0.160502,-0.978607,1.980437,-144.325578,197.539218,
+ 0.010966,-0.133245,-0.991022,1.942713,-143.807484,197.619229,
+ 0.010966,-0.133245,-0.991022,3.838335,-143.821174,197.642045,
+ 0.010966,-0.133245,-0.991022,3.749501,-144.536709,197.737268,
+ -0.077056,0.247848,-0.96573,2.490013,-141.935287,197.734225,
+ -0.077056,0.247848,-0.96573,3.21072,-142.472243,197.538913,
+ -0.077056,0.247848,-0.96573,2.215602,-142.265979,197.671251,
+ -0.115027,0.080303,-0.990111,2.215602,-142.265979,197.671251,
+ -0.115027,0.080303,-0.990111,3.21072,-142.472243,197.538913,
+ -0.115027,0.080303,-0.990111,1.99504,-142.746958,197.657865,
+ -0.17151,0.896408,0.408701,4.873002,-149.40582,212.148678,
+ -0.17151,0.896408,0.408701,3.514336,-149.917525,212.700845,
+ -0.17151,0.896408,0.408701,4.856878,-149.549414,212.456857,
+ 0.280501,-0.467305,0.838418,4.856878,-149.549414,212.456857,
+ 0.280501,-0.467305,0.838418,3.514336,-149.917525,212.700845,
+ 0.280501,-0.467305,0.838418,3.380173,-150.326098,212.518006,
+ -0.035744,-0.242841,0.969407,3.514336,-149.917525,212.700845,
+ -0.035744,-0.242841,0.969407,2.185484,-150.183417,212.58524,
+ -0.035744,-0.242841,0.969407,2.111558,-150.508937,212.50097,
+ -0.290715,0.610723,0.736548,4.856878,-149.549414,212.456857,
+ -0.290715,0.610723,0.736548,3.380173,-150.326098,212.518006,
+ -0.290715,0.610723,0.736548,5.006861,-149.70183,212.642434,
+ 0.048547,-0.421227,0.905655,3.514336,-149.917525,212.700845,
+ 0.048547,-0.421227,0.905655,2.111558,-150.508937,212.50097,
+ 0.048547,-0.421227,0.905655,3.380173,-150.326098,212.518006,
+ 0.047605,0.161464,0.98573,3.73429,-149.666844,212.425826,
+ 0.047605,0.161464,0.98573,2.437686,-149.914179,212.528958,
+ 0.047605,0.161464,0.98573,2.185484,-150.183417,212.58524,
+ -0.209014,0.800162,0.562187,3.73429,-149.666844,212.425826,
+ -0.209014,0.800162,0.562187,2.185484,-150.183417,212.58524,
+ -0.209014,0.800162,0.562187,3.514336,-149.917525,212.700845,
+ 0.141182,-0.986882,0.078304,3.380173,-150.326098,212.518006,
+ 0.141182,-0.986882,0.078304,2.111558,-150.508937,212.50097,
+ 0.141182,-0.986882,0.078304,2.139851,-150.558526,211.824983,
+ 0.079935,-0.979404,0.185412,3.380173,-150.326098,212.518006,
+ 0.079935,-0.979404,0.185412,2.139851,-150.558526,211.824983,
+ 0.079935,-0.979404,0.185412,3.32663,-150.426188,212.012386,
+ 0.002625,-0.997819,0.065958,2.111558,-150.508937,212.50097,
+ 0.002625,-0.997819,0.065958,1.332135,-150.506503,212.568812,
+ 0.002625,-0.997819,0.065958,1.304146,-150.546053,211.97162,
+ -0.002063,-0.997324,0.073075,2.139851,-150.558526,211.824983,
+ -0.002063,-0.997324,0.073075,2.111558,-150.508937,212.50097,
+ -0.002063,-0.997324,0.073075,1.304146,-150.546053,211.97162,
+ -0.190985,0.870334,0.45392,2.437686,-149.914179,212.528958,
+ -0.190985,0.870334,0.45392,1.640618,-149.923914,212.212261,
+ -0.190985,0.870334,0.45392,1.511932,-150.200149,212.687764,
+ 0.14851,0.067132,0.98663,2.437686,-149.914179,212.528958,
+ 0.14851,0.067132,0.98663,1.511932,-150.200149,212.687764,
+ 0.14851,0.067132,0.98663,2.185484,-150.183417,212.58524,
+ 0.146219,-0.431464,0.890202,2.185484,-150.183417,212.58524,
+ 0.146219,-0.431464,0.890202,1.511932,-150.200149,212.687764,
+ 0.146219,-0.431464,0.890202,1.332135,-150.506503,212.568812,
+ 0.082729,-0.267324,0.960049,2.185484,-150.183417,212.58524,
+ 0.082729,-0.267324,0.960049,1.332135,-150.506503,212.568812,
+ 0.082729,-0.267324,0.960049,2.111558,-150.508937,212.50097,
+ -0.29218,-0.953273,0.076824,1.332135,-150.506503,212.568812,
+ -0.29218,-0.953273,0.076824,0.829556,-150.401546,211.959755,
+ -0.29218,-0.953273,0.076824,1.304146,-150.546053,211.97162,
+ -0.498519,-0.823964,0.269374,1.332135,-150.506503,212.568812,
+ -0.498519,-0.823964,0.269374,0.981973,-150.304194,212.539606,
+ -0.498519,-0.823964,0.269374,0.829556,-150.401546,211.959755,
+ -0.918182,-0.272906,0.287166,0.829556,-150.401546,211.959755,
+ -0.918182,-0.272906,0.287166,0.981973,-150.304194,212.539606,
+ -0.918182,-0.272906,0.287166,0.795787,-149.947643,212.283145,
+ -0.31732,-0.175614,0.931916,0.998705,-150.142955,212.523787,
+ -0.31732,-0.175614,0.931916,1.332135,-150.506503,212.568812,
+ -0.31732,-0.175614,0.931916,1.511932,-150.200149,212.687764,
+ -0.025074,0.100191,0.994652,0.998705,-150.142955,212.523787,
+ -0.025074,0.100191,0.994652,0.981973,-150.304194,212.539606,
+ -0.025074,0.100191,0.994652,1.332135,-150.506503,212.568812,
+ 0.263649,0.845664,0.464049,1.048902,-149.872804,212.002955,
+ 0.263649,0.845664,0.464049,0.795787,-149.947643,212.283145,
+ 0.263649,0.845664,0.464049,0.998705,-150.142955,212.523787,
+ -0.083369,0.887863,0.452492,1.640618,-149.923914,212.212261,
+ -0.083369,0.887863,0.452492,1.048902,-149.872804,212.002955,
+ -0.083369,0.887863,0.452492,0.998705,-150.142955,212.523787,
+ -0.059395,0.870052,0.489369,1.640618,-149.923914,212.212261,
+ -0.059395,0.870052,0.489369,0.998705,-150.142955,212.523787,
+ -0.059395,0.870052,0.489369,1.511932,-150.200149,212.687764,
+ -0.957686,-0.000492,-0.287816,1.360124,-143.13028,198.214596,
+ -0.957686,-0.000492,-0.287816,0.793962,-145.56012,200.102612,
+ -0.957686,-0.000492,-0.287816,0.7319,-143.817219,200.306138,
+ -0.957665,-0.000551,-0.287885,0.793962,-145.56012,200.102612,
+ -0.957665,-0.000551,-0.287885,1.360124,-143.13028,198.214596,
+ -0.957665,-0.000551,-0.287885,1.414275,-144.42293,198.036929,
+ -0.94374,0.266352,-0.195985,1.223831,-142.2027,200.131513,
+ -0.94374,0.266352,-0.195985,1.360124,-143.13028,198.214596,
+ -0.94374,0.266352,-0.195985,0.7319,-143.817219,200.306138,
+ -0.943698,0.266464,-0.196037,1.360124,-143.13028,198.214596,
+ -0.943698,0.266464,-0.196037,1.223831,-142.2027,200.131513,
+ -0.943698,0.266464,-0.196037,1.718196,-141.926161,198.127587,
+ 0.739641,-0.485771,-0.465786,3.293773,-148.445079,199.724765,
+ 0.739641,-0.485771,-0.465786,4.128261,-145.504447,197.983081,
+ 0.739641,-0.485771,-0.465786,4.431268,-147.017659,200.042375,
+ 0.739671,-0.485759,-0.465752,4.128261,-145.504447,197.983081,
+ 0.739671,-0.485759,-0.465752,3.293773,-148.445079,199.724765,
+ 0.739671,-0.485759,-0.465752,3.280083,-146.55037,197.726924,
+ 0.960696,-0.134742,-0.24271,4.497893,-142.950484,197.966044,
+ 0.960696,-0.134742,-0.24271,4.761656,-144.890522,200.087096,
+ 0.960696,-0.134742,-0.24271,4.392023,-143.962334,198.108726,
+ -0.223716,0.028287,0.974244,22.424311,-125.714046,213.937213,
+ -0.223716,0.028287,0.974244,21.197071,-126.230923,213.670408,
+ -0.223716,0.028287,0.974244,21.845373,-127.243686,213.848684,
+ 0.224525,-0.140785,0.964245,22.424311,-125.714046,213.937213,
+ 0.224525,-0.140785,0.964245,21.845373,-127.243686,213.848684,
+ 0.224525,-0.140785,0.964245,22.769606,-127.053242,213.661281,
+ 0.284157,-0.122659,0.950899,22.424311,-125.714046,213.937213,
+ 0.284157,-0.122659,0.950899,22.769606,-127.053242,213.661281,
+ 0.284157,-0.122659,0.950899,23.62904,-127.066932,213.402691,
+ -0.004029,-0.370556,0.928802,22.424311,-125.714046,213.937213,
+ -0.004029,-0.370556,0.928802,23.62904,-127.066932,213.402691,
+ -0.004029,-0.370556,0.928802,23.814008,-125.884716,213.875151,
+ -0.320197,-0.188428,0.928423,25.766216,-126.823248,213.38535,
+ -0.320197,-0.188428,0.928423,24.826162,-127.555212,212.912585,
+ -0.320197,-0.188428,0.928423,25.315964,-128.261621,212.93814,
+ -0.035706,-0.286497,0.957416,25.766216,-126.823248,213.38535,
+ -0.035706,-0.286497,0.957416,25.315964,-128.261621,212.93814,
+ -0.035706,-0.286497,0.957416,26.867812,-127.84605,213.120371,
+ -0.118461,0.006958,0.992934,26.867812,-127.84605,213.120371,
+ -0.118461,0.006958,0.992934,25.315964,-128.261621,212.93814,
+ -0.118461,0.006958,0.992934,25.819151,-128.985371,213.003244,
+ 0.051761,-0.149157,0.987458,26.867812,-127.84605,213.120371,
+ 0.051761,-0.149157,0.987458,25.819151,-128.985371,213.003244,
+ 0.051761,-0.149157,0.987458,27.267867,-130.124082,212.755301,
+ 0.042839,-0.207183,0.977364,23.702966,-131.975591,211.264602,
+ 0.042839,-0.207183,0.977364,25.695027,-133.38202,210.87915,
+ 0.042839,-0.207183,0.977364,25.379851,-132.092414,211.166338,
+ -0.159122,-0.464181,0.87133,23.702966,-131.975591,211.264602,
+ -0.159122,-0.464181,0.87133,24.337578,-133.206787,210.724604,
+ -0.159122,-0.464181,0.87133,25.695027,-133.38202,210.87915,
+ 0.135642,-0.338481,0.931145,23.702966,-131.975591,211.264602,
+ 0.135642,-0.338481,0.931145,21.704821,-132.302633,211.436793,
+ 0.135642,-0.338481,0.931145,24.337578,-133.206787,210.724604,
+ 0.719648,-0.149626,-0.678026,26.089302,-125.05966,200.663297,
+ 0.719648,-0.149626,-0.678026,27.179946,-126.147262,202.060904,
+ 0.719648,-0.149626,-0.678026,26.771373,-127.001219,201.815699,
+ 0.830268,-0.038362,-0.556042,25.687422,-125.507174,200.094094,
+ 0.830268,-0.038362,-0.556042,26.089302,-125.05966,200.663297,
+ 0.830268,-0.038362,-0.556042,26.771373,-127.001219,201.815699,
+ 0.482312,-0.488258,-0.72731,25.304707,-126.04413,200.200572,
+ 0.482312,-0.488258,-0.72731,26.771373,-127.001219,201.815699,
+ 0.482312,-0.488258,-0.72731,26.305605,-127.672947,201.957772,
+ 0.482445,-0.488092,-0.727332,26.771373,-127.001219,201.815699,
+ 0.482445,-0.488092,-0.727332,25.304707,-126.04413,200.200572,
+ 0.482445,-0.488092,-0.727332,25.687422,-125.507174,200.094094,
+ 0.359992,0.914755,0.183385,24.115799,-122.606091,204.168266,
+ 0.359992,0.914755,0.183385,24.743109,-122.354193,201.680319,
+ 0.359992,0.914755,0.183385,23.481187,-121.883254,201.808398,
+ 0.360154,0.914684,0.183418,24.743109,-122.354193,201.680319,
+ 0.360154,0.914684,0.183418,24.115799,-122.606091,204.168266,
+ 0.360154,0.914684,0.183418,25.708413,-123.202675,204.016153,
+ 0.461732,0.877733,0.128018,25.708413,-123.202675,204.016153,
+ 0.461732,0.877733,0.128018,25.71176,-122.843386,201.54068,
+ 0.461732,0.877733,0.128018,24.743109,-122.354193,201.680319,
+ 0.461632,0.877784,0.128025,25.71176,-122.843386,201.54068,
+ 0.461632,0.877784,0.128025,25.708413,-123.202675,204.016153,
+ 0.461632,0.877784,0.128025,26.883632,-123.782526,203.754216,
+ 0.139209,-0.231706,-0.962774,21.305983,-121.725057,201.251363,
+ 0.139209,-0.231706,-0.962774,22.70937,-121.945011,201.507215,
+ 0.139209,-0.231706,-0.962774,20.327597,-121.928583,201.158879,
+ -0.092344,0.383307,-0.918993,25.510971,-123.636803,200.676075,
+ -0.092344,0.383307,-0.918993,25.371332,-124.553735,200.307659,
+ -0.092344,0.383307,-0.918993,19.62058,-124.515403,200.901505,
+ -0.219755,-0.06992,-0.973046,20.590447,-125.390047,200.847961,
+ -0.219755,-0.06992,-0.973046,23.224117,-126.080637,200.302791,
+ -0.219755,-0.06992,-0.973046,22.038555,-126.308805,200.586937,
+ 0.103323,0.448676,-0.887702,20.327597,-121.928583,201.158879,
+ 0.103323,0.448676,-0.887702,24.08781,-122.467669,201.324072,
+ 0.103323,0.448676,-0.887702,19.784253,-122.495049,200.809325,
+ 0.120272,0.595525,-0.794282,20.327597,-121.928583,201.158879,
+ 0.120272,0.595525,-0.794282,22.70937,-121.945011,201.507215,
+ 0.120272,0.595525,-0.794282,24.08781,-122.467669,201.324072,
+ 0.002051,0.098989,-0.995086,19.784253,-122.495049,200.809325,
+ 0.002051,0.098989,-0.995086,25.010827,-123.016185,200.768255,
+ 0.002051,0.098989,-0.995086,19.5068,-123.415936,200.717145,
+ 0.071434,0.766708,-0.638009,25.010827,-123.016185,200.768255,
+ 0.071434,0.766708,-0.638009,19.784253,-122.495049,200.809325,
+ 0.071434,0.766708,-0.638009,24.08781,-122.467669,201.324072,
+ -0.001403,0.145811,-0.989311,25.010827,-123.016185,200.768255,
+ -0.001403,0.145811,-0.989311,25.510971,-123.636803,200.676075,
+ -0.001403,0.145811,-0.989311,19.5068,-123.415936,200.717145,
+ -0.012875,-0.166655,-0.985931,19.5068,-123.415936,200.717145,
+ -0.012875,-0.166655,-0.985931,25.510971,-123.636803,200.676075,
+ -0.012875,-0.166655,-0.985931,19.62058,-124.515403,200.901505,
+ -0.164719,-0.12274,-0.978674,19.62058,-124.515403,200.901505,
+ -0.164719,-0.12274,-0.978674,24.744022,-125.052663,200.106567,
+ -0.164719,-0.12274,-0.978674,20.590447,-125.390047,200.847961,
+ -0.087844,0.465421,-0.880719,19.62058,-124.515403,200.901505,
+ -0.087844,0.465421,-0.880719,25.371332,-124.553735,200.307659,
+ -0.087844,0.465421,-0.880719,24.744022,-125.052663,200.106567,
+ -0.181535,0.081338,-0.980015,24.744022,-125.052663,200.106567,
+ -0.181535,0.081338,-0.980015,23.224117,-126.080637,200.302791,
+ -0.181535,0.081338,-0.980015,20.590447,-125.390047,200.847961,
+ -0.490516,-0.591257,-0.640163,20.590447,-125.390047,200.847961,
+ -0.490516,-0.591257,-0.640163,22.038555,-126.308805,200.586937,
+ -0.490516,-0.591257,-0.640163,22.043118,-126.816555,201.0524,
+ -0.231221,-0.364724,-0.90195,20.590447,-125.390047,200.847961,
+ -0.231221,-0.364724,-0.90195,22.043118,-126.816555,201.0524,
+ -0.231221,-0.364724,-0.90195,20.055012,-126.170079,201.300647,
+ -0.320921,-0.300884,-0.898042,19.62058,-124.515403,200.901505,
+ -0.320921,-0.300884,-0.898042,20.590447,-125.390047,200.847961,
+ -0.320921,-0.300884,-0.898042,20.055012,-126.170079,201.300647,
+ -0.479825,-0.322773,-0.815834,19.62058,-124.515403,200.901505,
+ -0.479825,-0.322773,-0.815834,20.055012,-126.170079,201.300647,
+ -0.479825,-0.322773,-0.815834,18.92634,-124.789813,201.418382,
+ -0.48293,-0.19319,-0.854082,19.5068,-123.415936,200.717145,
+ -0.48293,-0.19319,-0.854082,19.62058,-124.515403,200.901505,
+ -0.48293,-0.19319,-0.854082,18.909912,-123.718031,201.12298,
+ -0.519208,-0.234476,-0.821854,18.909912,-123.718031,201.12298,
+ -0.519208,-0.234476,-0.821854,19.62058,-124.515403,200.901505,
+ -0.519208,-0.234476,-0.821854,18.92634,-124.789813,201.418382,
+ -0.70107,0.276999,-0.657095,19.5068,-123.415936,200.717145,
+ -0.70107,0.276999,-0.657095,19.355905,-122.280875,201.356624,
+ -0.70107,0.276999,-0.657095,19.784253,-122.495049,200.809325,
+ -0.63715,0.312283,-0.704641,19.355905,-122.280875,201.356624,
+ -0.63715,0.312283,-0.704641,19.5068,-123.415936,200.717145,
+ -0.63715,0.312283,-0.704641,18.909912,-123.718031,201.12298,
+ -0.379444,0.721422,-0.579287,20.327597,-121.928583,201.158879,
+ -0.379444,0.721422,-0.579287,19.784253,-122.495049,200.809325,
+ -0.379444,0.721422,-0.579287,19.355905,-122.280875,201.356624,
+ -0.361724,0.5947,-0.717975,19.802506,-121.63166,201.669367,
+ -0.361724,0.5947,-0.717975,20.327597,-121.928583,201.158879,
+ -0.361724,0.5947,-0.717975,19.355905,-122.280875,201.356624,
+ -0.153562,0.91154,-0.381463,21.305983,-121.725057,201.251363,
+ -0.153562,0.91154,-0.381463,20.327597,-121.928583,201.158879,
+ -0.153562,0.91154,-0.381463,20.815269,-121.481678,202.030481,
+ 0.038197,0.880359,-0.472767,20.815269,-121.481678,202.030481,
+ 0.038197,0.880359,-0.472767,20.327597,-121.928583,201.158879,
+ 0.038197,0.880359,-0.472767,19.802506,-121.63166,201.669367,
+ 0.184997,0.965173,-0.184982,22.70937,-121.945011,201.507215,
+ 0.184997,0.965173,-0.184982,21.305983,-121.725057,201.251363,
+ 0.184997,0.965173,-0.184982,20.815269,-121.481678,202.030481,
+ 0.098463,0.894655,-0.435773,23.481187,-121.883254,201.808398,
+ 0.098463,0.894655,-0.435773,22.70937,-121.945011,201.507215,
+ 0.098463,0.894655,-0.435773,20.815269,-121.481678,202.030481,
+ 0.55792,0.542853,-0.627723,25.71176,-122.843386,201.54068,
+ 0.55792,0.542853,-0.627723,25.510971,-123.636803,200.676075,
+ 0.55792,0.542853,-0.627723,25.010827,-123.016185,200.768255,
+ 0.575186,0.531789,-0.621579,25.71176,-122.843386,201.54068,
+ 0.575186,0.531789,-0.621579,26.30378,-123.787394,201.280873,
+ 0.575186,0.531789,-0.621579,25.510971,-123.636803,200.676075,
+ 0.617895,0.210304,-0.757613,25.510971,-123.636803,200.676075,
+ 0.617895,0.210304,-0.757613,26.30378,-123.787394,201.280873,
+ 0.617895,0.210304,-0.757613,25.371332,-124.553735,200.307659,
+ 0.575877,0.276395,-0.769397,26.30378,-123.787394,201.280873,
+ 0.575877,0.276395,-0.769397,26.089302,-125.05966,200.663297,
+ 0.575877,0.276395,-0.769397,25.371332,-124.553735,200.307659,
+ -0.046607,-0.120378,-0.991634,24.744022,-125.052663,200.106567,
+ -0.046607,-0.120378,-0.991634,25.304707,-126.04413,200.200572,
+ -0.046607,-0.120378,-0.991634,23.224117,-126.080637,200.302791,
+ -0.035912,-0.450724,-0.891941,25.304707,-126.04413,200.200572,
+ -0.035912,-0.450724,-0.891941,23.665547,-126.761186,200.62892,
+ -0.035912,-0.450724,-0.891941,23.224117,-126.080637,200.302791,
+ -0.198109,-0.525121,-0.827648,23.224117,-126.080637,200.302791,
+ -0.198109,-0.525121,-0.827648,23.665547,-126.761186,200.62892,
+ -0.198109,-0.525121,-0.827648,22.043118,-126.816555,201.0524,
+ -0.046476,-0.675241,-0.736131,23.224117,-126.080637,200.302791,
+ -0.046476,-0.675241,-0.736131,22.043118,-126.816555,201.0524,
+ -0.046476,-0.675241,-0.736131,22.038555,-126.308805,200.586937,
+ 0.379715,-0.107066,-0.918887,25.371332,-124.553735,200.307659,
+ 0.379715,-0.107066,-0.918887,26.089302,-125.05966,200.663297,
+ 0.379715,-0.107066,-0.918887,24.744022,-125.052663,200.106567,
+ 0.297556,0.637129,-0.711004,24.744022,-125.052663,200.106567,
+ 0.297556,0.637129,-0.711004,26.089302,-125.05966,200.663297,
+ 0.297556,0.637129,-0.711004,25.687422,-125.507174,200.094094,
+ -0.079914,-0.138783,-0.987093,24.744022,-125.052663,200.106567,
+ -0.079914,-0.138783,-0.987093,25.687422,-125.507174,200.094094,
+ -0.079914,-0.138783,-0.987093,25.304707,-126.04413,200.200572,
+ 0.193569,0.737308,-0.647231,24.08781,-122.467669,201.324072,
+ 0.193569,0.737308,-0.647231,22.70937,-121.945011,201.507215,
+ 0.193569,0.737308,-0.647231,23.481187,-121.883254,201.808398,
+ 0.21411,0.745412,-0.631282,24.743109,-122.354193,201.680319,
+ 0.21411,0.745412,-0.631282,24.08781,-122.467669,201.324072,
+ 0.21411,0.745412,-0.631282,23.481187,-121.883254,201.808398,
+ 0.337063,0.80621,-0.486223,25.71176,-122.843386,201.54068,
+ 0.337063,0.80621,-0.486223,25.010827,-123.016185,200.768255,
+ 0.337063,0.80621,-0.486223,24.743109,-122.354193,201.680319,
+ 0.15669,0.820596,-0.54961,25.010827,-123.016185,200.768255,
+ 0.15669,0.820596,-0.54961,24.08781,-122.467669,201.324072,
+ 0.15669,0.820596,-0.54961,24.743109,-122.354193,201.680319,
+ 0.84966,0.510998,-0.130229,26.883632,-123.782526,203.754216,
+ 0.84966,0.510998,-0.130229,27.619246,-124.593892,205.369952,
+ 0.84966,0.510998,-0.130229,28.120912,-125.625821,204.593875,
+ 0.843798,0.531012,-0.077654,27.529804,-124.879255,203.275976,
+ 0.843798,0.531012,-0.077654,26.883632,-123.782526,203.754216,
+ 0.843798,0.531012,-0.077654,28.120912,-125.625821,204.593875,
+ 0.930035,0.228893,-0.287478,27.529804,-124.879255,203.275976,
+ 0.930035,0.228893,-0.287478,28.120912,-125.625821,204.593875,
+ 0.930035,0.228893,-0.287478,28.100833,-126.776093,203.613056,
+ 0.876252,0.184701,-0.445048,27.179946,-126.147262,202.060904,
+ 0.876252,0.184701,-0.445048,27.529804,-124.879255,203.275976,
+ 0.876252,0.184701,-0.445048,28.100833,-126.776093,203.613056,
+ 0.099989,-0.718352,-0.688457,26.751902,-128.744425,203.140596,
+ 0.099989,-0.718352,-0.688457,24.925948,-129.386947,203.545823,
+ 0.099989,-0.718352,-0.688457,26.305605,-127.672947,201.957772,
+ 0.159538,-0.736975,-0.656822,26.305605,-127.672947,201.957772,
+ 0.159538,-0.736975,-0.656822,24.925948,-129.386947,203.545823,
+ 0.159538,-0.736975,-0.656822,24.335449,-128.712481,202.645623,
+ -0.114507,-0.829535,-0.546589,22.300188,-128.78154,203.177103,
+ -0.114507,-0.829535,-0.546589,24.925948,-129.386947,203.545823,
+ -0.114507,-0.829535,-0.546589,22.299275,-129.709729,204.585966,
+ -0.114547,-0.829623,-0.546448,24.925948,-129.386947,203.545823,
+ -0.114547,-0.829623,-0.546448,22.300188,-128.78154,203.177103,
+ -0.114547,-0.829623,-0.546448,24.335449,-128.712481,202.645623,
+ -0.494242,-0.708413,-0.503861,22.299275,-129.709729,204.585966,
+ -0.494242,-0.708413,-0.503861,22.206791,-130.729489,206.110434,
+ -0.494242,-0.708413,-0.503861,19.878258,-129.522326,206.697282,
+ -0.407241,-0.824044,-0.393835,22.299275,-129.709729,204.585966,
+ -0.407241,-0.824044,-0.393835,19.878258,-129.522326,206.697282,
+ -0.407241,-0.824044,-0.393835,19.950359,-128.735298,204.975981,
+ -0.787315,-0.547584,-0.28335,19.950359,-128.735298,204.975981,
+ -0.787315,-0.547584,-0.28335,19.878258,-129.522326,206.697282,
+ -0.787315,-0.547584,-0.28335,18.581654,-127.625488,206.634308,
+ -0.773137,-0.584068,-0.247232,18.663795,-126.966842,204.821435,
+ -0.773137,-0.584068,-0.247232,19.950359,-128.735298,204.975981,
+ -0.773137,-0.584068,-0.247232,18.581654,-127.625488,206.634308,
+ -0.987547,-0.128124,-0.091295,18.545147,-125.729562,204.368445,
+ -0.987547,-0.128124,-0.091295,18.663795,-126.966842,204.821435,
+ -0.987547,-0.128124,-0.091295,18.581654,-127.625488,206.634308,
+ -0.975764,0.159833,0.149459,18.545147,-125.729562,204.368445,
+ -0.975764,0.159833,0.149459,18.581654,-127.625488,206.634308,
+ -0.975764,0.159833,0.149459,18.720076,-126.360827,206.185577,
+ -0.947972,0.261199,0.181998,18.545147,-125.729562,204.368445,
+ -0.947972,0.261199,0.181998,18.720076,-126.360827,206.185577,
+ -0.947972,0.261199,0.181998,19.082103,-123.98301,204.658675,
+ -0.932578,0.284582,0.222061,19.082103,-123.98301,204.658675,
+ -0.932578,0.284582,0.222061,18.720076,-126.360827,206.185577,
+ -0.932578,0.284582,0.222061,19.316356,-124.631616,206.473678,
+ -0.912814,0.332761,0.236727,19.082103,-123.98301,204.658675,
+ -0.912814,0.332761,0.236727,19.316356,-124.631616,206.473678,
+ -0.912814,0.332761,0.236727,19.746833,-123.848543,207.032842,
+ -0.865649,0.451271,0.21681,19.082103,-123.98301,204.658675,
+ -0.865649,0.451271,0.21681,19.746833,-123.848543,207.032842,
+ -0.865649,0.451271,0.21681,19.598372,-123.252263,205.198978,
+ -0.344216,0.884327,0.315405,21.061691,-122.883847,205.76301,
+ -0.344216,0.884327,0.315405,19.598372,-123.252263,205.198978,
+ -0.344216,0.884327,0.315405,19.746833,-123.848543,207.032842,
+ -0.372702,0.883107,0.284982,21.061691,-122.883847,205.76301,
+ -0.372702,0.883107,0.284982,19.746833,-123.848543,207.032842,
+ -0.372702,0.883107,0.284982,20.974378,-123.463699,207.445674,
+ 0.049839,0.943464,0.327707,24.234142,-123.640758,207.459669,
+ 0.049839,0.943464,0.327707,21.061691,-122.883847,205.76301,
+ 0.049839,0.943464,0.327707,20.974378,-123.463699,207.445674,
+ 0.082344,0.958324,0.273558,24.234142,-123.640758,207.459669,
+ 0.082344,0.958324,0.273558,24.190334,-123.130269,205.68452,
+ 0.082344,0.958324,0.273558,21.061691,-122.883847,205.76301,
+ 0.894011,0.44794,-0.00971,27.619246,-124.593892,205.369952,
+ 0.894011,0.44794,-0.00971,27.737893,-124.79681,206.933056,
+ 0.894011,0.44794,-0.00971,28.374331,-126.077594,206.445689,
+ 0.89515,0.445552,-0.013802,28.120912,-125.625821,204.593875,
+ 0.89515,0.445552,-0.013802,27.619246,-124.593892,205.369952,
+ 0.89515,0.445552,-0.013802,28.374331,-126.077594,206.445689,
+ 0.974914,0.206513,-0.083035,28.120912,-125.625821,204.593875,
+ 0.974914,0.206513,-0.083035,28.374331,-126.077594,206.445689,
+ 0.974914,0.206513,-0.083035,28.599457,-127.574378,205.366301,
+ 0.966453,0.156672,-0.203524,28.100833,-126.776093,203.613056,
+ 0.966453,0.156672,-0.203524,28.120912,-125.625821,204.593875,
+ 0.966453,0.156672,-0.203524,28.599457,-127.574378,205.366301,
+ -0.005366,-0.735931,-0.677035,27.187552,-129.91721,204.411949,
+ -0.005366,-0.735931,-0.677035,25.226826,-130.700283,205.278684,
+ -0.005366,-0.735931,-0.677035,26.751902,-128.744425,203.140596,
+ 0.13756,-0.777748,-0.61334,26.751902,-128.744425,203.140596,
+ 0.13756,-0.777748,-0.61334,25.226826,-130.700283,205.278684,
+ 0.13756,-0.777748,-0.61334,24.925948,-129.386947,203.545823,
+ -0.132812,-0.800873,-0.583921,25.226826,-130.700283,205.278684,
+ -0.132812,-0.800873,-0.583921,22.299275,-129.709729,204.585966,
+ -0.132812,-0.800873,-0.583921,24.925948,-129.386947,203.545823,
+ -0.145264,-0.81827,-0.556177,25.226826,-130.700283,205.278684,
+ -0.145264,-0.81827,-0.556177,22.206791,-130.729489,206.110434,
+ -0.145264,-0.81827,-0.556177,22.299275,-129.709729,204.585966,
+ -0.593776,-0.667656,-0.449071,22.206791,-130.729489,206.110434,
+ -0.593776,-0.667656,-0.449071,21.928426,-131.965856,208.316669,
+ -0.593776,-0.667656,-0.449071,19.649177,-130.431349,209.048936,
+ -0.499222,-0.790733,-0.354285,22.206791,-130.729489,206.110434,
+ -0.499222,-0.790733,-0.354285,19.649177,-130.431349,209.048936,
+ -0.499222,-0.790733,-0.354285,19.878258,-129.522326,206.697282,
+ -0.868945,-0.427242,-0.249795,19.878258,-129.522326,206.697282,
+ -0.868945,-0.427242,-0.249795,19.649177,-130.431349,209.048936,
+ -0.868945,-0.427242,-0.249795,18.638848,-128.385744,209.064756,
+ -0.812982,-0.560912,-0.156325,18.581654,-127.625488,206.634308,
+ -0.812982,-0.560912,-0.156325,19.878258,-129.522326,206.697282,
+ -0.812982,-0.560912,-0.156325,18.638848,-128.385744,209.064756,
+ -0.989284,0.131091,0.064286,18.720076,-126.360827,206.185577,
+ -0.989284,0.131091,0.064286,18.581654,-127.625488,206.634308,
+ -0.989284,0.131091,0.064286,18.638848,-128.385744,209.064756,
+ -0.934084,0.303924,0.187396,18.720076,-126.360827,206.185577,
+ -0.934084,0.303924,0.187396,18.638848,-128.385744,209.064756,
+ -0.934084,0.303924,0.187396,18.922994,-127.193185,208.546966,
+ -0.938292,0.292913,0.183877,18.720076,-126.360827,206.185577,
+ -0.938292,0.292913,0.183877,18.922994,-127.193185,208.546966,
+ -0.938292,0.292913,0.183877,19.316356,-124.631616,206.473678,
+ 0.160463,-0.548239,0.820784,22.575511,-131.227504,211.984701,
+ 0.160463,-0.548239,0.820784,21.704821,-132.302633,211.436793,
+ 0.160463,-0.548239,0.820784,23.702966,-131.975591,211.264602,
+ -0.150015,-0.388787,0.909033,25.819151,-128.985371,213.003244,
+ -0.150015,-0.388787,0.909033,26.185741,-131.06444,212.174537,
+ -0.150015,-0.388787,0.909033,27.267867,-130.124082,212.755301,
+ 0.06629,-0.578418,0.813042,27.267867,-130.124082,212.755301,
+ 0.06629,-0.578418,0.813042,26.185741,-131.06444,212.174537,
+ 0.06629,-0.578418,0.813042,27.153479,-132.013619,211.420365,
+ -0.076527,-0.666929,0.741181,26.185741,-131.06444,212.174537,
+ -0.076527,-0.666929,0.741181,25.379851,-132.092414,211.166338,
+ -0.076527,-0.666929,0.741181,27.153479,-132.013619,211.420365,
+ -0.12678,-0.245036,0.961189,27.153479,-132.013619,211.420365,
+ -0.12678,-0.245036,0.961189,25.379851,-132.092414,211.166338,
+ -0.12678,-0.245036,0.961189,25.695027,-133.38202,210.87915,
+ 0.323037,-0.394356,0.860309,23.814008,-125.884716,213.875151,
+ 0.323037,-0.394356,0.860309,23.62904,-127.066932,213.402691,
+ 0.323037,-0.394356,0.860309,24.301376,-127.303314,213.041881,
+ -0.085826,-0.526368,0.845914,23.814008,-125.884716,213.875151,
+ -0.085826,-0.526368,0.845914,24.301376,-127.303314,213.041881,
+ -0.085826,-0.526368,0.845914,24.893396,-126.425931,213.647896,
+ -0.053923,-0.542604,0.838256,24.893396,-126.425931,213.647896,
+ -0.053923,-0.542604,0.838256,24.301376,-127.303314,213.041881,
+ -0.053923,-0.542604,0.838256,24.826162,-127.555212,212.912585,
+ 0.003589,-0.545801,0.837907,24.893396,-126.425931,213.647896,
+ 0.003589,-0.545801,0.837907,24.826162,-127.555212,212.912585,
+ 0.003589,-0.545801,0.837907,25.766216,-126.823248,213.38535,
+ -0.212856,-0.462033,0.86094,25.819151,-128.985371,213.003244,
+ -0.212856,-0.462033,0.86094,23.735823,-129.28351,212.32817,
+ -0.212856,-0.462033,0.86094,23.814617,-129.914472,212.009039,
+ 0.368541,-0.382513,0.847267,23.735823,-129.28351,212.32817,
+ 0.368541,-0.382513,0.847267,21.569441,-130.468464,212.735527,
+ 0.368541,-0.382513,0.847267,23.814617,-129.914472,212.009039,
+ 0.376426,-0.401106,0.835115,23.735823,-129.28351,212.32817,
+ 0.376426,-0.401106,0.835115,21.185206,-129.591385,213.329981,
+ 0.376426,-0.401106,0.835115,21.569441,-130.468464,212.735527,
+ 0.280995,-0.176917,0.943261,22.769606,-127.053242,213.661281,
+ 0.280995,-0.176917,0.943261,22.9564,-127.525398,213.517079,
+ 0.280995,-0.176917,0.943261,23.62904,-127.066932,213.402691,
+ 0.233843,-0.198197,0.951859,22.769606,-127.053242,213.661281,
+ 0.233843,-0.198197,0.951859,21.845373,-127.243686,213.848684,
+ 0.233843,-0.198197,0.951859,22.9564,-127.525398,213.517079,
+ 0.36188,-0.311731,0.878559,23.62904,-127.066932,213.402691,
+ 0.36188,-0.311731,0.878559,22.9564,-127.525398,213.517079,
+ 0.36188,-0.311731,0.878559,24.301376,-127.303314,213.041881,
+ 0.363113,-0.426261,0.828523,24.301376,-127.303314,213.041881,
+ 0.363113,-0.426261,0.828523,22.9564,-127.525398,213.517079,
+ 0.363113,-0.426261,0.828523,23.094518,-128.009115,213.207683,
+ 0.192548,-0.099921,0.976187,24.301376,-127.303314,213.041881,
+ 0.192548,-0.099921,0.976187,23.094518,-128.009115,213.207683,
+ 0.192548,-0.099921,0.976187,24.826162,-127.555212,212.912585,
+ 0.128412,-0.501006,0.855864,21.845373,-127.243686,213.848684,
+ 0.128412,-0.501006,0.855864,21.417329,-127.878298,213.541417,
+ 0.128412,-0.501006,0.855864,22.9564,-127.525398,213.517079,
+ 0.129877,-0.507682,0.851699,22.9564,-127.525398,213.517079,
+ 0.129877,-0.507682,0.851699,21.417329,-127.878298,213.541417,
+ 0.129877,-0.507682,0.851699,23.094518,-128.009115,213.207683,
+ 0.277127,-0.541003,0.79405,24.826162,-127.555212,212.912585,
+ 0.277127,-0.541003,0.79405,23.094518,-128.009115,213.207683,
+ 0.277127,-0.541003,0.79405,23.436466,-128.598397,212.686851,
+ -0.123579,-0.049832,0.991083,24.826162,-127.555212,212.912585,
+ -0.123579,-0.049832,0.991083,23.436466,-128.598397,212.686851,
+ -0.123579,-0.049832,0.991083,25.315964,-128.261621,212.93814,
+ 0.202023,0.106327,0.973592,21.417329,-127.878298,213.541417,
+ 0.202023,0.106327,0.973592,21.007539,-128.670803,213.713,
+ 0.202023,0.106327,0.973592,23.094518,-128.009115,213.207683,
+ 0.350013,-0.498088,0.793347,23.094518,-128.009115,213.207683,
+ 0.350013,-0.498088,0.793347,21.007539,-128.670803,213.713,
+ 0.350013,-0.498088,0.793347,23.436466,-128.598397,212.686851,
+ -0.032539,-0.474693,0.87955,25.315964,-128.261621,212.93814,
+ -0.032539,-0.474693,0.87955,23.436466,-128.598397,212.686851,
+ -0.032539,-0.474693,0.87955,23.735823,-129.28351,212.32817,
+ -0.290968,-0.116878,0.949567,25.315964,-128.261621,212.93814,
+ -0.290968,-0.116878,0.949567,23.735823,-129.28351,212.32817,
+ -0.290968,-0.116878,0.949567,25.819151,-128.985371,213.003244,
+ 0.379579,-0.291992,0.877873,23.436466,-128.598397,212.686851,
+ 0.379579,-0.291992,0.877873,21.007539,-128.670803,213.713,
+ 0.379579,-0.291992,0.877873,21.185206,-129.591385,213.329981,
+ 0.37997,-0.293261,0.877281,23.436466,-128.598397,212.686851,
+ 0.37997,-0.293261,0.877281,21.185206,-129.591385,213.329981,
+ 0.37997,-0.293261,0.877281,23.735823,-129.28351,212.32817,
+ -0.263056,-0.380952,0.886384,25.819151,-128.985371,213.003244,
+ -0.263056,-0.380952,0.886384,23.814617,-129.914472,212.009039,
+ -0.263056,-0.380952,0.886384,24.39386,-130.252161,212.035811,
+ -0.248008,-0.396117,0.884072,25.819151,-128.985371,213.003244,
+ -0.248008,-0.396117,0.884072,24.39386,-130.252161,212.035811,
+ -0.248008,-0.396117,0.884072,26.185741,-131.06444,212.174537,
+ 0.366632,-0.361876,0.857104,23.814617,-129.914472,212.009039,
+ 0.366632,-0.361876,0.857104,21.569441,-130.468464,212.735527,
+ 0.366632,-0.361876,0.857104,22.575511,-131.227504,211.984701,
+ -0.036757,0.016166,0.999193,23.814617,-129.914472,212.009039,
+ -0.036757,0.016166,0.999193,22.575511,-131.227504,211.984701,
+ -0.036757,0.016166,0.999193,24.39386,-130.252161,212.035811,
+ 0.024248,-0.416417,0.90885,24.39386,-130.252161,212.035811,
+ 0.024248,-0.416417,0.90885,23.702966,-131.975591,211.264602,
+ 0.024248,-0.416417,0.90885,25.379851,-132.092414,211.166338,
+ -0.303614,-0.535135,0.78832,24.39386,-130.252161,212.035811,
+ -0.303614,-0.535135,0.78832,25.379851,-132.092414,211.166338,
+ -0.303614,-0.535135,0.78832,26.185741,-131.06444,212.174537,
+ 0.229672,-0.472762,0.850733,24.39386,-130.252161,212.035811,
+ 0.229672,-0.472762,0.850733,22.575511,-131.227504,211.984701,
+ 0.229672,-0.472762,0.850733,23.702966,-131.975591,211.264602,
+ -0.310741,-0.716186,-0.624914,20.055012,-126.170079,201.300647,
+ -0.310741,-0.716186,-0.624914,22.300188,-128.78154,203.177103,
+ -0.310741,-0.716186,-0.624914,19.806461,-127.967132,203.483761,
+ -0.310912,-0.716233,-0.624775,22.300188,-128.78154,203.177103,
+ -0.310912,-0.716233,-0.624775,20.055012,-126.170079,201.300647,
+ -0.310912,-0.716233,-0.624775,22.043118,-126.816555,201.0524,
+ -0.688361,-0.519628,-0.506108,18.444145,-126.09311,203.412572,
+ -0.688361,-0.519628,-0.506108,20.055012,-126.170079,201.300647,
+ -0.688361,-0.519628,-0.506108,19.806461,-127.967132,203.483761,
+ -0.68833,-0.519694,-0.506083,20.055012,-126.170079,201.300647,
+ -0.68833,-0.519694,-0.506083,18.444145,-126.09311,203.412572,
+ -0.68833,-0.519694,-0.506083,18.92634,-124.789813,201.418382,
+ -0.951681,-0.094818,-0.292085,18.436843,-124.749047,203.000044,
+ -0.951681,-0.094818,-0.292085,18.92634,-124.789813,201.418382,
+ -0.951681,-0.094818,-0.292085,18.444145,-126.09311,203.412572,
+ -0.951658,-0.095087,-0.292071,18.92634,-124.789813,201.418382,
+ -0.951658,-0.095087,-0.292071,18.436843,-124.749047,203.000044,
+ -0.951658,-0.095087,-0.292071,18.909912,-123.718031,201.12298,
+ -0.949347,0.306037,-0.071288,19.355905,-122.280875,201.356624,
+ -0.949347,0.306037,-0.071288,18.436843,-124.749047,203.000044,
+ -0.949347,0.306037,-0.071288,18.980188,-122.994889,203.294838,
+ -0.949322,0.30616,-0.071089,18.436843,-124.749047,203.000044,
+ -0.949322,0.30616,-0.071089,19.355905,-122.280875,201.356624,
+ -0.949322,0.30616,-0.071089,18.909912,-123.718031,201.12298,
+ -0.832492,0.552431,0.042152,19.802506,-121.63166,201.669367,
+ -0.832492,0.552431,0.042152,18.980188,-122.994889,203.294838,
+ -0.832492,0.552431,0.042152,19.504366,-122.246802,203.84305,
+ -0.832512,0.552404,0.042119,18.980188,-122.994889,203.294838,
+ -0.832512,0.552404,0.042119,19.802506,-121.63166,201.669367,
+ -0.832512,0.552404,0.042119,19.355905,-122.280875,201.356624,
+ -0.224259,0.945331,0.236765,20.76203,-122.06518,204.309121,
+ -0.224259,0.945331,0.236765,19.802506,-121.63166,201.669367,
+ -0.224259,0.945331,0.236765,19.504366,-122.246802,203.84305,
+ -0.224429,0.945277,0.236818,19.802506,-121.63166,201.669367,
+ -0.224429,0.945277,0.236818,20.76203,-122.06518,204.309121,
+ -0.224429,0.945277,0.236818,20.815269,-121.481678,202.030481,
+ 0.164396,0.954632,0.248298,24.115799,-122.606091,204.168266,
+ 0.164396,0.954632,0.248298,20.815269,-121.481678,202.030481,
+ 0.164396,0.954632,0.248298,20.76203,-122.06518,204.309121,
+ 0.164477,0.954648,0.248182,20.815269,-121.481678,202.030481,
+ 0.164477,0.954648,0.248182,24.115799,-122.606091,204.168266,
+ 0.164477,0.954648,0.248182,23.481187,-121.883254,201.808398,
+ 0.80727,0.558639,-0.190364,27.529804,-124.879255,203.275976,
+ 0.80727,0.558639,-0.190364,25.71176,-122.843386,201.54068,
+ 0.80727,0.558639,-0.190364,26.883632,-123.782526,203.754216,
+ 0.807266,0.558651,-0.190345,25.71176,-122.843386,201.54068,
+ 0.807266,0.558651,-0.190345,27.529804,-124.879255,203.275976,
+ 0.807266,0.558651,-0.190345,26.30378,-123.787394,201.280873,
+ 0.878982,0.180447,-0.441395,26.30378,-123.787394,201.280873,
+ 0.878982,0.180447,-0.441395,27.529804,-124.879255,203.275976,
+ 0.878982,0.180447,-0.441395,27.179946,-126.147262,202.060904,
+ 0.827314,0.126234,-0.547373,26.089302,-125.05966,200.663297,
+ 0.827314,0.126234,-0.547373,26.30378,-123.787394,201.280873,
+ 0.827314,0.126234,-0.547373,27.179946,-126.147262,202.060904,
+ 0.118011,-0.693766,-0.710466,23.665547,-126.761186,200.62892,
+ 0.118011,-0.693766,-0.710466,26.305605,-127.672947,201.957772,
+ 0.118011,-0.693766,-0.710466,24.335449,-128.712481,202.645623,
+ 0.117914,-0.693892,-0.710359,26.305605,-127.672947,201.957772,
+ 0.117914,-0.693892,-0.710359,23.665547,-126.761186,200.62892,
+ 0.117914,-0.693892,-0.710359,25.304707,-126.04413,200.200572,
+ -0.147669,-0.734956,-0.661841,23.665547,-126.761186,200.62892,
+ -0.147669,-0.734956,-0.661841,22.300188,-128.78154,203.177103,
+ -0.147669,-0.734956,-0.661841,22.043118,-126.816555,201.0524,
+ -0.14791,-0.73486,-0.661894,22.300188,-128.78154,203.177103,
+ -0.14791,-0.73486,-0.661894,23.665547,-126.761186,200.62892,
+ -0.14791,-0.73486,-0.661894,24.335449,-128.712481,202.645623,
+ -0.806519,-0.040763,0.589801,18.808301,-129.032525,211.852972,
+ -0.806519,-0.040763,0.589801,19.658304,-129.13657,213.008112,
+ -0.806519,-0.040763,0.589801,19.465121,-128.043492,212.819493,
+ -0.873019,-0.071035,0.482484,19.465121,-128.043492,212.819493,
+ -0.873019,-0.071035,0.482484,19.658304,-129.13657,213.008112,
+ -0.873019,-0.071035,0.482484,19.911723,-128.417992,213.572448,
+ -0.771183,0.254002,0.583747,19.465121,-128.043492,212.819493,
+ -0.771183,0.254002,0.583747,19.911723,-128.417992,213.572448,
+ -0.771183,0.254002,0.583747,19.838405,-127.168847,212.932056,
+ -0.71745,0.283992,0.636093,19.838405,-127.168847,212.932056,
+ -0.71745,0.283992,0.636093,19.911723,-128.417992,213.572448,
+ -0.71745,0.283992,0.636093,20.327902,-127.735921,213.737337,
+ -0.634179,0.39579,0.664204,21.197071,-126.230923,213.670408,
+ -0.634179,0.39579,0.664204,19.838405,-127.168847,212.932056,
+ -0.634179,0.39579,0.664204,20.327902,-127.735921,213.737337,
+ -0.635195,0.400034,0.660682,21.027618,-125.316729,212.95396,
+ -0.635195,0.400034,0.660682,19.838405,-127.168847,212.932056,
+ -0.635195,0.400034,0.660682,21.197071,-126.230923,213.670408,
+ -0.476842,0.485736,0.732586,22.521359,-124.835447,213.607129,
+ -0.476842,0.485736,0.732586,21.027618,-125.316729,212.95396,
+ -0.476842,0.485736,0.732586,21.197071,-126.230923,213.670408,
+ -0.341486,0.363371,0.866804,22.521359,-124.835447,213.607129,
+ -0.341486,0.363371,0.866804,21.197071,-126.230923,213.670408,
+ -0.341486,0.363371,0.866804,22.424311,-125.714046,213.937213,
+ 0.083834,0.342326,0.935834,22.521359,-124.835447,213.607129,
+ 0.083834,0.342326,0.935834,22.424311,-125.714046,213.937213,
+ 0.083834,0.342326,0.935834,23.814008,-125.884716,213.875151,
+ 0.07086,0.327928,0.942041,22.521359,-124.835447,213.607129,
+ 0.07086,0.327928,0.942041,23.814008,-125.884716,213.875151,
+ 0.07086,0.327928,0.942041,23.816442,-125.11442,213.606825,
+ 0.302364,0.079574,0.949865,26.147409,-126.437796,213.231717,
+ 0.302364,0.079574,0.949865,25.766216,-126.823248,213.38535,
+ 0.302364,0.079574,0.949865,26.867812,-127.84605,213.120371,
+ 0.614311,0.25522,0.746649,26.147409,-126.437796,213.231717,
+ 0.614311,0.25522,0.746649,26.867812,-127.84605,213.120371,
+ 0.614311,0.25522,0.746649,27.192724,-127.656214,212.788158,
+ 0.711342,0.012303,0.702739,27.267867,-130.124082,212.755301,
+ 0.711342,0.012303,0.702739,27.192724,-127.656214,212.788158,
+ 0.711342,0.012303,0.702739,26.867812,-127.84605,213.120371,
+ 0.345503,-0.001974,0.938416,27.192724,-127.656214,212.788158,
+ 0.345503,-0.001974,0.938416,27.267867,-130.124082,212.755301,
+ 0.345503,-0.001974,0.938416,27.61955,-129.746236,212.626614,
+ -0.167208,-0.83991,0.516326,26.142541,-133.671034,210.553934,
+ -0.167208,-0.83991,0.516326,25.695027,-133.38202,210.87915,
+ -0.167208,-0.83991,0.516326,24.337578,-133.206787,210.724604,
+ -0.133652,-0.755443,0.641438,26.142541,-133.671034,210.553934,
+ -0.133652,-0.755443,0.641438,24.337578,-133.206787,210.724604,
+ -0.133652,-0.755443,0.641438,24.353398,-133.733704,210.107333,
+ -0.160236,-0.752775,0.638479,24.353398,-133.733704,210.107333,
+ -0.160236,-0.752775,0.638479,24.337578,-133.206787,210.724604,
+ -0.160236,-0.752775,0.638479,21.481825,-132.525629,210.811004,
+ -0.20222,-0.897515,0.391884,24.337578,-133.206787,210.724604,
+ -0.20222,-0.897515,0.391884,21.704821,-132.302633,211.436793,
+ -0.20222,-0.897515,0.391884,21.481825,-132.525629,210.811004,
+ 0.688388,-0.44587,0.57212,27.153479,-132.013619,211.420365,
+ 0.688388,-0.44587,0.57212,27.61955,-129.746236,212.626614,
+ 0.688388,-0.44587,0.57212,27.267867,-130.124082,212.755301,
+ 0.663571,-0.453097,0.595295,27.394728,-132.069597,211.108839,
+ 0.663571,-0.453097,0.595295,27.61955,-129.746236,212.626614,
+ 0.663571,-0.453097,0.595295,27.153479,-132.013619,211.420365,
+ 0.484333,-0.715393,0.503622,27.394728,-132.069597,211.108839,
+ 0.484333,-0.715393,0.503622,27.153479,-132.013619,211.420365,
+ 0.484333,-0.715393,0.503622,25.695027,-133.38202,210.87915,
+ 0.274594,-0.499428,0.821687,27.394728,-132.069597,211.108839,
+ 0.274594,-0.499428,0.821687,25.695027,-133.38202,210.87915,
+ 0.274594,-0.499428,0.821687,26.142541,-133.671034,210.553934,
+ 0.341485,0.308218,0.887913,23.816442,-125.11442,213.606825,
+ 0.341485,0.308218,0.887913,23.814008,-125.884716,213.875151,
+ 0.341485,0.308218,0.887913,24.893396,-126.425931,213.647896,
+ 0.221817,0.211951,0.951774,23.816442,-125.11442,213.606825,
+ 0.221817,0.211951,0.951774,24.893396,-126.425931,213.647896,
+ 0.221817,0.211951,0.951774,25.131604,-125.802271,213.453496,
+ 0.348602,0.154984,0.924368,25.131604,-125.802271,213.453496,
+ 0.348602,0.154984,0.924368,24.893396,-126.425931,213.647896,
+ 0.348602,0.154984,0.924368,25.766216,-126.823248,213.38535,
+ 0.275958,0.107778,0.955108,25.131604,-125.802271,213.453496,
+ 0.275958,0.107778,0.955108,25.766216,-126.823248,213.38535,
+ 0.275958,0.107778,0.955108,26.147409,-126.437796,213.231717,
+ 0.181649,-0.559299,0.808819,21.569441,-130.468464,212.735527,
+ 0.181649,-0.559299,0.808819,21.704821,-132.302633,211.436793,
+ 0.181649,-0.559299,0.808819,22.575511,-131.227504,211.984701,
+ -0.157593,-0.578378,0.800402,21.569441,-130.468464,212.735527,
+ -0.157593,-0.578378,0.800402,20.239372,-130.746829,212.272497,
+ -0.157593,-0.578378,0.800402,21.704821,-132.302633,211.436793,
+ -0.148725,-0.598625,0.787102,21.185206,-129.591385,213.329981,
+ -0.148725,-0.598625,0.787102,20.239372,-130.746829,212.272497,
+ -0.148725,-0.598625,0.787102,21.569441,-130.468464,212.735527,
+ -0.316535,-0.486288,0.81445,19.658304,-129.13657,213.008112,
+ -0.316535,-0.486288,0.81445,20.239372,-130.746829,212.272497,
+ -0.316535,-0.486288,0.81445,21.185206,-129.591385,213.329981,
+ -0.320585,-0.512533,0.796577,19.911723,-128.417992,213.572448,
+ -0.320585,-0.512533,0.796577,19.658304,-129.13657,213.008112,
+ -0.320585,-0.512533,0.796577,21.185206,-129.591385,213.329981,
+ -0.208432,-0.409721,0.888079,19.911723,-128.417992,213.572448,
+ -0.208432,-0.409721,0.888079,21.185206,-129.591385,213.329981,
+ -0.208432,-0.409721,0.888079,21.007539,-128.670803,213.713,
+ -0.157695,-0.140088,0.977501,20.327902,-127.735921,213.737337,
+ -0.157695,-0.140088,0.977501,19.911723,-128.417992,213.572448,
+ -0.157695,-0.140088,0.977501,21.007539,-128.670803,213.713,
+ 0.190134,0.112834,0.975253,20.327902,-127.735921,213.737337,
+ 0.190134,0.112834,0.975253,21.007539,-128.670803,213.713,
+ 0.190134,0.112834,0.975253,21.417329,-127.878298,213.541417,
+ 0.093196,-0.484111,0.870029,21.845373,-127.243686,213.848684,
+ 0.093196,-0.484111,0.870029,20.327902,-127.735921,213.737337,
+ 0.093196,-0.484111,0.870029,21.417329,-127.878298,213.541417,
+ -0.106815,0.105655,0.988649,21.197071,-126.230923,213.670408,
+ -0.106815,0.105655,0.988649,20.327902,-127.735921,213.737337,
+ -0.106815,0.105655,0.988649,21.845373,-127.243686,213.848684,
+ -0.054928,0.217213,-0.974578,6.550495,-140.36549,197.337213,
+ -0.054928,0.217213,-0.974578,7.019609,-140.768283,197.220999,
+ -0.054928,0.217213,-0.974578,6.072558,-141.080113,197.204875,
+ -0.163412,0.364379,-0.916801,7.437613,-141.654792,197.17141,
+ -0.163412,0.364379,-0.916801,7.549872,-142.366069,196.868707,
+ -0.163412,0.364379,-0.916801,6.483565,-142.564119,196.980053,
+ -0.041093,0.246856,-0.96818,7.437613,-141.654792,197.17141,
+ -0.041093,0.246856,-0.96818,6.483565,-142.564119,196.980053,
+ -0.041093,0.246856,-0.96818,6.209155,-142.076447,197.116042,
+ -0.168739,0.402706,-0.899642,7.549872,-142.366069,196.868707,
+ -0.168739,0.402706,-0.899642,7.316532,-143.032016,196.614376,
+ -0.168739,0.402706,-0.899642,6.483565,-142.564119,196.980053,
+ -0.130944,0.455194,-0.880711,6.483565,-142.564119,196.980053,
+ -0.130944,0.455194,-0.880711,7.316532,-143.032016,196.614376,
+ -0.130944,0.455194,-0.880711,6.684353,-142.877774,196.788088,
+ -0.729385,-0.049319,-0.682323,6.684353,-142.877774,196.788088,
+ -0.729385,-0.049319,-0.682323,5.969122,-142.771904,197.544998,
+ -0.729385,-0.049319,-0.682323,6.483565,-142.564119,196.980053,
+ -0.721877,0.055058,-0.689828,6.684353,-142.877774,196.788088,
+ -0.721877,0.055058,-0.689828,6.328715,-143.614606,197.101439,
+ -0.721877,0.055058,-0.689828,5.969122,-142.771904,197.544998,
+ -0.871566,0.001355,-0.490276,6.076513,-141.641711,197.182058,
+ -0.871566,0.001355,-0.490276,5.690148,-141.717158,197.868693,
+ -0.871566,0.001355,-0.490276,5.650599,-140.73786,197.941706,
+ -0.864812,0.014301,-0.501892,6.076513,-141.641711,197.182058,
+ -0.864812,0.014301,-0.501892,5.650599,-140.73786,197.941706,
+ -0.864812,0.014301,-0.501892,6.072558,-141.080113,197.204875,
+ -0.77204,0.278315,-0.571397,6.072558,-141.080113,197.204875,
+ -0.77204,0.278315,-0.571397,5.650599,-140.73786,197.941706,
+ -0.77204,0.278315,-0.571397,5.97764,-140.101727,197.809673,
+ -0.966694,0.060013,-0.248798,6.072558,-141.080113,197.204875,
+ -0.966694,0.060013,-0.248798,5.97764,-140.101727,197.809673,
+ -0.966694,0.060013,-0.248798,6.096592,-140.489918,197.253855,
+ -0.417441,0.700633,-0.578668,6.760105,-139.870213,197.525528,
+ -0.417441,0.700633,-0.578668,6.096592,-140.489918,197.253855,
+ -0.417441,0.700633,-0.578668,5.97764,-140.101727,197.809673,
+ 0.084695,0.322604,-0.942737,6.760105,-139.870213,197.525528,
+ 0.084695,0.322604,-0.942737,6.550495,-140.36549,197.337213,
+ 0.084695,0.322604,-0.942737,6.096592,-140.489918,197.253855,
+ 0.30884,0.221027,-0.925076,6.760105,-139.870213,197.525528,
+ 0.30884,0.221027,-0.925076,7.682209,-140.724474,197.629268,
+ 0.30884,0.221027,-0.925076,6.550495,-140.36549,197.337213,
+ 0.375477,0.632707,-0.677273,6.550495,-140.36549,197.337213,
+ 0.375477,0.632707,-0.677273,7.682209,-140.724474,197.629268,
+ 0.375477,0.632707,-0.677273,7.019609,-140.768283,197.220999,
+ 0.467059,0.379347,-0.798719,7.682209,-140.724474,197.629268,
+ 0.467059,0.379347,-0.798719,8.228596,-142.215174,197.240774,
+ 0.467059,0.379347,-0.798719,7.019609,-140.768283,197.220999,
+ 0.185883,0.142032,-0.972252,7.019609,-140.768283,197.220999,
+ 0.185883,0.142032,-0.972252,8.228596,-142.215174,197.240774,
+ 0.185883,0.142032,-0.972252,7.437613,-141.654792,197.17141,
+ 0.302201,0.315206,-0.899622,7.437613,-141.654792,197.17141,
+ 0.302201,0.315206,-0.899622,8.228596,-142.215174,197.240774,
+ 0.302201,0.315206,-0.899622,8.408393,-143.129064,196.980966,
+ 0.465156,0.407793,-0.785706,7.437613,-141.654792,197.17141,
+ 0.465156,0.407793,-0.785706,8.408393,-143.129064,196.980966,
+ 0.465156,0.407793,-0.785706,7.549872,-142.366069,196.868707,
+ 0.317113,0.221126,-0.922249,7.549872,-142.366069,196.868707,
+ 0.317113,0.221126,-0.922249,8.408393,-143.129064,196.980966,
+ 0.317113,0.221126,-0.922249,7.709589,-143.993365,196.533452,
+ 0.355968,0.221954,-0.907757,7.549872,-142.366069,196.868707,
+ 0.355968,0.221954,-0.907757,7.709589,-143.993365,196.533452,
+ 0.355968,0.221954,-0.907757,7.316532,-143.032016,196.614376,
+ -0.271664,-0.030101,-0.961921,6.684353,-142.877774,196.788088,
+ -0.271664,-0.030101,-0.961921,7.316532,-143.032016,196.614376,
+ -0.271664,-0.030101,-0.961921,7.709589,-143.993365,196.533452,
+ -0.415781,-0.178559,-0.891764,6.684353,-142.877774,196.788088,
+ -0.415781,-0.178559,-0.891764,7.709589,-143.993365,196.533452,
+ -0.415781,-0.178559,-0.891764,6.328715,-143.614606,197.101439,
+ -0.674953,-0.232704,-0.700206,5.800278,-142.258374,197.537088,
+ -0.674953,-0.232704,-0.700206,6.483565,-142.564119,196.980053,
+ -0.674953,-0.232704,-0.700206,5.969122,-142.771904,197.544998,
+ -0.667827,-0.173978,-0.723698,6.209155,-142.076447,197.116042,
+ -0.667827,-0.173978,-0.723698,6.483565,-142.564119,196.980053,
+ -0.667827,-0.173978,-0.723698,5.800278,-142.258374,197.537088,
+ -0.84801,-0.183218,-0.497302,6.209155,-142.076447,197.116042,
+ -0.84801,-0.183218,-0.497302,5.690148,-141.717158,197.868693,
+ -0.84801,-0.183218,-0.497302,6.076513,-141.641711,197.182058,
+ -0.745984,0.230926,-0.624645,6.209155,-142.076447,197.116042,
+ -0.745984,0.230926,-0.624645,5.800278,-142.258374,197.537088,
+ -0.745984,0.230926,-0.624645,5.690148,-141.717158,197.868693,
+ -0.657582,0.614357,0.436063,11.743908,-146.831778,211.504027,
+ -0.657582,0.614357,0.436063,11.934657,-147.170684,212.269151,
+ -0.657582,0.614357,0.436063,12.055738,-146.602088,211.650663,
+ 0.829462,-0.558287,0.017562,12.164955,-147.021918,211.456872,
+ 0.829462,-0.558287,0.017562,12.149743,-147.018267,212.291359,
+ 0.829462,-0.558287,0.017562,11.983941,-147.260126,212.433736,
+ 0.969496,0.244546,0.016602,12.164955,-147.021918,211.456872,
+ 0.969496,0.244546,0.016602,12.055738,-146.602088,211.650663,
+ 0.969496,0.244546,0.016602,12.149743,-147.018267,212.291359,
+ 0.477436,-0.829217,0.29061,11.505092,-147.790389,212.49306,
+ 0.477436,-0.829217,0.29061,10.187192,-148.462724,212.739786,
+ 0.477436,-0.829217,0.29061,10.471338,-148.855782,211.151431,
+ 0.624824,-0.76988,0.129925,11.720787,-147.829938,211.221402,
+ 0.624824,-0.76988,0.129925,11.505092,-147.790389,212.49306,
+ 0.624824,-0.76988,0.129925,10.471338,-148.855782,211.151431,
+ 0.742275,-0.653943,0.146241,11.720787,-147.829938,211.221402,
+ 0.742275,-0.653943,0.146241,11.983941,-147.260126,212.433736,
+ 0.742275,-0.653943,0.146241,11.505092,-147.790389,212.49306,
+ 0.870393,-0.490593,0.041654,11.720787,-147.829938,211.221402,
+ 0.870393,-0.490593,0.041654,12.164955,-147.021918,211.456872,
+ 0.870393,-0.490593,0.041654,11.983941,-147.260126,212.433736,
+ 0.178561,-0.977695,0.110581,10.471338,-148.855782,211.151431,
+ 0.178561,-0.977695,0.110581,9.084379,-148.981123,212.282841,
+ 0.178561,-0.977695,0.110581,9.101416,-149.083646,211.348872,
+ 0.310762,-0.908205,0.28034,10.471338,-148.855782,211.151431,
+ 0.310762,-0.908205,0.28034,10.187192,-148.462724,212.739786,
+ 0.310762,-0.908205,0.28034,9.084379,-148.981123,212.282841,
+ 0.012034,-0.994441,-0.10461,9.084379,-148.981123,212.282841,
+ 0.012034,-0.994441,-0.10461,8.363672,-148.957393,211.974358,
+ 0.012034,-0.994441,-0.10461,8.012293,-148.901416,211.401807,
+ -0.159155,-0.981669,0.104857,9.101416,-149.083646,211.348872,
+ -0.159155,-0.981669,0.104857,9.084379,-148.981123,212.282841,
+ -0.159155,-0.981669,0.104857,8.012293,-148.901416,211.401807,
+ -0.909372,-0.041426,0.413915,8.012293,-148.901416,211.401807,
+ -0.909372,-0.041426,0.413915,8.247762,-148.826881,211.926594,
+ -0.909372,-0.041426,0.413915,8.015943,-148.397925,211.460218,
+ -0.751197,-0.516926,0.410477,8.012293,-148.901416,211.401807,
+ -0.751197,-0.516926,0.410477,8.363672,-148.957393,211.974358,
+ -0.751197,-0.516926,0.410477,8.247762,-148.826881,211.926594,
+ -0.67971,0.339542,0.650158,8.015943,-148.397925,211.460218,
+ -0.67971,0.339542,0.650158,8.247762,-148.826881,211.926594,
+ -0.67971,0.339542,0.650158,8.361238,-148.697586,211.977704,
+ -0.403997,0.469707,0.78496,8.361238,-148.697586,211.977704,
+ -0.403997,0.469707,0.78496,8.972729,-148.903241,212.415483,
+ -0.403997,0.469707,0.78496,8.907016,-148.75843,212.29501,
+ -0.542061,0.148807,0.827059,8.361238,-148.697586,211.977704,
+ -0.542061,0.148807,0.827059,8.247762,-148.826881,211.926594,
+ -0.542061,0.148807,0.827059,8.972729,-148.903241,212.415483,
+ -0.2915,-0.911591,0.289878,9.084379,-148.981123,212.282841,
+ -0.2915,-0.911591,0.289878,8.972729,-148.903241,212.415483,
+ -0.2915,-0.911591,0.289878,8.247762,-148.826881,211.926594,
+ -0.393836,-0.013416,0.919083,8.247762,-148.826881,211.926594,
+ -0.393836,-0.013416,0.919083,8.363672,-148.957393,211.974358,
+ -0.393836,-0.013416,0.919083,9.084379,-148.981123,212.282841,
+ -0.347794,0.823578,0.44806,10.112657,-148.407356,212.585544,
+ -0.347794,0.823578,0.44806,9.969976,-148.39975,212.460812,
+ -0.347794,0.823578,0.44806,8.907016,-148.75843,212.29501,
+ -0.338548,0.506234,0.793166,10.112657,-148.407356,212.585544,
+ -0.338548,0.506234,0.793166,8.907016,-148.75843,212.29501,
+ -0.338548,0.506234,0.793166,8.972729,-148.903241,212.415483,
+ -0.409466,0.777674,0.477033,10.187192,-148.462724,212.739786,
+ -0.409466,0.777674,0.477033,10.112657,-148.407356,212.585544,
+ -0.409466,0.777674,0.477033,8.972729,-148.903241,212.415483,
+ 0.134653,-0.800832,0.583556,10.187192,-148.462724,212.739786,
+ 0.134653,-0.800832,0.583556,8.972729,-148.903241,212.415483,
+ 0.134653,-0.800832,0.583556,9.084379,-148.981123,212.282841,
+ -0.6973,0.652574,0.296513,11.597576,-147.559482,212.183968,
+ -0.6973,0.652574,0.296513,11.983941,-147.260126,212.433736,
+ -0.6973,0.652574,0.296513,12.149743,-147.018267,212.291359,
+ -0.691653,0.481762,0.538071,11.934657,-147.170684,212.269151,
+ -0.691653,0.481762,0.538071,11.223758,-147.524723,211.672329,
+ -0.691653,0.481762,0.538071,11.597576,-147.559482,212.183968,
+ -0.668515,0.59876,0.441106,11.223758,-147.524723,211.672329,
+ -0.668515,0.59876,0.441106,11.934657,-147.170684,212.269151,
+ -0.668515,0.59876,0.441106,11.137285,-147.527539,211.545097,
+ -0.757253,-0.385704,0.527067,11.597576,-147.559482,212.183968,
+ -0.757253,-0.385704,0.527067,11.223758,-147.524723,211.672329,
+ -0.757253,-0.385704,0.527067,11.276578,-147.535119,211.740608,
+ -0.555097,0.749516,0.360685,11.088913,-147.908428,212.262154,
+ -0.555097,0.749516,0.360685,11.223758,-147.524723,211.672329,
+ -0.555097,0.749516,0.360685,11.137285,-147.527539,211.545097,
+ -0.475614,0.783092,0.400698,11.223758,-147.524723,211.672329,
+ -0.475614,0.783092,0.400698,11.088913,-147.908428,212.262154,
+ -0.475614,0.783092,0.400698,11.597576,-147.559482,212.183968,
+ 0.757253,0.385704,-0.527067,11.223758,-147.524723,211.672329,
+ 0.757253,0.385704,-0.527067,11.597576,-147.559482,212.183968,
+ 0.757253,0.385704,-0.527067,11.276578,-147.535119,211.740608,
+ -0.572787,0.814703,-0.090412,11.983941,-147.260126,212.433736,
+ -0.572787,0.814703,-0.090412,11.597576,-147.559482,212.183968,
+ -0.572787,0.814703,-0.090412,11.088913,-147.908428,212.262154,
+ -0.51986,0.543214,0.659291,11.983941,-147.260126,212.433736,
+ -0.51986,0.543214,0.659291,11.088913,-147.908428,212.262154,
+ -0.51986,0.543214,0.659291,11.505092,-147.790389,212.49306,
+ -0.297118,0.851417,0.432215,11.137285,-147.527539,211.545097,
+ -0.297118,0.851417,0.432215,9.969976,-148.39975,212.460812,
+ -0.297118,0.851417,0.432215,11.088913,-147.908428,212.262154,
+ -0.306841,0.86197,0.403555,11.088913,-147.908428,212.262154,
+ -0.306841,0.86197,0.403555,9.969976,-148.39975,212.460812,
+ -0.306841,0.86197,0.403555,10.112657,-148.407356,212.585544,
+ -0.381457,0.895362,0.229819,11.505092,-147.790389,212.49306,
+ -0.381457,0.895362,0.229819,11.088913,-147.908428,212.262154,
+ -0.381457,0.895362,0.229819,10.112657,-148.407356,212.585544,
+ -0.334654,0.823855,0.457459,11.505092,-147.790389,212.49306,
+ -0.334654,0.823855,0.457459,10.112657,-148.407356,212.585544,
+ -0.334654,0.823855,0.457459,10.187192,-148.462724,212.739786,
+ -0.933614,-0.341465,-0.108477,5.969122,-142.771904,197.544998,
+ -0.933614,-0.341465,-0.108477,6.900048,-145.978733,199.627413,
+ -0.933614,-0.341465,-0.108477,6.3348,-144.663571,200.35238,
+ -0.93366,-0.341385,-0.108333,6.900048,-145.978733,199.627413,
+ -0.93366,-0.341385,-0.108333,5.969122,-142.771904,197.544998,
+ -0.93366,-0.341385,-0.108333,6.328715,-143.614606,197.101439,
+ -0.997847,-0.043965,0.048674,5.818835,-141.397114,200.795939,
+ -0.997847,-0.043965,0.048674,5.690148,-141.717158,197.868693,
+ -0.997847,-0.043965,0.048674,5.897325,-143.022281,200.937099,
+ -0.997849,-0.043927,0.04867,5.690148,-141.717158,197.868693,
+ -0.997849,-0.043927,0.04867,5.818835,-141.397114,200.795939,
+ -0.997849,-0.043927,0.04867,5.650599,-140.73786,197.941706,
+ -0.863744,0.477456,0.161191,6.323543,-140.409298,200.574464,
+ -0.863744,0.477456,0.161191,5.650599,-140.73786,197.941706,
+ -0.863744,0.477456,0.161191,5.818835,-141.397114,200.795939,
+ -0.863721,0.4775,0.16118,5.650599,-140.73786,197.941706,
+ -0.863721,0.4775,0.16118,6.323543,-140.409298,200.574464,
+ -0.863721,0.4775,0.16118,5.97764,-140.101727,197.809673,
+ -0.235171,0.962325,0.136477,6.323543,-140.409298,200.574464,
+ -0.235171,0.962325,0.136477,6.760105,-139.870213,197.525528,
+ -0.235171,0.962325,0.136477,5.97764,-140.101727,197.809673,
+ -0.235161,0.962327,0.136478,6.760105,-139.870213,197.525528,
+ -0.235161,0.962327,0.136478,6.323543,-140.409298,200.574464,
+ -0.235161,0.962327,0.136478,7.532835,-140.051226,200.133338,
+ 0.680857,0.716467,-0.152016,7.532835,-140.051226,200.133338,
+ 0.680857,0.716467,-0.152016,7.682209,-140.724474,197.629268,
+ 0.680857,0.716467,-0.152016,6.760105,-139.870213,197.525528,
+ 0.680903,0.716426,-0.152002,7.682209,-140.724474,197.629268,
+ 0.680903,0.716426,-0.152002,7.532835,-140.051226,200.133338,
+ 0.680903,0.716426,-0.152002,8.992503,-141.389205,200.365766,
+ 0.861314,0.39807,-0.315719,10.002528,-143.861027,200.004652,
+ 0.861314,0.39807,-0.315719,7.682209,-140.724474,197.629268,
+ 0.861314,0.39807,-0.315719,8.992503,-141.389205,200.365766,
+ 0.861313,0.398001,-0.315809,7.682209,-140.724474,197.629268,
+ 0.861313,0.398001,-0.315809,10.002528,-143.861027,200.004652,
+ 0.861313,0.398001,-0.315809,8.228596,-142.215174,197.240774,
+ 0.874868,0.283759,-0.392539,10.206358,-145.235209,199.465566,
+ 0.874868,0.283759,-0.392539,8.228596,-142.215174,197.240774,
+ 0.874868,0.283759,-0.392539,10.002528,-143.861027,200.004652,
+ 0.874861,0.283724,-0.392581,8.228596,-142.215174,197.240774,
+ 0.874861,0.283724,-0.392581,10.206358,-145.235209,199.465566,
+ 0.874861,0.283724,-0.392581,8.408393,-143.129064,196.980966,
+ 0.698409,-0.21068,-0.683988,9.097461,-146.606956,198.755811,
+ 0.698409,-0.21068,-0.683988,8.408393,-143.129064,196.980966,
+ 0.698409,-0.21068,-0.683988,10.206358,-145.235209,199.465566,
+ 0.698492,-0.210628,-0.683918,8.408393,-143.129064,196.980966,
+ 0.698492,-0.210628,-0.683918,9.097461,-146.606956,198.755811,
+ 0.698492,-0.210628,-0.683918,7.709589,-143.993365,196.533452,
+ -0.426169,-0.706578,-0.564913,7.709589,-143.993365,196.533452,
+ -0.426169,-0.706578,-0.564913,6.900048,-145.978733,199.627413,
+ -0.426169,-0.706578,-0.564913,6.328715,-143.614606,197.101439,
+ -0.426092,-0.70662,-0.56492,6.900048,-145.978733,199.627413,
+ -0.426092,-0.70662,-0.56492,7.709589,-143.993365,196.533452,
+ -0.426092,-0.70662,-0.56492,9.097461,-146.606956,198.755811,
+ 0.724503,-0.672966,-0.149034,10.596982,-148.81532,208.800689,
+ 0.724503,-0.672966,-0.149034,11.565937,-147.427145,207.242757,
+ 0.724503,-0.672966,-0.149034,11.802623,-147.669612,209.488236,
+ 0.725015,-0.672564,-0.148357,11.565937,-147.427145,207.242757,
+ 0.725015,-0.672564,-0.148357,10.596982,-148.81532,208.800689,
+ 0.725015,-0.672564,-0.148357,10.386155,-148.552775,206.580156,
+ -0.021875,-0.975893,-0.217148,10.386155,-148.552775,206.580156,
+ -0.021875,-0.975893,-0.217148,8.926487,-149.192254,209.601104,
+ -0.021875,-0.975893,-0.217148,8.029329,-148.59993,207.029495,
+ 0.158196,-0.978714,-0.130738,10.596982,-148.81532,208.800689,
+ 0.158196,-0.978714,-0.130738,8.926487,-149.192254,209.601104,
+ 0.158196,-0.978714,-0.130738,10.386155,-148.552775,206.580156,
+ -0.170954,-0.917146,-0.360024,9.101416,-149.083646,211.348872,
+ -0.170954,-0.917146,-0.360024,8.012293,-148.901416,211.401807,
+ -0.170954,-0.917146,-0.360024,7.299495,-148.045329,209.559425,
+ -0.574647,-0.811254,0.107927,9.101416,-149.083646,211.348872,
+ -0.574647,-0.811254,0.107927,7.299495,-148.045329,209.559425,
+ -0.574647,-0.811254,0.107927,8.926487,-149.192254,209.601104,
+ -0.159833,0.86772,0.470654,9.59578,-147.432012,210.322115,
+ -0.159833,0.86772,0.470654,8.489925,-148.265891,211.483948,
+ -0.159833,0.86772,0.470654,9.189032,-148.229689,211.654618,
+ -0.049608,0.833177,0.550776,9.59578,-147.432012,210.322115,
+ -0.049608,0.833177,0.550776,7.803595,-147.231224,209.856956,
+ -0.049608,0.833177,0.550776,8.489925,-148.265891,211.483948,
+ -0.283483,0.805122,0.520975,11.223758,-147.524723,211.672329,
+ -0.283483,0.805122,0.520975,11.02746,-146.60361,210.142014,
+ -0.283483,0.805122,0.520975,9.189032,-148.229689,211.654618,
+ -0.337555,0.786725,0.516838,11.02746,-146.60361,210.142014,
+ -0.337555,0.786725,0.516838,11.223758,-147.524723,211.672329,
+ -0.337555,0.786725,0.516838,11.392833,-147.455133,211.676826,
+ -0.432212,0.825753,0.362387,11.02746,-146.60361,210.142014,
+ -0.432212,0.825753,0.362387,9.59578,-147.432012,210.322115,
+ -0.432212,0.825753,0.362387,9.189032,-148.229689,211.654618,
+ -0.744517,0.531354,0.404175,11.416259,-146.06209,209.888596,
+ -0.744517,0.531354,0.404175,11.392833,-147.455133,211.676826,
+ -0.744517,0.531354,0.404175,11.743908,-146.831778,211.504027,
+ -0.577948,0.647439,0.496788,11.416259,-146.06209,209.888596,
+ -0.577948,0.647439,0.496788,11.02746,-146.60361,210.142014,
+ -0.577948,0.647439,0.496788,11.392833,-147.455133,211.676826,
+ -0.658,0.63992,0.396911,11.938916,-145.678159,209.96739,
+ -0.658,0.63992,0.396911,11.743908,-146.831778,211.504027,
+ -0.658,0.63992,0.396911,12.055738,-146.602088,211.650663,
+ -0.572905,0.68872,0.444347,11.938916,-145.678159,209.96739,
+ -0.572905,0.68872,0.444347,11.416259,-146.06209,209.888596,
+ -0.572905,0.68872,0.444347,11.743908,-146.831778,211.504027,
+ 0.972975,0.19924,0.116714,12.230971,-146.502607,210.02002,
+ 0.972975,0.19924,0.116714,12.055738,-146.602088,211.650663,
+ 0.972975,0.19924,0.116714,12.164955,-147.021918,211.456872,
+ 0.933232,0.338311,0.120927,11.938916,-145.678159,209.96739,
+ 0.933232,0.338311,0.120927,12.055738,-146.602088,211.650663,
+ 0.933232,0.338311,0.120927,12.230971,-146.502607,210.02002,
+ 0.876704,-0.48102,-0.003101,11.802623,-147.669612,209.488236,
+ 0.876704,-0.48102,-0.003101,12.164955,-147.021918,211.456872,
+ 0.876704,-0.48102,-0.003101,11.720787,-147.829938,211.221402,
+ 0.946385,-0.315262,-0.070461,11.802623,-147.669612,209.488236,
+ 0.946385,-0.315262,-0.070461,12.230971,-146.502607,210.02002,
+ 0.946385,-0.315262,-0.070461,12.164955,-147.021918,211.456872,
+ 0.633737,-0.773276,0.020563,11.720787,-147.829938,211.221402,
+ 0.633737,-0.773276,0.020563,10.471338,-148.855782,211.151431,
+ 0.633737,-0.773276,0.020563,10.596982,-148.81532,208.800689,
+ 0.698355,-0.714983,-0.033165,11.802623,-147.669612,209.488236,
+ 0.698355,-0.714983,-0.033165,11.720787,-147.829938,211.221402,
+ 0.698355,-0.714983,-0.033165,10.596982,-148.81532,208.800689,
+ 0.236637,-0.970907,0.036649,10.596982,-148.81532,208.800689,
+ 0.236637,-0.970907,0.036649,9.101416,-149.083646,211.348872,
+ 0.236637,-0.970907,0.036649,8.926487,-149.192254,209.601104,
+ 0.162913,-0.986606,-0.008274,10.596982,-148.81532,208.800689,
+ 0.162913,-0.986606,-0.008274,10.471338,-148.855782,211.151431,
+ 0.162913,-0.986606,-0.008274,9.101416,-149.083646,211.348872,
+ -0.961775,-0.265464,0.067211,5.897325,-143.022281,200.937099,
+ -0.961775,-0.265464,0.067211,6.364614,-144.378209,202.268385,
+ -0.961775,-0.265464,0.067211,6.161088,-143.496567,202.838197,
+ -0.965373,-0.24517,0.089143,6.07773,-143.910616,200.447602,
+ -0.965373,-0.24517,0.089143,6.364614,-144.378209,202.268385,
+ -0.965373,-0.24517,0.089143,5.897325,-143.022281,200.937099,
+ -0.958363,-0.273924,0.080654,6.07773,-143.910616,200.447602,
+ -0.958363,-0.273924,0.080654,6.578179,-145.127817,202.260171,
+ -0.958363,-0.273924,0.080654,6.364614,-144.378209,202.268385,
+ -0.943991,-0.327445,0.040745,6.3348,-144.663571,200.35238,
+ -0.943991,-0.327445,0.040745,6.578179,-145.127817,202.260171,
+ -0.943991,-0.327445,0.040745,6.07773,-143.910616,200.447602,
+ -0.99053,-0.091069,0.102748,6.161088,-143.496567,202.838197,
+ -0.99053,-0.091069,0.102748,6.419678,-144.767007,204.205077,
+ -0.99053,-0.091069,0.102748,6.382563,-143.868024,204.644072,
+ -0.976404,-0.215397,-0.01548,6.364614,-144.378209,202.268385,
+ -0.976404,-0.215397,-0.01548,6.419678,-144.767007,204.205077,
+ -0.976404,-0.215397,-0.01548,6.161088,-143.496567,202.838197,
+ -0.975384,-0.219911,-0.016315,6.419678,-144.767007,204.205077,
+ -0.975384,-0.219911,-0.016315,6.593086,-145.527264,204.085517,
+ -0.975384,-0.219911,-0.016315,6.719948,-146.252535,206.277149,
+ -0.975385,-0.219896,-0.016413,6.593086,-145.527264,204.085517,
+ -0.975385,-0.219896,-0.016413,6.419678,-144.767007,204.205077,
+ -0.975385,-0.219896,-0.016413,6.364614,-144.378209,202.268385,
+ -0.960583,-0.273104,-0.051919,6.578179,-145.127817,202.260171,
+ -0.960583,-0.273104,-0.051919,6.593086,-145.527264,204.085517,
+ -0.960583,-0.273104,-0.051919,6.364614,-144.378209,202.268385,
+ -0.73789,0.454913,0.49857,6.382563,-143.868024,204.644072,
+ -0.73789,0.454913,0.49857,6.631114,-145.630092,206.619705,
+ -0.73789,0.454913,0.49857,7.034516,-144.898736,206.549429,
+ -0.995549,-0.071238,0.061712,6.419678,-144.767007,204.205077,
+ -0.995549,-0.071238,0.061712,6.631114,-145.630092,206.619705,
+ -0.995549,-0.071238,0.061712,6.382563,-143.868024,204.644072,
+ -0.987065,-0.157463,0.030148,6.419678,-144.767007,204.205077,
+ -0.987065,-0.157463,0.030148,6.719948,-146.252535,206.277149,
+ -0.987065,-0.157463,0.030148,6.631114,-145.630092,206.619705,
+ -0.669939,0.547102,0.501858,7.034516,-144.898736,206.549429,
+ -0.669939,0.547102,0.501858,6.803001,-146.636162,208.134438,
+ -0.669939,0.547102,0.501858,7.312272,-146.019803,208.142348,
+ -0.784779,0.47152,0.402232,7.034516,-144.898736,206.549429,
+ -0.784779,0.47152,0.402232,6.631114,-145.630092,206.619705,
+ -0.784779,0.47152,0.402232,6.803001,-146.636162,208.134438,
+ -0.974239,-0.222431,-0.037183,6.631114,-145.630092,206.619705,
+ -0.974239,-0.222431,-0.037183,6.952375,-147.165512,207.387263,
+ -0.974239,-0.222431,-0.037183,6.803001,-146.636162,208.134438,
+ -0.982689,-0.174499,0.062237,6.719948,-146.252535,206.277149,
+ -0.982689,-0.174499,0.062237,6.952375,-147.165512,207.387263,
+ -0.982689,-0.174499,0.062237,6.631114,-145.630092,206.619705,
+ -0.501727,0.632188,0.59043,7.803595,-147.231224,209.856956,
+ -0.501727,0.632188,0.59043,7.312272,-146.019803,208.142348,
+ -0.501727,0.632188,0.59043,7.30345,-147.657138,209.887987,
+ -0.667341,0.544881,0.507702,6.803001,-146.636162,208.134438,
+ -0.667341,0.544881,0.507702,7.30345,-147.657138,209.887987,
+ -0.667341,0.544881,0.507702,7.312272,-146.019803,208.142348,
+ -0.970322,-0.150388,0.189361,6.803001,-146.636162,208.134438,
+ -0.970322,-0.150388,0.189361,7.299495,-148.045329,209.559425,
+ -0.970322,-0.150388,0.189361,7.30345,-147.657138,209.887987,
+ -0.951216,-0.307293,0.027542,6.952375,-147.165512,207.387263,
+ -0.951216,-0.307293,0.027542,7.299495,-148.045329,209.559425,
+ -0.951216,-0.307293,0.027542,6.803001,-146.636162,208.134438,
+ -0.243705,0.768551,0.591556,8.489925,-148.265891,211.483948,
+ -0.243705,0.768551,0.591556,7.803595,-147.231224,209.856956,
+ -0.243705,0.768551,0.591556,8.015943,-148.397925,211.460218,
+ -0.523473,0.654457,0.545584,8.015943,-148.397925,211.460218,
+ -0.523473,0.654457,0.545584,7.803595,-147.231224,209.856956,
+ -0.523473,0.654457,0.545584,7.30345,-147.657138,209.887987,
+ -0.916979,-0.039406,0.396984,7.30345,-147.657138,209.887987,
+ -0.916979,-0.039406,0.396984,8.012293,-148.901416,211.401807,
+ -0.916979,-0.039406,0.396984,8.015943,-148.397925,211.460218,
+ -0.940363,-0.214135,0.264316,7.299495,-148.045329,209.559425,
+ -0.940363,-0.214135,0.264316,8.012293,-148.901416,211.401807,
+ -0.940363,-0.214135,0.264316,7.30345,-147.657138,209.887987,
+ -0.261684,0.759369,0.595719,8.907016,-148.75843,212.29501,
+ -0.261684,0.759369,0.595719,8.489925,-148.265891,211.483948,
+ -0.261684,0.759369,0.595719,8.361238,-148.697586,211.977704,
+ -0.242083,0.760831,0.602106,8.489925,-148.265891,211.483948,
+ -0.242083,0.760831,0.602106,8.015943,-148.397925,211.460218,
+ -0.242083,0.760831,0.602106,8.361238,-148.697586,211.977704,
+ -0.665975,0.606307,0.43459,11.743908,-146.831778,211.504027,
+ -0.665975,0.606307,0.43459,11.137285,-147.527539,211.545097,
+ -0.665975,0.606307,0.43459,11.934657,-147.170684,212.269151,
+ -0.946091,-0.312015,-0.086936,5.800278,-142.258374,197.537088,
+ -0.946091,-0.312015,-0.086936,6.3348,-144.663571,200.35238,
+ -0.946091,-0.312015,-0.086936,6.07773,-143.910616,200.447602,
+ -0.945946,-0.312363,-0.087261,6.3348,-144.663571,200.35238,
+ -0.945946,-0.312363,-0.087261,5.800278,-142.258374,197.537088,
+ -0.945946,-0.312363,-0.087261,5.969122,-142.771904,197.544998,
+ -0.981465,-0.191055,-0.014996,5.690148,-141.717158,197.868693,
+ -0.981465,-0.191055,-0.014996,6.07773,-143.910616,200.447602,
+ -0.981465,-0.191055,-0.014996,5.897325,-143.022281,200.937099,
+ -0.981534,-0.19072,-0.014701,6.07773,-143.910616,200.447602,
+ -0.981534,-0.19072,-0.014701,5.690148,-141.717158,197.868693,
+ -0.981534,-0.19072,-0.014701,5.800278,-142.258374,197.537088,
+ -0.006312,0.148248,-0.98893,6.076513,-141.641711,197.182058,
+ -0.006312,0.148248,-0.98893,7.437613,-141.654792,197.17141,
+ -0.006312,0.148248,-0.98893,6.209155,-142.076447,197.116042,
+ -0.007308,0.052413,-0.998599,7.019609,-140.768283,197.220999,
+ -0.007308,0.052413,-0.998599,7.437613,-141.654792,197.17141,
+ -0.007308,0.052413,-0.998599,6.076513,-141.641711,197.182058,
+ 0.003636,0.04062,-0.999168,7.019609,-140.768283,197.220999,
+ 0.003636,0.04062,-0.999168,6.076513,-141.641711,197.182058,
+ 0.003636,0.04062,-0.999168,6.072558,-141.080113,197.204875,
+ 0.160146,0.075159,-0.984228,6.550495,-140.36549,197.337213,
+ 0.160146,0.075159,-0.984228,6.072558,-141.080113,197.204875,
+ 0.160146,0.075159,-0.984228,6.096592,-140.489918,197.253855,
+ -0.565403,0.487972,0.664983,6.893964,-141.704381,204.000638,
+ -0.565403,0.487972,0.664983,7.356689,-143.461276,205.683303,
+ -0.565403,0.487972,0.664983,7.726018,-142.694631,205.434751,
+ -0.464092,0.545884,0.697589,6.893964,-141.704381,204.000638,
+ -0.464092,0.545884,0.697589,6.490867,-142.475894,204.336197,
+ -0.464092,0.545884,0.697589,7.356689,-143.461276,205.683303,
+ -0.009279,0.769576,0.638487,8.644167,-142.588153,205.319755,
+ -0.009279,0.769576,0.638487,7.755223,-141.274512,203.72349,
+ -0.009279,0.769576,0.638487,7.726018,-142.694631,205.434751,
+ -0.17708,0.758853,0.626725,7.755223,-141.274512,203.72349,
+ -0.17708,0.758853,0.626725,6.893964,-141.704381,204.000638,
+ -0.17708,0.758853,0.626725,7.726018,-142.694631,205.434751,
+ 0.164006,0.902062,0.399232,10.360296,-143.215767,206.032857,
+ 0.164006,0.902062,0.399232,9.332322,-142.179275,204.113201,
+ 0.164006,0.902062,0.399232,8.644167,-142.588153,205.319755,
+ 0.347713,0.809714,0.472714,9.332322,-142.179275,204.113201,
+ 0.347713,0.809714,0.472714,7.755223,-141.274512,203.72349,
+ 0.347713,0.809714,0.472714,8.644167,-142.588153,205.319755,
+ 0.814073,0.565401,-0.132695,10.813894,-144.43449,203.622791,
+ 0.814073,0.565401,-0.132695,10.360296,-143.215767,206.032857,
+ 0.814073,0.565401,-0.132695,11.617047,-145.073665,205.826592,
+ 0.815077,0.564144,-0.131871,10.813894,-144.43449,203.622791,
+ 0.815077,0.564144,-0.131871,9.332322,-142.179275,204.113201,
+ 0.815077,0.564144,-0.131871,10.360296,-143.215767,206.032857,
+ 0.989284,-0.051972,-0.13644,11.179572,-146.178608,203.075492,
+ 0.989284,-0.051972,-0.13644,11.617047,-145.073665,205.826592,
+ 0.989284,-0.051972,-0.13644,11.451853,-147.10558,205.402808,
+ 0.926221,0.275082,-0.257769,11.179572,-146.178608,203.075492,
+ 0.926221,0.275082,-0.257769,10.813894,-144.43449,203.622791,
+ 0.926221,0.275082,-0.257769,11.617047,-145.073665,205.826592,
+ 0.707835,-0.676572,-0.203027,9.604298,-148.121385,202.34657,
+ 0.707835,-0.676572,-0.203027,11.451853,-147.10558,205.402808,
+ 0.707835,-0.676572,-0.203027,10.066111,-148.356246,204.739295,
+ 0.792629,-0.528866,-0.30338,9.604298,-148.121385,202.34657,
+ 0.792629,-0.528866,-0.30338,11.179572,-146.178608,203.075492,
+ 0.792629,-0.528866,-0.30338,11.451853,-147.10558,205.402808,
+ -0.511695,-0.832806,-0.211195,9.604298,-148.121385,202.34657,
+ -0.511695,-0.832806,-0.211195,7.51519,-147.653183,205.561917,
+ -0.511695,-0.832806,-0.211195,7.137648,-146.863113,203.361159,
+ -0.27764,-0.959826,-0.040627,10.066111,-148.356246,204.739295,
+ -0.27764,-0.959826,-0.040627,7.51519,-147.653183,205.561917,
+ -0.27764,-0.959826,-0.040627,9.604298,-148.121385,202.34657,
+ -0.800981,-0.533722,-0.271238,6.719948,-146.252535,206.277149,
+ -0.800981,-0.533722,-0.271238,8.029329,-148.59993,207.029495,
+ -0.800981,-0.533722,-0.271238,6.952375,-147.165512,207.387263,
+ -0.871846,-0.489668,-0.010453,7.51519,-147.653183,205.561917,
+ -0.871846,-0.489668,-0.010453,8.029329,-148.59993,207.029495,
+ -0.871846,-0.489668,-0.010453,6.719948,-146.252535,206.277149,
+ 0.181043,0.679865,0.710639,7.356689,-143.461276,205.683303,
+ 0.181043,0.679865,0.710639,7.312272,-146.019803,208.142348,
+ 0.181043,0.679865,0.710639,8.389531,-145.59754,207.463928,
+ -0.776339,0.443732,0.44766,7.356689,-143.461276,205.683303,
+ -0.776339,0.443732,0.44766,7.034516,-144.898736,206.549429,
+ -0.776339,0.443732,0.44766,7.312272,-146.019803,208.142348,
+ -0.128867,0.548188,0.826367,7.726018,-142.694631,205.434751,
+ -0.128867,0.548188,0.826367,8.389531,-145.59754,207.463928,
+ -0.128867,0.548188,0.826367,9.694653,-145.043547,207.299951,
+ -0.415474,0.455427,0.787381,7.726018,-142.694631,205.434751,
+ -0.415474,0.455427,0.787381,7.356689,-143.461276,205.683303,
+ -0.415474,0.455427,0.787381,8.389531,-145.59754,207.463928,
+ -0.615127,0.318487,0.721239,8.644167,-142.588153,205.319755,
+ -0.615127,0.318487,0.721239,9.694653,-145.043547,207.299951,
+ -0.615127,0.318487,0.721239,10.519405,-144.078243,207.577099,
+ 0.02337,0.633628,0.773285,8.644167,-142.588153,205.319755,
+ 0.02337,0.633628,0.773285,7.726018,-142.694631,205.434751,
+ 0.02337,0.633628,0.773285,9.694653,-145.043547,207.299951,
+ -0.41974,0.773331,0.475161,10.851314,-143.866503,207.525685,
+ -0.41974,0.773331,0.475161,10.360296,-143.215767,206.032857,
+ -0.41974,0.773331,0.475161,10.519405,-144.078243,207.577099,
+ 0.121724,0.871854,0.474398,10.519405,-144.078243,207.577099,
+ 0.121724,0.871854,0.474398,10.360296,-143.215767,206.032857,
+ 0.121724,0.871854,0.474398,8.644167,-142.588153,205.319755,
+ 0.819577,0.571781,-0.036875,11.617047,-145.073665,205.826592,
+ 0.819577,0.571781,-0.036875,10.851314,-143.866503,207.525685,
+ 0.819577,0.571781,-0.036875,12.161,-145.727139,207.783667,
+ 0.826612,0.562132,-0.02685,11.617047,-145.073665,205.826592,
+ 0.826612,0.562132,-0.02685,10.360296,-143.215767,206.032857,
+ 0.826612,0.562132,-0.02685,10.851314,-143.866503,207.525685,
+ 0.948506,-0.296794,-0.110681,11.451853,-147.10558,205.402808,
+ 0.948506,-0.296794,-0.110681,12.161,-145.727139,207.783667,
+ 0.948506,-0.296794,-0.110681,11.565937,-147.427145,207.242757,
+ 0.961437,-0.020971,-0.274226,11.451853,-147.10558,205.402808,
+ 0.961437,-0.020971,-0.274226,11.617047,-145.073665,205.826592,
+ 0.961437,-0.020971,-0.274226,12.161,-145.727139,207.783667,
+ 0.732427,-0.651748,-0.196917,10.066111,-148.356246,204.739295,
+ 0.732427,-0.651748,-0.196917,11.565937,-147.427145,207.242757,
+ 0.732427,-0.651748,-0.196917,10.386155,-148.552775,206.580156,
+ 0.703117,-0.691785,-0.164498,10.066111,-148.356246,204.739295,
+ 0.703117,-0.691785,-0.164498,11.451853,-147.10558,205.402808,
+ 0.703117,-0.691785,-0.164498,11.565937,-147.427145,207.242757,
+ -0.363168,-0.835729,-0.411906,10.066111,-148.356246,204.739295,
+ -0.363168,-0.835729,-0.411906,8.029329,-148.59993,207.029495,
+ -0.363168,-0.835729,-0.411906,7.51519,-147.653183,205.561917,
+ -0.000333,-0.994356,-0.106099,10.386155,-148.552775,206.580156,
+ -0.000333,-0.994356,-0.106099,8.029329,-148.59993,207.029495,
+ -0.000333,-0.994356,-0.106099,10.066111,-148.356246,204.739295,
+ -0.556141,-0.797431,-0.23412,8.926487,-149.192254,209.601104,
+ -0.556141,-0.797431,-0.23412,7.299495,-148.045329,209.559425,
+ -0.556141,-0.797431,-0.23412,6.952375,-147.165512,207.387263,
+ -0.777226,-0.615791,0.129314,8.029329,-148.59993,207.029495,
+ -0.777226,-0.615791,0.129314,8.926487,-149.192254,209.601104,
+ -0.777226,-0.615791,0.129314,6.952375,-147.165512,207.387263,
+ -0.050883,0.830582,0.554567,9.59578,-147.432012,210.322115,
+ -0.050883,0.830582,0.554567,8.389531,-145.59754,207.463928,
+ -0.050883,0.830582,0.554567,7.803595,-147.231224,209.856956,
+ 0.036844,0.821109,0.56958,8.389531,-145.59754,207.463928,
+ 0.036844,0.821109,0.56958,7.312272,-146.019803,208.142348,
+ 0.036844,0.821109,0.56958,7.803595,-147.231224,209.856956,
+ -0.355556,0.738918,0.572346,11.02746,-146.60361,210.142014,
+ -0.355556,0.738918,0.572346,9.694653,-145.043547,207.299951,
+ -0.355556,0.738918,0.572346,9.59578,-147.432012,210.322115,
+ -0.249373,0.763727,0.595427,9.694653,-145.043547,207.299951,
+ -0.249373,0.763727,0.595427,8.389531,-145.59754,207.463928,
+ -0.249373,0.763727,0.595427,9.59578,-147.432012,210.322115,
+ -0.405664,0.609862,0.680812,10.519405,-144.078243,207.577099,
+ -0.405664,0.609862,0.680812,11.02746,-146.60361,210.142014,
+ -0.405664,0.609862,0.680812,11.416259,-146.06209,209.888596,
+ -0.699608,0.434991,0.566861,9.694653,-145.043547,207.299951,
+ -0.699608,0.434991,0.566861,11.02746,-146.60361,210.142014,
+ -0.699608,0.434991,0.566861,10.519405,-144.078243,207.577099,
+ -0.512306,0.56461,0.647115,10.851314,-143.866503,207.525685,
+ -0.512306,0.56461,0.647115,11.416259,-146.06209,209.888596,
+ -0.512306,0.56461,0.647115,11.938916,-145.678159,209.96739,
+ -0.313093,0.657248,0.685564,10.851314,-143.866503,207.525685,
+ -0.313093,0.657248,0.685564,10.519405,-144.078243,207.577099,
+ -0.313093,0.657248,0.685564,11.416259,-146.06209,209.888596,
+ 0.937193,0.337596,0.08774,12.161,-145.727139,207.783667,
+ 0.937193,0.337596,0.08774,11.938916,-145.678159,209.96739,
+ 0.937193,0.337596,0.08774,12.230971,-146.502607,210.02002,
+ 0.811199,0.580629,0.069475,10.851314,-143.866503,207.525685,
+ 0.811199,0.580629,0.069475,11.938916,-145.678159,209.96739,
+ 0.811199,0.580629,0.069475,12.161,-145.727139,207.783667,
+ 0.948492,-0.288395,-0.131117,11.565937,-147.427145,207.242757,
+ 0.948492,-0.288395,-0.131117,12.230971,-146.502607,210.02002,
+ 0.948492,-0.288395,-0.131117,11.802623,-147.669612,209.488236,
+ 0.947999,-0.29036,-0.130345,11.565937,-147.427145,207.242757,
+ 0.947999,-0.29036,-0.130345,12.161,-145.727139,207.783667,
+ 0.947999,-0.29036,-0.130345,12.230971,-146.502607,210.02002,
+ -0.920509,-0.390616,-0.009095,6.900048,-145.978733,199.627413,
+ -0.920509,-0.390616,-0.009095,7.08167,-146.451193,201.536725,
+ -0.920509,-0.390616,-0.009095,6.3348,-144.663571,200.35238,
+ -0.928944,-0.369108,0.028687,6.3348,-144.663571,200.35238,
+ -0.928944,-0.369108,0.028687,7.08167,-146.451193,201.536725,
+ -0.928944,-0.369108,0.028687,6.578179,-145.127817,202.260171,
+ -0.979504,0.033528,0.198617,5.818835,-141.397114,200.795939,
+ -0.979504,0.033528,0.198617,6.161088,-143.496567,202.838197,
+ -0.979504,0.033528,0.198617,6.178124,-141.931941,202.658096,
+ -0.99105,-0.036717,0.12834,5.818835,-141.397114,200.795939,
+ -0.99105,-0.036717,0.12834,5.897325,-143.022281,200.937099,
+ -0.99105,-0.036717,0.12834,6.161088,-143.496567,202.838197,
+ -0.753608,0.554665,0.352734,6.323543,-140.409298,200.574464,
+ -0.753608,0.554665,0.352734,6.178124,-141.931941,202.658096,
+ -0.753608,0.554665,0.352734,6.583655,-141.206062,202.383077,
+ -0.821252,0.486457,0.298169,6.323543,-140.409298,200.574464,
+ -0.821252,0.486457,0.298169,5.818835,-141.397114,200.795939,
+ -0.821252,0.486457,0.298169,6.178124,-141.931941,202.658096,
+ -0.244849,0.900643,0.359015,7.598548,-140.760981,201.958684,
+ -0.244849,0.900643,0.359015,7.532835,-140.051226,200.133338,
+ -0.244849,0.900643,0.359015,6.583655,-141.206062,202.383077,
+ -0.11613,0.902672,0.414363,7.532835,-140.051226,200.133338,
+ -0.11613,0.902672,0.414363,6.323543,-140.409298,200.574464,
+ -0.11613,0.902672,0.414363,6.583655,-141.206062,202.383077,
+ 0.554111,0.816338,0.162949,9.142486,-141.869879,202.263821,
+ 0.554111,0.816338,0.162949,8.992503,-141.389205,200.365766,
+ 0.554111,0.816338,0.162949,7.598548,-140.760981,201.958684,
+ 0.629127,0.731846,0.261917,8.992503,-141.389205,200.365766,
+ 0.629127,0.731846,0.261917,7.532835,-140.051226,200.133338,
+ 0.629127,0.731846,0.261917,7.598548,-140.760981,201.958684,
+ 0.868101,0.486547,-0.098347,10.002528,-143.861027,200.004652,
+ 0.868101,0.486547,-0.098347,9.142486,-141.869879,202.263821,
+ 0.868101,0.486547,-0.098347,10.411101,-144.215449,201.857682,
+ 0.926594,0.375427,0.021857,10.002528,-143.861027,200.004652,
+ 0.926594,0.375427,0.021857,8.992503,-141.389205,200.365766,
+ 0.926594,0.375427,0.021857,9.142486,-141.869879,202.263821,
+ 0.919326,0.327415,-0.218263,10.206358,-145.235209,199.465566,
+ 0.919326,0.327415,-0.218263,10.411101,-144.215449,201.857682,
+ 0.919326,0.327415,-0.218263,10.789861,-145.657776,201.289391,
+ 0.962406,0.210224,-0.171992,10.206358,-145.235209,199.465566,
+ 0.962406,0.210224,-0.171992,10.002528,-143.861027,200.004652,
+ 0.962406,0.210224,-0.171992,10.411101,-144.215449,201.857682,
+ 0.821151,-0.413133,-0.393742,9.097461,-146.606956,198.755811,
+ 0.821151,-0.413133,-0.393742,10.789861,-145.657776,201.289391,
+ 0.821151,-0.413133,-0.393742,9.408378,-147.568305,200.412921,
+ 0.807224,-0.463372,-0.365618,9.097461,-146.606956,198.755811,
+ 0.807224,-0.463372,-0.365618,10.206358,-145.235209,199.465566,
+ 0.807224,-0.463372,-0.365618,10.789861,-145.657776,201.289391,
+ -0.536602,-0.769704,-0.345852,9.408378,-147.568305,200.412921,
+ -0.536602,-0.769704,-0.345852,7.08167,-146.451193,201.536725,
+ -0.536602,-0.769704,-0.345852,9.097461,-146.606956,198.755811,
+ -0.340397,-0.919792,-0.195223,9.097461,-146.606956,198.755811,
+ -0.340397,-0.919792,-0.195223,7.08167,-146.451193,201.536725,
+ -0.340397,-0.919792,-0.195223,6.900048,-145.978733,199.627413,
+ -0.936198,-0.344867,-0.067823,6.578179,-145.127817,202.260171,
+ -0.936198,-0.344867,-0.067823,7.137648,-146.863113,203.361159,
+ -0.936198,-0.344867,-0.067823,6.593086,-145.527264,204.085517,
+ -0.941787,-0.333007,-0.04629,7.08167,-146.451193,201.536725,
+ -0.941787,-0.333007,-0.04629,7.137648,-146.863113,203.361159,
+ -0.941787,-0.333007,-0.04629,6.578179,-145.127817,202.260171,
+ -0.967467,0.124033,0.220509,6.178124,-141.931941,202.658096,
+ -0.967467,0.124033,0.220509,6.382563,-143.868024,204.644072,
+ -0.967467,0.124033,0.220509,6.490867,-142.475894,204.336197,
+ -0.991599,0.025397,0.126835,6.178124,-141.931941,202.658096,
+ -0.991599,0.025397,0.126835,6.161088,-143.496567,202.838197,
+ -0.991599,0.025397,0.126835,6.382563,-143.868024,204.644072,
+ -0.777208,0.543783,0.31662,6.583655,-141.206062,202.383077,
+ -0.777208,0.543783,0.31662,6.490867,-142.475894,204.336197,
+ -0.777208,0.543783,0.31662,6.893964,-141.704381,204.000638,
+ -0.769201,0.551817,0.322224,6.583655,-141.206062,202.383077,
+ -0.769201,0.551817,0.322224,6.178124,-141.931941,202.658096,
+ -0.769201,0.551817,0.322224,6.490867,-142.475894,204.336197,
+ -0.350964,0.89028,0.290215,7.755223,-141.274512,203.72349,
+ -0.350964,0.89028,0.290215,7.598548,-140.760981,201.958684,
+ -0.350964,0.89028,0.290215,6.893964,-141.704381,204.000638,
+ -0.260225,0.90758,0.329518,7.598548,-140.760981,201.958684,
+ -0.260225,0.90758,0.329518,6.583655,-141.206062,202.383077,
+ -0.260225,0.90758,0.329518,6.893964,-141.704381,204.000638,
+ 0.47709,0.873468,0.097156,9.332322,-142.179275,204.113201,
+ 0.47709,0.873468,0.097156,9.142486,-141.869879,202.263821,
+ 0.47709,0.873468,0.097156,7.755223,-141.274512,203.72349,
+ 0.548055,0.814931,0.188477,9.142486,-141.869879,202.263821,
+ 0.548055,0.814931,0.188477,7.598548,-140.760981,201.958684,
+ 0.548055,0.814931,0.188477,7.755223,-141.274512,203.72349,
+ 0.818201,0.562931,-0.116854,10.411101,-144.215449,201.857682,
+ 0.818201,0.562931,-0.116854,9.332322,-142.179275,204.113201,
+ 0.818201,0.562931,-0.116854,10.813894,-144.43449,203.622791,
+ 0.878789,0.477097,-0.010389,10.411101,-144.215449,201.857682,
+ 0.878789,0.477097,-0.010389,9.142486,-141.869879,202.263821,
+ 0.878789,0.477097,-0.010389,9.332322,-142.179275,204.113201,
+ 0.95975,0.244558,-0.138095,10.789861,-145.657776,201.289391,
+ 0.95975,0.244558,-0.138095,10.813894,-144.43449,203.622791,
+ 0.95975,0.244558,-0.138095,11.179572,-146.178608,203.075492,
+ 0.933426,0.313708,-0.174076,10.789861,-145.657776,201.289391,
+ 0.933426,0.313708,-0.174076,10.411101,-144.215449,201.857682,
+ 0.933426,0.313708,-0.174076,10.813894,-144.43449,203.622791,
+ 0.796146,-0.555648,-0.239598,9.408378,-147.568305,200.412921,
+ 0.796146,-0.555648,-0.239598,11.179572,-146.178608,203.075492,
+ 0.796146,-0.555648,-0.239598,9.604298,-148.121385,202.34657,
+ 0.831851,-0.457089,-0.314791,9.408378,-147.568305,200.412921,
+ 0.831851,-0.457089,-0.314791,10.789861,-145.657776,201.289391,
+ 0.831851,-0.457089,-0.314791,11.179572,-146.178608,203.075492,
+ -0.494161,-0.851159,-0.177012,9.408378,-147.568305,200.412921,
+ -0.494161,-0.851159,-0.177012,7.137648,-146.863113,203.361159,
+ -0.494161,-0.851159,-0.177012,7.08167,-146.451193,201.536725,
+ -0.506839,-0.841021,-0.189203,9.604298,-148.121385,202.34657,
+ -0.506839,-0.841021,-0.189203,7.137648,-146.863113,203.361159,
+ -0.506839,-0.841021,-0.189203,9.408378,-147.568305,200.412921,
+ -0.886148,-0.452802,-0.09855,6.593086,-145.527264,204.085517,
+ -0.886148,-0.452802,-0.09855,7.51519,-147.653183,205.561917,
+ -0.886148,-0.452802,-0.09855,6.719948,-146.252535,206.277149,
+ -0.922106,-0.386447,0.019454,7.137648,-146.863113,203.361159,
+ -0.922106,-0.386447,0.019454,7.51519,-147.653183,205.561917,
+ -0.922106,-0.386447,0.019454,6.593086,-145.527264,204.085517,
+ -0.48361,0.528701,0.697565,6.490867,-142.475894,204.336197,
+ -0.48361,0.528701,0.697565,7.034516,-144.898736,206.549429,
+ -0.48361,0.528701,0.697565,7.356689,-143.461276,205.683303,
+ -0.905026,0.157768,0.395016,6.490867,-142.475894,204.336197,
+ -0.905026,0.157768,0.395016,6.382563,-143.868024,204.644072,
+ -0.905026,0.157768,0.395016,7.034516,-144.898736,206.549429,
+ 0.505432,-0.482889,-0.715092,11.743908,-146.831778,211.504027,
+ 0.505432,-0.482889,-0.715092,11.392833,-147.455133,211.676826,
+ 0.505432,-0.482889,-0.715092,11.137285,-147.527539,211.545097,
+ 0.396374,-0.862057,-0.315824,11.137285,-147.527539,211.545097,
+ 0.396374,-0.862057,-0.315824,11.276578,-147.535119,211.740608,
+ 0.396374,-0.862057,-0.315824,9.969976,-148.39975,212.460812,
+ 0.408894,-0.85298,-0.324392,11.276578,-147.535119,211.740608,
+ 0.408894,-0.85298,-0.324392,11.137285,-147.527539,211.545097,
+ 0.408894,-0.85298,-0.324392,11.392833,-147.455133,211.676826,
+ -0.294029,0.837057,0.461391,9.969976,-148.39975,212.460812,
+ -0.294029,0.837057,0.461391,11.223758,-147.524723,211.672329,
+ -0.294029,0.837057,0.461391,9.189032,-148.229689,211.654618,
+ -0.344717,0.850978,0.396241,11.223758,-147.524723,211.672329,
+ -0.344717,0.850978,0.396241,9.969976,-148.39975,212.460812,
+ -0.344717,0.850978,0.396241,11.276578,-147.535119,211.740608,
+ -0.34579,0.792632,0.50216,9.969976,-148.39975,212.460812,
+ -0.34579,0.792632,0.50216,9.189032,-148.229689,211.654618,
+ -0.34579,0.792632,0.50216,8.907016,-148.75843,212.29501,
+ -0.182112,0.796104,0.577108,9.189032,-148.229689,211.654618,
+ -0.182112,0.796104,0.577108,8.489925,-148.265891,211.483948,
+ -0.182112,0.796104,0.577108,8.907016,-148.75843,212.29501,
+ -0.530322,0.673313,0.515177,12.149743,-147.018267,212.291359,
+ -0.530322,0.673313,0.515177,12.055738,-146.602088,211.650663,
+ -0.530322,0.673313,0.515177,11.934657,-147.170684,212.269151,
+ 0.64761,-0.541378,-0.536201,31.077364,-117.472609,204.535769,
+ 0.64761,-0.541378,-0.536201,31.635311,-118.227086,205.971403,
+ 0.64761,-0.541378,-0.536201,30.215192,-118.6962,204.729864,
+ 0.648514,-0.537986,-0.538517,30.215192,-118.6962,204.729864,
+ 0.648514,-0.537986,-0.538517,31.635311,-118.227086,205.971403,
+ 0.648514,-0.537986,-0.538517,30.885094,-119.24502,206.084879,
+ 0.826224,-0.100543,-0.554297,31.077364,-117.472609,204.535769,
+ 0.826224,-0.100543,-0.554297,31.322264,-115.741877,204.586878,
+ 0.826224,-0.100543,-0.554297,32.291523,-115.601021,206.006085,
+ 0.868506,-0.211103,-0.448479,31.077364,-117.472609,204.535769,
+ 0.868506,-0.211103,-0.448479,32.291523,-115.601021,206.006085,
+ 0.868506,-0.211103,-0.448479,31.635311,-118.227086,205.971403,
+ 0.646527,-0.536907,-0.541972,31.635311,-118.227086,205.971403,
+ 0.646527,-0.536907,-0.541972,32.435725,-119.026587,207.718259,
+ 0.646527,-0.536907,-0.541972,30.885094,-119.24502,206.084879,
+ 0.659014,-0.504077,-0.558217,30.885094,-119.24502,206.084879,
+ 0.659014,-0.504077,-0.558217,32.435725,-119.026587,207.718259,
+ 0.659014,-0.504077,-0.558217,31.319526,-120.411416,207.651026,
+ 0.905557,-0.221506,-0.361802,31.635311,-118.227086,205.971403,
+ 0.905557,-0.221506,-0.361802,32.291523,-115.601021,206.006085,
+ 0.905557,-0.221506,-0.361802,33.044478,-115.956964,208.108579,
+ 0.881598,-0.116679,-0.457352,31.635311,-118.227086,205.971403,
+ 0.881598,-0.116679,-0.457352,33.044478,-115.956964,208.108579,
+ 0.881598,-0.116679,-0.457352,32.435725,-119.026587,207.718259,
+ 0.7701,-0.611972,-0.180102,31.319526,-120.411416,207.651026,
+ 0.7701,-0.611972,-0.180102,32.435725,-119.026587,207.718259,
+ 0.7701,-0.611972,-0.180102,32.945301,-119.308603,210.85542,
+ 0.87367,-0.369986,-0.31593,31.319526,-120.411416,207.651026,
+ 0.87367,-0.369986,-0.31593,32.945301,-119.308603,210.85542,
+ 0.87367,-0.369986,-0.31593,31.398321,-122.144582,209.898635,
+ -0.242485,-0.463556,0.852242,25.102094,-119.453718,215.066189,
+ -0.242485,-0.463556,0.852242,23.653378,-119.617087,214.565132,
+ -0.242485,-0.463556,0.852242,26.509436,-120.875054,214.693515,
+ -0.336816,0.124226,0.933339,25.58429,-117.702907,215.00717,
+ -0.336816,0.124226,0.933339,23.653378,-119.617087,214.565132,
+ -0.336816,0.124226,0.933339,25.102094,-119.453718,215.066189,
+ -0.203246,-0.021034,0.978902,23.799101,-117.4431,214.642101,
+ -0.203246,-0.021034,0.978902,23.653378,-119.617087,214.565132,
+ -0.203246,-0.021034,0.978902,25.58429,-117.702907,215.00717,
+ 0.309947,-0.099151,0.94557,30.544363,-118.290364,214.500636,
+ 0.309947,-0.099151,0.94557,31.536134,-119.881458,214.008706,
+ 0.309947,-0.099151,0.94557,32.171963,-118.436392,213.951816,
+ 0.180105,-0.18635,0.965834,30.544363,-118.290364,214.500636,
+ 0.180105,-0.18635,0.965834,30.146742,-119.448851,214.351262,
+ 0.180105,-0.18635,0.965834,31.536134,-119.881458,214.008706,
+ 0.184488,-0.173512,0.967397,30.146742,-119.448851,214.351262,
+ 0.184488,-0.173512,0.967397,30.623461,-122.612479,213.692921,
+ 0.184488,-0.173512,0.967397,31.536134,-119.881458,214.008706,
+ 0.007272,-0.202677,0.979219,30.146742,-119.448851,214.351262,
+ 0.007272,-0.202677,0.979219,29.599746,-120.763404,214.083241,
+ 0.007272,-0.202677,0.979219,30.623461,-122.612479,213.692921,
+ 0.102148,-0.143232,0.984404,26.588534,-115.268504,215.439473,
+ 0.102148,-0.143232,0.984404,26.066485,-116.870245,215.260589,
+ 0.102148,-0.143232,0.984404,28.196664,-117.050955,215.013254,
+ -0.144323,-0.24241,0.959379,29.996455,-115.596458,215.651517,
+ -0.144323,-0.24241,0.959379,28.196664,-117.050955,215.013254,
+ -0.144323,-0.24241,0.959379,30.105063,-117.46835,215.194876,
+ 0.172675,-0.698391,0.694574,28.316224,-118.063717,213.965202,
+ 0.172675,-0.698391,0.694574,28.196664,-117.050955,215.013254,
+ 0.172675,-0.698391,0.694574,25.58429,-117.702907,215.00717,
+ 0.080859,-0.332771,0.939535,26.066485,-116.870245,215.260589,
+ 0.080859,-0.332771,0.939535,25.58429,-117.702907,215.00717,
+ 0.080859,-0.332771,0.939535,28.196664,-117.050955,215.013254,
+ -0.233766,-0.697243,0.677647,30.544363,-118.290364,214.500636,
+ -0.233766,-0.697243,0.677647,30.105063,-117.46835,215.194876,
+ -0.233766,-0.697243,0.677647,28.316224,-118.063717,213.965202,
+ -0.219435,-0.713973,0.664899,30.105063,-117.46835,215.194876,
+ -0.219435,-0.713973,0.664899,28.196664,-117.050955,215.013254,
+ -0.219435,-0.713973,0.664899,28.316224,-118.063717,213.965202,
+ 0.269061,0.133362,0.953845,28.316224,-118.063717,213.965202,
+ 0.269061,0.133362,0.953845,25.102094,-119.453718,215.066189,
+ 0.269061,0.133362,0.953845,28.019301,-119.795058,214.291026,
+ 0.348191,-0.06437,0.935211,25.58429,-117.702907,215.00717,
+ 0.348191,-0.06437,0.935211,25.102094,-119.453718,215.066189,
+ 0.348191,-0.06437,0.935211,28.316224,-118.063717,213.965202,
+ -0.007704,-0.125275,0.992092,30.544363,-118.290364,214.500636,
+ -0.007704,-0.125275,0.992092,28.019301,-119.795058,214.291026,
+ -0.007704,-0.125275,0.992092,30.146742,-119.448851,214.351262,
+ -0.207435,0.215165,0.954293,28.316224,-118.063717,213.965202,
+ -0.207435,0.215165,0.954293,28.019301,-119.795058,214.291026,
+ -0.207435,0.215165,0.954293,30.544363,-118.290364,214.500636,
+ 0.005111,-0.201817,0.97941,30.146742,-119.448851,214.351262,
+ 0.005111,-0.201817,0.97941,28.019301,-119.795058,214.291026,
+ 0.005111,-0.201817,0.97941,29.599746,-120.763404,214.083241,
+ 0.256917,0.000989,0.966433,25.102094,-119.453718,215.066189,
+ 0.256917,0.000989,0.966433,26.509436,-120.875054,214.693515,
+ 0.256917,0.000989,0.966433,28.019301,-119.795058,214.291026,
+ 0.033314,-0.203904,0.978424,28.432438,-114.168733,215.605883,
+ 0.033314,-0.203904,0.978424,26.588534,-115.268504,215.439473,
+ 0.033314,-0.203904,0.978424,28.196664,-117.050955,215.013254,
+ -0.194504,-0.182265,0.963819,28.432438,-114.168733,215.605883,
+ -0.194504,-0.182265,0.963819,28.196664,-117.050955,215.013254,
+ -0.194504,-0.182265,0.963819,29.996455,-115.596458,215.651517,
+ -0.069484,-0.316411,0.946074,28.019301,-119.795058,214.291026,
+ -0.069484,-0.316411,0.946074,27.92347,-121.670601,213.656718,
+ -0.069484,-0.316411,0.946074,29.599746,-120.763404,214.083241,
+ 0.444168,-0.307319,0.841588,28.019301,-119.795058,214.291026,
+ 0.444168,-0.307319,0.841588,26.509436,-120.875054,214.693515,
+ 0.444168,-0.307319,0.841588,27.92347,-121.670601,213.656718,
+ -0.92692,0.356312,-0.117736,24.941159,-112.532615,204.056007,
+ -0.92692,0.356312,-0.117736,23.555113,-115.541393,205.862491,
+ -0.92692,0.356312,-0.117736,24.56818,-112.764738,206.289926,
+ -0.926911,0.356364,-0.117643,23.555113,-115.541393,205.862491,
+ -0.926911,0.356364,-0.117643,24.941159,-112.532615,204.056007,
+ -0.926911,0.356364,-0.117643,24.091157,-114.866015,203.684853,
+ -0.656827,0.753388,-0.031381,26.026327,-111.477869,206.66473,
+ -0.656827,0.753388,-0.031381,24.941159,-112.532615,204.056007,
+ -0.656827,0.753388,-0.031381,24.56818,-112.764738,206.289926,
+ -0.656913,0.753316,-0.031316,24.941159,-112.532615,204.056007,
+ -0.656913,0.753316,-0.031316,26.026327,-111.477869,206.66473,
+ -0.656913,0.753316,-0.031316,26.168096,-111.449576,204.371487,
+ 0.007063,0.999893,0.012773,28.182061,-111.499773,207.187388,
+ 0.007063,0.999893,0.012773,26.168096,-111.449576,204.371487,
+ 0.007063,0.999893,0.012773,26.026327,-111.477869,206.66473,
+ 0.007158,0.999894,0.012705,26.168096,-111.449576,204.371487,
+ 0.007158,0.999894,0.012705,28.182061,-111.499773,207.187388,
+ 0.007158,0.999894,0.012705,27.98036,-111.46783,204.787058,
+ 0.280056,0.959923,-0.010759,28.182061,-111.499773,207.187388,
+ 0.280056,0.959923,-0.010759,29.844038,-112.014825,204.495307,
+ 0.280056,0.959923,-0.010759,27.98036,-111.46783,204.787058,
+ 0.28016,0.959894,-0.010689,29.844038,-112.014825,204.495307,
+ 0.28016,0.959894,-0.010689,28.182061,-111.499773,207.187388,
+ 0.28016,0.959894,-0.010689,30.400465,-112.151118,206.839964,
+ 0.787881,0.5967,-0.152292,31.368507,-113.838041,205.238527,
+ 0.787881,0.5967,-0.152292,29.844038,-112.014825,204.495307,
+ 0.787881,0.5967,-0.152292,30.400465,-112.151118,206.839964,
+ 0.787882,0.596696,-0.152302,29.844038,-112.014825,204.495307,
+ 0.787882,0.596696,-0.152302,31.368507,-113.838041,205.238527,
+ 0.787882,0.596696,-0.152302,30.670312,-113.439508,203.188055,
+ 0.948194,0.082023,-0.306922,31.322264,-115.741877,204.586878,
+ 0.948194,0.082023,-0.306922,30.670312,-113.439508,203.188055,
+ 0.948194,0.082023,-0.306922,31.368507,-113.838041,205.238527,
+ 0.948149,0.081909,-0.30709,30.670312,-113.439508,203.188055,
+ 0.948149,0.081909,-0.30709,31.322264,-115.741877,204.586878,
+ 0.948149,0.081909,-0.30709,30.631067,-115.043987,202.63893,
+ 0.202097,-0.819482,-0.536289,29.665763,-117.461657,202.636192,
+ 0.202097,-0.819482,-0.536289,27.852282,-119.460411,205.007012,
+ 0.202097,-0.819482,-0.536289,27.696519,-118.093836,202.860101,
+ 0.20214,-0.819489,-0.536262,27.852282,-119.460411,205.007012,
+ 0.20214,-0.819489,-0.536262,29.665763,-117.461657,202.636192,
+ 0.20214,-0.819489,-0.536262,30.215192,-118.6962,204.729864,
+ -0.128136,-0.840804,-0.525957,25.273981,-117.85867,203.074579,
+ -0.128136,-0.840804,-0.525957,27.852282,-119.460411,205.007012,
+ -0.128136,-0.840804,-0.525957,24.942072,-119.178091,205.26469,
+ -0.128183,-0.840825,-0.525911,27.852282,-119.460411,205.007012,
+ -0.128183,-0.840825,-0.525911,25.273981,-117.85867,203.074579,
+ -0.128183,-0.840825,-0.525911,27.696519,-118.093836,202.860101,
+ -0.657861,-0.596926,-0.459237,24.056779,-116.620477,203.208438,
+ -0.657861,-0.596926,-0.459237,24.942072,-119.178091,205.26469,
+ -0.657861,-0.596926,-0.459237,23.51313,-117.630198,205.299676,
+ -0.65777,-0.596962,-0.459321,24.942072,-119.178091,205.26469,
+ -0.65777,-0.596962,-0.459321,24.056779,-116.620477,203.208438,
+ -0.65777,-0.596962,-0.459321,25.273981,-117.85867,203.074579,
+ -0.973405,0.077638,-0.215533,24.091157,-114.866015,203.684853,
+ -0.973405,0.077638,-0.215533,23.51313,-117.630198,205.299676,
+ -0.973405,0.077638,-0.215533,23.555113,-115.541393,205.862491,
+ -0.973398,0.077612,-0.215576,23.51313,-117.630198,205.299676,
+ -0.973398,0.077612,-0.215576,24.091157,-114.866015,203.684853,
+ -0.973398,0.077612,-0.215576,24.056779,-116.620477,203.208438,
+ 0.921419,-0.119463,-0.36975,31.077364,-117.472609,204.535769,
+ 0.921419,-0.119463,-0.36975,30.631067,-115.043987,202.63893,
+ 0.921419,-0.119463,-0.36975,31.322264,-115.741877,204.586878,
+ 0.921482,-0.119356,-0.369628,30.631067,-115.043987,202.63893,
+ 0.921482,-0.119356,-0.369628,31.077364,-117.472609,204.535769,
+ 0.921482,-0.119356,-0.369628,30.42602,-116.504568,202.599381,
+ 0.668594,-0.550424,-0.500015,29.665763,-117.461657,202.636192,
+ 0.668594,-0.550424,-0.500015,31.077364,-117.472609,204.535769,
+ 0.668594,-0.550424,-0.500015,30.215192,-118.6962,204.729864,
+ 0.668631,-0.550354,-0.500042,31.077364,-117.472609,204.535769,
+ 0.668631,-0.550354,-0.500042,29.665763,-117.461657,202.636192,
+ 0.668631,-0.550354,-0.500042,30.42602,-116.504568,202.599381,
+ -0.113702,0.131706,-0.984746,28.818194,-117.049738,202.38399,
+ -0.113702,0.131706,-0.984746,27.620463,-117.426367,202.471911,
+ -0.113702,0.131706,-0.984746,25.877258,-117.134312,202.712248,
+ 0.00639,0.384443,-0.923127,26.950257,-112.020605,203.762735,
+ 0.00639,0.384443,-0.923127,29.140368,-112.379894,203.628267,
+ 0.00639,0.384443,-0.923127,25.754655,-112.926281,203.377282,
+ -0.044407,0.630962,-0.774542,29.140368,-112.379894,203.628267,
+ -0.044407,0.630962,-0.774542,29.723261,-113.393874,202.768834,
+ -0.044407,0.630962,-0.774542,25.754655,-112.926281,203.377282,
+ -0.151345,0.235035,-0.960132,25.754655,-112.926281,203.377282,
+ -0.151345,0.235035,-0.960132,29.92983,-114.85841,202.246176,
+ -0.151345,0.235035,-0.960132,25.092359,-114.494862,203.0977,
+ -0.106486,0.320846,-0.941126,25.754655,-112.926281,203.377282,
+ -0.106486,0.320846,-0.941126,29.723261,-113.393874,202.768834,
+ -0.106486,0.320846,-0.941126,29.92983,-114.85841,202.246176,
+ -0.111141,0.248244,-0.962301,25.092359,-114.494862,203.0977,
+ -0.111141,0.248244,-0.962301,29.481707,-115.731534,202.271731,
+ -0.111141,0.248244,-0.962301,25.189102,-116.089606,202.675133,
+ -0.168851,0.057863,-0.983942,25.092359,-114.494862,203.0977,
+ -0.168851,0.057863,-0.983942,29.92983,-114.85841,202.246176,
+ -0.168851,0.057863,-0.983942,29.481707,-115.731534,202.271731,
+ -0.090239,-0.039325,-0.995143,29.481707,-115.731534,202.271731,
+ -0.090239,-0.039325,-0.995143,28.818194,-117.049738,202.38399,
+ -0.090239,-0.039325,-0.995143,25.189102,-116.089606,202.675133,
+ -0.1073,-0.105801,-0.988581,25.189102,-116.089606,202.675133,
+ -0.1073,-0.105801,-0.988581,28.818194,-117.049738,202.38399,
+ -0.1073,-0.105801,-0.988581,25.877258,-117.134312,202.712248,
+ -0.494186,0.350463,-0.795586,24.941159,-112.532615,204.056007,
+ -0.494186,0.350463,-0.795586,25.754655,-112.926281,203.377282,
+ -0.494186,0.350463,-0.795586,25.092359,-114.494862,203.0977,
+ -0.56528,0.326418,-0.757568,24.941159,-112.532615,204.056007,
+ -0.56528,0.326418,-0.757568,25.092359,-114.494862,203.0977,
+ -0.56528,0.326418,-0.757568,24.091157,-114.866015,203.684853,
+ 0.963115,-0.163859,-0.213446,32.435725,-119.026587,207.718259,
+ 0.963115,-0.163859,-0.213446,33.044478,-115.956964,208.108579,
+ 0.963115,-0.163859,-0.213446,33.585693,-116.761333,211.168163,
+ 0.959631,-0.219692,-0.175624,32.435725,-119.026587,207.718259,
+ 0.959631,-0.219692,-0.175624,33.585693,-116.761333,211.168163,
+ 0.959631,-0.219692,-0.175624,32.945301,-119.308603,210.85542,
+ 0.856758,-0.504089,0.108902,31.398321,-122.144582,209.898635,
+ 0.856758,-0.504089,0.108902,32.945301,-119.308603,210.85542,
+ 0.856758,-0.504089,0.108902,32.124504,-120.216104,213.112157,
+ 0.940899,-0.338556,-0.00945,31.398321,-122.144582,209.898635,
+ 0.940899,-0.338556,-0.00945,32.124504,-120.216104,213.112157,
+ 0.940899,-0.338556,-0.00945,30.945939,-123.455181,211.810381,
+ 0.960612,-0.255048,0.11034,32.945301,-119.308603,210.85542,
+ 0.960612,-0.255048,0.11034,33.585693,-116.761333,211.168163,
+ 0.960612,-0.255048,0.11034,32.895408,-118.494803,213.170872,
+ 0.898404,-0.407911,0.162725,32.945301,-119.308603,210.85542,
+ 0.898404,-0.407911,0.162725,32.895408,-118.494803,213.170872,
+ 0.898404,-0.407911,0.162725,32.124504,-120.216104,213.112157,
+ -0.658646,0.113026,0.743915,23.866639,-115.633878,214.427014,
+ -0.658646,0.113026,0.743915,22.887341,-117.305895,213.814002,
+ -0.658646,0.113026,0.743915,23.799101,-117.4431,214.642101,
+ -0.268103,0.963284,-0.014292,28.231345,-111.884921,213.176956,
+ -0.268103,0.963284,-0.014292,28.055808,-111.962499,211.241177,
+ -0.268103,0.963284,-0.014292,25.573642,-112.631488,212.713927,
+ 0.060236,0.99715,-0.045423,30.837027,-112.15203,210.768717,
+ 0.060236,0.99715,-0.045423,28.055808,-111.962499,211.241177,
+ 0.060236,0.99715,-0.045423,28.231345,-111.884921,213.176956,
+ 0.182279,0.979246,0.08861,31.68277,-112.429787,212.098481,
+ 0.182279,0.979246,0.08861,30.837027,-112.15203,210.768717,
+ 0.182279,0.979246,0.08861,28.231345,-111.884921,213.176956,
+ 0.590286,0.778642,-0.212788,32.874417,-114.205544,208.906255,
+ 0.590286,0.778642,-0.212788,30.837027,-112.15203,210.768717,
+ 0.590286,0.778642,-0.212788,31.68277,-112.429787,212.098481,
+ 0.877723,0.474949,0.063449,32.874417,-114.205544,208.906255,
+ 0.877723,0.474949,0.063449,31.68277,-112.429787,212.098481,
+ 0.877723,0.474949,0.063449,33.210585,-115.183017,211.572781,
+ 0.988432,0.130879,-0.076635,33.044478,-115.956964,208.108579,
+ 0.988432,0.130879,-0.076635,32.874417,-114.205544,208.906255,
+ 0.988432,0.130879,-0.076635,33.210585,-115.183017,211.572781,
+ 0.961454,0.254922,-0.103054,33.044478,-115.956964,208.108579,
+ 0.961454,0.254922,-0.103054,33.210585,-115.183017,211.572781,
+ 0.961454,0.254922,-0.103054,33.585693,-116.761333,211.168163,
+ 0.195432,-0.773307,-0.60316,31.398321,-122.144582,209.898635,
+ 0.195432,-0.773307,-0.60316,28.240168,-121.879907,208.536014,
+ 0.195432,-0.773307,-0.60316,31.319526,-120.411416,207.651026,
+ 0.173199,-0.810919,-0.558938,31.398321,-122.144582,209.898635,
+ 0.173199,-0.810919,-0.558938,28.366421,-123.02805,210.240887,
+ 0.173199,-0.810919,-0.558938,28.240168,-121.879907,208.536014,
+ -0.294104,-0.802711,-0.518804,28.366421,-123.02805,210.240887,
+ -0.294104,-0.802711,-0.518804,24.44862,-120.861364,209.109477,
+ -0.294104,-0.802711,-0.518804,28.240168,-121.879907,208.536014,
+ -0.316044,-0.820345,-0.476602,28.366421,-123.02805,210.240887,
+ -0.316044,-0.820345,-0.476602,24.634501,-121.943794,210.849336,
+ -0.316044,-0.820345,-0.476602,24.44862,-120.861364,209.109477,
+ -0.780587,-0.56471,-0.267931,24.44862,-120.861364,209.109477,
+ -0.780587,-0.56471,-0.267931,24.634501,-121.943794,210.849336,
+ -0.780587,-0.56471,-0.267931,23.076568,-119.057618,209.305093,
+ -0.764492,-0.571861,-0.297535,23.076568,-119.057618,209.305093,
+ -0.764492,-0.571861,-0.297535,24.634501,-121.943794,210.849336,
+ -0.764492,-0.571861,-0.297535,22.863307,-119.709571,211.106101,
+ -0.990177,-0.043338,-0.132937,23.076568,-119.057618,209.305093,
+ -0.990177,-0.043338,-0.132937,22.863307,-119.709571,211.106101,
+ -0.990177,-0.043338,-0.132937,22.69933,-117.596125,211.638494,
+ -0.940509,0.338319,0.031357,23.555113,-115.541393,205.862491,
+ -0.940509,0.338319,0.031357,23.172399,-116.770156,207.640986,
+ -0.940509,0.338319,0.031357,24.56818,-112.764738,206.289926,
+ -0.935413,0.347659,0.064311,24.56818,-112.764738,206.289926,
+ -0.935413,0.347659,0.064311,23.172399,-116.770156,207.640986,
+ -0.935413,0.347659,0.064311,24.367088,-113.667372,208.244567,
+ -0.676002,0.693022,0.250484,26.026327,-111.477869,206.66473,
+ -0.676002,0.693022,0.250484,24.56818,-112.764738,206.289926,
+ -0.676002,0.693022,0.250484,24.367088,-113.667372,208.244567,
+ -0.742609,0.656895,0.130461,26.026327,-111.477869,206.66473,
+ -0.742609,0.656895,0.130461,24.367088,-113.667372,208.244567,
+ -0.742609,0.656895,0.130461,25.667343,-112.27159,208.617851,
+ -0.07855,0.928513,0.362897,28.182061,-111.499773,207.187388,
+ -0.07855,0.928513,0.362897,26.026327,-111.477869,206.66473,
+ -0.07855,0.928513,0.362897,25.667343,-112.27159,208.617851,
+ -0.209334,0.965786,0.153093,28.182061,-111.499773,207.187388,
+ -0.209334,0.965786,0.153093,25.667343,-112.27159,208.617851,
+ -0.209334,0.965786,0.153093,27.832203,-111.889789,209.169409,
+ 0.307581,0.921868,0.235695,30.400465,-112.151118,206.839964,
+ 0.307581,0.921868,0.235695,28.182061,-111.499773,207.187388,
+ 0.307581,0.921868,0.235695,27.832203,-111.889789,209.169409,
+ 0.044706,0.997039,-0.062564,30.400465,-112.151118,206.839964,
+ 0.044706,0.997039,-0.062564,27.832203,-111.889789,209.169409,
+ 0.044706,0.997039,-0.062564,30.304634,-112.017563,208.899867,
+ 0.870825,0.491517,0.008645,31.368507,-113.838041,205.238527,
+ 0.870825,0.491517,0.008645,30.400465,-112.151118,206.839964,
+ 0.870825,0.491517,0.008645,30.304634,-112.017563,208.899867,
+ 0.649433,0.739102,-0.178788,32.069439,-114.138007,206.544562,
+ 0.649433,0.739102,-0.178788,31.368507,-113.838041,205.238527,
+ 0.649433,0.739102,-0.178788,30.304634,-112.017563,208.899867,
+ 0.885756,0.130907,-0.445308,31.322264,-115.741877,204.586878,
+ 0.885756,0.130907,-0.445308,31.368507,-113.838041,205.238527,
+ 0.885756,0.130907,-0.445308,32.069439,-114.138007,206.544562,
+ 0.766967,0.320941,-0.55566,31.322264,-115.741877,204.586878,
+ 0.766967,0.320941,-0.55566,32.069439,-114.138007,206.544562,
+ 0.766967,0.320941,-0.55566,32.291523,-115.601021,206.006085,
+ -0.982386,-0.181294,-0.04527,23.076568,-119.057618,209.305093,
+ -0.982386,-0.181294,-0.04527,22.69933,-117.596125,211.638494,
+ -0.982386,-0.181294,-0.04527,22.783905,-117.580001,209.738613,
+ -0.875543,0.48301,0.011228,22.69933,-117.596125,211.638494,
+ -0.875543,0.48301,0.011228,22.887341,-117.305895,213.814002,
+ -0.875543,0.48301,0.011228,24.479347,-114.389296,212.489105,
+ -0.868789,0.493384,0.042181,24.479347,-114.389296,212.489105,
+ -0.868789,0.493384,0.042181,22.887341,-117.305895,213.814002,
+ -0.868789,0.493384,0.042181,23.866639,-115.633878,214.427014,
+ -0.850852,0.521273,0.065763,24.479347,-114.389296,212.489105,
+ -0.850852,0.521273,0.065763,23.866639,-115.633878,214.427014,
+ -0.850852,0.521273,0.065763,25.573642,-112.631488,212.713927,
+ -0.839192,0.534467,0.100505,25.573642,-112.631488,212.713927,
+ -0.839192,0.534467,0.100505,23.866639,-115.633878,214.427014,
+ -0.839192,0.534467,0.100505,25.225609,-113.63482,215.143462,
+ -0.307825,0.894154,0.325165,28.231345,-111.884921,213.176956,
+ -0.307825,0.894154,0.325165,25.573642,-112.631488,212.713927,
+ -0.307825,0.894154,0.325165,25.225609,-113.63482,215.143462,
+ -0.454816,0.885718,0.092987,28.367942,-111.949721,214.462304,
+ -0.454816,0.885718,0.092987,28.231345,-111.884921,213.176956,
+ -0.454816,0.885718,0.092987,25.225609,-113.63482,215.143462,
+ 0.165631,0.985666,0.03209,31.68277,-112.429787,212.098481,
+ 0.165631,0.985666,0.03209,28.231345,-111.884921,213.176956,
+ 0.165631,0.985666,0.03209,28.367942,-111.949721,214.462304,
+ 0.329356,0.902154,0.278644,31.718973,-112.869695,213.479964,
+ 0.329356,0.902154,0.278644,31.68277,-112.429787,212.098481,
+ 0.329356,0.902154,0.278644,28.367942,-111.949721,214.462304,
+ 0.877487,0.463162,0.124491,33.210585,-115.183017,211.572781,
+ 0.877487,0.463162,0.124491,31.68277,-112.429787,212.098481,
+ 0.877487,0.463162,0.124491,31.718973,-112.869695,213.479964,
+ 0.866083,0.171245,0.469654,33.210585,-115.183017,211.572781,
+ 0.866083,0.171245,0.469654,31.718973,-112.869695,213.479964,
+ 0.866083,0.171245,0.469654,31.997642,-116.83891,214.413324,
+ 0.892812,0.099573,0.439286,33.585693,-116.761333,211.168163,
+ 0.892812,0.099573,0.439286,33.210585,-115.183017,211.572781,
+ 0.892812,0.099573,0.439286,31.997642,-116.83891,214.413324,
+ 0.886288,0.152356,0.437356,33.585693,-116.761333,211.168163,
+ 0.886288,0.152356,0.437356,31.997642,-116.83891,214.413324,
+ 0.886288,0.152356,0.437356,32.895408,-118.494803,213.170872,
+ 0.182617,-0.830542,-0.526166,31.398321,-122.144582,209.898635,
+ 0.182617,-0.830542,-0.526166,30.945939,-123.455181,211.810381,
+ 0.182617,-0.830542,-0.526166,28.366421,-123.02805,210.240887,
+ 0.083482,-0.918249,-0.387104,30.945939,-123.455181,211.810381,
+ 0.083482,-0.918249,-0.387104,28.345125,-123.936464,212.391145,
+ 0.083482,-0.918249,-0.387104,28.366421,-123.02805,210.240887,
+ -0.314398,-0.873337,-0.37207,28.366421,-123.02805,210.240887,
+ -0.314398,-0.873337,-0.37207,28.345125,-123.936464,212.391145,
+ -0.314398,-0.873337,-0.37207,24.634501,-121.943794,210.849336,
+ -0.456457,-0.888362,-0.049599,28.345125,-123.936464,212.391145,
+ -0.456457,-0.888362,-0.049599,24.971886,-122.264751,213.493045,
+ -0.456457,-0.888362,-0.049599,24.634501,-121.943794,210.849336,
+ -0.782045,-0.622752,0.024198,24.634501,-121.943794,210.849336,
+ -0.782045,-0.622752,0.024198,24.971886,-122.264751,213.493045,
+ -0.782045,-0.622752,0.024198,22.863307,-119.709571,211.106101,
+ -0.70793,-0.696058,-0.119746,22.863307,-119.709571,211.106101,
+ -0.70793,-0.696058,-0.119746,24.971886,-122.264751,213.493045,
+ -0.70793,-0.696058,-0.119746,22.67195,-119.890889,213.291345,
+ -0.992014,0.098568,-0.07869,22.863307,-119.709571,211.106101,
+ -0.992014,0.098568,-0.07869,22.67195,-119.890889,213.291345,
+ -0.992014,0.098568,-0.07869,22.887341,-117.305895,213.814002,
+ -0.989857,-0.10177,0.099122,22.863307,-119.709571,211.106101,
+ -0.989857,-0.10177,0.099122,22.887341,-117.305895,213.814002,
+ -0.989857,-0.10177,0.099122,22.69933,-117.596125,211.638494,
+ -0.789466,0.101437,0.605354,23.866639,-115.633878,214.427014,
+ -0.789466,0.101437,0.605354,23.799101,-117.4431,214.642101,
+ -0.789466,0.101437,0.605354,24.655797,-116.049752,215.525872,
+ -0.730076,0.271565,0.627089,23.866639,-115.633878,214.427014,
+ -0.730076,0.271565,0.627089,24.655797,-116.049752,215.525872,
+ -0.730076,0.271565,0.627089,25.225609,-113.63482,215.143462,
+ -0.471735,0.245416,0.846899,25.225609,-113.63482,215.143462,
+ -0.471735,0.245416,0.846899,24.655797,-116.049752,215.525872,
+ -0.471735,0.245416,0.846899,25.747962,-114.364045,215.645737,
+ -0.093711,0.518348,0.85002,28.367942,-111.949721,214.462304,
+ -0.093711,0.518348,0.85002,25.225609,-113.63482,215.143462,
+ -0.093711,0.518348,0.85002,25.747962,-114.364045,215.645737,
+ -0.220605,0.61176,0.75966,28.367942,-111.949721,214.462304,
+ -0.220605,0.61176,0.75966,25.747962,-114.364045,215.645737,
+ -0.220605,0.61176,0.75966,28.401711,-112.956399,215.282797,
+ 0.372145,0.593873,0.713318,28.367942,-111.949721,214.462304,
+ 0.372145,0.593873,0.713318,28.401711,-112.956399,215.282797,
+ 0.372145,0.593873,0.713318,31.718973,-112.869695,213.479964,
+ 0.372853,0.591971,0.714529,31.718973,-112.869695,213.479964,
+ 0.372853,0.591971,0.714529,28.401711,-112.956399,215.282797,
+ 0.372853,0.591971,0.714529,31.209701,-113.727304,214.45622,
+ 0.790663,0.192203,0.5813,31.718973,-112.869695,213.479964,
+ 0.790663,0.192203,0.5813,31.209701,-113.727304,214.45622,
+ 0.790663,0.192203,0.5813,31.997642,-116.83891,214.413324,
+ 0.660856,0.15723,0.733858,31.209701,-113.727304,214.45622,
+ 0.660856,0.15723,0.733858,31.418399,-117.048217,214.97979,
+ 0.660856,0.15723,0.733858,31.997642,-116.83891,214.413324,
+ 0.716528,-0.12627,0.686034,32.895408,-118.494803,213.170872,
+ 0.716528,-0.12627,0.686034,31.997642,-116.83891,214.413324,
+ 0.716528,-0.12627,0.686034,31.418399,-117.048217,214.97979,
+ 0.725044,-0.10988,0.67988,32.895408,-118.494803,213.170872,
+ 0.725044,-0.10988,0.67988,31.418399,-117.048217,214.97979,
+ 0.725044,-0.10988,0.67988,32.171963,-118.436392,213.951816,
+ 0.256364,-0.865087,0.431163,30.945939,-123.455181,211.810381,
+ 0.256364,-0.865087,0.431163,30.623461,-122.612479,213.692921,
+ 0.256364,-0.865087,0.431163,28.345125,-123.936464,212.391145,
+ -0.036657,-0.667846,0.743396,30.623461,-122.612479,213.692921,
+ -0.036657,-0.667846,0.743396,28.352731,-122.995802,213.236584,
+ -0.036657,-0.667846,0.743396,28.345125,-123.936464,212.391145,
+ -0.087674,-0.665493,0.741237,24.971886,-122.264751,213.493045,
+ -0.087674,-0.665493,0.741237,28.345125,-123.936464,212.391145,
+ -0.087674,-0.665493,0.741237,28.352731,-122.995802,213.236584,
+ -0.099122,-0.704823,0.702424,28.352731,-122.995802,213.236584,
+ -0.099122,-0.704823,0.702424,25.533484,-121.59637,214.242958,
+ -0.099122,-0.704823,0.702424,24.971886,-122.264751,213.493045,
+ -0.502848,-0.423147,0.753717,22.67195,-119.890889,213.291345,
+ -0.502848,-0.423147,0.753717,24.971886,-122.264751,213.493045,
+ -0.502848,-0.423147,0.753717,25.533484,-121.59637,214.242958,
+ -0.553701,-0.616985,0.559237,25.533484,-121.59637,214.242958,
+ -0.553701,-0.616985,0.559237,23.653378,-119.617087,214.565132,
+ -0.553701,-0.616985,0.559237,22.67195,-119.890889,213.291345,
+ -0.795042,0.031847,0.605718,22.67195,-119.890889,213.291345,
+ -0.795042,0.031847,0.605718,23.653378,-119.617087,214.565132,
+ -0.795042,0.031847,0.605718,23.799101,-117.4431,214.642101,
+ -0.677013,-0.091246,0.730293,22.887341,-117.305895,213.814002,
+ -0.677013,-0.091246,0.730293,22.67195,-119.890889,213.291345,
+ -0.677013,-0.091246,0.730293,23.799101,-117.4431,214.642101,
+ 0.680866,-0.327284,0.655215,32.124504,-120.216104,213.112157,
+ 0.680866,-0.327284,0.655215,32.895408,-118.494803,213.170872,
+ 0.680866,-0.327284,0.655215,32.171963,-118.436392,213.951816,
+ 0.741157,-0.302515,0.599309,32.124504,-120.216104,213.112157,
+ 0.741157,-0.302515,0.599309,32.171963,-118.436392,213.951816,
+ 0.741157,-0.302515,0.599309,31.536134,-119.881458,214.008706,
+ 0.64368,-0.475276,0.599824,30.945939,-123.455181,211.810381,
+ 0.64368,-0.475276,0.599824,32.124504,-120.216104,213.112157,
+ 0.64368,-0.475276,0.599824,31.536134,-119.881458,214.008706,
+ 0.893039,-0.333387,0.302215,30.945939,-123.455181,211.810381,
+ 0.893039,-0.333387,0.302215,31.536134,-119.881458,214.008706,
+ 0.893039,-0.333387,0.302215,30.623461,-122.612479,213.692921,
+ -0.239667,-0.410639,0.879736,24.655797,-116.049752,215.525872,
+ -0.239667,-0.410639,0.879736,23.799101,-117.4431,214.642101,
+ -0.239667,-0.410639,0.879736,25.58429,-117.702907,215.00717,
+ 0.007887,-0.29533,0.955363,24.655797,-116.049752,215.525872,
+ 0.007887,-0.29533,0.955363,25.58429,-117.702907,215.00717,
+ 0.007887,-0.29533,0.955363,26.066485,-116.870245,215.260589,
+ 0.104932,-0.138015,0.984856,25.747962,-114.364045,215.645737,
+ 0.104932,-0.138015,0.984856,24.655797,-116.049752,215.525872,
+ 0.104932,-0.138015,0.984856,26.066485,-116.870245,215.260589,
+ 0.091401,-0.1399,0.985938,25.747962,-114.364045,215.645737,
+ 0.091401,-0.1399,0.985938,26.066485,-116.870245,215.260589,
+ 0.091401,-0.1399,0.985938,26.588534,-115.268504,215.439473,
+ 0.169738,-0.066483,0.983244,28.401711,-112.956399,215.282797,
+ 0.169738,-0.066483,0.983244,25.747962,-114.364045,215.645737,
+ 0.169738,-0.066483,0.983244,26.588534,-115.268504,215.439473,
+ -0.231139,0.245064,0.941551,28.401711,-112.956399,215.282797,
+ -0.231139,0.245064,0.941551,26.588534,-115.268504,215.439473,
+ -0.231139,0.245064,0.941551,28.432438,-114.168733,215.605883,
+ 0.336032,0.25048,0.907933,28.401711,-112.956399,215.282797,
+ 0.336032,0.25048,0.907933,28.432438,-114.168733,215.605883,
+ 0.336032,0.25048,0.907933,31.209701,-113.727304,214.45622,
+ 0.306347,0.363708,0.879698,31.209701,-113.727304,214.45622,
+ 0.306347,0.363708,0.879698,28.432438,-114.168733,215.605883,
+ 0.306347,0.363708,0.879698,29.996455,-115.596458,215.651517,
+ 0.552942,0.163557,0.817009,31.209701,-113.727304,214.45622,
+ 0.552942,0.163557,0.817009,29.996455,-115.596458,215.651517,
+ 0.552942,0.163557,0.817009,31.418399,-117.048217,214.97979,
+ 0.2254,-0.218534,0.949441,29.996455,-115.596458,215.651517,
+ 0.2254,-0.218534,0.949441,30.105063,-117.46835,215.194876,
+ 0.2254,-0.218534,0.949441,31.418399,-117.048217,214.97979,
+ 0.285998,-0.465133,0.837769,31.418399,-117.048217,214.97979,
+ 0.285998,-0.465133,0.837769,30.105063,-117.46835,215.194876,
+ 0.285998,-0.465133,0.837769,32.171963,-118.436392,213.951816,
+ 0.219682,-0.558279,0.80004,30.105063,-117.46835,215.194876,
+ 0.219682,-0.558279,0.80004,30.544363,-118.290364,214.500636,
+ 0.219682,-0.558279,0.80004,32.171963,-118.436392,213.951816,
+ -0.143527,-0.27984,0.949257,29.599746,-120.763404,214.083241,
+ -0.143527,-0.27984,0.949257,28.352731,-122.995802,213.236584,
+ -0.143527,-0.27984,0.949257,30.623461,-122.612479,213.692921,
+ -0.066609,-0.32108,0.944707,29.599746,-120.763404,214.083241,
+ -0.066609,-0.32108,0.944707,27.92347,-121.670601,213.656718,
+ -0.066609,-0.32108,0.944707,28.352731,-122.995802,213.236584,
+ 0.225322,-0.227366,0.947383,25.533484,-121.59637,214.242958,
+ 0.225322,-0.227366,0.947383,28.352731,-122.995802,213.236584,
+ 0.225322,-0.227366,0.947383,27.92347,-121.670601,213.656718,
+ 0.157701,-0.667771,0.727469,26.509436,-120.875054,214.693515,
+ 0.157701,-0.667771,0.727469,25.533484,-121.59637,214.242958,
+ 0.157701,-0.667771,0.727469,27.92347,-121.670601,213.656718,
+ -0.185808,-0.327302,0.926471,23.653378,-119.617087,214.565132,
+ -0.185808,-0.327302,0.926471,25.533484,-121.59637,214.242958,
+ -0.185808,-0.327302,0.926471,26.509436,-120.875054,214.693515,
+ -0.187992,0.584198,-0.789539,26.168096,-111.449576,204.371487,
+ -0.187992,0.584198,-0.789539,26.950257,-112.020605,203.762735,
+ -0.187992,0.584198,-0.789539,25.754655,-112.926281,203.377282,
+ -0.330303,0.589025,-0.737529,26.168096,-111.449576,204.371487,
+ -0.330303,0.589025,-0.737529,25.754655,-112.926281,203.377282,
+ -0.330303,0.589025,-0.737529,24.941159,-112.532615,204.056007,
+ 0.140116,0.805602,-0.57565,27.98036,-111.46783,204.787058,
+ 0.140116,0.805602,-0.57565,26.950257,-112.020605,203.762735,
+ 0.140116,0.805602,-0.57565,26.168096,-111.449576,204.371487,
+ 0.115634,0.878412,-0.463704,29.844038,-112.014825,204.495307,
+ 0.115634,0.878412,-0.463704,29.140368,-112.379894,203.628267,
+ 0.115634,0.878412,-0.463704,26.950257,-112.020605,203.762735,
+ 0.144923,0.802487,-0.578803,29.844038,-112.014825,204.495307,
+ 0.144923,0.802487,-0.578803,26.950257,-112.020605,203.762735,
+ 0.144923,0.802487,-0.578803,27.98036,-111.46783,204.787058,
+ 0.312512,0.712313,-0.628448,30.670312,-113.439508,203.188055,
+ 0.312512,0.712313,-0.628448,29.723261,-113.393874,202.768834,
+ 0.312512,0.712313,-0.628448,29.140368,-112.379894,203.628267,
+ 0.340606,0.735245,-0.586006,30.670312,-113.439508,203.188055,
+ 0.340606,0.735245,-0.586006,29.140368,-112.379894,203.628267,
+ 0.340606,0.735245,-0.586006,29.844038,-112.014825,204.495307,
+ 0.526559,0.350653,-0.774453,29.723261,-113.393874,202.768834,
+ 0.526559,0.350653,-0.774453,30.631067,-115.043987,202.63893,
+ 0.526559,0.350653,-0.774453,29.92983,-114.85841,202.246176,
+ 0.399184,0.288133,-0.87042,29.723261,-113.393874,202.768834,
+ 0.399184,0.288133,-0.87042,30.670312,-113.439508,203.188055,
+ 0.399184,0.288133,-0.87042,30.631067,-115.043987,202.63893,
+ 0.091453,-0.49283,-0.865307,28.818194,-117.049738,202.38399,
+ 0.091453,-0.49283,-0.865307,27.696519,-118.093836,202.860101,
+ 0.091453,-0.49283,-0.865307,27.620463,-117.426367,202.471911,
+ 0.044409,-0.453596,-0.8901,28.818194,-117.049738,202.38399,
+ 0.044409,-0.453596,-0.8901,29.665763,-117.461657,202.636192,
+ 0.044409,-0.453596,-0.8901,27.696519,-118.093836,202.860101,
+ -0.181227,-0.315065,-0.931607,25.877258,-117.134312,202.712248,
+ -0.181227,-0.315065,-0.931607,27.620463,-117.426367,202.471911,
+ -0.181227,-0.315065,-0.931607,25.273981,-117.85867,203.074579,
+ -0.12483,-0.509402,-0.851427,27.620463,-117.426367,202.471911,
+ -0.12483,-0.509402,-0.851427,27.696519,-118.093836,202.860101,
+ -0.12483,-0.509402,-0.851427,25.273981,-117.85867,203.074579,
+ -0.318171,-0.242145,-0.916587,25.189102,-116.089606,202.675133,
+ -0.318171,-0.242145,-0.916587,25.877258,-117.134312,202.712248,
+ -0.318171,-0.242145,-0.916587,24.056779,-116.620477,203.208438,
+ -0.310882,-0.205286,-0.928014,24.056779,-116.620477,203.208438,
+ -0.310882,-0.205286,-0.928014,25.877258,-117.134312,202.712248,
+ -0.310882,-0.205286,-0.928014,25.273981,-117.85867,203.074579,
+ -0.554094,0.228243,-0.800553,25.092359,-114.494862,203.0977,
+ -0.554094,0.228243,-0.800553,24.056779,-116.620477,203.208438,
+ -0.554094,0.228243,-0.800553,24.091157,-114.866015,203.684853,
+ -0.491282,0.195125,-0.848863,25.092359,-114.494862,203.0977,
+ -0.491282,0.195125,-0.848863,25.189102,-116.089606,202.675133,
+ -0.491282,0.195125,-0.848863,24.056779,-116.620477,203.208438,
+ 0.219571,-0.140947,-0.965361,29.92983,-114.85841,202.246176,
+ 0.219571,-0.140947,-0.965361,30.42602,-116.504568,202.599381,
+ 0.219571,-0.140947,-0.965361,29.481707,-115.731534,202.271731,
+ 0.479396,-0.043567,-0.876517,29.92983,-114.85841,202.246176,
+ 0.479396,-0.043567,-0.876517,30.631067,-115.043987,202.63893,
+ 0.479396,-0.043567,-0.876517,30.42602,-116.504568,202.599381,
+ 0.184575,-0.18375,-0.965488,29.481707,-115.731534,202.271731,
+ 0.184575,-0.18375,-0.965488,30.42602,-116.504568,202.599381,
+ 0.184575,-0.18375,-0.965488,29.665763,-117.461657,202.636192,
+ 0.198236,-0.181803,-0.963146,29.481707,-115.731534,202.271731,
+ 0.198236,-0.181803,-0.963146,29.665763,-117.461657,202.636192,
+ 0.198236,-0.181803,-0.963146,28.818194,-117.049738,202.38399,
+ 0.224194,-0.859668,-0.459029,30.885094,-119.24502,206.084879,
+ 0.224194,-0.859668,-0.459029,27.852282,-119.460411,205.007012,
+ 0.224194,-0.859668,-0.459029,30.215192,-118.6962,204.729864,
+ 0.243402,-0.817839,-0.521435,30.885094,-119.24502,206.084879,
+ 0.243402,-0.817839,-0.521435,27.966062,-120.68248,206.976865,
+ 0.243402,-0.817839,-0.521435,27.852282,-119.460411,205.007012,
+ -0.127898,-0.846069,-0.517502,27.966062,-120.68248,206.976865,
+ -0.127898,-0.846069,-0.517502,24.942072,-119.178091,205.26469,
+ -0.127898,-0.846069,-0.517502,27.852282,-119.460411,205.007012,
+ -0.222735,-0.892948,-0.391194,27.966062,-120.68248,206.976865,
+ -0.222735,-0.892948,-0.391194,24.626287,-119.966032,207.243061,
+ -0.222735,-0.892948,-0.391194,24.942072,-119.178091,205.26469,
+ -0.689469,-0.628341,-0.360306,24.942072,-119.178091,205.26469,
+ -0.689469,-0.628341,-0.360306,24.626287,-119.966032,207.243061,
+ -0.689469,-0.628341,-0.360306,23.51313,-117.630198,205.299676,
+ -0.741383,-0.601271,-0.298034,23.51313,-117.630198,205.299676,
+ -0.741383,-0.601271,-0.298034,24.626287,-119.966032,207.243061,
+ -0.741383,-0.601271,-0.298034,23.342765,-118.413575,207.303906,
+ -0.990207,-0.079049,-0.115068,23.51313,-117.630198,205.299676,
+ -0.990207,-0.079049,-0.115068,23.342765,-118.413575,207.303906,
+ -0.990207,-0.079049,-0.115068,23.172399,-116.770156,207.640986,
+ -0.983833,0.064762,-0.166967,23.51313,-117.630198,205.299676,
+ -0.983833,0.064762,-0.166967,23.172399,-116.770156,207.640986,
+ -0.983833,0.064762,-0.166967,23.555113,-115.541393,205.862491,
+ -0.930667,0.364497,-0.031642,23.172399,-116.770156,207.640986,
+ -0.930667,0.364497,-0.031642,22.783905,-117.580001,209.738613,
+ -0.930667,0.364497,-0.031642,24.367088,-113.667372,208.244567,
+ -0.930405,0.365381,-0.029049,24.367088,-113.667372,208.244567,
+ -0.930405,0.365381,-0.029049,22.783905,-117.580001,209.738613,
+ -0.930405,0.365381,-0.029049,24.211934,-113.891889,210.389957,
+ -0.733976,0.678937,0.01797,24.367088,-113.667372,208.244567,
+ -0.733976,0.678937,0.01797,24.211934,-113.891889,210.389957,
+ -0.733976,0.678937,0.01797,25.667343,-112.27159,208.617851,
+ -0.69715,0.712564,0.078961,25.861742,-112.324525,210.811916,
+ -0.69715,0.712564,0.078961,25.667343,-112.27159,208.617851,
+ -0.69715,0.712564,0.078961,24.211934,-113.891889,210.389957,
+ -0.183406,0.982225,0.039948,27.832203,-111.889789,209.169409,
+ -0.183406,0.982225,0.039948,25.667343,-112.27159,208.617851,
+ -0.183406,0.982225,0.039948,25.861742,-112.324525,210.811916,
+ -0.172687,0.983541,0.053156,28.055808,-111.962499,211.241177,
+ -0.172687,0.983541,0.053156,27.832203,-111.889789,209.169409,
+ -0.172687,0.983541,0.053156,25.861742,-112.324525,210.811916,
+ 0.054755,0.998075,0.029118,30.304634,-112.017563,208.899867,
+ 0.054755,0.998075,0.029118,27.832203,-111.889789,209.169409,
+ 0.054755,0.998075,0.029118,28.055808,-111.962499,211.241177,
+ 0.07634,0.995832,0.049904,30.837027,-112.15203,210.768717,
+ 0.07634,0.995832,0.049904,30.304634,-112.017563,208.899867,
+ 0.07634,0.995832,0.049904,28.055808,-111.962499,211.241177,
+ 0.678085,0.721278,-0.141274,32.069439,-114.138007,206.544562,
+ 0.678085,0.721278,-0.141274,30.304634,-112.017563,208.899867,
+ 0.678085,0.721278,-0.141274,30.837027,-112.15203,210.768717,
+ 0.608404,0.771691,-0.185305,32.874417,-114.205544,208.906255,
+ 0.608404,0.771691,-0.185305,32.069439,-114.138007,206.544562,
+ 0.608404,0.771691,-0.185305,30.837027,-112.15203,210.768717,
+ 0.918179,0.251915,-0.305755,32.291523,-115.601021,206.006085,
+ 0.918179,0.251915,-0.305755,32.069439,-114.138007,206.544562,
+ 0.918179,0.251915,-0.305755,32.874417,-114.205544,208.906255,
+ 0.92888,0.224398,-0.294665,32.291523,-115.601021,206.006085,
+ 0.92888,0.224398,-0.294665,32.874417,-114.205544,208.906255,
+ 0.92888,0.224398,-0.294665,33.044478,-115.956964,208.108579,
+ 0.186653,-0.763032,-0.618823,30.885094,-119.24502,206.084879,
+ 0.186653,-0.763032,-0.618823,28.240168,-121.879907,208.536014,
+ 0.186653,-0.763032,-0.618823,27.966062,-120.68248,206.976865,
+ 0.18567,-0.7627,-0.619528,28.240168,-121.879907,208.536014,
+ 0.18567,-0.7627,-0.619528,30.885094,-119.24502,206.084879,
+ 0.18567,-0.7627,-0.619528,31.319526,-120.411416,207.651026,
+ -0.215471,-0.792398,-0.570681,28.240168,-121.879907,208.536014,
+ -0.215471,-0.792398,-0.570681,24.626287,-119.966032,207.243061,
+ -0.215471,-0.792398,-0.570681,27.966062,-120.68248,206.976865,
+ -0.294399,-0.850439,-0.435985,28.240168,-121.879907,208.536014,
+ -0.294399,-0.850439,-0.435985,24.44862,-120.861364,209.109477,
+ -0.294399,-0.850439,-0.435985,24.626287,-119.966032,207.243061,
+ -0.728233,-0.588303,-0.351534,24.626287,-119.966032,207.243061,
+ -0.728233,-0.588303,-0.351534,24.44862,-120.861364,209.109477,
+ -0.728233,-0.588303,-0.351534,23.342765,-118.413575,207.303906,
+ -0.777737,-0.560807,-0.283938,23.342765,-118.413575,207.303906,
+ -0.777737,-0.560807,-0.283938,24.44862,-120.861364,209.109477,
+ -0.777737,-0.560807,-0.283938,23.076568,-119.057618,209.305093,
+ -0.974305,-0.141583,-0.175167,23.342765,-118.413575,207.303906,
+ -0.974305,-0.141583,-0.175167,23.076568,-119.057618,209.305093,
+ -0.974305,-0.141583,-0.175167,22.783905,-117.580001,209.738613,
+ -0.977176,-0.059469,-0.203939,23.342765,-118.413575,207.303906,
+ -0.977176,-0.059469,-0.203939,22.783905,-117.580001,209.738613,
+ -0.977176,-0.059469,-0.203939,23.172399,-116.770156,207.640986,
+ -0.929559,0.366682,-0.038268,22.783905,-117.580001,209.738613,
+ -0.929559,0.366682,-0.038268,22.69933,-117.596125,211.638494,
+ -0.929559,0.366682,-0.038268,24.211934,-113.891889,210.389957,
+ -0.877095,0.430175,0.213667,24.211934,-113.891889,210.389957,
+ -0.877095,0.430175,0.213667,22.69933,-117.596125,211.638494,
+ -0.877095,0.430175,0.213667,24.479347,-114.389296,212.489105,
+ -0.699835,0.66991,0.247893,24.211934,-113.891889,210.389957,
+ -0.699835,0.66991,0.247893,24.479347,-114.389296,212.489105,
+ -0.699835,0.66991,0.247893,25.861742,-112.324525,210.811916,
+ -0.845745,0.53191,-0.042262,25.861742,-112.324525,210.811916,
+ -0.845745,0.53191,-0.042262,24.479347,-114.389296,212.489105,
+ -0.845745,0.53191,-0.042262,25.573642,-112.631488,212.713927,
+ -0.185965,0.974047,0.129031,28.055808,-111.962499,211.241177,
+ -0.185965,0.974047,0.129031,25.861742,-112.324525,210.811916,
+ -0.185965,0.974047,0.129031,25.573642,-112.631488,212.713927
+};
+static const struct gllist headroom_model_teeth_lower_half_frame = {
+ GL_N3F_V3F, GL_TRIANGLES, 6510, headroom_model_teeth_lower_half_data, 0
+};
+const struct gllist *headroom_model_teeth_lower_half = &headroom_model_teeth_lower_half_frame;
+
+static const float headroom_model_teeth_upper_half_data[] = {
+ 0.208217,-0.962409,0.1744,17.405827,-156.118225,223.300933,
+ 0.208217,-0.962409,0.1744,16.179803,-156.414844,223.12783,
+ 0.208217,-0.962409,0.1744,16.121088,-156.66157,221.836397,
+ 0.098197,-0.949681,0.29743,17.405827,-156.118225,223.300933,
+ 0.098197,-0.949681,0.29743,16.73775,-155.478137,225.565275,
+ 0.098197,-0.949681,0.29743,15.98875,-155.597697,225.430808,
+ -0.599602,-0.781709,0.17149,16.179803,-156.414844,223.12783,
+ -0.599602,-0.781709,0.17149,14.243415,-154.460507,225.265918,
+ -0.599602,-0.781709,0.17149,14.001861,-154.845655,222.665713,
+ -0.545793,-0.802928,0.239618,16.179803,-156.414844,223.12783,
+ -0.545793,-0.802928,0.239618,15.98875,-155.597697,225.430808,
+ -0.545793,-0.802928,0.239618,14.243415,-154.460507,225.265918,
+ -0.552134,0.82884,0.090401,14.356891,-147.153039,222.468576,
+ -0.552134,0.82884,0.090401,12.577787,-148.368719,222.748462,
+ -0.552134,0.82884,0.090401,14.17679,-147.569522,225.187124,
+ -0.521453,0.850948,0.063038,14.17679,-147.569522,225.187124,
+ -0.521453,0.850948,0.063038,12.577787,-148.368719,222.748462,
+ -0.521453,0.850948,0.063038,12.969628,-148.326432,225.418943,
+ 0.79698,0.452242,0.400374,17.584711,-149.117719,222.803527,
+ 0.79698,0.452242,0.400374,16.328873,-147.151822,223.082804,
+ 0.79698,0.452242,0.400374,16.318529,-149.104029,225.30851,
+ 0.778421,0.470131,0.415978,16.328873,-147.151822,223.082804,
+ 0.778421,0.470131,0.415978,15.483738,-147.879831,225.487089,
+ 0.778421,0.470131,0.415978,16.318529,-149.104029,225.30851,
+ 0.834445,0.390116,0.389243,17.584711,-149.117719,222.803527,
+ 0.834445,0.390116,0.389243,17.46728,-151.493407,225.436284,
+ 0.834445,0.390116,0.389243,18.653755,-151.584979,222.98454,
+ 0.813677,0.413068,0.409028,17.584711,-149.117719,222.803527,
+ 0.813677,0.413068,0.409028,16.318529,-149.104029,225.30851,
+ 0.813677,0.413068,0.409028,17.46728,-151.493407,225.436284,
+ 0.891327,0.238132,0.385784,18.653755,-151.584979,222.98454,
+ 0.891327,0.238132,0.385784,18.032529,-153.651574,225.695483,
+ 0.891327,0.238132,0.385784,19.104616,-153.682605,223.237655,
+ 0.868967,0.276856,0.41018,18.653755,-151.584979,222.98454,
+ 0.868967,0.276856,0.41018,17.46728,-151.493407,225.436284,
+ 0.868967,0.276856,0.41018,18.032529,-153.651574,225.695483,
+ 0.582259,-0.805704,-0.108698,18.379649,-155.422464,222.183822,
+ 0.582259,-0.805704,-0.108698,16.418011,-156.514325,219.769193,
+ 0.582259,-0.805704,-0.108698,18.152089,-155.319028,220.198149,
+ 0.682711,-0.689086,-0.243038,18.379649,-155.422464,222.183822,
+ 0.682711,-0.689086,-0.243038,17.495877,-156.275205,222.119022,
+ 0.682711,-0.689086,-0.243038,16.418011,-156.514325,219.769193,
+ 0.275925,-0.960748,-0.0288,17.495877,-156.275205,222.119022,
+ 0.275925,-0.960748,-0.0288,16.121088,-156.66157,221.836397,
+ 0.275925,-0.960748,-0.0288,16.418011,-156.514325,219.769193,
+ 0.070097,-0.995682,-0.060853,16.418011,-156.514325,219.769193,
+ 0.070097,-0.995682,-0.060853,16.121088,-156.66157,221.836397,
+ 0.070097,-0.995682,-0.060853,15.203851,-156.587643,219.57023,
+ -0.68006,-0.688191,0.252806,16.121088,-156.66157,221.836397,
+ -0.68006,-0.688191,0.252806,13.513885,-154.906804,219.59974,
+ -0.68006,-0.688191,0.252806,15.203851,-156.587643,219.57023,
+ -0.598015,-0.798358,0.070737,16.121088,-156.66157,221.836397,
+ -0.598015,-0.798358,0.070737,14.059055,-155.113677,221.873817,
+ -0.598015,-0.798358,0.070737,13.513885,-154.906804,219.59974,
+ -0.555075,0.775585,-0.300598,14.494096,-147.314582,221.352377,
+ -0.555075,0.775585,-0.300598,12.752716,-149.257358,219.555323,
+ -0.555075,0.775585,-0.300598,12.683961,-148.465158,221.726268,
+ -0.55458,0.775703,-0.301206,12.752716,-149.257358,219.555323,
+ -0.55458,0.775703,-0.301206,14.494096,-147.314582,221.352377,
+ -0.55458,0.775703,-0.301206,14.87103,-147.842715,219.298254,
+ 0.878702,0.388802,0.276977,18.924211,-150.33918,218.934402,
+ 0.878702,0.388802,0.276977,17.098256,-146.673885,219.582095,
+ 0.878702,0.388802,0.276977,16.526619,-146.961682,221.799586,
+ 0.85467,0.505193,0.119664,18.924211,-150.33918,218.934402,
+ 0.85467,0.505193,0.119664,16.526619,-146.961682,221.799586,
+ 0.85467,0.505193,0.119664,17.812271,-149.152705,221.867124,
+ 0.942226,0.170884,0.288111,18.924211,-150.33918,218.934402,
+ 0.942226,0.170884,0.288111,17.812271,-149.152705,221.867124,
+ 0.942226,0.170884,0.288111,19.109787,-152.544198,219.635334,
+ 0.89844,0.422475,-0.11967,19.109787,-152.544198,219.635334,
+ 0.89844,0.422475,-0.11967,17.812271,-149.152705,221.867124,
+ 0.89844,0.422475,-0.11967,19.0891,-152.117675,220.985786,
+ 0.994055,-0.098523,0.046345,19.109787,-152.544198,219.635334,
+ 0.994055,-0.098523,0.046345,19.0891,-152.117675,220.985786,
+ 0.994055,-0.098523,0.046345,18.925123,-153.981354,220.54101,
+ 0.984513,-0.046268,-0.169095,18.925123,-153.981354,220.54101,
+ 0.984513,-0.046268,-0.169095,19.0891,-152.117675,220.985786,
+ 0.984513,-0.046268,-0.169095,19.17337,-153.965838,221.982121,
+ 0.876662,-0.45678,0.151051,19.17337,-153.965838,221.982121,
+ 0.876662,-0.45678,0.151051,19.104616,-153.682605,223.237655,
+ 0.876662,-0.45678,0.151051,18.379649,-155.422464,222.183822,
+ 0.917086,-0.397845,0.025941,18.379649,-155.422464,222.183822,
+ 0.917086,-0.397845,0.025941,19.104616,-153.682605,223.237655,
+ 0.917086,-0.397845,0.025941,18.368393,-155.356448,223.594206,
+ 0.692333,-0.72051,0.039251,18.379649,-155.422464,222.183822,
+ 0.692333,-0.72051,0.039251,18.368393,-155.356448,223.594206,
+ 0.692333,-0.72051,0.039251,17.495877,-156.275205,222.119022,
+ 0.584929,-0.797014,0.150424,18.368393,-155.356448,223.594206,
+ 0.584929,-0.797014,0.150424,17.405827,-156.118225,223.300933,
+ 0.584929,-0.797014,0.150424,17.495877,-156.275205,222.119022,
+ -0.588753,-0.788599,0.177428,16.179803,-156.414844,223.12783,
+ -0.588753,-0.788599,0.177428,14.059055,-155.113677,221.873817,
+ -0.588753,-0.788599,0.177428,16.121088,-156.66157,221.836397,
+ 0.919014,0.333075,0.21089,19.0891,-152.117675,220.985786,
+ 0.919014,0.333075,0.21089,17.812271,-149.152705,221.867124,
+ 0.919014,0.333075,0.21089,17.584711,-149.117719,222.803527,
+ 0.97467,0.138926,0.175265,19.0891,-152.117675,220.985786,
+ 0.97467,0.138926,0.175265,18.653755,-151.584979,222.98454,
+ 0.97467,0.138926,0.175265,19.17337,-153.965838,221.982121,
+ 0.911258,0.401551,0.09146,19.0891,-152.117675,220.985786,
+ 0.911258,0.401551,0.09146,17.584711,-149.117719,222.803527,
+ 0.911258,0.401551,0.09146,18.653755,-151.584979,222.98454,
+ -0.60053,-0.769568,0.217092,16.179803,-156.414844,223.12783,
+ -0.60053,-0.769568,0.217092,14.001861,-154.845655,222.665713,
+ -0.60053,-0.769568,0.217092,14.059055,-155.113677,221.873817,
+ -0.55123,0.823369,-0.134937,14.494096,-147.314582,221.352377,
+ -0.55123,0.823369,-0.134937,12.683961,-148.465158,221.726268,
+ -0.55123,0.823369,-0.134937,12.577787,-148.368719,222.748462,
+ -0.574113,0.797376,-0.185972,14.494096,-147.314582,221.352377,
+ -0.574113,0.797376,-0.185972,12.577787,-148.368719,222.748462,
+ -0.574113,0.797376,-0.185972,14.356891,-147.153039,222.468576,
+ 0.239782,-0.959824,0.145751,17.495877,-156.275205,222.119022,
+ 0.239782,-0.959824,0.145751,17.405827,-156.118225,223.300933,
+ 0.239782,-0.959824,0.145751,16.121088,-156.66157,221.836397,
+ 0.841625,0.500132,0.203802,16.526619,-146.961682,221.799586,
+ 0.841625,0.500132,0.203802,16.328873,-147.151822,223.082804,
+ 0.841625,0.500132,0.203802,17.812271,-149.152705,221.867124,
+ 0.977506,0.210824,0.00597,19.17337,-153.965838,221.982121,
+ 0.977506,0.210824,0.00597,18.653755,-151.584979,222.98454,
+ 0.977506,0.210824,0.00597,19.104616,-153.682605,223.237655,
+ -0.65264,0.757388,-0.020631,14.198086,-149.662889,211.118575,
+ -0.65264,0.757388,-0.020631,13.336218,-150.403371,211.19889,
+ -0.65264,0.757388,-0.020631,13.408319,-150.280465,213.430071,
+ -0.567581,0.817588,-0.096958,16.492241,-148.024641,213.300167,
+ -0.567581,0.817588,-0.096958,16.105268,-148.512313,211.453221,
+ -0.567581,0.817588,-0.096958,15.59052,-148.632482,213.453192,
+ -0.751459,0.641516,-0.154164,16.764522,-148.104652,211.640015,
+ -0.751459,0.641516,-0.154164,16.492241,-148.024641,213.300167,
+ -0.751459,0.641516,-0.154164,17.181309,-147.221793,213.282218,
+ -0.496539,0.859277,-0.12285,16.764522,-148.104652,211.640015,
+ -0.496539,0.859277,-0.12285,16.105268,-148.512313,211.453221,
+ -0.496539,0.859277,-0.12285,16.492241,-148.024641,213.300167,
+ 0.839888,0.510243,0.185042,17.812271,-149.152705,221.867124,
+ 0.839888,0.510243,0.185042,16.328873,-147.151822,223.082804,
+ 0.839888,0.510243,0.185042,17.584711,-149.117719,222.803527,
+ -0.600032,0.797344,-0.064843,15.59052,-148.632482,213.453192,
+ -0.600032,0.797344,-0.064843,13.465209,-150.056251,215.612576,
+ -0.600032,0.797344,-0.064843,15.541236,-148.515659,215.345771,
+ -0.101694,0.436043,0.894162,14.17679,-147.569522,225.187124,
+ -0.101694,0.436043,0.894162,12.969628,-148.326432,225.418943,
+ -0.101694,0.436043,0.894162,15.483738,-147.879831,225.487089,
+ -0.18441,0.160624,0.969635,14.9985,-147.526018,225.336194,
+ -0.18441,0.160624,0.969635,14.17679,-147.569522,225.187124,
+ -0.18441,0.160624,0.969635,15.483738,-147.879831,225.487089,
+ 0.185273,-0.829823,-0.526372,14.303347,-153.98257,214.796342,
+ 0.185273,-0.829823,-0.526372,13.498978,-154.818275,215.830705,
+ 0.185273,-0.829823,-0.526372,13.317052,-154.032767,214.528321,
+ -0.786744,0.613596,-0.067331,11.539774,-151.303267,213.632989,
+ -0.786744,0.613596,-0.067331,11.338986,-151.35681,215.491191,
+ -0.786744,0.613596,-0.067331,11.758207,-150.820159,215.483281,
+ -0.600881,0.796594,-0.066173,15.59052,-148.632482,213.453192,
+ -0.600881,0.796594,-0.066173,13.408319,-150.280465,213.430071,
+ -0.600881,0.796594,-0.066173,13.465209,-150.056251,215.612576,
+ 0.045559,-0.794062,-0.606126,14.530299,-154.872427,215.979167,
+ 0.045559,-0.794062,-0.606126,13.498978,-154.818275,215.830705,
+ 0.045559,-0.794062,-0.606126,14.303347,-153.98257,214.796342,
+ -0.422047,0.888105,-0.182059,11.882939,-151.140811,213.629946,
+ -0.422047,0.888105,-0.182059,11.539774,-151.303267,213.632989,
+ -0.422047,0.888105,-0.182059,11.758207,-150.820159,215.483281,
+ -0.39008,0.902533,-0.182404,13.465209,-150.056251,215.612576,
+ -0.39008,0.902533,-0.182404,11.882939,-151.140811,213.629946,
+ -0.39008,0.902533,-0.182404,11.758207,-150.820159,215.483281,
+ -0.497372,0.864218,-0.075818,13.465209,-150.056251,215.612576,
+ -0.497372,0.864218,-0.075818,13.408319,-150.280465,213.430071,
+ -0.497372,0.864218,-0.075818,11.882939,-151.140811,213.629946,
+ -0.608761,0.790714,-0.064661,16.299059,-147.942197,215.223778,
+ -0.608761,0.790714,-0.064661,15.59052,-148.632482,213.453192,
+ -0.608761,0.790714,-0.064661,15.541236,-148.515659,215.345771,
+ -0.567274,0.818369,-0.092044,16.492241,-148.024641,213.300167,
+ -0.567274,0.818369,-0.092044,15.59052,-148.632482,213.453192,
+ -0.567274,0.818369,-0.092044,16.299059,-147.942197,215.223778,
+ -0.18341,-0.852903,-0.488791,13.498978,-154.818275,215.830705,
+ -0.18341,-0.852903,-0.488791,12.602733,-153.33153,213.572752,
+ -0.18341,-0.852903,-0.488791,13.317052,-154.032767,214.528321,
+ -0.81248,0.573241,-0.106164,16.492241,-148.024641,213.300167,
+ -0.81248,0.573241,-0.106164,16.299059,-147.942197,215.223778,
+ -0.81248,0.573241,-0.106164,16.914809,-147.088847,215.119124,
+ -0.751324,0.641371,-0.155422,17.181309,-147.221793,213.282218,
+ -0.751324,0.641371,-0.155422,16.492241,-148.024641,213.300167,
+ -0.751324,0.641371,-0.155422,16.914809,-147.088847,215.119124,
+ -0.59752,-0.757891,-0.261859,13.498978,-154.818275,215.830705,
+ -0.59752,-0.757891,-0.261859,12.48652,-153.796689,215.184228,
+ -0.59752,-0.757891,-0.261859,12.602733,-153.33153,213.572752,
+ -0.319104,0.940792,-0.114386,17.640992,-146.812612,215.365242,
+ -0.319104,0.940792,-0.114386,17.181309,-147.221793,213.282218,
+ -0.319104,0.940792,-0.114386,16.914809,-147.088847,215.119124,
+ -0.611841,0.79072,-0.020305,17.640992,-146.812612,215.365242,
+ -0.611841,0.79072,-0.020305,17.46941,-146.993017,213.510082,
+ -0.611841,0.79072,-0.020305,17.181309,-147.221793,213.282218,
+ 0.725455,-0.523724,-0.446574,16.979609,-152.419466,214.623543,
+ 0.725455,-0.523724,-0.446574,17.579235,-152.833515,216.083211,
+ 0.725455,-0.523724,-0.446574,16.723148,-154.022728,216.087166,
+ 0.650247,-0.566323,-0.506416,16.979609,-152.419466,214.623543,
+ 0.650247,-0.566323,-0.506416,16.723148,-154.022728,216.087166,
+ 0.650247,-0.566323,-0.506416,16.372681,-153.231136,214.751926,
+ 0.276359,-0.793131,-0.542742,16.723148,-154.022728,216.087166,
+ 0.276359,-0.793131,-0.542742,14.303347,-153.98257,214.796342,
+ 0.276359,-0.793131,-0.542742,16.372681,-153.231136,214.751926,
+ 0.312567,-0.729294,-0.608632,16.723148,-154.022728,216.087166,
+ 0.312567,-0.729294,-0.608632,14.530299,-154.872427,215.979167,
+ 0.312567,-0.729294,-0.608632,14.303347,-153.98257,214.796342,
+ 0.826032,-0.319375,-0.464404,17.671111,-148.942486,212.566987,
+ 0.826032,-0.319375,-0.464404,18.142963,-149.673841,213.909224,
+ 0.826032,-0.319375,-0.464404,17.635821,-149.785796,213.084168,
+ 0.806306,-0.392704,-0.442329,17.635821,-149.785796,213.084168,
+ 0.806306,-0.392704,-0.442329,18.142963,-149.673841,213.909224,
+ 0.806306,-0.392704,-0.442329,18.038005,-150.487641,214.4404,
+ -0.522236,0.85139,0.049039,16.105268,-148.512313,211.453221,
+ -0.522236,0.85139,0.049039,14.198086,-149.662889,211.118575,
+ -0.522236,0.85139,0.049039,13.408319,-150.280465,213.430071,
+ 0.642236,-0.562579,-0.520613,16.676297,-151.637914,213.40482,
+ 0.642236,-0.562579,-0.520613,16.979609,-152.419466,214.623543,
+ 0.642236,-0.562579,-0.520613,16.372681,-153.231136,214.751926,
+ 0.750409,-0.469339,-0.465412,17.635821,-149.785796,213.084168,
+ 0.750409,-0.469339,-0.465412,18.038005,-150.487641,214.4404,
+ 0.750409,-0.469339,-0.465412,16.676297,-151.637914,213.40482,
+ 0.749818,-0.456235,-0.47919,16.676297,-151.637914,213.40482,
+ 0.749818,-0.456235,-0.47919,18.038005,-150.487641,214.4404,
+ 0.749818,-0.456235,-0.47919,16.979609,-152.419466,214.623543,
+ -0.598514,0.794024,-0.106335,16.105268,-148.512313,211.453221,
+ -0.598514,0.794024,-0.106335,13.408319,-150.280465,213.430071,
+ -0.598514,0.794024,-0.106335,15.59052,-148.632482,213.453192,
+ 0.667038,-0.551056,-0.501395,16.109223,-152.276176,213.351885,
+ 0.667038,-0.551056,-0.501395,16.676297,-151.637914,213.40482,
+ 0.667038,-0.551056,-0.501395,16.372681,-153.231136,214.751926,
+ -0.64797,0.727209,-0.226499,17.181309,-147.221793,213.282218,
+ -0.64797,0.727209,-0.226499,17.064183,-147.7192,212.020295,
+ -0.64797,0.727209,-0.226499,16.764522,-148.104652,211.640015,
+ 0.231104,-0.782964,-0.577545,16.372681,-153.231136,214.751926,
+ 0.231104,-0.782964,-0.577545,14.386096,-152.71791,213.261226,
+ 0.231104,-0.782964,-0.577545,16.109223,-152.276176,213.351885,
+ -0.44143,0.848012,-0.293286,17.46941,-146.993017,213.510082,
+ -0.44143,0.848012,-0.293286,17.064183,-147.7192,212.020295,
+ -0.44143,0.848012,-0.293286,17.181309,-147.221793,213.282218,
+ 0.260106,-0.752088,-0.605565,16.372681,-153.231136,214.751926,
+ 0.260106,-0.752088,-0.605565,14.303347,-153.98257,214.796342,
+ 0.260106,-0.752088,-0.605565,14.386096,-152.71791,213.261226,
+ -0.383826,0.866868,-0.318145,17.46941,-146.993017,213.510082,
+ -0.383826,0.866868,-0.318145,17.419517,-147.449657,212.326041,
+ -0.383826,0.866868,-0.318145,17.064183,-147.7192,212.020295,
+ 0.205992,-0.760687,-0.615566,14.386096,-152.71791,213.261226,
+ 0.205992,-0.760687,-0.615566,14.303347,-153.98257,214.796342,
+ 0.205992,-0.760687,-0.615566,13.317052,-154.032767,214.528321,
+ -0.825139,-0.524128,-0.210798,12.602733,-153.33153,213.572752,
+ -0.825139,-0.524128,-0.210798,12.48652,-153.796689,215.184228,
+ -0.825139,-0.524128,-0.210798,11.80597,-152.732513,215.202178,
+ -0.681373,-0.729029,-0.065171,12.602733,-153.33153,213.572752,
+ -0.681373,-0.729029,-0.065171,11.80597,-152.732513,215.202178,
+ -0.681373,-0.729029,-0.065171,11.826353,-152.601088,213.518904,
+ -0.948596,-0.314432,-0.036037,11.826353,-152.601088,213.518904,
+ -0.948596,-0.314432,-0.036037,11.80597,-152.732513,215.202178,
+ -0.948596,-0.314432,-0.036037,11.338986,-151.35681,215.491191,
+ -0.972454,-0.204977,-0.110985,11.826353,-152.601088,213.518904,
+ -0.972454,-0.204977,-0.110985,11.338986,-151.35681,215.491191,
+ -0.972454,-0.204977,-0.110985,11.539774,-151.303267,213.632989,
+ 0.113594,-0.735756,-0.667652,14.386096,-152.71791,213.261226,
+ 0.113594,-0.735756,-0.667652,13.317052,-154.032767,214.528321,
+ 0.113594,-0.735756,-0.667652,13.220309,-152.774496,213.125238,
+ 0.983729,0.149779,-0.099216,17.419517,-147.449657,212.326041,
+ 0.983729,0.149779,-0.099216,17.46941,-146.993017,213.510082,
+ 0.983729,0.149779,-0.099216,17.671111,-148.942486,212.566987,
+ 0.952846,0.206262,-0.222577,17.671111,-148.942486,212.566987,
+ 0.952846,0.206262,-0.222577,17.46941,-146.993017,213.510082,
+ 0.952846,0.206262,-0.222577,18.142963,-149.673841,213.909224,
+ 0.146106,-0.731463,-0.666044,13.317052,-154.032767,214.528321,
+ 0.146106,-0.731463,-0.666044,12.519984,-152.504953,212.675595,
+ 0.146106,-0.731463,-0.666044,13.220309,-152.774496,213.125238,
+ 0.203327,-0.710664,-0.673509,13.317052,-154.032767,214.528321,
+ 0.203327,-0.710664,-0.673509,12.602733,-153.33153,213.572752,
+ 0.203327,-0.710664,-0.673509,12.519984,-152.504953,212.675595,
+ -0.887681,-0.436331,0.147094,14.001861,-154.845655,222.665713,
+ -0.887681,-0.436331,0.147094,14.243415,-154.460507,225.265918,
+ -0.887681,-0.436331,0.147094,13.07276,-152.172436,224.988466,
+ -0.880455,-0.445942,0.161045,12.74511,-152.462362,222.394345,
+ -0.880455,-0.445942,0.161045,14.001861,-154.845655,222.665713,
+ -0.880455,-0.445942,0.161045,13.07276,-152.172436,224.988466,
+ 0.370994,0.905617,0.205476,15.020404,-146.909963,222.581443,
+ 0.370994,0.905617,0.205476,14.742343,-147.326447,224.919102,
+ 0.370994,0.905617,0.205476,14.9985,-147.526018,225.336194,
+ -0.927613,-0.347101,0.138042,12.74511,-152.462362,222.394345,
+ -0.927613,-0.347101,0.138042,12.348098,-150.331574,225.084296,
+ -0.927613,-0.347101,0.138042,11.976031,-150.366864,222.495347,
+ -0.916157,-0.368819,0.156935,12.74511,-152.462362,222.394345,
+ -0.916157,-0.368819,0.156935,13.07276,-152.172436,224.988466,
+ -0.916157,-0.368819,0.156935,12.348098,-150.331574,225.084296,
+ -0.987166,-0.071404,0.142842,11.976031,-150.366864,222.495347,
+ -0.987166,-0.071404,0.142842,12.348098,-150.331574,225.084296,
+ -0.987166,-0.071404,0.142842,12.286949,-149.285347,225.18469,
+ -0.359654,0.925071,0.122033,15.020404,-146.909963,222.581443,
+ -0.359654,0.925071,0.122033,14.356891,-147.153039,222.468576,
+ -0.359654,0.925071,0.122033,14.742343,-147.326447,224.919102,
+ -0.991006,-0.03576,0.128952,11.976031,-150.366864,222.495347,
+ -0.991006,-0.03576,0.128952,12.286949,-149.285347,225.18469,
+ -0.991006,-0.03576,0.128952,11.956257,-149.408558,222.609127,
+ -0.497609,0.847327,0.185534,15.533326,-146.651373,222.776146,
+ -0.497609,0.847327,0.185534,15.020404,-146.909963,222.581443,
+ -0.497609,0.847327,0.185534,14.9985,-147.526018,225.336194,
+ -0.859234,0.497742,0.118194,11.956257,-149.408558,222.609127,
+ -0.859234,0.497742,0.118194,12.969628,-148.326432,225.418943,
+ -0.859234,0.497742,0.118194,12.577787,-148.368719,222.748462,
+ 0.388531,0.844083,0.369551,16.328873,-147.151822,223.082804,
+ 0.388531,0.844083,0.369551,15.533326,-146.651373,222.776146,
+ 0.388531,0.844083,0.369551,14.9985,-147.526018,225.336194,
+ 0.824648,-0.431988,0.36516,19.104616,-153.682605,223.237655,
+ 0.824648,-0.431988,0.36516,18.032529,-153.651574,225.695483,
+ 0.824648,-0.431988,0.36516,17.404002,-154.756517,225.807742,
+ 0.850378,-0.279003,0.44611,19.104616,-153.682605,223.237655,
+ 0.850378,-0.279003,0.44611,17.404002,-154.756517,225.807742,
+ 0.850378,-0.279003,0.44611,18.368393,-155.356448,223.594206,
+ -0.821081,0.565405,0.078375,11.956257,-149.408558,222.609127,
+ -0.821081,0.565405,0.078375,12.286949,-149.285347,225.18469,
+ -0.821081,0.565405,0.078375,12.969628,-148.326432,225.418943,
+ 0.504836,-0.780144,0.36948,18.368393,-155.356448,223.594206,
+ 0.504836,-0.780144,0.36948,16.73775,-155.478137,225.565275,
+ 0.504836,-0.780144,0.36948,17.405827,-156.118225,223.300933,
+ 0.581789,-0.684667,0.439037,18.368393,-155.356448,223.594206,
+ 0.581789,-0.684667,0.439037,17.404002,-154.756517,225.807742,
+ 0.581789,-0.684667,0.439037,16.73775,-155.478137,225.565275,
+ -0.3435,0.931462,0.119944,14.742343,-147.326447,224.919102,
+ -0.3435,0.931462,0.119944,14.356891,-147.153039,222.468576,
+ -0.3435,0.931462,0.119944,14.17679,-147.569522,225.187124,
+ 0.175057,-0.923214,0.342099,17.405827,-156.118225,223.300933,
+ 0.175057,-0.923214,0.342099,15.98875,-155.597697,225.430808,
+ 0.175057,-0.923214,0.342099,16.179803,-156.414844,223.12783,
+ 0.45515,0.795132,0.400754,16.328873,-147.151822,223.082804,
+ 0.45515,0.795132,0.400754,14.9985,-147.526018,225.336194,
+ 0.45515,0.795132,0.400754,15.483738,-147.879831,225.487089,
+ 0.967605,0.226505,-0.11152,17.46941,-146.993017,213.510082,
+ 0.967605,0.226505,-0.11152,17.640992,-146.812612,215.365242,
+ 0.967605,0.226505,-0.11152,18.142963,-149.673841,213.909224,
+ 0.909625,0.303783,-0.283368,18.142963,-149.673841,213.909224,
+ 0.909625,0.303783,-0.283368,17.640992,-146.812612,215.365242,
+ 0.909625,0.303783,-0.283368,18.721597,-149.823824,215.605883,
+ 0.884194,-0.329895,-0.330711,18.142963,-149.673841,213.909224,
+ 0.884194,-0.329895,-0.330711,18.721597,-149.823824,215.605883,
+ 0.884194,-0.329895,-0.330711,18.038005,-150.487641,214.4404,
+ 0.890911,-0.215809,-0.39963,18.038005,-150.487641,214.4404,
+ 0.890911,-0.215809,-0.39963,18.721597,-149.823824,215.605883,
+ 0.890911,-0.215809,-0.39963,18.68144,-150.791257,216.038794,
+ 0.785114,-0.468543,-0.405048,18.038005,-150.487641,214.4404,
+ 0.785114,-0.468543,-0.405048,18.68144,-150.791257,216.038794,
+ 0.785114,-0.468543,-0.405048,16.979609,-152.419466,214.623543,
+ 0.78406,-0.432832,-0.444866,16.979609,-152.419466,214.623543,
+ 0.78406,-0.432832,-0.444866,18.68144,-150.791257,216.038794,
+ 0.78406,-0.432832,-0.444866,17.579235,-152.833515,216.083211,
+ -0.843945,-0.533821,0.052837,12.48652,-153.796689,215.184228,
+ -0.843945,-0.533821,0.052837,13.204489,-154.703278,217.492683,
+ -0.843945,-0.533821,0.052837,11.939524,-152.723994,217.284897,
+ -0.840702,-0.538582,0.056113,12.48652,-153.796689,215.184228,
+ -0.840702,-0.538582,0.056113,11.939524,-152.723994,217.284897,
+ -0.840702,-0.538582,0.056113,11.80597,-152.732513,215.202178,
+ -0.946309,-0.317267,0.06198,11.80597,-152.732513,215.202178,
+ -0.946309,-0.317267,0.06198,11.939524,-152.723994,217.284897,
+ -0.946309,-0.317267,0.06198,11.298524,-150.797646,217.358824,
+ -0.938646,-0.335452,0.080098,11.80597,-152.732513,215.202178,
+ -0.938646,-0.335452,0.080098,11.298524,-150.797646,217.358824,
+ -0.938646,-0.335452,0.080098,11.338986,-151.35681,215.491191,
+ -0.874379,-0.47823,0.082199,13.204489,-154.703278,217.492683,
+ -0.874379,-0.47823,0.082199,13.513885,-154.906804,219.59974,
+ -0.874379,-0.47823,0.082199,12.305506,-152.731904,219.399256,
+ -0.840657,-0.522195,0.143559,11.939524,-152.723994,217.284897,
+ -0.840657,-0.522195,0.143559,13.204489,-154.703278,217.492683,
+ -0.840657,-0.522195,0.143559,12.305506,-152.731904,219.399256,
+ -0.91194,-0.379334,0.156432,11.939524,-152.723994,217.284897,
+ -0.91194,-0.379334,0.156432,12.305506,-152.731904,219.399256,
+ -0.91194,-0.379334,0.156432,11.518174,-150.767224,219.573577,
+ -0.943158,-0.317597,0.097901,11.939524,-152.723994,217.284897,
+ -0.943158,-0.317597,0.097901,11.518174,-150.767224,219.573577,
+ -0.943158,-0.317597,0.097901,11.298524,-150.797646,217.358824,
+ -0.86862,-0.46693,0.16576,12.686091,-152.681403,221.530652,
+ -0.86862,-0.46693,0.16576,13.513885,-154.906804,219.59974,
+ -0.86862,-0.46693,0.16576,14.059055,-155.113677,221.873817,
+ -0.868414,-0.467179,0.166134,13.513885,-154.906804,219.59974,
+ -0.868414,-0.467179,0.166134,12.686091,-152.681403,221.530652,
+ -0.868414,-0.467179,0.166134,12.305506,-152.731904,219.399256,
+ -0.917054,-0.35963,0.172271,12.305506,-152.731904,219.399256,
+ -0.917054,-0.35963,0.172271,12.686091,-152.681403,221.530652,
+ -0.917054,-0.35963,0.172271,11.86286,-150.552441,221.592714,
+ -0.904372,-0.379703,0.194775,12.305506,-152.731904,219.399256,
+ -0.904372,-0.379703,0.194775,11.86286,-150.552441,221.592714,
+ -0.904372,-0.379703,0.194775,11.518174,-150.767224,219.573577,
+ -0.872476,-0.478533,0.098948,12.686091,-152.681403,221.530652,
+ -0.872476,-0.478533,0.098948,14.059055,-155.113677,221.873817,
+ -0.872476,-0.478533,0.098948,14.001861,-154.845655,222.665713,
+ -0.879242,-0.443977,0.172679,12.686091,-152.681403,221.530652,
+ -0.879242,-0.443977,0.172679,14.001861,-154.845655,222.665713,
+ -0.879242,-0.443977,0.172679,12.74511,-152.462362,222.394345,
+ -0.920018,-0.36025,0.154232,12.686091,-152.681403,221.530652,
+ -0.920018,-0.36025,0.154232,12.74511,-152.462362,222.394345,
+ -0.920018,-0.36025,0.154232,11.86286,-150.552441,221.592714,
+ -0.91936,-0.346408,0.186488,11.86286,-150.552441,221.592714,
+ -0.91936,-0.346408,0.186488,12.74511,-152.462362,222.394345,
+ -0.91936,-0.346408,0.186488,11.976031,-150.366864,222.495347,
+ -0.929223,0.347981,-0.124316,11.338986,-151.35681,215.491191,
+ -0.929223,0.347981,-0.124316,11.298524,-150.797646,217.358824,
+ -0.929223,0.347981,-0.124316,11.449419,-150.304498,217.61133,
+ -0.763911,0.593,-0.25454,11.758207,-150.820159,215.483281,
+ -0.763911,0.593,-0.25454,11.338986,-151.35681,215.491191,
+ -0.763911,0.593,-0.25454,11.449419,-150.304498,217.61133,
+ -0.311141,0.912316,-0.266216,13.08645,-149.771497,217.524626,
+ -0.311141,0.912316,-0.266216,11.758207,-150.820159,215.483281,
+ -0.311141,0.912316,-0.266216,11.449419,-150.304498,217.61133,
+ -0.386036,0.898207,-0.210237,13.465209,-150.056251,215.612576,
+ -0.386036,0.898207,-0.210237,11.758207,-150.820159,215.483281,
+ -0.386036,0.898207,-0.210237,13.08645,-149.771497,217.524626,
+ -0.985022,0.143417,0.09572,11.298524,-150.797646,217.358824,
+ -0.985022,0.143417,0.09572,11.518174,-150.767224,219.573577,
+ -0.985022,0.143417,0.09572,11.693103,-149.715216,219.797486,
+ -0.606895,0.732213,-0.3091,15.607861,-147.219664,219.327459,
+ -0.606895,0.732213,-0.3091,15.202026,-148.354725,217.435488,
+ -0.606895,0.732213,-0.3091,14.87103,-147.842715,219.298254,
+ -0.625764,0.720767,-0.298185,16.00457,-147.684519,217.371297,
+ -0.625764,0.720767,-0.298185,15.202026,-148.354725,217.435488,
+ -0.625764,0.720767,-0.298185,15.607861,-147.219664,219.327459,
+ -0.714543,0.634078,-0.295589,16.00457,-147.684519,217.371297,
+ -0.714543,0.634078,-0.295589,15.607861,-147.219664,219.327459,
+ -0.714543,0.634078,-0.295589,16.255251,-146.477356,219.35484,
+ -0.851192,0.489199,-0.190147,16.638573,-146.588703,217.352435,
+ -0.851192,0.489199,-0.190147,16.00457,-147.684519,217.371297,
+ -0.851192,0.489199,-0.190147,16.255251,-146.477356,219.35484,
+ -0.313722,0.904136,-0.29003,15.193204,-147.053557,221.409875,
+ -0.313722,0.904136,-0.29003,14.87103,-147.842715,219.298254,
+ -0.313722,0.904136,-0.29003,14.494096,-147.314582,221.352377,
+ -0.960245,0.277285,0.032293,11.298524,-150.797646,217.358824,
+ -0.960245,0.277285,0.032293,11.693103,-149.715216,219.797486,
+ -0.960245,0.277285,0.032293,11.449419,-150.304498,217.61133,
+ -0.425803,0.88444,-0.19094,12.752716,-149.257358,219.555323,
+ -0.425803,0.88444,-0.19094,11.449419,-150.304498,217.61133,
+ -0.425803,0.88444,-0.19094,11.693103,-149.715216,219.797486,
+ -0.310546,0.908091,-0.28095,13.08645,-149.771497,217.524626,
+ -0.310546,0.908091,-0.28095,11.449419,-150.304498,217.61133,
+ -0.310546,0.908091,-0.28095,12.752716,-149.257358,219.555323,
+ -0.98585,0.008075,0.167435,11.518174,-150.767224,219.573577,
+ -0.98585,0.008075,0.167435,11.86286,-150.552441,221.592714,
+ -0.98585,0.008075,0.167435,11.893587,-149.501042,221.722922,
+ -0.985577,0.145485,0.086439,11.518174,-150.767224,219.573577,
+ -0.985577,0.145485,0.086439,11.893587,-149.501042,221.722922,
+ -0.985577,0.145485,0.086439,11.693103,-149.715216,219.797486,
+ -0.794944,0.606489,0.01531,11.693103,-149.715216,219.797486,
+ -0.794944,0.606489,0.01531,11.893587,-149.501042,221.722922,
+ -0.794944,0.606489,0.01531,12.683961,-148.465158,221.726268,
+ -0.436508,0.840646,-0.320585,12.752716,-149.257358,219.555323,
+ -0.436508,0.840646,-0.320585,11.693103,-149.715216,219.797486,
+ -0.436508,0.840646,-0.320585,12.683961,-148.465158,221.726268,
+ -0.992485,0.013949,0.121569,11.86286,-150.552441,221.592714,
+ -0.992485,0.013949,0.121569,11.976031,-150.366864,222.495347,
+ -0.992485,0.013949,0.121569,11.893587,-149.501042,221.722922,
+ -0.996861,-0.029303,0.073554,11.893587,-149.501042,221.722922,
+ -0.996861,-0.029303,0.073554,11.976031,-150.366864,222.495347,
+ -0.996861,-0.029303,0.073554,11.956257,-149.408558,222.609127,
+ -0.794982,0.606591,-0.007085,11.893587,-149.501042,221.722922,
+ -0.794982,0.606591,-0.007085,11.956257,-149.408558,222.609127,
+ -0.794982,0.606591,-0.007085,12.683961,-148.465158,221.726268,
+ -0.842126,0.52167,-0.136688,12.683961,-148.465158,221.726268,
+ -0.842126,0.52167,-0.136688,11.956257,-149.408558,222.609127,
+ -0.842126,0.52167,-0.136688,12.577787,-148.368719,222.748462,
+ -0.640135,0.751042,-0.161749,16.00457,-147.684519,217.371297,
+ -0.640135,0.751042,-0.161749,15.541236,-148.515659,215.345771,
+ -0.640135,0.751042,-0.161749,15.202026,-148.354725,217.435488,
+ -0.611863,0.771038,-0.176421,16.299059,-147.942197,215.223778,
+ -0.611863,0.771038,-0.176421,15.541236,-148.515659,215.345771,
+ -0.611863,0.771038,-0.176421,16.00457,-147.684519,217.371297,
+ -0.853382,0.490711,-0.175904,16.299059,-147.942197,215.223778,
+ -0.853382,0.490711,-0.175904,16.00457,-147.684519,217.371297,
+ -0.853382,0.490711,-0.175904,16.638573,-146.588703,217.352435,
+ -0.803278,0.552268,-0.223036,16.914809,-147.088847,215.119124,
+ -0.803278,0.552268,-0.223036,16.299059,-147.942197,215.223778,
+ -0.803278,0.552268,-0.223036,16.638573,-146.588703,217.352435,
+ -0.149357,0.183668,0.971575,18.032529,-153.651574,225.695483,
+ -0.149357,0.183668,0.971575,14.243415,-154.460507,225.265918,
+ -0.149357,0.183668,0.971575,17.404002,-154.756517,225.807742,
+ -0.17965,-0.134422,0.974503,14.243415,-154.460507,225.265918,
+ -0.17965,-0.134422,0.974503,15.98875,-155.597697,225.430808,
+ -0.17965,-0.134422,0.974503,17.404002,-154.756517,225.807742,
+ -0.124366,0.056494,0.990627,13.07276,-152.172436,224.988466,
+ -0.124366,0.056494,0.990627,14.243415,-154.460507,225.265918,
+ -0.124366,0.056494,0.990627,18.032529,-153.651574,225.695483,
+ -0.114553,0.08883,0.989438,17.46728,-151.493407,225.436284,
+ -0.114553,0.08883,0.989438,13.07276,-152.172436,224.988466,
+ -0.114553,0.08883,0.989438,18.032529,-153.651574,225.695483,
+ -0.032376,0.037844,0.998759,16.318529,-149.104029,225.30851,
+ -0.032376,0.037844,0.998759,12.286949,-149.285347,225.18469,
+ -0.032376,0.037844,0.998759,17.46728,-151.493407,225.436284,
+ -0.090909,-0.100387,0.990787,12.286949,-149.285347,225.18469,
+ -0.090909,-0.100387,0.990787,12.348098,-150.331574,225.084296,
+ -0.090909,-0.100387,0.990787,17.46728,-151.493407,225.436284,
+ -0.001053,-0.14505,0.989424,15.483738,-147.879831,225.487089,
+ -0.001053,-0.14505,0.989424,12.969628,-148.326432,225.418943,
+ -0.001053,-0.14505,0.989424,16.318529,-149.104029,225.30851,
+ -0.019857,-0.223901,0.97441,12.969628,-148.326432,225.418943,
+ -0.019857,-0.223901,0.97441,12.286949,-149.285347,225.18469,
+ -0.019857,-0.223901,0.97441,16.318529,-149.104029,225.30851,
+ -0.135084,0.858934,0.493947,14.9985,-147.526018,225.336194,
+ -0.135084,0.858934,0.493947,14.742343,-147.326447,224.919102,
+ -0.135084,0.858934,0.493947,14.17679,-147.569522,225.187124,
+ -0.143302,-0.193791,0.97052,17.404002,-154.756517,225.807742,
+ -0.143302,-0.193791,0.97052,15.98875,-155.597697,225.430808,
+ -0.143302,-0.193791,0.97052,16.73775,-155.478137,225.565275,
+ -0.087806,-0.086227,0.992399,12.348098,-150.331574,225.084296,
+ -0.087806,-0.086227,0.992399,13.07276,-152.172436,224.988466,
+ -0.087806,-0.086227,0.992399,17.46728,-151.493407,225.436284,
+ 0.673997,-0.003065,-0.738728,17.201084,-148.081227,211.935721,
+ 0.673997,-0.003065,-0.738728,17.078482,-148.644955,211.8262,
+ 0.673997,-0.003065,-0.738728,16.890471,-148.267108,211.653097,
+ 0.530721,0.349274,-0.772232,17.064183,-147.7192,212.020295,
+ 0.530721,0.349274,-0.772232,16.890471,-148.267108,211.653097,
+ 0.530721,0.349274,-0.772232,16.764522,-148.104652,211.640015,
+ 0.493955,0.370545,-0.786578,17.064183,-147.7192,212.020295,
+ 0.493955,0.370545,-0.786578,17.201084,-148.081227,211.935721,
+ 0.493955,0.370545,-0.786578,16.890471,-148.267108,211.653097,
+ 0.456567,-0.260363,-0.85074,16.890471,-148.267108,211.653097,
+ 0.456567,-0.260363,-0.85074,16.311532,-149.519904,211.725806,
+ 0.456567,-0.260363,-0.85074,16.121392,-148.931838,211.44379,
+ 0.374889,-0.225433,-0.899243,16.890471,-148.267108,211.653097,
+ 0.374889,-0.225433,-0.899243,17.078482,-148.644955,211.8262,
+ 0.374889,-0.225433,-0.899243,16.311532,-149.519904,211.725806,
+ 0.254392,0.031506,-0.966588,16.764522,-148.104652,211.640015,
+ 0.254392,0.031506,-0.966588,16.121392,-148.931838,211.44379,
+ 0.254392,0.031506,-0.966588,16.105268,-148.512313,211.453221,
+ 0.199891,0.076312,-0.976842,16.764522,-148.104652,211.640015,
+ 0.199891,0.076312,-0.976842,16.890471,-148.267108,211.653097,
+ 0.199891,0.076312,-0.976842,16.121392,-148.931838,211.44379,
+ 0.389414,-0.312162,-0.866551,16.121392,-148.931838,211.44379,
+ 0.389414,-0.312162,-0.866551,15.434149,-150.381163,211.657052,
+ 0.389414,-0.312162,-0.866551,14.911188,-149.825041,211.221707,
+ 0.366618,-0.303266,-0.879557,16.121392,-148.931838,211.44379,
+ 0.366618,-0.303266,-0.879557,16.311532,-149.519904,211.725806,
+ 0.366618,-0.303266,-0.879557,15.434149,-150.381163,211.657052,
+ 0.151203,0.036677,-0.987822,16.105268,-148.512313,211.453221,
+ 0.151203,0.036677,-0.987822,14.911188,-149.825041,211.221707,
+ 0.151203,0.036677,-0.987822,14.198086,-149.662889,211.118575,
+ 0.160152,0.028336,-0.986686,16.105268,-148.512313,211.453221,
+ 0.160152,0.028336,-0.986686,16.121392,-148.931838,211.44379,
+ 0.160152,0.028336,-0.986686,14.911188,-149.825041,211.221707,
+ 0.274543,-0.419253,-0.865363,14.911188,-149.825041,211.221707,
+ 0.274543,-0.419253,-0.865363,15.434149,-150.381163,211.657052,
+ 0.274543,-0.419253,-0.865363,14.226379,-151.214129,211.677435,
+ 0.430622,-0.465892,-0.772987,14.911188,-149.825041,211.221707,
+ 0.430622,-0.465892,-0.772987,14.226379,-151.214129,211.677435,
+ 0.430622,-0.465892,-0.772987,14.13937,-150.332487,211.097583,
+ 0.147142,0.0181,-0.98895,14.198086,-149.662889,211.118575,
+ 0.147142,0.0181,-0.98895,14.911188,-149.825041,211.221707,
+ 0.147142,0.0181,-0.98895,14.13937,-150.332487,211.097583,
+ 0.163266,-0.663393,-0.730242,13.516623,-150.836587,211.175769,
+ 0.163266,-0.663393,-0.730242,14.226379,-151.214129,211.677435,
+ 0.163266,-0.663393,-0.730242,13.659304,-151.291402,211.620849,
+ 0.30488,-0.502153,-0.809253,14.13937,-150.332487,211.097583,
+ 0.30488,-0.502153,-0.809253,14.226379,-151.214129,211.677435,
+ 0.30488,-0.502153,-0.809253,13.516623,-150.836587,211.175769,
+ -0.125215,0.000807,-0.992129,14.13937,-150.332487,211.097583,
+ -0.125215,0.000807,-0.992129,13.516623,-150.836587,211.175769,
+ -0.125215,0.000807,-0.992129,13.336218,-150.403371,211.19889,
+ -0.12871,0.042347,-0.990778,14.198086,-149.662889,211.118575,
+ -0.12871,0.042347,-0.990778,14.13937,-150.332487,211.097583,
+ -0.12871,0.042347,-0.990778,13.336218,-150.403371,211.19889,
+ -0.414925,-0.124687,-0.901272,13.336218,-150.403371,211.19889,
+ -0.414925,-0.124687,-0.901272,13.516623,-150.836587,211.175769,
+ -0.414925,-0.124687,-0.901272,12.30581,-151.097611,211.76931,
+ 0.010821,-0.697639,-0.716367,13.516623,-150.836587,211.175769,
+ 0.010821,-0.697639,-0.716367,13.659304,-151.291402,211.620849,
+ 0.010821,-0.697639,-0.716367,12.755454,-151.444123,211.755924,
+ -0.332853,-0.398913,-0.854446,13.516623,-150.836587,211.175769,
+ -0.332853,-0.398913,-0.854446,12.755454,-151.444123,211.755924,
+ -0.332853,-0.398913,-0.854446,12.30581,-151.097611,211.76931,
+ 0.833505,0.051689,-0.550088,17.201084,-148.081227,211.935721,
+ 0.833505,0.051689,-0.550088,17.419517,-147.449657,212.326041,
+ 0.833505,0.051689,-0.550088,17.671111,-148.942486,212.566987,
+ 0.771323,-0.044405,-0.634893,17.078482,-148.644955,211.8262,
+ 0.771323,-0.044405,-0.634893,17.201084,-148.081227,211.935721,
+ 0.771323,-0.044405,-0.634893,17.671111,-148.942486,212.566987,
+ 0.437821,0.358205,-0.824622,17.419517,-147.449657,212.326041,
+ 0.437821,0.358205,-0.824622,17.201084,-148.081227,211.935721,
+ 0.437821,0.358205,-0.824622,17.064183,-147.7192,212.020295,
+ -0.432916,-0.533701,-0.726462,12.30581,-151.097611,211.76931,
+ -0.432916,-0.533701,-0.726462,12.755454,-151.444123,211.755924,
+ -0.432916,-0.533701,-0.726462,12.519984,-152.504953,212.675595,
+ -0.276445,-0.549705,-0.788291,12.30581,-151.097611,211.76931,
+ -0.276445,-0.549705,-0.788291,12.519984,-152.504953,212.675595,
+ -0.276445,-0.549705,-0.788291,11.926139,-152.030059,212.552688,
+ -0.598875,0.792144,-0.117716,13.336218,-150.403371,211.19889,
+ -0.598875,0.792144,-0.117716,12.30581,-151.097611,211.76931,
+ -0.598875,0.792144,-0.117716,11.882939,-151.140811,213.629946,
+ -0.494184,0.868772,-0.031887,13.408319,-150.280465,213.430071,
+ -0.494184,0.868772,-0.031887,13.336218,-150.403371,211.19889,
+ -0.494184,0.868772,-0.031887,11.882939,-151.140811,213.629946,
+ 0.559439,-0.518273,-0.646855,16.311532,-149.519904,211.725806,
+ 0.559439,-0.518273,-0.646855,17.635821,-149.785796,213.084168,
+ 0.559439,-0.518273,-0.646855,15.434149,-150.381163,211.657052,
+ 0.571008,-0.418132,-0.706481,17.635821,-149.785796,213.084168,
+ 0.571008,-0.418132,-0.706481,16.676297,-151.637914,213.40482,
+ 0.571008,-0.418132,-0.706481,15.434149,-150.381163,211.657052,
+ 0.600226,-0.450288,-0.661036,17.078482,-148.644955,211.8262,
+ 0.600226,-0.450288,-0.661036,17.671111,-148.942486,212.566987,
+ 0.600226,-0.450288,-0.661036,16.311532,-149.519904,211.725806,
+ 0.600112,-0.43629,-0.67046,17.671111,-148.942486,212.566987,
+ 0.600112,-0.43629,-0.67046,17.635821,-149.785796,213.084168,
+ 0.600112,-0.43629,-0.67046,16.311532,-149.519904,211.725806,
+ 0.016162,-0.71439,-0.699561,13.659304,-151.291402,211.620849,
+ 0.016162,-0.71439,-0.699561,13.220309,-152.774496,213.125238,
+ 0.016162,-0.71439,-0.699561,12.755454,-151.444123,211.755924,
+ 0.203685,-0.666735,-0.716922,12.755454,-151.444123,211.755924,
+ 0.203685,-0.666735,-0.716922,13.220309,-152.774496,213.125238,
+ 0.203685,-0.666735,-0.716922,12.519984,-152.504953,212.675595,
+ 0.115177,-0.714535,-0.690053,14.386096,-152.71791,213.261226,
+ 0.115177,-0.714535,-0.690053,13.220309,-152.774496,213.125238,
+ 0.115177,-0.714535,-0.690053,14.226379,-151.214129,211.677435,
+ 0.165534,-0.726027,-0.667445,14.226379,-151.214129,211.677435,
+ 0.165534,-0.726027,-0.667445,13.220309,-152.774496,213.125238,
+ 0.165534,-0.726027,-0.667445,13.659304,-151.291402,211.620849,
+ 0.363612,-0.545699,-0.754983,15.434149,-150.381163,211.657052,
+ 0.363612,-0.545699,-0.754983,16.109223,-152.276176,213.351885,
+ 0.363612,-0.545699,-0.754983,14.226379,-151.214129,211.677435,
+ 0.214749,-0.697363,-0.683789,16.109223,-152.276176,213.351885,
+ 0.214749,-0.697363,-0.683789,14.386096,-152.71791,213.261226,
+ 0.214749,-0.697363,-0.683789,14.226379,-151.214129,211.677435,
+ 0.555992,-0.435251,-0.708117,15.434149,-150.381163,211.657052,
+ 0.555992,-0.435251,-0.708117,16.676297,-151.637914,213.40482,
+ 0.555992,-0.435251,-0.708117,16.109223,-152.276176,213.351885,
+ -0.559938,-0.634436,-0.532879,12.602733,-153.33153,213.572752,
+ -0.559938,-0.634436,-0.532879,11.826353,-152.601088,213.518904,
+ -0.559938,-0.634436,-0.532879,12.519984,-152.504953,212.675595,
+ -0.484364,-0.730344,-0.481652,12.519984,-152.504953,212.675595,
+ -0.484364,-0.730344,-0.481652,11.826353,-152.601088,213.518904,
+ -0.484364,-0.730344,-0.481652,11.926139,-152.030059,212.552688,
+ -0.95787,-0.192801,-0.212868,11.926139,-152.030059,212.552688,
+ -0.95787,-0.192801,-0.212868,11.826353,-152.601088,213.518904,
+ -0.95787,-0.192801,-0.212868,11.539774,-151.303267,213.632989,
+ -0.925502,0.063096,-0.373451,12.30581,-151.097611,211.76931,
+ -0.925502,0.063096,-0.373451,11.926139,-152.030059,212.552688,
+ -0.925502,0.063096,-0.373451,11.539774,-151.303267,213.632989,
+ -0.427188,0.900949,-0.07617,12.30581,-151.097611,211.76931,
+ -0.427188,0.900949,-0.07617,11.539774,-151.303267,213.632989,
+ -0.427188,0.900949,-0.07617,11.882939,-151.140811,213.629946,
+ -0.630166,0.753947,-0.18562,15.607861,-147.219664,219.327459,
+ -0.630166,0.753947,-0.18562,14.87103,-147.842715,219.298254,
+ -0.630166,0.753947,-0.18562,15.193204,-147.053557,221.409875,
+ -0.742943,0.653316,-0.145647,15.607861,-147.219664,219.327459,
+ -0.742943,0.653316,-0.145647,15.741112,-146.579272,221.520308,
+ -0.742943,0.653316,-0.145647,16.255251,-146.477356,219.35484,
+ -0.331729,0.927012,-0.17494,15.193204,-147.053557,221.409875,
+ -0.331729,0.927012,-0.17494,14.494096,-147.314582,221.352377,
+ -0.331729,0.927012,-0.17494,14.356891,-147.153039,222.468576,
+ -0.315215,0.935243,-0.161121,15.193204,-147.053557,221.409875,
+ -0.315215,0.935243,-0.161121,14.356891,-147.153039,222.468576,
+ -0.315215,0.935243,-0.161121,15.020404,-146.909963,222.581443,
+ -0.621611,0.761172,-0.184977,15.741112,-146.579272,221.520308,
+ -0.621611,0.761172,-0.184977,15.193204,-147.053557,221.409875,
+ -0.621611,0.761172,-0.184977,15.020404,-146.909963,222.581443,
+ -0.621722,0.761193,-0.184517,15.193204,-147.053557,221.409875,
+ -0.621722,0.761193,-0.184517,15.741112,-146.579272,221.520308,
+ -0.621722,0.761193,-0.184517,15.607861,-147.219664,219.327459,
+ -0.443421,0.896045,-0.021922,15.741112,-146.579272,221.520308,
+ -0.443421,0.896045,-0.021922,15.020404,-146.909963,222.581443,
+ -0.443421,0.896045,-0.021922,15.533326,-146.651373,222.776146,
+ 0.076782,0.974932,-0.208837,17.50257,-146.619733,217.525235,
+ 0.076782,0.974932,-0.208837,16.914809,-147.088847,215.119124,
+ 0.076782,0.974932,-0.208837,16.638573,-146.588703,217.352435,
+ -0.322399,0.940799,-0.10467,17.640992,-146.812612,215.365242,
+ -0.322399,0.940799,-0.10467,16.914809,-147.088847,215.119124,
+ -0.322399,0.940799,-0.10467,17.50257,-146.619733,217.525235,
+ 0.229626,0.973226,-0.01016,17.098256,-146.673885,219.582095,
+ 0.229626,0.973226,-0.01016,16.638573,-146.588703,217.352435,
+ 0.229626,0.973226,-0.01016,16.255251,-146.477356,219.35484,
+ 0.029463,0.999051,0.032094,17.50257,-146.619733,217.525235,
+ 0.029463,0.999051,0.032094,16.638573,-146.588703,217.352435,
+ 0.029463,0.999051,0.032094,17.098256,-146.673885,219.582095,
+ 0.394027,0.908932,0.13633,16.526619,-146.961682,221.799586,
+ 0.394027,0.908932,0.13633,16.255251,-146.477356,219.35484,
+ 0.394027,0.908932,0.13633,15.741112,-146.579272,221.520308,
+ 0.179453,0.968619,0.171972,17.098256,-146.673885,219.582095,
+ 0.179453,0.968619,0.171972,16.255251,-146.477356,219.35484,
+ 0.179453,0.968619,0.171972,16.526619,-146.961682,221.799586,
+ 0.400291,0.908707,0.118402,16.526619,-146.961682,221.799586,
+ 0.400291,0.908707,0.118402,15.741112,-146.579272,221.520308,
+ 0.400291,0.908707,0.118402,15.533326,-146.651373,222.776146,
+ 0.465515,0.862261,0.199502,16.526619,-146.961682,221.799586,
+ 0.465515,0.862261,0.199502,15.533326,-146.651373,222.776146,
+ 0.465515,0.862261,0.199502,16.328873,-147.151822,223.082804,
+ 0.728296,-0.525745,-0.439519,17.579235,-152.833515,216.083211,
+ 0.728296,-0.525745,-0.439519,17.205343,-155.248752,218.352725,
+ 0.728296,-0.525745,-0.439519,16.723148,-154.022728,216.087166,
+ 0.333769,-0.797488,-0.502605,17.205343,-155.248752,218.352725,
+ 0.333769,-0.797488,-0.502605,14.530299,-154.872427,215.979167,
+ 0.333769,-0.797488,-0.502605,16.723148,-154.022728,216.087166,
+ 0.393659,-0.729513,-0.559324,17.205343,-155.248752,218.352725,
+ 0.393659,-0.729513,-0.559324,15.434758,-155.759849,217.773177,
+ 0.393659,-0.729513,-0.559324,14.530299,-154.872427,215.979167,
+ 0.008112,-0.894673,-0.446647,15.434758,-155.759849,217.773177,
+ 0.008112,-0.894673,-0.446647,14.349894,-155.736424,217.706552,
+ 0.008112,-0.894673,-0.446647,14.530299,-154.872427,215.979167,
+ 0.017188,-0.894949,-0.445837,14.530299,-154.872427,215.979167,
+ 0.017188,-0.894949,-0.445837,14.349894,-155.736424,217.706552,
+ 0.017188,-0.894949,-0.445837,13.498978,-154.818275,215.830705,
+ -0.699744,-0.713681,-0.031901,14.349894,-155.736424,217.706552,
+ -0.699744,-0.713681,-0.031901,12.48652,-153.796689,215.184228,
+ -0.699744,-0.713681,-0.031901,13.498978,-154.818275,215.830705,
+ -0.657898,-0.747821,-0.089071,14.349894,-155.736424,217.706552,
+ -0.657898,-0.747821,-0.089071,13.204489,-154.703278,217.492683,
+ -0.657898,-0.747821,-0.089071,12.48652,-153.796689,215.184228,
+ -0.598673,0.766437,-0.232734,15.541236,-148.515659,215.345771,
+ -0.598673,0.766437,-0.232734,13.465209,-150.056251,215.612576,
+ -0.598673,0.766437,-0.232734,13.08645,-149.771497,217.524626,
+ -0.554328,0.818117,-0.152986,15.541236,-148.515659,215.345771,
+ -0.554328,0.818117,-0.152986,13.08645,-149.771497,217.524626,
+ -0.554328,0.818117,-0.152986,15.202026,-148.354725,217.435488,
+ 0.940046,0.339735,0.029905,17.640992,-146.812612,215.365242,
+ 0.940046,0.339735,0.029905,17.50257,-146.619733,217.525235,
+ 0.940046,0.339735,0.029905,18.721597,-149.823824,215.605883,
+ 0.897146,0.421154,-0.133259,18.721597,-149.823824,215.605883,
+ 0.897146,0.421154,-0.133259,17.50257,-146.619733,217.525235,
+ 0.897146,0.421154,-0.133259,18.995703,-149.870979,217.302238,
+ 0.980374,-0.112988,-0.161555,18.721597,-149.823824,215.605883,
+ 0.980374,-0.112988,-0.161555,18.995703,-149.870979,217.302238,
+ 0.980374,-0.112988,-0.161555,18.68144,-150.791257,216.038794,
+ 0.974659,-0.028171,-0.221913,18.68144,-150.791257,216.038794,
+ 0.974659,-0.028171,-0.221913,18.995703,-149.870979,217.302238,
+ 0.974659,-0.028171,-0.221913,19.06172,-151.440472,217.791431,
+ 0.82259,-0.45147,-0.345717,18.68144,-150.791257,216.038794,
+ 0.82259,-0.45147,-0.345717,19.06172,-151.440472,217.791431,
+ 0.82259,-0.45147,-0.345717,17.579235,-152.833515,216.083211,
+ 0.829014,-0.385758,-0.404879,17.579235,-152.833515,216.083211,
+ 0.829014,-0.385758,-0.404879,19.06172,-151.440472,217.791431,
+ 0.829014,-0.385758,-0.404879,18.375694,-153.397243,218.251114,
+ 0.855255,-0.414547,-0.31095,18.375694,-153.397243,218.251114,
+ 0.855255,-0.414547,-0.31095,18.925123,-153.981354,220.54101,
+ 0.855255,-0.414547,-0.31095,18.152089,-155.319028,220.198149,
+ 0.760846,-0.503409,-0.409502,17.205343,-155.248752,218.352725,
+ 0.760846,-0.503409,-0.409502,18.375694,-153.397243,218.251114,
+ 0.760846,-0.503409,-0.409502,18.152089,-155.319028,220.198149,
+ 0.760534,-0.503254,-0.410273,18.375694,-153.397243,218.251114,
+ 0.760534,-0.503254,-0.410273,17.205343,-155.248752,218.352725,
+ 0.760534,-0.503254,-0.410273,17.579235,-152.833515,216.083211,
+ 0.333006,-0.920174,-0.205881,18.152089,-155.319028,220.198149,
+ 0.333006,-0.920174,-0.205881,15.434758,-155.759849,217.773177,
+ 0.333006,-0.920174,-0.205881,17.205343,-155.248752,218.352725,
+ 0.568085,-0.637276,-0.520728,18.152089,-155.319028,220.198149,
+ 0.568085,-0.637276,-0.520728,16.418011,-156.514325,219.769193,
+ 0.568085,-0.637276,-0.520728,15.434758,-155.759849,217.773177,
+ 0.12075,-0.907429,-0.402483,16.418011,-156.514325,219.769193,
+ 0.12075,-0.907429,-0.402483,15.203851,-156.587643,219.57023,
+ 0.12075,-0.907429,-0.402483,15.434758,-155.759849,217.773177,
+ 0.006037,-0.908548,-0.417738,15.434758,-155.759849,217.773177,
+ 0.006037,-0.908548,-0.417738,15.203851,-156.587643,219.57023,
+ 0.006037,-0.908548,-0.417738,14.349894,-155.736424,217.706552,
+ -0.665708,-0.745372,-0.035408,15.203851,-156.587643,219.57023,
+ -0.665708,-0.745372,-0.035408,13.204489,-154.703278,217.492683,
+ -0.665708,-0.745372,-0.035408,14.349894,-155.736424,217.706552,
+ -0.704451,-0.70889,0.034967,15.203851,-156.587643,219.57023,
+ -0.704451,-0.70889,0.034967,13.513885,-154.906804,219.59974,
+ -0.704451,-0.70889,0.034967,13.204489,-154.703278,217.492683,
+ -0.541085,0.789792,-0.288887,15.202026,-148.354725,217.435488,
+ -0.541085,0.789792,-0.288887,13.08645,-149.771497,217.524626,
+ -0.541085,0.789792,-0.288887,12.752716,-149.257358,219.555323,
+ -0.55366,0.772594,-0.310739,15.202026,-148.354725,217.435488,
+ -0.55366,0.772594,-0.310739,12.752716,-149.257358,219.555323,
+ -0.55366,0.772594,-0.310739,14.87103,-147.842715,219.298254,
+ 0.897529,0.399368,0.18694,18.995703,-149.870979,217.302238,
+ 0.897529,0.399368,0.18694,17.50257,-146.619733,217.525235,
+ 0.897529,0.399368,0.18694,17.098256,-146.673885,219.582095,
+ 0.894623,0.417585,0.158975,18.995703,-149.870979,217.302238,
+ 0.894623,0.417585,0.158975,17.098256,-146.673885,219.582095,
+ 0.894623,0.417585,0.158975,18.924211,-150.33918,218.934402,
+ 0.996267,0.060957,0.061125,18.995703,-149.870979,217.302238,
+ 0.996267,0.060957,0.061125,18.924211,-150.33918,218.934402,
+ 0.996267,0.060957,0.061125,19.06172,-151.440472,217.791431,
+ 0.995194,0.093254,0.029877,19.06172,-151.440472,217.791431,
+ 0.995194,0.093254,0.029877,18.924211,-150.33918,218.934402,
+ 0.995194,0.093254,0.029877,19.109787,-152.544198,219.635334,
+ 0.895266,-0.371609,-0.245776,19.06172,-151.440472,217.791431,
+ 0.895266,-0.371609,-0.245776,19.109787,-152.544198,219.635334,
+ 0.895266,-0.371609,-0.245776,18.375694,-153.397243,218.251114,
+ 0.906599,-0.302143,-0.294597,18.375694,-153.397243,218.251114,
+ 0.906599,-0.302143,-0.294597,19.109787,-152.544198,219.635334,
+ 0.906599,-0.302143,-0.294597,18.925123,-153.981354,220.54101,
+ 0.860622,-0.488757,-0.14299,18.925123,-153.981354,220.54101,
+ 0.860622,-0.488757,-0.14299,19.17337,-153.965838,221.982121,
+ 0.860622,-0.488757,-0.14299,18.379649,-155.422464,222.183822,
+ 0.872576,-0.47232,-0.124602,18.152089,-155.319028,220.198149,
+ 0.872576,-0.47232,-0.124602,18.925123,-153.981354,220.54101,
+ 0.872576,-0.47232,-0.124602,18.379649,-155.422464,222.183822,
+ -0.195827,0.976983,-0.084592,21.330321,-140.957815,220.604897,
+ -0.195827,0.976983,-0.084592,20.403958,-141.173814,220.254735,
+ -0.195827,0.976983,-0.084592,20.019722,-141.052428,222.546153,
+ 0.212039,0.958638,0.189876,21.330321,-140.957815,220.604897,
+ 0.212039,0.958638,0.189876,20.019722,-141.052428,222.546153,
+ 0.212039,0.958638,0.189876,21.049826,-141.303413,222.662975,
+ 0.501956,0.817828,0.28142,22.771736,-142.318914,222.542806,
+ 0.501956,0.817828,0.28142,21.049826,-141.303413,222.662975,
+ 0.501956,0.817828,0.28142,20.821962,-141.51059,223.671479,
+ 0.408982,0.910936,0.054127,22.771736,-142.318914,222.542806,
+ 0.408982,0.910936,0.054127,20.821962,-141.51059,223.671479,
+ 0.408982,0.910936,0.054127,22.479376,-142.262328,223.799557,
+ 0.19854,0.941542,0.272179,21.049826,-141.303413,222.662975,
+ 0.19854,0.941542,0.272179,20.019722,-141.052428,222.546153,
+ 0.19854,0.941542,0.272179,19.644918,-141.330185,223.780391,
+ 0.168453,0.957353,0.23473,21.049826,-141.303413,222.662975,
+ 0.168453,0.957353,0.23473,19.644918,-141.330185,223.780391,
+ 0.168453,0.957353,0.23473,20.821962,-141.51059,223.671479,
+ 0.863732,-0.183922,-0.46919,23.347024,-146.125977,211.007837,
+ 0.863732,-0.183922,-0.46919,24.263956,-144.258344,211.96371,
+ 0.863732,-0.183922,-0.46919,25.064674,-144.815379,213.65611,
+ 0.86006,-0.130607,-0.493193,23.347024,-146.125977,211.007837,
+ 0.86006,-0.130607,-0.493193,25.064674,-144.815379,213.65611,
+ 0.86006,-0.130607,-0.493193,24.477217,-146.979022,213.204641,
+ 0.840019,-0.019948,-0.542191,24.263956,-144.258344,211.96371,
+ 0.840019,-0.019948,-0.542191,24.97797,-142.321652,212.998681,
+ 0.840019,-0.019948,-0.542191,25.708413,-142.678203,214.143477,
+ 0.871812,-0.156769,-0.464076,24.263956,-144.258344,211.96371,
+ 0.871812,-0.156769,-0.464076,25.708413,-142.678203,214.143477,
+ 0.871812,-0.156769,-0.464076,25.064674,-144.815379,213.65611,
+ 0.908181,-0.166444,-0.384062,24.477217,-146.979022,213.204641,
+ 0.908181,-0.166444,-0.384062,25.064674,-144.815379,213.65611,
+ 0.908181,-0.166444,-0.384062,26.124288,-146.450889,216.870544,
+ 0.895529,-0.253327,-0.36586,24.477217,-146.979022,213.204641,
+ 0.895529,-0.253327,-0.36586,26.124288,-146.450889,216.870544,
+ 0.895529,-0.253327,-0.36586,25.536831,-148.533304,216.874499,
+ 0.902954,-0.183348,-0.38866,25.064674,-144.815379,213.65611,
+ 0.902954,-0.183348,-0.38866,25.708413,-142.678203,214.143477,
+ 0.902954,-0.183348,-0.38866,26.548985,-144.316147,216.869023,
+ 0.90333,-0.179991,-0.389355,25.064674,-144.815379,213.65611,
+ 0.90333,-0.179991,-0.389355,26.548985,-144.316147,216.869023,
+ 0.90333,-0.179991,-0.389355,26.124288,-146.450889,216.870544,
+ 0.899795,-0.254508,-0.354394,26.124288,-146.450889,216.870544,
+ 0.899795,-0.254508,-0.354394,26.713266,-147.957104,219.447628,
+ 0.899795,-0.254508,-0.354394,25.536831,-148.533304,216.874499,
+ 0.898913,-0.259764,-0.352814,25.536831,-148.533304,216.874499,
+ 0.898913,-0.259764,-0.352814,26.713266,-147.957104,219.447628,
+ 0.898913,-0.259764,-0.352814,26.34698,-149.665932,219.77254,
+ 0.951004,-0.189372,-0.244396,26.548985,-144.316147,216.869023,
+ 0.951004,-0.189372,-0.244396,26.753728,-146.169786,219.102029,
+ 0.951004,-0.189372,-0.244396,26.124288,-146.450889,216.870544,
+ 0.962261,-0.072502,-0.262294,26.124288,-146.450889,216.870544,
+ 0.962261,-0.072502,-0.262294,26.753728,-146.169786,219.102029,
+ 0.962261,-0.072502,-0.262294,26.713266,-147.957104,219.447628,
+ 0.949187,-0.241766,-0.201477,26.713266,-147.957104,219.447628,
+ 0.949187,-0.241766,-0.201477,26.94113,-148.477936,221.146112,
+ 0.949187,-0.241766,-0.201477,26.34698,-149.665932,219.77254,
+ 0.945755,-0.277317,-0.169243,26.34698,-149.665932,219.77254,
+ 0.945755,-0.277317,-0.169243,26.94113,-148.477936,221.146112,
+ 0.945755,-0.277317,-0.169243,26.55081,-150.059902,221.557119,
+ 0.983357,-0.0557,-0.172932,26.753728,-146.169786,219.102029,
+ 0.983357,-0.0557,-0.172932,26.998933,-146.825085,220.707421,
+ 0.983357,-0.0557,-0.172932,26.713266,-147.957104,219.447628,
+ 0.984957,-0.075676,-0.155345,26.713266,-147.957104,219.447628,
+ 0.984957,-0.075676,-0.155345,26.998933,-146.825085,220.707421,
+ 0.984957,-0.075676,-0.155345,26.94113,-148.477936,221.146112,
+ 0.972458,-0.219757,0.077665,26.94113,-148.477936,221.146112,
+ 0.972458,-0.219757,0.077665,26.866595,-148.205351,222.850681,
+ 0.972458,-0.219757,0.077665,26.55081,-150.059902,221.557119,
+ 0.987611,-0.155944,-0.017523,26.55081,-150.059902,221.557119,
+ 0.987611,-0.155944,-0.017523,26.866595,-148.205351,222.850681,
+ 0.987611,-0.155944,-0.017523,26.685886,-149.350147,222.853724,
+ 0.997929,-0.018552,0.061592,26.998933,-146.825085,220.707421,
+ 0.997929,-0.018552,0.061592,26.861727,-147.090977,222.850377,
+ 0.997929,-0.018552,0.061592,26.94113,-148.477936,221.146112,
+ 0.999066,0.004376,0.042986,26.94113,-148.477936,221.146112,
+ 0.999066,0.004376,0.042986,26.861727,-147.090977,222.850377,
+ 0.999066,0.004376,0.042986,26.866595,-148.205351,222.850681,
+ 0.972354,-0.15302,0.176388,26.866595,-148.205351,222.850681,
+ 0.972354,-0.15302,0.176388,26.722697,-148.176753,223.668741,
+ 0.972354,-0.15302,0.176388,26.685886,-149.350147,222.853724,
+ 0.951973,-0.194253,0.236673,26.685886,-149.350147,222.853724,
+ 0.951973,-0.194253,0.236673,26.722697,-148.176753,223.668741,
+ 0.951973,-0.194253,0.236673,26.459543,-149.400039,223.723197,
+ 0.954923,0.004252,0.296825,26.861727,-147.090977,222.850377,
+ 0.954923,0.004252,0.296825,26.60983,-146.904487,223.658093,
+ 0.954923,0.004252,0.296825,26.866595,-148.205351,222.850681,
+ 0.981538,0.088495,0.169561,26.866595,-148.205351,222.850681,
+ 0.981538,0.088495,0.169561,26.60983,-146.904487,223.658093,
+ 0.981538,0.088495,0.169561,26.722697,-148.176753,223.668741,
+ -0.939892,-0.338174,-0.047339,19.566428,-148.110433,210.859375,
+ -0.939892,-0.338174,-0.047339,19.711239,-148.550341,211.126789,
+ -0.939892,-0.338174,-0.047339,19.799464,-149.075128,213.124021,
+ -0.655922,-0.716429,-0.23769,19.799464,-149.075128,213.124021,
+ -0.655922,-0.716429,-0.23769,18.802521,-148.233339,213.337891,
+ -0.655922,-0.716429,-0.23769,19.566428,-148.110433,210.859375,
+ -0.979029,-0.19331,0.064297,18.233013,-146.745986,215.692891,
+ -0.979029,-0.19331,0.064297,18.525981,-148.205351,215.76621,
+ -0.979029,-0.19331,0.064297,18.635502,-147.953453,218.191182,
+ -0.76602,-0.618402,-0.175474,18.233013,-146.745986,215.692891,
+ -0.76602,-0.618402,-0.175474,18.635502,-147.953453,218.191182,
+ -0.76602,-0.618402,-0.175474,17.866118,-146.944645,217.994653,
+ 0.690006,0.623099,0.368293,24.46809,-140.505433,216.257836,
+ 0.690006,0.623099,0.368293,24.070469,-141.394681,218.507271,
+ 0.690006,0.623099,0.368293,26.304084,-142.603668,216.367965,
+ 0.696689,0.604987,0.385505,26.304084,-142.603668,216.367965,
+ 0.696689,0.604987,0.385505,24.070469,-141.394681,218.507271,
+ 0.696689,0.604987,0.385505,26.34698,-143.958683,218.416916,
+ 0.98193,0.166658,0.089658,26.304084,-142.603668,216.367965,
+ 0.98193,0.166658,0.089658,26.34698,-143.958683,218.416916,
+ 0.98193,0.166658,0.089658,26.548985,-144.316147,216.869023,
+ 0.975621,0.204304,0.080141,26.548985,-144.316147,216.869023,
+ 0.975621,0.204304,0.080141,26.34698,-143.958683,218.416916,
+ 0.975621,0.204304,0.080141,26.753728,-146.169786,219.102029,
+ 0.663573,-0.710984,-0.232751,26.55081,-150.059902,221.557119,
+ 0.663573,-0.710984,-0.232751,24.0799,-151.427086,218.688893,
+ 0.663573,-0.710984,-0.232751,26.34698,-149.665932,219.77254,
+ 0.789122,-0.288048,-0.542508,24.0799,-151.427086,218.688893,
+ 0.789122,-0.288048,-0.542508,26.55081,-150.059902,221.557119,
+ 0.789122,-0.288048,-0.542508,25.350949,-151.228123,220.432098,
+ -0.329066,-0.880793,0.340467,25.350949,-151.228123,220.432098,
+ -0.329066,-0.880793,0.340467,22.451996,-151.132293,217.878135,
+ -0.329066,-0.880793,0.340467,24.0799,-151.427086,218.688893,
+ 0.070664,-0.99057,-0.117378,25.350949,-151.228123,220.432098,
+ 0.070664,-0.99057,-0.117378,23.235982,-151.346771,220.160121,
+ 0.070664,-0.99057,-0.117378,22.451996,-151.132293,217.878135,
+ -0.800536,-0.588815,0.111526,17.866118,-146.944645,217.994653,
+ -0.800536,-0.588815,0.111526,18.635502,-147.953453,218.191182,
+ -0.800536,-0.588815,0.111526,18.894397,-147.956191,220.035085,
+ -0.815307,-0.563946,0.131298,17.866118,-146.944645,217.994653,
+ -0.815307,-0.563946,0.131298,18.894397,-147.956191,220.035085,
+ -0.815307,-0.563946,0.131298,17.71431,-146.30912,219.781666,
+ 0.690876,0.599152,0.404608,26.34698,-143.958683,218.416916,
+ 0.690876,0.599152,0.404608,24.070469,-141.394681,218.507271,
+ 0.690876,0.599152,0.404608,23.468105,-142.106566,220.58999,
+ 0.677826,0.649617,0.34431,26.34698,-143.958683,218.416916,
+ 0.677826,0.649617,0.34431,23.468105,-142.106566,220.58999,
+ 0.677826,0.649617,0.34431,26.431554,-145.338341,220.853449,
+ 0.975334,0.204875,0.082153,26.34698,-143.958683,218.416916,
+ 0.975334,0.204875,0.082153,26.431554,-145.338341,220.853449,
+ 0.975334,0.204875,0.082153,26.753728,-146.169786,219.102029,
+ 0.934364,0.356309,0.002727,26.753728,-146.169786,219.102029,
+ 0.934364,0.356309,0.002727,26.431554,-145.338341,220.853449,
+ 0.934364,0.356309,0.002727,26.998933,-146.825085,220.707421,
+ 0.415952,-0.815249,0.402931,26.685886,-149.350147,222.853724,
+ 0.415952,-0.815249,0.402931,25.350949,-151.228123,220.432098,
+ 0.415952,-0.815249,0.402931,26.55081,-150.059902,221.557119,
+ 0.779378,-0.624187,0.054422,25.350949,-151.228123,220.432098,
+ 0.779378,-0.624187,0.054422,26.685886,-149.350147,222.853724,
+ 0.779378,-0.624187,0.054422,25.135254,-151.316044,222.512688,
+ 0.060573,-0.997519,-0.035873,25.350949,-151.228123,220.432098,
+ 0.060573,-0.997519,-0.035873,25.135254,-151.316044,222.512688,
+ 0.060573,-0.997519,-0.035873,23.235982,-151.346771,220.160121,
+ -0.017785,-0.999466,0.027412,25.135254,-151.316044,222.512688,
+ -0.017785,-0.999466,0.027412,23.033369,-151.289881,222.102898,
+ -0.017785,-0.999466,0.027412,23.235982,-151.346771,220.160121,
+ -0.815985,-0.573639,0.071459,17.71431,-146.30912,219.781666,
+ -0.815985,-0.573639,0.071459,18.894397,-147.956191,220.035085,
+ -0.815985,-0.573639,0.071459,18.948549,-147.785217,222.025929,
+ 0.535368,-0.657142,-0.530608,24.477217,-146.979022,213.204641,
+ 0.535368,-0.657142,-0.530608,21.125882,-147.880743,210.939995,
+ 0.535368,-0.657142,-0.530608,23.347024,-146.125977,211.007837,
+ -0.750709,0.643867,0.14789,18.417069,-141.420844,222.358142,
+ -0.750709,0.643867,0.14789,17.445376,-142.678507,222.901183,
+ -0.750709,0.643867,0.14789,18.274692,-141.843716,223.476471,
+ -0.816912,-0.572129,0.072962,17.71431,-146.30912,219.781666,
+ -0.816912,-0.572129,0.072962,18.948549,-147.785217,222.025929,
+ -0.816912,-0.572129,0.072962,17.660767,-145.968693,221.851609,
+ 0.686311,0.655087,0.315971,23.468105,-142.106566,220.58999,
+ 0.686311,0.655087,0.315971,22.771736,-142.318914,222.542806,
+ 0.686311,0.655087,0.315971,26.431554,-145.338341,220.853449,
+ 0.679352,0.699686,0.22118,26.431554,-145.338341,220.853449,
+ 0.679352,0.699686,0.22118,22.771736,-142.318914,222.542806,
+ 0.679352,0.699686,0.22118,25.775342,-145.324955,222.826648,
+ 0.901317,0.314734,0.297609,26.998933,-146.825085,220.707421,
+ 0.901317,0.314734,0.297609,26.431554,-145.338341,220.853449,
+ 0.901317,0.314734,0.297609,25.775342,-145.324955,222.826648,
+ 0.844999,0.521405,0.118797,26.998933,-146.825085,220.707421,
+ 0.844999,0.521405,0.118797,25.775342,-145.324955,222.826648,
+ 0.844999,0.521405,0.118797,26.861727,-147.090977,222.850377,
+ 0.760917,-0.628293,0.16203,25.135254,-151.316044,222.512688,
+ 0.760917,-0.628293,0.16203,26.685886,-149.350147,222.853724,
+ 0.760917,-0.628293,0.16203,26.459543,-149.400039,223.723197,
+ 0.735599,-0.643037,0.213066,25.135254,-151.316044,222.512688,
+ 0.735599,-0.643037,0.213066,26.459543,-149.400039,223.723197,
+ 0.735599,-0.643037,0.213066,24.857498,-151.351334,223.365125,
+ -0.004111,-0.999079,-0.0427,25.135254,-151.316044,222.512688,
+ -0.004111,-0.999079,-0.0427,24.857498,-151.351334,223.365125,
+ -0.004111,-0.999079,-0.0427,23.033369,-151.289881,222.102898,
+ -0.730443,0.631138,-0.260993,17.986895,-142.811758,219.626816,
+ -0.730443,0.631138,-0.260993,17.421951,-142.440908,222.104723,
+ -0.730443,0.631138,-0.260993,18.867625,-141.665136,219.934691,
+ -0.67678,0.709249,-0.197318,18.867625,-141.665136,219.934691,
+ -0.67678,0.709249,-0.197318,17.421951,-142.440908,222.104723,
+ -0.67678,0.709249,-0.197318,18.417069,-141.420844,222.358142,
+ -0.247573,0.916253,0.314942,20.019722,-141.052428,222.546153,
+ -0.247573,0.916253,0.314942,18.417069,-141.420844,222.358142,
+ -0.247573,0.916253,0.314942,18.274692,-141.843716,223.476471,
+ -0.027215,-0.999586,-0.009335,24.857498,-151.351334,223.365125,
+ -0.027215,-0.999586,-0.009335,22.805505,-151.291706,222.962636,
+ -0.027215,-0.999586,-0.009335,23.033369,-151.289881,222.102898,
+ -0.367981,0.924825,0.09638,20.019722,-141.052428,222.546153,
+ -0.367981,0.924825,0.09638,18.274692,-141.843716,223.476471,
+ -0.367981,0.924825,0.09638,19.644918,-141.330185,223.780391,
+ -0.725176,0.653695,0.216339,17.421951,-142.440908,222.104723,
+ -0.725176,0.653695,0.216339,17.445376,-142.678507,222.901183,
+ -0.725176,0.653695,0.216339,18.417069,-141.420844,222.358142,
+ -0.806191,-0.581833,-0.107362,17.660767,-145.968693,221.851609,
+ -0.806191,-0.581833,-0.107362,18.948549,-147.785217,222.025929,
+ -0.806191,-0.581833,-0.107362,18.743501,-147.619719,222.668755,
+ -0.827219,-0.560677,-0.036754,17.660767,-145.968693,221.851609,
+ -0.827219,-0.560677,-0.036754,18.743501,-147.619719,222.668755,
+ -0.827219,-0.560677,-0.036754,17.578018,-145.898418,222.641983,
+ 0.695239,0.706942,0.129904,25.775342,-145.324955,222.826648,
+ 0.695239,0.706942,0.129904,22.771736,-142.318914,222.542806,
+ 0.695239,0.706942,0.129904,22.479376,-142.262328,223.799557,
+ 0.687181,0.725055,0.045587,25.775342,-145.324955,222.826648,
+ 0.687181,0.725055,0.045587,22.479376,-142.262328,223.799557,
+ 0.687181,0.725055,0.045587,25.167502,-144.797125,223.594206,
+ 0.811619,0.503261,0.296653,25.775342,-145.324955,222.826648,
+ 0.811619,0.503261,0.296653,25.167502,-144.797125,223.594206,
+ 0.811619,0.503261,0.296653,26.861727,-147.090977,222.850377,
+ 0.817004,0.562961,0.124815,26.861727,-147.090977,222.850377,
+ 0.817004,0.562961,0.124815,25.167502,-144.797125,223.594206,
+ 0.817004,0.562961,0.124815,26.60983,-146.904487,223.658093,
+ -0.675709,0.706309,-0.211055,23.670414,-142.249855,212.030639,
+ -0.675709,0.706309,-0.211055,22.646699,-143.337761,211.667395,
+ -0.675709,0.706309,-0.211055,22.763826,-142.488367,214.134959,
+ -0.820634,0.487417,-0.298302,23.670414,-142.249855,212.030639,
+ -0.820634,0.487417,-0.298302,22.763826,-142.488367,214.134959,
+ -0.820634,0.487417,-0.298302,23.697186,-140.932564,214.109404,
+ -0.620257,0.751404,-0.225109,22.646699,-143.337761,211.667395,
+ -0.620257,0.751404,-0.225109,21.707255,-144.207843,211.35161,
+ -0.620257,0.751404,-0.225109,21.378084,-143.745422,213.802137,
+ -0.623632,0.747789,-0.227805,22.763826,-142.488367,214.134959,
+ -0.623632,0.747789,-0.227805,22.646699,-143.337761,211.667395,
+ -0.623632,0.747789,-0.227805,21.378084,-143.745422,213.802137,
+ -0.77215,0.45596,-0.442589,23.697186,-140.932564,214.109404,
+ -0.77215,0.45596,-0.442589,22.763826,-142.488367,214.134959,
+ -0.77215,0.45596,-0.442589,21.45414,-142.061236,216.859896,
+ -0.739744,0.55963,-0.373621,23.697186,-140.932564,214.109404,
+ -0.739744,0.55963,-0.373621,21.45414,-142.061236,216.859896,
+ -0.739744,0.55963,-0.373621,22.89951,-140.310121,216.62108,
+ -0.545544,0.716499,-0.434753,22.763826,-142.488367,214.134959,
+ -0.545544,0.716499,-0.434753,21.378084,-143.745422,213.802137,
+ -0.545544,0.716499,-0.434753,20.002686,-143.06761,216.645114,
+ -0.494517,0.790391,-0.361573,22.763826,-142.488367,214.134959,
+ -0.494517,0.790391,-0.361573,20.002686,-143.06761,216.645114,
+ -0.494517,0.790391,-0.361573,21.45414,-142.061236,216.859896,
+ -0.718711,0.5322,-0.447456,22.89951,-140.310121,216.62108,
+ -0.718711,0.5322,-0.447456,21.45414,-142.061236,216.859896,
+ -0.718711,0.5322,-0.447456,20.788193,-141.780133,218.263891,
+ -0.699694,0.631459,-0.334197,22.89951,-140.310121,216.62108,
+ -0.699694,0.631459,-0.334197,20.788193,-141.780133,218.263891,
+ -0.699694,0.631459,-0.334197,21.369566,-140.877195,218.75278,
+ -0.436788,0.73933,-0.512452,21.45414,-142.061236,216.859896,
+ -0.436788,0.73933,-0.512452,20.002686,-143.06761,216.645114,
+ -0.436788,0.73933,-0.512452,19.369291,-142.647476,217.791127,
+ -0.397392,0.845067,-0.357689,21.45414,-142.061236,216.859896,
+ -0.397392,0.845067,-0.357689,19.369291,-142.647476,217.791127,
+ -0.397392,0.845067,-0.357689,20.788193,-141.780133,218.263891,
+ -0.484072,0.636683,-0.600257,21.369566,-140.877195,218.75278,
+ -0.484072,0.636683,-0.600257,20.788193,-141.780133,218.263891,
+ -0.484072,0.636683,-0.600257,18.867625,-141.665136,219.934691,
+ -0.303309,0.952868,-0.006817,21.369566,-140.877195,218.75278,
+ -0.303309,0.952868,-0.006817,18.867625,-141.665136,219.934691,
+ -0.303309,0.952868,-0.006817,20.403958,-141.173814,220.254735,
+ -0.441003,0.86049,-0.255096,20.788193,-141.780133,218.263891,
+ -0.441003,0.86049,-0.255096,19.369291,-142.647476,217.791127,
+ -0.441003,0.86049,-0.255096,17.986895,-142.811758,219.626816,
+ -0.519589,0.570003,-0.636494,18.867625,-141.665136,219.934691,
+ -0.519589,0.570003,-0.636494,20.788193,-141.780133,218.263891,
+ -0.519589,0.570003,-0.636494,17.986895,-142.811758,219.626816,
+ -0.273462,0.950635,-0.146668,20.403958,-141.173814,220.254735,
+ -0.273462,0.950635,-0.146668,18.867625,-141.665136,219.934691,
+ -0.273462,0.950635,-0.146668,18.417069,-141.420844,222.358142,
+ -0.213437,0.973045,-0.087336,20.403958,-141.173814,220.254735,
+ -0.213437,0.973045,-0.087336,18.417069,-141.420844,222.358142,
+ -0.213437,0.973045,-0.087336,20.019722,-141.052428,222.546153,
+ -0.126178,-0.086377,0.98824,18.039526,-145.948006,225.656542,
+ -0.126178,-0.086377,0.98824,19.179759,-147.763313,225.643461,
+ -0.126178,-0.086377,0.98824,25.55265,-147.755099,226.457869,
+ -0.215071,0.911933,0.349462,19.38511,-142.605189,226.146952,
+ -0.215071,0.911933,0.349462,18.274692,-141.843716,223.476471,
+ -0.215071,0.911933,0.349462,18.609643,-142.794721,226.164293,
+ 0.339531,0.825427,0.450987,22.479376,-142.262328,223.799557,
+ 0.339531,0.825427,0.450987,20.821962,-141.51059,223.671479,
+ 0.339531,0.825427,0.450987,21.266738,-143.163745,226.362343,
+ 0.376518,0.815809,0.438964,21.266738,-143.163745,226.362343,
+ 0.376518,0.815809,0.438964,20.821962,-141.51059,223.671479,
+ 0.376518,0.815809,0.438964,19.994168,-142.531567,226.278985,
+ -0.202263,0.871266,0.447197,19.994168,-142.531567,226.278985,
+ -0.202263,0.871266,0.447197,19.644918,-141.330185,223.780391,
+ -0.202263,0.871266,0.447197,19.38511,-142.605189,226.146952,
+ 0.175058,0.89665,0.406661,20.821962,-141.51059,223.671479,
+ 0.175058,0.89665,0.406661,19.644918,-141.330185,223.780391,
+ 0.175058,0.89665,0.406661,19.994168,-142.531567,226.278985,
+ 0.889254,-0.172437,0.423665,26.722697,-148.176753,223.668741,
+ 0.889254,-0.172437,0.423665,25.056765,-150.097626,226.383638,
+ 0.889254,-0.172437,0.423665,26.459543,-149.400039,223.723197,
+ 0.892519,-0.3067,0.330674,26.722697,-148.176753,223.668741,
+ 0.892519,-0.3067,0.330674,25.521315,-148.723445,226.404326,
+ 0.892519,-0.3067,0.330674,25.056765,-150.097626,226.383638,
+ 0.939243,-0.049177,0.339712,26.60983,-146.904487,223.658093,
+ 0.939243,-0.049177,0.339712,25.55265,-147.755099,226.457869,
+ 0.939243,-0.049177,0.339712,25.521315,-148.723445,226.404326,
+ 0.906093,0.083853,0.414685,26.60983,-146.904487,223.658093,
+ 0.906093,0.083853,0.414685,25.521315,-148.723445,226.404326,
+ 0.906093,0.083853,0.414685,26.722697,-148.176753,223.668741,
+ -0.746061,-0.661354,0.077489,18.743501,-147.619719,222.668755,
+ -0.746061,-0.661354,0.077489,20.26006,-149.327026,222.698569,
+ -0.746061,-0.661354,0.077489,19.179759,-147.763313,225.643461,
+ -0.742252,-0.665216,0.080937,20.26006,-149.327026,222.698569,
+ -0.742252,-0.665216,0.080937,20.752903,-149.512602,225.693049,
+ -0.742252,-0.665216,0.080937,19.179759,-147.763313,225.643461,
+ -0.496501,-0.849157,0.180053,22.971611,-150.738018,226.031955,
+ -0.496501,-0.849157,0.180053,20.752903,-149.512602,225.693049,
+ -0.496501,-0.849157,0.180053,22.805505,-151.291706,222.962636,
+ -0.613562,-0.787923,0.052153,22.805505,-151.291706,222.962636,
+ -0.613562,-0.787923,0.052153,20.752903,-149.512602,225.693049,
+ -0.613562,-0.787923,0.052153,20.26006,-149.327026,222.698569,
+ -0.944696,0.202765,0.257751,17.078177,-144.170423,222.728992,
+ -0.944696,0.202765,0.257751,18.061735,-143.513603,225.817173,
+ -0.944696,0.202765,0.257751,17.445376,-142.678507,222.901183,
+ -0.946162,0.192179,0.26047,17.078177,-144.170423,222.728992,
+ -0.946162,0.192179,0.26047,17.732564,-144.933418,225.669015,
+ -0.946162,0.192179,0.26047,18.061735,-143.513603,225.817173,
+ -0.94721,-0.288302,0.140269,17.578018,-145.898418,222.641983,
+ -0.94721,-0.288302,0.140269,18.039526,-145.948006,225.656542,
+ -0.94721,-0.288302,0.140269,17.732564,-144.933418,225.669015,
+ -0.949514,-0.281618,0.138256,17.578018,-145.898418,222.641983,
+ -0.949514,-0.281618,0.138256,17.732564,-144.933418,225.669015,
+ -0.949514,-0.281618,0.138256,17.078177,-144.170423,222.728992,
+ -0.398141,0.825118,0.40083,19.644918,-141.330185,223.780391,
+ -0.398141,0.825118,0.40083,18.274692,-141.843716,223.476471,
+ -0.398141,0.825118,0.40083,19.38511,-142.605189,226.146952,
+ -0.822338,0.476883,0.310391,17.445376,-142.678507,222.901183,
+ -0.822338,0.476883,0.310391,18.061735,-143.513603,225.817173,
+ -0.822338,0.476883,0.310391,18.609643,-142.794721,226.164293,
+ -0.771767,0.563119,0.295419,17.445376,-142.678507,222.901183,
+ -0.771767,0.563119,0.295419,18.609643,-142.794721,226.164293,
+ -0.771767,0.563119,0.295419,18.274692,-141.843716,223.476471,
+ 0.613053,-0.781115,0.118432,26.459543,-149.400039,223.723197,
+ 0.613053,-0.781115,0.118432,25.056765,-150.097626,226.383638,
+ 0.613053,-0.781115,0.118432,23.99776,-150.964665,226.146952,
+ 0.707135,-0.636919,0.307074,24.857498,-151.351334,223.365125,
+ 0.707135,-0.636919,0.307074,26.459543,-149.400039,223.723197,
+ 0.707135,-0.636919,0.307074,23.99776,-150.964665,226.146952,
+ -0.063928,-0.981492,0.180516,24.857498,-151.351334,223.365125,
+ -0.063928,-0.981492,0.180516,22.971611,-150.738018,226.031955,
+ -0.063928,-0.981492,0.180516,22.805505,-151.291706,222.962636,
+ -0.222296,-0.972708,0.066503,24.857498,-151.351334,223.365125,
+ -0.222296,-0.972708,0.066503,23.99776,-150.964665,226.146952,
+ -0.222296,-0.972708,0.066503,22.971611,-150.738018,226.031955,
+ -0.82321,-0.555573,0.116889,17.578018,-145.898418,222.641983,
+ -0.82321,-0.555573,0.116889,18.743501,-147.619719,222.668755,
+ -0.82321,-0.555573,0.116889,18.039526,-145.948006,225.656542,
+ -0.842417,-0.529846,0.097969,18.743501,-147.619719,222.668755,
+ -0.842417,-0.529846,0.097969,19.179759,-147.763313,225.643461,
+ -0.842417,-0.529846,0.097969,18.039526,-145.948006,225.656542,
+ 0.647856,0.655622,0.387869,25.167502,-144.797125,223.594206,
+ 0.647856,0.655622,0.387869,22.479376,-142.262328,223.799557,
+ 0.647856,0.655622,0.387869,24.320237,-145.644694,226.442049,
+ 0.540106,0.680653,0.494971,24.320237,-145.644694,226.442049,
+ 0.540106,0.680653,0.494971,22.479376,-142.262328,223.799557,
+ 0.540106,0.680653,0.494971,21.266738,-143.163745,226.362343,
+ 0.736703,0.517416,0.435373,25.167502,-144.797125,223.594206,
+ 0.736703,0.517416,0.435373,25.55265,-147.755099,226.457869,
+ 0.736703,0.517416,0.435373,26.60983,-146.904487,223.658093,
+ 0.79852,0.469139,0.377193,25.167502,-144.797125,223.594206,
+ 0.79852,0.469139,0.377193,24.320237,-145.644694,226.442049,
+ 0.79852,0.469139,0.377193,25.55265,-147.755099,226.457869,
+ -0.038656,-0.878832,-0.475564,21.105499,-149.471836,212.716361,
+ -0.038656,-0.878832,-0.475564,19.711239,-148.550341,211.126789,
+ -0.038656,-0.878832,-0.475564,20.526256,-148.63887,211.22414,
+ -0.346603,-0.910867,-0.224026,21.105499,-149.471836,212.716361,
+ -0.346603,-0.910867,-0.224026,19.799464,-149.075128,213.124021,
+ -0.346603,-0.910867,-0.224026,19.711239,-148.550341,211.126789,
+ -0.655735,-0.744029,-0.128188,19.915373,-149.578619,215.453467,
+ -0.655735,-0.744029,-0.128188,18.802521,-148.233339,213.337891,
+ -0.655735,-0.744029,-0.128188,19.799464,-149.075128,213.124021,
+ -0.709338,-0.70111,-0.072699,18.802521,-148.233339,213.337891,
+ -0.709338,-0.70111,-0.072699,19.915373,-149.578619,215.453467,
+ -0.709338,-0.70111,-0.072699,18.525981,-148.205351,215.76621,
+ -0.366978,-0.870126,-0.328949,21.778139,-150.670784,215.137378,
+ -0.366978,-0.870126,-0.328949,19.799464,-149.075128,213.124021,
+ -0.366978,-0.870126,-0.328949,21.105499,-149.471836,212.716361,
+ -0.519153,-0.84036,-0.155805,21.778139,-150.670784,215.137378,
+ -0.519153,-0.84036,-0.155805,19.915373,-149.578619,215.453467,
+ -0.519153,-0.84036,-0.155805,19.799464,-149.075128,213.124021,
+ -0.685488,-0.719265,0.112975,20.200736,-149.481876,217.800862,
+ -0.685488,-0.719265,0.112975,18.525981,-148.205351,215.76621,
+ -0.685488,-0.719265,0.112975,19.915373,-149.578619,215.453467,
+ -0.681047,-0.724524,0.10602,20.200736,-149.481876,217.800862,
+ -0.681047,-0.724524,0.10602,18.635502,-147.953453,218.191182,
+ -0.681047,-0.724524,0.10602,18.525981,-148.205351,215.76621,
+ -0.508214,-0.860998,-0.020029,22.451996,-151.132293,217.878135,
+ -0.508214,-0.860998,-0.020029,19.915373,-149.578619,215.453467,
+ -0.508214,-0.860998,-0.020029,21.778139,-150.670784,215.137378,
+ -0.590329,-0.800337,0.104748,22.451996,-151.132293,217.878135,
+ -0.590329,-0.800337,0.104748,20.200736,-149.481876,217.800862,
+ -0.590329,-0.800337,0.104748,19.915373,-149.578619,215.453467,
+ -0.690306,-0.72132,0.056341,20.572498,-149.672624,219.9137,
+ -0.690306,-0.72132,0.056341,18.635502,-147.953453,218.191182,
+ -0.690306,-0.72132,0.056341,20.200736,-149.481876,217.800862,
+ -0.70809,-0.699235,0.098382,18.635502,-147.953453,218.191182,
+ -0.70809,-0.699235,0.098382,20.572498,-149.672624,219.9137,
+ -0.70809,-0.699235,0.098382,18.894397,-147.956191,220.035085,
+ -0.589265,-0.797823,0.127459,23.235982,-151.346771,220.160121,
+ -0.589265,-0.797823,0.127459,20.200736,-149.481876,217.800862,
+ -0.589265,-0.797823,0.127459,22.451996,-151.132293,217.878135,
+ -0.533238,-0.845785,0.017467,23.235982,-151.346771,220.160121,
+ -0.533238,-0.845785,0.017467,20.572498,-149.672624,219.9137,
+ -0.533238,-0.845785,0.017467,20.200736,-149.481876,217.800862,
+ -0.712076,-0.700007,0.054198,20.572498,-149.672624,219.9137,
+ -0.712076,-0.700007,0.054198,20.473929,-149.415859,221.934966,
+ -0.712076,-0.700007,0.054198,18.894397,-147.956191,220.035085,
+ -0.725848,-0.683369,0.078431,18.894397,-147.956191,220.035085,
+ -0.725848,-0.683369,0.078431,20.473929,-149.415859,221.934966,
+ -0.725848,-0.683369,0.078431,18.948549,-147.785217,222.025929,
+ -0.529894,-0.847517,-0.030445,23.235982,-151.346771,220.160121,
+ -0.529894,-0.847517,-0.030445,23.033369,-151.289881,222.102898,
+ -0.529894,-0.847517,-0.030445,20.572498,-149.672624,219.9137,
+ -0.592306,-0.802395,0.073045,23.033369,-151.289881,222.102898,
+ -0.592306,-0.802395,0.073045,20.473929,-149.415859,221.934966,
+ -0.592306,-0.802395,0.073045,20.572498,-149.672624,219.9137,
+ -0.727995,-0.674001,-0.125487,20.473929,-149.415859,221.934966,
+ -0.727995,-0.674001,-0.125487,20.26006,-149.327026,222.698569,
+ -0.727995,-0.674001,-0.125487,18.948549,-147.785217,222.025929,
+ -0.745376,-0.663269,-0.066997,18.948549,-147.785217,222.025929,
+ -0.745376,-0.663269,-0.066997,20.26006,-149.327026,222.698569,
+ -0.745376,-0.663269,-0.066997,18.743501,-147.619719,222.668755,
+ -0.577037,-0.801944,-0.15464,23.033369,-151.289881,222.102898,
+ -0.577037,-0.801944,-0.15464,22.805505,-151.291706,222.962636,
+ -0.577037,-0.801944,-0.15464,20.473929,-149.415859,221.934966,
+ -0.604182,-0.793122,-0.076951,22.805505,-151.291706,222.962636,
+ -0.604182,-0.793122,-0.076951,20.26006,-149.327026,222.698569,
+ -0.604182,-0.793122,-0.076951,20.473929,-149.415859,221.934966,
+ -0.853068,0.480351,-0.203809,20.696317,-146.079735,211.171205,
+ -0.853068,0.480351,-0.203809,20.397569,-145.617923,213.510082,
+ -0.853068,0.480351,-0.203809,21.707255,-144.207843,211.35161,
+ -0.853567,0.478941,-0.205034,21.707255,-144.207843,211.35161,
+ -0.853567,0.478941,-0.205034,20.397569,-145.617923,213.510082,
+ -0.853567,0.478941,-0.205034,21.378084,-143.745422,213.802137,
+ -0.758122,0.607268,-0.237648,19.398192,-147.774265,210.982282,
+ -0.758122,0.607268,-0.237648,19.06385,-147.300892,213.258488,
+ -0.758122,0.607268,-0.237648,20.696317,-146.079735,211.171205,
+ -0.748462,0.625908,-0.219188,20.696317,-146.079735,211.171205,
+ -0.748462,0.625908,-0.219188,19.06385,-147.300892,213.258488,
+ -0.748462,0.625908,-0.219188,20.397569,-145.617923,213.510082,
+ -0.777608,0.471978,-0.415406,20.397569,-145.617923,213.510082,
+ -0.777608,0.471978,-0.415406,19.344953,-145.018905,216.161093,
+ -0.777608,0.471978,-0.415406,21.378084,-143.745422,213.802137,
+ -0.791672,0.384602,-0.474697,21.378084,-143.745422,213.802137,
+ -0.791672,0.384602,-0.474697,19.344953,-145.018905,216.161093,
+ -0.791672,0.384602,-0.474697,20.002686,-143.06761,216.645114,
+ -0.697657,0.609234,-0.376974,19.06385,-147.300892,213.258488,
+ -0.697657,0.609234,-0.376974,18.233013,-146.745986,215.692891,
+ -0.697657,0.609234,-0.376974,20.397569,-145.617923,213.510082,
+ -0.7116,0.569638,-0.411264,20.397569,-145.617923,213.510082,
+ -0.7116,0.569638,-0.411264,18.233013,-146.745986,215.692891,
+ -0.7116,0.569638,-0.411264,19.344953,-145.018905,216.161093,
+ -0.775479,0.385438,-0.50007,19.344953,-145.018905,216.161093,
+ -0.775479,0.385438,-0.50007,18.43228,-144.68152,217.836456,
+ -0.775479,0.385438,-0.50007,20.002686,-143.06761,216.645114,
+ -0.764711,0.340077,-0.547325,20.002686,-143.06761,216.645114,
+ -0.764711,0.340077,-0.547325,18.43228,-144.68152,217.836456,
+ -0.764711,0.340077,-0.547325,19.369291,-142.647476,217.791127,
+ -0.827329,0.555411,-0.083938,18.233013,-146.745986,215.692891,
+ -0.827329,0.555411,-0.083938,17.866118,-146.944645,217.994653,
+ -0.827329,0.555411,-0.083938,19.344953,-145.018905,216.161093,
+ -0.848748,0.177511,-0.498112,19.344953,-145.018905,216.161093,
+ -0.848748,0.177511,-0.498112,17.866118,-146.944645,217.994653,
+ -0.848748,0.177511,-0.498112,18.43228,-144.68152,217.836456,
+ -0.808496,0.362107,-0.463911,19.369291,-142.647476,217.791127,
+ -0.808496,0.362107,-0.463911,18.43228,-144.68152,217.836456,
+ -0.808496,0.362107,-0.463911,17.470018,-144.471605,219.677317,
+ -0.787507,0.227807,-0.572658,19.369291,-142.647476,217.791127,
+ -0.787507,0.227807,-0.572658,17.470018,-144.471605,219.677317,
+ -0.787507,0.227807,-0.572658,17.986895,-142.811758,219.626816,
+ -0.959771,0.228719,-0.162874,18.43228,-144.68152,217.836456,
+ -0.959771,0.228719,-0.162874,17.866118,-146.944645,217.994653,
+ -0.959771,0.228719,-0.162874,17.71431,-146.30912,219.781666,
+ -0.883736,-0.142799,-0.445666,18.43228,-144.68152,217.836456,
+ -0.883736,-0.142799,-0.445666,17.71431,-146.30912,219.781666,
+ -0.883736,-0.142799,-0.445666,17.470018,-144.471605,219.677317,
+ -0.928223,0.281654,-0.243051,17.986895,-142.811758,219.626816,
+ -0.928223,0.281654,-0.243051,17.470018,-144.471605,219.677317,
+ -0.928223,0.281654,-0.243051,17.004555,-144.06577,221.925231,
+ -0.930221,0.266795,-0.252013,17.986895,-142.811758,219.626816,
+ -0.930221,0.266795,-0.252013,17.004555,-144.06577,221.925231,
+ -0.930221,0.266795,-0.252013,17.421951,-142.440908,222.104723,
+ -0.991241,-0.132006,-0.003931,17.470018,-144.471605,219.677317,
+ -0.991241,-0.132006,-0.003931,17.71431,-146.30912,219.781666,
+ -0.991241,-0.132006,-0.003931,17.660767,-145.968693,221.851609,
+ -0.9381,-0.318206,-0.136799,17.470018,-144.471605,219.677317,
+ -0.9381,-0.318206,-0.136799,17.660767,-145.968693,221.851609,
+ -0.9381,-0.318206,-0.136799,17.004555,-144.06577,221.925231,
+ -0.964767,0.234693,0.118928,17.004555,-144.06577,221.925231,
+ -0.964767,0.234693,0.118928,17.078177,-144.170423,222.728992,
+ -0.964767,0.234693,0.118928,17.421951,-142.440908,222.104723,
+ -0.969028,0.227384,0.096334,17.421951,-142.440908,222.104723,
+ -0.969028,0.227384,0.096334,17.078177,-144.170423,222.728992,
+ -0.969028,0.227384,0.096334,17.445376,-142.678507,222.901183,
+ -0.943874,-0.322777,-0.07012,17.660767,-145.968693,221.851609,
+ -0.943874,-0.322777,-0.07012,17.578018,-145.898418,222.641983,
+ -0.943874,-0.322777,-0.07012,17.004555,-144.06577,221.925231,
+ -0.958657,-0.279888,0.051368,17.004555,-144.06577,221.925231,
+ -0.958657,-0.279888,0.051368,17.578018,-145.898418,222.641983,
+ -0.958657,-0.279888,0.051368,17.078177,-144.170423,222.728992,
+ -0.062277,0.973461,-0.220215,24.241139,-140.742728,213.843208,
+ -0.062277,0.973461,-0.220215,23.926267,-140.705613,214.096322,
+ -0.062277,0.973461,-0.220215,23.48575,-140.169874,216.589136,
+ 0.284367,0.951151,-0.120201,24.46809,-140.505433,216.257836,
+ 0.284367,0.951151,-0.120201,24.241139,-140.742728,213.843208,
+ 0.284367,0.951151,-0.120201,23.48575,-140.169874,216.589136,
+ -0.664006,0.648813,-0.371669,23.926267,-140.705613,214.096322,
+ -0.664006,0.648813,-0.371669,23.697186,-140.932564,214.109404,
+ -0.664006,0.648813,-0.371669,22.89951,-140.310121,216.62108,
+ -0.238189,0.940038,-0.244118,23.926267,-140.705613,214.096322,
+ -0.238189,0.940038,-0.244118,22.89951,-140.310121,216.62108,
+ -0.238189,0.940038,-0.244118,23.48575,-140.169874,216.589136,
+ 0.411746,0.826616,0.383629,24.46809,-140.505433,216.257836,
+ 0.411746,0.826616,0.383629,23.48575,-140.169874,216.589136,
+ 0.411746,0.826616,0.383629,22.211659,-140.584836,218.85074,
+ 0.427268,0.812446,0.396703,24.46809,-140.505433,216.257836,
+ 0.427268,0.812446,0.396703,22.211659,-140.584836,218.85074,
+ 0.427268,0.812446,0.396703,24.070469,-141.394681,218.507271,
+ -0.226704,0.969305,0.095146,23.48575,-140.169874,216.589136,
+ -0.226704,0.969305,0.095146,22.89951,-140.310121,216.62108,
+ -0.226704,0.969305,0.095146,21.369566,-140.877195,218.75278,
+ -0.326844,0.945017,-0.010737,23.48575,-140.169874,216.589136,
+ -0.326844,0.945017,-0.010737,21.369566,-140.877195,218.75278,
+ -0.326844,0.945017,-0.010737,22.211659,-140.584836,218.85074,
+ 0.42744,0.816386,0.388342,24.070469,-141.394681,218.507271,
+ 0.42744,0.816386,0.388342,22.211659,-140.584836,218.85074,
+ 0.42744,0.816386,0.388342,21.330321,-140.957815,220.604897,
+ 0.435711,0.805633,0.401386,24.070469,-141.394681,218.507271,
+ 0.435711,0.805633,0.401386,21.330321,-140.957815,220.604897,
+ 0.435711,0.805633,0.401386,23.468105,-142.106566,220.58999,
+ -0.325545,0.945256,-0.022616,22.211659,-140.584836,218.85074,
+ -0.325545,0.945256,-0.022616,21.369566,-140.877195,218.75278,
+ -0.325545,0.945256,-0.022616,20.403958,-141.173814,220.254735,
+ -0.254038,0.964096,0.077356,22.211659,-140.584836,218.85074,
+ -0.254038,0.964096,0.077356,20.403958,-141.173814,220.254735,
+ -0.254038,0.964096,0.077356,21.330321,-140.957815,220.604897,
+ 0.464132,0.861036,0.207844,23.468105,-142.106566,220.58999,
+ 0.464132,0.861036,0.207844,21.330321,-140.957815,220.604897,
+ 0.464132,0.861036,0.207844,21.049826,-141.303413,222.662975,
+ 0.50315,0.821353,0.268736,23.468105,-142.106566,220.58999,
+ 0.50315,0.821353,0.268736,21.049826,-141.303413,222.662975,
+ 0.50315,0.821353,0.268736,22.771736,-142.318914,222.542806,
+ 0.558307,-0.5764,-0.596704,24.477217,-146.979022,213.204641,
+ 0.558307,-0.5764,-0.596704,22.486982,-149.070869,213.363142,
+ 0.558307,-0.5764,-0.596704,21.125882,-147.880743,210.939995,
+ 0.50881,-0.624514,-0.592532,22.486982,-149.070869,213.363142,
+ 0.50881,-0.624514,-0.592532,20.526256,-148.63887,211.22414,
+ 0.50881,-0.624514,-0.592532,21.125882,-147.880743,210.939995,
+ 0.46225,-0.685738,-0.562217,22.486982,-149.070869,213.363142,
+ 0.46225,-0.685738,-0.562217,21.105499,-149.471836,212.716361,
+ 0.46225,-0.685738,-0.562217,20.526256,-148.63887,211.22414,
+ -0.893695,-0.340374,-0.292326,19.566428,-148.110433,210.859375,
+ -0.893695,-0.340374,-0.292326,18.802521,-148.233339,213.337891,
+ -0.893695,-0.340374,-0.292326,19.398192,-147.774265,210.982282,
+ -0.949217,0.249733,-0.191363,19.398192,-147.774265,210.982282,
+ -0.949217,0.249733,-0.191363,18.802521,-148.233339,213.337891,
+ -0.949217,0.249733,-0.191363,19.06385,-147.300892,213.258488,
+ 0.674751,0.567361,-0.47203,24.260914,-142.003434,212.356159,
+ 0.674751,0.567361,-0.47203,24.241139,-140.742728,213.843208,
+ 0.674751,0.567361,-0.47203,24.97797,-142.321652,212.998681,
+ 0.559574,0.578546,-0.593431,24.241139,-140.742728,213.843208,
+ 0.559574,0.578546,-0.593431,25.616842,-141.628021,214.277336,
+ 0.559574,0.578546,-0.593431,24.97797,-142.321652,212.998681,
+ 0.853886,0.138406,-0.501719,24.97797,-142.321652,212.998681,
+ 0.853886,0.138406,-0.501719,25.616842,-141.628021,214.277336,
+ 0.853886,0.138406,-0.501719,25.708413,-142.678203,214.143477,
+ 0.629709,-0.633218,-0.450003,25.536831,-148.533304,216.874499,
+ 0.629709,-0.633218,-0.450003,22.486982,-149.070869,213.363142,
+ 0.629709,-0.633218,-0.450003,24.477217,-146.979022,213.204641,
+ 0.667449,-0.556772,-0.494486,22.486982,-149.070869,213.363142,
+ 0.667449,-0.556772,-0.494486,25.536831,-148.533304,216.874499,
+ 0.667449,-0.556772,-0.494486,23.501266,-150.835978,216.719649,
+ 0.453167,-0.725242,-0.518328,23.501266,-150.835978,216.719649,
+ 0.453167,-0.725242,-0.518328,21.105499,-149.471836,212.716361,
+ 0.453167,-0.725242,-0.518328,22.486982,-149.070869,213.363142,
+ 0.377614,-0.783774,-0.493058,23.501266,-150.835978,216.719649,
+ 0.377614,-0.783774,-0.493058,21.778139,-150.670784,215.137378,
+ 0.377614,-0.783774,-0.493058,21.105499,-149.471836,212.716361,
+ -0.959258,0.259286,-0.11223,19.06385,-147.300892,213.258488,
+ -0.959258,0.259286,-0.11223,18.802521,-148.233339,213.337891,
+ -0.959258,0.259286,-0.11223,18.525981,-148.205351,215.76621,
+ -0.93998,-0.2025,-0.274647,19.06385,-147.300892,213.258488,
+ -0.93998,-0.2025,-0.274647,18.525981,-148.205351,215.76621,
+ -0.93998,-0.2025,-0.274647,18.233013,-146.745986,215.692891,
+ 0.565705,0.813787,-0.133145,25.616842,-141.628021,214.277336,
+ 0.565705,0.813787,-0.133145,24.241139,-140.742728,213.843208,
+ 0.565705,0.813787,-0.133145,24.46809,-140.505433,216.257836,
+ 0.749566,0.659095,0.061183,25.616842,-141.628021,214.277336,
+ 0.749566,0.659095,0.061183,24.46809,-140.505433,216.257836,
+ 0.749566,0.659095,0.061183,26.304084,-142.603668,216.367965,
+ 0.958373,0.116776,-0.260545,25.708413,-142.678203,214.143477,
+ 0.958373,0.116776,-0.260545,25.616842,-141.628021,214.277336,
+ 0.958373,0.116776,-0.260545,26.304084,-142.603668,216.367965,
+ 0.963608,0.061701,-0.260101,25.708413,-142.678203,214.143477,
+ 0.963608,0.061701,-0.260101,26.304084,-142.603668,216.367965,
+ 0.963608,0.061701,-0.260101,26.548985,-144.316147,216.869023,
+ 0.693101,-0.584315,-0.422122,23.501266,-150.835978,216.719649,
+ 0.693101,-0.584315,-0.422122,25.536831,-148.533304,216.874499,
+ 0.693101,-0.584315,-0.422122,26.34698,-149.665932,219.77254,
+ 0.673895,-0.629398,-0.386941,23.501266,-150.835978,216.719649,
+ 0.673895,-0.629398,-0.386941,26.34698,-149.665932,219.77254,
+ 0.673895,-0.629398,-0.386941,24.0799,-151.427086,218.688893,
+ 0.224799,-0.91311,-0.340142,24.0799,-151.427086,218.688893,
+ 0.224799,-0.91311,-0.340142,21.778139,-150.670784,215.137378,
+ 0.224799,-0.91311,-0.340142,23.501266,-150.835978,216.719649,
+ -0.109049,-0.98428,-0.138929,24.0799,-151.427086,218.688893,
+ -0.109049,-0.98428,-0.138929,22.451996,-151.132293,217.878135,
+ -0.109049,-0.98428,-0.138929,21.778139,-150.670784,215.137378,
+ -0.160826,-0.01827,0.986814,20.752903,-149.512602,225.693049,
+ -0.160826,-0.01827,0.986814,22.971611,-150.738018,226.031955,
+ -0.160826,-0.01827,0.986814,25.056765,-150.097626,226.383638,
+ -0.153418,0.036998,0.987468,25.521315,-148.723445,226.404326,
+ -0.153418,0.036998,0.987468,20.752903,-149.512602,225.693049,
+ -0.153418,0.036998,0.987468,25.056765,-150.097626,226.383638,
+ -0.126535,-0.050683,0.990667,25.55265,-147.755099,226.457869,
+ -0.126535,-0.050683,0.990667,19.179759,-147.763313,225.643461,
+ -0.126535,-0.050683,0.990667,25.521315,-148.723445,226.404326,
+ -0.132189,-0.090897,0.987048,19.179759,-147.763313,225.643461,
+ -0.132189,-0.090897,0.987048,20.752903,-149.512602,225.693049,
+ -0.132189,-0.090897,0.987048,25.521315,-148.723445,226.404326,
+ -0.117266,-0.047674,0.991956,17.732564,-144.933418,225.669015,
+ -0.117266,-0.047674,0.991956,18.039526,-145.948006,225.656542,
+ -0.117266,-0.047674,0.991956,25.55265,-147.755099,226.457869,
+ -0.126455,-0.073907,0.989215,18.061735,-143.513603,225.817173,
+ -0.126455,-0.073907,0.989215,17.732564,-144.933418,225.669015,
+ -0.126455,-0.073907,0.989215,25.55265,-147.755099,226.457869,
+ -0.120316,-0.062834,0.990745,18.061735,-143.513603,225.817173,
+ -0.120316,-0.062834,0.990745,25.55265,-147.755099,226.457869,
+ -0.120316,-0.062834,0.990745,24.320237,-145.644694,226.442049,
+ -0.195794,-0.301372,0.933188,18.609643,-142.794721,226.164293,
+ -0.195794,-0.301372,0.933188,18.061735,-143.513603,225.817173,
+ -0.195794,-0.301372,0.933188,24.320237,-145.644694,226.442049,
+ -0.084006,-0.071462,0.993899,18.609643,-142.794721,226.164293,
+ -0.084006,-0.071462,0.993899,24.320237,-145.644694,226.442049,
+ -0.084006,-0.071462,0.993899,21.266738,-143.163745,226.362343,
+ -0.133755,-0.10562,0.98537,25.056765,-150.097626,226.383638,
+ -0.133755,-0.10562,0.98537,22.971611,-150.738018,226.031955,
+ -0.133755,-0.10562,0.98537,23.99776,-150.964665,226.146952,
+ -0.038196,0.244915,0.968792,19.38511,-142.605189,226.146952,
+ -0.038196,0.244915,0.968792,18.609643,-142.794721,226.164293,
+ -0.038196,0.244915,0.968792,21.266738,-143.163745,226.362343,
+ -0.178871,-0.234059,0.955626,19.994168,-142.531567,226.278985,
+ -0.178871,-0.234059,0.955626,19.38511,-142.605189,226.146952,
+ -0.178871,-0.234059,0.955626,21.266738,-143.163745,226.362343,
+ 0.14333,0.64645,-0.749372,24.260914,-142.003434,212.356159,
+ 0.14333,0.64645,-0.749372,23.515564,-143.586313,210.848119,
+ 0.14333,0.64645,-0.749372,23.670414,-142.249855,212.030639,
+ 0.301879,0.611886,-0.731071,23.670414,-142.249855,212.030639,
+ 0.301879,0.611886,-0.731071,23.515564,-143.586313,210.848119,
+ 0.301879,0.611886,-0.731071,22.936929,-143.247407,210.89284,
+ 0.277545,0.57539,-0.769347,22.936929,-143.247407,210.89284,
+ 0.277545,0.57539,-0.769347,23.515564,-143.586313,210.848119,
+ 0.277545,0.57539,-0.769347,22.405145,-143.87563,210.231152,
+ 0.39339,0.324507,-0.860197,23.515564,-143.586313,210.848119,
+ 0.39339,0.324507,-0.860197,21.73859,-144.755447,209.594411,
+ 0.39339,0.324507,-0.860197,22.405145,-143.87563,210.231152,
+ 0.295895,0.452414,-0.841289,23.515564,-143.586313,210.848119,
+ 0.295895,0.452414,-0.841289,22.260335,-145.24038,209.517138,
+ 0.295895,0.452414,-0.841289,21.73859,-144.755447,209.594411,
+ -0.050896,0.103524,-0.993324,21.73859,-144.755447,209.594411,
+ -0.050896,0.103524,-0.993324,22.260335,-145.24038,209.517138,
+ -0.050896,0.103524,-0.993324,21.158738,-145.790722,209.516225,
+ 0.166226,-0.331187,-0.928808,22.260335,-145.24038,209.517138,
+ 0.166226,-0.331187,-0.928808,20.878548,-146.909963,209.86517,
+ 0.166226,-0.331187,-0.928808,21.158738,-145.790722,209.516225,
+ -0.248974,-0.230916,-0.940579,21.158738,-145.790722,209.516225,
+ -0.248974,-0.230916,-0.940579,20.878548,-146.909963,209.86517,
+ -0.248974,-0.230916,-0.940579,20.183091,-147.120487,210.100944,
+ -0.186429,-0.392719,-0.900564,20.878548,-146.909963,209.86517,
+ -0.186429,-0.392719,-0.900564,20.025198,-148.005475,210.519557,
+ -0.186429,-0.392719,-0.900564,20.183091,-147.120487,210.100944,
+ -0.594669,-0.003666,-0.803962,19.398192,-147.774265,210.982282,
+ -0.594669,-0.003666,-0.803962,20.025198,-148.005475,210.519557,
+ -0.594669,-0.003666,-0.803962,19.566428,-148.110433,210.859375,
+ -0.631899,-0.236402,-0.738118,20.183091,-147.120487,210.100944,
+ -0.631899,-0.236402,-0.738118,20.025198,-148.005475,210.519557,
+ -0.631899,-0.236402,-0.738118,19.398192,-147.774265,210.982282,
+ -0.661949,0.731681,-0.162683,22.936929,-143.247407,210.89284,
+ -0.661949,0.731681,-0.162683,22.405145,-143.87563,210.231152,
+ -0.661949,0.731681,-0.162683,22.646699,-143.337761,211.667395,
+ -0.687129,0.70509,-0.17522,23.670414,-142.249855,212.030639,
+ -0.687129,0.70509,-0.17522,22.936929,-143.247407,210.89284,
+ -0.687129,0.70509,-0.17522,22.646699,-143.337761,211.667395,
+ -0.690505,0.686983,-0.226401,21.73859,-144.755447,209.594411,
+ -0.690505,0.686983,-0.226401,21.707255,-144.207843,211.35161,
+ -0.690505,0.686983,-0.226401,22.405145,-143.87563,210.231152,
+ -0.636988,0.750956,-0.174099,22.646699,-143.337761,211.667395,
+ -0.636988,0.750956,-0.174099,22.405145,-143.87563,210.231152,
+ -0.636988,0.750956,-0.174099,21.707255,-144.207843,211.35161,
+ -0.857122,0.491671,-0.153628,21.158738,-145.790722,209.516225,
+ -0.857122,0.491671,-0.153628,20.696317,-146.079735,211.171205,
+ -0.857122,0.491671,-0.153628,21.73859,-144.755447,209.594411,
+ -0.861043,0.480941,-0.165232,21.73859,-144.755447,209.594411,
+ -0.861043,0.480941,-0.165232,20.696317,-146.079735,211.171205,
+ -0.861043,0.480941,-0.165232,21.707255,-144.207843,211.35161,
+ -0.810596,0.411541,-0.416616,21.158738,-145.790722,209.516225,
+ -0.810596,0.411541,-0.416616,20.183091,-147.120487,210.100944,
+ -0.810596,0.411541,-0.416616,19.398192,-147.774265,210.982282,
+ -0.782799,0.612145,-0.111823,21.158738,-145.790722,209.516225,
+ -0.782799,0.612145,-0.111823,19.398192,-147.774265,210.982282,
+ -0.782799,0.612145,-0.111823,20.696317,-146.079735,211.171205,
+ 0.047666,-0.507346,-0.860423,19.566428,-148.110433,210.859375,
+ 0.047666,-0.507346,-0.860423,20.526256,-148.63887,211.22414,
+ 0.047666,-0.507346,-0.860423,19.711239,-148.550341,211.126789,
+ -0.228814,-0.799232,-0.555762,20.526256,-148.63887,211.22414,
+ -0.228814,-0.799232,-0.555762,19.566428,-148.110433,210.859375,
+ -0.228814,-0.799232,-0.555762,20.025198,-148.005475,210.519557,
+ 0.33202,-0.660744,-0.673186,20.878548,-146.909963,209.86517,
+ 0.33202,-0.660744,-0.673186,21.125882,-147.880743,210.939995,
+ 0.33202,-0.660744,-0.673186,20.025198,-148.005475,210.519557,
+ 0.350422,-0.558855,-0.751589,21.125882,-147.880743,210.939995,
+ 0.350422,-0.558855,-0.751589,20.526256,-148.63887,211.22414,
+ 0.350422,-0.558855,-0.751589,20.025198,-148.005475,210.519557,
+ 0.488475,-0.546134,-0.680536,22.260335,-145.24038,209.517138,
+ 0.488475,-0.546134,-0.680536,23.347024,-146.125977,211.007837,
+ 0.488475,-0.546134,-0.680536,20.878548,-146.909963,209.86517,
+ 0.485876,-0.590082,-0.644769,23.347024,-146.125977,211.007837,
+ 0.485876,-0.590082,-0.644769,21.125882,-147.880743,210.939995,
+ 0.485876,-0.590082,-0.644769,20.878548,-146.909963,209.86517,
+ 0.790828,-0.116681,-0.600814,22.260335,-145.24038,209.517138,
+ 0.790828,-0.116681,-0.600814,23.515564,-143.586313,210.848119,
+ 0.790828,-0.116681,-0.600814,24.263956,-144.258344,211.96371,
+ 0.785494,-0.070993,-0.614784,22.260335,-145.24038,209.517138,
+ 0.785494,-0.070993,-0.614784,24.263956,-144.258344,211.96371,
+ 0.785494,-0.070993,-0.614784,23.347024,-146.125977,211.007837,
+ 0.706705,0.284419,-0.647823,23.515564,-143.586313,210.848119,
+ 0.706705,0.284419,-0.647823,24.260914,-142.003434,212.356159,
+ 0.706705,0.284419,-0.647823,24.97797,-142.321652,212.998681,
+ 0.828645,-0.006378,-0.559737,23.515564,-143.586313,210.848119,
+ 0.828645,-0.006378,-0.559737,24.97797,-142.321652,212.998681,
+ 0.828645,-0.006378,-0.559737,24.263956,-144.258344,211.96371,
+ -0.004475,0.801191,-0.598392,24.260914,-142.003434,212.356159,
+ -0.004475,0.801191,-0.598392,23.670414,-142.249855,212.030639,
+ -0.004475,0.801191,-0.598392,23.926267,-140.705613,214.096322,
+ -0.397309,0.69737,-0.596507,24.260914,-142.003434,212.356159,
+ -0.397309,0.69737,-0.596507,23.926267,-140.705613,214.096322,
+ -0.397309,0.69737,-0.596507,24.241139,-140.742728,213.843208,
+ -0.657193,0.640454,-0.397385,23.670414,-142.249855,212.030639,
+ -0.657193,0.640454,-0.397385,23.697186,-140.932564,214.109404,
+ -0.657193,0.640454,-0.397385,23.926267,-140.705613,214.096322,
+ -0.439218,0.57509,0.690188,27.417545,-128.322161,227.362632,
+ -0.439218,0.57509,0.690188,28.18845,-129.612985,228.928779,
+ -0.439218,0.57509,0.690188,28.471987,-129.4052,228.93608,
+ 0.9402,0.224261,0.25638,32.822699,-130.157243,225.487089,
+ 0.9402,0.224261,0.25638,32.350847,-130.676554,227.671724,
+ 0.9402,0.224261,0.25638,32.628299,-131.501001,227.37541,
+ 0.996466,-0.055271,0.063253,32.776153,-131.325768,225.199293,
+ 0.996466,-0.055271,0.063253,32.822699,-130.157243,225.487089,
+ 0.996466,-0.055271,0.063253,32.628299,-131.501001,227.37541,
+ 0.92507,-0.318202,0.207348,32.550722,-132.07629,225.053265,
+ 0.92507,-0.318202,0.207348,32.776153,-131.325768,225.199293,
+ 0.92507,-0.318202,0.207348,31.974521,-132.31754,227.25372,
+ 0.780416,-0.625255,0.002675,32.776153,-131.325768,225.199293,
+ 0.780416,-0.625255,0.002675,32.628299,-131.501001,227.37541,
+ 0.780416,-0.625255,0.002675,31.974521,-132.31754,227.25372,
+ 0.684436,-0.72579,0.069111,32.550722,-132.07629,225.053265,
+ 0.684436,-0.72579,0.069111,31.474377,-132.89009,227.166408,
+ 0.684436,-0.72579,0.069111,31.726579,-132.819814,225.406774,
+ 0.738436,-0.663447,0.120625,32.550722,-132.07629,225.053265,
+ 0.738436,-0.663447,0.120625,31.974521,-132.31754,227.25372,
+ 0.738436,-0.663447,0.120625,31.474377,-132.89009,227.166408,
+ 0.191388,-0.979382,-0.064658,31.726579,-132.819814,225.406774,
+ 0.191388,-0.979382,-0.064658,30.753061,-133.127993,227.193179,
+ 0.191388,-0.979382,-0.064658,30.53189,-133.061672,225.53394,
+ 0.313449,-0.949579,0.007001,31.726579,-132.819814,225.406774,
+ 0.313449,-0.949579,0.007001,31.474377,-132.89009,227.166408,
+ 0.313449,-0.949579,0.007001,30.753061,-133.127993,227.193179,
+ -0.206094,-0.976258,0.06667,30.53189,-133.061672,225.53394,
+ -0.206094,-0.976258,0.06667,29.727216,-132.751668,227.585933,
+ -0.206094,-0.976258,0.06667,29.019591,-132.711814,225.982062,
+ -0.341696,-0.939777,0.007983,30.753061,-133.127993,227.193179,
+ -0.341696,-0.939777,0.007983,29.727216,-132.751668,227.585933,
+ -0.341696,-0.939777,0.007983,30.53189,-133.061672,225.53394,
+ -0.404731,-0.914415,0.006061,29.019591,-132.711814,225.982062,
+ -0.404731,-0.914415,0.006061,28.390455,-132.421584,227.757211,
+ -0.404731,-0.914415,0.006061,27.595821,-132.07994,226.237915,
+ -0.229674,-0.970199,0.077224,29.727216,-132.751668,227.585933,
+ -0.229674,-0.970199,0.077224,28.390455,-132.421584,227.757211,
+ -0.229674,-0.970199,0.077224,29.019591,-132.711814,225.982062,
+ -0.644328,-0.732637,0.219281,27.792654,-131.653722,228.240319,
+ -0.644328,-0.732637,0.219281,26.584275,-131.083606,226.594466,
+ -0.644328,-0.732637,0.219281,27.595821,-132.07994,226.237915,
+ -0.701097,-0.680285,0.213718,27.595821,-132.07994,226.237915,
+ -0.701097,-0.680285,0.213718,28.390455,-132.421584,227.757211,
+ -0.701097,-0.680285,0.213718,27.792654,-131.653722,228.240319,
+ -0.78435,-0.292903,0.546811,26.584275,-131.083606,226.594466,
+ -0.78435,-0.292903,0.546811,27.742457,-130.471811,228.583484,
+ -0.78435,-0.292903,0.546811,26.282484,-129.966494,226.759964,
+ -0.821628,-0.190849,0.537126,26.584275,-131.083606,226.594466,
+ -0.821628,-0.190849,0.537126,27.792654,-131.653722,228.240319,
+ -0.821628,-0.190849,0.537126,27.742457,-130.471811,228.583484,
+ -0.741753,0.290461,0.604512,26.282484,-129.966494,226.759964,
+ -0.741753,0.290461,0.604512,28.18845,-129.612985,228.928779,
+ -0.741753,0.290461,0.604512,27.417545,-128.322161,227.362632,
+ -0.75511,0.134121,0.641733,26.282484,-129.966494,226.759964,
+ -0.75511,0.134121,0.641733,27.742457,-130.471811,228.583484,
+ -0.75511,0.134121,0.641733,28.18845,-129.612985,228.928779,
+ -0.511544,0.554582,0.656324,28.14312,-127.454514,227.195005,
+ -0.511544,0.554582,0.656324,27.417545,-128.322161,227.362632,
+ -0.511544,0.554582,0.656324,28.775298,-128.831433,228.851202,
+ -0.59614,0.416664,0.6863,27.417545,-128.322161,227.362632,
+ -0.59614,0.416664,0.6863,28.471987,-129.4052,228.93608,
+ -0.59614,0.416664,0.6863,28.775298,-128.831433,228.851202,
+ 0.193026,0.858777,0.474598,29.575713,-127.564339,226.811074,
+ 0.193026,0.858777,0.474598,28.14312,-127.454514,227.195005,
+ 0.193026,0.858777,0.474598,29.537989,-128.615738,228.728904,
+ -0.852432,-0.294307,0.432139,26.085043,-129.905649,226.411931,
+ -0.852432,-0.294307,0.432139,26.584275,-131.083606,226.594466,
+ -0.852432,-0.294307,0.432139,26.282484,-129.966494,226.759964,
+ -0.785339,0.354512,0.507507,26.085043,-129.905649,226.411931,
+ -0.785339,0.354512,0.507507,26.282484,-129.966494,226.759964,
+ -0.785339,0.354512,0.507507,27.104194,-127.939752,226.615762,
+ -0.783819,0.354084,0.510149,27.104194,-127.939752,226.615762,
+ -0.783819,0.354084,0.510149,26.282484,-129.966494,226.759964,
+ -0.783819,0.354084,0.510149,27.417545,-128.322161,227.362632,
+ -0.54215,0.633632,0.55189,28.007132,-127.217523,226.673564,
+ -0.54215,0.633632,0.55189,27.104194,-127.939752,226.615762,
+ -0.54215,0.633632,0.55189,27.417545,-128.322161,227.362632,
+ -0.640402,0.622463,0.449917,28.007132,-127.217523,226.673564,
+ -0.640402,0.622463,0.449917,27.417545,-128.322161,227.362632,
+ -0.640402,0.622463,0.449917,28.14312,-127.454514,227.195005,
+ 0.203377,0.910252,0.360663,29.543769,-127.386672,226.23396,
+ 0.203377,0.910252,0.360663,28.007132,-127.217523,226.673564,
+ 0.203377,0.910252,0.360663,28.14312,-127.454514,227.195005,
+ 0.148591,0.947408,0.283439,29.575713,-127.564339,226.811074,
+ 0.148591,0.947408,0.283439,29.543769,-127.386672,226.23396,
+ 0.148591,0.947408,0.283439,28.14312,-127.454514,227.195005,
+ 0.513151,0.827883,0.226464,30.786525,-128.052619,225.852463,
+ 0.513151,0.827883,0.226464,29.543769,-127.386672,226.23396,
+ 0.513151,0.827883,0.226464,29.575713,-127.564339,226.811074,
+ 0.504537,0.837258,0.210809,30.850413,-128.335852,226.824459,
+ 0.504537,0.837258,0.210809,30.786525,-128.052619,225.852463,
+ 0.504537,0.837258,0.210809,29.575713,-127.564339,226.811074,
+ 0.587797,0.786265,0.190477,32.152797,-128.939737,225.298166,
+ 0.587797,0.786265,0.190477,30.786525,-128.052619,225.852463,
+ 0.587797,0.786265,0.190477,30.850413,-128.335852,226.824459,
+ 0.599893,0.773104,0.206006,32.152797,-128.939737,225.298166,
+ 0.599893,0.773104,0.206006,30.850413,-128.335852,226.824459,
+ 0.599893,0.773104,0.206006,32.115377,-129.162733,226.243999,
+ 0.854376,0.497223,0.15103,32.814485,-129.961018,224.917277,
+ 0.854376,0.497223,0.15103,32.152797,-128.939737,225.298166,
+ 0.854376,0.497223,0.15103,32.115377,-129.162733,226.243999,
+ 0.857242,0.490533,0.156566,32.814485,-129.961018,224.917277,
+ 0.857242,0.490533,0.156566,32.115377,-129.162733,226.243999,
+ 0.857242,0.490533,0.156566,32.822699,-130.157243,225.487089,
+ 0.680171,0.165976,-0.714017,28.641136,-126.324016,214.48725,
+ 0.680171,0.165976,-0.714017,30.199677,-127.019169,215.810322,
+ 0.680171,0.165976,-0.714017,28.433046,-127.539088,214.006576,
+ 0.63969,0.292447,-0.710824,30.199677,-127.019169,215.810322,
+ 0.63969,0.292447,-0.710824,30.457963,-128.543941,215.415439,
+ 0.63969,0.292447,-0.710824,28.433046,-127.539088,214.006576,
+ 0.236757,0.539559,0.807974,28.390455,-132.421584,227.757211,
+ 0.236757,0.539559,0.807974,29.727216,-132.751668,227.585933,
+ 0.236757,0.539559,0.807974,31.474377,-132.89009,227.166408,
+ 0.14164,-0.269007,0.952666,31.974521,-132.31754,227.25372,
+ 0.14164,-0.269007,0.952666,28.390455,-132.421584,227.757211,
+ 0.14164,-0.269007,0.952666,31.474377,-132.89009,227.166408,
+ 0.137079,-0.448849,0.883031,27.792654,-131.653722,228.240319,
+ 0.137079,-0.448849,0.883031,28.390455,-132.421584,227.757211,
+ 0.137079,-0.448849,0.883031,31.974521,-132.31754,227.25372,
+ 0.177531,-0.282629,0.942658,32.628299,-131.501001,227.37541,
+ 0.177531,-0.282629,0.942658,27.792654,-131.653722,228.240319,
+ 0.177531,-0.282629,0.942658,31.974521,-132.31754,227.25372,
+ 0.174277,-0.280588,0.943874,27.742457,-130.471811,228.583484,
+ 0.174277,-0.280588,0.943874,32.628299,-131.501001,227.37541,
+ 0.174277,-0.280588,0.943874,32.350847,-130.676554,227.671724,
+ 0.177832,-0.267415,0.94703,27.742457,-130.471811,228.583484,
+ 0.177832,-0.267415,0.94703,27.792654,-131.653722,228.240319,
+ 0.177832,-0.267415,0.94703,32.628299,-131.501001,227.37541,
+ 0.230951,-0.217118,0.948431,28.18845,-129.612985,228.928779,
+ 0.230951,-0.217118,0.948431,32.350847,-130.676554,227.671724,
+ 0.230951,-0.217118,0.948431,31.562906,-129.739238,228.078168,
+ 0.155839,-0.437076,0.885821,28.18845,-129.612985,228.928779,
+ 0.155839,-0.437076,0.885821,27.742457,-130.471811,228.583484,
+ 0.155839,-0.437076,0.885821,32.350847,-130.676554,227.671724,
+ 0.131637,0.076619,0.988333,28.775298,-128.831433,228.851202,
+ 0.131637,0.076619,0.988333,28.471987,-129.4052,228.93608,
+ 0.131637,0.076619,0.988333,30.606729,-128.88954,228.611777,
+ 0.131965,0.092936,0.986888,29.537989,-128.615738,228.728904,
+ 0.131965,0.092936,0.986888,28.775298,-128.831433,228.851202,
+ 0.131965,0.092936,0.986888,30.606729,-128.88954,228.611777,
+ 0.177026,-0.437528,0.881607,29.727216,-132.751668,227.585933,
+ 0.177026,-0.437528,0.881607,30.753061,-133.127993,227.193179,
+ 0.177026,-0.437528,0.881607,31.474377,-132.89009,227.166408,
+ 0.218979,-0.331064,0.917848,28.471987,-129.4052,228.93608,
+ 0.218979,-0.331064,0.917848,28.18845,-129.612985,228.928779,
+ 0.218979,-0.331064,0.917848,31.562906,-129.739238,228.078168,
+ 0.219193,-0.329963,0.918193,30.606729,-128.88954,228.611777,
+ 0.219193,-0.329963,0.918193,28.471987,-129.4052,228.93608,
+ 0.219193,-0.329963,0.918193,31.562906,-129.739238,228.078168,
+ 0.735512,0.206446,-0.645293,29.840388,-125.479489,216.113634,
+ 0.735512,0.206446,-0.645293,31.660866,-127.159416,217.651183,
+ 0.735512,0.206446,-0.645293,31.841575,-128.761766,217.344525,
+ 0.799459,0.290174,-0.525989,30.199677,-127.019169,215.810322,
+ 0.799459,0.290174,-0.525989,29.840388,-125.479489,216.113634,
+ 0.799459,0.290174,-0.525989,31.841575,-128.761766,217.344525,
+ 0.795779,0.274585,-0.539757,30.457963,-128.543941,215.415439,
+ 0.795779,0.274585,-0.539757,30.199677,-127.019169,215.810322,
+ 0.795779,0.274585,-0.539757,31.841575,-128.761766,217.344525,
+ 0.797295,0.266008,-0.541813,30.457963,-128.543941,215.415439,
+ 0.797295,0.266008,-0.541813,31.841575,-128.761766,217.344525,
+ 0.797295,0.266008,-0.541813,31.740877,-129.403679,216.881192,
+ 0.764979,0.046316,-0.642388,30.085288,-129.165167,214.926855,
+ 0.764979,0.046316,-0.642388,30.457963,-128.543941,215.415439,
+ 0.764979,0.046316,-0.642388,31.740877,-129.403679,216.881192,
+ 0.764862,0.041867,-0.642832,30.085288,-129.165167,214.926855,
+ 0.764862,0.041867,-0.642832,31.740877,-129.403679,216.881192,
+ 0.764862,0.041867,-0.642832,31.478636,-130.320915,216.50943,
+ 0.498919,-0.429354,-0.752818,30.085288,-129.165167,214.926855,
+ 0.498919,-0.429354,-0.752818,31.478636,-130.320915,216.50943,
+ 0.498919,-0.429354,-0.752818,28.230128,-131.950341,215.285839,
+ 0.517959,-0.526177,-0.67443,31.478636,-130.320915,216.50943,
+ 0.517959,-0.526177,-0.67443,29.39835,-132.528975,216.634466,
+ 0.517959,-0.526177,-0.67443,28.230128,-131.950341,215.285839,
+ -0.237517,-0.950164,-0.201928,29.39835,-132.528975,216.634466,
+ -0.237517,-0.950164,-0.201928,26.26636,-131.500697,215.479934,
+ -0.237517,-0.950164,-0.201928,28.230128,-131.950341,215.285839,
+ -0.204496,-0.937815,-0.280507,29.39835,-132.528975,216.634466,
+ -0.204496,-0.937815,-0.280507,27.443404,-132.354655,217.476863,
+ -0.204496,-0.937815,-0.280507,26.26636,-131.500697,215.479934,
+ -0.470455,-0.876995,-0.097735,27.443404,-132.354655,217.476863,
+ -0.470455,-0.876995,-0.097735,24.255742,-130.569771,216.804831,
+ -0.470455,-0.876995,-0.097735,26.26636,-131.500697,215.479934,
+ -0.439036,-0.869415,-0.226638,27.443404,-132.354655,217.476863,
+ -0.439036,-0.869415,-0.226638,25.267288,-131.427379,218.135204,
+ -0.439036,-0.869415,-0.226638,24.255742,-130.569771,216.804831,
+ 0.283687,0.82146,0.494698,27.086549,-123.0965,216.776234,
+ 0.283687,0.82146,0.494698,24.820382,-123.327407,218.459203,
+ 0.283687,0.82146,0.494698,24.900697,-124.464293,220.300977,
+ -0.191404,0.94923,0.249655,27.3567,-123.908171,220.069463,
+ -0.191404,0.94923,0.249655,27.086549,-123.0965,216.776234,
+ -0.191404,0.94923,0.249655,24.900697,-124.464293,220.300977,
+ 0.741903,0.662633,0.102457,27.740327,-123.729895,216.13858,
+ 0.741903,0.662633,0.102457,27.086549,-123.0965,216.776234,
+ 0.741903,0.662633,0.102457,27.3567,-123.908171,220.069463,
+ 0.238916,0.968709,0.06725,29.03541,-124.274761,219.386175,
+ 0.238916,0.968709,0.06725,27.740327,-123.729895,216.13858,
+ 0.238916,0.968709,0.06725,27.3567,-123.908171,220.069463,
+ 0.193491,0.977255,0.086798,29.126678,-124.061804,216.785057,
+ 0.193491,0.977255,0.086798,27.740327,-123.729895,216.13858,
+ 0.193491,0.977255,0.086798,29.03541,-124.274761,219.386175,
+ 0.435639,0.895748,0.088622,30.755799,-125.019806,218.459812,
+ 0.435639,0.895748,0.088622,29.126678,-124.061804,216.785057,
+ 0.435639,0.895748,0.088622,29.03541,-124.274761,219.386175,
+ 0.686353,0.669151,-0.28488,29.847993,-124.942838,216.453452,
+ 0.686353,0.669151,-0.28488,29.126678,-124.061804,216.785057,
+ 0.686353,0.669151,-0.28488,30.755799,-125.019806,218.459812,
+ 0.647378,0.714428,-0.265508,31.316484,-125.759984,217.835239,
+ 0.647378,0.714428,-0.265508,29.847993,-124.942838,216.453452,
+ 0.647378,0.714428,-0.265508,30.755799,-125.019806,218.459812,
+ 0.737803,0.353628,-0.574973,29.840388,-125.479489,216.113634,
+ 0.737803,0.353628,-0.574973,29.847993,-124.942838,216.453452,
+ 0.737803,0.353628,-0.574973,31.316484,-125.759984,217.835239,
+ 0.752992,0.264545,-0.602511,29.840388,-125.479489,216.113634,
+ 0.752992,0.264545,-0.602511,31.316484,-125.759984,217.835239,
+ 0.752992,0.264545,-0.602511,31.660866,-127.159416,217.651183,
+ 0.926198,0.221171,-0.305353,31.660866,-127.159416,217.651183,
+ 0.926198,0.221171,-0.305353,32.413821,-128.083954,219.265398,
+ 0.926198,0.221171,-0.305353,32.546767,-129.208975,218.853782,
+ 0.910914,0.174302,-0.373972,31.841575,-128.761766,217.344525,
+ 0.910914,0.174302,-0.373972,31.660866,-127.159416,217.651183,
+ 0.910914,0.174302,-0.373972,32.546767,-129.208975,218.853782,
+ 0.912418,0.135588,-0.386146,31.740877,-129.403679,216.881192,
+ 0.912418,0.135588,-0.386146,31.841575,-128.761766,217.344525,
+ 0.912418,0.135588,-0.386146,32.546767,-129.208975,218.853782,
+ 0.921394,0.066147,-0.382959,31.740877,-129.403679,216.881192,
+ 0.921394,0.066147,-0.382959,32.546767,-129.208975,218.853782,
+ 0.921394,0.066147,-0.382959,32.415342,-130.277411,218.353029,
+ 0.889904,-0.071856,-0.450452,31.478636,-130.320915,216.50943,
+ 0.889904,-0.071856,-0.450452,31.740877,-129.403679,216.881192,
+ 0.889904,-0.071856,-0.450452,32.415342,-130.277411,218.353029,
+ 0.869739,-0.230325,-0.436467,31.478636,-130.320915,216.50943,
+ 0.869739,-0.230325,-0.436467,32.415342,-130.277411,218.353029,
+ 0.869739,-0.230325,-0.436467,32.152493,-131.498263,218.473502,
+ 0.589887,-0.587143,-0.554344,31.478636,-130.320915,216.50943,
+ 0.589887,-0.587143,-0.554344,32.152493,-131.498263,218.473502,
+ 0.589887,-0.587143,-0.554344,29.39835,-132.528975,216.634466,
+ 0.581224,-0.626486,-0.51932,32.152493,-131.498263,218.473502,
+ 0.581224,-0.626486,-0.51932,30.886311,-132.872445,218.714143,
+ 0.581224,-0.626486,-0.51932,29.39835,-132.528975,216.634466,
+ -0.121284,-0.989652,-0.07667,30.886311,-132.872445,218.714143,
+ -0.121284,-0.989652,-0.07667,27.443404,-132.354655,217.476863,
+ -0.121284,-0.989652,-0.07667,29.39835,-132.528975,216.634466,
+ -0.102973,-0.986626,-0.126357,30.886311,-132.872445,218.714143,
+ -0.102973,-0.986626,-0.126357,28.54348,-132.694473,219.233758,
+ -0.102973,-0.986626,-0.126357,27.443404,-132.354655,217.476863,
+ 0.10859,0.561863,-0.820072,27.740327,-123.729895,216.13858,
+ 0.10859,0.561863,-0.820072,27.767099,-124.909981,215.333603,
+ 0.10859,0.561863,-0.820072,27.290684,-124.256203,215.718446,
+ -0.084734,0.560176,-0.824029,27.740327,-123.729895,216.13858,
+ -0.084734,0.560176,-0.824029,28.273328,-124.521487,215.545647,
+ -0.084734,0.560176,-0.824029,27.767099,-124.909981,215.333603,
+ 0.122059,0.566415,-0.815031,27.767099,-124.909981,215.333603,
+ 0.122059,0.566415,-0.815031,28.684944,-125.657156,214.951801,
+ 0.122059,0.566415,-0.815031,27.997701,-126.309718,214.395375,
+ 0.129215,0.561081,-0.817614,28.684944,-125.657156,214.951801,
+ 0.129215,0.561081,-0.817614,28.641136,-126.324016,214.48725,
+ 0.129215,0.561081,-0.817614,27.997701,-126.309718,214.395375,
+ 0.026036,0.48005,-0.876855,27.767099,-124.909981,215.333603,
+ 0.026036,0.48005,-0.876855,28.568122,-125.170702,215.214651,
+ 0.026036,0.48005,-0.876855,28.684944,-125.657156,214.951801,
+ 0.018165,0.460673,-0.887384,28.273328,-124.521487,215.545647,
+ 0.018165,0.460673,-0.887384,28.568122,-125.170702,215.214651,
+ 0.018165,0.460673,-0.887384,27.767099,-124.909981,215.333603,
+ 0.139535,0.365382,-0.92034,27.997701,-126.309718,214.395375,
+ 0.139535,0.365382,-0.92034,28.641136,-126.324016,214.48725,
+ 0.139535,0.365382,-0.92034,27.817904,-127.26559,213.988627,
+ 0.176314,0.335836,-0.925271,28.641136,-126.324016,214.48725,
+ 0.176314,0.335836,-0.925271,28.433046,-127.539088,214.006576,
+ 0.176314,0.335836,-0.925271,27.817904,-127.26559,213.988627,
+ -0.25221,0.898983,-0.358077,26.716612,-123.724115,216.127628,
+ -0.25221,0.898983,-0.358077,24.779312,-123.832723,217.219489,
+ -0.25221,0.898983,-0.358077,24.820382,-123.327407,218.459203,
+ -0.436896,0.758012,-0.484293,27.086549,-123.0965,216.776234,
+ -0.436896,0.758012,-0.484293,26.716612,-123.724115,216.127628,
+ -0.436896,0.758012,-0.484293,24.820382,-123.327407,218.459203,
+ 0.114726,0.680395,-0.72381,27.086549,-123.0965,216.776234,
+ 0.114726,0.680395,-0.72381,27.290684,-124.256203,215.718446,
+ 0.114726,0.680395,-0.72381,26.716612,-123.724115,216.127628,
+ -0.082155,0.663687,-0.743486,27.086549,-123.0965,216.776234,
+ -0.082155,0.663687,-0.743486,27.740327,-123.729895,216.13858,
+ -0.082155,0.663687,-0.743486,27.290684,-124.256203,215.718446,
+ -0.622466,-0.545033,-0.561672,26.575757,-131.006941,214.65792,
+ -0.622466,-0.545033,-0.561672,26.26636,-131.500697,215.479934,
+ -0.622466,-0.545033,-0.561672,24.255742,-130.569771,216.804831,
+ 0.032821,-0.971836,0.23336,26.575757,-131.006941,214.65792,
+ 0.032821,-0.971836,0.23336,24.255742,-130.569771,216.804831,
+ 0.032821,-0.971836,0.23336,24.984968,-130.802502,215.733049,
+ -0.233553,-0.756129,-0.611328,28.230128,-131.950341,215.285839,
+ -0.233553,-0.756129,-0.611328,26.26636,-131.500697,215.479934,
+ -0.233553,-0.756129,-0.611328,27.537714,-131.140496,214.548704,
+ -0.175886,-0.813252,-0.554694,27.537714,-131.140496,214.548704,
+ -0.175886,-0.813252,-0.554694,26.26636,-131.500697,215.479934,
+ -0.175886,-0.813252,-0.554694,26.575757,-131.006941,214.65792,
+ 0.365299,-0.302596,-0.880336,28.494499,-128.534814,214.05008,
+ 0.365299,-0.302596,-0.880336,30.085288,-129.165167,214.926855,
+ 0.365299,-0.302596,-0.880336,27.537714,-131.140496,214.548704,
+ 0.421416,-0.386442,-0.820409,30.085288,-129.165167,214.926855,
+ 0.421416,-0.386442,-0.820409,28.230128,-131.950341,215.285839,
+ 0.421416,-0.386442,-0.820409,27.537714,-131.140496,214.548704,
+ -0.480173,0.739901,0.471148,24.820382,-123.327407,218.459203,
+ -0.480173,0.739901,0.471148,23.009335,-124.614884,218.635349,
+ -0.480173,0.739901,0.471148,23.48788,-125.301214,220.200887,
+ -0.472547,0.740578,0.477749,24.900697,-124.464293,220.300977,
+ -0.472547,0.740578,0.477749,24.820382,-123.327407,218.459203,
+ -0.472547,0.740578,0.477749,23.48788,-125.301214,220.200887,
+ -0.752701,0.439558,0.490133,23.009335,-124.614884,218.635349,
+ -0.752701,0.439558,0.490133,22.124651,-126.463959,218.93501,
+ -0.752701,0.439558,0.490133,22.539308,-127.310616,220.331095,
+ -0.80722,0.40866,0.425902,23.009335,-124.614884,218.635349,
+ -0.80722,0.40866,0.425902,22.539308,-127.310616,220.331095,
+ -0.80722,0.40866,0.425902,23.48788,-125.301214,220.200887,
+ -0.451989,0.696333,0.557519,24.900697,-124.464293,220.300977,
+ -0.451989,0.696333,0.557519,23.48788,-125.301214,220.200887,
+ -0.451989,0.696333,0.557519,24.497904,-126.296332,222.262616,
+ -0.66141,0.611071,0.434889,24.900697,-124.464293,220.300977,
+ -0.66141,0.611071,0.434889,24.497904,-126.296332,222.262616,
+ -0.66141,0.611071,0.434889,25.480853,-125.444808,222.56106,
+ -0.716667,0.376361,0.587146,23.48788,-125.301214,220.200887,
+ -0.716667,0.376361,0.587146,22.539308,-127.310616,220.331095,
+ -0.716667,0.376361,0.587146,23.407869,-128.027368,221.850696,
+ -0.762748,0.351064,0.54311,23.48788,-125.301214,220.200887,
+ -0.762748,0.351064,0.54311,23.407869,-128.027368,221.850696,
+ -0.762748,0.351064,0.54311,24.497904,-126.296332,222.262616,
+ -0.628483,0.524022,0.574812,24.497904,-126.296332,222.262616,
+ -0.628483,0.524022,0.574812,25.203401,-127.014301,223.688515,
+ -0.628483,0.524022,0.574812,25.480853,-125.444808,222.56106,
+ -0.708391,0.490098,0.507923,25.480853,-125.444808,222.56106,
+ -0.708391,0.490098,0.507923,25.203401,-127.014301,223.688515,
+ -0.708391,0.490098,0.507923,25.847748,-126.346225,223.942542,
+ -0.763764,0.352223,0.540929,23.407869,-128.027368,221.850696,
+ -0.763764,0.352223,0.540929,24.200069,-128.66198,223.382465,
+ -0.763764,0.352223,0.540929,24.497904,-126.296332,222.262616,
+ -0.753647,0.356335,0.552306,24.497904,-126.296332,222.262616,
+ -0.753647,0.356335,0.552306,24.200069,-128.66198,223.382465,
+ -0.753647,0.356335,0.552306,25.203401,-127.014301,223.688515,
+ -0.659756,0.392702,0.640708,25.203401,-127.014301,223.688515,
+ -0.659756,0.392702,0.640708,25.875736,-127.793724,224.858562,
+ -0.659756,0.392702,0.640708,25.847748,-126.346225,223.942542,
+ -0.679236,0.383039,0.626035,25.847748,-126.346225,223.942542,
+ -0.679236,0.383039,0.626035,25.875736,-127.793724,224.858562,
+ -0.679236,0.383039,0.626035,26.543813,-127.105264,225.162178,
+ -0.716162,0.320983,0.619743,24.200069,-128.66198,223.382465,
+ -0.716162,0.320983,0.619743,25.329045,-129.360175,225.048702,
+ -0.716162,0.320983,0.619743,25.203401,-127.014301,223.688515,
+ -0.104904,0.744668,0.65914,29.537989,-128.615738,228.728904,
+ -0.104904,0.744668,0.65914,28.14312,-127.454514,227.195005,
+ -0.104904,0.744668,0.65914,28.775298,-128.831433,228.851202,
+ 0.488418,0.81249,0.31829,30.850413,-128.335852,226.824459,
+ 0.488418,0.81249,0.31829,29.575713,-127.564339,226.811074,
+ 0.488418,0.81249,0.31829,30.606729,-128.88954,228.611777,
+ 0.267126,0.842784,0.467288,30.606729,-128.88954,228.611777,
+ 0.267126,0.842784,0.467288,29.575713,-127.564339,226.811074,
+ 0.267126,0.842784,0.467288,29.537989,-128.615738,228.728904,
+ 0.622937,0.672802,0.399107,32.115377,-129.162733,226.243999,
+ 0.622937,0.672802,0.399107,30.850413,-128.335852,226.824459,
+ 0.622937,0.672802,0.399107,31.562906,-129.739238,228.078168,
+ 0.721247,0.627749,0.292804,30.850413,-128.335852,226.824459,
+ 0.721247,0.627749,0.292804,30.606729,-128.88954,228.611777,
+ 0.721247,0.627749,0.292804,31.562906,-129.739238,228.078168,
+ 0.870143,0.402932,0.28372,32.822699,-130.157243,225.487089,
+ 0.870143,0.402932,0.28372,32.115377,-129.162733,226.243999,
+ 0.870143,0.402932,0.28372,32.350847,-130.676554,227.671724,
+ 0.781329,0.48822,0.388799,32.115377,-129.162733,226.243999,
+ 0.781329,0.48822,0.388799,31.562906,-129.739238,228.078168,
+ 0.781329,0.48822,0.388799,32.350847,-130.676554,227.671724,
+ -0.721674,-0.683765,0.107942,24.255742,-130.569771,216.804831,
+ -0.721674,-0.683765,0.107942,25.267288,-131.427379,218.135204,
+ -0.721674,-0.683765,0.107942,22.823454,-128.859726,218.061278,
+ -0.716372,-0.685561,-0.129681,22.823454,-128.859726,218.061278,
+ -0.716372,-0.685561,-0.129681,25.267288,-131.427379,218.135204,
+ -0.716372,-0.685561,-0.129681,23.106382,-129.344355,219.06035,
+ -0.938553,-0.328276,0.10655,22.823454,-128.859726,218.061278,
+ -0.938553,-0.328276,0.10655,23.106382,-129.344355,219.06035,
+ -0.938553,-0.328276,0.10655,22.539308,-127.310616,220.331095,
+ -0.946192,-0.309932,0.093075,22.823454,-128.859726,218.061278,
+ -0.946192,-0.309932,0.093075,22.539308,-127.310616,220.331095,
+ -0.946192,-0.309932,0.093075,22.124651,-126.463959,218.93501,
+ -0.695599,0.18464,-0.694298,23.801231,-127.825972,216.421204,
+ -0.695599,0.18464,-0.694298,23.146844,-128.14632,216.991625,
+ -0.695599,0.18464,-0.694298,23.920487,-126.408895,216.678578,
+ -0.570345,0.107231,-0.814376,22.636964,-126.318236,217.589426,
+ -0.570345,0.107231,-0.814376,23.920487,-126.408895,216.678578,
+ -0.570345,0.107231,-0.814376,23.146844,-128.14632,216.991625,
+ -0.276365,0.024325,-0.960745,23.801231,-127.825972,216.421204,
+ -0.276365,0.024325,-0.960745,25.228347,-128.590183,215.991336,
+ -0.276365,0.024325,-0.960745,24.486952,-129.659836,216.177521,
+ -0.615748,-0.126907,-0.777656,23.801231,-127.825972,216.421204,
+ -0.615748,-0.126907,-0.777656,24.486952,-129.659836,216.177521,
+ -0.615748,-0.126907,-0.777656,23.146844,-128.14632,216.991625,
+ -0.919569,-0.135923,-0.36867,23.146844,-128.14632,216.991625,
+ -0.919569,-0.135923,-0.36867,22.823454,-128.859726,218.061278,
+ -0.919569,-0.135923,-0.36867,22.636964,-126.318236,217.589426,
+ -0.920983,-0.135404,-0.365316,22.636964,-126.318236,217.589426,
+ -0.920983,-0.135404,-0.365316,22.823454,-128.859726,218.061278,
+ -0.920983,-0.135404,-0.365316,22.124651,-126.463959,218.93501,
+ -0.705155,-0.272193,-0.654727,24.486952,-129.659836,216.177521,
+ -0.705155,-0.272193,-0.654727,24.255742,-130.569771,216.804831,
+ -0.705155,-0.272193,-0.654727,23.146844,-128.14632,216.991625,
+ -0.815286,-0.336741,-0.471077,24.255742,-130.569771,216.804831,
+ -0.815286,-0.336741,-0.471077,22.823454,-128.859726,218.061278,
+ -0.815286,-0.336741,-0.471077,23.146844,-128.14632,216.991625,
+ -0.400063,0.119118,-0.908714,25.228347,-128.590183,215.991336,
+ -0.400063,0.119118,-0.908714,25.319614,-129.980184,215.768948,
+ -0.400063,0.119118,-0.908714,24.486952,-129.659836,216.177521,
+ -0.467554,0.262787,-0.844,25.228347,-128.590183,215.991336,
+ -0.467554,0.262787,-0.844,26.539858,-128.888019,215.172059,
+ -0.467554,0.262787,-0.844,26.517041,-130.107958,214.804861,
+ -0.619435,0.084204,-0.780519,25.228347,-128.590183,215.991336,
+ -0.619435,0.084204,-0.780519,26.517041,-130.107958,214.804861,
+ -0.619435,0.084204,-0.780519,25.319614,-129.980184,215.768948,
+ -0.679479,0.189812,-0.708717,26.869333,-128.874024,214.859925,
+ -0.679479,0.189812,-0.708717,27.064949,-130.099136,214.344265,
+ -0.679479,0.189812,-0.708717,26.539858,-128.888019,215.172059,
+ -0.627657,0.23512,-0.742135,26.539858,-128.888019,215.172059,
+ -0.627657,0.23512,-0.742135,27.064949,-130.099136,214.344265,
+ -0.627657,0.23512,-0.742135,26.517041,-130.107958,214.804861,
+ -0.36798,0.055464,-0.928178,27.817904,-127.26559,213.988627,
+ -0.36798,0.055464,-0.928178,27.820034,-128.03041,213.94208,
+ -0.36798,0.055464,-0.928178,27.100544,-127.442953,214.262429,
+ -0.553308,-0.24323,-0.796674,27.100544,-127.442953,214.262429,
+ -0.553308,-0.24323,-0.796674,27.820034,-128.03041,213.94208,
+ -0.553308,-0.24323,-0.796674,26.869333,-128.874024,214.859925,
+ -0.752336,0.149887,-0.641502,27.820034,-128.03041,213.94208,
+ -0.752336,0.149887,-0.641502,27.064949,-130.099136,214.344265,
+ -0.752336,0.149887,-0.641502,26.869333,-128.874024,214.859925,
+ -0.426936,0.615115,-0.662842,24.645757,-125.633731,216.93078,
+ -0.426936,0.615115,-0.662842,23.920487,-126.408895,216.678578,
+ -0.426936,0.615115,-0.662842,22.636964,-126.318236,217.589426,
+ -0.316303,0.015548,-0.948531,23.351891,-124.858568,217.374948,
+ -0.316303,0.015548,-0.948531,24.645757,-125.633731,216.93078,
+ -0.316303,0.015548,-0.948531,22.636964,-126.318236,217.589426,
+ -0.346639,-0.041652,-0.937073,23.351891,-124.858568,217.374948,
+ -0.346639,-0.041652,-0.937073,25.27824,-124.929148,216.665497,
+ -0.346639,-0.041652,-0.937073,24.645757,-125.633731,216.93078,
+ -0.318861,0.307837,-0.896417,24.779312,-123.832723,217.219489,
+ -0.318861,0.307837,-0.896417,25.27824,-124.929148,216.665497,
+ -0.318861,0.307837,-0.896417,23.351891,-124.858568,217.374948,
+ -0.575431,0.088904,-0.813004,27.290684,-124.256203,215.718446,
+ -0.575431,0.088904,-0.813004,27.200633,-125.456673,215.650908,
+ -0.575431,0.088904,-0.813004,26.158057,-124.896291,216.450106,
+ -0.550093,0.087985,-0.830455,27.290684,-124.256203,215.718446,
+ -0.550093,0.087985,-0.830455,27.767099,-124.909981,215.333603,
+ -0.550093,0.087985,-0.830455,27.200633,-125.456673,215.650908,
+ -0.713488,0.409166,-0.568786,27.3567,-126.435058,214.751317,
+ -0.713488,0.409166,-0.568786,27.200633,-125.456673,215.650908,
+ -0.713488,0.409166,-0.568786,27.767099,-124.909981,215.333603,
+ -0.501705,0.423087,-0.754513,27.767099,-124.909981,215.333603,
+ -0.501705,0.423087,-0.754513,27.997701,-126.309718,214.395375,
+ -0.501705,0.423087,-0.754513,27.3567,-126.435058,214.751317,
+ -0.496034,0.477759,-0.725049,27.997701,-126.309718,214.395375,
+ -0.496034,0.477759,-0.725049,27.100544,-127.442953,214.262429,
+ -0.496034,0.477759,-0.725049,27.3567,-126.435058,214.751317,
+ -0.412448,0.421284,-0.807717,27.997701,-126.309718,214.395375,
+ -0.412448,0.421284,-0.807717,27.817904,-127.26559,213.988627,
+ -0.412448,0.421284,-0.807717,27.100544,-127.442953,214.262429,
+ -0.235006,0.351035,-0.906392,24.779312,-123.832723,217.219489,
+ -0.235006,0.351035,-0.906392,26.158057,-124.896291,216.450106,
+ -0.235006,0.351035,-0.906392,25.27824,-124.929148,216.665497,
+ -0.490731,-0.005862,-0.871292,26.716612,-123.724115,216.127628,
+ -0.490731,-0.005862,-0.871292,26.158057,-124.896291,216.450106,
+ -0.490731,-0.005862,-0.871292,24.779312,-123.832723,217.219489,
+ -0.556966,0.03714,-0.829705,26.716612,-123.724115,216.127628,
+ -0.556966,0.03714,-0.829705,27.290684,-124.256203,215.718446,
+ -0.556966,0.03714,-0.829705,26.158057,-124.896291,216.450106,
+ -0.372157,0.191103,-0.908284,24.486952,-129.659836,216.177521,
+ -0.372157,0.191103,-0.908284,25.319614,-129.980184,215.768948,
+ -0.372157,0.191103,-0.908284,24.984968,-130.802502,215.733049,
+ -0.832096,-0.15558,-0.532363,24.984968,-130.802502,215.733049,
+ -0.832096,-0.15558,-0.532363,24.255742,-130.569771,216.804831,
+ -0.832096,-0.15558,-0.532363,24.486952,-129.659836,216.177521,
+ -0.619087,0.087135,-0.780474,25.319614,-129.980184,215.768948,
+ -0.619087,0.087135,-0.780474,26.517041,-130.107958,214.804861,
+ -0.619087,0.087135,-0.780474,26.575757,-131.006941,214.65792,
+ -0.520499,0.247495,-0.817207,25.319614,-129.980184,215.768948,
+ -0.520499,0.247495,-0.817207,26.575757,-131.006941,214.65792,
+ -0.520499,0.247495,-0.817207,24.984968,-130.802502,215.733049,
+ -0.584911,-0.403657,-0.70352,27.064949,-130.099136,214.344265,
+ -0.584911,-0.403657,-0.70352,27.537714,-131.140496,214.548704,
+ -0.584911,-0.403657,-0.70352,26.517041,-130.107958,214.804861,
+ -0.090189,0.154914,-0.983803,26.517041,-130.107958,214.804861,
+ -0.090189,0.154914,-0.983803,27.537714,-131.140496,214.548704,
+ -0.090189,0.154914,-0.983803,26.575757,-131.006941,214.65792,
+ 0.056114,0.060807,-0.996571,27.817904,-127.26559,213.988627,
+ 0.056114,0.060807,-0.996571,28.433046,-127.539088,214.006576,
+ 0.056114,0.060807,-0.996571,27.820034,-128.03041,213.94208,
+ 0.13236,-0.03511,-0.99058,28.433046,-127.539088,214.006576,
+ 0.13236,-0.03511,-0.99058,28.494499,-128.534814,214.05008,
+ 0.13236,-0.03511,-0.99058,27.820034,-128.03041,213.94208,
+ 0.011352,-0.194817,-0.980774,27.820034,-128.03041,213.94208,
+ 0.011352,-0.194817,-0.980774,28.494499,-128.534814,214.05008,
+ 0.011352,-0.194817,-0.980774,27.064949,-130.099136,214.344265,
+ 0.005929,-0.190046,-0.981757,28.494499,-128.534814,214.05008,
+ 0.005929,-0.190046,-0.981757,27.537714,-131.140496,214.548704,
+ 0.005929,-0.190046,-0.981757,27.064949,-130.099136,214.344265,
+ -0.875295,0.385882,-0.291467,23.351891,-124.858568,217.374948,
+ -0.875295,0.385882,-0.291467,22.636964,-126.318236,217.589426,
+ -0.875295,0.385882,-0.291467,22.124651,-126.463959,218.93501,
+ -0.876325,0.369112,-0.309534,23.351891,-124.858568,217.374948,
+ -0.876325,0.369112,-0.309534,22.124651,-126.463959,218.93501,
+ -0.876325,0.369112,-0.309534,23.009335,-124.614884,218.635349,
+ -0.577642,0.757772,-0.3035,24.779312,-123.832723,217.219489,
+ -0.577642,0.757772,-0.3035,23.351891,-124.858568,217.374948,
+ -0.577642,0.757772,-0.3035,23.009335,-124.614884,218.635349,
+ -0.572741,0.765557,-0.293072,24.820382,-123.327407,218.459203,
+ -0.572741,0.765557,-0.293072,24.779312,-123.832723,217.219489,
+ -0.572741,0.765557,-0.293072,23.009335,-124.614884,218.635349,
+ -0.623793,0.235621,-0.745228,26.832522,-126.551576,215.194572,
+ -0.623793,0.235621,-0.745228,26.455892,-127.598716,215.178752,
+ -0.623793,0.235621,-0.745228,25.246905,-126.988138,216.383785,
+ -0.388849,0.902057,-0.187319,26.832522,-126.551576,215.194572,
+ -0.388849,0.902057,-0.187319,25.246905,-126.988138,216.383785,
+ -0.388849,0.902057,-0.187319,26.267577,-126.619418,216.04062,
+ -0.376023,0.198525,-0.905093,25.970654,-125.582621,216.39139,
+ -0.376023,0.198525,-0.905093,26.267577,-126.619418,216.04062,
+ -0.376023,0.198525,-0.905093,25.246905,-126.988138,216.383785,
+ -0.885172,0.456298,-0.090896,25.246905,-126.988138,216.383785,
+ -0.885172,0.456298,-0.090896,25.757089,-125.967161,216.540765,
+ -0.885172,0.456298,-0.090896,25.970654,-125.582621,216.39139,
+ 0.053222,0.79451,-0.604915,26.832522,-126.551576,215.194572,
+ 0.053222,0.79451,-0.604915,25.970654,-125.582621,216.39139,
+ 0.053222,0.79451,-0.604915,26.62352,-125.931871,215.990119,
+ -0.828834,-0.048798,-0.557363,26.832522,-126.551576,215.194572,
+ -0.828834,-0.048798,-0.557363,26.267577,-126.619418,216.04062,
+ -0.828834,-0.048798,-0.557363,25.970654,-125.582621,216.39139,
+ -0.498886,0.124932,-0.857616,25.27824,-124.929148,216.665497,
+ -0.498886,0.124932,-0.857616,25.246905,-126.988138,216.383785,
+ -0.498886,0.124932,-0.857616,24.645757,-125.633731,216.93078,
+ 0.034612,0.134959,-0.990246,25.27824,-124.929148,216.665497,
+ 0.034612,0.134959,-0.990246,25.757089,-125.967161,216.540765,
+ 0.034612,0.134959,-0.990246,25.246905,-126.988138,216.383785,
+ -0.238029,0.006902,-0.971234,26.158057,-124.896291,216.450106,
+ -0.238029,0.006902,-0.971234,25.757089,-125.967161,216.540765,
+ -0.238029,0.006902,-0.971234,25.27824,-124.929148,216.665497,
+ -0.827674,0.268171,-0.492991,25.970654,-125.582621,216.39139,
+ -0.827674,0.268171,-0.492991,25.757089,-125.967161,216.540765,
+ -0.827674,0.268171,-0.492991,26.158057,-124.896291,216.450106,
+ -0.692604,0.425239,-0.582642,27.3567,-126.435058,214.751317,
+ -0.692604,0.425239,-0.582642,26.62352,-125.931871,215.990119,
+ -0.692604,0.425239,-0.582642,27.200633,-125.456673,215.650908,
+ -0.610512,0.53903,-0.580277,27.3567,-126.435058,214.751317,
+ -0.610512,0.53903,-0.580277,26.832522,-126.551576,215.194572,
+ -0.610512,0.53903,-0.580277,26.62352,-125.931871,215.990119,
+ -0.436137,0.194256,-0.878663,26.158057,-124.896291,216.450106,
+ -0.436137,0.194256,-0.878663,26.62352,-125.931871,215.990119,
+ -0.436137,0.194256,-0.878663,25.970654,-125.582621,216.39139,
+ -0.567934,0.107211,-0.816061,26.158057,-124.896291,216.450106,
+ -0.567934,0.107211,-0.816061,27.200633,-125.456673,215.650908,
+ -0.567934,0.107211,-0.816061,26.62352,-125.931871,215.990119,
+ -0.630159,0.462635,-0.623593,27.100544,-127.442953,214.262429,
+ -0.630159,0.462635,-0.623593,26.832522,-126.551576,215.194572,
+ -0.630159,0.462635,-0.623593,27.3567,-126.435058,214.751317,
+ -0.804007,0.296964,-0.515155,27.100544,-127.442953,214.262429,
+ -0.804007,0.296964,-0.515155,26.455892,-127.598716,215.178752,
+ -0.804007,0.296964,-0.515155,26.832522,-126.551576,215.194572,
+ -0.812844,-0.049924,-0.580338,27.100544,-127.442953,214.262429,
+ -0.812844,-0.049924,-0.580338,26.539858,-128.888019,215.172059,
+ -0.812844,-0.049924,-0.580338,26.455892,-127.598716,215.178752,
+ -0.670822,-0.190831,-0.716646,27.100544,-127.442953,214.262429,
+ -0.670822,-0.190831,-0.716646,26.869333,-128.874024,214.859925,
+ -0.670822,-0.190831,-0.716646,26.539858,-128.888019,215.172059,
+ -0.716109,-0.04302,-0.696661,26.539858,-128.888019,215.172059,
+ -0.716109,-0.04302,-0.696661,25.246905,-126.988138,216.383785,
+ -0.716109,-0.04302,-0.696661,26.455892,-127.598716,215.178752,
+ -0.482195,0.21371,-0.849597,25.246905,-126.988138,216.383785,
+ -0.482195,0.21371,-0.849597,26.539858,-128.888019,215.172059,
+ -0.482195,0.21371,-0.849597,25.228347,-128.590183,215.991336,
+ -0.053151,0.353575,-0.933895,24.645757,-125.633731,216.93078,
+ -0.053151,0.353575,-0.933895,25.246905,-126.988138,216.383785,
+ -0.053151,0.353575,-0.933895,23.920487,-126.408895,216.678578,
+ -0.188029,0.190809,-0.963451,23.920487,-126.408895,216.678578,
+ -0.188029,0.190809,-0.963451,25.228347,-128.590183,215.991336,
+ -0.188029,0.190809,-0.963451,23.801231,-127.825972,216.421204,
+ -0.110679,0.23768,-0.965017,23.920487,-126.408895,216.678578,
+ -0.110679,0.23768,-0.965017,25.246905,-126.988138,216.383785,
+ -0.110679,0.23768,-0.965017,25.228347,-128.590183,215.991336,
+ 0.999907,0.004013,-0.013032,32.815702,-131.174265,224.637087,
+ 0.999907,0.004013,-0.013032,32.814485,-129.961018,224.917277,
+ 0.999907,0.004013,-0.013032,32.822699,-130.157243,225.487089,
+ 0.997014,-0.053441,0.055735,32.815702,-131.174265,224.637087,
+ 0.997014,-0.053441,0.055735,32.822699,-130.157243,225.487089,
+ 0.997014,-0.053441,0.055735,32.776153,-131.325768,225.199293,
+ 0.968979,-0.247137,0.001565,32.630733,-131.901969,224.245854,
+ 0.968979,-0.247137,0.001565,32.815702,-131.174265,224.637087,
+ 0.968979,-0.247137,0.001565,32.776153,-131.325768,225.199293,
+ 0.955558,-0.293126,0.031406,32.630733,-131.901969,224.245854,
+ 0.955558,-0.293126,0.031406,32.776153,-131.325768,225.199293,
+ 0.955558,-0.293126,0.031406,32.550722,-132.07629,225.053265,
+ 0.740066,-0.668771,-0.071051,32.630733,-131.901969,224.245854,
+ 0.740066,-0.668771,-0.071051,32.550722,-132.07629,225.053265,
+ 0.740066,-0.668771,-0.071051,31.972696,-132.633324,224.275668,
+ 0.675657,-0.736774,0.025542,32.550722,-132.07629,225.053265,
+ 0.675657,-0.736774,0.025542,31.726579,-132.819814,225.406774,
+ 0.675657,-0.736774,0.025542,31.972696,-132.633324,224.275668,
+ 0.243733,-0.964042,-0.105911,31.972696,-132.633324,224.275668,
+ 0.243733,-0.964042,-0.105911,31.726579,-132.819814,225.406774,
+ 0.243733,-0.964042,-0.105911,30.437276,-133.036422,224.411352,
+ 0.194342,-0.980181,-0.038427,31.726579,-132.819814,225.406774,
+ 0.194342,-0.980181,-0.038427,30.53189,-133.061672,225.53394,
+ 0.194342,-0.980181,-0.038427,30.437276,-133.036422,224.411352,
+ -0.222746,-0.974871,-0.003155,30.53189,-133.061672,225.53394,
+ -0.222746,-0.974871,-0.003155,29.265708,-132.769921,224.778551,
+ -0.222746,-0.974871,-0.003155,30.437276,-133.036422,224.411352,
+ -0.225105,-0.974334,0.001008,30.53189,-133.061672,225.53394,
+ -0.225105,-0.974334,0.001008,29.019591,-132.711814,225.982062,
+ -0.225105,-0.974334,0.001008,29.265708,-132.769921,224.778551,
+ -0.344352,-0.938505,-0.025108,29.265708,-132.769921,224.778551,
+ -0.344352,-0.938505,-0.025108,29.019591,-132.711814,225.982062,
+ -0.344352,-0.938505,-0.025108,27.352137,-132.081157,225.277783,
+ -0.388589,-0.915992,0.099786,29.019591,-132.711814,225.982062,
+ -0.388589,-0.915992,0.099786,27.595821,-132.07994,226.237915,
+ -0.388589,-0.915992,0.099786,27.352137,-132.081157,225.277783,
+ -0.669696,-0.722707,0.170886,27.595821,-132.07994,226.237915,
+ -0.669696,-0.722707,0.170886,26.169009,-130.818931,225.979324,
+ -0.669696,-0.722707,0.170886,27.352137,-132.081157,225.277783,
+ -0.66982,-0.729533,0.138284,27.595821,-132.07994,226.237915,
+ -0.66982,-0.729533,0.138284,26.584275,-131.083606,226.594466,
+ -0.66982,-0.729533,0.138284,26.169009,-130.818931,225.979324,
+ -0.846465,-0.289496,0.446866,26.169009,-130.818931,225.979324,
+ -0.846465,-0.289496,0.446866,26.584275,-131.083606,226.594466,
+ -0.846465,-0.289496,0.446866,26.085043,-129.905649,226.411931,
+ 0.341147,0.849469,0.402518,29.156796,-125.12233,220.875049,
+ 0.341147,0.849469,0.402518,27.433365,-124.909373,221.88629,
+ 0.341147,0.849469,0.402518,27.625939,-125.781584,223.563783,
+ 0.402946,0.809086,0.427802,29.288221,-126.048693,222.503257,
+ 0.402946,0.809086,0.427802,29.156796,-125.12233,220.875049,
+ 0.402946,0.809086,0.427802,27.625939,-125.781584,223.563783,
+ 0.503911,0.767605,0.396051,30.504814,-125.792536,220.45887,
+ 0.503911,0.767605,0.396051,29.156796,-125.12233,220.875049,
+ 0.503911,0.767605,0.396051,29.288221,-126.048693,222.503257,
+ 0.474087,0.793512,0.381549,30.593647,-126.654404,222.140926,
+ 0.474087,0.793512,0.381549,30.504814,-125.792536,220.45887,
+ 0.474087,0.793512,0.381549,29.288221,-126.048693,222.503257,
+ 0.696566,0.652814,0.297708,32.011028,-127.061456,219.717171,
+ 0.696566,0.652814,0.297708,30.504814,-125.792536,220.45887,
+ 0.696566,0.652814,0.297708,30.593647,-126.654404,222.140926,
+ 0.588315,0.780066,0.213032,32.109293,-127.594761,221.398619,
+ 0.588315,0.780066,0.213032,32.011028,-127.061456,219.717171,
+ 0.588315,0.780066,0.213032,30.593647,-126.654404,222.140926,
+ 0.93702,0.344972,0.054655,32.413821,-128.083954,219.265398,
+ 0.93702,0.344972,0.054655,32.011028,-127.061456,219.717171,
+ 0.93702,0.344972,0.054655,32.109293,-127.594761,221.398619,
+ 0.804844,0.593111,-0.021117,32.413821,-128.083954,219.265398,
+ 0.804844,0.593111,-0.021117,32.109293,-127.594761,221.398619,
+ 0.804844,0.593111,-0.021117,32.778891,-128.511693,221.165583,
+ 0.982394,0.186819,0.000031,32.778891,-128.511693,221.165583,
+ 0.982394,0.186819,0.000031,32.891758,-129.105539,223.121137,
+ 0.982394,0.186819,0.000031,33.148523,-130.455687,222.729296,
+ 0.979334,0.201372,0.018848,33.039002,-129.742585,220.801122,
+ 0.979334,0.201372,0.018848,32.778891,-128.511693,221.165583,
+ 0.979334,0.201372,0.018848,33.148523,-130.455687,222.729296,
+ 0.998406,0.036133,-0.043346,33.049346,-130.674728,220.262341,
+ 0.998406,0.036133,-0.043346,33.039002,-129.742585,220.801122,
+ 0.998406,0.036133,-0.043346,33.148523,-130.455687,222.729296,
+ 0.996919,-0.070781,-0.033794,33.049346,-130.674728,220.262341,
+ 0.996919,-0.070781,-0.033794,33.148523,-130.455687,222.729296,
+ 0.996919,-0.070781,-0.033794,33.059994,-131.506782,222.319201,
+ 0.943683,-0.30498,-0.128258,32.635297,-131.955513,220.261428,
+ 0.943683,-0.30498,-0.128258,33.049346,-130.674728,220.262341,
+ 0.943683,-0.30498,-0.128258,33.059994,-131.506782,222.319201,
+ -0.710913,0.323883,0.624261,25.203401,-127.014301,223.688515,
+ -0.710913,0.323883,0.624261,25.329045,-129.360175,225.048702,
+ -0.710913,0.323883,0.624261,25.875736,-127.793724,224.858562,
+ -0.76164,0.333268,0.55573,25.875736,-127.793724,224.858562,
+ -0.76164,0.333268,0.55573,25.329045,-129.360175,225.048702,
+ -0.76164,0.333268,0.55573,26.085043,-129.905649,226.411931,
+ -0.711806,0.454615,0.535403,25.875736,-127.793724,224.858562,
+ -0.711806,0.454615,0.535403,27.104194,-127.939752,226.615762,
+ -0.711806,0.454615,0.535403,26.543813,-127.105264,225.162178,
+ -0.758767,0.335467,0.558332,25.875736,-127.793724,224.858562,
+ -0.758767,0.335467,0.558332,26.085043,-129.905649,226.411931,
+ -0.758767,0.335467,0.558332,27.104194,-127.939752,226.615762,
+ 0.430386,0.70861,-0.559142,29.126678,-124.061804,216.785057,
+ 0.430386,0.70861,-0.559142,28.273328,-124.521487,215.545647,
+ 0.430386,0.70861,-0.559142,27.740327,-123.729895,216.13858,
+ 0.607833,0.426618,-0.669729,29.840388,-125.479489,216.113634,
+ 0.607833,0.426618,-0.669729,28.641136,-126.324016,214.48725,
+ 0.607833,0.426618,-0.669729,28.684944,-125.657156,214.951801,
+ 0.691295,0.291558,-0.661139,28.641136,-126.324016,214.48725,
+ 0.691295,0.291558,-0.661139,29.840388,-125.479489,216.113634,
+ 0.691295,0.291558,-0.661139,30.199677,-127.019169,215.810322,
+ 0.557552,0.494276,-0.666953,29.847993,-124.942838,216.453452,
+ 0.557552,0.494276,-0.666953,28.684944,-125.657156,214.951801,
+ 0.557552,0.494276,-0.666953,28.568122,-125.170702,215.214651,
+ 0.611792,0.416975,-0.672192,29.847993,-124.942838,216.453452,
+ 0.611792,0.416975,-0.672192,29.840388,-125.479489,216.113634,
+ 0.611792,0.416975,-0.672192,28.684944,-125.657156,214.951801,
+ 0.567736,0.563677,-0.599954,29.126678,-124.061804,216.785057,
+ 0.567736,0.563677,-0.599954,28.568122,-125.170702,215.214651,
+ 0.567736,0.563677,-0.599954,28.273328,-124.521487,215.545647,
+ 0.482204,0.625609,-0.613264,29.847993,-124.942838,216.453452,
+ 0.482204,0.625609,-0.613264,28.568122,-125.170702,215.214651,
+ 0.482204,0.625609,-0.613264,29.126678,-124.061804,216.785057,
+ 0.570913,-0.000635,-0.82101,28.433046,-127.539088,214.006576,
+ 0.570913,-0.000635,-0.82101,30.457963,-128.543941,215.415439,
+ 0.570913,-0.000635,-0.82101,28.494499,-128.534814,214.05008,
+ 0.547422,0.289219,-0.785291,28.494499,-128.534814,214.05008,
+ 0.547422,0.289219,-0.785291,30.457963,-128.543941,215.415439,
+ 0.547422,0.289219,-0.785291,30.085288,-129.165167,214.926855,
+ 0.75452,-0.656156,-0.012637,32.635297,-131.955513,220.261428,
+ 0.75452,-0.656156,-0.012637,33.059994,-131.506782,222.319201,
+ 0.75452,-0.656156,-0.012637,32.135456,-132.57035,222.341714,
+ 0.694557,-0.718008,-0.045326,32.635297,-131.955513,220.261428,
+ 0.694557,-0.718008,-0.045326,32.135456,-132.57035,222.341714,
+ 0.694557,-0.718008,-0.045326,31.842792,-132.716986,220.179896,
+ 0.296078,-0.954845,0.024684,32.135456,-132.57035,222.341714,
+ 0.296078,-0.954845,0.024684,31.042987,-132.906822,222.429939,
+ 0.296078,-0.954845,0.024684,31.842792,-132.716986,220.179896,
+ -0.007436,-0.996207,-0.086693,31.842792,-132.716986,220.179896,
+ -0.007436,-0.996207,-0.086693,31.042987,-132.906822,222.429939,
+ -0.007436,-0.996207,-0.086693,29.219466,-132.77418,221.062147,
+ -0.115334,-0.991656,0.057596,31.042987,-132.906822,222.429939,
+ -0.115334,-0.991656,0.057596,29.344198,-132.694473,222.684271,
+ -0.115334,-0.991656,0.057596,29.219466,-132.77418,221.062147,
+ -0.297627,-0.952137,0.069671,29.344198,-132.694473,222.684271,
+ -0.297627,-0.952137,0.069671,26.677976,-131.942431,221.572026,
+ -0.297627,-0.952137,0.069671,29.219466,-132.77418,221.062147,
+ -0.284005,-0.958259,0.032877,29.344198,-132.694473,222.684271,
+ -0.284005,-0.958259,0.032877,27.045175,-131.993236,223.263209,
+ -0.284005,-0.958259,0.032877,26.677976,-131.942431,221.572026,
+ -0.612867,-0.782554,0.10956,27.045175,-131.993236,223.263209,
+ -0.612867,-0.782554,0.10956,24.594648,-130.177321,222.52577,
+ -0.612867,-0.782554,0.10956,26.677976,-131.942431,221.572026,
+ -0.614215,-0.779855,0.120687,27.045175,-131.993236,223.263209,
+ -0.614215,-0.779855,0.120687,25.61958,-130.69572,224.392186,
+ -0.614215,-0.779855,0.120687,24.594648,-130.177321,222.52577,
+ -0.841182,-0.415018,0.346659,24.594648,-130.177321,222.52577,
+ -0.841182,-0.415018,0.346659,25.61958,-130.69572,224.392186,
+ -0.841182,-0.415018,0.346659,24.200069,-128.66198,223.382465,
+ -0.831922,-0.379827,0.404521,24.200069,-128.66198,223.382465,
+ -0.831922,-0.379827,0.404521,25.61958,-130.69572,224.392186,
+ -0.831922,-0.379827,0.404521,25.329045,-129.360175,225.048702,
+ -0.132877,0.805682,0.577252,27.625939,-125.781584,223.563783,
+ -0.132877,0.805682,0.577252,25.847748,-126.346225,223.942542,
+ -0.132877,0.805682,0.577252,26.543813,-127.105264,225.162178,
+ -0.269336,0.823372,0.499517,27.830682,-126.526325,224.901762,
+ -0.269336,0.823372,0.499517,27.625939,-125.781584,223.563783,
+ -0.269336,0.823372,0.499517,26.543813,-127.105264,225.162178,
+ 0.389479,0.828807,0.401728,29.288221,-126.048693,222.503257,
+ 0.389479,0.828807,0.401728,27.625939,-125.781584,223.563783,
+ 0.389479,0.828807,0.401728,27.830682,-126.526325,224.901762,
+ 0.297932,0.885187,0.357323,29.377358,-126.787654,224.259544,
+ 0.297932,0.885187,0.357323,29.288221,-126.048693,222.503257,
+ 0.297932,0.885187,0.357323,27.830682,-126.526325,224.901762,
+ 0.47054,0.821603,0.321809,29.377358,-126.787654,224.259544,
+ 0.47054,0.821603,0.321809,30.593647,-126.654404,222.140926,
+ 0.47054,0.821603,0.321809,29.288221,-126.048693,222.503257,
+ 0.470162,0.821897,0.321611,30.593647,-126.654404,222.140926,
+ 0.470162,0.821897,0.321611,29.377358,-126.787654,224.259544,
+ 0.470162,0.821897,0.321611,30.661793,-127.382413,223.901776,
+ 0.602243,0.745707,0.284999,32.109293,-127.594761,221.398619,
+ 0.602243,0.745707,0.284999,30.593647,-126.654404,222.140926,
+ 0.602243,0.745707,0.284999,30.661793,-127.382413,223.901776,
+ 0.572291,0.776016,0.265107,32.109293,-127.594761,221.398619,
+ 0.572291,0.776016,0.265107,30.661793,-127.382413,223.901776,
+ 0.572291,0.776016,0.265107,32.107772,-128.237283,223.28268,
+ 0.815353,0.547774,0.187466,32.778891,-128.511693,221.165583,
+ 0.815353,0.547774,0.187466,32.109293,-127.594761,221.398619,
+ 0.815353,0.547774,0.187466,32.107772,-128.237283,223.28268,
+ 0.747456,0.646415,0.153157,32.778891,-128.511693,221.165583,
+ 0.747456,0.646415,0.153157,32.107772,-128.237283,223.28268,
+ 0.747456,0.646415,0.153157,32.891758,-129.105539,223.121137,
+ 0.999201,-0.008041,0.039157,32.891758,-129.105539,223.121137,
+ 0.999201,-0.008041,0.039157,32.814485,-129.961018,224.917277,
+ 0.999201,-0.008041,0.039157,32.815702,-131.174265,224.637087,
+ 0.968987,0.121893,0.214955,33.148523,-130.455687,222.729296,
+ 0.968987,0.121893,0.214955,32.891758,-129.105539,223.121137,
+ 0.968987,0.121893,0.214955,32.815702,-131.174265,224.637087,
+ 0.983842,-0.130633,0.122432,33.059994,-131.506782,222.319201,
+ 0.983842,-0.130633,0.122432,33.148523,-130.455687,222.729296,
+ 0.983842,-0.130633,0.122432,32.815702,-131.174265,224.637087,
+ 0.937789,-0.315867,0.144151,33.059994,-131.506782,222.319201,
+ 0.937789,-0.315867,0.144151,32.815702,-131.174265,224.637087,
+ 0.937789,-0.315867,0.144151,32.630733,-131.901969,224.245854,
+ 0.754636,-0.655276,0.033726,33.059994,-131.506782,222.319201,
+ 0.754636,-0.655276,0.033726,32.630733,-131.901969,224.245854,
+ 0.754636,-0.655276,0.033726,32.135456,-132.57035,222.341714,
+ 0.743593,-0.667383,0.040849,32.135456,-132.57035,222.341714,
+ 0.743593,-0.667383,0.040849,32.630733,-131.901969,224.245854,
+ 0.743593,-0.667383,0.040849,31.972696,-132.633324,224.275668,
+ 0.29387,-0.955824,-0.006392,32.135456,-132.57035,222.341714,
+ 0.29387,-0.955824,-0.006392,31.972696,-132.633324,224.275668,
+ 0.29387,-0.955824,-0.006392,31.042987,-132.906822,222.429939,
+ 0.255119,-0.966797,0.014753,31.972696,-132.633324,224.275668,
+ 0.255119,-0.966797,0.014753,30.437276,-133.036422,224.411352,
+ 0.255119,-0.966797,0.014753,31.042987,-132.906822,222.429939,
+ -0.139067,-0.984496,-0.106906,31.042987,-132.906822,222.429939,
+ -0.139067,-0.984496,-0.106906,30.437276,-133.036422,224.411352,
+ -0.139067,-0.984496,-0.106906,29.344198,-132.694473,222.684271,
+ -0.234621,-0.971101,-0.043778,30.437276,-133.036422,224.411352,
+ -0.234621,-0.971101,-0.043778,29.265708,-132.769921,224.778551,
+ -0.234621,-0.971101,-0.043778,29.344198,-132.694473,222.684271,
+ -0.301935,-0.952236,-0.045621,29.344198,-132.694473,222.684271,
+ -0.301935,-0.952236,-0.045621,29.265708,-132.769921,224.778551,
+ -0.301935,-0.952236,-0.045621,27.045175,-131.993236,223.263209,
+ -0.336305,-0.941699,0.010145,29.265708,-132.769921,224.778551,
+ -0.336305,-0.941699,0.010145,27.352137,-132.081157,225.277783,
+ -0.336305,-0.941699,0.010145,27.045175,-131.993236,223.263209,
+ -0.643184,-0.762973,0.064705,27.352137,-132.081157,225.277783,
+ -0.643184,-0.762973,0.064705,25.61958,-130.69572,224.392186,
+ -0.643184,-0.762973,0.064705,27.045175,-131.993236,223.263209,
+ -0.667914,-0.723357,0.175061,27.352137,-132.081157,225.277783,
+ -0.667914,-0.723357,0.175061,26.169009,-130.818931,225.979324,
+ -0.667914,-0.723357,0.175061,25.61958,-130.69572,224.392186,
+ 0.502441,0.783374,0.365893,30.755799,-125.019806,218.459812,
+ 0.502441,0.783374,0.365893,29.156796,-125.12233,220.875049,
+ 0.502441,0.783374,0.365893,30.504814,-125.792536,220.45887,
+ 0.969245,-0.003897,-0.246067,32.415342,-130.277411,218.353029,
+ 0.969245,-0.003897,-0.246067,32.546767,-129.208975,218.853782,
+ 0.969245,-0.003897,-0.246067,33.039002,-129.742585,220.801122,
+ 0.863578,0.424282,0.272429,31.316484,-125.759984,217.835239,
+ 0.863578,0.424282,0.272429,30.755799,-125.019806,218.459812,
+ 0.863578,0.424282,0.272429,30.504814,-125.792536,220.45887,
+ 0.945129,0.171285,-0.278195,32.415342,-130.277411,218.353029,
+ 0.945129,0.171285,-0.278195,33.039002,-129.742585,220.801122,
+ 0.945129,0.171285,-0.278195,33.049346,-130.674728,220.262341,
+ 0.90827,-0.230036,-0.349468,32.415342,-130.277411,218.353029,
+ 0.90827,-0.230036,-0.349468,33.049346,-130.674728,220.262341,
+ 0.90827,-0.230036,-0.349468,32.152493,-131.498263,218.473502,
+ 0.902144,-0.291417,-0.318139,32.152493,-131.498263,218.473502,
+ 0.902144,-0.291417,-0.318139,33.049346,-130.674728,220.262341,
+ 0.902144,-0.291417,-0.318139,32.635297,-131.955513,220.261428,
+ 0.689837,0.689099,0.221964,31.316484,-125.759984,217.835239,
+ 0.689837,0.689099,0.221964,30.504814,-125.792536,220.45887,
+ 0.689837,0.689099,0.221964,32.011028,-127.061456,219.717171,
+ 0.65814,-0.667428,-0.348411,32.635297,-131.955513,220.261428,
+ 0.65814,-0.667428,-0.348411,30.886311,-132.872445,218.714143,
+ 0.65814,-0.667428,-0.348411,32.152493,-131.498263,218.473502,
+ 0.950802,0.256776,-0.173326,31.660866,-127.159416,217.651183,
+ 0.950802,0.256776,-0.173326,31.316484,-125.759984,217.835239,
+ 0.950802,0.256776,-0.173326,32.011028,-127.061456,219.717171,
+ 0.888675,0.42554,-0.170798,31.660866,-127.159416,217.651183,
+ 0.888675,0.42554,-0.170798,32.011028,-127.061456,219.717171,
+ 0.888675,0.42554,-0.170798,32.413821,-128.083954,219.265398,
+ -0.897999,-0.335365,0.284831,25.61958,-130.69572,224.392186,
+ -0.897999,-0.335365,0.284831,26.169009,-130.818931,225.979324,
+ -0.897999,-0.335365,0.284831,25.329045,-129.360175,225.048702,
+ 0.961542,0.241777,-0.130309,32.413821,-128.083954,219.265398,
+ 0.961542,0.241777,-0.130309,32.778891,-128.511693,221.165583,
+ 0.961542,0.241777,-0.130309,33.039002,-129.742585,220.801122,
+ -0.884457,-0.263676,0.384982,25.329045,-129.360175,225.048702,
+ -0.884457,-0.263676,0.384982,26.169009,-130.818931,225.979324,
+ -0.884457,-0.263676,0.384982,26.085043,-129.905649,226.411931,
+ 0.664436,-0.652499,-0.364376,30.886311,-132.872445,218.714143,
+ 0.664436,-0.652499,-0.364376,32.635297,-131.955513,220.261428,
+ 0.664436,-0.652499,-0.364376,31.842792,-132.716986,220.179896,
+ -0.045347,-0.989865,0.134577,31.842792,-132.716986,220.179896,
+ -0.045347,-0.989865,0.134577,28.54348,-132.694473,219.233758,
+ -0.045347,-0.989865,0.134577,30.886311,-132.872445,218.714143,
+ -0.880763,-0.413982,0.229945,24.086593,-129.971057,220.951105,
+ -0.880763,-0.413982,0.229945,24.594648,-130.177321,222.52577,
+ -0.880763,-0.413982,0.229945,23.407869,-128.027368,221.850696,
+ 0.006345,-0.998926,-0.045893,31.842792,-132.716986,220.179896,
+ 0.006345,-0.998926,-0.045893,29.219466,-132.77418,221.062147,
+ 0.006345,-0.998926,-0.045893,28.54348,-132.694473,219.233758,
+ -0.037152,0.832363,0.552984,27.433365,-124.909373,221.88629,
+ -0.037152,0.832363,0.552984,25.480853,-125.444808,222.56106,
+ -0.037152,0.832363,0.552984,25.847748,-126.346225,223.942542,
+ -0.174651,0.86525,0.469936,27.625939,-125.781584,223.563783,
+ -0.174651,0.86525,0.469936,27.433365,-124.909373,221.88629,
+ -0.174651,0.86525,0.469936,25.847748,-126.346225,223.942542,
+ -0.873515,-0.391224,0.28968,23.407869,-128.027368,221.850696,
+ -0.873515,-0.391224,0.28968,24.594648,-130.177321,222.52577,
+ -0.873515,-0.391224,0.28968,24.200069,-128.66198,223.382465,
+ -0.301811,-0.952119,0.048786,29.219466,-132.77418,221.062147,
+ -0.301811,-0.952119,0.048786,26.677976,-131.942431,221.572026,
+ -0.301811,-0.952119,0.048786,25.92715,-131.799141,219.723559,
+ -0.622985,-0.757715,0.194313,26.677976,-131.942431,221.572026,
+ -0.622985,-0.757715,0.194313,24.086593,-129.971057,220.951105,
+ -0.622985,-0.757715,0.194313,25.92715,-131.799141,219.723559,
+ -0.617208,-0.780816,0.096859,26.677976,-131.942431,221.572026,
+ -0.617208,-0.780816,0.096859,24.594648,-130.177321,222.52577,
+ -0.617208,-0.780816,0.096859,24.086593,-129.971057,220.951105,
+ -0.310555,-0.947709,0.073503,29.219466,-132.77418,221.062147,
+ -0.310555,-0.947709,0.073503,25.92715,-131.799141,219.723559,
+ -0.310555,-0.947709,0.073503,28.54348,-132.694473,219.233758,
+ 0.963688,0.184507,-0.193036,32.546767,-129.208975,218.853782,
+ 0.963688,0.184507,-0.193036,32.413821,-128.083954,219.265398,
+ 0.963688,0.184507,-0.193036,33.039002,-129.742585,220.801122,
+ -0.24653,0.796397,0.552245,27.830682,-126.526325,224.901762,
+ -0.24653,0.796397,0.552245,26.543813,-127.105264,225.162178,
+ -0.24653,0.796397,0.552245,27.104194,-127.939752,226.615762,
+ -0.600247,0.723075,0.341856,28.007132,-127.217523,226.673564,
+ -0.600247,0.723075,0.341856,27.830682,-126.526325,224.901762,
+ -0.600247,0.723075,0.341856,27.104194,-127.939752,226.615762,
+ 0.286612,0.901856,0.32328,29.377358,-126.787654,224.259544,
+ 0.286612,0.901856,0.32328,27.830682,-126.526325,224.901762,
+ 0.286612,0.901856,0.32328,28.007132,-127.217523,226.673564,
+ 0.181692,0.945151,0.271436,29.543769,-127.386672,226.23396,
+ 0.181692,0.945151,0.271436,29.377358,-126.787654,224.259544,
+ 0.181692,0.945151,0.271436,28.007132,-127.217523,226.673564,
+ 0.459952,0.859727,0.222066,30.661793,-127.382413,223.901776,
+ 0.459952,0.859727,0.222066,29.377358,-126.787654,224.259544,
+ 0.459952,0.859727,0.222066,29.543769,-127.386672,226.23396,
+ 0.515693,0.819879,0.248715,30.786525,-128.052619,225.852463,
+ 0.515693,0.819879,0.248715,30.661793,-127.382413,223.901776,
+ 0.515693,0.819879,0.248715,29.543769,-127.386672,226.23396,
+ 0.567241,0.789334,0.234924,32.107772,-128.237283,223.28268,
+ 0.567241,0.789334,0.234924,30.661793,-127.382413,223.901776,
+ 0.567241,0.789334,0.234924,30.786525,-128.052619,225.852463,
+ 0.596862,0.761697,0.252139,32.152797,-128.939737,225.298166,
+ 0.596862,0.761697,0.252139,32.107772,-128.237283,223.28268,
+ 0.596862,0.761697,0.252139,30.786525,-128.052619,225.852463,
+ 0.745139,0.634754,0.204584,32.891758,-129.105539,223.121137,
+ 0.745139,0.634754,0.204584,32.107772,-128.237283,223.28268,
+ 0.745139,0.634754,0.204584,32.152797,-128.939737,225.298166,
+ 0.852175,0.457232,0.254436,32.891758,-129.105539,223.121137,
+ 0.852175,0.457232,0.254436,32.152797,-128.939737,225.298166,
+ 0.852175,0.457232,0.254436,32.814485,-129.961018,224.917277,
+ -0.376715,-0.924571,0.057048,28.54348,-132.694473,219.233758,
+ -0.376715,-0.924571,0.057048,25.267288,-131.427379,218.135204,
+ -0.376715,-0.924571,0.057048,27.443404,-132.354655,217.476863,
+ -0.336113,-0.938417,-0.080007,28.54348,-132.694473,219.233758,
+ -0.336113,-0.938417,-0.080007,25.92715,-131.799141,219.723559,
+ -0.336113,-0.938417,-0.080007,25.267288,-131.427379,218.135204,
+ -0.666733,-0.737968,0.104261,25.92715,-131.799141,219.723559,
+ -0.666733,-0.737968,0.104261,23.106382,-129.344355,219.06035,
+ -0.666733,-0.737968,0.104261,25.267288,-131.427379,218.135204,
+ -0.666505,-0.738669,0.100695,25.92715,-131.799141,219.723559,
+ -0.666505,-0.738669,0.100695,24.086593,-129.971057,220.951105,
+ -0.666505,-0.738669,0.100695,23.106382,-129.344355,219.06035,
+ -0.853147,-0.426014,0.301086,23.106382,-129.344355,219.06035,
+ -0.853147,-0.426014,0.301086,24.086593,-129.971057,220.951105,
+ -0.853147,-0.426014,0.301086,22.539308,-127.310616,220.331095,
+ -0.855825,-0.431131,0.285813,22.539308,-127.310616,220.331095,
+ -0.855825,-0.431131,0.285813,24.086593,-129.971057,220.951105,
+ -0.855825,-0.431131,0.285813,23.407869,-128.027368,221.850696,
+ -0.161159,0.88962,0.427322,27.3567,-123.908171,220.069463,
+ -0.161159,0.88962,0.427322,24.900697,-124.464293,220.300977,
+ -0.161159,0.88962,0.427322,25.480853,-125.444808,222.56106,
+ -0.07203,0.872256,0.483715,27.433365,-124.909373,221.88629,
+ -0.07203,0.872256,0.483715,27.3567,-123.908171,220.069463,
+ -0.07203,0.872256,0.483715,25.480853,-125.444808,222.56106,
+ 0.358563,0.823895,0.438895,27.433365,-124.909373,221.88629,
+ 0.358563,0.823895,0.438895,29.03541,-124.274761,219.386175,
+ 0.358563,0.823895,0.438895,27.3567,-123.908171,220.069463,
+ 0.359511,0.823246,0.439338,29.03541,-124.274761,219.386175,
+ 0.359511,0.823246,0.439338,27.433365,-124.909373,221.88629,
+ 0.359511,0.823246,0.439338,29.156796,-125.12233,220.875049,
+ 0.533502,0.753008,0.385168,30.755799,-125.019806,218.459812,
+ 0.533502,0.753008,0.385168,29.03541,-124.274761,219.386175,
+ 0.533502,0.753008,0.385168,29.156796,-125.12233,220.875049,
+ -0.304958,0.925078,-0.226342,10.559563,-151.299312,212.529263,
+ -0.304958,0.925078,-0.226342,9.29977,-151.412179,213.765326,
+ -0.304958,0.925078,-0.226342,9.365787,-150.73315,216.451627,
+ 0.104283,0.986763,-0.124193,3.545975,-152.854507,213.402691,
+ 0.104283,0.986763,-0.124193,1.172721,-152.689617,212.720011,
+ 0.104283,0.986763,-0.124193,3.37348,-152.537505,215.776553,
+ -0.343295,0.939223,0.002914,10.026866,-151.140203,211.762009,
+ -0.343295,0.939223,0.002914,9.022013,-151.506489,211.440748,
+ -0.343295,0.939223,0.002914,9.29977,-151.412179,213.765326,
+ -0.767417,-0.606867,-0.206843,0.949421,-154.720923,212.657645,
+ -0.767417,-0.606867,-0.206843,1.53201,-155.472053,212.699933,
+ -0.767417,-0.606867,-0.206843,1.38294,-156.337875,215.793285,
+ 0.192995,0.977735,-0.08239,10.922502,-151.199526,214.563611,
+ 0.192995,0.977735,-0.08239,10.559563,-151.299312,212.529263,
+ 0.192995,0.977735,-0.08239,9.365787,-150.73315,216.451627,
+ 0.066732,0.985186,0.157972,10.559563,-151.299312,212.529263,
+ 0.066732,0.985186,0.157972,10.026866,-151.140203,211.762009,
+ 0.066732,0.985186,0.157972,9.29977,-151.412179,213.765326,
+ 0.840145,0.488923,0.234757,10.326527,-150.804035,217.466215,
+ 0.840145,0.488923,0.234757,10.582988,-152.735555,220.571128,
+ 0.840145,0.488923,0.234757,11.407132,-152.926608,218.019599,
+ 0.140775,-0.798913,-0.58474,5.171142,-155.09877,213.30899,
+ 0.140775,-0.798913,-0.58474,3.05587,-154.082052,211.41063,
+ 0.140775,-0.798913,-0.58474,4.928371,-153.526538,211.102451,
+ 0.16645,-0.780009,-0.603225,5.171142,-155.09877,213.30899,
+ 0.16645,-0.780009,-0.603225,2.449551,-156.142563,213.907703,
+ 0.16645,-0.780009,-0.603225,3.05587,-154.082052,211.41063,
+ 0.925313,0.351515,0.142243,10.326527,-150.804035,217.466215,
+ 0.925313,0.351515,0.142243,9.730247,-150.408847,220.368515,
+ 0.925313,0.351515,0.142243,10.582988,-152.735555,220.571128,
+ 0.201451,-0.778948,-0.59385,3.05587,-154.082052,211.41063,
+ 0.201451,-0.778948,-0.59385,2.449551,-156.142563,213.907703,
+ 0.201451,-0.778948,-0.59385,1.794556,-154.455335,211.472387,
+ 0.20353,-0.829245,-0.520508,5.319299,-156.289504,215.263935,
+ 0.20353,-0.829245,-0.520508,2.449551,-156.142563,213.907703,
+ 0.20353,-0.829245,-0.520508,5.171142,-155.09877,213.30899,
+ 0.20525,-0.781175,-0.589608,2.905279,-157.435212,215.778987,
+ 0.20525,-0.781175,-0.589608,1.53201,-155.472053,212.699933,
+ 0.20525,-0.781175,-0.589608,2.449551,-156.142563,213.907703,
+ 0.239678,-0.770523,-0.590634,5.319299,-156.289504,215.263935,
+ 0.239678,-0.770523,-0.590634,2.905279,-157.435212,215.778987,
+ 0.239678,-0.770523,-0.590634,2.449551,-156.142563,213.907703,
+ -0.383316,-0.669378,-0.636397,1.794556,-154.455335,211.472387,
+ -0.383316,-0.669378,-0.636397,1.53201,-155.472053,212.699933,
+ -0.383316,-0.669378,-0.636397,1.121307,-154.332428,211.748623,
+ 0.217129,-0.774077,-0.594692,2.449551,-156.142563,213.907703,
+ 0.217129,-0.774077,-0.594692,1.53201,-155.472053,212.699933,
+ 0.217129,-0.774077,-0.594692,1.794556,-154.455335,211.472387,
+ -0.719148,-0.579379,-0.383596,1.121307,-154.332428,211.748623,
+ -0.719148,-0.579379,-0.383596,1.53201,-155.472053,212.699933,
+ -0.719148,-0.579379,-0.383596,0.949421,-154.720923,212.657645,
+ -0.56814,-0.784962,-0.247088,2.905279,-157.435212,215.778987,
+ -0.56814,-0.784962,-0.247088,1.38294,-156.337875,215.793285,
+ -0.56814,-0.784962,-0.247088,1.53201,-155.472053,212.699933,
+ -0.440245,0.685934,-0.579378,4.631143,-147.186808,222.255619,
+ -0.440245,0.685934,-0.579378,3.278866,-150.039519,219.90579,
+ -0.440245,0.685934,-0.579378,2.859341,-148.249463,222.343844,
+ -0.456957,0.684501,-0.568021,5.572718,-148.602363,219.792314,
+ -0.456957,0.684501,-0.568021,3.278866,-150.039519,219.90579,
+ -0.456957,0.684501,-0.568021,4.631143,-147.186808,222.255619,
+ -0.493474,0.867929,0.056417,4.631143,-147.186808,222.255619,
+ -0.493474,0.867929,0.056417,3.143182,-148.111041,223.45913,
+ -0.493474,0.867929,0.056417,4.569082,-147.290852,223.313407,
+ -0.6311,0.73194,-0.25686,2.859341,-148.249463,222.343844,
+ -0.6311,0.73194,-0.25686,1.48303,-150.264949,219.98215,
+ -0.6311,0.73194,-0.25686,1.844753,-149.177652,222.191731,
+ -0.679832,0.724864,0.111356,2.859341,-148.249463,222.343844,
+ -0.679832,0.724864,0.111356,1.844753,-149.177652,222.191731,
+ -0.679832,0.724864,0.111356,2.350678,-148.913889,223.563479,
+ -0.513309,0.857864,0.024165,4.631143,-147.186808,222.255619,
+ -0.513309,0.857864,0.024165,2.859341,-148.249463,222.343844,
+ -0.513309,0.857864,0.024165,3.143182,-148.111041,223.45913,
+ 0.619859,0.780373,-0.082421,9.730247,-150.408847,220.368515,
+ 0.619859,0.780373,-0.082421,6.527678,-147.643752,222.463404,
+ 0.619859,0.780373,-0.082421,8.378883,-149.088514,222.706479,
+ -0.124653,0.789425,-0.601057,3.278866,-150.039519,219.90579,
+ -0.124653,0.789425,-0.601057,1.48303,-150.264949,219.98215,
+ -0.124653,0.789425,-0.601057,2.859341,-148.249463,222.343844,
+ 0.578328,0.7808,0.236408,8.378883,-149.088514,222.706479,
+ 0.578328,0.7808,0.236408,6.527678,-147.643752,222.463404,
+ 0.578328,0.7808,0.236408,6.260569,-147.768484,223.528797,
+ -0.702748,0.705558,0.091281,3.143182,-148.111041,223.45913,
+ -0.702748,0.705558,0.091281,2.859341,-148.249463,222.343844,
+ -0.702748,0.705558,0.091281,2.350678,-148.913889,223.563479,
+ 0.982621,0.064126,0.174192,11.464934,-152.420683,215.297704,
+ 0.982621,0.064126,0.174192,11.11751,-155.010544,218.210956,
+ 0.982621,0.064126,0.174192,11.443943,-153.904689,215.962434,
+ 0.585503,0.795684,-0.155153,9.730247,-150.408847,220.368515,
+ 0.585503,0.795684,-0.155153,7.817893,-149.075736,219.988539,
+ 0.585503,0.795684,-0.155153,6.527678,-147.643752,222.463404,
+ 0.884468,0.455009,0.103356,10.922502,-151.199526,214.563611,
+ 0.884468,0.455009,0.103356,11.407132,-152.926608,218.019599,
+ 0.884468,0.455009,0.103356,11.464934,-152.420683,215.297704,
+ 0.990412,-0.138071,-0.004631,11.464934,-152.420683,215.297704,
+ 0.990412,-0.138071,-0.004631,11.407132,-152.926608,218.019599,
+ 0.990412,-0.138071,-0.004631,11.11751,-155.010544,218.210956,
+ 0.588153,0.738606,0.329449,8.378883,-149.088514,222.706479,
+ 0.588153,0.738606,0.329449,6.260569,-147.768484,223.528797,
+ 0.588153,0.738606,0.329449,8.08196,-149.274091,223.652617,
+ 0.872889,0.474268,0.114605,10.922502,-151.199526,214.563611,
+ 0.872889,0.474268,0.114605,10.326527,-150.804035,217.466215,
+ 0.872889,0.474268,0.114605,11.407132,-152.926608,218.019599,
+ 0.951836,0.019201,0.306005,11.407132,-152.926608,218.019599,
+ 0.951836,0.019201,0.306005,10.582988,-152.735555,220.571128,
+ 0.951836,0.019201,0.306005,10.637444,-155.318724,220.563827,
+ 0.975811,-0.118763,0.183543,11.407132,-152.926608,218.019599,
+ 0.975811,-0.118763,0.183543,10.637444,-155.318724,220.563827,
+ 0.975811,-0.118763,0.183543,11.11751,-155.010544,218.210956,
+ -0.359121,0.932551,0.037155,9.29977,-151.412179,213.765326,
+ -0.359121,0.932551,0.037155,6.703215,-152.321506,211.491554,
+ -0.359121,0.932551,0.037155,6.954505,-152.31968,213.874543,
+ -0.921699,-0.381651,-0.069375,0.949421,-154.720923,212.657645,
+ -0.921699,-0.381651,-0.069375,1.38294,-156.337875,215.793285,
+ -0.921699,-0.381651,-0.069375,0.881579,-155.03975,215.312915,
+ -0.33157,0.94343,0.001343,9.29977,-151.412179,213.765326,
+ -0.33157,0.94343,0.001343,9.022013,-151.506489,211.440748,
+ -0.33157,0.94343,0.001343,6.703215,-152.321506,211.491554,
+ -0.440343,0.887701,-0.134483,9.365787,-150.73315,216.451627,
+ -0.440343,0.887701,-0.134483,6.954505,-152.31968,213.874543,
+ -0.440343,0.887701,-0.134483,6.995271,-151.974994,216.016282,
+ -0.211336,0.977176,0.021537,6.954505,-152.31968,213.874543,
+ -0.211336,0.977176,0.021537,6.703215,-152.321506,211.491554,
+ -0.211336,0.977176,0.021537,3.712386,-152.972241,211.668612,
+ -0.36092,0.906228,-0.220202,9.365787,-150.73315,216.451627,
+ -0.36092,0.906228,-0.220202,9.29977,-151.412179,213.765326,
+ -0.36092,0.906228,-0.220202,6.954505,-152.31968,213.874543,
+ -0.143587,0.986338,-0.080746,6.954505,-152.31968,213.874543,
+ -0.143587,0.986338,-0.080746,3.712386,-152.972241,211.668612,
+ -0.143587,0.986338,-0.080746,3.545975,-152.854507,213.402691,
+ -0.132154,0.979028,-0.155047,6.995271,-151.974994,216.016282,
+ -0.132154,0.979028,-0.155047,6.954505,-152.31968,213.874543,
+ -0.132154,0.979028,-0.155047,3.545975,-152.854507,213.402691,
+ -0.142803,0.979628,-0.141195,6.995271,-151.974994,216.016282,
+ -0.142803,0.979628,-0.141195,3.545975,-152.854507,213.402691,
+ -0.142803,0.979628,-0.141195,3.37348,-152.537505,215.776553,
+ 0.156068,0.935645,-0.316562,3.545975,-152.854507,213.402691,
+ 0.156068,0.935645,-0.316562,1.641531,-153.130438,211.648229,
+ 0.156068,0.935645,-0.316562,1.172721,-152.689617,212.720011,
+ -0.075226,0.994362,-0.074731,3.712386,-152.972241,211.668612,
+ -0.075226,0.994362,-0.074731,1.641531,-153.130438,211.648229,
+ -0.075226,0.994362,-0.074731,3.545975,-152.854507,213.402691,
+ 0.159359,0.973639,-0.163195,3.37348,-152.537505,215.776553,
+ 0.159359,0.973639,-0.163195,1.172721,-152.689617,212.720011,
+ 0.159359,0.973639,-0.163195,0.806131,-152.166047,215.485715,
+ 0.953167,0.019241,0.301832,10.637444,-155.318724,220.563827,
+ 0.953167,0.019241,0.301832,10.582988,-152.735555,220.571128,
+ 0.953167,0.019241,0.301832,9.897571,-152.960681,222.749983,
+ 0.955004,0.025711,0.295475,10.637444,-155.318724,220.563827,
+ 0.955004,0.025711,0.295475,9.897571,-152.960681,222.749983,
+ 0.955004,0.025711,0.295475,10.058505,-155.571534,222.457015,
+ 0.952809,0.024782,0.302556,10.058505,-155.571534,222.457015,
+ 0.952809,0.024782,0.302556,9.897571,-152.960681,222.749983,
+ 0.952809,0.024782,0.302556,9.41933,-152.828648,224.245246,
+ 0.933683,-0.015664,0.357757,10.058505,-155.571534,222.457015,
+ 0.933683,-0.015664,0.357757,9.41933,-152.828648,224.245246,
+ 0.933683,-0.015664,0.357757,9.292164,-156.02422,224.437211,
+ 0.485825,-0.846945,-0.216007,9.404423,-156.678606,220.48412,
+ 0.485825,-0.846945,-0.216007,7.73697,-158.134928,222.443933,
+ 0.485825,-0.846945,-0.216007,7.592463,-157.764383,220.666046,
+ 0.578251,-0.808565,-0.108849,9.404423,-156.678606,220.48412,
+ 0.578251,-0.808565,-0.108849,9.090464,-157.183923,222.569882,
+ 0.578251,-0.808565,-0.108849,7.73697,-158.134928,222.443933,
+ 0.587198,-0.799367,0.127322,8.470454,-157.22621,224.766382,
+ 0.587198,-0.799367,0.127322,7.487506,-157.914974,224.975384,
+ 0.587198,-0.799367,0.127322,7.73697,-158.134928,222.443933,
+ 0.847142,-0.495099,0.192943,10.637444,-155.318724,220.563827,
+ 0.847142,-0.495099,0.192943,10.058505,-155.571534,222.457015,
+ 0.847142,-0.495099,0.192943,9.090464,-157.183923,222.569882,
+ 0.560141,-0.816066,0.142401,9.090464,-157.183923,222.569882,
+ 0.560141,-0.816066,0.142401,8.470454,-157.22621,224.766382,
+ 0.560141,-0.816066,0.142401,7.73697,-158.134928,222.443933,
+ 0.741342,-0.669221,-0.050541,9.404423,-156.678606,220.48412,
+ 0.741342,-0.669221,-0.050541,10.637444,-155.318724,220.563827,
+ 0.741342,-0.669221,-0.050541,9.090464,-157.183923,222.569882,
+ 0.843993,-0.491719,0.214217,10.058505,-155.571534,222.457015,
+ 0.843993,-0.491719,0.214217,9.292164,-156.02422,224.437211,
+ 0.843993,-0.491719,0.214217,9.090464,-157.183923,222.569882,
+ -0.98645,0.152548,0.060371,1.227786,-152.312683,220.032347,
+ -0.98645,0.152548,0.060371,1.484856,-151.534782,222.267179,
+ -0.98645,0.152548,0.060371,1.844753,-149.177652,222.191731,
+ 0.831969,-0.507116,0.225078,9.090464,-157.183923,222.569882,
+ 0.831969,-0.507116,0.225078,9.292164,-156.02422,224.437211,
+ 0.831969,-0.507116,0.225078,8.470454,-157.22621,224.766382,
+ -0.987059,0.125482,0.099841,1.48303,-150.264949,219.98215,
+ -0.987059,0.125482,0.099841,1.227786,-152.312683,220.032347,
+ -0.987059,0.125482,0.099841,1.844753,-149.177652,222.191731,
+ 0.891227,0.377286,0.251733,9.897571,-152.960681,222.749983,
+ 0.891227,0.377286,0.251733,8.08196,-149.274091,223.652617,
+ 0.891227,0.377286,0.251733,9.41933,-152.828648,224.245246,
+ 0.882724,0.349736,0.31382,10.582988,-152.735555,220.571128,
+ 0.882724,0.349736,0.31382,8.378883,-149.088514,222.706479,
+ 0.882724,0.349736,0.31382,9.897571,-152.960681,222.749983,
+ 0.873484,0.346429,0.342071,8.378883,-149.088514,222.706479,
+ 0.873484,0.346429,0.342071,8.08196,-149.274091,223.652617,
+ 0.873484,0.346429,0.342071,9.897571,-152.960681,222.749983,
+ 0.882882,0.350766,0.312223,9.730247,-150.408847,220.368515,
+ 0.882882,0.350766,0.312223,8.378883,-149.088514,222.706479,
+ 0.882882,0.350766,0.312223,10.582988,-152.735555,220.571128,
+ -0.078632,0.360246,-0.929537,30.275124,-94.223787,227.017946,
+ -0.078632,0.360246,-0.929537,30.6983,-96.503644,226.09858,
+ -0.078632,0.360246,-0.929537,29.604918,-95.041237,226.757834,
+ -0.138664,0.348134,-0.927133,30.275124,-94.223787,227.017946,
+ -0.138664,0.348134,-0.927133,31.540089,-95.910711,226.195324,
+ -0.138664,0.348134,-0.927133,30.6983,-96.503644,226.09858,
+ 0.112661,0.502495,-0.857208,30.275124,-94.223787,227.017946,
+ 0.112661,0.502495,-0.857208,31.37885,-94.584901,226.951321,
+ 0.112661,0.502495,-0.857208,31.540089,-95.910711,226.195324,
+ 0.660496,0.430927,-0.614856,31.540089,-95.910711,226.195324,
+ 0.660496,0.430927,-0.614856,31.37885,-94.584901,226.951321,
+ 0.660496,0.430927,-0.614856,33.040219,-96.37952,227.478237,
+ -0.157954,0.968354,0.193241,29.118463,-92.584626,229.762354,
+ -0.157954,0.968354,0.193241,26.080175,-92.866338,228.690571,
+ -0.157954,0.968354,0.193241,25.899162,-93.09481,229.687515,
+ 0.108786,0.841296,-0.529516,29.118463,-92.584626,229.762354,
+ 0.108786,0.841296,-0.529516,27.809386,-92.981943,228.862154,
+ 0.108786,0.841296,-0.529516,26.080175,-92.866338,228.690571,
+ 0.101379,0.847278,-0.521386,31.37885,-94.584901,226.951321,
+ 0.101379,0.847278,-0.521386,27.809386,-92.981943,228.862154,
+ 0.101379,0.847278,-0.521386,29.118463,-92.584626,229.762354,
+ 0.289017,0.927272,-0.237981,31.37885,-94.584901,226.951321,
+ 0.289017,0.927272,-0.237981,30.275124,-94.223787,227.017946,
+ 0.289017,0.927272,-0.237981,27.809386,-92.981943,228.862154,
+ -0.693784,0.120614,-0.710011,27.809386,-92.981943,228.862154,
+ -0.693784,0.120614,-0.710011,29.604918,-95.041237,226.757834,
+ -0.693784,0.120614,-0.710011,27.634761,-94.47173,228.779709,
+ -0.328048,0.519924,-0.78871,27.809386,-92.981943,228.862154,
+ -0.328048,0.519924,-0.78871,30.275124,-94.223787,227.017946,
+ -0.328048,0.519924,-0.78871,29.604918,-95.041237,226.757834,
+ 0.603051,0.551992,-0.575877,26.098124,-93.652758,227.955565,
+ 0.603051,0.551992,-0.575877,26.080175,-92.866338,228.690571,
+ 0.603051,0.551992,-0.575877,27.634761,-94.47173,228.779709,
+ 0.101502,0.043105,-0.993901,26.080175,-92.866338,228.690571,
+ 0.101502,0.043105,-0.993901,27.809386,-92.981943,228.862154,
+ 0.101502,0.043105,-0.993901,27.634761,-94.47173,228.779709,
+ -0.316529,0.804466,-0.502637,26.098124,-93.652758,227.955565,
+ -0.316529,0.804466,-0.502637,25.304707,-94.615019,226.915118,
+ -0.316529,0.804466,-0.502637,24.324192,-94.517059,227.689369,
+ -0.216129,0.664045,-0.715774,26.080175,-92.866338,228.690571,
+ -0.216129,0.664045,-0.715774,26.098124,-93.652758,227.955565,
+ -0.216129,0.664045,-0.715774,24.324192,-94.517059,227.689369,
+ -0.226046,0.044595,-0.973095,25.304707,-94.615019,226.915118,
+ -0.226046,0.044595,-0.973095,25.075322,-96.554449,226.879524,
+ -0.226046,0.044595,-0.973095,23.464454,-96.893051,227.238205,
+ -0.560023,0.345614,-0.752944,24.324192,-94.517059,227.689369,
+ -0.560023,0.345614,-0.752944,25.304707,-94.615019,226.915118,
+ -0.560023,0.345614,-0.752944,23.464454,-96.893051,227.238205,
+ -0.561329,0.115866,-0.819442,23.464454,-96.893051,227.238205,
+ -0.561329,0.115866,-0.819442,25.07441,-98.459198,225.913916,
+ -0.561329,0.115866,-0.819442,24.112756,-99.580873,226.414061,
+ -0.281758,0.433952,-0.855744,25.075322,-96.554449,226.879524,
+ -0.281758,0.433952,-0.855744,25.07441,-98.459198,225.913916,
+ -0.281758,0.433952,-0.855744,23.464454,-96.893051,227.238205,
+ -0.917394,-0.378496,-0.122999,24.112756,-99.580873,226.414061,
+ -0.917394,-0.378496,-0.122999,24.302897,-100.343563,227.342858,
+ -0.917394,-0.378496,-0.122999,23.194912,-97.900946,228.090337,
+ -0.910555,-0.096364,-0.402001,24.112756,-99.580873,226.414061,
+ -0.910555,-0.096364,-0.402001,23.194912,-97.900946,228.090337,
+ -0.910555,-0.096364,-0.402001,23.464454,-96.893051,227.238205,
+ -0.833198,0.424057,0.354903,24.324192,-94.517059,227.689369,
+ -0.833198,0.424057,0.354903,24.421848,-94.78934,228.24397,
+ -0.833198,0.424057,0.354903,25.899162,-93.09481,229.687515,
+ -0.695856,0.717174,0.038011,26.080175,-92.866338,228.690571,
+ -0.695856,0.717174,0.038011,24.324192,-94.517059,227.689369,
+ -0.695856,0.717174,0.038011,25.899162,-93.09481,229.687515,
+ -0.924456,0.35805,0.131079,23.464454,-96.893051,227.238205,
+ -0.924456,0.35805,0.131079,23.194912,-97.900946,228.090337,
+ -0.924456,0.35805,0.131079,24.421848,-94.78934,228.24397,
+ -0.914803,0.27481,0.295999,23.464454,-96.893051,227.238205,
+ -0.914803,0.27481,0.295999,24.421848,-94.78934,228.24397,
+ -0.914803,0.27481,0.295999,24.324192,-94.517059,227.689369,
+ -0.496591,-0.840232,-0.217732,26.267273,-101.279357,227.511702,
+ -0.496591,-0.840232,-0.217732,25.973392,-101.525779,229.132914,
+ -0.496591,-0.840232,-0.217732,24.457138,-100.630751,229.137173,
+ -0.419964,-0.901077,-0.108121,26.267273,-101.279357,227.511702,
+ -0.419964,-0.901077,-0.108121,24.457138,-100.630751,229.137173,
+ -0.419964,-0.901077,-0.108121,24.302897,-100.343563,227.342858,
+ -0.880683,-0.473707,-0.000114,24.302897,-100.343563,227.342858,
+ -0.880683,-0.473707,-0.000114,24.457138,-100.630751,229.137173,
+ -0.880683,-0.473707,-0.000114,23.367103,-98.604313,229.476079,
+ -0.916893,-0.39017,-0.084108,24.302897,-100.343563,227.342858,
+ -0.916893,-0.39017,-0.084108,23.367103,-98.604313,229.476079,
+ -0.916893,-0.39017,-0.084108,23.194912,-97.900946,228.090337,
+ 0.99414,-0.009223,-0.107704,33.040219,-96.37952,227.478237,
+ 0.99414,-0.009223,-0.107704,33.319193,-96.577875,230.070229,
+ 0.99414,-0.009223,-0.107704,33.230359,-99.200592,229.474862,
+ 0.834958,-0.279314,-0.474162,31.869564,-97.86018,226.289025,
+ 0.834958,-0.279314,-0.474162,33.040219,-96.37952,227.478237,
+ 0.834958,-0.279314,-0.474162,33.230359,-99.200592,229.474862,
+ 0.849481,-0.246435,-0.466532,31.869564,-97.86018,226.289025,
+ 0.849481,-0.246435,-0.466532,33.230359,-99.200592,229.474862,
+ 0.849481,-0.246435,-0.466532,32.73782,-100.967527,229.511369,
+ 0.958392,-0.026908,-0.284185,31.662691,-99.901221,225.784621,
+ 0.958392,-0.026908,-0.284185,31.869564,-97.86018,226.289025,
+ 0.958392,-0.026908,-0.284185,32.73782,-100.967527,229.511369,
+ -0.492649,-0.865298,-0.092503,26.526472,-101.969946,230.342205,
+ -0.492649,-0.865298,-0.092503,24.859323,-101.100778,231.090597,
+ -0.492649,-0.865298,-0.092503,25.973392,-101.525779,229.132914,
+ -0.505898,-0.856549,-0.101942,25.973392,-101.525779,229.132914,
+ -0.505898,-0.856549,-0.101942,24.859323,-101.100778,231.090597,
+ -0.505898,-0.856549,-0.101942,24.457138,-100.630751,229.137173,
+ -0.865073,-0.498256,0.058219,24.457138,-100.630751,229.137173,
+ -0.865073,-0.498256,0.058219,24.859323,-101.100778,231.090597,
+ -0.865073,-0.498256,0.058219,23.610786,-98.908537,231.300512,
+ -0.877431,-0.478239,0.037449,24.457138,-100.630751,229.137173,
+ -0.877431,-0.478239,0.037449,23.610786,-98.908537,231.300512,
+ -0.877431,-0.478239,0.037449,23.367103,-98.604313,229.476079,
+ 0.994775,-0.087133,-0.053208,33.319193,-96.577875,230.070229,
+ 0.994775,-0.087133,-0.053208,33.311283,-97.536485,231.492173,
+ 0.994775,-0.087133,-0.053208,33.086157,-99.803869,230.996288,
+ 0.995949,-0.050607,0.07433,33.230359,-99.200592,229.474862,
+ 0.995949,-0.050607,0.07433,33.319193,-96.577875,230.070229,
+ 0.995949,-0.050607,0.07433,33.086157,-99.803869,230.996288,
+ 0.917459,-0.3919,-0.068439,33.230359,-99.200592,229.474862,
+ 0.917459,-0.3919,-0.068439,33.086157,-99.803869,230.996288,
+ 0.917459,-0.3919,-0.068439,32.424773,-101.300349,230.699365,
+ 0.949008,-0.260883,0.176984,33.230359,-99.200592,229.474862,
+ 0.949008,-0.260883,0.176984,32.424773,-101.300349,230.699365,
+ 0.949008,-0.260883,0.176984,32.73782,-100.967527,229.511369,
+ 0.460823,0.156343,-0.873613,26.545638,-96.722381,227.372063,
+ 0.460823,0.156343,-0.873613,27.997701,-97.004093,228.087599,
+ 0.460823,0.156343,-0.873613,27.704733,-97.804811,227.789763,
+ 0.464141,0.201681,-0.862495,27.343619,-96.500602,227.853346,
+ 0.464141,0.201681,-0.862495,27.997701,-97.004093,228.087599,
+ 0.464141,0.201681,-0.862495,26.545638,-96.722381,227.372063,
+ 0.497197,0.084874,-0.863477,26.552636,-95.841043,227.462722,
+ 0.497197,0.084874,-0.863477,27.343619,-96.500602,227.853346,
+ 0.497197,0.084874,-0.863477,26.545638,-96.722381,227.372063,
+ 0.439699,0.112986,-0.89101,26.601311,-95.286746,227.557032,
+ 0.439699,0.112986,-0.89101,27.604339,-95.941741,227.968951,
+ 0.439699,0.112986,-0.89101,26.552636,-95.841043,227.462722,
+ 0.432476,-0.015272,-0.901516,26.552636,-95.841043,227.462722,
+ 0.432476,-0.015272,-0.901516,27.604339,-95.941741,227.968951,
+ 0.432476,-0.015272,-0.901516,27.343619,-96.500602,227.853346,
+ -0.253509,0.307958,-0.917004,27.604339,-95.941741,227.968951,
+ -0.253509,0.307958,-0.917004,28.849529,-96.405988,227.468807,
+ -0.253509,0.307958,-0.917004,27.343619,-96.500602,227.853346,
+ -0.16597,-0.584973,-0.79389,28.849529,-96.405988,227.468807,
+ -0.16597,-0.584973,-0.79389,27.997701,-97.004093,228.087599,
+ -0.16597,-0.584973,-0.79389,27.343619,-96.500602,227.853346,
+ -0.575722,-0.025562,-0.817246,28.849529,-96.405988,227.468807,
+ -0.575722,-0.025562,-0.817246,29.589707,-97.067067,226.968053,
+ -0.575722,-0.025562,-0.817246,27.997701,-97.004093,228.087599,
+ -0.49961,0.456611,-0.736136,27.997701,-97.004093,228.087599,
+ -0.49961,0.456611,-0.736136,29.589707,-97.067067,226.968053,
+ -0.49961,0.456611,-0.736136,27.704733,-97.804811,227.789763,
+ -0.411056,0.035682,-0.910912,29.589707,-97.067067,226.968053,
+ -0.411056,0.035682,-0.910912,29.595791,-98.060968,226.926375,
+ -0.411056,0.035682,-0.910912,27.704733,-97.804811,227.789763,
+ -0.322155,0.442516,-0.836897,27.704733,-97.804811,227.789763,
+ -0.322155,0.442516,-0.836897,29.595791,-98.060968,226.926375,
+ -0.322155,0.442516,-0.836897,27.830378,-98.862903,227.181923,
+ 0.540766,0.390737,-0.744914,26.545638,-96.722381,227.372063,
+ 0.540766,0.390737,-0.744914,27.830378,-98.862903,227.181923,
+ 0.540766,0.390737,-0.744914,25.804244,-97.501804,226.425013,
+ 0.638026,0.439129,-0.632526,27.830378,-98.862903,227.181923,
+ 0.638026,0.439129,-0.632526,26.545638,-96.722381,227.372063,
+ 0.638026,0.439129,-0.632526,27.704733,-97.804811,227.789763,
+ -0.176097,0.297556,-0.938323,29.595791,-98.060968,226.926375,
+ -0.176097,0.297556,-0.938323,28.882385,-99.809954,226.505632,
+ -0.176097,0.297556,-0.938323,27.716598,-99.531893,226.812595,
+ -0.341625,0.498096,-0.79699,29.595791,-98.060968,226.926375,
+ -0.341625,0.498096,-0.79699,27.716598,-99.531893,226.812595,
+ -0.341625,0.498096,-0.79699,27.830378,-98.862903,227.181923,
+ 0.432068,0.378438,-0.818598,25.07441,-98.459198,225.913916,
+ 0.432068,0.378438,-0.818598,27.830378,-98.862903,227.181923,
+ 0.432068,0.378438,-0.818598,27.716598,-99.531893,226.812595,
+ 0.431106,0.146644,-0.890305,25.804244,-97.501804,226.425013,
+ 0.431106,0.146644,-0.890305,27.830378,-98.862903,227.181923,
+ 0.431106,0.146644,-0.890305,25.07441,-98.459198,225.913916,
+ -0.829245,0.509392,0.229941,25.07441,-98.459198,225.913916,
+ -0.829245,0.509392,0.229941,26.545638,-96.722381,227.372063,
+ -0.829245,0.509392,0.229941,25.804244,-97.501804,226.425013,
+ 0.33072,0.426595,-0.841809,25.075322,-96.554449,226.879524,
+ 0.33072,0.426595,-0.841809,26.545638,-96.722381,227.372063,
+ 0.33072,0.426595,-0.841809,25.07441,-98.459198,225.913916,
+ 0.325883,0.094179,-0.940708,26.552636,-95.841043,227.462722,
+ 0.325883,0.094179,-0.940708,26.545638,-96.722381,227.372063,
+ 0.325883,0.094179,-0.940708,25.075322,-96.554449,226.879524,
+ 0.378639,-0.027805,-0.925127,25.304707,-94.615019,226.915118,
+ 0.378639,-0.027805,-0.925127,26.552636,-95.841043,227.462722,
+ 0.378639,-0.027805,-0.925127,25.075322,-96.554449,226.879524,
+ 0.484462,0.105219,-0.868462,25.304707,-94.615019,226.915118,
+ 0.484462,0.105219,-0.868462,26.601311,-95.286746,227.557032,
+ 0.484462,0.105219,-0.868462,26.552636,-95.841043,227.462722,
+ 0.555902,0.354565,-0.751836,26.098124,-93.652758,227.955565,
+ 0.555902,0.354565,-0.751836,26.601311,-95.286746,227.557032,
+ 0.555902,0.354565,-0.751836,25.304707,-94.615019,226.915118,
+ 0.54336,0.353092,-0.761633,26.098124,-93.652758,227.955565,
+ 0.54336,0.353092,-0.761633,27.604339,-95.941741,227.968951,
+ 0.54336,0.353092,-0.761633,26.601311,-95.286746,227.557032,
+ 0.586565,0.381799,-0.714262,26.098124,-93.652758,227.955565,
+ 0.586565,0.381799,-0.714262,27.634761,-94.47173,228.779709,
+ 0.586565,0.381799,-0.714262,27.604339,-95.941741,227.968951,
+ -0.167645,0.478771,-0.861785,27.634761,-94.47173,228.779709,
+ -0.167645,0.478771,-0.861785,28.849529,-96.405988,227.468807,
+ -0.167645,0.478771,-0.861785,27.604339,-95.941741,227.968951,
+ -0.711896,0.028477,-0.701707,29.604918,-95.041237,226.757834,
+ -0.711896,0.028477,-0.701707,28.849529,-96.405988,227.468807,
+ -0.711896,0.028477,-0.701707,27.634761,-94.47173,228.779709,
+ -0.605306,-0.077661,-0.792195,29.604918,-95.041237,226.757834,
+ -0.605306,-0.077661,-0.792195,29.589707,-97.067067,226.968053,
+ -0.605306,-0.077661,-0.792195,28.849529,-96.405988,227.468807,
+ -0.590058,-0.078947,-0.803492,29.604918,-95.041237,226.757834,
+ -0.590058,-0.078947,-0.803492,30.6983,-96.503644,226.09858,
+ -0.590058,-0.078947,-0.803492,29.589707,-97.067067,226.968053,
+ -0.52528,0.395508,-0.753429,29.595791,-98.060968,226.926375,
+ -0.52528,0.395508,-0.753429,30.575394,-98.256889,226.140563,
+ -0.52528,0.395508,-0.753429,28.882385,-99.809954,226.505632,
+ -0.673804,0.65342,-0.345007,30.03935,-98.9131,225.944643,
+ -0.673804,0.65342,-0.345007,28.882385,-99.809954,226.505632,
+ -0.673804,0.65342,-0.345007,30.575394,-98.256889,226.140563,
+ -0.624812,0.025114,-0.780372,30.6983,-96.503644,226.09858,
+ -0.624812,0.025114,-0.780372,30.575394,-98.256889,226.140563,
+ -0.624812,0.025114,-0.780372,29.589707,-97.067067,226.968053,
+ -0.621929,0.029008,-0.782536,29.589707,-97.067067,226.968053,
+ -0.621929,0.029008,-0.782536,30.575394,-98.256889,226.140563,
+ -0.621929,0.029008,-0.782536,29.595791,-98.060968,226.926375,
+ 0.206981,-0.655199,-0.726549,30.897872,-99.224018,225.1278,
+ 0.206981,-0.655199,-0.726549,29.079523,-101.415041,226.585643,
+ 0.206981,-0.655199,-0.726549,28.927106,-101.013161,226.179808,
+ 0.120812,-0.617444,-0.777282,30.897872,-99.224018,225.1278,
+ 0.120812,-0.617444,-0.777282,31.662691,-99.901221,225.784621,
+ 0.120812,-0.617444,-0.777282,29.079523,-101.415041,226.585643,
+ -0.548413,0.199519,-0.812057,30.03935,-98.9131,225.944643,
+ -0.548413,0.199519,-0.812057,28.927106,-101.013161,226.179808,
+ -0.548413,0.199519,-0.812057,28.882385,-99.809954,226.505632,
+ -0.620236,0.245049,-0.745157,30.03935,-98.9131,225.944643,
+ -0.620236,0.245049,-0.745157,30.897872,-99.224018,225.1278,
+ -0.620236,0.245049,-0.745157,28.927106,-101.013161,226.179808,
+ -0.274806,-0.732815,-0.622466,29.079523,-101.415041,226.585643,
+ -0.274806,-0.732815,-0.622466,27.338143,-100.692508,226.503807,
+ -0.274806,-0.732815,-0.622466,28.927106,-101.013161,226.179808,
+ -0.255587,-0.692412,-0.674715,29.079523,-101.415041,226.585643,
+ -0.255587,-0.692412,-0.674715,26.267273,-101.279357,227.511702,
+ -0.255587,-0.692412,-0.674715,27.338143,-100.692508,226.503807,
+ -0.133343,0.295192,-0.946087,27.716598,-99.531893,226.812595,
+ -0.133343,0.295192,-0.946087,28.927106,-101.013161,226.179808,
+ -0.133343,0.295192,-0.946087,27.338143,-100.692508,226.503807,
+ -0.190342,0.250006,-0.949351,27.716598,-99.531893,226.812595,
+ -0.190342,0.250006,-0.949351,28.882385,-99.809954,226.505632,
+ -0.190342,0.250006,-0.949351,28.927106,-101.013161,226.179808,
+ -0.315587,-0.764004,-0.562763,26.267273,-101.279357,227.511702,
+ -0.315587,-0.764004,-0.562763,24.302897,-100.343563,227.342858,
+ -0.315587,-0.764004,-0.562763,24.112756,-99.580873,226.414061,
+ -0.228432,-0.716043,-0.659622,27.338143,-100.692508,226.503807,
+ -0.228432,-0.716043,-0.659622,26.267273,-101.279357,227.511702,
+ -0.228432,-0.716043,-0.659622,24.112756,-99.580873,226.414061,
+ -0.09095,-0.339472,-0.936209,25.07441,-98.459198,225.913916,
+ -0.09095,-0.339472,-0.936209,27.338143,-100.692508,226.503807,
+ -0.09095,-0.339472,-0.936209,24.112756,-99.580873,226.414061,
+ 0.365031,0.126373,-0.922378,25.07441,-98.459198,225.913916,
+ 0.365031,0.126373,-0.922378,27.716598,-99.531893,226.812595,
+ 0.365031,0.126373,-0.922378,27.338143,-100.692508,226.503807,
+ -0.694938,0.655761,-0.295023,31.075234,-98.105081,225.3006,
+ -0.694938,0.655761,-0.295023,30.03935,-98.9131,225.944643,
+ -0.694938,0.655761,-0.295023,30.575394,-98.256889,226.140563,
+ 0.838749,0.441375,0.318885,31.887209,-95.016291,232.272509,
+ 0.838749,0.441375,0.318885,31.687942,-96.135532,234.345797,
+ 0.838749,0.441375,0.318885,32.82422,-98.070399,234.035184,
+ 0.873592,0.414859,0.25442,33.311283,-97.536485,231.492173,
+ 0.873592,0.414859,0.25442,31.887209,-95.016291,232.272509,
+ 0.873592,0.414859,0.25442,32.82422,-98.070399,234.035184,
+ -0.915774,0.084919,0.392616,24.202198,-100.201795,233.51344,
+ -0.915774,0.084919,0.392616,24.963976,-100.983043,235.459258,
+ -0.915774,0.084919,0.392616,25.301057,-98.364888,235.679213,
+ -0.921324,0.112274,0.372231,24.202198,-100.201795,233.51344,
+ -0.921324,0.112274,0.372231,25.301057,-98.364888,235.679213,
+ -0.921324,0.112274,0.372231,24.850196,-97.646919,234.34671,
+ 0.785801,0.383588,0.485157,32.82422,-98.070399,234.035184,
+ 0.785801,0.383588,0.485157,31.687942,-96.135532,234.345797,
+ 0.785801,0.383588,0.485157,32.087084,-98.925574,235.905251,
+ 0.795519,0.378345,0.47329,31.687942,-96.135532,234.345797,
+ 0.795519,0.378345,0.47329,31.108699,-97.290064,236.242332,
+ 0.795519,0.378345,0.47329,32.087084,-98.925574,235.905251,
+ -0.887189,-0.46139,0.00383,26.165966,-102.96476,238.1413,
+ -0.887189,-0.46139,0.00383,25.732447,-102.111411,240.520334,
+ -0.887189,-0.46139,0.00383,25.55265,-101.782848,238.45313,
+ -0.92414,-0.380726,-0.031837,26.165966,-102.96476,238.1413,
+ -0.92414,-0.380726,-0.031837,26.214947,-103.256511,240.208504,
+ -0.92414,-0.380726,-0.031837,25.732447,-102.111411,240.520334,
+ -0.312153,-0.949696,-0.025276,27.440666,-103.663867,240.37674,
+ -0.312153,-0.949696,-0.025276,26.214947,-103.256511,240.208504,
+ -0.312153,-0.949696,-0.025276,26.994369,-103.463079,238.344218,
+ -0.492371,-0.863383,-0.110186,26.994369,-103.463079,238.344218,
+ -0.492371,-0.863383,-0.110186,26.214947,-103.256511,240.208504,
+ -0.492371,-0.863383,-0.110186,26.165966,-102.96476,238.1413,
+ 0.856212,-0.451358,0.25135,30.215801,-103.358122,240.608559,
+ 0.856212,-0.451358,0.25135,31.585419,-101.794105,238.751574,
+ 0.856212,-0.451358,0.25135,30.712903,-102.356007,240.714734,
+ 0.856217,-0.451336,0.251372,31.585419,-101.794105,238.751574,
+ 0.856217,-0.451336,0.251372,30.215801,-103.358122,240.608559,
+ 0.856217,-0.451336,0.251372,31.02595,-103.011002,238.472296,
+ 0.918582,-0.050662,0.391971,31.559864,-100.018043,239.032069,
+ 0.918582,-0.050662,0.391971,30.690695,-100.75092,240.974237,
+ 0.918582,-0.050662,0.391971,30.712903,-102.356007,240.714734,
+ 0.917844,-0.049003,0.393905,31.585419,-101.794105,238.751574,
+ 0.917844,-0.049003,0.393905,31.559864,-100.018043,239.032069,
+ 0.917844,-0.049003,0.393905,30.712903,-102.356007,240.714734,
+ -0.986101,0.093518,0.137327,25.55265,-101.782848,238.45313,
+ -0.986101,0.093518,0.137327,26.018418,-100.432092,240.877798,
+ -0.986101,0.093518,0.137327,25.782644,-99.943812,238.852272,
+ -0.983554,0.144395,0.108495,25.55265,-101.782848,238.45313,
+ -0.983554,0.144395,0.108495,25.732447,-102.111411,240.520334,
+ -0.983554,0.144395,0.108495,26.018418,-100.432092,240.877798,
+ 0.77935,0.392735,0.488234,30.821207,-98.883286,239.263584,
+ 0.77935,0.392735,0.488234,29.980331,-99.62529,241.202709,
+ 0.77935,0.392735,0.488234,30.690695,-100.75092,240.974237,
+ 0.770544,0.400397,0.495927,31.559864,-100.018043,239.032069,
+ 0.770544,0.400397,0.495927,30.821207,-98.883286,239.263584,
+ 0.770544,0.400397,0.495927,30.690695,-100.75092,240.974237,
+ 0.265335,-0.962541,-0.055778,31.02595,-103.011002,238.472296,
+ 0.265335,-0.962541,-0.055778,30.215801,-103.358122,240.608559,
+ 0.265335,-0.962541,-0.055778,28.976391,-103.688814,240.419332,
+ 0.366558,-0.92828,0.062702,31.02595,-103.011002,238.472296,
+ 0.366558,-0.92828,0.062702,28.976391,-103.688814,240.419332,
+ 0.366558,-0.92828,0.062702,29.420558,-103.659608,238.25508,
+ -0.083394,-0.993315,-0.079816,29.420558,-103.659608,238.25508,
+ -0.083394,-0.993315,-0.079816,27.440666,-103.663867,240.37674,
+ -0.083394,-0.993315,-0.079816,26.994369,-103.463079,238.344218,
+ -0.015776,-0.999736,-0.016729,29.420558,-103.659608,238.25508,
+ -0.015776,-0.999736,-0.016729,28.976391,-103.688814,240.419332,
+ -0.015776,-0.999736,-0.016729,27.440666,-103.663867,240.37674,
+ -0.808907,0.517803,0.278477,25.782644,-99.943812,238.852272,
+ -0.808907,0.517803,0.278477,27.068296,-99.187511,241.180501,
+ -0.808907,0.517803,0.278477,27.143439,-98.108731,239.392879,
+ -0.770536,0.593387,0.232735,25.782644,-99.943812,238.852272,
+ -0.770536,0.593387,0.232735,26.018418,-100.432092,240.877798,
+ -0.770536,0.593387,0.232735,27.068296,-99.187511,241.180501,
+ 0.084897,0.889073,0.449824,29.317122,-98.205779,239.174446,
+ 0.084897,0.889073,0.449824,27.143439,-98.108731,239.392879,
+ 0.084897,0.889073,0.449824,28.848312,-99.264784,241.356038,
+ -0.013731,0.856353,0.516208,28.848312,-99.264784,241.356038,
+ -0.013731,0.856353,0.516208,27.143439,-98.108731,239.392879,
+ -0.013731,0.856353,0.516208,27.068296,-99.187511,241.180501,
+ 0.341494,0.818831,0.461408,30.821207,-98.883286,239.263584,
+ 0.341494,0.818831,0.461408,29.317122,-98.205779,239.174446,
+ 0.341494,0.818831,0.461408,29.980331,-99.62529,241.202709,
+ 0.325065,0.82143,0.468599,29.980331,-99.62529,241.202709,
+ 0.325065,0.82143,0.468599,29.317122,-98.205779,239.174446,
+ 0.325065,0.82143,0.468599,28.848312,-99.264784,241.356038,
+ -0.631145,0.215131,-0.745235,31.075234,-98.105081,225.3006,
+ -0.631145,0.215131,-0.745235,30.897872,-99.224018,225.1278,
+ -0.631145,0.215131,-0.745235,30.03935,-98.9131,225.944643,
+ 0.782556,-0.027994,-0.621951,30.897872,-99.224018,225.1278,
+ 0.782556,-0.027994,-0.621951,31.075234,-98.105081,225.3006,
+ 0.782556,-0.027994,-0.621951,31.869564,-97.86018,226.289025,
+ 0.699332,0.103891,-0.707207,31.869564,-97.86018,226.289025,
+ 0.699332,0.103891,-0.707207,31.662691,-99.901221,225.784621,
+ 0.699332,0.103891,-0.707207,30.897872,-99.224018,225.1278,
+ 0.669573,0.154388,-0.726524,31.540089,-95.910711,226.195324,
+ 0.669573,0.154388,-0.726524,33.040219,-96.37952,227.478237,
+ 0.669573,0.154388,-0.726524,31.075234,-98.105081,225.3006,
+ 0.788475,-0.142912,-0.598234,31.075234,-98.105081,225.3006,
+ 0.788475,-0.142912,-0.598234,33.040219,-96.37952,227.478237,
+ 0.788475,-0.142912,-0.598234,31.869564,-97.86018,226.289025,
+ 0.137249,-0.033327,-0.989976,31.540089,-95.910711,226.195324,
+ 0.137249,-0.033327,-0.989976,30.575394,-98.256889,226.140563,
+ 0.137249,-0.033327,-0.989976,30.6983,-96.503644,226.09858,
+ -0.831003,0.351748,-0.430937,31.075234,-98.105081,225.3006,
+ -0.831003,0.351748,-0.430937,30.575394,-98.256889,226.140563,
+ -0.831003,0.351748,-0.430937,31.540089,-95.910711,226.195324,
+ 0.325451,0.792309,0.516069,31.108699,-97.290064,236.242332,
+ 0.325451,0.792309,0.516069,29.776501,-95.409653,234.195511,
+ 0.325451,0.792309,0.516069,29.549854,-96.605559,236.17449,
+ 0.255755,0.789103,0.558486,31.687942,-96.135532,234.345797,
+ 0.255755,0.789103,0.558486,29.776501,-95.409653,234.195511,
+ 0.255755,0.789103,0.558486,31.108699,-97.290064,236.242332,
+ -0.03835,-0.205493,0.977907,27.068296,-99.187511,241.180501,
+ -0.03835,-0.205493,0.977907,26.018418,-100.432092,240.877798,
+ -0.03835,-0.205493,0.977907,29.980331,-99.62529,241.202709,
+ -0.102691,-0.644655,0.757545,27.068296,-99.187511,241.180501,
+ -0.102691,-0.644655,0.757545,29.980331,-99.62529,241.202709,
+ -0.102691,-0.644655,0.757545,28.848312,-99.264784,241.356038,
+ -0.031915,-0.403606,0.914376,30.215801,-103.358122,240.608559,
+ -0.031915,-0.403606,0.914376,27.440666,-103.663867,240.37674,
+ -0.031915,-0.403606,0.914376,28.976391,-103.688814,240.419332,
+ 0.460571,-0.85928,-0.222515,31.02595,-103.011002,238.472296,
+ 0.460571,-0.85928,-0.222515,29.403826,-103.652307,237.591262,
+ 0.460571,-0.85928,-0.222515,30.80052,-102.908174,237.608603,
+ 0.376815,-0.926079,-0.019684,31.02595,-103.011002,238.472296,
+ 0.376815,-0.926079,-0.019684,29.420558,-103.659608,238.25508,
+ 0.376815,-0.926079,-0.019684,29.403826,-103.652307,237.591262,
+ -0.090558,-0.995853,-0.008671,29.420558,-103.659608,238.25508,
+ -0.090558,-0.995853,-0.008671,27.137963,-103.444826,237.426373,
+ -0.090558,-0.995853,-0.008671,29.403826,-103.652307,237.591262,
+ -0.081886,-0.996108,-0.032621,29.420558,-103.659608,238.25508,
+ -0.081886,-0.996108,-0.032621,26.994369,-103.463079,238.344218,
+ -0.081886,-0.996108,-0.032621,27.137963,-103.444826,237.426373,
+ -0.793742,0.539864,0.280217,25.770475,-99.523983,238.008962,
+ -0.793742,0.539864,0.280217,25.782644,-99.943812,238.852272,
+ -0.793742,0.539864,0.280217,27.163518,-97.806028,238.645095,
+ -0.814327,0.545276,0.198862,27.163518,-97.806028,238.645095,
+ -0.814327,0.545276,0.198862,25.782644,-99.943812,238.852272,
+ -0.814327,0.545276,0.198862,27.143439,-98.108731,239.392879,
+ 0.081869,0.923056,0.375852,29.349066,-97.914028,238.434268,
+ 0.081869,0.923056,0.375852,27.163518,-97.806028,238.645095,
+ 0.081869,0.923056,0.375852,27.143439,-98.108731,239.392879,
+ 0.078388,0.926316,0.368503,29.349066,-97.914028,238.434268,
+ 0.078388,0.926316,0.368503,27.143439,-98.108731,239.392879,
+ 0.078388,0.926316,0.368503,29.317122,-98.205779,239.174446,
+ 0.32486,0.875011,0.358917,30.758537,-98.465891,238.503935,
+ 0.32486,0.875011,0.358917,29.349066,-97.914028,238.434268,
+ 0.32486,0.875011,0.358917,29.317122,-98.205779,239.174446,
+ 0.349778,0.832934,0.428807,30.821207,-98.883286,239.263584,
+ 0.349778,0.832934,0.428807,30.758537,-98.465891,238.503935,
+ 0.349778,0.832934,0.428807,29.317122,-98.205779,239.174446,
+ 0.32842,-0.915013,-0.23429,31.566252,-101.988504,235.090234,
+ 0.32842,-0.915013,-0.23429,30.80052,-102.908174,237.608603,
+ 0.32842,-0.915013,-0.23429,29.02963,-103.034732,235.620497,
+ 0.444894,-0.827032,-0.343639,30.80052,-102.908174,237.608603,
+ 0.444894,-0.827032,-0.343639,29.403826,-103.652307,237.591262,
+ 0.444894,-0.827032,-0.343639,29.02963,-103.034732,235.620497,
+ -0.070258,-0.965758,-0.249752,29.403826,-103.652307,237.591262,
+ -0.070258,-0.965758,-0.249752,27.137963,-103.444826,237.426373,
+ -0.070258,-0.965758,-0.249752,26.64299,-102.717426,234.75285,
+ -0.019521,-0.955114,-0.295596,29.403826,-103.652307,237.591262,
+ -0.019521,-0.955114,-0.295596,26.64299,-102.717426,234.75285,
+ -0.019521,-0.955114,-0.295596,29.02963,-103.034732,235.620497,
+ -0.77803,0.481439,0.403592,26.465627,-96.964239,236.295571,
+ -0.77803,0.481439,0.403592,25.770475,-99.523983,238.008962,
+ -0.77803,0.481439,0.403592,27.163518,-97.806028,238.645095,
+ -0.784218,0.477881,0.395766,25.301057,-98.364888,235.679213,
+ -0.784218,0.477881,0.395766,25.770475,-99.523983,238.008962,
+ -0.784218,0.477881,0.395766,26.465627,-96.964239,236.295571,
+ 0.091131,0.858263,0.505054,29.549854,-96.605559,236.17449,
+ 0.091131,0.858263,0.505054,27.163518,-97.806028,238.645095,
+ 0.091131,0.858263,0.505054,29.349066,-97.914028,238.434268,
+ -0.093784,0.928083,0.360371,29.549854,-96.605559,236.17449,
+ -0.093784,0.928083,0.360371,26.465627,-96.964239,236.295571,
+ -0.093784,0.928083,0.360371,27.163518,-97.806028,238.645095,
+ 0.30009,0.826551,0.476193,31.108699,-97.290064,236.242332,
+ 0.30009,0.826551,0.476193,29.349066,-97.914028,238.434268,
+ 0.30009,0.826551,0.476193,30.758537,-98.465891,238.503935,
+ 0.331283,0.803467,0.494663,31.108699,-97.290064,236.242332,
+ 0.331283,0.803467,0.494663,29.549854,-96.605559,236.17449,
+ 0.331283,0.803467,0.494663,29.349066,-97.914028,238.434268,
+ -0.034021,-0.202532,0.978685,26.018418,-100.432092,240.877798,
+ -0.034021,-0.202532,0.978685,25.732447,-102.111411,240.520334,
+ -0.034021,-0.202532,0.978685,30.690695,-100.75092,240.974237,
+ -0.035137,-0.220044,0.974857,29.980331,-99.62529,241.202709,
+ -0.035137,-0.220044,0.974857,26.018418,-100.432092,240.877798,
+ -0.035137,-0.220044,0.974857,30.690695,-100.75092,240.974237,
+ -0.995331,0.09649,0.00259,25.770475,-99.523983,238.008962,
+ -0.995331,0.09649,0.00259,25.560256,-101.692798,238.021131,
+ -0.995331,0.09649,0.00259,25.55265,-101.782848,238.45313,
+ -0.991656,0.109122,0.068634,25.770475,-99.523983,238.008962,
+ -0.991656,0.109122,0.068634,25.55265,-101.782848,238.45313,
+ -0.991656,0.109122,0.068634,25.782644,-99.943812,238.852272,
+ 0.802906,0.547909,0.234815,31.662387,-99.506946,237.842552,
+ 0.802906,0.547909,0.234815,30.758537,-98.465891,238.503935,
+ 0.802906,0.547909,0.234815,30.821207,-98.883286,239.263584,
+ 0.829814,0.483207,0.27914,31.662387,-99.506946,237.842552,
+ 0.829814,0.483207,0.27914,30.821207,-98.883286,239.263584,
+ 0.829814,0.483207,0.27914,31.559864,-100.018043,239.032069,
+ -0.963462,0.094792,0.250509,24.963976,-100.983043,235.459258,
+ -0.963462,0.094792,0.250509,25.560256,-101.692798,238.021131,
+ -0.963462,0.094792,0.250509,25.770475,-99.523983,238.008962,
+ -0.963818,0.10345,0.245667,24.963976,-100.983043,235.459258,
+ -0.963818,0.10345,0.245667,25.770475,-99.523983,238.008962,
+ -0.963818,0.10345,0.245667,25.301057,-98.364888,235.679213,
+ 0.841476,0.438258,0.315988,32.087084,-98.925574,235.905251,
+ 0.841476,0.438258,0.315988,31.108699,-97.290064,236.242332,
+ 0.841476,0.438258,0.315988,31.662387,-99.506946,237.842552,
+ 0.805155,0.465943,0.366909,31.108699,-97.290064,236.242332,
+ 0.805155,0.465943,0.366909,30.758537,-98.465891,238.503935,
+ 0.805155,0.465943,0.366909,31.662387,-99.506946,237.842552,
+ 0.363491,-0.862663,-0.351691,32.73782,-100.967527,229.511369,
+ 0.363491,-0.862663,-0.351691,29.617696,-102.055129,228.954334,
+ 0.363491,-0.862663,-0.351691,31.662691,-99.901221,225.784621,
+ 0.402004,-0.856822,-0.322874,31.662691,-99.901221,225.784621,
+ 0.402004,-0.856822,-0.322874,29.617696,-102.055129,228.954334,
+ 0.402004,-0.856822,-0.322874,29.079523,-101.415041,226.585643,
+ -0.150861,-0.962422,-0.225798,29.617696,-102.055129,228.954334,
+ -0.150861,-0.962422,-0.225798,25.973392,-101.525779,229.132914,
+ -0.150861,-0.962422,-0.225798,29.079523,-101.415041,226.585643,
+ -0.102502,-0.980509,-0.167617,29.079523,-101.415041,226.585643,
+ -0.102502,-0.980509,-0.167617,25.973392,-101.525779,229.132914,
+ -0.102502,-0.980509,-0.167617,26.267273,-101.279357,227.511702,
+ -0.669609,0.683308,0.291055,26.996803,-93.451057,231.026102,
+ -0.669609,0.683308,0.291055,24.421848,-94.78934,228.24397,
+ -0.669609,0.683308,0.291055,24.439189,-95.584582,230.150848,
+ -0.754763,0.106606,0.647277,24.421848,-94.78934,228.24397,
+ -0.754763,0.106606,0.647277,26.996803,-93.451057,231.026102,
+ -0.754763,0.106606,0.647277,25.899162,-93.09481,229.687515,
+ -0.106996,0.93551,0.33671,29.980027,-92.810056,230.193135,
+ -0.106996,0.93551,0.33671,25.899162,-93.09481,229.687515,
+ -0.106996,0.93551,0.33671,26.996803,-93.451057,231.026102,
+ -0.133074,0.743583,0.655268,29.980027,-92.810056,230.193135,
+ -0.133074,0.743583,0.655268,29.118463,-92.584626,229.762354,
+ -0.133074,0.743583,0.655268,25.899162,-93.09481,229.687515,
+ 0.450522,0.724212,-0.52206,32.057575,-94.147426,230.130769,
+ 0.450522,0.724212,-0.52206,29.118463,-92.584626,229.762354,
+ 0.450522,0.724212,-0.52206,29.980027,-92.810056,230.193135,
+ 0.479343,0.849799,-0.219254,32.057575,-94.147426,230.130769,
+ 0.479343,0.849799,-0.219254,31.37885,-94.584901,226.951321,
+ 0.479343,0.849799,-0.219254,29.118463,-92.584626,229.762354,
+ 0.329606,-0.928104,-0.173158,32.73782,-100.967527,229.511369,
+ 0.329606,-0.928104,-0.173158,32.424773,-101.300349,230.699365,
+ 0.329606,-0.928104,-0.173158,29.506045,-102.276909,230.3778,
+ 0.345564,-0.930954,-0.11794,32.73782,-100.967527,229.511369,
+ 0.345564,-0.930954,-0.11794,29.506045,-102.276909,230.3778,
+ 0.345564,-0.930954,-0.11794,29.617696,-102.055129,228.954334,
+ -0.099246,-0.981988,-0.160781,29.617696,-102.055129,228.954334,
+ -0.099246,-0.981988,-0.160781,29.506045,-102.276909,230.3778,
+ -0.099246,-0.981988,-0.160781,26.526472,-101.969946,230.342205,
+ -0.151413,-0.948266,-0.279044,29.617696,-102.055129,228.954334,
+ -0.151413,-0.948266,-0.279044,26.526472,-101.969946,230.342205,
+ -0.151413,-0.948266,-0.279044,25.973392,-101.525779,229.132914,
+ -0.661747,0.699922,0.268699,26.484794,-94.334829,231.933298,
+ -0.661747,0.699922,0.268699,24.439189,-95.584582,230.150848,
+ -0.661747,0.699922,0.268699,24.363742,-96.209155,231.591959,
+ -0.669624,0.684293,0.288697,26.996803,-93.451057,231.026102,
+ -0.669624,0.684293,0.288697,24.439189,-95.584582,230.150848,
+ -0.669624,0.684293,0.288697,26.484794,-94.334829,231.933298,
+ -0.092114,0.738735,0.667672,29.825785,-93.894312,231.906831,
+ -0.092114,0.738735,0.667672,26.996803,-93.451057,231.026102,
+ -0.092114,0.738735,0.667672,26.484794,-94.334829,231.933298,
+ -0.033155,0.845942,0.532243,29.980027,-92.810056,230.193135,
+ -0.033155,0.845942,0.532243,26.996803,-93.451057,231.026102,
+ -0.033155,0.845942,0.532243,29.825785,-93.894312,231.906831,
+ 0.332974,0.78301,0.52538,31.887209,-95.016291,232.272509,
+ 0.332974,0.78301,0.52538,29.980027,-92.810056,230.193135,
+ 0.332974,0.78301,0.52538,29.825785,-93.894312,231.906831,
+ 0.513085,0.780389,0.357403,32.057575,-94.147426,230.130769,
+ 0.513085,0.780389,0.357403,29.980027,-92.810056,230.193135,
+ 0.513085,0.780389,0.357403,31.887209,-95.016291,232.272509,
+ 0.255327,-0.957723,-0.132571,32.424773,-101.300349,230.699365,
+ 0.255327,-0.957723,-0.132571,31.739356,-101.802623,233.007819,
+ 0.255327,-0.957723,-0.132571,29.367015,-102.464311,233.21895,
+ 0.321568,-0.945737,-0.046645,32.424773,-101.300349,230.699365,
+ 0.321568,-0.945737,-0.046645,29.367015,-102.464311,233.21895,
+ 0.321568,-0.945737,-0.046645,29.506045,-102.276909,230.3778,
+ -0.019692,-0.997574,-0.066764,29.506045,-102.276909,230.3778,
+ -0.019692,-0.997574,-0.066764,29.367015,-102.464311,233.21895,
+ -0.019692,-0.997574,-0.066764,26.724826,-102.399511,233.030027,
+ -0.099551,-0.983682,-0.149864,29.506045,-102.276909,230.3778,
+ -0.099551,-0.983682,-0.149864,26.724826,-102.399511,233.030027,
+ -0.099551,-0.983682,-0.149864,26.526472,-101.969946,230.342205,
+ -0.63124,0.636246,0.443539,26.651204,-95.821269,234.291037,
+ -0.63124,0.636246,0.443539,24.363742,-96.209155,231.591959,
+ -0.63124,0.636246,0.443539,24.850196,-97.646919,234.34671,
+ -0.632237,0.634487,0.444637,26.651204,-95.821269,234.291037,
+ -0.632237,0.634487,0.444637,26.484794,-94.334829,231.933298,
+ -0.632237,0.634487,0.444637,24.363742,-96.209155,231.591959,
+ -0.094146,0.839151,0.535689,29.776501,-95.409653,234.195511,
+ -0.094146,0.839151,0.535689,26.484794,-94.334829,231.933298,
+ -0.094146,0.839151,0.535689,26.651204,-95.821269,234.291037,
+ -0.10513,0.830222,0.547429,29.825785,-93.894312,231.906831,
+ -0.10513,0.830222,0.547429,26.484794,-94.334829,231.933298,
+ -0.10513,0.830222,0.547429,29.776501,-95.409653,234.195511,
+ 0.262363,0.801983,0.536645,31.687942,-96.135532,234.345797,
+ 0.262363,0.801983,0.536645,29.825785,-93.894312,231.906831,
+ 0.262363,0.801983,0.536645,29.776501,-95.409653,234.195511,
+ 0.356119,0.80754,0.470168,31.887209,-95.016291,232.272509,
+ 0.356119,0.80754,0.470168,29.825785,-93.894312,231.906831,
+ 0.356119,0.80754,0.470168,31.687942,-96.135532,234.345797,
+ -0.491296,-0.865001,-0.101987,26.724826,-102.399511,233.030027,
+ -0.491296,-0.865001,-0.101987,25.290409,-101.648686,233.571851,
+ -0.491296,-0.865001,-0.101987,26.526472,-101.969946,230.342205,
+ -0.49614,-0.861974,-0.104142,26.526472,-101.969946,230.342205,
+ -0.49614,-0.861974,-0.104142,25.290409,-101.648686,233.571851,
+ -0.49614,-0.861974,-0.104142,24.859323,-101.100778,231.090597,
+ -0.799297,-0.600904,0.006177,24.859323,-101.100778,231.090597,
+ -0.799297,-0.600904,0.006177,25.290409,-101.648686,233.571851,
+ -0.799297,-0.600904,0.006177,24.202198,-100.201795,233.51344,
+ -0.869901,-0.490258,-0.054028,24.859323,-101.100778,231.090597,
+ -0.869901,-0.490258,-0.054028,24.202198,-100.201795,233.51344,
+ -0.869901,-0.490258,-0.054028,23.610786,-98.908537,231.300512,
+ 0.982529,-0.064083,0.174729,33.311283,-97.536485,231.492173,
+ 0.982529,-0.064083,0.174729,32.82422,-98.070399,234.035184,
+ 0.982529,-0.064083,0.174729,32.753944,-100.111744,233.681676,
+ 0.986672,-0.121612,0.10812,33.086157,-99.803869,230.996288,
+ 0.986672,-0.121612,0.10812,33.311283,-97.536485,231.492173,
+ 0.986672,-0.121612,0.10812,32.753944,-100.111744,233.681676,
+ 0.848691,-0.527008,0.044572,33.086157,-99.803869,230.996288,
+ 0.848691,-0.527008,0.044572,32.753944,-100.111744,233.681676,
+ 0.848691,-0.527008,0.044572,31.739356,-101.802623,233.007819,
+ 0.888205,-0.426466,0.170932,32.424773,-101.300349,230.699365,
+ 0.888205,-0.426466,0.170932,33.086157,-99.803869,230.996288,
+ 0.888205,-0.426466,0.170932,31.739356,-101.802623,233.007819,
+ -0.570646,-0.802299,-0.175156,26.724826,-102.399511,233.030027,
+ -0.570646,-0.802299,-0.175156,26.64299,-102.717426,234.75285,
+ -0.570646,-0.802299,-0.175156,25.60376,-102.12358,235.418492,
+ -0.499142,-0.855875,-0.135404,26.724826,-102.399511,233.030027,
+ -0.499142,-0.855875,-0.135404,25.60376,-102.12358,235.418492,
+ -0.499142,-0.855875,-0.135404,25.290409,-101.648686,233.571851,
+ -0.871607,-0.489713,0.021963,25.290409,-101.648686,233.571851,
+ -0.871607,-0.489713,0.021963,25.60376,-102.12358,235.418492,
+ -0.871607,-0.489713,0.021963,24.963976,-100.983043,235.459258,
+ -0.798487,-0.597611,0.072662,24.202198,-100.201795,233.51344,
+ -0.798487,-0.597611,0.072662,25.290409,-101.648686,233.571851,
+ -0.798487,-0.597611,0.072662,24.963976,-100.983043,235.459258,
+ 0.933929,-0.025304,0.356561,32.82422,-98.070399,234.035184,
+ 0.933929,-0.025304,0.356561,32.087084,-98.925574,235.905251,
+ 0.933929,-0.025304,0.356561,32.246802,-100.927065,235.34487,
+ 0.963609,-0.077479,0.255843,32.753944,-100.111744,233.681676,
+ 0.963609,-0.077479,0.255843,32.82422,-98.070399,234.035184,
+ 0.963609,-0.077479,0.255843,32.246802,-100.927065,235.34487,
+ 0.842578,-0.538528,-0.007075,32.753944,-100.111744,233.681676,
+ 0.842578,-0.538528,-0.007075,32.246802,-100.927065,235.34487,
+ 0.842578,-0.538528,-0.007075,31.566252,-101.988504,235.090234,
+ 0.852914,-0.521483,0.024351,31.739356,-101.802623,233.007819,
+ 0.852914,-0.521483,0.024351,32.753944,-100.111744,233.681676,
+ 0.852914,-0.521483,0.024351,31.566252,-101.988504,235.090234,
+ -0.095761,0.11996,0.98815,26.214947,-103.256511,240.208504,
+ -0.095761,0.11996,0.98815,27.440666,-103.663867,240.37674,
+ -0.095761,0.11996,0.98815,30.215801,-103.358122,240.608559,
+ -0.100734,-0.055279,0.993377,30.712903,-102.356007,240.714734,
+ -0.100734,-0.055279,0.993377,26.214947,-103.256511,240.208504,
+ -0.100734,-0.055279,0.993377,30.215801,-103.358122,240.608559,
+ -0.051261,-0.282454,0.95791,25.732447,-102.111411,240.520334,
+ -0.051261,-0.282454,0.95791,26.214947,-103.256511,240.208504,
+ -0.051261,-0.282454,0.95791,30.712903,-102.356007,240.714734,
+ -0.046347,-0.160056,0.986019,30.690695,-100.75092,240.974237,
+ -0.046347,-0.160056,0.986019,25.732447,-102.111411,240.520334,
+ -0.046347,-0.160056,0.986019,30.712903,-102.356007,240.714734,
+ -0.854949,-0.433972,-0.284133,25.560256,-101.692798,238.021131,
+ -0.854949,-0.433972,-0.284133,26.195476,-102.957763,238.041819,
+ -0.854949,-0.433972,-0.284133,26.165966,-102.96476,238.1413,
+ -0.893771,-0.435682,-0.106554,25.560256,-101.692798,238.021131,
+ -0.893771,-0.435682,-0.106554,26.165966,-102.96476,238.1413,
+ -0.893771,-0.435682,-0.106554,25.55265,-101.782848,238.45313,
+ -0.505825,-0.857257,-0.096183,27.137963,-103.444826,237.426373,
+ -0.505825,-0.857257,-0.096183,26.994369,-103.463079,238.344218,
+ -0.505825,-0.857257,-0.096183,26.195476,-102.957763,238.041819,
+ -0.468741,-0.860497,-0.19957,26.994369,-103.463079,238.344218,
+ -0.468741,-0.860497,-0.19957,26.165966,-102.96476,238.1413,
+ -0.468741,-0.860497,-0.19957,26.195476,-102.957763,238.041819,
+ 0.860415,-0.498708,-0.104766,30.80052,-102.908174,237.608603,
+ 0.860415,-0.498708,-0.104766,31.607931,-101.541294,237.733031,
+ 0.860415,-0.498708,-0.104766,31.585419,-101.794105,238.751574,
+ 0.89588,-0.348689,-0.275345,30.80052,-102.908174,237.608603,
+ 0.89588,-0.348689,-0.275345,31.585419,-101.794105,238.751574,
+ 0.89588,-0.348689,-0.275345,31.02595,-103.011002,238.472296,
+ 0.996879,-0.030603,0.072771,31.607931,-101.541294,237.733031,
+ 0.996879,-0.030603,0.072771,31.662387,-99.506946,237.842552,
+ 0.996879,-0.030603,0.072771,31.559864,-100.018043,239.032069,
+ 0.99964,0.010483,0.024697,31.607931,-101.541294,237.733031,
+ 0.99964,0.010483,0.024697,31.559864,-100.018043,239.032069,
+ 0.99964,0.010483,0.024697,31.585419,-101.794105,238.751574,
+ -0.522013,-0.842568,-0.132597,27.137963,-103.444826,237.426373,
+ -0.522013,-0.842568,-0.132597,26.195476,-102.957763,238.041819,
+ -0.522013,-0.842568,-0.132597,26.64299,-102.717426,234.75285,
+ -0.555582,-0.82034,-0.135541,26.64299,-102.717426,234.75285,
+ -0.555582,-0.82034,-0.135541,26.195476,-102.957763,238.041819,
+ -0.555582,-0.82034,-0.135541,25.60376,-102.12358,235.418492,
+ -0.892477,-0.447204,0.059102,25.60376,-102.12358,235.418492,
+ -0.892477,-0.447204,0.059102,26.195476,-102.957763,238.041819,
+ -0.892477,-0.447204,0.059102,25.560256,-101.692798,238.021131,
+ -0.869201,-0.489957,0.066567,25.60376,-102.12358,235.418492,
+ -0.869201,-0.489957,0.066567,25.560256,-101.692798,238.021131,
+ -0.869201,-0.489957,0.066567,24.963976,-100.983043,235.459258,
+ 0.978403,-0.037137,0.203342,32.087084,-98.925574,235.905251,
+ 0.978403,-0.037137,0.203342,31.662387,-99.506946,237.842552,
+ 0.978403,-0.037137,0.203342,31.607931,-101.541294,237.733031,
+ 0.965737,0.004414,0.259485,32.246802,-100.927065,235.34487,
+ 0.965737,0.004414,0.259485,32.087084,-98.925574,235.905251,
+ 0.965737,0.004414,0.259485,31.607931,-101.541294,237.733031,
+ 0.853134,-0.512715,0.096358,32.246802,-100.927065,235.34487,
+ 0.853134,-0.512715,0.096358,31.607931,-101.541294,237.733031,
+ 0.853134,-0.512715,0.096358,30.80052,-102.908174,237.608603,
+ 0.834717,-0.548058,0.053661,31.566252,-101.988504,235.090234,
+ 0.834717,-0.548058,0.053661,32.246802,-100.927065,235.34487,
+ 0.834717,-0.548058,0.053661,30.80052,-102.908174,237.608603,
+ -0.928011,0.272765,0.253762,23.194912,-97.900946,228.090337,
+ -0.928011,0.272765,0.253762,23.367103,-98.604313,229.476079,
+ -0.928011,0.272765,0.253762,24.439189,-95.584582,230.150848,
+ -0.921418,0.355588,0.156673,23.194912,-97.900946,228.090337,
+ -0.921418,0.355588,0.156673,24.439189,-95.584582,230.150848,
+ -0.921418,0.355588,0.156673,24.421848,-94.78934,228.24397,
+ 0.857928,0.45145,-0.245261,31.37885,-94.584901,226.951321,
+ 0.857928,0.45145,-0.245261,32.057575,-94.147426,230.130769,
+ 0.857928,0.45145,-0.245261,33.319193,-96.577875,230.070229,
+ 0.737592,0.674676,-0.027756,31.37885,-94.584901,226.951321,
+ 0.737592,0.674676,-0.027756,33.319193,-96.577875,230.070229,
+ 0.737592,0.674676,-0.027756,33.040219,-96.37952,227.478237,
+ -0.95398,0.247879,0.168754,23.367103,-98.604313,229.476079,
+ -0.95398,0.247879,0.168754,23.610786,-98.908537,231.300512,
+ -0.95398,0.247879,0.168754,24.363742,-96.209155,231.591959,
+ -0.944762,0.315878,0.087439,23.367103,-98.604313,229.476079,
+ -0.944762,0.315878,0.087439,24.363742,-96.209155,231.591959,
+ -0.944762,0.315878,0.087439,24.439189,-95.584582,230.150848,
+ 0.875117,0.420166,0.240065,32.057575,-94.147426,230.130769,
+ 0.875117,0.420166,0.240065,31.887209,-95.016291,232.272509,
+ 0.875117,0.420166,0.240065,33.311283,-97.536485,231.492173,
+ 0.850415,0.434034,0.297337,33.319193,-96.577875,230.070229,
+ 0.850415,0.434034,0.297337,32.057575,-94.147426,230.130769,
+ 0.850415,0.434034,0.297337,33.311283,-97.536485,231.492173,
+ -0.936042,0.130875,0.326645,23.610786,-98.908537,231.300512,
+ -0.936042,0.130875,0.326645,24.202198,-100.201795,233.51344,
+ -0.936042,0.130875,0.326645,24.850196,-97.646919,234.34671,
+ -0.931075,0.229051,0.283963,23.610786,-98.908537,231.300512,
+ -0.931075,0.229051,0.283963,24.850196,-97.646919,234.34671,
+ -0.931075,0.229051,0.283963,24.363742,-96.209155,231.591959,
+ 0.371493,-0.926986,-0.051864,31.739356,-101.802623,233.007819,
+ 0.371493,-0.926986,-0.051864,31.566252,-101.988504,235.090234,
+ 0.371493,-0.926986,-0.051864,29.02963,-103.034732,235.620497,
+ 0.24794,-0.949807,-0.190768,31.739356,-101.802623,233.007819,
+ 0.24794,-0.949807,-0.190768,29.02963,-103.034732,235.620497,
+ 0.24794,-0.949807,-0.190768,29.367015,-102.464311,233.21895,
+ -0.043036,-0.970654,-0.236598,29.367015,-102.464311,233.21895,
+ -0.043036,-0.970654,-0.236598,29.02963,-103.034732,235.620497,
+ -0.043036,-0.970654,-0.236598,26.64299,-102.717426,234.75285,
+ -0.011103,-0.983242,-0.181966,29.367015,-102.464311,233.21895,
+ -0.011103,-0.983242,-0.181966,26.64299,-102.717426,234.75285,
+ -0.011103,-0.983242,-0.181966,26.724826,-102.399511,233.030027,
+ -0.765066,0.422115,0.486306,24.850196,-97.646919,234.34671,
+ -0.765066,0.422115,0.486306,25.301057,-98.364888,235.679213,
+ -0.765066,0.422115,0.486306,26.465627,-96.964239,236.295571,
+ -0.669517,0.670244,0.320186,26.651204,-95.821269,234.291037,
+ -0.669517,0.670244,0.320186,24.850196,-97.646919,234.34671,
+ -0.669517,0.670244,0.320186,26.465627,-96.964239,236.295571,
+ -0.081909,0.86903,0.487932,29.549854,-96.605559,236.17449,
+ -0.081909,0.86903,0.487932,26.651204,-95.821269,234.291037,
+ -0.081909,0.86903,0.487932,26.465627,-96.964239,236.295571,
+ -0.097347,0.856694,0.506555,29.776501,-95.409653,234.195511,
+ -0.097347,0.856694,0.506555,26.651204,-95.821269,234.291037,
+ -0.097347,0.856694,0.506555,29.549854,-96.605559,236.17449,
+ -0.948365,-0.090434,0.304014,23.478449,-118.459209,219.627425,
+ -0.948365,-0.090434,0.304014,23.80549,-119.546811,220.324098,
+ -0.948365,-0.090434,0.304014,23.507046,-116.52343,220.292459,
+ 0.391072,0.916573,0.083402,33.690347,-115.040032,221.503576,
+ 0.391072,0.916573,0.083402,32.749989,-114.462918,219.570535,
+ 0.391072,0.916573,0.083402,31.798376,-114.410287,223.454262,
+ -0.239822,-0.942009,-0.234743,29.50422,-122.597268,217.83889,
+ -0.239822,-0.942009,-0.234743,26.667632,-121.78073,217.460131,
+ -0.239822,-0.942009,-0.234743,28.538308,-122.040233,216.590353,
+ -0.75473,-0.499431,-0.425384,25.748571,-121.616145,219.306164,
+ -0.75473,-0.499431,-0.425384,23.80549,-119.546811,220.324098,
+ -0.75473,-0.499431,-0.425384,23.478449,-118.459209,219.627425,
+ -0.817837,0.501044,0.283015,24.606513,-114.724855,220.285462,
+ -0.817837,0.501044,0.283015,23.507046,-116.52343,220.292459,
+ -0.817837,0.501044,0.283015,23.805794,-116.475362,221.070665,
+ 0.811596,0.551982,0.191382,32.749989,-114.462918,219.570535,
+ 0.811596,0.551982,0.191382,31.362726,-112.843836,220.783781,
+ 0.811596,0.551982,0.191382,31.798376,-114.410287,223.454262,
+ -0.21106,-0.904783,-0.369894,29.50422,-122.597268,217.83889,
+ -0.21106,-0.904783,-0.369894,27.110887,-122.328638,218.547428,
+ -0.21106,-0.904783,-0.369894,26.667632,-121.78073,217.460131,
+ -0.928136,-0.087833,0.361731,23.507046,-116.52343,220.292459,
+ -0.928136,-0.087833,0.361731,23.80549,-119.546811,220.324098,
+ -0.928136,-0.087833,0.361731,23.805794,-116.475362,221.070665,
+ -0.3811,0.792809,0.475622,27.601297,-112.901639,219.645982,
+ -0.3811,0.792809,0.475622,24.606513,-114.724855,220.285462,
+ -0.3811,0.792809,0.475622,25.01539,-114.860844,220.839759,
+ -0.773935,-0.303653,-0.555716,25.43096,-121.088924,218.345119,
+ -0.773935,-0.303653,-0.555716,23.478449,-118.459209,219.627425,
+ -0.773935,-0.303653,-0.555716,24.162649,-118.043943,218.447643,
+ -0.571551,-0.802471,-0.171377,27.110887,-122.328638,218.547428,
+ -0.571551,-0.802471,-0.171377,25.43096,-121.088924,218.345119,
+ -0.571551,-0.802471,-0.171377,26.667632,-121.78073,217.460131,
+ -0.608969,0.539411,0.581543,24.606513,-114.724855,220.285462,
+ -0.608969,0.539411,0.581543,23.805794,-116.475362,221.070665,
+ -0.608969,0.539411,0.581543,25.01539,-114.860844,220.839759,
+ 0.081304,0.835986,-0.542694,30.052736,-114.249961,217.936242,
+ 0.081304,0.835986,-0.542694,27.601297,-112.901639,219.645982,
+ 0.081304,0.835986,-0.542694,27.917386,-112.316007,220.595466,
+ -0.875361,0.096144,-0.473814,24.162649,-118.043943,218.447643,
+ -0.875361,0.096144,-0.473814,23.478449,-118.459209,219.627425,
+ -0.875361,0.096144,-0.473814,24.033354,-116.705356,218.958131,
+ -0.813268,-0.579797,-0.049299,25.43096,-121.088924,218.345119,
+ -0.813268,-0.579797,-0.049299,25.748571,-121.616145,219.306164,
+ -0.813268,-0.579797,-0.049299,23.478449,-118.459209,219.627425,
+ -0.652708,0.7224,-0.228278,27.917386,-112.316007,220.595466,
+ -0.652708,0.7224,-0.228278,27.601297,-112.901639,219.645982,
+ -0.652708,0.7224,-0.228278,25.01539,-114.860844,220.839759,
+ 0.064376,0.830943,-0.55262,30.765838,-113.419429,219.268136,
+ 0.064376,0.830943,-0.55262,30.052736,-114.249961,217.936242,
+ 0.064376,0.830943,-0.55262,27.917386,-112.316007,220.595466,
+ -0.491916,-0.191301,-0.849366,24.870579,-119.4668,217.979746,
+ -0.491916,-0.191301,-0.849366,26.648466,-120.494165,217.181461,
+ -0.491916,-0.191301,-0.849366,26.667632,-121.78073,217.460131,
+ -0.669054,-0.375587,-0.641327,26.667632,-121.78073,217.460131,
+ -0.669054,-0.375587,-0.641327,25.43096,-121.088924,218.345119,
+ -0.669054,-0.375587,-0.641327,24.870579,-119.4668,217.979746,
+ -0.554871,-0.792967,-0.251638,27.110887,-122.328638,218.547428,
+ -0.554871,-0.792967,-0.251638,25.748571,-121.616145,219.306164,
+ -0.554871,-0.792967,-0.251638,25.43096,-121.088924,218.345119,
+ -0.913686,0.144058,-0.380033,24.033354,-116.705356,218.958131,
+ -0.913686,0.144058,-0.380033,23.478449,-118.459209,219.627425,
+ -0.913686,0.144058,-0.380033,23.507046,-116.52343,220.292459,
+ -0.725815,0.582614,-0.365723,24.033354,-116.705356,218.958131,
+ -0.725815,0.582614,-0.365723,23.507046,-116.52343,220.292459,
+ -0.725815,0.582614,-0.365723,25.186973,-115.174803,219.106897,
+ -0.365961,0.795016,-0.483759,27.037569,-114.373476,219.023844,
+ -0.365961,0.795016,-0.483759,25.186973,-115.174803,219.106897,
+ -0.365961,0.795016,-0.483759,24.606513,-114.724855,220.285462,
+ -0.456435,0.489018,-0.743322,27.601297,-112.901639,219.645982,
+ -0.456435,0.489018,-0.743322,27.037569,-114.373476,219.023844,
+ -0.456435,0.489018,-0.743322,24.606513,-114.724855,220.285462,
+ -0.435679,-0.196738,-0.878338,26.648466,-120.494165,217.181461,
+ -0.435679,-0.196738,-0.878338,28.538308,-122.040233,216.590353,
+ -0.435679,-0.196738,-0.878338,26.667632,-121.78073,217.460131,
+ -0.283374,0.51258,-0.810531,27.601297,-112.901639,219.645982,
+ -0.283374,0.51258,-0.810531,30.052736,-114.249961,217.936242,
+ -0.283374,0.51258,-0.810531,29.002858,-115.144989,217.737279,
+ 0.840914,0.46966,-0.268857,33.940115,-116.755249,219.288519,
+ 0.840914,0.46966,-0.268857,32.749989,-114.462918,219.570535,
+ 0.840914,0.46966,-0.268857,33.690347,-115.040032,221.503576,
+ -0.278547,0.507937,-0.815115,30.052736,-114.249961,217.936242,
+ -0.278547,0.507937,-0.815115,29.716568,-116.100558,216.897924,
+ -0.278547,0.507937,-0.815115,29.002858,-115.144989,217.737279,
+ 0.855972,0.451037,-0.252739,33.940115,-116.755249,219.288519,
+ 0.855972,0.451037,-0.252739,33.690347,-115.040032,221.503576,
+ 0.855972,0.451037,-0.252739,34.557082,-117.114842,220.736322,
+ -0.170307,0.505515,-0.845843,30.052736,-114.249961,217.936242,
+ -0.170307,0.505515,-0.845843,30.939854,-115.611061,216.944166,
+ -0.170307,0.505515,-0.845843,29.716568,-116.100558,216.897924,
+ 0.91509,-0.043878,-0.400855,33.579609,-119.037539,218.71536,
+ 0.91509,-0.043878,-0.400855,33.940115,-116.755249,219.288519,
+ 0.91509,-0.043878,-0.400855,34.557082,-117.114842,220.736322,
+ 0.031147,0.016572,-0.999377,30.939854,-115.611061,216.944166,
+ 0.031147,0.016572,-0.999377,30.485648,-117.289162,216.902183,
+ 0.031147,0.016572,-0.999377,29.716568,-116.100558,216.897924,
+ 0.920298,-0.061819,-0.386304,33.579609,-119.037539,218.71536,
+ 0.920298,-0.061819,-0.386304,34.557082,-117.114842,220.736322,
+ 0.920298,-0.061819,-0.386304,34.205094,-119.520343,220.282724,
+ -0.263821,0.095421,-0.95984,30.939854,-115.611061,216.944166,
+ -0.263821,0.095421,-0.95984,31.574466,-116.938087,216.637812,
+ -0.263821,0.095421,-0.95984,30.485648,-117.289162,216.902183,
+ 0.858426,-0.420646,-0.293534,34.205094,-119.520343,220.282724,
+ 0.858426,-0.420646,-0.293534,34.51084,-120.109017,222.020453,
+ 0.858426,-0.420646,-0.293534,33.110799,-122.756378,221.71988,
+ -0.373087,0.690119,-0.620115,31.574466,-116.938087,216.637812,
+ -0.373087,0.690119,-0.620115,29.938956,-118.265114,216.144969,
+ -0.373087,0.690119,-0.620115,30.485648,-117.289162,216.902183,
+ 0.91014,-0.380532,-0.163833,32.864378,-122.581753,219.945339,
+ 0.91014,-0.380532,-0.163833,34.205094,-119.520343,220.282724,
+ 0.91014,-0.380532,-0.163833,33.110799,-122.756378,221.71988,
+ 0.074511,0.26519,-0.961313,31.574466,-116.938087,216.637812,
+ 0.074511,0.26519,-0.961313,31.438174,-118.579378,216.174479,
+ 0.074511,0.26519,-0.961313,29.938956,-118.265114,216.144969,
+ -0.415751,-0.166338,-0.894138,26.648466,-120.494165,217.181461,
+ -0.415751,-0.166338,-0.894138,28.043639,-120.573264,216.547458,
+ -0.415751,-0.166338,-0.894138,28.538308,-122.040233,216.590353,
+ -0.897587,-0.365573,-0.24636,24.870579,-119.4668,217.979746,
+ -0.897587,-0.365573,-0.24636,25.43096,-121.088924,218.345119,
+ -0.897587,-0.365573,-0.24636,24.162649,-118.043943,218.447643,
+ 0.720575,-0.002499,-0.693372,31.438174,-118.579378,216.174479,
+ 0.720575,-0.002499,-0.693372,32.979679,-118.765867,217.777132,
+ 0.720575,-0.002499,-0.693372,32.129067,-121.272675,216.902183,
+ 0.615158,-0.054704,-0.786504,31.438174,-118.579378,216.174479,
+ 0.615158,-0.054704,-0.786504,32.129067,-121.272675,216.902183,
+ 0.615158,-0.054704,-0.786504,30.709252,-120.871404,215.763776,
+ 0.219619,-0.801378,-0.556382,32.129067,-121.272675,216.902183,
+ 0.219619,-0.801378,-0.556382,28.538308,-122.040233,216.590353,
+ 0.219619,-0.801378,-0.556382,30.709252,-120.871404,215.763776,
+ -0.726316,0.441948,-0.526446,25.186973,-115.174803,219.106897,
+ -0.726316,0.441948,-0.526446,23.507046,-116.52343,220.292459,
+ -0.726316,0.441948,-0.526446,24.606513,-114.724855,220.285462,
+ 0.220794,-0.815671,-0.534726,32.129067,-121.272675,216.902183,
+ 0.220794,-0.815671,-0.534726,29.50422,-122.597268,217.83889,
+ 0.220794,-0.815671,-0.534726,28.538308,-122.040233,216.590353,
+ -0.344222,0.474333,-0.810259,27.601297,-112.901639,219.645982,
+ -0.344222,0.474333,-0.810259,29.002858,-115.144989,217.737279,
+ -0.344222,0.474333,-0.810259,27.037569,-114.373476,219.023844,
+ 0.677693,0.147115,-0.720479,32.855555,-116.438855,217.94476,
+ 0.677693,0.147115,-0.720479,31.438174,-118.579378,216.174479,
+ 0.677693,0.147115,-0.720479,31.574466,-116.938087,216.637812,
+ 0.892185,-0.154615,-0.424382,32.129067,-121.272675,216.902183,
+ 0.892185,-0.154615,-0.424382,32.979679,-118.765867,217.777132,
+ 0.892185,-0.154615,-0.424382,32.698271,-122.001293,218.364285,
+ 0.806351,-0.172783,-0.565636,32.979679,-118.765867,217.777132,
+ 0.806351,-0.172783,-0.565636,33.579609,-119.037539,218.71536,
+ 0.806351,-0.172783,-0.565636,32.698271,-122.001293,218.364285,
+ 0.723023,0.087925,-0.685205,31.438174,-118.579378,216.174479,
+ 0.723023,0.087925,-0.685205,32.855555,-116.438855,217.94476,
+ 0.723023,0.087925,-0.685205,32.979679,-118.765867,217.777132,
+ 0.510408,0.507539,-0.694181,31.622838,-114.488473,218.464375,
+ 0.510408,0.507539,-0.694181,32.855555,-116.438855,217.94476,
+ 0.510408,0.507539,-0.694181,31.574466,-116.938087,216.637812,
+ 0.362025,0.691548,-0.62506,30.939854,-115.611061,216.944166,
+ 0.362025,0.691548,-0.62506,30.052736,-114.249961,217.936242,
+ 0.362025,0.691548,-0.62506,30.765838,-113.419429,219.268136,
+ 0.276903,0.709333,-0.648206,31.622838,-114.488473,218.464375,
+ 0.276903,0.709333,-0.648206,30.939854,-115.611061,216.944166,
+ 0.276903,0.709333,-0.648206,30.765838,-113.419429,219.268136,
+ 0.23792,-0.829174,-0.50583,32.698271,-122.001293,218.364285,
+ 0.23792,-0.829174,-0.50583,29.50422,-122.597268,217.83889,
+ 0.23792,-0.829174,-0.50583,32.129067,-121.272675,216.902183,
+ 0.641786,0.450233,-0.620807,31.574466,-116.938087,216.637812,
+ 0.641786,0.450233,-0.620807,30.939854,-115.611061,216.944166,
+ 0.641786,0.450233,-0.620807,31.622838,-114.488473,218.464375,
+ -0.647687,0.165792,-0.743649,24.861757,-116.913445,218.090788,
+ -0.647687,0.165792,-0.743649,25.53318,-117.483562,217.378903,
+ -0.647687,0.165792,-0.743649,24.162649,-118.043943,218.447643,
+ -0.170335,0.505739,-0.845703,27.037569,-114.373476,219.023844,
+ -0.170335,0.505739,-0.845703,28.29219,-116.120637,217.726327,
+ -0.170335,0.505739,-0.845703,27.119101,-115.501844,218.332646,
+ -0.81939,0.127281,-0.558926,29.598225,-117.63324,216.722387,
+ -0.81939,0.127281,-0.558926,29.103861,-116.861423,217.622891,
+ -0.81939,0.127281,-0.558926,29.716568,-116.100558,216.897924,
+ 0.052901,0.159807,-0.98573,29.938956,-118.265114,216.144969,
+ 0.052901,0.159807,-0.98573,31.438174,-118.579378,216.174479,
+ 0.052901,0.159807,-0.98573,30.709252,-120.871404,215.763776,
+ -0.296732,-0.196623,-0.9345,29.29613,-119.768286,215.980383,
+ -0.296732,-0.196623,-0.9345,30.709252,-120.871404,215.763776,
+ -0.296732,-0.196623,-0.9345,28.043639,-120.573264,216.547458,
+ 0.897468,-0.43807,0.051439,33.568048,-123.420195,226.818375,
+ 0.897468,-0.43807,0.051439,34.605453,-121.252901,227.175839,
+ 0.897468,-0.43807,0.051439,34.230953,-121.795333,229.090322,
+ -0.050343,0.129953,-0.990241,29.938956,-118.265114,216.144969,
+ -0.050343,0.129953,-0.990241,30.709252,-120.871404,215.763776,
+ -0.050343,0.129953,-0.990241,29.29613,-119.768286,215.980383,
+ 0.15124,-0.988476,0.006424,31.898465,-124.047506,227.210824,
+ 0.15124,-0.988476,0.006424,31.721407,-124.062108,229.132305,
+ 0.15124,-0.988476,0.006424,30.243181,-124.285713,229.527493,
+ 0.356911,-0.933782,0.025792,33.568048,-123.420195,226.818375,
+ 0.356911,-0.933782,0.025792,31.721407,-124.062108,229.132305,
+ 0.356911,-0.933782,0.025792,31.898465,-124.047506,227.210824,
+ -0.676074,-0.73519,0.049181,30.243181,-124.285713,229.527493,
+ -0.676074,-0.73519,0.049181,29.530992,-123.591777,230.110691,
+ -0.676074,-0.73519,0.049181,29.86716,-124.042029,228.001199,
+ -0.416569,0.691364,-0.590327,30.485648,-117.289162,216.902183,
+ -0.416569,0.691364,-0.590327,29.938956,-118.265114,216.144969,
+ -0.416569,0.691364,-0.590327,29.374925,-118.386499,216.400821,
+ 0.160147,0.100103,-0.982004,29.716568,-116.100558,216.897924,
+ 0.160147,0.100103,-0.982004,30.485648,-117.289162,216.902183,
+ 0.160147,0.100103,-0.982004,29.598225,-117.63324,216.722387,
+ -0.758625,0.145637,0.635041,28.126692,-120.311631,229.575864,
+ -0.758625,0.145637,0.635041,29.220379,-120.89848,231.016975,
+ -0.758625,0.145637,0.635041,29.712005,-119.680061,231.32485,
+ -0.771198,0.104723,0.627922,28.126692,-120.311631,229.575864,
+ -0.771198,0.104723,0.627922,29.168965,-121.067324,230.981989,
+ -0.771198,0.104723,0.627922,29.220379,-120.89848,231.016975,
+ -0.169687,0.741702,0.64891,31.049984,-118.921934,230.948829,
+ -0.169687,0.741702,0.64891,30.777094,-117.650885,229.424665,
+ -0.169687,0.741702,0.64891,29.119985,-118.445215,229.899255,
+ 0.911169,-0.411072,0.028133,33.568048,-123.420195,226.818375,
+ 0.911169,-0.411072,0.028133,34.230953,-121.795333,229.090322,
+ 0.911169,-0.411072,0.028133,33.437536,-123.557096,229.044993,
+ -0.201803,0.69729,0.687795,31.049984,-118.921934,230.948829,
+ -0.201803,0.69729,0.687795,29.119985,-118.445215,229.899255,
+ -0.201803,0.69729,0.687795,29.712005,-119.680061,231.32485,
+ -0.292787,-0.126443,-0.947781,28.043639,-120.573264,216.547458,
+ -0.292787,-0.126443,-0.947781,30.709252,-120.871404,215.763776,
+ -0.292787,-0.126443,-0.947781,28.538308,-122.040233,216.590353,
+ -0.013607,-0.036612,-0.999237,26.629909,-117.838591,217.084413,
+ -0.013607,-0.036612,-0.999237,27.569049,-118.320483,217.089281,
+ -0.013607,-0.036612,-0.999237,26.648466,-120.494165,217.181461,
+ 0.280056,-0.95904,-0.04255,33.568048,-123.420195,226.818375,
+ 0.280056,-0.95904,-0.04255,33.437536,-123.557096,229.044993,
+ 0.280056,-0.95904,-0.04255,31.721407,-124.062108,229.132305,
+ -0.426588,-0.036008,-0.903729,26.629909,-117.838591,217.084413,
+ -0.426588,-0.036008,-0.903729,26.648466,-120.494165,217.181461,
+ -0.426588,-0.036008,-0.903729,24.870579,-119.4668,217.979746,
+ -0.314712,-0.937276,0.149901,29.86716,-124.042029,228.001199,
+ -0.314712,-0.937276,0.149901,29.530992,-123.591777,230.110691,
+ -0.314712,-0.937276,0.149901,28.499671,-123.481953,228.63216,
+ -0.308958,-0.179724,-0.93394,25.53318,-117.483562,217.378903,
+ -0.308958,-0.179724,-0.93394,26.629909,-117.838591,217.084413,
+ -0.308958,-0.179724,-0.93394,24.870579,-119.4668,217.979746,
+ -0.797194,0.023025,0.603284,27.758581,-122.096515,229.157556,
+ -0.797194,0.023025,0.603284,29.168965,-121.067324,230.981989,
+ -0.797194,0.023025,0.603284,28.126692,-120.311631,229.575864,
+ -0.604473,-0.039101,-0.795666,25.53318,-117.483562,217.378903,
+ -0.604473,-0.039101,-0.795666,24.870579,-119.4668,217.979746,
+ -0.604473,-0.039101,-0.795666,24.162649,-118.043943,218.447643,
+ -0.795833,0.01766,0.605259,27.758581,-122.096515,229.157556,
+ -0.795833,0.01766,0.605259,28.816673,-122.794101,230.569157,
+ -0.795833,0.01766,0.605259,29.168965,-121.067324,230.981989,
+ -0.683742,0.201434,-0.701371,24.033354,-116.705356,218.958131,
+ -0.683742,0.201434,-0.701371,24.861757,-116.913445,218.090788,
+ -0.683742,0.201434,-0.701371,24.162649,-118.043943,218.447643,
+ -0.757956,0.303317,0.577496,28.126692,-120.311631,229.575864,
+ -0.757956,0.303317,0.577496,29.712005,-119.680061,231.32485,
+ -0.757956,0.303317,0.577496,29.119985,-118.445215,229.899255,
+ -0.416798,0.709452,-0.568294,25.747658,-116.009899,218.569028,
+ -0.416798,0.709452,-0.568294,24.861757,-116.913445,218.090788,
+ -0.416798,0.709452,-0.568294,24.033354,-116.705356,218.958131,
+ -0.780173,-0.538228,0.318812,28.499671,-123.481953,228.63216,
+ -0.780173,-0.538228,0.318812,28.816673,-122.794101,230.569157,
+ -0.780173,-0.538228,0.318812,27.758581,-122.096515,229.157556,
+ -0.058435,-0.987947,-0.143337,31.898465,-124.047506,227.210824,
+ -0.058435,-0.987947,-0.143337,30.243181,-124.285713,229.527493,
+ -0.058435,-0.987947,-0.143337,29.86716,-124.042029,228.001199,
+ -0.337007,0.339371,-0.878211,25.186973,-115.174803,219.106897,
+ -0.337007,0.339371,-0.878211,25.747658,-116.009899,218.569028,
+ -0.337007,0.339371,-0.878211,24.033354,-116.705356,218.958131,
+ -0.585999,-0.728588,0.354633,29.530992,-123.591777,230.110691,
+ -0.585999,-0.728588,0.354633,28.816673,-122.794101,230.569157,
+ -0.585999,-0.728588,0.354633,28.499671,-123.481953,228.63216,
+ -0.427391,0.320802,-0.845235,27.037569,-114.373476,219.023844,
+ -0.427391,0.320802,-0.845235,29.002858,-115.144989,217.737279,
+ -0.427391,0.320802,-0.845235,28.29219,-116.120637,217.726327,
+ -0.070084,0.062226,-0.995598,29.002858,-115.144989,217.737279,
+ -0.070084,0.062226,-0.995598,29.103861,-116.861423,217.622891,
+ -0.070084,0.062226,-0.995598,28.29219,-116.120637,217.726327,
+ 0.038679,0.382604,-0.923102,30.485648,-117.289162,216.902183,
+ 0.038679,0.382604,-0.923102,29.374925,-118.386499,216.400821,
+ 0.038679,0.382604,-0.923102,29.598225,-117.63324,216.722387,
+ -0.762831,-0.001797,-0.646595,29.716568,-116.100558,216.897924,
+ -0.762831,-0.001797,-0.646595,29.103861,-116.861423,217.622891,
+ -0.762831,-0.001797,-0.646595,29.002858,-115.144989,217.737279,
+ 0.347496,0.763188,0.544784,32.430249,-119.18235,230.515613,
+ 0.347496,0.763188,0.544784,32.376402,-118.13521,229.083021,
+ 0.347496,0.763188,0.544784,30.777094,-117.650885,229.424665,
+ 0.321833,0.754683,0.571732,32.430249,-119.18235,230.515613,
+ 0.321833,0.754683,0.571732,30.777094,-117.650885,229.424665,
+ 0.321833,0.754683,0.571732,31.049984,-118.921934,230.948829,
+ 0.545507,0.691863,0.47302,33.535496,-118.68616,228.552149,
+ 0.545507,0.691863,0.47302,32.376402,-118.13521,229.083021,
+ 0.545507,0.691863,0.47302,33.033831,-119.400479,230.17549,
+ 0.526716,0.69557,0.488623,33.033831,-119.400479,230.17549,
+ 0.526716,0.69557,0.488623,32.376402,-118.13521,229.083021,
+ 0.526716,0.69557,0.488623,32.430249,-119.18235,230.515613,
+ 0.799121,0.470339,0.374415,34.322829,-119.452806,227.834788,
+ 0.799121,0.470339,0.374415,33.535496,-118.68616,228.552149,
+ 0.799121,0.470339,0.374415,33.915168,-120.227056,229.677475,
+ 0.974366,0.07539,0.21196,34.605453,-121.252901,227.175839,
+ 0.974366,0.07539,0.21196,34.322829,-119.452806,227.834788,
+ 0.974366,0.07539,0.21196,34.230953,-121.795333,229.090322,
+ 0.36428,-0.196942,0.910227,28.816673,-122.794101,230.569157,
+ 0.36428,-0.196942,0.910227,29.530992,-123.591777,230.110691,
+ 0.36428,-0.196942,0.910227,31.721407,-124.062108,229.132305,
+ 0.962105,0.098537,0.254251,34.322829,-119.452806,227.834788,
+ 0.962105,0.098537,0.254251,33.915168,-120.227056,229.677475,
+ 0.962105,0.098537,0.254251,34.230953,-121.795333,229.090322,
+ 0.192557,-0.509331,0.838751,28.816673,-122.794101,230.569157,
+ 0.192557,-0.509331,0.838751,31.721407,-124.062108,229.132305,
+ 0.192557,-0.509331,0.838751,33.437536,-123.557096,229.044993,
+ 0.732785,0.509748,0.450759,33.535496,-118.68616,228.552149,
+ 0.732785,0.509748,0.450759,33.033831,-119.400479,230.17549,
+ 0.732785,0.509748,0.450759,33.915168,-120.227056,229.677475,
+ 0.24424,0.828658,0.503659,31.362726,-112.843836,220.783781,
+ 0.24424,0.828658,0.503659,29.350587,-113.583406,222.976326,
+ 0.24424,0.828658,0.503659,29.787757,-114.301375,223.945585,
+ -0.857481,0.372954,0.354446,26.032108,-115.180888,222.542198,
+ -0.857481,0.372954,0.354446,25.474465,-117.816687,223.966576,
+ -0.857481,0.372954,0.354446,26.49027,-115.470205,223.955016,
+ 0.163789,0.862338,0.47911,31.798376,-114.410287,223.454262,
+ 0.163789,0.862338,0.47911,31.362726,-112.843836,220.783781,
+ 0.163789,0.862338,0.47911,29.787757,-114.301375,223.945585,
+ -0.444773,0.838098,0.315861,29.350587,-113.583406,222.976326,
+ -0.444773,0.838098,0.315861,26.032108,-115.180888,222.542198,
+ -0.444773,0.838098,0.315861,26.49027,-115.470205,223.955016,
+ -0.490579,-0.868983,-0.064817,27.802389,-122.801098,219.647808,
+ -0.490579,-0.868983,-0.064817,25.748571,-121.616145,219.306164,
+ -0.490579,-0.868983,-0.064817,27.110887,-122.328638,218.547428,
+ -0.253108,0.719286,0.646965,29.787757,-114.301375,223.945585,
+ -0.253108,0.719286,0.646965,29.350587,-113.583406,222.976326,
+ -0.253108,0.719286,0.646965,26.49027,-115.470205,223.955016,
+ -0.712211,-0.697786,0.07648,26.283397,-122.081912,220.269642,
+ -0.712211,-0.697786,0.07648,24.460485,-120.059429,221.746651,
+ -0.712211,-0.697786,0.07648,23.80549,-119.546811,220.324098,
+ -0.713285,-0.698445,0.0583,25.748571,-121.616145,219.306164,
+ -0.713285,-0.698445,0.0583,26.283397,-122.081912,220.269642,
+ -0.713285,-0.698445,0.0583,23.80549,-119.546811,220.324098,
+ -0.881601,-0.073091,0.466303,23.805794,-116.475362,221.070665,
+ -0.881601,-0.073091,0.466303,24.460485,-120.059429,221.746651,
+ -0.881601,-0.073091,0.466303,24.862365,-117.488733,222.909397,
+ -0.916765,-0.094255,0.388147,23.80549,-119.546811,220.324098,
+ -0.916765,-0.094255,0.388147,24.460485,-120.059429,221.746651,
+ -0.916765,-0.094255,0.388147,23.805794,-116.475362,221.070665,
+ -0.56159,0.684964,0.464156,27.917386,-112.316007,220.595466,
+ -0.56159,0.684964,0.464156,25.01539,-114.860844,220.839759,
+ -0.56159,0.684964,0.464156,26.032108,-115.180888,222.542198,
+ -0.726525,0.450761,0.518629,25.01539,-114.860844,220.839759,
+ -0.726525,0.450761,0.518629,24.862365,-117.488733,222.909397,
+ -0.726525,0.450761,0.518629,26.032108,-115.180888,222.542198,
+ -0.474808,0.868425,-0.142811,31.362726,-112.843836,220.783781,
+ -0.474808,0.868425,-0.142811,30.765838,-113.419429,219.268136,
+ -0.474808,0.868425,-0.142811,29.350587,-113.583406,222.976326,
+ 0.435089,0.876781,0.204826,30.765838,-113.419429,219.268136,
+ 0.435089,0.876781,0.204826,27.917386,-112.316007,220.595466,
+ 0.435089,0.876781,0.204826,29.350587,-113.583406,222.976326,
+ 0.586409,0.533108,-0.609853,32.749989,-114.462918,219.570535,
+ 0.586409,0.533108,-0.609853,32.855555,-116.438855,217.94476,
+ 0.586409,0.533108,-0.609853,31.622838,-114.488473,218.464375,
+ 0.454716,0.749795,-0.480667,32.749989,-114.462918,219.570535,
+ 0.454716,0.749795,-0.480667,31.622838,-114.488473,218.464375,
+ 0.454716,0.749795,-0.480667,31.362726,-112.843836,220.783781,
+ 0.842759,0.002061,-0.538288,32.979679,-118.765867,217.777132,
+ 0.842759,0.002061,-0.538288,33.940115,-116.755249,219.288519,
+ 0.842759,0.002061,-0.538288,33.579609,-119.037539,218.71536,
+ 0.841588,-0.320667,-0.434628,33.579609,-119.037539,218.71536,
+ 0.841588,-0.320667,-0.434628,34.205094,-119.520343,220.282724,
+ 0.841588,-0.320667,-0.434628,32.864378,-122.581753,219.945339,
+ 0.250191,-0.90008,-0.356736,32.864378,-122.581753,219.945339,
+ 0.250191,-0.90008,-0.356736,30.166516,-122.910011,218.881467,
+ 0.250191,-0.90008,-0.356736,32.698271,-122.001293,218.364285,
+ -0.096333,-0.982808,-0.157505,30.733895,-123.205108,220.375816,
+ -0.096333,-0.982808,-0.157505,27.802389,-122.801098,219.647808,
+ -0.096333,-0.982808,-0.157505,30.166516,-122.910011,218.881467,
+ -0.078638,-0.971731,-0.22261,30.733895,-123.205108,220.375816,
+ -0.078638,-0.971731,-0.22261,28.30223,-123.148827,220.989133,
+ -0.078638,-0.971731,-0.22261,27.802389,-122.801098,219.647808,
+ -0.402021,-0.894032,-0.197701,28.30223,-123.148827,220.989133,
+ -0.402021,-0.894032,-0.197701,26.669153,-122.548288,221.594235,
+ -0.402021,-0.894032,-0.197701,26.283397,-122.081912,220.269642,
+ -0.748336,-0.663138,-0.015549,26.283397,-122.081912,220.269642,
+ -0.748336,-0.663138,-0.015549,26.669153,-122.548288,221.594235,
+ -0.748336,-0.663138,-0.015549,24.460485,-120.059429,221.746651,
+ -0.940666,-0.006401,0.339274,24.460485,-120.059429,221.746651,
+ -0.940666,-0.006401,0.339274,24.9153,-120.511202,222.999143,
+ -0.940666,-0.006401,0.339274,24.862365,-117.488733,222.909397,
+ -0.865447,-0.000281,0.501,24.862365,-117.488733,222.909397,
+ -0.865447,-0.000281,0.501,24.9153,-120.511202,222.999143,
+ -0.865447,-0.000281,0.501,25.474465,-117.816687,223.966576,
+ 0.785082,0.086062,-0.613383,32.979679,-118.765867,217.777132,
+ 0.785082,0.086062,-0.613383,32.855555,-116.438855,217.94476,
+ 0.785082,0.086062,-0.613383,33.940115,-116.755249,219.288519,
+ -0.474072,-0.866597,-0.155776,27.802389,-122.801098,219.647808,
+ -0.474072,-0.866597,-0.155776,26.283397,-122.081912,220.269642,
+ -0.474072,-0.866597,-0.155776,25.748571,-121.616145,219.306164,
+ -0.707678,0.445891,0.548063,26.032108,-115.180888,222.542198,
+ -0.707678,0.445891,0.548063,24.862365,-117.488733,222.909397,
+ -0.707678,0.445891,0.548063,25.474465,-117.816687,223.966576,
+ -0.580869,0.524245,0.622703,25.01539,-114.860844,220.839759,
+ -0.580869,0.524245,0.622703,23.805794,-116.475362,221.070665,
+ -0.580869,0.524245,0.622703,24.862365,-117.488733,222.909397,
+ 0.946303,-0.25839,-0.194283,32.698271,-122.001293,218.364285,
+ 0.946303,-0.25839,-0.194283,33.579609,-119.037539,218.71536,
+ 0.946303,-0.25839,-0.194283,32.864378,-122.581753,219.945339,
+ -0.407534,0.681343,0.60802,29.350587,-113.583406,222.976326,
+ -0.407534,0.681343,0.60802,27.917386,-112.316007,220.595466,
+ -0.407534,0.681343,0.60802,26.032108,-115.180888,222.542198,
+ 0.220071,-0.937736,-0.268737,32.864378,-122.581753,219.945339,
+ 0.220071,-0.937736,-0.268737,30.733895,-123.205108,220.375816,
+ 0.220071,-0.937736,-0.268737,30.166516,-122.910011,218.881467,
+ 0.481361,0.739581,-0.470437,31.622838,-114.488473,218.464375,
+ 0.481361,0.739581,-0.470437,30.765838,-113.419429,219.268136,
+ 0.481361,0.739581,-0.470437,31.362726,-112.843836,220.783781,
+ -0.448345,-0.891563,-0.064057,28.30223,-123.148827,220.989133,
+ -0.448345,-0.891563,-0.064057,26.283397,-122.081912,220.269642,
+ -0.448345,-0.891563,-0.064057,27.802389,-122.801098,219.647808,
+ 0.744471,0.447473,-0.49551,32.855555,-116.438855,217.94476,
+ 0.744471,0.447473,-0.49551,32.749989,-114.462918,219.570535,
+ 0.744471,0.447473,-0.49551,33.940115,-116.755249,219.288519,
+ -0.746628,-0.664499,0.031437,26.669153,-122.548288,221.594235,
+ -0.746628,-0.664499,0.031437,24.9153,-120.511202,222.999143,
+ -0.746628,-0.664499,0.031437,24.460485,-120.059429,221.746651,
+ 0.260058,-0.27439,0.925786,29.168965,-121.067324,230.981989,
+ 0.260058,-0.27439,0.925786,28.816673,-122.794101,230.569157,
+ 0.260058,-0.27439,0.925786,33.437536,-123.557096,229.044993,
+ 0.323483,-0.169634,0.930905,29.168965,-121.067324,230.981989,
+ 0.323483,-0.169634,0.930905,33.437536,-123.557096,229.044993,
+ 0.323483,-0.169634,0.930905,34.230953,-121.795333,229.090322,
+ 0.302863,-0.346537,0.887799,29.712005,-119.680061,231.32485,
+ 0.302863,-0.346537,0.887799,29.220379,-120.89848,231.016975,
+ 0.302863,-0.346537,0.887799,33.915168,-120.227056,229.677475,
+ 0.335346,-0.197446,0.921172,33.033831,-119.400479,230.17549,
+ 0.335346,-0.197446,0.921172,29.712005,-119.680061,231.32485,
+ 0.335346,-0.197446,0.921172,33.915168,-120.227056,229.677475,
+ 0.333824,-0.125796,0.934204,31.049984,-118.921934,230.948829,
+ 0.333824,-0.125796,0.934204,29.712005,-119.680061,231.32485,
+ 0.333824,-0.125796,0.934204,33.033831,-119.400479,230.17549,
+ 0.023415,-0.822137,0.568808,33.033831,-119.400479,230.17549,
+ 0.023415,-0.822137,0.568808,32.430249,-119.18235,230.515613,
+ 0.023415,-0.822137,0.568808,31.049984,-118.921934,230.948829,
+ 0.293155,-0.420671,0.858543,29.530992,-123.591777,230.110691,
+ 0.293155,-0.420671,0.858543,30.243181,-124.285713,229.527493,
+ 0.293155,-0.420671,0.858543,31.721407,-124.062108,229.132305,
+ 0.300269,-0.280828,0.911578,33.915168,-120.227056,229.677475,
+ 0.300269,-0.280828,0.911578,29.168965,-121.067324,230.981989,
+ 0.300269,-0.280828,0.911578,34.230953,-121.795333,229.090322,
+ 0.300227,-0.28034,0.911742,29.168965,-121.067324,230.981989,
+ 0.300227,-0.28034,0.911742,33.915168,-120.227056,229.677475,
+ 0.300227,-0.28034,0.911742,29.220379,-120.89848,231.016975,
+ 0.232162,-0.881198,-0.411814,32.698271,-122.001293,218.364285,
+ 0.232162,-0.881198,-0.411814,30.166516,-122.910011,218.881467,
+ 0.232162,-0.881198,-0.411814,29.50422,-122.597268,217.83889,
+ -0.163924,-0.968693,-0.186447,30.166516,-122.910011,218.881467,
+ -0.163924,-0.968693,-0.186447,27.110887,-122.328638,218.547428,
+ -0.163924,-0.968693,-0.186447,29.50422,-122.597268,217.83889,
+ -0.144498,-0.93892,-0.31233,30.166516,-122.910011,218.881467,
+ -0.144498,-0.93892,-0.31233,27.802389,-122.801098,219.647808,
+ -0.144498,-0.93892,-0.31233,27.110887,-122.328638,218.547428,
+ 0.358283,-0.629564,-0.689407,10.103531,-151.774815,211.665874,
+ 0.358283,-0.629564,-0.689407,10.760047,-152.936647,213.068044,
+ 0.358283,-0.629564,-0.689407,9.398947,-153.977094,213.310815,
+ 0.489331,-0.616948,-0.616385,10.103531,-151.774815,211.665874,
+ 0.489331,-0.616948,-0.616385,9.398947,-153.977094,213.310815,
+ 0.489331,-0.616948,-0.616385,8.676414,-152.460536,211.219273,
+ 0.645372,-0.665454,-0.375055,11.443943,-153.904689,215.962434,
+ 0.645372,-0.665454,-0.375055,10.054855,-155.181214,215.837094,
+ 0.645372,-0.665454,-0.375055,10.760047,-152.936647,213.068044,
+ 0.478961,-0.737621,-0.475933,10.760047,-152.936647,213.068044,
+ 0.478961,-0.737621,-0.475933,10.054855,-155.181214,215.837094,
+ 0.478961,-0.737621,-0.475933,9.398947,-153.977094,213.310815,
+ -0.707023,0.611323,-0.355531,0.827731,-153.602594,211.83624,
+ -0.707023,0.611323,-0.355531,0.655236,-153.534752,212.295923,
+ -0.707023,0.611323,-0.355531,1.172721,-152.689617,212.720011,
+ -0.516898,0.688178,-0.509143,1.641531,-153.130438,211.648229,
+ -0.516898,0.688178,-0.509143,0.827731,-153.602594,211.83624,
+ -0.516898,0.688178,-0.509143,1.172721,-152.689617,212.720011,
+ -0.994763,0.102162,0.003221,0.655236,-153.534752,212.295923,
+ -0.994763,0.102162,0.003221,0.667709,-153.512848,215.453163,
+ -0.994763,0.102162,0.003221,0.806131,-152.166047,215.485715,
+ -0.781348,0.586071,-0.214515,0.655236,-153.534752,212.295923,
+ -0.781348,0.586071,-0.214515,0.806131,-152.166047,215.485715,
+ -0.781348,0.586071,-0.214515,1.172721,-152.689617,212.720011,
+ -0.898509,-0.315811,-0.304869,1.121307,-154.332428,211.748623,
+ -0.898509,-0.315811,-0.304869,0.949421,-154.720923,212.657645,
+ -0.898509,-0.315811,-0.304869,0.655236,-153.534752,212.295923,
+ 0.292609,-0.770053,-0.56692,8.676414,-152.460536,211.219273,
+ 0.292609,-0.770053,-0.56692,7.316227,-154.49458,213.280088,
+ 0.292609,-0.770053,-0.56692,6.845897,-152.934822,210.918699,
+ 0.207243,-0.861118,-0.464249,10.054855,-155.181214,215.837094,
+ 0.207243,-0.861118,-0.464249,7.712632,-155.711782,215.77564,
+ 0.207243,-0.861118,-0.464249,9.398947,-153.977094,213.310815,
+ -0.899605,-0.327137,-0.289295,1.121307,-154.332428,211.748623,
+ -0.899605,-0.327137,-0.289295,0.655236,-153.534752,212.295923,
+ -0.899605,-0.327137,-0.289295,0.827731,-153.602594,211.83624,
+ 0.220971,-0.862282,-0.455677,9.398947,-153.977094,213.310815,
+ 0.220971,-0.862282,-0.455677,7.712632,-155.711782,215.77564,
+ 0.220971,-0.862282,-0.455677,7.316227,-154.49458,213.280088,
+ -0.989996,-0.134856,-0.041487,0.949421,-154.720923,212.657645,
+ -0.989996,-0.134856,-0.041487,0.881579,-155.03975,215.312915,
+ -0.989996,-0.134856,-0.041487,0.667709,-153.512848,215.453163,
+ -0.187518,0.906403,-0.378512,10.922502,-151.199526,214.563611,
+ -0.187518,0.906403,-0.378512,9.365787,-150.73315,216.451627,
+ -0.187518,0.906403,-0.378512,8.883287,-150.157862,218.068275,
+ 0.392697,0.918589,-0.044531,10.922502,-151.199526,214.563611,
+ 0.392697,0.918589,-0.044531,8.883287,-150.157862,218.068275,
+ 0.392697,0.918589,-0.044531,10.326527,-150.804035,217.466215,
+ 0.728198,0.357793,-0.584561,10.057897,-151.424044,211.626933,
+ 0.728198,0.357793,-0.584561,10.026866,-151.140203,211.762009,
+ 0.728198,0.357793,-0.584561,10.230696,-151.393013,211.861186,
+ 0.329638,-0.551371,-0.766374,8.889067,-151.781812,210.967983,
+ 0.329638,-0.551371,-0.766374,6.845897,-152.934822,210.918699,
+ 0.329638,-0.551371,-0.766374,6.735159,-152.530812,210.580402,
+ 0.249191,-0.403952,-0.880185,8.889067,-151.781812,210.967983,
+ 0.249191,-0.403952,-0.880185,8.676414,-152.460536,211.219273,
+ 0.249191,-0.403952,-0.880185,6.845897,-152.934822,210.918699,
+ -0.222224,0.868417,-0.443247,9.022013,-151.506489,211.440748,
+ -0.222224,0.868417,-0.443247,8.889067,-151.781812,210.967983,
+ -0.222224,0.868417,-0.443247,6.735159,-152.530812,210.580402,
+ -0.27648,0.934464,-0.224355,6.735159,-152.530812,210.580402,
+ -0.27648,0.934464,-0.224355,4.523144,-153.157818,210.69479,
+ -0.27648,0.934464,-0.224355,6.703215,-152.321506,211.491554,
+ 0.116457,-0.618674,-0.776969,6.735159,-152.530812,210.580402,
+ 0.116457,-0.618674,-0.776969,6.845897,-152.934822,210.918699,
+ 0.116457,-0.618674,-0.776969,4.928371,-153.526538,211.102451,
+ 0.088108,-0.693613,-0.714939,4.523144,-153.157818,210.69479,
+ 0.088108,-0.693613,-0.714939,4.928371,-153.526538,211.102451,
+ 0.088108,-0.693613,-0.714939,3.05587,-154.082052,211.41063,
+ -0.290073,0.866336,-0.406595,4.523144,-153.157818,210.69479,
+ -0.290073,0.866336,-0.406595,3.341232,-153.478167,210.85542,
+ -0.290073,0.866336,-0.406595,3.712386,-152.972241,211.668612,
+ 0.076608,-0.616179,-0.783872,3.341232,-153.478167,210.85542,
+ 0.076608,-0.616179,-0.783872,1.794556,-154.455335,211.472387,
+ 0.076608,-0.616179,-0.783872,1.68321,-153.709073,210.874891,
+ -0.055057,0.79804,-0.600084,3.712386,-152.972241,211.668612,
+ -0.055057,0.79804,-0.600084,1.68321,-153.709073,210.874891,
+ -0.055057,0.79804,-0.600084,1.641531,-153.130438,211.648229,
+ -0.126419,0.867125,-0.48178,3.712386,-152.972241,211.668612,
+ -0.126419,0.867125,-0.48178,3.341232,-153.478167,210.85542,
+ -0.126419,0.867125,-0.48178,1.68321,-153.709073,210.874891,
+ -0.393606,-0.609627,-0.688062,1.68321,-153.709073,210.874891,
+ -0.393606,-0.609627,-0.688062,1.794556,-154.455335,211.472387,
+ -0.393606,-0.609627,-0.688062,1.121307,-154.332428,211.748623,
+ -0.740518,-0.221713,-0.63441,1.68321,-153.709073,210.874891,
+ -0.740518,-0.221713,-0.63441,1.121307,-154.332428,211.748623,
+ -0.740518,-0.221713,-0.63441,0.827731,-153.602594,211.83624,
+ 0.774526,0.45013,-0.4444,10.026866,-151.140203,211.762009,
+ 0.774526,0.45013,-0.4444,10.559563,-151.299312,212.529263,
+ 0.774526,0.45013,-0.4444,10.230696,-151.393013,211.861186,
+ 0.877941,0.153061,-0.453642,10.230696,-151.393013,211.861186,
+ 0.877941,0.153061,-0.453642,10.559563,-151.299312,212.529263,
+ 0.877941,0.153061,-0.453642,10.828497,-151.958262,212.827403,
+ 0.936474,0.299951,-0.181785,10.559563,-151.299312,212.529263,
+ 0.936474,0.299951,-0.181785,10.922502,-151.199526,214.563611,
+ 0.936474,0.299951,-0.181785,10.828497,-151.958262,212.827403,
+ 0.934566,0.304672,-0.183745,10.828497,-151.958262,212.827403,
+ 0.934566,0.304672,-0.183745,10.922502,-151.199526,214.563611,
+ 0.934566,0.304672,-0.183745,11.464934,-152.420683,215.297704,
+ 0.247998,0.89634,-0.367521,10.326527,-150.804035,217.466215,
+ 0.247998,0.89634,-0.367521,8.883287,-150.157862,218.068275,
+ 0.247998,0.89634,-0.367521,7.817893,-149.075736,219.988539,
+ 0.847506,-0.010807,-0.530676,10.103531,-151.774815,211.665874,
+ 0.847506,-0.010807,-0.530676,10.230696,-151.393013,211.861186,
+ 0.847506,-0.010807,-0.530676,10.828497,-151.958262,212.827403,
+ -0.327624,0.918254,-0.222424,9.022013,-151.506489,211.440748,
+ -0.327624,0.918254,-0.222424,6.735159,-152.530812,210.580402,
+ -0.327624,0.918254,-0.222424,6.703215,-152.321506,211.491554,
+ 0.819009,-0.190427,-0.541259,10.103531,-151.774815,211.665874,
+ 0.819009,-0.190427,-0.541259,10.828497,-151.958262,212.827403,
+ 0.819009,-0.190427,-0.541259,10.760047,-152.936647,213.068044,
+ -0.218766,0.908786,-0.355317,6.703215,-152.321506,211.491554,
+ -0.218766,0.908786,-0.355317,4.523144,-153.157818,210.69479,
+ -0.218766,0.908786,-0.355317,3.712386,-152.972241,211.668612,
+ 0.95343,-0.133256,-0.270582,10.828497,-151.958262,212.827403,
+ 0.95343,-0.133256,-0.270582,11.464934,-152.420683,215.297704,
+ 0.95343,-0.133256,-0.270582,10.760047,-152.936647,213.068044,
+ 0.147678,-0.656022,-0.740153,6.735159,-152.530812,210.580402,
+ 0.147678,-0.656022,-0.740153,4.928371,-153.526538,211.102451,
+ 0.147678,-0.656022,-0.740153,4.523144,-153.157818,210.69479,
+ 0.953342,-0.134541,-0.270257,10.760047,-152.936647,213.068044,
+ 0.953342,-0.134541,-0.270257,11.464934,-152.420683,215.297704,
+ 0.953342,-0.134541,-0.270257,11.443943,-153.904689,215.962434,
+ 0.092364,-0.697224,-0.710878,4.523144,-153.157818,210.69479,
+ 0.092364,-0.697224,-0.710878,3.05587,-154.082052,211.41063,
+ 0.092364,-0.697224,-0.710878,3.341232,-153.478167,210.85542,
+ 0.197921,-0.759801,-0.619298,9.398947,-153.977094,213.310815,
+ 0.197921,-0.759801,-0.619298,7.316227,-154.49458,213.280088,
+ 0.197921,-0.759801,-0.619298,8.676414,-152.460536,211.219273,
+ 0.176791,-0.710126,-0.681518,3.341232,-153.478167,210.85542,
+ 0.176791,-0.710126,-0.681518,3.05587,-154.082052,211.41063,
+ 0.176791,-0.710126,-0.681518,1.794556,-154.455335,211.472387,
+ -0.97097,-0.239137,0.005495,0.655236,-153.534752,212.295923,
+ -0.97097,-0.239137,0.005495,0.949421,-154.720923,212.657645,
+ -0.97097,-0.239137,0.005495,0.667709,-153.512848,215.453163,
+ -0.513581,0.67351,-0.531619,1.68321,-153.709073,210.874891,
+ -0.513581,0.67351,-0.531619,0.827731,-153.602594,211.83624,
+ -0.513581,0.67351,-0.531619,1.641531,-153.130438,211.648229,
+ 0.192717,-0.800678,-0.567253,7.316227,-154.49458,213.280088,
+ 0.192717,-0.800678,-0.567253,4.928371,-153.526538,211.102451,
+ 0.192717,-0.800678,-0.567253,6.845897,-152.934822,210.918699,
+ 0.543209,-0.808611,-0.22599,7.73697,-158.134928,222.443933,
+ 0.543209,-0.808611,-0.22599,6.638111,-158.852289,222.369398,
+ 0.543209,-0.808611,-0.22599,6.036356,-158.645721,220.183851,
+ 0.213108,-0.784467,-0.582405,7.316227,-154.49458,213.280088,
+ 0.213108,-0.784467,-0.582405,5.171142,-155.09877,213.30899,
+ 0.213108,-0.784467,-0.582405,4.928371,-153.526538,211.102451,
+ 0.222053,-0.963088,-0.152166,6.638111,-158.852289,222.369398,
+ 0.222053,-0.963088,-0.152166,4.438265,-158.991928,220.042995,
+ 0.222053,-0.963088,-0.152166,6.036356,-158.645721,220.183851,
+ 0.303466,-0.803384,-0.51233,7.712632,-155.711782,215.77564,
+ 0.303466,-0.803384,-0.51233,5.319299,-156.289504,215.263935,
+ 0.303466,-0.803384,-0.51233,5.171142,-155.09877,213.30899,
+ -0.920772,-0.331542,0.205572,1.300496,-154.471459,219.977587,
+ -0.920772,-0.331542,0.205572,3.00476,-157.532564,222.674231,
+ -0.920772,-0.331542,0.205572,1.65157,-154.110953,222.131495,
+ -0.029974,-0.99566,0.088106,6.638111,-158.852289,222.369398,
+ -0.029974,-0.99566,0.088106,4.766219,-158.777146,222.581747,
+ -0.029974,-0.99566,0.088106,4.438265,-158.991928,220.042995,
+ -0.056191,0.057579,0.996758,8.750341,-154.730658,227.146329,
+ -0.056191,0.057579,0.996758,3.394167,-155.74981,226.903254,
+ -0.056191,0.057579,0.996758,8.227379,-156.009921,227.190746,
+ 0.059342,-0.981949,0.179593,6.639632,-158.243841,224.878641,
+ 0.059342,-0.981949,0.179593,4.906466,-158.338454,224.934009,
+ 0.059342,-0.981949,0.179593,4.766219,-158.777146,222.581747,
+ -0.077267,0.153582,0.98511,8.653902,-152.162396,226.738364,
+ -0.077267,0.153582,0.98511,2.643342,-152.883712,226.379379,
+ -0.077267,0.153582,0.98511,8.750341,-154.730658,227.146329,
+ -0.954553,-0.26304,0.140137,1.65157,-154.110953,222.131495,
+ -0.954553,-0.26304,0.140137,2.709967,-156.756792,224.374541,
+ -0.954553,-0.26304,0.140137,1.804595,-153.783912,223.787692,
+ 0.255861,0.877193,-0.406285,6.527678,-147.643752,222.463404,
+ 0.255861,0.877193,-0.406285,5.572718,-148.602363,219.792314,
+ 0.255861,0.877193,-0.406285,4.631143,-147.186808,222.255619,
+ 0.330436,-0.917293,0.222228,7.487506,-157.914974,224.975384,
+ 0.330436,-0.917293,0.222228,6.639632,-158.243841,224.878641,
+ 0.330436,-0.917293,0.222228,6.638111,-158.852289,222.369398,
+ 0.221623,0.969097,0.108324,6.527678,-147.643752,222.463404,
+ 0.221623,0.969097,0.108324,4.631143,-147.186808,222.255619,
+ 0.221623,0.969097,0.108324,4.569082,-147.290852,223.313407,
+ 0.536359,-0.834625,0.125375,7.73697,-158.134928,222.443933,
+ 0.536359,-0.834625,0.125375,7.487506,-157.914974,224.975384,
+ 0.536359,-0.834625,0.125375,6.638111,-158.852289,222.369398,
+ -0.560741,-0.80729,0.18399,4.906466,-158.338454,224.934009,
+ -0.560741,-0.80729,0.18399,3.00476,-157.532564,222.674231,
+ -0.560741,-0.80729,0.18399,4.766219,-158.777146,222.581747,
+ -0.06494,0.045007,0.996874,2.697798,-150.291721,226.265904,
+ -0.06494,0.045007,0.996874,2.643342,-152.883712,226.379379,
+ -0.06494,0.045007,0.996874,8.653902,-152.162396,226.738364,
+ -0.044185,0.24847,0.967631,3.394167,-155.74981,226.903254,
+ -0.044185,0.24847,0.967631,5.065576,-156.775958,227.243072,
+ -0.044185,0.24847,0.967631,8.227379,-156.009921,227.190746,
+ -0.010595,0.089767,0.995906,3.307463,-148.592932,226.119267,
+ -0.010595,0.089767,0.995906,2.697798,-150.291721,226.265904,
+ -0.010595,0.089767,0.995906,7.351517,-148.898678,226.189847,
+ -0.029965,0.154025,0.987612,7.351517,-148.898678,226.189847,
+ -0.029965,0.154025,0.987612,2.697798,-150.291721,226.265904,
+ -0.029965,0.154025,0.987612,8.653902,-152.162396,226.738364,
+ -0.011052,0.113478,0.993479,8.227379,-156.009921,227.190746,
+ -0.011052,0.113478,0.993479,5.065576,-156.775958,227.243072,
+ -0.011052,0.113478,0.993479,7.316836,-156.657919,227.254633,
+ -0.568176,-0.813406,0.124689,4.766219,-158.777146,222.581747,
+ -0.568176,-0.813406,0.124689,3.00476,-157.532564,222.674231,
+ -0.568176,-0.813406,0.124689,2.505528,-157.556598,220.242566,
+ -0.009907,0.091423,0.995763,7.316836,-156.657919,227.254633,
+ -0.009907,0.091423,0.995763,5.065576,-156.775958,227.243072,
+ -0.009907,0.091423,0.995763,6.371915,-156.992262,227.275928,
+ -0.580554,-0.801599,0.142812,4.766219,-158.777146,222.581747,
+ -0.580554,-0.801599,0.142812,2.505528,-157.556598,220.242566,
+ -0.580554,-0.801599,0.142812,4.438265,-158.991928,220.042995,
+ -0.919586,-0.342677,0.192182,1.300496,-154.471459,219.977587,
+ -0.919586,-0.342677,0.192182,2.505528,-157.556598,220.242566,
+ -0.919586,-0.342677,0.192182,3.00476,-157.532564,222.674231,
+ 0.247092,0.953322,0.173561,6.527678,-147.643752,222.463404,
+ 0.247092,0.953322,0.173561,4.569082,-147.290852,223.313407,
+ 0.247092,0.953322,0.173561,6.260569,-147.768484,223.528797,
+ -0.012278,-0.971762,0.235643,6.639632,-158.243841,224.878641,
+ -0.012278,-0.971762,0.235643,4.766219,-158.777146,222.581747,
+ -0.012278,-0.971762,0.235643,6.638111,-158.852289,222.369398,
+ -0.076842,0.196175,0.977553,3.769276,-147.820811,226.00062,
+ -0.076842,0.196175,0.977553,3.307463,-148.592932,226.119267,
+ -0.076842,0.196175,0.977553,5.84652,-147.944022,226.188631,
+ 0.325274,-0.062432,-0.943556,10.057897,-151.424044,211.626933,
+ 0.325274,-0.062432,-0.943556,10.103531,-151.774815,211.665874,
+ 0.325274,-0.062432,-0.943556,8.676414,-152.460536,211.219273,
+ 0.539536,-0.43577,-0.720421,10.057897,-151.424044,211.626933,
+ 0.539536,-0.43577,-0.720421,8.676414,-152.460536,211.219273,
+ 0.539536,-0.43577,-0.720421,8.889067,-151.781812,210.967983,
+ -0.07515,0.160211,0.984218,2.643342,-152.883712,226.379379,
+ -0.07515,0.160211,0.984218,3.394167,-155.74981,226.903254,
+ -0.07515,0.160211,0.984218,8.750341,-154.730658,227.146329,
+ 0.235585,-0.858223,-0.456018,7.712632,-155.711782,215.77564,
+ 0.235585,-0.858223,-0.456018,5.171142,-155.09877,213.30899,
+ 0.235585,-0.858223,-0.456018,7.316227,-154.49458,213.280088,
+ -0.082623,0.1172,0.989665,4.706287,-147.376035,226.026175,
+ -0.082623,0.1172,0.989665,3.769276,-147.820811,226.00062,
+ -0.082623,0.1172,0.989665,5.84652,-147.944022,226.188631,
+ -0.606793,-0.757615,0.240461,4.906466,-158.338454,224.934009,
+ -0.606793,-0.757615,0.240461,2.709967,-156.756792,224.374541,
+ -0.606793,-0.757615,0.240461,3.00476,-157.532564,222.674231,
+ -0.019692,-0.029771,0.999363,5.84652,-147.944022,226.188631,
+ -0.019692,-0.029771,0.999363,3.307463,-148.592932,226.119267,
+ -0.019692,-0.029771,0.999363,7.351517,-148.898678,226.189847,
+ 0.222429,0.889652,-0.398804,7.817893,-149.075736,219.988539,
+ 0.222429,0.889652,-0.398804,5.572718,-148.602363,219.792314,
+ 0.222429,0.889652,-0.398804,6.527678,-147.643752,222.463404,
+ -0.930233,-0.366919,0.006128,1.65157,-154.110953,222.131495,
+ -0.930233,-0.366919,0.006128,3.00476,-157.532564,222.674231,
+ -0.930233,-0.366919,0.006128,2.709967,-156.756792,224.374541,
+ -0.170781,0.871576,-0.459553,10.026866,-151.140203,211.762009,
+ -0.170781,0.871576,-0.459553,8.889067,-151.781812,210.967983,
+ -0.170781,0.871576,-0.459553,9.022013,-151.506489,211.440748,
+ 0.337821,0.434305,-0.835019,10.026866,-151.140203,211.762009,
+ 0.337821,0.434305,-0.835019,10.057897,-151.424044,211.626933,
+ 0.337821,0.434305,-0.835019,8.889067,-151.781812,210.967983,
+ 0.80174,0.038087,-0.596459,10.057897,-151.424044,211.626933,
+ 0.80174,0.038087,-0.596459,10.230696,-151.393013,211.861186,
+ 0.80174,0.038087,-0.596459,10.103531,-151.774815,211.665874,
+ -0.972851,0.154067,0.172699,1.844753,-149.177652,222.191731,
+ -0.972851,0.154067,0.172699,1.484856,-151.534782,222.267179,
+ -0.972851,0.154067,0.172699,1.782691,-151.292011,223.728368,
+ -0.92465,0.241271,0.294636,1.844753,-149.177652,222.191731,
+ -0.92465,0.241271,0.294636,1.782691,-151.292011,223.728368,
+ -0.92465,0.241271,0.294636,2.350678,-148.913889,223.563479,
+ -0.982366,-0.072647,0.172279,1.300496,-154.471459,219.977587,
+ -0.982366,-0.072647,0.172279,1.65157,-154.110953,222.131495,
+ -0.982366,-0.072647,0.172279,1.484856,-151.534782,222.267179,
+ -0.991257,-0.036602,0.126763,1.300496,-154.471459,219.977587,
+ -0.991257,-0.036602,0.126763,1.484856,-151.534782,222.267179,
+ -0.991257,-0.036602,0.126763,1.227786,-152.312683,220.032347,
+ -0.991978,-0.069748,0.105427,1.65157,-154.110953,222.131495,
+ -0.991978,-0.069748,0.105427,1.804595,-153.783912,223.787692,
+ -0.991978,-0.069748,0.105427,1.484856,-151.534782,222.267179,
+ -0.97972,-0.003843,0.200336,1.484856,-151.534782,222.267179,
+ -0.97972,-0.003843,0.200336,1.804595,-153.783912,223.787692,
+ -0.97972,-0.003843,0.200336,1.782691,-151.292011,223.728368,
+ 0.530776,-0.820036,-0.214052,7.73697,-158.134928,222.443933,
+ 0.530776,-0.820036,-0.214052,6.036356,-158.645721,220.183851,
+ 0.530776,-0.820036,-0.214052,7.592463,-157.764383,220.666046,
+ -0.917785,0.346168,0.194521,1.782691,-151.292011,223.728368,
+ -0.917785,0.346168,0.194521,2.697798,-150.291721,226.265904,
+ -0.917785,0.346168,0.194521,3.307463,-148.592932,226.119267,
+ -0.918452,0.241102,0.313554,2.350678,-148.913889,223.563479,
+ -0.918452,0.241102,0.313554,1.782691,-151.292011,223.728368,
+ -0.918452,0.241102,0.313554,3.307463,-148.592932,226.119267,
+ -0.597008,-0.676635,0.430983,4.906466,-158.338454,224.934009,
+ -0.597008,-0.676635,0.430983,3.394167,-155.74981,226.903254,
+ -0.597008,-0.676635,0.430983,2.709967,-156.756792,224.374541,
+ 0.820698,-0.473465,0.319821,9.292164,-156.02422,224.437211,
+ 0.820698,-0.473465,0.319821,8.227379,-156.009921,227.190746,
+ 0.820698,-0.473465,0.319821,8.470454,-157.22621,224.766382,
+ 0.874576,-0.345721,0.339992,9.292164,-156.02422,224.437211,
+ 0.874576,-0.345721,0.339992,8.750341,-154.730658,227.146329,
+ 0.874576,-0.345721,0.339992,8.227379,-156.009921,227.190746,
+ -0.524386,-0.687992,0.501684,5.065576,-156.775958,227.243072,
+ -0.524386,-0.687992,0.501684,3.394167,-155.74981,226.903254,
+ -0.524386,-0.687992,0.501684,4.906466,-158.338454,224.934009,
+ 0.545843,-0.725708,0.418812,8.470454,-157.22621,224.766382,
+ 0.545843,-0.725708,0.418812,8.227379,-156.009921,227.190746,
+ 0.545843,-0.725708,0.418812,7.316836,-156.657919,227.254633,
+ 0.578066,-0.695447,0.42684,8.470454,-157.22621,224.766382,
+ 0.578066,-0.695447,0.42684,7.316836,-156.657919,227.254633,
+ 0.578066,-0.695447,0.42684,7.487506,-157.914974,224.975384,
+ -0.927932,-0.183817,0.324273,2.709967,-156.756792,224.374541,
+ -0.927932,-0.183817,0.324273,3.394167,-155.74981,226.903254,
+ -0.927932,-0.183817,0.324273,2.643342,-152.883712,226.379379,
+ -0.954204,0.033064,0.297324,1.804595,-153.783912,223.787692,
+ -0.954204,0.033064,0.297324,2.643342,-152.883712,226.379379,
+ -0.954204,0.033064,0.297324,2.697798,-150.291721,226.265904,
+ -0.908261,-0.204556,0.364991,1.804595,-153.783912,223.787692,
+ -0.908261,-0.204556,0.364991,2.709967,-156.756792,224.374541,
+ -0.908261,-0.204556,0.364991,2.643342,-152.883712,226.379379,
+ 0.958698,0.079384,0.273122,9.41933,-152.828648,224.245246,
+ 0.958698,0.079384,0.273122,8.653902,-152.162396,226.738364,
+ 0.958698,0.079384,0.273122,8.750341,-154.730658,227.146329,
+ 0.44523,0.895399,0.005598,5.84652,-147.944022,226.188631,
+ 0.44523,0.895399,0.005598,4.569082,-147.290852,223.313407,
+ 0.44523,0.895399,0.005598,4.706287,-147.376035,226.026175,
+ 0.977739,-0.026404,0.208155,9.41933,-152.828648,224.245246,
+ 0.977739,-0.026404,0.208155,8.750341,-154.730658,227.146329,
+ 0.977739,-0.026404,0.208155,9.292164,-156.02422,224.437211,
+ 0.910404,0.372534,0.179954,8.08196,-149.274091,223.652617,
+ 0.910404,0.372534,0.179954,8.653902,-152.162396,226.738364,
+ 0.910404,0.372534,0.179954,9.41933,-152.828648,224.245246,
+ 0.258051,0.960565,0.103563,6.260569,-147.768484,223.528797,
+ 0.258051,0.960565,0.103563,4.569082,-147.290852,223.313407,
+ 0.258051,0.960565,0.103563,5.84652,-147.944022,226.188631,
+ 0.89786,0.391985,0.200486,8.08196,-149.274091,223.652617,
+ 0.89786,0.391985,0.200486,7.351517,-148.898678,226.189847,
+ 0.89786,0.391985,0.200486,8.653902,-152.162396,226.738364,
+ 0.530461,0.836438,0.137777,7.351517,-148.898678,226.189847,
+ 0.530461,0.836438,0.137777,6.260569,-147.768484,223.528797,
+ 0.530461,0.836438,0.137777,5.84652,-147.944022,226.188631,
+ -0.148926,-0.814174,0.561197,6.371915,-156.992262,227.275928,
+ -0.148926,-0.814174,0.561197,5.065576,-156.775958,227.243072,
+ -0.148926,-0.814174,0.561197,4.906466,-158.338454,224.934009,
+ -0.940675,-0.000191,0.339309,1.782691,-151.292011,223.728368,
+ -0.940675,-0.000191,0.339309,1.804595,-153.783912,223.787692,
+ -0.940675,-0.000191,0.339309,2.697798,-150.291721,226.265904,
+ 0.063069,-0.881789,0.467409,6.639632,-158.243841,224.878641,
+ 0.063069,-0.881789,0.467409,6.371915,-156.992262,227.275928,
+ 0.063069,-0.881789,0.467409,4.906466,-158.338454,224.934009,
+ 0.272349,-0.840138,0.469035,7.487506,-157.914974,224.975384,
+ 0.272349,-0.840138,0.469035,6.371915,-156.992262,227.275928,
+ 0.272349,-0.840138,0.469035,6.639632,-158.243841,224.878641,
+ -0.702587,0.705559,0.092509,3.769276,-147.820811,226.00062,
+ -0.702587,0.705559,0.092509,3.143182,-148.111041,223.45913,
+ -0.702587,0.705559,0.092509,2.350678,-148.913889,223.563479,
+ -0.816517,0.525202,0.239716,2.350678,-148.913889,223.563479,
+ -0.816517,0.525202,0.239716,3.307463,-148.592932,226.119267,
+ -0.816517,0.525202,0.239716,3.769276,-147.820811,226.00062,
+ -0.493909,0.867943,0.052235,4.706287,-147.376035,226.026175,
+ -0.493909,0.867943,0.052235,4.569082,-147.290852,223.313407,
+ -0.493909,0.867943,0.052235,3.143182,-148.111041,223.45913,
+ 0.302615,-0.824833,0.477573,7.487506,-157.914974,224.975384,
+ 0.302615,-0.824833,0.477573,7.316836,-156.657919,227.254633,
+ 0.302615,-0.824833,0.477573,6.371915,-156.992262,227.275928,
+ -0.428872,0.903362,0.002491,4.706287,-147.376035,226.026175,
+ -0.428872,0.903362,0.002491,3.143182,-148.111041,223.45913,
+ -0.428872,0.903362,0.002491,3.769276,-147.820811,226.00062,
+ -0.935642,-0.344226,0.077985,0.881579,-155.03975,215.312915,
+ -0.935642,-0.344226,0.077985,1.818285,-156.995912,217.916771,
+ -0.935642,-0.344226,0.077985,1.049815,-154.969778,217.640231,
+ 0.632895,0.771238,0.06809,8.08196,-149.274091,223.652617,
+ 0.632895,0.771238,0.06809,6.260569,-147.768484,223.528797,
+ 0.632895,0.771238,0.06809,7.351517,-148.898678,226.189847,
+ 0.571114,0.820852,0.005566,10.326527,-150.804035,217.466215,
+ 0.571114,0.820852,0.005566,7.817893,-149.075736,219.988539,
+ 0.571114,0.820852,0.005566,9.730247,-150.408847,220.368515,
+ -0.272021,0.830854,-0.485475,8.883287,-150.157862,218.068275,
+ -0.272021,0.830854,-0.485475,6.995271,-151.974994,216.016282,
+ -0.272021,0.830854,-0.485475,6.816083,-151.182186,217.473516,
+ 0.592791,-0.777643,-0.209453,11.11751,-155.010544,218.210956,
+ 0.592791,-0.777643,-0.209453,9.596084,-156.173594,218.223125,
+ 0.592791,-0.777643,-0.209453,10.054855,-155.181214,215.837094,
+ -0.364176,0.83778,-0.406817,9.365787,-150.73315,216.451627,
+ -0.364176,0.83778,-0.406817,6.995271,-151.974994,216.016282,
+ -0.364176,0.83778,-0.406817,8.883287,-150.157862,218.068275,
+ 0.667501,-0.701977,-0.248337,11.443943,-153.904689,215.962434,
+ 0.667501,-0.701977,-0.248337,11.11751,-155.010544,218.210956,
+ 0.667501,-0.701977,-0.248337,10.054855,-155.181214,215.837094,
+ 0.208185,0.707427,-0.67543,7.817893,-149.075736,219.988539,
+ 0.208185,0.707427,-0.67543,6.816083,-151.182186,217.473516,
+ 0.208185,0.707427,-0.67543,5.572718,-148.602363,219.792314,
+ 0.310457,-0.861638,-0.401492,9.596084,-156.173594,218.223125,
+ 0.310457,-0.861638,-0.401492,7.463168,-157.117602,218.599755,
+ 0.310457,-0.861638,-0.401492,7.712632,-155.711782,215.77564,
+ -0.226894,0.789233,-0.570641,8.883287,-150.157862,218.068275,
+ -0.226894,0.789233,-0.570641,6.816083,-151.182186,217.473516,
+ -0.226894,0.789233,-0.570641,7.817893,-149.075736,219.988539,
+ 0.216285,-0.915517,-0.339189,10.054855,-155.181214,215.837094,
+ 0.216285,-0.915517,-0.339189,9.596084,-156.173594,218.223125,
+ 0.216285,-0.915517,-0.339189,7.712632,-155.711782,215.77564,
+ -0.233218,0.933485,-0.272424,6.816083,-151.182186,217.473516,
+ -0.233218,0.933485,-0.272424,3.37348,-152.537505,215.776553,
+ -0.233218,0.933485,-0.272424,3.839856,-151.915366,217.509111,
+ 0.740573,-0.66644,-0.086078,9.596084,-156.173594,218.223125,
+ 0.740573,-0.66644,-0.086078,10.637444,-155.318724,220.563827,
+ 0.740573,-0.66644,-0.086078,9.404423,-156.678606,220.48412,
+ -0.102766,0.868404,-0.485092,6.995271,-151.974994,216.016282,
+ -0.102766,0.868404,-0.485092,3.37348,-152.537505,215.776553,
+ -0.102766,0.868404,-0.485092,6.816083,-151.182186,217.473516,
+ 0.607301,-0.794223,0.019883,11.11751,-155.010544,218.210956,
+ 0.607301,-0.794223,0.019883,10.637444,-155.318724,220.563827,
+ 0.607301,-0.794223,0.019883,9.596084,-156.173594,218.223125,
+ -0.440261,0.65414,-0.615038,5.572718,-148.602363,219.792314,
+ -0.440261,0.65414,-0.615038,3.839856,-151.915366,217.509111,
+ -0.440261,0.65414,-0.615038,3.278866,-150.039519,219.90579,
+ -0.939816,-0.329456,0.090582,0.881579,-155.03975,215.312915,
+ -0.939816,-0.329456,0.090582,1.38294,-156.337875,215.793285,
+ -0.939816,-0.329456,0.090582,1.818285,-156.995912,217.916771,
+ -0.160911,0.615745,-0.771341,5.572718,-148.602363,219.792314,
+ -0.160911,0.615745,-0.771341,6.816083,-151.182186,217.473516,
+ -0.160911,0.615745,-0.771341,3.839856,-151.915366,217.509111,
+ -0.925547,-0.324387,0.195286,1.049815,-154.969778,217.640231,
+ -0.925547,-0.324387,0.195286,1.818285,-156.995912,217.916771,
+ -0.925547,-0.324387,0.195286,2.505528,-157.556598,220.242566,
+ 0.181851,0.904923,-0.384765,3.839856,-151.915366,217.509111,
+ 0.181851,0.904923,-0.384765,0.806131,-152.166047,215.485715,
+ 0.181851,0.904923,-0.384765,1.376247,-151.368675,217.630496,
+ 0.174165,0.910934,-0.373987,3.839856,-151.915366,217.509111,
+ 0.174165,0.910934,-0.373987,3.37348,-152.537505,215.776553,
+ 0.174165,0.910934,-0.373987,0.806131,-152.166047,215.485715,
+ -0.922424,-0.345469,0.172583,1.049815,-154.969778,217.640231,
+ -0.922424,-0.345469,0.172583,2.505528,-157.556598,220.242566,
+ -0.922424,-0.345469,0.172583,1.300496,-154.471459,219.977587,
+ -0.130651,0.899763,-0.416362,3.278866,-150.039519,219.90579,
+ -0.130651,0.899763,-0.416362,1.376247,-151.368675,217.630496,
+ -0.130651,0.899763,-0.416362,1.48303,-150.264949,219.98215,
+ 0.147518,0.795325,-0.58796,3.839856,-151.915366,217.509111,
+ 0.147518,0.795325,-0.58796,1.376247,-151.368675,217.630496,
+ 0.147518,0.795325,-0.58796,3.278866,-150.039519,219.90579,
+ 0.470259,-0.833417,-0.290298,9.404423,-156.678606,220.48412,
+ 0.470259,-0.833417,-0.290298,7.592463,-157.764383,220.666046,
+ 0.470259,-0.833417,-0.290298,7.463168,-157.117602,218.599755,
+ -0.985236,-0.157436,0.067255,0.667709,-153.512848,215.453163,
+ -0.985236,-0.157436,0.067255,1.049815,-154.969778,217.640231,
+ -0.985236,-0.157436,0.067255,0.789095,-153.272815,217.793256,
+ 0.373134,-0.911694,-0.172004,9.596084,-156.173594,218.223125,
+ 0.373134,-0.911694,-0.172004,9.404423,-156.678606,220.48412,
+ 0.373134,-0.911694,-0.172004,7.463168,-157.117602,218.599755,
+ -0.943047,0.302605,0.138176,0.806131,-152.166047,215.485715,
+ -0.943047,0.302605,0.138176,0.789095,-153.272815,217.793256,
+ -0.943047,0.302605,0.138176,1.376247,-151.368675,217.630496,
+ -0.994017,0.101168,0.041184,0.667709,-153.512848,215.453163,
+ -0.994017,0.101168,0.041184,0.789095,-153.272815,217.793256,
+ -0.994017,0.101168,0.041184,0.806131,-152.166047,215.485715,
+ -0.992278,0.12337,-0.012846,1.376247,-151.368675,217.630496,
+ -0.992278,0.12337,-0.012846,1.227786,-152.312683,220.032347,
+ -0.992278,0.12337,-0.012846,1.48303,-150.264949,219.98215,
+ -0.976783,-0.162646,0.139435,1.049815,-154.969778,217.640231,
+ -0.976783,-0.162646,0.139435,1.300496,-154.471459,219.977587,
+ -0.976783,-0.162646,0.139435,0.789095,-153.272815,217.793256,
+ 0.295427,-0.865414,-0.4047,7.712632,-155.711782,215.77564,
+ 0.295427,-0.865414,-0.4047,7.463168,-157.117602,218.599755,
+ 0.295427,-0.865414,-0.4047,5.319299,-156.289504,215.263935,
+ -0.952543,0.298725,0.058531,1.376247,-151.368675,217.630496,
+ -0.952543,0.298725,0.058531,0.789095,-153.272815,217.793256,
+ -0.952543,0.298725,0.058531,1.227786,-152.312683,220.032347,
+ 0.452507,-0.84258,-0.292055,7.592463,-157.764383,220.666046,
+ 0.452507,-0.84258,-0.292055,5.563287,-157.993464,218.182968,
+ 0.452507,-0.84258,-0.292055,7.463168,-157.117602,218.599755,
+ 0.452075,-0.753369,-0.47756,7.463168,-157.117602,218.599755,
+ 0.452075,-0.753369,-0.47756,5.563287,-157.993464,218.182968,
+ 0.452075,-0.753369,-0.47756,5.319299,-156.289504,215.263935,
+ 0.281432,-0.818291,-0.501194,5.563287,-157.993464,218.182968,
+ 0.281432,-0.818291,-0.501194,2.905279,-157.435212,215.778987,
+ 0.281432,-0.818291,-0.501194,5.319299,-156.289504,215.263935,
+ 0.542081,-0.752736,-0.373545,7.592463,-157.764383,220.666046,
+ 0.542081,-0.752736,-0.373545,6.036356,-158.645721,220.183851,
+ 0.542081,-0.752736,-0.373545,5.563287,-157.993464,218.182968,
+ 0.22988,-0.860801,-0.454067,5.563287,-157.993464,218.182968,
+ 0.22988,-0.860801,-0.454067,3.694133,-158.415119,218.036027,
+ 0.22988,-0.860801,-0.454067,2.905279,-157.435212,215.778987,
+ 0.23223,-0.907254,-0.350657,6.036356,-158.645721,220.183851,
+ 0.23223,-0.907254,-0.350657,3.694133,-158.415119,218.036027,
+ 0.23223,-0.907254,-0.350657,5.563287,-157.993464,218.182968,
+ 0.227678,-0.910187,-0.346008,6.036356,-158.645721,220.183851,
+ 0.227678,-0.910187,-0.346008,4.438265,-158.991928,220.042995,
+ 0.227678,-0.910187,-0.346008,3.694133,-158.415119,218.036027,
+ -0.579409,-0.801918,-0.145649,3.694133,-158.415119,218.036027,
+ -0.579409,-0.801918,-0.145649,1.38294,-156.337875,215.793285,
+ -0.579409,-0.801918,-0.145649,2.905279,-157.435212,215.778987,
+ -0.593586,-0.795054,-0.124682,3.694133,-158.415119,218.036027,
+ -0.593586,-0.795054,-0.124682,1.818285,-156.995912,217.916771,
+ -0.593586,-0.795054,-0.124682,1.38294,-156.337875,215.793285,
+ -0.986514,-0.14513,0.075676,0.881579,-155.03975,215.312915,
+ -0.986514,-0.14513,0.075676,1.049815,-154.969778,217.640231,
+ -0.986514,-0.14513,0.075676,0.667709,-153.512848,215.453163,
+ -0.60311,-0.797638,-0.005626,4.438265,-158.991928,220.042995,
+ -0.60311,-0.797638,-0.005626,1.818285,-156.995912,217.916771,
+ -0.60311,-0.797638,-0.005626,3.694133,-158.415119,218.036027,
+ -0.977409,-0.038193,0.207875,0.789095,-153.272815,217.793256,
+ -0.977409,-0.038193,0.207875,1.300496,-154.471459,219.977587,
+ -0.977409,-0.038193,0.207875,1.227786,-152.312683,220.032347,
+ -0.597248,-0.80188,-0.016832,4.438265,-158.991928,220.042995,
+ -0.597248,-0.80188,-0.016832,2.505528,-157.556598,220.242566,
+ -0.597248,-0.80188,-0.016832,1.818285,-156.995912,217.916771,
+ 0.966502,0.036682,0.254025,31.318918,-138.175379,223.658397,
+ 0.966502,0.036682,0.254025,30.696475,-138.29646,226.044124,
+ 0.966502,0.036682,0.254025,30.736633,-139.268153,226.031651,
+ 0.970905,-0.18368,0.153639,31.318918,-138.175379,223.658397,
+ 0.970905,-0.18368,0.153639,30.736633,-139.268153,226.031651,
+ 0.970905,-0.18368,0.153639,31.012868,-139.610405,223.87683,
+ 0.711942,-0.676474,0.188472,31.012868,-139.610405,223.87683,
+ 0.711942,-0.676474,0.188472,30.217018,-139.809063,226.170073,
+ 0.711942,-0.676474,0.188472,30.275429,-140.258099,224.33773,
+ 0.731719,-0.65239,0.197422,31.012868,-139.610405,223.87683,
+ 0.731719,-0.65239,0.197422,30.736633,-139.268153,226.031651,
+ 0.731719,-0.65239,0.197422,30.217018,-139.809063,226.170073,
+ -0.445967,-0.886285,0.124946,28.195751,-140.255665,225.033187,
+ -0.445967,-0.886285,0.124946,27.177208,-139.463769,227.014904,
+ -0.445967,-0.886285,0.124946,26.41756,-139.325347,225.285389,
+ -0.256085,-0.935789,0.242322,28.485068,-139.899114,226.715851,
+ -0.256085,-0.935789,0.242322,27.177208,-139.463769,227.014904,
+ -0.256085,-0.935789,0.242322,28.195751,-140.255665,225.033187,
+ 0.397722,0.858386,0.324024,28.841011,-135.476605,224.519048,
+ 0.397722,0.858386,0.324024,27.38834,-135.031829,225.123845,
+ 0.397722,0.858386,0.324024,28.736358,-136.267588,226.742927,
+ 0.289262,0.861714,0.416866,28.736358,-136.267588,226.742927,
+ 0.289262,0.861714,0.416866,27.38834,-135.031829,225.123845,
+ 0.289262,0.861714,0.416866,27.630502,-136.057673,227.076357,
+ 0.575745,0.742385,0.342612,30.528543,-136.664601,224.257415,
+ 0.575745,0.742385,0.342612,28.841011,-135.476605,224.519048,
+ 0.575745,0.742385,0.342612,29.375533,-136.76682,226.416495,
+ 0.675135,0.684436,0.275209,29.375533,-136.76682,226.416495,
+ 0.675135,0.684436,0.275209,28.841011,-135.476605,224.519048,
+ 0.675135,0.684436,0.275209,28.736358,-136.267588,226.742927,
+ 0.894901,0.36819,0.252169,31.318918,-138.175379,223.658397,
+ 0.894901,0.36819,0.252169,30.528543,-136.664601,224.257415,
+ 0.894901,0.36819,0.252169,30.696475,-138.29646,226.044124,
+ 0.85736,0.417636,0.300857,30.528543,-136.664601,224.257415,
+ 0.85736,0.417636,0.300857,30.251699,-137.477184,226.174332,
+ 0.85736,0.417636,0.300857,30.696475,-138.29646,226.044124,
+ 0.23423,-0.185045,0.954408,26.871463,-136.350337,227.222385,
+ 0.23423,-0.185045,0.954408,26.556286,-136.755564,227.221168,
+ 0.23423,-0.185045,0.954408,30.251699,-137.477184,226.174332,
+ 0.644101,0.666423,0.375519,30.528543,-136.664601,224.257415,
+ 0.644101,0.666423,0.375519,29.375533,-136.76682,226.416495,
+ 0.644101,0.666423,0.375519,30.251699,-137.477184,226.174332,
+ -0.409566,0.785702,0.463603,27.630502,-136.057673,227.076357,
+ -0.409566,0.785702,0.463603,27.38834,-135.031829,225.123845,
+ -0.409566,0.785702,0.463603,26.752511,-135.468999,225.303034,
+ 0.401037,0.910186,0.103589,27.630502,-136.057673,227.076357,
+ 0.401037,0.910186,0.103589,26.752511,-135.468999,225.303034,
+ 0.401037,0.910186,0.103589,27.560531,-136.031206,227.114689,
+ -0.363313,0.883873,0.294572,27.560531,-136.031206,227.114689,
+ -0.363313,0.883873,0.294572,26.190304,-136.057978,225.505039,
+ -0.363313,0.883873,0.294572,26.871463,-136.350337,227.222385,
+ -0.556745,0.69005,0.462456,27.560531,-136.031206,227.114689,
+ -0.556745,0.69005,0.462456,26.752511,-135.468999,225.303034,
+ -0.556745,0.69005,0.462456,26.190304,-136.057978,225.505039,
+ -0.827299,0.398476,0.395971,26.190304,-136.057978,225.505039,
+ -0.827299,0.398476,0.395971,26.002902,-136.490889,225.549151,
+ -0.827299,0.398476,0.395971,26.871463,-136.350337,227.222385,
+ -0.743537,0.577293,0.33747,26.002902,-136.490889,225.549151,
+ -0.743537,0.577293,0.33747,26.556286,-136.755564,227.221168,
+ -0.743537,0.577293,0.33747,26.871463,-136.350337,227.222385,
+ -0.859318,0.257619,0.44182,25.555388,-137.106639,225.479179,
+ -0.859318,0.257619,0.44182,26.399306,-137.255709,227.207478,
+ -0.859318,0.257619,0.44182,26.556286,-136.755564,227.221168,
+ -0.778433,0.526992,0.341058,25.555388,-137.106639,225.479179,
+ -0.778433,0.526992,0.341058,26.556286,-136.755564,227.221168,
+ -0.778433,0.526992,0.341058,26.002902,-136.490889,225.549151,
+ -0.002794,-0.978177,0.207753,29.274226,-140.345715,224.623701,
+ -0.002794,-0.978177,0.207753,28.485068,-139.899114,226.715851,
+ -0.002794,-0.978177,0.207753,28.195751,-140.255665,225.033187,
+ -0.458861,-0.888354,0.016551,29.403826,-140.382526,226.240957,
+ -0.458861,-0.888354,0.016551,28.485068,-139.899114,226.715851,
+ -0.458861,-0.888354,0.016551,29.274226,-140.345715,224.623701,
+ 0.575492,-0.789875,0.211913,30.275429,-140.258099,224.33773,
+ 0.575492,-0.789875,0.211913,30.217018,-139.809063,226.170073,
+ 0.575492,-0.789875,0.211913,29.403826,-140.382526,226.240957,
+ 0.078917,-0.996459,-0.029005,30.275429,-140.258099,224.33773,
+ 0.078917,-0.996459,-0.029005,29.403826,-140.382526,226.240957,
+ 0.078917,-0.996459,-0.029005,29.274226,-140.345715,224.623701,
+ -0.523907,-0.83555,0.165462,25.966395,-139.848917,220.957493,
+ -0.523907,-0.83555,0.165462,24.635414,-138.97123,221.175318,
+ -0.523907,-0.83555,0.165462,24.026357,-138.952976,219.33902,
+ -0.756588,-0.596302,0.268326,24.635414,-138.97123,221.175318,
+ -0.756588,-0.596302,0.268326,25.187277,-138.882092,222.929475,
+ -0.756588,-0.596302,0.268326,23.631169,-137.586705,221.420523,
+ -0.762385,-0.578873,0.289266,23.631169,-137.586705,221.420523,
+ -0.762385,-0.578873,0.289266,25.187277,-138.882092,222.929475,
+ -0.762385,-0.578873,0.289266,24.451054,-137.819741,223.115052,
+ -0.526632,-0.836372,0.152123,26.098124,-139.620444,222.669668,
+ -0.526632,-0.836372,0.152123,24.635414,-138.97123,221.175318,
+ -0.526632,-0.836372,0.152123,25.966395,-139.848917,220.957493,
+ -0.575323,-0.7875,0.221015,26.098124,-139.620444,222.669668,
+ -0.575323,-0.7875,0.221015,25.187277,-138.882092,222.929475,
+ -0.575323,-0.7875,0.221015,24.635414,-138.97123,221.175318,
+ -0.781105,-0.581187,0.228247,25.187277,-138.882092,222.929475,
+ -0.781105,-0.581187,0.228247,25.421834,-138.612853,224.417741,
+ -0.781105,-0.581187,0.228247,24.451054,-137.819741,223.115052,
+ -0.836796,-0.38526,0.389034,24.451054,-137.819741,223.115052,
+ -0.836796,-0.38526,0.389034,25.421834,-138.612853,224.417741,
+ -0.836796,-0.38526,0.389034,25.0017,-137.530119,224.586281,
+ -0.597796,-0.788443,0.144905,26.199127,-139.400186,224.284795,
+ -0.597796,-0.788443,0.144905,25.187277,-138.882092,222.929475,
+ -0.597796,-0.788443,0.144905,26.098124,-139.620444,222.669668,
+ -0.672067,-0.702853,0.233072,26.199127,-139.400186,224.284795,
+ -0.672067,-0.702853,0.233072,25.421834,-138.612853,224.417741,
+ -0.672067,-0.702853,0.233072,25.187277,-138.882092,222.929475,
+ -0.859645,-0.385717,0.335012,25.421834,-138.612853,224.417741,
+ -0.859645,-0.385717,0.335012,25.797247,-138.593687,225.403123,
+ -0.859645,-0.385717,0.335012,25.0017,-137.530119,224.586281,
+ -0.833389,-0.241605,0.497081,25.0017,-137.530119,224.586281,
+ -0.833389,-0.241605,0.497081,25.797247,-138.593687,225.403123,
+ -0.833389,-0.241605,0.497081,25.41149,-137.653634,225.213287,
+ -0.679887,-0.705185,0.201166,26.41756,-139.325347,225.285389,
+ -0.679887,-0.705185,0.201166,25.421834,-138.612853,224.417741,
+ -0.679887,-0.705185,0.201166,26.199127,-139.400186,224.284795,
+ -0.70876,-0.646373,0.282597,25.421834,-138.612853,224.417741,
+ -0.70876,-0.646373,0.282597,26.41756,-139.325347,225.285389,
+ -0.70876,-0.646373,0.282597,25.797247,-138.593687,225.403123,
+ -0.971549,-0.118315,0.20517,21.580393,-136.317481,216.406906,
+ -0.971549,-0.118315,0.20517,22.007524,-136.473852,218.339339,
+ -0.971549,-0.118315,0.20517,21.517115,-134.420946,217.200931,
+ -0.967488,-0.103033,0.230979,21.517115,-134.420946,217.200931,
+ -0.967488,-0.103033,0.230979,22.007524,-136.473852,218.339339,
+ -0.967488,-0.103033,0.230979,21.990488,-135.185158,218.84283,
+ -0.895917,-0.171883,0.409622,22.007524,-136.473852,218.339339,
+ -0.895917,-0.171883,0.409622,22.842924,-136.963958,219.960854,
+ -0.895917,-0.171883,0.409622,21.990488,-135.185158,218.84283,
+ -0.918161,-0.243607,0.312468,21.990488,-135.185158,218.84283,
+ -0.918161,-0.243607,0.312468,22.842924,-136.963958,219.960854,
+ -0.918161,-0.243607,0.312468,22.819195,-136.124907,220.545269,
+ -0.889864,-0.277431,0.362179,22.842924,-136.963958,219.960854,
+ -0.889864,-0.277431,0.362179,23.631169,-137.586705,221.420523,
+ -0.889864,-0.277431,0.362179,22.819195,-136.124907,220.545269,
+ -0.877374,-0.237846,0.416705,22.819195,-136.124907,220.545269,
+ -0.877374,-0.237846,0.416705,23.631169,-137.586705,221.420523,
+ -0.877374,-0.237846,0.416705,23.681366,-136.526787,222.131191,
+ -0.888789,-0.225454,0.399029,23.631169,-137.586705,221.420523,
+ -0.888789,-0.225454,0.399029,24.451054,-137.819741,223.115052,
+ -0.888789,-0.225454,0.399029,23.681366,-136.526787,222.131191,
+ -0.659323,0.165583,0.7334,23.681366,-136.526787,222.131191,
+ -0.659323,0.165583,0.7334,24.451054,-137.819741,223.115052,
+ -0.659323,0.165583,0.7334,24.777182,-136.692285,223.153689,
+ -0.920758,0.256258,0.294172,24.451054,-137.819741,223.115052,
+ -0.920758,0.256258,0.294172,25.0017,-137.530119,224.586281,
+ -0.920758,0.256258,0.294172,24.777182,-136.692285,223.153689,
+ -0.860805,0.368874,0.350638,24.777182,-136.692285,223.153689,
+ -0.860805,0.368874,0.350638,25.0017,-137.530119,224.586281,
+ -0.860805,0.368874,0.350638,25.328741,-136.728184,224.545515,
+ -0.756354,0.336956,0.560705,25.328741,-136.728184,224.545515,
+ -0.756354,0.336956,0.560705,25.0017,-137.530119,224.586281,
+ -0.756354,0.336956,0.560705,25.41149,-137.653634,225.213287,
+ -0.953516,0.115558,0.278307,25.328741,-136.728184,224.545515,
+ -0.953516,0.115558,0.278307,25.41149,-137.653634,225.213287,
+ -0.953516,0.115558,0.278307,25.555388,-137.106639,225.479179,
+ 0.784279,-0.0062,-0.620377,29.131849,-135.747973,214.004446,
+ 0.784279,-0.0062,-0.620377,30.348747,-135.906474,215.54443,
+ 0.784279,-0.0062,-0.620377,30.255654,-138.824289,215.455901,
+ 0.869214,0.087971,-0.486547,29.316514,-138.223751,213.886712,
+ 0.869214,0.087971,-0.486547,29.131849,-135.747973,214.004446,
+ 0.869214,0.087971,-0.486547,30.255654,-138.824289,215.455901,
+ 0.64897,-0.49494,-0.577817,28.612538,-139.008649,213.768368,
+ 0.64897,-0.49494,-0.577817,29.316514,-138.223751,213.886712,
+ 0.64897,-0.49494,-0.577817,30.255654,-138.824289,215.455901,
+ 0.693835,-0.331355,-0.639373,28.612538,-139.008649,213.768368,
+ 0.693835,-0.331355,-0.639373,30.255654,-138.824289,215.455901,
+ 0.693835,-0.331355,-0.639373,29.671543,-139.800241,215.327822,
+ -0.315184,-0.949023,0.003718,27.385602,-141.030828,215.838615,
+ -0.315184,-0.949023,0.003718,24.269432,-139.999508,214.918641,
+ -0.315184,-0.949023,0.003718,25.822801,-140.518515,214.124615,
+ -0.309471,-0.950747,-0.017567,27.385602,-141.030828,215.838615,
+ -0.309471,-0.950747,-0.017567,25.217699,-140.340848,216.687097,
+ -0.309471,-0.950747,-0.017567,24.269432,-139.999508,214.918641,
+ 0.728321,0.685171,0.009457,28.666995,-133.396015,214.258778,
+ 0.728321,0.685171,0.009457,27.189073,-131.831693,214.742495,
+ 0.728321,0.685171,0.009457,27.879054,-132.606248,217.721763,
+ 0.169315,0.968544,-0.182361,29.578451,-133.176669,216.270005,
+ 0.169315,0.968544,-0.182361,28.666995,-133.396015,214.258778,
+ 0.169315,0.968544,-0.182361,27.879054,-132.606248,217.721763,
+ 0.819242,0.396286,-0.414487,28.666995,-133.396015,214.258778,
+ 0.819242,0.396286,-0.414487,29.578451,-133.176669,216.270005,
+ 0.819242,0.396286,-0.414487,29.22768,-134.499436,214.312017,
+ 0.805104,0.414501,-0.42426,29.22768,-134.499436,214.312017,
+ 0.805104,0.414501,-0.42426,29.578451,-133.176669,216.270005,
+ 0.805104,0.414501,-0.42426,30.422673,-134.234457,216.8386,
+ 0.901878,0.036809,-0.43042,29.131849,-135.747973,214.004446,
+ 0.901878,0.036809,-0.43042,29.22768,-134.499436,214.312017,
+ 0.901878,0.036809,-0.43042,30.422673,-134.234457,216.8386,
+ 0.741645,0.38977,-0.545932,29.131849,-135.747973,214.004446,
+ 0.741645,0.38977,-0.545932,30.422673,-134.234457,216.8386,
+ 0.741645,0.38977,-0.545932,30.348747,-135.906474,215.54443,
+ 0.929728,-0.027007,-0.367255,30.348747,-135.906474,215.54443,
+ 0.929728,-0.027007,-0.367255,31.083448,-136.821885,217.471691,
+ 0.929728,-0.027007,-0.367255,30.926164,-139.050936,217.237438,
+ 0.934935,-0.019079,-0.354305,30.255654,-138.824289,215.455901,
+ 0.934935,-0.019079,-0.354305,30.348747,-135.906474,215.54443,
+ 0.934935,-0.019079,-0.354305,30.926164,-139.050936,217.237438,
+ 0.819288,-0.442493,-0.364646,29.671543,-139.800241,215.327822,
+ 0.819288,-0.442493,-0.364646,30.255654,-138.824289,215.455901,
+ 0.819288,-0.442493,-0.364646,30.926164,-139.050936,217.237438,
+ 0.834383,-0.380306,-0.398965,29.671543,-139.800241,215.327822,
+ 0.834383,-0.380306,-0.398965,30.926164,-139.050936,217.237438,
+ 0.834383,-0.380306,-0.398965,30.420239,-140.105074,217.184199,
+ -0.272019,-0.958576,0.084491,27.696519,-140.895449,218.375542,
+ -0.272019,-0.958576,0.084491,25.217699,-140.340848,216.687097,
+ -0.272019,-0.958576,0.084491,27.385602,-141.030828,215.838615,
+ -0.300199,-0.944929,0.130346,27.696519,-140.895449,218.375542,
+ -0.300199,-0.944929,0.130346,25.508233,-140.105986,219.058829,
+ -0.300199,-0.944929,0.130346,25.217699,-140.340848,216.687097,
+ 0.56596,0.734836,0.373771,29.578451,-133.176669,216.270005,
+ 0.56596,0.734836,0.373771,27.879054,-132.606248,217.721763,
+ 0.56596,0.734836,0.373771,27.775617,-133.356466,219.353318,
+ 0.466363,0.824391,0.320758,29.578451,-133.176669,216.270005,
+ 0.466363,0.824391,0.320758,27.775617,-133.356466,219.353318,
+ 0.466363,0.824391,0.320758,29.420254,-133.99412,218.600972,
+ 0.66795,0.686956,0.286242,30.422673,-134.234457,216.8386,
+ 0.66795,0.686956,0.286242,29.578451,-133.176669,216.270005,
+ 0.66795,0.686956,0.286242,29.420254,-133.99412,218.600972,
+ 0.710674,0.627198,0.318693,30.422673,-134.234457,216.8386,
+ 0.710674,0.627198,0.318693,29.420254,-133.99412,218.600972,
+ 0.710674,0.627198,0.318693,30.761275,-135.06286,217.713854,
+ -0.694151,0.461212,0.552664,25.131299,-134.106379,221.941355,
+ -0.694151,0.461212,0.552664,24.461093,-135.336357,222.126019,
+ -0.694151,0.461212,0.552664,25.027559,-135.84137,223.25895,
+ -0.718479,0.4474,0.532561,25.131299,-134.106379,221.941355,
+ -0.718479,0.4474,0.532561,25.027559,-135.84137,223.25895,
+ -0.718479,0.4474,0.532561,25.535005,-134.972505,223.213621,
+ -0.594992,0.392764,0.701228,24.461093,-135.336357,222.126019,
+ -0.594992,0.392764,0.701228,23.681366,-136.526787,222.131191,
+ -0.594992,0.392764,0.701228,24.777182,-136.692285,223.153689,
+ -0.843252,0.185724,0.504414,24.461093,-135.336357,222.126019,
+ -0.843252,0.185724,0.504414,24.777182,-136.692285,223.153689,
+ -0.843252,0.185724,0.504414,25.027559,-135.84137,223.25895,
+ -0.76142,0.468092,0.448474,25.535005,-134.972505,223.213621,
+ -0.76142,0.468092,0.448474,25.027559,-135.84137,223.25895,
+ -0.76142,0.468092,0.448474,25.668864,-136.078056,224.594799,
+ -0.737491,0.490579,0.464154,25.535005,-134.972505,223.213621,
+ -0.737491,0.490579,0.464154,25.668864,-136.078056,224.594799,
+ -0.737491,0.490579,0.464154,26.102688,-135.368605,224.534259,
+ -0.904679,0.221142,0.364214,24.777182,-136.692285,223.153689,
+ -0.904679,0.221142,0.364214,25.328741,-136.728184,224.545515,
+ -0.904679,0.221142,0.364214,25.027559,-135.84137,223.25895,
+ -0.803186,0.385785,0.453941,25.027559,-135.84137,223.25895,
+ -0.803186,0.385785,0.453941,25.328741,-136.728184,224.545515,
+ -0.803186,0.385785,0.453941,25.668864,-136.078056,224.594799,
+ -0.735088,0.489527,0.469051,26.102688,-135.368605,224.534259,
+ -0.735088,0.489527,0.469051,25.668864,-136.078056,224.594799,
+ -0.735088,0.489527,0.469051,26.002902,-136.490889,225.549151,
+ -0.841889,0.401218,0.360898,26.102688,-135.368605,224.534259,
+ -0.841889,0.401218,0.360898,26.002902,-136.490889,225.549151,
+ -0.841889,0.401218,0.360898,26.190304,-136.057978,225.505039,
+ -0.834923,0.408873,0.368412,25.328741,-136.728184,224.545515,
+ -0.834923,0.408873,0.368412,25.555388,-137.106639,225.479179,
+ -0.834923,0.408873,0.368412,25.668864,-136.078056,224.594799,
+ -0.739257,0.484077,0.468153,25.668864,-136.078056,224.594799,
+ -0.739257,0.484077,0.468153,25.555388,-137.106639,225.479179,
+ -0.739257,0.484077,0.468153,26.002902,-136.490889,225.549151,
+ -0.039224,-0.988924,-0.143145,28.778645,-140.83004,215.466853,
+ -0.039224,-0.988924,-0.143145,25.822801,-140.518515,214.124615,
+ -0.039224,-0.988924,-0.143145,27.043654,-140.516385,213.775366,
+ 0.048866,-0.943872,-0.326678,28.778645,-140.83004,215.466853,
+ 0.048866,-0.943872,-0.326678,27.385602,-141.030828,215.838615,
+ 0.048866,-0.943872,-0.326678,25.822801,-140.518515,214.124615,
+ 0.530081,-0.554556,-0.641468,28.612538,-139.008649,213.768368,
+ 0.530081,-0.554556,-0.641468,29.671543,-139.800241,215.327822,
+ 0.530081,-0.554556,-0.641468,27.043654,-140.516385,213.775366,
+ 0.531141,-0.547797,-0.64638,29.671543,-139.800241,215.327822,
+ 0.531141,-0.547797,-0.64638,28.778645,-140.83004,215.466853,
+ 0.531141,-0.547797,-0.64638,27.043654,-140.516385,213.775366,
+ 0.105805,-0.9851,-0.135584,29.631081,-141.018355,217.500288,
+ 0.105805,-0.9851,-0.135584,27.385602,-141.030828,215.838615,
+ 0.105805,-0.9851,-0.135584,28.778645,-140.83004,215.466853,
+ -0.037231,-0.997634,0.0578,29.631081,-141.018355,217.500288,
+ -0.037231,-0.997634,0.0578,27.696519,-140.895449,218.375542,
+ -0.037231,-0.997634,0.0578,27.385602,-141.030828,215.838615,
+ 0.674268,-0.635432,-0.376283,29.671543,-139.800241,215.327822,
+ 0.674268,-0.635432,-0.376283,30.420239,-140.105074,217.184199,
+ 0.674268,-0.635432,-0.376283,28.778645,-140.83004,215.466853,
+ 0.651909,-0.679679,-0.336231,30.420239,-140.105074,217.184199,
+ 0.651909,-0.679679,-0.336231,29.631081,-141.018355,217.500288,
+ 0.651909,-0.679679,-0.336231,28.778645,-140.83004,215.466853,
+ -0.003473,-0.991307,0.131526,29.631081,-141.018355,217.500288,
+ -0.003473,-0.991307,0.131526,29.348761,-140.701353,219.88206,
+ -0.003473,-0.991307,0.131526,27.696519,-140.895449,218.375542,
+ -0.876999,-0.281202,0.389614,25.41149,-137.653634,225.213287,
+ -0.876999,-0.281202,0.389614,25.797247,-138.593687,225.403123,
+ -0.876999,-0.281202,0.389614,26.395352,-137.903402,227.247635,
+ -0.914641,-0.177737,0.363099,25.797247,-138.593687,225.403123,
+ -0.914641,-0.177737,0.363099,26.560241,-138.778656,227.234554,
+ -0.914641,-0.177737,0.363099,26.395352,-137.903402,227.247635,
+ -0.680576,-0.690988,0.243623,27.177208,-139.463769,227.014904,
+ -0.680576,-0.690988,0.243623,26.560241,-138.778656,227.234554,
+ -0.680576,-0.690988,0.243623,26.41756,-139.325347,225.285389,
+ -0.72235,-0.650278,0.235263,26.41756,-139.325347,225.285389,
+ -0.72235,-0.650278,0.235263,26.560241,-138.778656,227.234554,
+ -0.72235,-0.650278,0.235263,25.797247,-138.593687,225.403123,
+ -0.898188,0.032665,0.438397,25.41149,-137.653634,225.213287,
+ -0.898188,0.032665,0.438397,26.395352,-137.903402,227.247635,
+ -0.898188,0.032665,0.438397,26.399306,-137.255709,227.207478,
+ -0.89762,0.022151,0.440213,25.41149,-137.653634,225.213287,
+ -0.89762,0.022151,0.440213,26.399306,-137.255709,227.207478,
+ -0.89762,0.022151,0.440213,25.555388,-137.106639,225.479179,
+ -0.261331,0.158544,-0.95214,24.684698,-132.287421,215.006257,
+ -0.261331,0.158544,-0.95214,26.320512,-133.234167,214.399634,
+ -0.261331,0.158544,-0.95214,25.852615,-134.301386,214.35035,
+ -0.18581,0.125107,-0.974589,22.412447,-134.458062,215.140116,
+ -0.18581,0.125107,-0.974589,24.087202,-134.859638,214.769266,
+ -0.18581,0.125107,-0.974589,23.774155,-135.293766,214.773221,
+ -0.215381,0.003568,-0.976524,22.412751,-133.773557,215.14255,
+ -0.215381,0.003568,-0.976524,24.087202,-134.859638,214.769266,
+ -0.215381,0.003568,-0.976524,22.412447,-134.458062,215.140116,
+ 0.258293,-0.013298,0.965975,26.399306,-137.255709,227.207478,
+ 0.258293,-0.013298,0.965975,30.696475,-138.29646,226.044124,
+ 0.258293,-0.013298,0.965975,30.251699,-137.477184,226.174332,
+ 0.080784,0.433093,-0.897722,22.412751,-133.773557,215.14255,
+ 0.080784,0.433093,-0.897722,24.408158,-134.626906,214.910426,
+ 0.080784,0.433093,-0.897722,24.087202,-134.859638,214.769266,
+ 0.265469,-0.220161,0.938646,27.630502,-136.057673,227.076357,
+ 0.265469,-0.220161,0.938646,26.871463,-136.350337,227.222385,
+ 0.265469,-0.220161,0.938646,29.375533,-136.76682,226.416495,
+ 0.319435,-0.399793,0.859143,26.871463,-136.350337,227.222385,
+ 0.319435,-0.399793,0.859143,27.630502,-136.057673,227.076357,
+ 0.319435,-0.399793,0.859143,27.560531,-136.031206,227.114689,
+ 0.315716,0.066743,0.946503,26.871463,-136.350337,227.222385,
+ 0.315716,0.066743,0.946503,30.251699,-137.477184,226.174332,
+ 0.315716,0.066743,0.946503,29.375533,-136.76682,226.416495,
+ 0.019497,0.304622,-0.952274,23.131633,-133.282235,215.314436,
+ 0.019497,0.304622,-0.952274,24.408158,-134.626906,214.910426,
+ 0.019497,0.304622,-0.952274,22.412751,-133.773557,215.14255,
+ 0.215725,-0.32571,0.92053,27.630502,-136.057673,227.076357,
+ 0.215725,-0.32571,0.92053,29.375533,-136.76682,226.416495,
+ 0.215725,-0.32571,0.92053,28.736358,-136.267588,226.742927,
+ 0.30015,-0.3143,0.900625,30.217018,-139.809063,226.170073,
+ 0.30015,-0.3143,0.900625,28.485068,-139.899114,226.715851,
+ 0.30015,-0.3143,0.900625,29.403826,-140.382526,226.240957,
+ -0.688742,-0.160507,-0.707016,25.907072,-136.432173,213.295908,
+ -0.688742,-0.160507,-0.707016,26.614393,-137.144971,212.768687,
+ -0.688742,-0.160507,-0.707016,25.628098,-137.174177,213.736121,
+ 0.269047,-0.065775,0.960878,26.560241,-138.778656,227.234554,
+ 0.269047,-0.065775,0.960878,27.177208,-139.463769,227.014904,
+ 0.269047,-0.065775,0.960878,30.736633,-139.268153,226.031651,
+ 0.251929,-0.105404,0.961988,26.556286,-136.755564,227.221168,
+ 0.251929,-0.105404,0.961988,26.399306,-137.255709,227.207478,
+ 0.251929,-0.105404,0.961988,30.251699,-137.477184,226.174332,
+ -0.700047,-0.01066,-0.714017,26.614393,-137.144971,212.768687,
+ -0.700047,-0.01066,-0.714017,26.091736,-138.522803,213.301688,
+ -0.700047,-0.01066,-0.714017,25.628098,-137.174177,213.736121,
+ -0.229512,0.034443,-0.972696,25.093576,-136.240816,214.384423,
+ -0.229512,0.034443,-0.972696,24.853543,-137.144363,214.409065,
+ -0.229512,0.034443,-0.972696,24.224103,-136.561773,214.578214,
+ -0.626763,0.035277,-0.778411,25.628098,-137.174177,213.736121,
+ -0.626763,0.035277,-0.778411,26.091736,-138.522803,213.301688,
+ -0.626763,0.035277,-0.778411,25.292234,-137.247495,214.00323,
+ -0.746008,0.180701,-0.640952,25.279761,-136.873907,213.989235,
+ -0.746008,0.180701,-0.640952,24.853543,-137.144363,214.409065,
+ -0.746008,0.180701,-0.640952,25.093576,-136.240816,214.384423,
+ -0.620273,0.042014,-0.78326,25.292234,-137.247495,214.00323,
+ -0.620273,0.042014,-0.78326,26.091736,-138.522803,213.301688,
+ -0.620273,0.042014,-0.78326,25.391716,-138.484167,213.858115,
+ -0.199861,0.067865,-0.977471,24.224103,-136.561773,214.578214,
+ -0.199861,0.067865,-0.977471,24.853543,-137.144363,214.409065,
+ -0.199861,0.067865,-0.977471,24.291032,-138.743974,214.41302,
+ -0.250491,0.065437,-0.965905,24.224103,-136.561773,214.578214,
+ -0.250491,0.065437,-0.965905,24.291032,-138.743974,214.41302,
+ -0.250491,0.065437,-0.965905,23.249672,-137.381962,214.775351,
+ -0.240395,0.052638,-0.969247,23.795146,-135.764705,214.727892,
+ -0.240395,0.052638,-0.969247,24.224103,-136.561773,214.578214,
+ -0.240395,0.052638,-0.969247,23.249672,-137.381962,214.775351,
+ -0.284299,0.067825,-0.956334,23.795146,-135.764705,214.727892,
+ -0.284299,0.067825,-0.956334,23.249672,-137.381962,214.775351,
+ -0.284299,0.067825,-0.956334,22.677426,-135.812773,215.056758,
+ -0.284513,0.079277,-0.955389,23.774155,-135.293766,214.773221,
+ -0.284513,0.079277,-0.955389,23.795146,-135.764705,214.727892,
+ -0.284513,0.079277,-0.955389,22.677426,-135.812773,215.056758,
+ -0.25459,0.009704,-0.967,22.412447,-134.458062,215.140116,
+ -0.25459,0.009704,-0.967,23.774155,-135.293766,214.773221,
+ -0.25459,0.009704,-0.967,22.677426,-135.812773,215.056758,
+ -0.555783,0.30211,-0.77449,26.971857,-135.178769,212.983165,
+ -0.555783,0.30211,-0.77449,26.87268,-136.517052,212.532305,
+ -0.555783,0.30211,-0.77449,26.169009,-135.363433,213.487265,
+ -0.402231,0.425645,-0.810578,26.169009,-135.363433,213.487265,
+ -0.402231,0.425645,-0.810578,26.87268,-136.517052,212.532305,
+ -0.402231,0.425645,-0.810578,26.057358,-136.079578,213.166613,
+ -0.621339,-0.022371,-0.783222,26.057358,-136.079578,213.166613,
+ -0.621339,-0.022371,-0.783222,26.87268,-136.517052,212.532305,
+ -0.621339,-0.022371,-0.783222,25.907072,-136.432173,213.295908,
+ -0.621909,-0.038624,-0.782137,25.907072,-136.432173,213.295908,
+ -0.621909,-0.038624,-0.782137,26.87268,-136.517052,212.532305,
+ -0.621909,-0.038624,-0.782137,26.614393,-137.144971,212.768687,
+ -0.674632,0.032265,-0.737449,24.853543,-137.144363,214.409065,
+ -0.674632,0.032265,-0.737449,25.292234,-137.247495,214.00323,
+ -0.674632,0.032265,-0.737449,25.391716,-138.484167,213.858115,
+ -0.47476,0.164814,-0.864546,24.853543,-137.144363,214.409065,
+ -0.47476,0.164814,-0.864546,25.391716,-138.484167,213.858115,
+ -0.47476,0.164814,-0.864546,24.291032,-138.743974,214.41302,
+ -0.608351,0.300638,-0.734524,26.320512,-133.234167,214.399634,
+ -0.608351,0.300638,-0.734524,26.198214,-134.705092,213.898881,
+ -0.608351,0.300638,-0.734524,25.852615,-134.301386,214.35035,
+ -0.536382,0.311613,-0.784341,26.320512,-133.234167,214.399634,
+ -0.536382,0.311613,-0.784341,26.975812,-133.980734,213.654893,
+ -0.536382,0.311613,-0.784341,26.198214,-134.705092,213.898881,
+ -0.586342,0.390349,-0.709811,26.975812,-133.980734,213.654893,
+ -0.586342,0.390349,-0.709811,26.266056,-134.981023,213.691095,
+ -0.586342,0.390349,-0.709811,26.198214,-134.705092,213.898881,
+ -0.587552,0.391263,-0.708305,26.975812,-133.980734,213.654893,
+ -0.587552,0.391263,-0.708305,27.095067,-134.467493,213.287085,
+ -0.587552,0.391263,-0.708305,26.266056,-134.981023,213.691095,
+ -0.607674,0.488131,-0.626466,27.095067,-134.467493,213.287085,
+ -0.607674,0.488131,-0.626466,26.169009,-135.363433,213.487265,
+ -0.607674,0.488131,-0.626466,26.266056,-134.981023,213.691095,
+ -0.551051,0.406782,-0.728609,27.095067,-134.467493,213.287085,
+ -0.551051,0.406782,-0.728609,26.971857,-135.178769,212.983165,
+ -0.551051,0.406782,-0.728609,26.169009,-135.363433,213.487265,
+ -0.410145,0.384041,-0.827221,24.684698,-132.287421,215.006257,
+ -0.410145,0.384041,-0.827221,23.131633,-133.282235,215.314436,
+ -0.410145,0.384041,-0.827221,22.821324,-132.812208,215.686503,
+ -0.389442,0.225112,-0.893118,24.602253,-131.75655,215.176014,
+ -0.389442,0.225112,-0.893118,24.684698,-132.287421,215.006257,
+ -0.389442,0.225112,-0.893118,22.821324,-132.812208,215.686503,
+ 0.283882,0.210185,0.935539,27.177208,-139.463769,227.014904,
+ 0.283882,0.210185,0.935539,28.485068,-139.899114,226.715851,
+ 0.283882,0.210185,0.935539,30.217018,-139.809063,226.170073,
+ 0.266746,-0.009623,0.963719,30.736633,-139.268153,226.031651,
+ 0.266746,-0.009623,0.963719,27.177208,-139.463769,227.014904,
+ 0.266746,-0.009623,0.963719,30.217018,-139.809063,226.170073,
+ 0.269359,-0.00123,0.963039,26.395352,-137.903402,227.247635,
+ 0.269359,-0.00123,0.963039,30.736633,-139.268153,226.031651,
+ 0.269359,-0.00123,0.963039,30.696475,-138.29646,226.044124,
+ 0.280737,0.038555,0.95901,26.395352,-137.903402,227.247635,
+ 0.280737,0.038555,0.95901,26.560241,-138.778656,227.234554,
+ 0.280737,0.038555,0.95901,30.736633,-139.268153,226.031651,
+ 0.273911,0.057849,0.960014,26.399306,-137.255709,227.207478,
+ 0.273911,0.057849,0.960014,26.395352,-137.903402,227.247635,
+ 0.273911,0.057849,0.960014,30.696475,-138.29646,226.044124,
+ -0.778952,0.15086,-0.608667,25.907072,-136.432173,213.295908,
+ -0.778952,0.15086,-0.608667,25.279761,-136.873907,213.989235,
+ -0.778952,0.15086,-0.608667,25.093576,-136.240816,214.384423,
+ -0.67257,-0.173883,-0.719315,25.907072,-136.432173,213.295908,
+ -0.67257,-0.173883,-0.719315,25.628098,-137.174177,213.736121,
+ -0.67257,-0.173883,-0.719315,25.279761,-136.873907,213.989235,
+ -0.196011,0.078072,-0.977489,25.215874,-135.511591,214.463217,
+ -0.196011,0.078072,-0.977489,24.224103,-136.561773,214.578214,
+ -0.196011,0.078072,-0.977489,23.795146,-135.764705,214.727892,
+ -0.266772,0.147647,-0.952383,25.215874,-135.511591,214.463217,
+ -0.266772,0.147647,-0.952383,25.093576,-136.240816,214.384423,
+ -0.266772,0.147647,-0.952383,24.224103,-136.561773,214.578214,
+ -0.716481,0.192608,-0.670491,26.169009,-135.363433,213.487265,
+ -0.716481,0.192608,-0.670491,25.093576,-136.240816,214.384423,
+ -0.716481,0.192608,-0.670491,25.215874,-135.511591,214.463217,
+ 0.631198,0.028697,-0.775091,27.789916,-135.122488,212.758344,
+ 0.631198,0.028697,-0.775091,29.316514,-138.223751,213.886712,
+ 0.631198,0.028697,-0.775091,28.09414,-137.33572,212.924146,
+ 0.500026,-0.219702,-0.837678,28.09414,-137.33572,212.924146,
+ 0.500026,-0.219702,-0.837678,29.316514,-138.223751,213.886712,
+ 0.500026,-0.219702,-0.837678,27.416633,-137.926523,212.674682,
+ 0.477981,-0.304475,-0.823911,27.416633,-137.926523,212.674682,
+ 0.477981,-0.304475,-0.823911,29.316514,-138.223751,213.886712,
+ 0.477981,-0.304475,-0.823911,28.612538,-139.008649,213.768368,
+ -0.510401,-0.61375,-0.602331,25.822801,-140.518515,214.124615,
+ -0.510401,-0.61375,-0.602331,24.067427,-139.228908,214.298023,
+ -0.510401,-0.61375,-0.602331,25.318093,-139.414485,213.427333,
+ -0.511852,-0.616233,-0.598553,25.822801,-140.518515,214.124615,
+ -0.511852,-0.616233,-0.598553,24.269432,-139.999508,214.918641,
+ -0.511852,-0.616233,-0.598553,24.067427,-139.228908,214.298023,
+ 0.334707,0.63789,-0.69359,27.189073,-131.831693,214.742495,
+ 0.334707,0.63789,-0.69359,27.719336,-133.410922,213.54598,
+ 0.334707,0.63789,-0.69359,26.570889,-132.174858,214.12857,
+ 0.46094,0.629043,-0.625971,28.666995,-133.396015,214.258778,
+ 0.46094,0.629043,-0.625971,27.719336,-133.410922,213.54598,
+ 0.46094,0.629043,-0.625971,27.189073,-131.831693,214.742495,
+ 0.541307,0.419944,-0.728446,28.666995,-133.396015,214.258778,
+ 0.541307,0.419944,-0.728446,28.041509,-134.214074,213.322376,
+ 0.541307,0.419944,-0.728446,27.719336,-133.410922,213.54598,
+ 0.652768,0.298091,-0.696445,28.666995,-133.396015,214.258778,
+ 0.652768,0.298091,-0.696445,29.22768,-134.499436,214.312017,
+ 0.652768,0.298091,-0.696445,28.041509,-134.214074,213.322376,
+ 0.65473,0.259463,-0.709935,28.041509,-134.214074,213.322376,
+ 0.65473,0.259463,-0.709935,29.22768,-134.499436,214.312017,
+ 0.65473,0.259463,-0.709935,27.789916,-135.122488,212.758344,
+ 0.70472,0.118244,-0.699563,27.789916,-135.122488,212.758344,
+ 0.70472,0.118244,-0.699563,29.22768,-134.499436,214.312017,
+ 0.70472,0.118244,-0.699563,29.131849,-135.747973,214.004446,
+ 0.14311,0.989581,0.015751,27.189073,-131.831693,214.742495,
+ 0.14311,0.989581,0.015751,24.590389,-131.466624,215.417568,
+ 0.14311,0.989581,0.015751,25.022691,-131.565193,217.682519,
+ 0.33585,0.927636,0.163388,27.879054,-132.606248,217.721763,
+ 0.33585,0.927636,0.163388,27.189073,-131.831693,214.742495,
+ 0.33585,0.927636,0.163388,25.022691,-131.565193,217.682519,
+ -0.301147,0.865481,0.400317,24.590389,-131.466624,215.417568,
+ -0.301147,0.865481,0.400317,22.917155,-132.73524,216.901575,
+ -0.301147,0.865481,0.400317,23.999585,-133.087227,218.476848,
+ -0.7728,0.610314,0.174062,24.590389,-131.466624,215.417568,
+ -0.7728,0.610314,0.174062,23.999585,-133.087227,218.476848,
+ -0.7728,0.610314,0.174062,25.022691,-131.565193,217.682519,
+ 0.313163,0.8733,0.373197,27.879054,-132.606248,217.721763,
+ 0.313163,0.8733,0.373197,25.022691,-131.565193,217.682519,
+ 0.313163,0.8733,0.373197,25.627794,-132.533235,219.440022,
+ 0.340753,0.845793,0.410513,27.879054,-132.606248,217.721763,
+ 0.340753,0.845793,0.410513,25.627794,-132.533235,219.440022,
+ 0.340753,0.845793,0.410513,27.775617,-133.356466,219.353318,
+ -0.687428,0.640628,0.342107,25.022691,-131.565193,217.682519,
+ -0.687428,0.640628,0.342107,23.999585,-133.087227,218.476848,
+ -0.687428,0.640628,0.342107,24.43493,-133.475113,220.077981,
+ -0.324716,0.776755,0.539639,25.627794,-132.533235,219.440022,
+ -0.324716,0.776755,0.539639,25.022691,-131.565193,217.682519,
+ -0.324716,0.776755,0.539639,24.43493,-133.475113,220.077981,
+ 0.348087,0.871885,0.34446,27.775617,-133.356466,219.353318,
+ 0.348087,0.871885,0.34446,25.627794,-132.533235,219.440022,
+ 0.348087,0.871885,0.34446,26.057663,-133.430088,221.275712,
+ 0.366463,0.857822,0.360343,27.775617,-133.356466,219.353318,
+ 0.366463,0.857822,0.360343,26.057663,-133.430088,221.275712,
+ 0.366463,0.857822,0.360343,27.732722,-134.010852,220.954755,
+ -0.613333,0.706535,0.353032,26.752511,-135.468999,225.303034,
+ -0.613333,0.706535,0.353032,26.710224,-135.124922,224.540952,
+ -0.613333,0.706535,0.353032,26.190304,-136.057978,225.505039,
+ -0.561756,0.667376,0.488917,22.917155,-132.73524,216.901575,
+ -0.561756,0.667376,0.488917,22.037338,-133.527744,216.972459,
+ -0.561756,0.667376,0.488917,22.849617,-134.141364,218.743349,
+ -0.515029,0.690315,0.508144,23.999585,-133.087227,218.476848,
+ -0.515029,0.690315,0.508144,22.917155,-132.73524,216.901575,
+ -0.515029,0.690315,0.508144,22.849617,-134.141364,218.743349,
+ -0.714647,0.532305,0.453797,22.037338,-133.527744,216.972459,
+ -0.714647,0.532305,0.453797,21.517115,-134.420946,217.200931,
+ -0.714647,0.532305,0.453797,21.990488,-135.185158,218.84283,
+ -0.646124,0.579187,0.497057,22.037338,-133.527744,216.972459,
+ -0.646124,0.579187,0.497057,21.990488,-135.185158,218.84283,
+ -0.646124,0.579187,0.497057,22.849617,-134.141364,218.743349,
+ -0.519432,0.693033,0.499895,23.999585,-133.087227,218.476848,
+ -0.519432,0.693033,0.499895,22.849617,-134.141364,218.743349,
+ -0.519432,0.693033,0.499895,23.608353,-134.758331,220.387073,
+ -0.409113,0.806822,0.426223,25.627794,-132.533235,219.440022,
+ -0.409113,0.806822,0.426223,24.43493,-133.475113,220.077981,
+ -0.409113,0.806822,0.426223,25.131299,-134.106379,221.941355,
+ -0.271856,0.838022,0.473089,26.057663,-133.430088,221.275712,
+ -0.271856,0.838022,0.473089,25.627794,-132.533235,219.440022,
+ -0.271856,0.838022,0.473089,25.131299,-134.106379,221.941355,
+ 0.368209,0.823782,0.431051,27.732722,-134.010852,220.954755,
+ 0.368209,0.823782,0.431051,26.057663,-133.430088,221.275712,
+ 0.368209,0.823782,0.431051,26.032412,-134.271572,222.905442,
+ 0.163618,0.949011,0.269458,27.732722,-134.010852,220.954755,
+ 0.163618,0.949011,0.269458,26.032412,-134.271572,222.905442,
+ 0.163618,0.949011,0.269458,27.416024,-134.474186,222.778884,
+ -0.155531,0.792915,0.589148,26.057663,-133.430088,221.275712,
+ -0.155531,0.792915,0.589148,25.131299,-134.106379,221.941355,
+ -0.155531,0.792915,0.589148,25.535005,-134.972505,223.213621,
+ -0.701379,0.637718,0.318408,26.057663,-133.430088,221.275712,
+ -0.701379,0.637718,0.318408,25.535005,-134.972505,223.213621,
+ -0.701379,0.637718,0.318408,26.032412,-134.271572,222.905442,
+ 0.168517,0.900813,0.400172,27.416024,-134.474186,222.778884,
+ 0.168517,0.900813,0.400172,26.032412,-134.271572,222.905442,
+ 0.168517,0.900813,0.400172,26.710224,-135.124922,224.540952,
+ -0.421697,0.892392,0.160651,27.416024,-134.474186,222.778884,
+ -0.421697,0.892392,0.160651,26.710224,-135.124922,224.540952,
+ -0.421697,0.892392,0.160651,27.358222,-134.78054,224.328907,
+ -0.617852,0.639559,0.45741,26.102688,-135.368605,224.534259,
+ -0.617852,0.639559,0.45741,26.032412,-134.271572,222.905442,
+ -0.617852,0.639559,0.45741,25.535005,-134.972505,223.213621,
+ -0.318694,0.779744,0.538919,26.710224,-135.124922,224.540952,
+ -0.318694,0.779744,0.538919,26.032412,-134.271572,222.905442,
+ -0.318694,0.779744,0.538919,26.102688,-135.368605,224.534259,
+ -0.322546,0.855858,0.404315,27.358222,-134.78054,224.328907,
+ -0.322546,0.855858,0.404315,26.710224,-135.124922,224.540952,
+ -0.322546,0.855858,0.404315,26.752511,-135.468999,225.303034,
+ -0.489188,0.82612,0.27968,27.38834,-135.031829,225.123845,
+ -0.489188,0.82612,0.27968,27.358222,-134.78054,224.328907,
+ -0.489188,0.82612,0.27968,26.752511,-135.468999,225.303034,
+ -0.3116,0.761241,0.568698,26.710224,-135.124922,224.540952,
+ -0.3116,0.761241,0.568698,26.102688,-135.368605,224.534259,
+ -0.3116,0.761241,0.568698,26.190304,-136.057978,225.505039,
+ 0.004026,-0.992344,0.123436,29.348761,-140.701353,219.88206,
+ 0.004026,-0.992344,0.123436,27.937465,-140.657241,220.282724,
+ 0.004026,-0.992344,0.123436,27.696519,-140.895449,218.375542,
+ 0.705435,-0.679423,-0.201858,30.420239,-140.105074,217.184199,
+ 0.705435,-0.679423,-0.201858,30.738154,-140.495089,219.607954,
+ 0.705435,-0.679423,-0.201858,29.631081,-141.018355,217.500288,
+ 0.174105,-0.97321,0.150167,30.738154,-140.495089,219.607954,
+ 0.174105,-0.97321,0.150167,29.348761,-140.701353,219.88206,
+ 0.174105,-0.97321,0.150167,29.631081,-141.018355,217.500288,
+ -0.005444,-0.995884,0.090471,29.348761,-140.701353,219.88206,
+ -0.005444,-0.995884,0.090471,29.161055,-140.53981,221.648995,
+ -0.005444,-0.995884,0.090471,27.937465,-140.657241,220.282724,
+ -0.065612,-0.987454,0.143631,29.161055,-140.53981,221.648995,
+ -0.065612,-0.987454,0.143631,27.948417,-140.403214,222.034143,
+ -0.065612,-0.987454,0.143631,27.937465,-140.657241,220.282724,
+ 0.163621,-0.982399,0.090114,30.738154,-140.495089,219.607954,
+ 0.163621,-0.982399,0.090114,30.624982,-140.360622,221.279363,
+ 0.163621,-0.982399,0.090114,29.348761,-140.701353,219.88206,
+ 0.147028,-0.983486,0.105535,30.624982,-140.360622,221.279363,
+ 0.147028,-0.983486,0.105535,29.161055,-140.53981,221.648995,
+ 0.147028,-0.983486,0.105535,29.348761,-140.701353,219.88206,
+ -0.089376,-0.993468,0.070944,29.161055,-140.53981,221.648995,
+ -0.089376,-0.993468,0.070944,29.143106,-140.424205,223.24526,
+ -0.089376,-0.993468,0.070944,27.948417,-140.403214,222.034143,
+ -0.077694,-0.995207,0.059391,29.143106,-140.424205,223.24526,
+ -0.077694,-0.995207,0.059391,27.989791,-140.309512,223.658397,
+ -0.077694,-0.995207,0.059391,27.948417,-140.403214,222.034143,
+ 0.137019,-0.988534,0.063449,30.624982,-140.360622,221.279363,
+ 0.137019,-0.988534,0.063449,30.361524,-140.304036,222.729904,
+ 0.137019,-0.988534,0.063449,29.161055,-140.53981,221.648995,
+ 0.128451,-0.98902,0.073072,30.361524,-140.304036,222.729904,
+ 0.128451,-0.98902,0.073072,29.143106,-140.424205,223.24526,
+ 0.128451,-0.98902,0.073072,29.161055,-140.53981,221.648995,
+ -0.076066,-0.995053,0.063895,29.274226,-140.345715,224.623701,
+ -0.076066,-0.995053,0.063895,27.989791,-140.309512,223.658397,
+ -0.076066,-0.995053,0.063895,29.143106,-140.424205,223.24526,
+ -0.064719,-0.996713,0.048735,29.274226,-140.345715,224.623701,
+ -0.064719,-0.996713,0.048735,28.195751,-140.255665,225.033187,
+ -0.064719,-0.996713,0.048735,27.989791,-140.309512,223.658397,
+ 0.112491,-0.993057,0.034397,30.361524,-140.304036,222.729904,
+ 0.112491,-0.993057,0.034397,30.275429,-140.258099,224.33773,
+ 0.112491,-0.993057,0.034397,29.143106,-140.424205,223.24526,
+ 0.100407,-0.993834,0.047039,30.275429,-140.258099,224.33773,
+ 0.100407,-0.993834,0.047039,29.274226,-140.345715,224.623701,
+ 0.100407,-0.993834,0.047039,29.143106,-140.424205,223.24526,
+ -0.846229,-0.486854,0.216492,22.741922,-138.560831,215.902198,
+ -0.846229,-0.486854,0.216492,23.231114,-138.917078,217.013225,
+ -0.846229,-0.486854,0.216492,21.580393,-136.317481,216.406906,
+ -0.850172,-0.505565,0.147006,21.580393,-136.317481,216.406906,
+ -0.850172,-0.505565,0.147006,23.231114,-138.917078,217.013225,
+ -0.850172,-0.505565,0.147006,22.007524,-136.473852,218.339339,
+ -0.611092,-0.771091,0.178842,25.217699,-140.340848,216.687097,
+ -0.611092,-0.771091,0.178842,22.741922,-138.560831,215.902198,
+ -0.611092,-0.771091,0.178842,24.269432,-139.999508,214.918641,
+ -0.582946,-0.812502,-0.003851,25.217699,-140.340848,216.687097,
+ -0.582946,-0.812502,-0.003851,23.231114,-138.917078,217.013225,
+ -0.582946,-0.812502,-0.003851,22.741922,-138.560831,215.902198,
+ -0.79728,-0.542703,0.264232,23.231114,-138.917078,217.013225,
+ -0.79728,-0.542703,0.264232,24.026357,-138.952976,219.33902,
+ -0.79728,-0.542703,0.264232,22.007524,-136.473852,218.339339,
+ -0.797818,-0.551114,0.244458,22.007524,-136.473852,218.339339,
+ -0.797818,-0.551114,0.244458,24.026357,-138.952976,219.33902,
+ -0.797818,-0.551114,0.244458,22.842924,-136.963958,219.960854,
+ -0.559698,-0.81514,0.149282,25.508233,-140.105986,219.058829,
+ -0.559698,-0.81514,0.149282,23.231114,-138.917078,217.013225,
+ -0.559698,-0.81514,0.149282,25.217699,-140.340848,216.687097,
+ -0.581112,-0.792173,0.186468,25.508233,-140.105986,219.058829,
+ -0.581112,-0.792173,0.186468,24.026357,-138.952976,219.33902,
+ -0.581112,-0.792173,0.186468,23.231114,-138.917078,217.013225,
+ -0.792904,-0.552267,0.257498,24.026357,-138.952976,219.33902,
+ -0.792904,-0.552267,0.257498,24.635414,-138.97123,221.175318,
+ -0.792904,-0.552267,0.257498,22.842924,-136.963958,219.960854,
+ -0.783602,-0.598123,0.167977,22.842924,-136.963958,219.960854,
+ -0.783602,-0.598123,0.167977,24.635414,-138.97123,221.175318,
+ -0.783602,-0.598123,0.167977,23.631169,-137.586705,221.420523,
+ -0.566559,-0.787281,0.243309,25.966395,-139.848917,220.957493,
+ -0.566559,-0.787281,0.243309,24.026357,-138.952976,219.33902,
+ -0.566559,-0.787281,0.243309,25.508233,-140.105986,219.058829,
+ 0.584397,0.799312,0.139929,30.528543,-136.664601,224.257415,
+ 0.584397,0.799312,0.139929,30.511811,-136.448602,223.093452,
+ 0.584397,0.799312,0.139929,28.841011,-135.476605,224.519048,
+ 0.895215,0.440287,0.068836,31.341735,-138.104799,222.893577,
+ 0.895215,0.440287,0.068836,30.511811,-136.448602,223.093452,
+ 0.895215,0.440287,0.068836,30.528543,-136.664601,224.257415,
+ 0.894784,0.441379,0.067426,31.341735,-138.104799,222.893577,
+ 0.894784,0.441379,0.067426,30.528543,-136.664601,224.257415,
+ 0.894784,0.441379,0.067426,31.318918,-138.175379,223.658397,
+ 0.96095,0.141555,-0.237776,30.348747,-135.906474,215.54443,
+ 0.96095,0.141555,-0.237776,30.422673,-134.234457,216.8386,
+ 0.96095,0.141555,-0.237776,30.761275,-135.06286,217.713854,
+ 0.942732,0.208507,-0.260347,30.348747,-135.906474,215.54443,
+ 0.942732,0.208507,-0.260347,30.761275,-135.06286,217.713854,
+ 0.942732,0.208507,-0.260347,31.083448,-136.821885,217.471691,
+ 0.98427,0.013905,-0.176125,31.083448,-136.821885,217.471691,
+ 0.98427,0.013905,-0.176125,31.42783,-137.146188,219.370659,
+ 0.98427,0.013905,-0.176125,31.426309,-139.258113,219.195426,
+ 0.966973,-0.041808,-0.251426,30.926164,-139.050936,217.237438,
+ 0.966973,-0.041808,-0.251426,31.083448,-136.821885,217.471691,
+ 0.966973,-0.041808,-0.251426,31.426309,-139.258113,219.195426,
+ 0.874174,-0.406105,-0.266268,30.420239,-140.105074,217.184199,
+ 0.874174,-0.406105,-0.266268,30.926164,-139.050936,217.237438,
+ 0.874174,-0.406105,-0.266268,31.426309,-139.258113,219.195426,
+ 0.828612,-0.525417,-0.193233,30.420239,-140.105074,217.184199,
+ 0.828612,-0.525417,-0.193233,31.426309,-139.258113,219.195426,
+ 0.828612,-0.525417,-0.193233,30.738154,-140.495089,219.607954,
+ -0.292148,-0.943764,0.154785,27.937465,-140.657241,220.282724,
+ -0.292148,-0.943764,0.154785,25.508233,-140.105986,219.058829,
+ -0.292148,-0.943764,0.154785,27.696519,-140.895449,218.375542,
+ -0.311991,-0.928578,0.20101,27.937465,-140.657241,220.282724,
+ -0.311991,-0.928578,0.20101,25.966395,-139.848917,220.957493,
+ -0.311991,-0.928578,0.20101,25.508233,-140.105986,219.058829,
+ 0.472127,0.811531,0.344258,29.420254,-133.99412,218.600972,
+ 0.472127,0.811531,0.344258,27.775617,-133.356466,219.353318,
+ 0.472127,0.811531,0.344258,27.732722,-134.010852,220.954755,
+ 0.487002,0.798077,0.354827,29.420254,-133.99412,218.600972,
+ 0.487002,0.798077,0.354827,27.732722,-134.010852,220.954755,
+ 0.487002,0.798077,0.354827,29.125765,-134.600135,220.368211,
+ 0.712254,0.619002,0.330954,30.761275,-135.06286,217.713854,
+ 0.712254,0.619002,0.330954,29.420254,-133.99412,218.600972,
+ 0.712254,0.619002,0.330954,29.125765,-134.600135,220.368211,
+ 0.983741,0.179531,0.004688,31.083448,-136.821885,217.471691,
+ 0.983741,0.179531,0.004688,30.761275,-135.06286,217.713854,
+ 0.983741,0.179531,0.004688,30.89635,-135.85293,219.625599,
+ 0.913506,0.394784,-0.098246,31.083448,-136.821885,217.471691,
+ 0.913506,0.394784,-0.098246,30.89635,-135.85293,219.625599,
+ 0.913506,0.394784,-0.098246,31.42783,-137.146188,219.370659,
+ 0.988821,-0.113531,-0.096666,31.42783,-137.146188,219.370659,
+ 0.988821,-0.113531,-0.096666,31.564427,-137.643291,221.351768,
+ 0.988821,-0.113531,-0.096666,31.329262,-139.62805,221.277233,
+ 0.998942,-0.004517,0.045765,31.426309,-139.258113,219.195426,
+ 0.998942,-0.004517,0.045765,31.42783,-137.146188,219.370659,
+ 0.998942,-0.004517,0.045765,31.329262,-139.62805,221.277233,
+ 0.865963,-0.497791,-0.048089,31.426309,-139.258113,219.195426,
+ 0.865963,-0.497791,-0.048089,31.329262,-139.62805,221.277233,
+ 0.865963,-0.497791,-0.048089,30.738154,-140.495089,219.607954,
+ 0.717133,-0.689134,0.103999,30.738154,-140.495089,219.607954,
+ 0.717133,-0.689134,0.103999,31.329262,-139.62805,221.277233,
+ 0.717133,-0.689134,0.103999,30.624982,-140.360622,221.279363,
+ -0.335241,-0.932076,0.137285,27.948417,-140.403214,222.034143,
+ -0.335241,-0.932076,0.137285,25.966395,-139.848917,220.957493,
+ -0.335241,-0.932076,0.137285,27.937465,-140.657241,220.282724,
+ -0.341043,-0.927992,0.15007,27.948417,-140.403214,222.034143,
+ -0.341043,-0.927992,0.15007,26.098124,-139.620444,222.669668,
+ -0.341043,-0.927992,0.15007,25.966395,-139.848917,220.957493,
+ 0.474543,0.829965,0.293201,29.125765,-134.600135,220.368211,
+ 0.474543,0.829965,0.293201,27.732722,-134.010852,220.954755,
+ 0.474543,0.829965,0.293201,27.416024,-134.474186,222.778884,
+ 0.441878,0.855895,0.268679,29.125765,-134.600135,220.368211,
+ 0.441878,0.855895,0.268679,27.416024,-134.474186,222.778884,
+ 0.441878,0.855895,0.268679,28.914329,-135.055863,222.167698,
+ 0.627982,0.733657,0.259588,30.89635,-135.85293,219.625599,
+ 0.627982,0.733657,0.259588,29.125765,-134.600135,220.368211,
+ 0.627982,0.733657,0.259588,28.914329,-135.055863,222.167698,
+ 0.627915,0.73394,0.258951,29.125765,-134.600135,220.368211,
+ 0.627915,0.73394,0.258951,30.89635,-135.85293,219.625599,
+ 0.627915,0.73394,0.258951,30.761275,-135.06286,217.713854,
+ 0.561155,0.80688,0.184526,30.89635,-135.85293,219.625599,
+ 0.561155,0.80688,0.184526,28.914329,-135.055863,222.167698,
+ 0.561155,0.80688,0.184526,30.673354,-136.150766,221.6061,
+ 0.924007,0.34888,0.156505,31.42783,-137.146188,219.370659,
+ 0.924007,0.34888,0.156505,30.89635,-135.85293,219.625599,
+ 0.924007,0.34888,0.156505,30.673354,-136.150766,221.6061,
+ 0.86167,0.503052,0.066815,31.42783,-137.146188,219.370659,
+ 0.86167,0.503052,0.066815,30.673354,-136.150766,221.6061,
+ 0.86167,0.503052,0.066815,31.564427,-137.643291,221.351768,
+ 0.978334,-0.188883,0.084768,31.564427,-137.643291,221.351768,
+ 0.978334,-0.188883,0.084768,31.341735,-138.104799,222.893577,
+ 0.978334,-0.188883,0.084768,31.060936,-139.577245,222.853419,
+ 0.977763,-0.12225,0.170392,31.329262,-139.62805,221.277233,
+ 0.977763,-0.12225,0.170392,31.564427,-137.643291,221.351768,
+ 0.977763,-0.12225,0.170392,31.060936,-139.577245,222.853419,
+ 0.713629,-0.68565,0.143587,31.329262,-139.62805,221.277233,
+ 0.713629,-0.68565,0.143587,31.060936,-139.577245,222.853419,
+ 0.713629,-0.68565,0.143587,30.624982,-140.360622,221.279363,
+ 0.698716,-0.698592,0.154158,30.624982,-140.360622,221.279363,
+ 0.698716,-0.698592,0.154158,31.060936,-139.577245,222.853419,
+ 0.698716,-0.698592,0.154158,30.361524,-140.304036,222.729904,
+ -0.370447,-0.926721,0.062898,27.989791,-140.309512,223.658397,
+ -0.370447,-0.926721,0.062898,26.098124,-139.620444,222.669668,
+ -0.370447,-0.926721,0.062898,27.948417,-140.403214,222.034143,
+ -0.406019,-0.901741,0.148363,27.989791,-140.309512,223.658397,
+ -0.406019,-0.901741,0.148363,26.199127,-139.400186,224.284795,
+ -0.406019,-0.901741,0.148363,26.098124,-139.620444,222.669668,
+ 0.421953,0.88629,0.190906,28.914329,-135.055863,222.167698,
+ 0.421953,0.88629,0.190906,27.416024,-134.474186,222.778884,
+ 0.421953,0.88629,0.190906,27.358222,-134.78054,224.328907,
+ 0.416141,0.890022,0.186246,28.914329,-135.055863,222.167698,
+ 0.416141,0.890022,0.186246,27.358222,-134.78054,224.328907,
+ 0.416141,0.890022,0.186246,28.810588,-135.32936,223.706464,
+ 0.560765,0.807861,0.181393,30.673354,-136.150766,221.6061,
+ 0.560765,0.807861,0.181393,28.914329,-135.055863,222.167698,
+ 0.560765,0.807861,0.181393,28.810588,-135.32936,223.706464,
+ 0.590205,0.776795,0.219653,30.673354,-136.150766,221.6061,
+ 0.590205,0.776795,0.219653,28.810588,-135.32936,223.706464,
+ 0.590205,0.776795,0.219653,30.511811,-136.448602,223.093452,
+ 0.856977,0.479416,0.189078,31.564427,-137.643291,221.351768,
+ 0.856977,0.479416,0.189078,30.673354,-136.150766,221.6061,
+ 0.856977,0.479416,0.189078,30.511811,-136.448602,223.093452,
+ 0.877511,0.409629,0.249358,31.564427,-137.643291,221.351768,
+ 0.877511,0.409629,0.249358,30.511811,-136.448602,223.093452,
+ 0.877511,0.409629,0.249358,31.341735,-138.104799,222.893577,
+ 0.982167,-0.187629,0.011986,31.060936,-139.577245,222.853419,
+ 0.982167,-0.187629,0.011986,31.341735,-138.104799,222.893577,
+ 0.982167,-0.187629,0.011986,31.318918,-138.175379,223.658397,
+ 0.978453,-0.20268,0.039389,31.060936,-139.577245,222.853419,
+ 0.978453,-0.20268,0.039389,31.318918,-138.175379,223.658397,
+ 0.978453,-0.20268,0.039389,31.012868,-139.610405,223.87683,
+ 0.719543,-0.694356,0.011297,30.361524,-140.304036,222.729904,
+ 0.719543,-0.694356,0.011297,31.060936,-139.577245,222.853419,
+ 0.719543,-0.694356,0.011297,31.012868,-139.610405,223.87683,
+ 0.67879,-0.732096,0.057265,31.012868,-139.610405,223.87683,
+ 0.67879,-0.732096,0.057265,30.275429,-140.258099,224.33773,
+ 0.67879,-0.732096,0.057265,30.361524,-140.304036,222.729904,
+ -0.422924,-0.90078,0.098641,28.195751,-140.255665,225.033187,
+ -0.422924,-0.90078,0.098641,26.199127,-139.400186,224.284795,
+ -0.422924,-0.90078,0.098641,27.989791,-140.309512,223.658397,
+ -0.439312,-0.883608,0.161993,28.195751,-140.255665,225.033187,
+ -0.439312,-0.883608,0.161993,26.41756,-139.325347,225.285389,
+ -0.439312,-0.883608,0.161993,26.199127,-139.400186,224.284795,
+ 0.435838,0.862783,0.256223,28.810588,-135.32936,223.706464,
+ 0.435838,0.862783,0.256223,27.358222,-134.78054,224.328907,
+ 0.435838,0.862783,0.256223,27.38834,-135.031829,225.123845,
+ 0.347522,0.924843,0.154576,28.841011,-135.476605,224.519048,
+ 0.347522,0.924843,0.154576,28.810588,-135.32936,223.706464,
+ 0.347522,0.924843,0.154576,27.38834,-135.031829,225.123845,
+ 0.576314,0.807647,0.124773,30.511811,-136.448602,223.093452,
+ 0.576314,0.807647,0.124773,28.810588,-135.32936,223.706464,
+ 0.576314,0.807647,0.124773,28.841011,-135.476605,224.519048,
+ -0.753462,0.362942,-0.548241,26.057358,-136.079578,213.166613,
+ -0.753462,0.362942,-0.548241,25.093576,-136.240816,214.384423,
+ -0.753462,0.362942,-0.548241,26.169009,-135.363433,213.487265,
+ -0.197131,0.08522,-0.976666,23.774155,-135.293766,214.773221,
+ -0.197131,0.08522,-0.976666,25.215874,-135.511591,214.463217,
+ -0.197131,0.08522,-0.976666,23.795146,-135.764705,214.727892,
+ -0.664253,0.475849,-0.576486,26.169009,-135.363433,213.487265,
+ -0.664253,0.475849,-0.576486,25.215874,-135.511591,214.463217,
+ -0.664253,0.475849,-0.576486,26.266056,-134.981023,213.691095,
+ -0.18995,0.128104,-0.9734,24.087202,-134.859638,214.769266,
+ -0.18995,0.128104,-0.9734,25.215874,-135.511591,214.463217,
+ -0.18995,0.128104,-0.9734,23.774155,-135.293766,214.773221,
+ -0.662487,0.339813,-0.667562,26.198214,-134.705092,213.898881,
+ -0.662487,0.339813,-0.667562,26.266056,-134.981023,213.691095,
+ -0.662487,0.339813,-0.667562,25.215874,-135.511591,214.463217,
+ -0.053241,0.570516,-0.819559,24.408158,-134.626906,214.910426,
+ -0.053241,0.570516,-0.819559,25.306228,-134.828911,214.711464,
+ -0.053241,0.570516,-0.819559,24.087202,-134.859638,214.769266,
+ -0.053149,0.347465,-0.936185,25.306228,-134.828911,214.711464,
+ -0.053149,0.347465,-0.936185,25.215874,-135.511591,214.463217,
+ -0.053149,0.347465,-0.936185,24.087202,-134.859638,214.769266,
+ -0.717674,0.319912,-0.618547,25.852615,-134.301386,214.35035,
+ -0.717674,0.319912,-0.618547,25.215874,-135.511591,214.463217,
+ -0.717674,0.319912,-0.618547,25.306228,-134.828911,214.711464,
+ -0.635296,0.266663,-0.724769,25.852615,-134.301386,214.35035,
+ -0.635296,0.266663,-0.724769,26.198214,-134.705092,213.898881,
+ -0.635296,0.266663,-0.724769,25.215874,-135.511591,214.463217,
+ -0.684551,-0.050097,-0.727241,25.279761,-136.873907,213.989235,
+ -0.684551,-0.050097,-0.727241,25.292234,-137.247495,214.00323,
+ -0.684551,-0.050097,-0.727241,24.853543,-137.144363,214.409065,
+ -0.614955,-0.050011,-0.786974,25.279761,-136.873907,213.989235,
+ -0.614955,-0.050011,-0.786974,25.628098,-137.174177,213.736121,
+ -0.614955,-0.050011,-0.786974,25.292234,-137.247495,214.00323,
+ -0.786364,0.112423,-0.607448,26.057358,-136.079578,213.166613,
+ -0.786364,0.112423,-0.607448,25.907072,-136.432173,213.295908,
+ -0.786364,0.112423,-0.607448,25.093576,-136.240816,214.384423,
+ -0.478664,-0.101241,-0.872142,25.099356,-134.285871,214.761965,
+ -0.478664,-0.101241,-0.872142,25.852615,-134.301386,214.35035,
+ -0.478664,-0.101241,-0.872142,25.306228,-134.828911,214.711464,
+ -0.214321,0.009186,-0.97672,25.099356,-134.285871,214.761965,
+ -0.214321,0.009186,-0.97672,25.306228,-134.828911,214.711464,
+ -0.214321,0.009186,-0.97672,24.408158,-134.626906,214.910426,
+ -0.239517,0.0637,-0.9688,23.131633,-133.282235,215.314436,
+ -0.239517,0.0637,-0.9688,25.099356,-134.285871,214.761965,
+ -0.239517,0.0637,-0.9688,24.408158,-134.626906,214.910426,
+ -0.236721,0.069346,-0.9691,24.684698,-132.287421,215.006257,
+ -0.236721,0.069346,-0.9691,25.099356,-134.285871,214.761965,
+ -0.236721,0.069346,-0.9691,23.131633,-133.282235,215.314436,
+ -0.479384,0.007808,-0.877571,24.684698,-132.287421,215.006257,
+ -0.479384,0.007808,-0.877571,25.852615,-134.301386,214.35035,
+ -0.479384,0.007808,-0.877571,25.099356,-134.285871,214.761965,
+ -0.750698,0.565736,0.341167,23.999585,-133.087227,218.476848,
+ -0.750698,0.565736,0.341167,23.608353,-134.758331,220.387073,
+ -0.750698,0.565736,0.341167,24.43493,-133.475113,220.077981,
+ -0.594534,0.54564,0.590599,22.849617,-134.141364,218.743349,
+ -0.594534,0.54564,0.590599,21.990488,-135.185158,218.84283,
+ -0.594534,0.54564,0.590599,22.819195,-136.124907,220.545269,
+ -0.718341,0.473792,0.509419,22.849617,-134.141364,218.743349,
+ -0.718341,0.473792,0.509419,22.819195,-136.124907,220.545269,
+ -0.718341,0.473792,0.509419,23.608353,-134.758331,220.387073,
+ -0.663278,0.549596,0.507943,24.43493,-133.475113,220.077981,
+ -0.663278,0.549596,0.507943,23.608353,-134.758331,220.387073,
+ -0.663278,0.549596,0.507943,24.461093,-135.336357,222.126019,
+ -0.756585,0.479075,0.445046,24.43493,-133.475113,220.077981,
+ -0.756585,0.479075,0.445046,24.461093,-135.336357,222.126019,
+ -0.756585,0.479075,0.445046,25.131299,-134.106379,221.941355,
+ -0.718376,0.472751,0.510336,24.461093,-135.336357,222.126019,
+ -0.718376,0.472751,0.510336,22.819195,-136.124907,220.545269,
+ -0.718376,0.472751,0.510336,23.681366,-136.526787,222.131191,
+ -0.718202,0.47374,0.509662,22.819195,-136.124907,220.545269,
+ -0.718202,0.47374,0.509662,24.461093,-135.336357,222.126019,
+ -0.718202,0.47374,0.509662,23.608353,-134.758331,220.387073,
+ -0.192471,0.271639,-0.942957,24.602253,-131.75655,215.176014,
+ -0.192471,0.271639,-0.942957,26.320512,-133.234167,214.399634,
+ -0.192471,0.271639,-0.942957,24.684698,-132.287421,215.006257,
+ -0.484708,-0.107555,-0.868038,24.602253,-131.75655,215.176014,
+ -0.484708,-0.107555,-0.868038,26.570889,-132.174858,214.12857,
+ -0.484708,-0.107555,-0.868038,26.320512,-133.234167,214.399634,
+ -0.777072,0.002583,-0.629406,22.412447,-134.458062,215.140116,
+ -0.777072,0.002583,-0.629406,21.692044,-134.277048,216.030276,
+ -0.777072,0.002583,-0.629406,22.412751,-133.773557,215.14255,
+ -0.794081,0.0727,-0.603448,22.412751,-133.773557,215.14255,
+ -0.794081,0.0727,-0.603448,21.692044,-134.277048,216.030276,
+ -0.794081,0.0727,-0.603448,22.038859,-133.445908,215.67403,
+ -0.317189,0.691247,-0.649283,23.131633,-133.282235,215.314436,
+ -0.317189,0.691247,-0.649283,22.412751,-133.773557,215.14255,
+ -0.317189,0.691247,-0.649283,22.038859,-133.445908,215.67403,
+ -0.339562,0.435684,-0.833593,22.821324,-132.812208,215.686503,
+ -0.339562,0.435684,-0.833593,23.131633,-133.282235,215.314436,
+ -0.339562,0.435684,-0.833593,22.038859,-133.445908,215.67403,
+ -0.330319,-0.228924,-0.915687,26.614393,-137.144971,212.768687,
+ -0.330319,-0.228924,-0.915687,27.416633,-137.926523,212.674682,
+ -0.330319,-0.228924,-0.915687,26.091736,-138.522803,213.301688,
+ -0.511951,0.285647,-0.810131,27.416633,-137.926523,212.674682,
+ -0.511951,0.285647,-0.810131,26.234417,-139.317133,212.931447,
+ -0.511951,0.285647,-0.810131,26.091736,-138.522803,213.301688,
+ -0.594047,0.24972,-0.764689,25.391716,-138.484167,213.858115,
+ -0.594047,0.24972,-0.764689,26.091736,-138.522803,213.301688,
+ -0.594047,0.24972,-0.764689,26.234417,-139.317133,212.931447,
+ -0.468529,0.401476,-0.786955,25.391716,-138.484167,213.858115,
+ -0.468529,0.401476,-0.786955,26.234417,-139.317133,212.931447,
+ -0.468529,0.401476,-0.786955,25.318093,-139.414485,213.427333,
+ -0.022869,0.240651,-0.970342,23.249672,-137.381962,214.775351,
+ -0.022869,0.240651,-0.970342,24.291032,-138.743974,214.41302,
+ -0.022869,0.240651,-0.970342,24.067427,-139.228908,214.298023,
+ -0.501974,0.001267,-0.864882,23.249672,-137.381962,214.775351,
+ -0.501974,0.001267,-0.864882,24.067427,-139.228908,214.298023,
+ -0.501974,0.001267,-0.864882,22.78573,-137.819132,215.043981,
+ 0.347948,-0.447879,-0.823612,27.416633,-137.926523,212.674682,
+ 0.347948,-0.447879,-0.823612,28.612538,-139.008649,213.768368,
+ 0.347948,-0.447879,-0.823612,26.234417,-139.317133,212.931447,
+ 0.350767,-0.368988,-0.860703,28.612538,-139.008649,213.768368,
+ 0.350767,-0.368988,-0.860703,27.043654,-140.516385,213.775366,
+ 0.350767,-0.368988,-0.860703,26.234417,-139.317133,212.931447,
+ -0.486303,-0.020688,-0.873545,22.677426,-135.812773,215.056758,
+ -0.486303,-0.020688,-0.873545,23.249672,-137.381962,214.775351,
+ -0.486303,-0.020688,-0.873545,22.78573,-137.819132,215.043981,
+ -0.294478,-0.674863,-0.67664,26.234417,-139.317133,212.931447,
+ -0.294478,-0.674863,-0.67664,27.043654,-140.516385,213.775366,
+ -0.294478,-0.674863,-0.67664,25.318093,-139.414485,213.427333,
+ -0.220913,-0.590993,-0.775838,25.318093,-139.414485,213.427333,
+ -0.220913,-0.590993,-0.775838,27.043654,-140.516385,213.775366,
+ -0.220913,-0.590993,-0.775838,25.822801,-140.518515,214.124615,
+ -0.631952,-0.029181,-0.774458,22.677426,-135.812773,215.056758,
+ -0.631952,-0.029181,-0.774458,22.78573,-137.819132,215.043981,
+ -0.631952,-0.029181,-0.774458,21.924167,-136.027555,215.679506,
+ -0.622836,-0.073902,-0.778855,22.412447,-134.458062,215.140116,
+ -0.622836,-0.073902,-0.778855,22.677426,-135.812773,215.056758,
+ -0.622836,-0.073902,-0.778855,21.924167,-136.027555,215.679506,
+ -0.77473,0.023878,-0.631841,22.412447,-134.458062,215.140116,
+ -0.77473,0.023878,-0.631841,21.924167,-136.027555,215.679506,
+ -0.77473,0.023878,-0.631841,21.692044,-134.277048,216.030276,
+ -0.256604,-0.107231,-0.96055,27.789916,-135.122488,212.758344,
+ -0.256604,-0.107231,-0.96055,28.09414,-137.33572,212.924146,
+ -0.256604,-0.107231,-0.96055,26.971857,-135.178769,212.983165,
+ 0.4465,0.25578,-0.857447,26.971857,-135.178769,212.983165,
+ 0.4465,0.25578,-0.857447,28.09414,-137.33572,212.924146,
+ 0.4465,0.25578,-0.857447,26.87268,-136.517052,212.532305,
+ 0.049807,-0.369758,-0.927792,26.87268,-136.517052,212.532305,
+ 0.049807,-0.369758,-0.927792,28.09414,-137.33572,212.924146,
+ 0.049807,-0.369758,-0.927792,26.614393,-137.144971,212.768687,
+ 0.133184,0.252,-0.958519,26.614393,-137.144971,212.768687,
+ 0.133184,0.252,-0.958519,28.09414,-137.33572,212.924146,
+ 0.133184,0.252,-0.958519,27.416633,-137.926523,212.674682,
+ -0.486148,0.398578,-0.777686,25.391716,-138.484167,213.858115,
+ -0.486148,0.398578,-0.777686,25.318093,-139.414485,213.427333,
+ -0.486148,0.398578,-0.777686,24.291032,-138.743974,214.41302,
+ -0.480806,0.405999,-0.777168,24.291032,-138.743974,214.41302,
+ -0.480806,0.405999,-0.777168,25.318093,-139.414485,213.427333,
+ -0.480806,0.405999,-0.777168,24.067427,-139.228908,214.298023,
+ -0.747411,0.006664,-0.664328,26.975812,-133.980734,213.654893,
+ -0.747411,0.006664,-0.664328,26.320512,-133.234167,214.399634,
+ -0.747411,0.006664,-0.664328,26.570889,-132.174858,214.12857,
+ -0.279423,0.184503,-0.942275,26.570889,-132.174858,214.12857,
+ -0.279423,0.184503,-0.942275,27.719336,-133.410922,213.54598,
+ -0.279423,0.184503,-0.942275,26.975812,-133.980734,213.654893,
+ -0.463053,0.459332,-0.758021,27.719336,-133.410922,213.54598,
+ -0.463053,0.459332,-0.758021,27.095067,-134.467493,213.287085,
+ -0.463053,0.459332,-0.758021,26.975812,-133.980734,213.654893,
+ -0.032507,0.255944,-0.966145,27.719336,-133.410922,213.54598,
+ -0.032507,0.255944,-0.966145,28.041509,-134.214074,213.322376,
+ -0.032507,0.255944,-0.966145,27.095067,-134.467493,213.287085,
+ -0.073789,0.402632,-0.912383,28.041509,-134.214074,213.322376,
+ -0.073789,0.402632,-0.912383,26.971857,-135.178769,212.983165,
+ -0.073789,0.402632,-0.912383,27.095067,-134.467493,213.287085,
+ -0.255144,0.56005,-0.788191,28.041509,-134.214074,213.322376,
+ -0.255144,0.56005,-0.788191,27.789916,-135.122488,212.758344,
+ -0.255144,0.56005,-0.788191,26.971857,-135.178769,212.983165,
+ -0.512809,0.858389,-0.01393,24.602253,-131.75655,215.176014,
+ -0.512809,0.858389,-0.01393,22.821324,-132.812208,215.686503,
+ -0.512809,0.858389,-0.01393,22.917155,-132.73524,216.901575,
+ -0.758905,0.398226,-0.515247,24.602253,-131.75655,215.176014,
+ -0.758905,0.398226,-0.515247,22.917155,-132.73524,216.901575,
+ -0.758905,0.398226,-0.515247,24.590389,-131.466624,215.417568,
+ -0.267078,0.610378,-0.745726,24.590389,-131.466624,215.417568,
+ -0.267078,0.610378,-0.745726,26.570889,-132.174858,214.12857,
+ -0.267078,0.610378,-0.745726,24.602253,-131.75655,215.176014,
+ -0.003274,0.874285,-0.485402,27.189073,-131.831693,214.742495,
+ -0.003274,0.874285,-0.485402,26.570889,-132.174858,214.12857,
+ -0.003274,0.874285,-0.485402,24.590389,-131.466624,215.417568,
+ -0.932599,0.347742,-0.096612,22.038859,-133.445908,215.67403,
+ -0.932599,0.347742,-0.096612,21.692044,-134.277048,216.030276,
+ -0.932599,0.347742,-0.096612,21.517115,-134.420946,217.200931,
+ -0.860226,0.508965,0.031071,22.038859,-133.445908,215.67403,
+ -0.860226,0.508965,0.031071,21.517115,-134.420946,217.200931,
+ -0.860226,0.508965,0.031071,22.037338,-133.527744,216.972459,
+ -0.629097,0.775834,0.048162,22.821324,-132.812208,215.686503,
+ -0.629097,0.775834,0.048162,22.038859,-133.445908,215.67403,
+ -0.629097,0.775834,0.048162,22.037338,-133.527744,216.972459,
+ -0.669013,0.743229,0.005684,22.917155,-132.73524,216.901575,
+ -0.669013,0.743229,0.005684,22.821324,-132.812208,215.686503,
+ -0.669013,0.743229,0.005684,22.037338,-133.527744,216.972459,
+ -0.775926,-0.506376,-0.376194,24.067427,-139.228908,214.298023,
+ -0.775926,-0.506376,-0.376194,24.269432,-139.999508,214.918641,
+ -0.775926,-0.506376,-0.376194,22.78573,-137.819132,215.043981,
+ -0.747981,-0.482805,-0.455437,24.269432,-139.999508,214.918641,
+ -0.747981,-0.482805,-0.455437,22.741922,-138.560831,215.902198,
+ -0.747981,-0.482805,-0.455437,22.78573,-137.819132,215.043981,
+ -0.893348,-0.316426,-0.319067,22.78573,-137.819132,215.043981,
+ -0.893348,-0.316426,-0.319067,22.741922,-138.560831,215.902198,
+ -0.893348,-0.316426,-0.319067,21.924167,-136.027555,215.679506,
+ -0.808235,-0.305174,-0.503612,21.924167,-136.027555,215.679506,
+ -0.808235,-0.305174,-0.503612,22.741922,-138.560831,215.902198,
+ -0.808235,-0.305174,-0.503612,21.580393,-136.317481,216.406906,
+ -0.898749,-0.031545,-0.437327,21.924167,-136.027555,215.679506,
+ -0.898749,-0.031545,-0.437327,21.580393,-136.317481,216.406906,
+ -0.898749,-0.031545,-0.437327,21.692044,-134.277048,216.030276,
+ -0.989134,0.027465,-0.144429,21.692044,-134.277048,216.030276,
+ -0.989134,0.027465,-0.144429,21.580393,-136.317481,216.406906,
+ -0.989134,0.027465,-0.144429,21.517115,-134.420946,217.200931,
+ 0.699149,0.085903,-0.709797,27.789916,-135.122488,212.758344,
+ 0.699149,0.085903,-0.709797,29.131849,-135.747973,214.004446,
+ 0.699149,0.085903,-0.709797,29.316514,-138.223751,213.886712,
+ 0.558281,-0.824486,-0.092439,34.771256,-113.021503,230.868209,
+ 0.558281,-0.824486,-0.092439,33.869535,-113.842909,232.74862,
+ 0.558281,-0.824486,-0.092439,33.956847,-113.576713,230.901674,
+ 0.590323,-0.804277,-0.068247,34.771256,-113.021503,230.868209,
+ 0.590323,-0.804277,-0.068247,34.520879,-113.366798,232.771741,
+ 0.590323,-0.804277,-0.068247,33.869535,-113.842909,232.74862,
+ 0.54311,-0.833073,-0.104983,35.754813,-112.303838,230.720356,
+ 0.54311,-0.833073,-0.104983,35.651072,-112.627837,232.754704,
+ 0.54311,-0.833073,-0.104983,34.520879,-113.366798,232.771741,
+ 0.581007,-0.810825,-0.07066,35.754813,-112.303838,230.720356,
+ 0.581007,-0.810825,-0.07066,34.520879,-113.366798,232.771741,
+ 0.581007,-0.810825,-0.07066,34.771256,-113.021503,230.868209,
+ -0.787113,-0.434602,0.437691,28.802983,-112.757741,232.582209,
+ -0.787113,-0.434602,0.437691,29.547116,-112.080233,234.593132,
+ -0.787113,-0.434602,0.437691,28.24534,-111.263695,233.062883,
+ -0.803181,-0.407543,0.434521,28.802983,-112.757741,232.582209,
+ -0.803181,-0.407543,0.434521,29.851644,-113.200996,234.104852,
+ -0.803181,-0.407543,0.434521,29.547116,-112.080233,234.593132,
+ -0.466136,-0.871007,0.155128,30.655405,-113.712093,233.650341,
+ -0.466136,-0.871007,0.155128,29.851644,-113.200996,234.104852,
+ -0.466136,-0.871007,0.155128,29.494181,-113.359497,232.140779,
+ -0.58296,-0.794472,0.170213,29.851644,-113.200996,234.104852,
+ -0.58296,-0.794472,0.170213,28.802983,-112.757741,232.582209,
+ -0.58296,-0.794472,0.170213,29.494181,-113.359497,232.140779,
+ 0.988503,-0.112401,0.101135,36.145741,-109.684771,231.190687,
+ 0.988503,-0.112401,0.101135,35.874981,-110.197997,233.266714,
+ 0.988503,-0.112401,0.101135,35.651072,-112.627837,232.754704,
+ 0.988009,-0.152168,0.026148,35.754813,-112.303838,230.720356,
+ 0.988009,-0.152168,0.026148,36.145741,-109.684771,231.190687,
+ 0.988009,-0.152168,0.026148,35.651072,-112.627837,232.754704,
+ 0.083708,-0.994882,-0.056598,33.956847,-113.576713,230.901674,
+ 0.083708,-0.994882,-0.056598,31.959614,-113.873331,233.161756,
+ 0.083708,-0.994882,-0.056598,31.478636,-113.816137,231.445018,
+ -0.015244,-0.989556,-0.143343,33.956847,-113.576713,230.901674,
+ -0.015244,-0.989556,-0.143343,33.869535,-113.842909,232.74862,
+ -0.015244,-0.989556,-0.143343,31.959614,-113.873331,233.161756,
+ -0.238406,-0.970203,-0.043222,31.478636,-113.816137,231.445018,
+ -0.238406,-0.970203,-0.043222,30.655405,-113.712093,233.650341,
+ -0.238406,-0.970203,-0.043222,29.494181,-113.359497,232.140779,
+ -0.122257,-0.992498,0.001187,31.959614,-113.873331,233.161756,
+ -0.122257,-0.992498,0.001187,30.655405,-113.712093,233.650341,
+ -0.122257,-0.992498,0.001187,31.478636,-113.816137,231.445018,
+ -0.759338,0.058875,0.648027,28.24534,-111.263695,233.062883,
+ -0.759338,0.058875,0.648027,30.005886,-109.937581,235.005356,
+ -0.759338,0.058875,0.648027,28.685248,-109.360468,233.40544,
+ -0.752091,0.034409,0.658161,28.24534,-111.263695,233.062883,
+ -0.752091,0.034409,0.658161,29.547116,-112.080233,234.593132,
+ -0.752091,0.034409,0.658161,30.005886,-109.937581,235.005356,
+ -0.719949,0.187229,0.668296,28.685248,-109.360468,233.40544,
+ -0.719949,0.187229,0.668296,30.893917,-108.115886,235.436137,
+ -0.719949,0.187229,0.668296,29.604005,-107.490097,233.871207,
+ -0.720995,0.19417,0.66518,28.685248,-109.360468,233.40544,
+ -0.720995,0.19417,0.66518,30.005886,-109.937581,235.005356,
+ -0.720995,0.19417,0.66518,30.893917,-108.115886,235.436137,
+ -0.145722,0.721445,0.676965,32.331072,-107.964382,234.963677,
+ -0.145722,0.721445,0.676965,31.863784,-106.5829,233.390837,
+ -0.145722,0.721445,0.676965,29.604005,-107.490097,233.871207,
+ 0.01913,0.933681,0.357595,32.331072,-107.964382,234.963677,
+ 0.01913,0.933681,0.357595,29.604005,-107.490097,233.871207,
+ 0.01913,0.933681,0.357595,30.893917,-108.115886,235.436137,
+ 0.342102,0.765138,0.545463,33.545992,-108.131118,234.507529,
+ 0.342102,0.765138,0.545463,33.401638,-106.825671,232.766873,
+ 0.342102,0.765138,0.545463,31.863784,-106.5829,233.390837,
+ 0.328437,0.768503,0.54912,33.401638,-106.825671,232.766873,
+ 0.328437,0.768503,0.54912,33.545992,-108.131118,234.507529,
+ 0.328437,0.768503,0.54912,33.596277,-108.138689,234.48805,
+ 0.326161,0.775544,0.540509,33.596277,-108.138689,234.48805,
+ 0.326161,0.775544,0.540509,33.545992,-108.131118,234.507529,
+ 0.326161,0.775544,0.540509,33.603034,-108.181903,234.545977,
+ 0.318121,0.757162,0.57053,33.545992,-108.131118,234.507529,
+ 0.318121,0.757162,0.57053,31.863784,-106.5829,233.390837,
+ 0.318121,0.757162,0.57053,32.331072,-107.964382,234.963677,
+ 0.520757,0.80023,0.297396,35.43842,-107.792496,231.801874,
+ 0.520757,0.80023,0.297396,33.401638,-106.825671,232.766873,
+ 0.520757,0.80023,0.297396,35.065745,-108.342533,233.934486,
+ 0.315252,0.771378,0.552804,35.065745,-108.342533,233.934486,
+ 0.315252,0.771378,0.552804,33.401638,-106.825671,232.766873,
+ 0.315252,0.771378,0.552804,33.596277,-108.138689,234.48805,
+ 0.937854,0.288056,0.193529,36.145741,-109.684771,231.190687,
+ 0.937854,0.288056,0.193529,35.43842,-107.792496,231.801874,
+ 0.937854,0.288056,0.193529,35.874981,-110.197997,233.266714,
+ 0.918345,0.313654,0.241378,35.43842,-107.792496,231.801874,
+ 0.918345,0.313654,0.241378,35.065745,-108.342533,233.934486,
+ 0.918345,0.313654,0.241378,35.874981,-110.197997,233.266714,
+ -0.801615,0.121709,0.585321,27.73546,-110.655551,232.238131,
+ -0.801615,0.121709,0.585321,28.24534,-111.263695,233.062883,
+ -0.801615,0.121709,0.585321,28.172022,-109.080886,232.508587,
+ -0.849132,0.103027,0.518035,28.172022,-109.080886,232.508587,
+ -0.849132,0.103027,0.518035,28.24534,-111.263695,233.062883,
+ -0.849132,0.103027,0.518035,28.685248,-109.360468,233.40544,
+ -0.79343,0.27892,0.540992,28.172022,-109.080886,232.508587,
+ -0.79343,0.27892,0.540992,28.685248,-109.360468,233.40544,
+ -0.79343,0.27892,0.540992,29.114509,-107.115597,232.877611,
+ -0.817188,0.27532,0.506361,29.114509,-107.115597,232.877611,
+ -0.817188,0.27532,0.506361,28.685248,-109.360468,233.40544,
+ -0.817188,0.27532,0.506361,29.604005,-107.490097,233.871207,
+ -0.285455,0.841899,0.457953,31.6417,-106.014305,232.428271,
+ -0.285455,0.841899,0.457953,29.114509,-107.115597,232.877611,
+ -0.285455,0.841899,0.457953,29.604005,-107.490097,233.871207,
+ -0.215197,0.818281,0.533016,31.863784,-106.5829,233.390837,
+ -0.215197,0.818281,0.533016,31.6417,-106.014305,232.428271,
+ -0.215197,0.818281,0.533016,29.604005,-107.490097,233.871207,
+ 0.307107,0.848737,0.4305,33.282078,-106.286585,231.794876,
+ 0.307107,0.848737,0.4305,31.6417,-106.014305,232.428271,
+ 0.307107,0.848737,0.4305,31.863784,-106.5829,233.390837,
+ 0.30901,0.84732,0.431928,33.401638,-106.825671,232.766873,
+ 0.30901,0.84732,0.431928,33.282078,-106.286585,231.794876,
+ 0.30901,0.84732,0.431928,31.863784,-106.5829,233.390837,
+ 0.575327,0.743244,0.341448,35.396741,-107.409173,230.675331,
+ 0.575327,0.743244,0.341448,33.282078,-106.286585,231.794876,
+ 0.575327,0.743244,0.341448,33.401638,-106.825671,232.766873,
+ -0.441969,-0.662515,-0.604762,29.238632,-112.176064,221.032637,
+ -0.441969,-0.662515,-0.604762,27.221625,-111.257611,221.500534,
+ -0.441969,-0.662515,-0.604762,28.983084,-111.472393,220.448526,
+ 0.511777,0.818921,0.259716,35.43842,-107.792496,231.801874,
+ 0.511777,0.818921,0.259716,35.396741,-107.409173,230.675331,
+ 0.511777,0.818921,0.259716,33.401638,-106.825671,232.766873,
+ -0.395411,-0.464757,-0.792244,27.221625,-111.257611,221.500534,
+ -0.395411,-0.464757,-0.792244,29.238632,-112.176064,221.032637,
+ -0.395411,-0.464757,-0.792244,27.206414,-111.953068,221.916104,
+ 0.938478,0.344848,0.018421,36.055995,-109.378113,230.022161,
+ 0.938478,0.344848,0.018421,35.43842,-107.792496,231.801874,
+ 0.938478,0.344848,0.018421,36.145741,-109.684771,231.190687,
+ 0.952572,0.297102,0.065851,36.055995,-109.378113,230.022161,
+ 0.952572,0.297102,0.065851,35.396741,-107.409173,230.675331,
+ 0.952572,0.297102,0.065851,35.43842,-107.792496,231.801874,
+ -0.662082,-0.637927,0.393316,25.031514,-110.013029,228.838729,
+ -0.662082,-0.637927,0.393316,27.616204,-112.33639,229.421318,
+ -0.662082,-0.637927,0.393316,26.48601,-110.468453,230.548469,
+ -0.438117,-0.897881,0.043163,28.689811,-112.943318,228.61056,
+ -0.438117,-0.897881,0.043163,26.703835,-112.030341,227.444164,
+ -0.438117,-0.897881,0.043163,28.11787,-112.755003,226.722544,
+ -0.450321,-0.890117,0.070019,28.689811,-112.943318,228.61056,
+ -0.450321,-0.890117,0.070019,27.616204,-112.33639,229.421318,
+ -0.450321,-0.890117,0.070019,26.703835,-112.030341,227.444164,
+ 0.277951,-0.932736,-0.229665,34.486502,-112.96796,229.401848,
+ 0.277951,-0.932736,-0.229665,33.327711,-112.823149,227.411308,
+ 0.277951,-0.932736,-0.229665,34.290885,-112.527139,227.374801,
+ 0.365024,-0.888786,-0.277157,34.486502,-112.96796,229.401848,
+ 0.365024,-0.888786,-0.277157,33.63802,-113.316905,229.403369,
+ 0.365024,-0.888786,-0.277157,33.327711,-112.823149,227.411308,
+ 0.620633,-0.756701,-0.205472,35.519039,-112.069585,229.399414,
+ 0.620633,-0.756701,-0.205472,34.290885,-112.527139,227.374801,
+ 0.620633,-0.756701,-0.205472,35.442679,-111.580393,227.367196,
+ 0.639751,-0.735892,-0.221772,35.519039,-112.069585,229.399414,
+ 0.639751,-0.735892,-0.221772,34.486502,-112.96796,229.401848,
+ 0.639751,-0.735892,-0.221772,34.290885,-112.527139,227.374801,
+ -0.7863,-0.588771,0.1873,27.616204,-112.33639,229.421318,
+ -0.7863,-0.588771,0.1873,28.280325,-112.610801,231.346754,
+ -0.7863,-0.588771,0.1873,26.48601,-110.468453,230.548469,
+ -0.745636,-0.437086,0.502974,26.48601,-110.468453,230.548469,
+ -0.745636,-0.437086,0.502974,28.280325,-112.610801,231.346754,
+ -0.745636,-0.437086,0.502974,27.73546,-110.655551,232.238131,
+ -0.512635,-0.857823,-0.036672,29.02963,-113.235677,230.69906,
+ -0.512635,-0.857823,-0.036672,27.616204,-112.33639,229.421318,
+ -0.512635,-0.857823,-0.036672,28.689811,-112.943318,228.61056,
+ -0.591054,-0.801638,0.089618,29.02963,-113.235677,230.69906,
+ -0.591054,-0.801638,0.089618,28.280325,-112.610801,231.346754,
+ -0.591054,-0.801638,0.089618,27.616204,-112.33639,229.421318,
+ 0.378003,-0.919602,-0.106983,34.771256,-113.021503,230.868209,
+ 0.378003,-0.919602,-0.106983,33.63802,-113.316905,229.403369,
+ 0.378003,-0.919602,-0.106983,34.486502,-112.96796,229.401848,
+ 0.537697,-0.804021,-0.253836,34.771256,-113.021503,230.868209,
+ 0.537697,-0.804021,-0.253836,33.956847,-113.576713,230.901674,
+ 0.537697,-0.804021,-0.253836,33.63802,-113.316905,229.403369,
+ 0.636328,-0.732016,-0.243392,35.754813,-112.303838,230.720356,
+ 0.636328,-0.732016,-0.243392,34.486502,-112.96796,229.401848,
+ 0.636328,-0.732016,-0.243392,35.519039,-112.069585,229.399414,
+ 0.56977,-0.809754,-0.140212,35.754813,-112.303838,230.720356,
+ 0.56977,-0.809754,-0.140212,34.771256,-113.021503,230.868209,
+ 0.56977,-0.809754,-0.140212,34.486502,-112.96796,229.401848,
+ -0.864886,-0.386846,0.319879,28.280325,-112.610801,231.346754,
+ -0.864886,-0.386846,0.319879,28.802983,-112.757741,232.582209,
+ -0.864886,-0.386846,0.319879,27.73546,-110.655551,232.238131,
+ -0.880209,-0.407042,0.244026,27.73546,-110.655551,232.238131,
+ -0.880209,-0.407042,0.244026,28.802983,-112.757741,232.582209,
+ -0.880209,-0.407042,0.244026,28.24534,-111.263695,233.062883,
+ -0.575207,-0.80977,0.115798,29.494181,-113.359497,232.140779,
+ -0.575207,-0.80977,0.115798,28.280325,-112.610801,231.346754,
+ -0.575207,-0.80977,0.115798,29.02963,-113.235677,230.69906,
+ -0.590273,-0.792083,0.155507,29.494181,-113.359497,232.140779,
+ -0.590273,-0.792083,0.155507,28.802983,-112.757741,232.582209,
+ -0.590273,-0.792083,0.155507,28.280325,-112.610801,231.346754,
+ 0.267856,-0.222226,0.93748,30.005886,-109.937581,235.005356,
+ 0.267856,-0.222226,0.93748,35.651072,-112.627837,232.754704,
+ 0.267856,-0.222226,0.93748,35.874981,-110.197997,233.266714,
+ 0.260781,-0.235937,0.936123,30.005886,-109.937581,235.005356,
+ 0.260781,-0.235937,0.936123,29.547116,-112.080233,234.593132,
+ 0.260781,-0.235937,0.936123,35.651072,-112.627837,232.754704,
+ 0.32306,-0.192573,0.926579,30.893917,-108.115886,235.436137,
+ 0.32306,-0.192573,0.926579,35.874981,-110.197997,233.266714,
+ 0.32306,-0.192573,0.926579,35.065745,-108.342533,233.934486,
+ 0.253512,-0.337918,0.90639,30.893917,-108.115886,235.436137,
+ 0.253512,-0.337918,0.90639,30.005886,-109.937581,235.005356,
+ 0.253512,-0.337918,0.90639,35.874981,-110.197997,233.266714,
+ 0.323998,-0.184288,0.927935,33.596277,-108.138689,234.48805,
+ 0.323998,-0.184288,0.927935,30.893917,-108.115886,235.436137,
+ 0.323998,-0.184288,0.927935,35.065745,-108.342533,233.934486,
+ 0.319939,-0.235879,0.917606,30.893917,-108.115886,235.436137,
+ 0.319939,-0.235879,0.917606,33.596277,-108.138689,234.48805,
+ 0.319939,-0.235879,0.917606,33.545992,-108.131118,234.507529,
+ 0.324231,-0.178804,0.928926,30.893917,-108.115886,235.436137,
+ 0.324231,-0.178804,0.928926,33.545992,-108.131118,234.507529,
+ 0.324231,-0.178804,0.928926,32.331072,-107.964382,234.963677,
+ -0.326161,-0.775544,-0.540509,33.596277,-108.138689,234.48805,
+ -0.326161,-0.775544,-0.540509,33.603034,-108.181903,234.545977,
+ -0.326161,-0.775544,-0.540509,33.545992,-108.131118,234.507529,
+ -0.312978,-0.778404,-0.54418,33.603034,-108.181903,234.545977,
+ -0.312978,-0.778404,-0.54418,33.596277,-108.138689,234.48805,
+ -0.312978,-0.778404,-0.54418,35.065745,-108.342533,233.934486,
+ 0.153163,-0.741286,0.65348,33.869535,-113.842909,232.74862,
+ 0.153163,-0.741286,0.65348,30.655405,-113.712093,233.650341,
+ 0.153163,-0.741286,0.65348,31.959614,-113.873331,233.161756,
+ 0.577262,-0.007907,-0.816521,34.498975,-106.17676,220.929809,
+ 0.577262,-0.007907,-0.816521,34.148204,-109.888601,220.717765,
+ 0.577262,-0.007907,-0.816521,33.487125,-106.409492,220.216707,
+ 0.580448,-0.006977,-0.814268,33.487125,-106.409492,220.216707,
+ 0.580448,-0.006977,-0.814268,34.148204,-109.888601,220.717765,
+ 0.580448,-0.006977,-0.814268,32.189,-109.807982,219.320462,
+ -0.259248,-0.700729,-0.664658,31.913068,-112.131343,220.000404,
+ -0.259248,-0.700729,-0.664658,28.983084,-111.472393,220.448526,
+ -0.259248,-0.700729,-0.664658,31.227651,-110.960992,219.033883,
+ -0.25725,-0.670816,-0.695577,28.983084,-111.472393,220.448526,
+ -0.25725,-0.670816,-0.695577,31.913068,-112.131343,220.000404,
+ -0.25725,-0.670816,-0.695577,29.238632,-112.176064,221.032637,
+ -0.091938,0.812184,0.576111,31.308574,-105.137834,230.439557,
+ -0.091938,0.812184,0.576111,28.517316,-105.971713,231.169695,
+ -0.091938,0.812184,0.576111,29.114509,-107.115597,232.877611,
+ -0.296602,0.854568,0.42631,31.6417,-106.014305,232.428271,
+ -0.296602,0.854568,0.42631,31.308574,-105.137834,230.439557,
+ -0.296602,0.854568,0.42631,29.114509,-107.115597,232.877611,
+ 0.188105,0.909977,0.369538,32.968422,-105.297856,229.988697,
+ 0.188105,0.909977,0.369538,31.308574,-105.137834,230.439557,
+ 0.188105,0.909977,0.369538,31.6417,-106.014305,232.428271,
+ 0.303108,0.857095,0.41655,33.282078,-106.286585,231.794876,
+ 0.303108,0.857095,0.41655,32.968422,-105.297856,229.988697,
+ 0.303108,0.857095,0.41655,31.6417,-106.014305,232.428271,
+ 0.522354,0.782933,0.337879,35.277181,-106.515362,229.240609,
+ 0.522354,0.782933,0.337879,32.968422,-105.297856,229.988697,
+ 0.522354,0.782933,0.337879,33.282078,-106.286585,231.794876,
+ 0.58482,0.709464,0.393251,35.396741,-107.409173,230.675331,
+ 0.58482,0.709464,0.393251,35.277181,-106.515362,229.240609,
+ 0.58482,0.709464,0.393251,33.282078,-106.286585,231.794876,
+ 0.924002,0.354341,0.143749,36.246744,-108.638848,228.242753,
+ 0.924002,0.354341,0.143749,35.277181,-106.515362,229.240609,
+ 0.924002,0.354341,0.143749,35.396741,-107.409173,230.675331,
+ 0.946588,0.248968,0.204907,36.246744,-108.638848,228.242753,
+ 0.946588,0.248968,0.204907,35.396741,-107.409173,230.675331,
+ 0.946588,0.248968,0.204907,36.055995,-109.378113,230.022161,
+ 0.974806,-0.11073,-0.193629,35.519039,-112.069585,229.399414,
+ 0.974806,-0.11073,-0.193629,36.145741,-109.684771,231.190687,
+ 0.974806,-0.11073,-0.193629,35.754813,-112.303838,230.720356,
+ 0.978616,-0.167665,-0.119161,35.519039,-112.069585,229.399414,
+ 0.978616,-0.167665,-0.119161,36.055995,-109.378113,230.022161,
+ 0.978616,-0.167665,-0.119161,36.145741,-109.684771,231.190687,
+ 0.080112,-0.979121,-0.186828,33.956847,-113.576713,230.901674,
+ 0.080112,-0.979121,-0.186828,31.133341,-113.62691,229.954015,
+ 0.080112,-0.979121,-0.186828,33.63802,-113.316905,229.403369,
+ 0.064676,-0.987985,-0.140366,33.956847,-113.576713,230.901674,
+ 0.064676,-0.987985,-0.140366,31.478636,-113.816137,231.445018,
+ 0.064676,-0.987985,-0.140366,31.133341,-113.62691,229.954015,
+ -0.208119,-0.97518,-0.075566,31.478636,-113.816137,231.445018,
+ -0.208119,-0.97518,-0.075566,29.02963,-113.235677,230.69906,
+ -0.208119,-0.97518,-0.075566,31.133341,-113.62691,229.954015,
+ -0.227654,-0.973688,-0.010269,31.478636,-113.816137,231.445018,
+ -0.227654,-0.973688,-0.010269,29.494181,-113.359497,232.140779,
+ -0.227654,-0.973688,-0.010269,29.02963,-113.235677,230.69906,
+ -0.024582,-0.993982,-0.106753,32.629821,-112.370463,222.061828,
+ -0.024582,-0.993982,-0.106753,29.238632,-112.176064,221.032637,
+ -0.024582,-0.993982,-0.106753,31.913068,-112.131343,220.000404,
+ 0.050622,-0.937638,-0.343907,32.629821,-112.370463,222.061828,
+ 0.050622,-0.937638,-0.343907,29.802968,-112.686552,222.507516,
+ 0.050622,-0.937638,-0.343907,29.238632,-112.176064,221.032637,
+ -0.211012,-0.945855,-0.246642,29.802968,-112.686552,222.507516,
+ -0.211012,-0.945855,-0.246642,27.206414,-111.953068,221.916104,
+ -0.211012,-0.945855,-0.246642,29.238632,-112.176064,221.032637,
+ -0.228441,-0.956211,-0.182965,29.802968,-112.686552,222.507516,
+ -0.228441,-0.956211,-0.182965,27.388036,-112.245427,223.217272,
+ -0.228441,-0.956211,-0.182965,27.206414,-111.953068,221.916104,
+ -0.910154,0.121739,0.39598,22.688682,-108.931207,224.22182,
+ -0.910154,0.121739,0.39598,23.20921,-109.131387,225.479788,
+ -0.910154,0.121739,0.39598,23.731868,-106.325222,225.81839,
+ -0.8696,0.103717,0.48274,23.20921,-109.131387,225.479788,
+ -0.8696,0.103717,0.48274,24.221365,-106.902335,226.824155,
+ -0.8696,0.103717,0.48274,23.731868,-106.325222,225.81839,
+ -0.052487,0.694018,0.718042,29.645076,-101.71379,226.316709,
+ -0.052487,0.694018,0.718042,26.918313,-104.085522,228.409772,
+ -0.052487,0.694018,0.718042,30.815123,-103.097098,227.739262,
+ 0.252034,0.789161,0.560093,32.379748,-101.805969,225.216025,
+ 0.252034,0.789161,0.560093,29.645076,-101.71379,226.316709,
+ 0.252034,0.789161,0.560093,30.815123,-103.097098,227.739262,
+ -0.721885,0.387229,0.573529,25.454082,-102.042656,225.09464,
+ -0.721885,0.387229,0.573529,23.731868,-106.325222,225.81839,
+ -0.721885,0.387229,0.573529,24.221365,-106.902335,226.824155,
+ 0.254075,0.788021,0.560775,33.127836,-103.277503,226.944932,
+ 0.254075,0.788021,0.560775,32.379748,-101.805969,225.216025,
+ 0.254075,0.788021,0.560775,30.815123,-103.097098,227.739262,
+ 0.736819,0.63787,0.224096,34.372113,-103.54735,223.62189,
+ 0.736819,0.63787,0.224096,32.379748,-101.805969,225.216025,
+ 0.736819,0.63787,0.224096,33.127836,-103.277503,226.944932,
+ -0.811766,0.36745,0.45389,25.454082,-102.042656,225.09464,
+ -0.811766,0.36745,0.45389,24.221365,-106.902335,226.824155,
+ -0.811766,0.36745,0.45389,26.1252,-102.324368,226.522973,
+ 0.622074,0.764083,0.170882,35.079131,-104.502614,225.319462,
+ 0.622074,0.764083,0.170882,34.372113,-103.54735,223.62189,
+ 0.622074,0.764083,0.170882,33.127836,-103.277503,226.944932,
+ -0.226069,0.93005,0.289656,29.109033,-101.281487,225.503213,
+ -0.226069,0.93005,0.289656,25.454082,-102.042656,225.09464,
+ -0.226069,0.93005,0.289656,26.1252,-102.324368,226.522973,
+ -0.115596,0.843558,0.524449,29.645076,-101.71379,226.316709,
+ -0.115596,0.843558,0.524449,29.109033,-101.281487,225.503213,
+ -0.115596,0.843558,0.524449,26.1252,-102.324368,226.522973,
+ 0.303999,0.909643,0.28308,31.633486,-101.763682,224.341685,
+ 0.303999,0.909643,0.28308,29.109033,-101.281487,225.503213,
+ 0.303999,0.909643,0.28308,29.645076,-101.71379,226.316709,
+ 0.039543,0.999112,0.014571,32.379748,-101.805969,225.216025,
+ 0.039543,0.999112,0.014571,31.633486,-101.763682,224.341685,
+ 0.039543,0.999112,0.014571,29.645076,-101.71379,226.316709,
+ 0.447274,0.826518,-0.341781,33.634065,-103.707676,222.258661,
+ 0.447274,0.826518,-0.341781,31.633486,-101.763682,224.341685,
+ 0.447274,0.826518,-0.341781,32.379748,-101.805969,225.216025,
+ 0.449441,0.825888,-0.340457,34.372113,-103.54735,223.62189,
+ 0.449441,0.825888,-0.340457,33.634065,-103.707676,222.258661,
+ 0.449441,0.825888,-0.340457,32.379748,-101.805969,225.216025,
+ 0.734004,0.502817,-0.456523,34.498975,-106.17676,220.929809,
+ 0.734004,0.502817,-0.456523,33.634065,-103.707676,222.258661,
+ 0.734004,0.502817,-0.456523,34.372113,-103.54735,223.62189,
+ 0.959448,-0.078869,-0.270629,35.220595,-107.357455,222.414728,
+ 0.959448,-0.078869,-0.270629,35.63221,-107.812879,224.006734,
+ 0.959448,-0.078869,-0.270629,35.261361,-110.518346,223.480426,
+ 0.952909,-0.085778,-0.290871,34.819323,-110.100646,221.909107,
+ 0.952909,-0.085778,-0.290871,35.220595,-107.357455,222.414728,
+ 0.952909,-0.085778,-0.290871,35.261361,-110.518346,223.480426,
+ 0.103794,-0.993521,-0.04629,33.015577,-112.404536,223.658093,
+ 0.103794,-0.993521,-0.04629,29.802968,-112.686552,222.507516,
+ 0.103794,-0.993521,-0.04629,32.629821,-112.370463,222.061828,
+ 0.148964,-0.972782,-0.177495,33.015577,-112.404536,223.658093,
+ 0.148964,-0.972782,-0.177495,30.271169,-112.915938,224.157629,
+ 0.148964,-0.972782,-0.177495,29.802968,-112.686552,222.507516,
+ -0.201436,-0.976345,-0.078568,30.271169,-112.915938,224.157629,
+ -0.201436,-0.976345,-0.078568,27.388036,-112.245427,223.217272,
+ -0.201436,-0.976345,-0.078568,29.802968,-112.686552,222.507516,
+ -0.191703,-0.975513,-0.107818,30.271169,-112.915938,224.157629,
+ -0.191703,-0.975513,-0.107818,27.670051,-112.488807,224.917886,
+ -0.191703,-0.975513,-0.107818,27.388036,-112.245427,223.217272,
+ -0.828809,0.039732,0.558119,23.20921,-109.131387,225.479788,
+ -0.828809,0.039732,0.558119,24.203415,-109.665605,226.994217,
+ -0.828809,0.039732,0.558119,24.221365,-106.902335,226.824155,
+ -0.918199,0.030272,0.394961,24.221365,-106.902335,226.824155,
+ -0.918199,0.030272,0.394961,24.203415,-109.665605,226.994217,
+ -0.918199,0.030272,0.394961,24.614727,-107.176441,227.759645,
+ -0.813697,0.367995,0.449975,26.1252,-102.324368,226.522973,
+ -0.813697,0.367995,0.449975,24.221365,-106.902335,226.824155,
+ -0.813697,0.367995,0.449975,24.614727,-107.176441,227.759645,
+ -0.678581,0.372585,0.633015,26.1252,-102.324368,226.522973,
+ -0.678581,0.372585,0.633015,24.614727,-107.176441,227.759645,
+ -0.678581,0.372585,0.633015,26.918313,-104.085522,228.409772,
+ -0.082417,0.711025,0.69832,29.645076,-101.71379,226.316709,
+ -0.082417,0.711025,0.69832,26.1252,-102.324368,226.522973,
+ -0.082417,0.711025,0.69832,26.918313,-104.085522,228.409772,
+ 0.931833,0.280469,-0.23027,35.220595,-107.357455,222.414728,
+ 0.931833,0.280469,-0.23027,34.372113,-103.54735,223.62189,
+ 0.931833,0.280469,-0.23027,35.079131,-104.502614,225.319462,
+ 0.931937,0.280389,-0.229945,34.372113,-103.54735,223.62189,
+ 0.931937,0.280389,-0.229945,35.220595,-107.357455,222.414728,
+ 0.931937,0.280389,-0.229945,34.498975,-106.17676,220.929809,
+ 0.955872,0.231457,-0.180929,35.220595,-107.357455,222.414728,
+ 0.955872,0.231457,-0.180929,35.079131,-104.502614,225.319462,
+ 0.955872,0.231457,-0.180929,35.63221,-107.812879,224.006734,
+ 0.94175,-0.187412,-0.279256,35.63221,-107.812879,224.006734,
+ 0.94175,-0.187412,-0.279256,36.068468,-108.409463,225.878322,
+ 0.94175,-0.187412,-0.279256,35.429293,-110.963122,225.436588,
+ 0.987323,-0.113814,-0.110637,35.261361,-110.518346,223.480426,
+ 0.987323,-0.113814,-0.110637,35.63221,-107.812879,224.006734,
+ 0.987323,-0.113814,-0.110637,35.429293,-110.963122,225.436588,
+ 0.167726,-0.98224,-0.084101,33.189898,-112.530485,225.476746,
+ 0.167726,-0.98224,-0.084101,30.271169,-112.915938,224.157629,
+ 0.167726,-0.98224,-0.084101,33.015577,-112.404536,223.658093,
+ 0.16469,-0.98333,-0.077067,33.189898,-112.530485,225.476746,
+ 0.16469,-0.98333,-0.077067,30.530977,-113.020895,226.052034,
+ 0.16469,-0.98333,-0.077067,30.271169,-112.915938,224.157629,
+ -0.170817,-0.984811,-0.031136,30.530977,-113.020895,226.052034,
+ -0.170817,-0.984811,-0.031136,27.670051,-112.488807,224.917886,
+ -0.170817,-0.984811,-0.031136,30.271169,-112.915938,224.157629,
+ -0.139169,-0.984071,-0.110621,30.530977,-113.020895,226.052034,
+ -0.139169,-0.984071,-0.110621,28.11787,-112.755003,226.722544,
+ -0.139169,-0.984071,-0.110621,27.670051,-112.488807,224.917886,
+ -0.910375,0.023394,0.413122,24.203415,-109.665605,226.994217,
+ -0.910375,0.023394,0.413122,25.031514,-110.013029,228.838729,
+ -0.910375,0.023394,0.413122,24.614727,-107.176441,227.759645,
+ -0.87583,0.053765,0.479615,24.614727,-107.176441,227.759645,
+ -0.87583,0.053765,0.479615,25.031514,-110.013029,228.838729,
+ -0.87583,0.053765,0.479615,25.671602,-107.855166,229.7657,
+ -0.72938,0.43202,0.530437,24.614727,-107.176441,227.759645,
+ -0.72938,0.43202,0.530437,25.671602,-107.855166,229.7657,
+ -0.72938,0.43202,0.530437,26.918313,-104.085522,228.409772,
+ -0.694846,0.435623,0.572208,26.918313,-104.085522,228.409772,
+ -0.694846,0.435623,0.572208,25.671602,-107.855166,229.7657,
+ -0.694846,0.435623,0.572208,27.705037,-104.711616,229.841756,
+ -0.142745,0.87569,0.461293,30.815123,-103.097098,227.739262,
+ -0.142745,0.87569,0.461293,26.918313,-104.085522,228.409772,
+ -0.142745,0.87569,0.461293,27.705037,-104.711616,229.841756,
+ 0.022603,0.776498,0.629714,31.101093,-104.118683,228.988711,
+ 0.022603,0.776498,0.629714,30.815123,-103.097098,227.739262,
+ 0.022603,0.776498,0.629714,27.705037,-104.711616,229.841756,
+ 0.258171,0.776039,0.575422,33.127836,-103.277503,226.944932,
+ 0.258171,0.776039,0.575422,30.815123,-103.097098,227.739262,
+ 0.258171,0.776039,0.575422,31.101093,-104.118683,228.988711,
+ 0.230172,0.79815,0.556756,33.127836,-103.277503,226.944932,
+ 0.230172,0.79815,0.556756,31.101093,-104.118683,228.988711,
+ 0.230172,0.79815,0.556756,32.896625,-104.134807,228.269525,
+ -0.851638,0.025425,-0.523514,30.181423,-105.319152,221.538866,
+ -0.851638,0.025425,-0.523514,29.559589,-107.806794,222.429635,
+ -0.851638,0.025425,-0.523514,29.071004,-106.545176,223.285722,
+ -0.7439,-0.052605,-0.666217,31.081927,-106.752961,220.646576,
+ -0.7439,-0.052605,-0.666217,29.559589,-107.806794,222.429635,
+ -0.7439,-0.052605,-0.666217,30.181423,-105.319152,221.538866,
+ -0.725398,0.503833,-0.468989,30.304634,-109.032514,220.348436,
+ -0.725398,0.503833,-0.468989,29.16501,-109.749267,221.34112,
+ -0.725398,0.503833,-0.468989,29.514259,-108.817123,221.802324,
+ 0.148885,0.46205,-0.874267,27.287641,-107.713093,222.883233,
+ 0.148885,0.46205,-0.874267,27.152566,-109.270417,222.037185,
+ 0.148885,0.46205,-0.874267,25.594937,-108.086376,222.397691,
+ -0.004356,0.477659,-0.878534,27.287641,-107.713093,222.883233,
+ -0.004356,0.477659,-0.878534,28.191188,-109.131691,222.107461,
+ -0.004356,0.477659,-0.878534,27.152566,-109.270417,222.037185,
+ 0.189951,0.329593,-0.924818,27.791741,-106.421052,223.442398,
+ 0.189951,0.329593,-0.924818,25.594937,-108.086376,222.397691,
+ 0.189951,0.329593,-0.924818,25.559952,-106.468207,222.967199,
+ 0.193853,0.324964,-0.925645,27.791741,-106.421052,223.442398,
+ 0.193853,0.324964,-0.925645,27.287641,-107.713093,222.883233,
+ 0.193853,0.324964,-0.925645,25.594937,-108.086376,222.397691,
+ 0.199788,0.203395,-0.958496,27.035744,-104.831176,223.622194,
+ 0.199788,0.203395,-0.958496,27.791741,-106.421052,223.442398,
+ 0.199788,0.203395,-0.958496,25.559952,-106.468207,222.967199,
+ -0.054062,0.742803,-0.667323,28.191188,-109.131691,222.107461,
+ -0.054062,0.742803,-0.667323,28.471683,-109.584377,221.580849,
+ -0.054062,0.742803,-0.667323,27.152566,-109.270417,222.037185,
+ -0.054085,0.742796,-0.667329,28.471683,-109.584377,221.580849,
+ -0.054085,0.742796,-0.667329,28.191188,-109.131691,222.107461,
+ -0.054085,0.742796,-0.667329,29.16501,-109.749267,221.34112,
+ -0.072656,0.201805,-0.976727,25.594937,-108.086376,222.397691,
+ -0.072656,0.201805,-0.976727,27.152566,-109.270417,222.037185,
+ -0.072656,0.201805,-0.976727,25.846835,-109.981998,221.987293,
+ -0.049886,0.204996,-0.977491,25.594937,-108.086376,222.397691,
+ -0.049886,0.204996,-0.977491,25.846835,-109.981998,221.987293,
+ -0.049886,0.204996,-0.977491,23.908318,-108.328539,222.432981,
+ -0.477625,0.459186,-0.749015,32.17896,-106.449041,220.13335,
+ -0.477625,0.459186,-0.749015,31.001004,-109.191319,219.203336,
+ -0.477625,0.459186,-0.749015,31.081927,-106.752961,220.646576,
+ -0.783495,0.335563,-0.523003,31.001004,-109.191319,219.203336,
+ -0.783495,0.335563,-0.523003,30.304634,-109.032514,220.348436,
+ -0.783495,0.335563,-0.523003,31.081927,-106.752961,220.646576,
+ -0.731128,0.358937,-0.580186,30.534628,-110.198606,219.337195,
+ -0.731128,0.358937,-0.580186,29.16501,-109.749267,221.34112,
+ -0.731128,0.358937,-0.580186,30.304634,-109.032514,220.348436,
+ -0.665462,0.488522,-0.564363,30.534628,-110.198606,219.337195,
+ -0.665462,0.488522,-0.564363,28.977303,-110.717004,220.724762,
+ -0.665462,0.488522,-0.564363,29.16501,-109.749267,221.34112,
+ -0.067075,0.329947,-0.941614,25.559952,-106.468207,222.967199,
+ -0.067075,0.329947,-0.941614,25.594937,-108.086376,222.397691,
+ -0.067075,0.329947,-0.941614,23.908318,-108.328539,222.432981,
+ -0.253323,0.468025,-0.846629,24.178469,-106.054766,223.609113,
+ -0.253323,0.468025,-0.846629,25.559952,-106.468207,222.967199,
+ -0.253323,0.468025,-0.846629,23.908318,-108.328539,222.432981,
+ -0.222542,0.52843,-0.81929,27.035744,-104.831176,223.622194,
+ -0.222542,0.52843,-0.81929,25.559952,-106.468207,222.967199,
+ -0.222542,0.52843,-0.81929,24.178469,-106.054766,223.609113,
+ 0.017743,-0.030748,-0.99937,25.393845,-103.860396,223.563175,
+ 0.017743,-0.030748,-0.99937,27.035744,-104.831176,223.622194,
+ 0.017743,-0.030748,-0.99937,24.178469,-106.054766,223.609113,
+ 0.026288,-0.016305,-0.999521,25.393845,-103.860396,223.563175,
+ 0.026288,-0.016305,-0.999521,28.83158,-104.863728,223.669957,
+ 0.026288,-0.016305,-0.999521,27.035744,-104.831176,223.622194,
+ 0.23925,0.754734,-0.610848,28.83158,-104.863728,223.669957,
+ 0.23925,0.754734,-0.610848,25.393845,-103.860396,223.563175,
+ 0.23925,0.754734,-0.610848,27.918299,-103.864351,224.547036,
+ -0.771895,-0.167052,-0.61341,29.657245,-104.706444,222.588136,
+ -0.771895,-0.167052,-0.61341,28.83158,-104.863728,223.669957,
+ -0.771895,-0.167052,-0.61341,27.918299,-103.864351,224.547036,
+ -0.438034,0.616783,-0.653992,29.328074,-103.499586,223.946802,
+ -0.438034,0.616783,-0.653992,29.657245,-104.706444,222.588136,
+ -0.438034,0.616783,-0.653992,27.918299,-103.864351,224.547036,
+ -0.608435,0.514391,-0.604325,30.181423,-105.319152,221.538866,
+ -0.608435,0.514391,-0.604325,29.657245,-104.706444,222.588136,
+ -0.608435,0.514391,-0.604325,29.328074,-103.499586,223.946802,
+ -0.723135,0.403103,-0.560878,31.226434,-104.344417,220.892085,
+ -0.723135,0.403103,-0.560878,30.181423,-105.319152,221.538866,
+ -0.723135,0.403103,-0.560878,29.328074,-103.499586,223.946802,
+ -0.599104,0.116688,-0.792123,31.226434,-104.344417,220.892085,
+ -0.599104,0.116688,-0.792123,31.081927,-106.752961,220.646576,
+ -0.599104,0.116688,-0.792123,30.181423,-105.319152,221.538866,
+ -0.447288,0.117217,-0.886675,31.226434,-104.344417,220.892085,
+ -0.447288,0.117217,-0.886675,32.17896,-106.449041,220.13335,
+ -0.447288,0.117217,-0.886675,31.081927,-106.752961,220.646576,
+ 0.104981,0.013375,-0.994384,31.001004,-109.191319,219.203336,
+ 0.104981,0.013375,-0.994384,32.189,-109.807982,219.320462,
+ 0.104981,0.013375,-0.994384,31.62801,-110.403349,219.253229,
+ -0.092792,-0.088827,-0.991715,31.001004,-109.191319,219.203336,
+ -0.092792,-0.088827,-0.991715,31.62801,-110.403349,219.253229,
+ -0.092792,-0.088827,-0.991715,30.534628,-110.198606,219.337195,
+ -0.002573,0.367643,-0.929963,30.534628,-110.198606,219.337195,
+ -0.002573,0.367643,-0.929963,31.62801,-110.403349,219.253229,
+ -0.002573,0.367643,-0.929963,31.227651,-110.960992,219.033883,
+ -0.163003,0.193497,-0.967465,25.846835,-109.981998,221.987293,
+ -0.163003,0.193497,-0.967465,27.569049,-110.54816,221.583891,
+ -0.163003,0.193497,-0.967465,27.221625,-111.257611,221.500534,
+ -0.374102,-0.049818,-0.926049,25.846835,-109.981998,221.987293,
+ -0.374102,-0.049818,-0.926049,27.221625,-111.257611,221.500534,
+ -0.374102,-0.049818,-0.926049,25.345473,-110.678976,222.227326,
+ -0.930087,0.121746,-0.346577,23.174529,-108.737416,222.986061,
+ -0.930087,0.121746,-0.346577,22.688682,-108.931207,224.22182,
+ -0.930087,0.121746,-0.346577,23.14654,-105.752063,224.109866,
+ -0.920017,0.145316,0.36394,23.14654,-105.752063,224.109866,
+ -0.920017,0.145316,0.36394,22.688682,-108.931207,224.22182,
+ -0.920017,0.145316,0.36394,23.731868,-106.325222,225.81839,
+ -0.794121,0.4397,0.419566,23.14654,-105.752063,224.109866,
+ -0.794121,0.4397,0.419566,23.731868,-106.325222,225.81839,
+ -0.794121,0.4397,0.419566,25.004134,-102.569877,224.290879,
+ -0.887014,0.396655,0.23637,25.004134,-102.569877,224.290879,
+ -0.887014,0.396655,0.23637,23.731868,-106.325222,225.81839,
+ -0.887014,0.396655,0.23637,25.454082,-102.042656,225.09464,
+ -0.072834,0.852157,-0.518193,28.686769,-101.848865,224.958956,
+ -0.072834,0.852157,-0.518193,25.004134,-102.569877,224.290879,
+ -0.072834,0.852157,-0.518193,25.454082,-102.042656,225.09464,
+ -0.072098,0.717872,-0.692432,29.109033,-101.281487,225.503213,
+ -0.072098,0.717872,-0.692432,28.686769,-101.848865,224.958956,
+ -0.072098,0.717872,-0.692432,25.454082,-102.042656,225.09464,
+ -0.077638,0.719648,-0.689985,30.241051,-102.394644,224.214823,
+ -0.077638,0.719648,-0.689985,28.686769,-101.848865,224.958956,
+ -0.077638,0.719648,-0.689985,29.109033,-101.281487,225.503213,
+ -0.219879,0.634264,-0.74119,29.109033,-101.281487,225.503213,
+ -0.219879,0.634264,-0.74119,31.633486,-101.763682,224.341685,
+ -0.219879,0.634264,-0.74119,30.241051,-102.394644,224.214823,
+ -0.275222,0.732551,-0.622593,32.559849,-103.902988,221.415047,
+ -0.275222,0.732551,-0.622593,30.241051,-102.394644,224.214823,
+ -0.275222,0.732551,-0.622593,31.633486,-101.763682,224.341685,
+ 0.256713,0.817169,-0.516075,33.634065,-103.707676,222.258661,
+ 0.256713,0.817169,-0.516075,32.559849,-103.902988,221.415047,
+ 0.256713,0.817169,-0.516075,31.633486,-101.763682,224.341685,
+ 0.468992,0.516145,-0.716688,33.634065,-103.707676,222.258661,
+ 0.468992,0.516145,-0.716688,33.487125,-106.409492,220.216707,
+ 0.468992,0.516145,-0.716688,32.559849,-103.902988,221.415047,
+ 0.398867,0.538998,-0.74188,33.634065,-103.707676,222.258661,
+ 0.398867,0.538998,-0.74188,34.498975,-106.17676,220.929809,
+ 0.398867,0.538998,-0.74188,33.487125,-106.409492,220.216707,
+ 0.884444,-0.043743,-0.464591,34.498975,-106.17676,220.929809,
+ 0.884444,-0.043743,-0.464591,35.220595,-107.357455,222.414728,
+ 0.884444,-0.043743,-0.464591,34.819323,-110.100646,221.909107,
+ 0.865926,-0.053421,-0.49731,34.148204,-109.888601,220.717765,
+ 0.865926,-0.053421,-0.49731,34.498975,-106.17676,220.929809,
+ 0.865926,-0.053421,-0.49731,34.819323,-110.100646,221.909107,
+ -0.441377,0.338161,-0.831164,28.686769,-101.848865,224.958956,
+ -0.441377,0.338161,-0.831164,29.328074,-103.499586,223.946802,
+ -0.441377,0.338161,-0.831164,27.918299,-103.864351,224.547036,
+ -0.263766,0.427663,-0.864599,28.686769,-101.848865,224.958956,
+ -0.263766,0.427663,-0.864599,30.241051,-102.394644,224.214823,
+ -0.263766,0.427663,-0.864599,29.328074,-103.499586,223.946802,
+ -0.58452,0.612148,-0.532551,31.226434,-104.344417,220.892085,
+ -0.58452,0.612148,-0.532551,29.328074,-103.499586,223.946802,
+ -0.58452,0.612148,-0.532551,30.241051,-102.394644,224.214823,
+ -0.076821,0.849816,-0.521451,32.559849,-103.902988,221.415047,
+ -0.076821,0.849816,-0.521451,31.226434,-104.344417,220.892085,
+ -0.076821,0.849816,-0.521451,30.241051,-102.394644,224.214823,
+ 0.210133,0.414345,-0.88553,32.559849,-103.902988,221.415047,
+ 0.210133,0.414345,-0.88553,32.17896,-106.449041,220.13335,
+ 0.210133,0.414345,-0.88553,31.226434,-104.344417,220.892085,
+ 0.043604,0.444006,-0.894962,32.559849,-103.902988,221.415047,
+ 0.043604,0.444006,-0.894962,33.487125,-106.409492,220.216707,
+ 0.043604,0.444006,-0.894962,32.17896,-106.449041,220.13335,
+ 0.229203,-0.420305,0.877957,29.851644,-113.200996,234.104852,
+ 0.229203,-0.420305,0.877957,30.655405,-113.712093,233.650341,
+ 0.229203,-0.420305,0.877957,33.869535,-113.842909,232.74862,
+ 0.242197,-0.374797,0.894912,29.851644,-113.200996,234.104852,
+ 0.242197,-0.374797,0.894912,33.869535,-113.842909,232.74862,
+ 0.242197,-0.374797,0.894912,34.520879,-113.366798,232.771741,
+ 0.248386,-0.329377,0.910942,29.547116,-112.080233,234.593132,
+ 0.248386,-0.329377,0.910942,29.851644,-113.200996,234.104852,
+ 0.248386,-0.329377,0.910942,34.520879,-113.366798,232.771741,
+ 0.241509,-0.348493,0.905663,29.547116,-112.080233,234.593132,
+ 0.241509,-0.348493,0.905663,34.520879,-113.366798,232.771741,
+ 0.241509,-0.348493,0.905663,35.651072,-112.627837,232.754704,
+ 0.542589,-0.059986,-0.837854,31.62801,-110.403349,219.253229,
+ 0.542589,-0.059986,-0.837854,32.911837,-111.861496,220.189023,
+ 0.542589,-0.059986,-0.837854,31.227651,-110.960992,219.033883,
+ 0.289666,-0.502892,-0.814367,31.227651,-110.960992,219.033883,
+ 0.289666,-0.502892,-0.814367,32.911837,-111.861496,220.189023,
+ 0.289666,-0.502892,-0.814367,31.913068,-112.131343,220.000404,
+ 0.519832,-0.404868,-0.752234,32.189,-109.807982,219.320462,
+ 0.519832,-0.404868,-0.752234,34.148204,-109.888601,220.717765,
+ 0.519832,-0.404868,-0.752234,31.62801,-110.403349,219.253229,
+ 0.514501,-0.094001,-0.852322,34.148204,-109.888601,220.717765,
+ 0.514501,-0.094001,-0.852322,32.911837,-111.861496,220.189023,
+ 0.514501,-0.094001,-0.852322,31.62801,-110.403349,219.253229,
+ -0.643824,-0.490331,-0.587423,25.345473,-110.678976,222.227326,
+ -0.643824,-0.490331,-0.587423,25.043379,-111.044045,222.863155,
+ -0.643824,-0.490331,-0.587423,23.174529,-108.737416,222.986061,
+ -0.729557,-0.571038,-0.37638,25.043379,-111.044045,222.863155,
+ -0.729557,-0.571038,-0.37638,22.688682,-108.931207,224.22182,
+ -0.729557,-0.571038,-0.37638,23.174529,-108.737416,222.986061,
+ -0.440096,-0.45349,-0.775024,25.345473,-110.678976,222.227326,
+ -0.440096,-0.45349,-0.775024,27.221625,-111.257611,221.500534,
+ -0.440096,-0.45349,-0.775024,27.206414,-111.953068,221.916104,
+ -0.518623,-0.611543,-0.597533,27.206414,-111.953068,221.916104,
+ -0.518623,-0.611543,-0.597533,25.043379,-111.044045,222.863155,
+ -0.518623,-0.611543,-0.597533,25.345473,-110.678976,222.227326,
+ 0.290924,-0.934997,-0.20284,33.609727,-112.002656,221.840657,
+ 0.290924,-0.934997,-0.20284,31.913068,-112.131343,220.000404,
+ 0.290924,-0.934997,-0.20284,32.911837,-111.861496,220.189023,
+ 0.300985,-0.929654,-0.212489,33.609727,-112.002656,221.840657,
+ 0.300985,-0.929654,-0.212489,32.629821,-112.370463,222.061828,
+ 0.300985,-0.929654,-0.212489,31.913068,-112.131343,220.000404,
+ 0.785413,-0.356612,-0.505919,32.911837,-111.861496,220.189023,
+ 0.785413,-0.356612,-0.505919,34.148204,-109.888601,220.717765,
+ 0.785413,-0.356612,-0.505919,34.819323,-110.100646,221.909107,
+ 0.788353,-0.487869,-0.374812,32.911837,-111.861496,220.189023,
+ 0.788353,-0.487869,-0.374812,34.819323,-110.100646,221.909107,
+ 0.788353,-0.487869,-0.374812,33.609727,-112.002656,221.840657,
+ -0.686219,-0.724725,-0.062275,25.369203,-111.455661,224.063015,
+ -0.686219,-0.724725,-0.062275,22.688682,-108.931207,224.22182,
+ -0.686219,-0.724725,-0.062275,25.043379,-111.044045,222.863155,
+ -0.671332,-0.723072,0.162725,25.369203,-111.455661,224.063015,
+ -0.671332,-0.723072,0.162725,23.20921,-109.131387,225.479788,
+ -0.671332,-0.723072,0.162725,22.688682,-108.931207,224.22182,
+ -0.434841,-0.889682,-0.139206,27.388036,-112.245427,223.217272,
+ -0.434841,-0.889682,-0.139206,25.043379,-111.044045,222.863155,
+ -0.434841,-0.889682,-0.139206,27.206414,-111.953068,221.916104,
+ -0.425194,-0.88531,-0.188246,27.388036,-112.245427,223.217272,
+ -0.425194,-0.88531,-0.188246,25.369203,-111.455661,224.063015,
+ -0.425194,-0.88531,-0.188246,25.043379,-111.044045,222.863155,
+ 0.329064,-0.938666,-0.10307,34.032599,-112.0346,223.481643,
+ 0.329064,-0.938666,-0.10307,32.629821,-112.370463,222.061828,
+ 0.329064,-0.938666,-0.10307,33.609727,-112.002656,221.840657,
+ 0.325012,-0.940554,-0.09862,34.032599,-112.0346,223.481643,
+ 0.325012,-0.940554,-0.09862,33.015577,-112.404536,223.658093,
+ 0.325012,-0.940554,-0.09862,32.629821,-112.370463,222.061828,
+ 0.794731,-0.492655,-0.354532,33.609727,-112.002656,221.840657,
+ 0.794731,-0.492655,-0.354532,34.819323,-110.100646,221.909107,
+ 0.794731,-0.492655,-0.354532,35.261361,-110.518346,223.480426,
+ 0.759873,-0.615963,-0.207805,33.609727,-112.002656,221.840657,
+ 0.759873,-0.615963,-0.207805,35.261361,-110.518346,223.480426,
+ 0.759873,-0.615963,-0.207805,34.032599,-112.0346,223.481643,
+ -0.680012,-0.71912,0.143009,25.949663,-111.664967,225.770626,
+ -0.680012,-0.71912,0.143009,23.20921,-109.131387,225.479788,
+ -0.680012,-0.71912,0.143009,25.369203,-111.455661,224.063015,
+ -0.676975,-0.709984,0.193978,25.949663,-111.664967,225.770626,
+ -0.676975,-0.709984,0.193978,24.203415,-109.665605,226.994217,
+ -0.676975,-0.709984,0.193978,23.20921,-109.131387,225.479788,
+ -0.387799,-0.919287,-0.067252,27.670051,-112.488807,224.917886,
+ -0.387799,-0.919287,-0.067252,25.369203,-111.455661,224.063015,
+ -0.387799,-0.919287,-0.067252,27.388036,-112.245427,223.217272,
+ -0.419059,-0.907422,0.031224,27.670051,-112.488807,224.917886,
+ -0.419059,-0.907422,0.031224,25.949663,-111.664967,225.770626,
+ -0.419059,-0.907422,0.031224,25.369203,-111.455661,224.063015,
+ 0.323392,-0.940177,-0.107167,34.209658,-112.193101,225.40647,
+ 0.323392,-0.940177,-0.107167,33.015577,-112.404536,223.658093,
+ 0.323392,-0.940177,-0.107167,34.032599,-112.0346,223.481643,
+ 0.306776,-0.94703,-0.09499,34.209658,-112.193101,225.40647,
+ 0.306776,-0.94703,-0.09499,33.189898,-112.530485,225.476746,
+ 0.306776,-0.94703,-0.09499,33.015577,-112.404536,223.658093,
+ 0.76027,-0.616282,-0.205392,35.261361,-110.518346,223.480426,
+ 0.76027,-0.616282,-0.205392,35.429293,-110.963122,225.436588,
+ 0.76027,-0.616282,-0.205392,34.032599,-112.0346,223.481643,
+ 0.706245,-0.697309,-0.122385,34.032599,-112.0346,223.481643,
+ 0.706245,-0.697309,-0.122385,35.429293,-110.963122,225.436588,
+ 0.706245,-0.697309,-0.122385,34.209658,-112.193101,225.40647,
+ -0.693331,-0.70286,0.158995,26.703835,-112.030341,227.444164,
+ -0.693331,-0.70286,0.158995,24.203415,-109.665605,226.994217,
+ -0.693331,-0.70286,0.158995,25.949663,-111.664967,225.770626,
+ -0.692817,-0.698417,0.179491,26.703835,-112.030341,227.444164,
+ -0.692817,-0.698417,0.179491,25.031514,-110.013029,228.838729,
+ -0.692817,-0.698417,0.179491,24.203415,-109.665605,226.994217,
+ -0.441003,-0.897213,-0.022911,28.11787,-112.755003,226.722544,
+ -0.441003,-0.897213,-0.022911,25.949663,-111.664967,225.770626,
+ -0.441003,-0.897213,-0.022911,27.670051,-112.488807,224.917886,
+ -0.452354,-0.891792,0.009152,28.11787,-112.755003,226.722544,
+ -0.452354,-0.891792,0.009152,26.703835,-112.030341,227.444164,
+ -0.452354,-0.891792,0.009152,25.949663,-111.664967,225.770626,
+ 0.298759,-0.938766,-0.171644,34.290885,-112.527139,227.374801,
+ 0.298759,-0.938766,-0.171644,33.189898,-112.530485,225.476746,
+ 0.298759,-0.938766,-0.171644,34.209658,-112.193101,225.40647,
+ 0.284174,-0.944786,-0.163173,34.290885,-112.527139,227.374801,
+ 0.284174,-0.944786,-0.163173,33.327711,-112.823149,227.411308,
+ 0.284174,-0.944786,-0.163173,33.189898,-112.530485,225.476746,
+ 0.694874,-0.683561,-0.223372,34.209658,-112.193101,225.40647,
+ 0.694874,-0.683561,-0.223372,35.429293,-110.963122,225.436588,
+ 0.694874,-0.683561,-0.223372,35.442679,-111.580393,227.367196,
+ 0.626659,-0.763631,-0.155454,35.442679,-111.580393,227.367196,
+ 0.626659,-0.763631,-0.155454,34.290885,-112.527139,227.374801,
+ 0.626659,-0.763631,-0.155454,34.209658,-112.193101,225.40647,
+ -0.679476,-0.704629,0.204476,27.616204,-112.33639,229.421318,
+ -0.679476,-0.704629,0.204476,25.031514,-110.013029,228.838729,
+ -0.679476,-0.704629,0.204476,26.703835,-112.030341,227.444164,
+ 0.714862,0.523496,0.463599,35.079131,-104.502614,225.319462,
+ 0.714862,0.523496,0.463599,33.127836,-103.277503,226.944932,
+ 0.714862,0.523496,0.463599,32.896625,-104.134807,228.269525,
+ 0.452813,0.862089,0.227515,35.216032,-105.068775,227.192267,
+ 0.452813,0.862089,0.227515,35.079131,-104.502614,225.319462,
+ 0.452813,0.862089,0.227515,32.896625,-104.134807,228.269525,
+ 0.984823,0.172422,-0.019866,35.63221,-107.812879,224.006734,
+ 0.984823,0.172422,-0.019866,35.079131,-104.502614,225.319462,
+ 0.984823,0.172422,-0.019866,35.216032,-105.068775,227.192267,
+ 0.947803,0.29212,-0.127813,35.63221,-107.812879,224.006734,
+ 0.947803,0.29212,-0.127813,35.216032,-105.068775,227.192267,
+ 0.947803,0.29212,-0.127813,36.068468,-108.409463,225.878322,
+ 0.967061,-0.235831,-0.095794,36.068468,-108.409463,225.878322,
+ 0.967061,-0.235831,-0.095794,36.246744,-108.638848,228.242753,
+ 0.967061,-0.235831,-0.095794,35.442679,-111.580393,227.367196,
+ 0.970139,-0.228995,-0.079943,35.429293,-110.963122,225.436588,
+ 0.970139,-0.228995,-0.079943,36.068468,-108.409463,225.878322,
+ 0.970139,-0.228995,-0.079943,35.442679,-111.580393,227.367196,
+ 0.145906,-0.976579,-0.158132,33.327711,-112.823149,227.411308,
+ 0.145906,-0.976579,-0.158132,30.530977,-113.020895,226.052034,
+ 0.145906,-0.976579,-0.158132,33.189898,-112.530485,225.476746,
+ 0.113657,-0.989444,-0.089908,33.327711,-112.823149,227.411308,
+ 0.113657,-0.989444,-0.089908,30.855584,-113.15019,227.88529,
+ 0.113657,-0.989444,-0.089908,30.530977,-113.020895,226.052034,
+ -0.122619,-0.991283,-0.048201,30.855584,-113.15019,227.88529,
+ -0.122619,-0.991283,-0.048201,28.11787,-112.755003,226.722544,
+ -0.122619,-0.991283,-0.048201,30.530977,-113.020895,226.052034,
+ -0.116017,-0.991201,-0.063719,30.855584,-113.15019,227.88529,
+ -0.116017,-0.991201,-0.063719,28.689811,-112.943318,228.61056,
+ -0.116017,-0.991201,-0.063719,28.11787,-112.755003,226.722544,
+ -0.767008,-0.047364,0.639887,25.031514,-110.013029,228.838729,
+ -0.767008,-0.047364,0.639887,26.48601,-110.468453,230.548469,
+ -0.767008,-0.047364,0.639887,25.671602,-107.855166,229.7657,
+ -0.70379,-0.006547,0.710378,25.671602,-107.855166,229.7657,
+ -0.70379,-0.006547,0.710378,26.48601,-110.468453,230.548469,
+ -0.70379,-0.006547,0.710378,26.950561,-108.44962,231.027318,
+ -0.569971,0.350714,0.743056,27.705037,-104.711616,229.841756,
+ -0.569971,0.350714,0.743056,25.671602,-107.855166,229.7657,
+ -0.569971,0.350714,0.743056,26.950561,-108.44962,231.027318,
+ -0.615351,0.348454,0.707052,27.705037,-104.711616,229.841756,
+ -0.615351,0.348454,0.707052,26.950561,-108.44962,231.027318,
+ -0.615351,0.348454,0.707052,28.517316,-105.971713,231.169695,
+ 0.040739,0.737115,0.674538,31.101093,-104.118683,228.988711,
+ 0.040739,0.737115,0.674538,27.705037,-104.711616,229.841756,
+ 0.040739,0.737115,0.674538,28.517316,-105.971713,231.169695,
+ -0.08967,0.808914,0.581048,31.308574,-105.137834,230.439557,
+ -0.08967,0.808914,0.581048,31.101093,-104.118683,228.988711,
+ -0.08967,0.808914,0.581048,28.517316,-105.971713,231.169695,
+ 0.223091,0.812385,0.538759,32.896625,-104.134807,228.269525,
+ 0.223091,0.812385,0.538759,31.101093,-104.118683,228.988711,
+ 0.223091,0.812385,0.538759,31.308574,-105.137834,230.439557,
+ 0.224779,0.811401,0.53954,32.968422,-105.297856,229.988697,
+ 0.224779,0.811401,0.53954,32.896625,-104.134807,228.269525,
+ 0.224779,0.811401,0.53954,31.308574,-105.137834,230.439557,
+ 0.508405,0.72294,0.467849,35.216032,-105.068775,227.192267,
+ 0.508405,0.72294,0.467849,32.896625,-104.134807,228.269525,
+ 0.508405,0.72294,0.467849,32.968422,-105.297856,229.988697,
+ 0.525831,0.70211,0.480149,35.277181,-106.515362,229.240609,
+ 0.525831,0.70211,0.480149,35.216032,-105.068775,227.192267,
+ 0.525831,0.70211,0.480149,32.968422,-105.297856,229.988697,
+ 0.972443,0.203131,0.114425,36.068468,-108.409463,225.878322,
+ 0.972443,0.203131,0.114425,35.216032,-105.068775,227.192267,
+ 0.972443,0.203131,0.114425,35.277181,-106.515362,229.240609,
+ 0.904498,0.425628,-0.026906,36.068468,-108.409463,225.878322,
+ 0.904498,0.425628,-0.026906,35.277181,-106.515362,229.240609,
+ 0.904498,0.425628,-0.026906,36.246744,-108.638848,228.242753,
+ 0.96712,-0.236592,-0.093291,35.442679,-111.580393,227.367196,
+ 0.96712,-0.236592,-0.093291,36.246744,-108.638848,228.242753,
+ 0.96712,-0.236592,-0.093291,35.519039,-112.069585,229.399414,
+ 0.979466,-0.200433,0.021726,36.246744,-108.638848,228.242753,
+ 0.979466,-0.200433,0.021726,36.055995,-109.378113,230.022161,
+ 0.979466,-0.200433,0.021726,35.519039,-112.069585,229.399414,
+ 0.079397,-0.964606,-0.251457,33.63802,-113.316905,229.403369,
+ 0.079397,-0.964606,-0.251457,30.855584,-113.15019,227.88529,
+ 0.079397,-0.964606,-0.251457,33.327711,-112.823149,227.411308,
+ 0.068888,-0.970083,-0.232796,33.63802,-113.316905,229.403369,
+ 0.068888,-0.970083,-0.232796,31.133341,-113.62691,229.954015,
+ 0.068888,-0.970083,-0.232796,30.855584,-113.15019,227.88529,
+ -0.159711,-0.96643,-0.201262,31.133341,-113.62691,229.954015,
+ -0.159711,-0.96643,-0.201262,28.689811,-112.943318,228.61056,
+ -0.159711,-0.96643,-0.201262,30.855584,-113.15019,227.88529,
+ -0.216283,-0.971118,-0.100751,31.133341,-113.62691,229.954015,
+ -0.216283,-0.971118,-0.100751,29.02963,-113.235677,230.69906,
+ -0.216283,-0.971118,-0.100751,28.689811,-112.943318,228.61056,
+ -0.801047,0.042706,0.597077,26.48601,-110.468453,230.548469,
+ -0.801047,0.042706,0.597077,27.73546,-110.655551,232.238131,
+ -0.801047,0.042706,0.597077,26.950561,-108.44962,231.027318,
+ -0.747926,0.09451,0.65702,26.950561,-108.44962,231.027318,
+ -0.747926,0.09451,0.65702,27.73546,-110.655551,232.238131,
+ -0.747926,0.09451,0.65702,28.172022,-109.080886,232.508587,
+ -0.636749,0.363538,0.679993,28.517316,-105.971713,231.169695,
+ -0.636749,0.363538,0.679993,26.950561,-108.44962,231.027318,
+ -0.636749,0.363538,0.679993,28.172022,-109.080886,232.508587,
+ -0.819151,0.301179,0.488142,28.517316,-105.971713,231.169695,
+ -0.819151,0.301179,0.488142,28.172022,-109.080886,232.508587,
+ -0.819151,0.301179,0.488142,29.114509,-107.115597,232.877611,
+ -0.306984,-0.104939,-0.945912,23.908318,-108.328539,222.432981,
+ -0.306984,-0.104939,-0.945912,25.846835,-109.981998,221.987293,
+ -0.306984,-0.104939,-0.945912,25.345473,-110.678976,222.227326,
+ -0.499521,-0.232408,-0.834545,23.908318,-108.328539,222.432981,
+ -0.499521,-0.232408,-0.834545,25.345473,-110.678976,222.227326,
+ -0.499521,-0.232408,-0.834545,23.174529,-108.737416,222.986061,
+ 0.054733,0.235019,-0.970449,33.487125,-106.409492,220.216707,
+ 0.054733,0.235019,-0.970449,32.189,-109.807982,219.320462,
+ 0.054733,0.235019,-0.970449,32.17896,-106.449041,220.13335,
+ 0.213209,0.230411,-0.949449,32.17896,-106.449041,220.13335,
+ 0.213209,0.230411,-0.949449,32.189,-109.807982,219.320462,
+ 0.213209,0.230411,-0.949449,31.001004,-109.191319,219.203336,
+ -0.599536,-0.241404,-0.763073,30.534628,-110.198606,219.337195,
+ -0.599536,-0.241404,-0.763073,31.227651,-110.960992,219.033883,
+ -0.599536,-0.241404,-0.763073,28.977303,-110.717004,220.724762,
+ -0.556713,0.281539,-0.781541,28.977303,-110.717004,220.724762,
+ -0.556713,0.281539,-0.781541,31.227651,-110.960992,219.033883,
+ -0.556713,0.281539,-0.781541,28.983084,-111.472393,220.448526,
+ -0.470367,0.299902,-0.829948,27.569049,-110.54816,221.583891,
+ -0.470367,0.299902,-0.829948,28.977303,-110.717004,220.724762,
+ -0.470367,0.299902,-0.829948,28.983084,-111.472393,220.448526,
+ -0.456452,0.321028,-0.829815,27.569049,-110.54816,221.583891,
+ -0.456452,0.321028,-0.829815,28.983084,-111.472393,220.448526,
+ -0.456452,0.321028,-0.829815,27.221625,-111.257611,221.500534,
+ -0.683214,0.397889,-0.612293,23.908318,-108.328539,222.432981,
+ -0.683214,0.397889,-0.612293,23.174529,-108.737416,222.986061,
+ -0.683214,0.397889,-0.612293,24.178469,-106.054766,223.609113,
+ -0.33218,0.32957,-0.883765,23.14654,-105.752063,224.109866,
+ -0.33218,0.32957,-0.883765,24.178469,-106.054766,223.609113,
+ -0.33218,0.32957,-0.883765,23.174529,-108.737416,222.986061,
+ -0.382066,0.19269,-0.903823,25.393845,-103.860396,223.563175,
+ -0.382066,0.19269,-0.903823,24.178469,-106.054766,223.609113,
+ -0.382066,0.19269,-0.903823,23.14654,-105.752063,224.109866,
+ -0.470431,0.321362,-0.82184,25.004134,-102.569877,224.290879,
+ -0.470431,0.321362,-0.82184,25.393845,-103.860396,223.563175,
+ -0.470431,0.321362,-0.82184,23.14654,-105.752063,224.109866,
+ 0.307259,0.536129,-0.78623,25.004134,-102.569877,224.290879,
+ 0.307259,0.536129,-0.78623,27.918299,-103.864351,224.547036,
+ 0.307259,0.536129,-0.78623,25.393845,-103.860396,223.563175,
+ 0.1495,0.142955,-0.978373,28.686769,-101.848865,224.958956,
+ 0.1495,0.142955,-0.978373,27.918299,-103.864351,224.547036,
+ 0.1495,0.142955,-0.978373,25.004134,-102.569877,224.290879,
+ -0.115914,0.057023,-0.991621,27.035744,-104.831176,223.622194,
+ -0.115914,0.057023,-0.991621,29.071004,-106.545176,223.285722,
+ -0.115914,0.057023,-0.991621,27.791741,-106.421052,223.442398,
+ 0.030002,0.22673,-0.973495,27.035744,-104.831176,223.622194,
+ 0.030002,0.22673,-0.973495,28.83158,-104.863728,223.669957,
+ 0.030002,0.22673,-0.973495,29.071004,-106.545176,223.285722,
+ -0.386958,0.547579,-0.741903,29.16501,-109.749267,221.34112,
+ -0.386958,0.547579,-0.741903,28.977303,-110.717004,220.724762,
+ -0.386958,0.547579,-0.741903,27.569049,-110.54816,221.583891,
+ -0.264371,0.244653,-0.932873,28.471683,-109.584377,221.580849,
+ -0.264371,0.244653,-0.932873,29.16501,-109.749267,221.34112,
+ -0.264371,0.244653,-0.932873,27.569049,-110.54816,221.583891,
+ -0.174748,0.160594,-0.971428,28.471683,-109.584377,221.580849,
+ -0.174748,0.160594,-0.971428,27.569049,-110.54816,221.583891,
+ -0.174748,0.160594,-0.971428,25.846835,-109.981998,221.987293,
+ -0.201518,0.431436,-0.879349,27.152566,-109.270417,222.037185,
+ -0.201518,0.431436,-0.879349,28.471683,-109.584377,221.580849,
+ -0.201518,0.431436,-0.879349,25.846835,-109.981998,221.987293,
+ -0.7964,0.298866,-0.525762,31.001004,-109.191319,219.203336,
+ -0.7964,0.298866,-0.525762,30.534628,-110.198606,219.337195,
+ -0.7964,0.298866,-0.525762,30.304634,-109.032514,220.348436,
+ -0.796414,0.024677,-0.604249,29.657245,-104.706444,222.588136,
+ -0.796414,0.024677,-0.604249,29.071004,-106.545176,223.285722,
+ -0.796414,0.024677,-0.604249,28.83158,-104.863728,223.669957,
+ -0.868303,0.091911,-0.487444,30.181423,-105.319152,221.538866,
+ -0.868303,0.091911,-0.487444,29.071004,-106.545176,223.285722,
+ -0.868303,0.091911,-0.487444,29.657245,-104.706444,222.588136,
+ -0.16474,0.390407,-0.905783,27.287641,-107.713093,222.883233,
+ -0.16474,0.390407,-0.905783,29.559589,-107.806794,222.429635,
+ -0.16474,0.390407,-0.905783,28.191188,-109.131691,222.107461,
+ -0.306767,0.511938,-0.80238,28.191188,-109.131691,222.107461,
+ -0.306767,0.511938,-0.80238,29.514259,-108.817123,221.802324,
+ -0.306767,0.511938,-0.80238,29.16501,-109.749267,221.34112,
+ -0.306768,0.511953,-0.80237,29.514259,-108.817123,221.802324,
+ -0.306768,0.511953,-0.80237,28.191188,-109.131691,222.107461,
+ -0.306768,0.511953,-0.80237,29.559589,-107.806794,222.429635,
+ -0.804996,0.338598,-0.487168,31.081927,-106.752961,220.646576,
+ -0.804996,0.338598,-0.487168,29.514259,-108.817123,221.802324,
+ -0.804996,0.338598,-0.487168,29.559589,-107.806794,222.429635,
+ -0.80486,0.338225,-0.487652,29.514259,-108.817123,221.802324,
+ -0.80486,0.338225,-0.487652,31.081927,-106.752961,220.646576,
+ -0.80486,0.338225,-0.487652,30.304634,-109.032514,220.348436,
+ -0.070195,0.419138,-0.905205,27.791741,-106.421052,223.442398,
+ -0.070195,0.419138,-0.905205,29.071004,-106.545176,223.285722,
+ -0.070195,0.419138,-0.905205,27.287641,-107.713093,222.883233,
+ -0.147242,0.5157,-0.844022,29.071004,-106.545176,223.285722,
+ -0.147242,0.5157,-0.844022,29.559589,-107.806794,222.429635,
+ -0.147242,0.5157,-0.844022,27.287641,-107.713093,222.883233,
+ 0.587011,0.614279,0.527333,34.014041,-115.956355,223.96323,
+ 0.587011,0.614279,0.527333,32.267185,-116.17996,226.168248,
+ 0.587011,0.614279,0.527333,33.92034,-117.20763,225.525117,
+ 0.981426,-0.191272,0.01475,34.51084,-120.109017,222.020453,
+ 0.981426,-0.191272,0.01475,34.936449,-117.870231,222.733251,
+ 0.981426,-0.191272,0.01475,34.753915,-118.655129,224.700365,
+ 0.437035,0.791879,0.42653,34.014041,-115.956355,223.96323,
+ 0.437035,0.791879,0.42653,31.795638,-115.298014,225.01402,
+ 0.437035,0.791879,0.42653,32.267185,-116.17996,226.168248,
+ 0.989445,-0.144461,-0.011373,34.51084,-120.109017,222.020453,
+ 0.989445,-0.144461,-0.011373,34.753915,-118.655129,224.700365,
+ 0.989445,-0.144461,-0.011373,34.417139,-120.883268,223.703118,
+ 0.253471,0.815812,0.51981,32.267185,-116.17996,226.168248,
+ 0.253471,0.815812,0.51981,31.795638,-115.298014,225.01402,
+ 0.253471,0.815812,0.51981,30.241964,-115.800593,226.560393,
+ 0.879677,-0.466759,-0.091127,34.417139,-120.883268,223.703118,
+ 0.879677,-0.466759,-0.091127,34.412879,-121.180191,225.182865,
+ 0.879677,-0.466759,-0.091127,33.28512,-123.248308,224.889289,
+ 0.894193,0.381036,0.235012,34.936449,-117.870231,222.733251,
+ 0.894193,0.381036,0.235012,33.92034,-117.20763,225.525117,
+ 0.894193,0.381036,0.235012,34.753915,-118.655129,224.700365,
+ 0.923555,0.270327,0.271973,34.936449,-117.870231,222.733251,
+ 0.923555,0.270327,0.271973,34.014041,-115.956355,223.96323,
+ 0.923555,0.270327,0.271973,33.92034,-117.20763,225.525117,
+ 0.886896,-0.43678,-0.150458,33.508116,-123.35357,226.271684,
+ 0.886896,-0.43678,-0.150458,34.544,-121.271763,226.334354,
+ 0.886896,-0.43678,-0.150458,33.568048,-123.420195,226.818375,
+ 0.90415,-0.423458,-0.056538,34.544,-121.271763,226.334354,
+ 0.90415,-0.423458,-0.056538,34.605453,-121.252901,227.175839,
+ 0.90415,-0.423458,-0.056538,33.568048,-123.420195,226.818375,
+ 0.869802,-0.47789,-0.122746,33.192027,-123.016185,223.32588,
+ 0.869802,-0.47789,-0.122746,34.417139,-120.883268,223.703118,
+ 0.869802,-0.47789,-0.122746,33.28512,-123.248308,224.889289,
+ -0.34136,-0.92592,-0.161697,28.616493,-123.452747,222.662366,
+ -0.34136,-0.92592,-0.161697,27.206109,-123.040523,223.279333,
+ -0.34136,-0.92592,-0.161697,26.669153,-122.548288,221.594235,
+ -0.742953,-0.667701,0.046866,24.9153,-120.511202,222.999143,
+ -0.742953,-0.667701,0.046866,27.206109,-123.040523,223.279333,
+ -0.742953,-0.667701,0.046866,25.549912,-121.099572,224.67694,
+ -0.805688,0.351137,0.477042,26.49027,-115.470205,223.955016,
+ -0.805688,0.351137,0.477042,25.474465,-117.816687,223.966576,
+ -0.805688,0.351137,0.477042,26.448895,-119.058835,226.526624,
+ -0.278233,0.789363,0.54726,29.787757,-114.301375,223.945585,
+ -0.278233,0.789363,0.54726,26.49027,-115.470205,223.955016,
+ -0.278233,0.789363,0.54726,27.123665,-116.468365,225.716779,
+ -0.299274,0.796878,0.524806,30.063384,-115.09966,225.314898,
+ -0.299274,0.796878,0.524806,29.787757,-114.301375,223.945585,
+ -0.299274,0.796878,0.524806,27.123665,-116.468365,225.716779,
+ 0.18235,0.854388,0.48659,31.798376,-114.410287,223.454262,
+ 0.18235,0.854388,0.48659,30.063384,-115.09966,225.314898,
+ 0.18235,0.854388,0.48659,31.795638,-115.298014,225.01402,
+ 0.624773,0.678125,0.387047,33.690347,-115.040032,221.503576,
+ 0.624773,0.678125,0.387047,31.798376,-114.410287,223.454262,
+ 0.624773,0.678125,0.387047,31.795638,-115.298014,225.01402,
+ -0.742834,-0.668187,0.04152,26.669153,-122.548288,221.594235,
+ -0.742834,-0.668187,0.04152,27.206109,-123.040523,223.279333,
+ -0.742834,-0.668187,0.04152,24.9153,-120.511202,222.999143,
+ -0.922601,0.061211,0.380869,25.474465,-117.816687,223.966576,
+ -0.922601,0.061211,0.380869,25.549912,-121.099572,224.67694,
+ -0.922601,0.061211,0.380869,26.448895,-119.058835,226.526624,
+ 0.925097,0.379228,0.019534,34.557082,-117.114842,220.736322,
+ 0.925097,0.379228,0.019534,33.690347,-115.040032,221.503576,
+ 0.925097,0.379228,0.019534,34.014041,-115.956355,223.96323,
+ 0.969879,-0.100039,-0.222096,34.205094,-119.520343,220.282724,
+ 0.969879,-0.100039,-0.222096,34.557082,-117.114842,220.736322,
+ 0.969879,-0.100039,-0.222096,34.936449,-117.870231,222.733251,
+ 0.970501,-0.117464,-0.210547,34.205094,-119.520343,220.282724,
+ 0.970501,-0.117464,-0.210547,34.936449,-117.870231,222.733251,
+ 0.970501,-0.117464,-0.210547,34.51084,-120.109017,222.020453,
+ 0.883289,-0.453716,-0.118074,33.110799,-122.756378,221.71988,
+ 0.883289,-0.453716,-0.118074,34.51084,-120.109017,222.020453,
+ 0.883289,-0.453716,-0.118074,33.192027,-123.016185,223.32588,
+ 0.273767,-0.947015,-0.167971,33.110799,-122.756378,221.71988,
+ 0.273767,-0.947015,-0.167971,30.969364,-123.436623,222.06487,
+ 0.273767,-0.947015,-0.167971,30.733895,-123.205108,220.375816,
+ 0.273905,-0.947098,-0.167277,30.969364,-123.436623,222.06487,
+ 0.273905,-0.947098,-0.167277,33.110799,-122.756378,221.71988,
+ 0.273905,-0.947098,-0.167277,31.186276,-123.656577,223.665394,
+ 0.2741,-0.947077,-0.167075,31.186276,-123.656577,223.665394,
+ 0.2741,-0.947077,-0.167075,33.110799,-122.756378,221.71988,
+ 0.2741,-0.947077,-0.167075,33.192027,-123.016185,223.32588,
+ -0.026864,-0.990816,-0.132523,31.186276,-123.656577,223.665394,
+ -0.026864,-0.990816,-0.132523,28.616493,-123.452747,222.662366,
+ -0.026864,-0.990816,-0.132523,30.969364,-123.436623,222.06487,
+ -0.00931,-0.984315,-0.176175,31.186276,-123.656577,223.665394,
+ -0.00931,-0.984315,-0.176175,28.910678,-123.739326,224.247984,
+ -0.00931,-0.984315,-0.176175,28.616493,-123.452747,222.662366,
+ -0.322867,-0.940031,-0.109995,28.910678,-123.739326,224.247984,
+ -0.322867,-0.940031,-0.109995,27.206109,-123.040523,223.279333,
+ -0.322867,-0.940031,-0.109995,28.616493,-123.452747,222.662366,
+ -0.353141,-0.934099,-0.052443,28.910678,-123.739326,224.247984,
+ -0.353141,-0.934099,-0.052443,27.24505,-123.152173,225.005806,
+ -0.353141,-0.934099,-0.052443,27.206109,-123.040523,223.279333,
+ -0.768941,-0.63887,-0.023972,27.206109,-123.040523,223.279333,
+ -0.768941,-0.63887,-0.023972,27.24505,-123.152173,225.005806,
+ -0.768941,-0.63887,-0.023972,25.549912,-121.099572,224.67694,
+ -0.770782,-0.604147,0.20224,25.549912,-121.099572,224.67694,
+ -0.770782,-0.604147,0.20224,27.24505,-123.152173,225.005806,
+ -0.770782,-0.604147,0.20224,26.230766,-121.517272,226.024045,
+ -0.794274,0.359917,0.489478,26.49027,-115.470205,223.955016,
+ -0.794274,0.359917,0.489478,26.448895,-119.058835,226.526624,
+ -0.794274,0.359917,0.489478,27.123665,-116.468365,225.716779,
+ -0.893943,-0.012271,0.448012,25.549912,-121.099572,224.67694,
+ -0.893943,-0.012271,0.448012,26.230766,-121.517272,226.024045,
+ -0.893943,-0.012271,0.448012,26.448895,-119.058835,226.526624,
+ -0.056009,-0.195201,0.979163,26.448895,-119.058835,226.526624,
+ -0.056009,-0.195201,0.979163,26.230766,-121.517272,226.024045,
+ -0.056009,-0.195201,0.979163,26.806359,-119.242282,226.5105,
+ 0.172609,0.252667,0.952032,27.123665,-116.468365,225.716779,
+ 0.172609,0.252667,0.952032,26.448895,-119.058835,226.526624,
+ 0.172609,0.252667,0.952032,26.806359,-119.242282,226.5105,
+ 0.162357,0.866319,0.472368,31.798376,-114.410287,223.454262,
+ 0.162357,0.866319,0.472368,29.787757,-114.301375,223.945585,
+ 0.162357,0.866319,0.472368,30.063384,-115.09966,225.314898,
+ 0.391147,0.878079,0.275646,34.014041,-115.956355,223.96323,
+ 0.391147,0.878079,0.275646,33.690347,-115.040032,221.503576,
+ 0.391147,0.878079,0.275646,31.795638,-115.298014,225.01402,
+ -0.771415,0.255054,0.58298,27.123665,-116.468365,225.716779,
+ -0.771415,0.255054,0.58298,26.806359,-119.242282,226.5105,
+ -0.771415,0.255054,0.58298,27.797217,-117.026312,226.852144,
+ 0.899422,0.437047,-0.005544,34.557082,-117.114842,220.736322,
+ 0.899422,0.437047,-0.005544,34.014041,-115.956355,223.96323,
+ 0.899422,0.437047,-0.005544,34.936449,-117.870231,222.733251,
+ -0.340532,0.79768,0.49774,30.241964,-115.800593,226.560393,
+ -0.340532,0.79768,0.49774,30.063384,-115.09966,225.314898,
+ -0.340532,0.79768,0.49774,27.797217,-117.026312,226.852144,
+ -0.926673,0.059026,0.371205,24.9153,-120.511202,222.999143,
+ -0.926673,0.059026,0.371205,25.549912,-121.099572,224.67694,
+ -0.926673,0.059026,0.371205,25.474465,-117.816687,223.966576,
+ -0.287769,0.780874,0.554459,30.063384,-115.09966,225.314898,
+ -0.287769,0.780874,0.554459,27.123665,-116.468365,225.716779,
+ -0.287769,0.780874,0.554459,27.797217,-117.026312,226.852144,
+ 0.867404,-0.468627,-0.167329,34.51084,-120.109017,222.020453,
+ 0.867404,-0.468627,-0.167329,34.417139,-120.883268,223.703118,
+ 0.867404,-0.468627,-0.167329,33.192027,-123.016185,223.32588,
+ 0.314495,-0.935987,-0.158183,33.568048,-123.420195,226.818375,
+ 0.314495,-0.935987,-0.158183,31.898465,-124.047506,227.210824,
+ 0.314495,-0.935987,-0.158183,31.744224,-123.996092,226.599942,
+ 0.179775,0.868068,0.462751,31.795638,-115.298014,225.01402,
+ 0.179775,0.868068,0.462751,30.063384,-115.09966,225.314898,
+ 0.179775,0.868068,0.462751,30.241964,-115.800593,226.560393,
+ 0.313911,-0.937736,-0.148695,33.568048,-123.420195,226.818375,
+ 0.313911,-0.937736,-0.148695,31.744224,-123.996092,226.599942,
+ 0.313911,-0.937736,-0.148695,33.508116,-123.35357,226.271684,
+ -0.403816,0.132635,-0.905174,27.569049,-118.320483,217.089281,
+ -0.403816,0.132635,-0.905174,28.043639,-120.573264,216.547458,
+ -0.403816,0.132635,-0.905174,26.648466,-120.494165,217.181461,
+ -0.381148,0.139516,-0.913927,27.569049,-118.320483,217.089281,
+ -0.381148,0.139516,-0.913927,28.922847,-119.283353,216.3777,
+ -0.381148,0.139516,-0.913927,28.043639,-120.573264,216.547458,
+ 0.37914,0.881538,0.281324,33.498989,-118.23317,227.877076,
+ 0.37914,0.881538,0.281324,32.300041,-117.920428,228.512904,
+ 0.37914,0.881538,0.281324,32.376402,-118.13521,229.083021,
+ 0.542789,0.710695,0.44754,33.535496,-118.68616,228.552149,
+ 0.542789,0.710695,0.44754,33.498989,-118.23317,227.877076,
+ 0.542789,0.710695,0.44754,32.376402,-118.13521,229.083021,
+ 0.98045,0.181637,-0.075673,34.544,-121.271763,226.334354,
+ 0.98045,0.181637,-0.075673,34.322829,-119.452806,227.834788,
+ 0.98045,0.181637,-0.075673,34.605453,-121.252901,227.175839,
+ 0.830226,0.482612,0.278946,34.322525,-119.184784,227.072402,
+ 0.830226,0.482612,0.278946,33.498989,-118.23317,227.877076,
+ 0.830226,0.482612,0.278946,33.535496,-118.68616,228.552149,
+ -0.330628,0.214365,-0.919093,28.420877,-118.27059,216.794488,
+ -0.330628,0.214365,-0.919093,28.922847,-119.283353,216.3777,
+ -0.330628,0.214365,-0.919093,27.569049,-118.320483,217.089281,
+ 0.995032,0.094044,0.032665,34.544,-121.271763,226.334354,
+ 0.995032,0.094044,0.032665,34.322525,-119.184784,227.072402,
+ 0.995032,0.094044,0.032665,34.322829,-119.452806,227.834788,
+ 0.197948,0.376633,-0.904966,27.917994,-117.442491,217.531015,
+ 0.197948,0.376633,-0.904966,27.569049,-118.320483,217.089281,
+ 0.197948,0.376633,-0.904966,26.629909,-117.838591,217.084413,
+ -0.209693,0.281425,-0.936391,29.598225,-117.63324,216.722387,
+ -0.209693,0.281425,-0.936391,28.922847,-119.283353,216.3777,
+ -0.209693,0.281425,-0.936391,28.420877,-118.27059,216.794488,
+ -0.366948,0.597157,-0.713269,29.103861,-116.861423,217.622891,
+ -0.366948,0.597157,-0.713269,29.598225,-117.63324,216.722387,
+ -0.366948,0.597157,-0.713269,28.420877,-118.27059,216.794488,
+ -0.30607,0.522147,-0.796042,27.917994,-117.442491,217.531015,
+ -0.30607,0.522147,-0.796042,28.420877,-118.27059,216.794488,
+ -0.30607,0.522147,-0.796042,27.569049,-118.320483,217.089281,
+ -0.441841,0.25228,-0.86089,28.29219,-116.120637,217.726327,
+ -0.441841,0.25228,-0.86089,27.917994,-117.442491,217.531015,
+ -0.441841,0.25228,-0.86089,27.354571,-116.995586,217.951149,
+ 0.035823,0.701256,-0.712008,27.354571,-116.995586,217.951149,
+ 0.035823,0.701256,-0.712008,26.629909,-117.838591,217.084413,
+ 0.035823,0.701256,-0.712008,25.53318,-117.483562,217.378903,
+ 0.029463,0.704117,-0.709473,27.354571,-116.995586,217.951149,
+ 0.029463,0.704117,-0.709473,27.917994,-117.442491,217.531015,
+ 0.029463,0.704117,-0.709473,26.629909,-117.838591,217.084413,
+ -0.386727,0.170503,-0.906295,27.119101,-115.501844,218.332646,
+ -0.386727,0.170503,-0.906295,27.354571,-116.995586,217.951149,
+ -0.386727,0.170503,-0.906295,26.773502,-116.251757,218.339035,
+ -0.150466,0.697555,-0.700555,26.773502,-116.251757,218.339035,
+ -0.150466,0.697555,-0.700555,25.53318,-117.483562,217.378903,
+ -0.150466,0.697555,-0.700555,24.861757,-116.913445,218.090788,
+ 0.028063,0.279038,-0.95987,26.234721,-115.272459,218.607969,
+ 0.028063,0.279038,-0.95987,26.773502,-116.251757,218.339035,
+ 0.028063,0.279038,-0.95987,24.861757,-116.913445,218.090788,
+ -0.378951,0.172471,-0.909203,27.119101,-115.501844,218.332646,
+ -0.378951,0.172471,-0.909203,28.29219,-116.120637,217.726327,
+ -0.378951,0.172471,-0.909203,27.354571,-116.995586,217.951149,
+ 0.773532,0.597983,0.209916,34.322525,-119.184784,227.072402,
+ 0.773532,0.597983,0.209916,33.535496,-118.68616,228.552149,
+ 0.773532,0.597983,0.209916,34.322829,-119.452806,227.834788,
+ -0.267878,0.115303,-0.956529,26.234721,-115.272459,218.607969,
+ -0.267878,0.115303,-0.956529,27.119101,-115.501844,218.332646,
+ -0.267878,0.115303,-0.956529,26.773502,-116.251757,218.339035,
+ -0.806965,0.417536,-0.417697,28.922847,-119.283353,216.3777,
+ -0.806965,0.417536,-0.417697,29.598225,-117.63324,216.722387,
+ -0.806965,0.417536,-0.417697,29.374925,-118.386499,216.400821,
+ -0.529954,0.254771,-0.808851,28.922847,-119.283353,216.3777,
+ -0.529954,0.254771,-0.808851,29.29613,-119.768286,215.980383,
+ -0.529954,0.254771,-0.808851,28.043639,-120.573264,216.547458,
+ -0.21852,0.571077,-0.791278,29.103861,-116.861423,217.622891,
+ -0.21852,0.571077,-0.791278,28.420877,-118.27059,216.794488,
+ -0.21852,0.571077,-0.791278,27.917994,-117.442491,217.531015,
+ -0.386868,0.301534,-0.871442,25.186973,-115.174803,219.106897,
+ -0.386868,0.301534,-0.871442,26.234721,-115.272459,218.607969,
+ -0.386868,0.301534,-0.871442,25.747658,-116.009899,218.569028,
+ 0.005831,0.144551,-0.98948,28.29219,-116.120637,217.726327,
+ 0.005831,0.144551,-0.98948,29.103861,-116.861423,217.622891,
+ 0.005831,0.144551,-0.98948,27.917994,-117.442491,217.531015,
+ -0.295403,0.605627,-0.738887,27.037569,-114.373476,219.023844,
+ -0.295403,0.605627,-0.738887,26.234721,-115.272459,218.607969,
+ -0.295403,0.605627,-0.738887,25.186973,-115.174803,219.106897,
+ 0.120946,0.53163,-0.838297,26.773502,-116.251757,218.339035,
+ 0.120946,0.53163,-0.838297,27.354571,-116.995586,217.951149,
+ 0.120946,0.53163,-0.838297,25.53318,-117.483562,217.378903,
+ -0.73688,0.460562,0.494864,24.861757,-116.913445,218.090788,
+ -0.73688,0.460562,0.494864,25.747658,-116.009899,218.569028,
+ -0.73688,0.460562,0.494864,26.234721,-115.272459,218.607969,
+ -0.131965,0.510832,-0.849491,27.037569,-114.373476,219.023844,
+ -0.131965,0.510832,-0.849491,27.119101,-115.501844,218.332646,
+ -0.131965,0.510832,-0.849491,26.234721,-115.272459,218.607969,
+ -0.446097,0.283711,-0.848826,29.938956,-118.265114,216.144969,
+ -0.446097,0.283711,-0.848826,29.29613,-119.768286,215.980383,
+ -0.446097,0.283711,-0.848826,29.374925,-118.386499,216.400821,
+ -0.508044,0.277115,-0.815536,29.374925,-118.386499,216.400821,
+ -0.508044,0.277115,-0.815536,29.29613,-119.768286,215.980383,
+ -0.508044,0.277115,-0.815536,28.922847,-119.283353,216.3777,
+ -0.061124,-0.995785,-0.068375,31.898465,-124.047506,227.210824,
+ -0.061124,-0.995785,-0.068375,29.679453,-123.911213,227.209607,
+ -0.061124,-0.995785,-0.068375,31.744224,-123.996092,226.599942,
+ -0.331119,-0.94045,-0.0769,29.86716,-124.042029,228.001199,
+ -0.331119,-0.94045,-0.0769,28.22952,-123.453051,227.849695,
+ -0.331119,-0.94045,-0.0769,29.679453,-123.911213,227.209607,
+ -0.793008,-0.554043,0.253327,28.22952,-123.453051,227.849695,
+ -0.793008,-0.554043,0.253327,28.499671,-123.481953,228.63216,
+ -0.793008,-0.554043,0.253327,27.502424,-122.022588,228.702132,
+ -0.060541,-0.987019,-0.148756,31.898465,-124.047506,227.210824,
+ -0.060541,-0.987019,-0.148756,29.86716,-124.042029,228.001199,
+ -0.060541,-0.987019,-0.148756,29.679453,-123.911213,227.209607,
+ -0.344119,-0.935137,0.084269,29.86716,-124.042029,228.001199,
+ -0.344119,-0.935137,0.084269,28.499671,-123.481953,228.63216,
+ -0.344119,-0.935137,0.084269,28.22952,-123.453051,227.849695,
+ -0.767524,-0.540971,0.343887,28.499671,-123.481953,228.63216,
+ -0.767524,-0.540971,0.343887,27.758581,-122.096515,229.157556,
+ -0.767524,-0.540971,0.343887,27.502424,-122.022588,228.702132,
+ -0.865155,0.065374,0.497225,27.502424,-122.022588,228.702132,
+ -0.865155,0.065374,0.497225,27.758581,-122.096515,229.157556,
+ -0.865155,0.065374,0.497225,27.879358,-120.134877,229.109793,
+ -0.870933,0.065481,0.487019,27.879358,-120.134877,229.109793,
+ -0.870933,0.065481,0.487019,27.758581,-122.096515,229.157556,
+ -0.870933,0.065481,0.487019,28.126692,-120.311631,229.575864,
+ -0.784362,0.313618,0.535182,27.879358,-120.134877,229.109793,
+ -0.784362,0.313618,0.535182,28.126692,-120.311631,229.575864,
+ -0.784362,0.313618,0.535182,28.882081,-118.079233,229.374772,
+ -0.765746,0.309875,0.563569,28.882081,-118.079233,229.374772,
+ -0.765746,0.309875,0.563569,28.126692,-120.311631,229.575864,
+ -0.765746,0.309875,0.563569,29.119985,-118.445215,229.899255,
+ -0.187472,0.763601,0.617874,30.729331,-117.414503,229.113747,
+ -0.187472,0.763601,0.617874,28.882081,-118.079233,229.374772,
+ -0.187472,0.763601,0.617874,29.119985,-118.445215,229.899255,
+ -0.192141,0.76678,0.612479,30.777094,-117.650885,229.424665,
+ -0.192141,0.76678,0.612479,30.729331,-117.414503,229.113747,
+ -0.192141,0.76678,0.612479,29.119985,-118.445215,229.899255,
+ 0.4332,0.748306,0.502369,32.300041,-117.920428,228.512904,
+ 0.4332,0.748306,0.502369,30.729331,-117.414503,229.113747,
+ 0.4332,0.748306,0.502369,30.777094,-117.650885,229.424665,
+ 0.333886,0.895976,0.292825,32.376402,-118.13521,229.083021,
+ 0.333886,0.895976,0.292825,32.300041,-117.920428,228.512904,
+ 0.333886,0.895976,0.292825,30.777094,-117.650885,229.424665,
+ 0.27612,-0.948177,-0.15722,33.28512,-123.248308,224.889289,
+ 0.27612,-0.948177,-0.15722,31.186276,-123.656577,223.665394,
+ 0.27612,-0.948177,-0.15722,33.192027,-123.016185,223.32588,
+ 0.282744,-0.944017,-0.169967,33.28512,-123.248308,224.889289,
+ 0.282744,-0.944017,-0.169967,31.410794,-123.86923,225.21998,
+ 0.282744,-0.944017,-0.169967,31.186276,-123.656577,223.665394,
+ 0.001283,-0.990748,-0.13571,31.410794,-123.86923,225.21998,
+ 0.001283,-0.990748,-0.13571,28.910678,-123.739326,224.247984,
+ 0.001283,-0.990748,-0.13571,31.186276,-123.656577,223.665394,
+ 0.377854,0.744804,0.549994,32.385224,-117.148611,227.616051,
+ 0.377854,0.744804,0.549994,30.518504,-116.61135,228.170956,
+ 0.377854,0.744804,0.549994,30.729331,-117.414503,229.113747,
+ -0.36343,-0.931529,-0.013099,29.260536,-123.951066,225.899313,
+ -0.36343,-0.931529,-0.013099,27.737893,-123.366651,226.584426,
+ -0.36343,-0.931529,-0.013099,27.24505,-123.152173,225.005806,
+ -0.350535,-0.935435,-0.045679,29.260536,-123.951066,225.899313,
+ -0.350535,-0.935435,-0.045679,27.24505,-123.152173,225.005806,
+ -0.350535,-0.935435,-0.045679,28.910678,-123.739326,224.247984,
+ 0.444488,0.657669,0.608196,32.385224,-117.148611,227.616051,
+ 0.444488,0.657669,0.608196,30.729331,-117.414503,229.113747,
+ 0.444488,0.657669,0.608196,32.300041,-117.920428,228.512904,
+ -0.002279,-0.991938,-0.126707,31.410794,-123.86923,225.21998,
+ -0.002279,-0.991938,-0.126707,29.260536,-123.951066,225.899313,
+ -0.002279,-0.991938,-0.126707,28.910678,-123.739326,224.247984,
+ 0.532587,0.615855,0.58058,33.575958,-117.691651,227.099782,
+ 0.532587,0.615855,0.58058,32.385224,-117.148611,227.616051,
+ 0.532587,0.615855,0.58058,32.300041,-117.920428,228.512904,
+ -0.900638,0.139893,0.411437,26.230766,-121.517272,226.024045,
+ -0.900638,0.139893,0.411437,26.859598,-121.760043,227.483105,
+ -0.900638,0.139893,0.411437,26.806359,-119.242282,226.5105,
+ 0.467598,0.702898,0.535992,33.575958,-117.691651,227.099782,
+ 0.467598,0.702898,0.535992,32.300041,-117.920428,228.512904,
+ 0.467598,0.702898,0.535992,33.498989,-118.23317,227.877076,
+ -0.786611,-0.566894,0.244692,26.230766,-121.517272,226.024045,
+ -0.786611,-0.566894,0.244692,27.737893,-123.366651,226.584426,
+ -0.786611,-0.566894,0.244692,26.859598,-121.760043,227.483105,
+ 0.878962,0.34606,0.328127,34.534569,-119.059139,225.974152,
+ 0.878962,0.34606,0.328127,33.575958,-117.691651,227.099782,
+ 0.878962,0.34606,0.328127,33.498989,-118.23317,227.877076,
+ -0.788465,-0.592346,0.165679,27.24505,-123.152173,225.005806,
+ -0.788465,-0.592346,0.165679,27.737893,-123.366651,226.584426,
+ -0.788465,-0.592346,0.165679,26.230766,-121.517272,226.024045,
+ 0.977111,-0.121264,0.174782,34.412879,-121.180191,225.182865,
+ 0.977111,-0.121264,0.174782,34.534569,-119.059139,225.974152,
+ 0.977111,-0.121264,0.174782,34.322525,-119.184784,227.072402,
+ 0.821773,0.52611,0.218853,34.534569,-119.059139,225.974152,
+ 0.821773,0.52611,0.218853,33.498989,-118.23317,227.877076,
+ 0.821773,0.52611,0.218853,34.322525,-119.184784,227.072402,
+ -0.908123,0.13403,0.396671,26.806359,-119.242282,226.5105,
+ -0.908123,0.13403,0.396671,26.859598,-121.760043,227.483105,
+ -0.908123,0.13403,0.396671,27.308937,-119.819396,227.856084,
+ 0.984952,0.140245,-0.101004,34.412879,-121.180191,225.182865,
+ 0.984952,0.140245,-0.101004,34.322525,-119.184784,227.072402,
+ 0.984952,0.140245,-0.101004,34.544,-121.271763,226.334354,
+ -0.840767,0.307215,0.445791,26.806359,-119.242282,226.5105,
+ -0.840767,0.307215,0.445791,27.308937,-119.819396,227.856084,
+ -0.840767,0.307215,0.445791,27.797217,-117.026312,226.852144,
+ -0.825477,0.31311,0.469628,27.797217,-117.026312,226.852144,
+ -0.825477,0.31311,0.469628,27.308937,-119.819396,227.856084,
+ -0.825477,0.31311,0.469628,28.311356,-117.667617,228.183429,
+ 0.254232,-0.958418,-0.129618,33.110799,-122.756378,221.71988,
+ 0.254232,-0.958418,-0.129618,30.733895,-123.205108,220.375816,
+ 0.254232,-0.958418,-0.129618,32.864378,-122.581753,219.945339,
+ -0.803028,0.327533,0.497863,28.311356,-117.667617,228.183429,
+ -0.803028,0.327533,0.497863,27.879358,-120.134877,229.109793,
+ -0.803028,0.327533,0.497863,28.882081,-118.079233,229.374772,
+ -0.055211,-0.990232,-0.128032,30.969364,-123.436623,222.06487,
+ -0.055211,-0.990232,-0.128032,28.30223,-123.148827,220.989133,
+ -0.055211,-0.990232,-0.128032,30.733895,-123.205108,220.375816,
+ -0.169722,0.731128,0.660792,30.729331,-117.414503,229.113747,
+ -0.169722,0.731128,0.660792,30.518504,-116.61135,228.170956,
+ -0.169722,0.731128,0.660792,28.882081,-118.079233,229.374772,
+ -0.036901,-0.984427,-0.171877,30.969364,-123.436623,222.06487,
+ -0.036901,-0.984427,-0.171877,28.616493,-123.452747,222.662366,
+ -0.036901,-0.984427,-0.171877,28.30223,-123.148827,220.989133,
+ -0.381237,0.802053,0.459749,30.518504,-116.61135,228.170956,
+ -0.381237,0.802053,0.459749,28.311356,-117.667617,228.183429,
+ -0.381237,0.802053,0.459749,28.882081,-118.079233,229.374772,
+ -0.374982,-0.92194,-0.09703,28.616493,-123.452747,222.662366,
+ -0.374982,-0.92194,-0.09703,26.669153,-122.548288,221.594235,
+ -0.374982,-0.92194,-0.09703,28.30223,-123.148827,220.989133,
+ -0.33579,0.791351,0.51089,30.241964,-115.800593,226.560393,
+ -0.33579,0.791351,0.51089,27.797217,-117.026312,226.852144,
+ -0.33579,0.791351,0.51089,28.311356,-117.667617,228.183429,
+ -0.379529,0.79857,0.467167,30.518504,-116.61135,228.170956,
+ -0.379529,0.79857,0.467167,30.241964,-115.800593,226.560393,
+ -0.379529,0.79857,0.467167,28.311356,-117.667617,228.183429,
+ 0.243249,0.882514,0.402491,32.267185,-116.17996,226.168248,
+ 0.243249,0.882514,0.402491,30.241964,-115.800593,226.560393,
+ 0.243249,0.882514,0.402491,30.518504,-116.61135,228.170956,
+ 0.372979,0.784929,0.494746,32.385224,-117.148611,227.616051,
+ 0.372979,0.784929,0.494746,32.267185,-116.17996,226.168248,
+ 0.372979,0.784929,0.494746,30.518504,-116.61135,228.170956,
+ 0.591295,0.691726,0.41459,33.92034,-117.20763,225.525117,
+ 0.591295,0.691726,0.41459,32.267185,-116.17996,226.168248,
+ 0.591295,0.691726,0.41459,32.385224,-117.148611,227.616051,
+ 0.510551,0.784181,0.3527,33.92034,-117.20763,225.525117,
+ 0.510551,0.784181,0.3527,32.385224,-117.148611,227.616051,
+ 0.510551,0.784181,0.3527,33.575958,-117.691651,227.099782,
+ 0.890569,0.341985,0.299888,34.753915,-118.655129,224.700365,
+ 0.890569,0.341985,0.299888,33.92034,-117.20763,225.525117,
+ 0.890569,0.341985,0.299888,33.575958,-117.691651,227.099782,
+ 0.878902,0.389772,0.274971,34.753915,-118.655129,224.700365,
+ 0.878902,0.389772,0.274971,33.575958,-117.691651,227.099782,
+ 0.878902,0.389772,0.274971,34.534569,-119.059139,225.974152,
+ 0.975074,-0.194867,0.106101,34.417139,-120.883268,223.703118,
+ 0.975074,-0.194867,0.106101,34.753915,-118.655129,224.700365,
+ 0.975074,-0.194867,0.106101,34.534569,-119.059139,225.974152,
+ 0.998493,-0.054294,-0.008021,34.417139,-120.883268,223.703118,
+ 0.998493,-0.054294,-0.008021,34.534569,-119.059139,225.974152,
+ 0.998493,-0.054294,-0.008021,34.412879,-121.180191,225.182865,
+ 0.874582,-0.452003,-0.175498,33.28512,-123.248308,224.889289,
+ 0.874582,-0.452003,-0.175498,34.412879,-121.180191,225.182865,
+ 0.874582,-0.452003,-0.175498,33.508116,-123.35357,226.271684,
+ 0.888595,-0.43806,-0.136021,34.412879,-121.180191,225.182865,
+ 0.888595,-0.43806,-0.136021,34.544,-121.271763,226.334354,
+ 0.888595,-0.43806,-0.136021,33.508116,-123.35357,226.271684,
+ 0.293152,-0.948566,-0.119517,33.508116,-123.35357,226.271684,
+ 0.293152,-0.948566,-0.119517,31.410794,-123.86923,225.21998,
+ 0.293152,-0.948566,-0.119517,33.28512,-123.248308,224.889289,
+ 0.311147,-0.936577,-0.161281,33.508116,-123.35357,226.271684,
+ 0.311147,-0.936577,-0.161281,31.744224,-123.996092,226.599942,
+ 0.311147,-0.936577,-0.161281,31.410794,-123.86923,225.21998,
+ 0.008339,-0.995581,-0.09354,31.744224,-123.996092,226.599942,
+ 0.008339,-0.995581,-0.09354,29.260536,-123.951066,225.899313,
+ 0.008339,-0.995581,-0.09354,31.410794,-123.86923,225.21998,
+ -0.02932,-0.998779,0.039752,31.744224,-123.996092,226.599942,
+ -0.02932,-0.998779,0.039752,29.679453,-123.911213,227.209607,
+ -0.02932,-0.998779,0.039752,29.260536,-123.951066,225.899313,
+ -0.305398,-0.943805,0.126346,29.679453,-123.911213,227.209607,
+ -0.305398,-0.943805,0.126346,27.737893,-123.366651,226.584426,
+ -0.305398,-0.943805,0.126346,29.260536,-123.951066,225.899313,
+ -0.283064,-0.958065,0.044564,29.679453,-123.911213,227.209607,
+ -0.283064,-0.958065,0.044564,28.22952,-123.453051,227.849695,
+ -0.283064,-0.958065,0.044564,27.737893,-123.366651,226.584426,
+ -0.777084,-0.571865,0.26289,27.737893,-123.366651,226.584426,
+ -0.777084,-0.571865,0.26289,28.22952,-123.453051,227.849695,
+ -0.777084,-0.571865,0.26289,26.859598,-121.760043,227.483105,
+ -0.77416,-0.564345,0.286691,26.859598,-121.760043,227.483105,
+ -0.77416,-0.564345,0.286691,28.22952,-123.453051,227.849695,
+ -0.77416,-0.564345,0.286691,27.502424,-122.022588,228.702132,
+ -0.869458,0.108697,0.481899,26.859598,-121.760043,227.483105,
+ -0.869458,0.108697,0.481899,27.502424,-122.022588,228.702132,
+ -0.869458,0.108697,0.481899,27.308937,-119.819396,227.856084,
+ -0.898433,0.086424,0.430522,27.308937,-119.819396,227.856084,
+ -0.898433,0.086424,0.430522,27.502424,-122.022588,228.702132,
+ -0.898433,0.086424,0.430522,27.879358,-120.134877,229.109793,
+ -0.830551,0.317284,0.45773,27.308937,-119.819396,227.856084,
+ -0.830551,0.317284,0.45773,27.879358,-120.134877,229.109793,
+ -0.830551,0.317284,0.45773,28.311356,-117.667617,228.183429
+};
+static const struct gllist headroom_model_teeth_upper_half_frame = {
+ GL_N3F_V3F, GL_TRIANGLES, 6657, headroom_model_teeth_upper_half_data, 0
+};
+const struct gllist *headroom_model_teeth_upper_half = &headroom_model_teeth_upper_half_frame;
+
+static const float headroom_model_torso_cap_half_data[] = {
+ 0.003969,-0.248658,0.968583,56.198203,-21.125779,202.953597,
+ 0.003969,-0.248658,0.968583,63.807098,0.396729,208.44775,
+ 0.003969,-0.248658,0.968583,-0.001377,-10.370677,205.944988,
+ 0.00397,-0.248658,0.968583,63.807098,0.396729,208.44775,
+ 0.00397,-0.248658,0.968583,56.198203,-21.125779,202.953597,
+ 0.00397,-0.248658,0.968583,63.043071,-2.039127,207.825539,
+ 0.003969,-0.248658,0.968583,-0.001377,-10.370677,205.944988,
+ 0.003969,-0.248658,0.968583,54.984704,-22.713124,202.551062,
+ 0.003969,-0.248658,0.968583,56.198203,-21.125779,202.953597,
+ 0.003969,-0.248658,0.968583,54.984704,-22.713124,202.551062,
+ 0.003969,-0.248658,0.968583,-0.001377,-10.370677,205.944988,
+ 0.003969,-0.248658,0.968583,47.060035,-33.789908,199.739868,
+ 0.003969,-0.248658,0.968583,47.060035,-33.789908,199.739868,
+ 0.003969,-0.248658,0.968583,-0.001377,-10.370677,205.944988,
+ 0.003969,-0.248658,0.968583,45.287167,-36.657264,199.011016,
+ 0.00397,-0.248658,0.968583,54.984704,-22.713124,202.551062,
+ 0.00397,-0.248658,0.968583,47.060035,-33.789908,199.739868,
+ 0.00397,-0.248658,0.968583,52.707151,-26.116843,201.686581,
+ 0.00397,-0.248659,0.968583,30.499226,54.590084,222.496975,
+ 0.00397,-0.248659,0.968583,15.710544,58.556118,223.57576,
+ 0.00397,-0.248659,0.968583,-0.001377,-10.370677,205.944988,
+ 0.00397,-0.248658,0.968583,15.710544,58.556118,223.57576,
+ 0.00397,-0.248658,0.968583,30.499226,54.590084,222.496975,
+ 0.00397,-0.248658,0.968583,20.227251,58.260404,223.481331,
+ 0.003968,-0.248659,0.968583,0.020642,-78.961364,188.33602,
+ 0.003968,-0.248659,0.968583,21.922794,-64.839688,191.871678,
+ 0.003968,-0.248659,0.968583,-0.001377,-10.370677,205.944988,
+ 0.003946,-0.248627,0.968591,21.922794,-64.839688,191.871678,
+ 0.003946,-0.248627,0.968591,0.020642,-78.961364,188.33602,
+ 0.003946,-0.248627,0.968591,3.3862,-78.122399,188.537662,
+ 0.00397,-0.248658,0.968583,21.922794,-64.839688,191.871678,
+ 0.00397,-0.248658,0.968583,3.3862,-78.122399,188.537662,
+ 0.00397,-0.248658,0.968583,7.369323,-76.326309,188.982436,
+ 0.003969,-0.248658,0.968583,21.922794,-64.839688,191.871678,
+ 0.003969,-0.248658,0.968583,31.964186,-47.787146,196.208315,
+ 0.003969,-0.248658,0.968583,-0.001377,-10.370677,205.944988,
+ 0.00397,-0.248658,0.968583,31.964186,-47.787146,196.208315,
+ 0.00397,-0.248658,0.968583,21.922794,-64.839688,191.871678,
+ 0.00397,-0.248658,0.968583,28.090565,-54.735728,194.440325,
+ 0.003969,-0.248658,0.968583,61.819062,36.497038,217.723701,
+ 0.003969,-0.248658,0.968583,30.499226,54.590084,222.496975,
+ 0.003969,-0.248658,0.968583,-0.001377,-10.370677,205.944988,
+ 0.00397,-0.248658,0.968583,30.499226,54.590084,222.496975,
+ 0.00397,-0.248658,0.968583,61.819062,36.497038,217.723701,
+ 0.00397,-0.248658,0.968583,43.021055,50.713381,221.450414,
+ 0.00397,-0.248658,0.968583,43.021055,50.713381,221.450414,
+ 0.00397,-0.248658,0.968583,61.819062,36.497038,217.723701,
+ 0.00397,-0.248658,0.968583,46.89049,47.937302,220.72187,
+ 0.00397,-0.248659,0.968583,-0.001377,-10.370677,205.944988,
+ 0.00397,-0.248659,0.968583,1.908078,58.221846,223.546512,
+ 0.00397,-0.248659,0.968583,-0.023396,58.22001,223.553957,
+ 0.00397,-0.248659,0.968583,1.908078,58.221846,223.546512,
+ 0.00397,-0.248659,0.968583,-0.001377,-10.370677,205.944988,
+ 0.00397,-0.248659,0.968583,5.10187,58.225041,223.534243,
+ 0.00397,-0.248659,0.968583,5.10187,58.225041,223.534243,
+ 0.00397,-0.248659,0.968583,-0.001377,-10.370677,205.944988,
+ 0.00397,-0.248659,0.968583,15.710544,58.556118,223.57576,
+ 0.003969,-0.248658,0.968583,63.807098,0.396729,208.44775,
+ 0.003969,-0.248658,0.968583,61.819062,36.497038,217.723701,
+ 0.003969,-0.248658,0.968583,-0.001377,-10.370677,205.944988,
+ 0.00397,-0.248658,0.968583,61.819062,36.497038,217.723701,
+ 0.00397,-0.248658,0.968583,63.807098,0.396729,208.44775,
+ 0.00397,-0.248658,0.968583,62.196749,35.583076,217.487517,
+ 0.00397,-0.248658,0.968583,62.196749,35.583076,217.487517,
+ 0.00397,-0.248658,0.968583,63.807098,0.396729,208.44775,
+ 0.00397,-0.248658,0.968583,64.061482,28.75393,215.726671,
+ 0.00397,-0.248658,0.968583,64.061482,28.75393,215.726671,
+ 0.00397,-0.248658,0.968583,63.807098,0.396729,208.44775,
+ 0.00397,-0.248658,0.968583,66.775277,14.510687,212.058972,
+ 0.00397,-0.248658,0.968583,64.061482,28.75393,215.726671,
+ 0.00397,-0.248658,0.968583,66.775277,14.510687,212.058972,
+ 0.00397,-0.248658,0.968583,67.1428,18.30434,213.031386,
+ 0.00397,-0.248658,0.968583,67.1428,18.30434,213.031386,
+ 0.00397,-0.248658,0.968583,66.775277,14.510687,212.058972,
+ 0.00397,-0.248658,0.968583,67.518707,15.943362,212.423727,
+ 0.003969,-0.248658,0.968583,-0.001377,-10.370677,205.944988,
+ 0.003969,-0.248658,0.968583,36.964383,-40.735554,197.998133,
+ 0.003969,-0.248658,0.968583,45.287167,-36.657264,199.011016,
+ 0.003969,-0.248658,0.968583,36.964383,-40.735554,197.998133,
+ 0.003969,-0.248658,0.968583,-0.001377,-10.370677,205.944988,
+ 0.003969,-0.248658,0.968583,33.922059,-43.53251,197.292556,
+ 0.003969,-0.248658,0.968583,33.922059,-43.53251,197.292556,
+ 0.003969,-0.248658,0.968583,-0.001377,-10.370677,205.944988,
+ 0.003969,-0.248658,0.968583,31.964186,-47.787146,196.208315,
+ 0,0,-1,150.207119,63.115288,0,
+ 0,0,-1,150.921225,9.111578,0,
+ 0,0,-1,150.002536,62.976309,0,
+ 0,0,-1,150.921225,9.111578,0,
+ 0,0,-1,150.207119,63.115288,0,
+ 0,0,-1,153.458312,65.323898,0,
+ 0,0,-1,150.921225,9.111578,0,
+ 0,0,-1,153.458312,65.323898,0,
+ 0,0,-1,207.563171,51.15553,0,
+ 0,0,-1,207.563171,51.15553,0,
+ 0,0,-1,153.458312,65.323898,0,
+ 0,0,-1,161.933243,65.156803,0,
+ 0,0,-1,207.563171,51.15553,0,
+ 0,0,-1,161.933243,65.156803,0,
+ 0,0,-1,165.223158,64.536105,0,
+ 0,0,-1,165.223158,64.536105,0,
+ 0,0,-1,161.933243,65.156803,0,
+ 0,0,-1,163.067671,65.535572,0,
+ 0,0,-1,207.563171,51.15553,0,
+ 0,0,-1,165.223158,64.536105,0,
+ 0,0,-1,165.674761,64.457958,0,
+ 0,0,-1,207.563171,51.15553,0,
+ 0,0,-1,165.674761,64.457958,0,
+ 0,0,-1,178.772472,64.05198,0,
+ 0,0,-1,207.563171,51.15553,0,
+ 0,0,-1,178.772472,64.05198,0,
+ 0,0,-1,188.034553,63.191728,0,
+ 0,0,-1,207.563171,51.15553,0,
+ 0,0,-1,188.034553,63.191728,0,
+ 0,0,-1,204.782348,52.896501,0,
+ 0,0,-1,75.485633,-57.707072,0,
+ 0,0,-1,0.587015,-124.521705,0,
+ 0,0,-1,0.050042,-124.525723,0,
+ 0,0,-1,0.587015,-124.521705,0,
+ 0,0,-1,75.485633,-57.707072,0,
+ 0,0,-1,1.229377,-124.732747,0,
+ 0,0,-1,1.229377,-124.732747,0,
+ 0,0,-1,75.485633,-57.707072,0,
+ 0,0,-1,4.066516,-125.653975,0,
+ 0,0,-1,4.066516,-125.653975,0,
+ 0,0,-1,75.485633,-57.707072,0,
+ 0,0,-1,5.694128,-126.29568,0,
+ 0,0,-1,5.694128,-126.29568,0,
+ 0,0,-1,75.485633,-57.707072,0,
+ 0,0,-1,12.050246,-129.016036,0,
+ 0,0,-1,12.050246,-129.016036,0,
+ 0,0,-1,75.485633,-57.707072,0,
+ 0,0,-1,19.646402,-131.142602,0,
+ 0,0,-1,19.646402,-131.142602,0,
+ 0,0,-1,75.485633,-57.707072,0,
+ 0,0,-1,23.972417,-132.251395,0,
+ 0,0,-1,23.972417,-132.251395,0,
+ 0,0,-1,75.485633,-57.707072,0,
+ 0,0,-1,29.452586,-132.558396,0,
+ 0,0,-1,29.452586,-132.558396,0,
+ 0,0,-1,75.485633,-57.707072,0,
+ 0,0,-1,39.711401,-133.493371,0,
+ 0,0,-1,39.711401,-133.493371,0,
+ 0,0,-1,75.485633,-57.707072,0,
+ 0,0,-1,45.742661,-133.89023,0,
+ 0,0,-1,45.742661,-133.89023,0,
+ 0,0,-1,75.485633,-57.707072,0,
+ 0,0,-1,57.457346,-133.957131,0,
+ 0,0,-1,155.450647,93.987396,0,
+ 0,0,-1,150.002536,62.976309,0,
+ 0,0,-1,75.435592,66.81865,0,
+ 0,0,-1,150.002536,62.976309,0,
+ 0,0,-1,155.450647,93.987396,0,
+ 0,0,-1,150.204733,63.272971,0,
+ 0,0,-1,150.204733,63.272971,0,
+ 0,0,-1,155.450647,93.987396,0,
+ 0,0,-1,151.342326,68.242786,0,
+ 0,0,-1,151.342326,68.242786,0,
+ 0,0,-1,155.450647,93.987396,0,
+ 0,0,-1,154.364889,86.419772,0,
+ 0,0,-1,154.364889,86.419772,0,
+ 0,0,-1,155.450647,93.987396,0,
+ 0,0,-1,155.655436,92.475269,0,
+ 0,0,-1,150.921225,9.111578,0,
+ 0,0,-1,75.435592,66.81865,0,
+ 0,0,-1,150.002536,62.976309,0,
+ 0,0,-1,150.921225,9.111578,0,
+ 0,0,-1,75.485633,-57.707072,0,
+ 0,0,-1,75.435592,66.81865,0,
+ 0,0,-1,150.921225,9.111578,0,
+ 0,0,-1,131.463872,-111.874331,0,
+ 0,0,-1,75.485633,-57.707072,0,
+ 0,0,-1,131.463872,-111.874331,0,
+ 0,0,-1,150.921225,9.111578,0,
+ 0,0,-1,138.133891,-105.238479,0,
+ 0,0,-1,138.133891,-105.238479,0,
+ 0,0,-1,150.921225,9.111578,0,
+ 0,0,-1,140.218473,-102.544178,0,
+ 0,0,-1,140.218473,-102.544178,0,
+ 0,0,-1,150.921225,9.111578,0,
+ 0,0,-1,141.825295,-99.898436,0,
+ 0,0,-1,141.825295,-99.898436,0,
+ 0,0,-1,150.921225,9.111578,0,
+ 0,0,-1,148.012251,-86.380502,0,
+ 0,0,-1,148.012251,-86.380502,0,
+ 0,0,-1,150.921225,9.111578,0,
+ 0,0,-1,148.680315,-83.903278,0,
+ 0,0,-1,148.680315,-83.903278,0,
+ 0,0,-1,150.921225,9.111578,0,
+ 0,0,-1,149.219498,-80.52087,0,
+ 0,0,-1,149.219498,-80.52087,0,
+ 0,0,-1,150.921225,9.111578,0,
+ 0,0,-1,151.130171,-69.122906,0,
+ 0,0,-1,151.130171,-69.122906,0,
+ 0,0,-1,150.921225,9.111578,0,
+ 0,0,-1,151.137095,-66.281025,0,
+ 0,0,-1,151.137095,-66.281025,0,
+ 0,0,-1,150.921225,9.111578,0,
+ 0,0,-1,151.839915,-44.753154,0,
+ 0,0,-1,151.137095,-66.281025,0,
+ 0,0,-1,151.839915,-44.753154,0,
+ 0,0,-1,151.823982,-46.713735,0,
+ 0,0,-1,151.823982,-46.713735,0,
+ 0,0,-1,152.121501,-58.810145,0,
+ 0,0,-1,151.137095,-66.281025,0,
+ 0,0,-1,152.121501,-58.810145,0,
+ 0,0,-1,151.823982,-46.713735,0,
+ 0,0,-1,152.128744,-51.298572,0,
+ 0,0,-1,152.121501,-58.810145,0,
+ 0,0,-1,152.128744,-51.298572,0,
+ 0,0,-1,152.395208,-55.308366,0,
+ 0,0,-1,152.395208,-55.308366,0,
+ 0,0,-1,152.128744,-51.298572,0,
+ 0,0,-1,152.159067,-51.73768,0,
+ 0,0,-1,152.395208,-55.308366,0,
+ 0,0,-1,152.159067,-51.73768,0,
+ 0,0,-1,152.207345,-52.364349,0,
+ 0,0,-1,77.223193,135.22901,0,
+ 0,0,-1,75.435592,66.81865,0,
+ 0,0,-1,67.450715,133.353209,0,
+ 0,0,-1,75.435592,66.81865,0,
+ 0,0,-1,77.223193,135.22901,0,
+ 0,0,-1,155.450647,93.987396,0,
+ 0,0,-1,155.450647,93.987396,0,
+ 0,0,-1,77.223193,135.22901,0,
+ 0,0,-1,79.589091,135.335447,0,
+ 0,0,-1,155.450647,93.987396,0,
+ 0,0,-1,79.589091,135.335447,0,
+ 0,0,-1,81.713407,135.091701,0,
+ 0,0,-1,155.450647,93.987396,0,
+ 0,0,-1,81.713407,135.091701,0,
+ 0,0,-1,103.129583,125.47251,0,
+ 0,0,-1,103.129583,125.47251,0,
+ 0,0,-1,81.713407,135.091701,0,
+ 0,0,-1,90.433957,134.787627,0,
+ 0,0,-1,155.450647,93.987396,0,
+ 0,0,-1,103.129583,125.47251,0,
+ 0,0,-1,127.83808,113.041861,0,
+ 0,0,-1,127.83808,113.041861,0,
+ 0,0,-1,103.129583,125.47251,0,
+ 0,0,-1,112.421604,124.110477,0,
+ 0,0,-1,155.450647,93.987396,0,
+ 0,0,-1,127.83808,113.041861,0,
+ 0,0,-1,130.789841,111.077271,0,
+ 0,0,-1,155.450647,93.987396,0,
+ 0,0,-1,130.789841,111.077271,0,
+ 0,0,-1,131.944765,110.517466,0,
+ 0,0,-1,155.450647,93.987396,0,
+ 0,0,-1,131.944765,110.517466,0,
+ 0,0,-1,135.09252,108.665478,0,
+ 0,0,-1,155.450647,93.987396,0,
+ 0,0,-1,135.09252,108.665478,0,
+ 0,0,-1,154.277378,94.988173,0,
+ 0,0,-1,1.49613,124.532458,0,
+ 0,0,-1,75.435592,66.81865,0,
+ 0,0,-1,-0.050042,124.525723,0,
+ 0,0,-1,75.435592,66.81865,0,
+ 0,0,-1,1.49613,124.532458,0,
+ 0,0,-1,3.111652,125.728203,0,
+ 0,0,-1,75.435592,66.81865,0,
+ 0,0,-1,3.111652,125.728203,0,
+ 0,0,-1,14.638329,133.418312,0,
+ 0,0,-1,75.435592,66.81865,0,
+ 0,0,-1,14.638329,133.418312,0,
+ 0,0,-1,15.527348,133.939171,0,
+ 0,0,-1,75.435592,66.81865,0,
+ 0,0,-1,15.527348,133.939171,0,
+ 0,0,-1,20.575701,136.420408,0,
+ 0,0,-1,75.435592,66.81865,0,
+ 0,0,-1,20.575701,136.420408,0,
+ 0,0,-1,39.199175,145.524582,0,
+ 0,0,-1,75.435592,66.81865,0,
+ 0,0,-1,39.199175,145.524582,0,
+ 0,0,-1,43.424796,144.463113,0,
+ 0,0,-1,75.435592,66.81865,0,
+ 0,0,-1,43.424796,144.463113,0,
+ 0,0,-1,67.450715,133.353209,0,
+ 0,0,-1,75.485633,-57.707072,0,
+ 0,0,-1,71.963758,-132.684607,0,
+ 0,0,-1,57.457346,-133.957131,0,
+ 0,0,-1,71.963758,-132.684607,0,
+ 0,0,-1,75.485633,-57.707072,0,
+ 0,0,-1,75.382739,-132.411273,0,
+ 0,0,-1,75.382739,-132.411273,0,
+ 0,0,-1,75.485633,-57.707072,0,
+ 0,0,-1,77.453125,-132.02854,0,
+ 0,0,-1,77.453125,-132.02854,0,
+ 0,0,-1,75.485633,-57.707072,0,
+ 0,0,-1,131.463872,-111.874331,0,
+ 0,0,-1,77.453125,-132.02854,0,
+ 0,0,-1,131.463872,-111.874331,0,
+ 0,0,-1,87.439834,-130.119913,0,
+ 0,0,-1,87.439834,-130.119913,0,
+ 0,0,-1,131.463872,-111.874331,0,
+ 0,0,-1,91.58702,-129.083908,0,
+ 0,0,-1,91.58702,-129.083908,0,
+ 0,0,-1,131.463872,-111.874331,0,
+ 0,0,-1,92.540223,-128.815296,0,
+ 0,0,-1,92.540223,-128.815296,0,
+ 0,0,-1,131.463872,-111.874331,0,
+ 0,0,-1,94.340223,-128.253242,0,
+ 0,0,-1,94.340223,-128.253242,0,
+ 0,0,-1,131.463872,-111.874331,0,
+ 0,0,-1,103.752037,-125.320524,0,
+ 0,0,-1,103.752037,-125.320524,0,
+ 0,0,-1,131.463872,-111.874331,0,
+ 0,0,-1,108.886628,-123.622299,0,
+ 0,0,-1,108.886628,-123.622299,0,
+ 0,0,-1,131.463872,-111.874331,0,
+ 0,0,-1,111.033697,-122.830416,0,
+ 0,0,-1,111.033697,-122.830416,0,
+ 0,0,-1,131.463872,-111.874331,0,
+ 0,0,-1,114.966939,-121.192433,0,
+ 0,0,-1,114.966939,-121.192433,0,
+ 0,0,-1,131.463872,-111.874331,0,
+ 0,0,-1,116.843436,-120.377147,0,
+ 0,0,-1,116.843436,-120.377147,0,
+ 0,0,-1,131.463872,-111.874331,0,
+ 0,0,-1,123.012892,-117.284316,0,
+ 0,0,-1,123.012892,-117.284316,0,
+ 0,0,-1,131.463872,-111.874331,0,
+ 0,0,-1,124.590326,-116.50934,0,
+ 0,0,-1,124.590326,-116.50934,0,
+ 0,0,-1,131.463872,-111.874331,0,
+ 0,0,-1,125.755126,-115.869412,0,
+ 0,0,-1,224.070498,-51.204586,0,
+ 0,0,-1,151.839915,-44.753154,0,
+ 0,0,-1,150.921225,9.111578,0,
+ 0,0,-1,151.839915,-44.753154,0,
+ 0,0,-1,224.070498,-51.204586,0,
+ 0,0,-1,153.349382,-53.256822,0,
+ 0,0,-1,153.349382,-53.256822,0,
+ 0,0,-1,224.070498,-51.204586,0,
+ 0,0,-1,157.337174,-56.943471,0,
+ 0,0,-1,157.337174,-56.943471,0,
+ 0,0,-1,224.070498,-51.204586,0,
+ 0,0,-1,167.504833,-61.303848,0,
+ 0,0,-1,157.337174,-56.943471,0,
+ 0,0,-1,167.504833,-61.303848,0,
+ 0,0,-1,165.289005,-61.760633,0,
+ 0,0,-1,167.504833,-61.303848,0,
+ 0,0,-1,224.070498,-51.204586,0,
+ 0,0,-1,170.696333,-62.611043,0,
+ 0,0,-1,170.696333,-62.611043,0,
+ 0,0,-1,224.070498,-51.204586,0,
+ 0,0,-1,192.078304,-59.668988,0,
+ 0,0,-1,170.696333,-62.611043,0,
+ 0,0,-1,192.078304,-59.668988,0,
+ 0,0,-1,186.851508,-61.731005,0,
+ 0,0,-1,192.078304,-59.668988,0,
+ 0,0,-1,224.070498,-51.204586,0,
+ 0,0,-1,210.19354,-57.760699,0,
+ 0,0,-1,210.19354,-57.760699,0,
+ 0,0,-1,224.070498,-51.204586,0,
+ 0,0,-1,219.293165,-55.435669,0,
+ 0,0,-1,219.293165,-55.435669,0,
+ 0,0,-1,224.070498,-51.204586,0,
+ 0,0,-1,220.116809,-55.190143,0,
+ 0,0,-1,207.563171,51.15553,0,
+ 0,0,-1,246.309767,-12.139518,0,
+ 0,0,-1,150.921225,9.111578,0,
+ 0,0,-1,246.309767,-12.139518,0,
+ 0,0,-1,207.563171,51.15553,0,
+ 0,0,-1,208.16679,50.25522,0,
+ 0,0,-1,246.309767,-12.139518,0,
+ 0,0,-1,208.16679,50.25522,0,
+ 0,0,-1,216.018247,40.946641,0,
+ 0,0,-1,246.309767,-12.139518,0,
+ 0,0,-1,216.018247,40.946641,0,
+ 0,0,-1,216.92885,39.56057,0,
+ 0,0,-1,246.309767,-12.139518,0,
+ 0,0,-1,216.92885,39.56057,0,
+ 0,0,-1,219.1715,36.684119,0,
+ 0,0,-1,246.309767,-12.139518,0,
+ 0,0,-1,219.1715,36.684119,0,
+ 0,0,-1,223.28383,30.550361,0,
+ 0,0,-1,246.309767,-12.139518,0,
+ 0,0,-1,223.28383,30.550361,0,
+ 0,0,-1,229.665662,22.764775,0,
+ 0,0,-1,246.309767,-12.139518,0,
+ 0,0,-1,229.665662,22.764775,0,
+ 0,0,-1,241.236757,-1.140618,0,
+ 0,0,-1,241.236757,-1.140618,0,
+ 0,0,-1,229.665662,22.764775,0,
+ 0,0,-1,231.726207,20.186471,0,
+ 0,0,-1,241.236757,-1.140618,0,
+ 0,0,-1,231.726207,20.186471,0,
+ 0,0,-1,232.399568,19.415702,0,
+ 0,0,-1,246.309767,-12.139518,0,
+ 0,0,-1,224.070498,-51.204586,0,
+ 0,0,-1,150.921225,9.111578,0,
+ 0,0,-1,224.070498,-51.204586,0,
+ 0,0,-1,246.309767,-12.139518,0,
+ 0,0,-1,236.771292,-40.024171,0,
+ 0,0,-1,236.771292,-40.024171,0,
+ 0,0,-1,246.309767,-12.139518,0,
+ 0,0,-1,242.010925,-26.520454,0,
+ 0,0,-1,75.435592,66.81865,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,-0.050042,124.525723,0,
+ 0,0,-1,75.485633,-57.707072,0,
+ 0,0,-1,0.050042,-124.525723,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,75.485633,-57.707072,0,
+ 0,0,-1,0,0,0,
+ 0,0,-1,75.435592,66.81865,0
+};
+static const struct gllist headroom_model_torso_cap_half_frame = {
+ GL_N3F_V3F, GL_TRIANGLES, 405, headroom_model_torso_cap_half_data, 0
+};
+const struct gllist *headroom_model_torso_cap_half = &headroom_model_torso_cap_half_frame;
+
+static const float headroom_model_torso_half_data[] = {
+ -0.013527,-0.869125,0.494408,43.459057,-106.625244,53.743378,
+ -0.013527,-0.869125,0.494408,36.139489,-111.117628,45.645908,
+ -0.013527,-0.869125,0.494408,50.553261,-117.746626,34.387099,
+ 0.749316,-0.288702,0.595967,149.058914,107.436044,25.579787,
+ 0.749316,-0.288702,0.595967,149.841951,74.644847,8.710371,
+ 0.749316,-0.288702,0.595967,152.702693,94.708882,14.83306,
+ 0.445105,0.780549,-0.438891,136.916842,116.010101,59.965479,
+ 0.445105,0.780549,-0.438891,163.688951,95.799792,51.173477,
+ 0.445105,0.780549,-0.438891,162.520739,84.045831,29.084806,
+ 0.891417,0.398753,0.215343,128.835805,130.404078,66.763611,
+ 0.891417,0.398753,0.215343,136.916842,116.010101,59.965479,
+ 0.891417,0.398753,0.215343,149.058914,107.436044,25.579787,
+ 0.239231,0.967897,-0.077092,66.285493,142.67377,36.184276,
+ 0.239231,0.967897,-0.077092,69.818746,140.726385,22.699052,
+ 0.239231,0.967897,-0.077092,40.879849,147.684705,20.258601,
+ -0.156673,-0.867801,0.471566,25.971265,-126.930075,12.041273,
+ -0.156673,-0.867801,0.471566,14.772368,-125.86523,10.28014,
+ -0.156673,-0.867801,0.471566,22.036768,-130.482192,4.197275,
+ 0.486826,-0.299499,0.820549,177.169525,16.252385,130.34006,
+ 0.486826,-0.299499,0.820549,158.752306,10.392192,139.127895,
+ 0.486826,-0.299499,0.820549,169.243745,3.164372,130.265258,
+ 0.905214,-0.414303,-0.094558,148.012251,-86.380502,0,
+ 0.905214,-0.414303,-0.094558,146.14974,-92.595069,9.398895,
+ 0.905214,-0.414303,-0.094558,141.825295,-99.898436,0,
+ 0.23668,0.967647,-0.087414,155.861601,100.501208,93.722334,
+ 0.23668,0.967647,-0.087414,165.432078,94.233721,50.255994,
+ 0.23668,0.967647,-0.087414,142.774725,103.142366,87.525522,
+ 0.214402,-0.887012,0.408951,104.2944,-110.512296,35.424632,
+ 0.214402,-0.887012,0.408951,105.034438,-122.745505,8.502923,
+ 0.214402,-0.887012,0.408951,116.667881,-115.944921,17.154236,
+ 0.71931,0.633104,0.285959,142.774725,103.142366,87.525522,
+ 0.71931,0.633104,0.285959,165.432078,94.233721,50.255994,
+ 0.71931,0.633104,0.285959,163.688951,95.799792,51.173477,
+ 0.074491,-0.931772,0.355319,65.84113,-126.498597,17.505474,
+ 0.074491,-0.931772,0.355319,71.963758,-132.684607,0,
+ 0.074491,-0.931772,0.355319,75.382739,-132.411273,0,
+ 0.074491,-0.931772,0.355319,71.963758,-132.684607,0,
+ 0.074491,-0.931772,0.355319,65.84113,-126.498597,17.505474,
+ 0.074491,-0.931772,0.355319,48.408947,-128.9394,14.759421,
+ 0.688663,0.721397,0.073003,151.545384,98.52635,39.72718,
+ 0.688663,0.721397,0.073003,149.821633,100.871258,32.816167,
+ 0.688663,0.721397,0.073003,147.999053,102.400314,34.899471,
+ 0.509927,0.860138,-0.011748,155.861601,100.501208,93.722334,
+ 0.509927,0.860138,-0.011748,181.806405,84.444991,44.3019,
+ 0.509927,0.860138,-0.011748,165.432078,94.233721,50.255994,
+ 0.429686,0.899124,0.083338,125.546595,110.007715,102.283342,
+ 0.429686,0.899124,0.083338,142.774725,103.142366,87.525522,
+ 0.429686,0.899124,0.083338,140.753341,104.201144,86.524614,
+ 0.02831,0.913341,-0.40621,170.47368,68.64792,9.755366,
+ 0.02831,0.913341,-0.40621,178.772472,64.05198,0,
+ 0.02831,0.913341,-0.40621,165.674761,64.457958,0,
+ 0.254594,0.958689,-0.126877,116.501785,135.296684,74.760313,
+ 0.254594,0.958689,-0.126877,124.043444,129.590737,46.779075,
+ 0.254594,0.958689,-0.126877,103.760489,136.482348,58.152315,
+ 0.46415,0.771528,-0.435098,163.688951,95.799792,51.173477,
+ 0.46415,0.771528,-0.435098,165.432078,94.233721,50.255994,
+ 0.46415,0.771528,-0.435098,162.520739,84.045831,29.084806,
+ 0.267714,0.795288,-0.543918,162.520739,84.045831,29.084806,
+ 0.267714,0.795288,-0.543918,164.573155,83.090394,28.698008,
+ 0.267714,0.795288,-0.543918,167.942068,69.344496,10.257661,
+ -0.183828,0.814202,0.550711,92.803323,128.952007,84.235509,
+ -0.183828,0.814202,0.550711,97.51367,133.222408,79.494229,
+ -0.183828,0.814202,0.550711,92.506364,136.25497,73.339275,
+ 0.101002,-0.836485,0.538601,106.419447,-85.05347,77.157647,
+ 0.101002,-0.836485,0.538601,86.543936,-91.477775,70.907447,
+ 0.101002,-0.836485,0.538601,102.4835,-97.594974,58.417899,
+ -0.094227,-0.917033,0.387519,20.070488,-110.796237,45.429739,
+ -0.094227,-0.917033,0.387519,15.031408,-112.729518,39.629511,
+ -0.094227,-0.917033,0.387519,26.524227,-113.760114,39.985207,
+ 0.790262,-0.611426,0.040539,138.133891,-105.238479,0,
+ 0.790262,-0.611426,0.040539,143.244049,-97.117407,22.868325,
+ 0.790262,-0.611426,0.040539,135.233433,-108.33085,9.900609,
+ 0.790262,-0.611426,0.040539,143.244049,-97.117407,22.868325,
+ 0.790262,-0.611426,0.040539,138.133891,-105.238479,0,
+ 0.790262,-0.611426,0.040539,140.218473,-102.544178,0,
+ 0.361062,0.782596,-0.507128,162.520739,84.045831,29.084806,
+ 0.361062,0.782596,-0.507128,167.942068,69.344496,10.257661,
+ 0.361062,0.782596,-0.507128,154.217113,76.043004,10.822936,
+ -0.264308,0.652538,-0.710166,149.841951,74.644847,8.710371,
+ -0.264308,0.652538,-0.710166,147.999053,102.400314,34.899471,
+ -0.264308,0.652538,-0.710166,149.821633,100.871258,32.816167,
+ 0.994766,-0.026952,0.098565,149.058914,107.436044,25.579787,
+ 0.994766,-0.026952,0.098565,147.999053,102.400314,34.899471,
+ 0.994766,-0.026952,0.098565,149.841951,74.644847,8.710371,
+ 0.536465,0.821192,-0.194547,128.835805,130.404078,66.763611,
+ 0.536465,0.821192,-0.194547,149.058914,107.436044,25.579787,
+ 0.536465,0.821192,-0.194547,145.507447,107.536704,16.211464,
+ 0.027678,0.87002,0.492239,104.729191,128.40166,87.609044,
+ 0.027678,0.87002,0.492239,116.501785,135.296684,74.760313,
+ 0.027678,0.87002,0.492239,97.51367,133.222408,79.494229,
+ 0.752494,0.658138,-0.024648,136.916842,116.010101,59.965479,
+ 0.752494,0.658138,-0.024648,151.545384,98.52635,39.72718,
+ 0.752494,0.658138,-0.024648,147.999053,102.400314,34.899471,
+ -0.257857,-0.921074,0.291775,22.036768,-130.482192,4.197275,
+ -0.257857,-0.921074,0.291775,12.050246,-129.016036,0,
+ -0.257857,-0.921074,0.291775,19.646402,-131.142602,0,
+ -0.257857,-0.921074,0.291775,12.050246,-129.016036,0,
+ -0.257857,-0.921074,0.291775,22.036768,-130.482192,4.197275,
+ -0.257857,-0.921074,0.291775,11.425039,-128.080282,2.401454,
+ 0.577274,0.804032,-0.142433,99.813994,137.20697,22.831602,
+ 0.577274,0.804032,-0.142433,127.83808,113.041861,0,
+ 0.577274,0.804032,-0.142433,112.421604,124.110477,0,
+ 0.088056,-0.836255,0.541225,43.459057,-106.625244,53.743378,
+ 0.088056,-0.836255,0.541225,62.838751,-113.53807,39.909242,
+ 0.088056,-0.836255,0.541225,75.705774,-108.476255,45.636897,
+ 0.372925,-0.848189,0.376167,129.702832,-95.556067,52.525623,
+ 0.372925,-0.848189,0.376167,127.481673,-107.995583,26.678751,
+ 0.372925,-0.848189,0.376167,138.952973,-97.865729,38.147334,
+ 0.502779,-0.309085,0.807267,183.423791,9.845405,123.991707,
+ 0.502779,-0.309085,0.807267,177.169525,16.252385,130.34006,
+ 0.502779,-0.309085,0.807267,169.243745,3.164372,130.265258,
+ 0.160786,0.985533,0.053598,43.105366,146.08214,43.049651,
+ 0.160786,0.985533,0.053598,66.285493,142.67377,36.184276,
+ 0.160786,0.985533,0.053598,40.879849,147.684705,20.258601,
+ 0.83908,0.521051,0.156366,136.916842,116.010101,59.965479,
+ 0.83908,0.521051,0.156366,162.520739,84.045831,29.084806,
+ 0.83908,0.521051,0.156366,151.545384,98.52635,39.72718,
+ 0.309465,-0.836373,0.452452,194.042044,-29.310002,111.224075,
+ 0.309465,-0.836373,0.452452,192.246759,-31.464258,108.469786,
+ 0.309465,-0.836373,0.452452,212.790998,-43.18861,72.745222,
+ 0.152075,0.878822,-0.452267,167.942068,69.344496,10.257661,
+ 0.152075,0.878822,-0.452267,165.674761,64.457958,0,
+ 0.152075,0.878822,-0.452267,165.223158,64.536105,0,
+ 0.152075,0.878822,-0.452267,165.674761,64.457958,0,
+ 0.152075,0.878822,-0.452267,167.942068,69.344496,10.257661,
+ 0.152075,0.878822,-0.452267,170.47368,68.64792,9.755366,
+ 0.338207,-0.937069,-0.086701,203.261353,-59.961003,32.909476,
+ 0.338207,-0.937069,-0.086701,195.681847,-60.614676,10.407845,
+ 0.338207,-0.937069,-0.086701,217.279273,-54.026391,23.449491,
+ 0.373554,-0.927523,0.012612,181.474493,-68.485956,51.263879,
+ 0.373554,-0.927523,0.012612,178.483892,-69.975679,30.284248,
+ 0.373554,-0.927523,0.012612,203.261353,-59.961003,32.909476,
+ 0.097255,-0.719783,0.687352,81.659009,-49.753905,127.852615,
+ 0.097255,-0.719783,0.687352,73.309923,-64.919561,113.152737,
+ 0.097255,-0.719783,0.687352,96.959891,-55.539496,119.629086,
+ 0.736975,-0.328258,0.59086,192.246759,-31.464258,108.469786,
+ 0.736975,-0.328258,0.59086,175.975003,-44.517327,121.51366,
+ 0.736975,-0.328258,0.59086,204.926966,-54.828599,79.673579,
+ -0.144094,-0.772585,0.618344,26.084822,-124.765449,14.772308,
+ -0.144094,-0.772585,0.618344,25.971265,-126.930075,12.041273,
+ -0.144094,-0.772585,0.618344,48.408947,-128.9394,14.759421,
+ 0.094146,-0.863918,0.494754,69.322309,-96.976036,66.932787,
+ 0.094146,-0.863918,0.494754,59.210725,-102.798882,58.689297,
+ 0.094146,-0.863918,0.494754,75.705774,-108.476255,45.636897,
+ 0.791683,0.399944,0.461826,171.599188,61.747878,116.396143,
+ 0.791683,0.399944,0.461826,185.705565,38.127994,112.669336,
+ 0.791683,0.399944,0.461826,206.903022,41.525802,73.389175,
+ -0.085621,-0.920517,0.381204,16.230028,-108.855912,49.252567,
+ -0.085621,-0.920517,0.381204,15.031408,-112.729518,39.629511,
+ -0.085621,-0.920517,0.381204,20.070488,-110.796237,45.429739,
+ -0.400587,0.895471,0.194065,17.156982,126.446608,96.085464,
+ -0.400587,0.895471,0.194065,42.650154,145.117033,62.557569,
+ -0.400587,0.895471,0.194065,15.812822,129.807229,77.804022,
+ -0.436929,0.898843,0.034272,42.650154,145.117033,62.557569,
+ -0.436929,0.898843,0.034272,43.105366,146.08214,43.049651,
+ -0.436929,0.898843,0.034272,14.479431,131.478945,61.09574,
+ 0.079357,-0.87005,0.486534,62.838751,-113.53807,39.909242,
+ 0.079357,-0.87005,0.486534,50.553261,-117.746626,34.387099,
+ 0.079357,-0.87005,0.486534,79.483429,-121.900018,22.241038,
+ 0.231209,0.753077,0.615968,125.546595,110.007715,102.283342,
+ 0.231209,0.753077,0.615968,116.501785,135.296684,74.760313,
+ 0.231209,0.753077,0.615968,104.729191,128.40166,87.609044,
+ 0.036372,-0.912656,0.407108,26.560488,-102.028779,65.98362,
+ 0.036372,-0.912656,0.407108,27.157495,-105.803002,57.469217,
+ 0.036372,-0.912656,0.407108,34.947907,-103.927924,60.976755,
+ 0.421249,0.875947,0.235086,86.877537,123.240669,120.822424,
+ 0.421249,0.875947,0.235086,117.401057,108.744354,120.141845,
+ 0.421249,0.875947,0.235086,118.521392,112.445078,104.345135,
+ 0.115446,-0.862102,0.49341,102.4835,-97.594974,58.417899,
+ 0.115446,-0.862102,0.49341,88.935171,-103.211161,51.775088,
+ 0.115446,-0.862102,0.49341,104.2944,-110.512296,35.424632,
+ 0.136429,-0.82441,0.549304,69.81846,-87.629517,80.837074,
+ 0.136429,-0.82441,0.549304,69.322309,-96.976036,66.932787,
+ 0.136429,-0.82441,0.549304,86.543936,-91.477775,70.907447,
+ 0.286149,0.931154,0.225988,97.51367,133.222408,79.494229,
+ 0.286149,0.931154,0.225988,103.760489,136.482348,58.152315,
+ 0.286149,0.931154,0.225988,92.506364,136.25497,73.339275,
+ 0.00575,-0.914043,0.405576,26.560488,-102.028779,65.98362,
+ 0.00575,-0.914043,0.405576,18.608729,-105.707424,57.805824,
+ 0.00575,-0.914043,0.405576,27.157495,-105.803002,57.469217,
+ 0.135814,-0.834667,0.533746,67.758471,-79.75432,93.676406,
+ 0.135814,-0.834667,0.533746,69.81846,-87.629517,80.837074,
+ 0.135814,-0.834667,0.533746,85.871599,-82.864959,84.20305,
+ 0.521557,0.853215,0.001809,118.521392,112.445078,104.345135,
+ 0.521557,0.853215,0.001809,99.050894,124.374169,91.572271,
+ 0.521557,0.853215,0.001809,84.355082,133.349039,95.557493,
+ 0.731561,0.675241,0.094165,66.285493,142.67377,36.184276,
+ 0.731561,0.675241,0.094165,68.900561,139.929916,35.543714,
+ 0.731561,0.675241,0.094165,69.818746,140.726385,22.699052,
+ 0.003077,-0.938712,0.344688,18.608729,-105.707424,57.805824,
+ 0.003077,-0.938712,0.344688,16.230028,-108.855912,49.252567,
+ 0.003077,-0.938712,0.344688,27.157495,-105.803002,57.469217,
+ 0.907763,0.351283,0.229275,206.903022,41.525802,73.389175,
+ 0.907763,0.351283,0.229275,207.421119,39.802471,73.978287,
+ 0.907763,0.351283,0.229275,216.559403,38.639544,39.579127,
+ -0.053677,0.996874,0.057977,68.900561,139.929916,35.543714,
+ -0.053677,0.996874,0.057977,74.209443,140.955622,22.822495,
+ -0.053677,0.996874,0.057977,69.818746,140.726385,22.699052,
+ 0.723039,-0.04474,0.689357,188.631026,7.319585,109.885688,
+ 0.723039,-0.04474,0.689357,179.068654,-1.958576,119.313116,
+ 0.723039,-0.04474,0.689357,190.782569,6.585408,107.581371,
+ 0.061918,-0.855436,0.514194,43.459057,-106.625244,53.743378,
+ 0.061918,-0.855436,0.514194,50.553261,-117.746626,34.387099,
+ 0.061918,-0.855436,0.514194,62.838751,-113.53807,39.909242,
+ 0.449815,0.724635,-0.522083,151.545384,98.52635,39.72718,
+ 0.449815,0.724635,-0.522083,162.520739,84.045831,29.084806,
+ 0.449815,0.724635,-0.522083,154.217113,76.043004,10.822936,
+ 0.230275,0.958173,-0.169934,103.760489,136.482348,58.152315,
+ 0.230275,0.958173,-0.169934,124.043444,129.590737,46.779075,
+ 0.230275,0.958173,-0.169934,115.512951,129.151215,32.741269,
+ -0.117582,0.933181,0.339629,5.021595,60.165404,218.799389,
+ -0.117582,0.933181,0.339629,22.093586,67.839273,203.624734,
+ -0.117582,0.933181,0.339629,4.833566,65.392176,204.372944,
+ 0.307043,0.840385,-0.446629,165.432078,94.233721,50.255994,
+ 0.307043,0.840385,-0.446629,164.573155,83.090394,28.698008,
+ 0.307043,0.840385,-0.446629,162.520739,84.045831,29.084806,
+ 0.473095,-0.555165,0.684085,179.068654,-1.958576,119.313116,
+ 0.473095,-0.555165,0.684085,169.243745,3.164372,130.265258,
+ 0.473095,-0.555165,0.684085,145.930442,-7.139309,138.026218,
+ 0.303283,0.946385,-0.111245,116.501785,135.296684,74.760313,
+ 0.303283,0.946385,-0.111245,128.835805,130.404078,66.763611,
+ 0.303283,0.946385,-0.111245,124.043444,129.590737,46.779075,
+ 0.577135,0.798567,-0.170899,128.835805,130.404078,66.763611,
+ 0.577135,0.798567,-0.170899,145.507447,107.536704,16.211464,
+ 0.577135,0.798567,-0.170899,124.043444,129.590737,46.779075,
+ 0.148813,-0.857083,0.493218,102.4835,-97.594974,58.417899,
+ 0.148813,-0.857083,0.493218,104.2944,-110.512296,35.424632,
+ 0.148813,-0.857083,0.493218,116.524655,-103.780363,43.432864,
+ 0.650639,-0.513615,0.559346,149.821633,100.871258,32.816167,
+ 0.650639,-0.513615,0.559346,147.266579,73.407027,10.569463,
+ 0.650639,-0.513615,0.559346,149.841951,74.644847,8.710371,
+ 0.142026,0.969598,-0.199269,80.575531,147.504688,59.226183,
+ 0.142026,0.969598,-0.199269,99.813994,137.20697,22.831602,
+ 0.142026,0.969598,-0.199269,74.209443,140.955622,22.822495,
+ 0.043692,-0.918161,0.393792,34.947907,-103.927924,60.976755,
+ 0.043692,-0.918161,0.393792,27.157495,-105.803002,57.469217,
+ 0.043692,-0.918161,0.393792,43.459057,-106.625244,53.743378,
+ 0.130367,0.889386,-0.438174,74.209443,140.955622,22.822495,
+ 0.130367,0.889386,-0.438174,112.421604,124.110477,0,
+ 0.130367,0.889386,-0.438174,103.129583,125.47251,0,
+ 0.130367,0.889386,-0.438174,112.421604,124.110477,0,
+ 0.130367,0.889386,-0.438174,74.209443,140.955622,22.822495,
+ 0.130367,0.889386,-0.438174,99.813994,137.20697,22.831602,
+ 0.435693,0.897416,0.0694,142.774725,103.142366,87.525522,
+ 0.435693,0.897416,0.0694,163.688951,95.799792,51.173477,
+ 0.435693,0.897416,0.0694,140.753341,104.201144,86.524614,
+ -0.400914,0.911298,-0.093834,80.575531,147.504688,59.226183,
+ -0.400914,0.911298,-0.093834,74.209443,140.955622,22.822495,
+ -0.400914,0.911298,-0.093834,68.900561,139.929916,35.543714,
+ 0.074596,-0.873861,0.480418,46.810397,-99.045322,68.266135,
+ 0.074596,-0.873861,0.480418,26.560488,-102.028779,65.98362,
+ 0.074596,-0.873861,0.480418,46.211175,-101.467936,63.952542,
+ 0.630745,0.173711,0.756297,190.782569,6.585408,107.581371,
+ 0.630745,0.173711,0.756297,179.068654,-1.958576,119.313116,
+ 0.630745,0.173711,0.756297,181.847963,-2.756465,117.17846,
+ 0.729236,-0.058883,0.681724,188.631026,7.319585,109.885688,
+ 0.729236,-0.058883,0.681724,169.243745,3.164372,130.265258,
+ 0.729236,-0.058883,0.681724,179.068654,-1.958576,119.313116,
+ -0.119039,0.793672,0.596586,99.050894,124.374169,91.572271,
+ -0.119039,0.793672,0.596586,97.51367,133.222408,79.494229,
+ -0.119039,0.793672,0.596586,92.803323,128.952007,84.235509,
+ 0.607956,0.693108,0.387287,127.476067,107.387912,103.943027,
+ 0.607956,0.693108,0.387287,142.774725,103.142366,87.525522,
+ 0.607956,0.693108,0.387287,125.546595,110.007715,102.283342,
+ 0.238551,-0.527799,0.815182,117.854117,-39.131687,124.138113,
+ 0.238551,-0.527799,0.815182,81.659009,-49.753905,127.852615,
+ 0.238551,-0.527799,0.815182,96.959891,-55.539496,119.629086,
+ 0.518314,-0.787938,0.332423,169.243745,3.164372,130.265258,
+ 0.518314,-0.787938,0.332423,188.631026,7.319585,109.885688,
+ 0.518314,-0.787938,0.332423,183.423791,9.845405,123.991707,
+ 0.166923,-0.902964,0.39597,79.483429,-121.900018,22.241038,
+ 0.166923,-0.902964,0.39597,75.382739,-132.411273,0,
+ 0.166923,-0.902964,0.39597,77.453125,-132.02854,0,
+ 0.166923,-0.902964,0.39597,75.382739,-132.411273,0,
+ 0.166923,-0.902964,0.39597,79.483429,-121.900018,22.241038,
+ 0.166923,-0.902964,0.39597,65.84113,-126.498597,17.505474,
+ 0.080695,-0.79648,0.599256,110.397694,-31.863112,134.802966,
+ 0.080695,-0.79648,0.599256,117.854117,-39.131687,124.138113,
+ 0.080695,-0.79648,0.599256,155.139177,-30.981158,129.950355,
+ 0.486474,-0.721473,0.492767,142.024704,-58.622404,104.651414,
+ 0.486474,-0.721473,0.492767,155.767324,-69.699221,74.866411,
+ 0.486474,-0.721473,0.492767,181.474493,-68.485956,51.263879,
+ 0.271937,-0.876041,0.39825,129.702832,-95.556067,52.525623,
+ 0.271937,-0.876041,0.39825,116.524655,-103.780363,43.432864,
+ 0.271937,-0.876041,0.39825,127.481673,-107.995583,26.678751,
+ 0.583808,-0.802263,0.124669,138.952973,-97.865729,38.147334,
+ 0.583808,-0.802263,0.124669,127.481673,-107.995583,26.678751,
+ 0.583808,-0.802263,0.124669,143.244049,-97.117407,22.868325,
+ 0.192376,-0.962072,0.193415,43.487052,-38.097247,192.799619,
+ 0.192376,-0.962072,0.193415,21.013271,-47.658919,167.591662,
+ 0.192376,-0.962072,0.193415,35.203952,-44.177944,170.792048,
+ 0.867904,-0.47717,0.138027,66.873983,15.726958,190.687345,
+ 0.867904,-0.47717,0.138027,56.866376,-3.606718,186.776537,
+ 0.867904,-0.47717,0.138027,59.704893,-3.212465,170.291109,
+ -0.003938,-0.983866,0.178863,142.024704,-58.622404,104.651414,
+ -0.003938,-0.983866,0.178863,181.474493,-68.485956,51.263879,
+ -0.003938,-0.983866,0.178863,177.907221,-60.586829,94.635844,
+ 0.810551,-0.226014,0.540301,192.246759,-31.464258,108.469786,
+ 0.810551,-0.226014,0.540301,204.926966,-54.828599,79.673579,
+ 0.810551,-0.226014,0.540301,212.790998,-43.18861,72.745222,
+ 0.43101,-0.760499,0.485666,175.975003,-44.517327,121.51366,
+ 0.43101,-0.760499,0.485666,177.907221,-60.586829,94.635844,
+ 0.43101,-0.760499,0.485666,204.926966,-54.828599,79.673579,
+ 0.103932,-0.986618,-0.125632,195.681847,-60.614676,10.407845,
+ 0.103932,-0.986618,-0.125632,192.078304,-59.668988,0,
+ 0.103932,-0.986618,-0.125632,210.19354,-57.760699,0,
+ -0.102749,-0.938594,0.32937,25.81744,-65.922176,119.061775,
+ -0.102749,-0.938594,0.32937,7.283371,-67.124654,109.853326,
+ -0.102749,-0.938594,0.32937,41.240997,-72.464919,105.228608,
+ 0.235229,-0.804349,0.545609,73.309923,-64.919561,113.152737,
+ 0.235229,-0.804349,0.545609,67.758471,-79.75432,93.676406,
+ 0.235229,-0.804349,0.545609,90.833988,-65.807164,104.289034,
+ -0.238213,-0.929402,0.281898,22.036768,-130.482192,4.197275,
+ -0.238213,-0.929402,0.281898,19.646402,-131.142602,0,
+ -0.238213,-0.929402,0.281898,23.972417,-132.251395,0,
+ 0.429639,-0.762178,0.484247,194.042044,-29.310002,111.224075,
+ 0.429639,-0.762178,0.484247,212.790998,-43.18861,72.745222,
+ 0.429639,-0.762178,0.484247,215.775802,-40.787112,73.876839,
+ 0.356284,-0.219599,0.908206,177.440582,-25.202967,122.598769,
+ 0.356284,-0.219599,0.908206,155.139177,-30.981158,129.950355,
+ 0.356284,-0.219599,0.908206,157.380863,-32.995219,128.583965,
+ 0.386261,-0.53315,0.752698,177.440582,-25.202967,122.598769,
+ 0.386261,-0.53315,0.752698,174.23283,-24.11532,125.015288,
+ 0.386261,-0.53315,0.752698,155.139177,-30.981158,129.950355,
+ 0.659157,-0.712116,0.241669,230.123336,-25.312636,80.341658,
+ 0.659157,-0.712116,0.241669,215.775802,-40.787112,73.876839,
+ 0.659157,-0.712116,0.241669,220.906514,-52.875443,24.262523,
+ 0.46108,-0.670383,0.581371,199.912194,-15.002224,116.190826,
+ 0.46108,-0.670383,0.581371,215.775802,-40.787112,73.876839,
+ 0.46108,-0.670383,0.581371,230.123336,-25.312636,80.341658,
+ -0.146572,-0.730555,0.666938,175.527666,-12.841987,125.194056,
+ -0.146572,-0.730555,0.666938,192.246759,-31.464258,108.469786,
+ -0.146572,-0.730555,0.666938,194.042044,-29.310002,111.224075,
+ 0.513826,-0.072573,0.854819,175.527666,-12.841987,125.194056,
+ 0.513826,-0.072573,0.854819,172.148849,-11.959811,127.299935,
+ 0.513826,-0.072573,0.854819,174.23283,-24.11532,125.015288,
+ 0.106479,0.806422,-0.581675,164.573155,83.090394,28.698008,
+ 0.106479,0.806422,-0.581675,170.47368,68.64792,9.755366,
+ 0.106479,0.806422,-0.581675,167.942068,69.344496,10.257661,
+ -0.075898,0.98876,0.128816,97.51367,133.222408,79.494229,
+ -0.075898,0.98876,0.128816,116.501785,135.296684,74.760313,
+ -0.075898,0.98876,0.128816,103.760489,136.482348,58.152315,
+ 0.252833,-0.741545,0.62144,81.659009,-49.753905,127.852615,
+ 0.252833,-0.741545,0.62144,57.383502,-60.402598,125.022361,
+ 0.252833,-0.741545,0.62144,73.309923,-64.919561,113.152737,
+ 0.202038,0.221086,0.954097,200.444338,7.735201,110.809372,
+ 0.202038,0.221086,0.954097,181.847963,-2.756465,117.17846,
+ 0.202038,0.221086,0.954097,199.912194,-15.002224,116.190826,
+ 0.192739,-0.850295,0.489745,116.766516,-91.579114,64.5215,
+ 0.192739,-0.850295,0.489745,116.524655,-103.780363,43.432864,
+ 0.192739,-0.850295,0.489745,129.702832,-95.556067,52.525623,
+ 0.118889,-0.855808,0.503446,75.705774,-108.476255,45.636897,
+ 0.118889,-0.855808,0.503446,92.152494,-116.433197,28.22701,
+ 0.118889,-0.855808,0.503446,104.2944,-110.512296,35.424632,
+ -0.005413,-0.947775,0.318895,48.408947,-128.9394,14.759421,
+ -0.005413,-0.947775,0.318895,45.742661,-133.89023,0,
+ -0.005413,-0.947775,0.318895,57.457346,-133.957131,0,
+ 0.339104,0.9087,0.24346,42.639133,141.276971,88.508698,
+ 0.339104,0.9087,0.24346,63.313946,139.551927,66.150373,
+ 0.339104,0.9087,0.24346,62.256076,142.760349,55.648592,
+ 0.093594,-0.882278,0.461331,57.383502,-60.402598,125.022361,
+ 0.093594,-0.882278,0.461331,41.240997,-72.464919,105.228608,
+ 0.093594,-0.882278,0.461331,73.309923,-64.919561,113.152737,
+ 0.251203,-0.86363,0.437081,142.024704,-58.622404,104.651414,
+ 0.251203,-0.86363,0.437081,147.243849,-73.593705,72.069973,
+ 0.251203,-0.86363,0.437081,155.767324,-69.699221,74.866411,
+ 0.889642,-0.296309,-0.347475,21.013271,-47.658919,167.591662,
+ 0.889642,-0.296309,-0.347475,15.073936,-57.978833,161.185464,
+ 0.889642,-0.296309,-0.347475,11.141954,-52.178364,146.172039,
+ 0.654603,-0.750008,0.094775,56.866376,-3.606718,186.776537,
+ 0.654603,-0.750008,0.094775,47.824512,-15.831453,152.48677,
+ 0.654603,-0.750008,0.094775,59.704893,-3.212465,170.291109,
+ 0.031685,-0.775188,0.630936,41.279655,-78.872497,96.078101,
+ 0.031685,-0.775188,0.630936,27.875894,-83.27462,91.342634,
+ 0.031685,-0.775188,0.630936,38.257721,-89.224519,83.511038,
+ 0.081352,-0.927386,0.365155,48.408947,-128.9394,14.759421,
+ 0.081352,-0.927386,0.365155,57.457346,-133.957131,0,
+ 0.081352,-0.927386,0.365155,71.963758,-132.684607,0,
+ -0.062038,-0.942825,0.327464,48.408947,-128.9394,14.759421,
+ -0.062038,-0.942825,0.327464,39.711401,-133.493371,0,
+ -0.062038,-0.942825,0.327464,45.742661,-133.89023,0,
+ -0.062038,-0.942825,0.327464,39.711401,-133.493371,0,
+ -0.062038,-0.942825,0.327464,48.408947,-128.9394,14.759421,
+ -0.062038,-0.942825,0.327464,36.147209,-130.968023,6.595675,
+ 0.135303,-0.75321,0.643714,115.891218,-66.266697,99.341177,
+ 0.135303,-0.75321,0.643714,67.758471,-79.75432,93.676406,
+ 0.135303,-0.75321,0.643714,107.586161,-74.352147,91.626047,
+ -0.114222,-0.895876,0.429372,26.524227,-113.760114,39.985207,
+ -0.114222,-0.895876,0.429372,27.836824,-119.656231,28.032254,
+ -0.114222,-0.895876,0.429372,38.929794,-120.106955,30.04279,
+ -0.189006,-0.910618,0.367495,27.426428,-122.12879,21.995704,
+ -0.189006,-0.910618,0.367495,21.348494,-122.337067,18.353678,
+ -0.189006,-0.910618,0.367495,26.084822,-124.765449,14.772308,
+ 0.985331,0.068043,0.156505,152.128744,-51.298572,0,
+ 0.985331,0.068043,0.156505,151.862934,-50.523953,1.336723,
+ 0.985331,0.068043,0.156505,152.159067,-51.73768,0,
+ 0.985331,0.068043,0.156505,151.862934,-50.523953,1.336723,
+ 0.985331,0.068043,0.156505,152.128744,-51.298572,0,
+ 0.985331,0.068043,0.156505,151.831055,-49.724421,1.189822,
+ 0.984973,0.065473,0.159815,151.823982,-46.713735,0,
+ 0.984973,0.065473,0.159815,151.831055,-49.724421,1.189822,
+ 0.984973,0.065473,0.159815,152.128744,-51.298572,0,
+ 0.984973,0.065473,0.159815,151.831055,-49.724421,1.189822,
+ 0.984973,0.065473,0.159815,151.823982,-46.713735,0,
+ 0.984973,0.065473,0.159815,151.705904,-46.225901,0.527878,
+ -0.170852,-0.91492,0.365693,27.426428,-122.12879,21.995704,
+ -0.170852,-0.91492,0.365693,26.084822,-124.765449,14.772308,
+ -0.170852,-0.91492,0.365693,48.408947,-128.9394,14.759421,
+ 0.978734,-0.0765,-0.190335,152.395208,-55.308366,0,
+ 0.978734,-0.0765,-0.190335,152.397063,-58.075427,1.121687,
+ 0.978734,-0.0765,-0.190335,152.121501,-58.810145,0,
+ 0.063365,-0.845278,0.530556,31.038944,-96.193129,74.746069,
+ 0.063365,-0.845278,0.530556,26.560488,-102.028779,65.98362,
+ 0.063365,-0.845278,0.530556,45.068003,-96.011016,73.360689,
+ 0.025761,-0.908208,0.417726,43.459057,-106.625244,53.743378,
+ 0.025761,-0.908208,0.417726,28.208062,-107.282672,53.254552,
+ 0.025761,-0.908208,0.417726,27.167204,-109.035014,49.50885,
+ -0.255096,-0.897155,0.36061,14.772368,-125.86523,10.28014,
+ -0.255096,-0.897155,0.36061,8.697919,-125.028882,8.063802,
+ -0.255096,-0.897155,0.36061,11.425039,-128.080282,2.401454,
+ 0.065431,-0.847318,0.527039,45.068003,-96.011016,73.360689,
+ 0.065431,-0.847318,0.527039,26.560488,-102.028779,65.98362,
+ 0.065431,-0.847318,0.527039,46.810397,-99.045322,68.266135,
+ 0.004252,-0.87606,0.482184,43.459057,-106.625244,53.743378,
+ 0.004252,-0.87606,0.482184,27.167204,-109.035014,49.50885,
+ 0.004252,-0.87606,0.482184,36.139489,-111.117628,45.645908,
+ 0.06833,-0.807577,0.58579,38.257721,-89.224519,83.511038,
+ 0.06833,-0.807577,0.58579,31.038944,-96.193129,74.746069,
+ 0.06833,-0.807577,0.58579,45.068003,-96.011016,73.360689,
+ 0.092108,-0.798118,0.595419,38.257721,-89.224519,83.511038,
+ 0.092108,-0.798118,0.595419,45.068003,-96.011016,73.360689,
+ 0.092108,-0.798118,0.595419,56.591459,-92.057187,76.877916,
+ 0.129821,-0.814935,0.564825,86.543936,-91.477775,70.907447,
+ 0.129821,-0.814935,0.564825,69.322309,-96.976036,66.932787,
+ 0.129821,-0.814935,0.564825,102.4835,-97.594974,58.417899,
+ -0.440008,0.895246,-0.0702,14.774209,133.666294,1.240672,
+ -0.440008,0.895246,-0.0702,20.575701,136.420408,0,
+ -0.440008,0.895246,-0.0702,15.527348,133.939171,0,
+ 0.719811,0.250831,0.647268,180.965844,37.978047,117.699068,
+ 0.719811,0.250831,0.647268,177.169525,16.252385,130.34006,
+ 0.719811,0.250831,0.647268,188.47691,22.194526,115.462673,
+ -0.572912,-0.61971,-0.536406,150.70614,-64.763929,16.117284,
+ -0.572912,-0.61971,-0.536406,153.349382,-53.256822,0,
+ -0.572912,-0.61971,-0.536406,157.337174,-56.943471,0,
+ -0.572912,-0.61971,-0.536406,153.349382,-53.256822,0,
+ -0.572912,-0.61971,-0.536406,150.70614,-64.763929,16.117284,
+ -0.572912,-0.61971,-0.536406,151.99283,-53.651044,1.904319,
+ -0.572912,-0.61971,-0.536406,151.99283,-53.651044,1.904319,
+ -0.572912,-0.61971,-0.536406,150.70614,-64.763929,16.117284,
+ -0.572912,-0.61971,-0.536406,151.739698,-55.467984,4.273787,
+ -0.572912,-0.61971,-0.536406,151.739698,-55.467984,4.273787,
+ -0.572912,-0.61971,-0.536406,150.70614,-64.763929,16.117284,
+ -0.572912,-0.61971,-0.536406,150.996072,-60.621802,11.022224,
+ -0.572912,-0.61971,-0.536406,151.739698,-55.467984,4.273787,
+ -0.572912,-0.61971,-0.536406,150.996072,-60.621802,11.022224,
+ -0.572912,-0.61971,-0.536406,151.124013,-58.333602,8.24202,
+ 0.423607,-0.901952,0.083902,204.926966,-54.828599,79.673579,
+ 0.423607,-0.901952,0.083902,181.474493,-68.485956,51.263879,
+ 0.423607,-0.901952,0.083902,203.261353,-59.961003,32.909476,
+ 0.312379,-0.076898,0.94684,177.440582,-25.202967,122.598769,
+ 0.312379,-0.076898,0.94684,157.380863,-32.995219,128.583965,
+ 0.312379,-0.076898,0.94684,175.975003,-44.517327,121.51366,
+ 0.246777,-0.965827,0.079238,217.279273,-54.026391,23.449491,
+ 0.246777,-0.965827,0.079238,210.19354,-57.760699,0,
+ 0.246777,-0.965827,0.079238,219.293165,-55.435669,0,
+ 0.246777,-0.965827,0.079238,210.19354,-57.760699,0,
+ 0.246777,-0.965827,0.079238,217.279273,-54.026391,23.449491,
+ 0.246777,-0.965827,0.079238,195.681847,-60.614676,10.407845,
+ 0.62237,0.765396,0.163782,43.1773,51.476876,218.741447,
+ 0.62237,0.765396,0.163782,61.886329,36.690603,216.747382,
+ 0.62237,0.765396,0.163782,63.571226,38.003357,204.209969,
+ 0.108956,-0.280903,0.953531,155.139177,-30.981158,129.950355,
+ 0.108956,-0.280903,0.953531,145.930442,-7.139309,138.026218,
+ 0.108956,-0.280903,0.953531,110.397694,-31.863112,134.802966,
+ 0.627207,0.306908,0.715834,180.965844,37.978047,117.699068,
+ 0.627207,0.306908,0.715834,142.184757,40.136739,150.753155,
+ 0.627207,0.306908,0.715834,177.169525,16.252385,130.34006,
+ 0.349072,0.796004,0.494496,20.215178,59.061842,219.079992,
+ 0.349072,0.796004,0.494496,45.595121,55.003013,207.697547,
+ 0.349072,0.796004,0.494496,22.093586,67.839273,203.624734,
+ 0.474494,0.551306,0.686234,187.795507,78.677265,89.174646,
+ 0.474494,0.551306,0.686234,155.861601,100.501208,93.722334,
+ 0.474494,0.551306,0.686234,136.885717,92.075076,113.612495,
+ 0.111948,-0.859649,0.498469,69.322309,-96.976036,66.932787,
+ 0.111948,-0.859649,0.498469,88.935171,-103.211161,51.775088,
+ 0.111948,-0.859649,0.498469,102.4835,-97.594974,58.417899,
+ 0.167065,0.982803,0.078658,42.639133,141.276971,88.508698,
+ 0.167065,0.982803,0.078658,66.463168,138.201673,76.332504,
+ 0.167065,0.982803,0.078658,63.313946,139.551927,66.150373,
+ 0.388922,-0.916354,-0.095054,178.483892,-69.975679,30.284248,
+ 0.388922,-0.916354,-0.095054,175.488835,-69.691512,15.290202,
+ 0.388922,-0.916354,-0.095054,195.681847,-60.614676,10.407845,
+ 0.140804,-0.903571,0.404641,127.091067,-61.972922,105.032011,
+ 0.140804,-0.903571,0.404641,115.891218,-66.266697,99.341177,
+ 0.140804,-0.903571,0.404641,147.243849,-73.593705,72.069973,
+ -0.028907,-0.753059,0.657318,7.283371,-67.124654,109.853326,
+ -0.028907,-0.753059,0.657318,16.455431,-77.791967,98.035636,
+ -0.028907,-0.753059,0.657318,41.240997,-72.464919,105.228608,
+ 0.043632,0.446573,-0.893683,163.688951,95.799792,51.173477,
+ 0.043632,0.446573,-0.893683,136.916842,116.010101,59.965479,
+ 0.043632,0.446573,-0.893683,128.835805,130.404078,66.763611,
+ 0.167867,-0.976848,0.132622,155.767324,-69.699221,74.866411,
+ 0.167867,-0.976848,0.132622,151.306132,-73.138264,55.182438,
+ 0.167867,-0.976848,0.132622,181.474493,-68.485956,51.263879,
+ 0.240935,-0.892187,0.382037,116.524655,-103.780363,43.432864,
+ 0.240935,-0.892187,0.382037,104.2944,-110.512296,35.424632,
+ 0.240935,-0.892187,0.382037,127.481673,-107.995583,26.678751,
+ 0.413662,0.684762,0.599987,118.521392,112.445078,104.345135,
+ 0.413662,0.684762,0.599987,127.476067,107.387912,103.943027,
+ 0.413662,0.684762,0.599987,125.546595,110.007715,102.283342,
+ 0.114616,-0.862545,0.492829,88.935171,-103.211161,51.775088,
+ 0.114616,-0.862545,0.492829,75.705774,-108.476255,45.636897,
+ 0.114616,-0.862545,0.492829,104.2944,-110.512296,35.424632,
+ 0.158258,-0.986256,0.047473,151.306132,-73.138264,55.182438,
+ 0.158258,-0.986256,0.047473,178.483892,-69.975679,30.284248,
+ 0.158258,-0.986256,0.047473,181.474493,-68.485956,51.263879,
+ 0.39754,0.859708,-0.320725,69.818746,140.726385,22.699052,
+ 0.39754,0.859708,-0.320725,67.450715,133.353209,0,
+ 0.39754,0.859708,-0.320725,43.424796,144.463113,0,
+ 0.256446,-0.865177,0.430933,104.2944,-110.512296,35.424632,
+ 0.256446,-0.865177,0.430933,116.667881,-115.944921,17.154236,
+ 0.256446,-0.865177,0.430933,127.481673,-107.995583,26.678751,
+ 0.172441,-0.902283,0.395156,91.949045,-128.633342,1.426611,
+ 0.172441,-0.902283,0.395156,77.453125,-132.02854,0,
+ 0.172441,-0.902283,0.395156,87.439834,-130.119913,0,
+ 0.172441,-0.902283,0.395156,77.453125,-132.02854,0,
+ 0.172441,-0.902283,0.395156,91.949045,-128.633342,1.426611,
+ 0.172441,-0.902283,0.395156,79.483429,-121.900018,22.241038,
+ 0.241788,0.962541,-0.122692,40.879849,147.684705,20.258601,
+ 0.241788,0.962541,-0.122692,43.424796,144.463113,0,
+ 0.241788,0.962541,-0.122692,39.199175,145.524582,0,
+ 0.241788,0.962541,-0.122692,43.424796,144.463113,0,
+ 0.241788,0.962541,-0.122692,40.879849,147.684705,20.258601,
+ 0.241788,0.962541,-0.122692,69.818746,140.726385,22.699052,
+ 0.310618,-0.195139,0.930289,174.23283,-24.11532,125.015288,
+ 0.310618,-0.195139,0.930289,145.930442,-7.139309,138.026218,
+ 0.310618,-0.195139,0.930289,155.139177,-30.981158,129.950355,
+ 0.358411,-0.112734,0.926732,174.23283,-24.11532,125.015288,
+ 0.358411,-0.112734,0.926732,172.148849,-11.959811,127.299935,
+ 0.358411,-0.112734,0.926732,145.930442,-7.139309,138.026218,
+ 0.359034,-0.910079,-0.207002,195.681847,-60.614676,10.407845,
+ 0.359034,-0.910079,-0.207002,186.851508,-61.731005,0,
+ 0.359034,-0.910079,-0.207002,192.078304,-59.668988,0,
+ 0.359034,-0.910079,-0.207002,186.851508,-61.731005,0,
+ 0.359034,-0.910079,-0.207002,195.681847,-60.614676,10.407845,
+ 0.359034,-0.910079,-0.207002,175.488835,-69.691512,15.290202,
+ 0.344894,0.441983,0.828069,199.912194,-15.002224,116.190826,
+ 0.344894,0.441983,0.828069,181.847963,-2.756465,117.17846,
+ 0.344894,0.441983,0.828069,175.527666,-12.841987,125.194056,
+ 0.666762,-0.092143,0.739553,192.246759,-31.464258,108.469786,
+ 0.666762,-0.092143,0.739553,177.440582,-25.202967,122.598769,
+ 0.666762,-0.092143,0.739553,175.975003,-44.517327,121.51366,
+ 0.067083,-0.881152,0.46805,59.210725,-102.798882,58.689297,
+ 0.067083,-0.881152,0.46805,43.459057,-106.625244,53.743378,
+ 0.067083,-0.881152,0.46805,75.705774,-108.476255,45.636897,
+ 0.049048,-0.900387,-0.432317,175.488835,-69.691512,15.290202,
+ 0.049048,-0.900387,-0.432317,170.696333,-62.611043,0,
+ 0.049048,-0.900387,-0.432317,186.851508,-61.731005,0,
+ 0.240576,-0.937028,0.253182,215.775802,-40.787112,73.876839,
+ 0.240576,-0.937028,0.253182,217.279273,-54.026391,23.449491,
+ 0.240576,-0.937028,0.253182,220.906514,-52.875443,24.262523,
+ 0.709251,-0.70358,0.044038,224.070498,-51.204586,0,
+ 0.709251,-0.70358,0.044038,220.906514,-52.875443,24.262523,
+ 0.709251,-0.70358,0.044038,220.116809,-55.190143,0,
+ 0.709251,-0.70358,0.044038,220.906514,-52.875443,24.262523,
+ 0.709251,-0.70358,0.044038,224.070498,-51.204586,0,
+ 0.709251,-0.70358,0.044038,236.07977,-37.84789,19.980711,
+ 0.557049,-0.799028,0.226386,215.775802,-40.787112,73.876839,
+ 0.557049,-0.799028,0.226386,212.790998,-43.18861,72.745222,
+ 0.557049,-0.799028,0.226386,217.279273,-54.026391,23.449491,
+ 0.061756,-0.87389,0.482185,57.383502,-60.402598,125.022361,
+ 0.061756,-0.87389,0.482185,25.81744,-65.922176,119.061775,
+ 0.061756,-0.87389,0.482185,41.240997,-72.464919,105.228608,
+ 0.38205,-0.918495,-0.102008,203.261353,-59.961003,32.909476,
+ 0.38205,-0.918495,-0.102008,178.483892,-69.975679,30.284248,
+ 0.38205,-0.918495,-0.102008,195.681847,-60.614676,10.407845,
+ 0.657165,-0.74653,0.104055,236.07977,-37.84789,19.980711,
+ 0.657165,-0.74653,0.104055,224.070498,-51.204586,0,
+ 0.657165,-0.74653,0.104055,236.771292,-40.024171,0,
+ -0.438748,-0.724255,-0.531936,149.062846,-68.599379,22.694837,
+ -0.438748,-0.724255,-0.531936,157.337174,-56.943471,0,
+ -0.438748,-0.724255,-0.531936,165.289005,-61.760633,0,
+ -0.438748,-0.724255,-0.531936,157.337174,-56.943471,0,
+ -0.438748,-0.724255,-0.531936,149.062846,-68.599379,22.694837,
+ -0.438748,-0.724255,-0.531936,150.586985,-65.504967,17.224523,
+ -0.438748,-0.724255,-0.531936,157.337174,-56.943471,0,
+ -0.438748,-0.724255,-0.531936,150.586985,-65.504967,17.224523,
+ -0.438748,-0.724255,-0.531936,150.637568,-65.234887,16.815075,
+ -0.438748,-0.724255,-0.531936,157.337174,-56.943471,0,
+ -0.438748,-0.724255,-0.531936,150.637568,-65.234887,16.815075,
+ -0.438748,-0.724255,-0.531936,150.693057,-64.905155,16.320361,
+ -0.438748,-0.724255,-0.531936,157.337174,-56.943471,0,
+ -0.438748,-0.724255,-0.531936,150.693057,-64.905155,16.320361,
+ -0.438748,-0.724255,-0.531936,150.70614,-64.763929,16.117284,
+ -0.438748,-0.724255,-0.531936,150.586985,-65.504967,17.224523,
+ -0.438748,-0.724255,-0.531936,149.062846,-68.599379,22.694837,
+ -0.438748,-0.724255,-0.531936,149.188732,-67.972269,21.737165,
+ 0.306483,-0.93171,0.194896,177.907221,-60.586829,94.635844,
+ 0.306483,-0.93171,0.194896,181.474493,-68.485956,51.263879,
+ 0.306483,-0.93171,0.194896,204.926966,-54.828599,79.673579,
+ 0.886291,-0.282054,-0.367334,30.914353,-44.466612,189.029501,
+ 0.886291,-0.282054,-0.367334,15.073936,-57.978833,161.185464,
+ 0.886291,-0.282054,-0.367334,21.013271,-47.658919,167.591662,
+ 0.685599,0.376672,0.622954,217.375126,32.531725,77.182645,
+ 0.685599,0.376672,0.622954,200.444338,7.735201,110.809372,
+ 0.685599,0.376672,0.622954,230.862345,1.952608,80.828934,
+ 0.27913,-0.797326,0.535124,115.891218,-66.266697,99.341177,
+ 0.27913,-0.797326,0.535124,107.586161,-74.352147,91.626047,
+ 0.27913,-0.797326,0.535124,147.243849,-73.593705,72.069973,
+ 0.532641,0.608578,0.588155,138.513419,64.817661,143.182687,
+ 0.532641,0.608578,0.588155,171.599188,61.747878,116.396143,
+ 0.532641,0.608578,0.588155,115.180313,91.201132,137.013877,
+ 0.086543,-0.2501,0.964344,145.930442,-7.139309,138.026218,
+ 0.086543,-0.2501,0.964344,122.492286,-3.064184,141.186491,
+ 0.086543,-0.2501,0.964344,110.397694,-31.863112,134.802966,
+ 0.708376,0.146823,0.690396,200.444338,7.735201,110.809372,
+ 0.708376,0.146823,0.690396,199.912194,-15.002224,116.190826,
+ 0.708376,0.146823,0.690396,230.862345,1.952608,80.828934,
+ 0.929895,-0.360812,0.071483,242.010925,-26.520454,0,
+ 0.929895,-0.360812,0.071483,236.07977,-37.84789,19.980711,
+ 0.929895,-0.360812,0.071483,236.771292,-40.024171,0,
+ 0.511638,0.81723,-0.265259,187.899364,64.725872,3.880531,
+ 0.511638,0.81723,-0.265259,207.563171,51.15553,0,
+ 0.511638,0.81723,-0.265259,204.782348,52.896501,0,
+ 0.511638,0.81723,-0.265259,207.563171,51.15553,0,
+ 0.511638,0.81723,-0.265259,187.899364,64.725872,3.880531,
+ 0.511638,0.81723,-0.265259,204.793975,58.260796,16.549137,
+ 0.951053,-0.284295,0.121142,242.010925,-26.520454,0,
+ 0.951053,-0.284295,0.121142,244.671886,-9.207369,19.73964,
+ 0.951053,-0.284295,0.121142,236.07977,-37.84789,19.980711,
+ 0.951053,-0.284295,0.121142,244.671886,-9.207369,19.73964,
+ 0.951053,-0.284295,0.121142,242.010925,-26.520454,0,
+ 0.951053,-0.284295,0.121142,246.309767,-12.139518,0,
+ 0.947097,0.289816,-0.137891,149.821633,100.871258,32.816167,
+ 0.947097,0.289816,-0.137891,151.545384,98.52635,39.72718,
+ 0.947097,0.289816,-0.137891,154.217113,76.043004,10.822936,
+ 0.395653,0.859183,-0.324442,165.432078,94.233721,50.255994,
+ 0.395653,0.859183,-0.324442,181.806405,84.444991,44.3019,
+ 0.395653,0.859183,-0.324442,185.364615,73.478304,19.599242,
+ -0.408674,0.908531,0.086933,14.479431,131.478945,61.09574,
+ -0.408674,0.908531,0.086933,43.105366,146.08214,43.049651,
+ -0.408674,0.908531,0.086933,15.113139,135.611501,20.885597,
+ 0.925161,-0.21177,0.31501,149.841951,74.644847,8.710371,
+ 0.925161,-0.21177,0.31501,150.204733,63.272971,0,
+ 0.925161,-0.21177,0.31501,151.342326,68.242786,0,
+ 0.907988,0.41879,0.013132,241.236757,-1.140618,0,
+ 0.907988,0.41879,0.013132,244.671886,-9.207369,19.73964,
+ 0.907988,0.41879,0.013132,246.309767,-12.139518,0,
+ 0.907988,0.41879,0.013132,244.671886,-9.207369,19.73964,
+ 0.907988,0.41879,0.013132,241.236757,-1.140618,0,
+ 0.907988,0.41879,0.013132,229.001454,24.242969,36.484161,
+ -0.405006,0.59619,-0.693201,147.266579,73.407027,10.569463,
+ -0.405006,0.59619,-0.693201,150.207119,63.115288,0,
+ -0.405006,0.59619,-0.693201,150.002536,62.976309,0,
+ -0.405006,0.59619,-0.693201,150.207119,63.115288,0,
+ -0.405006,0.59619,-0.693201,147.266579,73.407027,10.569463,
+ -0.405006,0.59619,-0.693201,153.458312,65.323898,0,
+ 0.64095,0.767471,0.0131,187.795507,78.677265,89.174646,
+ 0.64095,0.767471,0.0131,203.414481,66.423201,42.889487,
+ 0.64095,0.767471,0.0131,181.806405,84.444991,44.3019,
+ -0.21047,0.627083,-0.74998,154.217113,76.043004,10.822936,
+ -0.21047,0.627083,-0.74998,147.266579,73.407027,10.569463,
+ -0.21047,0.627083,-0.74998,149.821633,100.871258,32.816167,
+ 0.752983,0.657823,-0.016905,231.726207,20.186471,0,
+ 0.752983,0.657823,-0.016905,229.001454,24.242969,36.484161,
+ 0.752983,0.657823,-0.016905,232.399568,19.415702,0,
+ 0.752983,0.657823,-0.016905,229.001454,24.242969,36.484161,
+ 0.752983,0.657823,-0.016905,231.726207,20.186471,0,
+ 0.752983,0.657823,-0.016905,218.954817,35.801564,38.764932,
+ 0.391734,-0.90163,0.183326,115.407875,-120.343367,3.233671,
+ 0.391734,-0.90163,0.183326,114.966939,-121.192433,0,
+ 0.391734,-0.90163,0.183326,116.843436,-120.377147,0,
+ 0.767548,0.640475,0.025718,216.458308,39.900477,11.193747,
+ 0.767548,0.640475,0.025718,216.559403,38.639544,39.579127,
+ 0.767548,0.640475,0.025718,218.954817,35.801564,38.764932,
+ 0.705212,-0.708842,-0.014804,135.233433,-108.33085,9.900609,
+ 0.705212,-0.708842,-0.014804,131.463872,-111.874331,0,
+ 0.705212,-0.708842,-0.014804,138.133891,-105.238479,0,
+ 0.826464,0.554108,-0.099609,208.16679,50.25522,0,
+ 0.826464,0.554108,-0.099609,204.793975,58.260796,16.549137,
+ 0.826464,0.554108,-0.099609,216.458308,39.900477,11.193747,
+ 0.826464,0.554108,-0.099609,204.793975,58.260796,16.549137,
+ 0.826464,0.554108,-0.099609,208.16679,50.25522,0,
+ 0.826464,0.554108,-0.099609,207.563171,51.15553,0,
+ -0.05202,-0.928597,0.367425,22.036768,-130.482192,4.197275,
+ -0.05202,-0.928597,0.367425,23.972417,-132.251395,0,
+ -0.05202,-0.928597,0.367425,29.452586,-132.558396,0,
+ 0.28948,-0.927072,0.2382,91.949045,-128.633342,1.426611,
+ 0.28948,-0.927072,0.2382,92.540223,-128.815296,0,
+ 0.28948,-0.927072,0.2382,94.340223,-128.253242,0,
+ 0.611305,0.752225,-0.245895,181.806405,84.444991,44.3019,
+ 0.611305,0.752225,-0.245895,203.414481,66.423201,42.889487,
+ 0.611305,0.752225,-0.245895,185.364615,73.478304,19.599242,
+ 0.088384,-0.832846,0.546402,53.918456,-84.626913,87.985668,
+ 0.088384,-0.832846,0.546402,38.257721,-89.224519,83.511038,
+ 0.088384,-0.832846,0.546402,69.81846,-87.629517,80.837074,
+ 0.76405,0.64445,0.030193,208.16679,50.25522,0,
+ 0.76405,0.64445,0.030193,216.458308,39.900477,11.193747,
+ 0.76405,0.64445,0.030193,216.018247,40.946641,0,
+ -0.208041,0.956728,-0.203447,80.575531,147.504688,59.226183,
+ -0.208041,0.956728,-0.203447,68.900561,139.929916,35.543714,
+ -0.208041,0.956728,-0.203447,62.256076,142.760349,55.648592,
+ 0.773296,0.63387,-0.014917,219.211435,35.752245,9.931712,
+ 0.773296,0.63387,-0.014917,229.665662,22.764775,0,
+ 0.773296,0.63387,-0.014917,223.28383,30.550361,0,
+ 0.975777,0.13215,0.174343,155.450647,93.987396,0,
+ 0.975777,0.13215,0.174343,152.702693,94.708882,14.83306,
+ 0.975777,0.13215,0.174343,155.655436,92.475269,0,
+ 0.975777,0.13215,0.174343,152.702693,94.708882,14.83306,
+ 0.975777,0.13215,0.174343,155.450647,93.987396,0,
+ 0.975777,0.13215,0.174343,149.058914,107.436044,25.579787,
+ 0.798998,0.165272,0.578175,187.795507,78.677265,89.174646,
+ 0.798998,0.165272,0.578175,171.599188,61.747878,116.396143,
+ 0.798998,0.165272,0.578175,206.903022,41.525802,73.389175,
+ 0.631352,0.740171,-0.231388,145.507447,107.536704,16.211464,
+ 0.631352,0.740171,-0.231388,155.450647,93.987396,0,
+ 0.631352,0.740171,-0.231388,154.277378,94.988173,0,
+ 0.631352,0.740171,-0.231388,155.450647,93.987396,0,
+ 0.631352,0.740171,-0.231388,145.507447,107.536704,16.211464,
+ 0.631352,0.740171,-0.231388,149.058914,107.436044,25.579787,
+ 0.219254,0.974501,-0.047693,127.476067,107.387912,103.943027,
+ 0.219254,0.974501,-0.047693,155.861601,100.501208,93.722334,
+ 0.219254,0.974501,-0.047693,142.774725,103.142366,87.525522,
+ 0.406217,0.804875,0.432624,118.521392,112.445078,104.345135,
+ 0.406217,0.804875,0.432624,125.546595,110.007715,102.283342,
+ 0.406217,0.804875,0.432624,104.729191,128.40166,87.609044,
+ 0.947021,-0.282824,0.152187,244.671886,-9.207369,19.73964,
+ 0.947021,-0.282824,0.152187,230.123336,-25.312636,80.341658,
+ 0.947021,-0.282824,0.152187,236.07977,-37.84789,19.980711,
+ -0.438414,0.896818,-0.059254,14.774209,133.666294,1.240672,
+ -0.438414,0.896818,-0.059254,39.199175,145.524582,0,
+ -0.438414,0.896818,-0.059254,20.575701,136.420408,0,
+ -0.438414,0.896818,-0.059254,39.199175,145.524582,0,
+ -0.438414,0.896818,-0.059254,14.774209,133.666294,1.240672,
+ -0.438414,0.896818,-0.059254,40.879849,147.684705,20.258601,
+ 0.759697,-0.032198,0.649479,230.862345,1.952608,80.828934,
+ 0.759697,-0.032198,0.649479,199.912194,-15.002224,116.190826,
+ 0.759697,-0.032198,0.649479,230.123336,-25.312636,80.341658,
+ 0.153344,0.987794,0.027351,62.256076,142.760349,55.648592,
+ 0.153344,0.987794,0.027351,66.285493,142.67377,36.184276,
+ 0.153344,0.987794,0.027351,43.105366,146.08214,43.049651,
+ 0.461522,-0.087949,0.882758,158.752306,10.392192,139.127895,
+ 0.461522,-0.087949,0.882758,142.184757,40.136739,150.753155,
+ 0.461522,-0.087949,0.882758,134.633334,13.304454,152.027883,
+ -0.186021,0.002795,0.982542,57.383502,-60.402598,125.022361,
+ -0.186021,0.002795,0.982542,41.22377,-49.557017,121.932046,
+ -0.186021,0.002795,0.982542,25.81744,-65.922176,119.061775,
+ 0.108408,-0.873118,0.475304,46.810397,-99.045322,68.266135,
+ 0.108408,-0.873118,0.475304,46.211175,-101.467936,63.952542,
+ 0.108408,-0.873118,0.475304,69.322309,-96.976036,66.932787,
+ 0.111707,-0.848635,0.51705,69.81846,-87.629517,80.837074,
+ 0.111707,-0.848635,0.51705,86.543936,-91.477775,70.907447,
+ 0.111707,-0.848635,0.51705,106.419447,-85.05347,77.157647,
+ 0.630412,0.168882,0.757668,181.847963,-2.756465,117.17846,
+ 0.630412,0.168882,0.757668,179.068654,-1.958576,119.313116,
+ 0.630412,0.168882,0.757668,172.148849,-11.959811,127.299935,
+ 0.138575,0.823233,0.550531,52.400529,109.465494,150.099319,
+ 0.138575,0.823233,0.550531,86.877537,123.240669,120.822424,
+ 0.138575,0.823233,0.550531,55.150209,132.694444,114.671927,
+ 0.65607,0.753981,0.032926,117.401057,108.744354,120.141845,
+ 0.65607,0.753981,0.032926,171.599188,61.747878,116.396143,
+ 0.65607,0.753981,0.032926,136.885717,92.075076,113.612495,
+ 0.595417,0.256714,0.761299,163.688951,95.799792,51.173477,
+ 0.595417,0.256714,0.761299,128.835805,130.404078,66.763611,
+ 0.595417,0.256714,0.761299,116.501785,135.296684,74.760313,
+ 0.698072,0.36152,0.61806,217.375126,32.531725,77.182645,
+ 0.698072,0.36152,0.61806,190.741907,22.388196,113.19692,
+ 0.698072,0.36152,0.61806,200.444338,7.735201,110.809372,
+ 0.137273,0.98916,0.05214,42.650154,145.117033,62.557569,
+ 0.137273,0.98916,0.05214,62.256076,142.760349,55.648592,
+ 0.137273,0.98916,0.05214,43.105366,146.08214,43.049651,
+ 0.695743,0.654538,0.29584,116.501785,135.296684,74.760313,
+ 0.695743,0.654538,0.29584,140.753341,104.201144,86.524614,
+ 0.695743,0.654538,0.29584,163.688951,95.799792,51.173477,
+ 0.45298,-0.094182,0.886532,177.169525,16.252385,130.34006,
+ 0.45298,-0.094182,0.886532,142.184757,40.136739,150.753155,
+ 0.45298,-0.094182,0.886532,158.752306,10.392192,139.127895,
+ -0.200164,-0.104644,0.974158,110.397694,-31.863112,134.802966,
+ -0.200164,-0.104644,0.974158,94.568308,-19.202409,132.910445,
+ -0.200164,-0.104644,0.974158,69.951402,-30.45389,126.643677,
+ 0.500712,-0.864796,0.037609,155.767324,-69.699221,74.866411,
+ 0.500712,-0.864796,0.037609,148.999438,-74.193749,61.622646,
+ 0.500712,-0.864796,0.037609,151.306132,-73.138264,55.182438,
+ 0.40924,0.379486,0.829767,179.068654,-1.958576,119.313116,
+ 0.40924,0.379486,0.829767,145.930442,-7.139309,138.026218,
+ 0.40924,0.379486,0.829767,172.148849,-11.959811,127.299935,
+ 0.396548,0.657484,0.640675,84.177518,92.915868,154.443433,
+ 0.396548,0.657484,0.640675,115.290055,79.668852,148.780795,
+ 0.396548,0.657484,0.640675,115.180313,91.201132,137.013877,
+ -0.215233,-0.124312,0.968618,122.492286,-3.064184,141.186491,
+ -0.215233,-0.124312,0.968618,94.568308,-19.202409,132.910445,
+ -0.215233,-0.124312,0.968618,110.397694,-31.863112,134.802966,
+ 0.973728,-0.030426,0.225674,230.862345,1.952608,80.828934,
+ 0.973728,-0.030426,0.225674,230.123336,-25.312636,80.341658,
+ 0.973728,-0.030426,0.225674,244.671886,-9.207369,19.73964,
+ 0.530968,0.60767,0.590601,115.290055,79.668852,148.780795,
+ 0.530968,0.60767,0.590601,138.513419,64.817661,143.182687,
+ 0.530968,0.60767,0.590601,115.180313,91.201132,137.013877,
+ 0.380826,-0.917256,0.116677,155.767324,-69.699221,74.866411,
+ 0.380826,-0.917256,0.116677,147.243849,-73.593705,72.069973,
+ 0.380826,-0.917256,0.116677,148.999438,-74.193749,61.622646,
+ -0.14424,0.066407,0.987312,81.659009,-49.753905,127.852615,
+ -0.14424,0.066407,0.987312,41.22377,-49.557017,121.932046,
+ -0.14424,0.066407,0.987312,57.383502,-60.402598,125.022361,
+ -0.185201,0.001995,0.982699,41.22377,-49.557017,121.932046,
+ -0.185201,0.001995,0.982699,25.147983,-54.284967,118.911978,
+ -0.185201,0.001995,0.982699,25.81744,-65.922176,119.061775,
+ 0.178671,0.301247,0.936657,169.243745,3.164372,130.265258,
+ 0.178671,0.301247,0.936657,122.492286,-3.064184,141.186491,
+ 0.178671,0.301247,0.936657,145.930442,-7.139309,138.026218,
+ 0.163744,-0.942281,0.292051,128.297252,-78.700823,85.387765,
+ 0.163744,-0.942281,0.292051,106.419447,-85.05347,77.157647,
+ 0.163744,-0.942281,0.292051,137.477823,-80.450251,74.596078,
+ 0.559144,0.272035,0.78317,181.847963,-2.756465,117.17846,
+ 0.559144,0.272035,0.78317,172.148849,-11.959811,127.299935,
+ 0.559144,0.272035,0.78317,175.527666,-12.841987,125.194056,
+ -0.144951,-0.025973,0.989098,81.659009,-49.753905,127.852615,
+ -0.144951,-0.025973,0.989098,69.951402,-30.45389,126.643677,
+ -0.144951,-0.025973,0.989098,41.22377,-49.557017,121.932046,
+ -0.019904,0.715375,0.698458,118.521392,112.445078,104.345135,
+ -0.019904,0.715375,0.698458,104.729191,128.40166,87.609044,
+ -0.019904,0.715375,0.698458,99.050894,124.374169,91.572271,
+ 0.498982,0.81172,-0.303525,187.899364,64.725872,3.880531,
+ 0.498982,0.81172,-0.303525,204.782348,52.896501,0,
+ 0.498982,0.81172,-0.303525,188.034553,63.191728,0,
+ 0.288995,-0.927458,0.237285,105.034438,-122.745505,8.502923,
+ 0.288995,-0.927458,0.237285,94.340223,-128.253242,0,
+ 0.288995,-0.927458,0.237285,103.752037,-125.320524,0,
+ 0.288995,-0.927458,0.237285,94.340223,-128.253242,0,
+ 0.288995,-0.927458,0.237285,105.034438,-122.745505,8.502923,
+ 0.288995,-0.927458,0.237285,91.949045,-128.633342,1.426611,
+ 0.664415,-0.256326,0.702033,190.782569,6.585408,107.581371,
+ 0.664415,-0.256326,0.702033,188.47691,22.194526,115.462673,
+ 0.664415,-0.256326,0.702033,188.631026,7.319585,109.885688,
+ 0.235404,-0.942336,0.23788,91.949045,-128.633342,1.426611,
+ 0.235404,-0.942336,0.23788,87.439834,-130.119913,0,
+ 0.235404,-0.942336,0.23788,91.58702,-129.083908,0,
+ 0.264033,-0.936955,0.228915,91.949045,-128.633342,1.426611,
+ 0.264033,-0.936955,0.228915,91.58702,-129.083908,0,
+ 0.264033,-0.936955,0.228915,92.540223,-128.815296,0,
+ -0.146012,-0.914451,0.377438,15.031408,-112.729518,39.629511,
+ -0.146012,-0.914451,0.377438,10.853295,-117.028258,27.598269,
+ -0.146012,-0.914451,0.377438,18.220003,-115.483585,34.190502,
+ -0.306558,0.68661,0.659234,92.803323,128.952007,84.235509,
+ -0.306558,0.68661,0.659234,80.575531,147.504688,59.226183,
+ -0.306558,0.68661,0.659234,62.256076,142.760349,55.648592,
+ 0.465403,0.858209,-0.216509,84.355082,133.349039,95.557493,
+ 0.465403,0.858209,-0.216509,99.050894,124.374169,91.572271,
+ 0.465403,0.858209,-0.216509,66.463168,138.201673,76.332504,
+ -0.175287,-0.767994,0.616003,26.084822,-124.765449,14.772308,
+ -0.175287,-0.767994,0.616003,7.777562,-121.659896,13.434695,
+ -0.175287,-0.767994,0.616003,25.971265,-126.930075,12.041273,
+ 0.679282,0.239748,0.693611,188.47691,22.194526,115.462673,
+ 0.679282,0.239748,0.693611,185.705565,38.127994,112.669336,
+ 0.679282,0.239748,0.693611,182.985496,38.083946,115.348436,
+ 0.896372,0.434539,-0.087711,203.414481,66.423201,42.889487,
+ 0.896372,0.434539,-0.087711,216.559403,38.639544,39.579127,
+ 0.896372,0.434539,-0.087711,204.793975,58.260796,16.549137,
+ 0.120235,0.807163,-0.577955,164.573155,83.090394,28.698008,
+ 0.120235,0.807163,-0.577955,185.364615,73.478304,19.599242,
+ 0.120235,0.807163,-0.577955,170.47368,68.64792,9.755366,
+ 0.47157,-0.858354,0.202116,135.233433,-108.33085,9.900609,
+ 0.47157,-0.858354,0.202116,124.590326,-116.50934,0,
+ 0.47157,-0.858354,0.202116,125.755126,-115.869412,0,
+ 0.47157,-0.858354,0.202116,124.590326,-116.50934,0,
+ 0.47157,-0.858354,0.202116,135.233433,-108.33085,9.900609,
+ 0.47157,-0.858354,0.202116,120.980843,-116.596331,8.052078,
+ 0.696929,-0.238534,0.676307,190.741907,22.388196,113.19692,
+ 0.696929,-0.238534,0.676307,188.47691,22.194526,115.462673,
+ 0.696929,-0.238534,0.676307,190.782569,6.585408,107.581371,
+ 0.034581,0.875527,-0.481931,185.364615,73.478304,19.599242,
+ 0.034581,0.875527,-0.481931,187.899364,64.725872,3.880531,
+ 0.034581,0.875527,-0.481931,170.47368,68.64792,9.755366,
+ 0.438736,-0.875174,0.203916,115.407875,-120.343367,3.233671,
+ 0.438736,-0.875174,0.203916,116.843436,-120.377147,0,
+ 0.438736,-0.875174,0.203916,123.012892,-117.284316,0,
+ 0.168088,0.975143,0.144366,42.639133,141.276971,88.508698,
+ 0.168088,0.975143,0.144366,62.256076,142.760349,55.648592,
+ 0.168088,0.975143,0.144366,42.650154,145.117033,62.557569,
+ -0.094086,-0.909335,0.405288,26.524227,-113.760114,39.985207,
+ -0.094086,-0.909335,0.405288,15.031408,-112.729518,39.629511,
+ -0.094086,-0.909335,0.405288,18.220003,-115.483585,34.190502,
+ 0.029731,-0.940785,0.337698,27.157495,-105.803002,57.469217,
+ 0.029731,-0.940785,0.337698,28.208062,-107.282672,53.254552,
+ 0.029731,-0.940785,0.337698,43.459057,-106.625244,53.743378,
+ -0.107688,-0.884244,0.454441,25.971265,-126.930075,12.041273,
+ -0.107688,-0.884244,0.454441,22.036768,-130.482192,4.197275,
+ -0.107688,-0.884244,0.454441,36.147209,-130.968023,6.595675,
+ 0.377687,-0.906929,0.186632,115.407875,-120.343367,3.233671,
+ 0.377687,-0.906929,0.186632,111.033697,-122.830416,0,
+ 0.377687,-0.906929,0.186632,114.966939,-121.192433,0,
+ 0.124243,-0.836485,0.533719,106.419447,-85.05347,77.157647,
+ 0.124243,-0.836485,0.533719,102.4835,-97.594974,58.417899,
+ 0.124243,-0.836485,0.533719,116.766516,-91.579114,64.5215,
+ -0.009114,-0.868217,0.496101,50.553261,-117.746626,34.387099,
+ -0.009114,-0.868217,0.496101,38.929794,-120.106955,30.04279,
+ -0.009114,-0.868217,0.496101,48.408947,-128.9394,14.759421,
+ 0.776497,0.602066,0.185926,207.421119,39.802471,73.978287,
+ 0.776497,0.602066,0.185926,218.954817,35.801564,38.764932,
+ 0.776497,0.602066,0.185926,216.559403,38.639544,39.579127,
+ 0.626245,0.312272,0.714355,180.965844,37.978047,117.699068,
+ 0.626245,0.312272,0.714355,138.513419,64.817661,143.182687,
+ 0.626245,0.312272,0.714355,142.184757,40.136739,150.753155,
+ 0.111318,-0.860097,0.497838,69.322309,-96.976036,66.932787,
+ 0.111318,-0.860097,0.497838,75.705774,-108.476255,45.636897,
+ 0.111318,-0.860097,0.497838,88.935171,-103.211161,51.775088,
+ 0.18627,-0.896663,0.40162,79.483429,-121.900018,22.241038,
+ 0.18627,-0.896663,0.40162,91.949045,-128.633342,1.426611,
+ 0.18627,-0.896663,0.40162,105.034438,-122.745505,8.502923,
+ 0.490082,0.832975,-0.256851,124.043444,129.590737,46.779075,
+ 0.490082,0.832975,-0.256851,135.09252,108.665478,0,
+ 0.490082,0.832975,-0.256851,131.944765,110.517466,0,
+ 0.490082,0.832975,-0.256851,135.09252,108.665478,0,
+ 0.490082,0.832975,-0.256851,124.043444,129.590737,46.779075,
+ 0.490082,0.832975,-0.256851,145.507447,107.536704,16.211464,
+ 0.418551,0.863504,-0.281381,115.512951,129.151215,32.741269,
+ 0.418551,0.863504,-0.281381,131.944765,110.517466,0,
+ 0.418551,0.863504,-0.281381,130.789841,111.077271,0,
+ 0.418551,0.863504,-0.281381,131.944765,110.517466,0,
+ 0.418551,0.863504,-0.281381,115.512951,129.151215,32.741269,
+ 0.418551,0.863504,-0.281381,124.043444,129.590737,46.779075,
+ 0.675403,0.705934,0.213281,117.401057,108.744354,120.141845,
+ 0.675403,0.705934,0.213281,136.885717,92.075076,113.612495,
+ 0.675403,0.705934,0.213281,118.521392,112.445078,104.345135,
+ -0.469866,0.873258,0.129019,17.156982,126.446608,96.085464,
+ -0.469866,0.873258,0.129019,42.639133,141.276971,88.508698,
+ -0.469866,0.873258,0.129019,42.650154,145.117033,62.557569,
+ 0.342235,0.690705,0.637025,82.914149,103.255853,144.620583,
+ 0.342235,0.690705,0.637025,117.401057,108.744354,120.141845,
+ 0.342235,0.690705,0.637025,86.877537,123.240669,120.822424,
+ -0.131321,-0.897813,0.42034,48.408947,-128.9394,14.759421,
+ -0.131321,-0.897813,0.42034,25.971265,-126.930075,12.041273,
+ -0.131321,-0.897813,0.42034,36.147209,-130.968023,6.595675,
+ 0.040535,-0.800399,0.598095,73.309923,-64.919561,113.152737,
+ 0.040535,-0.800399,0.598095,41.240997,-72.464919,105.228608,
+ 0.040535,-0.800399,0.598095,67.758471,-79.75432,93.676406,
+ 0.390729,0.611907,0.687678,117.401057,108.744354,120.141845,
+ 0.390729,0.611907,0.687678,82.914149,103.255853,144.620583,
+ 0.390729,0.611907,0.687678,115.180313,91.201132,137.013877,
+ 0.835631,0.548982,0.018456,216.92885,39.56057,0,
+ 0.835631,0.548982,0.018456,216.458308,39.900477,11.193747,
+ 0.835631,0.548982,0.018456,219.211435,35.752245,9.931712,
+ 0.835631,0.548982,0.018456,216.458308,39.900477,11.193747,
+ 0.835631,0.548982,0.018456,216.92885,39.56057,0,
+ 0.835631,0.548982,0.018456,216.018247,40.946641,0,
+ 0.397191,0.651943,0.645917,136.885717,92.075076,113.612495,
+ 0.397191,0.651943,0.645917,127.476067,107.387912,103.943027,
+ 0.397191,0.651943,0.645917,118.521392,112.445078,104.345135,
+ 0.654326,0.480604,0.583846,138.513419,64.817661,143.182687,
+ 0.654326,0.480604,0.583846,180.965844,37.978047,117.699068,
+ 0.654326,0.480604,0.583846,182.985496,38.083946,115.348436,
+ 0.197841,0.898399,0.392094,99.050894,124.374169,91.572271,
+ 0.197841,0.898399,0.392094,92.803323,128.952007,84.235509,
+ 0.197841,0.898399,0.392094,66.463168,138.201673,76.332504,
+ 0.324534,0.945543,0.025014,92.803323,128.952007,84.235509,
+ 0.324534,0.945543,0.025014,63.313946,139.551927,66.150373,
+ 0.324534,0.945543,0.025014,66.463168,138.201673,76.332504,
+ 0.090648,-0.800521,0.59241,38.257721,-89.224519,83.511038,
+ 0.090648,-0.800521,0.59241,56.591459,-92.057187,76.877916,
+ 0.090648,-0.800521,0.59241,69.81846,-87.629517,80.837074,
+ 0.676278,0.239739,0.696544,190.741907,22.388196,113.19692,
+ 0.676278,0.239739,0.696544,185.705565,38.127994,112.669336,
+ 0.676278,0.239739,0.696544,188.47691,22.194526,115.462673,
+ -0.437587,0.890581,0.124027,15.812822,129.807229,77.804022,
+ -0.437587,0.890581,0.124027,42.650154,145.117033,62.557569,
+ -0.437587,0.890581,0.124027,14.479431,131.478945,61.09574,
+ -0.419889,0.901551,0.104395,43.105366,146.08214,43.049651,
+ -0.419889,0.901551,0.104395,40.879849,147.684705,20.258601,
+ -0.419889,0.901551,0.104395,15.113139,135.611501,20.885597,
+ 0.201168,0.866888,-0.45611,165.432078,94.233721,50.255994,
+ 0.201168,0.866888,-0.45611,185.364615,73.478304,19.599242,
+ 0.201168,0.866888,-0.45611,164.573155,83.090394,28.698008,
+ -0.043533,0.967641,-0.248549,69.818746,140.726385,22.699052,
+ -0.043533,0.967641,-0.248549,79.589091,135.335447,0,
+ -0.043533,0.967641,-0.248549,77.223193,135.22901,0,
+ -0.043533,0.967641,-0.248549,79.589091,135.335447,0,
+ -0.043533,0.967641,-0.248549,69.818746,140.726385,22.699052,
+ -0.043533,0.967641,-0.248549,74.209443,140.955622,22.822495,
+ 0.546764,0.765901,-0.338297,185.364615,73.478304,19.599242,
+ 0.546764,0.765901,-0.338297,204.793975,58.260796,16.549137,
+ 0.546764,0.765901,-0.338297,187.899364,64.725872,3.880531,
+ -0.204767,0.613285,-0.762857,154.217113,76.043004,10.822936,
+ -0.204767,0.613285,-0.762857,161.933243,65.156803,0,
+ -0.204767,0.613285,-0.762857,147.266579,73.407027,10.569463,
+ -0.204767,0.613285,-0.762857,161.933243,65.156803,0,
+ -0.204767,0.613285,-0.762857,154.217113,76.043004,10.822936,
+ -0.204767,0.613285,-0.762857,163.067671,65.535572,0,
+ 0.469402,0.597007,0.650572,187.795507,78.677265,89.174646,
+ 0.469402,0.597007,0.650572,136.885717,92.075076,113.612495,
+ 0.469402,0.597007,0.650572,171.599188,61.747878,116.396143,
+ 0.654813,-0.446303,0.609946,150.204733,63.272971,0,
+ 0.654813,-0.446303,0.609946,147.266579,73.407027,10.569463,
+ 0.654813,-0.446303,0.609946,150.002536,62.976309,0,
+ 0.654813,-0.446303,0.609946,147.266579,73.407027,10.569463,
+ 0.654813,-0.446303,0.609946,150.204733,63.272971,0,
+ 0.654813,-0.446303,0.609946,149.841951,74.644847,8.710371,
+ 0.015747,0.798668,-0.601566,147.266579,73.407027,10.569463,
+ 0.015747,0.798668,-0.601566,161.933243,65.156803,0,
+ 0.015747,0.798668,-0.601566,153.458312,65.323898,0,
+ 0.918193,0.394732,0.033292,229.001454,24.242969,36.484161,
+ 0.918193,0.394732,0.033292,241.236757,-1.140618,0,
+ 0.918193,0.394732,0.033292,232.399568,19.415702,0,
+ 0.111382,0.970728,-0.212793,74.209443,140.955622,22.822495,
+ 0.111382,0.970728,-0.212793,81.713407,135.091701,0,
+ 0.111382,0.970728,-0.212793,79.589091,135.335447,0,
+ 0.115341,-0.802337,0.585621,85.871599,-82.864959,84.20305,
+ 0.115341,-0.802337,0.585621,69.81846,-87.629517,80.837074,
+ 0.115341,-0.802337,0.585621,106.419447,-85.05347,77.157647,
+ 0.781165,0.624297,0.005885,229.665662,22.764775,0,
+ 0.781165,0.624297,0.005885,218.954817,35.801564,38.764932,
+ 0.781165,0.624297,0.005885,231.726207,20.186471,0,
+ 0.781165,0.624297,0.005885,218.954817,35.801564,38.764932,
+ 0.781165,0.624297,0.005885,229.665662,22.764775,0,
+ 0.781165,0.624297,0.005885,219.211435,35.752245,9.931712,
+ 0.581549,0.785171,-0.212854,203.414481,66.423201,42.889487,
+ 0.581549,0.785171,-0.212854,204.793975,58.260796,16.549137,
+ 0.581549,0.785171,-0.212854,185.364615,73.478304,19.599242,
+ 0.834084,0.551599,0.00648,216.458308,39.900477,11.193747,
+ 0.834084,0.551599,0.00648,218.954817,35.801564,38.764932,
+ 0.834084,0.551599,0.00648,219.211435,35.752245,9.931712,
+ 0.497314,0.867395,0.017458,80.575531,147.504688,59.226183,
+ 0.497314,0.867395,0.017458,100.940523,135.925328,54.419403,
+ 0.497314,0.867395,0.017458,99.813994,137.20697,22.831602,
+ -0.020694,-0.854229,0.519485,26.524227,-113.760114,39.985207,
+ -0.020694,-0.854229,0.519485,38.929794,-120.106955,30.04279,
+ -0.020694,-0.854229,0.519485,50.553261,-117.746626,34.387099,
+ 0.44623,0.894686,0.020387,100.940523,135.925328,54.419403,
+ 0.44623,0.894686,0.020387,115.512951,129.151215,32.741269,
+ 0.44623,0.894686,0.020387,99.813994,137.20697,22.831602,
+ 0.903096,0.377447,0.204821,187.795507,78.677265,89.174646,
+ 0.903096,0.377447,0.204821,206.903022,41.525802,73.389175,
+ 0.903096,0.377447,0.204821,203.414481,66.423201,42.889487,
+ 0.205765,0.915491,0.34574,86.877537,123.240669,120.822424,
+ 0.205765,0.915491,0.34574,84.355082,133.349039,95.557493,
+ 0.205765,0.915491,0.34574,55.150209,132.694444,114.671927,
+ 0.854675,-0.519065,0.0101,141.825295,-99.898436,0,
+ 0.854675,-0.519065,0.0101,143.244049,-97.117407,22.868325,
+ 0.854675,-0.519065,0.0101,140.218473,-102.544178,0,
+ 0.854675,-0.519065,0.0101,143.244049,-97.117407,22.868325,
+ 0.854675,-0.519065,0.0101,141.825295,-99.898436,0,
+ 0.854675,-0.519065,0.0101,146.14974,-92.595069,9.398895,
+ 0.732949,0.663815,0.148779,62.256076,142.760349,55.648592,
+ 0.732949,0.663815,0.148779,68.900561,139.929916,35.543714,
+ 0.732949,0.663815,0.148779,66.285493,142.67377,36.184276,
+ 0.829608,0.556204,0.048852,219.1715,36.684119,0,
+ 0.829608,0.556204,0.048852,219.211435,35.752245,9.931712,
+ 0.829608,0.556204,0.048852,223.28383,30.550361,0,
+ 0.433359,-0.882085,0.184731,120.980843,-116.596331,8.052078,
+ 0.433359,-0.882085,0.184731,123.012892,-117.284316,0,
+ 0.433359,-0.882085,0.184731,124.590326,-116.50934,0,
+ 0.433359,-0.882085,0.184731,123.012892,-117.284316,0,
+ 0.433359,-0.882085,0.184731,120.980843,-116.596331,8.052078,
+ 0.433359,-0.882085,0.184731,115.407875,-120.343367,3.233671,
+ 0.391975,0.65121,0.649832,136.885717,92.075076,113.612495,
+ 0.391975,0.65121,0.649832,155.861601,100.501208,93.722334,
+ 0.391975,0.65121,0.649832,127.476067,107.387912,103.943027,
+ 0.891524,0.39548,0.220864,203.414481,66.423201,42.889487,
+ 0.891524,0.39548,0.220864,206.903022,41.525802,73.389175,
+ 0.891524,0.39548,0.220864,216.559403,38.639544,39.579127,
+ 0.5669,0.823234,0.030151,155.861601,100.501208,93.722334,
+ 0.5669,0.823234,0.030151,187.795507,78.677265,89.174646,
+ 0.5669,0.823234,0.030151,181.806405,84.444991,44.3019,
+ 0.567598,0.81804,0.092965,217.375126,32.531725,77.182645,
+ 0.567598,0.81804,0.092965,218.954817,35.801564,38.764932,
+ 0.567598,0.81804,0.092965,207.421119,39.802471,73.978287,
+ 0.621318,0.266332,0.736907,182.985496,38.083946,115.348436,
+ 0.621318,0.266332,0.736907,171.599188,61.747878,116.396143,
+ 0.621318,0.266332,0.736907,138.513419,64.817661,143.182687,
+ -0.108828,0.991881,-0.065795,92.506364,136.25497,73.339275,
+ -0.108828,0.991881,-0.065795,103.760489,136.482348,58.152315,
+ -0.108828,0.991881,-0.065795,100.940523,135.925328,54.419403,
+ 0.846598,0.531833,0.02061,204.793975,58.260796,16.549137,
+ 0.846598,0.531833,0.02061,216.559403,38.639544,39.579127,
+ 0.846598,0.531833,0.02061,216.458308,39.900477,11.193747,
+ 0.44242,0.847001,0.294709,86.877537,123.240669,120.822424,
+ 0.44242,0.847001,0.294709,118.521392,112.445078,104.345135,
+ 0.44242,0.847001,0.294709,84.355082,133.349039,95.557493,
+ 0.17362,0.94659,0.271706,92.803323,128.952007,84.235509,
+ 0.17362,0.94659,0.271706,62.256076,142.760349,55.648592,
+ 0.17362,0.94659,0.271706,63.313946,139.551927,66.150373,
+ 0.947298,-0.157522,0.278951,154.364889,86.419772,0,
+ 0.947298,-0.157522,0.278951,149.841951,74.644847,8.710371,
+ 0.947298,-0.157522,0.278951,151.342326,68.242786,0,
+ -0.171116,-0.757348,0.630193,7.777562,-121.659896,13.434695,
+ -0.171116,-0.757348,0.630193,14.772368,-125.86523,10.28014,
+ -0.171116,-0.757348,0.630193,25.971265,-126.930075,12.041273,
+ 0.787463,0.613953,0.05444,216.92885,39.56057,0,
+ 0.787463,0.613953,0.05444,219.211435,35.752245,9.931712,
+ 0.787463,0.613953,0.05444,219.1715,36.684119,0,
+ 0.335424,-0.909451,0.245741,115.407875,-120.343367,3.233671,
+ 0.335424,-0.909451,0.245741,108.886628,-123.622299,0,
+ 0.335424,-0.909451,0.245741,111.033697,-122.830416,0,
+ 0.335424,-0.909451,0.245741,108.886628,-123.622299,0,
+ 0.335424,-0.909451,0.245741,115.407875,-120.343367,3.233671,
+ 0.335424,-0.909451,0.245741,105.034438,-122.745505,8.502923,
+ 0.339349,-0.905341,0.255342,116.667881,-115.944921,17.154236,
+ 0.339349,-0.905341,0.255342,105.034438,-122.745505,8.502923,
+ 0.339349,-0.905341,0.255342,115.407875,-120.343367,3.233671,
+ 0.465284,-0.854207,0.232037,127.481673,-107.995583,26.678751,
+ 0.465284,-0.854207,0.232037,120.980843,-116.596331,8.052078,
+ 0.465284,-0.854207,0.232037,135.233433,-108.33085,9.900609,
+ 0.140401,0.9587,0.247351,55.150209,132.694444,114.671927,
+ 0.140401,0.9587,0.247351,84.355082,133.349039,95.557493,
+ 0.140401,0.9587,0.247351,42.639133,141.276971,88.508698,
+ 0.793138,0.396485,0.462312,206.903022,41.525802,73.389175,
+ 0.793138,0.396485,0.462312,185.705565,38.127994,112.669336,
+ 0.793138,0.396485,0.462312,207.421119,39.802471,73.978287,
+ 0.579785,0.790192,0.198612,74.209443,140.955622,22.822495,
+ 0.579785,0.790192,0.198612,103.129583,125.47251,0,
+ 0.579785,0.790192,0.198612,90.433957,134.787627,0,
+ -0.000466,0.940193,0.340643,-0.026273,65.378808,204.403186,
+ -0.000466,0.940193,0.340643,5.021595,60.165404,218.799389,
+ -0.000466,0.940193,0.340643,4.833566,65.392176,204.372944,
+ -0.000466,0.940193,0.340643,5.021595,60.165404,218.799389,
+ -0.000466,0.940193,0.340643,-0.026273,65.378808,204.403186,
+ -0.000466,0.940193,0.340643,-0.026187,65.164127,204.995717,
+ 0.086148,0.927528,-0.363691,170.47368,68.64792,9.755366,
+ 0.086148,0.927528,-0.363691,188.034553,63.191728,0,
+ 0.086148,0.927528,-0.363691,178.772472,64.05198,0,
+ 0.086148,0.927528,-0.363691,188.034553,63.191728,0,
+ 0.086148,0.927528,-0.363691,170.47368,68.64792,9.755366,
+ 0.086148,0.927528,-0.363691,187.899364,64.725872,3.880531,
+ -0.264993,-0.323474,0.908374,200.444338,7.735201,110.809372,
+ -0.264993,-0.323474,0.908374,190.741907,22.388196,113.19692,
+ -0.264993,-0.323474,0.908374,190.782569,6.585408,107.581371,
+ -0.086133,-0.945074,0.315304,36.147209,-130.968023,6.595675,
+ -0.086133,-0.945074,0.315304,29.452586,-132.558396,0,
+ -0.086133,-0.945074,0.315304,39.711401,-133.493371,0,
+ -0.086133,-0.945074,0.315304,29.452586,-132.558396,0,
+ -0.086133,-0.945074,0.315304,36.147209,-130.968023,6.595675,
+ -0.086133,-0.945074,0.315304,22.036768,-130.482192,4.197275,
+ 0.27239,-0.695752,0.66463,110.397694,-31.863112,134.802966,
+ 0.27239,-0.695752,0.66463,81.659009,-49.753905,127.852615,
+ 0.27239,-0.695752,0.66463,117.854117,-39.131687,124.138113,
+ 0.492934,0.812273,0.311815,185.705565,38.127994,112.669336,
+ 0.492934,0.812273,0.311815,217.375126,32.531725,77.182645,
+ 0.492934,0.812273,0.311815,207.421119,39.802471,73.978287,
+ 0.543199,0.816146,-0.197078,99.813994,137.20697,22.831602,
+ 0.543199,0.816146,-0.197078,130.789841,111.077271,0,
+ 0.543199,0.816146,-0.197078,127.83808,113.041861,0,
+ 0.543199,0.816146,-0.197078,130.789841,111.077271,0,
+ 0.543199,0.816146,-0.197078,99.813994,137.20697,22.831602,
+ 0.543199,0.816146,-0.197078,115.512951,129.151215,32.741269,
+ 0.924928,0.280391,0.25669,136.916842,116.010101,59.965479,
+ 0.924928,0.280391,0.25669,147.999053,102.400314,34.899471,
+ 0.924928,0.280391,0.25669,149.058914,107.436044,25.579787,
+ 0.533694,0.616251,0.579142,121.745973,65.826435,157.560879,
+ 0.533694,0.616251,0.579142,138.513419,64.817661,143.182687,
+ 0.533694,0.616251,0.579142,115.290055,79.668852,148.780795,
+ -0.444174,-0.014021,0.895831,25.81744,-65.922176,119.061775,
+ -0.444174,-0.014021,0.895831,25.147983,-54.284967,118.911978,
+ -0.444174,-0.014021,0.895831,7.283371,-67.124654,109.853326,
+ 0.11063,0.967374,-0.227923,103.760489,136.482348,58.152315,
+ 0.11063,0.967374,-0.227923,115.512951,129.151215,32.741269,
+ 0.11063,0.967374,-0.227923,100.940523,135.925328,54.419403,
+ 0.740716,0.257805,0.620384,185.705565,38.127994,112.669336,
+ 0.740716,0.257805,0.620384,190.741907,22.388196,113.19692,
+ 0.740716,0.257805,0.620384,217.375126,32.531725,77.182645,
+ 0.553485,0.776361,-0.301525,145.507447,107.536704,16.211464,
+ 0.553485,0.776361,-0.301525,154.277378,94.988173,0,
+ 0.553485,0.776361,-0.301525,135.09252,108.665478,0,
+ 0.171616,0.981229,0.087959,84.355082,133.349039,95.557493,
+ 0.171616,0.981229,0.087959,66.463168,138.201673,76.332504,
+ 0.171616,0.981229,0.087959,42.639133,141.276971,88.508698,
+ -0.299178,-0.910625,0.285052,0.607191,-124.022044,1.617393,
+ -0.299178,-0.910625,0.285052,0.587015,-124.521705,0,
+ -0.299178,-0.910625,0.285052,1.229377,-124.732747,0,
+ 0.182574,-0.618494,-0.764286,19.022387,-59.834804,175.923518,
+ 0.182574,-0.618494,-0.764286,0.014461,-78.045278,186.119601,
+ 0.182574,-0.618494,-0.764286,0.025194,-62.693521,173.698845,
+ -0.792388,-0.140655,-0.59358,151.932366,-51.870868,1.563201,
+ -0.792388,-0.140655,-0.59358,153.349382,-53.256822,0,
+ -0.792388,-0.140655,-0.59358,151.99283,-53.651044,1.904319,
+ -0.792388,-0.140655,-0.59358,153.349382,-53.256822,0,
+ -0.792388,-0.140655,-0.59358,151.932366,-51.870868,1.563201,
+ -0.792388,-0.140655,-0.59358,151.839915,-44.753154,0,
+ -0.792388,-0.140655,-0.59358,151.839915,-44.753154,0,
+ -0.792388,-0.140655,-0.59358,151.932366,-51.870868,1.563201,
+ -0.792388,-0.140655,-0.59358,151.862934,-50.523953,1.336723,
+ -0.792388,-0.140655,-0.59358,151.839915,-44.753154,0,
+ -0.792388,-0.140655,-0.59358,151.862934,-50.523953,1.336723,
+ -0.792388,-0.140655,-0.59358,151.831055,-49.724421,1.189822,
+ -0.792388,-0.140655,-0.59358,151.839915,-44.753154,0,
+ -0.792388,-0.140655,-0.59358,151.831055,-49.724421,1.189822,
+ -0.792388,-0.140655,-0.59358,151.705904,-46.225901,0.527878,
+ -0.362058,-0.883959,-0.295855,175.488835,-69.691512,15.290202,
+ -0.362058,-0.883959,-0.295855,167.504833,-61.303848,0,
+ -0.362058,-0.883959,-0.295855,170.696333,-62.611043,0,
+ -0.362058,-0.883959,-0.295855,167.504833,-61.303848,0,
+ -0.362058,-0.883959,-0.295855,175.488835,-69.691512,15.290202,
+ -0.362058,-0.883959,-0.295855,151.306132,-73.138264,55.182438,
+ 0.385171,-0.889409,0.246161,116.667881,-115.944921,17.154236,
+ 0.385171,-0.889409,0.246161,115.407875,-120.343367,3.233671,
+ 0.385171,-0.889409,0.246161,120.980843,-116.596331,8.052078,
+ 0.650464,0.653649,0.386832,125.546595,110.007715,102.283342,
+ 0.650464,0.653649,0.386832,140.753341,104.201144,86.524614,
+ 0.650464,0.653649,0.386832,116.501785,135.296684,74.760313,
+ 0.072601,-0.88612,0.457733,26.560488,-102.028779,65.98362,
+ 0.072601,-0.88612,0.457733,34.947907,-103.927924,60.976755,
+ 0.072601,-0.88612,0.457733,46.211175,-101.467936,63.952542,
+ 0.582404,-0.079722,0.808981,177.440582,-25.202967,122.598769,
+ 0.582404,-0.079722,0.808981,175.527666,-12.841987,125.194056,
+ 0.582404,-0.079722,0.808981,174.23283,-24.11532,125.015288,
+ 0.690403,-0.473207,0.547192,199.912194,-15.002224,116.190826,
+ 0.690403,-0.473207,0.547192,194.042044,-29.310002,111.224075,
+ 0.690403,-0.473207,0.547192,215.775802,-40.787112,73.876839,
+ 0.082154,-0.898297,0.431641,46.211175,-101.467936,63.952542,
+ 0.082154,-0.898297,0.431641,34.947907,-103.927924,60.976755,
+ 0.082154,-0.898297,0.431641,43.459057,-106.625244,53.743378,
+ 0.678658,-0.048838,0.732829,192.246759,-31.464258,108.469786,
+ 0.678658,-0.048838,0.732829,175.527666,-12.841987,125.194056,
+ 0.678658,-0.048838,0.732829,177.440582,-25.202967,122.598769,
+ 0.08273,-0.898314,0.431495,46.211175,-101.467936,63.952542,
+ 0.08273,-0.898314,0.431495,43.459057,-106.625244,53.743378,
+ 0.08273,-0.898314,0.431495,59.210725,-102.798882,58.689297,
+ 0.284716,-0.955111,0.081853,220.906514,-52.875443,24.262523,
+ 0.284716,-0.955111,0.081853,219.293165,-55.435669,0,
+ 0.284716,-0.955111,0.081853,220.116809,-55.190143,0,
+ 0.284716,-0.955111,0.081853,219.293165,-55.435669,0,
+ 0.284716,-0.955111,0.081853,220.906514,-52.875443,24.262523,
+ 0.284716,-0.955111,0.081853,217.279273,-54.026391,23.449491,
+ 0.111572,-0.82658,0.551649,69.81846,-87.629517,80.837074,
+ 0.111572,-0.82658,0.551649,56.591459,-92.057187,76.877916,
+ 0.111572,-0.82658,0.551649,69.322309,-96.976036,66.932787,
+ -0.424499,0.901711,-0.081962,15.113139,135.611501,20.885597,
+ -0.424499,0.901711,-0.081962,40.879849,147.684705,20.258601,
+ -0.424499,0.901711,-0.081962,14.774209,133.666294,1.240672,
+ 0.922049,0.334166,0.195344,217.375126,32.531725,77.182645,
+ 0.922049,0.334166,0.195344,244.671886,-9.207369,19.73964,
+ 0.922049,0.334166,0.195344,229.001454,24.242969,36.484161,
+ 0.079072,-0.844052,0.530399,67.758471,-79.75432,93.676406,
+ 0.079072,-0.844052,0.530399,53.918456,-84.626913,87.985668,
+ 0.079072,-0.844052,0.530399,69.81846,-87.629517,80.837074,
+ 0.257926,-0.576394,0.7754,169.243745,3.164372,130.265258,
+ 0.257926,-0.576394,0.7754,158.752306,10.392192,139.127895,
+ 0.257926,-0.576394,0.7754,122.492286,-3.064184,141.186491,
+ 0.717291,-0.664743,0.208831,230.123336,-25.312636,80.341658,
+ 0.717291,-0.664743,0.208831,220.906514,-52.875443,24.262523,
+ 0.717291,-0.664743,0.208831,236.07977,-37.84789,19.980711,
+ 0.760291,0.643856,0.086063,218.954817,35.801564,38.764932,
+ 0.760291,0.643856,0.086063,217.375126,32.531725,77.182645,
+ 0.760291,0.643856,0.086063,229.001454,24.242969,36.484161,
+ 0.044422,-0.869905,0.491214,50.553261,-117.746626,34.387099,
+ 0.044422,-0.869905,0.491214,48.408947,-128.9394,14.759421,
+ 0.044422,-0.869905,0.491214,65.84113,-126.498597,17.505474,
+ 0.901644,0.412987,0.128375,217.375126,32.531725,77.182645,
+ 0.901644,0.412987,0.128375,230.862345,1.952608,80.828934,
+ 0.901644,0.412987,0.128375,244.671886,-9.207369,19.73964,
+ 0.01222,-0.942515,0.333941,27.157495,-105.803002,57.469217,
+ 0.01222,-0.942515,0.333941,16.230028,-108.855912,49.252567,
+ 0.01222,-0.942515,0.333941,28.208062,-107.282672,53.254552,
+ 0.10078,-0.84304,0.528324,50.553261,-117.746626,34.387099,
+ 0.10078,-0.84304,0.528324,65.84113,-126.498597,17.505474,
+ 0.10078,-0.84304,0.528324,79.483429,-121.900018,22.241038,
+ -0.199393,-0.059687,0.9781,110.397694,-31.863112,134.802966,
+ -0.199393,-0.059687,0.9781,69.951402,-30.45389,126.643677,
+ -0.199393,-0.059687,0.9781,81.659009,-49.753905,127.852615,
+ 0.396634,0.657261,0.64085,84.177518,92.915868,154.443433,
+ 0.396634,0.657261,0.64085,115.180313,91.201132,137.013877,
+ 0.396634,0.657261,0.64085,82.914149,103.255853,144.620583,
+ -0.03606,-0.880669,0.472358,36.139489,-111.117628,45.645908,
+ -0.03606,-0.880669,0.472358,26.524227,-113.760114,39.985207,
+ -0.03606,-0.880669,0.472358,50.553261,-117.746626,34.387099,
+ 0.525311,0.554356,0.645552,171.599188,61.747878,116.396143,
+ 0.525311,0.554356,0.645552,117.401057,108.744354,120.141845,
+ 0.525311,0.554356,0.645552,115.180313,91.201132,137.013877,
+ 0.106615,-0.869056,0.483089,69.322309,-96.976036,66.932787,
+ 0.106615,-0.869056,0.483089,46.211175,-101.467936,63.952542,
+ 0.106615,-0.869056,0.483089,59.210725,-102.798882,58.689297,
+ 0.370643,0.799342,-0.472944,154.217113,76.043004,10.822936,
+ 0.370643,0.799342,-0.472944,165.223158,64.536105,0,
+ 0.370643,0.799342,-0.472944,163.067671,65.535572,0,
+ 0.370643,0.799342,-0.472944,165.223158,64.536105,0,
+ 0.370643,0.799342,-0.472944,154.217113,76.043004,10.822936,
+ 0.370643,0.799342,-0.472944,167.942068,69.344496,10.257661,
+ -0.272355,0.803809,0.528879,181.847963,-2.756465,117.17846,
+ -0.272355,0.803809,0.528879,200.444338,7.735201,110.809372,
+ -0.272355,0.803809,0.528879,190.782569,6.585408,107.581371,
+ 0.668836,0.291545,0.683857,185.705565,38.127994,112.669336,
+ 0.668836,0.291545,0.683857,171.599188,61.747878,116.396143,
+ 0.668836,0.291545,0.683857,182.985496,38.083946,115.348436,
+ -0.143545,0.789539,0.596677,99.050894,124.374169,91.572271,
+ -0.143545,0.789539,0.596677,104.729191,128.40166,87.609044,
+ -0.143545,0.789539,0.596677,97.51367,133.222408,79.494229,
+ 0.95396,-0.203308,0.220515,154.364889,86.419772,0,
+ 0.95396,-0.203308,0.220515,152.702693,94.708882,14.83306,
+ 0.95396,-0.203308,0.220515,149.841951,74.644847,8.710371,
+ 0.95396,-0.203308,0.220515,152.702693,94.708882,14.83306,
+ 0.95396,-0.203308,0.220515,154.364889,86.419772,0,
+ 0.95396,-0.203308,0.220515,155.655436,92.475269,0,
+ 0.033844,0.970612,-0.238257,74.209443,140.955622,22.822495,
+ 0.033844,0.970612,-0.238257,90.433957,134.787627,0,
+ 0.033844,0.970612,-0.238257,81.713407,135.091701,0,
+ 0.520752,0.825468,0.21776,92.506364,136.25497,73.339275,
+ 0.520752,0.825468,0.21776,100.940523,135.925328,54.419403,
+ 0.520752,0.825468,0.21776,80.575531,147.504688,59.226183,
+ 0.286794,-0.667713,0.686956,158.752306,10.392192,139.127895,
+ 0.286794,-0.667713,0.686956,134.633334,13.304454,152.027883,
+ 0.286794,-0.667713,0.686956,122.492286,-3.064184,141.186491,
+ -0.35082,0.827121,0.439086,55.150209,132.694444,114.671927,
+ -0.35082,0.827121,0.439086,42.639133,141.276971,88.508698,
+ -0.35082,0.827121,0.439086,17.156982,126.446608,96.085464,
+ 0.128022,0.825457,0.549756,92.803323,128.952007,84.235509,
+ 0.128022,0.825457,0.549756,92.506364,136.25497,73.339275,
+ 0.128022,0.825457,0.549756,80.575531,147.504688,59.226183,
+ 0.261903,0.71714,0.645846,52.400529,109.465494,150.099319,
+ 0.261903,0.71714,0.645846,82.914149,103.255853,144.620583,
+ 0.261903,0.71714,0.645846,86.877537,123.240669,120.822424,
+ 0.305331,-0.923169,0.233522,105.034438,-122.745505,8.502923,
+ 0.305331,-0.923169,0.233522,103.752037,-125.320524,0,
+ 0.305331,-0.923169,0.233522,108.886628,-123.622299,0,
+ 0.629212,0.311955,0.711882,142.184757,40.136739,150.753155,
+ 0.629212,0.311955,0.711882,138.513419,64.817661,143.182687,
+ 0.629212,0.311955,0.711882,121.745973,65.826435,157.560879,
+ 0.922979,-0.126686,0.363402,188.47691,22.194526,115.462673,
+ 0.922979,-0.126686,0.363402,183.423791,9.845405,123.991707,
+ 0.922979,-0.126686,0.363402,188.631026,7.319585,109.885688,
+ 0.203416,-0.849263,0.487211,96.959891,-55.539496,119.629086,
+ 0.203416,-0.849263,0.487211,73.309923,-64.919561,113.152737,
+ 0.203416,-0.849263,0.487211,90.833988,-65.807164,104.289034,
+ 0.28233,-0.415921,0.864465,199.912194,-15.002224,116.190826,
+ 0.28233,-0.415921,0.864465,175.527666,-12.841987,125.194056,
+ 0.28233,-0.415921,0.864465,194.042044,-29.310002,111.224075,
+ 0.413881,-0.872834,0.258579,127.481673,-107.995583,26.678751,
+ 0.413881,-0.872834,0.258579,116.667881,-115.944921,17.154236,
+ 0.413881,-0.872834,0.258579,120.980843,-116.596331,8.052078,
+ 0.506423,-0.831353,0.228884,212.790998,-43.18861,72.745222,
+ 0.506423,-0.831353,0.228884,203.261353,-59.961003,32.909476,
+ 0.506423,-0.831353,0.228884,217.279273,-54.026391,23.449491,
+ 0.765993,0.122427,0.631083,188.47691,22.194526,115.462673,
+ 0.765993,0.122427,0.631083,177.169525,16.252385,130.34006,
+ 0.765993,0.122427,0.631083,183.423791,9.845405,123.991707,
+ 0.727482,0.255996,0.636582,182.985496,38.083946,115.348436,
+ 0.727482,0.255996,0.636582,180.965844,37.978047,117.699068,
+ 0.727482,0.255996,0.636582,188.47691,22.194526,115.462673,
+ 0.836498,-0.547134,0.030255,212.790998,-43.18861,72.745222,
+ 0.836498,-0.547134,0.030255,204.926966,-54.828599,79.673579,
+ 0.836498,-0.547134,0.030255,203.261353,-59.961003,32.909476,
+ -0.180589,0.940827,-0.286763,69.818746,140.726385,22.699052,
+ -0.180589,0.940827,-0.286763,77.223193,135.22901,0,
+ -0.180589,0.940827,-0.286763,67.450715,133.353209,0,
+ 0.083345,-0.995887,-0.035522,151.306132,-73.138264,55.182438,
+ 0.083345,-0.995887,-0.035522,175.488835,-69.691512,15.290202,
+ 0.083345,-0.995887,-0.035522,178.483892,-69.975679,30.284248,
+ 0.571759,-0.817012,0.074721,135.233433,-108.33085,9.900609,
+ 0.571759,-0.817012,0.074721,125.755126,-115.869412,0,
+ 0.571759,-0.817012,0.074721,131.463872,-111.874331,0,
+ 0.020076,0.756296,0.653922,5.632285,83.126985,172.182273,
+ 0.020076,0.756296,0.653922,14.5834,83.57619,171.387942,
+ 0.020076,0.756296,0.653922,15.643772,92.962805,160.499265,
+ 0.102077,0.843548,0.527263,5.365449,93.63519,161.475368,
+ 0.102077,0.843548,0.527263,16.784673,99.678211,149.596636,
+ 0.102077,0.843548,0.527263,5.180551,101.01579,149.703219,
+ 0.082211,0.844699,0.52889,15.643772,92.962805,160.499265,
+ 0.082211,0.844699,0.52889,42.836379,91.297732,158.931725,
+ 0.082211,0.844699,0.52889,16.784673,99.678211,149.596636,
+ 0.10535,0.841747,0.529493,5.365449,93.63519,161.475368,
+ 0.10535,0.841747,0.529493,15.643772,92.962805,160.499265,
+ 0.10535,0.841747,0.529493,16.784673,99.678211,149.596636,
+ 0.112447,0.710571,0.694582,5.632285,83.126985,172.182273,
+ 0.112447,0.710571,0.694582,15.643772,92.962805,160.499265,
+ 0.112447,0.710571,0.694582,5.365449,93.63519,161.475368,
+ 0.159134,0.83758,0.522625,-0.040863,101.685195,150.220266,
+ 0.159134,0.83758,0.522625,5.365449,93.63519,161.475368,
+ 0.159134,0.83758,0.522625,5.180551,101.01579,149.703219,
+ 0.159134,0.83758,0.522625,5.365449,93.63519,161.475368,
+ 0.159134,0.83758,0.522625,-0.040863,101.685195,150.220266,
+ 0.159134,0.83758,0.522625,-0.040509,100.803638,151.632977,
+ -0.004326,0.993079,-0.117365,-0.05021,124.944126,3.540303,
+ -0.004326,0.993079,-0.117365,1.49613,124.532458,0,
+ -0.004326,0.993079,-0.117365,-0.050042,124.525723,0,
+ -0.004326,0.993079,-0.117365,1.49613,124.532458,0,
+ -0.004326,0.993079,-0.117365,-0.05021,124.944126,3.540303,
+ -0.004326,0.993079,-0.117365,1.272205,124.94909,3.533556,
+ 0.125732,-0.980811,0.149003,21.013271,-47.658919,167.591662,
+ 0.125732,-0.980811,0.149003,11.141954,-52.178364,146.172039,
+ 0.125732,-0.980811,0.149003,26.946825,-49.765563,148.717814,
+ 0.209954,-0.961495,-0.17733,15.073936,-57.978833,161.185464,
+ 0.209954,-0.961495,-0.17733,0.024537,-61.058684,160.0665,
+ 0.209954,-0.961495,-0.17733,0.024525,-61.030078,159.911384,
+ 0.209954,-0.961495,-0.17733,0.024537,-61.058684,160.0665,
+ 0.209954,-0.961495,-0.17733,15.073936,-57.978833,161.185464,
+ 0.209954,-0.961495,-0.17733,19.022387,-59.834804,175.923518,
+ -0.391575,-0.869993,0.299635,3.709604,-122.687886,8.341983,
+ -0.391575,-0.869993,0.299635,3.960323,-125.048345,1.816025,
+ -0.391575,-0.869993,0.299635,8.697919,-125.028882,8.063802,
+ 0.214522,-0.890886,-0.400378,15.073936,-57.978833,161.185464,
+ 0.214522,-0.890886,-0.400378,0.024477,-60.909629,159.643345,
+ 0.214522,-0.890886,-0.400378,11.141954,-52.178364,146.172039,
+ 0.214522,-0.890886,-0.400378,0.024477,-60.909629,159.643345,
+ 0.214522,-0.890886,-0.400378,15.073936,-57.978833,161.185464,
+ 0.214522,-0.890886,-0.400378,0.024525,-61.030078,159.911384,
+ -0.190826,-0.921441,0.338425,1.539574,-120.179325,13.948521,
+ -0.190826,-0.921441,0.338425,3.709604,-122.687886,8.341983,
+ -0.190826,-0.921441,0.338425,7.777562,-121.659896,13.434695,
+ -0.176208,-0.923259,0.341385,3.495139,-115.449332,28.07043,
+ -0.176208,-0.923259,0.341385,2.321716,-118.133588,20.205309,
+ -0.176208,-0.923259,0.341385,10.853295,-117.028258,27.598269,
+ 0.860232,-0.423618,-0.28381,30.914353,-44.466612,189.029501,
+ 0.860232,-0.423618,-0.28381,19.022387,-59.834804,175.923518,
+ 0.860232,-0.423618,-0.28381,15.073936,-57.978833,161.185464,
+ -0.084978,-0.933541,0.348254,5.242445,-111.886028,38.048697,
+ -0.084978,-0.933541,0.348254,0.046248,-115.08593,28.203008,
+ -0.084978,-0.933541,0.348254,3.495139,-115.449332,28.07043,
+ -0.084978,-0.933541,0.348254,0.046248,-115.08593,28.203008,
+ -0.084978,-0.933541,0.348254,5.242445,-111.886028,38.048697,
+ -0.084978,-0.933541,0.348254,0.046084,-114.67681,29.29967,
+ 0.951368,-0.265514,-0.156207,56.866376,-3.606718,186.776537,
+ 0.951368,-0.265514,-0.156207,49.282414,-26.455824,179.424854,
+ 0.951368,-0.265514,-0.156207,47.824512,-15.831453,152.48677,
+ -0.138387,-0.913427,0.382754,16.230028,-108.855912,49.252567,
+ -0.138387,-0.913427,0.382754,5.242445,-111.886028,38.048697,
+ -0.138387,-0.913427,0.382754,10.585427,-112.507683,38.496925,
+ -0.032956,-0.871449,0.489377,11.829676,-101.566745,65.710962,
+ -0.032956,-0.871449,0.489377,0.040668,-101.19972,65.570634,
+ -0.032956,-0.871449,0.489377,0.04073,-101.353858,65.296159,
+ -0.032956,-0.871449,0.489377,0.040668,-101.19972,65.570634,
+ -0.032956,-0.871449,0.489377,11.829676,-101.566745,65.710962,
+ -0.032956,-0.871449,0.489377,15.565033,-96.62434,74.763607,
+ -0.070472,-0.929594,0.361786,18.608729,-105.707424,57.805824,
+ -0.070472,-0.929594,0.361786,9.262109,-105.193971,57.304498,
+ -0.070472,-0.929594,0.361786,16.230028,-108.855912,49.252567,
+ -0.192713,-0.925298,0.326628,2.321716,-118.133588,20.205309,
+ -0.192713,-0.925298,0.326628,1.539574,-120.179325,13.948521,
+ -0.192713,-0.925298,0.326628,7.777562,-121.659896,13.434695,
+ -0.295569,-0.908523,0.295338,0.964621,-121.921903,8.435582,
+ -0.295569,-0.908523,0.295338,0.607191,-124.022044,1.617393,
+ -0.295569,-0.908523,0.295338,3.960323,-125.048345,1.816025,
+ -0.015676,-0.949787,0.312505,2.321716,-118.133588,20.205309,
+ -0.015676,-0.949787,0.312505,0.048281,-120.14411,13.98074,
+ -0.015676,-0.949787,0.312505,1.539574,-120.179325,13.948521,
+ -0.015676,-0.949787,0.312505,0.048281,-120.14411,13.98074,
+ -0.015676,-0.949787,0.312505,2.321716,-118.133588,20.205309,
+ -0.015676,-0.949787,0.312505,0.048087,-119.662136,15.445584,
+ -0.036152,-0.913511,0.405204,26.560488,-102.028779,65.98362,
+ -0.036152,-0.913511,0.405204,11.829676,-101.566745,65.710962,
+ -0.036152,-0.913511,0.405204,9.262109,-105.193971,57.304498,
+ -0.030721,-0.914294,0.403883,11.829676,-101.566745,65.710962,
+ -0.030721,-0.914294,0.403883,0.040805,-101.54027,64.874174,
+ -0.030721,-0.914294,0.403883,9.262109,-105.193971,57.304498,
+ -0.030721,-0.914294,0.403883,0.040805,-101.54027,64.874174,
+ -0.030721,-0.914294,0.403883,11.829676,-101.566745,65.710962,
+ -0.030721,-0.914294,0.403883,0.04073,-101.353858,65.296159,
+ -0.16719,-0.928434,0.331751,10.853295,-117.028258,27.598269,
+ -0.16719,-0.928434,0.331751,2.321716,-118.133588,20.205309,
+ -0.16719,-0.928434,0.331751,8.548232,-119.469153,19.60554,
+ 0.061288,-0.834772,0.547174,38.257721,-89.224519,83.511038,
+ 0.061288,-0.834772,0.547174,17.323411,-90.820879,83.420443,
+ 0.061288,-0.834772,0.547174,15.565033,-96.62434,74.763607,
+ 0.022751,-0.791595,0.610622,38.257721,-89.224519,83.511038,
+ 0.022751,-0.791595,0.610622,15.565033,-96.62434,74.763607,
+ 0.022751,-0.791595,0.610622,31.038944,-96.193129,74.746069,
+ 0.023962,-0.83768,0.545635,15.565033,-96.62434,74.763607,
+ 0.023962,-0.83768,0.545635,26.560488,-102.028779,65.98362,
+ 0.023962,-0.83768,0.545635,31.038944,-96.193129,74.746069,
+ -0.036388,-0.870735,0.490404,15.565033,-96.62434,74.763607,
+ -0.036388,-0.870735,0.490404,11.829676,-101.566745,65.710962,
+ -0.036388,-0.870735,0.490404,26.560488,-102.028779,65.98362,
+ 0.055035,-0.758569,0.649264,27.875894,-83.27462,91.342634,
+ 0.055035,-0.758569,0.649264,17.323411,-90.820879,83.420443,
+ 0.055035,-0.758569,0.649264,38.257721,-89.224519,83.511038,
+ 0.04382,-0.751885,0.657837,27.875894,-83.27462,91.342634,
+ 0.04382,-0.751885,0.657837,13.960596,-84.596113,90.759142,
+ 0.04382,-0.751885,0.657837,17.323411,-90.820879,83.420443,
+ 0.02595,-0.756458,0.653527,17.323411,-90.820879,83.420443,
+ 0.02595,-0.756458,0.653527,0.036684,-91.286591,83.567799,
+ 0.02595,-0.756458,0.653527,0.036761,-91.478244,83.345958,
+ 0.02595,-0.756458,0.653527,0.036684,-91.286591,83.567799,
+ 0.02595,-0.756458,0.653527,17.323411,-90.820879,83.420443,
+ 0.02595,-0.756458,0.653527,13.960596,-84.596113,90.759142,
+ -0.020265,-0.726791,0.68656,16.455431,-77.791967,98.035636,
+ -0.020265,-0.726791,0.68656,0.031628,-78.704118,96.585261,
+ -0.020265,-0.726791,0.68656,13.960596,-84.596113,90.759142,
+ -0.020265,-0.726791,0.68656,0.031628,-78.704118,96.585261,
+ -0.020265,-0.726791,0.68656,16.455431,-77.791967,98.035636,
+ -0.020265,-0.726791,0.68656,0.031551,-78.51366,96.786876,
+ -0.137816,-0.786066,0.602584,7.283371,-67.124654,109.853326,
+ -0.137816,-0.786066,0.602584,0.026788,-66.660999,108.798524,
+ -0.137816,-0.786066,0.602584,16.455431,-77.791967,98.035636,
+ -0.137816,-0.786066,0.602584,0.026788,-66.660999,108.798524,
+ -0.137816,-0.786066,0.602584,7.283371,-67.124654,109.853326,
+ -0.137816,-0.786066,0.602584,0.026698,-66.436388,109.091506,
+ 0.092366,0.855209,0.509986,42.836379,91.297732,158.931725,
+ 0.092366,0.855209,0.509986,43.302622,93.048617,155.911173,
+ 0.092366,0.855209,0.509986,16.784673,99.678211,149.596636,
+ 0.84739,-0.44277,-0.293061,28.090565,-54.735728,194.440325,
+ 0.84739,-0.44277,-0.293061,21.922794,-64.839688,191.871678,
+ 0.84739,-0.44277,-0.293061,19.022387,-59.834804,175.923518,
+ 0.390312,-0.72508,-0.567376,7.369323,-76.326309,188.982436,
+ 0.390312,-0.72508,-0.567376,0.014461,-78.045278,186.119601,
+ 0.390312,-0.72508,-0.567376,19.022387,-59.834804,175.923518,
+ 0.390312,-0.72508,-0.567376,0.014461,-78.045278,186.119601,
+ 0.390312,-0.72508,-0.567376,7.369323,-76.326309,188.982436,
+ 0.390312,-0.72508,-0.567376,3.3862,-78.122399,188.537662,
+ 0.623825,-0.706108,-0.335044,21.922794,-64.839688,191.871678,
+ 0.623825,-0.706108,-0.335044,7.369323,-76.326309,188.982436,
+ 0.623825,-0.706108,-0.335044,19.022387,-59.834804,175.923518,
+ 0.861498,-0.401008,-0.311471,30.914353,-44.466612,189.029501,
+ 0.861498,-0.401008,-0.311471,28.090565,-54.735728,194.440325,
+ 0.861498,-0.401008,-0.311471,19.022387,-59.834804,175.923518,
+ 0.861498,-0.401008,-0.311471,28.090565,-54.735728,194.440325,
+ 0.861498,-0.401008,-0.311471,30.914353,-44.466612,189.029501,
+ 0.861498,-0.401008,-0.311471,31.964186,-47.787146,196.208315,
+ 0.895751,-0.338874,-0.28774,33.922059,-43.53251,197.292556,
+ 0.895751,-0.338874,-0.28774,31.964186,-47.787146,196.208315,
+ 0.895751,-0.338874,-0.28774,30.914353,-44.466612,189.029501,
+ 0.688027,-0.705322,-0.170704,36.964383,-40.735554,197.998133,
+ 0.688027,-0.705322,-0.170704,33.922059,-43.53251,197.292556,
+ 0.688027,-0.705322,-0.170704,30.914353,-44.466612,189.029501,
+ 0.430252,-0.898822,0.083683,43.487052,-38.097247,192.799619,
+ 0.430252,-0.898822,0.083683,36.964383,-40.735554,197.998133,
+ 0.430252,-0.898822,0.083683,30.914353,-44.466612,189.029501,
+ 0.430252,-0.898822,0.083683,36.964383,-40.735554,197.998133,
+ 0.430252,-0.898822,0.083683,43.487052,-38.097247,192.799619,
+ 0.430252,-0.898822,0.083683,45.287167,-36.657264,199.011016,
+ 0.838328,-0.517106,-0.172649,54.984704,-22.713124,202.551062,
+ 0.838328,-0.517106,-0.172649,43.487052,-38.097247,192.799619,
+ 0.838328,-0.517106,-0.172649,35.203952,-44.177944,170.792048,
+ 0.838328,-0.517106,-0.172649,43.487052,-38.097247,192.799619,
+ 0.838328,-0.517106,-0.172649,54.984704,-22.713124,202.551062,
+ 0.838328,-0.517106,-0.172649,52.707151,-26.116843,201.686581,
+ 0.802642,-0.587531,-0.102825,49.282414,-26.455824,179.424854,
+ 0.802642,-0.587531,-0.102825,54.984704,-22.713124,202.551062,
+ 0.802642,-0.587531,-0.102825,35.203952,-44.177944,170.792048,
+ 0.802642,-0.587531,-0.102825,54.984704,-22.713124,202.551062,
+ 0.802642,-0.587531,-0.102825,49.282414,-26.455824,179.424854,
+ 0.802642,-0.587531,-0.102825,56.198203,-21.125779,202.953597,
+ 0.935946,-0.281719,-0.211283,63.043071,-2.039127,207.825539,
+ 0.935946,-0.281719,-0.211283,56.198203,-21.125779,202.953597,
+ 0.935946,-0.281719,-0.211283,49.282414,-26.455824,179.424854,
+ 0.889664,-0.456093,-0.021848,66.873983,15.726958,190.687345,
+ 0.889664,-0.456093,-0.021848,66.775277,14.510687,212.058972,
+ 0.889664,-0.456093,-0.021848,56.866376,-3.606718,186.776537,
+ 0.889664,-0.456093,-0.021848,66.775277,14.510687,212.058972,
+ 0.889664,-0.456093,-0.021848,66.873983,15.726958,190.687345,
+ 0.889664,-0.456093,-0.021848,67.518707,15.943362,212.423727,
+ 0.985825,0.164908,-0.030882,63.571226,38.003357,204.209969,
+ 0.985825,0.164908,-0.030882,67.518707,15.943362,212.423727,
+ 0.985825,0.164908,-0.030882,66.873983,15.726958,190.687345,
+ 0.985825,0.164908,-0.030882,67.518707,15.943362,212.423727,
+ 0.985825,0.164908,-0.030882,63.571226,38.003357,204.209969,
+ 0.985825,0.164908,-0.030882,67.1428,18.30434,213.031386,
+ 0.305247,0.911824,0.274594,20.215178,59.061842,219.079992,
+ 0.305247,0.911824,0.274594,43.021055,50.713381,221.450414,
+ 0.305247,0.911824,0.274594,43.1773,51.476876,218.741447,
+ 0.305247,0.911824,0.274594,43.021055,50.713381,221.450414,
+ 0.305247,0.911824,0.274594,20.215178,59.061842,219.079992,
+ 0.305247,0.911824,0.274594,30.499226,54.590084,222.496975,
+ 0.938642,-0.2284,-0.258429,56.866376,-3.606718,186.776537,
+ 0.938642,-0.2284,-0.258429,63.043071,-2.039127,207.825539,
+ 0.938642,-0.2284,-0.258429,49.282414,-26.455824,179.424854,
+ 0.938642,-0.2284,-0.258429,63.043071,-2.039127,207.825539,
+ 0.938642,-0.2284,-0.258429,56.866376,-3.606718,186.776537,
+ 0.938642,-0.2284,-0.258429,63.807098,0.396729,208.44775,
+ 0.957787,0.242673,0.154126,63.571226,38.003357,204.209969,
+ 0.957787,0.242673,0.154126,64.061482,28.75393,215.726671,
+ 0.957787,0.242673,0.154126,67.1428,18.30434,213.031386,
+ 0.957787,0.242673,0.154126,64.061482,28.75393,215.726671,
+ 0.957787,0.242673,0.154126,63.571226,38.003357,204.209969,
+ 0.957787,0.242673,0.154126,61.886329,36.690603,216.747382,
+ 0.964162,0.265209,-0.007524,61.886329,36.690603,216.747382,
+ 0.964162,0.265209,-0.007524,62.196749,35.583076,217.487517,
+ 0.964162,0.265209,-0.007524,64.061482,28.75393,215.726671,
+ 0.067998,0.981579,0.178549,15.710544,58.556118,223.57576,
+ 0.067998,0.981579,0.178549,20.215178,59.061842,219.079992,
+ 0.067998,0.981579,0.178549,5.021595,60.165404,218.799389,
+ 0.067998,0.981579,0.178549,20.215178,59.061842,219.079992,
+ 0.067998,0.981579,0.178549,15.710544,58.556118,223.57576,
+ 0.067998,0.981579,0.178549,20.227251,58.260404,223.481331,
+ -0.030343,0.924709,0.379464,15.710544,58.556118,223.57576,
+ -0.030343,0.924709,0.379464,5.021595,60.165404,218.799389,
+ -0.030343,0.924709,0.379464,5.10187,58.225041,223.534243,
+ 0.95113,-0.128139,-0.28095,66.775277,14.510687,212.058972,
+ 0.95113,-0.128139,-0.28095,63.807098,0.396729,208.44775,
+ 0.95113,-0.128139,-0.28095,56.866376,-3.606718,186.776537,
+ -0.245488,0.89565,0.370873,3.3862,-78.122399,188.537662,
+ -0.245488,0.89565,0.370873,0.014461,-78.045278,186.119601,
+ -0.245488,0.89565,0.370873,0.020642,-78.961364,188.33602,
+ 0.000582,0.925307,0.379219,-0.024173,60.154222,218.834412,
+ 0.000582,0.925307,0.379219,1.908078,58.221846,223.546512,
+ 0.000582,0.925307,0.379219,5.021595,60.165404,218.799389,
+ 0.000582,0.925307,0.379219,1.908078,58.221846,223.546512,
+ 0.000582,0.925307,0.379219,-0.024173,60.154222,218.834412,
+ 0.000582,0.925307,0.379219,-0.023396,58.22001,223.553957,
+ 0.000531,0.925319,0.37919,1.908078,58.221846,223.546512,
+ 0.000531,0.925319,0.37919,5.10187,58.225041,223.534243,
+ 0.000531,0.925319,0.37919,5.021595,60.165404,218.799389,
+ 0.345911,0.923255,0.167166,20.227251,58.260404,223.481331,
+ 0.345911,0.923255,0.167166,30.499226,54.590084,222.496975,
+ 0.345911,0.923255,0.167166,20.215178,59.061842,219.079992,
+ 0.595068,0.763924,0.249626,43.021055,50.713381,221.450414,
+ 0.595068,0.763924,0.249626,46.89049,47.937302,220.72187,
+ 0.595068,0.763924,0.249626,43.1773,51.476876,218.741447,
+ 0.620957,0.759615,0.193385,43.1773,51.476876,218.741447,
+ 0.620957,0.759615,0.193385,61.819062,36.497038,217.723701,
+ 0.620957,0.759615,0.193385,61.886329,36.690603,216.747382,
+ 0.620957,0.759615,0.193385,61.819062,36.497038,217.723701,
+ 0.620957,0.759615,0.193385,43.1773,51.476876,218.741447,
+ 0.620957,0.759615,0.193385,46.89049,47.937302,220.72187,
+ 0.810849,-0.582582,-0.055873,52.707151,-26.116843,201.686581,
+ 0.810849,-0.582582,-0.055873,47.060035,-33.789908,199.739868,
+ 0.810849,-0.582582,-0.055873,43.487052,-38.097247,192.799619,
+ 0.85776,-0.496412,-0.133503,47.060035,-33.789908,199.739868,
+ 0.85776,-0.496412,-0.133503,45.287167,-36.657264,199.011016,
+ 0.85776,-0.496412,-0.133503,43.487052,-38.097247,192.799619,
+ 0.083743,0.750708,0.655305,14.5834,83.57619,171.387942,
+ 0.083743,0.750708,0.655305,42.836379,91.297732,158.931725,
+ 0.083743,0.750708,0.655305,15.643772,92.962805,160.499265,
+ 0.373491,-0.688659,0.621493,110.087234,14.508254,168.112948,
+ 0.373491,-0.688659,0.621493,122.492286,-3.064184,141.186491,
+ 0.373491,-0.688659,0.621493,134.633334,13.304454,152.027883,
+ -0.263034,0.896696,0.356019,4.833566,65.392176,204.372944,
+ -0.263034,0.896696,0.356019,26.691457,77.520755,189.974017,
+ -0.263034,0.896696,0.356019,4.959503,70.921467,190.539486,
+ 0.894564,-0.354893,-0.271673,47.824512,-15.831453,152.48677,
+ 0.894564,-0.354893,-0.271673,40.763424,-34.083267,153.078788,
+ 0.894564,-0.354893,-0.271673,37.767507,-28.252174,135.596522,
+ 0.205259,-0.779043,0.59242,81.202842,-19.484522,137.170263,
+ 0.205259,-0.779043,0.59242,69.951402,-30.45389,126.643677,
+ 0.205259,-0.779043,0.59242,94.568308,-19.202409,132.910445,
+ 0.199645,-0.96846,-0.14909,151.306132,-73.138264,55.182438,
+ 0.199645,-0.96846,-0.14909,165.289005,-61.760633,0,
+ 0.199645,-0.96846,-0.14909,167.504833,-61.303848,0,
+ 0.199645,-0.96846,-0.14909,165.289005,-61.760633,0,
+ 0.199645,-0.96846,-0.14909,151.306132,-73.138264,55.182438,
+ 0.199645,-0.96846,-0.14909,149.062846,-68.599379,22.694837,
+ 0.199645,-0.96846,-0.14909,149.062846,-68.599379,22.694837,
+ 0.199645,-0.96846,-0.14909,151.306132,-73.138264,55.182438,
+ 0.199645,-0.96846,-0.14909,148.739748,-68.968812,24.661947,
+ 0.199645,-0.96846,-0.14909,148.739748,-68.968812,24.661947,
+ 0.199645,-0.96846,-0.14909,151.306132,-73.138264,55.182438,
+ 0.199645,-0.96846,-0.14909,147.453743,-69.713071,27.774423,
+ 0.199645,-0.96846,-0.14909,147.453743,-69.713071,27.774423,
+ 0.199645,-0.96846,-0.14909,151.306132,-73.138264,55.182438,
+ 0.199645,-0.96846,-0.14909,147.069139,-70.028619,29.309139,
+ 0.183087,-0.771959,0.608735,54.956246,-16.536624,148.802692,
+ 0.183087,-0.771959,0.608735,69.951402,-30.45389,126.643677,
+ 0.183087,-0.771959,0.608735,81.202842,-19.484522,137.170263,
+ -0.163994,-0.982237,-0.091197,151.306132,-73.138264,55.182438,
+ -0.163994,-0.982237,-0.091197,145.567389,-70.279869,34.715733,
+ -0.163994,-0.982237,-0.091197,147.069139,-70.028619,29.309139,
+ -0.163994,-0.982237,-0.091197,145.567389,-70.279869,34.715733,
+ -0.163994,-0.982237,-0.091197,151.306132,-73.138264,55.182438,
+ -0.163994,-0.982237,-0.091197,145.427918,-70.316374,35.359713,
+ -0.163994,-0.982237,-0.091197,145.427918,-70.316374,35.359713,
+ -0.163994,-0.982237,-0.091197,151.306132,-73.138264,55.182438,
+ -0.163994,-0.982237,-0.091197,145.045248,-70.421306,37.178016,
+ -0.163994,-0.982237,-0.091197,145.045248,-70.421306,37.178016,
+ -0.163994,-0.982237,-0.091197,151.306132,-73.138264,55.182438,
+ -0.163994,-0.982237,-0.091197,144.352557,-70.566689,39.98948,
+ 0.12817,-0.578857,0.805293,41.745409,-29.08111,133.547228,
+ 0.12817,-0.578857,0.805293,28.889074,-43.066739,125.540353,
+ 0.12817,-0.578857,0.805293,35.226848,-43.619047,124.134624,
+ 0.047026,-0.305298,0.951095,69.951402,-30.45389,126.643677,
+ 0.047026,-0.305298,0.951095,35.226848,-43.619047,124.134624,
+ 0.047026,-0.305298,0.951095,41.22377,-49.557017,121.932046,
+ 0.163247,0.819878,0.548771,52.664801,96.41855,158.584653,
+ 0.163247,0.819878,0.548771,84.177518,92.915868,154.443433,
+ 0.163247,0.819878,0.548771,51.983184,97.629933,156.977581,
+ 0.745998,-0.5981,-0.292855,143.932469,-70.890522,41.969174,
+ 0.745998,-0.5981,-0.292855,148.999438,-74.193749,61.622646,
+ 0.745998,-0.5981,-0.292855,143.872747,-71.323793,42.701919,
+ 0.361956,-0.889781,-0.277989,0.024477,-60.909629,159.643345,
+ 0.361956,-0.889781,-0.277989,0.02275,-56.612896,145.888224,
+ 0.361956,-0.889781,-0.277989,11.141954,-52.178364,146.172039,
+ 0.007148,-0.955447,0.295077,0.607191,-124.022044,1.617393,
+ 0.007148,-0.955447,0.295077,0.050042,-124.525723,0,
+ 0.007148,-0.955447,0.295077,0.587015,-124.521705,0,
+ 0.007148,-0.955447,0.295077,0.050042,-124.525723,0,
+ 0.007148,-0.955447,0.295077,0.607191,-124.022044,1.617393,
+ 0.007148,-0.955447,0.295077,0.04984,-124.025277,1.620425,
+ 0.000279,0.94028,0.340402,-0.024173,60.154222,218.834412,
+ 0.000279,0.94028,0.340402,5.021595,60.165404,218.799389,
+ 0.000279,0.94028,0.340402,-0.026187,65.164127,204.995717,
+ 0.318109,-0.749457,0.580621,66.873983,15.726958,190.687345,
+ 0.318109,-0.749457,0.580621,67.963075,-3.106047,165.781307,
+ 0.318109,-0.749457,0.580621,76.802961,15.141951,184.492374,
+ 0.161218,-0.979897,-0.11752,19.022387,-59.834804,175.923518,
+ 0.161218,-0.979897,-0.11752,0.025194,-62.693521,173.698845,
+ 0.161218,-0.979897,-0.11752,0.024537,-61.058684,160.0665,
+ 0.404005,0.694239,0.595661,85.433587,88.722008,158.479427,
+ 0.404005,0.694239,0.595661,115.290055,79.668852,148.780795,
+ 0.404005,0.694239,0.595661,84.177518,92.915868,154.443433,
+ -0.003225,0.995179,0.098023,-0.049201,122.433334,85.564325,
+ -0.003225,0.995179,0.098023,2.318026,121.354972,96.590279,
+ -0.003225,0.995179,0.098023,0.50371,122.994432,79.885969,
+ -0.003225,0.995179,0.098023,2.318026,121.354972,96.590279,
+ -0.003225,0.995179,0.098023,-0.049201,122.433334,85.564325,
+ -0.003225,0.995179,0.098023,-0.048764,121.346127,96.602203,
+ 0.895599,-0.3527,-0.271119,37.767507,-28.252174,135.596522,
+ 0.895599,-0.3527,-0.271119,40.763424,-34.083267,153.078788,
+ 0.895599,-0.3527,-0.271119,28.889074,-43.066739,125.540353,
+ -0.001604,0.928818,0.370532,-0.043951,109.370262,126.622325,
+ -0.001604,0.928818,0.370532,2.318026,121.354972,96.590279,
+ -0.001604,0.928818,0.370532,-0.048764,121.346127,96.602203,
+ -0.245075,-0.916786,0.315345,1.539574,-120.179325,13.948521,
+ -0.245075,-0.916786,0.315345,0.964621,-121.921903,8.435582,
+ -0.245075,-0.916786,0.315345,3.709604,-122.687886,8.341983,
+ 0.007366,0.832586,0.553847,4.959503,70.921467,190.539486,
+ 0.007366,0.832586,0.553847,14.5834,83.57619,171.387942,
+ 0.007366,0.832586,0.553847,5.632285,83.126985,172.182273,
+ -0.003208,0.995179,0.098025,-0.049201,122.433334,85.564325,
+ -0.003208,0.995179,0.098025,0.50371,122.994432,79.885969,
+ -0.003208,0.995179,0.098025,-0.049425,122.99236,79.888898,
+ -0.001589,0.928818,0.370533,-0.043951,109.370262,126.622325,
+ -0.001589,0.928818,0.370533,4.99966,105.26362,136.938107,
+ -0.001589,0.928818,0.370533,2.318026,121.354972,96.590279,
+ -0.001589,0.928818,0.370533,4.99966,105.26362,136.938107,
+ -0.001589,0.928818,0.370533,-0.043951,109.370262,126.622325,
+ -0.001589,0.928818,0.370533,-0.042293,105.244748,136.963796,
+ 0.154781,0.661942,0.7334,5.365449,93.63519,161.475368,
+ 0.154781,0.661942,0.7334,-0.037901,94.31417,162.002896,
+ 0.154781,0.661942,0.7334,-0.033748,83.97974,171.329537,
+ -0.002498,0.97585,0.218428,-0.05002,124.471023,73.282809,
+ -0.002498,0.97585,0.218428,0.50371,122.994432,79.885969,
+ -0.002498,0.97585,0.218428,1.604111,126.574505,63.904192,
+ -0.002498,0.97585,0.218428,0.50371,122.994432,79.885969,
+ -0.002498,0.97585,0.218428,-0.05002,124.471023,73.282809,
+ -0.002498,0.97585,0.218428,-0.049425,122.99236,79.888898,
+ -0.002532,0.975851,0.218422,-0.05002,124.471023,73.282809,
+ -0.002532,0.975851,0.218422,1.604111,126.574505,63.904192,
+ -0.002532,0.975851,0.218422,-0.050862,126.568328,63.912607,
+ -0.134928,-0.439831,0.887887,7.283371,-67.124654,109.853326,
+ -0.134928,-0.439831,0.887887,0.024219,-60.267005,112.147248,
+ -0.134928,-0.439831,0.887887,0.026698,-66.436388,109.091506,
+ -0.000245,0.928595,0.371093,-0.026273,65.378808,204.403186,
+ -0.000245,0.928595,0.371093,4.833566,65.392176,204.372944,
+ -0.000245,0.928595,0.371093,-0.028355,70.558821,191.441123,
+ 0.000983,0.832751,0.553646,-0.028494,70.906919,190.570224,
+ 0.000983,0.832751,0.553646,4.959503,70.921467,190.539486,
+ 0.000983,0.832751,0.553646,-0.032961,82.02222,173.851463,
+ 0.366543,-0.90535,-0.214448,11.141954,-52.178364,146.172039,
+ 0.366543,-0.90535,-0.214448,0.02275,-56.612896,145.888224,
+ 0.366543,-0.90535,-0.214448,0.019895,-49.506508,115.88178,
+ 0.007145,-0.955772,0.294023,0.964621,-121.921903,8.435582,
+ 0.007145,-0.955772,0.294023,0.04984,-124.025277,1.620425,
+ 0.007145,-0.955772,0.294023,0.607191,-124.022044,1.617393,
+ 0.007145,-0.955772,0.294023,0.04984,-124.025277,1.620425,
+ 0.007145,-0.955772,0.294023,0.964621,-121.921903,8.435582,
+ 0.007145,-0.955772,0.294023,0.049463,-123.085362,4.675793,
+ -0.334361,-0.218164,0.916846,2.772457,-51.749161,115.354443,
+ -0.334361,-0.218164,0.916846,0.019977,-49.712843,114.835197,
+ -0.334361,-0.218164,0.916846,0.023663,-58.885029,112.654016,
+ 0.008222,-0.955838,0.293781,0.048998,-121.928291,8.440424,
+ 0.008222,-0.955838,0.293781,0.049463,-123.085362,4.675793,
+ 0.008222,-0.955838,0.293781,0.964621,-121.921903,8.435582,
+ 0.00827,-0.950946,0.309246,0.048585,-120.900528,11.600854,
+ 0.00827,-0.950946,0.309246,0.048998,-121.928291,8.440424,
+ 0.00827,-0.950946,0.309246,0.964621,-121.921903,8.435582,
+ -0.064695,-0.940704,0.333003,0.047392,-117.933134,20.329724,
+ -0.064695,-0.940704,0.333003,0.048087,-119.662136,15.445584,
+ -0.064695,-0.940704,0.333003,2.321716,-118.133588,20.205309,
+ -0.015958,-0.9529,0.302865,1.539574,-120.179325,13.948521,
+ -0.015958,-0.9529,0.302865,0.048585,-120.900528,11.600854,
+ -0.015958,-0.9529,0.302865,0.964621,-121.921903,8.435582,
+ -0.015958,-0.9529,0.302865,0.048585,-120.900528,11.600854,
+ -0.015958,-0.9529,0.302865,1.539574,-120.179325,13.948521,
+ -0.015958,-0.9529,0.302865,0.048281,-120.14411,13.98074,
+ -0.067924,-0.942893,0.326097,0.043542,-108.352425,47.183046,
+ -0.067924,-0.942893,0.326097,0.044816,-111.522452,38.017331,
+ -0.067924,-0.942893,0.326097,5.242445,-111.886028,38.048697,
+ -0.052154,-0.922749,0.381856,0.040805,-101.54027,64.874174,
+ -0.052154,-0.922749,0.381856,0.042141,-104.86574,56.838409,
+ -0.052154,-0.922749,0.381856,9.262109,-105.193971,57.304498,
+ 0.007818,-0.900424,0.434943,15.565033,-96.62434,74.763607,
+ 0.007818,-0.900424,0.434943,0.038934,-96.884055,74.505014,
+ 0.007818,-0.900424,0.434943,0.040668,-101.19972,65.570634,
+ -0.050606,-0.939183,0.339668,9.262109,-105.193971,57.304498,
+ -0.050606,-0.939183,0.339668,0.042141,-104.86574,56.838409,
+ -0.050606,-0.939183,0.339668,0.043326,-107.814125,48.686294,
+ 0.352075,0.643895,0.679296,92.934598,63.885328,175.407464,
+ 0.352075,0.643895,0.679296,58.883322,90.533845,167.796301,
+ 0.352075,0.643895,0.679296,56.127528,57.724873,200.323772,
+ -0.318073,0.939554,0.12676,2.318026,121.354972,96.590279,
+ -0.318073,0.939554,0.12676,17.156982,126.446608,96.085464,
+ -0.318073,0.939554,0.12676,0.50371,122.994432,79.885969,
+ 0.52858,0.302348,0.793214,110.997952,39.949901,172.493882,
+ 0.52858,0.302348,0.793214,92.934598,63.885328,175.407464,
+ 0.52858,0.302348,0.793214,76.509715,37.528534,196.399012,
+ -0.067675,-0.938184,0.339458,5.242445,-111.886028,38.048697,
+ -0.067675,-0.938184,0.339458,0.044816,-111.522452,38.017331,
+ -0.067675,-0.938184,0.339458,0.046084,-114.67681,29.29967,
+ 0.005606,-0.853675,0.520776,0.036824,-91.633964,83.111169,
+ 0.005606,-0.853675,0.520776,0.038934,-96.884055,74.505014,
+ 0.005606,-0.853675,0.520776,15.565033,-96.62434,74.763607,
+ 0.023347,-0.754086,0.65636,13.960596,-84.596113,90.759142,
+ 0.023347,-0.754086,0.65636,0.034217,-85.146186,90.622544,
+ 0.023347,-0.754086,0.65636,0.036684,-91.286591,83.567799,
+ -0.064016,-0.93791,0.340921,0.046495,-115.700299,26.472312,
+ -0.064016,-0.93791,0.340921,0.047392,-117.933134,20.329724,
+ -0.064016,-0.93791,0.340921,2.321716,-118.133588,20.205309,
+ 0.019628,-0.67914,0.733746,13.960596,-84.596113,90.759142,
+ 0.019628,-0.67914,0.733746,0.031628,-78.704118,96.585261,
+ 0.019628,-0.67914,0.733746,0.034217,-85.146186,90.622544,
+ -0.001943,0.948834,0.31577,-0.042293,105.244748,136.963796,
+ -0.001943,0.948834,0.31577,5.180551,101.01579,149.703219,
+ -0.001943,0.948834,0.31577,4.99966,105.26362,136.938107,
+ -0.001943,0.948834,0.31577,5.180551,101.01579,149.703219,
+ -0.001943,0.948834,0.31577,-0.042293,105.244748,136.963796,
+ -0.001943,0.948834,0.31577,-0.042063,104.670916,138.688063,
+ -0.022121,-0.711632,0.702204,0.026788,-66.660999,108.798524,
+ -0.022121,-0.711632,0.702204,0.031551,-78.51366,96.786876,
+ -0.022121,-0.711632,0.702204,16.455431,-77.791967,98.035636,
+ -0.003661,0.999893,0.014137,-0.050974,126.846104,44.265881,
+ -0.003661,0.999893,0.014137,1.604111,126.574505,63.904192,
+ -0.003661,0.999893,0.014137,1.422942,127.176426,21.284313,
+ -0.003661,0.999893,0.014137,1.604111,126.574505,63.904192,
+ -0.003661,0.999893,0.014137,-0.050974,126.846104,44.265881,
+ -0.003661,0.999893,0.014137,-0.050862,126.568328,63.912607,
+ 0.111067,0.88146,0.459013,43.302622,93.048617,155.911173,
+ 0.111067,0.88146,0.459013,17.95141,105.129943,138.845161,
+ 0.111067,0.88146,0.459013,16.784673,99.678211,149.596636,
+ 0.033212,-0.516602,0.855581,28.889074,-43.066739,125.540353,
+ 0.033212,-0.516602,0.855581,12.290397,-56.76475,117.913783,
+ 0.033212,-0.516602,0.855581,25.147983,-54.284967,118.911978,
+ -0.004347,0.992215,-0.124465,-0.050632,125.994617,11.914563,
+ -0.004347,0.992215,-0.124465,1.422942,127.176426,21.284313,
+ -0.004347,0.992215,-0.124465,1.272205,124.94909,3.533556,
+ -0.004347,0.992215,-0.124465,1.422942,127.176426,21.284313,
+ -0.004347,0.992215,-0.124465,-0.050632,125.994617,11.914563,
+ -0.004347,0.992215,-0.124465,-0.051105,127.170913,21.291854,
+ -0.004359,0.992214,-0.124466,-0.050632,125.994617,11.914563,
+ -0.004359,0.992214,-0.124466,1.272205,124.94909,3.533556,
+ -0.004359,0.992214,-0.124466,-0.05021,124.944126,3.540303,
+ 0.147305,0.957524,0.24789,-0.040863,101.685195,150.220266,
+ 0.147305,0.957524,0.24789,5.180551,101.01579,149.703219,
+ 0.147305,0.957524,0.24789,-0.042063,104.670916,138.688063,
+ -0.003667,0.999893,0.014137,-0.050974,126.846104,44.265881,
+ -0.003667,0.999893,0.014137,1.422942,127.176426,21.284313,
+ -0.003667,0.999893,0.014137,-0.051105,127.170913,21.291854,
+ 0.927643,0.348946,0.133096,61.886329,36.690603,216.747382,
+ 0.927643,0.348946,0.133096,61.819062,36.497038,217.723701,
+ 0.927643,0.348946,0.133096,62.196749,35.583076,217.487517,
+ 0.156364,0.837285,0.523931,-0.037901,94.31417,162.002896,
+ 0.156364,0.837285,0.523931,5.365449,93.63519,161.475368,
+ 0.156364,0.837285,0.523931,-0.040509,100.803638,151.632977,
+ -0.054378,-0.937671,0.343244,7.264643,-108.31423,48.464146,
+ -0.054378,-0.937671,0.343244,0.043326,-107.814125,48.686294,
+ -0.054378,-0.937671,0.343244,0.0434,-107.997312,48.185876,
+ -0.054378,-0.937671,0.343244,0.043326,-107.814125,48.686294,
+ -0.054378,-0.937671,0.343244,7.264643,-108.31423,48.464146,
+ -0.054378,-0.937671,0.343244,9.262109,-105.193971,57.304498,
+ 0.139865,0.493833,0.858235,84.177518,92.915868,154.443433,
+ 0.139865,0.493833,0.858235,52.400529,109.465494,150.099319,
+ 0.139865,0.493833,0.858235,51.983184,97.629933,156.977581,
+ 0.643931,-0.764562,-0.028245,40.763424,-34.083267,153.078788,
+ 0.643931,-0.764562,-0.028245,12.290397,-56.76475,117.913783,
+ 0.643931,-0.764562,-0.028245,28.889074,-43.066739,125.540353,
+ -0.16442,-0.922897,0.348177,2.321716,-118.133588,20.205309,
+ -0.16442,-0.922897,0.348177,7.777562,-121.659896,13.434695,
+ -0.16442,-0.922897,0.348177,8.548232,-119.469153,19.60554,
+ 0.325946,-0.747163,0.579229,66.873983,15.726958,190.687345,
+ 0.325946,-0.747163,0.579229,59.704893,-3.212465,170.291109,
+ 0.325946,-0.747163,0.579229,67.963075,-3.106047,165.781307,
+ 0.113958,-0.824799,0.553823,56.591459,-92.057187,76.877916,
+ 0.113958,-0.824799,0.553823,45.068003,-96.011016,73.360689,
+ 0.113958,-0.824799,0.553823,69.322309,-96.976036,66.932787,
+ -0.024893,-0.901308,0.432463,27.167204,-109.035014,49.50885,
+ -0.024893,-0.901308,0.432463,16.230028,-108.855912,49.252567,
+ -0.024893,-0.901308,0.432463,20.070488,-110.796237,45.429739,
+ 0.108701,-0.837281,0.535859,45.068003,-96.011016,73.360689,
+ 0.108701,-0.837281,0.535859,46.810397,-99.045322,68.266135,
+ 0.108701,-0.837281,0.535859,69.322309,-96.976036,66.932787,
+ 0.819005,0.343029,0.459959,143.475064,-73.910653,47.233601,
+ 0.819005,0.343029,0.459959,136.035862,-85.599714,69.197377,
+ 0.819005,0.343029,0.459959,142.540756,-84.637926,56.897449,
+ 0.947,0.045047,0.31806,150.586985,-65.504967,17.224523,
+ 0.947,0.045047,0.31806,149.188732,-67.972269,21.737165,
+ 0.947,0.045047,0.31806,150.163972,-78.171601,20.277979,
+ -0.03443,-0.894346,0.446049,27.167204,-109.035014,49.50885,
+ -0.03443,-0.894346,0.446049,20.070488,-110.796237,45.429739,
+ -0.03443,-0.894346,0.446049,26.524227,-113.760114,39.985207,
+ -0.116241,-0.889479,0.441945,38.929794,-120.106955,30.04279,
+ -0.116241,-0.889479,0.441945,27.836824,-119.656231,28.032254,
+ -0.116241,-0.889479,0.441945,48.408947,-128.9394,14.759421,
+ 0.726816,-0.622007,-0.291283,143.872747,-71.323793,42.701919,
+ 0.726816,-0.622007,-0.291283,148.999438,-74.193749,61.622646,
+ 0.726816,-0.622007,-0.291283,143.475064,-73.910653,47.233601,
+ 0.979283,-0.129036,-0.156059,152.121501,-58.810145,0,
+ 0.979283,-0.129036,-0.156059,151.991992,-65.61646,4.815067,
+ 0.979283,-0.129036,-0.156059,151.137095,-66.281025,0,
+ 0.979283,-0.129036,-0.156059,151.991992,-65.61646,4.815067,
+ 0.979283,-0.129036,-0.156059,152.121501,-58.810145,0,
+ 0.979283,-0.129036,-0.156059,152.397063,-58.075427,1.121687,
+ 0.992112,0.063504,0.108082,151.991992,-65.61646,4.815067,
+ 0.992112,0.063504,0.108082,150.70614,-64.763929,16.117284,
+ 0.992112,0.063504,0.108082,150.693057,-64.905155,16.320361,
+ 0.992112,0.063504,0.108082,150.70614,-64.763929,16.117284,
+ 0.992112,0.063504,0.108082,151.991992,-65.61646,4.815067,
+ 0.992112,0.063504,0.108082,150.996072,-60.621802,11.022224,
+ 0.578337,-0.778136,0.245011,136.035862,-85.599714,69.197377,
+ 0.578337,-0.778136,0.245011,129.702832,-95.556067,52.525623,
+ 0.578337,-0.778136,0.245011,142.540756,-84.637926,56.897449,
+ 0.113135,-0.859461,0.498525,67.758471,-79.75432,93.676406,
+ 0.113135,-0.859461,0.498525,85.871599,-82.864959,84.20305,
+ 0.113135,-0.859461,0.498525,107.183057,-78.261318,87.303345,
+ -0.162843,-0.909098,0.383436,27.836824,-119.656231,28.032254,
+ -0.162843,-0.909098,0.383436,27.426428,-122.12879,21.995704,
+ -0.162843,-0.909098,0.383436,48.408947,-128.9394,14.759421,
+ 0.683617,-0.510314,0.521773,146.067792,-83.075421,43.291109,
+ 0.683617,-0.510314,0.521773,129.702832,-95.556067,52.525623,
+ 0.683617,-0.510314,0.521773,138.952973,-97.865729,38.147334,
+ 0.848864,-0.483027,0.214744,146.067792,-83.075421,43.291109,
+ 0.848864,-0.483027,0.214744,138.952973,-97.865729,38.147334,
+ 0.848864,-0.483027,0.214744,143.244049,-97.117407,22.868325,
+ 0.009579,-0.819082,0.573597,41.240997,-72.464919,105.228608,
+ 0.009579,-0.819082,0.573597,16.455431,-77.791967,98.035636,
+ 0.009579,-0.819082,0.573597,41.279655,-78.872497,96.078101,
+ 0.099586,-0.830295,0.548355,107.183057,-78.261318,87.303345,
+ 0.099586,-0.830295,0.548355,85.871599,-82.864959,84.20305,
+ 0.099586,-0.830295,0.548355,106.419447,-85.05347,77.157647,
+ 0.800238,-0.593341,-0.086979,49.282414,-26.455824,179.424854,
+ 0.800238,-0.593341,-0.086979,35.203952,-44.177944,170.792048,
+ 0.800238,-0.593341,-0.086979,40.763424,-34.083267,153.078788,
+ 0.983611,0.033898,0.17709,152.397063,-58.075427,1.121687,
+ 0.983611,0.033898,0.17709,151.124013,-58.333602,8.24202,
+ 0.983611,0.033898,0.17709,151.991992,-65.61646,4.815067,
+ 0.983611,0.033898,0.17709,151.124013,-58.333602,8.24202,
+ 0.983611,0.033898,0.17709,152.397063,-58.075427,1.121687,
+ 0.983611,0.033898,0.17709,151.739698,-55.467984,4.273787,
+ 0.965329,-0.260332,0.01916,148.012251,-86.380502,0,
+ 0.965329,-0.260332,0.01916,151.272323,-73.462971,11.263316,
+ 0.965329,-0.260332,0.01916,146.14974,-92.595069,9.398895,
+ 0.965329,-0.260332,0.01916,151.272323,-73.462971,11.263316,
+ 0.965329,-0.260332,0.01916,148.012251,-86.380502,0,
+ 0.965329,-0.260332,0.01916,148.680315,-83.903278,0,
+ -0.358382,-0.817279,0.45124,7.777562,-121.659896,13.434695,
+ -0.358382,-0.817279,0.45124,3.709604,-122.687886,8.341983,
+ -0.358382,-0.817279,0.45124,8.697919,-125.028882,8.063802,
+ 0.913324,-0.359541,-0.191232,47.824512,-15.831453,152.48677,
+ 0.913324,-0.359541,-0.191232,49.282414,-26.455824,179.424854,
+ 0.913324,-0.359541,-0.191232,40.763424,-34.083267,153.078788,
+ -0.263733,-0.893576,0.363273,14.772368,-125.86523,10.28014,
+ -0.263733,-0.893576,0.363273,11.425039,-128.080282,2.401454,
+ -0.263733,-0.893576,0.363273,22.036768,-130.482192,4.197275,
+ 0.940179,-0.334736,0.06336,150.163972,-78.171601,20.277979,
+ 0.940179,-0.334736,0.06336,148.470531,-80.915919,30.907951,
+ 0.940179,-0.334736,0.06336,143.244049,-97.117407,22.868325,
+ 0.951758,0.155443,0.264565,143.475064,-73.910653,47.233601,
+ 0.951758,0.155443,0.264565,142.540756,-84.637926,56.897449,
+ 0.951758,0.155443,0.264565,146.067792,-83.075421,43.291109,
+ 0.926601,-0.357219,0.117495,148.470531,-80.915919,30.907951,
+ 0.926601,-0.357219,0.117495,146.067792,-83.075421,43.291109,
+ 0.926601,-0.357219,0.117495,143.244049,-97.117407,22.868325,
+ 0.590124,-0.754302,0.287719,127.481673,-107.995583,26.678751,
+ 0.590124,-0.754302,0.287719,135.233433,-108.33085,9.900609,
+ 0.590124,-0.754302,0.287719,143.244049,-97.117407,22.868325,
+ -0.287303,-0.832811,0.473163,7.777562,-121.659896,13.434695,
+ -0.287303,-0.832811,0.473163,8.697919,-125.028882,8.063802,
+ -0.287303,-0.832811,0.473163,14.772368,-125.86523,10.28014,
+ 0.109982,-0.854337,0.507949,75.705774,-108.476255,45.636897,
+ 0.109982,-0.854337,0.507949,62.838751,-113.53807,39.909242,
+ 0.109982,-0.854337,0.507949,79.483429,-121.900018,22.241038,
+ 0.191021,-0.891786,0.410156,92.152494,-116.433197,28.22701,
+ 0.191021,-0.891786,0.410156,79.483429,-121.900018,22.241038,
+ 0.191021,-0.891786,0.410156,105.034438,-122.745505,8.502923,
+ 0.018448,-0.757794,0.652234,16.455431,-77.791967,98.035636,
+ 0.018448,-0.757794,0.652234,27.875894,-83.27462,91.342634,
+ 0.018448,-0.757794,0.652234,41.279655,-78.872497,96.078101,
+ 0.470783,-0.87798,-0.086691,43.487052,-38.097247,192.799619,
+ 0.470783,-0.87798,-0.086691,30.914353,-44.466612,189.029501,
+ 0.470783,-0.87798,-0.086691,21.013271,-47.658919,167.591662,
+ -0.352383,-0.893779,0.277462,3.960323,-125.048345,1.816025,
+ -0.352383,-0.893779,0.277462,4.066516,-125.653975,0,
+ -0.352383,-0.893779,0.277462,5.694128,-126.29568,0,
+ 0.298571,0.888294,0.348983,20.215178,59.061842,219.079992,
+ 0.298571,0.888294,0.348983,43.1773,51.476876,218.741447,
+ 0.298571,0.888294,0.348983,45.595121,55.003013,207.697547,
+ -0.141547,-0.91562,0.376304,15.031408,-112.729518,39.629511,
+ -0.141547,-0.91562,0.376304,10.585427,-112.507683,38.496925,
+ -0.141547,-0.91562,0.376304,10.853295,-117.028258,27.598269,
+ 0.677929,0.644221,0.354107,45.595121,55.003013,207.697547,
+ 0.677929,0.644221,0.354107,43.1773,51.476876,218.741447,
+ 0.677929,0.644221,0.354107,63.571226,38.003357,204.209969,
+ 0.191491,-0.891576,0.410395,104.2944,-110.512296,35.424632,
+ 0.191491,-0.891576,0.410395,92.152494,-116.433197,28.22701,
+ 0.191491,-0.891576,0.410395,105.034438,-122.745505,8.502923,
+ 0.048546,-0.776637,0.628075,41.279655,-78.872497,96.078101,
+ 0.048546,-0.776637,0.628075,38.257721,-89.224519,83.511038,
+ 0.048546,-0.776637,0.628075,53.918456,-84.626913,87.985668,
+ -0.381194,-0.890662,0.247814,11.425039,-128.080282,2.401454,
+ -0.381194,-0.890662,0.247814,5.694128,-126.29568,0,
+ -0.381194,-0.890662,0.247814,12.050246,-129.016036,0,
+ -0.381194,-0.890662,0.247814,5.694128,-126.29568,0,
+ -0.381194,-0.890662,0.247814,11.425039,-128.080282,2.401454,
+ -0.381194,-0.890662,0.247814,3.960323,-125.048345,1.816025,
+ 0.405788,0.595256,0.693546,115.290055,79.668852,148.780795,
+ 0.405788,0.595256,0.693546,85.433587,88.722008,158.479427,
+ 0.405788,0.595256,0.693546,92.934598,63.885328,175.407464,
+ 0.019206,0.829695,0.557887,4.959503,70.921467,190.539486,
+ 0.019206,0.829695,0.557887,42.836379,91.297732,158.931725,
+ 0.019206,0.829695,0.557887,14.5834,83.57619,171.387942,
+ 0.540748,-0.11258,0.833617,142.184757,40.136739,150.753155,
+ 0.540748,-0.11258,0.833617,110.087234,14.508254,168.112948,
+ 0.540748,-0.11258,0.833617,134.633334,13.304454,152.027883,
+ 0.208509,0.88197,0.422673,58.883322,90.533845,167.796301,
+ 0.208509,0.88197,0.422673,85.433587,88.722008,158.479427,
+ 0.208509,0.88197,0.422673,52.664801,96.41855,158.584653,
+ 0.488573,0.336639,0.804966,92.934598,63.885328,175.407464,
+ 0.488573,0.336639,0.804966,56.127528,57.724873,200.323772,
+ 0.488573,0.336639,0.804966,76.509715,37.528534,196.399012,
+ 0.000752,0.83272,0.553694,-0.033398,83.109443,172.216352,
+ 0.000752,0.83272,0.553694,4.959503,70.921467,190.539486,
+ 0.000752,0.83272,0.553694,5.632285,83.126985,172.182273,
+ 0.000752,0.83272,0.553694,4.959503,70.921467,190.539486,
+ 0.000752,0.83272,0.553694,-0.033398,83.109443,172.216352,
+ 0.000752,0.83272,0.553694,-0.032961,82.02222,173.851463,
+ 0.168781,0.709245,0.684459,52.664801,96.41855,158.584653,
+ 0.168781,0.709245,0.684459,85.433587,88.722008,158.479427,
+ 0.168781,0.709245,0.684459,84.177518,92.915868,154.443433,
+ 0.54315,-0.388718,0.744236,110.997952,39.949901,172.493882,
+ 0.54315,-0.388718,0.744236,76.509715,37.528534,196.399012,
+ 0.54315,-0.388718,0.744236,76.802961,15.141951,184.492374,
+ -0.337096,0.937063,0.090993,1.604111,126.574505,63.904192,
+ -0.337096,0.937063,0.090993,14.479431,131.478945,61.09574,
+ -0.337096,0.937063,0.090993,15.113139,135.611501,20.885597,
+ 0.105902,0.882193,0.458825,5.180551,101.01579,149.703219,
+ 0.105902,0.882193,0.458825,16.784673,99.678211,149.596636,
+ 0.105902,0.882193,0.458825,17.95141,105.129943,138.845161,
+ 0.209725,0.679456,0.703104,58.883322,90.533845,167.796301,
+ 0.209725,0.679456,0.703104,26.691457,77.520755,189.974017,
+ 0.209725,0.679456,0.703104,56.127528,57.724873,200.323772,
+ -0.461462,0.886961,0.0188,4.959503,70.921467,190.539486,
+ -0.461462,0.886961,0.0188,52.664801,96.41855,158.584653,
+ -0.461462,0.886961,0.0188,42.836379,91.297732,158.931725,
+ -0.326927,0.471189,0.819206,52.400529,109.465494,150.099319,
+ -0.326927,0.471189,0.819206,17.95141,105.129943,138.845161,
+ -0.326927,0.471189,0.819206,43.302622,93.048617,155.911173,
+ 0.261414,0.681392,0.683643,84.177518,92.915868,154.443433,
+ 0.261414,0.681392,0.683643,82.914149,103.255853,144.620583,
+ 0.261414,0.681392,0.683643,52.400529,109.465494,150.099319,
+ -0.036744,0.948047,0.316001,5.180551,101.01579,149.703219,
+ -0.036744,0.948047,0.316001,17.95141,105.129943,138.845161,
+ -0.036744,0.948047,0.316001,4.99966,105.26362,136.938107,
+ -0.379923,0.907884,0.177216,0.50371,122.994432,79.885969,
+ -0.379923,0.907884,0.177216,15.812822,129.807229,77.804022,
+ -0.379923,0.907884,0.177216,1.604111,126.574505,63.904192,
+ -0.52467,0.848003,-0.074916,1.422942,127.176426,21.284313,
+ -0.52467,0.848003,-0.074916,15.113139,135.611501,20.885597,
+ -0.52467,0.848003,-0.074916,14.774209,133.666294,1.240672,
+ -0.551563,0.828209,-0.099239,1.422942,127.176426,21.284313,
+ -0.551563,0.828209,-0.099239,14.774209,133.666294,1.240672,
+ -0.551563,0.828209,-0.099239,1.272205,124.94909,3.533556,
+ 0.002003,0.713722,0.700427,-0.033748,83.97974,171.329537,
+ 0.002003,0.713722,0.700427,5.632285,83.126985,172.182273,
+ 0.002003,0.713722,0.700427,5.365449,93.63519,161.475368,
+ 0.002003,0.713722,0.700427,5.632285,83.126985,172.182273,
+ 0.002003,0.713722,0.700427,-0.033748,83.97974,171.329537,
+ 0.002003,0.713722,0.700427,-0.033398,83.109443,172.216352,
+ 0.492217,0.35768,0.793592,76.509715,37.528534,196.399012,
+ 0.492217,0.35768,0.793592,45.595121,55.003013,207.697547,
+ 0.492217,0.35768,0.793592,63.571226,38.003357,204.209969,
+ 0.24223,-0.640093,0.729112,41.745409,-29.08111,133.547228,
+ 0.24223,-0.640093,0.729112,37.767507,-28.252174,135.596522,
+ 0.24223,-0.640093,0.729112,28.889074,-43.066739,125.540353,
+ 0.243787,-0.67517,0.696214,110.087234,14.508254,168.112948,
+ 0.243787,-0.67517,0.696214,67.963075,-3.106047,165.781307,
+ 0.243787,-0.67517,0.696214,98.297345,-4.05498,154.239182,
+ -0.087067,-0.933067,0.349005,9.262109,-105.193971,57.304498,
+ -0.087067,-0.933067,0.349005,7.264643,-108.31423,48.464146,
+ -0.087067,-0.933067,0.349005,16.230028,-108.855912,49.252567,
+ 0.147192,-0.827505,0.541821,67.963075,-3.106047,165.781307,
+ 0.147192,-0.827505,0.541821,54.956246,-16.536624,148.802692,
+ 0.147192,-0.827505,0.541821,81.202842,-19.484522,137.170263,
+ -0.13817,-0.916031,0.376558,10.585427,-112.507683,38.496925,
+ -0.13817,-0.916031,0.376558,5.242445,-111.886028,38.048697,
+ -0.13817,-0.916031,0.376558,10.853295,-117.028258,27.598269,
+ 0.273453,0.707443,0.651726,45.595121,55.003013,207.697547,
+ 0.273453,0.707443,0.651726,56.127528,57.724873,200.323772,
+ 0.273453,0.707443,0.651726,22.093586,67.839273,203.624734,
+ -0.295877,-0.911223,0.286584,3.960323,-125.048345,1.816025,
+ -0.295877,-0.911223,0.286584,1.229377,-124.732747,0,
+ -0.295877,-0.911223,0.286584,4.066516,-125.653975,0,
+ -0.295877,-0.911223,0.286584,1.229377,-124.732747,0,
+ -0.295877,-0.911223,0.286584,3.960323,-125.048345,1.816025,
+ -0.295877,-0.911223,0.286584,0.607191,-124.022044,1.617393,
+ -0.086357,-0.937126,0.338138,16.230028,-108.855912,49.252567,
+ -0.086357,-0.937126,0.338138,7.264643,-108.31423,48.464146,
+ -0.086357,-0.937126,0.338138,5.242445,-111.886028,38.048697,
+ 0.459709,-0.412317,0.786551,76.802961,15.141951,184.492374,
+ 0.459709,-0.412317,0.786551,76.509715,37.528534,196.399012,
+ 0.459709,-0.412317,0.786551,63.571226,38.003357,204.209969,
+ 0.301514,0.597491,0.74303,92.934598,63.885328,175.407464,
+ 0.301514,0.597491,0.74303,85.433587,88.722008,158.479427,
+ 0.301514,0.597491,0.74303,58.883322,90.533845,167.796301,
+ -0.093148,0.82667,0.554924,4.833566,65.392176,204.372944,
+ -0.093148,0.82667,0.554924,22.093586,67.839273,203.624734,
+ -0.093148,0.82667,0.554924,26.691457,77.520755,189.974017,
+ -0.589774,0.796819,-0.131325,1.272205,124.94909,3.533556,
+ -0.589774,0.796819,-0.131325,3.111652,125.728203,0,
+ -0.589774,0.796819,-0.131325,1.49613,124.532458,0,
+ 0.187369,-0.832118,0.521989,47.824512,-15.831453,152.48677,
+ 0.187369,-0.832118,0.521989,41.745409,-29.08111,133.547228,
+ 0.187369,-0.832118,0.521989,54.956246,-16.536624,148.802692,
+ 0.184247,-0.813821,0.551134,67.963075,-3.106047,165.781307,
+ 0.184247,-0.813821,0.551134,81.202842,-19.484522,137.170263,
+ 0.184247,-0.813821,0.551134,98.297345,-4.05498,154.239182,
+ 0.200934,-0.155812,0.967134,41.22377,-49.557017,121.932046,
+ 0.200934,-0.155812,0.967134,35.226848,-43.619047,124.134624,
+ 0.200934,-0.155812,0.967134,28.889074,-43.066739,125.540353,
+ 0.101968,-0.809883,0.577661,54.956246,-16.536624,148.802692,
+ 0.101968,-0.809883,0.577661,41.745409,-29.08111,133.547228,
+ 0.101968,-0.809883,0.577661,69.951402,-30.45389,126.643677,
+ 0.309985,-0.799897,0.513881,98.297345,-4.05498,154.239182,
+ 0.309985,-0.799897,0.513881,94.568308,-19.202409,132.910445,
+ 0.309985,-0.799897,0.513881,122.492286,-3.064184,141.186491,
+ -0.073473,-0.880842,0.467675,26.560488,-102.028779,65.98362,
+ -0.073473,-0.880842,0.467675,9.262109,-105.193971,57.304498,
+ -0.073473,-0.880842,0.467675,18.608729,-105.707424,57.805824,
+ 0.165363,-0.587178,0.792387,69.951402,-30.45389,126.643677,
+ 0.165363,-0.587178,0.792387,41.745409,-29.08111,133.547228,
+ 0.165363,-0.587178,0.792387,35.226848,-43.619047,124.134624,
+ -0.267014,0.907162,0.32521,4.959503,70.921467,190.539486,
+ -0.267014,0.907162,0.32521,26.691457,77.520755,189.974017,
+ -0.267014,0.907162,0.32521,52.664801,96.41855,158.584653,
+ -0.35482,-0.20824,0.911449,0.024032,-59.801222,112.444835,
+ -0.35482,-0.20824,0.911449,2.772457,-51.749161,115.354443,
+ -0.35482,-0.20824,0.911449,0.023663,-58.885029,112.654016,
+ -0.35482,-0.20824,0.911449,2.772457,-51.749161,115.354443,
+ -0.35482,-0.20824,0.911449,0.024032,-59.801222,112.444835,
+ -0.35482,-0.20824,0.911449,12.290397,-56.76475,117.913783,
+ 0.432686,-0.168011,0.885751,110.997952,39.949901,172.493882,
+ 0.432686,-0.168011,0.885751,76.802961,15.141951,184.492374,
+ 0.432686,-0.168011,0.885751,110.087234,14.508254,168.112948,
+ -0.551921,0.827272,-0.104906,1.272205,124.94909,3.533556,
+ -0.551921,0.827272,-0.104906,14.638329,133.418312,0,
+ -0.551921,0.827272,-0.104906,3.111652,125.728203,0,
+ -0.551921,0.827272,-0.104906,14.638329,133.418312,0,
+ -0.551921,0.827272,-0.104906,1.272205,124.94909,3.533556,
+ -0.551921,0.827272,-0.104906,14.774209,133.666294,1.240672,
+ 0.555571,0.230296,0.798939,142.184757,40.136739,150.753155,
+ 0.555571,0.230296,0.798939,121.745973,65.826435,157.560879,
+ 0.555571,0.230296,0.798939,110.997952,39.949901,172.493882,
+ -0.045305,0.926862,0.372658,17.95141,105.129943,138.845161,
+ -0.045305,0.926862,0.372658,2.318026,121.354972,96.590279,
+ -0.045305,0.926862,0.372658,4.99966,105.26362,136.938107,
+ -0.01348,-0.505314,0.86283,41.22377,-49.557017,121.932046,
+ -0.01348,-0.505314,0.86283,28.889074,-43.066739,125.540353,
+ -0.01348,-0.505314,0.86283,25.147983,-54.284967,118.911978,
+ -0.330421,0.93617,0.120036,15.812822,129.807229,77.804022,
+ -0.330421,0.93617,0.120036,14.479431,131.478945,61.09574,
+ -0.330421,0.93617,0.120036,1.604111,126.574505,63.904192,
+ -0.376669,0.905763,0.194199,17.156982,126.446608,96.085464,
+ -0.376669,0.905763,0.194199,15.812822,129.807229,77.804022,
+ -0.376669,0.905763,0.194199,0.50371,122.994432,79.885969,
+ -0.35186,0.479576,0.803867,52.400529,109.465494,150.099319,
+ -0.35186,0.479576,0.803867,43.302622,93.048617,155.911173,
+ -0.35186,0.479576,0.803867,51.983184,97.629933,156.977581,
+ 0.020783,0.848842,0.528238,26.691457,77.520755,189.974017,
+ 0.020783,0.848842,0.528238,58.883322,90.533845,167.796301,
+ 0.020783,0.848842,0.528238,52.664801,96.41855,158.584653,
+ -0.270176,0.814649,0.513178,52.400529,109.465494,150.099319,
+ -0.270176,0.814649,0.513178,55.150209,132.694444,114.671927,
+ -0.270176,0.814649,0.513178,17.95141,105.129943,138.845161,
+ 0.565184,-0.159603,0.809378,142.184757,40.136739,150.753155,
+ 0.565184,-0.159603,0.809378,110.997952,39.949901,172.493882,
+ 0.565184,-0.159603,0.809378,110.087234,14.508254,168.112948,
+ -0.279422,0.857225,0.432537,17.95141,105.129943,138.845161,
+ -0.279422,0.857225,0.432537,17.156982,126.446608,96.085464,
+ -0.279422,0.857225,0.432537,2.318026,121.354972,96.590279,
+ 0.482827,0.329607,0.811318,76.509715,37.528534,196.399012,
+ 0.482827,0.329607,0.811318,56.127528,57.724873,200.323772,
+ 0.482827,0.329607,0.811318,45.595121,55.003013,207.697547,
+ 0.384577,0.615636,0.687818,121.745973,65.826435,157.560879,
+ 0.384577,0.615636,0.687818,115.290055,79.668852,148.780795,
+ 0.384577,0.615636,0.687818,92.934598,63.885328,175.407464,
+ 0.493459,0.271828,0.826201,121.745973,65.826435,157.560879,
+ 0.493459,0.271828,0.826201,92.934598,63.885328,175.407464,
+ 0.493459,0.271828,0.826201,110.997952,39.949901,172.493882,
+ -0.524209,0.85147,0.014254,1.604111,126.574505,63.904192,
+ -0.524209,0.85147,0.014254,15.113139,135.611501,20.885597,
+ -0.524209,0.85147,0.014254,1.422942,127.176426,21.284313,
+ -0.345072,0.837409,0.423878,17.95141,105.129943,138.845161,
+ -0.345072,0.837409,0.423878,55.150209,132.694444,114.671927,
+ -0.345072,0.837409,0.423878,17.156982,126.446608,96.085464,
+ 0.264923,-0.844641,0.465186,59.704893,-3.212465,170.291109,
+ 0.264923,-0.844641,0.465186,54.956246,-16.536624,148.802692,
+ 0.264923,-0.844641,0.465186,67.963075,-3.106047,165.781307,
+ 0.363341,-0.694715,0.620769,110.087234,14.508254,168.112948,
+ 0.363341,-0.694715,0.620769,98.297345,-4.05498,154.239182,
+ 0.363341,-0.694715,0.620769,122.492286,-3.064184,141.186491,
+ 0.159646,-0.985523,-0.057083,26.946825,-49.765563,148.717814,
+ 0.159646,-0.985523,-0.057083,11.141954,-52.178364,146.172039,
+ 0.159646,-0.985523,-0.057083,2.772457,-51.749161,115.354443,
+ 0.029296,-0.833006,0.552488,17.323411,-90.820879,83.420443,
+ 0.029296,-0.833006,0.552488,0.036824,-91.633964,83.111169,
+ 0.029296,-0.833006,0.552488,15.565033,-96.62434,74.763607,
+ 0.029296,-0.833006,0.552488,0.036824,-91.633964,83.111169,
+ 0.029296,-0.833006,0.552488,17.323411,-90.820879,83.420443,
+ 0.029296,-0.833006,0.552488,0.036761,-91.478244,83.345958,
+ 0.280478,-0.750043,0.598972,76.802961,15.141951,184.492374,
+ 0.280478,-0.750043,0.598972,67.963075,-3.106047,165.781307,
+ 0.280478,-0.750043,0.598972,110.087234,14.508254,168.112948,
+ -0.086117,-0.938888,0.333277,3.495139,-115.449332,28.07043,
+ -0.086117,-0.938888,0.333277,0.046495,-115.700299,26.472312,
+ -0.086117,-0.938888,0.333277,2.321716,-118.133588,20.205309,
+ -0.086117,-0.938888,0.333277,0.046495,-115.700299,26.472312,
+ -0.086117,-0.938888,0.333277,3.495139,-115.449332,28.07043,
+ -0.086117,-0.938888,0.333277,0.046248,-115.08593,28.203008,
+ -0.054153,-0.941263,0.333304,7.264643,-108.31423,48.464146,
+ -0.054153,-0.941263,0.333304,0.043542,-108.352425,47.183046,
+ -0.054153,-0.941263,0.333304,5.242445,-111.886028,38.048697,
+ -0.054153,-0.941263,0.333304,0.043542,-108.352425,47.183046,
+ -0.054153,-0.941263,0.333304,7.264643,-108.31423,48.464146,
+ -0.054153,-0.941263,0.333304,0.0434,-107.997312,48.185876,
+ -0.244322,-0.914842,0.321514,0.964621,-121.921903,8.435582,
+ -0.244322,-0.914842,0.321514,3.960323,-125.048345,1.816025,
+ -0.244322,-0.914842,0.321514,3.709604,-122.687886,8.341983,
+ -0.173876,-0.917371,0.358047,5.242445,-111.886028,38.048697,
+ -0.173876,-0.917371,0.358047,3.495139,-115.449332,28.07043,
+ -0.173876,-0.917371,0.358047,10.853295,-117.028258,27.598269,
+ 0.169709,-0.853909,0.491974,59.704893,-3.212465,170.291109,
+ 0.169709,-0.853909,0.491974,47.824512,-15.831453,152.48677,
+ 0.169709,-0.853909,0.491974,54.956246,-16.536624,148.802692,
+ 0.041685,-0.736872,0.674746,16.455431,-77.791967,98.035636,
+ 0.041685,-0.736872,0.674746,13.960596,-84.596113,90.759142,
+ 0.041685,-0.736872,0.674746,27.875894,-83.27462,91.342634,
+ 0.061743,-0.631317,0.773063,25.147983,-54.284967,118.911978,
+ 0.061743,-0.631317,0.773063,12.290397,-56.76475,117.913783,
+ 0.061743,-0.631317,0.773063,7.283371,-67.124654,109.853326,
+ -0.466976,0.794404,0.388401,42.836379,91.297732,158.931725,
+ -0.466976,0.794404,0.388401,51.983184,97.629933,156.977581,
+ -0.466976,0.794404,0.388401,43.302622,93.048617,155.911173,
+ 0.108344,-0.830571,0.546272,47.824512,-15.831453,152.48677,
+ 0.108344,-0.830571,0.546272,37.767507,-28.252174,135.596522,
+ 0.108344,-0.830571,0.546272,41.745409,-29.08111,133.547228,
+ -0.000421,0.928573,0.371151,-0.028494,70.906919,190.570224,
+ -0.000421,0.928573,0.371151,4.833566,65.392176,204.372944,
+ -0.000421,0.928573,0.371151,4.959503,70.921467,190.539486,
+ -0.000421,0.928573,0.371151,4.833566,65.392176,204.372944,
+ -0.000421,0.928573,0.371151,-0.028494,70.906919,190.570224,
+ -0.000421,0.928573,0.371151,-0.028355,70.558821,191.441123,
+ 0.278674,0.736582,0.616269,22.093586,67.839273,203.624734,
+ 0.278674,0.736582,0.616269,56.127528,57.724873,200.323772,
+ 0.278674,0.736582,0.616269,26.691457,77.520755,189.974017,
+ -0.509007,-0.75483,0.413694,26.946825,-49.765563,148.717814,
+ -0.509007,-0.75483,0.413694,2.772457,-51.749161,115.354443,
+ -0.509007,-0.75483,0.413694,12.290397,-56.76475,117.913783,
+ -0.331465,0.680476,0.653517,42.836379,91.297732,158.931725,
+ -0.331465,0.680476,0.653517,52.664801,96.41855,158.584653,
+ -0.331465,0.680476,0.653517,51.983184,97.629933,156.977581,
+ 0.76132,-0.608462,-0.22398,40.763424,-34.083267,153.078788,
+ 0.76132,-0.608462,-0.22398,26.946825,-49.765563,148.717814,
+ 0.76132,-0.608462,-0.22398,12.290397,-56.76475,117.913783,
+ 0.465962,-0.40763,0.785313,76.802961,15.141951,184.492374,
+ 0.465962,-0.40763,0.785313,63.571226,38.003357,204.209969,
+ 0.465962,-0.40763,0.785313,66.873983,15.726958,190.687345,
+ -0.235578,-0.523309,0.818933,0.024219,-60.267005,112.147248,
+ -0.235578,-0.523309,0.818933,12.290397,-56.76475,117.913783,
+ -0.235578,-0.523309,0.818933,0.024032,-59.801222,112.444835,
+ -0.235578,-0.523309,0.818933,12.290397,-56.76475,117.913783,
+ -0.235578,-0.523309,0.818933,0.024219,-60.267005,112.147248,
+ -0.235578,-0.523309,0.818933,7.283371,-67.124654,109.853326,
+ -0.606256,-0.78026,0.153781,2.772457,-51.749161,115.354443,
+ -0.606256,-0.78026,0.153781,0.019895,-49.506508,115.88178,
+ -0.606256,-0.78026,0.153781,0.019977,-49.712843,114.835197,
+ -0.606256,-0.78026,0.153781,0.019895,-49.506508,115.88178,
+ -0.606256,-0.78026,0.153781,2.772457,-51.749161,115.354443,
+ -0.606256,-0.78026,0.153781,11.141954,-52.178364,146.172039,
+ 0.191207,-0.815741,0.5459,98.297345,-4.05498,154.239182,
+ 0.191207,-0.815741,0.5459,81.202842,-19.484522,137.170263,
+ 0.191207,-0.815741,0.5459,94.568308,-19.202409,132.910445,
+ -0.143538,-0.911736,0.384883,16.230028,-108.855912,49.252567,
+ -0.143538,-0.911736,0.384883,10.585427,-112.507683,38.496925,
+ -0.143538,-0.911736,0.384883,15.031408,-112.729518,39.629511,
+ 0.053665,0.865485,0.498053,20.215178,59.061842,219.079992,
+ 0.053665,0.865485,0.498053,22.093586,67.839273,203.624734,
+ 0.053665,0.865485,0.498053,5.021595,60.165404,218.799389,
+ 0.12689,-0.851375,0.508979,75.705774,-108.476255,45.636897,
+ 0.12689,-0.851375,0.508979,79.483429,-121.900018,22.241038,
+ 0.12689,-0.851375,0.508979,92.152494,-116.433197,28.22701,
+ -0.170683,-0.925621,0.337775,10.853295,-117.028258,27.598269,
+ -0.170683,-0.925621,0.337775,21.348494,-122.337067,18.353678,
+ -0.170683,-0.925621,0.337775,27.426428,-122.12879,21.995704,
+ -0.172325,-0.921296,0.348595,8.548232,-119.469153,19.60554,
+ -0.172325,-0.921296,0.348595,7.777562,-121.659896,13.434695,
+ -0.172325,-0.921296,0.348595,21.348494,-122.337067,18.353678,
+ 0.985849,0.075948,0.149442,152.159067,-51.73768,0,
+ 0.985849,0.075948,0.149442,151.932366,-51.870868,1.563201,
+ 0.985849,0.075948,0.149442,152.207345,-52.364349,0,
+ 0.985849,0.075948,0.149442,151.932366,-51.870868,1.563201,
+ 0.985849,0.075948,0.149442,152.159067,-51.73768,0,
+ 0.985849,0.075948,0.149442,151.862934,-50.523953,1.336723,
+ 0.319039,-0.717544,0.619149,107.586161,-74.352147,91.626047,
+ 0.319039,-0.717544,0.619149,107.183057,-78.261318,87.303345,
+ 0.319039,-0.717544,0.619149,147.243849,-73.593705,72.069973,
+ 0.057592,0.902018,0.42784,107.183057,-78.261318,87.303345,
+ 0.057592,0.902018,0.42784,128.297252,-78.700823,85.387765,
+ 0.057592,0.902018,0.42784,147.243849,-73.593705,72.069973,
+ -0.024843,-0.902833,0.429273,28.208062,-107.282672,53.254552,
+ -0.024843,-0.902833,0.429273,16.230028,-108.855912,49.252567,
+ -0.024843,-0.902833,0.429273,27.167204,-109.035014,49.50885,
+ 0.564273,-0.591531,0.575923,128.297252,-78.700823,85.387765,
+ 0.564273,-0.591531,0.575923,137.477823,-80.450251,74.596078,
+ 0.564273,-0.591531,0.575923,147.243849,-73.593705,72.069973,
+ 0.121579,-0.720578,0.682632,90.833988,-65.807164,104.289034,
+ 0.121579,-0.720578,0.682632,67.758471,-79.75432,93.676406,
+ 0.121579,-0.720578,0.682632,115.891218,-66.266697,99.341177,
+ 0.992785,-0.004267,0.119834,151.272323,-73.462971,11.263316,
+ 0.992785,-0.004267,0.119834,150.586985,-65.504967,17.224523,
+ 0.992785,-0.004267,0.119834,150.163972,-78.171601,20.277979,
+ 0.992785,-0.004267,0.119834,150.586985,-65.504967,17.224523,
+ 0.992785,-0.004267,0.119834,151.272323,-73.462971,11.263316,
+ 0.992785,-0.004267,0.119834,150.637568,-65.234887,16.815075,
+ 0.939326,-0.330556,0.091652,150.163972,-78.171601,20.277979,
+ 0.939326,-0.330556,0.091652,143.244049,-97.117407,22.868325,
+ 0.939326,-0.330556,0.091652,146.14974,-92.595069,9.398895,
+ 0.920181,-0.375122,0.112029,143.475064,-73.910653,47.233601,
+ 0.920181,-0.375122,0.112029,137.477823,-80.450251,74.596078,
+ 0.920181,-0.375122,0.112029,136.035862,-85.599714,69.197377,
+ 0.089028,-0.843794,0.52923,96.959891,-55.539496,119.629086,
+ 0.089028,-0.843794,0.52923,90.833988,-65.807164,104.289034,
+ 0.089028,-0.843794,0.52923,115.891218,-66.266697,99.341177,
+ -0.181611,-0.908668,0.375952,21.348494,-122.337067,18.353678,
+ -0.181611,-0.908668,0.375952,7.777562,-121.659896,13.434695,
+ -0.181611,-0.908668,0.375952,26.084822,-124.765449,14.772308,
+ 0.984656,-0.002399,-0.174491,151.991992,-65.61646,4.815067,
+ 0.984656,-0.002399,-0.174491,151.130171,-69.122906,0,
+ 0.984656,-0.002399,-0.174491,151.137095,-66.281025,0,
+ 0.992225,0.069754,0.103071,151.124013,-58.333602,8.24202,
+ 0.992225,0.069754,0.103071,150.996072,-60.621802,11.022224,
+ 0.992225,0.069754,0.103071,151.991992,-65.61646,4.815067,
+ 0.982274,0.068987,0.174295,150.163972,-78.171601,20.277979,
+ 0.982274,0.068987,0.174295,148.739748,-68.968812,24.661947,
+ 0.982274,0.068987,0.174295,148.470531,-80.915919,30.907951,
+ 0.982274,0.068987,0.174295,148.739748,-68.968812,24.661947,
+ 0.982274,0.068987,0.174295,150.163972,-78.171601,20.277979,
+ 0.982274,0.068987,0.174295,149.062846,-68.599379,22.694837,
+ 0.982274,0.068987,0.174295,149.062846,-68.599379,22.694837,
+ 0.982274,0.068987,0.174295,150.163972,-78.171601,20.277979,
+ 0.982274,0.068987,0.174295,149.188732,-67.972269,21.737165,
+ 0.207604,-0.875823,0.4357,127.091067,-61.972922,105.032011,
+ 0.207604,-0.875823,0.4357,147.243849,-73.593705,72.069973,
+ 0.207604,-0.875823,0.4357,142.024704,-58.622404,104.651414,
+ 0.986127,0.062927,0.153602,152.395208,-55.308366,0,
+ 0.986127,0.062927,0.153602,151.739698,-55.467984,4.273787,
+ 0.986127,0.062927,0.153602,152.397063,-58.075427,1.121687,
+ 0.986127,0.062927,0.153602,151.739698,-55.467984,4.273787,
+ 0.986127,0.062927,0.153602,152.395208,-55.308366,0,
+ 0.986127,0.062927,0.153602,151.99283,-53.651044,1.904319,
+ 0.986127,0.062927,0.153602,151.99283,-53.651044,1.904319,
+ 0.986127,0.062927,0.153602,152.395208,-55.308366,0,
+ 0.986127,0.062927,0.153602,152.207345,-52.364349,0,
+ 0.986127,0.062927,0.153602,151.99283,-53.651044,1.904319,
+ 0.986127,0.062927,0.153602,152.207345,-52.364349,0,
+ 0.986127,0.062927,0.153602,151.932366,-51.870868,1.563201,
+ 0.984281,-0.156902,-0.081073,149.219498,-80.52087,0,
+ 0.984281,-0.156902,-0.081073,151.272323,-73.462971,11.263316,
+ 0.984281,-0.156902,-0.081073,148.680315,-83.903278,0,
+ 0.984281,-0.156902,-0.081073,151.272323,-73.462971,11.263316,
+ 0.984281,-0.156902,-0.081073,149.219498,-80.52087,0,
+ 0.984281,-0.156902,-0.081073,151.991992,-65.61646,4.815067,
+ 0.993694,0.001004,0.112125,151.991992,-65.61646,4.815067,
+ 0.993694,0.001004,0.112125,150.637568,-65.234887,16.815075,
+ 0.993694,0.001004,0.112125,151.272323,-73.462971,11.263316,
+ 0.993694,0.001004,0.112125,150.637568,-65.234887,16.815075,
+ 0.993694,0.001004,0.112125,151.991992,-65.61646,4.815067,
+ 0.993694,0.001004,0.112125,150.693057,-64.905155,16.320361,
+ -0.113727,-0.895906,0.429441,26.524227,-113.760114,39.985207,
+ -0.113727,-0.895906,0.429441,18.220003,-115.483585,34.190502,
+ -0.113727,-0.895906,0.429441,27.836824,-119.656231,28.032254,
+ 0.134391,-0.741167,0.657731,67.758471,-79.75432,93.676406,
+ 0.134391,-0.741167,0.657731,107.183057,-78.261318,87.303345,
+ 0.134391,-0.741167,0.657731,107.586161,-74.352147,91.626047,
+ -0.1512,-0.911484,0.382539,18.220003,-115.483585,34.190502,
+ -0.1512,-0.911484,0.382539,10.853295,-117.028258,27.598269,
+ -0.1512,-0.911484,0.382539,27.426428,-122.12879,21.995704,
+ -0.138277,-0.989823,0.033614,147.243849,-73.593705,72.069973,
+ -0.138277,-0.989823,0.033614,143.475064,-73.910653,47.233601,
+ -0.138277,-0.989823,0.033614,148.999438,-74.193749,61.622646,
+ 0.966235,-0.257193,-0.015541,151.272323,-73.462971,11.263316,
+ 0.966235,-0.257193,-0.015541,150.163972,-78.171601,20.277979,
+ 0.966235,-0.257193,-0.015541,146.14974,-92.595069,9.398895,
+ 0.14973,-0.856554,0.493859,116.766516,-91.579114,64.5215,
+ 0.14973,-0.856554,0.493859,102.4835,-97.594974,58.417899,
+ 0.14973,-0.856554,0.493859,116.524655,-103.780363,43.432864,
+ 0.028813,-0.792825,0.608768,41.279655,-78.872497,96.078101,
+ 0.028813,-0.792825,0.608768,53.918456,-84.626913,87.985668,
+ 0.028813,-0.792825,0.608768,67.758471,-79.75432,93.676406,
+ 0.166537,-0.813869,0.556672,106.419447,-85.05347,77.157647,
+ 0.166537,-0.813869,0.556672,116.766516,-91.579114,64.5215,
+ 0.166537,-0.813869,0.556672,137.477823,-80.450251,74.596078,
+ -0.149857,-0.911318,0.383462,18.220003,-115.483585,34.190502,
+ -0.149857,-0.911318,0.383462,27.426428,-122.12879,21.995704,
+ -0.149857,-0.911318,0.383462,27.836824,-119.656231,28.032254,
+ 0.159056,-0.873048,0.460964,136.035862,-85.599714,69.197377,
+ 0.159056,-0.873048,0.460964,116.766516,-91.579114,64.5215,
+ 0.159056,-0.873048,0.460964,129.702832,-95.556067,52.525623,
+ 0.198409,-0.965244,0.170113,35.203952,-44.177944,170.792048,
+ 0.198409,-0.965244,0.170113,21.013271,-47.658919,167.591662,
+ 0.198409,-0.965244,0.170113,26.946825,-49.765563,148.717814,
+ 0.024747,-0.818838,0.57349,41.240997,-72.464919,105.228608,
+ 0.024747,-0.818838,0.57349,41.279655,-78.872497,96.078101,
+ 0.024747,-0.818838,0.57349,67.758471,-79.75432,93.676406,
+ 0.948837,0.16194,0.271077,148.470531,-80.915919,30.907951,
+ 0.948837,0.16194,0.271077,147.069139,-70.028619,29.309139,
+ 0.948837,0.16194,0.271077,145.567389,-70.279869,34.715733,
+ 0.948837,0.16194,0.271077,147.069139,-70.028619,29.309139,
+ 0.948837,0.16194,0.271077,148.470531,-80.915919,30.907951,
+ 0.948837,0.16194,0.271077,147.453743,-69.713071,27.774423,
+ -0.174961,-0.926417,0.333376,10.853295,-117.028258,27.598269,
+ -0.174961,-0.926417,0.333376,8.548232,-119.469153,19.60554,
+ -0.174961,-0.926417,0.333376,21.348494,-122.337067,18.353678,
+ 0.560039,-0.825114,-0.074453,137.477823,-80.450251,74.596078,
+ 0.560039,-0.825114,-0.074453,143.475064,-73.910653,47.233601,
+ 0.560039,-0.825114,-0.074453,147.243849,-73.593705,72.069973,
+ 0.888723,0.196514,0.414191,148.739748,-68.968812,24.661947,
+ 0.888723,0.196514,0.414191,147.453743,-69.713071,27.774423,
+ 0.888723,0.196514,0.414191,148.470531,-80.915919,30.907951,
+ -0.379551,-0.878365,0.290544,8.697919,-125.028882,8.063802,
+ -0.379551,-0.878365,0.290544,3.960323,-125.048345,1.816025,
+ -0.379551,-0.878365,0.290544,11.425039,-128.080282,2.401454,
+ 0.927635,0.283448,0.243209,145.045248,-70.421306,37.178016,
+ 0.927635,0.283448,0.243209,143.872747,-71.323793,42.701919,
+ 0.927635,0.283448,0.243209,143.475064,-73.910653,47.233601,
+ 0.927635,0.283448,0.243209,143.872747,-71.323793,42.701919,
+ 0.927635,0.283448,0.243209,145.045248,-70.421306,37.178016,
+ 0.927635,0.283448,0.243209,143.932469,-70.890522,41.969174,
+ 0.927635,0.283448,0.243209,143.932469,-70.890522,41.969174,
+ 0.927635,0.283448,0.243209,145.045248,-70.421306,37.178016,
+ 0.927635,0.283448,0.243209,144.352557,-70.566689,39.98948,
+ 0.958526,0.183587,0.218001,148.470531,-80.915919,30.907951,
+ 0.958526,0.183587,0.218001,145.427918,-70.316374,35.359713,
+ 0.958526,0.183587,0.218001,146.067792,-83.075421,43.291109,
+ 0.958526,0.183587,0.218001,145.427918,-70.316374,35.359713,
+ 0.958526,0.183587,0.218001,148.470531,-80.915919,30.907951,
+ 0.958526,0.183587,0.218001,145.567389,-70.279869,34.715733,
+ 0.032976,-0.831671,0.554289,107.183057,-78.261318,87.303345,
+ 0.032976,-0.831671,0.554289,106.419447,-85.05347,77.157647,
+ 0.032976,-0.831671,0.554289,128.297252,-78.700823,85.387765,
+ -0.016099,-0.895255,0.445263,27.167204,-109.035014,49.50885,
+ -0.016099,-0.895255,0.445263,26.524227,-113.760114,39.985207,
+ -0.016099,-0.895255,0.445263,36.139489,-111.117628,45.645908,
+ 0.984689,-0.165066,-0.056039,151.991992,-65.61646,4.815067,
+ 0.984689,-0.165066,-0.056039,149.219498,-80.52087,0,
+ 0.984689,-0.165066,-0.056039,151.130171,-69.122906,0,
+ 0.960384,0.180273,0.21252,145.427918,-70.316374,35.359713,
+ 0.960384,0.180273,0.21252,143.475064,-73.910653,47.233601,
+ 0.960384,0.180273,0.21252,146.067792,-83.075421,43.291109,
+ 0.960384,0.180273,0.21252,143.475064,-73.910653,47.233601,
+ 0.960384,0.180273,0.21252,145.427918,-70.316374,35.359713,
+ 0.960384,0.180273,0.21252,145.045248,-70.421306,37.178016,
+ 0.761378,-0.636396,-0.123712,40.763424,-34.083267,153.078788,
+ 0.761378,-0.636396,-0.123712,35.203952,-44.177944,170.792048,
+ 0.761378,-0.636396,-0.123712,26.946825,-49.765563,148.717814,
+ 0.066539,-0.855079,0.514211,96.959891,-55.539496,119.629086,
+ 0.066539,-0.855079,0.514211,115.891218,-66.266697,99.341177,
+ 0.066539,-0.855079,0.514211,127.091067,-61.972922,105.032011,
+ 0.061584,-0.730403,0.680234,137.477823,-80.450251,74.596078,
+ 0.061584,-0.730403,0.680234,116.766516,-91.579114,64.5215,
+ 0.061584,-0.730403,0.680234,136.035862,-85.599714,69.197377,
+ -0.00837,-0.986565,-0.163156,151.306132,-73.138264,55.182438,
+ -0.00837,-0.986565,-0.163156,143.932469,-70.890522,41.969174,
+ -0.00837,-0.986565,-0.163156,144.352557,-70.566689,39.98948,
+ -0.006699,-0.986427,-0.164065,143.932469,-70.890522,41.969174,
+ -0.006699,-0.986427,-0.164065,151.306132,-73.138264,55.182438,
+ -0.006699,-0.986427,-0.164065,148.999438,-74.193749,61.622646,
+ 0.6311,-0.772074,0.074932,142.540756,-84.637926,56.897449,
+ 0.6311,-0.772074,0.074932,129.702832,-95.556067,52.525623,
+ 0.6311,-0.772074,0.074932,146.067792,-83.075421,43.291109,
+ 0,0,-1,150.207119,63.115288,0,
+ 0,0,-1,150.002536,62.976309,0,
+ 0,0,-1,150.204733,63.272971,0,
+ 0.112405,-0.849278,0.515841,175.975003,-44.517327,121.51366,
+ 0.112405,-0.849278,0.515841,156.433246,-51.172954,114.81412,
+ 0.112405,-0.849278,0.515841,177.907221,-60.586829,94.635844,
+ -0.068831,-0.600111,0.79695,175.975003,-44.517327,121.51366,
+ -0.068831,-0.600111,0.79695,157.380863,-32.995219,128.583965,
+ -0.068831,-0.600111,0.79695,156.433246,-51.172954,114.81412,
+ 0.264351,-0.553645,0.789681,127.091067,-61.972922,105.032011,
+ 0.264351,-0.553645,0.789681,117.854117,-39.131687,124.138113,
+ 0.264351,-0.553645,0.789681,96.959891,-55.539496,119.629086,
+ 0.153926,-0.596595,0.787643,142.024704,-58.622404,104.651414,
+ 0.153926,-0.596595,0.787643,117.854117,-39.131687,124.138113,
+ 0.153926,-0.596595,0.787643,127.091067,-61.972922,105.032011,
+ 0.092446,-0.861029,0.500082,156.433246,-51.172954,114.81412,
+ 0.092446,-0.861029,0.500082,142.024704,-58.622404,104.651414,
+ 0.092446,-0.861029,0.500082,177.907221,-60.586829,94.635844,
+ -0.075411,-0.750237,0.656854,117.854117,-39.131687,124.138113,
+ -0.075411,-0.750237,0.656854,142.024704,-58.622404,104.651414,
+ -0.075411,-0.750237,0.656854,156.433246,-51.172954,114.81412,
+ -0.005031,-0.56524,0.824911,157.380863,-32.995219,128.583965,
+ -0.005031,-0.56524,0.824911,155.139177,-30.981158,129.950355,
+ -0.005031,-0.56524,0.824911,117.854117,-39.131687,124.138113,
+ 0.004118,-0.603956,0.797007,157.380863,-32.995219,128.583965,
+ 0.004118,-0.603956,0.797007,117.854117,-39.131687,124.138113,
+ 0.004118,-0.603956,0.797007,156.433246,-51.172954,114.81412
+};
+static const struct gllist headroom_model_torso_half_frame = {
+ GL_N3F_V3F, GL_TRIANGLES, 2487, headroom_model_torso_half_data, 0
+};
+const struct gllist *headroom_model_torso_half = &headroom_model_torso_half_frame;
diff --git a/hacks/glx/hexstrut.c b/hacks/glx/hexstrut.c
index ba76d86..6d776bc 100644
--- a/hacks/glx/hexstrut.c
+++ b/hacks/glx/hexstrut.c
@@ -16,8 +16,6 @@
"*suppressRotationAnimation: True\n" \
# define release_hexstrut 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "colors.h"
@@ -352,13 +350,12 @@ reshape_hexstrut (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
diff --git a/hacks/glx/hexstrut.man b/hacks/glx/hexstrut.man
index 19e49e0..b72f504 100644
--- a/hacks/glx/hexstrut.man
+++ b/hacks/glx/hexstrut.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-hexstrut - a grid of hexagons composed of rotating Y-shaped struts.
+hexstrut \- a grid of hexagons composed of rotating Y-shaped struts.
.SH SYNOPSIS
.B hexstrut
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/hilbert.c b/hacks/glx/hilbert.c
index 98faa4b..5585f63 100644
--- a/hacks/glx/hilbert.c
+++ b/hacks/glx/hilbert.c
@@ -22,8 +22,6 @@
"*suppressRotationAnimation: True\n" \
# define release_hilbert 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "colors.h"
@@ -776,13 +774,12 @@ reshape_hilbert (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
diff --git a/hacks/glx/hilbert.man b/hacks/glx/hilbert.man
index 8693dce..563016a 100644
--- a/hacks/glx/hilbert.man
+++ b/hacks/glx/hilbert.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-hilbert - 3D Hilbert fractal.
+hilbert \- 3D Hilbert fractal.
.SH SYNOPSIS
.B hilbert
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/hydrostat.c b/hacks/glx/hydrostat.c
index 99bc6cd..6ff00e8 100644
--- a/hacks/glx/hydrostat.c
+++ b/hacks/glx/hydrostat.c
@@ -34,8 +34,6 @@
"*suppressRotationAnimation: True\n" \
# define release_hydrostat 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "colors.h"
@@ -563,13 +561,12 @@ reshape_hydrostat (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
diff --git a/hacks/glx/hydrostat.man b/hacks/glx/hydrostat.man
index de75525..adf6364 100644
--- a/hacks/glx/hydrostat.man
+++ b/hacks/glx/hydrostat.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-hydrostat - Wiggly squid or jellyfish with many tentacles.
+hydrostat \- Wiggly squid or jellyfish with many tentacles.
.SH SYNOPSIS
.B hydrostat
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/hypertorus.c b/hacks/glx/hypertorus.c
index 41f4e0a..8adf5d7 100644
--- a/hacks/glx/hypertorus.c
+++ b/hacks/glx/hypertorus.c
@@ -1,10 +1,10 @@
/* hypertorus --- Shows a hypertorus that rotates in 4d */
#if 0
-static const char sccsid[] = "@(#)hypertorus.c 1.2 28/09/05 xlockmore";
+static const char sccsid[] = "@(#)hypertorus.c 1.2 05/09/28 xlockmore";
#endif
-/* Copyright (c) 2003-2020 Carsten Steger <carsten@mirsanmir.org>. */
+/* Copyright (c) 2003-2021 Carsten Steger <carsten@mirsanmir.org>. */
/*
* Permission to use, copy, modify, and distribute this software and its
@@ -25,7 +25,12 @@ static const char sccsid[] = "@(#)hypertorus.c 1.2 28/09/05 xlockmore";
* and trackball support
* C. Steger - 07/01/23: Improved 4d trackball support
* C. Steger - 09/08/22: Removed check-config.pl warnings
- * C. Steger - 11/01/20: Added the changing colors mode.
+ * C. Steger - 20/01/11: Added the changing colors mode
+ * C. Steger - 20/05/18: Added per-fragment shading
+ * C. Steger - 20/07/26: Make the shader code work under maxOS
+ * C. Steger - 20/11/19: Remove all unnecessary global variables
+ * C. Steger - 20/12/06: Moved all GLSL support code into glsl-utils.[hc]
+ * C. Steger - 20/12/30: Make the shader code work under iOS
*/
/*
@@ -100,10 +105,20 @@ static const char sccsid[] = "@(#)hypertorus.c 1.2 28/09/05 xlockmore";
#define DEF_SPEEDXZ "1.9"
#define DEF_SPEEDYZ "2.1"
+
+/* For some strange reason, the color buffer must be initialized
+ and used on macOS. Otherwise one- and two-sided lighting will
+ not work. */
+#if (defined(HAVE_COCOA) || defined(__APPLE__)) && !defined(HAVE_IPHONE)
+#define VERTEXATTRIBARRAY_WORKAROUND
+#endif
+
+
+
#ifdef STANDALONE
# define DEFAULTS "*delay: 25000 \n" \
"*showFPS: False \n" \
- "*suppressRotationAnimation: True\n" \
+ "*prefersGLSL: True \n" \
# define release_hypertorus 0
# include "xlockmore.h" /* from the xscreensaver distribution */
@@ -113,6 +128,7 @@ static const char sccsid[] = "@(#)hypertorus.c 1.2 28/09/05 xlockmore";
#ifdef USE_GL
+#include "glsl-utils.h"
#include "gltrackball.h"
@@ -123,7 +139,7 @@ ModStruct hypertorus_description =
25000, 1, 1, 1, 1.0, 4, "",
"Shows a hypertorus rotating in 4d", 0, NULL};
-#endif
+#endif /* USE_MODULES */
static char *mode;
@@ -205,6 +221,9 @@ ENTRYPOINT ModeSpecOpt hypertorus_opts =
#define DSIGMA 1.1
#define DTAU 1.7
+/* Number of subdivisions of the surface */
+#define NUMU 64
+#define NUMV 64
typedef struct {
GLint WindH, WindW;
@@ -220,11 +239,178 @@ typedef struct {
int current_trackball;
Bool button_pressed;
float speed_scale;
+#ifdef HAVE_GLSL
+ GLfloat uv[(NUMU+1)*(NUMV+1)][2];
+ GLfloat col[(NUMU+1)*(NUMV+1)][4];
+ GLuint indices[4*NUMU*NUMV];
+ Bool use_shaders, buffers_initialized;
+ GLuint shader_program;
+ GLint vertex_uv_index, color_index;
+ GLint mat_rot_index, mat_p_index, bool_persp_index;
+ GLint off4d_index, off3d_index, draw_lines_index;
+ GLint glbl_ambient_index, lt_ambient_index;
+ GLint lt_diffuse_index, lt_specular_index;
+ GLint lt_direction_index, lt_halfvect_index;
+ GLint front_ambient_index, back_ambient_index;
+ GLint front_diffuse_index, back_diffuse_index;
+ GLint specular_index, shininess_index;
+ GLuint vertex_uv_buffer;
+ GLuint color_buffer, indices_buffer;
+ GLint ni, ne, nt;
+#endif /* HAVE_GLSL */
} hypertorusstruct;
static hypertorusstruct *hyper = (hypertorusstruct *) NULL;
+
+#ifdef HAVE_GLSL
+
+/* The GLSL versions that correspond to different versions of OpenGL. */
+static const GLchar *shader_version_2_1 =
+ "#version 120\n";
+static const GLchar *shader_version_3_0 =
+ "#version 130\n";
+static const GLchar *shader_version_3_0_es =
+ "#version 300 es\n"
+ "precision highp float;\n"
+ "precision highp int;\n";
+
+/* The vertex shader code is composed of code fragments that depend on
+ the OpenGL version and code fragments that are version-independent.
+ They are concatenated by glsl_CompileAndLinkShaders in the function
+ init_glsl(). */
+static const GLchar *vertex_shader_attribs_2_1 =
+ "attribute vec2 VertexUV;\n"
+ "attribute vec4 VertexColor;\n"
+ "\n"
+ "varying vec3 Normal;\n"
+ "varying vec4 Color;\n"
+ "\n";
+static const GLchar *vertex_shader_attribs_3_0 =
+ "in vec2 VertexUV;\n"
+ "in vec4 VertexColor;\n"
+ "\n"
+ "out vec3 Normal;\n"
+ "out vec4 Color;\n"
+ "\n";
+static const GLchar *vertex_shader_main =
+ "uniform mat4 MatRot4D;\n"
+ "uniform mat4 MatProj;\n"
+ "uniform bool BoolPersp;\n"
+ "uniform vec4 Offset4D;\n"
+ "uniform vec4 Offset3D;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " vec3 p, pu, pv;\n"
+ " float su = sin(VertexUV.x)\n;"
+ " float cu = cos(VertexUV.x)\n;"
+ " float sv = sin(VertexUV.y)\n;"
+ " float cv = cos(VertexUV.y)\n;"
+ " vec4 xx = vec4(cu,su,cv,sv);"
+ " vec4 xxu = vec4(-su,cu,0.0,0.0);"
+ " vec4 xxv = vec4(0.0,0.0,-sv,cv);"
+ " vec4 x = MatRot4D*xx+Offset4D;\n"
+ " vec4 xu = MatRot4D*xxu;\n"
+ " vec4 xv = MatRot4D*xxv;\n"
+ " if (BoolPersp)\n"
+ " {\n"
+ " vec3 r = x.xyz;\n"
+ " float s = x.w;\n"
+ " float t = s*s;\n"
+ " p = r/s+Offset3D.xyz;\n"
+ " pu = (s*xu.xyz-r*xu.w)/t;\n"
+ " pv = (s*xv.xyz-r*xv.w)/t;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " p = x.xyz/1.5f+Offset3D.xyz;\n"
+ " pu = xu.xyz;\n"
+ " pv = xv.xyz;\n"
+ " }\n"
+ " vec4 Position = vec4(p,1.0);\n"
+ " Normal = normalize(cross(pu,pv));\n"
+ " gl_Position = MatProj*Position;\n"
+ " Color = VertexColor;\n"
+ "}\n";
+
+/* The fragment shader code is composed of code fragments that depend on
+ the OpenGL version and code fragments that are version-independent.
+ They are concatenated by glsl_CompileAndLinkShaders in the function
+ init_glsl_glsl(). */
+static const GLchar *fragment_shader_attribs_2_1 =
+ "varying vec3 Normal;\n"
+ "varying vec4 Color;\n"
+ "\n";
+static const GLchar *fragment_shader_attribs_3_0 =
+ "in vec3 Normal;\n"
+ "in vec4 Color;\n"
+ "\n"
+ "out vec4 FragColor;\n"
+ "\n";
+static const GLchar *fragment_shader_main =
+ "uniform bool DrawLines;\n"
+ "uniform vec4 LtGlblAmbient;\n"
+ "uniform vec4 LtAmbient, LtDiffuse, LtSpecular;\n"
+ "uniform vec3 LtDirection, LtHalfVector;\n"
+ "uniform vec4 MatFrontAmbient, MatBackAmbient;\n"
+ "uniform vec4 MatFrontDiffuse, MatBackDiffuse;\n"
+ "uniform vec4 MatSpecular;\n"
+ "uniform float MatShininess;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " vec4 color;\n"
+ " if (DrawLines)\n"
+ " {\n"
+ " color = Color;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " vec3 normalDirection;\n"
+ " vec4 ambientColor, diffuseColor, sceneColor;\n"
+ " vec4 ambientLighting, diffuseReflection, specularReflection;\n"
+ " float ndotl, ndoth, pf;\n"
+ " \n"
+ " if (gl_FrontFacing)\n"
+ " {\n"
+ " normalDirection = normalize(Normal);\n"
+ " sceneColor = Color*MatFrontAmbient*LtGlblAmbient;\n"
+ " ambientColor = Color*MatFrontAmbient;\n"
+ " diffuseColor = Color*MatFrontDiffuse;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " normalDirection = -normalize(Normal);\n"
+ " sceneColor = Color*MatBackAmbient*LtGlblAmbient;\n"
+ " ambientColor = Color*MatBackAmbient;\n"
+ " diffuseColor = Color*MatBackDiffuse;\n"
+ " }\n"
+ " \n"
+ " ndotl = max(0.0,dot(normalDirection,LtDirection));\n"
+ " ndoth = max(0.0,dot(normalDirection,LtHalfVector));\n"
+ " if (ndotl == 0.0)\n"
+ " pf = 0.0;\n"
+ " else\n"
+ " pf = pow(ndoth,MatShininess);\n"
+ " ambientLighting = ambientColor*LtAmbient;\n"
+ " diffuseReflection = LtDiffuse*diffuseColor*ndotl;\n"
+ " specularReflection = LtSpecular*MatSpecular*pf;\n"
+ " color = (sceneColor+ambientLighting+diffuseReflection+\n"
+ " specularReflection);\n"
+ " }\n";
+static const GLchar *fragment_shader_out_2_1 =
+ " gl_FragColor = clamp(color,0.0,1.0);\n"
+ "}\n";
+static const GLchar *fragment_shader_out_3_0 =
+ " FragColor = clamp(color,0.0,1.0);\n"
+ "}\n";
+
+#endif /* HAVE_GLSL */
+
+
+
/* Add a rotation around the wx-plane to the matrix m. */
static void rotatewx(float m[4][4], float phi)
{
@@ -557,14 +743,20 @@ static void color(double angle, float mat[3][3], float col[4])
}
-/* Draw a hypertorus projected into 3D. Note that the spirals appearance
- will only work correctly if numu and numv are set to 64 or any higher
- power of 2. Similarly, the banded appearance will only work correctly
- if numu and numv are divisible by 4. */
-static int hypertorus(ModeInfo *mi, double umin, double umax, double vmin,
- double vmax, int numu, int numv)
+/* Draw a hypertorus projected into 3D using OpenGL's fixed
+ functionality. Note that the spirals appearance will only work
+ correctly if numu and numv are set to 64 or any higher power of 2.
+ Similarly, the banded appearance will only work correctly if numu
+ and numv are divisible by 4. */
+static int hypertorus_ff(ModeInfo *mi, double umin, double umax, double vmin,
+ double vmax, int numu, int numv)
{
- int polys = 0;
+ static const GLfloat light_model_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
+ static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+ static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
+ static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
static const GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
static const GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
static const GLfloat mat_diff_oneside[] = { 0.9, 0.4, 0.3, 1.0 };
@@ -580,6 +772,76 @@ static int hypertorus(ModeInfo *mi, double umin, double umax, double vmin,
double r, s, t;
float q1[4], q2[4], r1[4][4], r2[4][4];
hypertorusstruct *hp = &hyper[MI_SCREEN(mi)];
+ int polys;
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ if (projection_3d == DISP_3D_ORTHOGRAPHIC)
+ {
+ if (hp->aspect >= 1.0)
+ glOrtho(-hp->aspect,hp->aspect,-1.0,1.0,0.1,10.0);
+ else
+ glOrtho(-1.0,1.0,-1.0/hp->aspect,1.0/hp->aspect,0.1,10.0);
+ }
+ else
+ {
+ gluPerspective(60.0,hp->aspect,0.1,10.0);
+ }
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ if (display_mode == DISP_SURFACE)
+ {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT,light_model_ambient);
+ glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_FALSE);
+ glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SINGLE_COLOR);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+ glDepthMask(GL_TRUE);
+ glDisable(GL_BLEND);
+ }
+ else if (display_mode == DISP_TRANSPARENT)
+ {
+ glDisable(GL_DEPTH_TEST);
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT,light_model_ambient);
+ glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_FALSE);
+ glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SINGLE_COLOR);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+ glDepthMask(GL_FALSE);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ }
+ else /* display_mode == DISP_WIREFRAME */
+ {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glShadeModel(GL_FLAT);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_LIGHT0);
+ glDisable(GL_BLEND);
+ }
if (change_colors)
rotateall3d(hp->rho,hp->sigma,hp->tau,matc);
@@ -659,7 +921,7 @@ static int hypertorus(ModeInfo *mi, double umin, double umax, double vmin,
{
for (k=0; k<=1; k++)
{
- l = (i+k);
+ l = i+k;
m = j;
u = ur*l/numu+umin;
v = vr*m/numv+vmin;
@@ -739,95 +1001,642 @@ static int hypertorus(ModeInfo *mi, double umin, double umax, double vmin,
n[2] /= t;
glNormal3fv(n);
glVertex3fv(p);
- polys++;
}
}
glEnd();
}
- polys /= 2;
+
+ polys = 2*numu*numv;
+ if (appearance != APPEARANCE_SOLID)
+ polys /= 2;
return polys;
}
-static void init(ModeInfo *mi)
+#ifdef HAVE_GLSL
+
+/* Draw a hypertorus projected into 3D using OpenGL's programmable
+ functionality. Note that the spirals appearance will only work
+ correctly if numu and numv are set to 64 or any higher power of 2.
+ Similarly, the banded appearance will only work correctly if numu
+ and numv are divisible by 4. */
+static int hypertorus_pf(ModeInfo *mi, double umin, double umax, double vmin,
+ double vmax, int numu, int numv)
{
- static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
- static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
- static const GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
- static const GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
- static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_model_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
+ static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+ static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
+ static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_oneside[] = { 0.9, 0.4, 0.3, 1.0 };
+ static const GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.7 };
+ static const GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 };
+ static const GLfloat mat_diff_trans_oneside[] = { 0.9, 0.4, 0.3, 0.7 };
+ static const GLfloat mat_diff_white[] = { 1.0, 1.0, 1.0, 1.0 };
+ GLfloat light_direction[3], half_vector[3], len;
+ GLfloat p_mat[16];
+ float mat_diff_dyn[4], mat_diff_dyn_compl[4];
+ float mat[4][4], matc[3][3];
+ int i, j, k, l, m, o, b, skew;
+ double u, v, ur, vr;
+ float q1[4], q2[4], r1[4][4], r2[4][4];
+ GLsizeiptr index_offset;
hypertorusstruct *hp = &hyper[MI_SCREEN(mi)];
+ int polys;
- hp->alpha = 0.0;
- hp->beta = 0.0;
- hp->delta = 0.0;
- hp->zeta = 0.0;
- hp->eta = 0.0;
- hp->theta = 0.0;
+ if (!hp->use_shaders)
+ return 0;
- hp->rho = frand(360.0);
- hp->sigma = frand(360.0);
- hp->tau = frand(360.0);
+ if (change_colors)
+ rotateall3d(hp->rho,hp->sigma,hp->tau,matc);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- if (projection_3d == DISP_3D_PERSPECTIVE)
- gluPerspective(60.0,1.0,0.1,100.0);
- else
- glOrtho(-1.0,1.0,-1.0,1.0,0.1,100.0);;
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
+ rotateall(hp->alpha,hp->beta,hp->delta,hp->zeta,hp->eta,hp->theta,r1);
-# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
- if (display_mode == DISP_WIREFRAME)
- display_mode = DISP_SURFACE;
-# endif
+ gltrackball_get_quaternion(hp->trackballs[0],q1);
+ gltrackball_get_quaternion(hp->trackballs[1],q2);
+ quats_to_rotmat(q1,q2,r2);
+
+ mult_rotmat(r2,r1,mat);
+
+ if (!hp->buffers_initialized)
+ {
+ /* The u and v values need to be computed once (or each time the value
+ of appearance changes, once we support that). */
+ skew = num_spirals;
+ ur = umax-umin;
+ vr = vmax-vmin;
+ for (i=0; i<=numu; i++)
+ {
+ for (j=0; j<=numv; j++)
+ {
+ u = ur*i/numu+umin;
+ v = vr*j/numv+vmin;
+ o = i*(numv+1)+j;
+ if (appearance == APPEARANCE_SPIRALS)
+ u += 4.0*skew/numv*v;
+ hp->uv[o][0] = u;
+ hp->uv[o][1] = v;
+ }
+ }
+ glBindBuffer(GL_ARRAY_BUFFER,hp->vertex_uv_buffer);
+ glBufferData(GL_ARRAY_BUFFER,2*(NUMU+1)*(NUMV+1)*sizeof(GLfloat),
+ hp->uv,GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+
+ if (!change_colors && colors == COLORS_COLORWHEEL)
+ {
+ for (i=0; i<=numu; i++)
+ {
+ for (j=0; j<=numv; j++)
+ {
+ u = ur*i/numu+umin;
+ v = vr*j/numv+vmin;
+ o = i*(numv+1)+j;
+ if (appearance == APPEARANCE_SPIRALS)
+ {
+ u += 4.0*skew/numv*v;
+ b = ((i/4)&(skew-1))*(numu/(4*skew));
+ color(ur*4*b/numu+umin,matc,&hp->col[o][0]);
+ }
+ else
+ {
+ color(u,matc,&hp->col[o][0]);
+ }
+ }
+ }
+ glBindBuffer(GL_ARRAY_BUFFER,hp->color_buffer);
+ glBufferData(GL_ARRAY_BUFFER,4*(NUMU+1)*(NUMV+1)*sizeof(GLfloat),
+ hp->col,GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+ }
+#ifdef VERTEXATTRIBARRAY_WORKAROUND
+ if (colors != COLORS_COLORWHEEL)
+ {
+ for (i=0; i<=numu; i++)
+ {
+ for (j=0; j<=numv; j++)
+ {
+ o = i*(numv+1)+j;
+ if (display_mode == DISP_WIREFRAME)
+ {
+ if (colors == COLORS_ONESIDED)
+ {
+ for (k=0; k<4; k++)
+ hp->col[o][k] = mat_diff_oneside[k];
+ }
+ else if (colors == COLORS_TWOSIDED)
+ {
+ for (k=0; k<4; k++)
+ hp->col[o][k] = mat_diff_red[k];
+ }
+ }
+ else
+ {
+ for (k=0; k<4; k++)
+ hp->col[o][k] = mat_diff_white[k];
+ }
+ }
+ }
+ glBindBuffer(GL_ARRAY_BUFFER,hp->color_buffer);
+ glBufferData(GL_ARRAY_BUFFER,4*(NUMU+1)*(NUMV+1)*sizeof(GLfloat),
+ hp->col,GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+ }
+#endif /* VERTEXATTRIBARRAY_WORKAROUND */
+
+ /* The indices only need to be computed once (or each time the value
+ of appearance changes, once we support that). */
+ hp->ne = 0;
+ hp->ni = 0;
+ hp->nt = 0;
+ if (display_mode != DISP_WIREFRAME)
+ {
+ for (i=0; i<numu; i++)
+ {
+ if ((appearance == APPEARANCE_BANDS ||
+ appearance == APPEARANCE_SPIRALS) && ((i & 3) >= 2))
+ continue;
+ for (j=0; j<=numv; j++)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = i+k;
+ m = j;
+ o = l*(numv+1)+m;
+ hp->indices[hp->ni++] = o;
+ }
+ }
+ hp->ne++;
+ }
+ hp->nt = 2*(numv+1);
+ }
+ else /* display_mode == DISP_WIREFRAME */
+ {
+ for (i=0; i<numu; i++)
+ {
+ if ((appearance == APPEARANCE_BANDS ||
+ appearance == APPEARANCE_SPIRALS) && ((i & 3) > 2))
+ continue;
+ if ((appearance == APPEARANCE_BANDS ||
+ appearance == APPEARANCE_SPIRALS) && ((i & 3) == 2))
+ {
+ for (j=0; j<numv; j++)
+ {
+ hp->indices[hp->ni++] = i*(numv+1)+j;
+ hp->indices[hp->ni++] = i*(numv+1)+j+1;
+ }
+ continue;
+ }
+ for (j=0; j<numv; j++)
+ {
+ hp->indices[hp->ni++] = i*(numv+1)+j;
+ hp->indices[hp->ni++] = i*(numv+1)+j+1;
+ hp->indices[hp->ni++] = i*(numv+1)+j;
+ hp->indices[hp->ni++] = (i+1)*(numv+1)+j;
+ }
+ }
+ hp->ne = 1;
+ }
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,hp->indices_buffer);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER,hp->ni*sizeof(GLuint),
+ hp->indices,GL_STATIC_DRAW);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
+ hp->buffers_initialized = True;
+ }
+
+ if (change_colors && colors == COLORS_COLORWHEEL)
+ {
+ skew = num_spirals;
+ ur = umax-umin;
+ vr = vmax-vmin;
+ for (i=0; i<=numu; i++)
+ {
+ for (j=0; j<=numv; j++)
+ {
+ u = ur*i/numu+umin;
+ v = vr*j/numv+vmin;
+ o = i*(numv+1)+j;
+ if (appearance == APPEARANCE_SPIRALS)
+ {
+ u += 4.0*skew/numv*v;
+ b = ((i/4)&(skew-1))*(numu/(4*skew));
+ color(ur*4*b/numu+umin,matc,&hp->col[o][0]);
+ }
+ else
+ {
+ color(u,matc,&hp->col[o][0]);
+ }
+ }
+ }
+ }
+#ifdef VERTEXATTRIBARRAY_WORKAROUND
+ else if (change_colors && colors != COLORS_COLORWHEEL)
+ {
+ if (display_mode == DISP_WIREFRAME)
+ {
+ color(0.0,matc,mat_diff_dyn);
+ for (i=0; i<=numu; i++)
+ {
+ for (j=0; j<=numv; j++)
+ {
+ o = i*(numv+1)+j;
+ for (k=0; k<4; k++)
+ hp->col[o][k] = mat_diff_dyn[k];
+ }
+ }
+ }
+ }
+#endif /* VERTEXATTRIBARRAY_WORKAROUND */
+
+ glUseProgram(hp->shader_program);
+
+ glsl_Identity(p_mat);
+ if (projection_3d == DISP_3D_ORTHOGRAPHIC)
+ {
+ if (hp->aspect >= 1.0)
+ glsl_Orthographic(p_mat,-hp->aspect,hp->aspect,-1.0,1.0,
+ 0.1,10.0);
+ else
+ glsl_Orthographic(p_mat,-1.0,1.0,-1.0/hp->aspect,1.0/hp->aspect,
+ 0.1,10.0);
+ }
+ else
+ {
+ glsl_Perspective(p_mat,60.0f,hp->aspect,0.1f,10.0f);
+ }
+ glUniformMatrix4fv(hp->mat_rot_index,1,GL_TRUE,(GLfloat *)mat);
+ glUniformMatrix4fv(hp->mat_p_index,1,GL_FALSE,p_mat);
+ glUniform1i(hp->bool_persp_index,projection_4d == DISP_4D_PERSPECTIVE);
+ glUniform4fv(hp->off4d_index,1,offset4d);
+ glUniform4fv(hp->off3d_index,1,offset3d);
+
+ len = sqrtf(light_position[0]*light_position[0]+
+ light_position[1]*light_position[1]+
+ light_position[2]*light_position[2]);
+ light_direction[0] = light_position[0]/len;
+ light_direction[1] = light_position[1]/len;
+ light_direction[2] = light_position[2]/len;
+ half_vector[0] = light_direction[0];
+ half_vector[1] = light_direction[1];
+ half_vector[2] = light_direction[2]+1.0f;
+ len = sqrtf(half_vector[0]*half_vector[0]+
+ half_vector[1]*half_vector[1]+
+ half_vector[2]*half_vector[2]);
+ half_vector[0] /= len;
+ half_vector[1] /= len;
+ half_vector[2] /= len;
if (display_mode == DISP_SURFACE)
{
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
- glShadeModel(GL_SMOOTH);
- glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
- glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
- glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
- glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
- glLightfv(GL_LIGHT0,GL_POSITION,light_position);
- glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
- glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
glDepthMask(GL_TRUE);
glDisable(GL_BLEND);
+ glUniform4fv(hp->glbl_ambient_index,1,light_model_ambient);
+ glUniform4fv(hp->lt_ambient_index,1,light_ambient);
+ glUniform4fv(hp->lt_diffuse_index,1,light_diffuse);
+ glUniform4fv(hp->lt_specular_index,1,light_specular);
+ glUniform3fv(hp->lt_direction_index,1,light_direction);
+ glUniform3fv(hp->lt_halfvect_index,1,half_vector);
+ glUniform4fv(hp->specular_index,1,mat_specular);
+ glUniform1f(hp->shininess_index,50.0f);
+ glUniform1i(hp->draw_lines_index,GL_FALSE);
}
else if (display_mode == DISP_TRANSPARENT)
{
glDisable(GL_DEPTH_TEST);
- glShadeModel(GL_SMOOTH);
- glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
- glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
- glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
- glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
- glLightfv(GL_LIGHT0,GL_POSITION,light_position);
- glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
- glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
glDepthMask(GL_FALSE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ glUniform4fv(hp->glbl_ambient_index,1,light_model_ambient);
+ glUniform4fv(hp->lt_ambient_index,1,light_ambient);
+ glUniform4fv(hp->lt_diffuse_index,1,light_diffuse);
+ glUniform4fv(hp->lt_specular_index,1,light_specular);
+ glUniform3fv(hp->lt_direction_index,1,light_direction);
+ glUniform3fv(hp->lt_halfvect_index,1,half_vector);
+ glUniform4fv(hp->specular_index,1,mat_specular);
+ glUniform1f(hp->shininess_index,50.0f);
+ glUniform1i(hp->draw_lines_index,GL_FALSE);
}
- else /* display_mode == DISP_WIREFRAME */
+ else /* display_mode == DISP_WIREFRAME */
{
- glDisable(GL_DEPTH_TEST);
- glShadeModel(GL_FLAT);
- glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
- glDisable(GL_LIGHTING);
- glDisable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glDepthMask(GL_TRUE);
glDisable(GL_BLEND);
+ glUniform1i(hp->draw_lines_index,GL_TRUE);
}
+
+ glUniform4fv(hp->front_ambient_index,1,mat_diff_white);
+ glUniform4fv(hp->front_diffuse_index,1,mat_diff_white);
+ glUniform4fv(hp->back_ambient_index,1,mat_diff_white);
+ glUniform4fv(hp->back_diffuse_index,1,mat_diff_white);
+ glVertexAttrib4f(hp->color_index,1.0f,1.0f,1.0f,1.0f);
+ if (!change_colors)
+ {
+ if (colors == COLORS_ONESIDED)
+ {
+ if (display_mode == DISP_TRANSPARENT)
+ {
+ glUniform4fv(hp->front_ambient_index,1,mat_diff_trans_oneside);
+ glUniform4fv(hp->front_diffuse_index,1,mat_diff_trans_oneside);
+ glUniform4fv(hp->back_ambient_index,1,mat_diff_trans_oneside);
+ glUniform4fv(hp->back_diffuse_index,1,mat_diff_trans_oneside);
+ }
+ else if (display_mode == DISP_SURFACE)
+ {
+ glUniform4fv(hp->front_ambient_index,1,mat_diff_oneside);
+ glUniform4fv(hp->front_diffuse_index,1,mat_diff_oneside);
+ glUniform4fv(hp->back_ambient_index,1,mat_diff_oneside);
+ glUniform4fv(hp->back_diffuse_index,1,mat_diff_oneside);
+ }
+ else /* display_mode == DISP_WIREFRAME */
+ {
+ glVertexAttrib4fv(hp->color_index,mat_diff_oneside);
+ }
+ }
+ else if (colors == COLORS_TWOSIDED)
+ {
+ if (display_mode == DISP_TRANSPARENT)
+ {
+ glUniform4fv(hp->front_ambient_index,1,mat_diff_trans_red);
+ glUniform4fv(hp->front_diffuse_index,1,mat_diff_trans_red);
+ glUniform4fv(hp->back_ambient_index,1,mat_diff_trans_green);
+ glUniform4fv(hp->back_diffuse_index,1,mat_diff_trans_green);
+ }
+ else if (display_mode == DISP_SURFACE)
+ {
+ glUniform4fv(hp->front_ambient_index,1,mat_diff_red);
+ glUniform4fv(hp->front_diffuse_index,1,mat_diff_red);
+ glUniform4fv(hp->back_ambient_index,1,mat_diff_green);
+ glUniform4fv(hp->back_diffuse_index,1,mat_diff_green);
+ }
+ else /* display_mode == DISP_WIREFRAME */
+ {
+ glVertexAttrib4fv(hp->color_index,mat_diff_red);
+ }
+ }
+ }
+ else /* change_colors */
+ {
+ color(0.0,matc,mat_diff_dyn);
+ if (colors == COLORS_ONESIDED)
+ {
+ if (display_mode == DISP_TRANSPARENT || display_mode == DISP_SURFACE)
+ {
+ glUniform4fv(hp->front_ambient_index,1,mat_diff_dyn);
+ glUniform4fv(hp->front_diffuse_index,1,mat_diff_dyn);
+ glUniform4fv(hp->back_ambient_index,1,mat_diff_dyn);
+ glUniform4fv(hp->back_diffuse_index,1,mat_diff_dyn);
+ }
+ else /* display_mode == DISP_WIREFRAME */
+ {
+ glVertexAttrib4fv(hp->color_index,mat_diff_dyn);
+ }
+ }
+ else if (colors == COLORS_TWOSIDED)
+ {
+ if (display_mode == DISP_TRANSPARENT || display_mode == DISP_SURFACE)
+ {
+ mat_diff_dyn_compl[0] = 1.0f-mat_diff_dyn[0];
+ mat_diff_dyn_compl[1] = 1.0f-mat_diff_dyn[1];
+ mat_diff_dyn_compl[2] = 1.0f-mat_diff_dyn[2];
+ mat_diff_dyn_compl[3] = mat_diff_dyn[3];
+ glUniform4fv(hp->front_ambient_index,1,mat_diff_dyn);
+ glUniform4fv(hp->front_diffuse_index,1,mat_diff_dyn);
+ glUniform4fv(hp->back_ambient_index,1,mat_diff_dyn_compl);
+ glUniform4fv(hp->back_diffuse_index,1,mat_diff_dyn_compl);
+ }
+ else /* display_mode == DISP_WIREFRAME */
+ {
+ glVertexAttrib4fv(hp->color_index,mat_diff_dyn);
+ }
+ }
+ }
+
+ glEnableVertexAttribArray(hp->vertex_uv_index);
+ glBindBuffer(GL_ARRAY_BUFFER,hp->vertex_uv_buffer);
+ glVertexAttribPointer(hp->vertex_uv_index,2,GL_FLOAT,GL_FALSE,0,0);
+
+ if (colors == COLORS_COLORWHEEL)
+ {
+ glEnableVertexAttribArray(hp->color_index);
+ glBindBuffer(GL_ARRAY_BUFFER,hp->color_buffer);
+ if (change_colors)
+ glBufferData(GL_ARRAY_BUFFER,4*(NUMU+1)*(NUMV+1)*sizeof(GLfloat),
+ hp->col,GL_STREAM_DRAW);
+ glVertexAttribPointer(hp->color_index,4,GL_FLOAT,GL_FALSE,0,0);
+ }
+#ifdef VERTEXATTRIBARRAY_WORKAROUND
+ else
+ {
+ glEnableVertexAttribArray(hp->color_index);
+ glBindBuffer(GL_ARRAY_BUFFER,hp->color_buffer);
+ if (change_colors)
+ glBufferData(GL_ARRAY_BUFFER,4*(NUMU+1)*(NUMV+1)*sizeof(GLfloat),
+ hp->col,GL_STREAM_DRAW);
+ glVertexAttribPointer(hp->color_index,4,GL_FLOAT,GL_FALSE,0,0);
+ }
+#endif /* VERTEXATTRIBARRAY_WORKAROUND */
+
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,hp->indices_buffer);
+
+ if (display_mode != DISP_WIREFRAME)
+ {
+ for (i=0; i<hp->ne; i++)
+ {
+ index_offset = hp->nt*i*sizeof(GLuint);
+ glDrawElements(GL_TRIANGLE_STRIP,hp->nt,GL_UNSIGNED_INT,
+ (const void *)index_offset);
+ }
+ }
+ else /* display_mode == DISP_WIREFRAME */
+ {
+ glLineWidth(1.0f);
+ index_offset = 0;
+ glDrawElements(GL_LINES,hp->ni,GL_UNSIGNED_INT,
+ (const void *)index_offset);
+ }
+
+ glDisableVertexAttribArray(hp->vertex_uv_index);
+ if (colors == COLORS_COLORWHEEL)
+ glDisableVertexAttribArray(hp->color_index);
+#ifdef VERTEXATTRIBARRAY_WORKAROUND
+ else
+ glDisableVertexAttribArray(hp->color_index);
+#endif /* VERTEXATTRIBARRAY_WORKAROUND */
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
+
+ glUseProgram(0);
+
+ polys = 2*numu*numv;
+ if (appearance != APPEARANCE_SOLID)
+ polys /= 2;
+ return polys;
+}
+
+
+static void init_glsl(ModeInfo *mi)
+{
+ hypertorusstruct *hp = &hyper[MI_SCREEN(mi)];
+ GLint gl_major, gl_minor, glsl_major, glsl_minor;
+ GLboolean gl_gles3;
+ const GLchar *vertex_shader_source[3];
+ const GLchar *fragment_shader_source[4];
+
+ /* Determine whether to use shaders to render the hypertorus. */
+ hp->use_shaders = False;
+ hp->buffers_initialized = False;
+ hp->shader_program = 0;
+ hp->ni = 0;
+ hp->ne = 0;
+ hp->nt = 0;
+
+ if (!glsl_GetGlAndGlslVersions(&gl_major,&gl_minor,&glsl_major,&glsl_minor,
+ &gl_gles3))
+ return;
+ if (!gl_gles3)
+ {
+ if (gl_major < 3 ||
+ (glsl_major < 1 || (glsl_major == 1 && glsl_minor < 30)))
+ {
+ if ((gl_major < 2 || (gl_major == 2 && gl_minor < 1)) ||
+ (glsl_major < 1 || (glsl_major == 1 && glsl_minor < 20)))
+ return;
+ /* We have at least OpenGL 2.1 and at least GLSL 1.20. */
+ vertex_shader_source[0] = shader_version_2_1;
+ vertex_shader_source[1] = vertex_shader_attribs_2_1;
+ vertex_shader_source[2] = vertex_shader_main;
+ fragment_shader_source[0] = shader_version_2_1;
+ fragment_shader_source[1] = fragment_shader_attribs_2_1;
+ fragment_shader_source[2] = fragment_shader_main;
+ fragment_shader_source[3] = fragment_shader_out_2_1;
+ }
+ else
+ {
+ /* We have at least OpenGL 3.0 and at least GLSL 1.30. */
+ vertex_shader_source[0] = shader_version_3_0;
+ vertex_shader_source[1] = vertex_shader_attribs_3_0;
+ vertex_shader_source[2] = vertex_shader_main;
+ fragment_shader_source[0] = shader_version_3_0;
+ fragment_shader_source[1] = fragment_shader_attribs_3_0;
+ fragment_shader_source[2] = fragment_shader_main;
+ fragment_shader_source[3] = fragment_shader_out_3_0;
+ }
+ }
+ else /* gl_gles3 */
+ {
+ if (gl_major < 3 || glsl_major < 3)
+ return;
+ /* We have at least OpenGL ES 3.0 and at least GLSL ES 3.0. */
+ vertex_shader_source[0] = shader_version_3_0_es;
+ vertex_shader_source[1] = vertex_shader_attribs_3_0;
+ vertex_shader_source[2] = vertex_shader_main;
+ fragment_shader_source[0] = shader_version_3_0_es;
+ fragment_shader_source[1] = fragment_shader_attribs_3_0;
+ fragment_shader_source[2] = fragment_shader_main;
+ fragment_shader_source[3] = fragment_shader_out_3_0;
+ }
+ if (!glsl_CompileAndLinkShaders(3,vertex_shader_source,
+ 4,fragment_shader_source,
+ &hp->shader_program))
+ return;
+ hp->vertex_uv_index = glGetAttribLocation(hp->shader_program,"VertexUV");
+ hp->color_index = glGetAttribLocation(hp->shader_program,"VertexColor");
+ if (hp->vertex_uv_index == -1 || hp->color_index == -1)
+ {
+ glDeleteProgram(hp->shader_program);
+ return;
+ }
+ hp->mat_rot_index = glGetUniformLocation(hp->shader_program,
+ "MatRot4D");
+ hp->mat_p_index = glGetUniformLocation(hp->shader_program,
+ "MatProj");
+ hp->bool_persp_index = glGetUniformLocation(hp->shader_program,
+ "BoolPersp");
+ hp->off4d_index = glGetUniformLocation(hp->shader_program,
+ "Offset4D");
+ hp->off3d_index = glGetUniformLocation(hp->shader_program,
+ "Offset3D");
+ hp->draw_lines_index = glGetUniformLocation(hp->shader_program,
+ "DrawLines");
+ hp->glbl_ambient_index = glGetUniformLocation(hp->shader_program,
+ "LtGlblAmbient");
+ hp->lt_ambient_index = glGetUniformLocation(hp->shader_program,
+ "LtAmbient");
+ hp->lt_diffuse_index = glGetUniformLocation(hp->shader_program,
+ "LtDiffuse");
+ hp->lt_specular_index = glGetUniformLocation(hp->shader_program,
+ "LtSpecular");
+ hp->lt_direction_index = glGetUniformLocation(hp->shader_program,
+ "LtDirection");
+ hp->lt_halfvect_index = glGetUniformLocation(hp->shader_program,
+ "LtHalfVector");
+ hp->front_ambient_index = glGetUniformLocation(hp->shader_program,
+ "MatFrontAmbient");
+ hp->back_ambient_index = glGetUniformLocation(hp->shader_program,
+ "MatBackAmbient");
+ hp->front_diffuse_index = glGetUniformLocation(hp->shader_program,
+ "MatFrontDiffuse");
+ hp->back_diffuse_index = glGetUniformLocation(hp->shader_program,
+ "MatBackDiffuse");
+ hp->specular_index = glGetUniformLocation(hp->shader_program,
+ "MatSpecular");
+ hp->shininess_index = glGetUniformLocation(hp->shader_program,
+ "MatShininess");
+ if (hp->mat_rot_index == -1 || hp->mat_p_index == -1 ||
+ hp->bool_persp_index == -1 || hp->off4d_index == -1 ||
+ hp->off3d_index == -1 || hp->draw_lines_index == -1 ||
+ hp->glbl_ambient_index == -1 || hp->lt_ambient_index == -1 ||
+ hp->lt_diffuse_index == -1 || hp->lt_specular_index == -1 ||
+ hp->lt_direction_index == -1 || hp->lt_halfvect_index == -1 ||
+ hp->specular_index == -1 || hp->shininess_index == -1 ||
+ hp->front_ambient_index == -1 || hp->back_ambient_index == -1 ||
+ hp->front_diffuse_index == -1 || hp->back_diffuse_index == -1)
+ {
+ glDeleteProgram(hp->shader_program);
+ return;
+ }
+
+ glGenBuffers(1,&hp->vertex_uv_buffer);
+ glGenBuffers(1,&hp->color_buffer);
+ glGenBuffers(1,&hp->indices_buffer);
+
+ hp->use_shaders = True;
+}
+
+#endif /* HAVE_GLSL */
+
+
+static void init(ModeInfo *mi)
+{
+ hypertorusstruct *hp = &hyper[MI_SCREEN(mi)];
+
+ hp->alpha = 0.0;
+ hp->beta = 0.0;
+ hp->delta = 0.0;
+ hp->zeta = 0.0;
+ hp->eta = 0.0;
+ hp->theta = 0.0;
+
+ hp->rho = frand(360.0);
+ hp->sigma = frand(360.0);
+ hp->tau = frand(360.0);
+
+#ifdef HAVE_GLSL
+ init_glsl(mi);
+#endif /* HAVE_GLSL */
+
+#ifdef HAVE_ANDROID
+ /* glPolygonMode(...,GL_LINE) is not supported for an OpenGL ES 1.1
+ context. */
+ if (!hp->use_shaders && display_mode == DISP_WIREFRAME)
+ display_mode = DISP_SURFACE;
+#endif /* HAVE_ANDROID */
}
@@ -871,23 +1680,12 @@ static void display_hypertorus(ModeInfo *mi)
}
}
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- if (projection_3d == DISP_3D_ORTHOGRAPHIC)
- {
- if (hp->aspect >= 1.0)
- glOrtho(-hp->aspect,hp->aspect,-1.0,1.0,0.1,100.0);
- else
- glOrtho(-1.0,1.0,-1.0/hp->aspect,1.0/hp->aspect,0.1,100.0);
- }
+#ifdef HAVE_GLSL
+ if (hp->use_shaders)
+ mi->polygon_count = hypertorus_pf(mi,0.0,2.0*M_PI,0.0,2.0*M_PI,NUMU,NUMV);
else
- {
- gluPerspective(60.0,hp->aspect,0.1,100.0);
- }
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- mi->polygon_count = hypertorus(mi,0.0,2.0*M_PI,0.0,2.0*M_PI,64,64);
+#endif /* HAVE_GLSL */
+ mi->polygon_count = hypertorus_ff(mi,0.0,2.0*M_PI,0.0,2.0*M_PI,NUMU,NUMV);
}
@@ -983,7 +1781,6 @@ ENTRYPOINT void init_hypertorus(ModeInfo *mi)
MI_INIT(mi, hyper);
hp = &hyper[MI_SCREEN(mi)];
-
hp->trackballs[0] = gltrackball_init(True);
hp->trackballs[1] = gltrackball_init(True);
hp->current_trackball = 0;
@@ -1100,7 +1897,6 @@ ENTRYPOINT void init_hypertorus(ModeInfo *mi)
if ((hp->glx_context = init_GL(mi)) != NULL)
{
reshape_hypertorus(mi,MI_WIDTH(mi),MI_HEIGHT(mi));
- glDrawBuffer(GL_BACK);
init(mi);
}
else
@@ -1130,8 +1926,9 @@ ENTRYPOINT void draw_hypertorus(ModeInfo *mi)
glXMakeCurrent(display, window, *hp->glx_context);
+ glClearColor(0.0f,0.0f,0.0f,1.0f);
+ glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
- glLoadIdentity();
display_hypertorus(mi);
@@ -1157,6 +1954,7 @@ ENTRYPOINT void change_hypertorus(ModeInfo *mi)
}
#endif /* !STANDALONE */
+
ENTRYPOINT void free_hypertorus(ModeInfo *mi)
{
hypertorusstruct *hp = &hyper[MI_SCREEN(mi)];
@@ -1164,8 +1962,22 @@ ENTRYPOINT void free_hypertorus(ModeInfo *mi)
glXMakeCurrent (MI_DISPLAY(mi), MI_WINDOW(mi), *hp->glx_context);
gltrackball_free (hp->trackballs[0]);
gltrackball_free (hp->trackballs[1]);
+#ifdef HAVE_GLSL
+ if (hp->use_shaders)
+ {
+ glDeleteBuffers(1,&hp->vertex_uv_buffer);
+ glDeleteBuffers(1,&hp->color_buffer);
+ glDeleteBuffers(1,&hp->indices_buffer);
+ if (hp->shader_program != 0)
+ {
+ glUseProgram(0);
+ glDeleteProgram(hp->shader_program);
+ }
+ }
+#endif /* HAVE_GLSL */
}
+
XSCREENSAVER_MODULE ("Hypertorus", hypertorus)
#endif /* USE_GL */
diff --git a/hacks/glx/hypertorus.man b/hacks/glx/hypertorus.man
index 8f0837e..fc6b668 100644
--- a/hacks/glx/hypertorus.man
+++ b/hacks/glx/hypertorus.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-hypertorus - Draws a hypertorus that rotates in 4d
+hypertorus \- Draws a hypertorus that rotates in 4d
.SH SYNOPSIS
.B hypertorus
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/hypnowheel.c b/hacks/glx/hypnowheel.c
index 76896da..1032ae6 100644
--- a/hacks/glx/hypnowheel.c
+++ b/hacks/glx/hypnowheel.c
@@ -25,8 +25,6 @@
"*suppressRotationAnimation: True\n" \
# define release_hypnowheel 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "colors.h"
@@ -156,13 +154,12 @@ reshape_hypnowheel (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
diff --git a/hacks/glx/hypnowheel.man b/hacks/glx/hypnowheel.man
index 233c945..9242a30 100644
--- a/hacks/glx/hypnowheel.man
+++ b/hacks/glx/hypnowheel.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-hypnowheel - draws overlapping, translucent spiral patterns
+hypnowheel \- draws overlapping, translucent spiral patterns
.SH SYNOPSIS
.B hypnowheel
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/involute.c b/hacks/glx/involute.c
index 5b49bf0..bc38c71 100644
--- a/hacks/glx/involute.c
+++ b/hacks/glx/involute.c
@@ -11,32 +11,10 @@
* Utilities for rendering OpenGL gears with involute teeth.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
-
#include "screenhackI.h"
-
-#ifndef HAVE_JWXYZ
-# include <GL/glx.h>
-# include <GL/glu.h>
-#endif
-
-#ifdef HAVE_ANDROID
-# include <GLES/gl.h>
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
#include "involute.h"
#include "normals.h"
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
-
/* For debugging: if true then in wireframe, do not abbreviate. */
static Bool wire_all_p = False;
static Bool show_normals_p = False;
diff --git a/hacks/glx/jigglypuff.c b/hacks/glx/jigglypuff.c
index d67a14d..22b8408 100644
--- a/hacks/glx/jigglypuff.c
+++ b/hacks/glx/jigglypuff.c
@@ -47,10 +47,6 @@
# include "xlock.h"
#endif
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
#include "ximage-loader.h"
#include "gltrackball.h"
#include "images/gen/jigglymap_png.h"
@@ -167,9 +163,6 @@ static argtype vars[] = {
{&damping, "damping", "Damping", DEF_DAMPING, t_Int}
};
-#undef countof
-#define countof(x) ((int)(sizeof(x)/sizeof(*(x))))
-
ENTRYPOINT ModeSpecOpt jigglypuff_opts = {countof(opts), opts, countof(vars), vars, NULL};
#define COLOR_STYLE_NORMAL 0
@@ -254,6 +247,7 @@ struct vertex {
vertex *next, *next0;
};
+
static inline void vector_init(vector v, coord x, coord y, coord z)
{
v[0] = x;
@@ -989,14 +983,12 @@ ENTRYPOINT void draw_jigglypuff(ModeInfo *mi)
glTranslatef(0,0,-10);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glRotatef(js->angle, sin(js->axis), cos(js->axis), -sin(js->axis));
glTranslatef(0, 0, 5);
diff --git a/hacks/glx/jigglypuff.man b/hacks/glx/jigglypuff.man
index 4a5f8bf..04b2fb0 100644
--- a/hacks/glx/jigglypuff.man
+++ b/hacks/glx/jigglypuff.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-jigglypuff - save your screen by tormenting your eyes.
+jigglypuff \- save your screen by tormenting your eyes.
.SH SYNOPSIS
.B jigglypuff
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/jigsaw.c b/hacks/glx/jigsaw.c
index 9c9e911..206c346 100644
--- a/hacks/glx/jigsaw.c
+++ b/hacks/glx/jigsaw.c
@@ -48,7 +48,7 @@
#define DEF_WOBBLE "True"
#define DEF_DEBUG "False"
-#define DEF_FONT "-*-helvetica-bold-r-normal-*-*-240-*-*-*-*-*-*"
+#define DEF_FONT "sans-serif bold 24"
#define DEFAULTS "*delay: 20000 \n" \
"*showFPS: False \n" \
"*font: " DEF_FONT"\n" \
@@ -60,16 +60,6 @@
# define release_jigsaw 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
-#ifdef HAVE_JWXYZ
-# include "jwxyz.h"
-#else
-# include <X11/Xlib.h>
-# include <GL/gl.h>
-# include <GL/glu.h>
-#endif
#include "xlockmore.h"
#include "rotator.h"
@@ -79,9 +69,7 @@
#include "grab-ximage.h"
#include "texfont.h"
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#else /* !HAVE_JWZGLES */
+#ifndef HAVE_JWZGLES
# define HAVE_TESS
#endif /* !HAVE_JWZGLES */
@@ -1344,13 +1332,12 @@ reshape_jigsaw (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
diff --git a/hacks/glx/jigsaw.man b/hacks/glx/jigsaw.man
index c7d3493..1780f55 100644
--- a/hacks/glx/jigsaw.man
+++ b/hacks/glx/jigsaw.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "25-Aug-2008" "X Version 11"
.SH NAME
-jigsaw - permute an image like a jigsaw puzzle
+jigsaw \- permute an image like a jigsaw puzzle
.SH SYNOPSIS
.B jigsaw
[\-display \fIhost:display.screen\fP]
@@ -21,7 +21,7 @@ or from a random file on disk, as indicated by
the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
file; see
-.BR xscreensaver-demo (1)
+.BR xscreensaver\-settings (1)
for more details.
.SH OPTIONS
.I jigsaw
@@ -76,8 +76,8 @@ stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1),
-.BR xscreensaver\-demo (1),
-.BR xscreensaver\-getimage (1)
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-getimage (MANSUFFIX)
.SH COPYRIGHT
Copyright \(co 1997 by Jamie Zawinski. Permission to use, copy, modify,
distribute, and sell this software and its documentation for any purpose is
diff --git a/hacks/glx/juggler3d.c b/hacks/glx/juggler3d.c
index 1b7d7c6..31228be 100644
--- a/hacks/glx/juggler3d.c
+++ b/hacks/glx/juggler3d.c
@@ -131,13 +131,11 @@
"*count: 200 \n" \
"*cycles: 1000 \n" \
"*ncolors: 32 \n" \
- "*titleFont: -*-helvetica-bold-r-normal-*-*-180-*-*-*-*-*-*\n" \
+ "*titleFont: sans-serif bold 18\n" \
"*showFPS: False \n" \
"*wireframe: False \n" \
# define release_juggle 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "sphere.h"
@@ -2995,10 +2993,12 @@ draw_juggle (ModeInfo *mi)
}
}
+#ifndef HAVE_ANDROID /* Doesn't work -- causes whole scene to be black */
glColor3f (1, 1, 0);
print_texture_label (mi->dpy, sp->font_data,
mi->xgwa.width, mi->xgwa.height,
1, sp->pattern);
+#endif
#ifdef MEMTEST
if((int)(sp->time/10) % 1000 == 0)
diff --git a/hacks/glx/juggler3d.man b/hacks/glx/juggler3d.man
index 48d4716..f410489 100644
--- a/hacks/glx/juggler3d.man
+++ b/hacks/glx/juggler3d.man
@@ -2,7 +2,7 @@
.\" ** The above line should force tbl to be used as a preprocessor **
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-juggler3d - juggling man screen saver.
+juggler3d \- juggling man screen saver.
.SH SYNOPSIS
.B juggler3d
[\-display host:display.screen ]
diff --git a/hacks/glx/kaleidocycle.c b/hacks/glx/kaleidocycle.c
index b3a7fee..cd39f0e 100644
--- a/hacks/glx/kaleidocycle.c
+++ b/hacks/glx/kaleidocycle.c
@@ -22,8 +22,6 @@
"*suppressRotationAnimation: True\n" \
# define release_kaleidocycle 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "colors.h"
@@ -109,13 +107,12 @@ reshape_kaleidocycle (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
diff --git a/hacks/glx/kaleidocycle.man b/hacks/glx/kaleidocycle.man
index 874d82d..23c8e35 100644
--- a/hacks/glx/kaleidocycle.man
+++ b/hacks/glx/kaleidocycle.man
@@ -1,19 +1,6 @@
-.de EX \"Begin example
-.ne 5
-.if n .sp 1
-.if t .sp .5
-.nf
-.in +.5i
-..
-.de EE
-.fi
-.in -.5i
-.if n .sp 1
-.if t .sp .5
-..
.TH XScreenSaver 1 "25-Jul-98" "X Version 11"
.SH NAME
-kaleidocycle - draws twistable rings of tetrahedra
+kaleidocycle \- draws twistable rings of tetrahedra
.SH SYNOPSIS
.B kaleidocycle
[\-display \fIhost:display.screen\fP] [\-window] [\-root]
diff --git a/hacks/glx/klein.c b/hacks/glx/klein.c
index 7be5157..7971e97 100644
--- a/hacks/glx/klein.c
+++ b/hacks/glx/klein.c
@@ -5,7 +5,7 @@
static const char sccsid[] = "@(#)klein.c 1.1 04/10/08 xlockmore";
#endif
-/* Copyright (c) 2005-2020 Carsten Steger <carsten@mirsanmir.org>. */
+/* Copyright (c) 2005-2021 Carsten Steger <carsten@mirsanmir.org>. */
/*
* Permission to use, copy, modify, and distribute this software and its
@@ -22,10 +22,12 @@ static const char sccsid[] = "@(#)klein.c 1.1 04/10/08 xlockmore";
*
* REVISION HISTORY:
* C. Steger - 04/10/08: Initial version
- * C. Steger - 03/08/09: Changes to the parameter handling
- * C. Steger - 25/12/13: Added the squeezed torus Klein bottle
- * C. Steger - 03/10/14: Moved the curlicue texture to curlicue.h
- * C. Steger - 11/01/20: Added the changing colors mode.
+ * C. Steger - 09/08/03: Changes to the parameter handling
+ * C. Steger - 13/12/25: Added the squeezed torus Klein bottle
+ * C. Steger - 14/10/03: Moved the curlicue texture to curlicue.h
+ * C. Steger - 20/01/11: Added the changing colors mode
+ * C. Steger - 20/12/12: Added per-fragment shading
+ * C. Steger - 20/12/30: Make the shader code work under macOS and iOS
*/
/*
@@ -157,9 +159,11 @@ static const char sccsid[] = "@(#)klein.c 1.1 04/10/08 xlockmore";
#define DEF_WALK_DIRECTION "7.0"
#define DEF_WALK_SPEED "20.0"
+
#ifdef STANDALONE
-# define DEFAULTS "*delay: 10000 \n" \
+# define DEFAULTS "*delay: 25000 \n" \
"*showFPS: False \n" \
+ "*prefersGLSL: True \n" \
# define release_klein 0
# include "xlockmore.h" /* from the xscreensaver distribution */
@@ -173,6 +177,7 @@ static const char sccsid[] = "@(#)klein.c 1.1 04/10/08 xlockmore";
# include <X11/keysym.h>
#endif
+#include "glsl-utils.h"
#include "gltrackball.h"
@@ -275,6 +280,9 @@ ENTRYPOINT ModeSpecOpt klein_opts =
/* Radius of the figure-8 Klein bottle */
#define FIGURE_8_RADIUS 2.0
+/* An increment for the radius of the figure-8 Klein bottle */
+#define RADIUS_INCR 1.25
+
/* Radius of the pinched torus Klein bottle */
#define PINCHED_TORUS_RADIUS 2.0
@@ -337,11 +345,272 @@ typedef struct {
Bool button_pressed;
/* A random factor to modify the rotation speeds */
float speed_scale;
+#ifdef HAVE_GLSL
+ GLfloat uv[(NUMU+1)*(NUMV+1)][2];
+ GLuint indices[4*(NUMU+1)*(NUMV+1)];
+ Bool use_shaders, buffers_initialized;
+ GLuint shader_program;
+ GLint vertex_uv_index, vertex_t_index, color_index;
+ GLint mat_rot_index, mat_p_index, bool_persp_index;
+ GLint off4d_index, off3d_index, bool_textures_index;
+ GLint bottle_type_index, draw_lines_index;
+ GLint glbl_ambient_index, lt_ambient_index;
+ GLint lt_diffuse_index, lt_specular_index;
+ GLint lt_direction_index, lt_halfvect_index;
+ GLint front_ambient_index, back_ambient_index;
+ GLint front_diffuse_index, back_diffuse_index;
+ GLint specular_index, shininess_index;
+ GLint texture_sampler_index;
+ GLuint vertex_uv_buffer, vertex_t_buffer;
+ GLuint color_buffer, indices_buffer;
+ GLint ni, ne, nt;
+#endif /* HAVE_GLSL */
} kleinstruct;
static kleinstruct *klein = (kleinstruct *) NULL;
+#ifdef HAVE_GLSL
+
+#define STRH(x) #x
+#define STR(x) STRH(x)
+
+/* The GLSL versions that correspond to different versions of OpenGL. */
+static const GLchar *shader_version_2_1 =
+ "#version 120\n";
+static const GLchar *shader_version_3_0 =
+ "#version 130\n";
+static const GLchar *shader_version_3_0_es =
+ "#version 300 es\n"
+ "precision highp float;\n"
+ "precision highp int;\n";
+
+/* The vertex shader code is composed of code fragments that depend on
+ the OpenGL version and code fragments that are version-independent.
+ They are concatenated by glsl_CompileAndLinkShaders in the function
+ init_glsl(). */
+static const GLchar *vertex_shader_attribs_2_1 =
+ "attribute vec2 VertexUV;\n"
+ "attribute vec4 VertexT;\n"
+ "attribute vec4 VertexColor;\n"
+ "\n"
+ "varying vec3 Normal;\n"
+ "varying vec4 Color;\n"
+ "varying vec4 TexCoord;\n"
+ "\n";
+static const GLchar *vertex_shader_attribs_3_0 =
+ "in vec2 VertexUV;\n"
+ "in vec4 VertexT;\n"
+ "in vec4 VertexColor;\n"
+ "\n"
+ "out vec3 Normal;\n"
+ "out vec4 Color;\n"
+ "out vec4 TexCoord;\n"
+ "\n";
+static const GLchar *vertex_shader_main =
+ "#define KLEIN_BOTTLE_FIGURE_8 "STR(KLEIN_BOTTLE_FIGURE_8)"\n"
+ "#define KLEIN_BOTTLE_PINCHED_TORUS "STR(KLEIN_BOTTLE_PINCHED_TORUS)"\n"
+ "#define KLEIN_BOTTLE_LAWSON "STR(KLEIN_BOTTLE_LAWSON)"\n"
+ "#define FIGURE_8_RADIUS "STR(FIGURE_8_RADIUS)"f\n"
+ "#define PINCHED_TORUS_RADIUS "STR(PINCHED_TORUS_RADIUS)"f\n"
+ "#define RADIUS_INCR "STR(RADIUS_INCR)"f\n"
+ "\n"
+ "uniform mat4 MatRot4D;\n"
+ "uniform mat4 MatProj;\n"
+ "uniform bool BoolPersp;\n"
+ "uniform vec4 Offset4D;\n"
+ "uniform vec4 Offset3D;\n"
+ "uniform bool BoolTextures;\n"
+ "uniform int BottleType;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " float u, v;\n"
+ " vec4 x, xu, xv, xx, xxu, xxv;\n"
+ " vec3 p, pu, pv;\n"
+ " u = VertexUV.x;\n"
+ " v = VertexUV.y;\n"
+ " if (BottleType == KLEIN_BOTTLE_FIGURE_8)\n"
+ " {\n"
+ " float su, cu, sv, cv, s2u, c2u, sv2, cv2;\n"
+ " cu = cos(u);\n"
+ " su = sin(u);\n"
+ " cv = cos(v);\n"
+ " sv = sin(v);\n"
+ " cv2 = cos(0.5f*v);\n"
+ " sv2 = sin(0.5f*v);\n"
+ " c2u = cos(2.0f*u);\n"
+ " s2u = sin(2.0f*u);\n"
+ " xx = vec4((su*cv2-s2u*sv2+FIGURE_8_RADIUS)*cv,\n"
+ " (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*sv,\n"
+ " su*sv2+s2u*cv2,\n"
+ " cu)/(FIGURE_8_RADIUS+RADIUS_INCR);\n"
+ " xxu = vec4((cu*cv2-2.0f*c2u*sv2)*cv,\n"
+ " (cu*cv2-2.0f*c2u*sv2)*sv,\n"
+ " cu*sv2+2.0f*c2u*cv2,\n"
+ " -su)/(FIGURE_8_RADIUS+RADIUS_INCR);\n"
+ " xxv = vec4(((-0.5f*su*sv2-0.5f*s2u*cv2)*cv-\n"
+ " (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*sv),\n"
+ " ((-0.5f*su*sv2-0.5f*s2u*cv2)*sv+\n"
+ " (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*cv),\n"
+ " 0.5f*su*cv2-0.5f*s2u*sv2,\n"
+ " 0.0f)/(FIGURE_8_RADIUS+RADIUS_INCR);\n"
+ " }\n"
+ " else if (BottleType == KLEIN_BOTTLE_PINCHED_TORUS)\n"
+ " {\n"
+ " float cu, su, cv, sv, cv2, sv2;\n"
+ " cu = cos(u);\n"
+ " su = sin(u);\n"
+ " cv = cos(v);\n"
+ " sv = sin(v);\n"
+ " cv2 = cos(0.5f*v);\n"
+ " sv2 = sin(0.5f*v);\n"
+ " xx = vec4((PINCHED_TORUS_RADIUS+cu)*cv,\n"
+ " (PINCHED_TORUS_RADIUS+cu)*sv,\n"
+ " su*cv2,\n"
+ " su*sv2)/(PINCHED_TORUS_RADIUS+RADIUS_INCR)\n;"
+ " xxu = vec4(-su*cv,\n"
+ " -su*sv,\n"
+ " cu*cv2,\n"
+ " cu*sv2)/(PINCHED_TORUS_RADIUS+RADIUS_INCR)\n;"
+ " xxv = vec4(-(PINCHED_TORUS_RADIUS+cu)*sv,\n"
+ " (PINCHED_TORUS_RADIUS+cu)*cv,\n"
+ " -0.5f*su*sv2,\n"
+ " 0.5f*su*cv2)/(PINCHED_TORUS_RADIUS+RADIUS_INCR)\n;"
+ " }\n"
+ " else // BottleType == KLEIN_BOTTLE_LAWSON\n"
+ " {\n"
+ " float cu, su, cv, sv, cv2, sv2;\n"
+ " cu = cos(u);\n"
+ " su = sin(u);\n"
+ " cv = cos(v);\n"
+ " sv = sin(v);\n"
+ " cv2 = cos(0.5f*v);\n"
+ " sv2 = sin(0.5f*v);\n"
+ " xx = vec4(cu*cv,\n"
+ " cu*sv,\n"
+ " su*sv2,\n"
+ " su*cv2)\n;"
+ " xxu = vec4(-su*cv,\n"
+ " -su*sv,\n"
+ " cu*sv2,\n"
+ " cu*cv2)\n;"
+ " xxv = vec4(-cu*sv,\n"
+ " cu*cv,\n"
+ " 0.5f*su*cv2,\n"
+ " -0.5f*su*sv2)\n;"
+ " }\n"
+ " x = MatRot4D*xx+Offset4D;\n"
+ " xu = MatRot4D*xxu;\n"
+ " xv = MatRot4D*xxv;\n"
+ " if (BoolPersp)\n"
+ " {\n"
+ " vec3 r = x.xyz;\n"
+ " float s = x.w;\n"
+ " float t = s*s;\n"
+ " p = r/s+Offset3D.xyz;\n"
+ " pu = (s*xu.xyz-r*xu.w)/t;\n"
+ " pv = (s*xv.xyz-r*xv.w)/t;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " p = x.xyz+Offset3D.xyz;\n"
+ " pu = xu.xyz;\n"
+ " pv = xv.xyz;\n"
+ " }\n"
+ " vec4 Position = vec4(p,1.0);\n"
+ " Normal = normalize(cross(pu,pv));\n"
+ " gl_Position = MatProj*Position;\n"
+ " Color = VertexColor;\n"
+ " if (BoolTextures)\n"
+ " TexCoord = VertexT;\n"
+ "}\n";
+
+/* The fragment shader code is composed of code fragments that depend on
+ the OpenGL version and code fragments that are version-independent.
+ They are concatenated by glsl_CompileAndLinkShaders in the function
+ init_glsl(). */
+static const GLchar *fragment_shader_attribs_2_1 =
+ "varying vec3 Normal;\n"
+ "varying vec4 Color;\n"
+ "varying vec4 TexCoord;\n"
+ "\n";
+static const GLchar *fragment_shader_attribs_3_0 =
+ "in vec3 Normal;\n"
+ "in vec4 Color;\n"
+ "in vec4 TexCoord;\n"
+ "\n"
+ "out vec4 FragColor;\n"
+ "\n";
+static const GLchar *fragment_shader_main =
+ "uniform bool DrawLines;\n"
+ "uniform vec4 LtGlblAmbient;\n"
+ "uniform vec4 LtAmbient, LtDiffuse, LtSpecular;\n"
+ "uniform vec3 LtDirection, LtHalfVector;\n"
+ "uniform vec4 MatFrontAmbient, MatBackAmbient;\n"
+ "uniform vec4 MatFrontDiffuse, MatBackDiffuse;\n"
+ "uniform vec4 MatSpecular;\n"
+ "uniform float MatShininess;\n"
+ "uniform bool BoolTextures;\n"
+ "uniform sampler2D TextureSampler;"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " vec4 color;\n"
+ " if (DrawLines)\n"
+ " {\n"
+ " color = Color;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " vec3 normalDirection;\n"
+ " vec4 ambientColor, diffuseColor, sceneColor;\n"
+ " vec4 ambientLighting, diffuseReflection, specularReflection;\n"
+ " float ndotl, ndoth, pf;\n"
+ " \n"
+ " if (gl_FrontFacing)\n"
+ " {\n"
+ " normalDirection = normalize(Normal);\n"
+ " sceneColor = Color*MatFrontAmbient*LtGlblAmbient;\n"
+ " ambientColor = Color*MatFrontAmbient;\n"
+ " diffuseColor = Color*MatFrontDiffuse;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " normalDirection = -normalize(Normal);\n"
+ " sceneColor = Color*MatBackAmbient*LtGlblAmbient;\n"
+ " ambientColor = Color*MatBackAmbient;\n"
+ " diffuseColor = Color*MatBackDiffuse;\n"
+ " }\n"
+ " \n"
+ " ndotl = max(0.0,dot(normalDirection,LtDirection));\n"
+ " ndoth = max(0.0,dot(normalDirection,LtHalfVector));\n"
+ " if (ndotl == 0.0)\n"
+ " pf = 0.0;\n"
+ " else\n"
+ " pf = pow(ndoth,MatShininess);\n"
+ " ambientLighting = ambientColor*LtAmbient;\n"
+ " diffuseReflection = LtDiffuse*diffuseColor*ndotl;\n"
+ " specularReflection = LtSpecular*MatSpecular*pf;\n"
+ " color = sceneColor+ambientLighting+diffuseReflection;\n";
+static const GLchar *fragment_shader_out_2_1 =
+ " if (BoolTextures)\n"
+ " color *= texture2D(TextureSampler,TexCoord.st);"
+ " color += specularReflection;\n"
+ " }\n"
+ " gl_FragColor = clamp(color,0.0,1.0);\n"
+ "}\n";
+static const GLchar *fragment_shader_out_3_0 =
+ " if (BoolTextures)\n"
+ " color *= texture(TextureSampler,TexCoord.st);"
+ " color += specularReflection;\n"
+ " }\n"
+ " FragColor = clamp(color,0.0,1.0);\n"
+ "}\n";
+
+#endif /* HAVE_GLSL */
+
+
/* Add a rotation around the wx-plane to the matrix m. */
static void rotatewx(float m[4][4], float phi)
{
@@ -739,9 +1008,9 @@ static void setup_figure8(ModeInfo *mi, double umin, double umax, double vmin,
kb->xv[k][3] = 0.0;
for (l=0; l<4; l++)
{
- kb->x[k][l] /= FIGURE_8_RADIUS+1.25;
- kb->xu[k][l] /= FIGURE_8_RADIUS+1.25;
- kb->xv[k][l] /= FIGURE_8_RADIUS+1.25;
+ kb->x[k][l] /= FIGURE_8_RADIUS+RADIUS_INCR;
+ kb->xu[k][l] /= FIGURE_8_RADIUS+RADIUS_INCR;
+ kb->xv[k][l] /= FIGURE_8_RADIUS+RADIUS_INCR;
}
}
}
@@ -795,9 +1064,9 @@ static void setup_pinched_torus(ModeInfo *mi, double umin, double umax,
kb->xv[k][3] = 0.5*su*cv2;
for (l=0; l<4; l++)
{
- kb->x[k][l] /= PINCHED_TORUS_RADIUS+1.25;
- kb->xu[k][l] /= PINCHED_TORUS_RADIUS+1.25;
- kb->xv[k][l] /= PINCHED_TORUS_RADIUS+1.25;
+ kb->x[k][l] /= PINCHED_TORUS_RADIUS+RADIUS_INCR;
+ kb->xu[k][l] /= PINCHED_TORUS_RADIUS+RADIUS_INCR;
+ kb->xv[k][l] /= PINCHED_TORUS_RADIUS+RADIUS_INCR;
}
}
}
@@ -847,18 +1116,329 @@ static void setup_lawson(ModeInfo *mi, double umin, double umax, double vmin,
kb->xu[k][3] = cu*cv2;
kb->xv[k][0] = -cu*sv;
kb->xv[k][1] = cu*cv;
- kb->xv[k][2] = su*cv2*0.5;
- kb->xv[k][3] = -su*sv2*0.5;
+ kb->xv[k][2] = 0.5*su*cv2;
+ kb->xv[k][3] = -0.5*su*sv2;
}
}
}
-/* Draw a figure-8 Klein bottle projected into 3D. */
-static int figure8(ModeInfo *mi, double umin, double umax, double vmin,
- double vmax)
+/* Rotate a 4D point x by the rotation matrix mat and project it to the 3D
+ point p according to the 4D projection type that is stored in the
+ kleinstruct kb. */
+static void project_4d_point_to_3d(kleinstruct *kb, double x[4],
+ float mat[4][4], float p[3])
+{
+ int l, m;
+ double r, s;
+ double y[4];
+
+ for (l=0; l<4; l++)
+ {
+ r = 0.0;
+ for (m=0; m<4; m++)
+ r += mat[l][m]*x[m];
+ y[l] = r;
+ }
+ if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ p[l] = y[l]+kb->offset4d[l];
+ }
+ else
+ {
+ s = y[3]+kb->offset4d[3];
+ for (l=0; l<3; l++)
+ p[l] = (y[l]+kb->offset4d[l])/s;
+ }
+}
+
+
+/* Compute a tangent space basis in 3D from the 4D point x and the 4D
+ partial derivative vectors xu and xv. The vectors x, xu, and xv are
+ transformed by the 4D rotation matrix mat. The resulting tangent space
+ basis is converted into the 3D rotation angles alpha, beta, and delta,
+ which are stored in the kleinstruct kb. */
+static void compute_tangent_space_basis_rotation(kleinstruct *kb, double x[4],
+ double xu[4], double xv[4],
+ float mat[4][4])
{
- int polys = 0;
+ int l;
+ float pu[3], pv[3], pm[3], n[3], b[3];
+ double y[4], yu[4], yv[4];
+ double q, r, s, t;
+
+ for (l=0; l<4; l++)
+ {
+ y[l] = (mat[l][0]*x[0]+mat[l][1]*x[1]+
+ mat[l][2]*x[2]+mat[l][3]*x[3]);
+ yu[l] = (mat[l][0]*xu[0]+mat[l][1]*xu[1]+
+ mat[l][2]*xu[2]+mat[l][3]*xu[3]);
+ yv[l] = (mat[l][0]*xv[0]+mat[l][1]*xv[1]+
+ mat[l][2]*xv[2]+mat[l][3]*xv[3]);
+ }
+ if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ {
+ pu[l] = yu[l];
+ pv[l] = yv[l];
+ }
+ }
+ else
+ {
+ s = y[3]+kb->offset4d[3];
+ q = 1.0/s;
+ t = q*q;
+ for (l=0; l<3; l++)
+ {
+ r = y[l]+kb->offset4d[l];
+ pu[l] = (yu[l]*s-r*yu[3])*t;
+ pv[l] = (yv[l]*s-r*yv[3])*t;
+ }
+ }
+ n[0] = pu[1]*pv[2]-pu[2]*pv[1];
+ n[1] = pu[2]*pv[0]-pu[0]*pv[2];
+ n[2] = pu[0]*pv[1]-pu[1]*pv[0];
+ t = 1.0/(kb->side*4.0*sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]));
+ n[0] *= t;
+ n[1] *= t;
+ n[2] *= t;
+ pm[0] = pu[0]*kb->dumove+pv[0]*kb->dvmove;
+ pm[1] = pu[1]*kb->dumove+pv[1]*kb->dvmove;
+ pm[2] = pu[2]*kb->dumove+pv[2]*kb->dvmove;
+ t = 1.0/(4.0*sqrt(pm[0]*pm[0]+pm[1]*pm[1]+pm[2]*pm[2]));
+ pm[0] *= t;
+ pm[1] *= t;
+ pm[2] *= t;
+ b[0] = n[1]*pm[2]-n[2]*pm[1];
+ b[1] = n[2]*pm[0]-n[0]*pm[2];
+ b[2] = n[0]*pm[1]-n[1]*pm[0];
+ t = 1.0/(4.0*sqrt(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]));
+ b[0] *= t;
+ b[1] *= t;
+ b[2] *= t;
+
+ /* Compute alpha, beta, delta from the three basis vectors.
+ | -b[0] -b[1] -b[2] |
+ m = | n[0] n[1] n[2] |
+ | -pm[0] -pm[1] -pm[2] |
+ */
+ kb->alpha = atan2(-n[2],-pm[2])*180/M_PI;
+ kb->beta = atan2(-b[2],sqrt(b[0]*b[0]+b[1]*b[1]))*180/M_PI;
+ kb->delta = atan2(b[1],-b[0])*180/M_PI;
+
+ /* Compute the rotation that rotates the Klein bottle in 4D. */
+ rotateall(kb->alpha,kb->beta,kb->delta,kb->zeta,kb->eta,kb->theta,mat);
+}
+
+
+/* Compute the current walk frame for the figure-8 Klein bottle, i.e.,
+ the coordinate system of the point and direction at which the viewer is
+ currently walking on the projective plane. */
+static void compute_walk_frame_figure8(kleinstruct *kb, float mat[4][4])
+{
+ float p[3];
+ int l;
+ double u, v;
+ double xx[4], xxu[4], xxv[4];
+ double cu, su, cv, sv, cv2, sv2, c2u, s2u;
+
+ /* Compute the rotation that rotates the Klein bottle in 4D without the
+ trackball rotations. */
+ rotateall4d(kb->zeta,kb->eta,kb->theta,mat);
+
+ u = kb->umove;
+ v = kb->vmove;
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ c2u = cos(2.0*u);
+ s2u = sin(2.0*u);
+ xx[0] = (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*cv;
+ xx[1] = (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*sv;
+ xx[2] = su*sv2+s2u*cv2;
+ xx[3] = cu;
+ xxu[0] = (cu*cv2-2.0*c2u*sv2)*cv;
+ xxu[1] = (cu*cv2-2.0*c2u*sv2)*sv;
+ xxu[2] = cu*sv2+2.0*c2u*cv2;
+ xxu[3] = -su;
+ xxv[0] = ((-0.5*su*sv2-0.5*s2u*cv2)*cv-
+ (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*sv);
+ xxv[1] = ((-0.5*su*sv2-0.5*s2u*cv2)*sv+
+ (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*cv);
+ xxv[2] = 0.5*su*cv2-0.5*s2u*sv2;
+ xxv[3] = 0.0;
+ for (l=0; l<4; l++)
+ {
+ xx[l] /= FIGURE_8_RADIUS+RADIUS_INCR;
+ xxu[l] /= FIGURE_8_RADIUS+RADIUS_INCR;
+ xxv[l] /= FIGURE_8_RADIUS+RADIUS_INCR;
+ }
+
+ compute_tangent_space_basis_rotation(kb,xx,xxu,xxv,mat);
+
+ u = kb->umove;
+ v = kb->vmove;
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ s2u = sin(2.0*u);
+ xx[0] = (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*cv;
+ xx[1] = (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*sv;
+ xx[2] = su*sv2+s2u*cv2;
+ xx[3] = cu;
+ for (l=0; l<4; l++)
+ xx[l] /= FIGURE_8_RADIUS+RADIUS_INCR;
+
+ project_4d_point_to_3d(kb,xx,mat,p);
+
+ kb->offset3d[0] = -p[0];
+ kb->offset3d[1] = -p[1]-DELTAY;
+ kb->offset3d[2] = -p[2];
+}
+
+
+/* Compute the current walk frame for the pinched torus Klein bottle, i.e.,
+ the coordinate system of the point and direction at which the viewer is
+ currently walking on the projective plane. */
+static void compute_walk_frame_pinched_torus(kleinstruct *kb, float mat[4][4])
+{
+ float p[3];
+ int l;
+ double u, v;
+ double xx[4], xxu[4], xxv[4];
+ double cu, su, cv, sv, cv2, sv2;
+
+ /* Compute the rotation that rotates the Klein bottle in 4D without the
+ trackball rotations. */
+ rotateall4d(kb->zeta,kb->eta,kb->theta,mat);
+
+ u = kb->umove;
+ v = kb->vmove;
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ xx[0] = (PINCHED_TORUS_RADIUS+cu)*cv;
+ xx[1] = (PINCHED_TORUS_RADIUS+cu)*sv;
+ xx[2] = su*cv2;
+ xx[3] = su*sv2;
+ xxu[0] = -su*cv;
+ xxu[1] = -su*sv;
+ xxu[2] = cu*cv2;
+ xxu[3] = cu*sv2;
+ xxv[0] = -(PINCHED_TORUS_RADIUS+cu)*sv;
+ xxv[1] = (PINCHED_TORUS_RADIUS+cu)*cv;
+ xxv[2] = -0.5*su*sv2;
+ xxv[3] = 0.5*su*cv2;
+ for (l=0; l<4; l++)
+ {
+ xx[l] /= PINCHED_TORUS_RADIUS+RADIUS_INCR;
+ xxu[l] /= PINCHED_TORUS_RADIUS+RADIUS_INCR;
+ xxv[l] /= PINCHED_TORUS_RADIUS+RADIUS_INCR;
+ }
+
+ compute_tangent_space_basis_rotation(kb,xx,xxu,xxv,mat);
+
+ u = kb->umove;
+ v = kb->vmove;
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ xx[0] = (PINCHED_TORUS_RADIUS+cu)*cv;
+ xx[1] = (PINCHED_TORUS_RADIUS+cu)*sv;
+ xx[2] = su*cv2;
+ xx[3] = su*sv2;
+ for (l=0; l<4; l++)
+ xx[l] /= PINCHED_TORUS_RADIUS+RADIUS_INCR;
+
+ project_4d_point_to_3d(kb,xx,mat,p);
+
+ kb->offset3d[0] = -p[0];
+ kb->offset3d[1] = -p[1]-DELTAY;
+ kb->offset3d[2] = -p[2];
+}
+
+
+/* Compute the current walk frame for the Lawson Klein bottle, i.e.,
+ the coordinate system of the point and direction at which the viewer is
+ currently walking on the projective plane. */
+static void compute_walk_frame_lawson(kleinstruct *kb, float mat[4][4])
+{
+ float p[3];
+ double u, v;
+ double xx[4], xxu[4], xxv[4];
+ double cu, su, cv, sv, cv2, sv2;
+
+ /* Compute the rotation that rotates the Klein bottle in 4D without the
+ trackball rotations. */
+ rotateall4d(kb->zeta,kb->eta,kb->theta,mat);
+
+ u = kb->umove;
+ v = kb->vmove;
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ xx[0] = cu*cv;
+ xx[1] = cu*sv;
+ xx[2] = su*sv2;
+ xx[3] = su*cv2;
+ xxu[0] = -su*cv;
+ xxu[1] = -su*sv;
+ xxu[2] = cu*sv2;
+ xxu[3] = cu*cv2;
+ xxv[0] = -cu*sv;
+ xxv[1] = cu*cv;
+ xxv[2] = 0.5*su*cv2;
+ xxv[3] = -0.5*su*sv2;
+
+ compute_tangent_space_basis_rotation(kb,xx,xxu,xxv,mat);
+
+ u = kb->umove;
+ v = kb->vmove;
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ xx[0] = cu*cv;
+ xx[1] = cu*sv;
+ xx[2] = su*sv2;
+ xx[3] = su*cv2;
+
+ project_4d_point_to_3d(kb,xx,mat,p);
+
+ kb->offset3d[0] = -p[0];
+ kb->offset3d[1] = -p[1]-DELTAY;
+ kb->offset3d[2] = -p[2];
+}
+
+
+/* Set the OpenGL fixed functionality projection and lighting state
+ for displaying a Klein bottle. */
+static void set_opengl_state_ff(ModeInfo *mi, float matc[3][3])
+{
+ static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+ static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
+ static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
static const GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
static const GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
static const GLfloat mat_diff_oneside[] = { 0.9, 0.4, 0.3, 1.0 };
@@ -866,157 +1446,375 @@ static int figure8(ModeInfo *mi, double umin, double umax, double vmin,
static const GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 };
static const GLfloat mat_diff_trans_oneside[] = { 0.9, 0.4, 0.3, 0.7 };
float mat_diff_dyn[4], mat_diff_dyn_compl[4];
- float p[3], pu[3], pv[3], pm[3], n[3], b[3], mat[4][4], matc[3][3];
- int i, j, k, l, m, o;
- double u, v, ur, vr;
- double xx[4], xxu[4], xxv[4], y[4], yu[4], yv[4];
- double q, r, s, t;
- double cu, su, cv, sv, cv2, sv2, c2u, s2u;
- float q1[4], q2[4], r1[4][4], r2[4][4];
kleinstruct *kb = &klein[MI_SCREEN(mi)];
- if (kb->change_colors)
- rotateall3d(kb->rho,kb->sigma,kb->tau,matc);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ if (kb->projection_3d == DISP_3D_PERSPECTIVE ||
+ kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ {
+ if (kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ gluPerspective(60.0,kb->aspect,0.01,10.0);
+ else
+ gluPerspective(60.0,kb->aspect,0.1,10.0);
+ }
+ else
+ {
+ if (kb->aspect >= 1.0)
+ glOrtho(-kb->aspect,kb->aspect,-1.0,1.0,0.1,10.0);
+ else
+ glOrtho(-1.0,1.0,-1.0/kb->aspect,1.0/kb->aspect,0.1,10.0);
+ }
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
- if (kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ if (kb->display_mode == DISP_SURFACE)
{
- /* Compute the rotation that rotates the Klein bottle in 4D without the
- trackball rotations. */
- rotateall4d(kb->zeta,kb->eta,kb->theta,mat);
-
- u = kb->umove;
- v = kb->vmove;
- cu = cos(u);
- su = sin(u);
- cv = cos(v);
- sv = sin(v);
- cv2 = cos(0.5*v);
- sv2 = sin(0.5*v);
- c2u = cos(2.0*u);
- s2u = sin(2.0*u);
- xx[0] = (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*cv;
- xx[1] = (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*sv;
- xx[2] = su*sv2+s2u*cv2;
- xx[3] = cu;
- xxu[0] = (cu*cv2-2.0*c2u*sv2)*cv;
- xxu[1] = (cu*cv2-2.0*c2u*sv2)*sv;
- xxu[2] = cu*sv2+2.0*c2u*cv2;
- xxu[3] = -su;
- xxv[0] = ((-0.5*su*sv2-0.5*s2u*cv2)*cv-
- (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*sv);
- xxv[1] = ((-0.5*su*sv2-0.5*s2u*cv2)*sv+
- (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*cv);
- xxv[2] = 0.5*su*cv2-0.5*s2u*sv2;
- xxv[3] = 0.0;
- for (l=0; l<4; l++)
- {
- xx[l] /= FIGURE_8_RADIUS+1.25;
- xxu[l] /= FIGURE_8_RADIUS+1.25;
- xxv[l] /= FIGURE_8_RADIUS+1.25;
- }
- for (l=0; l<4; l++)
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glDepthMask(GL_TRUE);
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+ glDisable(GL_BLEND);
+ }
+ else if (kb->display_mode == DISP_TRANSPARENT)
+ {
+ glDisable(GL_DEPTH_TEST);
+ glDepthMask(GL_FALSE);
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ }
+ else /* kb->display_mode == DISP_WIREFRAME */
+ {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glDepthMask(GL_TRUE);
+ glShadeModel(GL_FLAT);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_LIGHT0);
+ glDisable(GL_BLEND);
+ }
+
+ if (marks)
+ {
+ glEnable(GL_TEXTURE_2D);
+#ifndef HAVE_JWZGLES
+ glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SEPARATE_SPECULAR_COLOR);
+#endif
+ }
+ else
+ {
+ glDisable(GL_TEXTURE_2D);
+#ifndef HAVE_JWZGLES
+ glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SINGLE_COLOR);
+#endif
+ }
+
+ if (!kb->change_colors)
+ {
+ if (kb->colors == COLORS_ONESIDED)
{
- y[l] = (mat[l][0]*xx[0]+mat[l][1]*xx[1]+
- mat[l][2]*xx[2]+mat[l][3]*xx[3]);
- yu[l] = (mat[l][0]*xxu[0]+mat[l][1]*xxu[1]+
- mat[l][2]*xxu[2]+mat[l][3]*xxu[3]);
- yv[l] = (mat[l][0]*xxv[0]+mat[l][1]*xxv[1]+
- mat[l][2]*xxv[2]+mat[l][3]*xxv[3]);
+ glColor3fv(mat_diff_oneside);
+ if (kb->display_mode == DISP_TRANSPARENT)
+ {
+ glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,
+ mat_diff_trans_oneside);
+ }
+ else
+ {
+ glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,
+ mat_diff_oneside);
+ }
}
- if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ else if (kb->colors == COLORS_TWOSIDED)
{
- for (l=0; l<3; l++)
+ glColor3fv(mat_diff_red);
+ if (kb->display_mode == DISP_TRANSPARENT)
{
- p[l] = y[l]+kb->offset4d[l];
- pu[l] = yu[l];
- pv[l] = yv[l];
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_red);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_green);
+ }
+ else
+ {
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_red);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_green);
}
}
+ }
+ else /* kb->change_colors */
+ {
+ color(kb,0.0,matc,mat_diff_dyn);
+ if (kb->colors == COLORS_ONESIDED)
+ {
+ glColor3fv(mat_diff_dyn);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_dyn);
+ }
+ else if (kb->colors == COLORS_TWOSIDED)
+ {
+ mat_diff_dyn_compl[0] = 1.0f-mat_diff_dyn[0];
+ mat_diff_dyn_compl[1] = 1.0f-mat_diff_dyn[1];
+ mat_diff_dyn_compl[2] = 1.0f-mat_diff_dyn[2];
+ mat_diff_dyn_compl[3] = mat_diff_dyn[3];
+ glColor3fv(mat_diff_dyn);
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_dyn);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_dyn_compl);
+ }
+ }
+ glBindTexture(GL_TEXTURE_2D,kb->tex_name);
+}
+
+
+#ifdef HAVE_GLSL
+
+/* Set the OpenGL programmable functionality projection and lighting state
+ for displaying a Klein bottle. */
+static void set_opengl_state_pf(ModeInfo *mi, float mat[4][4],
+ float matc[3][3])
+{
+ static const GLfloat light_model_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
+ static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+ static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
+ static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_oneside[] = { 0.9, 0.4, 0.3, 1.0 };
+ static const GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.7 };
+ static const GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 };
+ static const GLfloat mat_diff_trans_oneside[] = { 0.9, 0.4, 0.3, 0.7 };
+ static const GLfloat mat_diff_white[] = { 1.0, 1.0, 1.0, 1.0 };
+ float mat_diff_dyn[4], mat_diff_dyn_compl[4];
+ GLfloat light_direction[3], half_vector[3], len;
+ GLfloat p_mat[16];
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ glsl_Identity(p_mat);
+ if (kb->projection_3d == DISP_3D_PERSPECTIVE ||
+ kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ {
+ if (kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ glsl_Perspective(p_mat,60.0f,kb->aspect,0.01f,10.0f);
else
+ glsl_Perspective(p_mat,60.0f,kb->aspect,0.1f,10.0f);
+ }
+ else
+ {
+ if (kb->aspect >= 1.0)
+ glsl_Orthographic(p_mat,-kb->aspect,kb->aspect,-1.0f,1.0f,0.1f,10.0f);
+ else
+ glsl_Orthographic(p_mat,-1.0f,1.0f,-1.0f/kb->aspect,1.0f/kb->aspect,
+ 0.1f,10.0f);
+ }
+ glUniformMatrix4fv(kb->mat_rot_index,1,GL_TRUE,(GLfloat *)mat);
+ glUniformMatrix4fv(kb->mat_p_index,1,GL_FALSE,p_mat);
+ glUniform1i(kb->bool_persp_index,kb->projection_4d == DISP_4D_PERSPECTIVE);
+ glUniform4fv(kb->off4d_index,1,kb->offset4d);
+ glUniform4fv(kb->off3d_index,1,kb->offset3d);
+
+ len = sqrtf(light_position[0]*light_position[0]+
+ light_position[1]*light_position[1]+
+ light_position[2]*light_position[2]);
+ light_direction[0] = light_position[0]/len;
+ light_direction[1] = light_position[1]/len;
+ light_direction[2] = light_position[2]/len;
+ half_vector[0] = light_direction[0];
+ half_vector[1] = light_direction[1];
+ half_vector[2] = light_direction[2]+1.0f;
+ len = sqrtf(half_vector[0]*half_vector[0]+
+ half_vector[1]*half_vector[1]+
+ half_vector[2]*half_vector[2]);
+ half_vector[0] /= len;
+ half_vector[1] /= len;
+ half_vector[2] /= len;
+
+ if (kb->display_mode == DISP_SURFACE)
+ {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glDepthMask(GL_TRUE);
+ glDisable(GL_BLEND);
+ glUniform4fv(kb->glbl_ambient_index,1,light_model_ambient);
+ glUniform4fv(kb->lt_ambient_index,1,light_ambient);
+ glUniform4fv(kb->lt_diffuse_index,1,light_diffuse);
+ glUniform4fv(kb->lt_specular_index,1,light_specular);
+ glUniform3fv(kb->lt_direction_index,1,light_direction);
+ glUniform3fv(kb->lt_halfvect_index,1,half_vector);
+ glUniform4fv(kb->specular_index,1,mat_specular);
+ glUniform1f(kb->shininess_index,50.0f);
+ glUniform1i(kb->draw_lines_index,GL_FALSE);
+ }
+ else if (kb->display_mode == DISP_TRANSPARENT)
+ {
+ glDisable(GL_DEPTH_TEST);
+ glDepthMask(GL_FALSE);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ glUniform4fv(kb->glbl_ambient_index,1,light_model_ambient);
+ glUniform4fv(kb->lt_ambient_index,1,light_ambient);
+ glUniform4fv(kb->lt_diffuse_index,1,light_diffuse);
+ glUniform4fv(kb->lt_specular_index,1,light_specular);
+ glUniform3fv(kb->lt_direction_index,1,light_direction);
+ glUniform3fv(kb->lt_halfvect_index,1,half_vector);
+ glUniform4fv(kb->specular_index,1,mat_specular);
+ glUniform1f(kb->shininess_index,50.0f);
+ glUniform1i(kb->draw_lines_index,GL_FALSE);
+ }
+ else /* kb->display_mode == DISP_WIREFRAME */
+ {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glDepthMask(GL_TRUE);
+ glDisable(GL_BLEND);
+ glUniform1i(kb->draw_lines_index,GL_TRUE);
+ }
+
+ if (marks)
+ glEnable(GL_TEXTURE_2D);
+ else
+ glDisable(GL_TEXTURE_2D);
+
+ glUniform4fv(kb->front_ambient_index,1,mat_diff_white);
+ glUniform4fv(kb->front_diffuse_index,1,mat_diff_white);
+ glUniform4fv(kb->back_ambient_index,1,mat_diff_white);
+ glUniform4fv(kb->back_diffuse_index,1,mat_diff_white);
+ glVertexAttrib4f(kb->color_index,1.0f,1.0f,1.0f,1.0f);
+ if (!kb->change_colors)
+ {
+ if (kb->colors == COLORS_ONESIDED)
{
- s = y[3]+kb->offset4d[3];
- q = 1.0/s;
- t = q*q;
- for (l=0; l<3; l++)
+ if (kb->display_mode == DISP_TRANSPARENT)
+ {
+ glUniform4fv(kb->front_ambient_index,1,mat_diff_trans_oneside);
+ glUniform4fv(kb->front_diffuse_index,1,mat_diff_trans_oneside);
+ glUniform4fv(kb->back_ambient_index,1,mat_diff_trans_oneside);
+ glUniform4fv(kb->back_diffuse_index,1,mat_diff_trans_oneside);
+ }
+ else if (kb->display_mode == DISP_SURFACE)
+ {
+ glUniform4fv(kb->front_ambient_index,1,mat_diff_oneside);
+ glUniform4fv(kb->front_diffuse_index,1,mat_diff_oneside);
+ glUniform4fv(kb->back_ambient_index,1,mat_diff_oneside);
+ glUniform4fv(kb->back_diffuse_index,1,mat_diff_oneside);
+ }
+ else /* kb->display_mode == DISP_WIREFRAME */
{
- r = y[l]+kb->offset4d[l];
- p[l] = r*q;
- pu[l] = (yu[l]*s-r*yu[3])*t;
- pv[l] = (yv[l]*s-r*yv[3])*t;
+ glVertexAttrib4fv(kb->color_index,mat_diff_oneside);
}
}
- n[0] = pu[1]*pv[2]-pu[2]*pv[1];
- n[1] = pu[2]*pv[0]-pu[0]*pv[2];
- n[2] = pu[0]*pv[1]-pu[1]*pv[0];
- t = 1.0/(kb->side*4.0*sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]));
- n[0] *= t;
- n[1] *= t;
- n[2] *= t;
- pm[0] = pu[0]*kb->dumove+pv[0]*kb->dvmove;
- pm[1] = pu[1]*kb->dumove+pv[1]*kb->dvmove;
- pm[2] = pu[2]*kb->dumove+pv[2]*kb->dvmove;
- t = 1.0/(4.0*sqrt(pm[0]*pm[0]+pm[1]*pm[1]+pm[2]*pm[2]));
- pm[0] *= t;
- pm[1] *= t;
- pm[2] *= t;
- b[0] = n[1]*pm[2]-n[2]*pm[1];
- b[1] = n[2]*pm[0]-n[0]*pm[2];
- b[2] = n[0]*pm[1]-n[1]*pm[0];
- t = 1.0/(4.0*sqrt(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]));
- b[0] *= t;
- b[1] *= t;
- b[2] *= t;
-
- /* Compute alpha, beta, delta from the three basis vectors.
- | -b[0] -b[1] -b[2] |
- m = | n[0] n[1] n[2] |
- | -pm[0] -pm[1] -pm[2] |
- */
- kb->alpha = atan2(-n[2],-pm[2])*180/M_PI;
- kb->beta = atan2(-b[2],sqrt(b[0]*b[0]+b[1]*b[1]))*180/M_PI;
- kb->delta = atan2(b[1],-b[0])*180/M_PI;
-
- /* Compute the rotation that rotates the Klein bottle in 4D. */
- rotateall(kb->alpha,kb->beta,kb->delta,kb->zeta,kb->eta,kb->theta,mat);
-
- u = kb->umove;
- v = kb->vmove;
- cu = cos(u);
- su = sin(u);
- cv = cos(v);
- sv = sin(v);
- cv2 = cos(0.5*v);
- sv2 = sin(0.5*v);
- /*c2u = cos(2.0*u);*/
- s2u = sin(2.0*u);
- xx[0] = (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*cv;
- xx[1] = (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*sv;
- xx[2] = su*sv2+s2u*cv2;
- xx[3] = cu;
- for (l=0; l<4; l++)
- xx[l] /= FIGURE_8_RADIUS+1.25;
- for (l=0; l<4; l++)
+ else if (kb->colors == COLORS_TWOSIDED)
{
- r = 0.0;
- for (m=0; m<4; m++)
- r += mat[l][m]*xx[m];
- y[l] = r;
+ if (kb->display_mode == DISP_TRANSPARENT)
+ {
+ glUniform4fv(kb->front_ambient_index,1,mat_diff_trans_red);
+ glUniform4fv(kb->front_diffuse_index,1,mat_diff_trans_red);
+ glUniform4fv(kb->back_ambient_index,1,mat_diff_trans_green);
+ glUniform4fv(kb->back_diffuse_index,1,mat_diff_trans_green);
+ }
+ else if (kb->display_mode == DISP_SURFACE)
+ {
+ glUniform4fv(kb->front_ambient_index,1,mat_diff_red);
+ glUniform4fv(kb->front_diffuse_index,1,mat_diff_red);
+ glUniform4fv(kb->back_ambient_index,1,mat_diff_green);
+ glUniform4fv(kb->back_diffuse_index,1,mat_diff_green);
+ }
+ else /* kb->display_mode == DISP_WIREFRAME */
+ {
+ glVertexAttrib4fv(kb->color_index,mat_diff_red);
+ }
}
- if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ }
+ else /* kb->change_colors */
+ {
+ color(kb,0.0,matc,mat_diff_dyn);
+ if (kb->colors == COLORS_ONESIDED)
{
- for (l=0; l<3; l++)
- p[l] = y[l]+kb->offset4d[l];
+ if (kb->display_mode == DISP_TRANSPARENT ||
+ kb->display_mode == DISP_SURFACE)
+ {
+ glUniform4fv(kb->front_ambient_index,1,mat_diff_dyn);
+ glUniform4fv(kb->front_diffuse_index,1,mat_diff_dyn);
+ glUniform4fv(kb->back_ambient_index,1,mat_diff_dyn);
+ glUniform4fv(kb->back_diffuse_index,1,mat_diff_dyn);
+ }
+ else /* kb->display_mode == DISP_WIREFRAME */
+ {
+ glVertexAttrib4fv(kb->color_index,mat_diff_dyn);
+ }
}
- else
+ else if (kb->colors == COLORS_TWOSIDED)
{
- s = y[3]+kb->offset4d[3];
- for (l=0; l<3; l++)
- p[l] = (y[l]+kb->offset4d[l])/s;
+ if (kb->display_mode == DISP_TRANSPARENT ||
+ kb->display_mode == DISP_SURFACE)
+ {
+ mat_diff_dyn_compl[0] = 1.0f-mat_diff_dyn[0];
+ mat_diff_dyn_compl[1] = 1.0f-mat_diff_dyn[1];
+ mat_diff_dyn_compl[2] = 1.0f-mat_diff_dyn[2];
+ mat_diff_dyn_compl[3] = mat_diff_dyn[3];
+ glUniform4fv(kb->front_ambient_index,1,mat_diff_dyn);
+ glUniform4fv(kb->front_diffuse_index,1,mat_diff_dyn);
+ glUniform4fv(kb->back_ambient_index,1,mat_diff_dyn_compl);
+ glUniform4fv(kb->back_diffuse_index,1,mat_diff_dyn_compl);
+ }
+ else /* kb->display_mode == DISP_WIREFRAME */
+ {
+ glVertexAttrib4fv(kb->color_index,mat_diff_dyn);
+ }
}
+ }
- kb->offset3d[0] = -p[0];
- kb->offset3d[1] = -p[1]-DELTAY;
- kb->offset3d[2] = -p[2];
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D,kb->tex_name);
+ glUniform1i(kb->texture_sampler_index,0);
+ glUniform1i(kb->bool_textures_index,marks);
+ glUniform1i(kb->bottle_type_index,kb->bottle_type);
+}
+
+#endif /* HAVE_GLSL */
+
+
+/* Draw a figure-8 Klein bottle projected into 3D. */
+static int figure8_ff(ModeInfo *mi, double umin, double umax, double vmin,
+ double vmax)
+{
+ int polys;
+ float pu[3], pv[3], mat[4][4], matc[3][3];
+ int i, j, k, l, m, o;
+ double u, v, ur, vr;
+ double y[4], yu[4], yv[4];
+ double q, r, s, t;
+ float q1[4], q2[4], r1[4][4], r2[4][4];
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ if (kb->change_colors)
+ rotateall3d(kb->rho,kb->sigma,kb->tau,matc);
+
+ set_opengl_state_ff(mi,matc);
+
+ if (kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ {
+ compute_walk_frame_figure8(kb,mat);
}
else
{
@@ -1079,58 +1877,6 @@ static int figure8(ModeInfo *mi, double umin, double umax, double vmin,
}
}
- if (!kb->change_colors)
- {
- if (kb->colors == COLORS_ONESIDED)
- {
- glColor3fv(mat_diff_oneside);
- if (kb->display_mode == DISP_TRANSPARENT)
- {
- glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,
- mat_diff_trans_oneside);
- }
- else
- {
- glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,
- mat_diff_oneside);
- }
- }
- else if (kb->colors == COLORS_TWOSIDED)
- {
- glColor3fv(mat_diff_red);
- if (kb->display_mode == DISP_TRANSPARENT)
- {
- glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_red);
- glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_green);
- }
- else
- {
- glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_red);
- glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_green);
- }
- }
- }
- else /* kb->change_colors */
- {
- color(kb,0.0,matc,mat_diff_dyn);
- if (kb->colors == COLORS_ONESIDED)
- {
- glColor3fv(mat_diff_dyn);
- glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_dyn);
- }
- else if (kb->colors == COLORS_TWOSIDED)
- {
- mat_diff_dyn_compl[0] = 1.0f-mat_diff_dyn[0];
- mat_diff_dyn_compl[1] = 1.0f-mat_diff_dyn[1];
- mat_diff_dyn_compl[2] = 1.0f-mat_diff_dyn[2];
- mat_diff_dyn_compl[3] = mat_diff_dyn[3];
- glColor3fv(mat_diff_dyn);
- glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_dyn);
- glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_dyn_compl);
- }
- }
- glBindTexture(GL_TEXTURE_2D,kb->tex_name);
-
ur = umax-umin;
vr = vmax-vmin;
for (i=0; i<NUMU; i++)
@@ -1145,7 +1891,7 @@ static int figure8(ModeInfo *mi, double umin, double umax, double vmin,
{
for (k=0; k<=1; k++)
{
- l = (i+k);
+ l = i+k;
m = j;
o = l*(NUMV+1)+m;
glNormal3fv(kb->pn[o]);
@@ -1169,173 +1915,258 @@ static int figure8(ModeInfo *mi, double umin, double umax, double vmin,
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,kb->col[o]);
}
glVertex3fv(kb->pp[o]);
- polys++;
}
}
glEnd();
}
- polys /= 2;
+
+ polys = 2*NUMU*NUMV;
+ if (kb->appearance != APPEARANCE_SOLID)
+ polys /= 2;
return polys;
}
-/* Draw a pinched torus Klein bottle projected into 3D. */
-static int pinched_torus(ModeInfo *mi, double umin, double umax, double vmin,
- double vmax)
+#ifdef HAVE_GLSL
+
+/* Draw a figure-8 Klein bottle projected into 3D. */
+static int figure8_pf(ModeInfo *mi, double umin, double umax, double vmin,
+ double vmax)
{
- int polys = 0;
- static const GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
- static const GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
- static const GLfloat mat_diff_oneside[] = { 0.9, 0.4, 0.3, 1.0 };
- static const GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.7 };
- static const GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 };
- static const GLfloat mat_diff_trans_oneside[] = { 0.9, 0.4, 0.3, 0.7 };
- float mat_diff_dyn[4], mat_diff_dyn_compl[4];
- float p[3], pu[3], pv[3], pm[3], n[3], b[3], mat[4][4], matc[3][3];
+ int polys;
+ float mat[4][4], matc[3][3];
int i, j, k, l, m, o;
double u, v, ur, vr;
- double xx[4], xxu[4], xxv[4], y[4], yu[4], yv[4];
- double q, r, s, t;
- double cu, su, cv, sv, cv2, sv2;
float q1[4], q2[4], r1[4][4], r2[4][4];
+ GLsizeiptr index_offset;
kleinstruct *kb = &klein[MI_SCREEN(mi)];
- if (kb->change_colors)
- rotateall3d(kb->rho,kb->sigma,kb->tau,matc);
+ if (!kb->use_shaders)
+ return 0;
- if (kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ if (!kb->buffers_initialized)
{
- /* Compute the rotation that rotates the Klein bottle in 4D without the
- trackball rotations. */
- rotateall4d(kb->zeta,kb->eta,kb->theta,mat);
-
- u = kb->umove;
- v = kb->vmove;
- cu = cos(u);
- su = sin(u);
- cv = cos(v);
- sv = sin(v);
- cv2 = cos(0.5*v);
- sv2 = sin(0.5*v);
- xx[0] = (PINCHED_TORUS_RADIUS+cu)*cv;
- xx[1] = (PINCHED_TORUS_RADIUS+cu)*sv;
- xx[2] = su*cv2;
- xx[3] = su*sv2;
- xxu[0] = -su*cv;
- xxu[1] = -su*sv;
- xxu[2] = cu*cv2;
- xxu[3] = cu*sv2;
- xxv[0] = -(PINCHED_TORUS_RADIUS+cu)*sv;
- xxv[1] = (PINCHED_TORUS_RADIUS+cu)*cv;
- xxv[2] = -0.5*su*sv2;
- xxv[3] = 0.5*su*cv2;
- for (l=0; l<4; l++)
+ /* The u and v values need to be computed once (or each time the value
+ of appearance changes, once we support that). */
+ ur = umax-umin;
+ vr = vmax-vmin;
+ for (i=0; i<=NUMU; i++)
{
- xx[l] /= PINCHED_TORUS_RADIUS+1.25;
- xxu[l] /= PINCHED_TORUS_RADIUS+1.25;
- xxv[l] /= PINCHED_TORUS_RADIUS+1.25;
+ for (j=0; j<=NUMV; j++)
+ {
+ o = i*(NUMU+1)+j;
+ u = -ur*j/NUMU+umin;
+ v = vr*i/NUMV+vmin;
+ kb->uv[o][0] = u;
+ kb->uv[o][1] = v;
+ }
}
- for (l=0; l<4; l++)
+ glBindBuffer(GL_ARRAY_BUFFER,kb->vertex_uv_buffer);
+ glBufferData(GL_ARRAY_BUFFER,2*(NUMU+1)*(NUMV+1)*sizeof(GLfloat),
+ kb->uv,GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+
+ glBindBuffer(GL_ARRAY_BUFFER,kb->vertex_t_buffer);
+ glBufferData(GL_ARRAY_BUFFER,2*(NUMU+1)*(NUMV+1)*sizeof(GLfloat),
+ kb->tex,GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+
+ if (!kb->change_colors &&
+ kb->colors != COLORS_ONESIDED && kb->colors != COLORS_TWOSIDED)
{
- y[l] = (mat[l][0]*xx[0]+mat[l][1]*xx[1]+
- mat[l][2]*xx[2]+mat[l][3]*xx[3]);
- yu[l] = (mat[l][0]*xxu[0]+mat[l][1]*xxu[1]+
- mat[l][2]*xxu[2]+mat[l][3]*xxu[3]);
- yv[l] = (mat[l][0]*xxv[0]+mat[l][1]*xxv[1]+
- mat[l][2]*xxv[2]+mat[l][3]*xxv[3]);
+ glBindBuffer(GL_ARRAY_BUFFER,kb->color_buffer);
+ glBufferData(GL_ARRAY_BUFFER,4*(NUMU+1)*(NUMV+1)*sizeof(GLfloat),
+ kb->col,GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
}
- if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+
+ /* The indices only need to be computed once (or each time the value of
+ appearance changes, once we support that). */
+ kb->ni = 0;
+ kb->ne = 0;
+ kb->nt = 0;
+ if (kb->display_mode != DISP_WIREFRAME)
{
- for (l=0; l<3; l++)
+ for (i=0; i<NUMU; i++)
{
- p[l] = y[l]+kb->offset4d[l];
- pu[l] = yu[l];
- pv[l] = yv[l];
+ if (kb->appearance == APPEARANCE_BANDS && ((i & (NUMB-1)) >= NUMB/2))
+ continue;
+ for (j=0; j<=NUMV; j++)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = i+k;
+ m = j;
+ o = l*(NUMV+1)+m;
+ kb->indices[kb->ni++] = o;
+ }
+ }
+ kb->ne++;
}
+ kb->nt = 2*(NUMV+1);
}
- else
+ else /* kb->display_mode == DISP_WIREFRAME */
{
- s = y[3]+kb->offset4d[3];
- q = 1.0/s;
- t = q*q;
- for (l=0; l<3; l++)
+ for (i=0; i<NUMU; i++)
{
- r = y[l]+kb->offset4d[l];
- p[l] = r*q;
- pu[l] = (yu[l]*s-r*yu[3])*t;
- pv[l] = (yv[l]*s-r*yv[3])*t;
+ if (kb->appearance == APPEARANCE_BANDS && ((i & (NUMB-1)) > NUMB/2))
+ continue;
+ if (kb->appearance == APPEARANCE_BANDS && ((i & (NUMB-1)) == NUMB/2))
+ {
+ for (j=0; j<NUMV; j++)
+ {
+ kb->indices[kb->ni++] = i*(NUMV+1)+j;
+ kb->indices[kb->ni++] = i*(NUMV+1)+j+1;
+ }
+ continue;
+ }
+ for (j=0; j<=NUMV; j++)
+ {
+ kb->indices[kb->ni++] = i*(NUMV+1)+j;
+ kb->indices[kb->ni++] = i*(NUMV+1)+j+1;
+ if (i < NUMV)
+ {
+ kb->indices[kb->ni++] = i*(NUMV+1)+j;
+ kb->indices[kb->ni++] = (i+1)*(NUMV+1)+j;
+ }
+ }
}
+ kb->ne = 1;
}
- n[0] = pu[1]*pv[2]-pu[2]*pv[1];
- n[1] = pu[2]*pv[0]-pu[0]*pv[2];
- n[2] = pu[0]*pv[1]-pu[1]*pv[0];
- t = 1.0/(kb->side*4.0*sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]));
- n[0] *= t;
- n[1] *= t;
- n[2] *= t;
- pm[0] = pu[0]*kb->dumove+pv[0]*kb->dvmove;
- pm[1] = pu[1]*kb->dumove+pv[1]*kb->dvmove;
- pm[2] = pu[2]*kb->dumove+pv[2]*kb->dvmove;
- t = 1.0/(4.0*sqrt(pm[0]*pm[0]+pm[1]*pm[1]+pm[2]*pm[2]));
- pm[0] *= t;
- pm[1] *= t;
- pm[2] *= t;
- b[0] = n[1]*pm[2]-n[2]*pm[1];
- b[1] = n[2]*pm[0]-n[0]*pm[2];
- b[2] = n[0]*pm[1]-n[1]*pm[0];
- t = 1.0/(4.0*sqrt(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]));
- b[0] *= t;
- b[1] *= t;
- b[2] *= t;
-
- /* Compute alpha, beta, delta from the three basis vectors.
- | -b[0] -b[1] -b[2] |
- m = | n[0] n[1] n[2] |
- | -pm[0] -pm[1] -pm[2] |
- */
- kb->alpha = atan2(-n[2],-pm[2])*180/M_PI;
- kb->beta = atan2(-b[2],sqrt(b[0]*b[0]+b[1]*b[1]))*180/M_PI;
- kb->delta = atan2(b[1],-b[0])*180/M_PI;
-
- /* Compute the rotation that rotates the Klein bottle in 4D. */
- rotateall(kb->alpha,kb->beta,kb->delta,kb->zeta,kb->eta,kb->theta,mat);
-
- u = kb->umove;
- v = kb->vmove;
- cu = cos(u);
- su = sin(u);
- cv = cos(v);
- sv = sin(v);
- cv2 = cos(0.5*v);
- sv2 = sin(0.5*v);
- xx[0] = (PINCHED_TORUS_RADIUS+cu)*cv;
- xx[1] = (PINCHED_TORUS_RADIUS+cu)*sv;
- xx[2] = su*cv2;
- xx[3] = su*sv2;
- for (l=0; l<4; l++)
- xx[l] /= PINCHED_TORUS_RADIUS+1.25;
- for (l=0; l<4; l++)
- {
- r = 0.0;
- for (m=0; m<4; m++)
- r += mat[l][m]*xx[m];
- y[l] = r;
- }
- if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,kb->indices_buffer);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER,kb->ni*sizeof(GLuint),
+ kb->indices,GL_STATIC_DRAW);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
+
+ kb->buffers_initialized = True;
+ }
+
+ if (kb->change_colors)
+ rotateall3d(kb->rho,kb->sigma,kb->tau,matc);
+
+ if (kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ {
+ compute_walk_frame_figure8(kb,mat);
+ }
+ else
+ {
+ /* Compute the rotation that rotates the Klein bottle in 4D, including
+ the trackball rotations. */
+ rotateall(kb->alpha,kb->beta,kb->delta,kb->zeta,kb->eta,kb->theta,r1);
+
+ gltrackball_get_quaternion(kb->trackballs[0],q1);
+ gltrackball_get_quaternion(kb->trackballs[1],q2);
+ quats_to_rotmat(q1,q2,r2);
+
+ mult_rotmat(r2,r1,mat);
+ }
+
+ if (kb->change_colors &&
+ (kb->colors == COLORS_RAINBOW || kb->colors == COLORS_DEPTH))
+ {
+ ur = umax-umin;
+ vr = vmax-vmin;
+ for (i=0; i<=NUMU; i++)
{
- for (l=0; l<3; l++)
- p[l] = y[l]+kb->offset4d[l];
+ for (j=0; j<=NUMV; j++)
+ {
+ o = i*(NUMV+1)+j;
+ if (kb->colors == COLORS_DEPTH)
+ {
+ u = -ur*j/NUMU+umin;
+ color(kb,(cos(u)+1.0)*M_PI*2.0/3.0,matc,kb->col[o]);
+ }
+ else if (kb->colors == COLORS_RAINBOW)
+ {
+ v = vr*i/NUMV+vmin;
+ color(kb,v,matc,kb->col[o]);
+ }
+ }
}
- else
+ }
+
+ glUseProgram(kb->shader_program);
+
+ set_opengl_state_pf(mi,mat,matc);
+
+ glEnableVertexAttribArray(kb->vertex_uv_index);
+ glBindBuffer(GL_ARRAY_BUFFER,kb->vertex_uv_buffer);
+ glVertexAttribPointer(kb->vertex_uv_index,2,GL_FLOAT,GL_FALSE,0,0);
+
+ glEnableVertexAttribArray(kb->vertex_t_index);
+ glBindBuffer(GL_ARRAY_BUFFER,kb->vertex_t_buffer);
+ glVertexAttribPointer(kb->vertex_t_index,2,GL_FLOAT,GL_FALSE,0,0);
+
+ if (kb->colors != COLORS_ONESIDED && kb->colors != COLORS_TWOSIDED)
+ {
+ glEnableVertexAttribArray(kb->color_index);
+ glBindBuffer(GL_ARRAY_BUFFER,kb->color_buffer);
+ if (kb->change_colors)
+ glBufferData(GL_ARRAY_BUFFER,4*(NUMU+1)*(NUMV+1)*sizeof(GLfloat),
+ kb->col,GL_STREAM_DRAW);
+ glVertexAttribPointer(kb->color_index,4,GL_FLOAT,GL_FALSE,0,0);
+ }
+
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,kb->indices_buffer);
+
+ if (kb->display_mode != DISP_WIREFRAME)
+ {
+ for (i=0; i<kb->ne; i++)
{
- s = y[3]+kb->offset4d[3];
- for (l=0; l<3; l++)
- p[l] = (y[l]+kb->offset4d[l])/s;
+ index_offset = kb->nt*i*sizeof(GLuint);
+ glDrawElements(GL_TRIANGLE_STRIP,kb->nt,GL_UNSIGNED_INT,
+ (const GLvoid *)index_offset);
+ polys = 2*kb->ne*NUMV;
}
+ }
+ else /* kb->display_mode == DISP_WIREFRAME */
+ {
+ glLineWidth(1.0f);
+ index_offset = 0;
+ glDrawElements(GL_LINES,kb->ni,GL_UNSIGNED_INT,
+ (const void *)index_offset);
+ }
+
+ glDisableVertexAttribArray(kb->vertex_uv_index);
+ glDisableVertexAttribArray(kb->vertex_t_index);
+ if (kb->colors != COLORS_ONESIDED && kb->colors != COLORS_TWOSIDED)
+ glDisableVertexAttribArray(kb->color_index);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
+
+ glUseProgram(0);
+
+ polys = 2*NUMU*NUMV;
+ if (kb->appearance != APPEARANCE_SOLID)
+ polys /= 2;
+ return polys;
+}
+
+#endif /* HAVE_GLSL */
+
+
+/* Draw a pinched torus Klein bottle projected into 3D. */
+static int pinched_torus_ff(ModeInfo *mi, double umin, double umax,
+ double vmin, double vmax)
+{
+ int polys;
+ float pu[3], pv[3], mat[4][4], matc[3][3];
+ int i, j, k, l, m, o;
+ double u, v, ur, vr;
+ double y[4], yu[4], yv[4];
+ double q, r, s, t;
+ float q1[4], q2[4], r1[4][4], r2[4][4];
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ if (kb->change_colors)
+ rotateall3d(kb->rho,kb->sigma,kb->tau,matc);
+
+ set_opengl_state_ff(mi,matc);
- kb->offset3d[0] = -p[0];
- kb->offset3d[1] = -p[1]-DELTAY;
- kb->offset3d[2] = -p[2];
+ if (kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ {
+ compute_walk_frame_pinched_torus(kb,mat);
}
else
{
@@ -1398,58 +2229,6 @@ static int pinched_torus(ModeInfo *mi, double umin, double umax, double vmin,
}
}
- if (!kb->change_colors)
- {
- if (kb->colors == COLORS_ONESIDED)
- {
- glColor3fv(mat_diff_oneside);
- if (kb->display_mode == DISP_TRANSPARENT)
- {
- glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,
- mat_diff_trans_oneside);
- }
- else
- {
- glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,
- mat_diff_oneside);
- }
- }
- else if (kb->colors == COLORS_TWOSIDED)
- {
- glColor3fv(mat_diff_red);
- if (kb->display_mode == DISP_TRANSPARENT)
- {
- glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_red);
- glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_green);
- }
- else
- {
- glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_red);
- glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_green);
- }
- }
- }
- else /* kb->change_colors */
- {
- color(kb,0.0,matc,mat_diff_dyn);
- if (kb->colors == COLORS_ONESIDED)
- {
- glColor3fv(mat_diff_dyn);
- glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_dyn);
- }
- else if (kb->colors == COLORS_TWOSIDED)
- {
- mat_diff_dyn_compl[0] = 1.0f-mat_diff_dyn[0];
- mat_diff_dyn_compl[1] = 1.0f-mat_diff_dyn[1];
- mat_diff_dyn_compl[2] = 1.0f-mat_diff_dyn[2];
- mat_diff_dyn_compl[3] = mat_diff_dyn[3];
- glColor3fv(mat_diff_dyn);
- glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_dyn);
- glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_dyn_compl);
- }
- }
- glBindTexture(GL_TEXTURE_2D,kb->tex_name);
-
ur = umax-umin;
vr = vmax-vmin;
for (i=0; i<NUMU; i++)
@@ -1464,7 +2243,7 @@ static int pinched_torus(ModeInfo *mi, double umin, double umax, double vmin,
{
for (k=0; k<=1; k++)
{
- l = (i+k);
+ l = i+k;
m = j;
o = l*(NUMV+1)+m;
glNormal3fv(kb->pn[o]);
@@ -1488,165 +2267,257 @@ static int pinched_torus(ModeInfo *mi, double umin, double umax, double vmin,
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,kb->col[o]);
}
glVertex3fv(kb->pp[o]);
- polys++;
}
}
glEnd();
}
- polys /= 2;
+
+ polys = 2*NUMU*NUMV;
+ if (kb->appearance != APPEARANCE_SOLID)
+ polys /= 2;
return polys;
}
-/* Draw a Lawson Klein bottle projected into 3D. */
-static int lawson(ModeInfo *mi, double umin, double umax, double vmin,
- double vmax)
+#ifdef HAVE_GLSL
+
+/* Draw a pinched torus Klein bottle projected into 3D. */
+static int pinched_torus_pf(ModeInfo *mi, double umin, double umax,
+ double vmin, double vmax)
{
- int polys = 0;
- static const GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
- static const GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
- static const GLfloat mat_diff_oneside[] = { 0.9, 0.4, 0.3, 1.0 };
- static const GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.7 };
- static const GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 };
- static const GLfloat mat_diff_trans_oneside[] = { 0.9, 0.4, 0.3, 0.7 };
- float mat_diff_dyn[4], mat_diff_dyn_compl[4];
- float p[3], pu[3], pv[3], pm[3], n[3], b[3], mat[4][4], matc[3][3];
+ int polys;
+ float mat[4][4], matc[3][3];
int i, j, k, l, m, o;
double u, v, ur, vr;
- double cu, su, cv, sv, cv2, sv2;
- double xx[4], xxu[4], xxv[4], y[4], yu[4], yv[4];
- double q, r, s, t;
float q1[4], q2[4], r1[4][4], r2[4][4];
+ GLsizeiptr index_offset;
kleinstruct *kb = &klein[MI_SCREEN(mi)];
- if (kb->change_colors)
- rotateall3d(kb->rho,kb->sigma,kb->tau,matc);
+ if (!kb->use_shaders)
+ return 0;
- if (kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ if (!kb->buffers_initialized)
{
- /* Compute the rotation that rotates the Klein bottle in 4D without the
- trackball rotations. */
- rotateall4d(kb->zeta,kb->eta,kb->theta,mat);
-
- u = kb->umove;
- v = kb->vmove;
- cu = cos(u);
- su = sin(u);
- cv = cos(v);
- sv = sin(v);
- cv2 = cos(0.5*v);
- sv2 = sin(0.5*v);
- xx[0] = cu*cv;
- xx[1] = cu*sv;
- xx[2] = su*sv2;
- xx[3] = su*cv2;
- xxu[0] = -su*cv;
- xxu[1] = -su*sv;
- xxu[2] = cu*sv2;
- xxu[3] = cu*cv2;
- xxv[0] = -cu*sv;
- xxv[1] = cu*cv;
- xxv[2] = su*cv2*0.5;
- xxv[3] = -su*sv2*0.5;
- for (l=0; l<4; l++)
- {
- y[l] = (mat[l][0]*xx[0]+mat[l][1]*xx[1]+
- mat[l][2]*xx[2]+mat[l][3]*xx[3]);
- yu[l] = (mat[l][0]*xxu[0]+mat[l][1]*xxu[1]+
- mat[l][2]*xxu[2]+mat[l][3]*xxu[3]);
- yv[l] = (mat[l][0]*xxv[0]+mat[l][1]*xxv[1]+
- mat[l][2]*xxv[2]+mat[l][3]*xxv[3]);
- }
- if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ /* The u and v values need to be computed once (or each time the value
+ of appearance changes, once we support that). */
+ ur = umax-umin;
+ vr = vmax-vmin;
+ for (i=0; i<=NUMU; i++)
{
- for (l=0; l<3; l++)
+ for (j=0; j<=NUMV; j++)
{
- p[l] = y[l]+kb->offset4d[l];
- pu[l] = yu[l];
- pv[l] = yv[l];
+ o = i*(NUMU+1)+j;
+ u = -ur*j/NUMU+umin;
+ v = vr*i/NUMV+vmin;
+ kb->uv[o][0] = u;
+ kb->uv[o][1] = v;
}
}
- else
+ glBindBuffer(GL_ARRAY_BUFFER,kb->vertex_uv_buffer);
+ glBufferData(GL_ARRAY_BUFFER,2*(NUMU+1)*(NUMV+1)*sizeof(GLfloat),
+ kb->uv,GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+
+ glBindBuffer(GL_ARRAY_BUFFER,kb->vertex_t_buffer);
+ glBufferData(GL_ARRAY_BUFFER,2*(NUMU+1)*(NUMV+1)*sizeof(GLfloat),
+ kb->tex,GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+
+ if (!kb->change_colors &&
+ kb->colors != COLORS_ONESIDED && kb->colors != COLORS_TWOSIDED)
+ {
+ glBindBuffer(GL_ARRAY_BUFFER,kb->color_buffer);
+ glBufferData(GL_ARRAY_BUFFER,4*(NUMU+1)*(NUMV+1)*sizeof(GLfloat),
+ kb->col,GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+ }
+
+ /* The indices only need to be computed once (or each time the value of
+ appearance changes, once we support that). */
+ kb->ni = 0;
+ kb->ne = 0;
+ kb->nt = 0;
+ if (kb->display_mode != DISP_WIREFRAME)
{
- s = y[3]+kb->offset4d[3];
- q = 1.0/s;
- t = q*q;
- for (l=0; l<3; l++)
+ for (i=0; i<NUMU; i++)
{
- r = y[l]+kb->offset4d[l];
- p[l] = r*q;
- pu[l] = (yu[l]*s-r*yu[3])*t;
- pv[l] = (yv[l]*s-r*yv[3])*t;
+ if (kb->appearance == APPEARANCE_BANDS && ((i & (NUMB-1)) >= NUMB/2))
+ continue;
+ for (j=0; j<=NUMV; j++)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = i+k;
+ m = j;
+ o = l*(NUMV+1)+m;
+ kb->indices[kb->ni++] = o;
+ }
+ }
+ kb->ne++;
}
+ kb->nt = 2*(NUMV+1);
}
- n[0] = pu[1]*pv[2]-pu[2]*pv[1];
- n[1] = pu[2]*pv[0]-pu[0]*pv[2];
- n[2] = pu[0]*pv[1]-pu[1]*pv[0];
- t = 1.0/(kb->side*4.0*sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]));
- n[0] *= t;
- n[1] *= t;
- n[2] *= t;
- pm[0] = pu[0]*kb->dumove+pv[0]*kb->dvmove;
- pm[1] = pu[1]*kb->dumove+pv[1]*kb->dvmove;
- pm[2] = pu[2]*kb->dumove+pv[2]*kb->dvmove;
- t = 1.0/(4.0*sqrt(pm[0]*pm[0]+pm[1]*pm[1]+pm[2]*pm[2]));
- pm[0] *= t;
- pm[1] *= t;
- pm[2] *= t;
- b[0] = n[1]*pm[2]-n[2]*pm[1];
- b[1] = n[2]*pm[0]-n[0]*pm[2];
- b[2] = n[0]*pm[1]-n[1]*pm[0];
- t = 1.0/(4.0*sqrt(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]));
- b[0] *= t;
- b[1] *= t;
- b[2] *= t;
-
- /* Compute alpha, beta, delta from the three basis vectors.
- | -b[0] -b[1] -b[2] |
- m = | n[0] n[1] n[2] |
- | -pm[0] -pm[1] -pm[2] |
- */
- kb->alpha = atan2(-n[2],-pm[2])*180/M_PI;
- kb->beta = atan2(-b[2],sqrt(b[0]*b[0]+b[1]*b[1]))*180/M_PI;
- kb->delta = atan2(b[1],-b[0])*180/M_PI;
-
- /* Compute the rotation that rotates the Klein bottle in 4D. */
- rotateall(kb->alpha,kb->beta,kb->delta,kb->zeta,kb->eta,kb->theta,mat);
-
- u = kb->umove;
- v = kb->vmove;
- cu = cos(u);
- su = sin(u);
- cv = cos(v);
- sv = sin(v);
- cv2 = cos(0.5*v);
- sv2 = sin(0.5*v);
- xx[0] = cu*cv;
- xx[1] = cu*sv;
- xx[2] = su*sv2;
- xx[3] = su*cv2;
- for (l=0; l<4; l++)
+ else /* kb->display_mode == DISP_WIREFRAME */
{
- r = 0.0;
- for (m=0; m<4; m++)
- r += mat[l][m]*xx[m];
- y[l] = r;
+ for (i=0; i<NUMU; i++)
+ {
+ if (kb->appearance == APPEARANCE_BANDS && ((i & (NUMB-1)) > NUMB/2))
+ continue;
+ if (kb->appearance == APPEARANCE_BANDS && ((i & (NUMB-1)) == NUMB/2))
+ {
+ for (j=0; j<NUMV; j++)
+ {
+ kb->indices[kb->ni++] = i*(NUMV+1)+j;
+ kb->indices[kb->ni++] = i*(NUMV+1)+j+1;
+ }
+ continue;
+ }
+ for (j=0; j<=NUMV; j++)
+ {
+ kb->indices[kb->ni++] = i*(NUMV+1)+j;
+ kb->indices[kb->ni++] = i*(NUMV+1)+j+1;
+ if (i < NUMV)
+ {
+ kb->indices[kb->ni++] = i*(NUMV+1)+j;
+ kb->indices[kb->ni++] = (i+1)*(NUMV+1)+j;
+ }
+ }
+ }
+ kb->ne = 1;
}
- if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,kb->indices_buffer);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER,kb->ni*sizeof(GLuint),
+ kb->indices,GL_STATIC_DRAW);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
+
+ kb->buffers_initialized = True;
+ }
+
+ if (kb->change_colors)
+ rotateall3d(kb->rho,kb->sigma,kb->tau,matc);
+
+ if (kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ {
+ compute_walk_frame_pinched_torus(kb,mat);
+ }
+ else
+ {
+ /* Compute the rotation that rotates the Klein bottle in 4D, including
+ the trackball rotations. */
+ rotateall(kb->alpha,kb->beta,kb->delta,kb->zeta,kb->eta,kb->theta,r1);
+
+ gltrackball_get_quaternion(kb->trackballs[0],q1);
+ gltrackball_get_quaternion(kb->trackballs[1],q2);
+ quats_to_rotmat(q1,q2,r2);
+
+ mult_rotmat(r2,r1,mat);
+ }
+
+ if (kb->change_colors &&
+ (kb->colors == COLORS_RAINBOW || kb->colors == COLORS_DEPTH))
+ {
+ ur = umax-umin;
+ vr = vmax-vmin;
+ for (i=0; i<=NUMU; i++)
{
- for (l=0; l<3; l++)
- p[l] = y[l]+kb->offset4d[l];
+ for (j=0; j<=NUMV; j++)
+ {
+ o = i*(NUMV+1)+j;
+ v = vr*i/NUMV+vmin;
+ if (kb->colors == COLORS_DEPTH)
+ {
+ u = -ur*j/NUMU+umin;
+ color(kb,(sin(u)*sin(0.5*v)+1.0)*M_PI*2.0/3.0,matc,kb->col[o]);
+ }
+ else if (kb->colors == COLORS_RAINBOW)
+ {
+ color(kb,v,matc,kb->col[o]);
+ }
+ }
}
- else
+ }
+
+ glUseProgram(kb->shader_program);
+
+ set_opengl_state_pf(mi,mat,matc);
+
+ glEnableVertexAttribArray(kb->vertex_uv_index);
+ glBindBuffer(GL_ARRAY_BUFFER,kb->vertex_uv_buffer);
+ glVertexAttribPointer(kb->vertex_uv_index,2,GL_FLOAT,GL_FALSE,0,0);
+
+ glEnableVertexAttribArray(kb->vertex_t_index);
+ glBindBuffer(GL_ARRAY_BUFFER,kb->vertex_t_buffer);
+ glVertexAttribPointer(kb->vertex_t_index,2,GL_FLOAT,GL_FALSE,0,0);
+
+ if (kb->colors != COLORS_ONESIDED && kb->colors != COLORS_TWOSIDED)
+ {
+ glEnableVertexAttribArray(kb->color_index);
+ glBindBuffer(GL_ARRAY_BUFFER,kb->color_buffer);
+ if (kb->change_colors)
+ glBufferData(GL_ARRAY_BUFFER,4*(NUMU+1)*(NUMV+1)*sizeof(GLfloat),
+ kb->col,GL_STREAM_DRAW);
+ glVertexAttribPointer(kb->color_index,4,GL_FLOAT,GL_FALSE,0,0);
+ }
+
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,kb->indices_buffer);
+
+ if (kb->display_mode != DISP_WIREFRAME)
+ {
+ for (i=0; i<kb->ne; i++)
{
- s = y[3]+kb->offset4d[3];
- for (l=0; l<3; l++)
- p[l] = (y[l]+kb->offset4d[l])/s;
+ index_offset = kb->nt*i*sizeof(GLuint);
+ glDrawElements(GL_TRIANGLE_STRIP,kb->nt,GL_UNSIGNED_INT,
+ (const GLvoid *)index_offset);
+ polys = 2*kb->ne*NUMV;
}
+ }
+ else /* kb->display_mode == DISP_WIREFRAME */
+ {
+ glLineWidth(1.0f);
+ index_offset = 0;
+ glDrawElements(GL_LINES,kb->ni,GL_UNSIGNED_INT,
+ (const void *)index_offset);
+ }
+
+ glDisableVertexAttribArray(kb->vertex_uv_index);
+ glDisableVertexAttribArray(kb->vertex_t_index);
+ if (kb->colors != COLORS_ONESIDED && kb->colors != COLORS_TWOSIDED)
+ glDisableVertexAttribArray(kb->color_index);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
+
+ glUseProgram(0);
+
+ polys = 2*NUMU*NUMV;
+ if (kb->appearance != APPEARANCE_SOLID)
+ polys /= 2;
+ return polys;
+}
+
+#endif /* HAVE_GLSL */
+
+
+/* Draw a Lawson Klein bottle projected into 3D. */
+static int lawson_ff(ModeInfo *mi, double umin, double umax, double vmin,
+ double vmax)
+{
+ int polys;
+ float pu[3], pv[3], mat[4][4], matc[3][3];
+ int i, j, k, l, m, o;
+ double u, v, ur, vr;
+ double y[4], yu[4], yv[4];
+ double q, r, s, t;
+ float q1[4], q2[4], r1[4][4], r2[4][4];
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ if (kb->change_colors)
+ rotateall3d(kb->rho,kb->sigma,kb->tau,matc);
- kb->offset3d[0] = -p[0];
- kb->offset3d[1] = -p[1]-DELTAY;
- kb->offset3d[2] = -p[2];
+ set_opengl_state_ff(mi,matc);
+
+ if (kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ {
+ compute_walk_frame_lawson(kb,mat);
}
else
{
@@ -1709,58 +2580,6 @@ static int lawson(ModeInfo *mi, double umin, double umax, double vmin,
}
}
- if (!kb->change_colors)
- {
- if (kb->colors == COLORS_ONESIDED)
- {
- glColor3fv(mat_diff_oneside);
- if (kb->display_mode == DISP_TRANSPARENT)
- {
- glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,
- mat_diff_trans_oneside);
- }
- else
- {
- glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,
- mat_diff_oneside);
- }
- }
- else if (kb->colors == COLORS_TWOSIDED)
- {
- glColor3fv(mat_diff_red);
- if (kb->display_mode == DISP_TRANSPARENT)
- {
- glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_red);
- glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_green);
- }
- else
- {
- glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_red);
- glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_green);
- }
- }
- }
- else /* kb->change_colors */
- {
- color(kb,0.0,matc,mat_diff_dyn);
- if (kb->colors == COLORS_ONESIDED)
- {
- glColor3fv(mat_diff_dyn);
- glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_dyn);
- }
- else if (kb->colors == COLORS_TWOSIDED)
- {
- mat_diff_dyn_compl[0] = 1.0f-mat_diff_dyn[0];
- mat_diff_dyn_compl[1] = 1.0f-mat_diff_dyn[1];
- mat_diff_dyn_compl[2] = 1.0f-mat_diff_dyn[2];
- mat_diff_dyn_compl[3] = mat_diff_dyn[3];
- glColor3fv(mat_diff_dyn);
- glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_dyn);
- glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_dyn_compl);
- }
- }
- glBindTexture(GL_TEXTURE_2D,kb->tex_name);
-
ur = umax-umin;
vr = vmax-vmin;
for (i=0; i<NUMV; i++)
@@ -1775,7 +2594,7 @@ static int lawson(ModeInfo *mi, double umin, double umax, double vmin,
{
for (k=0; k<=1; k++)
{
- l = (i+k);
+ l = i+k;
m = j;
o = l*(NUMU+1)+m;
glNormal3fv(kb->pn[o]);
@@ -1799,24 +2618,247 @@ static int lawson(ModeInfo *mi, double umin, double umax, double vmin,
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,kb->col[o]);
}
glVertex3fv(kb->pp[o]);
- polys++;
}
}
glEnd();
}
- polys /= 2;
+
+ polys = 2*NUMU*NUMV;
+ if (kb->appearance != APPEARANCE_SOLID)
+ polys /= 2;
return polys;
}
+#ifdef HAVE_GLSL
+
+/* Draw a Lawson Klein bottle projected into 3D. */
+static int lawson_pf(ModeInfo *mi, double umin, double umax, double vmin,
+ double vmax)
+{
+ int polys;
+ float mat[4][4], matc[3][3];
+ int i, j, k, l, m, o;
+ double u, v, ur, vr;
+ float q1[4], q2[4], r1[4][4], r2[4][4];
+ GLsizeiptr index_offset;
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ if (!kb->use_shaders)
+ return 0;
+
+ if (!kb->buffers_initialized)
+ {
+ /* The u and v values need to be computed once (or each time the value
+ of appearance changes, once we support that). */
+ ur = umax-umin;
+ vr = vmax-vmin;
+ for (i=0; i<=NUMV; i++)
+ {
+ for (j=0; j<=NUMU; j++)
+ {
+ o = i*(NUMU+1)+j;
+ u = -ur*j/NUMU+umin;
+ v = vr*i/NUMV+vmin;
+ kb->uv[o][0] = u;
+ kb->uv[o][1] = v;
+ }
+ }
+ glBindBuffer(GL_ARRAY_BUFFER,kb->vertex_uv_buffer);
+ glBufferData(GL_ARRAY_BUFFER,2*(NUMU+1)*(NUMV+1)*sizeof(GLfloat),
+ kb->uv,GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+
+ glBindBuffer(GL_ARRAY_BUFFER,kb->vertex_t_buffer);
+ glBufferData(GL_ARRAY_BUFFER,2*(NUMU+1)*(NUMV+1)*sizeof(GLfloat),
+ kb->tex,GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+
+ if (!kb->change_colors &&
+ kb->colors != COLORS_ONESIDED && kb->colors != COLORS_TWOSIDED)
+ {
+ glBindBuffer(GL_ARRAY_BUFFER,kb->color_buffer);
+ glBufferData(GL_ARRAY_BUFFER,4*(NUMU+1)*(NUMV+1)*sizeof(GLfloat),
+ kb->col,GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+ }
+
+ /* The indices only need to be computed once (or each time the value of
+ appearance changes, once we support that). */
+ kb->ni = 0;
+ kb->ne = 0;
+ kb->nt = 0;
+ if (kb->display_mode != DISP_WIREFRAME)
+ {
+ for (i=0; i<NUMV; i++)
+ {
+ if (kb->appearance == APPEARANCE_BANDS && ((i & (NUMB-1)) >= NUMB/2))
+ continue;
+ for (j=0; j<=NUMU; j++)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = i+k;
+ m = j;
+ o = l*(NUMU+1)+m;
+ kb->indices[kb->ni++] = o;
+ }
+ }
+ kb->ne++;
+ }
+ kb->nt = 2*(NUMU+1);
+ }
+ else /* kb->display_mode == DISP_WIREFRAME */
+ {
+ for (i=0; i<NUMV; i++)
+ {
+ if (kb->appearance == APPEARANCE_BANDS && ((i & (NUMB-1)) > NUMB/2))
+ continue;
+ if (kb->appearance == APPEARANCE_BANDS && ((i & (NUMB-1)) == NUMB/2))
+ {
+ for (j=0; j<NUMU; j++)
+ {
+ kb->indices[kb->ni++] = i*(NUMU+1)+j;
+ kb->indices[kb->ni++] = i*(NUMU+1)+j+1;
+ }
+ continue;
+ }
+ for (j=0; j<=NUMV; j++)
+ {
+ kb->indices[kb->ni++] = i*(NUMU+1)+j;
+ kb->indices[kb->ni++] = i*(NUMU+1)+j+1;
+ if (i < NUMV)
+ {
+ kb->indices[kb->ni++] = i*(NUMU+1)+j;
+ kb->indices[kb->ni++] = (i+1)*(NUMU+1)+j;
+ }
+ }
+ }
+ kb->ne = 1;
+ }
+
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,kb->indices_buffer);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER,kb->ni*sizeof(GLuint),
+ kb->indices,GL_STATIC_DRAW);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
+
+ kb->buffers_initialized = True;
+ }
+
+ if (kb->change_colors)
+ rotateall3d(kb->rho,kb->sigma,kb->tau,matc);
+
+ set_opengl_state_pf(mi,mat,matc);
+
+ if (kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ {
+ compute_walk_frame_lawson(kb,mat);
+ }
+ else
+ {
+ /* Compute the rotation that rotates the Klein bottle in 4D, including
+ the trackball rotations. */
+ rotateall(kb->alpha,kb->beta,kb->delta,kb->zeta,kb->eta,kb->theta,r1);
+
+ gltrackball_get_quaternion(kb->trackballs[0],q1);
+ gltrackball_get_quaternion(kb->trackballs[1],q2);
+ quats_to_rotmat(q1,q2,r2);
+
+ mult_rotmat(r2,r1,mat);
+ }
+
+ if (kb->change_colors &&
+ (kb->colors == COLORS_RAINBOW || kb->colors == COLORS_DEPTH))
+ {
+ ur = umax-umin;
+ vr = vmax-vmin;
+ for (i=0; i<=NUMV; i++)
+ {
+ for (j=0; j<=NUMU; j++)
+ {
+ o = i*(NUMV+1)+j;
+ v = vr*i/NUMV+vmin;
+ if (kb->colors == COLORS_DEPTH)
+ {
+ u = -ur*j/NUMU+umin;
+ color(kb,(sin(u)*cos(0.5*v)+1.0)*M_PI*2.0/3.0,matc,kb->col[o]);
+ }
+ else if (kb->colors == COLORS_RAINBOW)
+ {
+ color(kb,v,matc,kb->col[o]);
+ }
+ }
+ }
+ }
+
+ glUseProgram(kb->shader_program);
+
+ set_opengl_state_pf(mi,mat,matc);
+
+ glEnableVertexAttribArray(kb->vertex_uv_index);
+ glBindBuffer(GL_ARRAY_BUFFER,kb->vertex_uv_buffer);
+ glVertexAttribPointer(kb->vertex_uv_index,2,GL_FLOAT,GL_FALSE,0,0);
+
+ glEnableVertexAttribArray(kb->vertex_t_index);
+ glBindBuffer(GL_ARRAY_BUFFER,kb->vertex_t_buffer);
+ glVertexAttribPointer(kb->vertex_t_index,2,GL_FLOAT,GL_FALSE,0,0);
+
+ if (kb->colors != COLORS_ONESIDED && kb->colors != COLORS_TWOSIDED)
+ {
+ glEnableVertexAttribArray(kb->color_index);
+ glBindBuffer(GL_ARRAY_BUFFER,kb->color_buffer);
+ if (kb->change_colors)
+ glBufferData(GL_ARRAY_BUFFER,4*(NUMU+1)*(NUMV+1)*sizeof(GLfloat),
+ kb->col,GL_STREAM_DRAW);
+ glVertexAttribPointer(kb->color_index,4,GL_FLOAT,GL_FALSE,0,0);
+ }
+
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,kb->indices_buffer);
+
+ if (kb->display_mode != DISP_WIREFRAME)
+ {
+ for (i=0; i<kb->ne; i++)
+ {
+ index_offset = kb->nt*i*sizeof(GLuint);
+ glDrawElements(GL_TRIANGLE_STRIP,kb->nt,GL_UNSIGNED_INT,
+ (const GLvoid *)index_offset);
+ polys = 2*kb->ne*NUMV;
+ }
+ }
+ else /* kb->display_mode == DISP_WIREFRAME */
+ {
+ glLineWidth(1.0f);
+ index_offset = 0;
+ glDrawElements(GL_LINES,kb->ni,GL_UNSIGNED_INT,
+ (const void *)index_offset);
+ }
+
+ glDisableVertexAttribArray(kb->vertex_uv_index);
+ glDisableVertexAttribArray(kb->vertex_t_index);
+ if (kb->colors != COLORS_ONESIDED && kb->colors != COLORS_TWOSIDED)
+ glDisableVertexAttribArray(kb->color_index);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
+
+ glUseProgram(0);
+
+ polys = 2*NUMU*NUMV;
+ if (kb->appearance != APPEARANCE_SOLID)
+ polys /= 2;
+ return polys;
+}
+
+#endif /* HAVE_GLSL */
+
+
/* Generate a texture image that shows the orientation reversal. */
static void gen_texture(ModeInfo *mi)
{
kleinstruct *kb = &klein[MI_SCREEN(mi)];
+ glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glGenTextures(1,&kb->tex_name);
glBindTexture(GL_TEXTURE_2D,kb->tex_name);
- glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
@@ -1827,13 +2869,153 @@ static void gen_texture(ModeInfo *mi)
}
+#ifdef HAVE_GLSL
+
+static void init_glsl(ModeInfo *mi)
+{
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+ GLint gl_major, gl_minor, glsl_major, glsl_minor;
+ GLboolean gl_gles3;
+ const GLchar *vertex_shader_source[3];
+ const GLchar *fragment_shader_source[4];
+
+ /* Determine whether to use shaders to render the Klein bottle. */
+ kb->use_shaders = False;
+ kb->buffers_initialized = False;
+ kb->shader_program = 0;
+ kb->ni = 0;
+ kb->ne = 0;
+ kb->nt = 0;
+
+ if (!glsl_GetGlAndGlslVersions(&gl_major,&gl_minor,&glsl_major,&glsl_minor,
+ &gl_gles3))
+ return;
+ if (!gl_gles3)
+ {
+ if (gl_major < 3 ||
+ (glsl_major < 1 || (glsl_major == 1 && glsl_minor < 30)))
+ {
+ if ((gl_major < 2 || (gl_major == 2 && gl_minor < 1)) ||
+ (glsl_major < 1 || (glsl_major == 1 && glsl_minor < 20)))
+ return;
+ /* We have at least OpenGL 2.1 and at least GLSL 1.20. */
+ vertex_shader_source[0] = shader_version_2_1;
+ vertex_shader_source[1] = vertex_shader_attribs_2_1;
+ vertex_shader_source[2] = vertex_shader_main;
+ fragment_shader_source[0] = shader_version_2_1;
+ fragment_shader_source[1] = fragment_shader_attribs_2_1;
+ fragment_shader_source[2] = fragment_shader_main;
+ fragment_shader_source[3] = fragment_shader_out_2_1;
+ }
+ else
+ {
+ /* We have at least OpenGL 3.0 and at least GLSL 1.30. */
+ vertex_shader_source[0] = shader_version_3_0;
+ vertex_shader_source[1] = vertex_shader_attribs_3_0;
+ vertex_shader_source[2] = vertex_shader_main;
+ fragment_shader_source[0] = shader_version_3_0;
+ fragment_shader_source[1] = fragment_shader_attribs_3_0;
+ fragment_shader_source[2] = fragment_shader_main;
+ fragment_shader_source[3] = fragment_shader_out_3_0;
+ }
+ }
+ else /* gl_gles3 */
+ {
+ if (gl_major < 3 || glsl_major < 3)
+ return;
+ /* We have at least OpenGL ES 3.0 and at least GLSL ES 3.0. */
+ vertex_shader_source[0] = shader_version_3_0_es;
+ vertex_shader_source[1] = vertex_shader_attribs_3_0;
+ vertex_shader_source[2] = vertex_shader_main;
+ fragment_shader_source[0] = shader_version_3_0_es;
+ fragment_shader_source[1] = fragment_shader_attribs_3_0;
+ fragment_shader_source[2] = fragment_shader_main;
+ fragment_shader_source[3] = fragment_shader_out_3_0;
+ }
+ if (!glsl_CompileAndLinkShaders(3,vertex_shader_source,
+ 4,fragment_shader_source,
+ &kb->shader_program))
+ return;
+ kb->vertex_uv_index = glGetAttribLocation(kb->shader_program,"VertexUV");
+ kb->vertex_t_index = glGetAttribLocation(kb->shader_program,"VertexT");
+ kb->color_index = glGetAttribLocation(kb->shader_program,"VertexColor");
+ if (kb->vertex_uv_index == -1 || kb->vertex_t_index == -1 ||
+ kb->color_index == -1)
+ {
+ glDeleteProgram(kb->shader_program);
+ return;
+ }
+ kb->mat_rot_index = glGetUniformLocation(kb->shader_program,
+ "MatRot4D");
+ kb->mat_p_index = glGetUniformLocation(kb->shader_program,
+ "MatProj");
+ kb->bool_persp_index = glGetUniformLocation(kb->shader_program,
+ "BoolPersp");
+ kb->off4d_index = glGetUniformLocation(kb->shader_program,
+ "Offset4D");
+ kb->off3d_index = glGetUniformLocation(kb->shader_program,
+ "Offset3D");
+ kb->bool_textures_index = glGetUniformLocation(kb->shader_program,
+ "BoolTextures");
+ kb->bottle_type_index = glGetUniformLocation(kb->shader_program,
+ "BottleType");
+ kb->draw_lines_index = glGetUniformLocation(kb->shader_program,
+ "DrawLines");
+ kb->glbl_ambient_index = glGetUniformLocation(kb->shader_program,
+ "LtGlblAmbient");
+ kb->lt_ambient_index = glGetUniformLocation(kb->shader_program,
+ "LtAmbient");
+ kb->lt_diffuse_index = glGetUniformLocation(kb->shader_program,
+ "LtDiffuse");
+ kb->lt_specular_index = glGetUniformLocation(kb->shader_program,
+ "LtSpecular");
+ kb->lt_direction_index = glGetUniformLocation(kb->shader_program,
+ "LtDirection");
+ kb->lt_halfvect_index = glGetUniformLocation(kb->shader_program,
+ "LtHalfVector");
+ kb->front_ambient_index = glGetUniformLocation(kb->shader_program,
+ "MatFrontAmbient");
+ kb->back_ambient_index = glGetUniformLocation(kb->shader_program,
+ "MatBackAmbient");
+ kb->front_diffuse_index = glGetUniformLocation(kb->shader_program,
+ "MatFrontDiffuse");
+ kb->back_diffuse_index = glGetUniformLocation(kb->shader_program,
+ "MatBackDiffuse");
+ kb->specular_index = glGetUniformLocation(kb->shader_program,
+ "MatSpecular");
+ kb->shininess_index = glGetUniformLocation(kb->shader_program,
+ "MatShininess");
+ kb->texture_sampler_index = glGetUniformLocation(kb->shader_program,
+ "TextureSampler");
+ if (kb->mat_rot_index == -1 ||kb->mat_p_index == -1 ||
+ kb->bool_persp_index == -1 || kb->off4d_index == -1 ||
+ kb->off3d_index == -1 || kb->bool_textures_index == -1 ||
+ kb->bottle_type_index == -1 || kb->draw_lines_index == -1 ||
+ kb->glbl_ambient_index == -1 || kb->lt_ambient_index == -1 ||
+ kb->lt_diffuse_index == -1 || kb->lt_specular_index == -1 ||
+ kb->lt_direction_index == -1 || kb->lt_halfvect_index == -1 ||
+ kb->front_ambient_index == -1 || kb->back_ambient_index == -1 ||
+ kb->front_diffuse_index == -1 || kb->back_diffuse_index == -1 ||
+ kb->specular_index == -1 || kb->shininess_index == -1 ||
+ kb->texture_sampler_index == -1)
+ {
+ glDeleteProgram(kb->shader_program);
+ return;
+ }
+
+ glGenBuffers(1,&kb->vertex_uv_buffer);
+ glGenBuffers(1,&kb->vertex_t_buffer);
+ glGenBuffers(1,&kb->color_buffer);
+ glGenBuffers(1,&kb->indices_buffer);
+
+ kb->use_shaders = True;
+}
+
+#endif /* HAVE_GLSL */
+
+
static void init(ModeInfo *mi)
{
- static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
- static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
- static const GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
- static const GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
- static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
kleinstruct *kb = &klein[MI_SCREEN(mi)];
if (walk_speed == 0.0)
@@ -1920,78 +3102,16 @@ static void init(ModeInfo *mi)
else /* kb->bottle_type == KLEIN_BOTTLE_LAWSON */
setup_lawson(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
- if (marks)
- glEnable(GL_TEXTURE_2D);
- else
- glDisable(GL_TEXTURE_2D);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- if (kb->projection_3d == DISP_3D_PERSPECTIVE ||
- kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
- {
- if (kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
- gluPerspective(60.0,1.0,0.01,10.0);
- else
- gluPerspective(60.0,1.0,0.1,10.0);
- }
- else
- {
- glOrtho(-1.0,1.0,-1.0,1.0,0.1,10.0);
- }
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
+#ifdef HAVE_GLSL
+ init_glsl(mi);
+#endif /* HAVE_GLSL */
-# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
- if (kb->display_mode == DISP_WIREFRAME)
+#ifdef HAVE_ANDROID
+ /* glPolygonMode(...,GL_LINE) is not supported for an OpenGL ES 1.1
+ context. */
+ if (!kb->use_shaders && kb->display_mode == DISP_WIREFRAME)
kb->display_mode = DISP_SURFACE;
-# endif
-
- if (kb->display_mode == DISP_SURFACE)
- {
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LESS);
- glShadeModel(GL_SMOOTH);
- glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
- glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
- glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
- glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
- glLightfv(GL_LIGHT0,GL_POSITION,light_position);
- glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
- glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
- glDepthMask(GL_TRUE);
- glDisable(GL_BLEND);
- }
- else if (kb->display_mode == DISP_TRANSPARENT)
- {
- glDisable(GL_DEPTH_TEST);
- glShadeModel(GL_SMOOTH);
- glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
- glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
- glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
- glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
- glLightfv(GL_LIGHT0,GL_POSITION,light_position);
- glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
- glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
- glDepthMask(GL_FALSE);
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE);
- }
- else /* kb->display_mode == DISP_WIREFRAME */
- {
- glDisable(GL_DEPTH_TEST);
- glShadeModel(GL_FLAT);
- glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
- glDisable(GL_LIGHTING);
- glDisable(GL_LIGHT0);
- glDisable(GL_BLEND);
- }
+#endif /* HAVE_ANDROID */
}
@@ -2067,32 +3187,33 @@ static void display_klein(ModeInfo *mi)
}
}
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- if (kb->projection_3d == DISP_3D_PERSPECTIVE ||
- kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ if (kb->bottle_type == KLEIN_BOTTLE_FIGURE_8)
{
- if (kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
- gluPerspective(60.0,kb->aspect,0.01,10.0);
+#ifdef HAVE_GLSL
+ if (kb->use_shaders)
+ mi->polygon_count = figure8_pf(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
else
- gluPerspective(60.0,kb->aspect,0.1,10.0);
+#endif /* HAVE_GLSL */
+ mi->polygon_count = figure8_ff(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
}
- else
+ else if (kb->bottle_type == KLEIN_BOTTLE_PINCHED_TORUS)
{
- if (kb->aspect >= 1.0)
- glOrtho(-kb->aspect,kb->aspect,-1.0,1.0,0.1,10.0);
+#ifdef HAVE_GLSL
+ if (kb->use_shaders)
+ mi->polygon_count = pinched_torus_pf(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
else
- glOrtho(-1.0,1.0,-1.0/kb->aspect,1.0/kb->aspect,0.1,10.0);
+#endif /* HAVE_GLSL */
+ mi->polygon_count = pinched_torus_ff(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
}
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- if (kb->bottle_type == KLEIN_BOTTLE_FIGURE_8)
- mi->polygon_count = figure8(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
- else if (kb->bottle_type == KLEIN_BOTTLE_PINCHED_TORUS)
- mi->polygon_count = pinched_torus(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
else /* kb->bottle_type == KLEIN_BOTTLE_LAWSON */
- mi->polygon_count = lawson(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
+ {
+#ifdef HAVE_GLSL
+ if (kb->use_shaders)
+ mi->polygon_count = lawson_pf(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
+ else
+#endif /* HAVE_GLSL */
+ mi->polygon_count = lawson_ff(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
+ }
}
@@ -2371,7 +3492,6 @@ ENTRYPOINT void init_klein(ModeInfo *mi)
if ((kb->glx_context = init_GL(mi)) != NULL)
{
reshape_klein(mi,MI_WIDTH(mi),MI_HEIGHT(mi));
- glDrawBuffer(GL_BACK);
init(mi);
}
else
@@ -2401,6 +3521,8 @@ ENTRYPOINT void draw_klein(ModeInfo *mi)
glXMakeCurrent(display, window, *kb->glx_context);
+ glClearColor(0.0f,0.0f,0.0f,1.0f);
+ glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
@@ -2428,6 +3550,7 @@ ENTRYPOINT void change_klein(ModeInfo *mi)
}
#endif /* !STANDALONE */
+
ENTRYPOINT void free_klein(ModeInfo *mi)
{
kleinstruct *kb = &klein[MI_SCREEN(mi)];
@@ -2436,8 +3559,23 @@ ENTRYPOINT void free_klein(ModeInfo *mi)
gltrackball_free (kb->trackballs[0]);
gltrackball_free (kb->trackballs[1]);
if (kb->tex_name) glDeleteTextures (1, &kb->tex_name);
+#ifdef HAVE_GLSL
+ if (kb->use_shaders)
+ {
+ glDeleteBuffers(1,&kb->vertex_uv_buffer);
+ glDeleteBuffers(1,&kb->vertex_t_buffer);
+ glDeleteBuffers(1,&kb->color_buffer);
+ glDeleteBuffers(1,&kb->indices_buffer);
+ if (kb->shader_program != 0)
+ {
+ glUseProgram(0);
+ glDeleteProgram(kb->shader_program);
+ }
+ }
+#endif /* HAVE_GLSL */
}
+
XSCREENSAVER_MODULE ("Klein", klein)
#endif /* USE_GL */
diff --git a/hacks/glx/klein.man b/hacks/glx/klein.man
index 342c11f..a57cee6 100644
--- a/hacks/glx/klein.man
+++ b/hacks/glx/klein.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-klein - Draws a 4d Klein bottle.
+klein \- Draws a 4d Klein bottle.
.SH SYNOPSIS
.B klein
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/lament.c b/hacks/glx/lament.c
index 6af37c4..87e3575 100644
--- a/hacks/glx/lament.c
+++ b/hacks/glx/lament.c
@@ -41,8 +41,6 @@
/* #define DEBUG_MODE LAMENT_LEVIATHAN_COLLAPSE */
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#undef MAX
#define MAX(x, y) ((x) > (y) ? (x) : (y))
#undef MIN
diff --git a/hacks/glx/lament.man b/hacks/glx/lament.man
index 2077dd6..e288972 100644
--- a/hacks/glx/lament.man
+++ b/hacks/glx/lament.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "25-Jul-98" "X Version 11"
.SH NAME
-lament - animates the Lament Configuration
+lament \- animates the Lament Configuration
.SH SYNOPSIS
.B lament
[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
diff --git a/hacks/glx/lavalite.c b/hacks/glx/lavalite.c
index 8d484fe..825a389 100644
--- a/hacks/glx/lavalite.c
+++ b/hacks/glx/lavalite.c
@@ -10,8 +10,8 @@
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*
- * LAVA, LAVA LITE, LAVA WORLD INTERNATIONAL and the configuration of the
- * LAVA brand motion lamp are registered trademarks of Haggerty Enterprises,
+ * LAVA®, LAVA LITE®, LAVA WORLD INTERNATIONAL® and the configuration of the
+ * LAVA® brand motion lamp are registered trademarks of Haggerty Enterprises,
* Inc. The configuration of the globe and base of the motion lamp are
* registered trademarks of Haggerty Enterprises, Inc. in the U.S.A. and in
* other countries around the world.
@@ -79,9 +79,6 @@
#define CONVECTION 0.005 /* initial upward velocity (bell curve) */
#define TILT 0.00166666 /* horizontal velocity (bell curve) */
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#undef ABS
#define ABS(n) ((n)<0?-(n):(n))
#undef SIGNOF
diff --git a/hacks/glx/lavalite.man b/hacks/glx/lavalite.man
index 3d7aad5..080bea6 100644
--- a/hacks/glx/lavalite.man
+++ b/hacks/glx/lavalite.man
@@ -1,19 +1,6 @@
-.de EX \"Begin example
-.ne 5
-.if n .sp 1
-.if t .sp .5
-.nf
-.in +.5i
-..
-.de EE
-.fi
-.in -.5i
-.if n .sp 1
-.if t .sp .5
-..
.TH XScreenSaver 1 "18-May-2002" "X Version 11"
.SH NAME
-lavalite - 3D OpenGL simulation of a Lavalite.
+lavalite \- 3D OpenGL simulation of a Lavalite.
.SH SYNOPSIS
.B lavalite
[\-display \fIhost:display.screen\fP] [\-window] [\-root]
diff --git a/hacks/glx/lockward.c b/hacks/glx/lockward.c
index 2bd87e9..6c80afa 100644
--- a/hacks/glx/lockward.c
+++ b/hacks/glx/lockward.c
@@ -50,9 +50,6 @@
#define COLORIDX_SHF 4
#define SUBDIV 6
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
/***************************************************************************
* Structure definitions.
diff --git a/hacks/glx/lockward.man b/hacks/glx/lockward.man
index f55e5be..4308c0e 100644
--- a/hacks/glx/lockward.man
+++ b/hacks/glx/lockward.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-lockward - Rotating spinning color-cycling things
+lockward \- Rotating spinning color-cycling things
.SH SYNOPSIS
.B lockward
[\-display \fIdisplayspec\fP]
diff --git a/hacks/glx/marching.c b/hacks/glx/marching.c
index b3357dd..771f046 100644
--- a/hacks/glx/marching.c
+++ b/hacks/glx/marching.c
@@ -13,31 +13,14 @@
* http://astronomy.swin.edu.au/~pbourke/modelling/polygonise/
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include "screenhackI.h"
+#include "marching.h"
+#include "normals.h"
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
-#ifndef HAVE_JWXYZ
-# include <GL/gl.h>
-#endif
-
-#ifdef HAVE_ANDROID
-# include <GLES/gl.h>
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
-#include "marching.h"
-#include "normals.h"
-
-extern char *progname;
-
#undef ABS
#define ABS(x) ((x)<0?(-(x)):(x))
diff --git a/hacks/glx/maze3d.c b/hacks/glx/maze3d.c
index 362d5d2..d3d34fb 100755
--- a/hacks/glx/maze3d.c
+++ b/hacks/glx/maze3d.c
@@ -44,9 +44,6 @@
#define DEF_SHOW_OVERLAY "False"
#define DEF_DROP_ACID "False"
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#include "../images/gen/brick1_png.h"
#include "../images/gen/brick2_png.h"
#include "../images/gen/wood2_png.h"
diff --git a/hacks/glx/maze3d.man b/hacks/glx/maze3d.man
index c60fd65..9e833b0 100644
--- a/hacks/glx/maze3d.man
+++ b/hacks/glx/maze3d.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-maze3d - A 3D maze.
+maze3d \- A 3D maze.
.SH SYNOPSIS
.B maze3d
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/menger.c b/hacks/glx/menger.c
index 96582e3..a118400 100644
--- a/hacks/glx/menger.c
+++ b/hacks/glx/menger.c
@@ -57,8 +57,6 @@
# define release_sponge 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "colors.h"
@@ -147,13 +145,12 @@ reshape_sponge (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
diff --git a/hacks/glx/menger.man b/hacks/glx/menger.man
index c2c2141..7180ca1 100644
--- a/hacks/glx/menger.man
+++ b/hacks/glx/menger.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-menger - 3D menger gasket fractal.
+menger \- 3D menger gasket fractal.
.SH SYNOPSIS
.B menger
[\-display \fIhost:display.screen\fP]
@@ -17,7 +17,7 @@ menger - 3D menger gasket fractal.
[\-fps]
.SH DESCRIPTION
This draws the three-dimensional variant of the recursive Menger Gasket, a
-cube-based fractal object analagous to the Sierpinski Tetrahedron.
+cube-based fractal object analogous to the Sierpinski Tetrahedron.
.SH OPTIONS
.TP 8
.B \-visual \fIvisual\fP
diff --git a/hacks/glx/mirrorblob.c b/hacks/glx/mirrorblob.c
index 42981bd..4e754bb 100644
--- a/hacks/glx/mirrorblob.c
+++ b/hacks/glx/mirrorblob.c
@@ -73,21 +73,10 @@
#define DEF_FADE_TIME "5.0"
#define DEF_ZOOM "1.0"
-#ifdef HAVE_XMU
-# ifndef VMS
-# include <X11/Xmu/Drawing.h>
-#else /* VMS */
-# include <Xmu/Drawing.h>
-# endif /* VMS */
-#endif
-
#include "gltrackball.h"
#include "grab-ximage.h"
-#undef countof
-#define countof(x) (sizeof((x)) / sizeof((*x)))
-
-#define PI 3.1415926535897
+#define PI M_PI
/* Options from command line */
static GLfloat blend;
@@ -169,7 +158,7 @@ static OptionStruct desc[] =
{"-resolution", "Resolution of blob tesselation"},
{"-bumps", "Number of bumps used to disturb blob"},
{"-motion_blur", "Fade blob images (higher number = faster fade)"},
- {"-fade_time", "Number of frames to transistion to next image"},
+ {"-fade_time", "Number of frames to transition to next image"},
{"-hold_time", "Number of frames before next image"},
};
diff --git a/hacks/glx/mirrorblob.man b/hacks/glx/mirrorblob.man
index c61f7a6..88305b8 100644
--- a/hacks/glx/mirrorblob.man
+++ b/hacks/glx/mirrorblob.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-mirrorblob - Draws a wobbly blob that distorts the image behind it.
+mirrorblob \- Draws a wobbly blob that distorts the image behind it.
.SH SYNOPSIS
.B mirrorblob
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/moebius.c b/hacks/glx/moebius.c
index e3155ac..61d5afb 100644
--- a/hacks/glx/moebius.c
+++ b/hacks/glx/moebius.c
@@ -89,18 +89,6 @@ static const char sccsid[] = "@(#)moebius.c 5.01 2001/03/01 xlockmore";
# include "xlock.h" /* from the xlockmore distribution */
#endif /* !STANDALONE */
-#ifdef HAVE_JWXYZ
-# include "jwxyz.h"
-#else
-# include <X11/Xlib.h>
-# include <GL/gl.h>
-# include <GL/glu.h>
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
#ifdef MODE_moebius
#if 0 /* Hey, this never actually used the texture at all! */
@@ -741,6 +729,15 @@ draw_moebius (ModeInfo * mi)
glScalef (h, h, h);
}
}
+# else
+ /* Don't understand why this clause doesn't work on mobile, but it
+ doesn't. */
+ {
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
+ }
# endif
{
diff --git a/hacks/glx/moebius.man b/hacks/glx/moebius.man
index 696e0d6..e48c208 100644
--- a/hacks/glx/moebius.man
+++ b/hacks/glx/moebius.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-moebius - Escher's Moebuis Strip II, with ants.
+moebius \- Escher's Moebuis Strip II, with ants.
.SH SYNOPSIS
.B moebius
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/moebiusgears.c b/hacks/glx/moebiusgears.c
index fdcd4e0..ee5478e 100644
--- a/hacks/glx/moebiusgears.c
+++ b/hacks/glx/moebiusgears.c
@@ -16,8 +16,6 @@
"*suppressRotationAnimation: True\n" \
# define release_mgears 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "involute.h"
@@ -111,13 +109,12 @@ reshape_mgears (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
diff --git a/hacks/glx/moebiusgears.man b/hacks/glx/moebiusgears.man
index a45519a..650eb0e 100644
--- a/hacks/glx/moebiusgears.man
+++ b/hacks/glx/moebiusgears.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "30-Oct-99" "X Version 11"
.SH NAME
-moebiusgears - draw a moebius strip of interlocking gears.
+moebiusgears \- draw a moebius strip of interlocking gears.
.SH SYNOPSIS
.B moebiusgears
[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
diff --git a/hacks/glx/molecule.c b/hacks/glx/molecule.c
index 94d7dd3..c173c6b 100644
--- a/hacks/glx/molecule.c
+++ b/hacks/glx/molecule.c
@@ -27,15 +27,13 @@
#define DEFAULTS "*delay: 10000 \n" \
"*showFPS: False \n" \
"*wireframe: False \n" \
- "*atomFont: -*-helvetica-medium-r-normal-*-*-240-*-*-*-*-*-*\n" \
- "*titleFont: -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n" \
+ "*atomFont: sans-serif 24\n" \
+ "*titleFont: sans-serif 18\n" \
"*noLabelThreshold: 150 \n" \
"*wireframeThreshold: 150 \n" \
"*suppressRotationAnimation: True\n" \
# define release_molecule 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "colors.h"
@@ -702,10 +700,7 @@ parse_pdb_data (molecule *m, const char *data, const char *filename, int line)
{
char *name = calloc (1, 100);
char *n2 = name;
- int L = strlen(s);
- if (L > 99) L = 99;
-
- strncpy (n2, s, L);
+ sprintf (n2, "%.99s", s);
n2 += 7;
while (isspace(*n2)) n2++;
@@ -1212,13 +1207,12 @@ reshape_molecule (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
@@ -1243,9 +1237,11 @@ startup_blurb (ModeInfo *mi)
{
molecule_configuration *mc = &mcs[MI_SCREEN(mi)];
const char *s = "Constructing molecules...";
+#ifndef HAVE_ANDROID /* Doesn't work -- causes whole scene to be black */
print_texture_label (mi->dpy, mc->title_font,
mi->xgwa.width, mi->xgwa.height,
0, s);
+#endif
glFinish();
glXSwapBuffers(MI_DISPLAY(mi), MI_WINDOW(mi));
}
@@ -1346,6 +1342,10 @@ init_molecule (ModeInfo *mi)
mc->trackball = gltrackball_init (True);
}
+#ifdef HAVE_ANDROID /* Doesn't work -- not transparent */
+ do_shells = False;
+#endif
+
orig_do_labels = do_labels;
orig_do_atoms = do_atoms;
orig_do_bonds = do_bonds;
@@ -1447,7 +1447,9 @@ draw_labels (ModeInfo *mi)
s *= 0.8; /* Shrink a bit */
glScalef (s, s, 1);
glTranslatef (-w/2, -h/2, 0);
+#ifndef HAVE_ANDROID /* Doesn't work -- causes whole scene to be black */
print_texture_string (mc->atom_font, a->label);
+#endif
}
glPopMatrix();
@@ -1647,9 +1649,11 @@ draw_molecule (ModeInfo *mi)
if (do_titles && m->label && *m->label)
{
set_atom_color (mi, 0, True, 1);
+#ifndef HAVE_ANDROID /* Doesn't work -- causes whole scene to be black */
print_texture_label (mi->dpy, mc->title_font,
mi->xgwa.width, mi->xgwa.height,
1, m->label);
+#endif
}
}
glPopMatrix();
diff --git a/hacks/glx/molecule.man b/hacks/glx/molecule.man
index 6ec8328..c1ca34c 100644
--- a/hacks/glx/molecule.man
+++ b/hacks/glx/molecule.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "13-Mar-01" "X Version 11"
.SH NAME
-molecule - draws 3D molecular structures
+molecule \- draws 3D molecular structures
.SH SYNOPSIS
.B molecule
[\-display \fIhost:display.screen\fP] [\-window] [\-root]
diff --git a/hacks/glx/morph3d.c b/hacks/glx/morph3d.c
index 0f37223..0cfddbb 100644
--- a/hacks/glx/morph3d.c
+++ b/hacks/glx/morph3d.c
@@ -774,14 +774,12 @@ draw_morph3d(ModeInfo * mi)
glScalef(Scale4Iconic * mp->WindH / mp->WindW, Scale4Iconic, Scale4Iconic);
}
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, h, 1);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glRotatef(mp->step * 100, 1, 0, 0);
glRotatef(mp->step * 95, 0, 1, 0);
diff --git a/hacks/glx/morph3d.man b/hacks/glx/morph3d.man
index 21af78c..44c757b 100644
--- a/hacks/glx/morph3d.man
+++ b/hacks/glx/morph3d.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-morph3d - 3d morphing objects.
+morph3d \- 3d morphing objects.
.SH SYNOPSIS
.B morph3d
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/noof.man b/hacks/glx/noof.man
index f414571..a13b4d0 100644
--- a/hacks/glx/noof.man
+++ b/hacks/glx/noof.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-noof - draw rotatey patterns
+noof \- draw rotatey patterns
.SH SYNOPSIS
.B dangerball
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/normals.c b/hacks/glx/normals.c
index 16b9040..a72f8ce 100644
--- a/hacks/glx/normals.c
+++ b/hacks/glx/normals.c
@@ -11,10 +11,7 @@
* Compute normal vectors for arbitrary triangles.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
+#include "screenhackI.h"
#include "normals.h"
/* Calculate the unit normal at p given two other points p1,p2 on the
diff --git a/hacks/glx/normals.h b/hacks/glx/normals.h
index 2200dfe..09197a9 100644
--- a/hacks/glx/normals.h
+++ b/hacks/glx/normals.h
@@ -1,4 +1,4 @@
-/* normals, Copyright (c) 2002-2012 Jamie Zawinski <jwz@jwz.org>
+/* normals, Copyright (c) 2002-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -14,22 +14,6 @@
#ifndef __NORMALS_H__
#define __NORMALS_H__
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
-
-#ifndef HAVE_JWXYZ
-# include <GL/gl.h>
-#endif
-
-#ifdef HAVE_ANDROID
-# include <GLES/gl.h>
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
typedef struct {
double x,y,z;
} XYZ;
diff --git a/hacks/glx/peepers.c b/hacks/glx/peepers.c
index 3dc8fc1..1554616 100644
--- a/hacks/glx/peepers.c
+++ b/hacks/glx/peepers.c
@@ -27,9 +27,6 @@
#define DEF_SPEED "1.0"
#define DEF_MODE "random"
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#undef BELLRAND
#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
#undef RANDSIGN
@@ -233,10 +230,10 @@ reset_floater (ModeInfo *mi, floater *f)
p += c[i].pct;
p = frand(p);
- for (i = 0; i < countof(c); i++)
+ for (i = 0; i < countof(c) - 1; i++)
{
- if (t > p) break;
t += c[i].pct;
+ if (t > p) break;
}
if (c[i].c == 0xFFAA88) f->jaundice = 2;
diff --git a/hacks/glx/peepers.man b/hacks/glx/peepers.man
index d30c883..9efe310 100644
--- a/hacks/glx/peepers.man
+++ b/hacks/glx/peepers.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-peepers - floating eyeballs.
+peepers \- floating eyeballs.
.SH SYNOPSIS
.B peepers
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/photopile.c b/hacks/glx/photopile.c
index 01d18d6..78e34b5 100644
--- a/hacks/glx/photopile.c
+++ b/hacks/glx/photopile.c
@@ -11,13 +11,8 @@
* implied warranty.
*/
-#if defined(HAVE_COCOA) || defined(HAVE_ANDROID)
-# define DEF_FONT "OCR A Std 48, Lucida Console 48, Monaco 48"
-#elif 0 /* real X11, XQueryFont() */
-# define DEF_FONT "-*-helvetica-bold-r-normal-*-*-480-*-*-*-*-*-*"
-#else /* real X11, load_font_retry() */
-# define DEF_FONT "-*-ocr a std-medium-r-*-*-*-480-*-*-m-*-*-*"
-#endif
+#define DEF_FONT \
+ "OCR A Std 18, Lucida Console 18, Monaco 18, Courier 18, monospace 18"
#define DEFAULTS "*count: 7 \n" \
"*delay: 10000 \n" \
@@ -34,9 +29,6 @@
# define release_photopile 0
# define photopile_handle_event xlockmore_no_events
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#ifndef HAVE_JWXYZ
# include <X11/Intrinsic.h> /* for XrmDatabase in -debug mode */
#endif
@@ -49,7 +41,7 @@
#ifdef USE_GL
-# define DEF_SCALE "0.4"
+# define DEF_IMG_SCALE "0.4"
# define DEF_MAX_TILT "50"
# define DEF_SPEED "1.0"
# define DEF_DURATION "5"
@@ -122,7 +114,8 @@ static Bool debug_p; /* Be loud and do weird things. */
static XrmOptionDescRec opts[] = {
- {"-scale", ".scale", XrmoptionSepArg, 0 },
+ /* Xft uses 'scale' */
+ {"-scale", ".imgScale", XrmoptionSepArg, 0 },
{"-maxTilt", ".maxTilt", XrmoptionSepArg, 0 },
{"-speed", ".speed", XrmoptionSepArg, 0 },
{"-duration", ".duration", XrmoptionSepArg, 0 },
@@ -141,7 +134,7 @@ static XrmOptionDescRec opts[] = {
};
static argtype vars[] = {
- { &scale, "scale", "Scale", DEF_SCALE, t_Float},
+ { &scale, "imgScale", "Scale", DEF_IMG_SCALE, t_Float},
{ &max_tilt, "maxTilt", "MaxTilt", DEF_MAX_TILT, t_Float},
{ &speed, "speed", "Speed", DEF_SPEED, t_Float},
{ &duration, "duration", "Duration", DEF_DURATION, t_Int},
@@ -447,6 +440,15 @@ reshape_photopile (ModeInfo *mi, int width, int height)
if (o != 0 && o != 180 && o != -180)
glScalef (1/h, h, 1);
}
+# else
+ {
+ /* Don't understand why this clause doesn't work on mobile, but it
+ doesn't. */
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
+ }
# endif
glClear(GL_COLOR_BUFFER_BIT);
@@ -702,7 +704,9 @@ draw_image (ModeInfo *mi, int i, GLfloat t, GLfloat s, GLfloat z)
glEnable (GL_TEXTURE_2D);
glEnable (GL_BLEND);
glDisable (GL_DEPTH_TEST);
+# ifndef HAVE_ANDROID /* Doesn't work -- photo displays as static */
print_texture_string (ss->texfont, title);
+# endif
glEnable (GL_DEPTH_TEST);
}
else
diff --git a/hacks/glx/photopile.man b/hacks/glx/photopile.man
index c3dc601..e58d0df 100644
--- a/hacks/glx/photopile.man
+++ b/hacks/glx/photopile.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-photopile - displays multiple images in a periodically shuffled pile
+photopile \- displays multiple images in a periodically shuffled pile
.SH SYNOPSIS
.B photopile
[\-display \fIhost:display.screen\fP]
@@ -28,7 +28,7 @@ This program requires a good video card capable of supporting large
textures.
To specify the directory that images are loaded from, run
-.BR xscreensaver-demo (1)
+.BR xscreensaver\-settings (1)
and click on the "Advanced" tab.
.SH OPTIONS
.TP 8
@@ -93,8 +93,8 @@ to get the name of a resource file that overrides the global resources
stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
-.BR xscreensaver-demo (1)
-.BR xscreensaver-getimage (1)
+.BR xscreensaver\-settings (1)
+.BR xscreensaver\-getimage (MANSUFFIX)
.BR xscreensaver (1)
.BR carousel (MANSUFFIX)
.BR glslideshow (MANSUFFIX)
diff --git a/hacks/glx/pinion.c b/hacks/glx/pinion.c
index 956a444..343600f 100644
--- a/hacks/glx/pinion.c
+++ b/hacks/glx/pinion.c
@@ -12,13 +12,11 @@
#define DEFAULTS "*delay: 15000 \n" \
"*showFPS: False \n" \
"*wireframe: False \n" \
- "*titleFont: -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n" \
- "*titleFont2: -*-helvetica-medium-r-normal-*-*-120-*-*-*-*-*-*\n" \
- "*titleFont3: -*-helvetica-medium-r-normal-*-*-80-*-*-*-*-*-*\n" \
+ "*titleFont: sans-serif 18\n" \
+ "*titleFont2: sans-serif 12\n" \
+ "*titleFont3: sans-serif 8\n" \
# define release_pinion 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#undef BELLRAND
#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
@@ -907,7 +905,7 @@ push_gear (ModeInfo *mi)
fprintf (stderr, " %3.0f rpm;", g->rpm);
{
- char buf1[50], buf2[50], buf3[100];
+ char buf1[50], buf2[50], buf3[200];
*buf1 = 0; *buf2 = 0; *buf3 = 0;
if (pp->debug_size_failures)
sprintf (buf1, "%3d sz", pp->debug_size_failures);
diff --git a/hacks/glx/pinion.man b/hacks/glx/pinion.man
index 3ae6eff..bada8f4 100644
--- a/hacks/glx/pinion.man
+++ b/hacks/glx/pinion.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "30-Oct-99" "X Version 11"
.SH NAME
-pinion - draws a scrolling sequence of interconnected gears
+pinion \- draws a scrolling sequence of interconnected gears
.SH SYNOPSIS
.B pinion
[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
diff --git a/hacks/glx/pipeobjs.c b/hacks/glx/pipeobjs.c
index 8874a04..a283007 100644
--- a/hacks/glx/pipeobjs.c
+++ b/hacks/glx/pipeobjs.c
@@ -9,7 +9,9 @@ static const char sccsid[] = "@(#)pipeobjs.c 4.04 97/07/28 xlockmore";
*/
#ifndef STANDALONE
-#include "xlock.h"
+# include "xlock.h"
+#else
+# include "screenhackI.h"
#endif
#ifdef USE_GL
diff --git a/hacks/glx/pipes.c b/hacks/glx/pipes.c
index 0112f93..1a69164 100644
--- a/hacks/glx/pipes.c
+++ b/hacks/glx/pipes.c
@@ -76,18 +76,6 @@ static const char sccsid[] = "@(#)pipes.c 4.07 97/11/24 xlockmore";
#ifdef USE_GL
-#ifdef HAVE_JWXYZ
-# include "jwxyz.h"
-#else
-# include <X11/Xlib.h>
-# include <GL/gl.h>
-# include <GL/glu.h>
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
#include "sphere.h"
#include "buildlwo.h"
#include "teapot.h"
diff --git a/hacks/glx/pipes.man b/hacks/glx/pipes.man
index b58a511..f367c74 100644
--- a/hacks/glx/pipes.man
+++ b/hacks/glx/pipes.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-pipes - fill the screen with a plumbing system.
+pipes \- fill the screen with a plumbing system.
.SH SYNOPSIS
.B pipes
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/polyhedra-gl.c b/hacks/glx/polyhedra-gl.c
index 00f6bd4..d433d7a 100644
--- a/hacks/glx/polyhedra-gl.c
+++ b/hacks/glx/polyhedra-gl.c
@@ -18,37 +18,15 @@
#define DEFAULTS "*delay: 30000 \n" \
"*showFPS: False \n" \
"*wireframe: False \n" \
- "*titleFont: -*-helvetica-medium-r-normal-*-*-140-*-*-*-*-*-*\n" \
- "*titleFont2: -*-helvetica-medium-r-normal-*-*-100-*-*-*-*-*-*\n" \
- "*titleFont3: -*-helvetica-medium-r-normal-*-*-80-*-*-*-*-*-*\n" \
- "*suppressRotationAnimation: True\n" \
+ "*titleFont: sans-serif 14\n" \
+ "*titleFont2: sans-serif 10\n" \
+ "*titleFont3: sans-serif 8\n" \
+ "*suppressRotationAnimation: True\n" \
# define release_polyhedra 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
-
-#ifdef HAVE_JWXYZ
-# include "jwxyz.h"
-#else
-# include <X11/Xlib.h>
-# include <GL/gl.h>
-# include <GL/glu.h>
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
-#define DEF_SPIN "True"
-#define DEF_WANDER "True"
-#define DEF_SPEED "1.0"
-#define DEF_TITLES "True"
-#define DEF_DURATION "12"
-#define DEF_WHICH "random"
-
#include "texfont.h"
#include "normals.h"
#include "polyhedra.h"
@@ -57,6 +35,13 @@
#include "gltrackball.h"
#include "teapot.h"
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_SPEED "1.0"
+#define DEF_TITLES "True"
+#define DEF_DURATION "12"
+#define DEF_WHICH "random"
+
#ifndef HAVE_JWXYZ
# define XK_MISCELLANY
# include <X11/keysymdef.h>
@@ -625,14 +610,12 @@ draw_polyhedra (ModeInfo *mi)
glPushMatrix ();
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glScalef(1.1, 1.1, 1.1);
diff --git a/hacks/glx/polyhedra.man b/hacks/glx/polyhedra.man
index b4e1cca..a8bfed8 100644
--- a/hacks/glx/polyhedra.man
+++ b/hacks/glx/polyhedra.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-polyhedra - draws the 80 uniform polyhedra and their duals
+polyhedra \- draws the 80 uniform polyhedra and their duals
.SH SYNOPSIS
.SH SYNOPSIS
.B polyhedra
diff --git a/hacks/glx/polytopes.c b/hacks/glx/polytopes.c
index 333fcde..0c03583 100644
--- a/hacks/glx/polytopes.c
+++ b/hacks/glx/polytopes.c
@@ -3150,6 +3150,8 @@ ENTRYPOINT void draw_polytopes(ModeInfo *mi)
}
+ glClearColor(0.0f,0.0f,0.0f,1.0f);
+ glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
diff --git a/hacks/glx/polytopes.man b/hacks/glx/polytopes.man
index 45fcb4a..2016828 100644
--- a/hacks/glx/polytopes.man
+++ b/hacks/glx/polytopes.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-polytopes - Draws one of the six regular 4d polytopes rotating in 4d.
+polytopes \- Draws one of the six regular 4d polytopes rotating in 4d.
.SH SYNOPSIS
.B polytopes
[\-display \fIhost:display.screen\fP]
@@ -45,7 +45,7 @@ polytope in its unrotated position. In the first case, the polytope
is drawn in red. This coloring combined with transparency gives a
nice visual effect of the structure of the polytope. The second mode
draws the polytope with a fully saturated color wheel in which the
-edges or faces are colored accoring to their average 4d "depth". This
+edges or faces are colored according to their average 4d "depth". This
mode is best combined with the wireframe mode, where it allows you to
see how different parts of the polytope are moved to the "inside" of
the projected polytope in 3d. Of course, in 4d the cells, faces, and
@@ -126,7 +126,7 @@ Display the polytope in red.
.TP 8
.B \-depth-colors
Display the polytope with a fully saturated color wheel in which the
-edges or faces are colored accoring to their average 4d "depth", i.e.,
+edges or faces are colored according to their average 4d "depth", i.e.,
the w coordinate of the polytope in its unrotated position (default).
.PP
The following two options are mutually exclusive. They determine how
diff --git a/hacks/glx/projectiveplane.c b/hacks/glx/projectiveplane.c
index 5f42d60..1220772 100644
--- a/hacks/glx/projectiveplane.c
+++ b/hacks/glx/projectiveplane.c
@@ -2,10 +2,10 @@
that rotates in 4d or on which you can walk */
#if 0
-static const char sccsid[] = "@(#)projectiveplane.c 1.1 03/01/14 xlockmore";
+static const char sccsid[] = "@(#)projectiveplane.c 1.1 14/01/03 xlockmore";
#endif
-/* Copyright (c) 2013-2020 Carsten Steger <carsten@mirsanmir.org>. */
+/* Copyright (c) 2013-2021 Carsten Steger <carsten@mirsanmir.org>. */
/*
* Permission to use, copy, modify, and distribute this software and its
@@ -21,9 +21,12 @@ static const char sccsid[] = "@(#)projectiveplane.c 1.1 03/01/14 xlockmore";
* other special, indirect and consequential damages.
*
* REVISION HISTORY:
- * C. Steger - 03/01/14: Initial version
- * C. Steger - 03/10/14: Moved the curlicue texture to curlicue.h
- * C. Steger - 06/01/20: Added the changing colors mode.
+ * C. Steger - 14/01/03: Initial version
+ * C. Steger - 14/10/03: Moved the curlicue texture to curlicue.h
+ * C. Steger - 20/01/06: Added the changing colors mode
+ * C. Steger - 20/12/05: Added per-fragment shading
+ * C. Steger - 20/12/06: Moved all GLSL support code into glsl-utils.[hc]
+ * C. Steger - 20/12/30: Make the shader code work under macOS and iOS
*/
/*
@@ -225,9 +228,11 @@ static const char sccsid[] = "@(#)projectiveplane.c 1.1 03/01/14 xlockmore";
#define DEF_WALK_DIRECTION "83.0"
#define DEF_WALK_SPEED "20.0"
+
#ifdef STANDALONE
-# define DEFAULTS "*delay: 10000 \n" \
+# define DEFAULTS "*delay: 25000 \n" \
"*showFPS: False \n" \
+ "*prefersGLSL: True \n" \
# define release_projectiveplane 0
# include "xlockmore.h" /* from the xscreensaver distribution */
@@ -241,6 +246,7 @@ static const char sccsid[] = "@(#)projectiveplane.c 1.1 03/01/14 xlockmore";
# include <X11/keysym.h>
#endif
+#include "glsl-utils.h"
#include "gltrackball.h"
#include <float.h>
@@ -355,6 +361,13 @@ ENTRYPOINT ModeSpecOpt projectiveplane_opts =
#define NUMB 8
+#if !defined(__GNUC__) && !defined(__extension__)
+ /* don't warn about "string length is greater than the length ISO C89
+ compilers are required to support" in these string constants... */
+# define __extension__ /**/
+#endif
+
+
typedef struct {
GLint WindH, WindW;
GLXContext *glx_context;
@@ -398,11 +411,220 @@ typedef struct {
Bool button_pressed;
/* A random factor to modify the rotation speeds */
float speed_scale;
+#ifdef HAVE_GLSL
+ GLfloat uv[(NUMU+1)*(NUMV+1)][2];
+ GLuint indices[4*(NUMU+1)*(NUMV+1)];
+ Bool use_shaders, buffers_initialized;
+ GLuint shader_program;
+ GLint vertex_uv_index, vertex_t_index, color_index;
+ GLint mat_rot_index, mat_p_index, bool_persp_index;
+ GLint off4d_index, off3d_index;
+ GLint bool_textures_index, draw_lines_index;
+ GLint glbl_ambient_index, lt_ambient_index;
+ GLint lt_diffuse_index, lt_specular_index;
+ GLint lt_direction_index, lt_halfvect_index;
+ GLint front_ambient_index, back_ambient_index;
+ GLint front_diffuse_index, back_diffuse_index;
+ GLint specular_index, shininess_index;
+ GLint texture_sampler_index;
+ GLuint vertex_uv_buffer, vertex_t_buffer;
+ GLuint color_buffer, indices_buffer;
+ GLint ni, ne, nt;
+#endif /* HAVE_GLSL */
} projectiveplanestruct;
static projectiveplanestruct *projectiveplane = (projectiveplanestruct *) NULL;
+#ifdef HAVE_GLSL
+
+/* The GLSL versions that correspond to different versions of OpenGL. */
+static const GLchar *shader_version_2_1 =
+ "#version 120\n";
+static const GLchar *shader_version_3_0 =
+ "#version 130\n";
+static const GLchar *shader_version_3_0_es =
+ "#version 300 es\n"
+ "precision highp float;\n"
+ "precision highp int;\n";
+
+/* The vertex shader code is composed of code fragments that depend on
+ the OpenGL version and code fragments that are version-independent.
+ They are concatenated by glsl_CompileAndLinkShaders in the function
+ init_glsl(). */
+static const GLchar *vertex_shader_attribs_2_1 =
+ "attribute vec2 VertexUV;\n"
+ "attribute vec4 VertexT;\n"
+ "attribute vec4 VertexColor;\n"
+ "\n"
+ "varying vec3 Normal;\n"
+ "varying vec4 Color;\n"
+ "varying vec4 TexCoord;\n"
+ "\n";
+static const GLchar *vertex_shader_attribs_3_0 =
+ "in vec2 VertexUV;\n"
+ "in vec4 VertexT;\n"
+ "in vec4 VertexColor;\n"
+ "\n"
+ "out vec3 Normal;\n"
+ "out vec4 Color;\n"
+ "out vec4 TexCoord;\n"
+ "\n";
+static const GLchar *vertex_shader_main =
+ __extension__
+ "uniform mat4 MatRot4D;\n"
+ "uniform mat4 MatProj;\n"
+ "uniform bool BoolPersp;\n"
+ "uniform vec4 Offset4D;\n"
+ "uniform vec4 Offset3D;\n"
+ "uniform bool BoolTextures;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " const float EPSILON = 1.0e-7f;\n"
+ " float u, v, su, cu, s2u, c2u, sv2, cv2, sv4, cv4;\n"
+ " vec3 p, pu, pv;\n"
+ " u = VertexUV.x;\n"
+ " v = VertexUV.y;\n"
+ " su = sin(u)\n;"
+ " cu = cos(u)\n;"
+ " s2u = sin(2.0f*u)\n;"
+ " c2u = cos(2.0f*u)\n;"
+ " sv2 = sin(0.5f*v)\n;"
+ " cv2 = cos(0.5f*v)\n;"
+ " sv4 = sin(0.25f*v)\n;"
+ " cv4 = cos(0.25f*v)\n;"
+ " vec4 xx = vec4(0.5f*s2u*sv4*sv4,\n"
+ " 0.5f*su*sv2,\n"
+ " 0.5f*cu*sv2,\n"
+ " 0.5f*(su*su*sv4*sv4-cv4*cv4));\n"
+ " if (v < EPSILON)\n"
+ " {\n"
+ " v = EPSILON;\n"
+ " sv2 = sin(0.5f*v)\n;"
+ " cv2 = cos(0.5f*v)\n;"
+ " sv4 = sin(0.25f*v)\n;"
+ " }\n"
+ " vec4 xxu = vec4(c2u*sv4*sv4,\n"
+ " 0.5f*cu*sv2,\n"
+ " -0.5f*su*sv2,\n"
+ " 0.5f*s2u*sv4*sv4);\n"
+ " vec4 xxv = vec4(0.125f*s2u*sv2,\n"
+ " 0.25f*su*cv2,\n"
+ " 0.25f*cu*cv2,\n"
+ " 0.125f*(su*su+1.0f)*sv2);\n"
+ " vec4 x = MatRot4D*xx+Offset4D;\n"
+ " vec4 xu = MatRot4D*xxu;\n"
+ " vec4 xv = MatRot4D*xxv;\n"
+ " if (BoolPersp)\n"
+ " {\n"
+ " vec3 r = x.xyz;\n"
+ " float s = x.w;\n"
+ " float t = s*s;\n"
+ " p = r/s+Offset3D.xyz;\n"
+ " pu = (s*xu.xyz-r*xu.w)/t;\n"
+ " pv = (s*xv.xyz-r*xv.w)/t;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " p = x.xyz+Offset3D.xyz;\n"
+ " pu = xu.xyz;\n"
+ " pv = xv.xyz;\n"
+ " }\n"
+ " vec4 Position = vec4(p,1.0);\n"
+ " Normal = normalize(cross(pu,pv));\n"
+ " gl_Position = MatProj*Position;\n"
+ " Color = VertexColor;\n"
+ " if (BoolTextures)\n"
+ " TexCoord = VertexT;\n"
+ "}\n";
+
+/* The fragment shader code is composed of code fragments that depend on
+ the OpenGL version and code fragments that are version-independent.
+ They are concatenated by glsl_CompileAndLinkShaders in the function
+ init_glsl(). */
+static const GLchar *fragment_shader_attribs_2_1 =
+ "varying vec3 Normal;\n"
+ "varying vec4 Color;\n"
+ "varying vec4 TexCoord;\n"
+ "\n";
+static const GLchar *fragment_shader_attribs_3_0 =
+ "in vec3 Normal;\n"
+ "in vec4 Color;\n"
+ "in vec4 TexCoord;\n"
+ "\n"
+ "out vec4 FragColor;\n"
+ "\n";
+static const GLchar *fragment_shader_main =
+ __extension__
+ "uniform bool DrawLines;\n"
+ "uniform vec4 LtGlblAmbient;\n"
+ "uniform vec4 LtAmbient, LtDiffuse, LtSpecular;\n"
+ "uniform vec3 LtDirection, LtHalfVector;\n"
+ "uniform vec4 MatFrontAmbient, MatBackAmbient;\n"
+ "uniform vec4 MatFrontDiffuse, MatBackDiffuse;\n"
+ "uniform vec4 MatSpecular;\n"
+ "uniform float MatShininess;\n"
+ "uniform bool BoolTextures;\n"
+ "uniform sampler2D TextureSampler;"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " vec4 color;\n"
+ " if (DrawLines)\n"
+ " {\n"
+ " color = Color;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " vec3 normalDirection;\n"
+ " vec4 ambientColor, diffuseColor, sceneColor;\n"
+ " vec4 ambientLighting, diffuseReflection, specularReflection;\n"
+ " float ndotl, ndoth, pf;\n"
+ " \n"
+ " if (gl_FrontFacing)\n"
+ " {\n"
+ " normalDirection = normalize(Normal);\n"
+ " sceneColor = Color*MatFrontAmbient*LtGlblAmbient;\n"
+ " ambientColor = Color*MatFrontAmbient;\n"
+ " diffuseColor = Color*MatFrontDiffuse;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " normalDirection = -normalize(Normal);\n"
+ " sceneColor = Color*MatBackAmbient*LtGlblAmbient;\n"
+ " ambientColor = Color*MatBackAmbient;\n"
+ " diffuseColor = Color*MatBackDiffuse;\n"
+ " }\n"
+ " \n"
+ " ndotl = max(0.0,dot(normalDirection,LtDirection));\n"
+ " ndoth = max(0.0,dot(normalDirection,LtHalfVector));\n"
+ " if (ndotl == 0.0)\n"
+ " pf = 0.0;\n"
+ " else\n"
+ " pf = pow(ndoth,MatShininess);\n"
+ " ambientLighting = ambientColor*LtAmbient;\n"
+ " diffuseReflection = LtDiffuse*diffuseColor*ndotl;\n"
+ " specularReflection = LtSpecular*MatSpecular*pf;\n"
+ " color = sceneColor+ambientLighting+diffuseReflection;\n";
+static const GLchar *fragment_shader_out_2_1 =
+ " if (BoolTextures)\n"
+ " color *= texture2D(TextureSampler,TexCoord.st);"
+ " color += specularReflection;\n"
+ " }\n"
+ " gl_FragColor = clamp(color,0.0,1.0);\n"
+ "}\n";
+static const GLchar *fragment_shader_out_3_0 =
+ " if (BoolTextures)\n"
+ " color *= texture(TextureSampler,TexCoord.st);"
+ " color += specularReflection;\n"
+ " }\n"
+ " FragColor = clamp(color,0.0,1.0);\n"
+ "}\n";
+
+#endif /* HAVE_GLSL */
+
+
/* Add a rotation around the wx-plane to the matrix m. */
static void rotatewx(float m[4][4], float phi)
{
@@ -771,13 +993,13 @@ static void setup_projective_plane(ModeInfo *mi, double umin, double umax,
else
u = ur*j/NUMU+umin;
v = vr*i/NUMV+vmin;
- cu = cos(u);
su = sin(u);
- c2u = cos(2.0*u);
+ cu = cos(u);
s2u = sin(2.0*u);
+ c2u = cos(2.0*u);
sv2 = sin(0.5*v);
- cv4 = cos(0.25*v);
sv4 = sin(0.25*v);
+ cv4 = cos(0.25*v);
w = 0.5*(su*su*sv4*sv4-cv4*cv4);
if (!pp->change_colors)
{
@@ -800,8 +1022,8 @@ static void setup_projective_plane(ModeInfo *mi, double umin, double umax,
/* Avoid degenerate tangential plane basis vectors. */
if (v < FLT_EPSILON)
v = FLT_EPSILON;
- cv2 = cos(0.5*v);
sv2 = sin(0.5*v);
+ cv2 = cos(0.5*v);
sv4 = sin(0.25*v);
pp->xu[k][0] = c2u*sv4*sv4;
pp->xu[k][1] = 0.5*cu*sv2;
@@ -816,11 +1038,161 @@ static void setup_projective_plane(ModeInfo *mi, double umin, double umax,
}
-/* Draw a 4d embedding of the projective plane projected into 3D. */
-static int projective_plane(ModeInfo *mi, double umin, double umax,
- double vmin, double vmax)
+/* Compute the current walk frame, i.e., the coordinate system of the
+ point and direction at which the viewer is currently walking on the
+ projective plane. */
+static void compute_walk_frame(projectiveplanestruct *pp, float mat[4][4])
+{
+ int l, m;
+ double u, v;
+ double q, r, s, t;
+ double cu, su, cv2, sv2, cv4, sv4, c2u, s2u;
+ float p[3], pu[3], pv[3], pm[3], n[3], b[3];
+ double xx[4], xxu[4], xxv[4], y[4], yu[4], yv[4];
+
+ /* Compute the rotation that rotates the projective plane in 4D without
+ the trackball rotations. */
+ rotateall4d(pp->zeta,pp->eta,pp->theta,mat);
+
+ u = pp->umove;
+ v = pp->vmove;
+ su = sin(u);
+ cu = cos(u);
+ s2u = sin(2.0*u);
+ c2u = cos(2.0*u);
+ sv2 = sin(0.5*v);
+ sv4 = sin(0.25*v);
+ cv4 = cos(0.25*v);
+ xx[0] = 0.5*s2u*sv4*sv4;
+ xx[1] = 0.5*su*sv2;
+ xx[2] = 0.5*cu*sv2;
+ xx[3] = 0.5*(su*su*sv4*sv4-cv4*cv4);
+ /* Avoid degenerate tangential plane basis vectors. */
+ if (v < FLT_EPSILON)
+ v = FLT_EPSILON;
+ sv2 = sin(0.5*v);
+ cv2 = cos(0.5*v);
+ sv4 = sin(0.25*v);
+ xxu[0] = c2u*sv4*sv4;
+ xxu[1] = 0.5*cu*sv2;
+ xxu[2] = -0.5*su*sv2;
+ xxu[3] = 0.5*s2u*sv4*sv4;
+ xxv[0] = 0.125*s2u*sv2;
+ xxv[1] = 0.25*su*cv2;
+ xxv[2] = 0.25*cu*cv2;
+ xxv[3] = 0.125*(su*su+1.0)*sv2;
+ for (l=0; l<4; l++)
+ {
+ y[l] = (mat[l][0]*xx[0]+mat[l][1]*xx[1]+
+ mat[l][2]*xx[2]+mat[l][3]*xx[3]);
+ yu[l] = (mat[l][0]*xxu[0]+mat[l][1]*xxu[1]+
+ mat[l][2]*xxu[2]+mat[l][3]*xxu[3]);
+ yv[l] = (mat[l][0]*xxv[0]+mat[l][1]*xxv[1]+
+ mat[l][2]*xxv[2]+mat[l][3]*xxv[3]);
+ }
+ if (pp->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ {
+ p[l] = y[l]+pp->offset4d[l];
+ pu[l] = yu[l];
+ pv[l] = yv[l];
+ }
+ }
+ else
+ {
+ s = y[3]+pp->offset4d[3];
+ q = 1.0/s;
+ t = q*q;
+ for (l=0; l<3; l++)
+ {
+ r = y[l]+pp->offset4d[l];
+ p[l] = r*q;
+ pu[l] = (yu[l]*s-r*yu[3])*t;
+ pv[l] = (yv[l]*s-r*yv[3])*t;
+ }
+ }
+ n[0] = pu[1]*pv[2]-pu[2]*pv[1];
+ n[1] = pu[2]*pv[0]-pu[0]*pv[2];
+ n[2] = pu[0]*pv[1]-pu[1]*pv[0];
+ t = 1.0/(pp->side*4.0*sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]));
+ n[0] *= t;
+ n[1] *= t;
+ n[2] *= t;
+ pm[0] = pu[0]*pp->dumove+pv[0]*pp->dvmove;
+ pm[1] = pu[1]*pp->dumove+pv[1]*pp->dvmove;
+ pm[2] = pu[2]*pp->dumove+pv[2]*pp->dvmove;
+ t = 1.0/(4.0*sqrt(pm[0]*pm[0]+pm[1]*pm[1]+pm[2]*pm[2]));
+ pm[0] *= t;
+ pm[1] *= t;
+ pm[2] *= t;
+ b[0] = n[1]*pm[2]-n[2]*pm[1];
+ b[1] = n[2]*pm[0]-n[0]*pm[2];
+ b[2] = n[0]*pm[1]-n[1]*pm[0];
+ t = 1.0/(4.0*sqrt(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]));
+ b[0] *= t;
+ b[1] *= t;
+ b[2] *= t;
+
+ /* Compute alpha, beta, delta from the three basis vectors.
+ | -b[0] -b[1] -b[2] |
+ m = | n[0] n[1] n[2] |
+ | -pm[0] -pm[1] -pm[2] |
+ */
+ pp->alpha = atan2(-n[2],-pm[2])*180/M_PI;
+ pp->beta = atan2(-b[2],sqrt(b[0]*b[0]+b[1]*b[1]))*180/M_PI;
+ pp->delta = atan2(b[1],-b[0])*180/M_PI;
+
+ /* Compute the rotation that rotates the projective plane in 4D. */
+ rotateall(pp->alpha,pp->beta,pp->delta,pp->zeta,pp->eta,pp->theta,mat);
+
+ u = pp->umove;
+ v = pp->vmove;
+ su = sin(u);
+ cu = cos(u);
+ s2u = sin(2.0*u);
+ sv2 = sin(0.5*v);
+ sv4 = sin(0.25*v);
+ cv4 = cos(0.25*v);
+ xx[0] = 0.5*s2u*sv4*sv4;
+ xx[1] = 0.5*su*sv2;
+ xx[2] = 0.5*cu*sv2;
+ xx[3] = 0.5*(su*su*sv4*sv4-cv4*cv4);
+ for (l=0; l<4; l++)
+ {
+ r = 0.0;
+ for (m=0; m<4; m++)
+ r += mat[l][m]*xx[m];
+ y[l] = r;
+ }
+ if (pp->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ p[l] = y[l]+pp->offset4d[l];
+ }
+ else
+ {
+ s = y[3]+pp->offset4d[3];
+ for (l=0; l<3; l++)
+ p[l] = (y[l]+pp->offset4d[l])/s;
+ }
+
+ pp->offset3d[0] = -p[0];
+ pp->offset3d[1] = -p[1]-DELTAY;
+ pp->offset3d[2] = -p[2];
+}
+
+
+/* Draw a 4d embedding of the projective plane projected into 3D using
+ OpenGL's fixed functionality. */
+static int projective_plane_ff(ModeInfo *mi, double umin, double umax,
+ double vmin, double vmax)
{
- int polys = 0;
+ static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+ static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
+ static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
static const GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
static const GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
static const GLfloat mat_diff_oneside[] = { 0.9, 0.4, 0.3, 1.0 };
@@ -828,150 +1200,105 @@ static int projective_plane(ModeInfo *mi, double umin, double umax,
static const GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 };
static const GLfloat mat_diff_trans_oneside[] = { 0.9, 0.4, 0.3, 0.7 };
float mat_diff_dyn[4], mat_diff_dyn_compl[4];
- float p[3], pu[3], pv[3], pm[3], n[3], b[3], mat[4][4], matc[3][3];
+ float pu[3], pv[3], mat[4][4], matc[3][3];
int i, j, k, l, m, o;
double u, v, ur, vr;
- double xx[4], xxu[4], xxv[4], y[4], yu[4], yv[4];
+ double y[4], yu[4], yv[4];
double q, r, s, t;
- double cu, su, cv2, sv2, cv4, sv4, c2u, s2u;
float q1[4], q2[4], r1[4][4], r2[4][4];
projectiveplanestruct *pp = &projectiveplane[MI_SCREEN(mi)];
+ int polys;
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ if (pp->projection_3d == DISP_3D_PERSPECTIVE ||
+ pp->view == VIEW_WALK || pp->view == VIEW_WALKTURN)
+ {
+ if (pp->view == VIEW_WALK || pp->view == VIEW_WALKTURN)
+ gluPerspective(60.0,pp->aspect,0.01,10.0);
+ else
+ gluPerspective(60.0,pp->aspect,0.1,10.0);
+ }
+ else
+ {
+ if (pp->aspect >= 1.0)
+ glOrtho(-0.6*pp->aspect,0.6*pp->aspect,-0.6,0.6,0.1,10.0);
+ else
+ glOrtho(-0.6,0.6,-0.6/pp->aspect,0.6/pp->aspect,0.1,10.0);
+ }
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ if (pp->display_mode == DISP_SURFACE)
+ {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glDepthMask(GL_TRUE);
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+ glDisable(GL_BLEND);
+ }
+ else if (pp->display_mode == DISP_TRANSPARENT)
+ {
+ glDisable(GL_DEPTH_TEST);
+ glDepthMask(GL_FALSE);
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ }
+ else /* pp->display_mode == DISP_WIREFRAME */
+ {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glDepthMask(GL_TRUE);
+ glShadeModel(GL_FLAT);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_LIGHT0);
+ glDisable(GL_BLEND);
+ }
+
+ if (pp->marks)
+ {
+ glEnable(GL_TEXTURE_2D);
+#ifndef HAVE_JWZGLES
+ glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SEPARATE_SPECULAR_COLOR);
+#endif
+ }
+ else
+ {
+ glDisable(GL_TEXTURE_2D);
+#ifndef HAVE_JWZGLES
+ glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SINGLE_COLOR);
+#endif
+ }
if (pp->change_colors)
rotateall3d(pp->rho,pp->sigma,pp->tau,matc);
if (pp->view == VIEW_WALK || pp->view == VIEW_WALKTURN)
{
- /* Compute the rotation that rotates the projective plane in 4D without
- the trackball rotations. */
- rotateall4d(pp->zeta,pp->eta,pp->theta,mat);
-
- u = pp->umove;
- v = pp->vmove;
- cu = cos(u);
- su = sin(u);
- c2u = cos(2.0*u);
- s2u = sin(2.0*u);
- sv2 = sin(0.5*v);
- cv4 = cos(0.25*v);
- sv4 = sin(0.25*v);
- xx[0] = 0.5*s2u*sv4*sv4;
- xx[1] = 0.5*su*sv2;
- xx[2] = 0.5*cu*sv2;
- xx[3] = 0.5*(su*su*sv4*sv4-cv4*cv4);
- /* Avoid degenerate tangential plane basis vectors. */
- if (v < FLT_EPSILON)
- v = FLT_EPSILON;
- cv2 = cos(0.5*v);
- sv2 = sin(0.5*v);
- sv4 = sin(0.25*v);
- xxu[0] = c2u*sv4*sv4;
- xxu[1] = 0.5*cu*sv2;
- xxu[2] = -0.5*su*sv2;
- xxu[3] = 0.5*s2u*sv4*sv4;
- xxv[0] = 0.125*s2u*sv2;
- xxv[1] = 0.25*su*cv2;
- xxv[2] = 0.25*cu*cv2;
- xxv[3] = 0.125*(su*su+1.0)*sv2;
- for (l=0; l<4; l++)
- {
- y[l] = (mat[l][0]*xx[0]+mat[l][1]*xx[1]+
- mat[l][2]*xx[2]+mat[l][3]*xx[3]);
- yu[l] = (mat[l][0]*xxu[0]+mat[l][1]*xxu[1]+
- mat[l][2]*xxu[2]+mat[l][3]*xxu[3]);
- yv[l] = (mat[l][0]*xxv[0]+mat[l][1]*xxv[1]+
- mat[l][2]*xxv[2]+mat[l][3]*xxv[3]);
- }
- if (pp->projection_4d == DISP_4D_ORTHOGRAPHIC)
- {
- for (l=0; l<3; l++)
- {
- p[l] = y[l]+pp->offset4d[l];
- pu[l] = yu[l];
- pv[l] = yv[l];
- }
- }
- else
- {
- s = y[3]+pp->offset4d[3];
- q = 1.0/s;
- t = q*q;
- for (l=0; l<3; l++)
- {
- r = y[l]+pp->offset4d[l];
- p[l] = r*q;
- pu[l] = (yu[l]*s-r*yu[3])*t;
- pv[l] = (yv[l]*s-r*yv[3])*t;
- }
- }
- n[0] = pu[1]*pv[2]-pu[2]*pv[1];
- n[1] = pu[2]*pv[0]-pu[0]*pv[2];
- n[2] = pu[0]*pv[1]-pu[1]*pv[0];
- t = 1.0/(pp->side*4.0*sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]));
- n[0] *= t;
- n[1] *= t;
- n[2] *= t;
- pm[0] = pu[0]*pp->dumove+pv[0]*pp->dvmove;
- pm[1] = pu[1]*pp->dumove+pv[1]*pp->dvmove;
- pm[2] = pu[2]*pp->dumove+pv[2]*pp->dvmove;
- t = 1.0/(4.0*sqrt(pm[0]*pm[0]+pm[1]*pm[1]+pm[2]*pm[2]));
- pm[0] *= t;
- pm[1] *= t;
- pm[2] *= t;
- b[0] = n[1]*pm[2]-n[2]*pm[1];
- b[1] = n[2]*pm[0]-n[0]*pm[2];
- b[2] = n[0]*pm[1]-n[1]*pm[0];
- t = 1.0/(4.0*sqrt(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]));
- b[0] *= t;
- b[1] *= t;
- b[2] *= t;
-
- /* Compute alpha, beta, delta from the three basis vectors.
- | -b[0] -b[1] -b[2] |
- m = | n[0] n[1] n[2] |
- | -pm[0] -pm[1] -pm[2] |
- */
- pp->alpha = atan2(-n[2],-pm[2])*180/M_PI;
- pp->beta = atan2(-b[2],sqrt(b[0]*b[0]+b[1]*b[1]))*180/M_PI;
- pp->delta = atan2(b[1],-b[0])*180/M_PI;
-
- /* Compute the rotation that rotates the projective plane in 4D. */
- rotateall(pp->alpha,pp->beta,pp->delta,pp->zeta,pp->eta,pp->theta,mat);
-
- u = pp->umove;
- v = pp->vmove;
- cu = cos(u);
- su = sin(u);
- s2u = sin(2.0*u);
- sv2 = sin(0.5*v);
- cv4 = cos(0.25*v);
- sv4 = sin(0.25*v);
- xx[0] = 0.5*s2u*sv4*sv4;
- xx[1] = 0.5*su*sv2;
- xx[2] = 0.5*cu*sv2;
- xx[3] = 0.5*(su*su*sv4*sv4-cv4*cv4);
- for (l=0; l<4; l++)
- {
- r = 0.0;
- for (m=0; m<4; m++)
- r += mat[l][m]*xx[m];
- y[l] = r;
- }
- if (pp->projection_4d == DISP_4D_ORTHOGRAPHIC)
- {
- for (l=0; l<3; l++)
- p[l] = y[l]+pp->offset4d[l];
- }
- else
- {
- s = y[3]+pp->offset4d[3];
- for (l=0; l<3; l++)
- p[l] = (y[l]+pp->offset4d[l])/s;
- }
-
- pp->offset3d[0] = -p[0];
- pp->offset3d[1] = -p[1]-DELTAY;
- pp->offset3d[2] = -p[2];
+ /* Compute the walk frame. */
+ compute_walk_frame(pp,mat);
}
else
{
@@ -1103,7 +1430,7 @@ static int projective_plane(ModeInfo *mi, double umin, double umax,
{
for (k=0; k<=1; k++)
{
- l = (i+k);
+ l = i+k;
m = j;
o = l*(NUMU+1)+m;
glNormal3fv(pp->pn[o]);
@@ -1131,7 +1458,6 @@ static int projective_plane(ModeInfo *mi, double umin, double umax,
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,pp->col[o]);
}
glVertex3fv(pp->pp[o]);
- polys++;
}
}
glEnd();
@@ -1152,7 +1478,7 @@ static int projective_plane(ModeInfo *mi, double umin, double umax,
for (k=0; k<=1; k++)
{
l = i;
- m = (j+k);
+ m = j+k;
o = l*(NUMU+1)+m;
glNormal3fv(pp->pn[o]);
glTexCoord2fv(pp->tex[o]);
@@ -1179,26 +1505,505 @@ static int projective_plane(ModeInfo *mi, double umin, double umax,
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,pp->col[o]);
}
glVertex3fv(pp->pp[o]);
- polys++;
}
}
glEnd();
}
}
- polys /= 2;
+ polys = 2*NUMU*NUMV;
+ if (pp->appearance != APPEARANCE_SOLID)
+ polys /= 2;
+ return polys;
+}
+
+
+#ifdef HAVE_GLSL
+
+/* Draw a 4d embedding of the projective plane projected into 3D using
+ OpenGL's programmable functionality. */
+static int projective_plane_pf(ModeInfo *mi, double umin, double umax,
+ double vmin, double vmax)
+{
+ static const GLfloat light_model_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
+ static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+ static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
+ static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_oneside[] = { 0.9, 0.4, 0.3, 1.0 };
+ static const GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.7 };
+ static const GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 };
+ static const GLfloat mat_diff_trans_oneside[] = { 0.9, 0.4, 0.3, 0.7 };
+ static const GLfloat mat_diff_white[] = { 1.0, 1.0, 1.0, 1.0 };
+ GLfloat light_direction[3], half_vector[3], len;
+ GLfloat p_mat[16];
+ float mat_diff_dyn[4], mat_diff_dyn_compl[4];
+ float mat[4][4], matc[3][3];
+ int i, j, k, l, m, o;
+ double u, v, ur, vr;
+ float q1[4], q2[4], r1[4][4], r2[4][4];
+ GLsizeiptr index_offset;
+ projectiveplanestruct *pp = &projectiveplane[MI_SCREEN(mi)];
+ int polys;
+
+ if (!pp->use_shaders)
+ return 0;
+
+ if (!pp->buffers_initialized)
+ {
+ /* The u and v values need to be computed once (or each time the value
+ of appearance changes, once we support that). */
+ ur = umax-umin;
+ vr = vmax-vmin;
+ for (i=0; i<=NUMV; i++)
+ {
+ for (j=0; j<=NUMU; j++)
+ {
+ o = i*(NUMU+1)+j;
+ if (pp->appearance != APPEARANCE_DIRECTION_BANDS)
+ u = -ur*j/NUMU+umin;
+ else
+ u = ur*j/NUMU+umin;
+ v = vr*i/NUMV+vmin;
+ pp->uv[o][0] = u;
+ pp->uv[o][1] = v;
+ }
+ }
+ glBindBuffer(GL_ARRAY_BUFFER,pp->vertex_uv_buffer);
+ glBufferData(GL_ARRAY_BUFFER,2*(NUMU+1)*(NUMV+1)*sizeof(GLfloat),
+ pp->uv,GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+
+ glBindBuffer(GL_ARRAY_BUFFER,pp->vertex_t_buffer);
+ glBufferData(GL_ARRAY_BUFFER,2*(NUMU+1)*(NUMV+1)*sizeof(GLfloat),
+ pp->tex,GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+
+ if (!pp->change_colors &&
+ pp->colors != COLORS_ONESIDED && pp->colors != COLORS_TWOSIDED)
+ {
+ glBindBuffer(GL_ARRAY_BUFFER,pp->color_buffer);
+ glBufferData(GL_ARRAY_BUFFER,4*(NUMU+1)*(NUMV+1)*sizeof(GLfloat),
+ pp->col,GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+ }
+
+ /* The indices only need to be computed once (or each time the value of
+ appearance changes, once we support that). */
+ pp->ni = 0;
+ pp->ne = 0;
+ pp->nt = 0;
+ if (pp->display_mode != DISP_WIREFRAME)
+ {
+ if (pp->appearance != APPEARANCE_DIRECTION_BANDS)
+ {
+ for (i=0; i<NUMV; i++)
+ {
+ if (pp->appearance == APPEARANCE_DISTANCE_BANDS &&
+ ((i & (NUMB-1)) >= NUMB/4) && ((i & (NUMB-1)) < 3*NUMB/4))
+ continue;
+ for (j=0; j<=NUMU; j++)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = i+k;
+ m = j;
+ o = l*(NUMU+1)+m;
+ pp->indices[pp->ni++] = o;
+ }
+ }
+ pp->ne++;
+ }
+ pp->nt = 2*(NUMU+1);
+ }
+ else /* pp->appearance == APPEARANCE_DIRECTION_BANDS */
+ {
+ for (j=0; j<NUMU; j++)
+ {
+ if ((j & (NUMB-1)) >= NUMB/2)
+ continue;
+ for (i=0; i<=NUMV; i++)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = i;
+ m = j+k;
+ o = l*(NUMU+1)+m;
+ pp->indices[pp->ni++] = o;
+ }
+ }
+ pp->ne++;
+ }
+ pp->nt = 2*(NUMV+1);
+ }
+ }
+ else /* pp->display_mode == DISP_WIREFRAME */
+ {
+ if (pp->appearance != APPEARANCE_DIRECTION_BANDS)
+ {
+ for (i=0; i<=NUMV; i++)
+ {
+ if (pp->appearance == APPEARANCE_DISTANCE_BANDS &&
+ ((i & (NUMB-1)) > NUMB/4) && ((i & (NUMB-1)) < 3*NUMB/4))
+ continue;
+ if (pp->appearance == APPEARANCE_DISTANCE_BANDS &&
+ ((i & (NUMB-1)) == NUMB/4))
+ {
+ for (j=0; j<NUMU; j++)
+ {
+ pp->indices[pp->ni++] = i*(NUMU+1)+j;
+ pp->indices[pp->ni++] = i*(NUMU+1)+j+1;
+ }
+ continue;
+ }
+ for (j=0; j<NUMU; j++)
+ {
+ pp->indices[pp->ni++] = i*(NUMU+1)+j;
+ pp->indices[pp->ni++] = i*(NUMU+1)+j+1;
+ if (i < NUMV)
+ {
+ pp->indices[pp->ni++] = i*(NUMU+1)+j;
+ pp->indices[pp->ni++] = (i+1)*(NUMU+1)+j;
+ }
+ }
+ }
+ }
+ else /* pp->appearance == APPEARANCE_DIRECTION_BANDS */
+ {
+ for (j=0; j<NUMU; j++)
+ {
+ if ((j & (NUMB-1)) > NUMB/2)
+ continue;
+ if ((j & (NUMB-1)) == NUMB/2)
+ {
+ for (i=0; i<NUMV; i++)
+ {
+ pp->indices[pp->ni++] = i*(NUMU+1)+j;
+ pp->indices[pp->ni++] = (i+1)*(NUMU+1)+j;
+ }
+ continue;
+ }
+ for (i=0; i<=NUMV; i++)
+ {
+ pp->indices[pp->ni++] = i*(NUMU+1)+j;
+ pp->indices[pp->ni++] = i*(NUMU+1)+j+1;
+ if (i < NUMV)
+ {
+ pp->indices[pp->ni++] = i*(NUMU+1)+j;
+ pp->indices[pp->ni++] = (i+1)*(NUMU+1)+j;
+ }
+ }
+ }
+ }
+ pp->ne = 1;
+ }
+
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,pp->indices_buffer);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER,pp->ni*sizeof(GLuint),
+ pp->indices,GL_STATIC_DRAW);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
+
+ pp->buffers_initialized = True;
+ }
+
+ if (pp->change_colors)
+ rotateall3d(pp->rho,pp->sigma,pp->tau,matc);
+
+ if (pp->view == VIEW_WALK || pp->view == VIEW_WALKTURN)
+ {
+ /* Compute the walk frame. */
+ compute_walk_frame(pp,mat);
+ }
+ else
+ {
+ /* Compute the rotation that rotates the projective plane in 4D,
+ including the trackball rotations. */
+ rotateall(pp->alpha,pp->beta,pp->delta,pp->zeta,pp->eta,pp->theta,r1);
+
+ gltrackball_get_quaternion(pp->trackballs[0],q1);
+ gltrackball_get_quaternion(pp->trackballs[1],q2);
+ quats_to_rotmat(q1,q2,r2);
+
+ mult_rotmat(r2,r1,mat);
+ }
+
+ if (pp->change_colors &&
+ (pp->colors == COLORS_DEPTH || pp->colors == COLORS_DIRECTION ||
+ pp->colors == COLORS_DISTANCE))
+ {
+ ur = umax-umin;
+ vr = vmax-vmin;
+ for (i=0; i<=NUMV; i++)
+ {
+ for (j=0; j<=NUMU; j++)
+ {
+ o = i*(NUMU+1)+j;
+ if (pp->colors == COLORS_DEPTH)
+ {
+ color(pp,(2.0*pp->x[o][3]+1.0)*M_PI*2.0/3.0,matc,pp->col[o]);
+ }
+ else if (pp->colors == COLORS_DIRECTION)
+ {
+ u = -ur*j/NUMU+umin;
+ color(pp,2.0*M_PI+fmod(2.0*u,2.0*M_PI),matc,pp->col[o]);
+ }
+ else if (pp->colors == COLORS_DISTANCE)
+ {
+ v = vr*i/NUMV+vmin;
+ color(pp,v*(5.0/6.0),matc,pp->col[o]);
+ }
+ }
+ }
+ }
+
+ glUseProgram(pp->shader_program);
+
+ glsl_Identity(p_mat);
+ if (pp->projection_3d == DISP_3D_PERSPECTIVE ||
+ pp->view == VIEW_WALK || pp->view == VIEW_WALKTURN)
+ {
+ if (pp->view == VIEW_WALK || pp->view == VIEW_WALKTURN)
+ glsl_Perspective(p_mat,60.0f,pp->aspect,0.01f,10.0f);
+ else
+ glsl_Perspective(p_mat,60.0f,pp->aspect,0.1f,10.0f);
+ }
+ else
+ {
+ if (pp->aspect >= 1.0)
+ glsl_Orthographic(p_mat,-0.6f*pp->aspect,0.6f*pp->aspect,-0.6f,0.6f,
+ 0.1f,10.0f);
+ else
+ glsl_Orthographic(p_mat,-0.6f,0.6f,-0.6f/pp->aspect,0.6f/pp->aspect,
+ 0.1f,10.0f);
+ }
+ glUniformMatrix4fv(pp->mat_rot_index,1,GL_TRUE,(GLfloat *)mat);
+ glUniformMatrix4fv(pp->mat_p_index,1,GL_FALSE,p_mat);
+ glUniform1i(pp->bool_persp_index,pp->projection_4d == DISP_4D_PERSPECTIVE);
+ glUniform4fv(pp->off4d_index,1,pp->offset4d);
+ glUniform4fv(pp->off3d_index,1,pp->offset3d);
+
+ len = sqrtf(light_position[0]*light_position[0]+
+ light_position[1]*light_position[1]+
+ light_position[2]*light_position[2]);
+ light_direction[0] = light_position[0]/len;
+ light_direction[1] = light_position[1]/len;
+ light_direction[2] = light_position[2]/len;
+ half_vector[0] = light_direction[0];
+ half_vector[1] = light_direction[1];
+ half_vector[2] = light_direction[2]+1.0f;
+ len = sqrtf(half_vector[0]*half_vector[0]+
+ half_vector[1]*half_vector[1]+
+ half_vector[2]*half_vector[2]);
+ half_vector[0] /= len;
+ half_vector[1] /= len;
+ half_vector[2] /= len;
+
+ if (pp->display_mode == DISP_SURFACE)
+ {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glDepthMask(GL_TRUE);
+ glDisable(GL_BLEND);
+ glUniform4fv(pp->glbl_ambient_index,1,light_model_ambient);
+ glUniform4fv(pp->lt_ambient_index,1,light_ambient);
+ glUniform4fv(pp->lt_diffuse_index,1,light_diffuse);
+ glUniform4fv(pp->lt_specular_index,1,light_specular);
+ glUniform3fv(pp->lt_direction_index,1,light_direction);
+ glUniform3fv(pp->lt_halfvect_index,1,half_vector);
+ glUniform4fv(pp->specular_index,1,mat_specular);
+ glUniform1f(pp->shininess_index,50.0f);
+ glUniform1i(pp->draw_lines_index,GL_FALSE);
+ }
+ else if (pp->display_mode == DISP_TRANSPARENT)
+ {
+ glDisable(GL_DEPTH_TEST);
+ glDepthMask(GL_FALSE);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ glUniform4fv(pp->glbl_ambient_index,1,light_model_ambient);
+ glUniform4fv(pp->lt_ambient_index,1,light_ambient);
+ glUniform4fv(pp->lt_diffuse_index,1,light_diffuse);
+ glUniform4fv(pp->lt_specular_index,1,light_specular);
+ glUniform3fv(pp->lt_direction_index,1,light_direction);
+ glUniform3fv(pp->lt_halfvect_index,1,half_vector);
+ glUniform4fv(pp->specular_index,1,mat_specular);
+ glUniform1f(pp->shininess_index,50.0f);
+ glUniform1i(pp->draw_lines_index,GL_FALSE);
+ }
+ else /* pp->display_mode == DISP_WIREFRAME */
+ {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glDepthMask(GL_TRUE);
+ glDisable(GL_BLEND);
+ glUniform1i(pp->draw_lines_index,GL_TRUE);
+ }
+
+ if (pp->marks)
+ glEnable(GL_TEXTURE_2D);
+ else
+ glDisable(GL_TEXTURE_2D);
+
+ glUniform4fv(pp->front_ambient_index,1,mat_diff_white);
+ glUniform4fv(pp->front_diffuse_index,1,mat_diff_white);
+ glUniform4fv(pp->back_ambient_index,1,mat_diff_white);
+ glUniform4fv(pp->back_diffuse_index,1,mat_diff_white);
+ glVertexAttrib4f(pp->color_index,1.0f,1.0f,1.0f,1.0f);
+ if (!pp->change_colors)
+ {
+ if (pp->colors == COLORS_ONESIDED)
+ {
+ if (pp->display_mode == DISP_TRANSPARENT)
+ {
+ glUniform4fv(pp->front_ambient_index,1,mat_diff_trans_oneside);
+ glUniform4fv(pp->front_diffuse_index,1,mat_diff_trans_oneside);
+ glUniform4fv(pp->back_ambient_index,1,mat_diff_trans_oneside);
+ glUniform4fv(pp->back_diffuse_index,1,mat_diff_trans_oneside);
+ }
+ else if (pp->display_mode == DISP_SURFACE)
+ {
+ glUniform4fv(pp->front_ambient_index,1,mat_diff_oneside);
+ glUniform4fv(pp->front_diffuse_index,1,mat_diff_oneside);
+ glUniform4fv(pp->back_ambient_index,1,mat_diff_oneside);
+ glUniform4fv(pp->back_diffuse_index,1,mat_diff_oneside);
+ }
+ else /* pp->display_mode == DISP_WIREFRAME */
+ {
+ glVertexAttrib4fv(pp->color_index,mat_diff_oneside);
+ }
+ }
+ else if (pp->colors == COLORS_TWOSIDED)
+ {
+ if (pp->display_mode == DISP_TRANSPARENT)
+ {
+ glUniform4fv(pp->front_ambient_index,1,mat_diff_trans_red);
+ glUniform4fv(pp->front_diffuse_index,1,mat_diff_trans_red);
+ glUniform4fv(pp->back_ambient_index,1,mat_diff_trans_green);
+ glUniform4fv(pp->back_diffuse_index,1,mat_diff_trans_green);
+ }
+ else if (pp->display_mode == DISP_SURFACE)
+ {
+ glUniform4fv(pp->front_ambient_index,1,mat_diff_red);
+ glUniform4fv(pp->front_diffuse_index,1,mat_diff_red);
+ glUniform4fv(pp->back_ambient_index,1,mat_diff_green);
+ glUniform4fv(pp->back_diffuse_index,1,mat_diff_green);
+ }
+ else /* pp->display_mode == DISP_WIREFRAME */
+ {
+ glVertexAttrib4fv(pp->color_index,mat_diff_red);
+ }
+ }
+ }
+ else /* pp->change_colors */
+ {
+ color(pp,0.0,matc,mat_diff_dyn);
+ if (pp->colors == COLORS_ONESIDED)
+ {
+ if (pp->display_mode == DISP_TRANSPARENT ||
+ pp->display_mode == DISP_SURFACE)
+ {
+ glUniform4fv(pp->front_ambient_index,1,mat_diff_dyn);
+ glUniform4fv(pp->front_diffuse_index,1,mat_diff_dyn);
+ glUniform4fv(pp->back_ambient_index,1,mat_diff_dyn);
+ glUniform4fv(pp->back_diffuse_index,1,mat_diff_dyn);
+ }
+ else /* pp->display_mode == DISP_WIREFRAME */
+ {
+ glVertexAttrib4fv(pp->color_index,mat_diff_dyn);
+ }
+ }
+ else if (pp->colors == COLORS_TWOSIDED)
+ {
+ if (pp->display_mode == DISP_TRANSPARENT ||
+ pp->display_mode == DISP_SURFACE)
+ {
+ mat_diff_dyn_compl[0] = 1.0f-mat_diff_dyn[0];
+ mat_diff_dyn_compl[1] = 1.0f-mat_diff_dyn[1];
+ mat_diff_dyn_compl[2] = 1.0f-mat_diff_dyn[2];
+ mat_diff_dyn_compl[3] = mat_diff_dyn[3];
+ glUniform4fv(pp->front_ambient_index,1,mat_diff_dyn);
+ glUniform4fv(pp->front_diffuse_index,1,mat_diff_dyn);
+ glUniform4fv(pp->back_ambient_index,1,mat_diff_dyn_compl);
+ glUniform4fv(pp->back_diffuse_index,1,mat_diff_dyn_compl);
+ }
+ else /* pp->display_mode == DISP_WIREFRAME */
+ {
+ glVertexAttrib4fv(pp->color_index,mat_diff_dyn);
+ }
+ }
+ }
+
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D,pp->tex_name);
+ glUniform1i(pp->texture_sampler_index,0);
+ glUniform1i(pp->bool_textures_index,pp->marks);
+
+ glEnableVertexAttribArray(pp->vertex_uv_index);
+ glBindBuffer(GL_ARRAY_BUFFER,pp->vertex_uv_buffer);
+ glVertexAttribPointer(pp->vertex_uv_index,2,GL_FLOAT,GL_FALSE,0,0);
+
+ glEnableVertexAttribArray(pp->vertex_t_index);
+ glBindBuffer(GL_ARRAY_BUFFER,pp->vertex_t_buffer);
+ glVertexAttribPointer(pp->vertex_t_index,2,GL_FLOAT,GL_FALSE,0,0);
+
+ if (pp->colors != COLORS_ONESIDED && pp->colors != COLORS_TWOSIDED)
+ {
+ glEnableVertexAttribArray(pp->color_index);
+ glBindBuffer(GL_ARRAY_BUFFER,pp->color_buffer);
+ if (pp->change_colors)
+ glBufferData(GL_ARRAY_BUFFER,4*(NUMU+1)*(NUMV+1)*sizeof(GLfloat),
+ pp->col,GL_STREAM_DRAW);
+ glVertexAttribPointer(pp->color_index,4,GL_FLOAT,GL_FALSE,0,0);
+ }
+
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,pp->indices_buffer);
+
+ if (pp->display_mode != DISP_WIREFRAME)
+ {
+ for (i=0; i<pp->ne; i++)
+ {
+ index_offset = pp->nt*i*sizeof(GLuint);
+ glDrawElements(GL_TRIANGLE_STRIP,pp->nt,GL_UNSIGNED_INT,
+ (const GLvoid *)index_offset);
+ }
+ }
+ else /* pp->display_mode == DISP_WIREFRAME */
+ {
+ glLineWidth(1.0f);
+ index_offset = 0;
+ glDrawElements(GL_LINES,pp->ni,GL_UNSIGNED_INT,
+ (const void *)index_offset);
+ }
+
+ glDisableVertexAttribArray(pp->vertex_uv_index);
+ glDisableVertexAttribArray(pp->vertex_t_index);
+ if (pp->colors != COLORS_ONESIDED && pp->colors != COLORS_TWOSIDED)
+ glDisableVertexAttribArray(pp->color_index);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
+
+ glUseProgram(0);
+
+ polys = 2*NUMU*NUMV;
+ if (pp->appearance != APPEARANCE_SOLID)
+ polys /= 2;
return polys;
}
+#endif /* HAVE_GLSL */
+
/* Generate a texture image that shows the orientation reversal. */
static void gen_texture(ModeInfo *mi)
{
projectiveplanestruct *pp = &projectiveplane[MI_SCREEN(mi)];
+ glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glGenTextures(1,&pp->tex_name);
glBindTexture(GL_TEXTURE_2D,pp->tex_name);
- glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
@@ -1209,13 +2014,150 @@ static void gen_texture(ModeInfo *mi)
}
+#ifdef HAVE_GLSL
+
+static void init_glsl(ModeInfo *mi)
+{
+ projectiveplanestruct *pp = &projectiveplane[MI_SCREEN(mi)];
+ GLint gl_major, gl_minor, glsl_major, glsl_minor;
+ GLboolean gl_gles3;
+ const GLchar *vertex_shader_source[3];
+ const GLchar *fragment_shader_source[4];
+
+ /* Determine whether to use shaders to render the projective plane. */
+ pp->use_shaders = False;
+ pp->buffers_initialized = False;
+ pp->shader_program = 0;
+ pp->ni = 0;
+ pp->ne = 0;
+ pp->nt = 0;
+
+ if (!glsl_GetGlAndGlslVersions(&gl_major,&gl_minor,&glsl_major,&glsl_minor,
+ &gl_gles3))
+ return;
+ if (!gl_gles3)
+ {
+ if (gl_major < 3 ||
+ (glsl_major < 1 || (glsl_major == 1 && glsl_minor < 30)))
+ {
+ if ((gl_major < 2 || (gl_major == 2 && gl_minor < 1)) ||
+ (glsl_major < 1 || (glsl_major == 1 && glsl_minor < 20)))
+ return;
+ /* We have at least OpenGL 2.1 and at least GLSL 1.20. */
+ vertex_shader_source[0] = shader_version_2_1;
+ vertex_shader_source[1] = vertex_shader_attribs_2_1;
+ vertex_shader_source[2] = vertex_shader_main;
+ fragment_shader_source[0] = shader_version_2_1;
+ fragment_shader_source[1] = fragment_shader_attribs_2_1;
+ fragment_shader_source[2] = fragment_shader_main;
+ fragment_shader_source[3] = fragment_shader_out_2_1;
+ }
+ else
+ {
+ /* We have at least OpenGL 3.0 and at least GLSL 1.30. */
+ vertex_shader_source[0] = shader_version_3_0;
+ vertex_shader_source[1] = vertex_shader_attribs_3_0;
+ vertex_shader_source[2] = vertex_shader_main;
+ fragment_shader_source[0] = shader_version_3_0;
+ fragment_shader_source[1] = fragment_shader_attribs_3_0;
+ fragment_shader_source[2] = fragment_shader_main;
+ fragment_shader_source[3] = fragment_shader_out_3_0;
+ }
+ }
+ else /* gl_gles3 */
+ {
+ if (gl_major < 3 || glsl_major < 3)
+ return;
+ /* We have at least OpenGL ES 3.0 and at least GLSL ES 3.0. */
+ vertex_shader_source[0] = shader_version_3_0_es;
+ vertex_shader_source[1] = vertex_shader_attribs_3_0;
+ vertex_shader_source[2] = vertex_shader_main;
+ fragment_shader_source[0] = shader_version_3_0_es;
+ fragment_shader_source[1] = fragment_shader_attribs_3_0;
+ fragment_shader_source[2] = fragment_shader_main;
+ fragment_shader_source[3] = fragment_shader_out_3_0;
+ }
+ if (!glsl_CompileAndLinkShaders(3,vertex_shader_source,
+ 4,fragment_shader_source,
+ &pp->shader_program))
+ return;
+ pp->vertex_uv_index = glGetAttribLocation(pp->shader_program,"VertexUV");
+ pp->vertex_t_index = glGetAttribLocation(pp->shader_program,"VertexT");
+ pp->color_index = glGetAttribLocation(pp->shader_program,"VertexColor");
+ if (pp->vertex_uv_index == -1 || pp->vertex_t_index == -1 ||
+ pp->color_index == -1)
+ {
+ glDeleteProgram(pp->shader_program);
+ return;
+ }
+ pp->mat_rot_index = glGetUniformLocation(pp->shader_program,
+ "MatRot4D");
+ pp->mat_p_index = glGetUniformLocation(pp->shader_program,
+ "MatProj");
+ pp->bool_persp_index = glGetUniformLocation(pp->shader_program,
+ "BoolPersp");
+ pp->off4d_index = glGetUniformLocation(pp->shader_program,
+ "Offset4D");
+ pp->off3d_index = glGetUniformLocation(pp->shader_program,
+ "Offset3D");
+ pp->bool_textures_index = glGetUniformLocation(pp->shader_program,
+ "BoolTextures");
+ pp->draw_lines_index = glGetUniformLocation(pp->shader_program,
+ "DrawLines");
+ pp->glbl_ambient_index = glGetUniformLocation(pp->shader_program,
+ "LtGlblAmbient");
+ pp->lt_ambient_index = glGetUniformLocation(pp->shader_program,
+ "LtAmbient");
+ pp->lt_diffuse_index = glGetUniformLocation(pp->shader_program,
+ "LtDiffuse");
+ pp->lt_specular_index = glGetUniformLocation(pp->shader_program,
+ "LtSpecular");
+ pp->lt_direction_index = glGetUniformLocation(pp->shader_program,
+ "LtDirection");
+ pp->lt_halfvect_index = glGetUniformLocation(pp->shader_program,
+ "LtHalfVector");
+ pp->front_ambient_index = glGetUniformLocation(pp->shader_program,
+ "MatFrontAmbient");
+ pp->back_ambient_index = glGetUniformLocation(pp->shader_program,
+ "MatBackAmbient");
+ pp->front_diffuse_index = glGetUniformLocation(pp->shader_program,
+ "MatFrontDiffuse");
+ pp->back_diffuse_index = glGetUniformLocation(pp->shader_program,
+ "MatBackDiffuse");
+ pp->specular_index = glGetUniformLocation(pp->shader_program,
+ "MatSpecular");
+ pp->shininess_index = glGetUniformLocation(pp->shader_program,
+ "MatShininess");
+ pp->texture_sampler_index = glGetUniformLocation(pp->shader_program,
+ "TextureSampler");
+ if (pp->mat_rot_index == -1 || pp->mat_p_index == -1 ||
+ pp->bool_persp_index == -1 || pp->off4d_index == -1 ||
+ pp->off3d_index == -1 || pp->bool_textures_index == -1 ||
+ pp->draw_lines_index == -1 || pp->glbl_ambient_index == -1 ||
+ pp->lt_ambient_index == -1 || pp->lt_diffuse_index == -1 ||
+ pp->lt_specular_index == -1 || pp->lt_direction_index == -1 ||
+ pp->lt_halfvect_index == -1 || pp->front_ambient_index == -1 ||
+ pp->back_ambient_index == -1 || pp->front_diffuse_index == -1 ||
+ pp->back_diffuse_index == -1 || pp->specular_index == -1 ||
+ pp->shininess_index == -1 || pp->texture_sampler_index == -1)
+ {
+ glDeleteProgram(pp->shader_program);
+ return;
+ }
+
+ glGenBuffers(1,&pp->vertex_uv_buffer);
+ glGenBuffers(1,&pp->vertex_t_buffer);
+ glGenBuffers(1,&pp->color_buffer);
+ glGenBuffers(1,&pp->indices_buffer);
+
+ pp->use_shaders = True;
+}
+
+#endif /* HAVE_GLSL */
+
+
static void init(ModeInfo *mi)
{
- static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
- static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
- static const GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
- static const GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
- static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
projectiveplanestruct *pp = &projectiveplane[MI_SCREEN(mi)];
if (walk_speed == 0.0)
@@ -1265,78 +2207,16 @@ static void init(ModeInfo *mi)
gen_texture(mi);
setup_projective_plane(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
- if (pp->marks)
- glEnable(GL_TEXTURE_2D);
- else
- glDisable(GL_TEXTURE_2D);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- if (pp->projection_3d == DISP_3D_PERSPECTIVE ||
- pp->view == VIEW_WALK || pp->view == VIEW_WALKTURN)
- {
- if (pp->view == VIEW_WALK || pp->view == VIEW_WALKTURN)
- gluPerspective(60.0,1.0,0.01,10.0);
- else
- gluPerspective(60.0,1.0,0.1,10.0);
- }
- else
- {
- glOrtho(-0.6,0.6,-0.6,0.6,0.1,10.0);
- }
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
+#ifdef HAVE_GLSL
+ init_glsl(mi);
+#endif /* HAVE_GLSL */
-# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
- if (pp->display_mode == DISP_WIREFRAME)
+#ifdef HAVE_ANDROID
+ /* glPolygonMode(...,GL_LINE) is not supported for an OpenGL ES 1.1
+ context. */
+ if (!pp->use_shaders && pp->display_mode == DISP_WIREFRAME)
pp->display_mode = DISP_SURFACE;
-# endif
-
- if (pp->display_mode == DISP_SURFACE)
- {
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LESS);
- glShadeModel(GL_SMOOTH);
- glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
- glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
- glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
- glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
- glLightfv(GL_LIGHT0,GL_POSITION,light_position);
- glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
- glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
- glDepthMask(GL_TRUE);
- glDisable(GL_BLEND);
- }
- else if (pp->display_mode == DISP_TRANSPARENT)
- {
- glDisable(GL_DEPTH_TEST);
- glShadeModel(GL_SMOOTH);
- glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
- glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
- glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
- glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
- glLightfv(GL_LIGHT0,GL_POSITION,light_position);
- glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
- glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
- glDepthMask(GL_FALSE);
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE);
- }
- else /* pp->display_mode == DISP_WIREFRAME */
- {
- glDisable(GL_DEPTH_TEST);
- glShadeModel(GL_FLAT);
- glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
- glDisable(GL_LIGHTING);
- glDisable(GL_LIGHT0);
- glDisable(GL_BLEND);
- }
+#endif /* HAVE_ANDROID */
}
@@ -1425,27 +2305,12 @@ static void display_projectiveplane(ModeInfo *mi)
}
}
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- if (pp->projection_3d == DISP_3D_PERSPECTIVE ||
- pp->view == VIEW_WALK || pp->view == VIEW_WALKTURN)
- {
- if (pp->view == VIEW_WALK || pp->view == VIEW_WALKTURN)
- gluPerspective(60.0,pp->aspect,0.01,10.0);
- else
- gluPerspective(60.0,pp->aspect,0.1,10.0);
- }
+#ifdef HAVE_GLSL
+ if (pp->use_shaders)
+ mi->polygon_count = projective_plane_pf(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
else
- {
- if (pp->aspect >= 1.0)
- glOrtho(-0.6*pp->aspect,0.6*pp->aspect,-0.6,0.6,0.1,10.0);
- else
- glOrtho(-0.6,0.6,-0.6/pp->aspect,0.6/pp->aspect,0.1,10.0);
- }
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- mi->polygon_count = projective_plane(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
+#endif /* HAVE_GLSL */
+ mi->polygon_count = projective_plane_ff(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
}
@@ -1541,7 +2406,6 @@ ENTRYPOINT void init_projectiveplane(ModeInfo *mi)
MI_INIT(mi, projectiveplane);
pp = &projectiveplane[MI_SCREEN(mi)];
-
pp->trackballs[0] = gltrackball_init(True);
pp->trackballs[1] = gltrackball_init(True);
pp->current_trackball = 0;
@@ -1711,7 +2575,6 @@ ENTRYPOINT void init_projectiveplane(ModeInfo *mi)
if ((pp->glx_context = init_GL(mi)) != NULL)
{
reshape_projectiveplane(mi,MI_WIDTH(mi),MI_HEIGHT(mi));
- glDrawBuffer(GL_BACK);
init(mi);
}
else
@@ -1741,6 +2604,8 @@ ENTRYPOINT void draw_projectiveplane(ModeInfo *mi)
glXMakeCurrent(display, window, *pp->glx_context);
+ glClearColor(0.0f,0.0f,0.0f,1.0f);
+ glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
@@ -1768,6 +2633,7 @@ ENTRYPOINT void change_projectiveplane(ModeInfo *mi)
}
#endif /* !STANDALONE */
+
ENTRYPOINT void free_projectiveplane(ModeInfo *mi)
{
projectiveplanestruct *pp = &projectiveplane[MI_SCREEN(mi)];
@@ -1776,8 +2642,23 @@ ENTRYPOINT void free_projectiveplane(ModeInfo *mi)
gltrackball_free (pp->trackballs[0]);
gltrackball_free (pp->trackballs[1]);
if (pp->tex_name) glDeleteTextures (1, &pp->tex_name);
+#ifdef HAVE_GLSL
+ if (pp->use_shaders)
+ {
+ glDeleteBuffers(1,&pp->vertex_uv_buffer);
+ glDeleteBuffers(1,&pp->vertex_t_buffer);
+ glDeleteBuffers(1,&pp->color_buffer);
+ glDeleteBuffers(1,&pp->indices_buffer);
+ if (pp->shader_program != 0)
+ {
+ glUseProgram(0);
+ glDeleteProgram(pp->shader_program);
+ }
+ }
+#endif /* HAVE_GLSL */
}
+
XSCREENSAVER_MODULE ("ProjectivePlane", projectiveplane)
#endif /* USE_GL */
diff --git a/hacks/glx/projectiveplane.man b/hacks/glx/projectiveplane.man
index 7df253d..bf6ffb1 100644
--- a/hacks/glx/projectiveplane.man
+++ b/hacks/glx/projectiveplane.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-projectiveplane - Draws a 4d embedding of the real projective plane.
+projectiveplane \- Draws a 4d embedding of the real projective plane.
.SH SYNOPSIS
.B projectiveplane
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/providence.c b/hacks/glx/providence.c
index 0ef87fd..5c06d31 100644
--- a/hacks/glx/providence.c
+++ b/hacks/glx/providence.c
@@ -760,14 +760,14 @@ ENTRYPOINT void draw_providence(ModeInfo * mi)
gltrackball_rotate(mp->trackball);
glRotatef(mp->theta * 180.0 / Pi, 0.0, -1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+#if 0
{
- GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
+#endif
/* draw providence */
draw_providence_strip(mi);
diff --git a/hacks/glx/providence.man b/hacks/glx/providence.man
index ea7286d..0ee2d9b 100644
--- a/hacks/glx/providence.man
+++ b/hacks/glx/providence.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "May 2004"
.SH NAME
-providence - eye in glory screenhack
+providence \- eye in glory screenhack
.SH SYNOPSIS
.B providence
[\-display \fIhost:display.screen\fP]
@@ -51,8 +51,8 @@ stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1)
-.BR xscreensaver\-demo (1),
-.BR xscreensaver\-getimage (1)
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-getimage (MANSUFFIX)
.SH COPYRIGHT
Copyright \(co 2004 by Blair Tennessy. Permission to use, copy, modify,
distribute, and sell this software and its documentation for any purpose is
diff --git a/hacks/glx/pulsar.c b/hacks/glx/pulsar.c
index 4a3e79e..3a515a8 100644
--- a/hacks/glx/pulsar.c
+++ b/hacks/glx/pulsar.c
@@ -53,14 +53,6 @@
#ifdef USE_GL /* whole file */
-#ifdef HAVE_XMU
-# ifndef VMS
-# include <X11/Xmu/Drawing.h>
-#else /* VMS */
-# include <Xmu/Drawing.h>
-# endif /* VMS */
-#endif
-
#include "ximage-loader.h"
/* Functions for loading and storing textures */
@@ -70,9 +62,6 @@
/* Functions for handling the frames per second timer */
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#define WIDTH 800
#define HEIGHT 600
diff --git a/hacks/glx/pulsar.man b/hacks/glx/pulsar.man
index f3b1009..f5697a9 100644
--- a/hacks/glx/pulsar.man
+++ b/hacks/glx/pulsar.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-pulsar - intersecting planes, alpha blending, fog, and textures.
+pulsar \- intersecting planes, alpha blending, fog, and textures.
.SH SYNOPSIS
.B pulsar
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/quasicrystal.c b/hacks/glx/quasicrystal.c
index 52f819e..a988b7a 100644
--- a/hacks/glx/quasicrystal.c
+++ b/hacks/glx/quasicrystal.c
@@ -25,8 +25,6 @@
"*suppressRotationAnimation: True\n" \
# define release_quasicrystal 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "colors.h"
diff --git a/hacks/glx/quasicrystal.man b/hacks/glx/quasicrystal.man
index 804d3a3..ff4003e 100644
--- a/hacks/glx/quasicrystal.man
+++ b/hacks/glx/quasicrystal.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-quasicrystal - aperiodic plane tilings.
+quasicrystal \- aperiodic plane tilings.
.SH SYNOPSIS
.B quasicrystal
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/queens.c b/hacks/glx/queens.c
index fce9d37..199842c 100644
--- a/hacks/glx/queens.c
+++ b/hacks/glx/queens.c
@@ -24,31 +24,15 @@
# define release_queens 0
# include "xlockmore.h"
-
#else
# include "xlock.h"
#endif
-#ifdef HAVE_JWXYZ
-# include "jwxyz.h"
-#else
-# include <X11/Xlib.h>
-# include <GL/gl.h>
-# include <GL/glu.h>
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
#ifdef USE_GL
#include "gltrackball.h"
#include "chessmodels.h"
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
static XrmOptionDescRec opts[] = {
{"+rotate", ".queens.rotate", XrmoptionNoArg, "false" },
{"-rotate", ".queens.rotate", XrmoptionNoArg, "true" },
diff --git a/hacks/glx/queens.man b/hacks/glx/queens.man
index 47fc3f4..9626b06 100644
--- a/hacks/glx/queens.man
+++ b/hacks/glx/queens.man
@@ -51,8 +51,8 @@ It's not unknown for this and other OpenGL hacks to fail under hardware accelara
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1)
-.BR xscreensaver\-demo (1),
-.BR xscreensaver\-getimage (1)
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-getimage (MANSUFFIX)
.SH COPYRIGHT
Copyright \(co 2002 by Blair Tennessy. Permission to use, copy, modify,
distribute, and sell this software and its documentation for any purpose is
diff --git a/hacks/glx/quickhull.c b/hacks/glx/quickhull.c
index ff517db..6733897 100644
--- a/hacks/glx/quickhull.c
+++ b/hacks/glx/quickhull.c
@@ -48,27 +48,27 @@
- reduce memory usage
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
+#include "screenhackI.h"
extern const char *progname;
#include "quickhull.h"
-#include "screenhackI.h" /* for jwxyz_abort */
-
#include <math.h> /* sqrt & fabs */
#include <stdio.h> /* FILE */
#include <string.h> /* memcpy */
+#if (__GNUC__ >= 4)
+# pragma GCC diagnostic ignored "-Wvariadic-macros"
+#endif
+
/* Quickhull helpers, define your own if needed */
#ifndef QUICKHULL_HELPERS
#include <stdlib.h> /* malloc, free, realloc */
#define QUICKHULL_HELPERS 1
#define QH_MALLOC(T, N) ((T*) malloc(N * sizeof(T)))
#define QH_REALLOC(T, P, N) ((T*)realloc(P, sizeof(T) * N))
-#define QH_FREE(T) free(T)
+#define QH_FREE(T) do { void *t = (T); if (t) free(t); } while(0)
#define QH_SWAP(T, A, B) { T tmp = B; B = A; A = tmp; }
#ifdef QUICKHULL_DEBUG
#define QH_ASSERT(STMT) if (!(STMT)) { *(int *)0 = 0; }
@@ -1175,7 +1175,33 @@ qh__remove_vertex_duplicates(qh_context_t* context, double epsilon)
}
}
+
static void
+qh__free_context(qh_context_t* context)
+{
+ int i;
+
+ for (i = 0; i < context->nfaces; ++i) {
+ QH_FREE(context->faces[i].iset.indices);
+ context->faces[i].iset.size = 0;
+ }
+
+ context->nvertices = 0;
+ context->nfaces = 0;
+
+ QH_FREE(context->edges);
+
+ QH_FREE(context->faces);
+ QH_FREE(context->facestack.begin);
+ QH_FREE(context->scratch.begin);
+ QH_FREE(context->horizonedges.begin);
+ QH_FREE(context->newhorizonedges.begin);
+ QH_FREE(context->vertices);
+ QH_FREE(context->valid);
+}
+
+/* jwz: return 0 when out of memory */
+static Bool
qh__init_context(qh_context_t* context, qh_vertex_t const* vertices,
unsigned int nvertices)
{
@@ -1185,69 +1211,39 @@ qh__init_context(qh_context_t* context, qh_vertex_t const* vertices,
unsigned int nfaces = nvertices * (nvertices - 1);
unsigned int nedges = nfaces * 3;
+ memset (context, 0, sizeof(*context));
+
context->edges = QH_MALLOC(qh_half_edge_t, nedges);
+ if (!context->edges) goto FAIL;
context->faces = QH_MALLOC(qh_face_t, nfaces);
+ if (!context->faces) goto FAIL;
context->facestack.begin = QH_MALLOC(qh_index_t, nfaces);
+ if (!context->facestack.begin) goto FAIL;
context->scratch.begin = QH_MALLOC(qh_index_t, nfaces);
+ if (!context->scratch.begin) goto FAIL;
context->horizonedges.begin = QH_MALLOC(qh_index_t, nedges);
+ if (!context->horizonedges.begin) goto FAIL;
context->newhorizonedges.begin = QH_MALLOC(qh_index_t, nedges);
+ if (!context->newhorizonedges.begin) goto FAIL;
context->valid = QH_MALLOC(char, nfaces);
-
- if (!(context->edges &&
- context->faces &&
- context->facestack.begin &&
- context->scratch.begin &&
- context->horizonedges.begin &&
- context->newhorizonedges.begin &&
- context->valid)) {
-# ifdef HAVE_JWXYZ
- jwxyz_abort ("%s: out of memory", progname);
-# else
- fprintf (stderr, "%s: out of memory\n", progname);
- exit (1);
-# endif
- }
-
+ if (!context->valid) goto FAIL;
context->vertices = QH_MALLOC(qh_vertex_t, nvertices);
- memcpy(context->vertices, vertices, sizeof(qh_vertex_t) * nvertices);
-
+ if (!context->vertices) goto FAIL;
context->nvertices = nvertices;
- context->nedges = 0;
- context->nfaces = 0;
- context->facestack.size = 0;
- context->scratch.size = 0;
- context->horizonedges.size = 0;
- context->newhorizonedges.size = 0;
+
+ memcpy(context->vertices, vertices, sizeof(qh_vertex_t) * nvertices);
#ifdef QUICKHULL_DEBUG
context->maxfaces = nfaces;
context->maxedges = nedges;
#endif
-}
-static void
-qh__free_context(qh_context_t* context)
-{
- int i;
+ return True;
- for (i = 0; i < context->nfaces; ++i) {
- QH_FREE(context->faces[i].iset.indices);
- context->faces[i].iset.size = 0;
- }
-
- context->nvertices = 0;
- context->nfaces = 0;
-
- QH_FREE(context->edges);
-
- QH_FREE(context->faces);
- QH_FREE(context->facestack.begin);
- QH_FREE(context->scratch.begin);
- QH_FREE(context->horizonedges.begin);
- QH_FREE(context->newhorizonedges.begin);
- QH_FREE(context->vertices);
- QH_FREE(context->valid);
+ FAIL:
+ qh__free_context (context);
+ return False;
}
void
@@ -1294,9 +1290,11 @@ qh_quickhull3d(qh_vertex_t const* vertices, unsigned int nvertices)
unsigned int nfaces = 0, i, index, nindices;
double epsilon;
+ memset (&m, 0, sizeof(m));
epsilon = qh__compute_epsilon(vertices, nvertices);
- qh__init_context(&context, vertices, nvertices);
+ if (! qh__init_context(&context, vertices, nvertices))
+ return m;
qh__remove_vertex_duplicates(&context, epsilon);
diff --git a/hacks/glx/quickhull.h b/hacks/glx/quickhull.h
index 161b74e..5594ece 100644
--- a/hacks/glx/quickhull.h
+++ b/hacks/glx/quickhull.h
@@ -39,6 +39,7 @@ typedef struct qh_mesh {
unsigned int nnormals;
} qh_mesh_t;
+/* If out of memory, returns a mesh with no vertices */
extern qh_mesh_t qh_quickhull3d(qh_vertex_t const* vertices,
unsigned int nvertices);
diff --git a/hacks/glx/raverhoop.c b/hacks/glx/raverhoop.c
index e08fdad..4a5a26a 100644
--- a/hacks/glx/raverhoop.c
+++ b/hacks/glx/raverhoop.c
@@ -17,8 +17,6 @@
"*wireframe: False \n" \
# define release_hoop 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "colors.h"
@@ -610,13 +608,12 @@ reshape_hoop (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
diff --git a/hacks/glx/raverhoop.man b/hacks/glx/raverhoop.man
index e7e70fa..425c504 100644
--- a/hacks/glx/raverhoop.man
+++ b/hacks/glx/raverhoop.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-raverhoop - Simulates an LED hula hoop in a dark room.
+raverhoop \- Simulates an LED hula hoop in a dark room.
.SH SYNOPSIS
.B raverhoop
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/razzledazzle.c b/hacks/glx/razzledazzle.c
index 4c940d1..8b4d23f 100644
--- a/hacks/glx/razzledazzle.c
+++ b/hacks/glx/razzledazzle.c
@@ -1,4 +1,4 @@
-/* razzledazzle, Copyright (c) 2018 Jamie Zawinski <jwz@jwz.org>
+/* razzledazzle, Copyright (c) 2018-2020 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -16,8 +16,6 @@
"*suppressRotationAnimation: True\n" \
# define release_dazzle 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "colors.h"
@@ -339,7 +337,7 @@ reshape_dazzle (ModeInfo *mi, int width, int height)
glOrtho (0, 1, 0.5-s, 0.5+s, -1, 1);
}
-# ifdef USE_IPHONE /* So much WTF */
+# ifdef HAVE_MOBILE /* So much WTF */
{
int rot = current_device_rotation();
@@ -596,7 +594,7 @@ draw_dazzle (ModeInfo *mi)
if (bp->which_ship != -1)
{
-# ifdef USE_IPHONE
+# ifdef HAVE_IPHONE
int rot = current_device_rotation();
# endif
@@ -612,7 +610,7 @@ draw_dazzle (ModeInfo *mi)
glEnable (GL_DEPTH_TEST);
}
-# ifdef USE_IPHONE
+# ifdef HAVE_IPHONE
glRotatef (90, 0, 0, 1);
if (rot == 90 || rot == -270)
glRotatef (180, 0, 0, 1);
@@ -623,7 +621,7 @@ draw_dazzle (ModeInfo *mi)
glScalef (0.9, 0.9, 0.9);
glTranslatef (-0.5, 0, -0.2);
-# ifdef USE_IPHONE
+# ifdef HAVE_IPHONE
if (rot == 0 || rot == 180 || rot == -180)
glScalef (1, 1, (GLfloat) MI_HEIGHT(mi) / MI_WIDTH(mi));
else
diff --git a/hacks/glx/razzledazzle.man b/hacks/glx/razzledazzle.man
index f4baef4..b2a731f 100644
--- a/hacks/glx/razzledazzle.man
+++ b/hacks/glx/razzledazzle.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-razzledazzle - screen saver.
+razzledazzle \- screen saver.
.SH SYNOPSIS
.B razzledazzle
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/romanboy.c b/hacks/glx/romanboy.c
index 6957556..544fb96 100644
--- a/hacks/glx/romanboy.c
+++ b/hacks/glx/romanboy.c
@@ -3,10 +3,10 @@
smoothly between the Roman surface and the Boy surface. */
#if 0
-static const char sccsid[] = "@(#)romanboy.c 1.1 03/10/14 xlockmore";
+static const char sccsid[] = "@(#)romanboy.c 1.1 14/10/03 xlockmore";
#endif
-/* Copyright (c) 2014-2020 Carsten Steger <carsten@mirsanmir.org>. */
+/* Copyright (c) 2014-2021 Carsten Steger <carsten@mirsanmir.org>. */
/*
* Permission to use, copy, modify, and distribute this software and its
@@ -22,8 +22,10 @@ static const char sccsid[] = "@(#)romanboy.c 1.1 03/10/14 xlockmore";
* other special, indirect and consequential damages.
*
* REVISION HISTORY:
- * C. Steger - 03/10/14: Initial version
- * C. Steger - 06/01/20: Added the changing colors mode.
+ * C. Steger - 14/10/03: Initial version
+ * C. Steger - 20/01/06: Added the changing colors mode
+ * C. Steger - 20/12/19: Added per-fragment shading
+ * C. Steger - 20/12/30: Make the shader code work under macOS and iOS
*/
/*
@@ -31,7 +33,7 @@ static const char sccsid[] = "@(#)romanboy.c 1.1 03/10/14 xlockmore";
* smoothly deforms between the Roman surface and the Boy surface.
* You can walk on the projective plane or turn in 3d. The smooth
* deformation (homotopy) between these two famous immersions of the
- * real projective plane was constructed by Franois Apry.
+ * real projective plane was constructed by François Apéry.
*
* The real projective plane is a non-orientable surface. To make
* this apparent, the two-sided color mode can be used.
@@ -159,7 +161,7 @@ static const char sccsid[] = "@(#)romanboy.c 1.1 03/10/14 xlockmore";
* in an immersion of the halfway model of Morin's sphere eversion (if
* the deformation is switched off).
*
- * This program is inspired by Franois Apry's book "Models of the
+ * This program is inspired by François Apéry's book "Models of the
* Real Projective Plane", Vieweg, 1987.
*/
@@ -210,9 +212,11 @@ static const char sccsid[] = "@(#)romanboy.c 1.1 03/10/14 xlockmore";
#define DEF_INIT_DEFORM "1000.0"
#define DEF_SURFACE_ORDER "3"
+
#ifdef STANDALONE
-# define DEFAULTS "*delay: 10000 \n" \
+# define DEFAULTS "*delay: 25000 \n" \
"*showFPS: False \n" \
+ "*prefersGLSL: True \n" \
# define release_romanboy 0
# include "xlockmore.h" /* from the xscreensaver distribution */
@@ -226,6 +230,7 @@ static const char sccsid[] = "@(#)romanboy.c 1.1 03/10/14 xlockmore";
# include <X11/keysym.h>
#endif
+#include "glsl-utils.h"
#include "gltrackball.h"
#include <float.h>
@@ -364,7 +369,7 @@ typedef struct {
int g;
/* The viewing offset in 3d */
float offset3d[3];
- /* The 3d coordinates of the projective plane and their derivatives */
+ /* The 3d coordinates of the projective plane and their normals */
float *pp;
float *pn;
/* The precomputed colors of the projective plane */
@@ -380,11 +385,227 @@ typedef struct {
Bool button_pressed;
/* A random factor to modify the rotation speeds */
float speed_scale;
+#ifdef HAVE_GLSL
+ GLfloat *uv;
+ GLuint *indices;
+ Bool use_shaders, buffers_initialized;
+ GLuint shader_program;
+ GLint vertex_uv_index, vertex_t_index, color_index;
+ GLint mat_mv_index, mat_p_index, g_index, d_index;
+ GLint bool_textures_index, draw_lines_index;
+ GLint glbl_ambient_index, lt_ambient_index;
+ GLint lt_diffuse_index, lt_specular_index;
+ GLint lt_direction_index, lt_halfvect_index;
+ GLint front_ambient_index, back_ambient_index;
+ GLint front_diffuse_index, back_diffuse_index;
+ GLint specular_index, shininess_index;
+ GLint texture_sampler_index;
+ GLuint vertex_uv_buffer, vertex_t_buffer;
+ GLuint color_buffer, indices_buffer;
+ GLint ni, ne, nt;
+#endif /* HAVE_GLSL */
} romanboystruct;
static romanboystruct *romanboy = (romanboystruct *) NULL;
+#ifdef HAVE_GLSL
+
+/* The GLSL versions that correspond to different versions of OpenGL. */
+static const GLchar *shader_version_2_1 =
+ "#version 120\n";
+static const GLchar *shader_version_3_0 =
+ "#version 130\n";
+static const GLchar *shader_version_3_0_es =
+ "#version 300 es\n"
+ "precision highp float;\n"
+ "precision highp int;\n";
+
+/* The vertex shader code is composed of code fragments that depend on
+ the OpenGL version and code fragments that are version-independent.
+ They are concatenated by glsl_CompileAndLinkShaders in the function
+ init_glsl(). */
+static const GLchar *vertex_shader_attribs_2_1 =
+ "attribute vec2 VertexUV;\n"
+ "attribute vec4 VertexT;\n"
+ "attribute vec4 VertexColor;\n"
+ "\n"
+ "varying vec3 Normal;\n"
+ "varying vec4 Color;\n"
+ "varying vec4 TexCoord;\n"
+ "\n";
+static const GLchar *vertex_shader_attribs_3_0 =
+ "in vec2 VertexUV;\n"
+ "in vec4 VertexT;\n"
+ "in vec4 VertexColor;\n"
+ "\n"
+ "out vec3 Normal;\n"
+ "out vec4 Color;\n"
+ "out vec4 TexCoord;\n"
+ "\n";
+static const GLchar *vertex_shader_main =
+ "uniform mat4 MatModelView;\n"
+ "uniform mat4 MatProj;\n"
+ "uniform int G;\n"
+ "uniform float D;\n"
+ "uniform bool BoolTextures;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " const float EPSILON = 1.19e-6f;\n"
+ " const float M_PI = 3.14159265359f;\n"
+ " const float M_SQRT2 = 1.41421356237f;\n"
+ " float g = float(G);\n"
+ " float u = VertexUV.x;\n"
+ " float v = VertexUV.y;\n"
+ " float sqrt2og = M_SQRT2/g;\n"
+ " float h1m1og = 0.5f*(1.0f-1.0f/g);\n"
+ " float gm1 = g-1.0f;\n"
+ " float cu = cos(u);\n"
+ " float su = sin(u);\n"
+ " float cgu = cos(g*u);\n"
+ " float sgu = sin(g*u);\n"
+ " float cgm1u = cos(gm1*u);\n"
+ " float sgm1u = sin(gm1*u);\n"
+ " float cv = cos(v);\n"
+ " float c2v = cos(2.0f*v);\n"
+ " float s2v = sin(2.0f*v);\n"
+ " float cv2 = cv*cv;\n"
+ " float nomx = sqrt2og*cv2*cgm1u+h1m1og*s2v*cu;\n"
+ " float nomy = sqrt2og*cv2*sgm1u-h1m1og*s2v*su;\n"
+ " float nomux = -sqrt2og*cv2*gm1*sgm1u-h1m1og*s2v*su;\n"
+ " float nomuy = sqrt2og*cv2*gm1*cgm1u-h1m1og*s2v*cu;\n"
+ " float nomvx = -sqrt2og*s2v*cgm1u+2.0f*h1m1og*c2v*cu;\n"
+ " float nomvy = -sqrt2og*s2v*sgm1u-2.0f*h1m1og*c2v*su;\n"
+ " float den = 1.0f/(1.0f-0.5f*M_SQRT2*D*s2v*sgu);\n"
+ " float den2 = den*den;\n"
+ " float denu = 0.5f*M_SQRT2*D*g*cgu*s2v;\n"
+ " float denv = M_SQRT2*D*sgu*c2v;\n"
+ " vec3 x = vec3(nomx*den,\n"
+ " nomy*den,\n"
+ " cv2*den);\n"
+ " if (0.5f*M_PI-abs(v) < EPSILON)\n"
+ " {\n"
+ " if (0.5f*M_PI-v < EPSILON)\n"
+ " v = 0.5f*M_PI-EPSILON;\n"
+ " else\n"
+ " v = -0.5f*M_PI+EPSILON;\n"
+ " cv = cos(v);\n"
+ " c2v = cos(2.0f*v);\n"
+ " s2v = sin(2.0f*v);\n"
+ " cv2 = cv*cv;\n"
+ " nomx = sqrt2og*cv2*cgm1u+h1m1og*s2v*cu;\n"
+ " nomy = sqrt2og*cv2*sgm1u-h1m1og*s2v*su;\n"
+ " nomux = -sqrt2og*cv2*gm1*sgm1u-h1m1og*s2v*su;\n"
+ " nomuy = sqrt2og*cv2*gm1*cgm1u-h1m1og*s2v*cu;\n"
+ " nomvx = -sqrt2og*s2v*cgm1u+2.0f*h1m1og*c2v*cu;\n"
+ " nomvy = -sqrt2og*s2v*sgm1u-2.0f*h1m1og*c2v*su;\n"
+ " den = 1.0f/(1.0f-0.5f*M_SQRT2*D*s2v*sgu);\n"
+ " den2 = den*den;\n"
+ " denu = 0.5f*M_SQRT2*D*g*cgu*s2v;\n"
+ " denv = M_SQRT2*D*sgu*c2v;\n"
+ " }\n"
+ " vec3 xu = vec3(nomux*den+nomx*denu*den2,\n"
+ " nomuy*den+nomy*denu*den2,\n"
+ " cv2*denu*den2);\n"
+ " vec3 xv = vec3(nomvx*den+nomx*denv*den2,\n"
+ " nomvy*den+nomy*denv*den2,\n"
+ " -s2v*den+cv2*denv*den2);\n"
+ " vec4 Position = MatModelView*vec4(x,1.0f);\n"
+ " vec4 pu = MatModelView*vec4(xu,0.0f);\n"
+ " vec4 pv = MatModelView*vec4(xv,0.0f);\n"
+ " Normal = normalize(cross(pu.xyz,pv.xyz));\n"
+ " gl_Position = MatProj*Position;\n"
+ " Color = VertexColor;\n"
+ " if (BoolTextures)\n"
+ " TexCoord = VertexT;\n"
+ "}\n";
+
+/* The fragment shader code is composed of code fragments that depend on
+ the OpenGL version and code fragments that are version-independent.
+ They are concatenated by glsl_CompileAndLinkShaders in the function
+ init_glsl(). */
+static const GLchar *fragment_shader_attribs_2_1 =
+ "varying vec3 Normal;\n"
+ "varying vec4 Color;\n"
+ "varying vec4 TexCoord;\n"
+ "\n";
+static const GLchar *fragment_shader_attribs_3_0 =
+ "in vec3 Normal;\n"
+ "in vec4 Color;\n"
+ "in vec4 TexCoord;\n"
+ "\n"
+ "out vec4 FragColor;\n"
+ "\n";
+static const GLchar *fragment_shader_main =
+ "uniform bool DrawLines;\n"
+ "uniform vec4 LtGlblAmbient;\n"
+ "uniform vec4 LtAmbient, LtDiffuse, LtSpecular;\n"
+ "uniform vec3 LtDirection, LtHalfVector;\n"
+ "uniform vec4 MatFrontAmbient, MatBackAmbient;\n"
+ "uniform vec4 MatFrontDiffuse, MatBackDiffuse;\n"
+ "uniform vec4 MatSpecular;\n"
+ "uniform float MatShininess;\n"
+ "uniform bool BoolTextures;\n"
+ "uniform sampler2D TextureSampler;"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " vec4 color;\n"
+ " if (DrawLines)\n"
+ " {\n"
+ " color = Color;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " vec3 normalDirection;\n"
+ " vec4 ambientColor, diffuseColor, sceneColor;\n"
+ " vec4 ambientLighting, diffuseReflection, specularReflection;\n"
+ " float ndotl, ndoth, pf;\n"
+ " \n"
+ " if (gl_FrontFacing)\n"
+ " {\n"
+ " normalDirection = normalize(Normal);\n"
+ " sceneColor = Color*MatFrontAmbient*LtGlblAmbient;\n"
+ " ambientColor = Color*MatFrontAmbient;\n"
+ " diffuseColor = Color*MatFrontDiffuse;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " normalDirection = -normalize(Normal);\n"
+ " sceneColor = Color*MatBackAmbient*LtGlblAmbient;\n"
+ " ambientColor = Color*MatBackAmbient;\n"
+ " diffuseColor = Color*MatBackDiffuse;\n"
+ " }\n"
+ " \n"
+ " ndotl = max(0.0,dot(normalDirection,LtDirection));\n"
+ " ndoth = max(0.0,dot(normalDirection,LtHalfVector));\n"
+ " if (ndotl == 0.0)\n"
+ " pf = 0.0;\n"
+ " else\n"
+ " pf = pow(ndoth,MatShininess);\n"
+ " ambientLighting = ambientColor*LtAmbient;\n"
+ " diffuseReflection = LtDiffuse*diffuseColor*ndotl;\n"
+ " specularReflection = LtSpecular*MatSpecular*pf;\n"
+ " color = sceneColor+ambientLighting+diffuseReflection;\n";
+static const GLchar *fragment_shader_out_2_1 =
+ " if (BoolTextures)\n"
+ " color *= texture2D(TextureSampler,TexCoord.st);"
+ " color += specularReflection;\n"
+ " }\n"
+ " gl_FragColor = clamp(color,0.0,1.0);\n"
+ "}\n";
+static const GLchar *fragment_shader_out_3_0 =
+ " if (BoolTextures)\n"
+ " color *= texture(TextureSampler,TexCoord.st);"
+ " color += specularReflection;\n"
+ " }\n"
+ " FragColor = clamp(color,0.0,1.0);\n"
+ "}\n";
+
+#endif /* HAVE_GLSL */
+
+
/* Add a rotation around the x-axis to the matrix m. */
static void rotatex(float m[3][3], float phi)
{
@@ -615,11 +836,168 @@ static void setup_roman_boy_color_texture(ModeInfo *mi, double umin,
}
-/* Draw a 3d immersion of the projective plane. */
-static int roman_boy(ModeInfo *mi, double umin, double umax,
- double vmin, double vmax, int numu, int numv)
+/* Compute the current walk frame, i.e., the coordinate system of the
+ point and direction at which the viewer is currently walking on the
+ projective plane. */
+static void compute_walk_frame(romanboystruct *pp, int g, float d,
+ float radius, float oz, float mat[3][3])
{
- int polys = 0;
+ float p[3], pu[3], pv[3], pm[3], n[3], b[3];
+ int l, m;
+ float u, v;
+ float xx[3], xxu[3], xxv[3];
+ float r, t;
+ float cu, su, cgu, sgu, cgm1u, sgm1u, cv, c2v, s2v, cv2;
+ float sqrt2og, h1m1og, gm1, nomx, nomy, nomux, nomuy, nomvx, nomvy;
+ float den, den2, denu, denv;
+
+ u = pp->umove;
+ v = pp->vmove;
+ if (g & 1)
+ v = 0.5f*(float)M_PI-0.25f*v;
+ else
+ v = 0.5f*(float)M_PI-0.5f*v;
+ sqrt2og = (float)M_SQRT2/g;
+ h1m1og = 0.5f*(1.0f-1.0f/g);
+ gm1 = g-1.0f;
+ cu = cosf(u);
+ su = sinf(u);
+ cgu = cosf(g*u);
+ sgu = sinf(g*u);
+ cgm1u = cosf(gm1*u);
+ sgm1u = sinf(gm1*u);
+ cv = cosf(v);
+ c2v = cosf(2.0f*v);
+ s2v = sinf(2.0f*v);
+ cv2 = cv*cv;
+ nomx = sqrt2og*cv2*cgm1u+h1m1og*s2v*cu;
+ nomy = sqrt2og*cv2*sgm1u-h1m1og*s2v*su;
+ nomux = -sqrt2og*cv2*gm1*sgm1u-h1m1og*s2v*su;
+ nomuy = sqrt2og*cv2*gm1*cgm1u-h1m1og*s2v*cu;
+ nomvx = -sqrt2og*s2v*cgm1u+2.0f*h1m1og*c2v*cu;
+ nomvy = -sqrt2og*s2v*sgm1u-2.0f*h1m1og*c2v*su;
+ den = 1.0f/(1.0f-0.5f*(float)M_SQRT2*d*s2v*sgu);
+ den2 = den*den;
+ denu = 0.5f*(float)M_SQRT2*d*g*cgu*s2v;
+ denv = (float)M_SQRT2*d*sgu*c2v;
+ xx[0] = nomx*den;
+ xx[1] = nomy*den;
+ xx[2] = cv2*den-oz;
+ /* Avoid degenerate tangential plane basis vectors. */
+ if (0.5f*(float)M_PI-fabsf(v) < 10.0f*(float)FLT_EPSILON)
+ {
+ if (0.5f*(float)M_PI-v < 10.0f*(float)FLT_EPSILON)
+ v = 0.5f*(float)M_PI-10.0f*(float)FLT_EPSILON;
+ else
+ v = -0.5f*(float)M_PI+10.0f*(float)FLT_EPSILON;
+ cv = cosf(v);
+ c2v = cosf(2.0f*v);
+ s2v = sinf(2.0f*v);
+ cv2 = cv*cv;
+ nomx = sqrt2og*cv2*cgm1u+h1m1og*s2v*cu;
+ nomy = sqrt2og*cv2*sgm1u-h1m1og*s2v*su;
+ nomux = -sqrt2og*cv2*gm1*sgm1u-h1m1og*s2v*su;
+ nomuy = sqrt2og*cv2*gm1*cgm1u-h1m1og*s2v*cu;
+ nomvx = -sqrt2og*s2v*cgm1u+2.0f*h1m1og*c2v*cu;
+ nomvy = -sqrt2og*s2v*sgm1u-2.0f*h1m1og*c2v*su;
+ den = 1.0f/(1.0f-0.5f*(float)M_SQRT2*d*s2v*sgu);
+ den2 = den*den;
+ denu = 0.5f*(float)M_SQRT2*d*g*cgu*s2v;
+ denv = (float)M_SQRT2*d*sgu*c2v;
+ }
+ xxu[0] = nomux*den+nomx*denu*den2;
+ xxu[1] = nomuy*den+nomy*denu*den2;
+ xxu[2] = cv2*denu*den2;
+ xxv[0] = nomvx*den+nomx*denv*den2;
+ xxv[1] = nomvy*den+nomy*denv*den2;
+ xxv[2] = -s2v*den+cv2*denv*den2;
+ for (l=0; l<3; l++)
+ {
+ p[l] = xx[l]*radius;
+ pu[l] = xxu[l]*radius;
+ pv[l] = xxv[l]*radius;
+ }
+ n[0] = pu[1]*pv[2]-pu[2]*pv[1];
+ n[1] = pu[2]*pv[0]-pu[0]*pv[2];
+ n[2] = pu[0]*pv[1]-pu[1]*pv[0];
+ t = 1.0f/(pp->side*4.0f*sqrtf(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]));
+ n[0] *= t;
+ n[1] *= t;
+ n[2] *= t;
+ pm[0] = pu[0]*pp->dumove-pv[0]*0.25f*pp->dvmove;
+ pm[1] = pu[1]*pp->dumove-pv[1]*0.25f*pp->dvmove;
+ pm[2] = pu[2]*pp->dumove-pv[2]*0.25f*pp->dvmove;
+ t = 1.0f/(4.0f*sqrtf(pm[0]*pm[0]+pm[1]*pm[1]+pm[2]*pm[2]));
+ pm[0] *= t;
+ pm[1] *= t;
+ pm[2] *= t;
+ b[0] = n[1]*pm[2]-n[2]*pm[1];
+ b[1] = n[2]*pm[0]-n[0]*pm[2];
+ b[2] = n[0]*pm[1]-n[1]*pm[0];
+ t = 1.0f/(4.0f*sqrtf(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]));
+ b[0] *= t;
+ b[1] *= t;
+ b[2] *= t;
+
+ /* Compute alpha, beta, gamma from the three basis vectors.
+ | -b[0] -b[1] -b[2] |
+ m = | n[0] n[1] n[2] |
+ | -pm[0] -pm[1] -pm[2] |
+ */
+ pp->alpha = atan2f(-n[2],-pm[2])*180.0f/(float)M_PI;
+ pp->beta = atan2f(-b[2],sqrtf(b[0]*b[0]+b[1]*b[1]))*180.0f/(float)M_PI;
+ pp->delta = atan2f(b[1],-b[0])*180.0f/(float)M_PI;
+
+ /* Compute the rotation that rotates the projective plane in 3D. */
+ rotateall(pp->alpha,pp->beta,pp->delta,mat);
+
+ u = pp->umove;
+ v = pp->vmove;
+ if (g & 1)
+ v = 0.5f*(float)M_PI-0.25f*v;
+ else
+ v = 0.5f*(float)M_PI-0.5f*v;
+ sqrt2og = (float)M_SQRT2/g;
+ h1m1og = 0.5f*(1.0f-1.0f/g);
+ gm1 = g-1.0f;
+ cu = cosf(u);
+ su = sinf(u);
+ sgu = sinf(g*u);
+ cgm1u = cosf(gm1*u);
+ sgm1u = sinf(gm1*u);
+ cv = cosf(v);
+ s2v = sinf(2.0f*v);
+ cv2 = cv*cv;
+ nomx = sqrt2og*cv2*cgm1u+h1m1og*s2v*cu;
+ nomy = sqrt2og*cv2*sgm1u-h1m1og*s2v*su;
+ den = 1.0f/(1.0f-0.5f*(float)M_SQRT2*d*s2v*sgu);
+ xx[0] = nomx*den;
+ xx[1] = nomy*den;
+ xx[2] = cv2*den-oz;
+ for (l=0; l<3; l++)
+ {
+ r = 0.0;
+ for (m=0; m<3; m++)
+ r += mat[l][m]*xx[m];
+ p[l] = r*radius;
+ }
+
+ pp->offset3d[0] = -p[0];
+ pp->offset3d[1] = -p[1]-DELTAY;
+ pp->offset3d[2] = -p[2];
+}
+
+
+/* Draw a 3d immersion of the projective plane using OpenGL's fixed
+ functionality. */
+static int roman_boy_ff(ModeInfo *mi, double umin, double umax,
+ double vmin, double vmax, int numu, int numv)
+{
+ static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+ static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
+ static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
static const GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
static const GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
static const GLfloat mat_diff_oneside[] = { 0.9, 0.4, 0.3, 1.0 };
@@ -627,164 +1005,115 @@ static int roman_boy(ModeInfo *mi, double umin, double umax,
static const GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 };
static const GLfloat mat_diff_trans_oneside[] = { 0.9, 0.4, 0.3, 0.7 };
float mat_diff_dyn[4], mat_diff_dyn_compl[4];
- float p[3], pu[3], pv[3], pm[3], n[3], b[3], mat[3][3], matc[3][3];
+ float p[3], pu[3], pv[3], n[3], mat[3][3], matc[3][3];
int i, j, k, l, m, o, g;
- double u, v, ur, vr, oz;
- double xx[3], xxu[3], xxv[3];
- double r, s, t;
- double d, dd, radius;
- double cu, su, cgu, sgu, cgm1u, sgm1u, cv, c2v, s2v, cv2;
- double sqrt2og, h1m1og, gm1, nomx, nomy, nomux, nomuy, nomvx, nomvy;
- double den, den2, denu, denv;
+ float u, v, ur, vr, oz;
+ float xx[3], xxu[3], xxv[3];
+ float r, s, t;
+ float d, dd, radius;
+ float cu, su, cgu, sgu, cgm1u, sgm1u, cv, c2v, s2v, cv2;
+ float sqrt2og, h1m1og, gm1, nomx, nomy, nomux, nomuy, nomvx, nomvy;
+ float den, den2, denu, denv;
float qu[4], r1[3][3], r2[3][3];
romanboystruct *pp = &romanboy[MI_SCREEN(mi)];
+ int polys;
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ if (pp->projection == DISP_PERSPECTIVE || pp->view == VIEW_WALK)
+ {
+ if (pp->view == VIEW_WALK)
+ gluPerspective(60.0,pp->aspect,0.01,10.0);
+ else
+ gluPerspective(60.0,pp->aspect,0.1,10.0);
+ }
+ else
+ {
+ if (pp->aspect >= 1.0)
+ glOrtho(-pp->aspect,pp->aspect,-1.0,1.0,0.1,10.0);
+ else
+ glOrtho(-1.0,1.0,-1.0/pp->aspect,1.0/pp->aspect,0.1,10.0);
+ }
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ if (pp->display_mode == DISP_SURFACE)
+ {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glDepthMask(GL_TRUE);
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+ glDisable(GL_BLEND);
+ }
+ else if (pp->display_mode == DISP_TRANSPARENT)
+ {
+ glDisable(GL_DEPTH_TEST);
+ glDepthMask(GL_FALSE);
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ }
+ else /* pp->display_mode == DISP_WIREFRAME */
+ {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glDepthMask(GL_TRUE);
+ glShadeModel(GL_FLAT);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_LIGHT0);
+ glDisable(GL_BLEND);
+ }
+
+ if (pp->marks)
+ {
+ glEnable(GL_TEXTURE_2D);
+#ifndef HAVE_JWZGLES
+ glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SEPARATE_SPECULAR_COLOR);
+#endif
+ }
+ else
+ {
+ glDisable(GL_TEXTURE_2D);
+#ifndef HAVE_JWZGLES
+ glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SINGLE_COLOR);
+#endif
+ }
g = pp->g;
dd = pp->dd;
- d = ((6.0*dd-15.0)*dd+10.0)*dd*dd*dd;
- r = 1.0+d*d*(1.0/2.0+d*d*(1.0/6.0+d*d*(1.0/3.0)));
- radius = 1.0/r;
- oz = 0.5*r;
+ d = ((6.0f*dd-15.0f)*dd+10.0f)*dd*dd*dd;
+ r = 1.0f+d*d*(1.0f/2.0f+d*d*(1.0f/6.0f+d*d*(1.0f/3.0f)));
+ radius = 1.0f/r;
+ oz = 0.5f*r;
if (pp->change_colors)
rotateall(pp->rho,pp->sigma,pp->tau,matc);
if (pp->view == VIEW_WALK)
{
- u = pp->umove;
- v = pp->vmove;
- if (g & 1)
- v = 0.5*M_PI-0.25*v;
- else
- v = 0.5*M_PI-0.5*v;
- sqrt2og = M_SQRT2/g;
- h1m1og = 0.5*(1.0-1.0/g);
- gm1 = g-1.0;
- cu = cos(u);
- su = sin(u);
- cgu = cos(g*u);
- sgu = sin(g*u);
- cgm1u = cos(gm1*u);
- sgm1u = sin(gm1*u);
- cv = cos(v);
- c2v = cos(2.0*v);
- s2v = sin(2.0*v);
- cv2 = cv*cv;
- nomx = sqrt2og*cv2*cgm1u+h1m1og*s2v*cu;
- nomy = sqrt2og*cv2*sgm1u-h1m1og*s2v*su;
- nomux = -sqrt2og*cv2*gm1*sgm1u-h1m1og*s2v*su;
- nomuy = sqrt2og*cv2*gm1*cgm1u-h1m1og*s2v*cu;
- nomvx = -sqrt2og*s2v*cgm1u+2.0*h1m1og*c2v*cu;
- nomvy = -sqrt2og*s2v*sgm1u-2.0*h1m1og*c2v*su;
- den = 1.0/(1.0-0.5*M_SQRT2*d*s2v*sgu);
- den2 = den*den;
- denu = 0.5*M_SQRT2*d*g*cgu*s2v;
- denv = M_SQRT2*d*sgu*c2v;
- xx[0] = nomx*den;
- xx[1] = nomy*den;
- xx[2] = cv2*den-oz;
- /* Avoid degenerate tangential plane basis vectors. */
- if (0.5*M_PI-fabs(v) < FLT_EPSILON)
- {
- if (0.5*M_PI-v < FLT_EPSILON)
- v = 0.5*M_PI-FLT_EPSILON;
- else
- v = -0.5*M_PI+FLT_EPSILON;
- cv = cos(v);
- c2v = cos(2.0*v);
- s2v = sin(2.0*v);
- cv2 = cv*cv;
- nomx = sqrt2og*cv2*cgm1u+h1m1og*s2v*cu;
- nomy = sqrt2og*cv2*sgm1u-h1m1og*s2v*su;
- nomux = -sqrt2og*cv2*gm1*sgm1u-h1m1og*s2v*su;
- nomuy = sqrt2og*cv2*gm1*cgm1u-h1m1og*s2v*cu;
- nomvx = -sqrt2og*s2v*cgm1u+2.0*h1m1og*c2v*cu;
- nomvy = -sqrt2og*s2v*sgm1u-2.0*h1m1og*c2v*su;
- den = 1.0/(1.0-0.5*M_SQRT2*d*s2v*sgu);
- den2 = den*den;
- denu = 0.5*M_SQRT2*d*g*cgu*s2v;
- denv = M_SQRT2*d*sgu*c2v;
- }
- xxu[0] = nomux*den+nomx*denu*den2;
- xxu[1] = nomuy*den+nomy*denu*den2;
- xxu[2] = cv2*denu*den2;
- xxv[0] = nomvx*den+nomx*denv*den2;
- xxv[1] = nomvy*den+nomy*denv*den2;
- xxv[2] = -s2v*den+cv2*denv*den2;
- for (l=0; l<3; l++)
- {
- p[l] = xx[l]*radius;
- pu[l] = xxu[l]*radius;
- pv[l] = xxv[l]*radius;
- }
- n[0] = pu[1]*pv[2]-pu[2]*pv[1];
- n[1] = pu[2]*pv[0]-pu[0]*pv[2];
- n[2] = pu[0]*pv[1]-pu[1]*pv[0];
- t = 1.0/(pp->side*4.0*sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]));
- n[0] *= t;
- n[1] *= t;
- n[2] *= t;
- pm[0] = pu[0]*pp->dumove-pv[0]*0.25*pp->dvmove;
- pm[1] = pu[1]*pp->dumove-pv[1]*0.25*pp->dvmove;
- pm[2] = pu[2]*pp->dumove-pv[2]*0.25*pp->dvmove;
- t = 1.0/(4.0*sqrt(pm[0]*pm[0]+pm[1]*pm[1]+pm[2]*pm[2]));
- pm[0] *= t;
- pm[1] *= t;
- pm[2] *= t;
- b[0] = n[1]*pm[2]-n[2]*pm[1];
- b[1] = n[2]*pm[0]-n[0]*pm[2];
- b[2] = n[0]*pm[1]-n[1]*pm[0];
- t = 1.0/(4.0*sqrt(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]));
- b[0] *= t;
- b[1] *= t;
- b[2] *= t;
-
- /* Compute alpha, beta, gamma from the three basis vectors.
- | -b[0] -b[1] -b[2] |
- m = | n[0] n[1] n[2] |
- | -pm[0] -pm[1] -pm[2] |
- */
- pp->alpha = atan2(-n[2],-pm[2])*180/M_PI;
- pp->beta = atan2(-b[2],sqrt(b[0]*b[0]+b[1]*b[1]))*180/M_PI;
- pp->delta = atan2(b[1],-b[0])*180/M_PI;
-
- /* Compute the rotation that rotates the projective plane in 3D. */
- rotateall(pp->alpha,pp->beta,pp->delta,mat);
-
- u = pp->umove;
- v = pp->vmove;
- if (g & 1)
- v = 0.5*M_PI-0.25*v;
- else
- v = 0.5*M_PI-0.5*v;
- sqrt2og = M_SQRT2/g;
- h1m1og = 0.5*(1.0-1.0/g);
- gm1 = g-1.0;
- cu = cos(u);
- su = sin(u);
- sgu = sin(g*u);
- cgm1u = cos(gm1*u);
- sgm1u = sin(gm1*u);
- cv = cos(v);
- s2v = sin(2.0*v);
- cv2 = cv*cv;
- nomx = sqrt2og*cv2*cgm1u+h1m1og*s2v*cu;
- nomy = sqrt2og*cv2*sgm1u-h1m1og*s2v*su;
- den = 1.0/(1.0-0.5*M_SQRT2*d*s2v*sgu);
- xx[0] = nomx*den;
- xx[1] = nomy*den;
- xx[2] = cv2*den-oz;
- for (l=0; l<3; l++)
- {
- r = 0.0;
- for (m=0; m<3; m++)
- r += mat[l][m]*xx[m];
- p[l] = r*radius;
- }
-
- pp->offset3d[0] = -p[0];
- pp->offset3d[1] = -p[1]-DELTAY;
- pp->offset3d[2] = -p[2];
+ /* Compute the walk frame. */
+ compute_walk_frame(pp,g,d,radius,oz,mat);
}
else
{
@@ -875,56 +1204,56 @@ static int roman_boy(ModeInfo *mi, double umin, double umax,
color(pp,v*(5.0/6.0),matc,&pp->col[4*o]);
}
if (g & 1)
- v = 0.5*M_PI-0.25*v;
+ v = 0.5f*(float)M_PI-0.25f*v;
else
- v = 0.5*M_PI-0.5*v;
- sqrt2og = M_SQRT2/g;
- h1m1og = 0.5*(1.0-1.0/g);
- gm1 = g-1.0;
- cu = cos(u);
- su = sin(u);
- cgu = cos(g*u);
- sgu = sin(g*u);
- cgm1u = cos(gm1*u);
- sgm1u = sin(gm1*u);
- cv = cos(v);
- c2v = cos(2.0*v);
- s2v = sin(2.0*v);
+ v = 0.5f*(float)M_PI-0.5f*v;
+ sqrt2og = (float)M_SQRT2/g;
+ h1m1og = 0.5f*(1.0f-1.0f/g);
+ gm1 = g-1.0f;
+ cu = cosf(u);
+ su = sinf(u);
+ cgu = cosf(g*u);
+ sgu = sinf(g*u);
+ cgm1u = cosf(gm1*u);
+ sgm1u = sinf(gm1*u);
+ cv = cosf(v);
+ c2v = cosf(2.0f*v);
+ s2v = sinf(2.0f*v);
cv2 = cv*cv;
nomx = sqrt2og*cv2*cgm1u+h1m1og*s2v*cu;
nomy = sqrt2og*cv2*sgm1u-h1m1og*s2v*su;
nomux = -sqrt2og*cv2*gm1*sgm1u-h1m1og*s2v*su;
nomuy = sqrt2og*cv2*gm1*cgm1u-h1m1og*s2v*cu;
- nomvx = -sqrt2og*s2v*cgm1u+2.0*h1m1og*c2v*cu;
- nomvy = -sqrt2og*s2v*sgm1u-2.0*h1m1og*c2v*su;
- den = 1.0/(1.0-0.5*M_SQRT2*d*s2v*sgu);
+ nomvx = -sqrt2og*s2v*cgm1u+2.0f*h1m1og*c2v*cu;
+ nomvy = -sqrt2og*s2v*sgm1u-2.0f*h1m1og*c2v*su;
+ den = 1.0f/(1.0f-0.5f*(float)M_SQRT2*d*s2v*sgu);
den2 = den*den;
- denu = 0.5*M_SQRT2*d*g*cgu*s2v;
- denv = M_SQRT2*d*sgu*c2v;
+ denu = 0.5f*(float)M_SQRT2*d*g*cgu*s2v;
+ denv = (float)M_SQRT2*d*sgu*c2v;
xx[0] = nomx*den;
xx[1] = nomy*den;
xx[2] = cv2*den-oz;
/* Avoid degenerate tangential plane basis vectors. */
- if (0.5*M_PI-fabs(v) < FLT_EPSILON)
+ if (0.5f*(float)M_PI-fabsf(v) < 10.0f*(float)FLT_EPSILON)
{
- if (0.5*M_PI-v < FLT_EPSILON)
- v = 0.5*M_PI-FLT_EPSILON;
+ if (0.5f*(float)M_PI-v < 10.0f*(float)FLT_EPSILON)
+ v = 0.5f*(float)M_PI-10.0f*(float)FLT_EPSILON;
else
- v = -0.5*M_PI+FLT_EPSILON;
- cv = cos(v);
- c2v = cos(2.0*v);
- s2v = sin(2.0*v);
+ v = -0.5f*(float)M_PI+10.0f*(float)FLT_EPSILON;
+ cv = cosf(v);
+ c2v = cosf(2.0f*v);
+ s2v = sinf(2.0f*v);
cv2 = cv*cv;
nomx = sqrt2og*cv2*cgm1u+h1m1og*s2v*cu;
nomy = sqrt2og*cv2*sgm1u-h1m1og*s2v*su;
nomux = -sqrt2og*cv2*gm1*sgm1u-h1m1og*s2v*su;
nomuy = sqrt2og*cv2*gm1*cgm1u-h1m1og*s2v*cu;
- nomvx = -sqrt2og*s2v*cgm1u+2.0*h1m1og*c2v*cu;
- nomvy = -sqrt2og*s2v*sgm1u-2.0*h1m1og*c2v*su;
- den = 1.0/(1.0-0.5*M_SQRT2*d*s2v*sgu);
+ nomvx = -sqrt2og*s2v*cgm1u+2.0f*h1m1og*c2v*cu;
+ nomvy = -sqrt2og*s2v*sgm1u-2.0f*h1m1og*c2v*su;
+ den = 1.0f/(1.0f-0.5f*(float)M_SQRT2*d*s2v*sgu);
den2 = den*den;
- denu = 0.5*M_SQRT2*d*g*cgu*s2v;
- denv = M_SQRT2*d*sgu*c2v;
+ denu = 0.5f*(float)M_SQRT2*d*g*cgu*s2v;
+ denv = (float)M_SQRT2*d*sgu*c2v;
}
xxu[0] = nomux*den+nomx*denu*den2;
xxu[1] = nomuy*den+nomy*denu*den2;
@@ -934,9 +1263,9 @@ static int roman_boy(ModeInfo *mi, double umin, double umax,
xxv[2] = -s2v*den+cv2*denv*den2;
for (l=0; l<3; l++)
{
- r = 0.0;
- s = 0.0;
- t = 0.0;
+ r = 0.0f;
+ s = 0.0f;
+ t = 0.0f;
for (m=0; m<3; m++)
{
r += mat[l][m]*xx[m];
@@ -950,7 +1279,7 @@ static int roman_boy(ModeInfo *mi, double umin, double umax,
n[0] = pu[1]*pv[2]-pu[2]*pv[1];
n[1] = pu[2]*pv[0]-pu[0]*pv[2];
n[2] = pu[0]*pv[1]-pu[1]*pv[0];
- t = 1.0/sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
+ t = 1.0f/sqrtf(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
n[0] *= t;
n[1] *= t;
n[2] *= t;
@@ -983,56 +1312,56 @@ static int roman_boy(ModeInfo *mi, double umin, double umax,
color(pp,v*(5.0/6.0),matc,&pp->col[4*o]);
}
if (g & 1)
- v = 0.5*M_PI-0.25*v;
+ v = 0.5f*(float)M_PI-0.25f*v;
else
- v = 0.5*M_PI-0.5*v;
- sqrt2og = M_SQRT2/g;
- h1m1og = 0.5*(1.0-1.0/g);
- gm1 = g-1.0;
- cu = cos(u);
- su = sin(u);
- cgu = cos(g*u);
- sgu = sin(g*u);
- cgm1u = cos(gm1*u);
- sgm1u = sin(gm1*u);
- cv = cos(v);
- c2v = cos(2.0*v);
- s2v = sin(2.0*v);
+ v = 0.5f*(float)M_PI-0.5f*v;
+ sqrt2og = (float)M_SQRT2/g;
+ h1m1og = 0.5f*(1.0f-1.0f/g);
+ gm1 = g-1.0f;
+ cu = cosf(u);
+ su = sinf(u);
+ cgu = cosf(g*u);
+ sgu = sinf(g*u);
+ cgm1u = cosf(gm1*u);
+ sgm1u = sinf(gm1*u);
+ cv = cosf(v);
+ c2v = cosf(2.0f*v);
+ s2v = sinf(2.0f*v);
cv2 = cv*cv;
nomx = sqrt2og*cv2*cgm1u+h1m1og*s2v*cu;
nomy = sqrt2og*cv2*sgm1u-h1m1og*s2v*su;
nomux = -sqrt2og*cv2*gm1*sgm1u-h1m1og*s2v*su;
nomuy = sqrt2og*cv2*gm1*cgm1u-h1m1og*s2v*cu;
- nomvx = -sqrt2og*s2v*cgm1u+2.0*h1m1og*c2v*cu;
- nomvy = -sqrt2og*s2v*sgm1u-2.0*h1m1og*c2v*su;
- den = 1.0/(1.0-0.5*M_SQRT2*d*s2v*sgu);
+ nomvx = -sqrt2og*s2v*cgm1u+2.0f*h1m1og*c2v*cu;
+ nomvy = -sqrt2og*s2v*sgm1u-2.0f*h1m1og*c2v*su;
+ den = 1.0f/(1.0f-0.5f*(float)M_SQRT2*d*s2v*sgu);
den2 = den*den;
- denu = 0.5*M_SQRT2*d*g*cgu*s2v;
- denv = M_SQRT2*d*sgu*c2v;
+ denu = 0.5f*(float)M_SQRT2*d*g*cgu*s2v;
+ denv = (float)M_SQRT2*d*sgu*c2v;
xx[0] = nomx*den;
xx[1] = nomy*den;
xx[2] = cv2*den-oz;
/* Avoid degenerate tangential plane basis vectors. */
- if (0.5*M_PI-fabs(v) < FLT_EPSILON)
+ if (0.5f*(float)M_PI-fabsf(v) < 10.0f*(float)FLT_EPSILON)
{
- if (0.5*M_PI-v < FLT_EPSILON)
- v = 0.5*M_PI-FLT_EPSILON;
+ if (0.5f*(float)M_PI-v < 10.0f*(float)FLT_EPSILON)
+ v = 0.5f*(float)M_PI-10.0f*(float)FLT_EPSILON;
else
- v = -0.5*M_PI+FLT_EPSILON;
- cv = cos(v);
- c2v = cos(2.0*v);
- s2v = sin(2.0*v);
+ v = -0.5f*(float)M_PI+10.0f*(float)FLT_EPSILON;
+ cv = cosf(v);
+ c2v = cosf(2.0f*v);
+ s2v = sinf(2.0f*v);
cv2 = cv*cv;
nomx = sqrt2og*cv2*cgm1u+h1m1og*s2v*cu;
nomy = sqrt2og*cv2*sgm1u-h1m1og*s2v*su;
nomux = -sqrt2og*cv2*gm1*sgm1u-h1m1og*s2v*su;
nomuy = sqrt2og*cv2*gm1*cgm1u-h1m1og*s2v*cu;
- nomvx = -sqrt2og*s2v*cgm1u+2.0*h1m1og*c2v*cu;
- nomvy = -sqrt2og*s2v*sgm1u-2.0*h1m1og*c2v*su;
- den = 1.0/(1.0-0.5*M_SQRT2*d*s2v*sgu);
+ nomvx = -sqrt2og*s2v*cgm1u+2.0f*h1m1og*c2v*cu;
+ nomvy = -sqrt2og*s2v*sgm1u-2.0f*h1m1og*c2v*su;
+ den = 1.0f/(1.0f-0.5f*(float)M_SQRT2*d*s2v*sgu);
den2 = den*den;
- denu = 0.5*M_SQRT2*d*g*cgu*s2v;
- denv = M_SQRT2*d*sgu*c2v;
+ denu = 0.5f*(float)M_SQRT2*d*g*cgu*s2v;
+ denv = (float)M_SQRT2*d*sgu*c2v;
}
xxu[0] = nomux*den+nomx*denu*den2;
xxu[1] = nomuy*den+nomy*denu*den2;
@@ -1042,9 +1371,9 @@ static int roman_boy(ModeInfo *mi, double umin, double umax,
xxv[2] = -s2v*den+cv2*denv*den2;
for (l=0; l<3; l++)
{
- r = 0.0;
- s = 0.0;
- t = 0.0;
+ r = 0.0f;
+ s = 0.0f;
+ t = 0.0f;
for (m=0; m<3; m++)
{
r += mat[l][m]*xx[m];
@@ -1058,7 +1387,7 @@ static int roman_boy(ModeInfo *mi, double umin, double umax,
n[0] = pu[1]*pv[2]-pu[2]*pv[1];
n[1] = pu[2]*pv[0]-pu[0]*pv[2];
n[2] = pu[0]*pv[1]-pu[1]*pv[0];
- t = 1.0/sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
+ t = 1.0f/sqrtf(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
n[0] *= t;
n[1] *= t;
n[2] *= t;
@@ -1087,7 +1416,7 @@ static int roman_boy(ModeInfo *mi, double umin, double umax,
{
for (k=0; k<=1; k++)
{
- l = (i+k);
+ l = i+k;
m = j;
o = l*(numu+1)+m;
glTexCoord2fv(&pp->tex[2*o]);
@@ -1099,11 +1428,13 @@ static int roman_boy(ModeInfo *mi, double umin, double umax,
}
glNormal3fv(&pp->pn[3*o]);
glVertex3fv(&pp->pp[3*o]);
- polys++;
}
}
glEnd();
}
+ polys = 2*numv*(numu+1);
+ if (pp->appearance == APPEARANCE_DISTANCE_BANDS)
+ polys /= 2;
}
else /* pp->appearance == APPEARANCE_DIRECTION_BANDS */
{
@@ -1120,7 +1451,7 @@ static int roman_boy(ModeInfo *mi, double umin, double umax,
for (k=0; k<=1; k++)
{
l = i;
- m = (j+k);
+ m = j+k;
o = l*(numu+1)+m;
glTexCoord2fv(&pp->tex[2*o]);
if (pp->colors != COLORS_ONESIDED && pp->colors != COLORS_TWOSIDED)
@@ -1131,26 +1462,525 @@ static int roman_boy(ModeInfo *mi, double umin, double umax,
}
glNormal3fv(&pp->pn[3*o]);
glVertex3fv(&pp->pp[3*o]);
- polys++;
}
}
glEnd();
}
+ polys = numu*(numv+1);
+ }
+
+ return polys;
+}
+
+
+#ifdef HAVE_GLSL
+
+/* Draw a 3d immersion of the projective plane using OpenGL's programmable
+ functionality. */
+static int roman_boy_pf(ModeInfo *mi, double umin, double umax,
+ double vmin, double vmax, int numu, int numv)
+{
+ static const GLfloat light_model_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
+ static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+ static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
+ static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_oneside[] = { 0.9, 0.4, 0.3, 1.0 };
+ static const GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.7 };
+ static const GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 };
+ static const GLfloat mat_diff_trans_oneside[] = { 0.9, 0.4, 0.3, 0.7 };
+ static const GLfloat mat_diff_white[] = { 1.0, 1.0, 1.0, 1.0 };
+ GLfloat light_direction[3], half_vector[3], len;
+ GLfloat p_mat[16], mv_mat[16], rot_mat[16];
+ float mat_diff_dyn[4], mat_diff_dyn_compl[4];
+ float mat[3][3], matc[3][3];
+ int i, j, k, l, m, o, g;
+ float u, v, ur, vr, oz;
+ float r;
+ float d, dd, radius;
+ float qu[4], r1[3][3], r2[3][3];
+ GLsizeiptr index_offset;
+ romanboystruct *pp = &romanboy[MI_SCREEN(mi)];
+ int polys;
+
+ if (!pp->use_shaders)
+ return 0;
+
+ g = pp->g;
+ dd = pp->dd;
+ d = ((6.0f*dd-15.0f)*dd+10.0f)*dd*dd*dd;
+ r = 1.0f+d*d*(1.0f/2.0f+d*d*(1.0f/6.0f+d*d*(1.0f/3.0f)));
+ radius = 1.0f/r;
+ oz = 0.5f*r;
+
+ if (!pp->buffers_initialized)
+ {
+ /* The u and v values need to be computed once (or each time the value
+ of appearance changes, once we support that). */
+ ur = umax-umin;
+ vr = vmax-vmin;
+ for (i=0; i<=numv; i++)
+ {
+ for (j=0; j<=numu; j++)
+ {
+ o = i*(numu+1)+j;
+ if (pp->appearance != APPEARANCE_DIRECTION_BANDS)
+ u = ur*j/numu+umin;
+ else
+ u = -ur*j/numu+umin;
+ v = vr*i/numv+vmin;
+ if (g & 1)
+ v = 0.5f*(float)M_PI-0.25f*v;
+ else
+ v = 0.5f*(float)M_PI-0.5f*v;
+ pp->uv[2*o+0] = u;
+ pp->uv[2*o+1] = v;
+ }
+ }
+ glBindBuffer(GL_ARRAY_BUFFER,pp->vertex_uv_buffer);
+ glBufferData(GL_ARRAY_BUFFER,2*(numu+1)*(numv+1)*sizeof(GLfloat),
+ pp->uv,GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+
+ glBindBuffer(GL_ARRAY_BUFFER,pp->vertex_t_buffer);
+ glBufferData(GL_ARRAY_BUFFER,2*(numu+1)*(numv+1)*sizeof(GLfloat),
+ pp->tex,GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+
+ if (!pp->change_colors &&
+ pp->colors != COLORS_ONESIDED && pp->colors != COLORS_TWOSIDED)
+ {
+ glBindBuffer(GL_ARRAY_BUFFER,pp->color_buffer);
+ glBufferData(GL_ARRAY_BUFFER,4*(numu+1)*(numv+1)*sizeof(GLfloat),
+ pp->col,GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+ }
+
+ /* The indices only need to be computed once (or each time the value of
+ appearance changes, once we support that). */
+ pp->ni = 0;
+ pp->ne = 0;
+ pp->nt = 0;
+ if (pp->display_mode != DISP_WIREFRAME)
+ {
+ if (pp->appearance != APPEARANCE_DIRECTION_BANDS)
+ {
+ for (i=0; i<numv; i++)
+ {
+ if (pp->appearance == APPEARANCE_DISTANCE_BANDS &&
+ ((i & (NUMB-1)) >= NUMB/4) && ((i & (NUMB-1)) < 3*NUMB/4))
+ continue;
+ for (j=0; j<=numu; j++)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = i+k;
+ m = j;
+ o = l*(numu+1)+m;
+ pp->indices[pp->ni++] = o;
+ }
+ }
+ pp->ne++;
+ }
+ pp->nt = 2*(numu+1);
+ }
+ else /* pp->appearance == APPEARANCE_DIRECTION_BANDS */
+ {
+ for (j=0; j<numu; j++)
+ {
+ if ((j & (NUMB-1)) >= NUMB/2)
+ continue;
+ for (i=0; i<=numv; i++)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = i;
+ m = j+k;
+ o = l*(numu+1)+m;
+ pp->indices[pp->ni++] = o;
+ }
+ }
+ pp->ne++;
+ }
+ pp->nt = 2*(numv+1);
+ }
+ }
+ else /* pp->display_mode == DISP_WIREFRAME */
+ {
+ if (pp->appearance != APPEARANCE_DIRECTION_BANDS)
+ {
+ for (i=0; i<=numv; i++)
+ {
+ if (pp->appearance == APPEARANCE_DISTANCE_BANDS &&
+ ((i & (NUMB-1)) > NUMB/4) && ((i & (NUMB-1)) < 3*NUMB/4))
+ continue;
+ if (pp->appearance == APPEARANCE_DISTANCE_BANDS &&
+ ((i & (NUMB-1)) == NUMB/4))
+ {
+ for (j=0; j<numu; j++)
+ {
+ pp->indices[pp->ni++] = i*(numu+1)+j;
+ pp->indices[pp->ni++] = i*(numu+1)+j+1;
+ }
+ continue;
+ }
+ for (j=0; j<numu; j++)
+ {
+ pp->indices[pp->ni++] = i*(numu+1)+j;
+ pp->indices[pp->ni++] = i*(numu+1)+j+1;
+ if (i < numv)
+ {
+ pp->indices[pp->ni++] = i*(numu+1)+j;
+ pp->indices[pp->ni++] = (i+1)*(numu+1)+j;
+ }
+ }
+ }
+ }
+ else /* pp->appearance == APPEARANCE_DIRECTION_BANDS */
+ {
+ for (j=0; j<numu; j++)
+ {
+ if ((j & (NUMB-1)) > NUMB/2)
+ continue;
+ if ((j & (NUMB-1)) == NUMB/2)
+ {
+ for (i=0; i<numv; i++)
+ {
+ pp->indices[pp->ni++] = i*(numu+1)+j;
+ pp->indices[pp->ni++] = (i+1)*(numu+1)+j;
+ }
+ continue;
+ }
+ for (i=0; i<=numv; i++)
+ {
+ pp->indices[pp->ni++] = i*(numu+1)+j;
+ pp->indices[pp->ni++] = i*(numu+1)+j+1;
+ if (i < numv)
+ {
+ pp->indices[pp->ni++] = i*(numu+1)+j;
+ pp->indices[pp->ni++] = (i+1)*(numu+1)+j;
+ }
+ }
+ }
+ }
+ pp->ne = 1;
+ }
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,pp->indices_buffer);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER,pp->ni*sizeof(GLuint),
+ pp->indices,GL_STATIC_DRAW);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
+
+ pp->buffers_initialized = True;
+ }
+
+ if (pp->change_colors)
+ rotateall(pp->rho,pp->sigma,pp->tau,matc);
+
+ if (pp->view == VIEW_WALK)
+ {
+ /* Compute the walk frame. */
+ compute_walk_frame(pp,g,d,radius,oz,mat);
+ }
+ else
+ {
+ /* Compute the rotation that rotates the projective plane in 3D,
+ including the trackball rotations. */
+ rotateall(pp->alpha,pp->beta,pp->delta,r1);
+
+ gltrackball_get_quaternion(pp->trackball,qu);
+ quat_to_rotmat(qu,r2);
+
+ mult_rotmat(r2,r1,mat);
+ }
+
+ if (pp->change_colors &&
+ (pp->colors == COLORS_DIRECTION || pp->colors == COLORS_DISTANCE))
+ {
+ ur = umax-umin;
+ vr = vmax-vmin;
+ for (i=0; i<=numv; i++)
+ {
+ for (j=0; j<=numu; j++)
+ {
+ o = i*(numu+1)+j;
+ if (pp->appearance != APPEARANCE_DIRECTION_BANDS)
+ u = ur*j/numu+umin;
+ else
+ u = -ur*j/numu+umin;
+ v = vr*i/numv+vmin;
+ if (pp->colors == COLORS_DIRECTION)
+ color(pp,2.0*M_PI-fmod(2.0*u,2.0*M_PI),matc,&pp->col[4*o]);
+ else if (pp->colors == COLORS_DISTANCE)
+ color(pp,v*(5.0/6.0),matc,&pp->col[4*o]);
+ }
+ }
+ }
+
+ glUseProgram(pp->shader_program);
+
+ glUniform1i(pp->g_index,g);
+ glUniform1f(pp->d_index,d);
+
+ glsl_Identity(p_mat);
+ if (pp->projection == DISP_PERSPECTIVE || pp->view == VIEW_WALK)
+ {
+ if (pp->view == VIEW_WALK)
+ glsl_Perspective(p_mat,60.0f,pp->aspect,0.01f,10.0f);
+ else
+ glsl_Perspective(p_mat,60.0f,pp->aspect,0.1f,10.0f);
+ }
+ else
+ {
+ if (pp->aspect >= 1.0)
+ glsl_Orthographic(p_mat,-pp->aspect,pp->aspect,-1.0f,1.0f,
+ 0.1f,10.0f);
+ else
+ glsl_Orthographic(p_mat,-1.0f,1.0f,-1.0f/pp->aspect,1.0f/pp->aspect,
+ 0.1f,10.0f);
+ }
+ glUniformMatrix4fv(pp->mat_p_index,1,GL_FALSE,p_mat);
+ glsl_Identity(rot_mat);
+ for (i=0; i<3; i++)
+ for (j=0; j<3; j++)
+ rot_mat[GLSL__LINCOOR(i,j,4)] = mat[i][j];
+ glsl_Identity(mv_mat);
+ glsl_Translate(mv_mat,pp->offset3d[0],pp->offset3d[1],pp->offset3d[2]);
+ glsl_Scale(mv_mat,radius,radius,radius);
+ glsl_MultMatrix(mv_mat,rot_mat);
+ glsl_Translate(mv_mat,0.0f,0.0f,-oz);
+ glUniformMatrix4fv(pp->mat_mv_index,1,GL_FALSE,mv_mat);
+
+ len = sqrtf(light_position[0]*light_position[0]+
+ light_position[1]*light_position[1]+
+ light_position[2]*light_position[2]);
+ light_direction[0] = light_position[0]/len;
+ light_direction[1] = light_position[1]/len;
+ light_direction[2] = light_position[2]/len;
+ half_vector[0] = light_direction[0];
+ half_vector[1] = light_direction[1];
+ half_vector[2] = light_direction[2]+1.0f;
+ len = sqrtf(half_vector[0]*half_vector[0]+
+ half_vector[1]*half_vector[1]+
+ half_vector[2]*half_vector[2]);
+ half_vector[0] /= len;
+ half_vector[1] /= len;
+ half_vector[2] /= len;
+
+ glUniform4fv(pp->front_ambient_index,1,mat_diff_white);
+ glUniform4fv(pp->front_diffuse_index,1,mat_diff_white);
+ glUniform4fv(pp->back_ambient_index,1,mat_diff_white);
+ glUniform4fv(pp->back_diffuse_index,1,mat_diff_white);
+ glVertexAttrib4f(pp->color_index,1.0f,1.0f,1.0f,1.0f);
+
+ if (pp->display_mode == DISP_SURFACE)
+ {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glDepthMask(GL_TRUE);
+ glDisable(GL_BLEND);
+ glUniform4fv(pp->glbl_ambient_index,1,light_model_ambient);
+ glUniform4fv(pp->lt_ambient_index,1,light_ambient);
+ glUniform4fv(pp->lt_diffuse_index,1,light_diffuse);
+ glUniform4fv(pp->lt_specular_index,1,light_specular);
+ glUniform3fv(pp->lt_direction_index,1,light_direction);
+ glUniform3fv(pp->lt_halfvect_index,1,half_vector);
+ glUniform4fv(pp->specular_index,1,mat_specular);
+ glUniform1f(pp->shininess_index,50.0f);
+ glUniform1i(pp->draw_lines_index,GL_FALSE);
+ }
+ else if (pp->display_mode == DISP_TRANSPARENT)
+ {
+ glDisable(GL_DEPTH_TEST);
+ glDepthMask(GL_FALSE);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ glUniform4fv(pp->glbl_ambient_index,1,light_model_ambient);
+ glUniform4fv(pp->lt_ambient_index,1,light_ambient);
+ glUniform4fv(pp->lt_diffuse_index,1,light_diffuse);
+ glUniform4fv(pp->lt_specular_index,1,light_specular);
+ glUniform3fv(pp->lt_direction_index,1,light_direction);
+ glUniform3fv(pp->lt_halfvect_index,1,half_vector);
+ glUniform4fv(pp->specular_index,1,mat_specular);
+ glUniform1f(pp->shininess_index,50.0f);
+ glUniform1i(pp->draw_lines_index,GL_FALSE);
+ }
+ else /* pp->display_mode == DISP_WIREFRAME */
+ {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glDepthMask(GL_TRUE);
+ glDisable(GL_BLEND);
+ glUniform1i(pp->draw_lines_index,GL_TRUE);
+ }
+
+ if (pp->marks)
+ glEnable(GL_TEXTURE_2D);
+ else
+ glDisable(GL_TEXTURE_2D);
+
+ if (!pp->change_colors)
+ {
+ if (pp->colors == COLORS_ONESIDED)
+ {
+ if (pp->display_mode == DISP_TRANSPARENT)
+ {
+ glUniform4fv(pp->front_ambient_index,1,mat_diff_trans_oneside);
+ glUniform4fv(pp->front_diffuse_index,1,mat_diff_trans_oneside);
+ glUniform4fv(pp->back_ambient_index,1,mat_diff_trans_oneside);
+ glUniform4fv(pp->back_diffuse_index,1,mat_diff_trans_oneside);
+ }
+ else if (pp->display_mode == DISP_SURFACE)
+ {
+ glUniform4fv(pp->front_ambient_index,1,mat_diff_oneside);
+ glUniform4fv(pp->front_diffuse_index,1,mat_diff_oneside);
+ glUniform4fv(pp->back_ambient_index,1,mat_diff_oneside);
+ glUniform4fv(pp->back_diffuse_index,1,mat_diff_oneside);
+ }
+ else /* pp->display_mode == DISP_WIREFRAME */
+ {
+ glVertexAttrib4fv(pp->color_index,mat_diff_oneside);
+ }
+ }
+ else if (pp->colors == COLORS_TWOSIDED)
+ {
+ if (pp->display_mode == DISP_TRANSPARENT)
+ {
+ glUniform4fv(pp->front_ambient_index,1,mat_diff_trans_red);
+ glUniform4fv(pp->front_diffuse_index,1,mat_diff_trans_red);
+ glUniform4fv(pp->back_ambient_index,1,mat_diff_trans_green);
+ glUniform4fv(pp->back_diffuse_index,1,mat_diff_trans_green);
+ }
+ else if (pp->display_mode == DISP_SURFACE)
+ {
+ glUniform4fv(pp->front_ambient_index,1,mat_diff_red);
+ glUniform4fv(pp->front_diffuse_index,1,mat_diff_red);
+ glUniform4fv(pp->back_ambient_index,1,mat_diff_green);
+ glUniform4fv(pp->back_diffuse_index,1,mat_diff_green);
+ }
+ else /* pp->display_mode == DISP_WIREFRAME */
+ {
+ glVertexAttrib4fv(pp->color_index,mat_diff_red);
+ }
+ }
+ }
+ else /* pp->change_colors */
+ {
+ color(pp,0.0,matc,mat_diff_dyn);
+ if (pp->colors == COLORS_ONESIDED)
+ {
+ if (pp->display_mode == DISP_TRANSPARENT ||
+ pp->display_mode == DISP_SURFACE)
+ {
+ glUniform4fv(pp->front_ambient_index,1,mat_diff_dyn);
+ glUniform4fv(pp->front_diffuse_index,1,mat_diff_dyn);
+ glUniform4fv(pp->back_ambient_index,1,mat_diff_dyn);
+ glUniform4fv(pp->back_diffuse_index,1,mat_diff_dyn);
+ }
+ else /* pp->display_mode == DISP_WIREFRAME */
+ {
+ glVertexAttrib4fv(pp->color_index,mat_diff_dyn);
+ }
+ }
+ else if (pp->colors == COLORS_TWOSIDED)
+ {
+ if (pp->display_mode == DISP_TRANSPARENT ||
+ pp->display_mode == DISP_SURFACE)
+ {
+ mat_diff_dyn_compl[0] = 1.0f-mat_diff_dyn[0];
+ mat_diff_dyn_compl[1] = 1.0f-mat_diff_dyn[1];
+ mat_diff_dyn_compl[2] = 1.0f-mat_diff_dyn[2];
+ mat_diff_dyn_compl[3] = mat_diff_dyn[3];
+ glUniform4fv(pp->front_ambient_index,1,mat_diff_dyn);
+ glUniform4fv(pp->front_diffuse_index,1,mat_diff_dyn);
+ glUniform4fv(pp->back_ambient_index,1,mat_diff_dyn_compl);
+ glUniform4fv(pp->back_diffuse_index,1,mat_diff_dyn_compl);
+ }
+ else /* pp->display_mode == DISP_WIREFRAME */
+ {
+ glVertexAttrib4fv(pp->color_index,mat_diff_dyn);
+ }
+ }
+ }
+
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D,pp->tex_name);
+ glUniform1i(pp->texture_sampler_index,0);
+ glUniform1i(pp->bool_textures_index,marks);
+
+ glEnableVertexAttribArray(pp->vertex_uv_index);
+ glBindBuffer(GL_ARRAY_BUFFER,pp->vertex_uv_buffer);
+ glVertexAttribPointer(pp->vertex_uv_index,2,GL_FLOAT,GL_FALSE,0,0);
+
+ glEnableVertexAttribArray(pp->vertex_t_index);
+ glBindBuffer(GL_ARRAY_BUFFER,pp->vertex_t_buffer);
+ glVertexAttribPointer(pp->vertex_t_index,2,GL_FLOAT,GL_FALSE,0,0);
+
+ if (pp->colors != COLORS_ONESIDED && pp->colors != COLORS_TWOSIDED)
+ {
+ glEnableVertexAttribArray(pp->color_index);
+ glBindBuffer(GL_ARRAY_BUFFER,pp->color_buffer);
+ if (pp->change_colors)
+ glBufferData(GL_ARRAY_BUFFER,4*(numu+1)*(numv+1)*sizeof(GLfloat),
+ pp->col,GL_STREAM_DRAW);
+ glVertexAttribPointer(pp->color_index,4,GL_FLOAT,GL_FALSE,0,0);
+ }
+
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,pp->indices_buffer);
+
+ if (pp->display_mode != DISP_WIREFRAME)
+ {
+ for (i=0; i<pp->ne; i++)
+ {
+ index_offset = pp->nt*i*sizeof(GLuint);
+ glDrawElements(GL_TRIANGLE_STRIP,pp->nt,GL_UNSIGNED_INT,
+ (const GLvoid *)index_offset);
+ }
+ }
+ else /* pp->display_mode == DISP_WIREFRAME */
+ {
+ glLineWidth(1.0f);
+ index_offset = 0;
+ glDrawElements(GL_LINES,pp->ni,GL_UNSIGNED_INT,
+ (const void *)index_offset);
+ }
+
+ glDisableVertexAttribArray(pp->vertex_uv_index);
+ glDisableVertexAttribArray(pp->vertex_t_index);
+ if (pp->colors != COLORS_ONESIDED && pp->colors != COLORS_TWOSIDED)
+ glDisableVertexAttribArray(pp->color_index);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
+
+ glUseProgram(0);
+
+ if (pp->appearance != APPEARANCE_DIRECTION_BANDS)
+ {
+ polys = 2*numv*(numu+1);
+ if (pp->appearance == APPEARANCE_DISTANCE_BANDS)
+ polys /= 2;
+ }
+ else /* pp->appearance == APPEARANCE_DIRECTION_BANDS */
+ {
+ polys = numu*(numv+1);
}
- polys /= 2;
return polys;
}
+#endif /* HAVE_GLSL */
+
/* Generate a texture image that shows the orientation reversal. */
static void gen_texture(ModeInfo *mi)
{
romanboystruct *pp = &romanboy[MI_SCREEN(mi)];
+ glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glGenTextures(1,&pp->tex_name);
glBindTexture(GL_TEXTURE_2D,pp->tex_name);
- glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
@@ -1161,13 +1991,151 @@ static void gen_texture(ModeInfo *mi)
}
+#ifdef HAVE_GLSL
+
+static void init_glsl(ModeInfo *mi)
+{
+ romanboystruct *pp = &romanboy[MI_SCREEN(mi)];
+ GLint gl_major, gl_minor, glsl_major, glsl_minor;
+ GLboolean gl_gles3;
+ const GLchar *vertex_shader_source[3];
+ const GLchar *fragment_shader_source[4];
+
+ pp->uv = calloc(2*pp->g*(NUMU+1)*(NUMV+1),sizeof(float));
+ pp->indices = calloc(4*pp->g*(NUMU+1)*(NUMV+1),sizeof(float));
+
+ /* Determine whether to use shaders to render the projective plane. */
+ pp->use_shaders = False;
+ pp->buffers_initialized = False;
+ pp->shader_program = 0;
+ pp->ni = 0;
+ pp->ne = 0;
+ pp->nt = 0;
+
+ if (!glsl_GetGlAndGlslVersions(&gl_major,&gl_minor,&glsl_major,&glsl_minor,
+ &gl_gles3))
+ return;
+ if (!gl_gles3)
+ {
+ if (gl_major < 3 ||
+ (glsl_major < 1 || (glsl_major == 1 && glsl_minor < 30)))
+ {
+ if ((gl_major < 2 || (gl_major == 2 && gl_minor < 1)) ||
+ (glsl_major < 1 || (glsl_major == 1 && glsl_minor < 20)))
+ return;
+ /* We have at least OpenGL 2.1 and at least GLSL 1.20. */
+ vertex_shader_source[0] = shader_version_2_1;
+ vertex_shader_source[1] = vertex_shader_attribs_2_1;
+ vertex_shader_source[2] = vertex_shader_main;
+ fragment_shader_source[0] = shader_version_2_1;
+ fragment_shader_source[1] = fragment_shader_attribs_2_1;
+ fragment_shader_source[2] = fragment_shader_main;
+ fragment_shader_source[3] = fragment_shader_out_2_1;
+ }
+ else
+ {
+ /* We have at least OpenGL 3.0 and at least GLSL 1.30. */
+ vertex_shader_source[0] = shader_version_3_0;
+ vertex_shader_source[1] = vertex_shader_attribs_3_0;
+ vertex_shader_source[2] = vertex_shader_main;
+ fragment_shader_source[0] = shader_version_3_0;
+ fragment_shader_source[1] = fragment_shader_attribs_3_0;
+ fragment_shader_source[2] = fragment_shader_main;
+ fragment_shader_source[3] = fragment_shader_out_3_0;
+ }
+ }
+ else /* gl_gles3 */
+ {
+ if (gl_major < 3 || glsl_major < 3)
+ return;
+ /* We have at least OpenGL ES 3.0 and at least GLSL ES 3.0. */
+ vertex_shader_source[0] = shader_version_3_0_es;
+ vertex_shader_source[1] = vertex_shader_attribs_3_0;
+ vertex_shader_source[2] = vertex_shader_main;
+ fragment_shader_source[0] = shader_version_3_0_es;
+ fragment_shader_source[1] = fragment_shader_attribs_3_0;
+ fragment_shader_source[2] = fragment_shader_main;
+ fragment_shader_source[3] = fragment_shader_out_3_0;
+ }
+ if (!glsl_CompileAndLinkShaders(3,vertex_shader_source,
+ 4,fragment_shader_source,
+ &pp->shader_program))
+ return;
+ pp->vertex_uv_index = glGetAttribLocation(pp->shader_program,"VertexUV");
+ pp->vertex_t_index = glGetAttribLocation(pp->shader_program,"VertexT");
+ pp->color_index = glGetAttribLocation(pp->shader_program,"VertexColor");
+ if (pp->vertex_uv_index == -1 || pp->vertex_t_index == -1 ||
+ pp->color_index == -1)
+ {
+ glDeleteProgram(pp->shader_program);
+ return;
+ }
+ pp->mat_mv_index = glGetUniformLocation(pp->shader_program,
+ "MatModelView");
+ pp->mat_p_index = glGetUniformLocation(pp->shader_program,
+ "MatProj");
+ pp->g_index = glGetUniformLocation(pp->shader_program,
+ "G");
+ pp->d_index = glGetUniformLocation(pp->shader_program,
+ "D");
+ pp->bool_textures_index = glGetUniformLocation(pp->shader_program,
+ "BoolTextures");
+ pp->draw_lines_index = glGetUniformLocation(pp->shader_program,
+ "DrawLines");
+ pp->glbl_ambient_index = glGetUniformLocation(pp->shader_program,
+ "LtGlblAmbient");
+ pp->lt_ambient_index = glGetUniformLocation(pp->shader_program,
+ "LtAmbient");
+ pp->lt_diffuse_index = glGetUniformLocation(pp->shader_program,
+ "LtDiffuse");
+ pp->lt_specular_index = glGetUniformLocation(pp->shader_program,
+ "LtSpecular");
+ pp->lt_direction_index = glGetUniformLocation(pp->shader_program,
+ "LtDirection");
+ pp->lt_halfvect_index = glGetUniformLocation(pp->shader_program,
+ "LtHalfVector");
+ pp->front_ambient_index = glGetUniformLocation(pp->shader_program,
+ "MatFrontAmbient");
+ pp->back_ambient_index = glGetUniformLocation(pp->shader_program,
+ "MatBackAmbient");
+ pp->front_diffuse_index = glGetUniformLocation(pp->shader_program,
+ "MatFrontDiffuse");
+ pp->back_diffuse_index = glGetUniformLocation(pp->shader_program,
+ "MatBackDiffuse");
+ pp->specular_index = glGetUniformLocation(pp->shader_program,
+ "MatSpecular");
+ pp->shininess_index = glGetUniformLocation(pp->shader_program,
+ "MatShininess");
+ pp->texture_sampler_index = glGetUniformLocation(pp->shader_program,
+ "TextureSampler");
+ if (pp->mat_mv_index == -1 || pp->mat_p_index == -1 ||
+ pp->g_index == -1 || pp->d_index == -1 ||
+ pp->bool_textures_index == -1 || pp->draw_lines_index == -1 ||
+ pp->glbl_ambient_index == -1 || pp->lt_ambient_index == -1 ||
+ pp->lt_diffuse_index == -1 || pp->lt_specular_index == -1 ||
+ pp->lt_direction_index == -1 || pp->lt_halfvect_index == -1 ||
+ pp->front_ambient_index == -1 || pp->back_ambient_index == -1 ||
+ pp->front_diffuse_index == -1 || pp->back_diffuse_index == -1 ||
+ pp->specular_index == -1 || pp->shininess_index == -1 ||
+ pp->texture_sampler_index == -1)
+ {
+ glDeleteProgram(pp->shader_program);
+ return;
+ }
+
+ glGenBuffers(1,&pp->vertex_uv_buffer);
+ glGenBuffers(1,&pp->vertex_t_buffer);
+ glGenBuffers(1,&pp->color_buffer);
+ glGenBuffers(1,&pp->indices_buffer);
+
+ pp->use_shaders = True;
+}
+
+#endif /* HAVE_GLSL */
+
+
static void init(ModeInfo *mi)
{
- static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
- static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
- static const GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
- static const GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
- static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
romanboystruct *pp = &romanboy[MI_SCREEN(mi)];
if (deform_speed == 0.0)
@@ -1214,84 +2182,28 @@ static void init(ModeInfo *mi)
pp->offset3d[1] = 0.0;
pp->offset3d[2] = -1.8;
+ pp->pp = calloc(3*pp->g*(NUMU+1)*(NUMV+1),sizeof(float));
+ pp->pn = calloc(3*pp->g*(NUMU+1)*(NUMV+1),sizeof(float));
+ pp->col = calloc(4*pp->g*(NUMU+1)*(NUMV+1),sizeof(float));
+ pp->tex = calloc(2*pp->g*(NUMU+1)*(NUMV+1),sizeof(float));
+
gen_texture(mi);
setup_roman_boy_color_texture(mi,0.0,2.0*M_PI,0.0,2.0*M_PI,pp->g*NUMU,NUMV);
- if (pp->marks)
- glEnable(GL_TEXTURE_2D);
- else
- glDisable(GL_TEXTURE_2D);
+#ifdef HAVE_GLSL
+ init_glsl(mi);
+#endif /* HAVE_GLSL */
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- if (pp->projection == DISP_PERSPECTIVE || pp->view == VIEW_WALK)
- {
- if (pp->view == VIEW_WALK)
- gluPerspective(60.0,1.0,0.01,10.0);
- else
- gluPerspective(60.0,1.0,0.1,10.0);
- }
- else
- {
- glOrtho(-1.0,1.0,-1.0,1.0,0.1,10.0);
- }
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
-# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
- if (pp->display_mode == DISP_WIREFRAME)
+#ifdef HAVE_ANDROID
+ /* glPolygonMode(...,GL_LINE) is not supported for an OpenGL ES 1.1
+ context. */
+ if (!pp->use_shaders && pp->display_mode == DISP_WIREFRAME)
pp->display_mode = DISP_SURFACE;
-# endif
-
- if (pp->display_mode == DISP_SURFACE)
- {
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LESS);
- glShadeModel(GL_SMOOTH);
- glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
- glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
- glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
- glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
- glLightfv(GL_LIGHT0,GL_POSITION,light_position);
- glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
- glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
- glDepthMask(GL_TRUE);
- glDisable(GL_BLEND);
- }
- else if (pp->display_mode == DISP_TRANSPARENT)
- {
- glDisable(GL_DEPTH_TEST);
- glShadeModel(GL_SMOOTH);
- glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
- glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
- glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
- glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
- glLightfv(GL_LIGHT0,GL_POSITION,light_position);
- glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
- glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
- glDepthMask(GL_FALSE);
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE);
- }
- else /* pp->display_mode == DISP_WIREFRAME */
- {
- glDisable(GL_DEPTH_TEST);
- glShadeModel(GL_FLAT);
- glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
- glDisable(GL_LIGHTING);
- glDisable(GL_LIGHT0);
- glDisable(GL_BLEND);
- }
+#endif /* HAVE_GLSL */
}
-/* Redisplay the Klein bottle. */
+/* Redisplay the projective plane. */
static void display_romanboy(ModeInfo *mi)
{
romanboystruct *pp = &romanboy[MI_SCREEN(mi)];
@@ -1369,26 +2281,14 @@ static void display_romanboy(ModeInfo *mi)
}
}
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- if (pp->projection == DISP_PERSPECTIVE || pp->view == VIEW_WALK)
- {
- if (pp->view == VIEW_WALK)
- gluPerspective(60.0,pp->aspect,0.01,10.0);
- else
- gluPerspective(60.0,pp->aspect,0.1,10.0);
- }
+#ifdef HAVE_GLSL
+ if (pp->use_shaders)
+ mi->polygon_count = roman_boy_pf(mi,0.0,2.0*M_PI,0.0,2.0*M_PI,
+ pp->g*NUMU,NUMV);
else
- {
- if (pp->aspect >= 1.0)
- glOrtho(-pp->aspect,pp->aspect,-1.0,1.0,0.1,10.0);
- else
- glOrtho(-1.0,1.0,-1.0/pp->aspect,1.0/pp->aspect,0.1,10.0);
- }
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- mi->polygon_count = roman_boy(mi,0.0,2.0*M_PI,0.0,2.0*M_PI,pp->g*NUMU,NUMV);
+#endif /* HAVE_GLSL */
+ mi->polygon_count = roman_boy_ff(mi,0.0,2.0*M_PI,0.0,2.0*M_PI,
+ pp->g*NUMU,NUMV);
}
@@ -1459,11 +2359,6 @@ ENTRYPOINT void init_romanboy(ModeInfo *mi)
else
pp->g = surface_order;
- pp->pp = calloc(3*pp->g*(NUMU+1)*(NUMV+1),sizeof(float));
- pp->pn = calloc(3*pp->g*(NUMU+1)*(NUMV+1),sizeof(float));
- pp->col = calloc(4*pp->g*(NUMU+1)*(NUMV+1),sizeof(float));
- pp->tex = calloc(2*pp->g*(NUMU+1)*(NUMV+1),sizeof(float));
-
pp->trackball = gltrackball_init(True);
pp->button_pressed = False;
@@ -1595,7 +2490,6 @@ ENTRYPOINT void init_romanboy(ModeInfo *mi)
if ((pp->glx_context = init_GL(mi)) != NULL)
{
reshape_romanboy(mi,MI_WIDTH(mi),MI_HEIGHT(mi));
- glDrawBuffer(GL_BACK);
init(mi);
}
else
@@ -1625,6 +2519,8 @@ ENTRYPOINT void draw_romanboy(ModeInfo *mi)
glXMakeCurrent(display, window, *pp->glx_context);
+ glClearColor(0.0f,0.0f,0.0f,1.0f);
+ glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
@@ -1639,12 +2535,19 @@ ENTRYPOINT void draw_romanboy(ModeInfo *mi)
}
-/*
- *-----------------------------------------------------------------------------
- * The display is being taken away from us. Free up malloc'ed
- * memory and X resources that we've alloc'ed.
- *-----------------------------------------------------------------------------
- */
+#ifndef STANDALONE
+ENTRYPOINT void change_romanboy(ModeInfo *mi)
+{
+ romanboystruct *pp = &romanboy[MI_SCREEN(mi)];
+
+ if (!pp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *pp->glx_context);
+ init(mi);
+}
+#endif /* !STANDALONE */
+
ENTRYPOINT void free_romanboy(ModeInfo *mi)
{
@@ -1659,20 +2562,24 @@ ENTRYPOINT void free_romanboy(ModeInfo *mi)
if (pp->tex) free(pp->tex);
gltrackball_free (pp->trackball);
if (pp->tex_name) glDeleteTextures (1, &pp->tex_name);
+#ifdef HAVE_GLSL
+ if (pp->uv) free(pp->uv);
+ if (pp->indices) free(pp->indices);
+ if (pp->use_shaders)
+ {
+ glDeleteBuffers(1,&pp->vertex_uv_buffer);
+ glDeleteBuffers(1,&pp->vertex_t_buffer);
+ glDeleteBuffers(1,&pp->color_buffer);
+ glDeleteBuffers(1,&pp->indices_buffer);
+ if (pp->shader_program != 0)
+ {
+ glUseProgram(0);
+ glDeleteProgram(pp->shader_program);
+ }
+ }
+#endif /* HAVE_GLSL */
}
-#ifndef STANDALONE
-ENTRYPOINT void change_romanboy(ModeInfo *mi)
-{
- romanboystruct *pp = &romanboy[MI_SCREEN(mi)];
-
- if (!pp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *pp->glx_context);
- init(mi);
-}
-#endif /* !STANDALONE */
XSCREENSAVER_MODULE ("RomanBoy", romanboy)
diff --git a/hacks/glx/romanboy.man b/hacks/glx/romanboy.man
index e4e947b..b066e0e 100644
--- a/hacks/glx/romanboy.man
+++ b/hacks/glx/romanboy.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-romanboy - Draws a 3d immersion of the real projective plane that
+romanboy \- Draws a 3d immersion of the real projective plane that
smoothly deforms between the Roman surface and the Boy surface.
.SH SYNOPSIS
.B romanboy
@@ -48,7 +48,7 @@ The \fIromanboy\fP program shows a 3d immersion of the real projective
plane that smoothly deforms between the Roman surface and the Boy
surface. You can walk on the projective plane or turn in 3d. The
smooth deformation (homotopy) between these two famous immersions of
-the real projective plane was constructed by Franois Apry.
+the real projective plane was constructed by François Apéry.
.PP
The real projective plane is a non-orientable surface. To make this
apparent, the two-sided color mode can be used. Alternatively,
@@ -172,7 +172,7 @@ case is a surface order of 2, which results in an immersion of the
halfway model of Morin's sphere eversion (if the deformation is
switched off).
.PP
-This program is inspired by Franois Apry's book "Models of the Real
+This program is inspired by François Apéry's book "Models of the Real
Projective Plane", Vieweg, 1987.
.SH OPTIONS
.I romanboy
diff --git a/hacks/glx/rubik.c b/hacks/glx/rubik.c
index e0182cf..3be93c5 100644
--- a/hacks/glx/rubik.c
+++ b/hacks/glx/rubik.c
@@ -2010,6 +2010,16 @@ draw_rubik(ModeInfo * mi)
glScalef (h, h, h);
}
}
+# else
+ {
+ /* Don't understand why this clause doesn't work on mobile, but it
+ doesn't. */
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glRotatef (current_device_rotation(), 0, 0, 1);
+ glScalef (s, s, s);
+ }
# endif
gltrackball_rotate (rp->trackball);
diff --git a/hacks/glx/rubik.man b/hacks/glx/rubik.man
index 08e5b94..d4777df 100644
--- a/hacks/glx/rubik.man
+++ b/hacks/glx/rubik.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-rubik - screen saver that solves Rubik's Cube.
+rubik \- screen saver that solves Rubik's Cube.
.SH SYNOPSIS
.B rubik
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/rubikblocks.c b/hacks/glx/rubikblocks.c
index 6082f09..6dcf2a3 100644
--- a/hacks/glx/rubikblocks.c
+++ b/hacks/glx/rubikblocks.c
@@ -46,9 +46,6 @@
#define BORDER 5
#define BORDER2 (BORDER*BORDER)
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#define rnd01() ((int)(random()%2))
/*************************************************************************/
@@ -279,6 +276,16 @@ draw_main(ModeInfo *mi, rubikblocks_conf *cp)
if (o != 0 && o != 180 && o != -180)
glScalef (1/h, 1/h, 1/h);
}
+# else
+ {
+ /* Don't understand why this clause doesn't work on mobile, but it
+ doesn't. */
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glRotatef (current_device_rotation(), 0, 0, 1);
+ glScalef (s, s, s);
+ }
# endif
if(cp->wire) glColor3f(0.7, 0.7, 0.7);
diff --git a/hacks/glx/rubikblocks.man b/hacks/glx/rubikblocks.man
index c18d18f..febdd7c 100644
--- a/hacks/glx/rubikblocks.man
+++ b/hacks/glx/rubikblocks.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "04-Feb-09" "X Version 11"
.SH NAME
-rubikblocks - animates the Rubik's Mirror Blocks puzzle
+rubikblocks \- animates the Rubik's Mirror Blocks puzzle
.SH SYNOPSIS
.B rubikblocks
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/sballs.c b/hacks/glx/sballs.c
index e0fccd3..8252e5c 100644
--- a/hacks/glx/sballs.c
+++ b/hacks/glx/sballs.c
@@ -554,19 +554,23 @@ static void Draw(ModeInfo * mi)
glColor3f(0, 0, 0);
}
glBegin(GL_QUAD_STRIP);
-#ifndef HAVE_MOBILE
- /* Letterbox the background image */
- glNormal3f(0, 0, 1); glTexCoord2f(0,0); glVertex3f(8, 4.1, -4);
- glNormal3f(0, 0, 1); glTexCoord2f(0,1); glVertex3f(8, -4.1, -4);
- glNormal3f(0, 0, 1); glTexCoord2f(1,0); glVertex3f(-8, 4.1, -4);
- glNormal3f(0, 0, 1); glTexCoord2f(1,1); glVertex3f(-8, -4.1, -4);
-#else
- /* Fill the iPhone screen. Letterboxing looks dumb there. */
- glNormal3f(0, 0, 1); glTexCoord2f(0,0); glVertex3f(4, 5.2, -4);
- glNormal3f(0, 0, 1); glTexCoord2f(0,1); glVertex3f(4, -5.2, -4);
- glNormal3f(0, 0, 1); glTexCoord2f(1,0); glVertex3f(-4, 5.2, -4);
- glNormal3f(0, 0, 1); glTexCoord2f(1,1); glVertex3f(-4, -5.2, -4);
-#endif
+ if (MI_WIDTH(mi) > MI_HEIGHT(mi))
+ {
+ /* Letterbox the background image */
+ glNormal3f(0, 0, 1); glTexCoord2f(0,0); glVertex3f(8, 4.1, -4);
+ glNormal3f(0, 0, 1); glTexCoord2f(0,1); glVertex3f(8, -4.1, -4);
+ glNormal3f(0, 0, 1); glTexCoord2f(1,0); glVertex3f(-8, 4.1, -4);
+ glNormal3f(0, 0, 1); glTexCoord2f(1,1); glVertex3f(-8, -4.1, -4);
+ }
+ else
+ {
+ /* Fill the iPhone screen. Letterboxing looks dumb there. */
+ glNormal3f(0, 0, 1); glTexCoord2f(0,0); glVertex3f(4, 5.2, -4);
+ glNormal3f(0, 0, 1); glTexCoord2f(0,1); glVertex3f(4, -5.2, -4);
+ glNormal3f(0, 0, 1); glTexCoord2f(1,0); glVertex3f(-4, 5.2, -4);
+ glNormal3f(0, 0, 1); glTexCoord2f(1,1); glVertex3f(-4, -5.2, -4);
+ }
+
glEnd();
mi->polygon_count++;
diff --git a/hacks/glx/sballs.man b/hacks/glx/sballs.man
index 33cb942..5f8161a 100644
--- a/hacks/glx/sballs.man
+++ b/hacks/glx/sballs.man
@@ -1,19 +1,6 @@
-.de EX \"Begin example
-.ne 5
-.if n .sp 1
-.if t .sp .5
-.nf
-.in +.5i
-..
-.de EE
-.fi
-.in -.5i
-.if n .sp 1
-.if t .sp .5
-..
.TH XScreenSaver 1 "03-Oct-01" "X Version 11"
.SH NAME
-sballs - draws balls spinning like crazy in GL
+sballs \- draws balls spinning like crazy in GL
.SH SYNOPSIS
.B sballs
[\-display \fIhost:display.screen\fP] [\-window] [\-root]
diff --git a/hacks/glx/sierpinski3d.c b/hacks/glx/sierpinski3d.c
index 3740f22..588e504 100644
--- a/hacks/glx/sierpinski3d.c
+++ b/hacks/glx/sierpinski3d.c
@@ -48,9 +48,6 @@ static const char sccsid[] = "@(#)sierpinski3D.c 00.01 99/11/04 xlockmore";
#include "rotator.h"
#include "gltrackball.h"
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
static int max_depth;
static int speed;
static Bool do_spin;
@@ -404,13 +401,12 @@ reshape_gasket(ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
diff --git a/hacks/glx/sierpinski3d.man b/hacks/glx/sierpinski3d.man
index ed3b69a..c92dcd6 100644
--- a/hacks/glx/sierpinski3d.man
+++ b/hacks/glx/sierpinski3d.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-sierpinski3d - 3D Sierpinski triangle fractal.
+sierpinski3d \- 3D Sierpinski triangle fractal.
.SH SYNOPSIS
.B sierpinski3d
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/skytentacles.c b/hacks/glx/skytentacles.c
index 272a447..34057df 100644
--- a/hacks/glx/skytentacles.c
+++ b/hacks/glx/skytentacles.c
@@ -15,8 +15,6 @@
"*wireframe: False \n" \
# define release_tentacles 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "colors.h"
diff --git a/hacks/glx/skytentacles.man b/hacks/glx/skytentacles.man
index 2e5cd16..7845f34 100644
--- a/hacks/glx/skytentacles.man
+++ b/hacks/glx/skytentacles.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-skytentacles - 3D tentacles from the sky!
+skytentacles \- 3D tentacles from the sky!
.SH SYNOPSIS
.B skytentacles
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/sonar-icmp.c b/hacks/glx/sonar-icmp.c
index 658074b..b23b6bf 100644
--- a/hacks/glx/sonar-icmp.c
+++ b/hacks/glx/sonar-icmp.c
@@ -1,4 +1,4 @@
-/* sonar, Copyright (c) 1998-2020 Jamie Zawinski and Stephen Martin
+/* sonar, Copyright © 1998-2021 Jamie Zawinski and Stephen Martin
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -18,11 +18,15 @@
#undef usleep /* conflicts with unistd.h on OSX */
-#ifdef USE_IPHONE
+#ifdef HAVE_IPHONE
/* Note: to get this to compile for iPhone, you need to fix Xcode!
The icmp headers exist for the simulator build environment, but
not for the real-device build environment. This appears to
- just be an Apple bug, not intentional.
+ just be an Apple bug, not intentional. But it has existed for
+ many years.
+
+ The "ICMP Sanity Check" build phase in the Xcode project checks
+ this and tells you what to do.
xc=/Applications/Xcode.app/Contents
for path in /Developer/Platforms/iPhone*?/Developer/SDKs/?* \
@@ -452,12 +456,13 @@ read_hosts_file (sonar_sensor_data *ssd, const char *filename)
fp = fopen(filename, "r");
if (!fp)
{
- char buf2[1024];
- sprintf(buf2, "%s: %s", progname, filename);
#ifdef HAVE_JWXYZ
if (pd->debug_p) /* on OSX don't syslog this */
#endif
- perror (buf2);
+ {
+ char *str_error = strerror(errno);
+ fprintf(stderr, "%s: %s: %s", progname, filename, str_error);
+ }
return 0;
}
@@ -1248,7 +1253,7 @@ get_ping (sonar_sensor_data *ssd)
if (strlen(s) > 28)
{
s2 = s + strlen(s) - 28;
- strncpy (s2, "...", 3);
+ memcpy (s2, "...", 3);
}
fprintf (stdout,
"%3d bytes from %28s: icmp_seq=%-4d time=%s\n",
@@ -1494,8 +1499,13 @@ parse_mode (sonar_sensor_data *ssd, char **error_ret, char **desc_ret,
if (!ping_works_p)
{
+# ifdef HAVE_LIBCAP
*error_ret = strdup ("Sonar must be setuid or libcap to ping!\n"
"Running simulation instead.");
+# else
+ *error_ret = strdup ("Sonar must be setuid to ping!\n"
+ "Running simulation instead.");
+# endif
return 0;
}
@@ -1656,20 +1666,33 @@ sonar_init_ping (Display *dpy, char **error_ret, char **desc_ret,
/* Create the ICMP socket. Do this before dropping privs.
- Raw sockets can only be opened by root (or setuid root), so we
- only try to do this when the effective uid is 0.
+ Raw sockets can only be opened by root (or setuid root), so we only try
+ to do this when the effective uid is 0.
+
+ We used to just always try, and notice the failure. But apparently that
+ causes "SELinux" to log spurious warnings when running with the "strict"
+ policy. So to avoid that, we just don't try unless we know it will work.
+
+ On MacOS X, we can avoid the whole problem by using a non-privileged
+ datagram instead of a raw socket.
+
+ On recent Linux systems (2012-ish?) we can avoid setuid by instead using
+ cap_set_flag(... CAP_NET_RAW). To make that call the executable needs to
+ have "sudo setcap cap_net_raw=p sonar" done to it first.
- We used to just always try, and notice the failure. But apparently
- that causes "SELinux" to log spurious warnings when running with the
- "strict" policy. So to avoid that, we just don't try unless we
- know it will work.
+ Except, it turns out that $MESA_LOADER_DRIVER_OVERRIDE would then let you
+ run arbitrary other programs with access to raw sockets. It's possible
+ that un-setting $MESA_LOADER_DRIVER_OVERRIDE early in main() would prevent
+ this, but Mesa uses a ton of environment variables, and who knows what
+ other crap is lurking in there. So that's just great.
- On MacOS X, we can avoid the whole problem by using a
- non-privileged datagram instead of a raw socket.
+ Ironically, being setuid root is *more* secure, as Mesa happens to contain
+ code that says, "Hey, maybe I shouldn't link in arbitrary other .so files
+ when I'm root".
- On recent Linux systems (2012-ish?) we can avoid setuid by instead
- using cap_set_flag(... CAP_NET_RAW). To make that call the executable
- needs to have "sudo setcap cap_net_raw=p sonar" done to it first.
+ This trick does not work with $LD_PRELOAD because the kernel checks auxv
+ for AT_SECURE and won't run $LD_PRELOAD if setcap is in use, whereas Mesa
+ only checks geteuid.
*/
if (global_icmpsock)
{
@@ -1735,7 +1758,7 @@ sonar_init_ping (Display *dpy, char **error_ret, char **desc_ret,
if (! *error_ret)
*error_ret = strdup ("No hosts to ping!\n"
"Simulating instead.");
- if (pd) ping_free_data (ssd, pd);
+ ping_free_data (ssd, pd);
if (ssd) free (ssd);
return 0;
}
diff --git a/hacks/glx/sonar.c b/hacks/glx/sonar.c
index e4e0b86..5b1df31 100644
--- a/hacks/glx/sonar.c
+++ b/hacks/glx/sonar.c
@@ -51,7 +51,7 @@
* - plot IM contacts or Facebook friends and their last-activity times.
*/
-#define DEF_FONT "-*-courier-bold-r-normal-*-*-480-*-*-*-*-iso8859-1"
+#define DEF_FONT "monospace bold 48"
#define DEF_SPEED "1.0"
#define DEF_SWEEP_SIZE "0.3"
#define DEF_FONT_SIZE "12"
@@ -77,8 +77,6 @@
# define release_sonar 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#ifdef HAVE_UNISTD_H
# include <unistd.h> /* for setuid() */
@@ -439,7 +437,12 @@ draw_text (ModeInfo *mi, const char *string, GLfloat r, GLfloat th,
free (string2);
- if (! wire) glEnable (GL_DEPTH_TEST);
+ if (! wire)
+ {
+ glEnable (GL_DEPTH_TEST);
+ glEnable (GL_LIGHTING);
+ glEnable (GL_BLEND);
+ }
return polys;
}
@@ -934,12 +937,9 @@ init_sensor (ModeInfo *mi)
sp->ssd = sonar_init_ping (MI_DISPLAY (mi), &sp->error, &sp->desc,
ping_arg, ping_timeout, resolve_p, times_p,
debug_p);
- else
- { /* Disavow privs if not pinging. */
- if (setuid(getuid()) == -1) abort();
- }
- setuid(getuid());
+ /* Might have done this already, but disavow in simulation mode too. */
+ if (setuid(getuid()) == -1) abort();
sp->start_time = double_time (); /* for error message timing */
diff --git a/hacks/glx/sonar.man b/hacks/glx/sonar.man
index 9927b3b..00de3d2 100644
--- a/hacks/glx/sonar.man
+++ b/hacks/glx/sonar.man
@@ -1,19 +1,6 @@
-.de EX \"Begin example
-.ne 5
-.if n .sp 1
-.if t .sp .5
-.nf
-.in +.5i
-..
-.de EE
-.fi
-.in -.5i
-.if n .sp 1
-.if t .sp .5
-..
.TH Sonar 1 "12-Aug-08" "X Version 11"
.SH NAME
-sonar - display a sonar scope
+sonar \- display a sonar scope
.SH SYNOPSIS
.B sonar
[\-ping \fIhosts-or-subnets\fP]
@@ -119,20 +106,8 @@ In simulation mode, the number of bogies on team B.
.TP 8
.B \-fps
Display the current frame rate, polygon count, and CPU load.
-.SH NOTES
-On most Unix systems, this program must be installed as setuid root
-in order to ping hosts. This is because root privileges are needed
-to create an ICMP RAW socket. Privileges are disavowed shortly after
-startup (just after connecting to the X server) so this is believed
-to be safe:
-.EX
-chown root:root sonar
-chmod u+s sonar
-.EE
-It is not necessary to make it setuid on MacOS systems, because on
-MacOS, unprivileged programs can ping by using ICMP DGRAM sockets
-instead of ICMP RAW.
+.PP
In ping-mode, the display is a logarithmic scale, calibrated so that the
three rings represent ping times of approximately 2.5, 70 and 2,000
milliseconds respectively.
@@ -141,6 +116,32 @@ This means that if any the hosts you are pinging take longer than 2
seconds to respond, they won't show up; and if you are pinging several
hosts with very fast response times, they will all appear close to the
center of the screen (making their names hard to read.)
+
+.SH INSTALLATION
+For this program to be able to ping other hosts, it must have the
+ability to open ICMP sockets, which is usually an action that requires
+additional privileges.
+
+If your system has
+.BR setcap (8)
+then this permission can be added with
+.nf
+.sp
+ setcap cap_net_raw=p sonar
+.sp
+.fi
+Otherwise, the program must be setuid root in order to ping hosts.
+Privileges are disavowed shortly after startup (just after connecting
+to the X server) so this is believed to be safe:
+.nf
+.sp
+ chown root:root sonar
+ chmod u+s sonar
+.sp
+.fi
+It is not necessary to use setcap or setuid on macOS systems, as
+unprivileged programs can ping by using ICMP DGRAM sockets instead
+of ICMP RAW.
.SH BUGS
Does not support IPv6.
.SH SEE ALSO
@@ -149,7 +150,7 @@ Does not support IPv6.
.BR ping (8),
.BR ping6 (8)
.SH COPYRIGHT
-Copyright \(co 2000-2012 by Jamie Zawinski <jwz@jwz.org>
+Copyright \(co 2000-2021 by Jamie Zawinski <jwz@jwz.org>
.RE
Copyright \(co 1998 by Stephen Martin. <smartin@canada.com>
diff --git a/hacks/glx/sphere.c b/hacks/glx/sphere.c
index dee4541..0e485f2 100644
--- a/hacks/glx/sphere.c
+++ b/hacks/glx/sphere.c
@@ -17,26 +17,12 @@
* 21-Aug-10 jwz@jwz.org Converted to use glDrawArrays, for OpenGL ES.
*/
+#include "screenhackI.h"
+#include "sphere.h"
+
#include <math.h>
#include <stdlib.h>
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#ifdef HAVE_COCOA
-#elif defined(HAVE_ANDROID)
-# include <GLES/gl.h>
-#else /* real X11 */
-# include <GL/gl.h>
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
-#include "sphere.h"
-
typedef struct { GLfloat x, y, z; } XYZ;
static int
diff --git a/hacks/glx/sphereeversion.c b/hacks/glx/sphereeversion.c
new file mode 100644
index 0000000..cd58275
--- /dev/null
+++ b/hacks/glx/sphereeversion.c
@@ -0,0 +1,3339 @@
+/* sphereeversion --- Shows a sphere eversion, i.e., a smooth deformation
+ (homotopy) that turns a sphere inside out. During the eversion, the
+ deformed sphere is allowed to intersect itself transversally. However,
+ no creases or pinch points are allowed to occur. */
+
+#if 0
+static const char sccsid[] = "@(#)sphereeversion.c 1.1 20/03/22 xlockmore";
+#endif
+
+/* Copyright (c) 2020-2021 Carsten Steger <carsten@mirsanmir.org>. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * REVISION HISTORY:
+ * C. Steger - 20/03/22: Initial version
+ * C. Steger - 20/04/10: Added blending between visualization modes
+ * C. Steger - 20/06/01: Removed blending because accumulation buffers have
+ * * been deprecated since OpenGL 3.0
+ * C. Steger - 20/07/26: Make the polygon offset work under OpenGL ES
+ * C. Steger - 20/08/03: Add an easing function for one part of the animation
+ * C. Steger - 20/10/11: Add easing functions for more parts of the animation
+ * C. Steger - 21/01/03: Added per-fragment shading
+ * C. Steger - 21/01/05: Added blending between visualization modes using
+ * multiple render passes
+ */
+
+/*
+ * This program shows a sphere eversion, i.e., a smooth deformation
+ * (homotopy) that turns a sphere inside out. During the eversion,
+ * the deformed sphere is allowed to intersect itself transversally.
+ * However, no creases or pinch points are allowed to occur.
+ *
+ * The deformed sphere can be projected to the screen either
+ * perspectively or orthographically.
+ *
+ * There are three display modes for the sphere: solid, transparent,
+ * or random. If random mode is selected, the mode is changed each
+ * time an eversion has been completed.
+ *
+ * The appearance of the sphere can be as a solid object, as a set of
+ * see-through bands, or random. The bands can be parallel bands or
+ * meridian bands, i.e., bands that run along the parallels (lines of
+ * latitude) or bands that run along the meridians (lines of
+ * longitude) of the sphere. If random mode is selected, the
+ * appearance is changed each time an eversion has been completed.
+ *
+ * It is also possible to display a graticule (i.e., a coordinate grid
+ * consisting of parallel and meridian lines) on top of the surface.
+ * The graticule mode can be set to on, off, or random. If random
+ * mode is selected, the graticule mode is changed each time an
+ * eversion has been completed.
+ *
+ * It is possible to define a surface order of the sphere eversion as
+ * random or as a value between 2 and 5. This determines the the
+ * complexity of the deformation. For higher surface orders, some
+ * z-fighting might occur around the central stage of the eversion,
+ * which might lead to some irregular flickering of the displayed
+ * surface if it is displayed as a solid object. For odd surface
+ * orders, z-fighting will occur very close to the central stage of
+ * the eversion since the deformed sphere is a doubly covered Boy
+ * surface (for surface order 3) or a doubly covered generalized Boy
+ * surface (for surface order 5) in this case. If you find this
+ * distracting, you should set the surface order to 2. If a random
+ * surface order is selected, the surface order is changed each time
+ * an eversion has been completed.
+ *
+ * The colors with with the sphere is drawn can be set to two-sided,
+ * parallel, meridian, or random. In two-sided mode, the sphere is
+ * drawn with red on one side and green on the other side. In
+ * parallel mode, the sphere is displayed with colors that run from
+ * red to cyan on one side of the surface and from green to violet on
+ * the other side. The colors are aligned with the parallels of the
+ * sphere in this mode. In meridian mode, the the sphere is displayed
+ * with colors that run from red to white to cyan to black and back to
+ * red on one side of the surface and from green to white to violet to
+ * black and back to green on the other side. The colors are aligned
+ * with the meridians of the sphere in this mode. If random mode is
+ * selected, the color scheme is changed each time an eversion has
+ * been completed.
+ *
+ * By default, the sphere is rotated to a new viewing position each
+ * time an eversion has been completed. In addition, it is possible
+ * to rotate the sphere while it is deforming. The rotation speed for
+ * each of the three coordinate axes around which the sphere rotates
+ * can be chosen arbitrarily. For best effects, however, it is
+ * suggested to rotate only around the z axis while the sphere is
+ * deforming.
+ *
+ * This program is inspired by the following paper: Adam Bednorz,
+ * Witold Bednorz: "Analytic sphere eversion using ruled surfaces",
+ * Differential Geometry and its Applications 64:59-79, 2019.
+ */
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+#define DISP_SURFACE 0
+#define DISP_TRANSPARENT 1
+#define NUM_DISPLAY_MODES 2
+
+#define APPEARANCE_SOLID 0
+#define APPEARANCE_PARALLEL_BANDS 1
+#define APPEARANCE_MERIDIAN_BANDS 2
+#define NUM_APPEARANCES 3
+
+#define COLORS_TWOSIDED 0
+#define COLORS_PARALLEL 1
+#define COLORS_MERIDIAN 2
+#define NUM_COLORS 3
+
+#define DISP_PERSPECTIVE 0
+#define DISP_ORTHOGRAPHIC 1
+#define NUM_DISP_MODES 2
+
+#define DEF_DISPLAY_MODE "random"
+#define DEF_APPEARANCE "random"
+#define DEF_GRATICULE "random"
+#define DEF_COLORS "random"
+#define DEF_PROJECTION "random"
+#define DEF_SPEEDX "0.0"
+#define DEF_SPEEDY "0.0"
+#define DEF_SPEEDZ "0.0"
+#define DEF_DEFORM_SPEED "10.0"
+#define DEF_SURFACE_ORDER "random"
+
+
+/* For some strange reason, the color buffer must be initialized
+ and used on macOS. Otherwise one- and two-sided lighting will
+ not work. */
+#if (defined(HAVE_COCOA) || defined(__APPLE__)) && !defined(HAVE_IPHONE)
+#define VERTEXATTRIBARRAY_WORKAROUND
+#endif
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 10000 \n" \
+ "*showFPS: False \n" \
+ "*prefersGLSL: True \n" \
+
+# define release_sphereeversion 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#include "glsl-utils.h"
+#include "gltrackball.h"
+#include "pow2.h"
+
+#include <float.h>
+
+
+#ifdef USE_MODULES
+ModStruct sphereeversion_description =
+{"sphereeversion", "init_sphereeversion", "draw_sphereeversion",
+ NULL, "draw_sphereeversion", "change_sphereeversion",
+ "free_sphereeversion", &sphereeversion_opts, 25000, 1, 1, 1, 1.0, 4, "",
+ "Show a sphere eversion", 0, NULL};
+
+#endif
+
+
+static char *mode;
+static char *appear;
+static char *color_mode;
+static char *graticule;
+static char *proj;
+static float speed_x;
+static float speed_y;
+static float speed_z;
+static float deform_speed;
+static char *surface_order;
+
+
+static XrmOptionDescRec opts[] =
+{
+ {"-mode", ".displayMode", XrmoptionSepArg, 0 },
+ {"-surface", ".displayMode", XrmoptionNoArg, "surface" },
+ {"-transparent", ".displayMode", XrmoptionNoArg, "transparent" },
+ {"-appearance", ".appearance", XrmoptionSepArg, 0 },
+ {"-solid", ".appearance", XrmoptionNoArg, "solid" },
+ {"-parallel-bands", ".appearance", XrmoptionNoArg, "parallel-bands" },
+ {"-meridian-bands", ".appearance", XrmoptionNoArg, "meridian-bands" },
+ {"-graticule", ".graticule", XrmoptionSepArg, 0 },
+ {"-colors", ".colors", XrmoptionSepArg, 0 },
+ {"-twosided-colors", ".colors", XrmoptionNoArg, "two-sided" },
+ {"-parallel-colors", ".colors", XrmoptionNoArg, "parallel" },
+ {"-meridian-colors", ".colors", XrmoptionNoArg, "meridian" },
+ {"-projection", ".projection", XrmoptionSepArg, 0 },
+ {"-perspective", ".projection", XrmoptionNoArg, "perspective" },
+ {"-orthographic", ".projection", XrmoptionNoArg, "orthographic" },
+ {"-speed-x", ".speedx", XrmoptionSepArg, 0 },
+ {"-speed-y", ".speedy", XrmoptionSepArg, 0 },
+ {"-speed-z", ".speedz", XrmoptionSepArg, 0 },
+ {"-deformation-speed", ".deformSpeed", XrmoptionSepArg, 0 },
+ {"-surface-order", ".surfaceOrder", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] =
+{
+ { &mode, "displayMode", "DisplayMode", DEF_DISPLAY_MODE, t_String },
+ { &appear, "appearance", "Appearance", DEF_APPEARANCE, t_String },
+ { &graticule, "graticule", "Graticule", DEF_GRATICULE, t_String },
+ { &color_mode, "colors", "Colors", DEF_COLORS, t_String },
+ { &surface_order, "surfaceOrder", "SurfaceOrder", DEF_SURFACE_ORDER, t_String },
+ { &proj, "projection", "Projection", DEF_PROJECTION, t_String },
+ { &speed_x, "speedx", "Speedx", DEF_SPEEDX, t_Float},
+ { &speed_y, "speedy", "Speedy", DEF_SPEEDY, t_Float},
+ { &speed_z, "speedz", "Speedz", DEF_SPEEDZ, t_Float},
+ { &deform_speed, "deformSpeed", "DeformSpeed", DEF_DEFORM_SPEED, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt sphereeversion_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, NULL};
+
+
+/* Shape parameters for the Bednorz sphere eversion. */
+#define BEDNORZ_OMEGA 2.0
+#define BEDNORZ_Q (2.0/3.0)
+#define BEDNORZ_ETA_MIN (3.0/4.0)
+#define BEDNORZ_BETA_MAX 0.1
+#define BEDNORZ_ALPHA 1.0
+#define BEDNORZ_EPS2 0.001
+#define BEDNORZ_EPS3 0.002
+#define BEDNORZ_EPS4 0.001
+#define BEDNORZ_EPS5 0.002
+
+#define BEDNORZ_TAU1 (1.0/BEDNORZ_Q)
+#define BEDNORZ_TAU2 2.5
+#define BEDNORZ_TAU3 4.5
+#define BEDNORZ_TAU4 6.0
+
+#define BEDNORZ_TAU_MIN (-BEDNORZ_TAU4)
+#define BEDNORZ_TAU_MAX (BEDNORZ_TAU4)
+
+/* Number of subdivisions of the surface */
+#define NUMTH 256
+#define NUMPH 256
+
+/* Number of subdivisions between grid lines */
+#define NUMGRID 32
+
+/* Number of subdivisions per band */
+#define NUMBDIR 16
+#define NUMBDIST 16
+
+/* Animation states */
+#define ANIM_DEFORM 0
+#define ANIM_TURN 1
+
+/* Angle of a single turn step */
+#define TURN_STEP 1.0
+
+typedef struct {
+ int n;
+ double kappa;
+ double omega;
+ double t;
+ double p;
+ double q;
+ double xi;
+ double eta;
+ double alpha;
+ double beta;
+ double gamma;
+ double lambda;
+ double eps;
+} bednorz_shape_par;
+
+
+typedef struct {
+ GLint WindH, WindW;
+ GLXContext *glx_context;
+ /* Options */
+ int display_mode[2];
+ Bool random_display_mode;
+ int appearance[2];
+ Bool random_appearance;
+ Bool graticule[2];
+ Bool random_graticule;
+ int colors[2];
+ Bool random_colors;
+ int projection;
+ /* 3D rotation angles */
+ float alpha, beta, delta;
+ /* Animation state */
+ int anim_state;
+ /* Deformation parameters */
+ float tau;
+ int defdir;
+ /* Turning parameters */
+ int turn_step;
+ int num_turn;
+ float qs[4], qe[4];
+ /* Two global shape parameters of the Bednorz sphere eversion */
+ float eta_min, beta_max;
+ /* The order of the Bednorz sphere eversion */
+ int g;
+ Bool random_g;
+ /* The viewing offset in 3d */
+ float offset3d[3];
+ /* The 3d coordinates of the surface and the corresponding normal vectors */
+ float *se;
+ float *sen;
+ /* The precomputed colors of the surface */
+ float *colf[2];
+ float *colb[2];
+ /* Aspect ratio of the current window */
+ float aspect;
+ /* Trackball states */
+ trackball_state *trackball;
+ Bool button_pressed;
+ /* A random factor to modify the rotation speeds */
+ float speed_scale;
+#ifdef HAVE_GLSL
+ GLuint *solid_indices, *parallel_indices;
+ GLuint *meridian_indices, *line_indices;
+ Bool use_shaders, buffers_initialized;
+ GLuint poly_shader_program;
+ GLint poly_pos_index, poly_normal_index;
+ GLint poly_colorf_index, poly_colorb_index;
+ GLint poly_mv_index, poly_proj_index;
+ GLint poly_glbl_ambient_index, poly_lt_ambient_index;
+ GLint poly_lt_diffuse_index, poly_lt_specular_index;
+ GLint poly_lt_direction_index, poly_lt_halfvect_index;
+ GLint poly_front_ambient_index, poly_back_ambient_index;
+ GLint poly_front_diffuse_index, poly_back_diffuse_index;
+ GLint poly_specular_index, poly_shininess_index;
+ GLuint line_shader_program;
+ GLint line_pos_index, line_color_index;
+ GLint line_mv_index, line_proj_index;
+ GLint max_tex_size;
+ GLuint color_textures[2];
+ GLuint blend_shader_program;
+ GLint blend_vertex_p_index, blend_vertex_t_index;
+ GLint blend_t_index, blend_sampler0_index, blend_sampler1_index;
+ GLuint vertex_pos_buffer, vertex_normal_buffer;
+ GLuint vertex_colorf_buffer[2], vertex_colorb_buffer[2];
+ GLuint solid_indices_buffer, parallel_indices_buffer;
+ GLuint meridian_indices_buffer, line_indices_buffer;
+ GLint num_solid_strips, num_solid_triangles;
+ GLint num_parallel_strips, num_parallel_triangles;
+ GLint num_meridian_strips, num_meridian_triangles;
+ GLint num_lines;
+#endif /* HAVE_GLSL */
+} sphereeversionstruct;
+
+static sphereeversionstruct *sphereeversion = (sphereeversionstruct *) NULL;
+
+
+#ifdef HAVE_GLSL
+
+/* The GLSL versions that correspond to different versions of OpenGL. */
+static const GLchar *shader_version_2_1 =
+ "#version 120\n";
+static const GLchar *shader_version_3_0 =
+ "#version 130\n";
+static const GLchar *shader_version_3_0_es =
+ "#version 300 es\n"
+ "precision highp float;\n"
+ "precision highp int;\n";
+
+/* The vertex shader code is composed of code fragments that depend on
+ the OpenGL version and code fragments that are version-independent.
+ They are concatenated by glShaderSource in the function init_glsl(). */
+static const GLchar *poly_vertex_shader_attribs_2_1 =
+ "attribute vec3 VertexPosition;\n"
+ "attribute vec3 VertexNormal;\n"
+ "attribute vec4 VertexColorF;\n"
+ "attribute vec4 VertexColorB;\n"
+ "\n"
+ "varying vec3 Normal;\n"
+ "varying vec4 ColorF;\n"
+ "varying vec4 ColorB;\n"
+ "\n";
+static const GLchar *poly_vertex_shader_attribs_3_0 =
+ "in vec3 VertexPosition;\n"
+ "in vec3 VertexNormal;\n"
+ "in vec4 VertexColorF;\n"
+ "in vec4 VertexColorB;\n"
+ "\n"
+ "out vec3 Normal;\n"
+ "out vec4 ColorF;\n"
+ "out vec4 ColorB;\n"
+ "\n";
+static const GLchar *poly_vertex_shader_main =
+ "uniform mat4 MatModelView;\n"
+ "uniform mat4 MatProj;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " ColorF = VertexColorF;\n"
+ " ColorB = VertexColorB;\n"
+ " Normal = normalize(MatModelView*vec4(VertexNormal,0.0f)).xyz;\n"
+ " vec4 Position = MatModelView*vec4(VertexPosition,1.0f);\n"
+ " gl_Position = MatProj*Position;\n"
+ "}\n";
+
+/* The fragment shader code is composed of code fragments that depend on
+ the OpenGL version and code fragments that are version-independent.
+ They are concatenated by glsl_CompileAndLinkShaders in the function
+ init_glsl(). */
+static const GLchar *poly_fragment_shader_attribs_2_1 =
+ "varying vec3 Normal;\n"
+ "varying vec4 ColorF;\n"
+ "varying vec4 ColorB;\n"
+ "\n";
+static const GLchar *poly_fragment_shader_attribs_3_0 =
+ "in vec3 Normal;\n"
+ "in vec4 ColorF;\n"
+ "in vec4 ColorB;\n"
+ "\n"
+ "out vec4 FragColor;\n"
+ "\n";
+static const GLchar *poly_fragment_shader_main =
+ "uniform vec4 LtGlblAmbient;\n"
+ "uniform vec4 LtAmbient, LtDiffuse, LtSpecular;\n"
+ "uniform vec3 LtDirection, LtHalfVector;\n"
+ "uniform vec4 MatFrontAmbient, MatBackAmbient;\n"
+ "uniform vec4 MatFrontDiffuse, MatBackDiffuse;\n"
+ "uniform vec4 MatSpecular;\n"
+ "uniform float MatShininess;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " vec3 normalDirection;\n"
+ " vec4 ambientColor, diffuseColor, sceneColor;\n"
+ " vec4 ambientLighting, diffuseReflection, specularReflection, color;\n"
+ " float ndotl, ndoth, pf;\n"
+ " \n"
+ " if (gl_FrontFacing)\n"
+ " {\n"
+ " normalDirection = normalize(Normal);\n"
+ " sceneColor = ColorF*MatFrontAmbient*LtGlblAmbient;\n"
+ " ambientColor = ColorF*MatFrontAmbient;\n"
+ " diffuseColor = ColorF*MatFrontDiffuse;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " normalDirection = -normalize(Normal);\n"
+ " sceneColor = ColorB*MatBackAmbient*LtGlblAmbient;\n"
+ " ambientColor = ColorB*MatBackAmbient;\n"
+ " diffuseColor = ColorB*MatBackDiffuse;\n"
+ " }\n"
+ " \n"
+ " ndotl = max(0.0f,dot(normalDirection,LtDirection));\n"
+ " ndoth = max(0.0f,dot(normalDirection,LtHalfVector));\n"
+ " if (ndotl == 0.0f)\n"
+ " pf = 0.0f;\n"
+ " else\n"
+ " pf = pow(ndoth,MatShininess);\n"
+ " ambientLighting = ambientColor*LtAmbient;\n"
+ " diffuseReflection = LtDiffuse*diffuseColor*ndotl;\n"
+ " specularReflection = LtSpecular*MatSpecular*pf;\n"
+ " color = sceneColor+ambientLighting+diffuseReflection+\n"
+ " specularReflection;\n";
+static const GLchar *poly_fragment_shader_out_2_1 =
+ " gl_FragColor = clamp(color,0.0f,1.0f);\n"
+ "}\n";
+static const GLchar *poly_fragment_shader_out_3_0 =
+ " FragColor = clamp(color,0.0f,1.0f);\n"
+ "}\n";
+
+/* The vertex shader code is composed of code fragments that depend on
+ the OpenGL version and code fragments that are version-independent.
+ They are concatenated by glsl_CompileAndLinkShaders in the function
+ init_glsl(). */
+static const GLchar *line_vertex_shader_attribs_2_1 =
+ "attribute vec3 VertexPosition;\n"
+ "\n";
+static const GLchar *line_vertex_shader_attribs_3_0 =
+ "in vec3 VertexPosition;\n"
+ "\n";
+static const GLchar *line_vertex_shader_main =
+ "uniform mat4 MatModelView;\n"
+ "uniform mat4 MatProj;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " vec4 Position = MatModelView*vec4(VertexPosition,1.0f);\n"
+ " gl_Position = MatProj*Position;\n"
+ "}\n";
+
+/* The fragment shader code is composed of code fragments that depend on
+ the OpenGL version and code fragments that are version-independent.
+ They are concatenated by glsl_CompileAndLinkShaders in the function
+ init_glsl(). */
+static const GLchar *line_fragment_shader_attribs_2_1 =
+ "";
+static const GLchar *line_fragment_shader_attribs_3_0 =
+ "out vec4 FragColor;\n"
+ "\n";
+static const GLchar *line_fragment_shader_main =
+ "uniform vec4 LineColor;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n";
+static const GLchar *line_fragment_shader_out_2_1 =
+ " gl_FragColor = LineColor;\n"
+ "}\n";
+static const GLchar *line_fragment_shader_out_3_0 =
+ " FragColor = LineColor;\n"
+ "}\n";
+
+/* The vertex shader code is composed of code fragments that depend on
+ the OpenGL version and code fragments that are version-independent.
+ They are concatenated by glsl_CompileAndLinkShaders in the function
+ init_glsl(). */
+static const GLchar *blend_vertex_shader_attribs_2_1 =
+ "attribute vec2 VertexP;\n"
+ "attribute vec2 VertexT;\n"
+ "\n"
+ "varying vec2 TexCoord;\n"
+ "\n";
+static const GLchar *blend_vertex_shader_attribs_3_0 =
+ "in vec2 VertexP;\n"
+ "in vec2 VertexT;\n"
+ "\n"
+ "out vec2 TexCoord;\n"
+ "\n";
+static const GLchar *blend_vertex_shader_main =
+ "void main (void)\n"
+ "{\n"
+ " gl_Position = vec4(VertexP,0.0f,1.0f);\n"
+ " TexCoord = VertexT;\n"
+ "}\n";
+
+/* The fragment shader code is composed of code fragments that depend on
+ the OpenGL version and code fragments that are version-independent.
+ They are concatenated by glsl_CompileAndLinkShaders in the function
+ init_glsl(). */
+static const GLchar *blend_fragment_shader_attribs_2_1 =
+ "varying vec2 TexCoord;\n"
+ "\n";
+static const GLchar *blend_fragment_shader_attribs_3_0 =
+ "in vec2 TexCoord;\n"
+ "\n"
+ "out vec4 FragColor;\n"
+ "\n";
+static const GLchar *blend_fragment_shader_main =
+ "uniform sampler2D TextureSampler0;"
+ "uniform sampler2D TextureSampler1;"
+ "uniform float T;"
+ "\n"
+ "void main (void)\n"
+ "{\n";
+static const GLchar *blend_fragment_shader_out_2_1 =
+ " vec3 Color0 = texture2D(TextureSampler0,TexCoord.st).rgb;\n"
+ " vec3 Color1 = texture2D(TextureSampler1,TexCoord.st).rgb;\n"
+ " gl_FragColor = vec4(T*Color0+(1.0f-T)*Color1,1.0f);\n"
+ "}\n";
+static const GLchar *blend_fragment_shader_out_3_0 =
+ " vec3 Color0 = texture(TextureSampler0,TexCoord.st).rgb;\n"
+ " vec3 Color1 = texture(TextureSampler1,TexCoord.st).rgb;\n"
+ " FragColor = vec4(T*Color0+(1.0f-T)*Color1,1.0f);\n"
+ "}\n";
+
+#endif /* HAVE_GLSL */
+
+
+/* Add a rotation around the x-axis to the matrix m. */
+static void rotatex(float m[3][3], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<3; i++)
+ {
+ u = m[i][1];
+ v = m[i][2];
+ m[i][1] = c*u+s*v;
+ m[i][2] = -s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the y-axis to the matrix m. */
+static void rotatey(float m[3][3], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<3; i++)
+ {
+ u = m[i][0];
+ v = m[i][2];
+ m[i][0] = c*u-s*v;
+ m[i][2] = s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the z-axis to the matrix m. */
+static void rotatez(float m[3][3], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<3; i++)
+ {
+ u = m[i][0];
+ v = m[i][1];
+ m[i][0] = c*u+s*v;
+ m[i][1] = -s*u+c*v;
+ }
+}
+
+
+/* Compute the rotation matrix m from the rotation angles. */
+static void rotateall(float al, float be, float de, float m[3][3])
+{
+ int i, j;
+
+ for (i=0; i<3; i++)
+ for (j=0; j<3; j++)
+ m[i][j] = (i==j);
+ rotatex(m,al);
+ rotatey(m,be);
+ rotatez(m,de);
+}
+
+
+/* Multiply two rotation matrices: o=m*n. */
+static void mult_rotmat(float m[3][3], float n[3][3], float o[3][3])
+{
+ int i, j, k;
+
+ for (i=0; i<3; i++)
+ {
+ for (j=0; j<3; j++)
+ {
+ o[i][j] = 0.0;
+ for (k=0; k<3; k++)
+ o[i][j] += m[i][k]*n[k][j];
+ }
+ }
+}
+
+
+/* Compute 3D rotation angles from a unit quaternion. */
+static void quat_to_angles(float q[4], float *alpha, float *beta, float *delta)
+{
+ double r00, r01, r02, r12, r22;
+
+ r00 = q[0]*q[0]+q[1]*q[1]-q[2]*q[2]-q[3]*q[3];
+ r01 = 2.0*(q[1]*q[2]-q[0]*q[3]);
+ r02 = 2.0*(q[1]*q[3]+q[0]*q[2]);
+ r12 = 2.0*(q[2]*q[3]-q[0]*q[1]);
+ r22 = q[0]*q[0]-q[1]*q[1]-q[2]*q[2]+q[3]*q[3];
+
+ *alpha = atan2(-r12,r22)*180.0/M_PI;
+ *beta = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
+ *delta = atan2(-r01,r00)*180.0/M_PI;
+}
+
+
+/* Compute a 3D rotation matrix from an xscreensaver unit quaternion. Note
+ that xscreensaver has a different convention for unit quaternions than
+ the one that is used in this hack. */
+static void quat_to_rotmat(float p[4], float m[3][3])
+{
+ float al, be, de;
+ double r00, r01, r02, r12, r22;
+
+ r00 = 1.0-2.0*(p[1]*p[1]+p[2]*p[2]);
+ r01 = 2.0*(p[0]*p[1]+p[2]*p[3]);
+ r02 = 2.0*(p[2]*p[0]-p[1]*p[3]);
+ r12 = 2.0*(p[1]*p[2]+p[0]*p[3]);
+ r22 = 1.0-2.0*(p[1]*p[1]+p[0]*p[0]);
+
+ al = atan2(-r12,r22)*180.0/M_PI;
+ be = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
+ de = atan2(-r01,r00)*180.0/M_PI;
+ rotateall(al,be,de,m);
+}
+
+
+/* Compute a quaternion from angles in degrees. */
+static void angles_to_quat(float alpha, float beta, float delta, float p[4])
+{
+ alpha *= M_PI/180.0;
+ beta *= M_PI/180.0;
+ delta *= M_PI/180.0;
+ p[0] = (cos(0.5*alpha)*cos(0.5*beta)*cos(0.5*delta)-
+ sin(0.5*alpha)*sin(0.5*beta)*sin(0.5*delta));
+ p[1] = (sin(0.5*alpha)*cos(0.5*beta)*cos(0.5*delta)+
+ cos(0.5*alpha)*sin(0.5*beta)*sin(0.5*delta));
+ p[2] = (cos(0.5*alpha)*sin(0.5*beta)*cos(0.5*delta)-
+ sin(0.5*alpha)*cos(0.5*beta)*sin(0.5*delta));
+ p[3] = (cos(0.5*alpha)*cos(0.5*beta)*sin(0.5*delta)+
+ sin(0.5*alpha)*sin(0.5*beta)*cos(0.5*delta));
+}
+
+
+/* Perform a spherical linear interpolation between two quaternions. */
+static void quat_slerp(float t, float qs[4], float qe[4], float q[4])
+{
+ double cos_t, sin_t, alpha, beta, theta, phi, l;
+
+ alpha = t;
+ cos_t = qs[0]*qe[0]+qs[1]*qe[1]+qs[2]*qe[2]+qs[3]*qe[3];
+ if (1.0-cos_t < FLT_EPSILON)
+ {
+ beta = 1.0-alpha;
+ }
+ else
+ {
+ theta = acos(cos_t);
+ phi = theta;
+ sin_t = sin(theta);
+ beta = sin(theta-alpha*phi)/sin_t;
+ alpha = sin(alpha*phi)/sin_t;
+ }
+ q[0] = beta*qs[0]+alpha*qe[0];
+ q[1] = beta*qs[1]+alpha*qe[1];
+ q[2] = beta*qs[2]+alpha*qe[2];
+ q[3] = beta*qs[3]+alpha*qe[3];
+ l = 1.0/sqrt(q[0]*q[0]+q[1]*q[1]+q[2]*q[2]+q[3]*q[3]);
+ q[0] *= l;
+ q[1] *= l;
+ q[2] *= l;
+ q[3] *= l;
+}
+
+
+/* Compute a fully saturated and bright color based on an angle and a color
+ rotation matrix. */
+static void color(sphereeversionstruct *se, float angle, float mat[3][3],
+ float colf[4], float colb[4])
+{
+ float ca, sa;
+ float m;
+
+ ca = cosf(angle);
+ sa = sinf(angle);
+ colf[0] = ca*mat[0][0]+sa*mat[0][2];
+ colf[1] = ca*mat[1][0]+sa*mat[1][2];
+ colf[2] = ca*mat[2][0]+sa*mat[2][2];
+ m = 0.5f/fmaxf(fmaxf(fabsf(colf[0]),fabsf(colf[1])),fabsf(colf[2]));
+ colf[0] = m*colf[0]+0.5f;
+ colf[1] = m*colf[1]+0.5f;
+ colf[2] = m*colf[2]+0.5f;
+ if (se->display_mode[0] == DISP_TRANSPARENT)
+ colf[3] = 0.7f;
+ else
+ colf[3] = 1.0f;
+
+ colb[0] = ca*mat[0][1]+sa*mat[0][2];
+ colb[1] = ca*mat[1][1]+sa*mat[1][2];
+ colb[2] = ca*mat[2][1]+sa*mat[2][2];
+ m = 0.5f/fmaxf(fmaxf(fabsf(colb[0]),fabsf(colb[1])),fabsf(colb[2]));
+ colb[0] = m*colb[0]+0.5f;
+ colb[1] = m*colb[1]+0.5f;
+ colb[2] = m*colb[2]+0.5f;
+ if (se->display_mode[0] == DISP_TRANSPARENT)
+ colb[3] = 0.7f;
+ else
+ colb[3] = 1.0f;
+}
+
+
+/* Compute the cross product between the vectors a and b. */
+static inline void cross(float a[3], float b[3], float c[3])
+{
+ c[0] = a[1]*b[2]-a[2]*b[1];
+ c[1] = a[2]*b[0]-a[0]*b[2];
+ c[2] = a[0]*b[1]-a[1]*b[0];
+}
+
+
+/* Compute x^n for integers 0 <= n <= 11 efficiently. */
+static inline double ipow(double x, int n)
+{
+ double x2, x4, x8;
+
+ switch (n)
+ {
+ case 0:
+ return 1.0;
+ case 1:
+ return x;
+ case 2:
+ x2 = x*x;
+ return x2;
+ case 3:
+ x2 = x*x;
+ return x2*x;
+ case 4:
+ x2 = x*x;
+ x4 = x2*x2;
+ return x4;
+ case 5:
+ x2 = x*x;
+ x4 = x2*x2;
+ return x4*x;
+ case 6:
+ x2 = x*x;
+ x4 = x2*x2;
+ return x4*x2;
+ case 7:
+ x2 = x*x;
+ x4 = x2*x2;
+ return x4*x2*x;
+ case 8:
+ x2 = x*x;
+ x4 = x2*x2;
+ x8 = x4*x4;
+ return x8;
+ case 9:
+ x2 = x*x;
+ x4 = x2*x2;
+ x8 = x4*x4;
+ return x8*x;
+ case 10:
+ x2 = x*x;
+ x4 = x2*x2;
+ x8 = x4*x4;
+ return x8*x2;
+ case 11:
+ x2 = x*x;
+ x4 = x2*x2;
+ x8 = x4*x4;
+ return x8*x2*x;
+ default:
+ return pow(x,n);
+ }
+}
+
+
+/* Compute the Bednorz shape parameter kappa based on the eversion order n. */
+static inline double bednorz_get_kappa(int n)
+{
+ return (n-1.0)/(2.0*n);
+}
+
+
+/* Compute the Bednorz shape parameter t based on the deformation
+ parameter tau. */
+static inline double bednorz_get_t(double tau)
+{
+ return (tau >= BEDNORZ_TAU1 ?
+ BEDNORZ_TAU1 :
+ (tau <= -BEDNORZ_TAU1 ?
+ -BEDNORZ_TAU1 :
+ tau));
+}
+
+
+/* Compute the Bednorz shape parameter q based on the deformation
+ parameter tau. */
+static inline double bednorz_get_q(double tau)
+{
+ double abs_tau;
+
+ abs_tau = fabs(tau);
+ return (abs_tau < BEDNORZ_TAU1 ?
+ 0.0 :
+ (abs_tau < BEDNORZ_TAU2 ?
+ BEDNORZ_Q*(abs_tau-BEDNORZ_TAU1)/(BEDNORZ_TAU2-BEDNORZ_TAU1) :
+ BEDNORZ_Q));
+}
+
+
+/* Compute the Bednorz shape parameter p based on the deformation
+ parameter tau. */
+static inline double bednorz_get_p(double tau)
+{
+ return 1.0-fabs(bednorz_get_q(tau)*bednorz_get_t(tau));
+}
+
+
+/* Compute the Bednorz shape parameter xi based on the deformation
+ parameter tau. */
+static inline double bednorz_get_xi(double tau)
+{
+ double abs_tau;
+
+ abs_tau = fabs(tau);
+ return (abs_tau < BEDNORZ_TAU2 ?
+ 1.0 :
+ (abs_tau < BEDNORZ_TAU3 ?
+ (BEDNORZ_TAU3-abs_tau)/(BEDNORZ_TAU3-BEDNORZ_TAU2) :
+ 0.0));
+}
+
+
+/* Compute the Bednorz shape parameter eta based on the deformation
+ parameter tau and the shape parameter eta_min. */
+static inline double bednorz_get_eta(double tau, double eta_min)
+{
+ double abs_tau;
+
+ abs_tau = fabs(tau);
+ return (abs_tau < BEDNORZ_TAU2 ?
+ eta_min :
+ (abs_tau < BEDNORZ_TAU3 ?
+ (eta_min+(1.0-eta_min)*
+ (abs_tau-BEDNORZ_TAU2)/(BEDNORZ_TAU3-BEDNORZ_TAU2)) :
+ 1.0));
+}
+
+
+/* Compute the Bednorz shape parameter alpha based on the deformation
+ parameter tau. */
+static inline double bednorz_get_alpha(double tau)
+{
+ double xi;
+
+ xi = bednorz_get_xi(tau);
+ return BEDNORZ_ALPHA*ipow(xi,2);
+}
+
+
+/* Compute the Bednorz shape parameter beta based on the deformation
+ parameter tau and the shape parameter beta_max. */
+static inline double bednorz_get_beta(double tau, double beta_max)
+{
+ double xi;
+
+ xi = bednorz_get_xi(tau);
+ return ipow(1.0-xi,2)+beta_max*ipow(xi,3);
+}
+
+
+/* Compute the Bednorz shape parameter gamma based on the shape
+ parameters alpha and beta. */
+static inline double bednorz_get_gamma(double alpha, double beta)
+{
+ return 2.0*sqrt(alpha*beta);
+}
+
+
+/* Compute the Bednorz shape parameter lambda based on the deformation
+ parameter tau. */
+static inline double bednorz_get_lambda(double tau)
+{
+ double abs_tau;
+
+ abs_tau = fabs(tau);
+ return (abs_tau < BEDNORZ_TAU3 ?
+ 1.0 :
+ (abs_tau < BEDNORZ_TAU4 ?
+ (BEDNORZ_TAU4-abs_tau)/(BEDNORZ_TAU4-BEDNORZ_TAU3) :
+ 0.0));
+}
+
+
+/* Compute the Bednorz shape parameter eps based on the deformation
+ parameter tau and the eversion order n. This is an extension to the
+ original approach that prevents z fighting to some extent in certain
+ stages of the eversion. */
+static inline double bednorz_get_eps(double tau, int n)
+{
+ double sgn_tau, abs_tau;
+
+ sgn_tau = (tau < 0.0 ? -1.0 : (tau > 0.0 ? 1.0 : 0.0));
+ abs_tau = fabs(tau);
+ switch (n)
+ {
+ case 2:
+ return (abs_tau < BEDNORZ_TAU1 ?
+ 0.0 :
+ (abs_tau < BEDNORZ_TAU2 ?
+ (BEDNORZ_EPS2*sgn_tau*
+ (abs_tau-BEDNORZ_TAU1)/(BEDNORZ_TAU2-BEDNORZ_TAU1)) :
+ (abs_tau < BEDNORZ_TAU3 ?
+ BEDNORZ_EPS2*sgn_tau :
+ (abs_tau < BEDNORZ_TAU4 ?
+ (BEDNORZ_EPS2*sgn_tau*
+ (BEDNORZ_TAU4-abs_tau)/(BEDNORZ_TAU4-BEDNORZ_TAU3)) :
+ 0.0))));
+ case 3:
+ return (abs_tau < BEDNORZ_TAU1 ?
+ BEDNORZ_EPS3*sgn_tau*abs_tau/BEDNORZ_TAU1 :
+ (abs_tau < BEDNORZ_TAU3 ?
+ BEDNORZ_EPS3*sgn_tau :
+ (abs_tau < BEDNORZ_TAU4 ?
+ (BEDNORZ_EPS3*sgn_tau*
+ (BEDNORZ_TAU4-abs_tau)/(BEDNORZ_TAU4-BEDNORZ_TAU3)) :
+ 0.0)));
+ case 4:
+ return (abs_tau < BEDNORZ_TAU1 ?
+ BEDNORZ_EPS4*sgn_tau*abs_tau/BEDNORZ_TAU1 :
+ (abs_tau < BEDNORZ_TAU3 ?
+ BEDNORZ_EPS4*sgn_tau :
+ (abs_tau < BEDNORZ_TAU4 ?
+ (BEDNORZ_EPS4*sgn_tau*
+ (BEDNORZ_TAU4-abs_tau)/(BEDNORZ_TAU4-BEDNORZ_TAU3)) :
+ 0.0)));
+ case 5:
+ return (abs_tau < BEDNORZ_TAU1 ?
+ BEDNORZ_EPS5*sgn_tau*abs_tau/BEDNORZ_TAU1 :
+ (abs_tau < BEDNORZ_TAU3 ?
+ BEDNORZ_EPS5*sgn_tau :
+ (abs_tau < BEDNORZ_TAU4 ?
+ (BEDNORZ_EPS5*sgn_tau*
+ (BEDNORZ_TAU4-abs_tau)/(BEDNORZ_TAU4-BEDNORZ_TAU3)) :
+ 0.0)));
+ default:
+ return 0.0;
+ }
+}
+
+
+/* Compute the equations for a point x and its partial derivatives dxdph and
+ dxdth in the Bednorz sphere eversion based on the sphere parameters phi
+ (longitude) and theta (latitude) and the shape parameters bsp. This
+ corresponds to equations (4), (12), and (15) in the paper. */
+static inline void bednorz_get_p0(double phi, double theta,
+ bednorz_shape_par *bsp, double x[3],
+ double dxdph[3], double dxdth[3])
+{
+ int n;
+ double kappa, omega, t, p, q, eta, lambda;
+ double ct, st, cp, sp, cnm1p, snm1p, cnp, snp;
+ double ctn, ictn, ictnp1, ct2, st2, ct2n, ict2n, ict2np1, ton;
+ double oml, omlplctn, pe1pk, tat2k, nst2pct2, ost, snpmqt;
+ double nm1p, ostictn, oictnp1, nst2pct2oictnp1, tcp, tsp;
+ double lost, tomlplctn, lostcp, lostsp, tomlplctncp, tomlplctnsp;
+ double tomlplctncpmlostsp, tomlplctnspplostcp, ntctnst, oct2;
+ double omlpe1pktat2k, nst2;
+
+ n = bsp->n;
+ kappa = bsp->kappa;
+ omega = bsp->omega;
+ t = bsp->t;
+ p = bsp->p;
+ q = bsp->q;
+ eta = bsp->eta;
+ lambda = bsp->lambda;
+
+ ct = cos(theta);
+ st = sin(theta);
+ cp = cos(phi);
+ sp = sin(phi);
+ cnp = cos(n*phi);
+ snp = sin(n*phi);
+ ctn = ipow(ct,n);
+ ictn = 1.0/ctn;
+ ictnp1 = ictn/ct;
+ ct2 = ct*ct;
+ st2 = st*st;
+ ton = t/n;
+ snpmqt = snp-q*t;
+ ost = omega*st;
+
+ if (lambda >= 1.0)
+ {
+ cnm1p = cos((n-1)*phi);
+ snm1p = sin((n-1)*phi);
+ nst2pct2 = n*st2+ct2;
+ nm1p = (n-1)*p;
+ tcp = t*cp;
+ tsp = t*sp;
+ ostictn = ost*ictn;
+ oictnp1 = omega*ictnp1;
+ nst2pct2oictnp1 = nst2pct2*oictnp1;
+ x[0] = p*snm1p-sp*ostictn+tcp;
+ x[1] = p*cnm1p+cp*ostictn+tsp;
+ x[2] = snpmqt*ostictn-ton*cnp;
+ dxdph[0] = nm1p*cnm1p-cp*ostictn-tsp;
+ dxdph[1] = -nm1p*snm1p-sp*ostictn+tcp;
+ dxdph[2] = n*cnp*ostictn+t*snp;
+ dxdth[0] = -sp*nst2pct2oictnp1;
+ dxdth[1] = cp*nst2pct2oictnp1;
+ dxdth[2] = snpmqt*nst2pct2oictnp1;
+ /* The same formulas written out in full glory:
+ x[0] = (t*cos(phi)+
+ p*sin((n-1)*phi)-
+ (omega*sin(theta)/ipow(cos(theta),n))*sin(phi));
+ x[1] = (t*sin(phi)+
+ p*cos((n-1)*phi)+
+ (omega*sin(theta)/ipow(cos(theta),n))*cos(phi));
+ x[2] = ((omega*sin(theta)/ipow(cos(theta),n))*sin(n*phi)-
+ (t/n)*cos(n*phi)-
+ omega*q*t*sin(theta)/ipow(cos(theta),n));
+ dxdph[0] = (-t*sin(phi)+
+ (n-1)*p*cos((n-1)*phi)-
+ (omega*sin(theta)/ipow(cos(theta),n))*cos(phi));
+ dxdph[1] = (t*cos(phi)-
+ (n-1)*p*sin((n-1)*phi)-
+ (omega*sin(theta)/ipow(cos(theta),n))*sin(phi));
+ dxdph[2] = ((n*omega*sin(theta)/ipow(cos(theta),n))*cos(n*phi)+
+ t*sin(n*phi));
+ dxdth[0] = -((omega*sin(phi)*(n*ipow(sin(theta),2)+ipow(cos(theta),2)))/
+ ipow(cos(theta),n+1));
+ dxdth[1] = ((omega*cos(phi)*(n*ipow(sin(theta),2)+ipow(cos(theta),2)))/
+ ipow(cos(theta),n+1));
+ dxdth[2] = ((omega*sin(n*phi)*(n*ipow(sin(theta),2)+ipow(cos(theta),2))/
+ ipow(cos(theta),n+1))-
+ (omega*q*t*(n*ipow(sin(theta),2)+ipow(cos(theta),2))/
+ ipow(cos(theta),n+1)));
+ */
+ }
+ else
+ {
+ ct2n = ipow(ct,2*n);
+ ict2n = 1.0/ct2n;
+ ict2np1 = ict2n/ct;
+ oml = 1.0-lambda;
+ omlplctn = oml+lambda*ctn;
+ pe1pk = pow(eta,1.0+kappa);
+ tat2k = t*pow(fabs(t),2.0*kappa);
+ lost = lambda*ost;
+ lostcp = lost*cp;
+ lostsp = lost*sp;
+ tomlplctn = t*omlplctn;
+ tomlplctncp = tomlplctn*cp;
+ tomlplctnsp = tomlplctn*sp;
+ tomlplctncpmlostsp = tomlplctncp-lostsp;
+ tomlplctnspplostcp = tomlplctnsp+lostcp;
+ ntctnst = n*t*ctn*st;
+ oct2 = omega*ct2;
+ omlpe1pktat2k = oml*pe1pk*tat2k;
+ nst2 = n*st2;
+ x[0] = tomlplctncpmlostsp*ictn;
+ x[1] = tomlplctnspplostcp*ictn;
+ x[2] = lambda*(ost*snpmqt*ictn-ton*cnp)-omlpe1pktat2k*st*ict2n;
+ dxdph[0] = -tomlplctnspplostcp*ictn;
+ dxdph[1] = tomlplctncpmlostsp*ictn;
+ dxdph[2] = lambda*(omega*n*st*cnp*ictn+t*snp);
+ dxdth[0] = (n*tomlplctncpmlostsp*st-lambda*(ntctnst*cp+oct2*sp))*ictnp1;
+ dxdth[1] = (n*tomlplctnspplostcp*st-lambda*(ntctnst*sp-oct2*cp))*ictnp1;
+ dxdth[2] = (lambda*omega*snpmqt*(nst2+ct2)*ictnp1-
+ omlpe1pktat2k*(2.0*nst2+ct2)*ict2np1);
+ /* The same formulas written out in full glory:
+ x[0] = ((t*(1.0-lambda+lambda*ipow(cos(theta),n))*cos(phi)-
+ lambda*omega*sin(theta)*sin(phi))/
+ ipow(cos(theta),n));
+ x[1] = ((t*(1.0-lambda+lambda*ipow(cos(theta),n))*sin(phi)+
+ lambda*omega*sin(theta)*cos(phi))/
+ ipow(cos(theta),n));
+ x[2] = (lambda*(omega*sin(theta)*(sin(n*phi)-q*t)/ipow(cos(theta),n)-
+ (t/n)*cos(n*phi))-
+ (1.0-lambda)*pow(eta,1.0+kappa)*
+ t*pow(fabs(t),2.0*kappa)*sin(theta)/ipow(cos(theta),2*n));
+ dxdph[0] = ((-t*(1.0-lambda+lambda*ipow(cos(theta),n))*sin(phi)-
+ lambda*omega*sin(theta)*cos(phi))/
+ ipow(cos(theta),n));
+ dxdph[1] = ((t*(1.0-lambda+lambda*ipow(cos(theta),n))*cos(phi)-
+ lambda*omega*sin(theta)*sin(phi))/
+ ipow(cos(theta),n));
+ dxdph[2] = (lambda*(omega*n*sin(theta)*(cos(n*phi))/ipow(cos(theta),n)+
+ t*sin(n*phi)));
+ dxdth[0] = ((n*(t*(1.0-lambda+lambda*ipow(cos(theta),n))*cos(phi)-
+ lambda*omega*sin(theta)*sin(phi))*sin(theta)/
+ ipow(cos(theta),n+1))-
+ (lambda*(n*t*ipow(cos(theta),n)*sin(theta)*cos(phi)+
+ omega*ipow(cos(theta),2)*sin(phi))/
+ ipow(cos(theta),n+1)));
+ dxdth[1] = ((n*(t*(1.0-lambda+lambda*ipow(cos(theta),n))*sin(phi)+
+ lambda*omega*sin(theta)*cos(phi))*sin(theta)/
+ ipow(cos(theta),n+1))-
+ (lambda*(n*t*ipow(cos(theta),n)*sin(theta)*sin(phi)-
+ omega*ipow(cos(theta),2)*cos(phi))/
+ ipow(cos(theta),n+1)));
+ dxdth[2] = ((lambda*omega*(sin(n*phi)-q*t)*
+ (n*ipow(sin(theta),2)+ipow(cos(theta),2))/
+ ipow(cos(theta),n+1))-
+ ((1.0-lambda)*pow(eta,1.0+kappa)*t*pow(fabs(t),2.0*kappa)*
+ (2.0*n*ipow(sin(theta),2)+ipow(cos(theta),2))/
+ ipow(cos(theta),2*n+1)));
+ */
+ }
+}
+
+
+/* Compute the equations for a point y and its partial derivatives dydph and
+ dydth in the Bednorz sphere eversion based on the sphere parameters phi
+ (longitude) and theta (latitude) and the shape parameters bsp. This
+ corresponds to equation (7) in the paper. */
+static inline void bednorz_get_p1(double phi, double theta,
+ bednorz_shape_par *bsp, double y[3],
+ double dydph[3], double dydth[3])
+{
+ double kappa, xi, eta;
+ double x[3], dxdph[3], dxdth[3];
+ double x0, x1, x2, x02, x12, x02px12, ex02px12, xipex02px12;
+ double ixipex02px122, ixipex02px12k, ixipex02px12kp1;
+ double x0dx0dphpx1dx1dph, x0dx0dthpx1dx1dth;
+ double tex0dx0dphpx1dx1dph, tex0dx0dthpx1dx1dth;
+ double ktex0dx0dphpx1dx1dph, ktex0dx0dthpx1dx1dth;
+
+ kappa = bsp->kappa;
+ xi = bsp->xi;
+ eta = bsp->eta;
+
+ bednorz_get_p0(phi,theta,bsp,x,dxdph,dxdth);
+
+ x0 = x[0];
+ x1 = x[1];
+ x2 = x[2];
+ x02 = x0*x0;
+ x12 = x1*x1;
+ x02px12 = x02+x12;
+ ex02px12 = eta*x02px12;
+ xipex02px12 = xi+ex02px12;
+ ixipex02px122 = 1.0/(xipex02px12*xipex02px12);
+ ixipex02px12k = 1.0/pow(xipex02px12,kappa);
+ ixipex02px12kp1 = ixipex02px12k/xipex02px12;
+ x0dx0dphpx1dx1dph = x0*dxdph[0]+x1*dxdph[1];
+ x0dx0dthpx1dx1dth = x0*dxdth[0]+x1*dxdth[1];
+ tex0dx0dphpx1dx1dph = 2.0*eta*x0dx0dphpx1dx1dph;
+ tex0dx0dthpx1dx1dth = 2.0*eta*x0dx0dthpx1dx1dth;
+ ktex0dx0dphpx1dx1dph = kappa*tex0dx0dphpx1dx1dph;
+ ktex0dx0dthpx1dx1dth = kappa*tex0dx0dthpx1dx1dth;
+
+ y[0] = x0*ixipex02px12k;
+ y[1] = x1*ixipex02px12k;
+ y[2] = x2/xipex02px12;
+ dydph[0] = (dxdph[0]*xipex02px12-ktex0dx0dphpx1dx1dph*x0)*ixipex02px12kp1;
+ dydph[1] = (dxdph[1]*xipex02px12-ktex0dx0dphpx1dx1dph*x1)*ixipex02px12kp1;
+ dydph[2] = (dxdph[2]*xipex02px12-tex0dx0dphpx1dx1dph*x2)*ixipex02px122;
+ dydth[0] = (dxdth[0]*xipex02px12-ktex0dx0dthpx1dx1dth*x0)*ixipex02px12kp1;
+ dydth[1] = (dxdth[1]*xipex02px12-ktex0dx0dthpx1dx1dth*x1)*ixipex02px12kp1;
+ dydth[2] = (dxdth[2]*xipex02px12-tex0dx0dthpx1dx1dth*x2)*ixipex02px122;
+
+ /* The same formulas written out in full glory:
+ y[0] = x[0]/pow(xi+eta*(ipow(x[0],2)+ipow(x[1],2)),kappa);
+ y[1] = x[1]/pow(xi+eta*(ipow(x[0],2)+ipow(x[1],2)),kappa);
+ y[2] = x[2]/(xi+eta*(ipow(x[0],2)+ipow(x[1],2)));
+ dydph[0] = ((dxdph[0]*(xi+eta*(ipow(x[0],2)+ipow(x[1],2)))-
+ 2.0*eta*kappa*x[0]*(x[0]*dxdph[0]+x[1]*dxdph[1]))/
+ pow(xi+eta*(ipow(x[0],2)+ipow(x[1],2)),kappa+1.0));
+ dydph[1] = ((dxdph[1]*(xi+eta*(ipow(x[0],2)+ipow(x[1],2)))-
+ 2.0*eta*kappa*x[1]*(x[0]*dxdph[0]+x[1]*dxdph[1]))/
+ pow(xi+eta*(ipow(x[0],2)+ipow(x[1],2)),kappa+1.0));
+ dydph[2] = ((dxdph[2]*(xi+eta*(ipow(x[0],2)+ipow(x[1],2)))-
+ 2.0*eta*x[2]*(x[0]*dxdph[0]+x[1]*dxdph[1]))/
+ ipow(xi+eta*(ipow(x[0],2)+ipow(x[1],2)),2));
+ dydth[0] = ((dxdth[0]*(xi+eta*(ipow(x[0],2)+ipow(x[1],2)))-
+ 2.0*eta*kappa*x[0]*(x[0]*dxdth[0]+x[1]*dxdth[1]))/
+ pow(xi+eta*(ipow(x[0],2)+ipow(x[1],2)),kappa+1.0));
+ dydth[1] = ((dxdth[1]*(xi+eta*(ipow(x[0],2)+ipow(x[1],2)))-
+ 2.0*eta*kappa*x[1]*(x[0]*dxdth[0]+x[1]*dxdth[1]))/
+ pow(xi+eta*(ipow(x[0],2)+ipow(x[1],2)),kappa+1.0));
+ dydth[2] = ((dxdth[2]*(xi+eta*(ipow(x[0],2)+ipow(x[1],2)))-
+ 2.0*eta*x[2]*(x[0]*dxdth[0]+x[1]*dxdth[1]))/
+ ipow(xi+eta*(ipow(x[0],2)+ipow(x[1],2)),2));
+ */
+}
+
+
+/* Compute the equations for a point z and its partial derivatives dzdph and
+ dzdth in the Bednorz sphere eversion based on the sphere parameters phi
+ (longitude) and theta (latitude) and the shape parameters bsp. This
+ corresponds to equations (8) and (9) in the paper. */
+static void inline bednorz_get_p2(double phi, double theta,
+ bednorz_shape_par *bsp, double z[3],
+ double dzdph[3], double dzdth[3])
+{
+ double alpha, beta, gamma;
+ double y[3], dydph[3], dydth[3];
+ double y0, y1, y2, y02, y12, y02py12, egy2, apby02py12, amby02py12;
+ double iapby02py12, iapby02py122, igapby02py12, igapby02py122;
+ double ambogapb, egy2apby02py12, egy2amby02py12, tbegy2;
+ double y0dy0dphpy1dy1dph, y0dy0dthpy1dy1dth;
+ double iy02py12, iy02py122, ty0dy0dphpy1dy1dph, ty0dy0dthpy1dy1dth;
+ double tbegy2y0dy0dphpy1dy1dph, tbegy2y0dy0dthpy1dy1dth;
+ double gigapby02py122, gegy2amby02py12;
+
+ alpha = bsp->alpha;
+ beta = bsp->beta;
+ gamma = bsp->gamma;
+
+ bednorz_get_p1(phi,theta,bsp,y,dydph,dydth);
+
+ y0 = y[0];
+ y1 = y[1];
+ y2 = y[2];
+ y02 = y0*y0;
+ y12 = y1*y1;
+ y02py12 = y02+y12;
+ y0dy0dphpy1dy1dph = y0*dydph[0]+y1*dydph[1];
+ y0dy0dthpy1dy1dth = y0*dydth[0]+y1*dydth[1];
+
+ if (alpha > 0.0)
+ {
+ /* For the north and south poles, the equations in bednorz_get_p0
+ and bednorz_get_p1 become singular. Therefore, we include a special
+ treatment here. Furthermore, we compute the surface normal vector
+ based on the cross product of the partial derivative vectors in
+ bednorz_point_normal. For the north and south poles, the partial
+ derivative vectors are linearly dependent and thus don't yield a
+ useful normal vector. Therefore, we have to include a special
+ treatment for the two poles. */
+ if (fabs(theta-M_PI/2.0) <= 1.0e-4)
+ {
+ z[0] = 0.0;
+ z[1] = 0.0;
+ z[2] = -sqrt(alpha/beta)/(alpha+beta);
+ dzdph[0] = 1.0;
+ dzdph[1] = 0.0;
+ dzdph[2] = 0.0;
+ dzdth[0] = 0.0;
+ dzdth[1] = 1.0;
+ dzdth[2] = 0.0;
+ }
+ else if (fabs(theta+M_PI/2.0) <= 1.0e-4)
+ {
+ z[0] = 0.0;
+ z[1] = 0.0;
+ z[2] = -sqrt(alpha/beta)/(alpha+beta);
+ dzdph[0] = 1.0;
+ dzdph[1] = 0.0;
+ dzdph[2] = 0.0;
+ dzdth[0] = 0.0;
+ dzdth[1] = -1.0;
+ dzdth[2] = 0.0;
+ }
+ else
+ {
+ egy2 = exp(gamma*y2);
+ apby02py12 = alpha+beta*y02py12;
+ amby02py12 = alpha-beta*y02py12;
+ iapby02py12 = 1.0/apby02py12;
+ iapby02py122 = iapby02py12*iapby02py12;
+ igapby02py12 = iapby02py12/gamma;
+ igapby02py122 = igapby02py12*igapby02py12;
+ ambogapb = (alpha-beta)/(gamma*(alpha+beta));
+ egy2apby02py12 = egy2*apby02py12;
+ egy2amby02py12 = egy2*amby02py12;
+ tbegy2 = 2.0*beta*egy2;
+ tbegy2y0dy0dphpy1dy1dph = tbegy2*y0dy0dphpy1dy1dph;
+ tbegy2y0dy0dthpy1dy1dth = tbegy2*y0dy0dthpy1dy1dth;
+ gigapby02py122 = gamma*igapby02py122;
+ gegy2amby02py12 = gamma*egy2amby02py12;
+
+ z[0] = y0*egy2*iapby02py12;
+ z[1] = y1*egy2*iapby02py12;
+ z[2] = egy2amby02py12*igapby02py12-ambogapb;
+ dzdph[0] = ((y0*gamma*dydph[2]+dydph[0])*egy2apby02py12-
+ y0*tbegy2y0dy0dphpy1dy1dph)*iapby02py122;
+ dzdph[1] = ((y1*gamma*dydph[2]+dydph[1])*egy2apby02py12-
+ y1*tbegy2y0dy0dphpy1dy1dph)*iapby02py122;
+ dzdph[2] = (((gegy2amby02py12*dydph[2]-tbegy2y0dy0dphpy1dy1dph)*
+ apby02py12-tbegy2y0dy0dphpy1dy1dph*amby02py12)*
+ gigapby02py122);
+ dzdth[0] = ((y0*gamma*dydth[2]+dydth[0])*egy2apby02py12-
+ y0*tbegy2y0dy0dthpy1dy1dth)*iapby02py122;
+ dzdth[1] = ((y1*gamma*dydth[2]+dydth[1])*egy2apby02py12-
+ y1*tbegy2y0dy0dthpy1dy1dth)*iapby02py122;
+ dzdth[2] = (((gegy2amby02py12*dydth[2]-tbegy2y0dy0dthpy1dy1dth)*
+ apby02py12-tbegy2y0dy0dthpy1dy1dth*amby02py12)*
+ gigapby02py122);
+ }
+
+ /* The same formulas written out in full glory:
+ z[0] = (y[0]*exp(gamma*y[2]))/(alpha+beta*(ipow(y[0],2)+ipow(y[1],2)));
+ z[1] = (y[1]*exp(gamma*y[2]))/(alpha+beta*(ipow(y[0],2)+ipow(y[1],2)));
+ z[2] = ((exp(gamma*y[2])*(alpha-beta*(ipow(y[0],2)+ipow(y[1],2))))/
+ (gamma*(alpha+beta*(ipow(y[0],2)+ipow(y[1],2))))-
+ ((alpha-beta)/(gamma*(alpha+beta))));
+ dzdph[0] = (((exp(gamma*y[2])*(gamma*y[0]*dydph[2]+dydph[0])*
+ (alpha+beta*(ipow(y[0],2)+ipow(y[1],2))))-
+ (2.0*beta*exp(gamma*y[2])*y[0]*
+ (y[0]*dydph[0]+y[1]*dydph[1])))/
+ ipow(alpha+beta*(ipow(y[0],2)+ipow(y[1],2)),2));
+ dzdph[1] = (((exp(gamma*y[2])*(gamma*y[1]*dydph[2]+dydph[1])*
+ (alpha+beta*(ipow(y[0],2)+ipow(y[1],2))))-
+ (2.0*beta*exp(gamma*y[2])*y[1]*
+ (y[0]*dydph[0]+y[1]*dydph[1])))/
+ ipow(alpha+beta*(ipow(y[0],2)+ipow(y[1],2)),2));
+ dzdph[2] = (((gamma*exp(gamma*y[2])*
+ (alpha-beta*(ipow(y[0],2)+ipow(y[1],2)))*dydph[2]-
+ 2.0*beta*exp(gamma*y[2])*(y[0]*dydph[0]+y[1]*dydph[1]))*
+ (gamma*(alpha+beta*(ipow(y[0],2)+ipow(y[1],2))))-
+ (2.0*gamma*beta*exp(gamma*y[2])*
+ (alpha-beta*(ipow(y[0],2)+ipow(y[1],2)))*
+ (y[0]*dydph[0]+y[1]*dydph[1])))/
+ ipow(gamma*(alpha+beta*(ipow(y[0],2)+ipow(y[1],2))),2));
+ dzdth[0] = (((exp(gamma*y[2])*(gamma*y[0]*dydth[2]+dydth[0])*
+ (alpha+beta*(ipow(y[0],2)+ipow(y[1],2))))-
+ (2.0*beta*exp(gamma*y[2])*y[0]*
+ (y[0]*dydth[0]+y[1]*dydth[1])))/
+ ipow(alpha+beta*(ipow(y[0],2)+ipow(y[1],2)),2));
+ dzdth[1] = (((exp(gamma*y[2])*(gamma*y[1]*dydth[2]+dydth[1])*
+ (alpha+beta*(ipow(y[0],2)+ipow(y[1],2))))-
+ (2.0*beta*exp(gamma*y[2])*y[1]*
+ (y[0]*dydth[0]+y[1]*dydth[1])))/
+ ipow(alpha+beta*(ipow(y[0],2)+ipow(y[1],2)),2));
+ dzdth[2] = (((gamma*exp(gamma*y[2])*
+ (alpha-beta*(ipow(y[0],2)+ipow(y[1],2)))*dydth[2]-
+ 2.0*beta*exp(gamma*y[2])*(y[0]*dydth[0]+y[1]*dydth[1]))*
+ (gamma*(alpha+beta*(ipow(y[0],2)+ipow(y[1],2))))-
+ (2.0*gamma*beta*exp(gamma*y[2])*
+ (alpha-beta*(ipow(y[0],2)+ipow(y[1],2)))*
+ (y[0]*dydth[0]+y[1]*dydth[1])))/
+ ipow(gamma*(alpha+beta*(ipow(y[0],2)+ipow(y[1],2))),2));
+ */
+ }
+ else
+ {
+ iy02py12 = 1.0/y02py12;
+ iy02py122 = iy02py12*iy02py12;
+ ty0dy0dphpy1dy1dph = 2.0*y0dy0dphpy1dy1dph;
+ ty0dy0dthpy1dy1dth = 2.0*y0dy0dthpy1dy1dth;
+
+ z[0] = y0*iy02py12;
+ z[1] = y1*iy02py12;
+ z[2] = -y2;
+
+ /* We compute the surface normal vector based on the cross product
+ of the partial derivative vectors in bednorz_point_normal. For the
+ north and south poles, the partial derivative vectors are linearly
+ dependent and thus don't yield a useful normal vector. Therefore,
+ we have to include a special treatment for the two poles. */
+ if (fabs(theta-M_PI/2.0) <= 1.0e-4)
+ {
+ dzdph[0] = 1.0;
+ dzdph[1] = 0.0;
+ dzdph[2] = 0.0;
+ dzdth[0] = 0.0;
+ dzdth[1] = 1.0;
+ dzdth[2] = 0.0;
+ }
+ else if (fabs(theta+M_PI/2.0) <= 1.0e-4)
+ {
+ dzdph[0] = 1.0;
+ dzdph[1] = 0.0;
+ dzdph[2] = 0.0;
+ dzdth[0] = 0.0;
+ dzdth[1] = -1.0;
+ dzdth[2] = 0.0;
+ }
+ else
+ {
+ dzdph[0] = (dydph[0]*y02py12-y0*ty0dy0dphpy1dy1dph)*iy02py122;
+ dzdph[1] = (dydph[1]*y02py12-y1*ty0dy0dphpy1dy1dph)*iy02py122;
+ dzdph[2] = -dydph[2];
+ dzdth[0] = (dydth[0]*y02py12-y0*ty0dy0dthpy1dy1dth)*iy02py122;
+ dzdth[1] = (dydth[1]*y02py12-y1*ty0dy0dthpy1dy1dth)*iy02py122;
+ dzdth[2] = -dydth[2];
+ }
+
+ /* The same formulas written out in full glory:
+ z[0] = y[0]/(ipow(y[0],2)+ipow(y[1],2));
+ z[1] = y[1]/(ipow(y[0],2)+ipow(y[1],2));
+ z[2] = -y[2];
+ dzdph[0] = ((dydph[0]*(ipow(y[0],2)+ipow(y[1],2))-
+ 2.0*y[0]*(y[0]*dydph[0]+y[1]*dydph[1]))/
+ ipow(ipow(y[0],2)+ipow(y[1],2),2));
+ dzdph[1] = ((dydph[1]*(ipow(y[0],2)+ipow(y[1],2))-
+ 2.0*y[1]*(y[0]*dydph[0]+y[1]*dydph[1]))/
+ ipow(ipow(y[0],2)+ipow(y[1],2),2));
+ dzdph[2] = -dydph[2];
+ dzdth[0] = ((dydth[0]*(ipow(y[0],2)+ipow(y[1],2))-
+ 2.0*y[0]*(y[0]*dydth[0]+y[1]*dydth[1]))/
+ ipow(ipow(y[0],2)+ipow(y[1],2),2));
+ dzdth[1] = ((dydth[1]*(ipow(y[0],2)+ipow(y[1],2))-
+ 2.0*y[1]*(y[0]*dydth[0]+y[1]*dydth[1]))/
+ ipow(ipow(y[0],2)+ipow(y[1],2),2));
+ dzdth[2] = -dydth[2];
+ */
+ }
+}
+
+
+/* Compute a point p and its surface normal n in the Bednorz sphere
+ eversion based on the sphere parameters phi (longitude) and theta
+ (latitude) and the shape parameters bsp. */
+static void inline bednorz_point_normal(double phi, double theta,
+ bednorz_shape_par *bsp,
+ float p[3], float n[3])
+{
+ double z[3], dzdph[3], dzdth[3];
+ float a[3], b[3], t;
+ float lambda, eps, oz;
+ int i;
+
+ bednorz_get_p2(phi,theta,bsp,z,dzdph,dzdth);
+
+ for (i=0; i<3; i++)
+ {
+ p[i] = z[i];
+ a[i] = dzdph[i];
+ b[i] = dzdth[i];
+ }
+
+ /* In the original version of the Bednorz sphere eversion, the regions
+ around the north and south poles of the sphere are deformed to points
+ that lie very close to each other. This leads to a significant amount
+ of z fighting, especially for higher eversion orders, which is visually
+ unpleasant. Therefore, we modify the shape of the deformed sphere very
+ slightly to avoid or at least ameliorate the z fighting. */
+ lambda = bsp->lambda;
+ eps = bsp->eps;
+ if (lambda == 1.0)
+ oz = eps*sin(theta);
+ else
+ oz = 0.0f;
+ p[2] += oz;
+
+ cross(a,b,n);
+ t = 1.0f/sqrtf(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
+ n[0] *= t;
+ n[1] *= t;
+ n[2] *= t;
+}
+
+
+/* Set up the surface colors for the main pass (i.e., index 0). */
+static void setup_surface_colors(ModeInfo *mi, float phi_min, float phi_max,
+ float theta_min, float theta_max,
+ int num_phi, int num_theta)
+{
+ int i, j, o;
+ float matc[3][3];
+ float phi, theta, phi_range, theta_range;
+ sphereeversionstruct *se = &sphereeversion[MI_SCREEN(mi)];
+
+ if (se->colors[0] != COLORS_TWOSIDED)
+ {
+ /* Compute the rotation that rotates the color basis vectors. */
+ for (i=0; i<3; i++)
+ for (j=0; j<3; j++)
+ matc[i][j] = (i==j);
+ rotatez(matc,-26.565051177078015);
+ rotatey(matc,-335.90515744788928);
+ rotatex(matc,-50.768479516407787);
+
+ phi_range = phi_max-phi_min;
+ theta_range = theta_max-theta_min;
+ for (j=0; j<=num_phi; j++)
+ {
+ phi = phi_range*j/num_phi+phi_min;
+ for (i=0; i<=num_theta; i++)
+ {
+ o = j*(num_theta+1)+i;
+ theta = theta_range*i/num_theta+theta_min;
+ if (se->colors[0] == COLORS_PARALLEL)
+ color(se,(2.0f*theta+M_PI)*(2.0f/3.0f),matc,&se->colf[0][4*o],
+ &se->colb[0][4*o]);
+ else /* se->colors[0] == COLORS_MERIDIAN */
+ color(se,phi+M_PI,matc,&se->colf[0][4*o],&se->colb[0][4*o]);
+ }
+ }
+ }
+#ifdef VERTEXATTRIBARRAY_WORKAROUND
+ else /* se->colors[0] == COLORS_TWOSIDED */
+ {
+ /* For some strange reason, the color buffer must be initialized
+ and used on macOS. Otherwise two-sided lighting will not
+ work. */
+ int k;
+ for (j=0; j<=num_phi; j++)
+ {
+ for (i=0; i<=num_theta; i++)
+ {
+ o = j*(num_theta+1)+i;
+ for (k=0; k<4; k++)
+ {
+ se->colf[0][4*o+k] = 1.0f;
+ se->colb[0][4*o+k] = 1.0f;
+ }
+ }
+ }
+ }
+#endif /* VERTEXATTRIBARRAY_WORKAROUND */
+
+#ifdef HAVE_GLSL
+ if (se->use_shaders)
+ {
+ glBindBuffer(GL_ARRAY_BUFFER,se->vertex_colorf_buffer[0]);
+ glBufferData(GL_ARRAY_BUFFER,
+ 4*(num_phi+1)*(num_theta+1)*sizeof(GLfloat),
+ se->colf[0],GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+
+ glBindBuffer(GL_ARRAY_BUFFER,se->vertex_colorb_buffer[0]);
+ glBufferData(GL_ARRAY_BUFFER,
+ 4*(num_phi+1)*(num_theta+1)*sizeof(GLfloat),
+ se->colb[0],GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+ }
+#endif /* HAVE_GLSL */
+}
+
+
+/* Draw the Bednorz sphere eversion using OpenGL's fixed
+ functionality. */
+static int bednorz_sphere_eversion_ff(ModeInfo *mi, float phi_min,
+ float phi_max, float theta_min,
+ float theta_max, int num_phi,
+ int num_theta, int numb_dist,
+ int numb_dir, int num_grid)
+{
+ static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+ static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
+ static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat mat_diff_front[] = { 1.0, 0.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_back[] = { 0.0, 1.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_trans_front[] = { 1.0, 0.0, 0.0, 0.7 };
+ static const GLfloat mat_diff_trans_back[] = { 0.0, 1.0, 0.0, 0.7 };
+ float p[3], n[3], mat[3][3];
+ int i, j, k, l, m, o;
+ int numb_dist_mask, numb_dist_min, numb_dist_max;
+ int numb_dir_mask, numb_dir_min, numb_dir_max;
+ float phi, theta, phi_range, theta_range;
+ float *xx, *xn, *cf, *cb;
+ float a, b, c, d, e, tau, tau_min, tau_max, r, s;
+ float x, y, z, zmin, zmax, rmax, scale, offset_z;
+ bednorz_shape_par bsp;
+ float qu[4], r1[3][3], r2[3][3];
+ sphereeversionstruct *se = &sphereeversion[MI_SCREEN(mi)];
+ int polys;
+
+ tau = se->tau;
+ /* Apply easing functions to the different ranges of tau. */
+ if (fabsf(tau) <= BEDNORZ_TAU4)
+ {
+ if (fabsf(tau) <= BEDNORZ_TAU1)
+ {
+ tau_min = 0.0f;
+ tau_max = BEDNORZ_TAU1;
+ }
+ else
+ if (fabsf(tau) <= BEDNORZ_TAU2)
+ {
+ tau_min = BEDNORZ_TAU1;
+ tau_max = BEDNORZ_TAU2;
+ }
+ else if (fabsf(tau) <= BEDNORZ_TAU3)
+ {
+ tau_min = BEDNORZ_TAU2;
+ tau_max = BEDNORZ_TAU3;
+ }
+ else /* fabsf(tau) <= BEDNORZ_TAU4 */
+ {
+ tau_min = BEDNORZ_TAU3;
+ tau_max = BEDNORZ_TAU4;
+ }
+ e = 1.0f/(tau_min*tau_min-2.0f*tau_min*tau_max+tau_max*tau_max);
+ a = -2.0f*e;
+ b = 3.0f*(tau_min+tau_max)*e;
+ c = -6.0f*tau_min*tau_max*e;
+ d = tau_min*tau_max*(tau_min+tau_max)*e;
+ if (tau >= 0.0f)
+ tau = ((a*tau+b)*tau+c)*tau+d;
+ else
+ tau = ((a*tau-b)*tau+c)*tau-d;
+ }
+ /* Set up the shape parameters. */
+ bsp.n = se->g;
+ bsp.kappa = bednorz_get_kappa(bsp.n);
+ bsp.omega = BEDNORZ_OMEGA;
+ bsp.t = bednorz_get_t(tau);
+ bsp.p = bednorz_get_p(tau);
+ bsp.q = bednorz_get_q(tau);
+ bsp.xi = bednorz_get_xi(tau);
+ bsp.eta = bednorz_get_eta(tau,se->eta_min);
+ bsp.alpha = bednorz_get_alpha(tau);
+ bsp.beta = bednorz_get_beta(tau,se->beta_max);
+ bsp.gamma = bednorz_get_gamma(bsp.alpha,bsp.beta);
+ bsp.lambda = bednorz_get_lambda(tau);
+ bsp.eps = bednorz_get_eps(tau,bsp.n);
+
+ /* Compute the surface points and normals. */
+ phi_range = phi_max-phi_min;
+ theta_range = theta_max-theta_min;
+ for (j=0; j<=num_phi; j++)
+ {
+ phi = phi_range*j/num_phi+phi_min;
+ for (i=0; i<=num_theta; i++)
+ {
+ o = j*(num_theta+1)+i;
+ theta = theta_range*i/num_theta+theta_min;
+ bednorz_point_normal(phi,theta,&bsp,&se->se[3*o],&se->sen[3*o]);
+ }
+ }
+
+ /* Compute the z offset. */
+ zmin = FLT_MAX;
+ zmax = -FLT_MAX;
+ for (j=0; j<=num_phi; j++)
+ {
+ for (i=0; i<=num_theta; i++)
+ {
+ o = j*(num_theta+1)+i;
+ z = se->se[3*o+2];
+ if (z < zmin)
+ zmin = z;
+ if (z > zmax)
+ zmax = z;
+ }
+ }
+ offset_z = -0.5f*(zmin+zmax);
+
+ /* Shift the surface in the z direction and compute the scale. */
+ rmax = -FLT_MAX;
+ for (j=0; j<=num_phi; j++)
+ {
+ for (i=0; i<=num_theta; i++)
+ {
+ o = j*(num_theta+1)+i;
+ se->se[3*o+2] += offset_z;
+ x = se->se[3*o];
+ y = se->se[3*o+1];
+ z = se->se[3*o+2];
+ r = x*x+y*y+z*z;
+ if (r > rmax)
+ rmax = r;
+ }
+ }
+ scale = 0.75f/sqrtf(rmax);
+
+ /* Scale the surface. */
+ for (j=0; j<=num_phi; j++)
+ {
+ for (i=0; i<=num_theta; i++)
+ {
+ o = j*(num_theta+1)+i;
+ se->se[3*o] *= scale;
+ se->se[3*o+1] *= scale;
+ se->se[3*o+2] *= scale;
+ }
+ }
+
+ /* Compute the rotation that rotates the surface in 3D, including the
+ trackball rotations. */
+ rotateall(se->alpha,se->beta,se->delta,r1);
+
+ gltrackball_get_quaternion(se->trackball,qu);
+ quat_to_rotmat(qu,r2);
+
+ mult_rotmat(r2,r1,mat);
+
+ numb_dist_mask = numb_dist-1;
+ numb_dist_min = numb_dist/4;
+ numb_dist_max = 3*numb_dist/4;
+ numb_dir_mask = numb_dir-1;
+ numb_dir_min = numb_dir/4;
+ numb_dir_max = 3*numb_dir/4;
+
+ glClearColor(0.0f,0.0f,0.0f,1.0f);
+ glClearDepth(1.0f);
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ if (se->projection == DISP_PERSPECTIVE)
+ {
+ gluPerspective(60.0,se->aspect,0.1,10.0);
+ }
+ else
+ {
+ if (se->aspect >= 1.0)
+ glOrtho(-se->aspect,se->aspect,-1.0,1.0,0.1,10.0);
+ else
+ glOrtho(-1.0,1.0,-1.0/se->aspect,1.0/se->aspect,0.1,10.0);
+ }
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ if (se->display_mode[0] == DISP_SURFACE)
+ {
+ glDisable(GL_CULL_FACE);
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+ glDepthMask(GL_TRUE);
+ glDisable(GL_BLEND);
+ }
+ else /* se->display_mode[0] == DISP_TRANSPARENT */
+ {
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_DEPTH_TEST);
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+ glDepthMask(GL_FALSE);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ }
+
+ if (se->colors[0] == COLORS_TWOSIDED)
+ {
+ glColor3fv(mat_diff_front);
+ if (se->display_mode[0] == DISP_TRANSPARENT)
+ {
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_front);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_back);
+ }
+ else
+ {
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_front);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_back);
+ }
+ }
+ glEnable(GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset(1.0f,1.0f);
+
+ if (se->appearance[0] == APPEARANCE_PARALLEL_BANDS)
+ {
+ for (i=0; i<num_theta; i++)
+ {
+ if (((i & numb_dist_mask) >= numb_dist_min) &&
+ ((i & numb_dist_mask) < numb_dist_max))
+ continue;
+ glBegin(GL_TRIANGLE_STRIP);
+ for (j=num_phi; j>=0; j--)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = i+k;
+ m = j;
+ o = m*(num_theta+1)+l;
+ phi = phi_range*m/num_phi+phi_min;
+ theta = theta_range*l/num_theta+theta_min;
+ xx = &se->se[3*o];
+ xn = &se->sen[3*o];
+ for (l=0; l<3; l++)
+ {
+ r = 0.0f;
+ s = 0.0f;
+ for (m=0; m<3; m++)
+ {
+ r += mat[l][m]*xx[m];
+ s += mat[l][m]*xn[m];
+ }
+ p[l] = r+se->offset3d[l];
+ n[l] = s;
+ }
+ if (se->colors[0] != COLORS_TWOSIDED)
+ {
+ cf = &se->colf[0][4*o];
+ cb = &se->colb[0][4*o];
+ glColor3fv(cf);
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,cf);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,cb);
+ }
+ glNormal3fv(n);
+ glVertex3fv(p);
+ }
+ }
+ glEnd();
+ }
+ polys = num_theta*(num_phi+1);
+ }
+ else /* se->appearance[0] != APPEARANCE_PARALLEL_BANDS */
+ {
+ for (j=0; j<num_phi; j++)
+ {
+ if (se->appearance[0] == APPEARANCE_MERIDIAN_BANDS &&
+ ((j & numb_dir_mask) >= numb_dir_min) &&
+ ((j & numb_dir_mask) < numb_dir_max))
+ continue;
+ glBegin(GL_TRIANGLE_STRIP);
+ for (i=0; i<=num_theta; i++)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = i;
+ m = j+k;
+ o = m*(num_theta+1)+l;
+ phi = phi_range*m/num_phi+phi_min;
+ theta = theta_range*l/num_theta+theta_min;
+ xx = &se->se[3*o];
+ xn = &se->sen[3*o];
+ for (l=0; l<3; l++)
+ {
+ r = 0.0f;
+ s = 0.0f;
+ for (m=0; m<3; m++)
+ {
+ r += mat[l][m]*xx[m];
+ s += mat[l][m]*xn[m];
+ }
+ p[l] = r+se->offset3d[l];
+ n[l] = s;
+ }
+ if (se->colors[0] != COLORS_TWOSIDED)
+ {
+ cf = &se->colf[0][4*o];
+ cb = &se->colb[0][4*o];
+ glColor3fv(cf);
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,cf);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,cb);
+ }
+ glNormal3fv(n);
+ glVertex3fv(p);
+ }
+ }
+ glEnd();
+ }
+ polys = 2*num_phi*(num_theta+1);
+ if (se->appearance[0] == APPEARANCE_MERIDIAN_BANDS)
+ polys /= 2;
+ }
+
+ glDisable(GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset(0.0f,0.0f);
+ if (se->graticule[0])
+ {
+ glColor4f(1.0f,1.0f,1.0f,1.0f);
+ glLineWidth(2.0f);
+ glEnable(GL_LINE_SMOOTH);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_LIGHT0);
+ glEnable(GL_BLEND);
+ glHint(GL_LINE_SMOOTH_HINT,GL_DONT_CARE);
+ /* Draw meridians. */
+ for (j=0; j<num_phi; j+=num_grid)
+ {
+ glBegin(GL_LINE_STRIP);
+ for (i=0; i<=num_theta; i++)
+ {
+ o = j*(num_theta+1)+i;
+ phi = phi_range*j/num_phi+phi_min;
+ theta = theta_range*i/num_theta+theta_min;
+ xx = &se->se[3*o];
+ for (l=0; l<3; l++)
+ {
+ r = 0.0f;
+ for (m=0; m<3; m++)
+ r += mat[l][m]*xx[m];
+ p[l] = r+se->offset3d[l];
+ }
+ glVertex3fv(p);
+ }
+ glEnd();
+ }
+ /* Draw parallels. */
+ for (i=num_grid; i<=num_theta-num_grid; i+=num_grid)
+ {
+ glBegin(GL_LINE_LOOP);
+ for (j=num_phi-1; j>=0; j--)
+ {
+ o = j*(num_theta+1)+i;
+ phi = phi_range*j/num_phi+phi_min;
+ theta = theta_range*i/num_theta+theta_min;
+ xx = &se->se[3*o];
+ for (l=0; l<3; l++)
+ {
+ r = 0.0f;
+ for (m=0; m<3; m++)
+ r += mat[l][m]*xx[m];
+ p[l] = r+se->offset3d[l];
+ }
+ glVertex3fv(p);
+ }
+ glEnd();
+ }
+ glLineWidth(1.0f);
+ glPolygonOffset(0.0f,0.0f);
+ glDisable(GL_LINE_SMOOTH);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ if (se->display_mode[0] != DISP_TRANSPARENT)
+ glDisable(GL_BLEND);
+ }
+
+ return polys;
+}
+
+
+#ifdef HAVE_GLSL
+
+/* Draw the Bednorz sphere eversion using OpenGL's programmable
+ functionality. */
+static int bednorz_sphere_eversion_pf(ModeInfo *mi, float phi_min,
+ float phi_max, float theta_min,
+ float theta_max, int num_phi,
+ int num_theta, int numb_dist,
+ int numb_dir, int num_grid)
+{
+ static const GLfloat light_model_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
+ static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+ static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
+ static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat mat_diff_front[] = { 1.0, 0.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_back[] = { 0.0, 1.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_trans_front[] = { 1.0, 0.0, 0.0, 0.7 };
+ static const GLfloat mat_diff_trans_back[] = { 0.0, 1.0, 0.0, 0.7 };
+ static const GLfloat mat_diff_white[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLuint blend_indices[6] = { 0, 1, 2, 2, 3, 0 };
+ static const GLfloat blend_p[4][2] =
+ { { -1.0, -1.0 }, { 1.0, -1.0 }, { 1.0, 1.0 }, { -1.0, 1.0 } };
+ static const GLfloat blend_t[4][2] =
+ { { 0.0, 0.0 }, { 1.0, 0.0 }, { 1.0, 1.0 }, { 0.0, 1.0 } };
+ GLfloat light_direction[3], half_vector[3], len;
+ GLfloat p_mat[16], mv_mat[16], rot_mat[16];
+ float mat[3][3];
+ int i, j, k, l, m, o, pass, num_passes, ni;
+ int numb_dist_mask, numb_dist_min, numb_dist_max;
+ int numb_dir_mask, numb_dir_min, numb_dir_max;
+ float phi, theta, phi_range, theta_range;
+ float a, b, c, d, e, tau, tau_min, tau_max, r, t;
+ float x, y, z, zmin, zmax, rmax, scale, offset_z;
+ bednorz_shape_par bsp;
+ float qu[4], r1[3][3], r2[3][3];
+ GLint draw_buf, read_buf;
+ GLsizeiptr index_offset;
+ sphereeversionstruct *se = &sphereeversion[MI_SCREEN(mi)];
+ int polys = 0;
+
+ if (!se->use_shaders)
+ return 0;
+
+ numb_dist_mask = numb_dist-1;
+ numb_dist_min = numb_dist/4;
+ numb_dist_max = 3*numb_dist/4;
+ numb_dir_mask = numb_dir-1;
+ numb_dir_min = numb_dir/4;
+ numb_dir_max = 3*numb_dir/4;
+
+ if (!se->buffers_initialized)
+ {
+ /* The indices only need to be computed once. */
+ /* Compute the solid indices. */
+ ni = 0;
+ se->num_solid_strips = 0;
+ se->num_solid_triangles = 0;
+ for (j=0; j<num_phi; j++)
+ {
+ for (i=0; i<=num_theta; i++)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = i;
+ m = j+k;
+ o = m*(num_theta+1)+l;
+ se->solid_indices[ni++] = o;
+ }
+ }
+ se->num_solid_strips++;
+ }
+ se->num_solid_triangles = 2*(num_theta+1);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,se->solid_indices_buffer);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER,ni*sizeof(GLuint),
+ se->solid_indices,GL_STATIC_DRAW);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
+
+ /* Compute the meridian indices. */
+ ni = 0;
+ se->num_meridian_strips = 0;
+ se->num_meridian_triangles = 0;
+ for (j=0; j<num_phi; j++)
+ {
+ if (((j & numb_dir_mask) >= numb_dir_min) &&
+ ((j & numb_dir_mask) < numb_dir_max))
+ continue;
+ for (i=0; i<=num_theta; i++)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = i;
+ m = j+k;
+ o = m*(num_theta+1)+l;
+ se->meridian_indices[ni++] = o;
+ }
+ }
+ se->num_meridian_strips++;
+ }
+ se->num_meridian_triangles = 2*(num_theta+1);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,se->meridian_indices_buffer);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER,ni*sizeof(GLuint),
+ se->meridian_indices,GL_STATIC_DRAW);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
+
+ /* Compute the parallel indices. */
+ ni = 0;
+ se->num_parallel_strips = 0;
+ se->num_parallel_triangles = 0;
+ for (i=0; i<num_theta; i++)
+ {
+ if (((i & numb_dist_mask) >= numb_dist_min) &&
+ ((i & numb_dist_mask) < numb_dist_max))
+ continue;
+ for (j=num_phi; j>=0; j--)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = i+k;
+ m = j;
+ o = m*(num_theta+1)+l;
+ se->parallel_indices[ni++] = o;
+ }
+ }
+ se->num_parallel_strips++;
+ }
+ se->num_parallel_triangles = 2*(num_phi+1);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,se->parallel_indices_buffer);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER,ni*sizeof(GLuint),
+ se->parallel_indices,GL_STATIC_DRAW);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
+
+ /* Compute the line indices. */
+ ni = 0;
+ for (j=0; j<num_phi; j+=num_grid)
+ {
+ for (i=0; i<num_theta; i++)
+ {
+ se->line_indices[ni++] = j*(num_theta+1)+i;
+ se->line_indices[ni++] = j*(num_theta+1)+i+1;
+ }
+ }
+ for (i=num_grid; i<=num_theta-num_grid; i+=num_grid)
+ {
+ for (j=num_phi; j>0; j--)
+ {
+ o = j*(num_theta+1)+i;
+ se->line_indices[ni++] = j*(num_theta+1)+i;
+ se->line_indices[ni++] = (j-1)*(num_theta+1)+i;
+ }
+ }
+ se->num_lines = ni;
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,se->line_indices_buffer);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER,ni*sizeof(GLuint),
+ se->line_indices,GL_STATIC_DRAW);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
+
+ se->buffers_initialized = True;
+ }
+
+ tau = se->tau;
+ /* Apply easing functions to the different ranges of tau. */
+ if (fabsf(tau) <= BEDNORZ_TAU4)
+ {
+ if (fabsf(tau) <= BEDNORZ_TAU1)
+ {
+ tau_min = 0.0f;
+ tau_max = BEDNORZ_TAU1;
+ }
+ else
+ if (fabsf(tau) <= BEDNORZ_TAU2)
+ {
+ tau_min = BEDNORZ_TAU1;
+ tau_max = BEDNORZ_TAU2;
+ }
+ else if (fabsf(tau) <= BEDNORZ_TAU3)
+ {
+ tau_min = BEDNORZ_TAU2;
+ tau_max = BEDNORZ_TAU3;
+ }
+ else /* fabsf(tau) <= BEDNORZ_TAU4 */
+ {
+ tau_min = BEDNORZ_TAU3;
+ tau_max = BEDNORZ_TAU4;
+ }
+ e = 1.0f/(tau_min*tau_min-2.0f*tau_min*tau_max+tau_max*tau_max);
+ a = -2.0f*e;
+ b = 3.0f*(tau_min+tau_max)*e;
+ c = -6.0f*tau_min*tau_max*e;
+ d = tau_min*tau_max*(tau_min+tau_max)*e;
+ if (tau >= 0.0f)
+ tau = ((a*tau+b)*tau+c)*tau+d;
+ else
+ tau = ((a*tau-b)*tau+c)*tau-d;
+ }
+ /* Set up the shape parameters. */
+ bsp.n = se->g;
+ bsp.kappa = bednorz_get_kappa(bsp.n);
+ bsp.omega = BEDNORZ_OMEGA;
+ bsp.t = bednorz_get_t(tau);
+ bsp.p = bednorz_get_p(tau);
+ bsp.q = bednorz_get_q(tau);
+ bsp.xi = bednorz_get_xi(tau);
+ bsp.eta = bednorz_get_eta(tau,se->eta_min);
+ bsp.alpha = bednorz_get_alpha(tau);
+ bsp.beta = bednorz_get_beta(tau,se->beta_max);
+ bsp.gamma = bednorz_get_gamma(bsp.alpha,bsp.beta);
+ bsp.lambda = bednorz_get_lambda(tau);
+ bsp.eps = bednorz_get_eps(tau,bsp.n);
+
+ /* Compute the surface points and normals. */
+ phi_range = phi_max-phi_min;
+ theta_range = theta_max-theta_min;
+ for (j=0; j<=num_phi; j++)
+ {
+ phi = phi_range*j/num_phi+phi_min;
+ for (i=0; i<=num_theta; i++)
+ {
+ o = j*(num_theta+1)+i;
+ theta = theta_range*i/num_theta+theta_min;
+ bednorz_point_normal(phi,theta,&bsp,&se->se[3*o],&se->sen[3*o]);
+ }
+ }
+
+ /* Compute the z offset. */
+ zmin = FLT_MAX;
+ zmax = -FLT_MAX;
+ for (j=0; j<=num_phi; j++)
+ {
+ for (i=0; i<=num_theta; i++)
+ {
+ o = j*(num_theta+1)+i;
+ z = se->se[3*o+2];
+ if (z < zmin)
+ zmin = z;
+ if (z > zmax)
+ zmax = z;
+ }
+ }
+ offset_z = -0.5f*(zmin+zmax);
+
+ /* Shift the surface in the z direction and compute the scale. */
+ rmax = -FLT_MAX;
+ for (j=0; j<=num_phi; j++)
+ {
+ for (i=0; i<=num_theta; i++)
+ {
+ o = j*(num_theta+1)+i;
+ se->se[3*o+2] += offset_z;
+ x = se->se[3*o];
+ y = se->se[3*o+1];
+ z = se->se[3*o+2];
+ r = x*x+y*y+z*z;
+ if (r > rmax)
+ rmax = r;
+ }
+ }
+ scale = 0.75f/sqrtf(rmax);
+
+ glBindBuffer(GL_ARRAY_BUFFER,se->vertex_pos_buffer);
+ glBufferData(GL_ARRAY_BUFFER,3*(num_phi+1)*(num_theta+1)*sizeof(GLfloat),
+ se->se,GL_STREAM_DRAW);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
+
+ glBindBuffer(GL_ARRAY_BUFFER,se->vertex_normal_buffer);
+ glBufferData(GL_ARRAY_BUFFER,3*(num_phi+1)*(num_theta+1)*sizeof(GLfloat),
+ se->sen,GL_STREAM_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+
+ /* Compute the rotation that rotates the surface in 3D, including the
+ trackball rotations. */
+ rotateall(se->alpha,se->beta,se->delta,r1);
+
+ gltrackball_get_quaternion(se->trackball,qu);
+ quat_to_rotmat(qu,r2);
+
+ mult_rotmat(r2,r1,mat);
+
+ glsl_Identity(p_mat);
+ if (se->projection == DISP_PERSPECTIVE)
+ {
+ glsl_Perspective(p_mat,60.0f,se->aspect,0.1f,10.0f);
+ }
+ else
+ {
+ if (se->aspect >= 1.0)
+ glsl_Orthographic(p_mat,-se->aspect,se->aspect,-1.0f,1.0f,
+ 0.1f,10.0f);
+ else
+ glsl_Orthographic(p_mat,-1.0f,1.0f,-1.0f/se->aspect,1.0f/se->aspect,
+ 0.1f,10.0f);
+ }
+ glsl_Identity(rot_mat);
+ for (i=0; i<3; i++)
+ for (j=0; j<3; j++)
+ rot_mat[GLSL__LINCOOR(i,j,4)] = mat[i][j];
+ glsl_Identity(mv_mat);
+ glsl_Translate(mv_mat,se->offset3d[0],se->offset3d[1],se->offset3d[2]);
+ glsl_Scale(mv_mat,scale,scale,scale);
+ glsl_MultMatrix(mv_mat,rot_mat);
+
+ len = sqrtf(light_position[0]*light_position[0]+
+ light_position[1]*light_position[1]+
+ light_position[2]*light_position[2]);
+ light_direction[0] = light_position[0]/len;
+ light_direction[1] = light_position[1]/len;
+ light_direction[2] = light_position[2]/len;
+ half_vector[0] = light_direction[0];
+ half_vector[1] = light_direction[1];
+ half_vector[2] = light_direction[2]+1.0f;
+ len = sqrtf(half_vector[0]*half_vector[0]+
+ half_vector[1]*half_vector[1]+
+ half_vector[2]*half_vector[2]);
+ half_vector[0] /= len;
+ half_vector[1] /= len;
+ half_vector[2] /= len;
+
+ num_passes = se->anim_state == ANIM_TURN ? 2 : 1;
+
+ for (pass=0; pass<num_passes; pass++)
+ {
+ glUseProgram(se->poly_shader_program);
+
+ glClearColor(0.0f,0.0f,0.0f,1.0f);
+ glClearDepth(1.0f);
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+
+ glUniformMatrix4fv(se->poly_mv_index,1,GL_FALSE,mv_mat);
+ glUniformMatrix4fv(se->poly_proj_index,1,GL_FALSE,p_mat);
+
+ glUniform4fv(se->poly_front_ambient_index,1,mat_diff_white);
+ glUniform4fv(se->poly_front_diffuse_index,1,mat_diff_white);
+ glUniform4fv(se->poly_back_ambient_index,1,mat_diff_white);
+ glUniform4fv(se->poly_back_diffuse_index,1,mat_diff_white);
+ glVertexAttrib4f(se->poly_colorf_index,1.0f,1.0f,1.0f,1.0f);
+ glVertexAttrib4f(se->poly_colorb_index,1.0f,1.0f,1.0f,1.0f);
+
+ if (se->display_mode[pass] == DISP_SURFACE)
+ {
+ glDisable(GL_CULL_FACE);
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glDepthMask(GL_TRUE);
+ glDisable(GL_BLEND);
+ glUniform4fv(se->poly_glbl_ambient_index,1,light_model_ambient);
+ glUniform4fv(se->poly_lt_ambient_index,1,light_ambient);
+ glUniform4fv(se->poly_lt_diffuse_index,1,light_diffuse);
+ glUniform4fv(se->poly_lt_specular_index,1,light_specular);
+ glUniform3fv(se->poly_lt_direction_index,1,light_direction);
+ glUniform3fv(se->poly_lt_halfvect_index,1,half_vector);
+ glUniform4fv(se->poly_specular_index,1,mat_specular);
+ glUniform1f(se->poly_shininess_index,50.0f);
+ }
+ else /* se->display_mode[pass] == DISP_TRANSPARENT */
+ {
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_DEPTH_TEST);
+ glDepthMask(GL_FALSE);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ glUniform4fv(se->poly_glbl_ambient_index,1,light_model_ambient);
+ glUniform4fv(se->poly_lt_ambient_index,1,light_ambient);
+ glUniform4fv(se->poly_lt_diffuse_index,1,light_diffuse);
+ glUniform4fv(se->poly_lt_specular_index,1,light_specular);
+ glUniform3fv(se->poly_lt_direction_index,1,light_direction);
+ glUniform3fv(se->poly_lt_halfvect_index,1,half_vector);
+ glUniform4fv(se->poly_specular_index,1,mat_specular);
+ glUniform1f(se->poly_shininess_index,50.0f);
+ }
+
+ if (se->colors[pass] == COLORS_TWOSIDED)
+ {
+ if (se->display_mode[pass] == DISP_TRANSPARENT)
+ {
+ glUniform4fv(se->poly_front_ambient_index,1,mat_diff_trans_front);
+ glUniform4fv(se->poly_front_diffuse_index,1,mat_diff_trans_front);
+ glUniform4fv(se->poly_back_ambient_index,1,mat_diff_trans_back);
+ glUniform4fv(se->poly_back_diffuse_index,1,mat_diff_trans_back);
+ }
+ else
+ {
+ glUniform4fv(se->poly_front_ambient_index,1,mat_diff_front);
+ glUniform4fv(se->poly_front_diffuse_index,1,mat_diff_front);
+ glUniform4fv(se->poly_back_ambient_index,1,mat_diff_back);
+ glUniform4fv(se->poly_back_diffuse_index,1,mat_diff_back);
+ }
+ }
+
+ glEnable(GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset(1.0f,1.0f);
+
+ glEnableVertexAttribArray(se->poly_pos_index);
+ glBindBuffer(GL_ARRAY_BUFFER,se->vertex_pos_buffer);
+ glVertexAttribPointer(se->poly_pos_index,3,GL_FLOAT,GL_FALSE,0,0);
+
+ glEnableVertexAttribArray(se->poly_normal_index);
+ glBindBuffer(GL_ARRAY_BUFFER,se->vertex_normal_buffer);
+ glVertexAttribPointer(se->poly_normal_index,3,GL_FLOAT,GL_FALSE,0,0);
+
+ if (se->colors[pass] != COLORS_TWOSIDED)
+ {
+ glEnableVertexAttribArray(se->poly_colorf_index);
+ glBindBuffer(GL_ARRAY_BUFFER,se->vertex_colorf_buffer[pass]);
+ glVertexAttribPointer(se->poly_colorf_index,4,GL_FLOAT,GL_FALSE,0,0);
+
+ glEnableVertexAttribArray(se->poly_colorb_index);
+ glBindBuffer(GL_ARRAY_BUFFER,se->vertex_colorb_buffer[pass]);
+ glVertexAttribPointer(se->poly_colorb_index,4,GL_FLOAT,GL_FALSE,0,0);
+ }
+#ifdef VERTEXATTRIBARRAY_WORKAROUND
+ else /* se->colors[pass] == COLORS_TWOSIDED */
+ {
+ glEnableVertexAttribArray(se->poly_colorf_index);
+ glBindBuffer(GL_ARRAY_BUFFER,se->vertex_colorf_buffer[pass]);
+ glVertexAttribPointer(se->poly_colorf_index,4,GL_FLOAT,GL_FALSE,0,0);
+
+ glEnableVertexAttribArray(se->poly_colorb_index);
+ glBindBuffer(GL_ARRAY_BUFFER,se->vertex_colorb_buffer[pass]);
+ glVertexAttribPointer(se->poly_colorb_index,4,GL_FLOAT,GL_FALSE,0,0);
+ }
+#endif /* VERTEXATTRIBARRAY_WORKAROUND */
+
+ if (se->appearance[pass] == APPEARANCE_SOLID)
+ {
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,se->solid_indices_buffer);
+ for (i=0; i<se->num_solid_strips; i++)
+ {
+ index_offset = se->num_solid_triangles*i*sizeof(GLuint);
+ glDrawElements(GL_TRIANGLE_STRIP,se->num_solid_triangles,
+ GL_UNSIGNED_INT,(const GLvoid *)index_offset);
+ }
+ polys += 2*num_phi*(num_theta+1);
+ }
+ else if (se->appearance[pass] == APPEARANCE_PARALLEL_BANDS)
+ {
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,se->parallel_indices_buffer);
+ for (i=0; i<se->num_parallel_strips; i++)
+ {
+ index_offset = se->num_parallel_triangles*i*sizeof(GLuint);
+ glDrawElements(GL_TRIANGLE_STRIP,se->num_parallel_triangles,
+ GL_UNSIGNED_INT,(const GLvoid *)index_offset);
+ }
+ polys += num_theta*(num_phi+1);
+ }
+ else /* se->appearance[pass] == APPEARANCE_MERIDIAN_BANDS */
+ {
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,se->meridian_indices_buffer);
+ for (i=0; i<se->num_meridian_strips; i++)
+ {
+ index_offset = se->num_meridian_triangles*i*sizeof(GLuint);
+ glDrawElements(GL_TRIANGLE_STRIP,se->num_meridian_triangles,
+ GL_UNSIGNED_INT,(const GLvoid *)index_offset);
+ }
+ polys += num_phi*(num_theta+1);
+ }
+
+ glDisableVertexAttribArray(se->poly_pos_index);
+ glDisableVertexAttribArray(se->poly_normal_index);
+ if (se->colors[pass] != COLORS_TWOSIDED)
+ {
+ glDisableVertexAttribArray(se->poly_colorf_index);
+ glDisableVertexAttribArray(se->poly_colorb_index);
+ }
+#ifdef VERTEXATTRIBARRAY_WORKAROUND
+ else /* se->colors[pass] != COLORS_TWOSIDED */
+ {
+ glDisableVertexAttribArray(se->poly_colorf_index);
+ glDisableVertexAttribArray(se->poly_colorb_index);
+ }
+#endif /* VERTEXATTRIBARRAY_WORKAROUND */
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
+
+ glDisable(GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset(0.0f,0.0f);
+
+ glUseProgram(0);
+
+ if (se->graticule[pass])
+ {
+ glUseProgram(se->line_shader_program);
+
+ glUniformMatrix4fv(se->line_mv_index,1,GL_FALSE,mv_mat);
+ glUniformMatrix4fv(se->line_proj_index,1,GL_FALSE,p_mat);
+ glUniform4f(se->line_color_index,1.0f,1.0f,1.0f,1.0f);
+
+ glLineWidth(2.0f);
+
+ glEnableVertexAttribArray(se->line_pos_index);
+ glBindBuffer(GL_ARRAY_BUFFER,se->vertex_pos_buffer);
+ glVertexAttribPointer(se->line_pos_index,3,GL_FLOAT,GL_FALSE,0,0);
+
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,se->line_indices_buffer);
+
+ index_offset = 0;
+ glDrawElements(GL_LINES,se->num_lines,GL_UNSIGNED_INT,
+ (const void *)index_offset);
+
+ glDisableVertexAttribArray(se->line_pos_index);
+ glBindBuffer(GL_ARRAY_BUFFER,0);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
+
+ glUseProgram(0);
+ }
+
+ if (num_passes == 2)
+ {
+ /* Copy the rendered image to a texture. */
+ glGetIntegerv(GL_DRAW_BUFFER0,&draw_buf);
+ glGetIntegerv(GL_READ_BUFFER,&read_buf);
+ glReadBuffer(draw_buf);
+ glBindTexture(GL_TEXTURE_2D,se->color_textures[pass]);
+ glCopyTexSubImage2D(GL_TEXTURE_2D,0,0,0,0,0,se->WindW,se->WindH);
+ glReadBuffer(read_buf);
+ }
+ }
+
+ if (num_passes == 2)
+ {
+ t = (float)se->turn_step/(float)se->num_turn;
+ /* Apply an easing function to t. */
+ t = (3.0-2.0*t)*t*t;
+
+ glUseProgram(se->blend_shader_program);
+
+ glClearColor(0.0f,0.0f,0.0f,1.0f);
+ glClearDepth(1.0f);
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+
+ glDisable(GL_DEPTH_TEST);
+ glDepthMask(GL_FALSE);
+ glDisable(GL_BLEND);
+
+ glUniform1f(se->blend_t_index,t);
+
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D,se->color_textures[0]);
+ glUniform1i(se->blend_sampler0_index,0);
+
+ glActiveTexture(GL_TEXTURE1);
+ glBindTexture(GL_TEXTURE_2D,se->color_textures[1]);
+ glUniform1i(se->blend_sampler1_index,1);
+
+ glEnableVertexAttribArray(se->blend_vertex_p_index);
+ glVertexAttribPointer(se->blend_vertex_p_index,2,GL_FLOAT,GL_FALSE,
+ 2*sizeof(GLfloat),blend_p);
+
+ glEnableVertexAttribArray(se->blend_vertex_t_index);
+ glVertexAttribPointer(se->blend_vertex_t_index,2,GL_FLOAT,GL_FALSE,
+ 2*sizeof(GLfloat),blend_t);
+
+ glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,blend_indices);
+
+ glActiveTexture(GL_TEXTURE0);
+
+ glUseProgram(0);
+ }
+
+ return polys;
+}
+
+
+static void init_glsl(ModeInfo *mi)
+{
+ sphereeversionstruct *se = &sphereeversion[MI_SCREEN(mi)];
+ GLint gl_major, gl_minor, glsl_major, glsl_minor;
+ GLboolean gl_gles3;
+ int i, wt, ht;
+ const GLchar *poly_vertex_shader_source[3];
+ const GLchar *poly_fragment_shader_source[4];
+ const GLchar *line_vertex_shader_source[3];
+ const GLchar *line_fragment_shader_source[4];
+ const GLchar *blend_vertex_shader_source[3];
+ const GLchar *blend_fragment_shader_source[4];
+
+ se->solid_indices = calloc(2*NUMPH*(NUMTH+1),sizeof(float));
+ se->parallel_indices = calloc(NUMPH*(NUMTH+1),sizeof(float));
+ se->meridian_indices = calloc((NUMPH+1)*NUMTH,sizeof(float));
+ se->line_indices = calloc(4*NUMPH*NUMTH/NUMGRID,sizeof(float));
+
+ /* Determine whether to use shaders to render the sphere eversion. */
+ se->use_shaders = False;
+ se->buffers_initialized = False;
+ se->poly_shader_program = 0;
+ se->line_shader_program = 0;
+ se->blend_shader_program = 0;
+ se->max_tex_size = -1;
+
+ if (!glsl_GetGlAndGlslVersions(&gl_major,&gl_minor,&glsl_major,&glsl_minor,
+ &gl_gles3))
+ return;
+ if (!gl_gles3)
+ {
+ if (gl_major < 3 ||
+ (glsl_major < 1 || (glsl_major == 1 && glsl_minor < 30)))
+ {
+ if ((gl_major < 2 || (gl_major == 2 && gl_minor < 1)) ||
+ (glsl_major < 1 || (glsl_major == 1 && glsl_minor < 20)))
+ return;
+ /* We have at least OpenGL 2.1 and at least GLSL 1.20. */
+ poly_vertex_shader_source[0] = shader_version_2_1;
+ poly_vertex_shader_source[1] = poly_vertex_shader_attribs_2_1;
+ poly_vertex_shader_source[2] = poly_vertex_shader_main;
+ poly_fragment_shader_source[0] = shader_version_2_1;
+ poly_fragment_shader_source[1] = poly_fragment_shader_attribs_2_1;
+ poly_fragment_shader_source[2] = poly_fragment_shader_main;
+ poly_fragment_shader_source[3] = poly_fragment_shader_out_2_1;
+
+ line_vertex_shader_source[0] = shader_version_2_1;
+ line_vertex_shader_source[1] = line_vertex_shader_attribs_2_1;
+ line_vertex_shader_source[2] = line_vertex_shader_main;
+ line_fragment_shader_source[0] = shader_version_2_1;
+ line_fragment_shader_source[1] = line_fragment_shader_attribs_2_1;
+ line_fragment_shader_source[2] = line_fragment_shader_main;
+ line_fragment_shader_source[3] = line_fragment_shader_out_2_1;
+
+ blend_vertex_shader_source[0] = shader_version_2_1;
+ blend_vertex_shader_source[1] = blend_vertex_shader_attribs_2_1;
+ blend_vertex_shader_source[2] = blend_vertex_shader_main;
+ blend_fragment_shader_source[0] = shader_version_2_1;
+ blend_fragment_shader_source[1] = blend_fragment_shader_attribs_2_1;
+ blend_fragment_shader_source[2] = blend_fragment_shader_main;
+ blend_fragment_shader_source[3] = blend_fragment_shader_out_2_1;
+ }
+ else
+ {
+ /* We have at least OpenGL 3.0 and at least GLSL 1.30. */
+ poly_vertex_shader_source[0] = shader_version_3_0;
+ poly_vertex_shader_source[1] = poly_vertex_shader_attribs_3_0;
+ poly_vertex_shader_source[2] = poly_vertex_shader_main;
+ poly_fragment_shader_source[0] = shader_version_3_0;
+ poly_fragment_shader_source[1] = poly_fragment_shader_attribs_3_0;
+ poly_fragment_shader_source[2] = poly_fragment_shader_main;
+ poly_fragment_shader_source[3] = poly_fragment_shader_out_3_0;
+
+ line_vertex_shader_source[0] = shader_version_3_0;
+ line_vertex_shader_source[1] = line_vertex_shader_attribs_3_0;
+ line_vertex_shader_source[2] = line_vertex_shader_main;
+ line_fragment_shader_source[0] = shader_version_3_0;
+ line_fragment_shader_source[1] = line_fragment_shader_attribs_3_0;
+ line_fragment_shader_source[2] = line_fragment_shader_main;
+ line_fragment_shader_source[3] = line_fragment_shader_out_3_0;
+
+ blend_vertex_shader_source[0] = shader_version_3_0;
+ blend_vertex_shader_source[1] = blend_vertex_shader_attribs_3_0;
+ blend_vertex_shader_source[2] = blend_vertex_shader_main;
+ blend_fragment_shader_source[0] = shader_version_3_0;
+ blend_fragment_shader_source[1] = blend_fragment_shader_attribs_3_0;
+ blend_fragment_shader_source[2] = blend_fragment_shader_main;
+ blend_fragment_shader_source[3] = blend_fragment_shader_out_3_0;
+ }
+ }
+ else /* gl_gles3 */
+ {
+ if (gl_major < 3 || glsl_major < 3)
+ return;
+ /* We have at least OpenGL ES 3.0 and at least GLSL ES 3.0. */
+ poly_vertex_shader_source[0] = shader_version_3_0_es;
+ poly_vertex_shader_source[1] = poly_vertex_shader_attribs_3_0;
+ poly_vertex_shader_source[2] = poly_vertex_shader_main;
+ poly_fragment_shader_source[0] = shader_version_3_0_es;
+ poly_fragment_shader_source[1] = poly_fragment_shader_attribs_3_0;
+ poly_fragment_shader_source[2] = poly_fragment_shader_main;
+ poly_fragment_shader_source[3] = poly_fragment_shader_out_3_0;
+
+ line_vertex_shader_source[0] = shader_version_3_0_es;
+ line_vertex_shader_source[1] = line_vertex_shader_attribs_3_0;
+ line_vertex_shader_source[2] = line_vertex_shader_main;
+ line_fragment_shader_source[0] = shader_version_3_0_es;
+ line_fragment_shader_source[1] = line_fragment_shader_attribs_3_0;
+ line_fragment_shader_source[2] = line_fragment_shader_main;
+ line_fragment_shader_source[3] = line_fragment_shader_out_3_0;
+
+ blend_vertex_shader_source[0] = shader_version_3_0_es;
+ blend_vertex_shader_source[1] = blend_vertex_shader_attribs_3_0;
+ blend_vertex_shader_source[2] = blend_vertex_shader_main;
+ blend_fragment_shader_source[0] = shader_version_3_0_es;
+ blend_fragment_shader_source[1] = blend_fragment_shader_attribs_3_0;
+ blend_fragment_shader_source[2] = blend_fragment_shader_main;
+ blend_fragment_shader_source[3] = blend_fragment_shader_out_3_0;
+ }
+
+ if (!glsl_CompileAndLinkShaders(3,poly_vertex_shader_source,
+ 4,poly_fragment_shader_source,
+ &se->poly_shader_program))
+ return;
+ se->poly_pos_index = glGetAttribLocation(se->poly_shader_program,
+ "VertexPosition");
+ se->poly_normal_index = glGetAttribLocation(se->poly_shader_program,
+ "VertexNormal");
+ se->poly_colorf_index = glGetAttribLocation(se->poly_shader_program,
+ "VertexColorF");
+ se->poly_colorb_index = glGetAttribLocation(se->poly_shader_program,
+ "VertexColorB");
+ se->poly_mv_index = glGetUniformLocation(se->poly_shader_program,
+ "MatModelView");
+ se->poly_proj_index = glGetUniformLocation(se->poly_shader_program,
+ "MatProj");
+ se->poly_glbl_ambient_index = glGetUniformLocation(se->poly_shader_program,
+ "LtGlblAmbient");
+ se->poly_lt_ambient_index = glGetUniformLocation(se->poly_shader_program,
+ "LtAmbient");
+ se->poly_lt_diffuse_index = glGetUniformLocation(se->poly_shader_program,
+ "LtDiffuse");
+ se->poly_lt_specular_index = glGetUniformLocation(se->poly_shader_program,
+ "LtSpecular");
+ se->poly_lt_direction_index = glGetUniformLocation(se->poly_shader_program,
+ "LtDirection");
+ se->poly_lt_halfvect_index = glGetUniformLocation(se->poly_shader_program,
+ "LtHalfVector");
+ se->poly_front_ambient_index = glGetUniformLocation(se->poly_shader_program,
+ "MatFrontAmbient");
+ se->poly_back_ambient_index = glGetUniformLocation(se->poly_shader_program,
+ "MatBackAmbient");
+ se->poly_front_diffuse_index = glGetUniformLocation(se->poly_shader_program,
+ "MatFrontDiffuse");
+ se->poly_back_diffuse_index = glGetUniformLocation(se->poly_shader_program,
+ "MatBackDiffuse");
+ se->poly_specular_index = glGetUniformLocation(se->poly_shader_program,
+ "MatSpecular");
+ se->poly_shininess_index = glGetUniformLocation(se->poly_shader_program,
+ "MatShininess");
+ if (se->poly_pos_index == -1 ||
+ se->poly_normal_index == -1 ||
+ se->poly_colorf_index == -1 ||
+ se->poly_colorb_index == -1 ||
+ se->poly_mv_index == -1 ||
+ se->poly_proj_index == -1 ||
+ se->poly_glbl_ambient_index == -1 ||
+ se->poly_lt_ambient_index == -1 ||
+ se->poly_lt_diffuse_index == -1 ||
+ se->poly_lt_specular_index == -1 ||
+ se->poly_lt_direction_index == -1 ||
+ se->poly_lt_halfvect_index == -1 ||
+ se->poly_front_ambient_index == -1 ||
+ se->poly_back_ambient_index == -1 ||
+ se->poly_front_diffuse_index == -1 ||
+ se->poly_back_diffuse_index == -1 ||
+ se->poly_specular_index == -1 ||
+ se->poly_shininess_index == -1)
+ {
+ glDeleteProgram(se->poly_shader_program);
+ return;
+ }
+
+ if (!glsl_CompileAndLinkShaders(3,line_vertex_shader_source,
+ 4,line_fragment_shader_source,
+ &se->line_shader_program))
+ {
+ glDeleteProgram(se->poly_shader_program);
+ return;
+ }
+ se->line_pos_index = glGetAttribLocation(se->line_shader_program,
+ "VertexPosition");
+ se->line_color_index = glGetUniformLocation(se->line_shader_program,
+ "LineColor");
+ se->line_mv_index = glGetUniformLocation(se->line_shader_program,
+ "MatModelView");
+ se->line_proj_index = glGetUniformLocation(se->line_shader_program,
+ "MatProj");
+ if (se->line_pos_index == -1 ||
+ se->line_color_index == -1 ||
+ se->line_mv_index == -1 ||
+ se->line_proj_index == -1)
+ {
+ glDeleteProgram(se->poly_shader_program);
+ glDeleteProgram(se->line_shader_program);
+ return;
+ }
+
+ if (!glsl_CompileAndLinkShaders(3,blend_vertex_shader_source,
+ 4,blend_fragment_shader_source,
+ &se->blend_shader_program))
+ {
+ glDeleteProgram(se->poly_shader_program);
+ glDeleteProgram(se->line_shader_program);
+ return;
+ }
+ se->blend_vertex_p_index = glGetAttribLocation(se->blend_shader_program,
+ "VertexP");
+ se->blend_vertex_t_index = glGetAttribLocation(se->blend_shader_program,
+ "VertexT");
+ se->blend_t_index = glGetUniformLocation(se->blend_shader_program,
+ "T");
+ se->blend_sampler0_index = glGetUniformLocation(se->blend_shader_program,
+ "TextureSampler0");
+ se->blend_sampler1_index = glGetUniformLocation(se->blend_shader_program,
+ "TextureSampler1");
+ if (se->blend_vertex_p_index == -1 ||
+ se->blend_vertex_t_index == -1 ||
+ se->blend_t_index == -1 ||
+ se->blend_sampler0_index == -1 ||
+ se->blend_sampler1_index == -1)
+ {
+ glDeleteProgram(se->poly_shader_program);
+ glDeleteProgram(se->line_shader_program);
+ glDeleteProgram(se->blend_shader_program);
+ return;
+ }
+
+ glGetIntegerv(GL_MAX_TEXTURE_SIZE,&se->max_tex_size);
+ if (se->WindW <= se->max_tex_size || se->WindH <= se->max_tex_size)
+ {
+ wt = se->WindW;
+ ht = se->WindH;
+ }
+ else
+ {
+ wt = MIN(se->max_tex_size,se->WindW);
+ ht = MIN(se->max_tex_size,se->WindH);
+ }
+
+ glGenTextures(2,se->color_textures);
+ for (i=0; i<2; i++)
+ {
+ glBindTexture(GL_TEXTURE_2D,se->color_textures[i]);
+ glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,wt,ht,0,GL_RGBA,GL_UNSIGNED_BYTE,
+ NULL);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+ }
+
+ glGenBuffers(1,&se->vertex_pos_buffer);
+ glGenBuffers(1,&se->vertex_normal_buffer);
+ glGenBuffers(2,se->vertex_colorf_buffer);
+ glGenBuffers(2,se->vertex_colorb_buffer);
+ glGenBuffers(1,&se->solid_indices_buffer);
+ glGenBuffers(1,&se->parallel_indices_buffer);
+ glGenBuffers(1,&se->meridian_indices_buffer);
+ glGenBuffers(1,&se->line_indices_buffer);
+
+ se->use_shaders = True;
+}
+
+#endif /* HAVE_GLSL */
+
+
+static void init(ModeInfo *mi)
+{
+ sphereeversionstruct *se = &sphereeversion[MI_SCREEN(mi)];
+
+ if (deform_speed == 0.0f)
+ deform_speed = 10.0f;
+
+ se->alpha = frand(120.0)-60.0;
+ se->beta = frand(120.0)-60.0;
+ se->delta = frand(360.0);
+
+ se->eta_min = BEDNORZ_ETA_MIN;
+ se->beta_max = BEDNORZ_BETA_MAX;
+
+ se->anim_state = ANIM_DEFORM;
+ se->tau = BEDNORZ_TAU_MAX;
+ se->defdir = -1;
+ se->turn_step = 0;
+ se->num_turn = 0;
+
+ se->offset3d[0] = 0.0f;
+ se->offset3d[1] = 0.0f;
+ se->offset3d[2] = -1.8f;
+
+ se->se = calloc(3*(NUMPH+1)*(NUMTH+1),sizeof(float));
+ se->sen = calloc(3*(NUMPH+1)*(NUMTH+1),sizeof(float));
+ se->colf[0] = calloc(4*(NUMPH+1)*(NUMTH+1),sizeof(float));
+ se->colf[1] = calloc(4*(NUMPH+1)*(NUMTH+1),sizeof(float));
+ se->colb[0] = calloc(4*(NUMPH+1)*(NUMTH+1),sizeof(float));
+ se->colb[1] = calloc(4*(NUMPH+1)*(NUMTH+1),sizeof(float));
+
+#ifdef HAVE_GLSL
+ init_glsl(mi);
+#endif /* HAVE_GLSL */
+
+ setup_surface_colors(mi,-M_PI,M_PI,-M_PI/2.0,M_PI/2.0,NUMPH,NUMTH);
+}
+
+
+/* Redisplay the deformed surface. */
+static void display_sphereeversion(ModeInfo *mi)
+{
+ float alpha, beta, delta, dot, a, t, q[4];
+ float *colt;
+ sphereeversionstruct *se = &sphereeversion[MI_SCREEN(mi)];
+#ifdef HAVE_GLSL
+ GLuint vertex_colort_buffer;
+#endif /* HAVE_GLSL */
+
+ if (!se->button_pressed)
+ {
+ if (se->anim_state == ANIM_DEFORM)
+ {
+ se->tau += se->defdir*deform_speed*0.001;
+ if (se->tau < BEDNORZ_TAU_MIN)
+ {
+ se->tau = BEDNORZ_TAU_MIN;
+ se->defdir = -se->defdir;
+ se->anim_state = ANIM_TURN;
+ }
+ if (se->tau > BEDNORZ_TAU_MAX)
+ {
+ se->tau = BEDNORZ_TAU_MAX;
+ se->defdir = -se->defdir;
+ se->anim_state = ANIM_TURN;
+ }
+ if (se->anim_state == ANIM_TURN)
+ {
+ /* Convert the current rotation angles to a quaternion. */
+ angles_to_quat(se->alpha,se->beta,se->delta,se->qs);
+ /* Determine random target rotation angles and convert them to the
+ target quaternion. */
+ alpha = frand(120.0)-60.0;
+ beta = frand(120.0)-60.0;
+ delta = frand(360.0);
+ angles_to_quat(alpha,beta,delta,se->qe);
+ /* Compute the angle between qs and qe. */
+ dot = (se->qs[0]*se->qe[0]+se->qs[1]*se->qe[1]+
+ se->qs[2]*se->qe[2]+se->qs[3]*se->qe[3]);
+ if (dot < 0.0f)
+ {
+ se->qe[0] = -se->qe[0];
+ se->qe[1] = -se->qe[1];
+ se->qe[2] = -se->qe[2];
+ se->qe[3] = -se->qe[3];
+ dot = -dot;
+ }
+ a = 180.0/M_PI*acos(dot);
+ se->num_turn = ceil(a/TURN_STEP);
+
+ /* Change the parameters randomly after one full eversion when a
+ turn to the new orientation starts. */
+ /* Copy the current display modes to the values of the second pass. */
+ se->display_mode[1] = se->display_mode[0];
+ se->appearance[1] = se->appearance[0];
+ se->colors[1] = se->colors[0];
+ se->graticule[1] = se->graticule[0];
+ /* Swap the front and back color buffers. */
+ colt = se->colf[1];
+ se->colf[1] = se->colf[0];
+ se->colf[0] = colt;
+ colt = se->colb[1];
+ se->colb[1] = se->colb[0];
+ se->colb[0] = colt;
+#ifdef HAVE_GLSL
+ /* Swap the OpenGL front and back color buffers. */
+ if (se->use_shaders)
+ {
+ vertex_colort_buffer = se->vertex_colorf_buffer[1];
+ se->vertex_colorf_buffer[1] = se->vertex_colorf_buffer[0];
+ se->vertex_colorf_buffer[0] = vertex_colort_buffer;
+ vertex_colort_buffer = se->vertex_colorb_buffer[1];
+ se->vertex_colorb_buffer[1] = se->vertex_colorb_buffer[0];
+ se->vertex_colorb_buffer[0] = vertex_colort_buffer;
+ }
+#endif /* HAVE_GLSL */
+ /* Randomly select new display modes for the main pass. */
+ if (se->random_display_mode)
+ se->display_mode[0] = random() % NUM_DISPLAY_MODES;
+ if (se->random_appearance)
+ se->appearance[0] = random() % NUM_APPEARANCES;
+ if (se->random_colors)
+ se->colors[0] = random() % NUM_COLORS;
+ if (se->random_graticule)
+ se->graticule[0] = random() & 1;
+ if (se->random_g)
+ se->g = random() % 4 + 2;
+ setup_surface_colors(mi,-M_PI,M_PI,-M_PI/2.0,M_PI/2.0,NUMPH,NUMTH);
+ }
+ }
+ else /* se->anim_state == ANIM_TURN */
+ {
+ t = (float)se->turn_step/(float)se->num_turn;
+ /* Apply an easing function to t. */
+ t = (3.0-2.0*t)*t*t;
+ quat_slerp(t,se->qs,se->qe,q);
+ quat_to_angles(q,&se->alpha,&se->beta,&se->delta);
+ se->turn_step++;
+ if (se->turn_step > se->num_turn)
+ {
+ se->turn_step = 0;
+ se->anim_state = ANIM_DEFORM;
+ }
+ }
+
+ if (se->anim_state == ANIM_DEFORM)
+ {
+ se->alpha += speed_x*se->speed_scale;
+ if (se->alpha >= 360.0f)
+ se->alpha -= 360.0f;
+ se->beta += speed_y*se->speed_scale;
+ if (se->beta >= 360.0f)
+ se->beta -= 360.0f;
+ se->delta += speed_z*se->speed_scale;
+ if (se->delta >= 360.0f)
+ se->delta -= 360.0f;
+ }
+ }
+
+#ifdef HAVE_GLSL
+ if (se->use_shaders)
+ mi->polygon_count = bednorz_sphere_eversion_pf(mi,-M_PI,M_PI,-M_PI/2.0,
+ M_PI/2.0,NUMPH,NUMTH,
+ NUMBDIST,NUMBDIR,
+ NUMGRID);
+ else
+#endif /* HAVE_GLSL */
+ mi->polygon_count = bednorz_sphere_eversion_ff(mi,-M_PI,M_PI,-M_PI/2.0,
+ M_PI/2.0,NUMPH,NUMTH,
+ NUMBDIST,NUMBDIR,
+ NUMGRID);
+}
+
+
+ENTRYPOINT void reshape_sphereeversion(ModeInfo *mi, int width, int height)
+{
+ sphereeversionstruct *se = &sphereeversion[MI_SCREEN(mi)];
+ int y = 0;
+#ifdef HAVE_GLSL
+ int i, wt, ht;
+#endif /* HAVE_GLSL */
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ }
+
+ se->WindW = (GLint)width;
+ se->WindH = (GLint)height;
+ glViewport(0,y,width,height);
+ se->aspect = (GLfloat)width/(GLfloat)height;
+#ifdef HAVE_GLSL
+ if (se->use_shaders)
+ {
+ if (se->WindW <= se->max_tex_size || se->WindH <= se->max_tex_size)
+ {
+ wt = se->WindW;
+ ht = se->WindH;
+ }
+ else
+ {
+ wt = MIN(se->max_tex_size,se->WindW);
+ ht = MIN(se->max_tex_size,se->WindH);
+ }
+ for (i=0; i<2; i++)
+ {
+ glBindTexture(GL_TEXTURE_2D,se->color_textures[i]);
+ glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,wt,ht,0,GL_RGBA,GL_UNSIGNED_BYTE,
+ NULL);
+ }
+ }
+#endif /* HAVE_GLSL */
+}
+
+
+ENTRYPOINT Bool sphereeversion_handle_event(ModeInfo *mi, XEvent *event)
+{
+ sphereeversionstruct *se = &sphereeversion[MI_SCREEN(mi)];
+
+ if (event->xany.type == ButtonPress && event->xbutton.button == Button1)
+ {
+ se->button_pressed = True;
+ gltrackball_start(se->trackball, event->xbutton.x, event->xbutton.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease &&
+ event->xbutton.button == Button1)
+ {
+ se->button_pressed = False;
+ return True;
+ }
+ else if (event->xany.type == MotionNotify && se->button_pressed)
+ {
+ gltrackball_track(se->trackball, event->xmotion.x, event->xmotion.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+
+ return False;
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ * Xlock hooks.
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+ *-----------------------------------------------------------------------------
+ * Initialize sphereeversion. Called each time the window changes.
+ *-----------------------------------------------------------------------------
+ */
+
+ENTRYPOINT void init_sphereeversion(ModeInfo *mi)
+{
+ sphereeversionstruct *se;
+
+ MI_INIT(mi,sphereeversion);
+ se = &sphereeversion[MI_SCREEN(mi)];
+
+ se->trackball = gltrackball_init(True);
+ se->button_pressed = False;
+
+ /* Set the surface order. */
+ if (!strcasecmp(surface_order,"2"))
+ {
+ se->g = 2;
+ se->random_g = False;
+ }
+ else if (!strcasecmp(surface_order,"3"))
+ {
+ se->g = 3;
+ se->random_g = False;
+ }
+ else if (!strcasecmp(surface_order,"4"))
+ {
+ se->g = 4;
+ se->random_g = False;
+ }
+ else if (!strcasecmp(surface_order,"5"))
+ {
+ se->g = 5;
+ se->random_g = False;
+ }
+ else
+ {
+ se->g = random() % 4 + 2;
+ se->random_g = True;
+ }
+
+ /* Set the display mode. */
+ if (!strcasecmp(mode,"surface"))
+ {
+ se->display_mode[0] = DISP_SURFACE;
+ se->random_display_mode = False;
+ }
+ else if (!strcasecmp(mode,"transparent"))
+ {
+ se->display_mode[0] = DISP_TRANSPARENT;
+ se->random_display_mode = False;
+ }
+ else
+ {
+ se->display_mode[0] = random() % NUM_DISPLAY_MODES;
+ se->random_display_mode = True;
+ }
+
+ /* Set the appearance. */
+ if (!strcasecmp(appear,"solid"))
+ {
+ se->appearance[0] = APPEARANCE_SOLID;
+ se->random_appearance = False;
+ }
+ else if (!strcasecmp(appear,"parallel-bands"))
+ {
+ se->appearance[0] = APPEARANCE_PARALLEL_BANDS;
+ se->random_appearance = False;
+ }
+ else if (!strcasecmp(appear,"meridian-bands"))
+ {
+ se->appearance[0] = APPEARANCE_MERIDIAN_BANDS;
+ se->random_appearance = False;
+ }
+ else
+ {
+ se->appearance[0] = random() % NUM_APPEARANCES;
+ se->random_appearance = True;
+ }
+
+ /* Set the color mode. */
+ if (!strcasecmp(color_mode,"two-sided"))
+ {
+ se->colors[0] = COLORS_TWOSIDED;
+ se->random_colors = False;
+ }
+ else if (!strcasecmp(color_mode,"parallel"))
+ {
+ se->colors[0] = COLORS_PARALLEL;
+ se->random_colors = False;
+ }
+ else if (!strcasecmp(color_mode,"meridian"))
+ {
+ se->colors[0] = COLORS_MERIDIAN;
+ se->random_colors = False;
+ }
+ else
+ {
+ se->colors[0] = random() % NUM_COLORS;
+ se->random_colors = True;
+ }
+
+ /* Set the graticule mode. */
+ if (!strcasecmp(graticule,"on"))
+ {
+ se->graticule[0] = True;
+ se->random_graticule = False;
+ }
+ else if (!strcasecmp(graticule,"off"))
+ {
+ se->graticule[0] = False;
+ se->random_graticule = False;
+ }
+ else
+ {
+ se->graticule[0] = random() & 1;
+ se->random_graticule = True;
+ }
+
+ /* Set the 3d projection mode. */
+ if (!strcasecmp(proj,"perspective"))
+ {
+ se->projection = DISP_PERSPECTIVE;
+ }
+ else if (!strcasecmp(proj,"orthographic"))
+ {
+ se->projection = DISP_ORTHOGRAPHIC;
+ }
+ else
+ {
+ se->projection = random() % NUM_DISP_MODES;
+ }
+
+ /* Make multiple screens rotate at slightly different rates. */
+ se->speed_scale = 0.9+frand(0.3);
+
+ if ((se->glx_context = init_GL(mi)) != NULL)
+ {
+ reshape_sphereeversion(mi,MI_WIDTH(mi),MI_HEIGHT(mi));
+ init(mi);
+ }
+ else
+ {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * Called by the mainline code periodically to update the display.
+ *-----------------------------------------------------------------------------
+ */
+ENTRYPOINT void draw_sphereeversion(ModeInfo *mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ sphereeversionstruct *se;
+
+ if (sphereeversion == NULL)
+ return;
+ se = &sphereeversion[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
+ if (!se->glx_context)
+ return;
+
+ glXMakeCurrent(display, window, *se->glx_context);
+
+ display_sphereeversion(mi);
+
+ if (MI_IS_FPS(mi))
+ do_fps (mi);
+
+ glFlush();
+
+ glXSwapBuffers(display,window);
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * The display is being taken away from us. Free up malloc'ed
+ * memory and X resources that we've alloc'ed.
+ *-----------------------------------------------------------------------------
+ */
+
+
+#ifndef STANDALONE
+ENTRYPOINT void change_sphereeversion(ModeInfo *mi)
+{
+ sphereeversionstruct *ev = &sphereeversion[MI_SCREEN(mi)];
+
+ if (!ev->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *ev->glx_context);
+ init(mi);
+}
+#endif /* !STANDALONE */
+
+
+ENTRYPOINT void free_sphereeversion(ModeInfo *mi)
+{
+ sphereeversionstruct *se = &sphereeversion[MI_SCREEN(mi)];
+
+ if (!se->glx_context) return;
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *se->glx_context);
+
+ if (se->se) free(se->se);
+ if (se->sen) free(se->sen);
+ if (se->colf[0]) free(se->colf[0]);
+ if (se->colf[1]) free(se->colf[1]);
+ if (se->colb[0]) free(se->colb[0]);
+ if (se->colb[1]) free(se->colb[1]);
+ gltrackball_free(se->trackball);
+#ifdef HAVE_GLSL
+ if (se->solid_indices) free(se->solid_indices);
+ if (se->parallel_indices) free(se->parallel_indices);
+ if (se->meridian_indices) free(se->meridian_indices);
+ if (se->line_indices) free(se->line_indices);
+ if (se->use_shaders)
+ {
+ glUseProgram(0);
+ if (se->poly_shader_program != 0)
+ glDeleteProgram(se->poly_shader_program);
+ if (se->line_shader_program != 0)
+ glDeleteProgram(se->line_shader_program);
+ if (se->blend_shader_program != 0)
+ glDeleteProgram(se->blend_shader_program);
+ glDeleteTextures(2,se->color_textures);
+ glDeleteBuffers(1,&se->vertex_pos_buffer);
+ glDeleteBuffers(1,&se->vertex_normal_buffer);
+ glDeleteBuffers(2,se->vertex_colorf_buffer);
+ glDeleteBuffers(2,se->vertex_colorb_buffer);
+ glDeleteBuffers(1,&se->solid_indices_buffer);
+ glDeleteBuffers(1,&se->parallel_indices_buffer);
+ glDeleteBuffers(1,&se->meridian_indices_buffer);
+ glDeleteBuffers(1,&se->line_indices_buffer);
+ }
+#endif /* HAVE_GLSL */
+}
+
+
+XSCREENSAVER_MODULE ("SphereEversion", sphereeversion)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/sphereeversion.man b/hacks/glx/sphereeversion.man
new file mode 100644
index 0000000..9be3abe
--- /dev/null
+++ b/hacks/glx/sphereeversion.man
@@ -0,0 +1,256 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+sphereeversion - Displays a sphere eversion.
+.SH SYNOPSIS
+.B sphereeversion
+[\-display \fIhost:display.screen\fP]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fIusecs\fP]
+[\-fps]
+[\-mode \fIdisplay-mode\fP]
+[\-surface]
+[\-transparent]
+[\-appearance \fIappearance\fP]
+[\-solid]
+[\-parallel-bands]
+[\-meridian-bands]
+[\-graticule \fImode\fP]
+[\-surface-order \fIorder\fP]
+[\-colors \fIcolor-scheme\fP]
+[\-twosided-colors]
+[\-parallel-colors]
+[\-meridian-colors]
+[\-deformation-speed \fIfloat\fP]
+[\-projection \fImode\fP]
+[\-perspective]
+[\-orthographic]
+[\-speed-x \fIfloat\fP]
+[\-speed-y \fIfloat\fP]
+[\-speed-z \fIfloat\fP]
+.SH DESCRIPTION
+The \fIsphereeversion\fP program shows a sphere eversion, i.e., a
+smooth deformation (homotopy) that turns a sphere inside out. During
+the eversion, the deformed sphere is allowed to intersect itself
+transversally. However, no creases or pinch points are allowed to
+occur.
+.PP
+The deformed sphere can be projected to the screen either
+perspectively or orthographically.
+.PP
+There are three display modes for the sphere: solid, transparent, or
+random. If random mode is selected, the mode is changed each time an
+eversion has been completed.
+.PP
+The appearance of the sphere can be as a solid object, as a set of
+see-through bands, or random. The bands can be parallel bands or
+meridian bands, i.e., bands that run along the parallels (lines of
+latitude) or bands that run along the meridians (lines of longitude)
+of the sphere. If random mode is selected, the appearance is changed
+each time an eversion has been completed.
+.PP
+It is also possible to display a graticule (i.e., a coordinate grid
+consisting of parallel and meridian lines) on top of the surface. The
+graticule mode can be set to on, off, or random. If random mode is
+selected, the graticule mode is changed each time an eversion has been
+completed.
+.PP
+It is possible to define a surface order of the sphere eversion as
+random or as a value between 2 and 5. This determines the the
+complexity of the deformation. For higher surface orders, some
+z-fighting might occur around the central stage of the eversion, which
+might lead to some irregular flickering of the displayed surface if it
+is displayed as a solid object. For odd surface orders, z-fighting
+will occur very close to the central stage of the eversion since the
+deformed sphere is a doubly covered Boy surface (for surface order 3)
+or a doubly covered generalized Boy surface (for surface order 5) in
+this case. If you find this distracting, you should set the surface
+order to 2. If a random surface order is selected, the surface order
+is changed each time an eversion has been completed.
+.PP
+The colors with with the sphere is drawn can be set to two-sided,
+parallel, meridian, or random. In two-sided mode, the sphere is drawn
+with red on one side and green on the other side. In parallel mode,
+the sphere is displayed with colors that run from red to cyan on one
+side of the surface and from green to violet on the other side. The
+colors are aligned with the parallels of the sphere in this mode. In
+meridian mode, the the sphere is displayed with colors that run from
+red to white to cyan to black and back to red on one side of the
+surface and from green to white to violet to black and back to green
+on the other side. The colors are aligned with the meridians of the
+sphere in this mode. If random mode is selected, the color scheme is
+changed each time an eversion has been completed.
+.PP
+By default, the sphere is rotated to a new viewing position each time
+an eversion has been completed. In addition, it is possible to rotate
+the sphere while it is deforming. The rotation speed for each of the
+three coordinate axes around which the sphere rotates can be chosen
+arbitrarily. For best effects, however, it is suggested to rotate
+only around the z axis while the sphere is deforming.
+.PP
+This program is inspired by the following paper: Adam Bednorz, Witold
+Bednorz: "Analytic sphere eversion using ruled surfaces", Differential
+Geometry and its Applications 64:59-79, 2019.
+.SH OPTIONS
+.I sphereeversion
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual
+class, or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the
+animation. Default 10000, or 1/100th second.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.PP
+The following three options are mutually exclusive. They determine
+how the deformed sphere is displayed.
+.TP 8
+.B \-mode random
+Display the sphere in a random display mode (default).
+.TP 8
+.B \-mode surface \fP(Shortcut: \fB\-surface\fP)
+Display the sphere as a solid surface.
+.TP 8
+.B \-mode transparent \fP(Shortcut: \fB\-transparent\fP)
+Display the sphere as a transparent surface.
+.PP
+The following four options are mutually exclusive. They determine the
+appearance of the deformed sphere.
+.TP 8
+.B \-appearance random
+Display the sphere with a random appearance (default).
+.TP 8
+.B \-appearance solid \fP(Shortcut: \fB\-solid\fP)
+Display the sphere as a solid object.
+.TP 8
+.B \-appearance parallel-bands \fP(Shortcut: \fB\-parallel-bands\fP)
+Display the sphere as see-through bands that lie along the parallels
+of the sphere.
+.TP 8
+.B \-appearance meridian-bands \fP(Shortcut: \fB\-meridian-bands\fP)
+Display the sphere as see-through bands that lie along the meridians
+of the sphere.
+.PP
+The following three options are mutually exclusive. They determine
+whether a graticule is displayed on top of the sphere.
+.TP 8
+.B \-graticule random
+Randomly choose whether to display a graticule (default).
+.TP 8
+.B \-graticule on
+Display a graticule.
+.TP 8
+.B \-graticule off
+Do not display a graticule.
+.PP
+The following option determines the order of the surface to be
+displayed.
+.TP 8
+.B \-surface-order \fIorder\fP
+The surface order can be set to random or to a value between 2 and 5
+(default: random). This determines the the complexity of the
+deformation.
+.PP
+The following four options are mutually exclusive. They determine how
+to color the deformed sphere.
+.TP 8
+.B \-colors random
+Display the sphere with a random color scheme (default).
+.TP 8
+.B \-colors twosided \fP(Shortcut: \fB\-twosided-colors\fP)
+Display the sphere with two colors: red on one side and green on the
+other side.
+.TP 8
+.B \-colors parallel \fP(Shortcut: \fB\-parallel-colors\fP)
+Display the sphere with colors that run from red to cyan on one side
+of the surface and from green to violet on the other side. The colors
+are aligned with the parallels of the sphere. If the sphere is
+displayed as parallel bands, each band will be displayed with a
+different color.
+.TP 8
+.B \-colors meridian \fP(Shortcut: \fB\-meridian-colors\fP)
+Display the sphere with colors that run from red to white to cyan to
+black and back to red on one side of the surface and from green to
+white to violet to black and back to green on the other side. The
+colors are aligned with the meridians of the sphere. If the sphere is
+displayed as meridian bands, each band will be displayed with a
+different color.
+.PP
+The following option determines the deformation speed.
+.TP 8
+.B \-deformation-speed \fIfloat\fP
+The deformation speed is measured in percent of some sensible maximum
+speed (default: 10.0).
+.PP
+The following three options are mutually exclusive. They determine
+how the deformed sphere is projected from 3d to 2d (i.e., to the
+screen).
+.TP 8
+.B \-projection random
+Project the sphere from 3d to 2d using a random projection mode
+(default).
+.TP 8
+.B \-projection perspective \fP(Shortcut: \fB\-perspective\fP)
+Project the sphere from 3d to 2d using a perspective projection.
+.TP 8
+.B \-projection orthographic \fP(Shortcut: \fB\-orthographic\fP)
+Project the sphere from 3d to 2d using an orthographic projection.
+.PP
+The following three options determine the rotation speed of the
+deformed sphere around the three possible axes. The rotation speed is
+measured in degrees per frame. The speeds should be set to relatively
+small values, e.g., less than 4 in magnitude.
+.TP 8
+.B \-speed-x \fIfloat\fP
+Rotation speed around the x axis (default: 0.0).
+.TP 8
+.B \-speed-y \fIfloat\fP
+Rotation speed around the y axis (default: 0.0).
+.TP 8
+.B \-speed-z \fIfloat\fP
+Rotation speed around the z axis (default: 0.0).
+.SH INTERACTION
+If you run this program in standalone mode, you can rotate the
+deformed sphere by dragging the mouse while pressing the left mouse
+button. This rotates the sphere in 3d. To examine the deformed
+sphere at your leisure, it is best to set all speeds to 0. Otherwise,
+the deformed sphere will rotate while the left mouse button is not
+pressed.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2020 by Carsten Steger. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Carsten Steger <carsten@mirsanmir.org>, 01-jun-2020.
diff --git a/hacks/glx/spheremonics.c b/hacks/glx/spheremonics.c
index cf01c7d..13eed8a 100644
--- a/hacks/glx/spheremonics.c
+++ b/hacks/glx/spheremonics.c
@@ -63,12 +63,10 @@
#define DEFAULTS "*delay: 30000 \n" \
"*showFPS: False \n" \
"*wireframe: False \n" \
+ "*labelfont: sans-serif 18\n" \
"*suppressRotationAnimation: True\n" \
- "*labelfont: -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n"
# define release_spheremonics 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "texfont.h"
@@ -80,7 +78,7 @@
#ifdef USE_GL /* whole file */
-#define DEF_DURATION "100"
+#define DEF_DURATION "200"
#define DEF_SPIN "XYZ"
#define DEF_WANDER "False"
#define DEF_RESOLUTION "64"
@@ -95,7 +93,7 @@ typedef struct {
trackball_state *trackball;
Bool button_down_p;
- GLuint dlist, dlist2;
+ GLuint dlist, dlist2, grid_dlist;
GLfloat scale;
XYZ bbox[2];
@@ -115,6 +113,7 @@ typedef struct {
int change_tick;
int done_once;
+ double fade;
} spheremonics_configuration;
@@ -185,14 +184,13 @@ reshape_spheremonics (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
@@ -328,7 +326,6 @@ draw_bounding_box (ModeInfo *mi)
/* spheremonics_configuration *cc = &ccs[MI_SCREEN(mi)]; */
static const GLfloat c1[4] = { 0.2, 0.2, 0.6, 1.0 };
- static const GLfloat c2[4] = { 1.0, 0.0, 0.0, 1.0 };
int wire = MI_IS_WIREFRAME(mi);
GLfloat x1,y1,z1,x2,y2,z2;
@@ -383,36 +380,6 @@ draw_bounding_box (ModeInfo *mi)
glEnd();
glDisable(GL_CULL_FACE);
}
-
- if (do_grid)
- {
- glDisable (GL_LIGHTING);
- glColor3f (c2[0], c2[1], c2[2]);
- glPushMatrix();
- glBegin(GL_LINES);
- glVertex3f(0, -0.66, 0);
- glVertex3f(0, 0.66, 0);
- glEnd();
- draw_circle (mi, True);
- glRotatef(90, 1, 0, 0);
- draw_circle (mi, True);
- glRotatef(90, 0, 1, 0);
- draw_circle (mi, True);
- glPopMatrix();
- }
- else
- {
-#if 0
- glBegin(GL_LINES);
- if (x1 > 0) x1 = 0; if (x2 < 0) x2 = 0;
- if (y1 > 0) y1 = 0; if (y2 < 0) y2 = 0;
- if (z1 > 0) z1 = 0; if (z2 < 0) z2 = 0;
- glVertex3f(x1, 0, 0); glVertex3f(x2, 0, 0);
- glVertex3f(0 , y1, 0); glVertex3f(0, y2, 0);
- glVertex3f(0, 0, z1); glVertex3f(0, 0, z2);
- glEnd();
-#endif
- }
}
@@ -674,23 +641,42 @@ generate_spheremonics (ModeInfo *mi)
tweak_parameters (mi);
if (!cc->done_once || (0 == (random() % 20)))
+ init_colors (mi);
+
+ glNewList(cc->dlist, GL_COMPILE);
+ cc->polys1 = unit_spheremonics (mi, cc->resolution, wire,cc->m,cc->colors);
+ glEndList();
+
+ glNewList(cc->dlist2, GL_COMPILE);
+ glPushMatrix();
+ glScalef (1.05, 1.05, 1.05);
+ cc->polys2 = unit_spheremonics (mi, cc->resolution, 2, cc->m, cc->colors);
+ glPopMatrix();
+ glEndList();
+
+ if (! cc->done_once)
{
- init_colors (mi);
- cc->done_once = True;
+ glNewList(cc->grid_dlist, GL_COMPILE);
+ if (do_grid)
+ {
+ static const GLfloat c2[4] = { 1.0, 0.0, 0.0, 1.0 };
+ glPushMatrix();
+ glColor3f (c2[0], c2[1], c2[2]);
+ glBegin(GL_LINES);
+ glVertex3f(0, -0.66, 0);
+ glVertex3f(0, 0.66, 0);
+ glEnd();
+ draw_circle (mi, True);
+ glRotatef(90, 1, 0, 0);
+ draw_circle (mi, True);
+ glRotatef(90, 0, 1, 0);
+ draw_circle (mi, True);
+ glPopMatrix();
+ }
+ glEndList();
}
- {
- glNewList(cc->dlist, GL_COMPILE);
- cc->polys1 = unit_spheremonics (mi, cc->resolution, wire,cc->m,cc->colors);
- glEndList();
-
- glNewList(cc->dlist2, GL_COMPILE);
- glPushMatrix();
- glScalef (1.05, 1.05, 1.05);
- cc->polys2 = unit_spheremonics (mi, cc->resolution, 2, cc->m, cc->colors);
- glPopMatrix();
- glEndList();
- }
+ cc->done_once = True;
}
@@ -750,6 +736,7 @@ init_spheremonics (ModeInfo *mi)
cc->dlist = glGenLists(1);
cc->dlist2 = glGenLists(1);
+ cc->grid_dlist = glGenLists(1);
cc->m_max = 4; /* 9? */
{
@@ -826,8 +813,48 @@ draw_spheremonics (ModeInfo *mi)
mi->polygon_count = 0;
+ if (do_grid)
+ {
+ GLfloat s = 1.5;
+ glDisable (GL_LIGHTING);
+ glPushMatrix();
+ glScalef (s, s, s);
+ glCallList (cc->grid_dlist);
+ glPopMatrix();
+ if (! MI_IS_WIREFRAME(mi))
+ glEnable (GL_LIGHTING);
+ }
+
glScalef (cc->scale, cc->scale, cc->scale);
- glCallList (cc->dlist);
+ glPushMatrix();
+ {
+ double fade_speed = 0.15;
+ GLfloat s;
+ if (cc->fade == 0)
+ s = 1;
+ else if (cc->fade > 0)
+ {
+ s = cc->fade;
+ cc->fade -= fade_speed;
+ cc->change_tick = 0;
+ if (cc->fade <= 0)
+ {
+ cc->fade = -1.0;
+ generate_spheremonics (mi);
+ }
+ }
+ else
+ {
+ s = 1 + cc->fade;
+ cc->fade += fade_speed;
+ cc->change_tick = 0;
+ if (cc->fade >= 0) cc->fade = 0;
+ }
+
+ glScalef (s, s, s);
+ glCallList (cc->dlist);
+ }
+ glPopMatrix();
mi->polygon_count += cc->polys1;
if (cc->mesher >= 0 /* || cc->button_down_p */)
@@ -838,8 +865,9 @@ draw_spheremonics (ModeInfo *mi)
if (cc->mesher >= 0)
cc->mesher--;
}
- do_tracer(mi);
+ if (cc->fade == 0)
+ do_tracer(mi);
if (cc->button_down_p)
{
@@ -862,8 +890,8 @@ draw_spheremonics (ModeInfo *mi)
{
if (cc->change_tick++ >= duration && !cc->button_down_p)
{
- generate_spheremonics(mi);
cc->change_tick = 0;
+ cc->fade = 1.0;
cc->mesher = -1; /* turn off the mesh when switching objects */
}
}
@@ -889,6 +917,7 @@ free_spheremonics (ModeInfo *mi)
if (cc->font_data) free_texture_font (cc->font_data);
if (glIsList(cc->dlist)) glDeleteLists(cc->dlist, 1);
if (glIsList(cc->dlist2)) glDeleteLists(cc->dlist2, 1);
+ if (glIsList(cc->grid_dlist)) glDeleteLists(cc->grid_dlist, 1);
}
XSCREENSAVER_MODULE ("Spheremonics", spheremonics)
diff --git a/hacks/glx/spheremonics.man b/hacks/glx/spheremonics.man
index 5e6f437..ca57c51 100644
--- a/hacks/glx/spheremonics.man
+++ b/hacks/glx/spheremonics.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-spheremonics - 3d spherical harmonic shapes.
+spheremonics \- 3d spherical harmonic shapes.
.SH SYNOPSIS
.B spheremonics
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/splitflap.c b/hacks/glx/splitflap.c
index 8cc8eb4..0706cc8 100644
--- a/hacks/glx/splitflap.c
+++ b/hacks/glx/splitflap.c
@@ -1,4 +1,4 @@
-/* splitflap, Copyright (c) 2015-2018 Jamie Zawinski <jwz@jwz.org>
+/* splitflap, Copyright (c) 2015-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -11,7 +11,7 @@
* Draws a split-flap text display.
*/
-#define FLAP_FONT "-*-helvetica-bold-r-normal-*-*-1440-*-*-*-*-*-*"
+#define FLAP_FONT "sans-serif bold 144"
#define DEFAULTS "*delay: 20000 \n" \
"*showFPS: False \n" \
@@ -27,8 +27,6 @@
"*usePty: False\n"
# define release_splitflap 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#define DEF_SPEED "1.0"
#define DEF_WIDTH "22"
@@ -348,34 +346,6 @@ init_splitflap (ModeInfo *mi)
if (bp->clock_p)
speed /= 4;
- glShadeModel(GL_SMOOTH);
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_NORMALIZE);
- glEnable(GL_CULL_FACE);
-
- if (!wire)
- {
- GLfloat pos[4] = {0.4, 0.2, 0.4, 0.0};
-/* GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};*/
- GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
- GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
- GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
-
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
-
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
-
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- }
-
-
{
double spin_speed = 0.5;
double wander_speed = 0.005;
@@ -658,6 +628,7 @@ draw_fin_text_quad (ModeInfo *mi, flapper *f, int index, Bool top_p)
int tex_width, tex_height;
int i;
+ if (bp->texinfo_size <= 0) abort();
for (i = 0; i < bp->texinfo_size; i++)
{
ti = &bp->texinfo[i];
@@ -683,7 +654,7 @@ draw_fin_text_quad (ModeInfo *mi, flapper *f, int index, Bool top_p)
if (! wire)
{
glBindTexture (GL_TEXTURE_2D, ti->texid);
- enable_texture_string_parameters();
+ enable_texture_string_parameters (bp->font_data);
}
glTranslatef (0, 0, z); /* Move to just above the surface */
@@ -1316,6 +1287,7 @@ draw_splitflap (ModeInfo *mi)
splitflap_configuration *bp = &bps[MI_SCREEN(mi)];
Display *dpy = MI_DISPLAY(mi);
Window window = MI_WINDOW(mi);
+ int wire = MI_IS_WIREFRAME(mi);
if (!bp->glx_context)
return;
@@ -1324,6 +1296,34 @@ draw_splitflap (ModeInfo *mi)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {0.4, 0.2, 0.4, 0.0};
+/* GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};*/
+ GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+
glPushMatrix ();
glRotatef(current_device_rotation(), 0, 0, 1);
diff --git a/hacks/glx/splitflap.man b/hacks/glx/splitflap.man
index 432f490..278bded 100644
--- a/hacks/glx/splitflap.man
+++ b/hacks/glx/splitflap.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-splitflap - a simulation of a split-flap electromechanical display.
+splitflap \- a simulation of a split-flap electromechanical display.
.SH SYNOPSIS
.B splitflap
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/splodesic.c b/hacks/glx/splodesic.c
index 9a2f3a6..7ce8ec2 100644
--- a/hacks/glx/splodesic.c
+++ b/hacks/glx/splodesic.c
@@ -15,8 +15,6 @@
"*suppressRotationAnimation: True\n" \
# define release_splodesic 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "colors.h"
@@ -455,13 +453,12 @@ reshape_splodesic (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
diff --git a/hacks/glx/splodesic.man b/hacks/glx/splodesic.man
index bf31e1d..74e85cd 100644
--- a/hacks/glx/splodesic.man
+++ b/hacks/glx/splodesic.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-splodesic - k
+splodesic \- k
A geodesic sphere experiences a series of eruptions.
.SH SYNOPSIS
.B splodesic
diff --git a/hacks/glx/sproingies.c b/hacks/glx/sproingies.c
index c0d5c9b..bfe4f4a 100644
--- a/hacks/glx/sproingies.c
+++ b/hacks/glx/sproingies.c
@@ -24,12 +24,8 @@ static const char sccsid[] = "@(#)sproingies.c 4.04 97/07/28 xlockmore";
* See sproingiewrap.c
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
-
#ifdef STANDALONE
-# include "xlockmoreI.h" /* from the xscreensaver distribution */
+# include "screenhackI.h" /* from the xscreensaver distribution */
#else /* !STANDALONE */
# include "xlock.h" /* from the xlockmore distribution */
#endif /* !STANDALONE */
diff --git a/hacks/glx/sproingies.man b/hacks/glx/sproingies.man
index 5150fca..86bd8c3 100644
--- a/hacks/glx/sproingies.man
+++ b/hacks/glx/sproingies.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-sproingies - Q-Bert meets Marble Madness!
+sproingies \- Q-Bert meets Marble Madness!
.SH SYNOPSIS
.B sproingies
[\-display \fIhost:display.screen\fP]
@@ -65,4 +65,4 @@ appear in supporting documentation. No representations are made about the
suitability of this software for any purpose. It is provided "as is" without
express or implied warranty.
.SH AUTHOR
-Ed Mackey. Some additional code by Sergio Gutirrez "Sergut".
+Ed Mackey. Some additional code by Sergio Gutiérrez "Sergut".
diff --git a/hacks/glx/sproingiewrap.c b/hacks/glx/sproingiewrap.c
index c4eb759..99ce850 100644
--- a/hacks/glx/sproingiewrap.c
+++ b/hacks/glx/sproingiewrap.c
@@ -22,7 +22,7 @@ static const char sccsid[] = "@(#)sproingiewrap.c 4.07 97/11/24 xlockmore";
*
* Programming: Ed Mackey, http://www.netaxs.com/~emackey/
* Gordon Wrigley, gdw33@student.canterbury.ac.nz
- * Sergio Gutirrez "Sergut", sergut@gmail.com
+ * Sergio Gutiérrez "Sergut", sergut@gmail.com
* Sproingie 3D objects modeled by: Al Mackey, al@iam.com
* (using MetaNURBS in NewTek's Lightwave 3D v5).
*
@@ -66,9 +66,6 @@ static const char sccsid[] = "@(#)sproingiewrap.c 4.07 97/11/24 xlockmore";
#include "sproingies.h"
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
static XrmOptionDescRec opts[] = {
{"-fall", ".smartSproingies", XrmoptionNoArg, "False"},
{"-no-fall", ".smartSproingies", XrmoptionNoArg, "True"},
diff --git a/hacks/glx/stairs.c b/hacks/glx/stairs.c
index faf9a37..c129448 100644
--- a/hacks/glx/stairs.c
+++ b/hacks/glx/stairs.c
@@ -494,6 +494,16 @@ draw_stairs (ModeInfo * mi)
if (rot != 0 && rot != 180 && rot != -180)
glScalef (1/h, 1/h, 1/h);
}
+# else
+ {
+ /* Don't understand why this clause doesn't work on mobile, but it
+ doesn't. */
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glRotatef (current_device_rotation(), 0, 0, 1);
+ glScalef (s, s, s);
+ }
# endif
gltrackball_rotate (sp->trackball);
diff --git a/hacks/glx/stairs.man b/hacks/glx/stairs.man
index 898f7ff..b01cab4 100644
--- a/hacks/glx/stairs.man
+++ b/hacks/glx/stairs.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-stairs - Escher's infinite staircase.
+stairs \- Escher's infinite staircase.
.SH SYNOPSIS
.B stairs
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/starwars.c b/hacks/glx/starwars.c
index 0f1457a..fbdf39d 100644
--- a/hacks/glx/starwars.c
+++ b/hacks/glx/starwars.c
@@ -25,18 +25,6 @@
* starwars -program 'cat starwars.txt' -columns 25 -no-wrap
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
-
-#include <ctype.h>
-#include <sys/stat.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#include "starwars.h"
#define DEFAULTS "*delay: 40000 \n" \
"*showFPS: False \n" \
"*fpsTop: True \n" \
@@ -48,12 +36,18 @@
# define release_sws 0
# define sws_handle_event xlockmore_no_events
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "textclient.h"
#include "utf8wc.h"
+#include "starwars.h"
+
+#include <ctype.h>
+#include <sys/stat.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
#ifdef USE_GL /* whole file */
@@ -79,8 +73,7 @@
#define DEF_FADE "True"
#define DEF_TEXTURES "True"
#define DEF_DEBUG "False"
-
-#define DEF_FONT "-*-utopia-bold-r-normal-*-*-360-*-*-*-*-*-*"
+#define DEF_FONT "sans-serif 36"
#define TAB_WIDTH 8
diff --git a/hacks/glx/starwars.man b/hacks/glx/starwars.man
index d7dc7f2..1d51458 100644
--- a/hacks/glx/starwars.man
+++ b/hacks/glx/starwars.man
@@ -1,19 +1,6 @@
-.de EX \"Begin example
-.ne 5
-.if n .sp 1
-.if t .sp .5
-.nf
-.in +.5i
-..
-.de EE
-.fi
-.in -.5i
-.if n .sp 1
-.if t .sp .5
-..
.TH XScreenSaver 1 "25-Jul-98" "X Version 11"
.SH NAME
-starwars - draws a perspective text crawl, like at the beginning of the movie
+starwars \- draws a perspective text crawl, like at the beginning of the movie
.SH SYNOPSIS
.B starwars
[\-display \fIhost:display.screen\fP] [\-window] [\-root]
@@ -74,14 +61,16 @@ will work, but programs like
won't.
Some examples:
-.EX
-starwars -program 'cat /usr/src/linux*/README'
-starwars -columns 30 -program 'ping www.starwars.com'
-starwars -left -no-wrap -program 'ps -auxwwf'
-starwars -left -no-wrap -columns 45 -program 'top -bn1'
-starwars -left -columns 40 -program 'od -txC /dev/urandom'
-starwars -font fixed -program 'od -txC /dev/urandom'
-.EE
+.nf
+.sp
+ starwars -program 'cat /usr/src/linux*/README'
+ starwars -columns 30 -program 'ping www.starwars.com'
+ starwars -left -no-wrap -program 'ps -auxwwf'
+ starwars -left -no-wrap -columns 45 -program 'top -bn1'
+ starwars -left -columns 40 -program 'od -txC /dev/urandom'
+ starwars -font fixed -program 'od -txC /dev/urandom'
+.sp
+.fi
.TP 8
.B \-size \fIinteger\fP
How large a font to use, in points. (Well, in some arbitrary unit
@@ -157,7 +146,7 @@ to get the name of a resource file that overrides the global resources
stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR xscreensaver (1),
-.BR xscreensaver-text (1),
+.BR xscreensaver\-text (MANSUFFIX),
.BR fortune (1),
.BR phosphor (MANSUFFIX),
.BR apple2 (MANSUFFIX),
diff --git a/hacks/glx/starwars.txt b/hacks/glx/starwars.txt
index 0412ded..155befa 100644
--- a/hacks/glx/starwars.txt
+++ b/hacks/glx/starwars.txt
@@ -413,3 +413,54 @@ desperate escape....
+Episode IX
+
+THE RISE OF SKYWALKER
+
+The dead speak! The galaxy
+has heard a mysterious
+broadcast, a threat of
+REVENGE in the sinister
+voice of the late
+EMPEROR PALPATINE.
+
+GENERAL LEIA ORGANA
+dispatches secret agents to gather
+intelligence, while REY, the last
+hope of the Jedi, trains for battle
+against the diabolical
+FIRST ORDER.
+
+Meanwhile, Supreme Leader
+KYLO REN rages in search
+of the phantom Emperor,
+determined to destroy any
+threat to his power....
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/hacks/glx/stonerview-view.c b/hacks/glx/stonerview-view.c
index baf40e4..bb060ef 100644
--- a/hacks/glx/stonerview-view.c
+++ b/hacks/glx/stonerview-view.c
@@ -15,25 +15,10 @@
by Jamie Zawinski <jwz@jwz.org>, 22-Jan-2001.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#ifdef HAVE_COCOA
-# include "jwxyz.h"
-#elif defined(HAVE_ANDROID)
-# include <GLES/gl.h>
-#else /* real Xlib */
-# include <GL/glx.h>
-# include <GL/glu.h>
-#endif /* !HAVE_COCOA */
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
+#include "screenhackI.h"
+#include "stonerview.h"
#include <stdlib.h>
-#include "stonerview.h"
static GLfloat view_rotx = -45.0, view_roty = 0.0, view_rotz = 15.0;
static GLfloat view_scale = 4.0;
diff --git a/hacks/glx/stonerview.c b/hacks/glx/stonerview.c
index ff4e131..8548385 100644
--- a/hacks/glx/stonerview.c
+++ b/hacks/glx/stonerview.c
@@ -25,8 +25,6 @@
"*wireframe: False \n"
# define release_stonerview 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
diff --git a/hacks/glx/stonerview.h b/hacks/glx/stonerview.h
index 0afd7a6..f82f896 100644
--- a/hacks/glx/stonerview.h
+++ b/hacks/glx/stonerview.h
@@ -1,5 +1,5 @@
/* StonerView: An eccentric visual toy.
- Copyright 1998-2001 by Andrew Plotkin (erkyrath@eblong.com)
+ Copyright 1998-2021 by Andrew Plotkin (erkyrath@eblong.com)
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
@@ -13,10 +13,6 @@
#ifndef __STONERVIEW_H__
# define __STONERVIEW_H__
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
-
typedef struct stonerview_state stonerview_state;
#include "stonerview-osc.h"
diff --git a/hacks/glx/stonerview.man b/hacks/glx/stonerview.man
index 820e9af..2c75e51 100644
--- a/hacks/glx/stonerview.man
+++ b/hacks/glx/stonerview.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-stonerview - 3D undulating ribbons of squares.
+stonerview \- 3D undulating ribbons of squares.
.SH SYNOPSIS
.B stonerview
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/superquadrics.c b/hacks/glx/superquadrics.c
index 69dc920..48c7af7 100644
--- a/hacks/glx/superquadrics.c
+++ b/hacks/glx/superquadrics.c
@@ -573,14 +573,12 @@ DisplaySuperquadrics(ModeInfo *mi)
glScalef(0.7, 0.7, 0.7); /* jwz: scale it down a bit */
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
- {
- GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
- }
-# endif
+ {
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
+ }
polys = DoneScale(sp);
diff --git a/hacks/glx/superquadrics.man b/hacks/glx/superquadrics.man
index 8a127f0..180d3d1 100644
--- a/hacks/glx/superquadrics.man
+++ b/hacks/glx/superquadrics.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-superquadrics - morphing 3d shapes.
+superquadrics \- morphing 3d shapes.
.SH SYNOPSIS
.B superquadrics
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/surfaces.c b/hacks/glx/surfaces.c
index 26439d5..d78944b 100644
--- a/hacks/glx/surfaces.c
+++ b/hacks/glx/surfaces.c
@@ -63,10 +63,6 @@
#include "rotator.h"
#include "gltrackball.h"
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
-
static char *surface_type;
static char *render_mode;
static int render;
@@ -439,13 +435,12 @@ ENTRYPOINT void reshape_surface(ModeInfo *mi, int width, int height)
glLoadIdentity();
gluLookAt(0.0, 0.0, 30.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
diff --git a/hacks/glx/surfaces.man b/hacks/glx/surfaces.man
index 4c62a0e..284abad 100644
--- a/hacks/glx/surfaces.man
+++ b/hacks/glx/surfaces.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-surfaces - Draws some interesting 3d parametric surfaces.
+surfaces \- Draws some interesting 3d parametric surfaces.
.SH SYNOPSIS
.B surfaces
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/swim.c b/hacks/glx/swim.c
index e20655a..e2afa83 100644
--- a/hacks/glx/swim.c
+++ b/hacks/glx/swim.c
@@ -74,7 +74,7 @@ static const char sccsid[] = "@(#)swim.c 1.3 98/06/18 xlockmore";
#ifdef STANDALONE
# include <math.h>
-# include "xlockmoreI.h" /* from the xscreensaver distribution */
+# include "screenhackI.h" /* from the xscreensaver distribution */
#else /* !STANDALONE */
# include "xlock.h" /* from the xlockmore distribution */
#endif /* !STANDALONE */
diff --git a/hacks/glx/tangram.c b/hacks/glx/tangram.c
index c90d611..c7e3657 100644
--- a/hacks/glx/tangram.c
+++ b/hacks/glx/tangram.c
@@ -16,15 +16,13 @@
*/
-#define DEFAULTS "*delay: 10000 \n" \
- "*wireframe: False \n" \
- "*titleFont: -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n" \
- "*titleFont2: -*-helvetica-medium-r-normal-*-*-120-*-*-*-*-*-*\n" \
- "*titleFont3: -*-helvetica-medium-r-normal-*-*-80-*-*-*-*-*-*\n" \
+#define DEFAULTS "*delay: 10000 \n" \
+ "*wireframe: False \n" \
+ "*titleFont: sans-serif 18\n" \
+ "*titleFont2: sans-serif 12\n" \
+ "*titleFont3: sans-serif 8\n" \
# define release_tangram 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
diff --git a/hacks/glx/tangram.man b/hacks/glx/tangram.man
index c5d3980..18d147d 100644
--- a/hacks/glx/tangram.man
+++ b/hacks/glx/tangram.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-tangram - watch the computer solve tangram puzzles.
+tangram \- watch the computer solve tangram puzzles.
.SH SYNOPSIS
.B tangram
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/tangram_shapes.c b/hacks/glx/tangram_shapes.c
index 267b187..2e8bab2 100644
--- a/hacks/glx/tangram_shapes.c
+++ b/hacks/glx/tangram_shapes.c
@@ -9,22 +9,7 @@
* implied warranty.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
-
-#ifndef HAVE_JWXYZ
-# include <GL/gl.h>
-#endif
-
-#ifdef HAVE_ANDROID
-#include <GLES/gl.h>
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
+#include "screenhackI.h"
#include "tangram_shapes.h"
#define small_scale ( 1 )
diff --git a/hacks/glx/teapot.c b/hacks/glx/teapot.c
index c885d27..3a1d4a2 100644
--- a/hacks/glx/teapot.c
+++ b/hacks/glx/teapot.c
@@ -44,22 +44,10 @@ Graphics, Inc., 2011 N. Shoreline Blvd., Mountain View, CA
OpenGL(TM) is a trademark of Silicon Graphics, Inc.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
+#include "screenhackI.h"
#include "teapot.h"
-#ifndef HAVE_JWXYZ
-# include <GL/gl.h>
-#endif
-#ifdef HAVE_ANDROID
-# include <GLES/gl.h>
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#else
+#ifndef HAVE_JWZGLES
# define HAVE_GLMAP
#endif
diff --git a/hacks/glx/texfont.c b/hacks/glx/texfont.c
index f879d50..d5951dc 100644
--- a/hacks/glx/texfont.c
+++ b/hacks/glx/texfont.c
@@ -1,4 +1,4 @@
-/* texfonts, Copyright (c) 2005-2018 Jamie Zawinski <jwz@jwz.org>
+/* texfont, Copyright © 2005-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -8,55 +8,95 @@
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*
- * Renders X11 fonts into textures for use with OpenGL.
+ * Renders X11 fonts into textures for use with OpenGL or GLSL.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include "screenhackI.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
-#ifdef HAVE_COCOA
-# ifdef USE_IPHONE
-# include "jwzgles.h"
-# else
-# include <OpenGL/glu.h>
-# endif
-#elif defined(HAVE_ANDROID)
-# include <GLES/gl.h>
-# include "jwzgles.h"
-#else
-# include <GL/glx.h>
-# include <GL/glu.h>
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
#ifdef HAVE_XSHM_EXTENSION
# include "xshm.h"
#endif /* HAVE_XSHM_EXTENSION */
-#include "xft.h"
+#include "fps.h" /* for current_device_rotation() */
#include "pow2.h"
#include "resources.h"
#include "texfont.h"
-#include "fps.h" /* for current_device_rotation() */
+#include "utf8wc.h"
-#undef HAVE_XSHM_EXTENSION /* doesn't actually do any good here */
+#ifdef HAVE_GLSL
+# include "glsl-utils.h"
+#endif /* HAVE_GLSL */
+#undef HAVE_XSHM_EXTENSION /* doesn't actually do any good here */
-/* These are in xlock-gl.c */
-extern void clear_gl_error (void);
+extern void clear_gl_error (void); /* xlock-gl.c */
extern void check_gl_error (const char *type);
+extern float jwxyz_font_scale (Window); /* jwxyz-cocoa.m */
+
+
+#ifdef HAVE_GLSL
+/* Shader programs for rendering text textures when the caller is using
+ GLSL and the GLES 3.x API rather than the OpenGL 3.1 or GLES 1.x APIs.
+ */
+static const GLchar *shader_version_2_1 = "#version 120\n";
+static const GLchar *shader_version_3_0 = "#version 130\n";
+static const GLchar *shader_version_3_0_es = "#version 300 es \n\
+ precision highp float; \n\
+ precision highp int; \n\
+";
+static const GLchar *vertex_shader_attribs_2_1 = "\
+ attribute vec2 VertexCoord; \n\
+ attribute vec2 VertexTex; \n\
+ varying vec2 TexCoord; \n\
+ varying vec4 Color; \n\
+";
+static const GLchar *vertex_shader_attribs_3_0 = "\
+ in vec2 VertexCoord; \n\
+ in vec2 VertexTex; \n\
+ out vec2 TexCoord; \n\
+ out vec4 Color; \n\
+";
+static const GLchar *vertex_shader_main = "\
+ uniform mat4 ProjMat; \n\
+ uniform vec4 FontColor; \n\
+ void main (void) \n\
+ { \n\
+ gl_Position = ProjMat*vec4 (VertexCoord, 0, 1); \n\
+ TexCoord = VertexTex; \n\
+ Color = FontColor; \n\
+ } \n\
+";
+static const GLchar *fragment_shader_attribs_2_1 = "\
+ varying vec4 Color; \n\
+ varying vec2 TexCoord; \n\
+";
+static const GLchar *fragment_shader_attribs_3_0 = "\
+ in vec4 Color; \n\
+ in vec2 TexCoord; \n\
+ out vec4 FragColor; \n\
+";
+static const GLchar *fragment_shader_main = "\
+ uniform sampler2D TexSampler; \n\
+ void main (void) \n\
+ { \n\
+ const float MinAlpha = 0.01; \n\
+ const float LODBias = 0.25; \n\
+ if (Color.a <= MinAlpha) \n\
+ discard; \n\
+";
+static const GLchar *fragment_shader_out_2_1 = "\
+ gl_FragColor = Color*texture2D (TexSampler, TexCoord.st, LODBias); \n\
+ }\n";
+static const GLchar *fragment_shader_out_3_0 = "\
+ FragColor = Color*texture (TexSampler, TexCoord.st, LODBias); \n\
+ }\n";
+#endif /* HAVE_GLSL */
-/* screenhack.h */
-extern char *progname;
/* LRU cache of textures, to optimize the case where we're drawing the
same strings repeatedly.
@@ -75,13 +115,15 @@ struct texture_font_data {
XftFont *xftfont;
int cache_size;
texfont_cache *cache;
+# ifdef HAVE_GLSL
+ Bool shaders_initialized, use_shaders;
+ GLuint shader_program;
+ GLint vertex_coord_index, vertex_tex_index;
+ GLint proj_mat_index, font_color_index, tex_sampler_index;
+# endif /* HAVE_GLSL */
};
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
-
/* Given a Pixmap (of screen depth), converts it to an OpenGL luminance mipmap.
RGB are averaged to grayscale, and the resulting value is treated as alpha.
Pass in the size of the pixmap; the size of the texture is returned
@@ -91,9 +133,10 @@ struct texture_font_data {
were drawn with antialiasing, that is preserved.
*/
static void
-bitmap_to_texture (Display *dpy, Pixmap p, Visual *visual, int depth,
- int *wP, int *hP)
+bitmap_to_texture (const texture_font_data *tfdata, Pixmap p,
+ Visual *visual, int depth, int *wP, int *hP)
{
+ Display *dpy = tfdata->dpy;
Bool mipmap_p = True;
int ow = *wP;
int oh = *hP;
@@ -229,10 +272,23 @@ bitmap_to_texture (Display *dpy, Pixmap p, Visual *visual, int depth,
# endif
GLuint type = GL_UNSIGNED_BYTE;
- if (mipmap_p)
- gluBuild2DMipmaps (GL_TEXTURE_2D, iformat, w2, h2, format, type, data);
+#ifdef HAVE_GLSL
+ if (tfdata->use_shaders)
+ {
+ glTexImage2D (GL_TEXTURE_2D, 0, iformat, w2, h2, 0, format,
+ type, data);
+ glGenerateMipmap (GL_TEXTURE_2D);
+ }
else
- glTexImage2D (GL_TEXTURE_2D, 0, iformat, w2, h2, 0, format, type, data);
+#endif /* HAVE_GLSL */
+ {
+ if (mipmap_p)
+ gluBuild2DMipmaps (GL_TEXTURE_2D, iformat, w2, h2, format,
+ type, data);
+ else
+ glTexImage2D (GL_TEXTURE_2D, 0, iformat, w2, h2, 0, format,
+ type, data);
+ }
}
{
@@ -258,9 +314,9 @@ load_texture_font (Display *dpy, char *res)
{
int screen = DefaultScreen (dpy);
char *font = get_string_resource (dpy, res, "Font");
- const char *def1 = "-*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*";
- const char *def2 = "-*-helvetica-medium-r-normal-*-*-140-*-*-*-*-*-*";
- const char *def3 = "fixed";
+ const char *def1 = "sans-serif 18";
+ const char *def2 = "sans-serif 14";
+ const char *def3 = "monospace";
XftFont *f = 0;
texture_font_data *data;
int cache_size = get_integer_resource (dpy, "texFontCacheSize", "Integer");
@@ -273,20 +329,20 @@ load_texture_font (Display *dpy, char *res)
if (!res || !*res) abort();
if (!strcmp (res, "fpsFont")) { /* Kludge. */
- def1 = "-*-courier-bold-r-normal-*-*-180-*-*-*-*-*-*"; /* also fps.c */
+ def1 = "monospace bold 18"; /* also fps.c */
cache_size = 0; /* No need for a cache on FPS: already throttled. */
}
if (!font) font = strdup(def1);
- f = XftFontOpenXlfd (dpy, screen, font);
+ f = load_xft_font_retry (dpy, screen, font);
if (!f && !!strcmp (font, def1))
{
fprintf (stderr, "%s: unable to load font \"%s\", using \"%s\"\n",
progname, font, def1);
free (font);
font = strdup (def1);
- f = XftFontOpenXlfd (dpy, screen, font);
+ f = load_xft_font_retry (dpy, screen, font);
}
if (!f && !!strcmp (font, def2))
@@ -295,7 +351,7 @@ load_texture_font (Display *dpy, char *res)
progname, font, def2);
free (font);
font = strdup (def2);
- f = XftFontOpenXlfd (dpy, screen, font);
+ f = load_xft_font_retry (dpy, screen, font);
}
if (!f && !!strcmp (font, def3))
@@ -304,7 +360,7 @@ load_texture_font (Display *dpy, char *res)
progname, font, def3);
free (font);
font = strdup (def3);
- f = XftFontOpenXlfd (dpy, screen, font);
+ f = load_xft_font_retry (dpy, screen, font);
}
if (!f)
@@ -322,6 +378,22 @@ load_texture_font (Display *dpy, char *res)
data->xftfont = f;
data->cache_size = cache_size;
+#ifdef HAVE_GLSL
+ /* Setting data->shaders_initialized to False will cause
+ initialize_textfont_shaders_glsl to be called by print_texture_label,
+ if necessary. If strings are displayed by print_texture_string, the
+ caller is responsible for calling initialize_textfont_shaders_glsl
+ first. */
+ data->shaders_initialized = False;
+ data->use_shaders = False;
+ data->shader_program = 0;
+ data->vertex_coord_index = -1;
+ data->vertex_tex_index = -1;
+ data->proj_mat_index = -1;
+ data->font_color_index = -1;
+ data->tex_sampler_index = -1;
+#endif /* HAVE_GLSL */
+
return data;
}
@@ -455,7 +527,7 @@ texture_string_metrics (texture_font_data *data, const char *s,
Otherwise it is an empty entry waiting to be rendered.
*/
static struct texfont_cache *
-get_cache (texture_font_data *data, const char *string)
+texfont_get_cache (texture_font_data *data, const char *string)
{
int count = 0;
texfont_cache *prev = 0, *prev2 = 0, *curr = 0, *next = 0;
@@ -512,13 +584,10 @@ get_cache (texture_font_data *data, const char *string)
}
-/* Renders the given string into the prevailing texture.
- Returns the metrics of the text, and size of the texture.
- */
-void
-string_to_texture (texture_font_data *data, const char *string,
- XCharStruct *extents_ret,
- int *tex_width_ret, int *tex_height_ret)
+static Pixmap
+string_to_pixmap (texture_font_data *data, const char *string,
+ XCharStruct *extents_ret,
+ int *width_ret, int *height_ret)
{
Window window = RootWindow (data->dpy, 0);
Pixmap p;
@@ -557,36 +626,160 @@ string_to_texture (texture_font_data *data, const char *string,
xftdraw, &xftcolor, 0);
XftDrawDestroy (xftdraw);
XftColorFree (data->dpy, xgwa.visual, xgwa.colormap, &xftcolor);
+ if (width_ret) *width_ret = width;
+ if (height_ret) *height_ret = height;
+ if (extents_ret) *extents_ret = overall;
+ return p;
+}
+
+
+/* Renders the given string into the prevailing texture.
+ Returns the metrics of the text, and size of the texture.
+ */
+void
+string_to_texture (texture_font_data *data, const char *string,
+ XCharStruct *extents_ret,
+ int *tex_width_ret, int *tex_height_ret)
+{
+ Window window = RootWindow (data->dpy, 0);
+ XWindowAttributes xgwa;
+ int width, height;
+ Pixmap p = string_to_pixmap (data, string, extents_ret, &width, &height);
/* Copy the bits from the Pixmap into a texture, unless it's cached.
*/
- bitmap_to_texture (data->dpy, p, xgwa.visual, xgwa.depth,
- &width, &height);
+ XGetWindowAttributes (data->dpy, window, &xgwa);
+ bitmap_to_texture (data, p, xgwa.visual, xgwa.depth, &width, &height);
XFreePixmap (data->dpy, p);
- if (extents_ret) *extents_ret = overall;
if (tex_width_ret) *tex_width_ret = width;
if (tex_height_ret) *tex_height_ret = height;
}
+/* True if the string appears to be a "missing" character.
+ The string should contain a single UTF8 character.
+
+ Since there may be no reliable way to tell whether a font contains a
+ character or has substituted a "missing" glyph for it, this function
+ examines the bits to see if it is either solid black, or is a simple
+ rectangle, which is what most fonts use.
+ */
+Bool
+blank_character_p (texture_font_data *data, const char *string)
+{
+ Window window = RootWindow (data->dpy, 0);
+ int width, height;
+ Pixmap p;
+ XImage *im;
+ int x, y, j;
+ int *xings;
+ XWindowAttributes xgwa;
+ Bool ret = False;
+
+# ifdef HAVE_XFT
+ /* Xft lets us actually ask whether the character is in the font!
+ I'm not sure that this is a guarantee that the character is not
+ a substitution rectangle, however. */
+ {
+ unsigned long uc = 0;
+ utf8_decode ((const unsigned char *) string, strlen (string), &uc);
+ ret = !XftCharExists (data->dpy, data->xftfont, (FcChar32) uc);
+
+# if 0
+ {
+ const unsigned char *s = (unsigned char *) string;
+ fprintf (stderr, "## %d %lu", ret, uc);
+ for (; *s; s++) fprintf (stderr, " %02x", *s);
+ fprintf (stderr, "\t [%s]\n", string);
+ }
+# endif
+
+ if (ret) return ret; /* If Xft says it is blank, believe it. */
+ }
+# endif /* HAVE_XFT */
+
+ /* If we don't have real Xft, we have to check the bits.
+ If we do have Xft and it says that the character exists,
+ verify that by checking the bits anyway.
+ */
+
+ p = string_to_pixmap (data, string, 0, &width, &height);
+ im = XGetImage (data->dpy, p, 0, 0, width, height, ~0L, ZPixmap);
+ xings = (int *) calloc (height, sizeof(*xings));
+ XFreePixmap (data->dpy, p);
+ XGetWindowAttributes (data->dpy, window, &xgwa);
+
+ for (y = 0, j = 0; y < im->height; y++)
+ {
+ unsigned long prev = 0;
+ int c = 0;
+ for (x = 0; x < im->width; x++)
+ {
+ unsigned long p = XGetPixel (im, x, y);
+ p = (p & 0x0000FF00); /* Take just one channel, any channel */
+ p = p ? 1 : 0; /* Only care about B&W */
+ if (p != prev) c++;
+ prev = p;
+ }
+ if (j == 0 || xings[j-1] != c)
+ xings[j++] = c;
+ }
+
+ /* xings contains a schematic of how many times the color changed
+ on a line, with duplicates removed, e.g.:
+
+ * 1 ***** 1 **** 1 **** 1
+ * * 3 * * 3 * * 3 * * 3
+ * * . ***** 1 * 1 * * .
+ ******* 1 * * 3 * . * * .
+ * * 3 * * . * * 3 * * .
+ * * . ***** 1 **** 1 **** 1
+
+ So "131" is the pattern for a hollow rectangle, which is what most
+ fonts use for missing characters. It also gets a false positive on
+ capital or lower case O, and on 0 without a slash, but I can live
+ with that.
+ */
+
+ if (j <= 1)
+ ret = True;
+ else if (j == 3 && xings[0] == 1 && xings[1] == 3 && xings[2] == 1)
+ ret = True;
+ else if (im->width < 2 || im->height < 2)
+ ret = True;
+
+ XDestroyImage (im);
+ free (xings);
+ return ret;
+}
+
+
+
/* Set the various OpenGL parameters for properly rendering things
with a texture generated by string_to_texture().
*/
void
-enable_texture_string_parameters (void)
+enable_texture_string_parameters (texture_font_data *data)
{
- glEnable (GL_TEXTURE_2D);
-
- /* Texture-rendering parameters to make font pixmaps tolerable to look at.
- */
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+# ifdef HAVE_GLSL
+ if (data->use_shaders)
+ return;
+# endif /* HAVE_GLSL */
+
+ glEnable (GL_TEXTURE_2D);
/* LOD bias is part of OpenGL 1.4.
GL_EXT_texture_lod_bias has been present since the original iPhone.
- */
+ */
# if !defined(GL_TEXTURE_LOD_BIAS) && defined(GL_TEXTURE_LOD_BIAS_EXT)
# define GL_TEXTURE_LOD_BIAS GL_TEXTURE_LOD_BIAS_EXT
# endif
@@ -595,17 +788,14 @@ enable_texture_string_parameters (void)
# endif
clear_gl_error(); /* invalid enum on iPad 3 */
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-
/* Don't write the transparent parts of the quad into the depth buffer. */
+# ifndef HAVE_ANDROID /* WTF? */
glAlphaFunc (GL_GREATER, 0.01);
+# endif
glEnable (GL_ALPHA_TEST);
- glEnable (GL_BLEND);
glDisable (GL_LIGHTING);
glDisable (GL_TEXTURE_GEN_S);
glDisable (GL_TEXTURE_GEN_T);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
@@ -632,7 +822,7 @@ print_texture_string (texture_font_data *data, const char *string)
/* Save the prevailing texture ID, and bind ours. Restored at the end. */
glGetIntegerv (GL_TEXTURE_BINDING_2D, &old_texture);
- cache = get_cache (data, string);
+ cache = texfont_get_cache (data, string);
glBindTexture (GL_TEXTURE_2D, cache->texid);
check_gl_error ("texture font binding");
@@ -648,19 +838,13 @@ print_texture_string (texture_font_data *data, const char *string)
}
else
{
-# if defined HAVE_JWXYZ && defined JWXYZ_GL
- /* TODO, JWXYZ_GL: Mixing Xlib and GL has issues. */
- memset (&overall, 0, sizeof(overall));
- tex_width = 8;
- tex_height = 8;
-# else
string_to_texture (data, string, &overall, &tex_width, &tex_height);
-# endif
}
{
int ofront, oblend;
- Bool alpha_p, blend_p, light_p, gen_s_p, gen_t_p;
+ Bool alpha_p = False, blend_p = False, light_p = False;
+ Bool gen_s_p = False, gen_t_p = False;
GLfloat omatrix[16];
GLfloat qx0, qy0, qx1, qy1;
GLfloat tx0, ty0, tx1, ty1;
@@ -668,27 +852,34 @@ print_texture_string (texture_font_data *data, const char *string)
/* If face culling is not enabled, draw front and back. */
Bool draw_back_face_p = !glIsEnabled (GL_CULL_FACE);
- /* Save the prevailing texture environment, and set up ours.
- */
+ /* Save the prevailing texture environment. */
glGetIntegerv (GL_FRONT_FACE, &ofront);
- glGetIntegerv (GL_BLEND_DST, &oblend);
- glGetFloatv (GL_TEXTURE_MATRIX, omatrix);
- blend_p = glIsEnabled (GL_BLEND);
- alpha_p = glIsEnabled (GL_ALPHA_TEST);
- light_p = glIsEnabled (GL_LIGHTING);
- gen_s_p = glIsEnabled (GL_TEXTURE_GEN_S);
- gen_t_p = glIsEnabled (GL_TEXTURE_GEN_T);
- glPushMatrix();
+# ifdef HAVE_GLSL
+ if (!data->use_shaders)
+# endif /* HAVE_GLSL */
+ {
+ glGetIntegerv (GL_BLEND_DST, &oblend);
+ glGetFloatv (GL_TEXTURE_MATRIX, omatrix);
+ check_gl_error ("texture font matrix");
+ blend_p = glIsEnabled (GL_BLEND);
+ alpha_p = glIsEnabled (GL_ALPHA_TEST);
+ light_p = glIsEnabled (GL_LIGHTING);
+ gen_s_p = glIsEnabled (GL_TEXTURE_GEN_S);
+ gen_t_p = glIsEnabled (GL_TEXTURE_GEN_T);
+
+ glPushMatrix();
+
+ glNormal3f (0, 0, 1);
+
+ glMatrixMode (GL_TEXTURE);
+ glLoadIdentity ();
+ glMatrixMode (GL_MODELVIEW);
+ }
- glNormal3f (0, 0, 1);
glFrontFace (GL_CW);
- glMatrixMode (GL_TEXTURE);
- glLoadIdentity ();
- glMatrixMode (GL_MODELVIEW);
-
- enable_texture_string_parameters();
+ enable_texture_string_parameters (data);
/* Draw a quad with that texture on it, possibly using a cached texture.
Position the XCharStruct origin at 0,0 in the scene.
@@ -703,44 +894,89 @@ print_texture_string (texture_font_data *data, const char *string)
tx1 = (overall.rbearing - overall.lbearing) / (GLfloat) tex_width;
ty0 = (overall.ascent + overall.descent) / (GLfloat) tex_height;
- glEnable (GL_CULL_FACE);
- glFrontFace (GL_CCW);
- glBegin (GL_QUADS);
- glTexCoord2f (tx0, ty0); glVertex3f (qx0, qy0, 0);
- glTexCoord2f (tx1, ty0); glVertex3f (qx1, qy0, 0);
- glTexCoord2f (tx1, ty1); glVertex3f (qx1, qy1, 0);
- glTexCoord2f (tx0, ty1); glVertex3f (qx0, qy1, 0);
- glEnd();
+# ifdef HAVE_GLSL
+ if (data->use_shaders)
+ {
+ static const GLuint indices[6] = { 0, 1, 2, 2, 3, 0 };
+ GLfloat v[4][2], t[4][2];
+
+ v[0][0] = qx0; v[0][1] = qy0; t[0][0] = tx0; t[0][1] = ty0;
+ v[1][0] = qx1; v[1][1] = qy0; t[1][0] = tx1; t[1][1] = ty0;
+ v[2][0] = qx1; v[2][1] = qy1; t[2][0] = tx1; t[2][1] = ty1;
+ v[3][0] = qx0; v[3][1] = qy1; t[3][0] = tx0; t[3][1] = ty1;
+
+ glEnableVertexAttribArray (data->vertex_coord_index);
+ glVertexAttribPointer (data->vertex_coord_index, 2, GL_FLOAT, GL_FALSE,
+ 2 * sizeof(GLfloat), v);
+
+ glEnableVertexAttribArray (data->vertex_tex_index);
+ glVertexAttribPointer (data->vertex_tex_index, 2, GL_FLOAT, GL_FALSE,
+ 2 * sizeof(GLfloat), t);
+
+ glEnable (GL_CULL_FACE);
+ glFrontFace (GL_CCW);
+ glDrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_INT, indices);
+
+ if (draw_back_face_p)
+ {
+ glFrontFace (GL_CW);
+ glDrawElements (GL_TRIANGLE_STRIP, 2, GL_UNSIGNED_INT, indices);
+ }
+
+ glDisableVertexAttribArray (data->vertex_coord_index);
+ glDisableVertexAttribArray (data->vertex_tex_index);
- if (draw_back_face_p)
+ glDisable(GL_CULL_FACE);
+ }
+ else
+# endif /* HAVE_GLSL */
{
- glFrontFace (GL_CW);
+ glEnable (GL_CULL_FACE);
+ glFrontFace (GL_CCW);
glBegin (GL_QUADS);
glTexCoord2f (tx0, ty0); glVertex3f (qx0, qy0, 0);
glTexCoord2f (tx1, ty0); glVertex3f (qx1, qy0, 0);
glTexCoord2f (tx1, ty1); glVertex3f (qx1, qy1, 0);
glTexCoord2f (tx0, ty1); glVertex3f (qx0, qy1, 0);
glEnd();
+
+ if (draw_back_face_p)
+ {
+ glFrontFace (GL_CW);
+ glBegin (GL_QUADS);
+ glTexCoord2f (tx0, ty0); glVertex3f (qx0, qy0, 0);
+ glTexCoord2f (tx1, ty0); glVertex3f (qx1, qy0, 0);
+ glTexCoord2f (tx1, ty1); glVertex3f (qx1, qy1, 0);
+ glTexCoord2f (tx0, ty1); glVertex3f (qx0, qy1, 0);
+ glEnd();
+ }
+
glDisable (GL_CULL_FACE);
- }
- glPopMatrix();
+ glPopMatrix();
+ }
/* Reset to the caller's texture environment.
*/
- glBindTexture (GL_TEXTURE_2D, old_texture);
- glFrontFace (ofront);
- if (!alpha_p) glDisable (GL_ALPHA_TEST);
+# ifdef HAVE_GLSL
+ if (!data->use_shaders)
+# endif /* HAVE_GLSL */
+ {
+ glBlendFunc (GL_SRC_ALPHA, oblend);
+ glMatrixMode (GL_TEXTURE);
+ glMultMatrixf (omatrix);
+ glMatrixMode (GL_MODELVIEW);
+ if (!alpha_p) glDisable (GL_ALPHA_TEST);
+ if (light_p) glEnable (GL_LIGHTING);
+ if (gen_s_p) glEnable (GL_TEXTURE_GEN_S);
+ if (gen_t_p) glEnable (GL_TEXTURE_GEN_T);
+ }
+
if (!blend_p) glDisable (GL_BLEND);
- if (light_p) glEnable (GL_LIGHTING);
- if (gen_s_p) glEnable (GL_TEXTURE_GEN_S);
- if (gen_t_p) glEnable (GL_TEXTURE_GEN_T);
- glBlendFunc (GL_SRC_ALPHA, oblend);
+ glFrontFace (ofront);
- glMatrixMode (GL_TEXTURE);
- glMultMatrixf (omatrix);
- glMatrixMode (GL_MODELVIEW);
+ glBindTexture (GL_TEXTURE_2D, old_texture);
check_gl_error ("texture font print");
@@ -757,6 +993,135 @@ print_texture_string (texture_font_data *data, const char *string)
}
+#ifdef HAVE_GLSL
+/* Initialize the texture font shaders that are used if the hack prefers
+ to use a GLSL implementation of the text drawing functionality. This
+ function must be called before the first string is displayed. It assumes
+ that the OpenGL graphics context is set to the actual context in which
+ the shaders will be used. Note that this is not necessarily true in
+ load_texture_font (for example, if the -pair option is used to run a
+ hack). */
+static void
+initialize_textfont_shaders_glsl (texture_font_data *data)
+{
+ GLint gl_major, gl_minor, glsl_major, glsl_minor;
+ GLboolean gl_gles3;
+ const GLchar *vertex_shader_source[3];
+ const GLchar *fragment_shader_source[4];
+
+ data->use_shaders = False;
+
+ if (!glsl_GetGlAndGlslVersions(&gl_major,&gl_minor,&glsl_major,&glsl_minor,
+ &gl_gles3))
+ {
+ data->shaders_initialized = True;
+ return;
+ }
+
+ if (!gl_gles3)
+ {
+ if (gl_major < 3 ||
+ (glsl_major < 1 || (glsl_major == 1 && glsl_minor < 30)))
+ {
+ if ((gl_major < 2 || (gl_major == 2 && gl_minor < 1)) ||
+ (glsl_major < 1 || (glsl_major == 1 && glsl_minor < 20)))
+ {
+ data->shaders_initialized = True;
+ return;
+ }
+ /* We have at least OpenGL 2.1 and at least GLSL 1.20. */
+ vertex_shader_source[0] = shader_version_2_1;
+ vertex_shader_source[1] = vertex_shader_attribs_2_1;
+ vertex_shader_source[2] = vertex_shader_main;
+ fragment_shader_source[0] = shader_version_2_1;
+ fragment_shader_source[1] = fragment_shader_attribs_2_1;
+ fragment_shader_source[2] = fragment_shader_main;
+ fragment_shader_source[3] = fragment_shader_out_2_1;
+ }
+ else
+ {
+ /* We have at least OpenGL 3.0 and at least GLSL 1.30. */
+ vertex_shader_source[0] = shader_version_3_0;
+ vertex_shader_source[1] = vertex_shader_attribs_3_0;
+ vertex_shader_source[2] = vertex_shader_main;
+ fragment_shader_source[0] = shader_version_3_0;
+ fragment_shader_source[1] = fragment_shader_attribs_3_0;
+ fragment_shader_source[2] = fragment_shader_main;
+ fragment_shader_source[3] = fragment_shader_out_3_0;
+ }
+ }
+ else /* gl_gles3 */
+ {
+ if (gl_major < 3 || glsl_major < 3)
+ {
+ data->shaders_initialized = True;
+ return;
+ }
+ /* We have at least OpenGL ES 3.0 and at least GLSL ES 3.0. */
+ vertex_shader_source[0] = shader_version_3_0_es;
+ vertex_shader_source[1] = vertex_shader_attribs_3_0;
+ vertex_shader_source[2] = vertex_shader_main;
+ fragment_shader_source[0] = shader_version_3_0_es;
+ fragment_shader_source[1] = fragment_shader_attribs_3_0;
+ fragment_shader_source[2] = fragment_shader_main;
+ fragment_shader_source[3] = fragment_shader_out_3_0;
+ }
+ if (!glsl_CompileAndLinkShaders(3,vertex_shader_source,
+ 4,fragment_shader_source,
+ &data->shader_program))
+ {
+ data->shaders_initialized = True;
+ return;
+ }
+ data->vertex_coord_index = glGetAttribLocation(data->shader_program,
+ "VertexCoord");
+ data->vertex_tex_index = glGetAttribLocation(data->shader_program,
+ "VertexTex");
+ data->proj_mat_index = glGetUniformLocation(data->shader_program,
+ "ProjMat");
+ data->font_color_index = glGetUniformLocation(data->shader_program,
+ "FontColor");
+ data->tex_sampler_index = glGetUniformLocation(data->shader_program,
+ "TexSampler");
+ if (data->vertex_coord_index != -1 && data->vertex_tex_index != -1 &&
+ data->proj_mat_index != -1 && data->font_color_index != -1 &&
+ data->tex_sampler_index != -1)
+ {
+ data->use_shaders = True;
+ data->shaders_initialized = True;
+ }
+ else
+ {
+ glDeleteProgram(data->shader_program);
+ data->shader_program = 0;
+ data->shaders_initialized = True;
+ }
+}
+#endif /* HAVE_GLSL */
+
+
+
+static void
+texfont_transrot (texture_font_data *data,
+ GLfloat mat[16],
+ GLfloat tx, GLfloat ty, GLfloat tz,
+ GLfloat r, GLfloat rx, GLfloat ry, GLfloat rz)
+{
+# ifdef HAVE_GLSL
+ if (data->use_shaders)
+ {
+ glsl_Translate (mat, tx, ty, tz);
+ glsl_Rotate (mat, r, rx, ry, rz);
+ }
+ else
+# endif /* HAVE_GLSL */
+ {
+ glTranslatef (tx, ty, tz);
+ glRotatef (r, rx, ry, rz);
+ }
+}
+
+
/* Draws the string on the window at the given pixel position.
Newlines and tab stops are honored.
Any numbers inside [] will be rendered as a subscript.
@@ -771,164 +1136,255 @@ print_texture_label (Display *dpy,
int position,
const char *string)
{
- GLfloat color[4];
-
- Bool tex_p = glIsEnabled (GL_TEXTURE_2D);
- Bool texs_p = glIsEnabled (GL_TEXTURE_GEN_S);
- Bool text_p = glIsEnabled (GL_TEXTURE_GEN_T);
- Bool depth_p = glIsEnabled (GL_DEPTH_TEST);
- Bool cull_p = glIsEnabled (GL_CULL_FACE);
- Bool fog_p = glIsEnabled (GL_FOG);
+ GLfloat color[4] = { 1, 1, 1, 1 };
+ Bool tex_p = False, texs_p = False, text_p = False;
+ Bool depth_p = False, fog_p = False, cull_p = False;
GLint ovp[4];
-
-# ifndef HAVE_JWZGLES
+ GLfloat proj_mat[16];
+# ifndef HAVE_JWZGLES
GLint opoly[2];
- glGetIntegerv (GL_POLYGON_MODE, opoly);
-# endif
+# endif
+
+ cull_p = glIsEnabled (GL_CULL_FACE);
+ depth_p = glIsEnabled (GL_DEPTH_TEST);
glGetIntegerv (GL_VIEWPORT, ovp);
+ /* This call will fail with an OpenGL ES 3.0 context. color will maintain
+ its initial value of {1,1,1,1} in this case. We clear the potential
+ error afterwards. */
+ clear_gl_error();
glGetFloatv (GL_CURRENT_COLOR, color);
+ clear_gl_error ();
+#ifdef HAVE_ANDROID
+ Log ("texfont current color 0x%04X (%5.3f,%5.3f,%5.3f,%5.3f)",
+ GL_CURRENT_COLOR,color[0], color[1], color[2], color[3]);
+#endif
- glEnable (GL_TEXTURE_2D);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glPolygonMode (GL_FRONT, GL_FILL);
-
- glDisable (GL_TEXTURE_GEN_S);
- glDisable (GL_TEXTURE_GEN_T);
- glDisable (GL_CULL_FACE);
- glDisable (GL_FOG);
glDisable (GL_DEPTH_TEST);
- /* Each matrix mode has its own stack, so we need to push/pop
- them separately.
- */
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- {
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
+# ifdef HAVE_GLSL
+ if (!data->shaders_initialized)
+ {
+ if (get_boolean_resource (dpy, "prefersGLSL", "PrefersGLSL"))
+ initialize_textfont_shaders_glsl (data);
+ }
+
+ if (data->use_shaders)
+ {
+ glUseProgram (data->shader_program);
+ glActiveTexture (GL_TEXTURE0);
+ glUniform1i (data->tex_sampler_index, 0);
+ }
+ else
+# endif /* HAVE_GLSL */
{
- XCharStruct cs;
- int ascent, descent;
- int x, y, w, h, swap;
- /* int rot = (int) current_device_rotation(); */
- int rot = 0; /* Since GL hacks rotate now */
+ tex_p = glIsEnabled (GL_TEXTURE_2D);
+ texs_p = glIsEnabled (GL_TEXTURE_GEN_S);
+ text_p = glIsEnabled (GL_TEXTURE_GEN_T);
+ fog_p = glIsEnabled (GL_FOG);
+
+ glDisable (GL_TEXTURE_GEN_S);
+ glDisable (GL_TEXTURE_GEN_T);
+ glDisable (GL_CULL_FACE);
+ glDisable (GL_FOG);
+ glEnable (GL_TEXTURE_2D);
+
+#ifndef HAVE_JWZGLES
+ glGetIntegerv (GL_POLYGON_MODE, opoly);
+#endif
+ glPolygonMode (GL_FRONT, GL_FILL);
+
+ /* Each matrix mode has its own stack, so we need to push/pop
+ them separately.
+ */
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
glLoadIdentity();
- glViewport (0, 0, window_width, window_height);
- glOrtho (0, window_width, 0, window_height, -1, 1);
+ }
- while (rot <= -180) rot += 360;
- while (rot > 180) rot -= 360;
+ {
+ XCharStruct cs;
+ int ascent, descent;
+ int x, y, w, h, swap;
+ /* int rot = (int) current_device_rotation(); */
+ int rot = 0; /* Since GL hacks rotate now */
- texture_string_metrics (data, string, &cs, &ascent, &descent);
- h = cs.ascent + cs.descent;
- w = cs.width;
+ glViewport (0, 0, window_width, window_height);
-# ifdef USE_IPHONE
+# ifdef HAVE_GLSL
+ if (data->use_shaders)
{
- /* Size of the font is in points, so scale iOS pixels to points. */
- GLfloat scale = ((window_width > window_height
- ? window_width : window_height)
- / 768.0);
- if (scale < 1) scale = 1;
-
- /* jwxyz-XLoadFont has already doubled the font size, to compensate
- for physically smaller screens. Undo that, since OpenGL hacks
- use full-resolution framebuffers, unlike X11 hacks. */
- scale /= 2;
-
- window_width /= scale;
- window_height /= scale;
- glScalef (scale, scale, scale);
+ glsl_Identity (proj_mat);
+ glsl_Orthographic (proj_mat, 0, window_width, 0, window_height, -1 ,1);
+ }
+ else
+# endif /* HAVE_GLSL */
+ {
+ glOrtho (0, window_width, 0, window_height, -1, 1);
}
-# endif /* USE_IPHONE */
- if (rot > 135 || rot < -135) /* 180 */
- {
- glTranslatef (window_width, window_height, 0);
- glRotatef (180, 0, 0, 1);
- }
- else if (rot > 45) /* 90 */
- {
- glTranslatef (window_width, 0, 0);
- glRotatef (90, 0, 0, 1);
- swap = window_width;
- window_width = window_height;
- window_height = swap;
- }
- else if (rot < -45) /* 270 */
- {
- glTranslatef(0, window_height, 0);
- glRotatef (-90, 0, 0, 1);
- swap = window_width;
- window_width = window_height;
- window_height = swap;
- }
+ while (rot <= -180) rot += 360;
+ while (rot > 180) rot -= 360;
- switch (position) {
- case 0: /* center */
- x = (window_width - w) / 2;
- y = (window_height + h) / 2 - ascent;
- break;
- case 1: /* top */
- x = ascent;
- y = window_height - ascent*2;
- break;
- case 2: /* bottom */
- x = ascent;
- y = h;
- break;
- default:
- abort();
- }
+ texture_string_metrics (data, string, &cs, &ascent, &descent);
+ h = cs.ascent + cs.descent;
+ w = cs.width;
- glTranslatef (x, y, 0);
+# ifdef HAVE_IPHONE
+ {
+ /* Size of the font is in points, so scale iOS pixels to points. */
+ GLfloat scale = ((window_width > window_height
+ ? window_width : window_height)
+ / 768.0);
+ if (scale < 1) scale = 1;
+
+ /* jwxyz-XLoadFont has already doubled the font size, to compensate
+ for physically smaller screens. Undo that, since OpenGL hacks
+ use full-resolution framebuffers, unlike X11 hacks. */
+ scale /= jwxyz_font_scale (RootWindow (dpy, 0));
+
+ window_width /= scale;
+ window_height /= scale;
+
+# ifdef HAVE_GLSL
+ if (data->use_shaders)
+ glsl_Scale (proj_mat, scale, scale, scale);
+ else
+# endif /* HAVE_GLSL */
+ glScalef (scale, scale, scale);
+ }
+# endif /* HAVE_IPHONE */
- /* draw the text five times, to give it a border. */
+ if (rot > 135 || rot < -135) /* 180 */
+ {
+ texfont_transrot (data, proj_mat,
+ window_width, window_height, 0,
+ 180, 0, 0, 1);
+ }
+ else if (rot > 45) /* 90 */
{
- const XPoint offsets[] = {{ -1, -1 },
- { -1, 1 },
- { 1, 1 },
- { 1, -1 },
- { 0, 0 }};
- int i;
+ texfont_transrot (data, proj_mat,
+ window_width, 0, 0,
+ 90, 0, 0, 1);
+ swap = window_width;
+ window_width = window_height;
+ window_height = swap;
+ }
+ else if (rot < -45) /* 270 */
+ {
+ texfont_transrot (data, proj_mat,
+ 0, window_height, 0,
+ -90, 0, 0, 1);
+ swap = window_width;
+ window_width = window_height;
+ window_height = swap;
+ }
+
+ switch (position) {
+ case 0: /* center */
+ x = (window_width - w) / 2;
+ y = (window_height + h) / 2 - ascent;
+ break;
+ case 1: /* top */
+ x = ascent;
+ y = window_height - ascent*2;
+ break;
+ case 2: /* bottom */
+ x = ascent;
+ y = h;
+ break;
+ default:
+ abort();
+ }
+
+ texfont_transrot (data, proj_mat,
+ x, y, 0,
+ 0, 0, 0, 1);
+ /* draw the text five times, to give it a border. */
+ {
+ const XPoint offsets[] = {{ -1, -1 },
+ { -1, 1 },
+ { 1, 1 },
+ { 1, -1 },
+ { 0, 0 }};
+ int i;
+
+# ifdef HAVE_GLSL
+ if (data->use_shaders)
+ glUniform4f (data->font_color_index, 0, 0, 0, 1);
+ else
+# endif /* HAVE_GLSL */
glColor3f (0, 0, 0);
- for (i = 0; i < countof(offsets); i++)
- {
- if (offsets[i].x == 0)
- glColor4fv (color);
- glPushMatrix();
- glTranslatef (offsets[i].x, offsets[i].y, 0);
- print_texture_string (data, string);
- glPopMatrix();
- }
- }
+
+ for (i = 0; i < countof(offsets); i++)
+ {
+ if (offsets[i].x == 0)
+ {
+# ifdef HAVE_GLSL
+ if (data->use_shaders)
+ glUniform4fv (data->font_color_index, 1, color);
+ else
+# endif /* HAVE_GLSL */
+ glColor4fv (color);
+ }
+
+# ifdef HAVE_GLSL
+ if (data->use_shaders)
+ {
+ GLfloat proj_mat_trans[16];
+ glsl_CopyMatrix (proj_mat_trans, proj_mat);
+ glsl_Translate (proj_mat_trans, offsets[i].x,offsets[i].y, 0);
+ glUniformMatrix4fv (data->proj_mat_index, 1, GL_FALSE,
+ proj_mat_trans);
+ print_texture_string (data, string);
+ }
+ else
+# endif /* HAVE_GLSL */
+ {
+ glPushMatrix();
+ glTranslatef (offsets[i].x, offsets[i].y, 0);
+ print_texture_string (data, string);
+ glPopMatrix();
+ }
+ }
}
- glPopMatrix();
}
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- if (tex_p) glEnable (GL_TEXTURE_2D); else glDisable (GL_TEXTURE_2D);
- if (texs_p) glEnable (GL_TEXTURE_GEN_S);/*else glDisable(GL_TEXTURE_GEN_S);*/
- if (text_p) glEnable (GL_TEXTURE_GEN_T);/*else glDisable(GL_TEXTURE_GEN_T);*/
- if (depth_p) glEnable (GL_DEPTH_TEST); else glDisable (GL_DEPTH_TEST);
- if (cull_p) glEnable (GL_CULL_FACE); /*else glDisable (GL_CULL_FACE);*/
- if (fog_p) glEnable (GL_FOG); /*else glDisable (GL_FOG);*/
+# ifdef HAVE_GLSL
+ if (data->use_shaders)
+ {
+ glUseProgram (0);
+ }
+ else
+# endif /* HAVE_GLSL */
+ {
+ glPopMatrix();
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+
+ if (tex_p) glEnable (GL_TEXTURE_2D); else glDisable (GL_TEXTURE_2D);
+ if (texs_p) glEnable (GL_TEXTURE_GEN_S);
+ if (text_p) glEnable (GL_TEXTURE_GEN_T);
+ if (fog_p) glEnable (GL_FOG); /*else glDisable (GL_FOG);*/
+#ifndef HAVE_JWZGLES
+ glPolygonMode (GL_FRONT, opoly[0]);
+#endif
+ }
glViewport (ovp[0], ovp[1], ovp[2], ovp[3]);
-# ifndef HAVE_JWZGLES
- glPolygonMode (GL_FRONT, opoly[0]);
-# endif
-
- glMatrixMode(GL_MODELVIEW);
+ if (cull_p) glEnable (GL_CULL_FACE); /*else glDisable (GL_CULL_FACE);*/
+ if (depth_p) glEnable (GL_DEPTH_TEST); else glDisable (GL_DEPTH_TEST);
}
@@ -958,5 +1414,16 @@ free_texture_font (texture_font_data *data)
}
if (data->xftfont)
XftFontClose (data->dpy, data->xftfont);
+
+# ifdef HAVE_GLSL
+ if (data->use_shaders &&
+ data->shaders_initialized &&
+ data->shader_program != 0)
+ {
+ glUseProgram (0);
+ glDeleteProgram (data->shader_program);
+ }
+# endif /* HAVE_GLSL */
+
free (data);
}
diff --git a/hacks/glx/texfont.h b/hacks/glx/texfont.h
index 8f86dab..1d1f61c 100644
--- a/hacks/glx/texfont.h
+++ b/hacks/glx/texfont.h
@@ -1,4 +1,4 @@
-/* texfonts, Copyright (c) 2005-2016 Jamie Zawinski <jwz@jwz.org>
+/* texfonts, Copyright (c) 2005-2021 Jamie Zawinski <jwz@jwz.org>
* Loads X11 fonts into textures for use with OpenGL.
*
* Permission to use, copy, modify, distribute, and sell this software and its
@@ -13,6 +13,10 @@
#ifndef __TEXTURE_FONT_H__
#define __TEXTURE_FONT_H__
+
+#include "xft.h"
+
+
typedef struct texture_font_data texture_font_data;
/* Loads the font named by the X resource "res" and returns
@@ -55,7 +59,15 @@ void string_to_texture (texture_font_data *, const char *,
/* Set the various OpenGL parameters for properly rendering things
with a texture generated by string_to_texture().
*/
-void enable_texture_string_parameters (void);
+void enable_texture_string_parameters (texture_font_data *);
+
+
+/* True if the string appears to be a "missing" character. Since there is
+ no way to tell whether a font contains a character or has substituted a
+ "missing" glyph for it, we examine the bits to see if it is either
+ solid black, or is a simple rectangle, which is what most fonts use.
+ */
+Bool blank_character_p (texture_font_data *, const char *);
/* Releases the texture font.
diff --git a/hacks/glx/timetunnel.c b/hacks/glx/timetunnel.c
index 2dd83be..ee216cc 100644
--- a/hacks/glx/timetunnel.c
+++ b/hacks/glx/timetunnel.c
@@ -10,8 +10,6 @@
* implied warranty.
*/
-#define GL_GLEXT_PROTOTYPES 1
-
#include <math.h> /* for log2 */
#define DEFAULTS "*delay: 30000 \n" \
@@ -24,8 +22,6 @@
# define release_tunnel 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "colors.h"
diff --git a/hacks/glx/timetunnel.man b/hacks/glx/timetunnel.man
index cdd6af5..58a89d1 100644
--- a/hacks/glx/timetunnel.man
+++ b/hacks/glx/timetunnel.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-timetunnel - Plasma tunnels fade in and out
+timetunnel \- Plasma tunnels fade in and out
.SH SYNOPSIS
.B timetunnel
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/topblock.c b/hacks/glx/topblock.c
index 59a463f..4976a6f 100644
--- a/hacks/glx/topblock.c
+++ b/hacks/glx/topblock.c
@@ -35,9 +35,6 @@ History
"*showFPS: False \n" \
"*wireframe: False \n" \
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#include "xlockmore.h"
#include "topblock.h"
#include "sphere.h"
@@ -345,14 +342,16 @@ draw_topBlock (ModeInfo *mi)
/* rotate the world */
glRotatef(tb->rotation, 0.0, 0.0, 1.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+#if 0 /* This makes the blocks pop into existence already on screen */
+ /* We should just make them drop from higher, but it's not obvious
+ to me where that is set. */
{
- GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
+#endif
llCurrent = tb->blockNodeRoot;
if (drawCarpet) {
diff --git a/hacks/glx/topblock.man b/hacks/glx/topblock.man
index bbe4965..dafd55e 100644
--- a/hacks/glx/topblock.man
+++ b/hacks/glx/topblock.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-topblock - a 3D world of falling blocks that build up and up.
+topblock \- a 3D world of falling blocks that build up and up.
.SH SYNOPSIS
.B topblock
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/trackball.h b/hacks/glx/trackball.h
index 4b84ab7..532c6f2 100644
--- a/hacks/glx/trackball.h
+++ b/hacks/glx/trackball.h
@@ -55,7 +55,7 @@ trackball(float q[4], float p1x, float p1y, float p2x, float p2y);
/*
* Given two quaternions, add them together to get a third quaternion.
- * Adding quaternions to get a compound rotation is analagous to adding
+ * Adding quaternions to get a compound rotation is analogous to adding
* translations to get a compound translation. When incrementally
* adding rotations, the first argument here should be the new
* rotation, the second and third the total rotation (which will be
diff --git a/hacks/glx/tronbit.c b/hacks/glx/tronbit.c
index 7354355..966ccf0 100644
--- a/hacks/glx/tronbit.c
+++ b/hacks/glx/tronbit.c
@@ -15,8 +15,6 @@
"*wireframe: False \n"
# define release_bit 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "colors.h"
@@ -477,15 +475,12 @@ draw_bit (ModeInfo *mi)
glPushMatrix ();
glScalef(1.1, 1.1, 1.1);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
- glRotatef(o, 0, 0, 1);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
{
double x, y, z;
diff --git a/hacks/glx/tronbit.man b/hacks/glx/tronbit.man
index 9001f0e..bda26fa 100644
--- a/hacks/glx/tronbit.man
+++ b/hacks/glx/tronbit.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-tronbit - Yes. Yes. No. Yes. Yes. No. Yes. Yes yes yes yes yes.
+tronbit \- Yes. Yes. No. Yes. Yes. No. Yes. Yes yes yes yes yes.
.SH SYNOPSIS
.B tronbit
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/tube.c b/hacks/glx/tube.c
index a5c0c96..87f1872 100644
--- a/hacks/glx/tube.c
+++ b/hacks/glx/tube.c
@@ -10,27 +10,11 @@
* implied warranty.
*/
-#include <math.h>
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdlib.h>
-
-#ifdef HAVE_COCOA
-#elif defined(HAVE_ANDROID)
-# include <GLES/gl.h>
-#else
-# include <GL/gl.h>
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
+#include "screenhackI.h"
#include "tube.h"
+#include <math.h>
+
typedef struct { GLfloat x, y, z; } XYZ;
diff --git a/hacks/glx/tunnel_draw.c b/hacks/glx/tunnel_draw.c
index 8a87c76..4e23339 100644
--- a/hacks/glx/tunnel_draw.c
+++ b/hacks/glx/tunnel_draw.c
@@ -34,9 +34,8 @@ static const char sccsid[] = "@(#)tunnel_draw.c 5.13 2004/05/25 xlockmore";
*
*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
+#include "screenhackI.h"
+#include "tunnel_draw.h"
#ifdef USE_GL /* whole file */
@@ -44,24 +43,6 @@ static const char sccsid[] = "@(#)tunnel_draw.c 5.13 2004/05/25 xlockmore";
#include <stdlib.h>
#include <math.h>
-#ifdef STANDALONE
-# ifndef HAVE_JWXYZ
-# include <GL/gl.h>
-# include <GL/glu.h>
-# endif
-#endif
-#ifdef HAVE_ANDROID
-#include <GLES/gl.h>
-#endif
-
-
-#include "tunnel_draw.h"
-
-#ifdef STANDALONE /* For NRAND() */
-#include "xlockmoreI.h" /* in xscreensaver distribution */
-#else /* STANDALONE */
-#include "xlock.h" /* in xlockmore distribution */
-#endif /* STANDALONE */
typedef struct
{
diff --git a/hacks/glx/unicrud.c b/hacks/glx/unicrud.c
index 3ddd480..9cd8d48 100644
--- a/hacks/glx/unicrud.c
+++ b/hacks/glx/unicrud.c
@@ -1,4 +1,4 @@
-/* unicrud, Copyright (c) 2016-2018 Jamie Zawinski <jwz@jwz.org>
+/* unicrud, Copyright (c) 2016-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -9,15 +9,13 @@
* implied warranty.
*/
-#define DEFAULTS "*delay: 20000 \n" \
- "*showFPS: False \n" \
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*titleFont: sans-serif bold 18\n" \
+ "*font: sans-serif bold 300\n" \
"*suppressRotationAnimation: True\n" \
- "*titleFont: -*-helvetica-bold-r-normal-*-*-180-*-*-*-*-*-*\n" \
- "*font: -*-helvetica-bold-r-normal-*-*-2400-*-*-*-*-iso10646-1\n" \
# define release_unicrud 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "rotator.h"
@@ -580,6 +578,7 @@ pick_unichar (ModeInfo *mi)
unsigned long max = 0x2F800;
unsigned long last = 0;
int retries = 0;
+ time_t start_time = time ((time_t *) 0);
AGAIN:
bp->unichar = min + (random() % (max - min));
@@ -632,8 +631,15 @@ pick_unichar (ModeInfo *mi)
i = utf8_encode (bp->unichar, text, sizeof(text) - 1);
text[i] = 0;
texture_string_metrics (bp->char_font, text, &e, 0, 0);
- if (e.width < 2 || e.ascent + e.descent < 2)
- goto AGAIN;
+
+ if (e.width < 2 ||
+ e.ascent + e.descent < 2 ||
+ blank_character_p (bp->char_font, text))
+ {
+ time_t now = time ((time_t *) 0);
+ if (now < start_time + 5) /* Might be a *very* bad font... */
+ goto AGAIN;
+ }
}
# ifdef HAVE_JWXYZ
@@ -721,13 +727,12 @@ reshape_unicrud (ModeInfo *mi, int width, int height)
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
diff --git a/hacks/glx/unicrud.man b/hacks/glx/unicrud.man
index 694ea06..f85ad21 100644
--- a/hacks/glx/unicrud.man
+++ b/hacks/glx/unicrud.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-unicrud - Bounces a random Unicode character on the screen.
+unicrud \- Bounces a random Unicode character on the screen.
.SH SYNOPSIS
.B unicrud
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/unknownpleasures.c b/hacks/glx/unknownpleasures.c
index 1fdee6d..f53f29f 100644
--- a/hacks/glx/unknownpleasures.c
+++ b/hacks/glx/unknownpleasures.c
@@ -49,8 +49,6 @@
"*geometry: =800x800" "\n" \
# define release_unk 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
#include "colors.h"
diff --git a/hacks/glx/unknownpleasures.man b/hacks/glx/unknownpleasures.man
index 405d78f..33ea46d 100644
--- a/hacks/glx/unknownpleasures.man
+++ b/hacks/glx/unknownpleasures.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-unknownpleasures - a waterfall graph of the signal from pulsar PSR B1919+21.
+unknownpleasures \- a waterfall graph of the signal from pulsar PSR B1919+21.
.SH SYNOPSIS
.B unknownpleasures
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/vigilance.c b/hacks/glx/vigilance.c
index 49f0df5..a3add18 100644
--- a/hacks/glx/vigilance.c
+++ b/hacks/glx/vigilance.c
@@ -23,8 +23,6 @@
"*groundColor: #004400" "\n" \
# define release_camera 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#define DEF_SPEED "1.0"
#define DEF_CAMERA_SIZE "1.0"
@@ -153,13 +151,12 @@ reshape_camera (ModeInfo *mi, int width, int height)
0, 0, 0,
0, 1, 0);
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
{
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (1/h, 1/h, 1/h);
+ GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
+ : 1);
+ glScalef (s, s, s);
}
-# endif
glClear(GL_COLOR_BUFFER_BIT);
}
@@ -1059,10 +1056,7 @@ draw_camera (ModeInfo *mi)
glPushMatrix ();
-# ifdef HAVE_MOBILE
glRotatef (current_device_rotation(), 0, 0, 1); /* right side up */
-# endif
-
gltrackball_rotate (bp->user_trackball);
# ifdef HAVE_MOBILE
diff --git a/hacks/glx/vigilance.man b/hacks/glx/vigilance.man
index 306950d..12ab910 100644
--- a/hacks/glx/vigilance.man
+++ b/hacks/glx/vigilance.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-vigilance - screen saver.
+vigilance \- screen saver.
.SH SYNOPSIS
.B vigilance
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/voronoi.c b/hacks/glx/voronoi.c
index 01b3ccd..d2c3bb7 100644
--- a/hacks/glx/voronoi.c
+++ b/hacks/glx/voronoi.c
@@ -14,8 +14,6 @@
"*suppressRotationAnimation: True\n" \
# define release_voronoi 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
@@ -339,7 +337,7 @@ reshape_voronoi (ModeInfo *mi, int width, int height)
int rot = current_device_rotation();
glTranslatef (0.5, 0.5, 0);
- // glScalef(0.19, 0.19, 0.19);
+ /* glScalef(0.19, 0.19, 0.19); */
if (rot == 180 || rot == -180) {
glTranslatef (1, 1, 0);
diff --git a/hacks/glx/voronoi.man b/hacks/glx/voronoi.man
index 713f08c..8eb4a41 100644
--- a/hacks/glx/voronoi.man
+++ b/hacks/glx/voronoi.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-voronoi - draws a randomly-colored Voronoi tessellation
+voronoi \- draws a randomly-colored Voronoi tessellation
.SH SYNOPSIS
.B voronoi
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/glx/winduprobot.c b/hacks/glx/winduprobot.c
index 148dd1f..237352d 100644
--- a/hacks/glx/winduprobot.c
+++ b/hacks/glx/winduprobot.c
@@ -39,7 +39,7 @@
* https://www.youtube.com/watch?v=EZF4ZAAy49g
*/
-#define LABEL_FONT "-*-helvetica-bold-r-normal-*-*-240-*-*-*-*-*-*"
+#define LABEL_FONT "sans-serif bold 24"
#define DEFAULTS "*delay: 20000 \n" \
"*count: 25 \n" \
@@ -69,8 +69,6 @@
#define WORDBUBBLES
# define release_robot 0
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
#define DEF_SPEED "1.0"
#define DEF_ROBOT_SIZE "1.0"
@@ -380,33 +378,6 @@ init_robot (ModeInfo *mi)
reshape_robot (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- glShadeModel(GL_SMOOTH);
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_NORMALIZE);
- glEnable(GL_CULL_FACE);
-
- if (!wire)
- {
- GLfloat pos[4] = {0.4, 0.2, 0.4, 0.0};
-/* GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};*/
- GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
- GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
- GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
-
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
-
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
-
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- }
-
# ifdef HAVE_TEXTURE
if (!wire && do_texture)
load_textures (mi);
@@ -2295,6 +2266,7 @@ draw_robot (ModeInfo *mi)
robot_configuration *bp = &bps[MI_SCREEN(mi)];
Display *dpy = MI_DISPLAY(mi);
Window window = MI_WINDOW(mi);
+ int wire = MI_IS_WIREFRAME(mi);
GLfloat robot_size;
depth_sorter *sorted;
int i;
@@ -2306,12 +2278,36 @@ draw_robot (ModeInfo *mi)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {0.4, 0.2, 0.4, 0.0};
+/* GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};*/
+ GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
glPushMatrix ();
-# ifdef HAVE_MOBILE
glRotatef (current_device_rotation(), 0, 0, 1); /* right side up */
-# endif
-
gltrackball_rotate (bp->user_trackball);
glTranslatef (0, -20, 0); /* Move the horizon down the screen */
@@ -2481,9 +2477,12 @@ free_robot (ModeInfo *mi)
if (bp->user_trackball) gltrackball_free (bp->user_trackball);
if (bp->walkers) free (bp->walkers);
- if (robot_dome) free (robot_dome); robot_dome = 0;
- if (robot_gear) free (robot_gear); robot_gear = 0;
- if (ground) free (ground); ground = 0;
+ if (robot_dome) free (robot_dome);
+ robot_dome = 0;
+ if (robot_gear) free (robot_gear);
+ robot_gear = 0;
+ if (ground) free (ground);
+ ground = 0;
# ifdef WORDBUBBLES
if (bp->tc) textclient_close (bp->tc);
diff --git a/hacks/glx/winduprobot.man b/hacks/glx/winduprobot.man
index 5e7f801..89ae29d 100644
--- a/hacks/glx/winduprobot.man
+++ b/hacks/glx/winduprobot.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-winduprobot - screen saver.
+winduprobot \- screen saver.
.SH SYNOPSIS
.B winduprobot
[\-display \fIhost:display.screen\fP]
@@ -72,7 +72,7 @@ stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1)
-.BR xscreensaver-text (1)
+.BR xscreensaver\-text (MANSUFFIX)
.SH COPYRIGHT
Copyright \(co 2014 by Jamie Zawinski. Permission to use, copy, modify,
distribute, and sell this software and its documentation for any purpose is
diff --git a/hacks/glx/xlock-gl-utils.c b/hacks/glx/xlock-gl-utils.c
index 3e610a1..0d017b8 100644
--- a/hacks/glx/xlock-gl-utils.c
+++ b/hacks/glx/xlock-gl-utils.c
@@ -1,5 +1,5 @@
/* xlock-gl.c --- xscreensaver compatibility layer for xlockmore GL modules.
- * xscreensaver, Copyright (c) 1997-2015 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1997-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -14,8 +14,10 @@
* By Jamie Zawinski <jwz@jwz.org> on 31-May-97.
*/
-#include <stdio.h>
#include "xlockmoreI.h"
+
+#ifdef HAVE_GL /* whole file */
+
#include "texfont.h"
#ifndef isupper
@@ -26,6 +28,7 @@
#endif
+# ifndef HAVE_EGL
/* Gag -- we use this to turn X errors from glXCreateContext() into
something that will actually make sense to the user.
*/
@@ -43,11 +46,13 @@ BadValue_ehandler (Display *dpy, XErrorEvent *error)
else
return orig_ehandler (dpy, error);
}
+#endif /* !HAVE_EGL */
GLXContext *
init_GL(ModeInfo * mi)
{
+ /* The Android version of this function is in android/screenhack-android.c */
Display *dpy = mi->dpy;
Window window = mi->window;
Screen *screen = mi->xgwa.screen;
@@ -61,7 +66,10 @@ init_GL(ModeInfo * mi)
}
# ifdef HAVE_JWZGLES
- jwzgles_make_current(jwzgles_make_state(state));
+ mi->jwzgles_state = jwzgles_make_state();
+ mi->xlmft->jwzgles_make_current = jwzgles_make_current;
+ mi->xlmft->jwzgles_free = jwzgles_free_state;
+ mi->xlmft->jwzgles_make_current (mi->jwzgles_state);
# endif
vi_in.screen = screen_number (screen);
@@ -70,6 +78,113 @@ init_GL(ModeInfo * mi)
&vi_in, &out_count);
if (! vi_out) abort ();
+# ifdef HAVE_EGL
+ {
+ egl_data *d = (egl_data *) calloc (1, sizeof(*d));
+
+ /* The correct EGL config has been selected by utils/visual-gl.c
+ (via hacks/glx/xscreensaver-gl-visual) by calling get_egl_config()
+ from get_gl_visual and returning the corresponding X11 Visual.
+ That visual is the one that was used to create our window. We will
+ pass the corresponding visual ID to get_egl_config() to obtain the
+ same configuration here. */
+ unsigned int vid = XVisualIDFromVisual (visual);
+
+ const EGLint ctxattr1[] = {
+# ifdef HAVE_JWZGLES
+ EGL_CONTEXT_MAJOR_VERSION, 1, /* Request an OpenGL ES 1.1 context. */
+ EGL_CONTEXT_MINOR_VERSION, 1,
+# else
+ EGL_CONTEXT_MAJOR_VERSION, 1, /* Request an OpenGL 1.3 context. */
+ EGL_CONTEXT_MINOR_VERSION, 3,
+# endif
+ EGL_NONE
+ };
+ const EGLint *ctxattr = ctxattr1;
+
+# ifdef HAVE_GLES3
+ const EGLint ctxattr3[] = {
+ EGL_CONTEXT_MAJOR_VERSION, 3, /* Request an OpenGL ES 3.0 context. */
+ EGL_CONTEXT_MINOR_VERSION, 0,
+ EGL_NONE
+ };
+
+ if (get_boolean_resource (dpy, "prefersGLSL", "PrefersGLSL"))
+ ctxattr = ctxattr3;
+# endif /* HAVE_GLES3 */
+
+ /* This is re-used, no need to close it. */
+ d->egl_display = eglGetPlatformDisplay (EGL_PLATFORM_X11_KHR,
+ (EGLNativeDisplayType) dpy, NULL);
+ if (!d->egl_display)
+ {
+ fprintf (stderr, "%s: eglGetPlatformDisplay failed\n", progname);
+ abort();
+ }
+
+ get_egl_config (dpy, d->egl_display, vid, &d->egl_config);
+ if (!d->egl_config)
+ {
+ fprintf (stderr, "%s: no matching EGL config for X11 visual 0x%lx\n",
+ progname, vi_out->visualid);
+ abort();
+ }
+
+ d->egl_surface = eglCreatePlatformWindowSurface (d->egl_display,
+ d->egl_config,
+ &window, NULL);
+ if (! d->egl_surface)
+ {
+ fprintf (stderr, "%s: eglCreatePlatformWindowSurface failed:"
+ " window 0x%lx visual 0x%x\n", progname, window, vid);
+ abort();
+ }
+
+#ifdef HAVE_JWZGLES
+ /* This call is not strictly necessary to get an OpenGL ES context
+ since the default API is EGL_OPENGL_ES_API, but it makes our
+ intention clear.
+ */
+ if (!eglBindAPI (EGL_OPENGL_ES_API))
+ {
+ fprintf (stderr, "%s: eglBindAPI failed\n", progname);
+ }
+#else /* !HAVE_JWZGLES */
+ /* This is necessary to get a OpenGL context instead of an OpenGLES
+ context.
+ */
+ if (!eglBindAPI (EGL_OPENGL_API))
+ {
+ fprintf (stderr, "%s: eglBindAPI failed\n", progname);
+ }
+#endif /* !HAVE_JWZGLES */
+
+ d->egl_context = eglCreateContext (d->egl_display, d->egl_config,
+ EGL_NO_CONTEXT, ctxattr);
+
+# ifdef HAVE_GLES3
+ /* If creation of a GLES 3.0 context failed, fall back to GLES 1.x. */
+ if (!d->egl_context && ctxattr != ctxattr1)
+ {
+ /* fprintf (stderr, "%s: eglCreateContext 3.0 failed\n", progname); */
+ d->egl_context = eglCreateContext (d->egl_display, d->egl_config,
+ EGL_NO_CONTEXT, ctxattr1);
+ }
+# endif /* HAVE_GLES3 */
+
+ if (!d->egl_context)
+ {
+ fprintf (stderr, "%s: eglCreateContext failed\n", progname);
+ abort();
+ }
+
+ /* describe_gl_visual (stderr, screen, visual, False); */
+
+ mi->glx_context = d; /* #### leaked */
+
+ glXMakeCurrent (dpy, window, mi->glx_context);
+ }
+# else /* GLX */
{
XSync (dpy, False);
orig_ehandler = XSetErrorHandler (BadValue_ehandler);
@@ -80,8 +195,6 @@ init_GL(ModeInfo * mi)
mi->glx_context = 0;
}
- XFree((char *) vi_out);
-
if (!mi->glx_context)
{
fprintf(stderr, "%s: couldn't create GL context for visual 0x%x.\n",
@@ -100,6 +213,9 @@ init_GL(ModeInfo * mi)
glClearIndex (BlackPixelOfScreen (screen));
}
}
+# endif /* GLX */
+
+ XFree((char *) vi_out);
/* jwz: the doc for glDrawBuffer says "The initial value is GL_FRONT
@@ -229,3 +345,35 @@ xlockmore_validate_gl_visual (Screen *screen, const char *name, Visual *visual)
{
return validate_gl_visual (stderr, screen, name, visual);
}
+
+
+#ifdef HAVE_EGL
+
+static egl_data *global_egl_kludge = 0;
+
+Bool
+glXMakeCurrent (Display *dpy, GLXDrawable window, egl_data *d)
+{
+ if (!d) abort();
+ if (! eglMakeCurrent (d->egl_display, d->egl_surface, d->egl_surface,
+ d->egl_context))
+ abort();
+
+ global_egl_kludge = d;
+
+ return True;
+}
+
+void
+glXSwapBuffers (Display *dpy, GLXDrawable win)
+{
+ egl_data *d = global_egl_kludge;
+ if (!d) abort();
+ if (! eglSwapBuffers (d->egl_display, d->egl_surface))
+ abort();
+}
+
+#endif /* HAVE_EGL */
+
+
+#endif /* HAVE_GL -- whole file */
diff --git a/hacks/glx/xscreensaver-gl-visual.c b/hacks/glx/xscreensaver-gl-visual.c
new file mode 100644
index 0000000..9fc3b81
--- /dev/null
+++ b/hacks/glx/xscreensaver-gl-visual.c
@@ -0,0 +1,87 @@
+/* xscreensaver, Copyright (c) 2000-2021 by Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* xscreensaver-gl-visual -- prints the ID of the best visual to use
+ for GL programs on stdout.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+#else /* real X11 */
+# include <X11/Xlib.h>
+# include <X11/Xutil.h>
+# include <X11/Xos.h>
+#endif /* !HAVE_JWXYZ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <GL/gl.h>
+#include <GL/glx.h>
+
+#include "visual.h"
+
+char *progname = 0;
+char *progclass = "XScreenSaver";
+
+int
+main (int argc, char **argv)
+{
+ Display *dpy;
+ Screen *screen;
+ Visual *visual;
+ char *d = getenv ("DISPLAY");
+ int i;
+
+ progname = argv[0];
+ for (i = 1; i < argc; i++)
+ {
+ if (argv[i][0] == '-' && argv[i][1] == '-') argv[i]++;
+ if (strlen(argv[i]) >= 2 &&
+ !strncmp ("-display", argv[i], strlen(argv[i])))
+ {
+ if (i == argc-1) goto LOSE;
+ d = argv[i+1];
+ i++;
+ }
+ else
+ {
+ LOSE:
+ fprintf (stderr, "usage: %s [ -display host:dpy.screen ]\n",
+ progname);
+ fprintf (stderr,
+ "This program prints out the ID of the best "
+ "X visual for GL programs to use.\n");
+ exit (1);
+ }
+ }
+
+ dpy = XOpenDisplay (d);
+ if (!dpy)
+ {
+ fprintf (stderr, "%s: couldn't open display %s\n", progname,
+ (d ? d : "(null)"));
+ exit (1);
+ }
+
+ screen = DefaultScreenOfDisplay (dpy);
+ visual = get_gl_visual (screen);
+
+ if (visual)
+ printf ("0x%x\n", (unsigned int) XVisualIDFromVisual (visual));
+ else
+ printf ("none\n");
+
+ exit (0);
+}
diff --git a/hacks/glx/xscreensaver-gl-visual.man b/hacks/glx/xscreensaver-gl-visual.man
new file mode 100644
index 0000000..af56cd1
--- /dev/null
+++ b/hacks/glx/xscreensaver-gl-visual.man
@@ -0,0 +1,33 @@
+.TH XScreenSaver 1 "5-Nov-00" "X Version 11"
+.SH NAME
+xscreensaver-gl-visual \- figure out which X visual to use for GL programs
+.SH SYNOPSIS
+.B xscreensaver-gl-visual
+[\-display \fIhost:display.screen\fP]
+.SH DESCRIPTION
+This program prints the ID of the visual that should be used for proper
+operation of OpenGL programs. This program only exists so that the
+.BR xscreensaver (1)
+daemon does not need to link against the OpenGL library.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host, display, and screen number.
+.SH SEE ALSO
+.BR X (1),
+.BR xdpyinfo (1),
+.BR xglinfo (1),
+.BR glxinfo (1),
+.BR glxdpyinfo (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-command (1)
+.SH COPYRIGHT
+Copyright \(co 2000 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
diff --git a/hacks/goop.man b/hacks/goop.man
index 573bd1e..d97c705 100644
--- a/hacks/goop.man
+++ b/hacks/goop.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "11-Jun-97" "X Version 11"
.SH NAME
-goop - squishy transparent oil and bubble screenhack
+goop \- squishy transparent oil and bubble screenhack
.SH SYNOPSIS
.B goop
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-transparent] [\-non\-transparent] [\-additive] [\-subtractive] [\-xor] [\-no\-xor]
diff --git a/hacks/grav.man b/hacks/grav.man
index f7017a7..f20b220 100644
--- a/hacks/grav.man
+++ b/hacks/grav.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "10-May-97" "X Version 11"
.SH NAME
-grav - draws a simple orbital simulation
+grav \- draws a simple orbital simulation
.SH SYNOPSIS
.B grav
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-count \fIinteger\fP] [\-decay] [\-no\-decay] [\-trail] [\-no\-trail]
diff --git a/hacks/greynetic.man b/hacks/greynetic.man
index 1144a82..6d2a8c3 100644
--- a/hacks/greynetic.man
+++ b/hacks/greynetic.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "13-aug-92" "X Version 11"
.SH NAME
-greynetic - draw random stippled/color rectangles
+greynetic \- draw random stippled/color rectangles
.SH SYNOPSIS
.B greynetic
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIusecs\fP]
diff --git a/hacks/halftone.man b/hacks/halftone.man
index 21ffb13..4148f93 100644
--- a/hacks/halftone.man
+++ b/hacks/halftone.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "9-oct-2002" "X Version 11"
.SH NAME
-halftone - simple halftone pattern of moving mass points
+halftone \- simple halftone pattern of moving mass points
.SH SYNOPSIS
.B halftone
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/halo.man b/hacks/halo.man
index 98960c4..2894018 100644
--- a/hacks/halo.man
+++ b/hacks/halo.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "12-Jun-97" "X Version 11"
.SH NAME
-halo - draw circular patterns
+halo \- draw circular patterns
.SH SYNOPSIS
.B halo
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-count \fIint\fP] [\-delay \fIusecs\fP] [\-mode seuss | ramp | random ] [\-animate] [\-colors \fIinteger\fP]
diff --git a/hacks/helix.man b/hacks/helix.man
index e022294..dbdbd10 100644
--- a/hacks/helix.man
+++ b/hacks/helix.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "18-sep-97" "X Version 11"
.SH NAME
-helix - draw helical string-art patterns
+helix \- draw helical string-art patterns
.SH SYNOPSIS
.B helix
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-erase\-speed \fIusecs\fP] [\-erase\-mode \fIinteger\fP] [\-delay \fIseconds\fP] [\-install] [\-visual \fIvisual\fP]
diff --git a/hacks/hexadrop.c b/hacks/hexadrop.c
index b1b7d49..75eec66 100644
--- a/hacks/hexadrop.c
+++ b/hacks/hexadrop.c
@@ -15,7 +15,6 @@
#include <math.h>
#include "screenhack.h"
-#define countof(x) (sizeof(x)/sizeof(*(x)))
#define ABS(x) ((x)<0?-(x):(x))
/* Avoid rounding errors by using a larger fixed-point grid.
diff --git a/hacks/hexadrop.man b/hacks/hexadrop.man
index b4a5f84..83756cd 100644
--- a/hacks/hexadrop.man
+++ b/hacks/hexadrop.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-hexadrop - shrinking hexagons.
+hexadrop \- shrinking hexagons.
.SH SYNOPSIS
.B hexadrop
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/hopalong.man b/hacks/hopalong.man
index f38b481..2ea0054 100644
--- a/hacks/hopalong.man
+++ b/hacks/hopalong.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "10-May-97" "X Version 11"
.SH NAME
-hopalong - draw real plane fractals
+hopalong \- draw real plane fractals
.SH SYNOPSIS
.B hopalong
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP] [\-jong] [\-no\-jong] [\-jong] [\-no\-sine]
diff --git a/hacks/hyperball.man b/hacks/hyperball.man
index 241ff68..7d7020d 100644
--- a/hacks/hyperball.man
+++ b/hacks/hyperball.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-hyperball - 2d projection of a 4d object
+hyperball \- 2d projection of a 4d object
.SH SYNOPSIS
.B hyperball
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/hypercube.man b/hacks/hypercube.man
index 2594370..a82eef3 100644
--- a/hacks/hypercube.man
+++ b/hacks/hypercube.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "6-dec-92" "X Version 11"
.SH NAME
-hypercube - 2d projection of a 4d object
+hypercube \- 2d projection of a 4d object
.SH SYNOPSIS
.B hypercube
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-color[0-7] \fIcolor\fP] [\-xy \fIfloat\fP] [\-xz \fIfloat\fP] [\-yz \fIfloat\fP] [\-xw \fIfloat\fP] [\-yw \fIfloat\fP] [\-zw \fIfloat\fP] [\-observer-z \fIint\fP] [\-delay \fIusecs\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP]
diff --git a/hacks/ifs.c b/hacks/ifs.c
index b879f10..9e2604b 100644
--- a/hacks/ifs.c
+++ b/hacks/ifs.c
@@ -37,9 +37,6 @@ Multi-coloured mode added by Jack Grahl <j.grahl@ucl.ac.uk>, Jan 2007
#include "screenhack.h"
-#undef countof
-#define countof(x) (sizeof((x)) / sizeof(*(x)))
-
typedef struct {
float r, s, tx, ty; /* Rotation, Scale, Translation X & Y */
float ro, rt, rc; /* Old Rotation, Rotation Target, Rotation Counter */
@@ -99,7 +96,7 @@ static const char *ifs_defaults [] = {
"*colors: 200",
"*delay: 20000",
"*translate: True",
- "*scale: True",
+ "*ifsScale: True",
"*rotate: True",
"*recurse: False",
"*multi: True",
@@ -121,7 +118,7 @@ static XrmOptionDescRec ifs_options [] = {
{ "-colors", ".colors", XrmoptionSepArg, 0 },
{ "-functions", ".lensnum", XrmoptionSepArg, 0 },
{ "-no-translate", ".translate", XrmoptionNoArg, "False" },
- { "-no-scale", ".scale", XrmoptionNoArg, "False" },
+ { "-no-scale", ".ifsScale", XrmoptionNoArg, "False" },
{ "-no-rotate", ".rotate", XrmoptionNoArg, "False" },
{ "-recurse", ".recurse", XrmoptionNoArg, "True" },
{ "-iterate", ".recurse", XrmoptionNoArg, "False" },
@@ -452,7 +449,8 @@ ifs_init (Display *d_arg, Window w_arg)
st->mode = get_integer_resource(st->dpy, "mode", "Mode");
st->rotate = get_boolean_resource(st->dpy, "rotate", "Boolean");
- st->scale = get_boolean_resource(st->dpy, "scale", "Boolean");
+ /* Xft uses 'scale' */
+ st->scale = get_boolean_resource(st->dpy, "ifsScale", "Boolean");
st->translate = get_boolean_resource(st->dpy, "translate", "Boolean");
st->recurse = get_boolean_resource(st->dpy, "recurse", "Boolean");
st->multi = get_boolean_resource(st->dpy, "multi", "Boolean");
diff --git a/hacks/ifs.man b/hacks/ifs.man
index c95dce8..5e59f15 100644
--- a/hacks/ifs.man
+++ b/hacks/ifs.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-ifs - draws spinning, colliding iterated-function-system images
+ifs \- draws spinning, colliding iterated-function-system images
.SH SYNOPSIS
.B ifs
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/images/Makefile b/hacks/images/Makefile
index 4b0a239..46aa4dc 100644
--- a/hacks/images/Makefile
+++ b/hacks/images/Makefile
@@ -1,10 +1,8 @@
-# hacks/images/Makefile.in --- xscreensaver, Copyright (c) 2018 Jamie Zawinski.
+# hacks/images/Makefile.in --- xscreensaver, Copyright © 2018-2021 Jamie Zawinski.
# the `../configure' script generates `hacks/images/Makefile' from this file.
srcdir = .
-VPATH = ${srcdir} ${srcdir}/bubbles ${srcdir}/m6502 \
- ${srcdir}/molecules ${srcdir}/noseguy
top_srcdir = ../..
UTILS_SRC = $(top_srcdir)/utils
RM = rm -f
@@ -20,29 +18,38 @@ TARFILES = Makefile \
$(STAR)/$(STAR).pov \
$(STAR)/$(STAR).txt \
-PNG_HDRS = $(shell find $(srcdir) -name \*.png | \
- sed 's@^.*/\(.*\)\.\(png\)$$@gen/\1_\2.h@')
-
default: all
-all: gen $(PNG_HDRS)
-
-gen:
- mkdir gen
-
-# %.png dependency below works because VPATH contains subdirs
-# of 'images' dir not only 'images' itself
-gen/%_png.h: %.png
- echo $(UTILS_SRC)/bin2c "$<" "$@"
- $(UTILS_SRC)/bin2c "$<" "$@"
+all: _gen
+
+_gen:
+ @\
+ DIR="gen" ; \
+ if ! [ -d "$$DIR" ]; then \
+ echo mkdir "$$DIR" ; \
+ mkdir "$$DIR" ; \
+ fi ; \
+ \
+ for png in $$(find $(srcdir) -name \*.png); do \
+ h="$${png%.png}"; \
+ h="$${h##*/}"; \
+ h="$$DIR/$${h}_png.h"; \
+ if [ ! -f "$$h" -o "$$png" -nt "$$h" ] ; then \
+ echo $(UTILS_SRC)/bin2c "$$png" "$$h"; \
+ $(UTILS_SRC)/bin2c "$$png" "$$h"; \
+ fi ; \
+ done
clean:
$(RM) -r gen
+# Note: don't remove the generated Makefile. We include that in the tar file
+# so that OSX and Android can run 'make' in this directory without 'configure'.
distclean:: clean
+ -rm -f TAGS *~ "#"*
-echo_tarfiles:
- @echo $(TARFILES)
+list_tarfiles:
+ @find $(TARFILES) -type f -print | sort
install:
install-program:
diff --git a/hacks/images/Makefile.in b/hacks/images/Makefile.in
index 9a0375b..6bdfbb0 100644
--- a/hacks/images/Makefile.in
+++ b/hacks/images/Makefile.in
@@ -1,10 +1,8 @@
-# hacks/images/Makefile.in --- xscreensaver, Copyright (c) 2018 Jamie Zawinski.
+# hacks/images/Makefile.in --- xscreensaver, Copyright © 2018-2021 Jamie Zawinski.
# the `../configure' script generates `hacks/images/Makefile' from this file.
@SET_MAKE@
srcdir = @srcdir@
-VPATH = ${srcdir} ${srcdir}/bubbles ${srcdir}/m6502 \
- ${srcdir}/molecules ${srcdir}/noseguy
top_srcdir = @top_srcdir@
UTILS_SRC = $(top_srcdir)/utils
RM = rm -f
@@ -20,29 +18,38 @@ TARFILES = Makefile \
$(STAR)/$(STAR).pov \
$(STAR)/$(STAR).txt \
-PNG_HDRS = $(shell find $(srcdir) -name \*.png | \
- sed 's@^.*/\(.*\)\.\(png\)$$@gen/\1_\2.h@')
-
default: all
-all: gen $(PNG_HDRS)
-
-gen:
- mkdir gen
-
-# %.png dependency below works because VPATH contains subdirs
-# of 'images' dir not only 'images' itself
-gen/%_png.h: %.png
- echo $(UTILS_SRC)/bin2c "$<" "$@"
- $(UTILS_SRC)/bin2c "$<" "$@"
+all: _gen
+
+_gen:
+ @\
+ DIR="gen" ; \
+ if ! [ -d "$$DIR" ]; then \
+ echo mkdir "$$DIR" ; \
+ mkdir "$$DIR" ; \
+ fi ; \
+ \
+ for png in $$(find $(srcdir) -name \*.png); do \
+ h="$${png%.png}"; \
+ h="$${h##*/}"; \
+ h="$$DIR/$${h}_png.h"; \
+ if [ ! -f "$$h" -o "$$png" -nt "$$h" ] ; then \
+ echo $(UTILS_SRC)/bin2c "$$png" "$$h"; \
+ $(UTILS_SRC)/bin2c "$$png" "$$h"; \
+ fi ; \
+ done
clean:
$(RM) -r gen
+# Note: don't remove the generated Makefile. We include that in the tar file
+# so that OSX and Android can run 'make' in this directory without 'configure'.
distclean:: clean
+ -rm -f TAGS *~ "#"*
-echo_tarfiles:
- @echo $(TARFILES)
+list_tarfiles:
+ @find $(TARFILES) -type f -print | sort
install:
install-program:
diff --git a/hacks/images/gnome1.png b/hacks/images/gnome1.png
new file mode 100644
index 0000000..453e77a
--- /dev/null
+++ b/hacks/images/gnome1.png
Binary files differ
diff --git a/hacks/images/gnome2.png b/hacks/images/gnome2.png
new file mode 100644
index 0000000..d9171d8
--- /dev/null
+++ b/hacks/images/gnome2.png
Binary files differ
diff --git a/hacks/images/logo-360.png b/hacks/images/logo-360.png
new file mode 100644
index 0000000..c4f1e89
--- /dev/null
+++ b/hacks/images/logo-360.png
Binary files differ
diff --git a/hacks/imsmap.man b/hacks/imsmap.man
index b4bc092..25edd2c 100644
--- a/hacks/imsmap.man
+++ b/hacks/imsmap.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "17-May-97" "X Version 11"
.SH NAME
-imsmap - generate fractal maps
+imsmap \- generate fractal maps
.SH SYNOPSIS
.B imsmap
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIint\fP] [\-delay \fIseconds\fP] [\-delay2 \fImicroseconds\fP] [\-iterations \fIint\fP] [\-mode h|s|v|random]
diff --git a/hacks/interaggregate.man b/hacks/interaggregate.man
index 3d1eee3..0114380 100644
--- a/hacks/interaggregate.man
+++ b/hacks/interaggregate.man
@@ -1,6 +1,6 @@
.TH Interaggregate 1 "08-Oct-04" "X Version 11"
.SH NAME
-interaggregate - Visualize the momentary and aggregate intersections
+interaggregate \- Visualize the momentary and aggregate intersections
between slowly moving circles.
.SH SYNOPSIS
.B interaggregate
diff --git a/hacks/interference.c b/hacks/interference.c
index 98f89e2..44a55ea 100644
--- a/hacks/interference.c
+++ b/hacks/interference.c
@@ -852,8 +852,8 @@ static void inter_init(Display* dpy, Window win, struct inter_context* c)
check_no_mem(dpy, c, c->source);
for(i = 0; i < c->count; i++) {
- c->source[i].x_theta = frand(2.0)*3.14159;
- c->source[i].y_theta = frand(2.0)*3.14159;
+ c->source[i].x_theta = frand(2.0)*M_PI;
+ c->source[i].y_theta = frand(2.0)*M_PI;
}
c->last_frame = float_time();
@@ -890,11 +890,11 @@ static unsigned long do_inter(struct inter_context* c)
for(i = 0; i < c->count; i++) {
c->source[i].x_theta += (elapsed*c->speed/1000.0);
- if(c->source[i].x_theta > 2.0*3.14159)
- c->source[i].x_theta -= 2.0*3.14159;
+ if(c->source[i].x_theta > 2.0*M_PI)
+ c->source[i].x_theta -= 2.0*M_PI;
c->source[i].y_theta += (elapsed*c->speed/1000.0);
- if(c->source[i].y_theta > 2.0*3.14159)
- c->source[i].y_theta -= 2.0*3.14159;
+ if(c->source[i].y_theta > 2.0*M_PI)
+ c->source[i].y_theta -= 2.0*M_PI;
c->source[i].x = source_x(c, i);
c->source[i].y = source_y(c, i);
}
diff --git a/hacks/interference.man b/hacks/interference.man
index 87866c8..3d9f472 100644
--- a/hacks/interference.man
+++ b/hacks/interference.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-interference - decaying sinusoidal waves
+interference \- decaying sinusoidal waves
.SH SYNOPSIS
.B interference
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/intermomentary.man b/hacks/intermomentary.man
index 5947c59..46a896b 100644
--- a/hacks/intermomentary.man
+++ b/hacks/intermomentary.man
@@ -1,6 +1,6 @@
.TH Intermomentary 1 "08-Oct-04" "X Version 11"
.SH NAME
-intermomentary - Visualize the momentary and aggregate intersections
+intermomentary \- Visualize the momentary and aggregate intersections
between slowly moving circles.
.SH SYNOPSIS
.B intermomentary
diff --git a/hacks/juggle.man b/hacks/juggle.man
index 17ea20b..115af8c 100644
--- a/hacks/juggle.man
+++ b/hacks/juggle.man
@@ -2,7 +2,7 @@
.\" ** The above line should force tbl to be used as a preprocessor **
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-juggle - juggling man screen saver.
+juggle \- juggling man screen saver.
.SH SYNOPSIS
.B juggle
[\-display host:display.screen ]
diff --git a/hacks/julia.man b/hacks/julia.man
index 4e0f2e8..3eb1ef6 100644
--- a/hacks/julia.man
+++ b/hacks/julia.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "28-May-97" "X Version 11"
.SH NAME
-julia - draws spinning, animating julia-set fractals
+julia \- draws spinning, animating julia-set fractals
.SH SYNOPSIS
.B julia
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP]
diff --git a/hacks/kaleidescope.man b/hacks/kaleidescope.man
index 2c9ba2b..81e24a7 100644
--- a/hacks/kaleidescope.man
+++ b/hacks/kaleidescope.man
@@ -1,19 +1,6 @@
-.de EX \"Begin example
-.ne 5
-.if n .sp 1
-.if t .sp .5
-.nf
-.in +.5i
-..
-.de EE
-.fi
-.in -.5i
-.if n .sp 1
-.if t .sp .5
-..
.TH Kaleidescpe 1 "14-Dec-95" "X Version 11"
.SH NAME
-Kaleidescope - rotating line segments
+Kaleidescope \- rotating line segments
.SH SYNOPSIS
.B kaleidescope
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-install] [\-visual \fIvisual\fP] [\-color_mode \fImono | nice | greedy\fP] [-nsegments \fIint\fP] [\-ntrails \fIint\fP] [\-local_rotation \fIint\fP] [\-global_rotation \fIint\fP] [\-delay \fIusecs\fP] [\-redmin \fIint\fP] [\-greenmin \fIint\fP] [\-bluemin \fIint\fP] [\-redrange \fIint\fP] [\-greenrange \fIint\fP] [\-bluerange \fIint\fP]
diff --git a/hacks/kumppa.c b/hacks/kumppa.c
index f4cc5bb..ccde254 100644
--- a/hacks/kumppa.c
+++ b/hacks/kumppa.c
@@ -44,9 +44,6 @@ from the X Consortium.
# include "xdbe.h"
#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
static const char *kumppa_defaults [] ={
".background: black",
".lowrez: true",
diff --git a/hacks/kumppa.man b/hacks/kumppa.man
index ed31a82..be5bcb1 100644
--- a/hacks/kumppa.man
+++ b/hacks/kumppa.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-kumppa - spiraling, spinning, splashes of color rush toward the screen.
+kumppa \- spiraling, spinning, splashes of color rush toward the screen.
.SH SYNOPSIS
.B kumppa
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/laser.man b/hacks/laser.man
index 77367af..df3029a 100644
--- a/hacks/laser.man
+++ b/hacks/laser.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "10-May-97" "X Version 11"
.SH NAME
-laser - draws vaguely laser-like moving lines
+laser \- draws vaguely laser-like moving lines
.SH SYNOPSIS
.B laser
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP]
diff --git a/hacks/lcdscrub.c b/hacks/lcdscrub.c
index 5fd165e..82003ce 100644
--- a/hacks/lcdscrub.c
+++ b/hacks/lcdscrub.c
@@ -15,9 +15,6 @@
#include "screenhack.h"
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
struct state {
Display *dpy;
Window window;
diff --git a/hacks/lcdscrub.man b/hacks/lcdscrub.man
index 04e0d72..4570384 100644
--- a/hacks/lcdscrub.man
+++ b/hacks/lcdscrub.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-lcdscrub - attempt to repair burn-in on LCD screens
+lcdscrub \- attempt to repair burn-in on LCD screens
.SH SYNOPSIS
.B lcdscrub
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/lightning.man b/hacks/lightning.man
index 65386d3..92afdd7 100644
--- a/hacks/lightning.man
+++ b/hacks/lightning.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "10-May-97" "X Version 11"
.SH NAME
-lightning - draws fractal lightning bolts
+lightning \- draws fractal lightning bolts
.SH SYNOPSIS
.B lightning
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP]
diff --git a/hacks/lisa.man b/hacks/lisa.man
index 2bfd7f4..e8a42b1 100644
--- a/hacks/lisa.man
+++ b/hacks/lisa.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "27-May-97" "X Version 11"
.SH NAME
-lisa - draws animated full-loop lissajous figures
+lisa \- draws animated full-loop lissajous figures
.SH SYNOPSIS
.B lisa
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP] [\-size \fIinteger\fP]
diff --git a/hacks/lissie.man b/hacks/lissie.man
index 43123b2..05a10df 100644
--- a/hacks/lissie.man
+++ b/hacks/lissie.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-lissie - lissajous figure.
+lissie \- lissajous figure.
.SH SYNOPSIS
.B lissie
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/lmorph.c b/hacks/lmorph.c
index ae45da1..8a3d95d 100644
--- a/hacks/lmorph.c
+++ b/hacks/lmorph.c
@@ -17,7 +17,7 @@
| DESCRIPTION Smooth and non-linear morphing between 1D curves.
|
| WRITTEN BY Sverre H. Huseby Glenn T. Lines
- | Kurvn. 30 stgaardsgt. 5
+ | Kurvn. 30 Østgaardsgt. 5
| N-0495 Oslo N-0474 Oslo
| Norway Norway
|
diff --git a/hacks/loop.man b/hacks/loop.man
index 37fb970..21915d5 100644
--- a/hacks/loop.man
+++ b/hacks/loop.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-loop - cellular automaton.
+loop \- cellular automaton.
.SH SYNOPSIS
.B loop
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/m6502.c b/hacks/m6502.c
index d7c78e1..fb9f9c2 100644
--- a/hacks/m6502.c
+++ b/hacks/m6502.c
@@ -12,19 +12,18 @@
* Created: 07-May-2007
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-#if defined(HAVE_STDINT_H)
-#include <stdint.h>
-#elif defined(HAVE_INTTYPES_H)
-#include <inttypes.h>
-#endif
-#include <string.h>
#include "screenhack.h"
#include "analogtv.h"
#include "asm6502.h"
+#include <string.h>
+
+#if defined(HAVE_STDINT_H)
+# include <stdint.h>
+#elif defined(HAVE_INTTYPES_H)
+# include <inttypes.h>
+#endif
+
# ifdef __GNUC__
__extension__ /* don't warn about "string length is greater than the length
ISO C89 compilers are required to support" when includng
@@ -80,10 +79,6 @@ plot6502(Bit8 x, Bit8 y, Bit8 color, void *closure)
st->pixels[x][y] = color;
}
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
-
static void
start_rand_bin_prog(machine_6502 *machine, struct state *st){
int n = st->which;
diff --git a/hacks/maze.c b/hacks/maze.c
index acaeba5..0abb3db 100644
--- a/hacks/maze.c
+++ b/hacks/maze.c
@@ -92,6 +92,7 @@
#include "ximage-loader.h"
#include "images/gen/logo-50_png.h"
#include "images/gen/logo-180_png.h"
+#include "images/gen/logo-360_png.h"
#include <stdio.h>
@@ -1373,7 +1374,6 @@ static const char *maze_defaults[] = {
"*deadColor: #880000",
"*skipColor: #8B5A00",
"*surroundColor: #220055",
-
0
};
@@ -1475,11 +1475,18 @@ maze_init (Display *dpy_arg, Window window_arg)
# ifdef HAVE_JWXYZ
jwxyz_XSetAntiAliasing (st->dpy, st->gc, False);
+ /* We still get weird aliasing if line-width is 1. */
+ XSetLineAttributes (st->dpy, st->gc, 2, LineSolid, CapButt, JoinMiter);
# endif
{
Pixmap logo_mask = 0;
- if (xgwa.width > 900 || xgwa.height > 900)
+ if (xgwa.width > 2500 || xgwa.height > 2500)
+ st->logo_map = image_data_to_pixmap (st->dpy, st->window,
+ logo_360_png, sizeof(logo_360_png),
+ &st->logo_width, &st->logo_height,
+ &logo_mask);
+ else if (xgwa.width > 900 || xgwa.height > 900)
st->logo_map = image_data_to_pixmap (st->dpy, st->window,
logo_180_png, sizeof(logo_180_png),
&st->logo_width, &st->logo_height,
diff --git a/hacks/memscroller.c b/hacks/memscroller.c
index 9e81e50..55271d2 100644
--- a/hacks/memscroller.c
+++ b/hacks/memscroller.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2002-2018 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 2002-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -13,11 +13,9 @@
#include "screenhack.h"
#include "xshm.h"
+#include "xft.h"
#include <stdio.h>
-#undef countof
-#define countof(x) (sizeof(x)/sizeof(*(x)))
-
#ifndef HAVE_MOBILE
# define READ_FILES
#endif
@@ -39,7 +37,9 @@ typedef struct {
Window window;
XWindowAttributes xgwa;
GC draw_gc, erase_gc, text_gc;
- XFontStruct *fonts[6];
+ XftColor xft_fg;
+ XftDraw *xftdraw;
+ XftFont *fonts[6];
int border;
enum { SEED_RAM, SEED_RANDOM, SEED_FILE } seed_mode;
@@ -97,7 +97,9 @@ memscroller_init (Display *dpy, Window window)
sprintf (res, "font%d", i+1);
fontname = get_string_resource (dpy, res, "Font");
if (fontname && *fontname)
- st->fonts[i] = load_font_retry (dpy, fontname);
+ st->fonts[i] =
+ load_xft_font_retry (dpy, screen_number (st->xgwa.screen),
+ fontname);
if (fontname) free (fontname);
}
if (!st->fonts[0]) abort();
@@ -117,6 +119,14 @@ memscroller_init (Display *dpy, Window window)
st->draw_gc = XCreateGC (st->dpy, st->window,
GCForeground|GCBackground|GCLineWidth,
&gcv);
+ s = get_string_resource (st->dpy, "foreground", "Foreground");
+ if (!s) s = strdup ("white");
+ XftColorAllocName (st->dpy, st->xgwa.visual, st->xgwa.colormap, s,
+ &st->xft_fg);
+ free (s);
+ st->xftdraw = XftDrawCreate (dpy, window, st->xgwa.visual,
+ st->xgwa.colormap);
+
gcv.foreground = gcv.background;
st->erase_gc = XCreateGC (st->dpy, st->window,
GCForeground|GCBackground, &gcv);
@@ -455,7 +465,6 @@ static void
draw_string (state *st)
{
char buf[40];
- int direction, ascent, descent;
int bot = st->scrollers[0].rect.y;
const char *fmt = "%08X";
int i;
@@ -464,28 +473,28 @@ draw_string (state *st)
*/
for (i = 0; i < countof (st->fonts); i++)
{
- XCharStruct overall;
+ XGlyphInfo overall;
int x, y, w, h;
if (! st->fonts[i]) continue;
sprintf (buf, fmt, 0);
- XTextExtents (st->fonts[i], buf, strlen(buf),
- &direction, &ascent, &descent, &overall);
+ XftTextExtentsUtf8 (st->dpy, st->fonts[i], (FcChar8 *) buf,
+ strlen(buf), &overall);
sprintf (buf, "%08X", st->scrollers[0].value);
w = overall.width;
- h = ascent + descent + 1;
+ h = st->fonts[i]->ascent + st->fonts[i]->descent + 1;
x = (st->xgwa.width - w) / 2;
y = (bot - h) / 2;
if (y + h + 10 <= bot && x > -10)
{
- XSetFont (st->dpy, st->text_gc, st->fonts[i]->fid);
XFillRectangle (st->dpy, st->window, st->erase_gc,
x-w-1, y-1, w*3+2, h+2);
- XDrawString (st->dpy, st->window, st->text_gc,
- x, y + ascent, buf, strlen(buf));
+ XftDrawStringUtf8 (st->xftdraw, &st->xft_fg, st->fonts[i],
+ x, y + st->fonts[i]->ascent,
+ (FcChar8 *) buf, strlen(buf));
break;
}
}
@@ -567,11 +576,12 @@ memscroller_free (Display *dpy, Window window, void *closure)
destroy_xshm_image (dpy, st->scrollers[i].image, &st->shm_info);
free (st->scrollers);
for (i = 0; i < countof (st->fonts); i++)
- if (st->fonts[i]) XFreeFont (dpy, st->fonts[i]);
+ if (st->fonts[i]) XftFontClose (st->dpy, st->fonts[i]);
if (st->filename) free (st->filename);
XFreeGC (dpy, st->draw_gc);
XFreeGC (dpy, st->erase_gc);
XFreeGC (dpy, st->text_gc);
+ XftDrawDestroy (st->xftdraw);
free (st);
}
@@ -586,21 +596,12 @@ static const char *memscroller_defaults [] = {
".foreground: #00FF00",
"*borderSize: 2",
-#if defined(HAVE_COCOA) || defined(HAVE_ANDROID)
- ".font1: OCR A Std 192, Lucida Console 192, Monaco 192",
- ".font2: OCR A Std 144, Lucida Console 144, Monaco 144",
- ".font3: OCR A Std 128, Lucida Console 128, Monaco 128",
- ".font4: OCR A Std 96, Lucida Console 96, Monaco 96",
- ".font5: OCR A Std 48, Lucida Console 48, Monaco 48",
- ".font6: OCR A Std 24, Lucida Console 24, Monaco 24",
-#else /* real X11, load_font_retry() */
- ".font1: -*-ocr a std-medium-r-*-*-*-1440-*-*-m-*-*-*",
- ".font2: -*-ocr a std-medium-r-*-*-*-960-*-*-m-*-*-*",
- ".font3: -*-ocr a std-medium-r-*-*-*-480-*-*-m-*-*-*",
- ".font4: -*-ocr a std-medium-r-*-*-*-320-*-*-m-*-*-*",
- ".font5: -*-ocr a std-medium-r-*-*-*-180-*-*-m-*-*-*",
- ".font6: -*-ocr a std-medium-r-*-*-*-120-*-*-m-*-*-*",
-#endif /* X11 */
+ ".font1: OCR A Std 192, Lucida Console 192, Monaco 192, Courier 192",
+ ".font2: OCR A Std 144, Lucida Console 144, Monaco 144, Courier 144",
+ ".font3: OCR A Std 128, Lucida Console 128, Monaco 128, Courier 128",
+ ".font4: OCR A Std 96, Lucida Console 96, Monaco 96, Courier 96",
+ ".font5: OCR A Std 48, Lucida Console 48, Monaco 48, Courier 48",
+ ".font6: OCR A Std 24, Lucida Console 24, Monaco 24, Courier 24",
"*delay: 10000",
"*offset: 0",
diff --git a/hacks/memscroller.man b/hacks/memscroller.man
index 33754a2..29bf1f9 100644
--- a/hacks/memscroller.man
+++ b/hacks/memscroller.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "14-Aug-2004" "X Version 11"
.SH NAME
-memscroller - scrolls a dump of its own RAM across the screen
+memscroller \- scrolls a dump of its own RAM across the screen
.SH SYNOPSIS
.B memscroller
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/metaballs.man b/hacks/metaballs.man
index e9ba541..98d88de 100644
--- a/hacks/metaballs.man
+++ b/hacks/metaballs.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-MetaBalls - draws 2D metaballs
+MetaBalls \- draws 2D metaballs
.SH SYNOPSIS
.B MetaBalls
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/moire.man b/hacks/moire.man
index b38d343..2de15cd 100644
--- a/hacks/moire.man
+++ b/hacks/moire.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "27-Apr-97" "X Version 11"
.SH NAME
-moire - draw circular interference patterns
+moire \- draw circular interference patterns
.SH SYNOPSIS
.B moire
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIseconds\fP] [\-random \fIboolean\fP] [\-ncolors \fIint\fP] [\-offset \fIint\fP]
diff --git a/hacks/moire2.man b/hacks/moire2.man
index b57c485..9c347b5 100644
--- a/hacks/moire2.man
+++ b/hacks/moire2.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-moire2 - circular interference patterns.
+moire2 \- circular interference patterns.
.SH SYNOPSIS
.B moire2
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/mountain.man b/hacks/mountain.man
index 692eb47..61bd1be 100644
--- a/hacks/mountain.man
+++ b/hacks/mountain.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-mountain - random 3D plots that look vaguely mountainous.
+mountain \- random 3D plots that look vaguely mountainous.
.SH SYNOPSIS
.B mountain
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/munch.c b/hacks/munch.c
index c45e37f..f24629f 100644
--- a/hacks/munch.c
+++ b/hacks/munch.c
@@ -64,6 +64,7 @@
*/
#include <math.h>
+#include "pow2.h"
#include "screenhack.h"
typedef struct _muncher {
@@ -97,20 +98,6 @@ struct state {
};
-/*
- * dumb way to get # of digits in number. Probably faster than actually
- * doing a log and a division, maybe.
- */
-static int dumb_log_2(int k)
-{
- int r = -1;
- while (k > 0) {
- k >>= 1; r++;
- }
- return r;
-}
-
-
static void calc_logwidths (struct state *st)
{
/* Choose a range of square sizes based on the window size. We want
@@ -121,9 +108,9 @@ static void calc_logwidths (struct state *st)
if (st->window_height < st->window_width &&
st->window_width < st->window_height * 5) {
- st->logmaxwidth = (int)dumb_log_2(st->window_height * 0.8);
+ st->logmaxwidth = (int)i_log2(st->window_height * 0.8);
} else {
- st->logmaxwidth = (int)dumb_log_2(st->window_width * 0.8);
+ st->logmaxwidth = (int)i_log2(st->window_width * 0.8);
}
if (st->logmaxwidth < 2) {
diff --git a/hacks/munch.man b/hacks/munch.man
index d5423c9..4944ac0 100644
--- a/hacks/munch.man
+++ b/hacks/munch.man
@@ -1,19 +1,6 @@
-.de EX \"Begin example
-.ne 5
-.if n .sp 1
-.if t .sp .5
-.nf
-.in +.5i
-..
-.de EE
-.fi
-.in -.5i
-.if n .sp 1
-.if t .sp .5
-..
.TH XScreenSaver 1 "29-Aug-2008" "X Version 11"
.SH NAME
-munch - munching squares
+munch \- munching squares
.SH SYNOPSIS
.B munch
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
@@ -94,46 +81,47 @@ stored in the RESOURCE_MANAGER property.
.RS 0
.BR http://www.inwap.com/pdp10/hbaker/hakmem/hakmem.html
.SH HISTORY
-HAKMEM: MIT AI Memo 239, Feb. 29, 1972.
-.RS 8
+.B HAKMEM: MIT AI Memo 239, Feb. 29, 1972.
Beeler, M., Gosper, R.W., and Schroeppel, R.
"Unless otherwise stated, all computer programs are in PDP-6/10
assembly language."
-.TP 4
-ITEM 146: MUNCHING SQUARES
+
+.SS ITEM 146: MUNCHING SQUARES
Another simple display program. It is thought that this was discovered by
Jackson Wright on the RLE PDP-1 circa 1962.
+.nf
+.sp
+ DATAI 2
+ ADDB 1,2
+ ROTC 2,-22
+ XOR 1,2
+ JRST .-4
+.sp
+.fi
-.EX
- DATAI 2
- ADDB 1,2
- ROTC 2,-22
- XOR 1,2
- JRST .-4
-.EE
-.RS 4
2=X, 3=Y. Try things like 1001002 in data switches. This also does
interesting things with operations other than XOR, and rotations other
than -22. (Try IOR; AND; TSC; FADR; FDV(!); ROT -14, -9, -20, ...)
-.RE
-.TP 4
+
+.SS
ITEM 147 (Schroeppel):
Munching squares is just views of the graph Y = X XOR T for consecutive
values of T = time.
-.TP 4
-ITEM 148 (Cohen, Beeler):
+
+.SS ITEM 148 (Cohen, Beeler):
A modification to munching squares which reveals them in frozen states
through opening and closing curtains: insert FADR 2,1 before the XOR. Try
data switches =
+.nf
+.sp
+ 4000,,4 1000,,2002 2000,,4 0,,1002
+.sp
+.fi
-.EX
- 4000,,4 1000,,2002 2000,,4 0,,1002
-.EE
-.RS 4
(Notation: <left half>,,<right half>)
.RS 0
Also try the FADR after the XOR, switches = 1001,,1.
diff --git a/hacks/munge-ad.pl b/hacks/munge-ad.pl
index 8199b2f..fa069ae 100755
--- a/hacks/munge-ad.pl
+++ b/hacks/munge-ad.pl
@@ -1,5 +1,5 @@
#!/usr/bin/perl -w
-# Copyright © 2008-2014 Jamie Zawinski <jwz@jwz.org>
+# Copyright © 2008-2021 Jamie Zawinski <jwz@jwz.org>
#
# Permission to use, copy, modify, distribute, and sell this software and its
# documentation for any purpose is hereby granted without fee, provided that
@@ -18,7 +18,7 @@ use diagnostics;
use strict;
my $progname = $0; $progname =~ s@.*/@@g;
-my ($version) = ('$Revision: 1.10 $' =~ m/\s(\d[.\d]+)\s/s);
+my ($version) = ('$Revision: 1.14 $' =~ m/\s(\d[.\d]+)\s/s);
my $verbose = 0;
@@ -30,6 +30,7 @@ my %disable = (
'antmaze' => 1,
'antspotlight' => 1,
'braid' => 1,
+ 'co____9' => 2,
'crystal' => 1,
'demon' => 1,
'dnalogo' => 1,
@@ -50,6 +51,7 @@ my %disable = (
'rocks' => 1,
'sballs' => 1,
'sierpinski' => 1,
+ 'testx11' => 2,
'thornbird' => 1,
'vidwhacker' => 1,
'webcollage' => 1,
@@ -60,7 +62,7 @@ my %disable = (
#
sub parse_makefiles() {
foreach my $mf ( "Makefile.in", "glx/Makefile.in" ) {
- open (my $in, '<', $mf) || error ("$mf: $!");
+ open (my $in, '<:utf8', $mf) || error ("$mf: $!");
local $/ = undef; # read entire file
my $body = <$in>;
close $in;
@@ -82,7 +84,7 @@ sub munge_ad($) {
parse_makefiles();
- open (my $in, '<', $file) || error ("$file: $!");
+ open (my $in, '<:utf8', $file) || error ("$file: $!");
local $/ = undef; # read entire file
my $body = <$in>;
close $in;
@@ -101,28 +103,29 @@ sub munge_ad($) {
$dir =~ s@/[^/]*$@@s;
my @counts = (0,0,0,0,0,0,0,0,0,0);
foreach my $xml (sort (glob ("$dir/../hacks/config/*.xml"))) {
- open (my $in, '<', $xml) || error ("$xml: $!");
+ open (my $in, '<:utf8', $xml) || error ("$xml: $!");
local $/ = undef; # read entire file
my $b = <$in>;
close $in;
- my ($name) = ($b =~ m@<screensaver[^<>]*\b_label=\"([^<>\"]+)\"@s);
+ my ($name) = ($b =~ m@<screensaver[^<>]* \b name = \" ([^<>\"]+) \"@sx);
+ my ($label) = ($b =~ m@<screensaver[^<>]* \b _label = \" ([^<>\"]+) \"@sx);
error ("$xml: no name") unless $name;
+ error ("$xml: no label") unless $label;
- my $name2 = lc($name);
- $name2 =~ s/^((x|gl)?[a-z])/\U$1/s; # what prefs.c (make_hack_name) does
+ my $label2 = lc($name);
+ $label2 =~ s/^((x|gl)?[a-z])/\U$1/s; # what prefs.c (make_hack_name) does
- $xml =~ s@^.*/([^/]+)\.xml$@$1@s;
- if ($name ne $name2) {
- my $s = sprintf("*hacks.%s.name:", $xml);
- $mid2 .= sprintf ("%-28s%s\n", $s, $name);
+ if ($label ne $label2) {
+ my $s = sprintf("*hacks.%s.name:", $name);
+ $mid2 .= sprintf ("%-28s%s\n", $s, $label);
$counts[9]++;
}
# Grab the year.
my ($year) =
($b =~ m/<_description>.*Written by.*?;\s+(19[6-9]\d|20\d\d)\b/si);
- error ("no year in $xml.xml") unless $year;
- $hacks{$xml} = $year;
+ error ("no year in $name.xml") unless $year;
+ $hacks{$name} = $year;
}
# Splice in new names.
@@ -196,7 +199,7 @@ sub munge_ad($) {
# Write file if changed.
#
if ($body ne $obody) {
- open (my $out, '>', $file) || error ("$file: $!");
+ open (my $out, '>:utf8', $file) || error ("$file: $!");
print $out $body;
close $out;
print STDERR "$progname: wrote $file\n";
diff --git a/hacks/nerverot.man b/hacks/nerverot.man
index 2c474b6..c5faca9 100644
--- a/hacks/nerverot.man
+++ b/hacks/nerverot.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "20-Mar-2001" "X Version 11"
.SH NAME
-nerverot - induces edginess in the viewer
+nerverot \- induces edginess in the viewer
.SH SYNOPSIS
.B nerverot
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-db] [\-no\-db] [\-colors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-count \fIinteger\fP] [\-line\-width \fIinteger\fP] [\-event\-chance \fIfraction\fP] [\-iter\-amt \fIfraction\fP] [\-nervousness \fIfraction\fP] [\-max\-nerve\-radius \fIfraction\fP] [\-min\-radius \fIinteger\fP] [\-max\-radius \fIinteger\fP] [\-min\-scale \fIfraction\fP] [\-max\-scale \fIfraction\fP]
diff --git a/hacks/noseguy.c b/hacks/noseguy.c
index bb0ca9f..e5e2b0b 100644
--- a/hacks/noseguy.c
+++ b/hacks/noseguy.c
@@ -17,7 +17,6 @@
#include "screenhack.h"
#include "ximage-loader.h"
#include "textclient.h"
-#include "xft.h"
#define font_height(font) (font->ascent + font->descent)
@@ -120,9 +119,9 @@ init_images (struct state *st)
PM *images[8];
struct { const unsigned char *png; unsigned long size; } bits[8];
XWindowAttributes xgwa;
+ int i = 0;
XGetWindowAttributes (st->dpy, st->window, &xgwa);
- int i = 0;
images[i++] = &st->left1;
images[i++] = &st->left2;
images[i++] = &st->right1;
@@ -405,8 +404,7 @@ talk (struct state *st, int force_erase)
XGlyphInfo extents;
total = strlen (st->words);
- strncpy (args[0], st->words, LINELEN);
- args[0][LINELEN - 1] = 0;
+ sprintf(args[0], "%.*s", LINELEN - 1, st->words);
XftTextExtentsUtf8 (st->dpy, st->xftfont,
(FcChar8 *) st->words, total,
&extents);
@@ -430,8 +428,8 @@ talk (struct state *st, int force_erase)
total += p2 - p; /* total chars; count to determine reading
* time */
- (void) strncpy(args[height], p, LINELEN);
- args[height][LINELEN - 1] = 0;
+ sprintf(args[height], "%.*s", LINELEN - 1, p);
+
if (height == MAXLINES - 1)
{
/* puts("Message too long!"); */
@@ -563,7 +561,7 @@ static const char *noseguy_defaults [] = {
"*fpsSolid: true",
"*program: xscreensaver-text",
"*usePty: False",
- ".font: -*-helvetica-medium-r-*-*-*-140-*-*-*-*-*-*",
+ ".font: sans-serif 14",
0
};
@@ -606,11 +604,12 @@ noseguy_init (Display *d, Window w)
init_images(st);
- st->xftfont = XftFontOpenXlfd (st->dpy, screen_number (xgwa.screen),
- fontname);
+ st->xftfont = load_xft_font_retry (st->dpy, screen_number (xgwa.screen),
+ fontname);
free (fontname);
cname = get_string_resource (st->dpy, "textForeground", "Foreground");
+ if (!cname) cname = strdup ("black");
XftColorAllocName (st->dpy, xgwa.visual, xgwa.colormap,
cname, &st->xftcolor);
free (cname);
diff --git a/hacks/noseguy.man b/hacks/noseguy.man
index 3d98ea0..e2a75b8 100644
--- a/hacks/noseguy.man
+++ b/hacks/noseguy.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "13-aug-92" "X Version 11"
.SH NAME
-noseguy - a little guy with a big nose wanders around being witty
+noseguy \- a little guy with a big nose wanders around being witty
.SH SYNOPSIS
.B noseguy
[\-display \fIhost:display.screen\fP]
@@ -49,7 +49,7 @@ of the messages. Default:
xscreensaver-text --cols 40 | head -n15
You can configure the text printed through the "Advanced" tab of
-.BR xscreensaver\-demo (1),
+.BR xscreensaver\-settings (1),
or by editing your ~/.xscreensaver file.
.TP 8
.B \-filename \fIfile\fP
@@ -73,7 +73,7 @@ stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1),
-.BR xscreensaver-text (1),
+.BR xscreensaver\-text (MANSUFFIX),
.BR xnlock (1)
.SH COPYRIGHT
Copyright 1985, 1990 by Dan Heller <argv@danheller.com>.
diff --git a/hacks/pacman.c b/hacks/pacman.c
index 6d2dd85..29eddaf 100644
--- a/hacks/pacman.c
+++ b/hacks/pacman.c
@@ -68,6 +68,7 @@ static const char sccsid[] = "@(#)pacman.c 5.00 2000/11/01 xlockmore";
#include "pacman.h"
#include "pacman_ai.h"
#include "pacman_level.h"
+#include "ximage-loader.h"
#include "images/gen/pacman_png.h"
#ifdef DISABLE_INTERACTIVE
@@ -315,7 +316,7 @@ draw_position (ModeInfo * mi, int x, int y, int color)
Window window = MI_WINDOW (mi);
pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
XFontStruct *font = NULL;
- char *f_name = "-*-utopia-*-r-*-*-*-600-*-*-p-*-*-*";
+ char *f_name = "Utopia 60, Helvetica 60";
char *s = NULL;
font = load_font_retry (display, f_name);
@@ -338,7 +339,7 @@ draw_number (ModeInfo * mi, int x, int y, int num, int color)
Window window = MI_WINDOW (mi);
pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
XFontStruct *font = NULL;
- char *f_name = "-*-utopia-*-r-*-*-*-600-*-*-p-*-*-*";
+ char *f_name = "Utopia 60, Helvetica 60";
char *s = NULL;
font = load_font_retry (display, f_name);
@@ -390,7 +391,7 @@ draw_string (ModeInfo * mi, int x, int y, char *s, int color)
Window window = MI_WINDOW (mi);
pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
XFontStruct *font = NULL;
- char *f_name = "-*-utopia-*-r-*-*-*-600-*-*-p-*-*-*";
+ char *f_name = "Utopia 60, Helvetica 60";
font = load_font_retry (display, f_name);
assert (font != NULL);
diff --git a/hacks/pacman.h b/hacks/pacman.h
index a5b91dc..1fc2b35 100644
--- a/hacks/pacman.h
+++ b/hacks/pacman.h
@@ -25,14 +25,6 @@
#ifndef __PACMAN_H__
#define __PACMAN_H__
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include "xlockmoreI.h"
-
-#include "ximage-loader.h"
-
#define LEVHEIGHT 32U
#define LEVWIDTH 40U
diff --git a/hacks/pacman.man b/hacks/pacman.man
index ba19a56..b413de6 100644
--- a/hacks/pacman.man
+++ b/hacks/pacman.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "12-Feb-2004" "X Version 11"
.SH NAME
-pacman - simulates a game of Pac-Man on a randomly-created level.
+pacman \- simulates a game of Pac-Man on a randomly-created level.
.SH SYNOPSIS
.B pacman
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/pacman_ai.c b/hacks/pacman_ai.c
index b85bd96..8cf9cf0 100644
--- a/hacks/pacman_ai.c
+++ b/hacks/pacman_ai.c
@@ -17,12 +17,14 @@
/* this file handles the AI of the ghosts and the pacman. */
-#include <math.h>
-#include <assert.h>
+#include "xlockmoreI.h"
#include "pacman.h"
#include "pacman_ai.h"
#include "pacman_level.h"
+#include <math.h>
+#include <assert.h>
+
#define MI_DISPLAY(MI) ((MI)->dpy)
#define MI_WINDOW(MI) ((MI)->window)
#define MI_WIDTH(MI) ((MI)->xgwa.width)
diff --git a/hacks/pacman_level.c b/hacks/pacman_level.c
index f26b3bf..4dc9a2d 100644
--- a/hacks/pacman_level.c
+++ b/hacks/pacman_level.c
@@ -15,10 +15,11 @@
* other special, indirect and consequential damages.
*/
-#include <assert.h>
+#include "screenhackI.h"
#include "pacman.h"
#include "pacman_level.h"
+#include <assert.h>
#define NONE 0x0000
#define LT 0x1000
diff --git a/hacks/pedal.man b/hacks/pedal.man
index 79d0d0c..ce59d38 100644
--- a/hacks/pedal.man
+++ b/hacks/pedal.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "24-Jun-94" "X Version 11"
.SH NAME
-pedal - pretty geometric picture program
+pedal \- pretty geometric picture program
.SH SYNOPSIS
.B pedal
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-delay \fIseconds\fP] [-maxlines \fInumber\fP] [-mono] [\-install] [\-visual \fIvisual\fP]
diff --git a/hacks/penetrate.c b/hacks/penetrate.c
index 8fcb0da..85c1c08 100644
--- a/hacks/penetrate.c
+++ b/hacks/penetrate.c
@@ -93,8 +93,10 @@ struct state {
Display *dpy;
Window window;
- XFontStruct *font, *scoreFont;
- GC draw_gc, erase_gc, level_gc;
+ XftFont *font, *scoreFont;
+ XftColor xft_fg, xft_level_fg;
+ XftDraw *xftdraw;
+ GC draw_gc, erase_gc;
unsigned int default_fg_pixel;
XColor scoreColor;
@@ -366,10 +368,11 @@ penetrate_init (Display *dpy, Window window)
{
struct state *st = (struct state *) calloc (1, sizeof(*st));
int i;
- const char *levelfont = "-*-courier-*-r-*-*-*-380-*-*-*-*-*-*";
- const char *scorefont = "-*-helvetica-*-r-*-*-*-180-*-*-*-*-*-*";
+ const char *levelfont = "monospace 38";
+ const char *scorefont = "sans-serif 18";
XGCValues gcv;
XWindowAttributes xgwa;
+ char *s;
st->dpy = dpy;
st->window = window;
@@ -388,10 +391,12 @@ penetrate_init (Display *dpy, Window window)
if (st->lrate < 0) st->lrate = 2;
st->startlrate = st->lrate;
- st->font = load_font_retry(st->dpy, levelfont);
+ st->font = load_xft_font_retry(st->dpy, screen_number (xgwa.screen),
+ levelfont);
if (!st->font) abort();
- st->scoreFont = load_font_retry(st->dpy, scorefont);
+ st->scoreFont = load_xft_font_retry(st->dpy, screen_number (xgwa.screen),
+ scorefont);
if (!st->scoreFont) abort();
for (i = 0; i < kMaxMissiles; i++)
@@ -417,13 +422,19 @@ penetrate_init (Display *dpy, Window window)
gcv.foreground = st->default_fg_pixel =
get_pixel_resource(st->dpy, st->cmap, "foreground", "Foreground");
- gcv.font = st->scoreFont->fid;
- st->draw_gc = XCreateGC(st->dpy, st->window, GCForeground | GCFont, &gcv);
- gcv.font = st->font->fid;
- st->level_gc = XCreateGC(st->dpy, st->window, GCForeground | GCFont, &gcv);
- XSetForeground (st->dpy, st->level_gc, st->city[0].color.pixel);
+ st->draw_gc = XCreateGC(st->dpy, st->window, GCForeground, &gcv);
gcv.foreground = get_pixel_resource(st->dpy, st->cmap, "background", "Background");
st->erase_gc = XCreateGC(st->dpy, st->window, GCForeground, &gcv);
+ s = get_string_resource (st->dpy, "foreground", "Foreground");
+ if (!s) s = strdup ("white");
+ XftColorAllocName (st->dpy, xgwa.visual, xgwa.colormap, s, &st->xft_fg);
+ free (s);
+
+ /* Level color was st->city[0].color which is hardcoded as: */
+ s = "#FF8811";
+ XftColorAllocName (st->dpy, xgwa.visual, xgwa.colormap, s,
+ &st->xft_level_fg);
+ st->xftdraw = XftDrawCreate (st->dpy, window, xgwa.visual, xgwa.colormap);
# ifdef HAVE_JWXYZ
jwxyz_XSetAntiAliasing (st->dpy, st->erase_gc, False);
@@ -449,21 +460,28 @@ static void DrawScore(struct state *st, int xlim, int ylim)
{
char buf[16];
int width, height;
+ XGlyphInfo overall;
sprintf(buf, "%ld", st->score);
- width = XTextWidth(st->scoreFont, buf, strlen(buf));
+ XftTextExtentsUtf8 (st->dpy, st->scoreFont, (FcChar8 *) buf,
+ strlen(buf), &overall);
+ width = overall.xOff;
height = font_height(st->scoreFont);
XSetForeground (st->dpy, st->draw_gc, st->scoreColor.pixel);
XFillRectangle(st->dpy, st->window, st->erase_gc,
- xlim - width - 6, ylim - height - 2, width + 6, height + 2);
- XDrawString(st->dpy, st->window, st->draw_gc, xlim - width - 2, ylim - 2,
- buf, strlen(buf));
+ xlim - width - 6, ylim - height - 2, width + 6, height + 2);
+ XftDrawStringUtf8 (st->xftdraw, &st->xft_fg, st->scoreFont,
+ xlim - width - 2, ylim - 2,
+ (FcChar8 *) buf, strlen(buf));
sprintf(buf, "%ld", st->highscore);
- width = XTextWidth(st->scoreFont, buf, strlen(buf));
+ XftTextExtentsUtf8 (st->dpy, st->scoreFont, (FcChar8 *) buf,
+ strlen(buf), &overall);
+ width = overall.xOff;
XFillRectangle(st->dpy, st->window, st->erase_gc,
4, ylim - height - 2, width + 4, height + 2);
- XDrawString(st->dpy, st->window, st->draw_gc, 4, ylim - 2,
- buf, strlen(buf));
+ XftDrawStringUtf8 (st->xftdraw, &st->xft_fg, st->scoreFont,
+ 4, ylim - 2,
+ (FcChar8 *) buf, strlen(buf));
}
static void AddScore(struct state *st, int xlim, int ylim, long dif)
@@ -719,6 +737,7 @@ static void NewLevel(struct state *st, int xlim, int ylim)
int width, i, sumlive = 0;
int liv[kNumCities];
int freecity = 0;
+ XGlyphInfo overall;
if (st->level == 0) {
st->level++;
@@ -753,9 +772,12 @@ static void NewLevel(struct state *st, int xlim, int ylim)
sprintf(buf, "GAME OVER");
}
if (st->level > 0) {
- width = XTextWidth(st->font, buf, strlen(buf));
- XDrawString(st->dpy, st->window, st->level_gc, xlim / 2 - width / 2, ylim / 2 - font_height(st->font) / 2,
- buf, strlen(buf));
+ XftTextExtentsUtf8 (st->dpy, st->font, (FcChar8 *) buf,
+ strlen(buf), &overall);
+ width = overall.xOff;
+ XftDrawStringUtf8 (st->xftdraw, &st->xft_level_fg, st->font,
+ xlim / 2 - width / 2, ylim / 2 - font_height(st->font) / 2,
+ (FcChar8 *) buf, strlen(buf));
XSync(st->dpy, False);
usleep(1000000);
}
@@ -769,13 +791,18 @@ static void NewLevel(struct state *st, int xlim, int ylim)
sprintf(buf, "X %ld", st->level * 100L);
/* how much they get */
- sumwidth = XTextWidth(st->font, buf, strlen(buf));
+ XftTextExtentsUtf8 (st->dpy, st->font, (FcChar8 *) buf,
+ strlen(buf), &overall);
+ sumwidth = overall.xOff;
/* add width of city */
sumwidth += 60;
/* add spacer */
sumwidth += 40;
DrawCity(st, xlim / 2 - sumwidth / 2 + 30, ylim * 0.70, st->city[0].color);
- XDrawString(st->dpy, st->window, st->level_gc, xlim / 2 - sumwidth / 2 + 40 + 60, ylim * 0.7, buf, strlen(buf));
+ XftDrawStringUtf8 (st->xftdraw, &st->xft_level_fg, st->font,
+ xlim / 2 - sumwidth / 2 + 40 + 60,
+ ylim * 0.7,
+ (FcChar8 *) buf, strlen(buf));
for (i=0;i<kNumCities;i++) {
if (liv[i]) {
st->city[i].alive = 1;
@@ -812,8 +839,12 @@ static void NewLevel(struct state *st, int xlim, int ylim)
if (!--ncnt)
st->city[i].alive = 1;
strcpy(buf, "Bonus City");
- width = XTextWidth(st->font, buf, strlen(buf));
- XDrawString(st->dpy, st->window, st->level_gc, xlim / 2 - width / 2, ylim / 4, buf, strlen(buf));
+ XftTextExtentsUtf8 (st->dpy, st->font, (FcChar8 *) buf,
+ strlen(buf), &overall);
+ width = overall.xOff;
+ XftDrawStringUtf8 (st->xftdraw, &st->xft_level_fg, st->font,
+ xlim / 2 - width / 2, ylim / 4,
+ (FcChar8 *) buf, strlen(buf));
DrawCities(st, xlim, ylim);
XSync(st->dpy, False);
usleep(1000000);
@@ -841,8 +872,13 @@ static void NewLevel(struct state *st, int xlim, int ylim)
for (i=0;i<kNumCities;i++)
st->blive[i] = st->city[i].alive;
sprintf(buf, "Bonus Round");
- width = XTextWidth(st->font, buf, strlen(buf));
- XDrawString(st->dpy, st->window, st->level_gc, xlim / 2 - width / 2, ylim / 2 - font_height(st->font) / 2, buf, strlen(buf));
+ XftTextExtentsUtf8 (st->dpy, st->font, (FcChar8 *) buf,
+ strlen(buf), &overall);
+ width = overall.xOff;
+ XftDrawStringUtf8 (st->xftdraw, &st->xft_level_fg, st->font,
+ xlim / 2 - width / 2,
+ ylim / 2 - font_height(st->font) / 2,
+ (FcChar8 *) buf, strlen(buf));
XSync(st->dpy, False);
usleep(1000000);
XFillRectangle(st->dpy, st->window, st->erase_gc,
@@ -953,9 +989,9 @@ penetrate_free (Display *dpy, Window window, void *closure)
struct state *st = (struct state *) closure;
XFreeGC (dpy, st->draw_gc);
XFreeGC (dpy, st->erase_gc);
- XFreeGC (dpy, st->level_gc);
- XFreeFont (dpy, st->font);
- XFreeFont (dpy, st->scoreFont);
+ XftFontClose (st->dpy, st->font);
+ XftFontClose (st->dpy, st->scoreFont);
+ XftDrawDestroy (st->xftdraw);
free (st);
}
diff --git a/hacks/penetrate.man b/hacks/penetrate.man
index 15e8d01..203f74b 100644
--- a/hacks/penetrate.man
+++ b/hacks/penetrate.man
@@ -1,19 +1,6 @@
-.de EX \"Begin example
-.ne 5
-.if n .sp 1
-.if t .sp .5
-.nf
-.in +.5i
-..
-.de EE
-.fi
-.in -.5i
-.if n .sp 1
-.if t .sp .5
-..
.TH XScreenSaver 1 "18-Jun-01" "X Version 11"
.SH NAME
-penetrate - simulates a classic arcade shooting game
+penetrate \- simulates a classic arcade shooting game
.SH SYNOPSIS
.B penetrate
[\-display \fIhost:display.screen\fP] [\-root] [\-window]
diff --git a/hacks/penrose.c b/hacks/penrose.c
index 6317cb6..00bae0c 100644
--- a/hacks/penrose.c
+++ b/hacks/penrose.c
@@ -494,17 +494,6 @@ init_penrose(ModeInfo * mi)
free_penrose(mi);
return;
}
- if (fp == 0) {
- if (MI_IS_VERBOSE(mi)) {
- (void) fprintf(stderr, "Weirdness in init_penrose()\n");
- (void) fprintf(stderr, "fp = 0\n");
- }
- if ((fp = tp->fringe.nodes = ALLOC_NODE(fringe_node_c)) == NULL) {
- free_penrose(mi);
- return;
- }
- tp->done = True;
- }
/* First vertex. */
fp->rule_mask = (1 << N_VERTEX_RULES) - 1;
fp->list_ptr = 0;
diff --git a/hacks/penrose.man b/hacks/penrose.man
index 8c6d4ee..d136e3a 100644
--- a/hacks/penrose.man
+++ b/hacks/penrose.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "10-May-97" "X Version 11"
.SH NAME
-penrose - draws quasiperiodic tilings
+penrose \- draws quasiperiodic tilings
.SH SYNOPSIS
.B penrose
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-size \fIinteger\fP] [\-ammann] [\-no\-ammann]
@@ -23,7 +23,7 @@ the literature: First, we do not allow the tiling to enclose an
untiled area. Whenever this is in danger of happening, we just
do not add the tile, hoping for a better random choice the next
time. Second, when choosing a vertex randomly, we will take
-one that lies withing the viewport if available. If this seems to
+one that lies within the viewport if available. If this seems to
cause enclosures in the forced rule case, we will allow invisible
vertices to be chosen.
diff --git a/hacks/petri.man b/hacks/petri.man
index b89230a..4c6bec2 100644
--- a/hacks/petri.man
+++ b/hacks/petri.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "06-Jul-2000" "X Version 11"
.SH NAME
-petri - simulates mold growing in a petri dish
+petri \- simulates mold growing in a petri dish
.SH SYNOPSIS
.B petri
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP] [\-size \fIinteger\fP] [\-mem-throttle \fIamount\fP] [\-count \fIinteger\fP] [\-originalcolors] [\-diaglim \fIreal\fP] [\-anychan \fIreal\fP] [\-minorchan \fIreal\fP] [\-instantdeathchan \fIreal\fP] [\-minlifespeed \fIreal\fP] [\-maxlifespeed \fIreal\fP] [\-mindeathspeed \fIreal\fP] [\-maxdeathspeed \fIreal\fP] [\-minlifespan \fIinteger\fP] [\-maxlifespan \fIinteger\fP]
diff --git a/hacks/phosphor.c b/hacks/phosphor.c
index 374e134..80a4f71 100644
--- a/hacks/phosphor.c
+++ b/hacks/phosphor.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1999-2018 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 1999-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -13,18 +13,15 @@
* Pty and vt100 emulation by Fredrik Tolf <fredrik@dolda2000.com>
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
+#include "screenhack.h"
+#include "textclient.h"
+#include "ximage-loader.h"
+#include "utf8wc.h"
#ifndef HAVE_JWXYZ
# include <X11/Intrinsic.h>
#endif
-#include "screenhack.h"
-#include "textclient.h"
-#include "ximage-loader.h"
-#include "utf8wc.h"
#define FUZZY_BORDER
@@ -67,7 +64,8 @@ typedef struct {
Display *dpy;
Window window;
XWindowAttributes xgwa;
- XFontStruct *font;
+ XftFont *font;
+ XftDraw *xftdraw;
const char *program;
int grid_width, grid_height;
int char_width, char_height;
@@ -160,7 +158,7 @@ phosphor_init (Display *dpy, Window window)
unsigned long flags;
p_state *state = (p_state *) calloc (sizeof(*state), 1);
char *fontname = get_string_resource (dpy, "font", "Font");
- XFontStruct *font;
+ XftFont *font;
state->dpy = dpy;
state->window = window;
@@ -176,19 +174,27 @@ phosphor_init (Display *dpy, Window window)
{
#ifndef BUILTIN_FONT
fprintf (stderr, "%s: no builtin font\n", progname);
- state->font = load_font_retry (dpy, "fixed");
+ state->font = load_xft_font_retry (dpy,
+ screen_number (state->xgwa.screen),
+ "fixed");
#endif /* !BUILTIN_FONT */
}
else
{
- state->font = load_font_retry (dpy, fontname);
+ state->font = load_xft_font_retry (dpy,
+ screen_number (state->xgwa.screen),
+ fontname);
if (!state->font) abort();
}
if (fontname) free (fontname);
font = state->font;
- state->scale = get_integer_resource (dpy, "scale", "Integer");
+ state->xftdraw = XftDrawCreate (dpy, window, state->xgwa.visual,
+ state->xgwa.colormap);
+
+ /* Xft uses 'scale' */
+ state->scale = get_integer_resource (dpy, "phosphorScale", "Integer");
state->ticks = STATE_MAX + get_integer_resource (dpy, "ticks", "Integer");
state->escstate = 0;
@@ -205,11 +211,13 @@ phosphor_init (Display *dpy, Window window)
else
# endif /* BUILTIN_FONT */
{
- state->char_width = font->max_bounds.width;
- state->char_height = font->max_bounds.ascent + font->max_bounds.descent;
+ XGlyphInfo overall;
+ XftTextExtentsUtf8 (dpy, state->font, (FcChar8 *) "N", 1, &overall);
+ state->char_width = overall.xOff;
+ state->char_height = font->ascent + font->descent;
}
-# ifdef USE_IPHONE
+# ifdef HAVE_IPHONE
/* Stupid iPhone X bezel.
#### This is the worst of all possible ways to do this! But how else?
*/
@@ -289,7 +297,6 @@ phosphor_init (Display *dpy, Window window)
/* Now, GCs all around.
*/
- state->gcv.font = (font ? font->fid : 0);
state->gcv.cap_style = CapRound;
#ifdef FUZZY_BORDER
state->gcv.line_width = (int) (((long) state->scale) * 1.3);
@@ -401,7 +408,7 @@ resize_grid (p_state *state)
static void
capture_font_bits (p_state *state)
{
- XFontStruct *font = state->font;
+ XftFont *font = state->font;
int safe_width, height;
unsigned char string[257];
int i;
@@ -412,9 +419,6 @@ capture_font_bits (p_state *state)
if (!font)
{
- safe_width = state->char_width + 1;
- height = state->char_height;
-
int pix_w, pix_h;
XWindowAttributes xgwa;
Pixmap m = 0;
@@ -430,6 +434,9 @@ capture_font_bits (p_state *state)
unsigned long black =
BlackPixelOfScreen (DefaultScreenOfDisplay (state->dpy));
+ safe_width = state->char_width + 1;
+ height = state->char_height;
+
XFreePixmap (state->dpy, p);
XFreePixmap (state->dpy, m);
if (pix_w != 256*7) abort();
@@ -466,7 +473,12 @@ capture_font_bits (p_state *state)
else
# endif /* BUILTIN_FONT */
{
- safe_width = font->max_bounds.rbearing - font->min_bounds.lbearing;
+ XGlyphInfo overall;
+ XftTextExtentsUtf8 (state->dpy, state->font,
+ (FcChar8 *) "N", 1, &overall);
+ /* #### maybe safe_width should take lbearing into account */
+ safe_width = overall.xOff;
+ state->char_height = state->font->ascent + state->font->descent;
height = state->char_height;
}
@@ -485,8 +497,7 @@ capture_font_bits (p_state *state)
state->gcv.foreground = 1;
state->gc1 = XCreateGC (state->dpy, p,
- ((font ? GCFont : 0) |
- GCForeground | GCBackground |
+ (GCForeground | GCBackground |
GCCapStyle | GCLineWidth),
&state->gcv);
@@ -503,8 +514,7 @@ capture_font_bits (p_state *state)
if (state->gcv.line_width < 1)
state->gcv.line_width = 1;
state->gc2 = XCreateGC (state->dpy, p,
- ((font ? GCFont : 0) |
- GCForeground | GCBackground |
+ (GCForeground | GCBackground |
GCCapStyle | GCLineWidth),
&state->gcv);
}
@@ -523,28 +533,69 @@ capture_font_bits (p_state *state)
else
# endif /* BUILTIN_FONT */
{
+ Pixmap pm_color = XCreatePixmap (state->dpy, state->window,
+ (safe_width * 256), height,
+ state->xgwa.depth);
+ XImage *xim_color, *xim_mono;
+ GC text_gc;
+ XGCValues gcv;
+ XftDraw *xftdraw;
+ XftColor xft_fg;
+ int x, y;
+
+ /* Maybe this should be using XftDrawCreateBitmap instead of
+ XftDrawCreate to render the font with 1-bit hinting? */
+
+ /* Create a full-depth pixmap and draw the text into it, fg/bg ~0/0. */
+ gcv.foreground = 0;
+ text_gc = XCreateGC (state->dpy, pm_color, GCForeground, &gcv);
+ XFillRectangle (state->dpy, pm_color, text_gc, 0, 0,
+ (safe_width * 256), height);
+ xftdraw = XftDrawCreate (state->dpy, pm_color,
+ state->xgwa.visual, state->xgwa.colormap);
+ xft_fg.pixel = ~0L;
+ xft_fg.color.red = xft_fg.color.green = xft_fg.color.blue = ~0L;
for (i = 0; i < 256; i++)
- {
- if (string[i] < font->min_char_or_byte2 ||
- string[i] > font->max_char_or_byte2)
- continue;
- XDrawString (state->dpy, p, state->gc1,
- i * safe_width, font->ascent,
- (char *) (string + i), 1);
- }
+ XftDrawStringUtf8 (xftdraw, &xft_fg, state->font,
+ i * safe_width, font->ascent,
+ (FcChar8 *) (string + i), 1);
+
+ /* Retrieve a full-depth XImage. */
+ xim_color = XGetImage (state->dpy, pm_color, 0, 0,
+ i * safe_width, font->ascent,
+ state->xgwa.depth, ZPixmap);
+
+ /* Convert it to a mono XImage. */
+ xim_mono = XCreateImage (state->dpy, state->xgwa.visual,
+ 1, XYPixmap, 0, 0,
+ i * safe_width, font->ascent,
+ 8, 0);
+ xim_mono->data = (char *)
+ calloc(xim_mono->height, xim_mono->bytes_per_line);
+ for (y = 0; y < xim_color->height; y++)
+ for (x = 0; x < xim_color->width; x++)
+ XPutPixel (xim_mono, x, y, XGetPixel (xim_color, x, y) ? 1 : 0);
+
+ /* Copy mono ximage to mono pixmap */
+ XFreeGC (state->dpy, text_gc);
+ text_gc = XCreateGC (state->dpy, p, GCForeground, &gcv);
+ XPutImage (state->dpy, p, text_gc, xim_mono, 0, 0, 0, 0,
+ (safe_width * 256), height);
+ XFreeGC (state->dpy, text_gc);
+ XDestroyImage (xim_color);
+ XDestroyImage (xim_mono);
+# if 0
+ XWriteBitmapFile(state->dpy, "/tmp/tvfont.xbm", p,
+ (safe_width * 256), height,
+ -1, -1);
+# endif
}
/* Draw the cursor. */
XFillRectangle (state->dpy, p, state->gc1,
(CURSOR_INDEX * safe_width), 1,
- (font
- ? (font->per_char
- ? font->per_char['n'-font->min_char_or_byte2].width
- : font->max_bounds.width)
- : state->char_width),
- (font
- ? font->ascent - 1
- : state->char_height));
+ state->char_width,
+ state->char_height);
state->font_bits = XGetImage (state->dpy, p, 0, 0,
(safe_width * 256), height, ~0L, XYPixmap);
@@ -579,18 +630,11 @@ char_to_pixmap (p_state *state, p_char *pc, int c)
int from, to;
int x1, y;
- XFontStruct *font = state->font;
- int safe_width = (font
- ? font->max_bounds.rbearing - font->min_bounds.lbearing
- : state->char_width + 1);
+ int safe_width = state->char_width + 1;
int width = state->scale * state->char_width;
int height = state->scale * state->char_height;
- if (font && (c < font->min_char_or_byte2 ||
- c > font->max_char_or_byte2))
- goto DONE;
-
gc = state->gc1;
p = XCreatePixmap (state->dpy, state->window, width, height, 1);
XFillRectangle (state->dpy, p, state->gc0, 0, 0, width, height);
@@ -642,7 +686,6 @@ char_to_pixmap (p_state *state, p_char *pc, int c)
/* if (pc->blank_p && c == CURSOR_INDEX)
abort();*/
- DONE:
pc->pixmap = p;
#ifdef FUZZY_BORDER
pc->pixmap2 = p2;
@@ -1436,7 +1479,7 @@ static const char *phosphor_defaults [] = {
#else
"*font: fixed",
#endif
- "*scale: 6",
+ "*phosphorScale: 6",
"*ticks: 20",
"*delay: 50000",
"*cursor: 333",
@@ -1454,7 +1497,7 @@ static const char *phosphor_defaults [] = {
static XrmOptionDescRec phosphor_options [] = {
{ "-font", ".font", XrmoptionSepArg, 0 },
- { "-scale", ".scale", XrmoptionSepArg, 0 },
+ { "-scale", ".phosphorScale", XrmoptionSepArg, 0 },
{ "-ticks", ".ticks", XrmoptionSepArg, 0 },
{ "-delay", ".delay", XrmoptionSepArg, 0 },
{ "-program", ".program", XrmoptionSepArg, 0 },
diff --git a/hacks/phosphor.man b/hacks/phosphor.man
index 154599c..734d2f4 100644
--- a/hacks/phosphor.man
+++ b/hacks/phosphor.man
@@ -1,19 +1,6 @@
-.de EX \"Begin example
-.ne 5
-.if n .sp 1
-.if t .sp .5
-.nf
-.in +.5i
-..
-.de EE
-.fi
-.in -.5i
-.if n .sp 1
-.if t .sp .5
-..
.TH XScreenSaver 1 "5-May-2004" "X Version 11"
.SH NAME
-phosphor - simulates an old terminal with long-sustain phosphor
+phosphor \- simulates an old terminal with long-sustain phosphor
.SH SYNOPSIS
.B phosphor
[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
@@ -75,36 +62,41 @@ artificially slowly, as per the \fI\-delay\fP option above. If the
program exits, it will be launched again after 5 seconds.
For example:
-.EX
-phosphor -program 'cat /usr/src/linux*/README'
-phosphor -program 'ping localhost'
-phosphor -program 'ps -e'
-phosphor -program 'od -txC -w6 /dev/random'
-phosphor -program 'cat /dev/random'
-phosphor -scale 2 -geom =1280x1024 -program 'top'
-phosphor -scale 4 -geom =1280x1024 \\
- -program 'mtr www.kernel.org'
-phosphor -program 'xemacs -nw -q -f life'
-phosphor -scale 5 -geom =1280x1024 \\
- -program 'xemacs -nw -q --eval "(hanoi 5)"'
-.EE
+.nf
+.sp
+ phosphor -program 'cat /usr/src/linux*/README'
+ phosphor -program 'ping localhost'
+ phosphor -program 'ps -e'
+ phosphor -program 'od -txC -w6 /dev/random'
+ phosphor -program 'cat /dev/random'
+ phosphor -scale 2 -geom =1280x1024 -program 'top'
+ phosphor -scale 4 -geom =1280x1024 \\
+ -program 'mtr www.kernel.org'
+ phosphor -program 'xemacs -nw -q -f life'
+ phosphor -scale 5 -geom =1280x1024 \\
+ -program 'xemacs -nw -q --eval "(hanoi 5)"'
+.sp
+.fi
If you have the
.BR festival (1)
text-to-speech system installed, you can have it read the screen as
phosphor prints it:
-.EX
-phosphor -program \\
- 'xscreensaver-text | tee /dev/stderr | festival --tts'
-.EE
+.nf
+.sp
+ phosphor -program \\
+ 'xscreensaver-text | tee /dev/stderr | festival --tts'
+.sp
+.fi
You can also use \fIphosphor\fP as a lo-fi replacement for the
.BR xterm (1)
and
.BR gnome-terminal (1)
terminal emulators:
-.EX
-phosphor -delay 0 -program tcsh
-.EE
-.TP 8
+.nf
+.sp
+ phosphor -delay 0 -program tcsh
+.sp
+.fi
.B \-esc
When the user types a key with the Alt or Meta keys held down, send an
ESC character first. This is the default.
@@ -148,7 +140,7 @@ stored in the RESOURCE_MANAGER property.
to inform the sub-process of the type of terminal emulation.
.SH SEE ALSO
.BR xscreensaver (1),
-.BR xscreensaver-text (1),
+.BR xscreensaver\-text (MANSUFFIX),
.BR fortune (1),
.BR apple2 (MANSUFFIX),
.BR starwars (MANSUFFIX),
diff --git a/hacks/piecewise.man b/hacks/piecewise.man
index 1d313bf..b580bec 100644
--- a/hacks/piecewise.man
+++ b/hacks/piecewise.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-piecewise - lots of moving circles intersecting in interesting ways.
+piecewise \- lots of moving circles intersecting in interesting ways.
.SH SYNOPSIS
.B piecewise
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/polyominoes.c b/hacks/polyominoes.c
index b87c3d3..0ae5366 100644
--- a/hacks/polyominoes.c
+++ b/hacks/polyominoes.c
@@ -55,9 +55,6 @@ static const char sccsid[] = "@(#)polyominoes.c 5.01 2000/12/18 xlockmore";
static Bool identical;
static Bool plain;
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
static XrmOptionDescRec opts[] =
{
{"-identical", ".polyominoes.identical", XrmoptionNoArg, "on"},
@@ -975,6 +972,10 @@ static void create_bitmaps(ModeInfo * mi, polyominoesstruct *sp)
}
sp->use_bitmaps = 1;
+
+#ifdef HAVE_ANDROID /* Doesn't work -- displays black */
+ sp->use_bitmaps = 0;
+#endif
}
static void draw_with_bitmaps(ModeInfo * mi, polyominoesstruct *sp)
diff --git a/hacks/polyominoes.man b/hacks/polyominoes.man
index c99a836..d69ecdf 100644
--- a/hacks/polyominoes.man
+++ b/hacks/polyominoes.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-polyominoes - fill a rectangle with irregularly-shaped blocks.
+polyominoes \- fill a rectangle with irregularly-shaped blocks.
.SH SYNOPSIS
.B polyominoes
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/pong.c b/hacks/pong.c
index 8c18a1c..2415b16 100644
--- a/hacks/pong.c
+++ b/hacks/pong.c
@@ -1038,8 +1038,8 @@ pong_event (Display *dpy, Window window, void *closure, XEvent *event)
{
char c;
KeySym key;
- XLookupString(&event->xkey, &c, 1, &key, 0);
Bool is_pressed = event->type == KeyPress;
+ XLookupString(&event->xkey, &c, 1, &key, 0);
switch(key)
{
case XK_Up:
diff --git a/hacks/pong.man b/hacks/pong.man
index c37364a..4ab88cd 100644
--- a/hacks/pong.man
+++ b/hacks/pong.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "5-May-2004" "X Version 11"
.SH NAME
-pong - Pong Home Video Game Emulator
+pong \- Pong Home Video Game Emulator
.SH SYNOPSIS
.B pong
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
diff --git a/hacks/pyro.man b/hacks/pyro.man
index 914fad7..daae0f2 100644
--- a/hacks/pyro.man
+++ b/hacks/pyro.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "13-aug-92" "X Version 11"
.SH NAME
-pyro - simulate fireworks
+pyro \- simulate fireworks
.SH SYNOPSIS
.B pyro
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-count \fIinteger\fP] [\-frequency \fIinteger\fP] [\-scatter \fIinteger\fP]
diff --git a/hacks/qix.man b/hacks/qix.man
index f5a0930..0f90c8d 100644
--- a/hacks/qix.man
+++ b/hacks/qix.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "27-Apr-97" "X Version 11"
.SH NAME
-qix - bounce colored lines around a window
+qix \- bounce colored lines around a window
.SH SYNOPSIS
.B qix
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-segments \fIint\fP] [\-spread \fIpixels\fP] [\-size \fIpixels\fP] [\-count \fIint\fP] [\-color-shift \fIdegrees\fP] [\-delay \fIusecs\fP] [\-random] [\-linear] [\-solid] [\-hollow] [\-xor] [\-no\-xor] [\-transparent] [\-non\-transparent] [\-additive] [\-subtractive] [\-poly \fIint\fP] [\-gravity] [\-no\-gravity]
diff --git a/hacks/rd-bomb.man b/hacks/rd-bomb.man
index 4022a43..42c809a 100644
--- a/hacks/rd-bomb.man
+++ b/hacks/rd-bomb.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "10-May-97" "X Version 11"
.SH NAME
-rd-bomb - reaction/diffusion textures
+rd-bomb \- reaction/diffusion textures
.SH SYNOPSIS
.B rd-bomb
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
diff --git a/hacks/recanim.c b/hacks/recanim.c
index bd88b4b..e5b0e01 100644
--- a/hacks/recanim.c
+++ b/hacks/recanim.c
@@ -1,4 +1,4 @@
-/* recanim, Copyright (c) 2014-2020 Jamie Zawinski <jwz@jwz.org>
+/* recanim, Copyright (c) 2014-2021 Jamie Zawinski <jwz@jwz.org>
* Record animation frames of the running screenhack.
*
* Permission to use, copy, modify, distribute, and sell this software and its
@@ -10,9 +10,25 @@
* implied warranty.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
+#include "screenhackI.h"
+#include "recanim.h"
+
+#if (__GNUC__ >= 4) /* Ignore useless warnings generated by gtk.h */
+# undef inline
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wstrict-prototypes"
+# pragma GCC diagnostic ignored "-Wlong-long"
+# pragma GCC diagnostic ignored "-Wvariadic-macros"
+# pragma GCC diagnostic ignored "-Wpedantic"
+#endif
+
+#ifdef HAVE_GDK_PIXBUF
+# ifdef HAVE_GTK2
+# include <gdk-pixbuf-xlib/gdk-pixbuf-xlib.h>
+# else /* !HAVE_GTK2 */
+# include <gdk-pixbuf/gdk-pixbuf-xlib.h>
+# endif /* !HAVE_GTK2 */
+#endif /* HAVE_GDK_PIXBUF */
#ifdef USE_GL
# ifdef HAVE_JWXYZ
@@ -26,20 +42,9 @@
# endif /* HAVE_JWZGLES */
#endif /* USE_GL */
-#ifdef HAVE_GDK_PIXBUF
-# ifdef HAVE_GTK2
-# include <gdk-pixbuf-xlib/gdk-pixbuf-xlib.h>
-# else /* !HAVE_GTK2 */
-# include <gdk-pixbuf/gdk-pixbuf-xlib.h>
-# endif /* !HAVE_GTK2 */
-#endif /* HAVE_GDK_PIXBUF */
-
#include <sys/stat.h>
#include <sys/types.h>
-#include "screenhackI.h"
-#include "recanim.h"
-
#undef gettimeofday /* wrapped by recanim.h */
#undef time
@@ -391,6 +396,7 @@ screenhack_record_anim_free (record_anim_state *st)
const char *type = "png";
char cmd[1024];
char fn[1024];
+ size_t len_cmd;
const char *soundtrack = 0;
fprintf (stderr, "%s: wrote %d frames\n", progname, st->frame_count);
@@ -417,21 +423,25 @@ screenhack_record_anim_free (record_anim_state *st)
if (! soundtrack) soundtrack = "../../" ST;
if (stat (soundtrack, &s)) soundtrack = 0;
- sprintf (cmd,
+ len_cmd = 0;
+ len_cmd += snprintf (cmd, sizeof cmd - len_cmd,
"ffmpeg"
" -hide_banner"
- " -v 16"
+ " -loglevel error"
" -framerate %d" /* rate of input: must be before -i */
" -i '%s-%%06d.%s'"
" -r %d", /* rate of output: must be after -i */
st->fps, progname, type, st->fps);
- if (soundtrack)
- sprintf (cmd + strlen(cmd),
+ if (len_cmd >= sizeof cmd) abort();
+ if (soundtrack) {
+ len_cmd += snprintf (cmd + len_cmd, sizeof cmd - len_cmd,
" -i '%s' -map 0:v:0 -map 1:a:0 -acodec aac"
/* Truncate or pad audio to length of video */
" -filter_complex '[1:0] apad' -shortest",
soundtrack);
- sprintf (cmd + strlen(cmd),
+ if (len_cmd >= sizeof cmd) abort();
+ }
+ len_cmd += snprintf (cmd + len_cmd, sizeof cmd - len_cmd,
" -c:v libx264"
" -profile:v high"
" -crf 18"
@@ -440,6 +450,7 @@ screenhack_record_anim_free (record_anim_state *st)
" </dev/null"
/*" 2>&-"*/,
fn);
+ if (len_cmd >= sizeof cmd) abort();
fprintf (stderr, "%s: exec: %s\n", progname, cmd);
/* Use empty body to kill warning from gcc -Wall with
"warning: ignoring return value of 'system',
diff --git a/hacks/recanim.h b/hacks/recanim.h
index a7e8cf3..16021e3 100644
--- a/hacks/recanim.h
+++ b/hacks/recanim.h
@@ -1,4 +1,4 @@
-/* recanim, Copyright (c) 2014-2018 Jamie Zawinski <jwz@jwz.org>
+/* recanim, Copyright (c) 2014-2021 Jamie Zawinski <jwz@jwz.org>
* Record animation frames of the running screenhack.
*
* Permission to use, copy, modify, distribute, and sell this software and its
@@ -13,10 +13,6 @@
#ifndef __XSCREENSAVER_RECORD_ANIM_H__
# define __XSCREENSAVER_RECORD_ANIM_H__
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
-
typedef struct record_anim_state record_anim_state;
extern record_anim_state *screenhack_record_anim_init (Screen *, Window,
diff --git a/hacks/ripples.man b/hacks/ripples.man
index f016683..ec77796 100644
--- a/hacks/ripples.man
+++ b/hacks/ripples.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-ripples - interference patterns.
+ripples \- interference patterns.
.SH SYNOPSIS
.B ripples
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/rocks.man b/hacks/rocks.man
index b5751d9..0cdf264 100644
--- a/hacks/rocks.man
+++ b/hacks/rocks.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "13-aug-92" "X Version 11"
.SH NAME
-rocks - animation of flying through an asteroid field
+rocks \- animation of flying through an asteroid field
.SH SYNOPSIS
.B rocks
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-ncolors \fIn\fP] [\-install] [\-visual \fIvisual\fP] [\-count \fIinteger\fP] [\-delay \fIusecs\fP] [\-speed \fIinteger\fP] [\-norotate] [\-nomove] [\-3d]
diff --git a/hacks/rorschach.man b/hacks/rorschach.man
index 5a28cf6..03b27e7 100644
--- a/hacks/rorschach.man
+++ b/hacks/rorschach.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "13-aug-92" "X Version 11"
.SH NAME
-rorschach - simulate ink-blot patterns
+rorschach \- simulate ink-blot patterns
.SH SYNOPSIS
.B rorschach
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-iterations \fIinteger\fP] [\-offset \fIinteger\fP] [\-xsymmetry] [\-ysymmetry] [\-erase\-speed \fIusecs\fP] [\-delay \fIsecs\fP]
diff --git a/hacks/rotor.man b/hacks/rotor.man
index 58590ed..75c79b5 100644
--- a/hacks/rotor.man
+++ b/hacks/rotor.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-rotor - screen saver.
+rotor \- screen saver.
.SH SYNOPSIS
.B rotor
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/rotzoomer.man b/hacks/rotzoomer.man
index 0a82550..bbf900d 100644
--- a/hacks/rotzoomer.man
+++ b/hacks/rotzoomer.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "14-Mar-01" "X Version 11"
.SH NAME
-rotzoomer - animated rotations and scalings of portions of the screen
+rotzoomer \- animated rotations and scalings of portions of the screen
.SH SYNOPSIS
.B rotzoomer
[\-display \fIhost:display.screen\fP]
@@ -22,7 +22,7 @@ or from a random file on disk, as indicated by
the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
file; see
-.BR xscreensaver-demo (1)
+.BR xscreensaver\-settings (1)
for more details.
.SH OPTIONS
.I rotzoomer
@@ -74,8 +74,8 @@ stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1),
-.BR xscreensaver\-demo (1),
-.BR xscreensaver\-getimage (1)
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-getimage (MANSUFFIX)
.SH COPYRIGHT
Copyright \(co 2001 by Claudio Matsuoka. Permission to use, copy, modify,
distribute, and sell this software and its documentation for any purpose is
diff --git a/hacks/scooter.man b/hacks/scooter.man
index 492eb00..30bf217 100644
--- a/hacks/scooter.man
+++ b/hacks/scooter.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "14-Mar-01" "X Version 11"
.SH NAME
-scooter - shows a journey through space tunnel and stars
+scooter \- shows a journey through space tunnel and stars
.SH SYNOPSIS
.B scooter
[\-display \fIhost:display.screen\fP]
@@ -65,8 +65,8 @@ stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1),
-.BR xscreensaver\-demo (1),
-.BR xscreensaver\-getimage (1)
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-getimage (MANSUFFIX)
.SH COPYRIGHT
Copyright \(co 2001 by Sven Thoennissen. Permission to use, copy, modify,
distribute, and sell this software and its documentation for any purpose is
diff --git a/hacks/screenhack.c b/hacks/screenhack.c
index f292538..14ec48b 100644
--- a/hacks/screenhack.c
+++ b/hacks/screenhack.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992-2020 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1992-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -97,17 +97,8 @@
# include <X11/SGIScheme.h> /* for SgiUseSchemes() */
#endif /* __sgi */
-#ifdef HAVE_XMU
-# ifndef VMS
-# include <X11/Xmu/Error.h>
-# else /* VMS */
-# include <Xmu/Error.h>
-# endif
-#else
-# include "xmu.h"
-#endif
-
#include "screenhackI.h"
+#include "xmu.h"
#include "version.h"
#include "vroot.h"
#include "fps.h"
@@ -444,10 +435,13 @@ screenhack_table_handle_events (Display *dpy,
)
{
XtAppContext app = XtDisplayToApplicationContext (dpy);
+ XtInputMask m = XtAppPending (app);
- if (XtAppPending (app) & (XtIMTimer|XtIMAlternateInput))
- XtAppProcessEvent (app, XtIMTimer|XtIMAlternateInput);
+ /* Process non-X11 Xt events (timers, files, signals) without blocking. */
+ if (m & ~XtIMXEvent)
+ XtAppProcessEvent (app, ~XtIMXEvent);
+ /* Process all pending X11 events without blocking. */
while (XPending (dpy))
{
XEvent event;
@@ -475,8 +469,10 @@ screenhack_table_handle_events (Display *dpy,
if (! screenhack_handle_event_1 (dpy, &event))
return False;
- if (XtAppPending (app) & (XtIMTimer|XtIMAlternateInput))
- XtAppProcessEvent (app, XtIMTimer|XtIMAlternateInput);
+ /* Last chance to process Xt timers before blocking. */
+ m = XtAppPending (app);
+ if (m & ~XtIMXEvent)
+ XtAppProcessEvent (app, ~XtIMXEvent);
}
# ifdef EXIT_AFTER
@@ -611,12 +607,14 @@ run_screenhack_table (Display *dpy,
if (anim_state) screenhack_record_anim_free (anim_state);
#endif
- ft->free_cb (dpy, window, closure);
if (fpst) ft->fps_free (fpst);
+#ifdef DEBUG_PAIR
+ if (fpst2) ft->fps_free (fpst2);
+#endif
+ ft->free_cb (dpy, window, closure);
#ifdef DEBUG_PAIR
if (window2) ft->free_cb (dpy, window2, closure2);
- if (fpst2) ft->fps_free (fpst2);
#endif
}
@@ -689,9 +687,9 @@ init_window (Display *dpy, Widget toplevel, const char *title)
{
Window window;
XWindowAttributes xgwa;
+ long pid = getpid();
XtPopup (toplevel, XtGrabNone);
XtVaSetValues (toplevel, XtNtitle, title, NULL);
- long pid = getpid();
/* Select KeyPress, and announce that we accept WM_DELETE_WINDOW.
*/
@@ -753,6 +751,15 @@ main (int argc, char **argv)
SgiUseSchemes ("none");
#endif /* __sgi */
+ /* Xt and xscreensaver predate the "--arg" convention, so convert
+ double dashes to single. */
+ {
+ int i;
+ for (i = 1; i < argc; i++)
+ if (argv[i][0] == '-' && argv[i][1] == '-')
+ argv[i]++;
+ }
+
toplevel = XtAppInitialize (&app, progclass, merged_options,
merged_options_size, &argc, argv,
merged_defaults, 0, 0);
@@ -792,15 +799,13 @@ main (int argc, char **argv)
if (argc > 1)
{
- const char *s;
int i;
int x = 18;
int end = 78;
Bool help_p = (!strcmp(argv[1], "-help") ||
!strcmp(argv[1], "--help"));
fprintf (stderr, "%s\n", version);
- for (s = progclass; *s; s++) fprintf(stderr, " ");
- fprintf (stderr, " https://www.jwz.org/xscreensaver/\n\n");
+ fprintf (stderr, "\n\thttps://www.jwz.org/xscreensaver/\n\n");
if (!help_p)
fprintf(stderr, "Unrecognised option: %s\n", argv[1]);
diff --git a/hacks/screenhackI.h b/hacks/screenhackI.h
index 1fafa91..e11388e 100644
--- a/hacks/screenhackI.h
+++ b/hacks/screenhackI.h
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992-2018 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1992-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -71,9 +71,6 @@
#ifdef HAVE_JWXYZ
# include "jwxyz.h"
# include <string.h> /* X11/Xos.h brings this in. */
-/* From utils/visual.c. */
-# define DEFAULT_VISUAL -1
-# define GL_VISUAL -6
#else /* real X11 */
# include <X11/Xlib.h>
# include <X11/Xutil.h>
@@ -81,7 +78,58 @@
# include <X11/Xos.h>
#endif /* !HAVE_JWXYZ */
-#if defined(USE_IPHONE) || defined(HAVE_ANDROID)
+#ifdef HAVE_JWXYZ
+# define DEFAULT_VISUAL -1 /* From utils/visual.c. */
+# define GL_VISUAL -6
+#endif /* HAVE_JWXYZ */
+
+#ifdef USE_GL
+
+/* I'm told that the Sun version of OpenGL needs to have the constant
+ SUN_OGL_NO_VERTEX_MACROS defined in order for morph3d to compile
+ (the number of arguments to the glNormal3f macro changes...)
+ Verified with gcc 2.7.2.2 and Sun cc 4.2 with OpenGL 1.1.1 dev 4
+ on Solaris 2.5.1.
+ */
+# if defined(__sun) && defined(__SVR4) /* Solaris */
+# define SUN_OGL_NO_VERTEX_MACROS 1
+# endif /* Solaris */
+
+# ifdef HAVE_GLSL
+# define GL_GLEXT_PROTOTYPES
+# endif
+
+# if defined(HAVE_COCOA) && !defined(HAVE_IPHONE) /* macOS */
+# include <OpenGL/gl.h>
+# include <OpenGL/glu.h>
+# elif defined(HAVE_IPHONE)
+# ifdef HAVE_GLES3
+# include "OpenGLES/ES3/gl.h"
+# endif
+# elif defined(HAVE_ANDROID)
+# include <GLES/gl.h>
+# ifdef HAVE_GLES3
+# include <GLES3/gl3.h>
+# endif
+# else /* real X11 */
+# include <GL/gl.h>
+# include <GL/glu.h>
+# ifdef HAVE_EGL
+# include <EGL/egl.h>
+# include <EGL/eglext.h>
+# else
+# include <GL/glx.h>
+# endif
+# endif
+
+# ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+# endif
+
+#endif /* HAVE_GL */
+
+
+#if defined(HAVE_IPHONE) || defined(HAVE_ANDROID)
# define HAVE_MOBILE
#endif
@@ -113,12 +161,19 @@
#include "grabscreen.h"
#include "visual.h"
#include "fps.h"
+#include "xft.h"
#include "font-retry.h"
#ifdef HAVE_RECORD_ANIM
# include "recanim.h"
#endif
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+
/* Be Posixly correct */
#undef bzero
#define bzero __ERROR_use_memset_not_bzero_in_xscreensaver__
diff --git a/hacks/shadebobs.man b/hacks/shadebobs.man
index e98905e..7c38b4c 100644
--- a/hacks/shadebobs.man
+++ b/hacks/shadebobs.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-shadebobs - oscillating vapor trails.
+shadebobs \- oscillating vapor trails.
.SH SYNOPSIS
.B shadebobs
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/sierpinski.man b/hacks/sierpinski.man
index 665ecad..ce31b00 100644
--- a/hacks/sierpinski.man
+++ b/hacks/sierpinski.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "10-May-97" "X Version 11"
.SH NAME
-sierpinski - draws Sierpinski triangle fractals
+sierpinski \- draws Sierpinski triangle fractals
.SH SYNOPSIS
.B sierpinski
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP]
diff --git a/hacks/slidescreen.man b/hacks/slidescreen.man
index 6ab4fde..69030ac 100644
--- a/hacks/slidescreen.man
+++ b/hacks/slidescreen.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "24-Nov-97" "X Version 11"
.SH NAME
-slidescreen - permute the screen image like an 8-puzzle
+slidescreen \- permute the screen image like an 8-puzzle
.SH SYNOPSIS
.B slidescreen
[\-display \fIhost:display.screen\fP]
@@ -27,7 +27,7 @@ or from a random file on disk, as indicated by
the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
file; see
-.BR xscreensaver-demo (1)
+.BR xscreensaver\-settings (1)
for more details.
.SH OPTIONS
.I slidescreen
@@ -83,8 +83,8 @@ stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1),
-.BR xscreensaver\-demo (1),
-.BR xscreensaver\-getimage (1)
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-getimage (MANSUFFIX)
.SH COPYRIGHT
Copyright \(co 1992 by Jamie Zawinski. Permission to use, copy, modify,
distribute, and sell this software and its documentation for any purpose is
diff --git a/hacks/slip.man b/hacks/slip.man
index ce4e110..1544209 100644
--- a/hacks/slip.man
+++ b/hacks/slip.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "24-Nov-97" "X Version 11"
.SH NAME
-slip - sucks your screen into a jet engine
+slip \- sucks your screen into a jet engine
.SH SYNOPSIS
.B slip
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
@@ -18,7 +18,7 @@ or from a random file on disk, as indicated by
the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
file; see
-.BR xscreensaver-demo (1)
+.BR xscreensaver\-settings (1)
for more details.
.SH OPTIONS
.I slip
@@ -69,8 +69,8 @@ stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1),
-.BR xscreensaver\-demo (1),
-.BR xscreensaver\-getimage (1)
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-getimage (MANSUFFIX)
.SH COPYRIGHT
Copyright \(co 1992 by Scott Draves.
diff --git a/hacks/speedmine.man b/hacks/speedmine.man
index c5ce919..c386a33 100644
--- a/hacks/speedmine.man
+++ b/hacks/speedmine.man
@@ -1,19 +1,6 @@
-.de EX \"Begin example
-.ne 5
-.if n .sp 1
-.if t .sp .5
-.nf
-.in +.5i
-..
-.de EE
-.fi
-.in -.5i
-.if n .sp 1
-.if t .sp .5
-..
.TH XScreenSaver 1 "23-Apr-01" "X Version 11"
.SH NAME
-speedmine - simulates speeding down a rocky mineshaft, or a funky dancing worm
+speedmine \- simulates speeding down a rocky mineshaft, or a funky dancing worm
.SH SYNOPSIS
.B speedmine
[\-display \fIhost:display.screen\fP] [\-root] [\-window]
@@ -200,31 +187,6 @@ grey road.
.TP 8
.B \-fps
Display the current frame rate and CPU load.
-.SH RESOURCES
-.EX
-Option Resource Default Value
------- -------- -------------
--wire .wire False
--background .background black
--foreground .foreground white
--darkground .darkground #101010
--lightground .lightground #a0a0a0
--tunnelend .tunnelend #000000
--delay .delay 30000
--maxspeed .maxspeed 700
--thrust .thrust 1.0
--gravity .gravity 9.8
--vertigo .vertigo 1.0
--terrain .terrain True
--smoothness .smoothness 6
--curviness .curviness 1.0
--twistiness .twistiness 1.0
--widening .widening True
--bumps .bumps True
--bonuses .bonuses True
--crosshair .crosshair False
--psychedelic .psychedelic False
-.EE
.SH WARNING
Speedworm is a trained professional. Do not try this at home.
diff --git a/hacks/sphere.man b/hacks/sphere.man
index d44c2fb..29d8e60 100644
--- a/hacks/sphere.man
+++ b/hacks/sphere.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "27-May-97" "X Version 11"
.SH NAME
-sphere - draws shaded spheres
+sphere \- draws shaded spheres
.SH SYNOPSIS
.B sphere
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP]
diff --git a/hacks/spiral.man b/hacks/spiral.man
index cf9eb6f..52b9eac 100644
--- a/hacks/spiral.man
+++ b/hacks/spiral.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "10-May-97" "X Version 11"
.SH NAME
-spiral - draws moving circular spiral patterns
+spiral \- draws moving circular spiral patterns
.SH SYNOPSIS
.B spiral
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-count \fIinteger\fP]
diff --git a/hacks/spotlight.c b/hacks/spotlight.c
index 7385899..c593550 100644
--- a/hacks/spotlight.c
+++ b/hacks/spotlight.c
@@ -192,7 +192,7 @@ spotlight_init (Display *dpy, Window window)
* perform one iteration
*/
static void
-onestep (struct state *st, Bool first_p)
+onestep (struct state *st)
{
long now;
unsigned long now_unsigned;
@@ -216,9 +216,6 @@ onestep (struct state *st, Bool first_p)
#define nrnd(x) (random() % (x))
- st->oldx = st->x;
- st->oldy = st->y;
-
st->s = st->radius *4 ; /* s = width of buffer */
now_unsigned = (unsigned long) currentTimeInMs(st) + st->off;
@@ -232,6 +229,9 @@ onestep (struct state *st, Bool first_p)
((1 + sin(((double)now) / Y_PERIOD * 2. * M_PI))/2.0)
* (st->geom.height - st->s/2) -st->s/4;
+ st->oldx = st->x;
+ st->oldy = st->y;
+
if (!st->first_p)
{
/* limit change in x and y to buffer width */
@@ -240,6 +240,10 @@ onestep (struct state *st, Bool first_p)
if ( st->y < (st->oldy - st->max_y_speed) ) st->y = st->oldy - st->max_y_speed;
if ( st->y > (st->oldy + st->max_y_speed) ) st->y = st->oldy + st->max_y_speed;
}
+ else
+ {
+ st->first_p = False;
+ }
if (! st->buffer)
{
@@ -286,8 +290,7 @@ static unsigned long
spotlight_draw (Display *dpy, Window window, void *closure)
{
struct state *st = (struct state *) closure;
- onestep(st, st->first_p);
- st->first_p = False;
+ onestep(st);
return st->delay;
}
diff --git a/hacks/spotlight.man b/hacks/spotlight.man
index 770a3e8..1f31486 100644
--- a/hacks/spotlight.man
+++ b/hacks/spotlight.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "05-Apr-1999" "X Version 11"
.SH NAME
-spotlight - move spotlight around desktop
+spotlight \- move spotlight around desktop
.SH SYNOPSIS
.B spotlight
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
@@ -20,7 +20,7 @@ or from a random file on disk, as indicated by
the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
file; see
-.BR xscreensaver-demo (1)
+.BR xscreensaver\-settings (1)
for more details.
.SH OPTIONS
.I spotlight
@@ -65,8 +65,8 @@ stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1),
-.BR xscreensaver\-demo (1),
-.BR xscreensaver\-getimage (1)
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-getimage (MANSUFFIX)
.SH COPYRIGHT
Copyright \(co 1999 by Rick Schultz. Permission to use, copy, modify,
distribute, and sell this software and its documentation for any purpose is
diff --git a/hacks/squiral.man b/hacks/squiral.man
index a34728b..73b1822 100644
--- a/hacks/squiral.man
+++ b/hacks/squiral.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "18-mar-1999" "X Version 11"
.SH NAME
-squiral - square spirals screensaver
+squiral \- square spirals screensaver
.SH SYNOPSIS
.B squiral
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
diff --git a/hacks/starfish.man b/hacks/starfish.man
index 306f66c..f62e0f8 100644
--- a/hacks/starfish.man
+++ b/hacks/starfish.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "14-Jun-97" "X Version 11"
.SH NAME
-starfish - radially-symmetric throbbing colormap-hacking graphics demo
+starfish \- radially-symmetric throbbing colormap-hacking graphics demo
.SH SYNOPSIS
.B starfish
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIusecs\fP] [\-delay2 \fIsecs\fP] [\-thickness \fIpixels\fP] [\-rotation \fIdegrees\fP] [\-duration \fIseconds\fP] [\-colors \fIint\fP] [\-blob] [\-no\-blob]
diff --git a/hacks/strange.man b/hacks/strange.man
index 625b659..1511f64 100644
--- a/hacks/strange.man
+++ b/hacks/strange.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "10-May-97" "X Version 11"
.SH NAME
-strange - draws strange attractors
+strange \- draws strange attractors
.SH SYNOPSIS
.B strange
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP]
diff --git a/hacks/substrate.man b/hacks/substrate.man
index 54de179..b0233b3 100644
--- a/hacks/substrate.man
+++ b/hacks/substrate.man
@@ -1,6 +1,6 @@
.TH Substrate 1 "08-Oct-04" "X Version 11"
.SH NAME
-substrate - Grow crystal-like lines on a computational substrate
+substrate \- Grow crystal-like lines on a computational substrate
.SH SYNOPSIS
.B substrate
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/swirl.man b/hacks/swirl.man
index decbaf0..2031f4d 100644
--- a/hacks/swirl.man
+++ b/hacks/swirl.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "13-May-97" "X Version 11"
.SH NAME
-swirl - draws swirly color-cycling patterns
+swirl \- draws swirly color-cycling patterns
.SH SYNOPSIS
.B swirl
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
diff --git a/hacks/tessellimage.c b/hacks/tessellimage.c
index 40c5b94..c518e83 100644
--- a/hacks/tessellimage.c
+++ b/hacks/tessellimage.c
@@ -17,9 +17,6 @@
# include <X11/keysymdef.h>
#endif
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
struct state {
Display *dpy;
Window window;
@@ -364,7 +361,7 @@ analyze (struct state *st)
for (x = 0; x < st->delta->width; x++)
{
unsigned long p = XGetPixel (st->delta, x, y);
- if (p > sizeof(histo)) abort();
+ if (p > countof(histo)) abort();
histo[p]++;
}
diff --git a/hacks/tessellimage.man b/hacks/tessellimage.man
index a0a928f..c5a05a7 100644
--- a/hacks/tessellimage.man
+++ b/hacks/tessellimage.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-tessellimage - Converts an image to triangles using Delaunay tessellation.
+tessellimage \- Converts an image to triangles using Delaunay tessellation.
.SH SYNOPSIS
.B tessellimage
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/testx11.c b/hacks/testx11.c
index cc21621..abcc1e0 100644
--- a/hacks/testx11.c
+++ b/hacks/testx11.c
@@ -33,8 +33,6 @@
# define jwxyz_assert_display(dpy)
#endif
-#define countof(a) (sizeof(a) / sizeof(*(a)))
-
static const char *testx11_defaults [] = {
".background: #a020f0", /* purple */
".foreground: white",
@@ -808,6 +806,7 @@ testx11_draw (Display *dpy, Window win, void *st_raw)
/* X.org isn't making a whole lot of sense here. */
+ {
Bool use_copy = (st->frame / 20) & 1;
{
@@ -842,7 +841,7 @@ testx11_draw (Display *dpy, Window win, void *st_raw)
*/
XCopyArea (st->dpy, st->copy_pix64, t, gc, 32, 32, 128, 64, 0, h - 64);
}
-
+ }
break;
case mode_preserve:
diff --git a/hacks/thornbird.man b/hacks/thornbird.man
index e063b1a..bef827e 100644
--- a/hacks/thornbird.man
+++ b/hacks/thornbird.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-thornbird - Bird in a Thornbush fractal.
+thornbird \- Bird in a Thornbush fractal.
.SH SYNOPSIS
.B thornbird
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/triangle.man b/hacks/triangle.man
index ec8eadc..b7658b2 100644
--- a/hacks/triangle.man
+++ b/hacks/triangle.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-triangle - random mountains using iterative subdivision of triangles.
+triangle \- random mountains using iterative subdivision of triangles.
.SH SYNOPSIS
.B triangle
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/truchet.man b/hacks/truchet.man
index 33890e6..f9388c2 100644
--- a/hacks/truchet.man
+++ b/hacks/truchet.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "27-May-97" "X Version 11"
.SH NAME
-truchet - draws curved or angular Truchet patterns
+truchet \- draws curved or angular Truchet patterns
.SH SYNOPSIS
.B truchet
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP]
diff --git a/hacks/twang.man b/hacks/twang.man
index 3e6b06a..ac71635 100644
--- a/hacks/twang.man
+++ b/hacks/twang.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "07-Feb-2002" "X Version 11"
.SH NAME
-twang - pluck pieces of the screen
+twang \- pluck pieces of the screen
.SH SYNOPSIS
.B twang
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/vermiculate.c b/hacks/vermiculate.c
index 0accbd9..0e17dc1 100644
--- a/hacks/vermiculate.c
+++ b/hacks/vermiculate.c
@@ -13,13 +13,10 @@
* implied warranty.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include "screenhack.h"
#include <ctype.h>
#include <math.h>
-#include "screenhack.h"
#define degs 360
#define degs2 (degs/2)
diff --git a/hacks/vermiculate.man b/hacks/vermiculate.man
index cbb9077..f8fe3ba 100644
--- a/hacks/vermiculate.man
+++ b/hacks/vermiculate.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-vermiculate - to move in a worm-like manner.
+vermiculate \- to move in a worm-like manner.
.SH SYNOPSIS
.B vermiculate
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/vfeedback.c b/hacks/vfeedback.c
index a2f32a0..107bfe5 100644
--- a/hacks/vfeedback.c
+++ b/hacks/vfeedback.c
@@ -23,10 +23,6 @@
* for that Amiga Genlock, Cabaret Voltaire look.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
-
#include "screenhack.h"
#include "analogtv.h"
@@ -40,11 +36,6 @@
# include "images/gen/testcard_bbcf_png.h"
#endif
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-
struct state {
Display *dpy;
Window window;
diff --git a/hacks/vfeedback.man b/hacks/vfeedback.man
index d58fe06..b277b78 100644
--- a/hacks/vfeedback.man
+++ b/hacks/vfeedback.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-vfeedback - Simulates video feedback.
+vfeedback \- Simulates video feedback.
.SH SYNOPSIS
.B vfeedback
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/vidwhacker b/hacks/vidwhacker
index 9646f6b..402e2c7 100755
--- a/hacks/vidwhacker
+++ b/hacks/vidwhacker
@@ -1,5 +1,5 @@
#!/usr/bin/perl -w
-# vidwhacker, for xscreensaver. Copyright (c) 1998-2011 Jamie Zawinski.
+# vidwhacker, for xscreensaver. Copyright (c) 1998-2020 Jamie Zawinski.
#
# Permission to use, copy, modify, distribute, and sell this software and its
# documentation for any purpose is hereby granted without fee, provided that
@@ -21,7 +21,7 @@ use diagnostics;
use strict;
my $progname = $0; $progname =~ s@.*/@@g;
-my ($version) = ('$Revision: 1.33 $' =~ m/\s(\d[.\d]+)\s/s);
+my ($version) = ('$Revision: 1.34 $' =~ m/\s(\d[.\d]+)\s/s);
my $verbose = 0;
my $use_stdin = 0;
@@ -315,52 +315,38 @@ sub get_ppm() {
if ($do_file_p) {
$cmd = "xscreensaver-getimage-file $v --name \"$imagedir\"";
} else {
- $cmd = "xscreensaver-getimage-video $v --stdout";
+ $cmd = "xscreensaver-getimage-video $v";
}
my $ppm;
- if ($do_file_p) {
+ print STDERR "$progname: running: $cmd\n" if ($verbose > 1);
+ my $fn = `$cmd`;
+ $fn =~ s/\n$//s;
+ error ("didn't get a file?") if ($fn eq "");
+ $fn = "$imagedir/$fn" unless ($fn =~ m@^/@s);
+
+ print STDERR "$progname: selected file $fn\n" if ($verbose > 1);
+
+ if ($fn =~ m/\.gif/i) { $cmd = "giftopnm < \"$fn\""; }
+ elsif ($fn =~ m/\.jpe?g/i) { $cmd = "exiftran -o /dev/stdout -a \"$fn\" | djpeg"; }
+ elsif ($fn =~ m/\.png/i) { $cmd = "pngtopnm < \"$fn\""; }
+ elsif ($fn =~ m/\.xpm/i) { $cmd = "xpmtoppm < \"$fn\""; }
+ elsif ($fn =~ m/\.bmp/i) { $cmd = "bmptoppm < \"$fn\""; }
+ elsif ($fn =~ m/\.tiff?/i) { $cmd = "tifftopnm < \"$fn\""; }
+ elsif ($fn =~ m/\.p[bgp]m/i) { $cmd = "cat \"$fn\""; }
+ else {
+ print STDERR "$progname: $fn: unrecognized file extension\n";
+ # go around the loop and get another
+ return undef;
+ }
- print STDERR "$progname: running: $cmd\n" if ($verbose > 1);
- my $fn = `$cmd`;
- $fn =~ s/\n$//s;
- error ("didn't get a file?") if ($fn eq "");
- $fn = "$imagedir/$fn" unless ($fn =~ m@^/@s);
-
- print STDERR "$progname: selected file $fn\n" if ($verbose > 1);
-
- if ($fn =~ m/\.gif/i) { $cmd = "giftopnm < \"$fn\""; }
- elsif ($fn =~ m/\.jpe?g/i) { $cmd = "djpeg < \"$fn\""; }
- elsif ($fn =~ m/\.png/i) { $cmd = "pngtopnm < \"$fn\""; }
- elsif ($fn =~ m/\.xpm/i) { $cmd = "xpmtoppm < \"$fn\""; }
- elsif ($fn =~ m/\.bmp/i) { $cmd = "bmptoppm < \"$fn\""; }
- elsif ($fn =~ m/\.tiff?/i) { $cmd = "tifftopnm < \"$fn\""; }
- elsif ($fn =~ m/\.p[bgp]m/i) { return `cat \"$fn\"`; }
- else {
- print STDERR "$progname: $fn: unrecognized file extension\n";
- # go around the loop and get another
- return undef;
- }
-
- print STDERR "$progname: converting with: $cmd\n" if ($verbose > 1);
- $cmd .= " 2>/dev/null" unless ($verbose > 1);
- $ppm = `$cmd`;
+ print STDERR "$progname: converting with: $cmd\n" if ($verbose > 1);
+ $cmd .= " 2>/dev/null" unless ($verbose > 1);
+ $ppm = `$cmd`;
- } else {
+ unlink $fn if (!$do_file_p);
- print STDERR "$progname: running: $cmd\n" if ($verbose > 1);
- $ppm = `$cmd`;
- error ("no data?") if ($ppm eq "");
- error ("not a PPM file") unless ($ppm =~ m/^P\d\n/s);
-
- $_ = $ppm;
- my ($width, $height) = m/^P\d\n(\d+) (\d+)\n/s;
- error ("got a bogus PPM") unless ($width && $height);
- print STDERR "$progname: grabbed ${width}x$height PPM\n"
- if ($verbose > 1);
- $_ = 0;
- }
return $ppm;
}
@@ -420,13 +406,18 @@ sub vidwhack() {
my $err_count = 0;
while (!defined($ppm)) {
$ppm = get_ppm();
- $err_count++ if (!defined ($ppm));
+ if (!defined ($ppm)) {
+ $err_count++
+ } else {
+ $ppm = frob_ppm ($ppm);
+ undef $ppm if (defined ($ppm) && $ppm eq "");
+ $err_count++ if (!defined ($ppm));
+ };
error ("too many errors, too few images!")
if ($err_count > $max_err_count);
}
}
- $ppm = frob_ppm ($ppm);
dispose_ppm ($ppm);
$ppm = undef;
}
diff --git a/hacks/vidwhacker.man b/hacks/vidwhacker.man
index 8c2505b..3ebb64d 100644
--- a/hacks/vidwhacker.man
+++ b/hacks/vidwhacker.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "17-Jun-99" "X Version 11"
.SH NAME
-vidwhacker - grab images and apply random filters to them
+vidwhacker \- grab images and apply random filters to them
.SH SYNOPSIS
.B vidwhacker
[\-display \fIhost:display.screen\fP] [\-root] [\-verbose]
@@ -17,9 +17,9 @@ It depends heavily on the various PBM tools (e.g.,
.BR ppmrelief (1).)
Selection of random image files is done by running the
-.BR xscreensaver-getimage-file (1)
+.BR xscreensaver\-getimage\-file (MANSUFFIX)
program. Capture of video frames (if requested) is done by running the
-.BR xscreensaver-getimage-video (1)
+.BR xscreensaver\-getimage\-video (MANSUFFIX)
program. The options of whether to do video, and which directory to
search for images, are specified in the \fI~/.xscreensaver\fP file.
.SH OPTIONS
@@ -72,8 +72,8 @@ but there would be a wider variety of effects available.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1),
-.BR xscreensaver-getimage-file (1),
-.BR xscreensaver-getimage-video (1),
+.BR xscreensaver\-getimage\-file (MANSUFFIX),
+.BR xscreensaver\-getimage\-video (MANSUFFIX),
.BR xv (1),
.BR ppmtogif (1),
.BR cjpeg (1)
diff --git a/hacks/vines.man b/hacks/vines.man
index 45e7985..426218d 100644
--- a/hacks/vines.man
+++ b/hacks/vines.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "10-May-97" "X Version 11"
.SH NAME
-vines - draws pseudo-fractal geometric patterns
+vines \- draws pseudo-fractal geometric patterns
.SH SYNOPSIS
.B vines
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP]
diff --git a/hacks/wander.man b/hacks/wander.man
index 497d35e..e473d02 100644
--- a/hacks/wander.man
+++ b/hacks/wander.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-wander - colorful random-walk.
+wander \- colorful random-walk.
.SH SYNOPSIS
.B wander
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/webcollage-cocoa.m b/hacks/webcollage-cocoa.m
index e8bc2b2..6e05dd6 100644
--- a/hacks/webcollage-cocoa.m
+++ b/hacks/webcollage-cocoa.m
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2006-2015 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2006-2020 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -125,7 +125,7 @@ open_pipe (state *st)
char *filter = get_string_resource (st->dpy, "filter", "Filter");
char *filter2 = get_string_resource (st->dpy, "filter2", "Filter2");
- av[ac++] = strdup ("webcollage");
+ av[ac++] = strdup ("webcollage.pl");
av[ac++] = strdup ("-cocoa");
av[ac++] = strdup ("-size");
diff --git a/hacks/webcollage-helper.c b/hacks/webcollage-helper.c
index 46ec608..ade45a4 100644
--- a/hacks/webcollage-helper.c
+++ b/hacks/webcollage-helper.c
@@ -1,5 +1,5 @@
/* webcollage-helper --- scales and pastes one image into another
- * xscreensaver, Copyright (c) 2002-2017 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 2002-2020 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -28,10 +28,20 @@
#include <sys/types.h>
#include <sys/stat.h>
+# if (__GNUC__ >= 4) /* Ignore useless warnings generated by GTK headers */
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wlong-long"
+# pragma GCC diagnostic ignored "-Wvariadic-macros"
+# pragma GCC diagnostic ignored "-Wpedantic"
+# endif
+
#undef HAVE_STDLIB_H /* stupid jconfig.h! */
#include <jpeglib.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
+# if (__GNUC__ >= 4)
+# pragma GCC diagnostic pop
+# endif
char *progname;
static int verbose_p = 0;
@@ -529,6 +539,8 @@ main (int argc, char **argv)
s = strrchr (progname, '/');
if (s) progname = s+1;
+ if (argc < 2) usage();
+
if (!strcmp(argv[i], "-v"))
verbose_p++, i++;
diff --git a/hacks/webcollage.man b/hacks/webcollage.man
index 82bf5d7..efb4c33 100644
--- a/hacks/webcollage.man
+++ b/hacks/webcollage.man
@@ -1,19 +1,6 @@
-.de EX \"Begin example
-.ne 5
-.if n .sp 1
-.if t .sp .5
-.nf
-.in +.5i
-..
-.de EE
-.fi
-.in -.5i
-.if n .sp 1
-.if t .sp .5
-..
.TH XScreenSaver 1 "17-Jun-99" "X Version 11"
.SH NAME
-webcollage - decorate the screen with random images from the web
+webcollage \- decorate the screen with random images from the web
.SH SYNOPSIS
.B webcollage
[\-display \fIhost:display.screen\fP]
@@ -63,7 +50,7 @@ produced: drawing to a window other than the root window is not yet
supported.
Images are placed on the root window by using one of the
-.BR xscreensaver-getimage (1),
+.BR xscreensaver\-getimage (MANSUFFIX),
.BR chbg (1),
.BR xv (1),
.BR xli (1),
@@ -73,7 +60,7 @@ programs (whichever is available.)
.TP 8
.B \-window\-id \fIid\fP
Draw to the indicated window instead; this only works if the
-.BR xscreensaver-getimage (1)
+.BR xscreensaver\-getimage (MANSUFFIX)
program is installed.
.TP 8
.B \-verbose \fRor\fP \-v
@@ -127,9 +114,11 @@ were found (just like \fIhttps://www.jwz.org/webcollage/\fP.)
Filter all source images through this command. The command must take
a PPM file on stdin, and write a new PPM file to stdout. One good
choice for a filter would be:
-.EX
-webcollage -root -filter 'vidwhacker -stdin -stdout'
-.EE
+.nf
+.sp
+ webcollage -root -filter 'vidwhacker -stdin -stdout'
+.sp
+.fi
.TP 8
.B \-filter2 \fIcommand\fP
Filter the \fIcomposite\fP image through this command. The \fI-filter\fP
@@ -153,20 +142,24 @@ as you might be hoping.
.TP 8
.B \-driftnet \fI[ args ]\fP
.BR driftnet (1)
-is a program that snoops your local ethernet for packets that look
-like they might be image files. It can be used in conjunction
+is a program that snoops your local ethernet for unencrypted packets
+that look like they might be image files. It can be used in conjunction
with \fIwebcollage\fP to generate a collage of what other people on
your network are looking at, instead of a search-engine collage.
If you have \fIdriftnet\fP installed on your $PATH, just use
the \fI\-driftnet\fP option. You can also specify the location
of the program like this:
-.EX
--driftnet /path/to/driftnet
-.EE
+.nf
+.sp
+ -driftnet /path/to/driftnet
+.sp
+.fi
or, you can provide extra arguments like this:
-.EX
--driftnet '/path/to/driftnet -extra -args'
-.EE
+.nf
+.sp
+ -driftnet '/path/to/driftnet -extra -args'
+.sp
+.fi
Driftnet version 0.1.5 or later is required. Note that
the \fIdriftnet\fP program requires root access, so you'll have
to make \fIdriftnet\fP be setuid-root for this to work.
diff --git a/hacks/whirlwindwarp.man b/hacks/whirlwindwarp.man
index 8cd054f..26147e9 100644
--- a/hacks/whirlwindwarp.man
+++ b/hacks/whirlwindwarp.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "13-aug-92" "X Version 11"
.SH NAME
-whirlwindwarp - crazy moving stars
+whirlwindwarp \- crazy moving stars
.SH SYNOPSIS
.B whirlwindwarp
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-points \fIinteger\fP] [\-tails \fIinteger\fP]
diff --git a/hacks/worm.man b/hacks/worm.man
index d9698b5..bbb4ee1 100644
--- a/hacks/worm.man
+++ b/hacks/worm.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-worm - multicolored worms that crawl around the screen.
+worm \- multicolored worms that crawl around the screen.
.SH SYNOPSIS
.B worm
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/wormhole.man b/hacks/wormhole.man
index f3287fa..5a27d86 100644
--- a/hacks/wormhole.man
+++ b/hacks/wormhole.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "11-feb-04" "X Version 11"
.SH NAME
-wormhole - animation of flying through a wormhole
+wormhole \- animation of flying through a wormhole
.SH SYNOPSIS
.B wormhole
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/xanalogtv.c b/hacks/xanalogtv.c
index f3842dc..fe8e650 100644
--- a/hacks/xanalogtv.c
+++ b/hacks/xanalogtv.c
@@ -20,9 +20,9 @@
* so you see a ghostly, misaligned image.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
+#include "screenhack.h"
+#include "ximage-loader.h"
+#include "analogtv.h"
#include <math.h>
@@ -34,10 +34,6 @@
# include <X11/Intrinsic.h> /* for XtDatabase in hack_resources() */
#endif
-#include "screenhack.h"
-#include "ximage-loader.h"
-#include "analogtv.h"
-
#define USE_TEST_PATTERNS
#include "images/gen/logo-180_png.h"
@@ -381,6 +377,8 @@ static void load_station_images(struct state *st)
#endif
else if (img_file && *img_file) {
+ analogtv_input *input;
+
/* Load a single image file into every free channel. */
if (! ximage) {
int w, h;
@@ -389,7 +387,7 @@ static void load_station_images(struct state *st)
XFreePixmap (st->dpy, p);
}
- analogtv_input *input = st->stations[i];
+ input = st->stations[i];
analogtv_setup_sync(input, 1, (random()%20)==0);
analogtv_load_ximage (st->tv, input, ximage, 0, 0, 0, 0, 0);
analogtv_setup_teletext(input);
diff --git a/hacks/xanalogtv.man b/hacks/xanalogtv.man
index 79ac57b..656390c 100644
--- a/hacks/xanalogtv.man
+++ b/hacks/xanalogtv.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "10-Oct-03" "X Version 11"
.SH NAME
-xanalogtv - Simulate reception on an old analog TV set
+xanalogtv \- Simulate reception on an old analog TV set
.SH SYNOPSIS
.B xanalogtv
[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
@@ -21,7 +21,7 @@ underlying the window, or from the system's video input, or from a
random file on disk, as indicated by the \fIgrabDesktopImages\fP,
\fIgrabVideoFrames\fP, and \fIchooseRandomImages\fP options in the
\fI~/.xscreensaver\fP file; see
-.BR xscreensaver-demo (1)
+.BR xscreensaver\-settings (1)
for more details. It looks best with a video input or
your digital photo collection.
.PP
@@ -70,8 +70,8 @@ between -180 and +180.
.BR apple2 (MANSUFFIX),
.BR bsod (MANSUFFIX),
.BR xscreensaver (1),
-.BR xscreensaver\-demo (1),
-.BR xscreensaver\-getimage (1)
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-getimage (MANSUFFIX)
.SH COPYRIGHT
Copyright \(co 2003 by Trevor Blackwell. Permission to use, copy, modify,
distribute, and sell this software and its documentation for any purpose is
diff --git a/hacks/xflame.c b/hacks/xflame.c
index d2273b1..e582492 100644
--- a/hacks/xflame.c
+++ b/hacks/xflame.c
@@ -52,9 +52,6 @@
#include "ximage-loader.h"
#include <limits.h>
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
# undef MAX
# undef MIN
# define MAX(A,B) ((A)>(B)?(A):(B))
diff --git a/hacks/xflame.man b/hacks/xflame.man
index faba0af..d20523e 100644
--- a/hacks/xflame.man
+++ b/hacks/xflame.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "27-Feb-00" "X Version 11"
.SH NAME
-xflame - draws animated flames
+xflame \- draws animated flames
.SH SYNOPSIS
.B xflame
[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
diff --git a/hacks/ximage-loader.c b/hacks/ximage-loader.c
index cb86ab3..04f0315 100644
--- a/hacks/ximage-loader.c
+++ b/hacks/ximage-loader.c
@@ -1,5 +1,5 @@
/* ximage-loader.c --- converts image files or data to XImages or Pixmap.
- * xscreensaver, Copyright (c) 1998-2018 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1998-2020 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -10,23 +10,13 @@
* implied warranty.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include "screenhackI.h"
+#include "ximage-loader.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
-#ifdef HAVE_JWXYZ
-# include "jwxyz.h"
-#else
-# include <X11/Xlib.h>
-# include <X11/Xutil.h>
-#endif
-
-#include "ximage-loader.h"
-
#if defined(HAVE_GDK_PIXBUF) || defined(HAVE_COCOA) || defined(HAVE_ANDROID)
# undef HAVE_LIBPNG
#endif
@@ -36,12 +26,25 @@
#endif
#ifdef HAVE_GDK_PIXBUF
+
+# if (__GNUC__ >= 4) /* Ignore useless warnings generated by GTK headers */
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wlong-long"
+# pragma GCC diagnostic ignored "-Wvariadic-macros"
+# pragma GCC diagnostic ignored "-Wpedantic"
+# endif
+
# include <gdk-pixbuf/gdk-pixbuf.h>
# ifdef HAVE_GTK2
# include <gdk-pixbuf-xlib/gdk-pixbuf-xlib.h>
# else /* !HAVE_GTK2 */
# include <gdk-pixbuf/gdk-pixbuf-xlib.h>
# endif /* !HAVE_GTK2 */
+
+# if (__GNUC__ >= 4)
+# pragma GCC diagnostic pop
+# endif
+
#endif /* HAVE_GDK_PIXBUF */
#ifdef HAVE_LIBPNG
@@ -55,8 +58,6 @@ extern void Log(const char *format, ...);
# define fprintf(S, ...) Log(__VA_ARGS__)
#endif
-extern char *progname;
-
static Bool
bigendian (void)
{
@@ -303,6 +304,8 @@ make_ximage (Display *dpy, Visual *visual,
png_uint_32 width, height, channels;
int bit_depth, color_type, interlace_type;
FILE *fp = 0;
+ /* Must be at top or it goes out of scope in the setjmp! */
+ png_read_closure closure;
png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, 0, 0, 0);
if (!png_ptr) return 0;
@@ -339,7 +342,6 @@ make_ximage (Display *dpy, Visual *visual,
}
else
{
- png_read_closure closure;
closure.buf = image_data;
closure.siz = data_size;
closure.ptr = 0;
@@ -529,7 +531,7 @@ make_pixmap (Display *dpy, Window window,
unsigned long srsiz=0, sgsiz=0, sbsiz=0;
# ifdef HAVE_JWXYZ
- // BlackPixel has alpha: 0xFF000000.
+ /* BlackPixel has alpha: 0xFF000000. */
unsigned long black = BlackPixelOfScreen (DefaultScreenOfDisplay (dpy));
#else
unsigned long black = 0;
diff --git a/hacks/xjack.c b/hacks/xjack.c
index 5feedb2..b9cce19 100644
--- a/hacks/xjack.c
+++ b/hacks/xjack.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1997-2013 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 1997-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -28,7 +28,9 @@ struct state {
Display *dpy;
Window window;
XWindowAttributes xgwa;
- XFontStruct *font;
+ XftFont *font;
+ XftColor xft_fg;
+ XftDraw *xftdraw;
GC gc;
const char *s;
@@ -82,8 +84,7 @@ xjack_init (Display *dpy, Window window)
{
struct state *st = (struct state *) calloc (1, sizeof(*st));
XGCValues gcv;
- char *fontname;
-
+ char *fontname, *s;
st->dpy = dpy;
st->window = window;
@@ -97,23 +98,31 @@ xjack_init (Display *dpy, Window window)
else
fontname = get_string_resource (st->dpy, "font2", "Font");
- st->font = load_font_retry (st->dpy, fontname);
+ st->font = load_xft_font_retry (st->dpy, screen_number (st->xgwa.screen),
+ fontname);
if (!st->font) abort();
if (fontname) free (fontname);
- gcv.font = st->font->fid;
gcv.foreground = get_pixel_resource (st->dpy, st->xgwa.colormap,
"foreground", "Foreground");
gcv.background = get_pixel_resource (st->dpy, st->xgwa.colormap,
"background", "Background");
st->gc = XCreateGC (st->dpy, st->window,
- (GCFont | GCForeground | GCBackground), &gcv);
-
- st->char_width =
- (st->font->per_char
- ? st->font->per_char['n'-st->font->min_char_or_byte2].rbearing
- : st->font->min_bounds.rbearing);
- st->line_height = st->font->ascent + st->font->descent + 1;
+ (GCForeground | GCBackground), &gcv);
+ s = get_string_resource (st->dpy, "foreground", "Foreground");
+ if (!s) s = strdup("black");
+ XftColorAllocName (st->dpy, st->xgwa.visual, st->xgwa.colormap, s,
+ &st->xft_fg);
+ free (s);
+ st->xftdraw = XftDrawCreate (dpy, st->window, st->xgwa.visual,
+ st->xgwa.colormap);
+
+ {
+ XGlyphInfo overall;
+ XftTextExtentsUtf8 (st->dpy, st->font, (FcChar8 *) "N", 1, &overall);
+ st->char_width = overall.xOff;
+ st->line_height = st->font->ascent + st->font->descent + 1;
+ }
xjack_reshape (dpy, window, st, st->xgwa.width, st->xgwa.height);
@@ -185,11 +194,11 @@ xjack_pine (struct state *st)
if (prev)
while (*n2)
{
- XDrawString (st->dpy, st->window, st->gc,
- (st->x * st->char_width) + st->hspace,
- ((st->y * st->line_height) + st->vspace
- + st->font->ascent),
- (char *) n2, 1);
+ XftDrawStringUtf8 (st->xftdraw, &st->xft_fg, st->font,
+ (st->x * st->char_width) + st->hspace,
+ ((st->y * st->line_height) + st->vspace
+ + st->font->ascent),
+ (FcChar8 *) n2, 1);
st->x++;
if (st->x >= st->columns) st->x = 0, st->y++;
n2++;
@@ -201,11 +210,11 @@ xjack_pine (struct state *st)
if (st->pining)
while (*n1)
{
- XDrawString (st->dpy, st->window, st->gc,
- (st->x * st->char_width) + st->hspace,
- ((st->y * st->line_height) + st->vspace
- + st->font->ascent),
- (char *) n1, 1);
+ XftDrawStringUtf8 (st->xftdraw, &st->xft_fg, st->font,
+ (st->x * st->char_width) + st->hspace,
+ ((st->y * st->line_height) + st->vspace
+ + st->font->ascent),
+ (FcChar8 *) n1, 1);
st->x++;
if (st->x >= st->columns) st->x = 0, st->y++;
n1++;
@@ -333,11 +342,12 @@ xjack_draw (Display *dpy, Window window, void *closure)
}
OVERSTRIKE:
- XDrawString (st->dpy, st->window, st->gc,
- (st->x * st->char_width) + st->hspace + xshift,
- ((st->y * st->line_height) + st->vspace + st->font->ascent
- + yshift),
- &c, 1);
+ XftDrawStringUtf8 (st->xftdraw, &st->xft_fg, st->font,
+ (st->x * st->char_width) + st->hspace + xshift,
+ ((st->y * st->line_height) + st->vspace +
+ st->font->ascent
+ + yshift),
+ (FcChar8 *) &c, 1);
if (xshift == 0 && yshift == 0 && (0 == (random() & 3000)))
{
if (random() & 1)
@@ -354,8 +364,8 @@ xjack_draw (Display *dpy, Window window, void *closure)
st->x--;
st->s--;
if (st->delay)
- st->delay += (0xFFFF & (st->delay +
- (random() % (st->delay * 10))));
+ this_delay += (0xFFFF & (st->delay +
+ (random() % (st->delay * 10))));
}
}
@@ -465,7 +475,8 @@ xjack_free (Display *dpy, Window window, void *closure)
{
struct state *st = (struct state *) closure;
XFreeGC (dpy, st->gc);
- XFreeFont (dpy, st->font);
+ XftFontClose (dpy, st->font);
+ XftDrawDestroy (st->xftdraw);
free (st);
}
@@ -474,13 +485,9 @@ static const char *xjack_defaults [] = {
".background: #FFF0B4",
".foreground: #000000",
"*fpsSolid: true",
-#ifdef HAVE_COCOA
- ".font: American Typewriter 24",
- ".font2: American Typewriter 10",
-#else
- ".font: -*-courier-medium-r-*-*-*-240-*-*-m-*-*-*",
- ".font2: -*-courier-medium-r-*-*-*-180-*-*-m-*-*-*",
-#endif
+ "*fpsTop: true",
+ ".font: Special Elite 24, American Typewriter 24, Courier 24, monospace 24",
+ ".font2: Special Elite 12, American Typewriter 12, Courier 12, monospace 12",
"*delay: 50000",
0
};
diff --git a/hacks/xjack.man b/hacks/xjack.man
index 894f9ea..cfe4da8 100644
--- a/hacks/xjack.man
+++ b/hacks/xjack.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "18-sep-97" "X Version 11"
.SH NAME
-xjack - all work and no play makes jack a dull boy
+xjack \- all work and no play makes jack a dull boy
.SH SYNOPSIS
.B xjack
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-delay \fIusecs\fP]
diff --git a/hacks/xlockmore.c b/hacks/xlockmore.c
index 5ddf175..2b513dd 100644
--- a/hacks/xlockmore.c
+++ b/hacks/xlockmore.c
@@ -26,8 +26,6 @@
#include <assert.h>
#include <float.h>
-#define countof(x) (sizeof((x))/sizeof(*(x)))
-
#define MAX_COLORS (1L<<13)
extern struct xscreensaver_function_table *xscreensaver_function_table;
@@ -545,20 +543,6 @@ xlockmore_init (Display *dpy, Window window,
mi->pause = 0;
else if (mi->pause > 100000000)
mi->pause = 100000000;
-
- /* If this hack uses fonts (meaning, mentioned "font" in DEFAULTS)
- then load it. */
- {
- char *name = get_string_resource (dpy, "font", "Font");
- if (name)
- {
- XFontStruct *f = load_font_retry (dpy, name);
- if (!f) abort();
- XSetFont (dpy, mi->gc, f->fid);
- XFreeFont (dpy, f);
- free (name);
- }
- }
xlockmore_read_resources (mi);
@@ -579,6 +563,11 @@ xlockmore_clear (ModeInfo *mi)
static void
xlockmore_do_init (ModeInfo *mi)
{
+# ifdef HAVE_JWZGLES
+ if (mi->xlmft->jwzgles_make_current && mi->jwzgles_state)
+ mi->xlmft->jwzgles_make_current (mi->jwzgles_state);
+# endif
+
xlockmore_clear (mi);
mi->xlmft->hack_init (mi);
@@ -615,6 +604,11 @@ xlockmore_draw (Display *dpy, Window window, void *closure)
unsigned long orig_pause = mi->pause;
unsigned long this_pause;
+# ifdef HAVE_JWZGLES
+ if (mi->xlmft->jwzgles_make_current && mi->jwzgles_state)
+ mi->xlmft->jwzgles_make_current (mi->jwzgles_state);
+# endif
+
if (mi->needs_clear) {
/* OpenGL hacks never get here. */
if (!mi->is_drawn) {
@@ -677,6 +671,12 @@ static Bool
xlockmore_event (Display *dpy, Window window, void *closure, XEvent *event)
{
ModeInfo *mi = (ModeInfo *) closure;
+
+# ifdef HAVE_JWZGLES
+ if (mi->xlmft->jwzgles_make_current && mi->jwzgles_state)
+ mi->xlmft->jwzgles_make_current (mi->jwzgles_state);
+# endif
+
if (mi) {
if (mi->xlmft->hack_handle_events) {
xlockmore_check_init (mi);
@@ -712,6 +712,11 @@ xlockmore_free (Display *dpy, Window window, void *closure)
{
ModeInfo *mi = (ModeInfo *) closure;
+# ifdef HAVE_JWZGLES
+ if (mi->xlmft->jwzgles_make_current && mi->jwzgles_state)
+ mi->xlmft->jwzgles_make_current (mi->jwzgles_state);
+# endif
+
if (mi->eraser)
eraser_free (mi->eraser);
@@ -736,6 +741,11 @@ xlockmore_free (Display *dpy, Window window, void *closure)
free (mi->colors);
free (mi->pixels);
+# ifdef HAVE_JWZGLES
+ if (mi->xlmft->jwzgles_free)
+ mi->xlmft->jwzgles_free();
+# endif /* HAVE_JWZGLES */
+
free (mi);
}
diff --git a/hacks/xlockmore.h b/hacks/xlockmore.h
index bbb7f84..858f6ec 100644
--- a/hacks/xlockmore.h
+++ b/hacks/xlockmore.h
@@ -1,5 +1,5 @@
/* xlockmore.h --- xscreensaver compatibility layer for xlockmore modules.
- * xscreensaver, Copyright (c) 1997-2018 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1997-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -16,10 +16,6 @@
* to redo it, since xlockmore has diverged so far from xlock...)
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif /* HAVE_CONFIG_H */
-
#ifndef __STDC__
ERROR! Sorry, xlockmore.h requires ANSI C (gcc, for example.)
/* (The ansi dependency is that we use string concatenation,
@@ -239,7 +235,8 @@ ERROR! Sorry, xlockmore.h requires ANSI C (gcc, for example.)
release_ ## PREFIX, \
free_ ## PREFIX, \
PREFIX ## _handle_event, \
- & PREFIX ## _opts \
+ & PREFIX ## _opts, \
+ 0, \
}; \
\
struct xscreensaver_function_table \
diff --git a/hacks/xlockmoreI.h b/hacks/xlockmoreI.h
index 440d39a..3892e58 100644
--- a/hacks/xlockmoreI.h
+++ b/hacks/xlockmoreI.h
@@ -1,5 +1,5 @@
/* xlockmore.h --- xscreensaver compatibility layer for xlockmore modules.
- * xscreensaver, Copyright (c) 1997-2017 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1997-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -23,41 +23,40 @@
typedef struct ModeInfo ModeInfo;
-#ifdef HAVE_GL
-
-/* I'm told that the Sun version of OpenGL needs to have the constant
- SUN_OGL_NO_VERTEX_MACROS defined in order for morph3d to compile
- (the number of arguments to the glNormal3f macro changes...)
- Verified with gcc 2.7.2.2 and Sun cc 4.2 with OpenGL 1.1.1 dev 4
- on Solaris 2.5.1.
+/* Keep slots for these pointers in ModeInfo even if this header is
+ included in a file that is not being compiled in GL-mode. so that
+ sizeof(ModeInfo) doesn't vary.
*/
-# ifndef HAVE_MESA_GL
-# if defined(__sun) && defined(__SVR4) /* Solaris */
-# define SUN_OGL_NO_VERTEX_MACROS 1
-# endif /* Solaris */
-# endif /* !HAVE_MESA_GL */
-
-# ifdef HAVE_COCOA
-# ifndef USE_IPHONE
-# include <OpenGL/gl.h>
-# include <OpenGL/glu.h>
-# endif
-# elif defined(HAVE_ANDROID)
-# include <GLES/gl.h>
-# else
-# include <GL/gl.h>
-# include <GL/glu.h>
-# include <GL/glx.h>
+#if defined(HAVE_GL) && !defined(USE_GL)
+# ifdef HAVE_JWZGLES
+ typedef struct jwzgles_state jwzgles_state;
# endif
+# ifdef HAVE_EGL
+ typedef struct egl_data egl_data;
+# elif !defined(HAVE_COCOA) && !defined(HAVE_ANDROID)
+ typedef void *GLXContext;
+# endif
+#endif /* HAVE_GL && !USE_GL */
-# ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-# endif /* HAVE_JWZGLES */
-#endif /* HAVE_GL */
+#ifdef HAVE_EGL
+ typedef struct egl_data *GLXContext;
+ typedef Drawable GLXDrawable;
+#endif /* !HAVE_EGL */
+#if defined(HAVE_EGL) && defined(USE_GL)
+ typedef struct egl_data {
+ EGLDisplay egl_display;
+ EGLSurface egl_surface;
+ EGLContext egl_context; /* Unused */
+ EGLConfig egl_config; /* Unused */
+ } egl_data;
-#ifdef USE_GL
+ extern Bool glXMakeCurrent (Display *, GLXDrawable, GLXContext);
+ extern void glXSwapBuffers (Display *, GLXDrawable);
+#endif /* HAVE_EGL && USE_GL */
+
+#ifdef USE_GL
extern GLXContext *init_GL (ModeInfo *);
extern void xlockmore_reset_gl_state(void);
extern void clear_gl_error (void);
@@ -65,9 +64,9 @@ typedef struct ModeInfo ModeInfo;
extern Visual *xlockmore_pick_gl_visual (Screen *);
extern Bool xlockmore_validate_gl_visual (Screen *, const char *, Visual *);
-
#endif /* USE_GL */
+
/* These are only used in GL mode, but I don't understand why XCode
isn't seeing the prototypes for them in glx/fps-gl.c... */
extern void do_fps (ModeInfo *);
@@ -82,7 +81,6 @@ extern void xlockmore_do_fps (Display *, Window, fps_state *, void *);
extern void xlockmore_mi_init (ModeInfo *, size_t, void **);
extern Bool xlockmore_no_events (ModeInfo *, XEvent *);
-
/* The xlockmore RNG API is implemented in utils/yarandom.h. */
@@ -121,9 +119,15 @@ struct ModeInfo {
Bool fps_p;
unsigned long polygon_count; /* These values are for -fps display only */
double recursion_depth;
-#if !defined HAVE_JWXYZ && defined HAVE_GL
- GLXContext glx_context;
-#endif
+
+# ifdef HAVE_GL
+# ifndef HAVE_JWXYZ
+ GLXContext glx_context; /* or egl_data */
+# endif
+# ifdef HAVE_JWZGLES
+ jwzgles_state *jwzgles_state;
+# endif
+# endif /* HAVE_GL */
};
typedef enum { t_String, t_Float, t_Int, t_Bool } xlockmore_type;
@@ -164,6 +168,11 @@ struct xlockmore_function_table {
Bool (*hack_handle_events) (ModeInfo *, XEvent *);
ModeSpecOpt *opts;
+# ifdef HAVE_JWZGLES /* set in xlock-gl-utils.c */
+ void (*jwzgles_make_current) (jwzgles_state *);
+ void (*jwzgles_free) (void);
+# endif /* HAVE_JWZGLES */
+
void **state_array;
unsigned long live_displays, got_init;
};
diff --git a/hacks/xlyap.c b/hacks/xlyap.c
index 4b4ad0c..f9204de 100644
--- a/hacks/xlyap.c
+++ b/hacks/xlyap.c
@@ -40,9 +40,6 @@
#include "yarandom.h"
#include "hsv.h"
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
#ifndef HAVE_JWXYZ
# include <X11/cursorfont.h>
#endif
diff --git a/hacks/xmatrix.c b/hacks/xmatrix.c
index 70f6516..d6cff49 100644
--- a/hacks/xmatrix.c
+++ b/hacks/xmatrix.c
@@ -88,8 +88,6 @@ typedef struct {
int y;
} m_feeder;
-#define countof(x) (sizeof(x)/sizeof(*(x)))
-
static const int matrix_encoding[] = { 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
192, 193, 194, 195, 196, 197, 198, 199,
200, 201, 202, 203, 204, 205, 206, 207 };
@@ -187,6 +185,8 @@ typedef struct {
int back_pos; /* background line buffer position */
int back_y;
+ int left_margin, top_margin; /* Stupid iPhone bezel */
+
signed char *tracing;
int density;
@@ -1013,8 +1013,8 @@ redraw_cells (m_state *state, Bool active)
if (cell->glyph == 0 && !cursor_p && !use_back_p)
XFillRectangle (state->dpy, state->window, state->erase_gc,
- x * state->char_width,
- y * state->char_height,
+ (x + state->left_margin) * state->char_width,
+ (y + state->top_margin) * state->char_height,
state->char_width,
state->char_height);
else
@@ -1031,8 +1031,8 @@ redraw_cells (m_state *state, Bool active)
cy * state->char_height,
state->char_width,
state->char_height,
- x * state->char_width,
- y * state->char_height);
+ (x + state->left_margin) * state->char_width,
+ (y + state->top_margin) * state->char_height);
}
if (!use_back_p)
cell->changed = 0;
@@ -1132,6 +1132,9 @@ hack_text (m_state *state)
if (cy < 0) cy = 0;
if (cx < 0) cx = 0;
+ cx += state->left_margin;
+ cy += state->top_margin;
+
XFillRectangle (state->dpy, state->window, state->erase_gc,
cx * state->char_width,
cy * state->char_height,
@@ -1306,33 +1309,6 @@ hack_text (m_state *state)
state->typing_delay = state->typing_char_delay;
if (state->typing_cursor_p)
set_cursor (state, True);
-
-# ifdef USE_IPHONE
- /* Stupid iPhone X bezel.
- #### This is the worst of all possible ways to do this! But how else?
- */
- if (state->xgwa.width == 1218 || state->xgwa.height == 1218)
- switch (state->mode)
- {
- case TRACE_TEXT_A:
- case TRACE_TEXT_B:
- case KNOCK:
- case NMAP:
- {
- int off = 2 * (state->small_p ? 2 : 1);
- if (state->xgwa.width > state->xgwa.height)
- {
- state->typing_left_margin += off;
- state->cursor_x += off;
- }
- else
- {
- state->cursor_y += off;
- }
- }
- default: break;
- }
-# endif
}
else
{
@@ -1669,6 +1645,31 @@ xmatrix_reshape (Display *dpy, Window window, void *closure,
state->grid_height = state->xgwa.height / state->char_height;
state->grid_width++;
state->grid_height++;
+
+# ifdef HAVE_IPHONE
+ /* Stupid iPhone X bezel.
+ #### This is the worst of all possible ways to do this! But how else?
+ This magic number should catch iPhone X and larger, but unfortunately
+ also catches iPads which do not have the stupid bezel.
+ */
+ if (state->xgwa.width >= 1218 || state->xgwa.height >= 1218)
+ {
+ int margin = 3 * (state->small_p ? 2 : 1);
+ if (state->xgwa.width > state->xgwa.height)
+ {
+ state->left_margin = margin;
+ state->top_margin = 0;
+ state->grid_width -= margin;
+ }
+ else
+ {
+ state->left_margin = 0;
+ state->top_margin = margin;
+ state->grid_height -= margin;
+ }
+ }
+# endif /* HAVE_IPHONE */
+
if (state->grid_width < 5) state->grid_width = 5;
if (state->grid_height < 5) state->grid_height = 5;
@@ -1705,7 +1706,10 @@ xmatrix_reshape (Display *dpy, Window window, void *closure,
nfeeders[i] = state->feeders[i];
free (state->feeders);
state->feeders = nfeeders;
+
+ XClearWindow (dpy, window);
}
+
if (state->tc)
textclient_reshape (state->tc,
state->xgwa.width,
@@ -1825,7 +1829,7 @@ static const char *xmatrix_defaults [] = {
"*delay: 10000",
"*insert: both",
"*mode: Matrix",
- "*tracePhone: (312) 555-0690",
+ "*tracePhone: (415) 626-1409",
"*spinners: 5",
"*density: 75",
"*trace: True",
diff --git a/hacks/xmatrix.man b/hacks/xmatrix.man
index bdfed21..84d7b5d 100644
--- a/hacks/xmatrix.man
+++ b/hacks/xmatrix.man
@@ -1,19 +1,6 @@
-.de EX \"Begin example
-.ne 5
-.if n .sp 1
-.if t .sp .5
-.nf
-.in +.5i
-..
-.de EE
-.fi
-.in -.5i
-.if n .sp 1
-.if t .sp .5
-..
.TH XScreenSaver 1 "30-Oct-99" "X Version 11"
.SH NAME
-xmatrix - simulates the computer displays from the movie
+xmatrix \- simulates the computer displays from the movie
.SH SYNOPSIS
.B xmatrix
[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
@@ -115,12 +102,15 @@ exits, it will be launched again after xmatrix has processed all the
text it produced.
For example:
-.EX
-xmatrix -program 'echo Hello World'
-xmatrix -ascii -program 'ps -eo comm | rev'
-xmatrix -program 'od -txC -w6 /dev/random'
-xmatrix -program 'cat /dev/random'
-.EE
+
+.nf
+.sp
+ xmatrix -program 'echo Hello World'
+ xmatrix -ascii -program 'ps -eo comm | rev'
+ xmatrix -program 'od -txC -w6 /dev/random'
+ xmatrix -program 'cat /dev/random'
+.sp
+.fi
.SH ENVIRONMENT
.PP
.TP 8
diff --git a/hacks/xml2man.pl b/hacks/xml2man.pl
index d7d4e32..b3c0404 100755
--- a/hacks/xml2man.pl
+++ b/hacks/xml2man.pl
@@ -24,7 +24,7 @@ use strict;
use Text::Wrap;
my $progname = $0; $progname =~ s@.*/@@g;
-my ($version) = ('$Revision: 1.7 $' =~ m/\s(\d[.\d]+)\s/s);
+my ($version) = ('$Revision: 1.8 $' =~ m/\s(\d[.\d]+)\s/s);
my $verbose = 0;
@@ -208,7 +208,7 @@ sub xml2man($) {
$body = (".TH XScreenSaver 1 \"\" \"X Version 11\"\n" .
".SH NAME\n" .
- "$exe - screen saver.\n" .
+ "$exe \\- screen saver.\n" .
".SH SYNOPSIS\n" .
".B $exe\n" .
$default_args .
diff --git a/hacks/xrayswarm.c b/hacks/xrayswarm.c
index d14eb39..b406631 100644
--- a/hacks/xrayswarm.c
+++ b/hacks/xrayswarm.c
@@ -40,14 +40,10 @@ other dealings in this Software without prior written authorization
from the X Consortium.
*/
-#include <math.h>
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include "screenhack.h"
+#include <math.h>
#include <sys/time.h>
-#include "screenhack.h"
#ifdef HAVE_JWXYZ
# define HAVE_GETTIMEOFDAY 1
diff --git a/hacks/xrayswarm.man b/hacks/xrayswarm.man
index 1c10a59..86ae9a0 100644
--- a/hacks/xrayswarm.man
+++ b/hacks/xrayswarm.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "" "X Version 11"
.SH NAME
-xrayswarm - swarms with color trails.
+xrayswarm \- swarms with color trails.
.SH SYNOPSIS
.B xrayswarm
[\-display \fIhost:display.screen\fP]
diff --git a/hacks/xscreensaver-getimage-file b/hacks/xscreensaver-getimage-file
new file mode 100755
index 0000000..a22d001
--- /dev/null
+++ b/hacks/xscreensaver-getimage-file
@@ -0,0 +1,1342 @@
+#!/usr/bin/perl -w
+# Copyright © 2001-2020 Jamie Zawinski <jwz@jwz.org>.
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation. No representations are made about the suitability of this
+# software for any purpose. It is provided "as is" without express or
+# implied warranty.
+#
+# This program chooses a random file from under the given directory, and
+# prints its name. The file will be an image file whose dimensions are
+# larger than a certain minimum size.
+#
+# If the directory is a URL, it is assumed to be an RSS or Atom feed.
+# The images from that feed will be downloaded, cached, and selected from
+# at random. The feed will be re-polled periodically, as needed.
+#
+# The various xscreensaver hacks that manipulate images ("jigsaw", etc.) get
+# the image to manipulate by running the "xscreensaver-getimage" program.
+#
+# Under X11, the "xscreensaver-getimage" program invokes this script,
+# depending on the value of the "chooseRandomImages" and "imageDirectory"
+# settings in the ~/.xscreensaver file (or .../app-defaults/XScreenSaver).
+# The screen savers invoke "xscreensaver-getimage" via utils/grabclient.c,
+# which then invokes this script.
+#
+# Under Cocoa, this script lives inside the .saver bundle, and is invoked
+# directly from utils/grabclient.c.
+#
+# Created: 12-Apr-01.
+
+require 5;
+#use diagnostics; # Fails on some MacOS 10.5 systems
+use strict;
+
+use POSIX;
+use Fcntl;
+
+use Fcntl ':flock'; # import LOCK_* constants
+
+use POSIX ':fcntl_h'; # S_ISDIR was here in Perl 5.6
+import Fcntl ':mode' unless defined &S_ISUID; # but it is here in Perl 5.8
+ # but in Perl 5.10, both of these load, and cause errors!
+ # So we have to check for S_ISUID instead of S_ISDIR? WTF?
+
+use Digest::MD5 qw(md5_base64);
+
+# Some Linux systems don't install LWP by default!
+# Only error out if we're actually loading a URL instead of local data.
+BEGIN { eval 'use LWP::Simple;' }
+
+
+my $progname = $0; $progname =~ s@.*/@@g;
+my ($version) = ('$Revision: 1.57 $' =~ m/\s(\d[.\d]+)\s/s);
+
+my $verbose = 0;
+
+# Whether to use MacOS X's Spotlight to generate the list of files.
+# When set to -1, uses Spotlight if "mdfind" exists.
+#
+# (In my experience, this isn't actually any faster, and might not find
+# everything if your Spotlight index is out of date, which happens often.)
+#
+my $use_spotlight_p = 0;
+
+# Whether to cache the results of the last run.
+#
+my $cache_p = 1;
+
+# Regenerate the cache if it is older than this many seconds.
+#
+my $cache_max_age = 60 * 60 * 3; # 3 hours
+
+# Re-poll RSS/Atom feeds when local copy is older than this many seconds.
+#
+my $feed_max_age = $cache_max_age;
+
+
+# This matches files that we are allowed to use as images (case-insensitive.)
+# Anything not matching this is ignored. This is so you can point your
+# imageDirectory at directory trees that have things other than images in
+# them, but it assumes that you gave your images sensible file extensions.
+#
+my @good_extensions = ('jpg', 'jpeg', 'pjpeg', 'pjpg', 'png', 'gif',
+ 'tif', 'tiff', 'xbm', 'xpm', 'svg');
+my $good_file_re = '\.(' . join("|", @good_extensions) . ')$';
+
+# This matches file extensions that might occur in an image directory,
+# and that are never used in the name of a subdirectory. This is an
+# optimization that prevents us from having to stat() those files to
+# tell whether they are directories or not. (It speeds things up a
+# lot. Don't give your directories stupid names.)
+#
+my @nondir_extensions = ('ai', 'bmp', 'bz2', 'cr2', 'crw', 'db',
+ 'dmg', 'eps', 'gz', 'hqx', 'htm', 'html', 'icns', 'ilbm', 'mov',
+ 'nef', 'pbm', 'pdf', 'php', 'pl', 'ppm', 'ps', 'psd', 'sea', 'sh',
+ 'shtml', 'tar', 'tgz', 'thb', 'txt', 'xcf', 'xmp', 'Z', 'zip' );
+my $nondir_re = '\.(' . join("|", @nondir_extensions) . ')$';
+
+
+# JPEG, GIF, and PNG files that are are smaller than this are rejected:
+# this is so that you can use an image directory that contains both big
+# images and thumbnails, and have it only select the big versions.
+# But, if all of your images are smaller than this, all will be rejected.
+#
+my $min_image_width = 500;
+my $min_image_height = 500;
+
+my @all_files = (); # list of "good" files we've collected
+my %seen_inodes; # for breaking recursive symlink loops
+
+# For diagnostic messages:
+#
+my $dir_count = 1; # number of directories seen
+my $stat_count = 0; # number of files/dirs stat'ed
+my $skip_count_unstat = 0; # number of files skipped without stat'ing
+my $skip_count_stat = 0; # number of files skipped after stat
+
+my $config_file = $ENV{HOME} . "/.xscreensaver";
+my $image_directory = undef;
+
+
+sub find_all_files($);
+sub find_all_files($) {
+ my ($dir) = @_;
+
+ print STDERR "$progname: + reading dir $dir/...\n" if ($verbose > 1);
+
+ my $dd;
+ if (! opendir ($dd, $dir)) {
+ print STDERR "$progname: couldn't open $dir: $!\n" if ($verbose);
+ return;
+ }
+ my @files = readdir ($dd);
+ closedir ($dd);
+
+ my @dirs = ();
+
+ foreach my $file (@files) {
+ next if ($file =~ m/^\./); # silently ignore dot files/dirs
+
+ if ($file =~ m/[~%\#]$/) { # ignore backup files (and dirs...)
+ $skip_count_unstat++;
+ print STDERR "$progname: - skip file $file\n" if ($verbose > 1);
+ }
+
+ $file = "$dir/$file";
+
+ if ($file =~ m/$good_file_re/io) {
+ #
+ # Assume that files ending in .jpg exist and are not directories.
+ #
+ push @all_files, $file;
+ print STDERR "$progname: - found file $file\n" if ($verbose > 1);
+
+ } elsif ($file =~ m/$nondir_re/io) {
+ #
+ # Assume that files ending in .html are not directories.
+ #
+ $skip_count_unstat++;
+ print STDERR "$progname: -- skip file $file\n" if ($verbose > 1);
+
+ } else {
+ #
+ # Now we need to stat the file to see if it's a subdirectory.
+ #
+ # Note: we could use the trick of checking "nlinks" on the parent
+ # directory to see if this directory contains any subdirectories,
+ # but that would exclude any symlinks to directories.
+ #
+ my @st = stat($file);
+ my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+ $atime,$mtime,$ctime,$blksize,$blocks) = @st;
+
+ $stat_count++;
+
+ if ($#st == -1) {
+ if ($verbose) {
+ my $ll = readlink $file;
+ if (defined ($ll)) {
+ print STDERR "$progname: + dangling symlink: $file -> $ll\n";
+ } else {
+ print STDERR "$progname: + unreadable: $file\n";
+ }
+ }
+ next;
+ }
+
+ next if ($seen_inodes{"$dev:$ino"}); # break symlink loops
+ $seen_inodes{"$dev:$ino"} = 1;
+
+ if (S_ISDIR($mode)) {
+ push @dirs, $file;
+ $dir_count++;
+ print STDERR "$progname: + found dir $file\n" if ($verbose > 1);
+
+ } else {
+ $skip_count_stat++;
+ print STDERR "$progname: + skip file $file\n" if ($verbose > 1);
+ }
+ }
+ }
+
+ foreach (@dirs) {
+ find_all_files ($_);
+ }
+}
+
+
+sub spotlight_all_files($) {
+ my ($dir) = @_;
+
+ my @terms = ();
+ # "public.image" matches all (indexed) images, including Photoshop, etc.
+# push @terms, "kMDItemContentTypeTree == 'public.image'";
+ foreach (@good_extensions) {
+
+ # kMDItemFSName hits the file system every time: much worse than "find".
+# push @terms, "kMDItemFSName == '*.$_'";
+
+ # kMDItemDisplayName matches against the name in the Spotlight index,
+ # but won't find files that (for whatever reason) didn't get indexed.
+ push @terms, "kMDItemDisplayName == '*.$_'";
+ }
+
+ $dir =~ s@([^-_/a-z\d.,])@\\$1@gsi; # quote for sh
+ my $cmd = "mdfind -onlyin $dir \"" . join (' || ', @terms) . "\"";
+
+ print STDERR "$progname: executing: $cmd\n" if ($verbose > 1);
+ @all_files = split (/[\r\n]+/, `$cmd`);
+}
+
+
+# If we're using cacheing, read the cache file and return its contents,
+# if any. This also holds an exclusive lock on the cache file, which
+# has the additional benefit that if two copies of this program are
+# running at once, one will wait for the other, instead of both of
+# them spanking the same file system at the same time.
+#
+my $cache_fd = undef;
+my $cache_file_name = undef;
+my $read_cache_p = 0;
+
+sub read_cache($) {
+ my ($dir) = @_;
+
+ return () unless ($cache_p);
+
+ my $dd = "$ENV{HOME}/Library/Caches"; # MacOS location
+ if (-d $dd) {
+ $cache_file_name = "$dd/org.jwz.xscreensaver.getimage.cache";
+ } elsif (-d "$ENV{HOME}/.cache") { # Gnome "FreeDesktop XDG" location
+ $dd = "$ENV{HOME}/.cache/xscreensaver";
+ if (! -d $dd) { mkdir ($dd) || error ("mkdir $dd: $!"); }
+ $cache_file_name = "$dd/xscreensaver-getimage.cache"
+ } elsif (-d "$ENV{HOME}/tmp") { # If ~/tmp/ exists, use it.
+ $cache_file_name = "$ENV{HOME}/tmp/.xscreensaver-getimage.cache";
+ } else {
+ $cache_file_name = "$ENV{HOME}/.xscreensaver-getimage.cache";
+ }
+
+ print STDERR "$progname: awaiting lock: $cache_file_name\n"
+ if ($verbose > 1);
+
+ my $file = $cache_file_name;
+ open ($cache_fd, '+>>', $file) || error ("unable to write $file: $!");
+ flock ($cache_fd, LOCK_EX) || error ("unable to lock $file: $!");
+ seek ($cache_fd, 0, 0) || error ("unable to rewind $file: $!");
+
+ my $mtime = (stat($cache_fd))[9];
+
+ if ($mtime + $cache_max_age < time) {
+ print STDERR "$progname: cache is too old\n" if ($verbose);
+ return ();
+ }
+
+ my $odir = <$cache_fd>;
+ $odir =~ s/[\r\n]+$//s if defined ($odir);
+ if (!defined ($odir) || ($dir ne $odir)) {
+ print STDERR "$progname: cache is for $odir, not $dir\n"
+ if ($verbose && $odir);
+ return ();
+ }
+
+ my @files = ();
+ while (<$cache_fd>) {
+ s/[\r\n]+$//s;
+ push @files, "$odir/$_";
+ }
+
+ print STDERR "$progname: " . ($#files+1) . " files in cache\n"
+ if ($verbose);
+
+ $read_cache_p = 1;
+ return @files;
+}
+
+
+sub write_cache($) {
+ my ($dir) = @_;
+
+ return unless ($cache_p);
+
+ # If we read the cache, just close it without rewriting it.
+ # If we didn't read it, then write it now.
+
+ if (! $read_cache_p) {
+
+ truncate ($cache_fd, 0) ||
+ error ("unable to truncate $cache_file_name: $!");
+ seek ($cache_fd, 0, 0) ||
+ error ("unable to rewind $cache_file_name: $!");
+
+ if ($#all_files >= 0) {
+ print $cache_fd "$dir\n";
+ foreach (@all_files) {
+ my $f = $_; # stupid Perl. do this to avoid modifying @all_files!
+ $f =~ s@^\Q$dir/@@so || die; # remove $dir from front
+ print $cache_fd "$f\n";
+ }
+ }
+
+ print STDERR "$progname: cached " . ($#all_files+1) . " files\n"
+ if ($verbose);
+ }
+
+ flock ($cache_fd, LOCK_UN) ||
+ error ("unable to unlock $cache_file_name: $!");
+ close ($cache_fd);
+ $cache_fd = undef;
+}
+
+
+sub html_unquote($) {
+ my ($h) = @_;
+
+ # This only needs to handle entities that occur in RSS, not full HTML.
+ my %ent = ( 'amp' => '&', 'lt' => '<', 'gt' => '>',
+ 'quot' => '"', 'apos' => "'" );
+ $h =~ s/(&(\#)?([[:alpha:]\d]+);?)/
+ {
+ my ($o, $c) = ($1, $3);
+ if (! defined($2)) {
+ $c = $ent{$c}; # for &lt;
+ } else {
+ if ($c =~ m@^x([\dA-F]+)$@si) { # for &#x41;
+ $c = chr(hex($1));
+ } elsif ($c =~ m@^\d+$@si) { # for &#65;
+ $c = chr($c);
+ } else {
+ $c = undef;
+ }
+ }
+ ($c || $o);
+ }
+ /gexi;
+ return $h;
+}
+
+
+
+# Figure out what the proxy server should be, either from environment
+# variables or by parsing the output of the (MacOS) program "scutil",
+# which tells us what the system-wide proxy settings are.
+#
+sub set_proxy($) {
+ my ($ua) = @_;
+
+ my $proxy_data = `scutil --proxy 2>/dev/null`;
+ foreach my $proto ('http', 'https') {
+ my ($server) = ($proxy_data =~ m/\b${proto}Proxy\s*:\s*([^\s]+)/si);
+ my ($port) = ($proxy_data =~ m/\b${proto}Port\s*:\s*([^\s]+)/si);
+ my ($enable) = ($proxy_data =~ m/\b${proto}Enable\s*:\s*([^\s]+)/si);
+
+ if ($server && $enable) {
+ # Note: this ignores the "ExceptionsList".
+ my $proto2 = 'http';
+ $ENV{"${proto}_proxy"} = ("${proto2}://" . $server .
+ ($port ? ":$port" : "") . "/");
+ print STDERR "$progname: MacOS $proto proxy: " .
+ $ENV{"${proto}_proxy"} . "\n"
+ if ($verbose > 2);
+ }
+ }
+
+ $ua->env_proxy();
+}
+
+
+sub init_lwp() {
+ if (! defined ($LWP::Simple::ua)) {
+ error ("\n\n\tPerl is broken. Do this to repair it:\n" .
+ "\n\tsudo cpan LWP::Simple LWP::Protocol::https Mozilla::CA\n");
+ }
+ set_proxy ($LWP::Simple::ua);
+}
+
+
+sub sanity_check_lwp() {
+ my $url1 = 'https://www.mozilla.org/';
+ my $url2 = 'http://www.mozilla.org/';
+ my $body = (LWP::Simple::get($url1) || '');
+ if (length($body) < 10240) {
+ my $err = "";
+ $body = (LWP::Simple::get($url2) || '');
+ if (length($body) < 10240) {
+ $err = "Perl is broken: neither HTTP nor HTTPS URLs work.";
+ } else {
+ $err = "Perl is broken: HTTP URLs work but HTTPS URLs don't.";
+ }
+ $err .= "\nMaybe try: sudo cpan -f Mozilla::CA LWP::Protocol::https";
+ $err =~ s/^/\t/gm;
+ error ("\n\n$err\n");
+ }
+}
+
+
+# If the URL does not already end with an extension appropriate for the
+# content-type, add it after a "#" search.
+#
+# This is for when we know the content type of the URL, but the URL is
+# some crazy thing without an extension. The files on disk need to have
+# proper extensions.
+#
+sub force_extension($$) {
+ my ($url, $ct) = @_;
+ return $url unless (defined($url) && defined($ct));
+ my ($ext) = ($ct =~ m@^image/([-a-z\d]+)@si);
+ return $url unless $ext;
+ $ext = lc($ext);
+ $ext = 'jpg' if ($ext eq 'jpeg');
+ return $url if ($url =~ m/\.$ext$/si);
+ return "$url#.$ext";
+}
+
+
+# Returns a list of the image enclosures in the RSS or Atom feed.
+# Elements of the list are references, [ "url", "guid" ].
+#
+sub parse_feed($);
+sub parse_feed($) {
+ my ($url) = @_;
+
+ init_lwp();
+ $LWP::Simple::ua->agent ("$progname/$version");
+ $LWP::Simple::ua->timeout (10); # bail sooner than the default of 3 minutes
+
+
+ # Half the time, random Linux systems don't have Mozilla::CA installed,
+ # which results in "Can't verify SSL peers without knowning which
+ # Certificate Authorities to trust".
+ #
+ # In xscreensaver-text we just disabled certificate checks. However,
+ # malicious images really do exist, so for xscreensaver-getimage-file,
+ # let's actually require that SSL be installed properly.
+
+ print STDERR "$progname: loading $url\n" if ($verbose);
+ my $body = (LWP::Simple::get($url) || '');
+
+ if ($body !~ m@^\s*<(\?xml|rss)\b@si) {
+ # Not an RSS/Atom feed. Try RSS autodiscovery.
+
+ # (Great news, everybody: Flickr no longer provides RSS for "Sets",
+ # only for "Photostreams", and only the first 20 images of those.
+ # Thanks, assholes.)
+
+ if ($body =~ m/^\s*$/s) {
+ sanity_check_lwp();
+ error ("null response: $url");
+ }
+
+ error ("not an RSS or Atom feed, or HTML: $url")
+ unless ($body =~ m@<(HEAD|BODY|A|IMG)\b@si);
+
+ # Find the first <link> with RSS or Atom in it, and use that instead.
+
+ $body =~ s@<LINK\s+([^<>]*)>@{
+ my $p = $1;
+ if ($p =~ m! \b REL \s* = \s* ['"]? alternate \b!six &&
+ $p =~ m! \b TYPE \s* = \s* ['"]? application/(atom|rss) !six &&
+ $p =~ m! \b HREF \s* = \s* ['"] ( [^<>'"]+ ) !six
+ ) {
+ my $u2 = html_unquote ($1);
+ if ($u2 =~ m!^/!s) {
+ my ($h) = ($url =~ m!^([a-z]+://[^/]+)!si);
+ $u2 = "$h$u2";
+ }
+ print STDERR "$progname: found feed: $u2\n"
+ if ($verbose);
+ return parse_feed ($u2);
+ }
+ '';
+ }@gsexi;
+
+ error ("no RSS or Atom feed for HTML page: $url");
+ }
+
+
+ $body =~ s@(<ENTRY|<ITEM)@\001$1@gsi;
+ my @items = split(/\001/, $body);
+ shift @items;
+
+ my @imgs = ();
+ my %ids;
+
+ foreach my $item (@items) {
+ my $iurl = undef;
+ my $id = undef;
+
+ # First look for <link rel="enclosure" href="...">
+ #
+ if (! $iurl) {
+ foreach my $link ($item =~ m@<LINK[^<>]*>@gsi) {
+ last if $iurl;
+ my ($href) = ($link =~ m/\bHREF\s*=\s*[\"\']([^<>\'\"]+)/si);
+ my ($type) = ($link =~ m/\bTYPE\s*=\s*[\"\']?([^<>\'\"]+)/si);
+ my ($rel) = ($link =~ m/\bREL\s*=\s*[\"\']?([^<>\'\"]+)/si);
+ $href = undef unless (lc($rel || '') eq 'enclosure');
+ $href = undef if ($type && $type !~ m@^image/@si); # omit videos
+ $iurl = html_unquote($href) if $href;
+ $iurl = force_extension ($iurl, $type);
+ }
+ }
+
+ # Then look for <media:content url="...">
+ #
+ if (! $iurl) {
+ foreach my $link ($item =~ m@<MEDIA:CONTENT[^<>]*>@gsi) {
+ last if $iurl;
+ my ($href) = ($link =~ m/\bURL\s*=\s*[\"\']([^<>\'\"]+)/si);
+ my ($type) = ($link =~ m/\bTYPE\s*=\s*[\"\']?([^<>\'\"]+)/si);
+ my ($med) = ($link =~ m/\bMEDIUM\s*=\s*[\"\']?([^<>\'\"]+)/si);
+ $type = 'image/jpeg' if (!$type && lc($med || '') eq 'image');
+ $href = undef if ($type && $type !~ m@^image/@si); # omit videos
+ $iurl = html_unquote($href) if $href;
+ $iurl = force_extension ($iurl, $type);
+ }
+ }
+
+ # Then look for <enclosure url="..."/>
+ #
+ if (! $iurl) {
+ foreach my $link ($item =~ m@<ENCLOSURE[^<>]*>@gsi) {
+ last if $iurl;
+ my ($href) = ($link =~ m/\bURL\s*=\s*[\"\']([^<>\'\"]+)/si);
+ my ($type) = ($link =~ m/\bTYPE\s*=\s*[\"\']?([^<>\'\"]+)/si);
+ $href = undef if ($type && $type !~ m@^image/@si); # omit videos
+ $iurl = html_unquote($href) if ($href);
+ $iurl = force_extension ($iurl, $type);
+ }
+ }
+
+ # Ok, maybe there's an image in the <url> field?
+ #
+ if (! $iurl) {
+ foreach my $link ($item =~ m@<URL\b[^<>]*>([^<>]*)@gsi) {
+ last if $iurl;
+ my $u2 = $1;
+ $iurl = html_unquote($u2) if ($u2 =~ m/$good_file_re/io);
+ if (! $iurl) {
+ my $u3 = $u2;
+ $u3 =~ s/#.*$//gs;
+ $u3 =~ s/[?&].*$//gs;
+ $iurl = html_unquote($u2) if ($u3 =~ m/$good_file_re/io);
+ }
+ }
+ }
+
+ # Then look for <content:encoded> or <description>... with an
+ # <img src="..."> inside. If more than one image, take the first.
+ #
+ foreach my $t ('content:encoded', 'description') {
+ last if $iurl;
+ foreach my $link ($item =~ m@<$t[^<>]*>(.*?)</$t>@gsi) {
+ last if $iurl;
+ my $desc = $1;
+ if ($desc =~ m@<!\[CDATA\[\s*(.*?)\s*\]\]>@gs) {
+ $desc = $1;
+ } else {
+ $desc = html_unquote($desc);
+ }
+ my ($href) = ($desc =~ m@<IMG[^<>]*\bSRC=[\"\']?([^\"\'<>]+)@si);
+ $iurl = html_unquote($href) if ($href);
+ # If IMG SRC has a bogus extension, pretend it's a JPEG.
+ $iurl = force_extension ($iurl, 'image/jpeg')
+ if ($iurl && $iurl !~ m/$good_file_re/io);
+ }
+ }
+
+ # Find a unique ID for this image, to defeat image farms.
+ # First look for <id>...</id>
+ ($id) = ($item =~ m!<ID\b[^<>]*>\s*([^<>]+?)\s*</ID>!si) unless $id;
+
+ # Then look for <guid isPermaLink=...> ... </guid>
+ ($id) = ($item =~ m!<GUID\b[^<>]*>\s*([^<>]+?)\s*</GUID>!si) unless $id;
+
+ # Then look for <link> ... </link>
+ ($id) = ($item =~ m!<LINK\b[^<>]*>\s*([^<>]+?)\s*</LINK>!si) unless $id;
+
+ # If we only have a GUID or LINK, but it's an image, use that.
+ $iurl = $id if (!$iurl && $id && $id =~ m/$good_file_re/io);
+
+ if ($iurl) {
+ $id = $iurl unless $id;
+ my $o = $ids{$id};
+ if (! $o) {
+ $ids{$id} = $iurl;
+ my @P = ($iurl, $id);
+ push @imgs, \@P;
+ } elsif ($iurl ne $o) {
+ print STDERR "$progname: WARNING: dup ID \"$id\"" .
+ " for \"$o\" and \"$iurl\"\n";
+ }
+ }
+ }
+
+ return @imgs;
+}
+
+
+# Like md5_base64 but uses filename-safe characters.
+#
+sub md5_file($) {
+ my ($s) = @_;
+ $s = md5_base64($s);
+ $s =~ s@[/]@_@gs;
+ $s =~ s@[+]@-@gs;
+ return $s;
+}
+
+
+# expands the first URL relative to the second.
+#
+sub expand_url($$) {
+ my ($url, $base) = @_;
+
+ $url =~ s/^\s+//gs; # lose whitespace at front and back
+ $url =~ s/\s+$//gs;
+
+ if (! ($url =~ m/^[a-z]+:/)) {
+
+ $base =~ s@(\#.*)$@@; # strip anchors
+ $base =~ s@(\?.*)$@@; # strip arguments
+ $base =~ s@/[^/]*$@/@; # take off trailing file component
+
+ my $tail = '';
+ if ($url =~ s@(\#.*)$@@) { $tail = $1; } # save anchors
+ if ($url =~ s@(\?.*)$@@) { $tail = "$1$tail"; } # save arguments
+
+ my $base2 = $base;
+
+ $base2 =~ s@^([a-z]+:/+[^/]+)/.*@$1@ # if url is an absolute path
+ if ($url =~ m@^/@);
+
+ my $ourl = $url;
+
+ $url = $base2 . $url;
+ $url =~ s@/\./@/@g; # expand "."
+ 1 while ($url =~ s@/[^/]+/\.\./@/@s); # expand ".."
+
+ $url .= $tail; # put anchors/args back
+
+ print STDERR "$progname: relative URL: $ourl --> $url\n"
+ if ($verbose > 1);
+
+ } else {
+ print STDERR "$progname: absolute URL: $url\n"
+ if ($verbose > 2);
+ }
+
+ return $url;
+}
+
+
+# Given the URL of an image, download it into the given directory
+# and return the file name.
+#
+sub download_image($$$) {
+ my ($url, $uid, $dir) = @_;
+
+ my $url2 = $url;
+ $url2 =~ s/\#.*$//s; # Omit search terms after file extension
+ $url2 =~ s/\?.*$//s;
+ my ($ext) = ($url =~ m@\.([a-z\d]+)$@si);
+ ($ext) = ($url2 =~ m@\.([a-z\d]+)$@si) unless $ext;
+
+ # If the feed hasn't put a sane extension on their URLs, nothing's going
+ # to work. This code assumes that file names have extensions, even the
+ # ones in the cache directory.
+ #
+ if (! $ext) {
+ print STDERR "$progname: skipping extensionless URL: $url\n"
+ if ($verbose > 1);
+ return undef;
+ }
+
+ # Don't bother downloading files that we will reject anyway.
+ #
+ if (! ($url =~ m/$good_file_re/io ||
+ $url2 =~ m/$good_file_re/io)) {
+ print STDERR "$progname: skipping non-image URL: $url\n"
+ if ($verbose > 1);
+ return undef;
+ }
+
+ my $file = md5_file ($uid);
+ $file .= '.' . lc($ext) if $ext;
+
+ # Don't bother doing If-Modified-Since to see if the URL has changed.
+ # If we have already downloaded it, assume it's good.
+ if (-f "$dir/$file") {
+ print STDERR "$progname: exists: $dir/$file for $uid / $url\n"
+ if ($verbose > 1);
+ return $file;
+ }
+
+ # Special-case kludge for Flickr:
+ # Their RSS feeds sometimes include only the small versions of the images.
+ # So if the URL ends in one of the "small-size" letters, change it to "b".
+ #
+ # _o orig, 1600 +
+ # _k large, 2048 max
+ # _h large, 1600 max
+ # _b large, 1024 max
+ # _c medium, 800 max
+ # _z medium, 640 max
+ # "" medium, 500 max
+ # _n small, 320 max
+ # _m small, 240 max
+ # _t thumb, 100 max
+ # _q square, 150x150
+ # _s square, 75x75
+ #
+ # Note: if we wanted to get the _k or _o version instead of the _b or _h
+ # version, we'd need to crack the DRM -- which is easy: see crack_secret
+ # in "https://www.jwz.org/hacks/galdown".
+ #
+ $url =~ s@_[sqtmnzc](\.[a-z]+)$@_b$1@si
+ if ($url =~ m@^https?://[^/?#&]*?flickr\.com/@si);
+
+ print STDERR "$progname: downloading: $dir/$file for $uid / $url\n"
+ if ($verbose > 1);
+ init_lwp();
+ $LWP::Simple::ua->agent ("$progname/$version");
+
+ $url =~ s/\#.*$//s; # Omit search terms
+ my $status = LWP::Simple::mirror ($url, "$dir/$file");
+ if (!LWP::Simple::is_success ($status)) {
+ print STDERR "$progname: error $status: $url\n"; # keep going
+ }
+
+ return $file;
+}
+
+
+sub mirror_feed($) {
+ my ($url) = @_;
+
+ if ($url !~ m/^https?:/si) { # not a URL: local directory.
+ return (undef, $url);
+ }
+
+ my $dir = "$ENV{HOME}/Library/Caches"; # MacOS location
+ if (-d $dir) {
+ $dir = "$dir/org.jwz.xscreensaver.feeds";
+ } elsif (-d "$ENV{HOME}/.cache") { # Gnome "FreeDesktop XDG" location
+ $dir = "$ENV{HOME}/.cache/xscreensaver";
+ if (! -d $dir) { mkdir ($dir) || error ("mkdir $dir: $!"); }
+ $dir .= "/feeds";
+ if (! -d $dir) { mkdir ($dir) || error ("mkdir $dir: $!"); }
+ } elsif (-d "$ENV{HOME}/tmp") { # If ~/tmp/ exists, use it.
+ $dir = "$ENV{HOME}/tmp/.xscreensaver-feeds";
+ } else {
+ $dir = "$ENV{HOME}/.xscreensaver-feeds";
+ }
+
+ if (! -d $dir) {
+ mkdir ($dir) || error ("mkdir $dir: $!");
+ print STDERR "$progname: mkdir $dir/\n" if ($verbose);
+ }
+
+ # MD5 for directory name to use for cache of a feed URL.
+ $dir .= '/' . md5_file ($url);
+
+ if (! -d $dir) {
+ mkdir ($dir) || error ("mkdir $dir: $!");
+ print STDERR "$progname: mkdir $dir/ for $url\n" if ($verbose);
+ }
+
+ # At this point, we have the directory corresponding to this URL.
+ # Now check to see if the files in it are up to date, and download
+ # them if not.
+
+ my $stamp = '.timestamp';
+ my $lock = "$dir/$stamp";
+
+ print STDERR "$progname: awaiting lock: $lock\n"
+ if ($verbose > 1);
+
+ my $mtime = ((stat($lock))[9]) || 0;
+
+ my $lock_fd;
+ open ($lock_fd, '+>>', $lock) || error ("unable to write $lock: $!");
+ flock ($lock_fd, LOCK_EX) || error ("unable to lock $lock: $!");
+ seek ($lock_fd, 0, 0) || error ("unable to rewind $lock: $!");
+
+ my $poll_p = ($mtime + $feed_max_age < time);
+
+ # --no-cache cmd line arg means poll again right now.
+ $poll_p = 1 unless ($cache_p);
+
+ # Even if the cache is young, make sure there is at least one file,
+ # and re-check if not.
+ #
+ if (! $poll_p) {
+ my $count = 0;
+ opendir (my $dirh, $dir) || error ("$dir: $!");
+ foreach my $f (readdir ($dirh)) {
+ next if ($f =~ m/^\./s);
+ $count++;
+ last;
+ }
+ closedir $dirh;
+
+ if ($count <= 0) {
+ print STDERR "$progname: no image files in cache of $url\n"
+ if ($verbose);
+ $poll_p = 1;
+ }
+ }
+
+ if ($poll_p) {
+
+ print STDERR "$progname: loading $url\n" if ($verbose);
+
+ my %files;
+ opendir (my $dirh, $dir) || error ("$dir: $!");
+ foreach my $f (readdir ($dirh)) {
+ next if ($f eq '.' || $f eq '..');
+ $files{$f} = 0; # 0 means "file exists, should be deleted"
+ }
+ closedir $dirh;
+
+ $files{$stamp} = 1;
+
+ # Download each image currently in the feed.
+ #
+ my $count = 0;
+ my @urls = parse_feed ($url);
+ print STDERR "$progname: " . ($#urls + 1) . " images\n"
+ if ($verbose > 1);
+ my %seen_src_urls;
+ foreach my $p (@urls) {
+ my ($furl, $id) = @$p;
+ $furl = expand_url ($furl, $url);
+
+ # No need to download the same image twice, even if it was in the feed
+ # multiple times under different GUIDs.
+ next if ($seen_src_urls{$furl});
+ $seen_src_urls{$furl} = 1;
+
+ my $f = download_image ($furl, $id, $dir);
+ next unless $f;
+ $files{$f} = 1; # Got it, don't delete
+ $count++;
+ }
+
+ my $empty_p = ($count <= 0);
+
+ # Now delete any files that are no longer in the feed.
+ # But if there was nothing in the feed (network failure?)
+ # then don't blow away the old files.
+ #
+ my $kept = 0;
+ foreach my $f (keys(%files)) {
+ if ($count <= 0) {
+ $kept++;
+ } elsif ($files{$f}) {
+ $kept++;
+ } else {
+ if (unlink ("$dir/$f")) {
+ print STDERR "$progname: rm $dir/$f\n" if ($verbose > 1);
+ } else {
+ print STDERR "$progname: rm $dir/$f: $!\n"; # don't bail
+ }
+ }
+ }
+
+ # Both feed and cache are empty. No files at all. Bail.
+ error ("empty feed: $url") if ($kept <= 1);
+
+ # Feed is empty, but we have some files from last time. Warn.
+ print STDERR "$progname: empty feed: using cache: $url\n"
+ if ($empty_p);
+
+ $mtime = time(); # update the timestamp
+
+ } else {
+
+ # Not yet time to re-check the URL.
+ print STDERR "$progname: using cache: $url\n" if ($verbose);
+
+ }
+
+ # Unlock and update the write date on the .timestamp file.
+ #
+ truncate ($lock_fd, 0) || error ("unable to truncate $lock: $!");
+ seek ($lock_fd, 0, 0) || error ("unable to rewind $lock: $!");
+ utime ($mtime, $mtime, $lock_fd) || error ("unable to touch $lock: $!");
+ flock ($lock_fd, LOCK_UN) || error ("unable to unlock $lock: $!");
+ close ($lock_fd);
+ $lock_fd = undef;
+ print STDERR "$progname: unlocked $lock\n" if ($verbose > 1);
+
+ # Don't bother using the imageDirectory cache. We know that this directory
+ # is flat, and we can assume that an RSS feed doesn't contain 100,000 images
+ # like ~/Pictures/ might.
+ #
+ $cache_p = 0;
+
+ # Return the URL and directory name of the files of that URL's local cache.
+ #
+ return ($url, $dir);
+}
+
+
+sub find_random_file($) {
+ my ($dir) = @_;
+
+ if ($use_spotlight_p == -1) {
+ $use_spotlight_p = 0;
+ if (-x '/usr/bin/mdfind') {
+ $use_spotlight_p = 1;
+ }
+ }
+
+ my $url;
+ ($url, $dir) = mirror_feed ($dir);
+
+ if ($url) {
+ $use_spotlight_p = 0;
+ print STDERR "$progname: $dir is cache for $url\n" if ($verbose > 1);
+ }
+
+ @all_files = read_cache ($dir);
+
+ if ($#all_files >= 0) {
+ # got it from the cache...
+
+ } elsif ($use_spotlight_p) {
+ print STDERR "$progname: spotlighting $dir...\n" if ($verbose);
+ spotlight_all_files ($dir);
+ print STDERR "$progname: found " . ($#all_files+1) .
+ " file" . ($#all_files == 0 ? "" : "s") .
+ " via Spotlight\n"
+ if ($verbose);
+ } else {
+ print STDERR "$progname: recursively reading $dir...\n" if ($verbose);
+ find_all_files ($dir);
+ print STDERR "$progname: " .
+ "f=" . ($#all_files+1) . "; " .
+ "d=$dir_count; " .
+ "s=$stat_count; " .
+ "skip=${skip_count_unstat}+$skip_count_stat=" .
+ ($skip_count_unstat + $skip_count_stat) .
+ ".\n"
+ if ($verbose);
+ }
+
+ write_cache ($dir);
+
+ if ($#all_files < 0) {
+ print STDERR "$progname: no image files in $dir\n";
+ exit 1;
+ }
+
+ my $max_tries = 50;
+ my $total_files = @all_files;
+ my $sparse_p = ($total_files < 20);
+
+ # If the directory has a lot of files in it:
+ # Make a pass through looking for hirez files (assume some are thumbs);
+ # If we found none, then, select any other file at random.
+ # Otherwise if there are a small number of files:
+ # Just select one at random (in case there's like, just one hirez).
+
+ for (my $check_size_p = $sparse_p ? 0 : 1;
+ $check_size_p >= 0; $check_size_p--) {
+
+ for (my $i = 0; $i < $max_tries; $i++) {
+ my $n = int (rand ($total_files));
+ my $file = $all_files[$n];
+ if (!$check_size_p || large_enough_p ($file)) {
+ if (! $url) {
+ $file =~ s@^\Q$dir/@@so || die; # remove $dir from front
+ }
+ return $file;
+ }
+ }
+ }
+
+ print STDERR "$progname: no suitable images in " . ($url || $dir) . " -- " .
+ ($total_files <= $max_tries
+ ? "all $total_files images"
+ : "$max_tries of $total_files images") .
+ " are smaller than ${min_image_width}x${min_image_height}.\n";
+
+ # If we got here, blow away the cache. Maybe it's stale.
+ unlink $cache_file_name if $cache_file_name;
+
+ exit 1;
+}
+
+
+sub large_enough_p($) {
+ my ($file) = @_;
+
+ my ($w, $h) = image_file_size ($file);
+
+ if (!defined ($h)) {
+
+ # Nonexistent files are obviously too small!
+ # Already printed $verbose message about the file not existing.
+ return 0 unless -f $file;
+
+ print STDERR "$progname: $file: unable to determine image size\n"
+ if ($verbose);
+ # Assume that unknown files are of good sizes: this will happen if
+ # they matched $good_file_re, but we don't have code to parse them.
+ # (This will also happen if the file is junk...)
+ return 1;
+ }
+
+ if ($w < $min_image_width || $h < $min_image_height) {
+ print STDERR "$progname: $file: too small ($w x $h)\n" if ($verbose);
+ return 0;
+ }
+
+ print STDERR "$progname: $file: $w x $h\n" if ($verbose);
+ return 1;
+}
+
+
+
+# Given the raw body of a GIF document, returns the dimensions of the image.
+#
+sub gif_size($) {
+ my ($body) = @_;
+ my $type = substr($body, 0, 6);
+ my $s;
+ return () unless ($type =~ /GIF8[7,9]a/);
+ $s = substr ($body, 6, 10);
+ my ($a,$b,$c,$d) = unpack ("C"x4, $s);
+ return (($b<<8|$a), ($d<<8|$c));
+}
+
+# Given the raw body of a JPEG document, returns the dimensions of the image.
+#
+sub jpeg_size($) {
+ my ($body) = @_;
+ my $i = 0;
+ my $L = length($body);
+
+ my $c1 = substr($body, $i, 1); $i++;
+ my $c2 = substr($body, $i, 1); $i++;
+ return () unless (ord($c1) == 0xFF && ord($c2) == 0xD8);
+
+ my $ch = "0";
+ while (ord($ch) != 0xDA && $i < $L) {
+ # Find next marker, beginning with 0xFF.
+ while (ord($ch) != 0xFF) {
+ return () if (length($body) <= $i);
+ $ch = substr($body, $i, 1); $i++;
+ }
+ # markers can be padded with any number of 0xFF.
+ while (ord($ch) == 0xFF) {
+ return () if (length($body) <= $i);
+ $ch = substr($body, $i, 1); $i++;
+ }
+
+ # $ch contains the value of the marker.
+ my $marker = ord($ch);
+
+ if (($marker >= 0xC0) &&
+ ($marker <= 0xCF) &&
+ ($marker != 0xC4) &&
+ ($marker != 0xCC)) { # it's a SOFn marker
+ $i += 3;
+ return () if (length($body) <= $i);
+ my $s = substr($body, $i, 4); $i += 4;
+ my ($a,$b,$c,$d) = unpack("C"x4, $s);
+ return (($c<<8|$d), ($a<<8|$b));
+
+ } else {
+ # We must skip variables, since FFs in variable names aren't
+ # valid JPEG markers.
+ return () if (length($body) <= $i);
+ my $s = substr($body, $i, 2); $i += 2;
+ my ($c1, $c2) = unpack ("C"x2, $s);
+ my $length = ($c1 << 8) | $c2;
+ return () if ($length < 2);
+ $i += $length-2;
+ }
+ }
+ return ();
+}
+
+# Given the raw body of a PNG document, returns the dimensions of the image.
+#
+sub png_size($) {
+ my ($body) = @_;
+ return () unless ($body =~ m/^\211PNG\r/s);
+ my ($bits) = ($body =~ m/^.{12}(.{12})/s);
+ return () unless defined ($bits);
+ return () unless ($bits =~ /^IHDR/);
+ my ($ign, $w, $h) = unpack("a4N2", $bits);
+ return ($w, $h);
+}
+
+
+# Given the raw body of an SVG document, returns the dimensions of the image.
+#
+sub svg_size($) {
+ my ($body) = @_;
+ return () unless ($body =~ m/^<\?xml\s/s);
+ return () unless ($body =~ m/<svg\s/si);
+ my ($w) = ($body =~ m@\swidth=[\"\'](\d+)[\"\']@si);
+ my ($h) = ($body =~ m@\sheight=[\"\'](\d+)[\"\']@si);
+ return () unless (defined ($w) && defined ($h));
+ return ($w, $h);
+}
+
+
+# Given the raw body of a GIF, JPEG, PNG or SVG document, returns the
+# dimensions of the image.
+#
+sub image_size($) {
+ my ($body) = @_;
+ return () if (length($body) < 10);
+ my ($w, $h) = gif_size ($body);
+ if ($w && $h) { return ($w, $h); }
+ ($w, $h) = jpeg_size ($body);
+ if ($w && $h) { return ($w, $h); }
+ ($w, $h) = svg_size ($body);
+ if ($w && $h) { return ($w, $h); }
+ # #### TODO: need image parsers for TIFF, XPM, XBM.
+ return png_size ($body);
+}
+
+# Returns the dimensions of the image file.
+#
+sub image_file_size($) {
+ my ($file) = @_;
+ my $in;
+ if (! open ($in, '<:raw', $file)) {
+ print STDERR "$progname: $file: $!\n" if ($verbose);
+ return ();
+ }
+ my $body = '';
+ sysread ($in, $body, 1024 * 50); # The first 50k should be enough.
+ close $in; # (It's not for certain huge jpegs...
+ return image_size ($body); # but we know they're huge!)
+}
+
+
+# Reads the prefs we use from ~/.xscreensaver
+#
+sub get_x11_prefs() {
+ my $got_any_p = 0;
+
+ if (open (my $in, '<', $config_file)) {
+ print STDERR "$progname: reading $config_file\n" if ($verbose > 1);
+ local $/ = undef; # read entire file
+ my $body = <$in>;
+ close $in;
+ $got_any_p = get_x11_prefs_1 ($body);
+
+ } elsif ($verbose > 1) {
+ print STDERR "$progname: $config_file: $!\n";
+ }
+
+ if (! $got_any_p && defined ($ENV{DISPLAY})) {
+ # We weren't able to read settings from the .xscreensaver file.
+ # Fall back to any settings in the X resource database
+ # (/usr/X11R6/lib/X11/app-defaults/XScreenSaver)
+ #
+ print STDERR "$progname: reading X resources\n" if ($verbose > 1);
+ my $body = `appres XScreenSaver xscreensaver -1`;
+ $got_any_p = get_x11_prefs_1 ($body);
+ }
+}
+
+
+sub get_x11_prefs_1($) {
+ my ($body) = @_;
+
+ my $got_any_p = 0;
+ my $choosep = 1;
+ $body =~ s@\\\n@@gs;
+ $body =~ s@^[ \t]*#[^\n]*$@@gm;
+
+ foreach my $line (split (/\n/, $body)) {
+ $line =~ s/#.*//s;
+ if ($line =~ m/^[.*]*imageDirectory:[ \t]*([^\s]+)\s*$/si) {
+ $image_directory = $1;
+ $got_any_p = 1;
+ } elsif ($line =~ m/^[.*]*chooseRandomImages:[ \t]*([^\s]+)\s*$/si) {
+ $choosep = ($1 =~ m/^true$/si ? 1 : 0);
+ $got_any_p = 1;
+ }
+ }
+
+ # Don't allow image files to be loaded if chooseRandomImages is false.
+ $image_directory = undef unless $choosep;
+
+ return $got_any_p;
+}
+
+
+sub get_cocoa_prefs($) {
+ my ($id) = @_;
+ print STDERR "$progname: reading Cocoa prefs: \"$id\"\n" if ($verbose > 1);
+ my $v = get_cocoa_pref_1 ($id, "imageDirectory");
+ $v = '~/Pictures' unless defined ($v); # Match default in XScreenSaverView
+ $image_directory = $v if defined ($v);
+}
+
+
+sub get_cocoa_pref_1($$) {
+ my ($id, $key) = @_;
+ # make sure there's nothing stupid/malicious in either string.
+ $id =~ s/[^-a-z\d. ]/_/gsi;
+ $key =~ s/[^-a-z\d. ]/_/gsi;
+ my $cmd = "defaults -currentHost read \"$id\" \"$key\"";
+
+ print STDERR "$progname: executing $cmd\n"
+ if ($verbose > 3);
+
+ my $val = `$cmd 2>/dev/null`;
+ $val =~ s/^\s+//s;
+ $val =~ s/\s+$//s;
+
+ print STDERR "$progname: Cocoa: $id $key = \"$val\"\n"
+ if ($verbose > 2);
+
+ $val = undef if ($val =~ m/^$/s);
+
+ return $val;
+}
+
+
+sub error($) {
+ my ($err) = @_;
+ print STDERR "$progname: $err\n";
+ exit 1;
+}
+
+sub usage() {
+ print STDERR "usage: $progname [--verbose] [ directory-or-feed-url ]\n\n" .
+ " Prints the name of a randomly-selected image file. The directory\n" .
+ " is searched recursively. Images smaller than " .
+ "${min_image_width}x${min_image_height} are excluded.\n" .
+ "\n" .
+ " The directory may also be the URL of an RSS/Atom feed. Enclosed\n" .
+ " images will be downloaded and cached locally.\n" .
+ "\n";
+ exit 1;
+}
+
+sub main() {
+ my $cocoa_id = undef;
+ my $abs_p = 0;
+
+ while ($_ = $ARGV[0]) {
+ shift @ARGV;
+ if (m/^--?verbose$/s) { $verbose++; }
+ elsif (m/^-v+$/s) { $verbose += length($_)-1; }
+ elsif (m/^--?name$/s) { } # ignored, for compatibility
+ elsif (m/^--?spotlight$/s) { $use_spotlight_p = 1; }
+ elsif (m/^--?no-spotlight$/s) { $use_spotlight_p = 0; }
+ elsif (m/^--?cache$/s) { $cache_p = 1; }
+ elsif (m/^--?no-?cache$/s) { $cache_p = 0; }
+ elsif (m/^--?flush-?cache$/s) { $feed_max_age = $cache_max_age = 0; }
+ elsif (m/^--?cocoa$/) { $cocoa_id = shift @ARGV; }
+ elsif (m/^--?abs(olute)?$/) { $abs_p = 1; }
+ elsif (m/^-./) { usage; }
+ elsif (!defined($image_directory)) { $image_directory = $_; }
+ else { usage; }
+ }
+
+ # Most hacks (X11 and Cocoa) pass a --directory value on the command line,
+ # but if they don't, look it up from the resources. Currently this only
+ # happens with "glitchpeg" which invokes xscreensaver-getimage-file
+ # directly instead of going through the traditional path.
+ #
+ if (! $image_directory) {
+ if (!defined ($cocoa_id)) {
+ # see OSX/XScreenSaverView.m
+ $cocoa_id = $ENV{XSCREENSAVER_CLASSPATH};
+ }
+
+ if (defined ($cocoa_id)) {
+ get_cocoa_prefs ($cocoa_id);
+ } else {
+ get_x11_prefs();
+ }
+ error ("image file loading is not configured") unless $image_directory;
+ }
+
+ usage unless (defined($image_directory));
+
+ $image_directory =~ s@^feed:@http:@si;
+
+ if ($image_directory =~ m/^https?:/si) {
+ # ok
+ } else {
+ $image_directory =~ s@^~/@$ENV{HOME}/@s; # allow literal "~/"
+ $image_directory =~ s@/+$@@s; # omit trailing /
+
+ if (! -d $image_directory) {
+ print STDERR "$progname: $image_directory not a directory or URL\n";
+ usage;
+ }
+ }
+
+ my $file = find_random_file ($image_directory);
+
+ # With --absolute return fully qualified paths instead of relative to --dir.
+ if ($abs_p &&
+ $file !~ m@^/@ &&
+ $image_directory =~ m@^/@s) {
+ $file = "$image_directory/$file";
+ $file =~ s@//+@/@gs;
+ }
+
+ print STDOUT "$file\n";
+}
+
+main;
+exit 0;
diff --git a/hacks/xscreensaver-getimage-file.man b/hacks/xscreensaver-getimage-file.man
new file mode 100644
index 0000000..2525d16
--- /dev/null
+++ b/hacks/xscreensaver-getimage-file.man
@@ -0,0 +1,63 @@
+.TH XScreenSaver 1 "20-Mar-2005 (4.21)" "X Version 11"
+.SH NAME
+xscreensaver-getimage-file - select a random image file for use by screen savers
+.SH SYNOPSIS
+.B xscreensaver-getimage-file
+[\--verbose]
+[\--no-cache]
+[\--flush-caches]
+directory-or-URL
+.SH DESCRIPTION
+The \fIxscreensaver\-getimage\-file\fP program is a helper program
+for the xscreensaver hacks that manipulate images. It is invoked by
+.BR xscreensaver\-getimage (MANSUFFIX)
+as needed.
+
+It prints the name of a randomly-selected image file. The directory
+is searched recursively. Non-image files and images smaller than 500x500
+are excluded.
+
+The directory may also be the URL of an RSS/Atom feed. Enclosed
+images will be downloaded and cached locally.
+
+The contents of the directory are cached, for performance. The cache
+is re-generated if 3 hours have passed.
+
+.SH OPTIONS
+.I xscreensaver-getimage-file
+accepts the following options:
+.TP 4
+.B --verbose
+Print diagnostics.
+.TP 4
+.B --no-cache
+Ignore the cache when searching for images. This may be slow.
+.TP 4
+.B --flush-caches
+Discard all caches immediately. They will be re-generated as needed.
+.TP 4
+.I directory-or-URL
+If a pathname it is the directory tree whose images should be used.
+
+If a URL is specified, it should be the URL of an RSS or Atom feed
+containing images. The first time it is accessed, all of the images
+in the feed will be downloaded to a local cache directory. The URL
+will be polled again when the cache times out. Any new images will
+be downloaded and cached, and any images no longer in the feed will
+be discarded.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-getimage (MANSUFFIX)
+.SH COPYRIGHT
+Copyright \(co 2001-2021 by Jamie Zawinski. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 14-Apr-2001.
diff --git a/hacks/xscreensaver-getimage-video b/hacks/xscreensaver-getimage-video
new file mode 100755
index 0000000..df13153
--- /dev/null
+++ b/hacks/xscreensaver-getimage-video
@@ -0,0 +1,141 @@
+#!/usr/bin/perl -w
+# Copyright © 2001-2015 Jamie Zawinski <jwz@jwz.org>.
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation. No representations are made about the suitability of this
+# software for any purpose. It is provided "as is" without express or
+# implied warranty.
+#
+# This program attempts to grab a single frame of video from the system's
+# video capture card, and then load it on to the root window using the
+# "xscreensaver-getimage-file" program. Various frame-grabbing programs
+# are known, and the first one found is used.
+#
+# The various xscreensaver hacks that manipulate images ("slidescreen",
+# "jigsaw", etc.) get the image to manipulate by running the
+# "xscreensaver-getimage" program.
+#
+# The various screen savers invoke "xscreensaver-getimage", which will in
+# turn invoke this program, depending on the value of the "grabVideoFrames"
+# setting in the ~/.xscreensaver file (or in the app-defaults file, usually
+# /usr/lib/X11/app-defaults/XScreenSaver).
+#
+# Created: 13-Apr-2001.
+
+require 5;
+#use diagnostics; # Fails on some MacOS 10.5 systems
+use strict;
+
+my $progname = $0; $progname =~ s@.*/@@g;
+my $version = q{ $Revision: 1.26 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+
+my $tmpdir = $ENV{TMPDIR} || "/tmp";
+my $tmpfile = sprintf("%s/xssv.%08x.ppm", $tmpdir, rand(0xFFFFFFFF));
+
+my $verbose = 0;
+
+
+# These are programs that can be used to grab a video frame. The first one
+# of these programs that exists on $PATH will be used, and the image file
+# is assumed to be written to $tmpfile (in some image format acceptable to
+# "xscreensaver-getimage-file", e.g., PPM or JPEG.)
+#
+# If you add other programs to this list, please let me know!
+#
+my @programs = (
+
+ "bttvgrab -d q -Q -l 1 -o ppm -f $tmpfile", # BTTV
+ "qcam > $tmpfile", # Connectix Qcam
+ "gqcam -t PPM -d $tmpfile", # GTK+ Qcam clone
+
+ "v4lctl snap ppm full $tmpfile", # XawTV 3.94.
+ "streamer -a -o $tmpfile", # XawTV 3.76.
+ # "streamer -a -s 768x576 -o $tmpfile", # XawTV 3.75.
+
+ "atitv snap $tmpfile", # ATI video capture card
+
+ "grab -type ppm -format ntsc -source 1 " . # *BSD BT848 module
+ "-settle 0.75 -output $tmpfile",
+
+ "motioneye -j $tmpfile", # Sony Vaio MotionEye
+
+ "vidcat -b -f ppm -s 640x480 > $tmpfile 2>&-", # w3cam/ovcam
+
+ "vidtomem -f $tmpfile 2>&- " . # Silicon Graphics
+ "&& mv $tmpfile-00000.rgb $tmpfile",
+
+ "ffmpeg -y -v quiet -i /dev/video0 -vframes:v 1 $tmpfile 2>&-",
+
+ # "mplayer -really-quiet tv://0 " . # Maybe works with some cams?
+ # "-ao null -vo pnm -frames 1 2>&- " .
+ # "&& mv 00000001.ppm $tmpfile",
+
+);
+
+
+sub error($) {
+ my ($e) = @_;
+ print STDERR "$progname: $e\n";
+ exit 1;
+}
+
+sub pick_grabber() {
+ my @names = ();
+
+ foreach my $cmd (@programs) {
+ $_ = $cmd;
+ my ($name) = m/^([^ ]+)/;
+ push @names, "\"$name\"";
+ print STDERR "$progname: looking for $name...\n" if ($verbose > 2);
+ foreach my $dir (split (/:/, $ENV{PATH})) {
+ print STDERR "$progname: checking $dir/$name\n" if ($verbose > 3);
+ if (-x "$dir/$name") {
+ return $cmd;
+ }
+ }
+ }
+
+ $names[$#names] = "or " . $names[$#names];
+ error ("none of: " . join (", ", @names) . " were found on \$PATH.");
+}
+
+
+sub grab_image() {
+ my $cmd = pick_grabber();
+ unlink $tmpfile;
+
+ print STDERR "$progname: executing \"$cmd\"\n" if ($verbose);
+ system ($cmd);
+
+ if (! -s $tmpfile) {
+ unlink $tmpfile;
+ error ("\"$cmd\" produced no data.");
+ }
+
+ print STDERR "$progname: wrote \"$tmpfile\"\n" if ($verbose);
+ print STDOUT "$tmpfile\n";
+}
+
+
+sub usage() {
+ print STDERR "usage: $progname [--verbose] [--name]\n";
+ exit 1;
+}
+
+sub main() {
+ while ($_ = $ARGV[0]) {
+ shift @ARGV;
+ if (m/^--?verbose$/s) { $verbose++; }
+ elsif (m/^-v+$/s) { $verbose += length($_)-1; }
+ elsif (m/^--?name$/s) { } # ignored, for compatibility
+ elsif (m/^-./) { usage; }
+ else { usage; }
+ }
+ grab_image();
+}
+
+main;
+exit 0;
diff --git a/hacks/xscreensaver-getimage-video.man b/hacks/xscreensaver-getimage-video.man
new file mode 100644
index 0000000..2ef85ca
--- /dev/null
+++ b/hacks/xscreensaver-getimage-video.man
@@ -0,0 +1,51 @@
+.TH XScreenSaver 1 "20-Mar-2005 (4.21)" "X Version 11"
+.SH NAME
+xscreensaver-getimage-video - grab a video still frame for use by screen savers
+.SH SYNOPSIS
+.B xscreensaver-getimage-video
+[\--verbose]
+.SH DESCRIPTION
+The \fIxscreensaver\-getimage\-video\fP program is a helper program
+for the xscreensaver hacks that manipulate images. Specifically, it
+is invoked by
+.BR xscreensaver\-getimage (MANSUFFIX)
+as needed.
+
+It grabs a single frame of video from the system's video input to a file,
+and prints the name of that file on stdout. It does this by figuring out
+which frame-grabbing programs are installed on the system, and invoking the
+first one it finds.
+.SH OPTIONS
+.I xscreensaver-getimage-video
+accepts the following options:
+.TP 4
+.B --verbose
+Print diagnostics.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-getimage (MANSUFFIX),
+.BR xscreensaver\-getimage\-file (MANSUFFIX),
+.BR atitv (1),
+.BR bttvgrab (1),
+.BR ffmpeg (1),
+.BR grab (1),
+.BR mplayer (1),
+.BR qcam (1),
+.BR streamer (1),
+.BR vidcat (1),
+.BR vidtomem (1),
+.BR vrlctl (1),
+.bR motioneye (1).
+.SH COPYRIGHT
+Copyright \(co 2001-2021 by Jamie Zawinski. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 14-Apr-2001.
diff --git a/driver/xscreensaver-getimage.c b/hacks/xscreensaver-getimage.c
index 092540d..e322c8a 100644
--- a/driver/xscreensaver-getimage.c
+++ b/hacks/xscreensaver-getimage.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2001-2018 by Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2001-2021 by Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -13,6 +13,10 @@
onto the given window or pixmap. That image is either a screen-grab,
a file loaded from disk, or a frame grabbed from the system's video
input.
+
+ This is used only on X11 systems. See the comment at the top of
+ utils/grabclient.c for an explanation of the flow of control on the
+ various platforms.
*/
#include "utils.h"
@@ -27,24 +31,15 @@
# include <sys/wait.h> /* for waitpid() and associated macros */
#endif
-#ifdef HAVE_XMU
-# ifndef VMS
-# include <X11/Xmu/Error.h>
-# else /* VMS */
-# include <Xmu/Error.h>
-# endif
-#else
-# include "xmu.h"
-#endif
-
#include "yarandom.h"
#include "grabscreen.h"
#include "resources.h"
#include "colorbars.h"
#include "visual.h"
-#include "prefs.h"
+#include "xmu.h"
#include "version.h"
#include "vroot.h"
+#include "../driver/prefs.h"
#ifndef _XSCREENSAVER_VROOT_H_
# error Error! You have an old version of vroot.h! Check -I args.
@@ -52,11 +47,24 @@
#ifdef HAVE_GDK_PIXBUF
# undef HAVE_JPEGLIB
+
+# if (__GNUC__ >= 4) /* Ignore useless warnings generated by GTK headers */
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wlong-long"
+# pragma GCC diagnostic ignored "-Wvariadic-macros"
+# pragma GCC diagnostic ignored "-Wpedantic"
+# endif
+
# ifdef HAVE_GTK2
# include <gdk-pixbuf-xlib/gdk-pixbuf-xlib.h>
# else /* !HAVE_GTK2 */
# include <gdk-pixbuf/gdk-pixbuf-xlib.h>
# endif /* !HAVE_GTK2 */
+
+# if (__GNUC__ >= 4)
+# pragma GCC diagnostic pop
+# endif
+
#endif /* HAVE_GDK_PIXBUF */
#ifdef HAVE_JPEGLIB
@@ -81,13 +89,6 @@
the .ad file... */
#endif
-static char *defaults[] = {
-#include "../driver/XScreenSaver_ad.h"
- 0
-};
-
-
-
char *progname = 0;
char *progclass = "XScreenSaver";
XrmDatabase db;
@@ -102,7 +103,7 @@ typedef enum {
#define GETIMAGE_VIDEO_PROGRAM "xscreensaver-getimage-video"
#define GETIMAGE_FILE_PROGRAM "xscreensaver-getimage-file"
-#define GETIMAGE_SCREEN_PROGRAM "xscreensaver-getimage-desktop"
+#define GETIMAGE_SCREEN_PROGRAM "screencapture"
extern const char *blurb (void);
@@ -313,14 +314,16 @@ compute_image_scaling (int src_w, int src_h,
static void
-colorbars (Screen *screen, Visual *visual, Drawable drawable, Colormap cmap)
+colorbars (Screen *screen, Visual *visual, Drawable drawable, Colormap cmap,
+ int logo_size)
{
Pixmap mask = 0;
unsigned long *pixels; /* ignored - unfreed */
int npixels;
Pixmap logo = xscreensaver_logo (screen, visual, drawable, cmap,
BlackPixelOfScreen (screen),
- &pixels, &npixels, &mask, True);
+ &pixels, &npixels, &mask,
+ logo_size);
draw_colorbars (screen, visual, drawable, cmap, 0, 0, 0, 0, logo, mask);
XFreePixmap (DisplayOfScreen (screen), logo);
XFreePixmap (DisplayOfScreen (screen), mask);
@@ -766,6 +769,13 @@ maybe_read_ppm (Screen *screen, Visual *visual,
progname, filename);
goto FAIL;
}
+ else if (!strncasecmp (buf, "<?xml", 5))
+ {
+ fprintf (stderr, "%s: %s: sorry, SVG files not supported"
+ " when compiled with JPEGlib instead of GDK_Pixbuf.\n",
+ progname, filename);
+ goto FAIL;
+ }
if (strncmp (s, "P6", 2))
goto FAIL;
@@ -872,7 +882,7 @@ jpg_error_exit (j_common_ptr cinfo)
{
getimg_jpg_error_mgr *err = (getimg_jpg_error_mgr *) cinfo->err;
cinfo->err->output_message (cinfo);
- colorbars (err->screen, err->visual, err->drawable, err->cmap);
+ colorbars (err->screen, err->visual, err->drawable, err->cmap, 1);
XSync (DisplayOfScreen (err->screen), False);
exit (1);
}
@@ -1171,9 +1181,10 @@ get_filename_1 (Screen *screen, const char *directory, grab_type type,
pid_t forked;
int fds [2];
int in, out;
- char buf[10240];
+ char buf[1024];
char *av[20];
int ac = 0;
+ char *outfile = 0;
switch (type)
{
@@ -1195,9 +1206,17 @@ get_filename_1 (Screen *screen, const char *directory, grab_type type,
# ifdef USE_EXTERNAL_SCREEN_GRABBER
case GRAB_DESK:
av[ac++] = GETIMAGE_SCREEN_PROGRAM;
- if (verbose_p)
- av[ac++] = "--verbose";
- av[ac++] = "--name";
+ av[ac++] = "-x"; /* no sound */
+ av[ac++] = "-t"; /* file type */
+ av[ac++] = "png";
+ {
+ const char *tmpdir = getenv("TMPDIR");
+ if (!tmpdir) tmpdir = "/tmp";
+ outfile = (char *) malloc (strlen(tmpdir) + 20);
+ sprintf (outfile, "%s/xscreensaver.%08x.png",
+ tmpdir, random() % 0xFFFFFFFF);
+ av[ac++] = outfile;
+ }
break;
# endif
@@ -1231,6 +1250,7 @@ get_filename_1 (Screen *screen, const char *directory, grab_type type,
{
sprintf (buf, "%s: couldn't fork", progname);
perror (buf);
+ if (outfile) free (outfile);
return 0;
}
case 0:
@@ -1256,7 +1276,6 @@ get_filename_1 (Screen *screen, const char *directory, grab_type type,
int wait_status = 0;
FILE *f = fdopen (in, "r");
int L;
- char *ret = 0;
close (out); /* don't need this one */
*buf = 0;
@@ -1265,36 +1284,38 @@ get_filename_1 (Screen *screen, const char *directory, grab_type type,
fclose (f);
/* Wait for the child to die. */
- waitpid (-1, &wait_status, 0);
+ waitpid (forked, &wait_status, 0);
L = strlen (buf);
while (L && buf[L-1] == '\n')
buf[--L] = 0;
- if (!*buf)
- return 0;
-
- ret = strdup (buf);
+ if (! outfile)
+ {
+ if (!*buf) return 0;
+ outfile = strdup (buf);
+ }
- if (*ret != '/')
+ if (*outfile != '/')
{
/* Program returned path relative to directory. Prepend dir
to buf so that we can properly stat it. */
- strcpy (buf, directory);
+ char *s2 = (char *) malloc (strlen(buf) + strlen(directory) + 20);
+ strcpy (s2, directory);
if (directory[strlen(directory)-1] != '/')
- strcat (buf, "/");
- strcat (buf, ret);
+ strcat (s2, "/");
+ strcat (s2, outfile);
+ free (outfile);
+ outfile = s2;
}
- if (stat(buf, &st))
- {
- fprintf (stderr, "%s: file does not exist: \"%s\"\n",
- progname, buf);
- free (ret);
- return 0;
- }
- else
- return ret;
+ if (! stat (outfile, &st))
+ return outfile;
+
+ fprintf (stderr, "%s: file does not exist: \"%s\"\n",
+ progname, outfile);
+ free (outfile);
+ return 0;
}
}
@@ -1692,11 +1713,17 @@ get_image (Screen *screen,
case GRAB_BARS:
{
XWindowAttributes xgwa;
+ Window root;
+ int xx, yy;
+ unsigned int bw, d, w = 0, h = 0;
+
COLORBARS:
if (verbose_p)
fprintf (stderr, "%s: drawing colorbars.\n", progname);
XGetWindowAttributes (dpy, window, &xgwa);
- colorbars (screen, xgwa.visual, drawable, xgwa.colormap);
+ XGetGeometry (dpy, drawable, &root, &xx, &yy, &w, &h, &bw, &d);
+ colorbars (screen, xgwa.visual, drawable, xgwa.colormap,
+ (h >= 600 ? 2 : h >= 300 ? 1 : 0));
XSync (dpy, False);
if (! file_prop) file_prop = "";
@@ -1777,6 +1804,43 @@ get_image (Screen *screen,
}
+/* Read a few entries from ~/.xscreensaver and insert them into Xrm.
+ Without this we'd only see the values from the .ad file.
+ */
+static void init_line_handler (int lineno,
+ const char *key, const char *val,
+ void *closure)
+{
+ Display *dpy = (Display *) closure;
+ XrmDatabase db = XtDatabase (dpy);
+
+ if (!strcmp (key, "verbose") ||
+ !strcmp (key, "grabDesktopImages") ||
+ !strcmp (key, "grabVideoFrames") ||
+ !strcmp (key, "chooseRandomImages") ||
+ !strcmp (key, "imageDirectory"))
+ {
+ char *key2 = (char *) malloc (strlen(key) + strlen(progname) + 10);
+ sprintf (key2, "%s.%s", progname, key);
+ /* fprintf (stderr, "%s: XRM: %s = %s\n", progname, key2, val); */
+ XrmPutStringResource (&db, key2, val);
+ free (key2);
+ }
+}
+
+static void
+load_init_file (Display *dpy)
+{
+ const char *home = getenv("HOME");
+ char *fn;
+ if (!home) home = "";
+ fn = (char *) malloc (strlen(home) + 40);
+ sprintf (fn, "%s/.xscreensaver", home);
+ parse_init_file (fn, init_line_handler, dpy);
+ free (fn);
+}
+
+
#ifdef DEBUG
static Bool
mapper (XrmDatabase *db, XrmBindingList bindings, XrmQuarkList quarks,
@@ -1823,14 +1887,13 @@ mapper (XrmDatabase *db, XrmBindingList bindings, XrmQuarkList quarks,
" -directory <path> where to find image files to load\n" \
" -file <filename> load this image file\n" \
"\n" \
- " The XScreenSaver Control Panel (xscreensaver-demo) lets you set the\n"\
- " defaults for these options in your ~/.xscreensaver file.\n" \
+ " The xscreensaver-settings program lets you set the defaults for\n" \
+ " these options in your ~/.xscreensaver file.\n" \
"\n"
int
main (int argc, char **argv)
{
- saver_preferences P;
Widget toplevel;
Display *dpy;
Screen *screen;
@@ -1845,6 +1908,9 @@ main (int argc, char **argv)
char *s;
int i;
+ Bool verbose_p, grab_desktop_p, grab_video_p, random_image_p;
+ char *image_directory;
+
progname = argv[0];
s = strrchr (progname, '/');
if (s) progname = s+1;
@@ -1882,12 +1948,9 @@ main (int argc, char **argv)
for (i = 1; i < argc; i++)
if (argv[i][0] == '-' && argv[i][1] == '-') argv[i]++;
- toplevel = XtAppInitialize (&app, progclass, 0, 0, &argc, argv,
- defaults, 0, 0);
+ toplevel = XtAppInitialize (&app, progclass, 0, 0, &argc, argv, 0, 0, 0);
dpy = XtDisplay (toplevel);
screen = XtScreen (toplevel);
- db = XtDatabase (dpy);
- XtGetApplicationNameAndClass (dpy, &s, &progclass);
XSetErrorHandler (x_ehandler);
XSync (dpy, False);
@@ -1896,9 +1959,13 @@ main (int argc, char **argv)
# undef ya_rand_init
ya_rand_init (0);
- memset (&P, 0, sizeof(P));
- P.db = db;
- load_init_file (dpy, &P);
+ load_init_file (dpy);
+
+ verbose_p = get_boolean_resource(dpy, "verbose", "Boolean");
+ grab_desktop_p = get_boolean_resource(dpy, "grabDesktopImages", "Boolean");
+ grab_video_p = get_boolean_resource(dpy, "grabVideoFrames", "Boolean");
+ random_image_p = get_boolean_resource(dpy, "chooseRandomImages", "Boolean");
+ image_directory = get_string_resource (dpy, "imageDirectory", "String");
progname = argv[0] = oprogname;
@@ -1911,16 +1978,16 @@ main (int argc, char **argv)
has priority over the command line...
*/
if (!strcmp (argv[i], "-v") || !strcmp (argv[i], "-verbose"))
- P.verbose_p = True;
- else if (!strcmp (argv[i], "-desktop")) P.grab_desktop_p = True;
- else if (!strcmp (argv[i], "-no-desktop")) P.grab_desktop_p = False;
- else if (!strcmp (argv[i], "-video")) P.grab_video_p = True;
- else if (!strcmp (argv[i], "-no-video")) P.grab_video_p = False;
- else if (!strcmp (argv[i], "-images")) P.random_image_p = True;
- else if (!strcmp (argv[i], "-no-images")) P.random_image_p = False;
+ verbose_p = True;
+ else if (!strcmp (argv[i], "-desktop")) grab_desktop_p = True;
+ else if (!strcmp (argv[i], "-no-desktop")) grab_desktop_p = False;
+ else if (!strcmp (argv[i], "-video")) grab_video_p = True;
+ else if (!strcmp (argv[i], "-no-video")) grab_video_p = False;
+ else if (!strcmp (argv[i], "-images")) random_image_p = True;
+ else if (!strcmp (argv[i], "-no-images")) random_image_p = False;
else if (!strcmp (argv[i], "-file")) file = argv[++i];
else if (!strcmp (argv[i], "-directory") || !strcmp (argv[i], "-dir"))
- P.image_directory = argv[++i];
+ image_directory = argv[++i];
else if (!strcmp (argv[i], "-root") || !strcmp (argv[i], "root"))
{
if (window)
@@ -1980,12 +2047,13 @@ main (int argc, char **argv)
#ifdef DEBUG
- if (P.verbose_p) /* Print out all the resources we can see. */
+ if (verbose_p) /* Print out all the resources we can see. */
{
XrmName name = { 0 };
XrmClass class = { 0 };
int count = 0;
- XrmEnumerateDatabase (db, &name, &class, XrmEnumAllLevels, mapper,
+ XrmEnumerateDatabase (XtDatabase (dpy),
+ &name, &class, XrmEnumAllLevels, mapper,
(XtPointer) &count);
}
#endif /* DEBUG */
@@ -1993,8 +2061,8 @@ main (int argc, char **argv)
if (!window) abort();
if (!drawable) drawable = window;
- get_image (screen, window, drawable, P.verbose_p,
- P.grab_desktop_p, P.grab_video_p, P.random_image_p,
- P.image_directory, file);
+ get_image (screen, window, drawable, verbose_p,
+ grab_desktop_p, grab_video_p, random_image_p,
+ image_directory, file);
exit (0);
}
diff --git a/hacks/xscreensaver-getimage.man b/hacks/xscreensaver-getimage.man
new file mode 100644
index 0000000..fb5a5bc
--- /dev/null
+++ b/hacks/xscreensaver-getimage.man
@@ -0,0 +1,76 @@
+.TH XScreenSaver 1 "20-Mar-2005 (4.21)" "X Version 11"
+.SH NAME
+xscreensaver-getimage - loads a randomly-selected image onto an X11 Drawable
+for use by screen savers
+.SH SYNOPSIS
+.B xscreensaver-getimage
+[\-display \fIhost:display.screen\fP]
+[\-verbose]
+window-id
+[pixmap-id]
+.SH DESCRIPTION
+The \fIxscreensaver\-getimage\fP program is a helper program for the
+xscreensaver hacks that manipulate images.
+
+This program selects a random image, and puts it on the specified
+window or pixmap. This image might be a snapshot of the desktop; or
+a frame captured from the system's video input; or a randomly-selected
+image from disk.
+
+If only a window ID is specified, the image will be painted there.
+If both a window ID and a pixmap ID are specified, then the image will
+be painted on the pixmap; and the window \fImay\fP be modified as a
+side-effect.
+.SH OPTIONS
+.I xscreensaver-getimage
+reads the \fI~/.xscreensaver\fP file for configuration information.
+It uses these settings:
+.TP 4
+.B grabDesktopImages
+Whether it is acceptable to grab snapshots of the desktop.
+The security paranoid might want to turn this off, to avoid letting
+people see (but not touch!) your desktop while the screen is locked.
+.TP 4
+.B grabVideoFrames
+Whether it is acceptable to grab frames of video from the system's video
+input. Grabbing of video is done by invoking the
+.BR xscreensaver\-getimage\-video (MANSUFFIX)
+program.
+.TP 4
+.B chooseRandomImages
+Whether it is acceptable to display random images found on disk.
+Selection and loading of images is done by invoking the
+.BR xscreensaver\-getimage\-file (MANSUFFIX)
+program.
+.TP 4
+.B imageDirectory
+When loading images from disk, this is the directory to find them in.
+The directory will be searched recursively for images.
+
+It may also be the URL of an RSS or Atom feed, in which case a
+random image from that feed will be selected instead. The contents
+of the feed will be cached locally and refreshed periodically as needed.
+.PP
+If none of the three options are set to True, then video
+colorbars will be displayed instead.
+.SH BUGS
+When grabbing desktop images, the \fIwindow\fP argument will be unmapped
+and have its contents modified, causing flicker. (This does not happen
+when loading image files or video frames.)
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver\-settings (1)
+.BR xscreensaver\-getimage\-file (MANSUFFIX)
+.BR xscreensaver\-getimage\-video (MANSUFFIX)
+.SH COPYRIGHT
+Copyright \(co 2001-2021 by Jamie Zawinski. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 14-Apr-2001
diff --git a/hacks/xscreensaver-text b/hacks/xscreensaver-text
new file mode 100755
index 0000000..421fae7
--- /dev/null
+++ b/hacks/xscreensaver-text
@@ -0,0 +1,1000 @@
+#!/usr/bin/perl -w
+# Copyright © 2005-2021 Jamie Zawinski <jwz@jwz.org>
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation. No representations are made about the suitability of this
+# software for any purpose. It is provided "as is" without express or
+# implied warranty.
+#
+# This program writes some text to stdout, based on preferences in the
+# .xscreensaver file. It may load a file, a URL, run a program, or just
+# print the date.
+#
+# In a native MacOS build of xscreensaver, this script is included in
+# the Contents/Resources/ directory of each screen saver .bundle that
+# uses it; and in that case, it looks up its resources using
+# /usr/bin/defaults instead.
+#
+# Created: 19-Mar-2005.
+
+require 5;
+#use diagnostics; # Fails on some MacOS 10.5 systems
+use strict;
+
+use Socket;
+use POSIX qw(strftime);
+
+# Some Linux systems don't install LWP by default!
+# Only error out if we're actually loading a URL instead of local data.
+BEGIN { eval 'use LWP::UserAgent;' }
+
+# Not sure how prevalent this is. Hope it's part of the default install.
+BEGIN { eval 'use HTML::Entities;' }
+
+# I think this is part of the default install, but just in case.
+BEGIN { eval 'use Text::Wrap qw(wrap);' }
+
+
+my $progname = $0; $progname =~ s@.*/@@g;
+my ($version) = ('$Revision: 1.60 $' =~ m/\s(\d[.\d]+)\s/s);
+
+my $verbose = 0;
+my $http_proxy = undef;
+
+my $config_file = $ENV{HOME} . "/.xscreensaver";
+my $text_mode = 'date';
+my $text_literal = '';
+my $text_file = '';
+my $text_program = '';
+my $text_url = 'https://en.wikipedia.org/w/index.php?title=Special:NewPages&feed=rss';
+# Default URL needs to be set and match what's in OSX/XScreenSaverView.m
+
+my $wrap_columns = undef;
+my $truncate_lines = undef;
+my $latin1_p = 0;
+my $nyarlathotep_p = 0;
+
+
+# Convert any HTML entities to Latin1 characters.
+#
+sub de_entify($) {
+ my ($text) = @_;
+
+ return '' unless defined($text);
+ return $text unless ($text =~ m/&/s);
+
+ # Convert any HTML entities to Unicode characters,
+ # if the HTML::Entities module is installed.
+ eval {
+ my $t2 = $text;
+ $text = undef;
+ $text = HTML::Entities::decode_entities ($t2);
+ };
+ return $text if defined($text);
+
+ # If it's not installed, just complain instead of trying to halfass it.
+ print STDOUT ("\n\tPerl is broken. Do this to repair it:\n" .
+ "\n\tsudo cpan HTML::Entities\n\n");
+ exit (1);
+}
+
+
+# Convert any Unicode characters to Latin1 if possible.
+# Unconvertable bytes are left alone.
+#
+sub utf8_to_latin1($) {
+ my ($text) = @_;
+
+ utf8::encode ($text); # Unpack Unicode back to multi-byte UTF-8.
+
+ # Maybe it would be better to handle this in the Unicode domain
+ # by doing things like s/\x{2018}/\"/g, but without decoding the
+ # string back to UTF-8 first, I'm at a loss as to how to have
+ # "&aacute;" print as "\340" instead of as "\303\240".
+
+ $text =~ s/ \xC2 ( [\xA0-\xFF] ) / $1 /gsex;
+ $text =~ s/ \xC3 ( [\x80-\xFF] ) / chr (ord($1) | 0x40) /gsex;
+
+ # Handles a few 3-byte sequences too.
+ $text =~ s/\xE2\x80\x93/--/gs;
+ $text =~ s/\xE2\x80\x94/--/gs;
+ $text =~ s/\xE2\x80\x98/`/gs;
+ $text =~ s/\xE2\x80\x99/'/gs;
+ $text =~ s/\xE2\x80\x9C/``/gs;
+ $text =~ s/\xE2\x80\x9D/'/gs;
+ $text =~ s/\xE2\x80\xA2/&bull;/gs;
+ $text =~ s/\xE2\x80\xA6/.../gs;
+ $text =~ s/\xE2\x80\xB2/'/gs;
+ $text =~ s/\xE2\x84\xA2/&trade;/gs;
+ $text =~ s/\xE2\x86\x90/ &larr; /gs;
+
+ return $text;
+}
+
+
+# Reads the prefs we use from ~/.xscreensaver
+#
+sub get_x11_prefs() {
+ my $got_any_p = 0;
+
+ if (open (my $in, '<', $config_file)) {
+ print STDERR "$progname: reading $config_file\n" if ($verbose > 1);
+ local $/ = undef; # read entire file
+ my $body = <$in>;
+ close $in;
+ $got_any_p = get_x11_prefs_1 ($body);
+
+ } elsif ($verbose > 1) {
+ print STDERR "$progname: $config_file: $!\n";
+ }
+
+ if (! $got_any_p && defined ($ENV{DISPLAY})) {
+ # We weren't able to read settings from the .xscreensaver file.
+ # Fall back to any settings in the X resource database
+ # (/usr/X11R6/lib/X11/app-defaults/XScreenSaver)
+ #
+ print STDERR "$progname: reading X resources\n" if ($verbose > 1);
+ my $body = `appres XScreenSaver xscreensaver -1`;
+ $got_any_p = get_x11_prefs_1 ($body);
+ }
+
+ if ($verbose > 1) {
+ print STDERR "$progname: mode: $text_mode\n";
+ print STDERR "$progname: literal: $text_literal\n";
+ print STDERR "$progname: file: $text_file\n";
+ print STDERR "$progname: program: $text_program\n";
+ print STDERR "$progname: url: $text_url\n";
+ }
+
+ $text_mode =~ tr/A-Z/a-z/;
+ $text_literal =~ s@\\n@\n@gs;
+ $text_literal =~ s@\\\n@\n@gs;
+}
+
+
+sub get_x11_prefs_1($) {
+ my ($body) = @_;
+
+ my $got_any_p = 0;
+ $body =~ s@\\\n@@gs;
+ $body =~ s@^[ \t]*#[^\n]*$@@gm;
+
+ if ($body =~ m/^[.*]*textMode:[ \t]*([^\s]+)\s*$/im) {
+ $text_mode = $1;
+ $got_any_p = 1;
+ }
+ if ($body =~ m/^[.*]*textLiteral:[ \t]*(.*?)[ \t]*$/im) {
+ $text_literal = $1;
+ }
+ if ($body =~ m/^[.*]*textFile:[ \t]*(.*?)[ \t]*$/im) {
+ $text_file = $1;
+ }
+ if ($body =~ m/^[.*]*textProgram:[ \t]*(.*?)[ \t]*$/im) {
+ $text_program = $1;
+ }
+ if ($body =~ m/^[.*]*textURL:[ \t]*(.*?)[ \t]*$/im) {
+ $text_url = $1;
+ }
+
+ return $got_any_p;
+}
+
+
+sub get_cocoa_prefs($) {
+ my ($id) = @_;
+ my $v;
+
+ print STDERR "$progname: reading Cocoa prefs: \"$id\"\n" if ($verbose > 1);
+
+ $v = get_cocoa_pref_1 ($id, "textMode");
+ $text_mode = $v if defined ($v);
+
+ # The "textMode" pref is set to a number instead of a string because I
+ # couldn't figure out the black magic to make Cocoa bindings work right.
+ #
+ # Update: as of 5.33, Cocoa writes strings instead of numbers, but
+ # pre-existing saved preferences might still have numbers in them.
+ #
+ if ($text_mode eq '0') { $text_mode = 'date'; }
+ elsif ($text_mode eq '1') { $text_mode = 'literal'; }
+ elsif ($text_mode eq '2') { $text_mode = 'file'; }
+ elsif ($text_mode eq '3') { $text_mode = 'url'; }
+ elsif ($text_mode eq '4') { $text_mode = 'program'; }
+
+ $v = get_cocoa_pref_1 ($id, "textLiteral");
+ $text_literal = $v if defined ($v);
+ $text_literal =~ s@\\n@\n@gs;
+ $text_literal =~ s@\\\n@\n@gs;
+
+ $v = get_cocoa_pref_1 ($id, "textFile");
+ $text_file = $v if defined ($v);
+
+ $v = get_cocoa_pref_1 ($id, "textProgram");
+ $text_program = $v if defined ($v);
+
+ $v = get_cocoa_pref_1 ($id, "textURL");
+ $text_url = $v if defined ($v);
+}
+
+
+sub get_cocoa_pref_1($$) {
+ my ($id, $key) = @_;
+ # make sure there's nothing stupid/malicious in either string.
+ $id =~ s/[^-a-z\d. ]/_/gsi;
+ $key =~ s/[^-a-z\d. ]/_/gsi;
+ my $cmd = "defaults -currentHost read \"$id\" \"$key\"";
+
+ print STDERR "$progname: executing $cmd\n"
+ if ($verbose > 3);
+
+ my $val = `$cmd 2>/dev/null`;
+ $val =~ s/^\s+//s;
+ $val =~ s/\s+$//s;
+
+ print STDERR "$progname: Cocoa: $id $key = \"$val\"\n"
+ if ($verbose > 2);
+
+ $val = undef if ($val =~ m/^$/s);
+
+ return $val;
+}
+
+
+# like system() but checks errors.
+#
+sub safe_system(@) {
+ my (@cmd) = @_;
+
+ print STDERR "$progname: executing " . join(' ', @cmd) . "\n"
+ if ($verbose > 3);
+
+ system @cmd;
+ my $exit_value = $? >> 8;
+ my $signal_num = $? & 127;
+ my $dumped_core = $? & 128;
+ error ("$cmd[0]: core dumped!") if ($dumped_core);
+ error ("$cmd[0]: signal $signal_num!") if ($signal_num);
+ error ("$cmd[0]: exited with $exit_value!") if ($exit_value);
+}
+
+
+sub which($) {
+ my ($cmd) = @_;
+
+ if ($cmd =~ m@^\./|^/@) {
+ error ("cannot execute $cmd") unless (-x $cmd);
+ return $cmd;
+ }
+
+ foreach my $dir (split (/:/, $ENV{PATH})) {
+ my $cmd2 = "$dir/$cmd";
+ print STDERR "$progname: checking $cmd2\n" if ($verbose > 3);
+ return $cmd2 if (-x "$cmd2");
+ }
+ error ("$cmd not found on \$PATH");
+}
+
+
+sub output() {
+
+ binmode (STDOUT, ($latin1_p ? ':raw' : ':utf8'));
+ binmode (STDERR, ':utf8');
+
+ # Do some basic sanity checking (null text, null file names, etc.)
+ #
+ if (($text_mode eq 'literal' && $text_literal =~ m/^\s*$/i) ||
+ ($text_mode eq 'file' && $text_file =~ m/^\s*$/i) ||
+ ($text_mode eq 'program' && $text_program =~ m/^\s*$/i) ||
+ ($text_mode eq 'url' && $text_url =~ m/^\s*$/i)) {
+ print STDERR "$progname: falling back to 'date'\n" if ($verbose);
+ $text_mode = 'date';
+ }
+
+ if ($text_mode eq 'literal') {
+ $text_literal = strftime ($text_literal, localtime);
+ $text_literal = utf8_to_latin1($text_literal) if ($latin1_p);
+ $text_literal =~ y/A-Za-z/N-ZA-Mn-za-m/ if ($nyarlathotep_p);
+ print STDOUT $text_literal;
+ print STDOUT "\n" unless ($text_literal =~ m/\n$/s);
+
+ } elsif ($text_mode eq 'file') {
+
+ $text_file =~ s@^~/@$ENV{HOME}/@s; # allow literal "~/"
+
+ if (open (my $in, '<:raw', $text_file)) {
+ print STDERR "$progname: reading $text_file\n" if ($verbose);
+ binmode (STDOUT, ':raw');
+
+ if (($wrap_columns && $wrap_columns > 0) || $truncate_lines) {
+ # read it, then reformat it.
+ local $/ = undef; # read entire file
+ my $body = <$in>;
+ $body = reformat_text ($body);
+ print STDOUT $body;
+ } else {
+ # stream it by lines
+ while (<$in>) {
+ $_ = utf8_to_latin1($_) if ($latin1_p);
+ y/A-Za-z/N-ZA-Mn-za-m/ if ($nyarlathotep_p);
+ print STDOUT $_;
+ }
+ }
+ close $in;
+ } else {
+ error ("$text_file: $!");
+ }
+
+ } elsif ($text_mode eq 'program') {
+
+ my ($prog, $args) = ($text_program =~ m/^([^\s]+)(.*)$/);
+ $text_program = which ($prog) . $args;
+ print STDERR "$progname: running $text_program\n" if ($verbose);
+
+ if (($wrap_columns && $wrap_columns > 0) || $truncate_lines) {
+ # read it, then reformat it.
+ my $lines = 0;
+ my $body = "";
+ my $cmd = "( $text_program ) 2>&1";
+ # $cmd .= " | sed -l"; # line buffer instead of 4k pipe buffer
+ open (my $pipe, '-|:unix', $cmd);
+ while (my $line = <$pipe>) {
+ $body .= $line;
+ $lines++;
+ last if ($truncate_lines && $lines > $truncate_lines);
+ }
+ close $pipe;
+
+ # I don't understand why we must do this here, but must not do this
+ # in the 'file' branch above, which reads the file with :raw...
+ utf8::decode ($body); # Pack multi-byte UTF-8 back into wide chars.
+
+ $body = reformat_text ($body);
+ print STDOUT $body;
+ } else {
+ # stream it
+ safe_system ("$text_program");
+ }
+
+ } elsif ($text_mode eq 'url') {
+
+ get_url_text ($text_url);
+
+ } else { # $text_mode eq 'date'
+
+ my $body = '';
+
+ my $n = `uname -n`;
+ $n =~ s/\.local\n/\n/s;
+ $body .= $n;
+
+ my $unamep = 1;
+
+ # The following code makes an effort to figure out the version of the
+ # OS / distribution, and a one-line summary of the hardware. We can
+ # easily get the kernel version from uname, but the kernel version has
+ # no relevance to anyone's life. The userspace version is what matters.
+ #
+ # In a truly shocking turn of events, nearly every distro uses a different
+ # file to identify itself. Are you shocked? I for one am shocked.
+
+ if (open (my $in, "<:utf8", "/etc/os-release")) {
+ while (<$in>) { # PRETTY_NAME="CentOS Linux 7 (Core)"
+ if (m/^PRETTY_NAME="(.*)"/si) { # PRETTY_NAME="Raspbian 10 (buster)"
+ # Annoying that "10.6" is only in /etc/debian_version and
+ # /etc/os-release only contains "10".
+ $body .= "$1\n";
+ $unamep = 0;
+ last;
+ }
+ }
+ close $in;
+ } elsif (open ($in, "<:utf8", "/etc/lsb-release")) {
+ while (<$in>) { # DISTRIB_DESCRIPTION="Ubuntu 14.04.2 LTS"
+ if (m/^DISTRIB_DESCRIPTION="(.*)"/si) {
+ $body .= "$1\n";
+ $unamep = 0;
+ last;
+ }
+ }
+ close $in;
+ } elsif (-f "/etc/system-release") { # "CentOS Linux release 7.7 (Core)"
+ $body .= `cat /etc/system-release`;
+ } elsif (-f "/etc/redhat-release") { # "Fedora Core release 4 (Stentz)"
+ $body .= `cat /etc/redhat-release`;
+ } elsif (-f "/etc/SuSE-release") { # "SUSE Linux Enterprise Server 11"
+ $body .= `head -1 /etc/SuSE-release`;
+ } elsif (-f "/etc/release") { # "Solaris 10 3/05 s10_74L2a X86"
+ $body .= `head -1 /etc/release`;
+ } elsif (-f "/usr/sbin/system_profiler") { # "Mac OS X 10.4.5 (8H14)"
+ my $sp =
+ `/usr/sbin/system_profiler SPSoftwareDataType SPHardwareDataType 2>&-`;
+ my ($v) = ($sp =~ m/^\s*System Version:\s*(.*)$/mi);
+ my ($s) = ($sp =~ m/^\s*(?:CPU|Processor) Speed:\s*(.*)$/mi);
+ my ($t) = ($sp =~ m/^\s*(?:Machine|Model) Name:\s*(.*)$/mi);
+ my ($m) = ($sp =~ m/^\s*Memory:\s*(.*)$/mi);
+ $t .= ", $m" if $t;
+ $body .= "$v\n" if ($v);
+ $body .= "$s $t\n" if ($s && $t);
+ $unamep = !defined ($v);
+ }
+
+ $body =~ s@ GNU/Linux @ @; # Line is too long for "gltext"
+ $body .= `uname -sr` if ($unamep); # "Linux 2.6.15-1.1831_FC4"
+
+ # If /bin/lscpu exists, we can get some details about the hardware
+ # we're running on. This info also exists in various /proc/ files,
+ # but if /proc/ exists, lscpu probably exists as well.
+ #
+ my $cpu = `lscpu 2>&-`;
+ if ($cpu) {
+ my ($model) = ($cpu =~ m/^Model name:\s*(.*)$/mi);
+ #my ($arch) = ($cpu =~ m/^Architecture:\s*(.*)$/mi);
+ my ($speed) = ($cpu =~ m/^CPU max MHz:\s*(.*)$/mi);
+ ($speed) = ($cpu =~ m/^CPU MHz:\s*(.*)$/mi) unless $speed;
+ if ($speed && $speed >= 1000) {
+ $speed = sprintf("%.1fGHz", $speed/1000);
+ } else {
+ $speed = sprintf("%.1fMHz", $speed);
+ }
+
+ # Abbreviate stupidly verbose marketing nonsense like:
+ # "Intel(R) Xeon(R) CPU E3-1275 v5 @ 3.60GHz" and
+ # "11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz"
+ $model =~ s/\s*\@.*//gs; # GHz
+ $model =~ s/\s*\((R|TM)\)//gs; # So useful!
+ $model =~ s/\s*\b(CPU|Processor)\b//gsi; # It is? Really?
+ $model =~ s/\b\d+[a-z]+ gen //gsi; # Nth Gen
+
+ # Maybe we can tell how much RAM is installed.
+ my $ram = `cat /proc/meminfo 2>&-`;
+ if ($ram && $ram =~ m/^Memtotal:\s+(\d+)/mi) {
+ $ram = $1;
+ if ($ram >= 1024*1024) { $ram = sprintf("%.0fGB", $ram/1024/1024); }
+ elsif ($ram >= 1024) { $ram = sprintf("%.0fMB", $ram/1024); }
+ else { $ram = sprintf("%.0fKB", $ram); }
+ }
+
+ $body .= "$speed" if $speed;
+ $body .= " $model" if $model;
+ #$body .= " $arch" if $arch;
+ $body .= " $ram" if $ram;
+ $body .= "\n";
+ }
+
+ $body =~ s/[ \t]+/ /gm;
+ $body =~ s/^ | $//gm;
+
+ $body .= "\n";
+ $body .= strftime ('%c', localtime);
+ $body .= "\n";
+
+ my $ut = `uptime`;
+ $ut =~ s/^[ \d:]*(am|pm)? *//i;
+ $ut =~ s/,\s*(load)/\n$1/;
+ $body .= "$ut\n";
+
+ if ($truncate_lines) {
+ $body =~ s/^(([^\n]*\n){$truncate_lines}).*$/$1/s;
+ }
+
+ print STDOUT $body;
+ }
+}
+
+
+# Make an educated guess as to what's in this document.
+# We don't necessarily take the Content-Type header at face value.
+# Returns 'html', 'rss', or 'text';
+#
+sub guess_content_type($$) {
+ my ($ct, $body) = @_;
+
+ $body =~ s/^(.{512}).*/$1/s; # only look in first half K of file
+
+ if ($ct =~ m@^text/.*html@i) { return 'html'; }
+ if ($ct =~ m@\b(atom|rss|xml)\b@i) { return 'rss'; }
+
+ if ($body =~ m@^\s*<\?xml@is) { return 'rss'; }
+ if ($body =~ m@^\s*<!DOCTYPE RSS@is) { return 'rss'; }
+ if ($body =~ m@^\s*<!DOCTYPE HTML@is) { return 'html'; }
+
+ if ($body =~ m@<(BASE|HTML|HEAD|BODY|SCRIPT|STYLE|TABLE|A\s+HREF)\b@i) {
+ return 'html';
+ }
+
+ if ($body =~ m@<(RSS|CHANNEL|GENERATOR|DESCRIPTION|CONTENT|FEED|ENTRY)\b@i) {
+ return 'rss';
+ }
+
+ return 'text';
+}
+
+
+sub reformat_html($$) {
+ my ($body, $rss_p) = @_;
+ $_ = $body;
+
+ # In HTML, try to preserve newlines inside of PRE.
+ #
+ if (! $rss_p) {
+ s@(<PRE\b[^<>]*>\s*)(.*?)(</PRE)@{
+ my ($a, $b, $c) = ($1, $2, $3);
+ $b =~ s/[\r\n]/<BR>/gs;
+ $a . $b . $c;
+ }@gsexi;
+ }
+
+ if (! $rss_p) {
+ # In HTML, unfold lines.
+ # In RSS, assume \n means literal line break.
+ s@[\r\n]@ @gsi;
+ }
+
+ # This right here is the part where I doom us all to inhuman
+ # toil for the One whose Name cannot be expressed in the
+ # Basic Multilingual Plane. http://jwz.org/b/yhAT He comes.
+
+ s@<!--.*?-->@@gsi; # lose comments
+ s@<(STYLE|SCRIPT)\b[^<>]*>.*?</\1\s*>@@gsi; # lose css and js
+
+ s@</?(BR|TR|TD|LI|DIV)\b[^<>]*>@\n@gsi; # line break at BR, TD, DIV, etc
+ s@</?(P|UL|OL|BLOCKQUOTE)\b[^<>]*>@\n\n@gsi; # two line breaks
+
+ s@<lj\s+user=\"?([^<>\"]+)\"?[^<>]*>?@$1@gsi; # handle <LJ USER=>
+ s@</?[BI]>@*@gsi; # bold, italic => asterisks
+
+
+ s@<[^<>]*>?@@gs; # lose all other HTML tags
+ $_ = de_entify ($_); # convert HTML entities
+
+ # For Wikipedia: delete anything inside {{ }} and unwrap [[tags]],
+ # among other things.
+ #
+ if ($rss_p eq 'wiki') {
+
+ s@<!--.*?-->@@gsi; # lose HTML comments again
+
+ # Creation line is often truncated: screws up parsing with unbalanced {{.
+ s@(: +[^a-zA-Z ]* *Created page) with [^\n]+@$1@s;
+
+ s@/\*.*?\*/@@si; # /* ... */
+
+ # Try to omit all tables, since they're impossible to read as text.
+ #
+ 1 while (s/\{\{[^{}]*}}/ /gs); # {{ ... }}
+ 1 while (s/\{\|.*?\|\}/\n\n/gs); # {| ... |}
+ 1 while (s/\|-.*?\|/ /gs); # |- ... | (table cell)
+
+ # Convert anchors to something more readable.
+ #
+ s/\[\[([^\[\]\|]+)\|([^\[\]]+)\]\]/$2/gs; # [[link|anchor]]
+ s/\[\[([^:\[\]\|]+)\]\]/$1/gs; # [[anchor]]
+ s/\[https?:[^\[\]\s]+\s+([^\[\]]+)\]/$1/gs; # [url anchor]
+
+ # Convert all references to asterisks.
+ s@\s*<ref>\s*.*?</ref>@*@gs; # <ref> ... <ref> -> "*"
+ s@\n[ \t]*\d+\s*\^\s*http[^\s]+[ \t]*\n@\n@gs; # 1 ^ URL (a Reflist)
+
+ s@\[\[File:([^\|\]]+).*?\]\]@\n$1\n@gs; # [[File: X | ... ]]
+ s@\[\[Category:.*?\]\]@@gs; # omit categories
+
+ s/<[^<>]*>//gs; # Omit all remaining tags
+ s/\'{3,}//gs; # Omit ''' and ''''
+ s/\'\'/\"/gs; # '' -> "
+ s/\`\`/\"/gs; # `` -> "
+ s/\"\"+/\"/gs; # "" -> "
+
+ s/^[ \t]*[*#]+[ \t]*$//gm; # Omit lines with just * or # on them
+
+ # Omit trailing headlines with no text after them (e.g. == Notes ==)
+ 1 while (s/\n==+[ \t]*[^\n=]+[ \t]*==+\s*$/\n/s);
+
+ $_ = de_entify ($_); # convert HTML entities, again
+ }
+
+
+ # elide any remaining non-Latin1 binary data.
+ if ($latin1_p) {
+ utf8::encode ($_); # Unpack Unicode back to multi-byte UTF-8.
+ s/([^\000-\176]+(\s*[^\000-\176]+)[^a-z\d]*)/\xAB...\xBB /g;
+ }
+
+ $_ .= "\n";
+
+ s/[ \t]+$//gm; # lose whitespace at end of line
+ s@\n\n\n+@\n\n@gs; # compress blank lines
+
+ if (!defined($wrap_columns) || $wrap_columns > 0) {
+ # Text::Wrap sometimes dies with "This shouldn't happen" if columns
+ # is small, but not in any predictable way.
+ # Also there's a chance it might not be installed.
+ eval {
+ $Text::Wrap::columns = ($wrap_columns || 72);
+ $Text::Wrap::break = '[\s/|]'; # wrap on slashes for URLs
+
+ $_ = wrap ("", " ", $_); # wrap the lines as a paragraph
+ s/[ \t]+$//gm; # lose whitespace at end of line again
+ };
+ }
+
+ s/^\n+//gs;
+
+ if ($truncate_lines) {
+ s/^(([^\n]*\n){$truncate_lines}).*$/$1/s;
+ }
+
+ $_ = utf8_to_latin1($_) if ($latin1_p);
+ y/A-Za-z/N-ZA-Mn-za-m/ if ($nyarlathotep_p);
+
+ return $_;
+}
+
+
+sub reformat_rss($) {
+ my ($body) = @_;
+
+ my $wiki_p = ($body =~ m@<generator>[^<>]*Wiki@si);
+
+ $body =~ s/(<(ITEM|ENTRY)\b)/\001\001$1/gsi;
+ my @items = split (/\001\001/, $body);
+
+ print STDERR "$progname: converting RSS ($#items items)...\n"
+ if ($verbose > 2);
+
+ shift @items;
+
+ # Let's skip forward in the stream by a random amount, so that if
+ # two copies of ljlatest are running at the same time (e.g., on a
+ # multi-headed machine), they get different text. (Put the items
+ # that we take off the front back on the back.)
+ #
+ if ($#items > 7) {
+ my $n = int (rand ($#items - 5));
+ print STDERR "$progname: rotating by $n items...\n" if ($verbose > 2);
+ while ($n-- > 0) {
+ push @items, (shift @items);
+ }
+ }
+
+ my $out = '';
+
+ my $i = -1;
+ foreach (@items) {
+ $i++;
+
+ my ($title, $author, $body1, $body2, $body3);
+
+ $title = $3 if (m@<((TITLE) [^<>\s]*)[^<>]*>\s*(.*?)\s*</\1>@xsi);
+ $author= $3 if (m@<((DC:CREATOR) [^<>\s]*)[^<>]*>\s*(.*?)\s*</\1>@xsi);
+ $body1 = $3 if (m@<((DESCRIPTION) [^<>\s]*)[^<>]*>\s*(.*?)\s*</\1>@xsi);
+ $body2 = $3 if (m@<((CONTENT) [^<>\s]*)[^<>]*>\s*(.*?)\s*</\1>@xsi);
+ $body3 = $3 if (m@<((SUMMARY) [^<>\s]*)[^<>]*>\s*(.*?)\s*</\1>@xsi);
+
+ # If there are both <description> and <content> or <content:encoded>,
+ # use whichever one contains more text.
+ #
+ if ($body3 && length($body3) >= length($body2 || '')) {
+ $body2 = $body3;
+ }
+ if ($body2 && length($body2) >= length($body1 || '')) {
+ $body1 = $body2;
+ }
+
+ if (! $body1) {
+ if ($title) {
+ print STDERR "$progname: no body in item $i (\"$title\")\n"
+ if ($verbose > 2);
+ } else {
+ print STDERR "$progname: no body or title in item $i\n"
+ if ($verbose > 2);
+ next;
+ }
+ }
+
+ $title = rss_field_to_html ($title || '');
+ $author= rss_field_to_html ($author || '');
+ $body1 = rss_field_to_html ($body1 || '');
+
+ $title = '' if ($body1 eq $title); # Identical in Twitter's atom feed.
+
+ # Omit author if it's in the title or body
+ $author = '' if ($author &&
+ ($title =~ m/\Q$author\E/si ||
+ $body1 =~ m/\Q$author\E/si));
+
+ $title = $author if ($author && !$title);
+ $title = "$author: $title" if ($author && $title);
+
+ $out .= reformat_html ("$title<P>$body1", $wiki_p ? 'wiki' : 'rss');
+ $out .= "\n";
+ }
+
+ if ($truncate_lines) {
+ $out =~ s/^(([^\n]*\n){$truncate_lines}).*$/$1/s;
+ }
+
+ return $out;
+}
+
+
+sub rss_field_to_html($) {
+ my ($body) = @_;
+
+ # If <![CDATA[...]]> is present, everything inside that is HTML,
+ # and not double-encoded.
+ #
+ if ($body =~ m/^\s*<!\[CDATA\[(.*?)\]\s*\]/is) {
+ $body = $1;
+ } else {
+ $body = de_entify ($body); # convert entities to get HTML from XML
+ }
+
+ return $body;
+}
+
+
+sub reformat_text($) {
+ my ($body) = @_;
+
+ # only re-wrap if --cols was specified. Otherwise, dump it as is.
+ #
+ if ($wrap_columns && $wrap_columns > 0) {
+ print STDERR "$progname: wrapping at $wrap_columns...\n" if ($verbose > 2);
+
+ # Text::Wrap sometimes dies with "This shouldn't happen" if columns
+ # is small, but not in any predictable way.
+ # Also there's a chance it might not be installed.
+ eval {
+ $Text::Wrap::columns = $wrap_columns;
+ $Text::Wrap::break = '[\s/]'; # wrap on slashes for URLs
+
+ $body = wrap ("", "", $body);
+ $body =~ s/[ \t]+$//gm;
+ };
+ }
+
+ if ($truncate_lines) {
+ $body =~ s/^(([^\n]*\n){$truncate_lines}).*$/$1/s;
+ }
+
+ $body = utf8_to_latin1($body) if ($latin1_p);
+ $body =~ y/A-Za-z/N-ZA-Mn-za-m/ if ($nyarlathotep_p);
+ return $body;
+}
+
+
+# Figure out what the proxy server should be, either from environment
+# variables or by parsing the output of the (MacOS) program "scutil",
+# which tells us what the system-wide proxy settings are.
+#
+sub set_proxy($) {
+ my ($ua) = @_;
+
+ my $proxy_data = `scutil --proxy 2>/dev/null`;
+ foreach my $proto ('http', 'https') {
+ my ($server) = ($proxy_data =~ m/\b${proto}Proxy\s*:\s*([^\s]+)/si);
+ my ($port) = ($proxy_data =~ m/\b${proto}Port\s*:\s*([^\s]+)/si);
+ my ($enable) = ($proxy_data =~ m/\b${proto}Enable\s*:\s*([^\s]+)/si);
+
+ if ($server && $enable) {
+ # Note: this ignores the "ExceptionsList".
+ my $proto2 = 'http';
+ $ENV{"${proto}_proxy"} = ("${proto2}://" . $server .
+ ($port ? ":$port" : "") . "/");
+ print STDERR "$progname: MacOS $proto proxy: " .
+ $ENV{"${proto}_proxy"} . "\n"
+ if ($verbose > 2);
+ }
+ }
+
+ $ua->env_proxy();
+}
+
+
+sub get_url_text($) {
+ my ($url) = @_;
+
+ my $ua = eval 'LWP::UserAgent->new';
+
+ if (! $ua) {
+ print STDOUT ("\n\tPerl is broken. Do this to repair it:\n" .
+ "\n\tsudo cpan LWP::UserAgent" .
+ " LWP::Protocol::https Mozilla::CA\n\n");
+ return;
+ }
+
+ # Half the time, random Linux systems don't have Mozilla::CA installed,
+ # which results in "Can't verify SSL peers without knowning which
+ # Certificate Authorities to trust".
+ #
+ # I'm going to take a controversial stand here and say that, for the
+ # purposes of plain-text being displayed in a screen saver via RSS,
+ # the chances of a certificate-based man-in-the-middle attack having
+ # a malicious effect on anyone anywhere at any time is so close to
+ # zero that it can be discounted. So, just don't bother validating
+ # SSL connections.
+ #
+ $ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;
+ eval {
+ $ua->ssl_opts (verify_hostname => 0, SSL_verify_mode => 0);
+ };
+
+
+ set_proxy ($ua);
+ $ua->agent ("$progname/$version");
+ my $res = $ua->get ($url);
+ my $body;
+ my $ct;
+
+ if ($res && $res->is_success) {
+ $body = $res->decoded_content || '';
+ $ct = $res->header ('Content-Type') || 'text/plain';
+
+ } else {
+ my $err = ($res ? $res->status_line : '') || '';
+ $err = 'unknown error' unless $err;
+ $err = "$url: $err";
+ # error ($err);
+ $body = "Error loading URL $err\n\n";
+ $ct = 'text/plain';
+ }
+
+ # This is not necessary, since HTTP::Message::decoded_content() has
+ # already done 'decode (<charset-header>, $body)'.
+ # utf8::decode ($body); # Pack multi-byte UTF-8 back into wide chars.
+
+ $ct = guess_content_type ($ct, $body);
+ if ($ct eq 'html') {
+ print STDERR "$progname: converting HTML...\n" if ($verbose > 2);
+ $body = reformat_html ($body, 0);
+ } elsif ($ct eq 'rss') {
+ $body = reformat_rss ($body);
+ } else {
+ print STDERR "$progname: plain text...\n" if ($verbose > 2);
+ $body = reformat_text ($body);
+ }
+ print STDOUT $body;
+}
+
+
+
+sub error($) {
+ my ($err) = @_;
+ print STDERR "$progname: $err\n";
+ exit 1;
+}
+
+sub usage() {
+ print STDERR "usage: $progname [ --options ... ]\n" .
+ ("\n" .
+ " Prints out some text for use by various screensavers,\n" .
+ " according to the options in the ~/.xscreensaver file.\n" .
+ " This may dump the contents of a file, run a program,\n" .
+ " or load a URL.\n".
+ "\n" .
+ " Options:\n" .
+ "\n" .
+ " --date Print the host name and current time.\n" .
+ "\n" .
+ " --text STRING Print out the given text. It may contain %\n" .
+ " escape sequences as per strftime(2).\n" .
+ "\n" .
+ " --file PATH Print the contents of the given file.\n" .
+ " If --cols is specified, re-wrap the lines;\n" .
+ " otherwise, print them as-is.\n" .
+ "\n" .
+ " --program CMD Run the given program and print its output.\n" .
+ " If --cols is specified, re-wrap the output.\n" .
+ "\n" .
+ " --url HTTP-URL Download and print the contents of the HTTP\n" .
+ " document. If it contains HTML, RSS, or Atom,\n" .
+ " it will be converted to plain-text.\n" .
+ "\n" .
+ " --cols N Wrap lines at this column. Default 72.\n" .
+ "\n" .
+ " --lines N No more than N lines of output.\n" .
+ "\n" .
+ " --latin1 Emit Latin1 instead of UTF-8.\n" .
+ "\n");
+ exit 1;
+}
+
+sub main() {
+
+ my $load_p = 1;
+ my $cocoa_id = undef;
+
+ my @oargv = @ARGV;
+ while ($#ARGV >= 0) {
+ $_ = shift @ARGV;
+ if ($_ eq "--verbose") { $verbose++; }
+ elsif (m/^-v+$/) { $verbose += length($_)-1; }
+ elsif (m/^--?date$/) { $text_mode = 'date';
+ $load_p = 0; }
+ elsif (m/^--?text$/) { $text_mode = 'literal';
+ $text_literal = shift @ARGV || '';
+ $text_literal =~ s@\\n@\n@gs;
+ $text_literal =~ s@\\\n@\n@gs;
+ $load_p = 0; }
+ elsif (m/^--?file$/) { $text_mode = 'file';
+ $text_file = shift @ARGV || '';
+ $load_p = 0; }
+ elsif (m/^--?program$/) { $text_mode = 'program';
+ $text_program = shift @ARGV || '';
+ $load_p = 0; }
+ elsif (m/^--?url$/) { $text_mode = 'url';
+ $text_url = shift @ARGV || '';
+ $load_p = 0; }
+ elsif (m/^--?col(umn)?s?$/) { $wrap_columns = 0 + shift @ARGV; }
+ elsif (m/^--?lines?$/) { $truncate_lines = 0 + shift @ARGV; }
+ elsif (m/^--?cocoa$/) { $cocoa_id = shift @ARGV; }
+ elsif (m/^--?latin1$/) { $latin1_p++; }
+ elsif (m/^--?nyarlathotep$/) { $nyarlathotep_p++; }
+ elsif (m/^-./) { usage; }
+ else { usage; }
+ }
+
+ print STDERR "$progname: args: @oargv\n" if ($verbose > 1);
+
+ if (!defined ($cocoa_id)) {
+ # see OSX/XScreenSaverView.m
+ $cocoa_id = $ENV{XSCREENSAVER_CLASSPATH};
+ }
+
+ print STDERR "$progname: Cocoa ID: $cocoa_id\n"
+ if ($verbose > 1 && $cocoa_id);
+
+ if ($load_p) {
+ if (defined ($cocoa_id)) {
+ get_cocoa_prefs($cocoa_id);
+ } else {
+ get_x11_prefs();
+ }
+ }
+
+ output();
+
+
+ if (defined ($cocoa_id)) {
+ #
+ # On MacOS, sleep for 10 seconds between when the last output is
+ # printed, and when this process exits. This is because MacOS
+ # 10.5.0 and later broke ptys in a new and exciting way: basically,
+ # once the process at the end of the pty exits, you have exactly
+ # 1 second to read all the queued data off the pipe before it is
+ # summarily flushed.
+ #
+ # Many of the screen savers were written to depend on being able
+ # to read a small number of bytes, and continue reading until they
+ # reached EOF. This is no longer possible.
+ #
+ # Note that the current MacOS behavior has all four of these
+ # awesome properties: 1) Inconvenient; 2) Has no sane workaround;
+ # 3) Different behavior than MacOS 10.1 through 10.4; and 4)
+ # Different behavior than every other Unix in the world.
+ #
+ # See http://jwz.org/b/DHke, and for those of you inside Apple,
+ # "Problem ID 5606018".
+ #
+ # One workaround would be to rewrite the savers to have an
+ # internal buffer, and always read as much data as possible as
+ # soon as a pipe has input available. However, that's a lot more
+ # work, so instead, let's just not exit right away, and hope that
+ # 10 seconds is enough.
+ #
+ # This will solve the problem for invocations of xscreensaver-text
+ # that produce little output (e.g., date-mode); and won't solve it
+ # in cases where a large amount of text is generated in a short
+ # amount of time (e.g., url-mode.)
+ #
+ my $secs = 10;
+ $secs = 1 if ($truncate_lines < 10); # for 'gltext'
+ sleep ($secs);
+ }
+}
+
+main();
+exit 0;
diff --git a/hacks/xscreensaver-text.man b/hacks/xscreensaver-text.man
new file mode 100644
index 0000000..4c83a93
--- /dev/null
+++ b/hacks/xscreensaver-text.man
@@ -0,0 +1,88 @@
+.TH XScreenSaver 1 "20-Mar-2005 (4.21)" "X Version 11"
+.SH NAME
+xscreensaver\-text - prints some text to stdout, for use by screen savers.
+.SH SYNOPSIS
+.B xscreensaver\-text
+[\--verbose]
+[\--columns \fIN\fP]
+[\--lines \fIN\fP]
+[\--latin1]
+[\--date]
+[\--text \fISTRING\fP]
+[\--file \fIPATH\fP]
+[\--program \fICMD\fP]
+[\--url \fIURL\fP]
+.SH DESCRIPTION
+The \fIxscreensaver\-text\fP script prints out some text for use by
+various screensavers, according to the options set in
+the \fI~/.xscreensaver\fP file. This may dump the contents of a file,
+run a program, or load a URL. The text is reformatted and wrapped as
+appropriate.
+.SH OPTIONS
+.I xscreensaver\-text
+accepts the following options:
+.TP 8
+.B \-\-verbose \fRor\fP \-v
+Print diagnostics to stderr. Multiple \fI-v\fP switches increase the
+amount of output.
+.TP 8
+.B \-\-columns \fIN\fP or \-\-cols \fIN\fP
+Where to wrap lines; default 72 columns.
+.TP 8
+.B \-\-lines \fIN\fP
+Truncate output to at most this many lines. Default: unlimited.
+.TP 8
+.B \-\-latin1
+Convert any UTF-8 characters in the input to their closest Latin1
+equivalent for output.
+.PP
+Command line options may be used to override the settings in the
+~/.xscreensaver file:
+.TP 8
+.B \-\-date
+Print the host name and current time.
+.TP 8
+.B \-\-text \fISTRING\fP
+Print out the given text. It may contain % escape sequences as per
+.BR strftime (2).
+.TP 8
+.B \-\-file \fIPATH\fP
+Print the contents of the given file, re-formatting it as per
+the other options.
+.TP 8
+.B \-\-program \fICMD\fP
+Run the given program and print its output, re-formatting it as per
+the other options.
+.TP 8
+.B \-\-url \fIURL\fP
+Download and print the contents of the web page. If it contains
+HTML, RSS, or Atom, it will be converted to plain-text. This
+re-downloads the document every time it is run.
+
+.SH ENVIRONMENT
+.PP
+.TP 4
+.B HTTP_PROXY, HTTPS_PROXY, http_proxy, or https_proxy
+to get the default proxy host and port.
+.SH BUGS
+URLs should be cached, use "If-Modified-Since", and obey "Expires".
+.SH SEE ALSO
+.BR xscreensaver\-settings (1),
+.BR xscreensaver (1),
+.BR fortune (1),
+.BR phosphor (MANSUFFIX),
+.BR apple2 (MANSUFFIX),
+.BR starwars (MANSUFFIX),
+.BR fontglide (MANSUFFIX),
+.BR dadadodo (1),
+.BR webcollage (MANSUFFIX),
+.SH COPYRIGHT
+Copyright \(co 2005-2021 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 20-Mar-2005.
diff --git a/hacks/xspirograph.man b/hacks/xspirograph.man
index 9280e80..7cc069a 100644
--- a/hacks/xspirograph.man
+++ b/hacks/xspirograph.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "9-Dec-2001" "X Version 11"
.SH NAME
-xspirograph - simulates the rotation of a disk inside a circular rim
+xspirograph \- simulates the rotation of a disk inside a circular rim
.SH SYNOPSIS
.B xspirograph
[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
diff --git a/hacks/xsublim.c b/hacks/xsublim.c
index 719de50..ff0d363 100644
--- a/hacks/xsublim.c
+++ b/hacks/xsublim.c
@@ -84,6 +84,10 @@
/* Includes ******************************************************************/
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -107,6 +111,7 @@
#include "usleep.h"
#include "yarandom.h"
#include "resources.h"
+#include "xft.h"
#include "font-retry.h"
#include "vroot.h"
diff --git a/hacks/xsublim.man b/hacks/xsublim.man
index 1954c8d..68a4928 100644
--- a/hacks/xsublim.man
+++ b/hacks/xsublim.man
@@ -1,6 +1,6 @@
.TH XSublim 1 "16-Jul-99" "X Version 11"
.SH NAME
-xsublim - Display (submit) "subliminal" (conform) messages (obey)
+xsublim \- Display (submit) "subliminal" (conform) messages (obey)
.SH SYNOPSIS
.B xsublim
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-font \fIfont\fP] [\-file \fIfilename\fP] [\-program \fIexecutable\fP] [\-delayShow \fIms\fP] [\-delayWord \fIms\fP] [\-delayPhraseMin \fIms\fP] [\-delayPhraseMax \fIms\fP] [\-random] [\-no\-random] [\-screensaver] [\-no\-screensaver] [\-outline] [\-no\-outline] [\-center] [\-no\-center]
diff --git a/hacks/zoom.man b/hacks/zoom.man
index 3d8f750..5ef9bbf 100644
--- a/hacks/zoom.man
+++ b/hacks/zoom.man
@@ -1,6 +1,6 @@
.TH XScreenSaver 1 "20-Nov-2000" "X Version 11"
.SH NAME
-zoom - wander around magnified desktop
+zoom \- wander around magnified desktop
.SH SYNOPSIS
.B zoom
[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
@@ -23,7 +23,7 @@ or from a random file on disk, as indicated by
the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
file; see
-.BR xscreensaver-demo (1)
+.BR xscreensaver\-settings (1)
for more details.
.SH OPTIONS
.I zoom
@@ -93,8 +93,8 @@ stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1),
-.BR xscreensaver\-demo (1),
-.BR xscreensaver\-getimage (1)
+.BR xscreensaver\-settings (1),
+.BR xscreensaver\-getimage (MANSUFFIX)
.SH COPYRIGHT
Copyright \(co 2000 by James Macnicol. Permission to use, copy, modify,
distribute, and sell this software and its documentation for any purpose is
diff --git a/install-sh b/install-sh
index ebc6691..ec298b5 100644..100755
--- a/install-sh
+++ b/install-sh
@@ -1,250 +1,541 @@
-#! /bin/sh
-#
+#!/bin/sh
# install - install a program, script, or datafile
-# This comes from X11R5 (mit/util/scripts/install.sh).
+
+scriptversion=2020-11-14.01; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-# Copyright 1991 by the Massachusetts Institute of Technology
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
#
-# Permission to use, copy, modify, distribute, and sell this software and its
-# documentation for any purpose is hereby granted without fee, provided that
-# the above copyright notice appear in all copies and that both that
-# copyright notice and this permission notice appear in supporting
-# documentation, and that the name of M.I.T. not be used in advertising or
-# publicity pertaining to distribution of the software without specific,
-# written prior permission. M.I.T. makes no representations about the
-# suitability of this software for any purpose. It is provided "as is"
-# without express or implied warranty.
+#
+# FSF changes to this file are in the public domain.
#
# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
+# 'make' implicit rules from creating a file called install from it
# when there is no Makefile.
#
# This script is compatible with the BSD install script, but was written
-# from scratch. It can only install one file at a time, a restriction
-# shared with many OS's install programs.
+# from scratch.
+
+tab=' '
+nl='
+'
+IFS=" $tab$nl"
+# Set DOITPROG to "echo" to test this script.
-# set DOITPROG to echo to test this script
+doit=${DOITPROG-}
+doit_exec=${doit:-exec}
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit="${DOITPROG-}"
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
-# put in absolute paths if you don't have them in your path; or use env. vars.
+posix_mkdir=
-mvprog="${MVPROG-mv}"
-cpprog="${CPPROG-cp}"
-chmodprog="${CHMODPROG-chmod}"
-chownprog="${CHOWNPROG-chown}"
-chgrpprog="${CHGRPPROG-chgrp}"
-stripprog="${STRIPPROG-strip}"
-rmprog="${RMPROG-rm}"
-mkdirprog="${MKDIRPROG-mkdir}"
+# Desired mode of installed file.
+mode=0755
-transformbasename=""
-transform_arg=""
-instcmd="$mvprog"
-chmodcmd="$chmodprog 0755"
-chowncmd=""
-chgrpcmd=""
-stripcmd=""
+# Create dirs (including intermediate dirs) using mode 755.
+# This is like GNU 'install' as of coreutils 8.32 (2020).
+mkdir_umask=22
+
+backupsuffix=
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
rmcmd="$rmprog -f"
-mvcmd="$mvprog"
-src=""
-dst=""
-dir_arg=""
-
-while [ x"$1" != x ]; do
- case $1 in
- -c) instcmd="$cpprog"
- shift
- continue;;
-
- -d) dir_arg=true
- shift
- continue;;
-
- -m) chmodcmd="$chmodprog $2"
- shift
- shift
- continue;;
-
- -o) chowncmd="$chownprog $2"
- shift
- shift
- continue;;
-
- -g) chgrpcmd="$chgrpprog $2"
- shift
- shift
- continue;;
-
- -s) stripcmd="$stripprog"
- shift
- continue;;
-
- -t=*) transformarg=`echo $1 | sed 's/-t=//'`
- shift
- continue;;
-
- -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
- shift
- continue;;
-
- *) if [ x"$src" = x ]
- then
- src=$1
- else
- # this colon is to work around a 386BSD /bin/sh bug
- :
- dst=$1
- fi
- shift
- continue;;
- esac
-done
+stripcmd=
-if [ x"$src" = x ]
-then
- echo "install: no input file specified"
- exit 1
-else
- true
-fi
+src=
+dst=
+dir_arg=
+dst_arg=
-if [ x"$dir_arg" != x ]; then
- dst=$src
- src=""
-
- if [ -d $dst ]; then
- instcmd=:
- else
- instcmd=mkdir
- fi
-else
+copy_on_change=false
+is_target_a_directory=possibly
-# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
-# might cause directories to be created, which would be especially bad
-# if $src (and thus $dsttmp) contains '*'.
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+ or: $0 [OPTION]... SRCFILES... DIRECTORY
+ or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+ or: $0 [OPTION]... -d DIRECTORIES...
- if [ -f $src -o -d $src ]
- then
- true
- else
- echo "install: $src does not exist"
- exit 1
- fi
-
- if [ x"$dst" = x ]
- then
- echo "install: no destination specified"
- exit 1
- else
- true
- fi
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
-# If destination is a directory, append the input filename; if your system
-# does not like double slashes in filenames, you may need to add some logic
+Options:
+ --help display this help and exit.
+ --version display version info and exit.
- if [ -d $dst ]
- then
- dst="$dst"/`basename $src`
- else
- true
- fi
-fi
+ -c (ignored)
+ -C install only if different (preserve data modification time)
+ -d create directories instead of installing files.
+ -g GROUP $chgrpprog installed files to GROUP.
+ -m MODE $chmodprog installed files to MODE.
+ -o USER $chownprog installed files to USER.
+ -p pass -p to $cpprog.
+ -s $stripprog installed files.
+ -S SUFFIX attempt to back up existing files, with suffix SUFFIX.
+ -t DIRECTORY install into DIRECTORY.
+ -T report an error if DSTFILE is a directory.
-## this sed command emulates the dirname command
-dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+Environment variables override the default commands:
+ CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+ RMPROG STRIPPROG
-# Make sure that the destination directory exists.
-# this part is taken from Noah Friedman's mkinstalldirs script
+By default, rm is invoked with -f; when overridden with RMPROG,
+it's up to you to specify -f if you want it.
-# Skip lots of stat calls in the usual case.
-if [ ! -d "$dstdir" ]; then
-defaultIFS='
-'
-IFS="${IFS-${defaultIFS}}"
+If -S is not specified, no backups are attempted.
-oIFS="${IFS}"
-# Some sh's can't handle IFS=/ for some reason.
-IFS='%'
-set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
-IFS="${oIFS}"
+Email bug reports to bug-automake@gnu.org.
+Automake home page: https://www.gnu.org/software/automake/
+"
-pathcomp=''
+while test $# -ne 0; do
+ case $1 in
+ -c) ;;
-while [ $# -ne 0 ] ; do
- pathcomp="${pathcomp}${1}"
- shift
+ -C) copy_on_change=true;;
- if [ ! -d "${pathcomp}" ] ;
- then
- $mkdirprog "${pathcomp}"
- else
- true
- fi
+ -d) dir_arg=true;;
- pathcomp="${pathcomp}/"
-done
-fi
+ -g) chgrpcmd="$chgrpprog $2"
+ shift;;
-if [ x"$dir_arg" != x ]
-then
- $doit $instcmd $dst &&
+ --help) echo "$usage"; exit $?;;
- if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
- if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
- if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
- if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
-else
+ -m) mode=$2
+ case $mode in
+ *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+ echo "$0: invalid mode: $mode" >&2
+ exit 1;;
+ esac
+ shift;;
-# If we're going to rename the final executable, determine the name now.
+ -o) chowncmd="$chownprog $2"
+ shift;;
- if [ x"$transformarg" = x ]
- then
- dstfile=`basename $dst`
- else
- dstfile=`basename $dst $transformbasename |
- sed $transformarg`$transformbasename
- fi
+ -p) cpprog="$cpprog -p";;
-# don't allow the sed command to completely eliminate the filename
+ -s) stripcmd=$stripprog;;
- if [ x"$dstfile" = x ]
- then
- dstfile=`basename $dst`
- else
- true
- fi
+ -S) backupsuffix="$2"
+ shift;;
-# Make a temp file name in the proper directory.
+ -t)
+ is_target_a_directory=always
+ dst_arg=$2
+ # Protect names problematic for 'test' and other utilities.
+ case $dst_arg in
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
+ esac
+ shift;;
- dsttmp=$dstdir/#inst.$$#
+ -T) is_target_a_directory=never;;
-# Move or copy the file name to the temp name
+ --version) echo "$0 $scriptversion"; exit $?;;
- $doit $instcmd $src $dsttmp &&
+ --) shift
+ break;;
- trap "rm -f ${dsttmp}" 0 &&
+ -*) echo "$0: invalid option: $1" >&2
+ exit 1;;
-# and set any options; do chmod last to preserve setuid bits
+ *) break;;
+ esac
+ shift
+done
-# If any of these fail, we abort the whole thing. If we want to
-# ignore errors from any of these, just make sure not to ignore
-# errors from the above "$doit $instcmd $src $dsttmp" command.
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
- if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
- if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
- if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
- if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+if test -n "$dir_arg"; then
+ if test -n "$dst_arg"; then
+ echo "$0: target directory not allowed when installing a directory." >&2
+ exit 1
+ fi
+fi
-# Now rename the file to the real destination.
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+ # When -d is used, all remaining arguments are directories to create.
+ # When -t is used, the destination is already specified.
+ # Otherwise, the last argument is the destination. Remove it from $@.
+ for arg
+ do
+ if test -n "$dst_arg"; then
+ # $@ is not empty: it contains at least $arg.
+ set fnord "$@" "$dst_arg"
+ shift # fnord
+ fi
+ shift # arg
+ dst_arg=$arg
+ # Protect names problematic for 'test' and other utilities.
+ case $dst_arg in
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
+ esac
+ done
+fi
+
+if test $# -eq 0; then
+ if test -z "$dir_arg"; then
+ echo "$0: no input file specified." >&2
+ exit 1
+ fi
+ # It's OK to call 'install-sh -d' without argument.
+ # This can happen when creating conditional directories.
+ exit 0
+fi
+
+if test -z "$dir_arg"; then
+ if test $# -gt 1 || test "$is_target_a_directory" = always; then
+ if test ! -d "$dst_arg"; then
+ echo "$0: $dst_arg: Is not a directory." >&2
+ exit 1
+ fi
+ fi
+fi
- $doit $rmcmd -f $dstdir/$dstfile &&
- $doit $mvcmd $dsttmp $dstdir/$dstfile
+if test -z "$dir_arg"; then
+ do_exit='(exit $ret); exit $ret'
+ trap "ret=129; $do_exit" 1
+ trap "ret=130; $do_exit" 2
+ trap "ret=141; $do_exit" 13
+ trap "ret=143; $do_exit" 15
+
+ # Set umask so as not to create temps with too-generous modes.
+ # However, 'strip' requires both read and write access to temps.
+ case $mode in
+ # Optimize common cases.
+ *644) cp_umask=133;;
+ *755) cp_umask=22;;
+
+ *[0-7])
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw='% 200'
+ fi
+ cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+ *)
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw=,u+rw
+ fi
+ cp_umask=$mode$u_plus_rw;;
+ esac
+fi
-fi &&
+for src
+do
+ # Protect names problematic for 'test' and other utilities.
+ case $src in
+ -* | [=\(\)!]) src=./$src;;
+ esac
+
+ if test -n "$dir_arg"; then
+ dst=$src
+ dstdir=$dst
+ test -d "$dstdir"
+ dstdir_status=$?
+ # Don't chown directories that already exist.
+ if test $dstdir_status = 0; then
+ chowncmd=""
+ fi
+ else
+
+ # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+ # might cause directories to be created, which would be especially bad
+ # if $src (and thus $dsttmp) contains '*'.
+ if test ! -f "$src" && test ! -d "$src"; then
+ echo "$0: $src does not exist." >&2
+ exit 1
+ fi
+
+ if test -z "$dst_arg"; then
+ echo "$0: no destination specified." >&2
+ exit 1
+ fi
+ dst=$dst_arg
+
+ # If destination is a directory, append the input filename.
+ if test -d "$dst"; then
+ if test "$is_target_a_directory" = never; then
+ echo "$0: $dst_arg: Is a directory" >&2
+ exit 1
+ fi
+ dstdir=$dst
+ dstbase=`basename "$src"`
+ case $dst in
+ */) dst=$dst$dstbase;;
+ *) dst=$dst/$dstbase;;
+ esac
+ dstdir_status=0
+ else
+ dstdir=`dirname "$dst"`
+ test -d "$dstdir"
+ dstdir_status=$?
+ fi
+ fi
+
+ case $dstdir in
+ */) dstdirslash=$dstdir;;
+ *) dstdirslash=$dstdir/;;
+ esac
+
+ obsolete_mkdir_used=false
+
+ if test $dstdir_status != 0; then
+ case $posix_mkdir in
+ '')
+ # With -d, create the new directory with the user-specified mode.
+ # Otherwise, rely on $mkdir_umask.
+ if test -n "$dir_arg"; then
+ mkdir_mode=-m$mode
+ else
+ mkdir_mode=
+ fi
+
+ posix_mkdir=false
+ # The $RANDOM variable is not portable (e.g., dash). Use it
+ # here however when possible just to lower collision chance.
+ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+
+ trap '
+ ret=$?
+ rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
+ exit $ret
+ ' 0
+
+ # Because "mkdir -p" follows existing symlinks and we likely work
+ # directly in world-writeable /tmp, make sure that the '$tmpdir'
+ # directory is successfully created first before we actually test
+ # 'mkdir -p'.
+ if (umask $mkdir_umask &&
+ $mkdirprog $mkdir_mode "$tmpdir" &&
+ exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
+ then
+ if test -z "$dir_arg" || {
+ # Check for POSIX incompatibilities with -m.
+ # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+ # other-writable bit of parent directory when it shouldn't.
+ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+ test_tmpdir="$tmpdir/a"
+ ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
+ case $ls_ld_tmpdir in
+ d????-?r-*) different_mode=700;;
+ d????-?--*) different_mode=755;;
+ *) false;;
+ esac &&
+ $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
+ ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
+ test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+ }
+ }
+ then posix_mkdir=:
+ fi
+ rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
+ else
+ # Remove any dirs left behind by ancient mkdir implementations.
+ rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
+ fi
+ trap '' 0;;
+ esac
+ if
+ $posix_mkdir && (
+ umask $mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+ )
+ then :
+ else
+
+ # mkdir does not conform to POSIX,
+ # or it failed possibly due to a race condition. Create the
+ # directory the slow way, step by step, checking for races as we go.
+
+ case $dstdir in
+ /*) prefix='/';;
+ [-=\(\)!]*) prefix='./';;
+ *) prefix='';;
+ esac
+
+ oIFS=$IFS
+ IFS=/
+ set -f
+ set fnord $dstdir
+ shift
+ set +f
+ IFS=$oIFS
+
+ prefixes=
+
+ for d
+ do
+ test X"$d" = X && continue
+
+ prefix=$prefix$d
+ if test -d "$prefix"; then
+ prefixes=
+ else
+ if $posix_mkdir; then
+ (umask $mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+ # Don't fail if two instances are running concurrently.
+ test -d "$prefix" || exit 1
+ else
+ case $prefix in
+ *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) qprefix=$prefix;;
+ esac
+ prefixes="$prefixes '$qprefix'"
+ fi
+ fi
+ prefix=$prefix/
+ done
+
+ if test -n "$prefixes"; then
+ # Don't fail if two instances are running concurrently.
+ (umask $mkdir_umask &&
+ eval "\$doit_exec \$mkdirprog $prefixes") ||
+ test -d "$dstdir" || exit 1
+ obsolete_mkdir_used=true
+ fi
+ fi
+ fi
+
+ if test -n "$dir_arg"; then
+ { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+ { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+ else
+
+ # Make a couple of temp file names in the proper directory.
+ dsttmp=${dstdirslash}_inst.$$_
+ rmtmp=${dstdirslash}_rm.$$_
+
+ # Trap to clean up those temp files at exit.
+ trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+ # Copy the file name to the temp name.
+ (umask $cp_umask &&
+ { test -z "$stripcmd" || {
+ # Create $dsttmp read-write so that cp doesn't create it read-only,
+ # which would cause strip to fail.
+ if test -z "$doit"; then
+ : >"$dsttmp" # No need to fork-exec 'touch'.
+ else
+ $doit touch "$dsttmp"
+ fi
+ }
+ } &&
+ $doit_exec $cpprog "$src" "$dsttmp") &&
+
+ # and set any options; do chmod last to preserve setuid bits.
+ #
+ # If any of these fail, we abort the whole thing. If we want to
+ # ignore errors from any of these, just make sure not to ignore
+ # errors from the above "$doit $cpprog $src $dsttmp" command.
+ #
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+ { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+ { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+ # If -C, don't bother to copy if it wouldn't change the file.
+ if $copy_on_change &&
+ old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
+ new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
+ set -f &&
+ set X $old && old=:$2:$4:$5:$6 &&
+ set X $new && new=:$2:$4:$5:$6 &&
+ set +f &&
+ test "$old" = "$new" &&
+ $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+ then
+ rm -f "$dsttmp"
+ else
+ # If $backupsuffix is set, and the file being installed
+ # already exists, attempt a backup. Don't worry if it fails,
+ # e.g., if mv doesn't support -f.
+ if test -n "$backupsuffix" && test -f "$dst"; then
+ $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
+ fi
+
+ # Rename the file to the real destination.
+ $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+ # The rename failed, perhaps because mv can't rename something else
+ # to itself, or perhaps because mv is so ancient that it does not
+ # support -f.
+ {
+ # Now remove or move aside any old file at destination location.
+ # We try this two ways since rm can't unlink itself on some
+ # systems and the destination file might be busy for other
+ # reasons. In this case, the final cleanup might fail but the new
+ # file should still install successfully.
+ {
+ test ! -f "$dst" ||
+ $doit $rmcmd "$dst" 2>/dev/null ||
+ { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+ { $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
+ } ||
+ { echo "$0: cannot unlink or rename $dst" >&2
+ (exit 1); exit 1
+ }
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dst"
+ }
+ fi || exit 1
+
+ trap '' 0
+ fi
+done
-exit 0
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/intltool-update.in b/intltool-update.in
index 2eae87b..06cf689 100644..100755
--- a/intltool-update.in
+++ b/intltool-update.in
@@ -569,8 +569,8 @@ sub find_package_name
my ($conf_in, $src_dir);
if ($base_dirname =~ /^po(-.+)?$/) {
- if (-f "../configure.in") {
- $conf_in = "../configure.in";
+ if (-f "../configure.ac") {
+ $conf_in = "../configure.ac";
} else {
my $makefile_source;
local (*IN);
@@ -584,7 +584,7 @@ sub find_package_name
$src_dir =~ s/^top_srcdir[ \t]*=[ \t]*([^ \t\n\r]*)/$1/;
# print "${src_dir}\n";
chomp $src_dir;
- $conf_in = "$src_dir" . "/configure.in" . "\n";
+ $conf_in = "$src_dir" . "/configure.ac" . "\n";
last;
}
}
diff --git a/jwxyz/Makefile.in b/jwxyz/Makefile.in
index 0ba48a6..1f6d6ae 100644
--- a/jwxyz/Makefile.in
+++ b/jwxyz/Makefile.in
@@ -1,4 +1,4 @@
-# utils/Makefile.in --- xscreensaver, Copyright (c) 1997-2010 Jamie Zawinski.
+# utils/Makefile.in --- xscreensaver, Copyright © 1997-2021 Jamie Zawinski.
# the `../configure' script generates `jwxyz/Makefile' from this file.
# JWXYZ Is Not Xlib.
@@ -97,8 +97,8 @@ TAGS: tags
tags:
find $(srcdir) -name '*.[chly]' -print | xargs etags -a
-echo_tarfiles:
- @echo $(TARFILES)
+list_tarfiles:
+ @find $(TARFILES) -type f -print | sort
# How we build object files in this directory.
@@ -106,30 +106,6 @@ echo_tarfiles:
$(CC) -c $(INCLUDES) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) $<
-# Rules for generating the VMS makefiles on Unix, so that it doesn't have to
-# be done by hand...
-#
-VMS_AXP_COMPILE=$$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-])
-
-compile_axp.com: Makefile.in
- @echo generating $@ from $<... ; \
- ( ( for c in $(SRCS) vms-*.c ; do \
- c=`echo $$c | tr a-z A-Z` ; \
- echo "$(VMS_AXP_COMPILE) $$c" ; \
- done ; \
- ) | sort -d ; \
- echo '$$ lib/cre utils.olb_axp' ; \
- echo '$$ lib utils.olb_axp *.obj' ; \
- echo '$$! delete/noconf *.obj;' ; \
- ) > $@
-
-compile_decc.com: compile_axp.com
- @echo generating $@ from $<... ; \
- sed 's/axp/decc/g' < $< > $@
-
-distdepend:: compile_axp.com compile_decc.com
-
-
##############################################################################
#
# DO NOT DELETE: updated by make distdepend
diff --git a/jwxyz/jwxyz-android.c b/jwxyz/jwxyz-android.c
index 85ce924..c84028b 100644
--- a/jwxyz/jwxyz-android.c
+++ b/jwxyz/jwxyz-android.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2016-2018 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 2016-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -7,13 +7,19 @@
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
- *
- * This file is three related things:
- *
- * - It is the Android-specific C companion to jwxyz-gl.c;
- * - It is how C calls into Java to do things that OpenGL does not
- * have access to without Java-based APIs;
- * - It is how the jwxyz.java class calls into C to run the hacks.
+ */
+
+/* JWXYZ Is Not Xlib.
+
+ See the comment at the top of jwxyz-common.c for an explanation of
+ the division of labor between these various modules.
+
+ This file is three related things:
+
+ - It is the Android-specific companion to jwxyz-gl.c or jwxyz-image.c;
+ - It is how C calls into Java to do things that OpenGL does not have
+ access to without Java-based APIs;
+ - It is how the jwxyz.java class calls into C to run the hacks.
*/
#ifdef HAVE_ANDROID /* whole file */
@@ -25,8 +31,13 @@
#include <math.h>
#include <setjmp.h>
+#define GL_GLEXT_PROTOTYPES
+
#include <GLES/gl.h>
#include <GLES/glext.h>
+#ifdef HAVE_GLES3
+# include <GLES3/gl3.h>
+#endif
#include <jni.h>
#include <android/bitmap.h>
#include <android/log.h>
@@ -228,6 +239,202 @@ prepare_context (struct running_hack *rh)
}
+static void
+get_egl_config_android(Window window, EGLDisplay *egl_display,
+ EGLConfig *egl_config)
+{
+# define R EGL_RED_SIZE
+# define G EGL_GREEN_SIZE
+# define B EGL_BLUE_SIZE
+# define A EGL_ALPHA_SIZE
+# define D EGL_DEPTH_SIZE
+# define I EGL_BUFFER_SIZE
+# define ST EGL_STENCIL_SIZE
+ EGLint templates[][40] = {
+ { R,8, G,8, B,8, A,8, D,8, ST,1, EGL_NONE }, /* rgba stencil */
+ { R,8, G,8, B,8, D,8, ST,1, EGL_NONE }, /* rgb stencil */
+ { R,4, G,4, B,4, D,4, ST,1, EGL_NONE },
+ { R,2, G,2, B,2, D,2, ST,1, EGL_NONE },
+ { R,8, G,8, B,8, A,8, D,8, EGL_NONE }, /* rgba */
+ { R,8, G,8, B,8, D,8, EGL_NONE }, /* rgb */
+ { R,4, G,4, B,4, D,4, EGL_NONE },
+ { R,2, G,2, B,2, D,2, EGL_NONE },
+ { R,1, G,1, B,1, D,1, EGL_NONE } /* monochrome */
+ };
+ EGLint attrs[40];
+ EGLint nconfig;
+ int i, j, k, iter, pass;
+
+ char *glsls = get_string_resource_window (window, "prefersGLSL");
+ Bool glslp = (glsls && !strcasecmp(glsls, "true"));
+ iter = (glslp ? 2 : 1);
+
+ *egl_config = 0;
+ for (pass = 0; pass < iter; pass++)
+ {
+ for (i = 0; i < countof(templates); i++)
+ {
+ for (j = 0, k = 0; templates[i][j] != EGL_NONE; j += 2)
+ {
+ attrs[k++] = templates[i][j];
+ attrs[k++] = templates[i][j+1];
+ }
+
+ attrs[k++] = EGL_RENDERABLE_TYPE;
+# ifdef HAVE_GLES3
+ if (glslp && pass == 0)
+ attrs[k++] = EGL_OPENGL_ES3_BIT;
+ else
+ attrs[k++] = EGL_OPENGL_ES_BIT;
+# else
+ attrs[k++] = EGL_OPENGL_ES_BIT;
+# endif
+
+ attrs[k++] = EGL_NONE;
+
+ nconfig = -1;
+ if (eglChooseConfig (egl_display, attrs, egl_config, 1, &nconfig)
+ && nconfig == 1)
+ break;
+ }
+ if (i < countof(templates))
+ break;
+ }
+ Assert (*egl_config != 0, "no EGL config chosen");
+#if 1
+ {
+ int i;
+ const struct { int hexp; EGLint i; const char *s; } fields[] = {
+ { 1, EGL_CONFIG_ID, "config ID:" },
+ { 1, EGL_CONFIG_CAVEAT, "caveat:" },
+ { 1, EGL_CONFORMANT, "conformant:" },
+ { 0, EGL_COLOR_BUFFER_TYPE, "buffer type:" },
+ { 0, EGL_RED_SIZE, "color size:" },
+ { 0, EGL_TRANSPARENT_RED_VALUE, "transparency:" },
+ { 0, EGL_BUFFER_SIZE, "buffer size:" },
+ { 0, EGL_DEPTH_SIZE, "depth size:" },
+ { 0, EGL_LUMINANCE_SIZE, "lum size:" },
+ { 0, EGL_STENCIL_SIZE, "stencil size:" },
+ { 0, EGL_ALPHA_MASK_SIZE, "alpha mask:" },
+ { 0, EGL_LEVEL, "level:" },
+ { 0, EGL_SAMPLES, "samples:" },
+ { 0, EGL_SAMPLE_BUFFERS, "sample bufs:" },
+ { 0, EGL_NATIVE_RENDERABLE, "native render:" },
+ { 1, EGL_NATIVE_VISUAL_TYPE, "native type:" },
+ { 1, EGL_RENDERABLE_TYPE, "render type:" },
+ { 0, EGL_SURFACE_TYPE, "surface type:" },
+ { 0, EGL_BIND_TO_TEXTURE_RGB, "bind RGB:" },
+ { 0, EGL_BIND_TO_TEXTURE_RGBA, "bind RGBA:" },
+ { 0, EGL_MAX_PBUFFER_WIDTH, "buffer width:" },
+ { 0, EGL_MAX_PBUFFER_HEIGHT, "buffer height:" },
+ { 0, EGL_MAX_PBUFFER_PIXELS, "buffer pixels:" },
+ { 0, EGL_MAX_SWAP_INTERVAL, "max swap:" },
+ { 0, EGL_MIN_SWAP_INTERVAL, "min swap:" },
+ };
+ EGLint r=0, g=0, b=0, a=0, tt=0, tr=0, tg=0, tb=0;
+ eglGetConfigAttrib (egl_display, *egl_config, EGL_RED_SIZE, &r);
+ eglGetConfigAttrib (egl_display, *egl_config, EGL_GREEN_SIZE, &g);
+ eglGetConfigAttrib (egl_display, *egl_config, EGL_BLUE_SIZE, &b);
+ eglGetConfigAttrib (egl_display, *egl_config, EGL_ALPHA_SIZE, &a);
+ eglGetConfigAttrib (egl_display, *egl_config,
+ EGL_TRANSPARENT_TYPE, &tt);
+ eglGetConfigAttrib (egl_display, *egl_config,
+ EGL_TRANSPARENT_RED_VALUE, &tr);
+ eglGetConfigAttrib (egl_display, *egl_config,
+ EGL_TRANSPARENT_GREEN_VALUE,&tg);
+ eglGetConfigAttrib (egl_display, *egl_config,
+ EGL_TRANSPARENT_BLUE_VALUE, &tb);
+ for (i = 0; i < countof(fields); i++)
+ {
+ EGLint v = 0;
+ char s[100];
+ eglGetConfigAttrib (egl_display, *egl_config, fields[i].i, &v);
+ if (fields[i].i == EGL_RED_SIZE)
+ sprintf (s, "%d, %d, %d, %d", r, g, b, a);
+ else if (fields[i].i == EGL_TRANSPARENT_RED_VALUE && tt != EGL_NONE)
+ sprintf (s, "%d, %d, %d", tr, tg, tb);
+ else if (fields[i].i == EGL_CONFIG_CAVEAT)
+ strcpy (s, (v == EGL_NONE ? "none" :
+ v == EGL_SLOW_CONFIG ? "slow" :
+# ifdef EGL_NON_CONFORMANT
+ v == EGL_NON_CONFORMANT ? "non-conformant" :
+# endif
+ "???"));
+ else if (fields[i].i == EGL_COLOR_BUFFER_TYPE)
+ strcpy (s, (v == EGL_RGB_BUFFER ? "RGB" :
+ v == EGL_LUMINANCE_BUFFER ? "luminance" :
+ "???"));
+ else if (fields[i].i == EGL_CONFORMANT ||
+ fields[i].i == EGL_RENDERABLE_TYPE)
+ {
+ sprintf (s, "0x%02x", v);
+ if (v & EGL_OPENGL_BIT) strcat (s, " OpenGL");
+ if (v & EGL_OPENGL_ES_BIT) strcat (s, " GLES-1.x");
+ if (v & EGL_OPENGL_ES2_BIT) strcat (s, " GLES-2.0");
+# ifdef EGL_OPENGL_ES3_BIT
+ if (v & EGL_OPENGL_ES3_BIT) strcat (s, " GLES-3.0");
+# endif
+ if (v & EGL_OPENVG_BIT) strcat (s, " OpenVG");
+ }
+ else if (fields[i].hexp)
+ sprintf (s, "0x%02x", v);
+ else if (v)
+ sprintf (s, "%d", v);
+ else
+ *s = 0;
+
+ if (*s) Log ("init: EGL %-14s %s\n", fields[i].s, s);
+ }
+ }
+#endif
+}
+
+
+static void
+get_egl_context_android(Window window, EGLDisplay *egl_display,
+ EGLConfig *egl_config, EGLContext *egl_context)
+{
+ EGLint context_attribs[][3] = {
+ { EGL_CONTEXT_CLIENT_VERSION, 1, EGL_NONE },
+ { EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE }
+ };
+ EGLint *attrs;
+ Bool glslp;
+ int pass, iter;
+
+# ifdef EGL_OPENGL_ES3_BIT
+ char *glsls = get_string_resource_window (window, "prefersGLSL");
+ glslp = (glsls && !strcasecmp(glsls, "true"));
+ if (glslp)
+ {
+ EGLint renderable_type;
+ eglGetConfigAttrib (egl_display, egl_config, EGL_RENDERABLE_TYPE,
+ &renderable_type);
+ Bool gles3p = (renderable_type & EGL_OPENGL_ES3_BIT) != 0;
+ glslp = glslp && gles3p;
+ }
+# else
+ glslp = False;
+# endif
+ iter = (glslp ? 2 : 1);
+
+ *egl_context = EGL_NO_CONTEXT;
+ for (pass = 0; pass < iter; pass++)
+ {
+ if (glslp && pass == 0)
+ attrs = context_attribs[1];
+ else
+ attrs = context_attribs[0];
+ *egl_context = eglCreateContext (egl_display, egl_config,
+ EGL_NO_CONTEXT, attrs);
+ if (*egl_context != EGL_NO_CONTEXT)
+ break;
+ }
+
+ Assert (*egl_context != EGL_NO_CONTEXT, "init: EGL_NO_CONTEXT");
+}
+
+
// Initialized OpenGL and runs the screenhack's init function.
//
static void
@@ -344,7 +551,24 @@ doinit (jobject jwxyz_obj, struct running_hack *rh, JNIEnv *env,
/* Note: https://source.android.com/devices/graphics/arch-egl-opengl */
- /* ####: This is lame, use a resource. */
+ /* jwxyz_gl_p controls which implementation of Pixmaps we are using.
+
+ - jwxyz-image.c implements them in CPU RAM, and is used for Android GL
+ hacks, and for kumppa, petri and slip, which are too slow otherwise.
+
+ - jwxyz-gl.c implements them in terms of OpenGL textures, and is used
+ for all other Android X11 hacks.
+
+ Why two implemementations of Pixmaps for Android?
+
+ - GL hacks don't tend to need much in the way of Xlib, and having a
+ GL context to render Xlib alongside a GL context for rendering GL
+ seemed like trouble.
+
+ - X11 hacks render to a GL context because hardware acceleration tends
+ to work well with Xlib geometric stuff. Better framerates, lower
+ power.
+ */
rh->jwxyz_gl_p =
rh->xsft->visual == DEFAULT_VISUAL &&
strcmp (progname, "kumppa") &&
@@ -357,48 +581,27 @@ doinit (jobject jwxyz_obj, struct running_hack *rh, JNIEnv *env,
rh->egl_p = rh->jwxyz_gl_p || rh->xsft->visual == GL_VISUAL;
+ int egl_major = -1, egl_minor = -1;
+
if (rh->egl_p) {
// GL init. Must come after resource processing.
rh->egl_display = eglGetDisplay (EGL_DEFAULT_DISPLAY);
Assert (rh->egl_display != EGL_NO_DISPLAY, "init: EGL_NO_DISPLAY");
- int egl_major, egl_minor;
Assert (eglInitialize (rh->egl_display, &egl_major, &egl_minor),
"eglInitialize failed");
- // TODO: Skip depth and (probably) alpha for Xlib.
- // TODO: Could ask for EGL_SWAP_BEHAVIOR_PRESERVED_BIT here...maybe?
- // TODO: Probably should try to ask for EGL_PBUFFER_BIT.
- // TODO: Do like visual-gl.c and work from a list of configs.
- /* Probably don't need EGL_FRAMEBUFFER_TARGET_ANDROID here if GLSurfaceView
- doesn't use it.
- */
- EGLint config_attribs[] = {
- EGL_RED_SIZE, 8,
- EGL_GREEN_SIZE, 8,
- EGL_BLUE_SIZE, 8,
- EGL_ALPHA_SIZE, 8,
- EGL_DEPTH_SIZE, 16,
- EGL_NONE
- };
-
- EGLint num_config;
- Assert (eglChooseConfig (rh->egl_display, config_attribs,
- &rh->egl_config, 1, &num_config),
- "eglChooseConfig failed");
- Assert (num_config == 1, "no EGL config chosen");
+ get_egl_config_android (rh->window, rh->egl_display, &rh->egl_config);
- EGLint no_attribs[] = {EGL_NONE};
- rh->egl_ctx = eglCreateContext (rh->egl_display, rh->egl_config,
- EGL_NO_CONTEXT, no_attribs);
- Assert (rh->egl_ctx != EGL_NO_CONTEXT, "init: EGL_NO_CONTEXT");
+ get_egl_context_android(rh->window, rh->egl_display, rh->egl_config,
+ &rh->egl_ctx);
ANativeWindow *native_window =
ANativeWindow_fromSurface (env, jni_surface);
rh->egl_surface = eglCreateWindowSurface (rh->egl_display, rh->egl_config,
- native_window, no_attribs);
+ native_window, NULL);
Assert (rh->egl_surface != EGL_NO_SURFACE, "init: EGL_NO_SURFACE");
ANativeWindow_release (native_window);
@@ -423,10 +626,12 @@ doinit (jobject jwxyz_obj, struct running_hack *rh, JNIEnv *env,
prepare_context (rh);
if (rh->egl_p) {
- Log ("init %s / %s / %s",
+ // GL_SHADING_LANGUAGE_VERSION undefined
+ Log ("init %s / %s / %s / EGL %d.%d",
glGetString (GL_VENDOR),
glGetString (GL_RENDERER),
- glGetString (GL_VERSION));
+ glGetString (GL_VERSION),
+ egl_major, egl_minor);
}
if (rh->jwxyz_gl_p) {
@@ -487,10 +692,7 @@ doinit (jobject jwxyz_obj, struct running_hack *rh, JNIEnv *env,
} else {
- if (rh->xsft->visual == DEFAULT_VISUAL)
- create_pixmap (wnd, wnd);
- else
- wnd->image_data = NULL;
+ create_pixmap (wnd, wnd);
static const unsigned char rgba_bytes[] = {0, 1, 2, 3};
rh->dpy = jwxyz_image_make_display(wnd, rgba_bytes);
@@ -597,7 +799,6 @@ drawXScreenSaver (JNIEnv *env, struct running_hack *rh)
if (! rh->xsft->fps_cb) rh->xsft->fps_cb = screenhack_do_fps;
} else {
rh->fpst = NULL;
- rh->xsft->fps_cb = 0;
}
if ((*env)->ExceptionOccurred(env)) abort();
@@ -834,7 +1035,7 @@ Java_org_jwz_xscreensaver_jwxyz_nativeResize (JNIEnv *env, jobject thiz,
}
jwxyz_window_resized (rh->dpy);
- } else if (rh->xsft->visual == DEFAULT_VISUAL) {
+ } else {
free_pixmap (rh, wnd);
create_pixmap (wnd, wnd);
XClearWindow (rh->dpy, wnd); // TODO: This is lame. Copy the bits.
@@ -877,6 +1078,8 @@ Java_org_jwz_xscreensaver_jwxyz_nativeDone (JNIEnv *env, jobject thiz)
prepare_context (rh);
+ if (rh->fpst)
+ rh->xsft->fps_free (rh->fpst);
if (rh->initted_p)
rh->xsft->free_cb (rh->dpy, rh->window, rh->closure);
if (rh->jwxyz_gl_p)
@@ -897,8 +1100,7 @@ Java_org_jwz_xscreensaver_jwxyz_nativeDone (JNIEnv *env, jobject thiz)
eglDestroyContext (rh->egl_display, rh->egl_ctx);
eglTerminate (rh->egl_display);
} else {
- if (rh->xsft->visual == DEFAULT_VISUAL)
- free_pixmap (rh, rh->window);
+ free_pixmap (rh, rh->window);
if (rh->native_window)
ANativeWindow_release (rh->native_window);
}
@@ -1375,6 +1577,12 @@ jwxyz_scale (Window main_window)
return 2;
}
+float
+jwxyz_font_scale (Window main_window)
+{
+ return jwxyz_scale (main_window);
+}
+
const char *
jwxyz_default_font_family (int require)
diff --git a/jwxyz/jwxyz-cocoa.h b/jwxyz/jwxyz-cocoa.h
index 5f2f61c..28f08b7 100644
--- a/jwxyz/jwxyz-cocoa.h
+++ b/jwxyz/jwxyz-cocoa.h
@@ -14,7 +14,7 @@
#import "XScreenSaverView.h"
-#ifdef USE_IPHONE
+#ifdef HAVE_IPHONE
# import <UIKit/UIKit.h>
# define NSView UIView
# define NSOpenGLContext EAGLContext
@@ -55,10 +55,10 @@ struct jwxyz_Drawable {
get leaked if a Pixmap CFRetains this.
*/
NSOpenGLContext *ogl_ctx; // OpenGL rendering context (OS X)
-# ifdef USE_IPHONE
+# ifdef HAVE_IPHONE
// TODO: Also on OS X as extensions.
GLuint gl_framebuffer, gl_renderbuffer;
-# endif // USE_IPHONE
+# endif // HAVE_IPHONE
CGImageRef cgi;
XRectangle frame;
union {
@@ -66,16 +66,16 @@ struct jwxyz_Drawable {
XScreenSaverView *view;
int last_mouse_x, last_mouse_y;
struct jwxyz_Drawable *current_drawable;
-# ifndef USE_IPHONE
+# ifndef HAVE_IPHONE
NSOpenGLPixelFormat *pixfmt;
GLint virtual_screen;
-# else // USE_IPHONE
+# else // HAVE_IPHONE
NSOpenGLContext *ogl_ctx_pixmap;
# endif
} window;
struct {
int depth;
-# ifndef USE_IPHONE
+# ifndef HAVE_IPHONE
NSOpenGLPixelBuffer *gl_pbuffer;
// GLuint blit_texture; // TODO: For blitting from Pbuffers
# endif
@@ -87,11 +87,11 @@ struct jwxyz_Drawable {
extern NSString *nsstring_from(const char *str, size_t len, int utf8_p);
-#ifdef USE_IPHONE
+#ifdef HAVE_IPHONE
extern void create_framebuffer (GLuint *gl_framebuffer,
GLuint *gl_renderbuffer);
extern void check_framebuffer_status (void);
-#endif // USE_IPHONE
+#endif // HAVE_IPHONE
#define jwxyz_window_view(w) ((w)->window.view)
diff --git a/jwxyz/jwxyz-cocoa.m b/jwxyz/jwxyz-cocoa.m
index 13666e7..f5bc551 100644
--- a/jwxyz/jwxyz-cocoa.m
+++ b/jwxyz/jwxyz-cocoa.m
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1991-2019 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -11,11 +11,10 @@
/* JWXYZ Is Not Xlib.
- But it's a bunch of function definitions that bear some resemblance to
- Xlib and that do Cocoa-ish or OpenGL-ish things that bear some resemblance
- to the things that Xlib might have done.
+ Cocoa glue for macOS and iOS: fonts and such.
- This code is used by both the original jwxyz.m and the new jwxyz-gl.c.
+ See the comment at the top of jwxyz-common.c for an explanation of
+ the division of labor between these various modules.
*/
#import "jwxyzI.h"
@@ -24,7 +23,7 @@
#include <stdarg.h>
-#ifdef USE_IPHONE
+#ifdef HAVE_IPHONE
# import <OpenGLES/ES1/gl.h>
# import <OpenGLES/ES1/glext.h>
# define NSOpenGLContext EAGLContext
@@ -99,7 +98,7 @@ jwxyz_scale_1 (Window main_window, BOOL fonts_p)
{
float scale = 1;
-# ifdef USE_IPHONE
+# ifdef HAVE_IPHONE
/* Since iOS screens are physically smaller than desktop screens, scale up
the fonts to make them more readable.
@@ -112,12 +111,12 @@ jwxyz_scale_1 (Window main_window, BOOL fonts_p)
if (scale < 1) // iPad Pro magnifies the backbuffer by 3x, which makes text
scale = 1; // excessively blurry in BSOD.
-# else // !USE_IPHONE
+# else // !HAVE_IPHONE
/* Desktop retina displays also need fonts doubled. */
scale = [main_window->window.view hackedContentScaleFactor:fonts_p];
-# endif // !USE_IPHONE
+# endif // !HAVE_IPHONE
return scale;
}
@@ -128,7 +127,7 @@ jwxyz_scale (Window main_window)
return jwxyz_scale_1 (main_window, FALSE);
}
-static float
+float
jwxyz_font_scale (Window main_window)
{
return jwxyz_scale_1 (main_window, TRUE);
@@ -193,7 +192,7 @@ utf8_metrics (Display *dpy, NSFont *nsfont, NSString *nsstr, XCharStruct *cs)
CGFloat advancement =
CTRunGetTypographicBounds (run, r, &ascent, &descent, &leading);
-# ifndef USE_IPHONE
+# ifndef HAVE_IPHONE
// Only necessary for when LCD smoothing is enabled, which iOS doesn't do.
bbox.origin.x -= 2.0/3.0;
bbox.size.width += 4.0/3.0;
@@ -234,7 +233,7 @@ utf8_metrics (Display *dpy, NSFont *nsfont, NSString *nsstr, XCharStruct *cs)
static NSArray *
font_family_members (NSString *family_name)
{
-# ifndef USE_IPHONE
+# ifndef HAVE_IPHONE
return [[NSFontManager sharedFontManager]
availableMembersOfFontFamily:family_name];
# else
@@ -275,7 +274,7 @@ try_font (NSFontTraitMask traits, NSFontTraitMask mask,
traits & NSFixedPitchFontMask ? JWXYZ_STYLE_MONOSPACE : 0)]);
}
-# ifndef USE_IPHONE
+# ifndef HAVE_IPHONE
for (unsigned k = 0; k != family_members.count; ++k) {
NSArray *member = [family_members objectAtIndex:k];
@@ -308,7 +307,7 @@ try_font (NSFontTraitMask traits, NSFontTraitMask mask,
return f;
}
}
-# else // USE_IPHONE
+# else // HAVE_IPHONE
// This trick needs iOS 3.1, see "Using SDK-Based Development".
Class has_font_descriptor = [UIFontDescriptor class];
@@ -331,7 +330,7 @@ try_font (NSFontTraitMask traits, NSFontTraitMask mask,
font_mask |= NSBoldFontMask;
if (MATCH(@"Italic") || MATCH(@"Oblique"))
font_mask |= NSItalicFontMask;
- if (MATCH(@"Courier"))
+ if (MATCH(@"Courier") || MATCH(@"monospace") || MATCH(@"fixed"))
font_mask |= NSFixedPitchFontMask;
}
@@ -370,7 +369,7 @@ static NSFont *
random_font (NSFontTraitMask traits, NSFontTraitMask mask, float size)
{
-# ifndef USE_IPHONE
+# ifndef HAVE_IPHONE
// Providing Unbold or Unitalic in the mask for availableFontNamesWithTraits
// returns an empty list, at least on a system with default fonts only.
NSArray *families = [[NSFontManager sharedFontManager]
@@ -395,7 +394,7 @@ random_font (NSFontTraitMask traits, NSFontTraitMask mask, float size)
families = new_families;
}
-# endif // USE_IPHONE
+# endif // HAVE_IPHONE
long n = [families count];
if (n <= 0) return 0;
@@ -563,7 +562,7 @@ jwxyz_render_text (Display *dpy, void *native_font,
void
jwxyz_get_pos (Window w, XPoint *xvpos, XPoint *xp)
{
-# ifdef USE_IPHONE
+# ifdef HAVE_IPHONE
xvpos->x = 0;
xvpos->y = 0;
@@ -573,7 +572,7 @@ jwxyz_get_pos (Window w, XPoint *xvpos, XPoint *xp)
xp->y = w->window.last_mouse_y;
}
-# else // !USE_IPHONE
+# else // !HAVE_IPHONE
NSWindow *nsw = [w->window.view window];
@@ -631,11 +630,11 @@ jwxyz_get_pos (Window w, XPoint *xvpos, XPoint *xp)
xp->y = (int) p.y;
}
-# endif // !USE_IPHONE
+# endif // !HAVE_IPHONE
}
-#ifdef USE_IPHONE
+#ifdef HAVE_IPHONE
void
check_framebuffer_status (void)
@@ -693,7 +692,7 @@ create_framebuffer (GLuint *gl_framebuffer, GLuint *gl_renderbuffer)
glBindRenderbufferOES (GL_RENDERBUFFER_OES, *gl_renderbuffer);
}
-#endif // USE_IPHONE
+#endif // HAVE_IPHONE
#if defined JWXYZ_QUARTZ
@@ -841,7 +840,7 @@ jwxyz_copy_area (Display *dpy, Drawable src, Drawable dst, GC gc,
/* Strange and ugly flickering when going the glCopyTexImage2D route on
OS X. (Early 2009 Mac mini, OS X 10.10)
*/
-# ifdef USE_IPHONE
+# ifdef HAVE_IPHONE
/* TODO: This might not still work. */
jwxyz_bind_drawable (dpy, dpy->main_window, src);
@@ -850,10 +849,10 @@ jwxyz_copy_area (Display *dpy, Drawable src, Drawable dst, GC gc,
jwxyz_bind_drawable (dpy, dpy->main_window, dst);
jwxyz_gl_copy_area_write_tex_image (dpy, gc, src_x, src_y,
width, height, dst_x, dst_y);
-# else // !USE_IPHONE
+# else // !HAVE_IPHONE
jwxyz_gl_copy_area_read_pixels (dpy, src, dst, gc,
src_x, src_y, width, height, dst_x, dst_y);
-# endif // !USE_IPHONE
+# endif // !HAVE_IPHONE
jwxyz_assert_gl ();
}
@@ -877,7 +876,7 @@ jwxyz_assert_gl ()
void
jwxyz_assert_drawable (Window main_window, Drawable d)
{
-#if !defined USE_IPHONE && !defined __OPTIMIZE__
+#if !defined HAVE_IPHONE && !defined __OPTIMIZE__
XScreenSaverView *view = main_window->window.view;
NSOpenGLContext *ogl_ctx = [view oglContext];
@@ -896,7 +895,7 @@ jwxyz_assert_drawable (Window main_window, Drawable d)
perror([[exception reason] UTF8String]);
jwxyz_abort();
}
-#endif // !USE_IPHONE && !__OPTIMIZE__
+#endif // !HAVE_IPHONE && !__OPTIMIZE__
}
@@ -925,7 +924,7 @@ jwxyz_bind_drawable (Window main_window, Drawable d)
jwxyz_assert_gl ();
jwxyz_assert_drawable (main_window, d);
-#if defined USE_IPHONE && !defined __OPTIMIZE__
+#if defined HAVE_IPHONE && !defined __OPTIMIZE__
Drawable current_drawable = main_window->window.current_drawable;
Assert (!current_drawable
|| current_drawable->ogl_ctx == [EAGLContext currentContext],
@@ -942,7 +941,7 @@ jwxyz_bind_drawable (Window main_window, Drawable d)
main_window->window.current_drawable = d;
/* Doing this repeatedly is probably not OK performance-wise. Probably. */
-#ifndef USE_IPHONE
+#ifndef HAVE_IPHONE
[d->ogl_ctx makeCurrentContext];
#else
[EAGLContext setCurrentContext:d->ogl_ctx];
@@ -973,7 +972,7 @@ XCreatePixmap (Display *dpy, Drawable d,
/* TODO: If Pixel buffers are not supported, do something about it. */
Window w = XRootWindow (dpy, 0);
-# ifndef USE_IPHONE
+# ifndef HAVE_IPHONE
p->ogl_ctx = [[NSOpenGLContext alloc]
initWithFormat:w->window.pixfmt
@@ -997,7 +996,7 @@ XCreatePixmap (Display *dpy, Drawable d,
mipMapLevel:0
currentVirtualScreen:w->window.virtual_screen];
-# else // USE_IPHONE
+# else // HAVE_IPHONE
p->ogl_ctx = w->window.ogl_ctx_pixmap;
@@ -1012,7 +1011,7 @@ XCreatePixmap (Display *dpy, Drawable d,
glBindFramebufferOES(GL_FRAMEBUFFER_OES, p->gl_framebuffer);
-# endif // USE_IPHONE
+# endif // HAVE_IPHONE
w->window.current_drawable = p;
glViewport (0, 0, width, height);
@@ -1033,16 +1032,16 @@ XFreePixmap (Display *d, Pixmap p)
Window w = RootWindow (d, 0);
-# ifndef USE_IPHONE
+# ifndef HAVE_IPHONE
CFRelease (p->ogl_ctx);
[p->ogl_ctx release];
CFRelease (p->pixmap.gl_pbuffer);
[p->pixmap.gl_pbuffer release];
-# else // USE_IPHONE
+# else // HAVE_IPHONE
glDeleteRenderbuffersOES (1, &p->gl_renderbuffer);
glDeleteFramebuffersOES (1, &p->gl_framebuffer);
-# endif // USE_IPHONE
+# endif // HAVE_IPHONE
if (w->window.current_drawable == p) {
w->window.current_drawable = NULL;
diff --git a/jwxyz/jwxyz-common.c b/jwxyz/jwxyz-common.c
index febb3b5..0b170f6 100644
--- a/jwxyz/jwxyz-common.c
+++ b/jwxyz/jwxyz-common.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1991-2019 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1991-2020 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -11,14 +11,48 @@
/* JWXYZ Is Not Xlib.
- But it's a bunch of function definitions that bear some resemblance to
- Xlib and that do Cocoa-ish or OpenGL-ish things that bear some resemblance
- to the things that Xlib might have done.
+ macOS and iOS:
+
+ jwxyz.m -- Xlib in terms of Quartz / Core Graphics rendering,
+ Renders into a CGContextRef that points to a CGImage
+ in CPU RAM.
+ jwxyz-cocoa.m -- Cocoa glue: fonts and such.
+
+ Android:
+
+ jwxyz-android.c -- Java / JNI glue. Renders into an FBO texture if
+ possible, otherwise an EGL PBuffer.
+
+ jwxyz-image.c -- Pixmaps implemented in CPU RAM, for OpenGL hacks.
+ Renders into an XImage, basically.
+
+ jwxyz-gl.c -- Pixmaps implemented in terms of OpenGL textures,
+ for X11 hacks (except kumppa, petri and slip).
+
+ Shared code:
+
+ jwxyz-common.c -- Most of the Xlib implementation, used by all 3 OSes.
+ jwzgles.c -- OpenGL 1.3 implemented in terms of OpenGLES 1.1.
+
+
+ Why two implemementations of Pixmaps for Android?
+
+ - GL hacks don't tend to need much in the way of Xlib, and having a
+ GL context to render Xlib alongside a GL context for rendering GL
+ seemed like trouble.
+
+ - X11 hacks render to a GL context because hardware acceleration tends
+ to work well with Xlib geometric stuff. Better framerates, lower
+ power.
+
+ Why not eliminate jwxyz-cocoa.m and use jwxyz-gl.c on macOS and iOS
+ as well?
+
+ - Yeah, maybe.
- This is the version of jwxyz for Android. The version used by MacOS
- and iOS is in jwxyz.m.
*/
+
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
@@ -1134,7 +1168,7 @@ try_xlfd_font (Display *dpy, const char *name, Font fid)
// This used to substitute Georgia for Times. Now it doesn't.
if (CMP ("random")) {
rand = True;
- } else if (CMP ("fixed")) {
+ } else if (CMP ("fixed") || CMP ("monospace")) {
require |= JWXYZ_STYLE_MONOSPACE;
family_name = "Courier";
family_name_size = strlen(family_name);
diff --git a/jwxyz/jwxyz-gl.c b/jwxyz/jwxyz-gl.c
index f1c13da..ed4c9c9 100644
--- a/jwxyz/jwxyz-gl.c
+++ b/jwxyz/jwxyz-gl.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1991-2018 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1991-2020 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -11,14 +11,14 @@
/* JWXYZ Is Not Xlib.
- But it's a bunch of function definitions that bear some resemblance to
- Xlib and that do OpenGL-ish things that bear some resemblance to the
- things that Xlib might have done.
+ Pixmaps implemented in terms of OpenGL textures, for Android X11 hacks.
+ Maybe this can someday be used on macOS and iOS as well.
- This is the version of jwxyz for Android. The version used by macOS
- and iOS is in jwxyz.m.
+ See the comment at the top of jwxyz-common.c for an explanation of
+ the division of labor between these various modules.
*/
+
/* Be advised, this is all very much a work in progress. */
/* There is probably no reason to ever implement indexed-color rendering here,
@@ -77,7 +77,7 @@
#include <wchar.h>
#ifdef HAVE_COCOA
-# ifdef USE_IPHONE
+# ifdef HAVE_IPHONE
# import <QuartzCore/QuartzCore.h>
# include <OpenGLES/ES1/gl.h>
# include <OpenGLES/ES1/glext.h>
@@ -91,6 +91,9 @@
# else
# include <GLES/gl.h>
# include <GLES/glext.h>
+# ifdef HAVE_GLES3
+# include <GLES3/gl3.h>
+# endif
# endif
#endif
@@ -186,7 +189,7 @@ jwxyz_set_matrices (Display *dpy, unsigned width, unsigned height,
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
-# if defined(USE_IPHONE) || defined(HAVE_ANDROID)
+# if defined(HAVE_IPHONE) || defined(HAVE_ANDROID)
if (window_p && ignore_rotation_p(dpy)) {
int o = (int) current_device_rotation();
@@ -917,7 +920,7 @@ jwxyz_gl_copy_area_read_tex_image (Display *dpy, unsigned src_height,
unsigned int width, unsigned int height,
int dst_x, int dst_y)
{
-# if defined HAVE_COCOA && !defined USE_IPHONE
+# if defined HAVE_COCOA && !defined HAVE_IPHONE
/* TODO: Does this help? */
/* glFinish(); */
# endif
diff --git a/jwxyz/jwxyz-image.c b/jwxyz/jwxyz-image.c
index b1b3332..dc644ee 100644
--- a/jwxyz/jwxyz-image.c
+++ b/jwxyz/jwxyz-image.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1991-2018 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1991-2020 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -11,11 +11,11 @@
/* JWXYZ Is Not Xlib.
- But it's a bunch of function definitions that bear some resemblance to
- Xlib and that do things to an XImage that bear some resemblance to the
- things that Xlib might have done.
+ Pixmaps implemented in CPU RAM, for Android OpenGL hacks.
+ Renders into an XImage, basically.
- This handles things when jwxyz-gl.c can't.
+ See the comment at the top of jwxyz-common.c for an explanation of
+ the division of labor between these various modules.
*/
#ifdef HAVE_CONFIG_H
diff --git a/jwxyz/jwxyz.h b/jwxyz/jwxyz.h
index fa76571..3eac567 100644
--- a/jwxyz/jwxyz.h
+++ b/jwxyz/jwxyz.h
@@ -73,6 +73,8 @@ typedef struct jwxyz_XCharStruct XCharStruct;
typedef struct jwxyz_XComposeStatus XComposeStatus;
typedef struct jwxyz_XPixmapFormatValues XPixmapFormatValues;
typedef struct jwxyz_XChar2b XChar2b;
+typedef struct jwxyz_XRegion * Region;
+typedef struct jwxyz_Box Box;
typedef union jwxyz_XEvent XEvent;
typedef struct jwxyz_XAnyEvent XAnyEvent;
@@ -286,6 +288,11 @@ typedef struct jwxyz_linked_point linked_point;
// #define GXnand 0xe /* NOT src OR NOT dst */
#define GXset 0xf /* 1 */
+#define Unsorted 0
+#define YSorted 1
+#define YXSorted 2
+#define YXBanded 3
+
#define XA_FONT 18
#define DefaultScreen(dpy) (0)
@@ -827,6 +834,17 @@ struct jwxyz_XChar2b {
unsigned char byte2;
};
+/* Xregion.h */
+struct jwxyz_Box {
+ short x1, x2, y1, y2;
+};
+
+struct jwxyz_XRegion {
+ long size;
+ long numRects;
+ Box *rects;
+ Box extents;
+};
struct jwxyz_vtbl {
Window (*root) (Display *);
diff --git a/jwxyz/jwxyz.m b/jwxyz/jwxyz.m
index c6a7af5..d25d580 100644
--- a/jwxyz/jwxyz.m
+++ b/jwxyz/jwxyz.m
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1991-2019 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1991-2020 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -11,13 +11,11 @@
/* JWXYZ Is Not Xlib.
- But it's a bunch of function definitions that bear some resemblance to
- Xlib and that do Cocoa-ish things that bear some resemblance to the
- things that Xlib might have done.
+ This file implements Xlib in terms of Quartz / Core Graphics rendering
+ for macOS and iOS.
- This is the original version of jwxyz for MacOS and iOS.
- The version used by Android is in jwxyz-gl.c and jwxyz-common.c.
- Both versions depend on jwxyz-cocoa.m.
+ See the comment at the top of jwxyz-common.c for an explanation of
+ the division of labor between these various modules.
*/
#ifdef JWXYZ_QUARTZ // entire file
@@ -26,7 +24,7 @@
#import <stdint.h>
#import <wchar.h>
-#ifdef USE_IPHONE
+#ifdef HAVE_IPHONE
# import <UIKit/UIKit.h>
# import <UIKit/UIScreen.h>
# import <QuartzCore/QuartzCore.h>
@@ -66,7 +64,7 @@ struct jwxyz_Display {
Visual visual;
struct jwxyz_sources_data *timers_data;
-# ifndef USE_IPHONE
+# ifndef HAVE_IPHONE
CGDirectDisplayID cgdpy; /* ...of the one and only Window, main_window.
This can change if the window is dragged to
a different screen. */
@@ -399,7 +397,7 @@ jwxyz_window_resized (Display *dpy)
{
Window w = dpy->main_window;
-# ifndef USE_IPHONE
+# ifndef HAVE_IPHONE
// Figure out which screen the window is currently on.
{
int wx, wy;
@@ -417,7 +415,7 @@ jwxyz_window_resized (Display *dpy)
}
Assert (dpy->cgdpy, "unable to find CGDisplay");
}
-# endif // USE_IPHONE
+# endif // HAVE_IPHONE
/*
{
@@ -1394,9 +1392,9 @@ jwxyz_draw_NSImage_or_CGImage (Display *dpy, Drawable d,
XRectangle *geom_ret, int exif_rotation)
{
CGImageRef cgi;
-# ifndef USE_IPHONE
+# ifndef HAVE_IPHONE
CGImageSourceRef cgsrc;
-# endif // USE_IPHONE
+# endif // HAVE_IPHONE
NSSize imgr;
CGContextRef cgc = d->cgc;
@@ -1406,7 +1404,7 @@ jwxyz_draw_NSImage_or_CGImage (Display *dpy, Drawable d,
NSImage *nsimg = (NSImage *) img_arg;
imgr = [nsimg size];
-# ifndef USE_IPHONE
+# ifndef HAVE_IPHONE
// convert the NSImage to a CGImage via the toll-free-bridging
// of NSData and CFData...
//
@@ -1416,9 +1414,9 @@ jwxyz_draw_NSImage_or_CGImage (Display *dpy, Drawable d,
CFDataRef cfdata = (CFDataRef) nsdata;
cgsrc = CGImageSourceCreateWithData (cfdata, NULL);
cgi = CGImageSourceCreateImageAtIndex (cgsrc, 0, NULL);
-# else // USE_IPHONE
+# else // HAVE_IPHONE
cgi = nsimg.CGImage;
-# endif // USE_IPHONE
+# endif // HAVE_IPHONE
} else {
cgi = (CGImageRef) img_arg;
@@ -1481,12 +1479,12 @@ jwxyz_draw_NSImage_or_CGImage (Display *dpy, Drawable d,
CGContextDrawImage (cgc, dst2, cgi);
CGContextRestoreGState (cgc);
-# ifndef USE_IPHONE
+# ifndef HAVE_IPHONE
if (nsimg_p) {
CFRelease (cgsrc);
CGImageRelease (cgi);
}
-# endif // USE_IPHONE
+# endif // HAVE_IPHONE
if (geom_ret) {
geom_ret->x = dst.origin.x;
@@ -1507,7 +1505,7 @@ jwxyz_png_to_ximage (Display *dpy, Visual *visual,
[NSData dataWithBytes:png_data
length:data_size]];
if (! img) return 0;
-#ifndef USE_IPHONE
+#ifndef HAVE_IPHONE
NSBitmapImageRep *bm = [NSBitmapImageRep
imageRepWithData:
[NSBitmapImageRep
@@ -1525,7 +1523,7 @@ jwxyz_png_to_ximage (Display *dpy, Visual *visual,
convert_mode_t mode = (([bm bitmapFormat] & NSAlphaFirstBitmapFormat)
? CONVERT_MODE_ROTATE_MASK
: 0);
-#else // USE_IPHONE
+#else // HAVE_IPHONE
CGImageRef cgi = [img CGImage];
if (!cgi) {
[img release];
@@ -1547,7 +1545,7 @@ jwxyz_png_to_ximage (Display *dpy, Visual *visual,
convert_mode_t mode = convert_mode_to_rgba (bitmap_info);
-#endif // USE_IPHONE
+#endif // HAVE_IPHONE
XImage *image = XCreateImage (dpy, visual, 32, ZPixmap, 0, 0,
width, height, 8, 0);
@@ -1567,7 +1565,7 @@ jwxyz_png_to_ximage (Display *dpy, Visual *visual,
[img release];
-#ifndef USE_IPHONE
+#ifndef HAVE_IPHONE
// [bm release];
# else
CGContextRelease (cgc);
diff --git a/jwxyz/jwxyzI.h b/jwxyz/jwxyzI.h
index f7560f7..6ff5d38 100644
--- a/jwxyz/jwxyzI.h
+++ b/jwxyz/jwxyzI.h
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1991-2018 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -52,6 +52,7 @@ extern unsigned int jwxyz_drawable_depth (Drawable d);
meaning of -[UIView contentScaleFactor] on iOS.
*/
extern float jwxyz_scale (Window main_window);
+extern float jwxyz_font_scale (Window main_window);
extern const char *jwxyz_default_font_family (int require);
extern void *jwxyz_load_native_font (Window main_window,
@@ -130,7 +131,7 @@ extern void jwxyz_quartz_copy_area (Display *dpy, Drawable src, Drawable dst,
# ifdef JWXYZ_GL
-# if defined(USE_IPHONE)
+# if defined(HAVE_IPHONE)
# include <OpenGLES/ES1/gl.h>
# elif defined(HAVE_COCOA)
# include <OpenGL/gl.h>
diff --git a/jwxyz/jwzgles.c b/jwxyz/jwzgles.c
index b26bc3a..26f1188 100644
--- a/jwxyz/jwzgles.c
+++ b/jwxyz/jwzgles.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2012-2019 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 2012-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -9,9 +9,14 @@
* implied warranty.
*/
-/* A compatibility shim to allow OpenGL 1.3 source code to work in an
- OpenGLES environment, where almost every OpenGL 1.3 function has
- been "deprecated".
+/* JWXYZ Is Not Xlib.
+
+ See the comment at the top of jwxyz-common.c for an explanation of
+ the division of labor between these various modules.
+
+ This file is a compatibility shim to allow OpenGL 1.3 source code to
+ work in an OpenGLES environment, where almost every OpenGL 1.3 function
+ has been "deprecated".
There are two major operations going on here:
@@ -97,9 +102,17 @@
OpenGLES 1.0 2003 (deprecated 80% of the language; fork of OpenGL 1.3)
OpenGL 1.5 2003 (added VBOs)
OpenGLES 1.1 2004 (fork of OpenGL 1.5)
- OpenGL 2.0 2004 (a political quagmire)
- OpenGLES 2.0 2007 (deprecated 95% of the language; fork of OpenGL 2.0)
+ OpenGL 2.0 2004 (a political quagmire, added shader language GLSL 1.1)
+ OpenGLES 2.0 2007 (deprecated 95% of the language; fork of OpenGL 2.0;
+ GLSL 1.20)
OpenGL 3.0 2008 (added FBOs, VAOs, deprecated 60% of the language)
+ OpenGL 3.3 2010 (OpenGL 3.3 and OpenGL 4.0 released concurrently;
+ 3.3 has GLSL 3.30, but 4.0 has GLSL 4.00)
+ OpenGLES 3.0 2012 (same as WebGL 2.0, but has GLSL 3.00)
+ OpenGL 4.3 2012 (superset of GLES 3.0, but has GLSL 4.30)
+
+ It's like these assholes are going out of their way to make it all just
+ as incoherent and difficult to understand as possible.
Some things that are missing:
@@ -152,6 +165,10 @@
#ifdef HAVE_JWZGLES /* whole file */
+#ifndef HAVE_GL
+# error HAVE_GL is undefined
+#endif
+
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
@@ -162,21 +179,30 @@
# include <unistd.h>
#endif /* HAVE_UNISTD_H */
-#if defined(USE_IPHONE)
-# include <OpenGLES/ES1/gl.h>
-# include <OpenGLES/ES1/glext.h>
+#if defined(HAVE_IPHONE)
+# ifdef HAVE_GLES3
+# include <OpenGLES/ES3/gl.h>
+# include <OpenGLES/ES3/glext.h>
+# else /* !HAVE_GLES3 */
+# include <OpenGLES/ES1/gl.h>
+# include <OpenGLES/ES1/glext.h>
+# endif /* !HAVE_GLES3 */
#elif defined(HAVE_COCOA)
# include <OpenGL/gl.h>
-# include <OpenGL/glu.h>
#elif defined(HAVE_ANDROID)
# include <GLES/gl.h>
+# ifdef HAVE_GLES3
+# include <GLES3/gl3.h>
+# endif
# include <android/log.h>
#else /* real X11 */
# ifndef GL_GLEXT_PROTOTYPES
# define GL_GLEXT_PROTOTYPES /* for glBindBuffer */
# endif
-# include <GL/glx.h>
-# include <GL/glu.h>
+# include <GLES/gl.h>
+# ifdef HAVE_GLES3
+# include <GLES3/gl3.h>
+# endif /* HAVE_GLES3 */
#endif
#include "jwzglesI.h"
@@ -1759,8 +1785,9 @@ jwzgles_glDrawBuffer (GLenum buf)
}
else
{
-/* Assert (buf == GL_BACK, "glDrawBuffer: back buffer only"); */
-# ifndef GL_VERSION_ES_CM_1_0 /* not compiling against OpenGLES 1.x */
+ Assert (buf == GL_BACK, "glDrawBuffer: back buffer only");
+# if !defined(GL_VERSION_ES_CM_1_0)
+ /* not compiling against OpenGLES 1.x */
if (! state->replaying_list)
LOG1 ("direct %-12s", "glDrawBuffer");
glDrawBuffer (buf); /* the real one */
@@ -1770,6 +1797,29 @@ jwzgles_glDrawBuffer (GLenum buf)
}
+void jwzgles_glDrawElements (GLenum mode, GLsizei count, GLenum type,
+ const GLvoid *indices)
+{
+ Assert (!state->compiling_verts, "not allowed inside glBegin");
+ Assert (!state->compiling_list, "not allowed inside glNewList");
+# if 0
+ if (state->compiling_list)
+ {
+ void_int vv[1];
+ vv[0].i = buf;
+ /* #### This won't work because indices is a pointer */
+ list_push ("glDrawElements", (list_fn_cb) &jwzgles_glDrawElements,
+ PROTO_IIII, vv);
+ }
+ else
+# endif /* 0 */
+ {
+ glDrawElements (mode, count, type, indices); /* the real one */
+ CHECK("glDrawElements");
+ }
+}
+
+
/* Given an array of sets of 4 elements of arbitrary size, convert it
to an array of sets of 6 elements instead: ABCD becomes ABC BCD.
*/
@@ -1966,15 +2016,15 @@ jwzgles_glEnd (void)
jwzgles_glDrawArrays (s->mode, 0, s->count);
glBindBuffer (GL_ARRAY_BUFFER, 0); /* Keep out of others' hands */
-# define RESET(VAR,FN,ARG) do { \
+# define RESET(VAR,ENFN,DISFN,ARG) do { \
if (is_##VAR != was_##VAR) { \
- if (was_##VAR) jwzgles_glEnable##FN (ARG); \
- else jwzgles_glDisable##FN (ARG); \
+ if (was_##VAR) jwzgles_gl##ENFN (ARG); \
+ else jwzgles_gl##DISFN (ARG); \
}} while(0)
- RESET (norm, ClientState, GL_NORMAL_ARRAY);
- RESET (tex, ClientState, GL_TEXTURE_COORD_ARRAY);
- RESET (color, ClientState, GL_COLOR_ARRAY);
- RESET (mat, , GL_COLOR_MATERIAL);
+ RESET (norm, EnableClientState, DisableClientState, GL_NORMAL_ARRAY);
+ RESET (tex, EnableClientState, DisableClientState, GL_TEXTURE_COORD_ARRAY);
+ RESET (color, EnableClientState, DisableClientState, GL_COLOR_ARRAY);
+ RESET (mat, Enable, Disable, GL_COLOR_MATERIAL);
# undef RESET
s->count = 0;
@@ -2987,7 +3037,12 @@ jwzgles_glTexImage1D (GLenum target, GLint level,
Assert (!state->compiling_verts, "glTexImage1D not allowed inside glBegin");
/* technically legal, but stupid! */
Assert (!state->compiling_list, "glTexImage1D inside glNewList");
+# ifndef HAVE_GLSL
+ /* If the underlying library is GLES2, then textures can be any size.
+ Portable code should still be using pow2 sizes, unless it's in a branch
+ that is guaranteed not to run in a GLES1 or OpenGL 1.3 context. */
Assert (width == to_pow2(width), "width must be a power of 2");
+# endif
if (target == GL_TEXTURE_1D) target = GL_TEXTURE_2D;
jwzgles_glTexImage2D (target, level, internalFormat, width, 1,
@@ -3010,8 +3065,13 @@ jwzgles_glTexImage2D (GLenum target,
Assert (!state->compiling_list, /* technically legal, but stupid! */
"glTexImage2D not allowed inside glNewList");
+# ifndef HAVE_GLSL
+ /* If the underlying library is GLES2, then textures can be any size.
+ Portable code should still be using pow2 sizes, unless it's in a branch
+ that is guaranteed not to run in a GLES1 or OpenGL 1.3 context. */
Assert (width == to_pow2(width), "width must be a power of 2");
Assert (height == to_pow2(height), "height must be a power of 2");
+# endif
/* OpenGLES no longer supports "4" as a synonym for "RGBA". */
switch (internalFormat) {
@@ -4131,12 +4191,13 @@ jwzgles_gluCheckExtension (const GLubyte *ext_name, const GLubyte *ext_string)
size_t ext_len = strlen ((const char *)ext_name);
for (;;) {
+ char last_ch;
const GLubyte *found = (const GLubyte *)strstr ((const char *)ext_string,
(const char *)ext_name);
if (!found)
break;
- char last_ch = found[ext_len];
+ last_ch = found[ext_len];
if ((found == ext_string || found[-1] == ' ') &&
(last_ch == ' ' || !last_ch)) {
return GL_TRUE;
@@ -4288,7 +4349,7 @@ void jwzgles_##NAME (ARGS_##SIG) \
WRAP (glActiveTexture, I)
WRAP (glAlphaFunc, IF)
WRAP (glBlendFunc, II)
-//WRAP (glBlendColor, FFFF);
+/*WRAP (glBlendColor, FFFF);*/
WRAP (glClear, I)
WRAP (glClearColor, FFFF)
WRAP (glClearStencil, I)
@@ -4329,5 +4390,4 @@ WRAP (glTranslatef, FFF)
#define TYPE_IV GLuint
WRAP (glDeleteTextures, IIV)
-
#endif /* HAVE_JWZGLES - whole file */
diff --git a/jwxyz/jwzgles.h b/jwxyz/jwzgles.h
index 9c8d1e2..10c5bd8 100644
--- a/jwxyz/jwzgles.h
+++ b/jwxyz/jwzgles.h
@@ -21,7 +21,6 @@
# error: do not include this without HAVE_JWZGLES
#endif
-
#include "jwzglesI.h"
@@ -269,7 +268,6 @@
#define glRasterPos4iv jwzgles_glRasterPos4iv
#define glRasterPos4s jwzgles_glRasterPos4s
#define glRasterPos4sv jwzgles_glRasterPos4sv
-#define glReadBuffer jwzgles_glReadBuffer
#define glRectd jwzgles_glRectf
#define glRectdv jwzgles_glRectdv
#define glRectf jwzgles_glRectf
diff --git a/jwxyz/jwzglesI.h b/jwxyz/jwzglesI.h
index b90bad4..975b3ee 100644
--- a/jwxyz/jwzglesI.h
+++ b/jwxyz/jwzglesI.h
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2012-2019 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 2012-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -184,6 +184,7 @@ extern void jwzgles_glDepthFunc (GLuint);
extern void jwzgles_glDepthMask (GLuint);
extern void jwzgles_glDisable (GLuint);
extern void jwzgles_glDrawArrays (GLuint, GLuint, GLuint);
+extern void jwzgles_glDrawElements (GLenum, GLsizei, GLenum, const GLvoid *);
extern GLboolean jwzgles_glIsEnabled (GLuint);
extern void jwzgles_glEnable (GLuint);
extern void jwzgles_glFrontFace (GLuint);
@@ -206,7 +207,6 @@ extern void jwzgles_glViewport (GLuint, GLuint, GLuint, GLuint);
extern void jwzgles_glTranslatef (GLfloat, GLfloat, GLfloat);
extern void jwzgles_glRotatef (GLfloat, GLfloat, GLfloat, GLfloat);
extern void jwzgles_glRotated (GLdouble, GLdouble x, GLdouble y, GLdouble z);
-extern void jwzgles_glReadBuffer (GLuint);
extern void jwzgles_glScalef (GLfloat, GLfloat, GLfloat);
extern void jwzgles_glColor3f (GLfloat, GLfloat, GLfloat);
extern void jwzgles_glColor4f (GLfloat, GLfloat, GLfloat, GLfloat);
diff --git a/makevms.com b/makevms.com
deleted file mode 100644
index 213cc0c..0000000
--- a/makevms.com
+++ /dev/null
@@ -1,57 +0,0 @@
-$! Build Xscreensaver under OpenVMS V 6.x system with DEC C 5.x compiler
-$!
-$ copy /log CONFIG.H-VMS CONFIG.H
-$!
-$! Architecture type test (VAX < 1024 <= Alpha AXP)
-$!
-$ if f$getsyi("HW_MODEL").ge.1024
-$ then
-$!
-$! Alpha AXP
-$! build Utils library
-$!
-$ set def [.UTILS]
-$ @COMPILE_AXP
-$ set def [-]
-$!
-$! build graphics hacks
-$!
-$ set def [.HACKS]
-$ @COMPILE_AXP
-$ @LINK_AXP
-$ set def [-]
-$!
-$! Build Xscreensaver & Xscreensaver-command
-$!
-$ set def [.DRIVER]
-$ @COMPILE_AXP
-$ @LINK_AXP
-$ set def [-]
-$ else
-$!
-$! Good old VAX
-$! build Utils library
-$!
-$ set def [.UTILS]
-$ @COMPILE_DECC
-$ set def [-]
-$!
-$! build graphics hacks
-$!
-$ set def [.HACKS]
-$ @COMPILE_DECC
-$ @LINK_DECC
-$ set def [-]
-$!
-$! Build Xscreensaver & Xscreensaver-command
-$!
-$ set def [.DRIVER]
-$ @COMPILE_DECC
-$ @LINK_DECC
-$ set def [-]
-$ endif
-$!
-$! DCL symbols definition
-$!
-$ @SETUP
-$ exit
diff --git a/po/Makefile.in.in b/po/Makefile.in.in
index 3d4b024..8138146 100644
--- a/po/Makefile.in.in
+++ b/po/Makefile.in.in
@@ -295,20 +295,21 @@ distdepend: generate_potfiles_in update-po $(DISTFILES)
generate_potfiles_in:
@tmp=po.$$$$ ; \
file=POTFILES.in ; \
- echo "sleeping 3 seconds..." ;\
- sleep 3; \
( cd $(top_srcdir); \
echo "# Auto-generated: `LANG=C date`" ; \
( grep -l '_("' driver/*.[ch] ; \
- ls driver/*.glade2.in \
+ ls driver/*.ui \
driver/*.desktop.in \
- hacks/config/*.xml ) | sort \
+ hacks/config/*.xml ) | \
+ grep -v rdbomb | \
+ grep -v co____9 | \
+ sort \
) > $$tmp && \
mv $$tmp $$file && \
echo "created `pwd`/$$file"
-echo_tarfiles:
- @echo $(TARFILES)
+list_tarfiles:
+ @find $(TARFILES) -type f -print | sort
distdir = ../$(GETTEXT_PACKAGE)-$(VERSION)/$(subdir)
dist distdir: update-po $(DISTFILES)
diff --git a/po/POTFILES.in b/po/POTFILES.in
index d785843..c288450 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -1,8 +1,10 @@
-# Auto-generated: Fri Mar 20 18:40:22 PDT 2020
+# Auto-generated: Thu Apr 1 03:16:58 PDT 2021
driver/demo-Gtk-conf.c
driver/demo-Gtk.c
+driver/dialog.c
driver/screensaver-properties.desktop.in
-driver/xscreensaver-demo.glade2.in
+driver/subprocs.c
+driver/xscreensaver.ui
hacks/config/abstractile.xml
hacks/config/anemone.xml
hacks/config/anemotaxis.xml
@@ -16,6 +18,7 @@ hacks/config/atlantis.xml
hacks/config/attraction.xml
hacks/config/atunnel.xml
hacks/config/barcode.xml
+hacks/config/beats.xml
hacks/config/binaryring.xml
hacks/config/blaster.xml
hacks/config/blinkbox.xml
@@ -41,6 +44,7 @@ hacks/config/cloudlife.xml
hacks/config/companioncube.xml
hacks/config/compass.xml
hacks/config/coral.xml
+hacks/config/covid19.xml
hacks/config/crackberg.xml
hacks/config/critical.xml
hacks/config/crumbler.xml
@@ -116,6 +120,7 @@ hacks/config/greynetic.xml
hacks/config/halftone.xml
hacks/config/halo.xml
hacks/config/handsy.xml
+hacks/config/headroom.xml
hacks/config/helix.xml
hacks/config/hexadrop.xml
hacks/config/hexstrut.xml
@@ -195,7 +200,6 @@ hacks/config/queens.xml
hacks/config/raverhoop.xml
hacks/config/razzledazzle.xml
hacks/config/rd-bomb.xml
-hacks/config/rdbomb.xml
hacks/config/ripples.xml
hacks/config/rocks.xml
hacks/config/romanboy.xml
@@ -215,6 +219,7 @@ hacks/config/slip.xml
hacks/config/sonar.xml
hacks/config/speedmine.xml
hacks/config/sphere.xml
+hacks/config/sphereeversion.xml
hacks/config/spheremonics.xml
hacks/config/spiral.xml
hacks/config/splitflap.xml
diff --git a/po/da.po b/po/da.po
index 1466d37..5da5711 100644
--- a/po/da.po
+++ b/po/da.po
@@ -6227,7 +6227,7 @@ msgstr "Menger"
#: hacks/config/menger.xml.h:19
msgid ""
"This draws the three-dimensional variant of the recursive Menger Gasket, a "
-"cube-based fractal object analagous to the Sierpinski Tetrahedron. Written "
+"cube-based fractal object analogous to the Sierpinski Tetrahedron. Written "
"by Jamie Zawinski."
msgstr ""
"Tegner den tre-dimensionale variant af den rekursive Menger Gasket, et "
diff --git a/po/de.po b/po/de.po
index ba93b35..c9092b3 100644
--- a/po/de.po
+++ b/po/de.po
@@ -6131,7 +6131,7 @@ msgid "Menger"
msgstr "Menger"
#: hacks/config/menger.xml.h:19
-msgid "This draws the three-dimensional variant of the recursive Menger Gasket, a cube-based fractal object analagous to the Sierpinski Tetrahedron. Written by Jamie Zawinski."
+msgid "This draws the three-dimensional variant of the recursive Menger Gasket, a cube-based fractal object analogous to the Sierpinski Tetrahedron. Written by Jamie Zawinski."
msgstr ""
#: hacks/config/metaballs.xml.h:1
diff --git a/po/es.po b/po/es.po
index 12bbdbb..1a262c5 100644
--- a/po/es.po
+++ b/po/es.po
@@ -6244,7 +6244,7 @@ msgstr "Menger"
#: hacks/config/menger.xml.h:19
msgid ""
"This draws the three-dimensional variant of the recursive Menger Gasket, a "
-"cube-based fractal object analagous to the Sierpinski Tetrahedron. Written "
+"cube-based fractal object analogous to the Sierpinski Tetrahedron. Written "
"by Jamie Zawinski."
msgstr ""
"Dibuja la variante tridimensional del Empaquetador Menger recursivo, un "
diff --git a/po/et.po b/po/et.po
index b769928..a670c68 100644
--- a/po/et.po
+++ b/po/et.po
@@ -5693,7 +5693,7 @@ msgstr ""
#: hacks/config/menger.xml.h:19
msgid ""
"This draws the three-dimensional variant of the recursive Menger Gasket, a "
-"cube-based fractal object analagous to the Sierpinski Tetrahedron. Written "
+"cube-based fractal object analogous to the Sierpinski Tetrahedron. Written "
"by Jamie Zawinski."
msgstr ""
diff --git a/po/fi.po b/po/fi.po
index 7bb4e10..954128e 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -5659,7 +5659,7 @@ msgstr ""
#: hacks/config/menger.xml.h:19
msgid ""
"This draws the three-dimensional variant of the recursive Menger Gasket, a "
-"cube-based fractal object analagous to the Sierpinski Tetrahedron. Written "
+"cube-based fractal object analogous to the Sierpinski Tetrahedron. Written "
"by Jamie Zawinski."
msgstr ""
diff --git a/po/fr.po b/po/fr.po
index dfca6a1..c287e2a 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -5850,7 +5850,7 @@ msgstr "Menger"
#: hacks/config/menger.xml.h:18
msgid ""
"This draws the three-dimensional variant of the recursive Menger Gasket, a "
-"cube-based fractal object analagous to the Sierpinski Tetrahedron. Written "
+"cube-based fractal object analogous to the Sierpinski Tetrahedron. Written "
"by Jamie Zawinski; 2001."
msgstr ""
"Dessine une variante tridimensionnelle du tamis récursif de Menger, un objet "
diff --git a/po/hu.po b/po/hu.po
index 7c57137..fa25bc1 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -6179,7 +6179,7 @@ msgstr "Menger"
#: hacks/config/menger.xml.h:19
msgid ""
"This draws the three-dimensional variant of the recursive Menger Gasket, a "
-"cube-based fractal object analagous to the Sierpinski Tetrahedron. Written "
+"cube-based fractal object analogous to the Sierpinski Tetrahedron. Written "
"by Jamie Zawinski."
msgstr ""
"A rekurzív Menger-féle alakzat egy háromdimenziós variánsát rajzolja ki, ami "
diff --git a/po/it.po b/po/it.po
index d0e7b91..c84b702 100644
--- a/po/it.po
+++ b/po/it.po
@@ -5687,7 +5687,7 @@ msgstr ""
#: hacks/config/menger.xml.h:19
msgid ""
"This draws the three-dimensional variant of the recursive Menger Gasket, a "
-"cube-based fractal object analagous to the Sierpinski Tetrahedron. Written "
+"cube-based fractal object analogous to the Sierpinski Tetrahedron. Written "
"by Jamie Zawinski."
msgstr ""
diff --git a/po/ja.po b/po/ja.po
index bb79ec2..ecdbccb 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -4,27 +4,28 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: xscreensaver 5.32-4\n"
+"Project-Id-Version: xscreensaver 6.00b2\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-02-02 12:45+0900\n"
-"PO-Revision-Date: 2006-06-28 00:51+0900\n"
-"Last-Translator: Mamoru Tasaka <mtasaka@ioa.s.u-tokyo.ac.jp>\n"
+"POT-Creation-Date: 2021-03-22 22:55+0900\n"
+"PO-Revision-Date: 2021-03-23 23:52+0900\n"
+"Last-Translator: Mamoru TASAKA <mtasaka@fedoraproject.org>\n"
"Language-Team: Japanese <translation@gnome.gr.jp>\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Former-Translator: Takeshi Aihana <aihana@gnome.gr.jp>\n"
+"X-Generator: Poedit 2.4.2\n"
-#: ../../po/../driver/demo-Gtk-conf.c:884
+#: ../driver/demo-Gtk-conf.c:897
msgid "Browse..."
msgstr "参照..."
-#: ../../po/../driver/demo-Gtk-conf.c:1087
+#: ../driver/demo-Gtk-conf.c:1100
msgid "Select file."
msgstr "ファイルを選択して下さい。"
-#: ../../po/../driver/demo-Gtk.c:755 ../../po/../driver/demo-Gtk.c:4484
+#: ../driver/demo-Gtk.c:729 ../driver/demo-Gtk.c:4528
#, c-format
msgid ""
"Warning:\n"
@@ -37,15 +38,15 @@ msgstr ""
"ディスプレイ \"%s\" 上で XScreenSaver デーモンが\n"
"起動されていないようです。起動しますか?"
-#: ../../po/../driver/demo-Gtk.c:804
-msgid "For updates, check http://www.jwz.org/xscreensaver/"
-msgstr "更新情報については http://www.jwz.org/xscreensaver/ を参照して下さい。"
+#: ../driver/demo-Gtk.c:779
+msgid "For updates, check https://www.jwz.org/xscreensaver/"
+msgstr "更新情報については http://www.jwz.org/xscreensaver/ を参照して下さい"
-#: ../../po/../driver/demo-Gtk.c:902
+#: ../driver/demo-Gtk.c:876 ../driver/dialog.c:1513
msgid "OK"
msgstr "OK"
-#: ../../po/../driver/demo-Gtk.c:940
+#: ../driver/demo-Gtk.c:915
msgid ""
"Error:\n"
"\n"
@@ -55,7 +56,7 @@ msgstr ""
"\n"
"ヘルプの URL が指定されていません。\n"
-#: ../../po/../driver/demo-Gtk.c:1037
+#: ../driver/demo-Gtk.c:1012
msgid ""
"Error:\n"
"\n"
@@ -67,46 +68,25 @@ msgstr ""
"XScreenSaver デーモンが正しく起動されていません。\n"
"\n"
-#: ../../po/../driver/demo-Gtk.c:1049
+#: ../driver/demo-Gtk.c:1018
msgid ""
"You are running as root. This usually means that xscreensaver\n"
"was unable to contact your X server because access control is\n"
-"turned on. Try running this command:\n"
-"\n"
-" xhost +localhost\n"
-"\n"
-"and then selecting `File / Restart Daemon'.\n"
-"\n"
-"Note that turning off access control will allow anyone logged\n"
-"on to this machine to access your screen, which might be\n"
-"considered a security problem. Please read the xscreensaver\n"
-"manual and FAQ for more information.\n"
-"\n"
+"turned on.\n"
"You shouldn't run X as root. Instead, you should log in as a\n"
-"normal user, and `su' as necessary."
+"normal user, and `sudo' as necessary."
msgstr ""
-"root 権限で起動中です。これは、通常アクセスコントロールが有効になっているの"
-"で\n"
-"XScreenSaver はお使いの X サーバと通信することが不可能になることを\n"
-"意味します。次のコマンドを実行してみて下さい:\n"
-"\n"
-" xhost +localhost\n"
-"\n"
-"その後にメニューの 'ファイル - デーモンの再起動' を選択して下さい。\n"
-"\n"
-"アクセスコントロールを無効にすると、お使いのスクリーンに\n"
-"アクセスするために誰もがこのマシンにログインできてしまいます。\n"
-"これはセキュリティ問題に配慮した対策です。\n"
-"詳細は XScreenSaver マニュアルと FAQ を参照して下さい。\n"
-"\n"
-"root 権限で X サーバを起動しないで下さい。必要であれば、\n"
-"一般ユーザでログインして 'su' コマンドで代用して下さい。"
+"ルートユーザで実行されています. 通常、ルートではxscreensaverはXサーバに\n"
+"アクセスできません: アクセス制御が働く\n"
+"ためです.\n"
+"X環境をルートで実行すべきではありません.代わりに、通常ユーザで\n"
+"ログインして、必要なときに`sudo'を実行してください."
-#: ../../po/../driver/demo-Gtk.c:1065
+#: ../driver/demo-Gtk.c:1037
msgid "Please check your $PATH and permissions."
msgstr "環境変数 $PATH とその権限を確認して下さい。"
-#: ../../po/../driver/demo-Gtk.c:1103
+#: ../driver/demo-Gtk.c:1069
msgid ""
"Error:\n"
"\n"
@@ -116,7 +96,7 @@ msgstr ""
"\n"
"初期化ファイル名を特定できませんでした!\n"
-#: ../../po/../driver/demo-Gtk.c:1108
+#: ../driver/demo-Gtk.c:1074
#, c-format
msgid ""
"Error:\n"
@@ -127,7 +107,7 @@ msgstr ""
"\n"
"%s に書き込めませんでした。\n"
-#: ../../po/../driver/demo-Gtk.c:1171
+#: ../driver/demo-Gtk.c:1137
msgid ""
"Error:\n"
"\n"
@@ -137,7 +117,7 @@ msgstr ""
"\n"
"リソース 'manualCommand' がセットされていません。"
-#: ../../po/../driver/demo-Gtk.c:1354
+#: ../driver/demo-Gtk.c:1320
#, c-format
msgid ""
"Error:\n"
@@ -148,12 +128,12 @@ msgstr ""
"\n"
"時刻の書式を解析できません: \"%s\"\n"
-#: ../../po/../driver/demo-Gtk.c:1793 ../../po/../driver/demo-Gtk.c:3370
-#: ../driver/xscreensaver-demo.glade2.in.h:102
+#: ../driver/demo-Gtk.c:1791 ../driver/demo-Gtk.c:3403
+#: ../driver/xscreensaver.ui.h:7
msgid "Any"
msgstr "任せる"
-#: ../../po/../driver/demo-Gtk.c:2091
+#: ../driver/demo-Gtk.c:2076
#, c-format
msgid ""
"Error:\n"
@@ -164,7 +144,7 @@ msgstr ""
"\n"
"次のディレクトリが存在しません: \"%s\"\n"
-#: ../../po/../driver/demo-Gtk.c:2121 ../../po/../driver/demo-Gtk.c:2152
+#: ../driver/demo-Gtk.c:2106 ../driver/demo-Gtk.c:2137
#, c-format
msgid ""
"Error:\n"
@@ -175,40 +155,40 @@ msgstr ""
"\n"
"次のファイルが存在しません: \"%s\"\n"
-#: ../../po/../driver/demo-Gtk.c:2533
+#: ../driver/demo-Gtk.c:2523
msgid "Use"
msgstr "ON"
-#: ../../po/../driver/demo-Gtk.c:2543
+#: ../driver/demo-Gtk.c:2533
msgid "Screen Saver"
msgstr "スクリーンセーバー名"
-#: ../../po/../driver/demo-Gtk.c:2995
+#: ../driver/demo-Gtk.c:3020
msgid "Descriptions not available: no XML support compiled in."
msgstr "説明が有効ではありません: XML サポートでコンパイルされていません。"
-#: ../../po/../driver/demo-Gtk.c:3000
+#: ../driver/demo-Gtk.c:3025
msgid "No description available."
msgstr "有効な説明はありません。"
-#: ../../po/../driver/demo-Gtk.c:3322
+#: ../driver/demo-Gtk.c:3355
msgid "Blank Screen"
msgstr "ブランク・スクリーン"
-#: ../../po/../driver/demo-Gtk.c:3328
+#: ../driver/demo-Gtk.c:3361
msgid "Screen Saver Disabled"
msgstr "スクリーンセーバーは無効です"
-#: ../../po/../driver/demo-Gtk.c:3351
+#: ../driver/demo-Gtk.c:3384
msgid "Preview"
msgstr "プレビュー"
-#: ../../po/../driver/demo-Gtk.c:3361
+#: ../driver/demo-Gtk.c:3394
#, c-format
msgid "%s: %.100s Settings"
msgstr "%s: %.100s の設定"
-#: ../../po/../driver/demo-Gtk.c:3525
+#: ../driver/demo-Gtk.c:3559
#, c-format
msgid ""
"Warning:\n"
@@ -219,23 +199,23 @@ msgstr ""
"\n"
"ファイル \"%s\" が変更されました。再読込みします。\n"
-#: ../../po/../driver/demo-Gtk.c:3612
+#: ../driver/demo-Gtk.c:3646
msgid "No Preview"
msgstr "プレビューを"
-#: ../../po/../driver/demo-Gtk.c:3612
+#: ../driver/demo-Gtk.c:3646
msgid "Available"
-msgstr "利用できません。"
+msgstr "利用できません"
-#: ../../po/../driver/demo-Gtk.c:3613
+#: ../driver/demo-Gtk.c:3647
msgid "Not"
-msgstr "インストールされていません"
+msgstr "インストール"
-#: ../../po/../driver/demo-Gtk.c:3613
+#: ../driver/demo-Gtk.c:3647
msgid "Installed"
-msgstr ""
+msgstr "されていません"
-#: ../../po/../driver/demo-Gtk.c:4494
+#: ../driver/demo-Gtk.c:4538
#, c-format
msgid ""
"Warning:\n"
@@ -268,7 +248,7 @@ msgstr ""
"\n"
"XScreenSaver デーモンを再起動しますか?\n"
-#: ../../po/../driver/demo-Gtk.c:4519
+#: ../driver/demo-Gtk.c:4563
#, c-format
msgid ""
"Warning:\n"
@@ -295,7 +275,7 @@ msgstr ""
"\n"
"XScreenSaver デーモンを \"%s\" 上で \"%s\" から再起動しますか?\n"
-#: ../../po/../driver/demo-Gtk.c:4541
+#: ../driver/demo-Gtk.c:4585
#, c-format
msgid ""
"Warning:\n"
@@ -314,7 +294,7 @@ msgstr ""
"\n"
"XScreenSaver デーモンを再起動しますか?\n"
-#: ../../po/../driver/demo-Gtk.c:4569
+#: ../driver/demo-Gtk.c:4613
msgid ""
"Warning:\n"
"\n"
@@ -330,7 +310,7 @@ msgstr ""
"\n"
"GNOMEスクリーンセーバーを直ちに停止しますか?\n"
-#: ../../po/../driver/demo-Gtk.c:4578
+#: ../driver/demo-Gtk.c:4622
msgid ""
"Warning:\n"
"\n"
@@ -346,27 +326,123 @@ msgstr ""
"\n"
"KDEスクリーンセーバーを直ちに停止しますか?\n"
-#: ../../po/../driver/demo-Gtk.c:5030
+#: ../driver/demo-Gtk.c:5065
#, c-format
msgid "%s: unknown option: %s\n"
msgstr "%s: 不明なオプション: %s\n"
-#: ../../po/../driver/demo-Gtk.c:5095
+#: ../driver/demo-Gtk.c:5115
msgid "Screensaver Preferences"
msgstr "XScreenSaverの設定"
-#: ../../po/../driver/demo-Gtk.c:5297
+#: ../driver/demo-Gtk.c:5318
msgid ""
"Warning:\n"
"\n"
"This version of xscreensaver is VERY OLD!\n"
"Please upgrade!\n"
"\n"
-"http://www.jwz.org/xscreensaver/\n"
+"https://www.jwz.org/xscreensaver/\n"
"\n"
"(If this is the latest version that your distro ships, then\n"
"your distro is doing you a disservice. Build from source.)\n"
msgstr ""
+"警告:\n"
+"\n"
+"このxscreensaverのバージョンはとても古いです!\n"
+"アップグレードしてください!\n"
+"\n"
+"https://www.jwz.org/xscreensaver/\n"
+"\n"
+
+#: ../driver/dialog.c:965
+#, c-format
+msgid ""
+"Copyright © 1991-%.4s by\n"
+"Jamie Zawinski <jwz@jwz.org>"
+msgstr ""
+
+#: ../driver/dialog.c:1283
+msgid ""
+"Update available!\n"
+"This version is very old.\n"
+msgstr ""
+"パッケージが更新可能です!\n"
+"このバージョンはとても古いです.\n"
+
+#: ../driver/dialog.c:1294
+msgid "PRE-RELEASE VERSION"
+msgstr "プレリリースバージョンです"
+
+#: ../driver/dialog.c:1328
+msgid ""
+"DEBUG MODE:\n"
+"All keystrokes are being logged to stderr.\n"
+msgstr ""
+"デバッグモードです:\n"
+"キーストロークは、全てエラー出力に表示されます。\n"
+
+#: ../driver/dialog.c:1374
+msgid "Username:"
+msgstr "ユーザ名:"
+
+#: ../driver/dialog.c:1402
+msgid "Checking..."
+msgstr "確認しています..."
+
+#: ../driver/dialog.c:1479 ../driver/xscreensaver.ui.h:112
+msgid "Settings"
+msgstr "設定"
+
+#: ../driver/dialog.c:1489
+msgid "Help"
+msgstr "ヘルプ"
+
+#: ../driver/dialog.c:1502
+msgid "New Login"
+msgstr "別ユーザに切り替え"
+
+#: ../driver/dialog.c:2440
+msgid "Password initialization failed"
+msgstr "パスワード画面の初期化に失敗しました"
+
+#: ../driver/dialog.c:2442
+msgid "Authentication failed (Caps Lock?)"
+msgstr "認証に失敗しました(Caps Lock?)"
+
+#: ../driver/dialog.c:2444
+msgid "Authentication failed!"
+msgstr "認証に失敗しました!"
+
+#: ../driver/dialog.c:2464
+#, c-format
+msgid "%d days ago"
+msgstr "%d 日前でした"
+
+#: ../driver/dialog.c:2465
+#, c-format
+msgid "%d hours ago"
+msgstr "%d 時間前でした"
+
+#: ../driver/dialog.c:2466
+#, c-format
+msgid "%d minutes ago"
+msgstr "%d 分前でした"
+
+#: ../driver/dialog.c:2467
+#, c-format
+msgid "just now"
+msgstr "今さっきでした"
+
+#: ../driver/dialog.c:2470
+#, c-format
+msgid "There has been 1 failed login attempt, %s."
+msgstr "過去1回認証に失敗しました. %s."
+
+#: ../driver/dialog.c:2473
+#, c-format
+msgid "There have been %d failed login attempts, oldest %s."
+msgstr "過去%d回認証に失敗しました.一番古い失敗は%s."
#: ../driver/screensaver-properties.desktop.in.h:1
msgid "Screensaver"
@@ -376,92 +452,184 @@ msgstr "スクリーンセーバー"
msgid "Change screensaver properties"
msgstr "スクリーンセーバーの設定を変更する"
-#: ../driver/xscreensaver-demo.glade2.in.h:1
-msgid "XScreenSaver"
-msgstr "XScreenSaver"
+#: ../driver/subprocs.c:571
+#, c-format
+msgid "crashed with status %d"
+msgstr "はステータス%d で異常終了しました"
+
+#. Expected notification after we killed it.
+#: ../driver/subprocs.c:588
+#, c-format
+msgid "exited normally with %.100s"
+msgstr "%.100s で正常に終了しました"
+
+#. Unexpected signal.
+#: ../driver/subprocs.c:597
+#, c-format
+msgid "crashed with %.100s"
+msgstr "%.100s でクラッシュしました"
+
+#. Didn't exit, signal or stop; is this even possible?
+#: ../driver/subprocs.c:618
+#, c-format
+msgid "crashed mysteriously"
+msgstr "不明な原因でクラッシュしました"
+
+#: ../driver/xscreensaver.ui.h:1
+msgid "Disable Screen Saver"
+msgstr "スクリーンセーバーを無効にする"
+
+#: ../driver/xscreensaver.ui.h:2
+msgid "Blank Screen Only"
+msgstr "ブランク・スクリーンのみ"
+
+#: ../driver/xscreensaver.ui.h:3
+msgid "Only One Screen Saver"
+msgstr "一つのスクリーンセーバーのみ"
+
+#: ../driver/xscreensaver.ui.h:4
+msgid "Random Screen Saver"
+msgstr "ランダムなスクリーンセーバー"
+
+#: ../driver/xscreensaver.ui.h:5
+msgid "Same Random Savers"
+msgstr "同じランダムなセーバ"
+
+#: ../driver/xscreensaver.ui.h:6
+msgid "Default"
+msgstr "デフォルト"
+
+#: ../driver/xscreensaver.ui.h:8
+msgid "Best"
+msgstr "最適"
+
+#: ../driver/xscreensaver.ui.h:9
+msgid "Default-N"
+msgstr "デフォルト-N"
+
+#: ../driver/xscreensaver.ui.h:10
+msgid "GL"
+msgstr "GL"
+
+#: ../driver/xscreensaver.ui.h:11
+msgid "TrueColor"
+msgstr "TrueColor"
+
+#: ../driver/xscreensaver.ui.h:12
+msgid "PseudoColor"
+msgstr "PseudoColor"
+
+#: ../driver/xscreensaver.ui.h:13
+msgid "StaticGray"
+msgstr "StaticGray"
+
+#: ../driver/xscreensaver.ui.h:14
+msgid "GrayScale"
+msgstr "グレースケール"
+
+#: ../driver/xscreensaver.ui.h:15
+msgid "DirectColor"
+msgstr "DirectColor"
+
+#: ../driver/xscreensaver.ui.h:16
+msgid "Color"
+msgstr "色"
+
+#: ../driver/xscreensaver.ui.h:17
+msgid "Gray"
+msgstr "グレー"
-#: ../driver/xscreensaver-demo.glade2.in.h:2
+#: ../driver/xscreensaver.ui.h:18 ../hacks/config/razzledazzle.xml.h:8
+#: ../hacks/config/scooter.xml.h:14
+msgid "Mono"
+msgstr "単色"
+
+#: ../driver/xscreensaver.ui.h:19
msgid "_File"
msgstr "ファイル(_F)"
-#: ../driver/xscreensaver-demo.glade2.in.h:3
+#: ../driver/xscreensaver.ui.h:20
msgid "_Blank Screen Now"
msgstr "XScreenSaver の起動(_B)"
-#: ../driver/xscreensaver-demo.glade2.in.h:4
+#: ../driver/xscreensaver.ui.h:21
msgid "_Lock Screen Now"
msgstr "画面のロック(_L)"
-#: ../driver/xscreensaver-demo.glade2.in.h:5
+#: ../driver/xscreensaver.ui.h:22
msgid "_Kill Daemon"
msgstr "デーモンの強制終了(_K)"
-#: ../driver/xscreensaver-demo.glade2.in.h:6
+#: ../driver/xscreensaver.ui.h:23
msgid "_Restart Daemon"
msgstr "デーモンの再起動(_R)"
-#: ../driver/xscreensaver-demo.glade2.in.h:7
+#: ../driver/xscreensaver.ui.h:24
msgid "_Quit"
msgstr "終了(_Q)"
-#: ../driver/xscreensaver-demo.glade2.in.h:8
+#: ../driver/xscreensaver.ui.h:25
msgid "_Help"
msgstr "ヘルプ(_H)"
-#: ../driver/xscreensaver-demo.glade2.in.h:9
+#: ../driver/xscreensaver.ui.h:26
msgid "_About..."
msgstr "情報(_A)..."
-#: ../driver/xscreensaver-demo.glade2.in.h:10
+#: ../driver/xscreensaver.ui.h:27
msgid "_Documentation..."
msgstr "ドキュメント(_D)..."
-#: ../driver/xscreensaver-demo.glade2.in.h:11
+#: ../driver/xscreensaver.ui.h:28
+msgid "XScreenSaver"
+msgstr "XScreenSaver"
+
+#: ../driver/xscreensaver.ui.h:29
msgid "_Cycle After"
-msgstr "セーバーの周期(_C): "
+msgstr "セーバーの周期(_C)"
-#: ../driver/xscreensaver-demo.glade2.in.h:12
+#: ../driver/xscreensaver.ui.h:30
msgid "Whether a password should be required to un-blank the screen."
msgstr ""
"画面をブランクした後、しばらくして自動的にロックしたい時は、これを選択して下"
"さい。"
-#: ../driver/xscreensaver-demo.glade2.in.h:13
+#: ../driver/xscreensaver.ui.h:31
msgid "_Lock Screen After "
msgstr "画面をロックするまで(_L): "
-#: ../driver/xscreensaver-demo.glade2.in.h:14
+#: ../driver/xscreensaver.ui.h:32
msgid "Lock Screen"
msgstr "画面をロックする"
-#: ../driver/xscreensaver-demo.glade2.in.h:15
+#: ../driver/xscreensaver.ui.h:33
msgid "How long before the screen saver activates."
msgstr "セーバーが起動するまでの時間を指定して下さい。"
-#: ../driver/xscreensaver-demo.glade2.in.h:16
+#: ../driver/xscreensaver.ui.h:34
msgid "How long after the screen blanks until a password will be required."
msgstr "画面がブランクになってからロックするまでの時間を指定して下さい。"
-#: ../driver/xscreensaver-demo.glade2.in.h:17
+#: ../driver/xscreensaver.ui.h:35
msgid "Lock Screen After"
-msgstr "画面ロックの起動: "
+msgstr "画面をロックするまで"
-#: ../driver/xscreensaver-demo.glade2.in.h:18
+#: ../driver/xscreensaver.ui.h:36
msgid ""
"How long each display mode should run before choosing a new one (in Random "
"mode.)"
msgstr ""
"ランダムなセーバーモードの時、次のセーバーに移るまでの時間を指定して下さい。"
-#: ../driver/xscreensaver-demo.glade2.in.h:19
+#: ../driver/xscreensaver.ui.h:37
msgid "minutes"
msgstr "分"
-#: ../driver/xscreensaver-demo.glade2.in.h:20
+#: ../driver/xscreensaver.ui.h:38
msgid "_Blank After"
-msgstr "ブランクになるまで(_B): "
+msgstr "ブランクになるまで(_B)"
-#: ../driver/xscreensaver-demo.glade2.in.h:21
+#: ../driver/xscreensaver.ui.h:39
msgid ""
"Demo the selected screen saver in full-screen mode (click the mouse to "
"return.)"
@@ -469,74 +637,23 @@ msgstr ""
"指定したスクリーンセーバーを全画面モードでデモします (解除する場合はマウスを"
"クリックして下さい)。"
-#: ../driver/xscreensaver-demo.glade2.in.h:22
+#: ../driver/xscreensaver.ui.h:40
msgid "_Preview"
msgstr "プレビュー(_P)"
-#: ../driver/xscreensaver-demo.glade2.in.h:23
+#: ../driver/xscreensaver.ui.h:41
msgid "Customization and explanation of the selected screen saver."
msgstr "指定したスクリーンセーバーの紹介とそのカスタマイズです。"
-#: ../driver/xscreensaver-demo.glade2.in.h:24
+#: ../driver/xscreensaver.ui.h:42
msgid "_Settings..."
msgstr "設定(_S)"
-#: ../driver/xscreensaver-demo.glade2.in.h:25
+#: ../driver/xscreensaver.ui.h:43
msgid "_Mode:"
msgstr "モード(_M):"
-#: ../driver/xscreensaver-demo.glade2.in.h:26
-msgid "Never blank the screen or power down the monitor."
-msgstr "スクリーンを暗くしたり、モニターの電源を落としたりしません。"
-
-#: ../driver/xscreensaver-demo.glade2.in.h:27
-msgid "_Disable Screen Saver"
-msgstr "セーバーを無効にする(_D)"
-
-#: ../driver/xscreensaver-demo.glade2.in.h:28
-msgid "When idle or locked, blacken the screen only."
-msgstr "セーバーが起動した時、ただ単にスクリーンを真っ暗にします。"
-
-#: ../driver/xscreensaver-demo.glade2.in.h:29
-msgid "_Blank Screen Only"
-msgstr "ブランク・スクリーンのみ(_B)"
-
-#: ../driver/xscreensaver-demo.glade2.in.h:30
-msgid "When idle or locked, run the display mode selected below."
-msgstr ""
-"セーバーが起動した時、下のリストで選択された(一つの)モードをモニターに表示"
-"します。"
-
-#: ../driver/xscreensaver-demo.glade2.in.h:31
-msgid "_Only One Screen Saver"
-msgstr "一つのセーバーのみ(_O)"
-
-#: ../driver/xscreensaver-demo.glade2.in.h:32
-msgid ""
-"When idle or locked, choose a random display mode from among the checked "
-"items in the list below."
-msgstr ""
-"セーバーが起動した時、下のリストでチェックが入っているモードからランダムに選"
-"択して、(代る代る)モニターに表示します。"
-
-#: ../driver/xscreensaver-demo.glade2.in.h:33
-msgid "_Random Screen Saver"
-msgstr "ランダムなセーバを用いる(_R)"
-
-#: ../driver/xscreensaver-demo.glade2.in.h:34
-msgid ""
-"When idle or locked, choose a random display mode from among the checked "
-"items in the list below. Run that same mode on each monitor."
-msgstr ""
-"セーバーが起動した時、下のリストでチェックが入っているモードからランダムに選"
-"択して、(代る代る)モニターに表示します。各モニターには同じモードが表示され"
-"ます。"
-
-#: ../driver/xscreensaver-demo.glade2.in.h:35
-msgid "_Same Random Savers"
-msgstr "同じランダムなセーバ(_S)"
-
-#: ../driver/xscreensaver-demo.glade2.in.h:36
+#: ../driver/xscreensaver.ui.h:44
msgid ""
"Run the next screen saver in the list in full-screen mode (click the mouse "
"to return.)"
@@ -544,7 +661,7 @@ msgstr ""
"一つ次のスクリーンセーバーを全画面モードで起動します (解除する場合はマウスを"
"クリックして下さい)。"
-#: ../driver/xscreensaver-demo.glade2.in.h:37
+#: ../driver/xscreensaver.ui.h:45
msgid ""
"Run the previous screen saver in the list in full-screen mode (click the "
"mouse to return.)"
@@ -552,31 +669,31 @@ msgstr ""
"一つ前のスクリーンセーバーを全画面モードで起動します (解除する場合はマウスを"
"クリックして下さい)。"
-#: ../driver/xscreensaver-demo.glade2.in.h:38
+#: ../driver/xscreensaver.ui.h:46
msgid "preview"
msgstr "プレビュー"
-#: ../driver/xscreensaver-demo.glade2.in.h:39
+#: ../driver/xscreensaver.ui.h:47
msgid ""
"No Preview\n"
"Available"
msgstr "プレビューを利用できません"
-#: ../driver/xscreensaver-demo.glade2.in.h:41
+#: ../driver/xscreensaver.ui.h:49
msgid "no preview"
msgstr "プレビューを利用出来ません"
-#: ../driver/xscreensaver-demo.glade2.in.h:42
+#: ../driver/xscreensaver.ui.h:50
msgid ""
"Not\n"
"Installed"
msgstr "インストールされていません"
-#: ../driver/xscreensaver-demo.glade2.in.h:44
+#: ../driver/xscreensaver.ui.h:52
msgid "not installed"
msgstr "インストールされていません"
-#: ../driver/xscreensaver-demo.glade2.in.h:45
+#: ../driver/xscreensaver.ui.h:53
msgid ""
"Very few (or no) screen savers appear to be available.\n"
"\n"
@@ -588,30 +705,29 @@ msgstr ""
"\"xscreensaver-gl-extras\"のパッケージがインストールされていない\n"
"ためだと思われます。"
-#: ../driver/xscreensaver-demo.glade2.in.h:49
+#: ../driver/xscreensaver.ui.h:57
msgid "nothing"
msgstr ""
-#: ../driver/xscreensaver-demo.glade2.in.h:50
+#: ../driver/xscreensaver.ui.h:58
msgid "Description"
msgstr "説明"
-#: ../driver/xscreensaver-demo.glade2.in.h:51
+#: ../driver/xscreensaver.ui.h:59
msgid "_Display Modes"
-msgstr "表示モード"
+msgstr "表示モード(_D)"
-#: ../driver/xscreensaver-demo.glade2.in.h:52
+#: ../driver/xscreensaver.ui.h:60
msgid ""
"Whether the image-manipulating modes should be allowed to operate on an "
"image of your desktop."
-msgstr ""
-"画像の操作モードで、デスクトップの画像を使うかどうかを選択して下さい。"
+msgstr "画像の操作モードで、デスクトップの画像を使うかどうかを選択して下さい。"
-#: ../driver/xscreensaver-demo.glade2.in.h:53
+#: ../driver/xscreensaver.ui.h:61
msgid "Grab Desktop _Images"
msgstr "デスクトップ画像を用いる(_I)"
-#: ../driver/xscreensaver-demo.glade2.in.h:54
+#: ../driver/xscreensaver.ui.h:62
msgid ""
"Whether the image-manipulating modes should operate on images captured from "
"the system's video input (if there is one.)"
@@ -619,121 +735,120 @@ msgstr ""
"画像の操作モードで (可能な時) ビデオ入力の画像を使うかどうかを選択して下さ"
"い。"
-#: ../driver/xscreensaver-demo.glade2.in.h:55
+#: ../driver/xscreensaver.ui.h:63
msgid "Grab _Video Frames"
msgstr "ビデオ入力を用いる(_V)"
-#: ../driver/xscreensaver-demo.glade2.in.h:56
+#: ../driver/xscreensaver.ui.h:64
msgid "Whether the image-manipulating modes should load image files."
-msgstr ""
-"画像の操作モードで、画像ファイルをを取得するかどうかを"
-"選択して下さい。"
+msgstr "画像の操作モードで、画像ファイルをを取得するかどうかを選択して下さい。"
-#: ../driver/xscreensaver-demo.glade2.in.h:57
+#: ../driver/xscreensaver.ui.h:65
msgid "Choose _Random Image:"
msgstr "画像をランダムに選択する(_R):"
-#: ../driver/xscreensaver-demo.glade2.in.h:58
+#: ../driver/xscreensaver.ui.h:66
msgid ""
"The local directory, RSS feed or Atom feed from which images will be "
"randomly chosen."
-msgstr "ランダムに取得する画像が格納されているローカルのディレクトリや、"
-"RSSフィード、またはAtomフィードのURLを選択して下さい。"
+msgstr ""
+"ランダムに取得する画像が格納されているローカルのディレクトリや、RSSフィード、"
+"またはAtomフィードのURLを選択して下さい。"
-#: ../driver/xscreensaver-demo.glade2.in.h:59
+#: ../driver/xscreensaver.ui.h:67
msgid "_Browse"
msgstr "参照(_B)"
-#: ../driver/xscreensaver-demo.glade2.in.h:60
+#: ../driver/xscreensaver.ui.h:68
msgid "Local directory, or RSS feed URL."
-msgstr "ローカルのディレクトリや、RSSフィードのURL"
+msgstr "ローカルのディレクトリや、RSSフィードのURL."
-#: ../driver/xscreensaver-demo.glade2.in.h:61
+#: ../driver/xscreensaver.ui.h:69
msgid "Image Manipulation"
msgstr "画像の操作"
-#: ../driver/xscreensaver-demo.glade2.in.h:62
+#: ../driver/xscreensaver.ui.h:70
msgid "Text-displaying modes will display the text typed here."
msgstr "(テキストを表示するセーバの時は)次の文字列が出力されます。"
-#: ../driver/xscreensaver-demo.glade2.in.h:63
+#: ../driver/xscreensaver.ui.h:71
msgid "_Text"
msgstr "文字列(_T)"
-#: ../driver/xscreensaver-demo.glade2.in.h:64
+#: ../driver/xscreensaver.ui.h:72
msgid "Text-displaying modes will display the contents of this file."
msgstr ""
"(テキストを表示するセーバの時は)次のテキストファイルの内容が表示されます。"
-#: ../driver/xscreensaver-demo.glade2.in.h:65
+#: ../driver/xscreensaver.ui.h:73
msgid "Text _file"
msgstr "ファイル(_f)"
-#: ../driver/xscreensaver-demo.glade2.in.h:66
+#: ../driver/xscreensaver.ui.h:74
msgid "Text-displaying modes will display the output of this program."
msgstr ""
"(テキストを表示するセーバの時は)次のプログラムの出力結果が表示されます。"
-#: ../driver/xscreensaver-demo.glade2.in.h:67
+#: ../driver/xscreensaver.ui.h:75
msgid "_Program"
msgstr "プログラム(_P)"
-#: ../driver/xscreensaver-demo.glade2.in.h:68
+#: ../driver/xscreensaver.ui.h:76
msgid ""
"Text-displaying modes will display the contents of this URL (HTML or RSS)."
msgstr ""
"(テキストを表示するセーバの時)次のURLの内容が表示されます。HTMLかRSSで書か"
"れている必要があります。"
-#: ../driver/xscreensaver-demo.glade2.in.h:69
+#: ../driver/xscreensaver.ui.h:77
msgid "_URL"
msgstr "_URL"
-#: ../driver/xscreensaver-demo.glade2.in.h:70
+#: ../driver/xscreensaver.ui.h:78
msgid "Text-displaying modes will display the local host name, date, and time."
msgstr "(テキストを表示するセーバの時は)ホスト名と、日時が表示されます。"
-#: ../driver/xscreensaver-demo.glade2.in.h:71
+#: ../driver/xscreensaver.ui.h:79
msgid "_Host Name and Time"
msgstr "ホスト名と日時(_H)"
-#: ../driver/xscreensaver-demo.glade2.in.h:72
+#: ../driver/xscreensaver.ui.h:80
msgid "Text Manipulation"
msgstr "表示するテキストの設定"
-#: ../driver/xscreensaver-demo.glade2.in.h:73
+#: ../driver/xscreensaver.ui.h:81
msgid "Whether the monitor should be powered down after a while."
msgstr "モニタの電源管理を設定するかを選択して下さい。"
-#: ../driver/xscreensaver-demo.glade2.in.h:74
+#: ../driver/xscreensaver.ui.h:82
msgid "_Power Management Enabled"
msgstr "電源管理を有効にする(_P)"
-#: ../driver/xscreensaver-demo.glade2.in.h:75
+#: ../driver/xscreensaver.ui.h:83
msgid "Stand_by After"
-msgstr "スタンバイまで(_b): "
+msgstr "スタンバイまで(_b)"
-#: ../driver/xscreensaver-demo.glade2.in.h:76
+#: ../driver/xscreensaver.ui.h:84
msgid "Sus_pend After"
-msgstr "サスペンドまで(_p): "
+msgstr "サスペンドまで(_p)"
-#: ../driver/xscreensaver-demo.glade2.in.h:77
+#: ../driver/xscreensaver.ui.h:85
msgid "_Off After"
-msgstr "電源OFFまで(_O): "
+msgstr "電源OFFまで(_O)"
-#: ../driver/xscreensaver-demo.glade2.in.h:78
+#: ../driver/xscreensaver.ui.h:86
msgid "How long until the monitor powers down."
msgstr "モニタの電源を OFF にするまでの時間を指定して下さい。"
-#: ../driver/xscreensaver-demo.glade2.in.h:79
+#: ../driver/xscreensaver.ui.h:87
msgid "How long until the monitor goes into power-saving mode."
msgstr "パワーセービング・モードに移行するまでの時間を指定して下さい。"
-#: ../driver/xscreensaver-demo.glade2.in.h:80
+#: ../driver/xscreensaver.ui.h:88
msgid "How long until the monitor goes completely black."
msgstr "モニターがスタンドバイになるまでの時間を指定して下さい。"
-#: ../driver/xscreensaver-demo.glade2.in.h:81
+#: ../driver/xscreensaver.ui.h:89
msgid ""
"Whether the monitor should be powered off immediately in \"Blank Screen Only"
"\" mode, regardless of the above power-management timeouts."
@@ -741,15 +856,15 @@ msgstr ""
"ブランク・スクリーンのみのモードの時、上の電源管理の時間設定にもかかわらずに"
"直ちにモニターの電源を切るかを選択して下さい。"
-#: ../driver/xscreensaver-demo.glade2.in.h:82
+#: ../driver/xscreensaver.ui.h:90
msgid "_Quick Power-off in Blank Only Mode"
msgstr "ブランクモードの時直ちに電源を切る(_Q)"
-#: ../driver/xscreensaver-demo.glade2.in.h:83
+#: ../driver/xscreensaver.ui.h:91
msgid "Display Power Management"
msgstr "モニタのパワーマネージメント"
-#: ../driver/xscreensaver-demo.glade2.in.h:84
+#: ../driver/xscreensaver.ui.h:92
msgid ""
"Whether the screen should slowly fade to black when the screen saver "
"activates."
@@ -757,11 +872,11 @@ msgstr ""
"スクリーンセーバーを起動する時、スクリーンをゆっくりとフェードインするかどう"
"かを選択して下さい。"
-#: ../driver/xscreensaver-demo.glade2.in.h:85
+#: ../driver/xscreensaver.ui.h:93
msgid "Fade to Black when _Blanking"
msgstr "ブランクにする時にフェードイン(_B)"
-#: ../driver/xscreensaver-demo.glade2.in.h:86
+#: ../driver/xscreensaver.ui.h:94
msgid ""
"Whether the screen should slowly fade in from black when the screen saver "
"deactivates."
@@ -769,125 +884,73 @@ msgstr ""
"画面を再び明るくする時、スクリーンをゆっくりとフェードアウトするかどうかを選"
"択して下さい。"
-#: ../driver/xscreensaver-demo.glade2.in.h:87
+#: ../driver/xscreensaver.ui.h:95
msgid "Fade from Black When _Unblanking"
msgstr "明るくする時フェードアウト(_U)"
-#: ../driver/xscreensaver-demo.glade2.in.h:88
+#: ../driver/xscreensaver.ui.h:96
msgid "F_ade Duration"
-msgstr "フェードする時間(_a): "
+msgstr "フェードする時間(_a)"
-#: ../driver/xscreensaver-demo.glade2.in.h:89
+#: ../driver/xscreensaver.ui.h:97
msgid "How long it should take for the screen to fade in and out."
msgstr "スクリーンをフェードイン/アウトする時間を指定して下さい。"
-#: ../driver/xscreensaver-demo.glade2.in.h:90
+#: ../driver/xscreensaver.ui.h:98
msgid "seconds"
msgstr "秒間"
-#: ../driver/xscreensaver-demo.glade2.in.h:91
-msgid ""
-"Whether to install a private colormap when running in 8-bit mode on the "
-"default Visual."
-msgstr ""
-"デフォルトの表示として 8-bit モードで起動する場合、個人のカラーマップをインス"
-"トールするかどうかを選択して下さい。"
+#: ../driver/xscreensaver.ui.h:99
+msgid "_Theme:"
+msgstr "テーマ(_T):"
-#: ../driver/xscreensaver-demo.glade2.in.h:92
-msgid "Install _Colormap"
-msgstr "カラーマップをインストールする(_C)"
+#: ../driver/xscreensaver.ui.h:100
+msgid "The color scheme to use on the unlock dialog."
+msgstr "パスワード画面で使うカラースキームを設定してください."
-#: ../driver/xscreensaver-demo.glade2.in.h:93
-msgid "Fading and Colormaps"
-msgstr "フェードとカラーマップ"
+#: ../driver/xscreensaver.ui.h:101
+msgid "Show the what the unlock dialog will look like."
+msgstr "実際どのように見えるかを表示します."
-#: ../driver/xscreensaver-demo.glade2.in.h:94
+#: ../driver/xscreensaver.ui.h:102
+msgid "Blanking"
+msgstr "ブランク・スクリーン"
+
+#: ../driver/xscreensaver.ui.h:103
msgid "_Advanced"
msgstr "拡張オプション(_A)"
-#: ../driver/xscreensaver-demo.glade2.in.h:95
+#: ../driver/xscreensaver.ui.h:104
msgid "dialog1"
msgstr "ダイアログ1"
-#: ../driver/xscreensaver-demo.glade2.in.h:96
+#: ../driver/xscreensaver.ui.h:105
msgid "_Advanced >>"
msgstr "拡張オプション(_A)>>"
-#: ../driver/xscreensaver-demo.glade2.in.h:97
+#: ../driver/xscreensaver.ui.h:106
msgid "_Standard <<"
msgstr "標準オプション(_S)<<"
-#: ../driver/xscreensaver-demo.glade2.in.h:98
+#: ../driver/xscreensaver.ui.h:107
msgid "_Reset to Defaults"
msgstr "デフォルトに戻す(_R)"
-#: ../driver/xscreensaver-demo.glade2.in.h:99
+#: ../driver/xscreensaver.ui.h:108
msgid "Standard"
msgstr "標準"
-#: ../driver/xscreensaver-demo.glade2.in.h:100
+#: ../driver/xscreensaver.ui.h:109
msgid "_Command Line:"
msgstr "コマンド(_C):"
-#: ../driver/xscreensaver-demo.glade2.in.h:101
+#: ../driver/xscreensaver.ui.h:110
msgid "_Visual:"
msgstr "ビジュアル(_V):"
-#: ../driver/xscreensaver-demo.glade2.in.h:103
-msgid "Best"
-msgstr "最適"
-
-#: ../driver/xscreensaver-demo.glade2.in.h:104
-msgid "Default"
-msgstr "デフォルト"
-
-#: ../driver/xscreensaver-demo.glade2.in.h:105
-msgid "Default-N"
-msgstr "デフォルト-N"
-
-#: ../driver/xscreensaver-demo.glade2.in.h:106
-msgid "GL"
-msgstr "GL"
-
-#: ../driver/xscreensaver-demo.glade2.in.h:107
-msgid "TrueColor"
-msgstr "TrueColor"
-
-#: ../driver/xscreensaver-demo.glade2.in.h:108
-msgid "PseudoColor"
-msgstr "PseudoColor"
-
-#: ../driver/xscreensaver-demo.glade2.in.h:109
-msgid "StaticGray"
-msgstr "StaticGray"
-
-#: ../driver/xscreensaver-demo.glade2.in.h:110
-msgid "GrayScale"
-msgstr "グレースケール"
-
-#: ../driver/xscreensaver-demo.glade2.in.h:111
-msgid "DirectColor"
-msgstr "DirectColor"
-
-#: ../driver/xscreensaver-demo.glade2.in.h:112
-msgid "Color"
-msgstr "色"
-
-#: ../driver/xscreensaver-demo.glade2.in.h:113
-msgid "Gray"
-msgstr "グレー"
-
-#: ../driver/xscreensaver-demo.glade2.in.h:114
-msgid "Mono"
-msgstr "単色"
-
-#: ../driver/xscreensaver-demo.glade2.in.h:115
+#: ../driver/xscreensaver.ui.h:111
msgid "Advanced"
-msgstr "オプション"
-
-#: ../driver/xscreensaver-demo.glade2.in.h:116
-msgid "Settings"
-msgstr "設定"
+msgstr "拡張オプション"
#: ../hacks/config/abstractile.xml.h:1
msgid "Abstractile"
@@ -900,56 +963,73 @@ msgstr ""
#: ../hacks/config/boxed.xml.h:5 ../hacks/config/carousel.xml.h:5
#: ../hacks/config/ccurve.xml.h:5 ../hacks/config/circuit.xml.h:8
#: ../hacks/config/cityflow.xml.h:9 ../hacks/config/companioncube.xml.h:5
+#: ../hacks/config/covid19.xml.h:5 ../hacks/config/crumbler.xml.h:5
#: ../hacks/config/cube21.xml.h:8 ../hacks/config/cubenetic.xml.h:17
-#: ../hacks/config/cubestorm.xml.h:5 ../hacks/config/cubicgrid.xml.h:5
-#: ../hacks/config/dangerball.xml.h:5 ../hacks/config/eruption.xml.h:10
-#: ../hacks/config/fliptext.xml.h:5 ../hacks/config/flyingtoasters.xml.h:5
-#: ../hacks/config/fontglide.xml.h:5 ../hacks/config/fuzzyflakes.xml.h:5
-#: ../hacks/config/gears.xml.h:5 ../hacks/config/geodesic.xml.h:14
-#: ../hacks/config/gflux.xml.h:5 ../hacks/config/glcells.xml.h:25
+#: ../hacks/config/cubestack.xml.h:5 ../hacks/config/cubestorm.xml.h:5
+#: ../hacks/config/cubetwist.xml.h:5 ../hacks/config/cubicgrid.xml.h:5
+#: ../hacks/config/dangerball.xml.h:5 ../hacks/config/deepstars.xml.h:5
+#: ../hacks/config/discoball.xml.h:5 ../hacks/config/dymaxionmap.xml.h:5
+#: ../hacks/config/energystream.xml.h:2 ../hacks/config/eruption.xml.h:10
+#: ../hacks/config/esper.xml.h:5 ../hacks/config/fliptext.xml.h:5
+#: ../hacks/config/flyingtoasters.xml.h:5 ../hacks/config/fontglide.xml.h:5
+#: ../hacks/config/fuzzyflakes.xml.h:5 ../hacks/config/gears.xml.h:5
+#: ../hacks/config/geodesic.xml.h:14 ../hacks/config/gflux.xml.h:5
+#: ../hacks/config/gibson.xml.h:5 ../hacks/config/glcells.xml.h:25
#: ../hacks/config/glknots.xml.h:5 ../hacks/config/glmatrix.xml.h:8
#: ../hacks/config/glsnake.xml.h:11 ../hacks/config/goop.xml.h:5
-#: ../hacks/config/hexadrop.xml.h:5 ../hacks/config/hilbert.xml.h:8
-#: ../hacks/config/hyperball.xml.h:9 ../hacks/config/hypercube.xml.h:9
-#: ../hacks/config/hypnowheel.xml.h:2 ../hacks/config/interference.xml.h:5
-#: ../hacks/config/jigglypuff.xml.h:14 ../hacks/config/jigsaw.xml.h:5
-#: ../hacks/config/juggle.xml.h:5 ../hacks/config/juggler3d.xml.h:5
-#: ../hacks/config/kaleidocycle.xml.h:8 ../hacks/config/moebiusgears.xml.h:5
-#: ../hacks/config/penetrate.xml.h:2 ../hacks/config/petri.xml.h:16
-#: ../hacks/config/phosphor.xml.h:6 ../hacks/config/photopile.xml.h:12
-#: ../hacks/config/piecewise.xml.h:8 ../hacks/config/pinion.xml.h:5
-#: ../hacks/config/polyhedra.xml.h:5 ../hacks/config/pong.xml.h:2
-#: ../hacks/config/pyro.xml.h:2 ../hacks/config/quasicrystal.xml.h:5
-#: ../hacks/config/rd-bomb.xml.h:2 ../hacks/config/rdbomb.xml.h:2
+#: ../hacks/config/gravitywell.xml.h:5 ../hacks/config/handsy.xml.h:5
+#: ../hacks/config/headroom.xml.h:5 ../hacks/config/hexadrop.xml.h:5
+#: ../hacks/config/hexstrut.xml.h:5 ../hacks/config/hilbert.xml.h:8
+#: ../hacks/config/hydrostat.xml.h:5 ../hacks/config/hyperball.xml.h:9
+#: ../hacks/config/hypercube.xml.h:9 ../hacks/config/hypnowheel.xml.h:2
+#: ../hacks/config/interference.xml.h:5 ../hacks/config/jigglypuff.xml.h:14
+#: ../hacks/config/jigsaw.xml.h:5 ../hacks/config/juggle.xml.h:5
+#: ../hacks/config/juggler3d.xml.h:5 ../hacks/config/kaleidocycle.xml.h:8
+#: ../hacks/config/maze3d.xml.h:2 ../hacks/config/moebiusgears.xml.h:5
+#: ../hacks/config/peepers.xml.h:5 ../hacks/config/penetrate.xml.h:2
+#: ../hacks/config/petri.xml.h:16 ../hacks/config/phosphor.xml.h:6
+#: ../hacks/config/photopile.xml.h:12 ../hacks/config/piecewise.xml.h:8
+#: ../hacks/config/pinion.xml.h:5 ../hacks/config/polyhedra.xml.h:5
+#: ../hacks/config/pong.xml.h:2 ../hacks/config/pyro.xml.h:2
+#: ../hacks/config/quasicrystal.xml.h:5 ../hacks/config/raverhoop.xml.h:11
+#: ../hacks/config/razzledazzle.xml.h:5 ../hacks/config/rd-bomb.xml.h:2
#: ../hacks/config/rocks.xml.h:8 ../hacks/config/rubik.xml.h:6
#: ../hacks/config/rubikblocks.xml.h:8 ../hacks/config/skytentacles.xml.h:15
#: ../hacks/config/slidescreen.xml.h:11 ../hacks/config/sonar.xml.h:5
-#: ../hacks/config/speedmine.xml.h:5 ../hacks/config/superquadrics.xml.h:5
-#: ../hacks/config/tangram.xml.h:8 ../hacks/config/topblock.xml.h:5
-#: ../hacks/config/tronbit.xml.h:5 ../hacks/config/twang.xml.h:8
-#: ../hacks/config/unknownpleasures.xml.h:8 ../hacks/config/voronoi.xml.h:2
-#: ../hacks/config/winduprobot.xml.h:5 ../hacks/config/wormhole.xml.h:5
-#: ../hacks/config/xjack.xml.h:2
+#: ../hacks/config/speedmine.xml.h:5 ../hacks/config/splitflap.xml.h:5
+#: ../hacks/config/superquadrics.xml.h:5 ../hacks/config/tangram.xml.h:8
+#: ../hacks/config/topblock.xml.h:5 ../hacks/config/tronbit.xml.h:5
+#: ../hacks/config/twang.xml.h:8 ../hacks/config/unicrud.xml.h:5
+#: ../hacks/config/unknownpleasures.xml.h:8 ../hacks/config/vigilance.xml.h:5
+#: ../hacks/config/voronoi.xml.h:2 ../hacks/config/winduprobot.xml.h:5
+#: ../hacks/config/wormhole.xml.h:5 ../hacks/config/xjack.xml.h:2
msgid "Slow"
msgstr "遅い"
#: ../hacks/config/abstractile.xml.h:3 ../hacks/config/anemone.xml.h:3
#: ../hacks/config/apollonian.xml.h:14 ../hacks/config/attraction.xml.h:25
#: ../hacks/config/boing.xml.h:6 ../hacks/config/boxed.xml.h:6
+#: ../hacks/config/covid19.xml.h:6 ../hacks/config/crumbler.xml.h:6
#: ../hacks/config/cubestorm.xml.h:6 ../hacks/config/cubicgrid.xml.h:6
+#: ../hacks/config/deepstars.xml.h:6 ../hacks/config/discoball.xml.h:6
+#: ../hacks/config/energystream.xml.h:3 ../hacks/config/esper.xml.h:6
#: ../hacks/config/fliptext.xml.h:6 ../hacks/config/fontglide.xml.h:6
#: ../hacks/config/fuzzyflakes.xml.h:6 ../hacks/config/gears.xml.h:6
#: ../hacks/config/glknots.xml.h:6 ../hacks/config/goop.xml.h:6
-#: ../hacks/config/hexadrop.xml.h:6 ../hacks/config/hilbert.xml.h:11
-#: ../hacks/config/hypnowheel.xml.h:5 ../hacks/config/jigsaw.xml.h:6
-#: ../hacks/config/juggle.xml.h:6 ../hacks/config/juggler3d.xml.h:6
-#: ../hacks/config/kaleidocycle.xml.h:9 ../hacks/config/moebiusgears.xml.h:6
-#: ../hacks/config/polyhedra.xml.h:6 ../hacks/config/quasicrystal.xml.h:6
+#: ../hacks/config/gravitywell.xml.h:6 ../hacks/config/handsy.xml.h:6
+#: ../hacks/config/hexadrop.xml.h:6 ../hacks/config/hexstrut.xml.h:6
+#: ../hacks/config/hilbert.xml.h:11 ../hacks/config/hypnowheel.xml.h:5
+#: ../hacks/config/jigsaw.xml.h:6 ../hacks/config/juggle.xml.h:6
+#: ../hacks/config/juggler3d.xml.h:6 ../hacks/config/kaleidocycle.xml.h:9
+#: ../hacks/config/maze3d.xml.h:3 ../hacks/config/moebiusgears.xml.h:6
+#: ../hacks/config/peepers.xml.h:6 ../hacks/config/polyhedra.xml.h:6
+#: ../hacks/config/quasicrystal.xml.h:6 ../hacks/config/razzledazzle.xml.h:6
#: ../hacks/config/skytentacles.xml.h:18 ../hacks/config/sonar.xml.h:6
-#: ../hacks/config/tessellimage.xml.h:6
-#: ../hacks/config/unknownpleasures.xml.h:9 ../hacks/config/xjack.xml.h:3
+#: ../hacks/config/splitflap.xml.h:6 ../hacks/config/tessellimage.xml.h:6
+#: ../hacks/config/unknownpleasures.xml.h:9 ../hacks/config/vigilance.xml.h:6
+#: ../hacks/config/xjack.xml.h:3
msgid "Speed"
-msgstr ""
+msgstr "スピード"
#: ../hacks/config/abstractile.xml.h:4 ../hacks/config/anemone.xml.h:4
#: ../hacks/config/apollonian.xml.h:15 ../hacks/config/atlantis.xml.h:7
@@ -958,35 +1038,46 @@ msgstr ""
#: ../hacks/config/boxed.xml.h:7 ../hacks/config/carousel.xml.h:7
#: ../hacks/config/ccurve.xml.h:7 ../hacks/config/circuit.xml.h:10
#: ../hacks/config/cityflow.xml.h:11 ../hacks/config/companioncube.xml.h:7
+#: ../hacks/config/covid19.xml.h:7 ../hacks/config/crumbler.xml.h:7
#: ../hacks/config/cube21.xml.h:10 ../hacks/config/cubenetic.xml.h:19
-#: ../hacks/config/cubestorm.xml.h:7 ../hacks/config/cubicgrid.xml.h:7
-#: ../hacks/config/dangerball.xml.h:7 ../hacks/config/eruption.xml.h:12
-#: ../hacks/config/fliptext.xml.h:7 ../hacks/config/flyingtoasters.xml.h:7
-#: ../hacks/config/fontglide.xml.h:7 ../hacks/config/fuzzyflakes.xml.h:7
-#: ../hacks/config/gears.xml.h:7 ../hacks/config/geodesic.xml.h:16
-#: ../hacks/config/gflux.xml.h:7 ../hacks/config/glknots.xml.h:7
+#: ../hacks/config/cubestack.xml.h:7 ../hacks/config/cubestorm.xml.h:7
+#: ../hacks/config/cubetwist.xml.h:7 ../hacks/config/cubicgrid.xml.h:7
+#: ../hacks/config/dangerball.xml.h:7 ../hacks/config/deepstars.xml.h:7
+#: ../hacks/config/discoball.xml.h:7 ../hacks/config/dymaxionmap.xml.h:7
+#: ../hacks/config/energystream.xml.h:4 ../hacks/config/eruption.xml.h:12
+#: ../hacks/config/esper.xml.h:7 ../hacks/config/fliptext.xml.h:7
+#: ../hacks/config/flyingtoasters.xml.h:7 ../hacks/config/fontglide.xml.h:7
+#: ../hacks/config/fuzzyflakes.xml.h:7 ../hacks/config/gears.xml.h:7
+#: ../hacks/config/geodesic.xml.h:16 ../hacks/config/gflux.xml.h:7
+#: ../hacks/config/gibson.xml.h:7 ../hacks/config/glknots.xml.h:7
#: ../hacks/config/glmatrix.xml.h:10 ../hacks/config/glsnake.xml.h:13
-#: ../hacks/config/goop.xml.h:7 ../hacks/config/hexadrop.xml.h:7
-#: ../hacks/config/hilbert.xml.h:10 ../hacks/config/hyperball.xml.h:11
-#: ../hacks/config/hypercube.xml.h:11 ../hacks/config/hypnowheel.xml.h:4
-#: ../hacks/config/interference.xml.h:7 ../hacks/config/jigglypuff.xml.h:16
-#: ../hacks/config/jigsaw.xml.h:7 ../hacks/config/juggle.xml.h:7
-#: ../hacks/config/juggler3d.xml.h:7 ../hacks/config/kaleidocycle.xml.h:10
-#: ../hacks/config/moebiusgears.xml.h:7 ../hacks/config/penetrate.xml.h:4
-#: ../hacks/config/petri.xml.h:18 ../hacks/config/phosphor.xml.h:8
-#: ../hacks/config/photopile.xml.h:14 ../hacks/config/piecewise.xml.h:10
-#: ../hacks/config/pinion.xml.h:7 ../hacks/config/polyhedra.xml.h:7
-#: ../hacks/config/pong.xml.h:4 ../hacks/config/pyro.xml.h:4
-#: ../hacks/config/quasicrystal.xml.h:7 ../hacks/config/rd-bomb.xml.h:4
-#: ../hacks/config/rdbomb.xml.h:4 ../hacks/config/rocks.xml.h:10
+#: ../hacks/config/goop.xml.h:7 ../hacks/config/gravitywell.xml.h:7
+#: ../hacks/config/handsy.xml.h:7 ../hacks/config/headroom.xml.h:7
+#: ../hacks/config/hexadrop.xml.h:7 ../hacks/config/hexstrut.xml.h:7
+#: ../hacks/config/hilbert.xml.h:10 ../hacks/config/hydrostat.xml.h:7
+#: ../hacks/config/hyperball.xml.h:11 ../hacks/config/hypercube.xml.h:11
+#: ../hacks/config/hypnowheel.xml.h:4 ../hacks/config/interference.xml.h:7
+#: ../hacks/config/jigglypuff.xml.h:16 ../hacks/config/jigsaw.xml.h:7
+#: ../hacks/config/juggle.xml.h:7 ../hacks/config/juggler3d.xml.h:7
+#: ../hacks/config/kaleidocycle.xml.h:10 ../hacks/config/maze3d.xml.h:4
+#: ../hacks/config/moebiusgears.xml.h:7 ../hacks/config/peepers.xml.h:7
+#: ../hacks/config/penetrate.xml.h:4 ../hacks/config/petri.xml.h:18
+#: ../hacks/config/phosphor.xml.h:8 ../hacks/config/photopile.xml.h:14
+#: ../hacks/config/piecewise.xml.h:10 ../hacks/config/pinion.xml.h:7
+#: ../hacks/config/polyhedra.xml.h:7 ../hacks/config/pong.xml.h:4
+#: ../hacks/config/pyro.xml.h:4 ../hacks/config/quasicrystal.xml.h:7
+#: ../hacks/config/raverhoop.xml.h:13 ../hacks/config/razzledazzle.xml.h:7
+#: ../hacks/config/rd-bomb.xml.h:4 ../hacks/config/rocks.xml.h:10
#: ../hacks/config/rubik.xml.h:8 ../hacks/config/rubikblocks.xml.h:10
#: ../hacks/config/skytentacles.xml.h:17 ../hacks/config/slidescreen.xml.h:13
#: ../hacks/config/sonar.xml.h:7 ../hacks/config/speedmine.xml.h:7
-#: ../hacks/config/starwars.xml.h:5 ../hacks/config/superquadrics.xml.h:7
-#: ../hacks/config/tangram.xml.h:10 ../hacks/config/topblock.xml.h:7
-#: ../hacks/config/tronbit.xml.h:7 ../hacks/config/unknownpleasures.xml.h:10
-#: ../hacks/config/voronoi.xml.h:4 ../hacks/config/winduprobot.xml.h:7
-#: ../hacks/config/wormhole.xml.h:7 ../hacks/config/xjack.xml.h:4
+#: ../hacks/config/splitflap.xml.h:7 ../hacks/config/starwars.xml.h:5
+#: ../hacks/config/superquadrics.xml.h:7 ../hacks/config/tangram.xml.h:10
+#: ../hacks/config/topblock.xml.h:7 ../hacks/config/tronbit.xml.h:7
+#: ../hacks/config/unicrud.xml.h:7 ../hacks/config/unknownpleasures.xml.h:10
+#: ../hacks/config/vigilance.xml.h:7 ../hacks/config/voronoi.xml.h:4
+#: ../hacks/config/winduprobot.xml.h:7 ../hacks/config/wormhole.xml.h:7
+#: ../hacks/config/xjack.xml.h:4
msgid "Fast"
msgstr "はやい"
@@ -1003,9 +1094,8 @@ msgstr "0秒間"
#: ../hacks/config/rorschach.xml.h:9 ../hacks/config/rubikblocks.xml.h:16
#: ../hacks/config/tangram.xml.h:6 ../hacks/config/xlyap.xml.h:6
#: ../hacks/config/xspirograph.xml.h:6
-#, fuzzy
msgid "Linger"
-msgstr "DirectColor"
+msgstr ""
#: ../hacks/config/abstractile.xml.h:7 ../hacks/config/voronoi.xml.h:16
msgid "60 seconds"
@@ -1065,119 +1155,131 @@ msgstr ""
#: ../hacks/config/antspotlight.xml.h:5 ../hacks/config/apollonian.xml.h:16
#: ../hacks/config/apple2.xml.h:9 ../hacks/config/atlantis.xml.h:19
#: ../hacks/config/attraction.xml.h:32 ../hacks/config/atunnel.xml.h:8
-#: ../hacks/config/barcode.xml.h:9 ../hacks/config/blaster.xml.h:11
-#: ../hacks/config/blinkbox.xml.h:12 ../hacks/config/blitspin.xml.h:9
-#: ../hacks/config/blocktube.xml.h:11 ../hacks/config/boing.xml.h:14
-#: ../hacks/config/bouboule.xml.h:11 ../hacks/config/bouncingcow.xml.h:12
-#: ../hacks/config/boxed.xml.h:23 ../hacks/config/boxfit.xml.h:15
-#: ../hacks/config/braid.xml.h:13 ../hacks/config/bsod.xml.h:5
-#: ../hacks/config/bubble3d.xml.h:7 ../hacks/config/bubbles.xml.h:11
+#: ../hacks/config/barcode.xml.h:9 ../hacks/config/beats.xml.h:16
+#: ../hacks/config/blaster.xml.h:11 ../hacks/config/blinkbox.xml.h:12
+#: ../hacks/config/blitspin.xml.h:9 ../hacks/config/blocktube.xml.h:11
+#: ../hacks/config/boing.xml.h:14 ../hacks/config/bouboule.xml.h:11
+#: ../hacks/config/bouncingcow.xml.h:13 ../hacks/config/boxed.xml.h:23
+#: ../hacks/config/boxfit.xml.h:15 ../hacks/config/braid.xml.h:13
+#: ../hacks/config/bubble3d.xml.h:11 ../hacks/config/bubbles.xml.h:11
#: ../hacks/config/bumps.xml.h:11 ../hacks/config/cage.xml.h:6
#: ../hacks/config/carousel.xml.h:18 ../hacks/config/ccurve.xml.h:11
#: ../hacks/config/celtic.xml.h:9 ../hacks/config/circuit.xml.h:14
#: ../hacks/config/cityflow.xml.h:17 ../hacks/config/cloudlife.xml.h:12
#: ../hacks/config/companioncube.xml.h:14 ../hacks/config/compass.xml.h:5
-#: ../hacks/config/coral.xml.h:14 ../hacks/config/crackberg.xml.h:18
-#: ../hacks/config/critical.xml.h:8 ../hacks/config/crystal.xml.h:15
+#: ../hacks/config/coral.xml.h:14 ../hacks/config/covid19.xml.h:14
+#: ../hacks/config/crackberg.xml.h:18 ../hacks/config/critical.xml.h:8
+#: ../hacks/config/crumbler.xml.h:15 ../hacks/config/crystal.xml.h:15
#: ../hacks/config/cube21.xml.h:26 ../hacks/config/cubenetic.xml.h:26
-#: ../hacks/config/cubestorm.xml.h:17 ../hacks/config/cubicgrid.xml.h:12
+#: ../hacks/config/cubestack.xml.h:16 ../hacks/config/cubestorm.xml.h:20
+#: ../hacks/config/cubetwist.xml.h:18 ../hacks/config/cubicgrid.xml.h:12
#: ../hacks/config/cwaves.xml.h:9 ../hacks/config/cynosure.xml.h:11
#: ../hacks/config/dangerball.xml.h:14 ../hacks/config/decayscreen.xml.h:23
-#: ../hacks/config/deco.xml.h:14 ../hacks/config/deluxe.xml.h:16
-#: ../hacks/config/demon.xml.h:15 ../hacks/config/discrete.xml.h:11
+#: ../hacks/config/deco.xml.h:14 ../hacks/config/deepstars.xml.h:9
+#: ../hacks/config/deluxe.xml.h:16 ../hacks/config/demon.xml.h:15
+#: ../hacks/config/discoball.xml.h:14 ../hacks/config/discrete.xml.h:11
#: ../hacks/config/distort.xml.h:22 ../hacks/config/dnalogo.xml.h:9
-#: ../hacks/config/drift.xml.h:11 ../hacks/config/endgame.xml.h:6
+#: ../hacks/config/drift.xml.h:11 ../hacks/config/dymaxionmap.xml.h:16
+#: ../hacks/config/endgame.xml.h:6 ../hacks/config/energystream.xml.h:7
#: ../hacks/config/engine.xml.h:19 ../hacks/config/epicycle.xml.h:14
-#: ../hacks/config/eruption.xml.h:22 ../hacks/config/euler2d.xml.h:29
+#: ../hacks/config/eruption.xml.h:22 ../hacks/config/esper.xml.h:9
+#: ../hacks/config/etruscanvenus.xml.h:42 ../hacks/config/euler2d.xml.h:29
#: ../hacks/config/extrusion.xml.h:17 ../hacks/config/fadeplot.xml.h:14
-#: ../hacks/config/fiberlamp.xml.h:11 ../hacks/config/fireworkx.xml.h:10
-#: ../hacks/config/flag.xml.h:13 ../hacks/config/flame.xml.h:14
-#: ../hacks/config/flipflop.xml.h:14 ../hacks/config/flipscreen3d.xml.h:6
-#: ../hacks/config/fliptext.xml.h:15 ../hacks/config/flow.xml.h:21
-#: ../hacks/config/fluidballs.xml.h:22 ../hacks/config/flurry.xml.h:2
-#: ../hacks/config/flyingtoasters.xml.h:14 ../hacks/config/fontglide.xml.h:16
-#: ../hacks/config/forest.xml.h:8 ../hacks/config/fuzzyflakes.xml.h:12
-#: ../hacks/config/galaxy.xml.h:13 ../hacks/config/gears.xml.h:14
-#: ../hacks/config/geodesic.xml.h:10 ../hacks/config/geodesicgears.xml.h:13
-#: ../hacks/config/gflux.xml.h:19 ../hacks/config/glblur.xml.h:17
+#: ../hacks/config/fiberlamp.xml.h:11 ../hacks/config/filmleader.xml.h:9
+#: ../hacks/config/fireworkx.xml.h:10 ../hacks/config/flag.xml.h:13
+#: ../hacks/config/flame.xml.h:14 ../hacks/config/flipflop.xml.h:14
+#: ../hacks/config/flipscreen3d.xml.h:6 ../hacks/config/fliptext.xml.h:15
+#: ../hacks/config/flow.xml.h:21 ../hacks/config/fluidballs.xml.h:22
+#: ../hacks/config/flurry.xml.h:2 ../hacks/config/flyingtoasters.xml.h:15
+#: ../hacks/config/fontglide.xml.h:16 ../hacks/config/forest.xml.h:8
+#: ../hacks/config/fuzzyflakes.xml.h:12 ../hacks/config/galaxy.xml.h:13
+#: ../hacks/config/gears.xml.h:14 ../hacks/config/geodesic.xml.h:10
+#: ../hacks/config/geodesicgears.xml.h:13 ../hacks/config/gflux.xml.h:19
+#: ../hacks/config/gibson.xml.h:15 ../hacks/config/glblur.xml.h:17
#: ../hacks/config/glcells.xml.h:32 ../hacks/config/gleidescope.xml.h:14
#: ../hacks/config/glforestfire.xml.h:16 ../hacks/config/glhanoi.xml.h:16
#: ../hacks/config/glknots.xml.h:24 ../hacks/config/glmatrix.xml.h:20
-#: ../hacks/config/glplanet.xml.h:12 ../hacks/config/glschool.xml.h:17
+#: ../hacks/config/glplanet.xml.h:19 ../hacks/config/glschool.xml.h:17
#: ../hacks/config/glslideshow.xml.h:20 ../hacks/config/glsnake.xml.h:18
#: ../hacks/config/gltext.xml.h:19 ../hacks/config/goop.xml.h:13
#: ../hacks/config/grav.xml.h:12 ../hacks/config/greynetic.xml.h:6
#: ../hacks/config/halftone.xml.h:17 ../hacks/config/halo.xml.h:14
+#: ../hacks/config/handsy.xml.h:23 ../hacks/config/headroom.xml.h:18
#: ../hacks/config/helix.xml.h:8 ../hacks/config/hexadrop.xml.h:22
-#: ../hacks/config/hilbert.xml.h:20 ../hacks/config/hopalong.xml.h:23
+#: ../hacks/config/hexstrut.xml.h:17 ../hacks/config/hilbert.xml.h:20
+#: ../hacks/config/hopalong.xml.h:23 ../hacks/config/hydrostat.xml.h:29
#: ../hacks/config/hyperball.xml.h:8 ../hacks/config/hypercube.xml.h:8
#: ../hacks/config/hypertorus.xml.h:5 ../hacks/config/hypnowheel.xml.h:8
#: ../hacks/config/ifs.xml.h:68 ../hacks/config/imsmap.xml.h:18
-#: ../hacks/config/interaggregate.xml.h:8
-#: ../hacks/config/interference.xml.h:21
+#: ../hacks/config/interaggregate.xml.h:8 ../hacks/config/interference.xml.h:21
#: ../hacks/config/intermomentary.xml.h:8 ../hacks/config/jigglypuff.xml.h:10
#: ../hacks/config/jigsaw.xml.h:15 ../hacks/config/juggle.xml.h:21
#: ../hacks/config/juggler3d.xml.h:21 ../hacks/config/julia.xml.h:14
#: ../hacks/config/kaleidescope.xml.h:13 ../hacks/config/kaleidocycle.xml.h:21
-#: ../hacks/config/klein.xml.h:45 ../hacks/config/kumppa.xml.h:8
+#: ../hacks/config/klein.xml.h:47 ../hacks/config/kumppa.xml.h:8
#: ../hacks/config/lament.xml.h:7 ../hacks/config/laser.xml.h:12
#: ../hacks/config/lavalite.xml.h:16 ../hacks/config/lcdscrub.xml.h:7
#: ../hacks/config/lightning.xml.h:8 ../hacks/config/lisa.xml.h:16
#: ../hacks/config/lissie.xml.h:15 ../hacks/config/lmorph.xml.h:17
#: ../hacks/config/lockward.xml.h:9 ../hacks/config/loop.xml.h:12
-#: ../hacks/config/m6502.xml.h:6 ../hacks/config/maze.xml.h:12
-#: ../hacks/config/memscroller.xml.h:9 ../hacks/config/menger.xml.h:20
-#: ../hacks/config/metaballs.xml.h:16 ../hacks/config/mirrorblob.xml.h:25
-#: ../hacks/config/mismunch.xml.h:13 ../hacks/config/moebius.xml.h:7
-#: ../hacks/config/moebiusgears.xml.h:14 ../hacks/config/moire.xml.h:12
-#: ../hacks/config/moire2.xml.h:9 ../hacks/config/molecule.xml.h:15
-#: ../hacks/config/morph3d.xml.h:11 ../hacks/config/mountain.xml.h:11
-#: ../hacks/config/munch.xml.h:16 ../hacks/config/nerverot.xml.h:21
-#: ../hacks/config/noof.xml.h:5 ../hacks/config/noseguy.xml.h:2
-#: ../hacks/config/pacman.xml.h:6 ../hacks/config/pedal.xml.h:9
+#: ../hacks/config/m6502.xml.h:3 ../hacks/config/maze.xml.h:12
+#: ../hacks/config/maze3d.xml.h:10 ../hacks/config/memscroller.xml.h:9
+#: ../hacks/config/menger.xml.h:20 ../hacks/config/metaballs.xml.h:16
+#: ../hacks/config/mirrorblob.xml.h:25 ../hacks/config/mismunch.xml.h:13
+#: ../hacks/config/moebius.xml.h:7 ../hacks/config/moebiusgears.xml.h:14
+#: ../hacks/config/moire.xml.h:12 ../hacks/config/moire2.xml.h:9
+#: ../hacks/config/molecule.xml.h:15 ../hacks/config/morph3d.xml.h:11
+#: ../hacks/config/mountain.xml.h:11 ../hacks/config/munch.xml.h:16
+#: ../hacks/config/nerverot.xml.h:21 ../hacks/config/noof.xml.h:5
+#: ../hacks/config/noseguy.xml.h:2 ../hacks/config/pacman.xml.h:6
+#: ../hacks/config/pedal.xml.h:9 ../hacks/config/peepers.xml.h:17
#: ../hacks/config/penetrate.xml.h:8 ../hacks/config/penrose.xml.h:12
#: ../hacks/config/petri.xml.h:5 ../hacks/config/phosphor.xml.h:13
#: ../hacks/config/photopile.xml.h:22 ../hacks/config/piecewise.xml.h:15
#: ../hacks/config/pinion.xml.h:16 ../hacks/config/pipes.xml.h:20
#: ../hacks/config/polyhedra.xml.h:168 ../hacks/config/polyominoes.xml.h:12
#: ../hacks/config/polytopes.xml.h:18 ../hacks/config/pong.xml.h:9
-#: ../hacks/config/popsquares.xml.h:21
-#: ../hacks/config/projectiveplane.xml.h:43 ../hacks/config/providence.xml.h:7
-#: ../hacks/config/pulsar.xml.h:14 ../hacks/config/pyro.xml.h:14
-#: ../hacks/config/qix.xml.h:24 ../hacks/config/quasicrystal.xml.h:13
-#: ../hacks/config/queens.xml.h:6 ../hacks/config/rd-bomb.xml.h:17
-#: ../hacks/config/rdbomb.xml.h:17 ../hacks/config/ripples.xml.h:18
-#: ../hacks/config/rocks.xml.h:17 ../hacks/config/rorschach.xml.h:11
-#: ../hacks/config/rotor.xml.h:13 ../hacks/config/rotzoomer.xml.h:13
-#: ../hacks/config/rubik.xml.h:11 ../hacks/config/rubikblocks.xml.h:20
-#: ../hacks/config/sballs.xml.h:16 ../hacks/config/shadebobs.xml.h:16
+#: ../hacks/config/popsquares.xml.h:21 ../hacks/config/projectiveplane.xml.h:45
+#: ../hacks/config/providence.xml.h:7 ../hacks/config/pulsar.xml.h:14
+#: ../hacks/config/pyro.xml.h:14 ../hacks/config/qix.xml.h:24
+#: ../hacks/config/quasicrystal.xml.h:13 ../hacks/config/queens.xml.h:6
+#: ../hacks/config/raverhoop.xml.h:20 ../hacks/config/razzledazzle.xml.h:20
+#: ../hacks/config/rd-bomb.xml.h:17 ../hacks/config/ripples.xml.h:18
+#: ../hacks/config/rocks.xml.h:17 ../hacks/config/romanboy.xml.h:43
+#: ../hacks/config/rorschach.xml.h:11 ../hacks/config/rotor.xml.h:13
+#: ../hacks/config/rotzoomer.xml.h:15 ../hacks/config/rubik.xml.h:11
+#: ../hacks/config/rubikblocks.xml.h:20 ../hacks/config/sballs.xml.h:16
+#: ../hacks/config/scooter.xml.h:17 ../hacks/config/shadebobs.xml.h:16
#: ../hacks/config/sierpinski.xml.h:13 ../hacks/config/sierpinski3d.xml.h:10
#: ../hacks/config/skytentacles.xml.h:25 ../hacks/config/slidescreen.xml.h:18
#: ../hacks/config/slip.xml.h:13 ../hacks/config/sonar.xml.h:34
#: ../hacks/config/speedmine.xml.h:17 ../hacks/config/sphere.xml.h:8
+#: ../hacks/config/sphereeversion.xml.h:32
#: ../hacks/config/spheremonics.xml.h:22 ../hacks/config/spiral.xml.h:11
+#: ../hacks/config/splitflap.xml.h:25 ../hacks/config/splodesic.xml.h:11
#: ../hacks/config/spotlight.xml.h:11 ../hacks/config/sproingies.xml.h:9
#: ../hacks/config/squiral.xml.h:17 ../hacks/config/stairs.xml.h:5
#: ../hacks/config/starfish.xml.h:17 ../hacks/config/starwars.xml.h:15
-#: ../hacks/config/stonerview.xml.h:7 ../hacks/config/strange.xml.h:11
+#: ../hacks/config/stonerview.xml.h:7 ../hacks/config/strange.xml.h:23
#: ../hacks/config/substrate.xml.h:19 ../hacks/config/superquadrics.xml.h:13
#: ../hacks/config/surfaces.xml.h:27 ../hacks/config/swirl.xml.h:11
#: ../hacks/config/t3d.xml.h:15 ../hacks/config/tangram.xml.h:16
-#: ../hacks/config/tessellimage.xml.h:16 ../hacks/config/thornbird.xml.h:16
-#: ../hacks/config/timetunnel.xml.h:8 ../hacks/config/topblock.xml.h:24
-#: ../hacks/config/triangle.xml.h:8 ../hacks/config/tronbit.xml.h:11
-#: ../hacks/config/truchet.xml.h:6 ../hacks/config/twang.xml.h:18
-#: ../hacks/config/unknownpleasures.xml.h:14
-#: ../hacks/config/vermiculate.xml.h:5 ../hacks/config/vidwhacker.xml.h:6
-#: ../hacks/config/vines.xml.h:8 ../hacks/config/voronoi.xml.h:11
-#: ../hacks/config/wander.xml.h:13 ../hacks/config/webcollage.xml.h:11
-#: ../hacks/config/whirlwindwarp.xml.h:8 ../hacks/config/whirlygig.xml.h:31
-#: ../hacks/config/winduprobot.xml.h:22 ../hacks/config/worm.xml.h:11
-#: ../hacks/config/wormhole.xml.h:11 ../hacks/config/xanalogtv.xml.h:2
-#: ../hacks/config/xflame.xml.h:7 ../hacks/config/xjack.xml.h:6
-#: ../hacks/config/xlyap.xml.h:9 ../hacks/config/xmatrix.xml.h:21
-#: ../hacks/config/xrayswarm.xml.h:5 ../hacks/config/xspirograph.xml.h:9
-#: ../hacks/config/zoom.xml.h:15
+#: ../hacks/config/tessellimage.xml.h:19 ../hacks/config/testx11.xml.h:2
+#: ../hacks/config/thornbird.xml.h:16 ../hacks/config/timetunnel.xml.h:8
+#: ../hacks/config/topblock.xml.h:24 ../hacks/config/triangle.xml.h:8
+#: ../hacks/config/tronbit.xml.h:11 ../hacks/config/truchet.xml.h:6
+#: ../hacks/config/twang.xml.h:18 ../hacks/config/unicrud.xml.h:10
+#: ../hacks/config/unknownpleasures.xml.h:17
+#: ../hacks/config/vermiculate.xml.h:5 ../hacks/config/vfeedback.xml.h:9
+#: ../hacks/config/vidwhacker.xml.h:6 ../hacks/config/vines.xml.h:8
+#: ../hacks/config/voronoi.xml.h:11 ../hacks/config/wander.xml.h:13
+#: ../hacks/config/webcollage.xml.h:11 ../hacks/config/whirlwindwarp.xml.h:8
+#: ../hacks/config/whirlygig.xml.h:31 ../hacks/config/winduprobot.xml.h:22
+#: ../hacks/config/worm.xml.h:11 ../hacks/config/wormhole.xml.h:11
+#: ../hacks/config/xanalogtv.xml.h:2 ../hacks/config/xflame.xml.h:7
+#: ../hacks/config/xjack.xml.h:6 ../hacks/config/xlyap.xml.h:9
+#: ../hacks/config/xmatrix.xml.h:21 ../hacks/config/xrayswarm.xml.h:5
+#: ../hacks/config/xspirograph.xml.h:9 ../hacks/config/zoom.xml.h:15
msgid "Show frame rate"
msgstr "フレームレートを表示する"
@@ -1191,10 +1293,11 @@ msgid "Anemone"
msgstr ""
#: ../hacks/config/anemone.xml.h:5 ../hacks/config/anemotaxis.xml.h:8
-#: ../hacks/config/binaryring.xml.h:8 ../hacks/config/blaster.xml.h:7
-#: ../hacks/config/bouboule.xml.h:5 ../hacks/config/boxed.xml.h:8
-#: ../hacks/config/cityflow.xml.h:5 ../hacks/config/coral.xml.h:11
-#: ../hacks/config/crackberg.xml.h:8 ../hacks/config/cubenetic.xml.h:5
+#: ../hacks/config/beats.xml.h:5 ../hacks/config/binaryring.xml.h:8
+#: ../hacks/config/blaster.xml.h:7 ../hacks/config/bouboule.xml.h:5
+#: ../hacks/config/boxed.xml.h:8 ../hacks/config/cityflow.xml.h:5
+#: ../hacks/config/coral.xml.h:11 ../hacks/config/crackberg.xml.h:8
+#: ../hacks/config/crumbler.xml.h:8 ../hacks/config/cubenetic.xml.h:5
#: ../hacks/config/cubestorm.xml.h:8 ../hacks/config/dangerball.xml.h:8
#: ../hacks/config/eruption.xml.h:5 ../hacks/config/euler2d.xml.h:5
#: ../hacks/config/fiberlamp.xml.h:5 ../hacks/config/flame.xml.h:8
@@ -1202,11 +1305,12 @@ msgstr ""
#: ../hacks/config/fuzzyflakes.xml.h:8 ../hacks/config/glcells.xml.h:8
#: ../hacks/config/glschool.xml.h:5 ../hacks/config/goop.xml.h:8
#: ../hacks/config/grav.xml.h:5 ../hacks/config/halftone.xml.h:5
-#: ../hacks/config/halo.xml.h:5 ../hacks/config/interaggregate.xml.h:5
-#: ../hacks/config/interference.xml.h:11 ../hacks/config/jigsaw.xml.h:8
-#: ../hacks/config/julia.xml.h:5 ../hacks/config/kaleidescope.xml.h:5
-#: ../hacks/config/lisa.xml.h:5 ../hacks/config/lmorph.xml.h:5
-#: ../hacks/config/nerverot.xml.h:8 ../hacks/config/pedal.xml.h:5
+#: ../hacks/config/halo.xml.h:5 ../hacks/config/hydrostat.xml.h:14
+#: ../hacks/config/interaggregate.xml.h:5 ../hacks/config/interference.xml.h:11
+#: ../hacks/config/jigsaw.xml.h:8 ../hacks/config/julia.xml.h:5
+#: ../hacks/config/kaleidescope.xml.h:5 ../hacks/config/lisa.xml.h:5
+#: ../hacks/config/lmorph.xml.h:5 ../hacks/config/nerverot.xml.h:8
+#: ../hacks/config/pedal.xml.h:5 ../hacks/config/peepers.xml.h:8
#: ../hacks/config/petri.xml.h:10 ../hacks/config/piecewise.xml.h:5
#: ../hacks/config/qix.xml.h:5 ../hacks/config/rocks.xml.h:5
#: ../hacks/config/sierpinski.xml.h:5 ../hacks/config/slip.xml.h:5
@@ -1244,10 +1348,11 @@ msgstr ""
#. #### -color [random]
#: ../hacks/config/anemone.xml.h:7 ../hacks/config/anemotaxis.xml.h:10
#: ../hacks/config/ant.xml.h:13 ../hacks/config/apollonian.xml.h:12
-#: ../hacks/config/attraction.xml.h:19 ../hacks/config/blaster.xml.h:9
-#: ../hacks/config/bouboule.xml.h:7 ../hacks/config/braid.xml.h:10
-#: ../hacks/config/cityflow.xml.h:7 ../hacks/config/coral.xml.h:13
-#: ../hacks/config/critical.xml.h:7 ../hacks/config/crystal.xml.h:7
+#: ../hacks/config/attraction.xml.h:19 ../hacks/config/beats.xml.h:7
+#: ../hacks/config/blaster.xml.h:9 ../hacks/config/bouboule.xml.h:7
+#: ../hacks/config/braid.xml.h:10 ../hacks/config/cityflow.xml.h:7
+#: ../hacks/config/coral.xml.h:13 ../hacks/config/critical.xml.h:7
+#: ../hacks/config/crumbler.xml.h:10 ../hacks/config/crystal.xml.h:7
#: ../hacks/config/cubenetic.xml.h:7 ../hacks/config/cubestorm.xml.h:10
#: ../hacks/config/cynosure.xml.h:7 ../hacks/config/deco.xml.h:7
#: ../hacks/config/deluxe.xml.h:13 ../hacks/config/demon.xml.h:13
@@ -1260,27 +1365,28 @@ msgstr ""
#: ../hacks/config/fuzzyflakes.xml.h:10 ../hacks/config/galaxy.xml.h:11
#: ../hacks/config/glcells.xml.h:10 ../hacks/config/goop.xml.h:10
#: ../hacks/config/grav.xml.h:7 ../hacks/config/halftone.xml.h:7
-#: ../hacks/config/halo.xml.h:7 ../hacks/config/hopalong.xml.h:11
+#: ../hacks/config/halo.xml.h:7 ../hacks/config/handsy.xml.h:10
+#: ../hacks/config/hopalong.xml.h:11 ../hacks/config/hydrostat.xml.h:10
#: ../hacks/config/ifs.xml.h:64 ../hacks/config/imsmap.xml.h:13
-#: ../hacks/config/interaggregate.xml.h:7
-#: ../hacks/config/interference.xml.h:13 ../hacks/config/jigsaw.xml.h:10
-#: ../hacks/config/julia.xml.h:13 ../hacks/config/kaleidescope.xml.h:7
-#: ../hacks/config/laser.xml.h:11 ../hacks/config/lightning.xml.h:7
-#: ../hacks/config/lisa.xml.h:7 ../hacks/config/lissie.xml.h:10
-#: ../hacks/config/lmorph.xml.h:7 ../hacks/config/loop.xml.h:10
-#: ../hacks/config/metaballs.xml.h:10 ../hacks/config/mismunch.xml.h:10
-#: ../hacks/config/moire.xml.h:7 ../hacks/config/moire2.xml.h:7
-#: ../hacks/config/mountain.xml.h:10 ../hacks/config/munch.xml.h:10
-#: ../hacks/config/nerverot.xml.h:10 ../hacks/config/pedal.xml.h:7
+#: ../hacks/config/interaggregate.xml.h:7 ../hacks/config/interference.xml.h:13
+#: ../hacks/config/jigsaw.xml.h:10 ../hacks/config/julia.xml.h:13
+#: ../hacks/config/kaleidescope.xml.h:7 ../hacks/config/laser.xml.h:11
+#: ../hacks/config/lightning.xml.h:7 ../hacks/config/lisa.xml.h:7
+#: ../hacks/config/lissie.xml.h:10 ../hacks/config/lmorph.xml.h:7
+#: ../hacks/config/loop.xml.h:10 ../hacks/config/metaballs.xml.h:10
+#: ../hacks/config/mismunch.xml.h:10 ../hacks/config/moire.xml.h:7
+#: ../hacks/config/moire2.xml.h:7 ../hacks/config/mountain.xml.h:10
+#: ../hacks/config/munch.xml.h:10 ../hacks/config/nerverot.xml.h:10
+#: ../hacks/config/pedal.xml.h:7 ../hacks/config/peepers.xml.h:10
#: ../hacks/config/penrose.xml.h:7 ../hacks/config/petri.xml.h:12
#: ../hacks/config/piecewise.xml.h:7 ../hacks/config/polyominoes.xml.h:11
-#: ../hacks/config/qix.xml.h:7 ../hacks/config/rd-bomb.xml.h:16
-#: ../hacks/config/rdbomb.xml.h:16 ../hacks/config/rocks.xml.h:7
+#: ../hacks/config/qix.xml.h:7 ../hacks/config/razzledazzle.xml.h:10
+#: ../hacks/config/rd-bomb.xml.h:16 ../hacks/config/rocks.xml.h:7
#: ../hacks/config/rotor.xml.h:10 ../hacks/config/shadebobs.xml.h:10
#: ../hacks/config/sierpinski.xml.h:7 ../hacks/config/slip.xml.h:7
#: ../hacks/config/sphere.xml.h:7 ../hacks/config/spiral.xml.h:7
#: ../hacks/config/squiral.xml.h:15 ../hacks/config/starfish.xml.h:16
-#: ../hacks/config/strange.xml.h:10 ../hacks/config/swirl.xml.h:7
+#: ../hacks/config/strange.xml.h:22 ../hacks/config/swirl.xml.h:7
#: ../hacks/config/thornbird.xml.h:7 ../hacks/config/topblock.xml.h:15
#: ../hacks/config/triangle.xml.h:7 ../hacks/config/unknownpleasures.xml.h:7
#: ../hacks/config/vines.xml.h:7 ../hacks/config/voronoi.xml.h:7
@@ -1292,33 +1398,38 @@ msgstr ""
msgid "Tentacles"
msgstr ""
-#: ../hacks/config/anemone.xml.h:9 ../hacks/config/cubestorm.xml.h:11
+#: ../hacks/config/anemone.xml.h:9 ../hacks/config/cubestack.xml.h:8
+#: ../hacks/config/cubestorm.xml.h:14 ../hacks/config/cubetwist.xml.h:8
#: ../hacks/config/deluxe.xml.h:5 ../hacks/config/fadeplot.xml.h:5
#: ../hacks/config/fuzzyflakes.xml.h:21 ../hacks/config/glknots.xml.h:19
-#: ../hacks/config/hilbert.xml.h:15 ../hacks/config/lmorph.xml.h:11
-#: ../hacks/config/skytentacles.xml.h:8 ../hacks/config/starfish.xml.h:11
-#: ../hacks/config/thornbird.xml.h:8
+#: ../hacks/config/hexstrut.xml.h:11 ../hacks/config/hilbert.xml.h:15
+#: ../hacks/config/hydrostat.xml.h:16 ../hacks/config/lmorph.xml.h:11
+#: ../hacks/config/razzledazzle.xml.h:14 ../hacks/config/skytentacles.xml.h:8
+#: ../hacks/config/starfish.xml.h:11 ../hacks/config/thornbird.xml.h:8
msgid "Thin"
msgstr ""
-#: ../hacks/config/anemone.xml.h:10 ../hacks/config/fadeplot.xml.h:6
+#: ../hacks/config/anemone.xml.h:10 ../hacks/config/cubestack.xml.h:9
+#: ../hacks/config/cubetwist.xml.h:9 ../hacks/config/fadeplot.xml.h:6
#: ../hacks/config/fuzzyflakes.xml.h:22 ../hacks/config/glknots.xml.h:20
-#: ../hacks/config/moire2.xml.h:8 ../hacks/config/skytentacles.xml.h:9
-#: ../hacks/config/thornbird.xml.h:9
+#: ../hacks/config/hydrostat.xml.h:17 ../hacks/config/moire2.xml.h:8
+#: ../hacks/config/skytentacles.xml.h:9 ../hacks/config/thornbird.xml.h:9
msgid "Thickness"
msgstr ""
-#: ../hacks/config/anemone.xml.h:11 ../hacks/config/cubestorm.xml.h:13
+#: ../hacks/config/anemone.xml.h:11 ../hacks/config/cubestack.xml.h:10
+#: ../hacks/config/cubestorm.xml.h:16 ../hacks/config/cubetwist.xml.h:10
#: ../hacks/config/deluxe.xml.h:7 ../hacks/config/fadeplot.xml.h:7
#: ../hacks/config/fuzzyflakes.xml.h:23 ../hacks/config/glknots.xml.h:21
-#: ../hacks/config/hilbert.xml.h:17 ../hacks/config/lmorph.xml.h:13
-#: ../hacks/config/skytentacles.xml.h:10 ../hacks/config/starfish.xml.h:13
-#: ../hacks/config/thornbird.xml.h:10
+#: ../hacks/config/hexstrut.xml.h:13 ../hacks/config/hilbert.xml.h:17
+#: ../hacks/config/hydrostat.xml.h:18 ../hacks/config/lmorph.xml.h:13
+#: ../hacks/config/razzledazzle.xml.h:16 ../hacks/config/skytentacles.xml.h:10
+#: ../hacks/config/starfish.xml.h:13 ../hacks/config/thornbird.xml.h:10
msgid "Thick"
msgstr ""
#: ../hacks/config/anemone.xml.h:12 ../hacks/config/pyro.xml.h:10
-#: ../hacks/config/winduprobot.xml.h:19
+#: ../hacks/config/splodesic.xml.h:7 ../hacks/config/winduprobot.xml.h:19
msgid "Often"
msgstr ""
@@ -1343,53 +1454,63 @@ msgid "Anemotaxis"
msgstr ""
#. #### -colorcount [64]
+#. <video href="https://www.youtube.com/watch?v=OZ6zRLLFLk4"/>
#: ../hacks/config/anemotaxis.xml.h:2 ../hacks/config/ant.xml.h:2
#: ../hacks/config/antinspect.xml.h:2 ../hacks/config/antmaze.xml.h:2
#: ../hacks/config/antspotlight.xml.h:2 ../hacks/config/apple2.xml.h:10
#: ../hacks/config/atlantis.xml.h:2 ../hacks/config/attraction.xml.h:11
#: ../hacks/config/atunnel.xml.h:2 ../hacks/config/barcode.xml.h:2
-#: ../hacks/config/binaryring.xml.h:2 ../hacks/config/blaster.xml.h:2
-#: ../hacks/config/blinkbox.xml.h:2 ../hacks/config/blocktube.xml.h:2
-#: ../hacks/config/bouboule.xml.h:2 ../hacks/config/bouncingcow.xml.h:2
-#: ../hacks/config/boxed.xml.h:2 ../hacks/config/boxfit.xml.h:2
-#: ../hacks/config/braid.xml.h:2 ../hacks/config/bubble3d.xml.h:2
-#: ../hacks/config/bubbles.xml.h:2 ../hacks/config/bumps.xml.h:3
-#: ../hacks/config/cage.xml.h:2 ../hacks/config/carousel.xml.h:2
-#: ../hacks/config/ccurve.xml.h:8 ../hacks/config/celtic.xml.h:2
-#: ../hacks/config/circuit.xml.h:2 ../hacks/config/cityflow.xml.h:2
-#: ../hacks/config/cloudlife.xml.h:2 ../hacks/config/companioncube.xml.h:2
-#: ../hacks/config/compass.xml.h:2 ../hacks/config/coral.xml.h:2
+#: ../hacks/config/beats.xml.h:2 ../hacks/config/binaryring.xml.h:2
+#: ../hacks/config/blaster.xml.h:2 ../hacks/config/blinkbox.xml.h:2
+#: ../hacks/config/blocktube.xml.h:2 ../hacks/config/bouboule.xml.h:2
+#: ../hacks/config/bouncingcow.xml.h:2 ../hacks/config/boxed.xml.h:2
+#: ../hacks/config/boxfit.xml.h:2 ../hacks/config/braid.xml.h:2
+#: ../hacks/config/bubble3d.xml.h:2 ../hacks/config/bubbles.xml.h:2
+#: ../hacks/config/bumps.xml.h:3 ../hacks/config/cage.xml.h:2
+#: ../hacks/config/carousel.xml.h:2 ../hacks/config/ccurve.xml.h:8
+#: ../hacks/config/celtic.xml.h:2 ../hacks/config/circuit.xml.h:2
+#: ../hacks/config/cityflow.xml.h:2 ../hacks/config/cloudlife.xml.h:2
+#: ../hacks/config/companioncube.xml.h:2 ../hacks/config/compass.xml.h:2
+#: ../hacks/config/coral.xml.h:2 ../hacks/config/covid19.xml.h:2
#: ../hacks/config/crackberg.xml.h:2 ../hacks/config/critical.xml.h:2
-#: ../hacks/config/crystal.xml.h:2 ../hacks/config/cube21.xml.h:2
-#: ../hacks/config/cubenetic.xml.h:2 ../hacks/config/cubestorm.xml.h:2
-#: ../hacks/config/cubicgrid.xml.h:2 ../hacks/config/cwaves.xml.h:2
-#: ../hacks/config/cynosure.xml.h:2 ../hacks/config/dangerball.xml.h:2
-#: ../hacks/config/decayscreen.xml.h:2 ../hacks/config/deluxe.xml.h:2
-#: ../hacks/config/demon.xml.h:2 ../hacks/config/discrete.xml.h:2
-#: ../hacks/config/distort.xml.h:2 ../hacks/config/dnalogo.xml.h:2
-#: ../hacks/config/drift.xml.h:2 ../hacks/config/endgame.xml.h:2
+#: ../hacks/config/crumbler.xml.h:2 ../hacks/config/crystal.xml.h:2
+#: ../hacks/config/cube21.xml.h:2 ../hacks/config/cubenetic.xml.h:2
+#: ../hacks/config/cubestack.xml.h:2 ../hacks/config/cubestorm.xml.h:2
+#: ../hacks/config/cubetwist.xml.h:2 ../hacks/config/cubicgrid.xml.h:2
+#: ../hacks/config/cwaves.xml.h:2 ../hacks/config/cynosure.xml.h:2
+#: ../hacks/config/dangerball.xml.h:2 ../hacks/config/decayscreen.xml.h:2
+#: ../hacks/config/deepstars.xml.h:2 ../hacks/config/deluxe.xml.h:2
+#: ../hacks/config/demon.xml.h:2 ../hacks/config/discoball.xml.h:2
+#: ../hacks/config/discrete.xml.h:2 ../hacks/config/distort.xml.h:2
+#: ../hacks/config/dnalogo.xml.h:2 ../hacks/config/drift.xml.h:2
+#: ../hacks/config/dymaxionmap.xml.h:2 ../hacks/config/endgame.xml.h:2
#: ../hacks/config/engine.xml.h:2 ../hacks/config/epicycle.xml.h:2
-#: ../hacks/config/eruption.xml.h:2 ../hacks/config/euler2d.xml.h:2
+#: ../hacks/config/eruption.xml.h:2 ../hacks/config/esper.xml.h:2
+#: ../hacks/config/etruscanvenus.xml.h:39 ../hacks/config/euler2d.xml.h:2
#: ../hacks/config/extrusion.xml.h:2 ../hacks/config/fadeplot.xml.h:2
-#: ../hacks/config/fiberlamp.xml.h:2 ../hacks/config/fireworkx.xml.h:2
-#: ../hacks/config/flag.xml.h:3 ../hacks/config/flame.xml.h:2
-#: ../hacks/config/flipflop.xml.h:2 ../hacks/config/flipscreen3d.xml.h:2
-#: ../hacks/config/fliptext.xml.h:2 ../hacks/config/flow.xml.h:2
-#: ../hacks/config/fluidballs.xml.h:2 ../hacks/config/flyingtoasters.xml.h:2
-#: ../hacks/config/fontglide.xml.h:2 ../hacks/config/forest.xml.h:2
-#: ../hacks/config/fuzzyflakes.xml.h:2 ../hacks/config/galaxy.xml.h:2
-#: ../hacks/config/gears.xml.h:2 ../hacks/config/geodesic.xml.h:11
-#: ../hacks/config/geodesicgears.xml.h:2 ../hacks/config/gflux.xml.h:2
+#: ../hacks/config/fiberlamp.xml.h:2 ../hacks/config/filmleader.xml.h:2
+#: ../hacks/config/fireworkx.xml.h:2 ../hacks/config/flag.xml.h:3
+#: ../hacks/config/flame.xml.h:2 ../hacks/config/flipflop.xml.h:2
+#: ../hacks/config/flipscreen3d.xml.h:2 ../hacks/config/fliptext.xml.h:2
+#: ../hacks/config/flow.xml.h:2 ../hacks/config/fluidballs.xml.h:2
+#: ../hacks/config/flyingtoasters.xml.h:2 ../hacks/config/fontglide.xml.h:2
+#: ../hacks/config/forest.xml.h:2 ../hacks/config/fuzzyflakes.xml.h:2
+#: ../hacks/config/galaxy.xml.h:2 ../hacks/config/gears.xml.h:2
+#: ../hacks/config/geodesic.xml.h:11 ../hacks/config/geodesicgears.xml.h:2
+#: ../hacks/config/gflux.xml.h:2 ../hacks/config/gibson.xml.h:2
#: ../hacks/config/glblur.xml.h:2 ../hacks/config/glcells.xml.h:2
#: ../hacks/config/gleidescope.xml.h:2 ../hacks/config/glforestfire.xml.h:2
-#: ../hacks/config/glhanoi.xml.h:2 ../hacks/config/glknots.xml.h:2
-#: ../hacks/config/glmatrix.xml.h:2 ../hacks/config/glplanet.xml.h:2
-#: ../hacks/config/glschool.xml.h:2 ../hacks/config/glslideshow.xml.h:2
-#: ../hacks/config/glsnake.xml.h:2 ../hacks/config/gltext.xml.h:2
-#: ../hacks/config/goop.xml.h:2 ../hacks/config/grav.xml.h:2
+#: ../hacks/config/glhanoi.xml.h:2 ../hacks/config/glitchpeg.xml.h:2
+#: ../hacks/config/glknots.xml.h:2 ../hacks/config/glmatrix.xml.h:2
+#: ../hacks/config/glplanet.xml.h:3 ../hacks/config/glschool.xml.h:2
+#: ../hacks/config/glslideshow.xml.h:2 ../hacks/config/glsnake.xml.h:2
+#: ../hacks/config/gltext.xml.h:2 ../hacks/config/goop.xml.h:2
+#: ../hacks/config/grav.xml.h:2 ../hacks/config/gravitywell.xml.h:2
#: ../hacks/config/greynetic.xml.h:2 ../hacks/config/halftone.xml.h:2
-#: ../hacks/config/halo.xml.h:2 ../hacks/config/helix.xml.h:2
-#: ../hacks/config/hexadrop.xml.h:2 ../hacks/config/hopalong.xml.h:2
+#: ../hacks/config/halo.xml.h:2 ../hacks/config/handsy.xml.h:2
+#: ../hacks/config/headroom.xml.h:2 ../hacks/config/helix.xml.h:2
+#: ../hacks/config/hexadrop.xml.h:2 ../hacks/config/hexstrut.xml.h:2
+#: ../hacks/config/hopalong.xml.h:2 ../hacks/config/hydrostat.xml.h:2
#: ../hacks/config/hyperball.xml.h:2 ../hacks/config/hypercube.xml.h:2
#: ../hacks/config/hypertorus.xml.h:2 ../hacks/config/hypnowheel.xml.h:14
#: ../hacks/config/ifs.xml.h:2 ../hacks/config/imsmap.xml.h:2
@@ -1398,39 +1519,43 @@ msgstr ""
#: ../hacks/config/jigsaw.xml.h:2 ../hacks/config/juggle.xml.h:2
#: ../hacks/config/juggler3d.xml.h:2 ../hacks/config/julia.xml.h:2
#: ../hacks/config/kaleidescope.xml.h:2 ../hacks/config/kaleidocycle.xml.h:2
-#: ../hacks/config/klein.xml.h:42 ../hacks/config/kumppa.xml.h:2
+#: ../hacks/config/klein.xml.h:44 ../hacks/config/kumppa.xml.h:2
#: ../hacks/config/lament.xml.h:2 ../hacks/config/laser.xml.h:2
#: ../hacks/config/lavalite.xml.h:2 ../hacks/config/lcdscrub.xml.h:2
#: ../hacks/config/lightning.xml.h:2 ../hacks/config/lisa.xml.h:2
#: ../hacks/config/lissie.xml.h:2 ../hacks/config/lmorph.xml.h:2
#: ../hacks/config/lockward.xml.h:2 ../hacks/config/loop.xml.h:2
#: ../hacks/config/m6502.xml.h:7 ../hacks/config/maze.xml.h:2
-#: ../hacks/config/memscroller.xml.h:2 ../hacks/config/menger.xml.h:2
-#: ../hacks/config/metaballs.xml.h:2 ../hacks/config/mirrorblob.xml.h:2
-#: ../hacks/config/mismunch.xml.h:2 ../hacks/config/moebius.xml.h:2
-#: ../hacks/config/moebiusgears.xml.h:2 ../hacks/config/moire2.xml.h:2
-#: ../hacks/config/molecule.xml.h:2 ../hacks/config/morph3d.xml.h:2
-#: ../hacks/config/mountain.xml.h:2 ../hacks/config/munch.xml.h:2
-#: ../hacks/config/nerverot.xml.h:2 ../hacks/config/noof.xml.h:2
-#: ../hacks/config/pacman.xml.h:2 ../hacks/config/penrose.xml.h:2
+#: ../hacks/config/maze3d.xml.h:5 ../hacks/config/memscroller.xml.h:2
+#: ../hacks/config/menger.xml.h:2 ../hacks/config/metaballs.xml.h:2
+#: ../hacks/config/mirrorblob.xml.h:2 ../hacks/config/mismunch.xml.h:2
+#: ../hacks/config/moebius.xml.h:2 ../hacks/config/moebiusgears.xml.h:2
+#: ../hacks/config/moire2.xml.h:2 ../hacks/config/molecule.xml.h:2
+#: ../hacks/config/morph3d.xml.h:2 ../hacks/config/mountain.xml.h:2
+#: ../hacks/config/munch.xml.h:2 ../hacks/config/nerverot.xml.h:2
+#: ../hacks/config/noof.xml.h:2 ../hacks/config/pacman.xml.h:2
+#: ../hacks/config/peepers.xml.h:2 ../hacks/config/penrose.xml.h:2
#: ../hacks/config/petri.xml.h:2 ../hacks/config/phosphor.xml.h:2
#: ../hacks/config/photopile.xml.h:15 ../hacks/config/piecewise.xml.h:2
#: ../hacks/config/pinion.xml.h:2 ../hacks/config/pipes.xml.h:2
#: ../hacks/config/polyhedra.xml.h:2 ../hacks/config/polyominoes.xml.h:3
#: ../hacks/config/polytopes.xml.h:24 ../hacks/config/pong.xml.h:10
-#: ../hacks/config/popsquares.xml.h:2 ../hacks/config/projectiveplane.xml.h:35
+#: ../hacks/config/popsquares.xml.h:2 ../hacks/config/projectiveplane.xml.h:37
#: ../hacks/config/providence.xml.h:2 ../hacks/config/pulsar.xml.h:2
#: ../hacks/config/pyro.xml.h:11 ../hacks/config/qix.xml.h:2
#: ../hacks/config/quasicrystal.xml.h:2 ../hacks/config/queens.xml.h:2
+#: ../hacks/config/raverhoop.xml.h:2 ../hacks/config/razzledazzle.xml.h:2
#: ../hacks/config/ripples.xml.h:2 ../hacks/config/rocks.xml.h:2
-#: ../hacks/config/rotor.xml.h:2 ../hacks/config/rotzoomer.xml.h:2
-#: ../hacks/config/rubik.xml.h:2 ../hacks/config/rubikblocks.xml.h:2
-#: ../hacks/config/sballs.xml.h:2 ../hacks/config/shadebobs.xml.h:2
+#: ../hacks/config/romanboy.xml.h:40 ../hacks/config/rotor.xml.h:2
+#: ../hacks/config/rotzoomer.xml.h:2 ../hacks/config/rubik.xml.h:2
+#: ../hacks/config/rubikblocks.xml.h:2 ../hacks/config/sballs.xml.h:2
+#: ../hacks/config/scooter.xml.h:2 ../hacks/config/shadebobs.xml.h:2
#: ../hacks/config/sierpinski.xml.h:2 ../hacks/config/sierpinski3d.xml.h:2
#: ../hacks/config/skytentacles.xml.h:11 ../hacks/config/slidescreen.xml.h:2
#: ../hacks/config/slip.xml.h:2 ../hacks/config/sonar.xml.h:2
#: ../hacks/config/speedmine.xml.h:2 ../hacks/config/sphere.xml.h:2
#: ../hacks/config/spheremonics.xml.h:2 ../hacks/config/spiral.xml.h:2
+#: ../hacks/config/splitflap.xml.h:2 ../hacks/config/splodesic.xml.h:2
#: ../hacks/config/spotlight.xml.h:2 ../hacks/config/sproingies.xml.h:2
#: ../hacks/config/squiral.xml.h:2 ../hacks/config/stairs.xml.h:2
#: ../hacks/config/starfish.xml.h:5 ../hacks/config/stonerview.xml.h:2
@@ -1441,41 +1566,49 @@ msgstr ""
#: ../hacks/config/thornbird.xml.h:2 ../hacks/config/topblock.xml.h:2
#: ../hacks/config/triangle.xml.h:2 ../hacks/config/tronbit.xml.h:2
#: ../hacks/config/truchet.xml.h:2 ../hacks/config/twang.xml.h:2
-#: ../hacks/config/unknownpleasures.xml.h:2 ../hacks/config/vines.xml.h:2
-#: ../hacks/config/wander.xml.h:2 ../hacks/config/whirlygig.xml.h:4
-#: ../hacks/config/winduprobot.xml.h:2 ../hacks/config/worm.xml.h:2
-#: ../hacks/config/wormhole.xml.h:2 ../hacks/config/xanalogtv.xml.h:3
-#: ../hacks/config/xflame.xml.h:2 ../hacks/config/xlyap.xml.h:2
-#: ../hacks/config/xmatrix.xml.h:15 ../hacks/config/xrayswarm.xml.h:2
-#: ../hacks/config/xspirograph.xml.h:2 ../hacks/config/zoom.xml.h:2
+#: ../hacks/config/unicrud.xml.h:2 ../hacks/config/unknownpleasures.xml.h:2
+#: ../hacks/config/vfeedback.xml.h:2 ../hacks/config/vigilance.xml.h:2
+#: ../hacks/config/vines.xml.h:2 ../hacks/config/wander.xml.h:2
+#: ../hacks/config/whirlygig.xml.h:4 ../hacks/config/winduprobot.xml.h:2
+#: ../hacks/config/worm.xml.h:2 ../hacks/config/wormhole.xml.h:2
+#: ../hacks/config/xanalogtv.xml.h:4 ../hacks/config/xflame.xml.h:2
+#: ../hacks/config/xlyap.xml.h:2 ../hacks/config/xmatrix.xml.h:15
+#: ../hacks/config/xrayswarm.xml.h:2 ../hacks/config/xspirograph.xml.h:2
+#: ../hacks/config/zoom.xml.h:2
msgid "Low"
msgstr ""
#. #### -colorcount [64]
+#. <video href="https://www.youtube.com/watch?v=OZ6zRLLFLk4"/>
#: ../hacks/config/anemotaxis.xml.h:3 ../hacks/config/ant.xml.h:3
#: ../hacks/config/antinspect.xml.h:3 ../hacks/config/antmaze.xml.h:3
#: ../hacks/config/antspotlight.xml.h:3 ../hacks/config/atlantis.xml.h:3
#: ../hacks/config/atunnel.xml.h:3 ../hacks/config/barcode.xml.h:3
-#: ../hacks/config/blaster.xml.h:3 ../hacks/config/blinkbox.xml.h:3
-#: ../hacks/config/blocktube.xml.h:3 ../hacks/config/bouboule.xml.h:3
-#: ../hacks/config/bouncingcow.xml.h:3 ../hacks/config/boxed.xml.h:3
-#: ../hacks/config/boxfit.xml.h:3 ../hacks/config/braid.xml.h:3
-#: ../hacks/config/bubble3d.xml.h:3 ../hacks/config/bubbles.xml.h:3
-#: ../hacks/config/bumps.xml.h:5 ../hacks/config/cage.xml.h:3
-#: ../hacks/config/carousel.xml.h:3 ../hacks/config/celtic.xml.h:3
-#: ../hacks/config/circuit.xml.h:3 ../hacks/config/cityflow.xml.h:3
-#: ../hacks/config/cloudlife.xml.h:3 ../hacks/config/companioncube.xml.h:3
-#: ../hacks/config/compass.xml.h:3 ../hacks/config/coral.xml.h:3
+#: ../hacks/config/beats.xml.h:3 ../hacks/config/blaster.xml.h:3
+#: ../hacks/config/blinkbox.xml.h:3 ../hacks/config/blocktube.xml.h:3
+#: ../hacks/config/bouboule.xml.h:3 ../hacks/config/bouncingcow.xml.h:3
+#: ../hacks/config/boxed.xml.h:3 ../hacks/config/boxfit.xml.h:3
+#: ../hacks/config/braid.xml.h:3 ../hacks/config/bubble3d.xml.h:3
+#: ../hacks/config/bubbles.xml.h:3 ../hacks/config/bumps.xml.h:5
+#: ../hacks/config/cage.xml.h:3 ../hacks/config/carousel.xml.h:3
+#: ../hacks/config/celtic.xml.h:3 ../hacks/config/circuit.xml.h:3
+#: ../hacks/config/cityflow.xml.h:3 ../hacks/config/cloudlife.xml.h:3
+#: ../hacks/config/companioncube.xml.h:3 ../hacks/config/compass.xml.h:3
+#: ../hacks/config/coral.xml.h:3 ../hacks/config/covid19.xml.h:3
#: ../hacks/config/crackberg.xml.h:3 ../hacks/config/critical.xml.h:3
-#: ../hacks/config/crystal.xml.h:3 ../hacks/config/cube21.xml.h:3
-#: ../hacks/config/cubenetic.xml.h:3 ../hacks/config/cubestorm.xml.h:3
-#: ../hacks/config/cubicgrid.xml.h:3 ../hacks/config/cwaves.xml.h:3
-#: ../hacks/config/cynosure.xml.h:3 ../hacks/config/dangerball.xml.h:3
-#: ../hacks/config/decayscreen.xml.h:3 ../hacks/config/deluxe.xml.h:3
-#: ../hacks/config/demon.xml.h:3 ../hacks/config/discrete.xml.h:3
-#: ../hacks/config/distort.xml.h:3 ../hacks/config/drift.xml.h:3
+#: ../hacks/config/crumbler.xml.h:3 ../hacks/config/crystal.xml.h:3
+#: ../hacks/config/cube21.xml.h:3 ../hacks/config/cubenetic.xml.h:3
+#: ../hacks/config/cubestack.xml.h:3 ../hacks/config/cubestorm.xml.h:3
+#: ../hacks/config/cubetwist.xml.h:3 ../hacks/config/cubicgrid.xml.h:3
+#: ../hacks/config/cwaves.xml.h:3 ../hacks/config/cynosure.xml.h:3
+#: ../hacks/config/dangerball.xml.h:3 ../hacks/config/decayscreen.xml.h:3
+#: ../hacks/config/deepstars.xml.h:3 ../hacks/config/deluxe.xml.h:3
+#: ../hacks/config/demon.xml.h:3 ../hacks/config/discoball.xml.h:3
+#: ../hacks/config/discrete.xml.h:3 ../hacks/config/distort.xml.h:3
+#: ../hacks/config/drift.xml.h:3 ../hacks/config/dymaxionmap.xml.h:3
#: ../hacks/config/endgame.xml.h:3 ../hacks/config/engine.xml.h:3
#: ../hacks/config/epicycle.xml.h:3 ../hacks/config/eruption.xml.h:3
+#: ../hacks/config/esper.xml.h:3 ../hacks/config/etruscanvenus.xml.h:40
#: ../hacks/config/euler2d.xml.h:3 ../hacks/config/extrusion.xml.h:3
#: ../hacks/config/fadeplot.xml.h:3 ../hacks/config/fiberlamp.xml.h:3
#: ../hacks/config/fireworkx.xml.h:3 ../hacks/config/flag.xml.h:4
@@ -1486,32 +1619,36 @@ msgstr ""
#: ../hacks/config/forest.xml.h:3 ../hacks/config/fuzzyflakes.xml.h:3
#: ../hacks/config/galaxy.xml.h:3 ../hacks/config/gears.xml.h:3
#: ../hacks/config/geodesic.xml.h:12 ../hacks/config/geodesicgears.xml.h:3
-#: ../hacks/config/gflux.xml.h:3 ../hacks/config/glblur.xml.h:3
-#: ../hacks/config/glcells.xml.h:3 ../hacks/config/gleidescope.xml.h:3
-#: ../hacks/config/glforestfire.xml.h:3 ../hacks/config/glhanoi.xml.h:3
+#: ../hacks/config/gflux.xml.h:3 ../hacks/config/gibson.xml.h:3
+#: ../hacks/config/glblur.xml.h:3 ../hacks/config/glcells.xml.h:3
+#: ../hacks/config/gleidescope.xml.h:3 ../hacks/config/glforestfire.xml.h:3
+#: ../hacks/config/glhanoi.xml.h:3 ../hacks/config/glitchpeg.xml.h:3
#: ../hacks/config/glknots.xml.h:3 ../hacks/config/glmatrix.xml.h:3
-#: ../hacks/config/glplanet.xml.h:3 ../hacks/config/glschool.xml.h:3
+#: ../hacks/config/glplanet.xml.h:5 ../hacks/config/glschool.xml.h:3
#: ../hacks/config/glslideshow.xml.h:3 ../hacks/config/glsnake.xml.h:3
#: ../hacks/config/gltext.xml.h:3 ../hacks/config/goop.xml.h:3
-#: ../hacks/config/grav.xml.h:3 ../hacks/config/greynetic.xml.h:3
-#: ../hacks/config/halftone.xml.h:3 ../hacks/config/halo.xml.h:3
-#: ../hacks/config/helix.xml.h:3 ../hacks/config/hexadrop.xml.h:3
+#: ../hacks/config/grav.xml.h:3 ../hacks/config/gravitywell.xml.h:3
+#: ../hacks/config/greynetic.xml.h:3 ../hacks/config/halftone.xml.h:3
+#: ../hacks/config/halo.xml.h:3 ../hacks/config/handsy.xml.h:3
+#: ../hacks/config/headroom.xml.h:3 ../hacks/config/helix.xml.h:3
+#: ../hacks/config/hexadrop.xml.h:3 ../hacks/config/hexstrut.xml.h:3
#: ../hacks/config/hilbert.xml.h:9 ../hacks/config/hopalong.xml.h:3
-#: ../hacks/config/hyperball.xml.h:3 ../hacks/config/hypercube.xml.h:3
-#: ../hacks/config/hypertorus.xml.h:3 ../hacks/config/hypnowheel.xml.h:3
-#: ../hacks/config/ifs.xml.h:3 ../hacks/config/imsmap.xml.h:3
-#: ../hacks/config/interaggregate.xml.h:3 ../hacks/config/interference.xml.h:3
-#: ../hacks/config/intermomentary.xml.h:3 ../hacks/config/jigglypuff.xml.h:12
-#: ../hacks/config/jigsaw.xml.h:3 ../hacks/config/juggle.xml.h:3
-#: ../hacks/config/juggler3d.xml.h:3 ../hacks/config/julia.xml.h:3
-#: ../hacks/config/kaleidescope.xml.h:3 ../hacks/config/kaleidocycle.xml.h:3
-#: ../hacks/config/klein.xml.h:43 ../hacks/config/kumppa.xml.h:3
-#: ../hacks/config/lament.xml.h:3 ../hacks/config/laser.xml.h:3
-#: ../hacks/config/lavalite.xml.h:3 ../hacks/config/lcdscrub.xml.h:3
-#: ../hacks/config/lightning.xml.h:3 ../hacks/config/lisa.xml.h:3
-#: ../hacks/config/lissie.xml.h:3 ../hacks/config/lmorph.xml.h:3
-#: ../hacks/config/lockward.xml.h:3 ../hacks/config/loop.xml.h:3
-#: ../hacks/config/maze.xml.h:3 ../hacks/config/memscroller.xml.h:3
+#: ../hacks/config/hydrostat.xml.h:3 ../hacks/config/hyperball.xml.h:3
+#: ../hacks/config/hypercube.xml.h:3 ../hacks/config/hypertorus.xml.h:3
+#: ../hacks/config/hypnowheel.xml.h:3 ../hacks/config/ifs.xml.h:3
+#: ../hacks/config/imsmap.xml.h:3 ../hacks/config/interaggregate.xml.h:3
+#: ../hacks/config/interference.xml.h:3 ../hacks/config/intermomentary.xml.h:3
+#: ../hacks/config/jigglypuff.xml.h:12 ../hacks/config/jigsaw.xml.h:3
+#: ../hacks/config/juggle.xml.h:3 ../hacks/config/juggler3d.xml.h:3
+#: ../hacks/config/julia.xml.h:3 ../hacks/config/kaleidescope.xml.h:3
+#: ../hacks/config/kaleidocycle.xml.h:3 ../hacks/config/klein.xml.h:45
+#: ../hacks/config/kumppa.xml.h:3 ../hacks/config/lament.xml.h:3
+#: ../hacks/config/laser.xml.h:3 ../hacks/config/lavalite.xml.h:3
+#: ../hacks/config/lcdscrub.xml.h:3 ../hacks/config/lightning.xml.h:3
+#: ../hacks/config/lisa.xml.h:3 ../hacks/config/lissie.xml.h:3
+#: ../hacks/config/lmorph.xml.h:3 ../hacks/config/lockward.xml.h:3
+#: ../hacks/config/loop.xml.h:3 ../hacks/config/maze.xml.h:3
+#: ../hacks/config/maze3d.xml.h:6 ../hacks/config/memscroller.xml.h:3
#: ../hacks/config/menger.xml.h:3 ../hacks/config/metaballs.xml.h:3
#: ../hacks/config/mirrorblob.xml.h:3 ../hacks/config/mismunch.xml.h:3
#: ../hacks/config/moebius.xml.h:3 ../hacks/config/moebiusgears.xml.h:3
@@ -1519,25 +1656,28 @@ msgstr ""
#: ../hacks/config/morph3d.xml.h:3 ../hacks/config/mountain.xml.h:3
#: ../hacks/config/munch.xml.h:3 ../hacks/config/nerverot.xml.h:3
#: ../hacks/config/noof.xml.h:3 ../hacks/config/pacman.xml.h:3
-#: ../hacks/config/penrose.xml.h:3 ../hacks/config/petri.xml.h:3
-#: ../hacks/config/phosphor.xml.h:3 ../hacks/config/photopile.xml.h:16
-#: ../hacks/config/piecewise.xml.h:3 ../hacks/config/pinion.xml.h:3
-#: ../hacks/config/pipes.xml.h:3 ../hacks/config/polyhedra.xml.h:3
-#: ../hacks/config/polyominoes.xml.h:4 ../hacks/config/polytopes.xml.h:25
-#: ../hacks/config/popsquares.xml.h:3 ../hacks/config/projectiveplane.xml.h:36
-#: ../hacks/config/providence.xml.h:3 ../hacks/config/pulsar.xml.h:3
-#: ../hacks/config/pyro.xml.h:3 ../hacks/config/qix.xml.h:3
-#: ../hacks/config/quasicrystal.xml.h:3 ../hacks/config/queens.xml.h:3
-#: ../hacks/config/rd-bomb.xml.h:3 ../hacks/config/rdbomb.xml.h:3
+#: ../hacks/config/peepers.xml.h:3 ../hacks/config/penrose.xml.h:3
+#: ../hacks/config/petri.xml.h:3 ../hacks/config/phosphor.xml.h:3
+#: ../hacks/config/photopile.xml.h:16 ../hacks/config/piecewise.xml.h:3
+#: ../hacks/config/pinion.xml.h:3 ../hacks/config/pipes.xml.h:3
+#: ../hacks/config/polyhedra.xml.h:3 ../hacks/config/polyominoes.xml.h:4
+#: ../hacks/config/polytopes.xml.h:25 ../hacks/config/popsquares.xml.h:3
+#: ../hacks/config/projectiveplane.xml.h:38 ../hacks/config/providence.xml.h:3
+#: ../hacks/config/pulsar.xml.h:3 ../hacks/config/pyro.xml.h:3
+#: ../hacks/config/qix.xml.h:3 ../hacks/config/quasicrystal.xml.h:3
+#: ../hacks/config/queens.xml.h:3 ../hacks/config/raverhoop.xml.h:3
+#: ../hacks/config/razzledazzle.xml.h:3 ../hacks/config/rd-bomb.xml.h:3
#: ../hacks/config/ripples.xml.h:3 ../hacks/config/rocks.xml.h:3
-#: ../hacks/config/rotor.xml.h:3 ../hacks/config/rotzoomer.xml.h:3
-#: ../hacks/config/rubik.xml.h:3 ../hacks/config/rubikblocks.xml.h:3
-#: ../hacks/config/sballs.xml.h:3 ../hacks/config/shadebobs.xml.h:3
+#: ../hacks/config/romanboy.xml.h:41 ../hacks/config/rotor.xml.h:3
+#: ../hacks/config/rotzoomer.xml.h:3 ../hacks/config/rubik.xml.h:3
+#: ../hacks/config/rubikblocks.xml.h:3 ../hacks/config/sballs.xml.h:3
+#: ../hacks/config/scooter.xml.h:3 ../hacks/config/shadebobs.xml.h:3
#: ../hacks/config/sierpinski.xml.h:3 ../hacks/config/sierpinski3d.xml.h:3
#: ../hacks/config/skytentacles.xml.h:16 ../hacks/config/slidescreen.xml.h:3
#: ../hacks/config/slip.xml.h:3 ../hacks/config/sonar.xml.h:3
#: ../hacks/config/speedmine.xml.h:3 ../hacks/config/sphere.xml.h:3
#: ../hacks/config/spheremonics.xml.h:3 ../hacks/config/spiral.xml.h:3
+#: ../hacks/config/splitflap.xml.h:3 ../hacks/config/splodesic.xml.h:3
#: ../hacks/config/spotlight.xml.h:3 ../hacks/config/sproingies.xml.h:3
#: ../hacks/config/squiral.xml.h:3 ../hacks/config/stairs.xml.h:3
#: ../hacks/config/starfish.xml.h:6 ../hacks/config/stonerview.xml.h:3
@@ -1548,7 +1688,8 @@ msgstr ""
#: ../hacks/config/thornbird.xml.h:3 ../hacks/config/topblock.xml.h:3
#: ../hacks/config/triangle.xml.h:3 ../hacks/config/tronbit.xml.h:3
#: ../hacks/config/truchet.xml.h:3 ../hacks/config/twang.xml.h:3
-#: ../hacks/config/unknownpleasures.xml.h:3 ../hacks/config/vines.xml.h:3
+#: ../hacks/config/unicrud.xml.h:3 ../hacks/config/unknownpleasures.xml.h:3
+#: ../hacks/config/vigilance.xml.h:3 ../hacks/config/vines.xml.h:3
#: ../hacks/config/voronoi.xml.h:3 ../hacks/config/wander.xml.h:3
#: ../hacks/config/winduprobot.xml.h:3 ../hacks/config/worm.xml.h:3
#: ../hacks/config/wormhole.xml.h:3 ../hacks/config/xflame.xml.h:3
@@ -1559,53 +1700,63 @@ msgid "Frame rate"
msgstr "フレームレート"
#. #### -colorcount [64]
+#. <video href="https://www.youtube.com/watch?v=OZ6zRLLFLk4"/>
#: ../hacks/config/anemotaxis.xml.h:4 ../hacks/config/ant.xml.h:4
#: ../hacks/config/antinspect.xml.h:4 ../hacks/config/antmaze.xml.h:4
#: ../hacks/config/antspotlight.xml.h:4 ../hacks/config/apple2.xml.h:12
#: ../hacks/config/atlantis.xml.h:4 ../hacks/config/attraction.xml.h:13
#: ../hacks/config/atunnel.xml.h:4 ../hacks/config/barcode.xml.h:4
-#: ../hacks/config/binaryring.xml.h:4 ../hacks/config/blaster.xml.h:4
-#: ../hacks/config/blinkbox.xml.h:4 ../hacks/config/blocktube.xml.h:4
-#: ../hacks/config/bouboule.xml.h:4 ../hacks/config/bouncingcow.xml.h:4
-#: ../hacks/config/boxed.xml.h:4 ../hacks/config/boxfit.xml.h:4
-#: ../hacks/config/braid.xml.h:4 ../hacks/config/bubble3d.xml.h:4
-#: ../hacks/config/bubbles.xml.h:4 ../hacks/config/bumps.xml.h:7
-#: ../hacks/config/cage.xml.h:4 ../hacks/config/carousel.xml.h:4
-#: ../hacks/config/ccurve.xml.h:10 ../hacks/config/celtic.xml.h:4
-#: ../hacks/config/circuit.xml.h:4 ../hacks/config/cityflow.xml.h:4
-#: ../hacks/config/cloudlife.xml.h:4 ../hacks/config/companioncube.xml.h:4
-#: ../hacks/config/compass.xml.h:4 ../hacks/config/coral.xml.h:4
+#: ../hacks/config/beats.xml.h:4 ../hacks/config/binaryring.xml.h:4
+#: ../hacks/config/blaster.xml.h:4 ../hacks/config/blinkbox.xml.h:4
+#: ../hacks/config/blocktube.xml.h:4 ../hacks/config/bouboule.xml.h:4
+#: ../hacks/config/bouncingcow.xml.h:4 ../hacks/config/boxed.xml.h:4
+#: ../hacks/config/boxfit.xml.h:4 ../hacks/config/braid.xml.h:4
+#: ../hacks/config/bubble3d.xml.h:4 ../hacks/config/bubbles.xml.h:4
+#: ../hacks/config/bumps.xml.h:7 ../hacks/config/cage.xml.h:4
+#: ../hacks/config/carousel.xml.h:4 ../hacks/config/ccurve.xml.h:10
+#: ../hacks/config/celtic.xml.h:4 ../hacks/config/circuit.xml.h:4
+#: ../hacks/config/cityflow.xml.h:4 ../hacks/config/cloudlife.xml.h:4
+#: ../hacks/config/companioncube.xml.h:4 ../hacks/config/compass.xml.h:4
+#: ../hacks/config/coral.xml.h:4 ../hacks/config/covid19.xml.h:4
#: ../hacks/config/crackberg.xml.h:4 ../hacks/config/critical.xml.h:4
-#: ../hacks/config/crystal.xml.h:4 ../hacks/config/cube21.xml.h:4
-#: ../hacks/config/cubenetic.xml.h:4 ../hacks/config/cubestorm.xml.h:4
-#: ../hacks/config/cubicgrid.xml.h:4 ../hacks/config/cwaves.xml.h:4
-#: ../hacks/config/cynosure.xml.h:4 ../hacks/config/dangerball.xml.h:4
-#: ../hacks/config/decayscreen.xml.h:4 ../hacks/config/deluxe.xml.h:4
-#: ../hacks/config/demon.xml.h:4 ../hacks/config/discrete.xml.h:4
-#: ../hacks/config/distort.xml.h:4 ../hacks/config/dnalogo.xml.h:4
-#: ../hacks/config/drift.xml.h:4 ../hacks/config/endgame.xml.h:4
+#: ../hacks/config/crumbler.xml.h:4 ../hacks/config/crystal.xml.h:4
+#: ../hacks/config/cube21.xml.h:4 ../hacks/config/cubenetic.xml.h:4
+#: ../hacks/config/cubestack.xml.h:4 ../hacks/config/cubestorm.xml.h:4
+#: ../hacks/config/cubetwist.xml.h:4 ../hacks/config/cubicgrid.xml.h:4
+#: ../hacks/config/cwaves.xml.h:4 ../hacks/config/cynosure.xml.h:4
+#: ../hacks/config/dangerball.xml.h:4 ../hacks/config/decayscreen.xml.h:4
+#: ../hacks/config/deepstars.xml.h:4 ../hacks/config/deluxe.xml.h:4
+#: ../hacks/config/demon.xml.h:4 ../hacks/config/discoball.xml.h:4
+#: ../hacks/config/discrete.xml.h:4 ../hacks/config/distort.xml.h:4
+#: ../hacks/config/dnalogo.xml.h:4 ../hacks/config/drift.xml.h:4
+#: ../hacks/config/dymaxionmap.xml.h:4 ../hacks/config/endgame.xml.h:4
#: ../hacks/config/engine.xml.h:4 ../hacks/config/epicycle.xml.h:4
-#: ../hacks/config/eruption.xml.h:4 ../hacks/config/euler2d.xml.h:4
+#: ../hacks/config/eruption.xml.h:4 ../hacks/config/esper.xml.h:4
+#: ../hacks/config/etruscanvenus.xml.h:41 ../hacks/config/euler2d.xml.h:4
#: ../hacks/config/extrusion.xml.h:4 ../hacks/config/fadeplot.xml.h:4
-#: ../hacks/config/fiberlamp.xml.h:4 ../hacks/config/fireworkx.xml.h:4
-#: ../hacks/config/flag.xml.h:5 ../hacks/config/flame.xml.h:4
-#: ../hacks/config/flipflop.xml.h:4 ../hacks/config/flipscreen3d.xml.h:4
-#: ../hacks/config/fliptext.xml.h:4 ../hacks/config/flow.xml.h:4
-#: ../hacks/config/fluidballs.xml.h:4 ../hacks/config/flyingtoasters.xml.h:4
-#: ../hacks/config/fontglide.xml.h:4 ../hacks/config/forest.xml.h:4
-#: ../hacks/config/fuzzyflakes.xml.h:4 ../hacks/config/galaxy.xml.h:4
-#: ../hacks/config/gears.xml.h:4 ../hacks/config/geodesic.xml.h:13
-#: ../hacks/config/geodesicgears.xml.h:4 ../hacks/config/gflux.xml.h:4
+#: ../hacks/config/fiberlamp.xml.h:4 ../hacks/config/filmleader.xml.h:4
+#: ../hacks/config/fireworkx.xml.h:4 ../hacks/config/flag.xml.h:5
+#: ../hacks/config/flame.xml.h:4 ../hacks/config/flipflop.xml.h:4
+#: ../hacks/config/flipscreen3d.xml.h:4 ../hacks/config/fliptext.xml.h:4
+#: ../hacks/config/flow.xml.h:4 ../hacks/config/fluidballs.xml.h:4
+#: ../hacks/config/flyingtoasters.xml.h:4 ../hacks/config/fontglide.xml.h:4
+#: ../hacks/config/forest.xml.h:4 ../hacks/config/fuzzyflakes.xml.h:4
+#: ../hacks/config/galaxy.xml.h:4 ../hacks/config/gears.xml.h:4
+#: ../hacks/config/geodesic.xml.h:13 ../hacks/config/geodesicgears.xml.h:4
+#: ../hacks/config/gflux.xml.h:4 ../hacks/config/gibson.xml.h:4
#: ../hacks/config/glblur.xml.h:4 ../hacks/config/glcells.xml.h:4
#: ../hacks/config/gleidescope.xml.h:4 ../hacks/config/glforestfire.xml.h:4
-#: ../hacks/config/glhanoi.xml.h:4 ../hacks/config/glknots.xml.h:4
-#: ../hacks/config/glmatrix.xml.h:4 ../hacks/config/glplanet.xml.h:4
-#: ../hacks/config/glschool.xml.h:4 ../hacks/config/glslideshow.xml.h:4
-#: ../hacks/config/glsnake.xml.h:4 ../hacks/config/gltext.xml.h:4
-#: ../hacks/config/goop.xml.h:4 ../hacks/config/grav.xml.h:4
+#: ../hacks/config/glhanoi.xml.h:4 ../hacks/config/glitchpeg.xml.h:4
+#: ../hacks/config/glknots.xml.h:4 ../hacks/config/glmatrix.xml.h:4
+#: ../hacks/config/glplanet.xml.h:7 ../hacks/config/glschool.xml.h:4
+#: ../hacks/config/glslideshow.xml.h:4 ../hacks/config/glsnake.xml.h:4
+#: ../hacks/config/gltext.xml.h:4 ../hacks/config/goop.xml.h:4
+#: ../hacks/config/grav.xml.h:4 ../hacks/config/gravitywell.xml.h:4
#: ../hacks/config/greynetic.xml.h:4 ../hacks/config/halftone.xml.h:4
-#: ../hacks/config/halo.xml.h:4 ../hacks/config/helix.xml.h:4
-#: ../hacks/config/hexadrop.xml.h:4 ../hacks/config/hopalong.xml.h:4
+#: ../hacks/config/halo.xml.h:4 ../hacks/config/handsy.xml.h:4
+#: ../hacks/config/headroom.xml.h:4 ../hacks/config/helix.xml.h:4
+#: ../hacks/config/hexadrop.xml.h:4 ../hacks/config/hexstrut.xml.h:4
+#: ../hacks/config/hopalong.xml.h:4 ../hacks/config/hydrostat.xml.h:4
#: ../hacks/config/hyperball.xml.h:4 ../hacks/config/hypercube.xml.h:4
#: ../hacks/config/hypertorus.xml.h:4 ../hacks/config/hypnowheel.xml.h:16
#: ../hacks/config/ifs.xml.h:4 ../hacks/config/imsmap.xml.h:4
@@ -1614,39 +1765,43 @@ msgstr "フレームレート"
#: ../hacks/config/jigsaw.xml.h:4 ../hacks/config/juggle.xml.h:4
#: ../hacks/config/juggler3d.xml.h:4 ../hacks/config/julia.xml.h:4
#: ../hacks/config/kaleidescope.xml.h:4 ../hacks/config/kaleidocycle.xml.h:4
-#: ../hacks/config/klein.xml.h:44 ../hacks/config/kumppa.xml.h:4
+#: ../hacks/config/klein.xml.h:46 ../hacks/config/kumppa.xml.h:4
#: ../hacks/config/lament.xml.h:4 ../hacks/config/laser.xml.h:4
#: ../hacks/config/lavalite.xml.h:4 ../hacks/config/lcdscrub.xml.h:4
#: ../hacks/config/lightning.xml.h:4 ../hacks/config/lisa.xml.h:4
#: ../hacks/config/lissie.xml.h:4 ../hacks/config/lmorph.xml.h:4
#: ../hacks/config/lockward.xml.h:4 ../hacks/config/loop.xml.h:4
#: ../hacks/config/m6502.xml.h:9 ../hacks/config/maze.xml.h:4
-#: ../hacks/config/memscroller.xml.h:4 ../hacks/config/menger.xml.h:4
-#: ../hacks/config/metaballs.xml.h:4 ../hacks/config/mirrorblob.xml.h:4
-#: ../hacks/config/mismunch.xml.h:4 ../hacks/config/moebius.xml.h:4
-#: ../hacks/config/moebiusgears.xml.h:4 ../hacks/config/moire2.xml.h:4
-#: ../hacks/config/molecule.xml.h:4 ../hacks/config/morph3d.xml.h:4
-#: ../hacks/config/mountain.xml.h:4 ../hacks/config/munch.xml.h:4
-#: ../hacks/config/nerverot.xml.h:4 ../hacks/config/noof.xml.h:4
-#: ../hacks/config/pacman.xml.h:4 ../hacks/config/penrose.xml.h:4
+#: ../hacks/config/maze3d.xml.h:7 ../hacks/config/memscroller.xml.h:4
+#: ../hacks/config/menger.xml.h:4 ../hacks/config/metaballs.xml.h:4
+#: ../hacks/config/mirrorblob.xml.h:4 ../hacks/config/mismunch.xml.h:4
+#: ../hacks/config/moebius.xml.h:4 ../hacks/config/moebiusgears.xml.h:4
+#: ../hacks/config/moire2.xml.h:4 ../hacks/config/molecule.xml.h:4
+#: ../hacks/config/morph3d.xml.h:4 ../hacks/config/mountain.xml.h:4
+#: ../hacks/config/munch.xml.h:4 ../hacks/config/nerverot.xml.h:4
+#: ../hacks/config/noof.xml.h:4 ../hacks/config/pacman.xml.h:4
+#: ../hacks/config/peepers.xml.h:4 ../hacks/config/penrose.xml.h:4
#: ../hacks/config/petri.xml.h:4 ../hacks/config/phosphor.xml.h:4
#: ../hacks/config/photopile.xml.h:17 ../hacks/config/piecewise.xml.h:4
#: ../hacks/config/pinion.xml.h:4 ../hacks/config/pipes.xml.h:4
#: ../hacks/config/polyhedra.xml.h:4 ../hacks/config/polyominoes.xml.h:5
#: ../hacks/config/polytopes.xml.h:26 ../hacks/config/pong.xml.h:12
-#: ../hacks/config/popsquares.xml.h:4 ../hacks/config/projectiveplane.xml.h:37
+#: ../hacks/config/popsquares.xml.h:4 ../hacks/config/projectiveplane.xml.h:39
#: ../hacks/config/providence.xml.h:4 ../hacks/config/pulsar.xml.h:4
#: ../hacks/config/pyro.xml.h:13 ../hacks/config/qix.xml.h:4
#: ../hacks/config/quasicrystal.xml.h:4 ../hacks/config/queens.xml.h:4
+#: ../hacks/config/raverhoop.xml.h:4 ../hacks/config/razzledazzle.xml.h:4
#: ../hacks/config/ripples.xml.h:4 ../hacks/config/rocks.xml.h:4
-#: ../hacks/config/rotor.xml.h:4 ../hacks/config/rotzoomer.xml.h:4
-#: ../hacks/config/rubik.xml.h:4 ../hacks/config/rubikblocks.xml.h:4
-#: ../hacks/config/sballs.xml.h:4 ../hacks/config/shadebobs.xml.h:4
+#: ../hacks/config/romanboy.xml.h:42 ../hacks/config/rotor.xml.h:4
+#: ../hacks/config/rotzoomer.xml.h:4 ../hacks/config/rubik.xml.h:4
+#: ../hacks/config/rubikblocks.xml.h:4 ../hacks/config/sballs.xml.h:4
+#: ../hacks/config/scooter.xml.h:4 ../hacks/config/shadebobs.xml.h:4
#: ../hacks/config/sierpinski.xml.h:4 ../hacks/config/sierpinski3d.xml.h:4
#: ../hacks/config/skytentacles.xml.h:13 ../hacks/config/slidescreen.xml.h:4
#: ../hacks/config/slip.xml.h:4 ../hacks/config/sonar.xml.h:4
#: ../hacks/config/speedmine.xml.h:4 ../hacks/config/sphere.xml.h:4
#: ../hacks/config/spheremonics.xml.h:4 ../hacks/config/spiral.xml.h:4
+#: ../hacks/config/splitflap.xml.h:4 ../hacks/config/splodesic.xml.h:4
#: ../hacks/config/spotlight.xml.h:4 ../hacks/config/sproingies.xml.h:4
#: ../hacks/config/squiral.xml.h:4 ../hacks/config/stairs.xml.h:4
#: ../hacks/config/starfish.xml.h:7 ../hacks/config/starwars.xml.h:3
@@ -1657,14 +1812,15 @@ msgstr "フレームレート"
#: ../hacks/config/tessellimage.xml.h:4 ../hacks/config/thornbird.xml.h:4
#: ../hacks/config/topblock.xml.h:4 ../hacks/config/triangle.xml.h:4
#: ../hacks/config/tronbit.xml.h:4 ../hacks/config/truchet.xml.h:4
-#: ../hacks/config/twang.xml.h:4 ../hacks/config/unknownpleasures.xml.h:4
-#: ../hacks/config/vines.xml.h:4 ../hacks/config/wander.xml.h:4
-#: ../hacks/config/whirlygig.xml.h:6 ../hacks/config/winduprobot.xml.h:4
-#: ../hacks/config/worm.xml.h:4 ../hacks/config/wormhole.xml.h:4
-#: ../hacks/config/xanalogtv.xml.h:5 ../hacks/config/xflame.xml.h:4
-#: ../hacks/config/xlyap.xml.h:4 ../hacks/config/xmatrix.xml.h:17
-#: ../hacks/config/xrayswarm.xml.h:4 ../hacks/config/xspirograph.xml.h:4
-#: ../hacks/config/zoom.xml.h:4
+#: ../hacks/config/twang.xml.h:4 ../hacks/config/unicrud.xml.h:4
+#: ../hacks/config/unknownpleasures.xml.h:4 ../hacks/config/vfeedback.xml.h:4
+#: ../hacks/config/vigilance.xml.h:4 ../hacks/config/vines.xml.h:4
+#: ../hacks/config/wander.xml.h:4 ../hacks/config/whirlygig.xml.h:6
+#: ../hacks/config/winduprobot.xml.h:4 ../hacks/config/worm.xml.h:4
+#: ../hacks/config/wormhole.xml.h:4 ../hacks/config/xanalogtv.xml.h:6
+#: ../hacks/config/xflame.xml.h:4 ../hacks/config/xlyap.xml.h:4
+#: ../hacks/config/xmatrix.xml.h:17 ../hacks/config/xrayswarm.xml.h:4
+#: ../hacks/config/xspirograph.xml.h:4 ../hacks/config/zoom.xml.h:4
msgid "High"
msgstr ""
@@ -1694,7 +1850,7 @@ msgstr ""
msgid ""
"Searches for a source of odor in a turbulent atmosphere. The searcher is "
"able to sense the odor and determine local instantaneous wind direction. The "
-"goal is to find the source in the shortest mean time. http://en.wikipedia."
+"goal is to find the source in the shortest mean time. https://en.wikipedia."
"org/wiki/Anemotaxis Written by Eugene Balkovsky; 2004."
msgstr ""
@@ -1707,18 +1863,19 @@ msgstr ""
#: ../hacks/config/blinkbox.xml.h:5 ../hacks/config/cityflow.xml.h:12
#: ../hacks/config/cloudlife.xml.h:9 ../hacks/config/cube21.xml.h:5
#: ../hacks/config/cubenetic.xml.h:20 ../hacks/config/demon.xml.h:8
-#: ../hacks/config/discrete.xml.h:5 ../hacks/config/distort.xml.h:9
-#: ../hacks/config/fadeplot.xml.h:8 ../hacks/config/flag.xml.h:6
-#: ../hacks/config/flow.xml.h:8 ../hacks/config/fluidballs.xml.h:8
-#: ../hacks/config/fuzzyflakes.xml.h:25 ../hacks/config/glcells.xml.h:11
-#: ../hacks/config/gleidescope.xml.h:5 ../hacks/config/halftone.xml.h:8
-#: ../hacks/config/hexadrop.xml.h:8 ../hacks/config/hopalong.xml.h:5
-#: ../hacks/config/interference.xml.h:8 ../hacks/config/julia.xml.h:8
-#: ../hacks/config/lisa.xml.h:10 ../hacks/config/lissie.xml.h:5
-#: ../hacks/config/loop.xml.h:5 ../hacks/config/metaballs.xml.h:12
-#: ../hacks/config/moire.xml.h:8 ../hacks/config/penrose.xml.h:8
-#: ../hacks/config/photopile.xml.h:2 ../hacks/config/piecewise.xml.h:11
-#: ../hacks/config/rd-bomb.xml.h:11 ../hacks/config/rdbomb.xml.h:11
+#: ../hacks/config/discoball.xml.h:8 ../hacks/config/discrete.xml.h:5
+#: ../hacks/config/distort.xml.h:9 ../hacks/config/fadeplot.xml.h:8
+#: ../hacks/config/flag.xml.h:6 ../hacks/config/flow.xml.h:8
+#: ../hacks/config/fluidballs.xml.h:8 ../hacks/config/fuzzyflakes.xml.h:25
+#: ../hacks/config/glcells.xml.h:11 ../hacks/config/gleidescope.xml.h:5
+#: ../hacks/config/halftone.xml.h:8 ../hacks/config/hexadrop.xml.h:8
+#: ../hacks/config/hexstrut.xml.h:8 ../hacks/config/hopalong.xml.h:5
+#: ../hacks/config/hydrostat.xml.h:11 ../hacks/config/interference.xml.h:8
+#: ../hacks/config/julia.xml.h:8 ../hacks/config/lisa.xml.h:10
+#: ../hacks/config/lissie.xml.h:5 ../hacks/config/loop.xml.h:5
+#: ../hacks/config/metaballs.xml.h:12 ../hacks/config/moire.xml.h:8
+#: ../hacks/config/penrose.xml.h:8 ../hacks/config/photopile.xml.h:2
+#: ../hacks/config/piecewise.xml.h:11 ../hacks/config/rd-bomb.xml.h:11
#: ../hacks/config/rorschach.xml.h:2 ../hacks/config/rubikblocks.xml.h:5
#: ../hacks/config/sierpinski.xml.h:8 ../hacks/config/slidescreen.xml.h:14
#: ../hacks/config/slip.xml.h:8 ../hacks/config/spotlight.xml.h:8
@@ -1739,18 +1896,19 @@ msgstr ""
#: ../hacks/config/blinkbox.xml.h:7 ../hacks/config/cityflow.xml.h:14
#: ../hacks/config/cloudlife.xml.h:11 ../hacks/config/cube21.xml.h:7
#: ../hacks/config/cubenetic.xml.h:22 ../hacks/config/demon.xml.h:10
-#: ../hacks/config/discrete.xml.h:7 ../hacks/config/distort.xml.h:13
-#: ../hacks/config/fadeplot.xml.h:10 ../hacks/config/flag.xml.h:8
-#: ../hacks/config/flow.xml.h:10 ../hacks/config/fluidballs.xml.h:10
-#: ../hacks/config/fuzzyflakes.xml.h:27 ../hacks/config/glcells.xml.h:27
-#: ../hacks/config/gleidescope.xml.h:7 ../hacks/config/halftone.xml.h:12
-#: ../hacks/config/hexadrop.xml.h:10 ../hacks/config/hopalong.xml.h:7
-#: ../hacks/config/interference.xml.h:10 ../hacks/config/julia.xml.h:10
-#: ../hacks/config/lisa.xml.h:12 ../hacks/config/lissie.xml.h:7
-#: ../hacks/config/loop.xml.h:7 ../hacks/config/moire.xml.h:10
-#: ../hacks/config/penrose.xml.h:10 ../hacks/config/photopile.xml.h:4
-#: ../hacks/config/piecewise.xml.h:13 ../hacks/config/rd-bomb.xml.h:13
-#: ../hacks/config/rdbomb.xml.h:13 ../hacks/config/rorschach.xml.h:4
+#: ../hacks/config/discoball.xml.h:10 ../hacks/config/discrete.xml.h:7
+#: ../hacks/config/distort.xml.h:13 ../hacks/config/fadeplot.xml.h:10
+#: ../hacks/config/flag.xml.h:8 ../hacks/config/flow.xml.h:10
+#: ../hacks/config/fluidballs.xml.h:10 ../hacks/config/fuzzyflakes.xml.h:27
+#: ../hacks/config/glcells.xml.h:27 ../hacks/config/gleidescope.xml.h:7
+#: ../hacks/config/halftone.xml.h:12 ../hacks/config/hexadrop.xml.h:10
+#: ../hacks/config/hexstrut.xml.h:10 ../hacks/config/hopalong.xml.h:7
+#: ../hacks/config/hydrostat.xml.h:13 ../hacks/config/interference.xml.h:10
+#: ../hacks/config/julia.xml.h:10 ../hacks/config/lisa.xml.h:12
+#: ../hacks/config/lissie.xml.h:7 ../hacks/config/loop.xml.h:7
+#: ../hacks/config/moire.xml.h:10 ../hacks/config/penrose.xml.h:10
+#: ../hacks/config/photopile.xml.h:4 ../hacks/config/piecewise.xml.h:13
+#: ../hacks/config/rd-bomb.xml.h:13 ../hacks/config/rorschach.xml.h:4
#: ../hacks/config/rubikblocks.xml.h:7 ../hacks/config/sierpinski.xml.h:10
#: ../hacks/config/slidescreen.xml.h:16 ../hacks/config/slip.xml.h:10
#: ../hacks/config/spotlight.xml.h:10 ../hacks/config/topblock.xml.h:10
@@ -1814,12 +1972,12 @@ msgstr ""
#: ../hacks/config/moire2.xml.h:6 ../hacks/config/mountain.xml.h:9
#: ../hacks/config/penrose.xml.h:6 ../hacks/config/polyominoes.xml.h:10
#: ../hacks/config/popsquares.xml.h:7 ../hacks/config/rd-bomb.xml.h:15
-#: ../hacks/config/rdbomb.xml.h:15 ../hacks/config/rocks.xml.h:15
-#: ../hacks/config/rotor.xml.h:9 ../hacks/config/shadebobs.xml.h:8
+#: ../hacks/config/rocks.xml.h:15 ../hacks/config/rotor.xml.h:9
+#: ../hacks/config/scooter.xml.h:15 ../hacks/config/shadebobs.xml.h:8
#: ../hacks/config/sierpinski.xml.h:12 ../hacks/config/slip.xml.h:12
#: ../hacks/config/sphere.xml.h:6 ../hacks/config/spiral.xml.h:10
#: ../hacks/config/squiral.xml.h:14 ../hacks/config/starfish.xml.h:15
-#: ../hacks/config/strange.xml.h:9 ../hacks/config/swirl.xml.h:9
+#: ../hacks/config/strange.xml.h:21 ../hacks/config/swirl.xml.h:9
#: ../hacks/config/triangle.xml.h:6 ../hacks/config/vines.xml.h:6
#: ../hacks/config/worm.xml.h:6
msgid "Number of colors"
@@ -1834,9 +1992,8 @@ msgid "Ant size"
msgstr ""
#: ../hacks/config/ant.xml.h:16
-#, fuzzy
msgid "Random cell shape"
-msgstr "ランダムなスクリーンセーバー"
+msgstr "ランダムなセルの形"
#: ../hacks/config/ant.xml.h:17
msgid "Three sided cells"
@@ -1865,12 +2022,12 @@ msgid ""
"version 4.22. A cellular automaton that is really a two-dimensional Turing "
"machine: as the heads (\"ants\") walk along the screen, they change pixel "
"values in their path. Then, as they pass over changed pixels, their behavior "
-"is influenced. http://en.wikipedia.org/wiki/Langton%27s_ant http://en."
+"is influenced. https://en.wikipedia.org/wiki/Langton%27s_ant https://en."
"wikipedia.org/wiki/Turing_machine Written by David Bagley; 1997."
msgstr ""
#: ../hacks/config/antinspect.xml.h:1
-msgid "AntInspect"
+msgid "Ant Inspect"
msgstr ""
#: ../hacks/config/antinspect.xml.h:6
@@ -1882,7 +2039,7 @@ msgid "Ants move spheres around a circle. Written by Blair Tennessy; 2004."
msgstr ""
#: ../hacks/config/antmaze.xml.h:1
-msgid "AntMaze"
+msgid "Ant Maze"
msgstr ""
#: ../hacks/config/antmaze.xml.h:6
@@ -1890,7 +2047,7 @@ msgid "Ants walk around a simple maze. Written by Blair Tennessy; 2005."
msgstr ""
#: ../hacks/config/antspotlight.xml.h:1
-msgid "AntSpotlight"
+msgid "Ant Spotlight"
msgstr ""
#: ../hacks/config/antspotlight.xml.h:6
@@ -1916,7 +2073,7 @@ msgstr ""
#. don't know what -count does
#: ../hacks/config/apollonian.xml.h:7 ../hacks/config/flipflop.xml.h:11
-#: ../hacks/config/geodesic.xml.h:18
+#: ../hacks/config/geodesic.xml.h:18 ../hacks/config/splodesic.xml.h:8
msgid "Depth"
msgstr ""
@@ -1937,20 +2094,20 @@ msgstr ""
#: ../hacks/config/flame.xml.h:12 ../hacks/config/flow.xml.h:11
#: ../hacks/config/forest.xml.h:5 ../hacks/config/galaxy.xml.h:9
#: ../hacks/config/grav.xml.h:8 ../hacks/config/halo.xml.h:8
-#: ../hacks/config/hopalong.xml.h:9 ../hacks/config/imsmap.xml.h:11
-#: ../hacks/config/interference.xml.h:15 ../hacks/config/julia.xml.h:11
-#: ../hacks/config/laser.xml.h:9 ../hacks/config/lightning.xml.h:5
-#: ../hacks/config/lisa.xml.h:8 ../hacks/config/lissie.xml.h:8
-#: ../hacks/config/loop.xml.h:8 ../hacks/config/metaballs.xml.h:8
-#: ../hacks/config/moire.xml.h:5 ../hacks/config/moire2.xml.h:5
-#: ../hacks/config/mountain.xml.h:8 ../hacks/config/nerverot.xml.h:11
-#: ../hacks/config/penrose.xml.h:5 ../hacks/config/polyominoes.xml.h:9
-#: ../hacks/config/rd-bomb.xml.h:14 ../hacks/config/rdbomb.xml.h:14
+#: ../hacks/config/handsy.xml.h:8 ../hacks/config/hopalong.xml.h:9
+#: ../hacks/config/imsmap.xml.h:11 ../hacks/config/interference.xml.h:15
+#: ../hacks/config/julia.xml.h:11 ../hacks/config/laser.xml.h:9
+#: ../hacks/config/lightning.xml.h:5 ../hacks/config/lisa.xml.h:8
+#: ../hacks/config/lissie.xml.h:8 ../hacks/config/loop.xml.h:8
+#: ../hacks/config/metaballs.xml.h:8 ../hacks/config/moire.xml.h:5
+#: ../hacks/config/moire2.xml.h:5 ../hacks/config/mountain.xml.h:8
+#: ../hacks/config/nerverot.xml.h:11 ../hacks/config/penrose.xml.h:5
+#: ../hacks/config/polyominoes.xml.h:9 ../hacks/config/rd-bomb.xml.h:14
#: ../hacks/config/rocks.xml.h:14 ../hacks/config/rotor.xml.h:8
#: ../hacks/config/shadebobs.xml.h:6 ../hacks/config/sierpinski.xml.h:11
#: ../hacks/config/slip.xml.h:11 ../hacks/config/sphere.xml.h:5
#: ../hacks/config/spiral.xml.h:9 ../hacks/config/squiral.xml.h:13
-#: ../hacks/config/starfish.xml.h:14 ../hacks/config/strange.xml.h:8
+#: ../hacks/config/starfish.xml.h:14 ../hacks/config/strange.xml.h:20
#: ../hacks/config/swirl.xml.h:8 ../hacks/config/triangle.xml.h:5
#: ../hacks/config/vines.xml.h:5 ../hacks/config/worm.xml.h:5
msgid "Two"
@@ -1960,13 +2117,13 @@ msgstr ""
#, no-c-format
msgid ""
"A fractal packing of circles with smaller circles, demonstrating Descartes's "
-"theorem. http://en.wikipedia.org/wiki/Apollonian_gasket http://en.wikipedia."
-"org/wiki/Descartes%27_theorem Written by Allan R. Wilks and David Bagley; "
-"2002."
+"theorem. https://en.wikipedia.org/wiki/Apollonian_gasket https://en."
+"wikipedia.org/wiki/Descartes%27_theorem Written by Allan R. Wilks and David "
+"Bagley; 2002."
msgstr ""
-#: ../hacks/config/apple2.xml.h:1
-msgid "Apple2"
+#: ../hacks/config/apple2.xml.h:1 ../hacks/config/bsod.xml.h:13
+msgid "Apple ]["
msgstr ""
#: ../hacks/config/apple2.xml.h:2
@@ -2008,51 +2165,57 @@ msgstr "10秒間"
#: ../hacks/config/distort.xml.h:6 ../hacks/config/drift.xml.h:6
#: ../hacks/config/eruption.xml.h:20 ../hacks/config/euler2d.xml.h:26
#: ../hacks/config/galaxy.xml.h:7 ../hacks/config/geodesicgears.xml.h:6
-#: ../hacks/config/glsnake.xml.h:6 ../hacks/config/hopalong.xml.h:6
-#: ../hacks/config/laser.xml.h:7 ../hacks/config/menger.xml.h:6
-#: ../hacks/config/metaballs.xml.h:6 ../hacks/config/mismunch.xml.h:6
-#: ../hacks/config/moire.xml.h:3 ../hacks/config/molecule.xml.h:6
-#: ../hacks/config/munch.xml.h:6 ../hacks/config/nerverot.xml.h:6
-#: ../hacks/config/pedal.xml.h:3 ../hacks/config/polyhedra.xml.h:9
-#: ../hacks/config/polyominoes.xml.h:7 ../hacks/config/ripples.xml.h:6
-#: ../hacks/config/rotzoomer.xml.h:6 ../hacks/config/shadebobs.xml.h:14
-#: ../hacks/config/sierpinski3d.xml.h:6 ../hacks/config/slidescreen.xml.h:9
-#: ../hacks/config/spheremonics.xml.h:6 ../hacks/config/spotlight.xml.h:6
-#: ../hacks/config/starfish.xml.h:9 ../hacks/config/substrate.xml.h:6
-#: ../hacks/config/superquadrics.xml.h:10 ../hacks/config/surfaces.xml.h:6
-#: ../hacks/config/tessellimage.xml.h:9 ../hacks/config/twang.xml.h:6
-#: ../hacks/config/vermiculate.xml.h:3 ../hacks/config/vidwhacker.xml.h:3
-#: ../hacks/config/wander.xml.h:7 ../hacks/config/zoom.xml.h:6
+#: ../hacks/config/glitchpeg.xml.h:6 ../hacks/config/glsnake.xml.h:6
+#: ../hacks/config/hopalong.xml.h:6 ../hacks/config/laser.xml.h:7
+#: ../hacks/config/menger.xml.h:6 ../hacks/config/metaballs.xml.h:6
+#: ../hacks/config/mismunch.xml.h:6 ../hacks/config/moire.xml.h:3
+#: ../hacks/config/molecule.xml.h:6 ../hacks/config/munch.xml.h:6
+#: ../hacks/config/nerverot.xml.h:6 ../hacks/config/pedal.xml.h:3
+#: ../hacks/config/polyhedra.xml.h:9 ../hacks/config/polyominoes.xml.h:7
+#: ../hacks/config/ripples.xml.h:6 ../hacks/config/rotzoomer.xml.h:6
+#: ../hacks/config/shadebobs.xml.h:14 ../hacks/config/sierpinski3d.xml.h:6
+#: ../hacks/config/slidescreen.xml.h:9 ../hacks/config/spheremonics.xml.h:6
+#: ../hacks/config/spotlight.xml.h:6 ../hacks/config/starfish.xml.h:9
+#: ../hacks/config/substrate.xml.h:6 ../hacks/config/superquadrics.xml.h:10
+#: ../hacks/config/surfaces.xml.h:6 ../hacks/config/tessellimage.xml.h:9
+#: ../hacks/config/twang.xml.h:6 ../hacks/config/vermiculate.xml.h:3
+#: ../hacks/config/vidwhacker.xml.h:3 ../hacks/config/wander.xml.h:7
+#: ../hacks/config/zoom.xml.h:6
msgid "Duration"
msgstr ""
#: ../hacks/config/apple2.xml.h:8 ../hacks/config/blitspin.xml.h:8
#: ../hacks/config/bumps.xml.h:10 ../hacks/config/decayscreen.xml.h:7
-#: ../hacks/config/distort.xml.h:7 ../hacks/config/ripples.xml.h:7
-#: ../hacks/config/rotzoomer.xml.h:7 ../hacks/config/slidescreen.xml.h:10
-#: ../hacks/config/spotlight.xml.h:7 ../hacks/config/tessellimage.xml.h:10
-#: ../hacks/config/twang.xml.h:7 ../hacks/config/zoom.xml.h:7
+#: ../hacks/config/distort.xml.h:7 ../hacks/config/glitchpeg.xml.h:7
+#: ../hacks/config/ripples.xml.h:7 ../hacks/config/rotzoomer.xml.h:7
+#: ../hacks/config/slidescreen.xml.h:10 ../hacks/config/spotlight.xml.h:7
+#: ../hacks/config/tessellimage.xml.h:10 ../hacks/config/twang.xml.h:7
+#: ../hacks/config/zoom.xml.h:7
msgid "10 minutes"
msgstr "10分間"
-#: ../hacks/config/apple2.xml.h:11 ../hacks/config/m6502.xml.h:8
-#: ../hacks/config/xanalogtv.xml.h:4
+#: ../hacks/config/apple2.xml.h:11 ../hacks/config/filmleader.xml.h:3
+#: ../hacks/config/m6502.xml.h:8 ../hacks/config/vfeedback.xml.h:3
+#: ../hacks/config/xanalogtv.xml.h:5
#, fuzzy
msgid "Color Knob"
msgstr "色"
-#: ../hacks/config/apple2.xml.h:13 ../hacks/config/m6502.xml.h:10
-#: ../hacks/config/xanalogtv.xml.h:6
+#: ../hacks/config/apple2.xml.h:13 ../hacks/config/filmleader.xml.h:5
+#: ../hacks/config/m6502.xml.h:10 ../hacks/config/vfeedback.xml.h:5
+#: ../hacks/config/xanalogtv.xml.h:7
msgid "Tint Knob"
msgstr ""
-#: ../hacks/config/apple2.xml.h:14 ../hacks/config/m6502.xml.h:11
-#: ../hacks/config/pong.xml.h:11 ../hacks/config/xanalogtv.xml.h:7
+#: ../hacks/config/apple2.xml.h:14 ../hacks/config/filmleader.xml.h:7
+#: ../hacks/config/m6502.xml.h:14 ../hacks/config/pong.xml.h:11
+#: ../hacks/config/vfeedback.xml.h:7 ../hacks/config/xanalogtv.xml.h:8
msgid "Brightness Knob"
msgstr ""
-#: ../hacks/config/apple2.xml.h:15 ../hacks/config/m6502.xml.h:12
-#: ../hacks/config/pong.xml.h:13 ../hacks/config/xanalogtv.xml.h:8
+#: ../hacks/config/apple2.xml.h:15 ../hacks/config/filmleader.xml.h:8
+#: ../hacks/config/m6502.xml.h:15 ../hacks/config/pong.xml.h:13
+#: ../hacks/config/vfeedback.xml.h:8 ../hacks/config/xanalogtv.xml.h:9
msgid "Contrast Knob"
msgstr ""
@@ -2066,7 +2229,7 @@ msgid ""
"and displays them within the limitations of the Apple ][ display hardware. "
"(Six available colors in hi-res mode!) On MacOS and Linux, this program is "
"also a fully-functional VT100 emulator! Run it as an application instead of "
-"as a screen saver and you can use it as a terminal. http://en.wikipedia.org/"
+"as a screen saver and you can use it as a terminal. https://en.wikipedia.org/"
"wiki/Apple_II_series Written by Trevor Blackwell and Jamie Zawinski; 2003."
msgstr ""
@@ -2076,7 +2239,7 @@ msgstr ""
#: ../hacks/config/atlantis.xml.h:6
msgid "Whale speed"
-msgstr ""
+msgstr "泳ぐ早さ"
#: ../hacks/config/atlantis.xml.h:8
msgid "Shy"
@@ -2101,7 +2264,7 @@ msgstr ""
#: ../hacks/config/atlantis.xml.h:12
msgid "Number of sharks"
-msgstr ""
+msgstr "鯨たちの数"
#: ../hacks/config/atlantis.xml.h:13 ../hacks/config/companioncube.xml.h:10
#: ../hacks/config/deluxe.xml.h:10 ../hacks/config/demon.xml.h:7
@@ -2129,34 +2292,41 @@ msgstr ""
#. #### -mipmap
#: ../hacks/config/atlantis.xml.h:18 ../hacks/config/atunnel.xml.h:7
-#: ../hacks/config/blinkbox.xml.h:11 ../hacks/config/blocktube.xml.h:10
-#: ../hacks/config/boing.xml.h:13 ../hacks/config/bouncingcow.xml.h:11
-#: ../hacks/config/boxed.xml.h:24 ../hacks/config/cage.xml.h:5
-#: ../hacks/config/cityflow.xml.h:16 ../hacks/config/companioncube.xml.h:13
-#: ../hacks/config/crackberg.xml.h:17 ../hacks/config/cube21.xml.h:25
-#: ../hacks/config/cubenetic.xml.h:25 ../hacks/config/cubestorm.xml.h:16
-#: ../hacks/config/dangerball.xml.h:13 ../hacks/config/dnalogo.xml.h:8
-#: ../hacks/config/extrusion.xml.h:16 ../hacks/config/flipflop.xml.h:13
-#: ../hacks/config/flyingtoasters.xml.h:13 ../hacks/config/gears.xml.h:13
-#: ../hacks/config/geodesic.xml.h:6 ../hacks/config/geodesicgears.xml.h:10
+#: ../hacks/config/beats.xml.h:15 ../hacks/config/blinkbox.xml.h:11
+#: ../hacks/config/blocktube.xml.h:10 ../hacks/config/boing.xml.h:13
+#: ../hacks/config/bouncingcow.xml.h:12 ../hacks/config/boxed.xml.h:24
+#: ../hacks/config/cage.xml.h:5 ../hacks/config/cityflow.xml.h:16
+#: ../hacks/config/companioncube.xml.h:13 ../hacks/config/covid19.xml.h:13
+#: ../hacks/config/crackberg.xml.h:17 ../hacks/config/crumbler.xml.h:14
+#: ../hacks/config/cube21.xml.h:25 ../hacks/config/cubenetic.xml.h:25
+#: ../hacks/config/cubestack.xml.h:15 ../hacks/config/cubestorm.xml.h:19
+#: ../hacks/config/cubetwist.xml.h:17 ../hacks/config/dangerball.xml.h:13
+#: ../hacks/config/discoball.xml.h:13 ../hacks/config/dnalogo.xml.h:8
+#: ../hacks/config/dymaxionmap.xml.h:15 ../hacks/config/extrusion.xml.h:16
+#: ../hacks/config/flipflop.xml.h:13 ../hacks/config/flyingtoasters.xml.h:14
+#: ../hacks/config/gears.xml.h:13 ../hacks/config/geodesic.xml.h:6
+#: ../hacks/config/geodesicgears.xml.h:10 ../hacks/config/gibson.xml.h:14
#: ../hacks/config/glcells.xml.h:33 ../hacks/config/glforestfire.xml.h:15
#: ../hacks/config/glhanoi.xml.h:15 ../hacks/config/glknots.xml.h:23
-#: ../hacks/config/glmatrix.xml.h:19 ../hacks/config/glplanet.xml.h:11
+#: ../hacks/config/glmatrix.xml.h:19 ../hacks/config/glplanet.xml.h:18
#: ../hacks/config/glschool.xml.h:13 ../hacks/config/glsnake.xml.h:17
-#: ../hacks/config/gltext.xml.h:18 ../hacks/config/hilbert.xml.h:21
+#: ../hacks/config/gltext.xml.h:18 ../hacks/config/handsy.xml.h:22
+#: ../hacks/config/headroom.xml.h:17 ../hacks/config/hexstrut.xml.h:16
+#: ../hacks/config/hilbert.xml.h:21 ../hacks/config/hydrostat.xml.h:28
#: ../hacks/config/hypertorus.xml.h:6 ../hacks/config/jigglypuff.xml.h:9
#: ../hacks/config/kaleidocycle.xml.h:20 ../hacks/config/lament.xml.h:6
#: ../hacks/config/lavalite.xml.h:15 ../hacks/config/menger.xml.h:19
#: ../hacks/config/mirrorblob.xml.h:26 ../hacks/config/moebiusgears.xml.h:13
-#: ../hacks/config/molecule.xml.h:11 ../hacks/config/pinion.xml.h:15
-#: ../hacks/config/pipes.xml.h:21 ../hacks/config/polyhedra.xml.h:166
-#: ../hacks/config/providence.xml.h:6 ../hacks/config/queens.xml.h:5
-#: ../hacks/config/rubikblocks.xml.h:19 ../hacks/config/sballs.xml.h:15
-#: ../hacks/config/sierpinski3d.xml.h:9 ../hacks/config/speedmine.xml.h:16
-#: ../hacks/config/spheremonics.xml.h:21 ../hacks/config/sproingies.xml.h:8
+#: ../hacks/config/molecule.xml.h:11 ../hacks/config/peepers.xml.h:16
+#: ../hacks/config/pinion.xml.h:15 ../hacks/config/pipes.xml.h:21
+#: ../hacks/config/polyhedra.xml.h:166 ../hacks/config/providence.xml.h:6
+#: ../hacks/config/queens.xml.h:5 ../hacks/config/rubikblocks.xml.h:19
+#: ../hacks/config/sballs.xml.h:15 ../hacks/config/sierpinski3d.xml.h:9
+#: ../hacks/config/speedmine.xml.h:16 ../hacks/config/spheremonics.xml.h:21
+#: ../hacks/config/splitflap.xml.h:24 ../hacks/config/sproingies.xml.h:8
#: ../hacks/config/stonerview.xml.h:5 ../hacks/config/superquadrics.xml.h:12
#: ../hacks/config/tangram.xml.h:14 ../hacks/config/topblock.xml.h:23
-#: ../hacks/config/tronbit.xml.h:10 ../hacks/config/unknownpleasures.xml.h:13
+#: ../hacks/config/tronbit.xml.h:10 ../hacks/config/unknownpleasures.xml.h:16
msgid "Wireframe"
msgstr ""
@@ -2175,8 +2345,8 @@ msgstr ""
#: ../hacks/config/attraction.xml.h:3 ../hacks/config/deluxe.xml.h:6
#: ../hacks/config/lmorph.xml.h:12 ../hacks/config/pedal.xml.h:6
-#: ../hacks/config/starfish.xml.h:12 ../hacks/config/surfaces.xml.h:23
-#: ../hacks/config/whirlygig.xml.h:3
+#: ../hacks/config/razzledazzle.xml.h:15 ../hacks/config/starfish.xml.h:12
+#: ../hacks/config/surfaces.xml.h:23 ../hacks/config/whirlygig.xml.h:3
msgid "Lines"
msgstr ""
@@ -2184,7 +2354,7 @@ msgstr ""
msgid "Tails"
msgstr ""
-#: ../hacks/config/attraction.xml.h:5
+#: ../hacks/config/attraction.xml.h:5 ../hacks/config/crumbler.xml.h:9
msgid "Polygons"
msgstr ""
@@ -2204,7 +2374,7 @@ msgstr ""
msgid "Ignore screen edges"
msgstr ""
-#: ../hacks/config/attraction.xml.h:10
+#: ../hacks/config/attraction.xml.h:10 ../hacks/config/metaballs.xml.h:11
msgid "Ball count"
msgstr ""
@@ -2220,10 +2390,11 @@ msgstr ""
#: ../hacks/config/attraction.xml.h:14 ../hacks/config/binaryring.xml.h:5
#: ../hacks/config/blocktube.xml.h:5 ../hacks/config/braid.xml.h:5
#: ../hacks/config/celtic.xml.h:5 ../hacks/config/cube21.xml.h:21
-#: ../hacks/config/cynosure.xml.h:8 ../hacks/config/drift.xml.h:5
-#: ../hacks/config/eruption.xml.h:19 ../hacks/config/euler2d.xml.h:13
-#: ../hacks/config/fiberlamp.xml.h:8 ../hacks/config/flow.xml.h:13
-#: ../hacks/config/galaxy.xml.h:6 ../hacks/config/glcells.xml.h:5
+#: ../hacks/config/cubestorm.xml.h:11 ../hacks/config/cynosure.xml.h:8
+#: ../hacks/config/drift.xml.h:5 ../hacks/config/eruption.xml.h:19
+#: ../hacks/config/euler2d.xml.h:13 ../hacks/config/fiberlamp.xml.h:8
+#: ../hacks/config/flow.xml.h:13 ../hacks/config/galaxy.xml.h:6
+#: ../hacks/config/glcells.xml.h:5 ../hacks/config/hydrostat.xml.h:19
#: ../hacks/config/juggle.xml.h:8 ../hacks/config/juggler3d.xml.h:8
#: ../hacks/config/laser.xml.h:6 ../hacks/config/menger.xml.h:5
#: ../hacks/config/metaballs.xml.h:5 ../hacks/config/mismunch.xml.h:5
@@ -2254,25 +2425,26 @@ msgstr ""
#: ../hacks/config/attraction.xml.h:16 ../hacks/config/binaryring.xml.h:7
#: ../hacks/config/blocktube.xml.h:7 ../hacks/config/braid.xml.h:7
#: ../hacks/config/celtic.xml.h:7 ../hacks/config/cube21.xml.h:23
-#: ../hacks/config/cynosure.xml.h:10 ../hacks/config/drift.xml.h:7
-#: ../hacks/config/eruption.xml.h:21 ../hacks/config/euler2d.xml.h:20
-#: ../hacks/config/fiberlamp.xml.h:10 ../hacks/config/flow.xml.h:15
-#: ../hacks/config/fontglide.xml.h:10 ../hacks/config/galaxy.xml.h:8
-#: ../hacks/config/glcells.xml.h:7 ../hacks/config/juggle.xml.h:10
+#: ../hacks/config/cubestorm.xml.h:13 ../hacks/config/cynosure.xml.h:10
+#: ../hacks/config/drift.xml.h:7 ../hacks/config/eruption.xml.h:21
+#: ../hacks/config/euler2d.xml.h:20 ../hacks/config/fiberlamp.xml.h:10
+#: ../hacks/config/flow.xml.h:15 ../hacks/config/fontglide.xml.h:10
+#: ../hacks/config/galaxy.xml.h:8 ../hacks/config/glcells.xml.h:7
+#: ../hacks/config/hydrostat.xml.h:21 ../hacks/config/juggle.xml.h:10
#: ../hacks/config/juggler3d.xml.h:10 ../hacks/config/laser.xml.h:8
#: ../hacks/config/menger.xml.h:7 ../hacks/config/metaballs.xml.h:7
#: ../hacks/config/mismunch.xml.h:7 ../hacks/config/munch.xml.h:7
#: ../hacks/config/nerverot.xml.h:7 ../hacks/config/petri.xml.h:24
#: ../hacks/config/photopile.xml.h:20 ../hacks/config/pipes.xml.h:10
-#: ../hacks/config/polyominoes.xml.h:8 ../hacks/config/rotor.xml.h:7
-#: ../hacks/config/rubikblocks.xml.h:17 ../hacks/config/shadebobs.xml.h:15
-#: ../hacks/config/sierpinski3d.xml.h:7 ../hacks/config/skytentacles.xml.h:7
-#: ../hacks/config/slidescreen.xml.h:7 ../hacks/config/sonar.xml.h:26
-#: ../hacks/config/spheremonics.xml.h:7 ../hacks/config/substrate.xml.h:7
-#: ../hacks/config/superquadrics.xml.h:11 ../hacks/config/surfaces.xml.h:7
-#: ../hacks/config/tangram.xml.h:7 ../hacks/config/vermiculate.xml.h:4
-#: ../hacks/config/wander.xml.h:8 ../hacks/config/whirlwindwarp.xml.h:7
-#: ../hacks/config/xlyap.xml.h:7
+#: ../hacks/config/polyominoes.xml.h:8 ../hacks/config/raverhoop.xml.h:17
+#: ../hacks/config/rotor.xml.h:7 ../hacks/config/rubikblocks.xml.h:17
+#: ../hacks/config/shadebobs.xml.h:15 ../hacks/config/sierpinski3d.xml.h:7
+#: ../hacks/config/skytentacles.xml.h:7 ../hacks/config/slidescreen.xml.h:7
+#: ../hacks/config/sonar.xml.h:26 ../hacks/config/spheremonics.xml.h:7
+#: ../hacks/config/substrate.xml.h:7 ../hacks/config/superquadrics.xml.h:11
+#: ../hacks/config/surfaces.xml.h:7 ../hacks/config/tangram.xml.h:7
+#: ../hacks/config/vermiculate.xml.h:4 ../hacks/config/wander.xml.h:8
+#: ../hacks/config/whirlwindwarp.xml.h:7 ../hacks/config/xlyap.xml.h:7
msgid "Long"
msgstr ""
@@ -2313,8 +2485,9 @@ msgid "Atunnel"
msgstr ""
#: ../hacks/config/atunnel.xml.h:5 ../hacks/config/blocktube.xml.h:9
-#: ../hacks/config/cubenetic.xml.h:24 ../hacks/config/glmatrix.xml.h:18
-#: ../hacks/config/lament.xml.h:5 ../hacks/config/sballs.xml.h:14
+#: ../hacks/config/cubenetic.xml.h:24 ../hacks/config/gibson.xml.h:13
+#: ../hacks/config/glmatrix.xml.h:18 ../hacks/config/lament.xml.h:5
+#: ../hacks/config/sballs.xml.h:14
msgid "Textured"
msgstr ""
@@ -2352,13 +2525,58 @@ msgstr ""
#: ../hacks/config/barcode.xml.h:10
msgid ""
"Colorful scrolling barcodes. CONSUME! The barcodes follow the UPC-A, UPC-E, "
-"EAN-8 or EAN-13 standards. http://en.wikipedia.org/wiki/"
-"Universal_Product_Code http://en.wikipedia.org/wiki/European_Article_Number "
+"EAN-8 or EAN-13 standards. https://en.wikipedia.org/wiki/"
+"Universal_Product_Code https://en.wikipedia.org/wiki/European_Article_Number "
"Written by Dan Bornstein and Jamie Zawinski; 2003."
msgstr ""
+#: ../hacks/config/beats.xml.h:1
+msgid "Beats"
+msgstr ""
+
+#: ../hacks/config/beats.xml.h:6 ../hacks/config/boxed.xml.h:9
+#: ../hacks/config/fluidballs.xml.h:6
+msgid "Number of balls"
+msgstr ""
+
+#: ../hacks/config/beats.xml.h:8
+#, fuzzy
+msgid "Random cycle style"
+msgstr "ランダムなスクリーンセーバー"
+
+#: ../hacks/config/beats.xml.h:9
+msgid "Clockwise cycle"
+msgstr ""
+
+#: ../hacks/config/beats.xml.h:10
+msgid "Rain dance cycle"
+msgstr ""
+
+#: ../hacks/config/beats.xml.h:11
+msgid "Metronome cycle"
+msgstr ""
+
+#: ../hacks/config/beats.xml.h:12
+msgid "Galaxy cycle"
+msgstr ""
+
+#: ../hacks/config/beats.xml.h:13
+msgid "Tick"
+msgstr ""
+
+#: ../hacks/config/beats.xml.h:14
+msgid "Motion Blur"
+msgstr ""
+
+#: ../hacks/config/beats.xml.h:17
+msgid ""
+"Draws figures that move around at a slightly different rate from each other, "
+"creating interesting chaotic and ordered patterns. Written by David Eccles; "
+"2020."
+msgstr ""
+
#: ../hacks/config/binaryring.xml.h:1
-msgid "BinaryRing"
+msgid "Binary Ring"
msgstr ""
#: ../hacks/config/binaryring.xml.h:3
@@ -2376,9 +2594,10 @@ msgstr ""
#: ../hacks/config/binaryring.xml.h:10 ../hacks/config/boxed.xml.h:10
#: ../hacks/config/circuit.xml.h:7 ../hacks/config/glschool.xml.h:7
-#: ../hacks/config/julia.xml.h:7 ../hacks/config/mountain.xml.h:7
-#: ../hacks/config/pipes.xml.h:13 ../hacks/config/sproingies.xml.h:6
-#: ../hacks/config/substrate.xml.h:10 ../hacks/config/winduprobot.xml.h:10
+#: ../hacks/config/gravitywell.xml.h:14 ../hacks/config/julia.xml.h:7
+#: ../hacks/config/mountain.xml.h:7 ../hacks/config/pipes.xml.h:13
+#: ../hacks/config/sproingies.xml.h:6 ../hacks/config/substrate.xml.h:10
+#: ../hacks/config/vigilance.xml.h:10 ../hacks/config/winduprobot.xml.h:10
#: ../hacks/config/wormhole.xml.h:10
msgid "Lots"
msgstr ""
@@ -2407,7 +2626,8 @@ msgstr ""
msgid "Lasers"
msgstr ""
-#: ../hacks/config/blaster.xml.h:8 ../hacks/config/glplanet.xml.h:10
+#: ../hacks/config/blaster.xml.h:8 ../hacks/config/dymaxionmap.xml.h:11
+#: ../hacks/config/glplanet.xml.h:14
msgid "Stars"
msgstr ""
@@ -2418,7 +2638,7 @@ msgid ""
msgstr ""
#: ../hacks/config/blinkbox.xml.h:1
-msgid "BlinkBox"
+msgid "Blink Box"
msgstr ""
#: ../hacks/config/blinkbox.xml.h:6
@@ -2429,7 +2649,7 @@ msgstr ""
msgid "Fade"
msgstr ""
-#: ../hacks/config/blinkbox.xml.h:9
+#: ../hacks/config/blinkbox.xml.h:9 ../hacks/config/strange.xml.h:18
msgid "Motion blur"
msgstr ""
@@ -2444,7 +2664,7 @@ msgid ""
msgstr ""
#: ../hacks/config/blitspin.xml.h:1
-msgid "BlitSpin"
+msgid "Blit Spin"
msgstr ""
#: ../hacks/config/blitspin.xml.h:3
@@ -2466,8 +2686,9 @@ msgid ""
msgstr ""
#: ../hacks/config/blocktube.xml.h:1
-msgid "BlockTube"
-msgstr ""
+#, fuzzy
+msgid "Block Tube"
+msgstr "時計を表示する"
#: ../hacks/config/blocktube.xml.h:6
#, fuzzy
@@ -2495,10 +2716,11 @@ msgstr ""
msgid "Tiny"
msgstr ""
-#: ../hacks/config/boing.xml.h:3 ../hacks/config/lisa.xml.h:11
-#: ../hacks/config/lissie.xml.h:14 ../hacks/config/loop.xml.h:11
-#: ../hacks/config/rotor.xml.h:12 ../hacks/config/rubik.xml.h:9
-#: ../hacks/config/wander.xml.h:12 ../hacks/config/worm.xml.h:9
+#: ../hacks/config/boing.xml.h:3 ../hacks/config/discoball.xml.h:9
+#: ../hacks/config/lisa.xml.h:11 ../hacks/config/lissie.xml.h:14
+#: ../hacks/config/loop.xml.h:11 ../hacks/config/rotor.xml.h:12
+#: ../hacks/config/rubik.xml.h:9 ../hacks/config/wander.xml.h:12
+#: ../hacks/config/worm.xml.h:9
msgid "Size"
msgstr ""
@@ -2531,7 +2753,7 @@ msgid ""
"Dale Luck and RJ Mical during a break at the 1984 Consumer Electronics Show "
"(or so the legend goes.) This looks like the original Amiga demo if you turn "
"off \"smoothing\" and \"lighting\" and turn on \"scanlines\", and is "
-"somewhat more modern otherwise. http://en.wikipedia.org/wiki/"
+"somewhat more modern otherwise. https://en.wikipedia.org/wiki/"
"Amiga#Boing_Ball Written by Jamie Zawinski; 2005."
msgstr ""
@@ -2554,7 +2776,7 @@ msgid ""
msgstr ""
#: ../hacks/config/bouncingcow.xml.h:1
-msgid "BouncingCow"
+msgid "Bouncing Cow"
msgstr ""
#: ../hacks/config/bouncingcow.xml.h:6
@@ -2574,7 +2796,11 @@ msgstr ""
msgid "Herd"
msgstr ""
-#: ../hacks/config/bouncingcow.xml.h:13
+#: ../hacks/config/bouncingcow.xml.h:11
+msgid "Mathematically ideal cows (spherical, frictionless)"
+msgstr ""
+
+#: ../hacks/config/bouncingcow.xml.h:14
msgid ""
"A Cow. A Trampoline. Together, they fight crime. Written by Jamie Zawinski; "
"2003."
@@ -2584,10 +2810,6 @@ msgstr ""
msgid "Boxed"
msgstr ""
-#: ../hacks/config/boxed.xml.h:9 ../hacks/config/fluidballs.xml.h:6
-msgid "Number of balls"
-msgstr ""
-
#: ../hacks/config/boxed.xml.h:12 ../hacks/config/fluidballs.xml.h:9
msgid "Ball size"
msgstr ""
@@ -2630,7 +2852,7 @@ msgid ""
msgstr ""
#: ../hacks/config/boxfit.xml.h:1
-msgid "BoxFit"
+msgid "Box Fit"
msgstr ""
#: ../hacks/config/boxfit.xml.h:5 ../hacks/config/cityflow.xml.h:6
@@ -2706,71 +2928,71 @@ msgid "BSOD"
msgstr ""
#: ../hacks/config/bsod.xml.h:2 ../hacks/config/carousel.xml.h:8
-#: ../hacks/config/geodesicgears.xml.h:5 ../hacks/config/m6502.xml.h:2
+#: ../hacks/config/geodesicgears.xml.h:5 ../hacks/config/m6502.xml.h:4
#: ../hacks/config/molecule.xml.h:5
msgid "5 seconds"
msgstr "5秒間"
#: ../hacks/config/bsod.xml.h:4 ../hacks/config/geodesicgears.xml.h:7
-#: ../hacks/config/m6502.xml.h:4 ../hacks/config/molecule.xml.h:7
+#: ../hacks/config/m6502.xml.h:6 ../hacks/config/molecule.xml.h:7
#: ../hacks/config/vidwhacker.xml.h:4
msgid "2 minutes"
msgstr "2分間"
-#: ../hacks/config/bsod.xml.h:6
+#: ../hacks/config/bsod.xml.h:5
msgid "Windows 3.1"
msgstr ""
-#: ../hacks/config/bsod.xml.h:7
+#: ../hacks/config/bsod.xml.h:6
msgid "Windows NT"
msgstr ""
-#: ../hacks/config/bsod.xml.h:8
+#: ../hacks/config/bsod.xml.h:7
msgid "Windows 2000 "
msgstr ""
+#: ../hacks/config/bsod.xml.h:8
+msgid "Windows 10 "
+msgstr ""
+
#: ../hacks/config/bsod.xml.h:9
msgid "MS-DOS"
msgstr ""
#: ../hacks/config/bsod.xml.h:10
-msgid "AmigaDOS"
+msgid "GLaDOS"
msgstr ""
#: ../hacks/config/bsod.xml.h:11
-msgid "GLaDOS"
+msgid "AmigaDOS"
msgstr ""
#: ../hacks/config/bsod.xml.h:12
msgid "Android"
msgstr ""
-#: ../hacks/config/bsod.xml.h:13
-msgid "Apple ]["
-msgstr ""
-
#: ../hacks/config/bsod.xml.h:14
-msgid "NVidia"
+msgid "Ransomware"
msgstr ""
#: ../hacks/config/bsod.xml.h:15
-msgid "OS/2"
+msgid "NVidia"
msgstr ""
#: ../hacks/config/bsod.xml.h:16
-msgid "Sad Mac"
+msgid "OS/2"
msgstr ""
#: ../hacks/config/bsod.xml.h:17
-msgid "Mac bomb"
+msgid "Sad Mac"
msgstr ""
#: ../hacks/config/bsod.xml.h:18
-msgid "MacsBug"
+msgid "Mac bomb"
msgstr ""
#: ../hacks/config/bsod.xml.h:19
-msgid "Atari"
+msgid "MacsBug"
msgstr ""
#: ../hacks/config/bsod.xml.h:20
@@ -2778,102 +3000,151 @@ msgid "MacOS X"
msgstr ""
#: ../hacks/config/bsod.xml.h:21
-msgid "OS/390"
+msgid "VMware"
msgstr ""
#: ../hacks/config/bsod.xml.h:22
-msgid "VMS"
+msgid "Atari"
msgstr ""
#: ../hacks/config/bsod.xml.h:23
-msgid "HVX/GCOS6"
+msgid "OS/390"
msgstr ""
#: ../hacks/config/bsod.xml.h:24
-msgid "NCD X Terminal "
+msgid "HVX/GCOS"
msgstr ""
#: ../hacks/config/bsod.xml.h:25
-msgid "ATM"
+msgid "Encom"
msgstr ""
#: ../hacks/config/bsod.xml.h:26
-msgid "BSD"
+msgid "NCD XTerm"
msgstr ""
#: ../hacks/config/bsod.xml.h:27
-msgid "Linux (fsck)"
+msgid "ATM"
msgstr ""
#: ../hacks/config/bsod.xml.h:28
-msgid "Linux (sparc)"
+msgid "DVD"
msgstr ""
#: ../hacks/config/bsod.xml.h:29
-msgid "Linux (hppa)"
+msgid "Nintendo"
msgstr ""
#: ../hacks/config/bsod.xml.h:30
-msgid "Solaris"
+msgid "Tivo"
msgstr ""
#: ../hacks/config/bsod.xml.h:31
-msgid "SCO"
+msgid "VMS"
msgstr ""
#: ../hacks/config/bsod.xml.h:32
-msgid "HPUX"
+msgid "BSD"
msgstr ""
#: ../hacks/config/bsod.xml.h:33
+msgid "Linux (fsck)"
+msgstr ""
+
+#: ../hacks/config/bsod.xml.h:34
+msgid "Linux (sparc)"
+msgstr ""
+
+#: ../hacks/config/bsod.xml.h:35
+msgid "Linux (hppa)"
+msgstr ""
+
+#: ../hacks/config/bsod.xml.h:36
+msgid "Solaris"
+msgstr ""
+
+#: ../hacks/config/bsod.xml.h:37
+msgid "SCO"
+msgstr ""
+
+#: ../hacks/config/bsod.xml.h:38
+msgid "HPUX"
+msgstr ""
+
+#: ../hacks/config/bsod.xml.h:39
msgid "Tru64"
msgstr ""
+#: ../hacks/config/bsod.xml.h:40
+msgid "GNOME"
+msgstr ""
+
#.
#. <hgroup>
#. <vgroup>
#. <number id="tvcolor" type="slider" arg="-tv-color %"
#. _label="Color Knob" _low-label="Low" _high-label="High"
-#. low="0" high="1000" default="70"/>
+#. low="0" high="400" default="70"/>
#. <number id="tvtint" type="slider" arg="-tv-tint %"
#. _label="Tint Knob" _low-label="Low" _high-label="High"
-#. low="0" high="100" default="5"/>
+#. low="0" high="360" default="5"/>
#. </vgroup>
#. <vgroup>
#. <number id="tvbrightness" type="slider" arg="-tv-brightness %"
#. _label="Brightness Knob" _low-label="Low" _high-label="High"
-#. low="0" high="200" default="150"/>
+#. low="-75.0" high="100.0" default="3.0"/>
#. <number id="tvcontrast" type="slider" arg="-tv-contrast %"
#. _label="Contrast Knob" _low-label="Low" _high-label="High"
-#. low="0" high="1500" default="1000"/>
+#. low="0" high="500" default="150"/>
#. </vgroup>
#. </hgroup>
#.
-#: ../hacks/config/bsod.xml.h:55
+#: ../hacks/config/bsod.xml.h:62
#, no-c-format
msgid ""
"BSOD stands for \"Blue Screen of Death\". The finest in personal computer "
"emulation, BSOD simulates popular screen savers from a number of less robust "
-"operating systems. http://en.wikipedia.org/wiki/Blue_Screen_of_Death http://"
-"en.wikipedia.org/wiki/Screen_of_death http://en.wikipedia.org/wiki/"
-"Guru_Meditation http://en.wikipedia.org/wiki/Row_of_Bombs http://en."
+"operating systems. https://en.wikipedia.org/wiki/Blue_Screen_of_Death "
+"https://en.wikipedia.org/wiki/Screen_of_death https://en.wikipedia.org/wiki/"
+"Guru_Meditation https://en.wikipedia.org/wiki/Row_of_Bombs https://en."
"wikipedia.org/wiki/Bomb_%28symbol%29 Written by Jamie Zawinski; 1998."
msgstr ""
#: ../hacks/config/bubble3d.xml.h:1
-msgid "Bubble3D"
-msgstr ""
+#, fuzzy
+msgid "Bubble 3D"
+msgstr "DirectColor"
#: ../hacks/config/bubble3d.xml.h:5
msgid "Transparent bubbles"
msgstr ""
-#: ../hacks/config/bubble3d.xml.h:6
-#, fuzzy
-msgid "Bubble color"
-msgstr "DirectColor"
+#: ../hacks/config/bubble3d.xml.h:6 ../hacks/config/flurry.xml.h:10
+#: ../hacks/config/rotzoomer.xml.h:9 ../hacks/config/sballs.xml.h:5
+#: ../hacks/config/starfish.xml.h:2
+msgid "Random"
+msgstr ""
+
+#. DarkOrange is probably the closest named color.
+#: ../hacks/config/bubble3d.xml.h:7 ../hacks/config/phosphor.xml.h:11
+msgid "Amber"
+msgstr ""
+
+#: ../hacks/config/bubble3d.xml.h:8 ../hacks/config/fuzzyflakes.xml.h:16
+#: ../hacks/config/phosphor.xml.h:9
+msgid "Green"
+msgstr ""
+
+#: ../hacks/config/bubble3d.xml.h:9 ../hacks/config/fuzzyflakes.xml.h:18
+msgid "Blue"
+msgstr ""
-#: ../hacks/config/bubble3d.xml.h:8
+#: ../hacks/config/bubble3d.xml.h:10 ../hacks/config/cube21.xml.h:13
+#: ../hacks/config/phosphor.xml.h:12
+msgid "White"
+msgstr ""
+
+#: ../hacks/config/bubble3d.xml.h:12
msgid ""
"Rising, undulating 3D bubbles, with transparency and specular reflections. "
"Written by Richard Jones; 1998."
@@ -2935,8 +3206,8 @@ msgstr ""
#: ../hacks/config/cage.xml.h:7
msgid ""
-"Escher's \"Impossible Cage\", a 3d analog of a moebius strip, and rotates it "
-"in three dimensions. http://en.wikipedia.org/wiki/Maurits_Cornelis_Escher "
+"Escher's \"Impossible Cage\", a 3d analog of a möbius strip, and rotates it "
+"in three dimensions. https://en.wikipedia.org/wiki/Maurits_Cornelis_Escher "
"Written by Marcelo Vianna; 1998."
msgstr ""
@@ -2945,15 +3216,17 @@ msgid "Carousel"
msgstr ""
#: ../hacks/config/carousel.xml.h:6 ../hacks/config/ccurve.xml.h:6
-#: ../hacks/config/geodesic.xml.h:15 ../hacks/config/photopile.xml.h:13
-#: ../hacks/config/tronbit.xml.h:6
+#: ../hacks/config/cubestack.xml.h:6 ../hacks/config/cubetwist.xml.h:6
+#: ../hacks/config/dymaxionmap.xml.h:6 ../hacks/config/geodesic.xml.h:15
+#: ../hacks/config/hydrostat.xml.h:6 ../hacks/config/photopile.xml.h:13
+#: ../hacks/config/tronbit.xml.h:6 ../hacks/config/unicrud.xml.h:6
msgid "Animation speed"
-msgstr ""
+msgstr "アニメーション速度"
#: ../hacks/config/carousel.xml.h:9 ../hacks/config/glslideshow.xml.h:6
#: ../hacks/config/mirrorblob.xml.h:9 ../hacks/config/photopile.xml.h:19
msgid "Time until loading a new image"
-msgstr ""
+msgstr "新しい画像を読み込むまでの時間"
#: ../hacks/config/carousel.xml.h:10 ../hacks/config/coral.xml.h:7
#: ../hacks/config/deco.xml.h:4 ../hacks/config/helix.xml.h:7
@@ -2964,7 +3237,7 @@ msgstr "1分間"
#: ../hacks/config/carousel.xml.h:11 ../hacks/config/photopile.xml.h:8
msgid "Number of images"
-msgstr ""
+msgstr "画像の数"
#: ../hacks/config/carousel.xml.h:12
msgid "Tilt in/out and left/right"
@@ -2984,12 +3257,12 @@ msgstr ""
#: ../hacks/config/carousel.xml.h:16
msgid "Zoom in/out"
-msgstr ""
+msgstr "ズームイン・アウトする"
-#: ../hacks/config/carousel.xml.h:17 ../hacks/config/glslideshow.xml.h:19
-#: ../hacks/config/photopile.xml.h:21
+#: ../hacks/config/carousel.xml.h:17 ../hacks/config/esper.xml.h:8
+#: ../hacks/config/glslideshow.xml.h:19 ../hacks/config/photopile.xml.h:21
msgid "Show file names"
-msgstr ""
+msgstr "ファイル名を表示する"
#: ../hacks/config/carousel.xml.h:19
msgid ""
@@ -3000,7 +3273,7 @@ msgid ""
msgstr ""
#: ../hacks/config/ccurve.xml.h:1
-msgid "CCurve"
+msgid "C Curve"
msgstr ""
#: ../hacks/config/ccurve.xml.h:3
@@ -3016,15 +3289,16 @@ msgstr "30秒間"
#: ../hacks/config/ccurve.xml.h:9 ../hacks/config/coral.xml.h:9
#: ../hacks/config/imsmap.xml.h:9 ../hacks/config/kumppa.xml.h:5
#: ../hacks/config/qix.xml.h:9 ../hacks/config/quasicrystal.xml.h:8
-#: ../hacks/config/squiral.xml.h:11 ../hacks/config/superquadrics.xml.h:8
-#: ../hacks/config/wander.xml.h:5 ../hacks/config/xmatrix.xml.h:19
+#: ../hacks/config/razzledazzle.xml.h:12 ../hacks/config/squiral.xml.h:11
+#: ../hacks/config/superquadrics.xml.h:8 ../hacks/config/wander.xml.h:5
+#: ../hacks/config/xmatrix.xml.h:19
msgid "Density"
msgstr ""
#: ../hacks/config/ccurve.xml.h:12
msgid ""
"Generates self-similar linear fractals, including the classic \"C Curve\". "
-"http://en.wikipedia.org/wiki/Levy_C_curve Written by Rick Campbell; 1999."
+"https://en.wikipedia.org/wiki/Levy_C_curve Written by Rick Campbell; 1999."
msgstr ""
#: ../hacks/config/celtic.xml.h:1
@@ -3037,8 +3311,8 @@ msgstr ""
#: ../hacks/config/celtic.xml.h:10
msgid ""
-"Repeatedly draws random Celtic cross-stitch patterns. http://en.wikipedia."
-"org/wiki/Celtic_knot http://en.wikipedia.org/wiki/Knots_and_graphs Written "
+"Repeatedly draws random Celtic cross-stitch patterns. https://en.wikipedia."
+"org/wiki/Celtic_knot https://en.wikipedia.org/wiki/Knots_and_graphs Written "
"by Max Froumentin; 2005."
msgstr ""
@@ -3046,10 +3320,12 @@ msgstr ""
msgid "Circuit"
msgstr ""
-#: ../hacks/config/circuit.xml.h:5 ../hacks/config/mismunch.xml.h:8
+#: ../hacks/config/circuit.xml.h:5 ../hacks/config/gravitywell.xml.h:12
+#: ../hacks/config/hydrostat.xml.h:8 ../hacks/config/mismunch.xml.h:8
#: ../hacks/config/mountain.xml.h:5 ../hacks/config/munch.xml.h:8
#: ../hacks/config/pipes.xml.h:5 ../hacks/config/shadebobs.xml.h:11
-#: ../hacks/config/sproingies.xml.h:5 ../hacks/config/winduprobot.xml.h:8
+#: ../hacks/config/sproingies.xml.h:5 ../hacks/config/vigilance.xml.h:8
+#: ../hacks/config/winduprobot.xml.h:8
msgid "One"
msgstr ""
@@ -3063,13 +3339,18 @@ msgid "Rotation speed"
msgstr ""
#: ../hacks/config/circuit.xml.h:11 ../hacks/config/companioncube.xml.h:11
-#: ../hacks/config/cube21.xml.h:19 ../hacks/config/cubestorm.xml.h:15
-#: ../hacks/config/dangerball.xml.h:12 ../hacks/config/engine.xml.h:18
-#: ../hacks/config/flipflop.xml.h:6 ../hacks/config/gears.xml.h:12
-#: ../hacks/config/geodesic.xml.h:9 ../hacks/config/geodesicgears.xml.h:12
+#: ../hacks/config/covid19.xml.h:12 ../hacks/config/crumbler.xml.h:13
+#: ../hacks/config/cube21.xml.h:19 ../hacks/config/cubestorm.xml.h:18
+#: ../hacks/config/cubetwist.xml.h:16 ../hacks/config/dangerball.xml.h:12
+#: ../hacks/config/discoball.xml.h:12 ../hacks/config/energystream.xml.h:6
+#: ../hacks/config/engine.xml.h:18 ../hacks/config/flipflop.xml.h:6
+#: ../hacks/config/gears.xml.h:12 ../hacks/config/geodesic.xml.h:9
+#: ../hacks/config/geodesicgears.xml.h:12 ../hacks/config/hexstrut.xml.h:15
#: ../hacks/config/hilbert.xml.h:19 ../hacks/config/moebiusgears.xml.h:11
-#: ../hacks/config/polyhedra.xml.h:164 ../hacks/config/rubikblocks.xml.h:13
+#: ../hacks/config/polyhedra.xml.h:164 ../hacks/config/raverhoop.xml.h:19
+#: ../hacks/config/rubikblocks.xml.h:13 ../hacks/config/splodesic.xml.h:10
#: ../hacks/config/surfaces.xml.h:26 ../hacks/config/tronbit.xml.h:8
+#: ../hacks/config/unicrud.xml.h:9
msgid "Spin"
msgstr ""
@@ -3086,7 +3367,7 @@ msgid "Electronic components float around. Written by Ben Buxton; 2001."
msgstr ""
#: ../hacks/config/cityflow.xml.h:1
-msgid "Cityflow"
+msgid "City Flow"
msgstr ""
#: ../hacks/config/cityflow.xml.h:8
@@ -3113,8 +3394,9 @@ msgid ""
msgstr ""
#: ../hacks/config/cloudlife.xml.h:1
-msgid "CloudLife"
-msgstr ""
+#, fuzzy
+msgid "Cloud Life"
+msgstr "コマンドライン:"
#: ../hacks/config/cloudlife.xml.h:5
msgid "Young"
@@ -3144,47 +3426,55 @@ msgid ""
"Generates cloud-like formations based on a variant of Conway's Life. The "
"difference is that cells have a maximum age, after which they count as 3 for "
"populating the next generation. This makes long-lived formations explode "
-"instead of just sitting there. http://en.wikipedia.org/wiki/Conway"
+"instead of just sitting there. https://en.wikipedia.org/wiki/Conway"
"%27s_Game_of_Life Written by Don Marti; 2003."
msgstr ""
#: ../hacks/config/companioncube.xml.h:1
-msgid "CompanionCube"
+msgid "Companion Cube"
msgstr ""
#: ../hacks/config/companioncube.xml.h:6 ../hacks/config/distort.xml.h:17
+#: ../hacks/config/peepers.xml.h:11
msgid "Bounce"
-msgstr ""
+msgstr "バウンドする早さ"
#: ../hacks/config/companioncube.xml.h:8 ../hacks/config/deluxe.xml.h:8
#: ../hacks/config/geodesic.xml.h:17 ../hacks/config/gflux.xml.h:11
#: ../hacks/config/glcells.xml.h:28 ../hacks/config/glhanoi.xml.h:9
#: ../hacks/config/glsnake.xml.h:5 ../hacks/config/hypnowheel.xml.h:9
#: ../hacks/config/lavalite.xml.h:8 ../hacks/config/lisa.xml.h:13
-#: ../hacks/config/lissie.xml.h:11 ../hacks/config/projectiveplane.xml.h:32
-#: ../hacks/config/skytentacles.xml.h:2
+#: ../hacks/config/lissie.xml.h:11 ../hacks/config/projectiveplane.xml.h:34
+#: ../hacks/config/raverhoop.xml.h:5 ../hacks/config/scooter.xml.h:11
+#: ../hacks/config/skytentacles.xml.h:2 ../hacks/config/strange.xml.h:9
msgid "1"
msgstr ""
#: ../hacks/config/companioncube.xml.h:9
-#, fuzzy
msgid "Number of cubes"
-msgstr "色の数"
+msgstr "キューブの数"
#. #### -no-optimize
-#: ../hacks/config/companioncube.xml.h:12 ../hacks/config/cube21.xml.h:20
-#: ../hacks/config/cubenetic.xml.h:8 ../hacks/config/cubestorm.xml.h:14
-#: ../hacks/config/dangerball.xml.h:11 ../hacks/config/engine.xml.h:17
-#: ../hacks/config/gears.xml.h:11 ../hacks/config/geodesic.xml.h:8
-#: ../hacks/config/geodesicgears.xml.h:11 ../hacks/config/glblur.xml.h:8
-#: ../hacks/config/glforestfire.xml.h:11 ../hacks/config/glknots.xml.h:22
-#: ../hacks/config/glplanet.xml.h:7 ../hacks/config/gltext.xml.h:9
+#: ../hacks/config/companioncube.xml.h:12 ../hacks/config/covid19.xml.h:11
+#: ../hacks/config/crumbler.xml.h:12 ../hacks/config/cube21.xml.h:20
+#: ../hacks/config/cubenetic.xml.h:8 ../hacks/config/cubestack.xml.h:14
+#: ../hacks/config/cubestorm.xml.h:17 ../hacks/config/cubetwist.xml.h:15
+#: ../hacks/config/dangerball.xml.h:11 ../hacks/config/discoball.xml.h:11
+#: ../hacks/config/dymaxionmap.xml.h:13 ../hacks/config/energystream.xml.h:5
+#: ../hacks/config/engine.xml.h:17 ../hacks/config/gears.xml.h:11
+#: ../hacks/config/geodesic.xml.h:8 ../hacks/config/geodesicgears.xml.h:11
+#: ../hacks/config/glblur.xml.h:8 ../hacks/config/glforestfire.xml.h:11
+#: ../hacks/config/glknots.xml.h:22 ../hacks/config/glplanet.xml.h:11
+#: ../hacks/config/gltext.xml.h:9 ../hacks/config/handsy.xml.h:11
+#: ../hacks/config/headroom.xml.h:16 ../hacks/config/hexstrut.xml.h:14
#: ../hacks/config/hilbert.xml.h:18 ../hacks/config/hypnowheel.xml.h:6
#: ../hacks/config/kaleidocycle.xml.h:19 ../hacks/config/lavalite.xml.h:14
#: ../hacks/config/menger.xml.h:10 ../hacks/config/moebiusgears.xml.h:10
#: ../hacks/config/molecule.xml.h:16 ../hacks/config/polyhedra.xml.h:165
-#: ../hacks/config/rubikblocks.xml.h:14 ../hacks/config/spheremonics.xml.h:9
-#: ../hacks/config/surfaces.xml.h:25 ../hacks/config/tronbit.xml.h:9
+#: ../hacks/config/raverhoop.xml.h:18 ../hacks/config/rubikblocks.xml.h:14
+#: ../hacks/config/spheremonics.xml.h:9 ../hacks/config/splitflap.xml.h:23
+#: ../hacks/config/splodesic.xml.h:9 ../hacks/config/surfaces.xml.h:25
+#: ../hacks/config/tronbit.xml.h:9 ../hacks/config/unicrud.xml.h:8
#: ../hacks/config/wander.xml.h:1
msgid "Wander"
msgstr ""
@@ -3197,7 +3487,7 @@ msgid ""
"Enrichment Center reminds you that the weighted companion cube will never "
"threaten to stab you and, in fact, cannot speak. In the event that the "
"Weighted Companion Cube does speak, the Enrichment Center urges you to "
-"disregard its advice. http://en.wikipedia.org/wiki/Portal_%28video_game%29 "
+"disregard its advice. https://en.wikipedia.org/wiki/Portal_%28video_game%29 "
"Written by Jamie Zawinski; 2011."
msgstr ""
@@ -3216,28 +3506,31 @@ msgid "Coral"
msgstr ""
#: ../hacks/config/coral.xml.h:5 ../hacks/config/deco.xml.h:2
-#: ../hacks/config/epicycle.xml.h:8 ../hacks/config/glslideshow.xml.h:13
-#: ../hacks/config/helix.xml.h:5 ../hacks/config/moire.xml.h:2
-#: ../hacks/config/pedal.xml.h:2 ../hacks/config/polyhedra.xml.h:8
-#: ../hacks/config/rorschach.xml.h:8 ../hacks/config/starfish.xml.h:8
-#: ../hacks/config/xspirograph.xml.h:5
+#: ../hacks/config/epicycle.xml.h:8 ../hacks/config/glitchpeg.xml.h:5
+#: ../hacks/config/glslideshow.xml.h:13 ../hacks/config/helix.xml.h:5
+#: ../hacks/config/moire.xml.h:2 ../hacks/config/pedal.xml.h:2
+#: ../hacks/config/polyhedra.xml.h:8 ../hacks/config/rorschach.xml.h:8
+#: ../hacks/config/starfish.xml.h:8 ../hacks/config/xspirograph.xml.h:5
msgid "1 second"
msgstr "1秒間"
#: ../hacks/config/coral.xml.h:8 ../hacks/config/fireworkx.xml.h:7
#: ../hacks/config/gflux.xml.h:8 ../hacks/config/glblur.xml.h:5
-#: ../hacks/config/glmatrix.xml.h:5 ../hacks/config/imsmap.xml.h:8
-#: ../hacks/config/lavalite.xml.h:5 ../hacks/config/pyro.xml.h:5
-#: ../hacks/config/qix.xml.h:8 ../hacks/config/squiral.xml.h:10
-#: ../hacks/config/xmatrix.xml.h:18
+#: ../hacks/config/glmatrix.xml.h:5 ../hacks/config/gravitywell.xml.h:11
+#: ../hacks/config/imsmap.xml.h:8 ../hacks/config/lavalite.xml.h:5
+#: ../hacks/config/pyro.xml.h:5 ../hacks/config/qix.xml.h:8
+#: ../hacks/config/raverhoop.xml.h:8 ../hacks/config/razzledazzle.xml.h:11
+#: ../hacks/config/squiral.xml.h:10 ../hacks/config/xmatrix.xml.h:18
msgid "Sparse"
msgstr ""
#: ../hacks/config/coral.xml.h:10 ../hacks/config/fireworkx.xml.h:5
#: ../hacks/config/gflux.xml.h:10 ../hacks/config/glblur.xml.h:7
-#: ../hacks/config/glmatrix.xml.h:7 ../hacks/config/imsmap.xml.h:10
-#: ../hacks/config/lavalite.xml.h:7 ../hacks/config/pyro.xml.h:7
-#: ../hacks/config/qix.xml.h:10 ../hacks/config/squiral.xml.h:12
+#: ../hacks/config/glmatrix.xml.h:7 ../hacks/config/gravitywell.xml.h:9
+#: ../hacks/config/imsmap.xml.h:10 ../hacks/config/lavalite.xml.h:7
+#: ../hacks/config/pyro.xml.h:7 ../hacks/config/qix.xml.h:10
+#: ../hacks/config/raverhoop.xml.h:10 ../hacks/config/razzledazzle.xml.h:13
+#: ../hacks/config/squiral.xml.h:12
msgid "Dense"
msgstr ""
@@ -3252,6 +3545,28 @@ msgid ""
"1997."
msgstr ""
+#: ../hacks/config/covid19.xml.h:1
+msgid "COVID19"
+msgstr ""
+
+#: ../hacks/config/covid19.xml.h:8
+msgid "Taiwan"
+msgstr ""
+
+#: ../hacks/config/covid19.xml.h:9
+msgid "Government Response"
+msgstr ""
+
+#: ../hacks/config/covid19.xml.h:10
+msgid "United States"
+msgstr ""
+
+#: ../hacks/config/covid19.xml.h:15
+msgid ""
+"SARS-CoV-2. Stay the fuck home. Wear a fucking mask. Written by Jamie "
+"Zawinski; 2020."
+msgstr ""
+
#: ../hacks/config/crackberg.xml.h:1
msgid "Crackberg"
msgstr ""
@@ -3276,7 +3591,7 @@ msgstr ""
msgid "Hurt me"
msgstr ""
-#: ../hacks/config/crackberg.xml.h:11
+#: ../hacks/config/crackberg.xml.h:11 ../hacks/config/cubetwist.xml.h:14
msgid "Flat shading"
msgstr ""
@@ -3296,8 +3611,10 @@ msgstr ""
msgid "Letterbox"
msgstr ""
-#: ../hacks/config/crackberg.xml.h:19 ../hacks/config/imsmap.xml.h:14
-#: ../hacks/config/klein.xml.h:18 ../hacks/config/projectiveplane.xml.h:10
+#: ../hacks/config/crackberg.xml.h:19 ../hacks/config/etruscanvenus.xml.h:21
+#: ../hacks/config/imsmap.xml.h:14 ../hacks/config/klein.xml.h:18
+#: ../hacks/config/projectiveplane.xml.h:10 ../hacks/config/romanboy.xml.h:22
+#: ../hacks/config/sphereeversion.xml.h:20
#, fuzzy
msgid "Random coloration"
msgstr "フェードする時間: "
@@ -3337,6 +3654,22 @@ msgid ""
"Written by Martin Pool; 1999."
msgstr ""
+#: ../hacks/config/crumbler.xml.h:1
+msgid "Crumbler"
+msgstr ""
+
+#: ../hacks/config/crumbler.xml.h:11
+msgid "Fractures"
+msgstr ""
+
+#: ../hacks/config/crumbler.xml.h:16
+msgid ""
+"Randomly subdivides a ball into voronoi chunks, then further subdivides one "
+"of the remaining pieces. https://en.wikipedia.org/wiki/Voronoi_diagram "
+"https://en.wikipedia.org/wiki/Convex_hull https://en.wikipedia.org/wiki/"
+"Quickhull Written by Jamie Zawinski; 2018."
+msgstr ""
+
#: ../hacks/config/crystal.xml.h:1
msgid "Crystal"
msgstr ""
@@ -3369,12 +3702,12 @@ msgstr ""
#: ../hacks/config/crystal.xml.h:16
msgid ""
"Moving polygons, similar to a kaleidoscope. See also the \"Kaleidescope\" "
-"and \"GLeidescope\" screen savers. http://en.wikipedia.org/wiki/Kaleidoscope "
-"Written by Jouk Jansen; 1998."
+"and \"GLeidescope\" screen savers. https://en.wikipedia.org/wiki/"
+"Kaleidoscope Written by Jouk Jansen; 1998."
msgstr ""
#: ../hacks/config/cube21.xml.h:1
-msgid "Cube21"
+msgid "Cube 21"
msgstr ""
#: ../hacks/config/cube21.xml.h:6 ../hacks/config/rubikblocks.xml.h:6
@@ -3395,10 +3728,6 @@ msgstr ""
msgid "Start as random shape"
msgstr ""
-#: ../hacks/config/cube21.xml.h:13 ../hacks/config/phosphor.xml.h:12
-msgid "White"
-msgstr ""
-
#: ../hacks/config/cube21.xml.h:14
msgid "Random color"
msgstr ""
@@ -3428,7 +3757,7 @@ msgstr ""
msgid ""
"The \"Cube 21\" Rubik-like puzzle, also known as \"Square-1\". The rotations "
"are chosen randomly. See also the \"Rubik\", \"RubikBlocks\" and \"GLSnake\" "
-"screen savers. http://en.wikipedia.org/wiki/Square_One_%28puzzle%29 Written "
+"screen savers. https://en.wikipedia.org/wiki/Square_One_%28puzzle%29 Written "
"by Vasek Potocek; 2005."
msgstr ""
@@ -3438,64 +3767,72 @@ msgstr ""
#: ../hacks/config/cubenetic.xml.h:9 ../hacks/config/glblur.xml.h:9
#: ../hacks/config/glknots.xml.h:8 ../hacks/config/gltext.xml.h:10
-#: ../hacks/config/kaleidocycle.xml.h:11 ../hacks/config/menger.xml.h:11
-#: ../hacks/config/molecule.xml.h:17 ../hacks/config/spheremonics.xml.h:10
+#: ../hacks/config/handsy.xml.h:12 ../hacks/config/kaleidocycle.xml.h:11
+#: ../hacks/config/menger.xml.h:11 ../hacks/config/molecule.xml.h:17
+#: ../hacks/config/spheremonics.xml.h:10 ../hacks/config/splitflap.xml.h:15
msgid "Don't rotate"
msgstr ""
#: ../hacks/config/cubenetic.xml.h:10 ../hacks/config/glblur.xml.h:10
#: ../hacks/config/glknots.xml.h:9 ../hacks/config/gltext.xml.h:11
-#: ../hacks/config/kaleidocycle.xml.h:12 ../hacks/config/lavalite.xml.h:23
-#: ../hacks/config/menger.xml.h:12 ../hacks/config/molecule.xml.h:18
-#: ../hacks/config/spheremonics.xml.h:11
+#: ../hacks/config/handsy.xml.h:13 ../hacks/config/kaleidocycle.xml.h:12
+#: ../hacks/config/lavalite.xml.h:23 ../hacks/config/menger.xml.h:12
+#: ../hacks/config/molecule.xml.h:18 ../hacks/config/spheremonics.xml.h:11
+#: ../hacks/config/splitflap.xml.h:16
msgid "Rotate around X axis"
msgstr ""
#: ../hacks/config/cubenetic.xml.h:11 ../hacks/config/glblur.xml.h:11
#: ../hacks/config/glknots.xml.h:10 ../hacks/config/gltext.xml.h:12
-#: ../hacks/config/kaleidocycle.xml.h:13 ../hacks/config/lavalite.xml.h:24
-#: ../hacks/config/menger.xml.h:13 ../hacks/config/molecule.xml.h:19
-#: ../hacks/config/spheremonics.xml.h:12
+#: ../hacks/config/handsy.xml.h:14 ../hacks/config/kaleidocycle.xml.h:13
+#: ../hacks/config/lavalite.xml.h:24 ../hacks/config/menger.xml.h:13
+#: ../hacks/config/molecule.xml.h:19 ../hacks/config/spheremonics.xml.h:12
+#: ../hacks/config/splitflap.xml.h:17
msgid "Rotate around Y axis"
msgstr ""
#: ../hacks/config/cubenetic.xml.h:12 ../hacks/config/glblur.xml.h:12
#: ../hacks/config/glknots.xml.h:11 ../hacks/config/gltext.xml.h:13
-#: ../hacks/config/kaleidocycle.xml.h:14 ../hacks/config/lavalite.xml.h:25
-#: ../hacks/config/menger.xml.h:14 ../hacks/config/molecule.xml.h:20
-#: ../hacks/config/spheremonics.xml.h:13
+#: ../hacks/config/handsy.xml.h:15 ../hacks/config/kaleidocycle.xml.h:14
+#: ../hacks/config/lavalite.xml.h:25 ../hacks/config/menger.xml.h:14
+#: ../hacks/config/molecule.xml.h:20 ../hacks/config/spheremonics.xml.h:13
+#: ../hacks/config/splitflap.xml.h:18
msgid "Rotate around Z axis"
msgstr ""
#: ../hacks/config/cubenetic.xml.h:13 ../hacks/config/glblur.xml.h:13
#: ../hacks/config/glknots.xml.h:12 ../hacks/config/gltext.xml.h:14
-#: ../hacks/config/kaleidocycle.xml.h:15 ../hacks/config/lavalite.xml.h:26
-#: ../hacks/config/menger.xml.h:15 ../hacks/config/molecule.xml.h:21
-#: ../hacks/config/spheremonics.xml.h:14
+#: ../hacks/config/handsy.xml.h:16 ../hacks/config/kaleidocycle.xml.h:15
+#: ../hacks/config/lavalite.xml.h:26 ../hacks/config/menger.xml.h:15
+#: ../hacks/config/molecule.xml.h:21 ../hacks/config/spheremonics.xml.h:14
+#: ../hacks/config/splitflap.xml.h:19
msgid "Rotate around X and Y axes"
msgstr ""
#: ../hacks/config/cubenetic.xml.h:14 ../hacks/config/glblur.xml.h:14
#: ../hacks/config/glknots.xml.h:13 ../hacks/config/gltext.xml.h:15
-#: ../hacks/config/kaleidocycle.xml.h:16 ../hacks/config/lavalite.xml.h:27
-#: ../hacks/config/menger.xml.h:16 ../hacks/config/molecule.xml.h:22
-#: ../hacks/config/spheremonics.xml.h:15
+#: ../hacks/config/handsy.xml.h:17 ../hacks/config/kaleidocycle.xml.h:16
+#: ../hacks/config/lavalite.xml.h:27 ../hacks/config/menger.xml.h:16
+#: ../hacks/config/molecule.xml.h:22 ../hacks/config/spheremonics.xml.h:15
+#: ../hacks/config/splitflap.xml.h:20
msgid "Rotate around X and Z axes"
msgstr ""
#: ../hacks/config/cubenetic.xml.h:15 ../hacks/config/glblur.xml.h:15
#: ../hacks/config/glknots.xml.h:14 ../hacks/config/gltext.xml.h:16
-#: ../hacks/config/kaleidocycle.xml.h:17 ../hacks/config/lavalite.xml.h:28
-#: ../hacks/config/menger.xml.h:17 ../hacks/config/molecule.xml.h:23
-#: ../hacks/config/spheremonics.xml.h:16
+#: ../hacks/config/handsy.xml.h:18 ../hacks/config/kaleidocycle.xml.h:17
+#: ../hacks/config/lavalite.xml.h:28 ../hacks/config/menger.xml.h:17
+#: ../hacks/config/molecule.xml.h:23 ../hacks/config/spheremonics.xml.h:16
+#: ../hacks/config/splitflap.xml.h:21
msgid "Rotate around Y and Z axes"
msgstr ""
#: ../hacks/config/cubenetic.xml.h:16 ../hacks/config/glblur.xml.h:16
#: ../hacks/config/glknots.xml.h:15 ../hacks/config/gltext.xml.h:17
-#: ../hacks/config/kaleidocycle.xml.h:18 ../hacks/config/lavalite.xml.h:29
-#: ../hacks/config/menger.xml.h:18 ../hacks/config/molecule.xml.h:24
-#: ../hacks/config/spheremonics.xml.h:17
+#: ../hacks/config/handsy.xml.h:19 ../hacks/config/kaleidocycle.xml.h:18
+#: ../hacks/config/lavalite.xml.h:29 ../hacks/config/menger.xml.h:18
+#: ../hacks/config/molecule.xml.h:24 ../hacks/config/spheremonics.xml.h:17
+#: ../hacks/config/splitflap.xml.h:22
msgid "Rotate around all three axes"
msgstr ""
@@ -3518,26 +3855,79 @@ msgid ""
"Zawinski; 2002."
msgstr ""
+#: ../hacks/config/cubestack.xml.h:1
+msgid "Cube Stack"
+msgstr ""
+
+#: ../hacks/config/cubestack.xml.h:11 ../hacks/config/hypertorus.xml.h:8
+#: ../hacks/config/qix.xml.h:21 ../hacks/config/webcollage.xml.h:8
+msgid "Transparent"
+msgstr "透明"
+
+#: ../hacks/config/cubestack.xml.h:12
+#, fuzzy
+msgid "Opacity"
+msgstr "フェードする時間: "
+
+#: ../hacks/config/cubestack.xml.h:13 ../hacks/config/mirrorblob.xml.h:19
+#: ../hacks/config/webcollage.xml.h:10
+msgid "Opaque"
+msgstr "不透明"
+
+#: ../hacks/config/cubestack.xml.h:17
+msgid ""
+"An endless stack of unfolding, translucent cubes. Written by Jamie Zawinski; "
+"2016."
+msgstr ""
+
#: ../hacks/config/cubestorm.xml.h:1
-msgid "CubeStorm"
+msgid "Cube Storm"
msgstr ""
#: ../hacks/config/cubestorm.xml.h:9
msgid "Cubes"
msgstr ""
-#: ../hacks/config/cubestorm.xml.h:12
+#: ../hacks/config/cubestorm.xml.h:12 ../hacks/config/rotor.xml.h:6
+#: ../hacks/config/skytentacles.xml.h:6 ../hacks/config/wander.xml.h:9
+msgid "Length"
+msgstr ""
+
+#: ../hacks/config/cubestorm.xml.h:15
msgid "Struts"
msgstr ""
-#: ../hacks/config/cubestorm.xml.h:18
+#: ../hacks/config/cubestorm.xml.h:21
msgid ""
"Boxes change shape and intersect each other, filling space. Written by Jamie "
"Zawinski; 2003."
msgstr ""
+#: ../hacks/config/cubetwist.xml.h:1
+msgid "Cube Twist"
+msgstr ""
+
+#: ../hacks/config/cubetwist.xml.h:11 ../hacks/config/glsnake.xml.h:8
+msgid "Tight"
+msgstr ""
+
+#: ../hacks/config/cubetwist.xml.h:12 ../hacks/config/quasicrystal.xml.h:10
+#, fuzzy
+msgid "Displacement"
+msgstr "画像を表示する"
+
+#: ../hacks/config/cubetwist.xml.h:13
+msgid "Wide"
+msgstr ""
+
+#: ../hacks/config/cubetwist.xml.h:19
+msgid ""
+"A series of nested cubes rotate and slide recursively. Written by Jamie "
+"Zawinski; 2016."
+msgstr ""
+
#: ../hacks/config/cubicgrid.xml.h:1
-msgid "CubicGrid"
+msgid "Cubic Grid"
msgstr ""
#: ../hacks/config/cubicgrid.xml.h:8
@@ -3554,11 +3944,25 @@ msgid "Big dots"
msgstr ""
#: ../hacks/config/cubicgrid.xml.h:13
+#, fuzzy
+msgid "Random symmetry"
+msgstr "表示モード"
+
+#: ../hacks/config/cubicgrid.xml.h:14
+msgid "Cubic symmetry"
+msgstr ""
+
+#: ../hacks/config/cubicgrid.xml.h:15
+#, fuzzy
+msgid "Hexagonal symmetry"
+msgstr "6角形"
+
+#: ../hacks/config/cubicgrid.xml.h:16
msgid "A rotating lattice of colored points. Written by Vasek Potocek; 2007."
msgstr ""
#: ../hacks/config/cwaves.xml.h:1
-msgid "CWaves"
+msgid "C Waves"
msgstr ""
#: ../hacks/config/cwaves.xml.h:5 ../hacks/config/flame.xml.h:11
@@ -3597,10 +4001,10 @@ msgid ""
msgstr ""
#: ../hacks/config/dangerball.xml.h:1
-msgid "DangerBall"
+msgid "Danger Ball"
msgstr ""
-#: ../hacks/config/dangerball.xml.h:6
+#: ../hacks/config/dangerball.xml.h:6 ../hacks/config/headroom.xml.h:6
msgid "Spike growth"
msgstr ""
@@ -3617,8 +4021,9 @@ msgid "A spiky ball. Ouch! Written by Jamie Zawinski; 2001."
msgstr ""
#: ../hacks/config/decayscreen.xml.h:1
-msgid "DecayScreen"
-msgstr ""
+#, fuzzy
+msgid "Decay Screen"
+msgstr "画面をロックする"
#: ../hacks/config/decayscreen.xml.h:8
msgid "Random melt style"
@@ -3708,21 +4113,34 @@ msgid "Smooth colors"
msgstr ""
#: ../hacks/config/deco.xml.h:12
-#, fuzzy
msgid "Golden ratio"
-msgstr "フェードする時間: "
+msgstr "黄金比"
#: ../hacks/config/deco.xml.h:13
msgid "Mondrian"
-msgstr ""
+msgstr "モンドリアン風"
#: ../hacks/config/deco.xml.h:15
msgid ""
"Subdivides and colors rectangles randomly, for a Mondrian-esque effect. "
-"http://en.wikipedia.org/wiki/Piet_Mondrian#Paris_1919.E2.80.931938 Written "
+"https://en.wikipedia.org/wiki/Piet_Mondrian#Paris_1919.E2.80.931938 Written "
"by Jamie Zawinski and Michael Bayne; 1997."
msgstr ""
+#: ../hacks/config/deepstars.xml.h:1
+msgid "Deep Stars"
+msgstr ""
+
+#: ../hacks/config/deepstars.xml.h:8
+msgid "Smear"
+msgstr ""
+
+#: ../hacks/config/deepstars.xml.h:10
+msgid ""
+"A long exposure of the night sky, showing star paths as vapor trails. "
+"Written by Jamie Zawinski; 2019."
+msgstr ""
+
#: ../hacks/config/deluxe.xml.h:1
msgid "Deluxe"
msgstr ""
@@ -3758,10 +4176,18 @@ msgstr ""
#, no-c-format
msgid ""
"A cellular automaton that starts with a random field, and organizes it into "
-"stripes and spirals. http://en.wikipedia.org/wiki/Maxwell%27s_demon Written "
+"stripes and spirals. https://en.wikipedia.org/wiki/Maxwell%27s_demon Written "
"by David Bagley; 1999."
msgstr ""
+#: ../hacks/config/discoball.xml.h:1
+msgid "Discoball"
+msgstr ""
+
+#: ../hacks/config/discoball.xml.h:15
+msgid "A dusty, dented disco ball. Woop woop. Written by Jamie Zawinski; 2016."
+msgstr ""
+
#: ../hacks/config/discrete.xml.h:1
msgid "Discrete"
msgstr ""
@@ -3838,8 +4264,7 @@ msgstr ""
#: ../hacks/config/dnalogo.xml.h:10
msgid ""
"DNA Lounge Restaurant -- Bar -- Nightclub -- Cafe -- Est. 1985. 375 Eleventh "
-"Street San Francisco, CA 94103 http://www.dnalounge.com/ http://www.dnapizza."
-"com/ Written by Jamie Zawinski; 2001."
+"Street San Francisco, CA 94103 Written by Jamie Zawinski; 2001."
msgstr ""
#: ../hacks/config/drift.xml.h:1
@@ -3851,6 +4276,51 @@ msgid ""
"Drifting recursive fractal cosmic flames. Written by Scott Draves; 1997."
msgstr ""
+#: ../hacks/config/dymaxionmap.xml.h:1
+msgid "Dymaxion Map"
+msgstr ""
+
+#: ../hacks/config/dymaxionmap.xml.h:8
+msgid "Flat map"
+msgstr ""
+
+#: ../hacks/config/dymaxionmap.xml.h:9
+msgid "Satellite map"
+msgstr ""
+
+#: ../hacks/config/dymaxionmap.xml.h:10
+msgid "Day / night smoothness"
+msgstr ""
+
+#: ../hacks/config/dymaxionmap.xml.h:12
+msgid "Lat / Long"
+msgstr ""
+
+#: ../hacks/config/dymaxionmap.xml.h:14 ../hacks/config/glplanet.xml.h:13
+#: ../hacks/config/moebiusgears.xml.h:12
+msgid "Roll"
+msgstr ""
+
+#: ../hacks/config/dymaxionmap.xml.h:18
+#, no-c-format
+msgid ""
+"Buckminster Fuller's map of the Earth projected onto the surface of an "
+"unfolded icosahedron. It depicts the Earth's continents as one island, or "
+"nearly contiguous land masses. This screen saver animates the progression of "
+"the dusk terminator across the flattened globe. It includes both satellite "
+"and flat-colored map imagery, and can load and convert other Equirectangular-"
+"projected maps. \"Dymaxion Map\" and \"The Fuller Projection Map\" are "
+"trademarks of The Buckminster Fuller Institute. The original Dymaxion Map "
+"image is copyright 1982 by The Buckminster Fuller Institute. (This program "
+"does not use their imagery, only similar trigonometry.) The Dymaxion Map was "
+"covered by now-expired US Patent 2,393,676 (Richard Buckminster Fuller, "
+"1946). https://en.wikipedia.org/wiki/Dymaxion_map https://en.wikipedia.org/"
+"wiki/Buckminster_Fuller https://en.wikipedia.org/wiki/"
+"List_of_map_projections https://en.wikipedia.org/wiki/Cahill"
+"%E2%80%93Keyes_projection https://en.wikipedia.org/wiki/"
+"Waterman_butterfly_projection Written by Jamie Zawinski; 2016."
+msgstr ""
+
#: ../hacks/config/endgame.xml.h:1
msgid "Endgame"
msgstr ""
@@ -3862,11 +4332,21 @@ msgstr ""
#: ../hacks/config/endgame.xml.h:7
msgid ""
"Black slips out of three mating nets, but the fourth one holds him tight! A "
-"brilliant composition! See also the \"Queens\" screen saver. http://en."
+"brilliant composition! See also the \"Queens\" screen saver. https://en."
"wikipedia.org/wiki/Chess_endgame Written by Blair Tennessy and Jamie "
"Zawinski; 2002."
msgstr ""
+#: ../hacks/config/energystream.xml.h:1
+msgid "Energy Stream"
+msgstr ""
+
+#: ../hacks/config/energystream.xml.h:8
+msgid ""
+"A flow of particles which form an energy stream. Written by Eugene "
+"Sandulenko and Konrad \"Yoghurt\" Zagorowicz; 2016."
+msgstr ""
+
#: ../hacks/config/engine.xml.h:1
msgid "Engine"
msgstr ""
@@ -3921,7 +4401,7 @@ msgstr ""
#: ../hacks/config/engine.xml.h:20
msgid ""
-"Internal combusion engines. http://en.wikipedia.org/wiki/"
+"Internal combusion engines. https://en.wikipedia.org/wiki/"
"Internal_combustion_engine#Operation Written by Ben Buxton, Ed Beroset and "
"Jamie Zawinski; 2001."
msgstr ""
@@ -3938,8 +4418,18 @@ msgstr ""
msgid ""
"A pre-heliocentric model of planetary motion. This draws the path traced out "
"by a point on the edge of a circle. That circle rotates around a point on "
-"the rim of another circle, and so on, several times. http://en.wikipedia.org/"
-"wiki/Deferent_and_epicycle Written by James Youngman; 1998."
+"the rim of another circle, and so on, several times. The geometry of "
+"epicycles was perfected by Hipparchus of Rhodes at some time around 125 B."
+"C., 185 years after the birth of Aristarchus of Samos, the inventor of the "
+"heliocentric universe model. Hipparchus applied epicycles to the Sun and the "
+"Moon. Ptolemy of Alexandria went on to apply them to what was then the known "
+"universe, at around 150 A.D. Copernicus went on to apply them to the "
+"heliocentric model at the beginning of the sixteenth century. Johannes "
+"Kepler discovered that the planets actually move in elliptical orbits in "
+"about 1602. The inverse-square law of gravity was suggested by Boulliau in "
+"1645. Isaac Newton's Principia Mathematica was published in 1687, and proved "
+"that Kepler's laws derived from Newtonian gravitation. https://en.wikipedia."
+"org/wiki/Deferent_and_epicycle Written by James Youngman; 1998."
msgstr ""
#: ../hacks/config/eruption.xml.h:1
@@ -3972,7 +4462,8 @@ msgid "Negative"
msgstr ""
#: ../hacks/config/eruption.xml.h:17 ../hacks/config/fluidballs.xml.h:12
-#: ../hacks/config/qix.xml.h:23 ../hacks/config/speedmine.xml.h:9
+#: ../hacks/config/hydrostat.xml.h:23 ../hacks/config/qix.xml.h:23
+#: ../hacks/config/speedmine.xml.h:9
msgid "Gravity"
msgstr ""
@@ -3986,8 +4477,251 @@ msgid ""
"screen savers. Written by W.P. van Paassen; 2003."
msgstr ""
+#: ../hacks/config/esper.xml.h:1
+msgid "Esper"
+msgstr ""
+
+#: ../hacks/config/esper.xml.h:10
+msgid ""
+"\"Enhance 224 to 176. Pull out track right. Center in pull back. Pull back. "
+"Wait a minute. Go right. Stop. Enhance 57 19. Track 45 left. Gimme a "
+"hardcopy right there.\" The Esper Machine was a voice-controlled forensic "
+"device used by LAPD in 2019, as documented in the 1982 film, Blade Runner. "
+"It was capable of enhancing photographs to an extreme degree, including "
+"reconstructing different viewpoints within the space from the reflections on "
+"various objects in the photograph. Written by Jamie Zawinski; 2017."
+msgstr ""
+
+#: ../hacks/config/etruscanvenus.xml.h:1
+msgid "Etruscan Venus"
+msgstr ""
+
+#: ../hacks/config/etruscanvenus.xml.h:2 ../hacks/config/klein.xml.h:6
+#: ../hacks/config/projectiveplane.xml.h:40 ../hacks/config/qix.xml.h:15
+#: ../hacks/config/romanboy.xml.h:2
+msgid "Random motion"
+msgstr ""
+
+#: ../hacks/config/etruscanvenus.xml.h:3 ../hacks/config/klein.xml.h:7
+#: ../hacks/config/projectiveplane.xml.h:41 ../hacks/config/romanboy.xml.h:3
+msgid "Walk"
+msgstr ""
+
+#: ../hacks/config/etruscanvenus.xml.h:4 ../hacks/config/klein.xml.h:8
+#: ../hacks/config/projectiveplane.xml.h:42 ../hacks/config/romanboy.xml.h:4
+msgid "Turn"
+msgstr ""
+
+#: ../hacks/config/etruscanvenus.xml.h:5 ../hacks/config/klein.xml.h:10
+#: ../hacks/config/projectiveplane.xml.h:44 ../hacks/config/romanboy.xml.h:6
+msgid "Show orientation marks"
+msgstr ""
+
+#: ../hacks/config/etruscanvenus.xml.h:6
+#, fuzzy
+msgid "Deform the surface"
+msgstr "ランダムなスクリーンセーバー"
+
+#: ../hacks/config/etruscanvenus.xml.h:7 ../hacks/config/klein.xml.h:41
+#: ../hacks/config/romanboy.xml.h:8 ../hacks/config/sphereeversion.xml.h:2
+msgid "1.0"
+msgstr ""
+
+#: ../hacks/config/etruscanvenus.xml.h:8 ../hacks/config/romanboy.xml.h:9
+#: ../hacks/config/sphereeversion.xml.h:3
+#, fuzzy
+msgid "Deformation speed"
+msgstr "表示モード"
+
+#: ../hacks/config/etruscanvenus.xml.h:9 ../hacks/config/klein.xml.h:43
+#: ../hacks/config/romanboy.xml.h:10 ../hacks/config/sphereeversion.xml.h:4
+msgid "100.0"
+msgstr ""
+
+#: ../hacks/config/etruscanvenus.xml.h:10 ../hacks/config/romanboy.xml.h:11
+msgid "0.0"
+msgstr ""
+
+#: ../hacks/config/etruscanvenus.xml.h:11 ../hacks/config/romanboy.xml.h:12
+#, fuzzy
+msgid "Initial deformation"
+msgstr "カラーマップをインストールする"
+
+#: ../hacks/config/etruscanvenus.xml.h:12
+msgid "3999.0"
+msgstr ""
+
+#: ../hacks/config/etruscanvenus.xml.h:13 ../hacks/config/klein.xml.h:11
+#: ../hacks/config/projectiveplane.xml.h:2 ../hacks/config/romanboy.xml.h:14
+#: ../hacks/config/sphereeversion.xml.h:10
+#, fuzzy
+msgid "Random surface"
+msgstr "ランダムなスクリーンセーバー"
+
+#: ../hacks/config/etruscanvenus.xml.h:14 ../hacks/config/klein.xml.h:12
+#: ../hacks/config/polytopes.xml.h:2 ../hacks/config/projectiveplane.xml.h:3
+#: ../hacks/config/romanboy.xml.h:15
+msgid "Wireframe mesh"
+msgstr ""
+
+#: ../hacks/config/etruscanvenus.xml.h:15 ../hacks/config/klein.xml.h:13
+#: ../hacks/config/mirrorblob.xml.h:27 ../hacks/config/polytopes.xml.h:3
+#: ../hacks/config/projectiveplane.xml.h:4 ../hacks/config/romanboy.xml.h:16
+#: ../hacks/config/sphereeversion.xml.h:11
+msgid "Solid surface"
+msgstr ""
+
+#: ../hacks/config/etruscanvenus.xml.h:16 ../hacks/config/klein.xml.h:14
+#: ../hacks/config/polytopes.xml.h:4 ../hacks/config/projectiveplane.xml.h:5
+#: ../hacks/config/romanboy.xml.h:17 ../hacks/config/sphereeversion.xml.h:12
+msgid "Transparent surface"
+msgstr ""
+
+#: ../hacks/config/etruscanvenus.xml.h:17 ../hacks/config/klein.xml.h:15
+#: ../hacks/config/projectiveplane.xml.h:6 ../hacks/config/romanboy.xml.h:18
+#: ../hacks/config/sphereeversion.xml.h:13
+#, fuzzy
+msgid "Random pattern"
+msgstr "ランダムなスクリーンセーバー"
+
+#: ../hacks/config/etruscanvenus.xml.h:18 ../hacks/config/hypertorus.xml.h:9
+#: ../hacks/config/klein.xml.h:16 ../hacks/config/projectiveplane.xml.h:7
+#: ../hacks/config/romanboy.xml.h:19 ../hacks/config/sphereeversion.xml.h:14
+msgid "Solid object"
+msgstr ""
+
+#: ../hacks/config/etruscanvenus.xml.h:19
+#: ../hacks/config/projectiveplane.xml.h:8 ../hacks/config/romanboy.xml.h:20
+msgid "Distance bands"
+msgstr ""
+
+#: ../hacks/config/etruscanvenus.xml.h:20
+#: ../hacks/config/projectiveplane.xml.h:9 ../hacks/config/romanboy.xml.h:21
+msgid "Direction bands"
+msgstr ""
+
+#: ../hacks/config/etruscanvenus.xml.h:22 ../hacks/config/hypertorus.xml.h:16
+#: ../hacks/config/klein.xml.h:19 ../hacks/config/projectiveplane.xml.h:11
+#: ../hacks/config/romanboy.xml.h:23
+msgid "One-sided"
+msgstr ""
+
+#: ../hacks/config/etruscanvenus.xml.h:23 ../hacks/config/hypertorus.xml.h:17
+#: ../hacks/config/klein.xml.h:20 ../hacks/config/projectiveplane.xml.h:12
+#: ../hacks/config/romanboy.xml.h:24 ../hacks/config/sphereeversion.xml.h:21
+msgid "Two-sided"
+msgstr ""
+
+#: ../hacks/config/etruscanvenus.xml.h:24
+#: ../hacks/config/projectiveplane.xml.h:13 ../hacks/config/romanboy.xml.h:25
+#, fuzzy
+msgid "Distance colors"
+msgstr "DirectColor"
+
+#: ../hacks/config/etruscanvenus.xml.h:25
+#: ../hacks/config/projectiveplane.xml.h:14 ../hacks/config/romanboy.xml.h:26
+#, fuzzy
+msgid "Direction colors"
+msgstr "DirectColor"
+
+#: ../hacks/config/etruscanvenus.xml.h:26 ../hacks/config/hypertorus.xml.h:19
+#: ../hacks/config/klein.xml.h:23 ../hacks/config/projectiveplane.xml.h:16
+#: ../hacks/config/romanboy.xml.h:27
+#, fuzzy
+msgid "Change colors"
+msgstr "DirectColor"
+
+#: ../hacks/config/etruscanvenus.xml.h:27 ../hacks/config/romanboy.xml.h:28
+#: ../hacks/config/sphereeversion.xml.h:24
+#, fuzzy
+msgid "Random Projection"
+msgstr "フェードする時間: "
+
+#: ../hacks/config/etruscanvenus.xml.h:28 ../hacks/config/romanboy.xml.h:29
+#: ../hacks/config/sphereeversion.xml.h:25
+msgid "Perspective"
+msgstr ""
+
+#: ../hacks/config/etruscanvenus.xml.h:29 ../hacks/config/romanboy.xml.h:30
+#: ../hacks/config/sphereeversion.xml.h:26
+msgid "Orthographic"
+msgstr ""
+
+#: ../hacks/config/etruscanvenus.xml.h:30 ../hacks/config/hypertorus.xml.h:24
+#: ../hacks/config/klein.xml.h:30 ../hacks/config/polytopes.xml.h:19
+#: ../hacks/config/romanboy.xml.h:31 ../hacks/config/sphereeversion.xml.h:27
+msgid "-4.0"
+msgstr ""
+
+#: ../hacks/config/etruscanvenus.xml.h:31 ../hacks/config/romanboy.xml.h:32
+#: ../hacks/config/sphereeversion.xml.h:28
+msgid "X rotation speed"
+msgstr "X軸回転速度"
+
+#: ../hacks/config/etruscanvenus.xml.h:32 ../hacks/config/hypertorus.xml.h:26
+#: ../hacks/config/klein.xml.h:32 ../hacks/config/polytopes.xml.h:21
+#: ../hacks/config/romanboy.xml.h:33 ../hacks/config/sphereeversion.xml.h:29
+msgid "4.0"
+msgstr ""
+
+#: ../hacks/config/etruscanvenus.xml.h:33 ../hacks/config/romanboy.xml.h:34
+#: ../hacks/config/sphereeversion.xml.h:30
+msgid "Y rotation speed"
+msgstr "Y軸回転測度"
+
+#: ../hacks/config/etruscanvenus.xml.h:34 ../hacks/config/romanboy.xml.h:35
+#: ../hacks/config/sphereeversion.xml.h:31
+msgid "Z rotation speed"
+msgstr "Z軸回転測度"
+
+#: ../hacks/config/etruscanvenus.xml.h:35 ../hacks/config/klein.xml.h:38
+#: ../hacks/config/romanboy.xml.h:36
+msgid "-180.0"
+msgstr ""
+
+#: ../hacks/config/etruscanvenus.xml.h:36 ../hacks/config/klein.xml.h:39
+#: ../hacks/config/romanboy.xml.h:37
+#, fuzzy
+msgid "Walking direction"
+msgstr "フェードする時間: "
+
+#: ../hacks/config/etruscanvenus.xml.h:37 ../hacks/config/klein.xml.h:40
+#: ../hacks/config/romanboy.xml.h:38
+msgid "180.0"
+msgstr ""
+
+#: ../hacks/config/etruscanvenus.xml.h:38 ../hacks/config/klein.xml.h:42
+#: ../hacks/config/romanboy.xml.h:39
+msgid "Walking speed"
+msgstr ""
+
+#: ../hacks/config/etruscanvenus.xml.h:44
+#, no-c-format
+msgid ""
+"A 3D immersion of of a Klein bottle that smoothly deforms between the "
+"Etruscan Venus surface, the Roman surface, the Boy surface, and the Ida "
+"surface. Topologically, all surfaces are Klein bottles, even the Roman and "
+"Boy surfaces, which are doubly covered and therefore appear to be an "
+"immersed real projective plane. You can walk on the Klein bottle or rotate "
+"it in 3D. Since all the surfaces except the Ida surfaces have points where "
+"the surface normal is not well defined for some points, walking is performed "
+"on the Ida surface. Furthermore, it is possible to smoothly deform the "
+"surface between the Etruscan Venus surface, the Roman surface, the Boy "
+"surface, and the Ida surface surface while turning it. Inspired by George K. "
+"Francis's book \"A Topological Picturebook\", Springer, 1987, George K. "
+"Francis's paper \"The Etruscan Venus\" in P. Concus, R. Finn, and D. A. "
+"Hoffman: \"Geometric Analysis and Computer Graphics\", Springer, 1991, and a "
+"video entitled \"The Etruscan Venus\" by Donna J. Cox, George K. Francis, "
+"and Raymond L. Idaszak, presented at SIGGRAPH 1989. https://en.wikipedia.org/"
+"wiki/Boy%27s_surface https://en.wikipedia.org/wiki/Roman_surface https://en."
+"wikipedia.org/wiki/Klein_bottle http://mathworld.wolfram.com/BoySurface.html "
+"http://mathworld.wolfram.com/RomanSurface.html http://mathworld.wolfram.com/"
+"EtruscanVenusSurface.html http://mathworld.wolfram.com/IdaSurface.html "
+"Written by Carsten Steger; 2020."
+msgstr ""
+
#: ../hacks/config/euler2d.xml.h:1
-msgid "Euler2D"
+msgid "Euler 2D"
msgstr ""
#: ../hacks/config/euler2d.xml.h:6 ../hacks/config/whirlwindwarp.xml.h:3
@@ -3997,8 +4731,8 @@ msgstr ""
#: ../hacks/config/euler2d.xml.h:31
#, no-c-format
msgid ""
-"Simulates two dimensional incompressible inviscid fluid flow. http://en."
-"wikipedia.org/wiki/Euler_equations_%28fluid_dynamics%29 http://en.wikipedia."
+"Simulates two dimensional incompressible inviscid fluid flow. https://en."
+"wikipedia.org/wiki/Euler_equations_%28fluid_dynamics%29 https://en.wikipedia."
"org/wiki/Inviscid_flow Written by Stephen Montgomery-Smith; 2002."
msgstr ""
@@ -4054,8 +4788,9 @@ msgid ""
msgstr ""
#: ../hacks/config/fadeplot.xml.h:1
-msgid "FadePlot"
-msgstr ""
+#, fuzzy
+msgid "Fade Plot"
+msgstr "フェードする時間: "
#: ../hacks/config/fadeplot.xml.h:9 ../hacks/config/lcdscrub.xml.h:6
#: ../hacks/config/spiral.xml.h:8
@@ -4069,8 +4804,9 @@ msgid ""
msgstr ""
#: ../hacks/config/fiberlamp.xml.h:1
-msgid "Fiberlamp"
-msgstr ""
+#, fuzzy
+msgid "Fiber Lamp"
+msgstr "ファイル(_F)"
#: ../hacks/config/fiberlamp.xml.h:6
#, fuzzy
@@ -4085,6 +4821,22 @@ msgstr ""
msgid "A fiber-optic lamp. Groovy. Written by Tim Auckland; 2005."
msgstr ""
+#: ../hacks/config/filmleader.xml.h:1
+msgid "Film Leader"
+msgstr ""
+
+#: ../hacks/config/filmleader.xml.h:6 ../hacks/config/pong.xml.h:6
+#: ../hacks/config/unknownpleasures.xml.h:13 ../hacks/config/vfeedback.xml.h:6
+msgid "Noise"
+msgstr "ノイズ量"
+
+#: ../hacks/config/filmleader.xml.h:10
+msgid ""
+"Displays a looping countdown based on the SMPTE Universal Film leader on a "
+"simulation of an old analog television. https://en.wikipedia.org/wiki/"
+"Film_leader Written by Jamie Zawinski; 2018."
+msgstr ""
+
#: ../hacks/config/fireworkx.xml.h:1
#, fuzzy
msgid "Fireworkx"
@@ -4139,7 +4891,7 @@ msgid "Iterative fractals. Written by Scott Draves; 1993."
msgstr ""
#: ../hacks/config/flipflop.xml.h:1
-msgid "FlipFlop"
+msgid "Flip Flop"
msgstr ""
#: ../hacks/config/flipflop.xml.h:5
@@ -4173,11 +4925,12 @@ msgid ""
msgstr ""
#: ../hacks/config/flipscreen3d.xml.h:1
-msgid "FlipScreen3D"
-msgstr ""
+#, fuzzy
+msgid "Flip Screen 3D"
+msgstr "ブランク・スクリーン"
#: ../hacks/config/flipscreen3d.xml.h:5 ../hacks/config/gleidescope.xml.h:12
-#: ../hacks/config/glplanet.xml.h:8 ../hacks/config/ifs.xml.h:67
+#: ../hacks/config/glplanet.xml.h:12 ../hacks/config/ifs.xml.h:67
#: ../hacks/config/tangram.xml.h:15 ../hacks/config/topblock.xml.h:17
msgid "Rotate"
msgstr ""
@@ -4188,7 +4941,7 @@ msgid ""
msgstr ""
#: ../hacks/config/fliptext.xml.h:1
-msgid "FlipText"
+msgid "Flip Text"
msgstr ""
#: ../hacks/config/fliptext.xml.h:8
@@ -4211,7 +4964,7 @@ msgstr ""
msgid "Font point size"
msgstr ""
-#: ../hacks/config/fliptext.xml.h:13
+#: ../hacks/config/fliptext.xml.h:13 ../hacks/config/gibson.xml.h:12
msgid "Text columns"
msgstr ""
@@ -4272,12 +5025,12 @@ msgid ""
"Strange attractors formed of flows in a 3D differential equation phase "
"space. Features the popular attractors described by Lorentz, Roessler, "
"Birkhoff and Duffing, and can discover entirely new attractors by itself. "
-"http://en.wikipedia.org/wiki/Attractor#Strange_attractor Written by Tim "
+"https://en.wikipedia.org/wiki/Attractor#Strange_attractor Written by Tim "
"Auckland; 1998."
msgstr ""
#: ../hacks/config/fluidballs.xml.h:1
-msgid "FluidBalls"
+msgid "Fluid Balls"
msgstr ""
#: ../hacks/config/fluidballs.xml.h:11
@@ -4358,19 +5111,14 @@ msgstr ""
msgid "Insane"
msgstr ""
-#: ../hacks/config/flurry.xml.h:10 ../hacks/config/sballs.xml.h:5
-#: ../hacks/config/starfish.xml.h:2
-msgid "Random"
-msgstr ""
-
#: ../hacks/config/flurry.xml.h:11
msgid ""
-"A colourful star(fish)like flurry of particles. Original Mac version: http://"
-"homepage.mac.com/calumr Written by Calum Robinson and Tobias Sargeant; 2002."
+"A colourful star(fish)like flurry of particles. Written by Calum Robinson "
+"and Tobias Sargeant; 2002."
msgstr ""
#: ../hacks/config/flyingtoasters.xml.h:1
-msgid "FlyingToasters"
+msgid "Flying Toasters"
msgstr ""
#: ../hacks/config/flyingtoasters.xml.h:6
@@ -4394,21 +5142,28 @@ msgstr ""
msgid "Chrome"
msgstr ""
-#: ../hacks/config/flyingtoasters.xml.h:16
+#: ../hacks/config/flyingtoasters.xml.h:13
+#: ../hacks/config/glforestfire.xml.h:14 ../hacks/config/glmatrix.xml.h:15
+#: ../hacks/config/glschool.xml.h:14
+msgid "Fog"
+msgstr ""
+
+#: ../hacks/config/flyingtoasters.xml.h:17
#, no-c-format
msgid ""
"A fleet of 3d space-age jet-powered flying toasters (and toast!) Inspired by "
-"the ancient Berkeley Systems After Dark flying toasters. http://en.wikipedia."
-"org/wiki/After_Dark_%28software%29#Flying_Toasters Written by Jamie Zawinski "
-"and Devon Dossett; 2003."
+"the ancient Berkeley Systems After Dark flying toasters. https://en."
+"wikipedia.org/wiki/After_Dark_%28software%29#Flying_Toasters Written by "
+"Jamie Zawinski and Devon Dossett; 2003."
msgstr ""
#: ../hacks/config/fontglide.xml.h:1
-msgid "FontGlide"
-msgstr ""
+#, fuzzy
+msgid "Font Glide"
+msgstr "インストールされていません"
-#: ../hacks/config/fontglide.xml.h:8 ../hacks/config/tangram.xml.h:5
-#: ../hacks/config/xlyap.xml.h:5
+#: ../hacks/config/fontglide.xml.h:8 ../hacks/config/raverhoop.xml.h:15
+#: ../hacks/config/tangram.xml.h:5 ../hacks/config/xlyap.xml.h:5
msgid "Brief"
msgstr ""
@@ -4454,7 +5209,7 @@ msgid ""
msgstr ""
#: ../hacks/config/fuzzyflakes.xml.h:1
-msgid "FuzzyFlakes"
+msgid "Fuzzy Flakes"
msgstr ""
#: ../hacks/config/fuzzyflakes.xml.h:9 ../hacks/config/hypnowheel.xml.h:10
@@ -4478,19 +5233,11 @@ msgstr ""
msgid "Yellow"
msgstr ""
-#: ../hacks/config/fuzzyflakes.xml.h:16 ../hacks/config/phosphor.xml.h:9
-msgid "Green"
-msgstr ""
-
#: ../hacks/config/fuzzyflakes.xml.h:17
#, fuzzy
msgid "Cyan"
msgstr "キャンセル"
-#: ../hacks/config/fuzzyflakes.xml.h:18
-msgid "Blue"
-msgstr ""
-
#: ../hacks/config/fuzzyflakes.xml.h:19
msgid "Magenta"
msgstr ""
@@ -4501,7 +5248,7 @@ msgstr ""
#: ../hacks/config/fuzzyflakes.xml.h:28
msgid ""
-"Falling colored snowflake/flower shapes. http://en.wikipedia.org/wiki/"
+"Falling colored snowflake/flower shapes. https://en.wikipedia.org/wiki/"
"Snowflake Written by Barry Dmytro; 2004."
msgstr ""
@@ -4529,8 +5276,8 @@ msgstr ""
#: ../hacks/config/gears.xml.h:15
msgid ""
-"Interlocking gears. See also the \"Pinion\" and \"MoebiusGears\" screen "
-"savers. http://en.wikipedia.org/wiki/Involute_gear http://en.wikipedia.org/"
+"Interlocking gears. See also the \"Pinion\" and \"Möbius Gears\" screen "
+"savers. https://en.wikipedia.org/wiki/Involute_gear https://en.wikipedia.org/"
"wiki/Epicyclic_gearing Written by Jamie Zawinski; 2007."
msgstr ""
@@ -4560,6 +5307,7 @@ msgid "Random face style"
msgstr "ランダムなスクリーンセーバー"
#: ../hacks/config/geodesic.xml.h:19 ../hacks/config/kaleidocycle.xml.h:5
+#: ../hacks/config/strange.xml.h:11
msgid "8"
msgstr ""
@@ -4571,12 +5319,12 @@ msgid ""
"shows the equilateral triangles subdivided into four coplanar equilateral "
"triangles; and then inflated outward, causing the sub-triangles to no longer "
"be equilateral, but to more closely approximate the surface of a sphere. "
-"http://en.wikipedia.org/wiki/Geodesic_dome http://en.wikipedia.org/wiki/"
+"https://en.wikipedia.org/wiki/Geodesic_dome https://en.wikipedia.org/wiki/"
"Buckminster_Fuller Written by Jamie Zawinski; 2013."
msgstr ""
#: ../hacks/config/geodesicgears.xml.h:1
-msgid "GeodesicGears"
+msgid "Geodesic Gears"
msgstr ""
#: ../hacks/config/geodesicgears.xml.h:8
@@ -4590,9 +5338,10 @@ msgstr "色の数"
#: ../hacks/config/geodesicgears.xml.h:14
msgid ""
-"A set of meshed gears arranged on the surface of a sphere. http://en."
-"wikipedia.org/wiki/Geodesic_dome http://en.wikipedia.org/wiki/Involute_gear "
-"Written by Jamie Zawinski; 2014."
+"A set of meshed gears arranged on the surface of a sphere. https://en."
+"wikipedia.org/wiki/Geodesic_dome https://en.wikipedia.org/wiki/Involute_gear "
+"https://en.wikipedia.org/wiki/Buckminster_Fuller Written by Jamie Zawinski; "
+"2014."
msgstr ""
#: ../hacks/config/gflux.xml.h:1
@@ -4609,6 +5358,7 @@ msgstr ""
#: ../hacks/config/gflux.xml.h:13 ../hacks/config/glhanoi.xml.h:13
#: ../hacks/config/hilbert.xml.h:14 ../hacks/config/lavalite.xml.h:10
+#: ../hacks/config/strange.xml.h:19
msgid "10"
msgstr ""
@@ -4632,8 +5382,47 @@ msgstr ""
msgid "Undulating waves on a rotating grid. Written by Josiah Pease; 2000."
msgstr ""
+#: ../hacks/config/gibson.xml.h:1
+msgid "Gibson"
+msgstr ""
+
+#: ../hacks/config/gibson.xml.h:6 ../hacks/config/glmatrix.xml.h:9
+msgid "Glyph speed"
+msgstr ""
+
+#: ../hacks/config/gibson.xml.h:8
+#, fuzzy
+msgid "Grid width"
+msgstr "グリッドサイズ"
+
+#: ../hacks/config/gibson.xml.h:9
+#, fuzzy
+msgid "Grid depth"
+msgstr "グリッドサイズ"
+
+#: ../hacks/config/gibson.xml.h:10
+msgid "Tower depth"
+msgstr ""
+
+#: ../hacks/config/gibson.xml.h:11
+msgid "Tower spacing"
+msgstr ""
+
+#: ../hacks/config/gibson.xml.h:16
+msgid ""
+"Hacking the Gibson, as per the 1995 classic film, HACKERS. Cereal Killer: "
+"\"Oh yeah, you want a seriously righteous hack, you score one of those "
+"Gibsons, man. You know, supercomputers they use to like, do physics, and "
+"look for oil and stuff?\" Phantom Phreak: \"Ain't no way, man, security's "
+"too tight. The big iron?\" Zero Cool: \"Maybe. But, if I were gonna hack "
+"some heavy metal, I'd, uh, work my way back through some low security, and "
+"try the back door.\" Cereal Killer: \"Yeah but oh man, wouldn't you just "
+"love to get one of those Gibsons, baby? Ooooh!\" Phantom Phreak: \"Yo, who "
+"ate all of my fries?\" Written by Jamie Zawinski; 2020."
+msgstr ""
+
#: ../hacks/config/glblur.xml.h:1
-msgid "GLBlur"
+msgid "GL Blur"
msgstr ""
#: ../hacks/config/glblur.xml.h:6
@@ -4651,7 +5440,7 @@ msgid ""
msgstr ""
#: ../hacks/config/glcells.xml.h:1
-msgid "GLCells"
+msgid "GL Cells"
msgstr ""
#: ../hacks/config/glcells.xml.h:9
@@ -4749,18 +5538,18 @@ msgstr "モード:"
#: ../hacks/config/gleidescope.xml.h:13 ../hacks/config/hyperball.xml.h:6
#: ../hacks/config/hypercube.xml.h:6 ../hacks/config/mirrorblob.xml.h:6
-#: ../hacks/config/zoom.xml.h:1
+#: ../hacks/config/strange.xml.h:14 ../hacks/config/zoom.xml.h:1
msgid "Zoom"
msgstr ""
#: ../hacks/config/gleidescope.xml.h:15
msgid ""
-"A kaleidoscope that operates on a loaded image. http://en.wikipedia.org/wiki/"
-"Kaleidoscope Written by Andrew Dean; 2003."
+"A kaleidoscope that operates on a loaded image. https://en.wikipedia.org/"
+"wiki/Kaleidoscope Written by Andrew Dean; 2003."
msgstr ""
#: ../hacks/config/glforestfire.xml.h:1
-msgid "GLForestFire"
+msgid "GL Forest Fire"
msgstr ""
#: ../hacks/config/glforestfire.xml.h:5
@@ -4788,11 +5577,6 @@ msgstr "文字列(_T)"
msgid "Shadows"
msgstr ""
-#: ../hacks/config/glforestfire.xml.h:14 ../hacks/config/glmatrix.xml.h:15
-#: ../hacks/config/glschool.xml.h:14
-msgid "Fog"
-msgstr ""
-
#: ../hacks/config/glforestfire.xml.h:17
msgid ""
"This screen saver was removed from the XScreenSaver distribution as of "
@@ -4801,7 +5585,7 @@ msgid ""
msgstr ""
#: ../hacks/config/glhanoi.xml.h:1
-msgid "GLHanoi"
+msgid "GL Hanoi"
msgstr ""
#: ../hacks/config/glhanoi.xml.h:6
@@ -4836,42 +5620,53 @@ msgstr ""
msgid ""
"Solves the Towers of Hanoi puzzle. Move N disks from one pole to another, "
"one disk at a time, with no disk ever resting on a disk smaller than itself. "
-"http://en.wikipedia.org/wiki/Tower_of_Hanoi Written by Dave Atkinson; 2005."
+"https://en.wikipedia.org/wiki/Tower_of_Hanoi Written by Dave Atkinson; 2005."
+msgstr ""
+
+#: ../hacks/config/glitchpeg.xml.h:1
+msgid "GlitchPEG"
+msgstr ""
+
+#: ../hacks/config/glitchpeg.xml.h:8
+msgid "Glitchiness"
+msgstr ""
+
+#: ../hacks/config/glitchpeg.xml.h:9
+msgid ""
+"Loads an image, corrupts it, and then displays the corrupted version, "
+"several times a second. After a while, finds a new image to corrupt. Written "
+"by Jamie Zawinski; 2018."
msgstr ""
#: ../hacks/config/glknots.xml.h:1
-msgid "GLKnots"
+msgid "GL Knots"
msgstr ""
#: ../hacks/config/glknots.xml.h:16
msgid "Segmented"
msgstr ""
-#: ../hacks/config/glknots.xml.h:17 ../hacks/config/jigsaw.xml.h:12
-#: ../hacks/config/lavalite.xml.h:11 ../hacks/config/mirrorblob.xml.h:14
-#: ../hacks/config/spheremonics.xml.h:8
+#: ../hacks/config/glknots.xml.h:17 ../hacks/config/gravitywell.xml.h:8
+#: ../hacks/config/jigsaw.xml.h:12 ../hacks/config/lavalite.xml.h:11
+#: ../hacks/config/mirrorblob.xml.h:14 ../hacks/config/spheremonics.xml.h:8
#: ../hacks/config/unknownpleasures.xml.h:11
msgid "Resolution"
msgstr ""
#: ../hacks/config/glknots.xml.h:25
msgid ""
-"Generates some twisting 3d knot patterns. Spins 'em around. http://en."
+"Generates some twisting 3d knot patterns. Spins 'em around. https://en."
"wikipedia.org/wiki/Knot_theory Written by Jamie Zawinski; 2003."
msgstr ""
#: ../hacks/config/glmatrix.xml.h:1
-msgid "GLMatrix"
+msgid "GL Matrix"
msgstr ""
#: ../hacks/config/glmatrix.xml.h:6
msgid "Glyph density"
msgstr ""
-#: ../hacks/config/glmatrix.xml.h:9
-msgid "Glyph speed"
-msgstr ""
-
#: ../hacks/config/glmatrix.xml.h:11 ../hacks/config/xmatrix.xml.h:4
msgid "Matrix encoding"
msgstr ""
@@ -4896,32 +5691,48 @@ msgstr ""
msgid ""
"The 3D \"digital rain\" effect, as seen in the title sequence of \"The Matrix"
"\". See also \"xmatrix\" for a 2D rendering of the similar effect that "
-"appeared on the computer monitors actually *in* the movie. http://en."
+"appeared on the computer monitors actually *in* the movie. https://en."
"wikipedia.org/wiki/Matrix_digital_rain Written by Jamie Zawinski; 2003."
msgstr ""
#: ../hacks/config/glplanet.xml.h:1
-msgid "GLPlanet"
+msgid "GL Planet"
msgstr ""
-#. #### -no-stars
-#: ../hacks/config/glplanet.xml.h:6
-msgid "Image file"
+#. #### -no-texture
+#: ../hacks/config/glplanet.xml.h:9
+#, fuzzy
+msgid "Day image"
+msgstr "画像を表示する"
+
+#: ../hacks/config/glplanet.xml.h:10
+#, fuzzy
+msgid "Night image"
+msgstr "表示モード"
+
+#: ../hacks/config/glplanet.xml.h:15
+msgid "Globe"
msgstr ""
-#: ../hacks/config/glplanet.xml.h:9 ../hacks/config/moebiusgears.xml.h:12
-msgid "Roll"
+#: ../hacks/config/glplanet.xml.h:16
+msgid "Mercator"
msgstr ""
-#: ../hacks/config/glplanet.xml.h:13
+#: ../hacks/config/glplanet.xml.h:17
+msgid "Equirectangular"
+msgstr ""
+
+#: ../hacks/config/glplanet.xml.h:20
msgid ""
-"The Earth, bouncing around in space. If you would like it to display a "
-"different planet, the texture maps that come with \"ssystem\" work well. "
-"Written by David Konerding and Jamie Zawinski; 1998."
+"The Earth, bouncing around in space, rendered with satellite imagery of the "
+"planet in both sunlight and darkness. If you would like it to display a "
+"different planet, any pair of Equirectangular-projected maps will work. The "
+"maps that come with \"ssystem\" work well. Written by David Konerding and "
+"Jamie Zawinski; 1998."
msgstr ""
#: ../hacks/config/glschool.xml.h:1
-msgid "GLSchool"
+msgid "GL School"
msgstr ""
#: ../hacks/config/glschool.xml.h:6
@@ -4953,12 +5764,12 @@ msgstr ""
#: ../hacks/config/glschool.xml.h:18
msgid ""
"A school of fish, using the classic \"Boids\" algorithm by Craig Reynolds. "
-"http://en.wikipedia.org/wiki/Boids Written by David C. Lambert and Jamie "
+"https://en.wikipedia.org/wiki/Boids Written by David C. Lambert and Jamie "
"Zawinski; 2006."
msgstr ""
#: ../hacks/config/glslideshow.xml.h:1
-msgid "GLSlideshow"
+msgid "GL Slideshow"
msgstr ""
#: ../hacks/config/glslideshow.xml.h:9
@@ -4971,7 +5782,7 @@ msgid "Always show at least this much of the image"
msgstr ""
#: ../hacks/config/glslideshow.xml.h:12 ../hacks/config/rd-bomb.xml.h:10
-#: ../hacks/config/rdbomb.xml.h:10 ../hacks/config/substrate.xml.h:15
+#: ../hacks/config/substrate.xml.h:15
#, no-c-format
msgid "100%"
msgstr ""
@@ -4994,11 +5805,7 @@ msgid ""
msgstr ""
#: ../hacks/config/glsnake.xml.h:1
-msgid "GLSnake"
-msgstr ""
-
-#: ../hacks/config/glsnake.xml.h:8
-msgid "Tight"
+msgid "GL Snake"
msgstr ""
#: ../hacks/config/glsnake.xml.h:9
@@ -5021,7 +5828,7 @@ msgstr ""
msgid "Z angular velocity"
msgstr ""
-#: ../hacks/config/glsnake.xml.h:16
+#: ../hacks/config/glsnake.xml.h:16 ../hacks/config/unicrud.xml.h:11
msgid "Show titles"
msgstr ""
@@ -5029,13 +5836,14 @@ msgstr ""
#, no-c-format
msgid ""
"The \"Rubik's Snake\" puzzle. See also the \"Rubik\" and \"Cube21\" screen "
-"savers. http://en.wikipedia.org/wiki/Rubik%27s_Snake Written by Jamie "
+"savers. https://en.wikipedia.org/wiki/Rubik%27s_Snake Written by Jamie "
"Wilkinson, Andrew Bennetts, and Peter Aylett; 2002."
msgstr ""
#: ../hacks/config/gltext.xml.h:1
-msgid "GLText"
-msgstr ""
+#, fuzzy
+msgid "GL Text"
+msgstr "文字列(_T)"
#: ../hacks/config/gltext.xml.h:5
msgid "Display system information"
@@ -5045,11 +5853,13 @@ msgstr "システム情報を表示する"
msgid "Display date and time"
msgstr "日時を表示する"
-#: ../hacks/config/gltext.xml.h:7
+#: ../hacks/config/gltext.xml.h:7 ../hacks/config/handsy.xml.h:20
+#: ../hacks/config/splitflap.xml.h:13
msgid "Always face front"
msgstr ""
-#: ../hacks/config/gltext.xml.h:8
+#: ../hacks/config/gltext.xml.h:8 ../hacks/config/handsy.xml.h:21
+#: ../hacks/config/splitflap.xml.h:14
msgid "Spin all the way around"
msgstr ""
@@ -5128,6 +5938,26 @@ msgid ""
"chamber photograph. Written by Greg Bowering; 1997."
msgstr ""
+#: ../hacks/config/gravitywell.xml.h:1
+msgid "Gravity Well"
+msgstr ""
+
+#: ../hacks/config/gravitywell.xml.h:10
+#, fuzzy
+msgid "Grid Size"
+msgstr "グリッドサイズ"
+
+#: ../hacks/config/gravitywell.xml.h:13 ../hacks/config/scooter.xml.h:12
+#, fuzzy
+msgid "Number of stars"
+msgstr "ディスクの数"
+
+#: ../hacks/config/gravitywell.xml.h:15
+msgid ""
+"Massive objects distort space in a two dimensional universe. Written by "
+"Jamie Zawinski; 2019."
+msgstr ""
+
#: ../hacks/config/greynetic.xml.h:1
msgid "Greynetic"
msgstr ""
@@ -5184,7 +6014,7 @@ msgid ""
"A halftone dot pattern in motion. Draws the gravity force in each point on "
"the screen seen through a halftone dot pattern. The gravity force is "
"calculated from a set of moving mass points. View it from a distance for "
-"best effect. http://en.wikipedia.org/wiki/Halftone Written by Peter Jaric; "
+"best effect. https://en.wikipedia.org/wiki/Halftone Written by Peter Jaric; "
"2002."
msgstr ""
@@ -5214,10 +6044,70 @@ msgstr ""
#: ../hacks/config/halo.xml.h:15
msgid ""
-"Circular interference patterns. http://en.wikipedia.org/wiki/Moire_pattern "
+"Circular interference patterns. https://en.wikipedia.org/wiki/Moire_pattern "
"Written by Jamie Zawinski; 1993."
msgstr ""
+#: ../hacks/config/handsy.xml.h:1
+msgid "Handsy"
+msgstr ""
+
+#: ../hacks/config/handsy.xml.h:9
+#, fuzzy
+msgid "Number of hands"
+msgstr "ディスクの数"
+
+#: ../hacks/config/handsy.xml.h:24
+msgid ""
+"A set of robotic hands communicate non-verbally. Written by Jamie Zawinski; "
+"2018."
+msgstr ""
+
+#: ../hacks/config/headroom.xml.h:1
+msgid "Headroom"
+msgstr ""
+
+#: ../hacks/config/headroom.xml.h:8
+msgid "Don't wobble"
+msgstr ""
+
+#: ../hacks/config/headroom.xml.h:9
+msgid "Wobble around X axis"
+msgstr ""
+
+#: ../hacks/config/headroom.xml.h:10
+msgid "Wobble around Y axis"
+msgstr ""
+
+#: ../hacks/config/headroom.xml.h:11
+msgid "Wobble around Z axis"
+msgstr ""
+
+#: ../hacks/config/headroom.xml.h:12
+msgid "Wobble around X and Y axes"
+msgstr ""
+
+#: ../hacks/config/headroom.xml.h:13
+msgid "Wobble around X and Z axes"
+msgstr ""
+
+#: ../hacks/config/headroom.xml.h:14
+msgid "Wobble around Y and Z axes"
+msgstr ""
+
+#: ../hacks/config/headroom.xml.h:15
+msgid "Wobble around all three axes"
+msgstr ""
+
+#: ../hacks/config/headroom.xml.h:19
+msgid ""
+"\"Back in my day, we used to say 'No future'. Well. This is it.\" -- Blank "
+"Reg \"I can dump down all the information in the mind. Then I can eliminate "
+"any information I don't want. My parrot squawks in much the same way. For "
+"the moment, the computer power is only enough to generate a human head.\" -- "
+"Bryce Lynch Written by Jamie Zawinski; 2020."
+msgstr ""
+
#: ../hacks/config/helix.xml.h:1
msgid "Helix"
msgstr ""
@@ -5284,11 +6174,32 @@ msgstr ""
#: ../hacks/config/hexadrop.xml.h:23
msgid ""
-"A grid of hexagons or other shapes, with tiles dropping out. http://en."
+"A grid of hexagons or other shapes, with tiles dropping out. https://en."
"wikipedia.org/wiki/Tiling_by_regular_polygons Written by Jamie Zawinski; "
"2013."
msgstr ""
+#: ../hacks/config/hexstrut.xml.h:1
+msgid "Hex Strut"
+msgstr ""
+
+#: ../hacks/config/hexstrut.xml.h:9
+#, fuzzy
+msgid "Hexagon Size"
+msgstr "6角形"
+
+#: ../hacks/config/hexstrut.xml.h:12
+#, fuzzy
+msgid "Line Thickness"
+msgstr "標準"
+
+#: ../hacks/config/hexstrut.xml.h:18
+msgid ""
+"A grid of hexagons composed of rotating Y-shaped struts. Waves of rotation "
+"and color changes randomly propagate across the plane. Written by Jamie "
+"Zawinski; 2016."
+msgstr ""
+
#: ../hacks/config/hilbert.xml.h:1
msgid "Hilbert"
msgstr ""
@@ -5337,7 +6248,7 @@ msgstr ""
#. to drop below 30 fps detail 12 or higher.
#.
#: ../hacks/config/hilbert.xml.h:12 ../hacks/config/hypnowheel.xml.h:12
-#: ../hacks/config/ifs.xml.h:23
+#: ../hacks/config/ifs.xml.h:23 ../hacks/config/sphereeversion.xml.h:6
msgid "2"
msgstr ""
@@ -5354,7 +6265,7 @@ msgid ""
"useful because ordering along the curve preserves locality: points that are "
"close together along the curve are also close together in space. The "
"converse is often, but not always, true. The coloration reflects this. "
-"http://en.wikipedia.org/wiki/Hilbert_curve Written by Jamie Zawinski; 2011."
+"https://en.wikipedia.org/wiki/Hilbert_curve Written by Jamie Zawinski; 2011."
msgstr ""
#: ../hacks/config/hopalong.xml.h:1
@@ -5414,8 +6325,61 @@ msgid ""
"by Patrick Naughton; 1992."
msgstr ""
+#: ../hacks/config/hydrostat.xml.h:1
+msgid "Hydrostat"
+msgstr ""
+
+#: ../hacks/config/hydrostat.xml.h:9
+#, fuzzy
+msgid "Number of squid"
+msgstr "色の数"
+
+#: ../hacks/config/hydrostat.xml.h:12
+#, fuzzy
+msgid "Head size"
+msgstr "グリッドサイズ"
+
+#: ../hacks/config/hydrostat.xml.h:15
+#, fuzzy
+msgid "Number of tentacles"
+msgstr "色の数"
+
+#: ../hacks/config/hydrostat.xml.h:20
+#, fuzzy
+msgid "Length of tentacles"
+msgstr "ディスクの跡の長さ"
+
+#: ../hacks/config/hydrostat.xml.h:22
+msgid "Weak"
+msgstr ""
+
+#: ../hacks/config/hydrostat.xml.h:24 ../hacks/config/jigglypuff.xml.h:20
+msgid "Strong"
+msgstr ""
+
+#: ../hacks/config/hydrostat.xml.h:25
+msgid "Current"
+msgstr ""
+
+#: ../hacks/config/hydrostat.xml.h:26
+msgid "Viscosity"
+msgstr ""
+
+#: ../hacks/config/hydrostat.xml.h:27
+msgid "Pulse"
+msgstr ""
+
+#: ../hacks/config/hydrostat.xml.h:30
+msgid ""
+"Wiggly squid or jellyfish with many tentacles. A muscular hydrostat is a "
+"biological structure used to move its host about, consisting of muscles with "
+"no skeletal support. It performs its hydraulic movement without fluid in a "
+"separate compartment, as in a hydrostatic skeleton. https://en.wikipedia.org/"
+"wiki/Muscular_hydrostat Written by Justin Windle and Jamie Zawinski; 2016."
+msgstr ""
+
#: ../hacks/config/hyperball.xml.h:1
-msgid "HyperBall"
+msgid "Hyperball"
msgstr ""
#: ../hacks/config/hyperball.xml.h:10 ../hacks/config/hypercube.xml.h:10
@@ -5450,13 +6414,13 @@ msgid ""
"cell\" object corresponds to this one. Hyperball is to hypercube as "
"dodecahedron is to cube: this displays a 2D projection of the sequence of 3D "
"objects which are the projections of the 4D analog to the dodecahedron. "
-"Technically, it is a \"120 cell polytope\". http://en.wikipedia.org/wiki/"
-"Hypercube http://en.wikipedia.org/wiki/Regular_polytope Written by Joe "
+"Technically, it is a \"120 cell polytope\". https://en.wikipedia.org/wiki/"
+"Hypercube https://en.wikipedia.org/wiki/Regular_polytope Written by Joe "
"Keane; 2000."
msgstr ""
#: ../hacks/config/hypercube.xml.h:1
-msgid "HyperCube"
+msgid "Hypercube"
msgstr ""
#: ../hacks/config/hypercube.xml.h:17
@@ -5470,8 +6434,8 @@ msgid ""
"others; a hypercube is composed of eight cubes, each touching six others. To "
"make it easier to visualize the rotation, it uses a different color for the "
"edges of each face. Don't think about it too long, or your brain will melt. "
-"http://en.wikipedia.org/wiki/Hypercube http://en.wikipedia.org/wiki/"
-"Tesseract http://en.wikipedia.org/wiki/Regular_polytope Written by Joe "
+"https://en.wikipedia.org/wiki/Hypercube https://en.wikipedia.org/wiki/"
+"Tesseract https://en.wikipedia.org/wiki/Regular_polytope Written by Joe "
"Keane, Fritz Mueller, and Jamie Zawinski; 1992."
msgstr ""
@@ -5484,16 +6448,6 @@ msgstr ""
msgid "Solid"
msgstr ""
-#: ../hacks/config/hypertorus.xml.h:8 ../hacks/config/qix.xml.h:21
-#: ../hacks/config/webcollage.xml.h:8
-msgid "Transparent"
-msgstr "透明"
-
-#: ../hacks/config/hypertorus.xml.h:9 ../hacks/config/klein.xml.h:16
-#: ../hacks/config/projectiveplane.xml.h:7
-msgid "Solid object"
-msgstr ""
-
#: ../hacks/config/hypertorus.xml.h:10
msgid "Transparent bands"
msgstr ""
@@ -5518,83 +6472,68 @@ msgstr ""
msgid "16 Transparent spirals"
msgstr ""
-#: ../hacks/config/hypertorus.xml.h:16 ../hacks/config/klein.xml.h:19
-#: ../hacks/config/projectiveplane.xml.h:11
-msgid "Two-sided"
-msgstr ""
-
-#: ../hacks/config/hypertorus.xml.h:17
+#: ../hacks/config/hypertorus.xml.h:18
#, fuzzy
msgid "Color wheel"
msgstr "色"
-#: ../hacks/config/hypertorus.xml.h:18 ../hacks/config/klein.xml.h:23
-#: ../hacks/config/polytopes.xml.h:14 ../hacks/config/projectiveplane.xml.h:16
+#: ../hacks/config/hypertorus.xml.h:20 ../hacks/config/klein.xml.h:25
+#: ../hacks/config/polytopes.xml.h:14 ../hacks/config/projectiveplane.xml.h:18
msgid "Perspective 3D"
msgstr ""
-#: ../hacks/config/hypertorus.xml.h:19 ../hacks/config/klein.xml.h:24
-#: ../hacks/config/polytopes.xml.h:15 ../hacks/config/projectiveplane.xml.h:17
+#: ../hacks/config/hypertorus.xml.h:21 ../hacks/config/klein.xml.h:26
+#: ../hacks/config/polytopes.xml.h:15 ../hacks/config/projectiveplane.xml.h:19
msgid "Orthographic 3D"
msgstr ""
-#: ../hacks/config/hypertorus.xml.h:20 ../hacks/config/klein.xml.h:26
-#: ../hacks/config/polytopes.xml.h:16 ../hacks/config/projectiveplane.xml.h:19
+#: ../hacks/config/hypertorus.xml.h:22 ../hacks/config/klein.xml.h:28
+#: ../hacks/config/polytopes.xml.h:16 ../hacks/config/projectiveplane.xml.h:21
msgid "Perspective 4D"
msgstr ""
-#: ../hacks/config/hypertorus.xml.h:21 ../hacks/config/klein.xml.h:27
-#: ../hacks/config/polytopes.xml.h:17 ../hacks/config/projectiveplane.xml.h:20
+#: ../hacks/config/hypertorus.xml.h:23 ../hacks/config/klein.xml.h:29
+#: ../hacks/config/polytopes.xml.h:17 ../hacks/config/projectiveplane.xml.h:22
msgid "Orthographic 4D"
msgstr ""
-#: ../hacks/config/hypertorus.xml.h:22 ../hacks/config/klein.xml.h:28
-#: ../hacks/config/polytopes.xml.h:19
-msgid "-4.0"
-msgstr ""
-
-#: ../hacks/config/hypertorus.xml.h:23 ../hacks/config/klein.xml.h:29
+#: ../hacks/config/hypertorus.xml.h:25 ../hacks/config/klein.xml.h:31
#: ../hacks/config/polytopes.xml.h:20
msgid "WX rotation speed"
msgstr ""
-#: ../hacks/config/hypertorus.xml.h:24 ../hacks/config/klein.xml.h:30
-#: ../hacks/config/polytopes.xml.h:21
-msgid "4.0"
-msgstr ""
-
-#: ../hacks/config/hypertorus.xml.h:25 ../hacks/config/klein.xml.h:31
+#: ../hacks/config/hypertorus.xml.h:27 ../hacks/config/klein.xml.h:33
#: ../hacks/config/polytopes.xml.h:22
msgid "WY rotation speed"
msgstr ""
-#: ../hacks/config/hypertorus.xml.h:26 ../hacks/config/klein.xml.h:32
+#: ../hacks/config/hypertorus.xml.h:28 ../hacks/config/klein.xml.h:34
#: ../hacks/config/polytopes.xml.h:23
msgid "WZ rotation speed"
msgstr ""
-#: ../hacks/config/hypertorus.xml.h:27 ../hacks/config/klein.xml.h:33
+#: ../hacks/config/hypertorus.xml.h:29 ../hacks/config/klein.xml.h:35
#: ../hacks/config/polytopes.xml.h:27
msgid "XY rotation speed"
msgstr ""
-#: ../hacks/config/hypertorus.xml.h:28 ../hacks/config/klein.xml.h:34
+#: ../hacks/config/hypertorus.xml.h:30 ../hacks/config/klein.xml.h:36
#: ../hacks/config/polytopes.xml.h:28
msgid "XZ rotation speed"
msgstr ""
-#: ../hacks/config/hypertorus.xml.h:29 ../hacks/config/klein.xml.h:35
+#: ../hacks/config/hypertorus.xml.h:31 ../hacks/config/klein.xml.h:37
#: ../hacks/config/polytopes.xml.h:29
msgid "YZ rotation speed"
msgstr ""
-#: ../hacks/config/hypertorus.xml.h:30
+#: ../hacks/config/hypertorus.xml.h:32
msgid ""
"A Clifford Torus: a torus lying on the \"surface\" of a 4D hypersphere. "
"Inspired by Thomas Banchoff's book \"Beyond the Third Dimension: Geometry, "
"Computer Graphics, and Higher Dimensions\", Scientific American Library, "
-"1990. http://en.wikipedia.org/wiki/N-sphere http://en.wikipedia.org/wiki/"
-"Clifford_torus http://en.wikipedia.org/wiki/Regular_polytope Written by "
+"1990. https://en.wikipedia.org/wiki/N-sphere https://en.wikipedia.org/wiki/"
+"Clifford_torus https://en.wikipedia.org/wiki/Regular_polytope Written by "
"Carsten Steger; 2003."
msgstr ""
@@ -5616,9 +6555,9 @@ msgstr ""
#: ../hacks/config/hypnowheel.xml.h:17
msgid ""
-"A overlapping, translucent spiral patterns. The tightness of their spirals "
-"fluctuates in and out. http://en.wikipedia.org/wiki/Moire_pattern Written by "
-"Jamie Zawinski; 2008."
+"Overlapping, translucent spiral patterns. The tightness of their spirals "
+"fluctuates in and out. https://en.wikipedia.org/wiki/Moire_pattern Written "
+"by Jamie Zawinski; 2008."
msgstr ""
#: ../hacks/config/ifs.xml.h:1
@@ -5650,12 +6589,12 @@ msgstr ""
msgid ""
"Clouds of iterated function systems spin and collide. Note that the \"Detail"
"\" parameter is exponential. Number of points drawn is functions^detail. "
-"http://en.wikipedia.org/wiki/Iterated_function_system Written by Chris Le "
+"https://en.wikipedia.org/wiki/Iterated_function_system Written by Chris Le "
"Sueur and Robby Griffin; 1997."
msgstr ""
#: ../hacks/config/imsmap.xml.h:1
-msgid "IMSMap"
+msgid "IMS Map"
msgstr ""
#: ../hacks/config/imsmap.xml.h:5
@@ -5759,7 +6698,7 @@ msgid ""
msgstr ""
#: ../hacks/config/jigglypuff.xml.h:1
-msgid "JigglyPuff"
+msgid "Jiggly Puff"
msgstr ""
#: ../hacks/config/jigglypuff.xml.h:2
@@ -5796,10 +6735,6 @@ msgstr ""
msgid "Vertex-vertex force"
msgstr ""
-#: ../hacks/config/jigglypuff.xml.h:20
-msgid "Strong"
-msgstr ""
-
#: ../hacks/config/jigglypuff.xml.h:22
msgid "Sphere strength"
msgstr ""
@@ -5855,8 +6790,8 @@ msgstr ""
#: ../hacks/config/jigsaw.xml.h:16
msgid ""
-"Carves an image up into a jigsaw puzzle, shuffles it, and solves it. http://"
-"en.wikipedia.org/wiki/Jigsaw_puzzle http://en.wikipedia.org/wiki/"
+"Carves an image up into a jigsaw puzzle, shuffles it, and solves it. https://"
+"en.wikipedia.org/wiki/Jigsaw_puzzle https://en.wikipedia.org/wiki/"
"Tessellation Written by Jamie Zawinski; 1997."
msgstr ""
@@ -5906,13 +6841,13 @@ msgid ""
msgstr ""
#: ../hacks/config/juggler3d.xml.h:1
-msgid "Juggler3D"
+msgid "Juggler 3D"
msgstr ""
#: ../hacks/config/juggler3d.xml.h:22
msgid ""
"A 3D juggling stick-man, with Cambridge juggling pattern notation used to "
-"describe the patterns he juggles. http://en.wikipedia.org/wiki/Siteswap "
+"describe the patterns he juggles. https://en.wikipedia.org/wiki/Siteswap "
"Written by Tim Auckland and Jamie Zawinski; 2002."
msgstr ""
@@ -5928,7 +6863,7 @@ msgstr ""
msgid ""
"The Julia set is a close relative of the Mandelbrot set. The small moving "
"dot indicates the control point from which the rest of the image was "
-"generated. See also the \"Discrete\" screen saver. http://en.wikipedia.org/"
+"generated. See also the \"Discrete\" screen saver. https://en.wikipedia.org/"
"wiki/Julia_set Written by Sean McCullough; 1997."
msgstr ""
@@ -5940,7 +6875,7 @@ msgstr ""
msgid "Segments"
msgstr ""
-#: ../hacks/config/kaleidescope.xml.h:8
+#: ../hacks/config/kaleidescope.xml.h:8 ../hacks/config/sphereeversion.xml.h:7
msgid "3"
msgstr ""
@@ -5959,15 +6894,15 @@ msgstr ""
#: ../hacks/config/kaleidescope.xml.h:14
msgid ""
"A simple kaleidoscope made of line segments. See \"GLeidescope\" for a more "
-"sophisticated take. http://en.wikipedia.org/wiki/Kaleidoscope Written by Ron "
-"Tapia; 1997."
+"sophisticated take. https://en.wikipedia.org/wiki/Kaleidoscope Written by "
+"Ron Tapia; 1997."
msgstr ""
#: ../hacks/config/kaleidocycle.xml.h:1
msgid "Kaleidocycle"
msgstr ""
-#: ../hacks/config/kaleidocycle.xml.h:7
+#: ../hacks/config/kaleidocycle.xml.h:7 ../hacks/config/raverhoop.xml.h:7
msgid "64"
msgstr ""
@@ -5990,114 +6925,47 @@ msgid "Figure 8"
msgstr ""
#: ../hacks/config/klein.xml.h:4
-msgid "Squeezed torus"
+msgid "Pinched torus"
msgstr ""
#: ../hacks/config/klein.xml.h:5
msgid "Lawson"
msgstr ""
-#: ../hacks/config/klein.xml.h:6 ../hacks/config/projectiveplane.xml.h:38
-#: ../hacks/config/qix.xml.h:15
-msgid "Random motion"
-msgstr ""
-
-#: ../hacks/config/klein.xml.h:7 ../hacks/config/projectiveplane.xml.h:39
-msgid "Walk"
-msgstr ""
-
-#: ../hacks/config/klein.xml.h:8 ../hacks/config/projectiveplane.xml.h:40
-msgid "Turn"
-msgstr ""
-
-#: ../hacks/config/klein.xml.h:9 ../hacks/config/projectiveplane.xml.h:41
+#: ../hacks/config/klein.xml.h:9 ../hacks/config/projectiveplane.xml.h:43
msgid "Walk and turn"
msgstr ""
-#: ../hacks/config/klein.xml.h:10 ../hacks/config/projectiveplane.xml.h:42
-msgid "Show orientation marks"
-msgstr ""
-
-#: ../hacks/config/klein.xml.h:11 ../hacks/config/projectiveplane.xml.h:2
-#, fuzzy
-msgid "Random surface"
-msgstr "ランダムなスクリーンセーバー"
-
-#: ../hacks/config/klein.xml.h:12 ../hacks/config/polytopes.xml.h:2
-#: ../hacks/config/projectiveplane.xml.h:3
-msgid "Wireframe mesh"
-msgstr ""
-
-#: ../hacks/config/klein.xml.h:13 ../hacks/config/mirrorblob.xml.h:27
-#: ../hacks/config/polytopes.xml.h:3 ../hacks/config/projectiveplane.xml.h:4
-msgid "Solid surface"
-msgstr ""
-
-#: ../hacks/config/klein.xml.h:14 ../hacks/config/polytopes.xml.h:4
-#: ../hacks/config/projectiveplane.xml.h:5
-msgid "Transparent surface"
-msgstr ""
-
-#: ../hacks/config/klein.xml.h:15 ../hacks/config/projectiveplane.xml.h:6
-#, fuzzy
-msgid "Random pattern"
-msgstr "ランダムなスクリーンセーバー"
-
#: ../hacks/config/klein.xml.h:17
msgid "See-through bands"
msgstr ""
-#: ../hacks/config/klein.xml.h:20
+#: ../hacks/config/klein.xml.h:21
#, fuzzy
msgid "Rainbow colors"
msgstr "フェードする時間: "
-#: ../hacks/config/klein.xml.h:21 ../hacks/config/projectiveplane.xml.h:14
+#: ../hacks/config/klein.xml.h:22 ../hacks/config/projectiveplane.xml.h:15
msgid "4d depth colors"
msgstr ""
-#: ../hacks/config/klein.xml.h:22 ../hacks/config/projectiveplane.xml.h:15
+#: ../hacks/config/klein.xml.h:24 ../hacks/config/projectiveplane.xml.h:17
#, fuzzy
msgid "Random 3D"
msgstr "ランダムなスクリーンセーバー"
-#: ../hacks/config/klein.xml.h:25 ../hacks/config/projectiveplane.xml.h:18
+#: ../hacks/config/klein.xml.h:27 ../hacks/config/projectiveplane.xml.h:20
#, fuzzy
msgid "Random 4D"
msgstr "ランダムなスクリーンセーバー"
-#: ../hacks/config/klein.xml.h:36
-msgid "-180.0"
-msgstr ""
-
-#: ../hacks/config/klein.xml.h:37
-#, fuzzy
-msgid "Walking direction"
-msgstr "フェードする時間: "
-
-#: ../hacks/config/klein.xml.h:38
-msgid "180.0"
-msgstr ""
-
-#: ../hacks/config/klein.xml.h:39
-msgid "1.0"
-msgstr ""
-
-#: ../hacks/config/klein.xml.h:40
-msgid "Walking speed"
-msgstr ""
-
-#: ../hacks/config/klein.xml.h:41
-msgid "100.0"
-msgstr ""
-
-#: ../hacks/config/klein.xml.h:46
+#: ../hacks/config/klein.xml.h:48
msgid ""
-"A Klein bottle is the 4D analog of a moebius strip. You can walk on the "
+"A Klein bottle is the 4D analog of a möbius strip. You can walk on the "
"surface of the bottle or rotate it in 4D or walk on it while it rotates in "
"4D. Inspired by Thomas Banchoff's book \"Beyond the Third Dimension: "
"Geometry, Computer Graphics, and Higher Dimensions\", Scientific American "
-"Library, 1990. http://en.wikipedia.org/wiki/Klein_bottle Written by Carsten "
+"Library, 1990. https://en.wikipedia.org/wiki/Klein_bottle Written by Carsten "
"Steger; 2008."
msgstr ""
@@ -6123,7 +6991,7 @@ msgstr ""
#, no-c-format
msgid ""
"Lemarchand's Box, the Lament Configuration. Warning: occasionally opens "
-"doors. http://en.wikipedia.org/wiki/Lemarchand%27s_box Written by Jamie "
+"doors. https://en.wikipedia.org/wiki/Lemarchand%27s_box Written by Jamie "
"Zawinski; 1998."
msgstr ""
@@ -6183,13 +7051,13 @@ msgid ""
"motion lamp are registered trademarks of Haggerty Enterprises, Inc. The "
"configuration of the globe and base of the motion lamp are registered "
"trademarks of Haggerty Enterprises, Inc. in the U.S.A. and in other "
-"countries around the world.\" http://en.wikipedia.org/wiki/Lava_lamp http://"
-"en.wikipedia.org/wiki/Metaballs http://en.wikipedia.org/wiki/Lavarand "
-"Written by Jamie Zawinski; 2002."
+"countries around the world.\" https://en.wikipedia.org/wiki/Lava_lamp "
+"https://en.wikipedia.org/wiki/Metaballs https://en.wikipedia.org/wiki/"
+"Lavarand Written by Jamie Zawinski; 2002."
msgstr ""
#: ../hacks/config/lcdscrub.xml.h:1
-msgid "LCDscrub"
+msgid "LCD Scrub"
msgstr ""
#: ../hacks/config/lcdscrub.xml.h:5
@@ -6267,7 +7135,7 @@ msgstr ""
#: ../hacks/config/lisa.xml.h:17
msgid ""
"This screen saver was removed from the XScreenSaver distribution as of "
-"version 5.08. Lissajous loops. http://en.wikipedia.org/wiki/Lissajous_curve "
+"version 5.08. Lissajous loops. https://en.wikipedia.org/wiki/Lissajous_curve "
"Written by Caleb Cullen; 1997."
msgstr ""
@@ -6279,8 +7147,8 @@ msgstr ""
msgid ""
"This screen saver was removed from the XScreenSaver distribution as of "
"version 5.08. Lissajous loops. This one draws the progress of circular "
-"shapes along a path. http://en.wikipedia.org/wiki/Lissajous_curve Written by "
-"Alexander Jolk; 1997."
+"shapes along a path. https://en.wikipedia.org/wiki/Lissajous_curve Written "
+"by Alexander Jolk; 1997."
msgstr ""
#: ../hacks/config/lmorph.xml.h:1
@@ -6371,7 +7239,7 @@ msgstr ""
#, no-c-format
msgid ""
"A cellular automaton that generates loop-shaped colonies that spawn, age, "
-"and eventually die. http://en.wikipedia.org/wiki/Langton%27s_loops Written "
+"and eventually die. https://en.wikipedia.org/wiki/Langton%27s_loops Written "
"by David Bagley; 1999."
msgstr ""
@@ -6379,15 +7247,27 @@ msgstr ""
msgid "m6502"
msgstr ""
-#: ../hacks/config/m6502.xml.h:3
-msgid "Display time for each program"
+#: ../hacks/config/m6502.xml.h:2
+msgid "Assembly file"
msgstr ""
#: ../hacks/config/m6502.xml.h:5
-msgid "Assembly file"
+msgid "Display time for each program"
+msgstr ""
+
+#: ../hacks/config/m6502.xml.h:11
+msgid "500"
+msgstr ""
+
+#: ../hacks/config/m6502.xml.h:12
+msgid "Instructions per second"
msgstr ""
#: ../hacks/config/m6502.xml.h:13
+msgid "120000"
+msgstr ""
+
+#: ../hacks/config/m6502.xml.h:16
msgid ""
"Emulates a 6502 microprocessor, and runs some example programs on it. The "
"family of 6502 chips were used throughout the 70's and 80's in machines such "
@@ -6443,14 +7323,48 @@ msgstr ""
msgid ""
"Generates random mazes, with three different algorithms: Kruskal, Prim, and "
"a depth-first recursive backtracker. It also solves them. Backtracking and "
-"look-ahead paths are displayed in different colors. http://en.wikipedia.org/"
-"wiki/Maze_generation_algorithm http://en.wikipedia.org/wiki/"
+"look-ahead paths are displayed in different colors. https://en.wikipedia.org/"
+"wiki/Maze_generation_algorithm https://en.wikipedia.org/wiki/"
"Maze_solving_algorithm Written by Martin Weiss, Dave Lemke, Jim Randell, "
"Jamie Zawinski, Johannes Keukelaar, and Zack Weinberg; 1985."
msgstr ""
+#: ../hacks/config/maze3d.xml.h:1
+msgid "Maze 3D"
+msgstr ""
+
+#: ../hacks/config/maze3d.xml.h:8
+msgid "Show Overlay"
+msgstr ""
+
+#: ../hacks/config/maze3d.xml.h:9
+msgid "Acid"
+msgstr ""
+
+#: ../hacks/config/maze3d.xml.h:11 ../hacks/config/splitflap.xml.h:9
+msgid "Rows"
+msgstr ""
+
+#: ../hacks/config/maze3d.xml.h:12 ../hacks/config/splitflap.xml.h:8
+msgid "Columns"
+msgstr ""
+
+#: ../hacks/config/maze3d.xml.h:13
+msgid "Inverters"
+msgstr ""
+
+#: ../hacks/config/maze3d.xml.h:14
+msgid "Rats"
+msgstr ""
+
+#: ../hacks/config/maze3d.xml.h:15
+msgid ""
+"A re-creation of the 3D Maze screensaver from Windows 95. Written by Sudoer; "
+"2018."
+msgstr ""
+
#: ../hacks/config/memscroller.xml.h:1
-msgid "MemScroller"
+msgid "Mem Scroller"
msgstr ""
#: ../hacks/config/memscroller.xml.h:5
@@ -6485,35 +7399,32 @@ msgstr ""
#: ../hacks/config/menger.xml.h:21
msgid ""
-"The Menger Gasket is a cube-based recursive fractal object analagous to the "
-"Sierpinski Tetrahedron. http://en.wikipedia.org/wiki/Menger_sponge http://en."
-"wikipedia.org/wiki/Sierpinski_carpet Written by Jamie Zawinski; 2001."
+"The Menger Gasket is a cube-based recursive fractal object analogous to the "
+"Sierpinski Tetrahedron. https://en.wikipedia.org/wiki/Menger_sponge https://"
+"en.wikipedia.org/wiki/Sierpinski_carpet Written by Jamie Zawinski; 2001."
msgstr ""
#: ../hacks/config/metaballs.xml.h:1
-msgid "MetaBalls"
-msgstr ""
-
-#: ../hacks/config/metaballs.xml.h:11
-msgid "Metaball count"
+msgid "Meta Balls"
msgstr ""
#: ../hacks/config/metaballs.xml.h:13
-msgid "MetaBall Radius"
-msgstr ""
+#, fuzzy
+msgid "Ball Radius"
+msgstr "設定"
#: ../hacks/config/metaballs.xml.h:15
-msgid "MetaBall Movement"
+msgid "Ball Movement"
msgstr ""
#: ../hacks/config/metaballs.xml.h:17
msgid ""
-"2D meta-balls: overlapping and merging balls with fuzzy edges. http://en."
+"2D meta-balls: overlapping and merging balls with fuzzy edges. https://en."
"wikipedia.org/wiki/Metaballs Written by W.P. van Paassen; 2003."
msgstr ""
#: ../hacks/config/mirrorblob.xml.h:1
-msgid "MirrorBlob"
+msgid "Mirror Blob"
msgstr ""
#: ../hacks/config/mirrorblob.xml.h:5
@@ -6549,10 +7460,6 @@ msgstr ""
msgid "Clear"
msgstr "色"
-#: ../hacks/config/mirrorblob.xml.h:19 ../hacks/config/webcollage.xml.h:10
-msgid "Opaque"
-msgstr "不透明"
-
#: ../hacks/config/mirrorblob.xml.h:20
msgid "Enable walls"
msgstr ""
@@ -6596,12 +7503,12 @@ msgid ""
"version 5.08. It was merged with the \"Munch\" screen saver. Munching "
"errors! This is a creatively broken misimplementation of the classic "
"munching squares graphics hack. See the \"Munch\" screen saver for the "
-"original. http://en.wikipedia.org/wiki/HAKMEM http://en.wikipedia.org/wiki/"
+"original. https://en.wikipedia.org/wiki/HAKMEM https://en.wikipedia.org/wiki/"
"Munching_square Written by Steven Hazel; 2004."
msgstr ""
#: ../hacks/config/moebius.xml.h:1
-msgid "Moebius"
+msgid "Möbius"
msgstr ""
#: ../hacks/config/moebius.xml.h:5
@@ -6614,14 +7521,14 @@ msgstr ""
#: ../hacks/config/moebius.xml.h:8
msgid ""
-"M. C. Escher's \"Moebius Strip II\", an image of ants walking along the "
-"surface of a moebius strip. http://en.wikipedia.org/wiki/Moebius_strip "
-"http://en.wikipedia.org/wiki/Maurits_Cornelis_Escher Written by Marcelo F. "
+"M. C. Escher's \"Möbius Strip II\", an image of ants walking along the "
+"surface of a möbius strip. https://en.wikipedia.org/wiki/Moebius_strip "
+"https://en.wikipedia.org/wiki/Maurits_Cornelis_Escher Written by Marcelo F. "
"Vianna; 1997."
msgstr ""
#: ../hacks/config/moebiusgears.xml.h:1
-msgid "MoebiusGears"
+msgid "Möbius Gears"
msgstr ""
#: ../hacks/config/moebiusgears.xml.h:8
@@ -6635,13 +7542,13 @@ msgstr ""
#: ../hacks/config/moebiusgears.xml.h:15
msgid ""
"An interlinked loop of rotating gears. The layout of the gears follows the "
-"path of a moebius strip. See also the \"Pinion\" and \"Gears\" screen "
-"savers. http://en.wikipedia.org/wiki/Involute_gear http://en.wikipedia.org/"
-"wiki/Moebius_strip Written by Jamie Zawinski; 2007."
+"path of a möbius strip. See also the \"Pinion\" and \"Gears\" screen savers. "
+"https://en.wikipedia.org/wiki/Involute_gear https://en.wikipedia.org/wiki/"
+"Moebius_strip Written by Jamie Zawinski; 2007."
msgstr ""
#: ../hacks/config/moire.xml.h:1
-msgid "Moire"
+msgid "Moiré"
msgstr ""
#: ../hacks/config/moire.xml.h:9 ../hacks/config/rorschach.xml.h:5
@@ -6650,20 +7557,20 @@ msgstr ""
#: ../hacks/config/moire.xml.h:13
msgid ""
-"When the lines on the screen Make more lines in between, That's a moire'! "
-"http://en.wikipedia.org/wiki/Moire_pattern Written by Jamie Zawinski and "
+"When the lines on the screen Make more lines in between, That's a moiré! "
+"https://en.wikipedia.org/wiki/Moire_pattern Written by Jamie Zawinski and "
"Michael Bayne; 1997."
msgstr ""
#: ../hacks/config/moire2.xml.h:1
-msgid "Moire2"
+msgid "Moiré 2"
msgstr ""
#: ../hacks/config/moire2.xml.h:10
msgid ""
"Generates fields of concentric circles or ovals, and combines the planes "
"with various operations. The planes are moving independently of one another, "
-"causing the interference lines to spray. http://en.wikipedia.org/wiki/"
+"causing the interference lines to spray. https://en.wikipedia.org/wiki/"
"Moire_pattern Written by Jamie Zawinski; 1998."
msgstr ""
@@ -6699,12 +7606,12 @@ msgstr ""
#, no-c-format
msgid ""
"Some interesting molecules. Several molecules are built in, and it can also "
-"read PDB (Protein Data Bank) files as input. http://en.wikipedia.org/wiki/"
+"read PDB (Protein Data Bank) files as input. https://en.wikipedia.org/wiki/"
"Protein_Data_Bank_%28file_format%29 Written by Jamie Zawinski; 2001."
msgstr ""
#: ../hacks/config/morph3d.xml.h:1
-msgid "Morph3D"
+msgid "Morph 3D"
msgstr ""
#: ../hacks/config/morph3d.xml.h:7 ../hacks/config/polyhedra.xml.h:30
@@ -6729,8 +7636,8 @@ msgstr ""
#: ../hacks/config/morph3d.xml.h:12
msgid ""
-"Platonic solids that turn inside out and get spikey. http://en.wikipedia.org/"
-"wiki/Platonic_solid Written by Marcelo Vianna; 1997."
+"Platonic solids that turn inside out and get spikey. https://en.wikipedia."
+"org/wiki/Platonic_solid Written by Marcelo Vianna; 1997."
msgstr ""
#: ../hacks/config/mountain.xml.h:1
@@ -6769,24 +7676,26 @@ msgid ""
"Memo 239, 1972), Jackson Wright wrote the above PDP-1 code in 1962. That "
"code still lives on here, some 46 years later. In \"mismunch\" mode, it "
"displays a creatively broken misimplementation of the classic munching "
-"squares algorithm instead. http://en.wikipedia.org/wiki/HAKMEM http://en."
+"squares algorithm instead. https://en.wikipedia.org/wiki/HAKMEM https://en."
"wikipedia.org/wiki/Munching_square Written by Jackson Wright, Tim Showalter, "
"Jamie Zawinski and Steven Hazel; 1997."
msgstr ""
#: ../hacks/config/nerverot.xml.h:1
-msgid "NerveRot"
+msgid "Nerve Rot"
msgstr ""
#: ../hacks/config/nerverot.xml.h:9
msgid "Blot count"
msgstr ""
-#: ../hacks/config/nerverot.xml.h:12 ../hacks/config/topblock.xml.h:14
+#: ../hacks/config/nerverot.xml.h:12 ../hacks/config/raverhoop.xml.h:6
+#: ../hacks/config/razzledazzle.xml.h:9 ../hacks/config/topblock.xml.h:14
msgid "Colors"
msgstr ""
#: ../hacks/config/nerverot.xml.h:13 ../hacks/config/pyro.xml.h:8
+#: ../hacks/config/splodesic.xml.h:5
msgid "Seldom"
msgstr ""
@@ -6827,7 +7736,7 @@ msgid "Flowery, rotatey patterns. Written by Bill Torzewski; 2004."
msgstr ""
#: ../hacks/config/noseguy.xml.h:1
-msgid "NoseGuy"
+msgid "Nose Guy"
msgstr ""
#: ../hacks/config/noseguy.xml.h:3
@@ -6837,7 +7746,7 @@ msgid ""
msgstr ""
#: ../hacks/config/pacman.xml.h:1
-msgid "Pacman"
+msgid "Pac-Man"
msgstr ""
#: ../hacks/config/pacman.xml.h:5
@@ -6846,8 +7755,8 @@ msgstr ""
#: ../hacks/config/pacman.xml.h:7
msgid ""
-"Simulates a game of Pac-Man on a randomly-created level. http://en.wikipedia."
-"org/wiki/Pac-Man Written by Edwin de Jong and Jamie Zawinski; 2004."
+"Simulates a game of Pac-Man on a randomly-created level. https://en."
+"wikipedia.org/wiki/Pac-Man Written by Edwin de Jong and Jamie Zawinski; 2004."
msgstr ""
#: ../hacks/config/pedal.xml.h:1
@@ -6856,8 +7765,40 @@ msgstr ""
#: ../hacks/config/pedal.xml.h:10
msgid ""
-"The even-odd winding rule. http://en.wikipedia.org/wiki/Even-odd_rule http://"
-"en.wikipedia.org/wiki/Nonzero-rule Written by Dale Moore; 1995."
+"The even-odd winding rule. https://en.wikipedia.org/wiki/Even-odd_rule "
+"https://en.wikipedia.org/wiki/Nonzero-rule Written by Dale Moore; 1995."
+msgstr ""
+
+#: ../hacks/config/peepers.xml.h:1
+msgid "Peepers"
+msgstr ""
+
+#: ../hacks/config/peepers.xml.h:9
+#, fuzzy
+msgid "Number of eyes"
+msgstr "色の数"
+
+#: ../hacks/config/peepers.xml.h:12
+msgid "Scroll"
+msgstr ""
+
+#: ../hacks/config/peepers.xml.h:13
+msgid "Bounce or scroll"
+msgstr ""
+
+#: ../hacks/config/peepers.xml.h:14
+#, fuzzy
+msgid "Grid"
+msgstr "グリッドサイズ"
+
+#: ../hacks/config/peepers.xml.h:15
+msgid "Beholder"
+msgstr ""
+
+#: ../hacks/config/peepers.xml.h:18
+msgid ""
+"Floating eyeballs. Anatomically correct, and they also track the pointer. "
+"Written by Jamie Zawinski; 2018."
msgstr ""
#: ../hacks/config/penetrate.xml.h:1
@@ -6878,7 +7819,7 @@ msgstr "常に賢くプレーする"
#: ../hacks/config/penetrate.xml.h:9
msgid ""
-"Simulates (something like) the classic arcade game Missile Command. http://"
+"Simulates (something like) the classic arcade game Missile Command. https://"
"en.wikipedia.org/wiki/Missile_Command Written by Adam Miller; 1999."
msgstr ""
@@ -6902,7 +7843,7 @@ msgid ""
"population of Great Britain being invited by a multinational to wipe their "
"bottoms on what appears to be the work of a Knight of the Realm, then a last "
"stand must be taken.\" As reported by News of the Weird #491, 4-Jul-1997. "
-"http://en.wikipedia.org/wiki/Penrose_tiling http://en.wikipedia.org/wiki/"
+"https://en.wikipedia.org/wiki/Penrose_tiling https://en.wikipedia.org/wiki/"
"Tessellation Written by Timo Korvola; 1997."
msgstr ""
@@ -6986,11 +7927,6 @@ msgstr ""
msgid "Font scale"
msgstr "インストールされていません"
-#. DarkOrange is probably the closest named color.
-#: ../hacks/config/phosphor.xml.h:11
-msgid "Amber"
-msgstr ""
-
#: ../hacks/config/phosphor.xml.h:14
msgid ""
"An old terminal with large pixels and long-sustain phosphor. On MacOS and "
@@ -7000,7 +7936,7 @@ msgid ""
msgstr ""
#: ../hacks/config/photopile.xml.h:1
-msgid "Photopile"
+msgid "Photo Pile"
msgstr ""
#: ../hacks/config/photopile.xml.h:3
@@ -7074,7 +8010,7 @@ msgstr ""
msgid "Gear size"
msgstr ""
-#: ../hacks/config/pinion.xml.h:12 ../hacks/config/projectiveplane.xml.h:34
+#: ../hacks/config/pinion.xml.h:12 ../hacks/config/projectiveplane.xml.h:36
msgid "100"
msgstr ""
@@ -7088,9 +8024,9 @@ msgstr ""
#: ../hacks/config/pinion.xml.h:17
msgid ""
-"A gear system marches across the screen. See also the \"Gears\" and "
-"\"MoebiusGears\" screen savers. http://en.wikipedia.org/wiki/Involute_gear "
-"Written by Jamie Zawinski; 2004."
+"A gear system marches across the screen. See also the \"Gears\" and \"Möbius "
+"Gears\" screen savers. https://en.wikipedia.org/wiki/Involute_gear Written "
+"by Jamie Zawinski; 2004."
msgstr ""
#: ../hacks/config/pipes.xml.h:1
@@ -7598,7 +8534,7 @@ msgid "Small stellated truncated dodecahedron"
msgstr ""
#: ../hacks/config/polyhedra.xml.h:128
-msgid "Great pentakisdodekahedron"
+msgid "Great pentakisdodecahedron"
msgstr ""
#: ../hacks/config/polyhedra.xml.h:129
@@ -7749,9 +8685,9 @@ msgstr "説明"
#: ../hacks/config/polyhedra.xml.h:169
msgid ""
"The 75 uniform polyhedra and their duals, plus 5 prisms and antiprisms, and "
-"some information about each. http://en.wikipedia.org/wiki/Uniform_polyhedra "
-"http://en.wikipedia.org/wiki/Stellation http://en.wikipedia.org/wiki/"
-"Dual_polyhedron http://en.wikipedia.org/wiki/Antiprism Written by Dr. Zvi "
+"some information about each. https://en.wikipedia.org/wiki/Uniform_polyhedra "
+"https://en.wikipedia.org/wiki/Stellation https://en.wikipedia.org/wiki/"
+"Dual_polyhedron https://en.wikipedia.org/wiki/Antiprism Written by Dr. Zvi "
"Har'El and Jamie Zawinski; 2004."
msgstr ""
@@ -7767,7 +8703,7 @@ msgstr "カラーマップをインストールする"
#: ../hacks/config/polyominoes.xml.h:13
msgid ""
"Repeatedly attempts to completely fill a rectangle with irregularly-shaped "
-"puzzle pieces. http://en.wikipedia.org/wiki/Polyomino Written by Stephen "
+"puzzle pieces. https://en.wikipedia.org/wiki/Polyomino Written by Stephen "
"Montgomery-Smith; 2002."
msgstr ""
@@ -7813,10 +8749,10 @@ msgid ""
"The six regular 4D polytopes rotating in 4D. Inspired by H.S.M Coxeter's "
"book \"Regular Polytopes\", 3rd Edition, Dover Publications, Inc., 1973, and "
"Thomas Banchoff's book \"Beyond the Third Dimension: Geometry, Computer "
-"Graphics, and Higher Dimensions\", Scientific American Library, 1990. http://"
-"en.wikipedia.org/wiki/Hypercube http://en.wikipedia.org/wiki/Tesseract "
-"http://en.wikipedia.org/wiki/Regular_polytope Written by Carsten Steger; "
-"2003."
+"Graphics, and Higher Dimensions\", Scientific American Library, 1990. "
+"https://en.wikipedia.org/wiki/Hypercube https://en.wikipedia.org/wiki/"
+"Tesseract https://en.wikipedia.org/wiki/Regular_polytope Written by Carsten "
+"Steger; 2003."
msgstr ""
#: ../hacks/config/pong.xml.h:1
@@ -7831,10 +8767,6 @@ msgstr "ゲームの早さ"
msgid "Crisp"
msgstr ""
-#: ../hacks/config/pong.xml.h:6
-msgid "Noise"
-msgstr "ノイズ量"
-
#: ../hacks/config/pong.xml.h:7
msgid "Noisy"
msgstr ""
@@ -7846,14 +8778,15 @@ msgstr "時計を表示する"
#: ../hacks/config/pong.xml.h:14
msgid ""
"The 1971 Pong home video game, including artifacts of an old color TV set. "
-"In clock mode, the score keeps track of the current time. http://en."
+"In clock mode, the score keeps track of the current time. https://en."
"wikipedia.org/wiki/Pong Written by Jeremy English, Trevor Blackwell and "
"Jamie Zawinski; 2003."
msgstr ""
#: ../hacks/config/popsquares.xml.h:1
-msgid "PopSquares"
-msgstr ""
+#, fuzzy
+msgid "Pop Squares"
+msgstr "4角形"
#: ../hacks/config/popsquares.xml.h:5
msgid "Subdivision"
@@ -7918,91 +8851,74 @@ msgid ""
msgstr ""
#: ../hacks/config/projectiveplane.xml.h:1
-msgid "ProjectivePlane"
+msgid "Projective Plane"
msgstr ""
-#: ../hacks/config/projectiveplane.xml.h:8
-msgid "Distance bands"
-msgstr ""
-
-#: ../hacks/config/projectiveplane.xml.h:9
-msgid "Direction bands"
-msgstr ""
-
-#: ../hacks/config/projectiveplane.xml.h:12
-#, fuzzy
-msgid "Distance colors"
-msgstr "DirectColor"
-
-#: ../hacks/config/projectiveplane.xml.h:13
-#, fuzzy
-msgid "Direction colors"
-msgstr "DirectColor"
-
-#: ../hacks/config/projectiveplane.xml.h:21
+#: ../hacks/config/projectiveplane.xml.h:23
msgid "-4"
msgstr ""
-#: ../hacks/config/projectiveplane.xml.h:22
+#: ../hacks/config/projectiveplane.xml.h:24
#, fuzzy
msgid "WX speed"
msgstr "表示モード"
-#: ../hacks/config/projectiveplane.xml.h:23
+#: ../hacks/config/projectiveplane.xml.h:25 ../hacks/config/scooter.xml.h:8
+#: ../hacks/config/sphereeversion.xml.h:8
msgid "4"
msgstr ""
-#: ../hacks/config/projectiveplane.xml.h:24
+#: ../hacks/config/projectiveplane.xml.h:26
#, fuzzy
msgid "WY speed"
msgstr "表示モード"
-#: ../hacks/config/projectiveplane.xml.h:25
+#: ../hacks/config/projectiveplane.xml.h:27
#, fuzzy
msgid "WZ speed"
msgstr "表示モード"
-#: ../hacks/config/projectiveplane.xml.h:26
+#: ../hacks/config/projectiveplane.xml.h:28
#, fuzzy
msgid "XY speed"
msgstr "表示モード"
-#: ../hacks/config/projectiveplane.xml.h:27
+#: ../hacks/config/projectiveplane.xml.h:29
#, fuzzy
msgid "XZ speed"
msgstr "表示モード"
-#: ../hacks/config/projectiveplane.xml.h:28
+#: ../hacks/config/projectiveplane.xml.h:30
#, fuzzy
msgid "YZ speed"
msgstr "表示モード"
-#: ../hacks/config/projectiveplane.xml.h:29
+#: ../hacks/config/projectiveplane.xml.h:31
msgid "-180"
msgstr ""
-#: ../hacks/config/projectiveplane.xml.h:30
+#: ../hacks/config/projectiveplane.xml.h:32
msgid "Walk dir "
msgstr ""
-#: ../hacks/config/projectiveplane.xml.h:31
+#: ../hacks/config/projectiveplane.xml.h:33
msgid "180"
msgstr ""
-#: ../hacks/config/projectiveplane.xml.h:33
+#: ../hacks/config/projectiveplane.xml.h:35
#, fuzzy
msgid "Walk speed"
msgstr "表示モード"
-#: ../hacks/config/projectiveplane.xml.h:44
+#: ../hacks/config/projectiveplane.xml.h:46
msgid ""
"A 4D embedding of the real projective plane. You can walk on the surface of "
"the real projective plane or rotate it in 4D or walk on it while it rotates "
"in 4D. Inspired by Thomas Banchoff's book \"Beyond the Third Dimension: "
"Geometry, Computer Graphics, and Higher Dimensions\", Scientific American "
-"Library, 1990. http://en.wikipedia.org/wiki/Real_projective_plane http://en."
-"wikipedia.org/wiki/Roman_surface http://en.wikipedia.org/wiki/Cross_cap "
-"http://en.wikipedia.org/wiki/Moebius_strip http://mathworld.wolfram.com/"
+"Library, 1990. https://en.wikipedia.org/wiki/Real_projective_plane https://"
+"en.wikipedia.org/wiki/Roman_surface https://en.wikipedia.org/wiki/Cross_cap "
+"https://en.wikipedia.org/wiki/Moebius_strip http://mathworld.wolfram.com/"
"RealProjectivePlane.html http://mathworld.wolfram.com/RomanSurface.html "
"http://mathworld.wolfram.com/Cross-Cap.html http://mathworld.wolfram.com/"
"MoebiusStrip.html Written by Carsten Steger; 2014."
@@ -8019,7 +8935,7 @@ msgstr ""
#: ../hacks/config/providence.xml.h:8
msgid ""
"\"A pyramid unfinished. In the zenith an eye in a triangle, surrounded by a "
-"glory, proper.\" http://en.wikipedia.org/wiki/Eye_of_Providence Written by "
+"glory, proper.\" https://en.wikipedia.org/wiki/Eye_of_Providence Written by "
"Blair Tennessy; 2004."
msgstr ""
@@ -8120,12 +9036,12 @@ msgstr ""
msgid ""
"Bounces a series of line segments around the screen, and uses variations on "
"this basic motion pattern to produce all sorts of different presentations: "
-"line segments, filled polygons, and overlapping translucent areas. http://en."
-"wikipedia.org/wiki/Qix Written by Jamie Zawinski; 1992."
+"line segments, filled polygons, and overlapping translucent areas. https://"
+"en.wikipedia.org/wiki/Qix Written by Jamie Zawinski; 1992."
msgstr ""
#: ../hacks/config/quasicrystal.xml.h:1
-msgid "QuasiCrystal"
+msgid "Quasi-Crystal"
msgstr ""
#: ../hacks/config/quasicrystal.xml.h:9
@@ -8133,11 +9049,6 @@ msgstr ""
msgid "Contrast"
msgstr "カラーマップ"
-#: ../hacks/config/quasicrystal.xml.h:10
-#, fuzzy
-msgid "Displacement"
-msgstr "画像を表示する"
-
#: ../hacks/config/quasicrystal.xml.h:14
msgid ""
"A quasicrystal is a structure that is ordered but aperiodic. Two-dimensional "
@@ -8146,7 +9057,7 @@ msgid ""
"the period, position, and rotation of the component planes, and whether the "
"rotation of the planes is evenly distributed around the circle (the "
"\"symmetry\" option, above) or random. See also the \"RD-Bomb\", \"CWaves\" "
-"and \"Penrose\" screen savers. http://en.wikipedia.org/wiki/Quasicrystal "
+"and \"Penrose\" screen savers. https://en.wikipedia.org/wiki/Quasicrystal "
"Written by Jamie Zawinski; 2013."
msgstr ""
@@ -8157,58 +9068,115 @@ msgstr ""
#: ../hacks/config/queens.xml.h:7
msgid ""
"The N-Queens problem: how to place N queens on an NxN chessboard such that "
-"no queen can attack a sister? See also the \"Endgame\" screen saver. http://"
+"no queen can attack a sister? See also the \"Endgame\" screen saver. https://"
"en.wikipedia.org/wiki/Eight_queens_puzzle Written by Blair Tennessy and "
"Jamie Zawinski; 2002."
msgstr ""
-#: ../hacks/config/rd-bomb.xml.h:1 ../hacks/config/rdbomb.xml.h:1
-msgid "RDbomb"
+#: ../hacks/config/raverhoop.xml.h:1
+msgid "Raver Hoop"
+msgstr ""
+
+#: ../hacks/config/raverhoop.xml.h:9
+msgid "Lights"
+msgstr ""
+
+#: ../hacks/config/raverhoop.xml.h:12
+msgid "Speed, motion"
+msgstr ""
+
+#: ../hacks/config/raverhoop.xml.h:14
+msgid "Speed, lights"
+msgstr ""
+
+#: ../hacks/config/raverhoop.xml.h:16
+msgid "Sustain"
+msgstr ""
+
+#: ../hacks/config/raverhoop.xml.h:21
+msgid ""
+"Simulates an LED hula hoop in a dark room. Oontz oontz oontz. Written by "
+"Jamie Zawinski; 2016."
+msgstr ""
+
+#: ../hacks/config/razzledazzle.xml.h:1
+msgid "Razzle Dazzle"
+msgstr ""
+
+#: ../hacks/config/razzledazzle.xml.h:17
+#, fuzzy
+msgid "Ship Outlines"
+msgstr "標準"
+
+#: ../hacks/config/razzledazzle.xml.h:18
+#, fuzzy
+msgid "Flat Pattern"
+msgstr "ランダムなスクリーンセーバー"
+
+#: ../hacks/config/razzledazzle.xml.h:19
+msgid "Ships or flat pattern"
+msgstr ""
+
+#: ../hacks/config/razzledazzle.xml.h:22
+#, no-c-format
+msgid ""
+"Generates an infinitely-scrolling sequence of dazzle camouflage patterns. "
+"Dazzle Ships, in addition to being the best album by Orchestral Manoeuvres "
+"in the Dark, were military vessels during World War I and early in World War "
+"II that were painted not to conceal but to confuse: with these Cubist "
+"overlapping stripes, it was very hard to estimate their size, range and "
+"heading. This was a big deal before the invention of Radar. https://en."
+"wikipedia.org/wiki/Dazzle_camouflage https://en.wikipedia.org/wiki/Cubism "
+"https://en.wikipedia.org/wiki/Dazzle_Ships_%28album%29 https://en.wikipedia."
+"org/wiki/Acoustic_mirror https://en.wikipedia.org/wiki/Radar Written by "
+"Jamie Zawinski; 2018."
+msgstr ""
+
+#: ../hacks/config/rd-bomb.xml.h:1
+msgid "RD-Bomb"
msgstr ""
-#: ../hacks/config/rd-bomb.xml.h:5 ../hacks/config/rdbomb.xml.h:5
-#: ../hacks/config/voronoi.xml.h:12
+#: ../hacks/config/rd-bomb.xml.h:5 ../hacks/config/voronoi.xml.h:12
msgid "Wander speed"
msgstr ""
-#: ../hacks/config/rd-bomb.xml.h:7 ../hacks/config/rdbomb.xml.h:7
+#: ../hacks/config/rd-bomb.xml.h:7
#, no-c-format
msgid "1%"
msgstr ""
-#: ../hacks/config/rd-bomb.xml.h:8 ../hacks/config/rdbomb.xml.h:8
-#: ../hacks/config/tessellimage.xml.h:14
+#: ../hacks/config/rd-bomb.xml.h:8 ../hacks/config/tessellimage.xml.h:17
#, fuzzy
msgid "Fill screen"
msgstr "ブランク・スクリーン"
-#: ../hacks/config/rd-bomb.xml.h:12 ../hacks/config/rdbomb.xml.h:12
+#: ../hacks/config/rd-bomb.xml.h:12
msgid "Epoch"
msgstr ""
-#: ../hacks/config/rd-bomb.xml.h:18 ../hacks/config/rdbomb.xml.h:18
+#: ../hacks/config/rd-bomb.xml.h:18
msgid "X tile size"
msgstr ""
-#: ../hacks/config/rd-bomb.xml.h:19 ../hacks/config/rdbomb.xml.h:19
+#: ../hacks/config/rd-bomb.xml.h:19
msgid "Y tile size"
msgstr ""
-#: ../hacks/config/rd-bomb.xml.h:20 ../hacks/config/rdbomb.xml.h:20
+#: ../hacks/config/rd-bomb.xml.h:20
#, fuzzy
msgid "Reaction"
msgstr "説明"
-#: ../hacks/config/rd-bomb.xml.h:21 ../hacks/config/rdbomb.xml.h:21
+#: ../hacks/config/rd-bomb.xml.h:21
msgid "Diffusion"
msgstr ""
#. #### default is wrong
-#: ../hacks/config/rd-bomb.xml.h:23 ../hacks/config/rdbomb.xml.h:23
+#: ../hacks/config/rd-bomb.xml.h:23
msgid "Seed radius"
msgstr ""
-#: ../hacks/config/rd-bomb.xml.h:24 ../hacks/config/rdbomb.xml.h:24
+#: ../hacks/config/rd-bomb.xml.h:24
msgid ""
"Reaction-diffusion: draws a grid of growing square-like shapes that, once "
"they overtake each other, react in unpredictable ways. Written by Scott "
@@ -8282,6 +9250,36 @@ msgstr ""
msgid "An asteroid field zooms by. Written by Jamie Zawinski; 1992."
msgstr ""
+#: ../hacks/config/romanboy.xml.h:1
+msgid "Roman Boy"
+msgstr ""
+
+#: ../hacks/config/romanboy.xml.h:5
+msgid "Order of the surface"
+msgstr ""
+
+#: ../hacks/config/romanboy.xml.h:7
+msgid "Deform the projective plane"
+msgstr ""
+
+#: ../hacks/config/romanboy.xml.h:13
+msgid "1000.0"
+msgstr ""
+
+#: ../hacks/config/romanboy.xml.h:45
+#, no-c-format
+msgid ""
+"A 3D immersion of the real projective plane that smoothly deforms between "
+"the Roman surface and the Boy surface. You can walk on the surface of the "
+"real projective plane or rotate it in 3D. Furthermore, it is possible to "
+"smoothly deform the real projective plane between the Roman surface and the "
+"Boy surface while turning it or walking on it. Inspired by François Apéry's "
+"book \"Models of the Real Projective Plane\", Vieweg, 1987. https://en."
+"wikipedia.org/wiki/Boy%27s_surface https://en.wikipedia.org/wiki/"
+"Roman_surface http://mathworld.wolfram.com/BoySurface.html http://mathworld."
+"wolfram.com/RomanSurface.html Written by Carsten Steger; 2014."
+msgstr ""
+
#: ../hacks/config/rorschach.xml.h:1
msgid "Rorschach"
msgstr ""
@@ -8296,8 +9294,8 @@ msgstr ""
#: ../hacks/config/rorschach.xml.h:12
msgid ""
-"Inkblot patterns via a reflected random walk. http://en.wikipedia.org/wiki/"
-"Rorschach_inkblot_test http://en.wikipedia.org/wiki/Random_walk Written by "
+"Inkblot patterns via a reflected random walk. https://en.wikipedia.org/wiki/"
+"Rorschach_inkblot_test https://en.wikipedia.org/wiki/Random_walk Written by "
"Jamie Zawinski; 1992."
msgstr ""
@@ -8305,11 +9303,6 @@ msgstr ""
msgid "Rotor"
msgstr ""
-#: ../hacks/config/rotor.xml.h:6 ../hacks/config/skytentacles.xml.h:6
-#: ../hacks/config/wander.xml.h:9
-msgid "Length"
-msgstr ""
-
#: ../hacks/config/rotor.xml.h:14
msgid ""
"This screen saver was removed from the XScreenSaver distribution as of "
@@ -8318,34 +9311,39 @@ msgid ""
msgstr ""
#: ../hacks/config/rotzoomer.xml.h:1
-msgid "RotZoomer"
+msgid "Rot Zoomer"
msgstr ""
#: ../hacks/config/rotzoomer.xml.h:8
msgid "Rectangle count"
msgstr ""
-#: ../hacks/config/rotzoomer.xml.h:9
+#: ../hacks/config/rotzoomer.xml.h:10
msgid "Stationary rectangles"
msgstr ""
-#: ../hacks/config/rotzoomer.xml.h:10
+#: ../hacks/config/rotzoomer.xml.h:11
#, fuzzy
msgid "Wandering rectangles"
msgstr "標準"
-#: ../hacks/config/rotzoomer.xml.h:11
+#: ../hacks/config/rotzoomer.xml.h:12
msgid "Sweeping arcs"
msgstr ""
-#: ../hacks/config/rotzoomer.xml.h:12
+#: ../hacks/config/rotzoomer.xml.h:13
+#, fuzzy
+msgid "Rotating discs"
+msgstr "設定"
+
+#: ../hacks/config/rotzoomer.xml.h:14
msgid "Animate"
msgstr ""
-#: ../hacks/config/rotzoomer.xml.h:14
+#: ../hacks/config/rotzoomer.xml.h:16
msgid ""
"Distorts an image by rotating and scaling random sections of it. Written by "
-"Claudio Matsuoka; 2001."
+"Claudio Matsuoka and Jamie Zawinski; 2001."
msgstr ""
#: ../hacks/config/rubik.xml.h:1
@@ -8360,18 +9358,18 @@ msgstr ""
#, no-c-format
msgid ""
"A Rubik's Cube that repeatedly shuffles and solves itself. See also the "
-"\"GLSnake\" and \"Cube21\" screen savers. http://en.wikipedia.org/wiki/Rubik"
+"\"GLSnake\" and \"Cube21\" screen savers. https://en.wikipedia.org/wiki/Rubik"
"%27s_Cube Written by Marcelo Vianna; 1997."
msgstr ""
#: ../hacks/config/rubikblocks.xml.h:1
-msgid "RubikBlocks"
+msgid "Rubik Blocks"
msgstr ""
#: ../hacks/config/rubikblocks.xml.h:21
msgid ""
"The \"Rubik's Mirror Blocks\" puzzle. See also the \"Rubik\", \"Cube21\", "
-"and \"GLSnake\" screen savers. http://en.wikipedia.org/wiki/"
+"and \"GLSnake\" screen savers. https://en.wikipedia.org/wiki/"
"Combination_puzzles#Irregular_cuboids Written by Vasek Potocek; 2009."
msgstr ""
@@ -8395,8 +9393,49 @@ msgstr ""
msgid "Textured balls spinning like crazy. Written by Eric Lassauge; 2002."
msgstr ""
+#: ../hacks/config/scooter.xml.h:1
+msgid "Scooter"
+msgstr ""
+
+#: ../hacks/config/scooter.xml.h:5
+msgid "Very slow"
+msgstr ""
+
+#: ../hacks/config/scooter.xml.h:6
+#, fuzzy
+msgid "Boat Speed"
+msgstr "表示モード"
+
+#: ../hacks/config/scooter.xml.h:7
+msgid "Very fast"
+msgstr ""
+
+#: ../hacks/config/scooter.xml.h:9
+#, fuzzy
+msgid "Number of doors"
+msgstr "色の数"
+
+#: ../hacks/config/scooter.xml.h:10
+msgid "40"
+msgstr ""
+
+#: ../hacks/config/scooter.xml.h:13
+msgid "200"
+msgstr ""
+
+#: ../hacks/config/scooter.xml.h:16
+#, fuzzy
+msgid "Colorful"
+msgstr "色"
+
+#: ../hacks/config/scooter.xml.h:18
+msgid ""
+"Zooming down a tunnel in a star field. Originally an Amiga hack. Written by "
+"Sven Thoennissen; 2001. Ported by EoflaOE; 2019."
+msgstr ""
+
#: ../hacks/config/shadebobs.xml.h:1
-msgid "ShadeBobs"
+msgid "Shade Bobs"
msgstr ""
#: ../hacks/config/shadebobs.xml.h:17
@@ -8417,23 +9456,23 @@ msgstr ""
#: ../hacks/config/sierpinski.xml.h:14
msgid ""
"The 2D Sierpinski triangle fractal. See also the \"Sierpinski3D\" screen "
-"saver. http://en.wikipedia.org/wiki/Sierpinski_triangle Written by Desmond "
+"saver. https://en.wikipedia.org/wiki/Sierpinski_triangle Written by Desmond "
"Daignault; 1997."
msgstr ""
#: ../hacks/config/sierpinski3d.xml.h:1
-msgid "Sierpinski3D"
+msgid "Sierpinski 3D"
msgstr ""
#: ../hacks/config/sierpinski3d.xml.h:11
msgid ""
-"The recursive Sierpinski tetrahedron fractal. http://en.wikipedia.org/wiki/"
+"The recursive Sierpinski tetrahedron fractal. https://en.wikipedia.org/wiki/"
"Sierpinski_triangle#Analogs_in_higher_dimension Written by Jamie Zawinski "
"and Tim Robinson; 1999."
msgstr ""
#: ../hacks/config/skytentacles.xml.h:1
-msgid "SkyTentacles"
+msgid "Sky Tentacles"
msgstr ""
#: ../hacks/config/skytentacles.xml.h:12
@@ -8445,14 +9484,12 @@ msgid "Wiggliness"
msgstr ""
#: ../hacks/config/skytentacles.xml.h:19
-#, fuzzy
msgid "X resolution"
-msgstr "説明"
+msgstr "X軸解像度"
#: ../hacks/config/skytentacles.xml.h:20
-#, fuzzy
msgid "Y resolution"
-msgstr "説明"
+msgstr "Y軸解像度"
#: ../hacks/config/skytentacles.xml.h:21
msgid "Draw skin"
@@ -8473,8 +9510,9 @@ msgid ""
msgstr ""
#: ../hacks/config/slidescreen.xml.h:1
-msgid "SlideScreen"
-msgstr ""
+#, fuzzy
+msgid "Slide Screen"
+msgstr "ブランク・スクリーン"
#: ../hacks/config/slidescreen.xml.h:6
msgid "Pause"
@@ -8491,7 +9529,7 @@ msgstr ""
#: ../hacks/config/slidescreen.xml.h:19
msgid ""
"A variant on a \"fifteen puzzle\", operating on the screen or an image. It "
-"divides the image into a grid and randomly shuffles the squares. http://en."
+"divides the image into a grid and randomly shuffles the squares. https://en."
"wikipedia.org/wiki/Fifteen_puzzle Written by Jamie Zawinski; 1994."
msgstr ""
@@ -8535,9 +9573,8 @@ msgid "Simulation (don't ping)"
msgstr ""
#: ../hacks/config/sonar.xml.h:22
-#, fuzzy
msgid "Font size"
-msgstr "インストールされていません"
+msgstr "フォントサイズ"
#: ../hacks/config/sonar.xml.h:27
msgid "Simulation team A name"
@@ -8568,13 +9605,13 @@ msgid ""
"A sonar display pings (get it?) the hosts on your local network, and plots "
"their distance (response time) from you. The three rings represent ping "
"times of approximately 2.5, 70 and 2,000 milliseconds respectively. "
-"Alternately, it can run a simulation that doesn't involve hosts. http://en."
+"Alternately, it can run a simulation that doesn't involve hosts. https://en."
"wikipedia.org/wiki/Ping#History Written by Jamie Zawinski and Stephen "
"Martin; 1998."
msgstr ""
#: ../hacks/config/speedmine.xml.h:1
-msgid "SpeedMine"
+msgid "Speed Mine"
msgstr ""
#: ../hacks/config/speedmine.xml.h:6
@@ -8623,6 +9660,61 @@ msgid ""
"and Jamie Zawinski; 1982, 1997."
msgstr ""
+#: ../hacks/config/sphereeversion.xml.h:1
+msgid "Sphere Eversion"
+msgstr ""
+
+#: ../hacks/config/sphereeversion.xml.h:5
+#, fuzzy
+msgid "Random surface order"
+msgstr "ランダムなスクリーンセーバー"
+
+#: ../hacks/config/sphereeversion.xml.h:9
+msgid "5"
+msgstr ""
+
+#: ../hacks/config/sphereeversion.xml.h:15
+msgid "Parallel bands"
+msgstr ""
+
+#: ../hacks/config/sphereeversion.xml.h:16
+msgid "Meridian bands"
+msgstr ""
+
+#: ../hacks/config/sphereeversion.xml.h:17
+#, fuzzy
+msgid "Random graticule"
+msgstr "ランダムなスクリーンセーバー"
+
+#: ../hacks/config/sphereeversion.xml.h:18
+msgid "With graticule"
+msgstr ""
+
+#: ../hacks/config/sphereeversion.xml.h:19
+msgid "Without graticule"
+msgstr ""
+
+#: ../hacks/config/sphereeversion.xml.h:22
+#, fuzzy
+msgid "Parallel colors"
+msgstr "色の数"
+
+#: ../hacks/config/sphereeversion.xml.h:23
+#, fuzzy
+msgid "Meridian colors"
+msgstr "色の数"
+
+#: ../hacks/config/sphereeversion.xml.h:33
+msgid ""
+"Turns a sphere inside out: a smooth deformation (homotopy). During the "
+"eversion, the deformed sphere is allowed to intersect itself transversally, "
+"however, no creases or pinch points occur. Inspired by the following paper: "
+"Adam Bednorz, Witold Bednorz: \"Analytic sphere eversion using ruled surfaces"
+"\", Differential Geometry and its Applications 64:59-79, 2019. https://en."
+"wikipedia.org/wiki/Sphere_eversion https://mathworld.wolfram.com/"
+"SphereEversion.html Written by Carsten Steger; 2020."
+msgstr ""
+
#: ../hacks/config/spheremonics.xml.h:1
msgid "Spheremonics"
msgstr ""
@@ -8636,7 +9728,7 @@ msgid ""
"These closed objects are commonly called spherical harmonics, although they "
"are only remotely related to the mathematical definition found in the "
"solution to certain wave functions, most notably the eigenfunctions of "
-"angular momentum operators. http://en.wikipedia.org/wiki/"
+"angular momentum operators. https://en.wikipedia.org/wiki/"
"Spherical_harmonics#Visualization_of_the_spherical_harmonics Written by Paul "
"Bourke and Jamie Zawinski; 2002."
msgstr ""
@@ -8648,10 +9740,50 @@ msgstr ""
#: ../hacks/config/spiral.xml.h:12
msgid ""
"This screen saver was removed from the XScreenSaver distribution as of "
-"version 5.08. Moving circular moire patterns. Written by Peter "
+"version 5.08. Moving circular moiré patterns. Written by Peter "
"Schmitzberger; 1997."
msgstr ""
+#: ../hacks/config/splitflap.xml.h:1
+msgid "Split-Flap"
+msgstr ""
+
+#: ../hacks/config/splitflap.xml.h:10
+#, fuzzy
+msgid "Display text"
+msgstr "表示モード"
+
+#: ../hacks/config/splitflap.xml.h:11
+msgid "Display 12-hour clock"
+msgstr ""
+
+#: ../hacks/config/splitflap.xml.h:12
+msgid "Display 24-hour clock"
+msgstr ""
+
+#: ../hacks/config/splitflap.xml.h:26
+msgid ""
+"Simulates a split-flap display, an old style of electromechanical sign as "
+"seen in airports and train stations, and commonly used in alarm clocks in "
+"the 1960s and 1970s. https://en.wikipedia.org/wiki/Split-flap_display "
+"https://en.wikipedia.org/wiki/Flip_clock Written by Jamie Zawinski; 2015."
+msgstr ""
+
+#: ../hacks/config/splodesic.xml.h:1
+msgid "Splodesic"
+msgstr ""
+
+#: ../hacks/config/splodesic.xml.h:6
+#, fuzzy
+msgid "Eruption frequency"
+msgstr "説明"
+
+#: ../hacks/config/splodesic.xml.h:12
+msgid ""
+"A geodesic sphere experiences a series of eruptions. Written by Jamie "
+"Zawinski; 2016."
+msgstr ""
+
#: ../hacks/config/spotlight.xml.h:1
msgid "Spotlight"
msgstr ""
@@ -8678,8 +9810,8 @@ msgstr ""
#, no-c-format
msgid ""
"Slinky-like creatures walk down an infinite staircase and occasionally "
-"explode! http://en.wikipedia.org/wiki/Slinky http://en.wikipedia.org/wiki/Q"
-"%2Abert http://en.wikipedia.org/wiki/Marble_Madness Written by Ed Mackey; "
+"explode! https://en.wikipedia.org/wiki/Slinky https://en.wikipedia.org/wiki/Q"
+"%2Abert https://en.wikipedia.org/wiki/Marble_Madness Written by Ed Mackey; "
"1997."
msgstr ""
@@ -8715,7 +9847,7 @@ msgstr ""
#: ../hacks/config/stairs.xml.h:6
msgid ""
-"Escher's infinite staircase. http://en.wikipedia.org/wiki/"
+"Escher's infinite staircase. https://en.wikipedia.org/wiki/"
"Maurits_Cornelis_Escher Written by Marcelo Vianna and Jamie Zawinski; 1998."
msgstr ""
@@ -8740,7 +9872,7 @@ msgid ""
msgstr ""
#: ../hacks/config/starwars.xml.h:1
-msgid "StarWars"
+msgid "Star Wars"
msgstr ""
#: ../hacks/config/starwars.xml.h:2
@@ -8784,13 +9916,13 @@ msgstr ""
#: ../hacks/config/starwars.xml.h:19
msgid ""
"A stream of text slowly scrolling into the distance at an angle, over a star "
-"field, like at the beginning of the movie of the same name. http://en."
+"field, like at the beginning of the movie of the same name. https://en."
"wikipedia.org/wiki/Star_Wars_opening_crawl Written by Jamie Zawinski and "
-"Claudio Matauoka; 2001."
+"Claudio Matsuoka; 2001."
msgstr ""
#: ../hacks/config/stonerview.xml.h:1
-msgid "StonerView"
+msgid "Stoner View"
msgstr ""
#: ../hacks/config/stonerview.xml.h:6
@@ -8810,21 +9942,42 @@ msgid "Strange"
msgstr ""
#: ../hacks/config/strange.xml.h:5
-msgid "1k"
+msgid "Curviness"
msgstr ""
#: ../hacks/config/strange.xml.h:6
-#, fuzzy
-msgid "Number of points"
-msgstr "色の数"
+msgid "1k"
+msgstr ""
#: ../hacks/config/strange.xml.h:7
-msgid "100k"
+msgid "Number of points"
+msgstr "点の数"
+
+#: ../hacks/config/strange.xml.h:8
+msgid "500k"
+msgstr ""
+
+#: ../hacks/config/strange.xml.h:10 ../hacks/config/voronoi.xml.h:9
+msgid "Point size"
+msgstr ""
+
+#: ../hacks/config/strange.xml.h:13
+#, no-c-format
+msgid "10%"
+msgstr ""
+
+#: ../hacks/config/strange.xml.h:16
+#, no-c-format
+msgid "400%"
msgstr ""
-#: ../hacks/config/strange.xml.h:12
+#: ../hacks/config/strange.xml.h:17
+msgid "Brightness"
+msgstr ""
+
+#: ../hacks/config/strange.xml.h:24
msgid ""
-"Strange attractors: a swarm of dots swoops and twists around. http://en."
+"Strange attractors: a swarm of dots swoops and twists around. https://en."
"wikipedia.org/wiki/Attractor#Strange_attractor Written by Massimino Pascal; "
"1997."
msgstr ""
@@ -8901,7 +10054,7 @@ msgid "Kuen Surface"
msgstr ""
#: ../hacks/config/surfaces.xml.h:12
-msgid "Moebius Strip"
+msgid "Möbius Strip"
msgstr ""
#: ../hacks/config/surfaces.xml.h:13
@@ -8937,9 +10090,8 @@ msgid "Corkscrew Surface"
msgstr ""
#: ../hacks/config/surfaces.xml.h:21
-#, fuzzy
msgid "Random Display Mode"
-msgstr "表示モード"
+msgstr "ランダムな表示モード"
#: ../hacks/config/surfaces.xml.h:24
msgid "Line Loops"
@@ -8947,12 +10099,12 @@ msgstr ""
#: ../hacks/config/surfaces.xml.h:28
msgid ""
-"Parametric surfaces. http://mathworld.wolfram.com/DinisSurface.html http://"
+"Parametric surfaces. http://mathworld.wolfram.com/DinisSurface.html https://"
"en.wikipedia.org/wiki/Enneper_surface http://mathworld.wolfram.com/"
"EnnepersMinimalSurface.html http://mathworld.wolfram.com/KuenSurface.html "
-"http://en.wikipedia.org/wiki/Moebius_strip http://mathworld.wolfram.com/"
+"https://en.wikipedia.org/wiki/Moebius_strip http://mathworld.wolfram.com/"
"Seashell.html http://mathworld.wolfram.com/SwallowtailCatastrophe.html "
-"http://mathworld.wolfram.com/BohemianDome.html http://en.wikipedia.org/wiki/"
+"http://mathworld.wolfram.com/BohemianDome.html https://en.wikipedia.org/wiki/"
"Whitney_umbrella http://mathworld.wolfram.com/PlueckersConoid.html http://"
"mathworld.wolfram.com/HennebergsMinimalSurface.html http://mathworld.wolfram."
"com/CatalansSurface.html http://mathworld.wolfram.com/CorkscrewSurface.html "
@@ -9012,23 +10164,20 @@ msgid "Tangram"
msgstr ""
#: ../hacks/config/tangram.xml.h:9
-#, fuzzy
msgid "X rotation"
-msgstr "フェードする時間: "
+msgstr "X軸回転"
#: ../hacks/config/tangram.xml.h:11
-#, fuzzy
msgid "Y rotation"
-msgstr "フェードする時間: "
+msgstr "Y軸回転"
#: ../hacks/config/tangram.xml.h:12
-#, fuzzy
msgid "Z rotation"
-msgstr "フェードする時間: "
+msgstr "Z軸回転"
#: ../hacks/config/tangram.xml.h:17
msgid ""
-"Solves tangram puzzles. http://en.wikipedia.org/wiki/Tangram Written by "
+"Solves tangram puzzles. https://en.wikipedia.org/wiki/Tangram Written by "
"Jeremy English; 2005."
msgstr ""
@@ -9044,21 +10193,46 @@ msgstr "0.1秒間"
msgid "4 seconds"
msgstr "4秒間"
+#: ../hacks/config/tessellimage.xml.h:14
+msgid "Delaunay or voronoi"
+msgstr ""
+
#: ../hacks/config/tessellimage.xml.h:15
+msgid "Delaunay"
+msgstr ""
+
+#: ../hacks/config/tessellimage.xml.h:16 ../hacks/config/voronoi.xml.h:1
+msgid "Voronoi"
+msgstr ""
+
+#: ../hacks/config/tessellimage.xml.h:18
msgid "Outline triangles"
msgstr ""
-#: ../hacks/config/tessellimage.xml.h:17
+#: ../hacks/config/tessellimage.xml.h:20
msgid ""
-"Converts an image to triangles using Delaunay tessellation, and animates the "
-"result at various depths. More triangles are allocated to visually complex "
-"parts of the image. This is accomplished by first computing the first "
-"derivative of the image: the distance between each pixel and its neighbors "
-"(which is essentially edge detection or embossing). Then the Delaunay "
-"control points are chosen by selecting those pixels whose distance value is "
-"above a certain threshold: those are the pixels that have the largest change "
-"in color/brightness. http://en.wikipedia.org/wiki/Delaunay_triangulation "
-"Written by Jamie Zawinski; 2014."
+"Converts an image to triangles using Delaunay tessellation, or to polygons "
+"using Voronoi tesselation, and animates the result at various depths. More "
+"polygons are allocated to visually complex parts of the image. This is "
+"accomplished by first computing the first derivative of the image: the "
+"distance between each pixel and its neighbors (which is essentially edge "
+"detection or embossing). Then the Delaunay or Voronoi control points are "
+"chosen by selecting those pixels whose distance value is above a certain "
+"threshold: those are the pixels that have the largest change in color/"
+"brightness. https://en.wikipedia.org/wiki/Delaunay_triangulation https://en."
+"wikipedia.org/wiki/Voronoi_diagram https://en.wikipedia.org/wiki/"
+"Tessellation Written by Jamie Zawinski; 2014."
+msgstr ""
+
+#: ../hacks/config/testx11.xml.h:1
+#, fuzzy
+msgid "Test X11"
+msgstr "最適"
+
+#: ../hacks/config/testx11.xml.h:3
+msgid ""
+"Test platform for JWXYZ - the X11 compatibility shim for OS X and iOS. End "
+"users shouldn't normally see this one. Written by Dave Odell; 2015."
msgstr ""
#: ../hacks/config/thornbird.xml.h:1
@@ -9072,7 +10246,7 @@ msgid ""
msgstr ""
#: ../hacks/config/timetunnel.xml.h:1
-msgid "TimeTunnel"
+msgid "Time Tunnel"
msgstr ""
#: ../hacks/config/timetunnel.xml.h:2
@@ -9097,18 +10271,17 @@ msgstr ""
#: ../hacks/config/timetunnel.xml.h:9
msgid ""
-"An animation similar to the opening and closing effects on the Dr. Who TV "
-"show. Written by Sean P. Brennan; 2005."
+"An animation similar to the title sequence of Dr. Who in the 70s. Written by "
+"Sean P. Brennan; 2005."
msgstr ""
#: ../hacks/config/topblock.xml.h:1
-msgid "TopBlock"
+msgid "Top Block"
msgstr ""
#: ../hacks/config/topblock.xml.h:6
-#, fuzzy
msgid "Drop speed"
-msgstr "表示モード"
+msgstr "落下速度"
#: ../hacks/config/topblock.xml.h:9
msgid "Carpet size"
@@ -9159,7 +10332,7 @@ msgid ""
msgstr ""
#: ../hacks/config/tronbit.xml.h:1
-msgid "TronBit"
+msgid "Tron Bit"
msgstr ""
#: ../hacks/config/tronbit.xml.h:12
@@ -9167,9 +10340,9 @@ msgid ""
"The character \"Bit\" from the film, \"Tron\". The \"yes\" state is a "
"tetrahedron; the \"no\" state is the second stellation of an icosahedron; "
"and the idle state oscillates between a small triambic icosahedron and the "
-"compound of an icosahedron and a dodecahedron. http://en.wikipedia.org/wiki/"
-"List_of_Tron_characters#Bit http://en.wikipedia.org/wiki/Uniform_polyhedra "
-"http://en.wikipedia.org/wiki/Stellation Written by Jamie Zawinski; 2011."
+"compound of an icosahedron and a dodecahedron. https://en.wikipedia.org/wiki/"
+"List_of_Tron_characters#Bit https://en.wikipedia.org/wiki/Uniform_polyhedra "
+"https://en.wikipedia.org/wiki/Stellation Written by Jamie Zawinski; 2011."
msgstr ""
#: ../hacks/config/truchet.xml.h:1
@@ -9178,7 +10351,7 @@ msgstr ""
#: ../hacks/config/truchet.xml.h:7
msgid ""
-"Line- and arc-based truchet patterns that tile the screen. http://en."
+"Line- and arc-based truchet patterns that tile the screen. https://en."
"wikipedia.org/wiki/Tessellation Written by Adrian Likins; 1998."
msgstr ""
@@ -9208,15 +10381,69 @@ msgid ""
"2002."
msgstr ""
+#: ../hacks/config/unicrud.xml.h:1
+msgid "Unicrud"
+msgstr ""
+
+#: ../hacks/config/unicrud.xml.h:12
+#, fuzzy
+msgid "Display everything"
+msgstr "表示モード"
+
+#: ../hacks/config/unicrud.xml.h:13
+#, fuzzy
+msgid "Display Latin1"
+msgstr "表示モード"
+
+#: ../hacks/config/unicrud.xml.h:14
+#, fuzzy
+msgid "Display simple characters"
+msgstr "画像を表示する"
+
+#: ../hacks/config/unicrud.xml.h:15
+#, fuzzy
+msgid "Display mathematical symbols"
+msgstr "日時を表示する"
+
+#: ../hacks/config/unicrud.xml.h:16
+#, fuzzy
+msgid "Display emoticons"
+msgstr "システム情報を表示する"
+
+#: ../hacks/config/unicrud.xml.h:17
+#, fuzzy
+msgid "Display hieroglyphs"
+msgstr "画像を表示する"
+
+#: ../hacks/config/unicrud.xml.h:18
+msgid ""
+"Chooses a random Unicode character and displays it full screen, along with "
+"some information about it. https://en.wikipedia.org/wiki/Unicode Written by "
+"Jamie Zawinski; 2016."
+msgstr ""
+
#: ../hacks/config/unknownpleasures.xml.h:1
-msgid "UnknownPleasures"
+msgid "Unknown Pleasures"
msgstr ""
#: ../hacks/config/unknownpleasures.xml.h:12
+msgid "Amplitude"
+msgstr ""
+
+#: ../hacks/config/unknownpleasures.xml.h:14
msgid "Orthographic Projection"
msgstr ""
-#: ../hacks/config/unknownpleasures.xml.h:16
+#: ../hacks/config/unknownpleasures.xml.h:15
+msgid "Buzz"
+msgstr ""
+
+#: ../hacks/config/unknownpleasures.xml.h:18
+#, fuzzy
+msgid "Mask image"
+msgstr "デスクトップ画像を操作対象にする"
+
+#: ../hacks/config/unknownpleasures.xml.h:20
#, no-c-format
msgid ""
"PSR B1919+21 (AKA CP 1919) was the first pulsar ever discovered: a spinning "
@@ -9225,10 +10452,10 @@ msgid ""
"and later in The Cambridge Encyclopedia of Astronomy in 1977, where it was "
"seen by Stephen Morris, the drummer of Joy Division, and was consequently "
"appropriated by Peter Saville for the cover of the band's album \"Unknown "
-"Pleasures\". http://en.wikipedia.org/wiki/Pulsar http://en.wikipedia.org/"
-"wiki/PSR_B1919%2B21 http://en.wikipedia.org/wiki/Unknown_Pleasures http://en."
-"wikipedia.org/wiki/Peter_Saville_%28graphic_designer%29 http://en.wikipedia."
-"org/wiki/Joy_Division Written by Jamie Zawinski; 2013."
+"Pleasures\". https://en.wikipedia.org/wiki/Pulsar https://en.wikipedia.org/"
+"wiki/PSR_B1919%2B21 https://en.wikipedia.org/wiki/Unknown_Pleasures https://"
+"en.wikipedia.org/wiki/Peter_Saville_%28graphic_designer%29 https://en."
+"wikipedia.org/wiki/Joy_Division Written by Jamie Zawinski; 2013."
msgstr ""
#: ../hacks/config/vermiculate.xml.h:1
@@ -9239,8 +10466,18 @@ msgstr ""
msgid "Squiggly worm-like paths. Written by Tyler Pierce; 2001."
msgstr ""
+#: ../hacks/config/vfeedback.xml.h:1
+msgid "VFeedback"
+msgstr ""
+
+#: ../hacks/config/vfeedback.xml.h:10
+msgid ""
+"Simulates video feedback: pointing a video camera at an NTSC television. "
+"Written by Jamie Zawinski; 2018."
+msgstr ""
+
#: ../hacks/config/vidwhacker.xml.h:1
-msgid "VidWhacker"
+msgid "Vid Whacker"
msgstr ""
#: ../hacks/config/vidwhacker.xml.h:2
@@ -9267,6 +10504,21 @@ msgid ""
"Written by Jamie Zawinski; 1998."
msgstr ""
+#: ../hacks/config/vigilance.xml.h:1
+msgid "Vigilance"
+msgstr ""
+
+#: ../hacks/config/vigilance.xml.h:9
+msgid "Number of cameras"
+msgstr "カメラの数"
+
+#: ../hacks/config/vigilance.xml.h:11
+msgid ""
+"Security cameras keep careful track of their surroundings. You can trust "
+"them. Everything is completely under control. Written by Jamie Zawinski; "
+"2017."
+msgstr ""
+
#: ../hacks/config/vines.xml.h:1
msgid "Vines"
msgstr ""
@@ -9278,14 +10530,6 @@ msgid ""
"patterns. Written by Tracy Camp and David Hansen; 1997."
msgstr ""
-#: ../hacks/config/voronoi.xml.h:1
-msgid "Voronoi"
-msgstr ""
-
-#: ../hacks/config/voronoi.xml.h:9
-msgid "Point size"
-msgstr ""
-
#: ../hacks/config/voronoi.xml.h:10
msgid "50 pixels"
msgstr ""
@@ -9308,8 +10552,8 @@ msgid ""
"existing points also wander around. There are a set of control points on the "
"plane, each at the center of a colored cell. Every pixel within that cell is "
"closer to that cell's control point than to any other control point. That is "
-"what determines the cell's shapes. http://en.wikipedia.org/wiki/"
-"Voronoi_diagram http://en.wikipedia.org/wiki/Tessellation Written by Jamie "
+"what determines the cell's shapes. https://en.wikipedia.org/wiki/"
+"Voronoi_diagram https://en.wikipedia.org/wiki/Tessellation Written by Jamie "
"Zawinski; 2007."
msgstr ""
@@ -9319,27 +10563,26 @@ msgstr ""
#: ../hacks/config/wander.xml.h:14
msgid ""
-"A colorful random-walk. http://en.wikipedia.org/wiki/Random_walk Written by "
+"A colorful random-walk. https://en.wikipedia.org/wiki/Random_walk Written by "
"Rick Campbell; 1999."
msgstr ""
#: ../hacks/config/webcollage.xml.h:1
-msgid "WebCollage"
-msgstr ""
+#, fuzzy
+msgid "Web Collage"
+msgstr "カラーマップ"
#: ../hacks/config/webcollage.xml.h:3
msgid "Delay between images"
msgstr ""
#: ../hacks/config/webcollage.xml.h:4
-#, fuzzy
msgid "30 secs"
-msgstr "秒間"
+msgstr "30秒間"
#: ../hacks/config/webcollage.xml.h:5
-#, fuzzy
msgid "2 secs"
-msgstr "秒間"
+msgstr "2秒間"
#: ../hacks/config/webcollage.xml.h:6
msgid "Network timeout"
@@ -9361,14 +10604,14 @@ msgid ""
"of the pages returned. WARNING: THE INTERNET SOMETIMES CONTAINS PORNOGRAPHY. "
"The Internet being what it is, absolutely anything might show up in the "
"collage including -- quite possibly -- pornography, or even nudity. Please "
-"act accordingly. See also http://www.jwz.org/webcollage/ NOTE: Webcollage on "
-"Fedora does not connect to internet by default and uses image files on your "
-"local disk. If you want webcollage to search for image files on net, use "
-"webcollage.original . Written by Jamie Zawinski; 1999."
+"act accordingly. See also https://www.jwz.org/webcollage/ NOTE: Webcollage "
+"on Fedora does not connect to internet by default and uses image files on "
+"your local disk. If you want webcollage to search for image files on net, "
+"use webcollage.original . Written by Jamie Zawinski; 1999."
msgstr ""
#: ../hacks/config/whirlwindwarp.xml.h:1
-msgid "WhirlWindWarp"
+msgid "Whirlwind Warp"
msgstr ""
#: ../hacks/config/whirlwindwarp.xml.h:6
@@ -9501,7 +10744,7 @@ msgid ""
msgstr ""
#: ../hacks/config/winduprobot.xml.h:1
-msgid "WindupRobot"
+msgid "Windup Robot"
msgstr ""
#: ../hacks/config/winduprobot.xml.h:6
@@ -9577,7 +10820,12 @@ msgstr ""
msgid "XAnalogTV"
msgstr ""
-#: ../hacks/config/xanalogtv.xml.h:9
+#: ../hacks/config/xanalogtv.xml.h:3
+#, fuzzy
+msgid "Colorbars only"
+msgstr "カラーマップ"
+
+#: ../hacks/config/xanalogtv.xml.h:10
msgid ""
"An old TV set, including artifacts like snow, bloom, distortion, ghosting, "
"and hash noise. It also simulates the TV warming up. It will cycle through "
@@ -9616,8 +10864,8 @@ msgstr ""
#: ../hacks/config/xlyap.xml.h:10
msgid ""
-"The Lyapunov exponent makes pretty fractal pictures. http://en.wikipedia.org/"
-"wiki/Lyapunov_exponent Written by Ron Record; 1997."
+"The Lyapunov exponent makes pretty fractal pictures. https://en.wikipedia."
+"org/wiki/Lyapunov_exponent Written by Ron Record; 1997."
msgstr ""
#: ../hacks/config/xmatrix.xml.h:1
@@ -9664,7 +10912,7 @@ msgstr ""
msgid ""
"The \"digital rain\" effect, as seen on the computer monitors in \"The Matrix"
"\". See also \"GLMatrix\" for a 3D rendering of the similar effect that "
-"appeared in the movie's title sequence. http://en.wikipedia.org/wiki/"
+"appeared in the movie's title sequence. https://en.wikipedia.org/wiki/"
"Matrix_digital_rain Written by Jamie Zawinski; 1999."
msgstr ""
@@ -9684,34 +10932,32 @@ msgstr ""
#: ../hacks/config/xspirograph.xml.h:10
msgid ""
-"Simulates that pen-in-nested-plastic-gears toy from your childhood. http://"
+"Simulates that pen-in-nested-plastic-gears toy from your childhood. https://"
"en.wikipedia.org/wiki/Spirograph Written by Rohit Singh; 2000."
msgstr ""
#: ../hacks/config/zoom.xml.h:8
-#, fuzzy
-msgid "X magnification"
-msgstr "画像の操作"
+msgid "X mag"
+msgstr ""
#: ../hacks/config/zoom.xml.h:9
-msgid " X border width"
+msgid " X border"
msgstr ""
#: ../hacks/config/zoom.xml.h:10
-msgid " X lens offset"
+msgid " X lens"
msgstr ""
#: ../hacks/config/zoom.xml.h:11
-#, fuzzy
-msgid "Y magnification"
-msgstr "画像の操作"
+msgid "Y mag"
+msgstr ""
#: ../hacks/config/zoom.xml.h:12
-msgid " Y border width"
+msgid " Y border"
msgstr ""
#: ../hacks/config/zoom.xml.h:13
-msgid " Y lens offset"
+msgid " Y lens"
msgstr ""
#: ../hacks/config/zoom.xml.h:14
@@ -9725,6 +10971,99 @@ msgid ""
"lenses rather than just a simple zoom. Written by James Macnicol; 2001."
msgstr ""
+#~ msgid ""
+#~ "You are running as root. This usually means that xscreensaver\n"
+#~ "was unable to contact your X server because access control is\n"
+#~ "turned on. Try running this command:\n"
+#~ "\n"
+#~ " xhost +localhost\n"
+#~ "\n"
+#~ "and then selecting `File / Restart Daemon'.\n"
+#~ "\n"
+#~ "Note that turning off access control will allow anyone logged\n"
+#~ "on to this machine to access your screen, which might be\n"
+#~ "considered a security problem. Please read the xscreensaver\n"
+#~ "manual and FAQ for more information.\n"
+#~ "\n"
+#~ "You shouldn't run X as root. Instead, you should log in as a\n"
+#~ "normal user, and `su' as necessary."
+#~ msgstr ""
+#~ "root 権限で起動中です。これは、通常アクセスコントロールが有効になっている"
+#~ "ので\n"
+#~ "XScreenSaver はお使いの X サーバと通信することが不可能になることを\n"
+#~ "意味します。次のコマンドを実行してみて下さい:\n"
+#~ "\n"
+#~ " xhost +localhost\n"
+#~ "\n"
+#~ "その後にメニューの 'ファイル - デーモンの再起動' を選択して下さい。\n"
+#~ "\n"
+#~ "アクセスコントロールを無効にすると、お使いのスクリーンに\n"
+#~ "アクセスするために誰もがこのマシンにログインできてしまいます。\n"
+#~ "これはセキュリティ問題に配慮した対策です。\n"
+#~ "詳細は XScreenSaver マニュアルと FAQ を参照して下さい。\n"
+#~ "\n"
+#~ "root 権限で X サーバを起動しないで下さい。必要であれば、\n"
+#~ "一般ユーザでログインして 'su' コマンドで代用して下さい。"
+
+#~ msgid "Never blank the screen or power down the monitor."
+#~ msgstr "スクリーンを暗くしたり、モニターの電源を落としたりしません。"
+
+#~ msgid "_Disable Screen Saver"
+#~ msgstr "セーバーを無効にする(_D)"
+
+#~ msgid "When idle or locked, blacken the screen only."
+#~ msgstr "セーバーが起動した時、ただ単にスクリーンを真っ暗にします。"
+
+#~ msgid "_Blank Screen Only"
+#~ msgstr "ブランク・スクリーンのみ(_B)"
+
+#~ msgid "When idle or locked, run the display mode selected below."
+#~ msgstr ""
+#~ "セーバーが起動した時、下のリストで選択された(一つの)モードをモニターに表"
+#~ "示します。"
+
+#~ msgid "_Only One Screen Saver"
+#~ msgstr "一つのセーバーのみ(_O)"
+
+#~ msgid ""
+#~ "When idle or locked, choose a random display mode from among the checked "
+#~ "items in the list below."
+#~ msgstr ""
+#~ "セーバーが起動した時、下のリストでチェックが入っているモードからランダムに"
+#~ "選択して、(代る代る)モニターに表示します。"
+
+#~ msgid "_Random Screen Saver"
+#~ msgstr "ランダムなセーバを用いる(_R)"
+
+#~ msgid ""
+#~ "When idle or locked, choose a random display mode from among the checked "
+#~ "items in the list below. Run that same mode on each monitor."
+#~ msgstr ""
+#~ "セーバーが起動した時、下のリストでチェックが入っているモードからランダムに"
+#~ "選択して、(代る代る)モニターに表示します。各モニターには同じモードが表示"
+#~ "されます。"
+
+#~ msgid ""
+#~ "Whether to install a private colormap when running in 8-bit mode on the "
+#~ "default Visual."
+#~ msgstr ""
+#~ "デフォルトの表示として 8-bit モードで起動する場合、個人のカラーマップをイ"
+#~ "ンストールするかどうかを選択して下さい。"
+
+#~ msgid "Install _Colormap"
+#~ msgstr "カラーマップをインストールする(_C)"
+
+#~ msgid "Fading and Colormaps"
+#~ msgstr "フェードとカラーマップ"
+
+#, fuzzy
+#~ msgid "X magnification"
+#~ msgstr "画像の操作"
+
+#, fuzzy
+#~ msgid "Y magnification"
+#~ msgstr "画像の操作"
+
#~ msgid "Couldn't find pixmap file: %s"
#~ msgstr "Pixmap ファイルが見つかりませんでした: %s"
@@ -9781,27 +11120,12 @@ msgstr ""
#~ msgid "Mode:"
#~ msgstr "モード:"
-#~ msgid "Disable Screen Saver"
-#~ msgstr "スクリーンセーバーを無効にする"
-
-#~ msgid "Blank Screen Only"
-#~ msgstr "ブランク・スクリーンのみ"
-
-#~ msgid "Only One Screen Saver"
-#~ msgstr "一つのスクリーンセーバーのみ"
-
-#~ msgid "Random Screen Saver"
-#~ msgstr "ランダムなスクリーンセーバー"
-
#~ msgid "\\/"
#~ msgstr "\\/"
#~ msgid "/\\"
#~ msgstr "/\\"
-#~ msgid "Display Modes"
-#~ msgstr "表示モード"
-
#~ msgid "Diagnostics"
#~ msgstr "診断オプション"
@@ -9830,9 +11154,6 @@ msgstr ""
#~ msgid "Display Splash Screen at Startup"
#~ msgstr "起動時にスプラッシュスクリーンを表示する"
-#~ msgid "Colormaps"
-#~ msgstr "カラーマップ"
-
#~ msgid "Install Colormap"
#~ msgstr "カラーマップをインストールする"
@@ -9889,9 +11210,6 @@ msgstr ""
#~ "このデモで要求される X の表示形式です。その表示が有効の場合はそれを使用し"
#~ "ますが、それ以外はデモを起動しません。"
-#~ msgid "Command Line:"
-#~ msgstr "コマンドライン:"
-
#~ msgid "Documentation..."
#~ msgstr "ドキュメント..."
@@ -9922,10 +11240,6 @@ msgstr ""
#~ msgstr "キャンセル"
#, fuzzy
-#~ msgid "Clip images"
-#~ msgstr "表示モード"
-
-#, fuzzy
#~ msgid "5 Seconds"
#~ msgstr "秒間"
@@ -9949,10 +11263,6 @@ msgstr ""
#~ msgstr "ON"
#, fuzzy
-#~ msgid "Test"
-#~ msgstr "最適"
-
-#, fuzzy
#~ msgid "Craggy"
#~ msgstr "グレー"
@@ -9992,3 +11302,5 @@ msgstr ""
#~ msgid "Copyright 息 1991-2002 %s"
#~ msgstr "Copyright 1991-2002 %s"
+
+
diff --git a/po/ko.po b/po/ko.po
index 216f7ed..cfb9490 100644
--- a/po/ko.po
+++ b/po/ko.po
@@ -5882,7 +5882,7 @@ msgstr "빡빡하게"
#: hacks/config/menger.xml.h:19
msgid ""
"This draws the three-dimensional variant of the recursive Menger Gasket, a "
-"cube-based fractal object analagous to the Sierpinski Tetrahedron. Written "
+"cube-based fractal object analogous to the Sierpinski Tetrahedron. Written "
"by Jamie Zawinski."
msgstr ""
diff --git a/po/nb.po b/po/nb.po
index 70d55ae..7998efe 100644
--- a/po/nb.po
+++ b/po/nb.po
@@ -5727,7 +5727,7 @@ msgstr "Menger"
#: hacks/config/menger.xml.h:19
msgid ""
"This draws the three-dimensional variant of the recursive Menger Gasket, a "
-"cube-based fractal object analagous to the Sierpinski Tetrahedron. Written "
+"cube-based fractal object analogous to the Sierpinski Tetrahedron. Written "
"by Jamie Zawinski."
msgstr ""
diff --git a/po/nl.po b/po/nl.po
index 3ab8828..5d29b6a 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -6904,7 +6904,7 @@ msgstr "Max. diepte"
#: ../hacks/config/menger.xml.h:21
msgid ""
"This draws the three-dimensional variant of the recursive Menger Gasket, a "
-"cube-based fractal object analagous to the Sierpinski Tetrahedron. "
+"cube-based fractal object analogous to the Sierpinski Tetrahedron. "
"http://en.wikipedia.org/wiki/Menger_sponge "
"http://en.wikipedia.org/wiki/Sierpinski_carpet Written by Jamie Zawinski; "
"2001."
diff --git a/po/pl.po b/po/pl.po
index f656d08..37bff59 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -5950,7 +5950,7 @@ msgstr "Długi"
#, fuzzy
msgid ""
"This draws the three-dimensional variant of the recursive Menger Gasket, a "
-"cube-based fractal object analagous to the Sierpinski Tetrahedron. Written "
+"cube-based fractal object analogous to the Sierpinski Tetrahedron. Written "
"by Jamie Zawinski."
msgstr ""
"Rysuje w dwóch wymiarach rekurencyjnie fraktal - trójkąt Sierpińskiego. "
diff --git a/po/pt.po b/po/pt.po
index 64cd5fb..c702cf6 100644
--- a/po/pt.po
+++ b/po/pt.po
@@ -6239,7 +6239,7 @@ msgstr "Menger"
#: hacks/config/menger.xml.h:19
msgid ""
"This draws the three-dimensional variant of the recursive Menger Gasket, a "
-"cube-based fractal object analagous to the Sierpinski Tetrahedron. Written "
+"cube-based fractal object analogous to the Sierpinski Tetrahedron. Written "
"by Jamie Zawinski."
msgstr ""
"Desenha a variante tri-dimensional do Menger Gasket recursivo, um objecto "
diff --git a/po/pt_BR.po b/po/pt_BR.po
index 5ffb11f..1b3e289 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -6790,7 +6790,7 @@ msgid "Menger"
msgstr "Menger"
#: ../hacks/config/menger.xml.h:18
-msgid "This draws the three-dimensional variant of the recursive Menger Gasket, a cube-based fractal object analagous to the Sierpinski Tetrahedron. http://en.wikipedia.org/wiki/Menger_sponge http://en.wikipedia.org/wiki/Sierpinski_carpet Written by Jamie Zawinski; 2001."
+msgid "This draws the three-dimensional variant of the recursive Menger Gasket, a cube-based fractal object analogous to the Sierpinski Tetrahedron. http://en.wikipedia.org/wiki/Menger_sponge http://en.wikipedia.org/wiki/Sierpinski_carpet Written by Jamie Zawinski; 2001."
msgstr ""
#: ../hacks/config/metaballs.xml.h:2
diff --git a/po/ru.po b/po/ru.po
index 7ac8b8f..5dad7bf 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -6749,7 +6749,7 @@ msgstr "Максимальная глубина"
#: ../hacks/config/menger.xml.h:21
msgid ""
-"The Menger Gasket is a cube-based recursive fractal object analagous to the "
+"The Menger Gasket is a cube-based recursive fractal object analogous to the "
"Sierpinski Tetrahedron. https://en.wikipedia.org/wiki/Menger_sponge "
"https://en.wikipedia.org/wiki/Sierpinski_carpet Written by Jamie Zawinski; "
"2001."
diff --git a/po/sk.po b/po/sk.po
index 7c71fb0..14e1385 100644
--- a/po/sk.po
+++ b/po/sk.po
@@ -5866,7 +5866,7 @@ msgstr ""
#: hacks/config/menger.xml.h:19
msgid ""
"This draws the three-dimensional variant of the recursive Menger Gasket, a "
-"cube-based fractal object analagous to the Sierpinski Tetrahedron. Written "
+"cube-based fractal object analogous to the Sierpinski Tetrahedron. Written "
"by Jamie Zawinski."
msgstr ""
diff --git a/po/sv.po b/po/sv.po
index 996322d..2fd81da 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -6141,7 +6141,7 @@ msgstr "Längre"
#: hacks/config/menger.xml.h:19
msgid ""
"This draws the three-dimensional variant of the recursive Menger Gasket, a "
-"cube-based fractal object analagous to the Sierpinski Tetrahedron. Written "
+"cube-based fractal object analogous to the Sierpinski Tetrahedron. Written "
"by Jamie Zawinski."
msgstr ""
diff --git a/po/vi.po b/po/vi.po
index a6d556c..67a798c 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -5920,7 +5920,7 @@ msgstr ""
#: hacks/config/menger.xml.h:19
msgid ""
"This draws the three-dimensional variant of the recursive Menger Gasket, a "
-"cube-based fractal object analagous to the Sierpinski Tetrahedron. Written "
+"cube-based fractal object analogous to the Sierpinski Tetrahedron. Written "
"by Jamie Zawinski."
msgstr ""
diff --git a/po/wa.po b/po/wa.po
index 6baee28..bbfd708 100644
--- a/po/wa.po
+++ b/po/wa.po
@@ -5790,7 +5790,7 @@ msgstr ""
#: hacks/config/menger.xml.h:19
msgid ""
"This draws the three-dimensional variant of the recursive Menger Gasket, a "
-"cube-based fractal object analagous to the Sierpinski Tetrahedron. Written "
+"cube-based fractal object analogous to the Sierpinski Tetrahedron. Written "
"by Jamie Zawinski."
msgstr ""
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 55051c8..80129d4 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -5991,7 +5991,7 @@ msgstr ""
#: hacks/config/menger.xml.h:19
msgid ""
"This draws the three-dimensional variant of the recursive Menger Gasket, a "
-"cube-based fractal object analagous to the Sierpinski Tetrahedron. Written "
+"cube-based fractal object analogous to the Sierpinski Tetrahedron. Written "
"by Jamie Zawinski."
msgstr ""
diff --git a/po/zh_TW.po b/po/zh_TW.po
index ef3507f..50c35c4 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -5916,7 +5916,7 @@ msgstr "Menger"
#: hacks/config/menger.xml.h:19
msgid ""
"This draws the three-dimensional variant of the recursive Menger Gasket, a "
-"cube-based fractal object analagous to the Sierpinski Tetrahedron. Written "
+"cube-based fractal object analogous to the Sierpinski Tetrahedron. Written "
"by Jamie Zawinski."
msgstr ""
diff --git a/setup.com b/setup.com
deleted file mode 100644
index 3906525..0000000
--- a/setup.com
+++ /dev/null
@@ -1,131 +0,0 @@
-$! Xscreensaver - definition of various DCL symbols
-$ set NOON
-$ set def [.HACKS]
-$ mydisk = f$trnlmn("SYS$DISK")
-$ mydir = mydisk+f$directory()
-$ abstractile :== $'mydir'abstractile
-$ anemone :== $'mydir'anemone
-$ anemotaxis :== $'mydir'anemotaxis
-$ apollonian :== $'mydir'apollonian
-$ apple2 :== $'mydir'apple2
-$ attraction :== $'mydir'attraction
-$ barcode :== $'mydir'barcode
-$ binaryring :== $'mydir'binaryring
-$ blaster :== $'mydir'blaster
-$ blitspin :== $'mydir'blitspin
-$ bouboule :== $'mydir'bouboule
-$ boxfit :== $'mydir'boxfit
-$ braid :== $'mydir'braid
-$ bsod :== $'mydir'bsod
-$ bumps :== $'mydir'bumps
-$ ccurve :== $'mydir'ccurve
-$ celtic :== $'mydir'celtic
-$ cloudlife :== $'mydir'cloudlife
-$ compass :== $'mydir'compass
-$ coral :== $'mydir'coral
-$ crystal :== $'mydir'crystal
-$ cwaves :== $'mydir'cwaves
-$ cynosure :== $'mydir'cynosure
-$ decayscreen :== $'mydir'decayscreen
-$ deco :== $'mydir'deco
-$ deluxe :== $'mydir'deluxe
-$ demon :== $'mydir'demon
-$ discrete :== $'mydir'discrete
-$ distort :== $'mydir'distort
-$ drift :== $'mydir'drift
-$ epicycle :== $'mydir'epicycle
-$ eruption :== $'mydir'eruption
-$ euler2d :== $'mydir'euler2d
-$ fadeplot :== $'mydir'fadeplot
-$ fiberlamp :== $'mydir'fiberlamp
-$ filmleader :== $'mydir'filmleader
-$ fireworkx :== $'mydir'fireworkx
-$ flame :== $'mydir'flame
-$ flow :== $'mydir'flow
-$ fluidballs :== $'mydir'fluidballs
-$ fontglide :== $'mydir'fontglide
-$ fuzzyflakes :== $'mydir'fuzzyflakes
-$ galaxy :== $'mydir'galaxy
-$ glitchpeg :== $'mydir'glitchpeg
-$ goop :== $'mydir'goop
-$ grav :== $'mydir'grav
-$ greynetic :== $'mydir'greynetic
-$ halftone :== $'mydir'halftone
-$ halo :== $'mydir'halo
-$ helix :== $'mydir'helix
-$ hexadrop :== $'mydir'hexadrop
-$ hopalong :== $'mydir'hopalong
-$ ifs :== $'mydir'ifs
-$ imsmap :== $'mydir'imsmap
-$ interaggregate :== $'mydir'interaggregate
-$ interference :== $'mydir'interference
-$ intermomentary :== $'mydir'intermomentary
-$ julia :== $'mydir'julia
-$ kaleidescope :== $'mydir'kaleidescope
-$ kumppa :== $'mydir'kumppa
-$ lcdscrub :== $'mydir'lcdscrub
-$ loop :== $'mydir'loop
-$ m6502 :== $'mydir'm6502
-$ maze :== $'mydir'maze
-$ memscroller :== $'mydir'memscroller
-$ metaballs :== $'mydir'metaballs
-$ moire :== $'mydir'moire
-$ moire2 :== $'mydir'moire2
-$ mountain :== $'mydir'mountain
-$ munch :== $'mydir'munch
-$ nerverot :== $'mydir'nerverot
-$ noseguy :== $'mydir'noseguy
-$ pacman :== $'mydir'pacman
-$ pedal :== $'mydir'pedal
-$ penetrate :== $'mydir'penetrate
-$ penrose :== $'mydir'penrose
-$ petri :== $'mydir'petri
-$ phosphor :== $'mydir'phosphor
-$ piecewise :== $'mydir'piecewise
-$ polyominoes :== $'mydir'polyominoes
-$ pong :== $'mydir'pong
-$ popsquares :== $'mydir'popsquares
-$ pyro :== $'mydir'pyro
-$ qix :== $'mydir'qix
-$ rd-bomb :== $'mydir'rd-bomb
-$ ripples :== $'mydir'ripples
-$ rocks :== $'mydir'rocks
-$ rorschach :== $'mydir'rorschach
-$ rotzoomer :== $'mydir'rotzoomer
-$ scooter :== $'mydir'scooter
-$ shadebobs :== $'mydir'shadebobs
-$ sierpinski :== $'mydir'sierpinski
-$ slidescreen :== $'mydir'slidescreen
-$ slip :== $'mydir'slip
-$ speedmine :== $'mydir'speedmine
-$ spotlight :== $'mydir'spotlight
-$ squiral :== $'mydir'squiral
-$ starfish :== $'mydir'starfish
-$ strange :== $'mydir'strange
-$ substrate :== $'mydir'substrate
-$ swirl :== $'mydir'swirl
-$ tessellimage :== $'mydir'tessellimage
-$ thornbird :== $'mydir'thornbird
-$ triangle :== $'mydir'triangle
-$ truchet :== $'mydir'truchet
-$ twang :== $'mydir'twang
-$ vermiculate :== $'mydir'vermiculate
-$ vfeedback :== $'mydir'vfeedback
-$ wander :== $'mydir'wander
-$ webcollage-helper :== $'mydir'webcollage-helper
-$ whirlwindwarp :== $'mydir'whirlwindwarp
-$ wormhole :== $'mydir'wormhole
-$ xanalogtv :== $'mydir'xanalogtv
-$ xflame :== $'mydir'xflame
-$ xjack :== $'mydir'xjack
-$ xlyap :== $'mydir'xlyap
-$ xmatrix :== $'mydir'xmatrix
-$ xrayswarm :== $'mydir'xrayswarm
-$ xspirograph :== $'mydir'xspirograph
-$ zoom :== $'mydir'zoom
-$ set def [-.DRIVER]
-$ mydir = mydisk+f$directory()
-$ xscreensaver :== $'mydir'xscreensaver
-$ xscreen*command :== $'mydir'xscreensaver-command
-$ set def [-]
-$ exit
diff --git a/utils/Makefile.in b/utils/Makefile.in
index dbb593b..d624e2f 100644
--- a/utils/Makefile.in
+++ b/utils/Makefile.in
@@ -1,4 +1,4 @@
-# utils/Makefile.in --- xscreensaver, Copyright (c) 1997-2010 Jamie Zawinski.
+# utils/Makefile.in --- xscreensaver, Copyright © 1997-2021 Jamie Zawinski.
# the `../configure' script generates `utils/Makefile' from this file.
@@ -102,35 +102,33 @@ X_CFLAGS = @X_CFLAGS@
INCLUDES_1 = -I$(srcdir) -I..
INCLUDES = $(INCLUDES_1) @INCLUDES@
-SRCS = alpha.c colors.c fade.c grabscreen.c grabclient.c hsv.c \
+SRCS = alpha.c colors.c grabscreen.c grabclient.c hsv.c \
overlay.c resources.c spline.c usleep.c visual.c \
visual-gl.c xmu.c logo.c yarandom.c erase.c \
xshm.c xdbe.c colorbars.c minixpm.c textclient.c \
textclient-mobile.c aligned_malloc.c thread_util.c \
- async_netdb.c xft.c utf8wc.c pow2.c font-retry.c
-OBJS = alpha.o colors.o fade.o grabscreen.o grabclient.o hsv.o \
+ async_netdb.c xft.c xftwrap.c utf8wc.c pow2.c font-retry.c
+OBJS = alpha.o colors.o grabscreen.o grabclient.o hsv.o \
overlay.o resources.o spline.o usleep.o visual.o \
visual-gl.o xmu.o logo.o yarandom.o erase.o \
xshm.o xdbe.o colorbars.o minixpm.o textclient.o \
- textclient-mobile.o aligned_malloc.o thread_util.o \
- async_netdb.o xft.o utf8wc.o pow2.o \
- font-retry.o font-retry-xft.o
-HDRS = alpha.h colors.h fade.h grabscreen.h hsv.h resources.h \
+ aligned_malloc.o thread_util.o \
+ async_netdb.o xft.o xftwrap.o utf8wc.o pow2.o \
+ font-retry.o
+HDRS = alpha.h colors.h grabscreen.h hsv.h resources.h \
spline.h usleep.h utils.h version.h visual.h vroot.h xmu.h \
yarandom.h erase.h xshm.h xdbe.h colorbars.h minixpm.h \
xscreensaver-intl.h textclient.h aligned_malloc.h \
- thread_util.h async_netdb.h xft.h utf8wc.h pow2.h \
- font-retry.h
+ thread_util.h async_netdb.h xft.h xftwrap.h utf8wc.h pow2.h \
+ font-retry.h queue.h
STAR = *
LOGOS = images/$(STAR).xpm \
images/$(STAR).png \
images/$(STAR).gif \
- images/$(STAR).eps
+ images/$(STAR).pdf
EXTRAS = README Makefile.in ad2c bin2c
-VMSFILES = compile_axp.com compile_decc.com vms-gtod.c vms-gtod.h \
- vms-strdup.c
-TARFILES = $(EXTRAS) $(VMSFILES) $(SRCS) $(HDRS) $(LOGOS)
+TARFILES = $(EXTRAS) $(SRCS) $(HDRS) $(LOGOS)
default: all
@@ -185,49 +183,24 @@ TAGS: tags
tags:
find $(srcdir) -name '*.[chly]' -print | xargs etags -a
-echo_tarfiles:
- @echo $(TARFILES)
-
+list_tarfiles:
+ @find $(TARFILES) -type f -print | sort
# How we build object files in this directory.
CCUTILS = $(INCLUDES) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS)
.c.o:
$(CC) -c $(CCUTILS) $<
-# Two versions of this: driver/ does not link with Xft, but hacks/ does.
-font-retry-xft.o: $(srcdir)/font-retry.c
+font-retry.o: $(srcdir)/font-retry.c
$(CC) -c $(CCUTILS) -DUSE_XFT $< -o $@
-# Rules for generating the VMS makefiles on Unix, so that it doesn't have to
-# be done by hand...
-#
-VMS_AXP_COMPILE=$$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-])
-
-compile_axp.com: Makefile.in
- @echo generating $@ from $<... ; \
- ( ( for c in $(SRCS) vms-*.c ; do \
- c=`echo $$c | tr a-z A-Z` ; \
- echo "$(VMS_AXP_COMPILE) $$c" ; \
- done ; \
- ) | sort -d ; \
- echo '$$ lib/cre utils.olb_axp' ; \
- echo '$$ lib utils.olb_axp *.obj' ; \
- echo '$$! delete/noconf *.obj;' ; \
- ) > $@
-
-compile_decc.com: compile_axp.com
- @echo generating $@ from $<... ; \
- sed 's/axp/decc/g' < $< > $@
-
-distdepend:: compile_axp.com compile_decc.com
-
-
##############################################################################
#
# DO NOT DELETE: updated by make distdepend
aligned_malloc.o: $(srcdir)/aligned_malloc.h
+aligned_malloc.o: ../config.h
alpha.o: $(srcdir)/alpha.h
alpha.o: ../config.h
alpha.o: $(srcdir)/hsv.h
@@ -256,11 +229,6 @@ erase.o: $(srcdir)/resources.h
erase.o: $(srcdir)/usleep.h
erase.o: $(srcdir)/utils.h
erase.o: $(srcdir)/yarandom.h
-fade.o: ../config.h
-fade.o: $(srcdir)/fade.h
-fade.o: $(srcdir)/usleep.h
-fade.o: $(srcdir)/utils.h
-fade.o: $(srcdir)/visual.h
font-retry.o: ../config.h
font-retry.o: $(srcdir)/font-retry.h
font-retry.o: $(srcdir)/utils.h
@@ -286,11 +254,11 @@ hsv.o: $(srcdir)/hsv.h
hsv.o: $(srcdir)/utils.h
logo.o: ../config.h
logo.o: $(srcdir)/images/logo-180.xpm
+logo.o: $(srcdir)/images/logo-360.xpm
logo.o: $(srcdir)/images/logo-50.xpm
logo.o: $(srcdir)/minixpm.h
logo.o: $(srcdir)/resources.h
logo.o: $(srcdir)/utils.h
-logo.o: $(srcdir)/visual.h
minixpm.o: ../config.h
minixpm.o: $(srcdir)/minixpm.h
overlay.o: ../config.h
@@ -328,12 +296,17 @@ xdbe.o: ../config.h
xdbe.o: $(srcdir)/resources.h
xdbe.o: $(srcdir)/utils.h
xdbe.o: $(srcdir)/xdbe.h
+xdbe.o: $(srcdir)/xmu.h
xft.o: ../config.h
+xftwrap.o: ../config.h
+xftwrap.o: $(srcdir)/utils.h
+xftwrap.o: $(srcdir)/xft.h
+xftwrap.o: $(srcdir)/xftwrap.h
xmu.o: ../config.h
+xmu.o: $(srcdir)/xmu.h
xshm.o: $(srcdir)/aligned_malloc.h
xshm.o: ../config.h
xshm.o: $(srcdir)/resources.h
-xshm.o: $(srcdir)/thread_util.h
xshm.o: $(srcdir)/utils.h
xshm.o: $(srcdir)/xshm.h
yarandom.o: ../config.h
diff --git a/utils/aligned_malloc.c b/utils/aligned_malloc.c
index b345ad1..8c45fc8 100644
--- a/utils/aligned_malloc.c
+++ b/utils/aligned_malloc.c
@@ -13,6 +13,10 @@ software for any purpose. It is provided "as is" without express or
implied warranty.
*/
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
#include "aligned_malloc.h"
#include <stddef.h>
@@ -21,6 +25,254 @@ implied warranty.
#include <assert.h>
#include <errno.h>
+/* Might be changed by thread_util.c:threads_available()
+ */
+unsigned int aligned_malloc_default_alignment = sizeof(void *);
+
+
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#if defined __MACH__ && defined __APPLE__ /* OS X, iOS */
+# include <sys/sysctl.h>
+# include <inttypes.h>
+#endif
+
+#define IS_POWER_OF_2(x) ((x) > 0 && !((x) & ((x) - 1)))
+
+/*
+ arraysize(a). Also known as countof(x), XtNumber(x), NELEMS(x), LEN(x),
+ NUMOF(x), ARRAY_SIZE(x), etc., since the fine folks behind C never got
+ around to including this incredibly useful macro in the standard library,
+ which is where it belongs.
+
+ Much of the code here assumes that multiple processors in a system all use
+ the same cache line size...which might be wrong on occasion.
+*/
+
+#define arraysize(a) (sizeof(a) / sizeof(*(a)))
+#define arrayend(a) ((a) + arraysize(a))
+
+/*
+These numbers are from:
+- Linux: arch/(arch name)/include/asm/cache.h, note
+ L1_CACHE_BYTES/L1_CACHE_SHIFT/SMP_CACHE_BYTES.
+- FreeBSD: sys/(sys name)/include/param.h, note
+ CACHE_LINE_SHIFT/CACHE_LINE_SIZE.
+
+Preprocessor symbols come from:
+- TARGET_CPU_CPP_BUILTINS() in the GNU C preprocessor
+ <http://code.ohloh.net/?s=%22TARGET_CPU_CPP_BUILTINS%22&fp=304413>
+- http://predef.sourceforge.net/
+*/
+
+/*
+Several architectures need preprocessor symbols.
+
+Qualcomm Hexagon: 1 << 5
+Imagination Technologies META: 1 << 6
+OpenRISC: 16 (Linux has the cache line size as a todo.)
+Unicore: 1 << 5
+*/
+
+#if defined __MACH__ && defined __APPLE__ /* OS X, iOS */
+# include <TargetConditionals.h> /* For TARGET_OS_IPHONE. */
+# ifdef TARGET_OS_IPHONE
+# define _CACHE_LINE_SIZE 64
+# endif
+#endif
+
+#if defined __FreeBSD__ && !defined _CACHE_LINE_SIZE
+# include <machine/param.h>
+# ifdef CACHE_LINE_SIZE
+# define _CACHE_LINE_SIZE CACHE_LINE_SIZE
+# endif
+#endif
+
+#if !defined _CACHE_LINE_SIZE
+# if defined __alpha || defined __alpha__
+/* DEC Alpha */
+# define _CACHE_LINE_SIZE 64 /* EV6 and above. EV4 and EV5 use 32 bytes. */
+# elif defined __arm__
+/* ARM architecture */
+# define _CACHE_LINE_SIZE (1 << 6)
+# elif defined __AVR || defined __AVR__
+/* Atmel AVR32 */
+# define _CACHE_LINE_SIZE (1 << 5)
+# elif defined __bfin || defined __BFIN__
+/* Analog Devices Blackfin */
+# define _CACHE_LINE_SIZE (1 << 5)
+# elif defined _TMS320C6X || defined __TMS320C6X__
+/* Texas Instruments TMS320C6x */
+# define _CACHE_LINE_SIZE (1 << 7) /* From L2. L1 data cache line is 1 << 6. */
+# elif defined __cris
+/* Axis Communications ETRAX CRIS */
+# define _CACHE_LINE_SIZE 32
+# elif defined __ia64__ || defined _IA64
+/* Intel Itanium */
+# define _CACHE_LINE_SIZE (1 << 7)
+# elif defined __M32R__ || defined __m32r__
+/* Mitsubishi/Renesas M32R */
+# define _CACHE_LINE_SIZE (1 << 4)
+# elif defined __m68k__ || defined M68000 || defined __MC68K__
+/* Motorola 68000 */
+# define _CACHE_LINE_SIZE (1 << 4)
+# elif defined __MICROBLAZE__ || defined __microblaze__
+/* Xilinx MicroBlaze */
+# define _CACHE_LINE_SIZE (1 << 5)
+# elif defined __mips__ || defined __mips || defined __MIPS__
+/* MIPS */
+# define _CACHE_LINE_SIZE (1 << 6)
+# elif defined __mn10300__ || defined __MN10300__
+/* Matsushita/Panasonic MN103 */
+# define _CACHE_LINE_SIZE 32 /* MN103E010 has 16 bytes. */
+# elif defined __hppa || defined __hppa__
+/* Hewlett-Packard PA-RISC */
+# define _CACHE_LINE_SIZE 64 /* PA-RISC 2.0 uses 64 bytes, PA-RISC 1.1 uses 32. */
+# elif defined __powerpc || defined _ARCH_PPC
+/* Power Architecture (a.k.a. PowerPC) */
+# define _CACHE_LINE_SIZE (1 << 7) /* Linux has a list of PPC models with associated L1_CACHE_SHIFT values. */
+# elif defined __s390__ || defined __370__ || defined __zarch__ || defined __SYSC_ZARCH__
+/* IBM System/390 */
+# define _CACHE_LINE_SIZE 256
+# elif defined SUNPLUS || defined __SCORE__ || defined __score__
+/* Sunplus S+core */
+# define _CACHE_LINE_SIZE (1 << 4)
+# elif defined __sh__
+/* Hitachi SuperH */
+# define _CACHE_LINE_SIZE (1 << 5) /* SH3 and earlier used 1 << 4. */
+# elif defined __sparc__ || defined __sparc
+/* SPARC */
+# define _CACHE_LINE_SIZE (1 << 7) /* Linux and FreeBSD disagree as to what this should be. */
+# elif defined __tile__
+/* Tilera TILE series */
+# define _CACHE_LINE_SIZE (1 << 6) /* TILEPro uses different sizes for L1 and L2. */
+# elif defined __i386 || defined __x86_64
+/* x86(-64) */
+# define _CACHE_LINE_SIZE (1 << 7)
+# elif defined __xtensa__ || defined __XTENSA__
+/* Cadence Design Systems/Tensilica Xtensa */
+# define _CACHE_LINE_SIZE (1 << 5) /* 1 << 4 on some models. */
+# endif
+#endif /* !defined _CACHE_LINE_SIZE */
+
+#if defined __NetBSD__ && !defined _CACHE_LINE_SIZE
+/*
+NetBSD defines COHERENCY_UNIT to be 32 on MIPS, and 64 for all other platforms -- which is wrong. Still, this is what the kernel
+uses; if this value didn't work, the system wouldn't run.
+*/
+# include <sys/param.h>
+# ifdef COHERENCY_UNIT
+# define _CACHE_LINE_SIZE COHERENCY_UNIT
+# endif
+#endif
+
+#ifndef _CACHE_LINE_SIZE
+# define _CACHE_LINE_SIZE 256 /* Fallback cache line size. */
+#endif
+
+static unsigned _get_cache_line_size(void)
+{
+ /*
+ The general idea:
+ - Try to get the actual cache line size from the operating system.
+ - In the interest of keeping things simple, this only checks with
+ glibc and OS X.
+ - A few other methods that could be added:
+ - Query x86 CPUs directly with the CPUID instruction.
+ - Query various ELF systems through the auxillary vector.
+ (Power, Alpha, SuperH)
+ - Query Linux through
+ /sys/devices/system/cpu/cpu?/cache/index?/coherency_line_size
+ (x86 only, AFAIK)
+ - Query Linux through cache_alignment in /proc/cpuinfo
+ - Query Solaris through PICL.
+ - If that fails, return a value appropriate for the current CPU
+ architecture.
+ - Otherwise, return a sufficiently large number.
+ */
+
+ /*
+ sysconf(3) is not a syscall, it's a glibc call that, for cache line sizes,
+ uses CPUID on x86 and returns 0 on other platforms. If it were to work on
+ most other platforms, it would have to get cache information from the
+ kernel, since that information is usually made available by the processor
+ only in privileged mode.
+ https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/i386/sysconf.c;hb=HEAD
+ */
+
+ /* uClibc, newlib, dietlibc, musl, Bionic do not have this. */
+
+# if HAVE_UNISTD_H && ( \
+ defined _SC_LEVEL1_DCACHE_LINESIZE || \
+ defined _SC_LEVEL2_CACHE_LINESIZE || \
+ defined _SC_LEVEL3_CACHE_LINESIZE || \
+ defined _SC_LEVEL4_CACHE_LINESIZE)
+ {
+ static const int names[] =
+ {
+# ifdef _SC_LEVEL1_DCACHE_LINESIZE
+ _SC_LEVEL1_DCACHE_LINESIZE,
+# endif
+# ifdef _SC_LEVEL2_CACHE_LINESIZE
+ _SC_LEVEL2_CACHE_LINESIZE,
+# endif
+# ifdef _SC_LEVEL3_CACHE_LINESIZE
+ _SC_LEVEL3_CACHE_LINESIZE,
+# endif
+# ifdef _SC_LEVEL4_CACHE_LINESIZE
+ _SC_LEVEL4_CACHE_LINESIZE
+# endif
+ };
+
+ const int *name;
+ long result = 0;
+
+ for(name = names; name != arrayend(names); ++name)
+ {
+ long sysconf_result = sysconf(*name); /* Can return -1 or 0 on
+ failure. */
+
+ if(sysconf_result > result)
+ result = sysconf_result;
+ }
+
+ if(result)
+ return result;
+
+ /* Currently, this fails for every platform that isn't x86. Perhaps
+ future versions will support other processors? */
+ }
+# endif
+
+# if defined __MACH__ && defined __APPLE__
+ {
+ uint32_t result; /* sysctl.h says that hw.cachelinesize is a
+ CTLTYPE_INT. */
+ size_t size = sizeof(result);
+ static const int name[] = {CTL_HW, HW_CACHELINE};
+
+ if(!sysctl((int *)name, 2, &result, &size, NULL, 0)) /* (int *) is for OS X. */
+ {
+ assert(size == sizeof(result));
+ return result;
+ };
+ }
+# endif
+
+ /* Guess based on the CPU type. */
+ return _CACHE_LINE_SIZE;
+}
+
+unsigned get_cache_line_size(void)
+{
+ unsigned result = _get_cache_line_size();
+ assert(result >= sizeof(void *));
+ assert(IS_POWER_OF_2(result));
+ return result;
+}
+
/* aligned_alloc() (C11) or posix_memalign() (POSIX) are other possibilities
for aligned_malloc().
*/
@@ -28,10 +280,15 @@ implied warranty.
int aligned_malloc(void **ptr, unsigned alignment, size_t size)
{
void *block_start;
- ptrdiff_t align1 = alignment - 1;
+ ptrdiff_t align1;
+
+ if (alignment == 0)
+ alignment = aligned_malloc_default_alignment;
assert(alignment && !(alignment & (alignment - 1))); /* alignment must be a power of two. */
+ align1 = alignment - 1;
+
size += sizeof(void *) + align1;
block_start = malloc(size);
if(!block_start)
diff --git a/utils/aligned_malloc.h b/utils/aligned_malloc.h
index b3f43c9..0ec675f 100644
--- a/utils/aligned_malloc.h
+++ b/utils/aligned_malloc.h
@@ -18,9 +18,13 @@ implied warranty.
#include <stdlib.h>
+extern unsigned int aligned_malloc_default_alignment;
+
+unsigned get_cache_line_size(void);
+
/* This can't simply be named posix_memalign, since the real thing uses
free(), but this one can't. */
- int aligned_malloc(void **ptr, unsigned alignment, size_t size);
- void aligned_free(void *);
+int aligned_malloc(void **ptr, unsigned alignment, size_t size);
+void aligned_free(void *);
#endif /* __ALIGNED_MALLOC_H__ */
diff --git a/utils/async_netdb.c b/utils/async_netdb.c
index 930da40..d9e2102 100644
--- a/utils/async_netdb.c
+++ b/utils/async_netdb.c
@@ -48,10 +48,10 @@ int _async_netdb_is_done (struct io_thread *io)
# define _get_addr_family(addr) ((addr)->x_sockaddr_in.sin_family)
# define _get_addr_len(addr) ((addr)->x_sockaddr_in.sin_len)
-static const int _has_threads = -1;
-
# if ASYNC_NETDB_FAKE_EAI
+static const int _has_threads = -1;
+
const char *_async_netdb_strerror (int errcode)
{
/* (h)strerror should return messages in the user's preferred language. */
diff --git a/utils/fade.c b/utils/fade.c
deleted file mode 100644
index 7a2ce2b..0000000
--- a/utils/fade.c
+++ /dev/null
@@ -1,962 +0,0 @@
-/* xscreensaver, Copyright (c) 1992-2011 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#include "utils.h"
-
-#include <sys/time.h> /* for gettimeofday() */
-
-#ifdef VMS
-# include "vms-gtod.h"
-#endif /* VMS */
-
-#include "visual.h"
-#include "usleep.h"
-#include "fade.h"
-
-Colormap
-copy_colormap (Screen *screen, Visual *visual,
- Colormap cmap, Colormap into_cmap)
-{
- int i;
- Display *dpy = DisplayOfScreen (screen);
- Window window = RootWindowOfScreen (screen);
- int ncolors = CellsOfScreen (screen);
- XColor *colors = 0;
-
- /* If this is a colormap on a mono visual, or one with insanely many
- color cells, bug out. */
- if (ncolors <= 2 || ncolors > 4096)
- return 0;
- /* If this is a non-writable visual, bug out. */
- if (!has_writable_cells (screen, visual))
- return 0;
-
- if (! into_cmap)
- into_cmap = XCreateColormap (dpy, window, visual, AllocAll);
- if (! cmap)
- cmap = DefaultColormapOfScreen (screen);
-
- colors = (XColor *) calloc(sizeof(XColor), ncolors);
- for (i = 0; i < ncolors; i++)
- colors [i].pixel = i;
- XQueryColors (dpy, cmap, colors, ncolors);
- XStoreColors (dpy, into_cmap, colors, ncolors);
- free (colors);
- return into_cmap;
-}
-
-
-void
-blacken_colormap (Screen *screen, Colormap cmap)
-{
- Display *dpy = DisplayOfScreen (screen);
- int ncolors = CellsOfScreen (screen);
- XColor *colors;
- int i;
- if (ncolors > 4096)
- return;
- colors = (XColor *) calloc(sizeof(XColor), ncolors);
- for (i = 0; i < ncolors; i++)
- colors[i].pixel = i;
- XStoreColors (dpy, cmap, colors, ncolors);
- free (colors);
-}
-
-
-
-static void fade_screens_1 (Display *dpy, Colormap *cmaps,
- Window *black_windows, int nwindows,
- int seconds, int ticks,
- Bool out_p, Bool clear_windows);
-
-#ifdef HAVE_SGI_VC_EXTENSION
-static int sgi_gamma_fade (Display *dpy,
- Window *black_windows, int nwindows,
- int seconds, int ticks,
- Bool out_p, Bool clear_windows);
-#endif /* HAVE_SGI_VC_EXTENSION */
-
-#ifdef HAVE_XF86VMODE_GAMMA
-static int xf86_gamma_fade (Display *dpy,
- Window *black_windows, int nwindows,
- int seconds, int ticks,
- Bool out_p, Bool clear_windows);
-#endif /* HAVE_XF86VMODE_GAMMA */
-
-
-void
-fade_screens (Display *dpy, Colormap *cmaps,
- Window *black_windows, int nwindows,
- int seconds, int ticks,
- Bool out_p, Bool clear_windows)
-{
- int oseconds = seconds;
- Bool was_in_p = !out_p;
-
- /* When we're asked to fade in, first fade out, then fade in.
- That way all the transitions are smooth -- from what's on the
- screen, to black, to the desktop.
- */
- if (was_in_p)
- {
- clear_windows = True;
- out_p = True;
- seconds /= 3;
- if (seconds == 0)
- seconds = 1;
- }
-
- AGAIN:
-
-/* #### printf("\n\nfade_screens %d %d %d\n", seconds, ticks, out_p); */
-
-#ifdef HAVE_SGI_VC_EXTENSION
- /* First try to do it by fading the gamma in an SGI-specific way... */
- if (0 == sgi_gamma_fade(dpy, black_windows, nwindows,
- seconds, ticks, out_p,
- clear_windows))
- ;
- else
-#endif /* HAVE_SGI_VC_EXTENSION */
-
-#ifdef HAVE_XF86VMODE_GAMMA
- /* Then try to do it by fading the gamma in an XFree86-specific way... */
- if (0 == xf86_gamma_fade(dpy, black_windows, nwindows,
- seconds, ticks, out_p,
- clear_windows))
- ;
- else
-#endif /* HAVE_XF86VMODE_GAMMA */
-
- /* Else, do it the old-fashioned way, which (somewhat) loses if
- there are TrueColor windows visible. */
- fade_screens_1 (dpy, cmaps, black_windows, nwindows,
- seconds, ticks,
- out_p, clear_windows);
-
- /* If we were supposed to be fading in, do so now (we just faded out,
- so now fade back in.)
- */
- if (was_in_p)
- {
- was_in_p = False;
- out_p = False;
- seconds = oseconds * 2 / 3;
- if (seconds == 0)
- seconds = 1;
- goto AGAIN;
- }
-}
-
-
-static void
-sleep_from (struct timeval *now, struct timeval *then, long usecs_per_step)
-{
- /* If several seconds have passed, the machine must have been asleep
- or thrashing or something. Don't sleep in that case, to avoid
- overflowing and sleeping for an unconscionably long time. This
- function should only be sleeping for very short periods.
- */
- if (now->tv_sec - then->tv_sec < 5)
- {
- long diff = (((now->tv_sec - then->tv_sec) * 1000000) +
- now->tv_usec - then->tv_usec);
- if (usecs_per_step > diff)
- usleep (usecs_per_step - diff);
- }
-
- then->tv_sec = now->tv_sec;
- then->tv_usec = now->tv_usec;
-}
-
-
-
-/* The business with `cmaps_per_screen' is to fake out the SGI 8-bit video
- hardware, which is capable of installing multiple (4) colormaps
- simultaneously. We have to install multiple copies of the same set of
- colors in order to fill up all the available slots in the hardware color
- lookup table, so we install an extra N colormaps per screen to make sure
- that all screens really go black.
-
- I'm told that this trick also works with XInside's AcceleratedX when using
- the Matrox Millennium card (which also allows multiple PseudoColor and
- TrueColor visuals to co-exist and display properly at the same time.)
-
- This trick works ok on the 24-bit Indy video hardware, but doesn't work at
- all on the O2 24-bit hardware. I guess the higher-end hardware is too
- "good" for this to work (dammit.) So... I figured out the "right" way to
- do this on SGIs, which is to ramp the monitor's gamma down to 0. That's
- what is implemented in sgi_gamma_fade(), so we use that if we can.
- */
-static void
-fade_screens_1 (Display *dpy, Colormap *cmaps,
- Window *black_windows, int nwindows,
- int seconds, int ticks,
- Bool out_p, Bool clear_windows)
-{
- int i, j, k;
- int steps = seconds * ticks;
- long usecs_per_step = (long)(seconds * 1000000) / (long)steps;
- XEvent dummy_event;
- int cmaps_per_screen = 5;
- int nscreens = ScreenCount(dpy);
- int ncmaps = nscreens * cmaps_per_screen;
- Colormap *fade_cmaps = 0;
- Bool installed = False;
- int total_ncolors;
- XColor *orig_colors, *current_colors, *screen_colors, *orig_screen_colors;
- struct timeval then, now;
-#ifdef GETTIMEOFDAY_TWO_ARGS
- struct timezone tzp;
-#endif
-
- total_ncolors = 0;
- for (i = 0; i < nscreens; i++)
- total_ncolors += CellsOfScreen (ScreenOfDisplay(dpy, i));
-
- orig_colors = (XColor *) calloc(sizeof(XColor), total_ncolors);
- current_colors = (XColor *) calloc(sizeof(XColor), total_ncolors);
-
- /* Get the contents of the colormap we are fading from or to. */
- screen_colors = orig_colors;
- for (i = 0; i < nscreens; i++)
- {
- int ncolors = CellsOfScreen (ScreenOfDisplay (dpy, i));
- Colormap cmap = (cmaps ? cmaps[i] : 0);
- if (!cmap) cmap = DefaultColormap(dpy, i);
-
- for (j = 0; j < ncolors; j++)
- screen_colors[j].pixel = j;
- XQueryColors (dpy, cmap, screen_colors, ncolors);
-
- screen_colors += ncolors;
- }
-
- memcpy (current_colors, orig_colors, total_ncolors * sizeof (XColor));
-
-
- /* Make the writable colormaps (we keep these around and reuse them.) */
- if (!fade_cmaps)
- {
- fade_cmaps = (Colormap *) calloc(sizeof(Colormap), ncmaps);
- for (i = 0; i < nscreens; i++)
- {
- Visual *v = DefaultVisual(dpy, i);
- Screen *s = ScreenOfDisplay(dpy, i);
- if (has_writable_cells (s, v))
- for (j = 0; j < cmaps_per_screen; j++)
- fade_cmaps[(i * cmaps_per_screen) + j] =
- XCreateColormap (dpy, RootWindowOfScreen (s), v, AllocAll);
- }
- }
-
-#ifdef GETTIMEOFDAY_TWO_ARGS
- gettimeofday(&then, &tzp);
-#else
- gettimeofday(&then);
-#endif
-
- /* Iterate by steps of the animation... */
- for (i = (out_p ? steps : 0);
- (out_p ? i > 0 : i < steps);
- (out_p ? i-- : i++))
- {
-
- /* For each screen, compute the current value of each color...
- */
- orig_screen_colors = orig_colors;
- screen_colors = current_colors;
- for (j = 0; j < nscreens; j++)
- {
- int ncolors = CellsOfScreen (ScreenOfDisplay (dpy, j));
- for (k = 0; k < ncolors; k++)
- {
- /* This doesn't take into account the relative luminance of the
- RGB components (0.299, 0.587, and 0.114 at gamma 2.2) but
- the difference is imperceptible for this application... */
- screen_colors[k].red = orig_screen_colors[k].red * i / steps;
- screen_colors[k].green = orig_screen_colors[k].green * i / steps;
- screen_colors[k].blue = orig_screen_colors[k].blue * i / steps;
- }
- screen_colors += ncolors;
- orig_screen_colors += ncolors;
- }
-
- /* Put the colors into the maps...
- */
- screen_colors = current_colors;
- for (j = 0; j < nscreens; j++)
- {
- int ncolors = CellsOfScreen (ScreenOfDisplay (dpy, j));
- for (k = 0; k < cmaps_per_screen; k++)
- {
- Colormap c = fade_cmaps[j * cmaps_per_screen + k];
- if (c)
- XStoreColors (dpy, c, screen_colors, ncolors);
- }
- screen_colors += ncolors;
- }
-
- /* Put the maps on the screens, and then take the windows off the screen.
- (only need to do this the first time through the loop.)
- */
- if (!installed)
- {
- for (j = 0; j < ncmaps; j++)
- if (fade_cmaps[j])
- XInstallColormap (dpy, fade_cmaps[j]);
- installed = True;
-
- if (black_windows && !out_p)
- for (j = 0; j < nwindows; j++)
- if (black_windows[j])
- {
- XUnmapWindow (dpy, black_windows[j]);
- XClearWindow (dpy, black_windows[j]);
- }
- }
-
- XSync (dpy, False);
-
- /* If there is user activity, bug out. (Bug out on keypresses or
- mouse presses, but not motion, and not release events. Bugging
- out on motion made the unfade hack be totally useless, I think.)
-
- We put the event back so that the calling code can notice it too.
- It would be better to not remove it at all, but that's harder
- because Xlib has such a non-design for this kind of crap, and
- in this application it doesn't matter if the events end up out
- of order, so in the grand unix tradition we say "fuck it" and
- do something that mostly works for the time being.
- */
- if (XCheckMaskEvent (dpy, (KeyPressMask|ButtonPressMask), &dummy_event))
- {
- XPutBackEvent (dpy, &dummy_event);
- goto DONE;
- }
-
-#ifdef GETTIMEOFDAY_TWO_ARGS
- gettimeofday(&now, &tzp);
-#else
- gettimeofday(&now);
-#endif
-
- /* If we haven't already used up our alotted time, sleep to avoid
- changing the colormap too fast. */
- sleep_from (&now, &then, usecs_per_step);
- }
-
- DONE:
-
- if (orig_colors) free (orig_colors);
- if (current_colors) free (current_colors);
-
- /* If we've been given windows to raise after blackout, raise them before
- releasing the colormaps.
- */
- if (out_p && black_windows)
- {
- for (i = 0; i < nwindows; i++)
- {
- if (clear_windows)
- XClearWindow (dpy, black_windows[i]);
- XMapRaised (dpy, black_windows[i]);
- }
- XSync(dpy, False);
- }
-
- /* Now put the target maps back.
- If we're fading out, use the given cmap (or the default cmap, if none.)
- If we're fading in, always use the default cmap.
- */
- for (i = 0; i < nscreens; i++)
- {
- Colormap cmap = (cmaps ? cmaps[i] : 0);
- if (!cmap || !out_p)
- cmap = DefaultColormap(dpy, i);
- XInstallColormap (dpy, cmap);
- }
-
- /* The fade (in or out) is complete, so we don't need the black maps on
- stage any more.
- */
- for (i = 0; i < ncmaps; i++)
- if (fade_cmaps[i])
- {
- XUninstallColormap(dpy, fade_cmaps[i]);
- XFreeColormap(dpy, fade_cmaps[i]);
- fade_cmaps[i] = 0;
- }
- free(fade_cmaps);
- fade_cmaps = 0;
-}
-
-
-
-/* SGI Gamma fading */
-
-#ifdef HAVE_SGI_VC_EXTENSION
-
-# include <X11/extensions/XSGIvc.h>
-
-struct screen_sgi_gamma_info {
- int gamma_map; /* ??? always using 0 */
- int nred, ngreen, nblue;
- unsigned short *red1, *green1, *blue1;
- unsigned short *red2, *green2, *blue2;
- int gamma_size;
- int gamma_precision;
- Bool alpha_p;
-};
-
-
-static void sgi_whack_gamma(Display *dpy, int screen,
- struct screen_sgi_gamma_info *info, float ratio);
-
-static int
-sgi_gamma_fade (Display *dpy,
- Window *black_windows, int nwindows,
- int seconds, int ticks,
- Bool out_p, Bool clear_windows)
-{
- int steps = seconds * ticks;
- long usecs_per_step = (long)(seconds * 1000000) / (long)steps;
- XEvent dummy_event;
- int nscreens = ScreenCount(dpy);
- struct timeval then, now;
-#ifdef GETTIMEOFDAY_TWO_ARGS
- struct timezone tzp;
-#endif
- int i, screen;
- int status = -1;
- struct screen_sgi_gamma_info *info = (struct screen_sgi_gamma_info *)
- calloc(nscreens, sizeof(*info));
-
- /* Get the current gamma maps for all screens.
- Bug out and return -1 if we can't get them for some screen.
- */
- for (screen = 0; screen < nscreens; screen++)
- {
- if (!XSGIvcQueryGammaMap(dpy, screen, info[screen].gamma_map,
- &info[screen].gamma_size,
- &info[screen].gamma_precision,
- &info[screen].alpha_p))
- goto FAIL;
-
- if (!XSGIvcQueryGammaColors(dpy, screen, info[screen].gamma_map,
- XSGIVC_COMPONENT_RED,
- &info[screen].nred, &info[screen].red1))
- goto FAIL;
- if (! XSGIvcQueryGammaColors(dpy, screen, info[screen].gamma_map,
- XSGIVC_COMPONENT_GREEN,
- &info[screen].ngreen, &info[screen].green1))
- goto FAIL;
- if (!XSGIvcQueryGammaColors(dpy, screen, info[screen].gamma_map,
- XSGIVC_COMPONENT_BLUE,
- &info[screen].nblue, &info[screen].blue1))
- goto FAIL;
-
- if (info[screen].gamma_precision == 8) /* Scale it up to 16 bits. */
- {
- int j;
- for(j = 0; j < info[screen].nred; j++)
- info[screen].red1[j] =
- ((info[screen].red1[j] << 8) | info[screen].red1[j]);
- for(j = 0; j < info[screen].ngreen; j++)
- info[screen].green1[j] =
- ((info[screen].green1[j] << 8) | info[screen].green1[j]);
- for(j = 0; j < info[screen].nblue; j++)
- info[screen].blue1[j] =
- ((info[screen].blue1[j] << 8) | info[screen].blue1[j]);
- }
-
- info[screen].red2 = (unsigned short *)
- malloc(sizeof(*info[screen].red2) * (info[screen].nred+1));
- info[screen].green2 = (unsigned short *)
- malloc(sizeof(*info[screen].green2) * (info[screen].ngreen+1));
- info[screen].blue2 = (unsigned short *)
- malloc(sizeof(*info[screen].blue2) * (info[screen].nblue+1));
- }
-
-#ifdef GETTIMEOFDAY_TWO_ARGS
- gettimeofday(&then, &tzp);
-#else
- gettimeofday(&then);
-#endif
-
- /* If we're fading in (from black), then first crank the gamma all the
- way down to 0, then take the windows off the screen.
- */
- if (!out_p)
- {
- for (screen = 0; screen < nscreens; screen++)
- sgi_whack_gamma(dpy, screen, &info[screen], 0.0);
-
- for (screen = 0; screen < nwindows; screen++)
- if (black_windows && black_windows[screen])
- {
- XUnmapWindow (dpy, black_windows[screen]);
- XClearWindow (dpy, black_windows[screen]);
- XSync(dpy, False);
- }
- }
-
- /* Iterate by steps of the animation... */
- for (i = (out_p ? steps : 0);
- (out_p ? i > 0 : i < steps);
- (out_p ? i-- : i++))
- {
- for (screen = 0; screen < nscreens; screen++)
- {
- sgi_whack_gamma(dpy, screen, &info[screen],
- (((float)i) / ((float)steps)));
-
- /* If there is user activity, bug out. (Bug out on keypresses or
- mouse presses, but not motion, and not release events. Bugging
- out on motion made the unfade hack be totally useless, I think.)
-
- We put the event back so that the calling code can notice it too.
- It would be better to not remove it at all, but that's harder
- because Xlib has such a non-design for this kind of crap, and
- in this application it doesn't matter if the events end up out
- of order, so in the grand unix tradition we say "fuck it" and
- do something that mostly works for the time being.
- */
- if (XCheckMaskEvent (dpy, (KeyPressMask|ButtonPressMask),
- &dummy_event))
- {
- XPutBackEvent (dpy, &dummy_event);
- goto DONE;
- }
-
-#ifdef GETTIMEOFDAY_TWO_ARGS
- gettimeofday(&now, &tzp);
-#else
- gettimeofday(&now);
-#endif
-
- /* If we haven't already used up our alotted time, sleep to avoid
- changing the colormap too fast. */
- sleep_from (&now, &then, usecs_per_step);
- }
- }
-
-
- DONE:
-
- if (out_p && black_windows)
- {
- for (screen = 0; screen < nwindows; screen++)
- {
- if (clear_windows)
- XClearWindow (dpy, black_windows[screen]);
- XMapRaised (dpy, black_windows[screen]);
- }
- XSync(dpy, False);
- }
-
- /* I can't explain this; without this delay, we get a flicker.
- I suppose there's some lossage with stale bits being in the
- hardware frame buffer or something, and this delay gives it
- time to flush out. This sucks! */
- usleep(100000); /* 1/10th second */
-
- for (screen = 0; screen < nscreens; screen++)
- sgi_whack_gamma(dpy, screen, &info[screen], 1.0);
- XSync(dpy, False);
-
- status = 0;
-
- FAIL:
- for (screen = 0; screen < nscreens; screen++)
- {
- if (info[screen].red1) free (info[screen].red1);
- if (info[screen].green1) free (info[screen].green1);
- if (info[screen].blue1) free (info[screen].blue1);
- if (info[screen].red2) free (info[screen].red2);
- if (info[screen].green2) free (info[screen].green2);
- if (info[screen].blue2) free (info[screen].blue2);
- }
- free(info);
-
- return status;
-}
-
-static void
-sgi_whack_gamma(Display *dpy, int screen, struct screen_sgi_gamma_info *info,
- float ratio)
-{
- int k;
-
- if (ratio < 0) ratio = 0;
- if (ratio > 1) ratio = 1;
- for (k = 0; k < info->gamma_size; k++)
- {
- info->red2[k] = info->red1[k] * ratio;
- info->green2[k] = info->green1[k] * ratio;
- info->blue2[k] = info->blue1[k] * ratio;
- }
-
- XSGIvcStoreGammaColors16(dpy, screen, info->gamma_map, info->nred,
- XSGIVC_MComponentRed, info->red2);
- XSGIvcStoreGammaColors16(dpy, screen, info->gamma_map, info->ngreen,
- XSGIVC_MComponentGreen, info->green2);
- XSGIvcStoreGammaColors16(dpy, screen, info->gamma_map, info->nblue,
- XSGIVC_MComponentBlue, info->blue2);
- XSync(dpy, False);
-}
-
-#endif /* HAVE_SGI_VC_EXTENSION */
-
-
-
-/* XFree86 4.x+ Gamma fading */
-
-#ifdef HAVE_XF86VMODE_GAMMA
-
-#include <X11/extensions/xf86vmode.h>
-
-typedef struct {
- XF86VidModeGamma vmg;
- int size;
- unsigned short *r, *g, *b;
-} xf86_gamma_info;
-
-static int xf86_check_gamma_extension (Display *dpy);
-static Bool xf86_whack_gamma (Display *dpy, int screen,
- xf86_gamma_info *ginfo, float ratio);
-
-static int
-xf86_gamma_fade (Display *dpy,
- Window *black_windows, int nwindows,
- int seconds, int ticks,
- Bool out_p, Bool clear_windows)
-{
- int steps = seconds * ticks;
- long usecs_per_step = (long)(seconds * 1000000) / (long)steps;
- XEvent dummy_event;
- int nscreens = ScreenCount(dpy);
- struct timeval then, now;
-#ifdef GETTIMEOFDAY_TWO_ARGS
- struct timezone tzp;
-#endif
- int i, screen;
- int status = -1;
- xf86_gamma_info *info = 0;
-
- static int ext_ok = -1;
-
- /* Only probe the extension once: the answer isn't going to change. */
- if (ext_ok == -1)
- ext_ok = xf86_check_gamma_extension (dpy);
-
- /* If this server doesn't have the gamma extension, bug out. */
- if (ext_ok == 0)
- goto FAIL;
-
-# ifndef HAVE_XF86VMODE_GAMMA_RAMP
- if (ext_ok == 2) ext_ok = 1; /* server is newer than client! */
-# endif
-
- info = (xf86_gamma_info *) calloc(nscreens, sizeof(*info));
-
- /* Get the current gamma maps for all screens.
- Bug out and return -1 if we can't get them for some screen.
- */
- for (screen = 0; screen < nscreens; screen++)
- {
- if (ext_ok == 1) /* only have gamma parameter, not ramps. */
- {
- if (!XF86VidModeGetGamma(dpy, screen, &info[screen].vmg))
- goto FAIL;
- }
-# ifdef HAVE_XF86VMODE_GAMMA_RAMP
- else if (ext_ok == 2) /* have ramps */
- {
- if (!XF86VidModeGetGammaRampSize(dpy, screen, &info[screen].size))
- goto FAIL;
- if (info[screen].size <= 0)
- goto FAIL;
-
- info[screen].r = (unsigned short *)
- calloc(info[screen].size, sizeof(unsigned short));
- info[screen].g = (unsigned short *)
- calloc(info[screen].size, sizeof(unsigned short));
- info[screen].b = (unsigned short *)
- calloc(info[screen].size, sizeof(unsigned short));
-
- if (!(info[screen].r && info[screen].g && info[screen].b))
- goto FAIL;
-
- if (!XF86VidModeGetGammaRamp(dpy, screen, info[screen].size,
- info[screen].r,
- info[screen].g,
- info[screen].b))
- goto FAIL;
- }
-# endif /* HAVE_XF86VMODE_GAMMA_RAMP */
- else
- abort();
- }
-
-#ifdef GETTIMEOFDAY_TWO_ARGS
- gettimeofday(&then, &tzp);
-#else
- gettimeofday(&then);
-#endif
-
- /* If we're fading in (from black), then first crank the gamma all the
- way down to 0, then take the windows off the screen.
- */
- if (!out_p)
- {
- for (screen = 0; screen < nscreens; screen++)
- xf86_whack_gamma(dpy, screen, &info[screen], 0.0);
- for (screen = 0; screen < nwindows; screen++)
- if (black_windows && black_windows[screen])
- {
- XUnmapWindow (dpy, black_windows[screen]);
- XClearWindow (dpy, black_windows[screen]);
- XSync(dpy, False);
- }
- }
-
- /* Iterate by steps of the animation... */
- for (i = (out_p ? steps : 0);
- (out_p ? i > 0 : i < steps);
- (out_p ? i-- : i++))
- {
- for (screen = 0; screen < nscreens; screen++)
- {
- xf86_whack_gamma(dpy, screen, &info[screen],
- (((float)i) / ((float)steps)));
-
- /* If there is user activity, bug out. (Bug out on keypresses or
- mouse presses, but not motion, and not release events. Bugging
- out on motion made the unfade hack be totally useless, I think.)
-
- We put the event back so that the calling code can notice it too.
- It would be better to not remove it at all, but that's harder
- because Xlib has such a non-design for this kind of crap, and
- in this application it doesn't matter if the events end up out
- of order, so in the grand unix tradition we say "fuck it" and
- do something that mostly works for the time being.
- */
- if (XCheckMaskEvent (dpy, (KeyPressMask|ButtonPressMask),
- &dummy_event))
- {
- XPutBackEvent (dpy, &dummy_event);
- goto DONE;
- }
-
-#ifdef GETTIMEOFDAY_TWO_ARGS
- gettimeofday(&now, &tzp);
-#else
- gettimeofday(&now);
-#endif
-
- /* If we haven't already used up our alotted time, sleep to avoid
- changing the colormap too fast. */
- sleep_from (&now, &then, usecs_per_step);
- }
- }
-
-
- DONE:
-
- if (out_p && black_windows)
- {
- for (screen = 0; screen < nwindows; screen++)
- {
- if (clear_windows)
- XClearWindow (dpy, black_windows[screen]);
- XMapRaised (dpy, black_windows[screen]);
- }
- XSync(dpy, False);
- }
-
- /* I can't explain this; without this delay, we get a flicker.
- I suppose there's some lossage with stale bits being in the
- hardware frame buffer or something, and this delay gives it
- time to flush out. This sucks! */
- usleep(100000); /* 1/10th second */
-
- for (screen = 0; screen < nscreens; screen++)
- xf86_whack_gamma(dpy, screen, &info[screen], 1.0);
- XSync(dpy, False);
-
- status = 0;
-
- FAIL:
- if (info)
- {
- for (screen = 0; screen < nscreens; screen++)
- {
- if (info[screen].r) free(info[screen].r);
- if (info[screen].g) free(info[screen].g);
- if (info[screen].b) free(info[screen].b);
- }
- free(info);
- }
-
- return status;
-}
-
-
-/* This bullshit is needed because the VidMode extension doesn't work
- on remote displays -- but if the remote display has the extension
- at all, XF86VidModeQueryExtension returns true, and then
- XF86VidModeQueryVersion dies with an X error. Thank you XFree,
- may I have another.
- */
-
-static Bool error_handler_hit_p = False;
-
-static int
-ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
-{
- error_handler_hit_p = True;
- return 0;
-}
-
-static Bool
-safe_XF86VidModeQueryVersion (Display *dpy, int *majP, int *minP)
-{
- Bool result;
- XErrorHandler old_handler;
- XSync (dpy, False);
- error_handler_hit_p = False;
- old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
-
- result = XF86VidModeQueryVersion (dpy, majP, minP);
-
- XSync (dpy, False);
- XSetErrorHandler (old_handler);
- XSync (dpy, False);
-
- return (error_handler_hit_p
- ? False
- : result);
-}
-
-
-
-/* VidModeExtension version 2.0 or better is needed to do gamma.
- 2.0 added gamma values; 2.1 added gamma ramps.
- */
-# define XF86_VIDMODE_GAMMA_MIN_MAJOR 2
-# define XF86_VIDMODE_GAMMA_MIN_MINOR 0
-# define XF86_VIDMODE_GAMMA_RAMP_MIN_MAJOR 2
-# define XF86_VIDMODE_GAMMA_RAMP_MIN_MINOR 1
-
-
-
-/* Returns 0 if gamma fading not available; 1 if only gamma value setting
- is available; 2 if gamma ramps are available.
- */
-static int
-xf86_check_gamma_extension (Display *dpy)
-{
- int event, error, major, minor;
-
- if (!XF86VidModeQueryExtension (dpy, &event, &error))
- return 0; /* display doesn't have the extension. */
-
- if (!safe_XF86VidModeQueryVersion (dpy, &major, &minor))
- return 0; /* unable to get version number? */
-
- if (major < XF86_VIDMODE_GAMMA_MIN_MAJOR ||
- (major == XF86_VIDMODE_GAMMA_MIN_MAJOR &&
- minor < XF86_VIDMODE_GAMMA_MIN_MINOR))
- return 0; /* extension is too old for gamma. */
-
- if (major < XF86_VIDMODE_GAMMA_RAMP_MIN_MAJOR ||
- (major == XF86_VIDMODE_GAMMA_RAMP_MIN_MAJOR &&
- minor < XF86_VIDMODE_GAMMA_RAMP_MIN_MINOR))
- return 1; /* extension is too old for gamma ramps. */
-
- /* Copacetic */
- return 2;
-}
-
-
-/* XFree doesn't let you set gamma to a value smaller than this.
- Apparently they didn't anticipate the trick I'm doing here...
- */
-#define XF86_MIN_GAMMA 0.1
-
-
-static Bool
-xf86_whack_gamma(Display *dpy, int screen, xf86_gamma_info *info,
- float ratio)
-{
- Bool status;
-
- XErrorHandler old_handler;
- XSync (dpy, False);
- error_handler_hit_p = False;
- old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
-
- if (ratio < 0) ratio = 0;
- if (ratio > 1) ratio = 1;
-
- if (info->size == 0) /* we only have a gamma number, not a ramp. */
- {
- XF86VidModeGamma g2;
-
- g2.red = info->vmg.red * ratio;
- g2.green = info->vmg.green * ratio;
- g2.blue = info->vmg.blue * ratio;
-
-# ifdef XF86_MIN_GAMMA
- if (g2.red < XF86_MIN_GAMMA) g2.red = XF86_MIN_GAMMA;
- if (g2.green < XF86_MIN_GAMMA) g2.green = XF86_MIN_GAMMA;
- if (g2.blue < XF86_MIN_GAMMA) g2.blue = XF86_MIN_GAMMA;
-# endif
-
- status = XF86VidModeSetGamma (dpy, screen, &g2);
- }
- else
- {
-# ifdef HAVE_XF86VMODE_GAMMA_RAMP
-
- unsigned short *r, *g, *b;
- int i;
- r = (unsigned short *) malloc(info->size * sizeof(unsigned short));
- g = (unsigned short *) malloc(info->size * sizeof(unsigned short));
- b = (unsigned short *) malloc(info->size * sizeof(unsigned short));
-
- for (i = 0; i < info->size; i++)
- {
- r[i] = info->r[i] * ratio;
- g[i] = info->g[i] * ratio;
- b[i] = info->b[i] * ratio;
- }
-
- status = XF86VidModeSetGammaRamp(dpy, screen, info->size, r, g, b);
-
- free (r);
- free (g);
- free (b);
-
-# else /* !HAVE_XF86VMODE_GAMMA_RAMP */
- abort();
-# endif /* !HAVE_XF86VMODE_GAMMA_RAMP */
- }
-
- XSync (dpy, False);
- XSetErrorHandler (old_handler);
- XSync (dpy, False);
-
- return status;
-}
-
-#endif /* HAVE_XF86VMODE_GAMMA */
diff --git a/utils/font-retry.c b/utils/font-retry.c
index f8e6507..3122969 100644
--- a/utils/font-retry.c
+++ b/utils/font-retry.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2018 by Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2018-2021 by Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -9,11 +9,56 @@
* implied warranty.
*/
-/* Like XLoadQueryFont, but if it fails, it tries some heuristics to
- load something close.
+/* The value of XScreenSaver's font resource strings is a comma-separated
+ list of font names that look like this:
+
+ Helvetica Bold Italic 12
+
+ We parse that into an XLFD and pass that along to the underlying systems:
+ XftFontOpenXlfd or jwxyz.
+
+ Xft does aggressive substitution of unknown fonts, so if we don't get an
+ exact match on the font name, we move on to the next element in the list.
+ For the last element, we take whatever substitution we got.
+
+ XftNameParse uses this syntax:
+
+ "Helvetica Neue-12:style=Bold"
+ "Helvetica Neue-12:style=Bold Italic"
+ "Helvetica Neue-12:slant=110:weight=200"
+
+ Cocoa uses PostScript names, with hyphens:
+
+ [NSFont fontWithName:@"Helvetica-BoldOblique" size:12];
+ [NSFont fontWithName:@"Times-Roman" size:12];
+
+ Alternately, with separated styles:
+
+ [[NSFontManager sharedFontManager]
+ fontWithFamily:@"Helvetica" traits:NSBoldFontMask weight:5 size:12];
+
+ Android separates names from styles:
+
+ Paint.setTypeface (Typeface.create ("Helvetica", Typeface.BOLD));
+ Paint.setTextSize (12);
+
+ See android/xscreensaver/src/org/jwz/xscreensaver/jwxyz.java
+
+
+ In XScreenSaver 6, USE_XFT is always true, as all programs now use Xft.
+
+ In XScreenSaver 5, this file was compiled in two different ways:
+ - As font-retry.o for programs that did not link with libXft;
+ - As font-retry-xft.o for programs that did.
+
+ #ifdef USE_XFT is whether Xft code should be called.
+ #ifdef HAVE_XFT is whether libXft is natively available.
+
+ The reason there are two defines is that if HAVE_XFT is not defined,
+ the Xft API is still available through emulation provided by "xft.h".
*/
-#define _GNU_SOURCE
+#define _GNU_SOURCE /* Why is this here? */
#include "utils.h"
#include "visual.h"
@@ -26,194 +71,471 @@ extern const char *progname;
#define countof(x) (sizeof((x))/sizeof((*x)))
#undef DEBUG
+#undef SELFTEST
+
+#ifdef HAVE_JWXYZ
+# define USE_XFT 1
+#endif
+
+#ifdef SELFTEST
+static void xft_selftest (Display *dpy, int screen);
+#endif
+
+
+/* Parse font names of the form "Helvetica Neue Bold Italic 12".
+ */
+static char *
+font_name_to_xlfd (const char *font_name)
+{
+ char *name = strdup (font_name);
+ char *xlfd = 0;
+ char *s, *s2, *b, *i, *o, c;
+ float size;
+
+ if (name[0] == '-' || name[0] == '*')
+ return name; /* Already an XLFD */
+
+ /* Downcase ASCII; dash to space */
+ for (s = name; *s; s++)
+ if (*s >= 'A' && *s <= 'Z')
+ *s += 'a'-'A';
+ else if (*s == '-')
+ *s = ' ';
+
+ /* "Family NN" or "Family-NN" */
+ s = strrchr (name, ' ');
+ s2 = strrchr (name, '-');
+ if (s && s2 && s2 > s) s = s2;
+ if (!s) goto FAIL;
+ if (1 != sscanf (s+1, " %f %c", &size, &c)) goto FAIL;
+ if (size <= 0) goto FAIL;
+ *s = 0;
+
+ /* "Family Bold", etc. */
+ b = strstr (name, " bold");
+ i = strstr (name, " italic");
+ o = strstr (name, " oblique");
+ if (b) *b = 0;
+ if (i) *i = 0;
+ if (o) *o = 0;
+
+ xlfd = (char *) malloc (strlen(name) + 80);
+ sprintf (xlfd, "-*-%s-%s-%s-*-*-*-%d-*-*-*-*-*-*",
+ name,
+ (b ? "bold" : "medium"),
+ (i ? "i" : o ? "o" : "r"),
+ (int) (size * 10));
+ free (name);
+ return xlfd;
+
+ FAIL:
+ fprintf (stderr, "%s: XFT: unparsable: \"%s\"\n", progname, font_name);
+ if (name) free (name);
+ if (xlfd) free (xlfd);
+ return 0;
+}
+
+
+#ifdef USE_XFT
+
+/* Xft silently substitutes fonts if the one you requested wasn't available.
+ This leads to the deplorable situation where we ask for a fixed width font
+ and are given a variable width font instead. This doesn't happen with
+ Courier, since Xft special-cases that one, but it happens with any other
+ fixed width font that is not similarly privileged.
+
+ Even worse: when Xft substitutes fonts, it makes no attempt to return fonts
+ that are capable of displaying the language of the current locale. For
+ example: if your locale is set to Japanese and you request "Helvetica", Xft
+ silently substitutes "Nimbus Sans" -- a font which is not capable of
+ displaying Japanese characters. If instead you requested "asdfasdfghjkl",
+ you get "Noto Sans CJK JP", which does work. So that's just spectacular.
+
+ Since there does not appear to be a way to ask Xft whether a particular
+ font exists, we load the font and then check to see if the name we got
+ is the name we requested.
+
+ In more detail:
+
+ - XftFontOpenXlfd is defined as:
+ XftFontOpenPattern (XftFontMatch (XftXlfdParse (xlfd)))
+ - XftFontOpenName is defined as:
+ XftFontOpenPattern (XftFontMatch (XftNameParse (name)))
+ - Calling XftFontOpenPattern with a pattern that has not been filtered
+ through XftFontMatch does not work.
+ - XftFontMatch substitutes another font if the pattern doesn't match.
+ - If the pattern has family "Courier", it substitutes a fixed width
+ font, e.g. "Liberation Mono".
+ - Otherwise it substitutes a variable width font, e.g. "DejaVu Sans".
+ It does this even if the pattern contained "spacing=100" or "110",
+ indicating a monospace or charcell font.
+ - XftXlfdParse does not translate "spacing" from XLFD to XftPattern,
+ but that doesn't matter since XftFontMatch ignores it anyway.
+
+ Xft source is here:
+ https://opensource.apple.com/source/X11ForMacOSXSource/X11ForMacOSXSource-1.0/xc/lib/Xft1/
+
+ Courier, Helvetica and the other historical PostScript font names seem to
+ be special-cased in /etc/fonts/conf.d/ in the files 30-metric-aliases.conf,
+ 45-latin.conf and/or 60-latin.conf, which uses an idiosyncratic scripting
+ language implemented as XML! Some incomplete documentation on that baroque
+ mess is here:
+ https://www.freedesktop.org/software/fontconfig/fontconfig-user.html
+
+ The Xft configuration files seem to special-case the names "monospace",
+ "serif" and "sans-serif" as generic fallback fonts.
+
+ However, "sans-serif" is problematic because it does not survive the trip
+ through XftXlfdParse and XftFontOpenPattern -- XLFD font families cannot
+ include hyphens. So we have no choice but to turn it into "sans serif",
+ which is *not* special-cased by the Xft config files.
+
+ In summary, everything is terrible, and it's a wonder anything works at all.
+ */
+static Bool
+xlfd_substituted_p (XftFont *f, const char *xlfd)
+{
+# ifndef HAVE_XFT
+ return False; /* No substitutions in the Xft emulator. */
+# else /* HAVE_XFT */
+
+ Bool ret = True;
+ const char *oxlfd = xlfd;
+ char *s = 0;
+ char *xname = 0;
+ char fname[1024];
+
+ if (*xlfd == '-' || strchr (xlfd, '*')) /* it's an xlfd */
+ {
+ if (*xlfd != '-') goto FAIL;
+ xlfd++;
+ s = strchr (xlfd, '-'); if (!s) goto FAIL; /* skip foundry */
+ xlfd = s+1;
+ s = strchr (xlfd, '-'); if (!s) goto FAIL; /* skip family */
+
+ {
+ char buf[1024];
+ XftPattern *pat = XftXlfdParse (oxlfd, True, True);
+ XftNameUnparse (pat, buf, sizeof(buf)-1);
+ }
+ }
+ else /* It's an Xft name */
+ {
+ s = strchr (xlfd, '-'); if (!s) goto FAIL; /* skip family */
+ }
+
+ xname = strdup (xlfd);
+ xname[s - xlfd] = 0;
+
+ *fname = 0;
+ XftNameUnparse (f->pattern, fname, sizeof(fname)-1);
+ s = strchr (fname, ':'); /* Strip to "Family-NN" */
+ if (s) *s = 0;
+ s = strrchr (fname, '-'); /* Strip to family */
+ if (s) *s = 0;
+
+ ret = !strcasestr (fname, xname);
+
+# ifdef DEBUG
+ if (ret)
+ fprintf (stderr, "%s: XFT: requested \"%s\" but got \"%s\"\n",
+ progname, xname, fname);
+# endif
+
+ FAIL:
+
+ if (!s)
+ fprintf (stderr, "%s: unparsable XLFD: %s\n", progname, oxlfd);
+ if (xname) free (xname);
+ return ret;
+# endif /* HAVE_XFT */
+}
+#endif /* USE_XFT */
+
static void *
-load_font_retry_1 (Display *dpy, int screen, const char *xlfd, Bool xft_p)
+load_font_retry_1 (Display *dpy, int screen, const char *font_list, Bool xft_p)
{
# ifdef USE_XFT
# define LOADFONT(F) (xft_p \
- ? (void *) XftFontOpenXlfd (dpy, screen, (F)) \
+ ? (void *) XftFontOpenXlfd (dpy, screen, (F)) \
: (void *) XLoadQueryFont (dpy, (F)))
+# define UNLOADFONT(F) (xft_p \
+ ? (void) XftFontClose (dpy, (F)) \
+ : (void) XFreeFont (dpy, (F)))
# else
# define LOADFONT(F) ((void *) XLoadQueryFont (dpy, (F)))
+# define UNLOADFONT(F) XFreeFont (dpy, (F))
# endif
- void *f = xlfd ? LOADFONT(xlfd) : 0;
+ char *font_name = 0;
+ void *f = 0;
+ void *fallback = 0;
# ifndef USE_XFT
if (xft_p) abort();
# endif
-# ifdef HAVE_JWXYZ
- return f;
-# else /* !HAVE_JWXYZ */
- if (! xlfd) xlfd = "<null>";
- if (f)
- {
-# ifdef DEBUG
- fprintf (stderr, "%s: loaded %s\n", progname, xlfd);
+# ifdef SELFTEST
+ xft_selftest (dpy, screen);
# endif
- return f;
- }
- else
+
+ if (! font_list) font_list = "<null>";
+
+ /* Treat the string as a comma-separated list of font names.
+ Names are XLFDs or the XScreenSaver syntax described above.
+ Try to load each of them in order.
+ If a substitution was made, keep going, unless this is the last.
+ */
+ if (font_list)
{
- Bool bold_p = (!!strcasestr (xlfd, "-bold-") ||
- !!strcasestr (xlfd, "-ocr"));
- Bool italic_p = (!!strcasestr (xlfd, "-i-") ||
- !!strcasestr (xlfd, "-o-"));
- Bool fixed_p = (!!strcasestr (xlfd, "courier") ||
- !!strcasestr (xlfd, "-ocr") ||
- !!strcasestr (xlfd, "-m-") ||
- !!strcasestr (xlfd, "-c-"));
- int size = 0;
+ char *token = strdup (font_list);
+ char *otoken = token;
+ char *name2, *lasts;
+ if (!token) abort();
+ while ((name2 = strtok_r (token, ",", &lasts)))
+ {
+ int L;
+ token = 0;
+
+ /* Strip leading and trailing whitespace */
+ while (*name2 == ' ' || *name2 == '\t' || *name2 == '\n')
+ name2++;
+ L = strlen(name2);
+ while (L && (name2[L-1] == ' ' || name2[L-1] == '\t' ||
+ name2[L-1] == '\n'))
+ name2[--L] = 0;
+
+ if (font_name) free (font_name);
+ font_name = font_name_to_xlfd (name2);
# ifdef DEBUG
- fprintf (stderr, "%s: failed %s\n", progname, xlfd);
+ fprintf (stderr, "%s: trying \"%s\" as \"%s\"\n", progname,
+ name2, font_name);
# endif
- if (!strcmp (xlfd, "vga")) /* BSOD uses this: it has no XLFD name. */
- fixed_p = True, size = 120;
+ f = LOADFONT (font_name);
- /* Look for the first number in the string like "-180-" */
- if (! size)
- {
- const char *s;
- for (s = xlfd; *s; s++)
- if (s[0] == '-' && s[1] >= '0' && s[1] <= '9')
- {
- int i = s[1] - '0';
- const char *s2 = s+2;
- while (*s2 >= '0' && *s2 <= '9')
- {
- i = i * 10 + *s2 - '0';
- s2++;
- }
- if (*s2 != '-') continue; /* Number ends with dash */
- if (i < 60 || i >= 2000) continue; /* In range 6pt - 200pt */
- if (i % 10) continue; /* Multiple of 10 */
-
- size = i;
- break;
- }
- }
+# ifdef USE_XFT
+ /* If we did not get an exact match for the font family we requested,
+ reject this font and try the next one in the list. */
+ if (f && xft_p && xlfd_substituted_p (f, font_name))
+ {
+ if (fallback)
+ UNLOADFONT (fallback);
+ fallback = f;
+ f = 0;
+ }
+# ifdef DEBUG
+ else if (!f)
+ fprintf (stderr, "%s: no match for \"%s\"\n", progname, font_name);
+# endif
+# endif /* USE_XFT */
- if (! size)
- {
- fprintf (stderr, "%s: unloadable, unparsable font: \"%s\"\n",
- progname, xlfd);
- xlfd = "fixed";
- return LOADFONT(xlfd);
+ if (f) break;
}
- else
+ free (otoken);
+ if (!font_name) abort();
+
+ /* If the last font in the list was an Xft pattern that matched but
+ was inexact, use it. */
+ if (!f)
{
- const char *variable[] = {
- "helvetica",
- "arial",
- "bitstream vera sans",
- "gill sans",
- "times",
- "times new roman",
- "new century schoolbook",
- "utopia",
- "palatino",
- "lucida",
- "bitstream charter",
-
- /* Don't use a wildcard family. If none of the above worked, then
- then almost none of the X11 fonts are installed, and it's not
- unlikely that "-*-*-medium-r-*-*-*-140-*-*-*-10646-1" will
- match an Arabic or or Japanese font that contains no Latin
- glyphs at all, even in a Latin locale. So in that case, just
- let "helvetica" fall back to "fixed".
- */
- /* "*" */
- };
- const char *fixed[] = {
- "courier",
- "courier new",
- "courier 10 pitch",
- "lucidatypewriter",
- "american typewriter",
- "fixed",
- "ocr a std",
- /* As above, but "can't happen" because we already tried fixed? */
- /* "*" */
- };
- const char *charsets[] = { "iso10646-1", "iso8859-1", "*-*" };
- const char *weights[] = { "bold", "medium" };
- const char *slants[] = { "o", "i", "r" };
- const char *spacings[] = { "m", "c", "p" };
- int a, b, c, d, e, g;
- char buf[1024];
-
- for (a = 0; a < countof(charsets); a++)
- for (b = (bold_p ? 0 : 1); b < countof(weights); b++)
- for (c = (italic_p ? 0 : 2); c < countof(slants); c++)
- for (d = 0;
- d < (fixed_p ? countof(fixed) : countof(variable));
- d++)
- for (g = size; g >= 60; g -= 10)
- for (e = (fixed_p ? 0 : 2); e < countof(spacings); e++)
- {
- sprintf (buf,
- "-%s-%s-%s-%s-%s-%s-%s-%d-%s-%s-%s-%s-%s",
- "*", /* foundry */
- (fixed_p ? fixed[d] : variable[d]),
- weights[b],
- slants[c],
- "*", /* set width */
- "*", /* add style */
- "*", /* pixel size */
- g, /* point size */
- "*", /* x resolution */
- "*", /* y resolution */
- spacings[e],
- "*", /* average width */
- charsets[a]);
-# ifdef DEBUG
- fprintf(stderr, "%s: trying %s\n", progname, buf);
-# endif
- f = LOADFONT(buf);
- if (f)
- {
-# ifdef DEBUG
- fprintf (stderr,
- "%s: substituted \"%s\" for \"%s\"\n",
- progname, buf, xlfd);
-# endif
- return f;
- }
- }
-
- fprintf (stderr, "%s: unable to find any alternatives to \"%s\"\n",
- progname, xlfd);
- xlfd = "fixed";
- return LOADFONT(xlfd);
+ f = fallback;
+ fallback = 0;
}
}
-# endif /* !HAVE_JWXYZ */
+
+ if (!font_name) abort();
+ if (!f) abort();
+
+# ifdef DEBUG
+ if (f && font_name)
+ fprintf (stderr, "%s:%s loaded %s\n", progname,
+ (xft_p ? " XFT:" : ""), font_name);
+# if defined(USE_XFT) && defined(HAVE_XFT)
+ if (xft_p && f)
+ {
+ XftPattern *p = ((XftFont *) f)->pattern;
+ char name[1024];
+ char *s, *s1, *s2, *s3;
+ XftNameUnparse (p, name, sizeof(name)-1);
+ s = strstr (name, ":style=");
+ s1 = (s ? strstr (s+1, ",") : 0);
+ s2 = (s ? strstr (s+1, ":") : 0);
+ s3 = (s1 && s1 < s2 ? s1 : s2);
+ if (s3) strcpy (s3+1, " [...]");
+ fprintf (stderr, "%s: XFT name: %s\n", progname, name);
+ }
+# endif /* USE_XFT && HAVE_XFT */
+# endif /* DEBUG */
+
+ if (fallback) UNLOADFONT (fallback);
+ if (font_name) free (font_name);
+ return f;
}
+
+#if 1 /* No longer used in XScreenSaver 6.
+ (Used by retired flag, juggle, xsublim) */
XFontStruct *
-load_font_retry (Display *dpy, const char *xlfd)
+load_font_retry (Display *dpy, const char *font_list)
{
- return (XFontStruct *) load_font_retry_1 (dpy, 0, xlfd, 0);
+ return (XFontStruct *) load_font_retry_1 (dpy, 0, font_list, 0);
}
+#endif
-#ifdef USE_XFT
+#if defined(USE_XFT) || defined(HAVE_JWXYZ)
XftFont *
-load_xft_font_retry (Display *dpy, int screen, const char *xlfd)
+load_xft_font_retry (Display *dpy, int screen, const char *font_list)
{
- return (XftFont *) load_font_retry_1 (dpy, screen, xlfd, 1);
+ return (XftFont *) load_font_retry_1 (dpy, screen, font_list, 1);
}
+#endif
-#elif defined(HAVE_JWXYZ)
-XftFont *
-load_xft_font_retry (Display *dpy, int screen, const char *xlfd)
+
+#ifdef SELFTEST
+static void
+xft_selftest (Display *dpy, int screen)
{
- return XftFontOpenXlfd (dpy, screen, xlfd);
-}
+ int i;
+ const char *tests[] = {
+ "-*-ocr a std-medium-r-*-*-*-480-*-*-m-*-*-*",
+ "OCR A Std-48",
+ "OCR A Std-48:style=Bold Italic",
+ "OCR A Std-48:spacing=100",
+ "OCR A Std-48:spacing=110",
+ "-*-courier-medium-r-*-*-*-480-*-*-m-*-*-*",
+ "-*-courier-bold-o-*-*-*-480-*-*-m-*-*-*",
+ "Courier-48:style=Bold Italic",
+ "Courier-48:style=Italic Bold", /* seems to be illegal */
+ "Courier-48:spacing=100",
+ "Courier-48:spacing=110",
+ "-*-helvetica-bold-o-*-*-*-480-*-*-m-*-*-*",
+ "Helvetica-48:style=Bold Italic",
+ "Liberation Mono-48:style=Bold Italic",
+ "Liberation Sans-48:style=Bold Italic",
+ "-*-sans serif-bold-o-*-*-*-480-*-*-m-*-*-*",
+ "-*-sans-serif-bold-o-*-*-*-480-*-*-m-*-*-*",
+ "-*-sans\\-serif-bold-o-*-*-*-480-*-*-m-*-*-*",
+ };
+
+ const char *tests2[] = { "Helvetica 10",
+ "Helvetica Bold 10",
+ "Helvetica Bold Italic 10",
+ "Helvetica Oblique Bold-10.5",
+ "Times New Roman-10",
+ "Times New Roman Bold-10",
+ "Times New Roman-Bold Oblique Italic 10",
+ "Times New Roman-Oblique Italic Bold 10",
+ "Times-20:style=Bold",
+ "Times-Oblique-20:style=Bold",
+ "sans serif-20:style=Bold",
+ "sans-serif-20:style=Bold",
+ "sans\\-serif-20:style=Bold",
+ };
+
+ fprintf (stderr, "\n");
+ for (i = 0; i < countof(tests2); i++)
+ fprintf (stderr, "%s\n%s\n\n", tests2[i], font_name_to_xlfd (tests2[i]));
+
+ fprintf (stderr, "\n");
+ for (i = 0; i < countof(tests); i++) {
+ const char *name1 = tests[i];
+ XftResult ret;
+ XftPattern *pat1 = 0, *pat2 = 0, *pat3 = 0;
+ char name2[1024], name3[1024];
+ XftFont *ff;
+ Bool xlfd_p = (*name1 == '-');
-#endif /* !HAVE_JWXYZ */
+# define TRUNC(V) do { \
+ char *s = strstr (V, ":style="); \
+ char *s1 = (s ? strstr (s+1, ",") : 0); \
+ char *s2 = (s ? strstr (s+1, ":") : 0); \
+ char *s3 = (s1 && s1 < s2 ? s1 : s2); \
+ if (s3) strcpy (s3+1, " [...]"); \
+ } while(0)
+
+ *name2 = 0;
+
+ /* Name to Parse */
+
+ if (xlfd_p)
+ pat1 = XftXlfdParse (name1, True, True);
+ else
+ pat1 = XftNameParse (name1);
+ XftNameUnparse (pat1, name2, sizeof(name2)-1);
+ TRUNC(name2);
+ fprintf (stderr, "%s (\"%s\")\n\t-> \"%s\"\n",
+ (xlfd_p ? "XftXlfdParse" : "XftNameParse"),
+ name1, name2);
+
+
+ /* Name to pattern to Open */
+
+ ff = XftFontOpenPattern (dpy, pat1);
+ if (ff) {
+ pat2 = ff->pattern;
+ XftNameUnparse (pat2, name3, sizeof(name3)-1);
+ } else {
+ pat2 = 0;
+ strcpy (name3, "NULL");
+ }
+ TRUNC(name3);
+ fprintf (stderr, "XftFontOpenPattern (\"%s\")\n\t-> \"%s\"\n",
+ name2, name3);
+
+
+ /* Name to pattern to Match */
+
+ pat2 = XftFontMatch (dpy, screen, pat1, &ret);
+ XftNameUnparse (pat2, name3, sizeof(name3)-1);
+ TRUNC(name3);
+ fprintf (stderr, "XftFontMatch (\"%s\")\n\t-> \"%s\", %s\n",
+ name2, name3,
+ (ret == XftResultMatch ? "Match" :
+ ret == XftResultNoMatch ? "NoMatch" :
+ ret == XftResultTypeMismatch ? "TypeMismatch" :
+ ret == XftResultNoId ? "NoId" : "???"));
+
+
+ /* Name to pattern to Match to Open */
+
+ strcpy (name2, name3);
+ ff = XftFontOpenPattern (dpy, pat2);
+ if (ff) {
+ pat3 = ff->pattern;
+ XftNameUnparse (pat3, name3, sizeof(name3)-1);
+ } else {
+ pat3 = 0;
+ strcpy (name3, "NULL");
+ }
+ TRUNC(name3);
+ fprintf (stderr, "XftFontOpenPattern (\"%s\")\n\t-> \"%s\"\n",
+ name2, name3);
+
+
+ /* Name to Open */
+
+ ff = (xlfd_p
+ ? XftFontOpenXlfd (dpy, screen, name1)
+ : XftFontOpenName (dpy, screen, name1));
+ *name2 = 0;
+ if (ff) {
+ pat1 = ff->pattern;
+ XftNameUnparse (pat1, name2, sizeof(name2)-1);
+ } else {
+ strcpy (name2, "NULL");
+ }
+ TRUNC(name2);
+ fprintf (stderr, "%s (\"%s\")\n\t-> \"%s\"\n",
+ (xlfd_p ? "XftFontOpenXlfd" : "XftFontOpenName"),
+ name1, name2);
+ fprintf (stderr, "\n");
+ }
+
+ exit (0);
+}
+#endif /* SELFTEST */
diff --git a/utils/font-retry.h b/utils/font-retry.h
index 83ba0e0..2611a18 100644
--- a/utils/font-retry.h
+++ b/utils/font-retry.h
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2018 by Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 2018-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -12,13 +12,17 @@
#ifndef __FONT_RETRY_H__
#define __FONT_RETRY_H__
-/* Like XLoadQueryFont, but if it fails, it tries some heuristics to
- load something close.
+/* Like XLoadQueryFont, XftFontOpenXlfd or XftFontOpenName, except that the
+ argument can be a comma-separated list of font names. Each name can be
+ either an XLFD or Xft pattern. Returns the first exact match it finds, or
+ if there is no exact match, applies heuristics to the last font in the list
+ until it finds a substitution.
*/
-extern XFontStruct *load_font_retry (Display *, const char *xlfd);
+extern XFontStruct *load_font_retry (Display *, const char *font_list);
# ifdef __XSCREENSAVER_XFT_H__ /* if xft.h has been included */
-extern XftFont *load_xft_font_retry (Display *, int screen, const char *xlfd);
+extern XftFont *load_xft_font_retry (Display *, int screen,
+ const char *font_list);
# endif
#endif /* __FONT_RETRY_H__ */
diff --git a/utils/grabclient.c b/utils/grabclient.c
index abe069b..58db732 100644
--- a/utils/grabclient.c
+++ b/utils/grabclient.c
@@ -127,11 +127,11 @@ typedef struct {
XtInputId pipe_id;
FILE *pipe;
-# if !defined(USE_IPHONE) && !defined(HAVE_COCOA) /* Real X11 */
+# if !defined(HAVE_IPHONE) && !defined(HAVE_COCOA) /* Real X11 */
pid_t pid;
# endif
-# if !defined(USE_IPHONE) && defined(HAVE_COCOA) /* Desktop OSX */
+# if !defined(HAVE_IPHONE) && defined(HAVE_COCOA) /* Desktop OSX */
char *directory;
# endif
@@ -236,7 +236,6 @@ checkerboard (Screen *screen, Drawable drawable)
win_width = xgwa.width;
win_height = xgwa.height;
cmap = xgwa.colormap;
- screen = xgwa.screen;
}
else /* it's a pixmap */
{
@@ -564,7 +563,7 @@ load_random_image_x11 (Screen *screen, Window window, Drawable drawable,
#elif defined (HAVE_COCOA) /* OSX or iOS */
-# ifndef USE_IPHONE /* HAVE_COCOA && !USE_IPHONE -- desktop OSX */
+# ifndef HAVE_IPHONE /* HAVE_COCOA && !HAVE_IPHONE -- desktop OSX */
# define BACKSLASH(c) \
(! ((c >= 'a' && c <= 'z') || \
@@ -699,7 +698,7 @@ xscreensaver_getimage_file_cb (XtPointer closure, int *source, XtInputId *id)
}
-# else /* HAVE_COCOA && USE_IPHONE -- iOS */
+# else /* HAVE_COCOA && HAVE_IPHONE -- iOS */
/* Callback for ios_load_random_image(), called after we have loaded an
image from the iOS device's Photo Library. See grabclient-ios.m.
@@ -753,7 +752,7 @@ ios_load_random_image_cb (void *uiimage, const char *filename,
free (clo2);
}
-# endif /* HAVE_COCOA && USE_IPHONE */
+# endif /* HAVE_COCOA && HAVE_IPHONE */
static void
@@ -774,7 +773,7 @@ osx_load_image_file_async (Screen *screen, Window xwindow, Drawable drawable,
clo2->callback = callback;
clo2->closure = closure;
-# ifndef USE_IPHONE /* Desktop OSX */
+# ifndef HAVE_IPHONE /* Desktop OSX */
clo2->directory = strdup (dir);
clo2->pipe = open_image_name_pipe (dir);
clo2->pipe_id = XtAppAddInput (XtDisplayToApplicationContext (
@@ -782,14 +781,14 @@ osx_load_image_file_async (Screen *screen, Window xwindow, Drawable drawable,
fileno (clo2->pipe),
(XtPointer) (XtInputReadMask | XtInputExceptMask),
xscreensaver_getimage_file_cb, (XtPointer) clo2);
-# else /* USE_IPHONE */
+# else /* HAVE_IPHONE */
{
XWindowAttributes xgwa;
XGetWindowAttributes (DisplayOfScreen (screen), xwindow, &xgwa);
ios_load_random_image (ios_load_random_image_cb, clo2,
xgwa.width, xgwa.height);
}
-# endif /* USE_IPHONE */
+# endif /* HAVE_IPHONE */
}
@@ -828,13 +827,13 @@ load_random_image_cocoa (Screen *screen, Window window, Drawable drawable,
geom.width = xgwa.width;
geom.height = xgwa.height;
-# ifndef USE_IPHONE
+# ifndef HAVE_IPHONE
if (filep)
dir = get_string_resource (dpy, "imageDirectory", "ImageDirectory");
if (!dir || !*dir)
filep = False;
-# endif /* ! USE_IPHONE */
+# endif /* ! HAVE_IPHONE */
if (deskp && filep) {
deskp = !(random() & 5); /* if both, desktop 1/5th of the time */
diff --git a/utils/grabscreen.c b/utils/grabscreen.c
index 77fe3c9..e2742bf 100644
--- a/utils/grabscreen.c
+++ b/utils/grabscreen.c
@@ -25,10 +25,8 @@
On MacOS systems running X11, which nobody does any more:
- "driver/xscreensaver-getimage" runs the Perl script
- "driver/xscreensaver-getimage-desktop", which in turn runs the MacOS
- program "/usr/sbin/screencapture" to get the Mac desktop image as a
- PNG file.
+ "driver/xscreensaver-getimage" runs "/usr/sbin/screencapture" to
+ get the Mac desktop image as a PNG.
On MacOS systems running the native Cocoa build, or on iOS or Android
systems:
@@ -48,14 +46,6 @@
#include <X11/Xatom.h>
#include <X11/Xutil.h>
-#ifdef HAVE_XMU
-# ifndef VMS
-# include <X11/Xmu/WinUtil.h>
-# else /* VMS */
-# include <Xmu/WinUtil.h>
-# endif /* VMS */
-#endif
-
#include "usleep.h"
#include "colors.h"
#include "grabscreen.h"
@@ -264,10 +254,7 @@ install_screen_colormaps (Screen *screen)
{
XWindowAttributes xgwa;
Window client;
-#ifdef HAVE_XMU
- /* #### need to put XmuClientWindow() in xmu.c, sigh... */
- if (! (client = XmuClientWindow (dpy, kids[i])))
-#endif
+ /* if (! (client = XmuClientWindow (dpy, kids[i]))) */
client = kids[i];
xgwa.colormap = 0;
XGetWindowAttributes (dpy, client, &xgwa);
diff --git a/utils/grabscreen.h b/utils/grabscreen.h
index 40054c8..a17e671 100644
--- a/utils/grabscreen.h
+++ b/utils/grabscreen.h
@@ -92,14 +92,14 @@ extern Bool osx_load_image_file (Screen *, Window, Drawable,
const char *filename, XRectangle *geom_ret);
#endif /* HAVE_JWXYZ */
-#ifdef USE_IPHONE
+#ifdef HAVE_IPHONE
extern void ios_load_random_image (void (*callback) (void *uiimage,
const char *filename,
int w, int h,
void *closure),
void *closure,
int width, int height);
-#endif /* USE_IPHONE */
+#endif /* HAVE_IPHONE */
#ifdef HAVE_ANDROID
char *jwxyz_draw_random_image (Display *dpy, /* utils/grabclient.c */
diff --git a/utils/images/logo-180.xpm b/utils/images/logo-180.xpm
index b093c8f..c61837c 100644
--- a/utils/images/logo-180.xpm
+++ b/utils/images/logo-180.xpm
@@ -1,13 +1,14 @@
/* XPM */
/* XScreenSaver Logo, designed by Angela Goodman <rzr_grl@yahoo.com>
- Copyright (c) 2001, 2002 by Jamie Zawinski <jwz@jwz.org>
+ Copyright © 2001-2021 Jamie Zawinski <jwz@jwz.org>
Unauthorized use or reproduction prohibited.
https://www.jwz.org/xscreensaver/
*/
static const char * const logo_180_xpm[] = {
+/* columns rows colors chars-per-pixel */
"180 180 16 1",
" c None m None",
") c #FF0000 m #FFFFFF",
@@ -25,6 +26,7 @@ static const char * const logo_180_xpm[] = {
"% c #37332D m #000000",
"& c #2D0C05 m #000000",
"* c #A46E00 m #000000",
+/* pixels */
" ",
" . ",
" .. ",
diff --git a/utils/images/logo-360.gif b/utils/images/logo-360.gif
new file mode 100644
index 0000000..cb53a2c
--- /dev/null
+++ b/utils/images/logo-360.gif
Binary files differ
diff --git a/utils/images/logo-360.xpm b/utils/images/logo-360.xpm
new file mode 100644
index 0000000..b80da2a
--- /dev/null
+++ b/utils/images/logo-360.xpm
@@ -0,0 +1,390 @@
+/* XPM */
+
+/* XScreenSaver Logo, designed by Angela Goodman <rzr_grl@yahoo.com>
+ Copyright © 2001-2021 Jamie Zawinski <jwz@jwz.org>
+ Unauthorized use or reproduction prohibited.
+
+ https://www.jwz.org/xscreensaver/
+ */
+
+static const char * const logo_360_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"360 360 16 1",
+" c None m None",
+"# c #000000 m #000000",
+". c #929291 m #000000",
+"X c #A30204 m #000000",
+"o c #604D28 m #000000",
+"O c #600204 m #000000",
+"+ c #37332D m #000000",
+"@ c #2D0C05 m #000000",
+"_ c #A46E04 m #000000",
+"$ c #DBDBDA m #000000",
+"% c #ED9E04 m #FFFFFF",
+"& c #797977 m #000000",
+"* c #B0B0AE m #000000",
+"= c #FEFEFC m #FFFFFF",
+"- c #4F3504 m #000000",
+"; c #FD0204 m #FFFFFF",
+/* pixels */
+" ",
+" ## ",
+" #### ",
+" ###### ",
+" ###### ",
+" ###### ",
+" ###### ",
+" ####### ",
+" ####### ",
+" ## ####### ",
+" ### ######## ",
+" #### ####### ",
+" ############ ",
+" ###+######### ",
+" +O++######## ",
+" ++X#+######## ",
+" @XX@######### ",
+" @+;O@######## ",
+" ##;;O@######## ",
+" @X;;+@######## ",
+" @+;;;+@####### ",
+" #@X;;X#+#++#### ",
+" @O;;;X@#o###### ",
+" ++;;;;O#oo@#### ",
+" @X;;;;+@_+@#### ",
+" @O;;;;;#+o+##### ",
+" ++;;;;;X#+o@##### ",
+" @X;;;;;O#o+@#### ",
+" @O;;;;;;+@o++#### ",
+" ++;;;;;;;++o@##### ",
+" #+X;;;;;;X@++@#### ",
+" @X;;;;;;;X#++@#### ",
+" @+;;;;;;;;++o#+#### ",
+" ++;;;;;;;;;+++@##### ",
+" @X;;;;;;;;X@++@#### ",
+" @O;;;;;;;;;O@o++#### ",
+" ++;;;;;;;;;;++o@##### ",
+" ##X;;;;;;;;;X@++@#### ",
+" @X;;;;;;;;;;O@o+@#### ",
+" @O;;;;;;;;;;;++o@##### ",
+" @+;;;;;;;;;;;X@oo@#### ",
+" ++;;;;;;;;;;;;O@_+@#### ",
+" +X;;;;;;;;;;;;++_#+#### ",
+" @X;;;;;;;;;;;;X#oo@##### ### ",
+" @O;;;;;;;;;;;;;+@_+@#### ##### ",
+" @+;;;;;;;;;;;;;X@o%++#### ## ##### ",
+" ++;;;;;;;;;;;;;;O#__@##### ### ###### ",
+" +X;;;;;;;;;;;;;;++%+@#### ### ####### ",
+" @X;;;;;;;;;;;;;;O#_%@+#### #### ###### ",
+" @X;;;;;;;;;;;;;;;++%o@#### ### ####### ",
+" @O;;;;;;;;;;;;;;;X#_%+@#### +++# ####### ",
+" @+;;;;;;;;;;;;;;;;++%_@##### #+O# ####### ",
+" @+;;;;;;;;;;;;;;;;O#_%o@#### @O++ ####### ",
+" ++;;;;;;;;;;;;;;;;;@o%%+@#### @+X@ ######## ",
+" ++;;;;;;;;;;;;;;;;;O@%%_@#### #+X+@ ####### ",
+" #X;;;;;;;;;;;;;;;;X@o%%+@#### @OX@# ######## ",
+" @X;;;;;;;;;;;;;;;;;++%%_@#### ++;O@ ######## ",
+" @X;;;;;;;;;;;;;;;;;O#_%%+@#### #@X;++ ######## ",
+" @X;;;;;;;;;;;;;;;;;X#_%%_@#### @+;X+ ######## ",
+" @X;;;;;;;;;;;;;;;;;;+o%%%+@### ##X;O@ ######### ",
+" @X;;;;;;;;;;;;;;;;;;++%%%o@#### @O;;+@######### ",
+" @X;;;;;;;;;;;;;;;;;;O+%%%_@#### ++;;;++######### ",
+" @X;;;;;;;;;;;;;;;;;;X#_%%%++### @O;;X+########## ",
+" @X;;;;;;;;;;;;;;;;;;X#_%%%+@### ++;;;X@########## ",
+" @X;;;;;;;;;;;;;;;;;;X#_%%_@+### #@X;;;O@######### ",
+" @X;;;;;;;;;;;;;;;;;;O@%%%+@#### @+;;;;+@###+##### ",
+" @X;;;;;;;;;;;;;;;;;;++%%_@#### #@X;;;;++##@+++### ",
+" @X;;;;;;;;;;;;;;;;;X@o%%+@#### @+;;;;;++#++_+#### ",
+" #;;;;;;;;;;;;;;;;;;+@_%_@#### #@X;;;;;###@o_@#### ",
+" ++;;;;;;;;;;;;;;;;;X@o%%o@#### @+;;;;;X@#++%o@### ",
+" ++;;;;;;;;;;;;;;;;;+@%%_@+### #@X;;;;;X@#@o%o@### ",
+" @+;;;;;;;;;;;;;;;;X#o%%o@#### @+;;;;;;X@+#%%o@### ",
+" @O;;;;;;;;;;;;;;;;++%%%#+### #@X;;;;;;X@@o%%+@### ",
+" @X;;;;;;;;;;;;;;;X#o%%o@#### @+;;;;;;;X@+_%%+@### ",
+" +X;;;;;;;;;;;;;;;+#%%%+@### @X;;;;;;;X#o%%%++### ",
+" ++;;;;;;;;;;;;;;;X#_%%_@#### ++;;;;;;;;X@_%%%++### ",
+" @+;;;;;;;;;;;;;;;++%%%+@### @X;;;;;;;;X@%%%%#+### ",
+" @O;;;;;;;;;;;;;;X#_%%_@#### ++;;;;;;;;;X@%%%%++### ",
+" #####################################################################################################+X;;;;;;;;;;;;;;++%%%+@#################@O;;;;;;;;;X@%%%_@+########################################################################################################################## ",
+" #######################################################################################################++;;;;;;;;;;;;;;X#_%%_@#################++;;;;;;;;;;X@_%%_@############################################################################################################################## ",
+" ########################################################################################################@O;;;;;;;;;;;;;;++%%%o@#################@O;;;;;;;;;;X#_%%_@############################################################################################################################### ",
+" #########################################################################################################@X;;;;;;;;;;;;;X#_%%_@###################X;;;;;;;;;;X#_%%_@################################################################################################################################ ",
+" #########################################################################################################@+;;;;;;;;;;;;;;++%%%o@#################@+;;;;;;;;;;;X#_%%_@+################################################################################################################################ ",
+" ##########################################################################################################@X;;;;;;;;;;;;;X#_%%%+@#################@X;;;;;;;;;;;X#_%%_++################################################################################################################################# ",
+" #########################################################################################################++;;;;;;;;;;;;;;++%%%_@#################++;;;;;;;;;;;;X@_%%%++################################################################################################################################## ",
+" ##########+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#@X;;;;;;;;;;;;;X#o%%%+@##+@@@@@@@@@@@@@+@O;;;;;;;;;;;;;+o%%%#+##+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@########## ",
+" ########+@@++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@+;;;;;;;;;;;;;;+#%%%_@###++++++++++++++++X;;;;;;;;;;;;;+o%%%++##+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#@@######## ",
+" ########@@&$=============================================================================================&#X;;;;;;;;;;;;;X#o%%%o@##@&============$++;;;;;;;;;;;;;;++%%%++#@+$===================================================================================================================$&#@######## ",
+" #######+@*==============================================================================================*#O;;;;;;;;;;;;;;++%%%%#+##@*============*#X;;;;;;;;;;;;;;++%%%+@#@+======================================================================================================================*#@####### ",
+" #######@+==============================================================================================$++;;;;;;;;;;;;;;X#o%%%o@##@+=============&@;;;;;;;;;;;;;;;O+%%%+@#+@$======================================================================================================================&@####### ",
+" #######@o==============================================================================================o@X;;;;;;;;;;;;;;O@%%%%+@##@*============$+O;;;;;;;;;;;;;;;X#_%%o@##@*======================================================================================================================&@####### ",
+" #######@o=============================================================================================&#X;;;;;;;;;;;;;;;@o%%%_@##@+=============*#X;;;;;;;;;;;;;;;X#_%%o@##@*======================================================================================================================&@####### ",
+" #######@o============================================================================================&#O;;;;;;;;;;;;;;;O@_%%%+@##@&=============o+;;;;;;;;;;;;;;;;X@_%%o@##@*======================================================================================================================&@####### ",
+" #######@o===========================================================================================&#O;;;;;;;;;;;;;;;;++%%%%++#+@$============$@O;;;;;;;;;;;;;;;;;@o%%_@##@&======================================================================================================================&@####### ",
+" #######@o==========================================================================================*#+;;;;;;;;;;;;;;;;X#_%%%_@##@+=============*#X;;;;;;;;;;;;;;;;;++%%_@##@o======================================================================================================================&@####### ",
+" #######@o=========================================================================================$@+;;;;;;;;;;;;;;;;;++%%%%+@##@*=============&@;;;;;;;;;;;;;;;;;;O+%%%#+#@+======================================================================================================================&@####### ",
+" #######@o========================================================================================$+@X;;;;;;;;;;;;;;;;X#o%%%_@##@#$============$+O;;;;;;;;;;;;;;;;;;O@%%%++#@+======================================================================================================================&@####### ",
+" #######@o========================================================================================o#X;;;;;;;;;;;;;;;;;O@%%%%o@##@o=============*#X;;;;;;;;;;;;;;;;;;X#_%%+@#@#$=====================================================================================================================&@####### ",
+" #######@o=======================================================================================&#O;;;;;;;;;;;;;;;;;;@o%%%%+@##@*=============&@;;;;;;;;;;;;;;;;;;;;@o%%o@##@*=====================================================================================================================&@####### ",
+" #######@o======================================================================================*#+;;;;;;;;;;;;;;;;;;X#_%%%_@##@+==============+O;;;;;;;;;;;;;;;;;;;;++%%o@##@&=====================================================================================================================&@####### ",
+" #######@o=====================================================================================$++;;;;;;;;;;;;;;;;;;;++%%%%o@##@&=============*#X;;;;;;;;;;;;;;;;;;;;O+%%_@##@&=====================================================================================================================&@####### ",
+" #######@o=====================================================================================+@X;;;;;;;;;;;;;;;;;;;@o%%%%+@#+@*=============*@X;;;;;;;;;;;;;;;;;;;;X#_%_@##@+=====================================================================================================================&@####### ",
+" #######@o====================================================================================&#X;;;;;;;;;;;;;;;;;;;O#_%%%_@##@+==============++;;;;;;;;;;;;;;;;;;;;;X#o%%+@#@#$====================================================================================================================&@####### ",
+" #######@o===================================================================================*#+;;;;;;;;;;;;;;;;;;;;++%%%%o@##@&=============$+O;;;;;;;;;;;;;;;;;;;;;;+o%%+@##@*====================================================================================================================&@####### ",
+" #######@o==================================================================================$++;;;;;;;;;;;;;;;;;;;;X@o%%%%+@##@*=============*#X;;;;;;;;;;;;;;;;;;;;;;++%%o@##@&====================================================================================================================&@####### ",
+" #######@o==================================================================================&#X;;;;;;;;;;;;;;;;;;;;X#_%%%_@##@+==============&@;;;;;;;;;;;;;;;;;;;;;;;X#_%_@##@o====================================================================================================================&@####### ",
+" #######@o=================================================================================*#O;;;;;;;;;;;;;;;;;;;;;++%%%%_@##@&==============++;;;;;;;;;;;;;;;;;;;;;;;X@_%%++#@+====================================================================================================================&@####### ",
+" #######@o=================================================================================+@;;;;;;;;;;;;;;;;;;;;;;+o%%%%o@##@*=============$+O;;;;;;;;;;;;;;;;;;;;;;;;++%%+@#+@*===================================================================================================================&@####### ",
+" #######@o==============================================================*+&=====$=========*#X;;;;;;;;;;;;;;;;;;;;;X#_%%%%+@#@#$=============*#X;;;;;;;;;;;;;;;;;;;;;;;;O+%%o@##@*===================================================================================================================&@####### ",
+" #######@o=============================================================*@@@$==$+@+*======$++;;;;;;;;;;;;;;;;;;;;;;O@%%%%_@##@+==============*@X;;;;;;;;;;;;;;;;;;;;;;;;X#_%_@##@o===================================================================================================================&@####### ",
+" #######@o============================================================$++O@$==+@+@+======&#X;;;;;;;;;;;;;;;;;;;;;;++%%%%_@##@&==============&@;;;;;;;;;;;;;;;;;;;;;;;;;;@o%%#+#@+$==================================================================================================================&@####### ",
+" #######@o============================================================&#XX@$=*@##+@$====$#O;;;;;;;;;;;;;;;;;;;;;;;@o%%%%o@##@*==============++;;;;;;;;;;;;;;;;;;;;;;;;;;++%%+@##@*==================================================================================================================&@####### ",
+" #######@o=======================$*&&ooooooooooooooooooooooooooooooooo@O;O@oo+@###+ooooo+@X;;;;;;;;;;;;;;;;;;;;;;X@_%%%%+@##@+oooooooooooooo@O;;;;;;;;;;;;;;;;;;;;;;;;;;O#_%o@##@+ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo&&*$=======================&@####### ",
+" #######@o=====================$&+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#;;O@@@@#####@@@@@#O;;;;;;;;;;;;;;;;;;;;;;;X#_%%%%++###@@@@@@@@@@@@@@@@X;;;;;;;;;;;;;;;;;;;;;;;;;;X@o%_@###@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+&$=====================&@####### ",
+" #######@o====================*+@@###################################@O;;++############+#;;;;;;;;;;;;;;;;;;;;;;;;O@_%%%_@###################+X;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%+@#############################################################################################@@+&====================&@####### ",
+" #######@o===================&@@####################################++;;;##############@O;;;;;;;;;;;;;;;;;;;;;;;;O+%%%%_@####################;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#_%o@###############################################################################################@@&===================&@####### ",
+" #######@o==================&@@#####################################@X;;X@##############;;;;;;;;;;;;;;;;;;;;;;;;;++%%%%_@##################++;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o%_@#################################################################################################@&==================&@####### ",
+" #######@o=================*@@#####################################++;;;O@############@O;;;;;;;;;;;;;;;;;;;;;;;;;++%%%%o@##################@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%+@################################################################################################+@*=================&@####### ",
+" #######@o=================+@######################################@O;;;+@############@X;;;;;;;;;;;;;;;;;;;;;;;;;++%%%%o@##################@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@_%o@#################################################################################################@#$================&@####### ",
+" #######@o================*@######################################++;;;;++###########@+;;;;;;;;;;;;;;;;;;;;;;;;;;++%%%%o@##################@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@o%_@##################################################################################################@&================&@####### ",
+" #######@o================+@######################################@O;;;X+############@X;;;;;;;;;;;;;;;;;;;;;;;;;;++%%%%+@##################@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%+@#################################################################################################@+================&@####### ",
+" #######@o===============$@+######################################+X;;;X@#############;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%%%+@##################@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#_%o@##################################################################################################@*===============&@####### ",
+" #######@o===============*@######################################@+;;;;+@###########@+;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%%%+@##################@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@o%_@##################################################################################################@&===============&@####### ",
+" #######@o===============&@######################################@X;;;;++###########@X;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%%%+@##################@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%+@#################################################################################################@o===============&@####### ",
+" #######@o===============&@#####################################@+;;;;X@###########++;;;;;;;;;;;;;;;;;;;;;;;;;;;;O+%%%%o@##################+X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#_%_@#################################################################################################@+===============&@####### ",
+" #######@o===============&@#####################################@X;;;;O@###########@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@_%%%o@###################X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%++################################################################################################@+===============&@####### ",
+" #######@o===============&@####################################++;;;;;++###########@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#_%%%o@#################++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#_%o@################################################################################################@+===============&@####### ",
+" #######@o===============&@####################################@O;;;;X#############+X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@o%%%o@#################++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@o%%++###############################################################################################@+===============&@####### ",
+" #######@o===============&@####################################+X;;;;X@###########++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%%_@#################++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@%%+@###############################################################################################@+===============&@####### ",
+" #######@o===============&@###################################@+;;;;;O@###########@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@%%%_@#################++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o%_@###############################################################################################@+===============&@####### ",
+" #######@o===============&@###################################@X;;;;;+@###########@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#_%%%+@################++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+#%%+@##############################################################################################@+===============&@####### ",
+" #######@o===============&@####################################;;;;;;+############@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%%+@#################+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#_%_@##############################################################################################@+===============&@####### ",
+" #######@o===============&@##################################@O;;;;;X@#############;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#_%%_@##################X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%+@#############################################################################################@+===============&@####### ",
+" #######@o===============&@##################################@X;;;;;O@###########++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@o%%%#+################@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#_%_@#############################################################################################@+===============&@####### ",
+" #######@o===============&@#################################++;;;;;;O@###########++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@%%%+@################@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%+@############################################################################################@+===============&@####### ",
+" #######@o===============&@#################################@O;;;;;;++###########@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@o%%_@################@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#_%_@############################################################################################@+===============&@####### ",
+" #######@o===============&@#################################@X;;;;;;++###########@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#_%%++###############@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%+@###########################################################################################@+===============&@####### ",
+" #######@o===============&@################################++;;;;;;X###+#########@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@+%%o@###############@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#_%_@###########################################################################################@+===============&@####### ",
+" #######@o===============&@################################@O;;;;;;X@#+++########@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#_%%#+##############@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%+@##########################################################################################@+===============&@####### ",
+" #######@o===============&@#################################X;;;;;;X@##o+########@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%o@##############@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o%_@+#########################################################################################@+===============&@####### ",
+" #######@o===============&@###############################@+;;;;;;;X@@+_@########@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o%%#+#############++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+#%%o@#########################################################################################@+===============&@####### ",
+" #######@o===============&@###############################@X;;;;;;;O@@__@########@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#_%o@##############+X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o%%++########################################################################################@+===============&@####### ",
+" #######@o===============&@###############################+X;;;;;;;O@@%_@########@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%+@#############@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@_%_@########################################################################################@+===============&@####### ",
+" #######@o===============&@##############################@+;;;;;;;;+@+%_@########@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#+%_@#############@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@+%%+@#######################################################################################@+===============&@####### ",
+" #######@o===============&@##############################@O;;;;;;;;+#o%_@########@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#_%o@############++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#_%_@+######################################################################################@+===============&@####### ",
+" #######@o===============&@##############################+X;;;;;;;;+@_%_@###+@@@@@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+#_%+@#####@@@@@@@+X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%o@#####+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@######################################@+===============&@####### ",
+" #######@o===============&@#############################@+;;;;;;;;;++%%%++#++++++@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%_@####++++++++@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o%%+@###++++++++++++++++++++++++++++++++++++++++++++@@####################################@+===============&@####### ",
+" #######@o===============&@#############################@O;;;;;;;;;++%%%#+#@+====++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@+%o@###@&=====$++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#_%_@+##@+$========================================$*o@@##################################@+===============&@####### ",
+" #######@o===============&@#############################+X;;;;;;;;;++%%%++#@+====&+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o%+@##+@*=====&@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#+%%_@###@+===========================================*@@#################################@+===============&@####### ",
+" #######@o===============&@############################++;;;;;;;;;;++%%%++#@+====&@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#_%+@##@@*====*#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o%%o@###@o===========================================*@+################################@+===============&@####### ",
+" #######@o===============&@############################@O;;;;;;;;;;++%%%+@#@#$===*@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+#__@+##@+$====++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#_%%+@###@&===========================================&@################################@+===============&@####### ",
+" #######@o===============&@############################@X;;;;;;;;;;++%%%o@##@*===$@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@__@###@+$===*#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@_%%+@##+@&==========================================$+@###############################@+===============&@####### ",
+" #######@o===============&@###########################++;;;;;;;;;;;++%%%o@##@*====+O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X++%o@###@o===$++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@+%%_@+##+@&==========================================&@###############################@+===============&@####### ",
+" #######@o===============&@###########################@+;;;;;;;;;;;++%%%o@##@*====o+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@+%+@###@&===&@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#+%%_@+##+@&=========================================*@###############################@+===============&@####### ",
+" #######@o===============&@###########################@X;;;;;;;;;;;O+%%%_@##@&====&@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o%+@###@*==$@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#o%%o@###+@&========================================*@###############################@+===============&@####### ",
+" #######@o===============&@###########################@X;;;;;;;;;;;X@%%%_@##@+====*#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#o_@+##@@*==&@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#o%%o@###+@*=======================================*@###############################@+===============&@####### ",
+" #######@o===============&@##########################++;;;;;;;;;;;;X#_%%%++#@+=====++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+#__@+##@@*=$@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+#_%%o@###@+$======================================*@###############################@+===============&@####### ",
+" #######@o===============&@##########################@O;;;;;;;;;;;;X#_%%%+@#@+$====&@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+#_o@###@+$=&#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%%o@###@&======================================*@###############################@+===============&@####### ",
+" #######@o===============&@##########################@X;;;;;;;;;;;;X@_%%%o@##@*====*#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@_o@###@+$=++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@+%%%o@##+@*=====================================*@###############################@+===============&@####### ",
+" #######@o===============&@###########################X;;;;;;;;;;;;;@o%%%o@##@&=====++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#+_+@###@o=*#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o%%%+@##@o=====================================*@###############################@+===============&@####### ",
+" #######@o===============&@#########################++;;;;;;;;;;;;;;+o%%%_@##@&=====&@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@+_+@###@&=+@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@_%%_@###@*====================================*@###############################@+===============&@####### ",
+" #######@o===============&@#########################@O;;;;;;;;;;;;;;++%%%%++#@+=====$#O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o%+@###@**#O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@+%%%+@##@o====================================*@###############################@+===============&@####### ",
+" #######@o===============&@#########################@X;;;;;;;;;;;;;;O@%%%%+@#+@$=====++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#o_+@##@@*&@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#_%%_@##+@$===================================*@###############################@+===============&@####### ",
+" #######@o===============&@##########################;;;;;;;;;;;;;;;X#_%%%o@##@&=====*#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#__@+##@+&+O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%%+@##@&===================================*@###############################@+===============&@####### ",
+" #######@o===============&@########################++;;;;;;;;;;;;;;;;@o%%%_@##@o======++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@%_@###@++@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o%%_@##@+$==================================*@###############################@+===============&@####### ",
+" #######@o===============&@########################@+;;;;;;;;;;;;;;;;++%%%%#+#@+$=====&@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%o@###@+@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@_%%+@##@*==================================*@###############################@+===============&@####### ",
+" #######@o===============&@########################@O;;;;;;;;;;;;;;;;O@%%%%+@##@*=====*#O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o%+@###+#+X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@o%%_@##@+==================================*@###############################@+===============&@####### ",
+" #######@o===============&@########################@X;;;;;;;;;;;;;;;;X#_%%%o@##@&======++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#_%#@####@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#_%%++##@*=================================*@###############################@+===============&@####### ",
+" #######@o===============&@########################+;;;;;;;;;;;;;;;;;X@o%%%_@##@+======*#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%_@+####+X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@+%%o@##@&=================================*@###############################@+===============&@####### ",
+" #######@o===============&@#######################++;;;;;;;;;;;;;;;;;;++%%%%+@##@*======++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o%o@####@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#_%_@##@+$================================*@###############################@+===============&@####### ",
+" #######@o===============&@#######################@O;;;;;;;;;;;;;;;;;;O@%%%%o@##@&======&#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#_%+@####@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@o%%+@##@*================================*@###############################@+===============&@####### ",
+" #######@o===============&@#######################@X;;;;;;;;;;;;;;;;;;X#_%%%_@##@+======$++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%#+###@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#_%o@##@&================================*@###############################@+===============&@####### ",
+" #######@o===============&@#######################@X;;;;;;;;;;;;;;;;;;;++%%%%+@##@*======&@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o%_@####@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@o%_@##@+================================*@###############################@+===============&@####### ",
+" #######@o===============&@######################++;;;;;;;;;;;;;;;;;;;;O@_%%%o@##@&======$@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#_%+@###@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@%%+@##@*===============================*@###############################@+===============&@####### ",
+" #######@o===============&@######################++;;;;;;;;;;;;;;;;;;;;X#o%%%_@##@+$======&@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%#+###@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o%o@##@&===============================*@###############################@+===============&@####### ",
+" #######@o===============&@######################@+;;;;;;;;;;;;;;;;;;;;;++%%%%+@##@&======*#O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#_%o@###@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%_@##@+===============================*@###############################@+===============&@####### ",
+" #######@o===============&@######################@O;;;;;;;;;;;;;;;;;;;;;X#_%%%_@##@+=======+@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%+@###@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#_%+@##@*==============================*@###############################@+===============&@####### ",
+" #######@o===============&@######################@O;;;;;;;;;;;;;;;;;;;;;;+o%%%%++##@*======*#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#_%_@###@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%o@##@&==============================*@###############################@+===============&@####### ",
+" #######@o===============&@######################@X;;;;;;;;;;;;;;;;;;;;;;O@%%%%o@##@&=======++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%+@###@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#%_@##@o==============================*@###############################@+===============&@####### ",
+" #######@o===============&@#######################X;;;;;;;;;;;;;;;;;;;;;;X@o%%%_@##+@$======*#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#_%_@###@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@o%++#@#$=============================*@###############################@+===============&@####### ",
+" #######@o===============&@#####################++;;;;;;;;;;;;;;;;;;;;;;;;++%%%%+@##@&======$++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%+@###+X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%+@##@*=============================*@###############################@+===============&@####### ",
+" #######@o===============&@#####################++;;;;;;;;;;;;;;;;;;;;;;;;X#_%%%_@##@@$======&#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#_%_@###@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#__@##@&=============================*@###############################@+===============&@####### ",
+" #######@o===============&@#####################@+;;;;;;;;;;;;;;;;;;;;;;;;;++%%%%+@##@&======$++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@o%%+@##++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+o_@##@+=============================*@###############################@+===============&@####### ",
+" #######@o===============&@#####################@O;;;;;;;;;;;;;;;;;;;;;;;;;X#_%%%_@##@+$======&#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@%%_@###@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%+@#+@$============================*@###############################@+===============&@####### ",
+" #######@o===============&@#####################@O;;;;;;;;;;;;;;;;;;;;;;;;;;++%%%%+@##@&======$@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o%%+@##++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#_o@##@*============================*@###############################@+===============&@####### ",
+" #######@o===============&@#####################@O;;;;;;;;;;;;;;;;;;;;;;;;;;X#_%%%_@##@+$======&@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%o@###@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@o_@##@&============================*@###############################@+===============&@####### ",
+" #######@o===============&@#####################@X;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%%%+@##@&======$@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@_%_@###@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O+_++#@+============================*@###############################@+===============&@####### ",
+" #######@o===============&@#####################@X;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o%%%_@##@@$======&@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@o%%+@####;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#_+@#+@$===========================*@###############################@+===============&@####### ",
+" #######@o===============&@#####################+X;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@%%%%+@##@&======$#O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%_@###@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+oo@##@*===========================*@###############################@+===============&@####### ",
+" #######@o===============&@######################X;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@o%%%_@##+@*======o@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#_%%+@##++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++o@##@&===========================*@###############################@+===============&@####### ",
+" #######@o===============&@######################;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#_%%%+@##@o======*#O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%o@###+X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@o+##@+===========================*@###############################@+===============&@####### ",
+" #######@o===============&@#####################+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%%_@###@*======o@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#_%_@###@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@o+@#++$==========================*@###############################@+===============&@####### ",
+" #######@o===============&@####################++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#_%%%+@##@+======*#O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@+%%+@##@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++o@##@*==========================*@###############################@+===============&@####### ",
+" #######@o===============&@####################++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%%_@###@&======++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o%_@##++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O+o@##@&==========================*@###############################@+===============&@####### ",
+" #######@o===============&@####################++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@o%%%o@##@+$=====*#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+#_%+@##+X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@o+##@o==========================*@###############################@+===============&@####### ",
+" #######@o===============&@#####################+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#_%%%++##@&======++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+#__+##@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++++#@+==========================*@###############################@+===============&@####### ",
+" #######@o===============&@######################;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%%o@##+@*=====*#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+#o+@#@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++++#+@$=========================*@###############################@+===============&@####### ",
+" #######@o===============&@######################X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@o%%%+@##@+=====$++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#+#+#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@++##@*=========================*@###############################@+===============&@####### ",
+" #######@o===============&@#####################+X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#_%%_@###@&=====&#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X+#+O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X++###@&=========================*@###############################@+===============&@####### ",
+" #######@o===============&@#####################@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%%o@##@#$====$++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+####@+=========================*@###############################@+===============&@####### ",
+" #######@o===============&@#####################@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@+%%%#+##@o=====&@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@###@+$========================*@###############################@+===============&@####### ",
+" #######@o===============&@#####################@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#_%%o@###@*====$@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@###+@*========================*@###############################@+===============&@####### ",
+" #######@o===============&@#####################@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@_%%+@##@+=====o@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X+####@*========================*@###############################@+===============&@####### ",
+" #######@o===============&@#####################@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%_@###@&====*#O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++###@&========================*@###############################@+===============&@####### ",
+" #######@o===============&@#####################++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o%%o@##@@$====++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@###@o========================*@###############################@+===============&@####### ",
+" #######@o===============&@######################+X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#_%%++##@o====*#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@###@+========================*@###############################@+===============&@####### ",
+" #######@o===============&@######################@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@_%_@###@*====++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@###+@$=======================*@###############################@+===============&@####### ",
+" #######@o===============&@######################@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@+%%+@##@+====&@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#####@*=======================*@###############################@+===============&@####### ",
+" #######@o===============&@######################++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o%_@+##@&===*#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++###@&=======================*@###############################@+===============&@####### ",
+" #######@o===============&@#######################@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#_%o@##@@*===++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@###@o=======================*@###############################@+===============&@####### ",
+" #######@o===============&@#######################@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@%%+@##@+===&@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@###@+=======================*@###############################@+===============&@####### ",
+" #######@o===============&@########################+X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@+%_@###@*==*#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@###@+$======================*@###############################@+===============&@####### ",
+" #######@o===============&@########################@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o%+@##@+===++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#####@*======================*@###############################@+===============&@####### ",
+" #######@o===============&@########################++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+#_%@+##@*==o@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++###@*======================*@###############################@+===============&@####### ",
+" #######@o===============&@#########################@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%o@##@+==*#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@###@&======================*@###############################@+===============&@####### ",
+" #######@o===============&@#########################@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o%#+##@*=*#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@###@&======================*@###############################@+===============&@####### ",
+" #######@o===============&@###########################;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O#_o@##@+==++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@###@+======================*@###############################@+===============&@####### ",
+" #######@o===============&@##########################@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++_++##@*=o+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@###@+$=====================*@###############################@+===============&@####### ",
+" #######@o===============&@##########################++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#oo@##@+=*@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X+###+@$=====================*@###############################@+===============&@####### ",
+" #######@o===============&@###########################@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++_#+#+@$*#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#####@*=====================*@###############################@+===============&@####### ",
+" #######@o===============&@###########################@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#_o@##@&$@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++###@&=====================*@###############################@+===============&@####### ",
+" #######@o===============&@############################+X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++_@##@+=+O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@###@&=====================*@###############################@+===============&@####### ",
+" #######@o===============&@############################@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o+@#+#$o+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@###@+=====================*@###############################@+===============&@####### ",
+" #######@o===============&@##############################;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+++@##@&o+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@###@+$====================*@###############################@+===============&@####### ",
+" #######@o===============&@#############################@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@+###+#++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@###+@$====================*@###############################@+===============&@####### ",
+" #######@o===============&@#############################++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@####+@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@++##@*====================*@###############################@+===============&@####### ",
+" #######@o===============&@##############################@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@#######;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X+++##@&====================*@###############################@+===============&@####### ",
+" #######@o===============&@##############################++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@+#####;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X++###@&====================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X++++##+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+++##@o====================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@+++++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+o++#@+====================*@###############################@+===============&@####### ",
+" #######@o===============&@################################@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@+#@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+o+@#@+$===================*@###############################@+===============&@####### ",
+" #######@o===============&@################################@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@@@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+oo@##@*===================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@+@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O+O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+oo@##@*===================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*o@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+o_@##@*===================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@**#O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+o_@##@&===================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*=o@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+o%@##@+===================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*=*#O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+o%++#@+===================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*==o@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+o%+@#@+$==================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*==$@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+o%+@##@*==================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*===&#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+o%o@##@*==================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*===$++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@o%o@##@&==================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*====*#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@o%_@##@&==================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*=====+@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@_%_@+#@+==================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*=====*#O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@_%%++#@+==================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*======&@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@%%%+@#@+$=================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*======$++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%%o@#@+$=================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*=======*#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@o%%%o@##@*=================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*========+@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#_%%%_@##@&=================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*========$@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@%%%%_@##@&=================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*=========&#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%%%+@##@o=================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*=========$+@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#_%%%+@###@&=================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*==========*#+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@%%%o@###@+==================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*===========&#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#+%%o@###@+$==================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*============+@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#_%_@+##@+$===================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*============*@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%%+@##@@*====================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*=============&#O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o%+@###@*=====================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*==============+@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++%o@###@&======================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*==============$++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#o_@###@+=======================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*===============*#+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+#_#+##@+$=======================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*================&#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@++@##+@*========================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*=================+@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@+@###@&=========================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*=================$++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@#+###@+==========================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@*==================*#+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@####@+$==========================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@&===================&#O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@####@@*===========================*@###############################@+===============&@####### ",
+" #######@o===============&@###############################@o====================o#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++####@*============================&@###############################@+===============&@####### ",
+" #######@o===============&@###############################@+$===================$+@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@####@&=============================+@###############################@+===============&@####### ",
+" #######@o===============&@################################@&====================$+@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@####@+=============================*@################################@+===============&@####### ",
+" #######@o===============&@################################+@*====================*@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++###@#$============================$#@################################@+===============&@####### ",
+" #######@o===============&@#################################@+*====================*@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@###@@*============================*+@#################################@+===============&@####### ",
+" #######@o===============&@##################################@@&$===================*@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@###+@*===========================$&+@##################################@+===============&@####### ",
+" #######@o===============&@###################################+@@+oooooooooooooooooo&+@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#+###+#ooooooooooooooooooooooooooo++@@###################################@+===============&@####### ",
+" #######@o===============&@#####################################@@@@@@@@@@@@@@@@@@@@@+#@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@######@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#####################################@+===============&@####### ",
+" #######@o===============&@#############################################################@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@#########################################################################@+===============&@####### ",
+" #######@o===============&@##############################################################@X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@##########################################################################@+===============&@####### ",
+" #######@o===============&@##############################################################+#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X@###########################################################################@+===============&@####### ",
+" #######@o===============&@###############################################################++X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X#+###########################################################################@+===============&@####### ",
+" #######@o===============&@################################################################@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@############################################################################@+===============&@####### ",
+" #######@o===============&@#################################################################@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@#############################################################################@+===============&@####### ",
+" #######@o===============&@##################################################################@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@##############################################################################@+===============&@####### ",
+" #######@o===============&@###################################################################@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@###############################################################################@+===============&@####### ",
+" #######@o===============&@####################################################################@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@################################################################################@+===============&@####### ",
+" #######@o===============&@#####################################################################@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+@#################################################################################@+===============&@####### ",
+" #######@o===============&@######################################################################@+X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X+@##################################################################################@+===============&@####### ",
+" #######@o===============&@#######################################################################@+X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X+@###################################################################################@+===============&@####### ",
+" #######@o===============&@########################################################################@#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X++####################################################################################@+===============&@####### ",
+" #######@o===============&@#########################################################################++X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@+#####################################################################################@+===============&@####### ",
+" #######@o===============&@##########################################################################+@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O@#######################################################################################@+===============&@####### ",
+" #######@o===============&@############################################################################@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X+@########################################################################################@+===============&@####### ",
+" #######@o===============&@#############################################################################@+X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O+@#########################################################################################@+===============&@####### ",
+" #######@o===============&@##############################################################################+@O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X+@###########################################################################################@+===============&@####### ",
+" #######@o===============&@################################################################################@+X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;O+@############################################################################################@+===============&@####### ",
+" #######@o===============&@#################################################################################+@+X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X+@##############################################################################################@o===============&@####### ",
+" #######@o===============*@###################################################################################@#O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X+@+###############################################################################################@&===============&@####### ",
+" #######@o===============$@+####################################################################################@+O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X+@@#################################################################################################@*===============&@####### ",
+" #######@o================+@#####################################################################################+@+OX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X+@@##################################################################################################@+================&@####### ",
+" #######@o================*@#######################################################################################+@#+X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X+@+####################################################################################################@&================&@####### ",
+" #######@o=================+@#########################################################################################@@+OX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;XO+#+++###################################################################################################@+$================&@####### ",
+" #######@o=================*@@##########################################################################################+@#+OX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;XO+#@+_o++##################################################################################################+@*=================&@####### ",
+" #######@o==================*@@############################################################################################@@+++OX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;XX++#@+o__+@@##################################################################################################+@&==================&@####### ",
+" #######@o===================*@@##############################################################################################+@@@#+OOXXX;;;;;;;;;;;;;;;;;XXOO+@###+_%%%o@@###################################################################################################@@&===================&@####### ",
+" #######@o====================*+@@#################################################################################################+@@@@#+++++++OO+++++++@@##++o__%%%%o#@+##################################################################################################@@+*====================&@####### ",
+" #######@o=====================$&+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#####################+++@@@@@@@@@++oo___%%%%%%%o#@+#################+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+&$=====================&@####### ",
+" #######@o========================**&ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo+@#################################+o_%%%%%%%_o#@+##################++ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo&&*$=======================&@####### ",
+" #######@o=========================================================================================================$+@#################################+@@#+o_%_o@@+####################+@$=========================================================================================================&@####### ",
+" #######@o=========================================================================================================*@#####################################+@@@+@@+#######################@&=========================================================================================================&@####### ",
+" #######@o=========================================================================================================+@#########################################+##########################@+$========================================================================================================&@####### ",
+" #######@o========================================================================================================*@######################################################################@&========================================================================================================&@####### ",
+" #######@o========================================================================================================+@######################################################################@+$=======================================================================================================&@####### ",
+" #######@o=======================================================================================================*@########################################################################@&=======================================================================================================&@####### ",
+" #######@o=======================================================================================================+@########################################################################@#$======================================================================================================&@####### ",
+" #######@o======================================================================================================&@##########################################################################@+======================================================================================================&@####### ",
+" #######@o=====================================================================================================*@+###########################################################################@&=====================================================================================================&@####### ",
+" #######@o====================================================================================================$+@############################################################################@@*====================================================================================================&@####### ",
+" #######@o===================================================================================================$+@##############################################################################@+$===================================================================================================&@####### ",
+" #######@o===================================================================================================o@################################################################################@+$==================================================================================================&@####### ",
+" #######@o==================================================================================================&@##################################################################################@+$=================================================================================================&@####### ",
+" #######@o=================================================================================================o@####################################################################################@+$================================================================================================&@####### ",
+" #######@o===============================================================================================$o@######################################################################################@+$===============================================================================================&@####### ",
+" #######@o==============================================================================================$+@########################################################################################@+*==============================================================================================&@####### ",
+" #######@o=============================================================================================*+@##########################################################################################@@*=============================================================================================&@####### ",
+" #######@o============================================================================================&@@############################################################################################@@&$===========================================================================================&@####### ",
+" #######@o==========================================================================================*+@@###############################################################################################@+*==========================================================================================&@####### ",
+" #######@o========================================================================================$&@@##################################################################################################@@o*========================================================================================&@####### ",
+" #######@o======================================================================================$&+@+#####################################################################################################@@&$======================================================================================&@####### ",
+" #######@o====================================================================================$&+@@########################################################################################################+@@&*====================================================================================&@####### ",
+" #######@o=================================================================================$*o@@@############################################################################################################@@@+*$=================================================================================&@####### ",
+" #######@o==============================================================================$*&+@@+################################################################################################################+@@+&*$==============================================================================&@####### ",
+" #######@o============================================================================*++@@@######################################################################################################################@@@++*============================================================================&@####### ",
+" #######@o===========================================================================$#@@+###########################################################################################################################@@@*===========================================================================&@####### ",
+" #######@o===========================================================================&@################################################################################################################################@+===========================================================================&@####### ",
+" #######@o===========================================================================o@################################################################################################################################@+===========================================================================&@####### ",
+" #######@o===========================================================================&@################################################################################################################################@+===========================================================================&@####### ",
+" #######@o===========================================================================$#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*===========================================================================&@####### ",
+" #######@o============================================================================*o+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*============================================================================&@####### ",
+" #######@o===============================================================================$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$==============================================================================&@####### ",
+" #######@o==========================================================================================================================================================================================================================================================================================&@####### ",
+" #######@o==========================================================================================================================================================================================================================================================================================&@####### ",
+" #######@o==========================================================================================================================================================================================================================================================================================&@####### ",
+" #######@o==========================================================================================================================================================================================================================================================================================&@####### ",
+" #######@o==========================================================================================================================================================================================================================================================================================&@####### ",
+" #######@o==========================================================================================================================================================================================================================================================================================&@####### ",
+" #######@o==========================================================================================================================================================================================================================================================================================&@####### ",
+" #######@o==========================================================================================================================================================================================================================================================================================&@####### ",
+" #######@+==========================================================================================================================================================================================================================================================================================o@####### ",
+" ########@*========================================================================================================================================================================================================================================================================================*+@####### ",
+" ########@@&$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&#@######## ",
+" ########+@@++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#@@######## ",
+" ##########+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@########## ",
+" ######################################################################################################################################################################################################################################################################################################### ",
+" ######################################################################################################################################################################################################################################################################################################## ",
+" ###################################################################################################################################################################################################################################################################################################### ",
+" #################################################################################################################################################################################################################################################################################################### ",
+" ################################################################################################################################################################################################################################################################################################## ",
+" ############################################################################################################################################################################################################################################################################################## ",
+" ########################################################################################################################################################################################################################################################################################## ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
diff --git a/utils/images/logo-50.xpm b/utils/images/logo-50.xpm
index 2661a96..b96acc7 100644
--- a/utils/images/logo-50.xpm
+++ b/utils/images/logo-50.xpm
@@ -1,7 +1,7 @@
/* XPM */
/* XScreenSaver Logo, designed by Angela Goodman <rzr_grl@yahoo.com>
- Copyright (c) 2001, 2002 by Jamie Zawinski <jwz@jwz.org>
+ Copyright © 2001-2021 Jamie Zawinski <jwz@jwz.org>
Unauthorized use or reproduction prohibited.
https://www.jwz.org/xscreensaver/
diff --git a/utils/images/logo.pdf b/utils/images/logo.pdf
new file mode 100644
index 0000000..fcb4e5d
--- /dev/null
+++ b/utils/images/logo.pdf
@@ -0,0 +1,1156 @@
+%PDF-1.5 %
+1 0 obj <</Metadata 2 0 R/OCProperties<</D<</ON[5 0 R 28 0 R 50 0 R 72 0 R]/Order 73 0 R/RBGroups[]>>/OCGs[5 0 R 28 0 R 50 0 R 72 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <</Length 56941/Subtype/XML/Type/Metadata>>stream
+<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27 ">
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description rdf:about=""
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <dc:format>application/pdf</dc:format>
+ <dc:title>
+ <rdf:Alt>
+ <rdf:li xml:lang="x-default">jwz 8.5x11 CMYK</rdf:li>
+ </rdf:Alt>
+ </dc:title>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xmp="http://ns.adobe.com/xap/1.0/"
+ xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/">
+ <xmp:CreatorTool>Adobe Illustrator CS6 (Macintosh)</xmp:CreatorTool>
+ <xmp:CreateDate>2021-02-04T18:07:40-08:00</xmp:CreateDate>
+ <xmp:ModifyDate>2021-02-04T19:52:55-08:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2021-02-04T19:52:55-08:00</xmp:MetadataDate>
+ <xmp:Thumbnails>
+ <rdf:Alt>
+ <rdf:li rdf:parseType="Resource">
+ <xmpGImg:width>228</xmpGImg:width>
+ <xmpGImg:height>256</xmpGImg:height>
+ <xmpGImg:format>JPEG</xmpGImg:format>
+ <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADkAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7&#xA;FXYq8K/5yh1eK78tS6DaXU1tqmnG31aa23RLqzLPA3pkEeoYZCrsOw37VCrIv+cevzK/xj5NS0vp&#xA;ueu6MFt73kfilipSGf35KOLH+YE9xir1PFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY&#xA;q7FXYq7FXYq7FXYq7FXYq7FXkf8Azkd5MtdY8rW+tlP9I0aQrNInwuLS6pFLv4IxRzXbiG8TkZ3W&#xA;3NtwiJmBL6T+L+D5m8n+ZNd/Lbzrb6tbAyRxfDdRDZLi0dgHU9aVpt4MBgx5BIWG3V6WeDIYT5j8&#xA;W+5fL2v6X5h0Wz1nSphPYX0Ylgk6Gh6qw7Mp2Ydjk3FTDFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F&#xA;XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqhdV0211TTLvTbtedrewyW86eMcqlGH3HFXxrq2iTcZ9&#xA;NvgGv7CSa0mdxQNJC5ikrT9iQpy29mG4Gawy8LIe57XHphrtHE/5SAq/d0PvCd/kP+aEvkbzG3lr&#xA;WpWXy3qktIpJDta3J+EOewVtlk7dHHw7nZRlYeNyQMSQdiH1yCCKjcHCwdirsVdirsVdirsVdirs&#xA;VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVfM/wCcWk/o78x9SKpxh1GK31BD25Op&#xA;t3A/2VtyP+tmv1sdwXr/AGXzbTh7j+g/oeZ+ZNHgvLdpWIQqPjfstOkh9l/a/wAnxKrkNLmo8LZ7&#xA;Qdm8Q8aPMfV+v9fl7nuX/OOH5qT6rZt5I1+QrrukoVsnkPxT28exSvd4h9679jmzBt40inuWKHYq&#xA;7FUn1rzj5V0Swt9Q1bVbazsbp1jtriSReEjNuODCtdt69Biqbo6OiujBkYAqwNQQdwQRireKuxV2&#xA;KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvD/wDnIqx46v5ev12D295bye5V4Hj+&#xA;4GTMXWD0fF33s5k4dTX86JH6f0PJc1b3sogijyKR30GoaXLD5k0VzBq3l6SKQuu5a2Y0gkPj6ZUw&#xA;sN6oFrmwwZ/UAf4vv6j48/m+ddpaHwZyA/h/3J5fL6S+w/y786WXnPyhp/mC1AQ3KcbqAf7quE+G&#xA;WP5Bh8PiKHM51LI8VeOfnj50vrie38gaBdizvtRK/pnUa0FtaspkdeQpQ+ijyyeEa/5QwXvTIR2t&#xA;4xpFun5rfmbo3liz9SLyXocXoWkNSrLp9qBzlfv6ty1AW6gsPDCh9kRRRwxJFEoSKNQiINgFUUAH&#xA;yxQuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV49/zkX/vHoH/ADET/wDJ&#xA;sZj6r+7LuOwf8bh/nf7kvFs1L6IjNDW2fWRHckG2mtLmK5jYjiYSELswPYcQPpyOa/DJH1CUSPe8&#xA;92zGPiwJ6xmD7tizT/nEO8uOHmvToi0ukQz281rKwIHN/URvpZI0J+WdAOTwpe3edvNVp5W8tXms&#xA;3C+o0KhLW3rQzXEh4wxD/Wcip7Cp7YCa3TGJkQBzL4s86eYtUF1cLJM8upapHJLqNyOknruDKRTd&#xA;f7ngPCOq9MowS4rk7TtTTjBwYhzEbl/WP7AHsv8Azh/5dVNL17zE6/HPNHYQMeyxKJZKf6xkT7sy&#xA;HVF9FYodirsVdirsVdirsVdirsVdirsVdirTMqKWYhVUVZjsAB1JOKpefMnl0bHVLOv/ABni/wCa&#xA;sVd/iXy5/wBXWz/6SIv+asVd/iXy5/1dbP8A6SIv+asVd/iXy5/1dbP/AKSIv+asVd/iXy5/1dbP&#xA;/pIi/wCasVd/iXy5/wBXWz/6SIv+asVd/iXy5/1dbP8A6SIv+asVd/iXy5/1dbP/AKSIv+asVd/i&#xA;Xy5/1dbP/pIi/wCasVeK/n55gsdR1rRbGxuYrmO0trie5aGRZArXDxpFXiTTaCTMTWGoU9B7N4uL&#xA;UcX82J/U8wzWPdkgCylXmW/Nh5bMkdTf+YP3FmoryWxUgswG/wDvQ1PmtPDMnBDiyV/Dj5/1j/xI&#xA;+14HtTWHITP+ftHygP8Aii+mvyh0ry15K8h6fo76nZC/ZfrOpMJ4t7mahcVDb8BRAfBc2ronnX51&#xA;+cY9e8zRaVYzrNpOijkzxMGSW9mSrNVTQ+jE4Ue7N4ZhazJQ4e96X2c0XHkOWXKHL3/s/U8xudIS&#xA;W11/WpwCtjp5trQUr+8uAyu30K1PpzGjlo44D+Ik/JHa+O8+WZ/hEftAe6/8413+iad+U+ni4vra&#xA;3nubi6mkjkmjVv75owSpII2jHXNs829S/wAS+XP+rrZ/9JEX/NWKu/xL5c/6utn/ANJEX/NWKu/x&#xA;L5c/6utn/wBJEX/NWKu/xL5c/wCrrZ/9JEX/ADVirv8AEvlz/q62f/SRF/zVirv8S+XP+rrZ/wDS&#xA;RF/zVirv8S+XP+rrZ/8ASRF/zVirv8S+XP8Aq62f/SRF/wA1Yq7/ABL5c/6utn/0kRf81Yq7/Evl&#xA;z/q62f8A0kRf81YqibTUdPvQzWd1FcquzGF1kAPvxJxVEYq+IfzU/MvzP+Yvm+XTbCWaXRzc/VtH&#xA;0m3J4y0fjHIyL/eSSHcVrStBilan/OOf5zOiuPLpAYAgG7slO/iDOCPpxW2/+hcPzn/6l7/p8sf+&#xA;q+K27/oXD85/+pe/6fLH/qvitu/6Fw/Of/qXv+nyx/6r4rbv+hcPzn/6l7/p8sf+q+K27/oXD85/&#xA;+pe/6fLH/qvitu/6Fw/Of/qXv+nyx/6r4rbv+hcPzn/6l7/p8sf+q+K2oX3/ADj9+bdhZz3t5oa2&#xA;9pbI0s873tgFREFWYn1+wxW1/lXSmsNMX1F43FwfUk2oQKfCp77DffoSc1WqycUqHIPe+z+jOLDx&#xA;y+qe/wAOn608trBtSvoNNFQlxVrlxsVt0p6pr25VCDw5V7ZjHJ4cTPu5e/p+tt7XznhGGPOfPyj1&#xA;+fJILnyz5w/M3zPqUvlXTjf2mmBIIwssMKRwglY6NM8a/GVZgBm00eDw8YB+rmfeXhdVm45kjlyH&#xA;uUdZ/Ir81NE0yfVNU0T6tYW4UzTfWrN6cmCLRUmZmJZgAAMymgbpzp1kllYw2qUIiUAkVoW6sd/E&#xA;75pMs+KRL6b2dpfAwxh16+/qi7h+flXzRbL9pbWGcj2ZnB/5NZEf3uI+ch9jzfbEanm8xA/o/QxP&#xA;yz+TH5leZ9Hi1jQ9H+uabOzrFP8AWbWKpjYo3wyyo+zDwzevKpr/ANC4fnP/ANS9/wBPlj/1XxW3&#xA;f9C4fnP/ANS9/wBPlj/1XxW3f9C4fnP/ANS9/wBPlj/1XxW3f9C4fnP/ANS9/wBPlj/1XxW3f9C4&#xA;fnP/ANS9/wBPlj/1XxW3f9C4fnP/ANS9/wBPlj/1XxW3f9C4fnP/ANS9/wBPlj/1XxW3f9C4fnP/&#xA;ANS9/wBPlj/1XxW3f9C4fnP/ANS9/wBPlj/1XxW3f9C4fnP/ANS9/wBPlj/1XxW0j1vyl+ZH5b6j&#xA;aXuoW1zod45Js7yGVCCVoWUSwO618Vr9GKvff+hhNQ/5UX/iX4P8U/Wv0Ny4jh9a4ep9Y4dP7j4v&#xA;5ee3TbFDw38j/wDybPln/mMH/EGxSX3hih2KuxV2KuxV2KuxVxIAJJoBuScVfOP5rfmW/mu8bSdL&#xA;kK+WbST4pEJH16VD9s/8UIw+Aftn4vs8a4ep1HD6Rzej7E7I8Y+LkHoHId/7GB5rXuXX99+hvJOp&#xA;axXjeauRZWBruIRyXktP5v3kgPhxwxh4meOPpj9R9/4r7Xh9fquMTy/z/TH+qP17l73/AM46+TF8&#xA;tflrZTSx8b/Wv9yF0SKMFlA9BPkIgpp4k5vXm0p/5yJ1xhDo3l6Ntp5H1C8FKgpb0SFT4cpZOY/4&#xA;x5j6qfDD3u37E03i6mN8o+r5cvtp41mpfRVS1jM41SwRfi1HTLmMP29SIAxKf+RjnGR2if5s4/I7&#xA;PMdt4/3l/wA7HIfGO/6Xrv8Azidqi3X5a3FmT+80/UJk4/5EiJKp/wCCZs3zxRe04q7FXYq7FXYq&#xA;7FXYq7FXYq7FXg//ADl9/wAoRo3/AG0x/wBQ8mKQ8G/8oj/4Mv8A2IYq3+R//k2fLP8AzGD/AIg2&#xA;Kl94YodirsVdirsVSLzh538ueUNOjv8AXLn0IZpBDEqqXdmIqxCjfiigsx7DFIDR8+eUB5sHlI6n&#xA;EPMRT1Bp/wAXKnHnTlThy4fFx5cqb0pih59+e3nt7aBfKGmS8bm9jEusSoaNHaPULCCNw1wVIP8A&#xA;kA/zLlGfLwR83Z9laA6nLw/wDeX483igAAAAoBsANgBmoJfR4QEQANgFOdZnj9GAlZ52SCFwK8Xm&#xA;YRo1P8lmBOShQNnkN/k4PauUwwSr6pekf52yJ806Qmv+f/KXkW2UrZBolmRdgsTNR+ndIIiR88t7&#xA;IiTGWQ85y/H6Xh+05ASjAcoh9hxxxxRrHGoSNAFRRsAAKAAZt3VvmL82NVbU/wAxtYkqTFY+jp8F&#xA;enCCPm9P+e88g+jNdrZbgPZey+CoTyd5r5f2himYT1S63uBa39leGvG3nQyAdPTkrDIW9lSQt9GH&#xA;h4oyj3j7eYdP2zD93HJ/MkPkdj97Mf8AnGG+/Qvn3zV5RkPBJV9e1Ru/1WQoKf60cwb5DNzhyccB&#xA;LvD5/lhwyMe4vpfLGt2KuxV2KuxV2KuxV2KuxV2KvB/+cvv+UI0b/tpj/qHkxSHg3/lEf/Bl/wCx&#xA;DFW/yP8A/Js+Wf8AmMH/ABBsVL7wxQ8I/wCcj/zn1bytJb+WPLk31bVLqH6xfXygF4YXJVEjr0du&#xA;JJPYUp12VfLtz5h1+6maa51O7nmbdpJJ5HY99yzE4pUv0vq3/LbP/wAjX/rirv0vq3/LbP8A8jX/&#xA;AK4qyKzN3B5ZvNSu5XnmuEMMCzOWpG7BGpyP7Xh/k5jTnxZBHu3dxh04x6SeaXOfpj+k/YR82Lrc&#xA;3IuPXEzi4Jr63Ih6nb7Va5kunemaNZy2lhGk7M9y453DOSzFyAKEkn7IAX6M0+oycUvJ9F7F0fgY&#xA;Bf1S3P6B+OqOyl2yI0lS3mDSErRWuW5jx4W80g/4ZBkMsqxTP9H7yA6btg34cf6d/IFgf5kXlyPP&#xA;mpSpI0ckbIkbKxBUCJV2I6ZtOzo1gj7niNdK80vex/8AS+rf8ts//I1/65muI9E0COaPR7UTOZJW&#xA;UyM7bkmRi+5qa/azUak3MvofYWMR0sfOz9qYZQ7hZLFHNE8Ug5RyKUdelVYUI+7DE0bas+IZIGB5&#xA;SFMU89rdC50/XI5GS4u4Tb3cqFkP1q0/cyH2DpxYexzY6M1cO42PdLcfpHwfNdZAiVnnyPvjsf1/&#xA;FjP6X1b/AJbZ/wDka/8AXMxw3fpfVv8Altn/AORr/wBcVd+l9W/5bZ/+Rr/1xV36X1b/AJbZ/wDk&#xA;a/8AXFXfpfVv+W2f/ka/9cVd+l9W/wCW2f8A5Gv/AFxV36X1b/ltn/5Gv/XFXfpfVv8Altn/AORr&#xA;/wBcVZ5+Wn54ecPJ2rQGe9n1LQ2YC8024kaUcCd2hLkmNx1FNj3xWn27a3UF3aw3Vu4kgnRZYnHR&#xA;kcBlP0g4oeGf85ff8oRo3/bTH/UPJikPBv8AyiP/AIMv/Yhirf5H/wDk2fLP/MYP+INipfeGKHxZ&#xA;/wA5Okn83tRqa0t7UD/kQuKQ8pxS7FUTp1m97ew2qdZWCk0rQdzTbYDfIylwi2zDiOSYgOcjTKPP&#xA;E0cFnZafDxEa/Fw6lVjXhHT6Ccw9ILJkXofaAjHHHgjyjG/0foKQeXLVbrWrSJiKc+ZBFQRGOZX6&#xA;QuZWaXDAl0ugweLnhDoZfZ1+x6bmlfT3Yq6O5Szu7S/cVWymWVyTQLGapK3+xidjhEOIGP8AOBH6&#xA;vtdT2xE+CJ/zJCXw5H72GfmlaSW/na/Zh8Fx6c0TeKtGor/wSkZn9mz4sEfLb5PDa6NZpfP5sTzO&#xA;cR6ppP8AxybH/mHh/wCTa5pc31n3vpPZP+LQ/qovK3YuxVL9U0w6jYXumqKy3I+t2Pj9btkPJBvu&#xA;ZrcEAf5GX4snCRLu2PuP6j9heP7d0dTJHKe/+cOfzHzIeYZt3lXYq7FXYq7FXYq7FXYq7FX6C/lm&#xA;zN+XHlRmJLHR9PJJ3JJtY8WLyv8A5y+/5QjRv+2mP+oeTFIeDf8AlEf/AAZf+xDFW/yP/wDJs+Wf&#xA;+Ywf8QbFS+8MUPiv/nJz/wAm9qX/ABgtP+TC4pDyrFLsVZX5E0/lPNfOu0Q9OIkftN9oqfYbfTmH&#xA;rJ1Gu96L2b03HmOQ8oD7T+y1XzZYPeS318ppFpcMEch33knkJVen8pJx00hGIHWV/Y0dvXLUzPSP&#xA;CPmLQHkeONtYZ2I5RxMUBG9SQNvoOT1f0Fh2CP8AC4/H/cln2ap9CdiriARQioPUHEFjOIkCDyKQ&#xA;ecLB9Q0iJgOV/o0ZVWO7TWFdjXqWt2NG/wAk8j1zM0shGR/mz+yX/HvvfP8AtTSSxS4T/DyPfHp8&#xA;Y8i8/wA2Tp3p3l24a40W0lYBW4cSB/kEoPvC1zUakVMvoXYWQS0sfKx9qY5Q7h2KrJFkKhoX9KeN&#xA;lkhl68ZEIZGp3FRuO42yUSAd+XX3OHrtL4+Ix/i5g9xHJhPnbSEiuU1i0i9Ox1JmLxDcQXSn99Cf&#xA;9l8SeK9Ns2WlyWOA/VH7R0P6/N861OIxN1V9O49R+OjGcynGdirsVdirsVdirsVdir9BPyy/8lt5&#xA;T/7Y2n/9QseLF5Z/zl9/yhGjf9tMf9Q8mKQ8G/8AKI/+DL/2IYq3+R//AJNnyz/zGD/iDYqX3hih&#xA;8V/85Of+Te1L/jBaf8mFxSHlWKXYq9K8sWYtdEtloOUo9ZytaEybg7/5NM1Gqncz5PoHYOn8PTA9&#xA;Z7/q+xF6paF/IvmdwlZBd20oPcoqQLX6PiyGOZGfGOhjJ0nbEbnmPcYf7kMsbyl5cX8l/KPm3S7K&#xA;K31Bp/q2rXiAh5Vb1rejnp/vQkf+fXaamNwLquyMvh6qBPfXz2/Sx3NO+lOxV2KrJYy4Uq3CWM8o&#xA;pKV4tQjoeoIJDDuCRkoSr3OFr9FHUQ4TtIcj3fs7wxmxOl+WvM8Gq3+kQ6robScNQ0qYcggkqf3T&#xA;GhA2LRN7cW3DZt8OTiH4/HvfOtVp5YpmMhRH4+Xc9H86aP5Zs7+y1bykka+VPMNuLrTxECEjuIQI&#xA;7mEgmqMAEbid68vDMbW4+Unf+zWrEZSxH+Lce/r9n3JDmvezdirsVULmG0kguLe9Utpt4ALwIKvG&#xA;6CkdzGB1ePow/aX5AZbCR2r6hy8++Px+95rtrs+7ygek/V+iXw6+Tf5bXPkfy15kfy/+Yej2l9pl&#xA;4Vex1tk5CMOPhfktOcMnj+yfpptcOUZI2P7PIvGZcZgaL6Xi/Jf8pJY0li8t2MkUgDI6qSrKRUEE&#xA;NuDljWv/AOVJ/lR/1LFl/wAAf64q7/lSf5Uf9SxZf8Af64qwD85/yC8kDyXqWt+XrBdK1PSIHuyI&#xA;CwilhhUvIjoxK14AlStDXrtir5LxZOxV2Kv0E/LL/wAlt5T/AO2Np/8A1Cx4sXln/OX3/KEaN/20&#xA;x/1DyYpDwb/yiP8A4Mv/AGIYq3+R/wD5Nnyz/wAxg/4g2Kl94YofFf8Azk5/5N7Uv+MFp/yYXFIe&#xA;VYpV7G3+s3sFvy4etIsYbrQsQMEjQtnjgZyERzJp6uAAAFFANgB0AzRE2+qY8YhERHICkdpNs1/b&#xA;67o9QDf2Fbde/qRl1ZqexljyGafD4c/5s6+B/BeY7Uw3mnH+fAH4jb9TM/8AnH5YPOH5M+YPJkkg&#xA;S5tZnFux39MzgTW0tP8AJuI2b6M6F466NvPUMvGk0ZhnQsk8J6xyoSskZ90cFT8s0mSHDIh9P0Gq&#xA;GfDGfeN/f1XZBzHYq7FUNfWUd1EysqlipT4h8JVqckam/E0HTcGhG4GW4svCfJ1fanZsdTDb+8HI&#xA;/oPl93NIrHVLzy7bz6TOzSeXr+USwmSrtZ30I+GSi/tBX4ScRSWJqj9mm0jITFF4AieHJfKUT9oZ&#xA;Da3EdzAkyfZcdKg0I2IqNjQ7bZqckDGVF9I0OrjqMQmOvPyPVVyDluxV2KqcmmW2q2EugXCrWYPJ&#xA;os7UBgugC5hB7JLStP8AW/ycn4hgfEHT6vMd/vDx3anZwxy4QPRL6f6Mv5vuPR7F/wA4veep9W8r&#xA;XPlbUWP6S8usI4Veoc2jEhFNe8Tgp7Djm7t5Uh7Zih2Ksa/M3/yW3mz/ALY2of8AULJir8+8WTsV&#xA;dir9BPyy/wDJbeU/+2Np/wD1Cx4sXln/ADl9/wAoRo3/AG0x/wBQ8mKQ8G/8oj/4Mv8A2IYq3+R/&#xA;/k2fLP8AzGD/AIg2Kl94YofFf/OTn/k3tS/4wWn/ACYXFIeVYpT3yZbtLrkbihWFHdwfAjiKf7Jh&#xA;mPqZVAu07FxceqgO7f5C3oWal9GVtOvBYatZXp2RJPRnNKn0p6I3yCvwdvZcE8fiQlDqRt7w6Xtj&#xA;HQhl/mGj7pbfYaTj8rNXHkf8859Knb09L8yj0oy1AoeZucBHym5RD55s9Bn8XDGXXkfeHh9Zh8PI&#xA;R0T386vLB0Xzo2oQrx0/X1Nwh7LeRgLcJ/s14yDxPM5HWY9uJ3/s1rOGZwnlLce/r9n3MEzXvZux&#xA;V2KuxVBajZ2c0MgvB/ocqhbwjqirUrOv+VCSW915LvXL8MyNhz6fq+P30XnO3dAJR8Uf53u/ne+P&#xA;3JH5fa80jWbrQNQP7xWrEwNVJA2Kmn2XShBJ8MyM4GSAnH8f2Or7B1Zw5jhlyl9/T5/qZTmA9u7F&#xA;XYqsmRnSiOY5AQ8Uo6o6EMjj/VYA5KEqPk4mt0wzYjDr08j0RXkTzInlz85tF1xQLew8xD6rqEYp&#xA;xSWdvRmQkfyXKK5ObLSbQ4f5u3w6fY+caoeu+V/f1+19h5lOK7FWNfmb/wCS282f9sbUP+oWTFX5&#xA;94snYq7FX6Cfll/5Lbyn/wBsbT/+oWPFi8s/5y+/5QjRv+2mP+oeTFIeDf8AlEf/AAZf+xDFW/yP&#xA;/wDJs+Wf+Ywf8QbFS+8MUPiv/nJz/wAm9qX/ABgtP+TC4pDyrFLK/INvW5urmv2UEVP9c8v+NMw9&#xA;afSB5vRezUbzyPdH9IZpmte4WuiSI0bqGRwVdT0IIoQfnhBo2GvLijkgYS5SFKPmu2udY8qw6lC5&#xA;/TnlpwJ5VJEjQUBWYUpv8If2IYdsnpZjFm4f4Mm48j1H48ngtdp5cJB+vFsfMdD+PN7raX0X5vfk&#xA;wl1b8G8wWqh+FePDUrUbqafZWdTT/UfNzKIIouoxZTjmJR5g28PikEsayAFQwrxYUYHuGHYjoRmk&#xA;nExNF9R0uojmxxyR5SC/It7sVdirsUSiCKPJj/muwdtGtdVt6i80OVbOVqb/AFZvjtJN6/Yr6Ve5&#xA;GZunnUzE8pji+P8AEP0vnfaGmOKRA54zXw5xPy2TjT7xL2yhukoBKoYgGoDdGWvejVGYuSHDIh7n&#xA;Qarx8MZ9Tz9/VEZBzHYq7FWNecom+pc0PGS3lW6hcMQyhuMU3GnT4hAR7knNhpJfq/V+l4Tt/T+H&#xA;mJHKXq+PKX6D8X2p5I19fMPk/RtbBq1/aQzS07SMg9QfQ9Rmc88neKsa/M3/AMlt5s/7Y2of9Qsm&#xA;Kvz7xZOxV2Kv0E/LL/yW3lP/ALY2n/8AULHixeWf85ff8oRo3/bTH/UPJikPBv8AyiP/AIMv/Yhi&#xA;rf5H/wDk2fLP/MYP+INipfeGKHxX/wA5Of8Ak3tS/wCMFp/yYXFIeVYpZj+X9fTvq9CYqfc9f4Zg&#xA;63kHpvZgjxZ/1f0suzXvaOxVfa3jWF4t6qerFxMV7b05erbt9pePdl+0v0j9rEw448PI8we4ul7W&#xA;0tjxoizEVId8f2c0d+WHmtPyx/MZbWWfl5N8yBClzUmNEcn0Jqn/AH0W4v8A5J5eGbXSZ/EhvtIb&#xA;Eebwupw8Ett4nce5kn5weVP0B5ykubdOOl67zvbcj7KXII+tR/7JmEo8eTeGU6zH/E9H7Na2icJ6&#xA;7j9P6/gwrMB7F2KuxV2KqUy1juEMfrQXcLW15ACAzxn4kZC23qRP8SV23NetRZAjboQbH47iHRds&#xA;dnyyjjgLNUR3jy8wfmlXlO2urbTpIJ1ccJnERkVkqlBQqrAHieuXasgyBDT7OQyQxzjMEDi6j5/o&#xA;TrMV6N2KuxVLPMVt6+mSAKWb7IQDqXHBa+yswf8A2OZOllUqef8AaPBx4BPrA/Ydvvp71/zitrv6&#xA;Q/LH6g71l0i8mtwp3IjkpOp+XKVh9GbV4MvY8VY1+Zv/AJLbzZ/2xtQ/6hZMVfn3iydirsVfoJ+W&#xA;X/ktvKf/AGxtP/6hY8WLyz/nL7/lCNG/7aY/6h5MUh4N/wCUR/8ABl/7EMVb/I//AMmz5Z/5jB/x&#xA;BsVL7wxQ+K/+cnP/ACb2pf8AGC0/5MLikPKsUsk8jXQj1SSBnIWeMhEp1dfir7fCGzF1cbh7nd+z&#xA;+cQ1IB/iBH6f0M7zVvfuxV2KoHU9Oj1DTH0iYhUdzJpU79ILpzvET2inO3+S/wAxS/HOpcY5/wAX&#xA;mO/3x+0PG9sdneHy+iR2/oy7vdLp3FnfkjzJN5+/K2/8o6gGfzh5QT65pQc0lnitgV9PcE8uDNA3&#xA;+sp65tZREo13vN4cssUxMc4liEciSRrJG3KNwGRh0KkVBzSSFGn1LDlGSAmOUha7A2OxV2KuxV2K&#xA;uxV2KuxVTuIBPbywFiglRkLDqOQpUffkoSqQLjazD4uGUO+J+fRmH/OIWriPXvMuiiqx3EEN7DG3&#xA;VRDIYzt7ida5vHy0vp7FDGvzN/8AJbebP+2NqH/ULJir8+8WTsVdir9BPyy/8lt5T/7Y2n/9QseL&#xA;F5Z/zl9/yhGjf9tMf9Q8mKQ8G/8AKI/+DL/2IYq3+R//AJNnyz/zGD/iDYqX3hih8V/85Of+Te1L&#xA;/jBaf8mFxSHlWKVazuZLW6iuI6c4mDrWtKg13pTbBIWKZY5mEhIcxu9UtriO5t47iL+7lUOteoqO&#xA;hp3HfNJOJiSC+oaXUDNjjMfxD8fJVyLkOxVbJGkiNG45I4Ksp6EHYjDEkGw15sUckTCQuJSSPXtS&#xA;8o+ctO82WhLXVnMi3gr/AL0RMpX4/eWJXRv8peX7QzaaaYI2fN+0tJLBlMT8+8dD+vzZFexWcGo3&#xA;sFk/qWSTyNZHYf6LKfWtRQf8u8keYWrjU/e9h7PZjPSgfzSR+n9KlmO7x2KuxV2KuxV2KuxV2Kux&#xA;VV/I6+l0n89LSOYhU1Rbq327I6O8Q/4KFRm6xG4j3Plmsx8GWce6R+99i5Y4zGvzN/8AJbebP+2N&#xA;qH/ULJir8+8WTsVdir9BPyy/8lt5T/7Y2n/9QseLF5Z/zl9/yhGjf9tMf9Q8mKQ8G/8AKI/+DL/2&#xA;IYq3+R//AJNnyz/zGD/iDYqX3hih8V/85Of+Te1L/jBaf8mFxSHlWKXYqzbyNqTSW0ljJX9yeULd&#xA;qNUla9K1BI7nfwzA1mP+IPV+zetonCeu8f0j9PzZTmA9e7FXYqlmv6YdQsHjSvqqNgKVYVBK7+6g&#xA;9txSoGZGmy8Mt+To+3Ozjnx8UB64/aO79Sj5Vjv49OkF6H9X1eKGQMCY44o4o6BgDQKnEfLJayQM&#xA;hXc0ezWOUcUrFXL9Cc5ivRuxV2KuxV2KuxV2KuxV2KpHp182k/mboOtEnhFqtvG4J29OMW5cDwqJ&#xA;mza6WVwA/HMvnPbWPh1U/f8AoB/S+5syXUsa/M3/AMlt5s/7Y2of9QsmKvz7xZOxV2Kv0E/LL/yW&#xA;3lP/ALY2n/8AULHixeWf85ff8oRo3/bTH/UPJikPBv8AyiP/AIMv/Yhirf5H/wDk2fLP/MYP+INi&#xA;pfeGKHxX/wA5Of8Ak3tS/wCMFp/yYXFIeVYpdir2P8gvJq+bNH84adGVTUYYrO50uZuiXUZm4cqf&#xA;suCY3/yWOCUQRRZ48sschKPMKQ9QFkljaGeNmjngkFHjkQlXjYfzIwIOaXJAxlRfTNFq46jEJx68&#xA;/It5By3Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FWN+cIG/Qb36/BJbaqIY5F2I52cctajetVH4ZnaXJ&#xA;6hH+jf8Asi8D25G805DlxAf7EPuLRb8ajo1hqA3F5bxXAI/4tQP/ABzYOhSb8zf/ACW3mz/tjah/&#xA;1CyYq/PvFk7FXYq/QT8sv/JbeU/+2Np//ULHixeWf85ff8oRo3/bTH/UPJikPBv/ACiP/gy/9iGK&#xA;t/kf/wCTZ8s/8xg/4g2Kl94YofFf/OTn/k3tS/4wWn/JhcUh5Vil2Kvov/nDn/jpeaP+MNp/xKXF&#xA;BZV+enkT6jdt5w0+MCzuSqa5GooEl2SO627Nskn+xb+Y5janDxixzDuuxe0vy+Thl/dy5+Xn+t5T&#xA;mqfQXYq7FXYq7FXYq7FXYq7FXYq7FXYq0zKil3IVVBLMdgANyTiBZphkyCETI8gLS7zJdyXejad5&#xA;P0+2e917VJ1upIF3kieY8oYSBtzEbKpr0Aqcy9LhkcxyfwgcI865n5vnWt1IlGj9UpcZ8r6fJ9fe&#xA;QtH1LRfJWh6RqTI19p9lBbTmIlkrEgSik0rQCmbN1ah+Zv8A5LbzZ/2xtQ/6hZMVfn3iydirsVfo&#xA;J+WX/ktvKf8A2xtP/wCoWPFi8s/5y+/5QjRv+2mP+oeTFIeDf+UR/wDBl/7EMVb/ACP/APJs+Wf+&#xA;Ywf8QbFS+8MUPiv/AJyc/wDJval/xgtP+TC4pDyrFLsVfRH/ADh1PCus+ZbcuBNJbW0iR9yscjhi&#xA;PkXX78UF9O3Vrb3dtLa3MazW86NHNE45K6MKMrA9QRih8vfmD5EuvJmtC1HKXRLxmOkXbb0A+I20&#xA;h/35GPsn9tN+obNdqsFeoPY9gdq2BhyHf+E/o/V8u5jWYT1bsVdirsVdirsVdirsVdirsVdiqQ+a&#xA;dbWxhS3jX1LiYhih3HEHYMO4YihHcVHfMzSYbPEXlvaLX8MfBjzO8vd0H4/S99/5x8/KCXQbU+cP&#xA;MkZfzNqil4I5hV7WGTclgek0tfi7qPh2+LNiAAKDxpNva8KGLfmrcQ2/5Z+a5JnCIdJvYwx/nlge&#xA;NB/smYDFX5/4snYq7FX6Cfll/wCS28p/9sbT/wDqFjxYvLP+cvv+UI0b/tpj/qHkxSHg3/lEf/Bl&#xA;/wCxDFW/yP8A/Js+Wf8AmMH/ABBsVL7wxQ+K/wDnJz/yb2pf8YLT/kwuKQ8qxS7FU08t+Ztc8tax&#xA;Bq+iXb2eoQV4SpQgg9VZWBVlPcEUxQ9RX/nK/wDNEKAY9NYgULG3ep9zSUDFaS/zD/zkf568waTP&#xA;pWq2el3FnOByX0JQysDVXRhLVHQ7qw3BxSNt0t8teYk1KEQTsFvkG46CQD9oDx8R9I9tXqNPw7jk&#xA;9x2N2wMwGPIf3nQ/zv2p5mK9E7FXYq7FXYq7FXYq7FXYqgtX1W30y0aeXdjURRVoXbw+Q7n+NBlu&#xA;HEZmnW9pdox02O+czyH46MG0jzRd6b5ji1821te3kEnqxRXaNJCHH2G4Blrw/ZBNM3EYiIoPnWXJ&#xA;LJIykbkXpv8A0Nh+aH++tM/6R5P+quFrp3/Q2H5of760z/pHk/6q4rTFPPn51effO9mthq91HFpy&#xA;sHaytI/Sjdl3DPUszU7AtT2xWmCYpdirsVfoJ+WX/ktvKf8A2xtP/wCoWPFi8s/5y+/5QjRv+2mP&#xA;+oeTFIeDf+UR/wDBl/7EMVb/ACP/APJs+Wf+Ywf8QbFS+8MUPiv/AJyc/wDJval/xgtP+TC4pDyr&#xA;FLsVdirsVdiq+KWSGRZYmKSIQVYGhBG/bARaQSDYZ75e80wagq29yRFeigB6LJ228G9vu8Brc+mM&#xA;d48ntOyu3Y5AMeU1Pv6H9RT/ADEeldirsVdirsVdirsVS/V9bs9LgLzHlKR+7gB+Jv6D3/Xl2HAZ&#xA;+51XaXa2PTCvqyd363nep6pdajdNcXDVJ2VB9lV7ADwzawgIig8DqdTPNMzmbJQmTaHYq7FXYq7F&#xA;XYq7FX6Cfll/5Lbyn/2xtP8A+oWPFi8s/wCcvv8AlCNG/wC2mP8AqHkxSHg3/lEf/Bl/7EMVb/I/&#xA;/wAmz5Z/5jB/xBsVL7wxQ+Tv+csPJuo2nm6380xxM+malBHBNOASsdzCCvBvDlHxK+O/hikPB8Uu&#xA;xV2KuxV2KuxV2Ksh0nzlf2gEV0PrUI2BY0cf7Lev0/hmNl0sZbjYu40PbebB6T64dx/QWU2XmjRb&#xA;sALcCFyCSk3wUANN2Pwf8NmFPSzHm9Pp+39Nk5ngPn+v+xNEdJEEkbB0bcOpqD9IygxI5u2x58c/&#xA;pkJe423gbXUxpjOcYi5Ggoi8t2LCJvWZDSRYQZSh/wAvgG4D3agywYZe73uuz9r6fH/FxH+jv+z7&#xA;WL6z50kRmgsFVW2rMSshHiBTklR7FgRmbi0gG8t3m9b7RZJ+nGOAd/X9n43YjNNNNIZJnaSRt2di&#xA;SSem5OZgFPOkkmyswodirsVdirsVdirsVR+haHqmu6va6RpcDXN/eSCKCJRWpPc+CqN2PYb4ofoV&#xA;5e0mPRtA0zSI25R6baQWiNvuII1jB3/1cUPF/wDnL7/lCNG/7aY/6h5MUh4N/wCUR/8ABl/7EMVb&#xA;/I//AMmz5Z/5jB/xBsVL7wxQh9R03T9TsprHUbaO7srheE1vMoeN1PYq1Rirzm6/5xt/J+4naX9C&#xA;tCW3KRXVyqV9l9Q0+Q2xVS/6Fl/J/wD6tU3/AEl3H/NeKu/6Fl/J/wD6tU3/AEl3H/NeKu/6Fl/J&#xA;/wD6tU3/AEl3H/NeKu/6Fl/J/wD6tU3/AEl3H/NeKu/6Fl/J/wD6tU3/AEl3H/NeKu/6Fl/J/wD6&#xA;tU3/AEl3H/NeKsD/ADo/Kr8nfIvkm51CDTZBrF0fq2kxtdXDVmYbyFS52iWrb7VoO+KXzLilsOwI&#xA;IJqv2TXp8sVV/wBI6h/y1Tf8jG/rgoJsprpnm+9snDy2djqDLTgb22SVlpvsw4t+OU5dOJjnKPuN&#xA;NmPMYnkD7xalrnm3Xda+C8uONsDVLOECOBfki7H5mpxxaeGPkN+/mfmuTNKfPl3dEny9qeifkdpH&#xA;kPXPOK6D5vtjLFqKenpsyzSQ8bpTVYzwZQRKtQK/tcQOuKC+kv8AoWX8n/8Aq1Tf9Jdx/wA14od/&#xA;0LL+T/8A1apv+ku4/wCa8Vd/0LL+T/8A1apv+ku4/wCa8Vd/0LL+T/8A1apv+ku4/wCa8Vd/0LL+&#xA;T/8A1apv+ku4/wCa8Vd/0LL+T/8A1apv+ku4/wCa8Vd/0LL+T/8A1apv+ku4/wCa8VZd5R/LbyP5&#xA;QDHy9pMNlLIOMlxVpZmFa0Mspd6e1aYqyXFXg/8Azl9/yhGjf9tMf9Q8mKQ8G/8AKI/+DL/2IYq3&#xA;+R//AJNnyz/zGD/iDYqX3hih2KuxV2KuxV2KuxV2KsZ8+fmL5W8kaU1/rl0EdgfqtklGuJ2H7MaV&#xA;H0sdh3OKvij8yvzH1vz75hfVtS/dQIPTsLFDWO3i68R05Mx3Zu59qAKWJ4pdirsVdirsVdiq6OSS&#xA;KRZYmKSIQyOpIZWBqCCOhGKvrT8lf+cidM121t9B823CWWvRhYoL+UhYbzsOTbCOU9wdmPTc8cWL&#xA;3PFXYq7FXYq7FXYq7FXYq8H/AOcvv+UI0b/tpj/qHkxSHg3/AJRH/wAGX/sQxVv8j/8AybPln/mM&#xA;H/EGxUvvDFDsVdirsVdirsVWyyCOJ5CCwRSxVRUmgrQDFXyX5t/5yw86aistv5fs4NFgaoW4b/SL&#xA;kCuxBcCJTTr8B+eKaeL6rq+qavfSX+qXct7ezGslxO7SOf8AZMTsOwxVCYpdirsVdirsVdirsVdi&#xA;rsVeh+SPz4/MbyjFHa2t+L/TYwFSwvwZo1UdAjVWRAB0CtT2xRT6n/Jr802/MTQLrUJdO/R1xZXH&#xA;1eVFcyRuSgcMjEKR13Xt474oZ/irsVdirsVdirsVeD/85ff8oRo3/bTH/UPJikPBv/KI/wDgy/8A&#xA;YhirvyQIH5seWamn+mKPvVsVL7xxQ7FXYq7FXYq7FXYqk03krybPM80+g6dLNIxaSR7SBmZjuSxK&#xA;VJOKrP8AAnkf/qXtM/6Q7f8A5oxV3+BPI/8A1L2mf9Idv/zRirv8CeR/+pe0z/pDt/8AmjFXf4E8&#xA;j/8AUvaZ/wBIdv8A80Yq7/Ankf8A6l7TP+kO3/5oxV3+BPI//UvaZ/0h2/8AzRirv8CeR/8AqXtM&#xA;/wCkO3/5oxV3+BPI/wD1L2mf9Idv/wA0Yq7/AAJ5H/6l7TP+kO3/AOaMVd/gTyP/ANS9pn/SHb/8&#xA;0Yq7/Ankf/qXtM/6Q7f/AJoxVNLDTdO062Frp9rDZ2yklYLeNYkBO5IVABviqIxV2KuxV2KuxV2K&#xA;vBv+cvyP8E6KK7nUqgfKCTFIeD/+UR/8GX/sQxVkP5vfk35r8neZ7nV9GtZ59CluDdWF9aBme2Yt&#xA;zCSen8UZjb7L9DtvXYKseH53fmyo4/4mvfh23ZSdvGq1xWm/+V4fmz/1M1596f8ANOK07/leH5s/&#xA;9TNefen/ADTitO/5Xh+bP/UzXn3p/wA04rTv+V4fmz/1M1596f8ANOK07/leH5s/9TNefen/ADTi&#xA;tO/5Xh+bP/UzXn3p/wA04rTv+V4fmz/1M1596f8ANOK07/leH5s/9TNefen/ADTitO/5Xh+bP/Uz&#xA;Xn3p/wA04rTv+V4fmz/1M1596f8ANOK07/leH5s/9TNefen/ADTitO/5Xh+bP/UzXn3p/wA04rTv&#xA;+V4fmz/1M1596f8ANOK07/leH5s/9TNefen/ADTitO/5Xh+bP/UzXn3p/wA04rTv+V4fmz/1M159&#xA;6f8ANOK07/leH5s/9TNefen/ADTitO/5Xh+bP/UzXn3p/wA04rTv+V4fmz/1M1596f8ANOK07/le&#xA;H5s/9TNefen/ADTitO/5Xh+bP/UzXn3p/wA04rTv+V4fmz/1M1596f8ANOK07/leH5s/9TNefen/&#xA;ADTitO/5Xh+bP/UzXn3p/wA04rTv+V4fmz/1M1596f8ANOK0hHm/M38ydSt4na/8w3UdY4AeTxxV&#xA;oW32ijrtyY098VfRn/Qvkn/Kkf8AB/rR/wCIfX/S3r1Po/XuPD0+VK8PS/dcv9l7Yof/2Q==</xmpGImg:image>
+ </rdf:li>
+ </rdf:Alt>
+ </xmp:Thumbnails>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
+ xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"
+ xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#">
+ <xmpMM:OriginalDocumentID>uuid:9E3E5C9A8C81DB118734DB58FDDE4BA7</xmpMM:OriginalDocumentID>
+ <xmpMM:DocumentID>xmp.did:F77F11740720681183D1DC35A180BA8D</xmpMM:DocumentID>
+ <xmpMM:InstanceID>uuid:32b9882d-d735-f340-9045-3cc9a9725e9f</xmpMM:InstanceID>
+ <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>
+ <xmpMM:DerivedFrom rdf:parseType="Resource">
+ <stRef:instanceID>uuid:5043498c-ce3d-7641-8f33-296bf1a24f51</stRef:instanceID>
+ <stRef:documentID>xmp.did:0380117407206811822ACFB88DCA4B7E</stRef:documentID>
+ <stRef:originalDocumentID>uuid:9E3E5C9A8C81DB118734DB58FDDE4BA7</stRef:originalDocumentID>
+ <stRef:renditionClass>default</stRef:renditionClass>
+ </xmpMM:DerivedFrom>
+ <xmpMM:History>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:0280117407206811822ADEA6FFA93920</stEvt:instanceID>
+ <stEvt:when>2014-06-05T18:45:01-07:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS6 (Macintosh)</stEvt:softwareAgent>
+ <stEvt:changed>/</stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:F77F11740720681183D1DC35A180BA8D</stEvt:instanceID>
+ <stEvt:when>2021-02-04T18:07:40-08:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS6 (Macintosh)</stEvt:softwareAgent>
+ <stEvt:changed>/</stEvt:changed>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpMM:History>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/">
+ <illustrator:StartupProfile>Basic RGB</illustrator:StartupProfile>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
+ xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
+ xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/">
+ <xmpTPg:NPages>1</xmpTPg:NPages>
+ <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency>
+ <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
+ <xmpTPg:MaxPageSize rdf:parseType="Resource">
+ <stDim:w>8.000000</stDim:w>
+ <stDim:h>8.000000</stDim:h>
+ <stDim:unit>Inches</stDim:unit>
+ </xmpTPg:MaxPageSize>
+ <xmpTPg:PlateNames>
+ <rdf:Seq>
+ <rdf:li>Black</rdf:li>
+ <rdf:li>PANTONE 485 CVC</rdf:li>
+ <rdf:li>PANTONE 152 CVC</rdf:li>
+ </rdf:Seq>
+ </xmpTPg:PlateNames>
+ <xmpTPg:SwatchGroups>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:groupName>Default Swatch Group</xmpG:groupName>
+ <xmpG:groupType>0</xmpG:groupType>
+ <xmpG:Colorants>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>White</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>Black</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>75.020996</xmpG:cyan>
+ <xmpG:magenta>67.968300</xmpG:magenta>
+ <xmpG:yellow>67.022202</xmpG:yellow>
+ <xmpG:black>90.164001</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Red</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>99.398796</xmpG:magenta>
+ <xmpG:yellow>100.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Yellow</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>6.198197</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>96.514801</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Green</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>62.764900</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>100.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Cyan</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>51.793701</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>12.539900</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Blue</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>88.366501</xmpG:cyan>
+ <xmpG:magenta>76.916100</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Magenta</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>26.990200</xmpG:cyan>
+ <xmpG:magenta>81.640297</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=193 G=39 B=45</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>16.961897</xmpG:cyan>
+ <xmpG:magenta>97.897301</xmpG:magenta>
+ <xmpG:yellow>92.724503</xmpG:yellow>
+ <xmpG:black>6.744498</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=237 G=28 B=36</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.445598</xmpG:cyan>
+ <xmpG:magenta>99.142403</xmpG:magenta>
+ <xmpG:yellow>97.323601</xmpG:yellow>
+ <xmpG:black>0.094599</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=241 G=90 B=36</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>79.803200</xmpG:magenta>
+ <xmpG:yellow>96.874901</xmpG:yellow>
+ <xmpG:black>0.012201</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=247 G=147 B=30</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.036597</xmpG:cyan>
+ <xmpG:magenta>50.066399</xmpG:magenta>
+ <xmpG:yellow>98.565605</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=251 G=176 B=59</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.021398</xmpG:cyan>
+ <xmpG:magenta>34.848602</xmpG:magenta>
+ <xmpG:yellow>87.130501</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=252 G=238 B=33</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>4.513597</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>93.188400</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=217 G=224 B=33</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>18.896801</xmpG:cyan>
+ <xmpG:magenta>0.039703</xmpG:magenta>
+ <xmpG:yellow>98.232994</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=140 G=198 B=63</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>50.109100</xmpG:cyan>
+ <xmpG:magenta>0.137299</xmpG:magenta>
+ <xmpG:yellow>99.038704</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=57 G=181 B=74</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>74.615097</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>99.703995</xmpG:yellow>
+ <xmpG:black>0.009203</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=146 B=69</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>86.385902</xmpG:cyan>
+ <xmpG:magenta>17.578400</xmpG:magenta>
+ <xmpG:yellow>100.000000</xmpG:yellow>
+ <xmpG:black>3.823900</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=104 B=55</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>90.218994</xmpG:cyan>
+ <xmpG:magenta>33.475197</xmpG:magenta>
+ <xmpG:yellow>98.764000</xmpG:yellow>
+ <xmpG:black>26.065498</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=34 G=181 B=115</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>76.195900</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>74.978294</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=169 B=157</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>78.441994</xmpG:cyan>
+ <xmpG:magenta>9.085202</xmpG:magenta>
+ <xmpG:yellow>45.755695</xmpG:yellow>
+ <xmpG:black>0.027502</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=41 G=171 B=226</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>69.720001</xmpG:cyan>
+ <xmpG:magenta>14.846998</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=113 B=188</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>87.536400</xmpG:cyan>
+ <xmpG:magenta>52.645100</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=46 G=49 B=146</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>99.130203</xmpG:cyan>
+ <xmpG:magenta>96.548401</xmpG:magenta>
+ <xmpG:yellow>3.494298</xmpG:yellow>
+ <xmpG:black>0.500500</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=27 G=20 B=100</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>100.000000</xmpG:cyan>
+ <xmpG:magenta>100.000000</xmpG:magenta>
+ <xmpG:yellow>26.251602</xmpG:yellow>
+ <xmpG:black>24.524302</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=102 G=45 B=145</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>74.520500</xmpG:cyan>
+ <xmpG:magenta>98.516800</xmpG:magenta>
+ <xmpG:yellow>0.940001</xmpG:yellow>
+ <xmpG:black>0.228900</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=147 G=39 B=143</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>49.558197</xmpG:cyan>
+ <xmpG:magenta>99.191299</xmpG:magenta>
+ <xmpG:yellow>1.370299</xmpG:yellow>
+ <xmpG:black>0.109899</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=158 G=0 B=93</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>34.891300</xmpG:cyan>
+ <xmpG:magenta>100.000000</xmpG:magenta>
+ <xmpG:yellow>37.204506</xmpG:yellow>
+ <xmpG:black>10.815602</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=212 G=20 B=90</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>11.844099</xmpG:cyan>
+ <xmpG:magenta>100.000000</xmpG:magenta>
+ <xmpG:yellow>49.249996</xmpG:yellow>
+ <xmpG:black>0.872803</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=237 G=30 B=121</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>97.000099</xmpG:magenta>
+ <xmpG:yellow>20.495903</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=199 G=178 B=153</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>22.854996</xmpG:cyan>
+ <xmpG:magenta>27.426601</xmpG:magenta>
+ <xmpG:yellow>39.942001</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=153 G=134 B=117</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>39.844398</xmpG:cyan>
+ <xmpG:magenta>42.853401</xmpG:magenta>
+ <xmpG:yellow>52.529198</xmpG:yellow>
+ <xmpG:black>6.808603</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=115 G=99 B=87</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>50.398998</xmpG:cyan>
+ <xmpG:magenta>53.136497</xmpG:magenta>
+ <xmpG:yellow>60.897202</xmpG:yellow>
+ <xmpG:black>23.593498</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=83 G=71 B=65</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>57.598198</xmpG:cyan>
+ <xmpG:magenta>60.415001</xmpG:magenta>
+ <xmpG:yellow>63.738503</xmpG:yellow>
+ <xmpG:black>41.934799</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=198 G=156 B=109</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>22.671902</xmpG:cyan>
+ <xmpG:magenta>38.394703</xmpG:magenta>
+ <xmpG:yellow>63.668297</xmpG:yellow>
+ <xmpG:black>1.181000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=166 G=124 B=82</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>31.595303</xmpG:cyan>
+ <xmpG:magenta>49.182903</xmpG:magenta>
+ <xmpG:yellow>73.931496</xmpG:yellow>
+ <xmpG:black>9.890902</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=140 G=98 B=57</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>36.234100</xmpG:cyan>
+ <xmpG:magenta>57.402897</xmpG:magenta>
+ <xmpG:yellow>84.057404</xmpG:yellow>
+ <xmpG:black>22.613901</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=117 G=76 B=36</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>39.169895</xmpG:cyan>
+ <xmpG:magenta>64.104698</xmpG:magenta>
+ <xmpG:yellow>93.441704</xmpG:yellow>
+ <xmpG:black>35.580997</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=96 G=56 B=19</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>41.538094</xmpG:cyan>
+ <xmpG:magenta>69.994698</xmpG:magenta>
+ <xmpG:yellow>97.024498</xmpG:yellow>
+ <xmpG:black>49.155403</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=66 G=33 B=11</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>47.794300</xmpG:cyan>
+ <xmpG:magenta>73.476799</xmpG:magenta>
+ <xmpG:yellow>83.712502</xmpG:yellow>
+ <xmpG:black>68.157501</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>PANTONE 485 CVC</xmpG:swatchName>
+ <xmpG:type>SPOT</xmpG:type>
+ <xmpG:tint>100.000000</xmpG:tint>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>100.000000</xmpG:magenta>
+ <xmpG:yellow>91.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>PANTONE 152 CVC</xmpG:swatchName>
+ <xmpG:type>SPOT</xmpG:type>
+ <xmpG:tint>100.000000</xmpG:tint>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:cyan>0.000000</xmpG:cyan>
+ <xmpG:magenta>51.000000</xmpG:magenta>
+ <xmpG:yellow>100.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpG:Colorants>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:groupName>Cold</xmpG:groupName>
+ <xmpG:groupType>1</xmpG:groupType>
+ <xmpG:Colorants>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=56 M=0 Y=20 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>55.742699</xmpG:cyan>
+ <xmpG:magenta>0.000000</xmpG:magenta>
+ <xmpG:yellow>19.989300</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=51 M=43 Y=0 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>51.079601</xmpG:cyan>
+ <xmpG:magenta>43.097603</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>C=26 M=41 Y=0 K=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>26.440800</xmpG:cyan>
+ <xmpG:magenta>41.147499</xmpG:magenta>
+ <xmpG:yellow>0.000000</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpG:Colorants>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:groupName>Grays</xmpG:groupName>
+ <xmpG:groupType>1</xmpG:groupType>
+ <xmpG:Colorants>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=0 B=0</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>75.020996</xmpG:cyan>
+ <xmpG:magenta>67.968300</xmpG:magenta>
+ <xmpG:yellow>67.022202</xmpG:yellow>
+ <xmpG:black>90.164001</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=26 G=26 B=26</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>72.576500</xmpG:cyan>
+ <xmpG:magenta>66.600998</xmpG:magenta>
+ <xmpG:yellow>65.191101</xmpG:yellow>
+ <xmpG:black>78.161301</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=51 G=51 B=51</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>69.482002</xmpG:cyan>
+ <xmpG:magenta>63.180000</xmpG:magenta>
+ <xmpG:yellow>62.151497</xmpG:yellow>
+ <xmpG:black>58.361202</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=77 G=77 B=77</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>65.377304</xmpG:cyan>
+ <xmpG:magenta>57.988899</xmpG:magenta>
+ <xmpG:yellow>56.878002</xmpG:yellow>
+ <xmpG:black>36.661304</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=102 G=102 B=102</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>59.728401</xmpG:cyan>
+ <xmpG:magenta>51.235199</xmpG:magenta>
+ <xmpG:yellow>50.771301</xmpG:yellow>
+ <xmpG:black>20.132797</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=128 G=128 B=128</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>51.647198</xmpG:cyan>
+ <xmpG:magenta>43.149502</xmpG:magenta>
+ <xmpG:yellow>43.149502</xmpG:yellow>
+ <xmpG:black>7.547098</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=153 G=153 B=153</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>42.636799</xmpG:cyan>
+ <xmpG:magenta>34.787498</xmpG:magenta>
+ <xmpG:yellow>35.315502</xmpG:yellow>
+ <xmpG:black>0.985700</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=179 G=179 B=179</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>30.679798</xmpG:cyan>
+ <xmpG:magenta>24.246597</xmpG:magenta>
+ <xmpG:yellow>24.765402</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=204 G=204 B=204</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>19.366800</xmpG:cyan>
+ <xmpG:magenta>15.005702</xmpG:magenta>
+ <xmpG:yellow>15.533697</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=230 G=230 B=230</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>8.459598</xmpG:cyan>
+ <xmpG:magenta>6.131101</xmpG:magenta>
+ <xmpG:yellow>6.576598</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=242 G=242 B=242</xmpG:swatchName>
+ <xmpG:mode>CMYK</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:cyan>3.704900</xmpG:cyan>
+ <xmpG:magenta>2.508599</xmpG:magenta>
+ <xmpG:yellow>2.508599</xmpG:yellow>
+ <xmpG:black>0.000000</xmpG:black>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpG:Colorants>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpTPg:SwatchGroups>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
+ <pdf:Producer>Adobe PDF library 10.01</pdf:Producer>
+ </rdf:Description>
+ </rdf:RDF>
+</x:xmpmeta>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<?xpacket end="w"?> endstream endobj 3 0 obj <</Count 1/Kids[7 0 R]/Type/Pages>> endobj 7 0 obj <</ArtBox[63.4517 35.4053 512.534 541.376]/BleedBox[0.0 0.0 576.0 576.0]/Contents 74 0 R/LastModified(D:20210204195255-08'00')/MediaBox[0.0 0.0 576.0 576.0]/Parent 3 0 R/PieceInfo<</Illustrator 75 0 R>>/Resources<</ColorSpace<</CS0 76 0 R/CS1 77 0 R>>/ExtGState<</GS0 78 0 R>>/Properties<</MC0 72 0 R>>>>/Thumb 79 0 R/TrimBox[0.0 0.0 576.0 576.0]/Type/Page>> endobj 74 0 obj <</Filter/FlateDecode/Length 1386>>stream
+HIn\7}
+^)ik%"0@
+_A RoA`Y/\KJ.`\HbM򱞀ڵyf)cʎ9v 6qGvSg?4ѳe>g֡,2|܆ެAh;5G<מ,EK E/b_nl6l#5px?y# N,ǔWy>l=,<K۟/k\M?ĀCf6S^i~,ja}H,KV"wzto b3{_SR90^ կ~RP: {z<2m6%ЗS
+j$c u
+yu%nύ.q0 5A&0r%Va*<+e T<UWV .)\H>_5
+UtK/18q?& J5b~и( } QԺDnd$}S|QhUشR#!Sb^+E}!WAy?P.{qJ@JU#/AI uRyc#I~'[Ec
+8;Z]"4-mc,$q4<X4"XRb<*9E2)J9:kBD?s-$&b0+E&]1!_9Ymn7%F.>0+7-7`dl_t
+&"$(CG"m(k@EV&h\B,oL,KM!FM&G4jiCMdPrDjH+Qp"pccm$+FW-O%]e8q'DdeR"k
+#pF0sghHa)eA%;n!(]HbVn[OXoNlFrfg%%lIc?X)RjufQ*,+bBO_[]&RARQJU-FSX
+167F_,[FH<LuLE'bUO6YWQ4TTkjb\Z9(OOhZ1"l0g\7g1cIFoG(onRWj:nT+*n(t3
+OdYEjru?C,Zbsi,bk.DF4$5aHRHdE&p]ssXTc6-S\q2=j,fQgc.c8RT"E"4G6SE,*
+UI,YY`L6M]VP81kY=s&A-T^9h<H0<=KV`&3a::f><'=l8,q,eLnes;IQ(QHhYf^^q
+r(P"(G/@Xb@RX)OV`<'D_WFmJ^4r7P0BZ/\^4m`H:%(o-0b$@4Q-LOh%Oq(HI>9d]
+gAu$X4[1MVSO43F[/;1&^`ob>Nt%!FLKRb1HFj'1Y,mY[0NbmcO=9dae&?*ALoWP>
+./"`@:*&(]INXcsYS6j.FEqc<rtsp0719$HgS-n?r5:]XF%=DLbNblTjf]%\K0(UZ
+X(6L1SMA%>n\Zk\b,8_R(S-ucj2_n3eOf\#17i]W!K-KKUM"=Z"IY\WK4%K.lZtNd
+'RJ^6)42)re]"$Lo.4p?H?;U6B=W!ZaT&MWNCmGbR<@gsjRPM8Khc$4~> endstream endobj 80 0 obj [/Indexed/DeviceRGB 255 81 0 R] endobj 81 0 obj <</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream
+8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0
+b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup`
+E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn
+6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1
+VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH<
+PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O(
+l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 72 0 obj <</Intent 82 0 R/Name(Layer 1)/Type/OCG/Usage 83 0 R>> endobj 82 0 obj [/View/Design] endobj 83 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 16.0)/Subtype/Artwork>>>> endobj 78 0 obj <</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>> endobj 76 0 obj [/Separation/PANTONE#20152#20CVC/DeviceCMYK<</C0[0.0 0.0 0.0 0.0]/C1[0.0 0.51 1.0 0.0]/Domain[0 1]/FunctionType 2/N 1.0/Range[0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]>>] endobj 77 0 obj [/Separation/PANTONE#20485#20CVC/DeviceCMYK<</C0[0.0 0.0 0.0 0.0]/C1[0.0 1.0 0.91 0.0]/Domain[0 1]/FunctionType 2/N 1.0/Range[0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]>>] endobj 75 0 obj <</LastModified(D:20210204195255-08'00')/Private 84 0 R>> endobj 84 0 obj <</AIMetaData 85 0 R/AIPDFPrivateData1 86 0 R/AIPDFPrivateData2 87 0 R/AIPDFPrivateData3 88 0 R/AIPDFPrivateData4 89 0 R/AIPDFPrivateData5 90 0 R/AIPDFPrivateData6 91 0 R/AIPDFPrivateData7 92 0 R/AIPDFPrivateData8 93 0 R/ContainerVersion 11/CreatorVersion 16/NumBlock 8/RoundtripVersion 16>> endobj 85 0 obj <</Length 1127>>stream
+%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Jamie Zawinski) () %%Title: (logo.pdf) %%CreationDate: 2/4/21 7:52 PM %%Canvassize: 16383 %%BoundingBox: 81 -649 531 -142 %%HiResBoundingBox: 81.4517 -648.5947 530.5342 -142.624 %%DocumentProcessColors: Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%DocumentCustomColors: (PANTONE 152 CVC) %%+ (PANTONE 485 CVC) %%CMYKCustomColor: 0 0.51 1 0 (PANTONE 152 CVC) %%+ 0 1 0.91 0 (PANTONE 485 CVC) %%CMYKProcessColor: 1 1 1 1 ([Registration]) %AI3_Cropmarks: 18 -684 594 -108 %AI3_TemplateBox: 306.5 -396.5 306.5 -396.5 %AI3_TileBox: 34.3765 -881.1035 613.1768 -126.3032 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 0 %AI9_ColorModel: 2 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: 15.1631 -118.1631 1.96 1225 1158 18 1 1 310 161 1 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:-0.223633 -791.7031 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 86 0 obj <</Length 19373>>stream
+%%BoundingBox: 81 -649 531 -142 %%HiResBoundingBox: 81.4517 -648.5947 530.5342 -142.624 %AI7_Thumbnail: 116 128 8 %%BeginData: 19220 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD27FF5252FD72FF27F87DFD6FFFA8FF7D2720FD70FF277D202752 %FD6FFFA8272720277DFD6EFFA8522727F827A8FD6EFF7D764B27F852FD6E %FFA84B932727F87DFD6EFF7D939A272727A8FD6DFF7D759376272721A8FD %6CFFA84BB59376272752FD6DFF526F939352F82752FD6CFF7D9A93B59352 %27277DFD6BFFA84B9393936F51F827A8FD6AFFA87693B593B551522752FD %6BFF52FD05932751F87DFD0DFFA8FFA827A8FD58FF7D6FBB93B5939A5227 %20A8FD0BFF7D52FF27277DFD58FF7D75FD059376512727FD0AFFA8F8A852 %2752FD59FFA875B593B593B56F7C522752FD09FF277D7D2727A8FD59FFA8 %76FD06934BA0F827A8FD07FF52517D27F852FD5BFF76B593BC93B593767C %7C207DFD06FF7D76765220277DFD5AFFA876FD06936F7C9F2727FD05FFA8 %526F52F827F8FD5BFFA951B593B593B5939951C22727A8FD04FF7D6F76F8 %272752FD5BFFA876FD06936F76752727FD04FFA84B934B27F82752FD5BFF %A851BB93B593BC93767B5227A8FD04FF529A93522776277DFD5BFF7D75FD %05939A51A0F852FD04FF7D519393277651277DFD5BFF7D6FB593B593B54B %A05127A8FD04FF7D6FB593529F76F8FD36FF7EA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA851FD0593 %6F76752727A87DA8A87D4B9393934BC127277DA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA8FD05FFA87D272720272727202727272027272720272727202727 %2720272727202727272027272720272727207693B593BC93529F52272720 %272727209A93B593769F5220272727202727272027272720272727202727 %27202727272027272720272727202727272027272720272727202727527D %FFFFA827F827F827F827F827F827F827F827F827F827F827F827F827F827 %F827F827F827F827F827F827F8276FFD049376759FF827F827F827F852FD %04934BA04B27F827F827F827F827F827F827F827F827F827F827F827F827 %F827F827F827F827F827F827F827F827F827F827F827F82752FF7D2727F8 %FD25274BB593B593934BC252FD072775B593B593769F52FD2E27F8272727 %A8F827F852A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFFFFF5299FD04936F76992727A8A8FFFFA84BFD0593 %4BA051277DFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFFFA82727F87D272727A8FD23 %FF527693B593BC93529F7C277DFD04FF7D7693B593BC93767B7C27A8FD2D %FF7D272752F827F8A8FD22FF7D75FD05937675C12027A8FD04FF766FFD05 %936F7C75277DFD2DFF5227F87D27F827A8FD21FF7D7693B593B593B54BC2 %762752FD05FF52B593B593B5939A76A0F87DFD2DFF7DF82753F827F8A8FD %20FF7D51FD06936F529952F8A8FD04FF7D75FD079376752727FD2DFF5227 %F87D272027A8FD1FFFA85293BB93B593BC93767BC22752FD05FF7D6FB593 %BC93B593BC51A02727AFFD2CFF7D202753F827F8A8FD1FFF526FFD079351 %C1752752FD05FF51FD0893767552F8A8FD2CFF5227F87D2727277EFD17FF %A8FD06FF7D4BB593B593B593B56F7C9F52F8A8FD04FFA87693B593B593B5 %93B56F7C76277DFD2CFF7D272752F827F8A8FD0CFFA8FFFFFFA8FFFFFFA8 %FFA8277DA8F87DFFA84BFD08937575C12627A8FD04FF7D6FFD09934B7CF8 %52FD04FFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FF %FFFFA8FD0BFF5227F87D272727A8FD07FFA87D5252275252522752285227 %5227526F5227272752279A93BC93B593BC93B551C29F2727522852275227 %9A93BC93B593BC93B593767C522052525227525252275252522752525227 %522852275228522752285227522852275252527DFD08FF7D272752F827F8 %A8FD06FF7D27F827F827F827F827F827F827F8276F75F827F827F852FD09 %93529FA0F827F827F827F827FD0A936F765127F827F827F827F827F827F8 %27F827F827F827F827F827F827F827F827F827F827F827F82752FD07FF52 %27F87D27F827A8FD05FFA8272727F8272727F8272727F8FD0427B55127F8 %2727276FB593B593B593B5939A51C175272727F82727274BB593B593B593 %B593B593B551A02727F8272727F8272727F8272727F8272727F8272727F8 %272727F8272727F8272727F827272752FD06FF7DF82753F827F8A8FD05FF %7DF827F827F827F827F827F827F827F876934BF827F8274BFD09936F769F %76F827F827F827F852FD0B93755152F827F827F827F827F827F827F827F8 %27F827F827F827F827F827F827F827F827F827F827F827A8FD05FF5227F8 %7D272027A8FD05FF52272727202727272027272720272727939A27272027 %277693BC93B593BC93B593BC52C2752727272027272751BB93B593BC93B5 %93BC93B59376762720272727202727272027272720272727202727272027 %272720272727202727272027272720A8FD05FF7D202753F827F8A8FD05FF %52F827F827F827F827F827F827F8274B934B27F827F827FD0B93769F7CF8 %27F827F827F876FD0C934B7C2727F827F827F827F827F827F827F827F827 %F827F827F827F827F827F827F827F827F827F8277DFD05FF5227F87D2727 %277EFD05FF5227F8272727F8272727F8272727F89A9352F8FD0427B593B5 %93B593B593B593B56FA09F27F8272727F82751B593B593B593B593B593B5 %939A517C2727F8272727F8272727F8272727F8272727F8272727F8272727 %F8272727F8272727F82727A8FD05FF7D272752F827F8A8FD05FF52F827F8 %27F827F827F827F827F85193932727F827F852FD0C934B9F2727F827F827 %F876FD0D93767527F827F827F827F827F827F827F827F827F827F827F827 %F827F827F827F827F827F827F8277DFD05FF5227F87D272727A8FD05FF52 %2720272727202727272027272775BB99272027272775BB93B593BC93B593 %BC93B593767C7C20272727202751B593BC93B593BC93B593BC93B56F7C76 %272027272720272727202727272027272720272727202727272027272720 %272727202727A8FD05FF7D272752F827F8A8FD05FF52F827F827F827F827 %F827F82727939376F827F827F876FD0C936F527527F827F827F852FD0E93 %4B7C2727F827F827F827F827F827F827F827F827F827F827F827F827F827 %F827F827F827F8277DFD05FF5227F87D27F827A8FD05FF52272727F82727 %27F8272727F87693B54B515127F82775B593B593B593B593B593B593B56F %7C5227F8FD04279A93B593B593B593B593B593B59399517C2727F8272727 %F8272727F8272727F8272727F8272727F8272727F8272727F8272727F8A8 %FD05FF7DF82753F827F8A8FD05FF52F827F827F827F827F827F8276F9393 %515152F827F876FD0E934B762727F827F8276FFD0E93757576F827F827F8 %27F827F827F827F827F827F827F827F827F827F827F827F827F827F8277D %FD05FF5227F87D272027A8FD05FF522727272027272720FD0427BC93B551 %A05227525275B593BC93B593BC93B593BC93B593BC51762727527D277693 %B593BC93B593BC93B593BC93B593767C5220FD04527D5252527D5252527D %FD0452272720272727202727272027272720A8FD05FF7D202753F827F8A8 %FD05FF52F827F827F827F827F827F876939393769F76F8A8A876FD109351 %52F852FFFF51FD0F936F527527F8A8FD10FF2727F827F827F827F827F827 %F8277DFD05FF5227F87D2727277EFD05FF5227F8272727F8272727F82775 %B593B575A05127A8FF51B593B593B593B593B593B593B59393939A5152F8 %52FF7D6FB593B593B593B593B593B593B593B56F7C7627F8A8FD10FF2727 %F8272727F8272727F82727A8FD05FF7D272752F827F8A8FD05FF52F827F8 %27F827F827F82727FD0493769F76F87DFF766FFD1093994B27F852A852FD %10934B7C7527F8A8FD0FFF27F827F827F827F827F827F8277DFD05FF5227 %F87D272727A8FD05FF52272027272720272727207693B593BB75A07B2752 %FF7D7693B593BC93B593BC93B593BC93B593BC939A5152277D7D7693B593 %BC93B593BC93B593BC93B593BB517C752727FD0FFF272720272727202727 %27202727A8FD05FF7D272752F827F8A8FD05FF52F827F827F827F827F827 %6FFD049376759FF852FFFF4BFD1293752727F85252FD11934B9F512752FD %0EFF52F827F827F827F827F827F8277DFD05FF5227F87D27F827A8FD05FF %52272727F8272727F827279A93B593B56F7C9F51F8FFFF7D6FB593B593B5 %93B593B593B593B593B593B593765151275275B593B593B593B593B593B5 %93B59393939A51A02027A8FD0DFFFD0427F8272727F8272727F8A8FD05FF %7DF82753F827F8A8FD05FF52F827F827F827F827F84BFD06934BC151277D %FF7D51FD1393764B27F8276FFD1093767576F87DFD0DFF27F827F827F827 %F827F827F8277DFD05FF5227F87D272027A8FD05FF522727272027272720 %2751B593BC93B593769FA02059FFFF529A93B593BC93B593BC93B593BC93 %B593BC93B593765227207693B593BC93B593BC93B593BC93B593BC93767B %2727FD0DFFFD0427202727272027272720A8FD05FF7D202753F827F8A8FD %05FF52F827F827F827F827F876FD06936F7C9F27F8FFFFA84BFD13936F76 %5127F89AFD10936F7C51277DFD0CFF27F827F827F827F827F827F8277DFD %05FF5227F87D2727277EFD05FF5227F8272727F82727276FB593B593B593 %9351C276277DFFFF5293B593B593B593B593B593B593B593B593B593B56F %7C51274BB593B593B593B593B593B593B593B593B5517CF87DFD0CFF2727 %F8272727F8272727F82727A8FD05FF7D272752F827F8A8FD05FF52F827F8 %27F827F82727FD08937675A0F827A8FF7D75FD14934B7CF8276FFD109376 %5127F8FD0CFF27F827F827F827F827F827F8277DFD05FF5227F87D272727 %A8FD05FF5227202727272027275293BC93B593BC93B56F769F5220A8FFFF %529A93B593BC93B593BC93B593BC93B593BC93B5939A767C205293B593BC %93B593BC93B593BC93B593BC9376512784FD0BFF27272027272720272727 %202727A8FD05FF7D272752F827F8A8FD05FF52F827F827F827F82727FD09 %934BA0752727FFFF7D4BFD1493767527F89AFD10937552F87DFD0BFF52F8 %27F827F827F827F827F8277DFD05FF5227F87D27F827A8FD05FF52272727 %F8272727F87693B593B593B593B5939A51C251277DFFFF5293B593B593B5 %93B593B593B593B593B593B593B56F7C52274BB593B593B593B593B593B5 %93B593B5939A512727FD0BFFFD0427F8272727F8272727F8A8FD05FF7DF8 %2753F827F8A8FD05FF52F827F827F827F8274BFD0A937675A0F827A8FF7D %75FD14934BA0F8276FFD1093522727A8FD0AFF27F827F827F827F827F827 %F8277DFD05FF5227F87D272027A8FD05FF5227272720272727207693B593 %BC93B593BC93B593529F76207DFFFF529A93B593BC93B593BC93B593BC93 %B593BC93B593767C52207693B593BC93B593BC93B593BC93B593BB752720 %A8FD0AFFFD0427202727272027272720A8FD05FF7D202753F827F8A8FD05 %FF52F827F827F827F8274BFD0B936F769F27F8A8FF7D4BFD13936F767527 %27FD10939A272752FD0AFF27F827F827F827F827F827F8277DFD05FF5227 %F87D2727277EFD05FF5227F8272727F827277693B593B593B593B593B593 %B54BA0762752FFFF5293B593B593B593B593B593B593B593B593B593B56F %52272793B593B593B593B593B593B593B593B593522752FD0AFF2727F827 %2727F8272727F82727A8FD05FF7D272752F827F8A8FD05FF52F827F827F8 %27F8274BFD0D934BA04B277DFF7D75FD14936F766FFD11934B27F8A8FD09 %FF27F827F827F827F827F827F8277DFD05FF5227F87D272727A8FD05FF52 %27202727272027277693BC93B593BC93B593BC93B5939A52A02027A8FF52 %9A93B593BC93B593BC93B593BC93B593BC93B593BC93B593BC93B593BC93 %B593BC93B593BC93B5939A27277DFD09FF27272027272720272727202727 %A8FD05FF7D272752F827F8A8FD05FF52F827F827F827F82727FD0E937675 %76F852FF7D4BFD27936F27F87DFD09FF52F827F827F827F827F827F8277D %FD05FF5227F87D27F827A8FD05FF52272727F8272727F82793B593B593B5 %93B593B593B593B593767652F8A8FF5293B593B593B593B593B593B593B5 %93B593B593B593B593B593B593B593B593B593B593B593B593B54B2752FD %09FFFD0427F8272727F8272727F8A8FD05FF7DF82753F827F8A8FD05FF52 %F827F827F827F827F876FD0F93525127F8FF7D6FFD279352F852FD09FF27 %F827F827F827F827F827F8277DFD05FF5227F87D272027A8FD05FF522727 %272027272720274BB593BC93B593BC93B593BC93B593BB937651277DA84B %BB93B593BC93B593BC93B593BC93B593BC93B593BC93B593BC93B593BC93 %B593BC93B593BC93B5752727FD09FFFD0427202727272027272720A8FD05 %FF7D202753F827F8A8FD05FF52F827F827F827F827F8276FFD0F936F5227 %277D76FD279375F8277DFD08FF27F827F827F827F827F827F8277DFD05FF %5227F87D2727277EFD05FF5227F8272727F8272727F85293B593B593B593 %B593B593B593B593B57552F87D769993B593B593B593B593B593B593B593 %B593B593B593B593B593B593B593B593B593B593B593B59327F884FD08FF %2727F8272727F8272727F82727A8FD05FF7D272752F827F8A8FD05FF52F8 %27F827F827F827F827F899FD10934B27F87D6FFD2793272752FD08FF27F8 %27F827F827F827F827F8277DFD05FF5227F87D272727A8FD05FF52272027 %272720272727202751B593BC93B593BC93B593BC93B593BC93762727279A %93BC93B593BC93B593BC93B593BC93B593BC93B593BC93B593BC93B593BC %93B593BC93B593BC93522052FD08FF27272027272720272727202727A8FD %05FF7D272752F827F8A8FD05FF52F827F827F827F827F827F8276FFD1093 %4BF8276FFD27934B2727FD08FF52F827F827F827F827F827F8277DFD05FF %5227F87D27F827A8FD05FF52272727F8272727F8272727F87693B593B593 %B593B593B593B593B593B57527F89A93B593B593B593B593B593B593B593 %B593B593B593B593B593B593B593B593B593B593B593B593762727A8FD07 %FFFD0427F8272727F8272727F8A8FD05FF7DF82753F827F8A8FD05FF52F8 %27F827F827F827F827F827F899FD10936F516FFD27934B4BF8A8FD07FF27 %F827F827F827F827F827F8277DFD05FF5227F87D272027A8FD05FF522727 %272027272720272727207D52B593BC93B593BC93B593BC93B593BC93B593 %BC93B593BC93B593BC93B593BC93B593BC93B593BC93B593BC93B593BC93 %B593BC93B593BC93B593764B277DFD07FFFD0427202727272027272720A8 %FD05FF7D202753F827F8A8FD05FF52F827F827F827F827F827F8277D7D6F %FD39934B76F87DFD07FF27F827F827F827F827F827F8277DFD05FF5227F8 %7D2727277EFD05FF5227F8272727F8272727F827277DFF5293B593B593B5 %93B593B593B593B593B593B593B593B593B593B593B593B593B593B593B5 %93B593B593B593B593B593B593B593B593B593B59376752752FD07FF2727 %F8272727F8272727F82727A8FD05FF7D272752F827F8A8FD05FF52F827F8 %27F827F827F827F8277DFF7D52FD389351A0F852FD07FF27F827F827F827 %F827F827F8277DFD05FF5227F87D272727A8FD05FF522720272727202727 %272027277DFFFF529A93BC93B593BC93B593BC93B593BC93B593BC93B593 %BC93B593BC93B593BC93B593BC93B593BC93B593BC93B593BC93B593BC93 %B593BC93769F5227FD07FF27272027272720272727202727A8FD05FF7D27 %2752F827F8A8FD05FF52F827F827F827F827F827F8277DFFFFFF4BFD3693 %7675C12727A8FD06FF52F827F827F827F827F827F8277DFD05FF5227F87D %27F827A8FD05FF52272727F8272727F8272727F87DFFFFFFA84BB593B593 %B593B593B593B593B593B593B593B593B593B593B593B593B593B593B593 %B593B593B593B593B593B593B593B593B593B551A0522727FD07FFFD0427 %F8272727F8272727F8A8FD05FF7DF82753F827F8A8FD05FF52F827F827F8 %27F827F827F82753FD04FF7D4BFD33936F76512727FD08FF27F827F827F8 %27F827F827F8277DFD05FF5227F87D272027A8FD05FF5227272720272727 %20272727207DFD05FF526FBB93B593BC93B593BC93B593BC93B593BC93B5 %93BC93B593BC93B593BC93B593BC93B593BC93B593BC93B593BC93B593BC %9376512727FD09FFFD0427202727272027272720A8FD05FF7D202753F827 %F8A8FD05FF52F827F827F827F827F827F8277DFD05FFA852FD3193992727 %F8A8FD09FF27F827F827F827F827F827F8277DFD05FF5227F87D2727277E %FD05FF5227F8272727F8272727F827277DFD06FFA85293B593B593B593B5 %93B593B593B593B593B593B593B593B593B593B593B593B593B593B593B5 %93B593B593B593B593B54B27277DFD0AFF2727F8272727F8272727F82727 %A8FD05FF7D272752F827F8A8FD05FF52F827F827F827F827F827F82752FD %07FF7D51FD2E936F27F853FD0AFFA827F827F827F827F827F827F8277DFD %05FF5227F87D272727A8FD05FF52272027272720272727202727277DFD07 %FF7D7693B593BC93B593BC93B593BC93B593BC93B593BC93B593BC93B593 %BC93B593BC93B593BC93B593BC93B593BB934B207DFD0AFFAF5227272027 %272720272727202727A8FD05FF7D272752F827F8A8FD05FF52F827F827F8 %27F827F827F827F827277D527D527D527DF876FD2B9352F827527D527D52 %7D527D527D5227F827F827F827F827F827F827F8277DFD05FF5227F87D27 %F827A8FD05FF52272727F8272727F8272727F8272727F8272727F8272727 %F87693B593B593B593B593B593B593B593B593B593B593B593B593B593B5 %93B593B593B593B593B593B59376F8272727F8272727F8272727F8272727 %F8272727F8272727F8272727F8A8FD05FF7DF82753F827F8A8FD05FF52F8 %27F827F827F827F827F827F827F827F827F827F827F827F876FD279376F8 %27F827F827F827F827F827F827F827F827F827F827F827F827F827F8277D %FD05FF5227F87D272027A8FD05FF52272727202727272027272720272727 %20272727202727272027277693BC93B593BC93B593BC93B593BC93B593BC %93B593BC93B593BC93B593BC93B593BC93B5937627272027272720272727 %202727272027272720272727202727272027272720A8FD05FF7D202753F8 %27F8A8FD05FF52F827F827F827F827F827F827F827F827F827F827F827F8 %27F827F876FD239376F827F827F827F827F827F827F827F827F827F827F8 %27F827F827F827F827F8277DFD05FF5227F87D2727277EFD05FF5227F827 %2727F8272727F8272727F8272727F8272727F8272727F827277693B593B5 %93B593B593B593B593B593B593B593B593B593B593B593B593B593B59352 %2727F8272727F8272727F8272727F8272727F8272727F8272727F8272727 %F82727A8FD05FF7D272752F827F8A8FD05FF52F827F827F827F827F827F8 %27F827F827F827F827F827F827F827F827F84B6FFD1D936F27F827F827F8 %27F827F827F827F827F827F827F827F827F827F827F827F827F827F8277D %FD05FF5227F87D272727A8FD05FF52272027272720272727202727272027 %2727202727272027272720272727202775B593BC93B593BC93B593BC93B5 %93BC93B593BC93B593BC93B5939A51272027272720272727202727272027 %272720272727202727272027272720272727202727A8FD05FF7D272752F8 %27F8A8FD05FF7DF827F827F827F827F827F827F827F827F827F827F827F8 %27F827F827F827F8272776FD1793762727F827F827F827F827F827F827F8 %27F827F827F827F827F827F827F827F827F827F827F827A8FD05FF5227F8 %7D27F827A8FD05FFA8272727F8272727F8272727F8272727F8272727F827 %2727F8272727F8272727F827274B4B9A93B593B593B593B593B593B593B5 %93B5939A51522727F8272727F8272727F8272727F8272727F8272727F827 %2727F8272727F8272727F827272752FD06FF7DF82753F827F8A8FD06FF52 %27F827F827F827F827F827F827F827F827F827F827F827F827F827F827F8 %27F827F827F84B4B756F99FD0793996F754B764B27F827F827F827F827F8 %27F827F827F827F827F827F827F827F827F827F827F827F827F827F82727 %A8FD06FF5227F87D272027A8FD07FF7D52FD2027202727272027274B2752 %27524B7676A0757C51272027272720FD212752FD08FF7D202753F827F8A8 %FD0AFFA8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8 %A8A8FF2727F827F827F827F827F827F82720527552F827F827F827F827F8 %7DA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8 %A8A8FD09FF5227F87D2727277EFD27FFA8272727F8272727F8272727F827 %2727F8272727F8272727F8FD0427FD28FF7D272752F827F8A8FD27FF27F8 %27F827F827F827F827F827F827F827F827F827F827F827F827F82752FD27 %FF5227F87D272727A8FD26FF7D2027272720272727202727272027272720 %27272720272727202727272027A8FD26FF7D272752F827F8A8FD25FF7DF8 %27F827F827F827F827F827F827F827F827F827F827F827F827F827F827F8 %27A8FD25FF5227F87D27F827A8FD24FF7DF8272727F8272727F8272727F8 %272727F8272727F8272727F8272727F8272727F827A8FD24FF7DF82753F8 %27F8A8FD22FF7E52F827F827F827F827F827F827F827F827F827F827F827 %F827F827F827F827F827F827F82752FD23FF5227F87D272027A8FD20FFA8 %522727272027272720272727202727272027272720272727202727272027 %27272027272720FD0427A8FD21FF7D202753F827F8A8FD1DFFA87D52F827 %F827F827F827F827F827F827F827F827F827F827F827F827F827F827F827 %F827F827F827F827F827F82752A8A8FD1DFF5227F87D2727277EFD1CFFA8 %2727F8272727F8272727F8272727F8272727F8272727F8272727F8272727 %F8272727F8272727F8272727F8272727F8272752A8FD1CFF7D272752F827 %F8A8FD1CFF5227F827F827F827F827F827F827F827F827F827F827F827F8 %27F827F827F827F827F827F827F827F827F827F827F827F827F8A8FD1CFF %5227F87D272727A8FD1DFF7DA87DA87DA87DA87DA87DA87DA87DA87DA87D %A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %A8FD1DFF7D272752F827F8A8FD6CFF5227F87D27F827A8FD6CFF7DF82753 %F827F8A8FD6CFF5227F87D52202752FD6BA87D2720277D7D27F827F827F8 %27F827F827F827F827F827F827F827F827F827F827F827F827F827F827F8 %27F827F827F827F827F827F827F827F827F827F827F827F827F827F827F8 %27F827F827F827F827F827F827F827F827F827F827F827F827F827F827F8 %27F827F827F827F827F827F827F827F827F8FFFF5227F8272727F8272727 %F8272727F8272727F8272727F8272727F8272727F8272727F8272727F827 %2727F8272727F8272727F8272727F8272727F8272727F8272727F8272727 %F8272727F8272727F8272727F8272727F8272727F8272727F8272727F827 %2727F8272727F8272727F82727A8FFFFFF7D52F827F827F827F827F827F8 %27F827F827F827F827F827F827F827F827F827F827F827F827F827F827F8 %27F827F827F827F827F827F827F827F827F827F827F827F827F827F827F8 %27F827F827F827F827F827F827F827F827F827F827F827F827F827F827F8 %27F827F827F82752A8FFFF %%EndData endstream endobj 87 0 obj <</Filter[/FlateDecode]/Length 25623>>stream
+HWko
+ E
+4=ɥDqW,w< <y"nlS7gur4z\^?ͺ33e&S_eȾKq<U)sLm=[->tBm0W1߽xk^TREZmT̕=r |xf#BkS7c4͚K26M}q]̍拃C(som\ӆĿEx]~qr.}=Lon>_b2ln0Ypu}yzv"kgq $F7F]V<=7S#=}~[D f<Wˬ&N 'õlDM0g=JtV/Q1)>QrBgDplA|>ݹz\ȿo*o#6<Ayw;~[͇شQU7"/~}Zf&RF*\emr1 
+wnlwU]7ZfcFehg7SSl8+VwFn`hyX?ǥ{4L@*\~67wOM[\T xr[lEr{yrӛh^5Z]OOʍ*kU-
+P"_8#F W$*#(:ji]k.4ˮ#փz=؊Mq=.n  0>=#C{ za^D/җ2z {z{IzvB=Dj')w9זBj8,(҈4s^
+O@0R(H"sGғnL[r)J2L\SΤ*PLq%TJ*RJpHcz݇X[BGX,8柰DZFZYx%sKR['GMϟo5pO#Id%X:0!f4E X
+$@BD( C0
+%a<*R
+)(d"GFL$ʓ)dڪB. 4Cn#r"=9R?F Q
+
+@a`*E )*G
+(. A,59N0ګwJxlOXc.A
+FP|cUO!}(`h_4e` k;E ST3dHã>TUv715:0*@sn L
+SCS]Z `=HC@ Ly7fqJp@@Ӫ#fy
+4};,SƾLrӬO3pg3( $q(A!ToS$<LіHٓ>iS0vxӎ}?W 3 &6@8&ӱ0w=o݃ݝ>{Hw dx@3 ë;?|lsݶ{|;ova>..#;5ƹxwv-;!3!kM?&)'E-8ִ~pbS݊oVr^uxػqAq
+gI |
+ iQhgR@h`
+a68!DY+TmHU$p,X@%
+b7D1a,n6ƜGa?tY&CJӠ,*ܫ+(6DS}SќtءSB LA @1Hɍ6_f:sVHSr\ϫ]_TGkEkjk4|2sh}nPajR,Wp ,
+$-OوsVS\(e8p]
+vTY )ʖЁck%Ԕ"$DX*J`ъ-HE21iqUv(>J.e嬯VM[+Lt1ȷ/^+,H++M+8:rQ(^R
+6z t}X)UTO K?VGLRiRs|:sC|Ö1чd)y&ϽsxJUrGzXA<>9PsxD[(ǗȨM9-Ŝ'@ps۬ m-2JD-Tr9K 0HqN^,v`Ҳnhf5u6yIœiv/8G,),{x
+8lbTcwfw!P^9Aaw ]+kpP 2W+>FZA#KGJX1BD=Nmycꄫ*?߆iR9Ubr*;GQs*C*ڙP=Q*f9&LIGVR8-fb<(Z]F/
+ѱAJ""
+P/ș5ۗo/eqÒw3{X gO-nP-%,+}ȯ
+@T] ==g7cmߣ;(ы\ռ~ڊY@Ρz @%77m}%~Ypw`ך~Ze:}1)ce\r, Ԙ|?`4+@w<
+iǭi/f
+%
+䃸60^vbN@
+ĬtBumS
+vK 4rfIIى:q?o8]8 9].#0
+<"uYϑ?|'`ǗߜeFӨr[ 48ҹ~G9,\CsAsfR :YAn="eGtA4Z Ȱ+Cl1˾|*" =e5Hb v^Ġf;JPl<@l`0VY# ;vnГ:i͔&ytRܡoQnct.
+@BPj=tgKF9KOx<݅r\1$䐑597pmhJlT/,cU'ѝ˩Sy}@Yµ
+\)$LMRha#T?H>
+p >UTR[`Xz@t' w}z@/ /4Y56 (JdT-|\lsԇ:fQԂ<ςBtWR7ϹsO2  #աP`'*yS/VGDߺZ5/V5['ȿ:ӣ0^ׁ~%T,>.
+|UIhѬjf$q׺)Wc3K@hˀk0?ZW_F͡B/WwZ!y>(LyJfĭ b+[j=L` z Esװ
+V@Z,<<]n0}7
+DO `T9[׻g+8}ŅS8+Y-MANpS=Go?cf5-M`F
+7]OԐxa}nXuS7(60nndtwWMՋLŽLi:0 ^
+ "P₾H@ħ{2@T`_+_WK Λ]<BŴFKXM8mT$ .h=-] XLn&p :UZ
+9
+ϓ;Ɂyd6.ٷOS%Q:as9^=_ "z9RE!GY8TINJ-&ǮQpOW\+Vd7u{[K.,}WiQEM* $x6ŧ8^.D+g
+ Fs6mo7gp
+D8k:%ήgS]c
++rP;mq<Dpd$Njn֭j·ND +P{^[(h:%]f9
+9KZcvE0[4@;!!ï#1Ox+ՕywBpમ
+9!e'R?8w9zAu:'ӤcP0[Ur t;3VhX!ɯ"JS+Dn}@[qy-Т2+d;ү *^T7LᔮVMq 6<+.[@R0^JDV OU)bdF;7DC D.48@tpxT /3mɏ~__>~o_ v_޽~/˧~|7ӿp/?bp7k;ס&S%&o~̤.zN`7M*3(
+eS8*
+RcgmMy}Pcma lOTLTJm5| ij؞6MBYZhG<ūZ
+P=A]ZR MĮFCj[\G=:.=촬7^@k\FMPp|X5ݪEq)qp:X&8Ĩ4$0`7#{Yϸ\b8 .1&yWfԸ6~t㚝a>d=7iƤ1
+%@&\uA`ɀcuhDϋ ֯B׏N5[ţR_3[Tm${
+6v#NT[CI1vvw?'8`
+"If4]8\%y"rQj (D"N=Z{pJ!\s/ >B @A?"}EK2N~P܇
+'|E&Q|j^I ,
+sqS PvڧCyוϱR 5;E+j;"BO4ѪMHsu̿+|"Ee(A=U[R\hDV4ry!2
+FSu64x
+CMjGdK6!!VKiy t
+)Jq7#@7
+`eO G
+~7*ѮBhN{RL9kIpْ1b'xr@"32 )'tÀ-Ae,d+r ،m$(NVlq DYb?f̸/(cAsIUKU-ki~Q1;5ԏJE1?W{ L: ynhUdz
+)!4V 7ᑱ`'JA {W1utq4#ȅ6l#67.? ܷ+Y"iuo@UWpC1$׈ }/乞 Tv"2JV0%MXܫ?fs:3]2sE> "۰c._zh>xѦN0a]a~<VQT|t$lƤw
+vxD"JFyxGND' Dm+И>ZѺU>JR Ll4i_Ǡ
+Cu
+cɚSL]Gc2Ɨ2)‚TiDU*0e0Z+_&+t7V hKRCZhٯS)\h͚ȕ{2 U=LjqhOr!i:8!jO{ SרYt?Nd~a$V[nDbIrWo켟9'=FwQ֯]TL Q deO쾸[b(#`Y1DT*L,׳"OBdQxN5Ejych[Εr%pj4ԞFsjRbb$K,;'Q [JUs' 
+]*`hyl7RS ʴ
+3oQCJTd;/܊UztlHo- r~_sNE[;3E!iPۋ$ңT+`Jm\-mvw'c:ݯn%+L$|Dt&@ |ҕzVQx+$70bfǀsl3ov\ړ +v:%:8&1X0_AЏ T>)4b5ev-TDEЃNsI.||1"5؉=mR<";u\B=%Pb!n1hVT^~ c'r0gQUC XK8BZ6=Qt
+PtƲVpvV]0^fSz`9;zŒ\!NsXlfA=9-cQ"m8?6+0kMt`8݆g^jUc+yKC5KmxK\{($PnҲIm4Qw:K2mt%Xo!lʙeu+x'탒"nӃ~zBCZ0ۀ-H j*zYKxC#C蠍L{F- UO
+< K`ҍBv%-~VmC R,\},5B0lqZo5OC]B,K./p$6oJ~O_>ۯ|}W(-b}/?W?_~ۯ_З?ϺC*#_L[VA;Ÿ
+m1:F;¸`+C^F4FC /I68Zq>gޠ+>B 4j92}qH̜J“⋞1x;Vj]XEOfT%f`w%qDcw?0a(,̃'fV5$+zytEӐ{2:  
+TGKZ{@q6'#]H4TMyFdV(gZG_\>
+Aei$SFsNĨf5 Ћέ ρ yOm=b
+*e-K#"Y;ZGWŤ:bZ5m1|rR`!zg>6Rx3@`j=iN 0Jٯ30MPTetXDc+M,.P(,)@bKwz*ǻ"F`\w`ZbqcQ<Gg00o(<36AS/!͢}{7" ܝ[dJ;hEADp- Ԃc!
+h&Aө{L^
+4׺(6RO"lKy$T뫈vKu(}K3Mi:}e5fa
+S橻<KefeҔh״i.{98
+>[Hh_iQָ@8ԑf0J 85ZgJk ʜ Xܰ=<6A9Z!C3`vQ*MTf@r$0b֯ȊpB6 ¯r)S #B}}s$jʶ4^CS
+7p{wHf*fFDoDH'hR3˿Ɯ)1Ī.I7L5 x߿T^ M2>@A}Ze:~hK^öjFݎ!/5[=Ɖq_n[ΩTc:x Jk@sn
+U-*w6·A"t++Vkp)'V~U+X΍H,ϸUV 0֪qRws,Z>qRw3aR"HBTJJo_ MK/^}mQL"$`ƚocOyBk*Xf~<|{q3HNՈ
+UۇP&6F1;875` Y1+G nX&;c[թEzX>nQQI)Phi*}o=rb\z UβB] !$DwGQ
+D%Y3y vQx^ef\!k15M[Z R}d@zf(FK+>2(`BJB.dW"F1ȴ' h8l"8KqbܟV%T+BmzzEgrXrX,VX=h[yj)^,cz{nJ a'sx&e?5hYn5a@hIR,=O <ъB~MLפtB Y[xd{2 m7Ow.!j<Ф$%ȆwB)Sp36t&A&]}-װy"w2=ar7MOs,1v)oڡ&+SjŢ0AYq#ð57F8Ӭ2-j4[twe;4%6z-kR ZsU-Mzǫ=\l,F묵dU gS .rMW{EAsfνP:JF}Ե}a 5иMc:R J9-kP$w5{oKZ Ȭ-$B kdrx,^9` \)s
+j<`s no PA B-Z [ؐJta%IsCU
+;=iF!z J9I;OZU_bV|lv 7Y*< u;8_ +6>`I92I
+|LLB
+ tSZH@րѱ:Z4f,:VP%n7WDRJX b&i Lt\$=pC2ک\ LYlYz_e\ 1*2ḅ@
+ NVP[yo5NUT
+qɝbBGm5[
+[Hvem#'weGKerՎ<
+f(-ed;~ wѾ%H
+$FaвnX%Ua9x+q4^$"?Y"M<@bOn# c
+QMIhs#(aF({@K 3wz/?T-N$rS-'^c)9':]k2T3}w~
+E((7VC
+W@nC!Bf] "1|PH"@5 b+ĩ+{G> G[54؞Hh)Չ+1Ol3ZKuQTv%oW/4'YTWR72PȰ5<HM!҂D +/NPUMmrS6,wūO=H],ң~L/7
+Nɼ<(OisZpV2EqYx$pZ .VBNA15u4^!{cBjn";*ѡx_nB~+2h+䮌+ƥB8 ] u=sCϓ|tQJJ LEZVf:!0VQLH96hǶ$sr-gTߴ%On P<,\Fڙ!9Y}X #ҝf )JiʂqM:
+o%˶ԈSԂPVVf*
+4ޯb ;=S5J2 v[ 9ʂU&UAB(2_ /ku*B&?rOwM:1fОI*]UyϲSg0iRJnk 辤wf$d@iB5 Sԋܝ<1TWb*ԘvVTT{~oq׶llYynҚks4ˊ  .U c ào RiYXlsA`kn1}yꓺc;HD# -Y$Z5㱒&@(<Pi9&3س#YfŖ+B$]3ķ1yaC!YBRۅ<Jϒi&9%'1V}|m֕M&\Х(\fc
+g8ֲ"k=&fW6i.i9r!3ឮn YN|Tu4(I
+.sXf8ac@,9w28 erj\`)! 6":}T;Tv"c A㾺"v ~|3cD3ӱœ~X1 CFIxMy7
+D{ m0^mLx~2-?EIL9?DeJeLNfkHܷM8
+Rݻ:]{YW$:z~W.?{ٶx4̋+:`j@ Qsz .p2Y$[rSMnĭ`hDjin6pRm1y$[Fy-:hy:#ڣXrBeQxH
+HdWۮ]Ga %Vfg)
+Pt=QdDlriiR-(X_-P%!QMFs`dN2__I~@"
+K,Ml)"VQ wjؽu.oq?57bY^lI׭-G\jPpBZW3LYiZ 4%=e
+
+xOV
+&,t;GH*bĈ܍;fVȜ/;GNՙ-MAJ7Τ~ik`b"6 ;js
+eWrtN5dHMrDX e&(e5f(YkcfجaBJ
+n/ 7-t[3Zd:NI$ '$& FuPD,X
+I\=6fii[9;؈L+?Q 6e6α*1{؟vϓQfvi`X5N
+()-j5JW,A<
+dD?yĖW@Q6G;8Z܀mW PO sA ^#*)pF0w(q)| ,#/%/DߎO?||~πqD*|o?}߯۷_~ϟگ_ʿt[6d}!7(xTjd?ι<ca@Bv+̪DHHyPFFvRbӓۗR6$=%/U'Ɣm}1mF sa&jz  :Iߝ0Q %Rr
+WyqcLgRT(2YyiKHOV|5;E-Oy"y x@C /B Nl"ĝPRb(ȎFE]Q.#1щze$
+z1b7x!SdeP<@쓝Q|?Q<T
+NaWHm"TxZ
+ 5 j<ٕ%$Ao>Lt4)*ً8 ҏiDhHĒJ\ħҔic%A0#s Ӆ3y
+C8\)*:^g-DLn :ţeyإt+ܢl8WYr0Xv̮r sKZffLp!!sb{bWpϧ0Ud;39D"J+HbR &RcvʻxXiR9v,c~YV8HRCh#9Y'l+/\@Ē"dK%Ǚ|+Qx9аHy&W:uM`̼bYC+xQ):VcD7cb݉(<I'+ZO;Bu.$5ӡx7<Y \RH%-m B%>ϸJ)Rg\$•IB1_hIW|Tu3h .vED"9O
+QcBN=|]/)tfab02j$[9IҼ%hZ G[MOIJVk#ްrvOq«92U[d잘)$[(JT!tK=e: -rDfd$YMwǝAI(V*IL\M)& qY,N1|֤B:
+[ƬCB,VxV5Y?gi @|QA;$5gszz dw!w FHG&
+r-څ'`bU$kmw3!-|Db<JGȽ<a;5g+2n7hٻ;*~oKGRQ{^5x+ŷO[r_`Übȭ4>d!((k!V##:L/B
+8|u!!nV{ؤ͑
+IyAKRiY/^C$<PǸ6a~è/k^S"գtrf
+= *DIOʸU t3d,OHT3D( 1?JvAc˃,vZޠStGWi.d-6*Tc[K4bɊ&ΦS" tdEkݧzyX[ЦԜ.-EF !*7E-8b+l#Ɖ HOMSF]FKGLI$UrLͰT\ǩl. i}dvL<[aUG+t >] :=:оF N_,dETGKHܒQ<l $=X1}n<3fL;=Q@X[md2(nu hCCK>:js*>Zуy(<mq/8Rpg S'6VQ"ӈuzV1ŋNATB+aB+ۆLL%3dg6Zq9z=AŬm
+rv_l*_x(\sBrl/;/MyAKw!HXw̡
+Xq 1QTY)酸z1nwNĹA^찪mZ_~/_᛿O?~׿}߽jB?{ۿ^珿w|o>s^YPU*VF[ҋoȅK߻a}U5 ږ(ڪyBN !kh-[:m v!29B&MzB<WL3C>GhnS[߼6MdI$)C~1(o[_{de($Zv-޾#e˴jV5dBԠhp!DD]wB
+#P1:lklt><z }?
+8Œ }ɝ5-ՊvUFxw=Ό}1Z=ܞHt\E
+^mPsDzt.:.H~;Cfr)A^!͗ H$ `w{[m1*HdS^lD2:$[!l \Ĵ7F~KFMy2^*uGd
+!V&x((3mKUw|i]%av#{o}G E-.%<9+и|u4ߌT~76Xj˰?v)5{Jjt)i=xrs/Ӻ)KESUKcT{gtYz(1Y6@#׽`VͲz:ci#,1w|E Jέ_#Aң^>E^gHiUzK^k+l
+{lɖ|&`9\h`UX2϶50-dҝJ3}CsFi\Ϙ
+_|.G;. CB 8z |o g>GAusjK1F܍J)$LpFJEV(Zm%0 -.sg3aFÎ&
+pq}X=]'%cDB N2z6N:UcC%Kj ,,rm( l9+=xXfl~:}[sIrً R_W)"UB.cƪ9f?(߁Yb`I)39WiE{Q:v]uUVCb@(]=QZ3KVoNw9 |W]gL-JS@ؤt( KTЫkf`=0T[л]}ECiDF#>3Q@!%%=PIiOnAPuj#ե7DU9
+(<P5r8-qj%?Rn`&w6_ǝec|SN,5LgC1AJqI̍jӚbņ"hjmPM Q;+3qE}vZV=Ä7r~ *@ JInrDWYz/+O~Wpw|_iڬ, Dܝ2"g\5}:aٸOqӁFUGk¼*mflQGN٪c=H-w-( )
+TUjn 1=ҕQy+ܔs
+¯rvH_-=AB SAA6yO}/cN/kժϠ=@fSD/_
+ z KAvBAʭGE㔶:ȫ,}8N.ܽ!}TWӄN (dׁ -M0;3C2{bw*?YP&»Pg0DUhqH5,Y8DcM9N1AY4ĩ};gP-ho }
+ Ě,d=M0> d
+L5K:]+5+D/RE =\C@]}{7Bh;~֐H$nAA]A,"BuGaFz;Mt
+At-3A"im-uphVծx*u죲ǔu:%Ri@vbl;HjK,}0㲫Ӎty+ХâzAZ$f'dFT׌-d;'O(郄.^h\ICo6ps3l5@KXp!x+h?h鼁J 9[hi¨ѳ
+s4)۴+(hzV\N~
+<LT8_0BFwN'" |57EmF񱅺K,̱bߑ8jd\cn_aPȤ%u { eRO6.糠֟oe^'LlR )ǿj^fRQn!'?_tցU7zVq7$Ρkrtcz>^/h>LL8)Luȭ%1&8Jhه՟}rK Q?in)KQqS63 K:k&Sgguyj *FbR;PpsD܏DPU3+Z
+H-hB@݉\r["x\#!,VyH:T/w+X=W!2vwGXv_)TR?`+ɍ 7>^[KX{ܲ[%HZ>jIaP聑|{LliBLΎiyӛRD(3sF
+xL-dQQ
+胱OkРP|
+}o~aGk*EՃpTgmcvb/HSVT֤(hatޛ1
+vZӔغw kkhQKGm}x n<Đ-Ӣi]EeDbrkJ%A鑄z^QGPBf.CL![LD;]&|yGDt' ԉf!8x3Ph%jQױ`< #|6vcmgk?O~Vj}_?OO?oןo쥞ݥid70k~UQ
+n'YRj(I
+Lƚ=x4y4NOxWb];R}vWچy>\0J\"~u2W |%Š}*+.y~≯53jDh)PgB)+J8V"KIk lW+?4Wsnޜ?f
+Ԛo[O%zf^K <*=N~@9m31 ~/-ˈaoZcCN T"(&C3?e..HEܥw<$,TD<02Jt6>JD<8U^tEU
+Zzr~:0g ȥ~jܨ#m+𪪚{4ph2b6b), >
+eNHMj2;x`~k@_~~bxm >+p<=$.71{yh:@:ʃP;҈1DpPQ0Qt 92LWwf.5) ^f0a
+lݣ0
+>ωI9j\ڟ ['-ENIQTE AKY
+,! %H30i0&{S^څF]'==Nr墦+Kz=lqUBEy+v!?>{6mqЮb m_<Ƌ"7nbAlyZCz+b2aѦn-Xpp=3ʥE#%[Z56Գ
+@1H#f
+sê< p-2 q5b1h+b;f}% IѬi;@fjbE$30yfёi'F)q[%;k @SUqC@pp
+n7a$X:Qi Y j 0HGs9$<<,2OP|V<4Rlu2o"HPhnF^L: O&l,V
+@hDr,1,rc;ӘF<`s
+oX4~Xwٞ#a PQ#b\
+;y4/4Q6GD:s xK',uwK
+XZ?N'_GO_|ssھ|v~_>ܲחG,MzK1~˴6ɫݛS}nO?~a rҳyyї׻_/v?~f=Bp?^Ym{J_n |߮?<}ϯީ =W/Qd7Ǐ'lq>_˳OG?\]ܽ[7gny^>n^/yI˷˿wriDHk1 dmncDS~{5fPc?)ZWDWO4a`rOe0[׳ d:F˝ޏEC^dK˜xoಙ*CnN٨kpI[Ig 6Q*tPc˼Ɍ`RԠ(%d#cס{L1ox] E-G
+'epuM~qinMh^+]T;
+!J<0P GABwQkh _5QzFueA4VRy5,ipOXB&b-P qѳ1eY~XnvtX9+.İN0A}]fxZi_pt6zmZ9%FhlRW'KL5atqiq)\eBnu2dkY X 5^$ $ze9lg<QS|
+pu^skujփ `! `j-(s5PuǮ^*>;zh%zP}B(VA<èK -Ջ)Avkreke-EYNzpn|cyusvXjgM ;5cd{o,['rұcXh`i-{.ٗvFwL g{ɾb5T-c+ ŵ@na;=9IQ)j::tߞ)kP/Nug\Z1>TW5NmIZΚwp1gkUޘ~
+S#r[Gn^wՏ"9md%
+fVuCY+6&J7Rɑ|VJ$XY2 žg(7#5ha9{F\02a-Ka<[qmwgBJs9o'ܦxx` Ø{g!t1fo9G$yLS;5>
+Z\1$Kc
+:{ƞ%R]l5J֑M1 ő]9Jy("<PְN)f:Ǫzs9 7`jh2e3T ,<!WFMxo"૮y[)̶r`g 6W2]$6/>I}tńVQ[(并bJs
+w>V7E3kM%c vgq=-<a/`DREn=X*IY3 NePZk>)3G1u;\4\<_Kb!P&Hp95V Qs#$ju?:$j[2N"ZW
+T-J*ٍ-W3uS@st;77]h6w`jVOFK0g,YW>)F`[k JYBG̰@KiRJc;|~Œ9>ӷudͭG92G0N„">ٲTU4Hm H+$bEgwG֬FfNMWǢf08u+ӡ*JLڴ `<Y`iԵB( 531(u ˶<խ^ؑ8l+O>>ScE@דTE@yͶ.;MnA%:
+2|_ Zkf -)dK?\] rYgu1gYO9K(z[r^GC @v3{_cQ^ !@pc,Z2<Z9{b~W-Ys-·n`eP[TyK=t/J-?f5 PCF<}z4l*
+ԅvʛ9|[;3`MClK`
+ʧ;N`T
+=?܏aB\3t₳>fhV
+2
+C~6܊]
+ R(^ok9 YsƝ{]k[>Y3c~+lfRTY=G2- |Ѡ|f05׀9J;ߓF :ߠU/yڪ! &4RF]X#VܖRVRnޟyS_w_Y
+I,~T2AYŔV}|0k="*Ôb
+
+Q{=ۺE#DZR8A3UU4cR.I\RfjQ64^hNX
+0?v) l62X3$F-WO0}gG3a'9,,^%V>zB$>OV߷tA\j68 45tX^kF0)ļUvLi3`K5Ozkfh~M<V 2Y@gwi2VnyGC }$, yg}bZ
+;UAFvuwQ}ypXW@01GÆ(wu Si'_;.3Q'k
+f_ƃ53e)!]!_|VO
+`ۘA4.eA 'K{S٪
+}'8'>|~w #} NC 豣$cj<yKGxВ^p| Q%‡mnF3+ mRD]MԸ{k`5jt5T5|\( pښMxHUp538hX8&Tp5vjΪʐu*
++YAtR5v8ZZ%;Ģ%K\"%f|Ե{LB۪$V$xEhh+(BL P
+-^OU(W. J
+tEY>qh P {\ #kg'
+-IG}&Vm&mk~YLpOqG0Q4zIY(ioƅ*?uט▲` )%`s_U~ߟڝNp$[ 3D)!. JZKx=Hs k' w%N{`P O,C,,]`+c% LFMvV9e
+Mr%,:ثOrz^7C4󶠴@gXU=MFx~<98׽^$/tmoO{[= ,3d|-7`ѕyw{Z ނ`l4_ZW6SW}}D.LQ[5"[Mqe6IpZg^럸a2N(pL>a/6-n0
+R-Fwcv6-DŽ70?3tm|?M<]cNk6KB29H]B':3
+*a7H!򠻬> f3Ta" 2[ۦO
+t^021V-9k~
+.oq\, wffHrKyLǢ~o#|IY|M_<=Lr?*褋E6e\ac'9T;M}Z
+HWkoI%#qOv2eEOv#VVh$_?nu7/$-d‡[ܺ-MeI[[X0!&Ai@KGP_ gs4Fh"0MtO8Uֺ=oA}aZ"Ly
+@I
+ Vv)tyJ*.(d\;rB3n%-Mh1_X~ u Bu
+]\ 5p05[+V"9 SZxGX\=rm+SzI ۔ZT\pWٖ g+LʹL2.E7BؘxƄvXFP#m3rFr+!h
+A()hA+QW 6.~m4I; /Ij ̃D%d!q:Q!F}fX m@`%&X(b
+EbXWmDn.x*5*
+WI j\lJvh+Pd n/Ѷl/1]G6*6]=iE n/ YY~,x`˵$<yLϥ7iWfDA pi5Ve ]_uCC
+|=\72=~%k~J`Ɋ$.4xIw
+5kFT^cjݵH#7ՑMW*CrUMkJ+ƽ K68pxFؠy=`=VWlVma ǧ-K\&^N]jRzQ^MzWGwOet5UKHڞm)Bj֔URrjZtA>Nw
+l>lk7ŠlZ_`5/8 {56v[T =7Z~oXN*`*]ܭ{i'{9M'AT@6~|M"6Sm8X<G|6(vȝÏdM)\zɳ5y|@O4q&#ހ7౽<WDހ $pM x+: oi7zx=ڷ.WhH^ 'cȾ RGhi>[wxhBxgA:ުam^织(ͅ4ݻ#ϕc/jy7ˊpWfut˷I>fu']E>dz""{9txɇ0q7lP63NvIwQT o[g/X$qm>bb‚ZlChhi>1pyE5!r=MG7|ɮ~ڼ4j3;|fJI>ɦio5=Նc\z&lz5[sBu\?u!BWax9M'Att:(h!ux$|j[v }^oYx|M?eΓ_mH~.{XrVdYcUSV*W6%d@@C4O%Ť=@PalnDv!99=`?Qܻzw6:-E_h.HxK88ӓF[{'z au ןoÔϚ.c_dYhq3VEن_Gnj28\iuPĒ9e,ћH5fi`xZIrG)43\Fm tRa gmuuiǠ NE_$>G %t-Óm% qcv`doi@9rǧ6?,) H/P"$+B;%lrKʁXgbәyENwFY0HNIwY^;zrV׎éc$Ls:%Tie8F%/ҶEi$dRf–I vS~{8<>ƶIߍ:
+E,E8|c=;x'cmh
+oXv޹g4E@ $G?dpFKTmC S"q>b3eį-=?ib8=O#BG)8>o8&x6|gȘ ^_8cݦ%qu~pֽY<)=5ʕ_WN8l&X./6YdJFY0HNI7_X^;zOrV׎étdx8i UcZ0λaKmUl)ezR>mT;| #J\<<`^llh !<pKw2h%@DZq&8ڦcfL05PC\+PN('.u89=`?Qܻzw6:-O#!G|΂؞.ç,')qʖ Oe6LEiRf4\%$VER7Y`N:}U[Ѝo.oMN:usWnxԭSNNMf`j(mx3 hD+˧X Q\D0|WD]UX,qWg=F UQ~^D+>Q/˾=L)+x!ˍ,TDȓ JiǏp,{xSZdsXVvΖ߫dNj"aD];xGH3Ռ5yx"r&$zvNJ)3,5ұRy}Ww^iG7:~/ʟWz(fO2Dа~ϱnY/,SmSNr`0޳iXQD#Z =Tu{yҩa ALcfL05e Qv4Nr!8^Ktx… u{&KJd3a{{>]1ߛP> R\ r\e
+ sEC,f'vRX~VZJ~ShN(2͞AHC֜(];~%bMdǚVW藿rF H}#nڪ(?PQ]DsSXz]“
+;h{8Djġr-Fdq*XNZP;
+&cJOlJq(FԥoFJf4wpyPj*晉3'P2%V8:-;{\`O+wzy9H~ԈCyw޿r`'|z97+1%&0xL֥Ћ%
+|u쌽XbDD_9c%|J+qn+w^e.u0^ #ҷ ;Z?Cf4wѽw)T
+HWn:_p
+4K([@ņ"u(҉Cq,Ei)
+vqi.B@7Gbɛ^߂aiޟOq@Yu|ԫ=~}<L
+hS{3iQU\(^)DQQ,2_G,~} 2E {9gT۫cɥ{mUUpspqlp0Kʹ|b41A\LrGTH`>9P w`EBOx;`=Ky0ZEC1-uɖU[
+*zcaxoWRTCrSU(LQ
+C=tp< ` ؟am
+#C-ݲ:X[_
+pH_;W`P2|(iF5QT37b$NؑK(H
+WNB ˨/'w
+YwP7X׻[P;oE۹{4{5sLL?:TF4)">O}NI|*g(֗bv)VGuĭJ4
+ PlÖm邡B`HE͸q0M{ `H\:1<B8(q0Q%#YF+Lr3%^t6VapX9+4Q(O҅CttNS)\ǃ !=xxF7MŋxN^>y4af(֗bv)o5}أ
+dL C.:ҵ-L)
+ĥc6-f 9"YF+Lr3%^t6="{sǶV|C( w}=CEWi_'ˆؤSva0H[
+
+m^ЪfO
+ x 0mc<<:xw2C?
+ 
+"}u`DBN58*_pܪ p8b&\V/i*(Xq BfJќ"=6`[Wh`Qd#׻AĬ|1ûE̵^ƙȱ0dq|#Vh -yHy|/p/k۵~mu{mWzD_d\;_y+>y}!_n"x4
+ e+1DD ҈"9UHKn
+Zބ^,]{cFGɧ0
+R`M)l>إ2QZG~+Yq`9𬋁] -] b`{d:?聩1xx@A?RBpR`)g6θqڄ&fw&
+)Ç}ɡdL HE|o0ې S K'3L:v{Dn5H^XdNѫ])\Qr*X!F6K5Xr>8G2G;]r!3Ya=ӶTbVHW4f8'u
+.mȜ*]kx6-QޕrY0 xh$1!8Op_IQh$C]ps6095jyxحܨam(8eCQeOjܣh"-8a;ˌNx^~
+rs
+|pFݑ38$
+)ÇH1fTIE9#&: OBD.p$4rrCAb_$՗(ESml7TiFNiѾH[
+7`WX?)04
+P`HP(3TOcK0WU~1jf}8xw 9LNa|6VM
+Gdwr% t:cd ?tH> OO\oEƮj[Z`eA. `c$Qgp&c`
+׋F)Jֶ S k6<v #AHcw1bcNb_'6HdN,MਮdXƊC,GxbľHw`F^oۻRcvFb @̓%'Fvg ,-)ft1&%eY ,vWW9uӞD|?^,R༺tjhWRWzW3V[^͇gO|wd+}.n'&۟m|<_[^?blxz?_-cq&/1N=9Ϧ_ovZ-c HHfoW)>NV{7S!ތ7@XB8偸ʀS4kdڿ8^K1x9zȒdv1*VRIL[aҧϳ4{ֻ[LGgv=wx1xCg.E&E>SgsP
+!l^HƋӬج(B!~F UCR1Ɯx?KB[EZԳ~.9͚7Ȥ=\:δ=BlPx:Mo9rZNOVn;+%NY^'e*ДW]QꍡVYDo#'N5@}v1'^h3n uwn9.
+(JNܰ/W7W(u<O'jy=Tik9|=R/=m^~],WFOyGƀp->Wj"߯VΉz2׼t[PJf ^"dUiI\'5[3SU|#kcUݛ>vaܥ콚۴muF@64܎U3HWO@8T5o`-zAZ"[lݖ_ȄV Z/? *aC޺GݫuKS|SJh5DO - 72L0j`iqJkN-e||~hEr]YŪ
+HHA{ǭ,D 7WepRW Dy :ЌN;lpT0jhY Y&6hxI7pG .6QJY)VyCq'3 *o(
+&9"5'%x'!0[@ +}NjAod v9J9l6T.X/w: ߂܄2g7܈%x#r.E Dg$
+FEuHA%8.bhL8ᇐ1` 84 $A4/^!nDܠ5O>'111rX@ q"2 ‰I5ƴtȸ$߄*)mFvG4#0HXN(~c1@Y 2R?S)4n4`iC^_LSoZ)%eL^R<sT+dTK,MG<=()|" @Lþ?"jg9!"Ƙ"KU]xTMshR75\Oळ&I: Qb<+)c8mԞO;\㐰
+!%f0zTPd!\@NH&]3Ѻv[ќUnȷ0i6S]|Q'HSt<gU
+HWkOKJ +6$DFZ{زM=U=~lV+:u:ϫŠׅWE(Ɗv3҈":*6"JaV)eJ$ l2кT*hTiB2) y6eVN[HIF(lsJ(lCT<_]n5?,p#6Szet&/T54W; ^( YJ邧2b[FelX}2et-_d`{8#$-B[> .PvQ% T+[NtLJ7&CWŔpB_Qy҂Nq{GK8 |f갰eP*7 U֔))j~X.ƴ LY>y
+NU2JIe6j \9Jb7Jyˁp
+`C3q&aݤwDN1E 0`B3F7p\WR} Β1" HZ)abUA.'do5$ii
+-[ Br2G.880^ y$e1<
+Ad<-F
+ ,P`Hց̎n󁺃f&KqY
+CQΑ nY=$^*ϵ~`T
+۱$Kc&+TVeݸ$@!]dTdDǍNJp =Z*#DŵmlAtp,,J:~U9E _QBJ4 \cp?h
+ژ-j^[9
+"Iĕ$Mm#% \<ԆdZhCS$kY@ Ğ5xDw2ABL9($X":M]ɤfQ\+2"s
+:~ǭ F mx@Ң·q5JˀG~EDpC˹@阣<dь>zP]4<= 4ה?fWaT:X)Pv $nD+HI=ЬQ$Hp'{>pQ)L%Սރh2:JHJN*" a @O+7=)H3C**-У](8 gL_Zu|~o:۱e֝|#bpiuU/!-{w7k1\
+t҂
+igoa0\ԣzr>'
+yo&[n
+r8C]gBj߻8#KxKN9yHMQ@*OG=~_;mdIx_fe`2?␵2
+T!0`eɍng/L:bojH7Y̧e$/2)y'EyM^rR-RБߑ|f1Xyf7B]#'X3~7B$NC%ÔXJ{y :> oV4{;$l姖>ZٱѐΛlD^F "gyXܹl9nqH)LbzLjDFln{gyfЈ7F<0H3|<ۓB['D( {dh"k|[A@K'7jfbK67%o.)E?Y{V,{e)Lt`׬(XpW#EFbDY<a=[_Qd: IzaBx|nl_1- o]8{<>c3g<ڪ/=emzD
+ +Taj=Qw#pِNz
+2( q`Mi6+ӊy
+i
+^m{ vOJG|6`CRH0
+aK㬖FU\\ݰZ9rT^IR RR 5U
+ZށTbO,QWyC,pU\8DkϔډPo,@!S:AŘ;ȂJ+7gHv:9( @`BWi-m`b
+5 DOu :0Z- s5V\*9[ajOKn0IHeD:z}洚8'N(Z/
+QU.qx)ѵƆj8M8cMT1(%^K>wX pDγn _FHqV1u
+S*caM! XCn2
+*LB*l
+h
+ [u$@R"$OQ(9%9`rYl,hADc<ca
++PYQ
+
+eBoԩl
+^%7qŵ277_wIq50cֺemݵᡢ>u)6mO¿jn䓠0i7'|МѭÅ xSL.AeL!u9,&bDO-!+,NO v 9ԧGۇ'~$Gd627ɳk.7:H5+?,T(Rfߒ=p G.ˊx4цH"qm0UւHqrVDKi$~IcHdI3Z0
+Jp=bϫ,S%2䪂Œ{a-+/ҿK].ؙ5)C$gn4@)+v$<G!![E<sjw ?0lh\FY.4
+n=[@KTe/hl24+}HV)@+(ex4RC^41&B֯h yr
+`*IRSU1@ .Td vx4\8,G-UEAZ:t&c9{fimK5bn ݒ[k4 ůS `gEhF}&qEѠ@ۻSȅBl 3NZ=In
+nouХGXܱQ1*wP$Iv! aS ;e0\Q^69`h\2pYպV /HZYF~T LU
+(_yP|l$B4+GQIMa"=orr _('T'tf޴6(?i4pVOIM~Jj\Q}[zPZN&m'B]fxCRxyt׭ n&ţyCMuuWE*ʷpYS.@PŇdـ_jzfDqk=fEP X/g?GO|O}
+՗h8Y]~{ Zfs.EтQ,A!닫Fw#O,1RL &2J%
+@6PD~Õ^ Tۙ"up{t)-P 5ReX}LX*2 #}G4@^GfG} at)"_z:N{ZVO ({_I%O4ADN喫%;J+(,)\&o2 ޤ Yǁ-=G:}q7R+*e^Iz^1iXr]dBχ,lTuVFRAՆ^sP0;&}=0k_}&y#hpgқ4&V=FvֆU<]7cEat:lCʣt 6p ]$h5eؤ0[U`IQ
+T'G$=Q&ԎGע1=eU>;OR:.fюpy
+]`X=Ӈ1'svc
+{;ZMCj=8䡦rp>WYYWNW $Ōbin: ]TҒE"|r50)'w\GkuHQ)--AӼ׍(ȩ%A>= C_?΃3^j׺}(D?,Ħ
+ټjq1'g=yE٪ L̙p_V"CH9Y=pt~b :S! Q+o^8V?[s] q_LEsw`h{0MD|\lܬ}[Qtu oOk9b~#M.7q{po]l7)I;aC0~xhZ-'7+6 ϵ#cwG6,!1߻2Z
+s?J\ 4Wyta7jZ=5Yoj֠מda6^<*`q(*v(#Y^k Y((MN <[sh#͔=(LyV .Ɖ!/=|^~۳H[6]fOodJG. SaLzdz
+D؁0kJҲ
+yGT@%HHjg􋋶v*\m?FӤ QwνM"X~pQT㓭Zq/I_LbZB
+Ռ`ĄA|R (ܜ,tދhWS c;JSҍGGI.5O1U}#=:P
+8l+hZotS,p> ta;tZ Bf:ipҁ4 \ai
+lXss"Z}:fP|3[];c)IT 2w b{0铉{$x *9Yk`O3'3 K+Obq14N$Z]o~w AqEy~~LVg"Z If*LMjʀC
+ nl"
+!`-V/ RlU{/Gű^-}&^FTW="1TK+=a77DqZ?MAV4"
+2ٷF<m&s;Tlq5H@CQsA?VNxhYgΔ%UUG>|yc#4g"|Oa >>cK;ON+<?ZxVS^X:(QP%Ah>biSEgƧIѬ@ wYhnkFQR]L-P9E'ϕOC^ $uFƤ¡y:Qՠ4gѷBhA pԢ2eC7 Ov:R+
+34g/\%}=$͐+i*iWf\$ .LNVJ)g \DI5L錝 9IEdf=ϔBy@&ѲE5mf-kLJҰb=ICSs@!P1.@q4KC=$ҫ%J>2|܀k{dRbJt*a0ܕ+'4N} :a4]o#~2<xNߏ3ֶmqb*UrOM[ix}q~|BaY
+[]
+e@;g]
+g 6:_ !@=̑"hqn0G쭴N)ϧet6`4f\Zz{M@+
+WRc30hҿNnM]A͵J5^?>:ߙ<}> Vmɓ)5YP߬W疢}~L@VɬڢmY|ճ8SkO2Gz!55Ő:UP/d"d9,l,ʏvUdTo0&8T̒$n @PoCNt^l
+;,V#6l^!9- q$01ަLdݑAVJ\ヅmn^{jZI{Amrks}~6?b#a$%tZj7gXww<|vwĕ#ԃL9d}
+^L 'g ` &8vjJX/DٱF^Z+X~?lNj, 5OZtٿMoDcs~J&0D+WyE쫡A(GǍf^mQ*Y|چ6}z _ʚq$M9@K{љrm&̶t>SP9B .sl8-tƊғKcVG(\ 3#ک8R$pGNYkiXtcP 8W`o߷}]YRCyw')&.E>6脣iB 
+:c/5e-L^nY*_rgzV@yX{؎*_mwgU7g!6][olIQ9tma=߫Ese|/<a/G~
+,'X;rz6/ 'M_WJx.T#*6p$G=Oak.|q}J?_tq@d L%?+",|ĠIO?[f$_qœQtp < q #ϟJ2]PE5G8; d.,e5تH}2N(*7tb2Ur'9N&w9(Q=}=R}@˩?]D,@6qӤ>˟PK,q!wjL))~8i)c5z7ux/Krź +uj[z_uhC*s^
+2)ϙZƺ۾˜mmO x
+v#i~@5ե ܢ@}"])mVbDS'9'8IbY)6fםQ{ɇz
+;uAHݜKlf3vRT/̩;,'4P.3=ygǤofmT#@Ă)|;W=>'{:r)wqWj2HS{$., ^VdH-~I7;LŇ'RNLZ y53n%d[LfS9?8-YU)4^BqV( fox 5B>,=ݨĶLҌӰW
+a@k㫉.۔axkf]XQvx8/ӵu.
+"r@C P)Mw[oEl`w+:prb@B>Ry"bDžJp*f`.O*N`84xJ/.$bio9|zu:?{4) 1Oxĸ\mˢİ~t>Ģ{ǾEi_5tr L3CeeZe?K9Gޅn73?WφZS]+$ .ٳ-DR쌟zq̠ ;=FM=w0;l_|yy?G!Z C9gMeOjҎy-]!v]@пgk,u:G7 m0+mΫB5]`49$T5JBΕC,hV;wNu_ᚤw 1d4]$pHGL1s̽5_)n0BZ㭄
+Rߘ#z DTH'*9HD?Ȣ@f@:nt"IjbX&P@3 Y$H16Fҗ3AvҜZ^%뼪&ꪎ\0ZL2 -6t!!6!
+-E"bUD] x&n{~һ%Hkƹ G~Z+koAF ۜyZej<۹G{ '673z:ս*z3>ݟeL[\,w)
+E2]m\;?y⼠) /b
+Ƴ(~?/-.R)\Nm}0$>ڷ/C#ᘎRg?cU0oe>ԉ#F* ho*\ZN]B1Pl` DҘK,3z- #&
+4|͈YC"]1PT$,lRjH
+wf!uV4p@1lF%M9@7j_ rƤ)Ij2|` 0A)]aʁxN)eS#Xylr8==Su~uQls/§@4s_o:,u`4t+犠\tUC:>Cr.ƺFgI;Uo_O_*1ٶV\j[.
+8{ J̑}ٲq."A Zz6n60"zki-ISzcq:}L
+1ڧ4ޱO6҈nt[yeHw8~<ӻЯP)QINĘB](
+Ĩdw(>*('>mo 3Ā('6ܗ-5|Cȯ85㚯
+Mjɸ}ZuV̵oFm[3Ǝ@V
+HWz8}?bVC;Hٳd#02$$HBe?8w?]\%L)njn^υ ?uMoUf>G2C-_z)gړ^~3}s
+,'_izm<je񙃦$9-jjCe/::U+i:VӋy]ѵ=,Z*a@@,יx"NBT2gJV6.(0Eg2K29e/.]b
+ a$CtrMsmN!OB1 KTՐ.$W#d |G#m
++N$:Fd.Xp ̆*c'kLIDD&g&|P_POIvCy?h㿦 ҃$Vx*P*c1$cD30R3F 1ַ 9/hihT_hj,F<
+Z)v;H)(j`G_q@zG,+ɱP;Z[㏡sT.m>MXN=5)dˣYPݷ'}څe kzbj^lA?Cv[ 0= ź^98y"yކ.o]OnC#b4ÚhcWj 4M %Sv2?>Cvm
+$[ODW]*wY[U( Z}_lŷX(?;K|P+`,;?#tinO
+zb llw/$/QDӥ"NFfBkT6YL yb~)<3h&z)JξiV-LQ .ooV؈kc-d~s~{o32*D<h+2̣,FO 6/#\[_pN
+ ҄x;'#zj2zcVDL
+J8|"q.gC.\L)L[3dNl==J gitEYO\k7{[,ܣRQY-Td`QupWy.\kNcK21{bB pX˹gX6y6 &shIځx}A :4`]݈H-̠ bNF8ԡ5|Pa #P5z\JG pbȴ|B "1<Ifg L/-'z"HZ o@St-Vrx
+g"P'\0ZtZPN0`>6Xll
+x+pȥw7{3wKNs1>q>r\:26-6o"mQrA(9oi%ΔڧG@i)Df@ .n*s*]D@Pí+y-ѷX7}$ޏˢ(=Ӯz-?`ϋKr~e@ tϸ$ N­8I?I}ITi+)PKf3r 5jخNڞ}1+N!̥b 5?ch6hL?
+!_JRV5ޓi]/Q `Z]<&?5tTP]:x{WA0:Gb7?ic;=//[in8; jiZUn)F] y)|s:qqaNgօb7$ s۩;FqrN$6]Ӽ$}#!. 2״N#rjNo|΅7=SU@X+kYAP_F-!XZ<C^WRI۾ u)C
+;IE*KR׏5OE-yc;YG}')wP 'lWڅZo}( _VHmI)$*}VPNJ`¼bxL`[`rC
+jN_aph5@H2ƷEEZS_ /zݩT-9ƹ`S n 341.96bf;
+5S;1Uf<S;NK'A*(#fVjN
+Z޵Z*Zwћ+ݽ@j)bqdRS ]2AYiӫ6|c0˟AٕlPבefMm2jw#+| EQ"D%j)`j.Ŋ\z=]Ruc#ah]4D C`4h gL'9 ^>~=ݲč5-E V>9,U\(_) H{~Լ')DLXtO%Ȯ3-
+q-Ͱ^`u<1σE<.߅0D̔yve*lk*u0ŝŬQɬ`<0+`
+:
+ɜcAQ!K5"N)D E^[{D^Ӷ52#/XSQ6t$ɒsWv+_:o&7phJ2$oews 4S+n߂$1H %)JoFa5|Cᒜ;c ʈ9-ye90$g9q;(l,  Cs'%r Cp{
+ KڛƪG1)󮴌n_<=8s.N8ĮW~B~{8D2wBM
+
+9 i-}8Knt8:ekZ\4TÝ^ĐS hp89E"rO"+ipz<Eˏo,0 ϕtԞ\iy8Kumb8 ũi lRo pn;=nj_3 O8/Wb>l5{rX!`1^XlT&A-:_ jw ً{>'#
+ I"Fɒ:^{rQ xEMKC3KӬLӮ_V*f
+?{S c޷v6UNػREh'F~€tmLՈ%Kaª^JqEpK5"˫k[WņK`/_5>o48 j
+Iuw]5fq*=*c)ؼ
+9﯎rH}{wj3p/NI"d}4.-Fg{E[B_ S]M1\frp6
+Ppui<M:TcpWc0FMhaPc8BQ9
+
+A5BnUe=*5)P4q=.Bv* (=^A$o<+ !Jֺ(`Q|vxe`=ݳ+Zy9ZI }7HWXT<gA*Tˠc(_)
+ 
+cpxkll q_E V/ c=d +H-J锤K~q|g&lmOMqO0OX3dmYf9ce2
+OYj  oD,0+ˣ:A+[-
+\UI><A_2Um\Bwʬ4h),Yce>bY,x/켒 -;e }OWl`
+p DjF`gWW_+XW1#U 85ƲԈ/2ڜxnGvS˰KA_iop{
+]Մ8ߖ΢Phܳ+ &
+Q+ Z CLd
+J&X m2s9[Wg3_JeYO;A$@0d$(A$D`>а7g?:MuuW_Uk2&l}͆(G!ׯha :ӌbA"2z%tf<BhنOTrxhy^IgmᲪ){ul4c(6}v|N,9@oKig/URb5cXMaz=f֥?#Am̑1~s̩6lkp捥9h=zs6ؽ& ?HT z&8A1ơ' 6܃~Sֹg;m2?bD8+@wvpI W{EI;p ͇'i!N=4
+U
+Y$HQ#r)J[ӜQmը]L{X'$ɭ**
+OD̲{M4*t/fG_T**3x0EԼX.npAO̘W!+57
+%r]_yϫHJqn1'+Az Ҏ*<C
+nI4sSeʮij.dP<uFQ˶&Ak۫Í%`Ğ
+8L[ȁԑVi$+dcj6~;)b:- ɟ
++ܽM". 4IWVz>
+
+É P) ! d'] ALP&`2AP6kK[c͛]6£St Cfsl1;48U;2Btg] -'FH坉~F(${8@E1A- p/vPi#<ns6;җ &/XDqA8   $I<RB> ;*y9AA%ǔzTtD;a`SFsb讏Or"-v|wpY\ARA0Kі8c%AG
+
+N.5$Bs6EԳ:"ao^h 
+)vX 5ƹ%_$]~&[z$͞UveAR3T%ZK~pSnC/'8bډh6Fp#ʬ^kz Ѹkr"Ј*ڮCH+XkHX"u#0~'#(&?|S`~mptdB?§-!Q\=AvGFcw6ajk66 ֊^~$j狰6ߐqOt\ݩp.tRc}<,c CqHG d{, dD齟;檷*.vJS`Q.qTBBpG#yc=8*1-3w$%9wfH ]e!:Jqeb0 C|T '0ɕ 4)ZĔo '$OY=r%l౾!OG U"p4;]oVz* D&F
+KAűԗu^Ko9bB%i/`FC!u7(Wa7BJ
+Qū#uqH$+6[/brtZa5[EəfTf:գ cI&;{7btҍ¢xH--#!B.eq83o2NDSxwzG唅tҘ}ꇜpS}0*%i IޅףV!qY#-qU^ʆ@84@L,,De}%#${.~d\Kj\}h#3)#t 8o#&˟ /͏s
+PqxJ*>n
+J(-ƒ<<k}@xz.ڠy1зZJM0ABӹG_W8!S/ Z|AHRJ8Le=t#B%-NJ}ȳjz.t8"TqU:q8OT:c*\"B>okH Mg-9v%`~,bj$sPyےЕ<솛j͛^M̚<e_@2KF3]<y=v8]J lU6ݜ:/xAFE8A8%Qͮl&9EI
+TQ<VΕpىkҋFXK#8!jr;*/ӕ`YZ/\`O:=}S[35VGeT!g0[jIPVmc#o>):ȧgnJwLblk&s|;-9p(؇q_07C<tfM34GF"T%DIU@q .ps L&M3B*#5"3ae)$!IGtUR:)nho( "i1|@RqX”1w}c rۈa(za.PBHJZtMEѤ2,IvKD}~~UŞ jj*5kv#.ўNt6|]U~˵#}0lw~ގڊ_$]*oAڧ?X G:5( Q5S T[)Y1WidgOF&x$6ìR+Q
+JQ`6yuȹ5</ H*i+u
+b_[H1}r(w.ႈ\HWjȷLJwry܍zqicc ""Y6Ĉ2˜bTJMRu[pC@K 9!K=l^WԬT{͕8)!9< ZJ[}}z3^WĨh 5:!ֈn0[Q烺,(|6ו#?9 {<\lv#}ߗsaK,@y_jž9u8!㝽 0
+HUnG~YɖK_
+c$$ oY9Fk9=@,!%H{Ƽg3ɽKM[K {\jեbΗߗŏ'gח׷7Czһ߾x_.qzN^Ha<9N?S]ZJ:J$tW/ϒTMx8QjOu<5\F&8)[˥&[j7lc-Wk.ɢa4֑?*_u<k8
+֒b]г"pU!Eޓ:~Tb= yj2/w)lc[{
+yCJ&xTX(Ae\Y;vBI+- f1|A|/1 (`e}%cZUg>;Rlp%Q)$렆;:k &X YF92 l7 t'
+@X[u<rIT ahq,0=jRQޘB/Տ >24
+7]o^^.JVސ$8 CYA=3hӊ`
+j R9)3!\$-wC%h0ͳĞR
+0000000016 00000 n
+0000000187 00000 n
+0000057205 00000 n
+0000000006 00000 f
+0000175537 00000 n
+0000000008 00000 f
+0000057256 00000 n
+0000000009 00000 f
+0000000010 00000 f
+0000000011 00000 f
+0000000012 00000 f
+0000000013 00000 f
+0000000014 00000 f
+0000000015 00000 f
+0000000018 00000 f
+0000175981 00000 n
+0000176012 00000 n
+0000000019 00000 f
+0000000020 00000 f
+0000000021 00000 f
+0000000022 00000 f
+0000000023 00000 f
+0000000024 00000 f
+0000000025 00000 f
+0000000026 00000 f
+0000000027 00000 f
+0000000029 00000 f
+0000175607 00000 n
+0000000030 00000 f
+0000000031 00000 f
+0000000032 00000 f
+0000000033 00000 f
+0000000034 00000 f
+0000000035 00000 f
+0000000036 00000 f
+0000000037 00000 f
+0000000040 00000 f
+0000175865 00000 n
+0000175896 00000 n
+0000000041 00000 f
+0000000042 00000 f
+0000000043 00000 f
+0000000044 00000 f
+0000000045 00000 f
+0000000046 00000 f
+0000000047 00000 f
+0000000048 00000 f
+0000000049 00000 f
+0000000000 00000 f
+0000175678 00000 n
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000175749 00000 n
+0000175780 00000 n
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000060505 00000 n
+0000176097 00000 n
+0000057630 00000 n
+0000061161 00000 n
+0000060805 00000 n
+0000060983 00000 n
+0000060692 00000 n
+0000059086 00000 n
+0000059944 00000 n
+0000059992 00000 n
+0000060576 00000 n
+0000060607 00000 n
+0000061235 00000 n
+0000061543 00000 n
+0000062721 00000 n
+0000082146 00000 n
+0000107842 00000 n
+0000132259 00000 n
+0000137352 00000 n
+0000142455 00000 n
+0000159547 00000 n
+0000174275 00000 n
+0000176122 00000 n
+trailer <</Size 95/Root 1 0 R/Info 94 0 R/ID[<A62AE6DC91EF49CD9CCFC2B959900A7D><33F4B4E6B4824F3C934AA9C126304E54>]>> startxref 176316 %%EOF \ No newline at end of file
diff --git a/utils/logo.c b/utils/logo.c
index 9e3078f..ef6ba95 100644
--- a/utils/logo.c
+++ b/utils/logo.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2001-2006 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 2001-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -21,13 +21,13 @@
#include "utils.h"
#include "resources.h"
-#include "visual.h"
#include "minixpm.h"
#include <stdio.h>
#include "images/logo-50.xpm"
#include "images/logo-180.xpm"
+#include "images/logo-360.xpm"
/* Returns a pixmap of the xscreensaver logo.
*/
@@ -37,39 +37,41 @@ xscreensaver_logo (Screen *screen, Visual *visual,
unsigned long background_color,
unsigned long **pixels_ret, int *npixels_ret,
Pixmap *mask_ret,
- Bool big_p)
+ int size)
{
Display *dpy = DisplayOfScreen (screen);
- int depth = visual_depth (screen, visual);
- int iw, ih;
+ int x, y;
+ unsigned int w, h, bw;
+ Window root;
XImage *image;
Pixmap p = 0;
unsigned char *mask = 0;
+ unsigned int depth;
+ XGCValues gcv;
+ GC gc;
+
+ XGetGeometry (dpy, drawable, &root, &x, &y, &w, &h, &bw, &depth);
image = minixpm_to_ximage (dpy, visual, cmap, depth, background_color,
- (big_p ? logo_180_xpm : logo_50_xpm),
- &iw, &ih, pixels_ret, npixels_ret,
+ (size == 0 ? logo_50_xpm :
+ size == 1 ? logo_180_xpm : logo_360_xpm),
+ &w, &h, pixels_ret, npixels_ret,
(mask_ret ? &mask : 0));
+ if (! image) return 0;
- if (image)
- {
- XGCValues gcv;
- GC gc;
- p = XCreatePixmap (dpy, drawable, iw, ih, depth);
- gc = XCreateGC (dpy, p, 0, &gcv);
- XPutImage (dpy, p, gc, image, 0, 0, 0, 0, iw, ih);
- free (image->data);
- image->data = 0;
- XDestroyImage (image);
- XFreeGC (dpy, gc);
+ p = XCreatePixmap (dpy, drawable, w, h, depth);
+ gc = XCreateGC (dpy, p, 0, &gcv);
+ XPutImage (dpy, p, gc, image, 0, 0, 0, 0, w, h);
+ XDestroyImage (image);
+ XFreeGC (dpy, gc);
- if (mask_ret && mask)
- {
- *mask_ret = (Pixmap)
- XCreatePixmapFromBitmapData (dpy, drawable, (char *) mask,
- iw, ih, 1L, 0L, 1);
- free (mask);
- }
+ if (mask_ret && mask)
+ {
+ *mask_ret = (Pixmap)
+ XCreatePixmapFromBitmapData (dpy, drawable, (char *) mask,
+ w, h, 1, 0, 1);
+ free (mask);
}
+
return p;
}
diff --git a/utils/minixpm.c b/utils/minixpm.c
index 997e628..55f25be 100644
--- a/utils/minixpm.c
+++ b/utils/minixpm.c
@@ -60,7 +60,7 @@ XImage *
minixpm_to_ximage (Display *dpy, Visual *visual, Colormap colormap, int depth,
unsigned long transparent_color,
const char * const * data,
- int *width_ret, int *height_ret,
+ unsigned int *width_ret, unsigned int *height_ret,
unsigned long **pixels_ret, int *npixels_ret,
unsigned char **mask_ret)
{
diff --git a/utils/minixpm.h b/utils/minixpm.h
index f027894..8777f36 100644
--- a/utils/minixpm.h
+++ b/utils/minixpm.h
@@ -20,7 +20,8 @@
extern XImage * minixpm_to_ximage (Display *, Visual *, Colormap, int depth,
unsigned long transparent_color,
const char * const * data,
- int *width_ret, int *height_ret,
+ unsigned int *width_ret,
+ unsigned int *height_ret,
unsigned long **pixels_ret,
int *npixels_ret,
unsigned char **mask_ret);
diff --git a/utils/queue.h b/utils/queue.h
new file mode 100644
index 0000000..94bbf23
--- /dev/null
+++ b/utils/queue.h
@@ -0,0 +1,638 @@
+/* $NetBSD: queue.h,v 1.68 2014/11/19 08:10:01 uebayasi Exp $ */
+
+/*
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)queue.h 8.5 (Berkeley) 8/20/94
+ */
+
+#ifndef _QUEUE_H_
+#define _QUEUE_H_
+
+/*
+ * This file defines five types of data structures: singly-linked lists,
+ * lists, simple queues, tail queues, and circular queues.
+ *
+ * A singly-linked list is headed by a single forward pointer. The
+ * elements are singly linked for minimum space and pointer manipulation
+ * overhead at the expense of O(n) removal for arbitrary elements. New
+ * elements can be added to the list after an existing element or at the
+ * head of the list. Elements being removed from the head of the list
+ * should use the explicit macro for this purpose for optimum
+ * efficiency. A singly-linked list may only be traversed in the forward
+ * direction. Singly-linked lists are ideal for applications with large
+ * datasets and few or no removals or for implementing a LIFO queue.
+ *
+ * A list is headed by a single forward pointer (or an array of forward
+ * pointers for a hash table header). The elements are doubly linked
+ * so that an arbitrary element can be removed without a need to
+ * traverse the list. New elements can be added to the list before
+ * or after an existing element or at the head of the list. A list
+ * may only be traversed in the forward direction.
+ *
+ * A simple queue is headed by a pair of pointers, one the head of the
+ * list and the other to the tail of the list. The elements are singly
+ * linked to save space, so elements can only be removed from the
+ * head of the list. New elements can be added to the list after
+ * an existing element, at the head of the list, or at the end of the
+ * list. A simple queue may only be traversed in the forward direction.
+ *
+ * A tail queue is headed by a pair of pointers, one to the head of the
+ * list and the other to the tail of the list. The elements are doubly
+ * linked so that an arbitrary element can be removed without a need to
+ * traverse the list. New elements can be added to the list before or
+ * after an existing element, at the head of the list, or at the end of
+ * the list. A tail queue may be traversed in either direction.
+ *
+ * A circle queue is headed by a pair of pointers, one to the head of the
+ * list and the other to the tail of the list. The elements are doubly
+ * linked so that an arbitrary element can be removed without a need to
+ * traverse the list. New elements can be added to the list before or after
+ * an existing element, at the head of the list, or at the end of the list.
+ * A circle queue may be traversed in either direction, but has a more
+ * complex end of list detection.
+ *
+ * For details on the use of these macros, see the queue(3) manual page.
+ */
+
+/*
+ * Singly-linked List definitions.
+ */
+#define SLIST_HEAD(name, type) \
+struct name { \
+ struct type *slh_first; /* first element */ \
+}
+
+#define SLIST_HEAD_INITIALIZER(head) \
+ { NULL }
+
+#define SLIST_ENTRY(type) \
+struct { \
+ struct type *sle_next; /* next element */ \
+}
+
+/*
+ * Singly-linked List access methods.
+ */
+#define SLIST_FIRST(head) ((head)->slh_first)
+#define SLIST_END(head) NULL
+#define SLIST_EMPTY(head) ((head)->slh_first == NULL)
+#define SLIST_NEXT(elm, field) ((elm)->field.sle_next)
+
+#define SLIST_FOREACH(var, head, field) \
+ for((var) = (head)->slh_first; \
+ (var) != SLIST_END(head); \
+ (var) = (var)->field.sle_next)
+
+#define SLIST_FOREACH_SAFE(var, head, field, tvar) \
+ for ((var) = SLIST_FIRST((head)); \
+ (var) != SLIST_END(head) && \
+ ((tvar) = SLIST_NEXT((var), field), 1); \
+ (var) = (tvar))
+
+/*
+ * Singly-linked List functions.
+ */
+#define SLIST_INIT(head) do { \
+ (head)->slh_first = SLIST_END(head); \
+} while (/*CONSTCOND*/0)
+
+#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \
+ (elm)->field.sle_next = (slistelm)->field.sle_next; \
+ (slistelm)->field.sle_next = (elm); \
+} while (/*CONSTCOND*/0)
+
+#define SLIST_INSERT_HEAD(head, elm, field) do { \
+ (elm)->field.sle_next = (head)->slh_first; \
+ (head)->slh_first = (elm); \
+} while (/*CONSTCOND*/0)
+
+#define SLIST_REMOVE_AFTER(slistelm, field) do { \
+ (slistelm)->field.sle_next = \
+ SLIST_NEXT(SLIST_NEXT((slistelm), field), field); \
+} while (/*CONSTCOND*/0)
+
+#define SLIST_REMOVE_HEAD(head, field) do { \
+ (head)->slh_first = (head)->slh_first->field.sle_next; \
+} while (/*CONSTCOND*/0)
+
+#define SLIST_REMOVE(head, elm, type, field) do { \
+ if ((head)->slh_first == (elm)) { \
+ SLIST_REMOVE_HEAD((head), field); \
+ } \
+ else { \
+ struct type *curelm = (head)->slh_first; \
+ while(curelm->field.sle_next != (elm)) \
+ curelm = curelm->field.sle_next; \
+ curelm->field.sle_next = \
+ curelm->field.sle_next->field.sle_next; \
+ } \
+} while (/*CONSTCOND*/0)
+
+
+/*
+ * List definitions.
+ */
+#define LIST_HEAD(name, type) \
+struct name { \
+ struct type *lh_first; /* first element */ \
+}
+
+#define LIST_HEAD_INITIALIZER(head) \
+ { NULL }
+
+#define LIST_ENTRY(type) \
+struct { \
+ struct type *le_next; /* next element */ \
+ struct type **le_prev; /* address of previous next element */ \
+}
+
+/*
+ * List access methods.
+ */
+#define LIST_FIRST(head) ((head)->lh_first)
+#define LIST_END(head) NULL
+#define LIST_EMPTY(head) ((head)->lh_first == LIST_END(head))
+#define LIST_NEXT(elm, field) ((elm)->field.le_next)
+
+#define LIST_FOREACH(var, head, field) \
+ for ((var) = ((head)->lh_first); \
+ (var) != LIST_END(head); \
+ (var) = ((var)->field.le_next))
+
+#define LIST_FOREACH_SAFE(var, head, field, tvar) \
+ for ((var) = LIST_FIRST((head)); \
+ (var) != LIST_END(head) && \
+ ((tvar) = LIST_NEXT((var), field), 1); \
+ (var) = (tvar))
+
+#define LIST_MOVE(head1, head2) do { \
+ LIST_INIT((head2)); \
+ if (!LIST_EMPTY((head1))) { \
+ (head2)->lh_first = (head1)->lh_first; \
+ LIST_INIT((head1)); \
+ } \
+} while (/*CONSTCOND*/0)
+
+/*
+ * List functions.
+ */
+#if defined(QUEUEDEBUG)
+#define QUEUEDEBUG_LIST_INSERT_HEAD(head, elm, field) \
+ if ((head)->lh_first && \
+ (head)->lh_first->field.le_prev != &(head)->lh_first) \
+ QUEUEDEBUG_ABORT("LIST_INSERT_HEAD %p %s:%d", (head), \
+ __FILE__, __LINE__);
+#define QUEUEDEBUG_LIST_OP(elm, field) \
+ if ((elm)->field.le_next && \
+ (elm)->field.le_next->field.le_prev != \
+ &(elm)->field.le_next) \
+ QUEUEDEBUG_ABORT("LIST_* forw %p %s:%d", (elm), \
+ __FILE__, __LINE__); \
+ if (*(elm)->field.le_prev != (elm)) \
+ QUEUEDEBUG_ABORT("LIST_* back %p %s:%d", (elm), \
+ __FILE__, __LINE__);
+#define QUEUEDEBUG_LIST_POSTREMOVE(elm, field) \
+ (elm)->field.le_next = (void *)1L; \
+ (elm)->field.le_prev = (void *)1L;
+#else
+#define QUEUEDEBUG_LIST_INSERT_HEAD(head, elm, field)
+#define QUEUEDEBUG_LIST_OP(elm, field)
+#define QUEUEDEBUG_LIST_POSTREMOVE(elm, field)
+#endif
+
+#define LIST_INIT(head) do { \
+ (head)->lh_first = LIST_END(head); \
+} while (/*CONSTCOND*/0)
+
+#define LIST_INSERT_AFTER(listelm, elm, field) do { \
+ QUEUEDEBUG_LIST_OP((listelm), field) \
+ if (((elm)->field.le_next = (listelm)->field.le_next) != \
+ LIST_END(head)) \
+ (listelm)->field.le_next->field.le_prev = \
+ &(elm)->field.le_next; \
+ (listelm)->field.le_next = (elm); \
+ (elm)->field.le_prev = &(listelm)->field.le_next; \
+} while (/*CONSTCOND*/0)
+
+#define LIST_INSERT_BEFORE(listelm, elm, field) do { \
+ QUEUEDEBUG_LIST_OP((listelm), field) \
+ (elm)->field.le_prev = (listelm)->field.le_prev; \
+ (elm)->field.le_next = (listelm); \
+ *(listelm)->field.le_prev = (elm); \
+ (listelm)->field.le_prev = &(elm)->field.le_next; \
+} while (/*CONSTCOND*/0)
+
+#define LIST_INSERT_HEAD(head, elm, field) do { \
+ QUEUEDEBUG_LIST_INSERT_HEAD((head), (elm), field) \
+ if (((elm)->field.le_next = (head)->lh_first) != LIST_END(head))\
+ (head)->lh_first->field.le_prev = &(elm)->field.le_next;\
+ (head)->lh_first = (elm); \
+ (elm)->field.le_prev = &(head)->lh_first; \
+} while (/*CONSTCOND*/0)
+
+#define LIST_REMOVE(elm, field) do { \
+ QUEUEDEBUG_LIST_OP((elm), field) \
+ if ((elm)->field.le_next != NULL) \
+ (elm)->field.le_next->field.le_prev = \
+ (elm)->field.le_prev; \
+ *(elm)->field.le_prev = (elm)->field.le_next; \
+ QUEUEDEBUG_LIST_POSTREMOVE((elm), field) \
+} while (/*CONSTCOND*/0)
+
+#define LIST_REPLACE(elm, elm2, field) do { \
+ if (((elm2)->field.le_next = (elm)->field.le_next) != NULL) \
+ (elm2)->field.le_next->field.le_prev = \
+ &(elm2)->field.le_next; \
+ (elm2)->field.le_prev = (elm)->field.le_prev; \
+ *(elm2)->field.le_prev = (elm2); \
+ QUEUEDEBUG_LIST_POSTREMOVE((elm), field) \
+} while (/*CONSTCOND*/0)
+
+/*
+ * Simple queue definitions.
+ */
+#define SIMPLEQ_HEAD(name, type) \
+struct name { \
+ struct type *sqh_first; /* first element */ \
+ struct type **sqh_last; /* addr of last next element */ \
+}
+
+#define SIMPLEQ_HEAD_INITIALIZER(head) \
+ { NULL, &(head).sqh_first }
+
+#define SIMPLEQ_ENTRY(type) \
+struct { \
+ struct type *sqe_next; /* next element */ \
+}
+
+/*
+ * Simple queue access methods.
+ */
+#define SIMPLEQ_FIRST(head) ((head)->sqh_first)
+#define SIMPLEQ_END(head) NULL
+#define SIMPLEQ_EMPTY(head) ((head)->sqh_first == SIMPLEQ_END(head))
+#define SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next)
+
+#define SIMPLEQ_FOREACH(var, head, field) \
+ for ((var) = ((head)->sqh_first); \
+ (var) != SIMPLEQ_END(head); \
+ (var) = ((var)->field.sqe_next))
+
+#define SIMPLEQ_FOREACH_SAFE(var, head, field, next) \
+ for ((var) = ((head)->sqh_first); \
+ (var) != SIMPLEQ_END(head) && \
+ ((next = ((var)->field.sqe_next)), 1); \
+ (var) = (next))
+
+/*
+ * Simple queue functions.
+ */
+#define SIMPLEQ_INIT(head) do { \
+ (head)->sqh_first = NULL; \
+ (head)->sqh_last = &(head)->sqh_first; \
+} while (/*CONSTCOND*/0)
+
+#define SIMPLEQ_INSERT_HEAD(head, elm, field) do { \
+ if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \
+ (head)->sqh_last = &(elm)->field.sqe_next; \
+ (head)->sqh_first = (elm); \
+} while (/*CONSTCOND*/0)
+
+#define SIMPLEQ_INSERT_TAIL(head, elm, field) do { \
+ (elm)->field.sqe_next = NULL; \
+ *(head)->sqh_last = (elm); \
+ (head)->sqh_last = &(elm)->field.sqe_next; \
+} while (/*CONSTCOND*/0)
+
+#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \
+ if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\
+ (head)->sqh_last = &(elm)->field.sqe_next; \
+ (listelm)->field.sqe_next = (elm); \
+} while (/*CONSTCOND*/0)
+
+#define SIMPLEQ_REMOVE_HEAD(head, field) do { \
+ if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \
+ (head)->sqh_last = &(head)->sqh_first; \
+} while (/*CONSTCOND*/0)
+
+#define SIMPLEQ_REMOVE_AFTER(head, elm, field) do { \
+ if (((elm)->field.sqe_next = (elm)->field.sqe_next->field.sqe_next) \
+ == NULL) \
+ (head)->sqh_last = &(elm)->field.sqe_next; \
+} while (/*CONSTCOND*/0)
+
+#define SIMPLEQ_REMOVE(head, elm, type, field) do { \
+ if ((head)->sqh_first == (elm)) { \
+ SIMPLEQ_REMOVE_HEAD((head), field); \
+ } else { \
+ struct type *curelm = (head)->sqh_first; \
+ while (curelm->field.sqe_next != (elm)) \
+ curelm = curelm->field.sqe_next; \
+ if ((curelm->field.sqe_next = \
+ curelm->field.sqe_next->field.sqe_next) == NULL) \
+ (head)->sqh_last = &(curelm)->field.sqe_next; \
+ } \
+} while (/*CONSTCOND*/0)
+
+#define SIMPLEQ_CONCAT(head1, head2) do { \
+ if (!SIMPLEQ_EMPTY((head2))) { \
+ *(head1)->sqh_last = (head2)->sqh_first; \
+ (head1)->sqh_last = (head2)->sqh_last; \
+ SIMPLEQ_INIT((head2)); \
+ } \
+} while (/*CONSTCOND*/0)
+
+#define SIMPLEQ_LAST(head, type, field) \
+ (SIMPLEQ_EMPTY((head)) ? \
+ NULL : \
+ ((struct type *)(void *) \
+ ((char *)((head)->sqh_last) - offsetof(struct type, field))))
+
+/*
+ * Tail queue definitions.
+ */
+#define _TAILQ_HEAD(name, type, qual) \
+struct name { \
+ qual type *tqh_first; /* first element */ \
+ qual type *qual *tqh_last; /* addr of last next element */ \
+}
+#define TAILQ_HEAD(name, type) _TAILQ_HEAD(name, struct type,)
+
+#define TAILQ_HEAD_INITIALIZER(head) \
+ { TAILQ_END(head), &(head).tqh_first }
+
+#define _TAILQ_ENTRY(type, qual) \
+struct { \
+ qual type *tqe_next; /* next element */ \
+ qual type *qual *tqe_prev; /* address of previous next element */\
+}
+#define TAILQ_ENTRY(type) _TAILQ_ENTRY(struct type,)
+
+/*
+ * Tail queue access methods.
+ */
+#define TAILQ_FIRST(head) ((head)->tqh_first)
+#define TAILQ_END(head) (NULL)
+#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next)
+#define TAILQ_LAST(head, headname) \
+ (*(((struct headname *)((head)->tqh_last))->tqh_last))
+#define TAILQ_PREV(elm, headname, field) \
+ (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
+#define TAILQ_EMPTY(head) (TAILQ_FIRST(head) == TAILQ_END(head))
+
+
+#define TAILQ_FOREACH(var, head, field) \
+ for ((var) = ((head)->tqh_first); \
+ (var) != TAILQ_END(head); \
+ (var) = ((var)->field.tqe_next))
+
+#define TAILQ_FOREACH_SAFE(var, head, field, next) \
+ for ((var) = ((head)->tqh_first); \
+ (var) != TAILQ_END(head) && \
+ ((next) = TAILQ_NEXT(var, field), 1); (var) = (next))
+
+#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \
+ for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last));\
+ (var) != TAILQ_END(head); \
+ (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last)))
+
+#define TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, prev) \
+ for ((var) = TAILQ_LAST((head), headname); \
+ (var) != TAILQ_END(head) && \
+ ((prev) = TAILQ_PREV((var), headname, field), 1); (var) = (prev))
+
+/*
+ * Tail queue functions.
+ */
+#if defined(QUEUEDEBUG)
+#define QUEUEDEBUG_TAILQ_INSERT_HEAD(head, elm, field) \
+ if ((head)->tqh_first && \
+ (head)->tqh_first->field.tqe_prev != &(head)->tqh_first) \
+ QUEUEDEBUG_ABORT("TAILQ_INSERT_HEAD %p %s:%d", (head), \
+ __FILE__, __LINE__);
+#define QUEUEDEBUG_TAILQ_INSERT_TAIL(head, elm, field) \
+ if (*(head)->tqh_last != NULL) \
+ QUEUEDEBUG_ABORT("TAILQ_INSERT_TAIL %p %s:%d", (head), \
+ __FILE__, __LINE__);
+#define QUEUEDEBUG_TAILQ_OP(elm, field) \
+ if ((elm)->field.tqe_next && \
+ (elm)->field.tqe_next->field.tqe_prev != \
+ &(elm)->field.tqe_next) \
+ QUEUEDEBUG_ABORT("TAILQ_* forw %p %s:%d", (elm), \
+ __FILE__, __LINE__); \
+ if (*(elm)->field.tqe_prev != (elm)) \
+ QUEUEDEBUG_ABORT("TAILQ_* back %p %s:%d", (elm), \
+ __FILE__, __LINE__);
+#define QUEUEDEBUG_TAILQ_PREREMOVE(head, elm, field) \
+ if ((elm)->field.tqe_next == NULL && \
+ (head)->tqh_last != &(elm)->field.tqe_next) \
+ QUEUEDEBUG_ABORT("TAILQ_PREREMOVE head %p elm %p %s:%d",\
+ (head), (elm), __FILE__, __LINE__);
+#define QUEUEDEBUG_TAILQ_POSTREMOVE(elm, field) \
+ (elm)->field.tqe_next = (void *)1L; \
+ (elm)->field.tqe_prev = (void *)1L;
+#else
+#define QUEUEDEBUG_TAILQ_INSERT_HEAD(head, elm, field)
+#define QUEUEDEBUG_TAILQ_INSERT_TAIL(head, elm, field)
+#define QUEUEDEBUG_TAILQ_OP(elm, field)
+#define QUEUEDEBUG_TAILQ_PREREMOVE(head, elm, field)
+#define QUEUEDEBUG_TAILQ_POSTREMOVE(elm, field)
+#endif
+
+#define TAILQ_INIT(head) do { \
+ (head)->tqh_first = TAILQ_END(head); \
+ (head)->tqh_last = &(head)->tqh_first; \
+} while (/*CONSTCOND*/0)
+
+#define TAILQ_INSERT_HEAD(head, elm, field) do { \
+ QUEUEDEBUG_TAILQ_INSERT_HEAD((head), (elm), field) \
+ if (((elm)->field.tqe_next = (head)->tqh_first) != TAILQ_END(head))\
+ (head)->tqh_first->field.tqe_prev = \
+ &(elm)->field.tqe_next; \
+ else \
+ (head)->tqh_last = &(elm)->field.tqe_next; \
+ (head)->tqh_first = (elm); \
+ (elm)->field.tqe_prev = &(head)->tqh_first; \
+} while (/*CONSTCOND*/0)
+
+#define TAILQ_INSERT_TAIL(head, elm, field) do { \
+ QUEUEDEBUG_TAILQ_INSERT_TAIL((head), (elm), field) \
+ (elm)->field.tqe_next = TAILQ_END(head); \
+ (elm)->field.tqe_prev = (head)->tqh_last; \
+ *(head)->tqh_last = (elm); \
+ (head)->tqh_last = &(elm)->field.tqe_next; \
+} while (/*CONSTCOND*/0)
+
+#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \
+ QUEUEDEBUG_TAILQ_OP((listelm), field) \
+ if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != \
+ TAILQ_END(head)) \
+ (elm)->field.tqe_next->field.tqe_prev = \
+ &(elm)->field.tqe_next; \
+ else \
+ (head)->tqh_last = &(elm)->field.tqe_next; \
+ (listelm)->field.tqe_next = (elm); \
+ (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \
+} while (/*CONSTCOND*/0)
+
+#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \
+ QUEUEDEBUG_TAILQ_OP((listelm), field) \
+ (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \
+ (elm)->field.tqe_next = (listelm); \
+ *(listelm)->field.tqe_prev = (elm); \
+ (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \
+} while (/*CONSTCOND*/0)
+
+#define TAILQ_REMOVE(head, elm, field) do { \
+ QUEUEDEBUG_TAILQ_PREREMOVE((head), (elm), field) \
+ QUEUEDEBUG_TAILQ_OP((elm), field) \
+ if (((elm)->field.tqe_next) != TAILQ_END(head)) \
+ (elm)->field.tqe_next->field.tqe_prev = \
+ (elm)->field.tqe_prev; \
+ else \
+ (head)->tqh_last = (elm)->field.tqe_prev; \
+ *(elm)->field.tqe_prev = (elm)->field.tqe_next; \
+ QUEUEDEBUG_TAILQ_POSTREMOVE((elm), field); \
+} while (/*CONSTCOND*/0)
+
+#define TAILQ_REPLACE(head, elm, elm2, field) do { \
+ if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != \
+ TAILQ_END(head)) \
+ (elm2)->field.tqe_next->field.tqe_prev = \
+ &(elm2)->field.tqe_next; \
+ else \
+ (head)->tqh_last = &(elm2)->field.tqe_next; \
+ (elm2)->field.tqe_prev = (elm)->field.tqe_prev; \
+ *(elm2)->field.tqe_prev = (elm2); \
+ QUEUEDEBUG_TAILQ_POSTREMOVE((elm), field); \
+} while (/*CONSTCOND*/0)
+
+#define TAILQ_CONCAT(head1, head2, field) do { \
+ if (!TAILQ_EMPTY(head2)) { \
+ *(head1)->tqh_last = (head2)->tqh_first; \
+ (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \
+ (head1)->tqh_last = (head2)->tqh_last; \
+ TAILQ_INIT((head2)); \
+ } \
+} while (/*CONSTCOND*/0)
+
+/*
+ * Singly-linked Tail queue declarations.
+ */
+#define STAILQ_HEAD(name, type) \
+struct name { \
+ struct type *stqh_first; /* first element */ \
+ struct type **stqh_last; /* addr of last next element */ \
+}
+
+#define STAILQ_HEAD_INITIALIZER(head) \
+ { NULL, &(head).stqh_first }
+
+#define STAILQ_ENTRY(type) \
+struct { \
+ struct type *stqe_next; /* next element */ \
+}
+
+/*
+ * Singly-linked Tail queue access methods.
+ */
+#define STAILQ_FIRST(head) ((head)->stqh_first)
+#define STAILQ_END(head) NULL
+#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next)
+#define STAILQ_EMPTY(head) (STAILQ_FIRST(head) == STAILQ_END(head))
+
+/*
+ * Singly-linked Tail queue functions.
+ */
+#define STAILQ_INIT(head) do { \
+ (head)->stqh_first = NULL; \
+ (head)->stqh_last = &(head)->stqh_first; \
+} while (/*CONSTCOND*/0)
+
+#define STAILQ_INSERT_HEAD(head, elm, field) do { \
+ if (((elm)->field.stqe_next = (head)->stqh_first) == NULL) \
+ (head)->stqh_last = &(elm)->field.stqe_next; \
+ (head)->stqh_first = (elm); \
+} while (/*CONSTCOND*/0)
+
+#define STAILQ_INSERT_TAIL(head, elm, field) do { \
+ (elm)->field.stqe_next = NULL; \
+ *(head)->stqh_last = (elm); \
+ (head)->stqh_last = &(elm)->field.stqe_next; \
+} while (/*CONSTCOND*/0)
+
+#define STAILQ_INSERT_AFTER(head, listelm, elm, field) do { \
+ if (((elm)->field.stqe_next = (listelm)->field.stqe_next) == NULL)\
+ (head)->stqh_last = &(elm)->field.stqe_next; \
+ (listelm)->field.stqe_next = (elm); \
+} while (/*CONSTCOND*/0)
+
+#define STAILQ_REMOVE_HEAD(head, field) do { \
+ if (((head)->stqh_first = (head)->stqh_first->field.stqe_next) == NULL) \
+ (head)->stqh_last = &(head)->stqh_first; \
+} while (/*CONSTCOND*/0)
+
+#define STAILQ_REMOVE(head, elm, type, field) do { \
+ if ((head)->stqh_first == (elm)) { \
+ STAILQ_REMOVE_HEAD((head), field); \
+ } else { \
+ struct type *curelm = (head)->stqh_first; \
+ while (curelm->field.stqe_next != (elm)) \
+ curelm = curelm->field.stqe_next; \
+ if ((curelm->field.stqe_next = \
+ curelm->field.stqe_next->field.stqe_next) == NULL) \
+ (head)->stqh_last = &(curelm)->field.stqe_next; \
+ } \
+} while (/*CONSTCOND*/0)
+
+#define STAILQ_FOREACH(var, head, field) \
+ for ((var) = ((head)->stqh_first); \
+ (var); \
+ (var) = ((var)->field.stqe_next))
+
+#define STAILQ_FOREACH_SAFE(var, head, field, tvar) \
+ for ((var) = STAILQ_FIRST((head)); \
+ (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \
+ (var) = (tvar))
+
+#define STAILQ_CONCAT(head1, head2) do { \
+ if (!STAILQ_EMPTY((head2))) { \
+ *(head1)->stqh_last = (head2)->stqh_first; \
+ (head1)->stqh_last = (head2)->stqh_last; \
+ STAILQ_INIT((head2)); \
+ } \
+} while (/*CONSTCOND*/0)
+
+#define STAILQ_LAST(head, type, field) \
+ (STAILQ_EMPTY((head)) ? \
+ NULL : \
+ ((struct type *)(void *) \
+ ((char *)((head)->stqh_last) - offsetof(struct type, field))))
+
+#endif /* !_QUEUE_H_ */
diff --git a/utils/textclient-mobile.c b/utils/textclient-mobile.c
index 4d0d891..8745cb0 100644
--- a/utils/textclient-mobile.c
+++ b/utils/textclient-mobile.c
@@ -16,7 +16,7 @@
#include "utils.h"
-#if defined(USE_IPHONE) || defined(HAVE_ANDROID) /* whole file */
+#if defined(HAVE_IPHONE) || defined(HAVE_ANDROID) /* whole file */
#include "textclient.h"
#include "resources.h"
diff --git a/utils/textclient.c b/utils/textclient.c
index fe40928..4a4c895 100644
--- a/utils/textclient.c
+++ b/utils/textclient.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2012-2016 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 2012-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -22,7 +22,7 @@
#include "utils.h"
-#if !defined(USE_IPHONE) && !defined(HAVE_ANDROID) /* whole file */
+#if !defined(HAVE_IPHONE) && !defined(HAVE_ANDROID) /* whole file */
#include "textclient.h"
#include "resources.h"
@@ -117,6 +117,72 @@ escape_str (char *s, const char *src)
}
#endif
+
+/* Let's see if we're able to fork and exec at all. Thanks, macOS.
+ */
+static Bool
+selftest (void)
+{
+ static Bool done = False;
+ pid_t pid;
+ char buf [255];
+ if (done) return True;
+
+ pid = fork ();
+ switch ((int) pid)
+ {
+ case -1:
+ sprintf (buf, "%s: textclient: selftest: couldn't fork", progname);
+ perror (buf);
+ return False;
+
+ case 0: /* child */
+ {
+ char * const av[] = { "/bin/sh", "-c", "true", 0 };
+ execvp (av[0], av);
+ exit (1); /* exits child fork */
+ break;
+ }
+
+ default: /* parent */
+ {
+ int status = -1;
+ int i;
+ /* Busy-loops are bad mmmmkayyyy */
+ struct timeval tv;
+ tv.tv_sec = 0;
+ tv.tv_usec = 100000L; /* 0.1 sec */
+ for (i = 0; i < 50; i++) { /* 5 sec max */
+ pid_t pid2 = waitpid (pid, &status, 0);
+ if (pid == pid2) break;
+ (void) select (0, 0, 0, 0, &tv);
+ }
+
+ if (status != 0)
+ {
+# ifdef DEBUG
+ fprintf (stderr, "%s: selftest: textclient: status %d\n",
+ progname, status);
+# endif
+ return False;
+ }
+ else
+ {
+# ifdef DEBUG
+ fprintf (stderr, "%s: textclient: selftest ok\n", progname);
+# endif
+ done = True;
+ }
+ break;
+ }
+ }
+
+ return True;
+}
+
+
+static void start_timer (text_data *d);
+
static void
launch_text_generator (text_data *d)
{
@@ -142,6 +208,15 @@ launch_text_generator (text_data *d)
char *cmd = s = malloc ((strlen(oprogram)) * 2 + 100);
# endif
+ if (!selftest())
+ {
+ if (!d->out_buffer || !*d->out_buffer)
+ d->out_buffer = "Can't exec; Gatekeeper problem?\r\n\r\n";
+ start_timer (d);
+ free (cmd);
+ return;
+ }
+
strcpy (s, "( ");
strcat (s, oprogram);
s += strlen (s);
@@ -204,26 +279,39 @@ launch_text_generator (text_data *d)
free (text_mode);
}
- strcpy (s, text_mode_flag);
- s += strlen (s);
-
- if (value_res)
+ /* If the 'program' resource already has a text-mode option in it,
+ don't override that! 'gltext' does this. */
+ if (! (strstr (cmd, " --date") ||
+ strstr (cmd, " --text") ||
+ strstr (cmd, " --file") ||
+ strstr (cmd, " --url") ||
+ strstr (cmd, " --program")))
{
- size_t old_s = s - cmd;
- char *value = get_string_resource (d->dpy, value_res, "");
- if (!value)
- value = strdup("");
- cmd = realloc(cmd, cmd_capacity + strlen(value) * 2);
- s = cmd + old_s;
- *s = ' ';
- ++s;
- s = escape_str(s, value);
- free(value);
+ strcpy (s, text_mode_flag);
+ s += strlen (s);
+
+ if (value_res)
+ {
+ size_t old_s = s - cmd;
+ char *value = get_string_resource (d->dpy, value_res, "");
+ if (!value)
+ value = strdup("");
+ cmd = realloc(cmd, cmd_capacity + strlen(value) * 2);
+ s = cmd + old_s;
+ *s = ' ';
+ ++s;
+ s = escape_str(s, value);
+ free(value);
+ }
}
# endif /* HAVE_COCOA */
}
+# if 1
strcpy (s, " ) 2>&1");
+# else
+ strcpy (s, " )");
+# endif
# ifdef DEBUG
fprintf (stderr, "%s: textclient: launch %s: %s\n", progname,
@@ -477,6 +565,13 @@ textclient_open (Display *dpy)
d->program = get_string_resource (dpy, "program", "Program");
+ /* Just in case the resource is blank, e.g. gltext. */
+ if (!d->program || !*d->program || !strcmp(d->program, "(default)"))
+ {
+ if (d->program) free (d->program);
+ d->program = strdup ("xscreensaver-text");
+ }
+
# ifdef HAVE_FORKPTY
/* Kludge for MacOS standalone mode: see OSX/SaverRunner.m. */
@@ -670,4 +765,4 @@ textclient_putc (text_data *d, XKeyEvent *k)
return False;
}
-#endif /* !USE_IPHONE -- whole file */
+#endif /* !HAVE_IPHONE -- whole file */
diff --git a/utils/textclient.h b/utils/textclient.h
index 0fe582d..5be8079 100644
--- a/utils/textclient.h
+++ b/utils/textclient.h
@@ -14,7 +14,7 @@
#ifndef __TEXTCLIENT_H__
#define __TEXTCLIENT_H__
-# ifdef USE_IPHONE
+# ifdef HAVE_IPHONE
# undef HAVE_FORKPTY
# endif
@@ -29,7 +29,7 @@ extern void textclient_reshape (text_data *,
extern int textclient_getc (text_data *);
extern Bool textclient_putc (text_data *, XKeyEvent *);
-# if defined(USE_IPHONE) || defined(HAVE_ANDROID)
+# if defined(HAVE_IPHONE) || defined(HAVE_ANDROID)
extern char *textclient_mobile_date_string (void);
extern char *textclient_mobile_url_string (Display *, const char *url);
# endif
diff --git a/utils/thread_util.c b/utils/thread_util.c
index 71c8633..7d7fd10 100644
--- a/utils/thread_util.c
+++ b/utils/thread_util.c
@@ -28,13 +28,8 @@ implied warranty.
# include <alloca.h>
#endif
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
#if defined __MACH__ && defined __APPLE__ /* OS X, iOS */
# include <sys/sysctl.h>
-# include <inttypes.h>
#endif
#include "thread_util.h"
@@ -42,238 +37,12 @@ implied warranty.
#include "aligned_malloc.h"
#include "resources.h"
-#define IS_POWER_OF_2(x) ((x) > 0 && !((x) & ((x) - 1)))
-
-/*
- arraysize(a). Also known as countof(x), XtNumber(x), NELEMS(x), LEN(x),
- NUMOF(x), ARRAY_SIZE(x), etc., since the fine folks behind C never got
- around to including this incredibly useful macro in the standard library,
- which is where it belongs.
-
- Much of the code here assumes that multiple processors in a system all use
- the same cache line size...which might be wrong on occasion.
-*/
-
-#define arraysize(a) (sizeof(a) / sizeof(*(a)))
-#define arrayend(a) ((a) + arraysize(a))
-
-/*
-These numbers are from:
-- Linux: arch/(arch name)/include/asm/cache.h, note
- L1_CACHE_BYTES/L1_CACHE_SHIFT/SMP_CACHE_BYTES.
-- FreeBSD: sys/(sys name)/include/param.h, note
- CACHE_LINE_SHIFT/CACHE_LINE_SIZE.
-
-Preprocessor symbols come from:
-- TARGET_CPU_CPP_BUILTINS() in the GNU C preprocessor
- <http://code.ohloh.net/?s=%22TARGET_CPU_CPP_BUILTINS%22&fp=304413>
-- http://predef.sourceforge.net/
-*/
-
-/*
-Several architectures need preprocessor symbols.
-
-Qualcomm Hexagon: 1 << 5
-Imagination Technologies META: 1 << 6
-OpenRISC: 16 (Linux has the cache line size as a todo.)
-Unicore: 1 << 5
-*/
-
#if HAVE_PTHREAD
# if !HAVE_UNISTD_H
# error unistd.h must be present whenever pthread.h is.
# endif
-# if defined __MACH__ && defined __APPLE__ /* OS X, iOS */
-# include <TargetConditionals.h> /* For TARGET_OS_IPHONE. */
-# ifdef TARGET_OS_IPHONE
-# define _CACHE_LINE_SIZE 64
-# endif
-# endif
-
-# if defined __FreeBSD__ && !defined _CACHE_LINE_SIZE
-# include <machine/param.h>
-# ifdef CACHE_LINE_SIZE
-# define _CACHE_LINE_SIZE CACHE_LINE_SIZE
-# endif
-# endif
-
-# if !defined _CACHE_LINE_SIZE
-# if defined __alpha || defined __alpha__
-/* DEC Alpha */
-# define _CACHE_LINE_SIZE 64 /* EV6 and above. EV4 and EV5 use 32 bytes. */
-# elif defined __arm__
-/* ARM architecture */
-# define _CACHE_LINE_SIZE (1 << 6)
-# elif defined __AVR || defined __AVR__
-/* Atmel AVR32 */
-# define _CACHE_LINE_SIZE (1 << 5)
-# elif defined __bfin || defined __BFIN__
-/* Analog Devices Blackfin */
-# define _CACHE_LINE_SIZE (1 << 5)
-# elif defined _TMS320C6X || defined __TMS320C6X__
-/* Texas Instruments TMS320C6x */
-# define _CACHE_LINE_SIZE (1 << 7) /* From L2. L1 data cache line is 1 << 6. */
-# elif defined __cris
-/* Axis Communications ETRAX CRIS */
-# define _CACHE_LINE_SIZE 32
-# elif defined __ia64__ || defined _IA64
-/* Intel Itanium */
-# define _CACHE_LINE_SIZE (1 << 7)
-# elif defined __M32R__ || defined __m32r__
-/* Mitsubishi/Renesas M32R */
-# define _CACHE_LINE_SIZE (1 << 4)
-# elif defined __m68k__ || defined M68000 || defined __MC68K__
-/* Motorola 68000 */
-# define _CACHE_LINE_SIZE (1 << 4)
-# elif defined __MICROBLAZE__ || defined __microblaze__
-/* Xilinx MicroBlaze */
-# define _CACHE_LINE_SIZE (1 << 5)
-# elif defined __mips__ || defined __mips || defined __MIPS__
-/* MIPS */
-# define _CACHE_LINE_SIZE (1 << 6)
-# elif defined __mn10300__ || defined __MN10300__
-/* Matsushita/Panasonic MN103 */
-# define _CACHE_LINE_SIZE 32 /* MN103E010 has 16 bytes. */
-# elif defined __hppa || defined __hppa__
-/* Hewlett-Packard PA-RISC */
-# define _CACHE_LINE_SIZE 64 /* PA-RISC 2.0 uses 64 bytes, PA-RISC 1.1 uses 32. */
-# elif defined __powerpc || defined _ARCH_PPC
-/* Power Architecture (a.k.a. PowerPC) */
-# define _CACHE_LINE_SIZE (1 << 7) /* Linux has a list of PPC models with associated L1_CACHE_SHIFT values. */
-# elif defined __s390__ || defined __370__ || defined __zarch__ || defined __SYSC_ZARCH__
-/* IBM System/390 */
-# define _CACHE_LINE_SIZE 256
-# elif defined SUNPLUS || defined __SCORE__ || defined __score__
-/* Sunplus S+core */
-# define _CACHE_LINE_SIZE (1 << 4)
-# elif defined __sh__
-/* Hitachi SuperH */
-# define _CACHE_LINE_SIZE (1 << 5) /* SH3 and earlier used 1 << 4. */
-# elif defined __sparc__ || defined __sparc
-/* SPARC */
-# define _CACHE_LINE_SIZE (1 << 7) /* Linux and FreeBSD disagree as to what this should be. */
-# elif defined __tile__
-/* Tilera TILE series */
-# define _CACHE_LINE_SIZE (1 << 6) /* TILEPro uses different sizes for L1 and L2. */
-# elif defined __i386 || defined __x86_64
-/* x86(-64) */
-# define _CACHE_LINE_SIZE (1 << 7)
-# elif defined __xtensa__ || defined __XTENSA__
-/* Cadence Design Systems/Tensilica Xtensa */
-# define _CACHE_LINE_SIZE (1 << 5) /* 1 << 4 on some models. */
-# endif
-# endif /* !defined _CACHE_LINE_SIZE */
-
-# if defined __NetBSD__ && !defined _CACHE_LINE_SIZE
-/*
-NetBSD defines COHERENCY_UNIT to be 32 on MIPS, and 64 for all other platforms -- which is wrong. Still, this is what the kernel
-uses; if this value didn't work, the system wouldn't run.
-*/
-# include <sys/param.h>
-# ifdef COHERENCY_UNIT
-# define _CACHE_LINE_SIZE COHERENCY_UNIT
-# endif
-# endif
-
-# ifndef _CACHE_LINE_SIZE
-# define _CACHE_LINE_SIZE 256 /* Fallback cache line size. */
-# endif
-
-static unsigned _get_cache_line_size(void)
-{
- /*
- The general idea:
- - Try to get the actual cache line size from the operating system.
- - In the interest of keeping things simple, this only checks with
- glibc and OS X.
- - A few other methods that could be added:
- - Query x86 CPUs directly with the CPUID instruction.
- - Query various ELF systems through the auxillary vector.
- (Power, Alpha, SuperH)
- - Query Linux through
- /sys/devices/system/cpu/cpu?/cache/index?/coherency_line_size
- (x86 only, AFAIK)
- - Query Linux through cache_alignment in /proc/cpuinfo
- - Query Solaris through PICL.
- - If that fails, return a value appropriate for the current CPU
- architecture.
- - Otherwise, return a sufficiently large number.
- */
-
- /*
- sysconf(3) is not a syscall, it's a glibc call that, for cache line sizes,
- uses CPUID on x86 and returns 0 on other platforms. If it were to work on
- most other platforms, it would have to get cache information from the
- kernel, since that information is usually made available by the processor
- only in privileged mode.
- https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/i386/sysconf.c;hb=HEAD
- */
-
- /* uClibc, newlib, dietlibc, musl, Bionic do not have this. */
-
-# if HAVE_UNISTD_H && ( \
- defined _SC_LEVEL1_DCACHE_LINESIZE || \
- defined _SC_LEVEL2_CACHE_LINESIZE || \
- defined _SC_LEVEL3_CACHE_LINESIZE || \
- defined _SC_LEVEL4_CACHE_LINESIZE)
- {
- static const int names[] =
- {
-# ifdef _SC_LEVEL1_DCACHE_LINESIZE
- _SC_LEVEL1_DCACHE_LINESIZE,
-# endif
-# ifdef _SC_LEVEL2_CACHE_LINESIZE
- _SC_LEVEL2_CACHE_LINESIZE,
-# endif
-# ifdef _SC_LEVEL3_CACHE_LINESIZE
- _SC_LEVEL3_CACHE_LINESIZE,
-# endif
-# ifdef _SC_LEVEL4_CACHE_LINESIZE
- _SC_LEVEL4_CACHE_LINESIZE
-# endif
- };
-
- const int *name;
- long result = 0;
-
- for(name = names; name != arrayend(names); ++name)
- {
- long sysconf_result = sysconf(*name); /* Can return -1 or 0 on
- failure. */
-
- if(sysconf_result > result)
- result = sysconf_result;
- }
-
- if(result)
- return result;
-
- /* Currently, this fails for every platform that isn't x86. Perhaps
- future versions will support other processors? */
- }
-# endif
-
-# if defined __MACH__ && defined __APPLE__
- {
- uint32_t result; /* sysctl.h says that hw.cachelinesize is a
- CTLTYPE_INT. */
- size_t size = sizeof(result);
- static const int name[] = {CTL_HW, HW_CACHELINE};
-
- if(!sysctl((int *)name, 2, &result, &size, NULL, 0)) /* (int *) is for OS X. */
- {
- assert(size == sizeof(result));
- return result;
- };
- }
-# endif
-
- /* Guess based on the CPU type. */
- return _CACHE_LINE_SIZE;
-}
-
const pthread_mutex_t mutex_initializer =
# if defined _GNU_SOURCE && !defined NDEBUG
PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
@@ -304,15 +73,9 @@ int threads_available(Display *dpy)
if(_has_pthread >= 0)
{
if(get_boolean_resource(dpy, "useThreads", "Boolean"))
- {
- _cache_line_size = _get_cache_line_size();
- assert(_cache_line_size >= sizeof(void *));
- assert(IS_POWER_OF_2(_cache_line_size));
- }
+ _cache_line_size = get_cache_line_size();
else
- {
_has_pthread = -1;
- }
}
}
diff --git a/utils/thread_util.h b/utils/thread_util.h
index 6dff8de..a8faf2d 100644
--- a/utils/thread_util.h
+++ b/utils/thread_util.h
@@ -161,7 +161,7 @@ unsigned thread_memory_alignment(Display *dpy);
/* int thread_malloc(void **ptr, Display *dpy, unsigned size); */
#define thread_malloc(ptr, dpy, size) \
- (aligned_malloc((ptr), thread_memory_alignment(dpy), (size)))
+ (aligned_malloc((ptr), 0, (size)))
/*
This simply does a malloc aligned to thread_memory_alignment(). See
diff --git a/utils/usleep.h b/utils/usleep.h
index 3225d66..f32a9c9 100644
--- a/utils/usleep.h
+++ b/utils/usleep.h
@@ -12,10 +12,6 @@
#ifndef __SCREENHACK_USLEEP_H__
#define __SCREENHACK_USLEEP_H__
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
diff --git a/utils/utf8wc.c b/utils/utf8wc.c
index c948f22..b445f30 100644
--- a/utils/utf8wc.c
+++ b/utils/utf8wc.c
@@ -266,7 +266,7 @@ utf8_split (const char *string, int *length_ret)
unsigned long uc;
long len2 = utf8_decode (in, len, &uc);
char tmp[10];
- strncpy (tmp, (char *) in, len2);
+ memcpy (tmp, (char *) in, len2);
tmp[len2] = 0;
ret[i++] = strdup (tmp);
in += len2;
@@ -299,8 +299,8 @@ utf8_split (const char *string, int *length_ret)
long L1 = strlen(ret[i-2]);
long L2 = strlen(ret[i-1]);
char *s2 = (char *) malloc (L1 + L2 + 1);
- strncpy (s2, ret[i-2], L1);
- strncpy (s2 + L1, ret[i-1], L2);
+ memcpy (s2, ret[i-2], L1);
+ memcpy (s2 + L1, ret[i-1], L2);
s2[L1 + L2] = 0;
free (ret[i-2]);
ret[i-2] = s2;
diff --git a/utils/version.h b/utils/version.h
index 7a20c66..8e38585 100644
--- a/utils/version.h
+++ b/utils/version.h
@@ -1,2 +1,4 @@
static const char screensaver_id[] =
- "@(#)xscreensaver 5.44 (20-Mar-2020), by Jamie Zawinski (jwz@jwz.org)";
+ "@(#)xscreensaver 6.00 (01-Apr-2021), by Jamie Zawinski (jwz@jwz.org)";
+#define XSCREENSAVER_VERSION "6.00"
+#define XSCREENSAVER_RELEASED 1617303600
diff --git a/utils/visual-gl.c b/utils/visual-gl.c
index c4b940b..cca4ecf 100644
--- a/utils/visual-gl.c
+++ b/utils/visual-gl.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1999-2018 by Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 1999-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -21,21 +21,78 @@
*/
#include "utils.h"
-#include "visual.h"
#include "resources.h"
#ifdef HAVE_GL
# include <GL/gl.h>
-# include <GL/glx.h>
+# ifdef HAVE_EGL
+# include <EGL/egl.h>
+# include <EGL/eglext.h>
+# else
+# include <GL/glx.h>
+# endif
#endif /* HAVE_GL */
+#include "visual.h" /* after EGL/egl.h */
+
+#undef countof
+#define countof(x) (sizeof(x)/sizeof(*(x)))
+
+
extern char *progname;
+
Visual *
get_gl_visual (Screen *screen)
{
#ifdef HAVE_GL
+
Display *dpy = DisplayOfScreen (screen);
+
+# ifdef HAVE_EGL
+
+ Visual *v;
+ EGLint vid;
+ EGLDisplay *egl_display;
+ EGLConfig egl_config = 0;
+ int egl_major = -1, egl_minor = -1;
+
+ /* This is re-used, no need to close it. */
+ egl_display = eglGetDisplay ((EGLNativeDisplayType) dpy);
+ if (!egl_display)
+ {
+ fprintf (stderr, "%s: eglGetDisplay failed\n", progname);
+ return 0;
+ }
+
+ if (! eglInitialize (egl_display, &egl_major, &egl_minor))
+ {
+ fprintf (stderr, "%s: eglInitialize failed\n", progname);
+ abort();
+ }
+
+ /* Get the best EGL config on any visual, then see what visual it used. */
+ get_egl_config (dpy, egl_display, -1, &egl_config);
+ if (!egl_config) abort();
+
+ if (!eglGetConfigAttrib (egl_display, egl_config,
+ EGL_NATIVE_VISUAL_ID, &vid))
+ {
+ fprintf (stderr, "%s: EGL: no native visual ID\n", progname);
+ abort();
+ }
+
+ v = id_to_visual (screen, vid);
+ if (!v)
+ {
+ fprintf (stderr, "%s: EGL: no X11 visual 0x%x\n", progname, vid);
+ abort();
+ }
+
+ return v;
+
+# else /* !HAVE_EGL -- GLX */
+
int screen_num = screen_number (screen);
# define R GLX_RED_SIZE
@@ -61,7 +118,6 @@ get_gl_visual (Screen *screen)
# define SM GL_SAMPLES
# endif
-
int attrs[][40] = {
# ifdef SB /* rgba double stencil multisample */
{ GLX_RGBA, R,8, G,8, B,8, A,8, D,8, DB, ST,1, SB,1, SM,8, 0 },
@@ -107,12 +163,134 @@ get_gl_visual (Screen *screen)
return v;
}
}
+
+# endif /* !HAVE_EGL -- GLX */
#endif /* !HAVE_GL */
return 0;
}
+#ifdef HAVE_EGL
+/* An X11 "visual" is an object that encapsulates the available display
+ formats: color mapping, depth and so on. So is a GLE "config".
+ So why isn't there a one-to-one mapping between visuals and configs?
+ Once again, I can only assume the answer is that the people responsible
+ for every post-2002 version of the OpenGL specification are incompetent.
+
+ Under GLX, there will be multiple X11 visuals that appear (and behave)
+ identically to X11 programs, code but that have different GL parameters.
+ Two RGB visuals might have different alpha, depth, or stencil sizes,
+ for example, that would matter to a GL program but not to an X11 program.
+
+ But EGL has dozens of 'configs' for each visual, so we can't just pass
+ around a Window and a Visual to describe the display parameters: we need
+ to pass around the 'config' as well. Or, do what we do here, have both
+ sides use the same code to convert a visual to the best 'config'.
+ (It goes down a list of parameter settings, from higher quality to lower,
+ and takes the first config that matches.)
+
+ SGI solved this problem in like 1988, and like so many things, GLES went
+ and fucked it all up again.
+ */
+void
+get_egl_config (Display *dpy, EGLDisplay *egl_display,
+ EGLint x11_visual_id, EGLConfig *egl_config)
+{
+# define COMMON \
+ EGL_SURFACE_TYPE, EGL_WINDOW_BIT, \
+ EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER
+# define R EGL_RED_SIZE
+# define G EGL_GREEN_SIZE
+# define B EGL_BLUE_SIZE
+# define A EGL_ALPHA_SIZE
+# define D EGL_DEPTH_SIZE
+# define I EGL_BUFFER_SIZE
+# define ST EGL_STENCIL_SIZE
+# define SB EGL_SAMPLE_BUFFERS
+# define SM EGL_SAMPLES
+
+ const EGLint templates[][40] = {
+# ifdef SB
+ { COMMON, R,8, G,8, B,8, A,8, D,8, ST,1, SB,1, SM,8, EGL_NONE },
+ { COMMON, R,8, G,8, B,8, A,8, D,8, ST,1, SB,1, SM,6, EGL_NONE },
+ { COMMON, R,8, G,8, B,8, A,8, D,8, ST,1, SB,1, SM,4, EGL_NONE },
+ { COMMON, R,8, G,8, B,8, A,8, D,8, ST,1, SB,1, SM,2, EGL_NONE },
+# define SB_COUNT 4 /* #### Kludgey count of preceeding lines! */
+# endif
+ { COMMON, R,8, G,8, B,8, A,8, D,8, ST,1, EGL_NONE }, /* rgba stencil */
+ { COMMON, R,8, G,8, B,8, D,8, ST,1, EGL_NONE }, /* rgb stencil */
+ { COMMON, R,4, G,4, B,4, D,4, ST,1, EGL_NONE },
+ { COMMON, R,2, G,2, B,2, D,2, ST,1, EGL_NONE },
+ { COMMON, R,8, G,8, B,8, A,8, D,8, EGL_NONE }, /* rgba */
+ { COMMON, R,8, G,8, B,8, D,8, EGL_NONE }, /* rgb */
+ { COMMON, R,4, G,4, B,4, D,4, EGL_NONE },
+ { COMMON, R,2, G,2, B,2, D,2, EGL_NONE },
+ { COMMON, R,1, G,1, B,1, D,1, EGL_NONE } /* monochrome */
+ };
+ EGLint attrs[40];
+ EGLint nconfig;
+ int i, j, k, iter, pass;
+ Bool glslp;
+
+ i = 0;
+# ifdef SB
+ if (! get_boolean_resource (dpy, "multiSample", "MultiSample"))
+ i = SB_COUNT; /* skip over the multibuffer entries in 'attrs' */
+# endif /* SB */
+
+ glslp = get_boolean_resource (dpy, "prefersGLSL", "PrefersGLSL");
+ iter = (glslp ? 2 : 1);
+
+ *egl_config = 0;
+ for (pass = 0; pass < iter; pass++)
+ {
+ for (; i < countof(templates); i++)
+ {
+ for (j = 0, k = 0; templates[i][j] != EGL_NONE; j += 2)
+ {
+ attrs[k++] = templates[i][j];
+ attrs[k++] = templates[i][j+1];
+ }
+
+ attrs[k++] = EGL_RENDERABLE_TYPE;
+# ifdef HAVE_GLES3
+ if (glslp && pass == 0)
+ attrs[k++] = EGL_OPENGL_ES3_BIT;
+ else
+ attrs[k++] = EGL_OPENGL_ES_BIT;
+# elif defined(HAVE_JWZGLES)
+ attrs[k++] = EGL_OPENGL_ES_BIT;
+# else
+ attrs[k++] = EGL_OPENGL_BIT;
+# endif
+
+ if (x11_visual_id != -1)
+ {
+ attrs[k++] = EGL_NATIVE_VISUAL_ID;
+ attrs[k++] = x11_visual_id;
+ }
+
+ attrs[k++] = EGL_NONE;
+
+ nconfig = -1;
+ if (eglChooseConfig (egl_display, attrs, egl_config, 1, &nconfig)
+ && nconfig == 1)
+ break;
+ }
+ if (i < countof(templates))
+ break;
+ }
+
+ if (! *egl_config)
+ {
+ fprintf (stderr, "%s: eglChooseConfig: no configs found\n", progname);
+ abort();
+ }
+}
+#endif /* HAVE_EGL */
+
+
void
describe_gl_visual (FILE *f, Screen *screen, Visual *visual,
Bool private_cmap_p)
@@ -121,8 +299,13 @@ describe_gl_visual (FILE *f, Screen *screen, Visual *visual,
#ifdef HAVE_GL
{
+# ifdef HAVE_EGL
+ EGLDisplay *egl_display;
+ EGLConfig config = 0;
+# else /* !HAVE_EGL -- GLX */
int status;
int value = False;
+# endif /* !HAVE_EGL -- GLX */
Display *dpy = DisplayOfScreen (screen);
XVisualInfo vi_in, *vi_out;
@@ -134,6 +317,108 @@ describe_gl_visual (FILE *f, Screen *screen, Visual *visual,
&vi_in, &out_count);
if (! vi_out) abort ();
+# ifdef HAVE_EGL
+
+ /* This is re-used, no need to close it. */
+ egl_display = eglGetPlatformDisplay (EGL_PLATFORM_X11_KHR,
+ (EGLNativeDisplayType) dpy, NULL);
+ if (!egl_display)
+ {
+ fprintf (stderr, "%s: eglGetPlatformDisplay failed\n", progname);
+ return;
+ }
+
+ get_egl_config (dpy, egl_display, vi_out->visualid, &config);
+ if (!config)
+ {
+ fprintf (stderr, "%s: no matching EGL config for X11 visual 0x%lx\n",
+ progname, vi_out->visualid);
+ abort();
+ }
+
+ {
+ int i;
+ const struct { int hexp; EGLint i; const char *s; } fields[] = {
+ { 1, EGL_CONFIG_ID, "config ID:" },
+ { 1, EGL_CONFIG_CAVEAT, "caveat:" },
+ { 1, EGL_CONFORMANT, "conformant:" },
+ { 0, EGL_COLOR_BUFFER_TYPE, "buffer type:" },
+ { 0, EGL_RED_SIZE, "color size:" },
+ { 0, EGL_TRANSPARENT_RED_VALUE, "transparency:" },
+ { 0, EGL_BUFFER_SIZE, "buffer size:" },
+ { 0, EGL_DEPTH_SIZE, "depth size:" },
+ { 0, EGL_LUMINANCE_SIZE, "lum size:" },
+ { 0, EGL_STENCIL_SIZE, "stencil size:" },
+ { 0, EGL_ALPHA_MASK_SIZE, "alpha mask:" },
+ { 0, EGL_LEVEL, "level:" },
+ { 0, EGL_SAMPLES, "samples:" },
+ { 0, EGL_SAMPLE_BUFFERS, "sample bufs:" },
+ { 0, EGL_NATIVE_RENDERABLE, "native render:" },
+ { 1, EGL_NATIVE_VISUAL_TYPE, "native type:" },
+ { 1, EGL_RENDERABLE_TYPE, "render type:" },
+ { 0, EGL_SURFACE_TYPE, "surface type:" },
+ { 0, EGL_BIND_TO_TEXTURE_RGB, "bind RGB:" },
+ { 0, EGL_BIND_TO_TEXTURE_RGBA, "bind RGBA:" },
+ { 0, EGL_MAX_PBUFFER_WIDTH, "buffer width:" },
+ { 0, EGL_MAX_PBUFFER_HEIGHT, "buffer height:" },
+ { 0, EGL_MAX_PBUFFER_PIXELS, "buffer pixels:" },
+ { 0, EGL_MAX_SWAP_INTERVAL, "max swap:" },
+ { 0, EGL_MIN_SWAP_INTERVAL, "min swap:" },
+ };
+ EGLint r=0, g=0, b=0, a=0, tt=0, tr=0, tg=0, tb=0;
+ eglGetConfigAttrib (egl_display, config, EGL_RED_SIZE, &r);
+ eglGetConfigAttrib (egl_display, config, EGL_GREEN_SIZE, &g);
+ eglGetConfigAttrib (egl_display, config, EGL_BLUE_SIZE, &b);
+ eglGetConfigAttrib (egl_display, config, EGL_ALPHA_SIZE, &a);
+ eglGetConfigAttrib (egl_display, config, EGL_TRANSPARENT_TYPE, &tt);
+ eglGetConfigAttrib (egl_display, config, EGL_TRANSPARENT_RED_VALUE, &tr);
+ eglGetConfigAttrib (egl_display, config, EGL_TRANSPARENT_GREEN_VALUE,&tg);
+ eglGetConfigAttrib (egl_display, config, EGL_TRANSPARENT_BLUE_VALUE, &tb);
+ for (i = 0; i < countof(fields); i++)
+ {
+ EGLint v = 0;
+ char s[100];
+ eglGetConfigAttrib (egl_display, config, fields[i].i, &v);
+ if (fields[i].i == EGL_RED_SIZE)
+ sprintf (s, "%d, %d, %d, %d", r, g, b, a);
+ else if (fields[i].i == EGL_TRANSPARENT_RED_VALUE && tt != EGL_NONE)
+ sprintf (s, "%d, %d, %d", tr, tg, tb);
+ else if (fields[i].i == EGL_CONFIG_CAVEAT)
+ strcpy (s, (v == EGL_NONE ? "none" :
+ v == EGL_SLOW_CONFIG ? "slow" :
+# ifdef EGL_NON_CONFORMANT
+ v == EGL_NON_CONFORMANT ? "non-conformant" :
+# endif
+ "???"));
+ else if (fields[i].i == EGL_COLOR_BUFFER_TYPE)
+ strcpy (s, (v == EGL_RGB_BUFFER ? "RGB" :
+ v == EGL_LUMINANCE_BUFFER ? "luminance" :
+ "???"));
+ else if (fields[i].i == EGL_CONFORMANT ||
+ fields[i].i == EGL_RENDERABLE_TYPE)
+ {
+ sprintf (s, "0x%02x", v);
+ if (v & EGL_OPENGL_BIT) strcat (s, " OpenGL");
+ if (v & EGL_OPENGL_ES_BIT) strcat (s, " GLES-1.x");
+ if (v & EGL_OPENGL_ES2_BIT) strcat (s, " GLES-2.0");
+# ifdef EGL_OPENGL_ES3_BIT
+ if (v & EGL_OPENGL_ES3_BIT) strcat (s, " GLES-3.0");
+# endif
+ if (v & EGL_OPENVG_BIT) strcat (s, " OpenVG");
+ }
+ else if (fields[i].hexp)
+ sprintf (s, "0x%02x", v);
+ else if (v)
+ sprintf (s, "%d", v);
+ else
+ *s = 0;
+
+ if (*s) fprintf (f, " EGL %-14s %s\n", fields[i].s, s);
+ }
+ }
+
+# else /* !HAVE_EGL -- GLX */
+
status = glXGetConfig (dpy, vi_out, GLX_USE_GL, &value);
if (status == GLX_NO_EXTENSION)
@@ -146,7 +431,7 @@ describe_gl_visual (FILE *f, Screen *screen, Visual *visual,
if (!glXGetConfig (dpy, vi_out, GLX_LEVEL, &value) &&
value != 0)
- printf (" GLX level: %d\n", value);
+ fprintf (f, " GLX level: %d\n", value);
if (!glXGetConfig (dpy, vi_out, GLX_RGBA, &value) && value)
{
@@ -155,22 +440,22 @@ describe_gl_visual (FILE *f, Screen *screen, Visual *visual,
glXGetConfig (dpy, vi_out, GLX_GREEN_SIZE, &g);
glXGetConfig (dpy, vi_out, GLX_BLUE_SIZE, &b);
glXGetConfig (dpy, vi_out, GLX_ALPHA_SIZE, &a);
- printf (" GLX type: RGBA (%2d, %2d, %2d, %2d)\n",
- r, g, b, a);
+ fprintf (f, " GLX type: RGBA (%2d, %2d, %2d, %2d)\n",
+ r, g, b, a);
r=0, g=0, b=0, a=0;
glXGetConfig (dpy, vi_out, GLX_ACCUM_RED_SIZE, &r);
glXGetConfig (dpy, vi_out, GLX_ACCUM_GREEN_SIZE, &g);
glXGetConfig (dpy, vi_out, GLX_ACCUM_BLUE_SIZE, &b);
glXGetConfig (dpy, vi_out, GLX_ACCUM_ALPHA_SIZE, &a);
- printf (" GLX accum: RGBA (%2d, %2d, %2d, %2d)\n",
- r, g, b, a);
+ fprintf (f, " GLX accum: RGBA (%2d, %2d, %2d, %2d)\n",
+ r, g, b, a);
}
else
{
value = 0;
glXGetConfig (dpy, vi_out, GLX_BUFFER_SIZE, &value);
- printf (" GLX type: indexed (%d)\n", value);
+ fprintf (f, " GLX type: indexed (%d)\n", value);
}
# ifndef GLX_NONE_EXT /* Hooray for gratuitious name changes. */
@@ -189,36 +474,36 @@ describe_gl_visual (FILE *f, Screen *screen, Visual *visual,
if (!glXGetConfig (dpy, vi_out, GLX_VISUAL_CAVEAT_EXT, &value) &&
value != GLX_NONE_EXT)
# ifdef GLX_NON_CONFORMANT_EXT
- printf (" GLX rating: %s\n",
- (value == GLX_NONE_EXT ? "none" :
- value == GLX_SLOW_VISUAL_EXT ? "slow" :
- value == GLX_NON_CONFORMANT_EXT ? "non-conformant" :
- "???"));
+ fprintf (f, " GLX rating: %s\n",
+ (value == GLX_NONE_EXT ? "none" :
+ value == GLX_SLOW_VISUAL_EXT ? "slow" :
+ value == GLX_NON_CONFORMANT_EXT ? "non-conformant" :
+ "???");
# else
- printf (" GLX rating: %s\n",
- (value == GLX_NONE_EXT ? "none" :
- value == GLX_SLOW_VISUAL_EXT ? "slow" :
- "???"));
+ fprintf (f, " GLX rating: %s\n",
+ (value == GLX_NONE_EXT ? "none" :
+ value == GLX_SLOW_VISUAL_EXT ? "slow" :
+ "???"));
# endif /* GLX_NON_CONFORMANT_EXT */
# endif /* GLX_VISUAL_CAVEAT_EXT */
if (!glXGetConfig (dpy, vi_out, GLX_DOUBLEBUFFER, &value))
- printf (" GLX double-buffer: %s\n", (value ? "yes" : "no"));
+ fprintf (f, " GLX double-buffer: %s\n", (value ? "yes" : "no"));
if (!glXGetConfig (dpy, vi_out, GLX_STEREO, &value) &&
value)
- printf (" GLX stereo: %s\n", (value ? "yes" : "no"));
+ fprintf (f, " GLX stereo: %s\n", (value ? "yes" : "no"));
if (!glXGetConfig (dpy, vi_out, GLX_AUX_BUFFERS, &value) &&
value != 0)
- printf (" GLX aux buffers: %d\n", value);
+ fprintf (f, " GLX aux buffers: %d\n", value);
if (!glXGetConfig (dpy, vi_out, GLX_DEPTH_SIZE, &value))
- printf (" GLX depth size: %d\n", value);
+ fprintf (f, " GLX depth size: %d\n", value);
if (!glXGetConfig (dpy, vi_out, GLX_STENCIL_SIZE, &value) &&
value != 0)
- printf (" GLX stencil size: %d\n", value);
+ fprintf (f, " GLX stencil size: %d\n", value);
# ifdef SB /* GL_SAMPLE_BUFFERS || GLX_SAMPLE_BUFFERS_* */
if (!glXGetConfig (dpy, vi_out, SB, &value) &&
@@ -226,7 +511,7 @@ describe_gl_visual (FILE *f, Screen *screen, Visual *visual,
{
int bufs = value;
if (!glXGetConfig (dpy, vi_out, SM, &value))
- printf (" GLX multisample: %d, %d\n", bufs, value);
+ fprintf (f, " GLX multisample: %d, %d\n", bufs, value);
}
# endif /* GL_SAMPLE_BUFFERS || GLX_SAMPLE_BUFFERS_* */
@@ -234,12 +519,12 @@ describe_gl_visual (FILE *f, Screen *screen, Visual *visual,
value != GLX_NONE_EXT)
{
if (value == GLX_NONE_EXT)
- printf (" GLX transparency: none\n");
+ fprintf (f, " GLX transparency: none\n");
else if (value == GLX_TRANSPARENT_INDEX_EXT)
{
if (!glXGetConfig (dpy, vi_out, GLX_TRANSPARENT_INDEX_VALUE_EXT,
&value))
- printf (" GLX transparency: indexed (%d)\n", value);
+ fprintf (f, " GLX transparency: indexed (%d)\n", value);
}
else if (value == GLX_TRANSPARENT_RGB_EXT)
{
@@ -248,10 +533,11 @@ describe_gl_visual (FILE *f, Screen *screen, Visual *visual,
glXGetConfig (dpy, vi_out, GLX_TRANSPARENT_GREEN_VALUE_EXT, &g);
glXGetConfig (dpy, vi_out, GLX_TRANSPARENT_BLUE_VALUE_EXT, &b);
glXGetConfig (dpy, vi_out, GLX_TRANSPARENT_ALPHA_VALUE_EXT, &a);
- printf (" GLX transparency: RGBA (%2d, %2d, %2d, %2d)\n",
- r, g, b, a);
+ fprintf (f, " GLX transparency: RGBA (%2d, %2d, %2d, %2d)\n",
+ r, g, b, a);
}
}
+# endif /* !HAVE_EGL */
}
#endif /* HAVE_GL */
}
@@ -262,13 +548,15 @@ validate_gl_visual (FILE *out, Screen *screen, const char *window_desc,
Visual *visual)
{
#ifdef HAVE_GL
+# ifndef HAVE_EGL
int status;
int value = False;
+ unsigned int id;
+# endif
Display *dpy = DisplayOfScreen (screen);
XVisualInfo vi_in, *vi_out;
int out_count;
- unsigned int id;
vi_in.screen = screen_number (screen);
vi_in.visualid = XVisualIDFromVisual (visual);
@@ -276,6 +564,7 @@ validate_gl_visual (FILE *out, Screen *screen, const char *window_desc,
&vi_in, &out_count);
if (! vi_out) abort ();
+# ifndef HAVE_EGL
status = glXGetConfig (dpy, vi_out, GLX_USE_GL, &value);
id = (unsigned int) vi_out->visualid;
@@ -295,6 +584,7 @@ validate_gl_visual (FILE *out, Screen *screen, const char *window_desc,
return False;
}
else
+# endif /* !HAVE_EGL */
{
return True;
}
diff --git a/utils/visual.h b/utils/visual.h
index 18ff7a6..4fd1b95 100644
--- a/utils/visual.h
+++ b/utils/visual.h
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1993-2014 by Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 1993-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -33,4 +33,8 @@ extern Visual *get_gl_visual (Screen *);
extern void describe_gl_visual (FILE *, Screen *, Visual *, Bool priv_cmap_p);
extern Bool validate_gl_visual (FILE *, Screen *, const char *, Visual *);
+#ifdef __egl_h_ /* EGL/egl.h included */
+extern void get_egl_config (Display *, EGLDisplay *, EGLint vid, EGLConfig *);
+#endif
+
#endif /* __VISUAL_H__ */
diff --git a/utils/vms-gtod.c b/utils/vms-gtod.c
deleted file mode 100644
index 7b1df5a..0000000
--- a/utils/vms-gtod.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * UNIX-style Time Functions, by pmoreau@cena.dgac.fr <Patrick MOREAU>
- * (picked up from XVMSUTILS unix emulation routines for VMS by
- * Trevor Taylor, Patrick Mahans and Martin P.J. Zinser)
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-#include <stdio.h>
-#include <signal.h>
-#include <time.h>
-#include "vms-gtod.h"
-
-/*
- * gettimeofday(2) - Returns the current time
- */
-
-int gettimeofday(tv)
-struct timeval *tv;
-{
- timeb_t tmp_time;
- ftime(&tmp_time);
- tv->tv_sec = tmp_time.time;
- tv->tv_usec = tmp_time.millitm * 1000;
- return (0);
-}
diff --git a/utils/vms-gtod.h b/utils/vms-gtod.h
deleted file mode 100644
index ffd6586..0000000
--- a/utils/vms-gtod.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/* @(#)time.h 2.9 87/01/17 SMI; from UCB 7.1 6/4/86 */
-
-/*
- Definitions of various structures used on UNIX for
- time-related syscalls.
-*/
-
-/*
- * Copyright (c) 1982, 1986 Regents of the University of California.
- * All rights reserved. The Berkeley software License Agreement
- * specifies the terms and conditions for redistribution.
- */
-
-#ifndef _VMS_GTOD_
-#define _VMS_GTOD_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Structure returned by gettimeofday(2) system call,
- * and used in other calls.
- */
-#ifndef __DECC
-struct timeval
-{
- long tv_sec; /* seconds */
- long tv_usec; /* and microseconds */
-};
-#else
-#if __DECC_VER < 50200000
-struct timeval
-{
- long tv_sec; /* seconds */
- long tv_usec; /* and microseconds */
-};
-#endif /* __DECC_VER */
-#endif /* __DECC */
-
-/*
- * Operations on timevals.
- *
- * NB: timercmp does not work for >= or <=.
- */
-#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec)
-#define timercmp(tvp, uvp, cmp) \
- ((tvp)->tv_sec cmp (uvp)->tv_sec || \
- (tvp)->tv_sec == (uvp)->tv_sec && (tvp)->tv_usec cmp (uvp)->tv_usec)
-#define timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0
-
-/*
- * Names of the interval timers, and structure
- * defining a timer setting.
- */
-#define ITIMER_REAL 0
-#define ITIMER_VIRTUAL 1
-#define ITIMER_PROF 2
-
-#ifndef __DECC
-struct itimerval
-{
- struct timeval it_interval; /* timer interval */
- struct timeval it_value; /* current value */
-};
-#else
-#if __DECC_VER < 50200000
-struct itimerval
-{
- struct timeval it_interval; /* timer interval */
- struct timeval it_value; /* current value */
-};
-#endif /* __DECC_VER */
-#endif /* __DECC */
-
-#ifndef KERNEL
-#include <time.h>
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*!_VMS_GTOD_*/
-
diff --git a/utils/vms-strdup.c b/utils/vms-strdup.c
deleted file mode 100644
index 1afc257..0000000
--- a/utils/vms-strdup.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * strdup.c
- *
- * Simple version of strdup for machines without it (ie DEC Ultrix 4.2)
- * Apparently VMS only got strdup in 1995 (v5.2...)
- *
- * By David Chatterton
- * 29 July 1993
- *
- * You can do anything you like to this... :)
- * I've stolen it from xpilot and added it to the xvmstuils MPJZ ;-)
- */
-
-#if (__VMS_VER < 70000000)
-#include <stdlib.h>
-#include <string.h>
-
-char* strdup (const char* s1)
-{
- char* s2;
- if (s2 = (char*)malloc(strlen(s1)+1))
- strcpy(s2,s1);
- return s2;
-}
-#endif
diff --git a/utils/xdbe.c b/utils/xdbe.c
index d62183e..347e625 100644
--- a/utils/xdbe.c
+++ b/utils/xdbe.c
@@ -18,13 +18,10 @@
#include "utils.h"
#include "xdbe.h"
#include "resources.h" /* for get_string_resource() */
+#include "xmu.h"
/* #define DEBUG */
-#ifdef DEBUG
-# include <X11/Xmu/Error.h>
-#endif
-
extern char *progname;
#ifdef HAVE_DOUBLE_BUFFER_EXTENSION /* whole file */
diff --git a/utils/xft.c b/utils/xft.c
index 9245752..6decd22 100644
--- a/utils/xft.c
+++ b/utils/xft.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2014-2018 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 2014-2021 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -37,6 +37,50 @@ struct _XftDraw {
};
+Display *
+XftDrawDisplay (XftDraw *draw)
+{
+ return draw->dpy;
+}
+
+
+Bool
+XftDrawSetClipRectangles (XftDraw *draw, int x, int y,
+ _Xconst XRectangle *rects, int n)
+{
+ if (!n)
+ return XSetClipMask (draw->dpy, draw->gc, 0);
+# if 0
+ else
+ /* #### unimplemented in jwxyz, so clipping is a no-op */
+ return XSetClipRectangles (draw->dpy, draw->gc, x, y,
+ (XRectangle *) rects, /* discard const */
+ n, Unsorted);
+# else
+ return False;
+# endif
+}
+
+
+Bool
+XftDrawSetClip (XftDraw *draw, Region region)
+{
+ if (!region)
+ return XSetClipMask (draw->dpy, draw->gc, 0);
+# if 0
+ else
+ /* #### unimplemented in jwxyz, so clipping is a no-op */
+ {
+ XRectangle rect; /* #### untested */
+ XClipBox (region, &rect); /* #### unimplemented in jwxyz */
+ return XftDrawSetClipRectangles (draw, 0, 0, &rect, 1);
+ }
+# else
+ return False;
+# endif
+}
+
+
XftFont *
XftFontOpenXlfd (Display *dpy, int screen, _Xconst char *xlfd)
{
@@ -60,8 +104,9 @@ XftFontOpenXlfd (Display *dpy, int screen, _Xconst char *xlfd)
{
unsigned i;
- // In the event of -*-random-* (under JWXYZ), get the actual XLFD,
- // otherwise we'll get another random font that doesn't match ff->xfont.
+ /* In the event of -*-random-* (under JWXYZ), get the actual XLFD,
+ otherwise we'll get another random font that doesn't match ff->xfont.
+ */
char *xlfd_resolved = NULL;
char **missing_charset_list_return;
@@ -111,6 +156,62 @@ XftFontOpenXlfd (Display *dpy, int screen, _Xconst char *xlfd)
}
+/* Very approximately convert an XFT-style name to an XLFD style name
+ and then call XftFontOpenXlfd on that.
+ */
+XftFont *
+XftFontOpenName (Display *dpy, int screen, _Xconst char *xft_name)
+{
+ XftFont *font;
+ char *name = strdup (xft_name);
+ char *xlfd = 0;
+ char *s, *b, *i, *o, *c;
+ int size;
+ char dummy;
+
+ /* Ignore any ":keywords=" */
+ c = strchr (name, ':');
+ if (c) *c = 0;
+
+ /* Downcase ASCII */
+ for (s = name; *s; s++)
+ if (*s >= 'A' && *s <= 'Z')
+ *s += 'a'-'A';
+
+ /* "Family-NN" */
+ s = strrchr (name, '-');
+ if (!s) goto FAIL;
+ if (1 != sscanf (s+1, " %d %c", &size, &dummy)) goto FAIL;
+ if (size <= 0) goto FAIL;
+ *s = 0;
+
+ /* "Family Bold", etc. */
+ b = strstr (name, " bold");
+ i = strstr (name, " italic");
+ o = strstr (name, " oblique");
+ if (b) *b = 0;
+ if (i) *i = 0;
+ if (o) *o = 0;
+
+ xlfd = (char *) malloc (strlen(name) + 80);
+ sprintf (xlfd, "-*-%s-%s-%s-*-*-*-%d-*-*-*-*-*-*",
+ name,
+ (b ? "bold" : "medium"),
+ (i ? "i" : o ? "o" : "r"),
+ size * 10);
+ font = XftFontOpenXlfd (dpy, screen, xlfd);
+ free (name);
+ free (xlfd);
+ return font;
+
+ FAIL:
+ fprintf (stderr, "%s: XFT: unparsable: \"%s\"\n", progname, xft_name);
+ if (name) free (name);
+ if (xlfd) free (xlfd);
+ return 0;
+}
+
+
void
XftFontClose (Display *dpy, XftFont *font)
{
@@ -132,7 +233,8 @@ XftColorAllocName (Display *dpy,
XftColor *result)
{
XColor color;
- if (!dpy || !visual || !name || !result) abort();
+ if (!dpy || !visual || !result) abort();
+ if (!name || !*name) name = "#FFFFFF";
if (! XParseColor (dpy, cmap, name, &color))
{
diff --git a/utils/xft.h b/utils/xft.h
index 385e28b..0da0188 100644
--- a/utils/xft.h
+++ b/utils/xft.h
@@ -118,7 +118,7 @@ typedef unsigned char FcChar8;
XftFont *XftFontOpenXlfd (Display *dpy, int screen, _Xconst char *xlfd);
-#define XftFontOpenName XftFontOpenXlfd
+XftFont *XftFontOpenName (Display *dpy, int screen, _Xconst char *name);
void XftFontClose (Display *dpy, XftFont *font);
@@ -143,7 +143,10 @@ XftDraw *XftDrawCreate (Display *dpy,
Drawable drawable,
Visual *visual,
Colormap colormap);
-
+Display *XftDrawDisplay (XftDraw *);
+Bool XftDrawSetClipRectangles (XftDraw *, int x, int y,
+ _Xconst XRectangle *rects, int n);
+Bool XftDrawSetClip (XftDraw *draw, Region region);
void XftDrawDestroy (XftDraw *draw);
void
diff --git a/utils/xftwrap.c b/utils/xftwrap.c
new file mode 100644
index 0000000..e880407
--- /dev/null
+++ b/utils/xftwrap.c
@@ -0,0 +1,206 @@
+/* xftwrap.c --- XftDrawStringUtf8 with multi-line strings.
+ * xscreensaver, Copyright © 2021 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "utils.h"
+#include "xft.h"
+#include "xftwrap.h"
+
+#undef MAX
+#undef MIN
+#define MAX(a,b) ((a)>(b)?(a):(b))
+#define MIN(a,b) ((a)<(b)?(a):(b))
+
+
+#ifdef DEBUG
+static void
+LOG(const char *ss, const char *s, int n)
+{
+ int i;
+ fprintf(stderr,"####%s [", ss);
+ for (i = 0; i < n; i++) fprintf(stderr, "%c", s[i]);
+ fprintf(stderr,"]\n");
+}
+#else
+# define LOG(ss,s,n) /**/
+#endif
+
+
+/* Returns a new string word-wrapped to fit in the width in pixels.
+ */
+char *
+xft_word_wrap (Display *dpy, XftFont *font, const char *str, int pixels)
+{
+ const char *in = str;
+ char *ret = (char *) malloc (strlen(in) + 2);
+ char *out = ret;
+ const char *line_out = out;
+ char *word_out = 0;
+ while (1)
+ {
+ if (*in == ' ' || *in == '\t' ||
+ *in == '\r' || *in == '\n' ||
+ *in == 0)
+ {
+ Bool done = (*in == 0); /* To wrap the *last* word. */
+ XGlyphInfo overall;
+ Bool nl = (*in == '\r' || *in == '\n');
+
+ if (nl) in++;
+ while (*in == ' ' || *in == '\t') in++;
+ in--;
+
+ XftTextExtentsUtf8 (dpy, font,
+ (FcChar8 *) line_out,
+ out - line_out,
+ &overall);
+ if (overall.width - overall.x >= pixels &&
+ word_out)
+ {
+ word_out[0] = '\n';
+ line_out = word_out + 1;
+ word_out = 0;
+ if (done) break;
+ *out++ = *in;
+ }
+ else
+ {
+ if (done) break;
+ word_out = out;
+ *out++ = *in;
+ if (nl)
+ {
+ line_out = out + 1;
+ word_out = 0;
+ }
+ }
+
+ if (done) break;
+ }
+ else
+ {
+ *out++ = *in;
+ }
+ in++;
+ }
+
+ *out = 0;
+
+ return ret;
+}
+
+
+/* Like XftTextExtentsUtf8, but handles multi-line strings.
+ XGlyphInfo will contain the bounding box that encloses all of the text.
+ Return value is the number of lines in the text, >= 1.
+ */
+int
+XftTextExtentsUtf8_multi (Display *dpy, XftFont *font,
+ const FcChar8 *str, int len, XGlyphInfo *overall)
+{
+ int i, start = 0;
+ int lines = 0;
+ int line_y = 0;
+ for (i = 0; i <= len; i++)
+ {
+ if (i == len || str[i] == '\r' || str[i] == '\n')
+ {
+ XGlyphInfo gi;
+ XftTextExtentsUtf8 (dpy, font,
+ str + start,
+ i - start,
+ &gi);
+ if (lines == 0)
+ *overall = gi;
+ else
+ {
+ /* Find the union of the two bounding boxes, placed at their
+ respective origins. */
+ int ox1, oy1, ox2, oy2; /* bbox of 'overall' */
+ int nx1, ny1, nx2, ny2; /* bbox of 'gi' */
+ int ux1, uy1, ux2, uy2; /* union */
+
+ ox1 = overall->x;
+ oy1 = overall->y;
+ ox2 = ox1 + overall->width;
+ oy2 = oy1 + overall->height;
+
+ line_y += font->ascent + font->descent; /* advance origin */
+
+ nx1 = gi.x;
+ ny1 = gi.y + line_y;
+ nx2 = nx1 + gi.width;
+ ny2 = ny1 + gi.height + line_y;
+
+ ux1 = MIN (ox1, nx1); /* upper left */
+ uy1 = MIN (oy1, ny1);
+ ux2 = MAX (ox2, nx2); /* bottom right */
+ uy2 = MAX (oy2, ny2);
+
+ overall->x = ux1;
+ overall->y = uy1;
+ overall->width = ux2 - ux1;
+ overall->height = uy2 - uy1;
+ }
+ lines++;
+ start = i+1;
+ }
+ }
+
+ return lines;
+}
+
+
+/* Like XftDrawStringUtf8, but handles multi-line strings.
+ Alignment is 1, 0 or -1 for left, center, right.
+ */
+void
+XftDrawStringUtf8_multi (XftDraw *xftdraw, const XftColor *color,
+ XftFont *font, int x, int y, const FcChar8 *str,
+ int len,
+ int alignment)
+{
+ Display *dpy = XftDrawDisplay (xftdraw);
+ int i, start = 0;
+ int lines = 0;
+ XGlyphInfo overall;
+ if (len == 0) return;
+
+ XftTextExtentsUtf8_multi (dpy, font, str, len, &overall);
+
+ for (i = 0; i <= len; i++)
+ {
+ if (i == len || str[i] == '\r' || str[i] == '\n')
+ {
+ XGlyphInfo gi;
+ int x2 = x;
+ XftTextExtentsUtf8 (dpy, font, str + start, i - start, &gi);
+ switch (alignment) {
+ case 1: break;
+ case 0: x2 += (overall.width - gi.width) / 2; break;
+ case -1: x2 += (overall.width - gi.width); break;
+ default: abort(); break;
+ }
+
+ XftDrawStringUtf8 (xftdraw, color, font, x2, y,
+ str + start,
+ i - start);
+ y += font->ascent + font->descent;
+ lines++;
+ start = i+1;
+ }
+ }
+}
+
diff --git a/utils/xftwrap.h b/utils/xftwrap.h
new file mode 100644
index 0000000..25a55bb
--- /dev/null
+++ b/utils/xftwrap.h
@@ -0,0 +1,35 @@
+/* xftwrap.h --- XftDrawStringUtf8 with multi-line strings.
+ * xscreensaver, Copyright © 2021 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __XFTWRAP_H__
+#define __XFTWRAP_H__
+
+/* Returns a new string word-wrapped to fit in the width in pixels.
+ */
+extern char *xft_word_wrap (Display *, XftFont *, const char *, int pixels);
+
+/* Like XftTextExtentsUtf8, but handles multi-line strings.
+ XGlyphInfo will contain the bounding box that encloses all of the text.
+ Return value is the number of lines in the text, >= 1.
+ */
+extern int XftTextExtentsUtf8_multi (Display *, XftFont *,
+ const FcChar8 *, int L, XGlyphInfo *);
+
+/* Like XftDrawStringUtf8, but handles multi-line strings.
+ Alignment is 1, 0 or -1 for left, center, right.
+ */
+extern void XftDrawStringUtf8_multi (XftDraw *, const XftColor *,
+ XftFont *, int x, int y,
+ const FcChar8 *, int L,
+ int alignment);
+
+#endif /* __XFTWRAP_H__ */
diff --git a/utils/xmu.c b/utils/xmu.c
index 2f273d4..051ac95 100644
--- a/utils/xmu.c
+++ b/utils/xmu.c
@@ -1,173 +1,46 @@
-/* This file contains compatibility routines for systems without Xmu.
- * You would be better served by installing Xmu on your machine or
- * yelling at your vendor to ship it.
+/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
-#ifndef HAVE_XMU
-/*
- * Copyright 1989 Massachusetts Institute of Technology
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted, provided
- * that the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of M.I.T. not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission. M.I.T. makes no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
- * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
+#include <stdio.h>
+#include <X11/Xlib.h>
#include "xmu.h"
-#ifndef NEED_EVENTS
-# define NEED_EVENTS /* to make Xproto.h define xEvent */
-#endif
-#ifndef VMS
-# include <X11/Xproto.h> /* for xEvent (used by Xlibint.h) */
-# include <X11/Xlibint.h> /* for _XExtension */
-#else /* VMS */
-# include <X11/Xlib.h>
-#endif /* VMS */
-#include <X11/Intrinsic.h> /* for XtSpecificationRelease */
+extern const char *progname;
-/*
- * XmuPrintDefaultErrorMessage - print a nice error that looks like the usual
- * message. Returns 1 if the caller should consider exitting else 0.
- */
-int XmuPrintDefaultErrorMessage (Display *dpy, XErrorEvent *event, FILE *fp)
+int
+XmuPrintDefaultErrorMessage (Display *dpy, XErrorEvent *event, FILE *fp)
{
- char buffer[BUFSIZ];
- char mesg[BUFSIZ];
- char number[32];
- char *mtype = "XlibMessage";
- _XExtension *ext = (_XExtension *)NULL;
- XGetErrorText(dpy, event->error_code, buffer, BUFSIZ);
- XGetErrorDatabaseText(dpy, mtype, "XError", "X Error", mesg, BUFSIZ);
- (void) fprintf(fp, "%s: %s\n ", mesg, buffer);
- XGetErrorDatabaseText(dpy, mtype, "MajorCode", "Request Major code %d",
- mesg, BUFSIZ);
- (void) fprintf(fp, mesg, event->request_code);
- if (event->request_code < 128) {
- sprintf(number, "%d", event->request_code);
- XGetErrorDatabaseText(dpy, "XRequest", number, "", buffer, BUFSIZ);
- } else {
- /* XXX this is non-portable */
- for (ext = dpy->ext_procs;
- ext && (ext->codes.major_opcode != event->request_code);
- ext = ext->next)
- ;
- if (ext)
- strcpy(buffer, ext->name);
- else
- buffer[0] = '\0';
- }
- (void) fprintf(fp, " (%s)", buffer);
- fputs("\n ", fp);
-#if (XtSpecificationRelease >= 5)
- if (event->request_code >= 128) {
- XGetErrorDatabaseText(dpy, mtype, "MinorCode", "Request Minor code %d",
- mesg, BUFSIZ);
- (void) fprintf(fp, mesg, event->minor_code);
- if (ext) {
- sprintf(mesg, "%s.%d", ext->name, event->minor_code);
- XGetErrorDatabaseText(dpy, "XRequest", mesg, "", buffer, BUFSIZ);
- (void) fprintf(fp, " (%s)", buffer);
- }
- fputs("\n ", fp);
- }
- if (event->error_code >= 128) {
- /* let extensions try to print the values */
- /* XXX this is non-portable code */
- for (ext = dpy->ext_procs; ext; ext = ext->next) {
- if (ext->error_values)
- (*ext->error_values)(dpy, event, fp);
- }
- /* the rest is a fallback, providing a simple default */
- /* kludge, try to find the extension that caused it */
- buffer[0] = '\0';
- for (ext = dpy->ext_procs; ext; ext = ext->next) {
- if (ext->error_string)
- (*ext->error_string)(dpy, event->error_code, &ext->codes,
- buffer, BUFSIZ);
- if (buffer[0])
- break;
- }
- if (buffer[0])
- sprintf(buffer, "%s.%d", ext->name,
- event->error_code - ext->codes.first_error);
- else
- strcpy(buffer, "Value");
- XGetErrorDatabaseText(dpy, mtype, buffer, "", mesg, BUFSIZ);
- if (*mesg) {
- (void) fprintf(fp, mesg, event->resourceid);
- fputs("\n ", fp);
- }
- } else if ((event->error_code == BadWindow) ||
- (event->error_code == BadPixmap) ||
- (event->error_code == BadCursor) ||
- (event->error_code == BadFont) ||
- (event->error_code == BadDrawable) ||
- (event->error_code == BadColor) ||
- (event->error_code == BadGC) ||
- (event->error_code == BadIDChoice) ||
- (event->error_code == BadValue) ||
- (event->error_code == BadAtom)) {
- if (event->error_code == BadValue)
- XGetErrorDatabaseText(dpy, mtype, "Value", "Value 0x%x",
- mesg, BUFSIZ);
- else if (event->error_code == BadAtom)
- XGetErrorDatabaseText(dpy, mtype, "AtomID", "AtomID 0x%x",
- mesg, BUFSIZ);
- else
- XGetErrorDatabaseText(dpy, mtype, "ResourceID", "ResourceID 0x%x",
- mesg, BUFSIZ);
- (void) fprintf(fp, mesg, event->resourceid);
- fputs("\n ", fp);
- }
-#elif (XtSpecificationRelease == 4)
- XGetErrorDatabaseText(dpy, mtype, "MinorCode", "Request Minor code %d",
- mesg, BUFSIZ);
- (void) fprintf(fp, mesg, event->minor_code);
- fputs("\n ", fp);
- if (ext) {
- sprintf(mesg, "%s.%d", ext->name, event->minor_code);
- XGetErrorDatabaseText(dpy, "XRequest", mesg, "", buffer, BUFSIZ);
- (void) fprintf(fp, " (%s)", buffer);
- }
- XGetErrorDatabaseText(dpy, mtype, "ResourceID", "ResourceID 0x%x",
- mesg, BUFSIZ);
- (void) fprintf(fp, mesg, event->resourceid);
- fputs("\n ", fp);
-#else
-ERROR! Unsupported release of X11
-#endif
- XGetErrorDatabaseText(dpy, mtype, "ErrorSerial", "Error Serial #%d",
- mesg, BUFSIZ);
- (void) fprintf(fp, mesg, event->serial);
- fputs("\n ", fp);
- XGetErrorDatabaseText(dpy, mtype, "CurrentSerial", "Current Serial #%d",
- mesg, BUFSIZ);
- (void) fprintf(fp, mesg, NextRequest(dpy)-1);
- fputs("\n", fp);
- if (event->error_code == BadImplementation) return 0;
- return 1;
+ /* The real libXmu version of this does localization and uses private,
+ undocumented fields inside the Display struct to print things about
+ errors from server-extension events. But the following is sufficient.
+ */
+ char xerr[1024], opname[1024], num[20];
+ const char *b = progname;
+
+ /* Convert the error code to its name, e.g. "BadWindow" */
+ XGetErrorText (dpy, event->error_code, xerr, sizeof(xerr)-1);
+
+ /* Convert the request's ID number to its name, e.g., "XGetProperty" */
+ sprintf (num, "%d", event->request_code);
+ XGetErrorDatabaseText (dpy, "XRequest", num, "", opname, sizeof(opname)-1);
+
+ fprintf (fp, "%s: Failed request: %s\n", b, xerr);
+ fprintf (fp, "%s: Major opcode: %d (%s)\n", b, event->request_code,
+ opname);
+ fprintf (fp, "%s: Resource id: 0x%lx\n", b, event->resourceid);
+ fprintf (fp, "%s: Serial number: %ld / %ld\n\n", b,
+ event->serial, NextRequest(dpy)-1);
+ return 1;
}
-
-#else /* HAVE_XMU */
-
-/* Shut up the stupid "gcc -pedantic" warning */
-int _I_dont_care_that_ISO_C_forbids_an_empty_source_file_ = 1;
-
-#endif /* HAVE_XMU */
diff --git a/utils/xmu.h b/utils/xmu.h
index 48084f7..e4cf7e6 100644
--- a/utils/xmu.h
+++ b/utils/xmu.h
@@ -1,14 +1,8 @@
-/* This file contains compatibility routines for systems without Xmu.
- * You would be better served by installing Xmu on your machine or
- * yelling at your vendor to ship it.
- */
+/* A relic of the past. */
#ifndef __XMU_H__
#define __XMU_H__
-#include <X11/Xlib.h>
-#include <stdio.h>
-
int XmuPrintDefaultErrorMessage (Display *dpy, XErrorEvent *event, FILE *fp);
#endif /* __XMU_H__ */
diff --git a/utils/xshm.c b/utils/xshm.c
index 8992140..14e5e43 100644
--- a/utils/xshm.c
+++ b/utils/xshm.c
@@ -33,6 +33,7 @@
/* #define DEBUG */
+#include <assert.h>
#include <errno.h> /* for perror() */
#ifdef HAVE_JWXYZ
@@ -42,12 +43,8 @@
#endif
#include "xshm.h"
+#include "aligned_malloc.h"
#include "resources.h" /* for get_string_resource() */
-#include "thread_util.h" /* for thread_malloc() */
-
-#ifdef DEBUG
-# include <X11/Xmu/Error.h>
-#endif
extern char *progname;
@@ -68,7 +65,7 @@ shm_ehandler (Display *dpy, XErrorEvent *error)
{
shm_got_x_error = True;
-#ifdef DEBUG
+#if 0
fprintf (stderr, "\n%s: ignoring X error from XSHM:\n", progname);
XmuPrintDefaultErrorMessage (dpy, error, stderr);
fprintf (stderr, "\n");
@@ -89,7 +86,7 @@ shm_ehandler (Display *dpy, XErrorEvent *error)
XSync((DPY), False); \
if (old_handler) \
XSetErrorHandler (old_handler); \
- old_handler = 0; \
+ old_handler = 0; \
} while(0)
#endif /* HAVE_XSHM_EXTENSION */
@@ -117,8 +114,8 @@ create_fallback (Display *dpy, Visual *visual,
/* Sometimes the XImage data needs to be aligned, such as for SIMD (SSE2
in Fireworkx), or multithreading (AnalogTV).
*/
- int error = thread_malloc ((void **)&image->data, dpy,
- image->height * image->bytes_per_line);
+ int error = aligned_malloc ((void **)&image->data, get_cache_line_size(),
+ image->height * image->bytes_per_line);
if (error) {
print_error (error);
XDestroyImage (image);
@@ -291,11 +288,13 @@ void
destroy_xshm_image (Display *dpy, XImage *image, XShmSegmentInfo *shm_info)
{
#ifdef HAVE_XSHM_EXTENSION
+ Status status;
+
if (shm_info->shmid == -1) {
#endif /* HAVE_XSHM_EXTENSION */
/* Don't let XDestroyImage free image->data. */
- thread_free (image->data);
+ aligned_free (image->data);
image->data = NULL;
XDestroyImage (image);
return;
@@ -303,8 +302,6 @@ destroy_xshm_image (Display *dpy, XImage *image, XShmSegmentInfo *shm_info)
#ifdef HAVE_XSHM_EXTENSION
}
- Status status;
-
CATCH_X_ERROR(dpy);
status = XShmDetach (dpy, shm_info);
UNCATCH_X_ERROR(dpy);
@@ -312,10 +309,10 @@ destroy_xshm_image (Display *dpy, XImage *image, XShmSegmentInfo *shm_info)
status = False;
if (!status)
fprintf (stderr, "%s: XShmDetach failed!\n", progname);
-#ifdef DEBUG
+# ifdef DEBUG
else
fprintf (stderr, "%s: XShmDetach(dpy, shm_info) ==> True\n", progname);
-#endif
+# endif
XDestroyImage (image);
XSync(dpy, False);
@@ -329,10 +326,10 @@ destroy_xshm_image (Display *dpy, XImage *image, XShmSegmentInfo *shm_info)
(unsigned long) shm_info->shmaddr);
perror(buf);
}
-#ifdef DEBUG
+# ifdef DEBUG
else
fprintf (stderr, "%s: shmdt(shm_info->shmaddr) ==> 0\n", progname);
-#endif
+# endif
XSync(dpy, False);
diff --git a/utils/yarandom.c b/utils/yarandom.c
index f450735..0f51cb6 100644
--- a/utils/yarandom.c
+++ b/utils/yarandom.c
@@ -118,9 +118,9 @@ ya_rand_init(unsigned int seed)
#define ROT(X,N) (((X)<<(N)) | ((X)>>((sizeof(unsigned int)*8)-(N))))
seed = (999U * (unsigned int) tp.tv_sec);
seed = ROT (seed, 11);
- seed += (1001 * tp.tv_usec);
+ seed += (1001 * (unsigned int) tp.tv_usec);
seed = ROT (seed, 7);
- seed += (1003 * getpid());
+ seed += (1003 * (unsigned int) getpid());
seed = ROT (seed, 13);
}
diff --git a/xscreensaver.spec b/xscreensaver.spec
index 84931b5..d9d239b 100644
--- a/xscreensaver.spec
+++ b/xscreensaver.spec
@@ -1,5 +1,5 @@
%define name xscreensaver
-%define version 5.44
+%define version 6.00
Summary: X screen saver and locker
Name: %{name}
@@ -17,24 +17,25 @@ Buildroot: %{_tmppath}/%{name}-root
Summary: A minimal installation of xscreensaver.
Summary(fr): Une installation minimale de xscreensaver.
Group: Amusements/Graphics
-BuildRequires: bc
BuildRequires: gettext
BuildRequires: pam-devel
BuildRequires: gtk2-devel
BuildRequires: desktop-file-utils
-# Red Hat (pre-FC5):
-#BuildRequires: xorg-x11-devel
-#BuildRequires: libglade2-devel
+BuildRequires: systemd-devel
+BuildRequires: libcap-devel
# Red Hat 5, CentOS5, FC5, and up:
BuildRequires: xorg-x11-proto-devel
-BuildRequires: libglade2-devel
+#BuildRequires: libglade2-devel
# Mandrake:
#BuildRequires: libxorg-x11-devel
#BuildRequires: libglade2.0_0-devel
Requires: SysVinit
+Requires: pam
Requires: /etc/pam.d/system-auth
Requires: htmlview
Requires: desktop-backgrounds-basic
+Requires: xdg-utils
+Requires: systemd-libs
Provides: xscreensaver
Provides: xscreensaver-base
Obsoletes: xscreensaver
@@ -111,12 +112,6 @@ export CFLAGS="${CFLAGS:-${RPM_OPT_FLAGS}}"
CONFIG_OPTS="--prefix=/usr --with-pam --without-shadow --without-kerberos"
-# Red Hat doesn't like this:
-CONFIG_OPTS="$CONFIG_OPTS --with-setuid-hacks"
-
-# This is flaky:
-# CONFIG_OPTS="$CONFIG_OPTS --with-login-manager"
-
ln -s ../configure .
%configure $CONFIG_OPTS
rm -f configure
@@ -140,10 +135,6 @@ mkdir -p $RPM_BUILD_ROOT%{_bindir} \
make install_prefix=$RPM_BUILD_ROOT install
-desktop-file-install --vendor gnome --delete-original \
- --dir $RPM_BUILD_ROOT%{_datadir}/applications \
- $RPM_BUILD_ROOT%{_datadir}/applications/*.desktop
-
# This function prints a list of things that get installed.
# It does this by parsing the output of a dummy run of "make install".
#