BLENDER_V237REND 1SRt}<[SRipo}\l0QSRDATA}\~DATA~\~\}DATA~\\~~RDATA~\~~\RDATA~\~DATA\\~RDATA\\DATA\\RDATA\DATA\DATA\]~~\DATA]\}~DATA]}~DATA]\~DATA\]~DATA]\~\DATA]~\DATA]\\DATA\]~DATA]\DATA]\DATA]\DATA\]~\DATA]\DATA]DATA_}~~RRRS\\DATA^OutputRender>DATA^RenderRender@>DATA^AnimRender>DATA^FormatRender>DATA\L\?3336DCdBNDhhA;{C[HCB(DC??SdDATAT\N\?3336/9DATA_\~~\RRRSDATA_l~\=O2=Eo?alDATAhG?3336L???x=д????>xд?=O2=EoW~::?A$AS>xд?=O2=Eo????x=д??AS`B ?=Cx=д DATATN\?3336LOAD FILE/9DATA\Kl?3336LCz A Cz A <# <# Fj`Dz OBDATAlL\?3336LDCdDvC@CB(DC??DATAl_??CAMHRRRlDATAlK?3336Cz A Cz A ee<# <# Fj`Dz OBDATAhG|l?3336?w?w/??w?wƀ???A??C4G4w*@DATA^|RenderRender@>DATA|^LAnimRender>DATAL^|FormatRender>DATA^LLink and MaterialsEditing>DATA^MeshEditing@>DATA^Mesh ToolsEditing>DATA^\Mesh Tools 1Editing>DATA\^,Anim settingsObject>DATA,^\DrawObject@>DATA^,HooksObject@>,DATA^ConstraintsObject>DATA ^DATA^ MaterialMaterial@>DATA^|PaintEditing>DATA|^LPreviewTexture>DATAL^|Radio RenderRadio>DATA^LRadio ToolRadio@>DATA^PreviewWorld>DATA^WorldWorld@>DATA^PaintImage>"DATA^|PreviewLamp>DATA|^LampLamp@>DATA^|Shadow and SpotLamp>DATA^LTexture and InputLamp>DATAL^Map ToLamp>DATA^ LMist / Stars / PhysicsWorld>DATA ^,Amb OccWorld>DATA,^L Texture and InputWorld>DATAL^,Map ToWorld>,DATA\L\?333DCdDFpCdCB(DC??Sc\DATA\P<\?333CC@ `>F?NS?DATAT<N\?333SELECT FONT PATH/Library/Fonts/_1/../../der (b)/../ (ej b)/../d forge test/../d2005.blend DATA_\RRRS, \DATA_L\>)?Io?RRR }LDATAhG?333??@?@xzQ=?)o>)\?I ě< ה5:{? p@%@%se sd?]>xzP=?>)?Io???@?@n? `??3?3>? `⾑n?=m1.;n=x<+Ǻ^?A94@AC>? `⾑n?=m=yo??3?3>n? `??55A9`B ??=C `>nuu DATALK\?333LCz A Cz A <# <# Fj`Dz OBDATA\L\L?333LDCdDvC@CB(DC??DATAT\N\?333LSELECT SCRIPT PATH//Applications/blender/python/../der/../on/../2flender.py FDATA_lL\=$=$o? }   DATAh G?333???x=д????>xд?=$=$o*(;B/8?A%A/K>xе?=$=$o????x=д??A%`B ??=Cx=д^^ DATAK ?333Cz A Cz A <# <# Fj`Dz OBDATAL?333DCdDvC@CB(DC??DATATN?333Save AsE/Volumes/ANTPORT_1/Ant/palaver/blender/softbodies tut/middle.blendSDATAl_\\?@AMHRRR}ҐlҐlDATAhGl?333l?Wk3v ) )3iֿWkv?3EYM4߯$,??Wj )Ie3Ie3 ~? )Wk3gj ;Z.)Z.??k4/? o? )4 ?W?Wk@ͳgEYԓ5x@u@$,?E Kn=]4P2ؕ2~>A,dA:Z**$TJgy@)?@AMH?Wk3v ) )3iֿWkv?3EYM4߯$,??-1-1>Kv>KzAS`B ??=Cx=д ^ ^ DATATlN?333lOAD FILE/9DATAKl?333lCz A Cz A <# <# Fj`Dz OBDATAL?333lDCdDvC@CB(DC??SRt[\SRscreenɜϜ01DATAɜ\DATA\ɜDATA\\DATA\\ʜDATAʜ\\DATA\ʜDATA\\DATA\\˜DATA˜\\xDATA\˜xDATA]\DATA\]̜ɜ\DATA̜]\ɜʜDATA]̜\DATA]\ʜDATA\]͜DATA͜]\\DATA]͜\DATA]\ʜ˜DATA\]Μ˜DATAΜ]\DATA]Μ\DATA]\˜DATA\]Ϝ\DATAϜ]\ʜDATA_\ɜʜ\dDATAL?333DCdzIDՅAPCVCB(DC??DATATN?333/9DATA\_\\dDATA\_\ʜ˜=m |=ao?uuuv3\LDATA\P<?333CC;?݀?v?DATA<K\?333Cz?Cz@55<# <# Fj`F@ OBCz?DATAhGL<?333????????=m |=ao?A=pAW <??A=p`B ?<# C;;DATATLN?333LOAD FILE/+ant/anters/eget/e/../a6.jpgndDATA_\˜\??P{{{dDATAK?333Cz?Cz@??<# <# Fj`Dz OBCz?DATAhG?333??? ????A ???PAA ?O!?jG}CBH?A `B ?<# C@h@hDATATN?333/9SRt\[,SRscreen.002߼<|01DATA\<DATA<\|DATA|\ݼ<DATAݼ\|DATA\<ݼDATA<\|DATA|\޼<DATA޼\|DATA\<޼DATA<\|DATA|\߼<`DATA߼\|`DATA]<<|DATA<]|ݼDATA|]<DATA]|ݼ<DATA]<<DATA<]|<|DATA|]<|޼DATA]||޼DATA]<DATA<]||DATA|]<޼<DATA]|<<DATA]<<DATA<]||DATA|]<<|DATA]||߼DATA]<޼߼DATA<]|߼DATA|_<ݼCd||DATA|L|?333DCdzIDՅAPCVCB(DC??DATAT|N|?333/9DATA_||<|޼dDATA_L<<=8>iιo? dDATAM?333CzACzAA @FB=A DATAhG?333????????=8>iιo?Afff@&D??Afff`B ?<# CDATATN?333AVE TARGA/t1.blend9DATAL_|߼޼<=8>Ho?ccc dLDATALM ?333CzACzA1||1A @FB=A DATAh GL?333????????=8>Ho?Afff@*??Afff`B ?<# C>>DATATN ?333AVE TARGA/t1.blend9DATA_L|߼|=8>o?]]]^dDATAK$?333B?B?<# <# Fj`Dz SQB?DATAh$G?333????????=8>o?Afff@ϒ??Afff`B ?<# CzzDATATN$?333OAD FILE/9SRt,[\SRscripts L \0QSRDATA\ DATA \LDATAL\ RDATA\LRDATA\ DATA \LRDATAL\ DATA\LRDATA\ DATA \DATAL] LDATA]LDATA] DATA ]L DATAL]  DATA]L LDATA] LDATA ]LLDATAL] DATA]L DATA] L DATA ]L DATAL] LDATA]L DATA] DATA _ RRRSLL |DATA ^OutputRender>DATA^ RenderRender@>DATA^|AnimRender>DATA|^FormatRender>DATALLL?3339EDCdBNDhhA;{C[HCB(DC??SdDATATLNL?3339E/9DATA_ L LRRRSDATA_\L =O2=Eo?a(\DATAh(G?3337???x=д????>xд?=O2=EoW~::?A$AS>xд?=O2=Eo????x=д??AS`B ?=Cx=д DATATNL(?3337OAD FILE/9DATALK\?3337Cz A Cz A <# <# Fj`Dz OBDATA\LL?3337DCdDvC@CB(DC??DATA\_  ??CAMHRRR \ DATAx\R ?3339'`% =DATAK,\?3339'Cz A Cz A ee<# <# Fj`Dz OBDATAh,G ?3339'?w?w/??w?wƀ???A??C4G4w*@  G DATA > <]DDATA > | _@DATA |> ,  A`DATA ,> | G<DATA( =,xd'=A@CAl CACamera=BB @?LA LALamp?????AB4>???B B4?@@???WO<WOWorld??????A@ApA ?=LTXd`TXS2flender.py|ZDATA,|/Applications/blender/python/S2flender.pyDATAx|DATA\\%DATA\DATA\ ?DATA,BpDATA\l: %x1DATA\owseDATA\ ?DATA|*DATA\DATA\ I*DATA\IDATA F gnDATA\|(pDATA\|DATA\ DDATA|CDATA\BgnDATA\\1gnDATA\DATAF@DATA\\@DATA\NDATA\LDATA|?DATA\?DATA\\ZDATA\SDATAlNDATA\?DATA\\DATA\ADATADATA\,DATA\lDATA\BDATA DATA\LDATA\Œ6DATA\DATA<DATA\ÌDATA\DATA\,DATA|DATA\ļ DATA\ DATA\LDATA|DATA\Ŭ?DATA\DATA\\?DATADATA\ DATA\LDATA\nj DATADATA\ DATA\\DATA\ȜDATADATA\ DATA\LDATA\ɌDATA ɼ DATA  \ DATA \  <DATA   \l DATA ! ʬ DATA!!\ DATA!\!!DATA!!!\\DATA!"!ˬ DATA""\! DATA"\"", DATA"""\lDATA"#"̜ DATA##\"DATA#\##DATA###\L$DATA#$#͜DATA$$\#DATA$\$$DATA$$$\\DATA$%$ΜDATA%%\$DATA%\%% DATA%%%\<DATA%&%|DATA&&\%ϬDATA&\&&DATA&&&\DATA&'&\ DATA''\&ЬDATA'\'' DATA'''\,DATA'('lDATA((\'ѼDATA(\(( DATA(((\,DATA()(l DATA))\(ҬDATA)\))DATA)))\%DATA)*)l DATA**\)ӬDATA*\**DATA***\DATA*+*lDATA++\*ԬDATA+\++DATA+++\,DATA+,+lDATA,,\+լDATA,\,,DATA,,,\DATA,-,\DATA--\,֜&DATA-\--DATA---\,DATA-.-| DATA..\-׼DATA.\..DATA...\LDATA./.،DATA//\.DATA/\//,DATA///\\DATA/0/٬DATA00\/DATA0\00 DATA000\lDATA010ڜDATA11\0 DATA1\11<DATA111\یDATA121ۼDATA22\1DATA2\22, DATA222\l DATA232ܬDATA33\2 DATA3\33,DATA333\lDATA343ݬDATA44\3DATA4\44DATA444\\ DATA454ޜ DATA55\4DATA5\55 ?DATA555\|DATA565߼?DATA66\5,DATA6\66lDATA666\DATA676 DATA77\6LDATA7\77DATA777\DATA787 DATA88\7L DATA8\88DATA888\ DATA898 DATA99\8L DATA9\99DATA999\ DATA9:9 DATA::\9L DATA:\::DATA:::\DATA:;: DATA;;\:L DATA;\;; DATA;;;\ DATA;<; DATA<<\;L-DATA<\<<DATA<<<\DATA<=<,DATA==\<|DATA=\==DATA===\DATA=>=lDATA>>\=DATA>\>>DATA>>>\L DATA>?>DATA??\>DATA?\?? DATA???\LDATA?@?DATA@@\?DATA@\@@ DATA@@@\L DATA@A@ DATAAA\@DATAA\AA DATAAAA\LDATAABADATABB\ADATAB\BB?DATABBB\lDATABCB?DATACC\BDATAC\CCL DATACCC\DATACDCDATADD\CDATAD\DD<DATADDD\!DATADEDDATAEE\D DATAE\EELDATAEEE\DATAEFEDATAFF\EDATAF\FFlDATAFFF\DATAFGFDATAGG\FDATAG\GG\DATAGGG\DATAGHG/DATAHH\G<DATAH\HHlDATAHHH\DATAHIHDATAII\H,DATAI\IIl DATAIII\ DATAIJI DATAJJ\I,DATAJ\JJ\ DATAJJJ\DATAJKJDATAKK\J DATAK\KKLDATAKKK\|DATAKLKDATALL\KDATAL\LL,$DATALLL\|DATALMLDATAMM\LDATAM\MMLDATAMMM\ DATAMNM DATANN\M DATAN\NN< DATANNN\|DATANONDATAOO\NDATAO\OO<DATAOOO\|DATAOPODATAPP\ODATAP\PP<DATAPPP\DATAPQPDATAQQ\P DATAQ\QQ<DATAQQQ\|DATAQRQ DATARR\QDATAR\RR,DATARRR\lDATARSRDATASS\RDATAS\SSDATASSS\\DATASTSDATATT\SDATAT\TT DATATTT\LDATATUT|,DATAUU\TDATAU\UU'DATAUUU\lDATAUVUDATAVV\U DATAV\VV< DATAVVV\|DATAVWVDATAWW\V DATAW\WW<,DATAWWW\DATAWXW%DATAXX\W, DATAX\XXlDATAXXX\DATAXYXDATAYY\X,DATAY\YY\DATAYYY\ DATAYZYDATAZZ\Y DATAZ\ZZLDATAZZZ\DATAZ[ZDATA[[\ZDATA[\[[,DATA[[[\lDATA[\[DATA\\\[DATA\\\\DATA\\\\\DATA\]\DATA]]\\DATA]\]], DATA]]]\l DATA]^]DATA^^\] DATA^\^^ DATA^^^\ LDATA^_^ 9DATA__\^ ADATA_\__ lDATA___\ DATA_`_ )DATA``\_ \DATA`\`` 7DATA```\ (DATA`a` LDATAaa\` DATAa\aa DATAaaa\ ,DATAaba lDATAbb\a DATAb\bb DATAbbb\DATAbcb\DATAcc\bDATAc\ccDATAccc\ DATAcdc<DATAdd\c|DATAd\ddDATAddd\,DATAdedLDATAee\d'DATAe\eeDATAeee\DATAefel DATAff\e DATAf\ffDATAfff\<DATAfgf|DATAgg\f,DATAg\gg DATAggg\L%DATAghg DATAhh\gDATAh\hhDATAhhh\\DATAhihDATAii\hDATAi\ii DATAiii\LDATAiji|DATAjj\iDATAj\jj1DATAjjj\\DATAjkjDATAkk\jDATAk\kk,DATAkkk\lDATAklkDATAll\k,DATAl\ll\DATAlll\DATAlmlDATAmm\l DATAm\mmLDATAmmm\DATAmnmDATAnn\m DATAn\nn\DATAnnn\ DATAnonDATAoo\nDATAo\ooL(DATAooo\ DATAopoCDATApp\olDATAp\ppDATAppp\ DATApqpDATAqq\p\DATAq\qq DATAqqq\DATAqrq DATArr\qLDATAr\rrDATArrr\DATArsrDATAss\r<DATAs\ss|DATAsss\DATAstsDATAtt\s ,DATAt\tt \,DATAttt\ DATAtut 'DATAuu\t!LDATAu\uu!DATAuuu\! DATAuvu" DATAvv\u"\DATAv\vv"DATAvvv\"DATAvwv#,DATAww\v#|DATAw\ww#%DATAwww\$ DATAwxw$LDATAxx\w$DATAx\xx$DATAxxx\% DATAxyx%<DATAyy\x%| DATAy\yy%DATAyyy\%DATAyzy&L&DATAzz\y&DATAz\zz&DATAzzz\' %DATAz{z'\ DATA{{\z' DATA{\{{' DATA{{{\( DATA{|{(\DATA||\{(1DATA|\||) DATA|||\)LDATA|}|)|DATA}}\|)DATA}\}}* DATA}}}\*\DATA}~}*DATA~~\}* DATA~\~~+<DATA~~~\+l"DATA~~+DATA\~+ DATA\,,DATA\,l&DATA,+DATA\-DATA\-\DATA\-(DATA-DATA\.LDATA\.DATA\.DATA/,DATA\/l.DATA\/DATA\0 DATA0l DATA\0,DATA\1DATA\1l DATA1 DATA\2 DATA\2LDATA\2|DATA2DATA\3 DATA\3<DATA\3|+DATA3DATA\4 DATA\4L%DATA\4DATA4DATA\5 5DATA\5lDATA\5*DATA5 DATA\6< DATA\6|0DATA\6/DATA7<DATA\7|<DATA\7DATA\8,DATA8lDATA\8DATA\9 DATA\9\DATA9DATA\9DATA\:<DATA\: DATA:DATA\:=DATA\;l DATA\; DATA;;DATA\<\:DATA\<DATA\= EDATA=|DATA\=DATA\=DATA\>LDATA>DATA\>DATA\?<DATA\?|DATA?DATA\@DATA\@lDATA\@ DATA@DATA\A,DATA\AlDATA\A'DATAADATA\B, DATA\BlDATA\B?DATAC DATA\CL?DATA\CDATA\D DATADLDATA\D5DATA\DDATA\E+DATAE| DATA\EDATA\E#DATA\F<DATAFDATA\F DATA\G DATA\GLDATAG|,DATA\GDATA\HDATA\H\DATAH:DATA\I DATA\I</DATA\IEDATAJ YDATA\J)DATA\JADATA\KlDATAKYDATA\LL DATA\LDATA\LDATAM DATA\M\DATA\MDATA\MDATAN DATA\N<DATA\N|DATA\N DATAN DATA\O<DATA\OlDATA\ODATAODATA\P<DATA\P|DATA\PDATAP5DATA\Q\DATA\Q+DATA\Q DATAR,DATA\R\DATA\RDATA\RDATAS,$DATA\S|DATA\SDATA\T DATATL DATA\TDATA\TKDATA\U<>DATAU#DATA\UDATA\VL=DATA\VJDATAW<[DATA\W DATA\X GDATA\X|DATAX_DATA\Y\ADATA\Y>DATA\Z<>DATAZ<DATA\[<DATA\[ DATA\[DATA[8DATA\\l%DATA\\DATA\] 0DATA]l%DATA\]&DATA\^ &DATA\^\3DATA^(DATA\_DATA\_LDATA\_1DATA_DATA\`LDATA\`KDATA\a DATAa\DATA\aDATA\aDATA\b1DATAb|&DATA\b DATA\c DATA\c<DATAclDATA\cDATA\cDATA\dDATAd6DATA\e,DATA\elDATA\eDATAeDATA\f,5DATA\fDATA\fWDATAg\+DATA\g(DATA\h/DATA\h|DATAh/DATA\iDATA\i\,DATA\iDATAi#DATA\jLDATA\j)DATA\j DATAkLDATA\k)DATA\k DATA\lL)DATAl)DATA\m DATA\mLDATA\m|'DATAmDATA\n DATA\nLDATA\n DATAnDATA\o LDATA\oDATA\oDATAp DATA\p\0DATA\pDATA\q DATAqLDATA\q|EDATA\qDATA\rDATAr\DATA\rDATA\rDATA\s<DATAs$DATA\s DATA\tDATA\tL3DATAtDATA\tDATA\uDATA\u\DATAuDATA\uDATA\v DATA\vLDATAv DATA\vDATA\w ?DATA\w|DATAw?DATA\x,DATA\x\DATA\xDATAxDATA\y DATA\yLDATA\yDATAy DATA\z "DATA\z\-DATA\z DATAz DATA\{<DATA\{l>DATA\{DATA|DATA\|\DATA\œ|DATAœ\|DATAœ}DATA\}lDATA\Ü}DATAÜ\~ DATAÜ~\ DATA\~DATA\Ĝ~ DATAĜ\,DATAĜ| DATA\PDATA\Ŝ< DATAŜ\|DATAŜDATA\DATA\Ɯ< DATAƜ\|DATAƜDATA\DATA\ǜ< DATAǜ\|DATAǜDATA\DATA\Ȝ,DATAȜ\lDATAȜDATA\DATA\ɜ<DATAɜ\lDATAɜDATA\DATA\ʜ,DATAʜ\| DATAʜDATA\?DATA\˜\DATA˜\:DATA˜ 4DATA\l;DATA\̜DATA̜\ 8DATA̜|9DATA\DATA\͜<?DATA͜\DATA͜?DATA\LDATA\ΜDATAΜ\DATAΜ DATA\LDATA\ϜDATAϜ\DATAϜDATA\<DATA\М|DATAМ\DATAМDATA\< DATA\ќ| DATAќ\ DATAќ?DATA\lCDATA\ҜDATAҜ\DATAҜlDATA\DATA\Ӝ DATAӜ\\DATAӜDATA\=DATA\Ԝ\ DATAԜ\DATAԜ#DATA\DATA\՜\ DATA՜\DATA՜DATA\<DATA\֜|DATA֜\DATA֜ DATA\\'DATA\לiDATAל\LDATAלDATA\eDATA\؜|DATA؜\)DATA؜DATA\l DATA\ٜDATAٜ\DATAٜ<DATA\DATA\ڜDATAڜ\DATAڜlDATA\&DATA\ۜ#DATAۜ\L'DATAۜ"DATA\!DATA\ܜ< DATAܜ\|DATAܜDATA\DATA\ݜ<DATAݜ\|DATAݜ DATA\DATA\ޜ,DATAޜ\|DATAޜDATA\ DATA\ߜ<DATAߜ\lDATAߜ<DATA\<DATA\9DATA\DATALDATA\|!DATA\<DATA\<&DATADATA\DATA\ DATA\LDATADATA\ DATA\DATA\LDATAIDATA\ DATA\\DATA\ DATA(DATA\<DATA\DATA\DATADATA\\ DATA\DATA\ DATA @DATA\|DATA\DATA\ DATA<DATA\l?DATA\DATA\?DATADATA\DATA\DATA\\DATA DATA\DATA\ DATA\\DATADATA\DATA\ DATA\l DATA DATA\ DATA\,DATA\\DATADATA\DATA\DATA\lDATADATA\DATA\DATA\\DATADATA\DATA\ DATA\<DATADATA\DATA\DATA\LDATADATA\+DATA\DATA\\DATADATA\DATA\, DATA\lDATA*DATA\DATA\<DATA\|DATA DATA\ DATA\LDATA\|%DATADATA\ DATA\LDATA\ DATA DATA\ DATA\<DATA\'DATA+DATA\<DATA\| DATA\?DATA,DATA\lDATA\DATA\DATA,DATA\|DATA\DATA\DATA<DATA\|?DATA\+DATA\L8DATA:DATA\,*DATA\DATA\$DATADATA\lDATA\ DATA\DATA< DATA\|DATA\,DATA\ <DATA|?DATA\,DATA\LDATA\DATADATA\,DATA\l DATA\¬DATA DATA\<DATA\l,DATA\0DATA,4DATA\Č*DATA\DATA\,$DATA|DATA\DATA\ DATA\LDATAƜ DATA\DATA\ (DATA\lDATAǬDATA\DATA\<DATA\ȌDATA DATA\ DATA\<DATA\Ɍ7DATADATA\,DATA\|DATA\ʼDATA DATA\<DATA\l"DATA\˼7DATA*DATA\|DATA\DATA\DATA l DATA  \ͬDATA \  2DATA   \<=DATA   ά>DATA  \ ;DATA \  όCDATA   \ADATA   lDATA  \ ЬBDATA \  ;DATA   \ьADATA   DATA  \ L.DATA \  ҬDATA   \DATA   <DATA  \ ӌDATA \   DATA   \ DATA  <.DATA\ Ԝ9DATA\ >DATA\|CDATADATA\,-DATA\֌DATA\DATADATA\l.DATA\DATA\ /DATAl DATA\جDATA\#DATA\,DATA\ DATA\ٜDATA\DATA\<DATA|DATA\ڼ DATA\DATA\, DATA|DATA\ۼDATA\.DATA\\DATA܌DATA\ܼDATA\=DATA\\9DATA>DATA\<=DATA\ެCDATA\DATAl5DATA\DATA\DATA\\(DATAMDATA\<.DATA\DATA\ DATA,DATA\\-DATA\DATA\ DATA\DATA\DATA\ DATA\,DATA\8DATA\DATA\ 8DATA\|DATA-DATA\ -DATA\lDATA\DATA2DATA\\)DATA\ DATA\DATA,[DATA\DATA\DATA\,DATA\ DATA\QDATA\>DATA\<DATA 4DATA  \\JDATA \  KDATA   \\!DATA ! 5DATA!!\  0DATA!\!!lDATA!!!\:DATA!"!,;DATA""\!$DATA"\"" DATA"""\,DATA"#"DATA##\"DATA#\##LDATA###\DATA#$#DATA$$\# DATA$\$$L+DATA$$$\DATA$%$DATA%%\$LDATA%\%%DATA%%%\+DATA%&%<DATA&&\%'DATA&\&&DATA&&&\,DATA&'&|)DATA''\&DATA'\'',$DATA'''\|DATA'('DATA((\' #DATA(\((\(DATA(((\(DATA()((DATA))\(|DATA)\))*DATA)))\, DATA)*)l=DATA**\)DATA*\**,2DATA***\-DATA*+*DATA++\*DATA+\++l DATA+++\ DATA+,+DATA,,\+;DATA,\,,DATA,,,\DATA,-,DATA--\,< DATA-\--|<DATA---\>DATA-.-\4DATA..\-5DATA.\..0DATA...\|KDATA./.!DATA//\.LDATA/\//DATA///\DATA/0/DATA00\/<DATA0\00DATA000\DATA010DATA11\0lGDATA1\11DATA111\,DATA121|*DATA22\1DATA2\22,DATA222\\DATA232 DATA33\2 DATA3\33,DATA333\\6DATA343DATA44\3DATA4\44<!DATA444\ DATA454DATA55\4'DATA5\55LDATA555\!DATA565DATA66\5, DATA6\66|DATA666\DATA676DATA77\6,DDATA7\77DATA777\DATA787 ,DATA88\7 l%DATA8\88 DATA888\ (DATA898 \DATA99\8 DATA9\99 DATA999\ L%DATA9:9 DATA::\9 DATA:\:: PDATA:::\ DATA:;: DATA;;\: DATA;\;; ,DATA;;;\ lDATA;<; DATA<<\; DATA<\<<<DATA<<<\,DATA<=<DATA==\<,DATA=\==| DATA===\ DATA=>=DATA>>\=,QDATA>\>>DATA>>>\DATA>?>DATA??\>LDATA?\??DATA???\DATA?@? DATA@@\?\DATA@\@@,DATA@@@\ DATA@A@LDATAAA\@ DATAA\AA DATAAAA\DATAABAL8DATABB\ADATAB\BB 8DATABBB\|DATABCB@DATACC\BDATAC\CCLDATACCC\DATACDC?DATADD\C, DATAD\DDlDATADDD\ DATADED DATAEE\D< DATAE\EE| DATAEEE\ DATAEFE4DATAFF\E\DATAF\FFDATAFFF\DATAFGF,DATAGG\Fl"DATAG\GGDATAGGG\ DATAGHGL"DATAHH\GDATAH\HHDATAHHH\,DATAHIHl4DATAII\H)DATAI\II,_DATAIII\YDATAIJIL)DATAJJ\I_DATAJ\JJ<YDATAJJJ\(DATAJKJ ,eDATAKK\J _DATAK\KK!LDDATAKKK\!iDATAKLK"\|DATALL\K# DATAL\LL#DATALLL\$ *DATALML$lDATAMM\L$3DATAM\MM%DATAMMM\%\'DATAMNM%DATANN\M%$DATAN\NN&<$DATANNN\&uDATANON',DATAOO\N'lDATAO\OO'DATAOOO\'DATAOPO(,DATAPP\O(lDATAP\PP(DATAPPP\(CDATAPQP)L DATAQQ\P)CDATAQ\QQ),DATAQQQ\*\*DATAQRQ*DATARR\Q+ DATAR\RR+\DATARRR\, LDATARSR,DATASS\R,DATAS\SS-,DATASSS\-l5DATASTS-5DATATT\S.,7DATAT\TT.*DATATTT\..DATATUT/LZDATAUU\T/DATAU\UU0DATAUUU\0lDATAUVU0mDATAVV\U1LDATAV\VV1DATAVVV\1DATAVWV2 DATAWW\V2LDATAW\WW2DATAWWW\2DATAWXW3 DATAXX\W3LDATAX\XX3MDATAXXX\4 DATAXYX4LDATAYY\X4DATAY\YY4DATAYYY\5 DATAYZY5LDATAZZ\Y5DATAZ\ZZ5DATAZZZ\6 DATAZ[Z6LDATA[[\Z6DATA[\[[6DATA[[[\7 DATA[\[7L:DATA\\\[7SDATA\\\\8<DATA\\\\8|DATA\]\8DATA]]\\8DATA]\]]9< DATA]]]\9|"DATA]^]9DATA^^\]: DATA^\^^:<@DATA^^^\:DATA^_^: DATA__\^;DATA_\__;L?DATA___\; DATA_`_;4DATA``\_<\4DATA`\``< DATA```\= $DATA`a`=\DATAaa\`=#DATAa\aa= DATAaaa\>, DATAaba>l DATAbb\a> DATAb\bb>DATAbbb\?, DATAbcb?l DATAcc\b? DATAc\cc? DATAccc\@,DATAcdc@lDATAdd\c@DATAd\dd@DATAddd\ALDATAdedA]DATAee\dBDATAe\eeBlDDATAeee\BDATAefeCDATAff\eCl DATAf\ffC DATAfff\C DATAfgfD, DATAgg\fDl@DATAg\ggDDATAggg\E DATAghgELDATAhh\gE|?DATAh\hhEDATAhhh\F,DATAhihFl DATAii\hFDATAi\iiFDATAiii\GDATAijiG\-DATAjj\iGDATAj\jjH DATAjjj\HLDATAjkjHDATAkk\jHDATAk\kkI DATAkkk\ILDATAklkIDATAll\kIDATAl\llJDATAlll\JlDATAlmlJDATAmm\lJDATAm\mmK<DATAmmm\K|DATAmnmKDATAnn\mL $DATAn\nnL\$DATAnnn\L-DATAnonM DATAoo\nMLDATAo\ooM&DATAooo\MDATAopoN,DATApp\oNlDATAp\ppNDATAppp\N@DATApqpO\DATAqq\pODATAq\qqODATAqqq\O?DATAqrqPlDATArr\qPDATAr\rrP8DATArrr\QlDATArsrQDATAss\rQDATAs\ssR,%DATAsss\R|!DATAstsRDATAtt\sS DATAt\ttS\!DATAttt\SDATAtutSDATAuu\tT,DATAu\uuTlDATAuuu\TDATAuvuU DATAvv\uULDATAv\vvU%DATAvvv\UDATAvwvVDATAww\vV\DATAw\wwV7DATAwww\VDATAwxwW<DATAxx\wW|DATAx\xxW DATAxxx\XUDATAxyxXDATAyy\xX>DATAy\yyY\DATAyyy\YDATAyzyY'DATAzz\yZ<'DATAz\zzZ'DATAzzz\Z'DATAz{z[, DATA{{\z[lDATA{\{{[DATA{{{\[DATA{|{\L+DATA||\{\+DATA|\||] +DATA|||\]l DATA|}|]DATA}}\|]DATA}\}}^L+DATA}}}\^+DATA}~}_ +DATA~~\}_l DATA~\~~_DATA~~~\_GDATA~~`lDATA\~`DATA\` DATA\aLDATAaDATA\aDATA\b<DATA\b|"DATAb8DATA\c<XDATA\cDATA\d DATAdLDATA\d7DATA\dDATA\e)DATAe|+DATA\e DATA\f DATA\f\DATAfDATA\fDATA\gDATA\glHDATAgDATA\h<GDATA\hDATA\h DATAi<6DATA\i*DATA\i>DATA\jlRDATAjDATA\k<DATA\k|DATA\kDATAk!DATA\l<DATA\ll%DATA\l-DATAm DATA\m\#DATA\mDATA\m#DATAnL*DATA\nDATA\nDATA\o<DATAogDATA\p?DATA\pTDATA\q 2DATAqlDATA\q6DATA\r /DATA\rlODATAr DATA\s<#DATA\s DATA\sDATAt *DATA\tlDATA\t,DATA\u DATAu<+DATA\uDATA\uDATA\v DATAvLDATA\v| DATA\vDATA\v@DATAw\DATA\wDATA\wDATA\w?DATAxlDATA\xDATA\xDATA\y,DATAylDATA\y DATA\y DATA\z,DATAz\DATA\zDATA\z DATA\{ DATA{\)DATA\{DATA\{DATA\|<DATA||DATA\|DATA\} DATA\}L!DATA}GDATA\~ .DATA\~laDATA\~DATALDATA\ DATA\DATA\,DATAlDATA\DATA\DATA\LDATA'DATA\'DATA\,'DATA\|'DATA DATA\ DATA\\DATA\'DATA'DATA\<'DATA\'DATA\ DATADATA\\DATA\DATA\+DATA\+DATA\+DATA\ DATA\\DATADATA\+DATA\\+DATA\+DATA DATA\\DATA\DATA\$DATA,(DATA\DATA\6DATA\,6DATA DATA\DATA\ DATA\LDATA DATA\DATA\,DATA\l8DATADATA\3DATA\|5DATA\=DATAL;DATA\ DATA\DATA\< DATA|DATA\DATA\!DATA\<DATAlDATA\<DATA\,;DATA\ DATA!DATA\<3DATA\%DATA\DATA,4DATA\DATA\DATA\DATA<DATA\lDATA\5DATA\DATAL"DATA\=DATA\ ADATA\|DATADATA\ DATA\L DATA\DATADATA\ DATA\</DATA\ DATADATA\ DATA\\DATA\DATADATA\<DATA\| DATA\#DATA -DATA\lDATA\6DATA\ DATA\DATA\ DATA\DATA\ DATA\=DATA\ DATA\ DATA\<DATADATA\#DATA\DATA\\DATADATA\DATA\<DATA\|DATADATA\DATA\L(DATA\ DATADATA\DATA\lDATA\ DATA DATA\<DATA\|DATA\DATADATA\,DATA\|DATA\DATADATA\LDATA\DATA\%DATA ,DATA\l!DATA\ DATA\#DATALDATA\#DATA\DATA\%DATAlDATA\DATA\DATA\<(DATA!DATA\DATA\,DATA\|$DATADATA\ KDATA\DATA\DATA DATA\LDATA\-DATA\@DATA\DATA\DATA\8DATA\lDATA DATA\DATA\<,DATA\DATA+DATA\,DATA\œl+DATAœ\%DATAœDATA\L(DATA\Ü2DATAÜ\ 6DATAÜlDATA\&DATA\ĜDATAĜ\LDATAĜDATA\DATA\Ŝ DATAŜ\< DATAŜ|DATA\ADATA\ƜDATAƜ\LDATAƜDATA\BDATA\ǜ,DATAǜ\lDATAǜDATA\DATA\Ȝ,DATAȜ\lDATAȜDATA\DATA\ɜ,DATAɜ\lDATAɜDATA\DATA\ʜ,DATAʜ\lDATAʜDATA\DATA\˜,DATA˜\l DATA˜ DATA\ DATA\̜, DATA̜\lDATA̜DATA\DATA\͜,DATA͜\lDATA͜DATA\ DATA\Μ, DATAΜ\l DATAΜDATA\DATA\Ϝ,DATAϜ\lDATAϜDATA\DATA\М,DATAМ\lDATAМDATA\DATA\ќ,DATAќ\lDATAќDATA\DATA\Ҝ,DATAҜ\lDATAҜ¬DATA\DATA\Ӝ,DATAӜ\lDATAӜìDATA\DATA\Ԝ,DATAԜ\\?DATAԜDATA\ DATA\՜<DATA՜\l?DATA՜DATA\DATA\֜L?DATA֜\ƼDATA֜DATA\,DATA\ל\?DATAל\ DATAל DATA\LDATA\؜Ȍ DATA؜\DATA؜ DATA\\DATA\ٜɜDATAٜ\?DATAٜ<DATA\lDATA\ڜʬDATAڜ\?DATAڜL DATA\ˌDATA\ۜ8DATAۜ\<6DATA̜ۜ5DATA\DATA\ܜ<2DATAܜ\͜DATAܜDATA\,DATA\ݜlDATAݜ\άDATAݜDATA\,DATA\ޜ|<DATAޜ\DATAޜ,,DATA\ЌDATA\ߜ9DATAߜ\L?DATAߜѼ*DATA\DATA\l7DATA\!DATA>DATA\ӌDATA\ADATA\<DATAlDATA\Ԭ!DATA\@DATA\l@DATADATA\,DATA\lDATA\ּADATA,DATA\lDATA\׬ DATA\DATA, DATA\lDATA\جDATA\DATA,DATA\|DATA\ټDATA\ DATA< DATA\|;DATA\0DATA\LNDATADATA\ @DATA\|ODATA\$DATALDATA\|0DATA\QDATA\\DATAޜ)DATA\DATA\<DATA\|DATADATA\DATA\lDATA\DATA DATA\\DATA\ DATA\DATA,DATA\lDATA\DATA\DATA<$DATA\MDATA\ DATA\L DATAKDATA\ DATA\<DATA\ DATA5DATA\,DATA\|2DATA\DATA,DATA\lDATA\DATA\:DATA\5DATA\DATA\ $DATA\\+DATADATA\DATA\<DATA\|DATADATA\DATA\<$DATA\ DATA DATA\ DATA\LDATA\DATADATA\DATA\<*DATA\0DATA,DATA\\DATA\DATA\DATA$DATA\<+DATA\+DATA\'DATAL+DATA\+DATA\ DATA\\+DATA+DATA\DATA\\!DATA\DATA"DATA\,&DATA\|DATA\DATA DATA\\DATA\DATA\DATA,:DATA\<DATA\ /DATA\lDATADATA\*DATA\<1DATA\?DATA DATA\<DATA\|ADATA\PDATAl@DATA\QDATA\\CDATA\DATA$DATA\LIDATA\7DATA\,DATAlDATA\ DATA\ ;DATA\|(DATA(DATA\<)DATA\DATA\ DATA DATA\\DATA\ DATA\ DATADATA\\DATA\DATA\DATA,*DATA\,DATA\ DATA\,DATA|DATA\DATA\DATA\l6DATADATA\ DATA\LDATA\DATA  DATA  \0DATA \  \(DATA   \DATA    DATA  \ <DATA \  l@DATA   \DATA    DATA  \ LDATA \  |?DATA   \DATA   ,DATA  \ l DATA \  DATA   \"DATA    L DATA  \  DATA \   DATA   \ DATA   lDATA\  DATA\ DATA\ \DATA DATA\ DATA\ LDATA\ DATA DATA\ <DATA\ DATA\ #DATA,DATA\lDATA\DATA\DATA<DATA\|DATA\ DATA\DATAlDATA\4DATA\DATA\lDATA DATA\ DATA\<"DATA\7DATA6DATA\LDATA\DATA\&DATA, DATA\l*DATA\7DATA\,6DATADATA\DATA\,DATA\|DATADATA\DATA\,DATA\lDATADATA\ DATA\<DATA\5DATA8DATA\\>DATA\=DATA\<1DATA.DATA\DATA\,DATA\l DATADATA\DATA\<DATA\| DATADATA\ DATA\L"DATA\=DATA DATA\\DATA\DATA\DATA< DATA\|DATA\!DATA\ DATA  \ DATA  \ $DATA \   3DATA   \!LDATA ! !DATA!!\ !DATA!\!!"<DATA!!!\"|DATA!"!"DATA""\!" DATA"\""#<DATA"""\#|+DATA"#"#DATA##\"$,DATA#\##$|DATA###\$ DATA#$#$DATA$$\#%,ADATA$\$$%DATA$$$\% DATA$%$&, DATA%%\$&lDATA%\%%&BDATA%%%\'DATA%&%'\<DATA&&\%'(DATA&\&&(,(DATA&&&\()DATA&'&(DATA''\&)ADATA'\'')DATA'''\) DATA'('* DATA((\'*\DATA(\((*BDATA(((\+ (DATA()(+l$DATA))\(+DATA)\))+DATA)))\,<DATA)*),| DATA**\), DATA*\**- DATA***\-l"DATA*+*- DATA++\*. DATA+\++.\LDATA+++\.DATA+,+/ ADATA,,\+/|DATA,\,,/ DATA,,,\0 DATA,-,0LDATA--\,0CDATA-\--0#DATA---\1LDATA-.-1#DATA..\-1DATA.\..2,DATA...\2l#DATA./.2DATA//\.3 DATA/\//3L-DATA///\3-DATA/0/4 DATA00\/4LPDATA0\004DATA000\4DATA0105< DATA11\05DATA1\115PDATA111\6LDATA1216DATA22\16DATA2\227 DATA222\7LDATA2327DATA33\27DATA3\338 DATA333\8LGDATA3438DATA44\38 DATA4\449<DATA444\9lADATA4549DATA55\4:, DATA5\55:l DATA555\:DATA565:BDATA66\5;\DATA6\66;EDATA666\< DATA676\DATA898> DATA99\8>DATA9\99?,DATA999\?lDATA9:9?DATA::\9?DATA:\::@L2DATA:::\@5DATA:;:A DATA;;\:ALDATA;\;;A|DATA;;;\A2DATA;<;B,6DATA<<\;BDATA<\<<BDATA<<<\BDATA<=<C,ADATA==\<CDATA=\==C DATA===\D DATA=>=D\DATA>>\=DBDATA>\>>E DATA>>>\E\ DATA>?>ERDATA??\>FDATA?\??F\DATA???\FDATA?@?F(DATA@@\?GL DATA@\@@GDATA@@@\GDATA@A@H ADATAAA\@H|DATAA\AAH DATAAAA\I DATAABAILDATABB\AIBDATAB\BBI&DATABBB\JL'DATABCBJ/DATACC\BJDATAC\CCK,DATACCC\KlDATACDCK DATADD\CK DATAD\DDLDATADDD\LLDATADEDL&DATAEE\DLDATAE\EEM, DATAEEE\Ml DATAEFEMDATAFF\EN DATAF\FFN< DATAFFF\N|DATAFGFN DATAGG\FN DATAG\GGO<DATAGGG\O|DATAGHGODATAHH\GP DATAH\HHPLDATAHHH\P|DATAHIHP4DATAII\HQ,*DATAI\IIQDATAIII\Q6DATAIJIR,DATAJJ\IRlDATAJ\JJRDATAJJJ\RDATAJKJS,DATAKK\JSl DATAK\KKS*DATAKKK\T DATAKLKT<DATALL\KT|'DATAL\LLTDATALLL\U DATALMLUL,DATAMM\LUDATAM\MMU7DATAMMM\VL!DATAMNMVDATANN\MV"DATAN\NNWDATANNN\W\DATANONWDATAOO\NWDATAO\OOX,.DATAOOO\XMDATAOPOY DATAPP\OYLDATAP\PPY|DATAPPP\YDATAPQPZ DATAQQ\PZLDATAQ\QQZ DATAQQQ\ZDATAQRQ[ GDATARR\Q[|9DATAR\RR[2DATARRR\\LDATARSR\ DATASS\R\&DATAS\SS],ADATASSS\]%DATASTS]DATATT\S^<DATAT\TT^|DATATTT\^DATATUT^DATAUU\T_,DATAU\UU_|DATAUUU\_DATAUVU_8DATAVV\U`l%DATAV\VV`)DATAVVV\aDATAVWValDATAWW\Va DATAW\WWa DATAWWW\b<DATAWXWb|3DATAXX\Wb>DATAX\XXcLDATAXXX\c>DATAXYXc!DATAYY\XdL*DATAY\YYdDATAYYY\dPDATAYZYelvDATAZZ\Yf DATAZ\ZZfL^DATAZZZ\fBDATAZ[ZgLHDATA[[\Zg.DATA[\[[h,DATA[[[\hlNDATA[\[h DATA\\\[i,"DATA\\\\i|EDATA\\\\iDATA\]\j<DATA]]\\jlDATA]\]]jDATA]]]\jDATA]^]k,DATA^^\]klDATA^\^^kDATA^^^\l DATA^_^lL"DATA__\^l"DATA_\__lDATA___\mDATA_`_mlDATA``\_mDATA`\``mDATA```\n,DATA`a`nlDATAaa\`n0DATAa\aao DATAaaa\oL DATAabaoQDATAbb\ap DATAb\bbp\eDATAbbb\p,DATAbcbqL DATAcc\bqDATAc\ccqDATAccc\r,?DATAcdcrODATAdd\cs DATAd\dds\ DATAddd\s DATAdedsDATAee\dt DATAe\eetLDATAeee\t| DATAefetKDATAff\eu<DATAf\ffu|DATAfff\uDATAfgfuDATAgg\fv<DATAg\ggv|DATAggg\vDATAghgvIDATAhh\gw|DATAh\hhw*DATAhhh\x DATAhihxL#DATAii\hxDATAi\iixDATAiii\y,%DATAijiy|DATAjj\iySDATAj\jjz<DATAjjj\z| DATAjkjzDATAkk\jzADATAk\kk{\DATAkkk\{ DATAklk{ DATAll\k|,DATAl\ll|lBDATAlll\|DATAlml},CDATAmm\l}9DATAm\mm~ 1DATAmmm\~l%DATAmnm~DATAnn\m~DATAn\nn,DATAnnn\lDATAnonDATAoo\n&DATAo\oo,DATAooo\|DATAopo DATApp\o DATAp\ppL'DATAppp\DATApqpDATAqq\p,DATAq\qq|DATAqqq\DATAqrq!DATArr\qLDATAr\rrDATArrr\DATArsrDATAss\rL7DATAs\ss"DATAsss\DATAsts<0DATAtt\seDATAt\tt,DATAttt\lDATAtut DATAuu\tDATAu\uuLDATAuuu\DATAuvuDATAvv\uDATAv\vvl DATAvvv\*DATAvwv DATAww\vL@DATAw\wwDATAwww\ DATAwxw<'DATAxx\w!DATAx\xxDATAxxx\DATAxyxlDATAyy\xDATAy\yyDATAyyy\,DATAyzy\ DATAzz\yDATAz\zzDATAzzz\<DATAz{z| DATA{{\zDATA{\{{DATA{{{\,jDATA{|{DATA||\{DATA|\||lDATA|||\3DATA|}| DATA}}\|\DATA}\}}DATA}}}\DATA}~}6DATA~~\}\DATA~\~~DATA~~~\6DATA~~,#DATA\~|"DATA\.DATA\,.DATADATA\DATA\ DATA\\ DATADATA\DATA\<DATA\lDATA%DATA\ ;DATA\|DATA\DATADATA\<DATA\|DATA\DATADATA\<DATA\|DATA\fDATALDATA\DATA\DATA\DATALDATA\2DATA\DATA\,DATA\DATA\DATA\DATA\ DATAlDATA\DATA\ >DATA\|>DATACDATA\\CDATA\9DATA\<DATAlDATA\DATA\DATA\DATA\ DATA\ DATA\*DATA\\DATA$DATA\DATA\DATA\\0DATAODATA\<DATA\lDATA\DATA DATA\,DATA\\DATA\DATADATA\,5DATA\5DATA\5DATALDATA\DATA\DATA\,DATA|DATA\DATA\DATA\,DATA| DATA\DATA\DATA\<ADATADATA\DATA\,5DATA\DATA5DATA\< DATA\|DATA\DATA DATA\L8DATA\%DATA\ DATALDATA\|DATA\DATA\DATA<DATA\l+DATA\6DATA\,DATAl6DATA\,DATA\,DATA\lDATADATA\#DATA\LDATA\3DATADATA\<#DATA\BDATA\&DATALDATA\|'DATA\DATA\ DATALDATA\DATA\+DATA\<+DATA+DATA\#DATA\L DATA\ DATADATA\4DATA\|4DATA\4DATA<DATA\DATA\DATA\ DATA<4DATA\DATA\DATA\ DATALDATA\DATA\DATA\ DATAL$DATA\DATA\DATA\,DATA\DATA\DATA\ DATA\L$DATADATA\DATA\<:DATA\DATA2DATA\\ DATA\DATA\DATA<.DATA\7DATA\DATA\,%DATA|5DATA\BDATA\LDATA\œVDATADATA\lDATA\üUDATA\<@DATAĬDATA\DATA\<DATA\ŌDATADATA\,DATA\| DATA\ƼDATA DATA\\DATA\Ǭ DATA\DATA<DATA\|JDATA\LDATA\|LDATADATA\LZDATA\DATA\,:DATA˜-DATA\7DATA\\*DATA\̼ DATA DATA\<DATA\| DATA\ͼ%DATA $DATA\\DATA\ΌDATA\_DATA\DATA\ϬDATA\>DATA\L-DATAЬDATA\DATA\DATA\lBDATA,DATA\<DATA\|DATA\Ҽ:DATA,HDATA\ӬDATA\%DATA\LDATAԜDATA\%DATA\<DATA\ՌADATA DATA\L DATA\֜DATA\EDATA\GDATA\DATA\ DATA\\DATAجBDATA\BDATA\ٌMDATA\ DATA\MDATA\DATA\,@DATA\ۜ2DATAgDATA\܌hDATA\,DATA\lLDATADATA\<[DATA\dDATA\\DATAߌDATA\DATA\DATA\l DATADATA\0DATA\LDATA\9DATADATA\<DATA\9DATA\DATALRDATA\DATA\DATA\lDATADATA\ DATA\<9DATA\_DATA<DATA\&DATA\DATA\,DATA|DATA\DATA\œ #DATAœ\\DATAœDATA\DATA\Ü<DATAÜ\|DATAÜ:DATA\<!DATA\Ĝ&DATAĜ\DATAĜ,DATA\l DATA\ŜDATAŜ\:DATAŜlDATA\SDATA\Ɯ<DATAƜ\/DATAƜ DATA\,:DATA\ǜbDATAǜ\,DATAǜ|/DATA\DATA\Ȝ,DATAȜ\|#DATAȜDATA\ DATA\ɜLDATAɜ\3DATAɜDATA\<DATA\ʜDATAʜ\DATAʜ 0DATA\lDATA\˜DATA˜\DATA˜,\DATA\DATA\̜ DATA̜\<DATA̜|DATA\?DATA\͜,DATA͜\\DATA͜DATA\DATA\Μ, DATAΜ\lDATAΜBDATA\DATA\Ϝ\)DATAϜ\,DATAϜDATA\\DATA\МDATAМ\DATAМ<"DATA\DATA\ќDATAќ\ DATAќLDATA\|DATA\Ҝ DATAҜ\DATAҜ<DATA\|DATA\Ӝ DATAӜ\!DATAӜlDATA\DATA\Ԝ'DATAԜ\<DATAԜlDATA\)DATA\՜ DATA՜\<DATA՜DATA\DATA\֜ DATA֜\LDATA֜ DATA\DATA\ל (DATAל\l(DATAל(DATA\,(DATA\؜ DATA؜\DATA؜ DATA\\DATA\ٜDATAٜ\ DATAٜ< DATA\|DATA\ڜDATAڜ\DATAڜ\ DATA\ DATA\ۜDATAۜ\DATAۜ\'DATA\DATA\ܜDATAܜ\DATAܜ\'DATA\DATA\ݜDATAݜ\,DATAݜlDATA\DATA\ޜDATAޜ\ , DATAޜ lDATA\ (DATA\ߜ (DATAߜ\ l(DATAߜ (DATA\ , DATA\ lDATA\ DATA DATA\ LDATA\ DATA\ DATA DATA\ lDATA\ DATA\ DATAL DATA\DATA\DATA\ DATAL"DATA\1DATA\DATA\<DATADATA\DATA\ DATA\\DATADATA\DATA\,DATA\|DATADATA\DATA\<DATA\DATA DATA\DATA\\DATA\DATADATA\<DATA\DATA\DATADATA\\DATA\DATA\DATA,^DATA\DATA\DATA\,>DATADATA\DATA\ %DATA\\DATA%DATA\DATA\<DATA\DATADATA\DATA\lDATA\FDATA,DATA\|DATA\DATA\ DATA\DATA\DATA\ DATA\ DATAL&DATA\DATA\&DATA\,DATA|DATA\DATA\ DATA\ LDATA DATA\ DATA\!, DATA\!l DATA! DATA\! DATA\"< DATA\" DATA"DATA\# DATA\#lDATA\#DATA#DATA\$<DATA\$|DATA\$ DATA$ DATA\%< DATA\%| DATA\% DATA& DATA\&\DATA\&DATA\&DATA'LDATA\'DATA\'&DATA\(, DATA(l&DATA\(DATA\(\DATA\)DATA)\DATA\*\#DATA\*DATA\*DATA+< DATA\+|DATA\+HDATA\,LDATA,DATA\,DATA\-< DATA\-| DATA-DATA\-DATA\.,DATA\.\-DATA. DATA\.DATA\/<CDATA\/DATA/DATA\0DATA\0\+DATA\0.DATA1DATA\1lDATA\1&DATA\2 DATA2\;DATA\2DATA\3 $DATA\3\DATA3DATA\3DATA\4<"DATA\4&DATA4DATA\5,DATA\5|<DATA\5DATA6<4DATA\6DATA\6DATA\7,DATA7|9DATA\70DATA\8LDATA\8DATA8DATA\9 DATA\9<DATA\9ZDATA:DATA\:lDATA\:DATA\; DATA ;\DATA  \;HDATA \  <, DATA   \ %DATA \  >\DATA   \>DATA   >DATA  \ ?L1DATA \  ?3DATA   \@ 3DATA   @lDATA  \ @DATA \  @DATA   \ADATA  ALDATA\ A)DATA\ADATA\B<DATAB|DATA\BDATA\B DATA\C,DATAC\ADATA\CDATA\D DATA\D\ DATADDATA\DBDATA\ELDATA\EDATAEDATA\F,DATA\F|DATA\F(DATAG 7DATA\GlDATA\G<DATA\H,DATAH|DATA\HDATA\HDATA\I<DATAI DATA\I"DATA\JDATA\J\DATAJ DATA\J DATA\KDATA\KLDATAKDATA\KDATA\L DATA\LLDATALDATA\LDATA\MDATA\MlDATAMDATA\M DATA\N,DATA\NlDATANDATA\N DATA\O DATA\O\ DATAO DATA\O+DATA\P<+DATA\P DATAPDATA\Q ADATA\Q|DATA\Q DATAR DATA\RLDATA\RBDATA\RDATAS<DATA\SDATA\SDATA\T,DATATl DATA\TDATA\TDATA\ULMDATA UDATA  \V DATA \  VLDATA   \V DATA ! V DATA!!\ WDATA!\!!Wl DATA!!!\W!DATA!"!X BDATA""\!X| DATA"\""XDATA"""\X DATA"#"Y< DATA##\"Y| DATA#\##YDATA###\YDATA#$#ZLDATA$$\#ZDATA$\$$Z!DATA$$$\[,JDATA$%$[ DATA%%\$[ DATA%\%%\,DATA%%%\\l DATA%&%\DATA&&\%\DATA&\&&]<+DATA&&&\] DATA&'&]DATA''\&^DATA'\''^lDATA'''\^DATA'('^DATA((\'_LDATA(\((_DATA(((\_DATA()(` DATA))\(`LDATA)\))`!DATA)))\` DATA)*)aDATA**\)aLADATA*\**aDATA***\a DATA*+*b< DATA++\*b|DATA+\++bBDATA+++\c,*DATA+,+c%DATA,,\+cDATA,\,,d DATA,,,\dLDATA,-,d$DATA--\,dDATA-\--e,$DATA---\e|DATA-.-eDATA..\-eDATA.\..f,*DATA...\f2DATA./.fDATA//\.g,DATA/\//glDATA///\gDATA/0/g DATA00\/hDATA0\00h\ DATA000\h DATA010hDATA11\0iDATA1\11i\DATA111\iDATA121iDATA22\1j, DATA2\22jlDATA222\jDATA232jDATA33\2k<DATA3\33k|KDATA333\kDATA343lL DATA44\3l'DATA4\44l(DATA444\m< DATA454m|DATA55\4m&DATA5\55n'DATA555\nlDATA565n DATA66\5n DATA6\66o<7DATA666\o8DATA676p DATA77\6p\HDATA7\77pDATA777\q DATA787qLDATA88\7qDATA8\88qDATA888\q DATA898r< DATA99\8r|DATA9\99r4DATA999\s4DATA9:9s|DATA::\9sDATA:\::s!DATA:::\t<!DATA:;:tDATA;;\:t%DATA;\;;u"DATA;;;\ul"DATA;<;uDATA<<\;uDATA<\<<vDATA<<<\v4DATA<=<wLDATA==\<w4DATA=\==w+DATA===\xL DATA=>=x3DATA>>\=x+DATA>\>>yL4DATA>>>\y4DATA>?>z DATA??\>zLDATA?\??zDATA???\z4DATA?@?{<4DATA@@\?{DATA@\@@{ DATA@@@\| DATA@A@|L DATAAA\@|DATAA\AA| DATAAAA\|DATAABA}LDATABB\A}DATAB\BB}DATABBB\}ADATABCB~\DATACC\B~ DATAC\CC~ DATACCC\DATACDC\BDATADD\C#DATAD\DD?DATADDD\(DATADEDDATAEE\DDATAE\EE\ DATAEEE\ DATAEFEDATAFF\E)DATAF\FF|DATAFFF\DATAFGFDATAGG\FLDATAG\GG|#DATAGGG\DATAGHG %DATAHH\G\DATAH\HHDATAHHH\DATAHIHDATAII\H\ DATAI\II DATAIII\DATAIJI DATAJJ\I\DATAJ\JJ DATAJJJ\DATAJKJDATAKK\J\!DATAK\KKDATAKKK\DATAKLK, DATALL\Kl DATAL\LLDATALLL\"DATALML<!DATAMM\L"DATAM\MM1DATAMMM\</DATAMNM!DATANN\MDATAN\NN,!DATANNN\| DATANONDATAOO\N DATAO\OO\%DATAOOO\hDATAOPOLMDATAPP\ODATAP\PP DATAPPP\LDATAPQPDATAQQ\P DATAQ\QQ!DATAQQQ\l!DATAQRQ4DATARR\QHDATAR\RRDATARRR\6DATARSR<8DATASS\R DATAS\SSDATASSS\,DATASTS\DATATT\S DATAT\TTDATATTT\,&DATATUT| DATAUU\TDATAU\UUDATAUUU\,$DATAUVU|DATAVV\U%DATAV\VV DATAVVV\L:DATAVWV/DATAWW\VDATAW\WWLDATAWWW\ DATAWXW DATAXX\W DATAX\XXLDATAXXX\DATAXYXDATAYY\XDATAY\YY\DATAYYY\DATAYZYDATAZZ\Y<DATAZ\ZZDDATAZZZ\DATAZ[Z,>DATA[[\Z*DATA[\[[ DATA[[[\<DATA[\[|DATA\\\[DATA\\\\%DATA\\\\LTDATA\]\DATA]]\\~DATA]\]]DATA]]]\ YDATA]^]DATA^^\]DATA^\^^DATA^^^\L DATA^_^DATA__\^DATA_\__ 0DATA___\lDATA_`_DATA``\_'DATA`\``<)DATA```\DATA`a` DATAaa\`DATAa\aa\nDATAaaa\ DATAaba<DATAbb\a DATAb\bb DATAbbb\ DATAbcbLKDATAcc\b DATAc\cc DATAccc\L DATAcdc DATAdd\c-DATAd\dd, DATAddd\l4DATAdedDATAee\dDATAe\ee<DATAeee\|DATAefeDATAff\eDATAf\ffLDATAfff\|DATAfgf DATAgg\fDATAg\gg,ADATAggg\DATAghg DATAhh\g DATAh\hh\DATAhhh\BDATAhih DATAii\h\DATAi\iiDATAiii\DATAiji<"DATAjj\iDATAj\jjDATAjjj\ DATAjkj<DATAkk\j| DATAk\kkDATAkkk\ DATAklk\DATAll\kDATAl\ll=DATAlll\\?DATAlml>DATAmm\l<DATAm\mml DATAmmm\DATAmnm'DATAnn\mL DATAn\nnDATAnnn\DATAnon(DATAoo\n\"DATAo\oo"DATAooo\#DATAopoL#DATApp\o$DATAp\pp#DATAppp\<$DATApqp$DATAqq\p%DATAq\qq,"DATAqqq\|DATAqrqDATArr\qDATAr\rrDATArrr\\DATArsrDATAss\rDATAs\ss,DATAsss\lDATAstsDATAtt\sDATAt\ttLDATAttt\ DATAtut"DATAuu\t, DATAu\uul"DATAuuu\/DATAuvu*DATAvv\u|DATAv\vvDATAvvv\ADATAvwv\DATAww\v DATAw\ww DATAwww\DATAwxw\BDATAxx\wDATAx\xxDATAxxx\lDATAxyxDATAyy\xDATAy\yy,"DATAyyy\|DATAyzyDATAzz\yDATAz\zz,DATAzzz\l DATAz{zDATA{{\zDATA{\{{LDATA{{{\DATA{|{?DATA||\{LADATA|\||@DATA|||\,DATA|}|\$DATA}}\|¬'DATA}\}} DATA}}}\<DATA}~}lDATA~~\}ÜDATA~\~~DATA~~~\+DATA~~|DATA\~DATA\|DATA\ż#DATA DATA\<DATA\ƌDATA\DATADATA\\DATA\ǬDATA\DATALDATA\|DATA\ȼDATA\1DATA\DATA\ɌDATA\DATA\#DATAl/DATA\DATA\DATA\\DATA˜DATA\DATA\DATA\\%DATA̬0DATA\ DATA\\DATA\͜DATADATA\ #DATA\\DATA\Μ%DATADATA\<DATA\DATA\<DATAl DATA\мDATA\ %DATA\\/DATAѼDATA\ %DATA\\ DATA\Ҭ DATA%DATA\L#DATA\Ӝ DATA\%DATA<%DATA\Ԍ DATA\%DATA\,$DATA|DATA\%DATA\%DATA\lDATAּDATA\DATA\<#DATA\׌DATA%DATA\,DATA\lDATA\DATAl)DATA\DATA\%DATA\lDATAڼDATA\lDATA\ۼ-DATA\DATAl%DATA\ܼDATA\ DATA\ݼDATA (DATA\l DATA\޼%DATA\ #DATA\DATA\߬%DATA\DATA\LDATADATA\LDATA\DATA\%DATA,"DATA\|DATA\%DATA\ 'DATA\DATA\%DATA\DATA\<DATA%DATA\)DATA\<DATA\|%DATA DATA\ DATA\L"DATA\"DATA/DATA\L#DATA\DATA\DATA ADATA\|DATA\ DATA\ DATA<DATA\|BDATA\DATA\,$DATA|DATA\DATA\DATA\LDATADATA\DATA\ DATA\,DATA\DATA\DATA\DATA\ DATAL DATA\DATA\DATA\DATAL"DATA\DATA\#DATA\<DATAlDATA\&DATA\DATA\<&DATADATA\3DATA\,2DATA\6DATA>DATA\\7DATA\DATA\ DATA\&DATA\DATA\&DATA\<DATADATA\3DATA\,DATA\lDATADATA\DATA\<DATA\ DATA&DATA\%DATA\l&DATA\/DATADATA\\:DATA\3DATA\,DATA|DATA\&DATA\ 4DATA\lDATADATA\DATA\ DATA\L%DATADATA\%DATA\< DATA\|%DATA3DATA\,%DATA\| DATA\%DATA DATA\LDATA\%DATA\DATA,%DATA\|DATA\%DATA\ DATALDATA\1DATA\DATA\,%DATA|DATA\%DATA\ DATA\LDATA|DATA\8DATA\,DATA\|7DATA]DATA\lDATA\DATA\ DATA<6DATA\%DATA\DATA\,%DATA|DATA\DATA\DATA\LDATADATA\DATA\,DATA\lDATA DATA\ DATA\ L(DATA\ DATA DATA\ < DATA\ DATA\ DATA 4DATA\ \DATA\ 9DATA\ DATA ,4DATA\ DATA\ DATA\ DATA <DATA\ lDATA\ ADATA\ DATAL DATA\ DATA\DATA\ BDATA|DATA\#DATA\2DATA\|DDATADATA\,'DATA\|%DATA\DATADATA\<DATA\|DATA\DATADATA\DATA\l DATA\DATA DATA\,KDATA\DATA\dDATADATA\DATA\œ DATAœ\LDATAœDATA\EDATA\ÜLDATAÜ\(DATAÜDATA\<DATA\ĜDATAĜ\DATAĜ DATA\LDATA\ŜDATAŜ\*DATAŜLDATA\DATA\ƜDATAƜ\ DATAƜLDATA\DATA\ǜDATAǜ\,$DATAǜ|DATA\DATA\Ȝ DATAȜ\L'DATAȜDATA\DATA\ɜ DATAɜ\\DATAɜDATA\DATA\ʜ,%DATAʜ\|DATAʜDATA\ DATA\˜ \DATA˜\ DATA˜ DATA\!,1DATA\̜!DATA̜\!DATA̜"DATA\"\DATA\͜" DATA͜\".DATA͜#\\DATA\#DATA\Μ$<-DATAΜ\$DATAΜ$DATA\%,DATA\Ϝ%|DATAϜ\%DATAϜ& DATA\&\DATA\М&DATAМ\&DATAМ'<DATA\'|DATA\ќ' DATAќ\(DATAќ(lDATA\(DATA\Ҝ((DATAҜ\)\DATAҜ)DATA\) DATA\Ӝ*< DATAӜ\*|DATAӜ*DATA\*DATA\Ԝ+<DATAԜ\+lFDATAԜ+)DATA\,< DATA\՜,| DATA՜\,DATA՜- DATA\-l*DATA\֜-#DATA֜\.$DATA֜.l4DATA\.GDATA\ל/<<DATAל\/>DATAל0=DATA\0/DATA\؜03DATA؜\1L DATA؜1DATA\1 DATA\ٜ2,1DATAٜ\2DATAٜ2DATA\3.DATA\ڜ3|DATAڜ\3)DATAڜ4DATA\4l DATA\ۜ4DATAۜ\4DATAۜ5<DATA\5|DATA\ܜ5DATAܜ\6+DATAܜ6| DATA\6DATA\ݜ6DATAݜ\7<DATAݜ7|DATA\7DATA\ޜ8 DATAޜ\8\%DATAޜ8DATA\8DATA\ߜ9LDATAߜ\9(DATAߜ9DATA\:DATA\:l"DATA\:DATA:DATA\;<DATA\;|CDATA\;DATA<, DATA\<|DATA\< DATA\= )DATA=lDATA\=DATA\=&DATA\>L DATA> DATA\>DATA\>DATA\?LDATA?|GDATA\?DATA\@DATA\@\ DATA@DATA\@DATA\A DATA\A<ADATAADATA\A DATA\B, DATA\BlDATABBDATA\CDATA\C\?DATA\CDATACDATA\D<3DATA\DDATA\DDATAE DATA\E\&DATA\EDATA\E"DATAF,#DATA\F| DATA\F%DATA\G DATAGL8DATA\GDATA\GDATA\H<DATAHDATA\HDATA\H?DATA\IlDATAIDATA\IADATA\J<DATA\J DATAJ DATA\K DATA\KLCDATA\KDATAKDATA\L<DATA\L|DATA\L6DATAMDATA\M\DATA\MDATA\MDATANLDATA\N DATA\NDATA\ODATAOLDATA\O|ADATA\ODATA\P, DATAPl DATA\PDATA\PCDATA\Q\DATAQ DATA\QDATA\RDATA\R\ DATAR!DATA\RDATA\SDATA\S\DATASDATA\SDATA\T<DATA\TDATAT DATA\U DATA\U<DATA\UlDATAUADATA\V DATA\VL DATA\V DATAVDATA\W BDATA\W| DATA\WPDATAX<YDATA\XUDATA\YL4DATA\Y9DATAZ@DATA\ZCDATA\Z&DATA\[LDATA[|DATA\[DATA\\ DATA\\\DATA\DATA\\1DATA\],5DATA\]8DATA]DATA\^,DATA\^lDATA\^DATA^MDATA\_lDATA\_GDATA\` DATA`<DATA\`|ADATA\`DATA\a,kDATAa_DATA\b\DATA\b^DATA\c,]DATAcDATA\cDATA\dDATA\eDATAel?DATA\eaDATA\fltDATA\g fDATAgDATA\gDATA\h DATA\hLDATAi DATA\i<DATA\iJDATA\j DATAjLBDATA\jVDATA\k<\DATA\kGDATAl<*DATA\l>DATA\m >DATA\m|=DATA mMDATA  \nlJDATA \  nPDATA   \olDATA   oDATA  \ oDATA \  p,8DATA   \pDATA   p2DATA  \ q<DATA \  qlDATA   \qDATA   qDATA  \ r<DATA \  r|DATA   \rDATA   r DATA  \ s<DATA \  sDATA   \sDATA  t,DATA\ t|DATA\tDATA\u >DATAu|DATA\uDATA\u,DATA\v<RDATAvUDATA\w<DATA\wlDATA\wDATAwDATA\xKDATA\x:DATA\y QDATAybDATA\zYDATA\z\DATA\{<DATA{jDATA\|jDATA\}<dDATA\}WDATA~LDATA\~bDATA\,WDATA\DATADATA\DATA\lWDATA\dDATA|ZDATA\ 8DATA\|0DATA\DATA DATA\\DATA\DATA\DATADATA\\DATA\ DATA\DATA,DATA\lDDATA\DATA\,DATA|DATA\=DATA\,DATA\\DATA5DATA\8DATA\l:DATA\?DATALTDATA\DATA\bDATA\dDATAZDATA\8DATA\DATA\\7DATADATA\1DATA\LDATA\DATADATA\DATA\\DATA\DATA  DATA  \DATA \  lDATA   \DATA !  DATA!!\ LDATA!\!! DATA!!!\DATA!"!DATA""\!,DATA"\""lDATA"""\DATA"#"DATA##\"<DATA#\##|DATA###\DATA#$# DATA$$\#<DATA$\$$lDATA$$$\DATA$%$ 'DATA%%\$\ DATA%\%%DATA%%%\DATA%&%,DATA&&\%|'DATA&\&&DATA&&&\DATA&'&\IDATA''\& DATA'\''DATA'''\LDATA'('DATA((\'DATA(\((DATA(((\\DATA()(DATA))\($DATA)\)),$DATA)))\| DATA)*)DATA**\) DATA*\**L DATA***\2DATA*+*DATA++\*DATA+\++\DATA+++\/DATA+,+DATA,,\+<DATA,\,,lDATA,,,\ADATA,-, DATA--\,L DATA-\-- DATA---\DATA-.- BDATA..\-|DATA.\..DATA...\DATA./.LDATA//\.DATA/\//DATA///\ DATA/0/LDATA00\/DATA0\00DATA000\DATA010\DATA11\0DATA1\11DATA111\,DATA121lDATA22\1DATA2\22DATA222\<DATA232lADATA33\2DATA3\33, DATA333\l DATA343DATA44\3ADATA4\44\DATA444\1DATA454DATA55\4LDATA5\55DATA555\"DATA565,DATA66\5|DATA6\66DATA666\DATA676<'DATA77\6 DATA7\77DATA777\'DATA787lDATA88\7'DATA8\88DATA888\DATA898LDATA99\8DATA9\99DATA999\,DATA9:9\DATA::\9ADATA:\::DATA:::\L DATA:;: DATA;;\:DATA;\;; ADATA;;;\|DATA;<;DATA<<\;$DATA<\<<LDATA<<<\|DATA<=< DATA==\< DATA=\==\DATA===\ DATA=>=&DATA>>\=,DATA>\>>\ DATA>>>\DATA>?>DATA??\>, DATA?\??lDATA???\ DATA?@?"DATA@@\?L,DATA@\@@DATA@@@\5DATA@A@LDATAAA\@DATAA\AADATAAAA\ DATAABA<DATABB\AlADATAB\BBDATABBB\, DATABCBl DATACC\BDATAC\CCBDATACCC\\DATACDCDATADD\C&DATAD\DD<DATADDD\|"DATADEDDATAEE\DDATAE\EE,ADATAEEE\DATAEFE DATAFF\E, DATAF\FFlDATAFFF\BDATAFGFDATAGG\FlKDATAG\GGDATAGGG\,DATAGHGlDATAHH\GDATAH\HHDATAHHH\,DATAHIH|DATAII\HDATAI\II DATAIII\LDATAIJIDATAJJ\IDATAJ\JJ,DATAJJJ\l DATAJKJDATAKK\JDATAK\KK<DATAKKK\DATAKLKDATALL\KDATAL\LL\DATALLL\DATALMLDATAMM\L<DATAM\MM|DATAMMM\¼DATAMNMDATANN\M<DATAN\NN|DATANNN\ü DATANONDATAOO\N,ADATAO\OOĜDATAOOO\ DATAOPO DATAPP\O\DATAP\PPŜBDATAPPP\ DATAPQP\KDATAQQ\PDATAQ\QQDATAQQQ\\DATAQRQǜDATARR\QDATAR\RRDATARRR\\DATARSRȜDATASS\RDATAS\SSDATASSS\\DATASTSɬDATATT\SDATAT\TT<DATATTT\|DATATUTDATAUU\T DATAU\UULDATAUUU\˜DATAUVUDATAVV\U,DATAV\VVlDATAVVV\̼ DATAVWVDATAWW\V<DATAW\WW|DATAWWW\ͼDATAWXWDATAXX\WLDATAX\XXΜDATAXXX\ DATAXYX /DATAYY\XlDATAY\YYϬDATAYYY\DATAYZY,ADATAZZ\YМDATAZ\ZZ DATAZZZ\ DATAZ[Z\DATA[[\ZќBDATA[\[[ DATA[[[\L,DATA[\[Ҭ6DATA\\\[ DDATA\\\\|/DATA\\\\DATA\]\, DATA]]\\lDATA]\]]ԼDATA]]]\"DATA]^]LDATA^^\]Ռ DATA^\^^!DATA^^^\DATA^_^\ DATA__\^֜#DATA_\__DATA___\, DATA_`_lDATA``\_׼DATA`\``DATA```\L DATA`a`،DATAaa\` DATAa\aa!DATAaaa\l$DATAabaټWDATAbb\a<DATAb\bb|"DATAbbb\DATAbcb DATAcc\bLDATAc\ccۜDATAccc\DATAcdc< DATAdd\c|4DATAd\dd DATAddd\DATAdedl$DATAee\dݼ$DATAe\ee $DATAeee\\ DATAefeޜ!DATAff\e0DATAf\ffLDATAfff\ߌDATAfgf!DATAgg\f, DATAg\gglDATAggg\!DATAghg DATAhh\gL DATAh\hh/DATAhhh\!DATAhihL/DATAii\h!DATAi\ii/DATAiii\\!DATAiji!DATAjj\iEDATAj\jjlDATAjjj\'DATAjkj DATAkk\j<DATAk\kkEDATAkkk\ DATAklk<"DATAll\k+DATAl\ll)DATAlll\L DATAlmlDATAmm\l'DATAm\mm,"DATAmmm\| DATAmnm!DATAnn\m DATAn\nnL!DATAnnn\ DATAnonDATAoo\n,DATAo\oo|DATAooo\$DATAopo "DATApp\o\DATAp\ppDATAppp\DATApqp<DATAqq\p|$DATAq\qq"DATAqqq\DATAqrq\DATArr\qDATAr\rrDATArrr\LDATArsrDATAss\r DATAs\ss DATAsss\\DATAstsDATAtt\sDATAt\tt<DATAttt\| DATAtutDATAuu\t #DATAu\uu\DATAuuu\DATAuvuDATAvv\u,#DATAv\vv|(DATAvvv\DATAvwvDATAww\v\ DATAw\wwDATAwww\5DATAwxwLSDATAxx\w DATAx\xx DATAxxx\\?DATAxyx DATAyy\x ADATAy\yy|DATAyyy\>DATAyzy,DATAzz\y|DATAz\zz!DATAzzz\DATAz{z,DATA{{\z\DATA{\{{@DATA{{{\DATA{|{L DATA||\{DATA|\||@DATA|||\<DATA|}|l'DATA}}\|(DATA}\}}DATA}}}\L6DATA}~}>DATA~~\}DATA~\~~\%DATA~~~\%DATA~~DATA\~,3DATA\1DATA\3DATALDATA\4DATA\DATA\,DATAl DATA\DATA\ DATA\<DATADATA\9DATA\,DATA\l3DATADATA\ 'DATA\\DATA\8DATA&DATA\LDATA\DATA\DATA DATA\LCDATA\DATA\&DATA<DATA\l,DATA\DATA\ 'DATA\%DATA\DATA\DATA\, DATAlDATA\DATA\5DATA\LDATA|0DATA\?DATA\ LDATA\ |DATA DATA\ DATA\ <&DATA\ DATA DATA\ 4DATA\ lDATA\ DATA DATA\ DATA\ \DATA\ DATA cDATA\ \DATA\ DATA\ DATA $DATA\\DATA\3DATA\DATA<DATA\DATA\DATA\ "DATA\)DATA\DATA\ DATA\L)DATADATA\DATA\RDATA\DATADATA\ DATA\LDATA\|DATADATA\DATA\,%DATA\|DATADATA\RDATA\|[DATA\ TDATAPDATA\ QDATA\YDATA\YDATAMDATA\,XDATA\ZDATA\LPDATAQDATA\LVDATA\\DATA\\ODATADATA\,qDATA\nDATA\lnDATA nDATA\oDATA\ LnDATA\ mDATA!nDATA\",nDATA\"nDATA\#loDATA$ oDATA\$pDATA\%LlDATA\%lDATA&&DATA\&YDATA\'lXDATA\'XDATA(XDATA\)VDATA\)UDATA\*XDATA*^DATA\+<^DATA\+YDATA\,\UDATA,XDATA\-lXDATA\-RDATA\.|HDATA.rDATA\/pDATA\0<pDATA\0pDATA1|pDATA\2pDATA\2pDATA\3\jDATA3mDATA\4lDATA\5<lDATA\5sDATA6|jDATA\7mDATA\7DATA\7YDATA8XDATA\9XDATA\9WDATA\:,WDATA:VDATA\;,XDATA\;XDATA\|TDATA>TDATA\?|RDATA\?RDATA\@|RDATA@RDATA\A|RDATA\ARDATA\B|RDATABRDATA\C|RDATA\CRDATA\D|RDATADRDATA\E|RDATA\ERDATA\F|RDATAFRDATA\G|RDATA\GRDATA\H|RDATAHRDATA\I|RDATA\IRDATA\J|DATAK,DATA\KDATA\LDATA\M<yDATAMzDATA\N{DATA\OLxDATA\O|DATAPtDATA\QLqDATA\QDATA\RDATASLDATA\SDATA\TDATA\U\DATAV DATA\VDATA\WlDATA\XDATAXDATA\Y|pDATA\ZpDATA\ZpDATA[\pDATA\[nDATA\\mDATA\]<mDATA]lDATA\^|jDATA\_jDATA\_nDATA`\DATA`DATAx|#!BPY[DATA(\""" Registration info Blender menues:DATAName:'Sflender'DATABlender: 235DATA,Group: 'Export'DATA<lTip: 'S2flender(V2.4) Exporter to Macromedia(R) Flash(TM)'DATA"""DATA@ # -------------------------------------------------------------DATA,|# Copyright (c) 2003,2004 Emilio Aguirre DATA#DATAL # This program is free software; you can redistribute it and/or modifyDATAL# it under the terms of the GNU General Public License as published byDATAH # the Free Software Foundation; either version 2 of the License, orDATA,|# (at your option) any later version.DATA#DATAH # This program is distributed in the hope that it will be useful,5{DATAD|# but WITHOUT ANY WARRANTY; without even the implied warranty ofDATAD# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theDATA4\# GNU General Public License for more details.nDATA#DATAH# You should have received a copy of the GNU General Public LicenseDATAD\# along with this program; if not, write to the Free Software/DATAP# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USADATAL#DATA@|# -------------------------------------------------------------DATA@# -------------------------------------------------------------DATA\\# *This program is based on the Macromedia Flash SWF File Format Specification (version 3)DATAT# by Macromedia, Inc. Copyright(c) 1995-2003 Macromedia, Inc. All rights reserved. DATAPl# Macromedia and Flash are trademarks of Macromedia, Inc. (www.macromedia.com)DATA@# -------------------------------------------------------------DATA\DATAD# ---------------------------------------------------------------DATA# DATA,# Import SectionDATAl#pDATAD# --------------------------------------------------------------- DATA import BlenderDATALfrom os import listdirDATA8Œfrom Blender import Object,Lamp,Camera,NMesh,Types,sysDATA from Blender.Mathutils import *DATA<from Blender.Draw import *DATAÌfrom Blender.Types import *DATAfrom Blender.BGL import *DATA,from Blender.Noise import *DATA|from math import *DATA$ļfrom operator import add,sub,mulDATA from time import *DATALDATA|DATA@Ŭ# -------------------------------------------------------------DATA# Generic FunctionsDATA@\# -------------------------------------------------------------DATAdef MaxAbs(l):DATA  if len(l)>0:DATAL m = abs(l[0])DATAnj for i in l:DATA if abs(i)>m: m = abs(i)DATA  return mDATA\ else: return 0DATAȜDATAdef BitSgn(val):DATA  if val>0: return 0DATAL else: return 128DATAɌDATAɼdef Pad0(n):DATA return [0]*nDATA<DATAldef Pad1(n):DATAʬ return [1]*nDATADATAdef Padding(s):DATA\ if s<8: return Pad0(8-s)DATA ˬ d = s % 8DATA  if d == 0:DATA , return []DATAl else:DATA ̜ n = 8 - dDATA return Pad0(n)DATADATA(Ldef SetFileLength(movie,filelength):DATA͜ r = UI32(filelength)DATA movie[4] = r[0]DATA movie[5] = r[1]DATA\ movie[6] = r[2]DATAΜ movie[7] = r[3]DATA returnDATA DATA<def GetChars(list):DATA| k = 0DATAϬ l = 0DATA size = len(list)DATA numbytes = size/8DATA$\ if ((size % 8) >0): numbytes+=1DATAЬ bytes = Pad0(numbytes)DATA  byte = 0 DATA, for i in range(size):DATA l byte += list[i] * (2**(7-k)) DATAѼ k+=1DATA  if k>7:DATA, bytes[l]=chr(byte)DATA l byte = 0DATA Ҭ k = 0DATA l+=1DATA( if k>0 and k<8: bytes[l] = chr(byte)DATAl return bytesDATAӬDATAdef PadChars(l):DATA l.extend(Padding(len(l)))DATAl return GetChars(l)DATAԬDATA def GetBinary(number,digits=0):DATA, if digits == 0:DATAl maxbits = 1024DATAլ else:DATA maxbits = digitsDATA Bits = Pad0(maxbits) DATA\ idx = maxbits-1DATA(֜ while (((number/2)!=0) and (idx>=0)):DATA # Get modulusDATA, Bits[idx] = number % 2 DATA | number/=2DATA ׼ idx-=1DATA  if (number==1): Bits[idx]=1DATAL else: Bits[idx]=0DATA، if digits >0: return BitsDATA else: return Bits[idx:]DATA,DATA \def NBits(val): return len(val)DATA٬DATAdef InverseBits(l):DATA$ return map(lambda x:abs(x-1),l)DATAlDATAڜdef TwosComplement(val):DATA$ b = InverseBits(GetBinary(val))DATA< d = GetBinary(1,len(b))DATAی r = []DATAۼ c = 0DATA l = range(len(b))DATA, l.reverse()DATAl for i in l:DATAܬ s = b[i]+d[i]+cDATA if s == 2: DATA, r.append(0)DATA l c = 1DATAݬ else:DATA r.append(s)DATA  c = 0DATA\ r.reverse()DATA ޜ return rDATADATA@ # -------------------------------------------------------------DATA|# SWF ConstantsDATA@߼# -------------------------------------------------------------DATA,SOLID_FILL = 0DATAlLINEAR_GRADIENT_FILL = 16DATARADIAL_GRADIENT_FILL = 18DATA TILED_BITMAP_FILL = 64DATALCLIPPED_BITMAP_FILL = 65DATADATA#Place Object FlagsDATA PO_NAME = 32DATALPO_RATIO = 16DATAPO_COLOR_TRANS = 8DATAPO_MATRIX = 4DATA PO_CHAR_ID = 2DATA LPO_MOVE = 1DATA#Shape Object FlagsDATA SH_MOVE = 1DATA SH_FILL0 = 2DATALSH_FILL1 = 4DATASH_LINESTYLE = 8DATASH_NEWSTYLES = 16DATA #Button state flagsDATA LBT_HIT = 8DATA BT_DOWN = 4DATA BT_OVER = 2DATA  BT_UP = 1DATA0L#Buttons State transitions triggering actionsDATABT_IDLE_TO_OVERUP = 1DATABT_OVERUP_TO_IDLE = 2DATA,BT_OVERUP_TO_OVERDOWN = 4DATA|BT_OVERDOWN_TO_OVERUP = 8DATABT_OVERDOWN_TO_OUTDOWN = 16DATABT_OUTDOWN_TO_OVERDOWN = 32DATAlBT_OUTDOWN_TO_IDLE = 64DATABT_IDLE_TO_OVERDOWN = 128DATABT_OVERDOWN_TO_IDLE = 256DATA L#Font FlagsDATAFONT_HASLAYOUT = 128 DATAFONT_SHIFTJIS = 64DATA FONT_UNICODE = 32 DATALFONT_ANSI = 16 DATAFONT_WIDEOFFSETS = 8DATAFONT_WIDECODES = 4DATA FONT_ITALIC = 2DATALFONT_BOLD = 1DATA #Text FlagsDATATEXT_HASFONT = 8DATA TEXT_HASCOLOR = 4DATALTEXT_HASYOFFSET = 2DATATEXT_HASXOFFSET = 1DATADATA@# -------------------------------------------------------------DATAl# Basic Data TypesDATA@# -------------------------------------------------------------DATADATALdef UI8(val):DATA return chr(val)DATADATAdef UI16(val):DATA < """Return in little-endian"""DATA$ return chr(val%256),chr(val/256)DATADATA def UI32(val):DATA L """Return in little-endian"""DATA hi = UI16(val%65536)DATA lo = UI16(val/65536)DATA  return hi[0],hi[1],lo[0],lo[1]DATAlDATAdef REVUI32(v):DATA h2 = ord(v[0])DATA h1 = ord(v[1])DATA\ l2 = ord(v[2])DATA l1 = ord(v[3]) DATA0 return (((l1*256) + l2)*65536)+((h1*256) + h2)DATA<DATAldef UB(val,size=0):DATA v = GetBinary(val)DATA z = size - len(v)DATA , if z>0:DATAl r = Pad0(z)DATA r.extend(v)DATA  return rDATA, else:DATA\ return v DATADATAdef SB(val,size=0):DATA   if val>=0:DATAL r=[0]DATA | r.extend(GetBinary(abs(val)))DATA else: DATA r=[1]DATA(, r.extend(TwosComplement(abs(val)))DATA| z = size - len(r)DATA  if z>0:DATA if (val<0): v = Pad1(z)DATAL else: v = Pad0(z)DATA v.extend(r)DATA  return vDATA  else:DATA < return rDATA|DATAdef SI16(val):DATA r = GetChars(SB(val,16))DATA< return r[1],r[0]DATA|DATAdef SI32(val):DATA r = GetChars(SB(val,32))DATA< return r[3],r[2],r[1],r[0]DATA DATAdef FB(val,size=0):DATA midpos = 512DATA< maxbits= 1024DATA| if val>=0: r=[0]DATA else: r=[1] DATA DATA, #Create bit listDATAl Bits = Pad0(maxbits)DATA num = abs(val)DATADATA #Get integer partDATA\ intnum = abs(int(num))DATADATA #Get decimal partDATA  decnum = num - intnumDATALDATA0| # Get binary representation of integer partDATA idxI = midposDATA( while (((intnum/2)!=0) and (idxI>=0)):DATAl # Get modulusDATA Bits[idxI] = intnum % 2 DATA  intnum/=2DATA < idxI-=1DATA | if (intnum==1): Bits[idxI]=1DATA else: Bits[idxI]=0DATA DATA0< # Get binary representation of decimal partDATA idxD = midpos+1DATA( while (decnum>0.0 and idxD=1):DATA Bits[idxD] = 1DATA decnum-=1.0DATA, else:DATA\ Bits[idxD] = 0DATA  idxD+=1DATADATA   i = idxIDATAL while (i<=midpos):DATA r.extend([Bits[i]])DATA i+=1DATA i = 1DATA, while (i<=16):DATA l r.extend([Bits[i+midpos]])DATA i+=1DATA DATA z = size - len(r)DATA \ if z>0:DATA if (val<0): v = Pad1(z)DATA else: v = Pad0(z)DATA, v.extend(r)DATA l return vDATA else:DATA  return rDATA DATA Ldef IEEE_FIXED(val):DATA<  """This returns a memory representation of a float pointDATAD  according to the IEEE 32 bits flotating point representation.DATA l +- 1.x * 2^eDATA   where x is the matissa fieldDATA,  and e is the bias exponent (bias = 127)DATA \ DATA8  Memory out put: Bit 3 3222222 222211111111110000000000DATA,  1 0987654 321098765432109876543210DATA L Sign Bias MatissaDATA  exponent """DATA  midpos = 512DATA , maxbits= 1024DATA lDATA  #Create bit listDATA  Bits = Pad0(maxbits)DATA num = abs(val)DATA\DATA #Get integer partDATA intnum = int(num)DATA DATA< #Get decimal partDATA| decnum = num - intnumDATADATA0 # Get binary representation of integer partDATAL idxI = midposDATA( while (((intnum/2)!=0) and (idxI>=0)):DATA # Get modulusDATA Bits[idxI] = intnum % 2 DATA l intnum/=2DATA  idxI-=1DATA  if (intnum==1): Bits[idxI]=1DATA< else: Bits[idxI]=0DATA|DATA0 # Get binary representation of decimal partDATA  idxD = midpos+1DATA(L while (decnum>0.0 and idxD=1):DATA Bits[idxD] = 1DATA\ decnum-=1.0DATA else:DATA Bits[idxD] = 0DATA   idxD+=1DATALDATA| #Get exponentDATA  idx = 0DATA4 while ((idx> 1)DATA \ j = (midpos+1+(-1*exponent))DATA k = 1DATA l = 1DATA   byte = 0 DATAL for i in range(j,j+23):DATA  byte += Bits[i] * (2**(7-k)) DATA k+=1DATA  if k>7:DATA\ bytes[l]=byteDATA  byte = 0DATA  k = 0DATA l+=1DATA,L bytes[1] += ((biasExponent << 7) & 128)DATA$ # Return value in little-endianDATAD return [chr(bytes[3]),chr(bytes[2]),chr(bytes[1]),chr(bytes[0])] DATAlDATAdef FIXED(val):DATA midpos = 512DATA maxbits= 1024DATA\ if val>=0: r=[0]DATA else: r=[1] DATA DATA  #Create bit listDATAL Bits = Pad0(maxbits)DATA num = abs(val)DATADATA #Get integer partDATA< intnum = abs(int(num))DATA|DATA #Get decimal partDATA decnum = num - intnumDATA ,DATA0 \ # Get binary representation of integer partDATA  idxI = midposDATA(  while (((intnum/2)!=0) and (idxI>=0)):DATA!L # Get modulusDATA! Bits[idxI] = intnum % 2 DATA ! intnum/=2DATA " idxI-=1DATA "\ if (intnum==1): Bits[idxI]=1DATA" else: Bits[idxI]=0DATA"DATA0# # Get binary representation of decimal partDATA#| idxD = midpos+1DATA(# while (decnum>0.0 and idxD=1):DATA$ Bits[idxD] = 1DATA$ decnum-=1.0DATA%  else:DATA%< Bits[idxD] = 0DATA %| idxD+=1DATA% for i in range(31):DATA % r.extend([Bits[midpos-14+i]])DATA(&L return r[24:]+r[16:24]+r[8:16]+r[0:8]DATA&DATA&def RECT(x0,y0,x1,y1):DATA('  #Convert values from pixels to TWIPSDATA'\ xmin =x0*20DATA' xmax =x1*20DATA' ymin =y0*20DATA( ymax =y1*20DATA(\ #Number of bits per valueDATA4( nbits = NBits(SB(MaxAbs([xmin,xmax,ymin,ymax])))DATA)  #Create struct RECTDATA)L r = []DATA)| r = UB(nbits,5)DATA) r.extend(SB(xmin,nbits))DATA*  r.extend(SB(xmax,nbits))DATA*\ r.extend(SB(ymin,nbits))DATA* r.extend(SB(ymax,nbits))DATA * return rDATA+<DATA$+ldef MATRIX(sx,sy,rot0,rot1,tx,ty):DATA+ r = []DATA+ hasscale = 0DATA,, hasrotate = 0DATA(,l if (sx!=1.0 or sy!=1.0): hasscale = 1DATA,, if (rot0!=0.0 or rot1!=0.0): hasrotate = 1DATA- r = [hasscale]DATA-\ if (hasscale==1):DATA,- nScaleBits =NBits(FB(MaxAbs([sx,sy])))DATA - r.extend(UB(nScaleBits,5))DATA .L r.extend(FB(sx,nScaleBits))DATA . r.extend(FB(sy,nScaleBits))DATA. r.extend([hasrotate])DATA/, if (hasrotate==1):DATA0/l nRotateBits = NBits(FB(MaxAbs([rot0,rot1])))DATA / r.extend(UB(nRotateBits,5))DATA$0 r.extend(FB(rot0,nRotateBits))DATA$0l r.extend(FB(rot1,nRotateBits))DATA00 nTranslateBits = NBits(SB(MaxAbs([tx,ty])))DATA 1 r.extend(UB(nTranslateBits,5))DATA$1l r.extend(SB(tx,nTranslateBits))DATA$1 r.extend(SB(ty,nTranslateBits))DATA 2  return rDATA2LDATA2|def RGB(r,g,b):DATA 2 return [chr(r),chr(g),chr(b)]DATA3 DATA3<def RGBn(r,g,b):DATA,3| return [chr(r*255),chr(g*255),chr(b*255)] DATA3DATA4 def RGBA(r,g,b,a):DATA(4L return [chr(r),chr(g),chr(b),chr(a)]DATA4DATA4def RGBAn(r,g,b,a):DATA85  return [chr(r*255),chr(g*255),chr(b*255),chr(a*255)]DATA5l DATA,5def CXFORM(rmul,gmul,bmul,radd,gadd,badd):DATA5 hasmult = 0DATA 6< hasadd = 0DATA46| if (rmul!=0 or gmul!=0 or bmul!=0): hasmult = 1DATA06 if (radd!=0 or gadd!=0 or badd!=0): hasadd = 1DATA7< r = [hasadd,hasmult]DATA@7| nbits = NBits(SB(MaxAbs([rmul,gmul,bmul,radd,gadd,badd])))DATA7 r.extend(UB(nbits,4))DATA8, if (hasmult>0):DATA8l r.extend(SB(rmul,nbits))DATA8 r.extend(SB(gmul,nbits))DATA9  r.extend(SB(bmul,nbits))DATA9\ if (hasadd>0):DATA9 r.extend(SB(radd,nbits))DATA9 r.extend(SB(gadd,nbits))DATA:< r.extend(SB(badd,nbits))DATA : return r DATA:DATA@:def CXFORMWITHALPHA(rmul,gmul,bmul,amul,radd,gadd,badd,aadd):DATA;l hasmult = 0DATA ; hasadd = 0DATA<; if (rmul!=0 or gmul!=0 or bmul!=0 or amul!=0): hasmult = 1DATA<<\ if (radd!=0 or gadd!=0 or badd!=0 or aadd!=0): hasadd = 1DATA< r = [hasadd,hasmult]DATAH=  nbits = NBits(SB(MaxAbs([rmul,gmul,bmul,amul,radd,gadd,badd,aadd])))DATA=| r.extend(UB(nbits,4))DATA= if (hasmult>0):DATA= r.extend(SB(rmul,nbits))DATA>L r.extend(SB(gmul,nbits))DATA> r.extend(SB(bmul,nbits))DATA> r.extend(SB(amul,nbits))DATA?< if (hasadd>0):DATA?| r.extend(SB(radd,nbits))DATA? r.extend(SB(gadd,nbits))DATA@ r.extend(SB(badd,nbits))DATA@l r.extend(SB(aadd,nbits))DATA @ return rDATA@DATAA,def STRING(s):DATAAl r = []DATA(A for i in range(len(s)): r.append(s[i])DATAA r.append(chr(0))DATA B, return rDATABlDATA@B# -------------------------------------------------------------DATAC # Core Data TypesDATA@CL# -------------------------------------------------------------DATA Cdef GRADRECORD(ratio,color):DATAD  r = [chr(ratio)]DATADL if (len(color)>3):DATA8D r.extend(RGBA(color[0],color[1],color[2],color[3]))DATAD else:DATA,E r.extend(RGB(color[0],color[1],color[2]))DATA E| return rDATAEDATA$Edef GRADIENT(NumGradients,records):DATAF< r = [chr(NumGradients)]DATAF for i in records:DATAF r.extend(i)DATA G  return r DATAGL DATA0G|def FILLSTYLE(type,param1=None,param2=None):DATAG r = [chr(type)]DATAH if type == SOLID_FILL:DATAH\ if len(param1)>3:DATA<H r.extend(RGBA(param1[0],param1[1],param1[2],param1[3]))DATAI  else:DATA0I< r.extend(RGB(param1[0],param1[1],param1[2]))DATAHI elif (type == LINEAR_GRADIENT_FILL or type == RADIAL_GRADIENT_FILL):DATA\J  r.extend(PadChars(MATRIX(param1[0],param1[1],param1[2],param1[3],param1[4],param1[5])))DATA,J r.extend(GRADIENT(param2[0],param2[1]))DATADJ elif (type == TILED_BITMAP_FILL or type == CLIPPED_BITMAP_FILL):DATAKl r.extend(UI16(param1))DATA\K r.extend(PadChars(MATRIX(param2[0],param2[1],param2[2],param2[3],param2[4],param2[5])))DATA LL return rDATALDATA Ldef FILLSTYLEARRAY(fillstyles):DATAM  count = len(fillstyles)DATAM\ r = []DATAM if count>=255:DATAM r = [UI16(count)]DATAN  else:DATAN< r.extend(UI8(count))DATAN| for i in fillstyles:DATAN r.extend(i)DATA N return rDATAO<DATAOldef LINESTYLE(width,color):DATAO # Width in TWIPSDATAO w = UI16(width*10)DATAP< r = [w[0],w[1]]DATAP| # Color valueDATAP if (len(color)>3):DATA8P r.extend(RGBA(color[0],color[1],color[2],color[3]))DATAQ\ else:DATA,Q r.extend(RGB(color[0],color[1],color[2]))DATA Q return rDATAR, DATA R\def LINESTYLEARRAY(linestyles):DATAR count = len(linestyles)DATAR r = []DATA(S, if count>255: r.extend(UI16(count))DATAS| else: r.extend(UI8(count))DATAS for i in linestyles:DATAT  r.extend(i)DATA TL return rDATATDATALTdef CURVEEDGERECORD(ControlDeltaX,ControlDeltaY,AnchorDeltaX,AnchorDeltaY):DATA@U< """SWF uses Quadratic Bezier curves, they need only 3 points:DATA$U - 2 on-curve anchor points, and DATA U 1 off-curve control point.DATA@VL So, the first anchor point is the current drawing position,DATALV the control point is the current drawing position plus the ControlDeltaDATA\W< the last anchor point is the current drawing position plus ControlDelta plus AnchorDeltaDATAW Parameters:DATAHX  ControlDeltaX, ControlDeltaY, LastAnchorDeltaX, LastAnchorDeltaY."""DATAX| r = [1,0] # Curved EdgeDATA`X nbits = NBits(SB(MaxAbs([ControlDeltaX*20,ControlDeltaY*20,AnchorDeltaX*20,AnchorDeltaY*20])))DATADY\ r.extend(UB(nbits-2,4)) # Nbits is biased by 2 in the swf readerDATA@Y r.extend(SB(ControlDeltaX*20,nbits)) # X Control point changeDATA@Z< r.extend(SB(ControlDeltaY*20,nbits)) # Y Control point changeDATA@Z r.extend(SB(AnchorDeltaX*20,nbits)) # X anchor point changeDATA@[ r.extend(SB(AnchorDeltaY*20,nbits)) # Y anchor point changeDATA [ return rDATA[DATA<[def LINEEDGERECORD(DeltaX,DeltaY,lineflag=1,vertflag=0):DATA(\l """ Parameters: Delta X - Position XDATA\ Delta Y - Position YDATA4]  Line Flag - 1 General Line (Default option)DATA(]l DeltaX and DeltaY are used.DATA(] Vert Flag parameter not usedDATA(^  0 Vertical or Hotizontal LinesDATA4^\ Vert Flag - 0 Horizontal Line Only DeltaX usedDATA,^ 1 Vertical line only DeltaY usedDATA_ """DATA_L r = [1,1] #Straight EdgeDATA4_ nbits = NBits(SB(MaxAbs([DeltaX*20,DeltaY*20])))DATA_ r.extend(UB(nbits-2,4))DATA`L r.extend([lineflag])DATAL` if lineflag==1: # Save General Lines #Nbits are biased by 2 in swf readerDATA a  r.extend(SB(DeltaX*20,nbits))DATA a\ r.extend(SB(DeltaY*20,nbits))DATAa else:DATAa r.extend([vertflag])DATA4b if vertflag == 0: r.extend(SB(DeltaX*20,nbits))DATA(b| else: r.extend(SB(DeltaY*20,nbits)) DATA b return rDATAc  DATAc<DATAcldef ENDSHAPERECORD():DATAc return [0,0,0,0,0,0]DATAcDATAddef STYLESHAPERECORD(f,DeltaX=0,DeltaY=0,Fill0Style=0,Fill1Style=0,LineStyle=0,nfbits=1,nlbits=1,FillArr=[],LineArr=[],sizepad=0):DATA8d # Defines changes in line style, fill style, positionDATAe, flags = GetBinary(f,5)DATA el r = [0]DATAe r.extend(flags)DATAe if flags[4]==1:DATA8f, MoveBits = NBits(SB(MaxAbs([DeltaX*20,DeltaY*20])))DATAf r.extend(UB(MoveBits,5))DATAXf r.extend(SB(DeltaX*20,MoveBits)) # Move x converted to TWIPS (1 TWIP = 1 Pixel * 20 )DATA,g\ r.extend(SB(DeltaY*20,MoveBits)) # Move yDATA,g if flags[3]==1: # StateFillStyle0DATA0h r.extend(UB(Fill0Style,nfbits)) #Fill 0 styleDATAh| if flags[2]==1:DATA0h r.extend(UB(Fill1Style,nfbits)) #Fill 1 styleDATAi if flags[1]==1:DATA0i\ r.extend(UB(LineStyle,nlbits)) #Line styleDATAi if flags[0]== 1:DATA$i r.extend(Padding(sizepad+len(r)))DATAjL nfill = ord(FillArr[0])DATA,j for i in FillArr: # FillStylesArrayDATA$j r.extend(GetBinary(ord(i),8))DATAkL nline = ord(LineArr[0])DATA,k for i in LineArr: # LineStylesArrayDATA$k r.extend(GetBinary(ord(i),8))DATA,lL r.extend(UB(NBits(GetBinary(nfill)),4))DATA,l r.extend(UB(NBits(GetBinary(nline)),4))DATA m  return rDATAmLDATA(m|def SHAPE(records,nfbits=15,nlbits=15):DATAm r = UB(nfbits,4)DATAn  r.extend(UB(nlbits,4))DATA nL for i in records: r.extend(i)DATA n return rDATAnDATAPo def SHAPEWITHSTYLE(fillstylesarr,linestylesarr,records,nfbits=15,nlbits=15):DATAo r = []DATAo r.extend(fillstylesarr)DATAp  r.extend(linestylesarr)DATA4p\ r.extend([chr(((nfbits << 4) + nlbits) & 255)])DATA p for i in records: r.extend(i)DATA q  return r DATAqLDATAHq|def BUTTONRECORD(flags,characterID,layer,matrix,ColorTransform=None):DATAq r = []DATAr r.extend(flags)DATA r\ r.extend(UI16(characterID))DATAr r.extend(UI16(layer))DATAr r.extend(PadChars(matrix))DATAs< if ColorTransform!=None:DATA(s r.extend(PadChars(ColorTransform))DATA s return rDATAtDATA4tLdef KERNINGRECORD(wideflag,Code1,Code2,Adjustment):DATAt r = []DATAt if wideflag == 1:DATAu r.extend(UI16(Code1))DATAu\ r.extend(UI16(Code2))DATAu else:DATAu r.extend(chr(Code1))DATAv  r.extend(chr(Code2))DATAvL r.extend(SI16(Adjustment))DATA v return rDATAv DATA@w # -------------------------------------------------------------DATAw|# SWF File Tags HeadersDATA@w# -------------------------------------------------------------DATAx,DATAx\def swfWrite(name,buf):DATA x ans = 0DATAx try:DATAy  f = open(name,'wb')DATAyL for byte in buf:DATAy f.write(byte)DATA y f.close()DATA$z  except IOError, (errno,strerror):DATA0z\ print "I/O Error(%s):%s" % (errno,strerror)DATA z ans = 1DATA z return ansDATA{<DATA@{ldef swfHeaderBlock(filelength,framesize,framerate,framecount):DATA{ """Header Block:DATA| Signature 'F' 1 byteDATA|\ 'W' 1 byteDATA| 'S' 1 byteDATA| Version 1 byteDATA} File length 4 bytesDATA}l Frame size 5 bytesDATA} Frame rate 2 bytesDATA ~  Frame count 2 bytes"""DATA~\ #Initialize DATA~ buf = ['F','W','S',chr(3)]DATA~ #FileLengthDATA , buf.extend(UI32(filelength))DATA| #Frame SizeDATAT buf.extend(PadChars(RECT(framesize[0],framesize[1],framesize[2],framesize[3])))DATA< #Frame rateDATA| fr = UI16(framerate)DATA buf.extend(fr[1])DATA buf.extend(fr[0])DATA< #Frame countDATA| fr = UI16(framecount)DATA buf.extend(fr)DATA # Return the bufferDATA < return bufDATA| DATA def swfTagHeader(tag,length):DATA r = []DATA, if (length<=62):DATAl #Short HeaderDATA n = (tag << 6) + lengthDATA r.extend(UI16(n))DATA< else:DATAl #Long HeaderDATA n = (tag << 6) + 63DATA r.extend(UI16(n))DATA, r.extend(UI32(length))DATA | return rDATADATA@# -------------------------------------------------------------DATA\# SWF File TagsDATA<# There are two categories of tags: definition and controlDATA8 # Definition tags manage a dictionary of resources. DATA<l# Control tags control the display list and enable actions.DATA#DATA< # CAUTION: Not all the tags were defined in this programDATA<|# because I only use a base set of SWF tags to be able toDATA # export blender animations.DATA@<# -------------------------------------------------------------DATADATA@# -------------------------------------------------------------DATAL# Control TagsDATA# - Control:DATA# SetBackgroundColorDATA # Protect DATAL# FrameLabelDATA# StartSoundDATA# EndDATA# - Display List: DATA<# PlaceObjectDATA|# PlaceObject2DATA# RemoveObjectDATA# RemoveObject2DATA<# ShowFrameDATA|# - ActionsDATA# DoActionDATA@# -------------------------------------------------------------DATADldef swfPlaceObject(characterId,depth,matrix,colortransform = None):DATA size = 4 + len(matrix)DATA if colortransform != None:DATA l size+= len(colortransform)DATA r = swfTagHeader(4,size)DATA   r.extend(UI16(characterId))DATA\ r.extend(UI16(depth))DATA r.extend(PadChars(matrix))DATA@ if colortransform !=None: r.extend(PadChars(colortransform))DATA \ return rDATADATA$def swfPlaceObject2(f,depth,param):DATA flags = GetBinary(f,6)DATA \ size = 3 DATA  if flags[0] == 1: #Has nameDATA name = STRING(param[0])DATA< size+=len(name)DATA | if flags[1] == 1: #Has ratioDATA ratio = UI16(param[1])DATA  size+=2DATA(\ if flags[2] == 1: #Has color transformDATAl colortrans = PadChars(CXFORM(param[2][0],param[2][1],param[2][2],param[2][3],param[2][4],param[2][5]))DATAL size+= len(colortrans)DATA  if flags[3] == 1: #Has matrixDATAh matrix = PadChars(MATRIX(param[3][0],param[3][1],param[3][2],param[3][3],param[3][4],param[3][5]))DATA| size+= len(matrix)DATA, if flags[4] == 1: #Has place a characterDATA  character = UI16(param[4])DATA l size+=2DATA if flags[5] == 1: #MoveDATA  passDATA< r = swfTagHeader(26,size)DATA  bits = [0,0] # Reserved flagsDATA bits.extend(flags)DATA r.extend(GetChars(bits))DATAl r.extend(UI16(depth))DATA( if (flags[4]==1): r.extend(character)DATA$ if (flags[3]==1): r.extend(matrix)DATA(L if (flags[2]==1): r.extend(colortrans)DATA$ if (flags[1]==1): r.extend(ratio)DATA$ if (flags[0]==1): r.extend(name)DATA < return rDATA|DATA def swfRemoveObject(id,depth):DATA r = swfTagHeader(5,4)DATA< r.extend(UI16(id))DATA| r.extend(UI16(depth))DATA  return rDATADATA ,def swfRemoveObject2(depth):DATA| r = swfTagHeader(28,2)DATA r.extend(UI16(depth))DATA  return rDATA<DATAldef swfShowFrame():DATA@ """Flag the end of the current frame. During playback, the DATA@ characters present in the display list will be rendered andDATA< the mouvie paused for the duration of a single frame."""DATA return swfTagHeader(1,0)DATALDATA$|def swfSetBackgroundColor(r,g,b):DATA@ """ Set the background color of the display Tag ID = 9 """DATA(< return swfTagHeader(9,3) + RGB(r,g,b)DATADATAdef swfFrameLabel(label):DATA  str = STRING(label)DATA L r = swfTagHeader(43,len(str))DATA r.extend(str)DATA  return rDATADATALdef swfProtect():DATAL """ Marks a file as not importable for editing in the authoring tool."""DATA  return swfTagHeader(24,0)DATA\DATA$def swfStartSound(id,soundinfo):DATA, """Start playing the sound character"""DATA< size = 2 + len(soundinfo)DATA r = swfTagHeader(15,size)DATA r.extend(UI16(id))DATA r.extend(soundinfo)DATA \ return rDATADATAdef swfEnd():DATAD  """Marks the end of a file. This should always be the last tag DATA| in the file."""DATA return swfTagHeader(0,0) DATA DATA<DATA@l# -------------------------------------------------------------DATA# Action TagsDATA@# -------------------------------------------------------------DATA def swfActionGotoFrame(frame):DATA r = [chr(129)]DATA r.extend(UI16(2))DATA\ r.extend(UI16(frame))DATA  return rDATADATA$ def swfActionGetURL(url,window):DATA\ r = [chr(131)]DATA us = STRING(url)DATA uw = STRING(window)DATA$ r.extend(UI16(len(us)+len(uw)))DATAl r.extend(us)DATA r.extend(uw)DATA  return rDATA,DATA\def swfActionNextFrame():DATA return [chr(4)]DATADATAdef swfActionPrevFrame():DATAl return [chr(5)]DATADATAdef swfActionPlay():DATA return [chr(6)]DATA\DATAdef swfActionStop():DATA return [chr(7)]DATA DATA <def swfActionToggleQualty():DATA return [chr(8)]DATADATAdef swfActionStopSounds():DATAL return [chr(9)]DATADATA,def swfActionWaitForFrame(frame,skipcount):DATA r = [chr(138)]DATA\ r.extend(UI16(3))DATA r.extend(UI16(frame))DATA r.extend([chr(skipcount)])DATA , return rDATAlDATA,def swfActionSetTarget(length,targetname):DATA r = [chr(139)]DATA< r.extend(UI16(length))DATA| tn = STRING(targetname)DATA r.extend(tn)DATA   return rDATALDATA(|def swfActionGoToLabel(length,label):DATA r = [chr(140)]DATA  r.extend(UI16(length))DATAL tn = STRING(label)DATA r.extend(tn)DATA  return rDATA  DATA <def swfDoAction(actionlist):DATA( r = swfTagHeader(12,len(actionlist)+1)DATA, if len(actionlist)>0: r.extend(actionlist)DATA< r.extend([chr(0)])DATA | return rDATA@# -------------------------------------------------------------DATA,# Definition TagsDATAl# - DefineShapeDATA# - DefineShape2DATA# - DefineShape3DATA,# - DefineSprite (SWF 3.0)DATA|# - DefineBitsDATA# - DefineButtonDATA# - DefineButton2DATA<# - DefineButtonCxformDATA@|# -------------------------------------------------------------DATA,def swfDefineShape(id,rect,shapewithstyle):DATA<L """ Defines a vector shape object. The shape definitionDATA< is a full-length encoded list of bezier curve informationDATA,, line styles and fill styles. (SWF 1.0)"""DATA c = PadChars(rect)DATA( size = len(c) + len(shapewithstyle)DATA r = swfTagHeader(2,size+2)DATAl r.extend(UI16(id))DATA r.extend(c)DATA r.extend(shapewithstyle)DATA < return rDATA|DATA0def swfDefineShape2(id,rect,shapewithstyle):DATA@  """Extends the capabilities of DefineShape with the abilityDATA@| to support more than 255 styles in the style list and multipleDATA0 style lists in a single shape (SWF 2.0) """DATAL c = PadChars(rect)DATA  size = len(c) + len(shapeinfo)DATA  r = swfTagHeader(22,size+2)DATA, r.extend(UI16(id))DATAl r.extend(c)DATA¬ r.extend(shapewithstyle)DATA  return rDATA<DATA0ldef swfDefineShape3(id,rect,shapewithstyle):DATA4 """Extends the capabilitys of the DefineShape2 DATA8, by extending all of the RGB color fields to supportDATA,Č RGBA with alpha transparency (SWF 3.0)"""DATA c = PadChars(rect)DATA(, size = len(c) + len(shapewithstyle)DATA | r = swfTagHeader(32,size+2)DATA r.extend(UI16(id))DATA  r.extend(c)DATAL r.extend(shapewithstyle)DATA Ɯ return rDATADATA, def swfDefineSprite(id,numframes,movie):DATAl size = len(movie) + 4DATAǬ r = swfTagHeader(39,size)DATA r.extend(UI16(id))DATA< r.extend(UI16(numframes))DATAȌ r.extend(movie)DATA  return rDATA DATA<def swfDefineBits(id,jpeg):DATA8Ɍ """Define a Bitmap character with JPEG compression."""DATA size = len(jpeg) + 2DATA, r = swfTagHeader(6,size)DATA| r.extend(UI16(id))DATAʼ r.extend(jpeg)DATA  return rDATA<DATA$ldef JPEGTables(jpegencodingtable):DATA8˼ """Defines the JPEG encoding table for the JPEG imagesDATA, defined using the DefineBits records."""DATA | size = len(jpegencodingtable)DATA r = swfTagHeader(8,size)DATA  r.extend(jpegencodingtable)DATA l return rDATAͬDATA4def swfDefineBitsJPEG2(id,jpeg,jpegencodingtable):DATA@< """Define a Bitmap character with JPEG compression. This tagDATA@ά differs from DefineBits in that the record contains both JPEGDATA< encoding table and image data. This record allows multipleDATADό JPEGs with different compression rations inside a single SWF file.DATAD The JPEG encoding and image data contained here are two separateDATAl JPEG streams.DATADЬ Important NOTE: Each JPEG stream begins with the tag (0xFF,0xD8)DATA< and a end of tream tag (0xFF,0xD9). This differs from the DATADь standard JPEG file that combines the image and the encoding dataDATA into the same stream"""DATA0L size = len(jpeg) + len(jpegencodingtable) + 2DATAҬ r = swfTagHeader(21,size)DATA r.extend(UI16(id))DATA < r.extend(jpegencodingtable)DATAӌ r.extend(jpeg)DATA  return rDATA DATA0<def swfDefineButton(id,buttonrecords,actions):DATA<Ԝ """Define a button character. A button is defined by an DATA@  up image, mouse over image, depressed image and a hit region.DATAD| There is also a list of actions to take when the button is clickedDATA and released."""DATA0, size = 2 + len(buttonrecords) + len(actions)DATA֌ r = swfTagHeader(7,size)DATA r.extend(UI16(id))DATA r.extend(buttonrecords)DATA0l r.extend([chr(0)]) # Button End Flag always 0DATA r.extend(actions)DATA0  r.extend([chr(0)]) # Actions End Flag always 0DATA l return rDATAجDATA$def ACTCONDITIONLST(actconditions):DATA, r = []DATA \ offset = 0DATAٜ for act in actconditions:DATA r.extend(UI16(offset))DATA< r.extend(act)DATA| offset += len(act)DATA ڼ return rDATADATA$,def ACTCONDITION(flags,actions):DATA| r = UI16(flags)DATAۼ r.extend(actions)DATA0 r.extend([chr(0)]) #Actions End Flag always 0DATA\ returnDATA܌DATAܼ DATA@def swfDefineButton2(id,flags,buttonrecords,actconditionlst):DATA<\ """Define a button character. A button is defined by an DATA@ up image, mouse over image, depressed image and a hit region.DATA@< You can also specif the color transformation and sound data.DATADެ There is also a list of actions to take when the button is clickedDATA  and released. (SWF 3.0) """ DATA8l size = 3 + len(buttonrecords) + len(actconditionlst)DATA r = swfTagHeader(34,size)DATA r.extend(UI16(id))DATA,\ r.extend([chr(flags)]) # flags = 0 or 1DATAP r.extend(buttonrecords) # This records has to have COLORTRANSFORM with ALPHADATA0< r.extend([chr(0)]) # Button End Flag always 0DATA  r.extend(actionsconditions)DATA  return rDATA,DATA0\def swfDefineButtonCxform(id,colortransform):DATA  size = 2 + len(colortransform)DATA  r = swfTagHeader(23,size)DATA\ r.extend(UI16(id))DATA r.extend(colortransform)DATA  return rDATA,DATA<\# ------------------------------------------------------DATA# Fonts and TextDATA< # ------------------------------------------------------DATA|DATA0def swfDefineFont(id,OffsetTable,ShapeTable):DATA0  size = 2 + len(OffsetTable)+ len(ShapeTable)DATAl r = swfTagHeader(10,size)DATA r.extend(UI16(id))DATA4 for offset in OffsetTable: r.extend(UI16(offset))DATA,\ for shape in ShapeTable: r.extend(shape)DATA  return rDATADATA\,def swfDefineFont2(id,FontFlags,Fontname,OffsetTable,ShapeTable,FontCodeTable,Layout=None):DATA """DATA Id - Object IdDATA, DATA\ FontFlags:DATAT FONT_HASLAYOUT - FontFlagsHasLayout UB[1]: Has font metrics/layout informationDATA@ FONT_SHIFTJIS - FontFlagsShiftJIS UB[1]: ShiftJIS encodingDATA@ FONT_UNICODE - FontFlagsUnicode UB[1]: Unicode encodingDATA8 FONT_ANSI - FontFlagsAnsi UB[1]: ANSI encodingDATAL\ FONT_WIDEOFFSETS- FontFlagsWideOffsets UB[1]: if 1, uses 32 bit offsetsDATAL FONT_WIDECODES - FontFlagsWideCodes UB[1]: If 1 fonts uses 16-bit codesDATA$\ o uses 8 bit codes.DATA8 FONT_ITALIC - FontFlagsItalic UB[1]: Italic FontDATA4  FONT_BOLD - FontFlagsBold UB[1]: Bold FontDATA l Fontname - String font nameDATA< Offset Table - Beginnig of next shape in the Shape TableDATA<, Shape Table - List of ShapeObjects that define each glyphDATA( FontCodeTable- Table of font codesDATA  Layout:DATA, [FontAscent,FontDescent,FontLeading,[{FontAdvanceTable } list],[{FontBoundsTable } list ],[Kerning list]]DATA DATA """DATA L flags = GetBinary(FontFlags)DATADATA  r = [] DATA  r.extend(UI16(id))DATA,L r.extend(chr(0)) # FontFlagsReserved UB[8]DATA r.extend(chr(FontFlags))DATA name = STRING(Fontname) DATAL r.extend(chr(len(name)))DATA r.extend(name)DATA, r.extend(UI16(len(ShapeTable))) #nGlyphsDATA < for offset in OffsetTable: DATA( if (flags[4]==1): # FONT_WIDEOFFSETS DATA r.extend(UI32(offset))DATA , else: r.extend(UI16(offset))DATA,| for shape in ShapeTable: r.extend(shape)DATA for code in FontCodeTable:DATA(, if (flags[5]==1): # FONT_WIDECODESDATA| r.extend(UI16(code))DATA else: r.extend(chr(code))DATA$  if (flags[0]==1): #FONT_HASLAYOUTDATA,\ r.extend(SI16(LayOut[0])) #FontAscent DATA, r.extend(SI16(Layout[1])) #FontDescentDATA, r.extend(SI16(Layout[2])) #FontLeadingDATA| for glyph in Layout[3]:DATA, r.extend(SI16(glyph)) #FontAdvanceTableDATA, Bounds = []DATA@l for rect in Layout[4]: Bounds.extend(rect) #FontBoundsTableDATA  r.extend(PadChars(Bounds))DATA4, r.extend(UI16(len(Layout[5]))) #FontKerningCountDATA0 for kerning in Layout[5]: r.extend(kerning)DATA DATA  r1 = swfTagHeader(48,len(r))DATAl r1.extend(r)DATA  return r1DATADATA<def swfDefineFontInfo(FontId,Fontname,FontFlags,CodeTable):DATA """DATA Font Id - Id FontDATA Font name - string DATA< FontFlags:DATA@| FONT_UNICODE - FontFlagsUnicode UB[1]: Unicode encodingDATA@ FONT_SHIFTJIS - FontFlagsShiftJIS UB[1]: ShiftJIS encodingDATA8\ FONT_ANSI - FontFlagsAnsi UB[1]: ANSI encodingDATA8 FONT_ITALIC - FontFlagsItalic UB[1]: Italic FontDATA4 FONT_BOLD - FontFlagsBold UB[1]: Bold FontDATAL| FONT_WIDECODES - FontFlagsWideCodes UB[1]: If 1 fonts uses 16-bit codesDATA$ o uses 8 bit codes.DATA L CodeTable - Glyph code table DATA """DATA r = []DATA r.extend(UI16(FontId))DATA< name = STRING(Fontname)DATA r.extend(char(len(name)))DATA r.extend(name)DATA  flags = GetBinary[FontFlags]DATAHl newflags = [0,0,flags[2],flags[1],flags[3],flags[6],flags[7],flags[5]]DATA  r.extend(GetChars(newflags))DATA, for glyphs in CodeTable:DATA,| if (flags[7]==1): r.extend(UI16(glyphs))DATA  else: r.extend(chr(glyphs))DATA,DATA \ r1 = swfTagHeader(13,len(r))DATA r1.extend(r)DATA  return r1DATA,DATA8\def GLYPHENTRY(idx,value,nGlyphBits=8,nAdvanceBits=8):DATA r = []DATA  r.extend(UB(idx,nGlyphBits))DATA$< r.extend(UB(value,nAdvanceBits))DATA  return r DATADATA(def TEXTRECORDTYPE0(TextGplyphEntries):DATA L r = [0]DATA$ nglyphs = len(TextGplyphEntries)DATA r.extend(UB(nglyphs,7))DATA$, for glyph in TextGplyphEntries:DATA| r.extend(glyph)DATA return PadChars(r)DATADATAH,def TEXTRECORDTYPE1(TextFlags,Fontid=0,height=0,color=None,x=0,y=0):DATA f = [1,0,0,0]DATA f.extend(GetBinary(flags))DATA , r = GetChars(f)DATA( l if (f[4]==1): r.extend(UI16(Fontid))DATA  if (f[5]==1): DATA,  if len(color)>3: r.extend(RGBA(color))DATA  \ else: r.extend(RGB(color))DATA$  if (f[7]==1): r.extend(UI16(x))DATA$  if (f[6]==1): r.extend(UI16(y))DATA( L if (f[4]==1): r.extend(UI16(height))DATA   return rDATA DATAT def swfDefineText(Textid,bounds,matrix,textrecords,nGlyphBits=8,nAdvanceBits=8):DATA  r = []DATA  r.extend(UI16(Textid))DATA  a = []DATA , a.extend(bounds)DATA l a.extend(matrix)DATA  r.extend(PadChars(a))DATA  r.append(chr(nGlyphBits))DATA < r.append(chr(nAdvanceBits))DATA0 for record in textrecords: r.extend(record)DATA r.append(chr(0))DATA , r1 = swfTagHeader(11,len(r))DATA| r1.extend(r)DATA  return r1DATADATAT,def swfDefineText2(Textid,bounds,matrix,textrecords,nGlyphBits=8,nAdvanceBits=8):DATA r = []DATA r.extend(UI16(Textid))DATA a = []DATAL a.extend(bounds)DATA a.extend(matrix)DATA r.extend(PadChars(a))DATA  r.append(chr(nGlyphBits))DATA \ r.append(chr(nAdvanceBits))DATA0 for record in textrecords: r.extend(record)DATA  r.append(chr(0))DATA L r1 = swfTagHeader(11,len(r))DATA r1.extend(r)DATA  return r1DATADATA<L# ------------------------------------------------------DATA# Blender SWF Wrap ClassesDATA< # ------------------------------------------------------DATA|DATAD# --------------------------------------------------------------DATA# DATAL# Class bShapeDATA# DATA@# -------------------------------------------------------------DATA,class bShape:DATAl "Blender swf shape class"DATA recbits = []DATA  fsa = []DATA < lsa = []DATA | nFills = 0DATA  nLines = 0DATA8 def __init__(self,fillstylearr=[],linestylearr=[]):DATA\ "bShape initialization." DATA recbits = []DATA fsa = fillstylearrDATA, lsa = linestylearrDATA$l def AddFillStyle(self,fillstyle):DATA  self.fsa.append(fillstyle)DATA  self.nFills+=1DATA$L def AddLineStyle(self,linestyle):DATA  self.lsa.append(linestyle)DATA self.nLines+=1DATA, def MoveTo(self,x,y):DATA8l self.recbits.extend(STYLESHAPERECORD(SH_MOVE,x,y))DATA, def SetCurrentFill0(self,id,numfills=0):DATA`, if numfills>0: self.recbits.extend(STYLESHAPERECORD(SH_FILL0,0,0,id,0,0,NBits(UB(numfills))))DATA\ else: self.recbits.extend(STYLESHAPERECORD(SH_FILL0,0,0,id,0,0,NBits(UB(self.nFills))))DATA,L def SetCurrentFill1(self,id,numfills=0):DATA` if numfills>0: self.recbits.extend(STYLESHAPERECORD(SH_FILL1,0,0,0,id,0,NBits(UB(numfills))))DATA\< else: self.recbits.extend(STYLESHAPERECORD(SH_FILL1,0,0,0,id,0,NBits(UB(self.nFills))))DATA, def SetCurrentLine(self,id,numlines=0):DATAh , if numlines>0: self.recbits.extend(STYLESHAPERECORD(SH_LINESTYLE,0,0,0,0,id,0,NBits(UB(numlines))))DATA`  else: self.recbits.extend(STYLESHAPERECORD(SH_LINESTYLE,0,0,0,0,id,0,NBits(UB(self.nLines))))DATAH!L def AddNewStyles(self,nfb=1,nlb=1,FillArr=[],LineArr=[],sizepad=0):DATAl! self.recbits.extend(STYLESHAPERECORD(SH_NEWSTYLES,0,0,0,0,0,nfb,nlb,FillArr,LineArr,len(self.recbits)))DATA"\ def SetStyleRecord(self,f,DeltaX=0,DeltaY=0,Fill0Style=0,Fill1Style=0,LineStyle=0,nfbits=1,nlbits=1,FillArr=[],LineArr=[]):DATA#  self.recbits.extend(STYLESHAPERECORD(f,DeltaX,DeltaY,Fill0Style,Fill1Style,LineStyle,nfbits,nlbits,FillArr,LineArr,len(self.recbits)))DATA# def LineTo(self,x,y):DATA,$  self.recbits.extend(LINEEDGERECORD(x,y))DATA $l def CurveTo(self,cx,cy,ax,ay):DATA4$ self.recbits.extend(CURVEEDGERECORD(cx,cy,ax,ay))DATA% def EndShape(self):DATA(%\ self.recbits.extend(ENDSHAPERECORD())DATA% def GetShape(self):DATA(% nFillBits = NBits(UB(self.nFills))DATA(&< nLineBits = NBits(UB(self.nLines))DATAx& return SHAPEWITHSTYLE(FILLSTYLEARRAY(self.fsa),LINESTYLEARRAY(self.lsa),PadChars(self.recbits),nFillBits,nLineBits)DATA', def Reset(self):DATA'l self.recbits = []DATA' self.fsa = []DATA' self.lsa = []DATA(, self.nFills = 0DATA(l self.nLines = 0DATA(DATAD(# -----------------------------------------------------------------DATA )L# Test SWFDATAD)# -----------------------------------------------------------------DATA0)#movie = swfHeaderBlock(0,[0,0,92,469],12,1)DATA,*\#movie+=swfSetBackgroundColor(255,255,255)DATA*#actions = swfActionStop()DATA + #movie+=swfDoAction(actions)DATA+\#a = FILLSTYLEARRAY([FILLSTYLE(SOLID_FILL,[0,255,0,255]),FILLSTYLE(SOLID_FILL,[0,0,255,255]),FILLSTYLE(SOLID_FILL,[255,255,0,255])])DATAP, #b = LINESTYLEARRAY([LINESTYLE(1,[0,0,0,255]),LINESTYLE(3,[0,255,255,255])])DATA,#nFillBits = NBits(UB(3)) DATA,#nLineBits = NBits(UB(2))DATA-,#sh = bShape()DATA8-l#sh.AddFillStyle(FILLSTYLE(SOLID_FILL,[0,255,0,255]))DATA8-#sh.AddFillStyle(FILLSTYLE(SOLID_FILL,[0,0,255,255]))DATA8.,#sh.AddFillStyle(FILLSTYLE(SOLID_FILL,[255,255,0,255]))DATA,.#sh.AddLineStyle(LINESTYLE(1,[0,0,0,255]))DATA0.#sh.AddLineStyle(LINESTYLE(3,[0,255,255,255]))DATA\/L#sh.SetStyleRecord(SH_MOVE+SH_FILL0+SH_FILL1+SH_LINESTYLE,0,300,0,2,0,nFillBits,nLineBits)DATA/#sh.LineTo(0,100)DATA0#sh.CurveTo(100,0,0,-100)DATA0l#sh.LineTo(-100,0)DATAp0#sh.SetStyleRecord(SH_MOVE+SH_FILL0+SH_FILL1+SH_LINESTYLE+SH_NEWSTYLES,100,300,0,1,0,nFillBits,nLineBits,a,b)DATA1L#sh.LineTo(0,100)DATA1#sh.LineTo(100,0)DATA1#sh.LineTo(0,-100)DATA2 #sh.LineTo(-100,0)DATA2L#sh.MoveTo(150,350)DATA2#sh.LineTo(25,0)DATA2#sh.LineTo(0,25)DATA3 #sh.LineTo(-25,0)DATA3L#sh.LineTo(0,-25)DATAP3#sh.SetStyleRecord(SH_MOVE+SH_FILL0+SH_FILL1,0,290,3,1,0,nFillBits,nLineBits)DATA4 #sh.LineTo(0,50)DATA4L#sh.LineTo(50,0)DATA4#sh.LineTo(0,-50)DATA4#sh.MoveTo(100,290)DATA5 #sh.LineTo(0,50)DATA5L#sh.CurveTo(20,0,0,-50)DATA5#sh.LineTo(-50,0)DATA5#sh.MoveTo(200,290)DATA6 #sh.LineTo(0,50)DATA6L#sh.LineTo(50,0)DATA6#sh.LineTo(0,-50)DATA6#sh.LineTo(-50,0)DATA7 #sh.EndShape()DATA<7L#movie+=swfDefineShape3(1,RECT(0,0,400,400),sh.GetShape())DATAT7#movie+=swfPlaceObject2(PO_MATRIX+PO_CHAR_ID,2,[0,0,0,[1.0,1.0,0.0,0.0,0.0,0.0],1])DATA8<#movie+=swfShowFrame()DATA8|#movie+=swfEnd()DATA8#a = len(movie)DATA8#SetFileLength(movie,a)DATA9<#print movieDATA$9|#swfWrite('c:\swf\demo.swf',movie)DATA9#print "Saved!"DATA:  DATAD:<# --------------------------------------------------------------DATA:# DATA:# Class CRectDATA;# DATA@;L# -------------------------------------------------------------DATA;class CRect:DATA8; """ CRect (Left,Top, Right, Bottom) Rectangle classDATA8<\ Remember that the position (0,0) correspond to theDATA$< left-bottom of the screen. """DATA(=  def __init__(self,l=0,t=0,r=0,b=0):DATA=\ self.SetRect(l,t,r,b)DATA$= def SetRect(self,l=0,t=0,r=0,b=0):DATA= self.L = lDATA>, self.T = tDATA>l self.R = rDATA> self.B = bDATA> def SetNullRect(self):DATA?, self.L = 0DATA?l self.T = 0DATA? self.R = 0DATA? self.B = 0DATA@, def Width(self):DATA@l return abs(self.R-self.L)DATA@ def Height(self):DATA@ return abs(self.T-self.B)DATAAL def Center(self):DATA`A return self.L+int((float(self.Width())/2.0)+0.5),self.B+int((float(self.Height())/2.0)+0.5)DATAB def PtInRect(self,x,y):DATAHBl if (x>=self.L and x<=self.R and y>=self.B and y<=self.T): return 1DATAB else: return 0DATAC def OffsetRect(self,x,y):DATACl self.L += xDATAC self.T += yDATAC self.R += xDATAD, self.B += yDATADDl# --------------------------------------------------------------DATAD# DATAE # Class CGHandleDATAEL# DATA@E|# -------------------------------------------------------------DATAEclass CGHandle:DATAF, "Graphic Handle class"DATA Fl rc = NoneDATAF id = 0DATAF intensity = 0DATAG maxcolors = 32DATA0G\ def __init__(self,i=0,id=0,l=0,t=0,r=0,b=0):DATAG self.rc = CRect(l,t,r,b)DATAH  self.id = idDATAHL self.intensity = iDATAH def SetID(self,id):DATAH self.id = idDATAI  def MoveTo(self,x,y):DATAIL ctr = self.rc.Center()DATAI dx = x - ctr[0]DATAI dy = y - ctr[1]DATAJ self.rc.OffsetRect(dx,dy)DATAJl del dx,dy,ctrDATAJ def SetIntensity(self,i):DATAJ self.intensity = iDATAK< def Draw(self):DATAK| glColor3f(1.0,0.0,0.0)DATAK glBegin(GL_TRIANGLES)DATA(L  glVertex2d(self.rc.L,self.rc.B+15)DATA(L\ glVertex2d(self.rc.R,self.rc.B+15)DATA0L glVertex2d(self.rc.Center()[0],self.rc.T+5)DATA M  glEnd()DATAML glColor3f(0.0,0.0,0.0)DATA(M glRasterPos2d(self.rc.L,self.rc.B+5)DATAM Text(str(self.id))DATAN, def HitTest(self,x,y):DATA Nl return self.rc.PtInRect(x,y)DATANDATADN# --------------------------------------------------------------DATAO\# DATAO# Class CVScrollListDATAO# DATA@O# -------------------------------------------------------------DATAPlclass CVScrollLst:DATA P "Vertical Scroll List class"DATA<P def __init__(self,l=0,b=0,w=0,h=0,clr = [0.0,0.0,1.0]):DATAQl self.selidx = -1DATAQ self.topline = 0DATAQ self.datalst = []DATA(R, self.color = [clr[0],clr[1],clr[2]]DATA$R| self.wndrc = CRect(l,b+h,l+w,b)DATAR self.fmouse = 0DATAS  def SetPos(self,l,b,w,h):DATA$S\ self.wndrc.SetRect(l,b+h,l+w,b)DATAS def ClearLst(self):DATAS del self.datalstDATAT, self.datalst = []DATA Tl def AddItem(self,s,tag=""):DATA T self.datalst.append([s,tag])DATAU  def DelItem(self,idx):DATAUL del self.datalst[idx]DATA(U if self.selidx==idx: self.selidx=-1DATAU def Sort(self):DATAV self.datalst.sort()DATAV\ def GetSelected(self):DATA8V if (self.selidx>-1): return self.datalst[self.selidx]DATAV else: return NoneDATAW< def Draw(self):DATAW| VPort = Buffer(GL_INT,4)DATA$W glGetFloatv(GL_VIEWPORT,VPort)DATAXX glPushAttrib(GL_LIGHTING_BIT|GL_ENABLE_BIT|GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT)DATAX glColor3f(0.75,0.75,0.75)DATA@X glRectf(self.wndrc.L,self.wndrc.T,self.wndrc.R,self.wndrc.B)DATAY\ glColor3f(0.0,0.0,0.0)DATAY glBegin(GL_LINE_LOOP)DATA(Y glVertex2d(self.wndrc.L,self.wndrc.T)DATA(Z< glVertex2d(self.wndrc.R,self.wndrc.T)DATA(Z glVertex2d(self.wndrc.R,self.wndrc.B)DATA(Z glVertex2d(self.wndrc.L,self.wndrc.B)DATA [, glEnd() DATA[l glLineWidth(2.0)DATA[ glColor3f(1.0,1.0,1.0)DATA[ glBegin(GL_LINE_STRIP)DATA,\L glVertex2d(self.wndrc.L+2,self.wndrc.B+2)DATA,\ glVertex2d(self.wndrc.L+2,self.wndrc.T-2)DATA,]  glVertex2d(self.wndrc.R-2,self.wndrc.T-2)DATA ]l glEnd()DATA] glColor3f(0.45,0.45,0.45)DATA] glBegin(GL_LINE_STRIP)DATA,^L glVertex2d(self.wndrc.L+2,self.wndrc.B+2)DATA,^ glVertex2d(self.wndrc.R-2,self.wndrc.B+2)DATA,_  glVertex2d(self.wndrc.R-2,self.wndrc.T-2)DATA _l glEnd()DATA_ glColor3f(0.55,0.55,0.55)DATAH_ glRectd(self.wndrc.L+5,self.wndrc.T-5,self.wndrc.R-27,self.wndrc.B+5)DATA`l # Draw ItemsDATA` VPort = Buffer(GL_INT,4)DATA$` glGetFloatv(GL_VIEWPORT,VPort)DATAaL sz = len(self.datalst)DATA a max = self.wndrc.Height()/15DATA a strmax = self.wndrc.Width()/8DATAb< for i in range(max):DATA$b| if self.selidx==i+self.topline:DATA<b glColor3f(self.color[0],self.color[1],self.color[2])DATA\c< glRectf(self.wndrc.L+7,self.wndrc.T-5-(i*15),self.wndrc.R-30,self.wndrc.T-(i*15)-20)DATAc glColor3d(1,1,1)DATA d  else:DATAdL glColor3d(0,0,0)DATA8d glRasterPos2d(self.wndrc.L+7,self.wndrc.T-(i*15)-15)DATAd try:DATA,e msg = self.datalst[i+self.topline][0]DATA,e| if len(msg)>strmax: msg = msg[0:strmax]DATAe Text(msg)DATA f except:DATA f\ passDATAf #Draw HandleDATAf if sz==0: sz=1DATAg glColor3f(0.75,0.75,0.75)DATALgl glRectf(self.wndrc.R-27,self.wndrc.T-5,self.wndrc.R-25,self.wndrc.B+5)DATAg glColor3f(0.55,0.55,0.55)DATAHh< glRectd(self.wndrc.R-25,self.wndrc.T-5,self.wndrc.R-5,self.wndrc.B+5)DATAh if sz=self.wndrc.R-27) and (dx<=self.wndrc.R-5) and (dy>=self.wndrc.B+5) and (dy<=self.wndrc.T-5):DATA@p if (sz>max) and ((self.fmouse == 0) or (self.fmouse == 1)):DATAXp self.topline = int(float(self.wndrc.T-dy)/float(self.wndrc.Height())*float(sz))DATA4q  if self.topline>sz-max: self.topline = sz-maxDATAql self.fmouse = 1DATA8q elif (dy>=self.wndrc.B+5) and (dy<=self.wndrc.T-5):DATA0r  if (self.fmouse == 0) or (self.fmouse ==2):DATAPrl nidx = int(float(self.wndrc.T-dy)/float(self.wndrc.Height()-8)*float(max))DATA$r if nidx>max-1: nidx = max-1DATA$s< self.selidx=self.topline+ nidxDATA s rtn=1DATAs self.fmouse = 2DATA,t  elif (buttons[0] == 0): # Left Button UpDATAtl self.fmouse = 0DATA0t elif (buttons[1]==1): # Middle Button DownDATAu  passDATA,u< elif (buttons[2]==1): # Right Button DownDATAu passDATA u Draw()DATAv  del ViewPortDATAvLDATAv| return rtnDATAv DATADv# --------------------------------------------------------------DATAw\# DATAw# Class CPickPaletteDATAw# DATA@w# -------------------------------------------------------------DATAxlclass CPickPalette:DATAx "Pick Palette class"DATAx wndrc = CRect()DATAy, clientrc = CRect()DATAyl palrc = CRect()DATAy hndlst = []DATA y curidx = 0DATAz, vs = 0DATAz\ maxcolors = 0DATAz curHandle = NoneDATA z fmouse = 0DATA { visible=1DATA,{\ def __init__(self,l=0,t=0,w=0,h=0,m=32):DATA{ self.SetPos(l,t,w,h)DATA{ self.maxcolors = mDATA|< self.fmouse = 0DATA|| def SetPos(self,l,t,w,h):DATA| px = l - self.wndrc.LDATA}  py = t - self.wndrc.TDATA$}L self.wndrc.SetRect(l,t,l+w,t-h)DATAH} self.clientrc.SetRect(5,5,self.wndrc.Width()-5,self.wndrc.Height()-5)DATA0~  self.vs = float(self.clientrc.Height())/3.0 DATAd~l self.palrc.SetRect(self.wndrc.L+5,self.wndrc.T-5-self.vs,self.wndrc.R-5,self.wndrc.B+5+self.vs)DATA~ for hnd in self.hndlst:DATAL hnd.rc.OffsetRect(px,py)DATA  del px,pyDATA def SetMaxColors(self,m):DATA, self.mascolors = mDATAl def Draw(self):DATA  if self.visible == 0: returnDATA glColor3f(0.75,0.75,0.75)DATAL glBegin(GL_QUADS)DATA( glVertex2d(self.wndrc.L,self.wndrc.T)DATA( glVertex2d(self.wndrc.R,self.wndrc.T)DATA(, glVertex2d(self.wndrc.R,self.wndrc.B)DATA(| glVertex2d(self.wndrc.L,self.wndrc.B)DATA  glEnd()DATA  glColor3f(0.0,0.0,0.0)DATA\ glBegin(GL_LINE_LOOP)DATA( glVertex2d(self.wndrc.L,self.wndrc.T)DATA( glVertex2d(self.wndrc.R,self.wndrc.T)DATA(< glVertex2d(self.wndrc.R,self.wndrc.B)DATA( glVertex2d(self.wndrc.L,self.wndrc.B)DATA  glEnd() DATA glLineWidth(2.0)DATA\ glColor3f(1.0,1.0,1.0)DATA glBegin(GL_LINE_STRIP)DATA, glVertex2d(self.wndrc.L+2,self.wndrc.B+2)DATA,\ glVertex2d(self.wndrc.L+2,self.wndrc.T-2)DATA, glVertex2d(self.wndrc.R-2,self.wndrc.T-2)DATA  glEnd()DATA\ glColor3f(0.45,0.45,0.45)DATA glBegin(GL_LINE_STRIP)DATA, glVertex2d(self.wndrc.L+2,self.wndrc.B+2)DATA,\ glVertex2d(self.wndrc.R-2,self.wndrc.B+2)DATA, glVertex2d(self.wndrc.R-2,self.wndrc.T-2)DATA  glEnd()DATA\ glLineWidth(1.0)DATA glBegin(GL_LINES)DATA( for i in range(self.clientrc.R-5):DATA,, c = float(i)/float(self.clientrc.R-5)DATA glColor3f(c,c,c)DATA8 glVertex2d(self.wndrc.L+5+i,self.wndrc.B+5+self.vs)DATA8, glVertex2d(self.wndrc.L+5+i,self.wndrc.T-5-self.vs)DATA  glEnd()DATA sz = len(self.hndlst)DATA  if (sz>0):DATA L c = (self.clientrc.R-5)/szDATA  i = 0 DATA for hnd in self.hndlst:DATA, hnd.Draw()DATA<l glColor3f(hnd.intensity,hnd.intensity,hnd.intensity)DATA glBegin(GL_QUADS)DATA4 glVertex2d(self.wndrc.L+5+(i*c),self.wndrc.T-5)DATA8| glVertex2d(self.wndrc.L+5+(i*c)+c,self.wndrc.T-5)DATA@ glVertex2d(self.wndrc.L+5+(i*c)+c,self.wndrc.T-6-self.vs)DATA<L glVertex2d(self.wndrc.L+5+(i*c),self.wndrc.T-6-self.vs)DATA  glEnd()DATA  i+=1DATA< del i,c,sz DATA| DATA def HitTest(self,x,y):DATA$ return self.wndrc.PtInRect(x,y)DATA<DATA l def PaletteHitTest(self,x,y):DATA@ """ Return None if HitTest over the palette of colors failDATA<, or the created Handle where the user clicks the mouse."""DATA$ if (self.palrc.PtInRect(x,y)):DATA$ if self.curidxhnd.id: h.id-=1DATA del self.hndlst[i]DATA< self.curidx-=1 DATA|DATA  def HndLstHitTest(self,x,y):DATA for hnd in self.hndlst:DATA,L if (hnd.rc.PtInRect(x,y)): return hndDATA return NoneDATADATA def ResetContent(self):DATAl for hnd in self.hndlst:DATA  c = hndDATA hnd = NoneDATA < del cDATA| self.hndlst = []DATA self.curidx = 0DATADATA, def GetNumColors(self):DATA| return len(self.hndlst)DATA DATA def Visible(self,val=1):DATAL self.visible = valDATA DATA( def OnMouseMove(self,dx,dy,buttons):DATA0  """ Mouse Move Rutine for this control."""DATA$l if self.visible == 0: return 0 DATA  rtn = 0DATA$ if self.HitTest(dx,dy)==0: returnDATA L ViewPort = Buffer(GL_FLOAT,4)DATA$ glGetFloatv(GL_VIEWPORT,ViewPort)DATADATA( if (buttons[0]): # Left Button DownDATAl self.fmouse = 1DATA if self.curHandle!=None:DATA #Move handleDATA,< if (self.HandlerAreaHitTest(dx,dy)):DATA$ self.curHandle.MoveTo(dx,dy)DATA  else:DATA, # Create a new handleDATA(| hnd = self.PaletteHitTest(dx,dy)DATA if (hnd != None): DATAL  w = CGHandle(hnd.intensity,hnd.id,hnd.rc.L,hnd.rc.T,hnd.rc.R,hnd.rc.B)DATA self.AddHandle(w)DATA del w,hndDATA   else:DATAL # Select handleDATA0 self.curHandle=self.HndLstHitTest(dx,dy)DATAD elif (buttons[0] == 0) and (self.fmouse ==1): # Left Button UpDATA\ if self.curHandle!=None:DATA  i = self.GetIntensityAt(dx)DATA< self.curHandle.SetIntensity(self.GetIntensityAt(dx))DATAl self.curHandle = NoneDATA  rtn = 1DATA self.fmouse = 0DATA0< elif (buttons[1]==1): # Middle Button DownDATA passDATA, elif (buttons[2]==1): # Right Button DownDATA, # Select handleDATA,l self.curHandle=self.HndLstHitTest(dx,dy)DATA( if self.curHandle: self.fmouse = 2DATA DATA,L elif (buttons[2]==0): #Right Button UpDATA4 if self.curHandle!=None and (self.fmouse == 2):DATA8  if Blender.Draw.PupMenu("Delete?%t|Yes%x1|No%x0"):DATAl #Delete handleDATA( self.RemoveHandle(self.curHandle)DATA self.curHandle=NoneDATAL self.fmouse = 0DATA  Draw()DATA del ViewPortDATA DATA< return rtnDATA|DATAD# ---------------------------------------------------------------DATA#DATAL# Event DefinitionsDATA#DATAD# --------------------------------------------------------------- DATA,EVENT_NONE = 0DATAlEVENT_WIDTH = 1DATAEVENT_HEIGHT = 2DATAEVENT_ASPX = 3DATA,EVENT_ASPY = 4DATAlEVENT_CHANGE_MASK = 5DATAEVENT_LINE_W = 6DATAEVENT_SIL_W = 7DATA,EVENT_LINES = 8 DATAlEVENT_RENDER_TYPE = 9DATAEVENT_PIXELATE=10DATAEVENT_LEVEL=11DATA,EVENT_SILHOUETTE = 12DATAlEVENT_COLOR = 13DATAEVENT_STARTFRAME = 14DATAEVENT_ENDFRAME = 15DATA,EVENT_STEPFRAME = 16DATAlEVENT_E0 = 17DATAEVENT_E1 = 18DATAEVENT_E2 = 19DATA,EVENT_E3 = 20DATAlEVENT_CREATE_SWF = 21DATAEVENT_CREATE_BMP = 22 DATAEVENT_FILENAME =23DATA,EVENT_MASK = 24DATAlEVENT_REFRESH=25DATAEVENT_QUIT= 26DATAEVENT_LOOP=27DATA,EVENT_QLTY=28DATAlEVENT_FPS=29DATAEVENT_PREVIEW=30DATAEVENT_CREATE_TIF=31DATA,EVENT_MENU_RENDER=32DATAlEVENT_MENU_EXPORT=33DATAEVENT_MENU_SEQUENCE=34DATAEVENT_ADD_ITEM = 35DATA,EVENT_DEL_ITEM = 36DATAlEVENT_REMOVE_ALL = 37DATAEVENT_ADD_ALL = 38DATAEVENT_GET_FILE = 39DATA,EVENT_PATHNAME = 40DATAlEVENT_SEQUENCE_SWF = 41DATAEVENT_BROWSE = 42DATAEVENT_SEQ_FLAG = 43DATA,EVENT_NUM_SEQ_F = 44DATAlEVENT_PARAMS = 45DATA¬EVENT_RESETFRAMES = 46DATAEVENT_VEC_PREVIEW = 47DATA,EVENT_VEC_TYPE = 48DATAlEVENT_TOLERANCE = 49DATAìEVENT_SHADOW = 50DATAEVENT_LAMP_SHADOW = 52DATA,DATA@\# -------------------------------------------------------------DATA#DATA # ConstantsDATA<#DATA@l# -------------------------------------------------------------DATASMALL = 0.000001DATADATA@L# -------------------------------------------------------------DATAƼ#DATA# Common functionsDATA,#DATA@\# -------------------------------------------------------------DATAdef sgn(n): DATA  if (n>=0): return 1DATAL else: return -1DATAȌdef sgn0(n):DATA if (n>SMALL): return 1DATA  elif (n=0: ax = D[0]DATA else: ax = -D[0]DATA< if D[1]>=0: ay = D[1]DATA| else: ay = -D[1]DATA if D[2]>=0: az = D[2]DATA else: az = -D[2]DATA(< if (ax+ay+az) < SMALL: return NoneDATA  maxc = 0DATA if (ax>ay):DATA  if (ax>az): maxc =1DATAL else: maxc = 3DATA else:DATA if (ay>az): maxc =2DATA else: maxc = 3DATA,< #Zero max coordinate and solve other twoDATA4 d1 = -1 * DotVecs(self.vn,Vector(self.pts[1]))DATA0 d2 = -1 * DotVecs(pl.vn,Vector(pl.pts[1]))DATA\ x = 0DATA y = 0DATA z = 0DATA( if maxc == 1: # intersect with x=0DATA,< y = (d2*self.vn[2] - d1*pl.vn[2]) / D[0]DATA, z = (d1*pl.vn[1] - d2*self.vn[1]) / D[0]DATA( elif maxc == 2: # intersect with y=0DATA,L x = (d1*pl.vn[2] - d2*self.vn[2]) / D[1]DATA, z = (d2*self.vn[0] - d1*pl.vn[0]) / D[1]DATA   else: #intersect with z=0DATA,\ x = (d2*self.vn[1] - d1*pl.vn[1]) / D[2]DATA, y = (d1*pl.vn[0] - d2*self.vn[0]) / D[2]DATA D.normalize()DATA$\ return [[x,y,z],[D.x,D.y,D.z]] DATADATA$ def over_under_face(self,ptslst):DATA(, u = map(sgn0,map(self.solve,ptslst))DATA| count=[0,0,0] #-1,0,1 DATA for item in u:DATA   if (item==-1): count[0]+=1DATA \ elif (item==0): count[1]+=1DATA else: count[2]+=1DATA sz = len(ptslst)DATA<, if count[0]>0 and count[2]==0: return -1 # poly at backDATA@ elif count[2]>0 and count[0]== 0: return 1 # poly at frontDATA0  elif count[1] == sz: return 0 # poly on planeDATAl else: return 2DATADATA, def intersect_face(self,ptslst,bsplit=1):DATA4< """Test if the face is intersecting this plane.DATA@ Parameter: Polygon face [[x0,y0,z0],[x1,y1,z1],...[xn,yn,zn]]DATA DATA< Return values:DATAD| None - If face is on one side of the plane (Not intersection)DATAT [[face]] - List containing one face (original given face) when the plane andDATADl the face are coplanar (face and plane are the same plane)DATAT [[face],[face]] - List of two faces (original face splitted) one for the face DATAD\ infront of the plane and other for the face behind the plane.DATA """DATA( ans = self.over_under_face(ptslst)DATALL if (ans==-1 or ans == 1): return None #Face is on one side of the planeDATA8 elif (ans == 0): return [ptslst] #Coplanar trianglesDATA, else: # SplitDATAl #No split if flag offDATA$ if bsplit==0: return [ptslst]DATA<  # Double check the intersection of faces not only planesDATA,| #npl = _Plane().set_from_face(ptslst)DATA, #ans2 = npl.over_under_face(self.pts)DATA,< #if ans2==-1 or ans2 == 1: return NoneDATA DATA  #Split DATA   dv1 = map(self.solve,ptslst)DATA\ s1 = map(sgn0,dv1)DATA  f1 = []DATA  f2 = []DATA sz = len(s1)DATA\ for idx in range(sz):DATA i = idx + 1DATA if i>=sz: i = 0DATA,, if (s1[idx]>0): f1.append(ptslst[idx])DATA0 elif (s1[idx]<0): f2.append(ptslst[idx])DATA  else: DATA, f1.append(ptslst[idx])DATA| f2.append(ptslst[idx])DATA  if s1[i]!=0 and s1[idx]!=0:DATA if (s1[i]!=s1[idx]):DATA8l k = self.intersect_line([ptslst[idx],ptslst[i]])DATA f1.append(k[0])DATA  f2.append(k[0])DATAL return [f1,f2]DATADATA#p = _Plane()DATA4#p = p. set_from_face([[0,0,0],[1,0,0],[1,1,0]])DATA,\#f = [[1,1,1],[3,1,1],[2,1,-1],[3,1,-1]]DATA#print p.intersect_face(f)DATA DATA<DATADl# --------------------------------------------------------------DATA# DATA # Class _FrustumDATAL# DATA@|# -------------------------------------------------------------DATAclass _Frustum:DATA, "Frustum class"DATA l val = []DATA def calculate(self,m,p):DATA$ "Calculate frustum bouding box."DATA  L c = p * mDATA   q = c[3]DATA  self.val[0].set(q+c[0])DATA  # self.val[0].normalize()DATA l self.val[1].set(q-c[1])DATA  # self.val[1].normalize()DATA  self.val[2].set(q-c[0])DATA  \ # self.val[2].normalize() DATA  self.val[3].set(q+c[1])DATA  # self.val[3].normalize()DATA L self.val[4].set(q-c[2])DATA  # self.val[4].normalize()DATA  self.val[5].set(q+c[2])DATA < # self.val[5].normalize()DATA   def __init__(self,model,proj):DATA$  "Frustum is a vector of planes." DATA, pl = _Plane() # LeftDATAl pt = _Plane() # TopDATA pr = _Plane() # RightDATA pb = _Plane() # BottomDATA< pk = _Plane() # bacKDATA| pf = _Plane() # ForwardDATA$ self.val = [pl,pt,pr,pb,pk,pf]DATA  self.calculate(model,proj)DATAl def pt_inside(self,pt):DATA8 """Check if a point [x,y,z] is inside the frustum.DATA  (1 = inside, 0 = outside)"""DATAl for pl in self.val:DATA$ if (pl.solve(pt)<0): return 0DATA  return 1DATA$< def sphere_inside(self,center,r):DATA8 """Check if a sphere with the center point at [x,y,z]DATA8 and with a radius r, is inside the frustum. Return 1DATA L if is inside, 0 if not."""DATA for pl in self.val:DATA( if (pl.solve(center)<=-r): return 0DATA , return 1DATA,l def partial_sphere_inside(self,center,r):DATA8 """Check if a sphere with the center point at [x,y,z]DATA8, and with a radius r, is partial inside the frustum. DATA  Return: 0 - Totally outsideDATA 1 - Partially insideDATA, 2 - Totally inside"""DATA| p = 0DATA for pl in self.val:DATA d = pl.solve(center)DATA, if (d<=-r): return 0DATAl elif (d>r): p = p + 1DATA if (p == 6): return 2DATA  return 1DATA< def box_inside(self,box):DATA8 """Check if a box is inside the frustum (qFrustum).DATA< First check if the center of the box is infront of allDATA@\ the planes, if true then return 1, if not check every cornerDATA@ to find at least one that is infront of the frustum planes,DATA4< if such case occurs then return 1 else 0."""DATA0 if (self.pt_inside(box.center)==1): return 1DATA else:DATA, for pl in self.val:DATAl found = 0DATA for pt in box.val:DATA if (pl.solve(pt)>0):DATA< found = 1DATA | breakDATA  if (found == 0): return 0DATA   return 1DATA$L def partial_box_inside(self,box):DATA@ """Check if a box is partial inside the frustum (qFrustum).DATA   Return: 0 - Totally outsideDATA\ 1 - Partially insideDATA 2 - Totally inside"""DATA for pt in box:DATA< found = 0DATA| for pl in self.val:DATA$ if (pl.solve(pt))>0: found+=1DATA  if found>=3: return 1DATA  \ return 0DATA(  def partial_face_inside(self,face):DATA4  """Check if a face is partial inside the frustum.DATA !L Return: 0 - Totally outsideDATA! 1 - Partially insideDATA! 2 - Totally inside"""DATA "< p = 0 DATA"| sz = len(face)DATA" for pl in self.val:DATA" found = 0DATA#< for pt in face:DATA,#| if (pl.solve(pt)>=0): found = found + 1DATA# if (found==0): return 0DATA $, if (found == sz): p = p + 1DATA$| if (p == 6): return 2DATA $ return 1DATA$DATAD%,# ---------------------------------------------------------------DATA %# Function : MatrixToBufferDATA %# Inputs :DATA&,# OutPuts :DATA&l# Description :DATAD&# --------------------------------------------------------------- DATA'def MatrixToBuffer(m):DATA@'\ return Buffer(GL_FLOAT,16,[m[0][0],m[0][1],m[0][2],m[0][3],DATA,' m[1][0],m[1][1],m[1][2],m[1][3],DATA,(, m[2][0],m[2][1],m[2][2],m[2][3],DATA,( m[3][0],m[3][1],m[3][2],m[3][3]])DATA(DATAD)# ---------------------------------------------------------------DATA)# Function : PerspectiveDATA )# Inputs :DATA*# OutPuts :DATA*\# Description :DATAD*# --------------------------------------------------------------- DATA,+ def Perspective(fovy, aspect, near,far):DATA(+l top = near * tan(fovy * pi / 360.0)DATA+ bottom = -topDATA+ left = bottom*aspectDATA,< right= top*aspectDATA$,| x = (2.0 * near) / (right-left)DATA$, y = (2.0 * near) / (top-bottom)DATA$- a = (right+left) / (right-left)DATA$-l b = (top+bottom) / (top - bottom)DATA$- c = - ((far+near) / (far-near))DATA$.  d = - ((2*far*near)/(far-near))DATAP.\ return Matrix([x,0.0,a,0.0],[0.0,y,b,0.0],[0.0,0.0,c,d],[0.0,0.0,-1.0,0.0])DATA. DATAD/ # ---------------------------------------------------------------DATA /|# Function : IntersectLinesDATA /# Inputs :DATA0 # OutPuts :DATA0L# Description :DATAD0# --------------------------------------------------------------- DATA$0def IntersectLines(l1,l2,flag = 0):DATA1L d = float(l1[2]-l1[0])DATA$1 if d!=0: m1 = float(l1[3]-l1[1])/dDATA1 else: m1 = 10000000000.0DATA2, d = float(l2[2]-l2[0])DATA$2l if d!=0: m2 = float(l2[3]-l2[1])/dDATA2 else: m2 = 10000000000.0DATA3  #compute ConstantsDATA03L a1 = m1;b1 = -1.0;c1 = float(l1[1]-m1*l1[0])DATA03 a2 = m2;b2 = -1.0;c2 = float(l2[1]-m2*l2[0])DATA4  if m1 == m2:DATAT4L if abs(a1*l2[0] + b1*l2[1] + c1) < SMALL: return [(l1[0],l1[1]),(l1[2],l1[3])]DATA4 else:DATA4 #Inverse determinantDATA$5< invdet = 1/((a1*b2) - (a2*b1))DATA5 #Kramer's RuleDATAT5 pt = (int((((b1*c2)-(b2*c1))*invdet)+0.5),int((((a2*c1)-(a1*c2))*invdet)+0.5))DATA6L if flag: return [pt]DATA6 j=0;k=2;i=1;l=3DATA6 if l1[0]>l1[2]:DATA 7  j = 2DATA 7L k = 0DATA7 if l1[1]>l1[3]:DATA 7 i = 3DATA 8  l = 1DATAH8L if (pt[0]>=l1[j] and pt[0]<=l1[k] and pt[1]>=l1[i] and pt[1]<=l1[l]):DATA8 return [pt] DATA8 return NoneDATA9<DATAD9l# ---------------------------------------------------------------DATA9# Function : InsideEdgeDATA :,# Inputs :DATA:l# OutPuts :DATA:# Description :DATAD:# --------------------------------------------------------------- DATA;\def InsideEdge(pt,e):DATAH; if ((e[2]-e[0])*(pt[1]-e[1])) < ((pt[0]-e[0])*(e[3]-e[1])): return 1DATA <  return -1DATA\def EdgeClip(inlist,edge):DATA> outlst = []DATA> sz = len(inlist)DATA?, s = inlist[sz-1]DATA?l for p in inlist:DATA? if InsideEdge(p,edge)>0:DATA? if InsideEdge(s,edge)<0:DATA4@L i = IntersectLines([s[0],s[1],p[0],p[1]],edge)DATA8@ if i!=None: outlst.append((i[0][0],i[0][1],s[2]))DATAA  outlst.append(p)DATAAL else:DATAA| if InsideEdge(s,edge)>0:DATA4A i = IntersectLines([s[0],s[1],p[0],p[1]],edge)DATA8B, if i!=None: outlst.append((i[0][0],i[0][1],p[2])) DATAB s = pDATAB return outlstDATABDATADC,# ---------------------------------------------------------------DATAC# Function :PolyClipDATA C# Inputs :DATAD# OutPuts :DATAD\# Description :DATADD# --------------------------------------------------------------- DATAE def PolyClip(vertexlst):DATAE\ global gW,gHDATATE ClipRgnEdges = [[0,0,0,gH.val],[0,gH.val,gW.val,gH.val],[gW.val,gH.val,gW.val,0],DATAF [gW.val,0,0,0]]DATAF\ inlist = vertexlstDATAF for edge in ClipRgnEdges:DATA,F if inlist==None or inlist == []: breakDATA$GL inlist = EdgeClip(inlist,edge)DATAG return inlistDATAG DATADH # ---------------------------------------------------------------DATA H|# Function : RenderWireFrameDATA H# Inputs :DATAI # OutPuts :DATAIL# Description :DATADI# --------------------------------------------------------------- DATA(Idef RenderWireFrame(tofile,w,h,ax,ay):DATA(JL global gLineWidth,gbSilhouette,gGenColDATA0J global gMsg,gCurrentFrame,gRendering,buffImageDATAJDATAK, gRendering = 1DATAKl DATA K mW = w/2DATA K mH = h/2DATAL DATALL # Set Current FrameDATA(L Blender.Set('curframe',gCurrentFrame)DATAL Blender.Window.RedrawAll()DATAM, # Get SceneDATA$Ml sc = Blender.Scene.getCurrent()DATAM obList = sc.getChildren()DATAN DATA N< if tofile:DATAN| sh = bShape()DATAN sh.Reset()DATAN movie = []DATAO< placelist = []DATA O| gMsg = "Rendering Wireframe"DATAO oldclr = [-1,-1,-1]DATAP  bChgColor = 0DATAPL else:DATA P| glClearColor(0.0,0.0,0.3,1.0)DATA8P glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)DATA,Q, glPolygonMode(GL_FRONT_AND_BACK,GL_FILL)DATAQ #Draw BackgroundDATA8Q glColor3f(gGenCol[3][0],gGenCol[3][1],gGenCol[3][2])DATAR, glBegin(GL_POLYGON)DATARl glVertex2d(9,10)DATAR glVertex2d(w+10,10)DATAR glVertex2d(w+10,h+10)DATAS, glVertex2d(9,h+10)DATA Sl glEnd()DATA,S glPolygonMode(GL_FRONT_AND_BACK,GL_LINE)DATAT DATAT< # Get Visible LayersDATA(T| layerslst = Blender.Window.ViewLayer()DATAT layerslst.reverse()DATAU  LayerMask = 0DATA0UL for l in layerslst: LayerMask += (2**(l-1))DATAU del layerslstDATA8U # Calculate Perspective Matrix from the current cameraDATA$VL obCamera = sc.getCurrentCamera()DATAV del scDATA$V cam = obCamera.getInverseMatrix()DATAW cam.transpose() DATAW\DATAW # Changing the view modeDATAW cmra = obCamera.getData()DATA0X, fovy = (2.0*atan2(34.5/2.0,cmra.lens))*180/piDATAPX m2 = Perspective(fovy,float(w*ax)/float(h*ay),cmra.clipStart, cmra.clipEnd) DATAY  del fovy,cmraDATAYL DATAY| #Create Frustum DATAY frustum = _Frustum(cam,m2)DATAZ  m1 = Matrix()DATAZL mP = Matrix()DATA Z numobj = 0DATAZ for obMesh in obList:DATAH[  if (type(obMesh.data)==NMeshType) and ((obMesh.Layer & LayerMask)>0):DATA<[| mhActual = NMesh.GetRawFromObject(obMesh.name) #GetRawDATA4[ #Obtain the colors of the objects in this frameDATA\L colors = []DATA$\ if len(mhActual.materials)>0:DATA(\ for colsmat in mhActual.materials:DATAD], colors.append([colsmat.R,colsmat.G,colsmat.B,colsmat.alpha])DATA(] else: colors = [[0.7,0.7,0.7,1.0]]DATA ] m1 = obMesh.matrixWorld #matDATA^< m1.transpose()DATA^| mP = cam * m1DATA^ mP = m2 * mPDATA^DATA_, b = obMesh.getBoundBox()DATA _| bb=[]DATA_ for nb in b:DATA<_ nb1 = MatMultVec(m1,Vector([nb[0],nb[1],nb[2],1.0]))DATA(`l bb.append([nb1[0],nb1[1],nb1[2]])DATA,` if (frustum.partial_box_inside(bb)>0):DATA a # Obtain the list of facesDATA al for f in mhActual.faces:DATAa tf = []DATAa t2 = []DATAb< for v in f.v:DATA4b| #Transform the vertices to global coordinatesDATA@b p = MatMultVec(mP,Vector([v.co[0],v.co[1],v.co[2],1.0]))DATAcL tf.append(p)DATA@c p = MatMultVec(m1,Vector([v.co[0],v.co[1],v.co[2],1.0]))DATA$c t2.append([p[0],p[1],p[2]])DATA,dL if (frustum.partial_face_inside(t2)):DATAd if tofile:DATATd # ------------------------------------------------------------- SWF BeginDATAxel clr = [int(colors[f.mat][0]*255),int(colors[f.mat][1]*255),int(colors[f.mat][2]*255),int(colors[f.mat][3]*255)]DATAf  bChgColor = 0DATA`fL if (oldclr[0]!=clr[0] or oldclr[1]!=clr[1] or oldclr[2]!=clr[2] or oldclr[3]!=clr[3] ):DATADf _fsa = FILLSTYLEARRAY([FILLSTYLE(SOLID_FILL,[0,0,0,255])])DATALgL _lsa = LINESTYLEARRAY([LINESTYLE(1,[clr[0],clr[1],clr[2],255])])DATA0g oldclr = [clr[0],clr[1],clr[2],clr[3]]DATAh, bChgColor = 1DATAPhl # ------------------------------------------------------------- SWF EndDATA h else:DATA$i, glLineWidth(gLineWidth.val)DATAHi| glColor3f(colors[f.mat][0],colors[f.mat][1],colors[f.mat][2]) DATAi glBegin(GL_POLYGON)DATAj<DATAjl iu = [] DATAj for p in tf:DATAj # Create PointDATAk, if p[3]<=0:DATAkl x = int(p[0]*mW)+mWDATAk y = int(p[1]*mH)+mHDATAl  else:DATA$lL x = int((p[0]/p[3])*mW)+mWDATA$l y = int((p[1]/p[3])*mH)+mHDATAl DATAm iu.append([x,y,0])DATAml #clippingDATAm iu = PolyClip(iu)DATAmDATAn, if len(iu)>0:DATAnl if not tofile:DATA4n for i in iu: glVertex2d(i[0]+10,i[1]+10)DATAo  glEnd()DATAoL else:DATATo # ------------------------------------------------------------- SWF BeginDATAp  if bChgColor==1:DATAhp\ sh.SetStyleRecord(SH_MOVE+SH_LINESTYLE+SH_NEWSTYLES,iu[0][0],h-iu[0][1],0,0,1,1,1,_fsa,_lsa)DATA0p else: sh.MoveTo(iu[0][0],h-iu[0][1])DATA$qL for k in range(len(iu)):DATAq i = k+1DATA q if i>=len(iu): i = 0DATA@r, sh.LineTo(iu[i][0]-iu[k][0],(h-iu[i][1])-(h-iu[k][1]))DATAPr # ------------------------------------------------------------- SWF EndDATAs del iuDATA s\ del tfDATA s numobj+=1DATAsDATAt  del LayerMaskDATAtLDATA t| if tofile:DATALt # ------------------------------------------------------------- SWF BeginDATAu< sh.EndShape()DATAu| movie = sh.GetShape()DATAu gPercentage = 0.0DATA u del shDATA v< Draw()DATAv| gRendering = 0DATAv return movieDATALv # ------------------------------------------------------------- SWF EndDATAw| else:DATA,w glPolygonMode(GL_FRONT_AND_BACK,GL_FILL)DATAx  glLineWidth(1.0)DATA$xL buffImage = Buffer(GL_BYTE,w*h*3)DATAx # Viewpoint dataDATA x ViewData = Buffer(GL_INT,4)DATA(y, glGetIntegerv(GL_VIEWPORT,ViewData)DATAy| glReadBuffer(GL_BACK)DATATy glReadPixels(ViewData[0]+10,ViewData[1]+11,w,h,GL_RGB,GL_UNSIGNED_BYTE,buffImage)DATAz< gRendering = 0DATA z| return 0DATAzDATADz# ---------------------------------------------------------------DATA{\# Function : DrawObjectsDATA {# Inputs :DATA{# OutPuts :DATA|,# Description :DATAD|l# --------------------------------------------------------------- DATA|def DrawObjects(tofile):DATAD}, global gRenderType, buffImage,shadowbuff,gEnableMask,gCurrentFrameDATA<} global gW,gH,gAspX,gAspY, gFX, gFXType,gLevel,gRenderingDATA4~  global gLineWidth,gbLines,gbSilhouette,gSilWidthDATA(~l global gGenCol,gPalette,gDoubleSidedDATA~ global gShadowDATA~ DATA, gRendering = 1DATAlDATA # Set Current FrameDATA( Blender.Set('curframe',gCurrentFrame)DATA, Blender.Window.RedrawAll()DATA| #Get Current SceneDATA$ sc = Blender.Scene.getCurrent()DATA  # Get Visible LayersDATA(L layerslst = Blender.Window.ViewLayer()DATA layerslst.reverse()DATA LayerMask = 0DATA0 for l in layerslst: LayerMask += (2**(l-1))DATA| del layerslstDATA # Get Current cameraDATA$ obCamera = sc.getCurrentCamera()DATAL cmra = obCamera.getData()DATA obList = sc.getChildren()DATA del scDATADATA8L # Calculate Perspective Matrix from the current cameraDATA$ cam = obCamera.getInverseMatrix()DATA cam.transpose() DATA4< fovy = (2.0*atan2(34.5/2.0,cmra.lens))*180.0/piDATAh m3 = Perspective(fovy,float(gW.val*gAspX.val)/float(gH.val*gAspY.val),cmra.clipStart, cmra.clipEnd) DATA, # Create FrustumDATAl frustum = _Frustum(cam,m3)DATA LampLst = []DATA #Get all lamps positionsDATAL for obj in obList:DATA  if (obj.getType()=="Lamp"):DATA lmp = obj.getData()DATA flags = lmp.getMode()DATA l shdw = 0DATA, if flags & lmp.Modes['Shadows']: shdw=1DATA  loc = obj.locDATADL LampLst.append([loc[0],loc[1],loc[2],shdw,lmp.getClipEnd()]) DATA del lmp,loc,shdw,flagsDATA  DATA(< numcolors = 64/gPalette.GetNumColors()DATA$ m = 64 % gPalette.GetNumColors()DATA vMaskColors = []DATA  for hnd in gPalette.hndlst:DATAl r = [hnd.intensity]DATA r *= numcolors DATA vMaskColors.extend(r)DATA, del rDATA \ if (m>0):DATA idx = len(vMaskColors)-1DATA  r = [vMaskColors[idx-1]] * mDATA< vMaskColors.extend(r)DATA | del r,idxDATA  del hndDATADATAl, glPushAttrib(GL_LIGHTING_BIT|GL_ENABLE_BIT|GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT|GL_STENCIL_BUFFER_BIT)DATA glDisable(GL_SCISSOR_TEST)DATA  glClearColor(0.0,0.0,0.3,1.0)DATAl glClearStencil(0)DATA4 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)DATA  glEnable(GL_SCISSOR_TEST)DATA\DATADATA if gEnableMask.val:DATA8 glColor3f(gGenCol[0][0],gGenCol[0][1],gGenCol[0][2])DATA\ else:DATA #Draw BackgroundDATA8 glColor3f(gGenCol[3][0],gGenCol[3][1],gGenCol[3][2])DATA$, gModelMatrix = Buffer(GL_FLOAT,16)DATA$| gProjMatrix = Buffer(GL_FLOAT,16)DATA0 glGetFloatv(GL_MODELVIEW_MATRIX,gModelMatrix)DATA0, glGetFloatv(GL_PROJECTION_MATRIX,gProjMatrix)DATA glBegin(GL_POLYGON)DATA glVertex2d(9,10)DATA  glVertex2d(gW.val+10,10)DATA$\ glVertex2d(gW.val+10,gH.val+10)DATA glVertex2d(9,gH.val+10)DATA  glEnd()DATA<DATA l Viewport = Buffer(GL_INT, 4)DATA( glGetIntegerv(GL_VIEWPORT, Viewport)DATA<  glViewport(Viewport[0]+10, Viewport[1]+10, gW.val, gH.val)DATA|DATA glEnable(GL_DEPTH_TEST)DATA glDisable(GL_LIGHTING)DATA< glShadeModel(GL_FLAT)DATA| glDrawBuffer(GL_BACK)DATADATA  glMatrixMode(GL_PROJECTION)DATA< glPushMatrix()DATA| glLoadIdentity()DATAh m3 = Perspective(fovy,float(gW.val*gAspX.val)/float(gH.val*gAspY.val), cmra.clipStart, cmra.clipEnd) DATAL del cmra,fovyDATADATA m3.transpose()DATA proj = MatrixToBuffer(m3)DATAL glMultMatrixf(proj)DATA4 cam = MatrixToBuffer(obCamera.getInverseMatrix())DATA glMultMatrixf(cam)DATA,DATA\ glMatrixMode(GL_MODELVIEW)DATA glLoadIdentity()DATADATA$ glPolygonMode(GL_FRONT,GL_FILL)DATAl if (gRenderType.val>=2):DATA glDisable(GL_TEXTURE_2D)DATA@  glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT)DATA@| glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_REPEAT)DATAD glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)DATAD\ glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)DATA< glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE, GL_DECAL)DATA< DATAlDATA width = gW.valDATA height = gH.valDATA bsz = width*height*3DATA$\ buffImage = Buffer(GL_BYTE,bsz)DATA$ buff2 = Buffer(GL_BYTE,bsz)DATA, shadowbuff= Buffer(GL_BYTE,bsz,[255]*bsz)DATA \ del bszDATA( gBmpTexture = Buffer(GL_BYTE,32*3)DATADATA gTextBits=[0]*32DATA4\ if (gRenderType.val>3) and (gRenderType.val<7):DATAP gTextBits = [1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0]DATA<DATAl w3 = width * 3DATA j3 = height*w3DATA bj3 = j3-w3DATA,DATA\ dictfilter={}DATA dictfilter[(0,0,0)]=1DATA  dictfilter[(255,255,255)]=1DATA8, # __________________________________________________DATA8 # Add Background, lines, silhouette, and mask colorsDATA8 # __________________________________________________DATAL for i in [0,1,2,3]:DATA  ir = int(gGenCol[i][0]*255)DATA  ig = int(gGenCol[1][1]*255)DATA , ib = int(gGenCol[1][2]*255)DATA | if (ir,ig,ib) in dictfilter:DATA passDATA else:DATA, dictfilter[(ir,ig,ib)]=1DATA| ObjLst = []DATA shadowlines = []DATA for obj in obList:DATAD< if (type(obj.data)==NMeshType) and ((obj.Layer & LayerMask)>0):DATA m1 = obj.matrixWorldDATA m1.transpose()DATA8, # ------------------------------------------------DATA  # Set Object Bounding BoxDATA8 # ------------------------------------------------DATA < Box = []DATA| b = obj.getBoundBox()DATA  bb=[]DATA  for nb in b:DATA<L nb1 = MatMultVec(m1,Vector([nb[0],nb[1],nb[2],1.0]))DATA( bb.append([nb1[0],nb1[1],nb1[2]])DATA  Box.extend(bb)DATAL DATA| m1.transpose()DATA m2 = CopyMat(m1)DATA m2.transpose()DATA< DATA,l if (frustum.partial_box_inside(Box)>0) :DATA8 # ------------------------------------------------DATA, # Set MeshDATA8l # ------------------------------------------------DATA0 Mesh = NMesh.GetRawFromObject(obj.name) DATA, glPushMatrix()DATA l mat = MatrixToBuffer(m1)DATA glMultMatrixf(mat)DATA$ invmat = obj.getInverseMatrix()DATAL colors = []DATA4 #Obtain the colors of the objects in this frameDATA  if len(Mesh.materials)>0:DATA$< for colsmat in Mesh.materials:DATAD colors.append([colsmat.R,colsmat.G,colsmat.B,colsmat.alpha])DATA( else: colors = [[0.7,0.7,0.7,1.0]]DATALDATA(| #Change the colors of the textures DATA textures = []DATA  for clr in colors:DATAL tones = []DATA for t in range(64):DATA, ir = int((clr[0]*vMaskColors[t])*255)DATA,< ig = int((clr[1]*vMaskColors[t])*255)DATA, ib = int((clr[2]*vMaskColors[t])*255)DATA$ if (ir,ig,ib) in dictfilter:DATA L passDATA  else:DATA  dictfilter[(ir,ig,ib)]=1DATA8 tones.append(int((clr[0]*vMaskColors[t])*255))DATA8| tones.append(int((clr[1]*vMaskColors[t])*255))DATA8 tones.append(int((clr[2]*vMaskColors[t])*255))DATA< textures.append(tones)DATA del tonesDATA glLineWidth(1.0) DATA  DATA8< if gDoubleSided.val == 0: glEnable(GL_CULL_FACE)DATA DATA edgedic = {}DATA  capnear =[]DATAL capfar = []DATA DATA for face in Mesh.faces:DATA  n = face.noDATA(L n =Vector([n[0],n[1],n[2],1.0])DATA  n = MatMultVec(invmat,n)DATA n.normalize()DATA, DATA\ if gbSilhouette.val>0:DATA  glEnable(GL_CULL_FACE)DATA$ glLineWidth(gSilWidth.val)DATA(L glPolygonMode(GL_BACK,GL_LINE)DATA glCullFace(GL_FRONT)DATA glBegin(GL_POLYGON)DATA<< glColor3f(gGenCol[2][0],gGenCol[2][1],gGenCol[2][2])DATA for vertex in face.v:DATA4 glVertex3f(vertex[0], vertex[1], vertex[2])DATA\ glEnd()DATA glCullFace(GL_BACK)DATA glLineWidth(1.0) DATA0< glPolygonMode(GL_FRONT_AND_BACK,GL_FILL)DATA8 if gDoubleSided.val == 1: glDisable(GL_CULL_FACE)DATA DATA(, clr = colors[face.materialIndex]DATA8| if (gRenderType.val==2) or (gRenderType.val==3):DATAD texbuff = Buffer(GL_BYTE, 64*3,textures[face.materialIndex])DATA L glDisable(GL_TEXTURE_1D)DATAXœ glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 64, 0, GL_RGB, GL_UNSIGNED_BYTE, texbuff)DATA  glEnable(GL_TEXTURE_1D)DATA l elif (gRenderType.val>3):DATAXü r1,g1,b1 = int(gGenCol[1][0]*255),int(gGenCol[1][1]*255),int(gGenCol[1][2]*255)DATAD< r2,g2,b2 = int(clr[0]*255),int(clr[1]*255),int(clr[2]*255)DATAĬ j,i = 0,0DATA  for i in range(0,32*3,3):DATA< if gTextBits[j]: DATAŌ gBmpTexture[i]=r1DATA gBmpTexture[i+1]=g1DATA, gBmpTexture[i+2]=b1DATA| else:DATAƼ gBmpTexture[i]=r2DATA  gBmpTexture[i+1]=g2DATA\ gBmpTexture[i+2]=b2DATA Ǭ j+=1DATA  del i,j,r1,g1,b1,r2,b2,g2DATA< params=[]DATAL| if (gRenderType.val==4): params=Buffer(GL_FLOAT,4,[1.0,0.0,0.0,0.0])DATAP elif (gRenderType.val==5): params=Buffer(GL_FLOAT,4,[0.0,1.0,0.0,0.0])DATAP| elif (gRenderType.val==6): params=Buffer(GL_FLOAT,4,[0.0,0.0,1.0,0.0])DATA  glDisable(GL_TEXTURE_1D)DATA\L glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, gBmpTexture)DATA  glEnable(GL_TEXTURE_1D)DATA<, glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR)DATA0˜ glTexGenfv(GL_S,GL_OBJECT_PLANE,params)DATA8 glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR)DATA,\ glTexGenfv(GL_T,GL_EYE_PLANE,params)DATA$̼ glEnable(GL_TEXTURE_GEN_S)DATA  DATA< del paramsDATA | else:DATA(ͼ glColor3f(clr[0],clr[1],clr[2])DATA(  glPolygonMode(GL_FRONT,GL_FILL)DATA\ DATAΌ p1 = face.v[0]DATA` vCamera = Vector([obCamera.loc[0]-p1[0],obCamera.loc[1]-p1[1],obCamera.loc[2]-p1[2],1.0])DATA\ vCamera.normalize()DATAϬ DATA@ #Create the Shadow Volume for the lamps that cast shadowsDATA0L if (len(LampLst)>0) and (gShadow.val>0):DATAЬ DATA numlamp=0DATA for lamp in LampLst:DATADl if lamp[3]==0: continue #Skip lamps that don't cast shadowsDATA0 infinity=lamp[4] #Lamp's Clip EndDATA< numlamp+=1DATA| p2 = face.v[0]DATA<Ҽ p2 = MatMultVec(m2,Vector([p2[0],p2[1],p2[2],1.0]))DATAL, vLight = Vector([lamp[0]-p2[0],lamp[1]-p2[1],lamp[2]-p2[2],1.0])DATAӬ vLight.normalize()DATA( if (DotVecs(vLight,n)>-0.001):DATAL _cn=[] # Near CapDATAԜ _cf=[] # Far CapDATA( for iv in range(len(face.v)):DATA< pt2 = face.v[iv]DATADՌ vtx2 = MatMultVec(m2,Vector([pt2[0],pt2[1],pt2[2],1.0]))DATA$ # Find silhuette shadowDATA$L v1 = face.v[iv-1].indexDATA ֜ v2 = face.v[iv].indexDATAH if (numlamp,v1,v2) in edgedic: edgedic[(numlamp,v1,v2)]=NoneDATAH\ elif (numlamp,v2,v1) in edgedic: edgedic[(numlamp,v2,v1)]=NoneDATA else:DATA   pt1 = face.v[iv-1]DATA\ pt2 = face.v[iv]DATADج vtx1 = MatMultVec(m2,Vector([pt1[0],pt1[1],pt1[2],1.0]))DATAD vtx2 = MatMultVec(m2,Vector([pt2[0],pt2[1],pt2[2],1.0]))DATAPٌ _v1 = Vector([vtx1[0]-lamp[0],vtx1[1]-lamp[1],vtx1[2]-lamp[2],1.0])DATA  _v1.normalize()DATAP\ _v2 = Vector([vtx2[0]-lamp[0],vtx2[1]-lamp[1],vtx2[2]-lamp[2],1.0])DATA _v2.normalize()DATAD, edgedic[(numlamp,v1,v2)] = [[vtx2[0],vtx2[1],vtx2[2]],DATA4ۜ [vtx1[0],vtx1[1],vtx1[2]],DATAh [vtx1[0]+(_v1[0]*infinity),vtx1[1]+(_v1[1]*infinity),vtx1[2]+(_v1[2]*infinity)],DATAl܌ [vtx2[0]+(_v2[0]*infinity),vtx2[1]+(_v2[1]*infinity),vtx2[2]+(_v2[2]*infinity)]]DATA, # Find CapsDATAPl _v2 = Vector([vtx2[0]-lamp[0],vtx2[1]-lamp[1],vtx2[2]-lamp[2],1.0])DATA _v2.normalize()DATA\< _cn.append([vtx2[0]+(_v2[0]*0.001),vtx2[1]+(_v2[1]*0.001),vtx2[2]+(_v2[2]*0.001)])DATAh _cf.append([vtx2[0]+(_v2[0]*infinity),vtx2[1]+(_v2[1]*infinity),vtx2[2]+(_v2[2]*infinity)])DATA\ DATAߌ _cf.reverse()DATA capnear.append(_cn)DATA capfar.append(_cf) DATA l DATA DATA4 if gRenderType.val==2 or gRenderType.val>3:DATAL p1 = face.v[0]DATA< p1 = MatMultVec(m2,Vector([p1[0],p1[1],p1[2],1.0]))DATA na = 0.0DATA< if len(LampLst)>0:DATA< # Obtain the Light Vector (Vertex to light source)DATA  for lamploc in LampLst:DATATL vLight = Vector([lamploc[0]-p1[0],lamploc[1]-p1[1],lamploc[2]-p1[2],1.0])DATA vLight.normalize()DATA  _a = DotVecs(vLight,n)DATAl if _a<0: _a*=-1.0DATA na+= _aDATA  else:DATA<< #No lamps, so use camera position as lamp positionDATA` vLight = Vector([obCamera.loc[0]-p1[0],obCamera.loc[1]-p1[1],obCamera.loc[2]-p1[2],1.0])DATA< vLight.normalize()DATA( na = max(DotVecs(vLight,n),0.0)DATA if na>=1.0: na = 0.99DATA, glBegin(GL_POLYGON)DATA| for v in face.v:DATA glTexCoord1f(na) DATA$  glVertex3f(v[0], v[1], v[2])DATA\ glEnd() DATA  elif gRenderType.val==3:DATA glBegin(GL_POLYGON)DATA< for v in face.v:DATA | p2 = Mesh.verts[v.index]DATA< p2 = MatMultVec(m2,Vector([p2[0],p2[1],p2[2],1.0]))DATA$< n = Mesh.verts[v.index].noDATA( n =Vector([n[0],n[1],n[2],1.0])DATA  n = MatMultVec(invmat,n)DATA, n.normalize()DATAl na=0.0DATA if len(LampLst)>0:DATA< # Obtain the Light Vector (Vertex to light source)DATA l for lamploc in LampLst:DATAT vLight = Vector([lamploc[0]-p2[0],lamploc[1]-p2[1],lamploc[2]-p2[2],0.0])DATA< vLight.normalize()DATA0 na+= (max(DotVecs(vLight,n),0.0)*1.85)DATA else:DATA<, #No lamps, so use camera position as lamp positionDATAd vLight = Vector([obCamera.loc[0]-p2[0],obCamera.loc[1]-p2[1],obCamera.loc[2]-p2[2],0.0])DATA, vLight.normalize()DATA0| na = (max(DotVecs(vLight,n),0.0)*1.85) DATA  if na>=1.0: na = 0.99DATA, glTexCoord1f(na) DATA$| glVertex3f(v[0], v[1], v[2])DATA glEnd() DATA   else:DATAL glBegin(GL_POLYGON)DATA4 for v in face.v: glVertex3f(v[0], v[1], v[2])DATA glEnd() DATA < glDisable(GL_TEXTURE_1D)DATA glPopMatrix()DATA ObjLst.append(1)DATA4  shadowlines.append([edgedic,capnear,capfar])DATA l else:DATA ObjLst.append(0)DATA glReadBuffer(GL_BACK)DATA`, glReadPixels(Viewport[0]+10, Viewport[1]+11,width,height,GL_RGB,GL_UNSIGNED_BYTE,buffImage)DATA glDisable(GL_TEXTURE_1D)DATA  DATA< if (gShadow.val>0):DATA| glRasterPos2d(10,10)DATA@ glDrawPixels(width,height,GL_RGB,GL_UNSIGNED_BYTE,shadowbuff)DATA, DATA\ glEnable(GL_CULL_FACE)DATA glCullFace(GL_BACK)DATA glColor3f(1,1,1)DATA, numobj = 0DATAl for obj in obList:DATAD if (type(obj.data)==NMeshType) and ((obj.Layer & LayerMask)>0):DATA glPushMatrix()DATA,\ mat = MatrixToBuffer(obj.matrixWorld)DATA0 Mesh = NMesh.GetRawFromObject(obj.name) DATA glMultMatrixf(mat)DATA\ for face in Mesh.faces:DATA glBegin(GL_POLYGON)DATA for v in face.v:DATA$< glVertex3f(v[0], v[1], v[2])DATA glEnd() DATA glPopMatrix()DATA  numobj+=1DATALDATA| DATA$ glClear(GL_STENCIL_BUFFER_BIT)DATA glDepthMask(GL_FALSE)DATA< glColorMask(0,0,0,0)DATA| glEnable(GL_STENCIL_TEST)DATA$ glClear(GL_STENCIL_BUFFER_BIT)DATA$ glStencilFunc(GL_ALWAYS,128,-1)DATAl if (gShadow.val==1):DATA glCullFace(GL_BACK)DATA( glStencilOp(GL_KEEP,GL_KEEP,GL_INCR)DATA< else:DATAl glCullFace(GL_FRONT)DATA, glStencilOp(GL_KEEP,GL_INCR,GL_KEEP) DATA DATA < for triplet in shadowlines:DATA edgelst= triplet[0]DATA for key in edgelst:DATA  edge = edgelst[key]DATAL if edge<>None:DATA i = edgeDATA glBegin(GL_QUADS)DATA,  glVertex3f(i[0][0],i[0][1],i[0][2])DATA,l glVertex3f(i[1][0],i[1][1],i[1][2])DATA, glVertex3f(i[2][0],i[2][1],i[2][2])DATA,, glVertex3f(i[3][0],i[3][1],i[3][2])DATA glEnd()DATA if (gShadow.val>1):DATA  for cap in triplet[1]:DATA\ glBegin(GL_POLYGON)DATA for i in cap:DATA$ glVertex3f(i[0],i[1],i[2])DATA< glEnd()DATA| for cap in triplet[2]:DATA glBegin(GL_POLYGON)DATA for i in cap:DATA$\ glVertex3f(i[0],i[1],i[2])DATA glEnd() DATA DATA if (gShadow.val==1):DATA(\ glStencilOp(GL_KEEP,GL_KEEP,GL_DECR)DATA glCullFace(GL_FRONT)DATA else:DATA glCullFace(GL_BACK)DATA(\ glStencilOp(GL_KEEP,GL_DECR,GL_KEEP)DATADATA  for triplet in shadowlines:DATA, edgelst = triplet[0]DATAl for key in edgelst:DATA edge = edgelst[key]DATA if edge<>None:DATA , i = edgeDATA l glBegin(GL_QUADS)DATA,  glVertex3f(i[0][0],i[0][1],i[0][2])DATA,  glVertex3f(i[1][0],i[1][1],i[1][2])DATA, l glVertex3f(i[2][0],i[2][1],i[2][2])DATA,  glVertex3f(i[3][0],i[3][1],i[3][2])DATA , glEnd()DATA l if (gShadow.val>1):DATA  for cap in triplet[1]:DATA  glBegin(GL_POLYGON)DATA L for i in cap:DATA$  glVertex3f(i[0],i[1],i[2])DATA  glEnd()DATA  for cap in triplet[2]:DATA l glBegin(GL_POLYGON)DATA  for i in cap:DATA$  glVertex3f(i[0],i[1],i[2])DATAL glEnd() DATA DATA glDisable(GL_CULL_FACE)DATA  glColorMask(1,1,1,1)DATA$L glStencilFunc(GL_NOTEQUAL, 0,-1)DATA4 glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE)DATA glColor4f(0,0,0,0.5)DATA < glMatrixMode(GL_PROJECTION)DATA glPushMatrix()DATA glLoadIdentity()DATA   glMultMatrixf(gProjMatrix)DATA \ glMatrixMode(GL_MODELVIEW)DATA glPushMatrix()DATA glLoadIdentity()DATA , glMultMatrixf(gModelMatrix)DATA| glBegin(GL_QUADS)DATA glVertex2d(0,0)DATA glVertex2d(width*4,0)DATA < glVertex2d(width*4,height*2)DATA glVertex2d(0,height*2)DATA  glEnd()DATA glPopMatrix()DATA \ glMatrixMode(GL_PROJECTION)DATA glPopMatrix()DATA  glMatrixMode(GL_MODELVIEW)DATA < del gProjMatrix,gModelMatrixDATA glDisable(GL_BLEND)DATA glEnable(GL_CULL_FACE)DATA glDepthMask(GL_TRUE)DATA\ glDepthFunc(GL_LESS)DATA  glDisable(GL_STENCIL_TEST)DATA glReadBuffer(GL_BACK)DATA`, glReadPixels(Viewport[0]+10, Viewport[1]+11,width,height,GL_RGB,GL_UNSIGNED_BYTE,shadowbuff)DATADATA glRasterPos2d(10,10)DATA@, glDrawPixels(width,height,GL_RGB,GL_UNSIGNED_BYTE,buffImage)DATADATA if (tofile>0): DATA(  #__________________________________DATA\ # Filter image DATA( #__________________________________DATA for j in range(0,j3,w3):DATA< for i in range(0,w3,3):DATA r = buffImage[j+i]DATA g = buffImage[j+i+1]DATA b = buffImage[j+i+2]DATAl for ci in dictfilter:DATAH if (abs(ci[0]-r)<=8) and (abs(ci[1]-g)<=8) and (abs(ci[2]-b)<=8):DATA , buffImage[j+i] = ci[0]DATA | buffImage[j+i+1] = ci[1]DATA  buffImage[j+i+2] = ci[2]DATA  breakDATA\ del dictfilterDATA DATA if gFX.val:DATA  if gFXType.val == 0:DATA(L #__________________________________DATA # Pixelate DATA( #__________________________________DATA, l1 = width/gLevel.valDATA| l2 = height/gLevel.valDATA lw = l2 * w3DATA  l3 = l1 * 3DATA L ll = l1 * l2DATA  for j in range(0,j3,lw):DATA   for i in range(0,w3,l3):DATA !, r = 0DATA !l g = 0DATA ! b = 0DATA$! for bj in range(j,j+lw,w3):DATA$"< for bi in range(i,i+l3,3):DATA " try:DATA " r += buffImage[bj+bi] DATA$# g += buffImage[bj+bi+1] DATA #l b += buffImage[bj+bi+2]DATA# except:DATA# r += 128DATA$< g += 128DATA$| g += 128DATA $ r /=llDATA $ g /=llDATA %< b /=llDATA$%| for bj in range(j,j+lw,w3):DATA$% for bi in range(i,i+l3,3):DATA & try:DATA &\ buffImage[bj+bi] = rDATA & buffImage[bj+bi+1] = gDATA & buffImage[bj+bi+2] = b DATA'L except: passDATA' elif gFXType.val == 1:DATA(' #__________________________________DATA(, # VoronoiDATA((l #__________________________________DATA( if gEnableMask.val:DATA`( r,g,b = int(gGenCol[0][0]*255),int(gGenCol[0][1]*255),int(gGenCol[0][2]*255) #Mask colorDATA ) else:DATA`) r,g,b = int(gGenCol[1][0]*255),int(gGenCol[1][1]*255),int(gGenCol[1][2]*255) #Line colorDATA$*\ denom = max(gLevel.val*1.0,10.0)DATA* j,j1,i,i1 = 0,0,0,0DATA* for j in range(0,j3,w3):DATA +< i1 = 0DATA+| for i in range(0,w3,3):DATAL+ if (noise([i1/denom,j1/denom,0.0],NoiseTypes.VORONOI_CRACKLE)<0.5):DATA,L buffImage[j+i] = rDATA, buffImage[j+i+1] = gDATA, buffImage[j+i+2] = bDATA -< i1+=1DATA -| j1+=1DATA-DATA- del j,i,j1,i1DATA.,DATA0.\ if (gbLines.val>0) or (gbSilhouette.val>0):DATA. numobj = 0DATA. for obj in obList:DATAD/< if (type(obj.data)==NMeshType) and ((obj.Layer & LayerMask)>0):DATA/DATA/ if ObjLst[numobj]:DATA0 glPushMatrix()DATA,0\ mat = MatrixToBuffer(obj.matrixWorld)DATA00 Mesh = NMesh.GetRawFromObject(obj.name) DATA1 glMultMatrixf(mat)DATA 1l for face in Mesh.faces:DATA(1 glPolygonMode(GL_FRONT,GL_FILL)DATA2  glBegin(GL_POLYGON)DATA<2\ glColor3f(gGenCol[0][0],gGenCol[0][1],gGenCol[0][2])DATA2 for v in face.v:DATA(3  glVertex3f(v[0], v[1], v[2])DATA3\ glEnd() DATA 3 if gbSilhouette.val>0:DATA 3 glEnable(GL_CULL_FACE)DATA$4< glLineWidth(gSilWidth.val)DATA(4 glPolygonMode(GL_BACK,GL_LINE)DATA 4 glCullFace(GL_FRONT)DATA5, glBegin(GL_POLYGON)DATA@5| glColor3f(gGenCol[2][0],gGenCol[2][1],gGenCol[2][2])DATA 5 for vertex in face.v:DATA86< glVertex3f(vertex[0], vertex[1], vertex[2])DATA6 glEnd()DATA6 glCullFace(GL_BACK)DATA7, glLineWidth(1.0) DATA<7| if gDoubleSided.val == 1: glDisable(GL_CULL_FACE)DATA47 glPolygonMode(GL_FRONT_AND_BACK,GL_FILL)DATA 8L DATA8 glPopMatrix()DATA8 numobj+=1DATA9 DATA9< glReadBuffer(GL_BACK)DATA\9 glReadPixels(Viewport[0]+10, Viewport[1]+11,width,height,GL_RGB,GL_UNSIGNED_BYTE,buff2)DATA : mr = int(gGenCol[0][0]*255)DATA :l mg = int(gGenCol[0][1]*255)DATA : mb = int(gGenCol[0][2]*255)DATA;  for j in range(0,j3,w3):DATA;\ for i in range(0,w3,3):DATAL; if (buff2[j+i]==mr) and (buff2[j+i+1]==mg) and (buff2[j+i+2]==mb): DATA <, passDATA   if (tofile==0) and (gShadow.val>0): DATA>\ for j in range(0,j3,w3):DATA> for i in range(0,w3,3):DATA > if (shadowbuff[j+i]==0):DATA4?L buffImage[j+i] = int(buffImage[j+i]*0.5)DATA4? buffImage[j+i+1] = int(buffImage[j+i+1]*0.5)DATA4@  buffImage[j+i+2] = int(buffImage[j+i+2]*0.5)DATA@l DATA@ del buff2,w3,j3,bj3DATA@ del LayerMaskDATAADATAAL glPopAttrib()DATA,A glPolygonMode(GL_FRONT_AND_BACK,GL_FILL)DATA A glMatrixMode(GL_PROJECTION)DATAB< glPopMatrix()DATAB|DATAB gRendering = 0DATAB return 0 DATAC,DATADC\# ---------------------------------------------------------------DATAC# Function : linear_aproxDATA D# Inputs :DATAD\# OutPuts :DATAD# Description :DATADD# --------------------------------------------------------------- DATAELdef linear_aprox(lst):DATAE global gVertexLst, gTolLDATAE pi = gVertexLst[lst[0]][0]DATA F, pf = gVertexLst[lst[-1]][0]DATAF| DATA,F d = float(pf[0]-pi[0]) # x2-x1DATA8G  if d!=0: m = float(pf[1]-pi[1])/d # y2-y1/d = slope DATAGl else: m = 10000000000.0DATA@G a = m;b = -1.0;c = float(pi[1]-m*pi[0]) # Compute ConstantsDATAH, denom = sqrt(a*a+b*b+c*c)DATAH| DATAH e = 0.0; idxe = 0DATA H for i in range(1,len(lst)-1):DATAI< p = gVertexLst[lst[i]][0]DATAI if denom>0:DATA$I d = ((a*p[0])+(b*p[1])+c)/denomDATAJ else: d = 0.0DATAJ\ if abs(d)>=e:DATAJ e = abs(d)DATA J idxe = iDATAKDATAKL if (e2:DATALL l1 = lst[0:idxe+1]DATAL l2 = lst[idxe:]DATAL l1 = linear_aprox(l1)DATAM l2 = linear_aprox(l2)DATAMl l2 = l2[1:]DATAM l1.extend(l2)DATAM return l1DATAN, else: return lstDATANlDATANdef bez3(p1,p2,p3,t):DATA N p = [0,0]DATA O t2 = t*tDATA O\ ct = 1 - tDATAO ct2 = ct*ctDATA,O p[0] = p1[0]*ct2 + 2*p2[0]*ct*t + p3[0]*t2DATA,P< p[1] = p1[1]*ct2 + 2*p2[1]*ct*t + p3[1]*t2DATA P return pDATAPDATADQ # ---------------------------------------------------------------DATAQ|# Function : curve_aproxDATA Q# Inputs :DATAR # OutPuts :DATARL# Description :DATADR# --------------------------------------------------------------- DATARdef curve_aprox(lst):DATAS< global gVertexLst, gTolCDATAS pi = gVertexLst[lst[0]][0]DATA S pf = gVertexLst[lst[-1]][0]DATAT, sz = len(lst)DATA Tl if sz>3:DATA T p2 = gVertexLst[lst[1]][0]DATA T p3 = gVertexLst[lst[-2]][0]DATAPUL pw = IntersectLines([pi[0],pi[1],p2[0],p2[1]],[pf[0],pf[1],p3[0],p3[1]],1)DATAU if pw<>None:DATAV  if len(pw)==1:DATA VL pt = [pw[0][0],pw[0][1]]DATA V d = 0DATA V di = []DATAW for i in range(sz-1):DATA$Wl p = gVertexLst[lst[i]][0] DATA$W q = gVertexLst[lst[i+1]][0] DATADX  v = sqrt(((q[0]-p[0])*(q[0]-p[0]))+((q[1]-p[1])*(q[1]-p[1])))DATA X| d+=vDATAX di.append(d)DATA X e = 0.0DATAY< me = 0.0DATAY| idxe = 0DATAY sz1 = len(di)-1DATAY for i in range(sz1):DATAZL ti = di[i]/dDATAZ Qn = bez3(pi,pt,pf,ti)DATA$Z Pn = gVertexLst[lst[i+1]][0]DATAL[, v = sqrt(((Qn[0]-Pn[0])*(Qn[0]-Pn[0]))+((Qn[1]-Pn[1])*(Qn[1]-Pn[1])))DATA[ if v>me:DATA [ me=vDATA\, idxe = iDATA \l e += vDATA\ if idxe==0: idxe=sz1/2DATA\ if (e2:DATA^ l1 = lst[0:idxe+1]DATA^l l2 = lst[idxe:]DATA^ l1 = curve_aprox(l1)DATA^ l2 = curve_aprox(l2)DATA_L l2 = l2[1:]DATA_ l1.extend(l2)DATA_ return l1DATA `  else:DATA`L return lstDATA$` else: return [lst[0],lst[-1]]DATA` return lstDATAaDATADaL# ---------------------------------------------------------------DATAa# Function : ScanImageDATA a# Inputs :DATAb<# OutPuts :DATAb|# Description :DATADb# --------------------------------------------------------------- DATA,c,def ScanImage(width,height,buff,shflag=0):DATA(c global gVertexLst,gColordic, gColorsDATAcDATAd  alpha = 255DATAdL if shflag: alpha = 127 DATA(d #__________________________________DATAd # Scanning image DATA(e, #__________________________________DATAe|DATAe rb,gb,bb=-10,-10,-10DATAe oldi,sz = 0,0DATA,f, # 0 1 2 3 4 5DATA4f # gVertexLst = ((x,y),clridx,flag,prev,next,vip)DATA f r0 = []DATA g, r1 = []DATAgl xi= 0DATAg w3 = width * 3DATA g top = w3-3DATA h idx = 0DATA h\ first = 0DATAh skipmask = 0DATAh fh = float(height)DATAi gPercentage = 0.0DATA i\ for j in range(0,height,1):DATA i flag=0DATAi rb,gb,bb=-10,-10,-10DATA j, jw = j*w3DATAjl for i in range(0,w3,3):DATAj r=buff[jw+i]DATAj g=buff[jw+i+1]DATAk< b=buff[jw+i+2]DATALk| if abs(r-rb)>9 or abs(g-gb)>9 or abs(b-bb)>9 or i==top or j==height-1: DATAk if flag==0: flag = 1DATA lL else:DATA(l if (rb,gb,bb,alpha) in gColordic:DATA,l idx = gColordic[(rb,gb,bb,alpha)]DATAm< else: DATA m| idx = len(gColordic) DATA(m gColordic[(rb,gb,bb,alpha)]=idxDATA(n gColors.append([rb,gb,bb,alpha])DATAnl if shflag and rb>0:DATA n passDATA n else:DATA8o< gVertexLst.append([[xi,j],idx,0,-1,-1,0]) #XiDATA<o gVertexLst.append([[(i/3),j],idx,0,-1,-1,0]) #Xf DATA p  sz = len(gVertexLst)-2DATALp\ r1.append([sz,sz+1,0,idx]) #(idxXi,idxXf,numintersect,coloridx)DATAp DATAq  xi= i/3DATAqL rb,gb,bb = r,g,bDATAqDATAq if first == 0:DATAq first = 1DATA r< r0 = r1DATAr| for _i in r0:DATA8r gVertexLst[_i[0]][4] = _i[1] # xi.next = xfDATA8s gVertexLst[_i[1]][4] = _i[0] # xf.next = xiDATAs| else:DATAs for _f in r1:DATA$s dyi = gVertexLst[_f[0]][0][0]DATA$t< dyf = gVertexLst[_f[1]][0][0]DATAt for _i in r0:DATA(t # Check intersect range of pairsDATA$u dxi = gVertexLst[_i[0]][0][0]DATA$ul dxf = gVertexLst[_i[1]][0][0]DATAu if (_f[3]==_i[3]):DATAu if (((dyi<=dxf) and (dyi>=dxi)) or ((dyf<=dxf) and (dyf>=dxi))) or (((dxi>=dyi) and (dxi<=dyf)) or ((dxf>=dyi) and (dxf<=dyf))):DATAv # intersectionDATA8v gVertexLst[_f[1]][4] = _f[0] # yf.next = yiDATAwL if _f[2]>0:DATA8w gVertexLst[gVertexLst[_f[1]][3]][4] = _i[0] DATA,w # yf.prev.next = xiDATAxL else:DATA4x gVertexLst[_f[0]][4] = gVertexLst[_i[1]][4]DATA,x # yi.next = xf.nextDATA8yL gVertexLst[_i[1]][4] = _f[1] # xf.next = yfDATA8y gVertexLst[_f[1]][3] = _i[1] # yf.prev = xfDATAz  _f[2]+=1DATAzL # No intersection foundDATAz if _f[2] == 0:DATA8z gVertexLst[_f[0]][4] = _f[1] # yi.next = yfDATA8{< gVertexLst[_f[1]][4] = _f[0] # yf.next = yiDATA{ DATA { r0 = r1DATA |  del r1DATA |L r1 = []DATA| DATA| del r0,r1,fhDATA | del rb,gb,bb,oldi,xi,idx,szDATA}L del w3,top,firstDATA} DATA}DATAD}# ---------------------------------------------------------------DATA~\# Function : VectorizeDATA ~# Inputs :DATA~# OutPuts :DATA# Description :DATAD\# --------------------------------------------------------------- DATA$def Vectorize(width,height,colors):DATA@ global gEnableMask,gGenCol,gCurrentFrame,gLineWidth,gVertexLstDATA, global gVectFunc,gbLines,gSmoothVertex DATA DATA sh = bShape()DATA \ sh.Reset()DATA  movie = []DATA placelist = []DATA, mr = int(gGenCol[0][0]*255) # Mask colorDATA | mg = int(gGenCol[0][1]*255)DATA  mb = int(gGenCol[0][2]*255)DATADATALDATA$| #_________________________________DATA # Optimize linksDATA(  #__________________________________ DATA\ RegionVectors=[] DATA sz = len(gVertexLst)DATA for numv in range(sz):DATA v = gVertexLst[numv]DATA\ lstpts = []DATA idx = numvDATA while v[2]==0:DATA  v[2] = 1DATA\ lstpts.append(idx) DATA idx = v[4]DATA v = gVertexLst[v[4]]DATA sz1 = len(lstpts)DATA$\ if gVectFunc.val>0 and sz1>3:DATA sz1 = len(lstpts)DATA for j in range(sz1):DATA, j1 = j-1DATAl j2 = j+1DATA if j==sz1-1: j2=0DATA$ p1 = gVertexLst[lstpts[j1]][0]DATA$< p2 = gVertexLst[lstpts[j]][0]DATA$ p3 = gVertexLst[lstpts[j2]][0]DATA4 v1 = Vector([(p2[0]-p1[0]),(p2[1]-p1[1])]) DATA0< v2 = Vector([(p3[0]-p2[0]),(p3[1]-p2[1])]) DATA$ ang = AngleBetweenVecs(v1,v2)DATA if ang>22.5:DATA$, gVertexLst[lstpts[j]][5] = 1DATA | else: DATA  if gSmoothVertex.val>0:DATA  for o in range(10):DATA(\ p2 = gVertexLst[lstpts[j]][0] DATAl gVertexLst[lstpts[j]][0] = [int((float(p2[0])*0.34) + (float(p1[0])*0.33) + (float(p3[0])*0.33)),DATAPL int((float(p2[1])*0.34) + (float(p1[1])*0.33) + (float(p3[1])*0.33))]DATA if len(lstpts)>1:DATA  outlst = []DATAL sz1 = len(lstpts)DATA for k in range(sz1):DATA j = k-1 DATA$ p = gVertexLst[lstpts[k]][0]DATA$l q = gVertexLst[lstpts[j]][0]DATA8 d = sqrt(((q[0]-p[0]) ** 2)+((q[1]-p[1]) ** 2))DATAL if d>1.0 or gVertexLst[lstpts[k]][5] == 1: outlst.append(lstpts[k])DATA lstpts = outlst DATA8 if gVectFunc.val==2: lstpts = linear_aprox(lstpts)DATA<< elif gVectFunc.val ==3: lstpts = curve_aprox(lstpts)DATA del outlstDATA sz1 = len(lstpts) DATA, DATA\ # Sort by color idx DATA  if sz1>2:DATA  v = gVertexLst[lstpts[0]]DATA(, RegionVectors.append([v[1],lstpts])DATA| del lstptsDATA RegionVectors.sort() DATADATA(, #__________________________________DATA| # Create SWF fileDATA( #__________________________________ DATA   h = heightDATA<L a = FILLSTYLEARRAY([FILLSTYLE(SOLID_FILL,[255,0,0,255])])DATA0 b = LINESTYLEARRAY([LINESTYLE(1,[0,0,0,255])])DATADATAL oldcoloridx=-1DATA coloridx =-1DATA colorflag=0DATA  linetrans = 1DATAL for q in RegionVectors:DATA region = q[1]DATA sz = len(region)DATA if len(region)>0:DATA \ v = gVertexLst[region[0]]DATA coloridx = v[1]DATA color=colors[coloridx]DATA < #Skip mask color regionsDATAH if (color[0]==mr) and (color[1]==mg) and (color[2]==mb): continueDATA DATA@, # Set color flag that identify when a color idx has change DATA, if (coloridx==oldcoloridx): colorflag=0DATA  else: DATA< colorflag=1DATA| oldcoloridx = coloridxDATA DATA( # Set Fillstyle and line style DATAXL a = FILLSTYLEARRAY([FILLSTYLE(SOLID_FILL,[color[0],color[1],color[2],color[3]])])DATA if gbLines.val == 1: DATA b = LINESTYLEARRAY([LINESTYLE(gLineWidth.val,[int(gGenCol[1][0]*255),int(gGenCol[1][1]*255),int(gGenCol[1][2]*255),255])])DATA  else:DATA\  b = LINESTYLEARRAY([LINESTYLE(gLineWidth.val,[color[0],color[1],color[2],color[3]])])DATADATA  if color[3]<255: linetrans=0DATADATAL curve = 0DATA DATA for numv in range(sz):DATA4  if str(type(region[numv]))=="":DATAl curve = 1DATA j = region[numv]DATA( j1 = gVertexLst[region[numv+1]][0]DATA,< else: j = gVertexLst[region[numv]][0]DATA if numv==0:DATA  i = jDATA if colorflag:DATAp\ sh.SetStyleRecord(SH_MOVE+SH_FILL0+SH_FILL1+SH_LINESTYLE+SH_NEWSTYLES,i[0],h-i[1],0,1,linetrans,1,1,a,b)DATA  else:DATA < sh.MoveTo(i[0],h-i[1])DATA  f = jDATA  else:DATA  if curve>0:DATALL sh.CurveTo(j[0]-f[0],(h-j[1])-(h-f[1]),j1[0]-j[0],(h-j1[1])-(h-j[1]))DATA f = j1DATA  curve=0DATAL numv+=1DATA  else:DATA0 sh.LineTo(j[0]-f[0],(h-j[1])-(h-f[1])) DATA , f = jDATA8l if numv>0: sh.LineTo(i[0]-f[0],(h-i[1])-(h-f[1]))DATADATA sh.EndShape()DATA< movie = sh.GetShape()DATA|DATA  del RegionVectors,gVertexLstDATA  del colors,sh,numv,sz,mr,mb,mgDATALDATA| gVertexLst = []DATA return movieDATADATAD,# ---------------------------------------------------------------DATA# Function : TGARenderDATA # Inputs :DATA# OutPuts :DATA\# Description :DATAD# --------------------------------------------------------------- DATA def TGARender(w,h,ax,ay):DATA\ global gFilename,gPathnameDATA # Viewpoint dataDATA  ViewData = Buffer(GL_FLOAT,4)DATA$< glGetFloatv(GL_VIEWPORT,ViewData)DATA dx = ViewData[0]DATA dy = ViewData[1]DATA DATA< # write to fileDATA | size = w*hDATA  ImageR = Buffer(GL_BYTE,size)DATA   ImageG = Buffer(GL_BYTE,size)DATA \ ImageB = Buffer(GL_BYTE,size)DATA glReadBuffer(GL_FRONT)DATA@ glReadPixels(dx+10,dy+11,w,h,GL_RED,GL_UNSIGNED_BYTE,ImageR)DATA@\ glReadPixels(dx+10,dy+11,w,h,GL_GREEN,GL_UNSIGNED_BYTE,ImageG)DATA@ glReadPixels(dx+10,dy+11,w,h,GL_BLUE,GL_UNSIGNED_BYTE,ImageB)DATA<DATA l # Save TGADATA  extname = gFilename.val+".tga"DATA( name = sys.join(gPathname.val,extname)DATAL del extnameDATADATA Header=[chr(0)]*18DATA, Header[2] = chr(2) # Uncompressed RGB DATA$\ Header[8] = chr(0) # X Origin LoDATA$ Header[9] = chr(0) # X Origin HiDATA$ Header[10] = chr(0) # Y Origin LoDATA$L Header[11] = chr(0) # Y Origin HiDATA( Header[12] = chr(w%256) # Width Hi DATA$ Header[13] = chr(w/256) # LoDATA(< Header[14] = chr(h%256) # Height HiDATA( Header[15] = chr(h/256) # LoDATA( Header[16] = chr(24) # 24 bits colorDATA$, Header[17] = chr(0) # Down->Top DATA|DATA try:DATA f = open(name,"wb")DATA # Save HeaderDATA\ for byte in Header:DATA f.write(byte)DATA  for x in range(h-1,-1,-1):DATA, for y in range(w):DATAl byte = (x * w)+ yDATA  f.write(chr(ImageB[byte]))DATA  f.write(chr(ImageG[byte]))DATA L f.write(chr(ImageR[byte]))DATA  f.close()DATA$ print "TGA file:",name," saved!"DATA , del x,y,fDATA$l except IOError, (errno,strerror):DATA0 print "I/O Error (%s): %s" % (errno,strerror)DATA, del name,size,ImageR,ImageB,ImageG,HeaderDATA| del dx,dy,ViewDataDATADATAD# ---------------------------------------------------------------DATA\# Function : TIFRenderDATA # Inputs :DATA# OutPuts :DATA# Description :DATAD\# --------------------------------------------------------------- DATAdef TIFRender(nx,ny,ax,ay):DATA global gFilename,gPathnameDATAlDATA # Viewpoint dataDATA  ViewData = Buffer(GL_FLOAT,4)DATA$, glGetFloatv(GL_VIEWPORT,ViewData)DATA| dx = ViewData[0]DATA dy = ViewData[1]DATADATA, # write to fileDATAl size = nx*nyDATA  ImageR = Buffer(GL_BYTE,size)DATA  ImageG = Buffer(GL_BYTE,size)DATA L ImageB = Buffer(GL_BYTE,size)DATA glReadBuffer(GL_FRONT)DATA@ glReadPixels(dx+10,dy+11,nx,ny,GL_RED,GL_UNSIGNED_BYTE,ImageR)DATADL glReadPixels(dx+10,dy+11,nx,ny,GL_GREEN,GL_UNSIGNED_BYTE,ImageG)DATAD glReadPixels(dx+10,dy+11,nx,ny,GL_BLUE,GL_UNSIGNED_BYTE,ImageB)DATA,DATA(\ extname = str(gFilename.val+".tif")DATA(¬ name = sys.join(gPathname.val,extname)DATA del extnameDATA<DATAl try:DATAÜ f = open(name,"wb")DATA # Save HeaderDATA, header = [chr(77),chr(77),chr(0),chr(42)]DATA| offset = size * 3 + 8;DATA v = [chr(((offset & 4278190080) / 16777216)),chr(((offset & 16711680) / 65536)),chr(((offset & 65280) / 256)),chr(offset & 255)]DATA| header.extend(v)DATA$ż for byte in header: f.write(byte)DATA DATA< # Write the binary data DATA ƌ for y in range(ny-1,-1,-1):DATA for x in range(nx):DATA byte = (y * nx)+ xDATA \ f.write(chr(ImageR[byte]))DATA Ǭ f.write(chr(ImageG[byte]))DATA  f.write(chr(ImageB[byte]))DATAL DATA| # Write the footer DATAȼ f.write(chr(0))DATA4 f.write(chr(14)) # Number of directory entries DATA\ DATAɌ # Width tag, short intDATA c = [1,0,0,3,0,0,0,1]DATA$ for byte in c: f.write(chr(byte))DATA0l f.write(chr((nx & 65280) / 256)) #Image widthDATA f.write(chr(nx & 255))DATA f.write(chr(0))DATA\ f.write(chr(0))DATA˜ DATA # Height tag, short int DATA c = [1,1,0,3,0,0,0,1]DATA(\ for byte in c: f.write(chr(byte))DATA4̬ f.write(chr((ny & 65280) / 256)) #Image heightDATA  f.write(chr(ny & 255))DATA\ f.write(chr(0))DATA͜ f.write(chr(0))DATADATA$  # Bits per sample tag, short int DATA\ c = [1,2,0,3,0,0,0,3]DATA(Μ for byte in c: f.write(chr(byte))DATA  offset = (size * 3) + 182;DATA< v = [chr(((offset & 4278190080) / 16777216)),chr(((offset & 16711680) / 65536)),chr(((offset & 65280) / 256)),chr(offset & 255)]DATA  for byte in v: f.write(byte)DATA<DATA$l # Compression flag, short int DATA м c = [1,3,0,3,0,0,0,1,0,1,0,0]DATA(  for byte in c: f.write(chr(byte))DATA0\ # Photometric interpolation tag, short int DATA Ѽ c = [1,6,0,3,0,0,0,1,0,2,0,0]DATA(  for byte in c: f.write(chr(byte))DATA$\ # Strip offset tag, long int DATA$Ҭ c = [1,17,0,4,0,0,0,1,0,0,0,8]DATA( for byte in c: f.write(chr(byte))DATA$L # Orientation flag, short int DATA$Ӝ c = [1,18,0,3,0,0,0,1,0,1,0,0]DATA( for byte in c: f.write(chr(byte))DATA(< # Sample per pixel tag, short intDATA$Ԍ c = [1,21,0,3,0,0,0,1,0,3,0,0]DATA( for byte in c: f.write(chr(byte))DATA(, #Rows per strip tag, short int DATA| c = [1,22,0,3,0,0,0,1]DATA( for byte in c: f.write(chr(byte))DATA( f.write(chr((ny & 65280) / 256)) DATAl f.write(chr(ny & 255))DATAּ f.write(chr(0))DATA f.write(chr(0))DATA$< #Strip byte count flag, long int DATA׌ c = [1,23,0,4,0,0,0,1]DATA( for byte in c: f.write(chr(byte))DATA, offset = size * 3DATAl v = [chr(((offset & 4278190080) / 16777216)),chr(((offset & 16711680) / 65536)),chr(((offset & 65280) / 256)),chr(offset & 255)]DATA  for byte in v: f.write(byte)DATA,l # Minimum sample value flag, short int DATA c = [1,24,0,3,0,0,0,3]DATA( for byte in c: f.write(chr(byte))DATAl offset = (size * 3) + 188DATAڼ v = [chr(((offset & 4278190080) / 16777216)),chr(((offset & 16711680) / 65536)),chr(((offset & 65280) / 256)),chr(offset & 255)]DATA l for byte in v: f.write(byte)DATA0ۼ # Maximum sample value tag, short int DATA c = [1,25,0,3,0,0,0,3]DATA(l for byte in c: f.write(chr(byte))DATA ܼ offset = (size * 3) + 194DATA  v = [chr(((offset & 4278190080) / 16777216)),chr(((offset & 16711680) / 65536)),chr(((offset & 65280) / 256)),chr(offset & 255)]DATA ݼ for byte in v: f.write(byte)DATA,  # Planar configuration tag, short int DATA$l c = [1,28,0,3,0,0,0,1,0,1,0,0]DATA(޼ for byte in c: f.write(chr(byte))DATA$  # Sample format tag, short int DATA\ c = [1,83,0,3,0,0,0,3]DATA(߬ for byte in c: f.write(chr(byte))DATA offset = (size * 3) + 200DATAL v = [chr(((offset & 4278190080) / 16777216)),chr(((offset & 16711680) / 65536)),chr(((offset & 65280) / 256)),chr(offset & 255)]DATA  for byte in v: f.write(byte)DATA L # End of the directory entry DATA c = [0,0,0,0]DATA( for byte in c: f.write(chr(byte))DATA$, # Bits for each colour channel DATA| c = [0,8,0,8,0,8]DATA( for byte in c: f.write(chr(byte))DATA(  # Minimum value for each component DATA\ c = [0,0,0,0,0,0]DATA( for byte in c: f.write(chr(byte))DATA  # Maximum value per channelDATA< c = [0,255,0,255,0,255]DATA( for byte in c: f.write(chr(byte))DATA, # Samples per pixel for each channelDATA< c = [0,1,0,1,0,1]DATA(| for byte in c: f.write(chr(byte))DATA f.close()DATA  del x,y,c,v,fDATA$L print "Tiff file:",name," saved"DATA$ except IOError, (errno,strerror):DATA0 print "I/O Error (%s): %s" % (errno,strerror)DATA$L del name,size,ImageR,ImageB,ImageGDATA del dx,dy,ViewDataDATA DATAD # ---------------------------------------------------------------DATA|# Function : SFS2SWF()DATA # Inputs :DATA# OutPuts :DATA<# Description :DATAD|# --------------------------------------------------------------- DATAdef SFS2SWF():DATA(, global gScroll2,gFilename,gPathnameDATA| global gMsg,gPercentageDATADATA  gMsg = "Converting SFS to SWF"DATAL gPercentage = 0.6DATA Draw()DATADATA  bkcolor=[]DATA, w = 0DATA\ h = 0DATA  fps = 0DATA maxframes = 0DATA  fquality = 1DATA L floop = 1DATA frames = [] DATADATA  if len(gScroll2.datalst)>0:DATA$L numfiles = len(gScroll2.datalst)DATA  for file in gScroll2.datalst:DATA$ name = sys.join(file[1],file[0])DATA<DATAl f = open(name,'rb')DATA( # _________________________________DATA # Read headerDATA(< # _________________________________DATA data = f.read(21)DATA4 _w = REVUI32([data[0],data[1],data[2],data[3]]) DATA4, _h = REVUI32([data[4],data[5],data[6],data[7]])DATA8 _fps = REVUI32([data[8],data[9],data[10],data[11]])DATA@ _numframes = REVUI32([data[12],data[13],data[14],data[15]])DATA8\ _color = [ord(data[16]),ord(data[17]),ord(data[18])]DATA _qlty = ord(data[19])DATA  _loop = ord(data[20])DATA(\ # _________________________________DATA # Read DataDATA( # _________________________________DATA < for i in range(_numframes):DATA data = f.read(4)DATA4 sz = REVUI32([data[0],data[1],data[2],data[3]])DATA, data = f.read(sz)DATAl recbits = []DATA for byte in data:DATA recbits.append(byte)DATA< frames.append(recbits)DATA f.close()DATA( # _________________________________DATA( # Save first chunk of information DATA(l # _________________________________DATA0 if _w>w: w=_w # keep the max size of movie DATA if _h>h: h=_hDATA<\ fps+=_fps # this will be the average of all chunksDATA4 maxframes+=_numframes # number of total framesDATA , if _qlty==0: fquality = 0DATA| if _loop==0: floop=0DATA( bkcolor.append([_numframes,_color])DATA8  del _w,_h,_fps,_numframes,_color,_qlty,_loop,dataDATAl DATA fps/=numfilesDATADATA  movie = []DATA(L # _________________________________DATA # Initialize SWF MovieDATA( # _________________________________DATA < # HeaderDATA(| # _________________________________DATA4 movie = swfHeaderBlock(0,[0,0,w,h],fps,maxframes)DATA(, # _________________________________DATA | # QualityDATA( # _________________________________DATA  if (not fquality):DATAL # Do some actionsDATA( actions = swfActionToggleQualty()DATA  movie+=swfDoAction(actions) DATA(, # _________________________________DATA| # Create framesDATA( # _________________________________DATA   id = 0DATAL for item in frames:DATA4 movie+= swfDefineShape3(id,RECT(0,0,w,h),item)DATA  id+=1DATA(, # _________________________________DATA| # Create SpriteDATA( # _________________________________DATA   oldid = 0DATAL j = 0DATA| for c in bkcolor:DATA< movie+=swfSetBackgroundColor(c[1][0],c[1][1],c[1][2])DATA, for i in range(c[0]):DATA8| if oldid>0: movie.extend(swfRemoveObject2(oldid-1))DATA` movie.extend(swfPlaceObject2(PO_MATRIX+PO_CHAR_ID,j,[0,0,0,[1.0,1.0,0.0,0.0,0.0,0.0],j]))DATAl movie+=swfShowFrame()DATA  j+=1DATA oldid = jDATA8< if oldid>0: movie.extend(swfRemoveObject2(oldid-1))DATA( # _________________________________DATA #Loop Animation ?DATA(, # _________________________________DATA| if (not floop):DATA # Do some actionsDATA  actions = swfActionStop()DATA L movie+=swfDoAction(actions)DATA movie+=swfShowFrame()DATA movie+=swfEnd()DATA, a = len(movie)DATAl SetFileLength(movie,a)DATA$ extname = gFilename.val+".swf"DATA  # write to fileDATA, L name = sys.join(gPathname.val,extname)DATA  if swfWrite(name,movie):DATA  gPercentage=1DATA$ < gMsg = "Error: writing file."DATA   Draw()DATA  else:DATA8  print "Sequece convertion to SWF file completed."DATA \ else:DATA<  print "Error: Missing data files. Select at least one."DATA DATA8 , del bkcolor,w,h,fps,maxframes,fquality,floop,framesDATA  gPercentage = 0.0DATA   gMsg = ""DATA  Draw()DATA < returnDATA lDATAD # ---------------------------------------------------------------DATA # Function : SWFRenderDATA L# Inputs :DATA# OutPuts :DATA# Description :DATAD # --------------------------------------------------------------- DATA|def SWFRender(w,h,ax,ay):DATA$ global gMsg,gPercentage,gExportingDATA4 global gRenderType,gSequenceFileFlag,gNumSeqFilesDATAH| global gGenCol,gFilename,gPathname,gStartFrame,gEndFrame,gStepFrameDATA global gCurrentFrameDATA(, global gLoopAnimation,gFPS,gQlty,gW,gHDATA(| global gColordic, gColors,gVertexLstDATA DATA gMsg = "Rendering SWF"DATA< startime = clock()DATA| DATA gExporting = 1DATADATA  if gSequenceFileFlag.val==0:DATAl movie = []DATA #Initialize SWF MovieDATA  # HeaderDATAL, movie = swfHeaderBlock(0,[0,0,w,h],gFPS.val,gEndFrame.val/gStepFrame.val)DATA # Set Background colorDATAh movie+=swfSetBackgroundColor(int(gGenCol[3][0]*255),int(gGenCol[3][1]*255),int(gGenCol[3][2]*255))DATADATA  # ___________________________DATA  # Start animationDATA L # ___________________________DATA placelst = []DATAH for frame in range(gStartFrame.val,gEndFrame.val+1,gStepFrame.val):DATAL start = clock()DATA, print "Rendering Frame:",frame,"...",DATA gCurrentFrame = frameDATA < # Initlialize frame variableDATA recbits = []DATA gPercentage = 0.6DATA  # Render frameDATAL if gRenderType.val == 0:DATA # Render Wire Frame DATA, recbits = RenderWireFrame(1,w,h,ax,ay)DATA L else:DATA DrawObjects(1)DATA gColordic={}DATA  gColors= []DATAL gVertexLst = []DATA  ScanImage(w,h,buffImage)DATA  ScanImage(w,h,shadowbuff,1)DATA(, recbits = Vectorize(w,h,gColors)DATA| #Save Define ObjectsDATA placelst.append(recbits)DATA  end = clock()DATA(L print "%.2f %s" % (end-start,"sec.")DATADATA  # ___________________________DATA # QualityDATA \ # ___________________________DATA if (not gQlty.val):DATA # Do some actionsDATA(, actions = swfActionToggleQualty()DATA | movie+=swfDoAction(actions) DATA  # ___________________________DATA  # Create framesDATA  \ # ___________________________DATA   id = 0DATA  for item in placelst:DATA4!, movie+= swfDefineShape3(id,RECT(0,0,w,h),item)DATA ! id+=1DATA ! # ___________________________DATA" # Create SpriteDATA "\ # ___________________________DATA$" for i in range(len(placelst)):DATA0" if i>0: movie.extend(swfRemoveObject2(i-1))DATA`#\ movie.extend(swfPlaceObject2(PO_MATRIX+PO_CHAR_ID,i,[0,0,0,[1.0,1.0,0.0,0.0,0.0,0.0],i]))DATA# movie+=swfShowFrame()DATA0$< if i>0: movie.extend(swfRemoveObject2(i-1))DATA $ # ___________________________DATA$ # Loop Animation ?DATA %, # ___________________________DATA %| if (not gLoopAnimation.val):DATA% # Do some actionsDATA &  actions = swfActionStop()DATA &\ movie+=swfDoAction(actions)DATA& movie+=swfShowFrame()DATA& movie+=swfEnd()DATA'< a = len(movie)DATA'| SetFileLength(movie,a)DATA$' extname = gFilename.val+".swf"DATA ( # ___________________________DATA(l # Write to fileDATA ( # ___________________________DATA,( name = sys.join(gPathname.val,extname)DATA)\ if swfWrite(name,movie):DATA) gPercentage=1DATA$) gMsg = "Error: writing file."DATA *< Draw()DATA*| else:DATA* print "Export Completed"DATA* del placelst DATA+< else:DATAH+l frames_per_file = (gEndFrame.val-gStartFrame.val+1)/gNumSeqFiles.valDATA,+ for numfile in range(gNumSeqFiles.val):DATA,< movie = []DATA$,| # ___________________________DATA, # Set Sequence HeaderDATA$- # ___________________________DATA,-l # 21 byte Sflender File Sequence headerDATA$- movie.extend(UI32(w)) #WidthDATA(. movie.extend(UI32(h)) #HeightDATA8.l movie.extend(UI32(gFPS.val)) #Frames per secondDATAH. movie.extend(UI32(frames_per_file/gStepFrame.val)) #Number of framesDATA@/< movie.extend(chr(int(gGenCol[3][0]*255))) #Background RedDATA@/ movie.extend(chr(int(gGenCol[3][1]*255))) #Background GreenDATA@0 movie.extend(chr(int(gGenCol[3][2]*255))) #Background BlueDATA00 movie.extend(chr(gQlty.val)) #Quality FlagDATA40 movie.extend(chr(gLoopAnimation.val)) #Loop FlagDATA$1L # ___________________________DATA1 # Start animationDATA$1 # ___________________________DATA42, sf = (numfile*frames_per_file)+gStartFrame.valDATA2 ef = sf+frames_per_fileDATA2 placelst = []DATA03 for frame in range(sf,ef+1,gStepFrame.val):DATA3| start = clock()DATA,3 print "Rendering Frame:",frame,"...",DATA4 gCurrentFrame = frameDATA$4l # Initlialize frame variableDATA4 recbits = []DATA4 gPercentage = 0.6DATA5< # Render frameDATA 5| if gRenderType.val == 0:DATA5 # Render Wire Frame DATA,6 recbits = RenderWireFrame(1,w,h,ax,ay)DATA 6| else:DATA6 DrawObjects(1)DATA6 gColordic={}DATA7< gColors= []DATA7| gVertexLst = []DATA 7 ScanImage(w,h,buffImage,1)DATA$8  ScanImage(w,h,shadowbuff,1)DATA(8\ recbits = Vectorize(w,h,gColors)DATA8 #Save Define ObjectsDATA 8 placelst.append(recbits)DATA9L end = clock()DATA,9 print "%.2f %s" % (end-start,"sec.")DATA9DATA: for item in placelst:DATA$:l movie.extend(UI32(len(item))) DATA: movie.extend(item)DATA: fstart = "%d" % sfDATA;< fend = "%d" % efDATAD;| extname = gFilename.val+fstart.zfill(3)+"-"+fend.zfill(3)+".sfs"DATA; del fstart,fendDATA$<, # ___________________________DATA<| # Write to fileDATA$< # ___________________________DATA,=  name = sys.join(gPathname.val,extname)DATA=l if swfWrite(name,movie):DATA= gPercentage=1DATA(= gMsg = "Error: writing file:"+nameDATA >L Draw()DATA > breakDATA>DATA > print "Sequence Completed"DATA?LDATAH?| print "%s %.2f %s" % ("Total exporting time:",clock()-startime,"sec.")DATA?DATA@ gPercentage = 0.0DATA @\ gMsg = ""DATA@ gExporting = 0DATA@ Draw()DATAA DATADA<# ---------------------------------------------------------------DATAA# Function : RenderDATA A# Inputs :DATAB,# OutPuts :DATABl# Description :DATADB# --------------------------------------------------------------- DATACdef Render(w,h,ax,ay):DATA@C\ global gRenderType,gBSP,buffImage,gDirty,gExporting,gRenderingDATACDATAC if gExporting: returnDATA4D< if gRendering: return # Do not comment this line DATAD DATAD if gDirty==1:DATAE  if gRenderType.val == 0:DATA(E\ gDirty=RenderWireFrame(0,w,h,ax,ay)DATAE else:DATA$E sc = Blender.Scene.getCurrent()DATA$F, obCamera = sc.getCurrentCamera()DATA F| del sc DATA(F if obCamera: gDirty=DrawObjects(0)DATA G  else:DATA<GL print "Error, at least one camera object is needed."DATAG gDirty = 0DATAG glLineWidth(1.0)DATAH< glColor3f(0.3,0.3,0.3)DATAH else:DATAH glRasterPos2d(10,10)DATA@H glDrawPixels(gW.val,gH.val,GL_RGB,GL_UNSIGNED_BYTE,buffImage)DATAIlDATAI DATADI# ---------------------------------------------------------------DATA J<# Function : drawMaskColorsDATA J# Inputs :DATAJ# OutPuts :DATAK # Description :DATADKL# --------------------------------------------------------------- DATAKdef drawMaskColors():DATAK global gW,gPaletteDATA L< #colorsDATAL| for i in [0,1,2,3]:DATA8L glColor3f(gGenCol[i][0],gGenCol[i][1],gGenCol[i][2])DATAM glBegin(GL_QUADS)DATAM\ glVertex2d(190,94+(i*16))DATAM glVertex2d(222,94+(i*16))DATA M glVertex2d(222,105+(i*16))DATA NL glVertex2d(190,105+(i*16))DATA N glEnd()DATAN gPalette.Draw()DATAO del iDATAOLDATADO|# ---------------------------------------------------------------DATAO# Function : drawlogoDATA P,# Inputs :DATAPl# OutPuts :DATAP# Description :DATADP# --------------------------------------------------------------- DATAQ\def drawlogo():DATAQ global glogoDATAQ for k in [0,1,2]:DATAR j = glogo[k]DATAR\ clr = j[0]DATA$R glColor3f(clr[0],clr[1],clr[2])DATAR w = 0DATAS for face in j[2]:DATAS\ glBegin(GL_TRIANGLES)DATAS for v in face:DATA S x = j[1][v][0]*0.65 + 30DATA T< y = j[1][v][1]*0.65 + 225DATAT glVertex2d(x,y)DATA T glEnd()DATAU  w+=1DATAU< DATAUlDATADU# ---------------------------------------------------------------DATAV # Function : drawDATA VL# Inputs :DATAV# OutPuts :DATAV# Description :DATADW # --------------------------------------------------------------- DATA W|def draw():DATATW global gW,gH,gAspX,gAspY,gbLines,gLineWidth,gRenderType,gLevel,gFX,gFXType DATA\X< global gPercentage,gbSilhouette,gSilWidth,gR,gG,gB,gEnable,gGenCol,gCreateSWF,gCreateBMPDATAXX global gFilename,gStartFrame,gEndFrame,gStepFrame,gCurrentColMask,gCurrentFrame,gMsgDATA8YL global gRefresh,gPreview,gEnableMask,gQuit,gPaletteDATA<Y global gLoopAnimation,gFPS,gQlty,gExporting,gDoubleSidedDATADZ global gMenuOption,gSequenceFileFlag,gNumSeqFiles,gSmoothVertexDATADZ global gScroll1,gScroll2,gCreateSq,gPathname,gVectFunc,gTolC,gTolLDATA(Z global gShadow,ShadowType,gShadowLampDATA[LDATA[| # Clear windowDATA [ glClearColor(0.0,0.0,0.3,1.0)DATA \  glClear(GL_COLOR_BUFFER_BIT)DATA\\DATA\ if gPreview.val == 0:DATA4\ Button("Render",EVENT_MENU_RENDER,5,210,115,20)DATA8], Button("Exporter",EVENT_MENU_EXPORT,120,210,115,20)DATA<] Button("Sequencer",EVENT_MENU_SEQUENCE,235,210,115,20)DATA]DATA^, if gMenuOption == 0:DATA^l # Render OptionsDATA^ if gW.val>=256:DATAP^ gPreview = Toggle("Preview",EVENT_PREVIEW,gW.val+15,45,75,44,gPreview.val)DATA_l else:DATAH_ gPreview = Toggle("Preview",EVENT_PREVIEW,260,45,75,44,gPreview.val)DATA`  DATA`< if gPreview.val == 0:DATAD`| gRefresh = Button("Refresh Data",EVENT_REFRESH,230,173,120,15)DATA` # Width and HeightDATAla, gW = Number("W: ",EVENT_WIDTH,3,174,50,14,gW.val,16,1024,"The image width in pixels (adjusted to 2^n)")DATA`a gH = Number("H: ",EVENT_HEIGHT,56,174,50,14,gH.val,16,1024,"The image height in scanlines")DATAb\ #Aspect RatioDATA`b gAspX = Number("AX:",EVENT_ASPX,3,157,50,14,gAspX.val,1,200,"The horizontal aspect ratio")DATA`c, gAspY = Number("AY:",EVENT_ASPY,56,157,50,14,gAspY.val,1,200,"The vertical aspect ratio")DATAc #Type of RenderDATAc gRenderType = Menu("Render Type:%t|Wired%x0|Flat%x1|Shade%x2|Toon%x3|Stripes 1%x4|Stripes 2%x5|Stripes 3%x6",EVENT_RENDER_TYPE,110,174,113,14,gRenderType.val)DATAd if gRenderType.val>0:DATAe #Special effect FlagDATA@el gFX = Toggle("Filter",EVENT_PIXELATE,110,158,40,14,gFX.val)DATAde gFXType = Menu("Type Filter:%t|Pixelate%x0|Voronoi%x1",EVENT_LEVEL,152,158,70,14,gFXType.val)DATAxfl gLevel = Menu("Level:%t|2%x2|4%x4|8%x8|16%x16|24%x24|32%x32|48%x48|64%x64",EVENT_LEVEL,229,158,50,14,gLevel.val)DATAhg  gShadow = Menu("Shadow:%t|Shadow Off%x0|Z Pass%x1|Z Fail%x2",EVENT_SHADOW,3,92,103,14,gShadow.val)DATAg DATAg #Number of colorsDATAh  if gPalette.visible:DATAhL gCurrentColMask = Menu("Colors:%t|1%x1|2%x2|3%x3|4%x4|5%x5|8%x8|16%x16|Custom%x32",EVENT_CHANGE_MASK,15,75,15,10,gCurrentColMask.val)DATAi  DATAi< for i in [0,1,2,3]:DATALi gEnable[i] = Toggle(" ",EVENT_E0+i,179,94+(17*i),10,10,gEnable[i].val)DATAj  #Lines optionsDATADjL gbLines = Toggle("Lines",EVENT_LINES,110,109,67,14,gbLines.val)DATAXj gbSilhouette = Toggle("Silhouette",EVENT_SILHOUETTE,110,125,67,14,gbSilhouette.val)DATA`k< # Color of mask, this color will be transparent and not will be consider when vectorizingDATAHk gEnableMask = Toggle("Mask",EVENT_MASK,110,92,67,14,gEnableMask.val)DATA,l< #Lines and Background colors and stylesDATA@l gR = Slider("R:",EVENT_COLOR,230,122,120,14,gR.val,0.0,1.0)DATA@m  gG = Slider("G:",EVENT_COLOR,230,107,120,14,gG.val,0.0,1.0)DATA@m| gB = Slider("B:",EVENT_COLOR,230,92,120,14,gB.val,0.0,1.0)DATAPm gLineWidth = Slider("Width:",EVENT_LINE_W,3,109,103,14,gLineWidth.val,1,7)DATALnl gSilWidth = Slider("Width:",EVENT_SIL_W,3,125,103,14,gSilWidth.val,1,7)DATATn gDoubleSided = Toggle("Double side",EVENT_NONE,3,140,103,14,gDoubleSided.val)DATAol #Custom DrawDATAo drawMaskColors()DATAo if gW.val>=256:DATA<p, gQuit = Button("Quit",EVENT_QUIT,gW.val+15,25,75,15)DATA p else:DATA4p gQuit = Button("Quit",EVENT_QUIT,260,25,75,15)DATAq<DATAql glColor3f(0.0,0.0,1.0)DATAq glBegin(GL_QUADS)DATAq glVertex2d(3,190)DATAr< glVertex2d(3,209)DATAr| glVertex2d(350,209)DATAr glVertex2d(350,190)DATA r glEnd()DATAs< glColor3f(1.0,1.0,1.0)DATAs glRasterPos2d(140,195)DATAs Text("Render Options")DATAt, glColor3f(1.0,1.0,1.0)DATAt| glRasterPos2d(110,145)DATAt Text("Background")DATA@u  Button(" ",EVENT_PARAMS,7,192,12,15,"Load/Save Parameters")DATAu|DATAu else:DATA0u Render(gW.val,gH.val,gAspX.val,gAspY.val)DATATv< gCreateTGA = Button("TGA",EVENT_CREATE_BMP,gW.val+15,110,75,15,"Save TGA file")DATAXv gCreateTIFF = Button("TIFF",EVENT_CREATE_TIF,gW.val+15,130,75,15,"Save TIFF file")DATAw<DATAwl elif gMenuOption == 1:DATAw DATAw # SWF Render optionsDATALx gLoopAnimation = Toggle("Loop",EVENT_LOOP,5,158,35,14,gLoopAnimation.val)DATA<x gQlty = Toggle("Qlty",EVENT_QLTY,42,158,35,14,gQlty.val)DATATy  gFPS = Number("FPS:",EVENT_FPS,80,158,70,14,gFPS.val,1,60,"Frames per second")DATAdy gStartFrame = Number("Start",EVENT_STARTFRAME,5,140,65,14,gStartFrame.val,1,18000,"Start Frame")DATA\z gEndFrame = Number("End",EVENT_ENDFRAME,72,140,65,14,gEndFrame.val,1,18000,"End Frame")DATA`z gStepFrame = Number("S:",EVENT_STEPFRAME,140,140,35,14,gStepFrame.val,1,100,"Step Frame")DATA{< gVectFunc = Menu("Function:%t|None%x0|Simple%x1|Linear%x2|Curves%x3",EVENT_VEC_TYPE,190,156,79,15,gVectFunc.val,"Choose a vectorize function.")DATAl{ if gVectFunc.val==2: gTolL = Number("T:",EVENT_TOLERANCE,272,156,75,15,gTolL.val,0.001,0.05,"Tolerance")DATAl| elif gVectFunc.val==3: gTolC = Number("T:",EVENT_TOLERANCE,272,156,75,15,gTolC.val,1.0,20.0,"Tolerance")DATAh}< gSmoothVertex = Toggle("Smooth",EVENT_NONE,190,138,79,15,gSmoothVertex.val,"Smooth region vertex")DATAX} Button("Reset Frames ",EVENT_RESETFRAMES,5,123,170,15,"Reset Frames Blender Values.")DATA ~L if gSequenceFileFlag.val==0:DATAd~ gSequenceFileFlag = Toggle("Save as SWF file",EVENT_SEQ_FLAG,4,90,235,15,gSequenceFileFlag.val)DATAX, gCreateSWF = Button("Export SWF",EVENT_CREATE_SWF,270,45,75,44,"Render SWF to file")DATA else:DATA gSequenceFileFlag = Toggle("Save as sequence file (.SFS )",EVENT_SEQ_FLAG,4,90,197,15,gSequenceFileFlag.val,"Automatically creates N number of sequence files")DATA gNumSeqFiles=Menu("Number Sequence Files:%t|1%x1|2%x2|3%x3|4%x4|5%x5",EVENT_NUM_SEQ_F,201,90,35,15,gNumSeqFiles.val,"Number of sequence files")DATAXl gCreateSWF = Button("Export SFS",EVENT_CREATE_SWF,270,45,75,44,"Render SWF to file")DATAh gPathname = String("Pathname:",EVENT_PATHNAME,4,70,235,15,gPathname.val,1024,"Set the path name.")DATA\| gFilename = String("Filename:",EVENT_FILENAME,4,52,235,15,gFilename.val,1024,"Filename")DATA<  Button("...",EVENT_BROWSE,239,50,15,35,"Browse Files")DATA4| gQuit = Button("Quit",EVENT_QUIT,270,25,75,15)DATADATA  glColor3f(0.0,0.0,1.0)DATA\ glBegin(GL_QUADS)DATA glVertex2d(3,190)DATA glVertex2d(3,209)DATA glVertex2d(350,209)DATA\ glVertex2d(350,190)DATA  glEnd()DATA glColor3f(1.0,1.0,1.0)DATA, glRasterPos2d(10,177)DATAHl Text("SWF Parameters: Vectorize Parameters:")DATA glRasterPos2d(140,195)DATA, Text("Export Options")DATA| glRasterPos2d(10,110)DATA@ Text("A 3D View should be visible to export an animation.")DATA,DATA\ elif gMenuOption ==2:DATA8 Button(">",EVENT_ADD_ITEM,165,154,30,17,"Add Item")DATA< Button("<",EVENT_DEL_ITEM,165,134,30,17,"Delete Item")DATA<l Button(">>",EVENT_ADD_ALL,165,114,30,17,"Add all items")DATA@ Button("<<",EVENT_REMOVE_ALL,165,94,30,17,"Remove all items")DATAXL Button("Get .SFS Files",EVENT_GET_FILE,10,171,150,15,"Get a sequence file (.SFS)")DATA DATAd Button("Create SWF",EVENT_SEQUENCE_SWF,270,45,75,44,"Create unique SWF with all sequence files")DATAh gPathname = String("Pathname:",EVENT_PATHNAME,4,70,235,15,gPathname.val,1024,"Set the path name.")DATA\ gFilename = String("Filename:",EVENT_FILENAME,4,52,235,15,gFilename.val,1024,"Filename")DATA< Button("...",EVENT_BROWSE,239,50,15,35,"Browse Files")DATA if gW.val>=256:DATA8\ gQuit = Button("Quit",EVENT_QUIT,gW.val+15,25,75,15)DATA else:DATA4 gQuit = Button("Quit",EVENT_QUIT,260,25,75,15)DATAL glColor3f(0.0,0.0,1.0)DATA glBegin(GL_QUADS)DATA glVertex2d(3,190)DATA glVertex2d(3,209)DATA\ glVertex2d(350,209)DATA glVertex2d(350,190)DATA  glEnd()DATA glColor3f(1.0,1.0,1.0)DATAl glRasterPos2d(130,195)DATA Text("Sequence Options")DATA  gScroll1.Draw()DATAL gScroll2.Draw()DATA  glFlush()DATADATADATA, if gPreview.val == 0:DATAl glColor3f(0.7,0.3,0.0)DATA glBegin(GL_QUADS)DATA glVertex2d(3,230)DATA< glVertex2d(3,250)DATA| glVertex2d(348,250)DATA glVertex2d(348,230)DATA  glEnd()DATA< DATAl glColor3f(0.0,0.0,0.0)DATA glRasterPos2d(175,234)DATA(  Text("Copyright (c) 2004, E.Aguirre")DATA\ drawlogo()DATA glColor3f(1.0,1.0,1.0)DATA glRasterPos2d(20,237)DATA, glColor3f(1.0,1.0,1.0)DATA(| Text("v2.4 S f l e n d e r")DATA glColor3f(1.0,1.0,1.0)DATA glRasterPos2d(3,10)DATAL\ Text("*Macromedia(R) and Flash(TM) are trademarks of Macromedia, Inc.")DATA  glFlush()DATA DATAL #Draw Progress BarDATA if (gPercentage>0):DATA glColor3f(1.0,0.5,0.0)DATA glBegin(GL_QUADS)DATA\ glVertex2d(3,30)DATA glVertex2d(3,40)DATA( glVertex2d(3+(gPercentage*100),40)DATA(, glVertex2d(3+(gPercentage*100),30)DATA | glEnd()DATA glColor3f(1.0,1.0,1.0)DATA  glRasterPos2d(3,32)DATAL Text(gMsg)DATA4 if gExporting: Text(" Frame %d" % gCurrentFrame)DATA else:DATA if gPreview.val == 0:DATA\ glRasterPos2d(3,30)DATA0 Text("Exporter for Macromedia(R) Flash(TM)")DATA glColor3f(1.0,1.0,1.0)DATA<DATAlDATAD# ---------------------------------------------------------------DATA # Function : eventDATA L# Inputs :DATA# OutPuts :DATA# Description :DATAD # --------------------------------------------------------------- DATA|def event(evt,val):DATA global gMouseXY,gMBDATA  if (evt == QKEY and not val):DATA L Exit()DATA if (evt == MOUSEX):DATA gMouseXY[0] = valDATA  elif (evt == MOUSEY): DATAL gMouseXY[1] = valDATA OnMouseMove()DATA elif (evt == LEFTMOUSE):DATA gMB[0] = valDATA\ if val: OnMouseMove()DATA elif (evt == MIDDLEMOUSE):DATA gMB[1] = valDATA, if val: OnMouseMove()DATAl elif (evt == RIGHTMOUSE):DATA gMB[2] = valDATA if val: OnMouseMove()DATA< DATADl# ---------------------------------------------------------------DATA# Function : OnMouseMoveDATA ,# Inputs :DATAl# OutPuts :DATA# Description :DATAD# ---------------------------------------------------------------DATA\def OnMouseMove():DATA4 global gMB,gMouseXY,gOldXY,gPalette, gMenuOptionDATA global gScroll1, gScroll2DATAL # Viewpoint dataDATA  ViewData = Buffer(GL_FLOAT,4)DATA$ glGetFloatv(GL_VIEWPORT,ViewData)DATA , dx = gMouseXY[0] - ViewData[0]DATA | dy = gMouseXY[1] - ViewData[1]DATA DATA if gMenuOption == 0:DATA(< if (gPalette.OnMouseMove(dx,dy,gMB)):DATA  Draw()DATA elif gMenuOption == 2:DATA( if (gScroll1.OnMouseMove(dx,dy,gMB)):DATAl passDATA( if (gScroll2.OnMouseMove(dx,dy,gMB)):DATA passDATADATAL del dx,dy,ViewDataDATA gOldXY[0] = gMouseXY[0]DATA gOldXY[1] = gMouseXY[1]DATA, returnDATA\DATAD# ---------------------------------------------------------------DATA# Function : SetColorsMaskDATA L# Inputs :DATA# OutPuts :DATA# Description :DATAD # ---------------------------------------------------------------DATA|def SetColorsMask(num):DATA global gPaletteDATA( if num<32: gPalette.maxcolors = numDATAL else:DATA| gPalette.maxcolors = 16DATA  num = 1 DATA  gPalette.ResetContent()DATA\ denom = num-1DATA if denom>0:DATA( delta = gPalette.palrc.Width()/denomDATA, else:DATA$\ delta = gPalette.palrc.Width()DATA gPalette.curidx=0DATA for j in range(num):DATA, if denom>0:DATA l i = float(j)/float(denom)DATA else: i = 0DATA$ px = gPalette.palrc.L+ (delta*j)DATA0L py = gPalette.wndrc.B + (gPalette.vs/2)+5 DATA gPalette.curidx+=1DATA8 w = CGHandle(i,gPalette.curidx,px-3,py+8,px+3,py-8)DATAL gPalette.AddHandle(w)DATA del wDATA del i,j,deltaDATA  Redraw()DATA<DATADl# ---------------------------------------------------------------DATA# Function : GetFilenameDATA ,# Inputs :DATAl# OutPuts :DATA# Description :DATAD# --------------------------------------------------------------- DATA\def GetFilename(name):DATA global gFilename,gPathnameDATA( n = sys.splitext(sys.basename(name))DATA< gFilename.val = n[0]DATA$| gPathname.val = sys.dirname(name)DATA del nDATADATAD,# ---------------------------------------------------------------DATA# Function : SaveParamsDATA # Inputs :DATA,# OutPuts :DATAl# Description :DATAD# --------------------------------------------------------------- DATAdef SaveParameters(name):DATALl global gW,gH,gAspX,gAspY,gSilWidth,gLineWidth,gGenCol,gRenderType,gPaletteDATA f = open(name,'w')DATA, buff = "%d\n" % gW.valDATAl f.write(buff)DATA buff = "%d\n" % gH.valDATA f.write(buff)DATA, buff = "%d\n" % gAspX.valDATA| f.write(buff)DATA buff ="%d\n" % gAspY.valDATA  f.write(buff)DATA L buff = "%d\n" % gSilWidth.valDATA f.write(buff)DATA  buff = "%d\n" % gLineWidth.valDATA, f.write(buff)DATA$l buff = "%d\n" % gRenderType.valDATA f.write(buff)DATA for i in [0,1,2,3]:DATA < buff = "%f\n" % gGenCol[i][0]DATA f.write(buff)DATA  buff = "%f\n" % gGenCol[i][1]DATA f.write(buff)DATA \ buff = "%f\n" % gGenCol[i][2]DATA f.write(buff)DATA  lst = gPalette.GetIntenLst()DATA< sz = len(lst)DATA| buff = "%d\n" % szDATA¼ f.write(buff)DATA for i in lst:DATA< buff ="%f\n" % iDATA| f.write(buff)DATA ü f.close DATADATAD,# ---------------------------------------------------------------DATAĜ# Function : GetParamsDATA # Inputs :DATA# OutPuts :DATA\# Description :DATADŜ# --------------------------------------------------------------- DATA def GetParameters(name):DATAL\ global gW,gH,gAspX,gAspY,gSilWidth,gLineWidth,gGenCol,gRenderType,gPaletteDATA f = open(name,'r')DATA buff = f.readline()DATA\ gW.val= int(buff)DATAǜ buff = f.readline()DATA gH.val= int(buff)DATA buff = f.readline()DATA\ gAspX.val= int(buff)DATAȜ buff = f.readline()DATA gAspY.val= int(buff)DATA buff = f.readline()DATA\ gSilWidth.val= int(buff)DATAɬ buff = f.readline()DATA gLineWidth.val= int(buff)DATA< buff = f.readline()DATA| gRenderType.val= int(buff)DATA for i in [0,1,2,3]:DATA  buff = f.readline()DATA L gGenCol[i][0] = float(buff)DATA˜ buff = f.readline()DATA  gGenCol[i][1] = float(buff)DATA, buff = f.readline()DATA l gGenCol[i][2] = float(buff)DATA ̼ lst = []DATA buff = f.readline()DATA< sz = int(buff)DATA| for i in range(sz):DATAͼ buff = f.readline()DATA lst.append(float(buff))DATA L gPalette.SetLstfromInten(lst)DATAΜ DATA  f.close DATA0  if gRenderType.val==2 or gRenderType.val == 3:DATAl gPalette.Visible()DATAϬ else: gPalette.Visible(0)DATA DATAD,# ---------------------------------------------------------------DATAМ# Function : beventDATA # Inputs :DATA# OutPuts :DATA\# Description :DATADќ# --------------------------------------------------------------- DATA def bevent(evt):DATA0L global gCurrentColMask,gRenderType,gPaletteDATA8Ҭ global gR,gB,gG,gGenCol,gLastEnable,gW,gH,gAspX,gAspYDATAH  global gCurrentFrame,gStartFrame,gEndFrame,gPalette,gPreview,gDirtyDATA0| global gMenuOption,gScroll1,gScroll2,gPathnameDATA global gShadow,gShadowLampDATA, Repaint = 0DATAl if (evt == EVENT_QUIT):DATA Լ Exit()DATA$ elif (evt == EVENT_MENU_RENDER): DATAL gMenuOption = 0DATAՌ Repaint = 1DATA$ elif (evt == EVENT_MENU_EXPORT):DATA gMenuOption = 1DATA\ Repaint = 1DATA$֜ elif (evt == EVENT_MENU_SEQUENCE):DATA gMenuOption = 2DATA, Repaint = 1DATAl elif (evt == EVENT_WIDTH):DATA׼ if (gW.val % 8)>0:DATA  gW.val = ((gW.val/8)*8)+8DATAL Repaint = 1DATA ، elif (evt == EVENT_HEIGHT):DATA Repaint = 1DATA$ elif (evt == EVENT_CHANGE_MASK):DATA(l SetColorsMask(gCurrentColMask.val)DATAXټ elif (evt == EVENT_E0) or (evt == EVENT_E1) or (evt == EVENT_E2) or (evt == EVENT_E3):DATA< idx = evt - EVENT_E0DATA$| gEnable[gLastEnable.val].val = 0DATA gEnable[idx].val = 1DATA  gLastEnable.val = idxDATAL gR.val = gGenCol[idx][0]DATAۜ gG.val = gGenCol[idx][1]DATA gB.val = gGenCol[idx][2]DATA< Repaint = 1DATA8| elif (evt == EVENT_LINE_W) or (evt == EVENT_SIL_W):DATA Repaint = 1DATA elif (evt == EVENT_COLOR):DATA(l gGenCol[gLastEnable.val][0]=gR.valDATA(ݼ gGenCol[gLastEnable.val][1]=gG.valDATA(  gGenCol[gLastEnable.val][2]=gB.valDATA\ Repaint = 1DATA$ޜ elif (evt == EVENT_RENDER_TYPE):DATA4 if gRenderType.val==2 or gRenderType.val == 3:DATAL gPalette.Visible()DATAߌ else: gPalette.Visible(0)DATA$ gCurrentFrame = gStartFrame.valDATA, Repaint = 1DATA l elif (evt == EVENT_REFRESH):DATA$ gCurrentFrame = gStartFrame.valDATA  Repaint = 1DATA$L elif (evt == EVENT_CREATE_SWF):DATA0 SWFRender(gW.val,gH.val,gAspX.val,gAspY.val)DATA$ elif (evt == EVENT_CREATE_BMP):DATA0L TGARender(gW.val,gH.val,gAspX.val,gAspY.val)DATA$ elif (evt == EVENT_CREATE_TIF):DATA0 TIFRender(gW.val,gH.val,gAspX.val,gAspY.val)DATA$\ elif (evt == EVENT_STARTFRAME):DATA$ gCurrentFrame = gStartFrame.valDATAH if gEndFrame.val < gStartFrame.val: gEndFrame.val = gStartFrame.valDATAl # Set Current FrameDATA( Blender.Set('curframe',gCurrentFrame)DATA Repaint = 1DATA < elif (evt == EVENT_ENDFRAME):DATAH if gEndFrame.val < gStartFrame.val: gEndFrame.val = gStartFrame.valDATA Repaint = 1DATA$< elif (evt == EVENT_RESETFRAMES):DATA, gStartFrame.val = Blender.Get('staframe')DATA, gEndFrame.val = Blender.Get('endframe')DATAL Repaint = 1DATA  elif (evt == EVENT_PREVIEW):DATA( gCurrentFrame=Blender.Get('curframe')DATA$, if gPreview.val == 1: gDirty = 1DATA| Repaint = 1DATA$ elif (evt == EVENT_VEC_PREVIEW):DATA  Repaint = 1DATA$L elif (evt==EVENT_SEQUENCE_SWF): DATA  SFS2SWF()DATA  elif (evt ==EVENT_ADD_ITEM):DATA , str = gScroll1.GetSelected()DATA| if str<>None:DATA( gScroll1.DelItem(gScroll1.selidx)DATA$  gScroll2.AddItem(str[0],str[1])DATA\ Repaint = 1DATA  elif (evt ==EVENT_DEL_ITEM): DATA  str = gScroll2.GetSelected()DATA< if str<>None:DATA(| gScroll2.DelItem(gScroll2.selidx)DATA$ gScroll1.AddItem(str[0],str[1])DATA Repaint = 1DATA \ elif (evt ==EVENT_REMOVE_ALL):DATA  for x in gScroll2.datalst:DATA  gScroll1.AddItem(x[0],x[1])DATAL gScroll2.ClearLst()DATA gScroll2.selidx = -1DATA Repaint = 1DATA   elif (evt ==EVENT_ADD_ALL): DATA \ for x in gScroll1.datalst:DATA  gScroll2.AddItem(x[0],x[1])DATA gScroll1.ClearLst()DATA< gScroll1.selidx = -1DATA| Repaint = 1DATA  elif (evt ==EVENT_GET_FILE):DATA$  lstfiles = listdir(gPathname.val)DATA\ gScroll1.ClearLst()DATA for file in lstfiles:DATA n = sys.splitext(file)DATA$, if n[1]==".sfs" or n[1]==".SfS":DATA,| gScroll1.AddItem(file,gPathname.val)DATA  del nDATA del lstfilesDATA\ Repaint = 1DATA  elif (evt == EVENT_BROWSE):DATA8 Blender.Window.FileSelector(GetFilename,"Get File")DATATL elif (evt == EVENT_SEQ_FLAG) or (evt==EVENT_NUM_SEQ_F) or (evt == EVENT_VEC_TYPE):DATA Repaint = 1DATA   elif (evt == EVENT_PARAMS):DATA@\ ans = Blender.Draw.PupMenu("Parameters%t|Save%x1|Restore%x2")DATA if ans==1:DATAD  Blender.Window.FileSelector(SaveParameters,"Save *.sfp File") DATA| elif ans==2:DATA@ Blender.Window.FileSelector(GetParameters,"Get *.sfp File")DATA , elif (evt == EVENT_SHADOW):DATA| passDATA$ elif (evt == EVENT_LAMP_SHADOW):DATA passDATA, DATA\ if Repaint == 1: Draw()DATAD# --------------------------------------------------------------DATA#DATA$L# Definition of global variablesDATA#DATAD# --------------------------------------------------------------DATA<DATA(lgAspX = Create(100) # X aspect ratioDATA,gAspY = Create(100) # Y aspect rationDATA DATA8LgbLines = Create(0) # Flag to Draw or not the linesDATA@gbSilhouette = Create(1) # Flag to Draw or not the silhouetteDATAgB = Create(1.0)DATA(\buffImage = None # Image Buffer DATA(shadowbuff = None # Shadow BufferDATA DATA4,gCreateSWF = Create(0) # Flag button to create swfDATA4gCreateBMP = Create(0) # Flag button to save tgaDATA4gCreateTIFF = Create(0) # Flag button to save tiffDATALgCurrentFrame = 1DATA8gCurrentColMask = Create(3) # Current mask color idxDATAgCreateSq = Create(0)DATA,gColordic = {}DATA lgColors=[]DATA DATA gDirty = 0DATA@gDoubleSided = Create(0) #Draw Double side faces (backfaces)DATA DATA<gEnableMask = Create(0) # Flag to use color mask or not DATA,gExporting = 0DATA4lgEnable = [Create(0),Create(0),Create(0),Create(1)]DATAgEndFrame = Create(1)DATA( gEndFrame.val = Blender.Get('endframe')DATA\DATA<gFX = Create(0) # Flag button to special effect imageDATA(gFXType = Create(0) # Type of effectDATALgFilename = Create("demo")DATAgFPS = Create(24)DATADATA gG = Create(1.0)DATADLgGenCol = [[1.0,0.0,1.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[1.0,1.0,1.0]]DATADATA(gH = Create(256) # Height of the imageDATA<DATA0lgLastEnable = Create(3) # Last color toggleDATAgLevel = Create(16)DATA( vLight = Vector() # Light vector fromDATA(\gLineWidth = Create(1) # Line widthDATAgLoopAnimation = Create(1)DATADATA,gMB = [0,0,0]DATAlgMenuOption = 0DATAgMouseXY = [0,0]DATA8gMsg = "" # Message to be display in progress barDATALDATA4|vNormal = Vector() # Normal vector of the face DATA@gNumSeqFiles = Create(1) # Number of Sequences files to create DATA LDATA |gOldXY = [0,0]DATA DATA  gPathname = Create("c:\swf")DATA( <gPalette = CPickPalette(5,90,260,45,5)DATA gPalette.ResetContent()DATA gPalette.Visible(0)DATA8 gPercentage = 0.0 # Percentage of the progress barDATA lgPreview= Create(0)DATA DATA gQlty = Create(1)DATA gQuit = Create(0)DATA \DATA gRefresh = Create(0)DATAd gRenderType = Create(0) # Render Type: 0 - Wire Frame, 1 - Flat, 2 - Shade, 3 - Shade, 4 -PixelateDATA \gRendering = 0DATA gR = Create(1.0)DATA  DATA( gScroll1 = CVScrollLst(10,90,150,80)DATA\gScroll1.ClearLst()DATA4gScroll2 = CVScrollLst(200,90,150,80,[0.7,0.3,0.0])DATAgScroll2.ClearLst()DATA <gSequenceFileFlag = Create(0)DATAgShadow = Create(0)DATAgShadowLamp = ""DATA$ SetColorsMask(gCurrentColMask.val)DATA,\gSilWidth = Create(3) # Silhouette widthDATAgSmoothVertex = Create(0)DATA gStartFrame = Create(1)DATA,LgStartFrame.val = Blender.Get('staframe')DATAgStepFrame = Create(1)DATADATATvSight = Vector() # Sight vector formed by the camera position and a face point DATADATAgTolL = Create(0.01) DATA gTolC = Create(10.0)DATALDATA|gVertexLst = []DATAgVectFunc = Create(1)DATADATA(,gW = Create(256) # Width of the imageDATA|DATA glogo = [[[0.0, 0.0, 1.0, 1.0],DATAT[[ 45 , 15 ] , [ 17 , 7 ] , [ 0 , 5 ] ,[ 77 , 31 ] , [ 103 , 50 ] , [ 120 , 73 ] ,DATA\|[ 129 , 96 ] , [ 130 , 116 ] , [ 124 , 133 ] ,[ 112 , 146 ] , [ 98 , 152 ] , [ 81 , 152 ] ,DATAX [ 60 , 146 ] , [ 40 , 137 ] , [ 23 , 125 ] ,[ 11 , 109 ] , [ 4 , 92 ] , [ 1 , 75 ] ,DATAT[ 2 , 61 ] , [ 6 , 51 ] , [ 19 , 38 ] ,[ 27 , 37 ] , [ 34 , 38 ] , [ 37 , 40 ] ,DATAT [ 30 , 39 ] , [ 20 , 40 ] , [ 11 , 46 ] ,[ 2 , 70 ] , [ 5 , 89 ] , [ 12 , 108 ] ,DATA\[ 26 , 124 ] , [ 42 , 136 ] , [ 59 , 143 ] ,[ 77 , 147 ] , [ 95 , 148 ] , [ 110 , 143 ] ,DATA\[ 122 , 133 ] , [ 128 , 116 ] , [ 127 , 95 ] ,[ 118 , 73 ] , [ 101 , 51 ] , [ 75 , 33 ] ,DATAP[ 40 , 18 ] , [ 6 , 9 ] , [ 11 , 43 ] ,[ 5 , 56 ] , [ 30 , 10 ] , [ 6 , 6 ] ,DATA\,[ 61 , 22 ] , [ 91 , 40 ] , [ 112 , 61 ] ,[ 125 , 84 ] , [ 130 , 106 ] , [ 128 , 125 ] ,DATA\[ 118 , 140 ] , [ 105 , 150 ] , [ 90 , 152 ] ,[ 70 , 149 ] , [ 49 , 142 ] , [ 31 , 131 ] ,DATATL[ 17 , 117 ] , [ 7 , 101 ] , [ 2 , 83 ] ,[ 1 , 67 ] , [ 4 , 55 ] , [ 23 , 37 ] ,DATAT[ 31 , 37 ] , [ 36 , 40 ] , [ 34 , 40 ] ,[ 25 , 39 ] , [ 15 , 43 ] , [ 3 , 79 ] ,DATAXL[ 8 , 99 ] , [ 19 , 116 ] , [ 34 , 130 ] ,[ 50 , 140 ] , [ 68 , 145 ] , [ 86 , 148 ] ,DATA`[ 103 , 146 ] , [ 117 , 139 ] , [ 126 , 125 ] ,[ 128 , 106 ] , [ 123 , 84 ] , [ 110 , 62 ] ,DATAP\[ 89 , 42 ] , [ 58 , 25 ] , [ 21 , 13 ] ,[ 0 , 7 ] , [ 8 , 47 ] , [ 15 , 40 ] ,DATA[ 8 , 51 ] , [ 3 , 63 ]],DATAt,[ [ 11 , 10 , 56 ] , [ 11 , 55 , 10 ] , [ 57 , 55 , 11 ] ,[ 57 , 34 , 55 ] , [ 34 , 9 , 55 ] , [ 12 , 77 , 57 ] ,DATAp[ 77 , 34 , 57 ] , [ 12 , 33 , 77 ] , [ 78 , 9 , 34 ] , [12 , 76 , 33 ] , [ 58 , 76 , 12 ] , [ 78 , 35 , 9 ] ,DATApl[ 35 , 54 , 9 ] , [ 58 , 32 , 76 ] , [ 79 , 54 , 35 ] , [58 , 75 , 32 ] , [ 13 , 75 , 58 ] , [ 79 , 8 , 54 ] ,DATAp [ 13 , 31 , 75 ] , [ 36 , 8 , 79 ] , [ 59 , 31 , 13 ] , [59 , 74 , 31 ] , [ 36 , 53 , 8 ] , [ 80 , 53 , 36 ] ,DATAp[ 14 , 74 , 59 ] , [ 14 , 30 , 74 ] , [ 37 , 53 , 80 ] , [37 , 7 , 53 ] , [ 60 , 30 , 14 ] , [ 60 , 73 , 30 ] ,DATAp L[ 15 , 73 , 60 ] , [ 15 , 29 , 73 ] , [ 81 , 7 , 37 ] , [81 , 52 , 7 ] , [ 61 , 29 , 15 ] , [ 61 , 72 , 29 ] ,DATAp [ 81 , 6 , 52 ] , [ 38 , 6 , 81 ] , [ 16 , 72 , 61 ] , [16 , 28 , 72 ] , [ 38 , 51 , 6 ] , [ 82 , 51 , 38 ] ,DATAp![ 62 , 28 , 16 ] , [ 62 , 71 , 28 ] , [ 82 , 5 , 51 ] ,[ 39 , 5 , 82 ] , [ 17 , 71 , 62 ] , [ 17 , 27 , 71 ] ,DATAp",[ 63 , 27 , 17 ] , [ 83 , 5 , 39 ] , [ 83 , 50 , 5 ] , [63 , 91 , 27 ] , [ 18 , 91 , 63 ] , [ 18 , 45 , 91 ] ,DATAp"[ 40 , 50 , 83 ] , [ 40 , 4 , 50 ] , [ 64 , 45 , 18 ] , [64 , 90 , 45 ] , [ 19 , 90 , 64 ] , [ 84 , 4 , 40 ] ,DATAp#l[ 19 , 26 , 90 ] , [ 88 , 26 , 19 ] , [ 84 , 49 , 4 ] , [44 , 26 , 88 ] , [ 44 , 70 , 26 ] , [ 44 , 25 , 70 ] ,DATAp$ [ 89 , 25 , 44 ] , [ 41 , 49 , 84 ] , [ 89 , 69 , 25 ] ,[ 68 , 67 , 23 ] , [ 20 , 69 , 89 ] , [ 41 , 3 , 49 ] ,DATAt$[ 24 , 67 , 68 ] , [ 24 , 22 , 67 ] , [ 20 , 24 , 69 ] , [20 , 22 , 24 ] , [ 20 , 66 , 22 ] , [ 65 , 66 , 20 ] ,DATAp%L[ 65 , 21 , 66 ] , [ 85 , 3 , 41 ] , [ 85 , 48 , 3 ] , [42 , 48 , 85 ] , [ 42 , 0 , 48 ] , [ 86 , 0 , 42 ] ,DATAp%[ 46 , 0 , 86 ] , [ 43 , 46 , 86 ] , [ 43 , 1 , 46 ] , [87 , 1 , 43 ] , [ 87 , 47 , 1 ] , [ 2 , 47 , 87 ]]],DATA(&[[1.0, 0.80000001192092896, 0.0, 1.0],DATA\&[[ 80 , 118 ] , [ 85 , 115 ] , [ 81 , 112 ] ,[ 74 , 116 ] , [ 66 , 114 ] , [ 70 , 119 ] ,DATA\'l[ 71 , 112 ] , [ 73 , 119 ] , [ 65 , 114 ] ,[ 71 , 117 ] , [ 77 , 116 ] , [ 78 , 118 ] ,DATA\'[ 81 , 114 ] , [ 84 , 115 ] , [ 82 , 113 ] ,[ 72 , 119 ] , [ 74 , 117 ] , [ 67 , 117 ] ,DATA\([ 65 , 113 ] , [ 71 , 115 ] , [ 68 , 116 ] ,[ 74 , 114 ] , [ 78 , 111 ] , [ 79 , 119 ] ,DATAX)[ 76 , 117 ] , [ 80 , 116 ] , [ 82 , 114 ] ,[ 85 , 115 ] , [ 84 , 97 ] , [ 70 , 82 ] ,DATAX)[ 92 , 111 ] , [ 62 , 79 ] , [ 58 , 83 ] ,[ 58 , 96 ] , [ 59 , 111 ] , [ 62 , 122 ] ,DATA\*[ 65 , 130 ] , [ 93 , 123 ] , [ 90 , 132 ] ,[ 84 , 138 ] , [ 77 , 139 ] , [ 70 , 135 ] ,DATA`*[ 127 , 138 ] , [ 103 , 121 ] , [ 103 , 125 ] ,[ 138 , 143 ] , [ 114 , 131 ] , [ 101 , 122 ] ,DATA`+<[ 108 , 123 ] , [ 115 , 126 ] , [ 123 , 131 ] ,[ 133 , 135 ] , [ 140 , 138 ] , [ 142 , 142 ] ,DATA\+[ 142 , 140 ] , [ 130 , 82 ] , [ 124 , 79 ] ,[ 104 , 90 ] , [ 103 , 97 ] , [ 117 , 90 ] ,DATAX,\[ 97 , 98 ] , [ 134 , 75 ] , [ 99 , 99 ] ,[ 97 , 96 ] , [ 134 , 79 ] , [ 132 , 75 ] ,DATA\,[ 135 , 77 ] , [ 16 , 133 ] , [ 45 , 121 ] ,[ 47 , 119 ] , [ 15 , 130 ] , [ 24 , 123 ] ,DATA\-l[ 18 , 126 ] , [ 35 , 119 ] , [ 43 , 118 ] ,[ 30 , 126 ] , [ 22 , 131 ] , [ 39 , 123 ] ,DATAT-[ 36 , 93 ] , [ 39 , 91 ] , [ 25 , 82 ] ,[ 22 , 87 ] , [ 17 , 81 ] , [ 17 , 84 ] ,DATAL.|[ 19 , 80 ] , [ 76 , 111 ] , [ 68 , 111 ] ,[ 84 , 111 ] , [ 79 , 126 ]],DATAt.[ [ 70 , 76 , 67 ] , [ 70 , 75 , 76 ] , [ 72 , 75 , 70 ] ,[ 72 , 77 , 75 ] , [ 71 , 77 , 72 ] , [ 73 , 77 , 71 ] ,DATAt/[ 73 , 68 , 77 ] , [ 73 , 69 , 68 ] , [ 73 , 74 , 69 ] ,[ 81 , 79 , 78 ] , [ 81 , 80 , 79 ] , [ 83 , 80 , 81 ] ,DATAt0<[ 82 , 80 , 83 ] , [ 82 , 84 , 80 ] , [ 41 , 39 , 40 ] ,[ 41 , 38 , 39 ] , [ 36 , 38 , 41 ] , [ 36 , 88 , 38 ] ,DATAt0[ 29 , 28 , 33 ] , [ 32 , 29 , 33 ] , [ 31 , 29 , 32 ] ,[ 60 , 58 , 62 ] , [ 63 , 58 , 60 ] , [ 63 , 59 , 58 ] ,DATAt1|[ 57 , 59 , 63 ] , [ 56 , 59 , 57 ] , [ 56 , 55 , 59 ] ,[ 56 , 64 , 55 ] , [ 56 , 66 , 64 ] , [ 65 , 66 , 56 ] ,DATAt2[ 65 , 61 , 66 ] , [ 42 , 53 , 45 ] , [ 42 , 54 , 53 ] ,[ 42 , 52 , 54 ] , [ 46 , 52 , 42 ] , [ 46 , 51 , 52 ] ,DATAt2[ 46 , 50 , 51 ] , [ 46 , 49 , 50 ] , [ 44 , 49 , 46 ] ,[ 44 , 48 , 49 ] , [ 47 , 48 , 44 ] , [ 47 , 43 , 48 ] ,DATAl3\[ 8 , 35 , 34 ] , [ 8 , 34 , 18 ] , [ 4 , 6 , 19 ] ,[ 4 , 19 , 20 ] , [ 9 , 20 , 19 ] , [ 85 , 86 , 33 ] ,DATAp3[ 86 , 34 , 33 ] , [ 28 , 85 , 33 ] , [ 28 , 30 , 85 ] ,[ 4 , 18 , 86 ] , [ 18 , 34 , 86 ] , [ 4 , 86 , 6 ] ,DATAp4[ 6 , 86 , 85 ] , [ 6 , 85 , 21 ] , [ 10 , 21 , 85 ] ,[ 10 , 85 , 22 ] , [ 1 , 14 , 87 ] , [ 1 , 87 , 30 ] ,DATAp5<[ 1 , 30 , 37 ] , [ 1 , 37 , 27 ] , [ 12 , 26 , 25 ] ,[ 13 , 25 , 26 ] , [ 0 , 25 , 13 ] , [ 0 , 13 , 27 ] ,DATAt5[ 0 , 13 , 27 , 37 ] , [ 0 , 37 , 23 ] , [ 88 , 37 , 38 ] ,[ 23 , 37 , 88 ] , [ 11 , 23 , 88 ] , [ 11 , 88 , 24 ] ,DATAl6|[ 3 , 24 , 16 ] , [ 7 , 16 , 24 ] , [ 7 , 24 , 88 ] ,[ 7 , 88 , 15 ] , [ 8 , 17 , 35 ] , [ 5 , 35 , 17 ] ,DATAp7[ 5 , 36 , 35 ] , [ 5 , 15 , 36 ] , [ 15 , 88 , 36 ] ,[ 22 , 85 , 87 ] , [ 2 , 22 , 87 ] , [ 2 , 87 , 14 ]]],DATA7[[1.0, 0.0, 0.0, 1.0],DATA\7[[ 88 , 136 ] , [ 88 , 124 ] , [ 60 , 128 ] ,[ 75 , 138 ] , [ 90 , 132 ] , [ 65 , 129 ] ,DATA\8[ 85 , 128 ] , [ 85 , 130 ] , [ 85 , 126 ] ,[ 82 , 134 ] , [ 80 , 136 ] , [ 83 , 132 ] ,DATA\9[ 72 , 136 ] , [ 68 , 133 ] , [ 77 , 136 ] ,[ 60 , 122 ] , [ 63 , 124 ] , [ 66 , 134 ] ,DATAX9[ 82 , 138 ] , [ 58 , 123 ] , [ 89 , 127 ] ,[ 58 , 120 ] , [ 57 , 101 ] , [ 57 , 82 ] ,DATAX:,[ 54 , 110 ] , [ 55 , 118 ] , [ 55 , 115 ] ,[ 56 , 120 ] , [ 55 , 94 ] , [ 54 , 102 ] ,DATAX:[ 56 , 87 ] , [ 57 , 90 ] , [ 58 , 112 ] ,[ 58 , 107 ] , [ 59 , 116 ] , [ 90 , 135 ] ,DATA\;,[ 85 , 129 ] , [ 87 , 125 ] , [ 85 , 127 ] ,[ 81 , 135 ] , [ 84 , 131 ] , [ 83 , 133 ] ,DATA\;[ 67 , 131 ] , [ 70 , 135 ] , [ 74 , 136 ] ,[ 79 , 136 ] , [ 64 , 126 ] , [ 61 , 123 ] ,DATA\|[ 75 , 82 ] , [ 91 , 110 ] , [ 76 , 89 ] ,[ 70 , 77 ] , [ 83 , 93 ] , [ 98 , 115 ] ,DATAX>[ 94 , 113 ] , [ 84 , 100 ] , [ 70 , 76 ] ,[ 73 , 83 ] , [ 67 , 48 ] , [ 55 , 42 ] ,DATAT?|[ 58 , 45 ] , [ 49 , 48 ] , [ 46 , 40 ] ,[ 49 , 39 ] , [ 44 , 49 ] , [ 44 , 44 ] ,DATAT?[ 47 , 51 ] , [ 47 , 41 ] , [ 46 , 43 ] ,[ 45 , 45 ] , [ 45 , 48 ] , [ 50 , 42 ] ,DATAT@|[ 52 , 43 ] , [ 49 , 41 ] , [ 55 , 45 ] ,[ 57 , 45 ] , [ 54 , 44 ] , [ 53 , 39 ] ,DATAT@[ 57 , 44 ] , [ 48 , 40 ] , [ 44 , 47 ] ,[ 46 , 42 ] , [ 45 , 46 ] , [ 45 , 44 ] ,DATATA|[ 51 , 42 ] , [ 48 , 41 ] , [ 50 , 41 ] ,[ 56 , 45 ] , [ 53 , 43 ] , [ 54 , 44 ] ,DATATA[ 46 , 50 ] , [ 54 , 40 ] , [ 45 , 42 ] ,[ 45 , 52 ] , [ 58 , 45 ] , [ 51 , 39 ] ,DATATB|[ 75 , 75 ] , [ 69 , 71 ] , [ 54 , 73 ] ,[ 54 , 78 ] , [ 65 , 74 ] , [ 71 , 74 ] ,DATATB[ 59 , 74 ] , [ 74 , 73 ] , [ 61 , 71 ] ,[ 52 , 77 ] , [ 55 , 76 ] , [ 51 , 75 ] ,DATATC|[ 68 , 74 ] , [ 73 , 75 ] , [ 61 , 74 ] ,[ 75 , 74 ] , [ 72 , 72 ] , [ 57 , 72 ] ,DATATC[ 65 , 71 ] , [ 53 , 78 ] , [ 56 , 75 ] ,[ 55 , 77 ] , [ 51 , 76 ] , [ 52 , 74 ] ,DATATD|[ 49 , 67 ] , [ 48 , 70 ] , [ 52 , 71 ] ,[ 53 , 68 ] , [ 51 , 71 ] , [ 63 , 64 ] ,DATATD[ 54 , 65 ] , [ 69 , 66 ] , [ 73 , 68 ] ,[ 59 , 67 ] , [ 71 , 68 ] , [ 65 , 67 ] ,DATATE|[ 48 , 68 ] , [ 52 , 69 ] , [ 49 , 71 ] ,[ 58 , 65 ] , [ 72 , 67 ] , [ 56 , 67 ] ,DATATE[ 68 , 67 ] , [ 62 , 67 ] , [ 52 , 71 ] ,[ 51 , 66 ] , [ 66 , 65 ] , [ 72 , 68 ] ,DATATF|[ 70 , 62 ] , [ 64 , 59 ] , [ 48 , 60 ] ,[ 49 , 65 ] , [ 59 , 61 ] , [ 65 , 61 ] ,DATATF[ 53 , 61 ] , [ 69 , 61 ] , [ 56 , 58 ] ,[ 47 , 65 ] , [ 49 , 63 ] , [ 46 , 62 ] ,DATATG|[ 62 , 61 ] , [ 68 , 62 ] , [ 56 , 61 ] ,[ 70 , 62 ] , [ 67 , 59 ] , [ 52 , 59 ] ,DATATG[ 60 , 58 ] , [ 48 , 65 ] , [ 51 , 62 ] ,[ 49 , 65 ] , [ 46 , 64 ] , [ 46 , 61 ] ,DATATH|[ 51 , 57 ] , [ 44 , 57 ] , [ 54 , 56 ] ,[ 65 , 53 ] , [ 62 , 50 ] , [ 54 , 51 ] ,DATATH[ 47 , 58 ] , [ 54 , 55 ] , [ 61 , 55 ] ,[ 44 , 55 ] , [ 60 , 50 ] , [ 65 , 51 ] ,DATATI|[ 49 , 53 ] , [ 57 , 51 ] , [ 64 , 50 ] ,[ 61 , 50 ] , [ 65 , 52 ] , [ 63 , 54 ] ,DATATI[ 54 , 56 ] , [ 57 , 56 ] , [ 43 , 56 ] ,[ 46 , 58 ] , [ 53 , 56 ] , [ 49 , 57 ]],DATAJ|[ [ 213 , 215 , 198 ] , [ 193 , 215 , 213 ] , [ 193 , 192 , 215 ] ,[ 212 , 192 , 193 ] , [ 212 , 214 , 192 ] , [ 210 , 211 , 194 ] ,DATAK,[ 201 , 214 , 212 ] , [ 199 , 211 , 210 ] , [ 199 , 200 , 211 ] ,[ 201 , 199 , 214 ] , [ 201 , 200 , 199 ] , [ 204 , 200 , 201 ] ,DATAK[ 204 , 209 , 200 ] , [ 204 , 195 , 209 ] , [ 204 , 208 , 195 ] ,[ 197 , 208 , 204 ] , [ 197 , 203 , 208 ] , [ 88 , 90 , 117 ] ,DATAL[ 205 , 203 , 197 ] , [ 88 , 114 , 90 ] , [ 205 , 206 , 203 ] ,[ 202 , 206 , 205 ] , [ 202 , 196 , 206 ] , [ 207 , 196 , 202 ] ,DATA|M<[ 88 , 94 , 114 ] , [ 104 , 94 , 88 ] , [ 104 , 106 , 94 ] ,[ 89 , 106 , 104 ] , [ 89 , 93 , 106 ] , [ 111 , 118 , 99 ] ,DATA|M[ 111 , 84 , 118 ] , [ 98 , 84 , 111 ] , [ 89 , 107 , 93 ] ,[ 98 , 102 , 84 ] , [ 113 , 102 , 98 ] , [ 100 , 102 , 113 ] ,DATA|N[ 116 , 107 , 89 ] , [ 116 , 92 , 107 ] , [ 100 , 83 , 102 ] ,[ 112 , 83 , 100 ] , [ 96 , 83 , 112 ] , [ 116 , 105 , 92 ] ,DATA|OL[ 108 , 83 , 96 ] , [ 95 , 83 , 108 ] , [ 116 , 91 , 105 ] ,[ 95 , 115 , 83 ] , [ 110 , 115 , 95 ] , [ 86 , 91 , 116 ] ,DATAO[ 86 , 109 , 91 ] , [ 97 , 115 , 110 ] , [ 109 , 115 , 97 ] ,[ 86 , 115 , 109 ] , [ 103 , 115 , 86 ] , [ 103 , 101 , 115 ] ,DATAxP[ 87 , 101 , 103 ] , [ 87 , 119 , 101 ] , [ 78 , 77 , 70 ] ,[ 78 , 71 , 77 ] , [ 73 , 71 , 78 ] , [ 73 , 76 , 71 ] ,DATAtQL[ 79 , 76 , 73 ] , [ 74 , 76 , 79 ] , [ 74 , 72 , 76 ] ,[ 81 , 72 , 74 ] , [ 75 , 72 , 81 ] , [ 75 , 80 , 72 ] , DATAQ[ 139 , 141 , 123 ] , [ 129 , 141 , 139 ] , [ 142 , 141 , 129 ] ,[ 142 , 130 , 141 ] , [ 131 , 130 , 142 ] , [ 131 , 140 , 130 ] ,DATAR[ 133 , 135 , 120 ] , [ 143 , 140 , 131 ] , [ 143 , 126 , 140 ] ,[ 125 , 135 , 133 ] , [ 125 , 127 , 135 ] , [ 132 , 127 , 125 ] ,DATASL[ 143 , 134 , 126 ] , [ 124 , 127 , 132 ] , [ 134 , 127 , 124 ] ,[ 143 , 127 , 134 ] , [ 122 , 127 , 143 ] , [ 122 , 136 , 127 ] ,DATAS[ 137 , 136 , 122 ] , [ 137 , 121 , 136 ] , [ 128 , 121 , 137 ] ,[ 148 , 146 , 164 ] , [ 158 , 146 , 148 ] , [ 128 , 138 , 121 ] ,DATAT[ 145 , 146 , 158 ] , [ 145 , 157 , 146 ] , [ 156 , 157 , 145 ] ,[ 156 , 147 , 157 ] , [ 154 , 152 , 167 ] , [ 144 , 147 , 156 ] ,DATAU\[ 144 , 161 , 147 ] , [ 162 , 152 , 154 ] , [ 162 , 160 , 152 ] ,[ 155 , 160 , 162 ] , [ 144 , 153 , 161 ] , [ 163 , 160 , 155 ] ,DATAV [ 153 , 160 , 163 ] , [ 144 , 160 , 153 ] , [ 165 , 160 , 144 ] ,[ 165 , 151 , 160 ] , [ 150 , 151 , 165 ] , [ 150 , 166 , 151 ] ,DATAV[ 187 , 189 , 171 ] , [ 177 , 189 , 187 ] , [ 159 , 166 , 150 ] ,[ 159 , 149 , 166 ] , [ 190 , 189 , 177 ] , [ 190 , 178 , 189 ] ,DATAWl[ 179 , 178 , 190 ] , [ 179 , 188 , 178 ] , [ 191 , 188 , 179 ] ,[ 181 , 183 , 168 ] , [ 191 , 174 , 188 ] , [ 173 , 183 , 181 ] ,DATAX[ 173 , 175 , 183 ] , [ 180 , 175 , 173 ] , [ 191 , 182 , 174 ] ,[ 170 , 182 , 191 ] , [ 172 , 175 , 180 ] , [ 170 , 172 , 182 ] ,DATAX[ 170 , 175 , 172 ] , [ 170 , 184 , 175 ] , [ 185 , 184 , 170 ] ,[ 185 , 169 , 184 ] , [ 176 , 169 , 185 ] , [ 176 , 186 , 169 ] ,DATAtY|[ 27 , 21 , 58 ] , [ 59 , 21 , 27 ] , [ 59 , 69 , 21 ] ,[ 25 , 69 , 59 ] , [ 25 , 34 , 69 ] , [ 57 , 34 , 25 ] ,DATAtZ[ 26 , 34 , 57 ] , [ 26 , 68 , 34 ] , [ 56 , 68 , 26 ] ,[ 56 , 32 , 68 ] , [ 24 , 32 , 56 ] , [ 24 , 67 , 32 ] ,DATAtZ[ 60 , 67 , 24 ] , [ 60 , 33 , 67 ] , [ 60 , 66 , 33 ] ,[ 29 , 66 , 60 ] , [ 29 , 22 , 66 ] , [ 61 , 22 , 29 ] ,DATAt[\[ 61 , 64 , 22 ] , [ 28 , 64 , 61 ] , [ 28 , 31 , 64 ] ,[ 63 , 31 , 28 ] , [ 63 , 65 , 31 ] , [ 30 , 65 , 63 ] ,DATAp[[ 62 , 65 , 30 ] , [ 62 , 23 , 65 ] , [ 3 , 18 , 51 ] ,[ 48 , 18 , 3 ] , [ 48 , 50 , 18 ] , [ 48 , 14 , 50 ] ,DATAp\[ 14 , 0 , 50 ] , [ 48 , 44 , 14 ] , [ 45 , 0 , 14 ] ,[ 17 , 12 , 48 ] , [ 12 , 44 , 48 ] , [ 35 , 0 , 45 ] ,DATAp]<[ 10 , 35 , 45 ] , [ 39 , 35 , 10 ] , [ 17 , 43 , 12 ] ,[ 9 , 35 , 39 ] , [ 17 , 13 , 43 ] , [ 9 , 4 , 35 ] ,DATAp][ 41 , 4 , 9 ] , [ 49 , 13 , 17 ] , [ 11 , 4 , 41 ] ,[ 49 , 42 , 13 ] , [ 11 , 55 , 4 ] , [ 40 , 55 , 11 ] ,DATAl^|[ 49 , 5 , 42 ] , [ 7 , 55 , 40 ] , [ 2 , 5 , 49 ] ,[ 36 , 55 , 7 ] , [ 36 , 20 , 55 ] , [ 6 , 20 , 36 ] ,DATAl_[ 2 , 46 , 5 ] , [ 38 , 20 , 6 ] , [ 53 , 46 , 2 ] ,[ 8 , 20 , 38 ] , [ 8 , 54 , 20 ] , [ 53 , 16 , 46 ] ,DATAp_[ 37 , 54 , 8 ] , [ 37 , 1 , 54 ] , [ 19 , 16 , 53 ] ,[ 19 , 47 , 16 ] , [ 52 , 47 , 19 ] , [ 52 , 15 , 47]]]]DATA`\DATA `Register(draw, event, bevent)TXd`TXTextalalalal6DATAala.FREEDATA0aOpen python scripts here and ALT+P to run themOB`7<OBCamera   ;Z.??????Wk )Id3Id3 |? )Wi3gg ;Z.??????2ex'G[?]V2es?2`%I/?OBdB??d)?>?d)???ҨҨDATA,ҟ@DATA`Ҩҟ AutoTrack?OB<7 `OBLamp  L-@p????????L-@p??????Wj )͐13"3J? )Wj4iq@/2!p?DOBdB?=# ?>=?@???OB 7@<OBLamp.001  5k- yb????????5k- yb??????Wk )5 363u? )Wj3V;2@yb?DOBdB?=# ?>=?@???OB@7D OBPlanec\b b :가!????ۀ???;.?3;.' ??3;.;.:가!?????;.3;.??' 3;.?;.=!Rr?DOBdB?=# ?>=?@???blDATA,b 4curtainDATA\bl;! B?A?=????333?L? OBD7@OBEmpty!~6????ڀ???3!i?!i'\??!i3!i!~6????? )p?Wk3 ?45gWk4Ī )W<~>G?DOBdB?=# ?>=?@???bDATA,b9?@@=>L< MEc\+MEPlane.001LLlj! 4@??7'ŬDATAj0!??'?3.]ޗ?.3;,?3;.4@?;.4;034>32)?>2/?3??-?3??3`2-2+4?/4X1?;.???3;-@2;"?2;%@;7?;:?@3E?@3jx??3jx?@3E?@?;+??@;-?@?2;/???2;1?@E??jz?@jy??E?4| > > j{3>;1? 44;3?jy4 ?@ >?;/>? >32;+?>2;-?>3 ?@2@3 ?3 ?3jy32;)>3 >3jx?3 2;'3 ;5 @򲻽2?2*>?3;,>2,?@3;-?@>2.>>>?@.?@;.>/?>;/??@?@?@'?@@3@?(ݳ$E~` ?沌=_4$E4j|@`~ ?}4"74F213@1%22;뱻91!1#@_3$E2v_213$E2t2?2v?2_2u=3S4>3?_3?3S4>2v>3$E>?3S4>_3S4>3$E=?3$E?2x?3$E>31'>32>2w>2>2x>2?` 3$E? 32x?`3? 3S4?3S4?3? 3$E?@3$E?@3S4?`3S4?=3$E?>2z?`>2? ?1/?>2?>1-?@>2?`>2z? >2?@>2y>?>?/3>53>>>1+>>1)>>1>>340?`$E4? z??`?? -> ?$E>?x>? > ?@z>?@>?`y?S4??`? S4?z?$E?@S4?`S4? $E?@$E>|>$E>z>>z> _??S4>S4> >$E?>$E?>S4_> S4?`[? _?[??? _?@?@??`?`?'? ???_15??2? ?@+?@?`)?@? 11?`?@13?`3[? 3?`3[? 3?@ 3?`@3? @3?@`3`1 2_H ?1@_1@B`?D`;9  _2;$? `3? 3jx?` 3?`? 2;0? ? &? ?`;-?`? jz_? _> jz>;/> > 0> >/?  ? ;.?`jx>?`.>? ;.>? .>>;0>>>>2;-? >2.? >2;.?`>2.?`3jx? 3;,? 3 >2,>3 >2+=3 >3;,>_3jx_2)2;&2*2;(;5䲻1 ;6`2_ _3 =_3;,>2;*?`3;-?`=3 >>@> ?` ?`;/> ;2_>;0_?`E?`?`'@?``3E`_@DATA- gkqQW]a} r s  i l          RS{~_bhuUX^tv|TV`jijoSTYstw   !!!""""####$$$%%%&&&&''''((()W)X)\)****+++,,,,----.].^.d.///000011112223}3~33444455566667{7|778889a9b9f9:u:v:y:;q;r;x<g<h<n<z=_=`=e=m>k>l>p?U?V?[?c@Q@R@ZAYAZA[A\BcBdBeBfCmCnCoCpDwDxDyDzEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQRSSTTU UV VWWXXYYZZ[[\\]]^^ _ _ ` ` aabb c c d de e f fgghh iijj klm m n noo ppqrssttuuvvwwxxyyzz{{||}}~~    DATAl,     W]}a}qggk]aQWSRVTXUU ^` Vb __ hj ` li srvthuub|v~{{|  ~ ^X   t s iTjSPSTPjiP OstOO$N##N""N!(M''M&&M%+L&&L**L)X.^K**K--K,0J--J''J/2I""I11I0,H11H44H3~6G44G##G58FF7|7{F63~E7{7|E:v:uE9b<zhDyz:uy:yvDwytwwsDxw;rx>plCopioo jCm o=` m=m _Cn m<h n9f bBe f=_ e=e `Bc e?V c?c UBd c.^ d)\XA[\?U[?[VAY[TYYSAZY@RZ@ZQA\Z)W\.d]Bfd9af<ngCpn>kp;xqDzx<gz9aE3}6F85G63}H,0I2/J0,K.])WL+%M(!N$O  P  DATA1